pax_global_header00006660000000000000000000000064151651326250014520gustar00rootroot0000000000000052 comment=e60d6cffd5fa84de3d6a01fd748e61f56ef0baa4 icingaweb2-module-director-1.11.8/000077500000000000000000000000001516513262500167165ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/.github/000077500000000000000000000000001516513262500202565ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/.github/ISSUE_TEMPLATE/000077500000000000000000000000001516513262500224415ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000016721516513262500251410ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- ## Describe the bug A clear and concise description of what the bug is. Please tell us what happens instead of the expected behavior. ## To Reproduce Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include configuration, logs, etc. to reproduce, if relevant. 1. 2. 3. 4. ## Expected behavior A clear and concise description of what you expected to happen. ## Screenshots If applicable, add screenshots to help explain your problem. ## Your Environment Include as many relevant details about the environment you experienced the problem in * Director version (System - About): * Icinga Web 2 version and modules (System - About): * Icinga 2 version (`icinga2 --version`): * Operating System and version: * Webserver, PHP versions: ## Additional context Add any other context about the problem here. icingaweb2-module-director-1.11.8/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000002601516513262500244270ustar00rootroot00000000000000 blank_issues_enabled: true contact_links: - name: Ask a question url: https://community.icinga.com/c/icinga-director/8 about: Ask a question in our community forum icingaweb2-module-director-1.11.8/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000015761516513262500261770ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- ## Is your feature request related to a problem? Please describe. A clear and concise description of what the problem is. Ex. I'm always using this feature but am missing [...] ## Describe the solution you'd like A clear and concise description of what you want to happen. ## Describe alternatives you've considered A clear and concise description of any alternative solutions or features you've considered. ## Additional context Add any other context or screenshots about the feature request here. ## Your Environment * Director version (System - About): * Icinga Web 2 version and modules (System - About): * Icinga 2 version (`icinga2 --version`): * Operating System and version: * Webserver, PHP versions: icingaweb2-module-director-1.11.8/.github/dependabot.yml000066400000000000000000000001661516513262500231110ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" icingaweb2-module-director-1.11.8/.github/workflows/000077500000000000000000000000001516513262500223135ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/.github/workflows/L10n-update.yml000066400000000000000000000002511516513262500250260ustar00rootroot00000000000000name: L10n Update on: push: branches: - master jobs: update: uses: icinga/github-actions/.github/workflows/L10n-update.yml@main secrets: inherit icingaweb2-module-director-1.11.8/.github/workflows/php.yml000066400000000000000000000133761516513262500236370ustar00rootroot00000000000000name: PHP Tests on: push: branches: - master - release/* pull_request: branches: - master jobs: lint: name: Static analysis for php ${{ matrix.php }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: php: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3'] os: ['ubuntu-latest'] steps: - name: Checkout code base uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} tools: phpcs:3 - name: Setup dependencies run: composer require -n --no-progress overtrue/phplint phpunit/phpunit - name: PHP Lint if: ${{ ! cancelled() }} run: ./vendor/bin/phplint -n --exclude={^vendor/.*} -- . - name: PHP CodeSniffer if: ${{ ! cancelled() }} run: phpcs test: name: Unit tests with php ${{ matrix.php }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: php: ['8.2', '8.3'] os: ['ubuntu-latest'] services: mysql: image: mariadb env: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: director_test MYSQL_USER: director_test MYSQL_PASSWORD: director_test options: >- --health-cmd "mariadb -s -uroot -proot -e'SHOW DATABASES;' 2> /dev/null | grep director_test > test" --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 3306/tcp pgsql: image: postgres env: POSTGRES_USER: director_test POSTGRES_PASSWORD: director_test POSTGRES_DB: director_test options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432/tcp steps: - name: Checkout code base uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} tools: phpunit:9.5 extensions: mysql, pgsql - name: Setup Icinga Web run: | git clone --depth 1 https://github.com/Icinga/icingaweb2.git _icingaweb2 ln -s `pwd` _icingaweb2/modules/director - name: Setup Libraries run: | composer require --working-dir=_icingaweb2 -n --no-progress mockery/mockery mkdir _libraries git clone --depth 1 -b snapshot/nightly https://github.com/Icinga/icinga-php-library.git _libraries/ipl git clone --depth 1 -b snapshot/nightly https://github.com/Icinga/icinga-php-thirdparty.git _libraries/vendor - name: Setup Incubator run: | git clone --depth 1 https://github.com/Icinga/icingaweb2-module-incubator _icingaweb2/modules/incubator mkdir -p test/config/enabledModules cd _icingaweb2/modules/incubator ln -s `pwd` ../../../test/config/enabledModules/incubator composer require --no-update \ "gipfl/calendar": "dev-master as 99.x-dev" \ "gipfl/cli": "dev-master as 99.x-dev" \ "gipfl/curl": "dev-master as 99.x-dev" \ "gipfl/data-type": "dev-master as 99.x-dev" \ "gipfl/db-migration": "dev-master as 99.x-dev" \ "gipfl/diff": "dev-master as 99.x-dev" \ "gipfl/format": "dev-master as 99.x-dev" \ "gipfl/icinga-bundles": "dev-master as 99.x-dev" \ "gipfl/icinga-cli-daemon": "dev-master as 99.x-dev" \ "gipfl/icingaweb2": "dev-master as 99.x-dev" \ "gipfl/influxdb": "dev-master as 99.x-dev" \ "gipfl/json": "dev-master as 99.x-dev" \ "gipfl/linux-health": "dev-master as 99.x-dev" \ "gipfl/log": "dev-master as 99.x-dev" \ "gipfl/process": "dev-master as 99.x-dev" \ "gipfl/protocol-jsonrpc": "dev-master as 99.x-dev" \ "gipfl/protocol-netstring": "dev-master as 99.x-dev" \ "gipfl/react-utils": "dev-master as 99.x-dev" \ "gipfl/simple-daemon": "dev-master as 99.x-dev" \ "gipfl/socket": "dev-master as 99.x-dev" \ "gipfl/stream": "dev-master as 99.x-dev" \ "gipfl/systemd": "dev-master as 99.x-dev" \ "gipfl/translation": "dev-master as 99.x-dev" \ "gipfl/web": "dev-master as 99.x-dev" \ "gipfl/zfdb": "dev-master as 99.x-dev" \ "gipfl/zfdbstore": "dev-master as 99.x-dev" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git config user.name "github-actions[bot]" bin/make-release.sh snapshot - name: PHPUnit with MySQL if: ${{ ! cancelled() }} env: ICINGAWEB_LIBDIR: _libraries ICINGAWEB_CONFIGDIR: test/config DIRECTOR_TESTDB_RES: Director MySQL TestDB DIRECTOR_TESTDB: director_test DIRECTOR_TESTDB_HOST: 127.0.0.1 DIRECTOR_TESTDB_PORT: ${{ job.services.mysql.ports['3306'] }} DIRECTOR_TESTDB_USER: director_test DIRECTOR_TESTDB_PASSWORD: director_test run: phpunit --verbose --bootstrap _icingaweb2/test/php/bootstrap.php - name: PHPUnit with PostgreSQL if: ${{ ! cancelled() }} env: ICINGAWEB_LIBDIR: _libraries ICINGAWEB_CONFIGDIR: test/config DIRECTOR_TESTDB_RES: Director PostgreSQL TestDB DIRECTOR_TESTDB: director_test DIRECTOR_TESTDB_HOST: 127.0.0.1 DIRECTOR_TESTDB_PORT: ${{ job.services.pgsql.ports['5432'] }} DIRECTOR_TESTDB_USER: director_test DIRECTOR_TESTDB_PASSWORD: director_test run: phpunit --verbose --bootstrap _icingaweb2/test/php/bootstrap.php icingaweb2-module-director-1.11.8/.github/workflows/phpstan.yml000066400000000000000000000011331516513262500245110ustar00rootroot00000000000000name: PHPStan on: pull_request: jobs: phpstan: uses: icinga/github-actions/.github/workflows/phpstan.yml@main with: dependencies: | { "/icingaweb2" : "https://github.com/Icinga/icingaweb2.git", "/usr/share/icingaweb2-modules/icingadb" : "https://github.com/Icinga/icingadb-web.git", "/usr/share/icingaweb2-modules/cube" : "https://github.com/Icinga/icingaweb2-module-cube.git", "/usr/share/icingaweb2-modules/incubator" : "-b stable/0.22.0 https://github.com/Icinga/icingaweb2-module-incubator" } icingaweb2-module-director-1.11.8/.gitignore000066400000000000000000000000771516513262500207120ustar00rootroot00000000000000## Editors /.idea/ .*.sw[op] ## PHP vendor artifacts /vendor/ icingaweb2-module-director-1.11.8/.gitlab-ci.yml000066400000000000000000000077341516513262500213650ustar00rootroot00000000000000stages: - Coding Standards - Unit-Tests with DB PSR2 CS Test: stage: Coding Standards tags: - xenial script: - phpcs --report-width=auto --report-full --report-gitblame --report-summary -p --standard=PSR2 --extensions=php --encoding=utf-8 -w -s library/Director/ library/vendor/ipl/ application/ *.php test CentOS 7/MySQL: stage: Unit-Tests with DB tags: - centos7 - director variables: DIRECTOR_TESTDB: "director_test_${CI_BUILD_ID}_${CI_RUNNER_ID}" DIRECTOR_TESTDB_RES: "Director MySQL TestDB" before_script: - mysql -u root -e "CREATE DATABASE $DIRECTOR_TESTDB" after_script: - mysql -u root -e "DROP DATABASE $DIRECTOR_TESTDB" script: - phpunit --verbose CentOS 7/PostgreSQL: stage: Unit-Tests with DB tags: - centos7 - director variables: DIRECTOR_TESTDB: "director_test_${CI_BUILD_ID}_${CI_RUNNER_ID}" DIRECTOR_TESTDB_RES: "Director PostgreSQL TestDB" DIRECTOR_TESTDB_USER: "director_${CI_BUILD_ID}_${CI_RUNNER_ID}" before_script: - psql postgres -q -c "CREATE DATABASE $DIRECTOR_TESTDB WITH ENCODING 'UTF8';" - psql $DIRECTOR_TESTDB -q -c "CREATE USER $DIRECTOR_TESTDB_USER WITH PASSWORD 'testing'; GRANT ALL PRIVILEGES ON DATABASE $DIRECTOR_TESTDB TO $DIRECTOR_TESTDB_USER; CREATE EXTENSION pgcrypto;" after_script: - psql postgres -c "DROP DATABASE $DIRECTOR_TESTDB" - psql postgres -c "DROP USER $DIRECTOR_TESTDB_USER" script: - phpunit --verbose #CentOS 6/MySQL: # stage: Unit-Tests with DB # tags: # - centos6 # - director # variables: # DIRECTOR_TESTDB: "director_test_${CI_BUILD_ID}_${CI_RUNNER_ID}" # DIRECTOR_TESTDB_RES: "Director MySQL TestDB" # before_script: # - mysql -u root -e "CREATE DATABASE $DIRECTOR_TESTDB" # after_script: # - mysql -u root -e "DROP DATABASE $DIRECTOR_TESTDB" # script: # - phpunit Jessie/MySQL: stage: Unit-Tests with DB tags: - jessie - director variables: DIRECTOR_TESTDB: "director_test_${CI_BUILD_ID}_${CI_RUNNER_ID}" DIRECTOR_TESTDB_RES: "Director MySQL TestDB" before_script: - mysql -u root -e "CREATE DATABASE $DIRECTOR_TESTDB" after_script: - mysql -u root -e "DROP DATABASE $DIRECTOR_TESTDB" script: - phpunit --verbose Jessie/PostgreSQL: stage: Unit-Tests with DB tags: - jessie - director variables: DIRECTOR_TESTDB: "director_test_${CI_BUILD_ID}_${CI_RUNNER_ID}" DIRECTOR_TESTDB_RES: "Director PostgreSQL TestDB" DIRECTOR_TESTDB_USER: "director_${CI_BUILD_ID}_${CI_RUNNER_ID}" before_script: - psql postgres -q -c "CREATE DATABASE $DIRECTOR_TESTDB WITH ENCODING 'UTF8';" - psql $DIRECTOR_TESTDB -q -c "CREATE USER $DIRECTOR_TESTDB_USER WITH PASSWORD 'testing'; GRANT ALL PRIVILEGES ON DATABASE $DIRECTOR_TESTDB TO $DIRECTOR_TESTDB_USER; CREATE EXTENSION pgcrypto;" after_script: - psql postgres -c "DROP DATABASE $DIRECTOR_TESTDB" - psql postgres -c "DROP USER $DIRECTOR_TESTDB_USER" script: - phpunit --verbose Xenial/MySQL: stage: Unit-Tests with DB tags: - xenial - director variables: DIRECTOR_TESTDB: "director_test_${CI_BUILD_ID}_${CI_RUNNER_ID}" DIRECTOR_TESTDB_RES: "Director MySQL TestDB" before_script: - mysql -u root -e "CREATE DATABASE $DIRECTOR_TESTDB" after_script: - mysql -u root -e "DROP DATABASE $DIRECTOR_TESTDB" script: - phpunit --verbose Xenial/PostgreSQL: stage: Unit-Tests with DB tags: - ubuntu - director variables: DIRECTOR_TESTDB: "director_test_${CI_BUILD_ID}_${CI_RUNNER_ID}" DIRECTOR_TESTDB_RES: "Director PostgreSQL TestDB" DIRECTOR_TESTDB_USER: "director_${CI_BUILD_ID}_${CI_RUNNER_ID}" before_script: - psql postgres -q -c "CREATE DATABASE $DIRECTOR_TESTDB WITH ENCODING 'UTF8';" - psql $DIRECTOR_TESTDB -q -c "CREATE USER $DIRECTOR_TESTDB_USER WITH PASSWORD 'testing'; GRANT ALL PRIVILEGES ON DATABASE $DIRECTOR_TESTDB TO $DIRECTOR_TESTDB_USER; CREATE EXTENSION pgcrypto;" after_script: - psql postgres -c "DROP DATABASE $DIRECTOR_TESTDB" - psql postgres -c "DROP USER $DIRECTOR_TESTDB_USER" script: - phpunit --verbose icingaweb2-module-director-1.11.8/LICENSE000066400000000000000000000432541516513262500177330ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. icingaweb2-module-director-1.11.8/README.md000066400000000000000000000055201516513262500201770ustar00rootroot00000000000000Icinga Director =============== Icinga Director has been designed to make Icinga 2 configuration handling easy. It tries to target two main audiences: * Users with the desire to completely automate their datacenter * Sysops willing to grant their "point & click" users a lot of flexibility What makes Icinga Director so special is the fact that it tries to target both of them at once. ![Icinga Director](doc/screenshot/director/readme/director_main_screen.png) Read more about Icinga Director in our [Introduction](doc/01-Introduction.md) section. Afterwards, you should be ready for [getting started](doc/04-Getting-started.md). Documentation ------------- Please have a look at our [Installation instructions](doc/02-Installation.md) and our hints for how to apply [Upgrades](doc/05-Upgrading.md). We love automation and in case you also do so, the [Automation chapter](doc/03-Automation.md) could be worth a read. When upgrading, you should also have a look at our [Changelog](doc/82-Changelog.md). You could be interested in understanding how the [Director works](doc/10-How-it-works.md) internally. [Working with agents](doc/24-Working-with-agents.md) is a topic that affects many Icinga administrators. Other interesting entry points might be [Import and Synchronization](doc/70-Import-and-Sync.md), our [CLI interface](doc/60-CLI.md), the [REST API](doc/70-REST-API.md) and last but not least our [FAQ](doc/80-FAQ.md). A complete list of all our documentation can be found in the [doc](doc/) directory. Contributing ------------ Icinga Director is an Open Source project and lives from your contributions. No matter whether these are feature requests, issues, translations, documentation or code. * Please check whether a related issue already exists on our [Issue Tracker](https://github.com/Icinga/icingaweb2-module-director/issues) * Make sure your code conforms to the [PSR-2: Coding Style Guide](http://www.php-fig.org/psr/psr-2/) * [Unit-Tests](doc/93-Testing.md) would be great * Send a [Pull Request](https://github.com/Icinga/icingaweb2-module-director/pulls) Addons ------ The following are to be considered community-supported modules, as they are not supported by the Icinga Team. At least not yet. But please give them a try if they fit your needs. They are being used in productive environments: * [AWS - Amazon Web Services](https://github.com/Icinga/icingaweb2-module-aws): provides an Import Source for Autoscaling Groups on AWS * [File-Shipper](https://github.com/Icinga/icingaweb2-module-fileshipper): allows Director to ship additional config files with manual config with its deployments * [PuppetDB](https://github.com/Icinga/icingaweb2-module-puppetdb): provides an Import Source dealing with your PuppetDB * [vSphere](https://github.com/Icinga/icingaweb2-module-vsphere): VMware vSphere Import Source for Virtual Machines and Host Systems icingaweb2-module-director-1.11.8/application/000077500000000000000000000000001516513262500212215ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/clicommands/000077500000000000000000000000001516513262500235125ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/clicommands/BasketCommand.php000066400000000000000000000070731516513262500267420ustar00rootroot00000000000000db()->getDbAdapter(); $query = $db->select() ->from('director_basket', 'basket_name') ->order('basket_name'); foreach ($db->fetchCol($query) as $name) { echo "$name\n"; } } /** * JSON-dump for objects related to the given Basket * * USAGE * * icingacli director basket dump --name * * OPTIONS */ public function dumpAction() { $basket = $this->requireBasket(); $snapshot = BasketSnapshot::createForBasket($basket, $this->db()); echo $snapshot->getJsonDump() . "\n"; } /** * Take a snapshot for the given Basket * * USAGE * * icingacli director basket snapshot --name * * OPTIONS */ public function snapshotAction() { $basket = $this->requireBasket(); $snapshot = BasketSnapshot::createForBasket($basket, $this->db()); $snapshot->store(); $hexSum = bin2hex($snapshot->get('content_checksum')); printf( "Snapshot '%s' taken for Basket '%s' at %s\n", substr($hexSum, 0, 7), $basket->get('basket_name'), DateFormatter::formatDateTime($snapshot->get('ts_create') / 1000) ); } /** * Restore a Basket from JSON dump provided on STDIN * * USAGE * * icingacli director basket restore < basket-dump.json * * OPTIONS * --purge [,params->get('purge')) { $purge = explode(',', $purge); ObjectPurgeHelper::assertObjectTypesAreEligibleForPurge($purge); } $json = file_get_contents('php://stdin'); BasketSnapshot::restoreJson($json, $this->db()); if ($purge) { $this->purgeObjectTypes(Json::decode($json), $purge, $this->params->get('force')); } echo "Objects from Basket Snapshot have been restored\n"; } protected function purgeObjectTypes($objects, array $types, $force = false) { $helper = new ObjectPurgeHelper($this->db()); if ($force) { $helper->force(); } foreach ($types as $type) { list($className, $typeFilter) = BasketSnapshot::getClassAndObjectTypeForType($type); $helper->purge( isset($objects->$type) ? (array) $objects->$type : [], $className, $typeFilter ); } } /** */ protected function requireBasket() { return Basket::load($this->params->getRequired('name'), $this->db()); } } icingaweb2-module-director-1.11.8/application/clicommands/BenchmarkCommand.php000066400000000000000000000115501516513262500274160ustar00rootroot00000000000000db()); $filter = Filter::fromQueryString( // 'host.vars.snmp_community="*ub*"&(host.vars.location="London"|host.vars.location="Berlin")' // 'host.vars.snmp_community="*ub*"&(host.vars.location="FRA DC"|host.vars.location="NBG DC")' 'host.vars.priority="*igh"&(host.vars.location="FRA DC"|host.vars.location="NBG DC")' ); IcingaObjectFilterRenderer::apply($filter, $q); echo $q->getSql() . "\n"; print_r($q->listNames()); } public function rerendervarsAction() { $conn = $this->db(); $db = $conn->getDbAdapter(); $db->beginTransaction(); $query = $db->select()->from( array('v' => 'icinga_var'), array( 'v.varname', 'v.varvalue', 'v.checksum', 'v.rendered_checksum', 'v.rendered', 'format' => "('json')", ) ); Benchmark::measure('Ready to fetch all vars'); $rows = $db->fetchAll($query); Benchmark::measure('Got vars, storing flat'); foreach ($rows as $row) { $var = CustomVariable::fromDbRow($row); $rendered = $var->render(); $checksum = sha1($rendered, true); if ($checksum === $row->rendered_checksum) { continue; } $where = $db->quoteInto('checksum = ?', $row->checksum); $db->update( 'icinga_var', array( 'rendered' => $rendered, 'rendered_checksum' => $checksum ), $where ); } $db->commit(); } public function flattenvarsAction() { $conn = $this->db(); $db = $conn->getDbAdapter(); $db->beginTransaction(); $query = $db->select()->from(['v' => 'icinga_host_var'], [ 'v.host_id', 'v.varname', 'v.varvalue', 'v.format', 'v.checksum' ]); Benchmark::measure('Ready to fetch all vars'); $rows = $db->fetchAll($query); Benchmark::measure('Got vars, storing flat'); foreach ($rows as $row) { $var = CustomVariable::fromDbRow($row); $checksum = $var->checksum(); if (! IcingaVar::exists($checksum, $conn)) { IcingaVar::generateForCustomVar($var, $conn); } if ($row->checksum === null) { $where = $db->quoteInto('host_id = ?', $row->host_id) . $db->quoteInto(' AND varname = ?', $row->varname); $db->update('icinga_host_var', ['checksum' => $checksum], $where); } } $db->commit(); } public function resolvehostgroupsAction() { $resolver = new HostGroupMembershipResolver($this->db()); $resolver->refreshDb(); } public function filterAction() { $flat = []; /** @var FilterChain|FilterExpression $filter */ $filter = Filter::fromQueryString( // 'object_name=*ic*2*&object_type=object' 'vars.bpconfig=*' ); Benchmark::measure('ready'); $objs = IcingaHost::loadAll($this->db()); Benchmark::measure('db done'); foreach ($objs as $host) { $flat[$host->get('id')] = (object) []; foreach ($host->getProperties() as $k => $v) { $flat[$host->get('id')]->$k = $v; } } Benchmark::measure('objects ready'); $vars = IcingaHostVar::loadAll($this->db()); Benchmark::measure('vars loaded'); foreach ($vars as $var) { if (! array_key_exists($var->get('host_id'), $flat)) { // Templates? continue; } $flat[$var->get('host_id')]->{'vars.' . $var->get('varname')} = $var->get('varvalue'); } Benchmark::measure('vars done'); foreach ($flat as $host) { if ($filter->matches($host)) { echo $host->object_name . "\n"; } } } } icingaweb2-module-director-1.11.8/application/clicommands/CommandCommand.php000066400000000000000000000004111516513262500270740ustar00rootroot00000000000000params->shift('profile'); if ($profile) { $this->enableDbProfiler(); } $config = new IcingaConfig($this->db()); Benchmark::measure('Rendering config'); if ($config->hasBeenModified()) { Benchmark::measure('Config rendered, storing to db'); $config->store(); Benchmark::measure('All done'); $checksum = $config->getHexChecksum(); printf( "New config with checksum %s has been generated\n", $checksum ); } else { $checksum = $config->getHexChecksum(); printf( "Config with checksum %s already exists\n", $checksum ); } if ($profile) { $this->dumpDbProfile(); } } protected function dumpDbProfile() { $profiler = $this->getDbProfiler(); $totalTime = $profiler->getTotalElapsedSecs(); $queryCount = $profiler->getTotalNumQueries(); $longestTime = 0; $longestQuery = null; /** @var \Zend_Db_Profiler_Query $query */ foreach ($profiler->getQueryProfiles() as $query) { echo $query->getQuery() . "\n"; if ($query->getElapsedSecs() > $longestTime) { $longestTime = $query->getElapsedSecs(); $longestQuery = $query->getQuery(); } } echo 'Executed ' . $queryCount . ' queries in ' . $totalTime . ' seconds' . "\n"; echo 'Average query length: ' . $totalTime / $queryCount . ' seconds' . "\n"; echo 'Queries per second: ' . $queryCount / $totalTime . "\n"; echo 'Longest query length: ' . $longestTime . "\n"; echo "Longest query: \n" . $longestQuery . "\n"; } protected function getDbProfiler() { return $this->db()->getDbAdapter()->getProfiler(); } protected function enableDbProfiler() { return $this->getDbProfiler()->setEnabled(true); } /** * Deploy the current configuration * * USAGE * * icingacli director config deploy [--checksum ] [--force] [--wait ] * [--grace-period ] * * OPTIONS * * --checksum Optionally deploy a specific configuration * --force Force a deployment, even when the configuration * hasn't changed * --wait Optionally wait until Icinga completed it's * restart * --grace-period Do not deploy if a deployment took place * less than ago */ public function deployAction() { $db = $this->db(); $checksum = $this->params->get('checksum'); if ($checksum) { $config = IcingaConfig::load(hex2bin($checksum), $db); } else { $config = IcingaConfig::generate($db); $checksum = $config->getHexChecksum(); } $deployer = new ConditionalDeployment($db, $this->api()); $deployer->force((bool) $this->params->get('force')); if ($graceTime = $this->params->get('grace-period')) { $deployer->setGracePeriod(new DeploymentGracePeriod((int) $graceTime, $db)); if ($this->params->get('force')) { fwrite(STDERR, "WARNING: force overrides Grace period\n"); } } $deployer->refresh(); if ($deployment = $deployer->deploy($config)) { if ($deployer->hasBeenForced()) { echo $deployer->getNoDeploymentReason() . ", deploying anyway\n"; } printf("Config '%s' has been deployed\n", $checksum); } else { echo $deployer->getNoDeploymentReason() . "\n"; return; } if ($timeout = $this->getWaitTime()) { $deployed = $deployer->waitForStartupAfterDeploy($deployment, $timeout); if ($deployed !== true) { $this->fail("Waiting for Icinga restart failed '%s': %s\n", $checksum, $deployed); } } } /** * Checks the deployments status */ public function deploymentstatusAction() { $db = $this->db(); $api = $this->api(); $status = new DeploymentStatus($db, $api); $result = $status->getDeploymentStatus($this->params->get('configs'), $this->params->get('activities')); if ($key = $this->params->get('key')) { $result = SyncUtils::getSpecificValue($result, $key); } if (is_string($result)) { echo "$result\n"; } else { echo Json::encode($result, JSON_PRETTY_PRINT) . "\n"; } } protected function getWaitTime() { if ($timeout = $this->params->get('wait')) { if (!ctype_digit($timeout)) { $this->fail("--wait must be the number of seconds to wait'"); } return (int) $timeout; } return null; } } icingaweb2-module-director-1.11.8/application/clicommands/CoreCommand.php000066400000000000000000000006101516513262500264070ustar00rootroot00000000000000api()->getConstants() as $name => $value) { printf("const %s = %s\n", $name, PlainObjectRenderer::render($value)); } } } icingaweb2-module-director-1.11.8/application/clicommands/DaemonCommand.php000066400000000000000000000011601516513262500267230ustar00rootroot00000000000000] */ public function runAction() { $this->app->getModuleManager()->loadEnabledModules(); $daemon = new BackgroundDaemon(); if ($dbResource = $this->params->get('db-resource')) { $daemon->setDbResourceName($dbResource); } $daemon->run(); } } icingaweb2-module-director-1.11.8/application/clicommands/DependencyCommand.php000066400000000000000000000004231516513262500275770ustar00rootroot00000000000000api()->getStatus()); } } icingaweb2-module-director-1.11.8/application/clicommands/ExportCommand.php000066400000000000000000000110231516513262500270000ustar00rootroot00000000000000db()); echo $this->renderJson( $export->serializeAllImportSources(), !$this->params->shift('no-pretty') ); } /** * Export all SyncRule definitions * * USAGE * * icingacli director export syncrules [options] * * OPTIONS * * --no-pretty JSON is pretty-printed per default * Use this flag to enforce unformatted JSON */ public function syncrulesAction() { $export = new ImportExport($this->db()); echo $this->renderJson( $export->serializeAllSyncRules(), !$this->params->shift('no-pretty') ); } /** * Export all Job definitions * * USAGE * * icingacli director export jobs [options] * * OPTIONS * * --no-pretty JSON is pretty-printed per default * Use this flag to enforce unformatted JSON */ public function jobsAction() { $export = new ImportExport($this->db()); echo $this->renderJson( $export->serializeAllJobs(), !$this->params->shift('no-pretty') ); } /** * Export all DataField definitions * * USAGE * * icingacli director export datafields [options] * * OPTIONS * * --no-pretty JSON is pretty-printed per default * Use this flag to enforce unformatted JSON */ public function datafieldsAction() { $export = new ImportExport($this->db()); echo $this->renderJson( $export->serializeAllDataFields(), !$this->params->shift('no-pretty') ); } /** * Export all DataList definitions * * USAGE * * icingacli director export datalists [options] * * OPTIONS * * --no-pretty JSON is pretty-printed per default * Use this flag to enforce unformatted JSON */ public function datalistsAction() { $export = new ImportExport($this->db()); echo $this->renderJson( $export->serializeAllDataLists(), !$this->params->shift('no-pretty') ); } // /** // * Export all IcingaHostGroup definitions // * // * USAGE // * // * icingacli director export hostgroup [options] // * // * OPTIONS // * // * --no-pretty JSON is pretty-printed per default // * Use this flag to enforce unformatted JSON // */ // public function hostgroupAction() // { // $export = new ImportExport($this->db()); // echo $this->renderJson( // $export->serializeAllHostGroups(), // !$this->params->shift('no-pretty') // ); // } // // /** // * Export all IcingaServiceGroup definitions // * // * USAGE // * // * icingacli director export servicegroup [options] // * // * OPTIONS // * // * --no-pretty JSON is pretty-printed per default // * Use this flag to enforce unformatted JSON // */ // public function servicegroupAction() // { // $export = new ImportExport($this->db()); // echo $this->renderJson( // $export->serializeAllServiceGroups(), // !$this->params->shift('no-pretty') // ); // } /** * Export all IcingaTemplateChoiceHost definitions * * USAGE * * icingacli director export hosttemplatechoices [options] * * OPTIONS * * --no-pretty JSON is pretty-printed per default * Use this flag to enforce unformatted JSON */ public function hosttemplatechoicesAction() { $export = new ImportExport($this->db()); echo $this->renderJson( $export->serializeAllHostTemplateChoices(), !$this->params->shift('no-pretty') ); } } icingaweb2-module-director-1.11.8/application/clicommands/HealthCommand.php000066400000000000000000000045251516513262500267350ustar00rootroot00000000000000 Run only a specific set of checks * valid names: config, sync, import, jobs, deployment * --name Name of a single Import Source or Sync Rule * --db Use a specific Icinga Web DB resource * --watch Refresh every . For interactive use only */ public function checkAction() { $health = new Health(); if ($name = $this->params->get('db')) { $health->setDbResourceName($name); } if ($name = $this->params->get('check')) { $check = $health->getCheck($name, $this->params->get('name')); echo PluginOutputBeautifier::beautify($check->getOutput(), $this->screen); exit($check->getState()->getNumeric()); } else { $state = new PluginState('OK'); $checks = $health->getAllChecks(); $output = []; foreach ($checks as $check) { $state->raise($check->getState()); $output[] = $check->getOutput(); } if ($state->getNumeric() === 0) { echo "Icinga Director: everything is fine\n\n"; } else { echo "Icinga Director: there are problems\n\n"; } $out = PluginOutputBeautifier::beautify(implode("\n", $output), $this->screen); echo $out; if (! $this->isBeingWatched()) { exit($state->getNumeric()); } } } /** * Cli should provide this information, as it shifts the parameter * * @return bool */ protected function isBeingWatched() { global $argv; return in_array('--watch', $argv); } } icingaweb2-module-director-1.11.8/application/clicommands/HostCommand.php000066400000000000000000000004001516513262500264310ustar00rootroot00000000000000params->shift('pending')) { $tasks = $this->housekeeping()->getPendingTaskSummary(); } else { $tasks = $this->housekeeping()->getTaskSummary(); } $len = array_reduce( $tasks, function ($max, $task) { return max( $max, strlen($task->title) + strlen($task->name) + 3 ); } ); if (count($tasks)) { print "\n"; printf(" %-" . $len . "s | %s\n", 'Housekeeping task (name)', 'Count'); printf("-%-" . $len . "s-|-------\n", str_repeat('-', $len)); } foreach ($tasks as $task) { printf( " %-" . $len . "s | %5d\n", sprintf('%s (%s)', $task->title, $task->name), $task->count ); } if (count($tasks)) { print "\n"; } } public function runAction() { if (!$job = $this->params->shift()) { throw new MissingParameterException( 'Job is required, say ALL to run all pending jobs' ); } if ($job === 'ALL') { $this->housekeeping()->runAllTasks(); } else { $this->housekeeping()->runTask($job); } } protected function housekeeping() { if ($this->housekeeping === null) { $this->housekeeping = new Housekeeping($this->db()); } return $this->housekeeping; } } icingaweb2-module-director-1.11.8/application/clicommands/ImportCommand.php000066400000000000000000000032021516513262500267710ustar00rootroot00000000000000db()); $count = $import->unserializeImportSources(json_decode($json)); echo "$count Import Sources have been imported\n"; } // /** // * Import an ImportSource definition // * // * USAGE // * // * icingacli director import importsource < importsource.json // * // * OPTIONS // */ // public function importsourcection() // { // $json = file_get_contents('php://stdin'); // $object = ImportSource::import(json_decode($json), $this->db()); // $object->store(); // printf("Import Source '%s' has been imported\n", $object->getObjectName()); // } /** * Import SyncRule definitions * * USAGE * * icingacli director import syncrules < syncrules.json */ public function syncrulesAction() { $json = file_get_contents('php://stdin'); $import = new ImportExport($this->db()); $count = $import->unserializeSyncRules(json_decode($json)); echo "$count Sync Rules have been imported\n"; } } icingaweb2-module-director-1.11.8/application/clicommands/ImportsourceCommand.php000066400000000000000000000131521516513262500302170ustar00rootroot00000000000000db()); if (empty($sources)) { echo "No Import Source has been defined\n"; return; } printf("%4s | %s\n", 'ID', 'Import Source name'); printf("-----+%s\n", str_repeat('-', 64)); foreach ($sources as $source) { $state = $source->get('import_state'); printf("%4d | %s\n", $source->get('id'), $source->get('source_name')); printf(" | -> %s%s\n", $state, $state === 'failing' ? ': ' . $source->get('last_error_message') : ''); } } /** * Check a given Import Source for changes * * This command fetches data from the given Import Source and compares it * to the most recently imported data. * * USAGE * * icingacli director importsource check --id * * OPTIONS * * --id An Import Source ID. Use the list command to figure out * --benchmark Show timing and memory usage details */ public function checkAction() { $source = $this->getImportSource(); $source->checkForChanges(); $this->showImportStateDetails($source); } /** * This command deletes the given Import Source. * * USAGE * * icingacli director importsource delete --id * * OPTIONS * * --id An Import Source ID. Use the list command to figure out */ public function deleteAction() { $source = $this->getImportSource(); if ($source->delete()) { echo sprintf("Import Source '%s' has been deleted\n", $source->get('source_name')); } } /** * Fetch current data from a given Import Source * * This command fetches data from the given Import Source and outputs * them as plain JSON * * USAGE * * icingacli director importsource fetch --id * * OPTIONS * * --id An Import Source ID. Use the list command to figure out * --benchmark Show timing and memory usage details */ public function fetchAction() { $source = $this->getImportSource(); $source->checkForChanges(); $hook = ImportSourceHook::forImportSource($source); Benchmark::measure('Ready to fetch data'); $data = $hook->fetchData(); $source->applyModifiers($data); Benchmark::measure(sprintf('Got %d rows, ready to dump JSON', count($data))); echo Json::encode($data, JSON_PRETTY_PRINT); } /** * Trigger an Import Run for a given Import Source * * This command fetches data from the given Import Source and stores it to * the Director DB, so that the next related Sync Rule run can work with * fresh data. In case data didn't change, nothing is going to be stored. * * USAGE * * icingacli director importsource run --id * * OPTIONS * * --id An Import Source ID. Use the list command to figure out * --benchmark Show timing and memory usage details */ public function runAction() { $source = $this->getImportSource(); if ($source->runImport()) { print "New data has been imported\n"; $this->showImportStateDetails($source); } else { print "Nothing has been changed, imported data is still up to date\n"; } } /** * @return ImportSource */ protected function getImportSource() { return ImportSource::loadWithAutoIncId( (int) $this->params->getRequired('id'), $this->db() ); } /** * @param ImportSource $source * @throws \Icinga\Exception\IcingaException */ protected function showImportStateDetails(ImportSource $source) { echo $this->getImportStateDescription($source) . "\n"; } /** * @param ImportSource $source * @return string * @throws \Icinga\Exception\IcingaException */ protected function getImportStateDescription(ImportSource $source) { switch ($source->get('import_state')) { case 'unknown': return "It's currently unknown whether we are in sync with this" . ' Import Source. You should either check for changes or' . ' trigger a new Import Run.'; case 'in-sync': return 'This Import Source is in sync'; case 'pending-changes': return 'There are pending changes for this Import Source. You' . ' should trigger a new Import Run.'; case 'failing': return 'This Import Source failed: ' . $source->get('last_error_message'); default: return 'This Import Source has an invalid state: ' . $source->get('import_state'); } } } icingaweb2-module-director-1.11.8/application/clicommands/JobsCommand.php000066400000000000000000000050161516513262500264210ustar00rootroot00000000000000app->getModuleManager()->loadEnabledModules(); $loop = Loop::create(); if ($this->params->get('rpc')) { $this->enableRpc($loop); } if ($this->params->get('rpc') && $jobId = $this->params->get('id')) { $exitCode = 1; $jobId = (int) $jobId; $loop->futureTick(function () use ($jobId, $loop, &$exitCode) { Process::setTitle('icinga::director::job'); try { $this->raiseLimits(); $job = DirectorJob::loadWithAutoIncId($jobId, $this->db()); Process::setTitle('icinga::director::job (' . $job->get('job_name') . ')'); if ($job->run()) { $exitCode = 0; } else { $exitCode = 1; } } catch (Exception $e) { Logger::error($e->getMessage()); $exitCode = 1; } $loop->futureTick(function () use ($loop) { $loop->stop(); }); }); } else { Logger::error('This command is no longer available. Please check our Upgrading documentation'); $exitCode = 1; } $loop->run(); exit($exitCode); } protected function enableRpc(LoopInterface $loop) { // stream_set_blocking(STDIN, 0); // stream_set_blocking(STDOUT, 0); // print_r(stream_get_meta_data(STDIN)); // stream_set_write_buffer(STDOUT, 0); // ini_set('implicit_flush', 1); $netString = new StreamWrapper( new ReadableResourceStream(STDIN, $loop), new WritableResourceStream(STDOUT, $loop) ); $jsonRpc = new Connection(); $jsonRpc->handle($netString); Logger::replaceRunningInstance(new JsonRpcLogWriterAlias($jsonRpc)); } } icingaweb2-module-director-1.11.8/application/clicommands/KickstartCommand.php000066400000000000000000000051211516513262500274600ustar00rootroot00000000000000 '/usr/local/bin:/usr/bin:/bin', * command => 'icingacli director kickstart run', * onlyif => 'icingacli director kickstart required', * require => Exec['Icinga Director DB migration'], * } * * Exit code 0: A kickstart run is required. * Exit code 1: Kickstart is configured but a run is not required. * Exit code 2: A kickstart run is not required. */ public function requiredAction() { if ($this->kickstart()->isConfigured()) { if ($this->kickstart()->isRequired()) { if ($this->isVerbose) { echo "Kickstart has been configured and should be triggered\n"; } exit(0); } else { echo "Kickstart configured, execution is not required\n"; exit(1); } } else { echo "Kickstart has not been configured\n"; exit(2); } } /** * Trigger the kickstart helper * * This will connect to the endpoint configured in your kickstart.ini, * store the given API user and import existing objects like zones, * endpoints and commands. * * /etc/icingaweb2/modules/director/kickstart.ini could look as follows: * * [config] * endpoint = "master-node.example.com" * * ; Host can be an IP address or a hostname. Equals to endpoint name * ; if not set: * host = "127.0.0.1" * * ; Port is 5665 if none given * port = 5665 * * username = "director" * password = "***" * */ public function runAction() { $this->raiseLimits(); $this->kickstart()->loadConfigFromFile()->run(); exit(0); } protected function kickstart() { return new KickstartHelper($this->db()); } } icingaweb2-module-director-1.11.8/application/clicommands/MigrationCommand.php000066400000000000000000000032471516513262500274610ustar00rootroot00000000000000 'icingacli director migration run', * onlyif => 'icingacli director migration pending', * } * * Exit code 0 means that there are pending migrations, code 1 that there * are no such. Use --verbose for human readable output */ public function pendingAction() { if ($count = $this->migrations()->countPendingMigrations()) { if ($this->isVerbose) { if ($count === 1) { echo "There is 1 pending migration\n"; } else { printf("There are %d pending migrations\n", $count); } } exit(0); } else { if ($this->isVerbose) { echo "There are no pending migrations\n"; } exit(1); } } /** * Run any pending migrations * * All pending migrations will be silently applied */ public function runAction() { $this->migrations()->applyPendingMigrations(); exit(0); } protected function migrations() { return new Migrations($this->db()); } } icingaweb2-module-director-1.11.8/application/clicommands/NotificationCommand.php000066400000000000000000000004301516513262500301450ustar00rootroot00000000000000params->get('host')) && $this->params->shift('allow-overrides')) { if ($this->setServiceProperties($host)) { return; } } parent::setAction(); } protected function setServiceProperties($hostname) { $serviceName = $this->getName(); $host = IcingaHost::load($hostname, $this->db()); $service = ServiceFinder::find($host, $serviceName); if ($service->requiresOverrides()) { self::checkForOverrideSafety($this->params); $properties = $this->remainingParams(); unset($properties['host']); OverrideHelper::applyOverriddenVars($host, $serviceName, $properties); $this->persistChanges($host, 'Host', $hostname . " (Overrides for $serviceName)", 'modified'); return true; } return false; } protected static function checkForOverrideSafety(Params $params) { if ($params->shift('replace')) { throw new InvalidArgumentException('--replace is not available for Variable Overrides'); } $appends = self::stripPrefixedProperties($params, 'append-'); $remove = self::stripPrefixedProperties($params, 'remove-'); OverrideHelper::assertVarsForOverrides($appends); OverrideHelper::assertVarsForOverrides($remove); if (!empty($appends)) { throw new InvalidArgumentException('--append- is not available for Variable Overrides'); } if (!empty($remove)) { throw new InvalidArgumentException('--remove- is not available for Variable Overrides'); } // Alternative, untested: // $this->appendToArrayProperties($object, $appends); // $this->removeProperties($object, $remove); } protected function load($name) { return parent::load($this->makeServiceKey($name)); } protected function exists($name) { return parent::exists($this->makeServiceKey($name)); } protected function makeServiceKey($name) { if ($host = $this->params->get('host')) { return [ 'object_name' => $name, 'host_id' => IcingaHost::load($host, $this->db())->get('id'), ]; } else { return [ 'object_name' => $name, 'object_type' => 'template', ]; } } } icingaweb2-module-director-1.11.8/application/clicommands/ServicegroupCommand.php000066400000000000000000000004311516513262500301750ustar00rootroot00000000000000db()); if (empty($rules)) { echo "No Sync Rule has been defined\n"; return; } printf("%4s | %s\n", 'ID', 'Sync Rule name'); printf("-----+%s\n", str_repeat('-', 64)); foreach ($rules as $rule) { $state = $rule->get('sync_state'); printf("%4d | %s\n", $rule->get('id'), $rule->get('rule_name')); printf(" | -> %s%s\n", $state, $state === 'failing' ? ': ' . $rule->get('last_error_message') : ''); } } /** * Check a given Sync Rule for changes * * This command runs a complete Sync in memory but doesn't persist eventual changes. * * USAGE * * icingacli director syncrule check --id * * OPTIONS * * --id A Sync Rule ID. Use the list command to figure out * --benchmark Show timing and memory usage details */ public function checkAction() { $rule = $this->getSyncRule(); $hasChanges = $rule->checkForChanges(); $this->showSyncStateDetails($rule); if ($hasChanges) { $mods = $this->getExpectedModificationCounts($rule); printf( "Expected modifications: %dx create, %dx modify, %dx delete\n", $mods->modify, $mods->create, $mods->delete ); } exit($this->getSyncStateExitCode($rule)); } /** * This command deletes a Sync Rule. * * USAGE * * icingacli director syncrule delete --id * * OPTIONS * * --id A Sync Rule ID. Use the list command to figure out */ public function deleteAction() { $rule = $this->getSyncRule(); if ($rule->delete()) { echo sprintf("Sync rule '%s' has been deleted\n", $rule->get('rule_name')); } } protected function getExpectedModificationCounts(SyncRule $rule) { $modifications = $rule->getExpectedModifications(); $create = 0; $modify = 0; $delete = 0; /** @var IcingaObject $object */ foreach ($modifications as $object) { if ($object->hasBeenLoadedFromDb()) { if ($object->shouldBeRemoved()) { $delete++; } else { $modify++; } } else { $create++; } } return (object) [ DirectorActivityLog::ACTION_CREATE => $create, DirectorActivityLog::ACTION_MODIFY => $modify, DirectorActivityLog::ACTION_DELETE => $delete, ]; } /** * Trigger a Sync Run for a given Sync Rule * * This command builds new objects according your Sync Rule, compares them * with existing ones and persists eventual changes. * * USAGE * * icingacli director syncrule run --id * * OPTIONS * * --id A Sync Rule ID. Use the list command to figure out * --benchmark Show timing and memory usage details */ public function runAction() { $rule = $this->getSyncRule(); if ($rule->applyChanges()) { print "New data has been imported\n"; $this->showSyncStateDetails($rule); } else { print "Nothing has been changed, imported data is still up to date\n"; } } /** * @return SyncRule */ protected function getSyncRule() { return SyncRule::loadWithAutoIncId( (int) $this->params->getRequired('id'), $this->db() ); } /** * @param SyncRule $rule */ protected function showSyncStateDetails(SyncRule $rule) { echo $this->getSyncStateDescription($rule) . "\n"; } /** * @param SyncRule $rule * @return string */ protected function getSyncStateDescription(SyncRule $rule) { switch ($rule->get('sync_state')) { case 'unknown': return "It's currently unknown whether we are in sync with this rule." . ' You should either check for changes or trigger a new Sync Run.'; case 'in-sync': return 'This Sync Rule is in sync'; case 'pending-changes': return 'There are pending changes for this Sync Rule. You should' . ' trigger a new Sync Run.'; case 'failing': return 'This Sync Rule failed: ' . $rule->get('last_error_message'); default: throw new RuntimeException('Invalid sync state: ' . $rule->get('sync_state')); } } /** * @param SyncRule $rule * @return string */ protected function getSyncStateExitCode(SyncRule $rule) { switch ($rule->get('sync_state')) { case 'unknown': return 3; case 'in-sync': return 0; case 'pending-changes': return 1; case 'failing': return 2; default: throw new RuntimeException('Invalid sync state: ' . $rule->get('sync_state')); } } } icingaweb2-module-director-1.11.8/application/clicommands/TimeperiodCommand.php000066400000000000000000000004221516513262500276210ustar00rootroot00000000000000params->get('name'); return $this->tabs()->add('show', [ 'label' => $this->translate('Basket'), 'url' => 'director/basket', 'urlParams' => ['name' => $name] ])->add('snapshots', [ 'label' => $this->translate('Snapshots'), 'url' => 'director/basket/snapshots', 'urlParams' => ['name' => $name] ]); } /** * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Exception\MissingParameterException */ public function indexAction() { $this->actions()->add( Link::create( $this->translate('Back'), 'director/baskets', null, ['class' => 'icon-left-big'] ) ); $basket = $this->requireBasket(); $this->basketTabs()->activate('show'); $this->addTitle($basket->get('basket_name')); if ($basket->isEmpty()) { $this->content()->add(Hint::info($this->translate('This basket is empty'))); } $this->content()->add( (new BasketForm())->setObject($basket)->handleRequest() ); } /** * @throws \Icinga\Exception\MissingParameterException */ public function addAction() { $this->actions()->add( Link::create( $this->translate('Baskets'), 'director/baskets', null, ['class' => 'icon-tag'] ) ); $this->addSingleTab($this->translate('Add to Basket')); $this->addTitle($this->translate('Add chosen objects to a Configuration Basket')); $form = new AddToBasketForm(); $form->setDb($this->db()) ->setType($this->params->getRequired('type')) ->setNames($this->url()->getParams()->getValues('names')) ->handleRequest(); $this->content()->add($form); } public function createAction() { $this->actions()->add( Link::create( $this->translate('back'), 'director/baskets', null, ['class' => 'icon-left-big'] ) ); $this->addSingleTab($this->translate('Create Basket')); $this->addTitle($this->translate('Create a new Configuration Basket')); $form = (new BasketForm()) ->setDb($this->db()) ->handleRequest(); $this->content()->add($form); } public function uploadAction() { $this->actions()->add( Link::create( $this->translate('back'), 'director/baskets', null, ['class' => 'icon-left-big'] ) ); $this->addSingleTab($this->translate('Upload a Basket')); $this->addTitle($this->translate('Upload a Configuration Basket')); $form = (new BasketUploadForm()) ->setDb($this->db()) ->handleRequest(); $this->content()->add($form); } public function uploadSnapshotAction() { $basket = Basket::load($this->params->get('name'), $this->db()); $this->actions()->add( Link::create( $this->translate('back'), 'director/basket/snapshots', ['name' => $basket->get('basket_name')], ['class' => 'icon-left-big'] ) ); $this->basketTabs()->activate('snapshots'); $this->addTitle($this->translate('Upload a Configuration Basket Snapshot')); $form = (new BasketUploadForm()) ->setObject($basket) ->setDb($this->db()) ->handleRequest(); $this->content()->add($form); } /** * @throws \Icinga\Exception\NotFoundError */ public function snapshotsAction() { $name = $this->params->get('name'); if ($name === null || $name === '') { $basket = null; } else { $basket = Basket::load($name, $this->db()); } if ($basket === null) { $this->addTitle($this->translate('Basket Snapshots')); $this->addSingleTab($this->translate('Snapshots')); } else { $this->addTitle(sprintf( $this->translate('%s: Snapshots'), $basket->get('basket_name') )); $this->basketTabs()->activate('snapshots'); $this->actions()->add(Link::create( $this->translate('Upload'), 'director/basket/upload-snapshot', ['name' => $basket->get('basket_name')], ['class' => 'icon-upload'] )); } if ($basket !== null) { $this->content()->add( (new BasketCreateSnapshotForm()) ->setBasket($basket) ->handleRequest() ); } $table = new BasketSnapshotTable($this->db()); if ($basket !== null) { $table->setBasket($basket); } $table->renderTo($this); } /** * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ public function snapshotAction() { $basket = $this->requireBasket(); $snapshot = BasketSnapshot::load([ 'basket_uuid' => $basket->get('uuid'), 'ts_create' => $this->params->getRequired('ts'), ], $this->db()); $snapSum = bin2hex($snapshot->get('content_checksum')); if ($this->params->get('action') === 'download') { $this->getResponse()->setHeader('Content-Type', 'application/json', true); $this->getResponse()->setHeader('Content-Disposition', sprintf( 'attachment; filename=Director-Basket_%s_%s.json', str_replace([' ', '"'], ['_', '_'], iconv( 'UTF-8', 'ISO-8859-1//IGNORE', $basket->get('basket_name') )), substr($snapSum, 0, 7) )); echo $snapshot->getJsonDump(); return; } $this->addTitle( $this->translate('%s: %s (Snapshot)'), $basket->get('basket_name'), substr($snapSum, 0, 7) ); $this->actions()->add([ Link::create( $this->translate('Show Basket'), 'director/basket', ['name' => $basket->get('basket_name')], ['data-base-target' => '_next'] ), Link::create( $this->translate('Restore'), $this->url()->with('action', 'restore'), null, ['class' => 'icon-rewind'] ), Link::create( $this->translate('Download'), $this->url() ->with([ 'action' => 'download', 'dbResourceName' => $this->getDbResourceName() ]), null, [ 'class' => 'icon-download', 'target' => '_blank' ] ), ]); $properties = new NameValueTable(); $properties->addNameValuePairs([ $this->translate('Created') => DateFormatter::formatDateTime($snapshot->get('ts_create') / 1000), $this->translate('Content Checksum') => bin2hex($snapshot->get('content_checksum')), ]); $this->content()->add($properties); if ($this->params->get('action') === 'restore') { $form = new RestoreBasketForm(); $form ->setSnapshot($snapshot) ->handleRequest(); $this->content()->add($form); $targetDbName = $form->getValue('target_db'); $connection = $form->getDb(); } else { $targetDbName = null; $connection = $this->db(); } $this->addSingleTab($this->translate('Snapshot')); $diff = new BasketDiff($snapshot, $connection); foreach ($diff->getBasketObjects() as $type => $objects) { if ($type === 'Datafield') { // TODO: we should now be able to show all fields and link // to a "diff" for the ones that should be created // $this->content()->add(Html::tag('h2', sprintf('+%d Datafield(s)', count($objects)))); continue; } $table = new NameValueTable(); $table->addAttributes([ 'class' => ['table-basket-changes', 'table-row-selectable'], 'data-base-target' => '_next', ]); foreach ($objects as $key => $object) { $linkParams = [ 'name' => $basket->get('basket_name'), 'checksum' => $this->params->get('checksum'), 'ts' => $this->params->get('ts'), 'type' => $type, 'key' => $key, ]; if ($targetDbName !== null) { $linkParams['target_db'] = $targetDbName; } try { if ($uuid = $object->uuid ?? null) { $uuid = Uuid::fromString($uuid); } if ($diff->hasCurrentInstance($type, $key, $uuid)) { if ($diff->hasChangedFor($type, $key, $uuid)) { $link = Link::create( $this->translate('modified'), 'director/basket/snapshotobject', $linkParams, ['class' => 'basket-modified'] ); } else { $link = Html::tag( 'span', ['class' => 'basket-unchanged'], $this->translate('unchanged') ); } } else { $link = Link::create( $this->translate('new'), 'director/basket/snapshotobject', $linkParams, ['class' => 'basket-new'] ); } $table->addNameValueRow($key, $link); } catch (Exception $e) { $table->addNameValueRow( $key, Html::tag('a', sprintf( '%s (%s:%d)', $e->getMessage(), basename($e->getFile()), $e->getLine() )) ); } } $this->content()->add(Html::tag('h2', $type)); $this->content()->add($table); } } /** * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ public function snapshotobjectAction() { $basket = $this->requireBasket(); $snapshot = BasketSnapshot::load([ 'basket_uuid' => $basket->get('uuid'), 'ts_create' => $this->params->getRequired('ts'), ], $this->db()); $snapshotUrl = $this->url()->without('type')->without('key')->setPath('director/basket/snapshot'); $type = $this->params->get('type'); $key = $this->params->get('key'); $this->addTitle($this->translate('Single Object Diff')); $this->content()->add(Hint::info(Html::sprintf( $this->translate('Comparing %s "%s" from Snapshot "%s" to current config'), $type, $key, Link::create( substr(bin2hex($snapshot->get('content_checksum')), 0, 7), $snapshotUrl, null, ['data-base-target' => '_next'] ) ))); $this->actions()->add([ Link::create( $this->translate('back'), $snapshotUrl, null, ['class' => 'icon-left-big'] ), /* Link::create( $this->translate('Restore'), $this->url()->with('action', 'restore'), null, ['class' => 'icon-rewind'] ) */ ]); $this->addSingleTab($this->translate('Snapshot')); $targetDbName = $this->params->get('target_db'); if ($targetDbName === null) { $connection = $this->db(); } else { $connection = Db::fromResourceName($targetDbName); } $diff = new BasketDiff($snapshot, $connection); $object = $diff->getBasketObject($type, $key); if ($uuid = $object->uuid ?? null) { $uuid = Uuid::fromString($uuid); } $basketJson = $diff->getBasketString($type, $key); $currentJson = $diff->getCurrentString($type, $key, $uuid); if ($currentJson === $basketJson) { $this->content()->add([ Hint::ok('Basket equals current object'), Html::tag('pre', $currentJson) ]); } else { $this->content()->add(new InlineDiff(new PhpDiff($currentJson, $basketJson))); } } /** * @return Basket * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ protected function requireBasket() { return Basket::load($this->params->getRequired('name'), $this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/BasketsController.php000066400000000000000000000037411516513262500277450ustar00rootroot00000000000000setAutorefreshInterval(10); $this->addSingleTab($this->translate('Baskets')); $this->actions()->add([ Link::create( $this->translate('Create'), 'director/basket/create', null, ['class' => 'icon-plus'] ), Link::create( $this->translate('Upload'), 'director/basket/upload', null, ['class' => 'icon-upload'] ), ]); $this->addTitle($this->translate('Configuration Baskets')); $this->content()->add(Html::tag('p', $this->translate( 'A Configuration Basket references specific Configuration' . ' Objects or all objects of a specific type. It has been' . ' designed to share Templates, Import/Sync strategies and' . ' other base Configuration Objects. It is not a tool to' . ' operate with single Hosts or Services.' ))); $this->content()->add(Html::tag('p', $this->translate( 'You can create Basket snapshots at any time, this will persist' . ' a serialized representation of all involved objects at that' . ' moment in time. Snapshots can be exported, imported, shared' . ' and restored - to the very same or another Director instance.' ))); $table = (new BasketTable($this->db())) ->setAttribute('data-base-target', '_self'); // TODO: temporarily disabled, this was a thing in dipl if (/*$table->hasSearch() || */count($table)) { $table->renderTo($this); } } } icingaweb2-module-director-1.11.8/application/controllers/BranchController.php000066400000000000000000000116241516513262500275450ustar00rootroot00000000000000db(), $this->getBranch())); SyncRule::setDbObjectStore(new DbObjectStore($this->db(), $this->getBranch())); } protected function checkDirectorPermissions() { } public function activityAction() { $this->assertPermission('director/showconfig'); $ts = $this->params->getRequired('ts'); $activity = BranchActivity::load($ts, $this->db()); $store = new BranchStore($this->db()); $branch = $store->fetchBranchByUuid($activity->getBranchUuid()); if ($branch->isSyncPreview()) { $this->addSingleTab($this->translate('Sync Preview')); $this->addTitle($this->translate('Expected Modification')); } else { $this->addSingleTab($this->translate('Activity')); $this->addTitle($this->translate('Branch Activity')); } $this->content()->add($this->prepareActivityInfo($activity)); $this->showActivity($activity); } protected function prepareActivityInfo(BranchActivity $activity) { $table = new NameValueTable(); $table->addNameValuePairs([ $this->translate('Author') => $activity->getAuthor(), $this->translate('Date') => date('Y-m-d H:i:s', $activity->getTimestamp()), $this->translate('Action') => $activity->getAction() . ' ' . preg_replace('/^icinga_/', '', $activity->getObjectTable()) . ' ' . $activity->getObjectName(), // $this->translate('Actions') => ['Undo form'], ]); return $table; } protected function leftFromActivity(BranchActivity $activity) { if ($activity->isActionCreate()) { return null; } $object = DbObjectTypeRegistry::newObject($activity->getObjectTable(), [], $this->db()); $properties = $this->objectTypeFirst($activity->getFormerProperties()->jsonSerialize()); foreach ($properties as $key => $value) { $object->set($key, $value); } return $object; } protected function rightFromActivity(BranchActivity $activity) { if ($activity->isActionDelete()) { return null; } $object = DbObjectTypeRegistry::newObject($activity->getObjectTable(), [], $this->db()); if (! $activity->isActionCreate()) { foreach ($activity->getFormerProperties()->jsonSerialize() as $key => $value) { $object->set($key, $value); } } $properties = $this->objectTypeFirst($activity->getModifiedProperties()->jsonSerialize()); foreach ($properties as $key => $value) { $object->set($key, $value); } return $object; } protected function objectTypeFirst($properties) { $properties = (array) $properties; if (isset($properties['object_type'])) { $type = $properties['object_type']; unset($properties['object_type']); $properties = ['object_type' => $type] + $properties; } return $properties; } protected function showActivity(BranchActivity $activity) { $left = $this->leftFromActivity($activity); $right = $this->rightFromActivity($activity); if ($left instanceof IcingaObject || $right instanceof IcingaObject) { $this->content()->add(new IcingaConfigDiff( $left ? $left->toSingleIcingaConfig() : $this->createEmptyConfig(), $right ? $right->toSingleIcingaConfig() : $this->createEmptyConfig() )); } else { $this->content()->add([ Html::tag('h3', $this->translate('Modification')), new SideBySideDiff(new PhpDiff( PlainObjectRenderer::render($left->getProperties()), PlainObjectRenderer::render($right->getProperties()) )) ]); } } protected function createEmptyConfig() { return new IcingaConfig($this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/CommandController.php000066400000000000000000000101301516513262500277150ustar00rootroot00000000000000object; if ($o && ! $o->isExternal()) { if ($this->getBranch()->isBranch()) { $urlParams = ['uuid' => $o->getUniqueId()->toString()]; } else { $urlParams = ['name' => $o->getObjectName()]; } $this->tabs()->add('arguments', [ 'url' => 'director/command/arguments', 'urlParams' => $urlParams, 'label' => 'Arguments' ]); } } /** * @throws \Icinga\Exception\NotFoundError * @throws \Zend_Db_Select_Exception */ public function indexAction() { if (! $this->getRequest()->isApiRequest()) { $this->showUsage(); } parent::indexAction(); } /** * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Security\SecurityException * @throws \Zend_Db_Select_Exception */ public function renderAction() { if ($this->object->isExternal()) { $this->showUsage(); } parent::renderAction(); } /** * @throws \Zend_Db_Select_Exception */ protected function showUsage() { /** @var IcingaCommand $command */ $command = $this->object; if ($command->isInUse()) { $usage = new CommandUsage($command); $this->content()->add(Hint::info(Html::sprintf( $this->translate('This Command is currently being used by %s'), Html::tag('span', null, $usage->getLinks())->setSeparator(', ') ))->addAttributes([ 'data-base-target' => '_next' ])); } else { $this->content()->add(Hint::warning($this->translate('This Command is currently not in use'))); } } public function argumentsAction() { $p = $this->params; /** @var IcingaCommand $o */ $o = $this->object; $this->tabs()->activate('arguments'); $this->addTitle($this->translate('Command arguments: %s'), $o->getObjectName()); $form = (new IcingaCommandArgumentForm()) ->setBranch($this->getBranch()) ->setCommandObject($o); if ($argument = $p->shift('argument')) { $this->addBackLink('director/command/arguments', [ 'name' => $p->get('name') ]); if ($this->branch->isBranch()) { $arguments = $o->arguments(); $argument = $arguments->get($argument); // IcingaCommandArgument::create((array) $arguments->get($argument)->toFullPlainObject()); // $argument->setBeingLoadedFromDb(); } else { $argument = IcingaCommandArgument::load([ 'command_id' => $o->get('id'), 'argument_name' => $argument ], $this->db()); } $form->setObject($argument); } $form->handleRequest(); $this->content()->add([$form]); if ($this->branch->isBranch()) { (new BranchedIcingaCommandArgumentTable($o, $this->getBranch()))->renderTo($this); } else { (new IcingaCommandArgumentTable($o, $this->getBranch()))->renderTo($this); } } protected function hasBasketSupport() { return true; } } icingaweb2-module-director-1.11.8/application/controllers/CommandsController.php000066400000000000000000000007401516513262500301060ustar00rootroot00000000000000params->get('type', 'object'); if (! in_array($type, $validTypes)) { $type = 'object'; } $this->table->setType($type); } } icingaweb2-module-director-1.11.8/application/controllers/CommandtemplateController.php000066400000000000000000000006211516513262500314550ustar00rootroot00000000000000 $this->params->get('name') ], $this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/ConfigController.php000066400000000000000000000440501516513262500275540ustar00rootroot00000000000000sendNotFoundForRestApi()) { return; } $this->assertPermission('director/deploy'); $this->addTitle($this->translate('Deployments')); try { if (DirectorDeploymentLog::hasUncollected($this->db())) { $this->setAutorefreshInterval(2); } else { $this->setAutorefreshInterval(20); } } catch (Exception $e) { $this->content()->prepend(Hint::warning($e->getMessage())); // No problem, Icinga might be reloading } if (! $this->getBranch()->isBranch()) { // TODO: a form! $this->actions()->add(Link::create( $this->translate('Render config'), 'director/config/store', null, ['class' => 'icon-wrench'] )); } $this->tabs(new InfraTabs($this->Auth()))->activate('deploymentlog'); $table = new DeploymentLogTable($this->db()); try { // Move elsewhere $table->setActiveStageName( $this->api()->getActiveStageName() ); } catch (Exception $e) { // Don't care } $table->renderTo($this); } /** * @throws NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException * @throws \Icinga\Security\SecurityException */ public function deployAction() { $request = $this->getRequest(); if (! $request->isApiRequest()) { throw new NotFoundError('Not found'); } if (! $request->isPost()) { throw new RuntimeException(sprintf( 'Unsupported method: %s', $request->getMethod() )); } $this->assertPermission('director/deploy'); // TODO: require POST $checksum = $this->params->get('checksum'); if ($checksum) { $config = IcingaConfig::load(hex2bin($checksum), $this->db()); } else { $config = IcingaConfig::generate($this->db()); $checksum = $config->getHexChecksum(); } try { $this->api()->wipeInactiveStages($this->db()); } catch (Exception $e) { $this->deploymentFailed($checksum, $e->getMessage()); } if ($this->api()->dumpConfig($config, $this->db())) { $this->deploymentSucceeded($checksum); } else { $this->deploymentFailed($checksum); } } public function deploymentStatusAction() { if ($this->sendNotFoundUnlessRestApi()) { return; } $db = $this->db(); $api = $this->api(); $status = new DeploymentStatus($db, $api); $result = $status->getDeploymentStatus($this->params->get('configs'), $this->params->get('activities')); $this->sendJson($this->getResponse(), (object) $result); } /** * @throws \Icinga\Security\SecurityException */ public function activitiesAction() { if ($this->sendNotFoundForRestApi()) { return; } $this->assertPermission('director/audit'); $this->showOptionalBranchActivity(); $this->setAutorefreshInterval(10); $this->tabs(new InfraTabs($this->Auth()))->activate('activitylog'); $this->addTitle($this->translate('Activity Log')); $lastDeployedId = $this->db()->getLastDeploymentActivityLogId(); $table = new ActivityLogTable($this->db()); $table->setLastDeployedId($lastDeployedId); if ($idRangeEx = $this->url()->getParam('idRangeEx')) { $table->applyFilter(Filter::fromQueryString($idRangeEx)); } $filter = Filter::fromQueryString( $this->url()->without(['page', 'limit', 'q', 'idRangeEx'])->getQueryString() ); $table->applyFilter($filter); if ($this->url()->hasParam('author')) { $this->actions()->add(Link::create( $this->translate('All changes'), $this->url() ->without(['author', 'page']), null, ['class' => 'icon-users', 'data-base-target' => '_self'] )); } else { $this->actions()->add(Link::create( $this->translate('My changes'), $this->url() ->with('author', $this->Auth()->getUser()->getUsername()) ->without('page'), null, ['class' => 'icon-user', 'data-base-target' => '_self'] )); } if ($this->hasPermission(Permission::DEPLOY) && ! $this->getBranch()->isBranch()) { if ($this->db()->hasDeploymentEndpoint()) { $this->actions()->add(DeployConfigForm::load() ->setDb($this->db()) ->setApi($this->api()) ->handleRequest()); } if ( DirectorDeploymentLog::hasDeployments($this->db()) && (new DeploymentDashlet($this->db()))->lastDeploymentPending() ) { $this->actions()->prependHtml( Hint::warning($this->translate( 'There is an active deployment running, please wait until it is finished' . ' before creating a new deployment.' )) ); } } $table->renderTo($this); } /** * @throws IcingaException * @throws \Icinga\Exception\Http\HttpNotFoundException * @throws \Icinga\Exception\ProgrammingError */ public function activityAction() { if ($this->sendNotFoundForRestApi()) { return; } $this->assertPermission('director/showconfig'); $p = $this->params; $info = new ActivityLogInfo( $this->db(), $p->get('type'), $p->get('name') ); $info->setChecksum($p->get('checksum')) ->setId($p->get('id')); $this->tabs($info->getTabs($this->url())); $info->showTab($this->params->get('show')); $this->addTitle($info->getTitle()); $this->controls()->prepend($info->getPagination($this->url())); $this->content()->add($info); } /** * @throws \Icinga\Security\SecurityException */ public function settingsAction() { if ($this->sendNotFoundForRestApi()) { return; } $this->assertPermission('director/admin'); $this->addSingleTab($this->translate('Settings')) ->addTitle($this->translate('Global Director Settings')); $this->content()->add( SettingsForm::load() ->setSettings(new Settings($this->db())) ->handleRequest() ); } /** * Show all files for a given config * * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Security\SecurityException */ public function filesAction() { if ($this->sendNotFoundForRestApi()) { return; } $this->assertPermission('director/showconfig'); $config = IcingaConfig::load( hex2bin($this->params->getRequired('checksum')), $this->db() ); $deploymentId = $this->params->get('deployment_id'); $tabs = $this->tabs(); if ($deploymentId) { $tabs->add('deployment', [ 'label' => $this->translate('Deployment'), 'url' => 'director/deployment', 'urlParams' => ['id' => $deploymentId] ]); } $tabs->add('config', [ 'label' => $this->translate('Config'), 'url' => $this->url(), ])->activate('config'); $this->addTitle($this->translate('Generated config')); $this->content()->add(new DeployedConfigInfoHeader( $config, $this->db(), $this->api(), $this->getBranch(), $deploymentId )); GeneratedConfigFileTable::load($config, $this->db()) ->setActiveFilename($this->params->get('active_file')) ->setDeploymentId($deploymentId) ->renderTo($this); } /** * Show a single file * * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Security\SecurityException */ public function fileAction() { if ($this->sendNotFoundForRestApi()) { return; } $this->assertPermission('director/showconfig'); $filename = $this->params->getRequired('file_path'); $this->configTabs()->add('file', array( 'label' => $this->translate('Rendered file'), 'url' => $this->url(), ))->activate('file'); $params = $this->getConfigTabParams(); if ('deployment' === $this->params->get('backTo')) { $this->addBackLink('director/deployment', ['id' => $params['deployment_id']]); } else { $params['active_file'] = $filename; $this->addBackLink('director/config/files', $params); } $config = IcingaConfig::load(hex2bin($this->params->get('config_checksum')), $this->db()); $this->addTitle($this->translate('Config file "%s"'), $filename); $this->content()->add(new ShowConfigFile( $config->getFile($filename), $this->params->get('highlight'), $this->params->get('highlightSeverity') )); } /** * TODO: Check if this can be removed * * @throws \Icinga\Security\SecurityException */ public function storeAction() { $this->assertPermission('director/deploy'); try { $config = IcingaConfig::generate($this->db()); } catch (Exception $e) { Notification::error($e->getMessage()); $this->redirectNow('director/config/deployments'); } $this->redirectNow( Url::fromPath( 'director/config/files', array('checksum' => $config->getHexChecksum()) ) ); } /** * @throws \Icinga\Security\SecurityException */ public function diffAction() { if ($this->sendNotFoundForRestApi()) { return; } $this->assertPermission('director/showconfig'); $db = $this->db(); $this->addTitle($this->translate('Config diff')); $this->addSingleTab($this->translate('Config diff')); $leftSum = $this->params->get('left'); $rightSum = $this->params->get('right'); $configs = $db->enumDeployedConfigs(); foreach (array($leftSum, $rightSum) as $sum) { if ($sum && ! array_key_exists($sum, $configs)) { $configs[$sum] = substr($sum, 0, 7); } } $baseUrl = $this->url()->without(['left', 'right']); $this->content()->add( Html::tag('form', ['action' => (string) $baseUrl, 'method' => 'GET', 'class' => 'director-form'], [ new HtmlString($this->view->formSelect( 'left', $leftSum, ['class' => ['autosubmit', 'config-diff']], [null => $this->translate('- please choose -')] + $configs )), Link::create( Icon::create('flapping'), $baseUrl, ['left' => $rightSum, 'right' => $leftSum] ), new HtmlString($this->view->formSelect( 'right', $rightSum, ['class' => ['autosubmit', 'config-diff']], [null => $this->translate('- please choose -')] + $configs )), ]) ); if ($rightSum === null || $leftSum === null || ! strlen($rightSum) || ! strlen($leftSum)) { return; } ConfigFileDiffTable::load($leftSum, $rightSum, $this->db())->renderTo($this); } /** * @throws IcingaException * @throws \Icinga\Exception\MissingParameterException */ public function filediffAction() { if ($this->sendNotFoundForRestApi()) { return; } $this->assertPermission('director/showconfig'); $p = $this->params; $db = $this->db(); $leftSum = $p->getRequired('left'); $rightSum = $p->getRequired('right'); $filename = $p->getRequired('file_path'); $left = IcingaConfig::load(hex2bin($leftSum), $db); $right = IcingaConfig::load(hex2bin($rightSum), $db); $this ->addTitle($this->translate('Config file "%s"'), $filename) ->addSingleTab($this->translate('Diff')) ->content()->add(new SideBySideDiff(new PhpDiff( $left->getFile($filename), $right->getFile($filename) ))); } protected function showOptionalBranchActivity() { if ($this->url()->hasParam('idRangeEx')) { return; } $branch = $this->getBranch(); if ($branch->isBranch() && (int) $this->params->get('page', '1') === 1) { $table = new BranchActivityTable($branch->getUuid(), $this->db()); if (count($table) > 0) { $this->content()->add(Hint::info(Html::sprintf($this->translate( 'The following modifications are visible in this %s only...' ), Branch::requireHook()->linkToBranch( $branch, $this->Auth(), $this->translate('configuration branch') )))); $this->content()->add($table); $this->content()->add(Html::tag('br')); $this->content()->add(Hint::ok($this->translate( '...and the modifications below are already in the main branch:' ))); $this->content()->add(Html::tag('br')); } } } /** * @param $checksum */ protected function deploymentSucceeded($checksum) { if ($this->getRequest()->isApiRequest()) { $this->sendJson($this->getResponse(), (object) array('checksum' => $checksum)); return; } else { $url = Url::fromPath('director/config/deployments'); Notification::success( $this->translate('Config has been submitted, validation is going on') ); $this->redirectNow($url); } } /** * @param $checksum * @param null $error */ protected function deploymentFailed($checksum, $error = null) { $extra = $error ? ': ' . $error : ''; if ($this->getRequest()->isApiRequest()) { $this->sendJsonError($this->getResponse(), 'Config deployment failed' . $extra); return; } else { $url = Url::fromPath('director/config/files', array('checksum' => $checksum)); Notification::error( $this->translate('Config deployment failed') . $extra ); $this->redirectNow($url); } } /** * @return \gipfl\IcingaWeb2\Widget\Tabs */ protected function configTabs() { $tabs = $this->tabs(); if ( $this->hasPermission(Permission::DEPLOY) && $deploymentId = $this->params->get('deployment_id') ) { $tabs->add('deployment', [ 'label' => $this->translate('Deployment'), 'url' => 'director/deployment', 'urlParams' => ['id' => $deploymentId] ]); } if ($this->hasPermission(Permission::SHOW_CONFIG)) { $tabs->add('config', [ 'label' => $this->translate('Config'), 'url' => 'director/config/files', 'urlParams' => $this->getConfigTabParams() ]); } return $tabs; } protected function getConfigTabParams() { $params = [ 'checksum' => $this->params->get( 'config_checksum', $this->params->get('checksum') ) ]; if ($deploymentId = $this->params->get('deployment_id')) { $params['deployment_id'] = $deploymentId; } return $params; } } icingaweb2-module-director-1.11.8/application/controllers/CustomvarController.php000066400000000000000000000010641516513262500303300ustar00rootroot00000000000000params->getRequired('name'); $this->addSingleTab($this->translate('Custom Variable')) ->addTitle($this->translate('Custom Variable variants: %s'), $varName); CustomvarVariantsTable::create($this->db(), $varName)->renderTo($this); } } icingaweb2-module-director-1.11.8/application/controllers/DaemonController.php000066400000000000000000000046431516513262500275560ustar00rootroot00000000000000setAutorefreshInterval(10); $this->tabs(new MainTabs($this->Auth(), $this->getDbResourceName()))->activate('daemon'); $this->setTitle($this->translate('Director Background Daemon')); // Avoiding layout issues: $this->content()->add(Html::tag('h1', $this->translate('Director Background Daemon'))); // TODO: move dashboard titles into controls. Or figure out whether 2.7 "broke" this $error = null; try { $db = $this->db()->getDbAdapter(); $daemons = $db->fetchAll( $db->select()->from('director_daemon_info')->order('fqdn')->order('username')->order('pid') ); } catch (\Exception $e) { $daemons = []; $error = $e->getMessage(); } if (empty($daemons)) { $documentation = new Documentation(Icinga::app(), $this->Auth()); $message = Html::sprintf($this->translate( 'The Icinga Director Background Daemon is not running.' . ' Please check our %s in case you need step by step instructions' . ' showing you how to fix this.' ), $documentation->getModuleLink( $this->translate('documentation'), 'director', '75-Background-Daemon', $this->translate('Icinga Director Background Daemon') )); $this->content()->add(Hint::error([ $message, ($error ? [Html::tag('br'), Html::tag('strong', $error)] : null), ])); return; } try { foreach ($daemons as $daemon) { $info = new RunningDaemonInfo($daemon); $this->content()->add([new BackgroundDaemonDetails($info, $daemon) /*, $logWindow*/]); } } catch (\Exception $e) { $this->content()->add(Hint::error($e->getMessage())); } } } icingaweb2-module-director-1.11.8/application/controllers/DashboardController.php000066400000000000000000000045051516513262500302370ustar00rootroot00000000000000isMultiDbSetup()) { $form = new DbSelectorForm( $this->getResponse(), $this->Window(), $this->listAllowedDbResourceNames() ); $this->content()->add($form); $form->handleRequest($this->getServerRequest()); } } public function indexAction() { if ($this->getRequest()->isGet()) { $this->setAutorefreshInterval(10); } $mainDashboards = [ 'Objects', 'Alerts', 'Branches', 'Automation', 'Deployment', 'Director', 'Data', ]; $this->setTitle($this->translate('Icinga Director - Main Dashboard')); $names = $this->params->getValues('name', $mainDashboards); if (! $this->params->has('name')) { $this->addDbSelection(); } if (count($names) === 1) { $name = $names[0]; $dashboard = Dashboard::loadByName($name, $this->db()); $this->tabs($dashboard->getTabs())->activate($name); } else { $this->tabs(new MainTabs($this->Auth(), $this->getDbResourceName()))->activate('main'); } $cntDashboards = 0; foreach ($names as $name) { if ($name instanceof Dashboard) { $dashboard = $name; } else { $dashboard = Dashboard::loadByName($name, $this->db()); } if ($dashboard->isAvailable()) { $cntDashboards++; $this->content()->add($dashboard); } } if ($cntDashboards === 0) { $msg = $this->translate( 'No dashboard available, you might have not enough permissions' ); $this->content()->add($msg); } } } icingaweb2-module-director-1.11.8/application/controllers/DataController.php000066400000000000000000000324171516513262500272240ustar00rootroot00000000000000addTitle($this->translate('Data lists')); $this->actions()->add( Link::create($this->translate('Add'), 'director/data/list', null, [ 'class' => 'icon-plus', 'data-base-target' => '_next' ]) ); $this->tabs(new DataTabs())->activate('datalist'); (new DatalistTable($this->db()))->renderTo($this); } /** * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ public function listAction() { $form = DirectorDatalistForm::load() ->setSuccessUrl('director/data/lists') ->setDb($this->db()); if ($name = $this->params->get('name')) { $list = $this->requireList('name'); $form->setObject($list); $this->addListActions($list); $this->addTitle( $this->translate('Data List: %s'), $list->get('list_name') )->addListTabs($name, 'list'); } else { $this ->addTitle($this->translate('Add a new Data List')) ->addSingleTab($this->translate('Data List')); } $this->content()->add($form->handleRequest()); } public function fieldsAction() { $this->setAutorefreshInterval(10); $this->tabs(new DataTabs())->activate('datafield'); $this->addTitle($this->translate('Data Fields')); $this->actions()->add(Link::create( $this->translate('Add'), 'director/datafield/add', null, [ 'class' => 'icon-plus', 'data-base-target' => '_next', ] )); (new DatafieldTable($this->db()))->renderTo($this); } public function fieldcategoriesAction() { $this->setAutorefreshInterval(10); $this->tabs(new DataTabs())->activate('datafieldcategory'); $this->addTitle($this->translate('Data Field Categories')); $this->actions()->add(Link::create( $this->translate('Add'), 'director/datafieldcategory/add', null, [ 'class' => 'icon-plus', 'data-base-target' => '_next', ] )); (new DatafieldCategoryTable($this->db()))->renderTo($this); } public function varsAction() { $this->tabs(new DataTabs())->activate('customvars'); $this->addTitle($this->translate('Custom Vars - Overview')); (new CustomvarTable($this->db()))->renderTo($this); } /** * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ public function listentryAction() { $entryName = $this->params->get('entry_name'); $list = $this->requireList('list'); $this->addListActions($list); $listId = $list->get('id'); $listName = $list->get('list_name'); $title = $title = $this->translate('List Entries') . ': ' . $listName; $this->addTitle($title); $form = DirectorDatalistEntryForm::load() ->setSuccessUrl('director/data/listentry', ['list' => $listName]) ->setList($list); if (null !== $entryName) { $form->loadObject([ 'list_id' => $listId, 'entry_name' => $entryName ]); $this->actions()->add(Link::create( $this->translate('back'), 'director/data/listentry', ['list' => $listName], ['class' => 'icon-left-big'] )); } $form->handleRequest(); $this->addListTabs($listName, 'entries'); $table = new DatalistEntryTable($this->db()); $table->getAttributes()->set('data-base-target', '_self'); $table->setList($list); $this->content()->add([$form, $table]); } public function dictionaryAction() { $connection = $this->db(); $this->addSingleTab('Nested Dictionary'); $varName = $this->params->get('varname'); $instance = $this->url()->getParam('instance'); $action = $this->url()->getParam('action'); $object = $this->requireObject(); if ($instance || $action) { $this->actions()->add( Link::create($this->translate('Back'), $this->url()->without(['action', 'instance']), null, [ 'class' => 'icon-edit' ]) ); } else { $this->actions()->add( Link::create($this->translate('Add'), $this->url(), [ 'action' => 'add' ], [ 'class' => 'icon-edit' ]) ); } $subjects = $this->prepareSubjectsLabel($object, $varName); $fieldLoader = new IcingaObjectFieldLoader($object); $instances = $this->getCurrentInstances($object, $varName); if (empty($instances)) { $this->content()->add(Hint::info(sprintf( $this->translate('No %s have been created yet'), $subjects ))); } else { $this->content()->add($this->prepareInstancesTable($instances)); } $field = $this->getFieldByName($fieldLoader, $varName); $template = $object::load([ 'object_name' => $field->getSetting('template_name') ], $connection); $form = new IcingaServiceDictionaryMemberForm(); $form->setDb($connection); if ($instance) { $instanceObject = $object::create([ 'imports' => [$template], 'object_name' => $instance, 'vars' => $instances[$instance] ], $connection); $form->setObject($instanceObject); } elseif ($action === 'add') { $form->presetImports([$template->getObjectName()]); } else { return; } if ($instance) { if (! isset($instances[$instance])) { throw new NotFoundError("There is no such instance: $instance"); } $subTitle = sprintf($this->translate('Modify instance: %s'), $instance); } else { $subTitle = $this->translate('Add a new instance'); } $this->content()->add(Html::tag('h2', ['class' => 'dictionary-header'], $subTitle)); $form->handleRequest($this->getRequest()); $this->content()->add($form); if ($form->succeeded()) { $virtualObject = $form->getObject(); $name = $virtualObject->getObjectName(); $params = $form->getObject()->getVars(); $instances[$name] = $params; if ($name !== $instance) { // Has been renamed unset($instances[$instance]); } ksort($instances); $object->set("vars.$varName", (object)$instances); $object->store(); $this->redirectNow($this->url()->without(['instance', 'action'])); } elseif ($form->shouldBeDeleted()) { unset($instances[$instance]); if (empty($instances)) { $object->set("vars.$varName", null)->store(); } else { $object->set("vars.$varName", (object)$instances)->store(); } $this->redirectNow($this->url()->without(['instance', 'action'])); } } protected function requireObject() { $connection = $this->db(); $hostName = $this->params->getRequired('host'); $serviceName = $this->params->get('service'); if ($serviceName) { $host = IcingaHost::load($hostName, $connection); $object = IcingaService::load([ 'host_id' => $host->get('id'), 'object_name' => $serviceName, ], $connection); } else { $object = IcingaHost::load($hostName, $connection); } if (! $object->isObject()) { throw new InvalidArgumentException(sprintf( 'Only single objects allowed, %s is a %s', $object->getObjectName(), $object->get('object_type') )); } return $object; } protected function shorten($string, $maxLen) { if (strlen($string) <= $maxLen) { return $string; } return substr($string, 0, $maxLen) . '...'; } protected function getFieldByName(IcingaObjectFieldLoader $loader, $name) { foreach ($loader->getFields() as $field) { if ($field->get('varname') === $name) { return $field; } } throw new InvalidArgumentException("Found no configured field for '$name'"); } /** * @param IcingaObject $object * @param $varName * @return array */ protected function getCurrentInstances(IcingaObject $object, $varName) { $currentVars = $object->getVars(); if (isset($currentVars->$varName)) { $currentValue = $currentVars->$varName; } else { $currentValue = (object)[]; } if (is_object($currentValue)) { $currentValue = (array)$currentValue; } else { throw new InvalidArgumentException(sprintf( '"%s" is not a valid Dictionary', json_encode($currentValue) )); } return $currentValue; } /** * @param array $currentValue * @param $subjects * @return Hint|Table */ protected function prepareInstancesTable(array $currentValue) { $table = new Table(); $table->addAttributes([ 'class' => 'common-table table-row-selectable' ]); $table->getHeader()->add( Table::row([ $this->translate('Key / Instance'), $this->translate('Properties') ], ['class' => 'text-align-left'], 'th') ); foreach ($currentValue as $key => $item) { $table->add(Table::row([ Link::create($key, $this->url()->with('instance', $key)), str_replace("\n", ' ', $this->shorten(PlainObjectRenderer::render($item), 512)) ])); } return $table; } /** * @param IcingaObject $object * @param $varName * @return string */ protected function prepareSubjectsLabel(IcingaObject $object, $varName) { if ($object instanceof IcingaService) { $hostName = $object->get('host'); $subjects = $object->getObjectName() . " ($varName)"; } else { $hostName = $object->getObjectName(); $subjects = sprintf( $this->translate('%s instances'), $varName ); } $this->addTitle(sprintf( $this->translate('%s on %s'), $subjects, $hostName )); return $subjects; } protected function addListActions(DirectorDatalist $list) { $this->actions()->add( Link::create( $this->translate('Add to Basket'), 'director/basket/add', [ 'type' => 'DataList', 'names' => $list->getUniqueIdentifier() ], ['class' => 'icon-tag'] ) ); } /** * @param $paramName * @return DirectorDatalist * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ protected function requireList($paramName) { return DirectorDatalist::load($this->params->getRequired($paramName), $this->db()); } protected function addListTabs($name, $activate) { $this->tabs()->add('list', [ 'url' => 'director/data/list', 'urlParams' => ['name' => $name], 'label' => $this->translate('Edit list'), ])->add('entries', [ 'url' => 'director/data/listentry', 'urlParams' => ['list' => $name], 'label' => $this->translate('List entries'), ])->activate($activate); return $this; } } icingaweb2-module-director-1.11.8/application/controllers/DatafieldController.php000066400000000000000000000020031516513262500302140ustar00rootroot00000000000000indexAction(); } public function editAction() { $this->indexAction(); } public function indexAction() { $form = DirectorDatafieldForm::load() ->setDb($this->db()); if ($id = $this->params->get('id')) { $form->loadObject((int) $id); $this->addTitle( $this->translate('Modify %s'), $form->getObject()->varname ); $this->addSingleTab($this->translate('Edit a Field')); } else { $this->addTitle($this->translate('Add a new Data Field')); $this->addSingleTab($this->translate('New Field')); } $form->handleRequest(); $this->content()->add($form); } } icingaweb2-module-director-1.11.8/application/controllers/DatafieldcategoryController.php000066400000000000000000000022021516513262500317530ustar00rootroot00000000000000indexAction(); } public function editAction() { $this->indexAction(); } public function indexAction() { $edit = false; if ($name = $this->params->get('name')) { $edit = true; } $form = DirectorDatafieldCategoryForm::load() ->setDb($this->db()); if ($edit) { $form->loadObject($name); $this->addTitle( $this->translate('Modify %s'), $form->getObject()->category_name ); $this->addSingleTab($this->translate('Edit a Category')); } else { $this->addTitle($this->translate('Add a new Data Field Category')); $this->addSingleTab($this->translate('New Category')); } $form->handleRequest(); $this->content()->add($form); } } icingaweb2-module-director-1.11.8/application/controllers/DependenciesController.php000066400000000000000000000005111516513262500307270ustar00rootroot00000000000000tabs()->remove('index'); return $res; } } icingaweb2-module-director-1.11.8/application/controllers/DependencyController.php000066400000000000000000000031741516513262500304270ustar00rootroot00000000000000params->get('apply')) { $this->apply = IcingaDependency::load( array('object_name' => $apply, 'object_type' => 'template'), $this->db() ); } } /** * @return \Icinga\Module\Director\Objects\IcingaObject * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\InvalidPropertyException * @throws \Icinga\Exception\NotFoundError */ protected function loadObject() { if ($this->object === null) { if ($name = $this->params->get('name')) { $params = array('object_name' => $name); $db = $this->db(); $this->object = IcingaDependency::load($params, $db); } else { parent::loadObject(); } } return $this->object; } /** * Hint: this is never being called. Why? * * @param $form */ protected function beforeHandlingAddRequest($form) { /** @var IcingaDependencyForm $form */ if ($this->apply) { $form->createApplyRuleFor($this->apply); } } } icingaweb2-module-director-1.11.8/application/controllers/DependencytemplateController.php000066400000000000000000000006321516513262500321570ustar00rootroot00000000000000 $this->params->get('name') ], $this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/DeploymentController.php000066400000000000000000000014471516513262500304720ustar00rootroot00000000000000assertPermission('director/deploy'); } public function indexAction() { $info = new DeploymentInfo(DirectorDeploymentLog::load( $this->params->get('id'), $this->db() )); $this->addTitle($this->translate('Deployment details')); $this->tabs( $info->getTabs($this->getAuth(), $this->getRequest()) )->activate('deployment'); $this->content()->add($info); } } icingaweb2-module-director-1.11.8/application/controllers/EndpointController.php000066400000000000000000000002511516513262500301220ustar00rootroot00000000000000setAutorefreshInterval(10); $this->tabs(new MainTabs($this->Auth(), $this->getDbResourceName()))->activate('health'); $this->setTitle($this->translate('Director Health')); $health = new Health(); $health->setDbResourceName($this->getDbResourceName()); $output = new HealthCheckPluginOutput($health); $this->content()->add($output); $this->content()->add([ Html::tag('h1', ['class' => 'icon-pin'], $this->translate('Hint: Check Plugin')), Html::tag('p', $this->translate( 'Did you know that you can run this entire Health Check' . ' (or just some sections) as an Icinga Check on a regular' . ' base?' )) ]); } } icingaweb2-module-director-1.11.8/application/controllers/HostController.php000066400000000000000000000536761516513262500273020ustar00rootroot00000000000000getHostObject(); $auth = $this->Auth(); $backend = $this->backend(); if ( $this->isServiceAction() && $backend->canModifyService($host->getObjectName(), $this->getParam('service')) ) { return; } if ($this->isServicesReadOnlyAction() && $auth->hasPermission($this->getServicesReadOnlyPermission())) { return; } if ($auth->hasPermission(Permission::HOSTS)) { // faster return; } if ($backend->canModifyHost($host->getObjectName())) { return; } $this->assertPermission(Permission::HOSTS); // complain about default hosts permission } protected function isServicesReadOnlyAction() { return in_array($this->getRequest()->getActionName(), [ 'servicesro', 'findservice', 'invalidservice', ]); } protected function isServiceAction() { return in_array($this->getRequest()->getActionName(), [ 'servicesro', 'findservice', 'invalidservice', 'servicesetservice', 'appliedservice', 'inheritedservice', ]); } /** * @return HostgroupRestriction */ protected function getHostgroupRestriction() { return new HostgroupRestriction($this->db(), $this->Auth()); } public function editAction() { parent::editAction(); $this->addOptionalMonitoringLink(); } public function serviceAction() { $host = $this->getHostObject(); $this->addServicesHeader(); $this->addTitle($this->translate('Add Service to %s'), $host->getObjectName()); $this->content()->add( IcingaAddServiceForm::load() ->setBranch($this->getBranch()) ->setHost($host) ->setDb($this->db()) ->handleRequest() ); } public function servicesetAction() { $host = $this->getHostObject(); $this->addServicesHeader(); $this->addTitle($this->translate('Add Service Set to %s'), $host->getObjectName()); $this->content()->add( IcingaServiceSetForm::load() ->setBranch($this->getBranch()) ->setHost($host) ->setDb($this->db()) ->handleRequest() ); } protected function addServicesHeader() { $host = $this->getHostObject(); $hostname = $host->getObjectName(); $this->tabs()->activate('services'); $this->actions()->add(Link::create( $this->translate('Add service'), 'director/host/service', ['name' => $hostname], ['class' => 'icon-plus'] ))->add(Link::create( $this->translate('Add service set'), 'director/host/serviceset', ['name' => $hostname], ['class' => 'icon-plus'] )); } public function findserviceAction() { $auth = $this->Auth(); $host = $this->getHostObject(); $hostName = $host->getObjectName(); $serviceName = $this->params->get('service'); $info = ServiceFinder::find($host, $serviceName); $backend = $this->backend(); if ($info && $auth->hasPermission(Permission::SERVICES)) { $redirectUrl = $info->getUrl(); } elseif ( $info && (($backend instanceof Monitoring && $auth->hasPermission(Permission::MONITORING_SERVICES)) || ($backend instanceof IcingadbBackend && $auth->hasPermission(Permission::ICINGADB_SERVICES)) ) && $backend->canModifyService($hostName, $serviceName) ) { $redirectUrl = $info->getUrl(); } elseif ($auth->hasPermission($this->getServicesReadOnlyPermission())) { $redirectUrl = Url::fromPath('director/host/servicesro', [ 'name' => $hostName, 'service' => $serviceName ]); } else { $redirectUrl = Url::fromPath('director/host/invalidservice', [ 'name' => $hostName, 'service' => $serviceName, ]); } $this->redirectNow($redirectUrl); } /** * @throws \Icinga\Exception\NotFoundError */ public function invalidserviceAction() { if (! $this->showInfoForNonDirectorService()) { $this->content()->add(Hint::error(sprintf( $this->translate('No such service: %s'), $this->params->get('service') ))); } $this->servicesAction(); } protected function showInfoForNonDirectorService() { try { $api = $this->getApiIfAvailable(); if ($api) { $name = $this->params->get('name') . '!' . $this->params->get('service'); $info = $api->getObject($name, 'Services'); if (isset($info->attrs->source_location)) { $source = $info->attrs->source_location; $this->content()->add(Hint::info(Html::sprintf( 'The configuration for this object has not been rendered by' . ' Icinga Director. You can find it on line %s in %s.', Html::tag('strong', null, $source->first_line), Html::tag('strong', null, $source->path) ))); } } return true; } catch (Exception $e) { return false; } } /** * @throws \Icinga\Exception\NotFoundError */ public function servicesAction() { if (! $this->hasPermission(Permission::SERVICES)) { if ($this->isServicesReadOnlyAction() && $this->hasPermission($this->getServicesReadOnlyPermission())) { $this->servicesroAction(); } return; } $this->addServicesHeader(); $host = $this->getHostObject(); $this->addTitle($this->translate('Services: %s'), $host->getObjectName()); $branch = $this->getBranch(); $hostHasBeenCreatedInBranch = $branch->isBranch() && $host->get('id'); $content = $this->content(); $table = (new ObjectsTableService($this->db(), $this->Auth())) ->setHost($host) ->setBranch($branch) ->setTitle($this->translate('Individual Service objects')) ->removeQueryLimit(); if (count($table)) { $content->add($table); } /** @var IcingaHost[] $parents */ $parents = IcingaTemplateRepository::instanceByObject($this->object) ->getTemplatesFor($this->object, true); foreach ($parents as $parent) { $table = (new ObjectsTableService($this->db(), $this->Auth())) ->setBranch($branch) ->setHost($parent) ->setInheritedBy($host) ->removeQueryLimit(); if (count($table)) { $content->add( $table->setTitle(sprintf( $this->translate('Inherited from %s'), $parent->getObjectName() )) ); } } if (! $hostHasBeenCreatedInBranch) { $this->addHostServiceSetTables($host); } foreach ($parents as $parent) { $this->addHostServiceSetTables($parent, $host); } $appliedSets = AppliedServiceSetLoader::fetchForHost($host); foreach ($appliedSets as $set) { $title = sprintf($this->translate('%s (Applied Service set)'), $set->getObjectName()); $content->add( IcingaServiceSetServiceTable::load($set) // ->setHost($host) ->setBranch($branch) ->setAffectedHost($host) ->setTitle($title) ->removeQueryLimit() ); } $table = IcingaHostAppliedServicesTable::load($host) ->setTitle($this->translate('Applied services')); if (count($table)) { $content->add($table); } } /** * Hint: this duplicates quite some logic from servicesAction. We might want * to clean this up, but as soon as we store fully resolved Services this * will be obsolete anyways * * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Security\SecurityException * @throws \Icinga\Exception\MissingParameterException */ public function servicesroAction() { $this->assertPermission($this->getServicesReadOnlyPermission()); $host = $this->getHostObject(); $service = $this->params->getRequired('service'); $db = $this->db(); $branch = $this->getBranch(); $this->controls()->setTabs(new Tabs()); $this->addSingleTab($this->translate('Configuration (read-only)')); $this->addTitle($this->translate('Services on %s'), $host->getObjectName()); $content = $this->content(); $table = (new ObjectsTableService($db, $this->Auth())) ->setHost($host) ->setBranch($branch) ->setReadonly() ->highlightService($service) ->setTitle($this->translate('Individual Service objects')); if (count($table)) { $content->add($table); } /** @var IcingaHost[] $parents */ $parents = IcingaTemplateRepository::instanceByObject($this->object) ->getTemplatesFor($this->object, true); foreach ($parents as $parent) { $table = (new ObjectsTableService($db, $this->Auth())) ->setReadonly() ->setBranch($branch) ->setHost($parent) ->highlightService($service) ->setInheritedBy($host); if (count($table)) { $content->add( $table->setTitle(sprintf( 'Inherited from %s', $parent->getObjectName() )) ); } } $this->addHostServiceSetTables($host); foreach ($parents as $parent) { $this->addHostServiceSetTables($parent, $host, $service); } $appliedSets = AppliedServiceSetLoader::fetchForHost($host); foreach ($appliedSets as $set) { $title = sprintf($this->translate('%s (Applied Service set)'), $set->getObjectName()); $content->add( IcingaServiceSetServiceTable::load($set) // ->setHost($host) ->setBranch($branch) ->setAffectedHost($host) ->setReadonly() ->highlightService($service) ->setTitle($title) ); } $table = IcingaHostAppliedServicesTable::load($host) ->setReadonly() ->highlightService($service) ->setTitle($this->translate('Applied services')); if (count($table)) { $content->add($table); } } /** * @param IcingaHost $host * @param IcingaHost|null $affectedHost */ protected function addHostServiceSetTables(IcingaHost $host, IcingaHost $affectedHost = null, $roService = null) { $db = $this->db(); if ($affectedHost === null) { $affectedHost = $host; } if ($host->get('id') === null) { return; } $query = $db->getDbAdapter()->select() ->from( array('ss' => 'icinga_service_set'), 'ss.*' )->join( array('hsi' => 'icinga_service_set_inheritance'), 'hsi.parent_service_set_id = ss.id', array() )->join( array('hs' => 'icinga_service_set'), 'hs.id = hsi.service_set_id', array() )->where('hs.host_id = ?', $host->get('id')); $sets = IcingaServiceSet::loadAll($db, $query, 'object_name'); /** @var IcingaServiceSet $set*/ foreach ($sets as $name => $set) { $title = sprintf($this->translate('%s (Service set)'), $name); $table = IcingaServiceSetServiceTable::load($set) ->setHost($host) ->setBranch($this->getBranch()) ->setAffectedHost($affectedHost) ->removeQueryLimit() ->setTitle($title); if ($roService) { $table->setReadonly()->highlightService($roService); } $this->content()->add($table); } } /** * @throws \Icinga\Exception\NotFoundError */ public function appliedserviceAction() { $db = $this->db(); $host = $this->getHostObject(); $serviceId = $this->params->get('service_id'); $parent = IcingaService::loadWithAutoIncId($serviceId, $db); $serviceName = $parent->getObjectName(); $service = IcingaService::create([ 'imports' => $parent, 'object_type' => 'apply', 'object_name' => $serviceName, 'host_id' => $host->get('id'), 'vars' => $host->getOverriddenServiceVars($serviceName), ], $db); $this->addTitle( $this->translate('Applied service: %s'), $serviceName ); $this->content()->add( IcingaServiceForm::load() ->setDb($db) ->setBranch($this->getBranch()) ->setHost($host) ->setApplyGenerated($parent) ->setObject($service) ->handleRequest() ); $this->commonForServices(); } /** * @throws \Icinga\Exception\NotFoundError */ public function inheritedserviceAction() { $db = $this->db(); $host = $this->getHostObject(); $serviceName = $this->params->get('service'); $from = IcingaHost::load($this->params->get('inheritedFrom'), $this->db()); $parent = IcingaService::load([ 'object_name' => $serviceName, 'host_id' => $from->get('id') ], $this->db()); // TODO: we want to eventually show the host template name, doesn't work // as template resolution would break. // $parent->object_name = $from->object_name; $service = IcingaService::create([ 'object_type' => 'apply', 'object_name' => $serviceName, 'host_id' => $host->get('id'), 'imports' => [$parent], 'vars' => $host->getOverriddenServiceVars($serviceName), ], $db); $this->addTitle($this->translate('Inherited service: %s'), $serviceName); $form = IcingaServiceForm::load() ->setDb($db) ->setBranch($this->getBranch()) ->setHost($host) ->setInheritedFrom($from->getObjectName()) ->setObject($service) ->handleRequest(); $this->content()->add($form); $this->commonForServices(); } /** * @throws \Icinga\Exception\NotFoundError */ public function removesetAction() { // TODO: clean this up, use POST $db = $this->db()->getDbAdapter(); $query = $db->select()->from( array('ss' => 'icinga_service_set'), array('id' => 'ss.id') )->join( array('si' => 'icinga_service_set_inheritance'), 'si.service_set_id = ss.id', array() )->where( 'si.parent_service_set_id = ?', $this->params->get('setId') )->where('ss.host_id = ?', $this->object->get('id')); IcingaServiceSet::loadWithAutoIncId($db->fetchOne($query), $this->db())->delete(); $this->redirectNow( Url::fromPath('director/host/services', array( 'name' => $this->object->getObjectName() )) ); } /** * @throws \Icinga\Exception\NotFoundError */ public function servicesetserviceAction() { $db = $this->db(); $host = $this->getHostObject(); $serviceName = $this->params->get('service'); $setParams = [ 'object_name' => $this->params->get('set'), 'host_id' => $host->get('id') ]; $setTemplate = IcingaServiceSet::load($this->params->get('set'), $db); if (IcingaServiceSet::exists($setParams, $db)) { $set = IcingaServiceSet::load($setParams, $db); } else { $set = $setTemplate; } $service = IcingaService::load([ 'object_name' => $serviceName, 'service_set_id' => $setTemplate->get('id') ], $this->db()); $service = IcingaService::create([ 'id' => $service->get('id'), 'object_type' => 'apply', 'object_name' => $serviceName, 'host_id' => $host->get('id'), 'imports' => $service->listImportNames(), 'vars' => $host->getOverriddenServiceVars($serviceName), ], $db); // $set->copyVarsToService($service); $this->addTitle( $this->translate('%s on %s (from set: %s)'), $serviceName, $host->getObjectName(), $set->getObjectName() ); $form = IcingaServiceForm::load() ->setDb($db) ->setBranch($this->getBranch()) ->setHost($host) ->setServiceSet($set) ->setObject($service) ->handleRequest(); $this->tabs()->activate('services'); $this->content()->add($form); $this->commonForServices(); } protected function commonForServices() { $host = $this->object; $this->actions()->add(Link::create( $this->translate('back'), 'director/host/services', ['name' => $host->getObjectName()], ['class' => 'icon-left-big'] )); $this->tabs()->activate('services'); } /** * @throws \Icinga\Exception\NotFoundError */ public function agentAction() { $selfService = new SelfService($this->getHostObject(), $this->api()); if ($os = $this->params->get('download')) { $selfService->handleLegacyAgentDownloads($os); return; } $selfService->renderTo($this); $this->tabs()->activate('agent'); } protected function addOptionalMonitoringLink() { $host = $this->object; try { $backend = $this->backend(); if ( $host instanceof IcingaHost && $host->isObject() && $backend->hasHost($host->getObjectName()) ) { $this->actions()->add( Link::create( $this->translate('Show'), $backend->getHostUrl($host->getObjectName()), null, ['class' => 'icon-globe critical', 'data-base-target' => '_next'] ) ); // Intentionally placed here, show it only for deployed Hosts $this->addOptionalInspectLink(); } } catch (Exception $e) { // Silently ignore errors in the monitoring module } } protected function addOptionalInspectLink() { if (! $this->hasPermission(Permission::INSPECT)) { return; } $this->actions()->add(Link::create( $this->translate('Inspect'), 'director/inspect/object', [ 'type' => 'host', 'plural' => 'hosts', 'name' => $this->object->getObjectName() ], [ 'class' => 'icon-zoom-in', 'data-base-target' => '_next' ] )); } /** * @return ?IcingaHost */ protected function getHostObject() { if ($this->object !== null) { assert($this->object instanceof IcingaHost); } return $this->object; } /** * Get readOnly permission of the service for the current backend * * @return string permission */ protected function getServicesReadOnlyPermission(): string { return $this->backend() instanceof IcingadbBackend ? Permission::ICINGADB_SERVICES_RO : Permission::MONITORING_SERVICES_RO; } } icingaweb2-module-director-1.11.8/application/controllers/HostgroupController.php000066400000000000000000000002521516513262500303350ustar00rootroot00000000000000assertPermission('director/hosts'); } public function editAction() { $url = clone($this->getRequest()->getUrl()); $url->setPath('director/hosts/addservice'); $urlSet = clone($url); $urlSet->setPath('director/hosts/addserviceset'); parent::editAction(); $this->actions()->add(Link::create( $this->translate('Add Service'), $url, null, ['class' => 'icon-plus'] ))->add(Link::create( $this->translate('Add Service Set'), $urlSet, null, ['class' => 'icon-plus'] )); } public function edittemplatesAction() { parent::editAction(); $objects = $this->loadMultiObjectsFromParams(); $names = []; /** @var ExportInterface $object */ foreach ($objects as $object) { $names[] = $object->getUniqueIdentifier(); } $url = Url::fromPath('director/basket/add', [ 'type' => 'HostTemplate', ]); $url->getParams()->addValues('names', $names); $this->actions()->add(Link::create( $this->translate('Add to Basket'), $url, null, ['class' => 'icon-tag'] )); } public function addserviceAction() { $this->addSingleTab($this->translate('Add Service')); $filter = Filter::fromQueryString($this->params->toString()); $objects = array(); $db = $this->db(); /** @var $filter FilterChain */ foreach ($filter->filters() as $sub) { /** @var $sub FilterChain */ foreach ($sub->filters() as $ex) { /** @var $ex FilterChain|FilterExpression */ if ($ex->isExpression() && $ex->getColumn() === 'name') { $name = $ex->getExpression(); $objects[$name] = IcingaHost::load($name, $db); } } } $this->addTitle( $this->translate('Add service to %d hosts'), count($objects) ); $this->content()->add( IcingaAddServiceForm::load() ->setHosts($objects) ->setDb($this->db()) ->handleRequest() ); } public function addservicesetAction() { $this->addSingleTab($this->translate('Add Service Set')); $filter = Filter::fromQueryString($this->params->toString()); $objects = array(); $db = $this->db(); /** @var $filter FilterChain */ foreach ($filter->filters() as $sub) { /** @var $sub FilterChain */ foreach ($sub->filters() as $ex) { /** @var $ex FilterChain|FilterExpression */ if ($ex->isExpression() && $ex->getColumn() === 'name') { $name = $ex->getExpression(); $objects[$name] = IcingaHost::load($name, $db); } } } $this->addTitle( $this->translate('Add Service Set to %d hosts'), count($objects) ); $this->content()->add( IcingaAddServiceSetForm::load() ->setHosts($objects) ->setDb($this->db()) ->handleRequest() ); } } icingaweb2-module-director-1.11.8/application/controllers/HosttemplateController.php000066400000000000000000000006101516513262500310120ustar00rootroot00000000000000 $this->params->get('name') ], $this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/ImportrunController.php000066400000000000000000000013761516513262500303520ustar00rootroot00000000000000params->getRequired('id'), $this->db()); $this->addTitle($this->translate('Import run')); $this->addSingleTab($this->translate('Import run')); $table = ImportedrowsTable::load($importRun); if ($chosen = $this->params->get('chosenColumns')) { $table->setColumns(preg_split('/,/', $chosen, -1, PREG_SPLIT_NO_EMPTY)); } $table->renderTo($this); } } icingaweb2-module-director-1.11.8/application/controllers/ImportsourceController.php000066400000000000000000000274061516513262500310500ustar00rootroot00000000000000params->get('source_id', $this->params->get('id')); if ($id !== null && is_numeric($id)) { $this->id = (int) $id; } $tabs = $this->tabs(new ImportsourceTabs($this->id)); $action = $this->getRequest()->getActionName(); if ($tabs->has($action)) { $tabs->activate($action); } } /** * @throws \Icinga\Exception\NotFoundError */ protected function addMainActions() { $this->actions(new AutomationObjectActionBar( $this->getRequest() )); $source = $this->getImportSource(); $this->actions()->add(Link::create( $this->translate('Add to Basket'), 'director/basket/add', [ 'type' => 'ImportSource', 'names' => $source->getUniqueIdentifier() ], [ 'class' => 'icon-tag', 'data-base-target' => '_next' ] )); } /** * @throws \Icinga\Exception\NotFoundError */ public function indexAction() { $this->addMainActions(); $source = $this->getImportSource(); if ($this->params->get('format') === 'json') { $this->sendJson($this->getResponse(), (new Exporter($this->db()))->export($source)); return; } $this->addTitle( $this->translate('Import source: %s'), $source->get('source_name') )->setAutorefreshInterval(10); $branch = $this->getBranch(); if ($this->getBranch()->isBranch()) { $this->content()->add(Hint::info(Html::sprintf($this->translate( 'Please note that importing data will take place in your main Branch.' . ' Modifications to Import Sources are not allowed while being in a Configuration Branch.' . ' To get the full functionality, please deactivate %s' ), Branch::requireHook()->linkToBranch($branch, $this->getAuth(), $branch->getName())))); } $this->content()->add(new ImportSourceDetails($source)); } public function addAction() { $this->addTitle($this->translate('Add import source')); if ($this->showNotInBranch($this->translate('Creating Import Sources'))) { return; } $this->content()->add( ImportSourceForm::load()->setDb($this->db()) ->setSuccessUrl('director/importsources') ->handleRequest() ); } /** * @throws \Icinga\Exception\NotFoundError */ public function editAction() { $this->addMainActions(); $this->activateTabWithPostfix($this->translate('Modify')); if ($this->showNotInBranch($this->translate('Modifying Import Sources'))) { return; } $form = ImportSourceForm::load() ->setObject($this->getImportSource()) ->setListUrl('director/importsources') ->handleRequest(); $this->addTitle( $this->translate('Import source: %s'), $form->getObject()->get('source_name') )->setAutorefreshInterval(10); $this->content()->add($form); } /** * @throws \Icinga\Exception\NotFoundError */ public function cloneAction() { $this->addMainActions(); $this->activateTabWithPostfix($this->translate('Clone')); if ($this->showNotInBranch($this->translate('Cloning Import Sources'))) { return; } $source = $this->getImportSource(); $this->addTitle('Clone: %s', $source->get('source_name')); $form = new CloneImportSourceForm($source); $this->content()->add($form); $form->on(CloneImportSourceForm::ON_SUCCESS, function (CloneImportSourceForm $form) { $this->getResponse()->redirectAndExit($form->getSuccessUrl()); }); $form->handleRequest($this->getServerRequest()); } /** * @throws \Icinga\Exception\NotFoundError */ public function previewAction() { $source = $this->getImportSource(); $this->addTitle( $this->translate('Import source preview: %s'), $source->get('source_name') ); $fetchUrl = clone($this->url()); $this->actions()->add(Link::create( $this->translate('Download JSON'), $fetchUrl->setPath('director/importsource/fetch'), null, [ 'target' => '_blank', 'class' => 'icon-download', ] )); try { (new ImportsourceHookTable())->setImportSource($source)->renderTo($this); } catch (Exception $e) { $this->content()->add(Error::show($e)); } } /** * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function fetchAction() { $response = $this->getResponse(); try { $source = $this->getImportSource(); $source->checkForChanges(); $hook = ImportSourceHook::forImportSource($source); $data = $hook->fetchData(); $source->applyModifiers($data); $filename = sprintf( "director-importsource-%d_%s.json", $this->getParam('id'), date('YmdHis') ); $response->setHeader('Content-Type', 'application/json', true); $response->setHeader('Content-disposition', "attachment; filename=$filename", true); $response->sendHeaders(); $this->sendJson($this->getResponse(), $data); } catch (Exception $e) { $this->sendJsonError($response, $e->getMessage()); } // TODO: this is not clean if (\ob_get_level()) { \ob_end_flush(); } exit; } /** * @return ImportSource * @throws \Icinga\Exception\NotFoundError */ protected function requireImportSourceAndAddModifierTable() { $source = $this->getImportSource(); $table = PropertymodifierTable::load($source, $this->url()); if ($this->getBranch()->isBranch()) { $table->setReadOnly(); } else { $table->handleSortPriorityActions($this->getRequest(), $this->getResponse()); } $table->renderTo($this); return $source; } /** * @throws \Icinga\Exception\NotFoundError */ public function modifierAction() { $source = $this->requireImportSourceAndAddModifierTable(); $this->addTitle($this->translate('Property modifiers: %s'), $source->get('source_name')); $this->addAddLink( $this->translate('Add property modifier'), 'director/importsource/addmodifier', ['source_id' => $source->get('id')], '_self' ); } /** * @throws \Icinga\Exception\NotFoundError */ public function historyAction() { $source = $this->getImportSource(); $this->addTitle($this->translate('Import run history: %s'), $source->get('source_name')); // TODO: temporarily disabled, find a better place for stats: // $this->view->stats = $this->db()->fetchImportStatistics(); ImportrunTable::load($source)->renderTo($this); } /** * @throws \Icinga\Exception\NotFoundError */ public function addmodifierAction() { $source = $this->requireImportSourceAndAddModifierTable(); $this->addTitle( $this->translate('%s: add Property Modifier'), $source->get('source_name') )->addBackToModifiersLink($source); $this->tabs()->activate('modifier'); if ($this->showNotInBranch($this->translate('Modifying Import Sources'))) { return; } $this->content()->prepend( ImportRowModifierForm::load()->setDb($this->db()) ->setSource($source) ->setSuccessUrl( 'director/importsource/modifier', ['source_id' => $source->get('id')] )->handleRequest() ); } /** * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ public function editmodifierAction() { // We need to load the table AFTER adding the title, otherwise search // will not be placed next to the title $source = $this->getImportSource(); $this->addTitle( $this->translate('%s: Property Modifier'), $source->get('source_name') )->addBackToModifiersLink($source); $source = $this->requireImportSourceAndAddModifierTable(); $this->tabs()->activate('modifier'); if ($this->showNotInBranch($this->translate('Modifying Import Sources'))) { return; } $listUrl = 'director/importsource/modifier?source_id=' . (int) $source->get('id'); $this->content()->prepend( ImportRowModifierForm::load()->setDb($this->db()) ->loadObject((int) $this->params->getRequired('id')) ->setListUrl($listUrl) ->setSource($source) ->handleRequest() ); } /** * @return ImportSource * @throws \Icinga\Exception\NotFoundError */ protected function getImportSource() { if ($this->importSource === null) { if ($this->id === null) { throw new InvalidArgumentException('Got no ImportSource id'); } $this->importSource = ImportSource::loadWithAutoIncId( $this->id, $this->db() ); } return $this->importSource; } protected function activateTabWithPostfix($title) { /** @var ImportsourceTabs $tabs */ $tabs = $this->tabs(); $tabs->activateMainWithPostfix($title); return $this; } /** * @param ImportSource $source * @return $this */ protected function addBackToModifiersLink(ImportSource $source) { $this->actions()->add( Link::create( $this->translate('back'), 'director/importsource/modifier', ['source_id' => $source->get('id')], ['class' => 'icon-left-big'] ) ); return $this; } } icingaweb2-module-director-1.11.8/application/controllers/ImportsourcesController.php000066400000000000000000000032031516513262500312200ustar00rootroot00000000000000getRequest()->isApiRequest()) { switch (strtolower($this->getRequest()->getMethod())) { case 'get': $this->sendExport(); break; case 'post': $this->acceptImport($this->getRequest()->getRawBody()); break; // TODO: put / replace all? default: $this->sendUnsupportedMethod(); } return; } $this->addTitle($this->translate('Import source')) ->setAutorefreshInterval(10) ->addAddLink( $this->translate('Add a new Import Source'), 'director/importsource/add' )->tabs(new ImportTabs())->activate('importsource'); (new ImportsourceTable($this->db()))->renderTo($this); } /** * @param $raw */ protected function acceptImport($raw) { (new ImportExport($this->db()))->unserializeImportSources(json_decode($raw)); } protected function sendExport() { $this->sendJson( $this->getResponse(), (new ImportExport($this->db()))->serializeAllImportSources() ); } } icingaweb2-module-director-1.11.8/application/controllers/IndexController.php000066400000000000000000000047561516513262500274270ustar00rootroot00000000000000Config()->get('db', 'resource')) { $migrations = new Migrations($this->db()); if ($migrations->hasSchema()) { if (!$this->hasDeploymentEndpoint()) { $this->showKickstartForm(); } } if ($migrations->hasPendingMigrations()) { $this->content()->prepend( ApplyMigrationsForm::load() ->setMigrations($migrations) ->handleRequest() ); } elseif ($migrations->hasBeenDowngraded()) { $this->content()->add(Hint::warning(sprintf($this->translate( 'Your DB schema (migration #%d) is newer than your code base.' . ' Downgrading Icinga Director is not supported and might' . ' lead to unexpected problems.' ), $migrations->getLastMigrationNumber()))); } if ($migrations->hasSchema()) { parent::indexAction(); } else { $this->addTitle(sprintf( $this->translate('Icinga Director Setup: %s'), $this->translate('Create Schema') )); $this->addSingleTab('Setup'); } } else { $this->addTitle(sprintf( $this->translate('Icinga Director Setup: %s'), $this->translate('Choose DB Resource') )); $this->addSingleTab('Setup'); $this->showKickstartForm(); } } protected function showKickstartForm() { $form = KickstartForm::load(); if ($name = $this->getPreferredDbResourceName()) { $form->setDbResourceName($name); } $this->content()->prepend($form->handleRequest()); } protected function hasDeploymentEndpoint() { try { $this->hasDeploymentEndpoint = $this->db()->hasDeploymentEndpoint(); } catch (Exception $e) { return false; } return $this->hasDeploymentEndpoint; } } icingaweb2-module-director-1.11.8/application/controllers/InspectController.php000066400000000000000000000143741516513262500277620ustar00rootroot00000000000000assertPermission('director/inspect'); } /** * @throws \Icinga\Exception\NotFoundError */ public function typesAction() { $object = $this->endpoint(); $name = $object->getObjectName(); $this->tabs( new ObjectTabs('endpoint', $this->Auth(), $object) )->activate('inspect'); $this->addTitle($this->translate('Icinga 2 - Objects: %s'), $name); $this->actions()->add( Link::create( $this->translate('Status'), 'director/inspect/status', ['endpoint' => $name], [ 'class' => 'icon-eye', 'data-base-target' => '_next' ] ) ); $this->content()->add( new InspectTreeRenderer($object) ); } /** * @throws \Icinga\Exception\NotFoundError */ public function typeAction() { $api = $this->endpoint()->api(); $typeName = $this->params->get('type'); $this->addSingleTab($this->translate('Inspect - object list')); $this->addTitle( $this->translate('Object type "%s"'), $typeName ); $c = $this->content(); $type = $api->getType($typeName); if ($type->abstract) { $c->add($this->translate('This is an abstract object type.')); } if (! $type->abstract) { $objects = $api->listObjects($typeName, $type->plural_name); $c->add(Html::tag('p', null, sprintf($this->translate('%d objects found'), count($objects)))); $c->add(new CoreApiObjectsTable($objects, $this->endpoint(), $type)); } if (count((array) $type->fields)) { $c->add([ Html::tag('h2', null, $this->translate('Type attributes')), new CoreApiFieldsTable($type->fields, $this->url()) ]); } if (count($type->prototype_keys)) { $c->add([ Html::tag('h2', null, $this->translate('Prototypes (methods)')), new CoreApiPrototypesTable($type->prototype_keys, $type->name) ]); } } /** * @throws \Icinga\Exception\NotFoundError */ public function objectAction() { $name = $this->params->get('name'); $pType = $this->params->get('plural'); $this->addSingleTab($this->translate('Object Inspection')); $this->addTitle('%s "%s"', $pType, $name); $this->showEndpointInformation($this->endpoint()); $this->content()->add( new IcingaObjectInspection( $this->endpoint()->api()->getObject($name, $pType), $this->db() ) ); } /** * @param IcingaEndpoint $endpoint */ protected function showEndpointInformation(IcingaEndpoint $endpoint) { $this->content()->add( Html::tag('p', null, Html::sprintf( 'Inspected via %s (%s)', $this->linkToEndpoint($endpoint), $endpoint->getDescriptiveUrl() )) ); } /** * @param IcingaEndpoint $endpoint * @return Link */ protected function linkToEndpoint(IcingaEndpoint $endpoint) { return Link::create($endpoint->getObjectName(), 'director/endpoint', [ 'name' => $endpoint->getObjectName() ]); } /** * @throws \Icinga\Exception\NotFoundError */ public function statusAction() { $this->addSingleTab($this->translate('Status')); $this->addTitle($this->translate('Icinga 2 API - Status')); $this->content()->add(Html::tag( 'pre', null, PlainObjectRenderer::render($this->endpoint()->api()->getStatus()) )); } /** * @throws \Icinga\Exception\NotFoundError */ public function packagesAction() { $db = $this->db(); $endpointName = $this->params->get('endpoint'); $package = $this->params->get('package'); $stage = $this->params->get('stage'); $file = $this->params->get('file'); if ($endpointName === null) { $endpoint = null; } else { $endpoint = IcingaEndpoint::load($endpointName, $db); } if ($endpoint === null) { $this->addSingleTab($this->translate('Inspect Packages')); } elseif ($file !== null) { $this->addSingleTab($this->translate('Inspect File Content')); } else { $this->tabs( new ObjectTabs('endpoint', $this->Auth(), $endpoint) )->activate('packages'); } $widget = new InspectPackages($this->db(), 'director/inspect/packages'); $this->addTitle($widget->getTitle($endpoint, $package, $stage, $file)); if ($file === null) { $this->actions()->add($widget->getBreadCrumb($endpoint, $package, $stage)); } $this->content()->add($widget->getContent($endpoint, $package, $stage, $file)); } /** * @return IcingaEndpoint * @throws \Icinga\Exception\NotFoundError */ protected function endpoint() { if ($this->endpoint === null) { if ($name = $this->params->get('endpoint')) { $this->endpoint = IcingaEndpoint::load($name, $this->db()); } else { $this->endpoint = $this->db()->getDeploymentEndpoint(); } } return $this->endpoint; } } icingaweb2-module-director-1.11.8/application/controllers/JobController.php000066400000000000000000000064421516513262500270640ustar00rootroot00000000000000setAutorefreshInterval(10); $job = $this->requireJob(); $this ->addJobTabs($job, 'show') ->addTitle($this->translate('Job: %s'), $job->get('job_name')) ->addToBasketLink() ->content()->add(new JobDetails($job)); } public function addAction() { $this ->addSingleTab($this->translate('New Job')) ->addTitle($this->translate('Add a new Job')); if ($this->showNotInBranch($this->translate('Creating Jobs'))) { return; } $this->content()->add( DirectorJobForm::load() ->setSuccessUrl('director/job') ->setDb($this->db()) ->handleRequest() ); } /** * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ public function editAction() { $job = $this->requireJob(); $this ->addJobTabs($job, 'edit') ->addTitle($this->translate('Job: %s'), $job->get('job_name')) ->addToBasketLink(); if ($this->showNotInBranch($this->translate('Modifying Jobs'))) { return; } $form = DirectorJobForm::load() ->setListUrl('director/jobs') ->setObject($job) ->handleRequest(); $this->content()->add($form); } /** * @return DirectorJob * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Exception\MissingParameterException */ protected function requireJob() { return DirectorJob::loadWithAutoIncId((int) $this->params->getRequired('id'), $this->db()); } /** * @return $this * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ protected function addToBasketLink() { $job = $this->requireJob(); $this->actions()->add(Link::create( $this->translate('Add to Basket'), 'director/basket/add', [ 'type' => 'DirectorJob', 'names' => $job->getUniqueIdentifier() ], ['class' => 'icon-tag'] )); return $this; } protected function addJobTabs(DirectorJob $job, $active) { $id = $job->get('id'); $this->tabs()->add('show', [ 'url' => 'director/job', 'urlParams' => ['id' => $id], 'label' => $this->translate('Job'), ])->add('edit', [ 'url' => 'director/job/edit', 'urlParams' => ['id' => $id], 'label' => $this->translate('Config'), ])->activate($active); return $this; } } icingaweb2-module-director-1.11.8/application/controllers/JobsController.php000066400000000000000000000011141516513262500272360ustar00rootroot00000000000000addTitle($this->translate('Jobs')) ->setAutorefreshInterval(10) ->addAddLink($this->translate('Add a new Job'), 'director/job/add') ->tabs(new ImportTabs())->activate('jobs'); (new JobTable($this->db()))->renderTo($this); } } icingaweb2-module-director-1.11.8/application/controllers/KickstartController.php000066400000000000000000000014501516513262500303030ustar00rootroot00000000000000addSingleTab($this->translate('Kickstart')) ->addTitle($this->translate('Director Kickstart Wizard')); if ($this->showNotInBranch($this->translate('Kickstart'))) { return; } $form = KickstartForm::load(); try { $form->setEndpoint($this->db()->getDeploymentEndpoint()); } catch (Exception $e) { // Silently ignore DB errors } $form->handleRequest(); $this->content()->add($form); } } icingaweb2-module-director-1.11.8/application/controllers/NotificationController.php000066400000000000000000000053441516513262500310000ustar00rootroot00000000000000assertPermission('director/notifications'); } // TODO: KILL IT public function init() { parent::init(); // TODO: Check if this is still needed, remove it otherwise /** @var \Icinga\Web\Widget\Tab $tab */ if ($this->object && $this->object->object_type === 'apply') { if ($host = $this->params->get('host')) { foreach ($this->getTabs()->getTabs() as $tab) { $tab->getUrl()->setParam('host', $host); } } if ($service = $this->params->get('service')) { foreach ($this->getTabs()->getTabs() as $tab) { $tab->getUrl()->setParam('service', $service); } } } } /** * @param DirectorObjectForm $form */ protected function onObjectFormLoaded(DirectorObjectForm $form) { if (! $this->object) { return; } if ($this->object->isTemplate()) { $form->setListUrl('director/notifications/templates'); } else { $form->setListUrl('director/notifications/applyrules'); } } protected function hasBasketSupport() { return $this->object->isTemplate() || $this->object->isApplyRule(); } protected function loadObject() { if ($this->object === null) { if ($name = $this->params->get('name')) { $params = array('object_name' => $name); $db = $this->db(); if ($hostname = $this->params->get('host')) { $this->view->host = IcingaHost::load($hostname, $db); $params['host_id'] = $this->view->host->id; } if ($service = $this->params->get('service')) { $this->view->service = IcingaService::load($service, $db); $params['service_id'] = $this->view->service->id; } $this->object = IcingaNotification::load($params, $db); } else { parent::loadObject(); } } if (! $this->allowsObject($this->object)) { throw new NotFoundError('No such object available'); } return $this->object; } } icingaweb2-module-director-1.11.8/application/controllers/NotificationsController.php000066400000000000000000000013071516513262500311560ustar00rootroot00000000000000tabs()->remove('index'); return $res; } public function indexAction() { throw new NotFoundError('Not found'); } protected function assertApplyRulePermission() { return $this->assertPermission('director/notifications'); } protected function checkDirectorPermissions() { $this->assertPermission('director/notifications'); } } icingaweb2-module-director-1.11.8/application/controllers/NotificationtemplateController.php000066400000000000000000000006401516513262500325260ustar00rootroot00000000000000 $this->params->get('name') ], $this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/PhperrorController.php000066400000000000000000000031301516513262500301420ustar00rootroot00000000000000getTabs()->add('error', array( 'label' => $this->translate('Error'), 'url' => $this->getRequest()->getUrl() ))->activate('error'); $msg = $this->translate( "PHP version 5.4.x is required for Director >= 1.4.0, you're running %s." . ' Please either upgrade PHP or downgrade Icinga Director' ); $this->view->title = $this->translate('Unsatisfied dependencies'); $this->view->message = sprintf($msg, PHP_VERSION); } public function dependenciesAction() { $checker = new DependencyChecker(Icinga::app()); if ($checker->satisfiesDependencies($this->Module())) { $this->redirectNow('director'); } $this->setAutorefreshInterval(15); $this->getTabs()->add('error', [ 'label' => $this->translate('Error'), 'url' => $this->getRequest()->getUrl() ])->activate('error'); $this->view->title = $this->translate('Unsatisfied dependencies'); $this->view->table = (new DependencyInfoTable($checker, $this->Module()))->render(); $this->view->message = $this->translate( "Icinga Director depends on the following modules, please install/upgrade as required" ); } } icingaweb2-module-director-1.11.8/application/controllers/ScheduledDowntimeController.php000066400000000000000000000027001516513262500317520ustar00rootroot00000000000000assertPermission('director/scheduled-downtimes'); } public function rangesAction() { /** @var IcingaScheduledDowntime $object */ $object = $this->object; $this->tabs()->activate('ranges'); $this->addTitle($this->translate('Time period ranges')); $form = IcingaScheduledDowntimeRangeForm::load() ->setScheduledDowntime($object); if (null !== ($name = $this->params->get('range'))) { $this->addBackLink($this->url()->without('range')); $form->loadObject([ 'scheduled_downtime_id' => $object->get('id'), 'range_key' => $name, 'range_type' => $this->params->get('range_type') ]); } $this->content()->add($form->handleRequest()); IcingaScheduledDowntimeRangeTable::load($object)->renderTo($this); } public function getType() { return 'scheduledDowntime'; } } icingaweb2-module-director-1.11.8/application/controllers/ScheduledDowntimesController.php000066400000000000000000000020711516513262500321360ustar00rootroot00000000000000tabs()->remove('index'); $this->tabs()->remove('templates'); return $res; } protected function getTable() { return parent::getTable() ->setBaseObjectUrl('director/scheduled-downtime'); } protected function getApplyRulesTable() { return parent::getApplyRulesTable()->createLinksWithNames(); } public function getType() { return 'scheduledDowntime'; } public function getBaseObjectUrl() { return 'scheduled-downtime'; } protected function assertApplyRulePermission() { return $this->assertPermission('director/scheduled-downtimes'); } protected function checkDirectorPermissions() { $this->assertPermission('director/scheduled-downtimes'); } } icingaweb2-module-director-1.11.8/application/controllers/SchemaController.php000066400000000000000000000052101516513262500275420ustar00rootroot00000000000000schemas = [ 'mysql' => $this->translate('MySQL schema'), 'pgsql' => $this->translate('PostgreSQL schema'), ]; } /** * @throws \Icinga\Exception\IcingaException */ public function mysqlAction() { $this->serveSchema('mysql'); } /** * @throws \Icinga\Exception\IcingaException */ public function pgsqlAction() { $this->serveSchema('pgsql'); } /** * @param $type * @throws \Icinga\Exception\IcingaException */ protected function serveSchema($type) { $schema = $this->loadSchema($type); if ($this->params->get('format') === 'sql') { header('Content-type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $type . '.sql'); echo $schema; exit; // TODO: Shutdown } $this ->addSchemaTabs($type) ->addTitle($this->schemas[$type]) ->addDownloadAction() ->content()->add(Html::tag('pre', null, $schema)); } protected function loadSchema($type) { return file_get_contents( sprintf( '%s/schema/%s.sql', $this->Module()->getBaseDir(), $type ) ); } /** * @return $this * @throws \Icinga\Exception\IcingaException * @throws \Icinga\Exception\ProgrammingError */ protected function addDownloadAction() { $this->actions()->add( Link::create( $this->translate('Download'), $this->url()->with('format', 'sql'), null, [ 'target' => '_blank', 'class' => 'icon-download', ] ) ); return $this; } /** * @param $active * @return $this * @throws \Icinga\Exception\Http\HttpNotFoundException * @throws \Icinga\Exception\ProgrammingError */ protected function addSchemaTabs($active) { $tabs = $this->tabs(); foreach ($this->schemas as $type => $title) { $tabs->add($type, [ 'url' => 'director/schema/' . $type, 'label' => $title, ]); } $tabs->activate($active); return $this; } } icingaweb2-module-director-1.11.8/application/controllers/SelfServiceController.php000066400000000000000000000343031516513262500305610ustar00rootroot00000000000000getRequest()->isApiRequest()) { $this->sendPowerShellResponse('1.4.0'); } else { throw new NotFoundError('Not found'); } } /** * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\IcingaException * @throws \Zend_Controller_Exception */ public function registerHostAction() { $request = $this->getRequest(); $form = IcingaHostSelfServiceForm::create($this->db()); $form->setApiRequest($request->isApiRequest()); try { if ($key = $this->params->get('key')) { $form->loadTemplateWithApiKey($key); } } catch (Exception $e) { $this->sendPowerShellError($e->getMessage(), 404); return; } if ($name = $this->params->get('name')) { $form->setHostName($name); } if ($request->isApiRequest()) { $data = json_decode($request->getRawBody()); $request->setPost((array) $data); $form->handleRequest(); if ($newKey = $form->getHostApiKey()) { $this->sendPowerShellResponse($newKey); } else { $error = implode('; ', $form->getErrorMessages()); if ($error === '') { if ($form->isMissingRequiredFields()) { $fields = $form->listMissingRequiredFields(); if (count($fields) === 1) { $this->sendPowerShellError( sprintf("%s is required", $fields[0]), 400 ); } else { $this->sendPowerShellError( sprintf("Missing parameters: %s", implode(', ', $fields)), 400 ); } return; } else { $this->sendPowerShellError('An unknown error ocurred', 500); } } else { $this->sendPowerShellError($error, 400); } } return; } $form->handleRequest(); $this->addSingleTab($this->translate('Self Service')) ->addTitle($this->translate('Self Service - Host Registration')) ->content()->add(Html::tag('p', null, $this->translate( 'In case an Icinga Admin provided you with a self service API' . ' token, this is where you can register new hosts' ))) ->add($form); } /** * @throws NotFoundError * @throws \Zend_Controller_Request_Exception * @throws \Zend_Controller_Response_Exception */ public function ticketAction() { if (!$this->getRequest()->isApiRequest()) { throw new NotFoundError('Not found'); } try { $key = $this->params->getRequired('key'); $host = IcingaHost::loadWithApiKey($key, $this->db()); if ($host->isTemplate()) { throw new NotFoundError('Got invalid API key "%s"', $key); } $name = $host->getObjectName(); if ($host->getResolvedProperty('has_agent') !== 'y') { throw new NotFoundError('The host "%s" is not an agent', $name); } $this->sendPowerShellResponse($this->api()->getTicket($name)); } catch (Exception $e) { if ($e instanceof NotFoundError) { $this->sendPowerShellError($e->getMessage(), 404); } else { $this->sendPowerShellError($e->getMessage(), 500); } } } /** * @param $response * @throws ProgrammingError * @throws \Zend_Controller_Request_Exception */ protected function sendPowerShellResponse($response) { if ($this->getRequest()->getHeader('X-Director-Accept') === 'text/plain') { if (is_array($response)) { echo $this->makePlainTextPowerShellArray($response); } else { echo $response; } } else { $this->sendJson($this->getResponse(), $response); } } /** * @param $error * @param $code * @throws \Zend_Controller_Request_Exception * @throws \Zend_Controller_Response_Exception */ protected function sendPowerShellError($error, $code) { if ($this->getRequest()->getHeader('X-Director-Accept') === 'text/plain') { $this->getResponse()->setHttpResponseCode($code); echo "ERROR: $error"; } else { $this->sendJsonError($this->getResponse(), $error, $code); } } /** * @param $value * @return string * @throws ProgrammingError */ protected function makePowerShellBoolean($value) { if ($value === 'y' || $value === true) { return 'true'; } elseif ($value === 'n' || $value === false) { return 'false'; } else { throw new ProgrammingError( 'Expected boolean value, got %s', var_export($value, true) ); } } /** * @param array $params * @return string * @throws ProgrammingError */ protected function makePlainTextPowerShellArray(array $params) { $plain = ''; foreach ($params as $key => $value) { if (is_bool($value)) { $value = $this->makePowerShellBoolean($value); } elseif (is_array($value)) { $value = implode('!', $value); } $plain .= "$key: $value\r\n"; } return $plain; } /** * @throws NotFoundError * @throws \Zend_Controller_Request_Exception * @throws \Zend_Controller_Response_Exception */ public function powershellParametersAction() { if (!$this->getRequest()->isApiRequest()) { throw new NotFoundError('Not found'); } try { $this->shipPowershellParams(); } catch (Exception $e) { if ($e instanceof NotFoundError) { $this->sendPowerShellError($e->getMessage(), 404); } else { $this->sendPowerShellError($e->getMessage(), 500); } } } /** * @throws NotFoundError * @throws ProgrammingError * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\IcingaException * @throws \Icinga\Exception\MissingParameterException * @throws \Zend_Controller_Request_Exception * @throws \Zend_Controller_Response_Exception */ protected function shipPowershellParams() { $db = $this->db(); $key = $this->params->getRequired('key'); $host = IcingaHost::loadWithApiKey($key, $db); $settings = $this->getSettings(); $transform = $settings->get('self-service/transform_hostname'); $params = [ 'fetch_agent_name' => $settings->get('self-service/agent_name') === 'hostname', 'fetch_agent_fqdn' => $settings->get('self-service/agent_name') === 'fqdn', 'transform_hostname' => $transform, 'flush_api_directory' => $settings->get('self-service/flush_api_dir') === 'y', // ConvertEndpointIPConfig: 'resolve_parent_host' => $settings->get('self-service/resolve_parent_host'), // InstallFrameworkService: 'install_framework_service' => '0', // ServiceDirectory => framework_service_directory // FrameworkServiceUrl => framework_service_url // InstallFrameworkPlugins: 'install_framework_plugins' => '0', // PluginsUrl => framework_plugins_url ]; $username = $settings->get('self-service/icinga_service_user'); if ($username) { $params['icinga_service_user'] = $username; } if ($transform === '2') { $transformMethod = '.upperCase'; } elseif ($transform === '1') { $transformMethod = '.lowerCase'; } else { $transformMethod = ''; } $hostObject = (object) [ 'address' => '&ipaddress&', ]; switch ($settings->get('self-service/agent_name')) { case 'hostname': $hostObject->display_name = "&fqdn$transformMethod&"; break; case 'fqdn': $hostObject->display_name = "&hostname$transformMethod&"; break; } $params['director_host_object'] = json_encode($hostObject); if ($settings->get('self-service/download_type')) { $params['download_url'] = $settings->get('self-service/download_url'); $params['agent_version'] = $settings->get('self-service/agent_version'); $params['allow_updates'] = $settings->get('self-service/allow_updates') === 'y'; $params['agent_listen_port'] = $host->getAgentListenPort(); if ($hashes = $settings->get('self-service/installer_hashes')) { $params['installer_hashes'] = $hashes; } if ($settings->get('self-service/install_nsclient') === 'y') { $params['install_nsclient'] = true; $this->addBooleanSettingsToParams($settings, [ 'nsclient_add_defaults', 'nsclient_firewall', 'nsclient_service', ], $params); $this->addStringSettingsToParams($settings, [ 'nsclient_directory', 'nsclient_installer_path' ], $params); } } $this->addHostToParams($host, $params); if ($this->getRequest()->getHeader('X-Director-Accept') === 'text/plain') { echo $this->makePlainTextPowerShellArray($params); } else { $this->sendJson($this->getResponse(), $params); } } /** * @param IcingaHost $host * @param array $params * @throws NotFoundError * @throws ProgrammingError * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\IcingaException * @throws \Zend_Controller_Request_Exception * @throws \Zend_Controller_Response_Exception */ protected function addHostToParams(IcingaHost $host, array &$params) { if (! $host->isObject()) { return; } $db = $this->db(); $settings = $this->getSettings(); $name = $host->getObjectName(); if ($host->getSingleResolvedProperty('has_agent') !== 'y') { $this->sendPowerShellError(sprintf( '%s is not configured for Icinga Agent usage', $name ), 403); return; } $zoneName = $host->getRenderingZone(); if ($zoneName === IcingaHost::RESOLVE_ERROR) { $this->sendPowerShellError(sprintf( 'Could not resolve target Zone for %s', $name ), 404); return; } $masterConnectsToAgent = $host->getSingleResolvedProperty( 'master_should_connect' ) === 'y'; $params['agent_add_firewall_rule'] = $masterConnectsToAgent; $params['global_zones'] = $settings->get('self-service/global_zones'); $zone = IcingaZone::load($zoneName, $db); $endpointNames = $zone->listEndpoints(); if (! $masterConnectsToAgent) { $endpointsConfig = []; foreach ($endpointNames as $endpointName) { $endpoint = IcingaEndpoint::load($endpointName, $db); $endpointsConfig[] = sprintf( '%s;%s', $endpoint->getSingleResolvedProperty('host'), $endpoint->getResolvedPort() ); } $params['endpoints_config'] = $endpointsConfig; } $master = $db->getDeploymentEndpoint(); $params['parent_zone'] = $zoneName; $params['ca_server'] = $master->getObjectName(); $params['parent_endpoints'] = $endpointNames; $params['accept_config'] = $host->getSingleResolvedProperty('accept_config') === 'y'; } protected function addStringSettingsToParams(Settings $settings, array $keys, array &$params) { foreach ($keys as $key) { $value = $settings->get("self-service/$key"); if ($value) { $params[$key] = $value; } } } protected function addBooleanSettingsToParams(Settings $settings, array $keys, array &$params) { foreach ($keys as $key) { $value = $settings->get("self-service/$key"); if ($value !== null) { $params[$key] = $value === 'y'; } } } /** * @return Settings * @throws \Icinga\Exception\ConfigurationError */ protected function getSettings() { if ($this->settings === null) { $this->settings = new Settings($this->db()); } return $this->settings; } } icingaweb2-module-director-1.11.8/application/controllers/ServiceController.php000066400000000000000000000236361516513262500277560ustar00rootroot00000000000000host && $this->object && $this->backend()->canModifyService($this->host->getObjectName(), $this->object->getObjectName()) ) { return; } $this->assertPermission(Permission::SERVICES); } public function init() { // This happens in parent::init() too, but is required to take place before the next two lines $this->enableStaticObjectLoader($this->getTableName()); // Hint: having Host and Set loaded first is important for UUID lookups with legacy URLs $this->host = $this->getOptionalRelatedObjectFromParams('host', 'host'); $this->set = $this->getOptionalRelatedObjectFromParams('service_set', 'set'); parent::init(); $this->addOptionalHostTabs(); $this->addOptionalSetTabs(); } protected function getOptionalRelatedObjectFromParams($type, $parameter) { if ($id = $this->params->get("{$parameter}_id")) { $key = (int) $id; } else { $key = $this->params->get($parameter); } if ($key !== null) { $table = DbObjectTypeRegistry::tableNameByType($type); $key = UuidLookup::findUuidForKey($key, $table, $this->db(), $this->getBranch()); return $this->loadSpecificObject($table, $key); } return null; } protected function loadOptionalObject(): void { parent::loadOptionalObject(); if ($this->object) { if ($this->host === null) { $this->host = $this->loadOptionalRelatedObject($this->object, 'host'); } if ($this->set === null) { $this->set = $this->loadOptionalRelatedObject($this->object, 'service_set'); } } } protected function loadOptionalRelatedObject(IcingaObject $object, $relation) { $key = $object->getUnresolvedRelated($relation); if ($key === null) { if ($key = $object->get("{$relation}_id")) { $key = (int) $key; } else { $key = $object->get($relation); // We reach this when accessing Service Template Fields } } if ($key === null) { return null; } $table = DbObjectTypeRegistry::tableNameByType($relation); $uuid = UuidLookup::findUuidForKey($key, $table, $this->db(), $this->getBranch()); return $this->loadSpecificObject($table, $uuid); } protected function addParamToTabs($name, $value) { foreach ($this->tabs()->getTabs() as $tab) { /** @var Tab $tab */ $tab->getUrl()->setParam($name, $value); } return $this; } public function addAction() { parent::addAction(); if ($this->host) { // TODO: use setTitle. And figure out, where we use this old route. $this->view->title = $this->host->object_name . ': ' . $this->view->title; } elseif ($this->set) { $this->view->title = sprintf( $this->translate('Add a service to "%s"'), $this->set->object_name ); } elseif ($this->apply) { $this->view->title = sprintf( $this->translate('Apply "%s"'), $this->apply->object_name ); } } protected function onObjectFormLoaded(DirectorObjectForm $form) { if ($this->set) { /** @var IcingaServiceForm$form */ $form->setServiceSet($this->set); } if ($this->object === null && $this->apply) { $form->createApplyRuleFor($this->apply); } } public function editAction() { $this->tabs()->activate('modify'); /** @var IcingaService $object */ $object = $this->object; $this->addTitle($object->getObjectName()); if ($object->isTemplate() && $this->showNotInBranch($this->translate('Modifying Templates'))) { return; } $form = IcingaServiceForm::load()->setDb($this->db()); $form->setBranch($this->getBranch()); if ($this->host) { $this->actions()->add(Link::create( $this->translate('back'), 'director/host/services', ['uuid' => $this->host->getUniqueId()->toString()], ['class' => 'icon-left-big'] )); $form->setHost($this->host); } if ($this->set) { $form->setServiceSet($this->set); } if ($this->host && $object->usesVarOverrides()) { $fake = IcingaService::create(array( 'object_type' => 'object', 'host_id' => $object->get('host_id'), 'imports' => $object, 'object_name' => $object->object_name, 'use_var_overrides' => 'y', 'vars' => $this->host->getOverriddenServiceVars($object->object_name), ), $this->db()); $form->setObject($fake); } else { $form->setObject($object); } $form->handleRequest(); $this->addActionClone(); if ($this->host) { $this->view->subtitle = sprintf( $this->translate('(on %s)'), $this->host->object_name ); } try { if ( $object->isTemplate() && $object->getResolvedProperty('check_command_id') ) { $this->view->actionLinks .= ' ' . $this->view->qlink( 'Create apply-rule', 'director/service/add', array('apply' => $object->object_name), array('class' => 'icon-plus') ); } } catch (Exception $e) { // ignore the error, show no apply link } $this->content()->add($form); } public function assignAction() { // TODO: figure out whether and where we link to this /** @var IcingaService $service */ $service = $this->object; $this->actions()->add(new Link( $this->translate('back'), $this->getRequest()->getUrl()->without('rule_id'), null, array('class' => 'icon-left-big') )); $this->tabs()->activate('applied'); $this->addTitle( $this->translate('Apply: %s'), $service->getObjectName() ); $table = (new IcingaAppliedServiceTable($this->db())) ->setService($service); $table->getAttributes()->set('data-base-target', '_self'); $this->content()->add($table); } protected function getLegacyKey() { if ($key = $this->params->get('id')) { $key = (int) $key; } else { $key = $this->params->get('name'); } if ($key === null) { throw new \InvalidArgumentException('uuid, name or id required'); } return $key; } protected function loadObject() { if ($this->params->has('uuid')) { parent::loadObject(); return; } $key = $this->getLegacyKey(); // Hint: not passing 'object' as type, we still have name-based links in previews and similar $uuid = UuidLookup::findServiceUuid($this->db(), $this->getBranch(), null, $key, $this->host, $this->set); if ($uuid === null) { if (! $this->params->get('allowOverrides')) { throw new NotFoundError('Not found'); } } else { $this->params->set('uuid', $uuid->toString()); parent::loadObject(); } } protected function addOptionalHostTabs() { if ($this->host === null) { return; } $hostname = $this->host->getObjectName(); $tabs = new Tabs(); $urlParams = ['uuid' => $this->host->getUniqueId()->toString()]; $tabs->add('host', [ 'url' => 'director/host', 'urlParams' => $urlParams, 'label' => $this->translate('Host'), ])->add('services', [ 'url' => 'director/host/services', 'urlParams' => $urlParams, 'label' => $this->translate('Services'), ]); $this->addParamToTabs('host', $hostname); $this->controls()->prependTabs($tabs); } protected function addOptionalSetTabs() { if ($this->set === null) { return; } $setName = $this->set->getObjectName(); $tabs = new Tabs(); $tabs->add('set', [ 'url' => 'director/serviceset', 'urlParams' => ['name' => $setName], 'label' => $this->translate('ServiceSet'), ])->add('services', [ 'url' => 'director/serviceset/services', 'urlParams' => ['name' => $setName], 'label' => $this->translate('Services'), ]); $this->addParamToTabs('serviceset', $setName); $this->controls()->prependTabs($tabs); } } icingaweb2-module-director-1.11.8/application/controllers/ServiceapplyrulesController.php000066400000000000000000000020611516513262500320640ustar00rootroot00000000000000getRequest(); if (! $request->isApiRequest()) { throw new NotFoundError('Not found'); } $table = ApplyRulesTable::create('service', $this->db()); /* $query = $this->db()->getDbAdapter() ->select() ->from('icinga_service') ->where('object_type = ?', 'apply'); $rules = IcingaService::loadAll($this->db(), $query); */ $handler = (new IcingaObjectsHandler( $request, $this->getResponse(), $this->db() ))->setTable($table); $handler->dispatch(); } } icingaweb2-module-director-1.11.8/application/controllers/ServicegroupController.php000066400000000000000000000002551516513262500310230ustar00rootroot00000000000000loadMultiObjectsFromParams(); $names = []; /** @var ExportInterface $object */ foreach ($objects as $object) { $names[] = $object->getUniqueIdentifier(); } $url = Url::fromPath('director/basket/add', [ 'type' => 'ServiceTemplate', ]); $url->getParams()->addValues('names', $names); $this->actions()->add(Link::create( $this->translate('Add to Basket'), $url, null, ['class' => 'icon-tag'] )); } } icingaweb2-module-director-1.11.8/application/controllers/ServicesetController.php000066400000000000000000000101751516513262500304640ustar00rootroot00000000000000assertPermission('director/servicesets'); } public function init() { if (null !== ($host = $this->params->get('host'))) { $this->host = IcingaHost::load($host, $this->db()); } parent::init(); if ($this->object) { $this->addServiceSetTabs(); } } protected function onObjectFormLoaded(DirectorObjectForm $form) { if ($this->host) { /** @var IcingaServiceSetForm $form */ $form->setHost($this->host); } } public function addAction() { parent::addAction(); if ($this->host) { $this->addTitle( $this->translate('Add a service set to "%s"'), $this->host->getObjectName() ); } } public function servicesAction() { /** @var IcingaServiceSet $set */ $set = $this->object; $name = $set->getObjectName(); $this->tabs()->activate('services'); $this->addTitle( $this->translate('Services in this set: %s'), $name ); $this->actions()->add(Link::create( $this->translate('Add service'), 'director/service/add', ['set' => $name], ['class' => 'icon-plus'] )); IcingaServiceSetServiceTable::load($set) ->setBranch($this->getBranch()) ->renderTo($this); } public function hostsAction() { /** @var IcingaServiceSet $set */ $set = $this->object; $this->tabs()->activate('hosts'); $this->addTitle( $this->translate('Hosts using this set: %s'), $set->getObjectName() ); $table = IcingaServiceSetHostTable::load($set); if ($table->count()) { $table->renderTo($this); } $filter = $set->get('assign_filter'); if ($filter !== null && \strlen($filter) > 0) { $this->content()->add( IcingaHostsMatchingFilterTable::load(Filter::fromQueryString($filter), $this->db()) ); } } protected function addServiceSetTabs() { $hexUuid = $this->object->getUniqueId()->toString(); $tabs = $this->tabs(); $tabs->add('services', [ 'url' => 'director/serviceset/services', 'urlParams' => ['uuid' => $hexUuid], 'label' => 'Services' ]); if ($this->branch->isBranch()) { return $this; } $tabs->add('hosts', [ 'url' => 'director/serviceset/hosts', 'urlParams' => ['uuid' => $hexUuid], 'label' => 'Hosts' ]); return $this; } protected function loadObject() { if ($this->object === null) { if (null !== ($name = $this->params->get('name'))) { $params = ['object_name' => $name]; $db = $this->db(); if ($this->host) { $params['host_id'] = $this->host->get('id'); } $this->object = IcingaServiceSet::load($params, $db); } else { parent::loadObject(); } } if (! $this->allowsObject($this->object)) { throw new NotFoundError('No such object available'); } return $this->object; } } icingaweb2-module-director-1.11.8/application/controllers/ServicetemplateController.php000066400000000000000000000006211516513262500314770ustar00rootroot00000000000000 $this->params->get('name') ], $this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/SettingsController.php000066400000000000000000000030161516513262500301440ustar00rootroot00000000000000view->tabs = $this->Module() ->getConfigTabs() ->activate('config'); $this->view->form = KickstartForm::load() ->setModuleConfig($this->Config()) ->handleRequest(); } /** * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\IcingaException */ public function selfServiceAction() { $form = SelfServiceSettingsForm::create($this->db(), new Settings($this->db())); $form->handleRequest(); $hint = $this->translate( 'The Icinga Director Self Service API allows your Hosts to register' . ' themselves. This allows them to get their Icinga Agent configured,' . ' installed and upgraded in an automated way.' ); $this->addSingleTab($this->translate('Self Service')) ->addTitle($this->translate('Self Service API - Global Settings')) ->content()->add(Html::tag('p', null, $hint)) ->add($form); } } icingaweb2-module-director-1.11.8/application/controllers/SuggestController.php000066400000000000000000000323551516513262500277750ustar00rootroot00000000000000getRequest()->getPost('context'); $key = null; if (strpos($context, '!') !== false) { list($context, $key) = preg_split('~!~', $context, 2); } $func = 'suggest' . ucfirst($context); if (method_exists($this, $func)) { if (! empty($key)) { $all = $this->$func($key); } else { $all = $this->$func(); } } else { $all = array(); } // TODO: also get cursor position and eventually add an asterisk in the middle // tODO: filter also when fetching, eventually limit somehow $search = $this->getRequest()->getPost('value'); $begins = array(); $matches = array(); $begin = Filter::expression('value', '=', $search . '*'); $middle = Filter::expression('value', '=', '*' . $search . '*')->setCaseSensitive(false); $prefixes = array(); foreach ($all as $str) { if (false !== ($pos = strrpos($str, '.'))) { $prefix = substr($str, 0, $pos) . '.'; $prefixes[$prefix] = $prefix; } if (strlen($search)) { $row = (object) array('value' => $str); if ($begin->matches($row)) { $begins[] = $this->highlight($str, $search); } elseif ($middle->matches($row)) { $matches[] = $this->highlight($str, $search); } } else { $matches[] = Html::escape($str); } } $containing = array_slice(array_merge($begins, $matches), 0, 100); $suggestions = $containing; if ($func === 'suggestHostFilterColumns' || $func === 'suggestHostaddresses') { ksort($prefixes); if (count($suggestions) < 5) { $suggestions = array_merge($suggestions, array_keys($prefixes)); } } $this->view->suggestions = $suggestions; } /** * One more dummy helper for tests * * TODO: Should not remain here * * @return array * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Security\SecurityException */ protected function suggestLocations() { $this->assertPermission('director/hosts'); $db = $this->db()->getDbAdapter(); $query = $db->select() ->distinct() ->from('icinga_host_var', 'varvalue') ->where('varname = ?', 'location') ->order('varvalue'); return $db->fetchCol($query); } protected function suggestHostnames($type = 'object') { $this->assertPermission('director/hosts'); $db = $this->db()->getDbAdapter(); $query = $db->select() ->from('icinga_host', 'object_name') ->order('object_name'); if ($type !== null) { $query->where('object_type = ?', $type); } $restriction = new HostgroupRestriction($this->db(), $this->Auth()); $restriction->filterHostsQuery($query); return $db->fetchCol($query); } protected function suggestHostsAndTemplates() { return $this->suggestHostnames(null); } protected function suggestServicenames() { $r = array(); $this->assertPermission('director/services'); $db = $this->db()->getDbAdapter(); $for_host = $this->getRequest()->getPost('for_host'); if (!empty($for_host)) { $tmp_host = IcingaHost::load($for_host, $this->db()); } $query = $db->select()->distinct() ->from('icinga_service', 'object_name') ->order('object_name') ->where("object_type IN ('object','apply')"); if (!empty($tmp_host)) { $query->where('host_id = ?', $tmp_host->id); } $r = array_merge($r, $db->fetchCol($query)); if (!empty($tmp_host)) { $resolver = $tmp_host->templateResolver(); foreach ($resolver->fetchResolvedParents() as $template_obj) { $query = $db->select()->distinct() ->from('icinga_service', 'object_name') ->order('object_name') ->where("object_type IN ('object','apply')") ->where('host_id = ?', $template_obj->id); $r = array_merge($r, $db->fetchCol($query)); } $matcher = HostApplyMatches::prepare($tmp_host); foreach ($this->getAllApplyRules() as $rule) { if ($matcher->matchesFilter($rule->filter)) { //TODO $r[] = $rule->name; } } } natcasesort($r); return $r; } protected function suggestHosttemplates() { $this->assertPermission('director/hosts'); return $this->fetchTemplateNames('icinga_host', 'template_choice_id IS NULL'); } protected function suggestServicetemplates() { $this->assertPermission('director/services'); return $this->fetchTemplateNames('icinga_service', 'template_choice_id IS NULL'); } protected function suggestNotificationtemplates() { $this->assertPermission('director/notifications'); return $this->fetchTemplateNames('icinga_notification'); } protected function suggestCommandtemplates() { $this->assertPermission('director/commands'); $db = $this->db()->getDbAdapter(); $query = $db->select() ->from('icinga_command', 'object_name') ->order('object_name'); return $db->fetchCol($query); } protected function suggestUsertemplates() { $this->assertPermission('director/users'); return $this->fetchTemplateNames('icinga_user'); } /** * @return array * @throws \Icinga\Security\SecurityException * @codingStandardsIgnoreStart */ protected function suggestScheduled_downtimetemplates() { // @codingStandardsIgnoreEnd $this->assertPermission('director/scheduled-downtimes'); return $this->fetchTemplateNames('icinga_scheduled_downtime'); } protected function suggestCheckcommandnames() { $db = $this->db()->getDbAdapter(); $query = $db->select() ->from('icinga_command', 'object_name') ->where('object_type != ?', 'template') ->order('object_name'); return $db->fetchCol($query); } protected function fetchTemplateNames($table, $where = null) { $db = $this->db()->getDbAdapter(); $query = $db->select() ->from($table, 'object_name') ->where('object_type = ?', 'template') ->order('object_name'); if ($where !== null) { $query->where('template_choice_id IS NULL'); } return $db->fetchCol($query); } protected function suggestHostgroupnames() { $db = $this->db()->getDbAdapter(); $query = $db->select()->from('icinga_hostgroup', 'object_name')->order('object_name'); return $db->fetchCol($query); } protected function suggestHostaddresses() { $db = $this->db()->getDbAdapter(); $query = $db->select()->from('icinga_host', 'address')->order('address'); return $db->fetchCol($query); } protected function suggestHostFilterColumns() { return $this->getFilterColumns('host.', [ $this->translate('Host properties'), $this->translate('Custom variables') ]); } protected function suggestServiceFilterColumns() { return $this->getFilterColumns('service.', [ $this->translate('Service properties'), $this->translate('Host properties'), $this->translate('Host Custom variables'), $this->translate('Custom variables') ]); } protected function suggestDataListValuesForListId($id) { $db = $this->db()->getDbAdapter(); $select = $db->select() ->from('director_datalist_entry', ['entry_name', 'entry_value']) ->where('list_id = ?', $id) ->order('entry_value ASC'); $result = $db->fetchPairs($select); if ($result) { return $result; } else { return []; } } protected function suggestDataListValues($field = null) { if ($field === null) { // field is required! return []; } $datalistType = 'Icinga\\Module\\Director\\DataType\\DataTypeDatalist'; $db = $this->db()->getDbAdapter(); $query = $db->select() ->from(['f' => 'director_datafield'], []) ->join( ['sid' => 'director_datafield_setting'], 'sid.datafield_id = f.id AND sid.setting_name = \'datalist_id\'', [] ) ->join( ['l' => 'director_datalist'], 'l.id = sid.setting_value', [] ) ->join( ['e' => 'director_datalist_entry'], 'e.list_id = l.id', ['entry_name', 'entry_value'] ) ->where('datatype = ?', $datalistType) ->where('varname = ?', $field) ->order('entry_value'); // TODO: respect allowed_roles /* this implementation from DataTypeDatalist is broken $roles = array_map('json_encode', Acl::instance()->listRoleNames()); if (empty($roles)) { $query->where('allowed_roles IS NULL'); } else { $query->where('(allowed_roles IS NULL OR allowed_roles IN (?))', $roles); } */ $data = []; foreach ($db->fetchPairs($query) as $key => $label) { // TODO: find a better solution here // $data[] = sprintf("%s [%s]", $label, $key); $data[] = $key; } return $data; } protected function getFilterColumns($prefix, $keys) { if ($prefix === 'host.') { $all = IcingaHost::enumProperties($this->db(), $prefix); } else { $all = IcingaService::enumProperties($this->db(), $prefix); } $res = []; foreach ($keys as $key) { if (array_key_exists($key, $all)) { $res = array_merge($res, array_keys($all[$key])); } } natsort($res); return $res; } protected function suggestDependencytemplates() { $this->assertPermission('director/hosts'); return $this->fetchTemplateNames('icinga_dependency'); } protected function suggestDependencyRedundancyGroups() { $db = $this->db()->getDbAdapter(); $query = $db->select() ->distinct() ->from('icinga_dependency', 'redundancy_group') ->where('redundancy_group IS NOT NULL') ->order('redundancy_group'); return $db->fetchCol($query); } protected function highlight($val, $search) { $search = ($search); $val = Html::escape($val); return preg_replace( '/(' . preg_quote($search, '/') . ')/i', '\1', $val ); } protected function getAllApplyRules() { $allApplyRules = $this->fetchAllApplyRules(); foreach ($allApplyRules as $rule) { $rule->filter = Filter::fromQueryString($rule->assign_filter); } return $allApplyRules; } protected function fetchAllApplyRules() { $db = $this->db()->getDbAdapter(); $query = $db->select()->from( array('s' => 'icinga_service'), array( 'id' => 's.id', 'name' => 's.object_name', 'assign_filter' => 's.assign_filter', ) )->where('object_type = ? AND assign_filter IS NOT NULL', 'apply'); return $db->fetchAll($query); } protected function suggestImportsourceproperties($sourceId = null) { if ($sourceId === null) { return []; } try { $importSource = ImportSource::loadWithAutoIncId($sourceId, $this->db()); $source = ImportSourceHook::loadByName($importSource->get('source_name'), $this->db()); $columns = array_merge( $source->listColumns(), $importSource->listProperties() ); return array_combine($columns, $columns); } catch (NotFoundError $e) { return []; } } } icingaweb2-module-director-1.11.8/application/controllers/SyncruleController.php000066400000000000000000000616451516513262500301640ustar00rootroot00000000000000setAutorefreshInterval(10); $rule = $this->requireSyncRule(); $this->tabs(new SyncRuleTabs($rule))->activate('show'); $ruleName = $rule->get('rule_name'); $this->addTitle($this->translate('Sync rule: %s'), $ruleName); $checkForm = SyncCheckForm::load()->setSyncRule($rule)->handleRequest(); $store = new DbObjectStore($this->db(), $this->getBranch()); $runForm = new SyncRunForm($rule, $store); $runForm->on(SyncRunForm::ON_SUCCESS, function (SyncRunForm $form) { $message = $form->getSuccessMessage(); if ($message === null) { Notification::error($this->translate('Synchronization failed')); } else { Notification::success($message); } $this->redirectNow($this->url()); }); $runForm->handleRequest($this->getServerRequest()); if ($lastRunId = $rule->getLastSyncRunId()) { $run = SyncRun::load($lastRunId, $this->db()); } else { $run = null; } $c = $this->content(); $c->add(Html::tag('p', null, $rule->get('description'))); if (! $rule->hasSyncProperties()) { $this->addPropertyHint($rule); return; } $this->addMainActions(); if (! $run) { $c->add(Hint::warning($this->translate('This Sync Rule has never been run before.'))); } switch ($rule->get('sync_state')) { case 'unknown': $c->add(Html::tag('p', null, $this->translate( "It's currently unknown whether we are in sync with this rule." . ' You should either check for changes or trigger a new Sync Run.' ))); break; case 'in-sync': $c->add(Html::tag('p', null, sprintf( $this->translate('This Sync Rule was last found to be in Sync at %s.'), $rule->get('last_attempt') ))); /* TODO: check whether... - there have been imports since then, differing from former ones - there have been activities since then */ break; case 'pending-changes': $c->add(Hint::warning($this->translate( 'There are pending changes for this Sync Rule. You should trigger a new' . ' Sync Run.' ))); break; case 'failing': $c->add(Hint::error(sprintf( $this->translate( 'This Sync Rule failed when last checked at %s: %s' ), $rule->get('last_attempt'), $rule->get('last_error_message') ))); break; } $c->add($checkForm); if ($this->hasBranch()) { $objectType = $rule->get('object_type'); $table = DbObjectTypeRegistry::tableNameByType($objectType); if (! BranchSupport::existsForTableName($table)) { $this->showNotInBranch(sprintf($this->translate("Synchronizing '%s'"), $objectType)); return; } } $c->add($runForm); if ($run) { $c->add(Html::tag('h3', null, $this->translate('Last sync run details'))); $c->add(new SyncRunDetails($run)); if ($run->get('rule_name') !== $ruleName) { $c->add(Html::tag('p', null, sprintf( $this->translate("It has been renamed since then, its former name was %s"), $run->get('rule_name') ))); } } } /** * @param SyncRule $rule */ protected function addPropertyHint(SyncRule $rule) { $this->content()->add(Hint::warning(Html::sprintf( $this->translate('You must define some %s before you can run this Sync Rule'), new Link( $this->translate('Sync Properties'), 'director/syncrule/property', ['rule_id' => $rule->get('id')] ) ))); } /** * @throws \Icinga\Exception\NotFoundError */ public function addAction() { $this->editAction(); } /** * @throws \Icinga\Exception\NotFoundError * @throws \Exception */ public function previewAction() { $rule = $this->requireSyncRule(); $branchSupport = BranchSupport::existsForSyncRule($rule); $branchStore = new BranchStore($this->db()); $owner = $this->getAuth()->getUser()->getUsername(); if ($branchSupport) { if ($this->getBranch()->isBranch()) { $tmpBranchName = sprintf( '%s/%s-%s', Branch::PREFIX_SYNC_PREVIEW, $this->getBranch()->getUuid()->toString(), $rule->get('id') ); // We could keep changes for preview on branch too $branchStore->deleteByName($tmpBranchName); $tmpBranch = $branchStore->cloneBranchForSync($this->getBranch(), $tmpBranchName, $owner); $after = 1600000000; // a date in 2020, minus 10000000 } else { $tmpBranchName = Branch::PREFIX_SYNC_PREVIEW . '/' . $rule->get('id'); $tmpBranch = $branchStore->fetchOrCreateByName($tmpBranchName, $owner); $after = null; } $store = new DbObjectStore($this->db(), $tmpBranch); } else { $tmpBranch = $store = null; } $this->tabs(new SyncRuleTabs($rule))->activate('preview'); $this->addTitle($this->translate('Sync Preview')); $sync = new Sync($rule, $store); $keepBranchPreview = false; if ($tmpBranch) { if ($lastTime = $branchStore->getLastActivityTime($tmpBranch, $after)) { if ((time() - $lastTime) > 100) { $branchStore->wipeBranch($tmpBranch, $after); } else { $here = (new ClickHereForm())->handleRequest($this->getServerRequest()); if ($here->hasBeenClicked()) { $branchStore->wipeBranch($tmpBranch, $after); $this->redirectNow($this->url()); } else { $keepBranchPreview = true; } $this->content()->add(Hint::info(Html::sprintf( $this->translate('This preview has been generated %s, please click %s to regenerate it'), DateFormatter::timeAgo($lastTime), $here ))); } } } if (!$keepBranchPreview) { $modifications = $sync->getExpectedModifications(); } if ($tmpBranch) { try { if (!$keepBranchPreview) { $sync->apply(); } } catch (\Exception $e) { $this->content()->add(Hint::error($e->getMessage())); return; } $changes = new BranchActivityTable($tmpBranch->getUuid(), $this->db()); $changes->disableObjectLink(); if (count($changes) === 0) { $this->showInSync(); } $changes->renderTo($this); } else { if (empty($modifications)) { $this->showInSync(); return; } $this->showExpectedModificationSummary($modifications); } } protected function showInSync() { $this->content()->add(Hint::ok($this->translate( 'This Sync Rule is in sync and would currently not apply any changes' ))); } protected function showExpectedModificationSummary($modifications) { $create = []; $modify = []; $delete = []; $modifiedProperties = []; /** @var IcingaObject $object */ foreach ($modifications as $object) { if ($object->hasBeenLoadedFromDb()) { if ($object->shouldBeRemoved()) { $delete[] = $object; } else { $modify[] = $object; foreach ($object->getModifiedProperties() as $property => $value) { if (isset($modifiedProperties[$property])) { $modifiedProperties[$property]++; } else { $modifiedProperties[$property] = 1; } } if (! $object instanceof IcingaObject) { continue; } if ($object->supportsGroups()) { if ($object->hasModifiedGroups()) { if (isset($modifiedProperties['groups'])) { $modifiedProperties['groups']++; } else { $modifiedProperties['groups'] = 1; } } } if ($object->supportsImports()) { if ($object->imports()->hasBeenModified()) { if (isset($modifiedProperties['imports'])) { $modifiedProperties['imports']++; } else { $modifiedProperties['imports'] = 1; } } } if ($object->supportsCustomVars()) { if ($object->vars()->hasBeenModified()) { foreach ($object->vars() as $var) { if ($var->isNew()) { $varName = 'add vars.' . $var->getKey(); } elseif ($var->hasBeenDeleted()) { $varName = 'remove vars.' . $var->getKey(); } elseif ($var->hasBeenModified()) { $varName = 'vars.' . $var->getKey(); } else { continue; } if (isset($modifiedProperties[$varName])) { $modifiedProperties[$varName]++; } else { $modifiedProperties[$varName] = 1; } } } } } } else { $create[] = $object; } } $content = $this->content(); if (! empty($delete)) { $content->add([ Html::tag('h2', ['class' => 'icon-cancel action-delete'], sprintf( $this->translate('%d object(s) will be deleted'), count($delete) )), $this->objectList($delete) ]); } if (! empty($modify)) { $content->add([ Html::tag('h2', ['class' => 'icon-wrench action-modify'], sprintf( $this->translate('%d object(s) will be modified'), count($modify) )), $this->listModifiedProperties($modifiedProperties), $this->objectList($modify), ]); } if (! empty($create)) { $content->add([ Html::tag('h2', ['class' => 'icon-plus action-create'], sprintf( $this->translate('%d object(s) will be created'), count($create) )), $this->objectList($create) ]); } } /** * @param IcingaObject[] $objects * @return \ipl\Html\HtmlElement * @throws \Icinga\Exception\NotFoundError */ protected function objectList($objects) { return Html::tag('p', $this->firstNames($objects)); } /** * Lots of duplicated code, this whole diff logic should be mouved to a * dedicated class * * @param IcingaObject[] $objects * @param int $max * @return string * @throws \Icinga\Exception\NotFoundError */ protected function firstNames($objects, $max = 50) { $names = []; $list = new UnorderedList([], ['class' => 'unordred-list']); $total = count($objects); $i = 0; PrefetchCache::forget(); IcingaHost::clearAllPrefetchCaches(); // why?? IcingaService::clearAllPrefetchCaches(); foreach ($objects as $object) { $i++; $name = $this->getObjectNameString($object); if ($object->hasBeenLoadedFromDb()) { if ($object instanceof IcingaHost) { $names[$name] = Link::create( $name, 'director/host', ['name' => $name], ['data-base-target' => '_next'] ); $oldObject = IcingaHost::load($object->getObjectName(), $this->db()); $cfgNew = new IcingaConfig($this->db()); $cfgOld = new IcingaConfig($this->db()); $oldObject->renderToConfig($cfgOld); $object->renderToConfig($cfgNew); foreach (IcingaConfigDiff::getDiffs($cfgOld, $cfgNew) as $file => $diff) { $names[$name . '___PRETITLE___' . $file] = Html::tag('h3', $file); $names[$name . '___PREVIEW___' . $file] = $diff; } } elseif ($object instanceof IcingaService && $object->isObject()) { $host = $object->getRelated('host'); $names[$name] = Link::create( $name, 'director/service/edit', [ 'name' => $object->getObjectName(), 'host' => $host->getObjectName() ], ['data-base-target' => '_next'] ); $oldObject = IcingaService::load([ 'host_id' => $host->get('id'), 'object_name' => $object->getObjectName() ], $this->db()); $cfgNew = new IcingaConfig($this->db()); $cfgOld = new IcingaConfig($this->db()); $oldObject->renderToConfig($cfgOld); $object->renderToConfig($cfgNew); foreach (IcingaConfigDiff::getDiffs($cfgOld, $cfgNew) as $file => $diff) { $names[$name . '___PRETITLE___' . $file] = Html::tag('h3', $file); $names[$name . '___PREVIEW___' . $file] = $diff; } } else { $names[$name] = $name; } } else { $names[$name] = $name; } if ($i === $max) { break; } } ksort($names); foreach ($names as $name) { $list->addItem($name); } if ($total > $max) { $list->add(sprintf( $this->translate('...and %d more'), $total - $max )); } return $list; } protected function listModifiedProperties($properties) { $list = new UnorderedList(); foreach ($properties as $property => $cnt) { $list->addItem("{$cnt}x $property"); } return $list; } protected function getObjectNameString($object) { if ($object instanceof IcingaService) { if ($object->isObject()) { return $object->getRelated('host')->getObjectName() . ': ' . $object->getObjectName(); } else { return $object->getObjectName(); } } elseif ($object instanceof IcingaHost) { return $object->getObjectName(); } elseif ($object instanceof ExportInterface) { return $object->getUniqueIdentifier(); } elseif ($object instanceof IcingaObject) { return $object->getObjectName(); } else { /** @var \Icinga\Module\Director\Data\Db\DbObject $object */ return json_encode($object->getKeyParams()); } } /** * @throws \Icinga\Exception\NotFoundError */ public function editAction() { $form = SyncRuleForm::load() ->setListUrl('director/syncrules') ->setDb($this->db()); if ($id = $this->params->get('id')) { $form->loadObject((int) $id); /** @var SyncRule $rule */ $rule = $form->getObject(); $this->tabs(new SyncRuleTabs($rule))->activate('edit'); $this->addTitle(sprintf( $this->translate('Sync rule: %s'), $rule->get('rule_name') )); $this->addMainActions(); if (! $rule->hasSyncProperties()) { $this->addPropertyHint($rule); } if ($this->showNotInBranch($this->translate('Modifying Sync Rules'))) { return; } } else { $this->addTitle($this->translate('Add sync rule')); $this->tabs(new SyncRuleTabs())->activate('add'); if ($this->showNotInBranch($this->translate('Creating Sync Rules'))) { return; } } $form->handleRequest(); $this->content()->add($form); } /** * @throws \Icinga\Exception\MissingParameterException * @throws \Icinga\Exception\NotFoundError */ public function cloneAction() { $id = $this->params->getRequired('id'); $rule = SyncRule::loadWithAutoIncId((int) $id, $this->db()); $this->tabs()->add('show', [ 'url' => 'director/syncrule', 'urlParams' => ['id' => $id], 'label' => $this->translate('Sync rule'), ])->add('clone', [ 'url' => 'director/syncrule/clone', 'urlParams' => ['id' => $id], 'label' => $this->translate('Clone'), ])->activate('clone'); $this->addTitle('Clone: %s', $rule->get('rule_name')); $this->actions()->add( Link::create( $this->translate('Modify'), 'director/syncrule/edit', ['id' => $rule->get('id')], ['class' => 'icon-paste'] ) ); if ($this->showNotInBranch($this->translate('Cloning Sync Rules'))) { return; } $form = new CloneSyncRuleForm($rule); $this->content()->add($form); $form->on(Form::ON_SUCCESS, function (CloneSyncRuleForm $form) { $this->getResponse()->redirectAndExit($form->getSuccessUrl()); }); $form->handleRequest($this->getServerRequest()); } /** * @throws \Icinga\Exception\NotFoundError */ public function propertyAction() { $rule = $this->requireSyncRule('rule_id'); $this->tabs(new SyncRuleTabs($rule))->activate('property'); $this->actions()->add(Link::create( $this->translate('Add sync property rule'), 'director/syncrule/addproperty', ['rule_id' => $rule->get('id')], ['class' => 'icon-plus'] )); $this->addTitle($this->translate('Sync properties') . ': ' . $rule->get('rule_name')); SyncpropertyTable::create($rule) ->handleSortPriorityActions($this->getRequest(), $this->getResponse()) ->renderTo($this); } /** * @throws \Icinga\Exception\NotFoundError */ public function editpropertyAction() { $this->addpropertyAction(); } /** * @throws \Icinga\Exception\NotFoundError */ public function addpropertyAction() { $db = $this->db(); $rule = $this->requireSyncRule('rule_id'); $ruleId = (int) $rule->get('id'); $form = SyncPropertyForm::load()->setDb($db); $this->tabs(new SyncRuleTabs($rule))->activate('property'); $this->actions()->add(new Link( $this->translate('back'), 'director/syncrule/property', ['rule_id' => $ruleId], ['class' => 'icon-left-big'] )); if ($id = $this->params->get('id')) { $form->loadObject((int) $id); $this->addTitle( $this->translate('Sync "%s": %s'), $form->getObject()->get('destination_field'), $rule->get('rule_name') ); if ($this->showNotInBranch($this->translate('Modifying Sync Rules'))) { return; } } else { $this->addTitle( $this->translate('Add sync property: %s'), $rule->get('rule_name') ); if ($this->showNotInBranch($this->translate('Modifying Sync Rules'))) { return; } } $form->setRule($rule); $form->setSuccessUrl('director/syncrule/property', ['rule_id' => $ruleId]); $this->content()->add($form->handleRequest()); SyncpropertyTable::create($rule) ->handleSortPriorityActions($this->getRequest(), $this->getResponse()) ->renderTo($this); } /** * @throws \Icinga\Exception\NotFoundError */ public function historyAction() { $this->setAutorefreshInterval(30); $rule = $this->requireSyncRule(); $this->tabs(new SyncRuleTabs($rule))->activate('history'); $this->addTitle($this->translate('Sync history') . ': ' . $rule->get('rule_name')); if ($runId = $this->params->get('run_id')) { $run = SyncRun::load($runId, $this->db()); $this->content()->add(new SyncRunDetails($run)); } (new SyncRunTable($rule))->renderTo($this); } /** * @throws \Icinga\Exception\NotFoundError */ protected function addMainActions() { $this->actions(new AutomationObjectActionBar( $this->getRequest() )); $source = $this->requireSyncRule(); $this->actions()->add(Link::create( $this->translate('Add to Basket'), 'director/basket/add', [ 'type' => 'SyncRule', 'names' => $source->getUniqueIdentifier() ], [ 'class' => 'icon-tag', 'data-base-target' => '_next', ] )); } /** * @param string $key * @return SyncRule * @throws \Icinga\Exception\NotFoundError */ protected function requireSyncRule($key = 'id') { $id = $this->params->get($key); return SyncRule::loadWithAutoIncId($id, $this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/SyncrulesController.php000066400000000000000000000023501516513262500303330ustar00rootroot00000000000000getRequest()->isApiRequest()) { $this->sendExport(); return; } $this->addTitle($this->translate('Sync rule')) ->setAutorefreshInterval(10) ->addAddLink( $this->translate('Add a new Sync Rule'), 'director/syncrule/add' )->tabs(new ImportTabs())->activate('syncrule'); (new SyncruleTable($this->db()))->renderTo($this); } /** * @throws \Icinga\Exception\ConfigurationError */ protected function sendExport() { $this->sendJson( $this->getResponse(), (new ImportExport($this->db()))->serializeAllSyncRules() ); } } icingaweb2-module-director-1.11.8/application/controllers/TemplatechoiceController.php000066400000000000000000000022261516513262500312740ustar00rootroot00000000000000assertPermission('director/admin'); } public function hostAction() { $this->prepare('host', $this->translate('Host template choice')); } public function serviceAction() { $this->prepare('service', $this->translate('Service template choice')); } protected function prepare($type, $title) { $this->addSingleTab('Choice') ->addTitle($title); $form = IcingaTemplateChoiceForm::create($type, $this->db()) ->optionallyLoad($this->params->get('name')) ->setListUrl("director/templatechoices/$type") ->handleRequest(); if ($this->showNotInBranch($this->translate('Modifying Template Choices'))) { return; } $this->content()->add($form); } } icingaweb2-module-director-1.11.8/application/controllers/TemplatechoicesController.php000066400000000000000000000022421516513262500314550ustar00rootroot00000000000000assertPermission('director/admin'); } public function hostAction() { $this->prepare('host', $this->translate('Host template choices')); } public function serviceAction() { $this->prepare('service', $this->translate('Service template choices')); } public function notificationAction() { $this->prepare('notification', $this->translate('Notification template choices')); } protected function prepare($type, $title) { $this->tabs(new ObjectsTabs($type, $this->Auth(), $type))->activate('choices'); $this->setAutorefreshInterval(10)->addTitle($title); $this->actions(new ChoicesActionBar($type, $this->url())); ChoicesTable::create($type, $this->db())->renderTo($this); } } icingaweb2-module-director-1.11.8/application/controllers/TimeperiodController.php000066400000000000000000000023041516513262500304440ustar00rootroot00000000000000object; $this->tabs()->activate('ranges'); $this->addTitle($this->translate('Time period ranges')); $form = IcingaTimePeriodRangeForm::load() ->setTimePeriod($object); if (null !== ($name = $this->params->get('range'))) { $this->addBackLink($this->url()->without('range')); $form->loadObject([ 'timeperiod_id' => $object->get('id'), 'range_key' => $name, 'range_type' => $this->params->get('range_type') ]); } $this->content()->add($form->handleRequest()); IcingaTimePeriodRangeTable::load($object)->renderTo($this); } protected function hasBasketSupport() { return true; } } icingaweb2-module-director-1.11.8/application/controllers/TimeperiodsController.php000066400000000000000000000002561516513262500306330ustar00rootroot00000000000000 $this->params->get('name') ], $this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/UserController.php000066400000000000000000000005421516513262500272630ustar00rootroot00000000000000assertPermission('director/users'); } protected function hasBasketSupport() { return true; } } icingaweb2-module-director-1.11.8/application/controllers/UsergroupController.php000066400000000000000000000002521516513262500303360ustar00rootroot00000000000000assertPermission('director/users'); } } icingaweb2-module-director-1.11.8/application/controllers/UsertemplateController.php000066400000000000000000000006101516513262500310130ustar00rootroot00000000000000 $this->params->get('name') ], $this->db()); } } icingaweb2-module-director-1.11.8/application/controllers/ZoneController.php000066400000000000000000000002451516513262500272600ustar00rootroot00000000000000getDb()->getDbAdapter(); $enum = $db->fetchPairs($db->select()->from('director_basket', [ 'a' => 'basket_name', 'b' => 'basket_name', ])->order('basket_name')); $basket = null; if ($this->hasBeenSent()) { $basketName = $this->getSentValue('basket'); if ($basketName) { $basket = Basket::load($basketName, $this->getDb()); } } $names = []; foreach ($this->names as $name) { if (! $basket || ! $basket->hasObject($this->type, $name)) { $names[] = $name; } } $this->addHtmlHint( (new HtmlDocument()) ->add(sprintf('The following objects will be added: %s', implode(", ", $names))) ); $this->addElement('select', 'basket', [ 'label' => $this->translate('Basket'), 'multiOptions' => $this->optionalEnum($enum), 'required' => true, 'class' => 'autosubmit', ]); if (! empty($names)) { $this->setSubmitLabel(sprintf( $this->translate('Add %s objects'), count($names) )); } else { $this->setSubmitLabel($this->translate('Add')); $this->addSubmitButtonIfSet(); $this->getElement($this->submitButtonName)->setAttrib('disabled', true); } } public function setType($type) { $this->type = $type; return $this; } public function setNames($names) { $this->names = $names; return $this; } /** * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function onSuccess() { $type = $this->type; $basket = Basket::load($this->getValue('basket'), $this->getDb()); $basketName = $basket->get('basket_name'); if (empty($this->names)) { $this->getElement('basket')->addErrorMessage($this->translate( 'No object has been chosen' )); } if ($basket->supportsCustomSelectionFor($type)) { $basket->addObjects($type, $this->names); $basket->store(); $this->setSuccessMessage(sprintf($this->translate( 'Configuration objects have been added to the chosen basket "%s"' ), $basketName)); return parent::onSuccess(); } $this->addHtmlHint(Hint::error(Html::sprintf($this->translate( 'Please check your Basket configuration, %s does not support' . ' single "%s" configuration objects' ), Link::create( $basketName, 'director/basket', ['name' => $basketName], ['data-base-target' => '_next'] ), $type))); return false; } } icingaweb2-module-director-1.11.8/application/forms/ApplyMigrationsForm.php000066400000000000000000000026631516513262500270350ustar00rootroot00000000000000migrations->hasSchema()) { $count = $this->migrations->countPendingMigrations(); if ($count === 1) { $this->setSubmitLabel( $this->translate('Apply a pending schema migration') ); } else { $this->setSubmitLabel( sprintf( $this->translate('Apply %d pending schema migrations'), $count ) ); } } else { $this->setSubmitLabel($this->translate('Create schema')); } } public function onSuccess() { try { $this->setSuccessMessage($this->translate( 'Pending database schema migrations have successfully been applied' )); $this->migrations->applyPendingMigrations(); parent::onSuccess(); } catch (Exception $e) { $this->addError($e->getMessage()); } } public function setMigrations(Migrations $migrations) { $this->migrations = $migrations; return $this; } } icingaweb2-module-director-1.11.8/application/forms/BasketCreateSnapshotForm.php000066400000000000000000000016501516513262500277630ustar00rootroot00000000000000basket = $basket; return $this; } public function setup() { $this->setSubmitLabel($this->translate('Create Snapshot')); } /** * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function onSuccess() { /** @var \Icinga\Module\Director\Db $connection */ $connection = $this->basket->getConnection(); $snapshot = BasketSnapshot::createForBasket($this->basket, $connection); $snapshot->store(); parent::onSuccess(); } } icingaweb2-module-director-1.11.8/application/forms/BasketForm.php000066400000000000000000000117651516513262500251270ustar00rootroot00000000000000 $this->translate('Command Definitions'), 'ExternalCommand' => $this->translate('External Command Definitions'), 'CommandTemplate' => $this->translate('Command Template'), 'HostGroup' => $this->translate('Host Group'), 'IcingaTemplateChoiceHost' => $this->translate('Host Template Choice'), 'HostTemplate' => $this->translate('Host Templates'), 'ServiceGroup' => $this->translate('Service Groups'), 'IcingaTemplateChoiceService' => $this->translate('Service Template Choice'), 'ServiceTemplate' => $this->translate('Service Templates'), 'ServiceSet' => $this->translate('Service Sets'), 'UserGroup' => $this->translate('User Groups'), 'UserTemplate' => $this->translate('User Templates'), 'User' => $this->translate('Users'), 'NotificationTemplate' => $this->translate('Notification Templates'), 'Notification' => $this->translate('Notifications'), 'TimePeriod' => $this->translate('Time Periods'), 'Dependency' => $this->translate('Dependencies'), 'DataList' => $this->translate('Data Lists'), 'ImportSource' => $this->translate('Import Sources'), 'SyncRule' => $this->translate('Sync Rules'), 'DirectorJob' => $this->translate('Job Definitions'), 'Basket' => $this->translate('Basket Definitions'), ]; } /** * @throws \Zend_Form_Exception */ public function setup() { $this->addElement('text', 'basket_name', [ 'label' => $this->translate('Basket Name'), 'required' => true, ]); $types = $this->getAvailableTypes(); $options = [ Basket::SELECTION_NONE => $this->translate('Ignore'), Basket::SELECTION_ALL => $this->translate('All of them'), Basket::SELECTION_CUSTOM => $this->translate('Custom Selection'), ]; $this->addHtmlHint($this->translate( 'What should we place into this Basket every time we create' . ' new snapshot?' )); $sub = new ZfSubForm(); $sub->setDecorators([ ['HtmlTag', ['tag' => 'dl']], 'FormElements' ]); foreach ($types as $name => $label) { $sub->addElement('select', $name, [ 'label' => $label, 'multiOptions' => $options, ]); } $this->addSubForm($sub, 'objects'); $this->addDeleteButton(); $this->addHtmlHint($this->translate( 'Choose "All" to always add all of them,' . ' "Ignore" to not care about a specific Type at all and' . ' opt for "Custom Selection" in case you want to choose' . ' just some specific Objects.' )); } protected function setDefaultsFromObject(DbObject $object) { parent::setDefaultsFromObject($object); /** @var Basket $object */ $values = []; foreach ($this->getAvailableTypes() as $type => $label) { $values[$type] = Basket::SELECTION_NONE; } foreach ($object->getChosenObjects() as $type => $selection) { if ($selection === true) { $values[$type] = Basket::SELECTION_ALL; } elseif (is_array($selection)) { $values[$type] = Basket::SELECTION_CUSTOM; } } $this->populate([ 'objects' => $values ]); } protected function onRequest() { parent::onRequest(); // TODO: Change the autogenerated stub } protected function getObjectClassname() { return Basket::class; } public function onSuccess() { /** @var Basket $basket */ $basket = $this->object(); if ($basket->isEmpty()) { $this->addError($this->translate("It's not allowed to store an empty basket")); return; } if (! $basket->hasBeenLoadedFromDb()) { $basket->set('owner_type', 'user'); $basket->set('owner_value', $this->getAuth()->getUser()->getUsername()); } parent::onSuccess(); } protected function setObjectSuccessUrl() { /** @var Basket $basket */ $basket = $this->object(); $this->setSuccessUrl( 'director/basket', ['name' => $basket->get('basket_name')] ); } } icingaweb2-module-director-1.11.8/application/forms/BasketUploadForm.php000066400000000000000000000101311516513262500262560ustar00rootroot00000000000000object === null) { $this->addElement('text', 'basket_name', [ 'label' => $this->translate('Basket Name'), 'required' => true, ]); } $this->setAttrib('enctype', 'multipart/form-data'); $this->addElement('file', 'uploaded_file', [ 'label' => $this->translate('Choose file'), 'destination' => $this->getTempDir(), 'valueDisabled' => true, 'isArray' => false, 'multiple' => false, 'ignore' => true, ]); $this->setSubmitLabel($this->translate('Upload')); } protected function getTempDir() { return sys_get_temp_dir(); } protected function getObjectClassname() { return '\\Icinga\\Module\\Director\\DirectorObject\\Automation\\Basket'; } /** * @return bool * @throws IcingaException */ protected function processUploadedSource() { if (! array_key_exists('uploaded_file', $_FILES)) { throw new IcingaException('Got no file'); } if ( ! isset($_FILES['uploaded_file']['tmp_name']) || ! is_uploaded_file($_FILES['uploaded_file']['tmp_name']) ) { $this->addError('Got no uploaded file'); $this->failed = true; return false; } $tmpFile = $_FILES['uploaded_file']['tmp_name']; $originalFilename = $_FILES['uploaded_file']['name']; $source = file_get_contents($tmpFile); unlink($tmpFile); try { $json = Json::decode($source); $this->rawUpload = $source; $this->upload = $json; } catch (Exception $e) { $this->addError($originalFilename . ' failed: ' . $e->getMessage()); Notification::error($originalFilename . ' failed: ' . $e->getMessage()); $this->failed = true; return false; } return true; } public function onRequest() { if ($this->hasBeenSent()) { try { $this->processUploadedSource(); } catch (Exception $e) { $this->addError($e->getMessage()); return; } } } /** * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function onSuccess() { /** @var Basket $basket */ $basket = $this->object(); foreach ($this->upload as $type => $content) { if ($type !== 'Datafield') { $basket->addObjects($type, array_keys((array) $content)); } } if ($basket->isEmpty()) { $this->addError($this->translate("It's not allowed to store an empty basket")); return; } $basket->set('owner_type', 'user'); $basket->set('owner_value', $this->getAuth()->getUser()->getUsername()); if ($basket->hasBeenLoadedFromDb()) { $this->setSuccessUrl('director/basket/snapshots', ['name' => $basket->get('basket_name')]); } else { $this->setSuccessUrl('director/basket', ['name' => $basket->get('basket_name')]); $basket->store($this->db); } BasketSnapshot::forBasketFromJson( $basket, $this->rawUpload )->store($this->db); $this->beforeSuccessfulRedirect(); $this->redirectOnSuccess($this->translate('Basket has been uploaded')); } } icingaweb2-module-director-1.11.8/application/forms/CustomvarForm.php000066400000000000000000000011771516513262500256750ustar00rootroot00000000000000removeCsrfToken(); $this->removeElement(self::ID); $this->addElement('text', 'varname', array( 'label' => $this->translate('Variable name'), 'required' => true, )); $this->addElement('text', 'varvalue', array( 'label' => $this->translate('Value'), )); // $this->addHidden('format', 'string'); // expression, json? } } icingaweb2-module-director-1.11.8/application/forms/DeployConfigForm.php000066400000000000000000000063561516513262500263000ustar00rootroot00000000000000setAttrib('class', 'inline'); } public function setup() { $activities = $this->db->countActivitiesSinceLastDeployedConfig(); if ($this->deploymentId) { $label = $this->translate('Re-deploy now'); } elseif ($activities === 0) { $label = $this->translate('There are no pending changes. Deploy anyway'); } else { $label = sprintf( $this->translate('Deploy %d pending changes'), $activities ); } if ($this->deploymentId) { $deployIcon = 'reply-all'; } else { $deployIcon = 'forward'; } $this->addHtml( $this->getView()->icon( $deployIcon, $label, array('class' => 'link-color') ) . '' ); $el = $this->createElement('submit', 'btn_deploy', array( 'label' => $label, 'escape' => false, 'decorators' => array('ViewHelper'), 'class' => 'link-button ' . $deployIcon, )); $this->addHtml(''); $this->submitButtonName = $el->getName(); $this->setSubmitLabel($label); $this->addElement($el); } public function onSuccess() { if ($this->skipBecauseOfBug7530()) { return; } $db = $this->db; $msg = $this->translate('Config has been submitted, validation is going on'); $this->setSuccessMessage($msg); $isApiRequest = $this->getRequest()->isApiRequest(); if ($this->checksum) { $config = IcingaConfig::load(hex2bin($this->checksum), $db); } else { $config = IcingaConfig::generate($db); } $this->api->wipeInactiveStages($db); if ($this->api->dumpConfig($config, $db)) { if ($isApiRequest) { die('Api not ready'); // return $this->sendJson((object) array('checksum' => $checksum)); } else { $this->setSuccessUrl('director/config/deployments'); $this->setSuccessMessage( $this->translate('Config has been submitted, validation is going on') ); } parent::onSuccess(); } else { throw new IcingaException($this->translate('Config deployment failed')); } } public function setChecksum($checksum) { $this->checksum = $checksum; return $this; } public function setDeploymentId($id) { $this->deploymentId = $id; return $this; } public function setApi(DeploymentApiInterface $api) { $this->api = $api; return $this; } } icingaweb2-module-director-1.11.8/application/forms/DeployFormsBug7530.php000066400000000000000000000104351516513262500263030ustar00rootroot00000000000000getSentValue('confirm_7530', '')) > 0; } } protected function shouldWarnAboutBug7530() { /** @var \Icinga\Module\Director\Db $db */ $db = $this->getDb(); return $db->settings()->get('ignore_bug7530') !== 'y' && $this->getSentValue('confirm_7530') !== 'i_know' && $this->configMightTriggerBug7530() & $this->coreHasBug7530(); } protected function configMightTriggerBug7530() { /** @var \Icinga\Module\Director\Db $connection */ $connection = $this->getDb(); $db = $connection->getDbAdapter(); $zoneIds = $db->fetchCol( $db->select() ->from('icinga_zone', 'id') ->where('object_type = ?', 'object') ); if (empty($zoneIds)) { return false; } $objectTypes = [ 'icinga_host', 'icinga_service', 'icinga_notification', 'icinga_command', ]; foreach ($objectTypes as $objectType) { if ( (int) $db->fetchOne( $db->select() ->from($objectType, 'COUNT(*)') ->where('zone_id IN (?)', $zoneIds) ) > 0 ) { return true; } } return false; } protected function coreHasBug7530() { // TODO: Cache this if ($this->api instanceof CoreApi) { $version = $this->api->getVersion(); if ($version === null) { throw new \RuntimeException($this->translate('Unable to detect your Icinga 2 Core version')); } elseif ( \version_compare($version, '2.11.0', '>=') && \version_compare($version, '2.12.0', '<') ) { return true; } } return false; } public function skipBecauseOfBug7530() { $bug7530 = $this->getSentValue('confirm_7530'); if ($bug7530 === 'whaaat') { $this->setSuccessMessage($this->translate('Config has not been deployed')); parent::onSuccess(); } elseif ($bug7530 === 'hell_yes') { $this->db->settings()->set('ignore_bug7530', 'y'); } if ($this->shouldWarnAboutBug7530()) { $this->addHtml(Hint::warning(Html::sprintf($this->translate( "Warning: you're running Icinga v2.11.0 and our configuration looks" . " like you could face issue %s. We're already working on a solution." . " The GitHub Issue and our %s contain related details." ), Html::tag('a', [ 'href' => 'https://github.com/Icinga/icinga2/issues/7530', 'target' => '_blank', 'title' => sprintf( $this->translate('Show Issue %s on GitHub'), '7530' ), 'class' => 'icon-github-circled', ], '#7530'), Html::tag('a', [ 'href' => 'https://icinga.com/docs/icinga2/latest/doc/16-upgrading-icinga-2/' . '#config-sync-zones-in-zones', 'target' => '_blank', 'title' => $this->translate('Upgrading Icinga 2 - Confic Sync: Zones in Zones'), 'class' => 'icon-info-circled', ], $this->translate('Upgrading documentation'))))); $this->addElement('select', 'confirm_7530', [ 'multiOptions' => $this->optionalEnum([ 'i_know' => $this->translate("I know what I'm doing, deploy anyway"), 'hell_yes' => $this->translate("I know, please don't bother me again"), 'whaaat' => $this->translate("Thanks, I'll verify this and come back later"), ]), 'class' => 'autosubmit', 'decorators' => ['ViewHelper'], ]); return true; } return false; } } icingaweb2-module-director-1.11.8/application/forms/DeploymentLinkForm.php000066400000000000000000000115741516513262500266520ustar00rootroot00000000000000setAuth($auth); $self->db = $db; $self->info = $info; $self->api = $api; return $self; } public function setAuth(Auth $auth) { $this->auth = $auth; return $this; } public function setup() { if (! $this->canDeploy()) { return; } $onObject = $this->info->getSingleObjectChanges(); $total = $this->info->getTotalChanges(); if ($onObject === 0) { if ($total === 1) { $msg = $this->translate('There is a single pending change'); } else { $msg = sprintf( $this->translate('There are %d pending changes'), $total ); } } elseif ($total === 1) { $msg = $this->translate('There has been a single change to this object, nothing else has been modified'); } elseif ($total === $onObject) { $msg = sprintf( $this->translate('There have been %d changes to this object, nothing else has been modified'), $onObject ); } else { $msg = sprintf( $this->translate('There are %d pending changes, %d of them applied to this object'), $total, $onObject ); } $this->setAttrib('class', 'gipfl-inline-form'); $this->addHtml(Icon::create('wrench')); try { // As this is shown for single objects, ignore errors caused by an // unreachable core $target = $this->shouldWarnAboutBug7530() ? '_self' : '_next'; } catch (\Exception $e) { $target = '_next'; } $this->addSubmitButton($this->translate('Deploy'), [ 'class' => 'link-button icon-wrench', 'title' => $msg, 'data-base-target' => $target, ]); } protected function canDeploy() { return $this->auth->hasPermission(Permission::DEPLOY); } public function render(Zend_View_Interface $view = null) { if (! $this->canDeploy()) { return ''; } return parent::render($view); } public function onSuccess() { try { if ($this->skipBecauseOfBug7530()) { return; } } catch (\Exception $e) { // continue } $this->deploy(); } public function deploy() { $this->setSuccessUrl('director/config/deployments'); $config = IcingaConfig::generate($this->db); $checksum = $config->getHexChecksum(); try { $this->api->wipeInactiveStages($this->db); } catch (\Exception $e) { $this->notifyError($e->getMessage()); } if ($this->api->dumpConfig($config, $this->db)) { $this->deploymentSucceeded($checksum); } else { $this->deploymentFailed($checksum); } } protected function deploymentSucceeded($checksum) { if ($this->getRequest()->isApiRequest()) { throw new IcingaException('Not yet'); // $this->sendJson($this->getResponse(), (object) array('checksum' => $checksum)); } else { $msg = $this->translate('Config has been submitted, validation is going on'); $this->redirectOnSuccess($msg); } } protected function deploymentFailed($checksum, $error = null) { $extra = $error ? ': ' . $error : ''; if ($this->getRequest()->isApiRequest()) { throw new IcingaException('Not yet'); // $this->sendJsonError($this->getResponse(), 'Config deployment failed' . $extra); } else { $msg = $this->translate('Config deployment failed') . $extra; $this->notifyError($msg); $this->redirectAndExit('director/config/deployments'); } } } icingaweb2-module-director-1.11.8/application/forms/DirectorDatafieldCategoryForm.php000066400000000000000000000020111516513262500307450ustar00rootroot00000000000000addHtmlHint( $this->translate( 'Data field categories allow to structure Data Fields. Fields with' . ' a category will be shown grouped by category.' ) ); $this->addElement('text', 'category_name', [ 'label' => $this->translate('Category name'), 'description' => $this->translate( 'The unique name of the category used for grouping your custom Data Fields.' ), 'required' => true, ]); $this->addElement('text', 'description', [ 'label' => $this->translate('Description'), ]); $this->setButtons(); } } icingaweb2-module-director-1.11.8/application/forms/DirectorDatafieldForm.php000066400000000000000000000236571516513262500272720ustar00rootroot00000000000000hasBeenSent()) { if ($this->shouldBeDeleted()) { $varname = $this->getSentValue('varname'); if ($cnt = CustomVariables::countAll($varname, $this->getDb())) { $this->askForVariableDeletion($varname, $cnt); } } elseif ($this->shouldBeRenamed()) { $varname = $this->object()->getOriginalProperty('varname'); if ($cnt = CustomVariables::countAll($varname, $this->getDb())) { $this->askForVariableRename( $varname, $this->getSentValue('varname'), $cnt ); } } } parent::onRequest(); } protected function askForVariableDeletion($varname, $cnt) { $msg = $this->translate( 'Leaving custom variables in place while removing the related field is' . ' perfectly legal and might be a desired operation. This way you can' . ' no longer modify related custom variables in the Director GUI, but' . ' the variables themselves will stay there and continue to be deployed.' . ' When you re-add a field for the same variable later on, everything' . ' will continue to work as before' ); $this->addBoolean('wipe_vars', array( 'label' => $this->translate('Wipe related vars'), 'description' => sprintf($msg, $this->getSentValue('varname')), 'required' => true, )); if ($wipe = $this->getSentValue('wipe_vars')) { if ($wipe === 'y') { CustomVariables::deleteAll($varname, $this->getDb()); } } else { $this->abortDeletion(); $this->addError( sprintf( $this->translate('Also wipe all "%s" custom variables from %d objects?'), $varname, $cnt ) ); $this->getElement('wipe_vars')->addError( sprintf( $this->translate( 'There are %d objects with a related property. Should I also' . ' remove the "%s" property from them?' ), $cnt, $varname ) ); } } protected function askForVariableRename($oldname, $newname, $cnt) { $msg = $this->translate( 'Leaving custom variables in place while renaming the related field is' . ' perfectly legal and might be a desired operation. This way you can' . ' no longer modify related custom variables in the Director GUI, but' . ' the variables themselves will stay there and continue to be deployed.' . ' When you re-add a field for the same variable later on, everything' . ' will continue to work as before' ); $this->addBoolean('rename_vars', array( 'label' => $this->translate('Rename related vars'), 'description' => sprintf($msg, $this->getSentValue('varname')), 'required' => true, )); if ($wipe = $this->getSentValue('rename_vars')) { if ($wipe === 'y') { CustomVariables::renameAll($oldname, $newname, $this->getDb()); } } else { $this->abortDeletion(); $this->addError( sprintf( $this->translate('Also rename all "%s" custom variables to "%s" on %d objects?'), $oldname, $newname, $cnt ) ); $this->getElement('rename_vars')->addError( sprintf( $this->translate( 'There are %d objects with a related property. Should I also' . ' rename the "%s" property to "%s" on them?' ), $cnt, $oldname, $newname ) ); } } public function setup() { $this->addHtmlHint( $this->translate( 'Data fields allow you to customize input controls for Icinga custom' . ' variables. Once you defined them here, you can provide them through' . ' your defined templates. This gives you a granular control over what' . ' properties your users should be allowed to configure in which way.' ) ); $this->addElement('text', 'varname', array( 'label' => $this->translate('Field name'), 'description' => $this->translate( 'This will be the name of the custom variable in the rendered Icinga configuration.' ), 'required' => true, )); $this->addElement('text', 'caption', array( 'label' => $this->translate('Caption'), 'required' => true, 'description' => $this->translate( 'The caption which should be displayed to your users when this field' . ' is shown' ) )); $this->addElement('textarea', 'description', array( 'label' => $this->translate('Description'), 'description' => $this->translate( 'An extended description for this field. Will be shown as soon as a' . ' user puts the focus on this field' ), 'rows' => '3', )); $this->addElement('select', 'category_id', [ 'label' => $this->translate('Data Field Category'), 'multiOptions' => $this->optionalEnum($this->enumCategories()), ]); $error = false; try { $types = $this->enumDataTypes(); } catch (Exception $e) { $error = $e->getMessage(); $types = $this->optionalEnum(array()); } $this->addElement('select', 'datatype', array( 'label' => $this->translate('Data type'), 'description' => $this->translate('Field type'), 'required' => true, 'multiOptions' => $types, 'class' => 'autosubmit', )); if ($error) { $this->getElement('datatype')->addError($error); } $object = $this->object(); try { if ($class = $this->getSentValue('datatype')) { if ($class && array_key_exists($class, $types)) { $this->addSettings($class); } } elseif ($class = $object->get('datatype')) { $this->addSettings($class); } // TODO: next line looks like obsolete duplicate code to me $this->addSettings(); } catch (Exception $e) { $this->getElement('datatype')->addError($e->getMessage()); } foreach ($object->getSettings() as $key => $val) { if ($el = $this->getElement($key)) { $el->setValue($val); } } $this->setButtons(); } public function shouldBeRenamed() { $object = $this->object(); return $object->hasBeenLoadedFromDb() && $object->getOriginalProperty('varname') !== $this->getSentValue('varname'); } protected function addSettings($class = null) { if ($class === null) { $class = $this->getValue('datatype'); } if ($class !== null) { if (! class_exists($class)) { throw new ConfigurationError( 'The hooked class "%s" for this data field does no longer exist', $class ); } $class::addSettingsFormFields($this); } } protected function clearOutdatedSettings() { $names = array(); $object = $this->object(); $global = array('varname', 'description', 'caption', 'datatype'); /** @var \Zend_Form_Element $el */ foreach ($this->getElements() as $el) { if ($el->getIgnore()) { continue; } $name = $el->getName(); if (in_array($name, $global)) { continue; } $names[$name] = $name; } foreach ($object->getSettings() as $setting => $value) { if (! array_key_exists($setting, $names)) { unset($object->$setting); } } } public function onSuccess() { $this->clearOutdatedSettings(); if ($class = $this->getValue('datatype')) { if (array_key_exists($class, $this->enumDataTypes())) { $this->addHidden('format', $class::getFormat()); } } parent::onSuccess(); } protected function enumDataTypes() { $hooks = Hook::all('Director\\DataType'); $enum = [null => $this->translate('- please choose -')]; /** @var DataTypeHook $hook */ foreach ($hooks as $hook) { $enum[get_class($hook)] = $hook->getName(); } return $enum; } protected function enumCategories() { $db = $this->getDb()->getDbAdapter(); return $db->fetchPairs( $db->select()->from('director_datafield_category', ['id', 'category_name']) ); } } icingaweb2-module-director-1.11.8/application/forms/DirectorDatalistEntryForm.php000066400000000000000000000045441516513262500301760ustar00rootroot00000000000000addElement('text', 'entry_name', [ 'label' => $this->translate('Key'), 'required' => true, 'description' => $this->translate( 'Will be stored as a custom variable value when this entry' . ' is chosen from the list' ) ]); $this->addElement('text', 'entry_value', [ 'label' => $this->translate('Label'), 'required' => true, 'description' => $this->translate( 'This will be the visible caption for this entry' ) ]); $rolesConfig = Config::app('roles', true); $roles = []; foreach ($rolesConfig as $name => $role) { $roles[$name] = $name; } $this->addElement('extensibleSet', 'allowed_roles', [ 'label' => $this->translate('Allowed roles'), 'required' => false, 'multiOptions' => $roles, 'description' => $this->translate( 'Allow to use this entry only to users with one of these Icinga Web 2 roles' ) ]); $this->addHidden('list_id', $this->datalist->get('id')); $this->addHidden('format', 'string'); if (!$this->isNew()) { $this->addHidden('entry_name', $this->object->get('entry_name')); } $this->addSimpleDisplayGroup(['entry_name', 'entry_value', 'allowed_roles'], 'entry', [ 'legend' => $this->isNew() ? $this->translate('Add data list entry') : $this->translate('Modify data list entry') ]); $this->setButtons(); } /** * @param DirectorDatalist $list * @return $this */ public function setList(DirectorDatalist $list) { $this->datalist = $list; /** @var Db $db */ $db = $list->getConnection(); $this->setDb($db); return $this; } } icingaweb2-module-director-1.11.8/application/forms/DirectorDatalistForm.php000066400000000000000000000026201516513262500271450ustar00rootroot00000000000000addElement('text', 'list_name', array( 'label' => $this->translate('List name'), 'description' => $this->translate( 'Data lists are mainly used as data providers for custom variables' . ' presented as dropdown boxes boxes. You can manually manage' . ' their entries here in place, but you could also create dedicated' . ' sync rules after creating a new empty list. This would allow you' . ' to keep your available choices in sync with external data providers' ), 'required' => true, )); $this->addSimpleDisplayGroup(array('list_name'), 'list', array( 'legend' => $this->translate('Data list') )); $this->setButtons(); } public function onSuccess() { $this->object()->set('owner', self::username()); parent::onSuccess(); } protected static function username() { $auth = Auth::getInstance(); if ($auth->isAuthenticated()) { return $auth->getUser()->getUsername(); } else { return ''; } } } icingaweb2-module-director-1.11.8/application/forms/DirectorJobForm.php000066400000000000000000000100311516513262500261050ustar00rootroot00000000000000enumJobTypes(); $this->addElement('select', 'job_class', array( 'label' => $this->translate('Job Type'), 'required' => true, 'multiOptions' => $this->optionalEnum($jobTypes), 'description' => $this->translate( 'These are different available job types' ), 'class' => 'autosubmit' )); if (! $jobClass = $this->getJobClass()) { return; } if ($desc = $jobClass::getDescription($this)) { $this->addHtmlHint($desc); } $this->addBoolean( 'disabled', array( 'label' => $this->translate('Disabled'), 'description' => $this->translate( 'This allows to temporarily disable this job' ) ), 'n' ); $this->addElement('text', 'run_interval', array( 'label' => $this->translate('Run interval'), 'description' => $this->translate( 'Execution interval for this job, in seconds' ), 'value' => $jobClass::getSuggestedRunInterval($this) )); $periods = $this->db->enumTimeperiods(); if (!empty($periods)) { $this->addElement( 'select', 'timeperiod_id', array( 'label' => $this->translate('Time period'), 'description' => $this->translate( 'The name of a time period within this job should be active.' . ' Supports only simple time periods (weekday and multiple' . ' time definitions)' ), 'multiOptions' => $this->optionalEnum($periods), ) ); } $this->addElement('text', 'job_name', array( 'label' => $this->translate('Job name'), 'description' => $this->translate( 'A short name identifying this job. Use something meaningful,' . ' like "Import Puppet Hosts"' ), 'required' => true, )); $this->addSettings(); $this->setButtons(); } public function getSentOrObjectSetting($name, $default = null) { if ($this->hasObject()) { $value = $this->getSentValue($name); if ($value === null) { /** @var DbObjectWithSettings $object */ $object = $this->getObject(); return $object->getSetting($name, $default); } else { return $value; } } else { return $this->getSentValue($name, $default); } } protected function getJobClass($class = null) { if ($class === null) { $class = $this->getSentOrObjectValue('job_class'); } if (array_key_exists($class, $this->enumJobTypes())) { return $class; } return null; } protected function addSettings($class = null) { if (! $class = $this->getJobClass($class)) { return; } $class::addSettingsFormFields($this); foreach ($this->object()->getSettings() as $key => $val) { if ($el = $this->getElement($key)) { $el->setValue($val); } } } protected function enumJobTypes() { /** @var JobHook[] $hooks */ $hooks = Hook::all('Director\\Job'); $enum = array(); foreach ($hooks as $hook) { $enum[get_class($hook)] = $hook->getName(); } asort($enum); return $enum; } } icingaweb2-module-director-1.11.8/application/forms/IcingaAddServiceForm.php000066400000000000000000000124701516513262500270340ustar00rootroot00000000000000object === null) { $this->object = IcingaService::create( ['object_type' => 'object'], $this->db ); } $this->addSingleImportElement(true); if (empty($this->enumServiceTemplates())) { $this->setSubmitLabel(false); return; } if (! ($imports = $this->getSentOrObjectValue('imports'))) { $this->setSubmitLabel($this->translate('Next')); $this->groupMainProperties(); return; } $this->removeElement('imports'); $this->addHidden('imports', $imports); $this->setElementValue('imports', $imports); $this->addNameElement(); $name = $this->getSentOrObjectValue('object_name'); if (empty($name)) { $this->setElementValue('object_name', $imports); } $this->groupMainProperties() ->setButtons(); } protected function groupMainProperties($importsFirst = false) { $elements = [ 'object_type', 'imports', 'object_name', ]; $this->addDisplayGroup($elements, 'object_definition', [ 'decorators' => [ 'FormElements', ['HtmlTag', ['tag' => 'dl']], 'Fieldset', ], 'order' => self::GROUP_ORDER_OBJECT_DEFINITION, 'legend' => $this->translate('Main properties') ]); return $this; } /** * @param bool $required * @return $this */ protected function addSingleImportElement($required = null) { $enum = $this->enumServiceTemplates(); if (empty($enum)) { if ($required) { if ($this->hasBeenSent()) { $this->addError($this->translate('No service has been chosen')); } else { if ($this->hasPermission(Permission::ADMIN)) { $html = sprintf( $this->translate('Please define a %s first'), Link::create( $this->translate('Service Template'), 'director/service/add', ['type' => 'template'] ) ); } else { $html = $this->translate('No Service Templates have been provided yet'); } $this->addHtml('

' . $html . '

'); } } return $this; } $this->addElement('text', 'imports', [ 'label' => $this->translate('Service'), 'description' => $this->translate('Choose a service template'), 'required' => true, 'data-suggestion-context' => 'servicetemplates', 'class' => 'autosubmit director-suggest' ]); return $this; } protected function enumServiceTemplates() { $tpl = $this->getDb()->enumIcingaTemplates('service'); return array_combine($tpl, $tpl); } /** * @param IcingaHost[] $hosts * @return $this */ public function setHosts(array $hosts) { $this->hosts = $hosts; return $this; } /** * @param IcingaHost $host * @return $this */ public function setHost(IcingaHost $host) { $this->host = $host; return $this; } protected function addNameElement() { $this->addElement('text', 'object_name', [ 'label' => $this->translate('Name'), 'required' => true, 'description' => $this->translate( 'Name for the Icinga service you are going to create' ) ]); return $this; } public function onSuccess() { if ($this->host !== null) { if ($id = $this->host->get('id')) { $this->object->set('host_id', $id); } else { $this->object->set('host', $this->host->getObjectName()); } parent::onSuccess(); return; } $plain = $this->object->toPlainObject(); $db = $this->object->getConnection(); // TODO: Test this: foreach ($this->hosts as $host) { $service = IcingaService::fromPlainObject($plain, $db) ->set('host_id', $host->get('id')); $this->getDbObjectStore()->store($service); } $msg = sprintf( $this->translate('The service "%s" has been added to %d hosts'), $this->object->getObjectName(), count($this->hosts) ); $this->redirectOnSuccess($msg); } } icingaweb2-module-director-1.11.8/application/forms/IcingaAddServiceSetForm.php000066400000000000000000000062361516513262500275130ustar00rootroot00000000000000object === null) { $this->object = IcingaServiceSet::create( ['object_type' => 'object'], $this->db ); } $object = $this->object(); if ($this->hasBeenSent()) { $object->set('object_name', $this->getSentValue('imports')); $object->set('imports', $object->getObjectName()); } if (! $object->hasBeenLoadedFromDb()) { $this->addSingleImportsElement(); } if (count($object->get('imports'))) { $description = $object->getResolvedProperty('description'); if ($description) { $this->addHtmlHint($description); } } $this->addHidden('object_type', 'object'); $this->setButtons(); } protected function setObjectSuccessUrl() { if ($this->host) { $this->setSuccessUrl( 'director/host/services', array('name' => $this->host->getObjectName()) ); } else { parent::setObjectSuccessUrl(); } } public function setHost(IcingaHost $host) { $this->host = $host; return $this; } /** * @param IcingaHost[] $hosts * @return $this */ public function setHosts(array $hosts) { $this->hosts = $hosts; return $this; } protected function addSingleImportsElement() { $enum = $this->enumAllowedTemplates(); $this->addElement('select', 'imports', array( 'label' => $this->translate('Service set'), 'description' => $this->translate( 'The service Set that should be assigned' ), 'required' => true, 'multiOptions' => $this->optionallyAddFromEnum($enum), 'class' => 'autosubmit' )); return $this; } public function onSuccess() { if ($this->host !== null) { $this->object->set('host_id', $this->host->get('id')); parent::onSuccess(); return; } $plain = $this->object->toPlainObject(); $db = $this->object->getConnection(); foreach ($this->hosts as $host) { IcingaServiceSet::fromPlainObject($plain, $db) ->set('host_id', $host->get('id')) ->store(); } $msg = sprintf( $this->translate('The Service Set "%s" has been added to %d hosts'), $this->object->getObjectName(), count($this->hosts) ); $this->redirectOnSuccess($msg); } } icingaweb2-module-director-1.11.8/application/forms/IcingaApiUserForm.php000066400000000000000000000011311516513262500263630ustar00rootroot00000000000000addHidden('object_type', 'external_object'); $this->addElement('text', 'object_name', array( 'label' => $this->translate('Name'), 'required' => true, )); $this->addElement('password', 'password', array( 'label' => $this->translate('Password'), 'required' => true, )); $this->setButtons(); } } icingaweb2-module-director-1.11.8/application/forms/IcingaCloneObjectForm.php000066400000000000000000000233411516513262500272110ustar00rootroot00000000000000branch && $this->branch->isBranch(); $branchOnly = $this->object->get('id') === null; if ( $isBranch && $this->object->isTemplate() && ! $this->object instanceof IcingaServiceSet ) { $this->addHtml(Hint::error($this->translate( 'Templates cannot be cloned in Configuration Branches' ))); $this->submitLabel = false; return; } $name = $this->object->getObjectName(); $this->addElement('text', 'new_object_name', array( 'label' => $this->translate('New name'), 'required' => true, 'value' => $name, )); if (!$branchOnly && Acl::instance()->hasPermission(Permission::ADMIN)) { $this->addElement('select', 'clone_type', array( 'label' => 'Clone type', 'required' => true, 'multiOptions' => array( 'equal' => $this->translate('Clone the object as is, preserving imports'), 'flat' => $this->translate('Flatten all inherited properties, strip imports'), ) )); } if ( !$branchOnly && ($this->object instanceof IcingaHost || $this->object instanceof IcingaServiceSet) ) { $this->addBoolean('clone_services', [ 'label' => $this->translate('Clone Services'), 'description' => $this->translate( 'Also clone single Services defined for this Host' ) ], 'y'); } if (!$branchOnly && $this->object instanceof IcingaHost) { $this->addBoolean('clone_service_sets', [ 'label' => $this->translate('Clone Service Sets'), 'description' => $this->translate( 'Also clone single Service Sets defined for this Host' ) ], 'y'); } if ($this->object instanceof IcingaService) { if ($this->object->get('service_set_id') !== null) { $this->addElement('select', 'target_service_set', [ 'label' => $this->translate('Target Service Set'), 'description' => $this->translate( 'Clone this service to the very same or to another Service Set' ), 'multiOptions' => $this->enumServiceSets(), 'value' => $this->object->get('service_set_id') ]); } elseif ($this->object->get('host_id') !== null) { $this->addElement('text', 'target_host', [ 'label' => $this->translate('Target Host'), 'description' => $this->translate( 'Clone this service to the very same or to another Host' ), 'value' => $this->object->get('host'), 'class' => "autosubmit director-suggest", 'data-suggestion-context' => 'HostsAndTemplates', ]); } } if ( ($this->object->isTemplate() || $this->object instanceof IcingaCommand) && $this->object->supportsFields() ) { $this->addBoolean('clone_fields', [ 'label' => $this->translate('Clone Template Fields'), 'description' => $this->translate( 'Also clone fields provided by this Template' ) ], 'y'); } $this->submitLabel = sprintf( $this->translate('Clone "%s"'), $name ); } public function setBranch(Branch $branch) { $this->branch = $branch; return $this; } public function setObjectBaseUrl($url) { $this->baseObjectUrl = $url; return $this; } public function onSuccess() { $object = $this->object; $table = $object->getTableName(); $type = $object->getShortTableName(); $connection = $object->getConnection(); $db = $connection->getDbAdapter(); $newName = $this->getValue('new_object_name'); $resolve = Acl::instance()->hasPermission(Permission::ADMIN) && $this->getValue('clone_type') === 'flat'; $msg = sprintf( 'The %s "%s" has been cloned from "%s"', $type, $newName, $object->getObjectName() ); $isBranch = $this->branch && $this->branch->isBranch(); if ( $isBranch && $this->object->isTemplate() && ! $this->object instanceof IcingaServiceSet ) { throw new IcingaException('Cloning templates is not available for Branches'); } if ($object->isTemplate() && $object->getObjectName() === $newName) { throw new IcingaException( $this->translate('Name needs to be changed when cloning a Template') ); } $new = $object::fromPlainObject( $object->toPlainObject($resolve), $connection )->set('object_name', $newName); if ($new->isExternal()) { $new->set('object_type', 'object'); } if ($set = $this->getValue('target_service_set')) { $new->set( 'service_set_id', IcingaServiceSet::loadWithAutoIncId((int) $set, $connection)->get('id') ); } elseif ($host = $this->getValue('target_host')) { $new->set('host', $host); } $services = []; $sets = []; if ($object instanceof IcingaHost) { $new->set('api_key', null); if ($this->getValue('clone_services') === 'y') { $services = $object->fetchServices(); } if ($this->getValue('clone_service_sets') === 'y') { $sets = $object->fetchServiceSets(); } } elseif ($object instanceof IcingaServiceSet) { if ($this->getValue('clone_services') === 'y') { $services = $object->fetchServices(); } } if ($this->getValue('clone_fields') === 'y') { $fields = $db->fetchAll( $db->select() ->from($table . '_field') ->where("{$type}_id = ?", $object->get('id')) ); } else { $fields = []; } $store = new DbObjectStore($connection, $this->branch); if ($store->store($new)) { $newId = $new->get('id'); foreach ($services as $service) { $clone = IcingaService::fromPlainObject( $service->toPlainObject(), $connection ); if ($new instanceof IcingaHost) { if ($isBranch) { $clone->set('host', $newName); } else { $clone->set('host_id', $newId); } } elseif ($new instanceof IcingaServiceSet) { if ($isBranch) { $clone->set('service_set', $newName); } else { $clone->set('service_set_id', $newId); } } $store->store($clone); } foreach ($sets as $set) { $newSet = IcingaServiceSet::fromPlainObject( $set->toPlainObject(), $connection ); if ($isBranch) { $newSet->set('host', $newName); } else { $newSet->set('host_id', $newId); } $store->store($newSet); } foreach ($fields as $row) { $row->{"{$type}_id"} = $newId; $db->insert($table . '_field', (array) $row); } if ($new instanceof IcingaServiceSet) { $this->setSuccessUrl( 'director/serviceset', $new->getUrlParams() ); } else { $this->setSuccessUrl( $this->baseObjectUrl ?: 'director/' . strtolower($type), $new->getUrlParams() ); } $this->redirectOnSuccess($msg); } } protected function enumServiceSets() { $db = $this->object->getConnection()->getDbAdapter(); return $db->fetchPairs( $db->select() ->from('icinga_service_set', ['id', 'object_name']) ->where('object_type = ?', 'template') ->order('object_name') ); } public function setObject(IcingaObject $object) { $this->object = $object; return $this; } } icingaweb2-module-director-1.11.8/application/forms/IcingaCommandArgumentForm.php000066400000000000000000000157341516513262500301120ustar00rootroot00000000000000commandObject = $object; $this->setDb($object->getConnection()); return $this; } public function setup() { $this->addHidden('command_id', $this->commandObject->get('id')); $this->addElement('text', 'argument_name', array( 'label' => $this->translate('Argument name'), 'filters' => array('StringTrim'), 'description' => $this->translate('e.g. -H or --hostname, empty means "skip_key"') )); $this->addElement('text', 'description', array( 'label' => $this->translate('Description'), 'description' => $this->translate('Description of the argument') )); $this->addElement('select', 'argument_format', array( 'label' => $this->translate('Value type'), 'multiOptions' => array( 'string' => $this->translate('String'), 'expression' => $this->translate('Icinga DSL') ), 'description' => $this->translate( 'Whether the argument value is a string (allowing macros like $host$)' . ' or an Icinga DSL lambda function (will be enclosed with {{ ... }}' ), 'class' => 'autosubmit', )); if ($this->getSentOrObjectValue('argument_format') === 'expression') { $this->addElement('textarea', 'argument_value', array( 'label' => $this->translate('Value'), 'description' => $this->translate( 'An Icinga DSL expression, e.g.: var cmd = macro("$cmd$");' . ' return typeof(command) == String ...' ), 'rows' => 3 )); } else { $this->addElement('text', 'argument_value', array( 'label' => $this->translate('Value'), 'description' => $this->translate( 'e.g. 5%, $host.name$, $lower$%:$upper$%' ) )); } $this->addElement('text', 'sort_order', array( 'label' => $this->translate('Position'), 'description' => $this->translate( 'Leave empty for non-positional arguments. Can be a positive or' . ' negative number and influences argument ordering' ) )); $this->addElement('select', 'set_if_format', array( 'label' => $this->translate('Condition format'), 'multiOptions' => array( 'string' => $this->translate('String'), 'expression' => $this->translate('Icinga DSL') ), 'description' => $this->translate( 'Whether the set_if parameter is a string (allowing macros like $host$)' . ' or an Icinga DSL lambda function (will be enclosed with {{ ... }}' ), 'class' => 'autosubmit', )); if ($this->getSentOrObjectValue('set_if_format') === 'expression') { $this->addElement('textarea', 'set_if', array( 'label' => $this->translate('Condition (set_if)'), 'description' => $this->translate( 'An Icinga DSL expression that returns a boolean value, e.g.: var cmd = bool(macro("$cmd$"));' . ' return cmd ...' ), 'rows' => 3 )); } else { $this->addElement('text', 'set_if', array( 'label' => $this->translate('Condition (set_if)'), 'description' => $this->translate( 'Only set this parameter if the argument value resolves to a' . ' numeric value. String values are not supported' ) )); } $this->addBoolean('repeat_key', array( 'label' => $this->translate('Repeat key'), 'description' => $this->translate( 'Whether this parameter should be repeated when multiple values' . ' (read: array) are given' ) )); $this->addBoolean('skip_key', array( 'label' => $this->translate('Skip key'), 'description' => $this->translate( 'Whether the parameter name should not be passed to the command.' . ' Per default, the parameter name (e.g. -H) will be appended,' . ' so no need to explicitly set this to "No".' ) )); $this->addBoolean('required', array( 'label' => $this->translate('Required'), 'required' => false, 'description' => $this->translate('Whether this argument should be required') )); $this->setButtons(); } protected function deleteObject($object) { $cmd = $this->commandObject; $msg = sprintf( $this->translate('%s argument "%s" has been removed'), $this->translate($this->getObjectShortClassName()), $object->argument_name ); // TODO: remove argument_id, once verified that it is no longer in use $url = $this->getSuccessUrl()->without('argument_id')->without('argument'); $cmd->arguments()->remove($object->argument_name); if ($this->branch->isBranch()) { $this->getDbObjectStore()->store($cmd); $this->setSuccessUrl($url); } else { if ($cmd->store()) { $this->setSuccessUrl($url); } } $this->redirectOnSuccess($msg); } public function onSuccess() { $object = $this->object(); $cmd = $this->commandObject; if ($object->get('argument_name') === null) { $object->set('skip_key', true); $object->set('argument_name', $cmd->getNextSkippableKeyName()); } if ($object->hasBeenModified()) { $cmd->arguments()->set( $object->get('argument_name'), $object ); $msg = sprintf( $this->translate('The argument %s has successfully been stored'), $object->get('argument_name') ); $this->getDbObjectStore()->store($cmd); } else { if ($this->isApiRequest()) { $this->setHttpResponseCode(304); } $msg = $this->translate('No action taken, object has not been modified'); } $this->setSuccessUrl('director/command/arguments', [ 'argument' => $object->get('argument_name'), 'name' => $cmd->getObjectName() ]); $this->redirectOnSuccess($msg); } } icingaweb2-module-director-1.11.8/application/forms/IcingaCommandForm.php000066400000000000000000000117021516513262500263760ustar00rootroot00000000000000addObjectTypeElement(); if (! $this->hasObjectType()) { return; } $this->addElement('select', 'methods_execute', array( 'label' => $this->translate('Command type'), 'multiOptions' => array( null => '- please choose -', $this->translate('Plugin commands') => array( 'PluginCheck' => 'Plugin Check Command', 'PluginNotification' => 'Notification Plugin Command', 'PluginEvent' => 'Event Plugin Command', ), $this->translate('Internal commands') => array( 'IcingaCheck' => 'Icinga Check Command', 'ClusterCheck' => 'Icinga Cluster Check Command', 'ClusterZoneCheck' => 'Icinga Cluster Zone Check Command', 'IdoCheck' => 'Ido Check Command', 'RandomCheck' => 'Random Check Command', ) ), 'required' => ! $this->isTemplate(), 'description' => $this->translate( 'Plugin Check commands are what you need when running checks agains' . ' your infrastructure. Notification commands will be used when it' . ' comes to notify your users. Event commands allow you to trigger' . ' specific actions when problems occur. Some people use them for' . ' auto-healing mechanisms, like restarting services or rebooting' . ' systems at specific thresholds' ), 'class' => 'autosubmit' )); $nameLabel = $this->isTemplate() ? $this->translate('Name') : $this->translate('Command name'); $this->addElement('text', 'object_name', array( 'label' => $nameLabel, 'required' => true, 'description' => $this->translate('Identifier for the Icinga command you are going to create') )); $this->addImportsElement(false); $this->addElement('text', 'command', array( 'label' => $this->translate('Command'), 'required' => ! $this->isTemplate(), 'description' => $this->translate( 'The command Icinga should run. Absolute paths are accepted as provided,' . ' relative paths are prefixed with "PluginDir + ", similar Constant prefixes are allowed.' . ' Spaces will lead to separation of command path and standalone arguments. Please note that' . ' this means that we do not support spaces in plugin names and paths right now.' ) )); $this->addElement('text', 'timeout', array( 'label' => $this->translate('Timeout'), 'description' => $this->translate( 'Optional command timeout. Allowed values are seconds or durations postfixed with a' . ' specific unit (e.g. 1m or also 3m 30s).' ) )); $descIsString = [ $this->translate('Render the command as a plain string instead of an array.'), $this->translate('If enabled you can not define arguments.'), $this->translate('Disabled by default, and should only be used in rare cases.'), $this->translate('WARNING, this can allow shell script injection via custom variables used in command.'), ]; $this->addBoolean( 'is_string', array( 'label' => $this->translate('Render as string'), 'description' => join(' ', $descIsString), ) ); $this->addDisabledElement(); $this->addZoneSection(); $this->setButtons(); } protected function addZoneSection() { $this->addZoneElement(true); $elements = array( 'zone_id', ); $this->addDisplayGroup($elements, 'clustering', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_CLUSTERING, 'legend' => $this->translate('Zone settings') )); return $this; } protected function enumAllowedTemplates() { $object = $this->object(); $tpl = $this->db->enum($object->getTableName()); if (empty($tpl)) { return array(); } $id = $object->get('id'); if (array_key_exists($id, $tpl)) { unset($tpl[$id]); } if (empty($tpl)) { return array(); } $tpl = array_combine($tpl, $tpl); return $tpl; } } icingaweb2-module-director-1.11.8/application/forms/IcingaDeleteObjectForm.php000066400000000000000000000016361516513262500273560ustar00rootroot00000000000000submitLabel = sprintf( $this->translate('YES, please delete "%s"'), $this->object->getObjectName() ); } public function onSuccess() { $object = $this->object; $msg = sprintf( 'The %s "%s" has been deleted', $object->getShortTableName(), $object->getObjectName() ); if ($object->delete()) { $this->redirectOnSuccess($msg); } } public function setObject(IcingaObject $object) { $this->object = $object; return $this; } } icingaweb2-module-director-1.11.8/application/forms/IcingaDependencyForm.php000066400000000000000000000317021516513262500271000ustar00rootroot00000000000000setupDependencyElements(); } /*** * @throws \Zend_Form_Exception */ protected function setupDependencyElements() { $this->addObjectTypeElement(); if (! $this->hasObjectType()) { $this->groupMainProperties(); return; } $this->addNameElement() ->addDisabledElement() ->addImportsElement() ->addObjectsElement() ->addBooleanElements() ->addPeriodElement() ->addAssignmentElements() ->addEventFilterElements(['states']) ->groupMainProperties() ->addZoneSection() ->setButtons(); } /** * @return $this * @throws \Zend_Form_Exception */ protected function addZoneSection() { $this->addZoneElement(true); $elements = array( 'zone_id', ); $this->addDisplayGroup($elements, 'clustering', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_CLUSTERING, 'legend' => $this->translate('Zone settings') )); return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addNameElement() { $this->addElement('text', 'object_name', [ 'label' => $this->translate('Name'), 'required' => true, 'description' => $this->translate('Name for the Icinga dependency you are going to create') ]); return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addAssignmentElements() { if (!$this->object || !$this->object->isApplyRule()) { return $this; } $this->addElement('select', 'apply_to', [ 'label' => $this->translate('Apply to'), 'description' => $this->translate( 'Whether this dependency should affect hosts or services' ), 'required' => true, 'class' => 'autosubmit', 'multiOptions' => $this->optionalEnum([ 'host' => $this->translate('Hosts'), 'service' => $this->translate('Services'), ]) ]); $applyTo = $this->getSentOrObjectValue('apply_to'); if (! $applyTo) { return $this; } $suggestionContext = ucfirst($applyTo) . 'FilterColumns'; $this->addAssignFilter([ 'suggestionContext' => $suggestionContext, 'description' => $this->translate( 'This allows you to configure an assignment filter. Please feel' . ' free to combine as many nested operators as you want. The' . ' "contains" operator is valid for arrays only. Please use' . ' wildcards and the = (equals) operator when searching for' . ' partial string matches, like in *.example.com' ) ]); return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addPeriodElement() { $periods = $this->db->enumTimeperiods(); if (empty($periods)) { return $this; } $this->addElement( 'select', 'period_id', array( 'label' => $this->translate('Time period'), 'description' => $this->translate( 'The name of a time period which determines when this' . ' notification should be triggered. Not set by default.' ), 'multiOptions' => $this->optionalEnum($periods), ) ); return $this; } /** * @return $this */ protected function addBooleanElements() { $this->addBoolean('disable_checks', [ 'label' => $this->translate('Disable Checks'), 'description' => $this->translate( 'Whether to disable checks when this dependency fails.' . ' Defaults to false.' ) ], null); $this->addBoolean('disable_notifications', [ 'label' => $this->translate('Disable Notifications'), 'description' => $this->translate( 'Whether to disable notifications when this dependency fails.' . ' Defaults to true.' ) ], null); $this->addBoolean('ignore_soft_states', [ 'label' => $this->translate('Ignore Soft States'), 'description' => $this->translate( 'Whether to ignore soft states for the reachability calculation.' . ' Defaults to true.' ) ], null); return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addObjectsElement() { $dependency = $this->getObject(); $parentHost = $dependency->get('parent_host'); if ($parentHost === null) { $parentHostVar = $dependency->get('parent_host_var'); if ($parentHostVar !== null && \strlen($parentHostVar) > 0) { $parentHost = '$' . $dependency->get('parent_host_var') . '$'; } } $parentHostDescription = $this->translate('Optional. The parent host.'); $applyTo = $this->getSentOrObjectValue('apply_to'); $parentHostValidator = new Zend_Validate_Callback(function ($value) use ($applyTo) { if ($applyTo === 'host' && $this->isCustomVar($value)) { return explode('.', trim($value, '$'))[0] === 'host'; } return true; }); $parentHostValidator->setMessage( $this->translate('The parent host cannot be a service custom variable for a host dependency'), Zend_Validate_Callback::INVALID_VALUE ); if ($applyTo === 'service') { $additionalDescription = $this->translate( 'You might want to refer to Host or Service Custom Variables via $host|service.vars.varname$' ); } else { $additionalDescription = $this->translate( 'You might want to refer to Host Custom Variables via $host.vars.varname$' ); } $parentHostDescription .= ' ' . $additionalDescription; $this->addElement('text', 'parent_host', [ 'label' => $this->translate('Parent Host'), 'description' => $parentHostDescription, 'class' => "autosubmit director-suggest", 'data-suggestion-context' => 'hostnames', 'order' => 10, 'required' => $this->isObject(), 'value' => $parentHost, 'validators' => [$parentHostValidator] ]); $sentParent = $this->getSentOrObjectValue('parent_host'); if (!empty($sentParent) || $dependency->isApplyRule()) { $parentService = $dependency->get('parent_service'); if ($parentService === null) { $parentServiceVar = $dependency->get('parent_service_by_name'); if ($parentServiceVar) { $parentService = '$' . $parentServiceVar . '$'; } } $parentServiceDescription = $this->translate( 'Optional. The parent service. If omitted this dependency' . ' object is treated as host dependency.' ); $parentServiceDescription .= ' ' . $additionalDescription; $parentServiceValidator = clone $parentHostValidator; $parentServiceValidator->setMessage( $this->translate('The parent service cannot be a service custom variable for a host dependency'), Zend_Validate_Callback::INVALID_VALUE ); $this->addElement('text', 'parent_service', [ 'label' => $this->translate('Parent Service'), 'description' => $parentServiceDescription, 'class' => "autosubmit director-suggest", 'data-suggestion-context' => 'servicenames', 'data-suggestion-for-host' => $sentParent, 'order' => 20, 'value' => $parentService, 'validators' => [$parentServiceValidator] ]); } // If configuring Object, allow selection of child host and/or service, // otherwise apply rules will determine child object. if ($dependency->isObject()) { $this->addElement('text', 'child_host', [ 'label' => $this->translate('Child Host'), 'description' => $this->translate('The child host.'), 'value' => $dependency->get('child_host'), 'order' => 30, 'class' => 'autosubmit director-suggest', 'required' => $this->isObject(), 'data-suggestion-context' => 'hostnames', ]); $sentChild = $this->getSentOrObjectValue('child_host'); if (!empty($sentChild)) { $this->addElement('text', 'child_service', [ 'label' => $this->translate('Child Service'), 'description' => $this->translate( 'Optional. The child service. If omitted this dependency' . ' object is treated as host dependency.' ), 'class' => 'autosubmit director-suggest', 'order' => 40, 'value' => $this->getObject()->get('child_service'), 'data-suggestion-context' => 'servicenames', 'data-suggestion-for-host' => $sentChild, ]); } } $this->addElement('text', 'redundancy_group', [ 'label' => $this->translate('Redundancy Group'), 'description' => $this->translate( 'The dependency redundancy group. A name for a group of which' . ' at least one single dependency must be fulfilled for the' . ' whole dependency to be fulfilled.' ), 'class' => "director-suggest", 'data-suggestion-context' => 'dependencyRedundancyGroups', 'required' => false, 'value' => $dependency->get('redundancy_group') ]); $elements = ['parent_host', 'child_host', 'parent_service', 'child_service']; $this->addDisplayGroup($elements, 'related_objects', [ 'decorators' => [ 'FormElements', ['HtmlTag', ['tag' => 'dl']], 'Fieldset', ], 'order' => self::GROUP_ORDER_RELATED_OBJECTS, 'legend' => $this->translate('Related Objects') ]); return $this; } /** * Hint: this is unused. Why? * * @param IcingaDependency $dependency * @return $this */ public function createApplyRuleFor(IcingaDependency $dependency) { $object = $this->object(); $object->setImports($dependency->getObjectName()); $object->set('object_type', 'apply'); $object->set('object_name', $dependency->getObjectName()); return $this; } protected function handleProperties(DbObject $object, &$values) { if ($this->hasBeenSent()) { if (isset($values['parent_host'])) { if ($this->isCustomVar($values['parent_host'])) { $values['parent_host_var'] = \trim($values['parent_host'], '$'); $values['parent_host'] = ''; } else { $values['parent_host_var'] = ''; } } if (isset($values['parent_service'])) { if ($this->isCustomVar($values['parent_service'])) { $values['parent_service_by_name'] = trim($values['parent_service'], '$'); $values['parent_service'] = ''; } else { $values['parent_service_by_name'] = ''; } } } parent::handleProperties($object, $values); } protected function isCustomVar($string) { return preg_match('/^\$(?:host|service)\.vars\..+\$$/', $string); } } icingaweb2-module-director-1.11.8/application/forms/IcingaEndpointForm.php000066400000000000000000000040261516513262500266010ustar00rootroot00000000000000addObjectTypeElement(); if (! $this->hasObjectType()) { return; } if ($this->isTemplate()) { $this->addElement('text', 'object_name', array( 'label' => $this->translate('Endpoint template name'), 'required' => true, 'description' => $this->translate('Name for the Icinga endpoint template you are going to create') )); } else { $this->addElement('text', 'object_name', array( 'label' => $this->translate('Endpoint'), 'required' => true, 'description' => $this->translate('Name for the Icinga endpoint you are going to create') )); } $this->addElement('text', 'host', array( 'label' => $this->translate('Endpoint address'), 'description' => $this->translate('IP address / hostname of remote node') )); $this->addElement('text', 'port', array( 'label' => $this->translate('Port'), 'description' => $this->translate('The port of the endpoint.'), )); $this->addElement('text', 'log_duration', array( 'label' => $this->translate('Log Duration'), 'description' => $this->translate('The log duration time.') )); $this->addElement('select', 'apiuser_id', array( 'label' => $this->translate('API user'), 'multiOptions' => $this->optionalEnum($this->db->enumApiUsers()) )); $this->addZoneElement(); if ($this->object->hasBeenLoadedFromDb()) { $imports = $this->object->get('imports'); if ($imports !== null && count($imports) > 0) { $this->addImportsElement(false); } } $this->setButtons(); } } icingaweb2-module-director-1.11.8/application/forms/IcingaForgetApiKeyForm.php000066400000000000000000000014671516513262500273600ustar00rootroot00000000000000host = $host; return $this; } public function setup() { $this->addStandaloneSubmitButton(sprintf( $this->translate('Drop Self Service API key'), $this->host->getObjectName() )); } public function onSuccess() { $this->host->set('api_key', null)->store(); $this->redirectOnSuccess(sprintf($this->translate( 'The Self Service API key for %s has been dropped' ), $this->host->getObjectName())); } } icingaweb2-module-director-1.11.8/application/forms/IcingaGenerateApiKeyForm.php000066400000000000000000000020231516513262500276510ustar00rootroot00000000000000host = $host; return $this; } public function setup() { if ($this->host->getProperty('api_key')) { $label = $this->translate('Regenerate Self Service API key'); } else { $label = $this->translate('Generate Self Service API key'); } $this->addStandaloneSubmitButton(sprintf( $label, $this->host->getObjectName() )); } public function onSuccess() { $host = $this->host; $host->generateApiKey(); $host->store(); $this->redirectOnSuccess(sprintf($this->translate( 'A new Self Service API key for %s has been generated' ), $host->getObjectName())); } } icingaweb2-module-director-1.11.8/application/forms/IcingaHostForm.php000066400000000000000000000322701516513262500257400ustar00rootroot00000000000000addObjectTypeElement(); if (! $this->hasObjectType()) { $this->groupMainProperties(); return; } $simpleImports = $this->isNew() && ! $this->isTemplate(); if ($simpleImports) { if (!$this->addSingleImportElement(true)) { $this->setSubmitLabel(false); return; } if (! ($imports = $this->getSentOrObjectValue('imports'))) { $this->setSubmitLabel($this->translate('Next')); $this->groupMainProperties(); return; } } $nameLabel = $this->isTemplate() ? $this->translate('Name') : $this->translate('Hostname'); $this->addElement('text', 'object_name', array( 'label' => $nameLabel, 'required' => true, 'spellcheck' => 'false', 'description' => $this->translate( 'Icinga object name for this host. This is usually a fully qualified host name' . ' but it could basically be any kind of string. To make things easier for your' . ' users we strongly suggest to use meaningful names for templates. E.g. "generic-host"' . ' is ugly, "Standard Linux Server" is easier to understand' ) )); if (! $simpleImports) { $this->addImportsElement(); } $this->addChoices('host') ->addDisplayNameElement() ->addAddressElements() ->addGroupsElement() ->addDisabledElement() ->groupMainProperties($simpleImports) ->addCheckCommandElements() ->addCheckExecutionElements() ->addExtraInfoElements() ->addClusteringElements() ->setButtons(); } /** * @return $this */ protected function addClusteringElements() { $this->addZoneElement(); $this->addBoolean('has_agent', [ 'label' => $this->translate('Icinga2 Agent'), 'description' => $this->translate( 'Whether this host has the Icinga 2 Agent installed' ), 'class' => 'autosubmit', ]); try { $hasAgent = $this->getSentOrResolvedObjectValue('has_agent') === 'y'; } catch (Exception $e) { $hasAgent = false; } if ($hasAgent) { $this->addBoolean('master_should_connect', [ 'label' => $this->translate('Establish connection'), 'description' => $this->translate( 'Whether the parent (master) node should actively try to connect to this agent' ), 'required' => true ]); $this->addBoolean('accept_config', [ 'label' => $this->translate('Accepts config'), 'description' => $this->translate('Whether the agent is configured to accept config'), 'required' => true ]); $this->addHidden('command_endpoint_id', null); $this->setSentValue('command_endpoint_id', null); $settings = $this->object->getConnection()->settings(); if ($settings->get('feature_custom_endpoint') === 'y' && ! $this->isTemplate()) { $this->addElement('text', 'custom_endpoint_name', [ 'label' => $this->translate('Custom Endpoint Name'), 'description' => $this->translate( 'Use a different name for the generated endpoint object than the host name' . ' and add a custom variable to allow services setting the correct command endpoint.' ), ]); } } else { if ($this->isTemplate()) { $this->addElement('select', 'command_endpoint_id', [ 'label' => $this->translate('Command endpoint'), 'description' => $this->translate( 'Setting a command endpoint allows you to force host checks' . ' to be executed by a specific endpoint. Please carefully' . ' study the related Icinga documentation before using this' . ' feature' ), 'multiOptions' => $this->optionalEnum($this->enumEndpoints()) ]); } foreach (['master_should_connect', 'accept_config'] as $key) { $this->addHidden($key, null); $this->setSentValue($key, null); } } $elements = [ 'zone_id', 'has_agent', 'master_should_connect', 'accept_config', 'command_endpoint_id', 'custom_endpoint_name', 'api_key', ]; $this->addDisplayGroup($elements, 'clustering', [ 'decorators' => [ 'FormElements', ['HtmlTag', ['tag' => 'dl']], 'Fieldset', ], 'order' => self::GROUP_ORDER_CLUSTERING, 'legend' => $this->translate('Icinga Agent and zone settings') ]); return $this; } /** * @param bool $required * @return bool */ protected function addSingleImportElement($required = null) { $enum = $this->enumHostTemplates(); if (empty($enum)) { if ($required) { if ($this->hasBeenSent()) { $this->addError($this->translate('No Host template has been chosen')); } else { if ($this->hasPermission(Permission::ADMIN)) { $html = sprintf( $this->translate('Please define a %s first'), Link::create( $this->translate('Host Template'), 'director/host/add', ['type' => 'template'] ) ); } else { $html = $this->translate('No Host Template has been provided yet'); } $this->addHtml('

' . $html . '

'); } } return false; } $this->addElement('select', 'imports', [ 'label' => $this->translate('Host Template'), 'description' => $this->translate( 'Choose a Host Template' ), 'required' => true, 'multiOptions' => $this->optionalEnum($enum), 'class' => 'autosubmit' ]); return true; } protected function enumHostTemplates() { $tpl = IcingaTemplateRepository::instanceByType('host', $this->getDb()) ->listAllowedTemplateNames(); return array_combine($tpl, $tpl); } /** * @return $this */ protected function addGroupsElement() { if ( $this->hasHostGroupRestriction() && ! $this->getAuth()->hasPermission(Permission::GROUPS_FOR_RESTRICTED_HOSTS) ) { return $this; } $this->addElement('extensibleSet', 'groups', array( 'label' => $this->translate('Groups'), 'suggest' => 'hostgroupnames', 'description' => $this->translate( 'Hostgroups that should be directly assigned to this node. Hostgroups can be useful' . ' for various reasons. You might assign service checks based on assigned hostgroup.' . ' They are also often used as an instrument to enforce restricted views in Icinga Web 2.' . ' Hostgroups can be directly assigned to single hosts or to host templates. You might' . ' also want to consider assigning hostgroups using apply rules' ) )); $applied = $this->getAppliedGroups(); if ($this->hasHostGroupRestriction()) { $applied = (new HostgroupRestriction($this->getDb(), $this->getAuth())) ->filterRestrictedHostgroups($applied); } if (! empty($applied)) { $this->addElement('simpleNote', 'applied_groups', [ 'label' => $this->translate('Applied groups'), 'value' => $this->createHostgroupLinks($applied), 'ignore' => true, ]); } $inherited = $this->getInheritedGroups(); if (! empty($inherited)) { /** @var BaseHtmlElement $links */ $links = $this->createHostgroupLinks($inherited); if (count($this->object()->getGroups())) { $links->addAttributes(['class' => 'strike-links']); /** @var BaseHtmlElement $link */ foreach ($links->getContent() as $link) { if ($link instanceof BaseHtmlElement) { $link->addAttributes([ 'title' => $this->translate( 'Group has been inherited, but will be overridden' . ' by locally assigned group(s)' ) ]); } } } $this->addElement('simpleNote', 'inherited_groups', [ 'label' => $this->translate('Inherited groups'), 'value' => $links, 'ignore' => true, ]); } return $this; } protected function getInheritedGroups() { if ($this->hasObject()) { return $this->object->listInheritedGroupNames(); } else { return []; } } protected function createHostgroupLinks($groups) { $links = []; foreach ($groups as $name) { if (! empty($links)) { $links[] = ', '; } $links[] = Link::create( $name, 'director/hostgroup', ['name' => $name], ['data-base-target' => '_next'] ); } return Html::tag('span', ['class' => 'host-group-links'], $links); } protected function getAppliedGroups() { if ($this->isNew()) { return []; } return $this->object()->getAppliedGroups(); } protected function hasHostGroupRestriction() { return $this->getAuth()->getRestrictions(Restriction::FILTER_HOSTGROUPS); } /** * @return $this */ protected function addAddressElements() { if ($this->isTemplate()) { return $this; } $this->addElement('text', 'address', array( 'label' => $this->translate('Host address'), 'description' => $this->translate( 'Host address. Usually an IPv4 address, but may be any kind of address' . ' your check plugin is able to deal with' ) )); $this->addElement('text', 'address6', array( 'label' => $this->translate('IPv6 address'), 'description' => $this->translate('Usually your hosts main IPv6 address') )); return $this; } /** * @return $this */ protected function addDisplayNameElement() { if ($this->isTemplate()) { return $this; } $this->addElement('text', 'display_name', array( 'label' => $this->translate('Display name'), 'spellcheck' => 'false', 'description' => $this->translate( 'Alternative name for this host. Might be a host alias or and kind' . ' of string helping your users to identify this host' ) )); return $this; } protected function enumEndpoints() { $db = $this->db->getDbAdapter(); $select = $db->select()->from('icinga_endpoint', [ 'id', 'object_name' ])->where( 'object_type IN (?)', ['object', 'external_object'] )->order('object_name'); return $db->fetchPairs($select); } public function onSuccess() { if ($this->hasHostGroupRestriction()) { $restriction = new HostgroupRestriction($this->getDb(), $this->getAuth()); if (! $restriction->allowsHost($this->object())) { throw new AuthenticationException($this->translate( 'Unable to store a host with the given properties because of insufficient permissions' )); } } parent::onSuccess(); } } icingaweb2-module-director-1.11.8/application/forms/IcingaHostGroupForm.php000066400000000000000000000023711516513262500267540ustar00rootroot00000000000000addHidden('object_type', 'object'); $this->addElement('text', 'object_name', [ 'label' => $this->translate('Hostgroup'), 'required' => true, 'description' => $this->translate('Icinga object name for this host group') ]); $this->addGroupDisplayNameElement() ->addAssignmentElements() ->setButtons(); } protected function addAssignmentElements() { $this->addAssignFilter([ 'suggestionContext' => 'HostFilterColumns', 'required' => false, 'description' => $this->translate( 'This allows you to configure an assignment filter. Please feel' . ' free to combine as many nested operators as you want. The' . ' "contains" operator is valid for arrays only. Please use' . ' wildcards and the = (equals) operator when searching for' . ' partial string matches, like in *.example.com' ) ]); return $this; } } icingaweb2-module-director-1.11.8/application/forms/IcingaHostSelfServiceForm.php000066400000000000000000000106701516513262500300730ustar00rootroot00000000000000hostName === null) { $this->addElement('text', 'object_name', array( 'label' => $this->translate('Host name'), 'required' => true, 'value' => $this->hostName, )); } $this->addElement('text', 'display_name', array( 'label' => $this->translate('Alias'), )); $this->addElement('text', 'address', array( 'label' => $this->translate('Host address'), 'description' => $this->translate( 'Host address. Usually an IPv4 address, but may be any kind of address' . ' your check plugin is able to deal with' ) )); $this->addElement('text', 'address6', array( 'label' => $this->translate('IPv6 address'), 'description' => $this->translate('Usually your hosts main IPv6 address') )); if ($this->template === null) { $this->addElement('text', 'key', array( 'label' => $this->translate('API Key'), 'ignore' => true, 'required' => true, )); } $this->submitLabel = sprintf( $this->translate('Register') ); } public function setHostName($name) { $this->hostName = $name; $this->removeElement('object_name'); return $this; } public function loadTemplateWithApiKey($key) { $this->template = IcingaHost::loadWithApiKey($key, $this->getDb()); if (! $this->template->isTemplate()) { throw new NotFoundError('Got invalid API key "%s"', $key); } if ($this->template->getResolvedProperty('has_agent') !== 'y') { throw new NotFoundError( 'Got valid API key "%s", but template is not for Agents', $key ); } $this->removeElement('key'); return $this->template; } public function listMissingRequiredFields() { $result = []; foreach ($this->getElements() as $element) { if (in_array('isEmpty', $element->getErrors())) { $result[] = $element->getName(); } } return $result; } public function isMissingRequiredFields() { return count($this->listMissingRequiredFields()) > 0; } public function onSuccess() { $db = $this->getDb(); if ($this->template === null) { $this->loadTemplateWithApiKey($this->getValue('key')); } $name = $this->hostName ?: $this->getValue('object_name'); if (IcingaHost::exists($name, $db)) { $host = IcingaHost::load($name, $db); if ($host->isTemplate()) { throw new SecurityException( 'You are not allowed to create "%s"', $name ); } if (null !== $host->getProperty('api_key')) { throw new SecurityException( 'The host "%s" has already been registered', $name ); } $propertyNames = ['display_name', 'address', 'address6']; foreach ($propertyNames as $property) { if (\strlen($value = $this->getValue($property)) > 0) { $host->set($property, $value); } } } else { $host = IcingaHost::create(array_filter($this->getValues(), 'strlen'), $db); $host->set('object_name', $name); $host->set('object_type', 'object'); $host->set('imports', [$this->template]); } $key = $host->generateApiKey(); $host->store($db); $this->hostApiKey = $key; } /** * @return string|null */ public function getHostApiKey() { return $this->hostApiKey; } public static function create(Db $db) { return static::load()->setDb($db); } } icingaweb2-module-director-1.11.8/application/forms/IcingaHostVarForm.php000066400000000000000000000020731516513262500264070ustar00rootroot00000000000000addElement('select', 'host_id', array( 'label' => $this->translate('Host'), 'description' => $this->translate('The name of the host'), 'multiOptions' => $this->optionalEnum($this->db->enumHosts()), 'required' => true )); $this->addElement('text', 'varname', array( 'label' => $this->translate('Name'), 'description' => $this->translate('host var name') )); $this->addElement('textarea', 'varvalue', array( 'label' => $this->translate('Value'), 'description' => $this->translate('host var value') )); $this->addElement('text', 'format', array( 'label' => $this->translate('Format'), 'description' => $this->translate('value format') )); } } icingaweb2-module-director-1.11.8/application/forms/IcingaImportObjectForm.php000066400000000000000000000031751516513262500274260ustar00rootroot00000000000000addNote($this->translate( "Importing an object means that its type will change from" . ' "external" to "object". That way it will make part of the' . ' next deployment. So in case you imported this object from' . ' your Icinga node make sure to remove it from your local' . ' configuration before issueing the next deployment. In case' . ' of a conflict nothing bad will happen, just your config' . " won't deploy." )); $this->submitLabel = sprintf( $this->translate('Import external "%s"'), $this->object->object_name ); } public function onSuccess() { $object = $this->object; if ($object->set('object_type', 'object')->store()) { $this->redirectOnSuccess(sprintf( $this->translate('%s "%s" has been imported"'), $object->getShortTableName(), $object->getObjectName() )); } else { $this->addError(sprintf( $this->translate('Failed to import %s "%s"'), $object->getShortTableName(), $object->getObjectName() )); } } public function setObject(IcingaObject $object) { $this->object = $object; return $this; } } icingaweb2-module-director-1.11.8/application/forms/IcingaMultiEditForm.php000066400000000000000000000215071516513262500267240ustar00rootroot00000000000000 Custom variable name map to its element's name in the form */ private $varNameMap = []; public function setObjects($objects) { $this->objects = $objects; $this->object = current($this->objects); $this->db = $this->object()->getConnection(); return $this; } public function isMultiObjectForm() { return true; } public function pickElementsFrom(QuickForm $form, $properties) { $this->relatedForm = $form; $this->propertiesToPick = $properties; return $this; } public function setup() { $object = $this->object; $loader = new IcingaObjectFieldLoader($object); $loader->prepareElements($this); $loader->addFieldsToForm($this); $this->varNameMap = $loader->getNameMap(); if ($form = $this->relatedForm) { if ($form instanceof DirectorObjectForm) { $form->setDb($object->getConnection()) ->setObject($object); } $form->prepareElements(); } else { $this->propertiesToPick = array(); } foreach ($this->propertiesToPick as $property) { if ($el = $form->getElement($property)) { $this->makeVariants($el); } } /** @var \Zend_Form_Element $el */ foreach ($this->getElements() as $el) { if ($this->isCustomVar($el->getName())) { $this->makeVariants($el); } } $this->setButtons(); } public function onSuccess() { foreach ($this->getValues() as $key => $value) { $this->setSubmittedMultiValue($key, $value); } $modified = $this->storeModifiedObjects(); if ($modified === 0) { $msg = $this->translate('No object has been modified'); } elseif ($modified === 1) { $msg = $this->translate('One object has been modified'); } else { $msg = sprintf( $this->translate('%d objects have been modified'), $modified ); } $this->redirectOnSuccess($msg); } /** * No default objects behaviour */ protected function onRequest() { IcingaObjectFormHook::callOnSetup($this); if ($this->hasBeenSent()) { $this->handlePost(); } } protected function handlePost() { $this->callOnRequestCallables(); if ($this->shouldBeDeleted()) { $this->deleteObjects(); } } protected function setSubmittedMultiValue($key, $value) { $parts = preg_split('/_/', $key); $objectsSum = array_pop($parts); $valueSum = array_pop($parts); $property = implode('_', $parts); if ($value === '') { $value = null; } foreach ($this->getVariants($property) as $json => $objects) { if ($valueSum !== sha1($json)) { continue; } if ($objectsSum !== sha1(json_encode($objects))) { continue; } if ($this->isCustomVar($property)) { $property = 'vars.' . $this->varNameMap[$property]; } foreach ($this->getObjects($objects) as $object) { $object->$property = $value; } } } /** * Check if the given property is a custom var * * @param string $property * * @return bool */ protected function isCustomVar(string $property): bool { return substr($property, 0, 4) === 'var_'; } protected function storeModifiedObjects() { $modified = 0; $store = $this->getDbObjectStore(); foreach ($this->objects as $object) { if ($object->hasBeenModified()) { $modified++; $store->store($object); } } return $modified; } protected function getDisplayGroupForElement(ZfElement $element) { if ($this->elementGroupMap === null) { $this->resolveDisplayGroups(); } $name = $element->getName(); if (array_key_exists($name, $this->elementGroupMap)) { $groupName = $this->elementGroupMap[$name]; if ($group = $this->getDisplayGroup($groupName)) { return $group; } elseif ($this->relatedForm) { return $this->stealDisplayGroup($groupName, $this->relatedForm); } } return null; } protected function stealDisplayGroup($name, QuickForm $form) { if ($group = $form->getDisplayGroup($name)) { $group = clone($group); $group->setElements(array()); $this->_displayGroups[$name] = $group; $this->_order[$name] = $group->getOrder(); $this->_orderUpdated = true; return $group; } return null; } protected function resolveDisplayGroups() { $this->elementGroupMap = array(); if ($form = $this->relatedForm) { $this->extractFormDisplayGroups($form); } $this->extractFormDisplayGroups($this); } protected function extractFormDisplayGroups(QuickForm $form) { /** @var \Zend_Form_DisplayGroup $group */ foreach ($form->getDisplayGroups() as $group) { $groupName = $group->getName(); foreach ($group->getElements() as $name => $e) { $this->elementGroupMap[$name] = $groupName; } } } protected function makeVariants(ZfElement $element) { $key = $element->getName(); $this->removeElement($key); $label = $element->getLabel(); $group = $this->getDisplayGroupForElement($element); $description = $element->getDescription(); foreach ($this->getVariants($key) as $json => $objects) { $value = json_decode($json); $checksum = sha1($json) . '_' . sha1(json_encode($objects)); $v = clone($element); $v->setName($key . '_' . $checksum); $v->setDescription($description . ' ' . $this->descriptionForObjects($objects)); $v->setLabel($label . $this->labelCount($objects)); $v->setValue($value); if ($group) { $group->addElement($v); } $this->addElement($v); } } protected function getVariants($key) { $variants = array(); if ($this->isCustomVar($key)) { $key = 'vars.' . $this->varNameMap[$key]; } foreach ($this->objects as $name => $object) { $value = json_encode($object->$key); if (! array_key_exists($value, $variants)) { $variants[$value] = array(); } $variants[$value][] = $name; } foreach ($variants as & $objects) { natsort($objects); } return $variants; } protected function descriptionForObjects($list) { return sprintf( $this->translate('Changing this value affects %d object(s): %s'), count($list), implode(', ', $list) ); } protected function labelCount($list) { return ' (' . count($list) . ')'; } protected function db() { if ($this->db === null) { $this->db = $this->object()->getConnection(); } return $this->db; } public function getObjects($names = null) { if ($names === null) { return $this->objects; } $res = array(); foreach ($names as $name) { $res[$name] = $this->objects[$name]; } return $res; } protected function deleteObjects() { $msg = sprintf( '%d objects of type "%s" have been removed', count($this->objects), $this->translate($this->object->getShortTableName()) ); $store = $this->getDbObjectStore(); foreach ($this->objects as $object) { $store->delete($object); } if ($this->listUrl) { $this->setSuccessUrl($this->listUrl); } $this->redirectOnSuccess($msg); } } icingaweb2-module-director-1.11.8/application/forms/IcingaNotificationForm.php000066400000000000000000000267551516513262500274640ustar00rootroot00000000000000addObjectTypeElement(); if (! $this->hasObjectType()) { $this->groupMainProperties(); return; } if ($this->isTemplate()) { $this->addElement('text', 'object_name', array( 'label' => $this->translate('Notification Template'), 'required' => true, 'description' => $this->translate('Name for the Icinga notification template you are going to create') )); } else { $this->addElement('text', 'object_name', array( 'label' => $this->translate('Notification'), 'required' => true, 'description' => $this->translate('Name for the Icinga notification you are going to create') )); $this->eventuallyAddNameRestriction( 'director/notification/apply/filter-by-name' ); } $this->addDisabledElement() ->addImportsElement() ->addUsersElement() ->addUsergroupsElement() ->addIntervalElement() ->addPeriodElement() ->addTimesElements() ->addAssignmentElements() ->addDisabledElement() ->addCommandElements() ->addEventFilterElements() ->addZoneElements() ->groupMainProperties() ->setButtons(); } protected function addZoneElements() { if (! $this->isTemplate()) { return $this; } $this->addZoneElement(); $this->addDisplayGroup(array('zone_id'), 'clustering', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_CLUSTERING, 'legend' => $this->translate('Zone settings') )); return $this; } /** * @return self */ protected function addAssignmentElements() { if (!$this->object || !$this->object->isApplyRule()) { return $this; } $this->addElement('select', 'apply_to', array( 'label' => $this->translate('Apply to'), 'description' => $this->translate( 'Whether this notification should affect hosts or services' ), 'required' => true, 'class' => 'autosubmit', 'multiOptions' => $this->optionalEnum( array( 'host' => $this->translate('Hosts'), 'service' => $this->translate('Services'), ) ) )); $applyTo = $this->getSentOrObjectValue('apply_to'); if (! $applyTo) { return $this; } $suggestionContext = ucfirst($applyTo) . 'FilterColumns'; $this->addAssignFilter([ 'required' => true, 'suggestionContext' => $suggestionContext, 'description' => $this->translate( 'This allows you to configure an assignment filter. Please feel' . ' free to combine as many nested operators as you want. The' . ' "contains" operator is valid for arrays only. Please use' . ' wildcards and the = (equals) operator when searching for' . ' partial string matches, like in *.example.com' ) ]); return $this; } /** * @return $this */ protected function addUsersElement() { $users = $this->enumUsers(); if (empty($users)) { $this->addElement('select', 'users', [ 'label' => $this->translate('Users'), 'description' => $this->translate('No User object has been created yet'), 'multiOptions' => $this->optionalEnum([]), ]); } else { $this->addElement('extensibleSet', 'users', [ 'label' => $this->translate('Users'), 'description' => $this->translate( 'Users that should be notified by this notifications' ), 'multiOptions' => $this->optionalEnum($users) ]); } $this->addElement('select', 'users_var', [ 'label' => $this->translate('Users Custom Variable'), 'multiOptions' => $this->enumDirectorObjectFields('user'), 'description' => $this->translate( 'If defined, Users from this Custom Variable will be combined with single users chosen below. ' . ' e.g.: when set to notification_contacts, this notification will pick Users from the Array' . ' service.vars.notification_contacts and fall back to host.vars.notification_contacts, in' . ' case the former one does not exist.' . ' Only Array type DirectorObject Fields for User objects are eligible for this feature.' ) ]); return $this; } /** * @return $this */ protected function addUsergroupsElement() { $groups = $this->enumUsergroups(); if (empty($groups)) { $this->addElement('select', 'user_groups', [ 'label' => $this->translate('Users'), 'description' => $this->translate('No UserGroup object has been created yet'), 'multiOptions' => $this->optionalEnum([]), ]); } else { $this->addElement('extensibleSet', 'user_groups', [ 'label' => $this->translate('User groups'), 'description' => $this->translate( 'User groups that should be notified by this notifications' ), 'multiOptions' => $this->optionalEnum($groups) ]); } $this->addElement('select', 'user_groups_var', [ 'label' => $this->translate('User Groups Custom Variable'), 'multiOptions' => $this->enumDirectorObjectFields('usergroup'), 'description' => $this->translate( 'If defined, User Groups from this Custom Variable will be combined with single Groups chosen below. ' . ' e.g.: when set to notification_groups, this notification will pick User Groups from the Array' . ' service.vars.notification_groups and fall back to host.vars.notification_groups, in' . ' case the former one does not exist.' . ' Only Array type DirectorObject Fields for User objects are eligible for this feature.' ) ]); return $this; } protected function enumDirectorObjectFields($objectType, $dataType = 'array') { $db = $this->db->getDbAdapter(); $query = $db->select() ->from(['df' => 'director_datafield'], ['k' => 'df.varname', 'v' => 'df.varname']) ->join( ['dfs' => 'director_datafield_setting'], $db->quoteInto('df.id = dfs.datafield_id AND dfs.setting_name = ?', 'icinga_object_type'), [] ) ->join( ['dft' => 'director_datafield_setting'], $db->quoteInto('df.id = dft.datafield_id AND dft.setting_name = ?', 'data_type'), [] ) ->where('df.datatype = ?', DataTypeDirectorObject::class) ->where('dfs.setting_value = ?', $objectType) ->where('dft.setting_value = ?', $dataType) ->order('df.varname'); return $this->optionalEnum($db->fetchPairs($query)); } /** * @return self */ protected function addIntervalElement() { $this->addElement( 'text', 'notification_interval', array( 'label' => $this->translate('Notification interval'), 'description' => $this->translate( 'The notification interval (in seconds). This interval is' . ' used for active notifications. Defaults to 30 minutes.' . ' If set to 0, re-notifications are disabled.' ) ) ); return $this; } /** * @return self */ protected function addTimesElements() { $this->addElement( 'text', 'times_begin', array( 'label' => $this->translate('First notification delay'), 'description' => $this->translate( 'Delay until the first notification should be sent' ) . '. ' . $this->getTimeValueInfo() ) ); $this->addElement( 'text', 'times_end', array( 'label' => $this->translate('Last notification'), 'description' => $this->translate( 'When the last notification should be sent' ) . '. ' . $this->getTimeValueInfo() ) ); return $this; } protected function getTimeValueInfo() { return $this->translate( 'Unit is seconds unless a suffix is given. Supported suffixes include' . ' ms (milliseconds), s (seconds), m (minutes), h (hours) and d (days).' ); } /** * @return self */ protected function addPeriodElement() { $periods = $this->db->enumTimeperiods(); if (empty($periods)) { return $this; } $this->addElement( 'select', 'period_id', array( 'label' => $this->translate('Time period'), 'description' => $this->translate( 'The name of a time period which determines when this' . ' notification should be triggered. Not set by default.' ), 'multiOptions' => $this->optionalEnum($periods), ) ); return $this; } /** * @return self */ protected function addCommandElements() { if (! $this->isTemplate()) { return $this; } $this->addElement('select', 'command_id', array( 'label' => $this->translate('Notification command'), 'description' => $this->translate('Check command definition'), 'multiOptions' => $this->optionalEnum($this->db->enumNotificationCommands()), 'class' => 'autosubmit', )); return $this; } protected function enumUsers() { $db = $this->db->getDbAdapter(); $select = $db->select()->from( 'icinga_user', array( 'name' => 'object_name', 'display' => 'COALESCE(display_name, object_name)' ) )->where('object_type = ?', 'object')->order('display'); return $db->fetchPairs($select); } protected function enumUsergroups() { $db = $this->db->getDbAdapter(); $select = $db->select()->from( 'icinga_usergroup', array( 'name' => 'object_name', 'display' => 'COALESCE(display_name, object_name)' ) )->where('object_type = ?', 'object')->order('display'); return $db->fetchPairs($select); } } icingaweb2-module-director-1.11.8/application/forms/IcingaObjectFieldForm.php000066400000000000000000000157151516513262500272020ustar00rootroot00000000000000icingaObject = $object; $this->className = get_class($object) . 'Field'; return $this; } public function setup() { $object = $this->icingaObject; $type = $object->getShortTableName(); $this->addHidden($type . '_id', $object->get('id')); $this->addHtmlHint( 'Custom data fields allow you to easily fill custom variables with' . " meaningful data. It's perfectly legal to override inherited fields." . ' You may for example want to allow "network devices" specifying any' . ' string for vars.snmp_community, but restrict "customer routers" to' . ' a specific set, shown as a dropdown.' ); // TODO: think about imported existing vars without fields // TODO: extract vars from command line (-> dummy) // TODO: do not suggest chosen ones if ($object instanceof IcingaCommand) { $command = $object; } elseif ($object->hasProperty('check_command_id')) { $command = $object->getResolvedRelated('check_command'); } else { $command = null; } $suggestions = $this->fieldSuggestion = new FormFieldSuggestion($command, $this->db->enumDatafields()); $fields = $suggestions->getCommandFields(); $this->addElement('select', 'datafield_id', [ 'label' => 'Field', 'required' => true, 'description' => 'Field to assign', 'class' => 'autosubmit', 'multiOptions' => $this->optionalEnum($fields) ]); if (empty($fields)) { // TODO: show message depending on permissions $msg = $this->translate( 'There are no data fields available. Please ask an administrator to create such' ); $this->getElement('datafield_id')->addError($msg); } if (($id = $this->getSentValue('datafield_id')) && ! ctype_digit($id)) { $this->addElement('text', 'caption', [ 'label' => $this->translate('Caption'), 'required' => true, 'ignore' => true, 'value' => trim($id, '$'), 'description' => $this->translate( 'The caption which should be displayed to your users when this field' . ' is shown' ) ]); $this->addElement('textarea', 'description', [ 'label' => $this->translate('Description'), 'description' => $this->translate( 'An extended description for this field. Will be shown as soon as a' . ' user puts the focus on this field' ), 'ignore' => true, 'value' => $command ? $suggestions->getDescription($id) : null, 'rows' => '3', ]); } $this->addElement('select', 'is_required', [ 'label' => $this->translate('Mandatory'), 'description' => $this->translate('Whether this field should be mandatory'), 'required' => true, 'multiOptions' => [ 'n' => $this->translate('Optional'), 'y' => $this->translate('Mandatory'), ] ]); if ($filterFields = $this->getFilterFields($object)) { $this->addFilterElement('var_filter', [ 'description' => $this->translate( 'You might want to show this field only when certain conditions are met.' . ' Be careful, if previously satisfied conditions are no longer met' . ' and the object is updated, the field\'s value will be lost.' ), 'columns' => $filterFields, ]); $this->addDisplayGroup([$this->getElement('var_filter')], 'field_filter', [ 'decorators' => [ 'FormElements', ['HtmlTag', ['tag' => 'dl']], 'Fieldset', ], 'order' => 30, 'legend' => $this->translate('Show based on filter') ]); } $this->setButtons(); } protected function onRequest() { parent::onRequest(); if ($this->getSentValue('delete') === $this->translate('Delete')) { $this->object()->delete(); $this->setSuccessUrl($this->getSuccessUrl()->without('field_id')); $this->redirectOnSuccess($this->translate('Field has been removed')); } } public function onSuccess() { $fieldId = $this->getValue('datafield_id'); if (! ctype_digit($fieldId)) { $field = DirectorDatafield::create([ 'varname' => trim($fieldId, '$'), 'caption' => $this->getValue('caption'), 'description' => $this->getValue('description'), 'datatype' => $this->fieldSuggestion && $this->fieldSuggestion->isBoolean($fieldId) ? DataTypeBoolean::class : DataTypeString::class ]); $field->store($this->getDb()); $this->setElementValue('datafield_id', $field->get('id')); $this->object()->set('datafield_id', $field->get('id')); } $this->object()->set('var_filter', $this->getValue('var_filter')); parent::onSuccess(); } protected static function getFilterFields(IcingaObject $object): array { $filterFields = []; $prefix = null; if ($object instanceof IcingaHost) { $prefix = 'host.vars.'; } elseif ($object instanceof IcingaService) { $prefix = 'service.vars.'; } if ($prefix) { $loader = new IcingaObjectFieldLoader($object); $fields = $loader->getFields(); foreach ($fields as $varName => $field) { $filterFields[$prefix . $field->get('varname')] = $field->get('caption'); } } return $filterFields; } } icingaweb2-module-director-1.11.8/application/forms/IcingaScheduledDowntimeForm.php000066400000000000000000000111411516513262500304240ustar00rootroot00000000000000isTemplate()) { $this->addElement('text', 'object_name', [ 'label' => $this->translate('Template name'), 'required' => true, ]); } else { $this->addElement('text', 'object_name', [ 'label' => $this->translate('Downtime name'), 'required' => true, ]); } if ($this->object()->isApplyRule()) { $this->eventuallyAddNameRestriction('director/scheduled-downtime/apply/filter-by-name'); } $this->addImportsElement(); $this->addElement('text', 'author', [ 'label' => $this->translate('Author'), 'description' => $this->translate( 'This name will show up as the author for ever related downtime' . ' comment' ), 'required' => ! $this->isTemplate() ]); $this->addElement('textarea', 'comment', [ 'label' => $this->translate('Comment'), 'description' => $this->translate( 'Every related downtime will show this comment' ), 'required' => ! $this->isTemplate(), 'rows' => 4, ]); $this->addBoolean('fixed', [ 'label' => $this->translate('Fixed'), 'description' => $this->translate( 'Whether this downtime is fixed or flexible. If unsure please' . ' check the related documentation:' . ' https://icinga.com/docs/icinga2/latest/doc/08-advanced-topics/#downtimes' ), 'required' => ! $this->isTemplate(), ]); $this->addElement('text', 'duration', [ 'label' => $this->translate('Duration'), 'description' => $this->translate( 'How long the downtime lasts. Only has an effect for flexible' . ' (non-fixed) downtimes. Time in seconds, supported suffixes' . ' include ms (milliseconds), s (seconds), m (minutes),' . ' h (hours) and d (days). To express "90 minutes" you might' . ' want to write 1h 30m' ) ]); $this->addDisabledElement(); $this->addAssignmentElements(); $this->setButtons(); } /** * @return $this * @throws \Zend_Form_Exception */ protected function addAssignmentElements() { if ($this->isTemplate()) { return $this; } $this->addElement('select', 'apply_to', [ 'label' => $this->translate('Apply to'), 'description' => $this->translate( 'Whether this dependency should affect hosts or services' ), 'required' => true, 'class' => 'autosubmit', 'multiOptions' => $this->optionalEnum([ 'host' => $this->translate('Hosts'), 'service' => $this->translate('Services'), ]) ]); $applyTo = $this->getSentOrObjectValue('apply_to'); if (! $applyTo) { return $this; } if ($applyTo === 'host') { $this->addBoolean('with_services', [ 'label' => $this->translate('With Services'), 'description' => $this->translate( 'Whether Downtimes should also explicitly be scheduled for' . ' all Services belonging to affected Hosts' ) ]); } $suggestionContext = ucfirst($applyTo) . 'FilterColumns'; $this->addAssignFilter([ 'suggestionContext' => $suggestionContext, 'required' => true, 'description' => $this->translate( 'This allows you to configure an assignment filter. Please feel' . ' free to combine as many nested operators as you want. The' . ' "contains" operator is valid for arrays only. Please use' . ' wildcards and the = (equals) operator when searching for' . ' partial string matches, like in *.example.com' ) ]); return $this; } protected function setObjectSuccessUrl() { $this->setSuccessUrl( 'director/scheduled-downtime', $this->object()->getUrlParams() ); } } icingaweb2-module-director-1.11.8/application/forms/IcingaScheduledDowntimeRangeForm.php000066400000000000000000000065631516513262500314150ustar00rootroot00000000000000addHidden('scheduled_downtime_id', $this->downtime->get('id')); $this->addElement('text', 'range_key', [ 'label' => $this->translate('Day(s)'), 'description' => $this->translate( 'Might be monday, tuesday or 2016-01-28 - have a look at the documentation for more examples' ), ]); $this->addElement('text', 'range_value', [ 'label' => $this->translate('Timeperiods'), 'description' => $this->translate( 'One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00' ), ]); $this->setButtons(); } public function setScheduledDowntime(IcingaScheduledDowntime $downtime) { $this->downtime = $downtime; $this->setDb($downtime->getConnection()); return $this; } /** * @param IcingaScheduledDowntimeRange $object * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function deleteObject($object) { $key = $object->get('range_key'); $downtime = $this->downtime; $downtime->ranges()->remove($key); $downtime->store(); $msg = sprintf( $this->translate('Time range "%s" has been removed from %s'), $key, $downtime->getObjectName() ); $url = $this->getSuccessUrl()->without( ['range', 'range_type'] ); $this->setSuccessUrl($url); $this->redirectOnSuccess($msg); } /** * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function onSuccess() { $object = $this->object(); if ($object->hasBeenModified()) { $this->downtime->ranges()->setRange( $this->getValue('range_key'), $this->getValue('range_value') ); } if ($this->downtime->hasBeenModified()) { if (! $object->hasBeenLoadedFromDb()) { $this->setHttpResponseCode(201); } $msg = sprintf( $object->hasBeenLoadedFromDb() ? $this->translate('The %s has successfully been stored') : $this->translate('A new %s has successfully been created'), $this->translate($this->getObjectShortClassName()) ); $this->downtime->store($this->db); } else { if ($this->isApiRequest()) { $this->setHttpResponseCode(304); } $msg = $this->translate('No action taken, object has not been modified'); } if ($object instanceof IcingaObject) { $this->setSuccessUrl( 'director/' . strtolower($this->getObjectShortClassName()), $object->getUrlParams() ); } $this->redirectOnSuccess($msg); } } icingaweb2-module-director-1.11.8/application/forms/IcingaServiceDictionaryMemberForm.php000066400000000000000000000022541516513262500316000ustar00rootroot00000000000000addHidden('object_type', 'object'); $this->addElement('text', 'object_name', [ 'label' => $this->translate('Name'), 'required' => !$this->object()->isApplyRule(), 'description' => $this->translate( 'Name for the instance you are going to create' ) ]); $this->groupMainProperties()->setButtons(); } protected function isNew() { return $this->object === null; } protected function deleteObject($object) { } protected function getObjectClassname() { return IcingaService::class; } public function succeeded() { return $this->succeeded; } public function onSuccess() { $this->succeeded = true; } } icingaweb2-module-director-1.11.8/application/forms/IcingaServiceForm.php000066400000000000000000000636301516513262500264270ustar00rootroot00000000000000applyGenerated = $applyGenerated; return $this; } public function setInheritedFrom($hostname) { $this->inheritedFrom = $hostname; return $this; } /** * @throws IcingaException * @throws ProgrammingError * @throws \Zend_Form_Exception */ public function setup() { if (!$this->isNew() || $this->providesOverrides()) { $this->tryToFetchHost(); } if ($this->providesOverrides()) { return; } if ($this->host && $this->set) { // Probably never reached, as providesOverrides includes this $this->setupOnHostForSet(); return; } if ($this->set !== null) { $this->setupSetRelatedElements(); } elseif ($this->host === null) { $this->setupServiceElements(); } else { $this->setupHostRelatedElements(); } } protected function tryToFetchHost() { try { if ($this->host === null) { $this->host = $this->object->getResolvedRelated('host'); } } catch (NestingError $nestingError) { // ignore for the form to load } } public function providesOverrides() { return $this->applyGenerated || $this->inheritedFrom || ($this->host && $this->set) || ($this->object && $this->object->usesVarOverrides()); } /** * @throws IcingaException * @throws ProgrammingError * @throws \Zend_Form_Exception */ protected function addFields() { if ($this->providesOverrides() && $this->hasBeenBlacklisted()) { $this->onAddedFields(); return; } else { parent::addFields(); } } /** * @throws IcingaException * @throws ProgrammingError * @throws \Zend_Form_Exception */ protected function onAddedFields() { if (! $this->providesOverrides()) { return; } $hasDeleteButton = false; $isBranch = $this->branch && $this->branch->isBranch(); if ($this->hasBeenBlacklisted()) { $this->addHtml( Hint::warning($this->translate('This Service has been deactivated on this host')), ['name' => 'HINT_blacklisted'] ); $group = null; if (! $isBranch) { $label = $this->translate('Reactivate'); $this->addDeleteButton($label); if (! $this->isBlacklistedInCurrentHost()) { $this->getElement($label) ->setAttrib( 'title', sprintf( $this->translate('This service is deactivated on host template "%s"'), $this->getBlacklistedAncestor()->getObjectName() ) ) ->setAttrib('disabled', true); } $hasDeleteButton = true; } $this->setSubmitLabel(false); } else { $this->addOverrideHint(); $group = $this->getDisplayGroup('custom_fields'); if (! $group) { foreach ($this->getDisplayGroups() as $groupName => $eventualGroup) { if (preg_match('/^custom_fields:/', $groupName)) { $group = $eventualGroup; break; } } } if ($group) { $elements = $group->getElements(); $group->setElements([$this->getElement('inheritance_hint')]); $group->addElements($elements); $this->setSubmitLabel($this->translate('Override vars')); } else { $this->addElementsToGroup( ['inheritance_hint'], 'custom_fields', 20, $this->translate('Hints regarding this service') ); $this->setSubmitLabel(false); } if (! $isBranch) { $this->addDeleteButton($this->translate('Deactivate')); $hasDeleteButton = true; } } if (! $this->hasSubmitButton() && $hasDeleteButton) { $this->addDisplayGroup([$this->deleteButtonName], 'buttons', [ 'decorators' => [ 'FormElements', ['HtmlTag', ['tag' => 'dl']], 'DtDdWrapper', ], 'order' => self::GROUP_ORDER_BUTTONS, ]); } } /** * @return IcingaHost|null */ public function getHost() { return $this->host; } /** * Hint: could be moved elsewhere * * @param IcingaService $object * @return IcingaObject|IcingaService|IcingaServiceSet * @throws \Icinga\Exception\NotFoundError */ protected static function getFirstParent(IcingaObject $object) { /** @var IcingaObject[] $objects */ $objects = $object->imports()->getObjects(); if (empty($objects)) { throw new RuntimeException('Something went wrong, got no parent'); } reset($objects); return current($objects); } private function getBlacklistedAncestor(): ?IcingaHost { if ($this->hasBeenBlacklisted() === false) { return null; } return $this->blacklistedAncestor; } private function isBlacklistedInCurrentHost(): bool { if ($this->hasBeenBlacklisted() === false) { return false; } $db = $this->db->getDbAdapter(); return (int) $db->fetchOne( $db->select()->from('icinga_host_service_blacklist', 'host_id') ->where('host_id = ?', $this->host->get('id')) ->where( 'service_id = ?', $this->getServiceToBeBlacklisted()->get('id') ) ); } /** * @return bool * @throws \Icinga\Exception\NotFoundError */ protected function hasBeenBlacklisted() { if (! $this->providesOverrides() || $this->object === null) { return false; } if ($this->blacklisted === null) { $host = $this->host; // Safety check, branches $hostId = (int) $host->get('id'); $service = $this->getServiceToBeBlacklisted(); $serviceId = $service->get('id'); if (! $hostId || ! $serviceId) { return false; } $db = $this->db->getDbAdapter(); if ($this->providesOverrides()) { $hostIds = $host->listAncestorIds(); $hostIds[] = $hostId; foreach ($hostIds as $hostId) { $host = IcingaHost::loadWithAutoIncId($hostId, $this->db); $ancestorIds = $host->listAncestorIds(); $ancestorIds[] = $hostId; $this->blacklisted = 1 === (int) $db->fetchOne( $db->select()->from('icinga_host_service_blacklist', 'COUNT(*)') ->where('host_id IN (?)', $ancestorIds) ->where('service_id = ?', $serviceId) ); if ($this->blacklisted) { $this->blacklistedAncestor = $host; break; } } } else { $this->blacklisted = false; } } return $this->blacklisted; } /** * @param $object * @throws IcingaException * @throws ProgrammingError * @throws \Zend_Db_Adapter_Exception */ protected function deleteObject($object) { /** @var IcingaService $object */ if ($this->providesOverrides()) { if ($this->hasBeenBlacklisted()) { $this->removeFromBlacklist(); } else { $this->blacklist(); } } else { parent::deleteObject($object); } } /** * @throws IcingaException * @throws \Zend_Db_Adapter_Exception */ protected function blacklist() { $host = $this->host; $service = $this->getServiceToBeBlacklisted(); $db = $this->db->getDbAdapter(); $host->unsetOverriddenServiceVars($this->object->getObjectName())->store(); if ( $db->insert('icinga_host_service_blacklist', [ 'host_id' => $host->get('id'), 'service_id' => $service->get('id') ]) ) { $msg = sprintf( $this->translate('%s has been deactivated on %s'), $service->getObjectName(), $host->getObjectName() ); $this->redirectOnSuccess($msg); } } /** * @return IcingaService * @throws \Icinga\Exception\NotFoundError */ protected function getServiceToBeBlacklisted() { if ($this->set) { return $this->object; } else { return self::getFirstParent($this->object); } } /** * @throws \Icinga\Exception\NotFoundError */ protected function removeFromBlacklist() { $host = $this->host; $service = $this->getServiceToBeBlacklisted(); $db = $this->db->getDbAdapter(); $where = implode(' AND ', [ $db->quoteInto('host_id = ?', $host->get('id')), $db->quoteInto('service_id = ?', $service->get('id')), ]); if ($db->delete('icinga_host_service_blacklist', $where)) { $msg = sprintf( $this->translate('%s is no longer deactivated on %s'), $service->getObjectName(), $host->getObjectName() ); $this->redirectOnSuccess($msg); } } /** * @param IcingaService $service * @return $this */ public function createApplyRuleFor(IcingaService $service) { $this->apply = $service; $object = $this->object(); $object->set('imports', $service->getObjectName()); $object->set('object_type', 'apply'); $object->set('object_name', $service->getObjectName()); return $this; } /** * @throws \Zend_Form_Exception */ protected function setupServiceElements() { if ($this->object) { $objectType = $this->object->get('object_type'); } elseif ($this->preferredObjectType) { $objectType = $this->preferredObjectType; } else { $objectType = 'template'; } $this->addHidden('object_type', $objectType); $forceCommandElements = $this->hasPermission(Permission::ADMIN); $this->addNameElement() ->addHostObjectElement() ->addImportsElement() ->addChoices('service') ->addGroupsElement() ->addDisabledElement() ->addApplyForElement() ->groupMainProperties() ->addAssignmentElements() ->addCheckCommandElements($forceCommandElements) ->addCheckExecutionElements() ->addExtraInfoElements() ->addAgentAndZoneElements() ->setButtons(); } /** * @throws IcingaException * @throws ProgrammingError */ protected function addOverrideHint() { if ($this->object && $this->object->usesVarOverrides()) { $hint = $this->translate( 'This service has been generated in an automated way, but still' . ' allows you to override the following properties in a safe way.' ); } elseif ($apply = $this->applyGenerated) { $hint = Html::sprintf( $this->translate( 'This service has been generated using the %s apply rule, assigned where %s' ), Link::create( $apply->getObjectName(), 'director/service', ['id' => $apply->get('id')], ['data-base-target' => '_next'] ), (string) Filter::fromQueryString($apply->assign_filter) ); } elseif ($this->host && $this->set) { $hint = Html::sprintf( $this->translate( 'This service belongs to the %s Service Set. Still, you might want' . ' to override the following properties for this host only.' ), Link::create( $this->set->getObjectName(), 'director/serviceset', ['id' => $this->set->get('id')], ['data-base-target' => '_next'] ) ); } elseif ($this->inheritedFrom) { $msg = $this->translate( 'This service has been inherited from %s. Still, you might want' . ' to change the following properties for this host only.' ); $name = $this->inheritedFrom; $link = Link::create( $name, 'director/service', [ 'host' => $name, 'name' => $this->object->getObjectName(), ], ['data-base-target' => '_next'] ); $hint = Html::sprintf($msg, $link); } else { throw new ProgrammingError('Got no override hint for your situation'); } $this->setSubmitLabel($this->translate('Override vars')); $this->addHtmlHint($hint, ['name' => 'inheritance_hint']); } protected function setupOnHostForSet() { $msg = $this->translate( 'This service belongs to the service set "%s". Still, you might want' . ' to change the following properties for this host only.' ); $name = $this->set->getObjectName(); $link = Link::create( $name, 'director/serviceset', ['name' => $name], ['data-base-target' => '_next'] ); $this->addHtmlHint( Html::sprintf($msg, $link), ['name' => 'inheritance_hint'] ); $this->addElementsToGroup( ['inheritance_hint'], 'custom_fields', 50, $this->translate('Custom properties') ); $this->setSubmitLabel($this->translate('Override vars')); } protected function addAssignmentElements() { $this->addAssignFilter([ 'suggestionContext' => 'HostFilterColumns', 'required' => true, 'description' => $this->translate( 'This allows you to configure an assignment filter. Please feel' . ' free to combine as many nested operators as you want. The' . ' "contains" operator is valid for arrays only. Please use' . ' wildcards and the = (equals) operator when searching for' . ' partial string matches, like in *.example.com' ) ]); return $this; } /** * @throws \Zend_Form_Exception */ protected function setupHostRelatedElements() { $this->addHidden('host', $this->host->getObjectName()); $this->addHidden('object_type', 'object'); $this->addImportsElement(); $imports = $this->getSentOrObjectValue('imports'); if ($this->hasBeenSent()) { $imports = $this->getElement('imports')->setValue($imports)->getValue(); } if ($this->isNew() && empty($imports)) { $this->groupMainProperties(); return; } $this->addNameElement() ->addChoices('service') ->addDisabledElement() ->addGroupsElement() ->groupMainProperties() ->addCheckCommandElements() ->addExtraInfoElements() ->setButtons(); $this->setDefaultNameFromTemplate($imports); } /** * @param IcingaHost $host * @return $this */ public function setHost(IcingaHost $host) { $this->host = $host; return $this; } /** * @throws \Zend_Form_Exception */ protected function setupSetRelatedElements() { $this->addHidden('service_set', $this->set->getObjectName()); $this->addHidden('object_type', 'apply'); $this->addImportsElement(); $this->setButtons(); $imports = $this->getSentOrObjectValue('imports'); if ($this->hasBeenSent()) { $imports = $this->getElement('imports')->setValue($imports)->getValue(); } if ($this->isNew() && empty($imports)) { $this->groupMainProperties(); return; } $this->addNameElement() ->addDisabledElement() ->addGroupsElement() ->groupMainProperties(); if ($this->hasPermission(Permission::ADMIN)) { $this->addCheckCommandElements(true) ->addCheckExecutionElements(true) ->addExtraInfoElements(); } $this->setDefaultNameFromTemplate($imports); } public function setServiceSet(IcingaServiceSet $set) { $this->set = $set; return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addNameElement() { $this->addElement('text', 'object_name', array( 'label' => $this->translate('Name'), 'required' => !$this->object()->isApplyRule(), 'description' => $this->translate( 'Name for the Icinga service you are going to create' ) )); if ($this->object()->isApplyRule()) { $this->eventuallyAddNameRestriction('director/service/apply/filter-by-name'); } return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addHostObjectElement() { if ($this->isObject()) { $this->addElement('select', 'host', [ 'label' => $this->translate('Host'), 'required' => true, 'multiOptions' => $this->optionalEnum($this->enumHostsAndTemplates()), 'description' => $this->translate( 'Choose the host this single service should be assigned to' ) ]); } return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addApplyForElement() { if ($this->object->isApplyRule()) { $hostProperties = IcingaHost::enumProperties( $this->object->getConnection(), 'host.', new ArrayCustomVariablesFilter() ); $this->addElement('select', 'apply_for', array( 'label' => $this->translate('Apply For'), 'class' => 'assign-property autosubmit', 'multiOptions' => $this->optionalEnum($hostProperties, $this->translate('None')), 'description' => $this->translate( 'Evaluates the apply for rule for ' . 'all objects with the custom attribute specified. ' . 'E.g selecting "host.vars.custom_attr" will generate "for (config in ' . 'host.vars.array_var)" where "config" will be accessible through "$config$". ' . 'NOTE: only custom variables of type "Array" are eligible.' ) )); } return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addGroupsElement() { $groups = $this->enumServicegroups(); if (! empty($groups)) { $this->addElement('extensibleSet', 'groups', array( 'label' => $this->translate('Groups'), 'multiOptions' => $this->optionallyAddFromEnum($groups), 'positional' => false, 'description' => $this->translate( 'Service groups that should be directly assigned to this service.' . ' Servicegroups can be useful for various reasons. They are' . ' helpful to provided service-type specific view in Icinga Web 2,' . ' either for custom dashboards or as an instrument to enforce' . ' restrictions. Service groups can be directly assigned to' . ' single services or to service templates.' ) )); } return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addAgentAndZoneElements() { if (!$this->isTemplate()) { return $this; } $this->optionalBoolean( 'use_agent', $this->translate('Run on agent'), $this->translate( 'Whether the check commmand for this service should be executed' . ' on the Icinga agent' ) ); $this->addZoneElement(); $elements = array( 'use_agent', 'zone_id', ); $this->addDisplayGroup($elements, 'clustering', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_CLUSTERING, 'legend' => $this->translate('Icinga Agent and zone settings') )); return $this; } protected function enumHostsAndTemplates() { if ($this->branch && $this->branch->isBranch()) { return $this->enumHosts(); } return [ $this->translate('Templates') => $this->enumHostTemplates(), $this->translate('Hosts') => $this->enumHosts(), ]; } protected function enumHostTemplates() { $names = array_values($this->db->enumHostTemplates()); return array_combine($names, $names); } protected function enumHosts() { $db = $this->db->getDbAdapter(); $table = new ObjectsTableHost($this->db, $this->getAuth()); if ($this->branch && $this->branch->isBranch()) { $table->setBranchUuid($this->branch->getUuid()); } $result = []; foreach ($db->fetchAll($table->getQuery()->reset(\Zend_Db_Select::LIMIT_COUNT)) as $row) { $result[$row->object_name] = $row->object_name; } return $result; } protected function enumServicegroups() { $db = $this->db->getDbAdapter(); $select = $db->select()->from( 'icinga_servicegroup', array( 'name' => 'object_name', 'display' => 'COALESCE(display_name, object_name)' ) )->where('object_type = ?', 'object')->order('display'); return $db->fetchPairs($select); } protected function succeedForOverrides() { $vars = array(); foreach ($this->object->vars() as $key => $var) { $vars[$key] = $var->getValue(); } $host = $this->host; $serviceName = $this->object->getObjectName(); $this->host->overrideServiceVars($serviceName, (object) $vars); if ($host->hasBeenModified()) { $msg = sprintf( empty($vars) ? $this->translate('All overrides have been removed from "%s"') : $this->translate('The given properties have been stored for "%s"'), $this->translate($host->getObjectName()) ); $this->getDbObjectStore()->store($host); } else { if ($this->isApiRequest()) { $this->setHttpResponseCode(304); } $msg = $this->translate('No action taken, object has not been modified'); } $this->redirectOnSuccess($msg); } public function onSuccess() { if ($this->providesOverrides()) { $this->succeedForOverrides(); return; } parent::onSuccess(); } /** * @param array $imports */ protected function setDefaultNameFromTemplate($imports) { if ($this->hasBeenSent()) { $name = $this->getSentOrObjectValue('object_name'); if ($name === null || !strlen($name)) { $this->setElementValue('object_name', end($imports)); $this->object->set('object_name', end($imports)); } } } } icingaweb2-module-director-1.11.8/application/forms/IcingaServiceGroupForm.php000066400000000000000000000024061516513262500274360ustar00rootroot00000000000000addHidden('object_type', 'object'); $this->addElement('text', 'object_name', [ 'label' => $this->translate('Servicegroup'), 'required' => true, 'description' => $this->translate('Icinga object name for this service group') ]); $this->addGroupDisplayNameElement() ->addAssignmentElements() ->setButtons(); } protected function addAssignmentElements() { $this->addAssignFilter([ 'suggestionContext' => 'ServiceFilterColumns', 'required' => false, 'description' => $this->translate( 'This allows you to configure an assignment filter. Please feel' . ' free to combine as many nested operators as you want. The' . ' "contains" operator is valid for arrays only. Please use' . ' wildcards and the = (equals) operator when searching for' . ' partial string matches, like in *.example.com' ) ]); return $this; } } icingaweb2-module-director-1.11.8/application/forms/IcingaServiceSetForm.php000066400000000000000000000100701516513262500270710ustar00rootroot00000000000000host === null) { $this->setupTemplate(); } else { $this->setupHost(); } $this->setButtons(); } protected function setupTemplate() { $this->addElement('text', 'object_name', [ 'label' => $this->translate('Service set name'), 'description' => $this->translate( 'A short name identifying this set of services' ), 'required' => true, ]) ->eventuallyAddNameRestriction('director/service_set/filter-by-name') ->addHidden('object_type', 'template') ->addDescriptionElement() ->addAssignmentElements(); } protected function setObjectSuccessUrl() { if ($this->host) { $this->setSuccessUrl( 'director/host/services', array('name' => $this->host->getObjectName()) ); } else { parent::setObjectSuccessUrl(); } } protected function setupHost() { $object = $this->object(); if ($this->hasBeenSent()) { $object->set('object_name', $this->getSentValue('imports')); $object->set('imports', $object->object_name); } if (! $object->hasBeenLoadedFromDb()) { $this->addSingleImportsElement(); } if (count($object->get('imports'))) { $description = $object->getResolvedProperty('description'); if ($description) { $this->addHtmlHint($description); } } $this->addHidden('object_type', 'object'); $this->addHidden('host', $this->host->getObjectName()); $this->groupMainProperties(); } public function setHost(IcingaHost $host) { $this->host = $host; return $this; } protected function addSingleImportsElement() { $enum = $this->enumAllowedTemplates(); $this->addElement('select', 'imports', array( 'label' => $this->translate('Service set'), 'description' => $this->translate( 'The service set that should be assigned to this host' ), 'required' => true, 'multiOptions' => $this->optionallyAddFromEnum($enum), 'class' => 'autosubmit' )); return $this; } protected function addDescriptionElement() { $this->addElement('textarea', 'description', array( 'label' => $this->translate('Description'), 'description' => $this->translate( 'A meaningful description explaining your users what to expect' . ' when assigning this set of services' ), 'rows' => '3', 'required' => ! $this->isTemplate(), )); return $this; } protected function addAssignmentElements() { if (! $this->hasPermission(Permission::SERVICE_SET_APPLY)) { return $this; } $this->addAssignFilter([ 'suggestionContext' => 'HostFilterColumns', 'description' => $this->translate( 'This allows you to configure an assignment filter. Please feel' . ' free to combine as many nested operators as you want. You' . ' might also want to skip this, define it later and/or just' . ' add this set of services to single hosts. The "contains"' . ' operator is valid for arrays only. Please use wildcards and' . ' the = (equals) operator when searching for partial string' . ' matches, like in *.example.com' ) ]); return $this; } } icingaweb2-module-director-1.11.8/application/forms/IcingaServiceVarForm.php000066400000000000000000000021201516513262500270630ustar00rootroot00000000000000addElement('select', 'service_id', array( 'label' => $this->translate('Service'), 'description' => $this->translate('The name of the service'), 'multiOptions' => $this->optionalEnum($this->db->enumServices()), 'required' => true )); $this->addElement('text', 'varname', array( 'label' => $this->translate('Name'), 'description' => $this->translate('service var name') )); $this->addElement('textarea', 'varvalue', array( 'label' => $this->translate('Value'), 'description' => $this->translate('service var value') )); $this->addElement('text', 'format', array( 'label' => $this->translate('Format'), 'description' => $this->translate('value format') )); } } icingaweb2-module-director-1.11.8/application/forms/IcingaTemplateChoiceForm.php000066400000000000000000000114501516513262500277060ustar00rootroot00000000000000setDb($db)->setChoiceType($type); } public function optionallyLoad($name) { if ($name !== null) { /** @var IcingaTemplateChoice $class - cheating IDE */ $class = $this->getObjectClassname(); $this->setObject($class::load($name, $this->getDb())); } return $this; } protected function getObjectClassname() { if ($this->className === null) { return 'Icinga\\Module\\Director\\Objects\\IcingaTemplateChoice' . ucfirst($this->choiceType); } return $this->className; } public function setChoiceType($type) { $this->choiceType = $type; return $this; } public function setup() { $this->addElement('text', 'object_name', array( 'label' => $this->translate('Choice name'), 'required' => true, 'description' => $this->translate( 'This will be shown as a label for the given choice' ) )); $this->addElement('textarea', 'description', array( 'label' => $this->translate('Description'), 'rows' => 4, 'description' => $this->translate( 'A detailled description explaining what this choice is all about' ) )); $this->addElement('extensibleSet', 'members', array( 'label' => $this->translate('Available choices'), 'required' => true, 'description' => $this->translate( 'Your users will be allowed to choose among those templates' ), 'multiOptions' => $this->fetchUnboundTemplates() )); $this->addElement('text', 'min_required', array( 'label' => $this->translate('Minimum required'), 'description' => $this->translate( 'Choosing this many options will be mandatory for this Choice.' . ' Setting this to zero will leave this Choice optional, setting' . ' it to one results in a "required" Choice. You can use higher' . ' numbers to enforce multiple options, this Choice will then turn' . ' into a multi-selection element.' ), 'value' => 0, )); $this->addElement('text', 'max_allowed', array( 'label' => $this->translate('Allowed maximum'), 'description' => $this->translate( 'It will not be allowed to choose more than this many options.' . ' Setting it to one (1) will result in a drop-down box, a' . ' higher number will turn this into a multi-selection element.' ), 'value' => 1, )); $this->addElement('select', 'required_template', [ 'label' => $this->translate('Associated Template'), 'description' => $this->translate( 'Choose Choice Associated Template' ), 'required' => true, 'multiOptions' => $this->fetchUnboundTemplates(), ]); $this->setButtons(); } protected function setDefaultsFromObject(DbObject $object) { parent::setDefaultsFromObject($object); $this->getElement('required_template')->setValue($object->get('required_template')); } protected function fetchUnboundTemplates() { /** @var IcingaTemplateChoice $object */ $object = $this->object(); $db = $this->getDb()->getDbAdapter(); $table = $object->getObjectTableName(); $query = $db->select()->from( ['o' => $table], [ 'k' => 'o.object_name', 'v' => 'o.object_name', ] )->where("o.object_type = 'template'"); if ($object->hasBeenLoadedFromDb()) { $query->where( 'o.template_choice_id IS NULL OR o.template_choice_id = ?', $object->get('id') ); } else { $query->where('o.template_choice_id IS NULL'); } return $db->fetchPairs($query); } protected function setObjectSuccessUrl() { /** @var IcingaTemplateChoice $object */ $object = $this->object(); $this->setSuccessUrl( 'director/templatechoice/' . $object->getObjectShortTableName(), $object->getUrlParams() ); } } icingaweb2-module-director-1.11.8/application/forms/IcingaTimePeriodForm.php000066400000000000000000000047661516513262500270750ustar00rootroot00000000000000addElement('text', 'object_name', [ 'label' => $this->translate('Name'), 'required' => true, ]); $this->addElement('text', 'display_name', [ 'label' => $this->translate('Display Name'), ]); if ($this->isTemplate()) { $this->addElement('text', 'update_method', [ 'label' => $this->translate('Update Method'), 'value' => 'LegacyTimePeriod', ]); } else { // TODO: I'd like to skip this for objects inheriting from a template // with a defined update_method. However, unfortunately it's too // early for $this->object()->getResolvedProperty('update_method'). // Should be fixed. $this->addHidden('update_method', 'LegacyTimePeriod'); } $this->addIncludeExclude() ->addImportsElement() ->setButtons(); } /** * @return $this * @throws \Zend_Form_Exception */ protected function addIncludeExclude() { $periods = []; foreach ($this->db->enumTimeperiods() as $id => $period) { if ($this->object === null || $this->object->get('object_name') !== $period) { $periods[$period] = $period; } } if (empty($periods)) { return $this; } $this->addElement('extensibleSet', 'includes', [ 'label' => $this->translate('Include period'), 'multiOptions' => $this->optionalEnum($periods), 'description' => $this->translate( 'Include other time periods into this.' ), ]); $this->addElement('extensibleSet', 'excludes', [ 'label' => $this->translate('Exclude period'), 'multiOptions' => $this->optionalEnum($periods), 'description' => $this->translate( 'Exclude other time periods from this.' ), ]); $this->optionalBoolean( 'prefer_includes', $this->translate('Prefer includes'), $this->translate('Whether to prefer timeperiods includes or excludes. Default to true.') ); return $this; } } icingaweb2-module-director-1.11.8/application/forms/IcingaTimePeriodRangeForm.php000066400000000000000000000061301516513262500300350ustar00rootroot00000000000000addHidden('timeperiod_id', $this->period->get('id')); $this->addElement('text', 'range_key', array( 'label' => $this->translate('Day(s)'), 'description' => $this->translate( 'Might be monday, tuesday or 2016-01-28 - have a look at the documentation for more examples' ), )); $this->addElement('text', 'range_value', array( 'label' => $this->translate('Timerperiods'), 'description' => $this->translate( 'One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00' ), )); $this->setButtons(); } public function setTimePeriod(IcingaTimePeriod $period) { $this->period = $period; $this->setDb($period->getConnection()); return $this; } /** * @param IcingaTimePeriodRange $object */ protected function deleteObject($object) { $key = $object->get('range_key'); $period = $this->period; $period->ranges()->remove($key); $period->store(); $msg = sprintf( 'Time period range "%s" has been removed from %s', $key, $period->getObjectName() ); $url = $this->getSuccessUrl()->without( ['range', 'range_type'] ); $this->setSuccessUrl($url); $this->redirectOnSuccess($msg); } public function onSuccess() { $object = $this->object(); if ($object->hasBeenModified()) { $this->period->ranges()->setRange( $this->getValue('range_key'), $this->getValue('range_value') ); } if ($this->period->hasBeenModified()) { if (! $object->hasBeenLoadedFromDb()) { $this->setHttpResponseCode(201); } $msg = sprintf( $object->hasBeenLoadedFromDb() ? $this->translate('The %s has successfully been stored') : $this->translate('A new %s has successfully been created'), $this->translate($this->getObjectShortClassName()) ); $this->period->store($this->db); } else { if ($this->isApiRequest()) { $this->setHttpResponseCode(304); } $msg = $this->translate('No action taken, object has not been modified'); } if ($object instanceof IcingaObject) { $this->setSuccessUrl( 'director/' . strtolower($this->getObjectShortClassName()), $object->getUrlParams() ); } $this->redirectOnSuccess($msg); } } icingaweb2-module-director-1.11.8/application/forms/IcingaUserForm.php000066400000000000000000000140371516513262500257420ustar00rootroot00000000000000addObjectTypeElement(); if (! $this->hasObjectType()) { $this->groupMainProperties(); return; } if ($this->isTemplate()) { $this->addElement('text', 'object_name', array( 'label' => $this->translate('User template name'), 'required' => true, 'description' => $this->translate('Name for the Icinga user template you are going to create') )); } else { $this->addElement('text', 'object_name', array( 'label' => $this->translate('Username'), 'required' => true, 'description' => $this->translate('Name for the Icinga user object you are going to create') )); } if (! $this->isTemplate()) { $this->addElement('text', 'email', array( 'label' => $this->translate('Email'), 'description' => $this->translate('The Email address of the user.') )); $this->addElement('text', 'pager', array( 'label' => $this->translate('Pager'), 'description' => $this->translate('The pager address of the user.') )); } $this->addGroupsElement() ->addImportsElement() ->addDisplayNameElement() ->addEnableNotificationsElement() ->addDisabledElement() ->addZoneElements() ->addPeriodElement() ->addEventFilterElements() ->groupMainProperties() ->setButtons(); } /** * @return $this * @throws \Zend_Form_Exception */ protected function addZoneElements() { if (! $this->isTemplate()) { return $this; } $this->addZoneElement(); $this->addDisplayGroup(array('zone_id'), 'clustering', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_CLUSTERING, 'legend' => $this->translate('Zone settings') )); return $this; } /** * @return $this */ protected function addEnableNotificationsElement() { $this->optionalBoolean( 'enable_notifications', $this->translate('Send notifications'), $this->translate('Whether to send notifications for this user') ); return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addGroupsElement() { $groups = $this->enumUsergroups(); if (empty($groups)) { return $this; } $this->addElement('extensibleSet', 'groups', array( 'label' => $this->translate('Groups'), 'multiOptions' => $this->optionallyAddFromEnum($groups), 'positional' => false, 'description' => $this->translate( 'User groups that should be directly assigned to this user. Groups can be useful' . ' for various reasons. You might prefer to send notifications to groups instead of' . ' single users' ) )); return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addDisplayNameElement() { if ($this->isTemplate()) { return $this; } $this->addElement('text', 'display_name', array( 'label' => $this->translate('Display name'), 'description' => $this->translate( 'Alternative name for this user. In case your object name is a' . ' username, this could be the full name of the corresponding person' ) )); return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addPeriodElement() { $periods = $this->db->enumTimeperiods(); if (empty($periods)) { return $this; } $this->addElement( 'select', 'period_id', array( 'label' => $this->translate('Time period'), 'description' => $this->translate( 'The name of a time period which determines when notifications' . ' to this User should be triggered. Not set by default.' ), 'multiOptions' => $this->optionalEnum($periods), ) ); return $this; } /** * @throws \Zend_Form_Exception */ protected function groupObjectDefinition() { $elements = array( 'object_type', 'object_name', 'display_name', 'imports', 'groups', 'email', 'pager', 'period_id', 'enable_notifications', 'disabled', ); $this->addDisplayGroup($elements, 'object_definition', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_OBJECT_DEFINITION, 'legend' => $this->translate('User properties') )); } /** * @return array */ protected function enumUsergroups() { $db = $this->db->getDbAdapter(); $select = $db->select()->from( 'icinga_usergroup', array( 'name' => 'object_name', 'display' => 'COALESCE(display_name, object_name)' ) )->where('object_type = ?', 'object')->order('display'); return $db->fetchPairs($select); } } icingaweb2-module-director-1.11.8/application/forms/IcingaUserGroupForm.php000066400000000000000000000023071516513262500267540ustar00rootroot00000000000000addHidden('object_type', 'object'); $this->addElement('text', 'object_name', array( 'label' => $this->translate('Usergroup'), 'required' => true, 'description' => $this->translate('Icinga object name for this user group') )); $this->addGroupDisplayNameElement() ->addZoneElements() ->groupMainProperties() ->setButtons(); } /** * @return $this * @throws \Zend_Form_Exception */ protected function addZoneElements() { $this->addZoneElement(true); $this->addDisplayGroup(['zone_id'], 'clustering', [ 'decorators' => [ 'FormElements', ['HtmlTag', ['tag' => 'dl']], 'Fieldset', ], 'order' => self::GROUP_ORDER_CLUSTERING, 'legend' => $this->translate('Zone settings') ]); return $this; } } icingaweb2-module-director-1.11.8/application/forms/IcingaZoneForm.php000066400000000000000000000027011516513262500257320ustar00rootroot00000000000000addHidden('object_type', 'object'); $this->addElement('text', 'object_name', array( 'label' => $this->translate('Zone name'), 'required' => true, 'description' => $this->translate( 'Name for the Icinga zone you are going to create' ) )); $this->addElement('select', 'is_global', array( 'label' => $this->translate('Global zone'), 'description' => $this->translate( 'Whether this zone should be available everywhere. Please note that' . ' it rarely leads to the desired result when you try to distribute' . ' global zones in distrubuted environments' ), 'multiOptions' => array( 'n' => $this->translate('No'), 'y' => $this->translate('Yes'), ), 'required' => true, )); $this->addElement('select', 'parent_id', array( 'label' => $this->translate('Parent Zone'), 'description' => $this->translate('Chose an (optional) parent zone'), 'multiOptions' => $this->optionalEnum($this->db->enumZones()), )); $this->setButtons(); } } icingaweb2-module-director-1.11.8/application/forms/ImportCheckForm.php000066400000000000000000000024751516513262500261240ustar00rootroot00000000000000source = $source; return $this; } public function setup() { $this->submitLabel = false; $this->addElement('submit', 'submit', [ 'label' => $this->translate('Check for changes'), 'decorators' => ['ViewHelper'] ]); } public function onSuccess() { $source = $this->source; if ($source->checkForChanges()) { $this->setSuccessMessage( $this->translate('This Import Source provides modified data') ); } else { $this->setSuccessMessage( $this->translate( 'Nothing to do, data provided by this Import Source' . " didn't change since the last import run" ) ); } if ($source->get('import_state') === 'failing') { $this->addError($this->translate('Checking this Import Source failed')); } else { parent::onSuccess(); } } } icingaweb2-module-director-1.11.8/application/forms/ImportRowModifierForm.php000066400000000000000000000167151516513262500273370ustar00rootroot00000000000000addHidden('source_id', $this->source->id); $this->addElement('text', 'property_name', array( 'label' => $this->translate('Property'), 'description' => $this->translate( 'Please start typing for a list of suggestions. Dots allow you to access nested' . ' properties: column.some.key. Such nested properties cannot be modified in-place,' . ' but you can store the modified value to a new "target property"' ), 'required' => true, 'class' => 'autosubmit director-suggest', 'data-suggestion-context' => 'importsourceproperties!' . $this->source->id, )); $this->addElement('text', 'target_property', [ 'label' => $this->translate('Target property'), 'description' => $this->translate( 'You might want to write the modified value to another (new) property.' . ' This property name can be defined here, the original property would' . ' remain unmodified. Please leave this blank in case you just want to' . ' modify the value of a specific property' ), ]); $this->addElement('textarea', 'description', [ 'label' => $this->translate('Description'), 'description' => $this->translate( 'An extended description for this Import Row Modifier. This should explain' . " it's purpose and why it has been put in place at all." ), 'rows' => '3', ]); $error = false; try { $mods = $this->enumModifiers(); } catch (Exception $e) { $error = $e->getMessage(); $mods = $this->optionalEnum([]); } $this->addElement('YesNo', 'use_filter', [ 'label' => $this->translate('Set based on filter'), 'ignore' => true, 'class' => 'autosubmit', 'required' => true, ]); if ($this->hasBeenSent()) { $useFilter = $this->getSentValue('use_filter'); if ($useFilter === null) { $this->setElementValue('use_filter', $useFilter = 'n'); } } elseif ($object = $this->getObject()) { $expression = $object->get('filter_expression'); $useFilter = ($expression === null || strlen($expression) === 0) ? 'n' : 'y'; $this->setElementValue('use_filter', $useFilter); } else { $this->setElementValue('use_filter', $useFilter = 'n'); } if ($useFilter === 'y') { $this->addElement('text', 'filter_expression', [ 'label' => $this->translate('Filter Expression'), 'description' => $this->translate( 'This allows to filter for specific parts within the given source expression.' . ' You are allowed to refer all imported columns. Examples: host=www* would' . ' set this property only for rows imported with a host property starting' . ' with "www". Complex example: host=www*&!(address=127.*|address6=::1).' . ' Please note, that CIDR notation based matches are also supported: ' . ' address=192.0.2.128/25| address=2001:db8::/32| address=::ffff:192.0.2.0/96' ), 'required' => true, // TODO: validate filter ]); } $this->addElement('select', 'provider_class', [ 'label' => $this->translate('Modifier'), 'required' => true, 'description' => $this->translate( 'A property modifier allows you to modify a specific property at import time' ), 'multiOptions' => $this->optionalEnum($mods), 'class' => 'autosubmit', ]); if ($error) { $this->getElement('provider_class')->addError($error); } try { if ($class = $this->getSentValue('provider_class')) { if ($class && array_key_exists($class, $mods)) { $this->addSettings($class); } } elseif ($class = $this->object()->get('provider_class')) { $this->addSettings($class); } // TODO: next line looks like obsolete duplicate code to me $this->addSettings(); } catch (Exception $e) { $this->getElement('provider_class')->addError($e->getMessage()); } foreach ($this->object()->getSettings() as $key => $val) { if ($el = $this->getElement($key)) { $el->setValue($val); } } $this->setButtons(); } public function getSetting($name, $default = null) { if ($this->hasBeenSent()) { $value = $this->getSentValue($name); if ($value !== null) { return $value; } } if ($this->isNew()) { $value = $this->getElement($name)->getValue(); if ($value === null) { return $default; } return $value; } return $this->object()->getSetting($name, $default); } /** * @return ImportSourceHook * @throws ConfigurationError */ protected function getImportSource() { if ($this->importSource === null) { $this->importSource = ImportSourceHook::loadByName( $this->source->get('source_name'), $this->db ); } return $this->importSource; } protected function enumModifiers() { /** @var PropertyModifierHook[] $hooks */ $hooks = Hook::all('Director\\PropertyModifier'); $enum = []; foreach ($hooks as $hook) { $enum[get_class($hook)] = $hook->getName(); } asort($enum); return $enum; } /** * @param null $class */ protected function addSettings($class = null) { if ($class === null) { $class = $this->getValue('provider_class'); } if ($class !== null) { if (! class_exists($class)) { throw new RuntimeException(sprintf( 'The hooked class "%s" for this property modifier does no longer exist', $class )); } $class::addSettingsFormFields($this); } } public function setSource(ImportSource $source) { $this->source = $source; return $this; } public function onSuccess() { if ($this->getValue('use_filter') === 'n') { $this->getObject()->set('filter_expression', null); } parent::onSuccess(); } } icingaweb2-module-director-1.11.8/application/forms/ImportRunForm.php000066400000000000000000000024701516513262500256460ustar00rootroot00000000000000source = $source; return $this; } public function setup() { $this->submitLabel = false; $this->addElement('submit', 'submit', [ 'label' => $this->translate('Trigger Import Run'), 'decorators' => ['ViewHelper'] ]); } public function onSuccess() { $source = $this->source; if ($source->runImport()) { $this->setSuccessMessage( $this->translate('Imported new data from this Import Source') ); } else { $this->setSuccessMessage( $this->translate( 'Nothing to do, data provided by this Import Source' . " didn't change since the last import run" ) ); } if ($source->get('import_state') === 'failing') { $this->addError($this->translate('Triggering this Import Source failed')); } else { parent::onSuccess(); } } } icingaweb2-module-director-1.11.8/application/forms/ImportSourceForm.php000066400000000000000000000127021516513262500263410ustar00rootroot00000000000000addElement('text', 'source_name', array( 'label' => $this->translate('Import source name'), 'description' => $this->translate( 'A short name identifying this import source. Use something meaningful,' . ' like "Hosts from Puppet", "Users from Active Directory" or similar' ), 'required' => true, )); $this->addElement('textarea', 'description', array( 'label' => $this->translate('Description'), 'description' => $this->translate( 'An extended description for this Import Source. This should explain' . " what kind of data you're going to import from this source." ), 'rows' => '3', )); $this->addElement('select', 'provider_class', array( 'label' => $this->translate('Source Type'), 'required' => true, 'multiOptions' => $this->optionalEnum($this->enumSourceTypes()), 'description' => $this->translate( 'These are different data providers fetching data from various sources.' . ' You didn\'t find what you\'re looking for? Import sources are implemented' . ' as a hook in Director, so you might find (or write your own) Icinga Web 2' . ' module fetching data from wherever you want' ), 'class' => 'autosubmit' )); $this->addSettings(); $this->setButtons(); } public function getSentOrObjectSetting($name, $default = null) { if ($this->hasObject()) { $value = $this->getSentValue($name); if ($value === null) { /** @var ImportSource $object */ $object = $this->getObject(); return $object->getSetting($name, $default); } else { return $value; } } else { return $this->getSentValue($name, $default); } } public function hasChangedSetting($name) { if ($this->hasBeenSent() && $this->hasObject()) { /** @var ImportSource $object */ $object = $this->getObject(); return $object->getStoredSetting($name) !== $this->getSentValue($name); } else { return false; } } protected function addSettings() { if (! ($class = $this->getProviderClass())) { return; } $defaultKeyCol = $this->getDefaultKeyColumnName(); $this->addElement('text', 'key_column', array( 'label' => $this->translate('Key column name'), 'description' => $this->translate( 'This must be a column containing unique values like hostnames. Unless otherwise' . ' specified this will then be used as the object_name for the syncronized' . ' Icinga object. Especially when getting started with director please make' . ' sure to strictly follow this rule. Duplicate values for this column on different' . ' rows will trigger a failure, your import run will not succeed. Please pay attention' . ' when synching services, as "purge" will only work correctly with a key_column' . ' corresponding to host!name. Check the "Combine" property modifier in case your' . ' data source cannot provide such a field' ), 'placeholder' => $defaultKeyCol, 'required' => $defaultKeyCol === null, )); if (array_key_exists($class, $this->enumSourceTypes())) { $class::addSettingsFormFields($this); foreach ($this->object()->getSettings() as $key => $val) { if ($el = $this->getElement($key)) { $el->setValue($val); } } } } protected function getDefaultKeyColumnName() { if (! ($class = $this->getProviderClass())) { return null; } if (! class_exists($class)) { return null; } return $class::getDefaultKeyColumnName(); } protected function getProviderClass() { if ($this->hasBeenSent()) { $class = $this->getRequest()->getPost('provider_class'); } else { if (! ($class = $this->object()->get('provider_class'))) { return null; } } return $class; } public function onSuccess() { if (! $this->getValue('key_column')) { if ($default = $this->getDefaultKeyColumnName()) { $this->setElementValue('key_column', $default); $this->object()->set('key_column', $default); } } parent::onSuccess(); } protected function enumSourceTypes() { /** @var ImportSourceHook[] $hooks */ $hooks = Hook::all('Director\\ImportSource'); $enum = array(); foreach ($hooks as $hook) { $enum[get_class($hook)] = $hook->getName(); } asort($enum); return $enum; } } icingaweb2-module-director-1.11.8/application/forms/KickstartForm.php000066400000000000000000000360371516513262500256540ustar00rootroot00000000000000storeConfigLabel = $this->translate('Store configuration'); $this->createDbLabel = $this->translate('Create database schema'); $this->migrateDbLabel = $this->translate('Apply schema migrations'); if ($this->dbResourceName === null) { $this->addResourceConfigElements(); $this->addResourceDisplayGroup(); if ( !$this->config()->get('db', 'resource') || ($this->config()->get('db', 'resource') !== $this->getResourceName()) ) { return; } } if (!$this->hasBeenSent() && !$this->tryDbConnection()) { return; } if (!$this->migrations()->hasSchema()) { $this->addHtmlHint($this->translate( 'No database schema has been created yet' ), array('name' => 'HINT_schema')); $this->addResourceDisplayGroup(); $this->setSubmitLabel($this->createDbLabel); return; } if ($this->migrations()->hasPendingMigrations()) { $this->addHtmlHint($this->translate( 'There are pending database migrations' ), array('name' => 'HINT_schema')); $this->addResourceDisplayGroup(); $this->setSubmitLabel($this->migrateDbLabel); return; } if (! $this->endpoint && $this->getDb()->hasDeploymentEndpoint()) { $hint = Html::sprintf( $this->translate('Your database looks good, you are ready to %s'), Link::create( $this->translate('start working with the Icinga Director'), 'director', null, ['data-base-target' => '_main'] ) ); $this->addHtmlHint($hint, ['name' => 'HINT_ready']); $this->getDisplayGroup('config')->addElements( array($this->getElement('HINT_ready')) ); return; } $this->addResourceDisplayGroup(); if ($this->getDb()->hasDeploymentEndpoint()) { $this->addHtmlHint( $this->translate( 'Your configuration looks good. Still, you might want to re-run' . ' this kickstart wizard to (re-)import modified or new manually' . ' defined Command definitions or to get fresh new ITL commands' . ' after an Icinga 2 Core upgrade.' ), array('name' => 'HINT_kickstart') // http://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/ // ... object-types#objecttype-apilistener ); } else { $this->addHtmlHint( $this->translate( 'Your installation of Icinga Director has not yet been prepared for' . ' deployments. This kickstart wizard will assist you with setting' . ' up the connection to your Icinga 2 server.' ), array('name' => 'HINT_kickstart') // http://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/ // ... object-types#objecttype-apilistener ); } $this->addElement('text', 'endpoint', array( 'label' => $this->translate('Endpoint Name'), 'description' => $this->translate( 'This is the name of the Endpoint object (and certificate name) you' . ' created for your ApiListener object. In case you are unsure what' . ' this means please make sure to read the documentation first' ), 'required' => true, )); $this->addElement('text', 'host', array( 'label' => $this->translate('Icinga Host'), 'description' => $this->translate( 'IP address / hostname of your Icinga node. Please note that this' . ' information will only be used for the very first connection to' . ' your Icinga instance. The Director then relies on a correctly' . ' configured Endpoint object. Correctly configures means that either' . ' it\'s name is resolvable or that it\'s host property contains' . ' either an IP address or a resolvable host name. Your Director must' . ' be able to reach this endpoint' ), 'required' => false, )); $this->addElement('text', 'port', array( 'label' => $this->translate('Port'), 'value' => '5665', 'description' => $this->translate( 'The port you are going to use. The default port 5665 will be used' . ' if none is set' ), 'required' => false, )); $this->addElement('text', 'username', array( 'label' => $this->translate('API user'), 'description' => $this->translate( 'Your Icinga 2 API username' ), 'required' => true, )); $this->addElement('password', 'password', array( 'label' => $this->translate('Password'), 'description' => $this->translate( 'The corresponding password' ), 'required' => true, )); if ($ep = $this->endpoint) { $user = $ep->getApiUser(); $this->setDefaults(array( 'endpoint' => $ep->get('object_name'), 'host' => $ep->get('host'), 'port' => $ep->get('port'), 'username' => $user->get('object_name'), 'password' => $user->get('password'), )); if (! empty($user->password)) { $this->getElement('password')->setAttrib( 'placeholder', '(use stored password)' )->setRequired(false); } } $this->addKickstartDisplayGroup(); $this->setSubmitLabel($this->translate('Run import')); } /** * @throws \Icinga\Exception\ConfigurationError */ protected function onSetup() { if ($this->hasBeenSubmitted()) { // Do not hinder the form from being stored return; } $this->tryDbConnection(); } /** * @throws \Zend_Form_Exception */ protected function addResourceConfigElements() { $config = $this->config(); $resources = $this->enumResources(); if (!$this->getResourceName()) { $this->addHtmlHint($this->translate( 'No database resource has been configured yet. Please choose a' . ' resource to complete your config' ), array('name' => 'HINT_no_resource')); } $this->addElement('select', 'resource', array( 'required' => true, 'label' => $this->translate('DB Resource'), 'multiOptions' => $this->optionalEnum($resources), 'class' => 'autosubmit', 'value' => $config->get('db', 'resource') )); if (empty($resources)) { $this->getElement('resource')->addError( $this->translate('This has to be a MySQL or PostgreSQL database') ); $this->addHtmlHint(Html::sprintf( $this->translate('Please click %s to create new DB resources'), Link::create( $this->translate('here'), 'config/resource', null, ['data-base-target' => '_main'] ) )); } $this->setSubmitLabel($this->storeConfigLabel); } /** * @throws \Zend_Form_Exception */ protected function addResourceDisplayGroup() { if ($this->dbResourceName !== null) { return; } $elements = array( 'HINT_no_resource', 'resource', 'HINT_ready', 'HINT_schema', 'HINT_db_perms', 'HINT_config_store' ); $this->addDisplayGroup($elements, 'config', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => 40, 'legend' => $this->translate('Database backend') )); } /** * @throws \Zend_Form_Exception */ protected function addKickstartDisplayGroup() { $elements = array( 'HINT_kickstart', 'endpoint', 'host', 'port', 'username', 'password' ); $this->addDisplayGroup($elements, 'wizard', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => 60, 'legend' => $this->translate('Kickstart Wizard') )); } /** * @return bool * @throws \Zend_Form_Exception */ protected function storeResourceConfig() { $config = $this->config(); $value = $this->getValue('resource'); $config->setSection('db', array('resource' => $value)); try { $config->saveIni(); $this->setSuccessMessage($this->translate('Configuration has been stored')); return true; } catch (Exception $e) { $this->getElement('resource')->addError( sprintf( $this->translate( 'Unable to store the configuration to "%s". Please check' . ' file permissions or manually store the content shown below' ), $config->getConfigFile() ) ); $this->addHtmlHint( Html::tag('pre', null, (string) $config), array('name' => 'HINT_config_store') ); $this->getDisplayGroup('config')->addElements( array($this->getElement('HINT_config_store')) ); $this->removeElement('HINT_ready'); return false; } } public function setEndpoint(IcingaEndpoint $endpoint) { $this->endpoint = $endpoint; return $this; } /** * @throws \Icinga\Exception\ProgrammingError * @throws \Zend_Form_Exception */ public function onSuccess() { if ($this->getSubmitLabel() === $this->storeConfigLabel) { if ($this->storeResourceConfig()) { parent::onSuccess(); } else { return; } } if ( $this->getSubmitLabel() === $this->createDbLabel || $this->getSubmitLabel() === $this->migrateDbLabel ) { $this->migrations()->applyPendingMigrations(); parent::onSuccess(); } $values = $this->getValues(); if ($this->endpoint && empty($values['password'])) { $values['password'] = $this->endpoint->getApiUser()->password; } $kickstart = new KickstartHelper($this->getDb()); unset($values['resource']); $kickstart->setConfig($values)->run(); parent::onSuccess(); } public function setDbResourceName($name) { $this->dbResourceName = $name; return $this; } protected function getResourceName() { if ($this->dbResourceName !== null) { return $this->dbResourceName; } if ($this->hasBeenSent()) { $resource = $this->getSentValue('resource'); $resources = $this->enumResources(); if (in_array($resource, $resources)) { return $resource; } else { return null; } } else { return $this->config()->get('db', 'resource'); } } public function getDb() { return Db::fromResourceName($this->getResourceName()); } protected function getResource() { return ResourceFactory::create($this->getResourceName()); } /** * @return Migrations */ protected function migrations() { return new Migrations($this->getDb()); } public function setModuleConfig(Config $config) { $this->config = $config; return $this; } protected function config() { if ($this->config === null) { $this->config = Config::module('director'); } return $this->config; } protected function enumResources() { $resources = array(); $allowed = array('mysql', 'pgsql'); foreach (ResourceFactory::getResourceConfigs() as $name => $resource) { if ($resource->get('type') === 'db' && in_array($resource->get('db'), $allowed)) { $resources[$name] = $name; } } return $resources; } protected function tryDbConnection() { if ($resourceName = $this->getResourceName()) { $resourceConfig = ResourceFactory::getResourceConfig($resourceName); if ( !isset($resourceConfig->charset) || !in_array($resourceConfig->charset, array('utf8', 'utf8mb4', 'UTF8', 'UTF-8')) ) { if ($resource = $this->getElement('resource')) { $resource->addError('Please change the encoding for the director database to utf8'); } else { $this->addError('Please change the encoding for the director database to utf8'); } } $resource = $this->getResource(); $db = $resource->getDbAdapter(); try { $db->fetchOne('SELECT 1'); return true; } catch (Exception $e) { $this->getElement('resource') ->addError('Could not connect to database: ' . $e->getMessage()); $hint = $this->translate( 'Please make sure that your database exists and your user has' . ' been granted enough permissions' ); $this->addHtmlHint($hint, array('name' => 'HINT_db_perms')); } } return false; } } icingaweb2-module-director-1.11.8/application/forms/RemoveLinkForm.php000066400000000000000000000025761516513262500257710ustar00rootroot00000000000000formName = 'RemoveSet' . sha1(json_encode($params)); parent::__construct(['data-base-target' => '_self']); $this->label = $label; $this->title = $title; foreach ($params as $name => $value) { $this->addHidden($name, $value); } $this->setAction($action); } public function runOnSuccess($action) { $this->onSuccessAction = $action; return $this; } public function setup() { $this->addAttribs(['class' => ['inline', 'remove-link-form']]); $this->addHtml(Icon::create('cancel')); $this->addSubmitButton($this->label, [ 'class' => 'link-button', 'title' => $this->title, ]); } public function onSuccess() { if ($this->onSuccessAction !== null) { $func = $this->onSuccessAction; $func(); $this->redirectOnSuccess( $this->translate('Service Set has been removed') ); } } } icingaweb2-module-director-1.11.8/application/forms/RestoreBasketForm.php000066400000000000000000000037151516513262500264670ustar00rootroot00000000000000snapshot = $snapshot; return $this; } /** * @codingStandardsIgnoreStart * @return Auth */ protected function Auth() { return Auth::getInstance(); } /** * @return Config */ protected function Config() { // @codingStandardsIgnoreEnd return Config::module('director'); } /** * @throws \Zend_Form_Exception */ public function setup() { $allowedDbs = $this->listAllowedDbResourceNames(); $this->addElement('select', 'target_db', [ 'label' => $this->translate('Target DB'), 'description' => $this->translate('Restore to this target Director DB'), 'multiOptions' => $allowedDbs, 'value' => $this->getRequest()->getParam('target_db', $this->getFirstDbResourceName()), 'class' => 'autosubmit', ]); $this->setSubmitLabel($this->translate('Restore')); } public function getDb() { return Db::fromResourceName($this->getValue('target_db')); } /** * @throws \Icinga\Exception\NotFoundError */ public function onSuccess() { $this->snapshot->restoreTo($this->getDb()); $this->setSuccessUrl($this->getSuccessUrl()->with('target_db', $this->getValue('target_db'))); $this->setSuccessMessage(sprintf('Restored to %s', $this->getValue('target_db'))); parent::onSuccess(); } } icingaweb2-module-director-1.11.8/application/forms/RestoreObjectForm.php000066400000000000000000000054161516513262500264640ustar00rootroot00000000000000addSubmitButton($this->translate('Restore former object')); } public function onSuccess() { $object = $this->object; $name = $object->getObjectName(); $db = $this->db; $keyParams = $object->getKeyParams(); if ($object->supportsApplyRules() && $object->get('object_type') === 'apply') { // TODO: not all apply should be considered unique by name + object_type $query = $db->getDbAdapter() ->select() ->from($object->getTableName()) ->where('object_type = ?', 'apply') ->where('object_name = ?', $name); $rules = $object::loadAll($db, $query); if (empty($rules)) { $existing = null; } elseif (count($rules) === 1) { $existing = current($rules); } else { // TODO: offer drop down? throw new NotImplementedError( "Found multiple apply rule matching name '%s', can not restore!", $name ); } } else { try { $existing = $object::load($keyParams, $db); } catch (NotFoundError $e) { $existing = null; } } if ($existing !== null) { $typeExisting = $existing->get('object_type'); $typeObject = $object->get('object_type'); if ($typeExisting !== $typeObject) { // Not sure when that may occur throw new NotImplementedError( 'Found existing object has a mismatching object_type: %s != %s', $typeExisting, $typeObject ); } $existing->replaceWith($object); if ($existing->hasBeenModified()) { $msg = $this->translate('Object has been restored'); $existing->store(); } else { $msg = $this->translate( 'Nothing to do, restore would not modify the current object' ); } } else { $msg = $this->translate('Object has been re-created'); $object->store($db); } $this->redirectOnSuccess($msg); } public function setObject(IcingaObject $object) { $this->object = $object; return $this; } } icingaweb2-module-director-1.11.8/application/forms/SelfServiceSettingsForm.php000066400000000000000000000302351516513262500276420ustar00rootroot00000000000000settings; $this->addElement('select', 'agent_name', [ 'label' => $this->translate('Host Name'), 'description' => $this->translate( 'What to use as your Icinga 2 Agent\'s Host Name' ), 'multiOptions' => [ 'fqdn' => $this->translate('Fully qualified domain name (FQDN)'), 'hostname' => $this->translate('Host name (local part, without domain)'), ], 'value' => $settings->getStoredOrDefaultValue('self-service/agent_name') ]); $this->addElement('select', 'transform_hostname', [ 'label' => $this->translate('Transform Host Name'), 'description' => $this->translate( 'Whether to adjust your host name' ), 'multiOptions' => [ '0' => $this->translate('Do not transform at all'), '1' => $this->translate('Transform to lowercase'), '2' => $this->translate('Transform to uppercase'), ], 'value' => $settings->getStoredOrDefaultValue('self-service/transform_hostname') ]); $this->addElement('select', 'resolve_parent_host', [ 'label' => $this->translate('Transform Parent Host to IP'), 'description' => $this->translate( 'This is only important in case your master/satellite nodes do not' . ' have IP addresses as their "host" property. The Agent can be' . ' told to issue related DNS lookups on it\' own' ), 'multiOptions' => [ '0' => $this->translate("Don't care, my host settings are fine"), '1' => $this->translate('My Agents should use DNS to look up Endpoint names'), ], 'value' => $settings->getStoredOrDefaultValue('self-service/resolve_parent_host') ]); $this->addElement('extensibleSet', 'global_zones', [ 'label' => $this->translate('Global Zones'), 'description' => $this->translate( 'To ensure downloaded packages are build by the Icinga Team' . ' and not compromised by third parties, you will be able' . ' to provide an array of SHA1 hashes here. In case you have' . ' defined any hashses, the module will not continue with' . ' updating / installing the Agent in case the SHA1 hash of' . ' the downloaded MSI package is not matching one of the' . ' provided hashes of this setting' ), 'multiOptions' => $this->enumGlobalZones(), 'value' => $settings->getStoredOrDefaultValue('self-service/global_zones'), ]); $this->addElement('select', 'download_type', [ 'label' => $this->translate('Installation Source'), 'description' => $this->translate( 'You might want to let the generated Powershell script install' . ' the Icinga 2 Agent in an automated way. If so, please choose' . ' where your Windows nodes should fetch the Agent installer' ), 'multiOptions' => [ null => $this->translate('- no automatic installation -'), // TODO: not yet // 'director' => $this->translate('Download via the Icinga Director'), 'icinga' => $this->translate('Download from packages.icinga.com'), 'url' => $this->translate('Download from a custom url'), 'file' => $this->translate('Use a local file or network share'), ], 'value' => $settings->getStoredOrDefaultValue('self-service/download_type'), 'class' => 'autosubmit' ]); $downloadType = $this->getSentValue( 'download_type', $settings->getStoredOrDefaultValue('self-service/download_type') ); if ($downloadType) { $this->addInstallSettings($downloadType, $settings); } $this->addEventuallyConfiguredBoolean('flush_api_dir', [ 'label' => $this->translate('Flush API directory'), 'description' => $this->translate( 'In case the Icinga Agent will accept configuration from the parent' . ' Icinga 2 system, it will possibly write data to /var/lib/icinga2/api/*.' . ' By setting this parameter to true, all content inside the api directory' . ' will be flushed before an eventual restart of the Icinga 2 Agent' ), 'required' => true, ]); } protected function addInstallSettings($downloadType, Settings $settings) { $this->addElement('text', 'download_url', [ 'label' => $this->translate('Source Path'), 'description' => $this->translate( 'Define a download Url or local directory from which the a specific' . ' Icinga 2 Agent MSI Installer package should be fetched. Please' . ' ensure to only define the base download Url or Directory. The' . ' Module will generate the MSI file name based on your operating' . ' system architecture and the version to install. The Icinga 2 MSI' . ' Installer name is internally build as follows:' . ' Icinga2-v[InstallAgentVersion]-[OSArchitecture].msi (full example:' . ' Icinga2-v2.6.3-x86_64.msi)' ), 'value' => $settings->getStoredOrDefaultValue('self-service/download_url'), ]); // TODO: offer to check for available versions if ($downloadType === 'icinga') { $el = $this->getElement('download_url'); $el->setAttrib('disabled', 'disabled'); $value = 'https://packages.icinga.com/windows/'; $el->setValue($value); $this->setSentValue('download_url', $value); } if ($downloadType === 'director') { $el = $this->getElement('download_url'); $el->setAttrib('disabled', 'disabled'); $r = $this->getRequest(); $scheme = $r->getServer('HTTP_X_FORWARDED_PROTO', $r->getScheme()); $value = sprintf( '%s://%s%s/director/download/windows/', $scheme, $r->getHttpHost(), $this->getRequest()->getBaseUrl() ); $el->setValue($value); $this->setSentValue('download_url', $value); } $this->addElement('text', 'agent_version', [ 'label' => $this->translate('Agent Version'), 'description' => $this->translate( 'In case the Icinga 2 Agent should be automatically installed,' . ' this has to be a string value like: 2.6.3' ), 'value' => $settings->getStoredOrDefaultValue('self-service/agent_version'), 'required' => true, ]); $hashes = $settings->getStoredOrDefaultValue('self-service/installer_hashes'); $this->addElement('extensibleSet', 'installer_hashes', [ 'label' => $this->translate('Installer Hashes'), 'description' => $this->translate( 'To ensure downloaded packages are build by the Icinga Team' . ' and not compromised by third parties, you will be able' . ' to provide an array of SHA1 hashes here. In case you have' . ' defined any hashses, the module will not continue with' . ' updating / installing the Agent in case the SHA1 hash of' . ' the downloaded MSI package is not matching one of the' . ' provided hashes of this setting' ), 'value' => $hashes, ]); $this->addElement('text', 'icinga_service_user', [ 'label' => $this->translate('Service User'), 'description' => $this->translate( 'The user that should run the Icinga 2 service on Windows.' ), 'value' => $settings->getStoredOrDefaultValue('self-service/icinga_service_user'), ]); $this->addEventuallyConfiguredBoolean('allow_updates', [ 'label' => $this->translate('Allow Updates'), 'description' => $this->translate( 'In case the Icinga 2 Agent is already installed on the system,' . ' this parameter will allow you to configure if you wish to' . ' upgrade / downgrade to a specified version with the as well.' ), 'required' => true, ]); $this->addNscpSettings(); } protected function addNscpSettings() { $this->addEventuallyConfiguredBoolean('install_nsclient', [ 'label' => $this->translate('Install NSClient++'), 'description' => $this->translate( 'Also install NSClient++. It can be used through the Icinga Agent' . ' and comes with a bunch of additional Check Plugins' ), 'required' => true, ]); /* * TODO: eventually add those: if ($settings->get('self-service/install_nsclient') === 'y') { $params['install_nsclient'] = true; $this->addBooleanSettingsToParams($settings, [ 'nsclient_add_defaults', 'nsclient_firewall', 'nsclient_service', ], $params); $this->addStringSettingsToParams($settings, [ 'nsclient_directory', 'nsclient_installer_path' ], $params); } */ } public static function create(Db $db, Settings $settings) { return static::load()->setDb($db)->setSettings($settings); } protected function addEventuallyConfiguredBoolean($name, $params) { $key = "self-service/$name"; $value = $this->settings->getStoredValue($key); $params['value'] = $value; $params['multiOptions'] = $this->eventuallyConfiguredEnum($name, [ 'y' => $this->translate('Yes'), 'n' => $this->translate('No'), ]); return $this->addElement('select', $name, $params); } protected function eventuallyConfiguredEnum($name, $enum) { $key = "self-service/$name"; $default = $this->settings->getDefaultValue($key); if ($default === null) { return [ null => $this->translate('- please choose -') ] + $enum; } else { return [ null => sprintf($this->translate('%s (default)'), $enum[$default]) ] + $enum; } } protected function setSentValue($key, $value) { $this->getRequest()->setPost($key, $value); return $this; } protected function enumGlobalZones() { $db = $this->getDb()->getDbAdapter(); $zones = $db->fetchCol( $db->select()->from('icinga_zone', 'object_name') ->where('disabled = ?', 'n') ->where('is_global = ?', 'y') ->order('object_name') ); return array_combine($zones, $zones); } public function setSettings(Settings $settings) { $this->settings = $settings; return $this; } public function onSuccess() { try { foreach ($this->getValues() as $key => $value) { if ($value === '') { $value = null; } $this->settings->set("self-service/$key", $value); } $this->setSuccessMessage($this->translate( 'Self Service Settings have been stored' )); parent::onSuccess(); } catch (Exception $e) { $this->addException($e); } } } icingaweb2-module-director-1.11.8/application/forms/SettingsForm.php000066400000000000000000000222321516513262500255050ustar00rootroot00000000000000settings; $this->addHtmlHint( $this->translate( 'Please only change those settings in case you are really sure' . ' that you are required to do so. Usually the defaults chosen' . ' by the Icinga Director should make a good fit for your' . ' environment.' ) ); $globalZones = $this->eventuallyConfiguredEnum('default_global_zone', $this->enumGlobalZones()); $this->addElement('select', 'default_global_zone', array( 'label' => $this->translate('Default global zone'), 'multiOptions' => $globalZones, 'description' => $this->translate( 'Icinga Director decides to deploy objects like CheckCommands' . ' to a global zone. This defaults to "director-global" but' . ' might be adjusted to a custom Zone name' ), 'value' => $settings->getStoredValue('default_global_zone') )); $this->addElement('text', 'icinga_package_name', array( 'label' => $this->translate('Icinga Package Name'), 'description' => $this->translate( 'The Icinga Package name Director uses to deploy it\'s configuration.' . ' This defaults to "director" and should not be changed unless' . ' you really know what you\'re doing' ), 'placeholder' => $settings->get('icinga_package_name'), 'value' => $settings->getStoredValue('icinga_package_name') )); $this->addElement('select', 'disable_all_jobs', array( 'label' => $this->translate('Disable all Jobs'), 'multiOptions' => $this->eventuallyConfiguredEnum( 'disable_all_jobs', array( 'n' => $this->translate('No'), 'y' => $this->translate('Yes'), ) ), 'description' => $this->translate( 'Whether all configured Jobs should be disabled' ), 'value' => $settings->getStoredValue('disable_all_jobs') )); $this->addElement('select', 'enable_audit_log', array( 'label' => $this->translate('Enable audit log'), 'multiOptions' => $this->eventuallyConfiguredEnum( 'enable_audit_log', array( 'n' => $this->translate('No'), 'y' => $this->translate('Yes'), ) ), 'description' => $this->translate( 'All changes are tracked in the Director database. In addition' . ' you might also want to send an audit log through the Icinga' . " Web 2 logging mechanism. That way all changes would be" . ' written to either Syslog or the configured log file. When' . ' enabling this please make sure that you configured Icinga' . ' Web 2 to log at least at "informational" level.' ), 'value' => $settings->getStoredValue('enable_audit_log') )); if ($settings->getStoredValue('ignore_bug7530')) { // Show this only for those who touched this setting $this->addElement('select', 'ignore_bug7530', array( 'label' => $this->translate('Ignore Bug #7530'), 'multiOptions' => $this->eventuallyConfiguredEnum( 'ignore_bug7530', array( 'n' => $this->translate('No'), 'y' => $this->translate('Yes'), ) ), 'description' => $this->translate( 'Icinga v2.11.0 breaks some configurations, the Director will' . ' warn you before every deployment in case your config is' . ' affected. This setting allows to hide this warning.' ), 'value' => $settings->getStoredValue('ignore_bug7530') )); } $this->addBoolean('feature_custom_endpoint', [ 'label' => $this->translate('Feature: Custom Endpoint Name'), 'description' => $this->translate( 'Enabled the feature for custom endpoint names,' . ' where you can choose a different name for the generated endpoint object.' . ' This uses some Icinga config snippets and a special custom variable.' . ' Please do NOT enable this, unless you really need divergent endpoint names!' ), 'value' => $settings->getStoredValue('feature_custom_endpoint') ]); $this->addElement('select', 'config_format', array( 'label' => $this->translate('Configuration format'), 'multiOptions' => $this->eventuallyConfiguredEnum( 'config_format', array( 'v2' => $this->translate('Icinga v2.x'), 'v1' => $this->translate('Icinga v1.x'), ) ), 'description' => $this->translate( 'Default configuration format. Please note that v1.x is for' . ' special transitional projects only and completely' . ' unsupported. There are no plans to make Director a first-' . 'class configuration backends for Icinga 1.x' ), 'class' => 'autosubmit', 'value' => $settings->getStoredValue('config_format') )); $this->setSubmitLabel($this->translate('Store')); if ($this->hasBeenSent()) { if ($this->getSentValue('config_format') !== 'v1') { return; } } elseif ($settings->getStoredValue('config_format') !== 'v1') { return; } $this->addElement('select', 'deployment_mode_v1', array( 'label' => $this->translate('Deployment mode'), 'multiOptions' => $this->eventuallyConfiguredEnum( 'deployment_mode_v1', array( 'active-passive' => $this->translate('Active-Passive'), 'masterless' => $this->translate('Master-less'), ) ), 'description' => $this->translate( 'Deployment mode for Icinga 1 configuration' ), 'value' => $settings->getStoredValue('deployment_mode_v1') )); $this->addElement('text', 'deployment_path_v1', array( 'label' => $this->translate('Deployment Path'), 'description' => $this->translate( 'Local directory to deploy Icinga 1.x configuration.' . ' Must be writable by icingaweb2.' . ' (e.g. /etc/icinga/director)' ), 'value' => $settings->getStoredValue('deployment_path_v1') )); $this->addElement('text', 'activation_script_v1', array( 'label' => $this->translate('Activation Tool'), 'description' => $this->translate( 'Script or tool to call when activating a new configuration stage.' . ' (e.g. sudo /usr/local/bin/icinga-director-activate)' . ' (name of the stage will be the argument for the script)' ), 'value' => $settings->getStoredValue('activation_script_v1') )); } protected function eventuallyConfiguredEnum($name, $enum) { if (array_key_exists($name, $enum)) { $default = sprintf( $this->translate('%s (default)'), $enum[$this->settings->getDefaultValue($name)] ); } else { $default = $this->translate('- please choose -'); } return [null => $default] + $enum; } public function setSettings(Settings $settings) { $this->settings = $settings; return $this; } protected function enumGlobalZones() { $db = $this->settings->getDb(); $zones = $db->fetchCol( $db->select()->from('icinga_zone', 'object_name') ->where('disabled = ?', 'n') ->where('is_global = ?', 'y') ->order('object_name') ); return array_combine($zones, $zones); } public function onSuccess() { try { foreach ($this->getValues() as $key => $value) { if ($value === '') { $value = null; } $this->settings->set($key, $value); } $this->setSuccessMessage($this->translate( 'Settings have been stored' )); parent::onSuccess(); } catch (Exception $e) { $this->addError($e->getMessage()); } } } icingaweb2-module-director-1.11.8/application/forms/SyncCheckForm.php000066400000000000000000000042701516513262500255610ustar00rootroot00000000000000rule = $rule; return $this; } public function setup() { $this->submitLabel = false; $this->addElement('submit', 'submit', array( 'label' => $this->translate('Check for changes'), 'decorators' => array('ViewHelper') )); } public function onSuccess() { if ($this->rule->checkForChanges()) { $this->notifySuccess( $this->translate(('This Sync Rule would apply new changes')) ); $sum = [ DirectorActivityLog::ACTION_CREATE => 0, DirectorActivityLog::ACTION_MODIFY => 0, DirectorActivityLog::ACTION_DELETE => 0 ]; // TODO: Preview them? Like "hosta, hostb and 4 more would be... foreach ($this->rule->getExpectedModifications() as $object) { if ($object->shouldBeRemoved()) { $sum[DirectorActivityLog::ACTION_DELETE]++; } elseif (! $object->hasBeenLoadedFromDb()) { $sum[DirectorActivityLog::ACTION_CREATE]++; } elseif ($object->hasBeenModified()) { $sum[DirectorActivityLog::ACTION_MODIFY]++; } } /** if ($sum['modify'] === 1) { $html .= $this->translate('One object would be modified' } elseif ($sum['modify'] > 1) { } */ $html = '
' . print_r($sum, true) . '
'; $this->addHtml($html); } elseif ($this->rule->get('sync_state') === 'in-sync') { $this->notifySuccess( $this->translate('Nothing would change, this rule is still in sync') ); } else { $this->addError($this->translate('Checking this sync rule failed')); } } } icingaweb2-module-director-1.11.8/application/forms/SyncPropertyForm.php000066400000000000000000000340561516513262500263750ustar00rootroot00000000000000addHidden('rule_id', $this->rule->get('id')); $this->addElement('select', 'source_id', array( 'label' => $this->translate('Source Name'), 'multiOptions' => $this->enumImportSource(), 'required' => true, 'class' => 'autosubmit', )); if (! $this->hasObject() && ! $this->getSentValue('source_id')) { return; } $this->addElement('select', 'destination_field', array( 'label' => $this->translate('Destination Field'), 'multiOptions' => $this->optionalEnum($this->listDestinationFields()), 'required' => true, 'class' => 'autosubmit', )); if ($this->getSentValue('destination_field')) { $destination = $this->getSentValue('destination_field'); } elseif ($this->hasObject()) { $destination = $this->getObject()->destination_field; } else { return; } $isCustomvar = substr($destination, 0, 5) === 'vars.'; if ($isCustomvar) { $varname = substr($destination, 5); $this->addElement('text', 'customvar', array( 'label' => $this->translate('Custom variable'), 'required' => true, 'ignore' => true, )); if ($varname !== '*') { $this->setElementValue('destination_field', 'vars.*'); $this->setElementValue('customvar', $varname); if ($this->hasObject()) { $this->getObject()->destination_field = 'vars.*'; } } } $this->addSourceColumnElement($destination); $this->addElement('YesNo', 'use_filter', array( 'label' => $this->translate('Set based on filter'), 'ignore' => true, 'class' => 'autosubmit', 'required' => true, )); if ($this->hasBeenSent()) { $useFilter = $this->getSentValue('use_filter'); if ($useFilter === null) { $this->setElementValue('use_filter', $useFilter = 'n'); } } else { $expression = $this->getObject()->filter_expression; $useFilter = ($expression === null || strlen($expression) === 0) ? 'n' : 'y'; $this->setElementValue('use_filter', $useFilter); } if ($useFilter === 'y') { $this->addElement('text', 'filter_expression', array( 'label' => $this->translate('Filter Expression'), 'description' => $this->translate( 'This allows to filter for specific parts within the given source expression.' . ' You are allowed to refer all imported columns. Examples: host=www* would' . ' set this property only for rows imported with a host property starting' . ' with "www". Complex example: host=www*&!(address=127.*|address6=::1)' ), 'required' => true, // TODO: validate filter )); } if ($isCustomvar || $destination === 'vars') { $this->addElement('select', 'merge_policy', array( 'label' => $this->translate('Merge Policy'), 'description' => $this->translate( 'Whether you want to merge or replace the destination field.' . ' Makes no difference for strings' ), 'required' => true, 'multiOptions' => $this->optionalEnum(array( 'merge' => 'merge', 'override' => 'replace' )) )); } else { $this->addHidden('merge_policy', 'override'); } $this->setButtons(); } protected function hasSubOption($options, $key) { foreach ($options as $mainKey => $sub) { if (! is_array($sub)) { // null -> please choose - or similar continue; } if (array_key_exists($key, $sub)) { return true; } } return false; } /** * @param $destination * @return $this * @throws \Zend_Form_Exception */ protected function addSourceColumnElement($destination) { $error = false; $srcTitle = $this->translate('Source columns'); try { $columns[$srcTitle] = $this->listSourceColumns(); natsort($columns[$srcTitle]); } catch (Exception $e) { $srcTitle .= sprintf(' (%s)', $this->translate('failed to fetch')); $columns[$srcTitle] = array(); $error = sprintf( $this->translate('Unable to fetch data: %s'), $e->getMessage() ); } if ($destination === 'import') { $this->addIcingaTempateColumns($columns); } elseif ($destination === 'list_id') { $this->addDatalistsColumns($columns); } $xpTitle = $this->translate('Expert mode'); $columns[$xpTitle][self::EXPRESSION] = $this->translate('Custom expression'); $this->addElement('select', 'source_column', array( 'label' => $this->translate('Source Column'), 'multiOptions' => $this->optionalEnum($columns), 'required' => true, 'ignore' => true, 'class' => 'autosubmit', )); if ($error) { $this->getElement('source_column')->addError($error); } $showExpression = false; if ($this->hasBeenSent()) { $sentValue = $this->getSentValue('source_column'); if ($sentValue === self::EXPRESSION) { $showExpression = true; } } elseif ($this->hasObject()) { $objectValue = $this->getObject()->source_expression; if ($this->hasSubOption($columns, $objectValue)) { $this->setElementValue('source_column', $objectValue); } else { $this->setElementValue('source_column', self::EXPRESSION); $showExpression = true; } } if ($showExpression) { $this->addElement('text', 'source_expression', array( 'label' => $this->translate('Source Expression'), 'description' => $this->translate( 'A custom string. Might contain source columns, please use placeholders' . ' of the form ${columnName} in such case. Structured data sources' . ' can be referenced as ${columnName.sub.key}' ), 'required' => true, )); } return $this; } protected function addIcingaTempateColumns(&$columns) { $funcTemplates = 'enum' . ucfirst($this->rule->get('object_type')) . 'Templates'; if (method_exists($this->db, $funcTemplates)) { $templates = $this->db->$funcTemplates(); if (! empty($templates)) { $templates = array_combine($templates, $templates); } $title = $this->translate('Existing templates'); $columns[$title] = $templates; natsort($columns[$title]); } } protected function addDatalistsColumns(&$columns) { // Clear other columns, we don't allow them right now $columns = []; $db = $this->db->getDbAdapter(); $enum = $db->fetchPairs( $db->select()->from('director_datalist', ['id', 'list_name'])->order('list_name') ); $columns[$this->translate('Existing Data Lists')] = $enum; } protected function enumImportSource() { $sources = $this->db->enumImportSource(); $usedIds = $this->rule->listInvolvedSourceIds(); if (empty($usedIds)) { return $this->optionalEnum($sources); } $usedSources = array(); foreach ($usedIds as $id) { $usedSources[$id] = $sources[$id]; unset($sources[$id]); } if (empty($sources)) { return $this->optionalEnum($usedSources); } return $this->optionalEnum( array( $this->translate('Used sources') => $usedSources, $this->translate('Other sources') => $sources ) ); } /** * @return array * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\NotFoundError */ protected function listSourceColumns() { $columns = array(); $source = $this->getImportSource(); $hook = $this->getImportSourceHook(); foreach ($hook->listColumns() as $col) { $columns['${' . $col . '}'] = $col; } foreach ($source->listModifierTargetProperties() as $property) { $columns['${' . $property . '}'] = $property; } return $columns; } protected function listDestinationFields() { $props = []; $special = []; $dummy = $this->dummyObject(); if ($dummy instanceof IcingaObject) { if ($dummy->supportsCustomVars()) { $special['vars.*'] = $this->translate('Custom variable (vars.)'); $special['vars'] = $this->translate('All custom variables (vars)'); } if ($dummy->supportsImports()) { $special['import'] = $this->translate('Inheritance (import)'); } if ($dummy->supportsArguments()) { $special['arguments'] = $this->translate('Arguments'); } if ($dummy->supportsGroups()) { $special['groups'] = $this->translate('Group membership'); } if ($dummy->supportsRanges()) { $special['ranges'] = $this->translate('Time ranges'); } } foreach ($dummy->listProperties() as $prop) { if ($dummy instanceof IcingaObject && $prop === 'id') { continue; } // TODO: allow those fields, but munge them (store ids) //if (preg_match('~_id$~', $prop)) continue; if (substr($prop, -3) === '_id') { $short = substr($prop, 0, -3); if ($dummy instanceof IcingaObject) { if ($dummy->hasRelation($short)) { $prop = $short; } else { continue; } } } $props[$prop] = $prop; } if ($dummy instanceof IcingaObject) { foreach ($dummy->listMultiRelations() as $prop) { $props[$prop] = sprintf('%s (%s)', $prop, $this->translate('a list')); } } ksort($props); $result = []; if (! empty($special)) { $result[$this->translate('Special properties')] = $special; } if (! empty($props)) { $result[$this->translate('Object properties')] = $props; } return $result; } /** * @return ImportSource * @throws \Icinga\Exception\NotFoundError */ protected function getImportSource() { if ($this->importSource === null) { if ($this->hasObject()) { $id = (int) $this->object->get('source_id'); } else { $id = (int) $this->getSentValue('source_id'); } $this->importSource = ImportSource::loadWithAutoIncId($id, $this->db); } return $this->importSource; } /** * @return ImportSourceHook * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\NotFoundError */ protected function getImportSourceHook() { if ($this->importSourceHook === null) { $this->importSourceHook = ImportSourceHook::loadByName( $this->getImportSource()->get('source_name'), $this->db ); } return $this->importSourceHook; } public function onSuccess() { /** @var SyncProperty $object */ $object = $this->getObject(); $object->set('rule_id', $this->rule->get('id')); // ?! if ($this->getValue('use_filter') === 'n') { $object->set('filter_expression', null); } $sourceColumn = $this->getValue('source_column'); $this->removeElement('source_column'); if ($sourceColumn !== self::EXPRESSION) { $object->set('source_expression', $sourceColumn); } $destination = $this->getValue('destination_field'); if ($destination === 'vars.*') { $destination = $this->getValue('customvar'); $object->set('destination_field', 'vars.' . $destination); } return parent::onSuccess(); } protected function dummyObject() { if ($this->dummyObject === null) { $this->dummyObject = IcingaObject::createByType( $this->rule->get('object_type'), array(), $this->db ); } return $this->dummyObject; } public function setRule(SyncRule $rule) { $this->rule = $rule; return $this; } } icingaweb2-module-director-1.11.8/application/forms/SyncRuleForm.php000066400000000000000000000116431516513262500254550ustar00rootroot00000000000000 $this->translate('Host'), 'hostgroup' => $this->translate('Host Group'), 'service' => $this->translate('Service'), 'servicegroup' => $this->translate('Service Group'), 'serviceSet' => $this->translate('Service Set'), 'user' => $this->translate('User'), 'usergroup' => $this->translate('User Group'), 'datalistEntry' => $this->translate('Data List Entry'), 'command' => $this->translate('Command'), 'timePeriod' => $this->translate('Time Period'), 'notification' => $this->translate('Notification'), 'scheduledDowntime' => $this->translate('Scheduled Downtime'), 'dependency' => $this->translate('Dependency'), 'endpoint' => $this->translate('Endpoint'), 'zone' => $this->translate('Zone'), ]; $this->addElement('text', 'rule_name', [ 'label' => $this->translate('Rule name'), 'description' => $this->translate('Please provide a rule name'), 'required' => true, ]); $this->addElement('textarea', 'description', [ 'label' => $this->translate('Description'), 'description' => $this->translate( 'An extended description for this Sync Rule. This should explain' . ' what this Rule is going to accomplish.' ), 'rows' => '3', ]); $this->addElement('select', 'object_type', [ 'label' => $this->translate('Object Type'), 'description' => $this->translate('Choose an object type'), 'required' => true, 'multiOptions' => $this->optionalEnum($availableTypes) ]); $this->addElement('select', 'update_policy', [ 'label' => $this->translate('Update Policy'), 'description' => $this->translate( 'Define what should happen when an object with a matching key' . " already exists. You could merge its properties (import source" . ' wins), replace it completely with the imported object or ignore' . ' it (helpful for one-time imports). "Update only" means that this' . ' Rule would never create (or delete) full Objects.' ), 'required' => true, 'multiOptions' => $this->optionalEnum([ 'merge' => $this->translate('Merge'), 'override' => $this->translate('Replace'), 'ignore' => $this->translate('Ignore'), 'update-only' => $this->translate('Update only'), ]) ]); $this->addBoolean('purge_existing', [ 'label' => $this->translate('Purge'), 'description' => $this->translate( 'Whether to purge existing objects. This means that objects of' . ' the same type will be removed from Director in case they no' . ' longer exist at your import source.' ), 'required' => true, 'class' => 'autosubmit', ]); if ($this->getSentOrObjectValue('purge_existing') === 'y') { $this->addElement('select', 'purge_action', [ 'label' => $this->translate('Purge Action'), 'description' => $this->translate( 'Whether to delete or to disable objects subject to purge' ), 'multiOptions' => $this->optionalEnum([ 'delete' => $this->translate('Delete'), 'disable' => $this->translate('Disable'), ]), 'required' => true, ]); } $this->addElement('text', 'filter_expression', [ 'label' => $this->translate('Filter Expression'), 'description' => sprintf( $this->translate( 'Sync only part of your imported objects with this rule. Icinga Web 2' . ' filter syntax is allowed, so this could look as follows: %s' ), '(host=a|host=b)&!ip=127.*' ) . ' ' . $this->translate( 'Be careful: this is usually NOT what you want, as it makes Sync "blind"' . ' for objects matching this filter. This means that "Purge" will not' . ' work as expected. The "Black/Whitelist" Import Property Modifier' . ' is probably what you\'re looking for.' ), ]); $this->setButtons(); } } icingaweb2-module-director-1.11.8/application/forms/SyncRunForm.php000066400000000000000000000034451516513262500253130ustar00rootroot00000000000000rule = $rule; $this->store = $store; } public function assemble() { if ($this->store->getBranch()->isBranch()) { $label = sprintf($this->translate('Sync to Branch: %s'), $this->store->getBranch()->getName()); } else { $label = $this->translate('Trigger this Sync'); } $this->addElement('submit', 'submit', [ 'label' => $label, ]); } /** * @return string|null */ public function getSuccessMessage() { return $this->successMessage; } public function onSuccess() { $sync = new Sync($this->rule, $this->store); if ($sync->hasModifications()) { if ($sync->apply()) { // and changed $this->successMessage = $this->translate(('Source has successfully been synchronized')); } else { $this->successMessage = $this->translate('Nothing changed, rule is in sync'); } } else { // Used to be $rule->get('sync_state') === 'in-sync', $changed = $rule->applyChanges(); $this->successMessage = $this->translate('Nothing to do, rule is in sync'); } } } icingaweb2-module-director-1.11.8/application/locale/000077500000000000000000000000001516513262500224605ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/locale/de_DE/000077500000000000000000000000001516513262500234205ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/locale/de_DE/LC_MESSAGES/000077500000000000000000000000001516513262500252055ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/locale/de_DE/LC_MESSAGES/director.mo000066400000000000000000005265411516513262500273720ustar00rootroot00000000000000Þ•Úì.ͼ]ð|ñ|}}}&}.} B}M}k}‡}š}³} Ê} Ø} ù} ~~~84~ m~y~–~³~Ñ~â~ÿ~(F_~—°Ë åïÿ€ )€6€M€\€ o€!|€ž€<­€?ê€* H!U=wµÓÜ*ô‚8‚?‚Q‚ g‚u‚‚ª‚ ²‚¿‚Õ‚ó‚ƒ>ƒSƒÁX„²…@Í…a†&p†4—†K̆‰‡W¢‡-ú‡W(ˆW€ˆ؈ àˆêˆóˆ ‰‰(‰ /‰:‰B‰R‰a‰ j‰w‰ ˆ‰•‰™‰ ‰ ¯‰ º‰ƉÖ‰ò‰ŠŠ/ŠMŠaŠ yЇЛЫоŠÏŠéŠÿŠ,‹?‹S‹e‹w‹’‹ ¨‹´‹Ä‹Ü‹ó‹ Œ ŒM%Œ(sŒ œŒ½ŒÓŒ ÙŒçŒûŒ TsŽ Ž)›ŽÅŽÝŽ óŽ 5" X"yœ/µå!':bW€AØ:‘JU‘, ‘LÍ‘N’Bi’¬’ ¼’+Ê’4ö’0+“3\“s“<”4A”tv”ë”:k•k¦•^–ªq–3—žP—gï—W˜~טfV™d½™N"šjqšÜšûš ›››2›C› I›"T› w› ›Œ› ©› µ› Ö›Fä› +œ6œIœaœ jœtœ}œ œ ›œ¥œ «œ¸œÌœ Óœàœ óœþœ /;Leðm^žsž‚ž‰ž0™ž:Êž&Ÿ,ŸBŸ.JŸyŸ ‚Ÿ Ÿ,žŸËŸÚŸ éŸ÷ŸP a q ƒ  ’  Ÿ "­ Рï  ø  ¡ ¡¡¯%¡!Õ¡÷¡ ¢!¢;¢ Q¢9]¢—¢°£#Уô£ ú£¤¤'¤*=¤6h¤=Ÿ¤ ݤç¤û¤¥%¥ 7¥UD¥š¥*¦2¦F¦W¦i¦¦ ¦ ¦ª¦³¦6»¦ò¦§§§/§ H§T§1e§—§´§ ǧէ裡¨?8¨)x¨¢¨³¨ º¨ Ȩ֨権(©->©!l©Ž©¤©¸©Õ© ì©ú©ª ª(ª<ªOªXªoª„ª•ª¥ªªÓªêªüª«"«4«D«\«m«€« ‰« •«¢«²«<¹«@ö«L7¬„¬𬠮¬ º¬Ĭ Ô¬ â¬í¬o­ s­­8Ž® Ç® Ñ®BÜ® °)°:°?° F°ÑQ°#± 7±¶E±ü±{²Ì‹²3X´Œ´;§´-ã´(¶A:¶U|¶yÒ¶1L·~· …· · œ·§·®·)È·ò· ¸¸$¸7¸*G¸r¸ ‚¸ ޏ ™¸¥¸ Á¸͸t߸T¹Y¹p¹w¹’¹¢¹¼¹̹1Þ¹ºº'º=ºNº;Wº%“º ¹º ƺÓºåºþº »%$»J»O» X»f»w»!’» ´» »лá»ñ» ¼ ¼<¼wE¼½¼ ͼ Ú¼ä¼õ¼û¼ ½!½7½ @¾L¾ U¾c¾t¾¾ ¦¾°¾¶¾˾ ç¿õ¿KÀ-ZÀ%ˆÀ®À½À+ÓÀÿÀÁ&Á <ÁHÁhÁqÁŽÁI ÁêÁV Â`ÂqÂvÂ}–´ ˠÖÂáÂèÂíÂþÂÃÃ)*Ã)TÃ$~Ã\£Ã Ä ÄÄ5Ä;Ä DÄKRĞĮÄÈÄGáÄ/)ÅYÅmņÅ0–ÅÇÅçÅ îÅ"üÅÆ=ÆkPƼÆ$ÍÆ5òÆ((ÇQÇoÇˆÇ ¤Ç ±Ç½ÇÂÇ ÜÇéÇ#ïÇMÈaÈrÈ{‡ÈÉ É $É 0É;ÉXÉG_ɧɮɷÉÊÉçÉïÉôÉ Ê Ê !Ê +Ê9ÊNÊ ]ÊljÊ ×Ê äÊ ðÊ&úÊ !Ë.Ë>ËSË iË sËŒ~Ë ÍÍ2Í8ÍûQÍ$MÎ$rÎ$—Ξ¼Î [ÐhÐwЎФÐÂÐáÐ òÐýÐ Ñ!.ÑPÑnшÑT&Ò[{Ò ×ÒãÒùÒÒ ÓàÓ&óÓ(Ô)CÕ&mÕ ”Õ¨ Õ IÖ UÖ cÖnÖ}Ö9€ÖºÖ‰KØ(ÕÙþÙÚÚ )Ú7ÚFÚZÚ oÚzÚ ‘ÚŸÚ²ÚÌÚŽÞÚ)mÛ —Ûe¥Û Ýlݵ€Ýg6ÞžÞ0²ßZãßF>à%…à«àºàÃàÞàíàáá0áAáWá_áuáŠá›á®á ÂáÌáÝá6ïá\&ⲃâ‡6ã|¾ã);äeäiäyä‚ä‹ä“ä˜ä?¬äìäåå-å Håiåå"ŸåÂå*Úåæ æ æ%æ7æ GæQæbæsæyæ ‹æ˜æªæÀæoÖætFçt»è0êDêbê<€ê½ê Ïê Üê éêAóêo5ë ¥ë²ëoÂë]2ìHìÙìõì!í!0í`Rí³í Ãí ÍíÙíòíîî,î3î;î Aî[Nîªî »îÈî ÑîÛîâîòî ï ïï3ïGï^ïtïïœï±ïÌï àïìï ÿï ðð2"ð Uð `ðmð6rð=©ð4çðAñ8^ñ3—ñ7Ëñ9ò0=ò-nò0œòÍò Ñò Þòèòðòó óóóó:ó:Só&Žó µó+Öó#ô(&ô-Oô"}ô ô=ºô3øô^,õ'‹õ³õÍõìõ)ö2öMöaö }öžö,£öÐö Öö àöZ÷:\÷—÷0¶÷ ç÷ô÷$ ø2ø^Hø§ø½øÔøéøÿøù 4ù(Bùküˆü‹ü’ü ¤ü °ü ½üÞüùüý $ý0ýAýRýdZý ¿ýÊý=êý(þDþ?aþ^¡þEÿFÿjdÿÏÿzØÿ]S^± ' 5C L W c~oîòû & 5AJAR<”]Ñ:/+j¡–¦8:ß*'Em&†\­Ï ½Ú˜B³ßö_Ö6 F M R  [ i { 0‹ ;¼ ø     &  ? J S  j t } ’ 5¥ .Û ( )3 ]  c q €   •  ¢ °  ·  Å Ð Ù  ù   ! $4 EY Ÿ +¸ ä ù  2Ddx ‰9— Ñ&ß   #/8AI"_‚Z‘ì % /9Q g r Œ ¡V®_!”­¨ V c„"•&¸ßòú $ 3 @L iv‡Ÿ ±¾XÍ &3 FRc{ ” Ÿ ¬ ºÆÏè ÷ % 9CW`v³„8A([„4 Õ Úæþ.E#Z ~ ŠM˜æ).-7e n6x ¯½ Ï Û çó  .MJlJ·   #. 6 BO!U w… Œ—ž¹¿Óì)ó $.?T h vƒ “ ž€«, < FTg~ “Ÿ² ¸ ÂÎáò  " 0 > K4U,ŠB·>ú#9W]µZÔ‘/ ±Á ¢s!’"0©"/Ú", #L7#„#G”#Ü$'÷$%7%:O%.Š%9¹%ó% &*&#H&(l&•&s¬&j 'h‹'…ô'z((›§(C)I*Vh*U¿*+P/+E€++Æ+'ò+4,<O,/Œ,!¼,RÞ,U1-½‡-JE.9._Ê.e*//?­/(í/N0e0+‚0V®0P1%V1M|1IÊ1 2'52]2*b3$30²35ã3+4)E46o4.¦41Õ4)5C152u5!¨5°Ê6A{8+½8é8€:>ƒ;-Â;Að;2<-G<ëu< a=«‚=?.>¿n>‚.?ܱ?dŽ@|óAŒpC;ýC"9D0\DDb¦Df EJpFF»H"I%ICI0`I"‘I8´I'íIDK°ZKz Lz†L}MJMuÊM#@NzdNßN1ûN%-O(SP2|PR¯P/Q#2Q<VQ“Q šQ ¦Q ³Q¿Q(ÒQ ûQRR $R 0R =RGRqeR×SóSüSTT2TIT`TqTvT‰T$›T ÀT#ÌTðTõT UU+,UXUTqUrÆU9V‰SVÝV.åV/WDWaW|W“W¬WÂW ÅW ÓW áW0íWX6X=XMX&kX’X ˜X›£X!?YaY uY‚Y ‡Y ’YžYºY ÉY­ÕY9ƒZ½ZÍZ àZ êZõZþZ[[3+[‡_[$ç[ \ \\ ,\ :\ F\ R\]\e\Tn\=Ã\î]ð]ºø]œ³^§P`2ø`2+a?^a*žaQÉa6b*RbI}b5Çb1ýb3/cCcc0§c#ØcHüc.Edotd ädïde)eÞ=efb8f.›f0Êfžûf0šg†ËgRRh¦¥hMLiˆši(#jLj7lj¦¤j&Kk2rk9¥kVßk³6l¬êl7—m%Ïm õm8nHOnN˜n,çnQoDfo;«oço-…p+³p6ßprqG‰q[ÑqQ-r2r²rËr Ýr5ër$!s%Fsls„sôˆs]}tâÛt´¾u§svõw9xYKx6¥x9Üxy§yTÂy*zÙBz-{­J{ø{|:,|g| l| v|„|Š|‘|˜|œ|¡|¶|¿| È|Ö|-Û|' }1}A} F}T}c}k}t}y}}}€}˜}›}£}²}Ë} Ó}ß}õ}~&~?~]~ w~~ ‰~ •~¡~¨~«~ °~½~Á~É~Í~]€p€ €‰€€˜€ ©€!´€Ö€ó€ % ; I j v ƒŽ6¬ ãð ‚+‚J‚^‚z‚(—‚À‚ׂô‚ ƒ#ƒ=ƒ Uƒ_ƒrƒƒ ¡ƒ®ƒ Áƒ̓ ݃#éƒ „J!„Hl„µ„ Ñ„$Þ„F…J… g…q…+Ž…º…×…Þ…ð… †'†#D†h†q†&ˆ†#¯†Ó†å†@÷†68‡ùoˆÎi‰@8ŠvyŠ'ðŠ@‹`Y‹º‹xHŒ4ÁŒUöŒMLš © ¶#Ãç Ž Ž Ž Ž)Ž >Ž KŽVŽeŽxŽ ‡Ž“ޢ޹ŽÌŽàŽ#øŽ:!T(vŸ¶Ï!ß!:#U!y›;·ó‘+‘"G‘#j‘Ž‘¢‘%º‘2à‘+’!?’a’gw’,ß’ “-“C“I“Y“m“s“„“X•“)î” •<"•_•t•†•-—•<Å•%–((– Q–;r–'®–#Ö–#ú–0—*O—_z—FÚ—W!˜cy˜5ݘT™Wh™KÀ™ ššB.š@qšB²šJõšŽ@›RÏ›L"œ‚oœ¦òœD™sÞ]Rž¾°ž&oŸ£–ŸI: ƒ„ ¡p–¡p¢`x¢}Ù¢%W£}££Ÿ£³£Ì£á£ ê£%õ£ ¤ (¤)4¤ ^¤-k¤™¤T®¤ ¥¥"$¥ G¥ T¥^¥g¥ w¥ „¥Ž¥ ”¥ ¥´¥º¥Ú¥ö¥!¦(¦0¦7¦ K¦W¦h¦¦5‰¦¿§ϧÞ§å§:¨L;¨5ˆ¨'¾¨ æ¨8ó¨ ,© 6© D©3R© †©“©¢©±©bÊ©-ª?ªWª gª uª/ƒª8³ª ìª ÷ª « ««ê"«+ ¬9¬T¬p¬Œ¬ §¬@µ¬>ö¬&5®.\®‹® ’®®¯®¾®5Õ®7 ¯C¯X¯a¯u¯Н¨¯ ¸¯_ů¢%°ȰѰæ°÷° ±± 0± =± I± S±H]±¦±¹± ʱر*ô±²9²:R²$²²² ͲÛ²õ² ³ ³D@³8…³¾³ Ò³ܳí³þ³!´3´*M´4x´)­´×´î´µ%µ?µYµbµzµ ޵¯µµ˵ëµ¶!¶.=¶l¶)‰¶³¶ж#ð¶ ·5·#Q·u·(’·»·Í· à·î·ý·9¸K>¸LЏ׸ë¸ þ¸ ¹¹(¹ 7¹C¹„W¹ ܹ8è¹M!» o» z»ƒ†» ½½$½*½ 1½ø>½7¾ M¾ÕZ¾0¿–G¿Þ¿9ßÁ'ÂIAÂø‹Â#„ÃG¨ÃgðÃŒXÄBåÄ(Å1Å9Å IÅ WÅ$aÅ)†Å#°Å ÔÅßÅïÅ Æ(Æ8Æ HÆ TÆ aÆnƉƎƗÆÇ%ÇBÇIÇdÇtǑǡÇ7¸Ç ðÇûÇÈ/È KÈKWÈ,£È ÐÈ ÜÈèÈ+É/É JÉ5XɎɓɜɯÉ'ÆÉ%îÉÊ #Ê1ÊCÊ)TÊ~Ê#›Ê¿Ê}ÅÊCËXËlË}˔˛˳ËËËKåË 1Í>ÍGÍZÍpÍ†Í  ÍªÍ±ÍPÇÍÏ'Ï]@Ï8žÏ+×ÏÐÐ23ÐfÐ}БР§Ð$µÐÚÐáÐþÐIÑ"ZÑZ}ÑØÑèÑíÑ!üÑ#ÒBÒVÒ_ÒgÒnÒtÒ„Ò™Ò Ò2¯Ò,âÒ(Óf8ÓŸÓ®Ó(½ÓæÓêÓóÓQÔTÔeÔ‚ÔJ¡Ô@ìÔ-ÕDÕ[ÕDoÕ&´ÕÛÕâÕ&ôÕ'ÖCÖ‘_ÖñÖ)×F2×1y×,«×Ø×&÷× Ø ,Ø9Ø@Ø [ØgØ.nØMØëØÙÙ›Ù£Ù »Ù ÇÙÒÙíÙNôÙ CÚ MÚ[ÚqڌڕÚ!šÚ ¼Ú ÇÚÓÚ ÜÚ%éÚ Û Ûu)ÛŸÛ ´ÛÀÛ$ÉÛ îÛúÛ% Ü'2Ü ZÜ eÜŸqÜÞÞ:Þ$@ÞeÞ.jß9™ß+Óß¶ÿß ¶áÃáÒáçáþá&âCâ Wâbâ&râ!™â»âÙâÅóâf¹ã} ä žäªä¿äÏÓä£å'·åßå*îæ+ç EçÑQç #è/è >èHè]è=`èÓžèÔrê8Gì €ì‹ì ì ·ì ÄìÒìæì ÿì í !í.íDíbí¸sí3,î`î¨sîð{$ð¹ ðeZñ,Àñ6íòZ$óTó&Ôóûóôô 4ôBô%Uô {ô‰ô™ô ®ôºôÔôìôÿôõ +õ7õVõ7hõo õØö¡éö›‹÷4'ø\ødø uø ø Žø šø¤øP¾ø#ù3ùOùhù-€ù®ù.Êù0ùù*ú@Fú ‡ú’ú§ú½úÓú éúóúû û"û9ûIû aû‚ûžûÎ,üÏûýËÿ)æÿ)H:ƒ—§ ·C•œ²ÅUED›àû 3XS¬Â Ê Ôõ0M Vaqkù   &4<P fq„¢¶Ñæü+-Y jt‰œ®B¾  7%:]2˜CË:1J?|@¼.ý*, 8W  ”  £  ® ¸  Ê  Õ â é î  N, 8{ $´ 3Ù + +9 =e '£  Ë Sì ;@ | *þ ) "H k 3ˆ ¼ Ü õ %;3Au }#‰g­N!d<†ÃÔ/ó#s>²Ëåÿ4Oiû|-x¦©°  ÌÙñ/ CM\q~y ø <$a|P˜wéMa¯hÌ5€>[¿]y“¢ » Æ Ñ ÝŽéx|ƒ› ¡­¼ÐÙIà?*jj?Õ2ªH²ó[¦4+7c2ƒY¶ð Ø!Ú!Lù!>F"x…#þ$ %%% (%5%G%8[%G”%Ü%å%í% ÿ% & )& 7&C& a& l&v&Œ&,¦&/Ó&-'/1'a' g' t' ‚' '›'²'Â'Ë' â'ï'.ø' '( 4(A(U(-i(]—(#õ(7)Q)j) |) †))¯)!È) ê) **;6*r*(* ª*´*Ë*Ô* Û* å*ð*"++$+P+lg+%Ô+)ú+$, -,$7,#\,€, ’, ,µ, È,dÕ,:-iT-¾-Ð-Ûã-¿.$Ï.ô., /06/g/ /‹/“/ ¨/¶/ Å/ Ñ/Ý/ ø/0)0?0P0g0lv0 ã1ï1 22*"2+M2 y2 …2“2 ¢2®2·2Ò2 â2 ï2ü2313D3^3p3ˆ3š3»Ÿ3 [4 i4'Š4)²4HÜ4%5,5<5 Y5f5€5—5µ5"Ñ5ô56V6#o6“6©6»6Ã6=Ü67 #74-7 b7 n7 |7 ˆ7 ’7 7 ª7 ¶7Â7*Ú7$8J*8Iu8 ¿8Ê8 Þ8è8 î8 ø89" 9-9 A9 K9W9&_9 †99¨9 Ä92Ñ9: ::,:I:b:}:–:´:Ë:‡ä:l;Š; ;º;Ù;ø;<<3<;<C<L< ]<j<z<‚< —< ¤< ±<½<>Æ<+=U1=\‡= ä=e>!k>k>Œù>¶†?Î=@ A;œA3ØA- BF:BB‹BD*7DbDzD;’D;ÎDK EVE%pE%–E*¼E,çEF~2Fk±FnGŠŒGH*HÑ?HIJg6J[žJúJUKqhK/ÚK. L:9LUtL4ÊL.ÿL[.MZŠMáåMmÇNP5Op†Oz÷O-rPP P+ñPKQ%iQ8QhÈQ{1R(­R[ÖRS2S+†S&²SÙS0ïT/ U4PUA…U4ÇU:üU-7V0eVJ–V7áVNW7hWH WÜéXjÆZ81[/j[Üš\Ew^.½^Oì^<_-S__!Ÿ`ÉÁ`;‹aÂÇa•Šb  cb+dŽe—¬gVDh-›h:Éhil$i¨‘i“:kTÎm"#nFnfn=„n!Ân9änJoJipÊ´pˆq‚r‹rQsnsðsˆt%˜t<¾tJût'FvHnvg·v-w-Mwi{wåwìw õwx x*x ?xJxRx bx mx xx&„xš«xFzdzmztzŒz§zÄzázòz÷z {),{ V{.c{’{ –{¤{%´{7Ú{%|q8|–ª|!A}c} i~Bs~8¶~+ï~($Di$…ª­ÄÞ0ð!€ 9€C€T€3s€ §€±€ÎÀ€;!Ëí‚ ‚‚(‚F‚W‚àg‚NHƒ—ƒ­ƒƒу áƒîƒ÷ƒ „G"„²j„/…M…R… Z… h…v…ˆ… ›…¨…±…xÇ…J@†þ‹†Їé’‡Ç|ˆØDŠ8‹9V‹G‹+Ø‹\Œ3aŒ;•ŒvÑŒ>H;‡6ÃMú?HŽ&ˆŽE¯Ž=õŽ~3 ²½Ó)êá!öp‘5‰‘B¿‘¨’I«’õ’P†“²×“NŠ”ŽÙ”'h•'•6¸•²ï•¢–/Á–9ñ–]+—¬‰—‡6˜D¾˜)™%-™CS™t—™q š9~šw¸šg0›=˜›¹Ö›?œAМN¢aLžcQžaµž:ŸRŸ pŸ ‘Ÿ=žŸ,ÜŸ(  2 J M rl¡Þߡ㾢٢£9|¤W¶¥d¦=s¦8±¦´ê¦Ÿ§L½§0 ¨ï;¨J+©¹v©0ªMª;dª ª ¥ª¯ªª ȪÓªÙªÞªæªúª « ««1"«'T«|«“« ˜«¦«µ« ½«Ç«Ì«Ы Õ«ö« ù«¬¬ 5¬@¬R¬r¬ƒ¬.•¬Ĭᬠü¬ ­ ­­ 2­<­?­ G­R­V­^­M#ÝS°Í­éJÕ+,÷èõ×é¯Nwɇ.9•qʤo72‚ÍuAÈKõßyzÛ*³HhCÀx ùÄÀvýJŠ;W*4T\2tÉ…Í:2·>ÁØ fr4Ò{i’橺=ø¡<F¤ÌÅ\n—6ŽÁÍ-6Dzg£!ÂX}&Á@î¨9]ë×ñv. õ'Ï“› ݶ z~|£ˆd¢ï2΢[´K7µs? ï¡¼œV6@¸º(RÆÏ„»=:°ž¸À¬¦±Òç~xŠ  ÚZ–cö^XŒÌ ôŸ«!rKBYIi!§€æaÅ+˹ˆ×íd«²Oc[PÖh+Â(kÊú;F 0ÊÑž \sX›Ù’³I—¸º¿êÛGß$ܾA›r–99péÆ)hs¥Ë“T{Ÿ©V÷°cbqò^Âiô^fªˆŽì%N‡çb3ОwL _£Ô¥­Mö @P)°·êá<QŸxÀÐÈæ¬Z àÄô(™"ªyŒÞ¦× &À.çR\†<9Kz ,%»È¬¡êfˆ¬ªÙþT£ÎèLÓý¾|áÈøÔLÎÜ mÓ*7EªûA…üJEÎ8Ð}Æ?mx俍=IÔ/â`ì ÚðøciÔ¯cš«t• mfnlyts?Bî“†ÉØþÌ`â_Úª8œµ ƒú·ÛXû|?<µ¤—¶ÃüFÓ`Ëe…¢¤5Dò>нi¦³ŽrŸ¾¹Qb•ÚýÞ–ÊJô„¼àÇed€åhMQ‘Þ‘~ D—/ 5F¸ ¢1^"óŽ ‰¦ÇEÃTHëã¶tÖ”÷ØàõÎ÷¶CãÙ±ÓóB«Ö«º$=Þ"+|R–\ ”Ä8>JR¯ùW)â ¥{¸n–rS¤‹Óœó)÷ãyl"=TuòfµÛG´_›4 =å'E”8²în’/þW+˜Hì5½XqÚ¿™g’”åf„¹ ]eèd[©ì¹Å@}oqNyp4@Ê‚PSÿŽ.€¡G¾Ùƒ,ÿøu¨GØÄÜúœ©Ée§Elã#༠êþоüñôT‰®.™ ±0gÒCä ͽ 3'•‚7åö’×iÐáÿåUöúí»Uj¦C±Åuë4к»DâØqÞ‡*v_N¥Ñ<^˜Ã ‘Œ}½WV“йŸä&¸p·S&î”M­m'ëáýKQ20¯ºG‚A—>œÛÉü‹S§pÌÈoÒç½eò˱;‹t¿ž¼¨ÒvÑ€g¶1|3/§( ‚Oš“á€bˆxŠv±’ ¨{}›žÏO,Pƒ­ù˜×K¹éoÐ<%bht®ÇðL„.j x8ÂW{߃23ÅÅ%HÜ¿ÄIFXòwÝ ¶‚äA]U-1«[Ïb·®ẫ™k%Ÿ$Fz¾",„ ‹VaHÊ¥¡_-²ÔV&Ïs‹¬lUûꮌ´%§c`6Æ^U¯r?-š$dÖj6}…/À9èª0ì>5¯•šGaI8Úß`;ñ1ÕCè'”g!Â)›þ¼RÜPw]² »N™~1PÃ-ûÇðB¤Ý@(ÏDlÍÑZ€Dé]Ù°w‘;¿¦:ÖL*ðWV5m#ë»!È¡†Y'N_Æ;†& æ…lŒ(œ‘ãÑÆÇñkuOy,©°óߢÕjš+ð´6w:7†³½õ‰Q£öa©:–Õùo†ˆ¼íOBgHñ¬Q5³íp7$0|\E§ž0ÖR¢´²-•Zmщv#£‡ûµ/­Á˜nõüÁZ[:ïY®h‘MàËkpua>“Ò$‰˜]jÔA‹‡ݘ­ZdkÉjeËOs´ÁÄ3Y)!—k¿ÎB Œ·ƒùÌD? ¨Mý4ŽíqYÿ"Ù3Cø1ïoLaznÙYS®#ØóU#ä…ú`Õ*ÿ„¥çJšïÕIz[Ó{~~³ (inherited from "%s") - not in use -# Used# Vars%d / %d%d Host Template(s)%d Host(s)%d Notification Apply Rule(s)%d Notification Template(s)%d Notification(s)%d Service Apply Rule(s)%d Service Template(s)%d Service(s)%d apply rules have been defined%d created%d deleted%d files%d files rendered in %0.2fs%d have been externally defined and will not be deployed%d modified%d object(s) will be created%d object(s) will be deleted%d object(s) will be modified%d objects found%d objects have been defined%d objects have been modified%d objects, %d templates, %d apply rules%d of them are templates%d templates have been defined%s "%s" has been created%s "%s" has been deleted%s "%s" has been imported"%s "%s" has been modified%s %s(%s)%s (%d members)%s (Applied Service set)%s (Service set)%s (default)%s (inherited from %s)%s (inherited)%s (not an Array!)%s Templates%s argument "%s" has been removed%s based on %s%s config changes are available in your configuration branch%s config changes happend since the last deployed configuration%s has been deactivated on %s%s instances%s is no longer deactivated on %s%s is not available while being in a Configuration Branch: %s%s objects have been modified%s on %s%s on %s (from set: %s)%s related group objects have been created%s templates based on %s%s: %d%s: %s (Snapshot)%s: Property Modifier%s: Snapshots%s: add Property Modifier(Host) group resolve cache(on %s)- add more -- click to add more -- no automatic installation -- please choose -...and %d more...and the modifications below are already in the main branch:A Configuration Basket references specific Configuration Objects or all objects of a specific type. It has been designed to share Templates, Import/Sync strategies and other base Configuration Objects. It is not a tool to operate with single Hosts or Services.A custom LDAP filter to use in addition to the object class. This allows for a lot of flexibility but requires LDAP filter skills. Simple filters might look as follows: operatingsystem=*server*A custom string. Might contain source columns, please use placeholders of the form ${columnName} in such case. Structured data sources can be referenced as ${columnName.sub.key}A detailled description explaining what this choice is all aboutA meaningful description explaining your users what to expect when assigning this set of servicesA new %s has successfully been createdA new Self Service API key for %s has been generatedA property modifier allows you to modify a specific property at import timeA short name identifying this import source. Use something meaningful, like "Hosts from Puppet", "Users from Active Directory" or similarA short name identifying this job. Use something meaningful, like "Import Puppet Hosts"A short name identifying this set of servicesA ticket for this agent could not have been requested from your deployment endpoint: %sA total of %d config changes happened since your last deployed config has been renderedAPI KeyAPI UsersAPI userAccept passive checksAccepts configAcknowledgementActionAction URLActionsActivation ToolActive-PassiveActivityActivity LogActivity Log: %sActivity logAddAdd %sAdd %s objectsAdd %s: %sAdd ServiceAdd Service SetAdd Service Set to %d hostsAdd Service Set to %sAdd Service to %sAdd a new Data FieldAdd a new Data Field CategoryAdd a new Data ListAdd a new Import SourceAdd a new JobAdd a new Sync RuleAdd a new entryAdd a new instanceAdd a new one...Add a service set to "%s"Add a service to "%s"Add another filterAdd chosen objects to a Configuration BasketAdd data list entryAdd import sourceAdd new Icinga %sAdd new Icinga %s templateAdd property modifierAdd serviceAdd service setAdd service to %d hostsAdd sync property ruleAdd sync property: %sAdd sync ruleAdd to BasketAdditional (monitoring module) object filter to further restrict write accessAdditional headers for the HTTP request.Additional notes for this objectAdditional propertiesAgentAgent VersionAggregation ColumnsAliasAll Object TypesAll changesAll changes are tracked in the Director database. In addition you might also want to send an audit log through the Icinga Web 2 logging mechanism. That way all changes would be written to either Syslog or the configured log file. When enabling this please make sure that you configured Icinga Web 2 to log at least at "informational" level.All custom variables (vars)All of themAll overrides have been removed from "%s"All your %s Apply RulesAll your %s TemplatesAllow UpdatesAllow for values not on the listAllow readonly users to see where a Service came fromAllow to access the director APIAllow to access the full audit logAllow to configure hostsAllow to configure notifications (unrestricted)Allow to configure service setsAllow to configure servicesAllow to configure usersAllow to define Service Set Apply RulesAllow to deploy configurationAllow to inspect objects through the Icinga 2 API (could contain sensitive information)Allow to show configuration (could contain sensitive information)Allow to show the full executed SQL queries in some placesAllow to use this entry only to users with one of these Icinga Web 2 rolesAllow unrestricted access to Icinga DirectorAllow users to modify Hosts they are allowed to see in the monitoring moduleAllow users to modify Service they are allowed to see in the monitoring moduleAllow users with Hostgroup restrictions to access the Groups fieldAllowed maximumAllowed rolesAlso clone fields provided by this TemplateAlso clone single Service Sets defined for this HostAlso clone single Services defined for this HostAlso deeper keys can be specific by a dot-notation:Also install NSClient++. It can be used through the Icinga Agent and comes with a bunch of additional Check PluginsAlso rename all "%s" custom variables to "%s" on %d objects?Also wipe all "%s" custom variables from %d objects?Alternative name for this host. Might be a host alias or and kind of string helping your users to identify this hostAlternative name for this user. In case your object name is a username, this could be the full name of the corresponding personAlternative text to be shown in case above icon is missingAn Icinga DSL expression that returns a boolean value, e.g.: var cmd = bool(macro("$cmd$")); return cmd ...An Icinga DSL expression, e.g.: var cmd = macro("$cmd$"); return typeof(command) == String ...An URL leading to additional actions for this object. Often used with Icinga Classic, rarely with Icinga Web 2 as it provides far better possibilities to integrate addonsAn URL pointing to additional notes for this objectAn URL pointing to an icon for this object. Try "tux.png" for icons relative to public/img/icons or "cloud" (no extension) for items from the Icinga icon fontAn alternative display name for this group. If you wonder how this could be helpful just leave it blankAn extended description for this Import Row Modifier. This should explain it's purpose and why it has been put in place at all.An extended description for this Import Source. This should explain what kind of data you're going to import from this source.An extended description for this Sync Rule. This should explain what this Rule is going to accomplish.An extended description for this field. Will be shown as soon as a user puts the focus on this fieldAn object class to search for. Might be "user", "group", "computer" or similarAnother Import Source. We're going to look up the row with the key matching the value in the chosen columnAny first (leftmost) componentApi Key:Applied %sApplied groupsApplied service: %sApplied servicesApplyApply "%s"Apply %d pending schema migrationsApply ForApply RuleApply Rule rendering previewApply RulesApply a pending schema migrationApply changesApply notifications with specific properties according to given rules.Apply ruleApply rule historyApply schema migrationsApply toApply: %sArgumentArgument macrosArgument nameArgumentsArrayAssign whereAssociated TemplateAuthorAutocompleteAutomate all tasksAutomationAvailable choicesBackBasketBasket DefinitionsBasket NameBasket SnapshotsBasket has been uploadedBasketsBe careful: this is usually NOT what you want, as it makes Sync "blind" for objects matching this filter. This means that "Purge" will not work as expected. The "Black/Whitelist" Import Property Modifier is probably what you're looking for.Beginning and EndingBeginning onlyBinaryBranch ActivityCan be managed once this object has been createdCannot apply modification for %s %s, object does not existCannot delete %s %s, it does not existCannot recreate %s %sCaptionCategories bring structure to your Data FieldsCategoryCategory NameCategory nameChanging this value affects %d object(s): %sCharacter MaskCheck CommandsCheck commandCheck command definitionCheck command timeout in seconds. Overrides the CheckCommand's timeout attributeCheck executionCheck for changesCheck intervalCheck periodCheck timeoutChecking this Import Source failedChecking this sync rule failedChecksumChild HostChild ServiceChoice nameChoicesChoose "All" to always add all of them, "Ignore" to not care about a specific Type at all and opt for "Custom Selection" in case you want to choose just some specific Objects.Choose Choice Associated TemplateChoose DB ResourceChoose a Host TemplateChoose a service templateChoose an object typeChoose fileChoose the host this single service should be assigned toChoosing this many options will be mandatory for this Choice. Setting this to zero will leave this Choice optional, setting it to one results in a "required" Choice. You can use higher numbers to enforce multiple options, this Choice will then turn into a multi-selection element.Chose an (optional) parent zoneClick to read our documentation: %sCloneClone "%s"Clone Service SetsClone ServicesClone Template FieldsClone the object as is, preserving importsClone this service to the very same or to another HostClone this service to the very same or to another Service SetClone: %sCloning Apply RulesCloning Import SourcesCloning Sync RulesCloning TemplatesCluster ZoneCombine multiple templates into meaningful Choices, making life easier for your usersComma-separated list of columns that should be aggregated (transformed into an Array). For all other columns only the first value will be kept.CommandCommand DefinitionsCommand TemplateCommand TemplatesCommand arguments: %sCommand endpointCommand nameCommand typeCommandsCommentComparing %s "%s" from Snapshot "%s" to current configCondition (set_if)Condition formatConfigConfig DeploymentConfig deployment failedConfig diffConfig file "%s"Config has been submitted, validation is going onConfig has not been deployedConfig preview: %sConfigurationConfiguration (read-only)Configuration BasketsConfiguration formatConfiguration has been storedConfiguration objects have been added to the chosen basket "%s"Configure this Agent via Self Service APIContent ChecksumCreateCreate BasketCreate SchemaCreate SnapshotCreate a new %s Apply RuleCreate a new %s SetCreate a new %s inheriting from this oneCreate a new %s inheriting from this templateCreate a new Configuration BasketCreate a new TemplateCreate a new objectCreate a new template choiceCreate database schemaCreate schemaCreatedCreating Import SourcesCreating JobsCreating Sync RulesCreating TemplatesCriticalCurrent Template UsageCustom Endpoint NameCustom SelectionCustom VariableCustom Variable variants: %sCustom VariablesCustom Vars - OverviewCustom expressionCustom fields: %sCustom notificationCustom propertiesCustom variableCustom variable (vars.)Custom variablesCustomVar OverviewDB QueryDB ResourceDN componentDNS record typeDaemonDaemon has been stopped %s, was running with PID %s as %s@%sDaemon is running with PID %s as %s@%s, last refresh happened %sDaemon keep-alive is outdated, was last seen running with PID %s as %s@%s %sData Field CategoriesData Field CategoryData FieldsData ListData List EntryData List: %sData ListsData field categoriesData field categories allow to structure Data Fields. Fields with a category will be shown grouped by category.Data fieldsData fields allow you to customize input controls for Icinga custom variables. Once you defined them here, you can provide them through your defined templates. This gives you a granular control over what properties your users should be allowed to configure in which way.Data fields make sure that configuration fits your rulesData listData listsData lists are mainly used as data providers for custom variables presented as dropdown boxes boxes. You can manually manage their entries here in place, but you could also create dedicated sync rules after creating a new empty list. This would allow you to keep your available choices in sync with external data providersData typeDatabase backendDateDay(s)DeactivateDefault configuration format. Please note that v1.x is for special transitional projects only and completely unsupported. There are no plans to make Director a first-class configuration backends for Icinga 1.xDefault global zoneDefault valueDefine Check-, Notification- or Event-Commands. Command definitions are the glue between your Host- and Service-Checks and the Check plugins on your Monitoring (or monitored) systemsDefine Data FieldsDefine Host Groups to give your configuration more structure. They are useful for Dashboards, Notifications or RestrictionsDefine a download Url or local directory from which the a specific Icinga 2 Agent MSI Installer package should be fetched. Please ensure to only define the base download Url or Directory. The Module will generate the MSI file name based on your operating system architecture and the version to install. The Icinga 2 MSI Installer name is internally build as follows: Icinga2-v[InstallAgentVersion]-[OSArchitecture].msi (full example: Icinga2-v2.6.3-x86_64.msi)Define and manage imports from various data sourcesDefine custom Time PeriodsDefine how imported data should be synchronized with IcingaDefine what should happen when an object with a matching key already exists. You could merge its properties (import source wins), replace it completely with the imported object or ignore it (helpful for one-time imports). "Update only" means that this Rule would never create (or delete) full Objects.Define whatever you want to be monitoredDefines after how many check attempts a new hard state is reachedDefining Notifications for User Groups instead of single Users gives more flexibilityDefining Service Groups get more structure. Great for Dashboards. Notifications and Permissions might be based on groups.Delay until the first notification should be sentDeleteDelimiterDependenciesDependencyDeployDeploy %d pending changesDeploy configuration to your Icinga nodesDeploy modified configDeploymentDeployment PathDeployment detailsDeployment modeDeployment mode for Icinga 1 configurationDeployment timeDeploymentsDeprecatedDescriptionDescription of the argumentDestinationDestination FieldDid you know that you can run this entire Health Check (or just some sections) as an Icinga Check on a regular base?DiffDiff with other configDirectDirector Background DaemonDirector HealthDirector Kickstart WizardDirector ObjectDirector SettingsDirector database schema has not been created yetDisableDisable ChecksDisable NotificationsDisable all JobsDisabledDisabled by default, and should only be used in rare cases.Disabled objects will not be deployedDisplay NameDisplay nameDistinct CommandsDo more with custom dataDo not transform at allDocumentationDon't care, my host settings are fineDownDownloadDownload JSONDownload as JSONDownload from a custom urlDownload from packages.icinga.comDowntime endsDowntime nameDowntime removedDowntime startsDrop Self Service API keyDrop the current rowDropdown (list values only)DurationEach Array in the list must contain this property. It's value will be used as the key/object property name for the row.Edit a CategoryEdit a FieldEdit listElement behaviorEmailEnable audit logEnable event handlerEnable flap detectionEnabled the feature for custom endpoint names, where you can choose a different name for the generated endpoint object. This uses some Icinga config snippets and a special custom variable. Please do NOT enable this, unless you really need divergent endpoint names!Ending onlyEndpointEndpoint NameEndpoint addressEndpoint in your Root ZoneEndpoint template nameEndpointsErrorEstablish connectionEvaluates the apply for rule for all objects with the custom attribute specified. E.g selecting "host.vars.custom_attr" will generate "for (config in host.vars.array_var)" where "config" will be accessible through "$config$". NOTE: only custom variables of type "Array" are eligible.Event commandEvent command definitionEvery Dictionary entry has a key, its value will be provided in this columnEvery related downtime will show this commentExclude other time periods from this.Exclude periodExecute active checksExecution interval for this job, in secondsExisting Data ListsExisting templatesExpected ModificationExpert modeExtend the list with new valuesExternalExternal Command DefinitionsExternal CommandsExternal Commands have been defined in your local Icinga 2 Configuration.External Notification CommandsExternal Notification Commands have been defined in your local Icinga 2 Configuration.External ObjectsFQDNFailedFailed to import %s "%s"Feature: Custom Endpoint NameField has been removedField nameField typeFieldsFileFile Content: %sFiles in Stage: %sFilterFilter ExpressionFilter available notification apply rulesFilter available scheduled downtime rulesFilter available service apply rulesFilter available service set templates. Use asterisks (*) as wildcards, like in DB* or *net*Filter methodFirst ElementFirst notification delayFixedFlappingFlapping endsFlapping lower bound in percent for a service to be considered not flappingFlapping startsFlapping threshold (high)Flapping threshold (low)Flapping upper bound in percent for a service to be considered flappingFlatten all inherited properties, strip importsFlush API directoryFor manual configurationForce renderingForm element could not be created, %s is missingForm has successfully been sentFormatFormer objectFully qualified domain name (FQDN)Generate Self Service API keyGenerate a new keyGenerated Host keys will continue to work, but you'll no longer be able to register new Hosts with this keyGenerated configGet alerts when something goes wrongGet an overview of used CustomVars and their variantsGet host by address (Reverse DNS lookup)Get host by name (DNS lookup)Global Director SettingsGlobal Self Service SettingGlobal ZonesGlobal zoneGlueGo back to "%s" DashboardGrace periodGroupGroup by a column, aggregate othersGroup has been inherited, but will be overridden by locally assigned group(s)Group membershipGroup membership: %sGrouping your Services into Sets allow you to quickly assign services often used together in a single operation all at onceGroupsHTTP (this is plaintext!)HTTP HeaderHTTP proxyHTTPS (strongly recommended)HealthHere you can find all single services directly attached to single hostsHiddenHide SQLHint: Check PluginHints regarding this serviceHistoryHostHost Custom variablesHost GroupHost GroupsHost NameHost TemplateHost Template ChoiceHost TemplatesHost addressHost address. Usually an IPv4 address, but may be any kind of address your check plugin is able to deal withHost configsHost groupsHost nameHost name (local part, without domain)Host objectsHost propertiesHost template choiceHost template choicesHostgroupHostgroupsHostgroups that should be directly assigned to this node. Hostgroups can be useful for various reasons. You might assign service checks based on assigned hostgroup. They are also often used as an instrument to enforce restricted views in Icinga Web 2. Hostgroups can be directly assigned to single hosts or to host templates. You might also want to consider assigning hostgroups using apply rulesHostnameHostname, IP or :HostsHosts using this set: %sHow long the downtime lasts. Only has an effect for flexible (non-fixed) downtimes. Time in seconds, supported suffixes include ms (milliseconds), s (seconds), m (minutes), h (hours) and d (days). To express "90 minutes" you might want to write 1h 30mI know what I'm doing, deploy anywayI know, please don't bother me againIP address / hostname of remote nodeIP address / hostname of your Icinga node. Please note that this information will only be used for the very first connection to your Icinga instance. The Director then relies on a correctly configured Endpoint object. Correctly configures means that either it's name is resolvable or that it's host property contains either an IP address or a resolvable host name. Your Director must be able to reach this endpointIPv6 addressIcinga %s SetsIcinga 2 - Objects: %sIcinga 2 API - StatusIcinga 2 Client documentationIcinga Agent and zone settingsIcinga Api usersIcinga DSLIcinga DirectorIcinga Director - Main DashboardIcinga Director Background DaemonIcinga Director ConfigurationIcinga Director Setup: %sIcinga Director decides to deploy objects like CheckCommands to a global zone. This defaults to "director-global" but might be adjusted to a custom Zone nameIcinga Director depends on the following modules, please install/upgrade as requiredIcinga Director offers a Self Service API, allowing new Icinga nodes to register themselvesIcinga HostIcinga InfrastructureIcinga Package NameIcinga cluster zone. Allows to manually override Directors decisions of where to deploy your config to. You should consider not doing so unless you gained deep understanding of how an Icinga Cluster stack worksIcinga for WindowsIcinga object name for this host groupIcinga object name for this host. This is usually a fully qualified host name but it could basically be any kind of string. To make things easier for your users we strongly suggest to use meaningful names for templates. E.g. "generic-host" is ugly, "Standard Linux Server" is easier to understandIcinga object name for this service groupIcinga object name for this user groupIcinga v1.xIcinga v2.11.0 breaks some configurations, the Director will warn you before every deployment in case your config is affected. This setting allows to hide this warning.Icinga v2.xIcinga2 AgentIcon imageIcon image altIdIdentifier for the Icinga command you are going to createIf defined, User Groups from this Custom Variable will be combined with single Groups chosen below. e.g.: when set to notification_groups, this notification will pick User Groups from the Array service.vars.notification_groups and fall back to host.vars.notification_groups, in case the former one does not exist. Only Array type DirectorObject Fields for User objects are eligible for this feature.If defined, Users from this Custom Variable will be combined with single users chosen below. e.g.: when set to notification_contacts, this notification will pick Users from the Array service.vars.notification_contacts and fall back to host.vars.notification_contacts, in case the former one does not exist. Only Array type DirectorObject Fields for User objects are eligible for this feature.If enabled you can not define arguments.IgnoreIgnore Bug #7530Ignore Soft StatesImport SourceImport SourcesImport data sourcesImport external "%s"Import runImport run history: %sImport sourceImport source nameImport source preview: %sImport source: %sImportable templates, add as many as you want. Please note that order matters when importing properties from multiple templates: last one winsImported new data from this Import SourceImported rowsImporting an object means that its type will change from "external" to "object". That way it will make part of the next deployment. So in case you imported this object from your Icinga node make sure to remove it from your local configuration before issueing the next deployment. In case of a conflict nothing bad will happen, just your config won't deploy.ImportsIn case an Icinga Admin provided you with a self service API token, this is where you can register new hostsIn case the Icinga 2 Agent is already installed on the system, this parameter will allow you to configure if you wish to upgrade / downgrade to a specified version with the as well.In case the Icinga 2 Agent should be automatically installed, this has to be a string value like: 2.6.3In case the Icinga Agent will accept configuration from the parent Icinga 2 system, it will possibly write data to /var/lib/icinga2/api/*. By setting this parameter to true, all content inside the api directory will be flushed before an eventual restart of the Icinga 2 AgentIn case you're using %s, please run this Script:In case your API is only reachable through a proxy, please choose it's protocol right hereIn case your proxy requires authentication, please configure this hereInclude other time periods into this.Include periodIndirectIndividual Service objectsInfrastructureInheritance (import)Inherited Template Api Key:Inherited from %sInherited groupsInherited service: %sInspectInspect - object listInspect File ContentInspect PackagesInstall NSClient++Installation SourceInstalledInstaller HashesInternal commandsIt has been renamed since then, its former name was %sIt is not a good idea to do so as long as your Agent still has a valid Self Service API key!It will not be allowed to choose more than this many options. Setting it to one (1) will result in a drop-down box, a higher number will turn this into a multi-selection element.It's currently unknown whether we are in sync with this Import Source. You should either check for changes or trigger a new Import Run.It's currently unknown whether we are in sync with this rule. You should either check for changes or trigger a new Sync Run.It's not allowed to store an empty basketJobJob DefinitionsJob TypeJob nameJob: %sJobsJump to this objectJust download and run this script on your Linux Client Machine:Keep matching elementsKeep only matching rowsKeep the DN as isKeep the JSON string as isKeep the first row with that keyKeep the given stringKeep the last row with that keyKeep the property (hostname) as isKeep the property as isKeep the row, set the column value to nullKeyKey / InstanceKey PropertyKey Property NameKey column nameKickstartKickstart WizardLDAP Search BaseLabelLast Check ResultLast ElementLast notificationLast related activityLast sync run detailsLeave empty for non-positional arguments. Can be a positive or negative number and influences argument orderingLeaving custom variables in place while removing the related field is perfectly legal and might be a desired operation. This way you can no longer modify related custom variables in the Director GUI, but the variables themselves will stay there and continue to be deployed. When you re-add a field for the same variable later on, everything will continue to work as beforeLeaving custom variables in place while renaming the related field is perfectly legal and might be a desired operation. This way you can no longer modify related custom variables in the Director GUI, but the variables themselves will stay there and continue to be deployed. When you re-add a field for the same variable later on, everything will continue to work as beforeLet the import failLet the whole Import Run failLet the whole import run failLimit access to the given comma-separated list of hostgroupsLinux commandlineList EntriesList entriesList nameLiteral dots in a key name can be written in the escape notation:Local directory to deploy Icinga 1.x configuration. Must be writable by icingaweb2. (e.g. /etc/icinga/director)Log DurationMain propertiesManage definitions for your Commands that should be executed as Check Plugins, Notifications or based on EventsManage your Host Templates. Use Fields to make it easy for your users to get them customized.Manage your Icinga 2 infrastructure: Masters, Zones, Satellites and moreManage your Icinga CommandsManage your Icinga HostsManage your Icinga InfrastructureManage your Icinga Service ChecksManage your Service Templates. Use Fields to make it easy for your users to get them customized.Managing FieldsMandatoryMaster-lessMatch NULL value columnsMatch boolean FALSEMatch boolean TRUEMax check attemptsMemberMembersMergeMerge PolicyMight be monday, tuesday or 2016-01-28 - have a look at the documentation for more examplesMinimum requiredModificationModifierModifiersModifyModify %d hostsModify %d objectsModify %sModify a hostModify data list entryModify instance: %sModify this Apply RuleModifying Apply RulesModifying Import SourcesModifying JobsModifying Sync RulesModifying Template ChoicesModifying TemplatesModule nameMonitored ServicesMove downMove upMultiple objectsMy Agents should use DNS to look up Endpoint namesMy changesMySQL schemaNameName for the Icinga dependency you are going to createName for the Icinga endpoint template you are going to createName for the Icinga endpoint you are going to createName for the Icinga notification template you are going to createName for the Icinga notification you are going to createName for the Icinga service you are going to createName for the Icinga user object you are going to createName for the Icinga user template you are going to createName for the Icinga zone you are going to createName for the instance you are going to createName needs to be changed when cloning a TemplateNavNew CategoryNew FieldNew JobNew import sourceNew nameNew objectNextNoNo %s have been created yetNo %s resource availableNo API user configured, you might run the kickstart helperNo Host Template has been provided yetNo Host template has been chosenNo Service Templates have been provided yetNo User object has been created yetNo UserGroup object has been created yetNo action taken, object has not been modifiedNo apply rule has been defined yetNo changes have been madeNo dashboard available, you might have not enough permissionsNo database has been configured for Icinga DirectorNo database resource has been configured yet. Please choose a resource to complete your configNo database schema has been created yetNo object has been chosenNo object has been defined yetNo object has been modifiedNo related template has been provided yetNo service has been chosenNo such service: %sNo template has been chosenNo template has been defined yetNoneNone could be used for deployments right nowNotesNotes URLNothing changed, rule is in syncNothing to do, data provided by this Import Source didn't change since the last import runNothing to do, restore would not modify the current objectNothing to do, rule is in syncNothing would change, this rule is still in syncNotificationNotification Apply RulesNotification Apply Rules based on %sNotification CommandsNotification Commands allow you to trigger any action you want when a notification takes placeNotification TemplateNotification TemplatesNotification commandNotification intervalNotification template choicesNotification templatesNotificationsNotifications are sent when a host or service reaches a non-ok hard state or recovers from such. One might also want to send them for special events like when a Downtime starts, a problem gets acknowledged and much more. You can send specific notifications only within specific time periods, you can delay them and of course re-notify at specific intervals. Combine those possibilities in case you need to define escalation levels, like notifying operators first and your management later on in case the problem remains unhandled for a certain time. You might send E-Mail or SMS, make phone calls or page on various channels. You could also delegate notifications to external service providers. The possibilities are endless, as you are allowed to define as many custom notification commands as you wantNumeric position or key nameOKObjectObject InspectionObject TypeObject classObject dependency relationships.Object has been re-createdObject has been restoredObject propertiesObject typeObject type "%s"Object/Tpl/ApplyObjectsOften the expected result is provided in a property like "objects". Please specify this if required.On failureOne apply rule has been definedOne external object has been defined, it will not be deployedOne object has been definedOne object has been modifiedOne or more characters that should be used to split this stringOne or more characters that will be used to glue an input array to a string. Can be left emptyOne or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00One template has been definedOnly set this parameter if the argument value resolves to a numeric value. String values are not supportedOptionalOptional command timeout. Allowed values are seconds or durations postfixed with a specific unit (e.g. 1m or also 3m 30s).Optional. The child service. If omitted this dependency object is treated as host dependency.Optional. The parent service. If omitted this dependency object is treated as host dependency.Other available fieldsOther sourcesOverride varsOverviewPHP BinaryPHP IntegerPHP VersionPHP version 5.4.x is required for Director >= 1.4.0, you're running %s. Please either upgrade PHP or downgrade Icinga DirectorPIDPackagesPackages on Endpoint: %sPagerParent HostParent ServiceParent ZonePasswordPatternPending database schema migrations have successfully been appliedPlease ask an administrator to grant you access to resourcesPlease check your Basket configuration, %s does not support single "%s" configuration objectsPlease choose a data list that can be used for map lookupsPlease choose a specific Icinga object typePlease choose your import source that should be executed. You could create different schedules for different sources or also opt for running all of them at once.Please choose your synchronization rule that should be executed. You could create different schedules for different rules or also opt for running all of them at once.Please click "Store" once again to determine query columnsPlease click %s to create new DB resourcesPlease click %s to create new resourcesPlease define a %s firstPlease define a related template firstPlease make sure that your database exists and your user has been granted enough permissionsPlease note that importing data will take place in your main Branch. Modifications to Import Sources are not allowed while being in a Configuration Branch. To get the full functionality, please deactivate %sPlease only change those settings in case you are really sure that you are required to do so. Usually the defaults chosen by the Icinga Director should make a good fit for your environment.Please provide a rule namePlease see %s for detailled instructions of how start and end workPlease start typing for a list of suggestions. Dots allow you to access nested properties: column.some.key. Such nested properties cannot be modified in-place, but you can store the modified value to a new "target property"Plugin Check commands are what you need when running checks agains your infrastructure. Notification commands will be used when it comes to notify your users. Event commands allow you to trigger specific actions when problems occur. Some people use them for auto-healing mechanisms, like restarting services or rebooting systems at specific thresholdsPlugin commandsPolicyPortPositionPosition TypePostgreSQL schemaPrefer includesPrepare your configuration in a safe EnvironmentPreserve specific configuration objects in a specific statePreviewProblemProblem handlingProcess ListProcess performance dataPropertiesPropertyProperty modifiers: %sProtectedProtocolPrototypes (methods)Provide Data ListsProvide data lists to make life easier for your usersProvide templates for your TimePeriod objects.Provide templates for your User objects.Provide templates for your notifications.ProxyProxy AddressProxy PasswordProxy UsernamePurgePurge ActionRAW JSON dataRangesRe-deploy nowReactivateRecoveryRegenerate Self Service API keyRegex patternRegisterRegistered AgentRegular ExpressionRegular expression based replacementRegular expression pattern to split the string (e.g. /\s+/ or /[,;]/)Reject matching elementsReject or keep rows based on property valueReject the whole rowRelated ObjectsRemarkRemoveRemove "%s" from this hostRemove this entryRemove this part of your filterRename related varsRender as stringRender configRender the command as a plain string instead of an array.Rendered fileRendered in %0.2fs, deployed in %0.2fsRenderingRepeat keyReplaceReplacementRequiredResolvedRestoreRestore former objectRestore to this target Director DBRetry intervalRetry interval, will be applied after a state change unless the next hard state is reachedReturn custom default valueReturn lookup key unmodifiedRoot ZoneRule nameRun all imports at onceRun all rules at onceRun importRun intervalRun on agentRunning with systemdSOCKS5 proxySchedule and automate Import, Syncronization, Config Deployment, Housekeeping and moreSchedule your notificationsSchedule your notifications. Define who should be notified, when, and for which kind of problemScheduled DowntimeScheduled DowntimesScript or tool to call when activating a new configuration stage. (e.g. sudo /usr/local/bin/icinga-director-activate) (name of the stage will be the argument for the script)Self ServiceSelf Service - Host RegistrationSelf Service APISelf Service API - Global SettingsSelf Service Settings have been storedSend notificationsSent toServiceService Apply RulesService GroupService GroupsService NameService SetService Set has been removedService SetsService TemplateService Template ChoiceService TemplatesService UserService groupsService groups that should be directly assigned to this service. Servicegroups can be useful for various reasons. They are helpful to provided service-type specific view in Icinga Web 2, either for custom dashboards or as an instrument to enforce restrictions. Service groups can be directly assigned to single services or to service templates.Service nameService propertiesService setService set nameService template choiceService template choicesServiceSetServicegroupServicegroupsServicenameServicesServices in this set: %sServices on %sServices: %sServicesetsSet a specific valueSet based on filterSet falseSet no value (null)Set nullSet the value to NULLSet trueSetsSetting a command endpoint allows you to force host checks to be executed by a specific endpoint. Please carefully study the related Icinga documentation before using this featureSettingsSettings have been storedShare this Template for Self Service APIShared for Self Service APIShould all the other characters be lowercased first?ShowShow BasketShow Issue %s on GitHubShow SQLShow affected ObjectsShow all actionsShow available optionsShow based on filterShow details related to this changeShow normalShow resolvedShowing a branched view, with potential changes being visible only in this %sSimple match with wildcards (*)Single Object DiffSingle ServicesSizeSkip keySkip row if this value appears more than onceSnapshotSnapshotsSomething like https://api.example.com/rest/v2/objectsSource ColumnSource ExpressionSource NameSource PathSource TypeSource columnsSource fieldSource nameSpecial propertiesSpecific Element (by key name)Specific Element (by position)Specify headers in text format "Header: Value", each header on a new line.Specify the characters that trim should remove.Default is: " \t\n\r\0\x0B"Stage nameStages in Package: %sStart timeStartupStartup LogStartup TimeStateState and transition type filtersState changesStatesStatisticsStatusStop sharing this TemplateStoreStore configurationStrict, list values onlyStringStrip this operator, preserve child nodesSubmitSucceededSuggested fieldsSwitch to Table viewSwitch to Tree viewSync "%s": %sSync PreviewSync PropertiesSync RulesSync historySync only part of your imported objects with this rule. Icinga Web 2 filter syntax is allowed, so this could look as follows: %sSync propertiesSync ruleSync rule: %sSync to Branch: %sSynchronization failedSynchronization ruleSynchronizeSynchronizing '%s'TableTarget DBTarget HostTarget Service SetTarget data typeTarget propertyTemplateTemplate (Object) TypeTemplate NameTemplate nameTemplate: %sTemplatesTemplates cannot be cloned in Configuration BranchesThanks, I'll verify this and come back laterThe "Import" job allows to run import actions at regular intervalsThe "Sync" job allows to run sync actions at regular intervalsThe %s has successfully been storedThe Config job allows you to generate and eventually deploy your Icinga 2 configurationThe Email address of the user.The Housekeeping job provides various task that keep your Director database fast and cleanThe Icinga Director Background Daemon is not running. Please check our %s in case you need step by step instructions showing you how to fix this.The Icinga Director Self Service API allows your Hosts to register themselves. This allows them to get their Icinga Agent configured, installed and upgraded in an automated way.The Icinga Package name Director uses to deploy it's configuration. This defaults to "director" and should not be changed unless you really know what you're doingThe LDAP properties that should be fetched. This is required to be a comma-separated list like: "cn, dnshostname, operatingsystem, sAMAccountName"The Self Service API key for %s has been droppedThe Service Set "%s" has been added to %d hostsThe argument %s has successfully been storedThe caption which should be displayed to your users when this field is shownThe child host.The command Icinga should run. Absolute paths are accepted as provided, relative paths are prefixed with "PluginDir + ", similar Constant prefixes are allowed. Spaces will lead to separation of command path and standalone arguments. Please note that this means that we do not support spaces in plugin names and paths right now.The corresponding passwordThe domain name you want to be strippedThe first (leftmost) CNThe first (leftmost) OUThe following modifications are visible in this %s only...The given properties have been stored for "%s"The host/service states you want to get notifications forThe last (rightmost) OUThe last attempt failed %s: %sThe last attempt succeeded %sThe last deployment did not succeedThe last deployment is currently pendingThe log duration time.The name of a time period which determines when notifications to this User should be triggered. Not set by default.The name of a time period which determines when this notification should be triggered. Not set by default.The name of a time period which determines when this object should be monitored. Not limited by default.The name of a time period within this job should be active. Supports only simple time periods (weekday and multiple time definitions)The name of the hostThe name of the serviceThe notification interval (in seconds). This interval is used for active notifications. Defaults to 30 minutes. If set to 0, re-notifications are disabled.The numeric bitmask you want to apply. In case you have a hexadecimal or binary mask please transform it to a decimal number first. The result of this modifier is a boolean value, telling whether the given mask applies to the numeric value in your source columnThe pager address of the user.The parent host. You might want to refer Host Custom Variables via $host.vars.varname$The pattern you want to search for. This can be a regular expression like /^www\d+\./The port of the endpoint.The port you are going to use. The default port 5665 will be used if none is setThe property to get from the row we found in the chosen Import SourceThe service "%s" has been added to %d hostsThe service Set that should be assignedThe service set that should be assigned to this hostThe state transition types you want to get notifications forThe string that should be used as a replacementThe string you want to search forThe string/pattern you want to search for, use regular expression like /^www\d+\./The string/pattern you want to search for, use wildcard matches like www.* or *linux*The string/pattern you want to search for. Depends on the chosen method, use www.* or *linux* for wildcard matches and expression like /^www\d+\./ in case you opted for a regular expressionThe unique name of the category used for grouping your custom Data Fields.The user that should run the Icinga 2 service on Windows.There are %d objects with a related property. Should I also remove the "%s" property from them?There are %d objects with a related property. Should I also rename the "%s" property to "%s" on them?There are %d pending changesThere are %d pending changes, %d of them applied to this objectThere are %d pending database migrationsThere are no data fields available. Please ask an administrator to create suchThere are no pending changesThere are no pending changes. Deploy anywayThere are pending changes for this Import Source. You should trigger a new Import Run.There are pending changes for this Sync Rule. You should trigger a new Sync Run.There are pending database migrationsThere has been a single change to this object, nothing else has been modifiedThere have been %d changes to this object, nothing else has been modifiedThere is a single pending changeThese are different available job typesThese are different data providers fetching data from various sources. You didn't find what you're looking for? Import sources are implemented as a hook in Director, so you might find (or write your own) Icinga Web 2 module fetching data from wherever you wantThis Command is currently being used by %sThis Command is currently not in useThis Command is still in use by %d other objectsThis Import Source failed when last checked at %s: %sThis Import Source has an invalid state: %sThis Import Source provides modified dataThis Import Source was last found to be in sync at %s.This Service has been deactivated on this hostThis Sync Rule failed when last checked at %s: %sThis Sync Rule has never been run before.This Sync Rule is in sync and would currently not apply any changesThis Sync Rule was last found to be in Sync at %s.This allows to filter for specific parts within the given source expression. You are allowed to refer all imported columns. Examples: host=www* would set this property only for rows imported with a host property starting with "www". Complex example: host=www*&!(address=127.*|address6=::1)This allows to filter for specific parts within the given source expression. You are allowed to refer all imported columns. Examples: host=www* would set this property only for rows imported with a host property starting with "www". Complex example: host=www*&!(address=127.*|address6=::1). Please note, that CIDR notation based matches are also supported: address=192.0.2.128/25| address=2001:db8::/32| address=::ffff:192.0.2.0/96This allows to show either a drop-down list or an auto-completionThis allows to temporarily disable this jobThis allows you to configure an assignment filter. Please feel free to combine as many nested operators as you want. The "contains" operator is valid for arrays only. Please use wildcards and the = (equals) operator when searching for partial string matches, like in *.example.comThis allows you to configure an assignment filter. Please feel free to combine as many nested operators as you want. You might also want to skip this, define it later and/or just add this set of services to single hosts. The "contains" operator is valid for arrays only. Please use wildcards and the = (equals) operator when searching for partial string matches, like in *.example.comThis allows you to immediately deploy a modified configurationThis allows you to modify properties for "%s"This allows you to modify properties for all chosen hosts at onceThis basket is emptyThis has to be a MySQL or PostgreSQL databaseThis host has been registered via the Icinga Director Self Service API. In case you re-installed the host or somehow lost it's secret key, you might want to dismiss the current key. This would allow you to register the same host again.This is an abstract object type.This is only important in case your master/satellite nodes do not have IP addresses as their "host" property. The Agent can be told to issue related DNS lookups on it' ownThis is the "%s" %s Template. Based on this, you might want to:This is the name of the Endpoint object (and certificate name) you created for your ApiListener object. In case you are unsure what this means please make sure to read the documentation firstThis is where you add all your servers, containers, network or sensor devices - and much more. Every subject worth to be monitoredThis is where you manage your Icinga 2 Host Checks. Host templates are your main building blocks. You can bundle them to "choices", allowing (or forcing) your users to choose among a given set of preconfigured templates.This is where you manage your Icinga 2 Service Checks. Service Templates are your base building blocks, Service Sets allow you to assign multiple Services at once. Apply Rules make it possible to assign Services based on Host properties. And the list of all single Service Objects gives you the possibility to still modify (or delete) many of them at once.This is where you manage your Icinga 2 User (Contact) objects. Try to keep your User objects simply by movin complexity to your templates. Bundle your users in groups and build Notifications based on them. Running MS Active Directory or another central User inventory? Stay away from fiddling with manual config, try to automate all the things with Imports and related Sync Rules!This is where you manage your Icinga 2 infrastructure. When adding a new Icinga Master or Satellite please re-run the Kickstart Helper once.This is your Config master and will receive our DeploymentsThis job has not been executed yetThis job runs every %ds and is currently pendingThis job runs every %ds.This job would run every %ds. It has been disabled and will therefore not be executed as scheduledThis modifier transforms 0/"0"/false/"false"/"n"/"no" to false and 1, "1", true, "true", "y" and "yes" to true, both in a case insensitive way. What should happen if the given value does not match any of those? You could return a null value, or default to false or true. You might also consider interrupting the whole import process as of invalid source dataThis must be a column containing unique values like hostnames. Unless otherwise specified this will then be used as the object_name for the syncronized Icinga object. Especially when getting started with director please make sure to strictly follow this rule. Duplicate values for this column on different rows will trigger a failure, your import run will not succeed. Please pay attention when synching services, as "purge" will only work correctly with a key_column corresponding to host!name. Check the "Combine" property modifier in case your data source cannot provide such a fieldThis name will show up as the author for ever related downtime commentThis object has been created in %sThis object has been disabledThis object has been enabledThis object has modifications visible only in %sThis object will be created in %s.This object will not be deployed as it has been disabledThis pattern will be evaluated, and variables like ${some_column} will be filled accordingly. A typical use-case is generating unique service identifiers via ${host}!${service} in case your data source doesn't allow you to ship such. The chosen "property" has no effect here and will be ignored.This preview has been generated %s, please click %s to regenerate itThis requires the Icinga Agent to be installed. It generates and signs it's certificate and it also generates a minimal icinga2.conf to get your agent connected to it's parentsThis service belongs to the %s Service Set. Still, you might want to override the following properties for this host only.This service belongs to the service set "%s". Still, you might want to change the following properties for this host only.This service has been generated in an automated way, but still allows you to override the following properties in a safe way.This service has been generated using the %s apply rule, assigned where %sThis service has been inherited from %s. Still, you might want to change the following properties for this host only.This set has been inherited from %sThis synchronizes Icinga Director to your Icinga 2 infrastructure. A new run should be triggered on infrastructure changesThis template is not in useThis template is still in use by %d other objectsThis value will be evaluated, and variables like ${some_column} will be filled accordingly. A typical use-case is generating unique service identifiers via ${host}!${service} in case your data source doesn't allow you to ship such. The chosen "property" has no effect here and will be ignored.This will be part of the next deploymentThis will be shown as a label for the given choiceThis will be the name of the custom variable in the rendered Icinga configuration.This will be the visible caption for this entryThis will invalidate the former keyThis will not be part of any deployment, unless being mergedTicketTime PeriodTime PeriodsTime periodTime period rangesTime range "%s" has been removed from %sTime rangesTimeoutTimeperiod TemplatesTimeperiodsTimerperiodsTimestampTo be managed on objects onlyTo ensure downloaded packages are build by the Icinga Team and not compromised by third parties, you will be able to provide an array of SHA1 hashes here. In case you have defined any hashses, the module will not continue with updating / installing the Agent in case the SHA1 hash of the downloaded MSI package is not matching one of the provided hashes of this settingToggles (boolean arguments)Top DownTotalTransform Host NameTransform Parent Host to IPTransform to lowercaseTransform to uppercaseTransition typesTreeTrigger Import RunTrigger this SyncTriggering this Import Source failedTrim MethodTweak some global Director settingsTypeType attributesURL componentUUID: from binary to hexUnable to detect your Icinga 2 Core versionUnable to fetch data: %sUnable to store a host with the given properties because of insufficient permissionsUnable to store the configuration to "%s". Please check file permissions or manually store the content shown belowUndeployed configurationsUnit is seconds unless a suffix is given. Supported suffixes include ms (milliseconds), s (seconds), m (minutes), h (hours) and d (days).UnknownUnknown, failed to collect related informationUnknown, still waiting for config check outcomeUnlinked imported propertiesUnlinked imported row setsUnlinked imported rowsUnsatisfied dependenciesUnused rendered filesUpUpdate MethodUpdate PolicyUpdate onlyUpgrading Icinga 2 - Confic Sync: Zones in ZonesUpgrading documentationUploadUpload a BasketUpload a Configuration BasketUpload a Configuration Basket SnapshotUsageUsage (%s)Use a different name for the generated endpoint object than the host name and add a custom variable to allow services setting the correct command endpoint.Use a local file or network shareUse lowercase firstUsed sourcesUserUser GroupUser GroupsUser Groups Custom VariableUser TemplatesUser groupsUser groups that should be directly assigned to this user. Groups can be useful for various reasons. You might prefer to send notifications to groups instead of single usersUser groups that should be notified by this notificationsUser propertiesUser template nameUsergroupUsergroupsUsernameUsersUsers / ContactsUsers Custom VariableUsers that should be notified by this notificationsUsing Apply Rules a Service can be applied to multiple hosts at once, based on filters dealing with any combination of their propertiesUsually your hosts main IPv6 addressValueValue typeVariable ValueVariable nameVerify HostVerify PeerVisibilityVisibleVolatileWARNING, this can allow shell script injection via custom variables used in command.Want to connect to your Icinga Agents? Have a look at our %s!Want to define to execute specific checks only withing specific time periods? Get mobile notifications only out of office hours, but mail notifications all around the clock? Time Periods allow you to tackle those and similar requirements.WarningWarning: you're running Icinga v2.11.0 and our configuration looks like you could face issue %s. We're already working on a solution. The GitHub Issue and our %s contain related details.What kind of object this should be. Templates allow full access to any property, they are your building blocks for "real" objects. External objects should usually not be manually created or modified. They allow you to work with objects locally defined on your Icinga nodes, while not rendering and deploying them with the Director. Apply rules allow to assign services, notifications and groups to other objects.What should happen if the lookup key does not exist in the data list? You could return a null value, keep the unmodified imported value or interrupt the import processWhat should happen when the given string is empty?What should happen when the result array is empty?What should happen when the specified element is not available?What should happen with matching elements?What should happen with the row, when this property matches the given expression?What should happen, if the given pattern doesn't matchWhat should we do if the DNS lookup fails?What should we do if the URL could not get parsed or component not found?What should we do if the desired part does not exist?What should we do if the host (DNS) lookup fails?What should we do in case the given value is empty?What should we do in case we are unable to decode the given string?What should we do, if the same key occurs twice?What should we extract from the DN?What should we place into this Basket every time we create new snapshot?What to use as your Icinga 2 Agent's Host NameWhen deploying configuration, wait at least this amount of seconds unless the next deployment should take placeWhen emptyWhen not availableWhen not matchedWhen the last notification should be sentWhen you feel the desire to manually create Zone or Endpoint objects please rethink this twice. Doing so is mostly the wrong way, might lead to a dead end, requiring quite some effort to clean up the whole mess afterwards.Where to trim the string(s)Whether Downtimes should also explicitly be scheduled for all Services belonging to affected HostsWhether all configured Jobs should be disabledWhether flap detection is enabled on this objectWhether rendering should be forced. If not enforced, this job re-renders the configuration only when there have been activities since the last rendered configWhether the agent is configured to accept configWhether the argument value is a string (allowing macros like $host$) or an Icinga DSL lambda function (will be enclosed with {{ ... }}Whether the check commmand for this service should be executed on the Icinga agentWhether the parameter name should not be passed to the command. Per default, the parameter name (e.g. -H) will be appended, so no need to explicitly set this to "No".Whether the parent (master) node should actively try to connect to this agentWhether the set_if parameter is a string (allowing macros like $host$) or an Icinga DSL lambda function (will be enclosed with {{ ... }}Whether this argument should be requiredWhether this check is volatile.Whether this dependency should affect hosts or servicesWhether this downtime is fixed or flexible. If unsure please check the related documentation: https://icinga.com/docs/icinga2/latest/doc/08-advanced-topics/#downtimesWhether this field should be mandatoryWhether this host has the Icinga 2 Agent installedWhether this notification should affect hosts or servicesWhether this parameter should be repeated when multiple values (read: array) are givenWhether this should be a String or an Array in the generated Icinga configuration. In case you opt for Array, Director users will be able to select multiple elements from the listWhether this zone should be available everywhere. Please note that it rarely leads to the desired result when you try to distribute global zones in distrubuted environmentsWhether to accept passive check results for this objectWhether to actively check this objectWhether to adjust your host nameWhether to delete or to disable objects subject to purgeWhether to disable checks when this dependency fails. Defaults to false.Whether to disable notifications when this dependency fails. Defaults to true.Whether to enable event handlers this objectWhether to ignore soft states for the reachability calculation. Defaults to true.Whether to prefer timeperiods includes or excludes. Default to true.Whether to process performance data provided by this objectWhether to purge existing objects. This means that objects of the same type will be removed from Director in case they no longer exist at your import source.Whether to send notifications for this objectWhether to send notifications for this userWhether to use encryption when talking to the REST APIWhether we should check that our peer's certificate has been signed by a trusted CA. This is strongly recommended.Whether we should check that the certificate matches theconfigured hostWhether you want to merge or replace the destination field. Makes no difference for stringsWill be stored as a custom variable value when this entry is chosen from the listWill be used to authenticate against your REST APIWindows Kickstart ScriptWipe related varsWith ServicesWondering about what changed why? Track your changes!Working with Agents and Config ZonesWrap this expression into an operatorYES, please delete "%s"YesYou can create Basket snapshots at any time, this will persist a serialized representation of all involved objects at that moment in time. Snapshots can be exported, imported, shared and restored - to the very same or another Director instance.You can stop sharing a Template at any time. This will immediately invalidate the former key.You could immediately apply eventual changes or just learn about them. In case you do not want them to be applied immediately, defining a job still makes sense. You will be made aware of available changes in your Director GUI.You might want to let the generated Powershell script install the Icinga 2 Agent in an automated way. If so, please choose where your Windows nodes should fetch the Agent installerYou might want to show this field only when certain conditions are met. Otherwise it will not be available and values eventually set before will be cleared once storedYou might want to write the modified value to another (new) property. This property name can be defined here, the original property would remain unmodified. Please leave this blank in case you just want to modify the value of a specific propertyYou must define some %s before you can run this Sync RuleYou're currently in the master branch, your changes will make part of the next DeploymentYou're currently working in a Configuration Branch: %sYou're currently working in the main Configuration BranchYour DB schema (migration #%d) is newer than your code base. Downgrading Icinga Director is not supported and might lead to unexpected problems.Your Icinga 2 API usernameYour LDAP search base. Often something like OU=Users,OU=HQ,DC=your,DC=company,DC=tldYour changes are going to be stored in %s.Your configuration looks good. Still, you might want to re-run this kickstart wizard to (re-)import modified or new manually defined Command definitions or to get fresh new ITL commands after an Icinga 2 Core upgrade.Your database looks good, you are ready to %sYour installation of Icinga Director has not yet been prepared for deployments. This kickstart wizard will assist you with setting up the connection to your Icinga 2 server.Your regular check intervalYour replacement stringYour users will be allowed to choose among those templatesZoneZone nameZone settingsZonesa listactiveallbackconfiguration branchcriticaldisableddocumentationdowne.g. -H or --hostname, empty means "skip_key"e.g. 5%, $host.name$, $lower$%:$upper$%failed to fetchherehost var namehost var valuemissingmodifiedmorenewnono related group existsokon hoston service setone related group existspendingreturn NULLreturn an empty arrayservice var nameservice var valuestart working with the Icinga Directorthe main configuration branchthis configuration branchunchangedunknownunreachableunsupportedunusedupusedvalue formatviawarningyesProject-Id-Version: Director Module (master) Report-Msgid-Bugs-To: ISSUE TRACKER PO-Revision-Date: 2023-09-21 10:53+0200 Last-Translator: Thomas Gelf Language: de_DE Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Basepath: . X-Poedit-SearchPath-0: . (geerbt von "%s") - unbenutzt -# Benutzt# Vars%d / %d%d Host-Vorlagen%d Host(s)%d Benachrichtigungs-Apply-Regeln%d Benachrichtigungsvorlagen%d Benachrichtigung(en)%d Service Apply-Regel(n)%d Service-Vorlage(n)%d Service(s)%d Apply-Regeln wurden definiert%d erstellt%d gelöscht%d Dateien%d Dateien in %0.2fs erstellt%d wurden extern definiert und werden nicht ausgerollt%d geändert%d Objekt(e) werden erstellt%d Objekt(e) werden gelöscht%d Objekt(e) werden verändert%d Objekte gefunden%d Objekte wurden definiert%d Objekte wurden verändert%d Objekte, %d Vorlagen, %d Apply-Regeln%d davon sind Vorlagen%d Vorlagen wurden definiert%s "%s" wurde erstellt%s "%s" wurde gelöscht%s "%s" wurde importiert"%s "%s" wurde geändert%s %s(%s)%s (%d Mitglieder)%s (zugewiesenes Service-Set)%s (Service-Set)%s (default)%s (geerbt von %s)%s (geerbt)%s (kein Array)%s VorlagenDas %s-Argument "%s" wurde entfernt%s basierend auf %s%s Konfigurationsänderungen sind in diesem Konfigurationszweig verfügbar%s Konfigurationsänderungen seit der letzten ausgerollten Konfiguration%s wurde auf %s deaktiviert%s Instanzen%s ist auf %s nicht mehr deaktiviert%s ist beim Arbeiten in einem Konfigurationszweig nicht verfügbar: %s%s Objekte wurden verändert%s auf %s%s auf %s (aus dem Set "%s")%s verwandte Gruppenobjekte wurden erstellt%s Vorlagen basierend auf %s%s: %d%s: %s (Snapshot)%s: Eigenschaftsmodifikatoren%s: Snapshots%s: Eigenschaftsmodifikator hinzufügenGruppenmitgliedschaftscache (Hosts)(auf %s)- mehr hinzuzufügen -- Hier klicken um mehr hinzuzufügen -- keine automatische Installation -- bitte wählen -...und %d weitere...und folgende Änderungen befinden sich bereits im Hauptzweig:Ein Konfiguratinsbasket referenziert bestimmte Konfigurationsobjekte oder alle Objekte eines bestimmten Typs. Er wurde entworfen um Vorlagen, Import/Synchronisationsstrategien und andere grundlegende Konfigurationsobjekte zu teilen. Dies ist kein Werkzeug welches sich um einzelne Hosts oder Services kümmert.Ein benutzerdefinierter LDAP Filter zur gemeinsamen Verwendung mit der Objektklasse. Dies gewährt ein großes Maß an Flexibilität, benötigt jedoch Kenntnisse über LDAP Filter. Einfache Filter können wie folgt aussehen: operatingsystem=*server*Benutzerdefinierte Zeichenkette. Falls Quellspalten enthalten sind, müssen Platzhalter in der Form ${columnName} genutzt werden. Strukturierte Daten können mittels ${columnName.sub.key} addressiert werdenEine detaillierte Beschreibung zum Sinn und Zweck dieser AuswahlEine aussagekräftige Beschreibung, die den Benutzern erklärt, was geschieht, wenn dieses Service-Set zugewiesen wirdEin neuer %s wurde erfolgreich erstelltEin neuer Selbstbedienungs-API-Schlüssel für %s wurde erstelltEin Eigenschaftsmodifikator erlaubt das Verändern bestimmter Eigenschaften während des ImportsEine kurzer Name um diese Importquelle zu bezeichnen. Sprechende Bezeichnungen wie "Hosts aus Puppet" oder "Benutzer aus LDAP" bieten sich anEine kurzer Name um diesen Auftrag zu bezeichnen. Sprechende Bezeichnungen wie "Puppet Hosts importieren" bieten sich anEine kurzer Name um dieses Service-Set zu bezeichnenFür diesen Agenten konnte kein Ticket vom Deployment-Endpoint angefordert werden: %sInsgesamt wurde die Konfiguration %d mal seit dem letzten Ausrollen geändertAPI-SchlüsselAPI BenutzerAPI BenutzerPassive Checkergebnisse akzeptierenAkzeptiert KonfigurationBestätigungAktionAktions-URLAktionenAktivierungswerkzeugAktiv-PassivAktivitätAktivitätslogAktivitätslog: %sAktivitätslogHinzufügen%s hinzufügen%s Objekte hinzufügen%s hinzufügen: %sService hinzufügenService-Set hinzufügenFüge Service-Set zu %d Hosts hinzuService-Set zu %s hinzufügenService zu %s hinzufügenEinen neues Datenfeld hinzufügenEine neue Datenfeldkategorie hinzufügenDatenliste hinzufügenImportquelle hinzufügenJob hinzufügenSynchronisationsregel hinzufügenEinen neuen Eintrag hinzufügenNeue Instanz hinzufügenEinen Neuen hinzufügen...Füge ein Service-Set zu "%s" hinzuFüge einen Service zu "%s" hinzuWeiteren Filter hinzufügenGewählte Objekte zu einem Konfigurationsbasket hinzufügenDatenlisteneintrag hinzufügenImportquelle hinzufügenNeuen Icinga %s hinzufügenNeue Icinga %s Vorlage hinzufügenEigenschaftsmodifikator hinzufügenService hinzufügenService-Set hinzufügenFüge einen Service zu %d Hosts hinzuRegel für Synchronisationseigenschaft hinzufügenSynchronisationseigenschaft hinzufügen: %sSynchronisationsregel hinzufügenZu Basket hinzufügenZusätzliche (Monitoring-Modul-spezifische) Objekt-Filter, um den Schreibzugriff weiter einzuschränkenZusätzliche HTTP-Header für diesen RequestWeitere Notizen zu diesem ObjektWeitere EigenschaftenAgentAgenten-VersionAggregationsspaltenAliasAlle ObjekttypenAlle ÄnderungenAlle Änderungen werden in der Director-Datenbank nachvollziehbar gespeichert. Zusätzlich kann ein Revisionslog durch den Logging-Mechanismus von Icinga Web 2 geschickt werden. Auf diese Weise werden alle Änderungen entweder an Syslog oder die konfigurierte Logdatei geschickt. Dafür muss Icinga Web 2 mindestens mit dem "Info" Level loggen.Alle benutzerdefinierten Variablen (vars)All dieseAlle überschriebenen Eigenschaften wurden von "%s" entferntAlle %s Apply RegelnAlle %s TemplatesUpdates erlaubenErlaube Werte die nicht au f der Liste stehenErlaube Nur-Lesen-Benutzern zu sehen woher ein Service kommtZugriff auf die Director API erlaubenZugriff auf das volle Audit-Log erlaubenErlauben, Hosts zu konfigurierenErlaube (unbeschränkt) Benachrichtigungen zu konfigurierenErlauben, Service-Sets zu konfigurierenErlauben, Services zu konfigurierenErlauben, Benutzer zu konfigurierenErlaube Definieren von Service-Set Apply-RegelnDas Ausrollen von Konfigurationen erlaubenUntersuchen von Objekten über die API von Icinga 2 erlauben (könnte sensible Daten enthalten)Anzeigen der Konfiguration erlauben (könnte sensible Daten enthalten)Erlaube das Anzeigen der vollständigen ausgeführten SQL-Statements an einigen StellenErlaube es ausschließlich Benutzern mit einer dieser Icinga Web 2 Rollen, diesen Eintrag zu nutzenUnbeschränkten Zugriff auf die Director API erlaubenErlaube Benutzern, Hosts zu bearbeiten, welche sie im Monitoring-Modul sehen dürfenErlaube Benutzern, Services zu bearbeiten, welche sie im Monitoring-Modul sehen dürfenMache Benutzern mit Hostgruppenbeschränkung das Feld "Gruppen" zugänglichErlaubtes MaximumErlaubte RollenKlone auch Felder welche durch diese Vorlage bereitgestellt werdenKlone auch Service-Sets welche für diesen Host definiert wurdenKlone auch Einzelservices welche für diesen Host definiert wurdenAuch tieferliegende Schlüssel können via Punkt-Notation erreicht werden:Installiere auch NSClient++. Dieser kann über den installierten Icinga Agent genutzt werden und bringt eine Reihe zusätzlicher Check-PluginsAuch alle benutzerdefinierten "%s" Variablen nach "%s" auf %d Objekten umbenennen?Außerdem alle "%s" benutzerdefinierten Variablen von %d Objekten entfernen?Alternativer Name für diesen Host. Kann ein Alias oder jede Zeichenkette sein, die Benutzern hilft, diesen Host zu identifizierenAlternativer Name für diesen Benutzer. Falls der Name des Objekts ein Benutzername ist, könnte hier der vollständige Name der betreffenden Person hinterlegt werdenAlternativer Text der angezeigt werden soll, falls obiges Icon fehltEin Icinga DSL Ausdruck welcher einen booleschen Wert liefert, z.B.: var cmd = bool(macro("$cmd$")); return cmd ...Ein Icinga DSL Ausdruck, z.B.: var cmd = macro("$cmd$"); return typeof(command) == String ...Eine URL zu weiteren Aktionen für dieses Objekt. Wird oft mit Icinga Classic, jedoch selten mit Icinga Web 2 genutzt, da dieses viel bessere Möglichkeiten zur Integration von Addons bietetEine URL zu Notizen für dieses ObjektEine URL zu einem Icon für dieses Objekt. "tux.png" für Icons relativ zu public/img/icons oder "cloud" (ohne Erweiterung) für Objekte aus dem Icinga Icon-FundusEin alternativer Anzeigename für diese Gruppe. Kann leer gelassen werdenEine erweiterte Beschreibung für diesen Eigenschaftsmodifikator. Diese soll seine Aufgabe sowie seinen Sinn und Zweck beschreiben.Eine erweiterte Beschreibung für diese Import-Quelle. Diese sollte erläutern, welche Art von Daten von dieser Quelle bereitgestellt werden.Eine erweiterte Beschreibung für diese Synchronisationsregel. Sollte erläutern was diese Regel bezwecken will.Eine ausführliche Beschreibung dieses Felds. Wird angezeigt, sobald ein Benutzer den Fokus auf dieses Feld legtDie Objektklasse, nach der gesucht werden soll. z.B. "user", "group", "computer" oder ÄhnlichesEine andere Import-Quelle. Wir suchen dort eine Zeile mit einem Schlüssel, der dem Wert in der gewählten Spalte entsprichtBeliebige erste (linkeste) KomponenteAPI-Schlüssel:Angewendete(r) %sAngewendete GruppenZugewiesener Service: %sZugewiesene ServicesAnwendenApply "%s"%d Schema-Migrations-Scripte anwendenAnwenden aufApply-RegelRendering-Vorschau für diese Apply-RegelApply-RegelnEin ausstehende Schema-Migration durchführenÄnderungen anwendenBenachrichtigungen mit bestimmten Eigenschaften anhand von gegebenen Regeln anwendenApply RegelApply-Regel HistorieSchema-Migrations-Scripte anwendenAnwenden aufApply: %sArgumentArgument MakrosArgumentnameArgumenteArrayZuweisen woZugehörige VorlageAutorAutomatische VervollständigungAutomatisiere alle AufgabenAutomatisierungVerfügbare AuswahlmöglichkeitenZurückBasketBasket-DefinitionenBasket-NameBasket-SnapshotsBasket wurde hochgeladenBasketsVorsicht: das ist für gewöhnlich NICHT das was man möchte, denn es macht Sync "blind" für Objekte die diesem Filter entsprechen. Das bedeutet meist dass das "Bereinigen" nicht wie erwartet funktioniert. Der "Black/Whitelist"-Eigenschaftsmodifikator ist für gewöhnlich was man stattdessen nutzen möchte.Anfang und EndeNur den AnfangBinaryAktivität in diesem ZweigKann verwaltet werden, sobald dieses Objekt erstellt wurdeÄnderung für %s %s kann nicht angewandt werden, das Objekt existiert nicht%s %s kann nicht gelöscht werden, es existiert nicht%s %s kann nicht erneut erstellt werdenBeschriftungKategorien bringen Struktur in konfigurierte DatenfelderKategorieKategorienameKategorienameDiesen Wert zu ändern beeinflusst %d Objekt(e): %sZeichenmaskeCheck-KommandoCheck-KommandoCheck-KommandodefinitionTimeout für das Check-Kommando in Sekunden. Überschreibt die Timeout-Konfiguration des KommandosCheck-AusführungAuf Änderungen prüfenCheck-IntervallCheckzeitraumCheck-TimeoutÜberprüfen dieser Importquelle fehlgeschlagenÜberprüfen dieser Synchronisationsregel fehlgeschlagenPrüfsummeKind-HostKind-ServiceAuswahlnameAuswahlWählen Sie "Alle" um immer alle davon hinzuzufügen, "Ignorieren" um sich nicht um einen bestimmten Typ zu kümmern und entscheiden Sie sich für "Benutzerdefinierte Auswahl" wenn nur bestimmte Objekte manuell gewählt werden sollen.Wähle eine der Auswahl zugehörige VorlageDatenbankressource wählenWähle eine Service-VorlageWähle eine Service-VorlageEinen Objekttyp auswählenDatei wählenHost wählen, dem dieser einzelne Service zugewiesen werden sollDiese Anzahl an Optionen müssen für diese Auswahl zwingend gewählt werden. Setzt man diese Einstellung auf Null, wird die Auswahl optional, setzt man sie auf Eins wird die Auswahl zwingend. Setzt man eine höhere Anzahl kann man mehrere Optionen erzwingen, die Auswahl wandelt sich dann in ein Mehrfach-Auswahlfeld.Eine (optionale) Elternzone auswählenAnklicken um unsere Dokumentation zu lesen: %sKlonenKlone "%s"Klone Service-SetKlone ServicesVorlagen-Felder klonenObjekt vollständig unter Erhalt der Vererbung klonenKlone diesen Service zum selben oder einem anderen HostKlone diesen ServiceKlone %sApply-Regeln klonenImportquellen klonenSynchronisationsregeln klonenVorlagen KlonenCluster ZoneKombiniere mehrere Vorlagen zu sprechenden Wahlmöglichkeiten, um die Benutzung zu vereinfachenKommagetrennte Liste von Spalten, welche aggregiert (in ein Array verwandelt) werden sollen. Für alle anderen Spalten wird lediglich der erste Wert beibehalten.KommandoKommandodefinitionenKommando-VorlageKommando-VorlagenKommandoargumente: %sKommandoendpunktKommandonameKommandotypKommandosKommentarVergleiche %s "%s" aus dem Snapshot "%s" mit der aktuellen KonfigurationBedingung (set_if)BedingungsformatKonfigurationAusrollen der KonfigurationAusrollen der Konfiguration fehlgeschlagenKonfigurationsunterschiedKonfigurationsdatei "%s"Konfiguration wurde übergeben, Überprüfung ist im GangeKonfiguration wurde nicht ausgerolltKonfigurationsvorschau: %sKonfigurationKonfiguration (nur lesen)KonfigurationsbasketsKonfigurationsformatKonfiguration wurde gespeichertKonfigurationsobjekte wurden zum gewählten Basket "%s" hinzugefügtKonfiguriere diesen Agent über die Selbstbedienungs-APIPrüfsumme (Inhalt)ErstellenBasket erstellenSchema erstellenSnapshot erstellenErstelle eine neue %s Apply-RegelErstelle ein neues %s-SetNeuen und von diesem erbenden %s erstellenEinen neuen von dieser Vorlage erbenden %s erstellenErstelle einen neuen KonfigurationsbasketNeue Vorlage erstellenNeues Objekt erstellenNeue Template-Auswahl erstellenDatenbankschema erstellenDatenbankschema erstellenErstelltImportquellen erstellenAufträge erstellenSynchronisationsregeln erstellenVorlagen erstellenKritischAktuelle Nutzung dieser VorlageIndividueller EndpunktnameBenutzerdefinierte AuswahlBenutzerdefinierte VariableVarianten der benutzerdefinierten Variable: %sBenutzerdefinierte VariablenBenutzerdefinierte Variablen - ÜbersichtBenutzerdefinierter AusdruckBenutzerdefinierte Felder: "%s"Benutzerdefinierte BenachrichtigungBenutzerdefinierte EigenschaftenBenutzerdefinierte VariableBenutzerdefinierte Variable (vars.)Benutzerdefinierte VariablenBenutzerdefinierte Variable - ÜbersichtDatenbank-AbfrageDatenbankressourceDN KomponenteDNS-Record-TypDienstDienst wurde %s gestoppt, lief zuvor mit PID %s als %s@%sDienst läuft mit PID %s als %s@%s, die letzte Aktualisierung fand %s stattDaemon keep-alive is outdated, was last seen running with PID %s as %s@%s %sDatenfeldkategorienDatenfeldkategorieDatenfelderDatenlisteDatenlisteneintragDatenliste: %sDatenlistenDatenfeldkategorienDatenfeldkategorien erlauben es, Datenfelder zu strukturieren. Felder mit einer Kategorie werden nach Kategorie gruppiert angezeigt.DatenfelderDatenfelder erlauben es, Eingabefelder für benutzerdefinierte Variablen zu personalisieren. Sobald diese hier definiert wurden, können sie über definierte Templates zur Verfügung gestellt werden. Das erlaubt eine granuläre Kontrolle darüber, welche Eigenschaften in welche Weise konfigurierbar sein sollen.Datenfelder sorgen dafür, dass die Konfiguration in vorgegebene Regeln passtDatenlisteDatenlistenDatenlisten werden hauptsächlich als Datenquelle für benutzerdefinierte Variablen benutzt, die in Dropdown-Auswahlfeldern präsentiert werden. Ihre Einträge können hier manuell, oder über eine dedizierte Synchronisationsregel nach dem Anlegen einer leeren Liste verwaltet werden. Letzteres erlaubt das Synchronisieren der verfügbaren Auswahlmöglichkeiten mit externen DatenquellenDatentypDatenbankbackendDatumTag(e)DeaktivierenStandardkonfigurationsformat. Bitte beachten, dass v1.x nur für ganz spezielle Migrationsprojekte implementiert wurde und in keiner Weise unterstützt wird. Es gibt keine Pläne aus dem Director ein Konfigurationswerkzeug für Icinga 1.x zu machenGlobale Standard-ZoneStandardwertDefiniere Check-, Benachrichtigungs- oder Event-Kommandos. Kommandodefinitionen sind das Verbindungsstück zwischen Host- und Service-Checks und den Check-Plugins auf dem Monitoring- (oder dem überwachten) SystemDatenfelder definierenDefinieren Host-Gruppen um der Konfiguration mehr Struktur zu geben. Nützlich sind diese auch für Dashboards, Benachrichtigungen oder BerechtigungenDefinieren einen Download-URL oder ein lokales Verzeichnis von welchem ein bestimmtes MSI-Installer-Paket für den Icinga-2-Agenten geladen werden soll. Bitte sicherstellen, dass nur Basis-URL oder -Verzeichnis angegeben werden. Das Powershell-Modul erstellt den MSI-Dateinamen auf Basis der jeweiligen Betriebssystemarchitektur und zu installierenden Version. Intern wird der MSI-Installer-Name wie folgt erstellt: Icinga2-v[InstallAgentVersion]-[OSArchitecture].msi (volles Beispiel: Icinga2-v2.6.3-x86_64.msi)Definiert und verwaltet Importe von diversen DatenquellenBenutzerdefinierte Zeiträume festlegenDefinieren, wie importierte Daten mit Icinga synchronisiert werden sollenAngeben, was geschehen soll wenn ein Objekt mit gleichem Schlüssel bereits existiert. Die Eigenschaften können zusammengeführt (Importquelle gewinnt), durch das importierte Objekt ersetzt oder ignoriert (hilfreich für einmalige Importe) werden.Angeben, was überwacht werden sollLegt fest, nach wie vielen Versuchen ein neuer Hard State erreicht wirdFür Benutzergruppen anstelle einzelner Benutzer definierte Benachrichtigungen geben mehr FlexibilitätDefiniere Service-Gruppen für mehr Struktur. Nützlich für Dashboards. Benachrichtigungen und Berechtigungen können auf Gruppen basieren.Verzögerung bis die erste Benachrichtigung verschickt werden sollLöschenTrennerAbhängigkeitenAbhängigkeitAusrollen%d ausstehende Änderungen ausrollenKonfiguration auf Icinga Knoten ausrollenVeränderte Konfiguration ausrollenDeploymentDeployment-PfadDeployment-DetailsAusrollmodusAusrollmodus für Icinga 1 KonfigurationDeployment-ZeitDeploymentsAbgekündigtBeschreibungBeschreibung des ArgumentsZielZielfeldWussten Sie, dass sich dieser Health-Check (oder auch nur Abschnitte daraus) als regelmäßiger Icinga-Check ausführen lässt?DiffMit anderer Konfiguration vergleichenDirektDirector HintergrunddienstDirector-HealthDirector Kickstart-AssistentDirector-ObjektDirector-EinstellungenDatenbankschema für Director wurde noch nicht erstelltDeaktivienChecks deaktivierenBenachrichtigungen deaktivierenAlle Aufträge deaktivierenDeaktiviertStandardmäßig deaktiviert, sollte nur in seltenen Fällen benutzt werden.Deaktivierte Objekte werden nicht ausgerolltAnzeigenameAnzeigenameUnterschiedliche KommandosMehr mit benutzerdefinierten Daten anfangenÜberhaupt nicht umwandelnDokumentationKeine Sorge, meine Host-Einstellungen sind in OrdnungDownDownloadJSON herunterladenAls JSON herunterladenVon einer benutzerdefinierten URL ladenVon packages.icinga.com herunterladenDowntime endetDowntime-NameDowntime entferntDowntime startetSelbstbedienungs-API-Schlüssel verwerfenDie aktuelle Zeile verwerfenAufklappmenü (nur Listeneinträge)DauerJedes Array in der Liste enthält diese Eigenschaft. Dessen Wert wird als Schlüssel/Objektbezeichner für die Zeile benutzt.Kategorie bearbeitenEin Feld bearbeitenListe bearbeitenVerhalten des ElementsE-MailRevisionslog aktivierenEventhandler aktivierenFlap-Erkennung aktivierenAktiviere das Feature für freie Endpunktnamen. Hiermit lässt sich ein anderer Name für das generierte Endpunktobjekt wählen. Hierzu werden spezielle Icinga-Konfigurationsschnipsel und eine spezielle benutzerdefinierte Variable eingesetzt. Bitte NICHT aktivieren, wenn abweichende Endpunktnamen nicht wirklich erforderlich sind!Nur das EndeEndpunktName des EndpunktsAdresse des EndpunktsEndpunkte in RootzoneName der EndpunktsvorlageEndpunkteFehlerVerbindung herstellenBerechnet die Apply-Regel für alle Objekte für welche diese benutzerdefinierte Eigenschaft spezifiziert wurde. Wählt man z.B. "host.vars.custom_attr", wird "for (config in host.vars.array_var)" generiert. Dabei ist "config" dann als "$config$" zugänglich. HINWEIS: nur benutzerdefinierte Eigenschaften vom Typ "Array" sind wählbar.Event-KommandoEvent-KommandodefinitionJeder Dictionary-Eintrag hat einen Schlüssel, sein Wert wird in dieser Spalte bereitgestelltJede zugehörige Downtime wird diesen Kommentar anzeigenAndere Zeiträume von diesem ausschließen.Zeitraum ausschließenAktive Checks ausführenAusführungsintervall dieses Auftrags, in SekundenVorhandene DatenlistenVorhandene VorlagenErwartete ÄnderungenExpertenmodusErweitere die Liste mit neuen WertenExternExterne KommandodefinitionenExterne KommandosExterne Kommandos wurden in der lokalen Icinga-2-Konfiguration definiert.Externe BenachrichtigungskommandosExterne Benachrichtigungskommandos wurden in der lokalen Icinga-2-Konfiguration definiert.Externe ObjekteFQDNFehlgeschlagenImport von %s fehlgeschlagen "%s"Feature: Individueller EndpunktnameFeld wurde entferntFeldnameFeldtypFelderDateiDateiinhalt: %sDateien im Stage: %sFilterFilterausdruckVerfügbare Benachrichtigungs-Apply-Regeln filternVerfügbare Geplante-Downtime-Regeln filternVerfügbare Service-Apply-Regeln filternVerfügbare Service-Set-Vorlagen filtern. Benutze Sternchen (*) als Platzhalter, wie in DB* oder *net*Filter-MethodeErstes ElementVerzögerung der ersten BenachrichtigungFixFlappingFlapping endetUntere Flapping-Grenze in Prozent um einen Service nicht als Flapping einzuordnenFlapping beginntFlapping Schwellewert (hoch)Flapping Schwellwert (niedrig)Obere Flapping-Grenze in Prozent um einen Service als Flapping einzuordnenAlle vererbten Eigenschaften flach machen, Importierte entfernenAPI-Verzeichnis leerenManuelle KonfigurationErstellen erzwingenFormularelement konnte nicht erstellt werden, %s ist nicht vorhandenFormular wurde erfolgreich abgeschicktFormatVorheriges ObjektVoll qualifizierter Domain-Name (FQDN)Selbstservice-API-Schlüssel generierenNeuen Schlüssel generierenGenerierte Host-Schlüssel werden weiterhin funktionieren, aber es wird nicht mehr möglich sein neue Hosts mit diesem Schlüssel zu registrierenErzeugte KonfigurationWerde alarmiert, wenn etwas schief läuftEine Übersicht über benutzerdefinierte Variablen und deren VariantenHost über Adresse ermitteln (Reverse DNS Lookup)Adresse für Hostname ermitteln (DNS Lookup)Globale Director-EinstellungenGlobale Selbstbedienungs-EinstellungenGlobale ZonenGlobale ZoneKlebenZurück zum "%s" DashboardGnadenfristGruppeGruppiere nach einer Spalte, aggregiere andereDie Gruppe wurde geerbt, wird aber von lokal gesetzten Gruppen überschriebenGruppenmitgliedschaftGruppenmitgliedschaft: %sDas Bündel von Services in Sets erlaubt es, Services welche häufig gemeinsam benutzt werden in einem Einzelschritt zuzuweisenGruppenHTTP (das ist Klartext)HTTP-HeaderHTTP-ProxyHTTPS (dringend empfohlen)HealthHier finden sich alle Einzel-Services welche einzelnen Hosts zugewiesen wurdenVerstecktSQL verbergebHinweis: Check-PluginHinweise zu diesem ServiceHistorieHostBenutzerdefinierte Host-VariablenHostgruppeHostgruppenHostnameHost-VorlageAuswahlmöglichkeit für HostvorlagenHost-VorlagenHostadresseHostadresse. Üblicherweise eine IPv4 Adresse, kann jedoch jede Art von Adresse sein, mit der das Plugin umgehen kannHost-KonfigurationenHostgruppenHostnameHostname (lokaler Teil, ohne Domain)HostobjekteHosteigenschaftenAuswahlmöglichkeit für HostvorlagenAuswahlmöglichkeiten für HostvorlagenHostgruppeHostgruppenHostgruppen, die diesem Knoten direkt zugeordnet werden sollen. Hostgruppen für verschiedene Zwecke verwendet werden. Services können anhand von Hostgruppen zugeordnet werden. Außerdem werden sie oft zum Umsetzen von eingeschränkten Ansichten in Icinga Web 2 verwendet. Hostgruppen können direkt einzelnen Hosts oder Hostvorlagen zugeordnet werden. Auch über Apply Regeln können Hostgruppen zugewiesen werdenHostnameHostname, IP oder :HostsHosts welche dieses Set benutzen: %sWie lang die Downtime dauert. Beeinflusst nur flexible (keine fixen) Downtimes. Zeit in Sekunden, unterstützt auch die Suffixes ms (Millisekunden), s (Sekunden), m (Minuten), h (Stunden) and d (Tage). Um "90 Minuten" auszudrücken könnte man 1h 30m schreibenIch weiß was ich tue, bitte dennoch ausrollenIch weiß, und möchte damit nicht mehr belästigt werdenIP Adresse / Hostname des entfernten KnotenIP Adresse / Hostname des Icinga Knotens. Diese Information wird nur für den ersten Verbindungsaufbau zur Icinga Instanz verwendet. Danach verlässt sich der Director auf ein richtig konfiguriertes Endpunkt-Objekt. "Richtig konfiguriert" bedeutet dabei, dass entweder der Name auflösbar ist oder die host-Eigenschaft entweder eine IP Adresse oder einen auflösbaren Hostname enthält. Der Director muss diesen Endpunkt erreichen könnenIPv6 AdresseIcinga %s-SetsIcinga-2-Objekte: %sIcinga 2 API - StatusIcinga 2 Client-DokumentationIcinga Agenten- und ZoneneinstellungenIcinga API BenutzerIcinga-DSLIcinga-DirectorIcinga Director - ÜbersichtsdashboardIcinga Director HintergrunddienstIcinga Director KonfigurationIcinga Director Setup: %sIcinga Director bevorzugt es, Objekte wie CheckCommands in eine globale Zone auszubringen. Der Standard dafür ist "director-global", es kann aber auch eine benutzerdefinierte Zone verwendet werdenDer Icinga Director benötigt folgende Module, bitte wie angegeben installieren und/oder aktualisierenDer Icinga Director stellt eine Selbstbedienungs-API bereit, über welche sich neue Icinga-Knoten selbst registrieren könnenIcinga-HostIcinga-InfrastrukturIcinga Package NameIcinga-Cluster-Zone. Erlaubt ein manuelles Überschreiben der Entscheidung, wohin der Director die Konfiguration ausrollt. Sollte nicht ohne ausreichendes Wissen um den Icinga-Cluster-Stack verändert werdenIcinga für WindowsIcinga-Objektname für diese HostgruppeIcinga-Objektname für diesen Host. Dies ist üblicherweise ein FQDN, kann jedoch jede beliebige Zeichenkette sein. Der Einfachheit halber sollten sprechende Namen für Vorlagen verwendet werden. z.B. ist "Standard Linux Server" leichter verständlich als "generic-host"Icinga-Objektname für diese ServicegruppeIcinga-Objektname für diese BenutzergruppeIcinga v1.xMit Icinga v2.11.0 schlagen bestimmte Konfigurationen fehl, der Director warnt vor jedem Deployment falls die auszurollende Konfiguration betroffen ist. Diese Einstellung erlaubt es diese Warnung zu verbergen.Icinga v2.xIcinga-2-AgentIcon BildIcon Bild alternativIDBezeichner für das Icinga-Kommando, das erstellt werden sollWenn diese benutzerdefinierte Variable vorhanden ist, werden Benutzergruppen aus selbiger mit nachfolgend ausgewählten Einzelgruppen kombiniert. Beispiel: wird hier notification_groups gewählt, wird diese Benachrichtigung Benutzergruppen aus dem Array service. vars.notification_groups verwenden, und auf host.vars.notification_groups zurückfallen, falls ersteres nicht existiert. Lediglich Felder vom Array-Typ DirectorObject sind für dieses Feature auswählbar.Wenn diese benutzerdefinierte Variable vorhanden ist, werden Benutzer aus selbiger mit nachfolgend ausgewählten Einzelbenutzern kombiniert. Beispiel: wird hier notification_contacts gewählt, wird diese Benachrichtigung Benutzergruppen aus dem Array service. vars.notification_contacts verwenden, und auf host.vars.notification_contacts zurückfallen, falls ersteres nicht existiert. Lediglich Felder vom Array-Typ DirectorObject sind für dieses Feature auswählbar.Wenn aktiviert können keine Argumente definiert werden.IgnorierenBug #7530 ignorierenSoft-States ignorierenImportquelleImportquellenImport-DatenquellenExterne "%s" importierenImportlaufImportlaufhistorie: %sImportquelleName der ImportquelleVorschau der Importquelle: %sImportquelle: %sImportierbare Vorlagen. Es können beliebig viele erstellt werden, wobei die Reihenfolge wichtig ist, wenn Eigenschaften von mehreren Vorlagen geerbt werden: Der letzte Eintrag gewinntNeue Daten von dieser Import-Datenquelle importiertImportierte ReihenEin Objekt zu importieren bedeutet, dass es von einem "externen Objekt" zu einem "Objekt" verändert wird. Damit wird es mit der nächsten Konfiguration ausgerollt. Falls dieses Objekt aus dem Icinga Knoten importiert wurde, muss es aus vor dem nächsten Ausrollen aus der lokalen Konfiguration entfernt werden. Sollte ein Konflikt auftreten, geschieht nichts weiter, als dass die Konfiguration nicht ausgerollt werden kann.ImporteWenn ein Icinga-Administrator einen Selbstbedienungs-API-Schlüsselbereitstellt, können hier neue Hosts registriert werdenWenn der Icinga-2-Agent bereits auf dem System installiert ist, erlaubt es dieser Parameter festzulegen, ob auch Up- und Downgrades zu der spezifierten Icinga 2 Version gewünscht sind.Falls der Icinga-2-Agent automatisch installiert werden soll, muss dies in String der Form 2.6.3 seinWenn der Icinga-Agent Konfiguration von seinem übergeordneten Icinga-2-System akzeptiert, wird er für gewöhnlich Daten nach /var/lib/icinga2/api/* schreiben. Wird dieser Schalter auf Ja gesetzt, wird jeglicher Inhalt dieses Verzeichnisses vor einem eventuellen Restart des Icinga-2-Agenten geleertFalls %s benutzt wird, bitte dieses Script ausführen:Wenn die API nur über einen Proxy zugänglich ist, bitte hier dessen Protokoll auswählenFalls der Proxy eine Authentifizierung verlangt, kann diese hier konfiguriert werdenAndere Zeiträume in diesen einbinden.Zeitraum einbindenIndirektIndividuelle Service-ObjekteInfrastrukturVererbung (Import)Vom Template geerbter API-Schlüssel:Geerbt von %sGeerbte GruppenGeerbter Service: %sInspizierenInspizieren - ObjektlisteDateiinhalt inspizierenPakete InspizierenNSClient++ installierenInstallationsquelleInstalliertPrüfsummen für den InstallerInterne KommandosEs wurde seither umbenannt. Sein bisheriger Name war %sDies ist keine gute Idee solange der Agent noch über einen gültigen Selbstbedienungs-API-Schlüssel verfügt!Es wird nicht erlaubt, mehr Optionen zu wählen als durch diese Einstellung vorgegeben wird. Setzt man sie auf Eins (1) erhält man ein Dropdown-Feld, eine höhere Nummer verwandelt diese in ein Mehrfach-Auswahlfeld.Aktuell ist unbekannt ob die Konfiguration mit dieser Importquelle synchron ist. Es sollte auf Änderungen geprüft oder ein neuer Importlauf angestoßen werden.Aktuell ist unbekannt, ob die Konfiguration mit dieser Regel synchron ist. Es sollte auf Änderungen geprüft oder ein neuer Importlauf angestoßen werden.Das Speichern eines leeren Baskets ist nicht erlaubtAuftragJob-DefinitionenAuftragstypAuftragsnameAuftrag: %sAufträgeZu diesem Objekt springenEinfach dieses Skript herunterladen und auf dem Linux Client-Rechner ausführen:Übereinstimmende Elemente behaltenBehalte nur passende ZeilenDN unverändert behaltenJSON-String beibehaltenBehalte die erste Zeile mit diesem SchlüsselBestehenden String behaltenBehalte die letzte Zeile mit diesem SchlüsselDie Eigenschaft (hostname) behalten, wie sie istDie Eigenschaft beibehaltenBehalte die Zeile so wie sie ist, setze den Spaltenwert auf nullSchlüsselSchlüssel / InstanzSchlüsseleigenschaftSchlüsseleigenschaftSchlüsselspaltennameKickstartKickstart AssistentLDAP SuchbasisBezeichnungLetztes Check-ErgebnisLetztes ElementLetzte BenachrichtigungZuletzt verwendete KonfigurationDetails des letzten ImportsLeer lassen für Argumente, deren Position egal ist. Kann eine positive oder negative Zahl sein und beeinflusst die Reihenfolge der ArgumenteBenutzerdefinierte Eigenschaften beizubehalten während das zugehörige Feld entfernt wird ist durchaus legal und kann eine gewünschte Operation sein. Auf diesem Wege lassen sich zugehörige Felder dann nicht mehr in der Director-Oberfläche bearbeiten, aber die jeweiligen Werte bleiben konfiguriert und werden weiterhin ausgerollt. Wenn man ein Feld mit demselben Namen zu einem späteren Zeitpunkt wieder hinzufügt, wird alles wieder funktionieren wie zuvorBenutzerdefinierte Eigenschaften beizubehalten während das zugehörige Feld umbenannt wird ist durchaus legal und kann eine gewünschte Operation sein. Auf diesem Wege lassen sich zugehörige Felder dann nicht mehr in der Director-Oberfläche bearbeiten, aber die jeweiligen Werte bleiben konfiguriert und werden weiterhin ausgerollt. Wenn man ein Feld mit demselben Namen zu einem späteren Zeitpunkt wieder hinzufügt, wird alles wieder funktionieren wie zuvorImport fehlschlagen lassenDen ganzen Importlauf fehlschlagen lassenDen ganzen Importlauf fehlschlagen lassenDen Zugriff auf diese Kommagetrennte Liste von Host-Gruppen beschränkenLinux KommandozeileListeneinträgeListeneinträgeListennamePunkte im Schlüsselbezeichner können bei Bedarf verschont werden:Lokales Verzeichnis in welches die Icinga 1.x Konfiguration ausgerollt werden soll. Muss von icingaweb2 beschreibbar sein (z.B. /etc/icinga/director)Behaltefrist des LogsHaupteigenschaftenDefinitionen für Kommandos verwalten, welche als Check-Plugins Benachrichtigungen oder Event-basiert ausgeführt werden sollenHost-Vorlagen verwalten. Verwende Felder um Benutzern deren Anpassung zu erleichtern.Icinga 2 Infrastruktur verwalten: Master, Zonen, Satelliten und mehrIcinga Kommandos verwaltenIcinga Hosts verwaltenIcinga 2 Infrastruktur verwaltenIcinga Service Checks verwaltenService-Vorlagen verwalten. Verwende Felder um Benutzern deren Anpassung zu erleichtern.Datenfelder verwaltenPflichtMasterlosTriff auf Spalten NULL-Werten zuTriff auf boolesches FALSE zuTriff auf boolesches TRUE zuMaximale CheckwiederholungenMitgliedMitgliederZusammenführenZusammenführungsrichtlinieMögliche Werte sind z.B. monday, tuesday oder 2016-01-28 - Mehr Beispiele finden sich in der DokumentationErforderliches MinimumÄnderungModifikatorModifikatorenÄndere%d Hosts verändern%d Objekte bearbeitenÄndere %sÄndere einen HostDatenlisteneintrag verändernInstanz ändern: %sDiese Apply-Regeln ändernApply-Regeln ändernImportquellen ändernAufträge ändernSynchronisationsregeln ändernAuswahlmöglichkeit für Vorlagen abändernVorlagen ändernModulnameÜberwachte ServicesNach unten bewegenNach oben bewegenMehrere ObjekteMeine Agents sollen DNS benutzen, um Endpoint-Namen nachzuschlagenMeine ÄnderungenMySQL SchemaNameName der Icinga-Abhängigkeit, die erstellt werden sollName der Icinga-Endpunkt-Vorlage, die erstellt werden sollName des Icinga-Endpunkt, der erstellt werden sollName der Icinga-Benachrichtigungs-Vorlage, die erstellt werden sollName der Icinga-Benachrichtigung, die erstellt werden sollName des Icinga-Service, der erstellt werden sollName für das Icinga-Benutzerobjekt, das Sie erstellen möchtenName für die Icinga-Benutzervorlage, die Sie erstellen möchtenName der Icinga-Zone, die erstellt werden sollName der Instanz, die erstellt werden sollBeim Klonen einer Vorlage muss der Name geändert werdenNavNeue KategorieNeues FeldNeuer JobNeue ImportquelleNeuer NameNeues ObjektWeiterNeinBisher wurden keine %s erstelltKeine %s Ressource verfügbarKein API Benutzer konfiguriert. Der kickstart helper sollte ausgeführt werdenEs wurde noch keine passende Host-Vorlage bereitgestelltKeine Host-Vorlage wurde ausgewähltEs wurde noch keine passende Vorlage bereitgestelltKein Benutzer-Objekt wurde bisher definiertKeine Benutzergruppe wurde bisher definiertKeine Aktion durchgeführt, das Objekt wurde nicht verändertBisher wurde kein Apply-Regel definiertKeine Änderungen wurden gemachtKein Dashboard verfügbar, eventuell wurden nicht genügend Zugriffsrechte gewährtKeine Datenbank für den Icinga-Director wurde konfiguriertEs wurde bisher keine Datenbankressource konfiguriert. Bitte eine Ressource auswählen, um die Konfiguration zu vervollständigenKein Datenbankschema wurde bisher erstelltKeine Objekt wurde ausgewähltKein Objekt wurde bisher definiertKein Objekt wurde verändertEs wurde noch keine passende Vorlage bereitgestelltKeine Service wurde ausgewähltKein solcher Service: %sKeine Vorlage wurde ausgewähltEs wurde noch keine Vorlage definiertKeineKeines kann momentan zum Ausrollen verwendet werdenNotizenNotizen-URLKeine Änderung, Regel ist synchronKeine Aktion nötig. Die Daten von dieser Importquelle haben sich seit dem letzten Lauf nicht geändertNichts zu tun, eine Wiederherstellung würde das aktuelle Objekt nicht ändernNichts zu tun, Regel ist synchronEs würde sich nichts ändern, diese Regel ist noch synchronBenachrichtigungBenachrichtigungs-Apply-RegelnBenachrichtigungs-Apply-Regeln basierend auf %sBenachrichtigungskommandosBenachrichtigungs-Kommandos erlauben das Ausführen beliebiger Aktionen wenn eine Benachrichtigung stattfinden sollBenachrichtigungsvorlageBenachrichtigungsvorlagenBenachrichtigungskommandoBenachrichtigungsintervallAuswahlmöglichkeiten für BenachrichtigungsvorlagenBenachrichtigungsvorlagenBenachrichtigungenBenachrichtigungen werden gesendet, wenn ein Host oder Services einen harten Nicht-OK-Zustand erreicht oder sich von einem solchen erholt. Es könnte zudem wünschenswert sein, Benachrichtigungen auch für spezielle Events wie den Beginn einer Downtime, das Bestätigen eines Problems und mehr zu versenden. Benachrichtigungen lassen sich auf Wunsch nur innerhalb bestimmter Zeitfenster versenden. Zudem können sie künstlich verzögert und / oder in bestimmten Intervallen neu versandt werden. Wer Eskalationsebenen umsetzen möchte kombiniert diese Möglichkeiten. Man könnte z.B. erst das Operating benachrichtigen, und erst wenn das Problem für längere Zeit unbehandelt bleibt das Management mit einbeziehen. Man könnte E-Mails oder SMS versenden, Telefonanrufe durchführen und sich auf unterschiedlichsten Kanälen anpiepen lassen. Benachrichtigungen lassen sich natürlich auch an externe Serviceanbieter auslagern. Die Möglichkeiten sind endlos, nachdem man beliebig viele eigene Kommandos anbinden kannNumerische Position oder SchlüsselbezeichnerOkObjektObjekt-InspektionObjekttypObjektklasseObjekt-Abhängigkeiten.Objekt wurde wiederhergestelltObjekt wurde wiederhergestelltObjekteigenschaftenObjekttypObjekttyp "%s"Objekt/Vorlage/ApplyObjekteHäufig wird das zu erwartende Ergebnis in einer Eigenschaft wie "objects" zurückgeliefert. Bitte angeben falls erforderlich.Bei FehlerEine Apply-Regel wurde definiertEin externes Objekt wurde erstellt, es wird nicht ausgerolltEin Objekt wurde definiertEin Objekt wurde verändertEin oder mehrere Zeichen, die zum Trennen der Zeichenkette genutzt werden sollenEin oder mehrere Zeichen, die verwendet werden, um einen Eingabearray an eine Zeichenkette zu heften. Kann leer bleibenEiner oder mehrere Zeiträume, z.B. 00:00-24:00 oder 00:00-09:00,17:00-24:00Eine Vorlage wurde definiertNur setzen, wenn der Wert des Arguments numereisch ist. Zeichenketten als Wert werden nicht unterstütztOptionalOptionaler Kommando-Timeout. Erlaubt sind Werte in Sekunden oder Werte mit nachgestellter Zeiteinheit. z.B. 1m oder auch 3m 30s.Optional. Der Kind-Service. Falls leer wird dieses Objekt als Host-Abhängigkeit behandelt.Optional. Der Eltern-Service. Falls leer wird dieses Objekt als Host-Abhängigkeit behandelt.Andere verfügbare FelderAndere QuellenVariablen überschreibenÜberblickPHP BinaryPHP IntegerPHP-VersionPHP Version 5.4.x ist für den Director >= 1.4.0 erforderlich, hier läuft %s. Bitte entweder PHP upgraden oder den Icinga Director downgradenPIDPaketePakete auf Endpunkt: %sPagerEltern-HostEltern-ServiceÜbergeordnete ZonePasswortMusterAusstehende Datenbankschemamigrationsskripte wurden erfolgreich angewandtZugriff auf Ressourcen kann durch Administrator gewährt werdenBitte Basketkonfiguration überprüfen, %s unterstützt keine einzelnen Konfigurationsobjekte vom Typ "%s"Eine Datenliste auswählen, die für Map lookups verwendet wirdBitte einen bestimmten Icinga-Objekttyp auswählenEine Importquelle die ausgeführt werden soll auswählen. Es können verschiedene Zeitpläne für verschiedene Quellen erstellt oder alle gleichzeitig ausgeführt werden.Eine Synchronisationsregel die ausgeführt werden soll auswählen. Es können verschiedene Zeitpläne für verschiedene Regeln erstellt oder alle gleichzeitig ausgeführt werden.Bitte klicke "Speicher" erneut um die von der Abfrage bereitgestellten Spalten zu ermitteln%s klicken, um neue Datenbankressourcen zu erstellen%s klicken, um neue Ressourcen zu erstellenBitte zuerst eine %s definierenBitte zuerst eine entsprechende Vorlage definierenÜberprüfen, ob die Datenbank existiert und der Benutzer ausreichende Berechtigungen hatBitte beachten, dass das Importieren von Daten im Hauptzweig stattfindet. Änderungen an Importquellen sind nicht erlaubt, während man sich in einem anderen Konfigurationszweig befindet. Für die volle Funktionalität bitte %s deaktivierenDiese Einstellungen sollten nur dann geändert werden, wenn es als unbedingt nötig erachtet wird. Für gewöhnlich sollten die vom Icinga Director gewählten Standardwerte für Umgebungen jeglicher Art passend sein.Bitte einen Regelnamen angebenSiehe %s für eine detaillierte Anleitung, wie Beginn und Ende funktionierenFür eine Liste von Vorschlägen bitte mit dem Tippen beginnen. Punkte erlauben es, verschachtelte Eigenschaften anzusprechen: column.some.key. Solche verschachtelten EIgenschaften können nicht an Ort und Stelle verändert werden, dafür lässt sich der modifizierte Wert aber in eine neue "Zieleigenschaft" schreibenPlugin-Check-Kommandos werden benötigt, um Infrastruktur zu prüfen. Mit Benachrichtigungskommandos werden Benutzer benachrichtigt. Event-Kommandos führen bestimmte Aktionen aus, wenn Probleme auftreten. Sie werden manchmal für Selbstheilungsmechanismen verwendet, wie das Neustarten von Services oder das Neustarten von Systemen beim Überschreiten bestimmter SchwellwertePlugin-KommandosRichtliniePortPositionPositionstypPostgreSQL SchemaIncludes bevorzugenBereite Konfiguration in einer geschützten Umgebung vorBestimmte Konfigurationsobjekte in einem bestimmten Zustand aufbewahrenVorschauProblemProblembehandlungProzesslistePerformancedaten verarbeitenEigenschaftenEigenschaftEigenschaftsmodifikatoren: %sGeschütztProtokollPrototypen (Methoden)Datenlisten bereitstellenDatenlisten erleichtern Anwendern die ArbeitVorlagen für Benachrichtigungen bereitstellen.Vorlagen für Benutzer-Objekte bereitstellen.Vorlagen für Benachrichtigungen bereitstellen.ProxyProxyadresseProxykennwortProxybenutzerBereinigenAktion beim BereinigenRohe JSON-DatenBereicheJetzt erneut ausrollenReaktivierenErholungSelbstbedienungs-API-Schlüssel neu generierenRegex-MusterRegistrierenRegistrierter AgentRegulärer AusdruckErsatz, basierend auf dem regulären AusdruckRegulärer Ausdruck anhand dessen eine String aufgeteilt werden soll (z.B. /\s+/ oder /[,;]/)Übereinstimmende Elemente ablehnenDie ganze Zeile abhängig vom Eigenschaftswert abweisenVerwerfe die ganze ZeileVerwandte ObjekteAnmerkungEntfernen"%s" von diesem Host entfernenDiesen Eintrag entfernenDiesen Teil des Filters entfernenZugehörige Variablen umbenennenAls String rendernKonfiguration erstellenRendere das Kommando als reinen String und nicht als Array.Erzeugte DateiErstellt in %0.2fs, ausgerollt in %0.2fsErstellenSchlüssel wiederholenErsetzenErsatzBenötigtAufgelöstWiederherstellenVorheriges Objekt wiederherstellenIn dieser Director-Ziel-DB wiederherstellenWiederholungsintervallWiederholungsintervall, wird nach einem Statuswechsel verwendet, bis der nächste Hard Status erreicht wurdeBenutzerdefinierten Wert zurückgebenSuchschlüssel unverändert zurück gebenRootzoneRegelnameAlle Importe gleichzeitig ausführenAlle Regeln gleichzeitig ausführenImport ausführenLaufintervallAuf Agent ausführenLäuft mit systemdSOCKS5 ProxyImport, Synchronisation, Ausrollen der Konfiguration, Bereinigung und mehr planen und automatisierenBenachrichtigungen planenBenachrichtigungen planen. Wer soll wann benachrichtigt werden, wofür, und für welche Art von ProblemenGeplante DowntimeGeplante DowntimesSkript oder Tools welches beim Aktivieren einer neuen Konfigurationsphase ausgeführt werden soll. (z.B. sudo /usr/local/bin/icinga-director-activate) (der Name der Konfiguration wird dem Skript als Argument mitgegeben)SelbstbedienungSelbstbedienung - Host-RegistrierungSelbstbedienungs-APISelbstbedienungs-API - Globale EinstellungenSelbstbedienungseinstellungen wurden gespeichertBenachrichtigungen sendenSenden anServiceService Apply-RegelnServicegruppeServicegruppenServicenameService-SetService-Set wurde entferntService-SetsService-VorlageAuswahlmöglichkeit für Service-VorlagenService-VorlagenDienst-BenutzeraccountServicegruppenServicegruppen, die diesem Service direkt zugeordnet werden sollen. Servicegruppen können für diverse Anwendungen praktisch sein, wie auf Service-Typ eingeschränkte Ansichten in Icinga Web 2, für benutzerdefinierte Dashboards oder zum Umsetzen von Einschränkungen. Servicegruppen können direkt einem einzelnen Service zugeordnet werden oder Service-Vorlagen.ServicenameService-EigenschaftenService-SetService-Set NameAuswahlmöglichkeite für Service-VorlagenAuswahlmöglichkeiten für Service-VorlagenService-SetServicegruppeServicegruppenServicenameServicesServices in diesem Set: %sServices auf %sServices: %sService-SetsSpezifischen Wert setzenBasierend auf Filter setzenAuf "false" setzenKeinen Wert setzen (null)Auf "null" setzenSetze den Wert auf NULLAuf "true" setzenSetsDas Setzen eines Kommandoenpunkts erlaubt das Ausführen von Host-Checks auf einem bestimmten Endpoint. Bitte nicht verwenden, ohne die entsprechende Icinga-Dokumentation gelesen zu habenEinstellungenEinstellungen wurden gespeichertFür die Selbstbedienungs-API freigebenFür die Selbstbedienungs-API freigegebenSollen alle anderen Zeichen zuvor in Kleinbuchstaben umgewandelt werden?ZeigenBasket anzeigenIssue %s auf GitHub anzeigenSQL anzeigenBetroffene Objekte zeigenAlle Aktionen anzeigenVerfügbare Optionen anzeigenBasierend auf Filter zeigenDetails zu dieser Änderung zeigenNormal anzeigenAufgelöst anzeigenZeige eine abgezweigte Ansicht, mit potentiell nur in diesem %s sichtbaren ÄnderungenEinfache Suche mit Platzhaltern (*)Einfacher Objekt-DiffEinzelne ServicesGrößeSchlüssel überspringenZeile überspringen wenn dieser Wert mehr als einmal vorkommtSnapshotSnapshotsSo etwas wie https://api.example.com/rest/v2/objectsQuellspalteQuellausdruckQuellennameQuellpfadQuellentypQuellspaltenQuellenfeldQuellennameSpezielle EigenschaftenSpezifisches Element (nach Schlüsselname)Spezifisches Element (nach Position)Header im Textformat angeben "Header: Wert", jeden Header auf einer Zeile.Zeichen welche von Trim entfernt werden sollen. Standard: " \t\n\r\0\x0B"PhasennamePhasen in Paket: %sStartzeitStartStart-LogStartzeitZustandStatus- und Übergangstypen-FilterZustandsänderungenZuständeStatistikenZustandDiese Vorlage nicht mehr bereitstellenSpeichernKonfiguration speichernStrikt, nur ListeneinträgeZeichenketteDiesen Operator entfernen, Kind-Knoten beibehaltenAbsendenGelungenVorgeschlagene FelderZur Tabellenansicht wechselnZur Baumansicht wechseln"%s": "%s" synchronisierenSynchronisationsvorschauSynchronisationseigenschaftenSynchronisationsregelnSynchronisationshistorieNur einen Teil der importierten Objekte mit dieser Regel synchronisieren. Die Icinga Web 2 Filter Syntax kann verwendet werden. z.B: %sSynchronisationseigenschaftenSynchronisationsregelSynchronisationsregel: %sIn Branch s ynchronisieren: %sSynchronisation fehlgeschlagenSynchronisationsregelSynchronisieren'%s' synchronisierenTabelleZiel-DBZielhostZiel-Service-SetZieldatentypZieleigenschaftVorlageVorlagentyp (Objekt)VorlagennameVorlagennameVorlage: %sVorlagenVorlagen können in Konfigurationszweigen nicht geklont werdenDanke, ich überprüfe das und komme wiederDer "Import" Auftrag erlaubt das Ausführen von Importen in regelmäßigen AbständenDer "Sync" Auftrag erlaubt das Ausführen von Synchronisationen in regelmäßigen Abständen%s wurde erfolgreich gespeichertDer Auftrag "Konfiguration" erlaubt das Erstellen und eventuelle Ausrollen der Icinga 2 KonfigurationDie E-Mail-Adresse des Benutzers.Der "Bereinigen" Auftrag bietet verschiedene Aktionen, die die Director-Datenbank schnell und sauber haltenDer Icinga Director Hintergrunddienst läuft nicht. Um eine Schritt-für-Schritt-Anleitung hierzu anzuzeigen bitte unsere %s zu Rate ziehen.Die Icinga Director Selbstbedienungs-API erlaubt es Hosts sich selbst zu registrieren. Auf diese Weise wird deren Icinga-Agent konfiguriert, installiert und automatisch aktualisiert.Der Icinga Package-Name welchen der Director zum Ausrollen seiner Konfiguration benutzt. Für gewöhnlich ist das "director" und sollte nur geändert werden, wenn die Auswirkung dieser Anpassung bewusst istDie LDAP Eigenschaften, die geholt werden sollen. Muss eine Komma-separierte Liste sein, wie "cn, dnshostname, operatingsystem, sAMAccountName"Der Selbstbedienungs-API-Schlüssel für %s wurde verworfenDas Service-Set "%s" wurde zu %d Hosts hinzugefügtDas Argument %s wurde erfolgreich gespeichertDie Beschriftung welche Benutzern zu diesem Feld angezeigt werden sollDer Kind-Host.Das Kommando, das Icinga ausführen soll. Absolute Pfade werden wie angegeben übernommen, relativen Pfaden wird ein "PluginDir +" vorangestellt, wobei ähnliche Konstanten als Prefix erlaubt sind. Leerzeichen können zur Teilung des Pfads zum Kommandos und eigenständigen Argumenten verwendet werden. Das bedeutet, das aktuell keine Leerzeichen in Plugin-Namen und Pfaden unterstützt werden.Das entsprechende PasswortDer Domänenname, der entfernt werden sollDer erste (linkeste) CNDie erste (linkeste) OUDie folgenden Änderungen sind nur in diesem %s sichtbar...Die übergebenen Eigenschaften wurden für "%s" gespeichertDie Host/Service Status, für die Benachrichtigungen versandt werden sollenDie letzte (rechteste) OUDer letzte Versuch schlug %s fehl: %sDer letzte Versuch war %s erfolgreichDas letzte Ausrollen war nicht erfolgreichDas Ausrollen der Konfiguration ist im GangeDie Dauer der Aufzeichnungen.Der Name des Zeitraumes, der angibt, wann Benachrichtigungen für diesen Benutzer ausgelöst werden sollen. Kein Default-Wert.Der Name des Zeitraumes, der angibt, wann diese Benachrichtigung ausgelöst werden soll. Kein Default-Wert.Der Name des Zeitraumes, der angibt, wann dieses Objekt überwacht wird. Standardmäßig nicht eingeschränkt.Der Name des Zeitraums innerhalb derer dieser Auftrag aktiv sein soll. Erlaubt nur einfache Zeiträume (Wochentag und mehrere Zeitangaben)Der Name des HostsDer Name des ServiceDer Benachrichtigungsintervall (in Sekunden). Dieser Intervall wird für aktive Benachrichtigungen verwendet. Default-Wert ist 30 Minuten. Wird er auf 0 gesetzt, sind Benachrichtungswiederholungen deaktiviert.Die numerische Bitmaske welche angewandt werden soll. Hexadezimale und binäre Masken müssen zuvor in eine dezimale Zahl umgewandelt werden. Das Ergebnis ist ein boolescher Wert welcher angibt, ob die Maske auf den numerischen Wert in der Quellspalte zutrifftDie Pageradresse des Benutzers.Der Elternhost. Benutzerdefinierte Hosteigenschaften lassen sich via $host.vars.varname$ referenzierenDas Muster, nach dem gesucht werden soll. Kann ein regulärer Ausdruck wie /^www\d+\./ seinDer Port des Endpunkts.Der Port, der genutzt werden soll. Wird kein Wert gesetzt, gilt der Default-Wert 5665Die Eigenschaft welche wir aus der Zeile die wir in der gewählten Importquelle gefunden haben extrahieren wollenDer Service "%s" wurde zu %d Hosts hinzugefügtDas Service-Set welches zugewiesen werden sollDas Service-Set welches diesem Host zugewiesen werden sollDie Arten von Statusänderungen, für die Benachrichtigungen verschickt werden sollenDie Zeichenkette, die als Ersatz genutzt werden sollDie Zeichenkette, nach der gesucht werden sollDas Muster, nach dem gesucht werden soll. Kann ein regulärer Ausdruck wie /^www\d+\./ seinDas Muster, nach dem gesucht werden soll, Platzhalter wie www.* oder *linux* sind möglichDer String/das Muster nach dem gesucht werden soll. Abhängig von der gewählten Methode, benutze www.* oder *linux* für Platzhalter-basierte Suchen und Ausdrücken wie /^www\d+\./ falls Reguläre Ausdrücke bevorzugt wurdenDer eindeutige Kategoriebezeichner welcher zum Gruppieren der benutzerdefinierten Felder benutzt werden soll.Der Benutzeraccount unter welchem der Icinga-2-Dienst unter Windows laufen soll.Es gibt %d Objekte mit einer entsprechenden Eigenschaft. Soll der Wert für "%s" von all diesen entfernt werden?Es gibt %d Objekte mit einer entsprechenden Eigenschaft. Soll auf all diesen die Variable "%s" nach "%s" umbenannt werden?Es gibt %d noch nicht ausgerollte ÄnderungenEs sind %d Änderungen ausständig, wovon %d auf dieses Objekt angewendet werdenEs sind %d Datenbankmigrationen ausständigEs sind keine Datenfelder verfügbar. Ein Administrator kann welche anlegenEs gibt keine anstehenden ÄnderungenEs gibt keine anstehenden Änderungen. Dennoch ausrollenEs gibt ausstehende Änderungen für diese Importquelle. Ein neuer Importlauf sollte angestoßen werden.Es gibt ausstehende Änderungen für diese Synchronisationsregel. Ein neuer Synchronisationslauf sollte angestoßen werden.Es sind Datenbankmigrationen ausständigAn diesem Objekt wurde eine einzelne Änderung vorgenommen. Nichts Anderes wurde verändertAn diesem Objekt wurden %d Änderungen vorgenommen, nichts anderes wurde verändertEs gibt eine einzelne ausstehende ÄnderungVerschiedene verfügbare AuftragstypenDies sind verschiedene Datenanbieter, die Daten von diversen Quellen holen. Falls der gesuchte Anbieter nicht dabei ist, kann ein weiteres (evtl. selbst geschriebenes) Icinga Web 2 Modul diese Funktionalität nachrüsten, da Importquellen als Hook in Director realisiert werdenDieses Kommando wird gegenwärtig von %s benutztDieses Kommando wird gegenwärtig nicht benutztDieses Kommando wird von %d anderen Objekten benutztDiese Importquelle schlug bei der letzten Prüfung um %s fehl: %sDiese Importquelle hat einen ungültigen Zustand: %sDiese Importquelle stellt veränderte Daten zur VerfügungDiese Importquelle war zuletzt um %s syncron.Dieser Service wurde auf diesem Host deaktiviertDiese Synchronisationsregel schlug bei der letzten Prüfung um %s fehl: %sDiese Synchronisationsregel wurde noch nie ausgeführt.Diese Sync-Regel ist synchron und würde aktuell keine Änderungen verursachenDiese Synchronisationsregel war zuletzt synchron um %s.Erlaubt das Filtern nach bestimmten Teilen innerhalb des angegebenen Quellausdrucks. Alle importierten Spalten können angegeben werden. Beispiele: host=www* würde diese Eigenschaft nur für importierte Zeilen setzen, bei denen die Host Eigenschaft mit "www" beginnt. Komplexes Beispiel: host=www*&!(address=127.*|address6=::1)Erlaubt das Filtern nach bestimmten Teilen innerhalb des angegebenen Quellausdrucks. Alle importierten Spalten können angegeben werden. Beispiele: host=www* würde diese Eigenschaft nur für importierte Zeilen setzen, bei denen die Host Eigenschaft mit "www" beginnt. Komplexes Beispiel: host=www*&!(address=127.*|address6=::1). Bitte beachten, dass auch Muster in CIDR-Notation unterstützt werden: address=192.0.2.128/25| address=2001:db8::/32| address=::ffff:192.0.2.0/96Dies erlaubt es, entweder eine Ausklappmenü oder ein Feld mit automatischer Vervollständigung anzuzeigenErlaubt das vorübergehende Deaktivieren dieses AuftragsHiermit lässt sich ein Zuweisungsfilter (assign) definieren. Dabei lassen sich beliebig viele Operatoren beliebig tief verschachtelt benutzen. Der Operator "contains" ("enthält") ist nur für Arrays zulässig. Um Teilstrings zu vergleichen bitte Jokerzeichen (wildcards) benutzen, wie in *.example.comHiermit lässt sich ein Zuweisungsfilter (assign) definieren. Dabei lassen sich beliebig viele Operatoren beliebig tief verschachtelt benutzen. Dieser Schritt lässt sich auch überspringen und eventuell später umsetzen. Alternativ (oder zusätzlich) kann dieses Service-Set einzelne Hosts direkt zugewiesen werden. Der Operator "contains" ("enthält") ist nur für Arrays zulässig. Um Teilstrings zu vergleichen bitte Jokerzeichen (wildcards) benutzen, wie in *.example.comDies erlaubt das sofortige Ausrollen einer veränderten KonfigurationErlaubt das Ändern der Eigenschaften von "%s"Hiermit lassen sich Eigenschaften für alle gewählten Hosts auf einmal ändernDieser Basket ist leerMuss eine MySQL oder PostgeSQL Datenbank seinDieser Host wurde über die Icinga Director Selbstbedienungs-API registriert. Falls der Host neu installiert wurde oder der Schlüssel anderweitig verloren ging, kann es erwünscht sein, den aktuellen Schlüssel zu verwerfen. Das würde es erlauben, denselben Host neu zu registrieren.Das ist ein abstrakter Objekttyp.Das ist nur wichtig wenn Master- oder Satellitenknoten keine IP als "host"-Eigenschaft gesetzt haben. Dem Agent kann angewiesen werden, eigenständig entsprechende DNS-Lookups eigenständig vorzunehmenDas ist die "%s" %s Vorlage. Basierend auf diese, kann man:Der Name (und Zertifikatsname) des Endpunkt-Objekts, der für das ApiListener-Objekt erstellt wurde. Bei Unklarheit, was damit gemeint ist, sollte die Dokumentation erneut zu Rate gezogen werdenHier werden alle Server, Container, Netzwerk- oder Sensor-Geräte und vieles mehr hinzugefügt. Jede Komponente die es wert ist, überwacht zu werdenHier werden Icinga 2 Host-Checks verwaltet. Host-Vorlagen stellen die Hauptbausteine dar. Diese können in "Auswahlmöglichkeiten" gebündelt werden, um es eigenen Benutzern zu erlauben, aus einem definierten Set von Vorlagen zu wählen - oder dies gar zu erzwingen.Hier werden Icinga 2 Service-Checks verwaltet. Service-Vorlagen stellen die Hauptbausteine dar, Service-Sets erlauben es mehrere Services gemeinsam zuzuweisen. Apply-Regeln ermöglichen es, Services basierend auf Host-Eigenschaften zuzuweisen. Und die Liste aller Einzel-Services erlaubt es, einzelne oder mehrere zugleich zu bearbeiten oder zu löschen.Hier werden Icingga 2 Benutzer-Objekte (Kontakte) verwaltet. Es wird empfohlen Benutzerobjekte einfach zu halten, und Komplexität in die entsprechenden Vorlagen zu verschieben. Das Bündeln von Benutzern in Gruppen erlaubt auf selbige basierende Benachrichtigungen. Ist MS Active Directory oder ein anderes zentrales Benutzerverzeichnis vorhanden? Dann gilt es sich am Besten überhaupt nicht mit manueller Konfiguration abzumühen. Über die Import-Funktion und entsprechende Synchronisationsregeln lässt sich nahezu alles automatisieren!Hier wird die Icinga 2 Infrastruktur verwaltet. Den Kickstart-Helper beim Hinzufügen von neuen Icinga Mastern oder Satelliten bitte erneut ausführen.Dies ist der Konfigurations-Master zu welchem sämtliche Konfiguration ausgerollt wirdDieser Auftrag wurde bisher nicht ausgeführtDieser Auftrag läuft alle %ds und ist aktuell ausständigDieser Auftrag läuft alle %ds.Dieser Auftrag würde alle %d ausgeführt. Er ist deaktiviert und wird deshalb nicht wie geplant ausgeführtDieser Modifikator verwandelt 0/"0"/false/"false"/"n"/"no" nach false und , "1", true, "true", "y" and "yes" nach true, jeweils unabhängig von Groß-/Kleinschreibung. Was soll passieren falls keiner dieser Fälle zutrifft? In diesem Fall lässt sich ein Null-Wert zurückgeben oder aber true oder false als Fallback nutzen. Alternativ kann man auch den komplette Importvorgang aufgrund ungültiger Daten fehlschlagen lassenMuss eine Spalte sein, die eindeutige Werte wie Hostnamen enthält. Wenn nicht anders angegeben, wird dieser Wert dann als object_name für die synchronisierten Icinga Objekte verwendet. Insbesondere Benutzer mit wenig Erfahrung mit dem Director sollten sich unbedingt an diese Regel halten. Doppelte Werte in dieser Spalte erzeugen einen Fehler und der gesamte Importlauf schlägt fehl. Bitte beim Synchronisieren von Services Acht geben, "bereinigen" wird nur mit einer der host!name Syntax entsprechenden Schlüsselspalte funktionieren. Nutze den Eigenschaftsmodifikator "Kombinieren", falls die gegebenen Datenquelle keine solche Spalte bereitstellen kannDer Name wird als Autor für sämtliche zugehörigen Downtime-Kommentare aufscheinenDieses Objekt wurde in %s erstelltDieses Objekt wurde deaktiviertDieses Objekt wurde aktiviertDieses Objekt hat Änderungen, welche nur in %s sichtbar sindDieses Objekt wird in %s erstelltDas Objekt wird nicht ausgerollt, da es deaktiviert wurdeDieses Muster wird ausgewertet, und Variablen wie ${eine_spalte} werden entsprechend befüllt. Ein typischer Anwendungsfall ist das Erstellen von eindeutigen Service-Bezeichnern via ${host}!${service} falls die Datenquelle einen solchen nicht bereitstellt. Die gewählte "Eigenschaft" hat hier keine Auswirkung und wird ignoriert.Dieser Vorschau wurde %s generiert, zwecks Aktualisierung bitte %s klickenHierfür muss der Icinga Agent installiert sein. Es erstellt und signiert sein Zertifikat und erstellt eine minimale icinga2.conf mit welcher der Agent zu den ihm übergeordneten Systemen verbunden wirdDieser Service gehört zum Service Set %s. Dennoch können die folgenden Eigenschaften nur für diesen speziellen Host geändert werden.Dieser Service gehört zum Set "%s". Dennoch können die folgenden Eigenschaften nur für diesen speziellen Host geändert werden.Dieser Service wurde durch einen Automatismus erstellt, erlaubt es aber dennoch die folgenden Eigenschaften auf sichere Weise zu überschreiben.Dieser Service wurde durch die Apply-Regel %s erstellt, und wird zugewiesen wo %sDieser Service wurde von %s geerbt. Dennoch können die folgenden Eigenschaften nur für diesen speziellen Host geändert werden.Dieses Set wurde von %s geerbtSynchronisiert den Icinga Director mit der Icinga 2 Infrastruktur. Bei Änderungen an derselben sollte ein neuer Lauf angestoßen werdenDiese Vorlage ist nicht in VerwendungDiese Vorlage ist noch in Verwendung durch %d andere ObjekteDieses Muster wird ausgewertet, und Variablen wie ${eine_spalte} werden entsprechend befüllt. Ein typischer Anwendungsfall ist das Erstellen von eindeutigen Service-Bezeichnern via ${host}!${service} falls die Datenquelle einen solchen nicht bereitstellt. Die gewählte "Eigenschaft" hat hier keine Auswirkung und wird ignoriert.Das wird Teil des nächsten DeploymentsDies wird als Bezeichner für diese Auswahlmöglichkeit angezeigt werdenDies wird als Name der benutzerdefinierten Eigenschaft in der gerenderten Icinga-Konfiguration benutzt.Die sichtbare Bezeichnung für diesen EintragDas macht den vorherigen Schlüssel ungültigDies wird nicht Teil eines eventuellen Deployments, solange die Änderungen nicht zusammengeführt werdenTicketZeitraumZeiträumeZeitraumZeiträumeDer Zeitraum "%s" wurden von "%s" entferntZeiträumeTimeoutZeitraumvorlageZeiträumeZeiträumeZeitstempelKann nur auf Objekten verwaltet werdenUm sicherzustellen, dass die heruntergeladenen Pakete vom Icinga-Team stammen und nicht von Dritten kompromittiert wurden, kann hier eine Liste von SHA1 Prüfsummen bereitgestellt werden. Falls hier ein oder mehrere solche Hash-Werte bereitgestellt werden, und das heruntergeladenen MSI-Paket keinem davon entspricht, wird das Powershell-Modul sich weigern mit Update oder Installation des Agenten fortzufahrenSchalter (boolsche Argumente)Top DownGesamtHostname transformierenElternhost in IP umwandelnIn Kleinbuchstaben umwandelnIn Großbuchstaben umwandelnÄnderungsstypenBaumImportlauf anstoßenDiese Synchronisation anstoßenAnstoßen dieser Importquelle schlug fehlTrim-MethodeEinige globale Director-Einstellungen anpassenTypTyp-AttributeURL- KomponenteUUID: binär in hexadezimal umwandelnDie Icinga 2 Core-Version konnte nicht ermittelt werdenDaten konnten nicht geholt werden: %sEin Host konnte aufgrund unzureichender Berechtigungen nicht mit den gegebenen Eigenschaften abgespeichert werdenDie Konfiguration kann nicht nach "%s" gespeichert werden. Bitte Dateisystemberechtigungen prüfen oder den unten angegebenen Inhalt manuell speichernNicht ausgerollte KonfigurationenWie lang die Downtime dauert. Beeinflusst nur flexible (keine fixen) Downtimes. Zeit in Sekunden, unterstützt auch die Suffixes ms (Millisekunden), s (Sekunden), m (Minuten), h (Stunden) and d (Tage). Um "90 Minuten" auszudrücken könnte man 1h 30m schreiben.UnbekanntUnbekannt, entsprechende Information konnte nicht gesammelt werdenUnbekannt, warte auf Ergebnis der KonfigurationsprüfungNicht-verknüpfte importierte EigenschaftenNicht-verknüpfte importierte ZeilensetsNicht-verknüpfte importierte ZeilenUnerfüllte AbhängigkeitenNicht verwendete, generierte DateienUpAktualisierungsmethodeAktualisierungsrichtlinieNur aktualisierenUpgrading Icinga 2 - Confic Sync: Zones in ZonesUpgrading-DokumentationHochladenBasket hochladenKonfigurationsbasket hochladenSchnappschuss eines Konfigurationsbaskets hochladenBenutzungBenutzung (%s)Benutze einen anderen Bezeichner (als den Hostnamen) für das generierte Endpunktobjekt und füge eine benutzerdefinierte Variable hinzu, welche es Services erlaubt, den korrekten Commandendpunkt zu setzen.Benutze eine lokales Verzeichnis oder eine NetzwerkfreigabeErst in Kleinbuchstaben umwandelnVerwendete QuellenBenutzerBenutzergruppeBenutzergruppenVariable für BenutzergruppenBenutzervorlagenBenutzergruppenBenutzergruppen, die direkt diesem Benutzer zugeordnet werden sollen. Gruppen können für verschiedene Aufgaben verwendet werden. Eventuell ist es besser, Benachrichtigungen an Gruppen statt an einzelne Benutzer zu schickenBenutzergruppen, die durch diese Benachrichtigungen verständigt werden sollenBenutzereigenschaftenBenutzervorlagennameBenutzergruppeBenutzergruppenBenutzernameBenutzerBenutzer / KontakteVariable für BenutzerBenutzer, die durch diese Benachrichtigungen verständigt werden sollenMittels Apply-Regeln kann ein Service mehreren Hosts auf einmal zugewiesen werden, und zwar basierend auf Filtern welche einzelne oder mehrere Eigenschaften derselben kombinierenÜblicherweise die Haupt-IPv6-Adresse des HostsWertWerttypVariablenwertVariablennameHost überprüfenPeer überprüfenSichtbarkeitSichtbarSprunghaft (Volatile)VORSICHT, hiermit schafft man die Möglichkeit über benutzerdefinierte Variablen Shell-Code in Kommandos zu injizieren.Sollen Icinga Agents verbunden werden? Riskieren einen Blick in unsere %s!Sollen bestimmte Checks nur innerhalb bestimmter Zeiträume ausgeführt werden? Mobile Benachrichtigungen nur außerhalb der Bürozeiten, aber Alarmierung via E-Mail rund um die Uhr? Zeiträume erlauben es, diese und ähnliche Anforderungen zu erfüllen.WarnungVorsicht: hier läuft Icinga v2.11.0 und die erstellte Konfiguration sieht aus als würde sie von Issue %s betroffen sein. Wir arbeiten bereits an einer Lösung. Das GitHub-Issue und unsere %s enthalten weiterführende Informationen.Welche Art von Objekt dies werden soll. Vorlagen erlauben vollen Zugriff auf alle Eigenschaften - sie sind die Bauklötze für "echte" Objekte. Externe Objekte sollten üblicherweise nicht erstellt oder verändert werden. Sie erlauben es, mit Objekten zu arbeiten, die lokal auf den Icinga Knoten definiert wurden, ohne sie über den Director auszubringen. Apply regeln erlauben das Zuweisen von Services, Benachrichtigungen und Gruppen an andere Objekte.Was soll geschehen, wenn der Suchschlüssel sich nicht in der Datenliste befindet? Es kann ein null Wert zurückgegeben werden, der importierte Wert unverändert übernommen oder der Importvorgang unterbrochen werdenWas soll passieren wenn der übergebene String leer ist?Was soll passieren wenn das resultierende Array leer ist?Was soll passieren wenn das spezifizierte Element nicht verfügbar ist?Was soll mit passenden Elementen passieren?Was soll mit der Zeile passieren, wenn der gegebene Ausdruck auf diese Eigenschaft zutrifft?Was soll passieren, wenn das Muster nicht zutrifft?Was soll geschehen, wenn die (DNS) Auflösung fehlschlägt?Was soll mit der URL geschehen, wenn sie nicht geparsed werden kann oder aber Komponenten davon nicht gefunden werden?Was soll geschehen, wenn der gewünschte Teil nicht existiert?Was soll geschehen, wenn die (DNS) Auflösung fehlschlägt?Was soll passieren wenn der übergebene Wert leer ist?Was soll geschehen, wenn sich der übergebene String nicht dekodieren lässt?Was soll geschehen, wenn derselbe Schlüssel zweimal auftaucht?Was soll aus dem DN extrahiert werden?Was sollen wir beim Erstellen eines Snapshots in diesen Basket geben?Was soll als Hostname für den Icinga-2-Agent genutzt werden?Beim Ausrollen einer Konfiguration mindestens diese Anzahl an Sekunden warten, bevor das nächste Ausrollen durchgeführt wirdFalls leerWenn nicht verfügbarWenn nicht zugetroffenWann die letzte Nachricht versenderwerdenDas Bedürfnis, neue Zonen- oder Endpunkt-Objekte manuell zu erstellen bitte zweimal überdenken. Das ist meistens der falsche Weg, kann in Sackgassen führen und damit eine Menge Arbeit beim manuellen Aufräumen verursachen.Wo String(s) gestutzt werden sollOb Downtimes zudem explizit auch für alle zu den betroffenen Hosts gehörigen Services eingeplant werden sollenOb alle konfigurierten Jobs deaktiviert werden sollenOb die Flapping-Erkennung für dieses Objekt aktiviert werden sollOb das Erstellen erzwungen werden soll. Wird es nicht erzwungen, wird die Konfiguration nur erstellt, falls seit dem letzten Erstellen Aktivitäten durchgeführt wurdenJa, falls der Agent so konfiguriert ist, dass er Konfiguration akzeptiertIst der Wert des Arguments eine Zeichenkette (erlaubt Makros wie $host$) oder eine Icinga-DSL-Lambda-Funktion? (wird in {{ ... }} eingeschlossenOb das Kommando für diesen Service auf dem Icinga-Agent ausgeführt werden sollOb der Parameter-Name an das Kommando übergeben werden soll. Normalerweise wird dieser (z.B. -H) hinzugefügt, es ist also nicht erforderlich dies explizit auf "Nein" zu setzen.Soll der (Master) Knoten aktiv versuchen, sich zu diesem Agenten zu verbinden?Ist der set_if Parameter eine Zeichenkette (erlaubt Makros wie $host$) oder eine Icinga-DSL-Lambda-Funktion? (wird in {{ ... }} eingeschlossenSoll dieses Argument erforderlich sein?Ist dieser Check sprunghaft (volatile)?Soll diese Abhängigkeit Hosts oder Services betreffenOb diese Downtime fix oder flexibel ist. Im Zweifel bitte die entsprechende Dokumentation zu Rate ziehen: https://icinga.com/docs/icinga2/latest/doc/08-advanced-topics/#downtimesSoll dieses Feld Pflicht sein?Hat dieser Host den Icinga-2-Agent installiert?Soll diese Benachrichtigung Hosts oder Services betreffenSoll dieser Parameter wiederholt werden, wenn mehrere Werte (in einem Array) angegeben werdenOb dies ein String oder ein Array in der generierten Icinga-Konfiguration sein soll. Wird Array gewählt, können Director-Benutzer mehrere Elemente aus einer Liste wählenSoll diese Zone überall verfügbar sein? Beachte, dass es selten zielführend ist, globale Zonen in verteilten Umgebungen zu verteilenSollen passive Checkergebnisse für dieses Objekt akzeptiert werden?Soll dieses Objekt aktiv geprüft werden?Ob der Hostname angepasst werden sollOb zu bereinigende Objekte deaktiviert oder gelöscht werden sollenOb Checks deaktiviert werden sollen, wenn diese Abhängigkeit fehlschlägt. Standardmäßig ist dies nicht der Fall.Sollen Benachrichtigungen deaktiviert werden, wenn diese Abhängigkeit fehlschlägt. Standard-Einstellung ist Ja.Sollen Event-Handler für dieses Objekt aktiviert werden?Ob Soft-States für die Berechnung der Erreichbarkeit berücksichtigt werden sollen. Dies ist standardmäßig der Fall.Ob das Einbinden oder Ausschließen von Zeiträumen bevorzugt werden soll. Standard-Einstellung ist Ja.Sollen Performancedaten von diesem Objekt verarbeitet werden?Sollen existierende Objekte entfernt werden? Das bedeutet, dass Objekte desselben Typs aus dem Director entfernt werden, falls sie in der Importquelle nicht mehr vorhanden sein sollten.Sollen Benachrichtigungen für dieses Objekt verschickt werden?Sollen Benachrichtigungen für diesen Benutzer verschickt werden?Ob für die Verbindung zu dieser REST-API Verschlüsselung benutzt werden sollOb wir prüfen sollen, dass das Zertifikat unseres Gegenübers von einer vertrauenswürdigen Zertifizierungsstelle signiert wurde. Das wird strengstens empfohlen.Ob geprüft werden soll, dass die Zertifikate zum konfigurierten Host passenSoll das Zielfeld zusammengeführt oder ersetzt werden? Macht keinen Unterschied für ZeichenkettenWird als benutzerdefinierte Variable gespeichert, wenn dieser Eintrag aus der Liste gewählt wirdWird für die Authentifizierung gegen die REST-API benutztKickstart-Skript für WindowsZugehörige Eigenschaften leerenMit ServicesHier kann nachvollzogen werden, was weshalb verändert wurde.Mit Agenten und Konfigurationszonen arbeitenDiesen Ausdruck in einen Operator packenJA, bitte "%s" löschenJaBasket-Snapshots können jederzeit erstellt werden, damit wird eine serialisierte Darstellung aller involvierten Objekte zum gegebenen Zeitpunkt persistiert. Snapshots können exportiert, importiert, geteilt und wiederhergestellt werden - zur selben oder einer anderen Director-Instanz.Die Freigabe einer Vorlage kann jederzeit widerrufen werden. Das macht den vorherigen Schlüssel sofort ungültig.Änderungen können sofort angewandt oder nur angezeigt werden. Falls sie nicht sofort angewandt werden, ist es immer noch sinnvoll, einen Auftrag zu erstellen. Verfügbare Änderungen werden in der Director-GUI angezeigt.Es kann erwünscht sein, dass das generierte Powershell-Script den Icinga-2-Agenten automatisch installiert. Falls das gewünscht ist gilt es hier zu wühlen, von wo sich die Windows-Knoten den Agenten-Installer besorgen sollenEs könnte erwünscht sein, dieses Feld nur unter bestimmten Bedingungen anzuzeigen. Treffen diese nicht zu wird es nicht angezeigt, eventuell zugehörige Eigenschaften werden beim Speichern dann auch wieder entfernt.Es kann erwünscht sein, den geänderten Wert in eine andere (neue) Eigenschaft zu schreiben. Dieser Eigenschaftsname kann hier definiert werden, die ursprüngliche Eigenschaft bleibt dann unverändert. Falls lediglich der ursprüngliche Wert an Ort und Stelle geändert werden soll, dieses Feld bitte leer lassenBevor dieses Synchronisationsregel ausgeführt werden kann, müssen %s definiert werdenBefindet man sich im master-Branch, werden durchgeführte Änderungen Teil des nächsten DeploymentsGegenwärtig wird in einem Konfigurationszweig gearbeitet: %sGegenwärtig wird im Hauptkonfigurationszweig gearbeitetDas Datenbankschema (Migration #%d) ist neuer als der installierte Quellcode. Ein Downgrade des Icinga Directors wird nicht unterstützt und kann zu unerwarteten Problemen führen.Der Icinga-2-API BenutzernameDie LDAP Suchbasis. Meist etwas wie OU=Users,OU=HQ,DC=your,DC=company,DC=tldDie Änderungen werden in %s gespeichert werden.Die Konfiguration sieht gut aus. Dennoch kann dieser Kickstart-Assistent jederzeit neu ausgeführt werden, um geänderte oder neu erstellte Kommandodefinitionen oder neue ITL-Kommandos nach einem Icinga-2-Core-Upgrade (neu) zu importieren.Datenbank sieht gut aus. Icinga Director sollte jetzt fertig für %s sein.Diese Icinga-Director-Installation wurde noch nicht zum Ausrollen von Konfiguration vorbereitet. Dieser Kickstart-Assistent hilft bei der Einrichtung der Verbindung zum Icinga 2 Server.Der übliche Check-IntervallDie ErsatzzeichenketteBenutzern wird erlaubt, zwischen diesen Vorlagen zu wählenZoneZonennameZoneneinstellungenZoneneine ListeaktivalleZurückKonfigurationszweigKritischdeaktiviertDokumentationDownz.B. -H oder --hostname, leer bedeutet "skip_key"z.B. 5%, $host.name$, $lower$%:$upper$%Abholen fehlgeschlagenhierhost var namehost var valuefehlendgeändertmehrneuneinkeine verwandte Gruppe existiertokauf dem Hostam Service-Seteine verwandte Gruppe existiertausstehendNULL zurückgebenein leeres Array zurückliefernservice var nameservice var valuedie Arbeit mit dem Icinga Director zu beginnender Hauptkonfigurationszweigdiesem KonfigurationszweigunverändertUnbekanntunreachablenicht unterstütztunbenutztupbenutztWertformatviawarningjaicingaweb2-module-director-1.11.8/application/locale/de_DE/LC_MESSAGES/director.po000066400000000000000000011570551516513262500273760ustar00rootroot00000000000000# Director - Config tool for Icinga 2. # Copyright (C) 2023 Icinga # This file is distributed under the same license as Director Module. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Director Module (master)\n" "Report-Msgid-Bugs-To: ISSUE TRACKER\n" "POT-Creation-Date: 2023-09-21 08:58+0000\n" "PO-Revision-Date: 2023-09-21 10:53+0200\n" "Last-Translator: Thomas Gelf \n" "Language: de_DE\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Basepath: .\n" "X-Poedit-SearchPath-0: .\n" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:618 #, php-format msgid " (inherited from \"%s\")" msgstr " (geerbt von \"%s\")" #: ../../../../library/Director/Web/Table/TemplatesTable.php:64 msgid " - not in use -" msgstr " - unbenutzt -" #: ../../../../library/Director/Web/Table/DatafieldTable.php:54 #: ../../../../library/Director/Web/Table/DatafieldCategoryTable.php:48 msgid "# Used" msgstr "# Benutzt" #: ../../../../library/Director/Web/Table/DatafieldTable.php:55 msgid "# Vars" msgstr "# Vars" #: ../../../../library/Director/Web/Table/CustomvarTable.php:29 #, php-format msgid "%d / %d" msgstr "%d / %d" #: ../../../../library/Director/Resolver/CommandUsage.php:51 #, php-format msgid "%d Host Template(s)" msgstr "%d Host-Vorlagen" #: ../../../../library/Director/Resolver/CommandUsage.php:50 #, php-format msgid "%d Host(s)" msgstr "%d Host(s)" #: ../../../../library/Director/Resolver/CommandUsage.php:61 #, php-format msgid "%d Notification Apply Rule(s)" msgstr "%d Benachrichtigungs-Apply-Regeln" #: ../../../../library/Director/Resolver/CommandUsage.php:60 #, php-format msgid "%d Notification Template(s)" msgstr "%d Benachrichtigungsvorlagen" #: ../../../../library/Director/Resolver/CommandUsage.php:59 #, php-format msgid "%d Notification(s)" msgstr "%d Benachrichtigung(en)" #: ../../../../library/Director/Resolver/CommandUsage.php:56 #, php-format msgid "%d Service Apply Rule(s)" msgstr "%d Service Apply-Regel(n)" #: ../../../../library/Director/Resolver/CommandUsage.php:55 #, php-format msgid "%d Service Template(s)" msgstr "%d Service-Vorlage(n)" #: ../../../../library/Director/Resolver/CommandUsage.php:54 #, php-format msgid "%d Service(s)" msgstr "%d Service(s)" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:170 #, php-format msgid "%d apply rules have been defined" msgstr "%d Apply-Regeln wurden definiert" #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:68 #: ../../../../library/Director/Web/Table/SyncRunTable.php:49 #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:77 #, php-format msgid "%d created" msgstr "%d erstellt" #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:71 #: ../../../../library/Director/Web/Table/SyncRunTable.php:61 #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:89 #, php-format msgid "%d deleted" msgstr "%d gelöscht" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:111 #, php-format msgid "%d files" msgstr "%d Dateien" #: ../../../../library/Director/Web/Widget/DeployedConfigInfoHeader.php:93 #, php-format msgid "%d files rendered in %0.2fs" msgstr "%d Dateien in %0.2fs erstellt" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:212 #, php-format msgid "%d have been externally defined and will not be deployed" msgstr "%d wurden extern definiert und werden nicht ausgerollt" #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:74 #: ../../../../library/Director/Web/Table/SyncRunTable.php:55 #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:83 #, php-format msgid "%d modified" msgstr "%d geändert" #: ../../../../application/controllers/SyncruleController.php:353 #, php-format msgid "%d object(s) will be created" msgstr "%d Objekt(e) werden erstellt" #: ../../../../application/controllers/SyncruleController.php:334 #, php-format msgid "%d object(s) will be deleted" msgstr "%d Objekt(e) werden gelöscht" #: ../../../../application/controllers/SyncruleController.php:343 #, php-format msgid "%d object(s) will be modified" msgstr "%d Objekt(e) werden verändert" #: ../../../../application/controllers/InspectController.php:76 #, php-format msgid "%d objects found" msgstr "%d Objekte gefunden" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:195 #, php-format msgid "%d objects have been defined" msgstr "%d Objekte wurden definiert" #: ../../../../application/forms/IcingaMultiEditForm.php:93 #, php-format msgid "%d objects have been modified" msgstr "%d Objekte wurden verändert" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:120 #, php-format msgid "%d objects, %d templates, %d apply rules" msgstr "%d Objekte, %d Vorlagen, %d Apply-Regeln" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:204 #, php-format msgid "%d of them are templates" msgstr "%d davon sind Vorlagen" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:152 #, php-format msgid "%d templates have been defined" msgstr "%d Vorlagen wurden definiert" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:581 #, php-format msgid "%s \"%s\" has been created" msgstr "%s \"%s\" wurde erstellt" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:584 #, php-format msgid "%s \"%s\" has been deleted" msgstr "%s \"%s\" wurde gelöscht" #: ../../../../application/forms/IcingaImportObjectForm.php:36 #, php-format msgid "%s \"%s\" has been imported\"" msgstr "%s \"%s\" wurde importiert\"" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:587 #, php-format msgid "%s \"%s\" has been modified" msgstr "%s \"%s\" wurde geändert" #: ../../../../library/Director/Web/Table/IcingaHostAppliedServicesTable.php:107 #, php-format msgid "%s %s(%s)" msgstr "%s %s(%s)" #: ../../../../library/Director/Web/Table/ObjectSetTable.php:66 #, php-format msgid "%s (%d members)" msgstr "%s (%d Mitglieder)" #: ../../../../application/controllers/HostController.php:235 #: ../../../../application/controllers/HostController.php:315 #, php-format msgid "%s (Applied Service set)" msgstr "%s (zugewiesenes Service-Set)" #: ../../../../application/controllers/HostController.php:369 #, php-format msgid "%s (Service set)" msgstr "%s (Service-Set)" #: ../../../../application/forms/SettingsForm.php:189 #: ../../../../application/forms/SelfServiceSettingsForm.php:256 #, php-format msgid "%s (default)" msgstr "%s (default)" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:312 #, php-format msgid "%s (inherited from %s)" msgstr "%s (geerbt von %s)" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:307 #, php-format msgid "%s (inherited)" msgstr "%s (geerbt)" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:325 #, php-format msgid "%s (not an Array!)" msgstr "%s (kein Array)" #: ../../../../library/Director/Web/Controller/TemplateController.php:73 #, php-format msgid "%s Templates" msgstr "%s Vorlagen" #: ../../../../application/forms/IcingaCommandArgumentForm.php:137 #, php-format msgid "%s argument \"%s\" has been removed" msgstr "Das %s-Argument \"%s\" wurde entfernt" #: ../../../../library/Director/Web/Controller/TemplateController.php:38 #, php-format msgid "%s based on %s" msgstr "%s basierend auf %s" #: ../../../../library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:114 #, php-format msgid "%s config changes are available in your configuration branch" msgstr "" "%s Konfigurationsänderungen sind in diesem Konfigurationszweig verfügbar" #: ../../../../library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:129 #, php-format msgid "%s config changes happend since the last deployed configuration" msgstr "" "%s Konfigurationsänderungen seit der letzten ausgerollten Konfiguration" #: ../../../../application/forms/IcingaServiceForm.php:290 #, php-format msgid "%s has been deactivated on %s" msgstr "%s wurde auf %s deaktiviert" #: ../../../../application/controllers/DataController.php:354 #, php-format msgid "%s instances" msgstr "%s Instanzen" #: ../../../../application/forms/IcingaServiceForm.php:326 #, php-format msgid "%s is no longer deactivated on %s" msgstr "%s ist auf %s nicht mehr deaktiviert" #: ../../../../library/Director/Web/Widget/NotInBranchedHint.php:18 #, php-format msgid "%s is not available while being in a Configuration Branch: %s" msgstr "%s ist beim Arbeiten in einem Konfigurationszweig nicht verfügbar: %s" #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:49 #, php-format msgid "%s objects have been modified" msgstr "%s Objekte wurden verändert" #: ../../../../application/controllers/DataController.php:359 #, php-format msgid "%s on %s" msgstr "%s auf %s" #: ../../../../application/controllers/HostController.php:520 #, php-format msgid "%s on %s (from set: %s)" msgstr "%s auf %s (aus dem Set \"%s\")" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:227 #, php-format msgid "%s related group objects have been created" msgstr "%s verwandte Gruppenobjekte wurden erstellt" #: ../../../../library/Director/Web/Controller/TemplateController.php:76 #, php-format msgid "%s templates based on %s" msgstr "%s Vorlagen basierend auf %s" #: ../../../../library/Director/Web/Widget/HealthCheckPluginOutput.php:46 #, php-format msgid "%s: %d" msgstr "%s: %d" #: ../../../../application/controllers/BasketController.php:219 #, php-format msgid "%s: %s (Snapshot)" msgstr "%s: %s (Snapshot)" #: ../../../../application/controllers/ImportsourceController.php:310 #, php-format msgid "%s: Property Modifier" msgstr "%s: Eigenschaftsmodifikatoren" #: ../../../../application/controllers/BasketController.php:164 #, php-format msgid "%s: Snapshots" msgstr "%s: Snapshots" #: ../../../../application/controllers/ImportsourceController.php:280 #, php-format msgid "%s: add Property Modifier" msgstr "%s: Eigenschaftsmodifikator hinzufügen" #: ../../../../library/Director/Db/Housekeeping.php:54 msgid "(Host) group resolve cache" msgstr "Gruppenmitgliedschaftscache (Hosts)" #: ../../../../application/controllers/ServiceController.php:187 #, php-format msgid "(on %s)" msgstr "(auf %s)" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:243 msgid "- add more -" msgstr "- mehr hinzuzufügen -" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1093 msgid "- click to add more -" msgstr "- Hier klicken um mehr hinzuzufügen -" #: ../../../../application/forms/SelfServiceSettingsForm.php:79 msgid "- no automatic installation -" msgstr "- keine automatische Installation -" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:45 #: ../../../../library/Director/DataType/DataTypeSqlQuery.php:37 #: ../../../../library/Director/Job/ImportJob.php:118 #: ../../../../library/Director/Job/SyncJob.php:124 #: ../../../../library/Director/Web/Form/QuickBaseForm.php:119 #: ../../../../application/views/helpers/FormDataFilter.php:465 #: ../../../../application/forms/SettingsForm.php:193 #: ../../../../application/forms/SelfServiceSettingsForm.php:252 #: ../../../../application/forms/DirectorDatafieldForm.php:284 #: ../../../../application/controllers/ConfigController.php:384 #: ../../../../application/controllers/ConfigController.php:395 msgid "- please choose -" msgstr "- bitte wählen -" #: ../../../../application/controllers/SyncruleController.php:455 #, php-format msgid "...and %d more" msgstr "...und %d weitere" #: ../../../../library/Director/Web/Controller/ObjectController.php:741 #: ../../../../application/controllers/ConfigController.php:453 msgid "...and the modifications below are already in the main branch:" msgstr "...und folgende Änderungen befinden sich bereits im Hauptzweig:" #: ../../../../application/controllers/BasketsController.php:34 msgid "" "A Configuration Basket references specific Configuration Objects or all " "objects of a specific type. It has been designed to share Templates, Import/" "Sync strategies and other base Configuration Objects. It is not a tool to " "operate with single Hosts or Services." msgstr "" "Ein Konfiguratinsbasket referenziert bestimmte Konfigurationsobjekte oder " "alle Objekte eines bestimmten Typs. Er wurde entworfen um Vorlagen, Import/" "Synchronisationsstrategien und andere grundlegende Konfigurationsobjekte zu " "teilen. Dies ist kein Werkzeug welches sich um einzelne Hosts oder Services " "kümmert." #: ../../../../library/Director/Import/ImportSourceLdap.php:64 msgid "" "A custom LDAP filter to use in addition to the object class. This allows for " "a lot of flexibility but requires LDAP filter skills. Simple filters might " "look as follows: operatingsystem=*server*" msgstr "" "Ein benutzerdefinierter LDAP Filter zur gemeinsamen Verwendung mit der " "Objektklasse. Dies gewährt ein großes Maß an Flexibilität, benötigt jedoch " "Kenntnisse über LDAP Filter. Einfache Filter können wie folgt aussehen: " "operatingsystem=*server*" #: ../../../../application/forms/SyncPropertyForm.php:215 msgid "" "A custom string. Might contain source columns, please use placeholders of " "the form ${columnName} in such case. Structured data sources can be " "referenced as ${columnName.sub.key}" msgstr "" "Benutzerdefinierte Zeichenkette. Falls Quellspalten enthalten sind, müssen " "Platzhalter in der Form ${columnName} genutzt werden. Strukturierte Daten " "können mittels ${columnName.sub.key} addressiert werden" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:59 msgid "A detailled description explaining what this choice is all about" msgstr "Eine detaillierte Beschreibung zum Sinn und Zweck dieser Auswahl" #: ../../../../application/forms/IcingaServiceSetForm.php:105 msgid "" "A meaningful description explaining your users what to expect when assigning " "this set of services" msgstr "" "Eine aussagekräftige Beschreibung, die den Benutzern erklärt, was geschieht, " "wenn dieses Service-Set zugewiesen wird" # Geschlecht kann hier leider nicht bestimmt werden -ThW #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:665 #: ../../../../application/forms/IcingaTimePeriodRangeForm.php:85 #: ../../../../application/forms/IcingaScheduledDowntimeRangeForm.php:90 #, php-format msgid "A new %s has successfully been created" msgstr "Ein neuer %s wurde erfolgreich erstellt" #: ../../../../application/forms/IcingaGenerateApiKeyForm.php:39 #, php-format msgid "A new Self Service API key for %s has been generated" msgstr "Ein neuer Selbstbedienungs-API-Schlüssel für %s wurde erstellt" #: ../../../../application/forms/ImportRowModifierForm.php:107 msgid "" "A property modifier allows you to modify a specific property at import time" msgstr "" "Ein Eigenschaftsmodifikator erlaubt das Verändern bestimmter Eigenschaften " "während des Imports" #: ../../../../application/forms/ImportSourceForm.php:17 msgid "" "A short name identifying this import source. Use something meaningful, like " "\"Hosts from Puppet\", \"Users from Active Directory\" or similar" msgstr "" "Eine kurzer Name um diese Importquelle zu bezeichnen. Sprechende " "Bezeichnungen wie \"Hosts aus Puppet\" oder \"Benutzer aus LDAP\" bieten " "sich an" #: ../../../../application/forms/DirectorJobForm.php:74 msgid "" "A short name identifying this job. Use something meaningful, like \"Import " "Puppet Hosts\"" msgstr "" "Eine kurzer Name um diesen Auftrag zu bezeichnen. Sprechende Bezeichnungen " "wie \"Puppet Hosts importieren\" bieten sich an" #: ../../../../application/forms/IcingaServiceSetForm.php:31 msgid "A short name identifying this set of services" msgstr "Eine kurzer Name um dieses Service-Set zu bezeichnen" #: ../../../../library/Director/Web/SelfService.php:221 #, php-format msgid "" "A ticket for this agent could not have been requested from your deployment " "endpoint: %s" msgstr "" "Für diesen Agenten konnte kein Ticket vom Deployment-Endpoint angefordert " "werden: %s" #: ../../../../library/Director/Dashboard/Dashlet/DeploymentDashlet.php:96 #, php-format msgid "" "A total of %d config changes happened since your last deployed config has " "been rendered" msgstr "" "Insgesamt wurde die Konfiguration %d mal seit dem letzten Ausrollen geändert" #: ../../../../application/forms/IcingaHostSelfServiceForm.php:49 msgid "API Key" msgstr "API-Schlüssel" #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:34 msgid "API Users" msgstr "API Benutzer" #: ../../../../application/forms/IcingaEndpointForm.php:46 #: ../../../../application/forms/KickstartForm.php:155 msgid "API user" msgstr "API Benutzer" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1437 msgid "Accept passive checks" msgstr "Passive Checkergebnisse akzeptieren" #: ../../../../application/forms/IcingaHostForm.php:95 msgid "Accepts config" msgstr "Akzeptiert Konfiguration" # Aktuell wird es so in anderen Modulen übersetzt. -ThW #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:28 msgid "Acknowledgement" msgstr "Bestätigung" #: ../../../../library/Director/Web/Table/ConfigFileDiffTable.php:81 #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:514 #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:525 #: ../../../../application/controllers/BranchController.php:61 msgid "Action" msgstr "Aktion" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1550 msgid "Action URL" msgstr "Aktions-URL" #: ../../../../library/Director/Web/Table/QuickTable.php:281 #: ../../../../library/Director/Web/Widget/DeployedConfigInfoHeader.php:72 #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:555 msgid "Actions" msgstr "Aktionen" #: ../../../../application/forms/SettingsForm.php:175 msgid "Activation Tool" msgstr "Aktivierungswerkzeug" #: ../../../../application/forms/SettingsForm.php:154 msgid "Active-Passive" msgstr "Aktiv-Passiv" #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:30 #: ../../../../application/controllers/BranchController.php:47 msgid "Activity" msgstr "Aktivität" #: ../../../../library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:13 #: ../../../../library/Director/Web/Tabs/InfraTabs.php:30 #: ../../../../application/controllers/ConfigController.php:161 msgid "Activity Log" msgstr "Aktivitätslog" #: ../../../../library/Director/Web/Controller/ObjectController.php:307 #, php-format msgid "Activity Log: %s" msgstr "Aktivitätslog: %s" #: ../../../../configuration.php:141 msgid "Activity log" msgstr "Aktivitätslog" #: ../../../../library/Director/Web/ActionBar/TemplateActionBar.php:19 #: ../../../../library/Director/Web/ActionBar/ChoicesActionBar.php:16 #: ../../../../library/Director/Web/ActionBar/ObjectsActionBar.php:16 #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:505 #: ../../../../library/Director/Web/Controller/ActionController.php:166 #: ../../../../library/Director/Web/Controller/ObjectsController.php:315 #: ../../../../library/Director/Web/Controller/ObjectsController.php:356 #: ../../../../application/forms/AddToBasketForm.php:73 #: ../../../../application/controllers/DataController.php:34 #: ../../../../application/controllers/DataController.php:77 #: ../../../../application/controllers/DataController.php:95 #: ../../../../application/controllers/DataController.php:171 msgid "Add" msgstr "Hinzufügen" #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:52 #: ../../../../library/Director/Web/Controller/ObjectController.php:106 #, php-format msgid "Add %s" msgstr "%s hinzufügen" #: ../../../../application/forms/AddToBasketForm.php:69 #, php-format msgid "Add %s objects" msgstr "%s Objekte hinzufügen" #: ../../../../library/Director/Web/Controller/ObjectController.php:449 #, php-format msgid "Add %s: %s" msgstr "%s hinzufügen: %s" #: ../../../../application/controllers/HostsController.php:40 #: ../../../../application/controllers/HostsController.php:79 msgid "Add Service" msgstr "Service hinzufügen" #: ../../../../application/controllers/HostsController.php:45 #: ../../../../application/controllers/HostsController.php:110 msgid "Add Service Set" msgstr "Service-Set hinzufügen" #: ../../../../application/controllers/HostsController.php:127 #, php-format msgid "Add Service Set to %d hosts" msgstr "Füge Service-Set zu %d Hosts hinzu" #: ../../../../application/controllers/HostController.php:105 #, php-format msgid "Add Service Set to %s" msgstr "Service-Set zu %s hinzufügen" #: ../../../../application/controllers/HostController.php:91 #, php-format msgid "Add Service to %s" msgstr "Service zu %s hinzufügen" #: ../../../../application/controllers/DatafieldController.php:33 msgid "Add a new Data Field" msgstr "Einen neues Datenfeld hinzufügen" #: ../../../../application/controllers/DatafieldcategoryController.php:39 msgid "Add a new Data Field Category" msgstr "Eine neue Datenfeldkategorie hinzufügen" #: ../../../../application/controllers/DataController.php:64 msgid "Add a new Data List" msgstr "Datenliste hinzufügen" #: ../../../../application/controllers/ImportsourcesController.php:35 msgid "Add a new Import Source" msgstr "Importquelle hinzufügen" #: ../../../../application/controllers/JobsController.php:15 #: ../../../../application/controllers/JobController.php:35 msgid "Add a new Job" msgstr "Job hinzufügen" #: ../../../../application/controllers/SyncrulesController.php:28 msgid "Add a new Sync Rule" msgstr "Synchronisationsregel hinzufügen" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:514 msgid "Add a new entry" msgstr "Einen neuen Eintrag hinzufügen" #: ../../../../application/controllers/DataController.php:216 msgid "Add a new instance" msgstr "Neue Instanz hinzufügen" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:271 msgid "Add a new one..." msgstr "Einen Neuen hinzufügen..." #: ../../../../application/controllers/ServicesetController.php:51 #, php-format msgid "Add a service set to \"%s\"" msgstr "Füge ein Service-Set zu \"%s\" hinzu" #: ../../../../application/controllers/ServiceController.php:118 #, php-format msgid "Add a service to \"%s\"" msgstr "Füge einen Service zu \"%s\" hinzu" #: ../../../../application/views/helpers/FormDataFilter.php:516 msgid "Add another filter" msgstr "Weiteren Filter hinzufügen" #: ../../../../application/controllers/BasketController.php:83 msgid "Add chosen objects to a Configuration Basket" msgstr "Gewählte Objekte zu einem Konfigurationsbasket hinzufügen" #: ../../../../application/forms/DirectorDatalistEntryForm.php:60 msgid "Add data list entry" msgstr "Datenlisteneintrag hinzufügen" #: ../../../../application/controllers/ImportsourceController.php:108 msgid "Add import source" msgstr "Importquelle hinzufügen" #: ../../../../library/Director/Web/Controller/ObjectController.php:455 #, php-format msgid "Add new Icinga %s" msgstr "Neuen Icinga %s hinzufügen" #: ../../../../library/Director/Web/Controller/ObjectController.php:438 #, php-format msgid "Add new Icinga %s template" msgstr "Neue Icinga %s Vorlage hinzufügen" #: ../../../../application/controllers/ImportsourceController.php:253 msgid "Add property modifier" msgstr "Eigenschaftsmodifikator hinzufügen" #: ../../../../application/controllers/HostController.php:123 #: ../../../../application/controllers/ServicesetController.php:68 msgid "Add service" msgstr "Service hinzufügen" #: ../../../../application/controllers/HostController.php:128 msgid "Add service set" msgstr "Service-Set hinzufügen" #: ../../../../application/controllers/HostsController.php:96 #, php-format msgid "Add service to %d hosts" msgstr "Füge einen Service zu %d Hosts hinzu" #: ../../../../application/controllers/SyncruleController.php:579 msgid "Add sync property rule" msgstr "Regel für Synchronisationseigenschaft hinzufügen" #: ../../../../application/controllers/SyncruleController.php:628 #, php-format msgid "Add sync property: %s" msgstr "Synchronisationseigenschaft hinzufügen: %s" #: ../../../../application/controllers/SyncruleController.php:521 msgid "Add sync rule" msgstr "Synchronisationsregel hinzufügen" #: ../../../../library/Director/Web/Controller/TemplateController.php:130 #: ../../../../library/Director/Web/Controller/ObjectController.php:420 #: ../../../../application/controllers/HostsController.php:70 #: ../../../../application/controllers/ServicesController.php:36 #: ../../../../application/controllers/BasketController.php:82 #: ../../../../application/controllers/ImportsourceController.php:67 #: ../../../../application/controllers/JobController.php:89 #: ../../../../application/controllers/SyncruleController.php:671 #: ../../../../application/controllers/DataController.php:370 msgid "Add to Basket" msgstr "Zu Basket hinzufügen" #: ../../../../configuration.php:54 msgid "" "Additional (monitoring module) object filter to further restrict write access" msgstr "" "Zusätzliche (Monitoring-Modul-spezifische) Objekt-Filter, um den " "Schreibzugriff weiter einzuschränken" #: ../../../../library/Director/Import/ImportSourceRestApi.php:151 msgid "Additional headers for the HTTP request." msgstr "Zusätzliche HTTP-Header für diesen Request" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1536 msgid "Additional notes for this object" msgstr "Weitere Notizen zu diesem Objekt" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1589 msgid "Additional properties" msgstr "Weitere Eigenschaften" #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:142 msgid "Agent" msgstr "Agent" #: ../../../../application/forms/SelfServiceSettingsForm.php:154 msgid "Agent Version" msgstr "Agenten-Version" #: ../../../../library/Director/PropertyModifier/PropertyModifierSimpleGroupBy.php:60 msgid "Aggregation Columns" msgstr "Aggregationsspalten" #: ../../../../application/forms/IcingaHostSelfServiceForm.php:31 msgid "Alias" msgstr "Alias" #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:80 msgid "All Object Types" msgstr "Alle Objekttypen" #: ../../../../application/controllers/ConfigController.php:174 msgid "All changes" msgstr "Alle Änderungen" #: ../../../../application/forms/SettingsForm.php:78 msgid "" "All changes are tracked in the Director database. In addition you might also " "want to send an audit log through the Icinga Web 2 logging mechanism. That " "way all changes would be written to either Syslog or the configured log " "file. When enabling this please make sure that you configured Icinga Web 2 " "to log at least at \"informational\" level." msgstr "" "Alle Änderungen werden in der Director-Datenbank nachvollziehbar " "gespeichert. Zusätzlich kann ein Revisionslog durch den Logging-Mechanismus " "von Icinga Web 2 geschickt werden. Auf diese Weise werden alle Änderungen " "entweder an Syslog oder die konfigurierte Logdatei geschickt. Dafür muss " "Icinga Web 2 mindestens mit dem \"Info\" Level loggen." #: ../../../../application/forms/SyncPropertyForm.php:309 msgid "All custom variables (vars)" msgstr "Alle benutzerdefinierten Variablen (vars)" #: ../../../../application/forms/BasketForm.php:56 msgid "All of them" msgstr "All diese" #: ../../../../application/forms/IcingaServiceForm.php:770 #, php-format msgid "All overrides have been removed from \"%s\"" msgstr "Alle überschriebenen Eigenschaften wurden von \"%s\" entfernt" #: ../../../../library/Director/Web/Controller/ObjectsController.php:307 #, php-format msgid "All your %s Apply Rules" msgstr "Alle %s Apply Regeln" #: ../../../../library/Director/Web/Controller/ObjectsController.php:252 #, php-format msgid "All your %s Templates" msgstr "Alle %s Templates" #: ../../../../application/forms/SelfServiceSettingsForm.php:187 msgid "Allow Updates" msgstr "Updates erlauben" #: ../../../../library/Director/DataType/DataTypeDatalist.php:153 msgid "Allow for values not on the list" msgstr "Erlaube Werte die nicht au f der Liste stehen" #: ../../../../configuration.php:47 msgid "Allow readonly users to see where a Service came from" msgstr "Erlaube Nur-Lesen-Benutzern zu sehen woher ein Service kommt" #: ../../../../configuration.php:14 msgid "Allow to access the director API" msgstr "Zugriff auf die Director API erlauben" #: ../../../../configuration.php:15 msgid "Allow to access the full audit log" msgstr "Zugriff auf das volle Audit-Log erlauben" #: ../../../../configuration.php:29 msgid "Allow to configure hosts" msgstr "Erlauben, Hosts zu konfigurieren" #: ../../../../configuration.php:31 #: ../../../../configuration.php:38 msgid "Allow to configure notifications (unrestricted)" msgstr "Erlaube (unbeschränkt) Benachrichtigungen zu konfigurieren" #: ../../../../configuration.php:34 msgid "Allow to configure service sets" msgstr "Erlauben, Service-Sets zu konfigurieren" #: ../../../../configuration.php:33 msgid "Allow to configure services" msgstr "Erlauben, Services zu konfigurieren" #: ../../../../configuration.php:36 msgid "Allow to configure users" msgstr "Erlauben, Benutzer zu konfigurieren" #: ../../../../configuration.php:35 msgid "Allow to define Service Set Apply Rules" msgstr "Erlaube Definieren von Service-Set Apply-Regeln" #: ../../../../configuration.php:16 msgid "Allow to deploy configuration" msgstr "Das Ausrollen von Konfigurationen erlauben" #: ../../../../configuration.php:18 msgid "" "Allow to inspect objects through the Icinga 2 API (could contain sensitive " "information)" msgstr "" "Untersuchen von Objekten über die API von Icinga 2 erlauben (könnte sensible " "Daten enthalten)" #: ../../../../configuration.php:21 msgid "Allow to show configuration (could contain sensitive information)" msgstr "Anzeigen der Konfiguration erlauben (könnte sensible Daten enthalten)" #: ../../../../configuration.php:24 msgid "Allow to show the full executed SQL queries in some places" msgstr "" "Erlaube das Anzeigen der vollständigen ausgeführten SQL-Statements an " "einigen Stellen" #: ../../../../application/forms/DirectorDatalistEntryForm.php:48 msgid "" "Allow to use this entry only to users with one of these Icinga Web 2 roles" msgstr "" "Erlaube es ausschließlich Benutzern mit einer dieser Icinga Web 2 Rollen, " "diesen Eintrag zu nutzen" #: ../../../../configuration.php:13 msgid "Allow unrestricted access to Icinga Director" msgstr "Unbeschränkten Zugriff auf die Director API erlauben" #: ../../../../configuration.php:41 msgid "" "Allow users to modify Hosts they are allowed to see in the monitoring module" msgstr "" "Erlaube Benutzern, Hosts zu bearbeiten, welche sie im Monitoring-Modul sehen " "dürfen" #: ../../../../configuration.php:44 msgid "" "Allow users to modify Service they are allowed to see in the monitoring " "module" msgstr "" "Erlaube Benutzern, Services zu bearbeiten, welche sie im Monitoring-Modul " "sehen dürfen" #: ../../../../configuration.php:27 msgid "Allow users with Hostgroup restrictions to access the Groups field" msgstr "" "Mache Benutzern mit Hostgruppenbeschränkung das Feld \"Gruppen\" zugänglich" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:85 msgid "Allowed maximum" msgstr "Erlaubtes Maximum" #: ../../../../application/forms/DirectorDatalistEntryForm.php:44 msgid "Allowed roles" msgstr "Erlaubte Rollen" #: ../../../../application/forms/IcingaCloneObjectForm.php:106 msgid "Also clone fields provided by this Template" msgstr "Klone auch Felder welche durch diese Vorlage bereitgestellt werden" #: ../../../../application/forms/IcingaCloneObjectForm.php:72 msgid "Also clone single Service Sets defined for this Host" msgstr "Klone auch Service-Sets welche für diesen Host definiert wurden" #: ../../../../application/forms/IcingaCloneObjectForm.php:63 msgid "Also clone single Services defined for this Host" msgstr "Klone auch Einzelservices welche für diesen Host definiert wurden" #: ../../../../library/Director/Import/ImportSourceRestApi.php:211 msgid "Also deeper keys can be specific by a dot-notation:" msgstr "" "Auch tieferliegende Schlüssel können via Punkt-Notation erreicht werden:" #: ../../../../application/forms/SelfServiceSettingsForm.php:204 msgid "" "Also install NSClient++. It can be used through the Icinga Agent and comes " "with a bunch of additional Check Plugins" msgstr "" "Installiere auch NSClient++. Dieser kann über den installierten Icinga Agent " "genutzt werden und bringt eine Reihe zusätzlicher Check-Plugins" #: ../../../../application/forms/DirectorDatafieldForm.php:109 #, php-format msgid "Also rename all \"%s\" custom variables to \"%s\" on %d objects?" msgstr "" "Auch alle benutzerdefinierten \"%s\" Variablen nach \"%s\" auf %d Objekten " "umbenennen?" #: ../../../../application/forms/DirectorDatafieldForm.php:66 #, php-format msgid "Also wipe all \"%s\" custom variables from %d objects?" msgstr "" "Außerdem alle \"%s\" benutzerdefinierten Variablen von %d Objekten entfernen?" #: ../../../../application/forms/IcingaHostForm.php:357 msgid "" "Alternative name for this host. Might be a host alias or and kind of string " "helping your users to identify this host" msgstr "" "Alternativer Name für diesen Host. Kann ein Alias oder jede Zeichenkette " "sein, die Benutzern hilft, diesen Host zu identifizieren" #: ../../../../application/forms/IcingaUserForm.php:135 msgid "" "Alternative name for this user. In case your object name is a username, this " "could be the full name of the corresponding person" msgstr "" "Alternativer Name für diesen Benutzer. Falls der Name des Objekts ein " "Benutzername ist, könnte hier der vollständige Name der betreffenden Person " "hinterlegt werden" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1570 msgid "Alternative text to be shown in case above icon is missing" msgstr "Alternativer Text der angezeigt werden soll, falls obiges Icon fehlt" #: ../../../../application/forms/IcingaCommandArgumentForm.php:91 msgid "" "An Icinga DSL expression that returns a boolean value, e.g.: var cmd = " "bool(macro(\"$cmd$\")); return cmd ..." msgstr "" "Ein Icinga DSL Ausdruck welcher einen booleschen Wert liefert, z.B.: var cmd " "= bool(macro(\"$cmd$\")); return cmd ..." #: ../../../../application/forms/IcingaCommandArgumentForm.php:52 msgid "" "An Icinga DSL expression, e.g.: var cmd = macro(\"$cmd$\"); return " "typeof(command) == String ..." msgstr "" "Ein Icinga DSL Ausdruck, z.B.: var cmd = macro(\"$cmd$\"); return " "typeof(command) == String ..." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1552 msgid "" "An URL leading to additional actions for this object. Often used with Icinga " "Classic, rarely with Icinga Web 2 as it provides far better possibilities to " "integrate addons" msgstr "" "Eine URL zu weiteren Aktionen für dieses Objekt. Wird oft mit Icinga " "Classic, jedoch selten mit Icinga Web 2 genutzt, da dieses viel bessere " "Möglichkeiten zur Integration von Addons bietet" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1545 msgid "An URL pointing to additional notes for this object" msgstr "Eine URL zu Notizen für dieses Objekt" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1561 msgid "" "An URL pointing to an icon for this object. Try \"tux.png\" for icons " "relative to public/img/icons or \"cloud\" (no extension) for items from the " "Icinga icon font" msgstr "" "Eine URL zu einem Icon für dieses Objekt. \"tux.png\" für Icons relativ zu " "public/img/icons oder \"cloud\" (ohne Erweiterung) für Objekte aus dem " "Icinga Icon-Fundus" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1317 msgid "" "An alternative display name for this group. If you wonder how this could be " "helpful just leave it blank" msgstr "" "Ein alternativer Anzeigename für diese Gruppe. Kann leer gelassen werden" #: ../../../../application/forms/ImportRowModifierForm.php:54 msgid "" "An extended description for this Import Row Modifier. This should explain " "it's purpose and why it has been put in place at all." msgstr "" "Eine erweiterte Beschreibung für diesen Eigenschaftsmodifikator. Diese soll " "seine Aufgabe sowie seinen Sinn und Zweck beschreiben." #: ../../../../application/forms/ImportSourceForm.php:26 msgid "" "An extended description for this Import Source. This should explain what " "kind of data you're going to import from this source." msgstr "" "Eine erweiterte Beschreibung für diese Import-Quelle. Diese sollte " "erläutern, welche Art von Daten von dieser Quelle bereitgestellt werden." #: ../../../../application/forms/SyncRuleForm.php:38 msgid "" "An extended description for this Sync Rule. This should explain what this " "Rule is going to accomplish." msgstr "" "Eine erweiterte Beschreibung für diese Synchronisationsregel. Sollte " "erläutern was diese Regel bezwecken will." #: ../../../../application/forms/DirectorDatafieldForm.php:160 #: ../../../../application/forms/IcingaObjectFieldForm.php:96 msgid "" "An extended description for this field. Will be shown as soon as a user puts " "the focus on this field" msgstr "" "Eine ausführliche Beschreibung dieses Felds. Wird angezeigt, sobald ein " "Benutzer den Fokus auf dieses Feld legt" #: ../../../../library/Director/Import/ImportSourceLdap.php:58 msgid "" "An object class to search for. Might be \"user\", \"group\", \"computer\" or " "similar" msgstr "" "Die Objektklasse, nach der gesucht werden soll. z.B. \"user\", \"group\", " "\"computer\" oder Ähnliches" #: ../../../../library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:35 msgid "" "Another Import Source. We're going to look up the row with the key matching " "the value in the chosen column" msgstr "" "Eine andere Import-Quelle. Wir suchen dort eine Zeile mit einem Schlüssel, " "der dem Wert in der gewählten Spalte entspricht" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:20 msgid "Any first (leftmost) component" msgstr "Beliebige erste (linkeste) Komponente" #: ../../../../library/Director/Web/SelfService.php:70 #: ../../../../library/Director/Web/SelfService.php:111 msgid "Api Key:" msgstr "API-Schlüssel:" #: ../../../../library/Director/Web/Controller/TemplateController.php:55 #, php-format msgid "Applied %s" msgstr "Angewendete(r) %s" #: ../../../../application/forms/IcingaHostForm.php:233 msgid "Applied groups" msgstr "Angewendete Gruppen" #: ../../../../application/controllers/HostController.php:402 #, php-format msgid "Applied service: %s" msgstr "Zugewiesener Service: %s" #: ../../../../application/controllers/HostController.php:248 #: ../../../../application/controllers/HostController.php:331 msgid "Applied services" msgstr "Zugewiesene Services" #: ../../../../library/Director/Web/Tabs/ObjectsTabs.php:51 msgid "Apply" msgstr "Anwenden" #: ../../../../application/controllers/ServiceController.php:123 #, php-format msgid "Apply \"%s\"" msgstr "Apply \"%s\"" #: ../../../../application/forms/ApplyMigrationsForm.php:25 #, php-format msgid "Apply %d pending schema migrations" msgstr "%d Schema-Migrations-Scripte anwenden" #: ../../../../application/forms/IcingaServiceForm.php:627 msgid "Apply For" msgstr "Anwenden auf" #: ../../../../library/Director/Web/Controller/TemplateController.php:170 msgid "Apply Rule" msgstr "Apply-Regel" #: ../../../../library/Director/Web/Table/ApplyRulesTable.php:165 msgid "Apply Rule rendering preview" msgstr "Rendering-Vorschau für diese Apply-Regel" #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:84 #: ../../../../library/Director/Web/Table/DependencyTemplateUsageTable.php:11 #: ../../../../library/Director/Web/Table/NotificationTemplateUsageTable.php:11 #: ../../../../library/Director/Web/Table/ServiceTemplateUsageTable.php:12 msgid "Apply Rules" msgstr "Apply-Regeln" #: ../../../../application/forms/ApplyMigrationsForm.php:20 msgid "Apply a pending schema migration" msgstr "Ein ausstehende Schema-Migration durchführen" #: ../../../../library/Director/Job/SyncJob.php:92 msgid "Apply changes" msgstr "Änderungen anwenden" #: ../../../../library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:21 msgid "Apply notifications with specific properties according to given rules." msgstr "" "Benachrichtigungen mit bestimmten Eigenschaften anhand von gegebenen Regeln " "anwenden" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1126 msgid "Apply rule" msgstr "Apply Regel" #: ../../../../library/Director/Web/Table/ApplyRulesTable.php:172 msgid "Apply rule history" msgstr "Apply-Regel Historie" #: ../../../../application/forms/KickstartForm.php:38 msgid "Apply schema migrations" msgstr "Schema-Migrations-Scripte anwenden" #: ../../../../application/forms/IcingaNotificationForm.php:82 #: ../../../../application/forms/IcingaDependencyForm.php:93 #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:82 msgid "Apply to" msgstr "Anwenden auf" #: ../../../../application/controllers/ServiceController.php:224 #, php-format msgid "Apply: %s" msgstr "Apply: %s" #: ../../../../library/Director/Web/Table/BranchedIcingaCommandArgumentTable.php:46 #: ../../../../library/Director/Web/Table/IcingaCommandArgumentTable.php:49 msgid "Argument" msgstr "Argument" #: ../../../../library/Director/Field/FormFieldSuggestion.php:82 msgid "Argument macros" msgstr "Argument Makros" #: ../../../../application/forms/IcingaCommandArgumentForm.php:25 msgid "Argument name" msgstr "Argumentname" #: ../../../../application/forms/SyncPropertyForm.php:315 msgid "Arguments" msgstr "Argumente" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:80 #: ../../../../library/Director/DataType/DataTypeSqlQuery.php:77 #: ../../../../library/Director/DataType/DataTypeDatalist.php:133 msgid "Array" msgstr "Array" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1622 msgid "Assign where" msgstr "Zuweisen wo" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:95 msgid "Associated Template" msgstr "Zugehörige Vorlage" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:506 #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:31 #: ../../../../application/controllers/BranchController.php:59 msgid "Author" msgstr "Autor" #: ../../../../library/Director/DataType/DataTypeDatalist.php:151 msgid "Autocomplete" msgstr "Automatische Vervollständigung" #: ../../../../library/Director/Dashboard/AutomationDashboard.php:15 msgid "Automate all tasks" msgstr "Automatisiere alle Aufgaben" #: ../../../../configuration.php:137 msgid "Automation" msgstr "Automatisierung" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:64 msgid "Available choices" msgstr "Verfügbare Auswahlmöglichkeiten" #: ../../../../library/Director/Web/Controller/TemplateController.php:96 #: ../../../../application/controllers/BasketController.php:52 #: ../../../../application/controllers/DataController.php:165 msgid "Back" msgstr "Zurück" #: ../../../../library/Director/Web/Table/BasketTable.php:31 #: ../../../../application/forms/AddToBasketForm.php:61 #: ../../../../application/controllers/BasketController.php:34 msgid "Basket" msgstr "Basket" #: ../../../../application/forms/BasketForm.php:38 msgid "Basket Definitions" msgstr "Basket-Definitionen" #: ../../../../application/forms/BasketForm.php:48 #: ../../../../application/forms/BasketUploadForm.php:30 msgid "Basket Name" msgstr "Basket-Name" #: ../../../../application/controllers/BasketController.php:160 msgid "Basket Snapshots" msgstr "Basket-Snapshots" #: ../../../../application/forms/BasketUploadForm.php:141 msgid "Basket has been uploaded" msgstr "Basket wurde hochgeladen" #: ../../../../application/controllers/BasketsController.php:17 #: ../../../../application/controllers/BasketController.php:76 msgid "Baskets" msgstr "Baskets" #: ../../../../application/forms/SyncRuleForm.php:103 msgid "" "Be careful: this is usually NOT what you want, as it makes Sync \"blind\" " "for objects matching this filter. This means that \"Purge\" will not work as " "expected. The \"Black/Whitelist\" Import Property Modifier is probably what " "you're looking for." msgstr "" "Vorsicht: das ist für gewöhnlich NICHT das was man möchte, denn es macht " "Sync \"blind\" für Objekte die diesem Filter entsprechen. Das bedeutet meist " "dass das \"Bereinigen\" nicht wie erwartet funktioniert. Der \"Black/" "Whitelist\"-Eigenschaftsmodifikator ist für gewöhnlich was man stattdessen " "nutzen möchte." #: ../../../../library/Director/PropertyModifier/PropertyModifierTrim.php:20 msgid "Beginning and Ending" msgstr "Anfang und Ende" #: ../../../../library/Director/PropertyModifier/PropertyModifierTrim.php:21 msgid "Beginning only" msgstr "Nur den Anfang" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:79 msgid "Binary" msgstr "Binary" #: ../../../../application/controllers/BranchController.php:48 msgid "Branch Activity" msgstr "Aktivität in diesem Zweig" #: ../../../../library/Director/DataType/DataTypeDictionary.php:36 msgid "Can be managed once this object has been created" msgstr "Kann verwaltet werden, sobald dieses Objekt erstellt wurde" #: ../../../../library/Director/Db/Branch/MergeErrorModificationForMissingObject.php:10 #, php-format msgid "Cannot apply modification for %s %s, object does not exist" msgstr "" "Änderung für %s %s kann nicht angewandt werden, das Objekt existiert nicht" #: ../../../../library/Director/Db/Branch/MergeErrorDeleteMissingObject.php:10 #, php-format msgid "Cannot delete %s %s, it does not exist" msgstr "%s %s kann nicht gelöscht werden, es existiert nicht" #: ../../../../library/Director/Db/Branch/MergeErrorRecreateOnMerge.php:10 #, php-format msgid "Cannot recreate %s %s" msgstr "%s %s kann nicht erneut erstellt werden" #: ../../../../application/forms/DirectorDatafieldForm.php:149 #: ../../../../application/forms/IcingaObjectFieldForm.php:83 msgid "Caption" msgstr "Beschriftung" #: ../../../../library/Director/Dashboard/Dashlet/DatafieldCategoryDashlet.php:19 msgid "Categories bring structure to your Data Fields" msgstr "Kategorien bringen Struktur in konfigurierte Datenfelder" #: ../../../../library/Director/Web/Table/DatafieldTable.php:53 msgid "Category" msgstr "Kategorie" #: ../../../../library/Director/Web/Table/DatafieldCategoryTable.php:47 msgid "Category Name" msgstr "Kategoriename" #: ../../../../application/forms/DirectorDatafieldCategoryForm.php:23 msgid "Category name" msgstr "Kategoriename" #: ../../../../application/forms/IcingaMultiEditForm.php:270 #, php-format msgid "Changing this value affects %d object(s): %s" msgstr "Diesen Wert zu ändern beeinflusst %d Objekt(e): %s" #: ../../../../library/Director/PropertyModifier/PropertyModifierTrim.php:28 msgid "Character Mask" msgstr "Zeichenmaske" #: ../../../../library/Director/Import/ImportSourceCoreApi.php:57 msgid "Check Commands" msgstr "Check-Kommando" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1338 msgid "Check command" msgstr "Check-Kommando" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1339 #: ../../../../application/forms/IcingaNotificationForm.php:311 msgid "Check command definition" msgstr "Check-Kommandodefinition" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1407 msgid "" "Check command timeout in seconds. Overrides the CheckCommand's timeout " "attribute" msgstr "" "Timeout für das Check-Kommando in Sekunden. Überschreibt die Timeout-" "Konfiguration des Kommandos" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:337 msgid "Check execution" msgstr "Check-Ausführung" #: ../../../../application/forms/ImportCheckForm.php:23 #: ../../../../application/forms/SyncCheckForm.php:24 msgid "Check for changes" msgstr "Auf Änderungen prüfen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1374 msgid "Check interval" msgstr "Check-Intervall" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1419 msgid "Check period" msgstr "Checkzeitraum" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1405 msgid "Check timeout" msgstr "Check-Timeout" #: ../../../../application/forms/ImportCheckForm.php:45 msgid "Checking this Import Source failed" msgstr "Überprüfen dieser Importquelle fehlgeschlagen" #: ../../../../application/forms/SyncCheckForm.php:66 msgid "Checking this sync rule failed" msgstr "Überprüfen dieser Synchronisationsregel fehlgeschlagen" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:550 msgid "Checksum" msgstr "Prüfsumme" #: ../../../../application/forms/IcingaDependencyForm.php:233 msgid "Child Host" msgstr "Kind-Host" #: ../../../../application/forms/IcingaDependencyForm.php:246 msgid "Child Service" msgstr "Kind-Service" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:48 msgid "Choice name" msgstr "Auswahlname" #: ../../../../library/Director/Dashboard/Dashlet/ChoicesDashlet.php:13 #: ../../../../library/Director/Web/Tabs/ObjectsTabs.php:76 msgid "Choices" msgstr "Auswahl" #: ../../../../application/forms/BasketForm.php:82 msgid "" "Choose \"All\" to always add all of them, \"Ignore\" to not care about a " "specific Type at all and opt for \"Custom Selection\" in case you want to " "choose just some specific Objects." msgstr "" "Wählen Sie \"Alle\" um immer alle davon hinzuzufügen, \"Ignorieren\" um sich " "nicht um einen bestimmten Typ zu kümmern und entscheiden Sie sich für " "\"Benutzerdefinierte Auswahl\" wenn nur bestimmte Objekte manuell gewählt " "werden sollen." #: ../../../../application/forms/IcingaTemplateChoiceForm.php:97 msgid "Choose Choice Associated Template" msgstr "Wähle eine der Auswahl zugehörige Vorlage" #: ../../../../application/controllers/IndexController.php:53 msgid "Choose DB Resource" msgstr "Datenbankressource wählen" #: ../../../../application/forms/IcingaHostForm.php:190 msgid "Choose a Host Template" msgstr "Wähle eine Service-Vorlage" #: ../../../../application/forms/IcingaAddServiceForm.php:106 msgid "Choose a service template" msgstr "Wähle eine Service-Vorlage" #: ../../../../application/forms/SyncRuleForm.php:46 msgid "Choose an object type" msgstr "Einen Objekttyp auswählen" #: ../../../../application/forms/BasketUploadForm.php:37 msgid "Choose file" msgstr "Datei wählen" #: ../../../../application/forms/IcingaServiceForm.php:605 msgid "Choose the host this single service should be assigned to" msgstr "Host wählen, dem dieser einzelne Service zugewiesen werden soll" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:75 msgid "" "Choosing this many options will be mandatory for this Choice. Setting this " "to zero will leave this Choice optional, setting it to one results in a " "\"required\" Choice. You can use higher numbers to enforce multiple options, " "this Choice will then turn into a multi-selection element." msgstr "" "Diese Anzahl an Optionen müssen für diese Auswahl zwingend gewählt werden. " "Setzt man diese Einstellung auf Null, wird die Auswahl optional, setzt man " "sie auf Eins wird die Auswahl zwingend. Setzt man eine höhere Anzahl kann " "man mehrere Optionen erzwingen, die Auswahl wandelt sich dann in ein " "Mehrfach-Auswahlfeld." #: ../../../../application/forms/IcingaZoneForm.php:37 msgid "Chose an (optional) parent zone" msgstr "Eine (optionale) Elternzone auswählen" #: ../../../../library/Director/Web/Widget/Documentation.php:38 #, php-format msgid "Click to read our documentation: %s" msgstr "Anklicken um unsere Dokumentation zu lesen: %s" #: ../../../../library/Director/Web/ActionBar/AutomationObjectActionBar.php:44 #: ../../../../library/Director/Web/Form/CloneImportSourceForm.php:37 #: ../../../../library/Director/Web/Form/CloneSyncRuleForm.php:37 #: ../../../../library/Director/Web/Controller/ObjectController.php:384 #: ../../../../application/controllers/ImportsourceController.php:148 #: ../../../../application/controllers/SyncruleController.php:547 msgid "Clone" msgstr "Klonen" #: ../../../../application/forms/IcingaCloneObjectForm.php:112 #, php-format msgid "Clone \"%s\"" msgstr "Klone \"%s\"" #: ../../../../application/forms/IcingaCloneObjectForm.php:70 msgid "Clone Service Sets" msgstr "Klone Service-Set" #: ../../../../application/forms/IcingaCloneObjectForm.php:61 msgid "Clone Services" msgstr "Klone Services" #: ../../../../application/forms/IcingaCloneObjectForm.php:104 msgid "Clone Template Fields" msgstr "Vorlagen-Felder klonen" #: ../../../../application/forms/IcingaCloneObjectForm.php:51 msgid "Clone the object as is, preserving imports" msgstr "Objekt vollständig unter Erhalt der Vererbung klonen" #: ../../../../application/forms/IcingaCloneObjectForm.php:91 msgid "Clone this service to the very same or to another Host" msgstr "Klone diesen Service zum selben oder einem anderen Host" #: ../../../../application/forms/IcingaCloneObjectForm.php:82 msgid "Clone this service to the very same or to another Service Set" msgstr "Klone diesen Service" #: ../../../../library/Director/Web/Controller/ObjectController.php:217 #, php-format msgid "Clone: %s" msgstr "Klone %s" #: ../../../../library/Director/Web/Controller/ObjectController.php:224 msgid "Cloning Apply Rules" msgstr "Apply-Regeln klonen" #: ../../../../application/controllers/ImportsourceController.php:149 msgid "Cloning Import Sources" msgstr "Importquellen klonen" #: ../../../../application/controllers/SyncruleController.php:558 msgid "Cloning Sync Rules" msgstr "Synchronisationsregeln klonen" #: ../../../../library/Director/Web/Controller/ObjectController.php:220 msgid "Cloning Templates" msgstr "Vorlagen Klonen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1165 msgid "Cluster Zone" msgstr "Cluster Zone" #: ../../../../library/Director/Dashboard/Dashlet/ChoicesDashlet.php:19 msgid "" "Combine multiple templates into meaningful Choices, making life easier for " "your users" msgstr "" "Kombiniere mehrere Vorlagen zu sprechenden Wahlmöglichkeiten, um die " "Benutzung zu vereinfachen" #: ../../../../library/Director/PropertyModifier/PropertyModifierSimpleGroupBy.php:62 msgid "" "Comma-separated list of columns that should be aggregated (transformed into " "an Array). For all other columns only the first value will be kept." msgstr "" "Kommagetrennte Liste von Spalten, welche aggregiert (in ein Array " "verwandelt) werden sollen. Für alle anderen Spalten wird lediglich der erste " "Wert beibehalten." #: ../../../../library/Director/TranslationDummy.php:16 #: ../../../../application/forms/IcingaCommandForm.php:58 #: ../../../../application/forms/SyncRuleForm.php:20 msgid "Command" msgstr "Kommando" #: ../../../../application/forms/BasketForm.php:17 msgid "Command Definitions" msgstr "Kommandodefinitionen" #: ../../../../application/forms/BasketForm.php:19 msgid "Command Template" msgstr "Kommando-Vorlage" #: ../../../../library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:19 msgid "Command Templates" msgstr "Kommando-Vorlagen" #: ../../../../application/controllers/CommandController.php:92 #, php-format msgid "Command arguments: %s" msgstr "Kommandoargumente: %s" #: ../../../../application/forms/IcingaHostForm.php:116 msgid "Command endpoint" msgstr "Kommandoendpunkt" #: ../../../../application/forms/IcingaCommandForm.php:47 msgid "Command name" msgstr "Kommandoname" #: ../../../../application/forms/IcingaCommandForm.php:17 msgid "Command type" msgstr "Kommandotyp" #: ../../../../configuration.php:129 #: ../../../../library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:21 #: ../../../../library/Director/Dashboard/Dashlet/CommandObjectDashlet.php:15 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:37 #: ../../../../library/Director/Web/Table/CustomvarVariantsTable.php:57 msgid "Commands" msgstr "Kommandos" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:39 msgid "Comment" msgstr "Kommentar" #: ../../../../application/controllers/BasketController.php:356 #, php-format msgid "Comparing %s \"%s\" from Snapshot \"%s\" to current config" msgstr "" "Vergleiche %s \"%s\" aus dem Snapshot \"%s\" mit der aktuellen Konfiguration" #: ../../../../application/forms/IcingaCommandArgumentForm.php:89 #: ../../../../application/forms/IcingaCommandArgumentForm.php:98 msgid "Condition (set_if)" msgstr "Bedingung (set_if)" #: ../../../../application/forms/IcingaCommandArgumentForm.php:75 msgid "Condition format" msgstr "Bedingungsformat" #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:85 #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:61 #: ../../../../application/controllers/JobController.php:112 #: ../../../../application/controllers/ConfigController.php:278 #: ../../../../application/controllers/ConfigController.php:516 msgid "Config" msgstr "Konfiguration" #: ../../../../library/Director/Dashboard/Dashlet/DeploymentDashlet.php:19 msgid "Config Deployment" msgstr "Ausrollen der Konfiguration" #: ../../../../application/forms/DeployConfigForm.php:100 #: ../../../../application/forms/DeploymentLinkForm.php:166 #: ../../../../application/controllers/ConfigController.php:491 msgid "Config deployment failed" msgstr "Ausrollen der Konfiguration fehlgeschlagen" #: ../../../../application/controllers/ConfigController.php:365 #: ../../../../application/controllers/ConfigController.php:366 msgid "Config diff" msgstr "Konfigurationsunterschied" #: ../../../../application/controllers/ConfigController.php:324 #: ../../../../application/controllers/ConfigController.php:426 #, php-format msgid "Config file \"%s\"" msgstr "Konfigurationsdatei \"%s\"" #: ../../../../application/forms/DeployConfigForm.php:76 #: ../../../../application/forms/DeployConfigForm.php:95 #: ../../../../application/forms/DeploymentLinkForm.php:153 #: ../../../../application/controllers/ConfigController.php:471 msgid "Config has been submitted, validation is going on" msgstr "Konfiguration wurde übergeben, Überprüfung ist im Gange" #: ../../../../application/forms/DeployFormsBug7530.php:87 msgid "Config has not been deployed" msgstr "Konfiguration wurde nicht ausgerollt" #: ../../../../library/Director/Web/ObjectPreview.php:41 #, php-format msgid "Config preview: %s" msgstr "Konfigurationsvorschau: %s" #: ../../../../library/Director/ProvidedHook/Monitoring/ServiceActions.php:63 #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:83 msgid "Configuration" msgstr "Konfiguration" #: ../../../../application/controllers/HostController.php:272 msgid "Configuration (read-only)" msgstr "Konfiguration (nur lesen)" #: ../../../../library/Director/Dashboard/Dashlet/BasketDashlet.php:13 #: ../../../../application/controllers/BasketsController.php:32 msgid "Configuration Baskets" msgstr "Konfigurationsbaskets" #: ../../../../application/forms/SettingsForm.php:121 msgid "Configuration format" msgstr "Konfigurationsformat" #: ../../../../application/forms/KickstartForm.php:309 msgid "Configuration has been stored" msgstr "Konfiguration wurde gespeichert" #: ../../../../application/forms/AddToBasketForm.php:112 #, php-format msgid "Configuration objects have been added to the chosen basket \"%s\"" msgstr "Konfigurationsobjekte wurden zum gewählten Basket \"%s\" hinzugefügt" #: ../../../../library/Director/Web/SelfService.php:179 msgid "Configure this Agent via Self Service API" msgstr "Konfiguriere diesen Agent über die Selbstbedienungs-API" #: ../../../../application/controllers/BasketController.php:255 msgid "Content Checksum" msgstr "Prüfsumme (Inhalt)" #: ../../../../application/controllers/BasketsController.php:20 msgid "Create" msgstr "Erstellen" #: ../../../../application/controllers/BasketController.php:102 msgid "Create Basket" msgstr "Basket erstellen" #: ../../../../application/controllers/IndexController.php:46 msgid "Create Schema" msgstr "Schema erstellen" #: ../../../../application/forms/BasketCreateSnapshotForm.php:23 msgid "Create Snapshot" msgstr "Snapshot erstellen" #: ../../../../library/Director/Web/Controller/ObjectsController.php:320 #, php-format msgid "Create a new %s Apply Rule" msgstr "Erstelle eine neue %s Apply-Regel" #: ../../../../library/Director/Web/Controller/ObjectsController.php:361 #, php-format msgid "Create a new %s Set" msgstr "Erstelle ein neues %s-Set" #: ../../../../library/Director/Web/Controller/TemplateController.php:158 #, php-format msgid "Create a new %s inheriting from this one" msgstr "Neuen und von diesem erbenden %s erstellen" #: ../../../../library/Director/Web/Controller/TemplateController.php:148 #: ../../../../library/Director/Web/Controller/TemplateController.php:168 #, php-format msgid "Create a new %s inheriting from this template" msgstr "Einen neuen von dieser Vorlage erbenden %s erstellen" #: ../../../../application/controllers/BasketController.php:103 msgid "Create a new Configuration Basket" msgstr "Erstelle einen neuen Konfigurationsbasket" #: ../../../../library/Director/Web/ActionBar/TemplateActionBar.php:23 #: ../../../../library/Director/Web/Controller/ObjectController.php:148 msgid "Create a new Template" msgstr "Neue Vorlage erstellen" #: ../../../../library/Director/Web/ActionBar/ObjectsActionBar.php:20 msgid "Create a new object" msgstr "Neues Objekt erstellen" #: ../../../../library/Director/Web/ActionBar/ChoicesActionBar.php:20 msgid "Create a new template choice" msgstr "Neue Template-Auswahl erstellen" #: ../../../../application/forms/KickstartForm.php:37 msgid "Create database schema" msgstr "Datenbankschema erstellen" #: ../../../../application/forms/ApplyMigrationsForm.php:31 msgid "Create schema" msgstr "Datenbankschema erstellen" #: ../../../../application/controllers/BasketController.php:254 msgid "Created" msgstr "Erstellt" #: ../../../../application/controllers/ImportsourceController.php:109 msgid "Creating Import Sources" msgstr "Importquellen erstellen" #: ../../../../application/controllers/JobController.php:36 msgid "Creating Jobs" msgstr "Aufträge erstellen" #: ../../../../application/controllers/SyncruleController.php:523 msgid "Creating Sync Rules" msgstr "Synchronisationsregeln erstellen" #: ../../../../library/Director/Web/Controller/ObjectController.php:147 msgid "Creating Templates" msgstr "Vorlagen erstellen" #: ../../../../library/Director/IcingaConfig/StateFilterSet.php:26 msgid "Critical" msgstr "Kritisch" #: ../../../../library/Director/Web/Controller/TemplateController.php:187 msgid "Current Template Usage" msgstr "Aktuelle Nutzung dieser Vorlage" #: ../../../../application/forms/IcingaHostForm.php:106 msgid "Custom Endpoint Name" msgstr "Individueller Endpunktname" #: ../../../../application/forms/BasketForm.php:57 msgid "Custom Selection" msgstr "Benutzerdefinierte Auswahl" #: ../../../../application/controllers/CustomvarController.php:13 msgid "Custom Variable" msgstr "Benutzerdefinierte Variable" #: ../../../../application/controllers/CustomvarController.php:14 #, php-format msgid "Custom Variable variants: %s" msgstr "Varianten der benutzerdefinierten Variable: %s" #: ../../../../library/Director/Web/Tabs/DataTabs.php:30 msgid "Custom Variables" msgstr "Benutzerdefinierte Variablen" #: ../../../../application/controllers/DataController.php:110 msgid "Custom Vars - Overview" msgstr "Benutzerdefinierte Variablen - Übersicht" #: ../../../../application/forms/SyncPropertyForm.php:180 msgid "Custom expression" msgstr "Benutzerdefinierter Ausdruck" #: ../../../../library/Director/Web/Controller/ObjectController.php:253 #, php-format msgid "Custom fields: %s" msgstr "Benutzerdefinierte Felder: \"%s\"" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:25 msgid "Custom notification" msgstr "Benutzerdefinierte Benachrichtigung" #: ../../../../library/Director/Web/Form/IcingaObjectFieldLoader.php:266 #: ../../../../application/forms/IcingaServiceForm.php:468 msgid "Custom properties" msgstr "Benutzerdefinierte Eigenschaften" #: ../../../../application/forms/SyncPropertyForm.php:67 msgid "Custom variable" msgstr "Benutzerdefinierte Variable" #: ../../../../application/forms/SyncPropertyForm.php:308 msgid "Custom variable (vars.)" msgstr "Benutzerdefinierte Variable (vars.)" #: ../../../../library/Director/Objects/IcingaHost.php:163 #: ../../../../library/Director/Objects/IcingaService.php:669 #: ../../../../application/controllers/SuggestController.php:253 #: ../../../../application/controllers/SuggestController.php:263 msgid "Custom variables" msgstr "Benutzerdefinierte Variablen" #: ../../../../library/Director/Dashboard/Dashlet/CustomvarDashlet.php:13 msgid "CustomVar Overview" msgstr "Benutzerdefinierte Variable - Übersicht" #: ../../../../library/Director/Import/ImportSourceSql.php:41 msgid "DB Query" msgstr "Datenbank-Abfrage" #: ../../../../application/forms/KickstartForm.php:222 msgid "DB Resource" msgstr "Datenbankressource" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:15 msgid "DN component" msgstr "DN Komponente" #: ../../../../library/Director/PropertyModifier/PropertyModifierDnsRecords.php:25 msgid "DNS record type" msgstr "DNS-Record-Typ" #: ../../../../library/Director/Web/Tabs/MainTabs.php:35 msgid "Daemon" msgstr "Dienst" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:40 #, php-format msgid "Daemon has been stopped %s, was running with PID %s as %s@%s" msgstr "Dienst wurde %s gestoppt, lief zuvor mit PID %s als %s@%s" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:62 #, php-format msgid "Daemon is running with PID %s as %s@%s, last refresh happened %s" msgstr "" "Dienst läuft mit PID %s als %s@%s, die letzte Aktualisierung fand %s statt" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:51 #, php-format msgid "" "Daemon keep-alive is outdated, was last seen running with PID %s as %s@%s %s" msgstr "" "Daemon keep-alive is outdated, was last seen running with PID %s as %s@%s %s" #: ../../../../library/Director/Dashboard/Dashlet/DatafieldCategoryDashlet.php:13 #: ../../../../application/controllers/DataController.php:93 msgid "Data Field Categories" msgstr "Datenfeldkategorien" #: ../../../../application/forms/DirectorDatafieldForm.php:167 msgid "Data Field Category" msgstr "Datenfeldkategorie" #: ../../../../application/controllers/DataController.php:75 msgid "Data Fields" msgstr "Datenfelder" #: ../../../../application/controllers/DataController.php:65 msgid "Data List" msgstr "Datenliste" #: ../../../../application/forms/SyncRuleForm.php:19 msgid "Data List Entry" msgstr "Datenlisteneintrag" #: ../../../../application/controllers/DataController.php:59 #, php-format msgid "Data List: %s" msgstr "Datenliste: %s" #: ../../../../application/forms/BasketForm.php:34 msgid "Data Lists" msgstr "Datenlisten" #: ../../../../library/Director/Web/Tabs/DataTabs.php:24 msgid "Data field categories" msgstr "Datenfeldkategorien" #: ../../../../application/forms/DirectorDatafieldCategoryForm.php:17 msgid "" "Data field categories allow to structure Data Fields. Fields with a category " "will be shown grouped by category." msgstr "" "Datenfeldkategorien erlauben es, Datenfelder zu strukturieren. Felder mit " "einer Kategorie werden nach Kategorie gruppiert angezeigt." #: ../../../../library/Director/Web/Tabs/DataTabs.php:21 msgid "Data fields" msgstr "Datenfelder" #: ../../../../application/forms/DirectorDatafieldForm.php:133 msgid "" "Data fields allow you to customize input controls for Icinga custom " "variables. Once you defined them here, you can provide them through your " "defined templates. This gives you a granular control over what properties " "your users should be allowed to configure in which way." msgstr "" "Datenfelder erlauben es, Eingabefelder für benutzerdefinierte Variablen zu " "personalisieren. Sobald diese hier definiert wurden, können sie über " "definierte Templates zur Verfügung gestellt werden. Das erlaubt eine " "granuläre Kontrolle darüber, welche Eigenschaften in welche Weise " "konfigurierbar sein sollen." #: ../../../../library/Director/Dashboard/Dashlet/DatafieldDashlet.php:19 msgid "Data fields make sure that configuration fits your rules" msgstr "" "Datenfelder sorgen dafür, dass die Konfiguration in vorgegebene Regeln passt" #: ../../../../application/forms/DirectorDatalistForm.php:24 msgid "Data list" msgstr "Datenliste" #: ../../../../library/Director/Web/Tabs/DataTabs.php:27 #: ../../../../application/controllers/DataController.php:32 msgid "Data lists" msgstr "Datenlisten" #: ../../../../application/forms/DirectorDatalistForm.php:15 msgid "" "Data lists are mainly used as data providers for custom variables presented " "as dropdown boxes boxes. You can manually manage their entries here in " "place, but you could also create dedicated sync rules after creating a new " "empty list. This would allow you to keep your available choices in sync with " "external data providers" msgstr "" "Datenlisten werden hauptsächlich als Datenquelle für benutzerdefinierte " "Variablen benutzt, die in Dropdown-Auswahlfeldern präsentiert werden. Ihre " "Einträge können hier manuell, oder über eine dedizierte " "Synchronisationsregel nach dem Anlegen einer leeren Liste verwaltet werden. " "Letzteres erlaubt das Synchronisieren der verfügbaren Auswahlmöglichkeiten " "mit externen Datenquellen" #: ../../../../application/forms/DirectorDatafieldForm.php:180 msgid "Data type" msgstr "Datentyp" #: ../../../../application/forms/KickstartForm.php:272 msgid "Database backend" msgstr "Datenbankbackend" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:507 #: ../../../../application/controllers/BranchController.php:60 msgid "Date" msgstr "Datum" #: ../../../../library/Director/Web/Table/IcingaTimePeriodRangeTable.php:45 #: ../../../../library/Director/Web/Table/IcingaScheduledDowntimeRangeTable.php:51 #: ../../../../application/forms/IcingaTimePeriodRangeForm.php:21 #: ../../../../application/forms/IcingaScheduledDowntimeRangeForm.php:22 msgid "Day(s)" msgstr "Tag(e)" #: ../../../../application/forms/IcingaServiceForm.php:175 msgid "Deactivate" msgstr "Deaktivieren" #: ../../../../application/forms/SettingsForm.php:130 msgid "" "Default configuration format. Please note that v1.x is for special " "transitional projects only and completely unsupported. There are no plans to " "make Director a first-class configuration backends for Icinga 1.x" msgstr "" "Standardkonfigurationsformat. Bitte beachten, dass v1.x nur für ganz " "spezielle Migrationsprojekte implementiert wurde und in keiner Weise " "unterstützt wird. Es gibt keine Pläne aus dem Director ein " "Konfigurationswerkzeug für Icinga 1.x zu machen" #: ../../../../application/forms/SettingsForm.php:32 msgid "Default global zone" msgstr "Globale Standard-Zone" #: ../../../../library/Director/PropertyModifier/PropertyModifierMap.php:45 msgid "Default value" msgstr "Standardwert" #: ../../../../library/Director/Dashboard/CommandsDashboard.php:23 msgid "" "Define Check-, Notification- or Event-Commands. Command definitions are the " "glue between your Host- and Service-Checks and the Check plugins on your " "Monitoring (or monitored) systems" msgstr "" "Definiere Check-, Benachrichtigungs- oder Event-Kommandos. " "Kommandodefinitionen sind das Verbindungsstück zwischen Host- und Service-" "Checks und den Check-Plugins auf dem Monitoring- (oder dem überwachten) " "System" #: ../../../../library/Director/Dashboard/Dashlet/DatafieldDashlet.php:13 msgid "Define Data Fields" msgstr "Datenfelder definieren" #: ../../../../library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:19 msgid "" "Define Host Groups to give your configuration more structure. They are " "useful for Dashboards, Notifications or Restrictions" msgstr "" "Definieren Host-Gruppen um der Konfiguration mehr Struktur zu geben. " "Nützlich sind diese auch für Dashboards, Benachrichtigungen oder " "Berechtigungen" #: ../../../../application/forms/SelfServiceSettingsForm.php:116 msgid "" "Define a download Url or local directory from which the a specific Icinga 2 " "Agent MSI Installer package should be fetched. Please ensure to only define " "the base download Url or Directory. The Module will generate the MSI file " "name based on your operating system architecture and the version to install. " "The Icinga 2 MSI Installer name is internally build as follows: Icinga2-" "v[InstallAgentVersion]-[OSArchitecture].msi (full example: Icinga2-v2.6.3-" "x86_64.msi)" msgstr "" "Definieren einen Download-URL oder ein lokales Verzeichnis von welchem ein " "bestimmtes MSI-Installer-Paket für den Icinga-2-Agenten geladen werden soll. " "Bitte sicherstellen, dass nur Basis-URL oder -Verzeichnis angegeben werden. " "Das Powershell-Modul erstellt den MSI-Dateinamen auf Basis der jeweiligen " "Betriebssystemarchitektur und zu installierenden Version. Intern wird der " "MSI-Installer-Name wie folgt erstellt: Icinga2-v[InstallAgentVersion]-" "[OSArchitecture].msi (volles Beispiel: Icinga2-v2.6.3-x86_64.msi)" #: ../../../../library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:30 msgid "Define and manage imports from various data sources" msgstr "Definiert und verwaltet Importe von diversen Datenquellen" #: ../../../../library/Director/Dashboard/TimeperiodsDashboard.php:14 msgid "Define custom Time Periods" msgstr "Benutzerdefinierte Zeiträume festlegen" #: ../../../../library/Director/Dashboard/Dashlet/SyncDashlet.php:30 msgid "Define how imported data should be synchronized with Icinga" msgstr "" "Definieren, wie importierte Daten mit Icinga synchronisiert werden sollen" #: ../../../../application/forms/SyncRuleForm.php:54 msgid "" "Define what should happen when an object with a matching key already exists. " "You could merge its properties (import source wins), replace it completely " "with the imported object or ignore it (helpful for one-time imports). " "\"Update only\" means that this Rule would never create (or delete) full " "Objects." msgstr "" "Angeben, was geschehen soll wenn ein Objekt mit gleichem Schlüssel bereits " "existiert. Die Eigenschaften können zusammengeführt (Importquelle gewinnt), " "durch das importierte Objekt ersetzt oder ignoriert (hilfreich für einmalige " "Importe) werden." #: ../../../../library/Director/Dashboard/ObjectsDashboard.php:15 msgid "Define whatever you want to be monitored" msgstr "Angeben, was überwacht werden soll" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1396 msgid "Defines after how many check attempts a new hard state is reached" msgstr "" "Legt fest, nach wie vielen Versuchen ein neuer Hard State erreicht wird" #: ../../../../library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:19 msgid "" "Defining Notifications for User Groups instead of single Users gives more " "flexibility" msgstr "" "Für Benutzergruppen anstelle einzelner Benutzer definierte " "Benachrichtigungen geben mehr Flexibilität" #: ../../../../library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:19 msgid "" "Defining Service Groups get more structure. Great for Dashboards. " "Notifications and Permissions might be based on groups." msgstr "" "Definiere Service-Gruppen für mehr Struktur. Nützlich für Dashboards. " "Benachrichtigungen und Berechtigungen können auf Gruppen basieren." #: ../../../../application/forms/IcingaNotificationForm.php:247 msgid "Delay until the first notification should be sent" msgstr "Verzögerung bis die erste Benachrichtigung verschickt werden soll" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:928 #: ../../../../application/forms/SyncRuleForm.php:87 #: ../../../../application/forms/IcingaObjectFieldForm.php:142 msgid "Delete" msgstr "Löschen" #: ../../../../library/Director/PropertyModifier/PropertyModifierSplit.php:13 msgid "Delimiter" msgstr "Trenner" #: ../../../../library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:13 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:47 #: ../../../../application/forms/BasketForm.php:33 msgid "Dependencies" msgstr "Abhängigkeiten" #: ../../../../application/forms/SyncRuleForm.php:24 msgid "Dependency" msgstr "Abhängigkeit" #: ../../../../application/forms/DeploymentLinkForm.php:95 msgid "Deploy" msgstr "Ausrollen" #: ../../../../application/forms/DeployConfigForm.php:37 #, php-format msgid "Deploy %d pending changes" msgstr "%d ausstehende Änderungen ausrollen" #: ../../../../library/Director/Dashboard/DeploymentDashboard.php:15 msgid "Deploy configuration to your Icinga nodes" msgstr "Konfiguration auf Icinga Knoten ausrollen" #: ../../../../library/Director/Job/ConfigJob.php:45 msgid "Deploy modified config" msgstr "Veränderte Konfiguration ausrollen" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:55 #: ../../../../application/controllers/ConfigController.php:271 #: ../../../../application/controllers/ConfigController.php:508 msgid "Deployment" msgstr "Deployment" #: ../../../../application/forms/SettingsForm.php:165 msgid "Deployment Path" msgstr "Deployment-Pfad" #: ../../../../application/controllers/DeploymentController.php:22 msgid "Deployment details" msgstr "Deployment-Details" #: ../../../../application/forms/SettingsForm.php:150 msgid "Deployment mode" msgstr "Ausrollmodus" #: ../../../../application/forms/SettingsForm.php:159 msgid "Deployment mode for Icinga 1 configuration" msgstr "Ausrollmodus für Icinga 1 Konfiguration" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:78 msgid "Deployment time" msgstr "Deployment-Zeit" #: ../../../../configuration.php:146 #: ../../../../library/Director/Web/Tabs/InfraTabs.php:37 #: ../../../../application/controllers/ConfigController.php:58 msgid "Deployments" msgstr "Deployments" #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:87 msgid "Deprecated" msgstr "Abgekündigt" #: ../../../../application/forms/IcingaCommandArgumentForm.php:31 #: ../../../../application/forms/ImportSourceForm.php:24 #: ../../../../application/forms/DirectorDatafieldCategoryForm.php:31 #: ../../../../application/forms/IcingaServiceSetForm.php:103 #: ../../../../application/forms/ImportRowModifierForm.php:52 #: ../../../../application/forms/DirectorDatafieldForm.php:158 #: ../../../../application/forms/SyncRuleForm.php:36 #: ../../../../application/forms/IcingaObjectFieldForm.php:94 #: ../../../../application/forms/IcingaTemplateChoiceForm.php:56 msgid "Description" msgstr "Beschreibung" #: ../../../../application/forms/IcingaCommandArgumentForm.php:32 msgid "Description of the argument" msgstr "Beschreibung des Arguments" #: ../../../../library/Director/Web/Table/SyncpropertyTable.php:63 msgid "Destination" msgstr "Ziel" #: ../../../../application/forms/SyncPropertyForm.php:48 msgid "Destination Field" msgstr "Zielfeld" #: ../../../../application/controllers/HealthController.php:25 msgid "" "Did you know that you can run this entire Health Check (or just some " "sections) as an Icinga Check on a regular base?" msgstr "" "Wussten Sie, dass sich dieser Health-Check (oder auch nur Abschnitte daraus) " "als regelmäßiger Icinga-Check ausführen lässt?" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:367 #: ../../../../application/controllers/ConfigController.php:427 msgid "Diff" msgstr "Diff" #: ../../../../library/Director/Web/Widget/DeployedConfigInfoHeader.php:84 msgid "Diff with other config" msgstr "Mit anderer Konfiguration vergleichen" #: ../../../../library/Director/Web/Table/TemplateUsageTable.php:55 msgid "Direct" msgstr "Direkt" #: ../../../../application/controllers/DaemonController.php:20 #: ../../../../application/controllers/DaemonController.php:22 msgid "Director Background Daemon" msgstr "Director Hintergrunddienst" #: ../../../../application/controllers/HealthController.php:17 msgid "Director Health" msgstr "Director-Health" #: ../../../../application/controllers/KickstartController.php:16 msgid "Director Kickstart Wizard" msgstr "Director Kickstart-Assistent" #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:69 msgid "Director Object" msgstr "Director-Objekt" #: ../../../../library/Director/Dashboard/Dashlet/SettingsDashlet.php:13 msgid "Director Settings" msgstr "Director-Einstellungen" #: ../../../../library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:81 msgid "Director database schema has not been created yet" msgstr "Datenbankschema für Director wurde noch nicht erstellt" #: ../../../../application/forms/SyncRuleForm.php:88 msgid "Disable" msgstr "Deaktivien" #: ../../../../application/forms/IcingaDependencyForm.php:159 msgid "Disable Checks" msgstr "Checks deaktivieren" #: ../../../../application/forms/IcingaDependencyForm.php:167 msgid "Disable Notifications" msgstr "Benachrichtigungen deaktivieren" #: ../../../../application/forms/SettingsForm.php:54 msgid "Disable all Jobs" msgstr "Alle Aufträge deaktivieren" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1299 #: ../../../../application/forms/DirectorJobForm.php:37 msgid "Disabled" msgstr "Deaktiviert" #: ../../../../application/forms/IcingaCommandForm.php:79 msgid "Disabled by default, and should only be used in rare cases." msgstr "" "Standardmäßig deaktiviert, sollte nur in seltenen Fällen benutzt werden." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1300 msgid "Disabled objects will not be deployed" msgstr "Deaktivierte Objekte werden nicht ausgerollt" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1315 #: ../../../../application/forms/IcingaTimePeriodForm.php:20 msgid "Display Name" msgstr "Anzeigename" #: ../../../../application/forms/IcingaUserForm.php:133 #: ../../../../application/forms/IcingaHostForm.php:354 msgid "Display name" msgstr "Anzeigename" #: ../../../../library/Director/Web/Table/CustomvarTable.php:42 msgid "Distinct Commands" msgstr "Unterschiedliche Kommandos" #: ../../../../library/Director/Dashboard/DataDashboard.php:16 msgid "Do more with custom data" msgstr "Mehr mit benutzerdefinierten Daten anfangen" #: ../../../../application/forms/SelfServiceSettingsForm.php:36 msgid "Do not transform at all" msgstr "Überhaupt nicht umwandeln" #: ../../../../library/Director/Web/SelfService.php:164 msgid "Documentation" msgstr "Dokumentation" #: ../../../../application/forms/SelfServiceSettingsForm.php:50 msgid "Don't care, my host settings are fine" msgstr "Keine Sorge, meine Host-Einstellungen sind in Ordnung" #: ../../../../library/Director/IcingaConfig/StateFilterSet.php:21 msgid "Down" msgstr "Down" #: ../../../../library/Director/Web/SelfService.php:236 #: ../../../../library/Director/Web/SelfService.php:249 #: ../../../../application/controllers/SchemaController.php:80 #: ../../../../application/controllers/BasketController.php:238 msgid "Download" msgstr "Download" #: ../../../../application/controllers/ImportsourceController.php:176 msgid "Download JSON" msgstr "JSON herunterladen" #: ../../../../library/Director/Web/Widget/AdditionalTableActions.php:60 msgid "Download as JSON" msgstr "Als JSON herunterladen" #: ../../../../application/forms/SelfServiceSettingsForm.php:83 msgid "Download from a custom url" msgstr "Von einer benutzerdefinierten URL laden" #: ../../../../application/forms/SelfServiceSettingsForm.php:82 msgid "Download from packages.icinga.com" msgstr "Von packages.icinga.com herunterladen" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:30 msgid "Downtime ends" msgstr "Downtime endet" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:21 msgid "Downtime name" msgstr "Downtime-Name" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:31 msgid "Downtime removed" msgstr "Downtime entfernt" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:29 msgid "Downtime starts" msgstr "Downtime startet" #: ../../../../application/forms/IcingaForgetApiKeyForm.php:22 msgid "Drop Self Service API key" msgstr "Selbstbedienungs-API-Schlüssel verwerfen" #: ../../../../library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:30 #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayToRow.php:23 msgid "Drop the current row" msgstr "Die aktuelle Zeile verwerfen" #: ../../../../library/Director/DataType/DataTypeDatalist.php:150 msgid "Dropdown (list values only)" msgstr "Aufklappmenü (nur Listeneinträge)" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:84 #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:29 #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:56 msgid "Duration" msgstr "Dauer" #: ../../../../library/Director/PropertyModifier/PropertyModifierListToObject.php:18 msgid "" "Each Array in the list must contain this property. It's value will be used " "as the key/object property name for the row." msgstr "" "Jedes Array in der Liste enthält diese Eigenschaft. Dessen Wert wird als " "Schlüssel/Objektbezeichner für die Zeile benutzt." #: ../../../../application/controllers/DatafieldcategoryController.php:37 msgid "Edit a Category" msgstr "Kategorie bearbeiten" #: ../../../../application/controllers/DatafieldController.php:31 msgid "Edit a Field" msgstr "Ein Feld bearbeiten" #: ../../../../application/controllers/DataController.php:397 msgid "Edit list" msgstr "Liste bearbeiten" #: ../../../../library/Director/DataType/DataTypeDatalist.php:144 msgid "Element behavior" msgstr "Verhalten des Elements" #: ../../../../application/forms/IcingaUserForm.php:36 msgid "Email" msgstr "E-Mail" #: ../../../../application/forms/SettingsForm.php:69 msgid "Enable audit log" msgstr "Revisionslog aktivieren" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1449 msgid "Enable event handler" msgstr "Eventhandler aktivieren" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1461 msgid "Enable flap detection" msgstr "Flap-Erkennung aktivieren" #: ../../../../application/forms/SettingsForm.php:111 msgid "" "Enabled the feature for custom endpoint names, where you can choose a " "different name for the generated endpoint object. This uses some Icinga " "config snippets and a special custom variable. Please do NOT enable this, " "unless you really need divergent endpoint names!" msgstr "" "Aktiviere das Feature für freie Endpunktnamen. Hiermit lässt sich ein " "anderer Name für das generierte Endpunktobjekt wählen. Hierzu werden " "spezielle Icinga-Konfigurationsschnipsel und eine spezielle " "benutzerdefinierte Variable eingesetzt. Bitte NICHT aktivieren, wenn " "abweichende Endpunktnamen nicht wirklich erforderlich sind!" #: ../../../../library/Director/PropertyModifier/PropertyModifierTrim.php:22 msgid "Ending only" msgstr "Nur das Ende" #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:72 #: ../../../../library/Director/Web/Table/ObjectsTableEndpoint.php:19 #: ../../../../application/forms/IcingaEndpointForm.php:24 #: ../../../../application/forms/SyncRuleForm.php:25 msgid "Endpoint" msgstr "Endpunkt" #: ../../../../application/forms/KickstartForm.php:121 msgid "Endpoint Name" msgstr "Name des Endpunkts" #: ../../../../application/forms/IcingaEndpointForm.php:31 msgid "Endpoint address" msgstr "Adresse des Endpunkts" #: ../../../../library/Director/Web/Widget/InspectPackages.php:46 msgid "Endpoint in your Root Zone" msgstr "Endpunkte in Rootzone" #: ../../../../application/forms/IcingaEndpointForm.php:18 msgid "Endpoint template name" msgstr "Name der Endpunktsvorlage" #: ../../../../library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:18 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:35 #: ../../../../library/Director/Import/ImportSourceCoreApi.php:59 msgid "Endpoints" msgstr "Endpunkte" #: ../../../../application/controllers/PhperrorController.php:15 #: ../../../../application/controllers/PhperrorController.php:34 msgid "Error" msgstr "Fehler" #: ../../../../application/forms/IcingaHostForm.php:88 msgid "Establish connection" msgstr "Verbindung herstellen" #: ../../../../application/forms/IcingaServiceForm.php:631 msgid "" "Evaluates the apply for rule for all objects with the custom attribute " "specified. E.g selecting \"host.vars.custom_attr\" will generate \"for " "(config in host.vars.array_var)\" where \"config\" will be accessible " "through \"$config$\". NOTE: only custom variables of type \"Array\" are " "eligible." msgstr "" "Berechnet die Apply-Regel für alle Objekte für welche diese " "benutzerdefinierte Eigenschaft spezifiziert wurde. Wählt man z.B. \"host." "vars.custom_attr\", wird \"for (config in host.vars.array_var)\" generiert. " "Dabei ist \"config\" dann als \"$config$\" zugänglich. HINWEIS: nur " "benutzerdefinierte Eigenschaften vom Typ \"Array\" sind wählbar." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1353 msgid "Event command" msgstr "Event-Kommando" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1354 msgid "Event command definition" msgstr "Event-Kommandodefinition" #: ../../../../library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:23 msgid "" "Every Dictionary entry has a key, its value will be provided in this column" msgstr "" "Jeder Dictionary-Eintrag hat einen Schlüssel, sein Wert wird in dieser " "Spalte bereitgestellt" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:41 msgid "Every related downtime will show this comment" msgstr "Jede zugehörige Downtime wird diesen Kommentar anzeigen" #: ../../../../application/forms/IcingaTimePeriodForm.php:70 msgid "Exclude other time periods from this." msgstr "Andere Zeiträume von diesem ausschließen." #: ../../../../application/forms/IcingaTimePeriodForm.php:67 msgid "Exclude period" msgstr "Zeitraum ausschließen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1431 msgid "Execute active checks" msgstr "Aktive Checks ausführen" #: ../../../../application/forms/DirectorJobForm.php:48 msgid "Execution interval for this job, in seconds" msgstr "Ausführungsintervall dieses Auftrags, in Sekunden" #: ../../../../application/forms/SyncPropertyForm.php:251 msgid "Existing Data Lists" msgstr "Vorhandene Datenlisten" #: ../../../../application/forms/SyncPropertyForm.php:236 msgid "Existing templates" msgstr "Vorhandene Vorlagen" #: ../../../../application/controllers/BranchController.php:45 msgid "Expected Modification" msgstr "Erwartete Änderungen" #: ../../../../application/forms/SyncPropertyForm.php:179 msgid "Expert mode" msgstr "Expertenmodus" #: ../../../../library/Director/DataType/DataTypeDatalist.php:154 msgid "Extend the list with new values" msgstr "Erweitere die Liste mit neuen Werten" #: ../../../../library/Director/Web/Tabs/ObjectsTabs.php:36 msgid "External" msgstr "Extern" #: ../../../../application/forms/BasketForm.php:18 msgid "External Command Definitions" msgstr "Externe Kommandodefinitionen" #: ../../../../library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:19 msgid "External Commands" msgstr "Externe Kommandos" #: ../../../../library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:12 msgid "" "External Commands have been defined in your local Icinga 2 Configuration." msgstr "" "Externe Kommandos wurden in der lokalen Icinga-2-Konfiguration definiert." #: ../../../../library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:19 msgid "External Notification Commands" msgstr "Externe Benachrichtigungskommandos" #: ../../../../library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:12 #: ../../../../library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:12 msgid "" "External Notification Commands have been defined in your local Icinga 2 " "Configuration." msgstr "" "Externe Benachrichtigungskommandos wurden in der lokalen Icinga-2-" "Konfiguration definiert." #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:83 msgid "External Objects" msgstr "Externe Objekte" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:75 msgid "FQDN" msgstr "FQDN" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:142 msgid "Failed" msgstr "Fehlgeschlagen" #: ../../../../application/forms/IcingaImportObjectForm.php:42 #, php-format msgid "Failed to import %s \"%s\"" msgstr "Import von %s fehlgeschlagen \"%s\"" #: ../../../../application/forms/SettingsForm.php:109 msgid "Feature: Custom Endpoint Name" msgstr "Feature: Individueller Endpunktname" #: ../../../../application/forms/IcingaObjectFieldForm.php:145 msgid "Field has been removed" msgstr "Feld wurde entfernt" #: ../../../../library/Director/Web/Table/IcingaObjectDatafieldTable.php:50 #: ../../../../library/Director/Web/Table/DatafieldTable.php:52 #: ../../../../application/forms/DirectorDatafieldForm.php:141 msgid "Field name" msgstr "Feldname" #: ../../../../application/forms/DirectorDatafieldForm.php:181 msgid "Field type" msgstr "Feldtyp" #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:100 msgid "Fields" msgstr "Felder" #: ../../../../library/Director/Web/Table/GeneratedConfigFileTable.php:84 #: ../../../../library/Director/Web/Table/ConfigFileDiffTable.php:82 msgid "File" msgstr "Datei" #: ../../../../library/Director/Web/Widget/InspectPackages.php:54 #, php-format msgid "File Content: %s" msgstr "Dateiinhalt: %s" #: ../../../../library/Director/Web/Widget/InspectPackages.php:52 #, php-format msgid "Files in Stage: %s" msgstr "Dateien im Stage: %s" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:44 #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:54 msgid "Filter" msgstr "Filter" #: ../../../../application/forms/ImportRowModifierForm.php:89 #: ../../../../application/forms/SyncPropertyForm.php:103 #: ../../../../application/forms/SyncRuleForm.php:95 msgid "Filter Expression" msgstr "Filterausdruck" #: ../../../../configuration.php:57 msgid "Filter available notification apply rules" msgstr "Verfügbare Benachrichtigungs-Apply-Regeln filtern" #: ../../../../configuration.php:60 msgid "Filter available scheduled downtime rules" msgstr "Verfügbare Geplante-Downtime-Regeln filtern" #: ../../../../configuration.php:63 msgid "Filter available service apply rules" msgstr "Verfügbare Service-Apply-Regeln filtern" #: ../../../../configuration.php:66 msgid "" "Filter available service set templates. Use asterisks (*) as wildcards, like " "in DB* or *net*" msgstr "" "Verfügbare Service-Set-Vorlagen filtern. Benutze Sternchen (*) als " "Platzhalter, wie in DB* oder *net*" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:29 #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:27 msgid "Filter method" msgstr "Filter-Methode" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:33 msgid "First Element" msgstr "Erstes Element" #: ../../../../application/forms/IcingaNotificationForm.php:245 msgid "First notification delay" msgstr "Verzögerung der ersten Benachrichtigung" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:47 msgid "Fixed" msgstr "Fix" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:33 msgid "Flapping" msgstr "Flapping" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:35 msgid "Flapping ends" msgstr "Flapping endet" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1482 msgid "" "Flapping lower bound in percent for a service to be considered not flapping" msgstr "" "Untere Flapping-Grenze in Prozent um einen Service nicht als Flapping " "einzuordnen" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:34 msgid "Flapping starts" msgstr "Flapping beginnt" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1469 msgid "Flapping threshold (high)" msgstr "Flapping Schwellewert (hoch)" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1480 msgid "Flapping threshold (low)" msgstr "Flapping Schwellwert (niedrig)" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1471 msgid "Flapping upper bound in percent for a service to be considered flapping" msgstr "" "Obere Flapping-Grenze in Prozent um einen Service als Flapping einzuordnen" #: ../../../../application/forms/IcingaCloneObjectForm.php:52 msgid "Flatten all inherited properties, strip imports" msgstr "Alle vererbten Eigenschaften flach machen, Importierte entfernen" #: ../../../../application/forms/SelfServiceSettingsForm.php:100 msgid "Flush API directory" msgstr "API-Verzeichnis leeren" #: ../../../../library/Director/Web/SelfService.php:232 msgid "For manual configuration" msgstr "Manuelle Konfiguration" #: ../../../../library/Director/Job/ConfigJob.php:31 msgid "Force rendering" msgstr "Erstellen erzwingen" #: ../../../../library/Director/Objects/DirectorDatafield.php:204 #, php-format msgid "Form element could not be created, %s is missing" msgstr "Formularelement konnte nicht erstellt werden, %s ist nicht vorhanden" #: ../../../../library/Director/Web/Form/QuickForm.php:524 #: ../../../../library/Director/Web/Form/QuickForm.php:551 msgid "Form has successfully been sent" msgstr "Formular wurde erfolgreich abgeschickt" #: ../../../../application/forms/IcingaServiceVarForm.php:32 #: ../../../../application/forms/IcingaHostVarForm.php:32 msgid "Format" msgstr "Format" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:393 msgid "Former object" msgstr "Vorheriges Objekt" #: ../../../../application/forms/SelfServiceSettingsForm.php:24 msgid "Fully qualified domain name (FQDN)" msgstr "Voll qualifizierter Domain-Name (FQDN)" #: ../../../../application/forms/IcingaGenerateApiKeyForm.php:24 msgid "Generate Self Service API key" msgstr "Selbstservice-API-Schlüssel generieren" #: ../../../../library/Director/Web/SelfService.php:114 msgid "Generate a new key" msgstr "Neuen Schlüssel generieren" #: ../../../../library/Director/Web/SelfService.php:132 msgid "" "Generated Host keys will continue to work, but you'll no longer be able to " "register new Hosts with this key" msgstr "" "Generierte Host-Schlüssel werden weiterhin funktionieren, aber es wird nicht " "mehr möglich sein neue Hosts mit diesem Schlüssel zu registrieren" #: ../../../../application/controllers/ConfigController.php:282 msgid "Generated config" msgstr "Erzeugte Konfiguration" #: ../../../../library/Director/Dashboard/AlertsDashboard.php:17 msgid "Get alerts when something goes wrong" msgstr "Werde alarmiert, wenn etwas schief läuft" #: ../../../../library/Director/Dashboard/Dashlet/CustomvarDashlet.php:19 msgid "Get an overview of used CustomVars and their variants" msgstr "Eine Übersicht über benutzerdefinierte Variablen und deren Varianten" #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:27 msgid "Get host by address (Reverse DNS lookup)" msgstr "Host über Adresse ermitteln (Reverse DNS Lookup)" #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByName.php:27 msgid "Get host by name (DNS lookup)" msgstr "Adresse für Hostname ermitteln (DNS Lookup)" #: ../../../../application/controllers/ConfigController.php:242 msgid "Global Director Settings" msgstr "Globale Director-Einstellungen" #: ../../../../library/Director/Web/SelfService.php:101 msgid "Global Self Service Setting" msgstr "Globale Selbstbedienungs-Einstellungen" #: ../../../../application/forms/SelfServiceSettingsForm.php:57 msgid "Global Zones" msgstr "Globale Zonen" #: ../../../../application/forms/IcingaZoneForm.php:22 msgid "Global zone" msgstr "Globale Zone" #: ../../../../library/Director/PropertyModifier/PropertyModifierJoin.php:13 msgid "Glue" msgstr "Kleben" #: ../../../../library/Director/Web/ActionBar/DirectorBaseActionBar.php:40 #, php-format msgid "Go back to \"%s\" Dashboard" msgstr "Zurück zum \"%s\" Dashboard" #: ../../../../library/Director/Job/ConfigJob.php:57 msgid "Grace period" msgstr "Gnadenfrist" #: ../../../../library/Director/Web/Table/GroupMemberTable.php:72 msgid "Group" msgstr "Gruppe" #: ../../../../library/Director/PropertyModifier/PropertyModifierSimpleGroupBy.php:14 msgid "Group by a column, aggregate others" msgstr "Gruppiere nach einer Spalte, aggregiere andere" #: ../../../../application/forms/IcingaHostForm.php:250 msgid "" "Group has been inherited, but will be overridden by locally assigned group(s)" msgstr "" "Die Gruppe wurde geerbt, wird aber von lokal gesetzten Gruppen überschrieben" #: ../../../../application/forms/SyncPropertyForm.php:318 msgid "Group membership" msgstr "Gruppenmitgliedschaft" #: ../../../../library/Director/Web/Controller/ObjectController.php:332 #, php-format msgid "Group membership: %s" msgstr "Gruppenmitgliedschaft: %s" #: ../../../../library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:19 msgid "" "Grouping your Services into Sets allow you to quickly assign services often " "used together in a single operation all at once" msgstr "" "Das Bündel von Services in Sets erlaubt es, Services welche häufig gemeinsam " "benutzt werden in einem Einzelschritt zuzuweisen" #: ../../../../library/Director/Web/Tabs/ObjectsTabs.php:67 #: ../../../../application/forms/IcingaUserForm.php:109 #: ../../../../application/forms/IcingaServiceForm.php:653 #: ../../../../application/forms/IcingaHostForm.php:219 msgid "Groups" msgstr "Gruppen" #: ../../../../library/Director/Import/ImportSourceRestApi.php:134 msgid "HTTP (this is plaintext!)" msgstr "HTTP (das ist Klartext)" #: ../../../../library/Director/Import/ImportSourceRestApi.php:149 msgid "HTTP Header" msgstr "HTTP-Header" #: ../../../../library/Director/Import/ImportSourceRestApi.php:250 msgid "HTTP proxy" msgstr "HTTP-Proxy" #: ../../../../library/Director/Import/ImportSourceRestApi.php:133 msgid "HTTPS (strongly recommended)" msgstr "HTTPS (dringend empfohlen)" #: ../../../../library/Director/Web/Tabs/MainTabs.php:32 msgid "Health" msgstr "Health" #: ../../../../library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:19 msgid "Here you can find all single services directly attached to single hosts" msgstr "" "Hier finden sich alle Einzel-Services welche einzelnen Hosts zugewiesen " "wurden" #: ../../../../library/Director/DataType/DataTypeString.php:27 #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:89 msgid "Hidden" msgstr "Versteckt" #: ../../../../library/Director/Web/Widget/AdditionalTableActions.php:71 msgid "Hide SQL" msgstr "SQL verbergeb" #: ../../../../application/controllers/HealthController.php:23 msgid "Hint: Check Plugin" msgstr "Hinweis: Check-Plugin" #: ../../../../application/forms/IcingaServiceForm.php:168 msgid "Hints regarding this service" msgstr "Hinweise zu diesem Service" #: ../../../../library/Director/Web/Tabs/ImportsourceTabs.php:45 #: ../../../../library/Director/Web/Tabs/SyncRuleTabs.php:43 #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:92 msgid "History" msgstr "Historie" #: ../../../../library/Director/TranslationDummy.php:13 #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:71 #: ../../../../library/Director/Web/Table/ObjectsTableService.php:106 #: ../../../../library/Director/Web/Table/ObjectsTableEndpoint.php:20 #: ../../../../application/forms/IcingaHostVarForm.php:15 #: ../../../../application/forms/IcingaServiceForm.php:601 #: ../../../../application/forms/SyncRuleForm.php:12 #: ../../../../application/controllers/ServiceController.php:280 msgid "Host" msgstr "Host" #: ../../../../library/Director/Objects/IcingaService.php:682 #: ../../../../application/controllers/SuggestController.php:262 msgid "Host Custom variables" msgstr "Benutzerdefinierte Host-Variablen" #: ../../../../application/forms/BasketForm.php:20 #: ../../../../application/forms/SyncRuleForm.php:13 msgid "Host Group" msgstr "Hostgruppe" #: ../../../../library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:13 msgid "Host Groups" msgstr "Hostgruppen" #: ../../../../application/forms/SelfServiceSettingsForm.php:19 msgid "Host Name" msgstr "Hostname" #: ../../../../application/forms/IcingaHostForm.php:171 #: ../../../../application/forms/IcingaHostForm.php:188 msgid "Host Template" msgstr "Host-Vorlage" #: ../../../../application/forms/BasketForm.php:21 msgid "Host Template Choice" msgstr "Auswahlmöglichkeit für Hostvorlagen" #: ../../../../library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:13 #: ../../../../application/forms/BasketForm.php:22 msgid "Host Templates" msgstr "Host-Vorlagen" #: ../../../../application/forms/IcingaHostSelfServiceForm.php:35 #: ../../../../application/forms/IcingaHostForm.php:329 msgid "Host address" msgstr "Hostadresse" #: ../../../../application/forms/IcingaHostSelfServiceForm.php:37 #: ../../../../application/forms/IcingaHostForm.php:331 msgid "" "Host address. Usually an IPv4 address, but may be any kind of address your " "check plugin is able to deal with" msgstr "" "Hostadresse. Üblicherweise eine IPv4 Adresse, kann jedoch jede Art von " "Adresse sein, mit der das Plugin umgehen kann" #: ../../../../configuration.php:70 msgid "Host configs" msgstr "Host-Konfigurationen" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:57 msgid "Host groups" msgstr "Hostgruppen" #: ../../../../application/forms/IcingaHostSelfServiceForm.php:25 msgid "Host name" msgstr "Hostname" #: ../../../../application/forms/SelfServiceSettingsForm.php:25 msgid "Host name (local part, without domain)" msgstr "Hostname (lokaler Teil, ohne Domain)" #: ../../../../library/Director/Dashboard/Dashlet/HostObjectDashlet.php:15 msgid "Host objects" msgstr "Hostobjekte" #: ../../../../library/Director/Objects/IcingaHost.php:162 #: ../../../../library/Director/Objects/IcingaService.php:681 #: ../../../../application/controllers/SuggestController.php:252 #: ../../../../application/controllers/SuggestController.php:261 msgid "Host properties" msgstr "Hosteigenschaften" #: ../../../../application/controllers/TemplatechoiceController.php:20 msgid "Host template choice" msgstr "Auswahlmöglichkeit für Hostvorlagen" #: ../../../../application/controllers/TemplatechoicesController.php:19 msgid "Host template choices" msgstr "Auswahlmöglichkeiten für Hostvorlagen" #: ../../../../application/forms/IcingaHostGroupForm.php:14 msgid "Hostgroup" msgstr "Hostgruppe" #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:39 #: ../../../../library/Director/Import/ImportSourceCoreApi.php:61 msgid "Hostgroups" msgstr "Hostgruppen" #: ../../../../application/forms/IcingaHostForm.php:222 msgid "" "Hostgroups that should be directly assigned to this node. Hostgroups can be " "useful for various reasons. You might assign service checks based on " "assigned hostgroup. They are also often used as an instrument to enforce " "restricted views in Icinga Web 2. Hostgroups can be directly assigned to " "single hosts or to host templates. You might also want to consider assigning " "hostgroups using apply rules" msgstr "" "Hostgruppen, die diesem Knoten direkt zugeordnet werden sollen. Hostgruppen " "für verschiedene Zwecke verwendet werden. Services können anhand von " "Hostgruppen zugeordnet werden. Außerdem werden sie oft zum Umsetzen von " "eingeschränkten Ansichten in Icinga Web 2 verwendet. Hostgruppen können " "direkt einzelnen Hosts oder Hostvorlagen zugeordnet werden. Auch über Apply " "Regeln können Hostgruppen zugewiesen werden" #: ../../../../library/Director/Web/Table/IcingaServiceSetHostTable.php:38 #: ../../../../library/Director/Web/Table/IcingaHostsMatchingFilterTable.php:48 #: ../../../../application/forms/IcingaHostForm.php:41 msgid "Hostname" msgstr "Hostname" #: ../../../../library/Director/Import/ImportSourceRestApi.php:262 msgid "Hostname, IP or :" msgstr "Hostname, IP oder :" #: ../../../../configuration.php:121 #: ../../../../library/Director/Dashboard/Dashlet/HostsDashlet.php:13 #: ../../../../library/Director/IcingaConfig/StateFilterSet.php:19 #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:56 #: ../../../../library/Director/DataType/DataTypeDictionary.php:59 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:38 #: ../../../../library/Director/Import/ImportSourceCoreApi.php:60 #: ../../../../library/Director/Web/Table/CustomvarVariantsTable.php:58 #: ../../../../library/Director/Web/Table/CustomvarTable.php:43 #: ../../../../application/forms/IcingaNotificationForm.php:90 #: ../../../../application/forms/IcingaServiceForm.php:715 #: ../../../../application/forms/IcingaDependencyForm.php:100 #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:89 msgid "Hosts" msgstr "Hosts" #: ../../../../application/controllers/ServicesetController.php:85 #, php-format msgid "Hosts using this set: %s" msgstr "Hosts welche dieses Set benutzen: %s" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:58 msgid "" "How long the downtime lasts. Only has an effect for flexible (non-fixed) " "downtimes. Time in seconds, supported suffixes include ms (milliseconds), s " "(seconds), m (minutes), h (hours) and d (days). To express \"90 minutes\" " "you might want to write 1h 30m" msgstr "" "Wie lang die Downtime dauert. Beeinflusst nur flexible (keine fixen) " "Downtimes. Zeit in Sekunden, unterstützt auch die Suffixes ms " "(Millisekunden), s (Sekunden), m (Minuten), h (Stunden) and d (Tage). Um " "\"90 Minuten\" auszudrücken könnte man 1h 30m schreiben" #: ../../../../application/forms/DeployFormsBug7530.php:114 msgid "I know what I'm doing, deploy anyway" msgstr "Ich weiß was ich tue, bitte dennoch ausrollen" #: ../../../../application/forms/DeployFormsBug7530.php:115 msgid "I know, please don't bother me again" msgstr "Ich weiß, und möchte damit nicht mehr belästigt werden" #: ../../../../application/forms/IcingaEndpointForm.php:32 msgid "IP address / hostname of remote node" msgstr "IP Adresse / Hostname des entfernten Knoten" #: ../../../../application/forms/KickstartForm.php:133 msgid "" "IP address / hostname of your Icinga node. Please note that this information " "will only be used for the very first connection to your Icinga instance. The " "Director then relies on a correctly configured Endpoint object. Correctly " "configures means that either it's name is resolvable or that it's host " "property contains either an IP address or a resolvable host name. Your " "Director must be able to reach this endpoint" msgstr "" "IP Adresse / Hostname des Icinga Knotens. Diese Information wird nur für den " "ersten Verbindungsaufbau zur Icinga Instanz verwendet. Danach verlässt sich " "der Director auf ein richtig konfiguriertes Endpunkt-Objekt. \"Richtig " "konfiguriert\" bedeutet dabei, dass entweder der Name auflösbar ist oder die " "host-Eigenschaft entweder eine IP Adresse oder einen auflösbaren Hostname " "enthält. Der Director muss diesen Endpunkt erreichen können" #: ../../../../application/forms/IcingaHostSelfServiceForm.php:43 #: ../../../../application/forms/IcingaHostForm.php:337 msgid "IPv6 address" msgstr "IPv6 Adresse" #: ../../../../library/Director/Web/Controller/ObjectsController.php:350 #, php-format msgid "Icinga %s Sets" msgstr "Icinga %s-Sets" #: ../../../../application/controllers/InspectController.php:38 #, php-format msgid "Icinga 2 - Objects: %s" msgstr "Icinga-2-Objekte: %s" #: ../../../../application/controllers/InspectController.php:144 msgid "Icinga 2 API - Status" msgstr "Icinga 2 API - Status" #: ../../../../library/Director/Web/SelfService.php:203 msgid "Icinga 2 Client documentation" msgstr "Icinga 2 Client-Dokumentation" #: ../../../../application/forms/IcingaServiceForm.php:701 #: ../../../../application/forms/IcingaHostForm.php:149 msgid "Icinga Agent and zone settings" msgstr "Icinga Agenten- und Zoneneinstellungen" #: ../../../../library/Director/Dashboard/Dashlet/ApiUserObjectDashlet.php:15 msgid "Icinga Api users" msgstr "Icinga API Benutzer" #: ../../../../application/forms/IcingaCommandArgumentForm.php:39 #: ../../../../application/forms/IcingaCommandArgumentForm.php:78 msgid "Icinga DSL" msgstr "Icinga-DSL" #: ../../../../configuration.php:89 msgid "Icinga Director" msgstr "Icinga-Director" #: ../../../../application/controllers/DashboardController.php:45 msgid "Icinga Director - Main Dashboard" msgstr "Icinga Director - Übersichtsdashboard" #: ../../../../application/controllers/DaemonController.php:46 msgid "Icinga Director Background Daemon" msgstr "Icinga Director Hintergrunddienst" #: ../../../../library/Director/Dashboard/DirectorDashboard.php:15 msgid "Icinga Director Configuration" msgstr "Icinga Director Konfiguration" #: ../../../../application/controllers/IndexController.php:45 #: ../../../../application/controllers/IndexController.php:52 #, php-format msgid "Icinga Director Setup: %s" msgstr "Icinga Director Setup: %s" #: ../../../../application/forms/SettingsForm.php:35 msgid "" "Icinga Director decides to deploy objects like CheckCommands to a global " "zone. This defaults to \"director-global\" but might be adjusted to a custom " "Zone name" msgstr "" "Icinga Director bevorzugt es, Objekte wie CheckCommands in eine globale Zone " "auszubringen. Der Standard dafür ist \"director-global\", es kann aber auch " "eine benutzerdefinierte Zone verwendet werden" #: ../../../../application/controllers/PhperrorController.php:40 msgid "" "Icinga Director depends on the following modules, please install/upgrade as " "required" msgstr "" "Der Icinga Director benötigt folgende Module, bitte wie angegeben " "installieren und/oder aktualisieren" #: ../../../../library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:19 msgid "" "Icinga Director offers a Self Service API, allowing new Icinga nodes to " "register themselves" msgstr "" "Der Icinga Director stellt eine Selbstbedienungs-API bereit, über welche " "sich neue Icinga-Knoten selbst registrieren können" #: ../../../../application/forms/KickstartForm.php:131 msgid "Icinga Host" msgstr "Icinga-Host" #: ../../../../library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:13 msgid "Icinga Infrastructure" msgstr "Icinga-Infrastruktur" #: ../../../../application/forms/SettingsForm.php:43 msgid "Icinga Package Name" msgstr "Icinga Package Name" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1167 msgid "" "Icinga cluster zone. Allows to manually override Directors decisions of " "where to deploy your config to. You should consider not doing so unless you " "gained deep understanding of how an Icinga Cluster stack works" msgstr "" "Icinga-Cluster-Zone. Erlaubt ein manuelles Überschreiben der Entscheidung, " "wohin der Director die Konfiguration ausrollt. Sollte nicht ohne " "ausreichendes Wissen um den Icinga-Cluster-Stack verändert werden" #: ../../../../library/Director/Web/SelfService.php:145 #: ../../../../library/Director/Web/SelfService.php:151 msgid "Icinga for Windows" msgstr "Icinga für Windows" #: ../../../../application/forms/IcingaHostGroupForm.php:16 msgid "Icinga object name for this host group" msgstr "Icinga-Objektname für diese Hostgruppe" #: ../../../../application/forms/IcingaHostForm.php:48 msgid "" "Icinga object name for this host. This is usually a fully qualified host " "name but it could basically be any kind of string. To make things easier for " "your users we strongly suggest to use meaningful names for templates. E.g. " "\"generic-host\" is ugly, \"Standard Linux Server\" is easier to understand" msgstr "" "Icinga-Objektname für diesen Host. Dies ist üblicherweise ein FQDN, kann " "jedoch jede beliebige Zeichenkette sein. Der Einfachheit halber sollten " "sprechende Namen für Vorlagen verwendet werden. z.B. ist \"Standard Linux " "Server\" leichter verständlich als \"generic-host\"" #: ../../../../application/forms/IcingaServiceGroupForm.php:16 msgid "Icinga object name for this service group" msgstr "Icinga-Objektname für diese Servicegruppe" #: ../../../../application/forms/IcingaUserGroupForm.php:19 msgid "Icinga object name for this user group" msgstr "Icinga-Objektname für diese Benutzergruppe" #: ../../../../application/forms/SettingsForm.php:126 msgid "Icinga v1.x" msgstr "Icinga v1.x" #: ../../../../application/forms/SettingsForm.php:100 msgid "" "Icinga v2.11.0 breaks some configurations, the Director will warn you before " "every deployment in case your config is affected. This setting allows to " "hide this warning." msgstr "" "Mit Icinga v2.11.0 schlagen bestimmte Konfigurationen fehl, der Director " "warnt vor jedem Deployment falls die auszurollende Konfiguration betroffen " "ist. Diese Einstellung erlaubt es diese Warnung zu verbergen." #: ../../../../application/forms/SettingsForm.php:125 msgid "Icinga v2.x" msgstr "Icinga v2.x" #: ../../../../application/forms/IcingaHostForm.php:79 msgid "Icinga2 Agent" msgstr "Icinga-2-Agent" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1559 msgid "Icon image" msgstr "Icon Bild" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1568 msgid "Icon image alt" msgstr "Icon Bild alternativ" #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:81 msgid "Id" msgstr "ID" #: ../../../../application/forms/IcingaCommandForm.php:52 msgid "Identifier for the Icinga command you are going to create" msgstr "Bezeichner für das Icinga-Kommando, das erstellt werden soll" #: ../../../../application/forms/IcingaNotificationForm.php:181 msgid "" "If defined, User Groups from this Custom Variable will be combined with " "single Groups chosen below. e.g.: when set to notification_groups, this " "notification will pick User Groups from the Array service.vars." "notification_groups and fall back to host.vars.notification_groups, in case " "the former one does not exist. Only Array type DirectorObject Fields for " "User objects are eligible for this feature." msgstr "" "Wenn diese benutzerdefinierte Variable vorhanden ist, werden Benutzergruppen " "aus selbiger mit nachfolgend ausgewählten Einzelgruppen kombiniert. " "Beispiel: wird hier notification_groups gewählt, wird diese Benachrichtigung " "Benutzergruppen aus dem Array service. vars.notification_groups verwenden, " "und auf host.vars.notification_groups zurückfallen, falls ersteres nicht " "existiert. Lediglich Felder vom Array-Typ DirectorObject sind für dieses " "Feature auswählbar." #: ../../../../application/forms/IcingaNotificationForm.php:144 msgid "" "If defined, Users from this Custom Variable will be combined with single " "users chosen below. e.g.: when set to notification_contacts, this " "notification will pick Users from the Array service.vars." "notification_contacts and fall back to host.vars.notification_contacts, in " "case the former one does not exist. Only Array type DirectorObject Fields " "for User objects are eligible for this feature." msgstr "" "Wenn diese benutzerdefinierte Variable vorhanden ist, werden Benutzer aus " "selbiger mit nachfolgend ausgewählten Einzelbenutzern kombiniert. Beispiel: " "wird hier notification_contacts gewählt, wird diese Benachrichtigung " "Benutzergruppen aus dem Array service. vars.notification_contacts verwenden, " "und auf host.vars.notification_contacts zurückfallen, falls ersteres nicht " "existiert. Lediglich Felder vom Array-Typ DirectorObject sind für dieses " "Feature auswählbar." #: ../../../../application/forms/IcingaCommandForm.php:78 msgid "If enabled you can not define arguments." msgstr "Wenn aktiviert können keine Argumente definiert werden." #: ../../../../application/forms/BasketForm.php:55 #: ../../../../application/forms/SyncRuleForm.php:64 msgid "Ignore" msgstr "Ignorieren" #: ../../../../application/forms/SettingsForm.php:91 msgid "Ignore Bug #7530" msgstr "Bug #7530 ignorieren" #: ../../../../application/forms/IcingaDependencyForm.php:175 msgid "Ignore Soft States" msgstr "Soft-States ignorieren" #: ../../../../library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:33 msgid "Import Source" msgstr "Importquelle" #: ../../../../application/forms/BasketForm.php:35 msgid "Import Sources" msgstr "Importquellen" #: ../../../../library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:15 msgid "Import data sources" msgstr "Import-Datenquellen" #: ../../../../application/forms/IcingaImportObjectForm.php:26 #, php-format msgid "Import external \"%s\"" msgstr "Externe \"%s\" importieren" #: ../../../../application/controllers/ImportrunController.php:14 #: ../../../../application/controllers/ImportrunController.php:15 msgid "Import run" msgstr "Importlauf" #: ../../../../application/controllers/ImportsourceController.php:266 #, php-format msgid "Import run history: %s" msgstr "Importlaufhistorie: %s" #: ../../../../library/Director/Job/ImportJob.php:80 #: ../../../../library/Director/Web/Tabs/ImportsourceTabs.php:37 #: ../../../../library/Director/Web/Tabs/ImportTabs.php:20 #: ../../../../application/controllers/ImportsourcesController.php:32 msgid "Import source" msgstr "Importquelle" #: ../../../../application/forms/ImportSourceForm.php:15 msgid "Import source name" msgstr "Name der Importquelle" #: ../../../../application/controllers/ImportsourceController.php:170 #, php-format msgid "Import source preview: %s" msgstr "Vorschau der Importquelle: %s" #: ../../../../application/controllers/ImportsourceController.php:92 #: ../../../../application/controllers/ImportsourceController.php:135 #, php-format msgid "Import source: %s" msgstr "Importquelle: %s" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1273 msgid "" "Importable templates, add as many as you want. Please note that order " "matters when importing properties from multiple templates: last one wins" msgstr "" "Importierbare Vorlagen. Es können beliebig viele erstellt werden, wobei die " "Reihenfolge wichtig ist, wenn Eigenschaften von mehreren Vorlagen geerbt " "werden: Der letzte Eintrag gewinnt" #: ../../../../application/forms/ImportRunForm.php:33 msgid "Imported new data from this Import Source" msgstr "Neue Daten von dieser Import-Datenquelle importiert" #: ../../../../library/Director/Web/Table/ImportrunTable.php:32 msgid "Imported rows" msgstr "Importierte Reihen" #: ../../../../application/forms/IcingaImportObjectForm.php:16 msgid "" "Importing an object means that its type will change from \"external\" to " "\"object\". That way it will make part of the next deployment. So in case " "you imported this object from your Icinga node make sure to remove it from " "your local configuration before issueing the next deployment. In case of a " "conflict nothing bad will happen, just your config won't deploy." msgstr "" "Ein Objekt zu importieren bedeutet, dass es von einem \"externen Objekt\" zu " "einem \"Objekt\" verändert wird. Damit wird es mit der nächsten " "Konfiguration ausgerollt. Falls dieses Objekt aus dem Icinga Knoten " "importiert wurde, muss es aus vor dem nächsten Ausrollen aus der lokalen " "Konfiguration entfernt werden. Sollte ein Konflikt auftreten, geschieht " "nichts weiter, als dass die Konfiguration nicht ausgerollt werden kann." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1271 msgid "Imports" msgstr "Importe" #: ../../../../application/controllers/SelfServiceController.php:110 msgid "" "In case an Icinga Admin provided you with a self service API token, this is " "where you can register new hosts" msgstr "" "Wenn ein Icinga-Administrator einen Selbstbedienungs-API-" "Schlüsselbereitstellt, können hier neue Hosts registriert werden" #: ../../../../application/forms/SelfServiceSettingsForm.php:189 msgid "" "In case the Icinga 2 Agent is already installed on the system, this " "parameter will allow you to configure if you wish to upgrade / downgrade to " "a specified version with the as well." msgstr "" "Wenn der Icinga-2-Agent bereits auf dem System installiert ist, erlaubt es " "dieser Parameter festzulegen, ob auch Up- und Downgrades zu der spezifierten " "Icinga 2 Version gewünscht sind." #: ../../../../application/forms/SelfServiceSettingsForm.php:156 msgid "" "In case the Icinga 2 Agent should be automatically installed, this has to be " "a string value like: 2.6.3" msgstr "" "Falls der Icinga-2-Agent automatisch installiert werden soll, muss dies in " "String der Form 2.6.3 sein" #: ../../../../application/forms/SelfServiceSettingsForm.php:102 msgid "" "In case the Icinga Agent will accept configuration from the parent Icinga 2 " "system, it will possibly write data to /var/lib/icinga2/api/*. By setting " "this parameter to true, all content inside the api directory will be flushed " "before an eventual restart of the Icinga 2 Agent" msgstr "" "Wenn der Icinga-Agent Konfiguration von seinem übergeordneten Icinga-2-" "System akzeptiert, wird er für gewöhnlich Daten nach /var/lib/icinga2/api/* " "schreiben. Wird dieser Schalter auf Ja gesetzt, wird jeglicher Inhalt dieses " "Verzeichnisses vor einem eventuellen Restart des Icinga-2-Agenten geleert" #: ../../../../library/Director/Web/SelfService.php:147 #, php-format msgid "In case you're using %s, please run this Script:" msgstr "Falls %s benutzt wird, bitte dieses Script ausführen:" #: ../../../../library/Director/Import/ImportSourceRestApi.php:246 msgid "" "In case your API is only reachable through a proxy, please choose it's " "protocol right here" msgstr "" "Wenn die API nur über einen Proxy zugänglich ist, bitte hier dessen " "Protokoll auswählen" #: ../../../../library/Director/Import/ImportSourceRestApi.php:270 msgid "In case your proxy requires authentication, please configure this here" msgstr "" "Falls der Proxy eine Authentifizierung verlangt, kann diese hier " "konfiguriert werden" #: ../../../../application/forms/IcingaTimePeriodForm.php:62 msgid "Include other time periods into this." msgstr "Andere Zeiträume in diesen einbinden." #: ../../../../application/forms/IcingaTimePeriodForm.php:59 msgid "Include period" msgstr "Zeitraum einbinden" #: ../../../../library/Director/Web/Table/TemplateUsageTable.php:56 msgid "Indirect" msgstr "Indirekt" #: ../../../../application/controllers/HostController.php:198 #: ../../../../application/controllers/HostController.php:282 msgid "Individual Service objects" msgstr "Individuelle Service-Objekte" #: ../../../../library/Director/Web/Tabs/InfraTabs.php:44 msgid "Infrastructure" msgstr "Infrastruktur" #: ../../../../application/forms/SyncPropertyForm.php:312 msgid "Inheritance (import)" msgstr "Vererbung (Import)" #: ../../../../library/Director/Web/SelfService.php:182 msgid "Inherited Template Api Key:" msgstr "Vom Template geerbter API-Schlüssel:" #: ../../../../application/controllers/HostController.php:219 #, php-format msgid "Inherited from %s" msgstr "Geerbt von %s" #: ../../../../application/forms/IcingaHostForm.php:258 msgid "Inherited groups" msgstr "Geerbte Gruppen" #: ../../../../application/controllers/HostController.php:446 #, php-format msgid "Inherited service: %s" msgstr "Geerbter Service: %s" #: ../../../../library/Director/ProvidedHook/Monitoring/HostActions.php:37 #: ../../../../library/Director/ProvidedHook/Monitoring/ServiceActions.php:44 #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:129 #: ../../../../application/controllers/HostController.php:592 msgid "Inspect" msgstr "Inspizieren" #: ../../../../application/controllers/InspectController.php:63 msgid "Inspect - object list" msgstr "Inspizieren - Objektliste" #: ../../../../application/controllers/InspectController.php:170 msgid "Inspect File Content" msgstr "Dateiinhalt inspizieren" #: ../../../../application/controllers/InspectController.php:168 msgid "Inspect Packages" msgstr "Pakete Inspizieren" #: ../../../../application/forms/SelfServiceSettingsForm.php:202 msgid "Install NSClient++" msgstr "NSClient++ installieren" #: ../../../../application/forms/SelfServiceSettingsForm.php:72 msgid "Installation Source" msgstr "Installationsquelle" #: ../../../../library/Director/Web/Table/Dependency/DependencyInfoTable.php:39 msgid "Installed" msgstr "Installiert" #: ../../../../application/forms/SelfServiceSettingsForm.php:165 msgid "Installer Hashes" msgstr "Prüfsummen für den Installer" #: ../../../../application/forms/IcingaCommandForm.php:25 msgid "Internal commands" msgstr "Interne Kommandos" #: ../../../../application/controllers/SyncruleController.php:140 #, php-format msgid "It has been renamed since then, its former name was %s" msgstr "Es wurde seither umbenannt. Sein bisheriger Name war %s" #: ../../../../library/Director/Web/SelfService.php:72 msgid "" "It is not a good idea to do so as long as your Agent still has a valid Self " "Service API key!" msgstr "" "Dies ist keine gute Idee solange der Agent noch über einen gültigen " "Selbstbedienungs-API-Schlüssel verfügt!" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:87 msgid "" "It will not be allowed to choose more than this many options. Setting it to " "one (1) will result in a drop-down box, a higher number will turn this into " "a multi-selection element." msgstr "" "Es wird nicht erlaubt, mehr Optionen zu wählen als durch diese Einstellung " "vorgegeben wird. Setzt man sie auf Eins (1) erhält man ein Dropdown-Feld, " "eine höhere Nummer verwandelt diese in ein Mehrfach-Auswahlfeld." #: ../../../../library/Director/Web/Widget/ImportSourceDetails.php:35 msgid "" "It's currently unknown whether we are in sync with this Import Source. You " "should either check for changes or trigger a new Import Run." msgstr "" "Aktuell ist unbekannt ob die Konfiguration mit dieser Importquelle synchron " "ist. Es sollte auf Änderungen geprüft oder ein neuer Importlauf angestoßen " "werden." #: ../../../../application/controllers/SyncruleController.php:91 msgid "" "It's currently unknown whether we are in sync with this rule. You should " "either check for changes or trigger a new Sync Run." msgstr "" "Aktuell ist unbekannt, ob die Konfiguration mit dieser Regel synchron ist. " "Es sollte auf Änderungen geprüft oder ein neuer Importlauf angestoßen werden." #: ../../../../application/forms/BasketForm.php:126 #: ../../../../application/forms/BasketUploadForm.php:122 msgid "It's not allowed to store an empty basket" msgstr "Das Speichern eines leeren Baskets ist nicht erlaubt" #: ../../../../application/controllers/JobController.php:108 msgid "Job" msgstr "Auftrag" #: ../../../../application/forms/BasketForm.php:37 msgid "Job Definitions" msgstr "Job-Definitionen" #: ../../../../application/forms/DirectorJobForm.php:17 msgid "Job Type" msgstr "Auftragstyp" #: ../../../../library/Director/Web/Table/JobTable.php:60 #: ../../../../application/forms/DirectorJobForm.php:72 msgid "Job name" msgstr "Auftragsname" #: ../../../../application/controllers/JobController.php:26 #: ../../../../application/controllers/JobController.php:57 #, php-format msgid "Job: %s" msgstr "Auftrag: %s" #: ../../../../library/Director/Dashboard/Dashlet/JobDashlet.php:15 #: ../../../../library/Director/Web/Tabs/ImportTabs.php:26 #: ../../../../application/controllers/JobsController.php:13 msgid "Jobs" msgstr "Aufträge" #: ../../../../library/Director/Web/Table/ActivityLogTable.php:221 #: ../../../../library/Director/Web/Table/BranchActivityTable.php:71 msgid "Jump to this object" msgstr "Zu diesem Objekt springen" #: ../../../../library/Director/Web/SelfService.php:255 msgid "Just download and run this script on your Linux Client Machine:" msgstr "" "Einfach dieses Skript herunterladen und auf dem Linux Client-Rechner " "ausführen:" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:57 msgid "Keep matching elements" msgstr "Übereinstimmende Elemente behalten" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:73 msgid "Keep only matching rows" msgstr "Behalte nur passende Zeilen" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:31 msgid "Keep the DN as is" msgstr "DN unverändert behalten" #: ../../../../library/Director/PropertyModifier/PropertyModifierJsonDecode.php:26 msgid "Keep the JSON string as is" msgstr "JSON-String beibehalten" #: ../../../../library/Director/PropertyModifier/PropertyModifierListToObject.php:27 msgid "Keep the first row with that key" msgstr "Behalte die erste Zeile mit diesem Schlüssel" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexReplace.php:33 msgid "Keep the given string" msgstr "Bestehenden String behalten" #: ../../../../library/Director/PropertyModifier/PropertyModifierListToObject.php:28 msgid "Keep the last row with that key" msgstr "Behalte die letzte Zeile mit diesem Schlüssel" #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:18 #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByName.php:18 msgid "Keep the property (hostname) as is" msgstr "Die Eigenschaft (hostname) behalten, wie sie ist" #: ../../../../library/Director/PropertyModifier/PropertyModifierParseURL.php:40 #: ../../../../library/Director/PropertyModifier/PropertyModifierDnsRecords.php:35 msgid "Keep the property as is" msgstr "Die Eigenschaft beibehalten" #: ../../../../library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:32 #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayToRow.php:25 msgid "Keep the row, set the column value to null" msgstr "Behalte die Zeile so wie sie ist, setze den Spaltenwert auf null" #: ../../../../library/Director/Web/Table/DatalistEntryTable.php:54 #: ../../../../application/forms/DirectorDatalistEntryForm.php:21 msgid "Key" msgstr "Schlüssel" #: ../../../../application/controllers/DataController.php:327 msgid "Key / Instance" msgstr "Schlüssel / Instanz" #: ../../../../library/Director/PropertyModifier/PropertyModifierListToObject.php:15 msgid "Key Property" msgstr "Schlüsseleigenschaft" #: ../../../../library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:21 msgid "Key Property Name" msgstr "Schlüsseleigenschaft" #: ../../../../application/forms/ImportSourceForm.php:87 msgid "Key column name" msgstr "Schlüsselspaltenname" #: ../../../../application/controllers/KickstartController.php:15 #: ../../../../application/controllers/KickstartController.php:17 msgid "Kickstart" msgstr "Kickstart" #: ../../../../library/Director/Dashboard/Dashlet/KickstartDashlet.php:13 #: ../../../../application/forms/KickstartForm.php:292 msgid "Kickstart Wizard" msgstr "Kickstart Assistent" #: ../../../../library/Director/Import/ImportSourceLdap.php:50 msgid "LDAP Search Base" msgstr "LDAP Suchbasis" #: ../../../../library/Director/Web/Table/DatalistEntryTable.php:55 #: ../../../../library/Director/Web/Table/IcingaObjectDatafieldTable.php:49 #: ../../../../library/Director/Web/Table/DatafieldTable.php:51 #: ../../../../application/forms/DirectorDatalistEntryForm.php:30 msgid "Label" msgstr "Bezeichnung" #: ../../../../library/Director/Web/Widget/IcingaObjectInspection.php:58 msgid "Last Check Result" msgstr "Letztes Check-Ergebnis" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:34 msgid "Last Element" msgstr "Letztes Element" #: ../../../../application/forms/IcingaNotificationForm.php:256 msgid "Last notification" msgstr "Letzte Benachrichtigung" #: ../../../../library/Director/Web/Widget/DeployedConfigInfoHeader.php:77 msgid "Last related activity" msgstr "Zuletzt verwendete Konfiguration" #: ../../../../application/controllers/SyncruleController.php:136 msgid "Last sync run details" msgstr "Details des letzten Imports" #: ../../../../application/forms/IcingaCommandArgumentForm.php:69 msgid "" "Leave empty for non-positional arguments. Can be a positive or negative " "number and influences argument ordering" msgstr "" "Leer lassen für Argumente, deren Position egal ist. Kann eine positive oder " "negative Zahl sein und beeinflusst die Reihenfolge der Argumente" #: ../../../../application/forms/DirectorDatafieldForm.php:44 msgid "" "Leaving custom variables in place while removing the related field is " "perfectly legal and might be a desired operation. This way you can no longer " "modify related custom variables in the Director GUI, but the variables " "themselves will stay there and continue to be deployed. When you re-add a " "field for the same variable later on, everything will continue to work as " "before" msgstr "" "Benutzerdefinierte Eigenschaften beizubehalten während das zugehörige Feld " "entfernt wird ist durchaus legal und kann eine gewünschte Operation sein. " "Auf diesem Wege lassen sich zugehörige Felder dann nicht mehr in der " "Director-Oberfläche bearbeiten, aber die jeweiligen Werte bleiben " "konfiguriert und werden weiterhin ausgerollt. Wenn man ein Feld mit " "demselben Namen zu einem späteren Zeitpunkt wieder hinzufügt, wird alles " "wieder funktionieren wie zuvor" #: ../../../../application/forms/DirectorDatafieldForm.php:87 msgid "" "Leaving custom variables in place while renaming the related field is " "perfectly legal and might be a desired operation. This way you can no longer " "modify related custom variables in the Director GUI, but the variables " "themselves will stay there and continue to be deployed. When you re-add a " "field for the same variable later on, everything will continue to work as " "before" msgstr "" "Benutzerdefinierte Eigenschaften beizubehalten während das zugehörige Feld " "umbenannt wird ist durchaus legal und kann eine gewünschte Operation sein. " "Auf diesem Wege lassen sich zugehörige Felder dann nicht mehr in der " "Director-Oberfläche bearbeiten, aber die jeweiligen Werte bleiben " "konfiguriert und werden weiterhin ausgerollt. Wenn man ein Feld mit " "demselben Namen zu einem späteren Zeitpunkt wieder hinzufügt, wird alles " "wieder funktionieren wie zuvor" #: ../../../../library/Director/PropertyModifier/PropertyModifierMap.php:37 #: ../../../../library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:45 #: ../../../../library/Director/PropertyModifier/PropertyModifierSetValue.php:34 msgid "Let the import fail" msgstr "Import fehlschlagen lassen" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:55 msgid "Let the whole Import Run fail" msgstr "Den ganzen Importlauf fehlschlagen lassen" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:32 #: ../../../../library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:31 #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:19 #: ../../../../library/Director/PropertyModifier/PropertyModifierListToObject.php:26 #: ../../../../library/Director/PropertyModifier/PropertyModifierParseURL.php:41 #: ../../../../library/Director/PropertyModifier/PropertyModifierJsonDecode.php:27 #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayToRow.php:24 #: ../../../../library/Director/PropertyModifier/PropertyModifierDnsRecords.php:36 #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByName.php:19 msgid "Let the whole import run fail" msgstr "Den ganzen Importlauf fehlschlagen lassen" #: ../../../../configuration.php:51 msgid "Limit access to the given comma-separated list of hostgroups" msgstr "" "Den Zugriff auf diese Kommagetrennte Liste von Host-Gruppen beschränken" #: ../../../../library/Director/Web/SelfService.php:247 msgid "Linux commandline" msgstr "Linux Kommandozeile" #: ../../../../application/controllers/DataController.php:125 msgid "List Entries" msgstr "Listeneinträge" #: ../../../../application/controllers/DataController.php:401 msgid "List entries" msgstr "Listeneinträge" #: ../../../../library/Director/Web/Table/DatalistTable.php:31 #: ../../../../application/forms/DirectorDatalistForm.php:13 msgid "List name" msgstr "Listenname" #: ../../../../library/Director/Import/ImportSourceRestApi.php:213 msgid "Literal dots in a key name can be written in the escape notation:" msgstr "Punkte im Schlüsselbezeichner können bei Bedarf verschont werden:" #: ../../../../application/forms/SettingsForm.php:167 msgid "" "Local directory to deploy Icinga 1.x configuration. Must be writable by " "icingaweb2. (e.g. /etc/icinga/director)" msgstr "" "Lokales Verzeichnis in welches die Icinga 1.x Konfiguration ausgerollt " "werden soll. Muss von icingaweb2 beschreibbar sein (z.B. /etc/icinga/" "director)" #: ../../../../application/forms/IcingaEndpointForm.php:41 msgid "Log Duration" msgstr "Behaltefrist des Logs" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:579 #: ../../../../application/forms/IcingaAddServiceForm.php:68 msgid "Main properties" msgstr "Haupteigenschaften" #: ../../../../library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:14 msgid "" "Manage definitions for your Commands that should be executed as Check " "Plugins, Notifications or based on Events" msgstr "" "Definitionen für Kommandos verwalten, welche als Check-Plugins " "Benachrichtigungen oder Event-basiert ausgeführt werden sollen" #: ../../../../library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:19 msgid "" "Manage your Host Templates. Use Fields to make it easy for your users to get " "them customized." msgstr "" "Host-Vorlagen verwalten. Verwende Felder um Benutzern deren Anpassung zu " "erleichtern." #: ../../../../library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:19 msgid "" "Manage your Icinga 2 infrastructure: Masters, Zones, Satellites and more" msgstr "Icinga 2 Infrastruktur verwalten: Master, Zonen, Satelliten und mehr" #: ../../../../library/Director/Dashboard/CommandsDashboard.php:17 msgid "Manage your Icinga Commands" msgstr "Icinga Kommandos verwalten" #: ../../../../library/Director/Dashboard/HostsDashboard.php:16 msgid "Manage your Icinga Hosts" msgstr "Icinga Hosts verwalten" #: ../../../../library/Director/Dashboard/InfrastructureDashboard.php:24 msgid "Manage your Icinga Infrastructure" msgstr "Icinga 2 Infrastruktur verwalten" #: ../../../../library/Director/Dashboard/ServicesDashboard.php:18 msgid "Manage your Icinga Service Checks" msgstr "Icinga Service Checks verwalten" #: ../../../../library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:19 msgid "" "Manage your Service Templates. Use Fields to make it easy for your users to " "get them customized." msgstr "" "Service-Vorlagen verwalten. Verwende Felder um Benutzern deren Anpassung zu " "erleichtern." #: ../../../../library/Director/Web/Controller/ObjectController.php:257 msgid "Managing Fields" msgstr "Datenfelder verwalten" #: ../../../../library/Director/Web/Table/IcingaObjectDatafieldTable.php:51 #: ../../../../application/forms/IcingaObjectFieldForm.php:106 #: ../../../../application/forms/IcingaObjectFieldForm.php:111 msgid "Mandatory" msgstr "Pflicht" #: ../../../../application/forms/SettingsForm.php:155 msgid "Master-less" msgstr "Masterlos" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:35 msgid "Match NULL value columns" msgstr "Triff auf Spalten NULL-Werten zu" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:34 msgid "Match boolean FALSE" msgstr "Triff auf boolesches FALSE zu" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:33 msgid "Match boolean TRUE" msgstr "Triff auf boolesches TRUE zu" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1394 msgid "Max check attempts" msgstr "Maximale Checkwiederholungen" #: ../../../../library/Director/Web/Table/GroupMemberTable.php:73 #: ../../../../library/Director/Web/Table/GroupMemberTable.php:78 msgid "Member" msgstr "Mitglied" #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:111 msgid "Members" msgstr "Mitglieder" #: ../../../../library/Director/Web/Controller/ObjectController.php:626 #: ../../../../application/forms/SyncRuleForm.php:62 msgid "Merge" msgstr "Zusammenführen" #: ../../../../application/forms/SyncPropertyForm.php:117 msgid "Merge Policy" msgstr "Zusammenführungsrichtlinie" #: ../../../../application/forms/IcingaTimePeriodRangeForm.php:23 #: ../../../../application/forms/IcingaScheduledDowntimeRangeForm.php:24 msgid "" "Might be monday, tuesday or 2016-01-28 - have a look at the documentation " "for more examples" msgstr "" "Mögliche Werte sind z.B. monday, tuesday oder 2016-01-28 - Mehr Beispiele " "finden sich in der Dokumentation" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:73 msgid "Minimum required" msgstr "Erforderliches Minimum" #: ../../../../application/controllers/BranchController.php:125 msgid "Modification" msgstr "Änderung" #: ../../../../application/forms/ImportRowModifierForm.php:104 msgid "Modifier" msgstr "Modifikator" #: ../../../../library/Director/Web/Tabs/ImportsourceTabs.php:41 msgid "Modifiers" msgstr "Modifikatoren" #: ../../../../library/Director/ProvidedHook/Monitoring/HostActions.php:54 #: ../../../../library/Director/ProvidedHook/Monitoring/ServiceActions.php:57 #: ../../../../library/Director/ProvidedHook/Monitoring/ServiceActions.php:60 #: ../../../../library/Director/Web/ActionBar/AutomationObjectActionBar.php:38 #: ../../../../library/Director/Web/Tabs/SyncRuleTabs.php:37 #: ../../../../library/Director/Web/Controller/TemplateController.php:122 #: ../../../../application/controllers/ImportsourceController.php:126 #: ../../../../application/controllers/SyncruleController.php:552 msgid "Modify" msgstr "Ändere" #: ../../../../library/Director/ProvidedHook/CubeLinks.php:52 #: ../../../../library/Director/ProvidedHook/IcingaDbCubeLinks.php:53 #, php-format msgid "Modify %d hosts" msgstr "%d Hosts verändern" #: ../../../../library/Director/Web/Controller/ObjectsController.php:215 #, php-format msgid "Modify %d objects" msgstr "%d Objekte bearbeiten" #: ../../../../application/controllers/DatafieldController.php:28 #: ../../../../application/controllers/DatafieldcategoryController.php:34 #, php-format msgid "Modify %s" msgstr "Ändere %s" #: ../../../../library/Director/ProvidedHook/CubeLinks.php:35 #: ../../../../library/Director/ProvidedHook/IcingaDbCubeLinks.php:30 msgid "Modify a host" msgstr "Ändere einen Host" #: ../../../../application/forms/DirectorDatalistEntryForm.php:61 msgid "Modify data list entry" msgstr "Datenlisteneintrag verändern" #: ../../../../application/controllers/DataController.php:214 #, php-format msgid "Modify instance: %s" msgstr "Instanz ändern: %s" #: ../../../../library/Director/Web/Table/ApplyRulesTable.php:158 msgid "Modify this Apply Rule" msgstr "Diese Apply-Regeln ändern" #: ../../../../library/Director/Web/Controller/ObjectController.php:183 msgid "Modifying Apply Rules" msgstr "Apply-Regeln ändern" #: ../../../../application/controllers/ImportsourceController.php:127 #: ../../../../application/controllers/ImportsourceController.php:285 #: ../../../../application/controllers/ImportsourceController.php:315 msgid "Modifying Import Sources" msgstr "Importquellen ändern" #: ../../../../application/controllers/JobController.php:59 msgid "Modifying Jobs" msgstr "Aufträge ändern" #: ../../../../application/controllers/SyncruleController.php:517 #: ../../../../application/controllers/SyncruleController.php:623 #: ../../../../application/controllers/SyncruleController.php:631 msgid "Modifying Sync Rules" msgstr "Synchronisationsregeln ändern" #: ../../../../application/controllers/TemplatechoiceController.php:36 msgid "Modifying Template Choices" msgstr "Auswahlmöglichkeit für Vorlagen abändern" #: ../../../../library/Director/Web/Controller/ObjectController.php:179 #: ../../../../application/controllers/ServiceController.php:147 msgid "Modifying Templates" msgstr "Vorlagen ändern" #: ../../../../library/Director/Web/Table/Dependency/DependencyInfoTable.php:37 msgid "Module name" msgstr "Modulname" #: ../../../../library/Director/Dashboard/Dashlet/ServiceObjectDashlet.php:17 msgid "Monitored Services" msgstr "Überwachte Services" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:544 msgid "Move down" msgstr "Nach unten bewegen" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:534 msgid "Move up" msgstr "Nach oben bewegen" #: ../../../../library/Director/Web/Controller/ObjectsController.php:213 msgid "Multiple objects" msgstr "Mehrere Objekte" #: ../../../../application/forms/SelfServiceSettingsForm.php:51 msgid "My Agents should use DNS to look up Endpoint names" msgstr "Meine Agents sollen DNS benutzen, um Endpoint-Namen nachzuschlagen" #: ../../../../application/controllers/ConfigController.php:182 msgid "My changes" msgstr "Meine Änderungen" #: ../../../../application/controllers/SchemaController.php:16 msgid "MySQL schema" msgstr "MySQL Schema" #: ../../../../library/Director/Web/Table/CoreApiObjectsTable.php:57 #: ../../../../library/Director/Web/Table/CoreApiPrototypesTable.php:40 #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:79 #: ../../../../library/Director/Web/Table/ChoicesTable.php:41 #: ../../../../library/Director/Web/Table/ObjectSetTable.php:50 #: ../../../../application/forms/IcingaServiceVarForm.php:22 #: ../../../../application/forms/IcingaHostVarForm.php:22 #: ../../../../application/forms/IcingaTimePeriodForm.php:15 #: ../../../../application/forms/IcingaCommandForm.php:46 #: ../../../../application/forms/IcingaServiceForm.php:579 #: ../../../../application/forms/IcingaHostForm.php:40 #: ../../../../application/forms/IcingaApiUserForm.php:14 #: ../../../../application/forms/IcingaServiceDictionaryMemberForm.php:22 #: ../../../../application/forms/IcingaAddServiceForm.php:144 #: ../../../../application/forms/IcingaDependencyForm.php:74 msgid "Name" msgstr "Name" #: ../../../../application/forms/IcingaDependencyForm.php:76 msgid "Name for the Icinga dependency you are going to create" msgstr "Name der Icinga-Abhängigkeit, die erstellt werden soll" #: ../../../../application/forms/IcingaEndpointForm.php:20 msgid "Name for the Icinga endpoint template you are going to create" msgstr "Name der Icinga-Endpunkt-Vorlage, die erstellt werden soll" #: ../../../../application/forms/IcingaEndpointForm.php:26 msgid "Name for the Icinga endpoint you are going to create" msgstr "Name des Icinga-Endpunkt, der erstellt werden soll" #: ../../../../application/forms/IcingaNotificationForm.php:22 msgid "Name for the Icinga notification template you are going to create" msgstr "Name der Icinga-Benachrichtigungs-Vorlage, die erstellt werden soll" #: ../../../../application/forms/IcingaNotificationForm.php:28 msgid "Name for the Icinga notification you are going to create" msgstr "Name der Icinga-Benachrichtigung, die erstellt werden soll" #: ../../../../application/forms/IcingaServiceForm.php:582 #: ../../../../application/forms/IcingaAddServiceForm.php:147 msgid "Name for the Icinga service you are going to create" msgstr "Name des Icinga-Service, der erstellt werden soll" #: ../../../../application/forms/IcingaUserForm.php:30 msgid "Name for the Icinga user object you are going to create" msgstr "Name für das Icinga-Benutzerobjekt, das Sie erstellen möchten" #: ../../../../application/forms/IcingaUserForm.php:24 msgid "Name for the Icinga user template you are going to create" msgstr "Name für die Icinga-Benutzervorlage, die Sie erstellen möchten" #: ../../../../application/forms/IcingaZoneForm.php:17 msgid "Name for the Icinga zone you are going to create" msgstr "Name der Icinga-Zone, die erstellt werden soll" #: ../../../../application/forms/IcingaServiceDictionaryMemberForm.php:25 msgid "Name for the instance you are going to create" msgstr "Name der Instanz, die erstellt werden soll" #: ../../../../application/forms/IcingaCloneObjectForm.php:155 msgid "Name needs to be changed when cloning a Template" msgstr "Beim Klonen einer Vorlage muss der Name geändert werden" #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:90 msgid "Nav" msgstr "Nav" #: ../../../../application/controllers/DatafieldcategoryController.php:40 msgid "New Category" msgstr "Neue Kategorie" #: ../../../../application/controllers/DatafieldController.php:34 msgid "New Field" msgstr "Neues Feld" #: ../../../../application/controllers/JobController.php:34 msgid "New Job" msgstr "Neuer Job" #: ../../../../library/Director/Web/Tabs/ImportsourceTabs.php:54 msgid "New import source" msgstr "Neue Importquelle" #: ../../../../library/Director/Web/Form/CloneImportSourceForm.php:33 #: ../../../../library/Director/Web/Form/CloneSyncRuleForm.php:33 #: ../../../../application/forms/IcingaCloneObjectForm.php:41 msgid "New name" msgstr "Neuer Name" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:379 msgid "New object" msgstr "Neues Objekt" #: ../../../../application/forms/IcingaHostForm.php:33 #: ../../../../application/forms/IcingaAddServiceForm.php:36 msgid "Next" msgstr "Weiter" #: ../../../../library/Director/Job/ImportJob.php:102 #: ../../../../library/Director/Job/ConfigJob.php:40 #: ../../../../library/Director/Job/ConfigJob.php:52 #: ../../../../library/Director/Job/SyncJob.php:102 #: ../../../../library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:26 #: ../../../../application/forms/IcingaZoneForm.php:29 #: ../../../../application/forms/SettingsForm.php:58 #: ../../../../application/forms/SettingsForm.php:73 #: ../../../../application/forms/SettingsForm.php:95 #: ../../../../application/forms/SelfServiceSettingsForm.php:240 msgid "No" msgstr "Nein" #: ../../../../application/controllers/DataController.php:184 #, php-format msgid "No %s have been created yet" msgstr "Bisher wurden keine %s erstellt" #: ../../../../library/Director/Util.php:167 #, php-format msgid "No %s resource available" msgstr "Keine %s Ressource verfügbar" #: ../../../../library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:101 msgid "No API user configured, you might run the kickstart helper" msgstr "" "Kein API Benutzer konfiguriert. Der kickstart helper sollte ausgeführt werden" #: ../../../../application/forms/IcingaHostForm.php:177 msgid "No Host Template has been provided yet" msgstr "Es wurde noch keine passende Host-Vorlage bereitgestellt" #: ../../../../application/forms/IcingaHostForm.php:165 msgid "No Host template has been chosen" msgstr "Keine Host-Vorlage wurde ausgewählt" #: ../../../../application/forms/IcingaAddServiceForm.php:96 msgid "No Service Templates have been provided yet" msgstr "Es wurde noch keine passende Vorlage bereitgestellt" #: ../../../../application/forms/IcingaNotificationForm.php:127 msgid "No User object has been created yet" msgstr "Kein Benutzer-Objekt wurde bisher definiert" #: ../../../../application/forms/IcingaNotificationForm.php:164 msgid "No UserGroup object has been created yet" msgstr "Keine Benutzergruppe wurde bisher definiert" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:673 #: ../../../../application/forms/IcingaCommandArgumentForm.php:181 #: ../../../../application/forms/IcingaTimePeriodRangeForm.php:94 #: ../../../../application/forms/IcingaServiceForm.php:781 #: ../../../../application/forms/IcingaScheduledDowntimeRangeForm.php:99 msgid "No action taken, object has not been modified" msgstr "Keine Aktion durchgeführt, das Objekt wurde nicht verändert" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:162 msgid "No apply rule has been defined yet" msgstr "Bisher wurde kein Apply-Regel definiert" #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:43 msgid "No changes have been made" msgstr "Keine Änderungen wurden gemacht" #: ../../../../application/controllers/DashboardController.php:73 msgid "No dashboard available, you might have not enough permissions" msgstr "" "Kein Dashboard verfügbar, eventuell wurden nicht genügend Zugriffsrechte " "gewährt" #: ../../../../library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:70 msgid "No database has been configured for Icinga Director" msgstr "Keine Datenbank für den Icinga-Director wurde konfiguriert" #: ../../../../application/forms/KickstartForm.php:215 msgid "" "No database resource has been configured yet. Please choose a resource to " "complete your config" msgstr "" "Es wurde bisher keine Datenbankressource konfiguriert. Bitte eine Ressource " "auswählen, um die Konfiguration zu vervollständigen" #: ../../../../application/forms/KickstartForm.php:56 msgid "No database schema has been created yet" msgstr "Kein Datenbankschema wurde bisher erstellt" #: ../../../../application/forms/AddToBasketForm.php:105 msgid "No object has been chosen" msgstr "Keine Objekt wurde ausgewählt" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:180 msgid "No object has been defined yet" msgstr "Kein Objekt wurde bisher definiert" #: ../../../../application/forms/IcingaMultiEditForm.php:88 msgid "No object has been modified" msgstr "Kein Objekt wurde verändert" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1248 msgid "No related template has been provided yet" msgstr "Es wurde noch keine passende Vorlage bereitgestellt" #: ../../../../application/forms/IcingaAddServiceForm.php:84 msgid "No service has been chosen" msgstr "Keine Service wurde ausgewählt" #: ../../../../application/controllers/HostController.php:151 #, php-format msgid "No such service: %s" msgstr "Kein solcher Service: %s" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1243 msgid "No template has been chosen" msgstr "Keine Vorlage wurde ausgewählt" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:144 msgid "No template has been defined yet" msgstr "Es wurde noch keine Vorlage definiert" #: ../../../../application/forms/IcingaServiceForm.php:629 msgid "None" msgstr "Keine" #: ../../../../library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:58 msgid "None could be used for deployments right now" msgstr "Keines kann momentan zum Ausrollen verwendet werden" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1534 msgid "Notes" msgstr "Notizen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1543 msgid "Notes URL" msgstr "Notizen-URL" #: ../../../../application/forms/SyncRunForm.php:60 msgid "Nothing changed, rule is in sync" msgstr "Keine Änderung, Regel ist synchron" #: ../../../../application/forms/ImportCheckForm.php:38 #: ../../../../application/forms/ImportRunForm.php:38 msgid "" "Nothing to do, data provided by this Import Source didn't change since the " "last import run" msgstr "" "Keine Aktion nötig. Die Daten von dieser Importquelle haben sich seit dem " "letzten Lauf nicht geändert" #: ../../../../application/forms/RestoreObjectForm.php:76 msgid "Nothing to do, restore would not modify the current object" msgstr "" "Nichts zu tun, eine Wiederherstellung würde das aktuelle Objekt nicht ändern" #: ../../../../application/forms/SyncRunForm.php:64 msgid "Nothing to do, rule is in sync" msgstr "Nichts zu tun, Regel ist synchron" #: ../../../../application/forms/SyncCheckForm.php:63 msgid "Nothing would change, this rule is still in sync" msgstr "Es würde sich nichts ändern, diese Regel ist noch synchron" #: ../../../../library/Director/TranslationDummy.php:18 #: ../../../../application/forms/IcingaNotificationForm.php:26 #: ../../../../application/forms/SyncRuleForm.php:22 msgid "Notification" msgstr "Benachrichtigung" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:58 msgid "Notification Apply Rules" msgstr "Benachrichtigungs-Apply-Regeln" #: ../../../../library/Director/Web/Controller/TemplateController.php:58 #, php-format msgid "Notification Apply Rules based on %s" msgstr "Benachrichtigungs-Apply-Regeln basierend auf %s" #: ../../../../library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:19 #: ../../../../library/Director/Import/ImportSourceCoreApi.php:58 msgid "Notification Commands" msgstr "Benachrichtigungskommandos" #: ../../../../library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:12 msgid "" "Notification Commands allow you to trigger any action you want when a " "notification takes place" msgstr "" "Benachrichtigungs-Kommandos erlauben das Ausführen beliebiger Aktionen wenn " "eine Benachrichtigung stattfinden soll" #: ../../../../application/forms/IcingaNotificationForm.php:20 msgid "Notification Template" msgstr "Benachrichtigungsvorlage" #: ../../../../application/forms/BasketForm.php:30 msgid "Notification Templates" msgstr "Benachrichtigungsvorlagen" #: ../../../../application/forms/IcingaNotificationForm.php:310 msgid "Notification command" msgstr "Benachrichtigungskommando" #: ../../../../application/forms/IcingaNotificationForm.php:224 msgid "Notification interval" msgstr "Benachrichtigungsintervall" #: ../../../../application/controllers/TemplatechoicesController.php:29 msgid "Notification template choices" msgstr "Auswahlmöglichkeiten für Benachrichtigungsvorlagen" #: ../../../../library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:15 msgid "Notification templates" msgstr "Benachrichtigungsvorlagen" #: ../../../../configuration.php:133 #: ../../../../library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:15 #: ../../../../library/Director/Dashboard/Dashlet/NotificationsDashlet.php:15 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:46 #: ../../../../library/Director/Web/Table/CustomvarVariantsTable.php:61 #: ../../../../library/Director/Web/Table/CustomvarTable.php:46 #: ../../../../application/forms/BasketForm.php:31 msgid "Notifications" msgstr "Benachrichtigungen" #: ../../../../library/Director/Dashboard/NotificationsDashboard.php:20 msgid "" "Notifications are sent when a host or service reaches a non-ok hard state or " "recovers from such. One might also want to send them for special events like " "when a Downtime starts, a problem gets acknowledged and much more. You can " "send specific notifications only within specific time periods, you can delay " "them and of course re-notify at specific intervals.\n" "\n" " Combine those possibilities in case you need to define escalation levels, " "like notifying operators first and your management later on in case the " "problem remains unhandled for a certain time.\n" "\n" " You might send E-Mail or SMS, make phone calls or page on various " "channels. You could also delegate notifications to external service " "providers. The possibilities are endless, as you are allowed to define as " "many custom notification commands as you want" msgstr "" "Benachrichtigungen werden gesendet, wenn ein Host oder Services einen harten " "Nicht-OK-Zustand erreicht oder sich von einem solchen erholt. Es könnte " "zudem wünschenswert sein, Benachrichtigungen auch für spezielle Events wie " "den Beginn einer Downtime, das Bestätigen eines Problems und mehr zu " "versenden. Benachrichtigungen lassen sich auf Wunsch nur innerhalb " "bestimmter Zeitfenster versenden. Zudem können sie künstlich verzögert und / " "oder in bestimmten Intervallen neu versandt werden.\n" "\n" "Wer Eskalationsebenen umsetzen möchte kombiniert diese Möglichkeiten. Man " "könnte z.B. erst das Operating benachrichtigen, und erst wenn das Problem " "für längere Zeit unbehandelt bleibt das Management mit einbeziehen.\n" "\n" "Man könnte E-Mails oder SMS versenden, Telefonanrufe durchführen und sich " "auf unterschiedlichsten Kanälen anpiepen lassen. Benachrichtigungen lassen " "sich natürlich auch an externe Serviceanbieter auslagern. Die Möglichkeiten " "sind endlos, nachdem man beliebig viele eigene Kommandos anbinden kann" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:43 msgid "Numeric position or key name" msgstr "Numerische Position oder Schlüsselbezeichner" #: ../../../../library/Director/IcingaConfig/StateFilterSet.php:24 msgid "OK" msgstr "Ok" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:67 #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1117 #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1122 #: ../../../../library/Director/Web/Controller/TemplateController.php:150 msgid "Object" msgstr "Objekt" #: ../../../../application/controllers/InspectController.php:102 msgid "Object Inspection" msgstr "Objekt-Inspektion" #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:78 #: ../../../../application/forms/SyncRuleForm.php:45 msgid "Object Type" msgstr "Objekttyp" #: ../../../../library/Director/Import/ImportSourceLdap.php:56 msgid "Object class" msgstr "Objektklasse" #: ../../../../library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:18 msgid "Object dependency relationships." msgstr "Objekt-Abhängigkeiten." #: ../../../../application/forms/RestoreObjectForm.php:80 msgid "Object has been re-created" msgstr "Objekt wurde wiederhergestellt" #: ../../../../application/forms/RestoreObjectForm.php:72 msgid "Object has been restored" msgstr "Objekt wurde wiederhergestellt" #: ../../../../application/forms/SyncPropertyForm.php:359 msgid "Object properties" msgstr "Objekteigenschaften" #: ../../../../library/Director/Web/Table/SyncruleTable.php:46 #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1130 msgid "Object type" msgstr "Objekttyp" #: ../../../../application/controllers/InspectController.php:65 #, php-format msgid "Object type \"%s\"" msgstr "Objekttyp \"%s\"" #: ../../../../library/Director/Web/Table/GeneratedConfigFileTable.php:85 msgid "Object/Tpl/Apply" msgstr "Objekt/Vorlage/Apply" #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:81 #: ../../../../library/Director/Web/Table/TemplateUsageTable.php:24 #: ../../../../library/Director/Web/Table/HostTemplateUsageTable.php:11 #: ../../../../library/Director/Web/Table/ServiceTemplateUsageTable.php:11 msgid "Objects" msgstr "Objekte" #: ../../../../library/Director/Import/ImportSourceRestApi.php:209 msgid "" "Often the expected result is provided in a property like \"objects\". Please " "specify this if required." msgstr "" "Häufig wird das zu erwartende Ergebnis in einer Eigenschaft wie \"objects\" " "zurückgeliefert. Bitte angeben falls erforderlich." #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:27 #: ../../../../library/Director/PropertyModifier/PropertyModifierParseURL.php:34 msgid "On failure" msgstr "Bei Fehler" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:166 msgid "One apply rule has been defined" msgstr "Eine Apply-Regel wurde definiert" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:188 msgid "One external object has been defined, it will not be deployed" msgstr "Ein externes Objekt wurde erstellt, es wird nicht ausgerollt" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:191 msgid "One object has been defined" msgstr "Ein Objekt wurde definiert" #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:46 #: ../../../../application/forms/IcingaMultiEditForm.php:90 msgid "One object has been modified" msgstr "Ein Objekt wurde verändert" #: ../../../../library/Director/PropertyModifier/PropertyModifierSplit.php:16 msgid "One or more characters that should be used to split this string" msgstr "" "Ein oder mehrere Zeichen, die zum Trennen der Zeichenkette genutzt werden " "sollen" #: ../../../../library/Director/PropertyModifier/PropertyModifierJoin.php:16 msgid "" "One or more characters that will be used to glue an input array to a string. " "Can be left empty" msgstr "" "Ein oder mehrere Zeichen, die verwendet werden, um einen Eingabearray an " "eine Zeichenkette zu heften. Kann leer bleiben" #: ../../../../application/forms/IcingaTimePeriodRangeForm.php:30 #: ../../../../application/forms/IcingaScheduledDowntimeRangeForm.php:31 msgid "One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00" msgstr "" "Einer oder mehrere Zeiträume, z.B. 00:00-24:00 oder 00:00-09:00,17:00-24:00" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:148 #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:185 msgid "One template has been defined" msgstr "Eine Vorlage wurde definiert" #: ../../../../application/forms/IcingaCommandArgumentForm.php:100 msgid "" "Only set this parameter if the argument value resolves to a numeric value. " "String values are not supported" msgstr "" "Nur setzen, wenn der Wert des Arguments numereisch ist. Zeichenketten als " "Wert werden nicht unterstützt" #: ../../../../application/forms/IcingaObjectFieldForm.php:110 msgid "Optional" msgstr "Optional" #: ../../../../application/forms/IcingaCommandForm.php:71 msgid "" "Optional command timeout. Allowed values are seconds or durations postfixed " "with a specific unit (e.g. 1m or also 3m 30s)." msgstr "" "Optionaler Kommando-Timeout. Erlaubt sind Werte in Sekunden oder Werte mit " "nachgestellter Zeiteinheit. z.B. 1m oder auch 3m 30s." #: ../../../../application/forms/IcingaDependencyForm.php:248 msgid "" "Optional. The child service. If omitted this dependency object is treated as " "host dependency." msgstr "" "Optional. Der Kind-Service. Falls leer wird dieses Objekt als Host-" "Abhängigkeit behandelt." #: ../../../../application/forms/IcingaDependencyForm.php:218 msgid "" "Optional. The parent service. If omitted this dependency object is treated " "as host dependency." msgstr "" "Optional. Der Eltern-Service. Falls leer wird dieses Objekt als Host-" "Abhängigkeit behandelt." #: ../../../../library/Director/Field/FormFieldSuggestion.php:90 msgid "Other available fields" msgstr "Andere verfügbare Felder" #: ../../../../application/forms/SyncPropertyForm.php:274 msgid "Other sources" msgstr "Andere Quellen" #: ../../../../application/forms/IcingaServiceForm.php:162 #: ../../../../application/forms/IcingaServiceForm.php:439 #: ../../../../application/forms/IcingaServiceForm.php:471 msgid "Override vars" msgstr "Variablen überschreiben" #: ../../../../library/Director/Web/ActionBar/AutomationObjectActionBar.php:32 #: ../../../../library/Director/Web/Tabs/MainTabs.php:27 msgid "Overview" msgstr "Überblick" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:81 msgid "PHP Binary" msgstr "PHP Binary" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:84 msgid "PHP Integer" msgstr "PHP Integer" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:83 msgid "PHP Version" msgstr "PHP-Version" #: ../../../../application/controllers/PhperrorController.php:19 #, php-format msgid "" "PHP version 5.4.x is required for Director >= 1.4.0, you're running %s. " "Please either upgrade PHP or downgrade Icinga Director" msgstr "" "PHP Version 5.4.x ist für den Director >= 1.4.0 erforderlich, hier läuft %s. " "Bitte entweder PHP upgraden oder den Icinga Director downgraden" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:73 msgid "PID" msgstr "PID" #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:134 msgid "Packages" msgstr "Pakete" #: ../../../../library/Director/Web/Widget/InspectPackages.php:48 #, php-format msgid "Packages on Endpoint: %s" msgstr "Pakete auf Endpunkt: %s" #: ../../../../application/forms/IcingaUserForm.php:41 msgid "Pager" msgstr "Pager" #: ../../../../application/forms/IcingaDependencyForm.php:200 msgid "Parent Host" msgstr "Eltern-Host" #: ../../../../application/forms/IcingaDependencyForm.php:216 msgid "Parent Service" msgstr "Eltern-Service" #: ../../../../application/forms/IcingaZoneForm.php:36 msgid "Parent Zone" msgstr "Übergeordnete Zone" #: ../../../../library/Director/Import/ImportSourceRestApi.php:233 #: ../../../../application/forms/IcingaApiUserForm.php:19 #: ../../../../application/forms/KickstartForm.php:163 msgid "Password" msgstr "Passwort" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexSplit.php:13 #: ../../../../library/Director/PropertyModifier/PropertyModifierCombine.php:14 msgid "Pattern" msgstr "Muster" #: ../../../../application/forms/ApplyMigrationsForm.php:39 msgid "Pending database schema migrations have successfully been applied" msgstr "" "Ausstehende Datenbankschemamigrationsskripte wurden erfolgreich angewandt" #: ../../../../library/Director/Util.php:169 msgid "Please ask an administrator to grant you access to resources" msgstr "Zugriff auf Ressourcen kann durch Administrator gewährt werden" #: ../../../../application/forms/AddToBasketForm.php:117 #, php-format msgid "" "Please check your Basket configuration, %s does not support single \"%s\" " "configuration objects" msgstr "" "Bitte Basketkonfiguration überprüfen, %s unterstützt keine einzelnen " "Konfigurationsobjekte vom Typ \"%s\"" #: ../../../../library/Director/PropertyModifier/PropertyModifierMap.php:20 msgid "Please choose a data list that can be used for map lookups" msgstr "Eine Datenliste auswählen, die für Map lookups verwendet wird" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:69 #: ../../../../library/Director/DataType/DataTypeDictionary.php:66 msgid "Please choose a specific Icinga object type" msgstr "Bitte einen bestimmten Icinga-Objekttyp auswählen" #: ../../../../library/Director/Job/ImportJob.php:82 msgid "" "Please choose your import source that should be executed. You could create " "different schedules for different sources or also opt for running all of " "them at once." msgstr "" "Eine Importquelle die ausgeführt werden soll auswählen. Es können " "verschiedene Zeitpläne für verschiedene Quellen erstellt oder alle " "gleichzeitig ausgeführt werden." #: ../../../../library/Director/Job/SyncJob.php:82 msgid "" "Please choose your synchronization rule that should be executed. You could " "create different schedules for different rules or also opt for running all " "of them at once." msgstr "" "Eine Synchronisationsregel die ausgeführt werden soll auswählen. Es können " "verschiedene Zeitpläne für verschiedene Regeln erstellt oder alle " "gleichzeitig ausgeführt werden." #: ../../../../library/Director/Import/ImportSourceSql.php:55 msgid "Please click \"Store\" once again to determine query columns" msgstr "" "Bitte klicke \"Speicher\" erneut um die von der Abfrage bereitgestellten " "Spalten zu ermitteln" #: ../../../../application/forms/KickstartForm.php:234 #, php-format msgid "Please click %s to create new DB resources" msgstr "%s klicken, um neue Datenbankressourcen zu erstellen" #: ../../../../library/Director/Util.php:159 #, php-format msgid "Please click %s to create new resources" msgstr "%s klicken, um neue Ressourcen zu erstellen" #: ../../../../application/forms/IcingaHostForm.php:169 #: ../../../../application/forms/IcingaAddServiceForm.php:88 #, php-format msgid "Please define a %s first" msgstr "Bitte zuerst eine %s definieren" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1246 msgid "Please define a related template first" msgstr "Bitte zuerst eine entsprechende Vorlage definieren" #: ../../../../application/forms/KickstartForm.php:472 msgid "" "Please make sure that your database exists and your user has been granted " "enough permissions" msgstr "" "Überprüfen, ob die Datenbank existiert und der Benutzer ausreichende " "Berechtigungen hat" #: ../../../../application/controllers/ImportsourceController.php:98 #, php-format msgid "" "Please note that importing data will take place in your main Branch. " "Modifications to Import Sources are not allowed while being in a " "Configuration Branch. To get the full functionality, please deactivate %s" msgstr "" "Bitte beachten, dass das Importieren von Daten im Hauptzweig stattfindet. " "Änderungen an Importquellen sind nicht erlaubt, während man sich in einem " "anderen Konfigurationszweig befindet. Für die volle Funktionalität bitte %s " "deaktivieren" #: ../../../../application/forms/SettingsForm.php:23 msgid "" "Please only change those settings in case you are really sure that you are " "required to do so. Usually the defaults chosen by the Icinga Director should " "make a good fit for your environment." msgstr "" "Diese Einstellungen sollten nur dann geändert werden, wenn es als unbedingt " "nötig erachtet wird. Für gewöhnlich sollten die vom Icinga Director " "gewählten Standardwerte für Umgebungen jeglicher Art passend sein." #: ../../../../application/forms/SyncRuleForm.php:31 msgid "Please provide a rule name" msgstr "Bitte einen Regelnamen angeben" #: ../../../../library/Director/PropertyModifier/PropertyModifierSubstring.php:17 #: ../../../../library/Director/PropertyModifier/PropertyModifierSubstring.php:27 #, php-format msgid "Please see %s for detailled instructions of how start and end work" msgstr "" "Siehe %s für eine detaillierte Anleitung, wie Beginn und Ende funktionieren" #: ../../../../application/forms/ImportRowModifierForm.php:32 msgid "" "Please start typing for a list of suggestions. Dots allow you to access " "nested properties: column.some.key. Such nested properties cannot be " "modified in-place, but you can store the modified value to a new \"target " "property\"" msgstr "" "Für eine Liste von Vorschlägen bitte mit dem Tippen beginnen. Punkte " "erlauben es, verschachtelte Eigenschaften anzusprechen: column.some.key. " "Solche verschachtelten EIgenschaften können nicht an Ort und Stelle " "verändert werden, dafür lässt sich der modifizierte Wert aber in eine neue " "\"Zieleigenschaft\" schreiben" #: ../../../../application/forms/IcingaCommandForm.php:35 msgid "" "Plugin Check commands are what you need when running checks agains your " "infrastructure. Notification commands will be used when it comes to notify " "your users. Event commands allow you to trigger specific actions when " "problems occur. Some people use them for auto-healing mechanisms, like " "restarting services or rebooting systems at specific thresholds" msgstr "" "Plugin-Check-Kommandos werden benötigt, um Infrastruktur zu prüfen. Mit " "Benachrichtigungskommandos werden Benutzer benachrichtigt. Event-Kommandos " "führen bestimmte Aktionen aus, wenn Probleme auftreten. Sie werden manchmal " "für Selbstheilungsmechanismen verwendet, wie das Neustarten von Services " "oder das Neustarten von Systemen beim Überschreiten bestimmter Schwellwerte" #: ../../../../application/forms/IcingaCommandForm.php:20 msgid "Plugin commands" msgstr "Plugin-Kommandos" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:50 #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:65 msgid "Policy" msgstr "Richtlinie" #: ../../../../application/forms/IcingaEndpointForm.php:36 #: ../../../../application/forms/KickstartForm.php:145 msgid "Port" msgstr "Port" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:41 #: ../../../../application/forms/IcingaCommandArgumentForm.php:67 msgid "Position" msgstr "Position" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:30 msgid "Position Type" msgstr "Positionstyp" #: ../../../../application/controllers/SchemaController.php:17 msgid "PostgreSQL schema" msgstr "PostgreSQL Schema" #: ../../../../application/forms/IcingaTimePeriodForm.php:76 msgid "Prefer includes" msgstr "Includes bevorzugen" #: ../../../../library/Director/Dashboard/BranchesDashboard.php:34 msgid "Prepare your configuration in a safe Environment" msgstr "Bereite Konfiguration in einer geschützten Umgebung vor" #: ../../../../library/Director/Dashboard/Dashlet/BasketDashlet.php:19 msgid "Preserve specific configuration objects in a specific state" msgstr "" "Bestimmte Konfigurationsobjekte in einem bestimmten Zustand aufbewahren" #: ../../../../library/Director/Web/Tabs/ImportsourceTabs.php:49 #: ../../../../library/Director/Web/Tabs/SyncRuleTabs.php:33 #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:83 msgid "Preview" msgstr "Vorschau" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:23 msgid "Problem" msgstr "Problem" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:27 msgid "Problem handling" msgstr "Problembehandlung" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:94 msgid "Process List" msgstr "Prozessliste" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1455 msgid "Process performance data" msgstr "Performancedaten verarbeiten" #: ../../../../library/Director/Import/ImportSourceLdap.php:70 #: ../../../../library/Director/Web/Tabs/SyncRuleTabs.php:39 #: ../../../../application/controllers/DataController.php:328 msgid "Properties" msgstr "Eigenschaften" #: ../../../../library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:61 #: ../../../../library/Director/Web/Table/PropertymodifierTable.php:129 #: ../../../../library/Director/Web/Table/PropertymodifierTable.php:132 #: ../../../../application/forms/ImportRowModifierForm.php:30 msgid "Property" msgstr "Eigenschaft" #: ../../../../application/controllers/ImportsourceController.php:251 #, php-format msgid "Property modifiers: %s" msgstr "Eigenschaftsmodifikatoren: %s" #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:88 msgid "Protected" msgstr "Geschützt" #: ../../../../library/Director/Import/ImportSourceRestApi.php:128 msgid "Protocol" msgstr "Protokoll" #: ../../../../application/controllers/InspectController.php:89 msgid "Prototypes (methods)" msgstr "Prototypen (Methoden)" #: ../../../../library/Director/Dashboard/Dashlet/DatalistDashlet.php:13 msgid "Provide Data Lists" msgstr "Datenlisten bereitstellen" #: ../../../../library/Director/Dashboard/Dashlet/DatalistDashlet.php:19 msgid "Provide data lists to make life easier for your users" msgstr "Datenlisten erleichtern Anwendern die Arbeit" #: ../../../../library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:20 msgid "Provide templates for your TimePeriod objects." msgstr "Vorlagen für Benachrichtigungen bereitstellen." #: ../../../../library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:20 msgid "Provide templates for your User objects." msgstr "Vorlagen für Benutzer-Objekte bereitstellen." #: ../../../../library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:20 msgid "Provide templates for your notifications." msgstr "Vorlagen für Benachrichtigungen bereitstellen." #: ../../../../library/Director/Import/ImportSourceRestApi.php:244 msgid "Proxy" msgstr "Proxy" #: ../../../../library/Director/Import/ImportSourceRestApi.php:260 msgid "Proxy Address" msgstr "Proxyadresse" #: ../../../../library/Director/Import/ImportSourceRestApi.php:278 msgid "Proxy Password" msgstr "Proxykennwort" #: ../../../../library/Director/Import/ImportSourceRestApi.php:268 msgid "Proxy Username" msgstr "Proxybenutzer" #: ../../../../application/forms/SyncRuleForm.php:70 msgid "Purge" msgstr "Bereinigen" #: ../../../../application/forms/SyncRuleForm.php:82 msgid "Purge Action" msgstr "Aktion beim Bereinigen" #: ../../../../library/Director/Import/ImportSourceLab.php:44 msgid "RAW JSON data" msgstr "Rohe JSON-Daten" #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:119 msgid "Ranges" msgstr "Bereiche" #: ../../../../application/forms/DeployConfigForm.php:32 msgid "Re-deploy now" msgstr "Jetzt erneut ausrollen" #: ../../../../application/forms/IcingaServiceForm.php:143 msgid "Reactivate" msgstr "Reaktivieren" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:24 msgid "Recovery" msgstr "Erholung" #: ../../../../application/forms/IcingaGenerateApiKeyForm.php:22 msgid "Regenerate Self Service API key" msgstr "Selbstbedienungs-API-Schlüssel neu generieren" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexReplace.php:13 msgid "Regex pattern" msgstr "Regex-Muster" #: ../../../../application/forms/IcingaHostSelfServiceForm.php:56 msgid "Register" msgstr "Registrieren" #: ../../../../library/Director/Web/SelfService.php:62 msgid "Registered Agent" msgstr "Registrierter Agent" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:34 #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:32 msgid "Regular Expression" msgstr "Regulärer Ausdruck" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexReplace.php:41 msgid "Regular expression based replacement" msgstr "Ersatz, basierend auf dem regulären Ausdruck" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexSplit.php:16 msgid "Regular expression pattern to split the string (e.g. /\\s+/ or /[,;]/)" msgstr "" "Regulärer Ausdruck anhand dessen eine String aufgeteilt werden soll (z.B. /" "\\s+/ oder /[,;]/)" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:58 msgid "Reject matching elements" msgstr "Übereinstimmende Elemente ablehnen" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:17 msgid "Reject or keep rows based on property value" msgstr "Die ganze Zeile abhängig vom Eigenschaftswert abweisen" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:72 msgid "Reject the whole row" msgstr "Verwerfe die ganze Zeile" #: ../../../../application/forms/IcingaDependencyForm.php:268 msgid "Related Objects" msgstr "Verwandte Objekte" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:532 msgid "Remark" msgstr "Anmerkung" #: ../../../../library/Director/Web/Table/IcingaServiceSetServiceTable.php:238 msgid "Remove" msgstr "Entfernen" #: ../../../../library/Director/Web/Table/IcingaServiceSetServiceTable.php:240 #, php-format msgid "Remove \"%s\" from this host" msgstr "\"%s\" von diesem Host entfernen" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:524 msgid "Remove this entry" msgstr "Diesen Eintrag entfernen" #: ../../../../application/views/helpers/FormDataFilter.php:507 msgid "Remove this part of your filter" msgstr "Diesen Teil des Filters entfernen" #: ../../../../application/forms/DirectorDatafieldForm.php:96 msgid "Rename related vars" msgstr "Zugehörige Variablen umbenennen" #: ../../../../application/forms/IcingaCommandForm.php:86 msgid "Render as string" msgstr "Als String rendern" #: ../../../../application/controllers/ConfigController.php:73 msgid "Render config" msgstr "Konfiguration erstellen" #: ../../../../application/forms/IcingaCommandForm.php:77 msgid "Render the command as a plain string instead of an array." msgstr "Rendere das Kommando als reinen String und nicht als Array." #: ../../../../application/controllers/ConfigController.php:311 msgid "Rendered file" msgstr "Erzeugte Datei" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:98 #, php-format msgid "Rendered in %0.2fs, deployed in %0.2fs" msgstr "Erstellt in %0.2fs, ausgerollt in %0.2fs" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:539 #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:544 msgid "Rendering" msgstr "Erstellen" #: ../../../../application/forms/IcingaCommandArgumentForm.php:107 msgid "Repeat key" msgstr "Schlüssel wiederholen" #: ../../../../application/forms/SyncRuleForm.php:63 msgid "Replace" msgstr "Ersetzen" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexReplace.php:21 msgid "Replacement" msgstr "Ersatz" #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:86 #: ../../../../library/Director/Web/Table/Dependency/DependencyInfoTable.php:38 #: ../../../../application/forms/IcingaCommandArgumentForm.php:124 msgid "Required" msgstr "Benötigt" #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:90 msgid "Resolved" msgstr "Aufgelöst" #: ../../../../application/forms/RestoreBasketForm.php:58 #: ../../../../application/controllers/BasketController.php:232 msgid "Restore" msgstr "Wiederherstellen" #: ../../../../application/forms/RestoreObjectForm.php:17 msgid "Restore former object" msgstr "Vorheriges Objekt wiederherstellen" #: ../../../../application/forms/RestoreBasketForm.php:52 msgid "Restore to this target Director DB" msgstr "In dieser Director-Ziel-DB wiederherstellen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1383 msgid "Retry interval" msgstr "Wiederholungsintervall" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1385 msgid "" "Retry interval, will be applied after a state change unless the next hard " "state is reached" msgstr "" "Wiederholungsintervall, wird nach einem Statuswechsel verwendet, bis der " "nächste Hard Status erreicht wurde" #: ../../../../library/Director/PropertyModifier/PropertyModifierMap.php:36 msgid "Return custom default value" msgstr "Benutzerdefinierten Wert zurückgeben" #: ../../../../library/Director/PropertyModifier/PropertyModifierMap.php:35 msgid "Return lookup key unmodified" msgstr "Suchschlüssel unverändert zurück geben" #: ../../../../library/Director/Web/Widget/InspectPackages.php:69 msgid "Root Zone" msgstr "Rootzone" #: ../../../../library/Director/Web/Table/SyncruleTable.php:45 #: ../../../../application/forms/SyncRuleForm.php:30 msgid "Rule name" msgstr "Regelname" #: ../../../../library/Director/Job/ImportJob.php:119 msgid "Run all imports at once" msgstr "Alle Importe gleichzeitig ausführen" #: ../../../../library/Director/Job/SyncJob.php:125 msgid "Run all rules at once" msgstr "Alle Regeln gleichzeitig ausführen" #: ../../../../library/Director/Job/ImportJob.php:92 #: ../../../../application/forms/KickstartForm.php:189 msgid "Run import" msgstr "Import ausführen" #: ../../../../application/forms/DirectorJobForm.php:46 msgid "Run interval" msgstr "Laufintervall" #: ../../../../application/forms/IcingaServiceForm.php:682 msgid "Run on agent" msgstr "Auf Agent ausführen" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:76 msgid "Running with systemd" msgstr "Läuft mit systemd" #: ../../../../library/Director/Import/ImportSourceRestApi.php:251 msgid "SOCKS5 proxy" msgstr "SOCKS5 Proxy" #: ../../../../library/Director/Dashboard/Dashlet/JobDashlet.php:30 msgid "" "Schedule and automate Import, Syncronization, Config Deployment, " "Housekeeping and more" msgstr "" "Import, Synchronisation, Ausrollen der Konfiguration, Bereinigung und mehr " "planen und automatisieren" #: ../../../../library/Director/Dashboard/NotificationsDashboard.php:14 #: ../../../../library/Director/Dashboard/UsersDashboard.php:15 msgid "Schedule your notifications" msgstr "Benachrichtigungen planen" #: ../../../../library/Director/Dashboard/Dashlet/NotificationsDashlet.php:21 msgid "" "Schedule your notifications. Define who should be notified, when, and for " "which kind of problem" msgstr "" "Benachrichtigungen planen. Wer soll wann benachrichtigt werden, wofür, und " "für welche Art von Problemen" #: ../../../../application/forms/SyncRuleForm.php:23 msgid "Scheduled Downtime" msgstr "Geplante Downtime" #: ../../../../library/Director/Dashboard/Dashlet/ScheduledDowntimeApplyDashlet.php:15 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:48 msgid "Scheduled Downtimes" msgstr "Geplante Downtimes" #: ../../../../application/forms/SettingsForm.php:177 msgid "" "Script or tool to call when activating a new configuration stage. (e.g. " "sudo /usr/local/bin/icinga-director-activate) (name of the stage will be the " "argument for the script)" msgstr "" "Skript oder Tools welches beim Aktivieren einer neuen Konfigurationsphase " "ausgeführt werden soll. (z.B. sudo /usr/local/bin/icinga-director-activate) " "(der Name der Konfiguration wird dem Skript als Argument mitgegeben)" #: ../../../../application/controllers/SettingsController.php:43 #: ../../../../application/controllers/SelfServiceController.php:107 msgid "Self Service" msgstr "Selbstbedienung" #: ../../../../application/controllers/SelfServiceController.php:108 msgid "Self Service - Host Registration" msgstr "Selbstbedienung - Host-Registrierung" #: ../../../../library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:13 #: ../../../../library/Director/Web/SelfService.php:167 msgid "Self Service API" msgstr "Selbstbedienungs-API" #: ../../../../application/controllers/SettingsController.php:44 msgid "Self Service API - Global Settings" msgstr "Selbstbedienungs-API - Globale Einstellungen" #: ../../../../application/forms/SelfServiceSettingsForm.php:298 msgid "Self Service Settings have been stored" msgstr "Selbstbedienungseinstellungen wurden gespeichert" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1443 #: ../../../../application/forms/IcingaUserForm.php:89 msgid "Send notifications" msgstr "Benachrichtigungen senden" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:79 msgid "Sent to" msgstr "Senden an" #: ../../../../library/Director/TranslationDummy.php:14 #: ../../../../application/forms/IcingaServiceVarForm.php:15 #: ../../../../application/forms/SyncRuleForm.php:14 #: ../../../../application/forms/IcingaAddServiceForm.php:105 msgid "Service" msgstr "Service" #: ../../../../library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:13 msgid "Service Apply Rules" msgstr "Service Apply-Regeln" #: ../../../../application/forms/SyncRuleForm.php:15 msgid "Service Group" msgstr "Servicegruppe" #: ../../../../library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:13 #: ../../../../application/forms/BasketForm.php:23 msgid "Service Groups" msgstr "Servicegruppen" #: ../../../../library/Director/Web/Table/ObjectsTableService.php:107 msgid "Service Name" msgstr "Servicename" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:61 #: ../../../../application/forms/SyncRuleForm.php:16 msgid "Service Set" msgstr "Service-Set" #: ../../../../application/forms/RemoveLinkForm.php:55 msgid "Service Set has been removed" msgstr "Service-Set wurde entfernt" #: ../../../../library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:13 #: ../../../../library/Director/Web/Table/CustomvarVariantsTable.php:60 #: ../../../../library/Director/Web/Table/CustomvarTable.php:45 #: ../../../../application/forms/BasketForm.php:26 msgid "Service Sets" msgstr "Service-Sets" #: ../../../../application/forms/IcingaAddServiceForm.php:90 msgid "Service Template" msgstr "Service-Vorlage" #: ../../../../application/forms/BasketForm.php:24 msgid "Service Template Choice" msgstr "Auswahlmöglichkeit für Service-Vorlagen" #: ../../../../library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:13 #: ../../../../application/forms/BasketForm.php:25 msgid "Service Templates" msgstr "Service-Vorlagen" #: ../../../../application/forms/SelfServiceSettingsForm.php:179 msgid "Service User" msgstr "Dienst-Benutzeraccount" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:60 msgid "Service groups" msgstr "Servicegruppen" #: ../../../../application/forms/IcingaServiceForm.php:657 msgid "" "Service groups that should be directly assigned to this service. " "Servicegroups can be useful for various reasons. They are helpful to " "provided service-type specific view in Icinga Web 2, either for custom " "dashboards or as an instrument to enforce restrictions. Service groups can " "be directly assigned to single services or to service templates." msgstr "" "Servicegruppen, die diesem Service direkt zugeordnet werden sollen. " "Servicegruppen können für diverse Anwendungen praktisch sein, wie auf " "Service-Typ eingeschränkte Ansichten in Icinga Web 2, für benutzerdefinierte " "Dashboards oder zum Umsetzen von Einschränkungen. Servicegruppen können " "direkt einem einzelnen Service zugeordnet werden oder Service-Vorlagen." #: ../../../../library/Director/Web/Table/IcingaHostAppliedForServiceTable.php:102 msgid "Service name" msgstr "Servicename" #: ../../../../library/Director/Objects/IcingaService.php:668 #: ../../../../application/controllers/SuggestController.php:260 msgid "Service properties" msgstr "Service-Eigenschaften" #: ../../../../application/forms/IcingaServiceSetForm.php:88 #: ../../../../application/forms/IcingaAddServiceSetForm.php:86 msgid "Service set" msgstr "Service-Set" #: ../../../../application/forms/IcingaServiceSetForm.php:29 msgid "Service set name" msgstr "Service-Set Name" #: ../../../../application/controllers/TemplatechoiceController.php:25 msgid "Service template choice" msgstr "Auswahlmöglichkeite für Service-Vorlagen" #: ../../../../application/controllers/TemplatechoicesController.php:24 msgid "Service template choices" msgstr "Auswahlmöglichkeiten für Service-Vorlagen" #: ../../../../application/controllers/ServiceController.php:301 msgid "ServiceSet" msgstr "Service-Set" #: ../../../../application/forms/IcingaServiceGroupForm.php:14 msgid "Servicegroup" msgstr "Servicegruppe" #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:41 msgid "Servicegroups" msgstr "Servicegruppen" #: ../../../../library/Director/Web/Table/IcingaServiceSetServiceTable.php:168 #: ../../../../library/Director/Web/Table/IcingaAppliedServiceTable.php:32 #: ../../../../library/Director/Web/Table/ObjectsTableService.php:103 msgid "Servicename" msgstr "Servicename" #: ../../../../configuration.php:125 #: ../../../../library/Director/IcingaConfig/StateFilterSet.php:23 #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:59 #: ../../../../library/Director/DataType/DataTypeDictionary.php:60 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:40 #: ../../../../library/Director/Web/Table/CustomvarVariantsTable.php:59 #: ../../../../library/Director/Web/Table/CustomvarTable.php:44 #: ../../../../library/Director/Web/Tabs/ObjectTabs.php:74 #: ../../../../application/forms/IcingaNotificationForm.php:91 #: ../../../../application/forms/IcingaDependencyForm.php:101 #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:90 #: ../../../../application/controllers/ServiceController.php:284 #: ../../../../application/controllers/ServiceController.php:305 msgid "Services" msgstr "Services" #: ../../../../application/controllers/ServicesetController.php:64 #, php-format msgid "Services in this set: %s" msgstr "Services in diesem Set: %s" #: ../../../../application/controllers/HostController.php:273 #, php-format msgid "Services on %s" msgstr "Services auf %s" #: ../../../../application/controllers/HostController.php:190 #, php-format msgid "Services: %s" msgstr "Services: %s" #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:42 msgid "Servicesets" msgstr "Service-Sets" #: ../../../../library/Director/PropertyModifier/PropertyModifierSetValue.php:13 msgid "Set a specific value" msgstr "Spezifischen Wert setzen" #: ../../../../application/forms/ImportRowModifierForm.php:68 #: ../../../../application/forms/SyncPropertyForm.php:84 msgid "Set based on filter" msgstr "Basierend auf Filter setzen" #: ../../../../library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:44 #: ../../../../library/Director/PropertyModifier/PropertyModifierSetValue.php:33 msgid "Set false" msgstr "Auf \"false\" setzen" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:30 #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:17 #: ../../../../library/Director/PropertyModifier/PropertyModifierParseURL.php:39 #: ../../../../library/Director/PropertyModifier/PropertyModifierJsonDecode.php:25 #: ../../../../library/Director/PropertyModifier/PropertyModifierDnsRecords.php:34 #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByName.php:17 msgid "Set no value (null)" msgstr "Keinen Wert setzen (null)" #: ../../../../library/Director/PropertyModifier/PropertyModifierMap.php:34 #: ../../../../library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:42 #: ../../../../library/Director/PropertyModifier/PropertyModifierSetValue.php:31 msgid "Set null" msgstr "Auf \"null\" setzen" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexReplace.php:34 msgid "Set the value to NULL" msgstr "Setze den Wert auf NULL" #: ../../../../library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:43 #: ../../../../library/Director/PropertyModifier/PropertyModifierSetValue.php:32 msgid "Set true" msgstr "Auf \"true\" setzen" #: ../../../../library/Director/Web/Tabs/ObjectsTabs.php:83 msgid "Sets" msgstr "Sets" #: ../../../../application/forms/IcingaHostForm.php:118 msgid "" "Setting a command endpoint allows you to force host checks to be executed by " "a specific endpoint. Please carefully study the related Icinga documentation " "before using this feature" msgstr "" "Das Setzen eines Kommandoenpunkts erlaubt das Ausführen von Host-Checks auf " "einem bestimmten Endpoint. Bitte nicht verwenden, ohne die entsprechende " "Icinga-Dokumentation gelesen zu haben" #: ../../../../library/Director/Web/SelfService.php:97 #: ../../../../application/controllers/ConfigController.php:241 msgid "Settings" msgstr "Einstellungen" #: ../../../../application/forms/SettingsForm.php:230 msgid "Settings have been stored" msgstr "Einstellungen wurden gespeichert" #: ../../../../library/Director/Web/SelfService.php:90 msgid "Share this Template for Self Service API" msgstr "Für die Selbstbedienungs-API freigeben" #: ../../../../library/Director/Web/SelfService.php:88 msgid "Shared for Self Service API" msgstr "Für die Selbstbedienungs-API freigegeben" #: ../../../../library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:21 msgid "Should all the other characters be lowercased first?" msgstr "" "Sollen alle anderen Zeichen zuvor in Kleinbuchstaben umgewandelt werden?" #: ../../../../application/controllers/HostController.php:570 msgid "Show" msgstr "Zeigen" #: ../../../../application/controllers/BasketController.php:226 msgid "Show Basket" msgstr "Basket anzeigen" #: ../../../../application/forms/DeployFormsBug7530.php:101 #, php-format msgid "Show Issue %s on GitHub" msgstr "Issue %s auf GitHub anzeigen" #: ../../../../library/Director/Web/Widget/AdditionalTableActions.php:76 msgid "Show SQL" msgstr "SQL anzeigen" #: ../../../../library/Director/Web/Table/ApplyRulesTable.php:151 msgid "Show affected Objects" msgstr "Betroffene Objekte zeigen" #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:97 msgid "Show all actions" msgstr "Alle Aktionen anzeigen" #: ../../../../library/Director/Web/Form/IplElement/ExtensibleSetElement.php:501 msgid "Show available options" msgstr "Verfügbare Optionen anzeigen" #: ../../../../application/forms/IcingaObjectFieldForm.php:132 msgid "Show based on filter" msgstr "Basierend auf Filter zeigen" #: ../../../../library/Director/Web/Table/ActivityLogTable.php:231 #: ../../../../library/Director/Web/Table/BranchActivityTable.php:87 msgid "Show details related to this change" msgstr "Details zu dieser Änderung zeigen" #: ../../../../library/Director/Web/ObjectPreview.php:52 msgid "Show normal" msgstr "Normal anzeigen" #: ../../../../library/Director/Web/ObjectPreview.php:61 msgid "Show resolved" msgstr "Aufgelöst anzeigen" #: ../../../../library/Director/Web/Widget/BranchedObjectsHint.php:28 #, php-format msgid "" "Showing a branched view, with potential changes being visible only in this %s" msgstr "" "Zeige eine abgezweigte Ansicht, mit potentiell nur in diesem %s sichtbaren " "Änderungen" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:33 #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:31 msgid "Simple match with wildcards (*)" msgstr "Einfache Suche mit Platzhaltern (*)" #: ../../../../application/controllers/BasketController.php:354 msgid "Single Object Diff" msgstr "Einfacher Objekt-Diff" #: ../../../../library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:13 msgid "Single Services" msgstr "Einzelne Services" #: ../../../../library/Director/Web/Table/GeneratedConfigFileTable.php:86 msgid "Size" msgstr "Größe" #: ../../../../application/forms/IcingaCommandArgumentForm.php:115 msgid "Skip key" msgstr "Schlüssel überspringen" #: ../../../../library/Director/PropertyModifier/PropertyModifierSkipDuplicates.php:13 msgid "Skip row if this value appears more than once" msgstr "Zeile überspringen wenn dieser Wert mehr als einmal vorkommt" #: ../../../../application/controllers/BasketController.php:272 #: ../../../../application/controllers/BasketController.php:383 msgid "Snapshot" msgstr "Snapshot" #: ../../../../library/Director/Web/Table/BasketTable.php:32 #: ../../../../application/controllers/BasketController.php:38 #: ../../../../application/controllers/BasketController.php:161 msgid "Snapshots" msgstr "Snapshots" #: ../../../../library/Director/Import/ImportSourceRestApi.php:194 msgid "Something like https://api.example.com/rest/v2/objects" msgstr "So etwas wie https://api.example.com/rest/v2/objects" #: ../../../../application/forms/SyncPropertyForm.php:183 msgid "Source Column" msgstr "Quellspalte" #: ../../../../application/forms/SyncPropertyForm.php:213 msgid "Source Expression" msgstr "Quellausdruck" #: ../../../../application/forms/SyncPropertyForm.php:38 msgid "Source Name" msgstr "Quellenname" #: ../../../../application/forms/SelfServiceSettingsForm.php:114 msgid "Source Path" msgstr "Quellpfad" #: ../../../../application/forms/ImportSourceForm.php:33 msgid "Source Type" msgstr "Quellentyp" #: ../../../../application/forms/SyncPropertyForm.php:160 msgid "Source columns" msgstr "Quellspalten" #: ../../../../library/Director/Web/Table/SyncpropertyTable.php:62 msgid "Source field" msgstr "Quellenfeld" #: ../../../../library/Director/Web/Table/ImportrunTable.php:30 #: ../../../../library/Director/Web/Table/ImportsourceTable.php:18 #: ../../../../library/Director/Web/Table/SyncpropertyTable.php:61 msgid "Source name" msgstr "Quellenname" #: ../../../../application/forms/SyncPropertyForm.php:356 msgid "Special properties" msgstr "Spezielle Eigenschaften" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:36 msgid "Specific Element (by key name)" msgstr "Spezifisches Element (nach Schlüsselname)" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:35 msgid "Specific Element (by position)" msgstr "Spezifisches Element (nach Position)" #: ../../../../library/Director/Import/ImportSourceRestApi.php:152 msgid "" "Specify headers in text format \"Header: Value\", each header on a new line." msgstr "" "Header im Textformat angeben \"Header: Wert\", jeden Header auf einer Zeile." #: ../../../../library/Director/PropertyModifier/PropertyModifierTrim.php:30 msgid "" "Specify the characters that trim should remove.Default is: \" \\t\\n\\r" "\\0\\x0B\"" msgstr "" "Zeichen welche von Trim entfernt werden sollen. Standard: \" \\t\\n\\r" "\\0\\x0B\"" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:88 msgid "Stage name" msgstr "Phasenname" #: ../../../../library/Director/Web/Widget/InspectPackages.php:50 #, php-format msgid "Stages in Package: %s" msgstr "Phasen in Paket: %s" #: ../../../../library/Director/Web/Widget/SyncRunDetails.php:28 msgid "Start time" msgstr "Startzeit" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:89 msgid "Startup" msgstr "Start" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:163 msgid "Startup Log" msgstr "Start-Log" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:72 msgid "Startup Time" msgstr "Startzeit" #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:84 msgid "State" msgstr "Zustand" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1691 msgid "State and transition type filters" msgstr "Status- und Übergangstypen-Filter" #: ../../../../library/Director/IcingaConfig/TypeFilterSet.php:22 msgid "State changes" msgstr "Zustandsänderungen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1666 msgid "States" msgstr "Zustände" #: ../../../../library/Director/Web/Widget/DeployedConfigInfoHeader.php:91 msgid "Statistics" msgstr "Statistiken" #: ../../../../application/controllers/InspectController.php:42 #: ../../../../application/controllers/InspectController.php:143 msgid "Status" msgstr "Zustand" #: ../../../../library/Director/Web/SelfService.php:127 msgid "Stop sharing this Template" msgstr "Diese Vorlage nicht mehr bereitstellen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:509 #: ../../../../application/forms/SettingsForm.php:139 msgid "Store" msgstr "Speichern" #: ../../../../application/forms/KickstartForm.php:36 msgid "Store configuration" msgstr "Konfiguration speichern" #: ../../../../library/Director/DataType/DataTypeDatalist.php:152 msgid "Strict, list values only" msgstr "Strikt, nur Listeneinträge" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:79 #: ../../../../library/Director/DataType/DataTypeSqlQuery.php:76 #: ../../../../library/Director/DataType/DataTypeDatalist.php:132 #: ../../../../application/forms/IcingaCommandArgumentForm.php:38 #: ../../../../application/forms/IcingaCommandArgumentForm.php:77 msgid "String" msgstr "Zeichenkette" #: ../../../../application/views/helpers/FormDataFilter.php:534 msgid "Strip this operator, preserve child nodes" msgstr "Diesen Operator entfernen, Kind-Knoten beibehalten" #: ../../../../library/Director/Web/Form/QuickForm.php:221 msgid "Submit" msgstr "Absenden" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:140 msgid "Succeeded" msgstr "Gelungen" #: ../../../../library/Director/Field/FormFieldSuggestion.php:78 msgid "Suggested fields" msgstr "Vorgeschlagene Felder" #: ../../../../library/Director/Web/ActionBar/TemplateActionBar.php:37 msgid "Switch to Table view" msgstr "Zur Tabellenansicht wechseln" #: ../../../../library/Director/Web/ActionBar/TemplateActionBar.php:36 msgid "Switch to Tree view" msgstr "Zur Baumansicht wechseln" #: ../../../../application/controllers/SyncruleController.php:619 #, php-format msgid "Sync \"%s\": %s" msgstr "\"%s\": \"%s\" synchronisieren" #: ../../../../application/controllers/BranchController.php:44 #: ../../../../application/controllers/SyncruleController.php:203 msgid "Sync Preview" msgstr "Synchronisationsvorschau" #: ../../../../application/controllers/SyncruleController.php:155 msgid "Sync Properties" msgstr "Synchronisationseigenschaften" #: ../../../../application/forms/BasketForm.php:36 msgid "Sync Rules" msgstr "Synchronisationsregeln" #: ../../../../application/controllers/SyncruleController.php:651 msgid "Sync history" msgstr "Synchronisationshistorie" #: ../../../../application/forms/SyncRuleForm.php:98 #, php-format msgid "" "Sync only part of your imported objects with this rule. Icinga Web 2 filter " "syntax is allowed, so this could look as follows: %s" msgstr "" "Nur einen Teil der importierten Objekte mit dieser Regel synchronisieren. " "Die Icinga Web 2 Filter Syntax kann verwendet werden. z.B: %s" #: ../../../../application/controllers/SyncruleController.php:584 msgid "Sync properties" msgstr "Synchronisationseigenschaften" #: ../../../../library/Director/Web/Tabs/SyncRuleTabs.php:29 #: ../../../../library/Director/Web/Tabs/SyncRuleTabs.php:50 #: ../../../../library/Director/Web/Tabs/ImportTabs.php:23 #: ../../../../application/controllers/SyncrulesController.php:25 #: ../../../../application/controllers/SyncruleController.php:543 msgid "Sync rule" msgstr "Synchronisationsregel" #: ../../../../application/controllers/SyncruleController.php:55 #: ../../../../application/controllers/SyncruleController.php:509 #, php-format msgid "Sync rule: %s" msgstr "Synchronisationsregel: %s" #: ../../../../application/forms/SyncRunForm.php:35 #, php-format msgid "Sync to Branch: %s" msgstr "" "In Branch s\n" "ynchronisieren: %s" #: ../../../../application/controllers/SyncruleController.php:63 msgid "Synchronization failed" msgstr "Synchronisation fehlgeschlagen" #: ../../../../library/Director/Job/SyncJob.php:80 msgid "Synchronization rule" msgstr "Synchronisationsregel" #: ../../../../library/Director/Dashboard/Dashlet/SyncDashlet.php:15 msgid "Synchronize" msgstr "Synchronisieren" #: ../../../../application/controllers/SyncruleController.php:128 #, php-format msgid "Synchronizing '%s'" msgstr "'%s' synchronisieren" #: ../../../../library/Director/Web/ActionBar/TemplateActionBar.php:30 msgid "Table" msgstr "Tabelle" #: ../../../../application/forms/RestoreBasketForm.php:51 msgid "Target DB" msgstr "Ziel-DB" #: ../../../../application/forms/IcingaCloneObjectForm.php:89 msgid "Target Host" msgstr "Zielhost" #: ../../../../application/forms/IcingaCloneObjectForm.php:80 msgid "Target Service Set" msgstr "Ziel-Service-Set" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:77 #: ../../../../library/Director/DataType/DataTypeSqlQuery.php:74 #: ../../../../library/Director/DataType/DataTypeDatalist.php:130 msgid "Target data type" msgstr "Zieldatentyp" #: ../../../../application/forms/ImportRowModifierForm.php:42 msgid "Target property" msgstr "Zieleigenschaft" #: ../../../../library/Director/DataType/DataTypeDictionary.php:86 #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1114 #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1118 #: ../../../../library/Director/Web/Controller/TemplateController.php:160 msgid "Template" msgstr "Vorlage" #: ../../../../library/Director/DataType/DataTypeDictionary.php:64 msgid "Template (Object) Type" msgstr "Vorlagentyp (Objekt)" #: ../../../../library/Director/Web/Table/TemplatesTable.php:52 msgid "Template Name" msgstr "Vorlagenname" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:16 msgid "Template name" msgstr "Vorlagenname" #: ../../../../library/Director/Web/Controller/TemplateController.php:117 #: ../../../../library/Director/Web/Controller/ObjectController.php:351 #, php-format msgid "Template: %s" msgstr "Vorlage: %s" #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:82 #: ../../../../library/Director/Web/Tree/TemplateTreeRenderer.php:43 #: ../../../../library/Director/Web/Table/DependencyTemplateUsageTable.php:10 #: ../../../../library/Director/Web/Table/TemplateUsageTable.php:23 #: ../../../../library/Director/Web/Table/NotificationTemplateUsageTable.php:10 #: ../../../../library/Director/Web/Table/HostTemplateUsageTable.php:10 #: ../../../../library/Director/Web/Table/ServiceTemplateUsageTable.php:10 #: ../../../../library/Director/Web/Tabs/ObjectsTabs.php:60 #: ../../../../application/forms/IcingaServiceForm.php:714 msgid "Templates" msgstr "Vorlagen" #: ../../../../application/forms/IcingaCloneObjectForm.php:34 msgid "Templates cannot be cloned in Configuration Branches" msgstr "Vorlagen können in Konfigurationszweigen nicht geklont werden" #: ../../../../application/forms/DeployFormsBug7530.php:116 msgid "Thanks, I'll verify this and come back later" msgstr "Danke, ich überprüfe das und komme wieder" #: ../../../../library/Director/Job/ImportJob.php:67 msgid "The \"Import\" job allows to run import actions at regular intervals" msgstr "" "Der \"Import\" Auftrag erlaubt das Ausführen von Importen in regelmäßigen " "Abständen" #: ../../../../library/Director/Job/SyncJob.php:65 msgid "The \"Sync\" job allows to run sync actions at regular intervals" msgstr "" "Der \"Sync\" Auftrag erlaubt das Ausführen von Synchronisationen in " "regelmäßigen Abständen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:664 #: ../../../../application/forms/IcingaTimePeriodRangeForm.php:84 #: ../../../../application/forms/IcingaScheduledDowntimeRangeForm.php:89 #, php-format msgid "The %s has successfully been stored" msgstr "%s wurde erfolgreich gespeichert" #: ../../../../library/Director/Job/ConfigJob.php:71 msgid "" "The Config job allows you to generate and eventually deploy your Icinga 2 " "configuration" msgstr "" "Der Auftrag \"Konfiguration\" erlaubt das Erstellen und eventuelle Ausrollen " "der Icinga 2 Konfiguration" #: ../../../../application/forms/IcingaUserForm.php:37 msgid "The Email address of the user." msgstr "Die E-Mail-Adresse des Benutzers." #: ../../../../library/Director/Job/HousekeepingJob.php:21 msgid "" "The Housekeeping job provides various task that keep your Director database " "fast and clean" msgstr "" "Der \"Bereinigen\" Auftrag bietet verschiedene Aktionen, die die Director-" "Datenbank schnell und sauber halten" #: ../../../../application/controllers/DaemonController.php:39 #, php-format msgid "" "The Icinga Director Background Daemon is not running. Please check our %s in " "case you need step by step instructions showing you how to fix this." msgstr "" "Der Icinga Director Hintergrunddienst läuft nicht. Um eine Schritt-für-" "Schritt-Anleitung hierzu anzuzeigen bitte unsere %s zu Rate ziehen." #: ../../../../application/controllers/SettingsController.php:38 msgid "" "The Icinga Director Self Service API allows your Hosts to register " "themselves. This allows them to get their Icinga Agent configured, installed " "and upgraded in an automated way." msgstr "" "Die Icinga Director Selbstbedienungs-API erlaubt es Hosts sich selbst zu " "registrieren. Auf diese Weise wird deren Icinga-Agent konfiguriert, " "installiert und automatisch aktualisiert." #: ../../../../application/forms/SettingsForm.php:45 msgid "" "The Icinga Package name Director uses to deploy it's configuration. This " "defaults to \"director\" and should not be changed unless you really know " "what you're doing" msgstr "" "Der Icinga Package-Name welchen der Director zum Ausrollen seiner " "Konfiguration benutzt. Für gewöhnlich ist das \"director\" und sollte nur " "geändert werden, wenn die Auswirkung dieser Anpassung bewusst ist" #: ../../../../library/Director/Import/ImportSourceLdap.php:72 msgid "" "The LDAP properties that should be fetched. This is required to be a comma-" "separated list like: \"cn, dnshostname, operatingsystem, sAMAccountName\"" msgstr "" "Die LDAP Eigenschaften, die geholt werden sollen. Muss eine Komma-separierte " "Liste sein, wie \"cn, dnshostname, operatingsystem, sAMAccountName\"" #: ../../../../application/forms/IcingaForgetApiKeyForm.php:31 #, php-format msgid "The Self Service API key for %s has been dropped" msgstr "Der Selbstbedienungs-API-Schlüssel für %s wurde verworfen" #: ../../../../application/forms/IcingaAddServiceSetForm.php:116 #, php-format msgid "The Service Set \"%s\" has been added to %d hosts" msgstr "Das Service-Set \"%s\" wurde zu %d Hosts hinzugefügt" #: ../../../../application/forms/IcingaCommandArgumentForm.php:173 #, php-format msgid "The argument %s has successfully been stored" msgstr "Das Argument %s wurde erfolgreich gespeichert" #: ../../../../application/forms/DirectorDatafieldForm.php:152 #: ../../../../application/forms/IcingaObjectFieldForm.php:88 msgid "" "The caption which should be displayed to your users when this field is shown" msgstr "Die Beschriftung welche Benutzern zu diesem Feld angezeigt werden soll" #: ../../../../application/forms/IcingaDependencyForm.php:234 msgid "The child host." msgstr "Der Kind-Host." #: ../../../../application/forms/IcingaCommandForm.php:61 msgid "" "The command Icinga should run. Absolute paths are accepted as provided, " "relative paths are prefixed with \"PluginDir + \", similar Constant prefixes " "are allowed. Spaces will lead to separation of command path and standalone " "arguments. Please note that this means that we do not support spaces in " "plugin names and paths right now." msgstr "" "Das Kommando, das Icinga ausführen soll. Absolute Pfade werden wie angegeben " "übernommen, relativen Pfaden wird ein \"PluginDir +\" vorangestellt, wobei " "ähnliche Konstanten als Prefix erlaubt sind. Leerzeichen können zur Teilung " "des Pfads zum Kommandos und eigenständigen Argumenten verwendet werden. Das " "bedeutet, das aktuell keine Leerzeichen in Plugin-Namen und Pfaden " "unterstützt werden." #: ../../../../application/forms/KickstartForm.php:165 msgid "The corresponding password" msgstr "Das entsprechende Passwort" #: ../../../../library/Director/PropertyModifier/PropertyModifierStripDomain.php:14 msgid "The domain name you want to be stripped" msgstr "Der Domänenname, der entfernt werden soll" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:18 msgid "The first (leftmost) CN" msgstr "Der erste (linkeste) CN" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:19 msgid "The first (leftmost) OU" msgstr "Die erste (linkeste) OU" #: ../../../../library/Director/Web/Controller/ObjectController.php:729 #: ../../../../application/controllers/ConfigController.php:444 #, php-format msgid "The following modifications are visible in this %s only..." msgstr "Die folgenden Änderungen sind nur in diesem %s sichtbar..." #: ../../../../application/forms/IcingaServiceForm.php:771 #, php-format msgid "The given properties have been stored for \"%s\"" msgstr "Die übergebenen Eigenschaften wurden für \"%s\" gespeichert" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1669 msgid "The host/service states you want to get notifications for" msgstr "" "Die Host/Service Status, für die Benachrichtigungen versandt werden sollen" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:21 msgid "The last (rightmost) OU" msgstr "Die letzte (rechteste) OU" #: ../../../../library/Director/Web/Widget/JobDetails.php:60 #, php-format msgid "The last attempt failed %s: %s" msgstr "Der letzte Versuch schlug %s fehl: %s" #: ../../../../library/Director/Web/Widget/JobDetails.php:55 #, php-format msgid "The last attempt succeeded %s" msgstr "Der letzte Versuch war %s erfolgreich" #: ../../../../library/Director/Dashboard/Dashlet/DeploymentDashlet.php:84 msgid "The last deployment did not succeed" msgstr "Das letzte Ausrollen war nicht erfolgreich" #: ../../../../library/Director/Dashboard/Dashlet/DeploymentDashlet.php:86 msgid "The last deployment is currently pending" msgstr "Das Ausrollen der Konfiguration ist im Gange" #: ../../../../application/forms/IcingaEndpointForm.php:42 msgid "The log duration time." msgstr "Die Dauer der Aufzeichnungen." #: ../../../../application/forms/IcingaUserForm.php:160 msgid "" "The name of a time period which determines when notifications to this User " "should be triggered. Not set by default." msgstr "" "Der Name des Zeitraumes, der angibt, wann Benachrichtigungen für diesen " "Benutzer ausgelöst werden sollen. Kein Default-Wert." #: ../../../../application/forms/IcingaNotificationForm.php:290 #: ../../../../application/forms/IcingaDependencyForm.php:143 msgid "" "The name of a time period which determines when this notification should be " "triggered. Not set by default." msgstr "" "Der Name des Zeitraumes, der angibt, wann diese Benachrichtigung ausgelöst " "werden soll. Kein Default-Wert." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1421 msgid "" "The name of a time period which determines when this object should be " "monitored. Not limited by default." msgstr "" "Der Name des Zeitraumes, der angibt, wann dieses Objekt überwacht wird. " "Standardmäßig nicht eingeschränkt." #: ../../../../application/forms/DirectorJobForm.php:62 msgid "" "The name of a time period within this job should be active. Supports only " "simple time periods (weekday and multiple time definitions)" msgstr "" "Der Name des Zeitraums innerhalb derer dieser Auftrag aktiv sein soll. " "Erlaubt nur einfache Zeiträume (Wochentag und mehrere Zeitangaben)" #: ../../../../application/forms/IcingaHostVarForm.php:16 msgid "The name of the host" msgstr "Der Name des Hosts" #: ../../../../application/forms/IcingaServiceVarForm.php:16 msgid "The name of the service" msgstr "Der Name des Service" #: ../../../../application/forms/IcingaNotificationForm.php:226 msgid "" "The notification interval (in seconds). This interval is used for active " "notifications. Defaults to 30 minutes. If set to 0, re-notifications are " "disabled." msgstr "" "Der Benachrichtigungsintervall (in Sekunden). Dieser Intervall wird für " "aktive Benachrichtigungen verwendet. Default-Wert ist 30 Minuten. Wird er " "auf 0 gesetzt, sind Benachrichtungswiederholungen deaktiviert." #: ../../../../library/Director/PropertyModifier/PropertyModifierBitmask.php:16 msgid "" "The numeric bitmask you want to apply. In case you have a hexadecimal or " "binary mask please transform it to a decimal number first. The result of " "this modifier is a boolean value, telling whether the given mask applies to " "the numeric value in your source column" msgstr "" "Die numerische Bitmaske welche angewandt werden soll. Hexadezimale und " "binäre Masken müssen zuvor in eine dezimale Zahl umgewandelt werden. Das " "Ergebnis ist ein boolescher Wert welcher angibt, ob die Maske auf den " "numerischen Wert in der Quellspalte zutrifft" #: ../../../../application/forms/IcingaUserForm.php:42 msgid "The pager address of the user." msgstr "Die Pageradresse des Benutzers." #: ../../../../application/forms/IcingaDependencyForm.php:202 msgid "" "The parent host. You might want to refer Host Custom Variables via $host." "vars.varname$" msgstr "" "Der Elternhost. Benutzerdefinierte Hosteigenschaften lassen sich via $host." "vars.varname$ referenzieren" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexReplace.php:15 msgid "" "The pattern you want to search for. This can be a regular expression like /" "^www\\d+\\./" msgstr "" "Das Muster, nach dem gesucht werden soll. Kann ein regulärer Ausdruck wie /" "^www\\d+\\./ sein" #: ../../../../application/forms/IcingaEndpointForm.php:37 msgid "The port of the endpoint." msgstr "Der Port des Endpunkts." #: ../../../../application/forms/KickstartForm.php:148 msgid "" "The port you are going to use. The default port 5665 will be used if none is " "set" msgstr "" "Der Port, der genutzt werden soll. Wird kein Wert gesetzt, gilt der Default-" "Wert 5665" #: ../../../../library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:64 msgid "The property to get from the row we found in the chosen Import Source" msgstr "" "Die Eigenschaft welche wir aus der Zeile die wir in der gewählten " "Importquelle gefunden haben extrahieren wollen" #: ../../../../application/forms/IcingaAddServiceForm.php:177 #, php-format msgid "The service \"%s\" has been added to %d hosts" msgstr "Der Service \"%s\" wurde zu %d Hosts hinzugefügt" #: ../../../../application/forms/IcingaAddServiceSetForm.php:88 msgid "The service Set that should be assigned" msgstr "Das Service-Set welches zugewiesen werden soll" #: ../../../../application/forms/IcingaServiceSetForm.php:90 msgid "The service set that should be assigned to this host" msgstr "Das Service-Set welches diesem Host zugewiesen werden soll" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1679 msgid "The state transition types you want to get notifications for" msgstr "" "Die Arten von Statusänderungen, für die Benachrichtigungen verschickt werden " "sollen" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexReplace.php:23 msgid "The string that should be used as a replacement" msgstr "Die Zeichenkette, die als Ersatz genutzt werden soll" #: ../../../../library/Director/PropertyModifier/PropertyModifierReplace.php:14 msgid "The string you want to search for" msgstr "Die Zeichenkette, nach der gesucht werden soll" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:56 msgid "" "The string/pattern you want to search for, use regular expression like /^www" "\\d+\\./" msgstr "" "Das Muster, nach dem gesucht werden soll. Kann ein regulärer Ausdruck wie /" "^www\\d+\\./ sein" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:46 msgid "" "The string/pattern you want to search for, use wildcard matches like www.* " "or *linux*" msgstr "" "Das Muster, nach dem gesucht werden soll, Platzhalter wie www.* oder *linux* " "sind möglich" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:41 msgid "" "The string/pattern you want to search for. Depends on the chosen method, use " "www.* or *linux* for wildcard matches and expression like /^www\\d+\\./ in " "case you opted for a regular expression" msgstr "" "Der String/das Muster nach dem gesucht werden soll. Abhängig von der " "gewählten Methode, benutze www.* oder *linux* für Platzhalter-basierte " "Suchen und Ausdrücken wie /^www\\d+\\./ falls Reguläre Ausdrücke bevorzugt " "wurden" #: ../../../../application/forms/DirectorDatafieldCategoryForm.php:25 msgid "" "The unique name of the category used for grouping your custom Data Fields." msgstr "" "Der eindeutige Kategoriebezeichner welcher zum Gruppieren der " "benutzerdefinierten Felder benutzt werden soll." #: ../../../../application/forms/SelfServiceSettingsForm.php:181 msgid "The user that should run the Icinga 2 service on Windows." msgstr "" "Der Benutzeraccount unter welchem der Icinga-2-Dienst unter Windows laufen " "soll." #: ../../../../application/forms/DirectorDatafieldForm.php:74 #, php-format msgid "" "There are %d objects with a related property. Should I also remove the \"%s" "\" property from them?" msgstr "" "Es gibt %d Objekte mit einer entsprechenden Eigenschaft. Soll der Wert für " "\"%s\" von all diesen entfernt werden?" #: ../../../../application/forms/DirectorDatafieldForm.php:118 #, php-format msgid "" "There are %d objects with a related property. Should I also rename the \"%s" "\" property to \"%s\" on them?" msgstr "" "Es gibt %d Objekte mit einer entsprechenden Eigenschaft. Soll auf all diesen " "die Variable \"%s\" nach \"%s\" umbenannt werden?" #: ../../../../application/forms/DeploymentLinkForm.php:67 #, php-format msgid "There are %d pending changes" msgstr "Es gibt %d noch nicht ausgerollte Änderungen" #: ../../../../application/forms/DeploymentLinkForm.php:80 #, php-format msgid "There are %d pending changes, %d of them applied to this object" msgstr "" "Es sind %d Änderungen ausständig, wovon %d auf dieses Objekt angewendet " "werden" #: ../../../../library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:90 #, php-format msgid "There are %d pending database migrations" msgstr "Es sind %d Datenbankmigrationen ausständig" #: ../../../../application/forms/IcingaObjectFieldForm.php:75 msgid "" "There are no data fields available. Please ask an administrator to create " "such" msgstr "" "Es sind keine Datenfelder verfügbar. Ein Administrator kann welche anlegen" #: ../../../../library/Director/Dashboard/Dashlet/DeploymentDashlet.php:92 msgid "There are no pending changes" msgstr "Es gibt keine anstehenden Änderungen" #: ../../../../application/forms/DeployConfigForm.php:34 msgid "There are no pending changes. Deploy anyway" msgstr "Es gibt keine anstehenden Änderungen. Dennoch ausrollen" #: ../../../../library/Director/Web/Widget/ImportSourceDetails.php:52 msgid "" "There are pending changes for this Import Source. You should trigger a new " "Import Run." msgstr "" "Es gibt ausstehende Änderungen für diese Importquelle. Ein neuer Importlauf " "sollte angestoßen werden." #: ../../../../application/controllers/SyncruleController.php:108 msgid "" "There are pending changes for this Sync Rule. You should trigger a new Sync " "Run." msgstr "" "Es gibt ausstehende Änderungen für diese Synchronisationsregel. Ein neuer " "Synchronisationslauf sollte angestoßen werden." #: ../../../../application/forms/KickstartForm.php:66 msgid "There are pending database migrations" msgstr "Es sind Datenbankmigrationen ausständig" #: ../../../../application/forms/DeploymentLinkForm.php:72 msgid "" "There has been a single change to this object, nothing else has been modified" msgstr "" "An diesem Objekt wurde eine einzelne Änderung vorgenommen. Nichts Anderes " "wurde verändert" #: ../../../../application/forms/DeploymentLinkForm.php:75 #, php-format msgid "" "There have been %d changes to this object, nothing else has been modified" msgstr "" "An diesem Objekt wurden %d Änderungen vorgenommen, nichts anderes wurde " "verändert" #: ../../../../application/forms/DeploymentLinkForm.php:64 msgid "There is a single pending change" msgstr "Es gibt eine einzelne ausstehende Änderung" #: ../../../../application/forms/DirectorJobForm.php:21 msgid "These are different available job types" msgstr "Verschiedene verfügbare Auftragstypen" #: ../../../../application/forms/ImportSourceForm.php:37 msgid "" "These are different data providers fetching data from various sources. You " "didn't find what you're looking for? Import sources are implemented as a " "hook in Director, so you might find (or write your own) Icinga Web 2 module " "fetching data from wherever you want" msgstr "" "Dies sind verschiedene Datenanbieter, die Daten von diversen Quellen holen. " "Falls der gesuchte Anbieter nicht dabei ist, kann ein weiteres (evtl. selbst " "geschriebenes) Icinga Web 2 Modul diese Funktionalität nachrüsten, da " "Importquellen als Hook in Director realisiert werden" #: ../../../../application/controllers/CommandController.php:76 #, php-format msgid "This Command is currently being used by %s" msgstr "Dieses Kommando wird gegenwärtig von %s benutzt" #: ../../../../application/controllers/CommandController.php:82 msgid "This Command is currently not in use" msgstr "Dieses Kommando wird gegenwärtig nicht benutzt" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:954 #, php-format msgid "This Command is still in use by %d other objects" msgstr "Dieses Kommando wird von %d anderen Objekten benutzt" #: ../../../../library/Director/Web/Widget/ImportSourceDetails.php:59 #, php-format msgid "This Import Source failed when last checked at %s: %s" msgstr "Diese Importquelle schlug bei der letzten Prüfung um %s fehl: %s" #: ../../../../library/Director/Web/Widget/ImportSourceDetails.php:67 #, php-format msgid "This Import Source has an invalid state: %s" msgstr "Diese Importquelle hat einen ungültigen Zustand: %s" #: ../../../../application/forms/ImportCheckForm.php:33 msgid "This Import Source provides modified data" msgstr "Diese Importquelle stellt veränderte Daten zur Verfügung" #: ../../../../library/Director/Web/Widget/ImportSourceDetails.php:42 #, php-format msgid "This Import Source was last found to be in sync at %s." msgstr "Diese Importquelle war zuletzt um %s syncron." #: ../../../../application/forms/IcingaServiceForm.php:138 msgid "This Service has been deactivated on this host" msgstr "Dieser Service wurde auf diesem Host deaktiviert" #: ../../../../application/controllers/SyncruleController.php:115 #, php-format msgid "This Sync Rule failed when last checked at %s: %s" msgstr "" "Diese Synchronisationsregel schlug bei der letzten Prüfung um %s fehl: %s" #: ../../../../application/controllers/SyncruleController.php:85 msgid "This Sync Rule has never been run before." msgstr "Diese Synchronisationsregel wurde noch nie ausgeführt." #: ../../../../application/controllers/SyncruleController.php:258 msgid "This Sync Rule is in sync and would currently not apply any changes" msgstr "" "Diese Sync-Regel ist synchron und würde aktuell keine Änderungen verursachen" #: ../../../../application/controllers/SyncruleController.php:97 #, php-format msgid "This Sync Rule was last found to be in Sync at %s." msgstr "Diese Synchronisationsregel war zuletzt synchron um %s." #: ../../../../application/forms/SyncPropertyForm.php:105 msgid "" "This allows to filter for specific parts within the given source expression. " "You are allowed to refer all imported columns. Examples: host=www* would set " "this property only for rows imported with a host property starting with \"www" "\". Complex example: host=www*&!(address=127.*|address6=::1)" msgstr "" "Erlaubt das Filtern nach bestimmten Teilen innerhalb des angegebenen " "Quellausdrucks. Alle importierten Spalten können angegeben werden. " "Beispiele: host=www* würde diese Eigenschaft nur für importierte Zeilen " "setzen, bei denen die Host Eigenschaft mit \"www\" beginnt. Komplexes " "Beispiel: host=www*&!(address=127.*|address6=::1)" #: ../../../../application/forms/ImportRowModifierForm.php:91 msgid "" "This allows to filter for specific parts within the given source expression. " "You are allowed to refer all imported columns. Examples: host=www* would set " "this property only for rows imported with a host property starting with \"www" "\". Complex example: host=www*&!(address=127.*|address6=::1). Please note, " "that CIDR notation based matches are also supported: " "address=192.0.2.128/25| address=2001:db8::/32| address=::ffff:192.0.2.0/96" msgstr "" "Erlaubt das Filtern nach bestimmten Teilen innerhalb des angegebenen " "Quellausdrucks. Alle importierten Spalten können angegeben werden. " "Beispiele: host=www* würde diese Eigenschaft nur für importierte Zeilen " "setzen, bei denen die Host Eigenschaft mit \"www\" beginnt. Komplexes " "Beispiel: host=www*&!(address=127.*|address6=::1). Bitte beachten, dass auch " "Muster in CIDR-Notation unterstützt werden: address=192.0.2.128/25| " "address=2001:db8::/32| address=::ffff:192.0.2.0/96" #: ../../../../library/Director/DataType/DataTypeDatalist.php:147 msgid "This allows to show either a drop-down list or an auto-completion" msgstr "" "Dies erlaubt es, entweder eine Ausklappmenü oder ein Feld mit automatischer " "Vervollständigung anzuzeigen" #: ../../../../application/forms/DirectorJobForm.php:39 msgid "This allows to temporarily disable this job" msgstr "Erlaubt das vorübergehende Deaktivieren dieses Auftrags" #: ../../../../application/forms/IcingaNotificationForm.php:107 #: ../../../../application/forms/IcingaHostGroupForm.php:30 #: ../../../../application/forms/IcingaServiceGroupForm.php:30 #: ../../../../application/forms/IcingaServiceForm.php:480 #: ../../../../application/forms/IcingaDependencyForm.php:115 #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:115 msgid "" "This allows you to configure an assignment filter. Please feel free to " "combine as many nested operators as you want. The \"contains\" operator is " "valid for arrays only. Please use wildcards and the = (equals) operator when " "searching for partial string matches, like in *.example.com" msgstr "" "Hiermit lässt sich ein Zuweisungsfilter (assign) definieren. Dabei lassen " "sich beliebig viele Operatoren beliebig tief verschachtelt benutzen. Der " "Operator \"contains\" (\"enthält\") ist nur für Arrays zulässig. Um " "Teilstrings zu vergleichen bitte Jokerzeichen (wildcards) benutzen, wie in *." "example.com" #: ../../../../application/forms/IcingaServiceSetForm.php:124 msgid "" "This allows you to configure an assignment filter. Please feel free to " "combine as many nested operators as you want. You might also want to skip " "this, define it later and/or just add this set of services to single hosts. " "The \"contains\" operator is valid for arrays only. Please use wildcards and " "the = (equals) operator when searching for partial string matches, like in *." "example.com" msgstr "" "Hiermit lässt sich ein Zuweisungsfilter (assign) definieren. Dabei lassen " "sich beliebig viele Operatoren beliebig tief verschachtelt benutzen. Dieser " "Schritt lässt sich auch überspringen und eventuell später umsetzen. " "Alternativ (oder zusätzlich) kann dieses Service-Set einzelne Hosts direkt " "zugewiesen werden. Der Operator \"contains\" (\"enthält\") ist nur für " "Arrays zulässig. Um Teilstrings zu vergleichen bitte Jokerzeichen " "(wildcards) benutzen, wie in *.example.com" #: ../../../../library/Director/Job/ConfigJob.php:47 msgid "This allows you to immediately deploy a modified configuration" msgstr "Dies erlaubt das sofortige Ausrollen einer veränderten Konfiguration" #: ../../../../library/Director/ProvidedHook/CubeLinks.php:37 #: ../../../../library/Director/ProvidedHook/IcingaDbCubeLinks.php:32 #, php-format msgid "This allows you to modify properties for \"%s\"" msgstr "Erlaubt das Ändern der Eigenschaften von \"%s\"" #: ../../../../library/Director/ProvidedHook/CubeLinks.php:54 #: ../../../../library/Director/ProvidedHook/IcingaDbCubeLinks.php:55 msgid "This allows you to modify properties for all chosen hosts at once" msgstr "" "Hiermit lassen sich Eigenschaften für alle gewählten Hosts auf einmal ändern" #: ../../../../application/controllers/BasketController.php:62 msgid "This basket is empty" msgstr "Dieser Basket ist leer" #: ../../../../application/forms/KickstartForm.php:230 msgid "This has to be a MySQL or PostgreSQL database" msgstr "Muss eine MySQL oder PostgeSQL Datenbank sein" #: ../../../../library/Director/Web/SelfService.php:65 msgid "" "This host has been registered via the Icinga Director Self Service API. In " "case you re-installed the host or somehow lost it's secret key, you might " "want to dismiss the current key. This would allow you to register the same " "host again." msgstr "" "Dieser Host wurde über die Icinga Director Selbstbedienungs-API registriert. " "Falls der Host neu installiert wurde oder der Schlüssel anderweitig verloren " "ging, kann es erwünscht sein, den aktuellen Schlüssel zu verwerfen. Das " "würde es erlauben, denselben Host neu zu registrieren." #: ../../../../application/controllers/InspectController.php:71 msgid "This is an abstract object type." msgstr "Das ist ein abstrakter Objekttyp." #: ../../../../application/forms/SelfServiceSettingsForm.php:45 msgid "" "This is only important in case your master/satellite nodes do not have IP " "addresses as their \"host\" property. The Agent can be told to issue related " "DNS lookups on it' own" msgstr "" "Das ist nur wichtig wenn Master- oder Satellitenknoten keine IP als \"host\"-" "Eigenschaft gesetzt haben. Dem Agent kann angewiesen werden, eigenständig " "entsprechende DNS-Lookups eigenständig vorzunehmen" #: ../../../../library/Director/Web/Controller/TemplateController.php:180 #, php-format msgid "This is the \"%s\" %s Template. Based on this, you might want to:" msgstr "Das ist die \"%s\" %s Vorlage. Basierend auf diese, kann man:" #: ../../../../application/forms/KickstartForm.php:123 msgid "" "This is the name of the Endpoint object (and certificate name) you created " "for your ApiListener object. In case you are unsure what this means please " "make sure to read the documentation first" msgstr "" "Der Name (und Zertifikatsname) des Endpunkt-Objekts, der für das ApiListener-" "Objekt erstellt wurde. Bei Unklarheit, was damit gemeint ist, sollte die " "Dokumentation erneut zu Rate gezogen werden" #: ../../../../library/Director/Dashboard/Dashlet/HostsDashlet.php:19 msgid "" "This is where you add all your servers, containers, network or sensor " "devices - and much more. Every subject worth to be monitored" msgstr "" "Hier werden alle Server, Container, Netzwerk- oder Sensor-Geräte und vieles " "mehr hinzugefügt. Jede Komponente die es wert ist, überwacht zu werden" #: ../../../../library/Director/Dashboard/HostsDashboard.php:22 msgid "" "This is where you manage your Icinga 2 Host Checks. Host templates are your " "main building blocks. You can bundle them to \"choices\", allowing (or " "forcing) your users to choose among a given set of preconfigured templates." msgstr "" "Hier werden Icinga 2 Host-Checks verwaltet. Host-Vorlagen stellen die " "Hauptbausteine dar. Diese können in \"Auswahlmöglichkeiten\" gebündelt " "werden, um es eigenen Benutzern zu erlauben, aus einem definierten Set von " "Vorlagen zu wählen - oder dies gar zu erzwingen." #: ../../../../library/Director/Dashboard/ServicesDashboard.php:24 msgid "" "This is where you manage your Icinga 2 Service Checks. Service Templates are " "your base building blocks, Service Sets allow you to assign multiple " "Services at once. Apply Rules make it possible to assign Services based on " "Host properties. And the list of all single Service Objects gives you the " "possibility to still modify (or delete) many of them at once." msgstr "" "Hier werden Icinga 2 Service-Checks verwaltet. Service-Vorlagen stellen die " "Hauptbausteine dar, Service-Sets erlauben es mehrere Services gemeinsam " "zuzuweisen. Apply-Regeln ermöglichen es, Services basierend auf Host-" "Eigenschaften zuzuweisen. Und die Liste aller Einzel-Services erlaubt es, " "einzelne oder mehrere zugleich zu bearbeiten oder zu löschen." #: ../../../../library/Director/Dashboard/UsersDashboard.php:21 msgid "" "This is where you manage your Icinga 2 User (Contact) objects. Try to keep " "your User objects simply by movin complexity to your templates. Bundle your " "users in groups and build Notifications based on them. Running MS Active " "Directory or another central User inventory? Stay away from fiddling with " "manual config, try to automate all the things with Imports and related Sync " "Rules!" msgstr "" "Hier werden Icingga 2 Benutzer-Objekte (Kontakte) verwaltet. Es wird " "empfohlen Benutzerobjekte einfach zu halten, und Komplexität in die " "entsprechenden Vorlagen zu verschieben. Das Bündeln von Benutzern in Gruppen " "erlaubt auf selbige basierende Benachrichtigungen. Ist MS Active Directory " "oder ein anderes zentrales Benutzerverzeichnis vorhanden? Dann gilt es sich " "am Besten überhaupt nicht mit manueller Konfiguration abzumühen. Über die " "Import-Funktion und entsprechende Synchronisationsregeln lässt sich nahezu " "alles automatisieren!" #: ../../../../library/Director/Dashboard/InfrastructureDashboard.php:39 msgid "" "This is where you manage your Icinga 2 infrastructure. When adding a new " "Icinga Master or Satellite please re-run the Kickstart Helper once." msgstr "" "Hier wird die Icinga 2 Infrastruktur verwaltet. Den Kickstart-Helper beim " "Hinzufügen von neuen Icinga Mastern oder Satelliten bitte erneut ausführen." #: ../../../../library/Director/Web/Table/ObjectsTableEndpoint.php:47 msgid "This is your Config master and will receive our Deployments" msgstr "" "Dies ist der Konfigurations-Master zu welchem sämtliche Konfiguration " "ausgerollt wird" #: ../../../../library/Director/Web/Widget/JobDetails.php:66 msgid "This job has not been executed yet" msgstr "Dieser Auftrag wurde bisher nicht ausgeführt" #: ../../../../library/Director/Web/Widget/JobDetails.php:36 #, php-format msgid "This job runs every %ds and is currently pending" msgstr "Dieser Auftrag läuft alle %ds und ist aktuell ausständig" #: ../../../../library/Director/Web/Widget/JobDetails.php:40 #, php-format msgid "This job runs every %ds." msgstr "Dieser Auftrag läuft alle %ds." #: ../../../../library/Director/Web/Widget/JobDetails.php:27 #, php-format msgid "" "This job would run every %ds. It has been disabled and will therefore not be " "executed as scheduled" msgstr "" "Dieser Auftrag würde alle %d ausgeführt. Er ist deaktiviert und wird deshalb " "nicht wie geplant ausgeführt" #: ../../../../library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:33 #: ../../../../library/Director/PropertyModifier/PropertyModifierSetValue.php:22 msgid "" "This modifier transforms 0/\"0\"/false/\"false\"/\"n\"/\"no\" to false and " "1, \"1\", true, \"true\", \"y\" and \"yes\" to true, both in a case " "insensitive way. What should happen if the given value does not match any of " "those? You could return a null value, or default to false or true. You might " "also consider interrupting the whole import process as of invalid source data" msgstr "" "Dieser Modifikator verwandelt 0/\"0\"/false/\"false\"/\"n\"/\"no\" nach " "false und , \"1\", true, \"true\", \"y\" and \"yes\" nach true, jeweils " "unabhängig von Groß-/Kleinschreibung. Was soll passieren falls keiner dieser " "Fälle zutrifft? In diesem Fall lässt sich ein Null-Wert zurückgeben oder " "aber true oder false als Fallback nutzen. Alternativ kann man auch den " "komplette Importvorgang aufgrund ungültiger Daten fehlschlagen lassen" #: ../../../../application/forms/ImportSourceForm.php:89 msgid "" "This must be a column containing unique values like hostnames. Unless " "otherwise specified this will then be used as the object_name for the " "syncronized Icinga object. Especially when getting started with director " "please make sure to strictly follow this rule. Duplicate values for this " "column on different rows will trigger a failure, your import run will not " "succeed. Please pay attention when synching services, as \"purge\" will only " "work correctly with a key_column corresponding to host!name. Check the " "\"Combine\" property modifier in case your data source cannot provide such a " "field" msgstr "" "Muss eine Spalte sein, die eindeutige Werte wie Hostnamen enthält. Wenn " "nicht anders angegeben, wird dieser Wert dann als object_name für die " "synchronisierten Icinga Objekte verwendet. Insbesondere Benutzer mit wenig " "Erfahrung mit dem Director sollten sich unbedingt an diese Regel halten. " "Doppelte Werte in dieser Spalte erzeugen einen Fehler und der gesamte " "Importlauf schlägt fehl. Bitte beim Synchronisieren von Services Acht geben, " "\"bereinigen\" wird nur mit einer der host!name Syntax entsprechenden " "Schlüsselspalte funktionieren. Nutze den Eigenschaftsmodifikator " "\"Kombinieren\", falls die gegebenen Datenquelle keine solche Spalte " "bereitstellen kann" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:33 msgid "This name will show up as the author for ever related downtime comment" msgstr "" "Der Name wird als Autor für sämtliche zugehörigen Downtime-Kommentare " "aufscheinen" #: ../../../../library/Director/Web/Widget/BranchedObjectHint.php:69 #, php-format msgid "This object has been created in %s" msgstr "Dieses Objekt wurde in %s erstellt" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:545 msgid "This object has been disabled" msgstr "Dieses Objekt wurde deaktiviert" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:540 msgid "This object has been enabled" msgstr "Dieses Objekt wurde aktiviert" #: ../../../../library/Director/Web/Widget/BranchedObjectHint.php:74 #, php-format msgid "This object has modifications visible only in %s" msgstr "Dieses Objekt hat Änderungen, welche nur in %s sichtbar sind" #: ../../../../library/Director/Web/Widget/BranchedObjectHint.php:45 #, php-format msgid "This object will be created in %s." msgstr "Dieses Objekt wird in %s erstellt" #: ../../../../library/Director/Web/ObjectPreview.php:75 msgid "This object will not be deployed as it has been disabled" msgstr "Das Objekt wird nicht ausgerollt, da es deaktiviert wurde" #: ../../../../library/Director/PropertyModifier/PropertyModifierCombine.php:17 msgid "" "This pattern will be evaluated, and variables like ${some_column} will be " "filled accordingly. A typical use-case is generating unique service " "identifiers via ${host}!${service} in case your data source doesn't allow " "you to ship such. The chosen \"property\" has no effect here and will be " "ignored." msgstr "" "Dieses Muster wird ausgewertet, und Variablen wie ${eine_spalte} werden " "entsprechend befüllt. Ein typischer Anwendungsfall ist das Erstellen von " "eindeutigen Service-Bezeichnern via ${host}!${service} falls die Datenquelle " "einen solchen nicht bereitstellt. Die gewählte \"Eigenschaft\" hat hier " "keine Auswirkung und wird ignoriert." #: ../../../../application/controllers/SyncruleController.php:219 #, php-format msgid "This preview has been generated %s, please click %s to regenerate it" msgstr "" "Dieser Vorschau wurde %s generiert, zwecks Aktualisierung bitte %s klicken" #: ../../../../library/Director/Web/SelfService.php:243 msgid "" "This requires the Icinga Agent to be installed. It generates and signs it's " "certificate and it also generates a minimal icinga2.conf to get your agent " "connected to it's parents" msgstr "" "Hierfür muss der Icinga Agent installiert sein. Es erstellt und signiert " "sein Zertifikat und erstellt eine minimale icinga2.conf mit welcher der " "Agent zu den ihm übergeordneten Systemen verbunden wird" #: ../../../../application/forms/IcingaServiceForm.php:407 #, php-format msgid "" "This service belongs to the %s Service Set. Still, you might want to " "override the following properties for this host only." msgstr "" "Dieser Service gehört zum Service Set %s. Dennoch können die folgenden " "Eigenschaften nur für diesen speziellen Host geändert werden." #: ../../../../application/forms/IcingaServiceForm.php:447 #, php-format msgid "" "This service belongs to the service set \"%s\". Still, you might want to " "change the following properties for this host only." msgstr "" "Dieser Service gehört zum Set \"%s\". Dennoch können die folgenden " "Eigenschaften nur für diesen speziellen Host geändert werden." #: ../../../../application/forms/IcingaServiceForm.php:388 msgid "" "This service has been generated in an automated way, but still allows you to " "override the following properties in a safe way." msgstr "" "Dieser Service wurde durch einen Automatismus erstellt, erlaubt es aber " "dennoch die folgenden Eigenschaften auf sichere Weise zu überschreiben." #: ../../../../application/forms/IcingaServiceForm.php:394 #, php-format msgid "" "This service has been generated using the %s apply rule, assigned where %s" msgstr "" "Dieser Service wurde durch die Apply-Regel %s erstellt, und wird zugewiesen " "wo %s" #: ../../../../application/forms/IcingaServiceForm.php:419 #, php-format msgid "" "This service has been inherited from %s. Still, you might want to change the " "following properties for this host only." msgstr "" "Dieser Service wurde von %s geerbt. Dennoch können die folgenden " "Eigenschaften nur für diesen speziellen Host geändert werden." #: ../../../../library/Director/Web/Table/IcingaServiceSetServiceTable.php:229 #, php-format msgid "This set has been inherited from %s" msgstr "Dieses Set wurde von %s geerbt" #: ../../../../library/Director/Dashboard/Dashlet/KickstartDashlet.php:19 msgid "" "This synchronizes Icinga Director to your Icinga 2 infrastructure. A new run " "should be triggered on infrastructure changes" msgstr "" "Synchronisiert den Icinga Director mit der Icinga 2 Infrastruktur. Bei " "Änderungen an derselben sollte ein neuer Lauf angestoßen werden" #: ../../../../library/Director/Web/Table/TemplateUsageTable.php:104 msgid "This template is not in use" msgstr "Diese Vorlage ist nicht in Verwendung" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:944 #, php-format msgid "This template is still in use by %d other objects" msgstr "Diese Vorlage ist noch in Verwendung durch %d andere Objekte" #: ../../../../library/Director/PropertyModifier/PropertyModifierMap.php:48 msgid "" "This value will be evaluated, and variables like ${some_column} will be " "filled accordingly. A typical use-case is generating unique service " "identifiers via ${host}!${service} in case your data source doesn't allow " "you to ship such. The chosen \"property\" has no effect here and will be " "ignored." msgstr "" "Dieses Muster wird ausgewertet, und Variablen wie ${eine_spalte} werden " "entsprechend befüllt. Ein typischer Anwendungsfall ist das Erstellen von " "eindeutigen Service-Bezeichnern via ${host}!${service} falls die Datenquelle " "einen solchen nicht bereitstellt. Die gewählte \"Eigenschaft\" hat hier " "keine Auswirkung und wird ignoriert." #: ../../../../library/Director/Web/Widget/BranchedObjectHint.php:25 msgid "This will be part of the next deployment" msgstr "Das wird Teil des nächsten Deployments" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:51 msgid "This will be shown as a label for the given choice" msgstr "Dies wird als Bezeichner für diese Auswahlmöglichkeit angezeigt werden" #: ../../../../application/forms/DirectorDatafieldForm.php:143 msgid "" "This will be the name of the custom variable in the rendered Icinga " "configuration." msgstr "" "Dies wird als Name der benutzerdefinierten Eigenschaft in der gerenderten " "Icinga-Konfiguration benutzt." #: ../../../../application/forms/DirectorDatalistEntryForm.php:33 msgid "This will be the visible caption for this entry" msgstr "Die sichtbare Bezeichnung für diesen Eintrag" #: ../../../../library/Director/Web/SelfService.php:116 msgid "This will invalidate the former key" msgstr "Das macht den vorherigen Schlüssel ungültig" #: ../../../../library/Director/Web/Widget/BranchedObjectHint.php:32 msgid "This will not be part of any deployment, unless being merged" msgstr "" "Dies wird nicht Teil eines eventuellen Deployments, solange die Änderungen " "nicht zusammengeführt werden" #: ../../../../library/Director/Web/SelfService.php:233 msgid "Ticket" msgstr "Ticket" #: ../../../../application/forms/SyncRuleForm.php:21 msgid "Time Period" msgstr "Zeitraum" #: ../../../../application/forms/BasketForm.php:32 msgid "Time Periods" msgstr "Zeiträume" #: ../../../../application/forms/IcingaUserForm.php:158 #: ../../../../application/forms/IcingaNotificationForm.php:288 #: ../../../../application/forms/DirectorJobForm.php:60 #: ../../../../application/forms/IcingaDependencyForm.php:141 msgid "Time period" msgstr "Zeitraum" #: ../../../../application/controllers/TimeperiodController.php:17 #: ../../../../application/controllers/ScheduledDowntimeController.php:24 msgid "Time period ranges" msgstr "Zeiträume" #: ../../../../application/forms/IcingaScheduledDowntimeRangeForm.php:56 #, php-format msgid "Time range \"%s\" has been removed from %s" msgstr "Der Zeitraum \"%s\" wurden von \"%s\" entfernt" #: ../../../../application/forms/SyncPropertyForm.php:321 msgid "Time ranges" msgstr "Zeiträume" #: ../../../../application/forms/IcingaCommandForm.php:69 msgid "Timeout" msgstr "Timeout" #: ../../../../library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:15 msgid "Timeperiod Templates" msgstr "Zeitraumvorlage" #: ../../../../library/Director/Dashboard/Dashlet/TimeperiodObjectDashlet.php:17 #: ../../../../library/Director/Dashboard/Dashlet/TimeperiodsDashlet.php:15 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:45 #: ../../../../library/Director/Web/Table/IcingaTimePeriodRangeTable.php:46 #: ../../../../library/Director/Web/Table/IcingaScheduledDowntimeRangeTable.php:52 #: ../../../../application/forms/IcingaScheduledDowntimeRangeForm.php:29 msgid "Timeperiods" msgstr "Zeiträume" #: ../../../../application/forms/IcingaTimePeriodRangeForm.php:28 msgid "Timerperiods" msgstr "Zeiträume" #: ../../../../library/Director/Web/Table/ImportrunTable.php:31 msgid "Timestamp" msgstr "Zeitstempel" #: ../../../../library/Director/DataType/DataTypeDictionary.php:28 msgid "To be managed on objects only" msgstr "Kann nur auf Objekten verwaltet werden" #: ../../../../application/forms/SelfServiceSettingsForm.php:59 #: ../../../../application/forms/SelfServiceSettingsForm.php:167 msgid "" "To ensure downloaded packages are build by the Icinga Team and not " "compromised by third parties, you will be able to provide an array of SHA1 " "hashes here. In case you have defined any hashses, the module will not " "continue with updating / installing the Agent in case the SHA1 hash of the " "downloaded MSI package is not matching one of the provided hashes of this " "setting" msgstr "" "Um sicherzustellen, dass die heruntergeladenen Pakete vom Icinga-Team " "stammen und nicht von Dritten kompromittiert wurden, kann hier eine Liste " "von SHA1 Prüfsummen bereitgestellt werden. Falls hier ein oder mehrere " "solche Hash-Werte bereitgestellt werden, und das heruntergeladenen MSI-Paket " "keinem davon entspricht, wird das Powershell-Modul sich weigern mit Update " "oder Installation des Agenten fortzufahren" #: ../../../../library/Director/Field/FormFieldSuggestion.php:86 msgid "Toggles (boolean arguments)" msgstr "Schalter (boolsche Argumente)" #: ../../../../library/Director/Web/SelfService.php:208 msgid "Top Down" msgstr "Top Down" #: ../../../../library/Director/Web/Table/TemplateUsageTable.php:57 msgid "Total" msgstr "Gesamt" #: ../../../../application/forms/SelfServiceSettingsForm.php:31 msgid "Transform Host Name" msgstr "Hostname transformieren" #: ../../../../application/forms/SelfServiceSettingsForm.php:43 msgid "Transform Parent Host to IP" msgstr "Elternhost in IP umwandeln" #: ../../../../application/forms/SelfServiceSettingsForm.php:37 msgid "Transform to lowercase" msgstr "In Kleinbuchstaben umwandeln" #: ../../../../application/forms/SelfServiceSettingsForm.php:38 msgid "Transform to uppercase" msgstr "In Großbuchstaben umwandeln" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1676 msgid "Transition types" msgstr "Änderungsstypen" #: ../../../../library/Director/Web/ActionBar/TemplateActionBar.php:30 msgid "Tree" msgstr "Baum" #: ../../../../application/forms/ImportRunForm.php:23 msgid "Trigger Import Run" msgstr "Importlauf anstoßen" #: ../../../../application/forms/SyncRunForm.php:37 msgid "Trigger this Sync" msgstr "Diese Synchronisation anstoßen" #: ../../../../application/forms/ImportRunForm.php:45 msgid "Triggering this Import Source failed" msgstr "Anstoßen dieser Importquelle schlug fehl" #: ../../../../library/Director/PropertyModifier/PropertyModifierTrim.php:16 msgid "Trim Method" msgstr "Trim-Methode" #: ../../../../library/Director/Dashboard/Dashlet/SettingsDashlet.php:19 msgid "Tweak some global Director settings" msgstr "Einige globale Director-Einstellungen anpassen" #: ../../../../library/Director/Web/Table/CoreApiFieldsTable.php:80 #: ../../../../library/Director/Web/Table/ObjectsTableEndpoint.php:22 msgid "Type" msgstr "Typ" #: ../../../../application/controllers/InspectController.php:82 msgid "Type attributes" msgstr "Typ-Attribute" #: ../../../../library/Director/PropertyModifier/PropertyModifierParseURL.php:27 #: ../../../../library/Director/PropertyModifier/PropertyModifierParseURL.php:28 msgid "URL component" msgstr "URL- Komponente" #: ../../../../library/Director/PropertyModifier/PropertyModifierUuidBinToHex.php:12 msgid "UUID: from binary to hex" msgstr "UUID: binär in hexadezimal umwandeln" #: ../../../../application/forms/DeployFormsBug7530.php:72 msgid "Unable to detect your Icinga 2 Core version" msgstr "Die Icinga 2 Core-Version konnte nicht ermittelt werden" #: ../../../../library/Director/DataType/DataTypeSqlQuery.php:27 #: ../../../../application/forms/SyncPropertyForm.php:168 #, php-format msgid "Unable to fetch data: %s" msgstr "Daten konnten nicht geholt werden: %s" #: ../../../../application/forms/IcingaHostForm.php:385 msgid "" "Unable to store a host with the given properties because of insufficient " "permissions" msgstr "" "Ein Host konnte aufgrund unzureichender Berechtigungen nicht mit den " "gegebenen Eigenschaften abgespeichert werden" #: ../../../../application/forms/KickstartForm.php:316 #, php-format msgid "" "Unable to store the configuration to \"%s\". Please check file permissions " "or manually store the content shown below" msgstr "" "Die Konfiguration kann nicht nach \"%s\" gespeichert werden. Bitte " "Dateisystemberechtigungen prüfen oder den unten angegebenen Inhalt manuell " "speichern" #: ../../../../library/Director/Db/Housekeeping.php:49 msgid "Undeployed configurations" msgstr "Nicht ausgerollte Konfigurationen" #: ../../../../application/forms/IcingaNotificationForm.php:269 msgid "" "Unit is seconds unless a suffix is given. Supported suffixes include ms " "(milliseconds), s (seconds), m (minutes), h (hours) and d (days)." msgstr "" "Wie lang die Downtime dauert. Beeinflusst nur flexible (keine fixen) " "Downtimes. Zeit in Sekunden, unterstützt auch die Suffixes ms " "(Millisekunden), s (Sekunden), m (Minuten), h (Stunden) and d (Tage). Um " "\"90 Minuten\" auszudrücken könnte man 1h 30m schreiben." #: ../../../../library/Director/IcingaConfig/StateFilterSet.php:27 msgid "Unknown" msgstr "Unbekannt" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:137 msgid "Unknown, failed to collect related information" msgstr "Unbekannt, entsprechende Information konnte nicht gesammelt werden" #: ../../../../library/Director/Web/Widget/DeploymentInfo.php:135 msgid "Unknown, still waiting for config check outcome" msgstr "Unbekannt, warte auf Ergebnis der Konfigurationsprüfung" #: ../../../../library/Director/Db/Housekeeping.php:53 msgid "Unlinked imported properties" msgstr "Nicht-verknüpfte importierte Eigenschaften" #: ../../../../library/Director/Db/Housekeeping.php:51 msgid "Unlinked imported row sets" msgstr "Nicht-verknüpfte importierte Zeilensets" #: ../../../../library/Director/Db/Housekeeping.php:52 msgid "Unlinked imported rows" msgstr "Nicht-verknüpfte importierte Zeilen" #: ../../../../application/controllers/PhperrorController.php:22 #: ../../../../application/controllers/PhperrorController.php:37 msgid "Unsatisfied dependencies" msgstr "Unerfüllte Abhängigkeiten" #: ../../../../library/Director/Db/Housekeeping.php:50 msgid "Unused rendered files" msgstr "Nicht verwendete, generierte Dateien" #: ../../../../library/Director/IcingaConfig/StateFilterSet.php:20 msgid "Up" msgstr "Up" #: ../../../../application/forms/IcingaTimePeriodForm.php:25 msgid "Update Method" msgstr "Aktualisierungsmethode" #: ../../../../application/forms/SyncRuleForm.php:52 msgid "Update Policy" msgstr "Aktualisierungsrichtlinie" #: ../../../../application/forms/SyncRuleForm.php:65 msgid "Update only" msgstr "Nur aktualisieren" #: ../../../../application/forms/DeployFormsBug7530.php:109 msgid "Upgrading Icinga 2 - Confic Sync: Zones in Zones" msgstr "Upgrading Icinga 2 - Confic Sync: Zones in Zones" #: ../../../../application/forms/DeployFormsBug7530.php:111 msgid "Upgrading documentation" msgstr "Upgrading-Dokumentation" #: ../../../../application/forms/BasketUploadForm.php:45 #: ../../../../application/controllers/BasketsController.php:26 #: ../../../../application/controllers/BasketController.php:169 msgid "Upload" msgstr "Hochladen" #: ../../../../application/controllers/BasketController.php:120 msgid "Upload a Basket" msgstr "Basket hochladen" #: ../../../../application/controllers/BasketController.php:121 msgid "Upload a Configuration Basket" msgstr "Konfigurationsbasket hochladen" #: ../../../../application/controllers/BasketController.php:140 msgid "Upload a Configuration Basket Snapshot" msgstr "Schnappschuss eines Konfigurationsbaskets hochladen" #: ../../../../library/Director/Web/Controller/ObjectController.php:370 msgid "Usage" msgstr "Benutzung" #: ../../../../library/Director/Web/Widget/AdditionalTableActions.php:102 #, php-format msgid "Usage (%s)" msgstr "Benutzung (%s)" #: ../../../../application/forms/IcingaHostForm.php:108 msgid "" "Use a different name for the generated endpoint object than the host name " "and add a custom variable to allow services setting the correct command " "endpoint." msgstr "" "Benutze einen anderen Bezeichner (als den Hostnamen) für das generierte " "Endpunktobjekt und füge eine benutzerdefinierte Variable hinzu, welche es " "Services erlaubt, den korrekten Commandendpunkt zu setzen." #: ../../../../application/forms/SelfServiceSettingsForm.php:84 msgid "Use a local file or network share" msgstr "Benutze eine lokales Verzeichnis oder eine Netzwerkfreigabe" #: ../../../../library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:18 msgid "Use lowercase first" msgstr "Erst in Kleinbuchstaben umwandeln" #: ../../../../application/forms/SyncPropertyForm.php:273 msgid "Used sources" msgstr "Verwendete Quellen" #: ../../../../library/Director/TranslationDummy.php:17 #: ../../../../application/forms/SyncRuleForm.php:17 msgid "User" msgstr "Benutzer" #: ../../../../application/forms/SyncRuleForm.php:18 msgid "User Group" msgstr "Benutzergruppe" #: ../../../../library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:13 #: ../../../../application/forms/BasketForm.php:27 msgid "User Groups" msgstr "Benutzergruppen" #: ../../../../application/forms/IcingaNotificationForm.php:178 msgid "User Groups Custom Variable" msgstr "Variable für Benutzergruppen" #: ../../../../library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:15 #: ../../../../application/forms/BasketForm.php:28 msgid "User Templates" msgstr "Benutzervorlagen" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:63 #: ../../../../application/forms/IcingaNotificationForm.php:169 msgid "User groups" msgstr "Benutzergruppen" #: ../../../../application/forms/IcingaUserForm.php:113 msgid "" "User groups that should be directly assigned to this user. Groups can be " "useful for various reasons. You might prefer to send notifications to groups " "instead of single users" msgstr "" "Benutzergruppen, die direkt diesem Benutzer zugeordnet werden sollen. " "Gruppen können für verschiedene Aufgaben verwendet werden. Eventuell ist es " "besser, Benachrichtigungen an Gruppen statt an einzelne Benutzer zu schicken" #: ../../../../application/forms/IcingaNotificationForm.php:171 msgid "User groups that should be notified by this notifications" msgstr "" "Benutzergruppen, die durch diese Benachrichtigungen verständigt werden sollen" #: ../../../../application/forms/IcingaUserForm.php:194 msgid "User properties" msgstr "Benutzereigenschaften" #: ../../../../application/forms/IcingaUserForm.php:22 msgid "User template name" msgstr "Benutzervorlagenname" #: ../../../../application/forms/IcingaUserGroupForm.php:17 msgid "Usergroup" msgstr "Benutzergruppe" #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:44 #: ../../../../library/Director/Import/ImportSourceCoreApi.php:63 msgid "Usergroups" msgstr "Benutzergruppen" #: ../../../../library/Director/Import/ImportSourceRestApi.php:226 #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:74 #: ../../../../application/forms/IcingaUserForm.php:28 msgid "Username" msgstr "Benutzername" #: ../../../../library/Director/DataType/DataTypeDirectorObject.php:62 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:43 #: ../../../../library/Director/Import/ImportSourceCoreApi.php:62 #: ../../../../library/Director/Web/Table/CustomvarVariantsTable.php:62 #: ../../../../library/Director/Web/Table/CustomvarTable.php:47 #: ../../../../application/forms/IcingaNotificationForm.php:126 #: ../../../../application/forms/IcingaNotificationForm.php:132 #: ../../../../application/forms/IcingaNotificationForm.php:163 #: ../../../../application/forms/BasketForm.php:29 msgid "Users" msgstr "Benutzer" #: ../../../../library/Director/Dashboard/Dashlet/UserObjectDashlet.php:13 #: ../../../../library/Director/Dashboard/Dashlet/UsersDashlet.php:15 msgid "Users / Contacts" msgstr "Benutzer / Kontakte" #: ../../../../application/forms/IcingaNotificationForm.php:141 msgid "Users Custom Variable" msgstr "Variable für Benutzer" #: ../../../../application/forms/IcingaNotificationForm.php:134 msgid "Users that should be notified by this notifications" msgstr "Benutzer, die durch diese Benachrichtigungen verständigt werden sollen" #: ../../../../library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:19 msgid "" "Using Apply Rules a Service can be applied to multiple hosts at once, based " "on filters dealing with any combination of their properties" msgstr "" "Mittels Apply-Regeln kann ein Service mehreren Hosts auf einmal zugewiesen " "werden, und zwar basierend auf Filtern welche einzelne oder mehrere " "Eigenschaften derselben kombinieren" #: ../../../../application/forms/IcingaHostSelfServiceForm.php:44 #: ../../../../application/forms/IcingaHostForm.php:338 msgid "Usually your hosts main IPv6 address" msgstr "Üblicherweise die Haupt-IPv6-Adresse des Hosts" #: ../../../../library/Director/Web/Table/BranchedIcingaCommandArgumentTable.php:47 #: ../../../../library/Director/Web/Table/IcingaCommandArgumentTable.php:50 #: ../../../../application/forms/IcingaServiceVarForm.php:27 #: ../../../../application/forms/IcingaCommandArgumentForm.php:50 #: ../../../../application/forms/IcingaCommandArgumentForm.php:59 #: ../../../../application/forms/CustomvarForm.php:21 #: ../../../../application/forms/IcingaHostVarForm.php:27 msgid "Value" msgstr "Wert" #: ../../../../application/forms/IcingaCommandArgumentForm.php:36 msgid "Value type" msgstr "Werttyp" #: ../../../../library/Director/Web/Table/CustomvarVariantsTable.php:56 msgid "Variable Value" msgstr "Variablenwert" #: ../../../../library/Director/Web/Table/CustomvarTable.php:41 #: ../../../../application/forms/CustomvarForm.php:16 msgid "Variable name" msgstr "Variablenname" #: ../../../../library/Director/Import/ImportSourceRestApi.php:176 msgid "Verify Host" msgstr "Host überprüfen" #: ../../../../library/Director/Import/ImportSourceRestApi.php:169 msgid "Verify Peer" msgstr "Peer überprüfen" #: ../../../../library/Director/DataType/DataTypeString.php:24 msgid "Visibility" msgstr "Sichtbarkeit" #: ../../../../library/Director/DataType/DataTypeString.php:26 msgid "Visible" msgstr "Sichtbar" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1489 msgid "Volatile" msgstr "Sprunghaft (Volatile)" #: ../../../../application/forms/IcingaCommandForm.php:80 msgid "" "WARNING, this can allow shell script injection via custom variables used in " "command." msgstr "" "VORSICHT, hiermit schafft man die Möglichkeit über benutzerdefinierte " "Variablen Shell-Code in Kommandos zu injizieren." #: ../../../../library/Director/Dashboard/InfrastructureDashboard.php:50 #, php-format msgid "Want to connect to your Icinga Agents? Have a look at our %s!" msgstr "" "Sollen Icinga Agents verbunden werden? Riskieren einen Blick in unsere %s!" #: ../../../../library/Director/Dashboard/TimeperiodsDashboard.php:20 msgid "" "Want to define to execute specific checks only withing specific time " "periods? Get mobile notifications only out of office hours, but mail " "notifications all around the clock? Time Periods allow you to tackle those " "and similar requirements." msgstr "" "Sollen bestimmte Checks nur innerhalb bestimmter Zeiträume ausgeführt " "werden? Mobile Benachrichtigungen nur außerhalb der Bürozeiten, aber " "Alarmierung via E-Mail rund um die Uhr? Zeiträume erlauben es, diese und " "ähnliche Anforderungen zu erfüllen." #: ../../../../library/Director/IcingaConfig/StateFilterSet.php:25 msgid "Warning" msgstr "Warnung" #: ../../../../application/forms/DeployFormsBug7530.php:94 #, php-format msgid "" "Warning: you're running Icinga v2.11.0 and our configuration looks like you " "could face issue %s. We're already working on a solution. The GitHub Issue " "and our %s contain related details." msgstr "" "Vorsicht: hier läuft Icinga v2.11.0 und die erstellte Konfiguration sieht " "aus als würde sie von Issue %s betroffen sein. Wir arbeiten bereits an einer " "Lösung. Das GitHub-Issue und unsere %s enthalten weiterführende " "Informationen." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1132 msgid "" "What kind of object this should be. Templates allow full access to any " "property, they are your building blocks for \"real\" objects. External " "objects should usually not be manually created or modified. They allow you " "to work with objects locally defined on your Icinga nodes, while not " "rendering and deploying them with the Director. Apply rules allow to assign " "services, notifications and groups to other objects." msgstr "" "Welche Art von Objekt dies werden soll. Vorlagen erlauben vollen Zugriff auf " "alle Eigenschaften - sie sind die Bauklötze für \"echte\" Objekte. Externe " "Objekte sollten üblicherweise nicht erstellt oder verändert werden. Sie " "erlauben es, mit Objekten zu arbeiten, die lokal auf den Icinga Knoten " "definiert wurden, ohne sie über den Director auszubringen. Apply regeln " "erlauben das Zuweisen von Services, Benachrichtigungen und Gruppen an andere " "Objekte." #: ../../../../library/Director/PropertyModifier/PropertyModifierMap.php:29 msgid "" "What should happen if the lookup key does not exist in the data list? You " "could return a null value, keep the unmodified imported value or interrupt " "the import process" msgstr "" "Was soll geschehen, wenn der Suchschlüssel sich nicht in der Datenliste " "befindet? Es kann ein null Wert zurückgegeben werden, der importierte Wert " "unverändert übernommen oder der Importvorgang unterbrochen werden" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexSplit.php:24 #: ../../../../library/Director/PropertyModifier/PropertyModifierSplit.php:24 msgid "What should happen when the given string is empty?" msgstr "Was soll passieren wenn der übergebene String leer ist?" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:66 msgid "What should happen when the result array is empty?" msgstr "Was soll passieren wenn das resultierende Array leer ist?" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:51 msgid "What should happen when the specified element is not available?" msgstr "Was soll passieren wenn das spezifizierte Element nicht verfügbar ist?" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:53 msgid "What should happen with matching elements?" msgstr "Was soll mit passenden Elementen passieren?" #: ../../../../library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:68 msgid "" "What should happen with the row, when this property matches the given " "expression?" msgstr "" "Was soll mit der Zeile passieren, wenn der gegebene Ausdruck auf diese " "Eigenschaft zutrifft?" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexReplace.php:29 msgid "What should happen, if the given pattern doesn't match" msgstr "Was soll passieren, wenn das Muster nicht zutrifft?" #: ../../../../library/Director/PropertyModifier/PropertyModifierDnsRecords.php:32 msgid "What should we do if the DNS lookup fails?" msgstr "Was soll geschehen, wenn die (DNS) Auflösung fehlschlägt?" #: ../../../../library/Director/PropertyModifier/PropertyModifierParseURL.php:36 msgid "" "What should we do if the URL could not get parsed or component not found?" msgstr "" "Was soll mit der URL geschehen, wenn sie nicht geparsed werden kann oder " "aber Komponenten davon nicht gefunden werden?" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:28 msgid "What should we do if the desired part does not exist?" msgstr "Was soll geschehen, wenn der gewünschte Teil nicht existiert?" #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:15 #: ../../../../library/Director/PropertyModifier/PropertyModifierGetHostByName.php:15 msgid "What should we do if the host (DNS) lookup fails?" msgstr "Was soll geschehen, wenn die (DNS) Auflösung fehlschlägt?" #: ../../../../library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:28 #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayToRow.php:21 msgid "What should we do in case the given value is empty?" msgstr "Was soll passieren wenn der übergebene Wert leer ist?" #: ../../../../library/Director/PropertyModifier/PropertyModifierJsonDecode.php:22 msgid "What should we do in case we are unable to decode the given string?" msgstr "" "Was soll geschehen, wenn sich der übergebene String nicht dekodieren lässt?" #: ../../../../library/Director/PropertyModifier/PropertyModifierListToObject.php:24 msgid "What should we do, if the same key occurs twice?" msgstr "Was soll geschehen, wenn derselbe Schlüssel zweimal auftaucht?" #: ../../../../library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:16 msgid "What should we extract from the DN?" msgstr "Was soll aus dem DN extrahiert werden?" #: ../../../../application/forms/BasketForm.php:61 msgid "" "What should we place into this Basket every time we create new snapshot?" msgstr "Was sollen wir beim Erstellen eines Snapshots in diesen Basket geben?" #: ../../../../application/forms/SelfServiceSettingsForm.php:21 msgid "What to use as your Icinga 2 Agent's Host Name" msgstr "Was soll als Hostname für den Icinga-2-Agent genutzt werden?" #: ../../../../library/Director/Job/ConfigJob.php:59 msgid "" "When deploying configuration, wait at least this amount of seconds unless " "the next deployment should take place" msgstr "" "Beim Ausrollen einer Konfiguration mindestens diese Anzahl an Sekunden " "warten, bevor das nächste Ausrollen durchgeführt wird" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:63 #: ../../../../library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:27 #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexSplit.php:21 #: ../../../../library/Director/PropertyModifier/PropertyModifierSplit.php:21 msgid "When empty" msgstr "Falls leer" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:48 msgid "When not available" msgstr "Wenn nicht verfügbar" #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexReplace.php:27 msgid "When not matched" msgstr "Wenn nicht zugetroffen" #: ../../../../application/forms/IcingaNotificationForm.php:258 msgid "When the last notification should be sent" msgstr "Wann die letzte Nachricht versenderwerden" #: ../../../../library/Director/Dashboard/InfrastructureDashboard.php:44 msgid "" "When you feel the desire to manually create Zone or Endpoint objects please " "rethink this twice. Doing so is mostly the wrong way, might lead to a dead " "end, requiring quite some effort to clean up the whole mess afterwards." msgstr "" "Das Bedürfnis, neue Zonen- oder Endpunkt-Objekte manuell zu erstellen bitte " "zweimal überdenken. Das ist meistens der falsche Weg, kann in Sackgassen " "führen und damit eine Menge Arbeit beim manuellen Aufräumen verursachen." #: ../../../../library/Director/PropertyModifier/PropertyModifierTrim.php:17 msgid "Where to trim the string(s)" msgstr "Wo String(s) gestutzt werden soll" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:104 msgid "" "Whether Downtimes should also explicitly be scheduled for all Services " "belonging to affected Hosts" msgstr "" "Ob Downtimes zudem explizit auch für alle zu den betroffenen Hosts gehörigen " "Services eingeplant werden sollen" #: ../../../../application/forms/SettingsForm.php:63 msgid "Whether all configured Jobs should be disabled" msgstr "Ob alle konfigurierten Jobs deaktiviert werden sollen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1462 msgid "Whether flap detection is enabled on this object" msgstr "Ob die Flapping-Erkennung für dieses Objekt aktiviert werden soll" #: ../../../../library/Director/Job/ConfigJob.php:33 msgid "" "Whether rendering should be forced. If not enforced, this job re-renders the " "configuration only when there have been activities since the last rendered " "config" msgstr "" "Ob das Erstellen erzwungen werden soll. Wird es nicht erzwungen, wird die " "Konfiguration nur erstellt, falls seit dem letzten Erstellen Aktivitäten " "durchgeführt wurden" #: ../../../../application/forms/IcingaHostForm.php:96 msgid "Whether the agent is configured to accept config" msgstr "" "Ja, falls der Agent so konfiguriert ist, dass er Konfiguration akzeptiert" #: ../../../../application/forms/IcingaCommandArgumentForm.php:42 msgid "" "Whether the argument value is a string (allowing macros like $host$) or an " "Icinga DSL lambda function (will be enclosed with {{ ... }}" msgstr "" "Ist der Wert des Arguments eine Zeichenkette (erlaubt Makros wie $host$) " "oder eine Icinga-DSL-Lambda-Funktion? (wird in {{ ... }} eingeschlossen" #: ../../../../application/forms/IcingaServiceForm.php:684 msgid "" "Whether the check commmand for this service should be executed on the Icinga " "agent" msgstr "" "Ob das Kommando für diesen Service auf dem Icinga-Agent ausgeführt werden " "soll" #: ../../../../application/forms/IcingaCommandArgumentForm.php:117 msgid "" "Whether the parameter name should not be passed to the command. Per default, " "the parameter name (e.g. -H) will be appended, so no need to explicitly set " "this to \"No\"." msgstr "" "Ob der Parameter-Name an das Kommando übergeben werden soll. Normalerweise " "wird dieser (z.B. -H) hinzugefügt, es ist also nicht erforderlich dies " "explizit auf \"Nein\" zu setzen." #: ../../../../application/forms/IcingaHostForm.php:90 msgid "" "Whether the parent (master) node should actively try to connect to this agent" msgstr "" "Soll der (Master) Knoten aktiv versuchen, sich zu diesem Agenten zu " "verbinden?" #: ../../../../application/forms/IcingaCommandArgumentForm.php:81 msgid "" "Whether the set_if parameter is a string (allowing macros like $host$) or an " "Icinga DSL lambda function (will be enclosed with {{ ... }}" msgstr "" "Ist der set_if Parameter eine Zeichenkette (erlaubt Makros wie $host$) oder " "eine Icinga-DSL-Lambda-Funktion? (wird in {{ ... }} eingeschlossen" #: ../../../../application/forms/IcingaCommandArgumentForm.php:126 msgid "Whether this argument should be required" msgstr "Soll dieses Argument erforderlich sein?" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1490 msgid "Whether this check is volatile." msgstr "Ist dieser Check sprunghaft (volatile)?" #: ../../../../application/forms/IcingaDependencyForm.php:95 #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:84 msgid "Whether this dependency should affect hosts or services" msgstr "Soll diese Abhängigkeit Hosts oder Services betreffen" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:49 msgid "" "Whether this downtime is fixed or flexible. If unsure please check the " "related documentation: https://icinga.com/docs/icinga2/latest/doc/08-" "advanced-topics/#downtimes" msgstr "" "Ob diese Downtime fix oder flexibel ist. Im Zweifel bitte die entsprechende " "Dokumentation zu Rate ziehen: https://icinga.com/docs/icinga2/latest/doc/08-" "advanced-topics/#downtimes" #: ../../../../application/forms/IcingaObjectFieldForm.php:107 msgid "Whether this field should be mandatory" msgstr "Soll dieses Feld Pflicht sein?" #: ../../../../application/forms/IcingaHostForm.php:81 msgid "Whether this host has the Icinga 2 Agent installed" msgstr "Hat dieser Host den Icinga-2-Agent installiert?" #: ../../../../application/forms/IcingaNotificationForm.php:84 msgid "Whether this notification should affect hosts or services" msgstr "Soll diese Benachrichtigung Hosts oder Services betreffen" #: ../../../../application/forms/IcingaCommandArgumentForm.php:109 msgid "" "Whether this parameter should be repeated when multiple values (read: array) " "are given" msgstr "" "Soll dieser Parameter wiederholt werden, wenn mehrere Werte (in einem Array) " "angegeben werden" #: ../../../../library/Director/DataType/DataTypeDatalist.php:136 msgid "" "Whether this should be a String or an Array in the generated Icinga " "configuration. In case you opt for Array, Director users will be able to " "select multiple elements from the list" msgstr "" "Ob dies ein String oder ein Array in der generierten Icinga-Konfiguration " "sein soll. Wird Array gewählt, können Director-Benutzer mehrere Elemente aus " "einer Liste wählen" #: ../../../../application/forms/IcingaZoneForm.php:24 msgid "" "Whether this zone should be available everywhere. Please note that it rarely " "leads to the desired result when you try to distribute global zones in " "distrubuted environments" msgstr "" "Soll diese Zone überall verfügbar sein? Beachte, dass es selten zielführend " "ist, globale Zonen in verteilten Umgebungen zu verteilen" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1438 msgid "Whether to accept passive check results for this object" msgstr "Sollen passive Checkergebnisse für dieses Objekt akzeptiert werden?" #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1432 msgid "Whether to actively check this object" msgstr "Soll dieses Objekt aktiv geprüft werden?" #: ../../../../application/forms/SelfServiceSettingsForm.php:33 msgid "Whether to adjust your host name" msgstr "Ob der Hostname angepasst werden soll" #: ../../../../application/forms/SyncRuleForm.php:84 msgid "Whether to delete or to disable objects subject to purge" msgstr "Ob zu bereinigende Objekte deaktiviert oder gelöscht werden sollen" #: ../../../../application/forms/IcingaDependencyForm.php:161 msgid "" "Whether to disable checks when this dependency fails. Defaults to false." msgstr "" "Ob Checks deaktiviert werden sollen, wenn diese Abhängigkeit fehlschlägt. " "Standardmäßig ist dies nicht der Fall." #: ../../../../application/forms/IcingaDependencyForm.php:169 msgid "" "Whether to disable notifications when this dependency fails. Defaults to " "true." msgstr "" "Sollen Benachrichtigungen deaktiviert werden, wenn diese Abhängigkeit " "fehlschlägt. Standard-Einstellung ist Ja." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1450 msgid "Whether to enable event handlers this object" msgstr "Sollen Event-Handler für dieses Objekt aktiviert werden?" #: ../../../../application/forms/IcingaDependencyForm.php:177 msgid "" "Whether to ignore soft states for the reachability calculation. Defaults to " "true." msgstr "" "Ob Soft-States für die Berechnung der Erreichbarkeit berücksichtigt werden " "sollen. Dies ist standardmäßig der Fall." #: ../../../../application/forms/IcingaTimePeriodForm.php:77 msgid "Whether to prefer timeperiods includes or excludes. Default to true." msgstr "" "Ob das Einbinden oder Ausschließen von Zeiträumen bevorzugt werden soll. " "Standard-Einstellung ist Ja." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1456 msgid "Whether to process performance data provided by this object" msgstr "Sollen Performancedaten von diesem Objekt verarbeitet werden?" #: ../../../../application/forms/SyncRuleForm.php:72 msgid "" "Whether to purge existing objects. This means that objects of the same type " "will be removed from Director in case they no longer exist at your import " "source." msgstr "" "Sollen existierende Objekte entfernt werden? Das bedeutet, dass Objekte " "desselben Typs aus dem Director entfernt werden, falls sie in der " "Importquelle nicht mehr vorhanden sein sollten." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1444 msgid "Whether to send notifications for this object" msgstr "Sollen Benachrichtigungen für dieses Objekt verschickt werden?" #: ../../../../application/forms/IcingaUserForm.php:90 msgid "Whether to send notifications for this user" msgstr "Sollen Benachrichtigungen für diesen Benutzer verschickt werden?" #: ../../../../library/Director/Import/ImportSourceRestApi.php:130 msgid "Whether to use encryption when talking to the REST API" msgstr "" "Ob für die Verbindung zu dieser REST-API Verschlüsselung benutzt werden soll" #: ../../../../library/Director/Import/ImportSourceRestApi.php:171 msgid "" "Whether we should check that our peer's certificate has been signed by a " "trusted CA. This is strongly recommended." msgstr "" "Ob wir prüfen sollen, dass das Zertifikat unseres Gegenübers von einer " "vertrauenswürdigen Zertifizierungsstelle signiert wurde. Das wird " "strengstens empfohlen." #: ../../../../library/Director/Import/ImportSourceRestApi.php:178 msgid "Whether we should check that the certificate matches theconfigured host" msgstr "" "Ob geprüft werden soll, dass die Zertifikate zum konfigurierten Host passen" #: ../../../../application/forms/SyncPropertyForm.php:119 msgid "" "Whether you want to merge or replace the destination field. Makes no " "difference for strings" msgstr "" "Soll das Zielfeld zusammengeführt oder ersetzt werden? Macht keinen " "Unterschied für Zeichenketten" #: ../../../../application/forms/DirectorDatalistEntryForm.php:24 msgid "" "Will be stored as a custom variable value when this entry is chosen from the " "list" msgstr "" "Wird als benutzerdefinierte Variable gespeichert, wenn dieser Eintrag aus " "der Liste gewählt wird" #: ../../../../library/Director/Import/ImportSourceRestApi.php:228 msgid "Will be used to authenticate against your REST API" msgstr "Wird für die Authentifizierung gegen die REST-API benutzt" #: ../../../../library/Director/Web/SelfService.php:234 msgid "Windows Kickstart Script" msgstr "Kickstart-Skript für Windows" #: ../../../../application/forms/DirectorDatafieldForm.php:53 msgid "Wipe related vars" msgstr "Zugehörige Eigenschaften leeren" #: ../../../../application/forms/IcingaScheduledDowntimeForm.php:102 msgid "With Services" msgstr "Mit Services" #: ../../../../library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:19 msgid "Wondering about what changed why? Track your changes!" msgstr "Hier kann nachvollzogen werden, was weshalb verändert wurde." #: ../../../../library/Director/Dashboard/InfrastructureDashboard.php:35 msgid "Working with Agents and Config Zones" msgstr "Mit Agenten und Konfigurationszonen arbeiten" #: ../../../../application/views/helpers/FormDataFilter.php:525 msgid "Wrap this expression into an operator" msgstr "Diesen Ausdruck in einen Operator packen" #: ../../../../application/forms/IcingaDeleteObjectForm.php:17 #, php-format msgid "YES, please delete \"%s\"" msgstr "JA, bitte \"%s\" löschen" #: ../../../../library/Director/Job/ImportJob.php:101 #: ../../../../library/Director/Job/ConfigJob.php:39 #: ../../../../library/Director/Job/ConfigJob.php:51 #: ../../../../library/Director/Job/SyncJob.php:101 #: ../../../../library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:25 #: ../../../../application/forms/IcingaZoneForm.php:30 #: ../../../../application/forms/SettingsForm.php:59 #: ../../../../application/forms/SettingsForm.php:74 #: ../../../../application/forms/SettingsForm.php:96 #: ../../../../application/forms/SelfServiceSettingsForm.php:239 msgid "Yes" msgstr "Ja" #: ../../../../application/controllers/BasketsController.php:41 msgid "" "You can create Basket snapshots at any time, this will persist a serialized " "representation of all involved objects at that moment in time. Snapshots can " "be exported, imported, shared and restored - to the very same or another " "Director instance." msgstr "" "Basket-Snapshots können jederzeit erstellt werden, damit wird eine " "serialisierte Darstellung aller involvierten Objekte zum gegebenen Zeitpunkt " "persistiert. Snapshots können exportiert, importiert, geteilt und " "wiederhergestellt werden - zur selben oder einer anderen Director-Instanz." #: ../../../../library/Director/Web/SelfService.php:129 msgid "" "You can stop sharing a Template at any time. This will immediately " "invalidate the former key." msgstr "" "Die Freigabe einer Vorlage kann jederzeit widerrufen werden. Das macht den " "vorherigen Schlüssel sofort ungültig." #: ../../../../library/Director/Job/ImportJob.php:94 #: ../../../../library/Director/Job/SyncJob.php:94 msgid "" "You could immediately apply eventual changes or just learn about them. In " "case you do not want them to be applied immediately, defining a job still " "makes sense. You will be made aware of available changes in your Director " "GUI." msgstr "" "Änderungen können sofort angewandt oder nur angezeigt werden. Falls sie " "nicht sofort angewandt werden, ist es immer noch sinnvoll, einen Auftrag zu " "erstellen. Verfügbare Änderungen werden in der Director-GUI angezeigt." #: ../../../../application/forms/SelfServiceSettingsForm.php:74 msgid "" "You might want to let the generated Powershell script install the Icinga 2 " "Agent in an automated way. If so, please choose where your Windows nodes " "should fetch the Agent installer" msgstr "" "Es kann erwünscht sein, dass das generierte Powershell-Script den Icinga-2-" "Agenten automatisch installiert. Falls das gewünscht ist gilt es hier zu " "wühlen, von wo sich die Windows-Knoten den Agenten-Installer besorgen sollen" #: ../../../../application/forms/IcingaObjectFieldForm.php:118 msgid "" "You might want to show this field only when certain conditions are met. " "Otherwise it will not be available and values eventually set before will be " "cleared once stored" msgstr "" "Es könnte erwünscht sein, dieses Feld nur unter bestimmten Bedingungen " "anzuzeigen. Treffen diese nicht zu wird es nicht angezeigt, eventuell " "zugehörige Eigenschaften werden beim Speichern dann auch wieder entfernt." #: ../../../../application/forms/ImportRowModifierForm.php:44 msgid "" "You might want to write the modified value to another (new) property. This " "property name can be defined here, the original property would remain " "unmodified. Please leave this blank in case you just want to modify the " "value of a specific property" msgstr "" "Es kann erwünscht sein, den geänderten Wert in eine andere (neue) " "Eigenschaft zu schreiben. Dieser Eigenschaftsname kann hier definiert " "werden, die ursprüngliche Eigenschaft bleibt dann unverändert. Falls " "lediglich der ursprüngliche Wert an Ort und Stelle geändert werden soll, " "dieses Feld bitte leer lassen" #: ../../../../application/controllers/SyncruleController.php:153 #, php-format msgid "You must define some %s before you can run this Sync Rule" msgstr "" "Bevor dieses Synchronisationsregel ausgeführt werden kann, müssen %s " "definiert werden" #: ../../../../library/Director/Web/Widget/BranchedObjectsHint.php:21 msgid "" "You're currently in the master branch, your changes will make part of the " "next Deployment" msgstr "" "Befindet man sich im master-Branch, werden durchgeführte Änderungen Teil des " "nächsten Deployments" #: ../../../../library/Director/Dashboard/BranchesDashboard.php:21 #, php-format msgid "You're currently working in a Configuration Branch: %s" msgstr "Gegenwärtig wird in einem Konfigurationszweig gearbeitet: %s" #: ../../../../library/Director/Dashboard/BranchesDashboard.php:28 msgid "You're currently working in the main Configuration Branch" msgstr "Gegenwärtig wird im Hauptkonfigurationszweig gearbeitet" #: ../../../../application/controllers/IndexController.php:35 #, php-format msgid "" "Your DB schema (migration #%d) is newer than your code base. Downgrading " "Icinga Director is not supported and might lead to unexpected problems." msgstr "" "Das Datenbankschema (Migration #%d) ist neuer als der installierte " "Quellcode. Ein Downgrade des Icinga Directors wird nicht unterstützt und " "kann zu unerwarteten Problemen führen." #: ../../../../application/forms/KickstartForm.php:157 msgid "Your Icinga 2 API username" msgstr "Der Icinga-2-API Benutzername" #: ../../../../library/Director/Import/ImportSourceLdap.php:52 msgid "" "Your LDAP search base. Often something like OU=Users,OU=HQ,DC=your," "DC=company,DC=tld" msgstr "" "Die LDAP Suchbasis. Meist etwas wie OU=Users,OU=HQ,DC=your,DC=company,DC=tld" #: ../../../../library/Director/Web/Widget/BranchedObjectHint.php:52 #, php-format msgid "Your changes are going to be stored in %s." msgstr "Die Änderungen werden in %s gespeichert werden." #: ../../../../application/forms/KickstartForm.php:98 msgid "" "Your configuration looks good. Still, you might want to re-run this " "kickstart wizard to (re-)import modified or new manually defined Command " "definitions or to get fresh new ITL commands after an Icinga 2 Core upgrade." msgstr "" "Die Konfiguration sieht gut aus. Dennoch kann dieser Kickstart-Assistent " "jederzeit neu ausgeführt werden, um geänderte oder neu erstellte " "Kommandodefinitionen oder neue ITL-Kommandos nach einem Icinga-2-Core-" "Upgrade (neu) zu importieren." #: ../../../../application/forms/KickstartForm.php:76 #, php-format msgid "Your database looks good, you are ready to %s" msgstr "" "Datenbank sieht gut aus. Icinga Director sollte jetzt fertig für %s sein." #: ../../../../application/forms/KickstartForm.php:110 msgid "" "Your installation of Icinga Director has not yet been prepared for " "deployments. This kickstart wizard will assist you with setting up the " "connection to your Icinga 2 server." msgstr "" "Diese Icinga-Director-Installation wurde noch nicht zum Ausrollen von " "Konfiguration vorbereitet. Dieser Kickstart-Assistent hilft bei der " "Einrichtung der Verbindung zum Icinga 2 Server." #: ../../../../library/Director/Web/Form/DirectorObjectForm.php:1375 msgid "Your regular check interval" msgstr "Der übliche Check-Intervall" #: ../../../../library/Director/PropertyModifier/PropertyModifierReplaceNull.php:20 #: ../../../../library/Director/PropertyModifier/PropertyModifierReplace.php:20 msgid "Your replacement string" msgstr "Die Ersatzzeichenkette" #: ../../../../application/forms/IcingaTemplateChoiceForm.php:67 msgid "Your users will be allowed to choose among those templates" msgstr "Benutzern wird erlaubt, zwischen diesen Vorlagen zu wählen" #: ../../../../library/Director/TranslationDummy.php:15 #: ../../../../library/Director/Import/ImportSourceDirectorObject.php:73 #: ../../../../library/Director/Web/Table/ObjectsTableEndpoint.php:21 #: ../../../../application/forms/SyncRuleForm.php:26 msgid "Zone" msgstr "Zone" #: ../../../../application/forms/IcingaZoneForm.php:14 msgid "Zone name" msgstr "Zonenname" #: ../../../../application/forms/IcingaUserForm.php:76 #: ../../../../application/forms/IcingaNotificationForm.php:66 #: ../../../../application/forms/IcingaCommandForm.php:110 #: ../../../../application/forms/IcingaUserGroupForm.php:42 #: ../../../../application/forms/IcingaDependencyForm.php:61 msgid "Zone settings" msgstr "Zoneneinstellungen" #: ../../../../library/Director/Dashboard/Dashlet/ZoneObjectDashlet.php:15 #: ../../../../library/Director/Db/Branch/BranchModificationInspection.php:36 #: ../../../../library/Director/Import/ImportSourceCoreApi.php:64 msgid "Zones" msgstr "Zonen" #: ../../../../application/forms/SyncPropertyForm.php:348 msgid "a list" msgstr "eine Liste" #: ../../../../library/Director/Web/Widget/InspectPackages.php:122 msgid "active" msgstr "aktiv" #: ../../../../library/Director/Web/Widget/AdditionalTableActions.php:88 msgid "all" msgstr "alle" #: ../../../../library/Director/Web/ActionBar/DirectorBaseActionBar.php:35 #: ../../../../library/Director/Web/Controller/ActionController.php:182 #: ../../../../library/Director/Web/Controller/ObjectController.php:281 #: ../../../../library/Director/Web/Controller/ObjectController.php:649 #: ../../../../application/controllers/ServiceController.php:156 #: ../../../../application/controllers/ServiceController.php:216 #: ../../../../application/controllers/HostController.php:542 #: ../../../../application/controllers/BasketController.php:96 #: ../../../../application/controllers/BasketController.php:114 #: ../../../../application/controllers/BasketController.php:133 #: ../../../../application/controllers/BasketController.php:368 #: ../../../../application/controllers/ImportsourceController.php:366 #: ../../../../application/controllers/SyncruleController.php:611 #: ../../../../application/controllers/DataController.php:138 msgid "back" msgstr "Zurück" #: ../../../../library/Director/Web/Widget/BranchedObjectsHint.php:29 #: ../../../../library/Director/Web/Controller/ObjectController.php:733 #: ../../../../application/controllers/ConfigController.php:448 msgid "configuration branch" msgstr "Konfigurationszweig" #: ../../../../application/locale/translateMe.php:11 msgid "critical" msgstr "Kritisch" #: ../../../../library/Director/Web/Table/Dependency/DependencyInfoTable.php:57 msgid "disabled" msgstr "deaktiviert" #: ../../../../library/Director/Dashboard/InfrastructureDashboard.php:32 #: ../../../../application/controllers/DaemonController.php:43 msgid "documentation" msgstr "Dokumentation" #: ../../../../application/locale/translateMe.php:6 msgid "down" msgstr "Down" #: ../../../../application/forms/IcingaCommandArgumentForm.php:27 msgid "e.g. -H or --hostname, empty means \"skip_key\"" msgstr "z.B. -H oder --hostname, leer bedeutet \"skip_key\"" #: ../../../../application/forms/IcingaCommandArgumentForm.php:61 msgid "e.g. 5%, $host.name$, $lower$%:$upper$%" msgstr "z.B. 5%, $host.name$, $lower$%:$upper$%" #: ../../../../application/forms/SyncPropertyForm.php:165 msgid "failed to fetch" msgstr "Abholen fehlgeschlagen" #: ../../../../library/Director/Util.php:161 #: ../../../../library/Director/Web/Form/ClickHereForm.php:17 #: ../../../../application/forms/KickstartForm.php:236 msgid "here" msgstr "hier" #: ../../../../application/forms/IcingaHostVarForm.php:23 msgid "host var name" msgstr "host var name" #: ../../../../application/forms/IcingaHostVarForm.php:28 msgid "host var value" msgstr "host var value" #: ../../../../library/Director/Web/Table/Dependency/DependencyInfoTable.php:60 msgid "missing" msgstr "fehlend" #: ../../../../application/controllers/BasketController.php:304 msgid "modified" msgstr "geändert" #: ../../../../library/Director/Web/Table/Dependency/DependencyInfoTable.php:65 msgid "more" msgstr "mehr" #: ../../../../application/controllers/BasketController.php:314 msgid "new" msgstr "neu" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:78 msgid "no" msgstr "nein" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:222 msgid "no related group exists" msgstr "keine verwandte Gruppe existiert" #: ../../../../application/locale/translateMe.php:9 msgid "ok" msgstr "ok" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:316 msgid "on host" msgstr "auf dem Host" #: ../../../../library/Director/Web/Widget/ActivityLogInfo.php:298 msgid "on service set" msgstr "am Service-Set" #: ../../../../library/Director/Dashboard/Dashlet/Dashlet.php:224 msgid "one related group exists" msgstr "eine verwandte Gruppe existiert" #: ../../../../application/locale/translateMe.php:8 msgid "pending" msgstr "ausstehend" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:71 #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:56 #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexSplit.php:29 #: ../../../../library/Director/PropertyModifier/PropertyModifierSplit.php:29 msgid "return NULL" msgstr "NULL zurückgeben" #: ../../../../library/Director/PropertyModifier/PropertyModifierArrayFilter.php:70 #: ../../../../library/Director/PropertyModifier/PropertyModifierRegexSplit.php:28 #: ../../../../library/Director/PropertyModifier/PropertyModifierSplit.php:28 msgid "return an empty array" msgstr "ein leeres Array zurückliefern" #: ../../../../application/forms/IcingaServiceVarForm.php:23 msgid "service var name" msgstr "service var name" #: ../../../../application/forms/IcingaServiceVarForm.php:28 msgid "service var value" msgstr "service var value" #: ../../../../application/forms/KickstartForm.php:78 msgid "start working with the Icinga Director" msgstr "die Arbeit mit dem Icinga Director zu beginnen" #: ../../../../library/Director/Web/Widget/BranchedObjectHint.php:24 msgid "the main configuration branch" msgstr "der Hauptkonfigurationszweig" #: ../../../../library/Director/Web/Widget/BranchedObjectHint.php:36 msgid "this configuration branch" msgstr "diesem Konfigurationszweig" #: ../../../../application/controllers/BasketController.php:310 msgid "unchanged" msgstr "unverändert" #: ../../../../application/locale/translateMe.php:12 msgid "unknown" msgstr "Unbekannt" #: ../../../../application/locale/translateMe.php:7 msgid "unreachable" msgstr "unreachable" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:89 msgid "unsupported" msgstr "nicht unterstützt" #: ../../../../library/Director/Web/Widget/AdditionalTableActions.php:90 msgid "unused" msgstr "unbenutzt" #: ../../../../application/locale/translateMe.php:5 msgid "up" msgstr "up" #: ../../../../library/Director/Web/Widget/AdditionalTableActions.php:89 msgid "used" msgstr "benutzt" #: ../../../../application/forms/IcingaServiceVarForm.php:33 #: ../../../../application/forms/IcingaHostVarForm.php:33 msgid "value format" msgstr "Wertformat" #: ../../../../library/Director/Web/Table/GroupMemberTable.php:74 #: ../../../../library/Director/Web/Table/GroupMemberTable.php:79 msgid "via" msgstr "via" #: ../../../../application/locale/translateMe.php:10 msgid "warning" msgstr "warning" #: ../../../../library/Director/Web/Widget/BackgroundDaemonDetails.php:77 msgid "yes" msgstr "ja" #~ msgid "A description about the field" #~ msgstr "Eine Beschreibung des Feldes" #~ msgid "Icinga 2 Powershell Module" #~ msgstr "Icinga 2 Powershell Modul" #, php-format #~ msgid "In case you're using the legacy %s, please run:" #~ msgstr "" #~ "Falls das vorherige %s benutzt wird, bitte dieses Script ausführen:" #~ msgid "The caption which should be displayed" #~ msgstr "Die Beschriftung, die angezeigt werden soll" #, php-format #~ msgid "" #~ "Your changes will be stored in %s. The'll not be part of any deployment " #~ "unless being merged" #~ msgstr "" #~ "Änderungen werden in %s gespeichert. Sie sind nicht Teil eines " #~ "eventuellen Deployments, solange sie nicht zusammengeführt werden" #~ msgid "Create a new Service Set" #~ msgstr "Ein neues Service-Set erstellen" #, php-format #~ msgid "" #~ "This allows you to modify properties for \"%s\" (deployed from director)" #~ msgstr "" #~ "Dies erlaubt das Ändern von Eigenschaften für \"%s\" (ausgerollt vom " #~ "Director)" #~ msgid "" #~ "This allows you to modify properties for all chosen hosts (deployed from " #~ "director) at once" #~ msgstr "" #~ "Hiermit lassen sich Eigenschaften für alle gewählten (und vom Director " #~ "ausgerollten) Hosts auf einmal ändern" #, fuzzy #~ msgid "Please choose a specific Icinga object type. All " #~ msgstr "Bitte einen bestimmten Icinga-Objekttyp auswählen" #~ msgid "- inherited -" #~ msgstr "- geerbt -" #~ msgid "Blacklist" #~ msgstr "Blacklist" #~ msgid "Generated from host vars" #~ msgstr "Aus Host-Variablen generiert" #~ msgid "%s (where %s)" #~ msgstr "%s (wo %s)" #~ msgid "Add Service: %s" #~ msgstr "Service hinzufügen: %s" #~ msgid "The parent host." #~ msgstr "Der Eltern-Host." #~ msgid "" #~ "This allows you to configure an assignment filter. Please feel free to " #~ "combine as many nested operators as you want" #~ msgstr "" #~ "Hiermit lässt sich ein Zuweisungsfilter (assign) definieren. Dabei lassen " #~ "sich beliebig viele Operatoren beliebig tief verschachtelt benutzen" #~ msgid "This must be an import source column (property)" #~ msgstr "Muss eine Spalte der Importquelle sein (Eigenschaft)" #~ msgid "Name for the Icinga timeperiod you are going to create" #~ msgstr "Name des Icinga-Zeitraums, der erstellt werden soll" #~ msgid "Name for the Icinga timperiod template you are going to create" #~ msgstr "Name der Icinga-Zeitraum-Vorlage, die erstellt werden soll" #~ msgid "Please define a Service Template first" #~ msgstr "Bitte zuerst eine entsprechende Service-Vorlage definieren" #~ msgid "Serviceset" #~ msgstr "Service-Set" #~ msgid "Timeperiod" #~ msgstr "Zeitraum" #~ msgid "Timeperiod object" #~ msgstr "Zeitraumobjekt" #~ msgid "Timeperiod template" #~ msgstr "Zeitraumvorlage" #~ msgid "Timeperiod template name" #~ msgstr "Zeitraumvorlagenname" #~ msgid "Whether this should be a template" #~ msgstr "Soll dies eine Vorlage sein?" #~ msgid "the display name" #~ msgstr "Der Anzeigename" #~ msgid "the update method" #~ msgstr "die Updatemethode" #~ msgid "Change priority" #~ msgstr "Priorität ändern" #~ msgid "Count Query" #~ msgstr "Count-Abfage" #~ msgid "Move down (lower priority)" #~ msgstr "Nach unten schieben (Priorität verringern)" #~ msgid "Move up (raise priority)" #~ msgstr "Nach oben schieben (Priorität erhöhen)" #~ msgid "Next page" #~ msgstr "Nächste Seite" #~ msgid "Pagination" #~ msgstr "Seitennavigation" #~ msgid "Previous page" #~ msgstr "Vorhergehende Seite" #~ msgid "Prio" #~ msgstr "Prio" #~ msgid "SQL Query" #~ msgstr "SQL-Abfrage" #~ msgid "Search is simple! Try to combine multiple words" #~ msgstr "Suchen ist einfach! Versuche, mehrere Wörter zu kombinieren" #~ msgid "Search..." #~ msgstr "Suchen..." #~ msgid "Show rows %u to %u of %u" #~ msgstr "Zeige die Zeilen %u bis %u von %u" #~ msgid "This feature is still experimental" #~ msgstr "Dieses Feature ist noch experimentell" #~ msgid "Filter available service sets" #~ msgstr "Verfügbare Service-Sets filtern" #~ msgid "Set Members" #~ msgstr "Set-Mitglieder" #~ msgid "s" #~ msgstr "s" #~ msgid "Activity log entry" #~ msgstr "Aktivitätslogeintrag" #~ msgid "Add a job" #~ msgstr "Auftrag hinzufügen" #~ msgid "Add job" #~ msgstr "Auftrag hinzufügen" #~ msgid "Add list" #~ msgstr "Liste hinzufügen" #~ msgid "Apply Icinga %s" #~ msgstr "Icinga %s anwenden" #~ msgid "Clone Icinga %s" #~ msgstr "Klone Icinga %s" #~ msgid "Configs" #~ msgstr "Konfigurationen" #~ msgid "Create immediately" #~ msgstr "Sofort erstellen" #~ msgid "Deploy to master" #~ msgstr "Auf den Master ausbringen" #~ msgid "Edit import source" #~ msgstr "Importquelle bearbeiten" #~ msgid "Edit sync property rule" #~ msgstr "Synchronisationseigenschaftsregel bearbeiten" #~ msgid "Entries" #~ msgstr "Einträge" #~ msgid "Icinga " #~ msgstr "Icinga " #~ msgid "Icinga %s" #~ msgstr "Icinga %s" #~ msgid "Job %s" #~ msgstr "Auftrag %s" #~ msgid "No object found" #~ msgstr "Kein Objekt gefunden" #~ msgid "Object name" #~ msgstr "Objektname" #~ msgid "Show unfiltered" #~ msgstr "Ungefiltert zeigen" #~ msgid "Sync run details" #~ msgstr "Synchronisationslaufdetails" #~ msgid "Template tree" #~ msgstr "Vorlagenbaum" #~ msgid "" #~ "This is an external object. It has been imported from Icinga 2 through " #~ "the Core API and cannot be managed with the Icinga Director. It is " #~ "however perfectly valid to create objects using this or referring to this " #~ "object. You might also want to define related Fields to make work based " #~ "on this object more enjoyable." #~ msgstr "" #~ "Dies ist ein externes Objekt. Es wurde von Icinga 2 durch die Core API " #~ "importiert und kann nicht mit Icinga Director verwaltet werden. Objekte, " #~ "die sich auf dieses Objekt beziehen, können jedoch mit dem Director " #~ "erstellt werden. Außerdem können darauf bezugnehmende Felder erstellt " #~ "werden, um die Arbeit zu erleichtern." #~ msgid "Time" #~ msgstr "Zeit" #~ msgid "Allow to see template details" #~ msgstr "Erlauben, Details von Vorlagen zu sehen" #~ msgid "Allow to use only host templates matching this filter" #~ msgstr "" #~ "Nur die Verwendung von Hostvorlagen, die diesem Filter entsprechen, " #~ "erlauben" #~ msgid "Allow to use only these db resources (comma separated list)" #~ msgstr "" #~ "Nur die Verwendung dieser DB Ressourcen erlauben (kommaseparierte Liste)" #~ msgid "Command-specific custom vars" #~ msgstr "Kommandospezifische benutzerdefinierte Variablen" #~ msgid "Config history" #~ msgstr "Konfigurationshistorie" #~ msgid "" #~ "Data fields allow you to customize input controls your custom variables." #~ msgstr "" #~ "Datenfelder erlauben das Anpassen der Eingabekontrollen von " #~ "benutzerdefinierten Variablen." #~ msgid "Expression" #~ msgstr "Ausdruck" #~ msgid "Operator" #~ msgstr "Operator" #~ msgid "Owner" #~ msgstr "Besitzer" #~ msgid "Service configs" #~ msgstr "Servicekonfigurationen" #~ msgid "The unique name of the field" #~ msgstr "Der eindeutige Name des Felds" #~ msgid "There are pending database schema migrations" #~ msgstr "Es sind Datenbankmigrationen ausständig" #~ msgid "by host group property" #~ msgstr "Nach Hostgruppeneigenschaft" #~ msgid "check command" #~ msgstr "Check-Kommando" #~ msgid "to a host group" #~ msgstr "zu einer Hostgruppe" #~ msgid "%s template \"%s\": custom fields" #~ msgstr "%s Vorlage \"%s\": benutzerdefinierte Felder" #~ msgid "Add entry" #~ msgstr "Eintrag hinzufügen" #~ msgid "Deployments / History" #~ msgstr "Deployments / Historie" #~ msgid "Edit sync rule" #~ msgstr "Synchronisationsregel bearbeiten" #~ msgid "Filter string" #~ msgstr "Filterzeichenkette" #~ msgid "Import / Sync" #~ msgstr "Import / Synchronisierung" #~ msgid "Import runs" #~ msgstr "Importläufe" #~ msgid "Run" #~ msgstr "Ausführen" #~ msgid "Unable to store the configuration to \"%s\"" #~ msgstr "Konfiguration kann nicht nach \"%s\" gespeichert werden" #~ msgid "Purge existing values." #~ msgstr "Existierende Werte bereinigen" #~ msgid "Whether the field should be merged, replaced or ignored" #~ msgstr "Soll das Feld zusammengeführt, ersetzt oder ignoriert werden?" #~ msgid "Alert your users" #~ msgstr "Benutzer alarmieren" #~ msgid "Manage deployments, access audit log and history" #~ msgstr "" #~ "Deployments verwalten, auf die Revisionsaufzeichnungen und die Historie " #~ "zugreifen" #~ msgid "Name for the Icinga zone (templat) you are going to create" #~ msgstr "Name der Icinga-Zone (Vorlage), die erstellt werden soll" #~ msgid "Zone (template) name" #~ msgstr "Zonen(vorlagen)name" #~ msgid "click here" #~ msgstr "Hier klicken" #~ msgid "database schema" #~ msgstr "Datenbankschema" #~ msgid "e.g. " #~ msgstr "z.B." #~ msgid "start using" #~ msgstr "start mit" icingaweb2-module-director-1.11.8/application/locale/it_IT/000077500000000000000000000000001516513262500234705ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/locale/it_IT/LC_MESSAGES/000077500000000000000000000000001516513262500252555ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/locale/it_IT/LC_MESSAGES/director.mo000066400000000000000000004421711516513262500274360ustar00rootroot00000000000000Þ•œ(ÅQ0l1lHlXl_lflnl ‚ll«lÇlÚlól m m 9m DmOmXm8tm ­m¹mÖmómn"n?n(]n†nŸn¾n×nðn o %o/o?oXo io vo „o‘o? oào!þo p>p*Vpp¡pºpÁpÓp ép÷pq,q 4qAq Wqeqƒq•q¤qÁ©r²kst@xNxjx€x’x ¢x¬xÁxÕx íxûxyy0yJy`y,sy y ´y¾yÐyØyáyóyz $z0z@zXzoz …z “z ¡zÂzØz Þzìzýz {T{d| €|)Œ|¶|Î| ä| ò|5} I}"j}} ¦}Ç}ç}~'~D~Wb~º~AØ~:5U;‹JÇ,€?€ O€+]€4‰€0¾€sï€<c4 tÕJ‚:Ê‚kƒ^qƒªÐƒ3{„ž¯„gN…¶…~6†fµ†d‡N‡jЇ;ˆZˆ cˆnˆ}ˆ‘ˆ¢ˆ ¨ˆ"³ˆ Öˆàˆ ðˆûˆ ‰ $‰ E‰GS‰ ›‰¦‰¹‰щ Ú‰ä‰í‰ ý‰ ŠŠ Š(Š /Š<Š OŠZŠlŠqŠxŠ ‹Š—ЍŠÁŠðÉŠº‹ Á‹Ë‹Ó‹,㋌ Œ-ŒPFŒ—Œ§Œ¹Œ ÈŒ ÕŒ"ãŒ% . 9 GS¯[ Ž"Ž<Ž RŽ9^Ž˜Ž±#Ñõ û)8*N6y=° î øU‘[‘c‘w‘ˆ‘š‘°‘ Á‘ ΑÛ‘ø‘’6 ’@’S’d’k’}’ –’¢’1³’å’““$“ ,“:“T“j““?“*Ý“” ”%” ,”:”J”e”(y”-¢”!Дò”••9•P• c•q•y•‚•™•ª•º•וè•ÿ•–#–7–I–Y–q–‚–•– ž– ª–·–Ç–<Ζ@ —LL— ™— ¥—¯— ¿— Í— Ø—ä—Hó˜8<™ u™ ™BŠ™ ÍšךèšíšÑôšÆ›¶Ú›‘œ{¤œÌ 3íž!Ÿ;<ŸÜxŸ(U A~ UÀ y¡2¡á Ê¡ Ô¡ á¡ì¡ó¡) ¢7¢N¢ _¢j¢z¢¢*¢È¢ Ø¢ä¢ ú¢£ "£.£t@£µ£º£Ñ£Ø£ó£¤¤1/¤a¤p¤‡¤˜¤;¡¤%ݤ ¥ ¥¥/¥H¥ `¥n¥s¥|¥¥!¨¥ Ê¥ Ø¥æ¥÷¥¦!¦=¦ F¦ S¦^¦ q¦{¦“¦¢¦³¦¹¦ʦߦõ¦ þ¦ §§ 4§>§F§L§a§ }¨‹¨-¤¨%Ò¨ø¨©+©I©]© p© |©‡©§©°©Í©Iß©)ªWHª ª¥ª¬ªŪ ܪ çªòªùªþª)«$:«\_«¼« Ú« è« ö«¬¬#¬ ,¬K:¬†¬–¬°¬Gɬ/­A­U­n­0~­¯­Ï­ Ö­"ä­®%®8®I®$b®5‡®½®Ö® ò® ÿ® ¯¯ *¯7¯M=¯‹¯œ¯{±¯-°4° N°Y°v°G}°Ṵ̋Õ°è°± ±± (± 3± ?± I±W±l± {±lˆ± õ± ² ²&² ?²L²\²q² ‡² ‘²Œœ²)´2´P´V´ûo´$kµ$µ$µµžÚµ y·†· Ž·˜·§·¾·Ô·ò·¸ "¸-¸ =¸!^¸€¸ž¸T<¹[‘¹ í¹ù¹ºÒ#º&öº(»)F¼&p¼ —¼¨£¼ L½ X½ f½q½€½9ƒ½(½½æ½í½þ½ ¾ ¾-¾<¾P¾ e¾p¾ ‡¾ “¾¡¾´¾ξŽà¾)o¿ ™¿e§¿ ÁlÁµ‚Ág8 ÂZ´ÃFÄ%VÄ|ċĔįľÄÓÄäÄúÄÅÅ+Å ?ÅIÅZÅ6lÅ\£Å²Æ‡³Æ|;Ç)¸ÇâÇæÇíÇýÇÈÈÈÈ?0ÈpÈ#‡È«È½È"ØÈûÈÉÉ 'É1ÉBÉSÉYÉ kÉxÉŠÉ Éo¶Ét&Êt›ËÍ$ÍBÍ<`ÍÍ ¯Í ¼Í ÉÍoÓÍ CÎPÎo`Î0ÐÎÏÏ65Ï>lÏ;«Ï çÏñÏ)Ð+ÐFÐZÐ vЗÐ,œÐÉÐ ÏÐ ÙÐZúÐ:UÑ0Ñ ÁÑ$ÎÑóÑ^ ÒhÒ~Ò“Ò©ÒÇÒ ÞÒ(ìÒÖ&Ö)Ö0Ö BÖ NÖ[ÖvÖ Ö›Ö ­Ö¹ÖÊÖcÛÖ ?×J×=jר×Ä×?á×^!ØE€ØÆØjäØOÙXÙzaÙÜÙ óÙ ÚÚÚ Ú )Ú 5Ú~AÚÀÚÄÚ ÊÚ ÕÚáÚ ðÚüÚÛA Û<OÛ]ŒÛ:êÛ+%Ü:QÜ*ŒÜ'·ÜßÜ&øÜ&Ý\FÝB£ÝßæÝ_ÆÞ&à6à=àBà KàYàkà;{à·à ¿àÍàÒàÚà ëàøàá (á2á;áPá5cá™á Ÿá­á¼áËáÑáèá ïáýáâ&â/â@âESâ™â ²âÓâãâêâãã7ãKã \ã jã&xã Ÿã ©ã´ã¼ãÅãÍã"ããäZäpä ä—ä›ä ³ä ¾ä ËäØä íä úäVå[å_wå×åêå­þå/¬æ Üæ ææ óæç"%ç&Hçoç‚çŠç’ç ¦ç´ç ÃçÏç ìçùç è"è 4èAèQèX`è ¹éÆé Ùéåé öéêê 4ê ?ê LêXêaêzê ‰ê –ê ¡ê­ê ÁêËêßêèêñê³öêªë(Äëíë4 ì>ì CìOìgìpì†ìì#²ì Öì âìðì íí9íLí\íaíjí sí6}í ´íÂí Ôí àí ìíøí î î î3î Rî ]îhî pî |î‰î!î ±î¿î ÆîÑîØîóîùî ï&ï)-ïWï ^ïhïyïŽï ¢ï°ï Àï Ëï€ØïYð ið sðð’ð©ð ¾ðÊð Ðð Úðæðùð ññ #ñ 1ñ ?ñ Mñ,ZñB‡ñ>Êñ# òW-ò…òZ¤ò‘ÿò±‘ó¢Cô’æô0yõ/ªõ,Úõ%öL-özöGŠöÒ÷'í÷ø-ø.Eø9tø®øÆøåø#ù('ùPùsgùjÛùhFú…¯ú5ûJû›bûþûý#ýV4ýP‹ýEÜý+"þ'Nþ4vþ<«þ0èþ!ÿ½;ÿùÿp9‡_Áe!‡?¤(äN \+yV¥Pü%M,sI  ê' 3*8$c0ˆ5¹+ï)6E.|1«)ÝC2K!~A +âs ‚ €› > -[ A‰ Ë "à - ë1 :?X¿˜‚XÜÛd¸|lš;"C0f—b°fJz/ÅFõ<Z8w'°°Øz‰z}JýuH#¾zâ] 1y 2« /Þ !! ! &! 3!?!(R! {!‡! !š!¯!Á!Õ! î! ú! "q"ƒ#Œ#’#¦#½#Ô#å#ê#ý#$$#4$X$]$ m$+{$§$TÀ$)%r?%²%Ì%.Ô%/&3&P&k&‚&›&±& ´& Â&0Ð&'' '0'N' T'!_'' •'¢' §' ²'¾' Í'­Ù'9‡(Á(Ñ( ä( î(ù())3)‡M)$Õ)ú) * * * (* 4* @*K*S*T\*î±* +º¨+œc,§.2¨.2Û.?/*N/Qy/*Ë/Iö/5@01v0C¨0#ì0H1oY1É1bÜ1.?20n2žŸ2†>37Å3¦ý3ˆ¤47-5¦e59 6VF6!6¬¿6 l7H7NÖ7Q%8Dw8¼86Z9r‘9G:[L:Q¨:9ú:4;M; _;5m;%£;É;á;ôå;]Ú<â8=´>§Ð>õx?9n@¨@TÃ@ÙAòAB:&BaB vB €BŽB”B›BŸB¤B »B ÉBÔBÝBíB öBC C-C'=CeCuC zCˆC—CŸC¨C­C±C´CÌCÏC×CæCÿC DD)D+DOl[O(ÈO=ñOj/P„šPtQ$”QT¹QWRfR nRyRR¦R¯R ¶RÁRÈRáR ðRúR S S*1S \S gSsS‡S™S¬SÃSãSýST)Tg igsg …g-’g Àg0ÍgþgIh]hlh‹h ¨h ²h ¾hÈhØh çhñh ÷hi ii =iIi\ieili i‹iœi¸iÀi×j Þj èjój9k>k Mk[kNukÄkÔkêk ùk l8l6Ml„l l™l ¨l ´l¾lm™m´mÎm5ÝmEn#Yo(}o¦o ¬o·oÇoÙoèo9ýo67p>np­p ¶pSÃpqq3qDqVqlq }q Šq5—qÍqÖqCßq#r7rJrYr$vr›rµr<Ñr*s9s"Ssvs…s”s²sÉs"àsLt4Pt…t ˜t¤t «t¹tÉtèt%ýt.#u&Ruyuu#¦uÊu åuñuvvv*vCv'[vƒv œv½vØvóv w%w >w_w&xwŸw ¨w ³wÁwÑwBÚwXxdvx Ûx æxòxyy (y63y^jzEÉz {{x,{ ¥|²|Ã| È|±Ò|„}¼}Z~zo~ýê~9è€("7Kƒ-†‚P´‚eƒ¡kƒ* „8„ @„ M„ X„ c„$o„-”„(„ë„ ……*…D…<_…œ… ³…Á… Ü…è… ††h&††#”†¸†À†Û†ë†‡:‡V‡k‡„‡ ›‡U¨‡1þ‡0ˆEˆZˆ%kˆ‘ˆ©ˆ¸ˆ½ˆň ׈øˆ ‰ %‰3‰D‰U‰#r‰–‰‰ ¯‰½‰Ù‰#é‰# Š1ŠMŠTŠfŠ|ГРœŠªŠ½Š ÔŠÞŠãŠêŠ1‹ 6ŒDŒ1^Œ+Œ¼ŒÌŒ3áŒ/ M Y!e‡«K»ŽV#ŽzŽŽ‡Ž§ŽÁŽ ÐŽÞŽäŽéŽ7üŽ44uißÿ.HPYTlÁÓêP‘CS‘—‘¬‘Ê‘4Ý‘'’:’B’U’u’‘’©’¹’'Ï’@÷’8“!V“ x“ …“’“—“®“À“RÇ“”,”ŽB”єؔ ó”þ”•P%•v• •Œ•(§•ЕØ•Ý• û•– – –.–G–V–|e–â– ö– —' — 4—B—W—p— ‰—•—Ф— u™™™£™™)Äš*îš(›·B›úœ  *?T$s˜ ©´&Ä!ë žÂ+ž^îžZMŸ ¨Ÿ´ŸÊŸÞŸ*à e ¡0q¢/¢¢ Ò¢ÏÞ¢ ®£ º£ È£Ö£ð£5ó£1)¤[¤d¤u¤ˆ¤ž¤·¤Ф뤥'¥D¥W¥#m¥,‘¥¾¥™Û¥7u¦­¦¨½¦f¨un¨¿ä¨q¤©#ªk:«I¦«+𫬠,¬6¬R¬a¬s¬„¬ 𬦬Á¬Ô¬ ë¬ö¬ ­<­_Y­Ĺ­§~®™&¯,À¯í¯ ñ¯û¯ °°"°*°/°>D°$ƒ°1¨° Ú°%æ°/ ±#<±`±g± ±‹± ± ±±»±Ò±â±ò±% ²z3²·®²Éf´"0¶9S¶9¶?Ƕ· · ,· 8·…C·É·Ø·uî·Gd¸"¬¸!ϸ1ñ¸I#¹6m¹¤¹´¹1˹$ý¹"º$Aº(fººI—ºáºæº+ïº{»C—»>Û»¼/#¼S¼ig¼Ѽã¼÷¼½'½ :½¿D½ÁÁÁ"Á 9ÁFÁZÁwÁ —Á¤Á ¼ÁÉÁÛÁsïÁc yÂ=šÂØÂõÂ>ÃoSÃIÃà ĉ+Ä µÄ ¿Ä†ÉÄPÅ hÅvÅ ŒÅ —Å ¤Å °Å »Å’ÈÅ[Æ _ÆkÆ „Æ‘Æ ¡Æ®Æ·ÆS¿ÆMÇraÇRÔÇ-'ÈXUÈ2®È/áÈ É22É0eÉl–ÉOÊ$SÊ£xËÍ+Í2Í 8ÍBÍQÍcÍIvÍ ÀÍÊÍÜÍáÍêÍüÍ#Î4ÎSÎ \ÎgÎzÎ?ÎÏÎÕÎåÎôÎÏ Ï*Ï1ÏHÏ)QÏ{τϔÏR©Ï#üÏ! ÐBÐTÐ\ÐzÐ!вÐÒÐêÐÑ)Ñ ?Ñ IÑ WÑ cÑ mÑ!xÑ!šÑ¼Ñ~ÖÑ9UÒ Ò›Ò0¢ÒÓÒçÒÓÓ *Ó 7Ó€AÓÂÓiÛÓEÔZÔ¼oÔ3,Õ`Õ iÕ!vÕ˜Õ'©Õ7ÑÕ ÖÖ!Ö*ÖCÖVÖiÖ"xÖ›ÖªÖ¾ÖÞÖôÖ× ×•3×ÉØÛØóØÙ Ù'ÙGÙ gÙrمٟٗ٠¹Ù ÇÙ ÓÙßÙîÙ ÚÚ 8Ú EÚRÚðVÚ&GÛ4nÛ!£Û>ÅÛÜ ÜÜ 3Ü>Ü]Ü{Ü/”ÜÄÜÓÜâÜýÜ(Ý:ÝWÝ gÝ rÝ~Ý ‡Ý5‘ÝÇÝØÝ íÝûÝ ÞÞ,Þ ;ÞIÞ"]Þ €Þ ‹Þ™Þ ŸÞ ©Þ¶Þ ¼ÞÝÞòÞ øÞß% ß0ß6ßKßhß4pߥ߭߶߯ßßßúßà1àLà¢jà á,áGáfáƒáœá ·áÅáÍáÝáïáâ â5â >â LâZâ nâ-{âU©âVÿâ'Vãh~ãçãaäÂiä¶,åÕãå ¹æ:Zç2•ç0Èçùç]èsè‹‚èê)êHêfê4„êF¹êë$ë!Aë&cë+Šë¶ëƒÒërVì}Éì«GíóíîÈîïåî)Õïÿïgð`wðkØð-Dñrñ,‘ñM¾ñ5 ò"BòÎeò4ó†LóLÓóe ôp†ô(÷ôH õ,iõF–õ"Ýõ=ö}>ö¼ö(>÷(g÷P÷$á÷.ø&5ø.\ù,‹ù+¸ùQäù86ú5oú[¥ú>ûV@ûB—ûaÚûN<üS‹üYßý59þ€oþ(ðþíE,M\z×%î1F.KBzܽŸšÿ:œ:Ê× \¢ Eÿ *E Bp &³ iÚ ôDÃ9Dý`B$£!ÈEêa0×’„j‚ïrNòxA#ºÞ|4š7Ï3;BHYj|3˜Ìáéñ.L] nˆy (AZnu 7®3æ.1=!o^‘-𛺠Ù3åK "e #ˆ ¬ "Ê $í !!-!5G!"}! !§!#¸!Ü! å!:ó!."K"\" c" q"" "Ôž"-s#¡#¸# Ñ# ß# í#ù#$#$¶6$+í$% %,%=% L% Z% h%t%}%|†% & 'Ä'Òà'ϳ):ƒ*:¾*Dù*4>+[s+9Ï+h ,=r,?°,Nð,?-P^-’¯-B.Y.7Ù.</N/ƒì/2p0¶£0~Z1:Ù1Í27â2Y3t3º„3?4f_4OÆ4`5Bw5°º5>k6wª6K"7gn7eÖ7=<8z8“8 ±8M½8+ 979M9.R9€:*;à-<ð=ÿ=Z?w?c?ñ?* A7A7PAˆAA­A¿A ÄAÎAÔAÝA üA BBB -B9BHBMB3UB)‰B³BÄB ÈBÖBåB îBùBÿBCC'C*C2CFC aCkC|C—C™CªC½CÒCãCûC D D"D2D ADNDQDWDfD jDuD4ß_h gà«vDùFþ)Öò¬ç­Y¶Ýðxe•œ¡TFX Côö¸õHójÜŽà}igûDv °X†RoVˆã*@ëk¸0S¨¼˜} ÑNòqã›nB­¢Ç*çC{?ë_ÃÙ¬”*aÏàÎ≵˜-³=kÃÃÒõÚ•¡zlÏï/ÿ`"z~2€èqAÞ ñGÑÕPåJ4ß7÷ú\fZø|¤"üâ^‘ètÝ\\)8„C‰c GLÛ#’´M‰wáÄ[†Ö„㽺’½Õk¯(¯O‹ l7Ž3%J µ¶øÄŸÿñü^!’꣚ònÉí¼²cuë^F´,ˆ6Á]©ÿ ù§Pæ¢Ì)̲AÍ ™<¤fŽ_‹ž¦iÓœm ÜC¢щØ×¾;™"¥,Ô¼0öoÓ©«LŒKhþ ÛË˽bƒ³Q¹8ß.Ú˜Ã@†A%fÝ<¥ƒ¯üNŒ‚FzbA(ËÌP@(à)ÍBÐ/öhjÊq—H[ ^)Û'•21^…m€3¿!ÊÁÎÍ™ÞØÜ£-d™á%Ô¶2]°9– –ÀÓƒõ±¹yÚ±5…ï ;÷Š SZ iÚ亲[­J??Ðý!Šŀ=h§&ìåíl:|ÂNŠ{àóŽ¢½týXÿ½áø:Ƕ+r.ÑÈg5ù1äsÀ›»Ø×5T©Æï M¤©Ý~ľšv×JŸ”Ä¿/>Æ&81ß n R|N‹p_ù¦QæŽøjРk>+â0ñwÈUÔ?”·VY„c¸äéµÂPd® MåƨL<Bgª¸“Ì3žg¡fÛƒ“r ªƒ5‚QÞacmyëè;+VdtS6îZT.…s[IL7'$ñÈWyԯ愘Rù®0»| î;s#·,Ç=¨f $Øs¹Î÷¦*£À²‚>{.…wõwR&êÏBéÓ–b—Ëeíd<UqžXIø$v6b~£§697âMW`]Ì4Ü Ð”=®}ðϺF“Ù<ìö¥ûòu‡°ìI~ÙѪ§a¬Ê!Æ"êî"ž}¼×£1O€wäpŒç6«X¤óüÒZ>³'ˆ¯üû¡Ï\Êð@uñD¡nEÉO´+H‘/ìþ ò-H:ÛrÕßo‚ê±Á»Â-ry-ÎÖhUQúG ŠmÒ4_’ÉÆ1—z·ÞzºjËÒ»æIýRͤJÞèš`ˆè‹tÖ|KÈ}‡í¾ê‘q‰«—?{¬ˆ]Э,OQ:leºpápÖŸžÁÁÇVÝé8µ YSôH•.ÈéǪýxK!7°ì–uÉ¿æ‘Ú­úa¦UUW3të4ôc;%&˜–‡Y×3{v2åýW#¥ŸY «åš Õ³xô¹œMÎó[™'&'nÅ`é(ņõ›®oú—$÷ãÍB´xÜ¢·ZK‡iEDö¿9CeÀŠï÷Ÿîœj,Õ(‹¥ µ9\³x¨T=°’ûÙ‚¿O k·»ú„b†ªû5lðL©`*GWçe¦•ŠóØÊ2>r9Ad$KäÔsášÅÓ#I´Ù8§:ÒGÿâPo çT¬E‘® î” ›+¸y/Dþ0±¾Ä~Œ“¶± “ ôp¹þ@ò€ VNm¾iuÉÀE›]#Œ%a¼íœðãS‡¨Eï… (inherited from "%s") - not in use -# Used# Vars%d / %d%d Host Template(s)%d Host(s)%d Notification Apply Rule(s)%d Notification Template(s)%d Notification(s)%d Service Apply Rule(s)%d Service Template(s)%d Service(s)%d apply rules have been defined%d created%d deleted%d files%d files rendered in %0.2fs%d have been externally defined and will not be deployed%d modified%d object(s) will be created%d object(s) will be deleted%d object(s) will be modified%d objects found%d objects have been defined%d objects have been modified%d objects, %d templates, %d apply rules%d of them are templates%d templates have been defined%s "%s" has been created%s "%s" has been deleted%s "%s" has been imported"%s "%s" has been modified%s %s(%s)%s (%d members)%s (Applied Service set)%s (Service set)%s (default)%s (where %s)%s Templates%s based on %s%s config changes happend since the last deployed configuration%s has been blacklisted on %s%s is no longer blacklisted on %s%s objects have been modified%s on %s (from set: %s)%s related group objects have been created%s template "%s": custom fields%s templates based on %s%s: %d%s: %s (Snapshot)%s: Property Modifier%s: Snapshots%s: add Property Modifier(Host) group resolve cache(on %s)- add more -- click to add more -- inherited -- no automatic installation -- please choose -...and %d moreA Configuration Basket references specific Configuration Objects or all objects of a specific type. It has been designed to share Templates, Import/Sync strategies and other base Configuration Objects. It is not a tool to operate with single Hosts or Services.A custom LDAP filter to use in addition to the object class. This allows for a lot of flexibility but requires LDAP filter skills. Simple filters might look as follows: operatingsystem=*server*A custom string. Might contain source columns, please use placeholders of the form ${columnName} in such case. Structured data sources can be referenced as ${columnName.sub.key}A description about the fieldA detailled description explaining what this choice is all aboutA meaningful description explaining your users what to expect when assigning this set of servicesA new %s has successfully been createdA new Self Service API key for %s has been generatedA property modifier allows you to modify a specific property at import timeA short name identifying this import source. Use something meaningful, like "Hosts from Puppet", "Users from Active Directory" or similarA short name identifying this job. Use something meaningful, like "Import Puppet Hosts"A short name identifying this set of servicesA ticket for this agent could not have been requested from your deployment endpoint: %sA total of %d config changes happened since your last deployed config has been renderedAPI KeyAPI userAccept passive checksAccepts configAcknowledgementActionAction URLActionsActivation ToolActive-PassiveActivityActivity LogActivity Log: %sActivity logActivity log entryAddAdd %sAdd %s objectsAdd %s: %sAdd ServiceAdd Service SetAdd Service Set to %d hostsAdd Service Set to %sAdd Service to %sAdd Service: %sAdd a jobAdd a new Data FieldAdd a new Data ListAdd a new Import SourceAdd a new JobAdd a new Sync RuleAdd a new entryAdd a new one...Add a service set to "%s"Add a service to "%s"Add another filterAdd chosen objects to a Configuration BasketAdd data list entryAdd entryAdd import sourceAdd jobAdd listAdd new Icinga %sAdd new Icinga %s templateAdd property modifierAdd serviceAdd service setAdd service to %d hostsAdd sync property ruleAdd sync property: %sAdd sync ruleAdd to BasketAdditional notes for this objectAdditional propertiesAgentAgent VersionAlert your usersAliasAll changesAll changes are tracked in the Director database. In addition you might also want to send an audit log through the Icinga Web 2 logging mechanism. That way all changes would be written to either Syslog or the configured log file. When enabling this please make sure that you configured Icinga Web 2 to log at least at "informational" level.All custom variables (vars)All of themAll overrides have been removed from "%s"All your %s Apply RulesAll your %s TemplatesAllow UpdatesAllow for values not on the listAllow readonly users to see where a Service came fromAllow to access the director APIAllow to access the full audit logAllow to configure hostsAllow to configure notificationsAllow to configure service setsAllow to configure servicesAllow to configure usersAllow to define Service Set Apply RulesAllow to deploy configurationAllow to inspect objects through the Icinga 2 API (could contain sensitive information)Allow to see template detailsAllow to show configuration (could contain sensitive information)Allow to show the full executed SQL queries in some placesAllow to use only host templates matching this filterAllow to use only these db resources (comma separated list)Allow to use this entry only to users with one of these Icinga Web 2 rolesAllow unrestricted access to Icinga DirectorAllowed maximumAllowed rolesAlso clone fields provided by this TemplateAlso clone single Service Sets defined for this HostAlso clone single Services defined for this HostAlso install NSClient++. It can be used through the Icinga Agent and comes with a bunch of additional Check PluginsAlso rename all "%s" custom variables to "%s" on %d objects?Also wipe all "%s" custom variables from %d objects?Alternative name for this host. Might be a host alias or and kind of string helping your users to identify this hostAlternative name for this user. In case your object name is a username, this could be the full name of the corresponding personAlternative text to be shown in case above icon is missingAn Icinga DSL expression that returns a boolean value, e.g.: var cmd = bool(macro("$cmd$")); return cmd ...An Icinga DSL expression, e.g.: var cmd = macro("$cmd$"); return typeof(command) == String ...An URL leading to additional actions for this object. Often used with Icinga Classic, rarely with Icinga Web 2 as it provides far better possibilities to integrate addonsAn URL pointing to additional notes for this objectAn URL pointing to an icon for this object. Try "tux.png" for icons relative to public/img/icons or "cloud" (no extension) for items from the Icinga icon fontAn alternative display name for this group. If you wonder how this could be helpful just leave it blankAn extended description for this Import Row Modifier. This should explain it's purpose and why it has been put in place at all.An extended description for this Import Source. This should explain what kind of data you're going to import from this source.An extended description for this Sync Rule. This should explain what this Rule is going to accomplish.An extended description for this field. Will be shown as soon as a user puts the focus on this fieldAn object class to search for. Might be "user", "group", "computer" or similarAnother Import Source. We're going to look up the row with the key matching the value in the chosen columnAny first (leftmost) componentApi Key:Applied %sApplied groupsApplied service: %sApplied servicesApplyApply "%s"Apply %d pending schema migrationsApply ForApply Icinga %sApply RuleApply Rule rendering previewApply RulesApply a pending schema migrationApply changesApply notifications with specific properties according to given rules. Apply ruleApply rule historyApply schema migrationsApply toApply: %sArgumentArgument macrosArgument nameArgumentsArrayAssign whereAuthorAutocompleteAutomate all tasksAutomationAvailable choicesBackBasketBasket DefinitionsBasket NameBasket SnapshotsBasket has been uploadedBasketsBe careful: this is usually NOT what you want, as it makes Sync "blind" for objects matching this filter. This means that "Purge" will not work as expected. The "Black/Whitelist" Import Property Modifier is probably what you're looking for.BinaryBlacklistCaptionChange priorityChanging this value affects %d object(s): %sCheck CommandsCheck commandCheck command definitionCheck command timeout in seconds. Overrides the CheckCommand's timeout attributeCheck executionCheck for changesCheck intervalCheck periodCheck timeoutChecking this Import Source failedChecking this sync rule failedChecksumChild HostChild ServiceChoice nameChoicesChoose "All" to always add all of them, "Ignore" to not care about a specific Type at all and opt for "Custom Selection" in case you want to choose just some specific Objects.Choose a Host TemplateChoose a service templateChoose an object typeChoose fileChoose the host this single service should be assigned toChoosing this many options will be mandatory for this Choice. Setting this to zero will leave this Choice optional, setting it to one results in a "required" Choice. You can use higher numbers to enforce multiple options, this Choice will then turn into a multi-selection element.Chose an (optional) parent zoneClick to read our documentation: %sCloneClone "%s"Clone Icinga %sClone Service SetsClone ServicesClone Template FieldsClone the object as is, preserving importsClone this service to the very same or to another HostClone this service to the very same or to another Service SetClone: %sCluster ZoneCombine multiple templates into meaningful Choices, making life easier for your usersCommandCommand DefinitionsCommand TemplateCommand TemplatesCommand arguments: %sCommand endpointCommand nameCommand typeCommand-specific custom varsCommandsCommentComparing %s "%s" from Snapshot "%s" to current configCondition (set_if)Condition formatConfigConfig DeploymentConfig deployment failedConfig diffConfig file "%s"Config has been submitted, validation is going onConfig has not been deployedConfig historyConfig preview: %sConfigsConfigurationConfiguration (read-only)Configuration BasketsConfiguration formatConfiguration has been storedConfiguration objects have been added to the chosen basket "%s"Configure this Agent via Self Service APIContent ChecksumCount QueryCreateCreate BasketCreate SnapshotCreate a new %s Apply RuleCreate a new %s SetCreate a new %s inheriting from this oneCreate a new %s inheriting from this templateCreate a new Configuration BasketCreate a new TemplateCreate a new objectCreate a new template choiceCreate database schemaCreate immediatelyCreate schemaCreatedCriticalCurrent Template UsageCustom SelectionCustom VariableCustom Variable variants: %sCustom VariablesCustom Vars - OverviewCustom expressionCustom fields: %sCustom notificationCustom propertiesCustom variableCustom variable (vars.)Custom variablesCustomVar OverviewDB QueryDB ResourceDN componentDNS record typeDaemonDaemon has been stopped %s, was running with PID %s as %s@%sDaemon is running with PID %s as %s@%s, last refresh happened %sDaemon keep-alive is outdated, was last seen running with PID %s as %s@%s %sData FieldsData ListData List EntryData List: %sData ListsData fieldsData fields allow you to customize input controls for Icinga custom variables. Once you defined them here, you can provide them through your defined templates. This gives you a granular control over what properties your users should be allowed to configure in which way.Data fields allow you to customize input controls your custom variables.Data fields make sure that configuration fits your rulesData listData listsData lists are mainly used as data providers for custom variables presented as dropdown boxes boxes. You can manually manage their entries here in place, but you could also create dedicated sync rules after creating a new empty list. This would allow you to keep your available choices in sync with external data providersData typeDatabase backendDateDay(s)Default configuration format. Please note that v1.x is for special transitional projects only and completely unsupported. There are no plans to make Director a first-class configuration backends for Icinga 1.xDefault global zoneDefine Check-, Notification- or Event-Commands. Command definitions are the glue between your Host- and Service-Checks and the Check plugins on your Monitoring (or monitored) systemsDefine Data FieldsDefine Host Groups to give your configuration more structure. They are useful for Dashboards, Notifications or RestrictionsDefine a download Url or local directory from which the a specific Icinga 2 Agent MSI Installer package should be fetched. Please ensure to only define the base download Url or Directory. The Module will generate the MSI file name based on your operating system architecture and the version to install. The Icinga 2 MSI Installer name is internally build as follows: Icinga2-v[InstallAgentVersion]-[OSArchitecture].msi (full example: Icinga2-v2.6.3-x86_64.msi)Define and manage imports from various data sourcesDefine custom Time PeriodsDefine how imported data should be synchronized with IcingaDefine what should happen when an object with a matching key already exists. You could merge its properties (import source wins), replace it completely with the imported object or ignore it (helpful for one-time imports)Define whatever you want to be monitoredDefines after how many check attempts a new hard state is reachedDefining Notifications for User Groups instead of single Users gives more flexibilityDefining Service Groups get more structure. Great for Dashboards. Notifications and Permissions might be based on groups.Delay unless the first notification should be sentDeleteDelimiterDependenciesDependencyDeployDeploy %d pending changesDeploy configuration to your Icinga nodesDeploy modified configDeploy to masterDeploymentDeployment PathDeployment detailsDeployment modeDeployment mode for Icinga 1 configurationDeployment timeDeploymentsDeployments / HistoryDescriptionDescription of the argumentDestinationDestination FieldDid you know that you can run this entire Health Check (or just some sections) as an Icinga Check on a regular base?DiffDiff with other configDirectDirector Background DaemonDirector HealthDirector Kickstart WizardDirector SettingsDirector database schema has not been created yetDisable ChecksDisable NotificiationsDisable all JobsDisabledDisabled by default, and should only be used in rare cases.Disabled objects will not be deployedDisplay NameDisplay nameDistinct CommandsDo more with custom dataDo not transform at allDocumentationDownDownloadDownload as JSONDownload from a custom urlDownload from packages.icinga.comDowntime endsDowntime nameDowntime removedDowntime startsDrop Self Service API keyDropdown (list values only)DurationEdit a FieldEdit entryEdit import sourceEdit listEdit sync property ruleEdit sync ruleElement behaviorEmailEnable audit logEnable event handlerEnable flap detectionEndpointEndpoint NameEndpoint addressEndpoint template nameEndpointsEntriesErrorEstablish connectionEvaluates the apply for rule for all objects with the custom attribute specified. E.g selecting "host.vars.custom_attr" will generate "for (config in host.vars.array_var)" where "config" will be accessible through "$config$". NOTE: only custom variables of type "Array" are eligible.Event commandEvent command definitionEvery related downtime will show this commentExclude other time periods from this.Exclude periodExecute active checksExecution interval for this job, in secondsExisting Data ListsExisting templatesExpert modeExpressionExtend the list with new valuesExternalExternal Command DefinitionsExternal CommandsExternal Commands have been defined in your local Icinga 2 Configuration.External Notification CommandsExternal Notification Commands have been defined in your local Icinga 2 Configuration. FQDNFailedFailed to import %s "%s"Field has been removedField nameField typeFieldsFileFilter ExpressionFilter available notification apply rulesFilter available service apply rulesFilter available service set templates. Use asterisks (*) as wildcards, like in DB* or *net*Filter available service setsFilter methodFilter stringFirst ElementFirst notification delayFixedFlappingFlapping endsFlapping lower bound in percent for a service to be considered not flappingFlapping startsFlapping threshold (high)Flapping threshold (low)Flapping upper bound in percent for a service to be considered flappingFlatten all inherited properties, strip importsFlush API directoryFor manual configurationForce renderingForm element could not be created, %s is missingForm has successfully been sentFormatFormer objectFully qualified domain name (FQDN)Generate Self Service API keyGenerate a new keyGenerated configGenerated from host varsGet alerts when something goes wrongGet an overview of used CustomVars and their variantsGlobal Director SettingsGlobal Self Service SettingGlobal ZonesGlobal zoneGlueGo back to "%s" DashboardGrace periodGroupGroup has been inherited, but will be overridden by locally assigned group(s)Group membershipGroup membership: %sGrouping your Services into Sets allow you to quickly assign services often used together in a single operation all at onceGroupsHTTP (this is plaintext!)HTTP proxyHTTPS (strongly recommended)HealthHere you can find all single services directly attached to single hostsHiddenHide SQLHint: Check PluginHints regarding this serviceHistoryHostHost Custom variablesHost GroupHost GroupsHost NameHost TemplateHost Template ChoiceHost TemplatesHost addressHost address. Usually an IPv4 address, but may be any kind of address your check plugin is able to deal withHost configsHost groupsHost nameHost name (local part, without domain)Host objectsHost propertiesHost template choiceHost template choicesHostgroupHostgroupsHostgroups that should be directly assigned to this node. Hostgroups can be useful for various reasons. You might assign service checks based on assigned hostgroup. They are also often used as an instrument to enforce restricted views in Icinga Web 2. Hostgroups can be directly assigned to single hosts or to host templates. You might also want to consider assigning hostgroups using apply rulesHostnameHostname, IP or :HostsHosts using this set: %sHow long the downtime lasts. Only has an effect for flexible (non-fixed) downtimes. Time in seconds, supported suffixes include ms (milliseconds), s (seconds), m (minutes), h (hours) and d (days). To express "90 minutes" you might want to write 1h 30mI know what I'm doing, deploy anywayI know, please don't bother me againIP address / hostname of remote nodeIP address / hostname of your Icinga node. Please note that this information will only be used for the very first connection to your Icinga instance. The Director then relies on a correctly configured Endpoint object. Correctly configures means that either it's name is resolvable or that it's host property contains either an IP address or a resolvable host name. Your Director must be able to reach this endpointIPv6 addressIcinga Icinga %sIcinga %s SetsIcinga 2 - Objects: %sIcinga 2 API - StatusIcinga 2 Client documentationIcinga Agent and zone settingsIcinga Api usersIcinga DSLIcinga DirectorIcinga Director - Main DashboardIcinga Director Background DaemonIcinga Director ConfigurationIcinga Director decides to deploy objects like CheckCommands to a global zone. This defaults to "director-global" but might be adjusted to a custom Zone nameIcinga Director depends on the following modules, please install/upgrade as requiredIcinga Director offers a Self Service API, allowing new Icinga nodes to register themselvesIcinga HostIcinga InfrastructureIcinga Package NameIcinga cluster zone. Allows to manually override Directors decisions of where to deploy your config to. You should consider not doing so unless you gained deep understanding of how an Icinga Cluster stack worksIcinga object name for this host groupIcinga object name for this host. This is usually a fully qualified host name but it could basically be any kind of string. To make things easier for your users we strongly suggest to use meaningful names for templates. E.g. "generic-host" is ugly, "Standard Linux Server" is easier to understandIcinga object name for this service groupIcinga object name for this user groupIcinga v1.xIcinga v2.11.0 breaks some configurations, the Director will warn you before every deployment in case your config is affected. This setting allows to hide this warning.Icinga v2.xIcinga2 AgentIcon imageIcon image altIdIdentifier for the Icinga command you are going to createIf enabled you can not define arguments.IgnoreIgnore Bug #7530Ignore Soft StatesImport / SyncImport SourceImport SourcesImport data sourcesImport external "%s"Import runImport run history: %sImport runsImport sourceImport source nameImport source preview: %sImport source: %sImportable templates, add as many as you want. Please note that order matters when importing properties from multiple templates: last one winsImported new data from this Import SourceImported rowsImporting an object means that its type will change from "external" to "object". That way it will make part of the next deployment. So in case you imported this object from your Icinga node make sure to remove it from your local configuration before issueing the next deployment. In case of a conflict nothing bad will happen, just your config won't deploy.ImportsIn case an Icinga Admin provided you with a self service API token, this is where you can register new hostsIn case the Icinga 2 Agent is already installed on the system, this parameter will allow you to configure if you wish to upgrade / downgrade to a specified version with the as well.In case the Icinga 2 Agent should be automatically installed, this has to be a string value like: 2.6.3In case the Icinga Agent will accept configuration from the parent Icinga 2 system, it will possibly write data to /var/lib/icinga2/api/*. By setting this parameter to true, all content inside the api directory will be flushed before an eventual restart of the Icinga 2 AgentIn case your API is only reachable through a proxy, please choose it's protocol right hereIn case your proxy requires authentication, please configure this hereInclude other time periods into this.Include periodIndirectIndividual Service objectsInfrastructureInheritance (import)Inherited groupsInherited service: %sInspectInspect - object listInstall NSClient++Installation SourceInstalledInstaller HashesInternal commandsIt has been renamed since then, its former name was %sIt is not a good idea to do so as long as your Agent still has a valid Self Service API key!It will not be allowed to choose more than this many options. Setting it to one (1) will result in a drop-down box, a higher number will turn this into a multi-selection element.It's currently unknown whether we are in sync with this Import Source. You should either check for changes or trigger a new Import Run.It's currently unknown whether we are in sync with this rule. You should either check for changes or trigger a new Sync Run.It's not allowed to store an empty basketJobJob %sJob DefinitionsJob TypeJob nameJob: %sJobsJump to this objectJust download and run this script on your Linux Client Machine:Keep matching elementsKeep only matching rows (Whitelist)Keep the DN as isKeep the JSON string as isKeep the property (hostname) as isKeep the property as isKeyKey column nameKickstartKickstart WizardLDAP Search BaseLabelLast Check ResultLast ElementLast notificationLast related activityLast sync run detailsLeave empty for non-positional arguments. Can be a positive or negative number and influences argument orderingLeaving custom variables in place while removing the related field is perfectly legal and might be a desired operation. This way you can no longer modify related custom variables in the Director GUI, but the variables themselves will stay there and continue to be deployed. When you re-add a field for the same variable later on, everything will continue to work as beforeLeaving custom variables in place while renaming the related field is perfectly legal and might be a desired operation. This way you can no longer modify related custom variables in the Director GUI, but the variables themselves will stay there and continue to be deployed. When you re-add a field for the same variable later on, everything will continue to work as beforeLet the import failLet the whole Import Run failLet the whole import run failLimit access to the given comma-separated list of hostgroupsLinux commandlineList EntriesList entriesList nameLocal directory to deploy Icinga 1.x configuration. Must be writable by icingaweb2. (e.g. /etc/icinga/director)Log DurationMain propertiesManage definitions for your Commands that should be executed as Check Plugins, Notifications or based on EventsManage deployments, access audit log and historyMove down (lower priority)Move up (raise priority)Name for the Icinga timeperiod you are going to createName for the Icinga timperiod template you are going to createName for the Icinga zone (template) you are going to createNext pageNo object foundNo related template has been provided yetNo service has been chosenNo such service: %sNo template has been chosenNo template has been defined yetNoneNone could be used for deployments right nowNotesNotes URLNothing changed, rule is in syncNothing to do, data provided by this Import Source didn't change since the last import runNothing to do, restore would not modify the current objectNothing would change, this rule is still in syncNotificationNotification Apply Rules based on %sNotification CommandsNotification Commands allow you to trigger any action you want when a notification takes placeNotification TemplateNotification commandNotification intervalNotification template choicesNotification templatesNotificationsNotifications are sent when a host or service reaches a non-ok hard state or recovers from such. One might also want to send them for special events like when a Downtime starts, a problem gets acknowledged and much more. You can send specific notifications only within specific time periods, you can delay them and of course re-notify at specific intervals. Combine those possibilities in case you need to define escalation levels, like notifying operators first and your management later on in case the problem remains unhandled for a certain time. You might send E-Mail or SMS, make phone calls or page on various channels. You could also delegate notifications to external service providers. The possibilities are endless, as you are allowed to define as many custom notification commands as you wantNumeric positionOKObjectObject InspectionObject TypeObject classObject has been re-createdObject has been restoredObject nameObject propertiesObject typeObject type "%s"Object/Tpl/ApplyOften the expected result is provided in a property like "objects". Please specify this if requiredOn failureOne apply rule has been definedOne external object has been defined, it will not be deployedOne object has been definedOne object has been modifiedOne or more characters that should be used to split this stringOne or more characters that will be used to glue an input array to a string. Can be left emptyOne or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00One template has been definedOnly set this parameter if the argument value resolves to a numeric value. String values are not supportedOperatorOptionalOptional command timeout. Allowed values are seconds or durations postfixed with a specific unit (e.g. 1m or also 3m 30s).Other available fieldsOther sourcesOverride varsOverviewOwnerPHP BinaryPHP IntegerPHP VersionPHP version 5.4.x is required for Director >= 1.4.0, you're running %s. Please either upgrade PHP or downgrade Icinga DirectorPIDPagerPaginationParent HostParent ServiceParent ZonePasswordPatternPending database schema migrations have successfully been appliedPlease ask an administrator to grant you access to resourcesPlease check your Basket configuration, %s does not support single "%s" configuration objectsPlease choose a data list that can be used for map lookupsPlease choose a specific Icinga object typePlease click "Store" once again to determine query columnsPlease click %s to create new DB resourcesPlease click %s to create new resourcesPlease define a %s firstPlease define a Service Template firstPlease define a related template firstPlease make sure that your database exists and your user has been granted enough permissionsPlease see %s for detailled instructions of how start and end workPlease start typing for a list of suggestions. Dots allow you to access nested properties: column.some.key. Such nested properties cannot be modified in-place, but you can store the modified value to a new "target property"Plugin Check commands are what you need when running checks agains your infrastructure. Notification commands will be used when it comes to notify your users. Event commands allow you to trigger specific actions when problems occur. Some people use them for auto-healing mechanisms, like restarting services or rebooting systems at specific thresholdsPlugin commandsPolicyPortPositionPosition TypePostgreSQL schemaPrefer includesPreserve specific configuration objects in a specific statePreviewPrevious pagePrioProblemProblem handlingProcess ListProcess performance dataProperty modifiers: %sProtectedProtocolPrototypes (methods)Provide Data ListsProvide data lists to make life easier for your usersProxyProxy AddressProxy PasswordProxy UsernamePurgePurge existing values.RangesRe-deploy nowRecoveryRegenerate Self Service API keyRegisterRegistered AgentRegular ExpressionRegular expression pattern to split the string (e.g. /\s+/ or /[,;]/)Reject matching elementsReject the whole row (Blacklist)Related ObjectsRemoveRemove "%s" from this hostRemove this entryRemove this part of your filterRename related varsRender as stringRender configRendered fileRendered in %0.2fs, deployed in %0.2fsRenderingRepeat keyReplaceRequiredRestoreRestore former objectRestore to this target Director DBRetry intervalRetry interval, will be applied after a state change unless the next hard state is reachedReturn lookup key unmodifiedRule nameRunRun all imports at onceRun importRun intervalRun on agentRunning with systemdSOCKS5 proxySQL QuerySchedule and automate Import, Syncronization, Config Deployment, Housekeeping and moreSchedule your notificationsSchedule your notifications. Define who should be notified, when, and for which kind of problemScheduled DowntimeScheduled DowntimesScript or tool to call when activating a new configuration stage. (e.g. sudo /usr/local/bin/icinga-director-activate) (name of the stage will be the argument for the script)Search is simple! Try to combine multiple wordsSearch...Self ServiceSelf Service - Host RegistrationSelf Service APISelf Service API - Global SettingsSelf Service Settings have been storedSend notificationsSent toServiceService Apply RulesService GroupService GroupsService SetService Set has been removedService SetsService TemplateService Template ChoiceService TemplatesService UserService configsService groupsService groups that should be directly assigned to this service. Servicegroups can be useful for various reasons. They are helpful to provided service-type specific view in Icinga Web 2, either for custom dashboards or as an instrument to enforce restrictions. Service groups can be directly assigned to single services or to service templates.Service nameService propertiesService setService set nameService setsService template choiceService template choicesServiceSetServicegroupServicenameServicesServices in this set: %sServices on %sServices: %sServicesetSet MembersSet based on filterSet falseSet no value (null)Set nullSet trueSetsSetting a command endpoint allows you to force host checks to be executed by a specific endpoint. Please carefully study the related Icinga documentation before using this featureSettings have been storedShare this Template for Self Service APIShared for Self Service APIShould all the other characters be lowercased first?ShowShow BasketShow Issue %s on GitHubShow SQLShow affected ObjectsShow available optionsShow based on filterShow details related to this changeShow normalShow resolvedShow rows %u to %u of %uShow unfilteredSimple match with wildcards (*)Single Object DiffSingle ServicesSizeSkip keySnapshotSnapshotsSomething like https://api.example.com/rest/v2/objectsSource ColumnSource ExpressionSource NameSource PathSource TypeSource columnsSource fieldSource nameSpecial propertiesSpecific Element (by position)Stage nameStart timeStartupStartup LogStartup TimeStateState and transition type filtersState changesStatesStatisticsStatusStop sharing this TemplateStoreStore configurationStrict, list values onlyStringStrip this operator, preserve child nodesSubmitSucceededSuggested fieldsSwitch to Table viewSwitch to Tree viewSync "%s": %sSync PropertiesSync RulesSync historySync only part of your imported objects with this rule. Icinga Web 2 filter syntax is allowed, so this could look as follows: %sSync propertiesSync ruleSync rule: %sSync run detailsSynchronization failedSynchronization ruleSynchronizeTableTarget DBTarget HostTarget Service SetTarget data typeTarget propertyTemplateTemplate NameTemplate nameTemplate treeTemplate: %sThanks, I'll verify this and come back laterThe "Import" job allows to run import actions at regular intervalsThe "Sync" job allows to run sync actions at regular intervalsThe %s has successfully been storedThe Config job allows you to generate and eventually deploy your Icinga 2 configurationThe Email address of the user.The Housekeeping job provides various task that keep your Director database fast and cleanThe Icinga Director Background Daemon is not running. Please check our %s in case you need step by step instructions showing you how to fix this.The Icinga Director Self Service API allows your Hosts to register themselves. This allows them to get their Icinga Agent configured, installed and upgraded in an automated way.The Icinga Package name Director uses to deploy it's configuration. This defaults to "director" and should not be changed unless you really know what you're doingThe LDAP properties that should be fetched. This is required to be a comma-separated list like: "cn, dnshostname, operatingsystem, sAMAccountName"The Self Service API key for %s has been droppedThe Service Set "%s" has been added to %d hostsThe argument %s has successfully been storedThe caption which should be displayedThe caption which should be displayed to your users when this field is shownThe child host.The command Icinga should run. Absolute paths are accepted as provided, relative paths are prefixed with "PluginDir + ", similar Constant prefixes are allowed. Spaces will lead to separation of command path and standalone arguments. Please note that this means that we do not support spaces in plugin names and paths right now.The corresponding passwordThe domain name you want to be strippedThe first (leftmost) CNThe first (leftmost) OUThe given properties have been stored for "%s"The host/service states you want to get notifications forThe last (rightmost) OUThe last attempt failed %s: %sThe last attempt succeeded %sThe last deployment did not succeedThe last deployment is currently pendingThe log duration time.The name of a time period which determines when notifications to this User should be triggered. Not set by default.The name of a time period which determines when this notification should be triggered. Not set by default.The name of a time period which determines when this object should be monitored. Not limited by default.The name of a time period within this job should be active. Supports only simple time periods (weekday and multiple time definitions)The name of the hostThe name of the serviceThe notification interval (in seconds). This interval is used for active notifications. Defaults to 30 minutes. If set to 0, re-notifications are disabled.The numeric bitmask you want to apply. In case you have a hexadecimal or binary mask please transform it to a decimal number first. The result of this modifier is a boolean value, telling whether the given mask applies to the numeric value in your source columnThe pager address of the user.The parent host.The parent host. You might want to refer Host Custom Variables via $host.vars.varname$The port you are going to use. The default port 5665 will be used if none is setThe property to get from the row we found in the chosen Import SourceThe service "%s" has been added to %d hostsThe service Set that should be assignedThe service set that should be assigned to this hostThe state transition types you want to get notifications forThe string that should be used as a preplacementThe string you want to search forThe string/pattern you want to search for. Depends on the chosen method, use www.* or *linux* for wildcard matches and expression like /^www\d+\./ in case you opted for a regular expressionThe unique name of the fieldThe unique name of the field. This will be the name of the custom variable in the rendered Icinga configuration.The user that should run the Icinga 2 service on Windows.There are %d objects with a related property. Should I also remove the "%s" property from them?There are %d objects with a related property. Should I also rename the "%s" property to "%s" on them?There are %d pending changesThere are %d pending changes, %d of them applied to this objectThere are %d pending database migrationsThere are no data fields available. Please ask an administrator to create suchThere are no pending changesThere are no pending changes. Deploy anywayThere are pending changes for this Import Source. You should trigger a new Import Run.There are pending changes for this Sync Rule. You should trigger a new Sync Run.There are pending database migrationsThere are pending database schema migrationsThere have been %d changes to this object, nothing else has been modifiedThere is a single pending changeThese are different available job typesThese are different data providers fetching data from various sources. You didn't find what you're looking for? Import sources are implemented as a hook in Director, so you might find (or write your own) Icinga Web 2 module fetching data from wherever you wantThis Command is currently being used by %sThis Command is currently not in useThis Command is still in use by %d other objectsThis Import Source failed when last checked at %s: %sThis Import Source has an invalid state: %sThis Import Source provides modified dataThis Import Source was last found to be in sync at %s.This Service has been blacklisted on this hostThis Sync Rule failed when last checked at %s: %sThis Sync Rule has never been run before.This Sync Rule is in sync and would currently not apply any changesThis Sync Rule was last found to by in Sync at %s.This allows to filter for specific parts within the given source expression. You are allowed to refer all imported columns. Examples: host=www* would set this property only for rows imported with a host property starting with "www". Complex example: host=www*&!(address=127.*|address6=::1)This allows to show either a drop-down list or an auto-completionThis allows to temporarily disable this jobThis allows you to configure an assignment filter. Please feel free to combine as many nested operators as you wantThis allows you to configure an assignment filter. Please feel free to combine as many nested operators as you want. The "contains" operator is valid for arrays only. Please use wildcards and the = (equals) operator when searching for partial string matches, like in *.example.comThis allows you to configure an assignment filter. Please feel free to combine as many nested operators as you want. You might also want to skip this, define it later and/or just add this set of services to single hosts. The "contains" operator is valid for arrays only. Please use wildcards and the = (equals) operator when searching for partial string matches, like in *.example.comThis allows you to immediately deploy a modified configurationThis allows you to modify properties for "%s"This allows you to modify properties for all chosen hosts at onceThis basket is emptyThis feature is still experimentalThis has to be a MySQL or PostgreSQL databaseThis host has been registered via the Icinga Director Self Service API. In case you re-installed the host or somehow lost it's secret key, you might want to dismiss the current key. This would allow you to register the same host again.This is an external object. It has been imported from Icinga 2 through the Core API and cannot be managed with the Icinga Director. It is however perfectly valid to create objects using this or referring to this object. You might also want to define related Fields to make work based on this object more enjoyable.This is the "%s" %s Template. Based on this, you might want to:This is the name of the Endpoint object (and certificate name) you created for your ApiListener object. In case you are unsure what this means please make sure to read the documentation firstThis is where you add all your servers, containers, network or sensor devices - and much more. Every subject worth to be monitoredThis is where you manage your Icinga 2 Host Checks. Host templates are your main building blocks. You can bundle them to "choices", allowing (or forcing) your users to choose among a given set of preconfigured templates.This is where you manage your Icinga 2 Service Checks. Service Templates are your base building blocks, Service Sets allow you to assign multiple Services at once. Apply Rules make it possible to assign Services based on Host properties. And the list of all single Service Objects gives you the possibility to still modify (or delete) many of them at once.This is where you manage your Icinga 2 User (Contact) objects. Try to keep your User objects simply by movin complexity to your templates. Bundle your users in groups and build Notifications based on them. Running MS Active Directory or another central User inventory? Stay away from fiddling with manual config, try to automate all the things with Imports and related Sync Rules!This is where you manage your Icinga 2 infrastructure. When adding a new Icinga Master or Satellite please re-run the Kickstart Helper once. When you feel the desire to manually create Zone or Endpoint objects please rethink this twice. Doing so is mostly the wrong way, might lead to a dead end, requiring quite some effort to clean up the whole mess afterwards.This is your Config master and will receive our DeploymentsThis job has not been executed yetThis job runs every %ds and is currently pendingThis job runs every %ds.This job would run every %ds. It has been disabled and will therefore not be executed as scheduledThis modifier transforms 0/"0"/false/"false"/"n"/"no" to false and 1, "1", true, "true", "y" and "yes" to true, both in a case insensitive way. What should happen if the given value does not match any of those? You could return a null value, or default to false or true. You might also consider interrupting the whole import process as of invalid source dataThis must be a column containing unique values like hostnames. Unless otherwise specified this will then be used as the object_name for the syncronized Icinga object. Especially when getting started with director please make sure to strictly follow this rule. Duplicate values for this column on different rows will trigger a failure, your import run will not succeed. Please pay attention when synching services, as "purge" will only work correctly with a key_column corresponding to host!name. Check the "Combine" property modifier in case your data source cannot provide such a fieldThis must be an import source column (property)This name will show up as the author for ever related downtime commentThis object has been disabledThis object has been enabledThis object will not be deployed as it has been disabledThis pattern will be evaluated, and variables like ${some_column} will be filled accordingly. A typical use-case is generating unique service identifiers via ${host}!${service} in case your data source doesn't allow you to ship such. The chosen "property" has no effect here and will be ignored.This requires the Icinga Agent to be installed. It generates and signs it's certificate and it also generates a minimal icinga2.conf to get your agent connected to it's parentsThis service belongs to the %s Service Set. Still, you might want to override the following properties for this host only.This service belongs to the service set "%s". Still, you might want to change the following properties for this host only.This service has been generated in an automated way, but still allows you to override the following properties in a safe way.This service has been generated using the %s apply rule, assigned where %sThis service has been inherited from %s. Still, you might want to change the following properties for this host only.This set has been inherited from %sThis synchronizes Icinga Director to your Icinga 2 infrastructure. A new run should be triggered on infrastructure changesThis template is not in useThis template is still in use by %d other objectsThis will be shown as a label for the given choiceThis will be the visible caption for this entryTicketTimeTime PeriodTime PeriodsTime periodTime period rangesTime range "%s" has been removed from %sTime rangesTimeoutTimeperiodTimeperiod TemplatesTimeperiod objectTimeperiod templateTimeperiod template nameTimeperiodsTimerperiodsTimestampTo ensure downloaded packages are build by the Icinga Team and not compromised by third parties, you will be able to provide an array of SHA1 hashes here. In case you have defined any hashses, the module will not continue with updating / installing the Agent in case the SHA1 hash of the downloaded MSI package is not matching one of the provided hashes of this settingTop DownTotalTransform Host NameTransform to lowercaseTransform to uppercaseTransition typesTreeTrigger Import RunTrigger this SyncTriggering this Import Source failedTweak some global Director settingsTypeType attributesURL componentUnable to detect your Icinga 2 Core versionUnable to fetch data: %sUnable to store a host with the given properties because of insufficient permissionsUnable to store the configuration to "%s"Unable to store the configuration to "%s". Please check file permissions or manually store the content shown belowUndeployed configurationsUnknownUnknown, failed to collect related informationUnknown, still waiting for config check outcomeUnlinked imported propertiesUnlinked imported row setsUnlinked imported rowsUnsatisfied dependenciesUnused rendered filesUpUpdate MethodUpdate PolicyUpgrading Icinga 2 - Confic Sync: Zones in ZonesUpgrading documentationUploadUpload a BasketUpload a Configuration BasketUsageUsage (%s)Use a local file or network shareUse lowercase firstUsed sourcesUserUser GroupUser GroupsUser TemplatesUser groupsUser groups that should be directly assigned to this user. Groups can be useful for various reasons. You might prefer to send notifications to groups instead of single usersUser groups that should be notified by this notificationsUser propertiesUser template nameUsergroupUsergroupsUsernameUsersUsers / ContactsUsers that should be notified by this notificationsUsing Apply Rules a Service can be applied to multiple hosts at once, based on filters dealing with any combination of their propertiesUsually your hosts main IPv6 addressValueValue typeVariable ValueVariable nameVerify HostVerify PeerVisibilityVisibleVolatileWARNING, this can allow shell script injection via custom variables used in command.Want to define to execute specific checks only withing specific time periods? Get mobile notifications only out of office hours, but mail notifications all around the clock? Time Periods allow you to tackle those and similar requirements.WarningWarning: you're running Icinga v2.11.0 and our configuration looks like you could face issue %s. We're already working on a solution. The GitHub Issue and our %s contain related details.What kind of object this should be. Templates allow full access to any property, they are your building blocks for "real" objects. External objects should usually not be manually created or modified. They allow you to work with objects locally defined on your Icinga nodes, while not rendering and deploying them with the Director. Apply rules allow to assign services, notifications and groups to other objects.What should happen if the lookup key does not exist in the data list? You could return a null value, keep the unmodified imported value or interrupt the import processWhat should happen when the given string is empty?What should happen when the result array is empty?What should happen when the specified element is not available?What should happen with matching elements?What should happen with the row, when this property matches the given expression?What should we do if the DNS lookup fails?What should we do if the URL could not get parsed or component not found?What should we do if the desired part does not exist?What should we do if the host (DNS) lookup fails?What should we do in case we are unable to decode the given string?What should we extract from the DN?What should we place into this Basket every time we create new snapshot?When deploying configuration, wait at least this amount of seconds unless the next deployment should take placeWhen not availableWhether Downtimes should also explicitly be scheduled for all Services belonging to affected HostsWhether all configured Jobs should be disabledWhether flap detection is enabled on this objectWhether rendering should be forced. If not enforced, this job re-renders the configuration only when there have been activities since the last rendered configWhether the argument value is a string (allowing macros like $host$) or an Icinga DSL lambda function (will be enclosed with {{ ... }}Whether the field should be merged, replaced or ignoredWhether the parameter name should not be passed to the command. Per default, the parameter name (e.g. -H) will be appended, so no need to explicitly set this to "No".Whether the set_if parameter is a string (allowing macros like $host$) or an Icinga DSL lambda function (will be enclosed with {{ ... }}Whether this dependency should affect hosts or servicesWhether this downtime is fixed or flexible. If unsure please check the related documentation: https://icinga.com/docs/icinga2/latest/doc/08-advanced-topics/#downtimesWhether this notification should affect hosts or servicesWhether this parameter should be repeated when multiple values (read: array) are givenWhether this should be a templateWhether this zone should be available everywhere. Please note that it rarely leads to the desired result when you try to distribute global zones in distrubuted environmentsWhether to adjust your host nameWhether to disable checks when this dependency fails. Defaults to false.Whether to disable notifications when this dependency fails. Defaults to true.Whether to ignore soft states for the reachability calculation. Defaults to true.Whether to prefer timeperiods includes or excludes. Default to true.Whether to purge existing objects. This means that objects of the same type will be removed from Director in case they no longer exist at your import source.Whether to use encryption when talking to the REST APIWhether we should check that our peer's certificate has been signed by a trusted CA. This is strongly recommended.Whether we should check that the certificate matches theconfigured hostWhether you want to merge or replace the destination field. Makes no difference for stringsWill be stored as a custom variable value when this entry is chosen from the listWill be used for SOAP authentication against your vCenterWindows Kickstart ScriptWipe related varsWith ServicesWondering about what changed why? Track your changes!Wrap this expression into an operatorYES, please delete "%s"YesYou can create Basket snapshots at any time, this will persist a serialized representation of all involved objects at that moment in time. Snapshots can be exported, imported, shared and restored - to the very same or another Director instance.You can stop sharing a Template at any time. This will immediately invalidate the former key.You could immediately apply eventual changes or just learn about them. In case you do not want them to be applied immediately, defining a job still makes sense. You will be made aware of available changes in your Director GUI.You might want to let the generated Powershell script install the Icinga 2 Agent in an automated way. If so, please choose where your Windows nodes should fetch the Agent installerYou might want to show this field only when certain conditions are met. Otherwise it will not be available and values eventually set before will be cleared once storedYou might want to write the modified value to another (new) property. This property name can be defined here, the original property would remain unmodified. Please leave this blank in case you just want to modify the value of a specific propertyYou must define some %s before you can run this Sync RuleYour Icinga 2 API usernameYour LDAP search base. Often something like OU=Users,OU=HQ,DC=your,DC=company,DC=tldYour configuration looks good. Still, you might want to re-run this kickstart wizard to (re-)import modified or new manually defined Command definitions or to get fresh new ITL commands after an Icinga 2 Core upgrade.Your regular check intervalYour replacement stringYour users will be allowed to choose among those templatesZone (template) nameZone nameZone settingsZonesa listallbackby host group propertycheck commandclick herecriticaldatabase schemadisableddocumentationdowne.g. e.g. -H or --hostname, empty means "skip_key"e.g. 5%, $host.name$, $lower$%:$upper$%failed to fetchherehost var namehost var valuemissingmodifiedmorenewnono related group existsokon hoston service setone related group existspendingreturn NULLreturn an empty arraysservice var nameservice var valuestart usingthe display namethe update methodto a host groupunchangedunknownunreachableunsupportedunusedupusedvalue formatviawarningyesProject-Id-Version: Director Module (master) Report-Msgid-Bugs-To: dev@icinga.com PO-Revision-Date: 2019-09-25 14:01+0200 Language: it_IT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Basepath: . Language-Team: X-Generator: Poedit 2.0.6 X-Poedit-SearchPath-0: . (ereditato da "%s") - non utilizzato -# in uso# Vars%d / %d%d Host-Template%d Host(s)%d Regole-Apply-Notifica%d template di notifica%d Notifiche%d Regole Service Apply%d Service-Template(n)%d Service(s)%d Sono definite regole di Apply%d creato%d cancellato%d files%d file creati in %0.2fs%d sono stati creati all'esterno e non vengono distribuiti%d modificatocreati %d oggetti%d oggetti verranno cancellati%d oggetti verranno modificati%d oggetti trovati%d oggetti sono stati definiti%d oggetti sono stati modificati%d oggetti, %d template, %d regole-Apply%d di questi sono template%d template sono stati definiti%s "%s" é stato creato%s "%s" é stato cancellato%s "%s" é stato importato"%s "%s" é stato modificato%s %s(%s)%s (%d membri)%s (Service-Set associati)%s (Service-Set)%s (default)%s (dove %s)%s Template%s basato su %s%s cambimenti di configurazione dopo l'ultima distribuzione di configurazioni%s é stato messo in blacklist %s%s non é più nella lista di blacklist %s%s oggetti sono stati cambiati%s auf %s (da questo set "%s")sono stati creati %s oggetti di gruppo associati%s template "%s": campo personalizzato%s template basati su %s%s: %d%s: %s (Snapshot)%s: modificatore di proprietá%s: Snapshots%s: aggiunta di modificatore di proprietácache di risoluzione gruppo (Hosts)(su %s)- aggiungere altro -- premi per aggiungere altro -- eereditato -- nessuna installazione automatica -- prego scegliere -...e %d altroUn basket di configurazione si riferisce ad elementi di configurazione o tutti gli oggetti di un particolare tipo. É stato sviluppato per condividere Template, strategie di Import/Sync e altri elementi base di configurazione. Questo non é uno strumento per configurare singoli Host o ServicesUn filtro LDAP aggiuntivo da usare insieme alla classe dell'oggetto. Questo permette una grande flessibilitá ma necessita di conoscenze profonde sui filtri LDAP. Filtri semplici possono essere di questo tipo: operatingsystem=*server*Una stringa personalizzata. Se sono presenti colonne sorgenti, devono venir usati segnaposti nella forma di ${columnName}. È possibile fare riferimento a dati strutturati tramite ${columnName.sub.keyUna descrizione del campoUna descrizione dettagliata sull'obiettivo di questa selezioneUna descrizione significativa che spiega agli utenti cosa aspettarsi dall'assegnazione di questo service setUn nuovo %s é stato creato con successoUn nuovo Self Service API per %s é stato creato con successoUn modificatore di proprietà consente di modificare una proprietà specifica al momento dell'importazioneUn breve nome per definire questa sorgente di importazione. Usa qualcosa di significativo come "Hosts da Puppet" o "utenti da LDAP" Un breve nome per descrivere questa operazione. Usa qualcosa di significativo come "Importazione di Host da Puppet" Un breve nome per questo Service-SetNon è stato possibile richiedere un ticket per questo agent da questo endpoint: %s Nel complesso, la configurazione è stata modificata %d volte dall'ultima distribuzioneAPI Keyutente APIAccetta check passiviAccetta configurazioniConfermaAzioneAction-URLAzioneStrumento di attivazioneAttivo-passivoAttivitáLog di attivitáLog di attivitá: %sLog di attivitáRegistrazione del registro delle attivitàAggiungere%s aggiunto%s oggetti aggiuntiAggiungere %s: %sAggiungere ServiceAggiungere Service-SetAggiungi Service-Set a %d HostsAggiungi Service-Set a %sAggiungi Service a %sAggiungi servizio: %sAggiungi un lavoroAggiungi un nuovo campo datiAggiungi un nuovo elenco di datiAggiungi una nuova sorgente di importazioneAggiungi un nuovo JobAggiungi una nuova regola di sincronizzazioneAggiungi un nuova voceAggiungi un nuovo...Aggiungi un Service-Set a "%s" Aggiungi un Service a "%s" Aggiungi un altro filtroAggiungi oggetti selezionati al basket di configurazioneAggiungi la voce dell'elenco datiAggiungi voceAggiungi sorgente di importazioneAggiungi lavoroAggiungi elencoAggiungi un nuovo Icinga %sAggiungi nuovo Icinga al template %sAggiungi modificatore di proprietáAggiungi ServiceAggiungi Service-SetAggiungi un Service a %d HostsAggiungi regola di sincronizzazioneAggiungi proprietá di sincronizzazione: %sAggiungere regola di sincronizzazioneAggiungere a BasketNote aggiuntive per questo oggettoProprietá aggiuntiveAgentVersione AgentAvvisa i tuoi utentiAliasTutte le modificheTutte le modifiche vengono loggate nel database del Director. Inoltre, è possibile inviare un log tramite il meccanismo di logging di Icinga Web 2. In questo modo tutte le modifiche vengono scritte nel Syslog o il log file configurato. Per ottenere questo risultato Icinga 2 deve girare almeno con il livello di Log "Info".Tutte le variabili personalizzate (vars)Tutte questeTutte le sovrascritture sono state rimosse da "%s"Tutte le regole Apply %sTutti i Template %sAbilitare le modificheConsenti valori non presenti nell'elencoConsenti agli utenti di sola lettura di vedere da dove proviene un servizioConsentire l'accesso all'API del DirectorConsentire di accedere all'audit log completoConsenti la configurazione di HostConsenti la configurazione di notificheConsenti la configurazione di Service-SetsConsenti la configurazione di ServicesConsenti la configurazione di utentiConsenti la definizione di regole Apply Service-SetConsentire la distribuzione delle configurazioniConsentire di ispezionare oggetti tramite l'API Icinga 2 (potrebbe contenere elementi sensibili)Permetti di vedere i dettagli del templateConsenti di mostrare la configurazione (potrebbe contenere informazioni riservate)Consentire di mostrare le query SQL eseguite completamente in alcuni puntiPermettete di utilizzare solo template di host che corrispondono a questo filtroPermettete di utilizzare solo queste risorse db (elenco separato da virgole)Consentire di utilizzare questa voce solo agli utenti con uno di questi ruoli Icinga Web 2Consentire l'accesso senza restrizioni a Icinga DirectorMassimo consentitoRuoli consentitiClona anche i campi forniti da questo TemplateClonare anche singoli Service Sets definiti per questo HostClonare anche singoli Services definiti per questo HostInstalla anche NSClient++. Può essere utilizzato tramite l'agente Icinga e arriva con parecchi Check-Plugins aggiuntiviRinominare anche variabili personalizzate da "%s" a "%s" su %d questi oggetti?Pulisci anche tutti le variabili personalizzate "%s" dagli %d oggetti?Nome alternativo per questo Host. Può essere un Alias o qualsiasi stringa, aiuta gli utenti nell'identificare questo HostNome alternativo per questo utente. Se il nome dell'oggetto fosse uno username, potrebbe essere utile usare il nome completo della persona.Testo alternativo da mostrare nel caso in cui l'icona manchiUn'espressione Icinga DSL che restituisce un valore booleano, e.g.: var cmd = bool(macro("$cmd$")); return cmd ...Un'espressione Icinga DSL, e.g.: var cmd = macro("$cmd$"); return typeof(command) == String ...Un URL che porta ad azioni aggiuntive per questo oggetto. Viene usato spesso con Icinga Classic, meno usato con Icinga Web 2, in quanto quest'ultimo offre soluzioni di Addons miglioriUn URL che punta a note aggiuntive per questo oggettoUn URL che punta ad un'icona per questo oggetto. Prova "tux.png" per icone relatice al path public/img/icons o "cloud" (senza estensione) per oggetti dall'Icinga icon font.Un nome visualizzato alternativo per questo gruppo. Può essere lasciato vuoto.Una descrizione estesa per questo modificatore di riga di importazione. Questo dovrebbe indicare il suo scopo e perché è stato messo in atto.Una descrizione estesa per questa sorgente di importazione. Questo dovrebbe indicare che tipo di dati verranno importati da questa sorgenteUna descrizione estesa per questa regola di sincronizzazione. Questo dovrebbe indicare ciò che questa regola sta per realizzare.Una descrizione estesa per questo campo. Verrà mostrato non appena un utente si sposta su questo campoUna classe di oggetti da cercare. e.g. "user", "group", "computer" o similiUn'altra sorgente di importazione. Verrà individuata la riga la cui chiave corrisponde al valore nella colonna sceltaQualsiasi primo componente (più a sinistra)API Key:Applicato %sApplicato a gruppiApplicato service: %sApplicato servicesApplicaApplica "%s"Applica %d migrazione di schema in sospesoApplica aApplica Icinga %sRegola ApplyAnteprima di come risulta la regola applicataRegole ApplyApplicare una migrazione dello schema in sospesoApplica le modificheApplica notifiche con proprietà specifiche in base a determinate regole.Applica regoleStorico delle regole applicateApplica schema di migrazioneApplica aApplica: %sArgomentoArgomento macroNome argomentoArgomentiArrayAssegna doveAutoreAutocompletamentoAutomatizza tutte le operazioniAutomazioneScelte disponibiliIndietroBasketDefinizioni BasketNome BasketBasket SnapshotsIl Basket é stato caricatoBasketsFai attenzione: di solito NON è quello che vuoi, poiché fa la Sync "blind" per tutti gli oggetti corrispondenti a questo filtro. Ciò significa che "Purge" non funzionerà come ci si aspetta. Ti consigliamo di usare invece il "Black/Whitelist" Import Modificatore proprietà.BinaryBlacklistDidascaliaCambia prioritáLa modifica di questo valore influisce %d oggett(o,i): %sCheck CommandsCheck commandDefinizione Check commandCheck command timeout in secondi. Sovrascrive l'attributo timeout del commandoCheck executionVerifica le modificheCheck intervalCheck periodCheck timeoutVerifica di questa sorgente di importazione non riuscitaVerifica della regola di sincronizzazione non riuscitaChecksumHost-figlioService-figlioNome sceltoSelezioneScegli "Tutti" per aggiungere sempre tutti, "Ignora" per non includere uno specifico Tipo e scegli "Selezione personalizzata" nel caso in cui si vogliano includere solo alcuni oggetti specifici.Scegli un Host templateScegli un Service templateScegli un tipo di oggettoScegli un fileScegli l'Host a cui assegnare questo singolo servizioLa scelta di molte opzioni sarà obbligatoria per questa scelta. Impostando questo su zero, questa scelta sarà facoltativa, impostandola su uno diventerà una scelta "obbligatorio". È possibile utilizzare numeri più alti per applicare più opzioni, questa scelta si trasformerà quindi in un elemento a selezione multipla.Scegli una zona padre (facoltativa)Clicca per leggere la documentazione: %sClonaClona "%s"Clona Icinga %sClona Service-SetClona ServicesClona campi templateClona l'oggetto così com'è, preservando le importazioniClonare questo Service sullo stesso o su un altro HostClonare questo servizio sullo stesso o su un altro Service SetClona %sCluster ZoneCombina più template in scelte significative, semplificando la vita ai tuoi utentiCommandDefinizione CommandCommand TemplateCommand TemplatesCommand argomenti: %sCommand endpointNome commandTipo commandVariabili specifiche del comando definite dall'utenteCommandsCommentoComparazione %s "%s" da Snapshot "%s" con la configurazione attualeCondizione (set_if)Formato condizioneConfigurazioneDistribuzione configurazioneDistribuzione configurazione fallitaDifferenze configurazioneFile di configurazione "%s"La configurazione è stata inviata, la convalida è in corsoLa configurazione non è stata distribuitaCronologia ConfigurazioneAnteprima della configurazione: %sConfigurazioniConfigurazioneConfigurazione (solo lettura)Configurazione BasketsFormato configurazioneLa Configurazione é stata salvataGli oggetti di configurazione sono stati aggiunti al Basket "%s" selezionatoConfigurare questo agente tramite l'API self-serviceChecksum contenutoCount-QueryCreatoCreare BasketCreare SnapshotCrea una nuova regola %s ApplyCrea un nuovo %s SetCrea un nuovo %s ereditando da questoCrea un nuovo %s ereditando da questo templateCrea un nuovo Basket di configurazioneCrea un nuovo templateCrea un nuovo oggettoCrea un nuovo template di selezioneCrea lo schema di databaseCrea subitoCrea lo schemaCreatoCriticoUtilizzo template correnteSelezione personalizzataVariable personalizzataVarianti di varibili personalizzate: %sVariabili personalizzateVars personalizzati - PanoramicaEspressione personalizzataCampi personalizzati: "%s"Notifica personalizzataProprietà personalizzateVariabile personalizzataVariabile personalizzata (vars.)Variabili personalizzatePanoramica di variabili personalizzateQuery DBRisorsa DBDN componenteDNS record typeServizioIl servizio %s è stato arrestato, girava prima con PID %s e %s@%sIl servizio è in esecuzione con PID %s %s@%s, l'ultimo aggiornamento è avvenuto in %s Servizio keep-alive è obsoleto, è stato visto per l'ultima volta in esecuzione con PID %s %s@%s %sCampi datiElenco datiVoce dell'elenco datiElenco dati: %sElenchi di datiCampi datiI campi dati consentono di personalizzare i controlli di input per le custom variables di Icinga. Dopo averli definiti qui, è possibile utilizzarli nelle definitioni dei template. Questo ti dà un controllo granulare su quali proprietà i tuoi utenti dovrebbero essere autorizzati a configurare e in che modo.I campi dati consentono di personalizzare i controlli di input delle variabili personalizzate.I campi dati assicurano che la configurazione soddisfi le tue regole.Elenco campiElenchi di datiGli elenchi di dati vengono utilizzati principalmente come sorgente di dati per le variabili personalizzate presentate come caselle. Puoi gestire manualmente le loro voci direttamente qui, ma puoi anche creare regole di sincronizzazione dedicate, dopo aver creato un nuovo elenco. Ciò ti consente di mantenere sincronizzate le opzioni disponibili con sorgenti di dati esterniTipo di datiDatabase backendDataGiorno(i)Si noti che v1.x è solo per progetti speciali di transizione e completamente non supportato. Non ci sono piani per rendere Director un backend di configurazione per Icinga 1.x.Zona globale predefinitaDefinisci i comandi Check, Notification o Event. Le definizioni dei comandi sono i link tra i tuoi controlli Host e Service e i plugin Check sui tuoi sistemi di monitoraggio (o monitorati)Definisci campi datiDefinisci i gruppi host per dare più struttura alla tua configurazione. Sono utili per dashboard, notifiche o restrizioniDefinire un URL di download o una directory locale da cui prelevare uno specifico pacchetto di installazione MSI Icinga 2 Agent. Assicurati di definire solo l'URL o la directory di download di base. Il modulo genererà il nome del file MSI in base all'architettura del sistema operativo e alla versione da installare. Il nome del programma di installazione MSI Icinga 2 è costruito internamente come segue: Icinga2-v [InstallAgentVersion] - [OSArchitecture] .msi (esempio completo: Icinga2-v2.6.3-x86_64.msi)Definire e gestire le importazioni da varie sorgenti datiDefinire periodi di tempo personalizzatiDefinire come sincronizzare i dati importati con IcingaDefinire cosa dovrebbe accadere quando esiste già un oggetto con una chiave corrispondente. È possibile unire le sue proprietà (importazione sorgente vince), sostituirlo completamente con l'oggetto importato o ignorarlo (utile per le importazioni singole)Definisci qualunque cosa tu voglia monitorareDefinisce dopo quanti tentativi di controllo viene raggiunto un nuovo Hard StateLa definizione di notifiche per gruppi di utenti anziché singoli utenti offre maggiore flessibilitàLa definizione di gruppi di servizi ottiene una maggiore struttura. Ottimo per i dashboard. Le notifiche e le autorizzazioni potrebbero essere basate sui gruppi.Ritarda prima di spedire la prima notificaEliminaDelimitatoreDipendenzeDipendenzaDistribuireDistribuisci %d modifiche in sospesoDistribuire la configurazione sui nodi IcingaDistribuire la configurazione modificataDistrubuisci al masterDistribuzionePercorso di distribuzioneDettagli di distribuzioneModalità di distribuzioneModalità di distribuzione per la configurazione di Icinga 1Tempo di distribuzioneDistribuzioniDistrubuzioni / CronologiaDescrizioneDescrizione dell'argomentoDestinazioneCampo di destinazioneSapevi che puoi eseguire questo Health Check (o solo alcune sezioni) come Icinga Check su base regolare?DiffDifferenza con altre configurazioniDirettoDirector Background DaemonDirector HealthDirector Kickstart WizardImpostazioni DirectorLo schema del database Director non è stato ancora creatoDisattivare i ChecksDisattivare le notificheDisattiva tutti i JobsDisabilitatoDisabilitato per impostazione predefinita e deve essere utilizzato solo in rari casi.Gli oggetti disabilitati non verranno distribuitiNome da visualizzareNome da visualizzareComandi distintiFai di più con i dati personalizzatiNon trasformare affattoDocumentazioneGiùScaricaScarica come JSONScarica da un URL personalizzatoScarica da packages.icinga.comFine DowntimeNome DowntimeDowntime rimossoDowntime partitoElimina Self Service API keyMenu a tendina (solo valori elenco)DurataModifica un campoModifica voceModifica fonte importazioneModifica elencoModifica regola di sincronizzazioneModifica regola di sincronizzazioneComportamento dell'elementoE-MailAbilita audit logAbilita event handlerAbilita flap detectionEndpointNome endpointIndirizzo endpointNome template endpointEndpointsVociErroreStabilire una connessioneCalcola la regola Apply per tutti gli oggetti con l'attributo personalizzato specificato. Ad esempio, selezionando "host.vars.custom_attr" genererà "for (config in host.vars.array_var)" dove "config" é accessibile tramite "$config$". NOTA: sono ammesse solo le variabili personalizzate di tipo "Array". Event commandDefinizione event commandOgni downtime correlato mostrerà questo commentoEscludere altri periodi di tempo da questo.Escludi periodoEsegui checks attiviIntervallo di esecuzione per questo Job, in secondiElenchi di dati esistentiElenchi di template esistentiExpert modeEspressioneEstendi l'elenco con nuovi valoriEsternoDefinizione comandi esterniComandi esterniI comandi esterni sono stati definiti nella configurazione Icinga 2 locale.Comandi di notifica esterniI comandi di notifica esterni sono stati definiti nella configurazione Icinga2 locale.FQDNFallitoImportazione di %s "%s" fallitaIl campo è stato rimossoNome del campoTipo di campoCampiFileEspressione filtroFiltra le notifiche disponibili per applicare le regoleFiltra i servizi disponibili per applicare le regoleFiltra i template di set di servizi disponibili. Usa gli asterischi (*) come caratteri wildcards, come in DB* o *net*Filtro service sets disponibileMetodo di filtroFiltro stringaPrimo elementoPrimo ritardo di notificaFissatoFlappingFlapping terminatoFlapping limite inferiore in percentuale per un servizio da considerare non flappingFlapping iniziatoFlapping soglia (alta)Flapping soglia (bassa)Flapping limite superiore in percentuale per un servizio da considerare flappingAppiattire tutte le proprietà ereditate, rimuovere le importazioniSvuota directory APIPer la configurazione manualeForza il renderingImpossibile creare l'elemento del modulo,%s mancanteIl modulo è stato inviato con successoFormatoOggetto precedenteNome di dominio completo (FQDN)Genera Self Service API keyGenera una nuova chiaveConfig generataGenerato da host varsRicevi avvisi quando qualcosa va stortoOttieni una panoramica dei CustomVar usati e delle loro variantiImpostazioni Director globaleImpostazione Self Service globaleZone globaliZona globaleLinkTorna a "%s" DashboardPeriodo di graziaGruppoIl gruppo è stato ereditato, ma verrà sostituito dai gruppi assegnati localmenteMembro del gruppoMembro del gruppo: %sRaggruppare i tuoi servizi in set ti consente di assegnare rapidamente i servizi spesso utilizzati contemporaneamente con un'unica operazione GruppiHTTP (questo è in chiaro)HTTP proxyHTTPS (fortemente raccomandato)HealthQui puoi trovare tutti i singoli servizi direttamente associati ai singoli host NascostoNascondi SQLSuggerimento: Check-PluginSuggerimenti riguardanti questo servizioHistoryHostHost variabili personalizzateGruppo HostGruppi di HostNome HostHost TemplateScelta del template HostHost TemplatesIndirizzo HostIndirizzo Host. Di solito un indirizzo IPv4, ma può essere qualsiasi tipo di indirizzo con cui il plug-in riesce a lavorareConfigurazioni HostGruppi HostNome HostNome Host (parte locale, senza dominio)Oggetti HostsProprietà dell'HostScelta del template HostScelta del template HostGruppo HostGruppi di HostHostgroup che devono essere assegnati direttamente a questo nodo. Gli hostgroup possono essere utili per vari motivi. È possibile assegnare service checks basati su hostgroup. Inoltre, vengono spesso utilizzati come strumento per imporre visualizzazioni limitate in Icinga Web 2. Gli hostgroup possono essere direttamente assegnati a singoli host o a template host. Potresti anche prendere in considerazione l'assegnazione di hostgroup utilizzando le regole applyNome HostNome Host, IP o :HostsHosts che usano questo Set: %sQuanto dura il tempo di downtime. Ha effetto solo per flexible downtime (non fissi).Tempo in secondi, i suffissi supportati includono ms (millisecondi), s (secondi), m (minuti), h (ore) e d (giorni ). Per esprimere "90 minuti" potresti voler scrivere 1h 30mSo cosa sto facendo, distribuire comunqueLo so, per favore non disturbarmi di nuovoIndirizzo IP / nome Host del nodo remotoIndirizzo IP / nome host del nodo Icinga. Tenere presente che queste informazioni verranno utilizzate solo per la prima connessione all'istanza Icinga. Il Director si basa quindi su un oggetto Endpoint configurato correttamente. Configurazione corretta significa che il nome è risolvibile o che la sua proprietà Host contiene un indirizzo IP o un nome Host risolvibile. Il tuo Director deve essere in grado di raggiungere questo endpointIndirizzo IPv6Icinga Icinga %sIcinga %s SetsOggetti Icinga 2: %sIcinga 2 API - StatoIcinga 2 documentazione clientIcinga Agent e proprietá della zonaUtene Icinga APIIcinga DSLIcinga DirectorIcinga Director - Dashboard principaleIcinga Director Background DaemonConfigurzione Icinga DirectorIcinga Director decide di distribuire oggetti come CheckCommands in una zona globale. L'impostazione predefinita è "director-global" ma potrebbe essere adattata a un nome di zona personalizzatoIcinga Director dipende dai seguenti moduli, si prega di installare / aggiornarecome richiestoIcinga Director offre un'API Self Service che consente ai nuovi nodi Icinga di registrarsiIcinga HostIcinga InfrastrutturaIcinga Package NameZona cluster Icinga. Consente di sovrascrivere manualmente le decisioni del Director su dove distribuire la configurazione. Si dovrebbe considerare di non farlo a meno che non si sia acquisita una profonda conoscenza di come funziona lo stack Cluster IcingaNome oggetto Icinga per questo gruppo HostNome dell'oggetto Icinga per questo Host. Di norma è un fully qualified host completo ma potrebbe essere praticamente qualsiasi tipo di stringa. Per rendere le cose più comprensibili per i tuoi utenti ti consigliamo vivamente di usare nomi significativi per i template. Ad esempio "generic-host" è brutto, "Standard Linux Server" è più facile da capireNome oggetto Icinga per questo gruppo di serviziNome oggetto Icinga per questo gruppo di utentiIcinga v1.xIcinga v2.11.0 rompe alcune configurazioni, il Director ti avviserà prima di ogni distribuzione nel caso in cui la tua configurazione ne sia colpita. Questa impostazione consente di soprimere questo avviso.Icinga v2.xIcinga2 AgentImmagine IconImmagine Icon alternativaIdIdentificatore del comando Icinga che stai per creareSe abilitato non è possibile definire argomenti.IgnorareIgnora Bug #7530Ignora Soft StatesImporta / SincronizzaSorgente di importazioneSorgente di importazioneSorgente Import per i datiSorgente import esterno "%s"Esegui importazioneCronologia esecuzioni importanzioni: %sImporta esecuzioniSorgente importazioneNome della sorgente di importazioneAnteprima della sorgente di importazione: %sSorgente di importazione: %sTemplate importabili, aggiungine quanti ne desideri. Tieni presente che l'ordine é importante quando importi proprietà da più template: l'ultimo vinceNuovi dati importati da questa sorgente di importazioneRighe importateL'importazione di un oggetto significa che il suo tipo cambierà da "esterno" a "oggetto". In questo modo farà parte della distribuzione successiva. Quindi, nel caso in cui tu abbia importato questo oggetto dal tuo nodo Icinga assicurati di rimuoverlo dalla configurazione locale prima di eseguire la distribuzione successiva. In caso di conflitto non accadrà nulla di grave, solo la configurazione non verrà distribuita.ImportsNel caso in cui un amministratore Icinga ti fornisse un token API self-service, è qui che puoi registrare nuovi hostNel caso in cui Icinga 2 Agent sia già installato sul sistema, questo parametro ti consentirà di configurare se desideri aggiornare / eseguire il downgrade anche a una versione specificata.Nel caso in cui Icinga 2 Agent venga installato automaticamente, questo deve essere un valore stringa come: 2.6.3Nel caso in cui Icinga Agent accetti la configurazione dal sistema Icinga 2 padre,probabilmente scriverà i dati su /var/lib/icinga2/api/*. Impostando questo parametro su true, tutto il contenuto all'interno della directory api verrà pulitaprima di un eventuale riavvio dell'agente Icinga 2Nel caso in cui la tua API sia raggiungibile solo attraverso un proxy, scegli il suo protocollo proprio quiNel caso in cui il proxy richieda l'autenticazione, puoi configurarlo quiIncludere altri periodi di tempo in questo.Includi periodoIndirettoOggetti Service individualiInfrastrutturaEreditá (Import)Gruppi ereditatiService eriditati: %sIspezionareIspeziona - elenco oggettiInstall NSClient++Fonte di installazioneInstallatoHash di installazioneComandi interniDa allora è stato rinominato, il suo nome precedente era %sNon è una buona idea farlo finché il tuo agente ha ancora una chiave API self-service valida!Non sarà permesso scegliere più opzioni di queste preimpostate. Impostandolo su uno (1) si otterrà una casella Dropdown, un numero più alto lo trasformerà in un elemento a selezione multipla.Al momento non è noto se siamo sincronizzati con questa sorgente di importazione. È necessario verificare la presenza di modifiche o eseguire una nuova importazione.Al momento non è noto se siamo sincronizzati con questa regola. È necessario verificare la presenza di modifiche o eseguire una nuova sincronizzazione.Non è consentito conservare un Basket vuotoJobLavoro %sDefinizione JobTipologia JobNome JobJob: %sJobsVai a questo oggettoScarica ed esegui questo script sul tuo computer client Linux:Mantieni gli elementi corrispondentiMantieni solo le righe corrispondenti (Whitelist)Mantieni DNMantieni la stringa JSON così com'èMantieni la proprietà (nome Host) così com'èMantieni la proprietà così com'èChiaveNome della colonna chiaveKickstartAssistente KickstartLDAP Search BaseEtichettaRisultato ultimo checkUltimo elementoUltima notificaUltima attività correlataDettagli dell'ultima sincronizzazioneLascia vuoto per argomenti non posizionali. Può essere un numero positivo o negativo e influenza l'ordine degli argomentiLasciare le variabili personalizzate mentre si rimuove il campo correlato è un'operazione perfettamente valida e potrebbe essere quella desiderata. In questo modo non è più possibile modificare le variabili personalizzate correlate nella GUI del Director, ma le variabili stesse rimarranno lì e continueranno a essere distribuite. Quando riaggiungi nuovamente un campo per la stessa variabile, tutto continuerà a funzionare come primaLasciare le variabili personalizzate in atto durante la ridenominazione del campo correlato è un'operazione perfettamente valida e potrebbe essere quella desiderata. In questo modo non è più possibile modificare le variabili personalizzate correlate nella GUI del Director, ma le variabili stesse rimarranno lì e continueranno a essere distribuite. Quando riaggiungi nuovamente un campo per la stessa variabile, tutto continuerà a funzionare come primaLascia che l'importazione falliscaLascia che l'intera esecuzione dell'importazione falliscaLascia che l'intera esecuzione dell'importazione falliscaLimitare l'accesso all'elenco di hostgroups separato da virgoleRiga di comando di LinuxElenca vociElenca vociNome listaDirectory locale per distribuire la configurazione di Icinga 1.x. Deve essere scrivibile da icingaweb2. (ad es. /etc/icinga/director)Durata del LogProprietà principaliGestisci le definizioni per i tuoi comandi che devono essere eseguiti come check plugin, notifiche o basati su eventiGestisci distribuzioni, registro di audit degli accessi e la cronologiaMuovi in basso (abbassa prioritá)Muovi in alto (aumenta prioritá)Nome per il periodo di Icinga che stai per creareNome per il template del periodo di tempo di Icinga che si sta per creareNome per la zona Icinga (template) che stai per creareProssima paginaNessun oggetto trovatoNessun template correlato è stato ancora fornitoNessun servizio é stato selezionatoNessun servizio del genere: %sNessun template é stato selezionatoNessun template é stato ancora definitoNessunoNessuno potrebbe essere utilizzato per le distribuzioni in questo momentoNoteNote URLNessuna modifca, regole in sincronizzazioneNulla da fare, i dati forniti da questa sorgente di importazione non sono cambiati dall'ultima esecuzione dell'importazioneNiente da fare, il ripristino non modificherebbe l'oggetto correnteNulla cambierebbe, questa regola è ancora in sincronizzazioneNotificaRegole di apply rule per notifiche basate su %sComandi di notificaI comandi di notifica consentono di attivare qualsiasi azione che si desidera quando avviene una notificaNotifica templateComandi di notificaInterfallo di notificaScelta notifica templateNotifica templatesNotificheLe notifiche vengono inviate quando un host o un servizio raggiunge uno stato non-ok hard state o si riprende da tale stato. Si potrebbe anche volerle inviare per eventi speciali come quando inizia un periodo di inattività, quando un problema viene riconosciuto e molto altro ancora. È possibile inviare notifiche specifiche solo entro periodi di tempo specifici, è possibile ritardarle e naturalmente ri-notificare a intervalli di tempo specifici. Combinate queste possibilità nel caso in cui sia necessario definire livelli di escalation, come la notifica prima agli operatori e la vostra gestione in seguito nel caso in cui il problema rimanga non gestito per un certo periodo di tempo. Potreste inviare e-mail o SMS, fare telefonate o pagine su vari canali. Potreste anche delegare le notifiche a fornitori di servizi esterni. Le possibilità sono infinite, poiché è possibile definire tutti i comandi di notifica personalizzati che si desideraPosizione numericaOkOggettoIspezione dell'oggettoTipo OggettoClasse dell'oggettoL'oggetto é stato ri-creatoL'oggetto é stato ripristinatoNome oggettoProprietá dell'oggettoTipo OggettoTipo Oggetto "%s"Oggetto/Tpl/ApplicaSpesso il risultato atteso è fornito in una proprietà come "oggetti". Si prega di specificare questo se richiestoIn caso di fallimentoUna apply rule é stata definitaUn oggetto esterno é stato definite, non verrá implementatoUn oggetto è stato definitoUn oggetto é stato modificatoUno o più caratteri da utilizzare per separare questa stringaUno o più caratteri che saranno usati per incollare un input array ad una stringa. Può essere lasciato vuotoUno o più periodi di tempo, ad es. 00:00-24:00 o 00:00-09:00,17:00-24:00Un template é stato definitoImpostare questo parametro solo se il valore dell'argomento si risolve su un valore numerico. I valori delle stringhe non sono supportatiOperatoreOpzionaleTimeout comando opzionale. I valori ammessi sono i secondi o le durate fissate con una specifica unità (ad esempio 1m o anche 3m 30s)Altri campi disponibiliAltre risorseSovrascrivi variabiliPanoramicaProprietarioPHP BinarioPHP InteroPHP-VersioneLa versione 5.4.x di PHP è richiesta per Director >= 1.4.0, in corso %s. Si prega di aggiornare PHP o di eseguire il downgrade di Icinga DirectorPIDPaginazioneNavigazione della paginaHost-ParenteSevizio-ParenteZona-ParentePasswordModelloSono state applicate con successo le migrazioni degli schemi di database in sospesoSi prega di contattare l'amministratore per richiedere l'accesso alle risorseSi prega di controllare la configurazione del vostro Basket, %s non supporta singoli oggetti di configurazione "%sSi prega di scegliere una lista dati che puo' essere utilizzata per la map lookupsScegliere un tipo di Icinga-Oggetto specificoSi prega di cliccare nuovamente "Memorizza" per determinare la colonna di interrogazioneSi prega di premere %s per creare nuove risorse DBSi prega di premere %s per creare nuove risorseSi prega di definire prima un %sSi prega di definire prima un template di servizioSi prega di definire prima un template correlatoSi prega di assicurarsi che il database esista e che il tuo utente abbia ottenuto sufficienti autorizzazioniPer istruzioni dettagliate su come iniziare e terminare il lavoro, vedere le %sSi prega di iniziare a digitare per ottenere dei suggerimenti. I punti consentono di accedere alle proprietà annidate: column.some.key. Tali proprietà annidate non possono essere modificate in loco, ma è possibile memorizzare il valore modificato in una nuova "proprietà di destinazione".I comandi Plugin Check sono ciò di cui avete bisogno quando eseguite i controlli sulla vostra infrastruttura. I comandi di notifica saranno utilizzati quando si tratta di notificare i vostri utenti. I comandi degli eventi vi permettono di attivare azioni specifiche quando si verificano problemi. Alcuni li usano per meccanismi di auto-guarigione, come il riavvio di servizi o il riavvio di sistemi a soglie specificheComandi PluginPolicyPortaPosizioneTipo posizionePostgreSQL SchemaPreferisce includeConservare gli oggetti di configurazione specifici in uno stato specificoAnteprimaPagina precedentePrioProblemaGestione problemaElenco dei processiDati sulle prestazioni del processoModificatori di proprietà: %sProtettoProtocolloPrototipi (metodi)Fornire elenchi datiFornire liste di dati per facilitare il lavoro ai vostri utentiProxyIndirizzo ProxyPassword ProxyUsername ProxyRipulireEliminare i valori esistenti.RangesRi-distribuisci adessoRecuperaRigenerare la chiave API del Self ServiceRegistraRegistra AgenteEspressione RegolareSchema di espressione regolare per dividere la stringa (ad esempio /\s+/ o /[,;]/)Rifiuta gli elementi corrispondentiRifiuta l'intera fila (Blacklist)Oggetti correlatiRimuoviRimuovere "%s" da questo hostRimuovere questa voceRimuovere questa parte del filtroRinomina le variabili correlatiRenderizza come stringaCreare la configurazioneFile renderizzatoRendered in %0.2fs, distribuito in %0.2fsRenderingRipeti chiaveSostituisciRichiestoRipristinaRipristinare l'oggetto precedenteRipristinare a questo Director DBIntervallo di ripetizioneIntervallo di ripetizione, sarà applicato dopo un cambio di stato, a meno che non venga raggiunto il prossimo stato difficileLa chiave di ricerca per la restituzione rimane invariataNome regolaEseguiEseguire tutte le importazioni in una sola voltaEsegui importazioneIntervallo di esecuzioneEsegui su agentFunzionamento con systemdSOCKS5 ProxySQL-QueryProgrammare e automatizzare l'importazione, la sincronizzazione, la configurazione, l'implementazione, la pulizia e altro ancoraProgrammare le notificheProgrammate le vostre notifiche. Definire chi deve essere notificato, quando e per quale tipo di problemaDowntime programmatoDowntime programmatiScript o tool da chiamare quando si attiva una nuova fase di configurazione. (ad esempio sudo /usr/local/bin/icinga-director-activate) (il nome dello stage sarà l'argomento per lo script)La ricerca è facile! Prova a combinare più paroleCerca...Self ServiceSelf Service - Registrazione HostSelf Service APISelf Service API - Impostazioni GlobaliLe impostazioni del Self Service sono state memorizzateInvia notificheInvia aServizioApply rules del servizioGruppo di servizioGruppi di servizioSet di serviziIl set di servizi è stato rimossoSet di serviziTemplate di serviziScelta del template di servizioTemplates di servizioUtente del servizioConfigurazioni ServizioGruppi di servizioGruppi di servizi che dovrebbero essere assegnati direttamente a questo servizio. I gruppi di servizio possono essere utili per vari motivi. Sono utili per fornire una vista specifica del tipo di servizio in Icinga Web 2, sia dashboard personalizzate che come strumento per far rispettare le restrizioni. I gruppi di servizi possono essere assegnati direttamente a singoli servizi o a template di servizioNome del servizioProprietà del servizioSet di serviziNome del set di serviziService-SetsScelta del template di servizioScelta del template di servizioSetServiziGruppo di servizioNome del servizioServiziServizi in questo set: %sServizi su %sServizi: %sService-SetImposta MembriImpostazione basata sul filtroImposta falsoImposta nessun valore (null)Imposta nullImporta veroSetL'impostazione di un endpoint di comando consente di forzare l'esecuzione dei controlli dell'host da parte di uno specifico endpoint. Si prega di studiare attentamente la relativa documentazione di Icinga prima di utilizzare questa funzioneLe impostazioni sono state memorizzateCondividi questo template di API per il Self ServiceAPI condivisa per il Self ServiceTutti gli altri caratteri devono essere in lettere minuscole?MostraMostra BasketMostra Issue %s su GitHubMostra SQLMostra gli oggetti interessatiMostra le opzioni disponibiliMostra in base al filtroMostra i dettagli relativi a questo cambiamentoMostra normaleMostra risoltoMostra righe %u da %u a %uMostra non filtratoRicerca semplice con caratteri jolly (*)Diffusione a singolo oggettoServizi singoliDimensioneTasto SaltaSnapshotSnapshotsQualcosa come https://api.example.com/rest/v2/objectsColonna SorgenteEspressione SorgenteNome sorgentePercorso SorgenteTipo SorgenteColonne SorgentiCampo SorgenteNome SorgenteProprietá specialiElementi Specifici (per posizione)Nome StageOra di inizioAvvioAvvio LogInizio TempoStatoFiltri di stato e di transizioneCambiamenti di statoStatiStatisticheStatiSospendi la condivisione del templateSalvaSalva configurazioneSevero, solo valori di listaStringaRimuovere questo operatore, preservare i nodi figlioInvia aSuccessoCampi suggeritiPassa alla vista TabellaPassa alla vista ad alberoSincronizza "%s": "%s" Proprietà di sincronizzazioneRegole di sincronizzazioneStoria della sincronizzazioneSincronizzare solo una parte degli oggetti importati con questa regola. La sintassi del filtro Icinga Web 2 è consentita, quindi potrebbe apparire come segue: %sProprietà di sincronizzazioneRegola di sincronizzazioneRegola di sincronizzazione: %sDettagli di sincronizzazioneSincronizzazione fallitaRegola di sincronizzazioneSincronizzareTabellaDestinatario DBDestinatario HostTarget Set ServizioTipo di dati di destinazioneProprietà obiettivoTemplateNome templateNome templateAlbero dei templateTempalte: %sGrazie, lo verificherò e tornerò più tardiIl lavoro "Importa" consente di eseguire azioni di importazione a intervalli regolariIl lavoro "Sync" permette di eseguire azioni di sincronizzazione a intervalli regolariIl %s è stato memorizzato con successoIl lavoro "Configurazione" permette di creare ed eventualmente di lanciare la configurazione di Icinga 2L'indirizzo e-mail dell'utente.Il lavoro di pulizia offre diverse azioni che mantengono il database del Director veloce e pulitoIl demone dell'Icinga Director non è in funzione. Si prega di controllare le nostre %s nel caso in cui abbiate bisogno di istruzioni passo dopo passo che vi mostrino come risolvere il problema.L'API Self Service Director di Icinga consente ai vostri Ospiti di registrarsi. Questo permette loro di configurare, installare e aggiornare il loro agente Icinga in modo automatico.Il nome del pacchetto Icinga che Director utilizza per distribuire la sua configurazione. Questo valore predefinito è "director" e non dovrebbe essere cambiato a meno che non si sappia davvero cosa si sta facendoLe proprietà LDAP che dovrebbero essere recuperate. Questo deve essere un elenco separato da virgole come: "cn, dnshostname, sistema operativo, sAMAccountName"La chiave API del Self Service per %s è stata abbandonataIl set di servizi "%s" è stato aggiunto a %d hostL'argomento %s è stato memorizzato con successoL'etichetta da visualizzareLa didascalia che dovrebbe essere visualizzata agli utenti quando viene mostrato questo campoL'Host figlio.Il comando che Icinga dovrebbe eseguire. I percorsi assoluti saranno presi come specificato, i percorsi relativi saranno preceduti dal prefisso "PluginDir +", con costanti simili consentite come prefisso. Gli spazi possono essere usati per dividere il percorso del comando e gli argomenti a sé stanti. Ciò significa che attualmente non sono supportati spazi nei nomi e nei percorsi dei plugin.La password corrispondenteIl nome a dominio da rimuovereLa prima NC (più a sinistra)Il primo (più a sinistra) OULe proprietà trasferite sono state salvate per "%s"Gli stati host/servizio per i quali devono essere inviate le notificheL'ultimo (più a destra) OUL'ultimo tentativo è fallito %s: %sL'ultimo tentativo è riuscito %sL'ultimo rollout non ha avuto successoIl rollout della configurazione è in corsoIl tempo di durata del log.Il nome del periodo di tempo che specifica quando le notifiche devono essere attivate per questo utente. Nessun valore predefinito.Il nome del periodo di tempo che specifica quando questa notifica deve essere attivata. Nessun valore predefinito.Il nome del periodo di tempo che specifica quando questo oggetto viene monitorato. Non limitato per impostazione predefinita.Il nome del periodo di tempo entro il quale questo lavoro dovrebbe essere attivo. Permette solo periodi di tempo semplici (giorno della settimana e registrazioni multiple)Il nome degli hostsIl nome del servizioL'intervallo di notifica (in secondi). Questo intervallo viene utilizzato per le notifiche attive. Il valore predefinito è 30 minuti. Se è impostato a 0, le ripetizioni di notifica sono disattivate.La bitmaschera numerica da applicare. Le maschere esadecimali e binarie devono prima essere convertite in un numero decimale. Il risultato è un valore booleano che indica se la maschera si applica al valore numerico nella colonna sorgenteL'indirizzo del cercapersone dell'utente.L'host parente.L'host genitore. Proprietà host personalizzate possono essere referenziate tramite $host.vars.varname$ La porta da utilizzare. Se non è impostato alcun valore, si applica il valore predefinito 5665La proprietà che vogliamo estrarre dalla linea che abbiamo trovato nella fonte di importazione selezionataIl servizio "%s" è stato aggiunto a %d HostsIl set di servizi da assegnareIl set di servizi da assegnare a questo hostI tipi di cambiamenti di stato per i quali devono essere inviate le notificheLa stringa di caratteri da utilizzare in sostituzioneLa stringa di caratteri da cercareLa stringa / pattern da cercare. A seconda del metodo selezionato, utilizzare www.* o *linux* per ricerche basate su caratteri jolly ed espressioni come /^www\d+\/ se si preferiscono le espressioni regolariIl nome unico del campoL'identificatore unico di questo campo. Questo è usato come nome della proprietà personalizzata nella configurazione resa da Icinga.L'account utente sotto il quale il servizio Icinga 2 funzionerà su Windows.Ci sono oggetti %d con una proprietà corrispondente. Il valore di "%s" deve essere rimosso da tutti?Ci sono oggetti %d con una proprietà corrispondente. La variabile "%s" deve essere rinominata in "%s" su tutti?Ci sono variazioni %d non ancora attuateCi sono %d modifiche pendenti, di cui %d sono applicate a questo oggettoCi sono %d migrazioni di database in sospesoNon sono disponibili campi dati. Un amministratore può crearne alcuniNon ci sono cambiamenti in sospesoNon ci sono cambiamenti in sospeso. Distrubuisci in ogni casoCi sono modifiche in sospeso per questa fonte di importazione. Dovrebbe essere attivata una nuova operazione di importazione.Ci sono modifiche in sospeso per questa regola di sincronizzazione. Dovrebbe essere attivata una nuova corsa di sincronizzazione.Le migrazioni del database sono in corsoLe migrazioni del database sono in corsoCi sono state %d modifiche a questo oggetto, non è stato modificato nient'altroC'è un unico cambiamento in sospesoQuesti sono diversi tipi di lavoro disponibiliSi tratta di diversi fornitori di dati che raccolgono dati da varie fonti. Non avete trovato quello che cercate? Le fonti di importazione sono implementate come un gancio in Director, quindi potresti trovare (o scrivere il tuo) modulo Icinga Web 2 che recupera dati da qualsiasi luogo tu vogliaQuesto comando è attualmente utilizzato da %sQuesto comando non è attualmente utilizzatoQuesto comando è usato da %d altri oggettiQuesta fonte di importazione non è riuscita in %s durante l'ultimo controllo: %sQuesta fonte di importazione ha uno stato non valido: %sQuesta fonte di importazione fornisce dati modificatiQuesta fonte di importazione è stata trovata per l'ultima volta in sincronizzazione il %s.Questo servizio è stato messo nella lista nera di questo hostQuesta regola di sincronizzazione non è riuscita il %s durante l'ultimo controllo: %sQuesta regola di sincronizzazione non è mai stata eseguita prima.Questa regola di sincronizzazione è sincronizzata e non causerebbe attualmente alcun cambiamentoQuesta regola di sincronizzazione è stata sincronizzata l'ultima volta il %s.Permette il filtraggio di parti specifiche all'interno dell'espressione della sorgente specificata. Tutte le colonne importate possono essere specificate. Esempi: host=wwww* imposterebbe questa proprietà solo per le linee importate dove la proprietà host inizia con "www". Esempio complesso: host=wwwww*&!(indirizzo=127.*|indirizzo6=::1)Questo permette di visualizzare un menu a tendina o un campo con completamento automaticoConsente di disattivare temporaneamente questo lavoroQuesto permette di configurare un filtro di assegnazione. Sentitevi liberi di combinare tutti gli operatori annidati che voleteQuesto permette di definire un filtro di assegnazione (assign). Un numero qualsiasi di operatori può essere annidato a qualsiasi profondità. L'operatore "contiene" è consentito solo per gli array. Per confrontare le sottostringhe si prega di utilizzare i caratteri jolly, come in *.example.comQuesto permette di definire un filtro di assegnazione (assign). Un numero qualsiasi di operatori può essere annidato a qualsiasi profondità. Questo passo può anche essere saltato ed eventualmente implementato in un secondo momento. In alternativa (o in aggiunta) questo set di servizi può essere assegnato direttamente ai singoli host. L'operatore "contiene" è consentito solo per gli array. Per confrontare le sottostringhe si prega di utilizzare i caratteri jolly, come in *.example.comQuesto permette il rollout immediato di una configurazione modificataPermette di modificare le proprietà di "%s"Questo consente di modificare le proprietà per tutti gli host selezionati in una sola voltaQuesto basket è vuotoQuesta feature è ancora sperimentaleQuesto deve essere un database MySQL o PostgreSQLQuesto host è stato registrato utilizzando l'API self-service di Icinga Director. Se l'host è stato reinstallato o la chiave è stata smarrita, è possibile che si desideri eliminare la chiave corrente. Questo permetterebbe di ri-registrare lo stesso ospite.Questo è un oggetto esterno. È stato creato da Icinga 2 attraverso l'API di base e non può essere gestito con il Director di Icinga.È comunque perfettamente valido creare oggetti utilizzando o facendo riferimento a questo oggetto. È anche possibile creare campi correlati per facilitare il lavoro.Questo è il template "%s" %s. Sulla base di questo, è possibile:Questo è il nome dell'oggetto Endpoint (e il nome del certificato) che avete creato per il vostro oggetto ApiListener. Nel caso non siate sicuri di cosa questo significhi, assicuratevi di leggere prima la documentazioneQui si aggiungono tutti i vostri server, contenitori, dispositivi di rete o sensori - e molto altro ancora. Ogni soggetto che vale la pena di essere monitoratoQui è dove si gestiscono i controlli degli host di Icinga 2. I template di host sono i vostri principali elementi costitutivi. Puoi raggrupparli in "scelte", permettendo (o obbligando) i tuoi utenti a scegliere tra un dato set di template preconfigurati.Qui è dove si gestiscono i controlli di servizio di Icinga 2. I Service Template sono i vostri blocchi di base, i Service Set vi permettono di assegnare più Servizi contemporaneamente. Le Regole di applicazione consentono di assegnare i Servizi in base alle proprietà Host. E l'elenco di tutti i singoli Oggetti di Servizio ti dà la possibilità di modificare (o cancellare) molti di essi contemporaneamente.Qui si gestiscono gli oggetti di Icinga 2 User (Contact). Cercate di mantenere i vostri oggetti User semplici spostando la complessità nei templates. Raggruppate gli utenti in gruppi e configurate le Notifiche in base ad essi. Cercate di utilizzare MS Active Directory o un altro database utente centralizzato? Consigliamo di evitare le configurazioni manuali, e di utilizzare regole di importazione e sincronizzazione create per automatizzare la procedura.Qui è dove si gestisce l'infrastruttura di Icinga 2. Quando si aggiunge un nuovo Icinga Master o Satellite, si prega di eseguire nuovamente il Kickstart Helper. Creare Zone o Endpoint manualmente, il più delle volte si rivela la scelta sbagliata portando ad un vicolo cieco che costringe l'utente a ripulire il sistema dalle modifiche apportate.Questo è il vostro Config master e riceverà le nostre distribuzioniQuesto lavoro non è stato ancora eseguitoQuesto lavoro viene eseguito ogni %ds ed è attualmente in sospesoQuesto lavoro viene eseguito ogni %ds.Questo lavoro verrebbe eseguito ogni %ds. È stato disattivato e quindi non verrà eseguito come previstoQuesto modificatore trasforma 0/"0"0"/falso/"falso"/"n"/"no" in falso e 1, "1", vero, "vero", "y" e "sì" in vero, in entramnbi i casi senza distinzione tra maiuscole e minuscole. Cosa dovrebbe succedere se il valore dato non corrispondesse a nessuno di questi? Si potrebbe restituire un valore nullo, o fissare il valore di default a vero o a falso. Si potrebbe anche considerare di interrompere l'intero processo di importazione, in quanto i dati della sorgente non sarebbero da considerarsi validiQuesta colonna deve contenere valori unici, come gli hostname. Se non diversamente specificato, questo sarà usato come nome oggetto per la sincronizzazione dell'oggetto Icinga. Soprattutto quando si inizia a lavorare con il Director, assicurarsi di seguire rigorosamente questa regola. Creare dei valori duplicati in righe diverse di questa colonna porterà ad un errore che nel processo di importazione. Si prega di prestare attenzione quando si sincronizzano i servizi, poiché "purge" funzionerà correttamente solo con una chiave colonna corrispondente al nome host!name. Controllate il modificatore di proprietà "Combine" nel caso in cui la vostra fonte di dati non sia in grado di fornire tale campoQuesta deve essere una colonna di fonte di importazione (proprietà)Questo nome si presenterà come l'autore per il commento sempre relativo ai tempi di inattivitàQuesto oggetto è stato disabilitatoQuesto oggetto è stato abilitatoQuesto oggetto non verrà distribuito in quanto è stato disabilitatoQuesto pattern sarà esaminato e le variabili come ${qualche_colonna} saranno sostituite di conseguenza. Un tipico caso d'uso è la generazione di identificatori di servizio unici tramite ${host}!${servizio} nel caso in cui la vostra fonte di dati non vi permetta di spedirli. La "proprietà" scelta non ha alcun effetto in questo caso e sarà ignorata.Questo richiede che l'agente Icinga sia installato. Esso genera e firma il suo certificato e crea una configurazione minimale icinga2.conf per far sì che l'agente sia collegato al suo corrispondente elemento padre.Questo servizio appartiene al set di servizi %s. Tuttavia, potreste voler sovrascrivere le seguenti proprietà solo per questo host.Questo servizio appartiene al set "%s". Tuttavia, le seguenti proprietà possono essere modificate solo per questo specifico host.Questo servizio è stato creato da un automatismo, ma permette comunque di sovrascrivere le seguenti proprietà in modo sicuro.Questo servizio è stato creato dalla apply rule %s, e viene assegnato dove %sQuesto servizio è stato ereditato da %s. Tuttavia, potreste voler cambiare le seguenti proprietà solo per questo host.Questo set è stato ereditato da %sQuesto sincronizza il Director Icinga con la vostra infrastruttura di Icinga 2. In caso di modifiche all'infrastruttura, eseguire una nuova sincronizzazione Questo template non è in usoQuesto template è ancora in uso da %d altri oggettiQuesto sarà mostrato come etichetta per la scelta dataQuesta sarà la didascalia visibile per questa voceTicketTempoPeriodo di tempoPeriodi di tempoPeriodo temporaleFasce nel periodo temporaleL'intervallo di tempo "%s" è stato eliminato da %sIntervalli temporaliTimeoutPeriodoTemplates per periodo temporalePeriodoTemplate del periodoNome del template del periodoPeriodi di tempoPeriodi di tempoData e oraPer garantire che i pacchetti scaricati siano compilati dal Team di Icinga e non siano compromessi da terze parti, si potrà fornire un array di hash SHA1 qui. Nel caso abbiate definito degli hash, il modulo non continuerà con l'aggiornamento / installazione dell'agente nel caso in cui l'hash SHA1 del pacchetto MSI scaricato non corrisponda ad uno degli hash forniti di questa impostazioneTop DownTotaleTrasformare Nome HostTrasformare in minuscolaTrasformare in maiuscolaTipi di transizioneAlberoAttivare l'importazioneAttivare questa sincronizzazioneL'avvio di questa fonte di importazione non è riuscitoModificare alcune impostazioni globali del DirectorTipoTipo attributiComponente URLImpossibile rilevare la versione Core di Icinga 2Impossibile recuperare i dati: %sImpossibile memorizzare un host con le proprietà date a causa di autorizzazioni insufficientiImpossibile salvare la configuraazione a "%s"Impossibile memorizzare la configurazione in "%s". Si prega di controllare i permessi dei file o di memorizzare manualmente il contenuto mostrato qui sottoConfigurazioni non distribuiteSconosciutoSconosciuto, non ha raccolto informazioni correlateSconosciuto, ancora in attesa dell'esito del controllo della configurazioneProprietà importate non collegateSet di file importate non collegateRighe importate non collegateLe dipendenze non sono soddisfatteAlcuni file generati non sono in usoSuMetodo di aggiornamentoPolitica di aggiornamentoAggiornamento di Icinga 2 - Confic Sync: Zone in zoneAggiornamento della documentazioneCaricaCarica un BasketCaricare una configurazione Basket UtilizzoUtilizzo (%s)Utilizzare una directory locale o una condivisione di reteConvertire solo in minuscoleFonti utilizzateUtenteGruppo utentiGruppi utentiTemplates utenteGruppi utentiGruppi di utenti che dovrebbero essere assegnati direttamente a questo utente. I gruppi possono essere utilizzati per diversi scopi. Potrebbe essere utile inviare le notifiche a gruppi invece che a singoli utentiGruppi di utenti che devono essere notificatiProprietà dell'utenteNome del template utenteGruppo utenteGruppi utenteNome utenteUtentiUtenti / ContattiUtenti che devono essere notificatiUtilizzando le Regole di applicazione, un servizio può essere applicato a più host contemporaneamente sulla base di filtri che trattano qualsiasi combinazione delle loro proprietàL'indirizzo IPv6 principale del vostro hostValoreTipo valoreValore VariabileNome VariabileVerifica HostVerifica PeerVisibilitàVisibileVolatileATTENZIONE, questo può consentire l'iniezione di script via shell tramite variabili personalizzate utilizzate nel commando.Volete impostare l'esecuzione di controlli specifici solo in sepcifici periodi di tempo? Ricevere notifiche sul cellulare solo fuori dall'orario d'ufficio, ma notifiche via e-mail 24 ore su 24? I Periodi di temporali consentono di soddisfare questi e requisiti simili.AttenzioneAttenzione: state utilizzando Icinga v2.11.0 ed è possibile che riscontriate il problema %s. Stiamo già lavorando ad una soluzione. Per maggiori dettaglifate riferimento a GitHub e al nostro %s.Che tipo di oggetto dovrebbe essere. I templates consentono l'accesso completo a qualsiasi proprietà, sono i vostri elementi costitutivi per gli oggetti "reali". Gli oggetti esterni di solito non dovrebbero essere creati o modificati manualmente. Permettono di lavorare con oggetti definiti localmente sui nodi di Icinga, senza renderli e distribuirli con il Direttore. Le regole di applicazione permettono di assegnare servizi, notifiche e gruppi ad altri oggetti.Cosa potrebbe succedere se la chiave di ricerca non esistesse nella lista data? Si potrebbe restituire un valore nullo, mantenere il valore importato non modificato o interrompere il processo di importazioneCosa dovrebbe accadere quando la stringa data fosse vuota?Cosa dovrebbe succedere se l'array risultante fosse vuoto?Cosa deve succedere se l'articolo specificato non fosse disponibile?Cosa dovrebbe accadere con gli elementi selezionati?Cosa dovrebbe succedere alla riga se l'espressione data corrispondesse a questa proprietà?Cosa dovrebbe succedere se la risoluzione (DNS) fallisse?Cosa si deve fare se l'URL non potesse essere analizzato o se non fosse possibile trovarne i componenti?Cosa dovrebbe succedere se la parte desiderata non esistesse?Cosa dobbiamo fare se la ricerca dell'host (DNS) non riuscisse?Cosa dovrebbe succedere se la stringa passata non potesse essere decodificata?Cosa dobbiamo estrarre dal DN?Cosa dobbiamo mettere in questo Basket ogni volta che creiamo un nuovo snapshot?Durante la distribuzione della configurazione, attendere almeno qualche secondo a meno che non si debba procedere con la successiva distribuzione Quando non disponibileSe i tempi di inattività devono essere esplicitamente programmati anche per tutti i servizi appartenenti agli host interessatiSe tutti i lavori configurati devono essere disattivatiSe il riconoscimento dei flap è abilitato su questo oggettoSe l'attivazione debba essere forzata. Se non è forzata, la configurazione viene attivata solo se le attività sono state eseguite dopo l'ultima attivazioneIl valore dell'argomento è una stringa (permette macro come $host$) o una funzione lambda di Icinga DSL? (è scritto in {{ ... }}}Il campo deve essere unito, sostituito o ignorato?Se il nome del parametro deve essere passato al comando. Non è necessario impostare questo parametro su "No", in quanto per default il nome del parametro viene aggiunto (ad es. -H).Il parametro set_if è una stringa (permette macro come $host$) o una funzione lambda di Icinga DSL? (è scritto in {{ ... }}}Se questa dipendenza deve interessare gli host o i serviziSia che si tratti di tempi di fermo macchina fissi o flessibili. In caso di dubbi si prega di consultare la relativa documentazione: https://icinga.com/docs/icinga2/latest/doc/08-advanced-topics/#downtimesSe questa notifica deve riguardare gli host o i serviziSe questo parametro deve essere ripetuto se vengono specificati più valori (in un array)È un template?Questa zona deve essere disponibile ovunque? Si noti che questa configurazione raramente porta il risultato desiderato quando si cerca di distribuire zone globali in ambienti distribuitiSe modificare il nome dell'hostSe disabilitare i controlli quando questa dipendenza fallisce. Le impostazioni predefinite sono false.Se disabilitare le notifiche quando questa dipendenza fallisce. Default é sí.Se gli stati soft debbano essere considerati per il calcolo dell'accessibilità. Default é sí.Se preferire i periodi di tempo include o esclude. Default é sí.Se eliminare gli oggetti esistenti. Ciò significa che gli oggetti dello stesso tipo saranno rimossi dal Director nel caso in cui non esistano più sulla fonte di importazione.Se utilizzare la crittografia quando si utilizzano le REST APISe dobbiamo controllare che il certificato del nostro peer sia stato firmato da una CA di fiducia. Scelta raccomandato.Se dobbiamo controllare che il certificato corrisponda all'host configuratoIl campo di destinazione deve essere unito o sostituito? Non fa differenza per le stringhe di caratteriSarà memorizzato come valore di variabile personalizzata quando questa voce viene scelta dalla listaVerrà utilizzato per l'autenticazione SOAP contro il vCenterWindows Kickstart ScriptPulire le variabili correlateCon serviziQui potete vedere cosa è stato cambiato. Tieni traccia dei tuoi cambiamenti!Inserire questa espressione in un operatoreSÃŒ, cancellare "%s".Sí È possibile creare Basket snapshot in qualsiasi momento, in questo modo persisterà una rappresentazione serializzata di tutti gli oggetti coinvolti in quel momento nel tempo. Gli snapshot possono essere esportati, importati, condivisi e ripristinati - nella stessa o in un'altra istanza del Director.La condivisione di un Template puo' essere sospesa in qualsiasi momento. Questo invaliderà immediatamente la precedente chiave.Eventuali modifiche potrebbero venire immediatamente applicate o l'utente potrebbe essere avvisato dei cambiamenti. Definire un processo ha senso anche nel caso in cui non si desideri applicare immediatamente le modifiche. L'utente sarà informato dei cambiamenti effettuati nella GUI del Director.Si consiglia di lasciare che lo script Powershell generato installi l'agente Icinga 2 in modo automatico. Se è così, scegliete dove i vostri nodi di Windows devono andare a prendere il programma di installazione dell'AgentSi consiglia di mostrare questo campo solo quando sono soddisfatte determinate condizioni. Se queste condizioni non sono soddisfatte, il campo non verrà visualizzato e le proprietà associate verranno rimosse quando il campo verrà salvatoPotreste voler scrivere il valore modificato su un'altra (nuova) proprietà. Il nome di questa proprietà può essere definito qui, la proprietà originale rimane invariata. Si prega di lasciare il campo vuoto nel caso in cui si voglia modificare il valore di una specifica proprietàÈ necessario definire alcuni %s prima di poter eseguire questa regola di sincronizzazioneIcinga 2 API usernameLa vostra base di ricerca LDAP. Spesso qualcosa come OU=Utenti,OU=HQ,DC=tuo,DC=azienda,DC=dettaglioLa vostra configurazione sembra buona. Tuttavia, si potrebbe voler eseguire nuovamente questa procedura guidata di kickstart per (re)importare le definizioni dei comandi modificate o nuove definite manualmente o per ottenere nuovi comandi ITL dopo un aggiornamento di Icinga 2 Core.Il vostro regolare intervallo di controlloLa stringa da sostituireI vostri utenti potranno scegliere tra questi templatesNome (template) ZonaNome della zonaImpostazioni ZonaZoneun elencotuttoindietroper proprietà del gruppo hostComando Checkclicca quicriticoschema databasedisattivatodocumentazionegiùper es.ad es. -H o --hostname, vuoto significa "skip_key".ad es. 5%, $host.name$, $lower$%:$upper$%Raccolta fallitaquihost var namehost var valuemancantemodificatoaltronuovononon esiste un gruppo collegatooksu hostsul set di servizioesiste un gruppo collegatoin attesarestituisce NULLrestituisce un array vuotosservice var nameservice var valoreinizia ad utilizzareNome sul displaymetodo di aggiornamentoad un gruppo hostinvariatosconoscutoirraggiungibilenon supportatoinutilizzatosuusatoformato valoreviaAttenzionesíicingaweb2-module-director-1.11.8/application/locale/it_IT/LC_MESSAGES/director.po000066400000000000000000007605261516513262500274500ustar00rootroot00000000000000# Icinga Web 2 - Head for multiple monitoring backends. # Copyright (C) 2020 Icinga Development Team # This file is distributed under the same license as Director Module. # Thomas Widhalm , 2016. # msgid "" msgstr "" "Project-Id-Version: Director Module (master)\n" "Report-Msgid-Bugs-To: dev@icinga.com\n" "POT-Creation-Date: 2020-02-11 10:27+0000\n" "PO-Revision-Date: 2019-09-25 14:01+0200\n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Basepath: .\n" "Language-Team: \n" "X-Generator: Poedit 2.0.6\n" "X-Poedit-SearchPath-0: .\n" #: library/Director/Web/Form/DirectorObjectForm.php:613 #, php-format msgid " (inherited from \"%s\")" msgstr " (ereditato da \"%s\")" #: library/Director/Web/Table/TemplatesTable.php:63 msgid " - not in use -" msgstr " - non utilizzato -" #: library/Director/Web/Table/DatafieldTable.php:49 msgid "# Used" msgstr "# in uso" #: library/Director/Web/Table/DatafieldTable.php:50 msgid "# Vars" msgstr "# Vars" #: library/Director/Web/Table/CustomvarTable.php:29 #, php-format msgid "%d / %d" msgstr "%d / %d" #: library/Director/Resolver/CommandUsage.php:51 #, php-format msgid "%d Host Template(s)" msgstr "%d Host-Template" #: library/Director/Resolver/CommandUsage.php:50 #, php-format msgid "%d Host(s)" msgstr "%d Host(s)" #: library/Director/Resolver/CommandUsage.php:61 #, php-format msgid "%d Notification Apply Rule(s)" msgstr "%d Regole-Apply-Notifica" #: library/Director/Resolver/CommandUsage.php:60 #, php-format msgid "%d Notification Template(s)" msgstr "%d template di notifica" #: library/Director/Resolver/CommandUsage.php:59 #, php-format msgid "%d Notification(s)" msgstr "%d Notifiche" #: library/Director/Resolver/CommandUsage.php:56 #, php-format msgid "%d Service Apply Rule(s)" msgstr "%d Regole Service Apply" #: library/Director/Resolver/CommandUsage.php:55 #, php-format msgid "%d Service Template(s)" msgstr "%d Service-Template(n)" #: library/Director/Resolver/CommandUsage.php:54 #, php-format msgid "%d Service(s)" msgstr "%d Service(s)" #: library/Director/Dashboard/Dashlet/Dashlet.php:231 #, php-format msgid "%d apply rules have been defined" msgstr "%d Sono definite regole di Apply" #: library/Director/Web/Table/SyncRunTable.php:46 #, php-format msgid "%d created" msgstr "%d creato" #: library/Director/Web/Table/SyncRunTable.php:58 #, php-format msgid "%d deleted" msgstr "%d cancellato" #: library/Director/Web/Widget/DeploymentInfo.php:110 #, php-format msgid "%d files" msgstr "%d files" #: library/Director/Web/Widget/DeployedConfigInfoHeader.php:83 #, php-format msgid "%d files rendered in %0.2fs" msgstr "%d file creati in %0.2fs" #: library/Director/Dashboard/Dashlet/Dashlet.php:273 #, php-format msgid "%d have been externally defined and will not be deployed" msgstr "%d sono stati creati all'esterno e non vengono distribuiti" #: library/Director/Web/Table/SyncRunTable.php:52 #, php-format msgid "%d modified" msgstr "%d modificato" #: application/controllers/SyncruleController.php:273 #, php-format msgid "%d object(s) will be created" msgstr "creati %d oggetti" #: application/controllers/SyncruleController.php:254 #, php-format msgid "%d object(s) will be deleted" msgstr "%d oggetti verranno cancellati" #: application/controllers/SyncruleController.php:263 #, php-format msgid "%d object(s) will be modified" msgstr "%d oggetti verranno modificati" #: application/controllers/InspectController.php:78 #, php-format msgid "%d objects found" msgstr "%d oggetti trovati" #: library/Director/Dashboard/Dashlet/Dashlet.php:256 #, php-format msgid "%d objects have been defined" msgstr "%d oggetti sono stati definiti" #: application/forms/IcingaMultiEditForm.php:93 #, php-format msgid "%d objects have been modified" msgstr "%d oggetti sono stati modificati" #: library/Director/Web/Widget/DeploymentInfo.php:119 #, php-format msgid "%d objects, %d templates, %d apply rules" msgstr "%d oggetti, %d template, %d regole-Apply" #: library/Director/Dashboard/Dashlet/Dashlet.php:265 #, php-format msgid "%d of them are templates" msgstr "%d di questi sono template" #: library/Director/Dashboard/Dashlet/Dashlet.php:213 #, php-format msgid "%d templates have been defined" msgstr "%d template sono stati definiti" #: library/Director/Web/Widget/ActivityLogInfo.php:604 #, php-format msgid "%s \"%s\" has been created" msgstr "%s \"%s\" é stato creato" #: library/Director/Web/Widget/ActivityLogInfo.php:607 #, php-format msgid "%s \"%s\" has been deleted" msgstr "%s \"%s\" é stato cancellato" #: application/forms/IcingaImportObjectForm.php:36 #, php-format msgid "%s \"%s\" has been imported\"" msgstr "%s \"%s\" é stato importato\"" #: library/Director/Web/Widget/ActivityLogInfo.php:610 #, php-format msgid "%s \"%s\" has been modified" msgstr "%s \"%s\" é stato modificato" #: library/Director/Web/Table/IcingaHostAppliedServicesTable.php:107 #, php-format msgid "%s %s(%s)" msgstr "%s %s(%s)" #: library/Director/Web/Table/ObjectSetTable.php:57 #, php-format msgid "%s (%d members)" msgstr "%s (%d membri)" #: application/controllers/HostController.php:178 #: application/controllers/HostController.php:262 #, php-format msgid "%s (Applied Service set)" msgstr "%s (Service-Set associati)" #: application/controllers/HostController.php:312 #, php-format msgid "%s (Service set)" msgstr "%s (Service-Set)" #: application/forms/SelfServiceSettingsForm.php:243 #: application/forms/SettingsForm.php:177 #, php-format msgid "%s (default)" msgstr "%s (default)" #: library/Director/Web/Controller/TemplateController.php:71 #, php-format msgid "%s Templates" msgstr "%s Template" #: library/Director/Web/Controller/TemplateController.php:36 #, php-format msgid "%s based on %s" msgstr "%s basato su %s" #: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:112 #, php-format msgid "%s config changes happend since the last deployed configuration" msgstr "" "%s cambimenti di configurazione dopo l'ultima distribuzione di configurazioni" #: application/forms/IcingaServiceForm.php:256 #, php-format msgid "%s has been blacklisted on %s" msgstr "%s é stato messo in blacklist %s" #: application/forms/IcingaServiceForm.php:292 #, php-format msgid "%s is no longer blacklisted on %s" msgstr "%s non é più nella lista di blacklist %s" #: library/Director/Web/Widget/SyncRunDetails.php:48 #, php-format msgid "%s objects have been modified" msgstr "%s oggetti sono stati cambiati" #: application/controllers/HostController.php:460 #, php-format msgid "%s on %s (from set: %s)" msgstr "%s auf %s (da questo set \"%s\")" #: library/Director/Dashboard/Dashlet/Dashlet.php:288 #, php-format msgid "%s related group objects have been created" msgstr "sono stati creati %s oggetti di gruppo associati" #: library/Director/Web/Controller/TemplateController.php:74 #, php-format msgid "%s templates based on %s" msgstr "%s template basati su %s" #: library/Director/Web/Widget/HealthCheckPluginOutput.php:46 #, php-format msgid "%s: %d" msgstr "%s: %d" #: application/controllers/BasketController.php:193 #, php-format msgid "%s: %s (Snapshot)" msgstr "%s: %s (Snapshot)" #: application/controllers/ImportsourceController.php:224 #, php-format msgid "%s: Property Modifier" msgstr "%s: modificatore di proprietá" #: application/controllers/BasketController.php:144 #, php-format msgid "%s: Snapshots" msgstr "%s: Snapshots" #: application/controllers/ImportsourceController.php:198 #, php-format msgid "%s: add Property Modifier" msgstr "%s: aggiunta di modificatore di proprietá" #: library/Director/Db/Housekeeping.php:54 msgid "(Host) group resolve cache" msgstr "cache di risoluzione gruppo (Hosts)" #: application/controllers/ServiceController.php:169 #, php-format msgid "(on %s)" msgstr "(su %s)" #: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:234 msgid "- add more -" msgstr "- aggiungere altro -" #: library/Director/Web/Form/DirectorObjectForm.php:1065 msgid "- click to add more -" msgstr "- premi per aggiungere altro -" #: library/Director/Web/Form/DirectorObjectForm.php:622 msgid "- inherited -" msgstr "- eereditato -" #: application/forms/SelfServiceSettingsForm.php:66 msgid "- no automatic installation -" msgstr "- nessuna installazione automatica -" #: application/views/helpers/FormDataFilter.php:465 #: application/controllers/ConfigController.php:363 #: application/controllers/ConfigController.php:374 #: application/forms/SelfServiceSettingsForm.php:239 #: application/forms/SettingsForm.php:181 #: library/Director/Web/Form/QuickBaseForm.php:120 #: library/Director/DataType/DataTypeDirectorObject.php:43 #: library/Director/DataType/DataTypeSqlQuery.php:37 #: library/Director/Job/ImportJob.php:118 #: library/Director/Job/SyncJob.php:124 msgid "- please choose -" msgstr "- prego scegliere -" #: application/controllers/SyncruleController.php:375 #, php-format msgid "...and %d more" msgstr "...e %d altro" #: application/controllers/BasketsController.php:34 msgid "" "A Configuration Basket references specific Configuration Objects or all " "objects of a specific type. It has been designed to share Templates, Import/" "Sync strategies and other base Configuration Objects. It is not a tool to " "operate with single Hosts or Services." msgstr "" "Un basket di configurazione si riferisce ad elementi di configurazione o tutti " "gli oggetti di un particolare tipo. É stato sviluppato per condividere Template, " "strategie di Import/Sync e altri elementi base di configurazione. " "Questo non é uno strumento per configurare singoli Host o Services" #: library/Director/Import/ImportSourceLdap.php:61 msgid "" "A custom LDAP filter to use in addition to the object class. This allows for " "a lot of flexibility but requires LDAP filter skills. Simple filters might " "look as follows: operatingsystem=*server*" msgstr "" "Un filtro LDAP aggiuntivo da usare insieme alla classe dell'oggetto. " "Questo permette una grande flessibilitá ma necessita di conoscenze " "profonde sui filtri LDAP. Filtri semplici possono essere di questo tipo: " "operatingsystem=*server*" #: application/forms/SyncPropertyForm.php:214 msgid "" "A custom string. Might contain source columns, please use placeholders of " "the form ${columnName} in such case. Structured data sources can be " "referenced as ${columnName.sub.key}" msgstr "" "Una stringa personalizzata. Se sono presenti colonne sorgenti, devono " "venir usati segnaposti nella forma di ${columnName}. È possibile fare " "riferimento a dati strutturati tramite ${columnName.sub.key" #: application/forms/IcingaObjectFieldForm.php:134 msgid "A description about the field" msgstr "Una descrizione del campo" #: application/forms/IcingaTemplateChoiceForm.php:59 msgid "A detailled description explaining what this choice is all about" msgstr "Una descrizione dettagliata sull'obiettivo di questa selezione" #: application/forms/IcingaServiceSetForm.php:102 msgid "" "A meaningful description explaining your users what to expect when assigning " "this set of services" msgstr "" "Una descrizione significativa che spiega agli utenti cosa aspettarsi " "dall'assegnazione di questo service set" # Geschlecht kann hier leider nicht bestimmt werden -ThW #: application/forms/IcingaTimePeriodRangeForm.php:85 #: application/forms/IcingaScheduledDowntimeRangeForm.php:90 #: library/Director/Web/Form/DirectorObjectForm.php:652 #, php-format msgid "A new %s has successfully been created" msgstr "Un nuovo %s é stato creato con successo" #: application/forms/IcingaGenerateApiKeyForm.php:39 #, php-format msgid "A new Self Service API key for %s has been generated" msgstr "Un nuovo Self Service API per %s é stato creato con successo" #: application/forms/ImportRowModifierForm.php:72 msgid "" "A property modifier allows you to modify a specific property at import time" msgstr "" "Un modificatore di proprietà consente di modificare una proprietà specifica " "al momento dell'importazione" #: application/forms/ImportSourceForm.php:17 msgid "" "A short name identifying this import source. Use something meaningful, like " "\"Hosts from Puppet\", \"Users from Active Directory\" or similar" msgstr "" "Un breve nome per definire questa sorgente di importazione. " "Usa qualcosa di significativo come \"Hosts da Puppet\" o \"utenti da LDAP\" " #: application/forms/DirectorJobForm.php:74 msgid "" "A short name identifying this job. Use something meaningful, like \"Import " "Puppet Hosts\"" msgstr "" "Un breve nome per descrivere questa operazione. " "Usa qualcosa di significativo come \"Importazione di Host da Puppet\" " #: application/forms/IcingaServiceSetForm.php:30 msgid "A short name identifying this set of services" msgstr "Un breve nome per questo Service-Set" #: library/Director/Web/SelfService.php:211 #, php-format msgid "" "A ticket for this agent could not have been requested from your deployment " "endpoint: %s" msgstr "" "Non è stato possibile richiedere un ticket per questo agent da questo endpoint: %s " #: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:95 #, php-format msgid "" "A total of %d config changes happened since your last deployed config has " "been rendered" msgstr "" "Nel complesso, la configurazione è stata modificata %d volte dall'ultima distribuzione" #: application/forms/IcingaHostSelfServiceForm.php:49 msgid "API Key" msgstr "API Key" #: application/forms/IcingaEndpointForm.php:46 #: application/forms/KickstartForm.php:151 msgid "API user" msgstr "utente API" #: library/Director/Web/Form/DirectorObjectForm.php:1393 msgid "Accept passive checks" msgstr "Accetta check passivi" #: application/forms/IcingaHostForm.php:93 msgid "Accepts config" msgstr "Accetta configurazioni" # Aktuell wird es so in anderen Modulen übersetzt. -ThW #: library/Director/IcingaConfig/TypeFilterSet.php:28 msgid "Acknowledgement" msgstr "Conferma" #: library/Director/Web/Widget/ActivityLogInfo.php:544 #: library/Director/Web/Widget/ActivityLogInfo.php:555 #: library/Director/Web/Table/ConfigFileDiffTable.php:81 msgid "Action" msgstr "Azione" #: library/Director/Web/Form/DirectorObjectForm.php:1506 msgid "Action URL" msgstr "Action-URL" #: library/Director/Web/Widget/ActivityLogInfo.php:578 #: library/Director/Web/Widget/DeployedConfigInfoHeader.php:62 #: library/Director/Web/Table/QuickTable.php:280 msgid "Actions" msgstr "Azione" #: application/forms/SettingsForm.php:163 msgid "Activation Tool" msgstr "Strumento di attivazione" #: application/forms/SettingsForm.php:142 msgid "Active-Passive" msgstr "Attivo-passivo" #: library/Director/Web/Widget/SyncRunDetails.php:27 msgid "Activity" msgstr "Attivitá" #: application/controllers/ConfigController.php:141 #: library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:11 #: library/Director/Web/Tabs/InfraTabs.php:29 msgid "Activity Log" msgstr "Log di attivitá" #: library/Director/Web/Controller/ObjectController.php:240 #, php-format msgid "Activity Log: %s" msgstr "Log di attivitá: %s" #: configuration.php:138 msgid "Activity log" msgstr "Log di attivitá" #: application/controllers/DataController.php:22 #: application/controllers/DataController.php:65 #: application/forms/AddToBasketForm.php:72 #: library/Director/Web/Form/DirectorObjectForm.php:503 #: library/Director/Web/Controller/ActionController.php:144 #: library/Director/Web/Controller/ObjectsController.php:295 #: library/Director/Web/Controller/ObjectsController.php:336 #: library/Director/Web/ActionBar/ChoicesActionBar.php:16 #: library/Director/Web/ActionBar/ObjectsActionBar.php:16 #: library/Director/Web/ActionBar/TemplateActionBar.php:19 msgid "Add" msgstr "Aggiungere" #: library/Director/Web/Controller/ObjectController.php:78 #: library/Director/Web/Tabs/ObjectTabs.php:51 #, php-format msgid "Add %s" msgstr "%s aggiunto" #: application/forms/AddToBasketForm.php:68 #, php-format msgid "Add %s objects" msgstr "%s oggetti aggiunti" #: library/Director/Web/Controller/ObjectController.php:381 #, php-format msgid "Add %s: %s" msgstr "Aggiungere %s: %s" #: application/controllers/HostsController.php:40 #: application/controllers/HostsController.php:79 msgid "Add Service" msgstr "Aggiungere Service" #: application/controllers/HostsController.php:45 #: application/controllers/HostsController.php:110 msgid "Add Service Set" msgstr "Aggiungere Service-Set" #: application/controllers/HostsController.php:127 #, php-format msgid "Add Service Set to %d hosts" msgstr "Aggiungi Service-Set a %d Hosts" #: application/controllers/HostController.php:74 #, php-format msgid "Add Service Set to %s" msgstr "Aggiungi Service-Set a %s" #: application/controllers/HostController.php:61 #, php-format msgid "Add Service to %s" msgstr "Aggiungi Service a %s" #: application/controllers/DatafieldController.php:39 msgid "Add a new Data Field" msgstr "Aggiungi un nuovo campo dati" #: application/controllers/DataController.php:52 msgid "Add a new Data List" msgstr "Aggiungi un nuovo elenco di dati" #: application/controllers/ImportsourcesController.php:49 msgid "Add a new Import Source" msgstr "Aggiungi una nuova sorgente di importazione" #: application/controllers/JobsController.php:15 #: application/controllers/JobController.php:32 msgid "Add a new Job" msgstr "Aggiungi un nuovo Job" #: application/controllers/SyncrulesController.php:28 msgid "Add a new Sync Rule" msgstr "Aggiungi una nuova regola di sincronizzazione" #: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:470 msgid "Add a new entry" msgstr "Aggiungi un nuova voce" #: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:256 msgid "Add a new one..." msgstr "Aggiungi un nuovo..." #: application/controllers/ServicesetController.php:49 #, php-format msgid "Add a service set to \"%s\"" msgstr "Aggiungi un Service-Set a \"%s\" " #: application/controllers/ServiceController.php:105 #, php-format msgid "Add a service to \"%s\"" msgstr "Aggiungi un Service a \"%s\" " #: application/views/helpers/FormDataFilter.php:516 msgid "Add another filter" msgstr "Aggiungi un altro filtro" #: application/controllers/BasketController.php:83 msgid "Add chosen objects to a Configuration Basket" msgstr "Aggiungi oggetti selezionati al basket di configurazione" #: application/forms/DirectorDatalistEntryForm.php:60 msgid "Add data list entry" msgstr "Aggiungi la voce dell'elenco dati" #: application/controllers/ImportsourceController.php:90 msgid "Add import source" msgstr "Aggiungi sorgente di importazione" #: library/Director/Web/Controller/ObjectController.php:387 #, php-format msgid "Add new Icinga %s" msgstr "Aggiungi un nuovo Icinga %s" #: library/Director/Web/Controller/ObjectController.php:370 #, php-format msgid "Add new Icinga %s template" msgstr "Aggiungi nuovo Icinga al template %s" #: application/controllers/ImportsourceController.php:171 msgid "Add property modifier" msgstr "Aggiungi modificatore di proprietá" #: application/controllers/HostController.php:90 #: application/controllers/ServicesetController.php:66 msgid "Add service" msgstr "Aggiungi Service" #: application/controllers/HostController.php:95 msgid "Add service set" msgstr "Aggiungi Service-Set" #: application/controllers/HostsController.php:96 #, php-format msgid "Add service to %d hosts" msgstr "Aggiungi un Service a %d Hosts" #: application/controllers/SyncruleController.php:524 msgid "Add sync property rule" msgstr "Aggiungi regola di sincronizzazione" #: application/controllers/SyncruleController.php:563 #, php-format msgid "Add sync property: %s" msgstr "Aggiungi proprietá di sincronizzazione: %s" #: application/controllers/SyncruleController.php:475 msgid "Add sync rule" msgstr "Aggiungere regola di sincronizzazione" #: application/controllers/HostsController.php:70 #: application/controllers/BasketController.php:82 #: application/controllers/ServicesController.php:36 #: application/controllers/JobController.php:79 #: application/controllers/DataController.php:128 #: application/controllers/ImportsourceController.php:57 #: application/controllers/SyncruleController.php:612 #: library/Director/Web/Controller/ObjectController.php:352 #: library/Director/Web/Controller/TemplateController.php:128 msgid "Add to Basket" msgstr "Aggiungere a Basket" #: library/Director/Web/Form/DirectorObjectForm.php:1492 msgid "Additional notes for this object" msgstr "Note aggiuntive per questo oggetto" #: library/Director/Web/Form/DirectorObjectForm.php:1545 msgid "Additional properties" msgstr "Proprietá aggiuntive" #: library/Director/Web/Tabs/ObjectTabs.php:140 msgid "Agent" msgstr "Agent" #: application/forms/SelfServiceSettingsForm.php:141 msgid "Agent Version" msgstr "Versione Agent" #: application/forms/IcingaHostSelfServiceForm.php:31 msgid "Alias" msgstr "Alias" #: application/controllers/ConfigController.php:154 msgid "All changes" msgstr "Tutte le modifiche" #: application/forms/SettingsForm.php:78 msgid "" "All changes are tracked in the Director database. In addition you might also " "want to send an audit log through the Icinga Web 2 logging mechanism. That " "way all changes would be written to either Syslog or the configured log " "file. When enabling this please make sure that you configured Icinga Web 2 " "to log at least at \"informational\" level." msgstr "" "Tutte le modifiche vengono loggate nel database del Director. Inoltre, è possibile " "inviare un log tramite il meccanismo di logging di Icinga Web 2. " "In questo modo tutte le modifiche vengono scritte nel Syslog o il log file configurato. " "Per ottenere questo risultato Icinga 2 deve girare almeno con il livello di Log \"Info\"." #: application/forms/SyncPropertyForm.php:308 msgid "All custom variables (vars)" msgstr "Tutte le variabili personalizzate (vars)" #: application/forms/BasketForm.php:52 msgid "All of them" msgstr "Tutte queste" #: application/forms/IcingaServiceForm.php:730 #, php-format msgid "All overrides have been removed from \"%s\"" msgstr "Tutte le sovrascritture sono state rimosse da \"%s\"" #: library/Director/Web/Controller/ObjectsController.php:287 #, php-format msgid "All your %s Apply Rules" msgstr "Tutte le regole Apply %s" #: library/Director/Web/Controller/ObjectsController.php:232 #, php-format msgid "All your %s Templates" msgstr "Tutti i Template %s" #: application/forms/SelfServiceSettingsForm.php:174 msgid "Allow Updates" msgstr "Abilitare le modifiche" #: library/Director/DataType/DataTypeDatalist.php:146 msgid "Allow for values not on the list" msgstr "Consenti valori non presenti nell'elenco" #: configuration.php:31 msgid "Allow readonly users to see where a Service came from" msgstr "Consenti agli utenti di sola lettura di vedere da dove proviene un servizio" #: configuration.php:6 msgid "Allow to access the director API" msgstr "Consentire l'accesso all'API del Director" #: configuration.php:7 msgid "Allow to access the full audit log" msgstr "Consentire di accedere all'audit log completo" #: configuration.php:17 msgid "Allow to configure hosts" msgstr "Consenti la configurazione di Host" #: configuration.php:22 msgid "Allow to configure notifications" msgstr "Consenti la configurazione di notifiche" #: configuration.php:19 msgid "Allow to configure service sets" msgstr "Consenti la configurazione di Service-Sets" #: configuration.php:18 msgid "Allow to configure services" msgstr "Consenti la configurazione di Services" #: configuration.php:21 msgid "Allow to configure users" msgstr "Consenti la configurazione di utenti" #: configuration.php:20 msgid "Allow to define Service Set Apply Rules" msgstr "Consenti la definizione di regole Apply Service-Set" #: configuration.php:16 msgid "Allow to deploy configuration" msgstr "Consentire la distribuzione delle configurazioni" #: configuration.php:26 msgid "" "Allow to inspect objects through the Icinga 2 API (could contain sensitive " "information)" msgstr "" "Consentire di ispezionare oggetti tramite l'API Icinga 2 (potrebbe contenere elementi " "sensibili)" #: configuration.php:10 msgid "Allow to show configuration (could contain sensitive information)" msgstr "Consenti di mostrare la configurazione (potrebbe contenere informazioni riservate)" #: configuration.php:14 msgid "Allow to show the full executed SQL queries in some places" msgstr "" "Consentire di mostrare le query SQL eseguite completamente in " "alcuni punti" #: application/forms/DirectorDatalistEntryForm.php:48 msgid "" "Allow to use this entry only to users with one of these Icinga Web 2 roles" msgstr "" "Consentire di utilizzare questa voce solo agli utenti con uno di questi " "ruoli Icinga Web 2" #: configuration.php:33 msgid "Allow unrestricted access to Icinga Director" msgstr "Consentire l'accesso senza restrizioni a Icinga Director" #: application/forms/IcingaTemplateChoiceForm.php:85 msgid "Allowed maximum" msgstr "Massimo consentito" #: application/forms/DirectorDatalistEntryForm.php:44 msgid "Allowed roles" msgstr "Ruoli consentiti" #: application/forms/IcingaCloneObjectForm.php:85 msgid "Also clone fields provided by this Template" msgstr "Clona anche i campi forniti da questo Template" #: application/forms/IcingaCloneObjectForm.php:53 msgid "Also clone single Service Sets defined for this Host" msgstr "Clonare anche singoli Service Sets definiti per questo Host" #: application/forms/IcingaCloneObjectForm.php:44 msgid "Also clone single Services defined for this Host" msgstr "Clonare anche singoli Services definiti per questo Host" #: application/forms/SelfServiceSettingsForm.php:191 msgid "" "Also install NSClient++. It can be used through the Icinga Agent and comes " "with a bunch of additional Check Plugins" msgstr "" "Installa anche NSClient++. Può essere utilizzato tramite l'agente Icinga e arriva " "con parecchi Check-Plugins aggiuntivi" #: application/forms/DirectorDatafieldForm.php:109 #, php-format msgid "Also rename all \"%s\" custom variables to \"%s\" on %d objects?" msgstr "" "Rinominare anche variabili personalizzate da \"%s\" a \"%s\" su %d questi " "oggetti?" #: application/forms/DirectorDatafieldForm.php:66 #, php-format msgid "Also wipe all \"%s\" custom variables from %d objects?" msgstr "" "Pulisci anche tutti le variabili personalizzate \"%s\" dagli %d oggetti?" #: application/forms/IcingaHostForm.php:336 msgid "" "Alternative name for this host. Might be a host alias or and kind of string " "helping your users to identify this host" msgstr "" "Nome alternativo per questo Host. Può essere un Alias o qualsiasi stringa, " "aiuta gli utenti nell'identificare questo Host" #: application/forms/IcingaUserForm.php:135 msgid "" "Alternative name for this user. In case your object name is a username, this " "could be the full name of the corresponding person" msgstr "" "Nome alternativo per questo utente. Se il nome dell'oggetto fosse uno username, " "potrebbe essere utile usare il nome completo della persona." #: library/Director/Web/Form/DirectorObjectForm.php:1526 msgid "Alternative text to be shown in case above icon is missing" msgstr "Testo alternativo da mostrare nel caso in cui l'icona manchi" #: application/forms/IcingaCommandArgumentForm.php:91 msgid "" "An Icinga DSL expression that returns a boolean value, e.g.: var cmd = " "bool(macro(\"$cmd$\")); return cmd ..." msgstr "" "Un'espressione Icinga DSL che restituisce un valore booleano, e.g.: var cmd " "= bool(macro(\"$cmd$\")); return cmd ..." #: application/forms/IcingaCommandArgumentForm.php:52 msgid "" "An Icinga DSL expression, e.g.: var cmd = macro(\"$cmd$\"); return " "typeof(command) == String ..." msgstr "" "Un'espressione Icinga DSL, e.g.: var cmd = macro(\"$cmd$\"); return " "typeof(command) == String ..." #: library/Director/Web/Form/DirectorObjectForm.php:1508 msgid "" "An URL leading to additional actions for this object. Often used with Icinga " "Classic, rarely with Icinga Web 2 as it provides far better possibilities to " "integrate addons" msgstr "" "Un URL che porta ad azioni aggiuntive per questo oggetto. Viene usato spesso con Icinga " "Classic, meno usato con Icinga Web 2, in quanto quest'ultimo offre soluzioni di Addons migliori" #: library/Director/Web/Form/DirectorObjectForm.php:1501 msgid "An URL pointing to additional notes for this object" msgstr "Un URL che punta a note aggiuntive per questo oggetto" #: library/Director/Web/Form/DirectorObjectForm.php:1517 msgid "" "An URL pointing to an icon for this object. Try \"tux.png\" for icons " "relative to public/img/icons or \"cloud\" (no extension) for items from the " "Icinga icon font" msgstr "" "Un URL che punta ad un'icona per questo oggetto. Prova \"tux.png\" per icone relatice al path " "public/img/icons o \"cloud\" (senza estensione) per oggetti dall'Icinga icon font." #: library/Director/Web/Form/DirectorObjectForm.php:1273 msgid "" "An alternative display name for this group. If you wonder how this could be " "helpful just leave it blank" msgstr "" "Un nome visualizzato alternativo per questo gruppo. Può essere lasciato vuoto." #: application/forms/ImportRowModifierForm.php:54 msgid "" "An extended description for this Import Row Modifier. This should explain " "it's purpose and why it has been put in place at all." msgstr "" "Una descrizione estesa per questo modificatore di riga di importazione. " "Questo dovrebbe indicare il suo scopo e perché è stato messo in atto." #: application/forms/ImportSourceForm.php:26 msgid "" "An extended description for this Import Source. This should explain what " "kind of data you're going to import from this source." msgstr "" "Una descrizione estesa per questa sorgente di importazione. " "Questo dovrebbe indicare che tipo di dati verranno importati da questa sorgente" #: application/forms/SyncRuleForm.php:38 msgid "" "An extended description for this Sync Rule. This should explain what this " "Rule is going to accomplish." msgstr "" "Una descrizione estesa per questa regola di sincronizzazione. " "Questo dovrebbe indicare ciò che questa regola sta per realizzare." #: application/forms/DirectorDatafieldForm.php:161 msgid "" "An extended description for this field. Will be shown as soon as a user puts " "the focus on this field" msgstr "" "Una descrizione estesa per questo campo. " "Verrà mostrato non appena un utente si sposta su questo campo" #: library/Director/Import/ImportSourceLdap.php:55 msgid "" "An object class to search for. Might be \"user\", \"group\", \"computer\" or " "similar" msgstr "" "Una classe di oggetti da cercare. e.g. \"user\", \"group\", " "\"computer\" o simili" #: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:35 msgid "" "Another Import Source. We're going to look up the row with the key matching " "the value in the chosen column" msgstr "" "Un'altra sorgente di importazione. Verrà individuata la riga la cui chiave " "corrisponde al valore nella colonna scelta" #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:20 msgid "Any first (leftmost) component" msgstr "Qualsiasi primo componente (più a sinistra)" #: library/Director/Web/SelfService.php:115 msgid "Api Key:" msgstr "API Key:" #: library/Director/Web/Controller/TemplateController.php:53 #, php-format msgid "Applied %s" msgstr "Applicato %s" #: application/forms/IcingaHostForm.php:217 msgid "Applied groups" msgstr "Applicato a gruppi" #: application/controllers/HostController.php:344 #, php-format msgid "Applied service: %s" msgstr "Applicato service: %s" #: application/controllers/HostController.php:189 #: application/controllers/HostController.php:277 msgid "Applied services" msgstr "Applicato services" #: library/Director/Web/Tabs/ObjectsTabs.php:45 msgid "Apply" msgstr "Applica" #: application/controllers/ServiceController.php:110 #, php-format msgid "Apply \"%s\"" msgstr "Applica \"%s\"" #: application/forms/ApplyMigrationsForm.php:25 #, php-format msgid "Apply %d pending schema migrations" msgstr "Applica %d migrazione di schema in sospeso" #: application/forms/IcingaServiceForm.php:609 msgid "Apply For" msgstr "Applica a" #: library/Director/Web/Controller/TemplateController.php:168 msgid "Apply Rule" msgstr "Regola Apply" #: library/Director/Web/Table/ApplyRulesTable.php:161 msgid "Apply Rule rendering preview" msgstr "Anteprima di come risulta la regola applicata" #: library/Director/Web/Table/DependencyTemplateUsageTable.php:11 #: library/Director/Web/Table/NotificationTemplateUsageTable.php:11 #: library/Director/Web/Table/ServiceTemplateUsageTable.php:12 msgid "Apply Rules" msgstr "Regole Apply" #: application/forms/ApplyMigrationsForm.php:20 msgid "Apply a pending schema migration" msgstr "Applicare una migrazione dello schema in sospeso" #: library/Director/Job/SyncJob.php:92 msgid "Apply changes" msgstr "Applica le modifiche" #: library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:19 msgid "Apply notifications with specific properties according to given rules. " msgstr "" "Applica notifiche con proprietà specifiche in base a determinate regole." #: library/Director/Web/Form/DirectorObjectForm.php:1098 msgid "Apply rule" msgstr "Applica regole" #: library/Director/Web/Table/ApplyRulesTable.php:168 msgid "Apply rule history" msgstr "Storico delle regole applicate" #: application/forms/KickstartForm.php:38 msgid "Apply schema migrations" msgstr "Applica schema di migrazione" #: application/forms/IcingaScheduledDowntimeForm.php:78 #: application/forms/IcingaDependencyForm.php:93 #: application/forms/IcingaNotificationForm.php:81 msgid "Apply to" msgstr "Applica a" #: application/controllers/ServiceController.php:206 #, php-format msgid "Apply: %s" msgstr "Applica: %s" #: library/Director/Web/Table/IcingaCommandArgumentTable.php:45 msgid "Argument" msgstr "Argomento" #: application/forms/IcingaObjectFieldForm.php:99 msgid "Argument macros" msgstr "Argomento macro" #: application/forms/IcingaCommandArgumentForm.php:25 msgid "Argument name" msgstr "Nome argomento" #: application/forms/SyncPropertyForm.php:314 msgid "Arguments" msgstr "Argomenti" #: library/Director/DataType/DataTypeDirectorObject.php:77 #: library/Director/DataType/DataTypeSqlQuery.php:77 #: library/Director/DataType/DataTypeDatalist.php:131 msgid "Array" msgstr "Array" #: library/Director/Web/Form/DirectorObjectForm.php:1578 msgid "Assign where" msgstr "Assegna dove" #: application/forms/IcingaScheduledDowntimeForm.php:27 #: library/Director/Web/Widget/ActivityLogInfo.php:536 msgid "Author" msgstr "Autore" #: library/Director/DataType/DataTypeDatalist.php:144 msgid "Autocomplete" msgstr "Autocompletamento" #: library/Director/Dashboard/AutomationDashboard.php:15 msgid "Automate all tasks" msgstr "Automatizza tutte le operazioni" #: configuration.php:134 msgid "Automation" msgstr "Automazione" #: application/forms/IcingaTemplateChoiceForm.php:64 msgid "Available choices" msgstr "Scelte disponibili" #: application/controllers/BasketController.php:50 #: library/Director/Web/Controller/TemplateController.php:94 msgid "Back" msgstr "Indietro" #: application/controllers/BasketController.php:32 #: application/forms/AddToBasketForm.php:60 #: library/Director/Web/Table/BasketTable.php:31 msgid "Basket" msgstr "Basket" #: application/forms/BasketForm.php:34 msgid "Basket Definitions" msgstr "Definizioni Basket" #: application/forms/BasketUploadForm.php:29 #: application/forms/BasketForm.php:44 msgid "Basket Name" msgstr "Nome Basket" #: application/controllers/BasketController.php:140 msgid "Basket Snapshots" msgstr "Basket Snapshots" #: application/forms/BasketUploadForm.php:145 msgid "Basket has been uploaded" msgstr "Il Basket é stato caricato" #: application/controllers/BasketController.php:76 #: application/controllers/BasketsController.php:17 msgid "Baskets" msgstr "Baskets" #: application/forms/SyncRuleForm.php:87 msgid "" "Be careful: this is usually NOT what you want, as it makes Sync \"blind\" " "for objects matching this filter. This means that \"Purge\" will not work as " "expected. The \"Black/Whitelist\" Import Property Modifier is probably what " "you're looking for." msgstr "" "Fai attenzione: di solito NON è quello che vuoi, poiché fa la " "Sync \"blind\" per tutti gli oggetti corrispondenti a questo filtro. Ciò significa che " " \"Purge\" non funzionerà come ci si aspetta. Ti consigliamo di usare invece il \"Black/Whitelist\" " "Import Modificatore proprietà." #: library/Director/Web/Widget/BackgroundDaemonDetails.php:72 msgid "Binary" msgstr "Binary" #: application/forms/IcingaServiceForm.php:160 msgid "Blacklist" msgstr "Blacklist" #: application/forms/IcingaObjectFieldForm.php:125 #: application/forms/DirectorDatafieldForm.php:150 msgid "Caption" msgstr "Didascalia" #: application/forms/IcingaMultiEditForm.php:269 #, php-format msgid "Changing this value affects %d object(s): %s" msgstr "La modifica di questo valore influisce %d oggett(o,i): %s" #: library/Director/Import/ImportSourceCoreApi.php:57 msgid "Check Commands" msgstr "Check Commands" #: library/Director/Web/Form/DirectorObjectForm.php:1294 msgid "Check command" msgstr "Check command" #: application/forms/IcingaNotificationForm.php:255 #: library/Director/Web/Form/DirectorObjectForm.php:1295 msgid "Check command definition" msgstr "Definizione Check command" #: library/Director/Web/Form/DirectorObjectForm.php:1363 msgid "" "Check command timeout in seconds. Overrides the CheckCommand's timeout " "attribute" msgstr "" "Check command timeout in secondi. Sovrascrive l'attributo timeout del commando" #: library/Director/Web/Form/DirectorObjectForm.php:323 msgid "Check execution" msgstr "Check execution" #: application/forms/SyncCheckForm.php:23 #: application/forms/ImportCheckForm.php:23 msgid "Check for changes" msgstr "Verifica le modifiche" #: library/Director/Web/Form/DirectorObjectForm.php:1330 msgid "Check interval" msgstr "Check interval" #: library/Director/Web/Form/DirectorObjectForm.php:1375 msgid "Check period" msgstr "Check period" #: library/Director/Web/Form/DirectorObjectForm.php:1361 msgid "Check timeout" msgstr "Check timeout" #: application/forms/ImportCheckForm.php:45 msgid "Checking this Import Source failed" msgstr "Verifica di questa sorgente di importazione non riuscita" #: application/forms/SyncCheckForm.php:61 msgid "Checking this sync rule failed" msgstr "Verifica della regola di sincronizzazione non riuscita" #: library/Director/Web/Widget/ActivityLogInfo.php:573 msgid "Checksum" msgstr "Checksum" #: application/forms/IcingaDependencyForm.php:233 msgid "Child Host" msgstr "Host-figlio" #: application/forms/IcingaDependencyForm.php:246 msgid "Child Service" msgstr "Service-figlio" #: application/forms/IcingaTemplateChoiceForm.php:48 msgid "Choice name" msgstr "Nome scelto" #: library/Director/Dashboard/Dashlet/ChoicesDashlet.php:11 #: library/Director/Web/Tabs/ObjectsTabs.php:70 msgid "Choices" msgstr "Selezione" #: application/forms/BasketForm.php:78 msgid "" "Choose \"All\" to always add all of them, \"Ignore\" to not care about a " "specific Type at all and opt for \"Custom Selection\" in case you want to " "choose just some specific Objects." msgstr "" "Scegli \"Tutti\" per aggiungere sempre tutti, \"Ignora\" per non includere uno " "specifico Tipo e scegli \"Selezione personalizzata\" nel caso in cui si vogliano " "includere solo alcuni oggetti specifici." #: application/forms/IcingaHostForm.php:176 msgid "Choose a Host Template" msgstr "Scegli un Host template" #: application/forms/IcingaAddServiceForm.php:107 msgid "Choose a service template" msgstr "Scegli un Service template" #: application/forms/SyncRuleForm.php:46 msgid "Choose an object type" msgstr "Scegli un tipo di oggetto" #: application/forms/BasketUploadForm.php:35 msgid "Choose file" msgstr "Scegli un file" #: application/forms/IcingaServiceForm.php:587 msgid "Choose the host this single service should be assigned to" msgstr "Scegli l'Host a cui assegnare questo singolo servizio" #: application/forms/IcingaTemplateChoiceForm.php:75 msgid "" "Choosing this many options will be mandatory for this Choice. Setting this " "to zero will leave this Choice optional, setting it to one results in a " "\"required\" Choice. You can use higher numbers to enforce multiple options, " "this Choice will then turn into a multi-selection element." msgstr "" "La scelta di molte opzioni sarà obbligatoria per questa scelta. Impostando questo " "su zero, questa scelta sarà facoltativa, impostandola su uno diventerà una scelta " "\"obbligatorio\". È possibile utilizzare numeri più alti per applicare più opzioni, " "questa scelta si trasformerà quindi in un elemento a selezione multipla." #: application/forms/IcingaZoneForm.php:37 msgid "Chose an (optional) parent zone" msgstr "Scegli una zona padre (facoltativa)" #: library/Director/Web/Widget/Documentation.php:31 #, php-format msgid "Click to read our documentation: %s" msgstr "Clicca per leggere la documentazione: %s" #: application/controllers/ImportsourceController.php:123 #: application/controllers/SyncruleController.php:498 #: library/Director/Web/Form/CloneImportSourceForm.php:34 #: library/Director/Web/Form/CloneSyncRuleForm.php:34 #: library/Director/Web/Controller/ObjectController.php:316 #: library/Director/Web/ActionBar/AutomationObjectActionBar.php:44 msgid "Clone" msgstr "Clona" #: application/forms/IcingaCloneObjectForm.php:91 #, php-format msgid "Clone \"%s\"" msgstr "Clona \"%s\"" #: application/forms/IcingaCloneObjectForm.php:51 msgid "Clone Service Sets" msgstr "Clona Service-Set" #: application/forms/IcingaCloneObjectForm.php:42 msgid "Clone Services" msgstr "Clona Services" #: application/forms/IcingaCloneObjectForm.php:83 msgid "Clone Template Fields" msgstr "Clona campi template" #: application/forms/IcingaCloneObjectForm.php:32 msgid "Clone the object as is, preserving imports" msgstr "Clona l'oggetto così com'è, preservando le importazioni" #: application/forms/IcingaCloneObjectForm.php:72 msgid "Clone this service to the very same or to another Host" msgstr "Clonare questo Service sullo stesso o su un altro Host" #: application/forms/IcingaCloneObjectForm.php:63 msgid "Clone this service to the very same or to another Service Set" msgstr "Clonare questo servizio sullo stesso o su un altro Service Set" #: library/Director/Web/Controller/ObjectController.php:174 #, php-format msgid "Clone: %s" msgstr "Clona %s" #: library/Director/Web/Form/DirectorObjectForm.php:1137 msgid "Cluster Zone" msgstr "Cluster Zone" #: library/Director/Dashboard/Dashlet/ChoicesDashlet.php:17 msgid "" "Combine multiple templates into meaningful Choices, making life easier for " "your users" msgstr "" "Combina più template in scelte significative, semplificando la vita " "ai tuoi utenti" #: application/forms/IcingaCommandForm.php:59 #: application/forms/SyncRuleForm.php:20 #: library/Director/TranslationDummy.php:16 msgid "Command" msgstr "Command" #: application/forms/BasketForm.php:17 msgid "Command Definitions" msgstr "Definizione Command" #: application/forms/BasketForm.php:19 msgid "Command Template" msgstr "Command Template" #: library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:19 msgid "Command Templates" msgstr "Command Templates" #: application/controllers/CommandController.php:89 #, php-format msgid "Command arguments: %s" msgstr "Command argomenti: %s" #: application/forms/IcingaHostForm.php:103 msgid "Command endpoint" msgstr "Command endpoint" #: application/forms/IcingaCommandForm.php:48 msgid "Command name" msgstr "Nome command" #: application/forms/IcingaCommandForm.php:17 msgid "Command type" msgstr "Tipo command" #: configuration.php:126 #: library/Director/Dashboard/Dashlet/CommandObjectDashlet.php:13 #: library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:19 #: library/Director/Web/Table/CustomvarVariantsTable.php:57 msgid "Commands" msgstr "Commands" #: application/forms/IcingaScheduledDowntimeForm.php:35 msgid "Comment" msgstr "Commento" #: application/controllers/BasketController.php:336 #, php-format msgid "Comparing %s \"%s\" from Snapshot \"%s\" to current config" msgstr "" "Comparazione %s \"%s\" da Snapshot \"%s\" con la configurazione attuale" #: application/forms/IcingaCommandArgumentForm.php:89 #: application/forms/IcingaCommandArgumentForm.php:98 msgid "Condition (set_if)" msgstr "Condizione (set_if)" #: application/forms/IcingaCommandArgumentForm.php:75 msgid "Condition format" msgstr "Formato condizione" #: application/controllers/JobController.php:102 #: application/controllers/ConfigController.php:258 #: application/controllers/ConfigController.php:469 #: library/Director/Web/Widget/DeploymentInfo.php:60 #: library/Director/Web/Table/CoreApiFieldsTable.php:80 msgid "Config" msgstr "Configurazione" #: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:18 msgid "Config Deployment" msgstr "Distribuzione configurazione" #: application/controllers/ConfigController.php:444 #: application/forms/DeploymentLinkForm.php:155 #: application/forms/DeployConfigForm.php:100 msgid "Config deployment failed" msgstr "Distribuzione configurazione fallita" #: application/controllers/ConfigController.php:344 #: application/controllers/ConfigController.php:345 msgid "Config diff" msgstr "Differenze configurazione" #: application/controllers/ConfigController.php:303 #: application/controllers/ConfigController.php:405 #, php-format msgid "Config file \"%s\"" msgstr "File di configurazione \"%s\"" #: application/controllers/ConfigController.php:424 #: application/forms/DeploymentLinkForm.php:142 #: application/forms/DeployConfigForm.php:76 #: application/forms/DeployConfigForm.php:95 msgid "Config has been submitted, validation is going on" msgstr "La configurazione è stata inviata, la convalida è in corso" #: application/forms/DeployFormsBug7530.php:83 msgid "Config has not been deployed" msgstr "La configurazione non è stata distribuita" #: library/Director/Web/ObjectPreview.php:40 #, php-format msgid "Config preview: %s" msgstr "Anteprima della configurazione: %s" #: library/Director/Web/Widget/DeploymentInfo.php:82 #: library/Director/ProvidedHook/Monitoring/ServiceActions.php:54 msgid "Configuration" msgstr "Configurazione" #: application/controllers/HostController.php:212 msgid "Configuration (read-only)" msgstr "Configurazione (solo lettura)" #: application/controllers/BasketsController.php:32 #: library/Director/Dashboard/Dashlet/BasketDashlet.php:11 msgid "Configuration Baskets" msgstr "Configurazione Baskets" #: application/forms/SettingsForm.php:109 msgid "Configuration format" msgstr "Formato configurazione" #: application/forms/KickstartForm.php:332 msgid "Configuration has been stored" msgstr "La Configurazione é stata salvata" #: application/forms/AddToBasketForm.php:111 #, php-format msgid "Configuration objects have been added to the chosen basket \"%s\"" msgstr "Gli oggetti di configurazione sono stati aggiunti al Basket \"%s\" selezionato" #: library/Director/Web/SelfService.php:152 msgid "Configure this Agent via Self Service API" msgstr "Configurare questo agente tramite l'API self-service" #: application/controllers/BasketController.php:229 msgid "Content Checksum" msgstr "Checksum contenuto" #: application/controllers/BasketsController.php:20 msgid "Create" msgstr "Creato" #: application/controllers/BasketController.php:102 msgid "Create Basket" msgstr "Creare Basket" #: application/forms/BasketCreateSnapshotForm.php:23 msgid "Create Snapshot" msgstr "Creare Snapshot" #: library/Director/Web/Controller/ObjectsController.php:300 #, php-format msgid "Create a new %s Apply Rule" msgstr "Crea una nuova regola %s Apply" #: library/Director/Web/Controller/ObjectsController.php:341 #, php-format msgid "Create a new %s Set" msgstr "Crea un nuovo %s Set" #: library/Director/Web/Controller/TemplateController.php:156 #, php-format msgid "Create a new %s inheriting from this one" msgstr "Crea un nuovo %s ereditando da questo" #: library/Director/Web/Controller/TemplateController.php:146 #: library/Director/Web/Controller/TemplateController.php:166 #, php-format msgid "Create a new %s inheriting from this template" msgstr "Crea un nuovo %s ereditando da questo template" #: application/controllers/BasketController.php:103 msgid "Create a new Configuration Basket" msgstr "Crea un nuovo Basket di configurazione" #: library/Director/Web/ActionBar/TemplateActionBar.php:23 msgid "Create a new Template" msgstr "Crea un nuovo template" #: library/Director/Web/ActionBar/ObjectsActionBar.php:20 msgid "Create a new object" msgstr "Crea un nuovo oggetto" #: library/Director/Web/ActionBar/ChoicesActionBar.php:20 msgid "Create a new template choice" msgstr "Crea un nuovo template di selezione" #: application/forms/KickstartForm.php:37 msgid "Create database schema" msgstr "Crea lo schema di database" #: application/forms/ApplyMigrationsForm.php:31 msgid "Create schema" msgstr "Crea lo schema" #: application/controllers/BasketController.php:228 msgid "Created" msgstr "Creato" #: library/Director/IcingaConfig/StateFilterSet.php:26 msgid "Critical" msgstr "Critico" #: library/Director/Web/Controller/TemplateController.php:185 msgid "Current Template Usage" msgstr "Utilizzo template corrente" #: application/forms/BasketForm.php:53 msgid "Custom Selection" msgstr "Selezione personalizzata" #: application/controllers/CustomvarController.php:13 msgid "Custom Variable" msgstr "Variable personalizzata" #: application/controllers/CustomvarController.php:14 #, php-format msgid "Custom Variable variants: %s" msgstr "Varianti di varibili personalizzate: %s" #: library/Director/Web/Tabs/DataTabs.php:27 msgid "Custom Variables" msgstr "Variabili personalizzate" #: application/controllers/DataController.php:80 msgid "Custom Vars - Overview" msgstr "Vars personalizzati - Panoramica" #: application/forms/SyncPropertyForm.php:179 msgid "Custom expression" msgstr "Espressione personalizzata" #: library/Director/Web/Controller/ObjectController.php:190 #, php-format msgid "Custom fields: %s" msgstr "Campi personalizzati: \"%s\"" #: library/Director/IcingaConfig/TypeFilterSet.php:25 msgid "Custom notification" msgstr "Notifica personalizzata" #: application/forms/IcingaServiceForm.php:438 #: library/Director/Web/Form/IcingaObjectFieldLoader.php:227 msgid "Custom properties" msgstr "Proprietà personalizzate" #: application/forms/SyncPropertyForm.php:67 msgid "Custom variable" msgstr "Variabile personalizzata" #: application/forms/SyncPropertyForm.php:307 msgid "Custom variable (vars.)" msgstr "Variabile personalizzata (vars.)" #: application/controllers/SuggestController.php:250 #: application/controllers/SuggestController.php:260 #: library/Director/Objects/IcingaHost.php:157 #: library/Director/Objects/IcingaService.php:727 msgid "Custom variables" msgstr "Variabili personalizzate" #: library/Director/Dashboard/Dashlet/CustomvarDashlet.php:11 msgid "CustomVar Overview" msgstr "Panoramica di variabili personalizzate" #: library/Director/Import/ImportSourceSql.php:40 msgid "DB Query" msgstr "Query DB" #: application/forms/KickstartForm.php:245 msgid "DB Resource" msgstr "Risorsa DB" #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:15 msgid "DN component" msgstr "DN componente" #: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:25 msgid "DNS record type" msgstr "DNS record type" #: library/Director/Web/Tabs/MainTabs.php:34 msgid "Daemon" msgstr "Servizio" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:41 #, php-format msgid "Daemon has been stopped %s, was running with PID %s as %s@%s" msgstr "Il servizio %s è stato arrestato, girava prima con PID %s e %s@%s" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:90 #, php-format msgid "Daemon is running with PID %s as %s@%s, last refresh happened %s" msgstr "" "Il servizio è in esecuzione con PID %s %s@%s, l'ultimo aggiornamento è avvenuto in %s " #: library/Director/Web/Widget/BackgroundDaemonDetails.php:54 #, php-format msgid "" "Daemon keep-alive is outdated, was last seen running with PID %s as %s@%s %s" msgstr "" "Servizio keep-alive è obsoleto, è stato visto per l'ultima volta in esecuzione con PID %s %s@%s %s" #: application/controllers/DataController.php:63 msgid "Data Fields" msgstr "Campi dati" #: application/controllers/DataController.php:53 msgid "Data List" msgstr "Elenco dati" #: application/forms/SyncRuleForm.php:19 msgid "Data List Entry" msgstr "Voce dell'elenco dati" #: application/controllers/DataController.php:47 #, php-format msgid "Data List: %s" msgstr "Elenco dati: %s" #: application/forms/BasketForm.php:30 msgid "Data Lists" msgstr "Elenchi di dati" #: library/Director/Web/Tabs/DataTabs.php:21 msgid "Data fields" msgstr "Campi dati" #: application/forms/DirectorDatafieldForm.php:133 msgid "" "Data fields allow you to customize input controls for Icinga custom " "variables. Once you defined them here, you can provide them through your " "defined templates. This gives you a granular control over what properties " "your users should be allowed to configure in which way." msgstr "" "I campi dati consentono di personalizzare i controlli di input per le " "custom variables di Icinga. Dopo averli definiti qui, è possibile utilizzarli nelle " "definitioni dei template. Questo ti dà un controllo granulare su quali proprietà " "i tuoi utenti dovrebbero essere autorizzati a configurare e in che modo." #: library/Director/Dashboard/Dashlet/DatafieldDashlet.php:17 msgid "Data fields make sure that configuration fits your rules" msgstr "" "I campi dati assicurano che la configurazione soddisfi le tue regole." #: application/forms/DirectorDatalistForm.php:24 msgid "Data list" msgstr "Elenco campi" #: application/controllers/DataController.php:20 #: library/Director/Web/Tabs/DataTabs.php:24 msgid "Data lists" msgstr "Elenchi di dati" #: application/forms/DirectorDatalistForm.php:15 msgid "" "Data lists are mainly used as data providers for custom variables presented " "as dropdown boxes boxes. You can manually manage their entries here in " "place, but you could also create dedicated sync rules after creating a new " "empty list. This would allow you to keep your available choices in sync with " "external data providers" msgstr "" "Gli elenchi di dati vengono utilizzati principalmente come sorgente di dati per " "le variabili personalizzate presentate come caselle. Puoi gestire manualmente " "le loro voci direttamente qui, ma puoi anche creare regole di sincronizzazione " "dedicate, dopo aver creato un nuovo elenco. Ciò ti consente di mantenere " "sincronizzate le opzioni disponibili con sorgenti di dati esterni" #: application/forms/DirectorDatafieldForm.php:176 msgid "Data type" msgstr "Tipo di dati" #: application/forms/KickstartForm.php:295 msgid "Database backend" msgstr "Database backend" #: library/Director/Web/Widget/ActivityLogInfo.php:537 msgid "Date" msgstr "Data" #: application/forms/IcingaTimePeriodRangeForm.php:21 #: application/forms/IcingaScheduledDowntimeRangeForm.php:22 #: library/Director/Web/Table/IcingaScheduledDowntimeRangeTable.php:51 #: library/Director/Web/Table/IcingaTimePeriodRangeTable.php:45 msgid "Day(s)" msgstr "Giorno(i)" #: application/forms/SettingsForm.php:118 msgid "" "Default configuration format. Please note that v1.x is for special " "transitional projects only and completely unsupported. There are no plans to " "make Director a first-class configuration backends for Icinga 1.x" msgstr "" "Si noti che v1.x è solo per progetti speciali di transizione e completamente " "non supportato. Non ci sono piani per rendere Director un backend di configurazione " "per Icinga 1.x." #: application/forms/SettingsForm.php:32 msgid "Default global zone" msgstr "Zona globale predefinita" #: library/Director/Dashboard/CommandsDashboard.php:23 msgid "" "Define Check-, Notification- or Event-Commands. Command definitions are the " "glue between your Host- and Service-Checks and the Check plugins on your " "Monitoring (or monitored) systems" msgstr "" "Definisci i comandi Check, Notification o Event. Le definizioni dei comandi " "sono i link tra i tuoi controlli Host e Service e i plugin Check sui tuoi sistemi " "di monitoraggio (o monitorati)" #: library/Director/Dashboard/Dashlet/DatafieldDashlet.php:11 msgid "Define Data Fields" msgstr "Definisci campi dati" #: library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:17 msgid "" "Define Host Groups to give your configuration more structure. They are " "useful for Dashboards, Notifications or Restrictions" msgstr "" "Definisci i gruppi host per dare più struttura alla tua configurazione. " "Sono utili per dashboard, notifiche o restrizioni" #: application/forms/SelfServiceSettingsForm.php:103 msgid "" "Define a download Url or local directory from which the a specific Icinga 2 " "Agent MSI Installer package should be fetched. Please ensure to only define " "the base download Url or Directory. The Module will generate the MSI file " "name based on your operating system architecture and the version to install. " "The Icinga 2 MSI Installer name is internally build as follows: Icinga2-" "v[InstallAgentVersion]-[OSArchitecture].msi (full example: Icinga2-v2.6.3-" "x86_64.msi)" msgstr "" "Definire un URL di download o una directory locale da cui prelevare uno specifico " "pacchetto di installazione MSI Icinga 2 Agent. Assicurati di definire solo l'URL o " "la directory di download di base. Il modulo genererà il nome del file MSI in base " "all'architettura del sistema operativo e alla versione da installare. " "Il nome del programma di installazione MSI Icinga 2 è costruito internamente come " "segue: Icinga2-v [InstallAgentVersion] - [OSArchitecture] .msi " "(esempio completo: Icinga2-v2.6.3-x86_64.msi)" #: library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:29 msgid "Define and manage imports from various data sources" msgstr "Definire e gestire le importazioni da varie sorgenti dati" #: library/Director/Dashboard/TimeperiodsDashboard.php:14 msgid "Define custom Time Periods" msgstr "Definire periodi di tempo personalizzati" #: library/Director/Dashboard/Dashlet/SyncDashlet.php:29 msgid "Define how imported data should be synchronized with Icinga" msgstr "" "Definire come sincronizzare i dati importati con Icinga" #: application/forms/SyncRuleForm.php:54 msgid "" "Define what should happen when an object with a matching key already exists. " "You could merge its properties (import source wins), replace it completely " "with the imported object or ignore it (helpful for one-time imports)" msgstr "" "Definire cosa dovrebbe accadere quando esiste già un oggetto con una chiave " "corrispondente. È possibile unire le sue proprietà (importazione sorgente vince), " "sostituirlo completamente con l'oggetto importato o ignorarlo " "(utile per le importazioni singole)" #: library/Director/Dashboard/ObjectsDashboard.php:15 msgid "Define whatever you want to be monitored" msgstr "Definisci qualunque cosa tu voglia monitorare" #: library/Director/Web/Form/DirectorObjectForm.php:1352 msgid "Defines after how many check attempts a new hard state is reached" msgstr "" "Definisce dopo quanti tentativi di controllo viene raggiunto un nuovo Hard State" #: library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:17 msgid "" "Defining Notifications for User Groups instead of single Users gives more " "flexibility" msgstr "" "La definizione di notifiche per gruppi di utenti anziché singoli utenti offre " "maggiore flessibilità" #: library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:17 msgid "" "Defining Service Groups get more structure. Great for Dashboards. " "Notifications and Permissions might be based on groups." msgstr "" "La definizione di gruppi di servizi ottiene una maggiore struttura. " "Ottimo per i dashboard. Le notifiche e le autorizzazioni potrebbero " "essere basate sui gruppi." #: application/forms/IcingaNotificationForm.php:199 msgid "Delay until the first notification should be sent" msgstr "Ritarda prima di spedire la prima notifica" #: application/forms/IcingaObjectFieldForm.php:193 #: library/Director/Web/Form/DirectorObjectForm.php:902 msgid "Delete" msgstr "Elimina" #: library/Director/PropertyModifier/PropertyModifierSplit.php:13 msgid "Delimiter" msgstr "Delimitatore" #: application/forms/BasketForm.php:29 #: library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:13 msgid "Dependencies" msgstr "Dipendenze" #: application/forms/SyncRuleForm.php:24 msgid "Dependency" msgstr "Dipendenza" #: application/forms/DeploymentLinkForm.php:88 msgid "Deploy" msgstr "Distribuire" #: application/forms/DeployConfigForm.php:37 #, php-format msgid "Deploy %d pending changes" msgstr "Distribuisci %d modifiche in sospeso" #: library/Director/Dashboard/DeploymentDashboard.php:15 msgid "Deploy configuration to your Icinga nodes" msgstr "Distribuire la configurazione sui nodi Icinga" #: library/Director/Job/ConfigJob.php:195 msgid "Deploy modified config" msgstr "Distribuire la configurazione modificata" #: application/controllers/ConfigController.php:251 #: application/controllers/ConfigController.php:461 #: library/Director/Web/Widget/DeploymentInfo.php:54 msgid "Deployment" msgstr "Distribuzione" #: application/forms/SettingsForm.php:153 msgid "Deployment Path" msgstr "Percorso di distribuzione" #: application/controllers/DeploymentController.php:22 msgid "Deployment details" msgstr "Dettagli di distribuzione" #: application/forms/SettingsForm.php:138 msgid "Deployment mode" msgstr "Modalità di distribuzione" #: application/forms/SettingsForm.php:147 msgid "Deployment mode for Icinga 1 configuration" msgstr "Modalità di distribuzione per la configurazione di Icinga 1" #: library/Director/Web/Widget/DeploymentInfo.php:77 msgid "Deployment time" msgstr "Tempo di distribuzione" #: configuration.php:143 #: application/controllers/ConfigController.php:50 #: library/Director/Web/Tabs/InfraTabs.php:36 msgid "Deployments" msgstr "Distribuzioni" #: application/forms/IcingaCommandArgumentForm.php:31 #: application/forms/SyncRuleForm.php:36 #: application/forms/ImportSourceForm.php:24 #: application/forms/IcingaTemplateChoiceForm.php:56 #: application/forms/IcingaObjectFieldForm.php:133 #: application/forms/IcingaServiceSetForm.php:100 #: application/forms/ImportRowModifierForm.php:52 #: application/forms/DirectorDatafieldForm.php:159 msgid "Description" msgstr "Descrizione" #: application/forms/IcingaCommandArgumentForm.php:32 msgid "Description of the argument" msgstr "Descrizione dell'argomento" #: library/Director/Web/Table/SyncpropertyTable.php:63 msgid "Destination" msgstr "Destinazione" #: application/forms/SyncPropertyForm.php:48 msgid "Destination Field" msgstr "Campo di destinazione" #: application/controllers/HealthController.php:25 msgid "" "Did you know that you can run this entire Health Check (or just some " "sections) as an Icinga Check on a regular base?" msgstr "" "Sapevi che puoi eseguire questo Health Check (o solo alcune sezioni) " "come Icinga Check su base regolare?" #: application/controllers/ConfigController.php:406 #: library/Director/Web/Widget/ActivityLogInfo.php:368 msgid "Diff" msgstr "Diff" #: library/Director/Web/Widget/DeployedConfigInfoHeader.php:74 msgid "Diff with other config" msgstr "Differenza con altre configurazioni" #: library/Director/Web/Table/TemplateUsageTable.php:55 msgid "Direct" msgstr "Diretto" #: application/controllers/DaemonController.php:19 #: application/controllers/DaemonController.php:21 msgid "Director Background Daemon" msgstr "Director Background Daemon" #: application/controllers/HealthController.php:17 msgid "Director Health" msgstr "Director Health" #: application/controllers/KickstartController.php:13 msgid "Director Kickstart Wizard" msgstr "Director Kickstart Wizard" #: library/Director/Dashboard/Dashlet/SettingsDashlet.php:11 msgid "Director Settings" msgstr "Impostazioni Director" #: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:79 msgid "Director database schema has not been created yet" msgstr "Lo schema del database Director non è stato ancora creato" #: application/forms/IcingaDependencyForm.php:159 msgid "Disable Checks" msgstr "Disattivare i Checks" #: application/forms/IcingaDependencyForm.php:167 msgid "Disable Notifications" msgstr "Disattivare le notifiche" #: application/forms/SettingsForm.php:54 msgid "Disable all Jobs" msgstr "Disattiva tutti i Jobs" #: application/forms/DirectorJobForm.php:37 #: library/Director/Web/Form/DirectorObjectForm.php:1255 msgid "Disabled" msgstr "Disabilitato" #: application/forms/IcingaCommandForm.php:80 msgid "Disabled by default, and should only be used in rare cases." msgstr "" "Disabilitato per impostazione predefinita e deve essere utilizzato solo in rari casi." #: library/Director/Web/Form/DirectorObjectForm.php:1256 msgid "Disabled objects will not be deployed" msgstr "Gli oggetti disabilitati non verranno distribuiti" #: application/forms/IcingaTimePeriodForm.php:20 #: library/Director/Web/Form/DirectorObjectForm.php:1271 msgid "Display Name" msgstr "Nome da visualizzare" #: application/forms/IcingaUserForm.php:133 #: application/forms/IcingaHostForm.php:333 msgid "Display name" msgstr "Nome da visualizzare" #: library/Director/Web/Table/CustomvarTable.php:42 msgid "Distinct Commands" msgstr "Comandi distinti" #: library/Director/Dashboard/DataDashboard.php:15 msgid "Do more with custom data" msgstr "Fai di più con i dati personalizzati" #: application/forms/SelfServiceSettingsForm.php:36 msgid "Do not transform at all" msgstr "Non trasformare affatto" #: library/Director/Web/SelfService.php:104 #: library/Director/Web/SelfService.php:157 msgid "Documentation" msgstr "Documentazione" #: library/Director/IcingaConfig/StateFilterSet.php:21 msgid "Down" msgstr "Giù" #: application/controllers/BasketController.php:212 #: application/controllers/SchemaController.php:80 #: library/Director/Web/SelfService.php:227 #: library/Director/Web/SelfService.php:240 msgid "Download" msgstr "Scarica" #: library/Director/Web/Widget/AdditionalTableActions.php:59 msgid "Download as JSON" msgstr "Scarica come JSON" #: application/forms/SelfServiceSettingsForm.php:70 msgid "Download from a custom url" msgstr "Scarica da un URL personalizzato" #: application/forms/SelfServiceSettingsForm.php:69 msgid "Download from packages.icinga.com" msgstr "Scarica da packages.icinga.com" #: library/Director/IcingaConfig/TypeFilterSet.php:30 msgid "Downtime ends" msgstr "Fine Downtime" #: application/forms/IcingaScheduledDowntimeForm.php:21 msgid "Downtime name" msgstr "Nome Downtime" #: library/Director/IcingaConfig/TypeFilterSet.php:31 msgid "Downtime removed" msgstr "Downtime rimosso" #: library/Director/IcingaConfig/TypeFilterSet.php:29 msgid "Downtime starts" msgstr "Downtime partito" #: application/forms/IcingaForgetApiKeyForm.php:22 msgid "Drop Self Service API key" msgstr "Elimina Self Service API key" #: library/Director/DataType/DataTypeDatalist.php:143 msgid "Dropdown (list values only)" msgstr "Menu a tendina (solo valori elenco)" #: application/forms/IcingaScheduledDowntimeForm.php:52 #: library/Director/Web/Widget/DeploymentInfo.php:83 #: library/Director/Web/Widget/SyncRunDetails.php:26 msgid "Duration" msgstr "Durata" #: application/controllers/DatafieldController.php:37 msgid "Edit a Field" msgstr "Modifica un campo" #: application/controllers/DataController.php:155 msgid "Edit list" msgstr "Modifica elenco" #: library/Director/DataType/DataTypeDatalist.php:137 msgid "Element behavior" msgstr "Comportamento dell'elemento" #: application/forms/IcingaUserForm.php:36 msgid "Email" msgstr "E-Mail" #: application/forms/SettingsForm.php:69 msgid "Enable audit log" msgstr "Abilita audit log" #: library/Director/Web/Form/DirectorObjectForm.php:1405 msgid "Enable event handler" msgstr "Abilita event handler" #: library/Director/Web/Form/DirectorObjectForm.php:1417 msgid "Enable flap detection" msgstr "Abilita flap detection" #: application/forms/SyncRuleForm.php:25 #: application/forms/IcingaEndpointForm.php:24 #: library/Director/Web/Table/ObjectsTableEndpoint.php:19 msgid "Endpoint" msgstr "Endpoint" #: application/forms/KickstartForm.php:117 msgid "Endpoint Name" msgstr "Nome endpoint" #: application/forms/IcingaEndpointForm.php:31 msgid "Endpoint address" msgstr "Indirizzo endpoint" #: application/forms/IcingaEndpointForm.php:18 msgid "Endpoint template name" msgstr "Nome template endpoint" #: library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:17 #: library/Director/Import/ImportSourceCoreApi.php:59 msgid "Endpoints" msgstr "Endpoints" #: application/controllers/PhperrorController.php:14 #: application/controllers/PhperrorController.php:53 msgid "Error" msgstr "Errore" #: application/forms/IcingaHostForm.php:86 msgid "Establish connection" msgstr "Stabilire una connessione" #: application/forms/IcingaServiceForm.php:613 msgid "" "Evaluates the apply for rule for all objects with the custom attribute " "specified. E.g selecting \"host.vars.custom_attr\" will generate \"for " "(config in host.vars.array_var)\" where \"config\" will be accessible " "through \"$config$\". NOTE: only custom variables of type \"Array\" are " "eligible." msgstr "" "Calcola la regola Apply per tutti gli oggetti con l'attributo personalizzato specificato. " "Ad esempio, selezionando \"host.vars.custom_attr\" genererà \"for (config in host.vars.array_var)\" " "dove \"config\" é accessibile tramite \"$config$\". NOTA: sono ammesse solo le variabili " "personalizzate di tipo \"Array\". " #: library/Director/Web/Form/DirectorObjectForm.php:1309 msgid "Event command" msgstr "Event command" #: library/Director/Web/Form/DirectorObjectForm.php:1310 msgid "Event command definition" msgstr "Definizione event command" #: application/forms/IcingaScheduledDowntimeForm.php:37 msgid "Every related downtime will show this comment" msgstr "Ogni downtime correlato mostrerà questo commento" #: application/forms/IcingaTimePeriodForm.php:70 msgid "Exclude other time periods from this." msgstr "Escludere altri periodi di tempo da questo." #: application/forms/IcingaTimePeriodForm.php:67 msgid "Exclude period" msgstr "Escludi periodo" #: library/Director/Web/Form/DirectorObjectForm.php:1387 msgid "Execute active checks" msgstr "Esegui checks attivi" #: application/forms/DirectorJobForm.php:48 msgid "Execution interval for this job, in seconds" msgstr "Intervallo di esecuzione per questo Job, in secondi" #: application/forms/SyncPropertyForm.php:250 msgid "Existing Data Lists" msgstr "Elenchi di dati esistenti" #: application/forms/SyncPropertyForm.php:235 msgid "Existing templates" msgstr "Elenchi di template esistenti" #: application/forms/SyncPropertyForm.php:178 msgid "Expert mode" msgstr "Expert mode" #: library/Director/DataType/DataTypeDatalist.php:147 msgid "Extend the list with new values" msgstr "Estendi l'elenco con nuovi valori" #: library/Director/Web/Tabs/ObjectsTabs.php:34 msgid "External" msgstr "Esterno" #: application/forms/BasketForm.php:18 msgid "External Command Definitions" msgstr "Definizione comandi esterni" #: library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:19 msgid "External Commands" msgstr "Comandi esterni" #: library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:12 msgid "" "External Commands have been defined in your local Icinga 2 Configuration." msgstr "" "I comandi esterni sono stati definiti nella configurazione Icinga 2 locale." #: library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:19 msgid "External Notification Commands" msgstr "Comandi di notifica esterni" #: library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:12 #: library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:12 msgid "" "External Notification Commands have been defined in your local Icinga 2 " "Configuration. " msgstr "" "I comandi di notifica esterni sono stati definiti nella configurazione Icinga2 locale." #: library/Director/Web/Widget/BackgroundDaemonDetails.php:68 msgid "FQDN" msgstr "FQDN" #: library/Director/Web/Widget/DeploymentInfo.php:141 msgid "Failed" msgstr "Fallito" #: application/forms/IcingaImportObjectForm.php:42 #, php-format msgid "Failed to import %s \"%s\"" msgstr "Importazione di %s \"%s\" fallita" #: application/forms/IcingaObjectFieldForm.php:196 msgid "Field has been removed" msgstr "Il campo è stato rimosso" #: application/forms/DirectorDatafieldForm.php:141 #: library/Director/Web/Table/DatafieldTable.php:48 #: library/Director/Web/Table/IcingaObjectDatafieldTable.php:50 msgid "Field name" msgstr "Nome del campo" #: application/forms/DirectorDatafieldForm.php:177 msgid "Field type" msgstr "Tipo di campo" #: library/Director/Web/Tabs/ObjectTabs.php:103 msgid "Fields" msgstr "Campi" #: library/Director/Web/Table/ConfigFileDiffTable.php:82 #: library/Director/Web/Table/GeneratedConfigFileTable.php:84 msgid "File" msgstr "File" #: application/forms/SyncRuleForm.php:79 #: application/forms/SyncPropertyForm.php:102 msgid "Filter Expression" msgstr "Espressione filtro" #: configuration.php:52 msgid "Filter available notification apply rules" msgstr "Filtra le notifiche disponibili per applicare le regole" #: configuration.php:45 msgid "Filter available service apply rules" msgstr "Filtra i servizi disponibili per applicare le regole" #: configuration.php:59 msgid "" "Filter available service set templates. Use asterisks (*) as wildcards, like " "in DB* or *net*" msgstr "" "Filtra i template di set di servizi disponibili. Usa gli asterischi (*) come " "caratteri wildcards, come in DB* o *net*" #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:29 #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:27 msgid "Filter method" msgstr "Metodo di filtro" #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:33 msgid "First Element" msgstr "Primo elemento" #: application/forms/IcingaNotificationForm.php:197 msgid "First notification delay" msgstr "Primo ritardo di notifica" #: application/forms/IcingaScheduledDowntimeForm.php:43 msgid "Fixed" msgstr "Fissato" #: library/Director/IcingaConfig/TypeFilterSet.php:33 msgid "Flapping" msgstr "Flapping" #: library/Director/IcingaConfig/TypeFilterSet.php:35 msgid "Flapping ends" msgstr "Flapping terminato" #: library/Director/Web/Form/DirectorObjectForm.php:1438 msgid "" "Flapping lower bound in percent for a service to be considered not flapping" msgstr "" "Flapping limite inferiore in percentuale per un servizio da considerare non flapping" #: library/Director/IcingaConfig/TypeFilterSet.php:34 msgid "Flapping starts" msgstr "Flapping iniziato" #: library/Director/Web/Form/DirectorObjectForm.php:1425 msgid "Flapping threshold (high)" msgstr "Flapping soglia (alta)" #: library/Director/Web/Form/DirectorObjectForm.php:1436 msgid "Flapping threshold (low)" msgstr "Flapping soglia (bassa)" #: library/Director/Web/Form/DirectorObjectForm.php:1427 msgid "Flapping upper bound in percent for a service to be considered flapping" msgstr "" "Flapping limite superiore in percentuale per un servizio da considerare flapping" #: application/forms/IcingaCloneObjectForm.php:33 msgid "Flatten all inherited properties, strip imports" msgstr "Appiattire tutte le proprietà ereditate, rimuovere le importazioni" #: application/forms/SelfServiceSettingsForm.php:87 msgid "Flush API directory" msgstr "Svuota directory API" #: library/Director/Web/SelfService.php:223 msgid "For manual configuration" msgstr "Per la configurazione manuale" #: library/Director/Job/ConfigJob.php:181 msgid "Force rendering" msgstr "Forza il rendering" #: library/Director/Objects/DirectorDatafield.php:160 #, php-format msgid "Form element could not be created, %s is missing" msgstr "Impossibile creare l'elemento del modulo,%s mancante" #: library/Director/Web/Form/QuickForm.php:518 #: library/Director/Web/Form/QuickForm.php:545 msgid "Form has successfully been sent" msgstr "Il modulo è stato inviato con successo" #: application/forms/IcingaHostVarForm.php:32 #: application/forms/IcingaServiceVarForm.php:32 msgid "Format" msgstr "Formato" #: library/Director/Web/Widget/ActivityLogInfo.php:388 msgid "Former object" msgstr "Oggetto precedente" #: application/forms/SelfServiceSettingsForm.php:24 msgid "Fully qualified domain name (FQDN)" msgstr "Nome di dominio completo (FQDN)" #: application/forms/IcingaGenerateApiKeyForm.php:24 msgid "Generate Self Service API key" msgstr "Genera Self Service API key" #: library/Director/Web/SelfService.php:121 msgid "Generate a new key" msgstr "Genera una nuova chiave" #: application/controllers/ConfigController.php:262 msgid "Generated config" msgstr "Config generata" #: application/controllers/HostController.php:149 #: application/controllers/HostController.php:230 msgid "Generated from host vars" msgstr "Generato da host vars" #: library/Director/Dashboard/AlertsDashboard.php:17 msgid "Get alerts when something goes wrong" msgstr "Ricevi avvisi quando qualcosa va storto" #: library/Director/Dashboard/Dashlet/CustomvarDashlet.php:17 msgid "Get an overview of used CustomVars and their variants" msgstr "Ottieni una panoramica dei CustomVar usati e delle loro varianti" #: application/controllers/ConfigController.php:222 msgid "Global Director Settings" msgstr "Impostazioni Director globale" #: library/Director/Web/SelfService.php:97 msgid "Global Self Service Setting" msgstr "Impostazione Self Service globale" #: application/forms/SelfServiceSettingsForm.php:44 msgid "Global Zones" msgstr "Zone globali" #: application/forms/IcingaZoneForm.php:22 msgid "Global zone" msgstr "Zona globale" #: library/Director/PropertyModifier/PropertyModifierJoin.php:13 msgid "Glue" msgstr "Link" #: library/Director/Web/ActionBar/DirectorBaseActionBar.php:40 #, php-format msgid "Go back to \"%s\" Dashboard" msgstr "Torna a \"%s\" Dashboard" #: library/Director/Job/ConfigJob.php:207 msgid "Grace period" msgstr "Periodo di grazia" #: library/Director/Web/Table/GroupMemberTable.php:59 msgid "Group" msgstr "Gruppo" #: application/forms/IcingaHostForm.php:233 msgid "" "Group has been inherited, but will be overridden by locally assigned group(s)" msgstr "" "Il gruppo è stato ereditato, ma verrà sostituito dai gruppi assegnati localmente" #: application/forms/SyncPropertyForm.php:317 msgid "Group membership" msgstr "Membro del gruppo" #: library/Director/Web/Controller/ObjectController.php:264 #, php-format msgid "Group membership: %s" msgstr "Membro del gruppo: %s" #: library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:17 msgid "" "Grouping your Services into Sets allow you to quickly assign services often " "used together in a single operation all at once" msgstr "" "Raggruppare i tuoi servizi in set ti consente di assegnare rapidamente i servizi " "spesso utilizzati contemporaneamente con un'unica operazione " #: application/forms/IcingaUserForm.php:109 #: application/forms/IcingaHostForm.php:203 #: application/forms/IcingaServiceForm.php:635 #: library/Director/Web/Tabs/ObjectsTabs.php:61 msgid "Groups" msgstr "Gruppi" #: library/Director/Import/ImportSourceRestApi.php:78 msgid "HTTP (this is plaintext!)" msgstr "HTTP (questo è in chiaro)" #: library/Director/Import/ImportSourceRestApi.php:173 msgid "HTTP proxy" msgstr "HTTP proxy" #: library/Director/Import/ImportSourceRestApi.php:77 msgid "HTTPS (strongly recommended)" msgstr "HTTPS (fortemente raccomandato)" #: library/Director/Web/Tabs/MainTabs.php:31 msgid "Health" msgstr "Health" #: library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:17 msgid "Here you can find all single services directly attached to single hosts" msgstr "" "Qui puoi trovare tutti i singoli servizi direttamente associati ai singoli host " #: library/Director/Web/Table/CoreApiFieldsTable.php:83 #: library/Director/DataType/DataTypeString.php:27 msgid "Hidden" msgstr "Nascosto" #: library/Director/Web/Widget/AdditionalTableActions.php:70 msgid "Hide SQL" msgstr "Nascondi SQL" #: application/controllers/HealthController.php:23 msgid "Hint: Check Plugin" msgstr "Suggerimento: Check-Plugin" #: application/forms/IcingaServiceForm.php:154 msgid "Hints regarding this service" msgstr "Suggerimenti riguardanti questo servizio" #: library/Director/Web/Tabs/ImportsourceTabs.php:45 #: library/Director/Web/Tabs/ObjectTabs.php:95 #: library/Director/Web/Tabs/SyncRuleTabs.php:43 msgid "History" msgstr "History" #: application/controllers/ServiceController.php:53 #: application/forms/SyncRuleForm.php:12 #: application/forms/IcingaHostVarForm.php:15 #: application/forms/IcingaServiceForm.php:583 #: library/Director/TranslationDummy.php:13 #: library/Director/Web/Table/ObjectsTableEndpoint.php:20 msgid "Host" msgstr "Host" #: application/controllers/SuggestController.php:259 #: library/Director/Objects/IcingaService.php:740 msgid "Host Custom variables" msgstr "Host variabili personalizzate" #: application/forms/SyncRuleForm.php:13 #: application/forms/BasketForm.php:20 msgid "Host Group" msgstr "Gruppo Host" #: library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:11 msgid "Host Groups" msgstr "Gruppi di Host" #: application/forms/SelfServiceSettingsForm.php:19 msgid "Host Name" msgstr "Nome Host" #: application/forms/IcingaHostForm.php:157 #: application/forms/IcingaHostForm.php:174 msgid "Host Template" msgstr "Host Template" #: application/forms/BasketForm.php:21 msgid "Host Template Choice" msgstr "Scelta del template Host" #: application/forms/BasketForm.php:22 #: library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:11 msgid "Host Templates" msgstr "Host Templates" #: application/forms/IcingaHostSelfServiceForm.php:35 #: application/forms/IcingaHostForm.php:308 msgid "Host address" msgstr "Indirizzo Host" #: application/forms/IcingaHostSelfServiceForm.php:37 #: application/forms/IcingaHostForm.php:310 msgid "" "Host address. Usually an IPv4 address, but may be any kind of address your " "check plugin is able to deal with" msgstr "" "Indirizzo Host. Di solito un indirizzo IPv4, ma può essere qualsiasi tipo di " "indirizzo con cui il plug-in riesce a lavorare" #: configuration.php:64 msgid "Host configs" msgstr "Configurazioni Host" #: library/Director/DataType/DataTypeDirectorObject.php:55 msgid "Host groups" msgstr "Gruppi Host" #: application/forms/IcingaHostSelfServiceForm.php:25 msgid "Host name" msgstr "Nome Host" #: application/forms/SelfServiceSettingsForm.php:25 msgid "Host name (local part, without domain)" msgstr "Nome Host (parte locale, senza dominio)" #: library/Director/Dashboard/Dashlet/HostObjectDashlet.php:13 msgid "Host objects" msgstr "Oggetti Hosts" #: application/controllers/SuggestController.php:249 #: application/controllers/SuggestController.php:258 #: library/Director/Objects/IcingaHost.php:156 #: library/Director/Objects/IcingaService.php:739 msgid "Host properties" msgstr "Proprietà dell'Host" #: application/controllers/TemplatechoiceController.php:17 msgid "Host template choice" msgstr "Scelta del template Host" #: application/controllers/TemplatechoicesController.php:19 msgid "Host template choices" msgstr "Scelta del template Host" #: application/forms/IcingaHostGroupForm.php:14 msgid "Hostgroup" msgstr "Gruppo Host" #: library/Director/Import/ImportSourceCoreApi.php:61 msgid "Hostgroups" msgstr "Gruppi di Host" #: application/forms/IcingaHostForm.php:206 msgid "" "Hostgroups that should be directly assigned to this node. Hostgroups can be " "useful for various reasons. You might assign service checks based on " "assigned hostgroup. They are also often used as an instrument to enforce " "restricted views in Icinga Web 2. Hostgroups can be directly assigned to " "single hosts or to host templates. You might also want to consider assigning " "hostgroups using apply rules" msgstr "" "Hostgroup che devono essere assegnati direttamente a questo nodo. Gli hostgroup " "possono essere utili per vari motivi. È possibile assegnare service checks basati " "su hostgroup. Inoltre, vengono spesso utilizzati come strumento per imporre " "visualizzazioni limitate in Icinga Web 2. Gli hostgroup possono essere direttamente assegnati " "a singoli host o a template host. Potresti anche prendere in considerazione l'assegnazione " "di hostgroup utilizzando le regole apply" #: application/forms/IcingaHostForm.php:39 #: library/Director/Web/Table/IcingaServiceSetHostTable.php:38 msgid "Hostname" msgstr "Nome Host" #: library/Director/Import/ImportSourceRestApi.php:185 msgid "Hostname, IP or :" msgstr "Nome Host, IP o :" #: configuration.php:118 #: application/forms/IcingaScheduledDowntimeForm.php:85 #: application/forms/IcingaDependencyForm.php:100 #: application/forms/IcingaNotificationForm.php:89 #: application/forms/IcingaServiceForm.php:693 #: library/Director/Dashboard/Dashlet/HostsDashlet.php:11 #: library/Director/Web/Table/CustomvarVariantsTable.php:58 #: library/Director/Web/Table/CustomvarTable.php:43 #: library/Director/Import/ImportSourceCoreApi.php:60 #: library/Director/DataType/DataTypeDirectorObject.php:54 #: library/Director/IcingaConfig/StateFilterSet.php:19 msgid "Hosts" msgstr "Hosts" #: application/controllers/ServicesetController.php:81 #, php-format msgid "Hosts using this set: %s" msgstr "Hosts che usano questo Set: %s" #: application/forms/IcingaScheduledDowntimeForm.php:54 msgid "" "How long the downtime lasts. Only has an effect for flexible (non-fixed) " "downtimes. Time in seconds, supported suffixes include ms (milliseconds), s " "(seconds), m (minutes), h (hours) and d (days). To express \"90 minutes\" " "you might want to write 1h 30m" msgstr "" "Quanto dura il tempo di downtime. Ha effetto solo per flexible downtime (non fissi)." "Tempo in secondi, i suffissi supportati includono ms (millisecondi), s (secondi), " "m (minuti), h (ore) e d (giorni ). Per esprimere \"90 minuti\" potresti voler scrivere 1h 30m" #: application/forms/DeployFormsBug7530.php:110 msgid "I know what I'm doing, deploy anyway" msgstr "So cosa sto facendo, distribuire comunque" #: application/forms/DeployFormsBug7530.php:111 msgid "I know, please don't bother me again" msgstr "Lo so, per favore non disturbarmi di nuovo" #: application/forms/IcingaEndpointForm.php:32 msgid "IP address / hostname of remote node" msgstr "Indirizzo IP / nome Host del nodo remoto" #: application/forms/KickstartForm.php:129 msgid "" "IP address / hostname of your Icinga node. Please note that this information " "will only be used for the very first connection to your Icinga instance. The " "Director then relies on a correctly configured Endpoint object. Correctly " "configures means that either it's name is resolvable or that it's host " "property contains either an IP address or a resolvable host name. Your " "Director must be able to reach this endpoint" msgstr "" "Indirizzo IP / nome host del nodo Icinga. Tenere presente che queste informazioni " "verranno utilizzate solo per la prima connessione all'istanza Icinga. Il Director " "si basa quindi su un oggetto Endpoint configurato correttamente. Configurazione " "corretta significa che il nome è risolvibile o che la sua proprietà Host contiene " "un indirizzo IP o un nome Host risolvibile. Il tuo Director deve essere in grado " "di raggiungere questo endpoint" #: application/forms/IcingaHostSelfServiceForm.php:43 #: application/forms/IcingaHostForm.php:316 msgid "IPv6 address" msgstr "Indirizzo IPv6" #: library/Director/Web/Controller/ObjectsController.php:330 #, php-format msgid "Icinga %s Sets" msgstr "Icinga %s Sets" #: application/controllers/InspectController.php:39 #, php-format msgid "Icinga 2 - Objects: %s" msgstr "Oggetti Icinga 2: %s" #: application/controllers/InspectController.php:152 msgid "Icinga 2 API - Status" msgstr "Icinga 2 API - Stato" #: library/Director/Web/SelfService.php:192 msgid "Icinga 2 Client documentation" msgstr "Icinga 2 documentazione client" #: application/forms/IcingaHostForm.php:135 #: application/forms/IcingaServiceForm.php:683 msgid "Icinga Agent and zone settings" msgstr "Icinga Agent e proprietá della zona" #: library/Director/Dashboard/Dashlet/ApiUserObjectDashlet.php:13 msgid "Icinga Api users" msgstr "Utene Icinga API" #: application/forms/IcingaCommandArgumentForm.php:39 #: application/forms/IcingaCommandArgumentForm.php:78 msgid "Icinga DSL" msgstr "Icinga DSL" #: configuration.php:83 msgid "Icinga Director" msgstr "Icinga Director" #: application/controllers/DashboardController.php:39 msgid "Icinga Director - Main Dashboard" msgstr "Icinga Director - Dashboard principale" #: application/controllers/DaemonController.php:45 msgid "Icinga Director Background Daemon" msgstr "Icinga Director Background Daemon" #: library/Director/Dashboard/DirectorDashboard.php:15 msgid "Icinga Director Configuration" msgstr "Configurzione Icinga Director" #: application/forms/SettingsForm.php:35 msgid "" "Icinga Director decides to deploy objects like CheckCommands to a global " "zone. This defaults to \"director-global\" but might be adjusted to a custom " "Zone name" msgstr "" "Icinga Director decide di distribuire oggetti come CheckCommands in una zona globale. " "L'impostazione predefinita è \"director-global\" ma potrebbe essere adattata a un nome " "di zona personalizzato" #: application/controllers/PhperrorController.php:57 msgid "" "Icinga Director depends on the following modules, please install/upgrade as " "required" msgstr "" "Icinga Director dipende dai seguenti moduli, si prega di installare / aggiornare" "come richiesto" #: library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:17 msgid "" "Icinga Director offers a Self Service API, allowing new Icinga nodes to " "register themselves" msgstr "" "Icinga Director offre un'API Self Service che consente ai nuovi nodi Icinga " "di registrarsi" #: application/forms/KickstartForm.php:127 msgid "Icinga Host" msgstr "Icinga Host" #: library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:11 msgid "Icinga Infrastructure" msgstr "Icinga Infrastruttura" #: application/forms/SettingsForm.php:43 msgid "Icinga Package Name" msgstr "Icinga Package Name" #: library/Director/Web/Form/DirectorObjectForm.php:1139 msgid "" "Icinga cluster zone. Allows to manually override Directors decisions of " "where to deploy your config to. You should consider not doing so unless you " "gained deep understanding of how an Icinga Cluster stack works" msgstr "" "Zona cluster Icinga. Consente di sovrascrivere manualmente le decisioni del " "Director su dove distribuire la configurazione. Si dovrebbe considerare di non " "farlo a meno che non si sia acquisita una profonda conoscenza di come funziona " "lo stack Cluster Icinga" #: application/forms/IcingaHostGroupForm.php:16 msgid "Icinga object name for this host group" msgstr "Nome oggetto Icinga per questo gruppo Host" #: application/forms/IcingaHostForm.php:46 msgid "" "Icinga object name for this host. This is usually a fully qualified host " "name but it could basically be any kind of string. To make things easier for " "your users we strongly suggest to use meaningful names for templates. E.g. " "\"generic-host\" is ugly, \"Standard Linux Server\" is easier to understand" msgstr "" "Nome dell'oggetto Icinga per questo Host. Di norma è un fully qualified host " "completo ma potrebbe essere praticamente qualsiasi tipo di stringa. Per rendere " "le cose più comprensibili per i tuoi utenti ti consigliamo vivamente di usare nomi " "significativi per i template. Ad esempio \"generic-host\" è brutto, " "\"Standard Linux Server\" è più facile da capire" #: application/forms/IcingaServiceGroupForm.php:16 msgid "Icinga object name for this service group" msgstr "Nome oggetto Icinga per questo gruppo di servizi" #: application/forms/IcingaUserGroupForm.php:19 msgid "Icinga object name for this user group" msgstr "Nome oggetto Icinga per questo gruppo di utenti" #: application/forms/SettingsForm.php:114 msgid "Icinga v1.x" msgstr "Icinga v1.x" #: application/forms/SettingsForm.php:100 msgid "" "Icinga v2.11.0 breaks some configurations, the Director will warn you before " "every deployment in case your config is affected. This setting allows to " "hide this warning." msgstr "" "Icinga v2.11.0 rompe alcune configurazioni, il Director ti avviserà prima di ogni " "distribuzione nel caso in cui la tua configurazione ne sia colpita. Questa " "impostazione consente di soprimere questo avviso." #: application/forms/SettingsForm.php:113 msgid "Icinga v2.x" msgstr "Icinga v2.x" #: application/forms/IcingaHostForm.php:77 msgid "Icinga2 Agent" msgstr "Icinga2 Agent" #: library/Director/Web/Form/DirectorObjectForm.php:1515 msgid "Icon image" msgstr "Immagine Icon" #: library/Director/Web/Form/DirectorObjectForm.php:1524 msgid "Icon image alt" msgstr "Immagine Icon alternativa" #: library/Director/Web/Table/CoreApiFieldsTable.php:76 msgid "Id" msgstr "Id" #: application/forms/IcingaCommandForm.php:53 msgid "Identifier for the Icinga command you are going to create" msgstr "Identificatore del comando Icinga che stai per creare" #: application/forms/IcingaCommandForm.php:79 msgid "If enabled you can not define arguments." msgstr "Se abilitato non è possibile definire argomenti." #: application/forms/SyncRuleForm.php:63 #: application/forms/BasketForm.php:51 msgid "Ignore" msgstr "Ignorare" #: application/forms/SettingsForm.php:91 msgid "Ignore Bug #7530" msgstr "Ignora Bug #7530" #: application/forms/IcingaDependencyForm.php:175 msgid "Ignore Soft States" msgstr "Ignora Soft States" #: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:33 msgid "Import Source" msgstr "Sorgente di importazione" #: application/forms/BasketForm.php:31 msgid "Import Sources" msgstr "Sorgente di importazione" #: library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:14 msgid "Import data sources" msgstr "Sorgente Import per i dati" #: application/forms/IcingaImportObjectForm.php:26 #, php-format msgid "Import external \"%s\"" msgstr "Sorgente import esterno \"%s\"" #: application/controllers/ImportrunController.php:14 #: application/controllers/ImportrunController.php:15 msgid "Import run" msgstr "Esegui importazione" #: application/controllers/ImportsourceController.php:184 #, php-format msgid "Import run history: %s" msgstr "Cronologia esecuzioni importanzioni: %s" #: application/controllers/ImportsourcesController.php:46 #: library/Director/Web/Tabs/ImportTabs.php:20 #: library/Director/Web/Tabs/ImportsourceTabs.php:37 #: library/Director/Job/ImportJob.php:80 msgid "Import source" msgstr "Sorgente importazione" #: application/forms/ImportSourceForm.php:15 msgid "Import source name" msgstr "Nome della sorgente di importazione" #: application/controllers/ImportsourceController.php:139 #, php-format msgid "Import source preview: %s" msgstr "Anteprima della sorgente di importazione: %s" #: application/controllers/ImportsourceController.php:82 #: application/controllers/ImportsourceController.php:110 #, php-format msgid "Import source: %s" msgstr "Sorgente di importazione: %s" #: library/Director/Web/Form/DirectorObjectForm.php:1229 msgid "" "Importable templates, add as many as you want. Please note that order " "matters when importing properties from multiple templates: last one wins" msgstr "" "Template importabili, aggiungine quanti ne desideri. Tieni presente che " "l'ordine é importante quando importi proprietà da più template: l'ultimo vince" #: application/forms/ImportRunForm.php:33 msgid "Imported new data from this Import Source" msgstr "Nuovi dati importati da questa sorgente di importazione" #: library/Director/Web/Table/ImportrunTable.php:32 msgid "Imported rows" msgstr "Righe importate" #: application/forms/IcingaImportObjectForm.php:16 msgid "" "Importing an object means that its type will change from \"external\" to " "\"object\". That way it will make part of the next deployment. So in case " "you imported this object from your Icinga node make sure to remove it from " "your local configuration before issueing the next deployment. In case of a " "conflict nothing bad will happen, just your config won't deploy." msgstr "" "L'importazione di un oggetto significa che il suo tipo cambierà da \"esterno\" a " "\"oggetto\". In questo modo farà parte della distribuzione successiva. Quindi, " "nel caso in cui tu abbia importato questo oggetto dal tuo nodo Icinga assicurati " "di rimuoverlo dalla configurazione locale prima di eseguire la distribuzione " "successiva. In caso di conflitto non accadrà nulla di grave, solo la configurazione " "non verrà distribuita." #: library/Director/Web/Form/DirectorObjectForm.php:1227 msgid "Imports" msgstr "Imports" #: application/controllers/SelfServiceController.php:104 msgid "" "In case an Icinga Admin provided you with a self service API token, this is " "where you can register new hosts" msgstr "" "Nel caso in cui un amministratore Icinga ti fornisse un token API self-service, " "è qui che puoi registrare nuovi host" #: application/forms/SelfServiceSettingsForm.php:176 msgid "" "In case the Icinga 2 Agent is already installed on the system, this " "parameter will allow you to configure if you wish to upgrade / downgrade to " "a specified version with the as well." msgstr "" "Nel caso in cui Icinga 2 Agent sia già installato sul sistema, questo parametro " "ti consentirà di configurare se desideri aggiornare / eseguire il downgrade anche " "a una versione specificata." #: application/forms/SelfServiceSettingsForm.php:143 msgid "" "In case the Icinga 2 Agent should be automatically installed, this has to be " "a string value like: 2.6.3" msgstr "" "Nel caso in cui Icinga 2 Agent venga installato automaticamente, questo deve " "essere un valore stringa come: 2.6.3" #: application/forms/SelfServiceSettingsForm.php:89 msgid "" "In case the Icinga Agent will accept configuration from the parent Icinga 2 " "system, it will possibly write data to /var/lib/icinga2/api/*. By setting " "this parameter to true, all content inside the api directory will be flushed " "before an eventual restart of the Icinga 2 Agent" msgstr "" "Nel caso in cui Icinga Agent accetti la configurazione dal sistema Icinga 2 padre," "probabilmente scriverà i dati su /var/lib/icinga2/api/*. Impostando questo " "parametro su true, tutto il contenuto all'interno della directory api verrà pulita" "prima di un eventuale riavvio dell'agente Icinga 2" #: library/Director/Import/ImportSourceRestApi.php:169 msgid "" "In case your API is only reachable through a proxy, please choose it's " "protocol right here" msgstr "" "Nel caso in cui la tua API sia raggiungibile solo attraverso un proxy, " "scegli il suo protocollo proprio qui" #: library/Director/Import/ImportSourceRestApi.php:193 msgid "In case your proxy requires authentication, please configure this here" msgstr "" "Nel caso in cui il proxy richieda l'autenticazione, puoi configurarlo qui" #: application/forms/IcingaTimePeriodForm.php:62 msgid "Include other time periods into this." msgstr "Includere altri periodi di tempo in questo." #: application/forms/IcingaTimePeriodForm.php:59 msgid "Include period" msgstr "Includi periodo" #: library/Director/Web/Table/TemplateUsageTable.php:56 msgid "Indirect" msgstr "Indiretto" #: application/controllers/HostController.php:140 #: application/controllers/HostController.php:218 msgid "Individual Service objects" msgstr "Oggetti Service individuali" #: library/Director/Web/Tabs/InfraTabs.php:43 msgid "Infrastructure" msgstr "Infrastruttura" #: application/forms/SyncPropertyForm.php:311 msgid "Inheritance (import)" msgstr "Ereditá (Import)" #: application/forms/IcingaHostForm.php:240 msgid "Inherited groups" msgstr "Gruppi ereditati" #: application/controllers/HostController.php:387 #, php-format msgid "Inherited service: %s" msgstr "Service eriditati: %s" #: application/controllers/HostController.php:538 #: library/Director/Web/Tabs/ObjectTabs.php:132 msgid "Inspect" msgstr "Ispezionare" #: application/controllers/InspectController.php:65 msgid "Inspect - object list" msgstr "Ispeziona - elenco oggetti" #: application/forms/SelfServiceSettingsForm.php:189 msgid "Install NSClient++" msgstr "Install NSClient++" #: application/forms/SelfServiceSettingsForm.php:59 msgid "Installation Source" msgstr "Fonte di installazione" #: application/views/scripts/phperror/dependencies.phtml:18 msgid "Installed" msgstr "Installato" #: application/forms/SelfServiceSettingsForm.php:152 msgid "Installer Hashes" msgstr "Hash di installazione" #: application/forms/IcingaCommandForm.php:25 msgid "Internal commands" msgstr "Comandi interni" #: application/controllers/SyncruleController.php:106 #, php-format msgid "It has been renamed since then, its former name was %s" msgstr "Da allora è stato rinominato, il suo nome precedente era %s" #: library/Director/Web/SelfService.php:68 msgid "" "It is not a good idea to do so as long as your Agent still has a valid Self " "Service API key!" msgstr "" "Non è una buona idea farlo finché il tuo agente ha ancora una chiave " "API self-service valida!" #: application/forms/IcingaTemplateChoiceForm.php:87 msgid "" "It will not be allowed to choose more than this many options. Setting it to " "one (1) will result in a drop-down box, a higher number will turn this into " "a multi-selection element." msgstr "" "Non sarà permesso scegliere più opzioni di queste preimpostate. Impostandolo " "su uno (1) si otterrà una casella Dropdown, un numero più alto lo trasformerà " "in un elemento a selezione multipla." #: library/Director/Web/Widget/ImportSourceDetails.php:37 msgid "" "It's currently unknown whether we are in sync with this Import Source. You " "should either check for changes or trigger a new Import Run." msgstr "" "Al momento non è noto se siamo sincronizzati con questa sorgente di importazione. " "È necessario verificare la presenza di modifiche o eseguire una nuova importazione." #: application/controllers/SyncruleController.php:66 msgid "" "It's currently unknown whether we are in sync with this rule. You should " "either check for changes or trigger a new Sync Run." msgstr "" "Al momento non è noto se siamo sincronizzati con questa regola. È necessario " "verificare la presenza di modifiche o eseguire una nuova sincronizzazione." #: application/forms/BasketUploadForm.php:130 #: application/forms/BasketForm.php:122 msgid "It's not allowed to store an empty basket" msgstr "Non è consentito conservare un Basket vuoto" #: application/controllers/JobController.php:98 msgid "Job" msgstr "Job" #: application/forms/BasketForm.php:33 msgid "Job Definitions" msgstr "Definizione Job" #: application/forms/DirectorJobForm.php:17 msgid "Job Type" msgstr "Tipologia Job" #: application/forms/DirectorJobForm.php:72 #: library/Director/Web/Table/JobTable.php:60 msgid "Job name" msgstr "Nome Job" #: application/controllers/JobController.php:23 #: application/controllers/JobController.php:55 #, php-format msgid "Job: %s" msgstr "Job: %s" #: application/controllers/JobsController.php:13 #: library/Director/Dashboard/Dashlet/JobDashlet.php:14 #: library/Director/Web/Tabs/ImportTabs.php:26 msgid "Jobs" msgstr "Jobs" #: library/Director/Web/Table/ActivityLogTable.php:81 msgid "Jump to this object" msgstr "Vai a questo oggetto" #: library/Director/Web/SelfService.php:245 msgid "Just download and run this script on your Linux Client Machine:" msgstr "" "Scarica ed esegui questo script sul tuo computer client Linux:" #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:57 msgid "Keep matching elements" msgstr "Mantieni gli elementi corrispondenti" #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:60 msgid "Keep only matching rows (Whitelist)" msgstr "Mantieni solo le righe corrispondenti (Whitelist)" #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:31 msgid "Keep the DN as is" msgstr "Mantieni DN" #: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:26 msgid "Keep the JSON string as is" msgstr "Mantieni la stringa JSON così com'è" #: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:18 msgid "Keep the property (hostname) as is" msgstr "Mantieni la proprietà (nome Host) così com'è" #: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:35 #: library/Director/PropertyModifier/PropertyModifierParseURL.php:40 msgid "Keep the property as is" msgstr "Mantieni la proprietà così com'è" #: application/forms/DirectorDatalistEntryForm.php:21 #: library/Director/Web/Table/DatalistEntryTable.php:54 msgid "Key" msgstr "Chiave" #: application/forms/ImportSourceForm.php:87 msgid "Key column name" msgstr "Nome della colonna chiave" #: application/controllers/KickstartController.php:12 #: application/controllers/IndexController.php:42 msgid "Kickstart" msgstr "Kickstart" #: application/forms/KickstartForm.php:315 #: library/Director/Dashboard/Dashlet/KickstartDashlet.php:11 msgid "Kickstart Wizard" msgstr "Assistente Kickstart" #: library/Director/Import/ImportSourceLdap.php:47 msgid "LDAP Search Base" msgstr "LDAP Search Base" #: application/forms/DirectorDatalistEntryForm.php:30 #: library/Director/Web/Table/DatalistEntryTable.php:55 #: library/Director/Web/Table/DatafieldTable.php:47 #: library/Director/Web/Table/IcingaObjectDatafieldTable.php:49 msgid "Label" msgstr "Etichetta" #: library/Director/Web/Widget/IcingaObjectInspection.php:58 msgid "Last Check Result" msgstr "Risultato ultimo check" #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:34 msgid "Last Element" msgstr "Ultimo elemento" #: application/forms/IcingaNotificationForm.php:208 msgid "Last notification" msgstr "Ultima notifica" #: library/Director/Web/Widget/DeployedConfigInfoHeader.php:67 msgid "Last related activity" msgstr "Ultima attività correlata" #: application/controllers/SyncruleController.php:102 msgid "Last sync run details" msgstr "Dettagli dell'ultima sincronizzazione" #: application/forms/IcingaCommandArgumentForm.php:69 msgid "" "Leave empty for non-positional arguments. Can be a positive or negative " "number and influences argument ordering" msgstr "" "Lascia vuoto per argomenti non posizionali. Può essere un numero positivo " "o negativo e influenza l'ordine degli argomenti" #: application/forms/DirectorDatafieldForm.php:44 msgid "" "Leaving custom variables in place while removing the related field is " "perfectly legal and might be a desired operation. This way you can no longer " "modify related custom variables in the Director GUI, but the variables " "themselves will stay there and continue to be deployed. When you re-add a " "field for the same variable later on, everything will continue to work as " "before" msgstr "" "Lasciare le variabili personalizzate mentre si rimuove il campo correlato è " "un'operazione perfettamente valida e potrebbe essere quella desiderata. " "In questo modo non è più possibile modificare le variabili personalizzate correlate " "nella GUI del Director, ma le variabili stesse rimarranno lì e continueranno a " "essere distribuite. Quando riaggiungi nuovamente un campo per la stessa " "variabile, tutto continuerà a funzionare come prima" #: application/forms/DirectorDatafieldForm.php:87 msgid "" "Leaving custom variables in place while renaming the related field is " "perfectly legal and might be a desired operation. This way you can no longer " "modify related custom variables in the Director GUI, but the variables " "themselves will stay there and continue to be deployed. When you re-add a " "field for the same variable later on, everything will continue to work as " "before" msgstr "" "Lasciare le variabili personalizzate in atto durante la ridenominazione del campo " "correlato è un'operazione perfettamente valida e potrebbe essere quella desiderata. " "In questo modo non è più possibile modificare le variabili personalizzate correlate " "nella GUI del Director, ma le variabili stesse rimarranno lì e continueranno a essere " "distribuite. Quando riaggiungi nuovamente un campo per la stessa variabile, tutto " "continuerà a funzionare come prima" #: library/Director/PropertyModifier/PropertyModifierMap.php:35 #: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:45 msgid "Let the import fail" msgstr "Lascia che l'importazione fallisca" #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:54 msgid "Let the whole Import Run fail" msgstr "Lascia che l'intera esecuzione dell'importazione fallisca" #: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:27 #: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:36 #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:32 #: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:19 #: library/Director/PropertyModifier/PropertyModifierParseURL.php:41 msgid "Let the whole import run fail" msgstr "Lascia che l'intera esecuzione dell'importazione fallisca" #: configuration.php:38 msgid "Limit access to the given comma-separated list of hostgroups" msgstr "" "Limitare l'accesso all'elenco di hostgroups separato da virgole" #: library/Director/Web/SelfService.php:238 msgid "Linux commandline" msgstr "Riga di comando di Linux" #: application/controllers/DataController.php:95 msgid "List Entries" msgstr "Elenca voci" #: application/controllers/DataController.php:159 msgid "List entries" msgstr "Elenca voci" #: application/forms/DirectorDatalistForm.php:13 #: library/Director/Web/Table/DatalistTable.php:31 msgid "List name" msgstr "Nome lista" #: application/forms/SettingsForm.php:155 msgid "" "Local directory to deploy Icinga 1.x configuration. Must be writable by " "icingaweb2. (e.g. /etc/icinga/director)" msgstr "" "Directory locale per distribuire la configurazione di Icinga 1.x. " "Deve essere scrivibile da icingaweb2. (ad es. /etc/icinga/director)" #: application/forms/IcingaEndpointForm.php:41 msgid "Log Duration" msgstr "Durata del Log" #: application/forms/IcingaAddServiceForm.php:67 #: library/Director/Web/Form/DirectorObjectForm.php:574 msgid "Main properties" msgstr "Proprietà principali" #: library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:12 msgid "" "Manage definitions for your Commands that should be executed as Check " "Plugins, Notifications or based on Events" msgstr "" "Gestisci le definizioni per i tuoi comandi che devono essere " "eseguiti come check plugin, notifiche o basati su eventi" #: library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:17 #, fuzzy msgid "" "Manage your Host Templates. Use Fields to make it easy for your users to get " "them customized." msgstr "" "Gestisci i tuoi Host template. Usa i campi per aggevolarne la " "personalizzazione ai tuoi utenti" #: library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:17 #, fuzzy msgid "" "Manage your Icinga 2 infrastructure: Masters, Zones, Satellites and more" msgstr "" "Gestisci la tua infrastruttura di Icinga2: Master, Zone, Satelliti e altro" #: library/Director/Dashboard/CommandsDashboard.php:17 #, fuzzy msgid "Manage your Icinga Commands" msgstr "Gestisci i tuoi Comandi Icinga" #: library/Director/Dashboard/HostsDashboard.php:16 #, fuzzy msgid "Manage your Icinga Hosts" msgstr "Gestisci i tuoi Icinga Hosts" #: library/Director/Dashboard/InfrastructureDashboard.php:18 #, fuzzy msgid "Manage your Icinga Infrastructure" msgstr "Gestisci Infrastuttura Icinga" #: library/Director/Dashboard/ServicesDashboard.php:18 #, fuzzy msgid "Manage your Icinga Service Checks" msgstr "Gestisci i tuoi Icinga2 Service Checks" #: library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:17 #, fuzzy msgid "" "Manage your Service Templates. Use Fields to make it easy for your users to " "get them customized." msgstr "" "Gestisci i tuoi Templates per i servizi. Usa i Campi per aggevolarne la " "personalizzazione ai tuoi utenti" #: application/forms/IcingaObjectFieldForm.php:142 #: application/forms/IcingaObjectFieldForm.php:147 #: library/Director/Web/Table/IcingaObjectDatafieldTable.php:51 #, fuzzy msgid "Mandatory" msgstr "Obbligatorio" #: application/forms/SettingsForm.php:143 #, fuzzy msgid "Master-less" msgstr "Senza Master" #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:35 #, fuzzy msgid "Match NULL value columns" msgstr "Match colonne valore NULL" #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:34 #, fuzzy msgid "Match boolean FALSE" msgstr "Match boolean FALSE" #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:33 #, fuzzy msgid "Match boolean TRUE" msgstr "Match boolean TRUE" #: library/Director/Web/Form/DirectorObjectForm.php:1350 #, fuzzy msgid "Max check attempts" msgstr "Massimo numero di ripetizioni dei controlli" #: library/Director/Web/Table/GroupMemberTable.php:60 #: library/Director/Web/Table/GroupMemberTable.php:65 #, fuzzy msgid "Member" msgstr "Membro" #: library/Director/Web/Tabs/ObjectTabs.php:114 #, fuzzy msgid "Members" msgstr "Membri" #: application/forms/SyncRuleForm.php:61 #, fuzzy msgid "Merge" msgstr "Unisci" #: application/forms/SyncPropertyForm.php:116 #, fuzzy msgid "Merge Policy" msgstr "Regole su Unisci" #: application/forms/IcingaTimePeriodRangeForm.php:23 #: application/forms/IcingaScheduledDowntimeRangeForm.php:24 #, fuzzy msgid "" "Might be monday, tuesday or 2016-01-28 - have a look at the documentation for " "more examples" msgstr "" "Per esempio lunedí, martedí, 2020-01-28 - consulta la documentazione per " "ulteriori esempi" #: application/forms/IcingaTemplateChoiceForm.php:73 #, fuzzy msgid "Minimum required" msgstr "Minimo richiesto" #: application/forms/ImportRowModifierForm.php:69 #, fuzzy msgid "Modifier" msgstr "Modificatore" #: library/Director/Web/Tabs/ImportsourceTabs.php:41 #, fuzzy msgid "Modifiers" msgstr "Modificatori" #: application/controllers/ImportsourceController.php:104 #: application/controllers/SyncruleController.php:503 #: library/Director/Web/Controller/TemplateController.php:120 #: library/Director/Web/ActionBar/AutomationObjectActionBar.php:38 #: library/Director/Web/Tabs/SyncRuleTabs.php:37 #: library/Director/ProvidedHook/Monitoring/ServiceActions.php:52 #, fuzzy msgid "Modify" msgstr "Modifica" #: library/Director/ProvidedHook/CubeLinks.php:52 #, fuzzy, php-format msgid "Modify %d hosts" msgstr "Modifica %d Hosts" #: library/Director/Web/Controller/ObjectsController.php:195 #, fuzzy, php-format msgid "Modify %d objects" msgstr "Modifica %d Oggetti " #: application/controllers/DatafieldController.php:34 #, fuzzy, php-format msgid "Modify %s" msgstr "Modifica %s" #: library/Director/ProvidedHook/CubeLinks.php:35 #, fuzzy msgid "Modify a host" msgstr "Modifica un Host" #: application/forms/DirectorDatalistEntryForm.php:61 #, fuzzy msgid "Modify data list entry" msgstr "Modifica l'inserimento dell'elenco dei dati" #: library/Director/Web/Table/ApplyRulesTable.php:154 #, fuzzy msgid "Modify this Apply Rule" msgstr "Modifica questa Apply Rule" #: application/views/scripts/phperror/dependencies.phtml:16 #, fuzzy msgid "Module name" msgstr "Nome Modulo" #: library/Director/Dashboard/Dashlet/ServiceObjectDashlet.php:15 #, fuzzy msgid "Monitored Services" msgstr "Servizi monitorati" #: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:500 #, fuzzy msgid "Move down" msgstr "Sposta in basso" #: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:490 #, fuzzy msgid "Move up" msgstr "Sposta in alto" #: library/Director/Web/Controller/ObjectsController.php:193 #, fuzzy msgid "Multiple objects" msgstr "Oggetti multipli" #: application/controllers/ConfigController.php:162 #, fuzzy msgid "My changes" msgstr "Miei cambiamenti" #: application/controllers/SchemaController.php:16 #, fuzzy msgid "MySQL schema" msgstr "MySQL Schema" #: application/forms/IcingaAddServiceForm.php:146 #: application/forms/IcingaCommandForm.php:47 #: application/forms/IcingaApiUserForm.php:14 #: application/forms/IcingaHostVarForm.php:22 #: application/forms/IcingaServiceVarForm.php:22 #: application/forms/IcingaTimePeriodForm.php:15 #: application/forms/IcingaDependencyForm.php:74 #: application/forms/IcingaHostForm.php:38 #: application/forms/IcingaServiceForm.php:561 #: library/Director/Web/Table/CoreApiObjectsTable.php:57 #: library/Director/Web/Table/CoreApiPrototypesTable.php:40 #: library/Director/Web/Table/ChoicesTable.php:41 #: library/Director/Web/Table/CoreApiFieldsTable.php:74 #, fuzzy msgid "Name" msgstr "Nome" #: application/forms/IcingaDependencyForm.php:76 #, fuzzy msgid "Name for the Icinga dependency you are going to create" msgstr "Nome della dipenza Icinga che stai creando" #: application/forms/IcingaEndpointForm.php:20 #, fuzzy msgid "Name for the Icinga endpoint template you are going to create" msgstr "Nome del template endpoint Icinga che stai creando" #: application/forms/IcingaEndpointForm.php:26 #, fuzzy msgid "Name for the Icinga endpoint you are going to create" msgstr "Nome del endpoint Icinga che stai creando" #: application/forms/IcingaNotificationForm.php:21 #, fuzzy msgid "Name for the Icinga notification template you are going to create" msgstr "Nome del template notifica Icinga che stai creando" #: application/forms/IcingaNotificationForm.php:27 #, fuzzy msgid "Name for the Icinga notification you are going to create" msgstr "Nome della notifica Incinga che stai creando" #: application/forms/IcingaAddServiceForm.php:149 #: application/forms/IcingaServiceForm.php:564 #, fuzzy msgid "Name for the Icinga service you are going to create" msgstr "Nome del servizio Icinga che stai creando" #: application/forms/IcingaUserForm.php:30 #, fuzzy msgid "Name for the Icinga user object you are going to create" msgstr "Nome dell'oggetto User che stai creando" #: application/forms/IcingaUserForm.php:24 #, fuzzy msgid "Name for the Icinga user template you are going to create" msgstr "Nome del template User che stai creando" #: application/forms/IcingaZoneForm.php:17 #, fuzzy msgid "Name for the Icinga zone you are going to create" msgstr "Nome della Zona Icinga che stai creando" #: application/forms/IcingaCloneObjectForm.php:116 #, fuzzy msgid "Name needs to be changed when cloning a Template" msgstr "Il nome deve essere cambiato quando cloni un template" #: library/Director/Web/Table/CoreApiFieldsTable.php:84 #, fuzzy msgid "Nav" msgstr "Nav" #: application/controllers/DatafieldController.php:40 #, fuzzy msgid "New Field" msgstr "Nuovo campo" #: application/controllers/JobController.php:31 #, fuzzy msgid "New Job" msgstr "Nuovo lavoro" #: library/Director/Web/Tabs/ImportsourceTabs.php:54 #, fuzzy msgid "New import source" msgstr "Nuova sorgente di importazione" #: application/forms/IcingaCloneObjectForm.php:22 #: library/Director/Web/Form/CloneImportSourceForm.php:30 #: library/Director/Web/Form/CloneSyncRuleForm.php:30 #, fuzzy msgid "New name" msgstr "Nuovo nome" #: library/Director/Web/Widget/ActivityLogInfo.php:377 #, fuzzy msgid "New object" msgstr "Nuovo oggetto" #: application/forms/IcingaAddServiceForm.php:35 #: application/forms/IcingaHostForm.php:31 #, fuzzy msgid "Next" msgstr "Avanti" #: application/forms/IcingaZoneForm.php:29 #: application/forms/SelfServiceSettingsForm.php:227 #: application/forms/SettingsForm.php:58 application/forms/SettingsForm.php:73 #: application/forms/SettingsForm.php:95 #: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:26 #: library/Director/Job/ImportJob.php:102 library/Director/Job/SyncJob.php:102 #: library/Director/Job/ConfigJob.php:190 #: library/Director/Job/ConfigJob.php:202 #, fuzzy msgid "No" msgstr "No" #: library/Director/Util.php:183 #, fuzzy, php-format msgid "No %s resource available" msgstr "Nessuna %s risorsa avviabile" #: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:99 #, fuzzy msgid "No API user configured, you might run the kickstart helper" msgstr "Nessun utente API configurato, si potrebbe eseguire l'helper kickstart" #: application/forms/IcingaHostForm.php:163 #, fuzzy msgid "No Host Template has been provided yet" msgstr "Non è stato ancora fornito alcun Host template" #: application/forms/IcingaHostForm.php:151 #, fuzzy msgid "No Host template has been chosen" msgstr "Non è stato selezionato alcun Host template" #: application/forms/IcingaAddServiceForm.php:95 #, fuzzy msgid "No Service Templates have been provided yet" msgstr "Non sono stati ancora forniti template di servizio" #: application/forms/IcingaCommandArgumentForm.php:175 #: application/forms/IcingaServiceForm.php:741 #: application/forms/IcingaTimePeriodRangeForm.php:94 #: application/forms/IcingaScheduledDowntimeRangeForm.php:99 #: library/Director/Web/Form/DirectorObjectForm.php:660 #, fuzzy msgid "No action taken, object has not been modified" msgstr "Nessun azione effettuata, l'oggetto non é stato modificato" #: library/Director/Dashboard/Dashlet/Dashlet.php:223 #, fuzzy msgid "No apply rule has been defined yet" msgstr "Non é stata ancora definita nessuna apply rule" #: library/Director/Web/Widget/SyncRunDetails.php:42 #, fuzzy msgid "No changes have been made" msgstr "Non sono state apportate modifiche" #: application/controllers/DashboardController.php:67 #, fuzzy msgid "No dashboard available, you might have not enough permissions" msgstr "Nessuna dashboard disponibile, potreste non avere i permessi necessari" #: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:68 #, fuzzy msgid "No database has been configured for Icinga Director" msgstr "Nessun database é stato configurato per Icinga Director" #: application/forms/KickstartForm.php:238 #, fuzzy msgid "" "No database resource has been configured yet. Please choose a resource to " "complete your config" msgstr "" "Non è stata ancora configurata alcuna risorsa di database. Scegliere una " "risorsa per completare la configurazione" #: application/forms/KickstartForm.php:52 #, fuzzy msgid "No database schema has been created yet" msgstr "Non é stato creato ancora nessun schema database" #: application/forms/AddToBasketForm.php:104 #, fuzzy msgid "No object has been chosen" msgstr "Nessun oggetto é stato selezionato" #: library/Director/Dashboard/Dashlet/Dashlet.php:241 #, fuzzy msgid "No object has been defined yet" msgstr "Nessun oggetto é stato ancora definito" #: application/forms/IcingaMultiEditForm.php:88 #, fuzzy msgid "No object has been modified" msgstr "Nessun oggetto e' stato modificato" #: library/Director/Web/Form/DirectorObjectForm.php:1204 msgid "No related template has been provided yet" msgstr "Nessun template correlato è stato ancora fornito" #: application/forms/IcingaAddServiceForm.php:83 msgid "No service has been chosen" msgstr "Nessun servizio é stato selezionato" #: application/controllers/HostController.php:121 #, php-format msgid "No such service: %s" msgstr "Nessun servizio del genere: %s" #: library/Director/Web/Form/DirectorObjectForm.php:1199 msgid "No template has been chosen" msgstr "Nessun template é stato selezionato" #: library/Director/Dashboard/Dashlet/Dashlet.php:205 msgid "No template has been defined yet" msgstr "Nessun template é stato ancora definito" #: application/forms/IcingaServiceForm.php:611 msgid "None" msgstr "Nessuno" #: library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:57 msgid "None could be used for deployments right now" msgstr "" "Nessuno potrebbe essere utilizzato per le distribuzioni in questo momento" #: library/Director/Web/Form/DirectorObjectForm.php:1490 msgid "Notes" msgstr "Note" #: library/Director/Web/Form/DirectorObjectForm.php:1499 msgid "Notes URL" msgstr "Note URL" #: application/forms/SyncRunForm.php:39 msgid "Nothing changed, rule is in sync" msgstr "Nessuna modifca, regole in sincronizzazione" #: application/forms/ImportCheckForm.php:38 #: application/forms/ImportRunForm.php:38 msgid "" "Nothing to do, data provided by this Import Source didn't change since the " "last import run" msgstr "" "Nulla da fare, i dati forniti da questa sorgente di importazione non sono " "cambiati dall'ultima esecuzione dell'importazione" #: application/forms/RestoreObjectForm.php:76 msgid "Nothing to do, restore would not modify the current object" msgstr "Niente da fare, il ripristino non modificherebbe l'oggetto corrente" #: application/forms/SyncCheckForm.php:58 msgid "Nothing would change, this rule is still in sync" msgstr "Nulla cambierebbe, questa regola è ancora in sincronizzazione" #: application/forms/SyncRuleForm.php:22 #: application/forms/IcingaNotificationForm.php:25 #: library/Director/TranslationDummy.php:18 msgid "Notification" msgstr "Notifica" #: library/Director/Web/Controller/TemplateController.php:56 #, php-format msgid "Notification Apply Rules based on %s" msgstr "Regole di apply rule per notifiche basate su %s" #: library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:19 #: library/Director/Import/ImportSourceCoreApi.php:58 msgid "Notification Commands" msgstr "Comandi di notifica" #: library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:12 msgid "" "Notification Commands allow you to trigger any action you want when a " "notification takes place" msgstr "" "I comandi di notifica consentono di attivare qualsiasi azione che si " "desidera quando avviene una notifica" #: application/forms/IcingaNotificationForm.php:19 msgid "Notification Template" msgstr "Notifica template" #: application/forms/IcingaNotificationForm.php:254 msgid "Notification command" msgstr "Comandi di notifica" #: application/forms/IcingaNotificationForm.php:176 msgid "Notification interval" msgstr "Interfallo di notifica" #: application/controllers/TemplatechoicesController.php:29 msgid "Notification template choices" msgstr "Scelta notifica template" #: library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:13 msgid "Notification templates" msgstr "Notifica templates" #: configuration.php:130 application/forms/BasketForm.php:27 #: library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:13 #: library/Director/Dashboard/Dashlet/NotificationsDashlet.php:13 #: library/Director/Web/Table/CustomvarVariantsTable.php:61 #: library/Director/Web/Table/CustomvarTable.php:46 msgid "Notifications" msgstr "Notifiche" #: library/Director/Dashboard/NotificationsDashboard.php:20 msgid "" "Notifications are sent when a host or service reaches a non-ok hard state or " "recovers from such. One might also want to send them for special events like " "when a Downtime starts, a problem gets acknowledged and much more. You can " "send specific notifications only within specific time periods, you can delay " "them and of course re-notify at specific intervals.\n" "\n" " Combine those possibilities in case you need to define escalation levels, " "like notifying operators first and your management later on in case the " "problem remains unhandled for a certain time.\n" "\n" " You might send E-Mail or SMS, make phone calls or page on various " "channels. You could also delegate notifications to external service " "providers. The possibilities are endless, as you are allowed to define as " "many custom notification commands as you want" msgstr "" "Le notifiche vengono inviate quando un host o un servizio raggiunge uno " "stato non-ok hard state o si riprende da tale stato. Si potrebbe anche " "volerle inviare per eventi speciali come quando inizia un periodo di " "inattività, quando un problema viene riconosciuto e molto altro ancora. È " "possibile inviare notifiche specifiche solo entro periodi di tempo " "specifici, è possibile ritardarle e naturalmente ri-notificare a intervalli " "di tempo specifici.\n" "\n" " Combinate queste possibilità nel caso in cui sia necessario definire " "livelli di escalation, come la notifica prima agli operatori e la vostra " "gestione in seguito nel caso in cui il problema rimanga non gestito per un " "certo periodo di tempo.\n" "\n" " Potreste inviare e-mail o SMS, fare telefonate o pagine su vari canali. " "Potreste anche delegare le notifiche a fornitori di servizi esterni. Le " "possibilità sono infinite, poiché è possibile definire tutti i comandi di " "notifica personalizzati che si desidera" #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:42 msgid "Numeric position" msgstr "Posizione numerica" #: library/Director/IcingaConfig/StateFilterSet.php:24 msgid "OK" msgstr "Ok" #: library/Director/Web/Form/DirectorObjectForm.php:1089 #: library/Director/Web/Form/DirectorObjectForm.php:1094 #: library/Director/Web/Controller/TemplateController.php:148 #: library/Director/DataType/DataTypeDirectorObject.php:64 msgid "Object" msgstr "Oggetto" #: application/controllers/InspectController.php:106 msgid "Object Inspection" msgstr "Ispezione dell'oggetto" #: application/forms/SyncRuleForm.php:45 msgid "Object Type" msgstr "Tipo Oggetto" #: library/Director/Import/ImportSourceLdap.php:53 msgid "Object class" msgstr "Classe dell'oggetto" #: library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:18 #, fuzzy msgid "Object dependency relationships." msgstr "Relazioni di dipendenza da oggetti" #: application/forms/RestoreObjectForm.php:80 msgid "Object has been re-created" msgstr "L'oggetto é stato ri-creato" #: application/forms/RestoreObjectForm.php:72 msgid "Object has been restored" msgstr "L'oggetto é stato ripristinato" #: application/forms/SyncPropertyForm.php:358 msgid "Object properties" msgstr "Proprietá dell'oggetto" #: library/Director/Web/Form/DirectorObjectForm.php:1102 #: library/Director/Web/Table/SyncruleTable.php:46 msgid "Object type" msgstr "Tipo Oggetto" #: application/controllers/InspectController.php:67 #, php-format msgid "Object type \"%s\"" msgstr "Tipo Oggetto \"%s\"" #: library/Director/Web/Table/GeneratedConfigFileTable.php:85 msgid "Object/Tpl/Apply" msgstr "Oggetto/Tpl/Applica" #: library/Director/Web/Table/HostTemplateUsageTable.php:11 #: library/Director/Web/Table/ServiceTemplateUsageTable.php:11 #: library/Director/Web/Table/TemplateUsageTable.php:24 #, fuzzy msgid "Objects" msgstr "Oggetti" #: library/Director/Import/ImportSourceRestApi.php:136 msgid "" "Often the expected result is provided in a property like \"objects\". Please " "specify this if required" msgstr "" "Spesso il risultato atteso è fornito in una proprietà come \"oggetti\". Si " "prega di specificare questo se richiesto" #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:27 #: library/Director/PropertyModifier/PropertyModifierParseURL.php:34 msgid "On failure" msgstr "In caso di fallimento" #: library/Director/Dashboard/Dashlet/Dashlet.php:227 msgid "One apply rule has been defined" msgstr "Una apply rule é stata definita" #: library/Director/Dashboard/Dashlet/Dashlet.php:249 msgid "One external object has been defined, it will not be deployed" msgstr "Un oggetto esterno é stato definite, non verrá implementato" #: library/Director/Dashboard/Dashlet/Dashlet.php:252 msgid "One object has been defined" msgstr "Un oggetto è stato definito" #: application/forms/IcingaMultiEditForm.php:90 #: library/Director/Web/Widget/SyncRunDetails.php:45 msgid "One object has been modified" msgstr "Un oggetto é stato modificato" #: library/Director/PropertyModifier/PropertyModifierSplit.php:16 msgid "One or more characters that should be used to split this string" msgstr "Uno o più caratteri da utilizzare per separare questa stringa" #: library/Director/PropertyModifier/PropertyModifierJoin.php:16 msgid "" "One or more characters that will be used to glue an input array to a string. " "Can be left empty" msgstr "" "Uno o più caratteri che saranno usati per incollare un input array ad una " "stringa. Può essere lasciato vuoto" #: application/forms/IcingaTimePeriodRangeForm.php:30 #: application/forms/IcingaScheduledDowntimeRangeForm.php:31 msgid "One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00" msgstr "" "Uno o più periodi di tempo, ad es. 00:00-24:00 o 00:00-09:00,17:00-24:00" #: library/Director/Dashboard/Dashlet/Dashlet.php:209 #: library/Director/Dashboard/Dashlet/Dashlet.php:246 msgid "One template has been defined" msgstr "Un template é stato definito" #: application/forms/IcingaCommandArgumentForm.php:100 msgid "" "Only set this parameter if the argument value resolves to a numeric value. " "String values are not supported" msgstr "" "Impostare questo parametro solo se il valore dell'argomento si risolve su un " "valore numerico. I valori delle stringhe non sono supportati" #: application/forms/IcingaObjectFieldForm.php:146 msgid "Optional" msgstr "Opzionale" #: application/forms/IcingaCommandForm.php:72 msgid "" "Optional command timeout. Allowed values are seconds or durations postfixed " "with a specific unit (e.g. 1m or also 3m 30s)." msgstr "" "Timeout comando opzionale. I valori ammessi sono i secondi o le durate " "fissate con una specifica unità (ad esempio 1m o anche 3m 30s)" #: application/forms/IcingaDependencyForm.php:248 #, fuzzy msgid "" "Optional. The child service. If omitted this dependency object is treated as " "host dependency." msgstr "" "Opzionale. Il servizio figlio. Se omesso, questo oggetto di dipendenza viene " "trattato come dipendenza dell'host" #: application/forms/IcingaDependencyForm.php:218 #, fuzzy msgid "" "Optional. The parent service. If omitted this dependency object is treated " "as host dependency." msgstr "" "Opzionale. Il servizio parente. Se omesso questo oggetto di dipendenza viene " "trattato come dipendenza dell'host" #: application/forms/IcingaObjectFieldForm.php:103 msgid "Other available fields" msgstr "Altri campi disponibili" #: application/forms/SyncPropertyForm.php:273 msgid "Other sources" msgstr "Altre risorse" #: application/forms/IcingaServiceForm.php:148 #: application/forms/IcingaServiceForm.php:405 #: application/forms/IcingaServiceForm.php:441 msgid "Override vars" msgstr "Sovrascrivi variabili" #: library/Director/Web/ActionBar/AutomationObjectActionBar.php:32 #: library/Director/Web/Tabs/MainTabs.php:26 msgid "Overview" msgstr "Panoramica" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:74 msgid "PHP Binary" msgstr "PHP Binario" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:77 msgid "PHP Integer" msgstr "PHP Intero" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:76 msgid "PHP Version" msgstr "PHP-Versione" #: application/controllers/PhperrorController.php:18 #, php-format msgid "" "PHP version 5.4.x is required for Director >= 1.4.0, you're running %s. " "Please either upgrade PHP or downgrade Icinga Director" msgstr "" "La versione 5.4.x di PHP è richiesta per Director >= 1.4.0, in corso %s. Si " "prega di aggiornare PHP o di eseguire il downgrade di Icinga Director" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:66 msgid "PID" msgstr "PID" #: application/forms/IcingaUserForm.php:41 msgid "Pager" msgstr "Paginazione" #: application/forms/IcingaDependencyForm.php:200 msgid "Parent Host" msgstr "Host-Parente" #: application/forms/IcingaDependencyForm.php:216 msgid "Parent Service" msgstr "Sevizio-Parente" #: application/forms/IcingaZoneForm.php:36 msgid "Parent Zone" msgstr "Zona-Parente" #: application/forms/IcingaApiUserForm.php:19 #: application/forms/KickstartForm.php:159 #: library/Director/Import/ImportSourceRestApi.php:156 msgid "Password" msgstr "Password" #: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:13 #: library/Director/PropertyModifier/PropertyModifierCombine.php:14 msgid "Pattern" msgstr "Modello" #: application/forms/ApplyMigrationsForm.php:39 msgid "Pending database schema migrations have successfully been applied" msgstr "" "Sono state applicate con successo le migrazioni degli schemi di database in " "sospeso" #: library/Director/Util.php:185 msgid "Please ask an administrator to grant you access to resources" msgstr "" "Si prega di contattare l'amministratore per richiedere l'accesso alle risorse" #: application/forms/AddToBasketForm.php:118 #, php-format msgid "" "Please check your Basket configuration, %s does not support single \"%s\" " "configuration objects" msgstr "" "Si prega di controllare la configurazione del vostro Basket, %s non supporta " "singoli oggetti di configurazione \"%s" #: library/Director/PropertyModifier/PropertyModifierMap.php:19 msgid "Please choose a data list that can be used for map lookups" msgstr "" "Si prega di scegliere una lista dati che puo' essere utilizzata per la map " "lookups" #: library/Director/DataType/DataTypeDirectorObject.php:66 msgid "Please choose a specific Icinga object type" msgstr "Scegliere un tipo di Icinga-Oggetto specifico" #: library/Director/Job/ImportJob.php:82 #, fuzzy msgid "" "Please choose your import source that should be executed. You could create " "different schedules for different sources or also opt for running all of " "them at once." msgstr "" "Scegliete la sorgente di importazione da eseguire. Potete creare diverse " "programmazioni per diverse fonti o anche scegliere di eseguirli tutti in una " "volta" #: library/Director/Job/SyncJob.php:82 #, fuzzy msgid "" "Please choose your synchronization rule that should be executed. You could " "create different schedules for different rules or also opt for running all " "of them at once." msgstr "" "Si prega di scegliere la regola di sincronizzazione da eseguire. Potete " "creare diverse programmazioni per regole diverse o anche scegliere di " "eseguirle tutte in una volta" #: library/Director/Import/ImportSourceSql.php:57 msgid "Please click \"Store\" once again to determine query columns" msgstr "" "Si prega di cliccare nuovamente \"Memorizza\" per determinare la colonna di " "interrogazione" #: application/forms/KickstartForm.php:257 #, php-format msgid "Please click %s to create new DB resources" msgstr "Si prega di premere %s per creare nuove risorse DB" #: library/Director/Util.php:175 #, php-format msgid "Please click %s to create new resources" msgstr "Si prega di premere %s per creare nuove risorse" #: application/forms/IcingaAddServiceForm.php:87 #: application/forms/IcingaHostForm.php:155 #, php-format msgid "Please define a %s first" msgstr "Si prega di definire prima un %s" #: library/Director/Web/Form/DirectorObjectForm.php:1202 msgid "Please define a related template first" msgstr "Si prega di definire prima un template correlato" #: application/forms/KickstartForm.php:219 msgid "" "Please make sure that your database exists and your user has been granted " "enough permissions" msgstr "" "Si prega di assicurarsi che il database esista e che il tuo utente abbia " "ottenuto sufficienti autorizzazioni" #: application/forms/SettingsForm.php:23 #, fuzzy msgid "" "Please only change those settings in case you are really sure that you are " "required to do so. Usually the defaults chosen by the Icinga Director should " "make a good fit for your environment." msgstr "" "Si prega di modificare queste impostazioni solo nel caso in cui siate " "veramente sicuri che sia necessario farlo. Di solito le impostazioni " "predefinite scelte dal Director di Icinga dovrebbero essere adatte al " "vostro ambiente" #: application/forms/SyncRuleForm.php:31 #, fuzzy msgid "Please provide a rule name" msgstr "Si prega di fornire il nome della regola" #: library/Director/PropertyModifier/PropertyModifierSubstring.php:17 #: library/Director/PropertyModifier/PropertyModifierSubstring.php:27 #, php-format msgid "Please see %s for detailled instructions of how start and end work" msgstr "" "Per istruzioni dettagliate su come iniziare e terminare il lavoro, vedere le " "%s" #: application/forms/ImportRowModifierForm.php:32 msgid "" "Please start typing for a list of suggestions. Dots allow you to access " "nested properties: column.some.key. Such nested properties cannot be " "modified in-place, but you can store the modified value to a new \"target " "property\"" msgstr "" "Si prega di iniziare a digitare per ottenere dei suggerimenti. I punti " "consentono di accedere alle proprietà annidate: column.some.key. Tali " "proprietà annidate non possono essere modificate in loco, ma è possibile " "memorizzare il valore modificato in una nuova \"proprietà di destinazione\"." #: application/forms/IcingaCommandForm.php:36 msgid "" "Plugin Check commands are what you need when running checks agains your " "infrastructure. Notification commands will be used when it comes to notify " "your users. Event commands allow you to trigger specific actions when " "problems occur. Some people use them for auto-healing mechanisms, like " "restarting services or rebooting systems at specific thresholds" msgstr "" "I comandi Plugin Check sono ciò di cui avete bisogno quando eseguite i " "controlli sulla vostra infrastruttura. I comandi di notifica saranno " "utilizzati quando si tratta di notificare i vostri utenti. I comandi degli " "eventi vi permettono di attivare azioni specifiche quando si verificano " "problemi. Alcuni li usano per meccanismi di auto-guarigione, come il riavvio " "di servizi o il riavvio di sistemi a soglie specifiche" #: application/forms/IcingaCommandForm.php:20 msgid "Plugin commands" msgstr "Comandi Plugin" #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:50 #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:52 msgid "Policy" msgstr "Policy" #: application/forms/IcingaEndpointForm.php:36 #: application/forms/KickstartForm.php:141 msgid "Port" msgstr "Porta" #: application/forms/IcingaCommandArgumentForm.php:67 #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:40 msgid "Position" msgstr "Posizione" #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:30 msgid "Position Type" msgstr "Tipo posizione" #: application/controllers/SchemaController.php:17 msgid "PostgreSQL schema" msgstr "PostgreSQL Schema" #: application/forms/IcingaTimePeriodForm.php:76 msgid "Prefer includes" msgstr "Preferisce include" #: library/Director/Dashboard/Dashlet/BasketDashlet.php:17 msgid "Preserve specific configuration objects in a specific state" msgstr "" "Conservare gli oggetti di configurazione specifici in uno stato specifico" #: library/Director/Web/Tabs/ImportsourceTabs.php:49 #: library/Director/Web/Tabs/ObjectTabs.php:86 #: library/Director/Web/Tabs/SyncRuleTabs.php:33 msgid "Preview" msgstr "Anteprima" #: library/Director/IcingaConfig/TypeFilterSet.php:23 msgid "Problem" msgstr "Problema" #: library/Director/IcingaConfig/TypeFilterSet.php:27 msgid "Problem handling" msgstr "Gestione problema" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:99 msgid "Process List" msgstr "Elenco dei processi" #: library/Director/Web/Form/DirectorObjectForm.php:1411 msgid "Process performance data" msgstr "Dati sulle prestazioni del processo" #: library/Director/Web/Tabs/SyncRuleTabs.php:39 #: library/Director/Import/ImportSourceLdap.php:67 #, fuzzy msgid "Properties" msgstr "Proprietá " #: application/forms/ImportRowModifierForm.php:30 #: library/Director/Web/Table/PropertymodifierTable.php:113 #: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:61 #, fuzzy msgid "Property" msgstr "Proprietá " #: application/controllers/ImportsourceController.php:169 #, php-format msgid "Property modifiers: %s" msgstr "Modificatori di proprietà: %s" #: library/Director/Web/Table/CoreApiFieldsTable.php:82 msgid "Protected" msgstr "Protetto" #: library/Director/Import/ImportSourceRestApi.php:72 msgid "Protocol" msgstr "Protocollo" #: application/controllers/InspectController.php:91 msgid "Prototypes (methods)" msgstr "Prototipi (metodi)" #: library/Director/Dashboard/Dashlet/DatalistDashlet.php:11 msgid "Provide Data Lists" msgstr "Fornire elenchi dati" #: library/Director/Dashboard/Dashlet/DatalistDashlet.php:17 msgid "Provide data lists to make life easier for your users" msgstr "Fornire liste di dati per facilitare il lavoro ai vostri utenti" #: library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:18 #, fuzzy msgid "Provide templates for your TimePeriod objects." msgstr "Fornire templates per gli oggetti TimePeriod" #: library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:18 #, fuzzy msgid "Provide templates for your User objects." msgstr "Fornire templates per i vostri oggetti User" #: library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:18 #, fuzzy msgid "Provide templates for your notifications." msgstr "Fornire templates per le vostre notifiche" #: library/Director/Import/ImportSourceRestApi.php:167 msgid "Proxy" msgstr "Proxy" #: library/Director/Import/ImportSourceRestApi.php:183 msgid "Proxy Address" msgstr "Indirizzo Proxy" #: library/Director/Import/ImportSourceRestApi.php:201 msgid "Proxy Password" msgstr "Password Proxy" #: library/Director/Import/ImportSourceRestApi.php:191 msgid "Proxy Username" msgstr "Username Proxy" #: application/forms/SyncRuleForm.php:68 msgid "Purge" msgstr "Ripulire" #: library/Director/Web/Tabs/ObjectTabs.php:122 msgid "Ranges" msgstr "Ranges" #: application/forms/DeployConfigForm.php:32 msgid "Re-deploy now" msgstr "Ri-distribuisci adesso" #: library/Director/IcingaConfig/TypeFilterSet.php:24 msgid "Recovery" msgstr "Recupera" #: application/forms/IcingaGenerateApiKeyForm.php:22 msgid "Regenerate Self Service API key" msgstr "Rigenerare la chiave API del Self Service" #: application/forms/IcingaHostSelfServiceForm.php:56 msgid "Register" msgstr "Registra" #: library/Director/Web/SelfService.php:59 msgid "Registered Agent" msgstr "Registra Agente" #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:34 #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:32 msgid "Regular Expression" msgstr "Espressione Regolare" #: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:16 msgid "Regular expression pattern to split the string (e.g. /\\s+/ or /[,;]/)" msgstr "" "Schema di espressione regolare per dividere la stringa (ad esempio /\\s+/ o /" "[,;]/)" #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:58 msgid "Reject matching elements" msgstr "Rifiuta gli elementi corrispondenti" #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:59 msgid "Reject the whole row (Blacklist)" msgstr "Rifiuta l'intera fila (Blacklist)" #: application/forms/IcingaDependencyForm.php:268 msgid "Related Objects" msgstr "Oggetti correlati" #: library/Director/Web/Table/IcingaServiceSetServiceTable.php:191 msgid "Remove" msgstr "Rimuovi" #: library/Director/Web/Table/IcingaServiceSetServiceTable.php:193 #, php-format msgid "Remove \"%s\" from this host" msgstr "Rimuovere \"%s\" da questo host" #: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:480 msgid "Remove this entry" msgstr "Rimuovere questa voce" #: application/views/helpers/FormDataFilter.php:507 msgid "Remove this part of your filter" msgstr "Rimuovere questa parte del filtro" #: application/forms/DirectorDatafieldForm.php:96 msgid "Rename related vars" msgstr "Rinomina le variabili correlati" #: application/forms/IcingaCommandForm.php:87 msgid "Render as string" msgstr "Renderizza come stringa" #: application/controllers/ConfigController.php:67 msgid "Render config" msgstr "Creare la configurazione" #: application/forms/IcingaCommandForm.php:78 #, fuzzy msgid "Render the command as a plain string instead of an array." msgstr "Renderizza il comando come una stringa semplice invece di un array." #: application/controllers/ConfigController.php:290 msgid "Rendered file" msgstr "File renderizzato" #: library/Director/Web/Widget/DeploymentInfo.php:97 #, php-format msgid "Rendered in %0.2fs, deployed in %0.2fs" msgstr "Rendered in %0.2fs, distribuito in %0.2fs" #: library/Director/Web/Widget/ActivityLogInfo.php:562 #: library/Director/Web/Widget/ActivityLogInfo.php:567 msgid "Rendering" msgstr "Rendering" #: application/forms/IcingaCommandArgumentForm.php:107 msgid "Repeat key" msgstr "Ripeti chiave" #: application/forms/SyncRuleForm.php:62 msgid "Replace" msgstr "Sostituisci" #: application/views/scripts/phperror/dependencies.phtml:17 #: application/forms/IcingaCommandArgumentForm.php:124 #: library/Director/Web/Table/CoreApiFieldsTable.php:81 msgid "Required" msgstr "Richiesto" #: application/controllers/BasketController.php:206 #: application/forms/RestoreBasketForm.php:58 #: application/forms/IcingaServiceForm.php:139 msgid "Restore" msgstr "Ripristina" #: application/forms/RestoreObjectForm.php:17 msgid "Restore former object" msgstr "Ripristinare l'oggetto precedente" #: application/forms/RestoreBasketForm.php:52 msgid "Restore to this target Director DB" msgstr "Ripristinare a questo Director DB" #: library/Director/Web/Form/DirectorObjectForm.php:1339 msgid "Retry interval" msgstr "Intervallo di ripetizione" #: library/Director/Web/Form/DirectorObjectForm.php:1341 msgid "" "Retry interval, will be applied after a state change unless the next hard " "state is reached" msgstr "" "Intervallo di ripetizione, sarà applicato dopo un cambio di stato, a meno " "che non venga raggiunto il prossimo stato difficile" #: library/Director/PropertyModifier/PropertyModifierMap.php:34 msgid "Return lookup key unmodified" msgstr "La chiave di ricerca per la restituzione rimane invariata" #: application/forms/SyncRuleForm.php:30 #: library/Director/Web/Table/SyncruleTable.php:45 msgid "Rule name" msgstr "Nome regola" #: library/Director/Job/ImportJob.php:119 msgid "Run all imports at once" msgstr "Eseguire tutte le importazioni in una sola volta" #: library/Director/Job/SyncJob.php:125 #, fuzzy msgid "Run all rules at once" msgstr "Eseguire tutte le regole in una volta" #: application/forms/KickstartForm.php:185 #: library/Director/Job/ImportJob.php:92 msgid "Run import" msgstr "Esegui importazione" #: application/forms/DirectorJobForm.php:46 msgid "Run interval" msgstr "Intervallo di esecuzione" #: application/forms/IcingaServiceForm.php:664 msgid "Run on agent" msgstr "Esegui su agent" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:69 msgid "Running with systemd" msgstr "Funzionamento con systemd" #: library/Director/Import/ImportSourceRestApi.php:174 msgid "SOCKS5 proxy" msgstr "SOCKS5 Proxy" #: library/Director/Dashboard/Dashlet/JobDashlet.php:29 msgid "" "Schedule and automate Import, Syncronization, Config Deployment, " "Housekeeping and more" msgstr "" "Programmare e automatizzare l'importazione, la sincronizzazione, la " "configurazione, l'implementazione, la pulizia e altro ancora" #: library/Director/Dashboard/NotificationsDashboard.php:14 #: library/Director/Dashboard/UsersDashboard.php:15 msgid "Schedule your notifications" msgstr "Programmare le notifiche" #: library/Director/Dashboard/Dashlet/NotificationsDashlet.php:19 msgid "" "Schedule your notifications. Define who should be notified, when, and for " "which kind of problem" msgstr "" "Programmate le vostre notifiche. Definire chi deve essere notificato, quando " "e per quale tipo di problema" #: application/forms/SyncRuleForm.php:23 msgid "Scheduled Downtime" msgstr "Downtime programmato" #: library/Director/Dashboard/Dashlet/ScheduledDowntimeApplyDashlet.php:13 msgid "Scheduled Downtimes" msgstr "Downtime programmati" #: application/forms/SettingsForm.php:165 msgid "" "Script or tool to call when activating a new configuration stage. (e.g. " "sudo /usr/local/bin/icinga-director-activate) (name of the stage will be the " "argument for the script)" msgstr "" "Script o tool da chiamare quando si attiva una nuova fase di configurazione. " "(ad esempio sudo /usr/local/bin/icinga-director-activate) (il nome dello " "stage sarà l'argomento per lo script)" #: application/controllers/SettingsController.php:43 #: application/controllers/SelfServiceController.php:101 msgid "Self Service" msgstr "Self Service" #: application/controllers/SelfServiceController.php:102 msgid "Self Service - Host Registration" msgstr "Self Service - Registrazione Host" #: library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:11 msgid "Self Service API" msgstr "Self Service API" #: application/controllers/SettingsController.php:44 msgid "Self Service API - Global Settings" msgstr "Self Service API - Impostazioni Globali" #: application/forms/SelfServiceSettingsForm.php:285 msgid "Self Service Settings have been stored" msgstr "Le impostazioni del Self Service sono state memorizzate" #: application/forms/IcingaUserForm.php:89 #: library/Director/Web/Form/DirectorObjectForm.php:1399 msgid "Send notifications" msgstr "Invia notifiche" #: library/Director/Web/Widget/DeploymentInfo.php:78 msgid "Sent to" msgstr "Invia a" #: application/forms/IcingaAddServiceForm.php:105 #: application/forms/SyncRuleForm.php:14 #: application/forms/IcingaServiceVarForm.php:15 #: library/Director/TranslationDummy.php:14 msgid "Service" msgstr "Servizio" #: library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:11 msgid "Service Apply Rules" msgstr "Apply rules del servizio" #: application/forms/SyncRuleForm.php:15 msgid "Service Group" msgstr "Gruppo di servizio" #: application/forms/BasketForm.php:23 #: library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:11 msgid "Service Groups" msgstr "Gruppi di servizio" #: application/forms/SyncRuleForm.php:16 #: library/Director/DataType/DataTypeDirectorObject.php:58 msgid "Service Set" msgstr "Set di servizi" #: application/forms/RemoveLinkForm.php:55 msgid "Service Set has been removed" msgstr "Il set di servizi è stato rimosso" #: application/forms/BasketForm.php:26 #: library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:11 #: library/Director/Web/Table/CustomvarVariantsTable.php:60 #: library/Director/Web/Table/CustomvarTable.php:45 msgid "Service Sets" msgstr "Set di servizi" #: application/forms/IcingaAddServiceForm.php:89 msgid "Service Template" msgstr "Template di servizi" #: application/forms/BasketForm.php:24 msgid "Service Template Choice" msgstr "Scelta del template di servizio" #: application/forms/BasketForm.php:25 #: library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:11 msgid "Service Templates" msgstr "Templates di servizio" #: application/forms/SelfServiceSettingsForm.php:166 msgid "Service User" msgstr "Utente del servizio" #: library/Director/DataType/DataTypeDirectorObject.php:57 msgid "Service groups" msgstr "Gruppi di servizio" #: application/forms/IcingaServiceForm.php:639 msgid "" "Service groups that should be directly assigned to this service. " "Servicegroups can be useful for various reasons. They are helpful to " "provided service-type specific view in Icinga Web 2, either for custom " "dashboards or as an instrument to enforce restrictions. Service groups can " "be directly assigned to single services or to service templates." msgstr "" "Gruppi di servizi che dovrebbero essere assegnati direttamente a questo " "servizio. I gruppi di servizio possono essere utili per vari motivi. Sono " "utili per fornire una vista specifica del tipo di servizio in Icinga Web 2, " "sia dashboard personalizzate che come strumento per far rispettare le " "restrizioni. I gruppi di servizi possono essere assegnati direttamente a " "singoli servizi o a template di servizio" #: library/Director/Web/Table/IcingaHostAppliedForServiceTable.php:102 msgid "Service name" msgstr "Nome del servizio" #: application/controllers/SuggestController.php:257 #: library/Director/Objects/IcingaService.php:726 msgid "Service properties" msgstr "Proprietà del servizio" #: application/forms/IcingaAddServiceSetForm.php:86 #: application/forms/IcingaServiceSetForm.php:85 msgid "Service set" msgstr "Set di servizi" #: application/forms/IcingaServiceSetForm.php:28 msgid "Service set name" msgstr "Nome del set di servizi" #: application/controllers/TemplatechoiceController.php:22 msgid "Service template choice" msgstr "Scelta del template di servizio" #: application/controllers/TemplatechoicesController.php:24 msgid "Service template choices" msgstr "Scelta del template di servizio" #: application/controllers/ServiceController.php:76 msgid "ServiceSet" msgstr "SetServizi" #: application/forms/IcingaServiceGroupForm.php:14 msgid "Servicegroup" msgstr "Gruppo di servizio" #: library/Director/Web/Table/IcingaHostServiceTable.php:140 #: library/Director/Web/Table/IcingaServiceSetServiceTable.php:154 #: library/Director/Web/Table/IcingaAppliedServiceTable.php:32 msgid "Servicename" msgstr "Nome del servizio" #: configuration.php:122 application/controllers/ServiceController.php:57 #: application/controllers/ServiceController.php:80 #: application/forms/IcingaScheduledDowntimeForm.php:86 #: application/forms/IcingaDependencyForm.php:101 #: application/forms/IcingaNotificationForm.php:90 #: library/Director/Web/Table/CustomvarVariantsTable.php:59 #: library/Director/Web/Table/CustomvarTable.php:44 #: library/Director/Web/Tabs/ObjectTabs.php:75 #: library/Director/DataType/DataTypeDirectorObject.php:56 #: library/Director/IcingaConfig/StateFilterSet.php:23 msgid "Services" msgstr "Servizi" #: application/controllers/ServicesetController.php:62 #, php-format msgid "Services in this set: %s" msgstr "Servizi in questo set: %s" #: application/controllers/HostController.php:213 #, php-format msgid "Services on %s" msgstr "Servizi su %s" #: application/controllers/HostController.php:137 #, php-format msgid "Services: %s" msgstr "Servizi: %s" #: application/forms/SyncPropertyForm.php:84 msgid "Set based on filter" msgstr "Impostazione basata sul filtro" #: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:44 msgid "Set false" msgstr "Imposta falso" #: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:25 #: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:34 #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:30 #: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:17 #: library/Director/PropertyModifier/PropertyModifierParseURL.php:39 msgid "Set no value (null)" msgstr "Imposta nessun valore (null)" #: library/Director/PropertyModifier/PropertyModifierMap.php:33 #: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:42 msgid "Set null" msgstr "Imposta null" #: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:43 msgid "Set true" msgstr "Importa vero" #: library/Director/Web/Tabs/ObjectsTabs.php:77 msgid "Sets" msgstr "Set" #: application/forms/IcingaHostForm.php:105 msgid "" "Setting a command endpoint allows you to force host checks to be executed by " "a specific endpoint. Please carefully study the related Icinga documentation " "before using this feature" msgstr "" "L'impostazione di un endpoint di comando consente di forzare l'esecuzione " "dei controlli dell'host da parte di uno specifico endpoint. Si prega di " "studiare attentamente la relativa documentazione di Icinga prima di " "utilizzare questa funzione" #: application/controllers/ConfigController.php:221 #: library/Director/Web/SelfService.php:93 #, fuzzy msgid "Settings" msgstr "Impostazioni" #: application/forms/SettingsForm.php:218 msgid "Settings have been stored" msgstr "Le impostazioni sono state memorizzate" #: library/Director/Web/SelfService.php:86 msgid "Share this Template for Self Service API" msgstr "Condividi questo template di API per il Self Service" #: library/Director/Web/SelfService.php:84 msgid "Shared for Self Service API" msgstr "API condivisa per il Self Service" #: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:21 msgid "Should all the other characters be lowercased first?" msgstr "Tutti gli altri caratteri devono essere in lettere minuscole?" #: application/controllers/HostController.php:514 msgid "Show" msgstr "Mostra" #: application/controllers/BasketController.php:200 msgid "Show Basket" msgstr "Mostra Basket" #: application/forms/DeployFormsBug7530.php:97 #, php-format msgid "Show Issue %s on GitHub" msgstr "Mostra Issue %s su GitHub" #: library/Director/Web/Widget/AdditionalTableActions.php:75 msgid "Show SQL" msgstr "Mostra SQL" #: library/Director/Web/Table/ApplyRulesTable.php:147 msgid "Show affected Objects" msgstr "Mostra gli oggetti interessati" #: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:457 msgid "Show available options" msgstr "Mostra le opzioni disponibili" #: application/forms/IcingaObjectFieldForm.php:183 msgid "Show based on filter" msgstr "Mostra in base al filtro" #: library/Director/Web/Table/ActivityLogTable.php:91 msgid "Show details related to this change" msgstr "Mostra i dettagli relativi a questo cambiamento" #: library/Director/Web/ObjectPreview.php:51 msgid "Show normal" msgstr "Mostra normale" #: library/Director/Web/ObjectPreview.php:60 msgid "Show resolved" msgstr "Mostra risolto" #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:33 #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:31 msgid "Simple match with wildcards (*)" msgstr "Ricerca semplice con caratteri jolly (*)" #: application/controllers/BasketController.php:332 msgid "Single Object Diff" msgstr "Diffusione a singolo oggetto" #: library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:11 msgid "Single Services" msgstr "Servizi singoli" #: library/Director/Web/Table/GeneratedConfigFileTable.php:86 msgid "Size" msgstr "Dimensione" #: application/forms/IcingaCommandArgumentForm.php:115 msgid "Skip key" msgstr "Tasto Salta" #: application/controllers/BasketController.php:247 #: application/controllers/BasketController.php:364 msgid "Snapshot" msgstr "Snapshot" #: application/controllers/BasketController.php:36 #: application/controllers/BasketController.php:141 #: library/Director/Web/Table/BasketTable.php:32 msgid "Snapshots" msgstr "Snapshots" #: library/Director/Import/ImportSourceRestApi.php:121 msgid "Something like https://api.example.com/rest/v2/objects" msgstr "Qualcosa come https://api.example.com/rest/v2/objects" #: application/forms/SyncPropertyForm.php:182 msgid "Source Column" msgstr "Colonna Sorgente" #: application/forms/SyncPropertyForm.php:212 msgid "Source Expression" msgstr "Espressione Sorgente" #: application/forms/SyncPropertyForm.php:38 msgid "Source Name" msgstr "Nome sorgente" #: application/forms/SelfServiceSettingsForm.php:101 msgid "Source Path" msgstr "Percorso Sorgente" #: application/forms/ImportSourceForm.php:33 msgid "Source Type" msgstr "Tipo Sorgente" #: application/forms/SyncPropertyForm.php:159 msgid "Source columns" msgstr "Colonne Sorgenti" #: library/Director/Web/Table/SyncpropertyTable.php:62 msgid "Source field" msgstr "Campo Sorgente" #: library/Director/Web/Table/ImportrunTable.php:30 #: library/Director/Web/Table/SyncpropertyTable.php:61 #: library/Director/Web/Table/ImportsourceTable.php:18 msgid "Source name" msgstr "Nome Sorgente" #: application/forms/SyncPropertyForm.php:355 msgid "Special properties" msgstr "Proprietá speciali" #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:35 msgid "Specific Element (by position)" msgstr "Elementi Specifici (per posizione)" #: library/Director/Web/Widget/DeploymentInfo.php:87 msgid "Stage name" msgstr "Nome Stage" #: library/Director/Web/Widget/SyncRunDetails.php:25 msgid "Start time" msgstr "Ora di inizio" #: library/Director/Web/Widget/DeploymentInfo.php:88 msgid "Startup" msgstr "Avvio" #: library/Director/Web/Widget/DeploymentInfo.php:162 msgid "Startup Log" msgstr "Avvio Log" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:65 msgid "Startup Time" msgstr "Inizio Tempo" #: library/Director/Web/Table/CoreApiFieldsTable.php:79 msgid "State" msgstr "Stato" #: library/Director/Web/Form/DirectorObjectForm.php:1647 msgid "State and transition type filters" msgstr "Filtri di stato e di transizione" #: library/Director/IcingaConfig/TypeFilterSet.php:22 msgid "State changes" msgstr "Cambiamenti di stato" #: library/Director/Web/Form/DirectorObjectForm.php:1622 msgid "States" msgstr "Stati" #: library/Director/Web/Widget/DeployedConfigInfoHeader.php:81 msgid "Statistics" msgstr "Statistiche" #: application/controllers/InspectController.php:43 #: application/controllers/InspectController.php:151 msgid "Status" msgstr "Stati" #: library/Director/Web/SelfService.php:134 msgid "Stop sharing this Template" msgstr "Sospendi la condivisione del template" #: application/forms/SettingsForm.php:127 #: library/Director/Web/Form/DirectorObjectForm.php:507 msgid "Store" msgstr "Salva" #: application/forms/KickstartForm.php:36 msgid "Store configuration" msgstr "Salva configurazione" #: library/Director/DataType/DataTypeDatalist.php:145 msgid "Strict, list values only" msgstr "Severo, solo valori di lista" #: application/forms/IcingaCommandArgumentForm.php:38 #: application/forms/IcingaCommandArgumentForm.php:77 #: library/Director/DataType/DataTypeDirectorObject.php:76 #: library/Director/DataType/DataTypeSqlQuery.php:76 #: library/Director/DataType/DataTypeDatalist.php:130 msgid "String" msgstr "Stringa" #: application/views/helpers/FormDataFilter.php:534 msgid "Strip this operator, preserve child nodes" msgstr "Rimuovere questo operatore, preservare i nodi figlio" #: library/Director/Web/Form/QuickForm.php:215 msgid "Submit" msgstr "Invia a" #: library/Director/Web/Widget/DeploymentInfo.php:139 msgid "Succeeded" msgstr "Successo" #: application/forms/IcingaObjectFieldForm.php:94 msgid "Suggested fields" msgstr "Campi suggeriti" #: library/Director/Web/ActionBar/TemplateActionBar.php:37 msgid "Switch to Table view" msgstr "Passa alla vista Tabella" #: library/Director/Web/ActionBar/TemplateActionBar.php:36 msgid "Switch to Tree view" msgstr "Passa alla vista ad albero" #: application/controllers/SyncruleController.php:557 #, php-format msgid "Sync \"%s\": %s" msgstr "Sincronizza \"%s\": \"%s\" " #: application/controllers/SyncruleController.php:121 msgid "Sync Properties" msgstr "Proprietà di sincronizzazione" #: application/forms/BasketForm.php:32 msgid "Sync Rules" msgstr "Regole di sincronizzazione" #: application/controllers/SyncruleController.php:592 msgid "Sync history" msgstr "Storia della sincronizzazione" #: application/forms/SyncRuleForm.php:82 #, php-format msgid "" "Sync only part of your imported objects with this rule. Icinga Web 2 filter " "syntax is allowed, so this could look as follows: %s" msgstr "" "Sincronizzare solo una parte degli oggetti importati con questa regola. La " "sintassi del filtro Icinga Web 2 è consentita, quindi potrebbe apparire come " "segue: %s" #: application/controllers/SyncruleController.php:529 msgid "Sync properties" msgstr "Proprietà di sincronizzazione" #: application/controllers/SyncrulesController.php:25 #: application/controllers/SyncruleController.php:494 #: library/Director/Web/Tabs/ImportTabs.php:23 #: library/Director/Web/Tabs/SyncRuleTabs.php:29 #: library/Director/Web/Tabs/SyncRuleTabs.php:50 msgid "Sync rule" msgstr "Regola di sincronizzazione" #: application/controllers/SyncruleController.php:41 #: application/controllers/SyncruleController.php:466 #, php-format msgid "Sync rule: %s" msgstr "Regola di sincronizzazione: %s" #: application/forms/SyncRunForm.php:42 msgid "Synchronization failed" msgstr "Sincronizzazione fallita" #: library/Director/Job/SyncJob.php:80 msgid "Synchronization rule" msgstr "Regola di sincronizzazione" #: library/Director/Dashboard/Dashlet/SyncDashlet.php:14 msgid "Synchronize" msgstr "Sincronizzare" #: library/Director/Web/ActionBar/TemplateActionBar.php:30 msgid "Table" msgstr "Tabella" #: application/forms/RestoreBasketForm.php:51 msgid "Target DB" msgstr "Destinatario DB" #: application/forms/IcingaCloneObjectForm.php:70 msgid "Target Host" msgstr "Destinatario Host" #: application/forms/IcingaCloneObjectForm.php:61 msgid "Target Service Set" msgstr "Target Set Servizio" #: library/Director/DataType/DataTypeDirectorObject.php:74 #: library/Director/DataType/DataTypeSqlQuery.php:74 #: library/Director/DataType/DataTypeDatalist.php:128 msgid "Target data type" msgstr "Tipo di dati di destinazione" #: application/forms/ImportRowModifierForm.php:42 msgid "Target property" msgstr "Proprietà obiettivo" #: library/Director/Web/Form/DirectorObjectForm.php:1086 #: library/Director/Web/Form/DirectorObjectForm.php:1090 #: library/Director/Web/Controller/TemplateController.php:158 msgid "Template" msgstr "Template" #: library/Director/Web/Table/TemplatesTable.php:51 msgid "Template Name" msgstr "Nome template" #: application/forms/IcingaScheduledDowntimeForm.php:16 msgid "Template name" msgstr "Nome template" #: library/Director/Web/Controller/ObjectController.php:283 #: library/Director/Web/Controller/TemplateController.php:115 #, php-format msgid "Template: %s" msgstr "Tempalte: %s" #: application/forms/IcingaServiceForm.php:692 #: library/Director/Web/Tree/TemplateTreeRenderer.php:43 #: library/Director/Web/Table/DependencyTemplateUsageTable.php:10 #: library/Director/Web/Table/HostTemplateUsageTable.php:10 #: library/Director/Web/Table/NotificationTemplateUsageTable.php:10 #: library/Director/Web/Table/ServiceTemplateUsageTable.php:10 #: library/Director/Web/Table/TemplateUsageTable.php:23 #: library/Director/Web/Tabs/ObjectsTabs.php:54 #, fuzzy msgid "Templates" msgstr "Templates" #: application/forms/DeployFormsBug7530.php:112 msgid "Thanks, I'll verify this and come back later" msgstr "Grazie, lo verificherò e tornerò più tardi" #: library/Director/Job/ImportJob.php:67 msgid "The \"Import\" job allows to run import actions at regular intervals" msgstr "" "Il lavoro \"Importa\" consente di eseguire azioni di importazione a " "intervalli regolari" #: library/Director/Job/SyncJob.php:65 msgid "The \"Sync\" job allows to run sync actions at regular intervals" msgstr "" "Il lavoro \"Sync\" permette di eseguire azioni di sincronizzazione a " "intervalli regolari" #: application/forms/IcingaTimePeriodRangeForm.php:84 #: application/forms/IcingaScheduledDowntimeRangeForm.php:89 #: library/Director/Web/Form/DirectorObjectForm.php:651 #, php-format msgid "The %s has successfully been stored" msgstr "Il %s è stato memorizzato con successo" #: library/Director/Job/ConfigJob.php:221 msgid "" "The Config job allows you to generate and eventually deploy your Icinga 2 " "configuration" msgstr "" "Il lavoro \"Configurazione\" permette di creare ed eventualmente di lanciare " "la configurazione di Icinga 2" #: application/forms/IcingaUserForm.php:37 msgid "The Email address of the user." msgstr "L'indirizzo e-mail dell'utente." #: library/Director/Job/HousekeepingJob.php:21 msgid "" "The Housekeeping job provides various task that keep your Director database " "fast and clean" msgstr "" "Il lavoro di pulizia offre diverse azioni che mantengono il database del " "Director veloce e pulito" #: application/controllers/DaemonController.php:38 #, php-format msgid "" "The Icinga Director Background Daemon is not running. Please check our %s in " "case you need step by step instructions showing you how to fix this." msgstr "" "Il demone dell'Icinga Director non è in funzione. Si prega di " "controllare le nostre %s nel caso in cui abbiate bisogno di istruzioni passo " "dopo passo che vi mostrino come risolvere il problema." #: application/controllers/SettingsController.php:38 msgid "" "The Icinga Director Self Service API allows your Hosts to register " "themselves. This allows them to get their Icinga Agent configured, installed " "and upgraded in an automated way." msgstr "" "L'API Self Service Director di Icinga consente ai vostri Ospiti di " "registrarsi. Questo permette loro di configurare, installare e aggiornare il " "loro agente Icinga in modo automatico." #: application/forms/SettingsForm.php:45 msgid "" "The Icinga Package name Director uses to deploy it's configuration. This " "defaults to \"director\" and should not be changed unless you really know " "what you're doing" msgstr "" "Il nome del pacchetto Icinga che Director utilizza per distribuire la sua " "configurazione. Questo valore predefinito è \"director\" e non dovrebbe " "essere cambiato a meno che non si sappia davvero cosa si sta facendo" #: library/Director/Import/ImportSourceLdap.php:69 msgid "" "The LDAP properties that should be fetched. This is required to be a comma-" "separated list like: \"cn, dnshostname, operatingsystem, sAMAccountName\"" msgstr "" "Le proprietà LDAP che dovrebbero essere recuperate. Questo deve essere un " "elenco separato da virgole come: \"cn, dnshostname, sistema operativo, " "sAMAccountName\"" #: application/forms/IcingaForgetApiKeyForm.php:31 #, php-format msgid "The Self Service API key for %s has been dropped" msgstr "La chiave API del Self Service per %s è stata abbandonata" #: application/forms/IcingaAddServiceSetForm.php:116 #, php-format msgid "The Service Set \"%s\" has been added to %d hosts" msgstr "Il set di servizi \"%s\" è stato aggiunto a %d host" #: application/forms/IcingaCommandArgumentForm.php:167 #, php-format msgid "The argument %s has successfully been stored" msgstr "L'argomento %s è stato memorizzato con successo" #: application/forms/IcingaObjectFieldForm.php:129 msgid "The caption which should be displayed" msgstr "L'etichetta da visualizzare" #: application/forms/DirectorDatafieldForm.php:153 msgid "" "The caption which should be displayed to your users when this field is shown" msgstr "" "La didascalia che dovrebbe essere visualizzata agli utenti quando viene " "mostrato questo campo" #: application/forms/IcingaDependencyForm.php:234 msgid "The child host." msgstr "L'Host figlio." #: application/forms/IcingaCommandForm.php:62 msgid "" "The command Icinga should run. Absolute paths are accepted as provided, " "relative paths are prefixed with \"PluginDir + \", similar Constant prefixes " "are allowed. Spaces will lead to separation of command path and standalone " "arguments. Please note that this means that we do not support spaces in " "plugin names and paths right now." msgstr "" "Il comando che Icinga dovrebbe eseguire. I percorsi assoluti saranno presi " "come specificato, i percorsi relativi saranno preceduti dal prefisso " "\"PluginDir +\", con costanti simili consentite come prefisso. Gli spazi " "possono essere usati per dividere il percorso del comando e gli argomenti a " "sé stanti. Ciò significa che attualmente non sono supportati spazi nei nomi " "e nei percorsi dei plugin." #: application/forms/KickstartForm.php:161 msgid "The corresponding password" msgstr "La password corrispondente" #: library/Director/PropertyModifier/PropertyModifierStripDomain.php:14 msgid "The domain name you want to be stripped" msgstr "Il nome a dominio da rimuovere" #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:18 msgid "The first (leftmost) CN" msgstr "La prima NC (più a sinistra)" #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:19 msgid "The first (leftmost) OU" msgstr "Il primo (più a sinistra) OU" #: application/forms/IcingaServiceForm.php:731 #, php-format msgid "The given properties have been stored for \"%s\"" msgstr "Le proprietà trasferite sono state salvate per \"%s\"" #: library/Director/Web/Form/DirectorObjectForm.php:1625 msgid "The host/service states you want to get notifications for" msgstr "Gli stati host/servizio per i quali devono essere inviate le notifiche" #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:21 msgid "The last (rightmost) OU" msgstr "L'ultimo (più a destra) OU" #: library/Director/Web/Widget/JobDetails.php:59 #, php-format msgid "The last attempt failed %s: %s" msgstr "L'ultimo tentativo è fallito %s: %s" #: library/Director/Web/Widget/JobDetails.php:54 #, php-format msgid "The last attempt succeeded %s" msgstr "L'ultimo tentativo è riuscito %s" #: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:83 msgid "The last deployment did not succeed" msgstr "L'ultimo rollout non ha avuto successo" #: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:85 msgid "The last deployment is currently pending" msgstr "Il rollout della configurazione è in corso" #: application/forms/IcingaEndpointForm.php:42 msgid "The log duration time." msgstr "Il tempo di durata del log." #: application/forms/IcingaUserForm.php:160 msgid "" "The name of a time period which determines when notifications to this User " "should be triggered. Not set by default." msgstr "" "Il nome del periodo di tempo che specifica quando le notifiche devono essere " "attivate per questo utente. Nessun valore predefinito." #: application/forms/IcingaDependencyForm.php:143 #: application/forms/IcingaNotificationForm.php:234 msgid "" "The name of a time period which determines when this notification should be " "triggered. Not set by default." msgstr "" "Il nome del periodo di tempo che specifica quando questa notifica deve " "essere attivata. Nessun valore predefinito." #: library/Director/Web/Form/DirectorObjectForm.php:1377 msgid "" "The name of a time period which determines when this object should be " "monitored. Not limited by default." msgstr "" "Il nome del periodo di tempo che specifica quando questo oggetto viene " "monitorato. Non limitato per impostazione predefinita." #: application/forms/DirectorJobForm.php:62 msgid "" "The name of a time period within this job should be active. Supports only " "simple time periods (weekday and multiple time definitions)" msgstr "" "Il nome del periodo di tempo entro il quale questo lavoro dovrebbe essere " "attivo. Permette solo periodi di tempo semplici (giorno della settimana e " "registrazioni multiple)" #: application/forms/IcingaHostVarForm.php:16 msgid "The name of the host" msgstr "Il nome degli hosts" #: application/forms/IcingaServiceVarForm.php:16 msgid "The name of the service" msgstr "Il nome del servizio" #: application/forms/IcingaNotificationForm.php:178 msgid "" "The notification interval (in seconds). This interval is used for active " "notifications. Defaults to 30 minutes. If set to 0, re-notifications are " "disabled." msgstr "" "L'intervallo di notifica (in secondi). Questo intervallo viene utilizzato " "per le notifiche attive. Il valore predefinito è 30 minuti. Se è impostato a " "0, le ripetizioni di notifica sono disattivate." #: library/Director/PropertyModifier/PropertyModifierBitmask.php:16 msgid "" "The numeric bitmask you want to apply. In case you have a hexadecimal or " "binary mask please transform it to a decimal number first. The result of " "this modifier is a boolean value, telling whether the given mask applies to " "the numeric value in your source column" msgstr "" "La bitmaschera numerica da applicare. Le maschere esadecimali e binarie " "devono prima essere convertite in un numero decimale. Il risultato è un " "valore booleano che indica se la maschera si applica al valore numerico " "nella colonna sorgente" #: application/forms/IcingaUserForm.php:42 msgid "The pager address of the user." msgstr "L'indirizzo del cercapersone dell'utente." #: application/forms/IcingaDependencyForm.php:202 msgid "" "The parent host. You might want to refer Host Custom Variables via $host." "vars.varname$" msgstr "" "L'host genitore. Proprietà host personalizzate possono essere referenziate " "tramite $host.vars.varname$" #: library/Director/PropertyModifier/PropertyModifierRegexReplace.php:15 #, fuzzy msgid "" "The pattern you want to search for. This can be a regular expression like /" "^www\\d+\\./" msgstr "" "Lo schema che si vuole cercare. Può essere un'espressione regolare come /" "^wwwwd++./" #: application/forms/IcingaEndpointForm.php:37 #, fuzzy msgid "The port of the endpoint." msgstr "La Porta di un endpoint." #: application/forms/KickstartForm.php:144 msgid "" "The port you are going to use. The default port 5665 will be used if none is " "set" msgstr "" " La porta da utilizzare. Se non è impostato alcun valore, si applica il " "valore predefinito 5665" #: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:64 msgid "The property to get from the row we found in the chosen Import Source" msgstr "" "La proprietà che vogliamo estrarre dalla linea che abbiamo trovato nella " "fonte di importazione selezionata" #: application/forms/IcingaAddServiceForm.php:174 #, php-format msgid "The service \"%s\" has been added to %d hosts" msgstr "Il servizio \"%s\" è stato aggiunto a %d Hosts" #: application/forms/IcingaAddServiceSetForm.php:88 msgid "The service Set that should be assigned" msgstr "Il set di servizi da assegnare" #: application/forms/IcingaServiceSetForm.php:87 msgid "The service set that should be assigned to this host" msgstr "Il set di servizi da assegnare a questo host" #: library/Director/Web/Form/DirectorObjectForm.php:1635 msgid "The state transition types you want to get notifications for" msgstr "" "I tipi di cambiamenti di stato per i quali devono essere inviate le notifiche" #: library/Director/PropertyModifier/PropertyModifierRegexReplace.php:23 msgid "The string that should be used as a preplacement" msgstr "La stringa di caratteri da utilizzare in sostituzione" #: library/Director/PropertyModifier/PropertyModifierReplace.php:14 msgid "The string you want to search for" msgstr "La stringa di caratteri da cercare" #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:41 #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:43 msgid "" "The string/pattern you want to search for. Depends on the chosen method, use " "www.* or *linux* for wildcard matches and expression like /^www\\d+\\./ in " "case you opted for a regular expression" msgstr "" "La stringa / pattern da cercare. A seconda del metodo selezionato, utilizzare " "www.* o *linux* per ricerche basate su caratteri jolly ed espressioni come /" "^www\\d+\\/ se si preferiscono le espressioni regolari" #: application/forms/DirectorDatafieldForm.php:143 msgid "" "The unique name of the field. This will be the name of the custom variable " "in the rendered Icinga configuration." msgstr "" "L'identificatore unico di questo campo. Questo è usato come nome della " "proprietà personalizzata nella configurazione resa da Icinga." #: application/forms/SelfServiceSettingsForm.php:168 msgid "The user that should run the Icinga 2 service on Windows." msgstr "" "L'account utente sotto il quale il servizio Icinga 2 funzionerà su Windows." #: application/forms/DirectorDatafieldForm.php:74 #, php-format msgid "" "There are %d objects with a related property. Should I also remove the \"%s" "\" property from them?" msgstr "" "Ci sono oggetti %d con una proprietà corrispondente. Il valore di \"%s\" " "deve essere rimosso da tutti?" #: application/forms/DirectorDatafieldForm.php:118 #, php-format msgid "" "There are %d objects with a related property. Should I also rename the \"%s" "\" property to \"%s\" on them?" msgstr "" "Ci sono oggetti %d con una proprietà corrispondente. La variabile \"%s\" " "deve essere rinominata in \"%s\" su tutti?" #: application/forms/DeploymentLinkForm.php:66 #, php-format msgid "There are %d pending changes" msgstr "Ci sono variazioni %d non ancora attuate" #: application/forms/DeploymentLinkForm.php:79 #, php-format msgid "There are %d pending changes, %d of them applied to this object" msgstr "" "Ci sono %d modifiche pendenti, di cui %d sono applicate a questo oggetto" #: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:88 #, php-format msgid "There are %d pending database migrations" msgstr "Ci sono %d migrazioni di database in sospeso" #: application/forms/IcingaObjectFieldForm.php:117 msgid "" "There are no data fields available. Please ask an administrator to create " "such" msgstr "Non sono disponibili campi dati. Un amministratore può crearne alcuni" #: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:91 msgid "There are no pending changes" msgstr "Non ci sono cambiamenti in sospeso" #: application/forms/DeployConfigForm.php:34 msgid "There are no pending changes. Deploy anyway" msgstr "Non ci sono cambiamenti in sospeso. Distrubuisci in ogni caso" #: library/Director/Web/Widget/ImportSourceDetails.php:55 msgid "" "There are pending changes for this Import Source. You should trigger a new " "Import Run." msgstr "" "Ci sono modifiche in sospeso per questa fonte di importazione. Dovrebbe " "essere attivata una nuova operazione di importazione." #: application/controllers/SyncruleController.php:83 msgid "" "There are pending changes for this Sync Rule. You should trigger a new Sync " "Run." msgstr "" "Ci sono modifiche in sospeso per questa regola di sincronizzazione. Dovrebbe " "essere attivata una nuova corsa di sincronizzazione." #: application/forms/KickstartForm.php:62 msgid "There are pending database migrations" msgstr "Le migrazioni del database sono in corso" #: application/forms/DeploymentLinkForm.php:71 #, fuzzy msgid "" "There has been a single change to this object, nothing else has been modified" msgstr "" "É stata applicata una singola modifica a questo oggetto, nessun'altra " "modifica e' stata effettuata" #: application/forms/DeploymentLinkForm.php:74 #, php-format msgid "" "There have been %d changes to this object, nothing else has been modified" msgstr "" "Ci sono state %d modifiche a questo oggetto, non è stato modificato " "nient'altro" #: application/forms/DeploymentLinkForm.php:63 msgid "There is a single pending change" msgstr "C'è un unico cambiamento in sospeso" #: application/forms/DirectorJobForm.php:21 msgid "These are different available job types" msgstr "Questi sono diversi tipi di lavoro disponibili" #: application/forms/ImportSourceForm.php:37 msgid "" "These are different data providers fetching data from various sources. You " "didn't find what you're looking for? Import sources are implemented as a " "hook in Director, so you might find (or write your own) Icinga Web 2 module " "fetching data from wherever you want" msgstr "" "Si tratta di diversi fornitori di dati che raccolgono dati da varie fonti. " "Non avete trovato quello che cercate? Le fonti di importazione sono " "implementate come un gancio in Director, quindi potresti trovare (o scrivere " "il tuo) modulo Icinga Web 2 che recupera dati da qualsiasi luogo tu voglia" #: application/controllers/CommandController.php:71 #, php-format msgid "This Command is currently being used by %s" msgstr "Questo comando è attualmente utilizzato da %s" #: application/controllers/CommandController.php:78 msgid "This Command is currently not in use" msgstr "Questo comando non è attualmente utilizzato" #: library/Director/Web/Form/DirectorObjectForm.php:928 #, php-format msgid "This Command is still in use by %d other objects" msgstr "Questo comando è usato da %d altri oggetti" #: library/Director/Web/Widget/ImportSourceDetails.php:62 #, php-format msgid "This Import Source failed when last checked at %s: %s" msgstr "" "Questa fonte di importazione non è riuscita in %s durante l'ultimo " "controllo: %s" #: library/Director/Web/Widget/ImportSourceDetails.php:70 #, php-format msgid "This Import Source has an invalid state: %s" msgstr "Questa fonte di importazione ha uno stato non valido: %s" #: application/forms/ImportCheckForm.php:33 msgid "This Import Source provides modified data" msgstr "Questa fonte di importazione fornisce dati modificati" #: library/Director/Web/Widget/ImportSourceDetails.php:45 #, php-format msgid "This Import Source was last found to be in sync at %s." msgstr "" "Questa fonte di importazione è stata trovata per l'ultima volta in " "sincronizzazione il %s." #: application/forms/IcingaServiceForm.php:134 msgid "This Service has been blacklisted on this host" msgstr "Questo servizio è stato messo nella lista nera di questo host" #: application/controllers/SyncruleController.php:90 #, php-format msgid "This Sync Rule failed when last checked at %s: %s" msgstr "" "Questa regola di sincronizzazione non è riuscita il %s durante l'ultimo " "controllo: %s" #: application/controllers/SyncruleController.php:60 msgid "This Sync Rule has never been run before." msgstr "Questa regola di sincronizzazione non è mai stata eseguita prima." #: application/controllers/SyncruleController.php:178 msgid "This Sync Rule is in sync and would currently not apply any changes" msgstr "" "Questa regola di sincronizzazione è sincronizzata e non causerebbe " "attualmente alcun cambiamento" #: application/controllers/SyncruleController.php:72 #, php-format msgid "This Sync Rule was last found to by in Sync at %s." msgstr "" "Questa regola di sincronizzazione è stata sincronizzata l'ultima volta il %s." #: application/forms/SyncPropertyForm.php:104 msgid "" "This allows to filter for specific parts within the given source expression. " "You are allowed to refer all imported columns. Examples: host=www* would set " "this property only for rows imported with a host property starting with \"www" "\". Complex example: host=www*&!(address=127.*|address6=::1)" msgstr "" "Permette il filtraggio di parti specifiche all'interno dell'espressione " "della sorgente specificata. Tutte le colonne importate possono essere " "specificate. Esempi: host=wwww* imposterebbe questa proprietà solo per le " "linee importate dove la proprietà host inizia con \"www\". Esempio " "complesso: host=wwwww*&!(indirizzo=127.*|indirizzo6=::1)" #: library/Director/DataType/DataTypeDatalist.php:140 msgid "This allows to show either a drop-down list or an auto-completion" msgstr "" "Questo permette di visualizzare un menu a tendina o un campo con " "completamento automatico" #: application/forms/DirectorJobForm.php:39 msgid "This allows to temporarily disable this job" msgstr "Consente di disattivare temporaneamente questo lavoro" #: application/forms/IcingaHostGroupForm.php:30 #: application/forms/IcingaScheduledDowntimeForm.php:111 #: application/forms/IcingaDependencyForm.php:115 #: application/forms/IcingaNotificationForm.php:106 #: application/forms/IcingaServiceForm.php:450 #: application/forms/IcingaServiceGroupForm.php:30 msgid "" "This allows you to configure an assignment filter. Please feel free to " "combine as many nested operators as you want. The \"contains\" operator is " "valid for arrays only. Please use wildcards and the = (equals) operator when " "searching for partial string matches, like in *.example.com" msgstr "" "Questo permette di definire un filtro di assegnazione (assign). Un numero " "qualsiasi di operatori può essere annidato a qualsiasi profondità. " "L'operatore \"contiene\" è consentito solo per gli array. Per confrontare le " "sottostringhe si prega di utilizzare i caratteri jolly, come in *.example.com" #: application/forms/IcingaServiceSetForm.php:121 msgid "" "This allows you to configure an assignment filter. Please feel free to " "combine as many nested operators as you want. You might also want to skip " "this, define it later and/or just add this set of services to single hosts. " "The \"contains\" operator is valid for arrays only. Please use wildcards and " "the = (equals) operator when searching for partial string matches, like in *." "example.com" msgstr "" "Questo permette di definire un filtro di assegnazione (assign). Un numero " "qualsiasi di operatori può essere annidato a qualsiasi profondità. Questo " "passo può anche essere saltato ed eventualmente implementato in un secondo " "momento. In alternativa (o in aggiunta) questo set di servizi può essere " "assegnato direttamente ai singoli host. L'operatore \"contiene\" è " "consentito solo per gli array. Per confrontare le sottostringhe si prega di " "utilizzare i caratteri jolly, come in *.example.com" #: library/Director/Job/ConfigJob.php:197 msgid "This allows you to immediately deploy a modified configuration" msgstr "Questo permette il rollout immediato di una configurazione modificata" #: library/Director/ProvidedHook/CubeLinks.php:37 #, php-format msgid "This allows you to modify properties for \"%s\"" msgstr "Permette di modificare le proprietà di \"%s\"" #: library/Director/ProvidedHook/CubeLinks.php:54 msgid "This allows you to modify properties for all chosen hosts at once" msgstr "" "Questo consente di modificare le proprietà per tutti gli host selezionati in " "una sola volta" #: application/controllers/BasketController.php:62 msgid "This basket is empty" msgstr "Questo basket è vuoto" #: application/forms/KickstartForm.php:253 msgid "This has to be a MySQL or PostgreSQL database" msgstr "Questo deve essere un database MySQL o PostgreSQL" #: library/Director/Web/SelfService.php:62 msgid "" "This host has been registered via the Icinga Director Self Service API. In " "case you re-installed the host or somehow lost it's secret key, you might " "want to dismiss the current key. This would allow you to register the same " "host again." msgstr "" "Questo host è stato registrato utilizzando l'API self-service di Icinga " "Director. Se l'host è stato reinstallato o la chiave è stata smarrita, è " "possibile che si desideri eliminare la chiave corrente. Questo permetterebbe " "di ri-registrare lo stesso ospite." #: application/controllers/InspectController.php:73 #, fuzzy msgid "This is an abstract object type." msgstr "Questo é un oggetto ti tipo astratto." #: library/Director/Web/Controller/TemplateController.php:178 #, php-format msgid "This is the \"%s\" %s Template. Based on this, you might want to:" msgstr "Questo è il template \"%s\" %s. Sulla base di questo, è possibile:" #: application/forms/KickstartForm.php:119 msgid "" "This is the name of the Endpoint object (and certificate name) you created " "for your ApiListener object. In case you are unsure what this means please " "make sure to read the documentation first" msgstr "" "Questo è il nome dell'oggetto Endpoint (e il nome del certificato) che avete " "creato per il vostro oggetto ApiListener. Nel caso non siate sicuri di cosa " "questo significhi, assicuratevi di leggere prima la documentazione" #: library/Director/Dashboard/Dashlet/HostsDashlet.php:17 msgid "" "This is where you add all your servers, containers, network or sensor " "devices - and much more. Every subject worth to be monitored" msgstr "" "Qui si aggiungono tutti i vostri server, contenitori, dispositivi di rete o " "sensori - e molto altro ancora. Ogni soggetto che vale la pena di essere " "monitorato" #: library/Director/Dashboard/HostsDashboard.php:22 msgid "" "This is where you manage your Icinga 2 Host Checks. Host templates are your " "main building blocks. You can bundle them to \"choices\", allowing (or " "forcing) your users to choose among a given set of preconfigured templates." msgstr "" "Qui è dove si gestiscono i controlli degli host di Icinga 2. I template di " "host sono i vostri principali elementi costitutivi. Puoi raggrupparli in " "\"scelte\", permettendo (o obbligando) i tuoi utenti a scegliere tra un dato " "set di template preconfigurati." #: library/Director/Dashboard/ServicesDashboard.php:24 msgid "" "This is where you manage your Icinga 2 Service Checks. Service Templates are " "your base building blocks, Service Sets allow you to assign multiple " "Services at once. Apply Rules make it possible to assign Services based on " "Host properties. And the list of all single Service Objects gives you the " "possibility to still modify (or delete) many of them at once." msgstr "" "Qui è dove si gestiscono i controlli di servizio di Icinga 2. I Service " "Template sono i vostri blocchi di base, i Service Set vi permettono di " "assegnare più Servizi contemporaneamente. Le Regole di applicazione " "consentono di assegnare i Servizi in base alle proprietà Host. E l'elenco di " "tutti i singoli Oggetti di Servizio ti dà la possibilità di modificare (o " "cancellare) molti di essi contemporaneamente." #: library/Director/Dashboard/UsersDashboard.php:21 msgid "" "This is where you manage your Icinga 2 User (Contact) objects. Try to keep " "your User objects simply by movin complexity to your templates. Bundle your " "users in groups and build Notifications based on them. Running MS Active " "Directory or another central User inventory? Stay away from fiddling with " "manual config, try to automate all the things with Imports and related Sync " "Rules!" msgstr "" "Qui si gestiscono gli oggetti di Icinga 2 User (Contact). Cercate di " "mantenere i vostri oggetti User semplici spostando la complessità nei " "templates. Raggruppate gli utenti in gruppi e configurate le " "Notifiche in base ad essi. Cercate di utilizzare MS Active Directory o un altro " "database utente centralizzato? Consigliamo di evitare le " "configurazioni manuali, e di utilizzare regole di importazione e sincronizzazione create " "per automatizzare la procedura." #: library/Director/Dashboard/InfrastructureDashboard.php:24 msgid "" "This is where you manage your Icinga 2 infrastructure. When adding a new " "Icinga Master or Satellite please re-run the Kickstart Helper once.\n" "\n" "When you feel the desire to manually create Zone or Endpoint objects please " "rethink this twice. Doing so is mostly the wrong way, might lead to a dead " "end, requiring quite some effort to clean up the whole mess afterwards." msgstr "" "Qui è dove si gestisce l'infrastruttura di Icinga 2. Quando si aggiunge un " "nuovo Icinga Master o Satellite, si prega di eseguire nuovamente il " "Kickstart Helper.\n" "\n" "Creare Zone o Endpoint manualmente, il più delle volte si rivela la scelta sbagliata " "portando ad un vicolo cieco che costringe l'utente a ripulire il sistema " "dalle modifiche apportate." #: library/Director/Web/Table/ObjectsTableEndpoint.php:45 msgid "This is your Config master and will receive our Deployments" msgstr "Questo è il vostro Config master e riceverà le nostre distribuzioni" #: library/Director/Web/Widget/JobDetails.php:67 msgid "This job has not been executed yet" msgstr "Questo lavoro non è stato ancora eseguito" #: library/Director/Web/Widget/JobDetails.php:35 #, php-format msgid "This job runs every %ds and is currently pending" msgstr "Questo lavoro viene eseguito ogni %ds ed è attualmente in sospeso" #: library/Director/Web/Widget/JobDetails.php:39 #, php-format msgid "This job runs every %ds." msgstr "Questo lavoro viene eseguito ogni %ds." #: library/Director/Web/Widget/JobDetails.php:26 #, php-format msgid "" "This job would run every %ds. It has been disabled and will therefore not be " "executed as scheduled" msgstr "" "Questo lavoro verrebbe eseguito ogni %ds. È stato disattivato e quindi non " "verrà eseguito come previsto" #: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:33 msgid "" "This modifier transforms 0/\"0\"/false/\"false\"/\"n\"/\"no\" to false and " "1, \"1\", true, \"true\", \"y\" and \"yes\" to true, both in a case " "insensitive way. What should happen if the given value does not match any of " "those? You could return a null value, or default to false or true. You might " "also consider interrupting the whole import process as of invalid source data" msgstr "" "Questo modificatore trasforma 0/\"0\"0\"/falso/\"falso\"/\"n\"/\"no\" in " "falso e 1, \"1\", vero, \"vero\", \"y\" e \"sì\" in vero, in entramnbi i casi " "senza distinzione tra maiuscole e minuscole. Cosa dovrebbe succedere se il valore dato non " "corrispondesse a nessuno di questi? Si potrebbe restituire un valore nullo, o " "fissare il valore di default a vero o a falso. Si potrebbe anche considerare di interrompere " "l'intero processo di importazione, in quanto i dati della sorgente non sarebbero da considerarsi validi" #: application/forms/ImportSourceForm.php:89 msgid "" "This must be a column containing unique values like hostnames. Unless " "otherwise specified this will then be used as the object_name for the " "syncronized Icinga object. Especially when getting started with director " "please make sure to strictly follow this rule. Duplicate values for this " "column on different rows will trigger a failure, your import run will not " "succeed. Please pay attention when synching services, as \"purge\" will only " "work correctly with a key_column corresponding to host!name. Check the " "\"Combine\" property modifier in case your data source cannot provide such a " "field" msgstr "" "Questa colonna deve contenere valori unici, come gli hostname. " "Se non diversamente specificato, questo sarà usato come nome oggetto per " "la sincronizzazione dell'oggetto Icinga. Soprattutto quando si inizia a lavorare con " "il Director, assicurarsi di seguire rigorosamente questa regola. Creare dei valori duplicati " "in righe diverse di questa colonna porterà ad un errore che nel processo " "di importazione. Si prega di prestare attenzione quando si " "sincronizzano i servizi, poiché \"purge\" funzionerà correttamente solo con " "una chiave colonna corrispondente al nome host!name. Controllate il " "modificatore di proprietà \"Combine\" nel caso in cui la vostra fonte di " "dati non sia in grado di fornire tale campo" #: application/forms/IcingaScheduledDowntimeForm.php:29 msgid "This name will show up as the author for ever related downtime comment" msgstr "" "Questo nome si presenterà come l'autore per il commento sempre relativo ai " "tempi di inattività" #: library/Director/Web/Widget/ActivityLogInfo.php:568 msgid "This object has been disabled" msgstr "Questo oggetto è stato disabilitato" #: library/Director/Web/Widget/ActivityLogInfo.php:563 msgid "This object has been enabled" msgstr "Questo oggetto è stato abilitato" #: library/Director/Web/ObjectPreview.php:76 msgid "This object will not be deployed as it has been disabled" msgstr "Questo oggetto non verrà distribuito in quanto è stato disabilitato" #: library/Director/PropertyModifier/PropertyModifierCombine.php:17 msgid "" "This pattern will be evaluated, and variables like ${some_column} will be " "filled accordingly. A typical use-case is generating unique service " "identifiers via ${host}!${service} in case your data source doesn't allow " "you to ship such. The chosen \"property\" has no effect here and will be " "ignored." msgstr "" "Questo pattern sarà esaminato e le variabili come ${qualche_colonna} saranno " "sostituite di conseguenza. Un tipico caso d'uso è la generazione di " "identificatori di servizio unici tramite ${host}!${servizio} nel caso in cui " "la vostra fonte di dati non vi permetta di spedirli. La \"proprietà\" scelta " "non ha alcun effetto in questo caso e sarà ignorata." #: library/Director/Web/SelfService.php:234 msgid "" "This requires the Icinga Agent to be installed. It generates and signs it's " "certificate and it also generates a minimal icinga2.conf to get your agent " "connected to it's parents" msgstr "" "Questo richiede che l'agente Icinga sia installato. Esso genera e firma il " "suo certificato e crea una configurazione minimale icinga2.conf per far sì che " "l'agente sia collegato al suo corrispondente elemento padre." #: application/forms/IcingaServiceForm.php:373 #, php-format msgid "" "This service belongs to the %s Service Set. Still, you might want to " "override the following properties for this host only." msgstr "" "Questo servizio appartiene al set di servizi %s. Tuttavia, potreste voler " "sovrascrivere le seguenti proprietà solo per questo host." #: application/forms/IcingaServiceForm.php:417 #, php-format msgid "" "This service belongs to the service set \"%s\". Still, you might want to " "change the following properties for this host only." msgstr "" "Questo servizio appartiene al set \"%s\". Tuttavia, le seguenti proprietà " "possono essere modificate solo per questo specifico host." #: application/forms/IcingaServiceForm.php:354 msgid "" "This service has been generated in an automated way, but still allows you to " "override the following properties in a safe way." msgstr "" "Questo servizio è stato creato da un automatismo, ma permette comunque di " "sovrascrivere le seguenti proprietà in modo sicuro." #: application/forms/IcingaServiceForm.php:360 #, php-format msgid "" "This service has been generated using the %s apply rule, assigned where %s" msgstr "" "Questo servizio è stato creato dalla apply rule %s, e viene " "assegnato dove %s" #: application/forms/IcingaServiceForm.php:385 #, php-format msgid "" "This service has been inherited from %s. Still, you might want to change the " "following properties for this host only." msgstr "" "Questo servizio è stato ereditato da %s. Tuttavia, potreste voler cambiare " "le seguenti proprietà solo per questo host." #: library/Director/Web/Table/IcingaServiceSetServiceTable.php:184 #, php-format msgid "This set has been inherited from %s" msgstr "Questo set è stato ereditato da %s" #: library/Director/Dashboard/Dashlet/KickstartDashlet.php:17 msgid "" "This synchronizes Icinga Director to your Icinga 2 infrastructure. A new run " "should be triggered on infrastructure changes" msgstr "" "Questo sincronizza il Director Icinga con la vostra infrastruttura di Icinga " "2. In caso di modifiche all'infrastruttura, eseguire una nuova sincronizzazione " #: library/Director/Web/Table/TemplateUsageTable.php:103 msgid "This template is not in use" msgstr "Questo template non è in uso" #: library/Director/Web/Form/DirectorObjectForm.php:918 #, php-format msgid "This template is still in use by %d other objects" msgstr "Questo template è ancora in uso da %d altri oggetti" #: application/forms/IcingaTemplateChoiceForm.php:51 msgid "This will be shown as a label for the given choice" msgstr "Questo sarà mostrato come etichetta per la scelta data" #: application/forms/DirectorDatalistEntryForm.php:33 msgid "This will be the visible caption for this entry" msgstr "Questa sarà la didascalia visibile per questa voce" #: library/Director/Web/SelfService.php:123 #, fuzzy msgid "This will invalidate the former key" msgstr "Questo invaliderà la chiave precedente" #: library/Director/Web/SelfService.php:224 msgid "Ticket" msgstr "Ticket" #: application/forms/SyncRuleForm.php:21 msgid "Time Period" msgstr "Periodo di tempo" #: application/forms/BasketForm.php:28 msgid "Time Periods" msgstr "Periodi di tempo" #: application/forms/IcingaUserForm.php:158 #: application/forms/DirectorJobForm.php:60 #: application/forms/IcingaDependencyForm.php:141 #: application/forms/IcingaNotificationForm.php:232 msgid "Time period" msgstr "Periodo temporale" #: application/controllers/TimeperiodController.php:17 #: application/controllers/ScheduledDowntimeController.php:17 msgid "Time period ranges" msgstr "Fasce nel periodo temporale" #: application/forms/IcingaScheduledDowntimeRangeForm.php:56 #, php-format msgid "Time range \"%s\" has been removed from %s" msgstr "L'intervallo di tempo \"%s\" è stato eliminato da %s" #: application/forms/SyncPropertyForm.php:320 msgid "Time ranges" msgstr "Intervalli temporali" #: application/forms/IcingaCommandForm.php:70 msgid "Timeout" msgstr "Timeout" #: library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:13 msgid "Timeperiod Templates" msgstr "Templates per periodo temporale" #: application/forms/IcingaScheduledDowntimeRangeForm.php:29 #: library/Director/Dashboard/Dashlet/TimeperiodObjectDashlet.php:16 #: library/Director/Dashboard/Dashlet/TimeperiodsDashlet.php:13 #: library/Director/Web/Table/IcingaScheduledDowntimeRangeTable.php:52 #: library/Director/Web/Table/IcingaTimePeriodRangeTable.php:46 msgid "Timeperiods" msgstr "Periodi di tempo" #: application/forms/IcingaTimePeriodRangeForm.php:28 msgid "Timerperiods" msgstr "Periodi di tempo" #: library/Director/Web/Table/ImportrunTable.php:31 msgid "Timestamp" msgstr "Data e ora" #: application/forms/SelfServiceSettingsForm.php:46 #: application/forms/SelfServiceSettingsForm.php:154 msgid "" "To ensure downloaded packages are build by the Icinga Team and not " "compromised by third parties, you will be able to provide an array of SHA1 " "hashes here. In case you have defined any hashses, the module will not " "continue with updating / installing the Agent in case the SHA1 hash of the " "downloaded MSI package is not matching one of the provided hashes of this " "setting" msgstr "" "Per garantire che i pacchetti scaricati siano compilati dal Team di Icinga e " "non siano compromessi da terze parti, si potrà fornire un array di hash SHA1 " "qui. Nel caso abbiate definito degli hash, il modulo non continuerà con " "l'aggiornamento / installazione dell'agente nel caso in cui l'hash SHA1 del " "pacchetto MSI scaricato non corrisponda ad uno degli hash forniti di questa " "impostazione" #: library/Director/Web/SelfService.php:197 msgid "Top Down" msgstr "Top Down" #: library/Director/Web/Table/TemplateUsageTable.php:57 msgid "Total" msgstr "Totale" #: application/forms/SelfServiceSettingsForm.php:31 msgid "Transform Host Name" msgstr "Trasformare Nome Host" #: application/forms/SelfServiceSettingsForm.php:37 msgid "Transform to lowercase" msgstr "Trasformare in minuscola" #: application/forms/SelfServiceSettingsForm.php:38 msgid "Transform to uppercase" msgstr "Trasformare in maiuscola" #: library/Director/Web/Form/DirectorObjectForm.php:1632 msgid "Transition types" msgstr "Tipi di transizione" #: library/Director/Web/ActionBar/TemplateActionBar.php:30 msgid "Tree" msgstr "Albero" #: application/forms/ImportRunForm.php:23 msgid "Trigger Import Run" msgstr "Attivare l'importazione" #: application/forms/SyncRunForm.php:23 msgid "Trigger this Sync" msgstr "Attivare questa sincronizzazione" #: application/forms/ImportRunForm.php:45 msgid "Triggering this Import Source failed" msgstr "L'avvio di questa fonte di importazione non è riuscito" #: library/Director/Dashboard/Dashlet/SettingsDashlet.php:17 msgid "Tweak some global Director settings" msgstr "Modificare alcune impostazioni globali del Director" #: library/Director/Web/Table/CoreApiFieldsTable.php:75 msgid "Type" msgstr "Tipo" #: application/controllers/InspectController.php:84 msgid "Type attributes" msgstr "Tipo attributi" #: library/Director/PropertyModifier/PropertyModifierParseURL.php:27 #: library/Director/PropertyModifier/PropertyModifierParseURL.php:28 msgid "URL component" msgstr "Componente URL" #: application/forms/DeployFormsBug7530.php:70 msgid "Unable to detect your Icinga 2 Core version" msgstr "Impossibile rilevare la versione Core di Icinga 2" #: application/forms/SyncPropertyForm.php:167 #: library/Director/DataType/DataTypeSqlQuery.php:27 #, php-format msgid "Unable to fetch data: %s" msgstr "Impossibile recuperare i dati: %s" #: application/forms/IcingaHostForm.php:364 msgid "" "Unable to store a host with the given properties because of insufficient " "permissions" msgstr "" "Impossibile memorizzare un host con le proprietà date a causa di " "autorizzazioni insufficienti" #: application/forms/KickstartForm.php:339 #, php-format msgid "" "Unable to store the configuration to \"%s\". Please check file permissions " "or manually store the content shown below" msgstr "" "Impossibile memorizzare la configurazione in \"%s\". Si prega di controllare " "i permessi dei file o di memorizzare manualmente il contenuto mostrato qui " "sotto" #: library/Director/Db/Housekeeping.php:49 msgid "Undeployed configurations" msgstr "Configurazioni non distribuite" #: library/Director/IcingaConfig/StateFilterSet.php:27 msgid "Unknown" msgstr "Sconosciuto" #: library/Director/Web/Widget/DeploymentInfo.php:136 msgid "Unknown, failed to collect related information" msgstr "Sconosciuto, non ha raccolto informazioni correlate" #: library/Director/Web/Widget/DeploymentInfo.php:134 msgid "Unknown, still waiting for config check outcome" msgstr "" "Sconosciuto, ancora in attesa dell'esito del controllo della configurazione" #: library/Director/Db/Housekeeping.php:53 msgid "Unlinked imported properties" msgstr "Proprietà importate non collegate" #: library/Director/Db/Housekeeping.php:51 msgid "Unlinked imported row sets" msgstr "Set di file importate non collegate" #: library/Director/Db/Housekeeping.php:52 msgid "Unlinked imported rows" msgstr "Righe importate non collegate" #: application/controllers/PhperrorController.php:21 #: application/controllers/PhperrorController.php:59 msgid "Unsatisfied dependencies" msgstr "Le dipendenze non sono soddisfatte" #: library/Director/Db/Housekeeping.php:50 msgid "Unused rendered files" msgstr "Alcuni file generati non sono in uso" #: library/Director/IcingaConfig/StateFilterSet.php:20 msgid "Up" msgstr "Su" #: application/forms/IcingaTimePeriodForm.php:25 msgid "Update Method" msgstr "Metodo di aggiornamento" #: application/forms/SyncRuleForm.php:52 msgid "Update Policy" msgstr "Politica di aggiornamento" #: application/forms/DeployFormsBug7530.php:105 msgid "Upgrading Icinga 2 - Confic Sync: Zones in Zones" msgstr "Aggiornamento di Icinga 2 - Confic Sync: Zone in zone" #: application/forms/DeployFormsBug7530.php:107 msgid "Upgrading documentation" msgstr "Aggiornamento della documentazione" #: application/controllers/BasketsController.php:26 #: application/forms/BasketUploadForm.php:43 msgid "Upload" msgstr "Carica" #: application/controllers/BasketController.php:120 msgid "Upload a Basket" msgstr "Carica un Basket" #: application/controllers/BasketController.php:121 msgid "Upload a Configuration Basket" msgstr "Caricare una configurazione Basket " #: library/Director/Web/Controller/ObjectController.php:302 msgid "Usage" msgstr "Utilizzo" #: library/Director/Web/Widget/AdditionalTableActions.php:101 #, php-format msgid "Usage (%s)" msgstr "Utilizzo (%s)" #: application/forms/SelfServiceSettingsForm.php:71 msgid "Use a local file or network share" msgstr "Utilizzare una directory locale o una condivisione di rete" #: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:18 msgid "Use lowercase first" msgstr "Convertire solo in minuscole" #: application/forms/SyncPropertyForm.php:272 msgid "Used sources" msgstr "Fonti utilizzate" #: application/forms/SyncRuleForm.php:17 #: library/Director/TranslationDummy.php:17 msgid "User" msgstr "Utente" #: application/forms/SyncRuleForm.php:18 msgid "User Group" msgstr "Gruppo utenti" #: library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:11 msgid "User Groups" msgstr "Gruppi utenti" #: library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:13 msgid "User Templates" msgstr "Templates utente" #: application/forms/IcingaNotificationForm.php:156 #: library/Director/DataType/DataTypeDirectorObject.php:60 msgid "User groups" msgstr "Gruppi utenti" #: application/forms/IcingaUserForm.php:113 msgid "" "User groups that should be directly assigned to this user. Groups can be " "useful for various reasons. You might prefer to send notifications to groups " "instead of single users" msgstr "" "Gruppi di utenti che dovrebbero essere assegnati direttamente a questo " "utente. I gruppi possono essere utilizzati per diversi scopi. Potrebbe " "essere utile inviare le notifiche a gruppi invece che a singoli utenti" #: application/forms/IcingaNotificationForm.php:158 msgid "User groups that should be notified by this notifications" msgstr "Gruppi di utenti che devono essere notificati" #: application/forms/IcingaUserForm.php:194 msgid "User properties" msgstr "Proprietà dell'utente" #: application/forms/IcingaUserForm.php:22 msgid "User template name" msgstr "Nome del template utente" #: application/forms/IcingaUserGroupForm.php:17 msgid "Usergroup" msgstr "Gruppo utente" #: library/Director/Import/ImportSourceCoreApi.php:63 msgid "Usergroups" msgstr "Gruppi utente" #: application/forms/IcingaUserForm.php:28 #: library/Director/Web/Widget/BackgroundDaemonDetails.php:67 #: library/Director/Import/ImportSourceRestApi.php:149 msgid "Username" msgstr "Nome utente" #: application/forms/IcingaNotificationForm.php:131 #: library/Director/Web/Table/CustomvarVariantsTable.php:62 #: library/Director/Web/Table/CustomvarTable.php:47 #: library/Director/Import/ImportSourceCoreApi.php:62 #: library/Director/DataType/DataTypeDirectorObject.php:59 msgid "Users" msgstr "Utenti" #: library/Director/Dashboard/Dashlet/UserObjectDashlet.php:16 #: library/Director/Dashboard/Dashlet/UsersDashlet.php:13 msgid "Users / Contacts" msgstr "Utenti / Contatti" #: application/forms/IcingaNotificationForm.php:133 msgid "Users that should be notified by this notifications" msgstr "Utenti che devono essere notificati" #: library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:17 msgid "" "Using Apply Rules a Service can be applied to multiple hosts at once, based " "on filters dealing with any combination of their properties" msgstr "" "Utilizzando le Regole di applicazione, un servizio può essere applicato a più " "host contemporaneamente sulla base di filtri che trattano qualsiasi " "combinazione delle loro proprietà" #: application/forms/IcingaHostSelfServiceForm.php:44 #: application/forms/IcingaHostForm.php:317 msgid "Usually your hosts main IPv6 address" msgstr "L'indirizzo IPv6 principale del vostro host" #: application/forms/IcingaCommandArgumentForm.php:50 #: application/forms/IcingaCommandArgumentForm.php:59 #: application/forms/CustomvarForm.php:21 #: application/forms/IcingaHostVarForm.php:27 #: application/forms/IcingaServiceVarForm.php:27 #: library/Director/Web/Table/IcingaCommandArgumentTable.php:46 msgid "Value" msgstr "Valore" #: application/forms/IcingaCommandArgumentForm.php:36 msgid "Value type" msgstr "Tipo valore" #: library/Director/Web/Table/CustomvarVariantsTable.php:56 msgid "Variable Value" msgstr "Valore Variabile" #: application/forms/CustomvarForm.php:16 #: library/Director/Web/Table/CustomvarTable.php:41 msgid "Variable name" msgstr "Nome Variabile" #: library/Director/Import/ImportSourceRestApi.php:103 msgid "Verify Host" msgstr "Verifica Host" #: library/Director/Import/ImportSourceRestApi.php:96 msgid "Verify Peer" msgstr "Verifica Peer" #: library/Director/DataType/DataTypeString.php:24 msgid "Visibility" msgstr "Visibilità" #: library/Director/DataType/DataTypeString.php:26 msgid "Visible" msgstr "Visibile" #: library/Director/Web/Form/DirectorObjectForm.php:1445 msgid "Volatile" msgstr "Volatile" #: application/forms/IcingaCommandForm.php:81 msgid "" "WARNING, this can allow shell script injection via custom variables used in " "command." msgstr "" "ATTENZIONE, questo può consentire l'iniezione di script via shell tramite " "variabili personalizzate utilizzate nel commando." #: library/Director/Dashboard/TimeperiodsDashboard.php:20 msgid "" "Want to define to execute specific checks only withing specific time " "periods? Get mobile notifications only out of office hours, but mail " "notifications all around the clock? Time Periods allow you to tackle those " "and similar requirements." msgstr "" "Volete impostare l'esecuzione di controlli specifici solo in sepcifici periodi di tempo? " "Ricevere notifiche sul cellulare solo fuori dall'orario d'ufficio, ma " "notifiche via e-mail 24 ore su 24? I Periodi di temporali consentono di " "soddisfare questi e requisiti simili." #: library/Director/IcingaConfig/StateFilterSet.php:25 msgid "Warning" msgstr "Attenzione" #: application/forms/DeployFormsBug7530.php:90 #, php-format msgid "" "Warning: you're running Icinga v2.11.0 and our configuration looks like you " "could face issue %s. We're already working on a solution. The GitHub Issue " "and our %s contain related details." msgstr "" "Attenzione: state utilizzando Icinga v2.11.0 ed è possibile che riscontriate " "il problema %s. Stiamo già lavorando ad una soluzione. Per maggiori dettagli" "fate riferimento a GitHub e al nostro %s." #: library/Director/Web/Form/DirectorObjectForm.php:1104 msgid "" "What kind of object this should be. Templates allow full access to any " "property, they are your building blocks for \"real\" objects. External " "objects should usually not be manually created or modified. They allow you " "to work with objects locally defined on your Icinga nodes, while not " "rendering and deploying them with the Director. Apply rules allow to assign " "services, notifications and groups to other objects." msgstr "" "Che tipo di oggetto dovrebbe essere. I templates consentono l'accesso completo " "a qualsiasi proprietà, sono i vostri elementi costitutivi per gli oggetti " "\"reali\". Gli oggetti esterni di solito non dovrebbero essere creati o " "modificati manualmente. Permettono di lavorare con oggetti definiti " "localmente sui nodi di Icinga, senza renderli e distribuirli con il " "Direttore. Le regole di applicazione permettono di assegnare servizi, " "notifiche e gruppi ad altri oggetti." #: library/Director/PropertyModifier/PropertyModifierMap.php:28 msgid "" "What should happen if the lookup key does not exist in the data list? You " "could return a null value, keep the unmodified imported value or interrupt " "the import process" msgstr "" "Cosa potrebbe succedere se la chiave di ricerca non esistesse nella lista " "data? Si potrebbe restituire un valore nullo, mantenere il valore importato " "non modificato o interrompere il processo di importazione" #: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:24 #: library/Director/PropertyModifier/PropertyModifierSplit.php:24 msgid "What should happen when the given string is empty?" msgstr "Cosa dovrebbe accadere quando la stringa data fosse vuota?" #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:66 msgid "What should happen when the result array is empty?" msgstr "Cosa dovrebbe succedere se l'array risultante fosse vuoto?" #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:50 msgid "What should happen when the specified element is not available?" msgstr "Cosa deve succedere se l'articolo specificato non fosse disponibile?" #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:53 msgid "What should happen with matching elements?" msgstr "Cosa dovrebbe accadere con gli elementi selezionati?" #: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:55 msgid "" "What should happen with the row, when this property matches the given " "expression?" msgstr "" "Cosa dovrebbe succedere alla riga se l'espressione data corrispondesse a questa " "proprietà?" #: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:32 msgid "What should we do if the DNS lookup fails?" msgstr "Cosa dovrebbe succedere se la risoluzione (DNS) fallisse?" #: library/Director/PropertyModifier/PropertyModifierParseURL.php:36 msgid "" "What should we do if the URL could not get parsed or component not found?" msgstr "" "Cosa si deve fare se l'URL non potesse essere analizzato o se non fosse " "possibile trovarne i componenti?" #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:28 msgid "What should we do if the desired part does not exist?" msgstr "Cosa dovrebbe succedere se la parte desiderata non esistesse?" #: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:15 msgid "What should we do if the host (DNS) lookup fails?" msgstr "Cosa dobbiamo fare se la ricerca dell'host (DNS) non riuscisse?" #: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:22 msgid "What should we do in case we are unable to decode the given string?" msgstr "" "Cosa dovrebbe succedere se la stringa passata non potesse essere decodificata?" #: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:16 msgid "What should we extract from the DN?" msgstr "Cosa dobbiamo estrarre dal DN?" #: application/forms/BasketForm.php:57 msgid "" "What should we place into this Basket every time we create new snapshot?" msgstr "" "Cosa dobbiamo mettere in questo Basket ogni volta che creiamo un nuovo " "snapshot?" #: application/forms/SelfServiceSettingsForm.php:21 #, fuzzy msgid "What to use as your Icinga 2 Agent's Host Name" msgstr "Hostname da usare per l'Icinga2-Agent?" #: library/Director/Job/ConfigJob.php:209 msgid "" "When deploying configuration, wait at least this amount of seconds unless " "the next deployment should take place" msgstr "" "Durante la distribuzione della configurazione, attendere almeno qualche secondo " "a meno che non si debba procedere con la successiva distribuzione " #: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:21 #: library/Director/PropertyModifier/PropertyModifierSplit.php:21 #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:63 #, fuzzy msgid "When empty" msgstr "Quando é vuoto" #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:47 msgid "When not available" msgstr "Quando non disponibile" #: application/forms/IcingaNotificationForm.php:210 #, fuzzy msgid "When the last notification should be sent" msgstr "Quando deve essere inviata l'ultima notifica?" #: application/forms/IcingaScheduledDowntimeForm.php:100 msgid "" "Whether Downtimes should also explicitly be scheduled for all Services " "belonging to affected Hosts" msgstr "" "Se i tempi di inattività devono essere esplicitamente programmati anche per " "tutti i servizi appartenenti agli host interessati" #: application/forms/SettingsForm.php:63 msgid "Whether all configured Jobs should be disabled" msgstr "Se tutti i lavori configurati devono essere disattivati" #: library/Director/Web/Form/DirectorObjectForm.php:1418 msgid "Whether flap detection is enabled on this object" msgstr "Se il riconoscimento dei flap è abilitato su questo oggetto" #: library/Director/Job/ConfigJob.php:183 msgid "" "Whether rendering should be forced. If not enforced, this job re-renders the " "configuration only when there have been activities since the last rendered " "config" msgstr "" "Se l'attivazione debba essere forzata. Se non è forzata, la configurazione " "viene attivata solo se le attività sono state eseguite dopo l'ultima attivazione" #: application/forms/IcingaHostForm.php:94 #, fuzzy msgid "Whether the agent is configured to accept config" msgstr "Abilitare l'agente per ricevere la configurazione?" #: application/forms/IcingaCommandArgumentForm.php:42 msgid "" "Whether the argument value is a string (allowing macros like $host$) or an " "Icinga DSL lambda function (will be enclosed with {{ ... }}" msgstr "" "Il valore dell'argomento è una stringa (permette macro come $host$) o una " "funzione lambda di Icinga DSL? (è scritto in {{ ... }}}" #: application/forms/IcingaServiceForm.php:666 #, fuzzy msgid "" "Whether the check commmand for this service should be executed on the Icinga " "agent" msgstr "Il comando per questo servizio deve essere eseguito sull'Icinga-Agent?" #: application/forms/IcingaCommandArgumentForm.php:117 msgid "" "Whether the parameter name should not be passed to the command. Per default, " "the parameter name (e.g. -H) will be appended, so no need to explicitly set " "this to \"No\"." msgstr "" "Se il nome del parametro deve essere passato al comando. Non è necessario " "impostare questo parametro su \"No\", in quanto per default il nome del parametro " "viene aggiunto (ad es. -H)." #: application/forms/IcingaHostForm.php:88 #, fuzzy msgid "" "Whether the parent (master) node should actively try to connect to this agent" msgstr "" "Il Nodo (Master) deve cercare attivamente di connettersi a questo agente?" #: application/forms/IcingaCommandArgumentForm.php:81 msgid "" "Whether the set_if parameter is a string (allowing macros like $host$) or an " "Icinga DSL lambda function (will be enclosed with {{ ... }}" msgstr "" "Il parametro set_if è una stringa (permette macro come $host$) o una " "funzione lambda di Icinga DSL? (è scritto in {{ ... }}}" #: application/forms/IcingaCommandArgumentForm.php:126 #, fuzzy msgid "Whether this argument should be required" msgstr "É necessario questo argomento?" #: library/Director/Web/Form/DirectorObjectForm.php:1446 #, fuzzy msgid "Whether this check is volatile." msgstr "Questo controllo è irregolare (volatile)?" #: application/forms/IcingaScheduledDowntimeForm.php:80 #: application/forms/IcingaDependencyForm.php:95 msgid "Whether this dependency should affect hosts or services" msgstr "Se questa dipendenza deve interessare gli host o i servizi" #: application/forms/IcingaScheduledDowntimeForm.php:45 msgid "" "Whether this downtime is fixed or flexible. If unsure please check the " "related documentation: https://icinga.com/docs/icinga2/latest/doc/08-" "advanced-topics/#downtimes" msgstr "" "Sia che si tratti di tempi di fermo macchina fissi o flessibili. In caso di " "dubbi si prega di consultare la relativa documentazione: https://icinga.com/" "docs/icinga2/latest/doc/08-advanced-topics/#downtimes" #: application/forms/IcingaObjectFieldForm.php:143 #, fuzzy msgid "Whether this field should be mandatory" msgstr "Questo Campo deve essere obbligatorio?" #: application/forms/IcingaHostForm.php:79 #, fuzzy msgid "Whether this host has the Icinga 2 Agent installed" msgstr "Questo Host ha installato Icinga2-Agent?" #: application/forms/IcingaNotificationForm.php:83 msgid "Whether this notification should affect hosts or services" msgstr "Se questa notifica deve riguardare gli host o i servizi" #: application/forms/IcingaCommandArgumentForm.php:109 msgid "" "Whether this parameter should be repeated when multiple values (read: array) " "are given" msgstr "" "Se questo parametro deve essere ripetuto se vengono specificati più valori " "(in un array)" #: application/forms/IcingaZoneForm.php:24 msgid "" "Whether this zone should be available everywhere. Please note that it rarely " "leads to the desired result when you try to distribute global zones in " "distrubuted environments" msgstr "" "Questa zona deve essere disponibile ovunque? Si noti che questa configurazione " "raramente porta il risultato desiderato quando si cerca di " "distribuire zone globali in ambienti distribuiti" #: library/Director/Web/Form/DirectorObjectForm.php:1394 #, fuzzy msgid "Whether to accept passive check results for this object" msgstr "" "I risultati del controllo passivo devono essere accettati per questo Oggetto?" #: library/Director/Web/Form/DirectorObjectForm.php:1388 #, fuzzy msgid "Whether to actively check this object" msgstr "Questo Oggetto deve essere controllato attivamente?" #: application/forms/SelfServiceSettingsForm.php:33 msgid "Whether to adjust your host name" msgstr "Se modificare il nome dell'host" #: application/forms/IcingaDependencyForm.php:161 msgid "" "Whether to disable checks when this dependency fails. Defaults to false." msgstr "" "Se disabilitare i controlli quando questa dipendenza fallisce. Le " "impostazioni predefinite sono false." #: application/forms/IcingaDependencyForm.php:169 msgid "" "Whether to disable notifications when this dependency fails. Defaults to " "true." msgstr "" "Se disabilitare le notifiche quando questa dipendenza fallisce. Default é sí." #: library/Director/Web/Form/DirectorObjectForm.php:1406 #, fuzzy msgid "Whether to enable event handlers this object" msgstr "Attivare Event-handler per questo Oggetto?" #: application/forms/IcingaDependencyForm.php:177 msgid "" "Whether to ignore soft states for the reachability calculation. Defaults to " "true." msgstr "" "Se gli stati soft debbano essere considerati per il calcolo " "dell'accessibilità. Default é sí." #: application/forms/IcingaTimePeriodForm.php:77 msgid "Whether to prefer timeperiods includes or excludes. Default to true." msgstr "Se preferire i periodi di tempo include o esclude. Default é sí." #: library/Director/Web/Form/DirectorObjectForm.php:1412 #, fuzzy msgid "Whether to process performance data provided by this object" msgstr "I dati sulle prestazioni di questo Oggetto devono essere elaborati?" #: application/forms/SyncRuleForm.php:70 msgid "" "Whether to purge existing objects. This means that objects of the same type " "will be removed from Director in case they no longer exist at your import " "source." msgstr "" "Se eliminare gli oggetti esistenti. Ciò significa che gli oggetti dello " "stesso tipo saranno rimossi dal Director nel caso in cui non esistano più " "sulla fonte di importazione." #: library/Director/Web/Form/DirectorObjectForm.php:1400 #, fuzzy msgid "Whether to send notifications for this object" msgstr "Le Notifiche devono essere inviate per questo Oggetto?" #: application/forms/IcingaUserForm.php:90 #, fuzzy msgid "Whether to send notifications for this user" msgstr "Le Notifiche devono essere inviate per questo Utente?" #: library/Director/Import/ImportSourceRestApi.php:74 msgid "Whether to use encryption when talking to the REST API" msgstr "Se utilizzare la crittografia quando si utilizzano le REST API" #: library/Director/Import/ImportSourceRestApi.php:98 msgid "" "Whether we should check that our peer's certificate has been signed by a " "trusted CA. This is strongly recommended." msgstr "" "Se dobbiamo controllare che il certificato del nostro peer sia stato firmato " "da una CA di fiducia. Scelta raccomandato." #: library/Director/Import/ImportSourceRestApi.php:105 msgid "Whether we should check that the certificate matches theconfigured host" msgstr "" "Se dobbiamo controllare che il certificato corrisponda all'host configurato" #: application/forms/SyncPropertyForm.php:118 msgid "" "Whether you want to merge or replace the destination field. Makes no " "difference for strings" msgstr "" "Il campo di destinazione deve essere unito o sostituito? Non fa differenza " "per le stringhe di caratteri" #: application/forms/DirectorDatalistEntryForm.php:24 msgid "" "Will be stored as a custom variable value when this entry is chosen from the " "list" msgstr "" "Sarà memorizzato come valore di variabile personalizzata quando questa voce " "viene scelta dalla lista" #: library/Director/Import/ImportSourceRestApi.php:151 msgid "Will be used for SOAP authentication against your vCenter" msgstr "Verrà utilizzato per l'autenticazione SOAP contro il vCenter" #: library/Director/Web/SelfService.php:225 msgid "Windows Kickstart Script" msgstr "Windows Kickstart Script" #: application/forms/DirectorDatafieldForm.php:53 msgid "Wipe related vars" msgstr "Pulire le variabili correlate" #: application/forms/IcingaScheduledDowntimeForm.php:98 msgid "With Services" msgstr "Con servizi" #: library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:17 msgid "Wondering about what changed why? Track your changes!" msgstr "" "Qui potete vedere cosa è stato cambiato. Tieni traccia dei tuoi cambiamenti!" #: application/views/helpers/FormDataFilter.php:525 msgid "Wrap this expression into an operator" msgstr "Inserire questa espressione in un operatore" #: application/forms/IcingaDeleteObjectForm.php:17 #, php-format msgid "YES, please delete \"%s\"" msgstr "SÃŒ, cancellare \"%s\"." #: application/forms/IcingaZoneForm.php:30 #: application/forms/SelfServiceSettingsForm.php:226 #: application/forms/SettingsForm.php:59 application/forms/SettingsForm.php:74 #: application/forms/SettingsForm.php:96 #: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:25 #: library/Director/Job/ImportJob.php:101 library/Director/Job/SyncJob.php:101 #: library/Director/Job/ConfigJob.php:189 #: library/Director/Job/ConfigJob.php:201 msgid "Yes" msgstr "Sí " #: application/controllers/BasketsController.php:41 msgid "" "You can create Basket snapshots at any time, this will persist a serialized " "representation of all involved objects at that moment in time. Snapshots can " "be exported, imported, shared and restored - to the very same or another " "Director instance." msgstr "" "È possibile creare Basket snapshot in qualsiasi momento, in questo modo " "persisterà una rappresentazione serializzata di tutti gli oggetti coinvolti " "in quel momento nel tempo. Gli snapshot possono essere esportati, importati, " "condivisi e ripristinati - nella stessa o in un'altra istanza del Director." #: library/Director/Web/SelfService.php:136 msgid "" "You can stop sharing a Template at any time. This will immediately " "invalidate the former key." msgstr "" "La condivisione di un Template puo' essere sospesa in qualsiasi momento. Questo " "invaliderà immediatamente la precedente chiave." #: library/Director/Job/ImportJob.php:94 library/Director/Job/SyncJob.php:94 msgid "" "You could immediately apply eventual changes or just learn about them. In " "case you do not want them to be applied immediately, defining a job still " "makes sense. You will be made aware of available changes in your Director " "GUI." msgstr "" "Eventuali modifiche potrebbero venire immediatamente applicate " "o l'utente potrebbe essere avvisato dei cambiamenti. " "Definire un processo ha senso anche nel caso in cui non si desideri " "applicare immediatamente le modifiche. L'utente sarà " "informato dei cambiamenti effettuati nella GUI del Director." #: application/forms/SelfServiceSettingsForm.php:61 msgid "" "You might want to let the generated Powershell script install the Icinga 2 " "Agent in an automated way. If so, please choose where your Windows nodes " "should fetch the Agent installer" msgstr "" "Si consiglia di lasciare che lo script Powershell generato installi l'agente " "Icinga 2 in modo automatico. Se è così, scegliete dove i vostri nodi di " "Windows devono andare a prendere il programma di installazione dell'Agent" #: application/forms/IcingaObjectFieldForm.php:169 msgid "" "You might want to show this field only when certain conditions are met. " "Otherwise it will not be available and values eventually set before will be " "cleared once stored" msgstr "" "Si consiglia di mostrare questo campo solo quando sono soddisfatte " "determinate condizioni. Se queste condizioni non sono soddisfatte, il campo " "non verrà visualizzato e le proprietà associate verranno rimosse quando il " "campo verrà salvato" #: application/forms/ImportRowModifierForm.php:44 msgid "" "You might want to write the modified value to another (new) property. This " "property name can be defined here, the original property would remain " "unmodified. Please leave this blank in case you just want to modify the " "value of a specific property" msgstr "" "Potreste voler scrivere il valore modificato su un'altra (nuova) proprietà. " "Il nome di questa proprietà può essere definito qui, la proprietà originale " "rimane invariata. Si prega di lasciare il campo vuoto nel caso in cui si " "voglia modificare il valore di una specifica proprietà" #: application/controllers/SyncruleController.php:119 #, php-format msgid "You must define some %s before you can run this Sync Rule" msgstr "" "È necessario definire alcuni %s prima di poter eseguire questa regola di " "sincronizzazione" #: application/forms/KickstartForm.php:153 msgid "Your Icinga 2 API username" msgstr "Icinga 2 API username" #: library/Director/Import/ImportSourceLdap.php:49 msgid "" "Your LDAP search base. Often something like OU=Users,OU=HQ,DC=your," "DC=company,DC=tld" msgstr "" "La vostra base di ricerca LDAP. Spesso qualcosa come OU=Utenti,OU=HQ,DC=tuo," "DC=azienda,DC=dettaglio" #: application/forms/KickstartForm.php:94 msgid "" "Your configuration looks good. Still, you might want to re-run this " "kickstart wizard to (re-)import modified or new manually defined Command " "definitions or to get fresh new ITL commands after an Icinga 2 Core upgrade." msgstr "" "La vostra configurazione sembra buona. Tuttavia, si potrebbe voler eseguire " "nuovamente questa procedura guidata di kickstart per (re)importare le " "definizioni dei comandi modificate o nuove definite manualmente o per " "ottenere nuovi comandi ITL dopo un aggiornamento di Icinga 2 Core." #: application/forms/KickstartForm.php:72 #, fuzzy, php-format msgid "Your database looks good, you are ready to %s" msgstr "" "Il database sembra buono. Il Director di Icinga dovrebbe essere pronto per " "%s " #: application/forms/KickstartForm.php:106 #, fuzzy msgid "" "Your installation of Icinga Director has not yet been prepared for " "deployments. This kickstart wizard will assist you with setting up the " "connection to your Icinga 2 server." msgstr "" "Questa installazione di Icinga Director non è stata ancora preparata per il " "rollout della configurazione. Questo wizard di kickstart vi aiuterà a " "configurare la connessione al server di Icinga 2" #: library/Director/Web/Form/DirectorObjectForm.php:1331 msgid "Your regular check interval" msgstr "Il vostro regolare intervallo di controllo" #: library/Director/PropertyModifier/PropertyModifierReplace.php:20 msgid "Your replacement string" msgstr "La stringa da sostituire" #: application/forms/IcingaTemplateChoiceForm.php:67 msgid "Your users will be allowed to choose among those templates" msgstr "I vostri utenti potranno scegliere tra questi templates" #: application/forms/SyncRuleForm.php:26 #: library/Director/TranslationDummy.php:15 #: library/Director/Web/Table/ObjectsTableEndpoint.php:21 #, fuzzy msgid "Zone" msgstr "Zone" #: application/forms/IcingaZoneForm.php:14 msgid "Zone name" msgstr "Nome della zona" #: application/forms/IcingaCommandForm.php:111 #: application/forms/IcingaUserForm.php:76 #: application/forms/IcingaDependencyForm.php:61 #: application/forms/IcingaNotificationForm.php:65 #: application/forms/IcingaUserGroupForm.php:42 msgid "Zone settings" msgstr "Impostazioni Zona" #: library/Director/Dashboard/Dashlet/ZoneObjectDashlet.php:13 #: library/Director/Import/ImportSourceCoreApi.php:64 msgid "Zones" msgstr "Zone" #: application/forms/SyncPropertyForm.php:347 msgid "a list" msgstr "un elenco" #: library/Director/Web/Widget/AdditionalTableActions.php:87 msgid "all" msgstr "tutto" #: application/controllers/HostController.php:481 #: application/controllers/BasketController.php:96 #: application/controllers/BasketController.php:114 #: application/controllers/BasketController.php:348 #: application/controllers/ServiceController.php:137 #: application/controllers/ServiceController.php:198 #: application/controllers/DataController.php:108 #: application/controllers/ImportsourceController.php:277 #: application/controllers/SyncruleController.php:571 #: library/Director/Web/Controller/ActionController.php:160 #: library/Director/Web/Controller/ObjectController.php:214 #: library/Director/Web/Controller/ObjectController.php:519 #: library/Director/Web/ActionBar/DirectorBaseActionBar.php:35 msgid "back" msgstr "indietro" #: application/locale/translateMe.php:11 msgid "critical" msgstr "critico" #: application/views/scripts/phperror/dependencies.phtml:47 msgid "disabled" msgstr "disattivato" #: application/controllers/DaemonController.php:42 msgid "documentation" msgstr "documentazione" #: application/locale/translateMe.php:6 msgid "down" msgstr "giù" #: application/forms/IcingaCommandArgumentForm.php:27 msgid "e.g. -H or --hostname, empty means \"skip_key\"" msgstr "ad es. -H o --hostname, vuoto significa \"skip_key\"." #: application/forms/IcingaCommandArgumentForm.php:61 msgid "e.g. 5%, $host.name$, $lower$%:$upper$%" msgstr "ad es. 5%, $host.name$, $lower$%:$upper$%" #: application/forms/SyncPropertyForm.php:164 msgid "failed to fetch" msgstr "Raccolta fallita" #: application/forms/KickstartForm.php:259 library/Director/Util.php:177 msgid "here" msgstr "qui" #: application/forms/IcingaHostVarForm.php:23 msgid "host var name" msgstr "host var name" #: application/forms/IcingaHostVarForm.php:28 msgid "host var value" msgstr "host var value" #: application/views/scripts/phperror/dependencies.phtml:50 msgid "missing" msgstr "mancante" #: application/controllers/BasketController.php:298 msgid "modified" msgstr "modificato" #: application/views/scripts/phperror/dependencies.phtml:56 msgid "more" msgstr "altro" #: application/controllers/BasketController.php:276 msgid "new" msgstr "nuovo" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:71 msgid "no" msgstr "no" #: library/Director/Dashboard/Dashlet/Dashlet.php:283 msgid "no related group exists" msgstr "non esiste un gruppo collegato" #: application/locale/translateMe.php:9 msgid "ok" msgstr "ok" #: library/Director/Web/Widget/ActivityLogInfo.php:315 msgid "on host" msgstr "su host" #: library/Director/Web/Widget/ActivityLogInfo.php:297 msgid "on service set" msgstr "sul set di servizio" #: library/Director/Dashboard/Dashlet/Dashlet.php:285 msgid "one related group exists" msgstr "esiste un gruppo collegato" #: application/locale/translateMe.php:8 msgid "pending" msgstr "in attesa" #: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:29 #: library/Director/PropertyModifier/PropertyModifierSplit.php:29 #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:71 #: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:55 msgid "return NULL" msgstr "restituisce NULL" #: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:28 #: library/Director/PropertyModifier/PropertyModifierSplit.php:28 #: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:70 msgid "return an empty array" msgstr "restituisce un array vuoto" #: application/forms/IcingaServiceVarForm.php:23 msgid "service var name" msgstr "service var name" #: application/forms/IcingaServiceVarForm.php:28 msgid "service var value" msgstr "service var valore" #: application/controllers/BasketController.php:302 msgid "unchanged" msgstr "invariato" #: application/locale/translateMe.php:12 msgid "unknown" msgstr "sconoscuto" #: application/locale/translateMe.php:7 msgid "unreachable" msgstr "irraggiungibile" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:82 msgid "unsupported" msgstr "non supportato" #: library/Director/Web/Widget/AdditionalTableActions.php:89 msgid "unused" msgstr "inutilizzato" #: application/locale/translateMe.php:5 msgid "up" msgstr "su" #: library/Director/Web/Widget/AdditionalTableActions.php:88 msgid "used" msgstr "usato" #: application/forms/IcingaHostVarForm.php:33 #: application/forms/IcingaServiceVarForm.php:33 msgid "value format" msgstr "formato valore" #: library/Director/Web/Table/GroupMemberTable.php:61 #: library/Director/Web/Table/GroupMemberTable.php:66 msgid "via" msgstr "via" #: application/locale/translateMe.php:10 msgid "warning" msgstr "Attenzione" #: library/Director/Web/Widget/BackgroundDaemonDetails.php:70 msgid "yes" msgstr "sí" msgid "%s (where %s)" msgstr "%s (dove %s)" msgid "Add Service: %s" msgstr "Aggiungi servizio: %s" msgid "The parent host." msgstr "L'host parente." msgid "" "This allows you to configure an assignment filter. Please feel free to " "combine as many nested operators as you want" msgstr "" "Questo permette di configurare un filtro di assegnazione. Sentitevi liberi di " "combinare tutti gli operatori annidati che volete" msgid "This must be an import source column (property)" msgstr "Questa deve essere una colonna di fonte di importazione (proprietà)" msgid "Name for the Icinga timeperiod you are going to create" msgstr "Nome per il periodo di Icinga che stai per creare" msgid "Name for the Icinga timperiod template you are going to create" msgstr "Nome per il template del periodo di tempo di Icinga che si sta per creare" msgid "Please define a Service Template first" msgstr "Si prega di definire prima un template di servizio" msgid "Serviceset" msgstr "Service-Set" msgid "Timeperiod" msgstr "Periodo" msgid "Timeperiod object" msgstr "Periodo" msgid "Timeperiod template" msgstr "Template del periodo" msgid "Timeperiod template name" msgstr "Nome del template del periodo" msgid "Whether this should be a template" msgstr "È un template?" msgid "the display name" msgstr "Nome sul display" msgid "the update method" msgstr "metodo di aggiornamento" msgid "Change priority" msgstr "Cambia prioritá" msgid "Count Query" msgstr "Count-Query" msgid "Move down (lower priority)" msgstr "Muovi in basso (abbassa prioritá)" msgid "Move up (raise priority)" msgstr "Muovi in alto (aumenta prioritá)" msgid "Next page" msgstr "Prossima pagina" msgid "Pagination" msgstr "Navigazione della pagina" msgid "Previous page" msgstr "Pagina precedente" msgid "Prio" msgstr "Prio" msgid "SQL Query" msgstr "SQL-Query" msgid "Search is simple! Try to combine multiple words" msgstr "La ricerca è facile! Prova a combinare più parole" msgid "Search..." msgstr "Cerca..." msgid "Show rows %u to %u of %u" msgstr "Mostra righe %u da %u a %u" msgid "This feature is still experimental" msgstr "Questa feature è ancora sperimentale" msgid "Filter available service sets" msgstr "Filtro service sets disponibile" msgid "Set Members" msgstr "Imposta Membri" msgid "s" msgstr "s" msgid "Activity log entry" msgstr "Registrazione del registro delle attività" msgid "Add a job" msgstr "Aggiungi un lavoro" msgid "Add job" msgstr "Aggiungi lavoro" msgid "Add list" msgstr "Aggiungi elenco" msgid "Apply Icinga %s" msgstr "Applica Icinga %s" msgid "Clone Icinga %s" msgstr "Clona Icinga %s" msgid "Configs" msgstr "Configurazioni" msgid "Create immediately" msgstr "Crea subito" msgid "Deploy to master" msgstr "Distrubuisci al master" msgid "Edit import source" msgstr "Modifica fonte importazione" msgid "Edit sync property rule" msgstr "Modifica regola di sincronizzazione" msgid "Entries" msgstr "Voci" msgid "Icinga " msgstr "Icinga " msgid "Icinga %s" msgstr "Icinga %s" msgid "Job %s" msgstr "Lavoro %s" msgid "No object found" msgstr "Nessun oggetto trovato" msgid "Object name" msgstr "Nome oggetto" msgid "Show unfiltered" msgstr "Mostra non filtrato" msgid "Sync run details" msgstr "Dettagli di sincronizzazione" msgid "Template tree" msgstr "Albero dei template" msgid "" "This is an external object. It has been imported from Icinga 2 through " "the Core API and cannot be managed with the Icinga Director. It is " "however perfectly valid to create objects using this or referring to this " "object. You might also want to define related Fields to make work based " "on this object more enjoyable." msgstr "" "Questo è un oggetto esterno. È stato creato da Icinga 2 attraverso l'API di base " "e non può essere gestito con il Director di Icinga." "È comunque perfettamente valido creare oggetti utilizzando o facendo " "riferimento a questo oggetto. È anche possibile creare campi correlati " "per facilitare il lavoro." msgid "Time" msgstr "Tempo" msgid "Service sets" msgstr "Service-Sets" msgid "Allow to see template details" msgstr "Permetti di vedere i dettagli del template" msgid "Allow to use only host templates matching this filter" msgstr "" "Permettete di utilizzare solo template di host che corrispondono " "a questo filtro" msgid "Allow to use only these db resources (comma separated list)" msgstr "" "Permettete di utilizzare solo queste risorse db (elenco separato da virgole)" msgid "Command-specific custom vars" msgstr "Variabili specifiche del comando definite dall'utente" msgid "Config history" msgstr "Cronologia Configurazione" msgid "" "Data fields allow you to customize input controls your custom variables." msgstr "" "I campi dati consentono di personalizzare i controlli di " "input delle variabili personalizzate." msgid "Expression" msgstr "Espressione" msgid "Operator" msgstr "Operatore" msgid "Owner" msgstr "Proprietario" msgid "Service configs" msgstr "Configurazioni Servizio" msgid "The unique name of the field" msgstr "Il nome unico del campo" msgid "There are pending database schema migrations" msgstr "Le migrazioni del database sono in corso" msgid "by host group property" msgstr "per proprietà del gruppo host" msgid "check command" msgstr "Comando Check" msgid "to a host group" msgstr "ad un gruppo host" msgid "%s template \"%s\": custom fields" msgstr "%s template \"%s\": campo personalizzato" msgid "Add entry" msgstr "Aggiungi voce" msgid "Deployments / History" msgstr "Distrubuzioni / Cronologia" msgid "Edit entry" msgstr "Modifica voce" msgid "Edit sync rule" msgstr "Modifica regola di sincronizzazione" msgid "Filter string" msgstr "Filtro stringa" msgid "Import / Sync" msgstr "Importa / Sincronizza" msgid "Import runs" msgstr "Importa esecuzioni" msgid "Run" msgstr "Esegui" msgid "Unable to store the configuration to \"%s\"" msgstr "Impossibile salvare la configuraazione a \"%s\"" msgid "Purge existing values." msgstr "Eliminare i valori esistenti." msgid "Whether the field should be merged, replaced or ignored" msgstr "Il campo deve essere unito, sostituito o ignorato?" msgid "Alert your users" msgstr "Avvisa i tuoi utenti" msgid "Manage deployments, access audit log and history" msgstr "" "Gestisci distribuzioni, registro di audit degli accessi e la cronologia" msgid "Name for the Icinga zone (template) you are going to create" msgstr "Nome per la zona Icinga (template) che stai per creare" msgid "Zone (template) name" msgstr "Nome (template) Zona" msgid "click here" msgstr "clicca qui" msgid "database schema" msgstr "schema database" msgid "e.g. " msgstr "per es." msgid "start using" msgstr "inizia ad utilizzare" icingaweb2-module-director-1.11.8/application/locale/ja_JP/000077500000000000000000000000001516513262500234435ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/locale/ja_JP/LC_MESSAGES/000077500000000000000000000000001516513262500252305ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/locale/ja_JP/LC_MESSAGES/director.mo000066400000000000000000004547031516513262500274150ustar00rootroot00000000000000Þ•Â,&[Š[Š rŠ€ŠˆŠ‘Š¨Š¹ŠÉŠæŠ÷Š‹ ‹2‹F‹X‹h‹€‹‘‹¤‹ ­‹ ¹‹Æ‹ Ö‹ â‹ì‹ ü‹ Œ Œ!Œ80 i sB~ ÁŽËŽÜŽáŽÑ莺¶Î…{˜Ì‘3á’“;0“Ül“(I”Ar”U´”y •2„•·• ¾• ȕӕڕ)ô•– 5–@–P–c–*s–ž– ®– º– Æ–Ò–tä–Y—^—u—|—Œ—¦—1¸—ê—ù—˜!˜%*˜ P˜ ]˜j˜|˜•˜ ­˜»˜À˜ɘÚ˜!õ˜ ™%™6™F™`™ i™ v™€™†™—™¬™™ Ë™Ù™ê™ š šš&š B›P›%i››ž›+´›à›ô› œœœI.œxœW—œïœöœ & 1<CH)Z$„\© ž ž"ž;ž DžKRžžž®žÈžGáž/)ŸYŸmŸ†Ÿ0–ŸÇŸçŸ îŸ"üŸ = P a $z 5Ÿ Õ î  ¡ ¡#¡(¡ B¡O¡MU¡£¡´¡{É¡E¢L¢GS¢›¢¢¢«¢¾¢Û¢ã¢è¢ þ¢ £ £ £-£B£ Q£l^£ Ë£ Ø£ ä£&î£ ¤"¤2¤G¤ ]¤ g¤ r¤ |¤Œ‡¤¦¦#¦$<¦ža¦ ¨ ¨¨3¨I¨g¨†¨ —¨¢¨ ²¨Ó¨ñ¨[© ë©÷© ªÒ!ª&ôª(«)D¬&n¬ •¬ ¡¬ ­¬ »¬ƬÕ¬9ج­­,­;­O­ d­o­ †­”­§­Á­ŽÓ­)b® Œ®eš®°l°µu°g+±“±%§²Ͳܲå²³³$³5³K³S³i³|³³¡³6³³\ê³²G´‡ú´|‚µ)ÿµ)¶-¶=¶F¶O¶W¶\¶?p¶°¶#Ƕë¶ý¶"·;·S·W· g·q·‚·“·™· «·¸·Ê·à·oö·tf¸tÛ¹P»d»‚»< »Ý» ï» ü» ¼o¼ ƒ¼¼o ¼]½Hn½·½Ó½!ì½!¾`0¾ ‘¾ ›¾§¾À¾Ô¾ç¾ú¾¿ ¿ ¿Z¿w¿ˆ¿ ‘¿›¿¢¿²¿ Ä¿ οÜ¿ó¿ À À'À/À @À KÀXÀ6]À=”À4ÒÀAÁ8IÁ3‚Á7¶Á9îÁ0(Â0YŠ ŽÂ˜Â Â²Â »ÂÆÂËÂÎÂ:çÂ&"à IÃ+jÃ-–Ã"ÄÃçÃ=Ä3?Ä^sÄ'ÒÄúÄÅ3Å)OÅyŔŨŠÄÅåÅ,êÅÆ Æ 'ÆZHÆ:£Æ0ÞÆ Ç$ÇAÇ^WǶÇÌÇáÇ÷ÇÈ ,È(:ÈcËtËwË~Ë Ë œË ©ËÊËåËþË ÌÌ-Ì>Ì FÌQÌ=q̯ÌËÌ?èÌ^(ÍE‡ÍÍÍjëÍVÎz_Î]ÚÎ^8Ï—Ï ®Ï ¼ÏÊÏ~ÓÏRÐ XÐdÐ sÐЈÐAÐ<ÒÐ]Ñ:mÑ+¨Ñ¡ÔѦvÒ:Ó*XÓ'ƒÓ«Ó&ÄÓ\ëÓ½HÔÕB!Õ_dÕÄÖÔÖÛÖàÖ éÖ÷Ö ×;×U×]×e×v× ×š×£× º×Ä×Ù×5ì×."Ø(QØ)zØ¤ØªØ ±Ø¿ØÈØèØñØÙEÙ[Ù tٕ٥٬ÙÇÙÙÙùÙ Ú Ú&)Ú PÚ ZÚeÚmÚvÚ~Ú"”Ú·ÚZÆÚ!Û >ÛHÛ`Û vÛ Û ŽÛV›ÛòÛ_Ü­nÜ Ý )ÝJÝ"[Ý&~ݥݸÝÀÝÈÝ ÜÝêÝ ùÝÞ "Þ/Þ@ÞXÞ jÞwÞX†Þ ßßìß ÿß àà4à Mà Zà eà rà~à‡à à ¯à¼à ÐàÚàîà÷àá³á¹áÂá(Üáâ4!âVâ [âgâpâ†ââ#²â Öâ ââðâã#ã3ã8ãAã Jã Tãbã t㠀㠌ã˜ã §ã ´ãÀãÓã òã ýãä ää!"ä DäRä Yädäkä†äŒä ä)§äÑä Øäâäóäå å*å :å Eå€RåÓå ãå íåûåæ 'æ3æ 9æCæVægæwæ €æ Žæ ›æB¥æ>èæ#'çWKç£çZÂç±è¢Ïè’ré0ê/6ê,fê%“êL¹êëGë^ì'yì¡ì¹ì.Ñì9í:í!Rí tí#•í(¹íâísùíjmîhØî…AïÇïÜï›ôïð–ñµñUÆñòP6ò+‡ò'³ò4Ûò<ó0Mó!~ó½ óp^ô9Ïô_ õeiõÏõ?ìõ(,öNUö¤ö,ÁöVîöPE÷%–÷M¼÷I ø Tø'uøø*¢ù$Íù0òù5#ú+Yú)…ú6¯ú.æú1û)Gû2qû!¤û+ÆüsòüÛfý>Bþ-þA¯þñþ-ÿë4ÿ ?A¿‚AÜÄd¡|lƒ;ð",0O€b™füJc /® Þ ü 8 'R °z z+z¦}!JŸuê#`z„ÿ12M/€#°Ô Û ç ô   *6 >I ^ j wqóü-DUZm$#¤ÈÍÝTörK¾Ø.à/?\wާ½ À ÎÜãó !"D Xe ju „­9>xˆ › ¦ °»ÄÊ3Û‡$—¼ ÂÍ Üêîóâœê§‡2/2b?•*ÕQ*R5}1³Cå#)HM.–oÅ 5 @ )S .} 0¬ žÝ 0|!†­!R4"¦‡"M.#ˆ|#($.$7N$&†$2­$9à$V%¬q%7&%V& |&H&Næ&,5'Qb'D´';ù'5(-Ó(+)[-)Q‰)Û)ô)5*%<*b*z*ô~*]s+âÑ+´´,§i-õ.9/A/T\/Ù±/-‹0­¹0g1ƒ1:›1Ö1 Û1 å1ó1ù122 22-2'E2m2}2 ‚22Ÿ2¨2¬2Ä2Ç2à2 è2ô2 33 -373 ?3K3R3U3 Z3g3k3´s3(5 <5J5Y5b5'j5’5!¨5$Ê5ï566=62S6†6!¥6Ç6<Ý6K7f76y76°79ç7W!80y89ª8"ä8"9+*9#V9z9)•9¿9Ú9ï9:::.:6i:? :0à:";<4;*q;œ;!£;"Å;è;+<31<e<w<%‹< ±<"¼<ß<‰ü< †>Ÿ‘?$1@EV@6œ@.Ó@HAxKAvÄAm;B$©B’ÎBOaC ±C »C!ÉC!ëC D&D6DID$YD~D›D±DÍDíD E E$E@EPEfE4…E#ºEÞE*ùE$F*@FkF!‡F©FÈF%áFG$GE@G'†G!®GÐG.íG'HDHZH+yH'¥H"ÍHðH I0"ISIlI$I¤I«IÛ¾I(šKÃKCÖKL"9L\LWxL(ÐL1ùL+MGM'`MˆM§M6ÃMúMoNK€NcÌNl0O3OÑOçOTPZUPQ°P­Qw°Qg(R‘R "SHÃSX TTeTºT'¿UâçU–ÊVˆaWÁêW<¬XéXfiY9ÐY ZZ!,Z%NZ!tZ–Z Z0«Z ÜZéZ0üZ-[-@[n[Z„[ß[ø[\ 0\ :\E\L\ \\f\m\t\ ‡\!‘\ ³\½\Ù\à\ð\ ]*]3G]{]‹]¡]N´]^^)^EE^‹^›^«^Ä^Ý^<ö^33_g_ z_‡_—_ §_ÿ´_$´`'Ù`$a&aHƒ]ƒyƒ€ƒT“ƒèƒZ„\„8c„'œ„Ä„ׄð„ … …< …B]…¶ …W† p†}†–†&©†NІ(‡$H‡$m‡N’‡Zá‡-<ˆjˆ!zˆBœˆ-߈ ‰ ‰%<‰'b‰Љ ‰'¼‰$ä‰E ŠOŠ*mŠ˜Š±Š ÊŠ#ÔŠ øŠ ‹{‹$Ž‹(³‹¾Ü‹ ›Œ¨ŒxÁŒ: P!]'§ ®¸Ôê Ž Ž')ŽQŽmމƒŽ  3<@}™$²$×ü(>YT ®’ »’1Å’6÷’K.“z•Œ•% •Æ•%å•- –9– M–X–0h–™–²–‡Ñ—Y˜%j˜˜º©˜9d™¶ž™<U›9’› Ì› Ø›ä›ÿ›'œ:œ5=œsœ'zœ¢œ$»œàœýœ#:S.ožÒ»NŽžÝžóùží Šý 툡Âv¢^9£<˜¤'Õ¤ý¤'¥,¥K¥g¥ƒ¥£¥$ª¥ Ï¥ð¥! ¦.¦3A¦Šu¦Ô§ºÕ§£¨-4© b©l©© ’© Ÿ© ­©!·©nÙ©$HªBmª,°ª7ݪK«9a«›«¢«¾«$Ô«ù« ¬¬,¬<¬$X¬}¬¦œ¬ŠC­Šή!Y°-{°-©°c×°;±W±m± ƒ±´±E²X²oh²¯Ø²bˆ³ë³´.%´"T´¦w´µ%µ8µUµmµ„µ µ ªµ ·µÁµŠ×µ b¶o¶޶­¶´¶ж ì¶ù¶' ·4·S· l· y·†·¢·¸·Ë·-Ò·6¸$7¸'\¸„¸š¸H¶¸Hÿ¸6H¹T¹Ô¹عñ¹!º&º6ºRº Yº0cº~”º?»9S»B»Qл<"¼!_¼i¼E뼂1½B´½0÷½6(¾3_¾?“¾-Ó¾1¿33¿3g¿›¿0¢¿Ó¿ Ú¿B俜'ÀWÄÀNÁkÁ$rÁ—ÁlªÁÂ0ÂCÂ$\š ¡Â «Å ¸ÅÄÅ×ÅóÅÆ+Æ-JÆ0xÆ!©ÆËÆ çÆÇ&Ç 9Ç6CÇdzÇ9ßÇ9ÈISÈqÈ\É7lÉ™¤É>ʯNÊ þÊ“ŸË'3Ì[ÌnÌÌÊ”Ì_Í oÍ|Í ŒÍ™Í ©ÍT¶ÍZ ÎfÎKèÎE4ÏÐzÏÊKÐ`ÑRwÑPÊÑ#Ò??Ò{ÒôûÒ'ðÓYÔrÔÖ Ö ªÖ´Ö»ÖËÖâÖHþÖG×W× h×*u× ×°×"À×ã×üרm.ØQœÙKîÙ3:ÚnÚuÚ |Ú†Ú*˜ÚÃÚ!ÊÚ ìÚSùÚMÛ-lÛšÛ³Û&ºÛáÛ'ýÛ$%ÜJÜZÜ;pܬܼÜÌÜÓÜ ÚÜ*çÜ#Ý6Ý9IÝ-ƒÝ ±Ý0¾Ý*ïÝÞ3ÞLÞikÞÕÞñÞíqß_à*uà à1ºà6ìà#á 9á CáPálá…ážá-´áâáøá*âBâaâwâ×âhäxä”äªä*Ãä*îäå2åHåaå qå%~å¤å¶å!Èåêå+ÿå +æ 9æ Gæ÷QæIçPç<oç<¬ç<éç&è-è Fè-Sè'è!©è*Ëè öè*é..é]é|é ’éœé²éËéäé÷é êê$ê7êJê cêpê!†ê¨ê ¸êÅêÛê÷ê6þê 5ëBëIëPë-`ëŽë•ë¥ë?¬ëìëóë'ì!.ìPìoìì•ì ¥ìœ²ìOíeíuí‰í¨í¸í¿íÃíÌíèíîî*î@îWîujîcàî$Dïqiï(Ûï›ðü ðÔñºrò;-óFió)°ó!Úó`üó ]ô»jô&öBöaö|ö2—ö4Êöÿö.÷)I÷3s÷6§÷<Þ÷ø¬øW,ùŠ„ùú"ú°8úBéú*,ü Wü\dü!ÁüŒãü@pý*±ý<Üý*þ'Dþlþ…þºÿNH—¨50Þ~BŽxÑ$J>o®?6¿XöYO(©<ÒOB_6¢[ÙT5:ŠKÅ\ Wn YÆ K Pl ½ TM Ž¢ !1 ES>™cØ!<H^I§-ñp “±JE7©¨á?Š6ÊU4W‹ŒAÊZ`%!9†!9À!Zú!EU"Ö›#»r$».%«ê%M–&¨ä&/'­½'6k(^¢(<)Q>)-) ¾)Ë)Þ)ñ)* *3*F*Y*l*$*¤*·*Ê*îà*Ï,â,é,ÿ,-%- ;-!E-g-?€-2À- ó-ý-% .`3.˜”.-/@/3Q/<…/EÂ/B09K0…0*ž0 É0Õ0î0 1$ 1*E1 p1}1BŽ1Ñ1í1 2 2 2<2õR2!H3j3ƒ3¢3¸3Î3 ä3 ñ3û364ÌN415M5Q5 a5 k5 u55Ž6Ÿ6ñµ8E§9<í9N*:0y:iª:<;EQ;K—;Wã;,;<{h</ä<œ= ±=¾=`×=H8>K>ÜÍ>lª?ž@e¶@üAŠB®¤B*SC•~CoD3„DY¸DWExjE–ãEHzFNÃF0G”CGØGZiH„ÄHŠIIuÔIwJJNÂJ6KaHKlªK+L!CL¥eL' M(3M\MscMy×NQOóePYQ=ZRg˜STlT]†TPäUÌ5VWWZ.W ‰W “W W °W ºW ÄWÎWÕWÜW;ãW-XMXiXpXƒX–X¦X*ªXÕX0ØX Y Y!Y4YJY `YmY tY Y‹Y ’YœYµY¼Yû$˜ä¬ƒäûºâ?‚Sš^î()Ä V‚ ¸Ð?gœŠu+~2ŸôA¸:¨A:IN\ʤ֙ީAŽžs®Ò>®~rOÞ%ÁÝ„R'-"NKç/x¦êQ¢à-…1ÏËøˆ×iåóÿn:³áÛ0¶%íé6, ˆ7¹ž³.Ò Ÿ¥mª`1òï‹tTeT¹‡Åål63Oaß,À“Ü™2qc ü­wFc4Ë=‘¼¤‰CÎr;¥+Ù0 ƒ=³Dnî+¾]T !ª6p¡Ñ]@%fñ »Á3ô ]Z±ã„z< …,ÒoNnêO ˆo-/§–¿Ó³"òe\oç—ÖÅz‘¯¾ ƒGð¬fPwÍL”é-£®C*{·Ñ™g½RPœþ’Ä Ó´<“ùÉxn)’jÔ¯‘Öý¦úqÒpN—5ñVíþé•ãdÓéÇÌä$vÊŽ'UÏ]øUìvðDë"cŽƒRS Ūˆ†µ5­æþ¥“y2µ.ÊE&{ƒ1B¸füó°75wÉ4½²>ÉjWH´$ mW!\H«²~æ˜|¸‡P£v›€OÕÆYoDk®_ú£}qù…`«ïB¿ÄBüóÏìð¦Vk½º˜ ¾7[;Ç}ul×["«&pΑF~*”4¤€Uº¨íbR'!€KO…©ž½CMàöG;T œ[†Œ–_µS ÆÇÂ¥h…·%¡Aú!á²>`d–fõzt•s§˜´g@4RÂr#É  ’J·ct«+¶ñd×Ô#Àë‚óâJ”vX(XT‡‰¿ãîý=%œÓØõX¨L†YHtK7C}ýq‹·çq¬çà2'(Ùª¢û`Evôücälð÷¨X ÷Í,€›/Úxuå–VPYJÀ ѹÇž/±”ŒÁ¯x‚Þë¹ö»!¯*ÔW0È‹•¡h bi@»u¬©ò_ÿmš1»7wŽÛ¡Áˆ9ì㦣.жQß< ¹ÝÏ º^Œ2IŸÃÝ·‡* Y¯Ø¡az ;iïÁµ@zÕI±º]à»´9©È`jÛ$—)Ú¶ònKÿ¿ZúJX^\8Þ?aIQùÈ9†´_{“Æ'Ä•ŒÐDï‰ñÆ8=pÞhÝ•;:6 Š@¦÷W‹#ô~îE›­Õ‰è.} N¶¬>¸ l{¢Ë’°:í*<k9[u§F²týGxæw3§‹Î/±“бbÀÚsLÕÀhH^á{¼|Œr0ß }‚µö(Š?.3_8ièabFbgZj؆¤(Í,‘Gêßi>ÈSg¢³ªQÐÃÜ̽AŠÚP 5¼EB‡¨¿å)š²’°#ûyL€ZKfÔLÙ—eÑ6?dÛ™ <\3¾÷ÌžkÜ„eZÍs—¼ÜmUHUè0ÙQ^p&o 5#j19ÃMËl[šõ8ÿ+°¥"MYShÖD-Îæ&â„–õMŸÊ®WM¼‰þ©ekø›¾ëì™âFd$&ö=yÅ¢Ì|)y›s×ß„B4§£mè˜y”­r¤šIØEœJ8ù| aøV­á«G°|Cê (inherited from "%s") - not in use -# Used# Vars%d / %d%d Host Template(s)%d Host(s)%d Notification Apply Rule(s)%d Notification Template(s)%d Notification(s)%d Service Apply Rule(s)%d Service Template(s)%d Service(s)%d apply rules have been defined%d created%d deleted%d files%d files rendered in %0.2fs%d have been externally defined and will not be deployed%d modified%d objects found%d objects have been defined%d objects have been modified%d objects, %d templates, %d apply rules%d of them are templates%d templates have been defined%s "%s" has been created%s "%s" has been deleted%s "%s" has been imported"%s "%s" has been modified%s (%d members)%s (Applied Service set)%s (Service set)%s (default)%s (where %s)%s Templates%s based on %s%s config changes happend since the last deployed configuration%s has been blacklisted on %s%s is no longer blacklisted on %s%s objects have been modified%s on %s (from set: %s)%s related group objects have been created%s templates based on %s%s: %d%s: %s (Snapshot)%s: Property Modifier%s: Snapshots%s: add Property Modifier(Host) group resolve cache(on %s)- add more -- click to add more -- inherited -- no automatic installation -- please choose -A Configuration Basket references specific Configuration Objects or all objects of a specific type. It has been designed to share Templates, Import/Sync strategies and other base Configuration Objects. It is not a tool to operate with single Hosts or Services.A custom LDAP filter to use in addition to the object class. This allows for a lot of flexibility but requires LDAP filter skills. Simple filters might look as follows: operatingsystem=*server*A custom string. Might contain source columns, please use placeholders of the form ${columnName} in such caseA description about the fieldA detailled description explaining what this choice is all aboutA meaningful description explaining your users what to expect when assigning this set of servicesA new %s has successfully been createdA new Self Service API key for %s has been generatedA property modifier allows you to modify a specific property at import timeA short name identifying this import source. Use something meaningful, like "Hosts from Puppet", "Users from Active Directory" or similarA short name identifying this job. Use something meaningful, like "Import Puppet Hosts"A short name identifying this set of servicesA ticket for this agent could not have been requested from your deployment endpoint: %sA total of %d config changes happened since your last deployed config has been renderedAPI KeyAPI userAccept passive checksAccepts configAcknowledgementActionAction URLActionsActivation ToolActive-PassiveActivityActivity LogActivity Log: %sActivity logAddAdd %sAdd %s objectsAdd %s: %sAdd ServiceAdd Service SetAdd Service Set to %d hostsAdd Service Set: %sAdd Service: %sAdd a new Data FieldAdd a new Data ListAdd a new Import SourceAdd a new JobAdd a new Sync RuleAdd a new entryAdd a new one...Add a service set to "%s"Add a service to "%s"Add another filterAdd chosen objects to a Configuration BasketAdd data list entryAdd import sourceAdd new Icinga %sAdd new Icinga %s templateAdd property modifierAdd serviceAdd service setAdd service to %d hostsAdd sync property ruleAdd sync property: %sAdd sync ruleAdd to BasketAdditional notes for this objectAdditional propertiesAgentAgent VersionAliasAll changesAll changes are tracked in the Director database. In addition you might also want to send an audit log through the Icinga Web 2 logging mechanism. That way all changes would be written to either Syslog or the configured log file. When enabling this please make sure that you configured Icinga Web 2 to log at least at "informational" level.All custom variables (vars)All of themAll overrides have been removed from "%s"All your %s Apply RulesAll your %s TemplatesAllow UpdatesAllow readonly users to see where a Service came fromAllow to access the director APIAllow to access the full audit logAllow to configure hostsAllow to configure notificationsAllow to configure service setsAllow to configure servicesAllow to configure usersAllow to define Service Set Apply RulesAllow to deploy configurationAllow to inspect objects through the Icinga 2 API (could contain sensitive information)Allow to show configuration (could contain sensitive information)Allow to show the full executed SQL queries in some placesAllow to use this entry only to users with one of these Icinga Web 2 rolesAllow unrestricted access to Icinga DirectorAllowed maximumAllowed rolesAlso clone fields provided by this TemplateAlso clone single Service Sets defined for this HostAlso clone single Services defined for this HostAlso install NSClient++. It can be used through the Icinga Agent and comes with a bunch of additional Check PluginsAlso rename all "%s" custom variables to "%s" on %d objects?Also wipe all "%s" custom variables from %d objects?Alternative name for this host. Might be a host alias or and kind of string helping your users to identify this hostAlternative name for this user. In case your object name is a username, this could be the full name of the corresponding personAlternative text to be shown in case above icon is missingAn Icinga DSL expression that returns a boolean value, e.g.: var cmd = bool(macro("$cmd$")); return cmd ...An Icinga DSL expression, e.g.: var cmd = macro("$cmd$"); return typeof(command) == String ...An URL leading to additional actions for this object. Often used with Icinga Classic, rarely with Icinga Web 2 as it provides far better possibilities to integrate addonsAn URL pointing to additional notes for this objectAn URL pointing to an icon for this object. Try "tux.png" for icons relative to public/img/icons or "cloud" (no extension) for items from the Icinga icon fontAn alternative display name for this group. If you wonder how this could be helpful just leave it blankAn extended description for this Import Row Modifier. This should explain it's purpose and why it has been put in place at all.An extended description for this Import Source. This should explain what kind of data you're going to import from this source.An extended description for this Sync Rule. This should explain what this Rule is going to accomplish.An extended description for this field. Will be shown as soon as a user puts the focus on this fieldAn object class to search for. Might be "user", "group", "computer" or similarAny first (leftmost) componentApi Key:Applied %sApplied groupsApplied service: %sApplied servicesApplyApply "%s"Apply %d pending schema migrationsApply ForApply RuleApply Rule rendering previewApply RulesApply a pending schema migrationApply changesApply notifications with specific properties according to given rules.Apply ruleApply rule historyApply schema migrationsApply toApply: %sArgumentArgument macrosArgument nameArgumentsArrayAssign whereAuthorAutomate all tasksAutomationAvailable choicesBackBasketBasket DefinitionsBasket NameBasket SnapshotsBasket has been uploadedBasketsBlacklistCaptionChanging this value affects %d object(s): %sCheck CommandsCheck commandCheck command definitionCheck command timeout in seconds. Overrides the CheckCommand's timeout attributeCheck executionCheck for changesCheck intervalCheck periodCheck timeoutChecking this Import Source failedChecking this sync rule failedChecksumChild HostChild ServiceChoice nameChoicesChoose "All" to always add all of them, "Ignore" to not care about a specific Type at all and opt for "Custom Selection" in case you want to choose just some specific Objects.Choose a Host TemplateChoose a service templateChoose an object typeChoose fileChoose the host this single service should be assigned toChoosing this many options will be mandatory for this Choice. Setting this to zero will leave this Choice optional, setting it to one results in a "required" Choice. You can use higher numbers to enforce multiple options, this Choice will then turn into a multi-selection element.Chose an (optional) parent zoneCloneClone "%s"Clone Service SetsClone ServicesClone Template FieldsClone the object as is, preserving importsClone this service to the very same or to another Service SetClone: %sCluster ZoneCombine multiple templates into meaningful Choices, making life easier for your usersCommandCommand DefinitionsCommand TemplatesCommand arguments: %sCommand endpointCommand nameCommand typeCommandsComparing %s "%s" from Snapshot "%s" to current configCondition (set_if)Condition formatConfigConfig DeploymentConfig deployment failedConfig diffConfig file "%s"Config has been submitted, validation is going onConfig preview: %sConfigurationConfiguration (read-only)Configuration BasketsConfiguration formatConfiguration has been storedConfiguration objects have been added to the chosen basket "%s"Configure this Agent via Self Service APIContent ChecksumCreateCreate BasketCreate SnapshotCreate a new %s Apply RuleCreate a new %s SetCreate a new %s inheriting from this oneCreate a new %s inheriting from this templateCreate a new Configuration BasketCreate a new TemplateCreate a new objectCreate a new template choiceCreate database schemaCreate schemaCreatedCriticalCurrent Template UsageCustom SelectionCustom VariableCustom Variable variants: %sCustom VariablesCustom Vars - OverviewCustom expressionCustom fields: %sCustom notificationCustom propertiesCustom variableCustom variable (vars.)Custom variablesCustomVar OverviewDB QueryDB ResourceDN componentDNS record typeData FieldsData ListData List EntryData List: %sData ListsData fieldsData fields allow you to customize input controls for Icinga custom variables. Once you defined them here, you can provide them through your defined templates. This gives you a granular control over what properties your users should be allowed to configure in which way.Data fields make sure that configuration fits your rulesData listData listsData lists are mainly used as data providers for custom variables presented as dropdown boxes boxes. You can manually manage their entries here in place, but you could also create dedicated sync rules after creating a new empty list. This would allow you to keep your available choices in sync with external data providersData typeDatabase backendDateDay(s)Default configuration format. Please note that v1.x is for special transitional projects only and completely unsupported. There are no plans to make Director a first-class configuration backends for Icinga 1.xDefault global zoneDefine Check-, Notification- or Event-Commands. Command definitions are the glue between your Host- and Service-Checks and the Check plugins on your Monitoring (or monitored) systemsDefine Data FieldsDefine Host Groups to give your configuration more structure. They are useful for Dashboards, Notifications or RestrictionsDefine a download Url or local directory from which the a specific Icinga 2 Agent MSI Installer package should be fetched. Please ensure to only define the base download Url or Directory. The Module will generate the MSI file name based on your operating system architecture and the version to install. The Icinga 2 MSI Installer name is internally build as follows: Icinga2-v[InstallAgentVersion]-[OSArchitecture].msi (full example: Icinga2-v2.6.3-x86_64.msi)Define and manage imports from various data sourcesDefine custom Time PeriodsDefine how imported data should be synchronized with IcingaDefine what should happen when an object with a matching key already exists. You could merge its properties (import source wins), replace it completely with the imported object or ignore it (helpful for one-time imports)Define whatever you want to be monitoredDefines after how many check attempts a new hard state is reachedDefining Notifications for User Groups instead of single Users gives more flexibilityDefining Service Groups get more structure. Great for Dashboards. Notifications and Permissions might be based on groups.Delay unless the first notification should be sentDeleteDelimiterDependencyDeployDeploy %d pending changesDeploy configuration to your Icinga nodesDeploy modified configDeploymentDeployment PathDeployment detailsDeployment modeDeployment mode for Icinga 1 configurationDeployment timeDeploymentsDescriptionDestinationDestination FieldDid you know that you can run this entire Health Check (or just some sections) as an Icinga Check on a regular base?DiffDiff with other configDirectDirector HealthDirector Kickstart WizardDirector SettingsDirector database schema has not been created yetDisable ChecksDisable NotificiationsDisable all JobsDisabledDisabled objects will not be deployedDisplay NameDisplay nameDistinct CommandsDo more with custom dataDo not transform at allDocumentationDownDownloadDownload as JSONDownload from a custom urlDownload from packages.icinga.comDowntime endsDowntime removedDowntime startsDrop Self Service API keyDurationEdit a FieldEdit listEmailEnable audit logEnable event handlerEnable flap detectionEndpointEndpoint NameEndpoint addressEndpoint template nameEndpointsErrorEstablish connectionEvaluates the apply for rule for all objects with the custom attribute specified. E.g selecting "host.vars.custom_attr" will generate "for (config in host.vars.array_var)" where "config" will be accessible through "$config$". NOTE: only custom variables of type "Array" are eligible.Event commandEvent command definitionExclude other time periods from this.Exclude periodExecute active checksExecution interval for this job, in secondsExisting Data ListsExisting templatesExpert modeExternalExternal CommandsExternal Commands have been defined in your local Icinga 2 Configuration.External Notification CommandsExternal Notification Commands have been defined in your local Icinga 2 Configuration. FailedFailed to import %s "%s"Field has been removedField nameField typeFieldsFileFilter ExpressionFilter available notification apply rulesFilter available service apply rulesFilter available service set templates. Use asterisks (*) as wildcards, like in DB* or *net*Filter methodFirst ElementFirst notification delayFlappingFlapping endsFlapping lower bound in percent for a service to be considered not flappingFlapping startsFlapping threshold (high)Flapping threshold (low)Flapping upper bound in percent for a service to be considered flappingFlatten all inherited properties, strip importsFlush API directoryFor manual configurationForce renderingForm element could not be created, %s is missingForm has successfully been sentFormatFormer objectFully qualified domain name (FQDN)Generate Self Service API keyGenerate a new keyGenerated configGenerated from host varsGet alerts when something goes wrongGet an overview of used CustomVars and their variantsGlobal Director SettingsGlobal Self Service SettingGlobal ZonesGlobal zoneGlueGo back to "%s" DashboardGrace periodGroupGroup has been inherited, but will be overridden by locally assigned group(s)Group membershipGroup membership: %sGrouping your Services into Sets allow you to quickly assign services often used together in a single operation all at onceGroupsHealthHere you can find all single services directly attached to single hostsHiddenHide SQLHint: Check PluginHints regarding this serviceHistoryHostHost Custom variablesHost GroupHost GroupsHost NameHost TemplateHost Template ChoiceHost TemplatesHost addressHost address. Usually an IPv4 address, but may be any kind of address your check plugin is able to deal withHost configsHost groupsHost nameHost name (local part, without domain)Host objectsHost propertiesHost template choiceHost template choicesHostGroupHostGroupsHostgroupHostgroupsHostgroups that should be directly assigned to this node. Hostgroups can be useful for various reasons. You might assign service checks based on assigned hostgroup. They are also often used as an instrument to enforce restricted views in Icinga Web 2. Hostgroups can be directly assigned to single hosts or to host templates. You might also want to consider assigning hostgroups using apply rulesHostnameHostsHosts using this set: %sIP address / hostname of remote nodeIP address / hostname of your Icinga node. Please note that this information will only be used for the very first connection to your Icinga instance. The Director then relies on a correctly configured Endpoint object. Correctly configures means that either it's name is resolvable or that it's host property contains either an IP address or a resolvable host name. Your Director must be able to reach this endpointIPv6 addressIcinga %s SetsIcinga 2 - Objects: %sIcinga 2 API - StatusIcinga 2 Client documentationIcinga Agent and zone settingsIcinga Api usersIcinga DSLIcinga DirectorIcinga Director - Main DashboardIcinga Director ConfigurationIcinga Director decides to deploy objects like CheckCommands to a global zone. This defaults to "director-global" but might be adjusted to a custom Zone nameIcinga Director offers a Self Service API, allowing new Icinga nodes to register themselvesIcinga HostIcinga InfrastructureIcinga Package NameIcinga cluster zone. Allows to manually override Directors decisions of where to deploy your config to. You should consider not doing so unless you gained deep understanding of how an Icinga Cluster stack worksIcinga object name for this host groupIcinga object name for this host. This is usually a fully qualified host name but it could basically be any kind of string. To make things easier for your users we strongly suggest to use meaningful names for templates. E.g. "generic-host" is ugly, "Standard Linux Server" is easier to understandIcinga object name for this service groupIcinga object name for this user groupIcinga v1.xIcinga v2.xIcinga2 AgentIcon imageIcon image altIdIdentifier for the Icinga command you are going to createIgnoreIgnore Soft StatesImport SourcesImport data sourcesImport external "%s"Import runImport run history: %sImport sourceImport source nameImport source preview: %sImport source: %sImportable templates, add as many as you want. Please note that order matters when importing properties from multiple templates: last one winsImported new data from this Import SourceImported rowsImporting an object means that its type will change from "external" to "object". That way it will make part of the next deployment. So in case you imported this object from your Icinga node make sure to remove it from your local configuration before issueing the next deployment. In case of a conflict nothing bad will happen, just your config won't deploy.ImportsIn case an Icinga Admin provided you with a self service API token, this is where you can register new hostsIn case the Icinga 2 Agent is already installed on the system, this parameter will allow you to configure if you wish to upgrade / downgrade to a specified version with the as well.In case the Icinga 2 Agent should be automatically installed, this has to be a string value like: 2.6.3In case the Icinga Agent will accept configuration from the parent Icinga 2 system, it will possibly write data to /var/lib/icinga2/api/*. By setting this parameter to true, all content inside the api directory will be flushed before an eventual restart of the Icinga 2 AgentInclude other time periods into this.Include periodIndirectIndividual Service objectsInfrastructureInheritance (import)Inherited groupsInherited service: %sInspectInspect - object listInstall NSClient++Installation SourceInstaller HashesInternal commandsIt has been renamed since then, its former name was %sIt is not a good idea to do so as long as your Agent still has a valid Self Service API key!It will not be allowed to choose more than this many options. Setting it to one (1) will result in a drop-down box, a higher number will turn this into a multi-selection element.It's currently unknown whether we are in sync with this Import Source. You should either check for changes or trigger a new Import Run.It's currently unknown whether we are in sync with this rule. You should either check for changes or trigger a new Sync Run.It's not allowed to store an empty basketJobJob DefinitionsJob TypeJob nameJob: %sJobsJump to this objectJust download and run this script on your Linux Client Machine:Keep matching elementsKeep only matching rows (Whitelist)Keep the DN as isKeep the JSON string as isKeep the property (hostname) as isKeep the property as isKeyKey column nameKickstartKickstart WizardLDAP Search BaseLabelLast Check ResultLast ElementLast notificationLast related activityLast sync run detailsLeave empty for non-positional arguments. Can be a positive or negative number and influences argument orderingLeaving custom variables in place while removing the related field is perfectly legal and might be a desired operation. This way you can no longer modify related custom variables in the Director GUI, but the variables themselves will stay there and continue to be deployed. When you re-add a field for the same variable later on, everything will continue to work as beforeLeaving custom variables in place while renaming the related field is perfectly legal and might be a desired operation. This way you can no longer modify related custom variables in the Director GUI, but the variables themselves will stay there and continue to be deployed. When you re-add a field for the same variable later on, everything will continue to work as beforeLet the import failLet the whole Import Run failLet the whole import run failLimit access to the given comma-separated list of hostgroupsLinux commandlineList EntriesList entriesList nameLocal directory to deploy Icinga 1.x configuration. Must be writable by icingaweb2. (e.g. /etc/icinga/director)Log DurationMain propertiesManage definitions for your Commands that should be executed as Check Plugins, Notifications or based on EventsManage your Host Templates. Use Fields to make it easy for your users to get them customized.Manage your Icinga 2 infrastructure: Masters, Zones, Satellites and moreManage your Icinga CommandsManage your Icinga HostsManage your Icinga InfrastructureManage your Icinga Service ChecksManage your Service Templates. Use Fields to make it easy for your users to get them customized.MandatoryMaster-lessMatch NULL value columnsMatch boolean FALSEMatch boolean TRUEMax check attemptsMemberMembersMergeMerge PolicyMight be, monday, tuesday, 2016-01-28 - have a look at the documentation for more examplesMinimum requiredModifierModifiersModifyModify %d hostsModify %d objectsModify %sModify a hostModify data list entryModify this Apply RuleMonitored ServicesMove downMove upMultiple objectsMy changesMySQL schemaNameName for the Icinga dependency you are going to createName for the Icinga endpoint template you are going to createName for the Icinga endpoint you are going to createName for the Icinga notification template you are going to createName for the Icinga notification you are going to createName for the Icinga service you are going to createName for the Icinga user object you are going to createName for the Icinga user template you are going to createName for the Icinga zone you are going to createName needs to be changed when cloning a TemplateNavNew FieldNew JobNew import sourceNew nameNew objectNextNoNo %s resource availableNo API user configured, you might run the kickstart helperNo Host Template has been provided yetNo Host template has been chosenNo Service Templates have been provided yetNo action taken, object has not been modifiedNo apply rule has been defined yetNo changes have been madeNo dashboard available, you might have not enough permissionsNo database has been configured for Icinga DirectorNo database resource has been configured yet. Please choose a resource to complete your configNo database schema has been created yetNo object has been chosenNo object has been defined yetNo object has been modifiedNo related template has been provided yetNo service has been chosenNo such service: %sNo template has been chosenNo template has been defined yetNoneNone could be used for deployments right nowNotesNotes URLNothing changed, rule is in syncNothing to do, data provided by this Import Source didn't change since the last import runNothing to do, restore would not modify the current objectNothing would change, this rule is still in syncNotificationNotification Apply Rules based on %sNotification CommandsNotification Commands allow you to trigger any action you want when a notification takes placeNotification TemplateNotification commandNotification intervalNotification template choicesNotification templatesNotificationsNotifications are sent when a host or service reaches a non-ok hard state or recovers from such. One might also want to send them for special events like when a Downtime starts, a problem gets acknowledged and much more. You can send specific notifications only within specific time periods, you can delay them and of course re-notify at specific intervals. Combine those possibilities in case you need to define escalation levels, like notifying operators first and your management later on in case the problem remains unhandled for a certain time. You might send E-Mail or SMS, make phone calls or page on various channels. You could also delegate notifications to external service providers. The possibilities are endless, as you are allowed to define as many custom notification commands as you wantNumeric positionOKObjectObject InspectionObject TypeObject classObject dependency relationships.Object has been re-createdObject has been restoredObject propertiesObject typeObject type "%s"Object/Tpl/ApplyObjectsOn failureOne apply rule has been definedOne external object has been defined, it will not be deployedOne object has been definedOne object has been modifiedOne or more characters that should be used to split this stringOne or more characters that will be used to glue an input array to a string. Can be left emptyOne or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00One template has been definedOnly set this parameter if the argument value resolves to a numeric value. String values are not supportedOptionalOptional command timeout. Allowed values are seconds or durations postfixed with a specific unit (e.g. 1m or also 3m 30s).Optional. The child service. If omitted this dependency object is treated as host dependency.Optional. The parent service. If omitted this dependency object is treated as host dependency.Other available fieldsOther sourcesOverride varsOverviewPHP version 5.4.x is required for Director >= 1.4.0, you're running %s. Please either upgrade PHP or downgrade Icinga DirectorPagerParent HostParent ServiceParent ZonePasswordPatternPending database schema migrations have successfully been appliedPlease ask an administrator to grant you access to resourcesPlease check your Basket configuration, %s does not support single "%s" configuration objectsPlease choose a data list that can be used for map lookupsPlease choose a specific Icinga object typePlease choose your import source that should be executed. You could create different schedules for different sources or also opt for running all of them at once.Please choose your synchronization rule that should be executed. You could create different schedules for different rules or also opt for running all of them at once.Please click "Store" once again to determine query columnsPlease click %s to create new DB resourcesPlease click %s to create new resourcesPlease define a %s firstPlease define a related template firstPlease make sure that your database exists and your user has been granted enough permissionsPlease only change those settings in case you are really sure that you are required to do so. Usually the defaults chosen by the Icinga Director should make a good fit for your environment.Please provide a rule namePlease see %s for detailled instructions of how start and end workPlugin Check commands are what you need when running checks agains your infrastructure. Notification commands will be used when it comes to notify your users. Event commands allow you to trigger specific actions when problems occur. Some people use them for auto-healing mechanisms, like restarting services or rebooting systems at specific thresholdsPlugin commandsPolicyPortPositionPosition TypePostgreSQL schemaPrefer includesPreserve specific configuration objects in a specific statePreviewProblemProblem handlingProcess performance dataPropertiesPropertyProperty modifiers: %sProtectedPrototypes (methods)Provide Data ListsProvide data lists to make life easier for your usersProvide templates for your TimePeriod objects.Provide templates for your User objects.Provide templates for your notifications.PurgeRangesRe-deploy nowRecoveryRegenerate Self Service API keyRegisterRegistered AgentRegular ExpressionRegular expression pattern to split the string (e.g. /\s+/ or /[,;]/)Reject matching elementsReject the whole row (Blacklist)Related ObjectsRemoveRemove "%s" from this hostRemove this entryRemove this part of your filterRename related varsRender configRendered fileRendered in %0.2fs, deployed in %0.2fsRenderingRepeat keyReplaceRequiredRestoreRestore former objectRestore to this target Director DBRetry intervalRetry interval, will be applied after a state change unless the next hard state is reachedReturn lookup key unmodifiedRule nameRun all imports at onceRun all rules at onceRun importRun intervalRun on agentSchedule and automate Import, Syncronization, Config Deployment, Housekeeping and moreSchedule your notificationsSchedule your notifications. Define who should be notified, when, and for which kind of problemScript or tool to call when activating a new configuration stage. (e.g. sudo /usr/local/bin/icinga-director-activate) (name of the stage will be the argument for the script)Self ServiceSelf Service - Host RegistrationSelf Service APISelf Service API - Global SettingsSelf Service Settings have been storedSend notificationsSent toServiceService Apply RulesService GroupService GroupsService SetService Set has been removedService SetsService TemplateService Template ChoiceService TemplatesService UserService groupsService groups that should be directly assigned to this service. Servicegroups can be useful for various reasons. They are helpful to provided service-type specific view in Icinga Web 2, either for custom dashboards or as an instrument to enforce restrictions. Service groups can be directly assigned to single services or to service templates.Service nameService propertiesService setService set nameService template choiceService template choicesServiceGroupServiceSetServicegroupServicenameServicesServices in this set: %sServices on %sServices: %sSet based on filterSet falseSet no value (null)Set nullSet trueSetsSetting a command endpoint allows you to force host checks to be executed by a specific endpoint. Please carefully study the related Icinga documentation before using this featureSettingsSettings have been storedShare this Template for Self Service APIShared for Self Service APIShould all the other characters be lowercased first?ShowShow BasketShow SQLShow affected ObjectsShow available optionsShow based on filterShow details related to this changeShow normalShow resolvedSimple match with wildcards (*)Single Object DiffSingle ServicesSizeSkip keySnapshotSnapshotsSource ColumnSource ExpressionSource NameSource PathSource TypeSource columnsSource fieldSource nameSpecial propertiesSpecific Element (by position)Stage nameStart timeStartupStartup LogStateState and transition type filtersState changesStatesStatisticsStatusStop sharing this TemplateStoreStore configurationStringStrip this operator, preserve child nodesSubmitSucceededSuggested fieldsSwitch to Table viewSwitch to Tree viewSync "%s": %sSync PropertiesSync RulesSync historySync only part of your imported objects with this rule. Icinga Web 2 filter syntax is allowed, so this could look as follows: %sSync propertiesSync ruleSync rule: %sSynchronization failedSynchronization ruleSynchronizeTableTarget DBTarget Service SetTarget data typeTarget propertyTemplateTemplate NameTemplate: %sTemplatesThe "Import" job allows to run import actions at regular intervalsThe "Sync" job allows to run sync actions at regular intervalsThe %s has successfully been storedThe Config job allows you to generate and eventually deploy your Icinga 2 configurationThe Email address of the user.The Housekeeping job provides various task that keep your Director database fast and cleanThe Icinga Director Self Service API allows your Hosts to register themselves. This allows them to get their Icinga Agent configured, installed and upgraded in an automated way.The Icinga Package name Director uses to deploy it's configuration. This defaults to "director" and should not be changed unless you really know what you're doingThe LDAP properties that should be fetched. This is required to be a comma-separated list like: "cn, dnshostname, operatingsystem, sAMAccountName"The Self Service API key for %s has been droppedThe Service Set "%s" has been added to %d hostsThe argument %s has successfully been storedThe caption which should be displayedThe caption which should be displayed to your users when this field is shownThe child host.The command Icinga should run. Absolute paths are accepted as provided, relative paths are prefixed with "PluginDir + ", similar Constant prefixes are allowed. Spaces will lead to separation of command path and standalone arguments. Please note that this means that we do not support spaces in plugin names and paths right now.The corresponding passwordThe domain name you want to be strippedThe first (leftmost) CNThe first (leftmost) OUThe given properties have been stored for "%s"The host/service states you want to get notifications forThe last (rightmost) OUThe last attempt failed at %s: %sThe last attempt succeeded at %sThe last deployment did not succeedThe last deployment is currently pendingThe log duration time.The name of a time period which determines when notifications to this User should be triggered. Not set by default.The name of a time period which determines when this notification should be triggered. Not set by default.The name of a time period which determines when this object should be monitored. Not limited by default.The name of a time period within this job should be active. Supports only simple time periods (weekday and multiple time definitions)The name of the hostThe name of the serviceThe notification interval (in seconds). This interval is used for active notifications. Defaults to 30 minutes. If set to 0, re-notifications are disabled.The numeric bitmask you want to apply. In case you have a hexadecimal or binary mask please transform it to a decimal number first. The result of this modifier is a boolean value, telling whether the given mask applies to the numeric value in your source columnThe pager address of the user.The parent host.The pattern you want to search for. This can be a regular expression like /^www\d+\./The port of the endpoint.The port you are going to use. The default port 5665 will be used if none is setThe service "%s" has been added to %d hostsThe service Set that should be assignedThe service set that should be assigned to this hostThe state transition types you want to get notifications forThe string that should be used as a preplacementThe string you want to search forThe string/pattern you want to search for. Depends on the chosen method, use www.* or *linux* for wildcard matches and expression like /^www\d+\./ in case you opted for a regular expressionThe unique name of the field. This will be the name of the custom variable in the rendered Icinga configuration.The user that should run the Icinga 2 service on Windows.There are %d objects with a related property. Should I also remove the "%s" property from them?There are %d objects with a related property. Should I also rename the "%s" property to "%s" on them?There are %d pending changesThere are %d pending changes, %d of them applied to this objectThere are %d pending database migrationsThere are no data fields available. Please ask an administrator to create suchThere are no pending changesThere are no pending changes. Deploy anywaysThere are pending changes for this Import Source. You should trigger a new Import Run.There are pending changes for this Sync Rule. You should trigger a new Sync Run.There are pending database migrationsThere has been a single change to this object, nothing else has been modifiedThere have been %d changes to this object, nothing else has been modifiedThere is a single pending changeThese are different available job typesThese are different data providers fetching data from various sources. You didn't find what you're looking for? Import sources are implemented as a hook in Director, so you might find (or write your own) Icinga Web 2 module fetching data from wherever you wantThis Command is currently being used by %sThis Command is currently not in useThis Command is still in use by %d other objectsThis Import Source failed when last checked at %s: %sThis Import Source has an invalid state: %sThis Import Source provides modified dataThis Import Source was last found to be in sync at %s.This Service has been blacklisted on this hostThis Sync Rule failed when last checked at %s: %sThis Sync Rule has never been run before.This Sync Rule was last found to by in Sync at %s.This allows to filter for specific parts within the given source expression. You are allowed to refer all imported columns. Examples: host=www* would set this property only for rows imported with a host property starting with "www". Complex example: host=www*&!(address=127.*|address6=::1)This allows to temporarily disable this jobThis allows you to configure an assignment filter. Please feel free to combine as many nested operators as you wantThis allows you to configure an assignment filter. Please feel free to combine as many nested operators as you want. You might also want to skip this, define it later and/or just add this set of services to single hostsThis allows you to immediately deploy a modified configurationThis allows you to modify properties for "%s"This allows you to modify properties for all chosen hosts at onceThis basket is emptyThis has to be a MySQL or PostgreSQL databaseThis host has been registered via the Icinga Director Self Service API. In case you re-installed the host or somehow lost it's secret key, you might want to dismiss the current key. This would allow you to register the same host again.This is an abstract object type.This is the "%s" %s Template. Based on this, you might want to:This is the name of the Endpoint object (and certificate name) you created for your ApiListener object. In case you are unsure what this means please make sure to read the documentation firstThis is where you add all your servers, containers, network or sensor devices - and much more. Every subject worth to be monitoredThis is where you manage your Icinga 2 Host Checks. Host templates are your main building blocks. You can bundle them to "choices", allowing (or forcing) your users to choose among a given set of preconfigured templates.This is where you manage your Icinga 2 Service Checks. Service Templates are your base building blocks, Service Sets allow you to assign multiple Services at once. Apply Rules make it possible to assign Services based on Host properties. And the list of all single Service Objects gives you the possibility to still modify (or delete) many of them at once.This is where you manage your Icinga 2 User (Contact) objects. Try to keep your User objects simply by movin complexity to your templates. Bundle your users in groups and build Notifications based on them. Running MS Active Directory or another central User inventory? Stay away from fiddling with manual config, try to automate all the things with Imports and related Sync Rules!This is where you manage your Icinga 2 infrastructure. When adding a new Icinga Master or Satellite please re-run the Kickstart Helper once. When you feel the desire to manually create Zone or Endpoint objects please rethink this twice. Doing so is mostly the wrong way, might lead to a dead end, requiring quite some effort to clean up the whole mess afterwards.This is your Config master and will receive our DeploymentsThis job has not been executed yetThis job runs every %ds and is currently pendingThis job runs every %ds.This job would run every %ds. It has been disabled and will therefore not be executed as scheduledThis modifier transforms 0/"0"/false/"false"/"n"/"no" to false and 1, "1", true, "true", "y" and "yes" to true, both in a case insensitive way. What should happen if the given value does not match any of those? You could return a null value, or default to false or true. You might also consider interrupting the whole import process as of invalid source dataThis must be a column containing unique values like hostnames. Unless otherwise specified this will then be used as the object_name for the syncronized Icinga object. Especially when getting started with director please make sure to strictly follow this rule. Duplicate values for this column on different rows will trigger a failure, your import run will not succeed. Please pay attention when synching services, as "purge" will only work correctly with a key_column corresponding to host!name. Check the "Combine" property modifier in case your data source cannot provide such a fieldThis must be an import source column (property)This object has been disabledThis object has been enabledThis object will not be deployed as it has been disabledThis pattern will be evaluated, and variables like ${some_column} will be filled accordingly. A typical use-case is generating unique service identifiers via ${host}!${service} in case your data source doesn't allow you to ship such. The chosen "property" has no effect here and will be ignored.This requires the Icinga Agent to be installed. It generates and signs it's certificate and it also generates a minimal icinga2.conf to get your agent connected to it's parentsThis service belongs to the %s Service Set. Still, you might want to override the following properties for this host only.This service belongs to the service set "%s". Still, you might want to change the following properties for this host only.This service has been generated in an automated way, but still allows you to override the following properties in a safe way.This service has been generated using the %s apply rule, assigned where %sThis service has been inherited from %s. Still, you might want to change the following properties for this host only.This set has been inherited from %sThis synchronizes Icinga Director to your Icinga 2 infrastructure. A new run should be triggered on infrastructure changesThis template is not in useThis template is still in use by %d other objectsThis will be shown as a label for the given choiceThis will be the visible caption for this entryThis will invalidate the former keyTicketTime PeriodTime PeriodsTime periodTime period rangesTime rangesTimePeriodTimePeriodsTimeoutTimeperiodTimeperiod TemplatesTimeperiodsTimerperiodsTimestampTo ensure downloaded packages are build by the Icinga Team and not compromised by third parties, you will be able to provide an array of SHA1 hashes here. In case you have defined any hashses, the module will not continue with updating / installing the Agent in case the SHA1 hash of the downloaded MSI package is not matching one of the provided hashes of this settingTop DownTotalTransform Host NameTransform to lowercaseTransform to uppercaseTransition typesTreeTrigger Import RunTrigger this SyncTriggering this Import Source failedTweak some global Director settingsTypeType attributesUnable to fetch data: %sUnable to store a host with the given properties because of insufficient permissionsUnable to store the configuration to "%s". Please check file permissions or manually store the content shown belowUndeployed configurationsUnknownUnknown, failed to collect related informationUnknown, still waiting for config check outcomeUnlinked imported propertiesUnlinked imported row setsUnlinked imported rowsUnsatisfied dependenciesUnused rendered filesUpUpdate MethodUpdate PolicyUploadUpload a BasketUpload a Configuration BasketUsageUsage (%s)Use a local file or network shareUse lowercase firstUsed sourcesUserUser GroupUser TemplatesUser groupsUser groups that should be directly assigned to this user. Groups can be useful for various reasons. You might prefer to send notifications to groups instead of single usersUser groups that should be notified by this notificationsUser propertiesUser template nameUserGroupsUsergroupUsergroupsUsernameUsersUsers / ContactsUsers that should be notified by this notificationsUsing Apply Rules a Service can be applied to multiple hosts at once, based on filters dealing with any combination of their propertiesUsually your hosts main IPv6 addressValueValue typeVariable ValueVariable nameVolatileWant to define to execute specific checks only withing specific time periods? Get mobile notifications only out of office hours, but mail notifications all around the clock? Time Periods allow you to tackle those and similar requirements.WarningWhat kind of object this should be. Templates allow full access to any property, they are your building blocks for "real" objects. External objects should usually not be manually created or modified. They allow you to work with objects locally defined on your Icinga nodes, while not rendering and deploying them with the Director. Apply rules allow to assign services, notifications and groups to other objects.What should happen if the lookup key does not exist in the data list? You could return a null value, keep the unmodified imported value or interrupt the import processWhat should happen when the given string is empty?What should happen when the result array is empty?What should happen when the specified element is not available?What should happen with matching elements?What should happen with the row, when this property matches the given expression?What should we do if the DNS lookup fails?What should we do if the desired part does not exist?What should we do if the host (DNS) lookup fails?What should we do in case we are unable to decode the given string?What should we extract from the DN?What should we place into this Basket every time we create new snapshot?What to use as your Icinga 2 Agent's Host NameWhen deploying configuration, wait at least this amount of seconds unless the next deployment should take placeWhen emptyWhen not availableWhen the last notification should be sentWhether all configured Jobs should be disabledWhether flap detection is enabled on this objectWhether rendering should be forced. If not enforced, this job re-renders the configuration only when there have been activities since the last rendered configWhether the agent is configured to accept configWhether the argument value is a string (allowing macros like $host$) or an Icinga DSL lambda function (will be enclosed with {{ ... }}Whether the check commmand for this service should be executed on the Icinga agentWhether the parameter name should not be passed to the command. Per default, the parameter name (e.g. -H) will be appended, so no need to explicitly set this to "No".Whether the parent (master) node should actively try to connect to this agentWhether the set_if parameter is a string (allowing macros like $host$) or an Icinga DSL lambda function (will be enclosed with {{ ... }}Whether this argument should be requiredWhether this check is volatile.Whether this dependency should affect hosts or servicesWhether this field should be mandatoryWhether this host has the Icinga 2 Agent installedWhether this notification should affect hosts or servicesWhether this parameter should be repeated when multiple values (read: array) are givenWhether this zone should be available everywhere. Please note that it rarely leads to the desired result when you try to distribute global zones in distrubuted environmentsWhether to accept passive check results for this objectWhether to actively check this objectWhether to adjust your host nameWhether to disable checks when this dependency fails. Defaults to false.Whether to disable notifications when this dependency fails. Defaults to true.Whether to enable event handlers this objectWhether to ignore soft states for the reachability calculation. Defaults to true.Whether to prefer timeperiods includes or excludes. Default to true.Whether to process performance data provided by this objectWhether to purge existing objects. This means that objects of the same type will be removed from Director in case they no longer exist at your import source.Whether to send notifications for this objectWhether to send notifications for this userWhether you want to merge or replace the destination field. Makes no difference for stringsWill be stored as a custom variable value when this entry is chosen from the listWindows Kickstart ScriptWipe related varsWondering about what changed why? Track your changes!Wrap this expression into an operatorYES, please delete "%s"YesYou can create Basket snapshots at any time, this will persist a serialized representation of all involved objects at that moment in time. Snapshots can be exported, imported, shared and restored - to the very same or another Director instance.You can stop sharing a Template at any time. This will immediately invalidate the former key.You could immediately apply eventual changes or just learn about them. In case you do not want them to be applied immediately, defining a job still makes sense. You will be made aware of available changes in your Director GUI.You might want to let the generated Powershell script install the Icinga 2 Agent in an automated way. If so, please choose where your Windows nodes should fetch the Agent installerYou might want to show this field only when certain conditions are met. Otherwise it will not be available and values eventually set before will be cleared once storedYou might want to write the modified value to another (new) property. This property name can be defined here, the original property would remain unmodified. Please leave this blank in case you just want to modify the value of a specific propertyYou must define some %s before you can run this Sync RuleYour Icinga 2 API usernameYour LDAP search base. Often something like OU=Users,OU=HQ,DC=your,DC=company,DC=tldYour configuration looks good. Still, you might want to re-run this kickstart wizard to (re-)import modified or new manually defined Command definitions or to get fresh new ITL commands after an Icinga 2 Core upgrade.Your database looks good, you are ready to %sYour installation of Icinga Director has not yet been prepared for deployments. This kickstart wizard will assist you with setting up the connection to your Icinga 2 server.Your regular check intervalYour replacement stringYour users will be allowed to choose among those templatesZoneZone nameZone settingsZonesa listallbackcriticaldowne.g. -H or --hostname, empty means "skip_key"e.g. 5%, $host.name$, $lower$%:$upper$%failed to fetchherehost var namehost var valuemodifiednewno related group existsokone related group existspendingreturn NULLreturn an empty arrayservice var nameservice var valueunchangedunknownunreachableunusedupusedvalue formatviawarningProject-Id-Version: Director Module (1.6.2) Report-Msgid-Bugs-To: dev@icinga.com POT-Creation-Date: 2019-03-29 11:34+0900 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language: ja_JP Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Basepath: . X-Poedit-SearchPath-0: . ("%s" ã‹ã‚‰ç¶™æ‰¿)- 未使用 -# 使用済ã¿# 変数%d / %d%d 個ã®ãƒ›ã‚¹ãƒˆãƒ†ãƒ³ãƒ—レート。%d 個ã®ãƒ›ã‚¹ãƒˆã€‚%d 個ã®é€šçŸ¥é©ç”¨ãƒ«ãƒ¼ãƒ«ã€‚%d 個ã®é€šçŸ¥ãƒ†ãƒ³ãƒ—レート。%d 個ã®é€šçŸ¥ã€‚%d 個ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ã€‚%d 個ã®ãƒ†ãƒ³ãƒ—レート。%d 個ã®ã‚µãƒ¼ãƒ“ス%d個ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ãŒå®šç¾©ã•れã¦ã„ã¾ã™%d 個定義ã•れã¦ã„ã¾ã™%d 個削除ã•れã¦ã„ã¾ã™ã€‚%d 個ã®ãƒ•ァイル%d 個ã®ãƒ•ァイルãŒ%0.2f ç§’ã§ç”Ÿæˆã•れã¾ã—ãŸã€‚%d 個ã¯å¤–部ã§å®šç¾©ã•れã¦ãŠã‚Šã€è¨­å®šãŒå映ã•れã¾ã›ã‚“。%d 個ã®å¤‰æ›´ã€‚%d 個ã®ã‚ªãƒ–ジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚%d 個ã®ã‚ªãƒ–ジェクトãŒå®šç¾©ã•れã¦ã„ã¾ã™%d 個ã®ã‚ªãƒ–ジェクトãŒå¤‰æ›´ã•れã¦ã„ã¾ã™ã€‚%d 個ã®ã‚ªãƒ–ジェクトã€%d 個ã®ãƒ†ãƒ³ãƒ—レートã€%d 個ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ã€‚ãã®ã†ã¡ã®%d 個ã¯ãƒ†ãƒ³ãƒ—レートã§ã™%d 個ã®ãƒ†ãƒ³ãƒ—レートãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚%s "%s"ãŒä½œæˆã•れã¾ã—ãŸã€‚%s "%s"ãŒå‰Šé™¤ã•れã¾ã—ãŸã€‚%s "%s"ãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れã¾ã—ãŸã€‚%s "%s" ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚%s (%d 人ã®ãƒ¡ãƒ³ãƒãƒ¼)%s (é©ç”¨ã•れãŸã‚µãƒ¼ãƒ“スセット)%s (サービスセット)%s (デフォルト)%s (ãŸã ã—%s)%s テンプレート%s (%sãŒãƒ™ãƒ¼ã‚¹ï¼‰æœ€å¾Œã«å映ã•れãŸè¨­å®šä»¥é™ã® %s ã®è¨­å®šå¤‰æ›´%s ã¯%s ã®ãƒ–ラックリストã«ãªã‚Šã¾ã—ãŸã€‚%s ã¯ã‚‚ã†%s ã®ãƒ–ラックリストã§ã¯ã‚りã¾ã›ã‚“。%s オブジェクトãŒç·¨é›†ã•れã¾ã—ãŸã€‚%s 上ã®%s(セット: %s ã‹ã‚‰) %s 個ã®é–¢é€£ã‚ªãƒ–ジェクトãŒä½œæˆã•れã¾ã—ãŸã€‚%s テンプレート(%s をベース)%s: %d%s: %s (スナップショット)%s: プロパティ変æ›ãƒ«ãƒ¼ãƒ«%s: スナップショット%s: プロパティ変æ›ãƒ«ãƒ¼ãƒ«ã‚’追加(ホスト) グループãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’解決(%s ã«ã¤ã„ã¦)- ã•らã«è¿½åŠ  -- クリックã—ã¦ã•らã«è¿½åŠ  -- 継承 -- 自動インストールãªã— -- é¸æŠžã—ã¦ãã ã•ã„ -æ§‹æˆãƒã‚¹ã‚±ãƒƒãƒˆã¯ã€ç‰¹å®šã®æ§‹æˆã‚ªãƒ–ジェクトã¾ãŸã¯ç‰¹å®šã®ã‚¿ã‚¤ãƒ—ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをå‚ç…§ã—ã¾ã™ã€‚ ã“れã¯ãƒ†ãƒ³ãƒ—レートã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆ/åŒæœŸæˆ¦ç•¥ã€ãã®ä»–ã®åŸºæœ¬è¨­å®šã‚ªãƒ–ジェクトを共有ã™ã‚‹ã‚ˆã†ã«è¨­è¨ˆã•れã¦ã„ã¾ã™ã€‚ å˜ä¸€ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚µãƒ¼ãƒ“スã§å‹•作ã™ã‚‹ãŸã‚ã®ãƒ„ールã§ã¯ã‚りã¾ã›ã‚“。オブジェクトクラスã«åŠ ãˆã¦ä½¿ç”¨ã™ã‚‹ã‚«ã‚¹ã‚¿ãƒ LDAPフィルタ。ã“れã«ã‚ˆã‚Šã€æŸ”軟性ãŒå¤§å¹…ã«å‘上ã—ã¾ã™ãŒã€LDAPフィルタã®ã‚¹ã‚­ãƒ«ãŒå¿…è¦ã§ã™ã€‚å˜ç´”ãªãƒ•ã‚£ãƒ«ã‚¿ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚operatingsystem=*server*カスタム文字列 ソースカラムをå«ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®å ´åˆã¯ ${columnName} ã®å½¢å¼ã®placeholderを使用ã—ã¦ãã ã•ã„。フィールドã«ã¤ã„ã¦ã®èª¬æ˜Žã“ã®ãƒãƒ§ã‚¤ã‚¹ã®ã™ã¹ã¦ã«ã¤ã„ã¦èª¬æ˜Žã™ã‚‹è©³ç´°ãªèª¬æ˜Žã“ã®ã‚µãƒ¼ãƒ“スセットã®èª¬æ˜Žã‚’記述ã—ã¾ã™æ–°ã—ã„ %s ãŒæ­£å¸¸ã«ä½œæˆã•れã¾ã—ãŸ%s ã®æ–°ã—ã„セルフサービスAPIキーãŒç”Ÿæˆã•れã¾ã—ãŸã€‚プロパティ変æ›ãƒ«ãƒ¼ãƒ«ã‚’使用ã™ã‚‹ã¨ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«ç‰¹å®šã®ãƒ—ロパティを変更ã§ãã¾ã™ã€‚ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆå…ƒã‚’識別ã™ã‚‹åå‰ã€‚ ã‚ã‹ã‚Šã‚„ã™ã„æ„味ã®ã‚ã‚‹åå‰ã‚’使用ã—ã¦ãã ã•ã„。ã“ã®ã‚¸ãƒ§ãƒ–を識別ã™ã‚‹åå‰ã€‚ ã‚ã‹ã‚Šã‚„ã™ã„æ„味ã®ã‚ã‚‹åå‰ã‚’使用ã—ã¦ãã ã•ã„。ã“ã®ã‚µãƒ¼ãƒ“スセットã®åå‰ã“ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®ãƒã‚±ãƒƒãƒˆã¯ã€ãƒ‡ãƒ—ロイメントエンドãƒã‚¤ãƒ³ãƒˆã‹ã‚‰è¦æ±‚ã•れã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼š%s最後ã®è¨­å®šå映ã‹ã‚‰åˆè¨ˆ %d 回ã®è¨­å®šå¤‰æ›´ãŒè¡Œã‚れã¾ã—ãŸã€‚APIキーAPI ユーザパッシブ監視を許å¯ã™ã‚‹è¨­å®šã®åŒæœŸã‚’å—ã‘入れるAcknowledgement (検知)アクションアクションURLアクションアクティベーションツールアクティブ-パッシブアクティビティアクティビティログアクティビティログ: %sアクティビティログ追加追加: %s%s 個ã®ã‚ªãƒ–ジェクトを追加%sを追加: %sサービスを追加サービスセットを追加サービスセットを %d 個ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ ã‚µãƒ¼ãƒ“ã‚¹ã‚»ãƒƒãƒˆ: %s を追加サービス: %s を追加新ã—ã„データフィールドを追加データリストを追加新ã—ã„インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã‚’追加新ã—ã„ジョブã®è¿½åŠ æ–°ã—ã„åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’追加新ã—ã„エントリを追加新ã—ã„ã‚‚ã®ã‚’追加"%s"ã«ã‚µãƒ¼ãƒ“スセットを追加"%s"ã«ã‚µãƒ¼ãƒ“スを追加別ã®ãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ é¸æŠžã—ãŸã‚ªãƒ–ジェクトを構æˆãƒã‚¹ã‚±ãƒƒãƒˆã«è¿½åŠ ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆã‚¨ãƒ³ãƒˆãƒªã‚’追加インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®è¿½åŠ æ–°ã—ã„Icinga %s ã®è¿½åŠ æ–°ã—ã„Icinga %s テンプレートã®è¿½åŠ ãƒ—ãƒ­ãƒ‘ãƒ†ã‚£å¤‰æ›ãƒ«ãƒ¼ãƒ«ã‚’追加サービスを追加サービスセットを追加サービスを %d 個ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ åŒæœŸãƒ—ãƒ­ãƒ‘ãƒ†ã‚£ãƒ«ãƒ¼ãƒ«ã‚’è¿½åŠ åŒæœŸãƒ—ロパティを追加: %såŒæœŸãƒ«ãƒ¼ãƒ«ã‚’追加ãƒã‚¹ã‚±ãƒƒãƒˆã«è¿½åŠ ã“ã®ã‚ªãƒ–ジェクトã«é–¢ã™ã‚‹æ³¨æ„事項任æ„ã®ãƒ—ロパティエージェントエージェントã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³åˆ¥åã™ã¹ã¦ã®å¤‰æ›´ã™ã¹ã¦ã®å¤‰æ›´ã¯Directorデータベースã§è¿½è·¡ã•れã¾ã™ã€‚ ã•らã«ã€Icinga Web 2ã®ãƒ­ã‚°è¨˜éŒ²ãƒ¡ã‚«ãƒ‹ã‚ºãƒ ã‚’介ã—ã¦ç›£æŸ»ãƒ­ã‚°ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ãã†ã™ã‚Œã°ã€ã™ã¹ã¦ã®å¤‰æ›´ã¯Syslogã¾ãŸã¯è¨­å®šã•れãŸãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚ã“れを有効ã«ã™ã‚‹ã¨ãã¯ã€å°‘ãªãã¨ã‚‚ "informational"レベルã§ãƒ­ã‚°ã‚’記録ã™ã‚‹ã‚ˆã†ã«Icinga Web 2を設定ã—ãŸã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。ã™ã¹ã¦ã®ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ï¼ˆvars)ãれらã™ã¹ã¦ã™ã¹ã¦ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã¯"%s"ã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸã™ã¹ã¦ã®%s é©ç”¨ãƒ«ãƒ¼ãƒ«ã™ã¹ã¦ã® %s テンプレートアップデートを許å¯èª­ã¿å–り専用ユーザーã«ã€ã‚µãƒ¼ãƒ“スã®å‡ºæ‰€ã‚’確èªã™ã‚‹ã“ã¨ã‚’許å¯director API ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯å®Œå…¨ãª audit ログã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ãƒ›ã‚¹ãƒˆã®è¨­å®šã‚’許å¯é€šçŸ¥ã®è¨­å®šã‚’許å¯ã‚µãƒ¼ãƒ“スセットã®è¨­å®šã‚’許å¯ã‚µãƒ¼ãƒ“スã®è¨­å®šã‚’許å¯ãƒ¦ãƒ¼ã‚¶ã®è¨­å®šã‚’許å¯ã‚µãƒ¼ãƒ“ス設定ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ã®å®šç¾©ã‚’許å¯è¨­å®šå映を許å¯Icinga 2 APIを介ã—ã¦ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¤œæŸ»ã‚’許å¯ï¼ˆæ©Ÿå¯†æƒ…報をå«ã‚€å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼‰è¨­å®šã®è¡¨ç¤ºã‚’許å¯ï¼ˆæ©Ÿå¯†æƒ…報をå«ã‚€å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼‰ã„ãã¤ã‹ã®å ´æ‰€ã§å®Œå…¨ã«å®Ÿè¡Œã•れãŸSQLクエリを表示ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™é¸æŠžã—ãŸãƒ­ãƒ¼ãƒ«ã®ã©ã‚Œã‹ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã®ã¿ã“ã®ã‚¨ãƒ³ãƒˆãƒªã®ä½¿ç”¨ã‚’許å¯ã—ã¾ã™Icinga Directorã¸ã®ç„¡åˆ¶é™ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯è¨±å¯ã•れãŸä¸Šé™è¨±å¯ã•れãŸãƒ­ãƒ¼ãƒ«ã“ã®ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã«æä¾›ã•れã¦ã„るフィールドも複製ã—ã¾ã™ã€‚ã“ã®ãƒ›ã‚¹ãƒˆã«å®šç¾©ã•れã¦ã„ã‚‹å˜ä¸€ã®ã‚µãƒ¼ãƒ“スセットも複製ã—ã¾ã™ã€‚ã“ã®ãƒ›ã‚¹ãƒˆã«å®šç¾©ã•れã¦ã„ã‚‹å˜ä¸€ã®ã‚µãƒ¼ãƒ“スも複製ã—ã¾ã™ã€‚NSClient++ もインストールã—ã¾ã™ã€‚ NSClient++ ã«ã¯Icingaエージェントを介ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã€ç›£è¦–プラグインãŒä»˜å±žã—ã¦ã„ã¾ã™ã™ã¹ã¦ã® "%s" カスタム変数ã®åå‰ã‚’ "%s" ã«å¤‰æ›´ã—ã¾ã™ã‹ï¼Ÿï¼ˆå¯¾è±¡ï¼š%d個ã®ã‚ªãƒ–ジェクト)ã™ã¹ã¦ã® "%s" カスタム変数も消去ã—ã¾ã™ã‹ï¼Ÿ(処ç†å¯¾è±¡ï¼š%d個ã®ã‚ªãƒ–ジェクト)ã“ã®ãƒ›ã‚¹ãƒˆã®åˆ¥å。 ユーザーãŒã“ã®ãƒ›ã‚¹ãƒˆã‚’識別ã™ã‚‹ã®ã«å½¹ç«‹ã¤ãƒ›ã‚¹ãƒˆã‚¨ã‚¤ãƒªã‚¢ã‚¹ã¾ãŸã¯ãã®ã‚ˆã†ãªæ–‡å­—列ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ¥å。 オブジェクトåãŒãƒ¦ãƒ¼ã‚¶ãƒ¼åã§ã‚ã‚‹å ´åˆã€ã“れã¯å¯¾å¿œã™ã‚‹äººã®ãƒ•ルãƒãƒ¼ãƒ ã‚’指定ã—ãŸã‚Šã—ã¾ã™ã€‚上記ã®ã‚¢ã‚¤ã‚³ãƒ³ãŒãªã„å ´åˆã«è¡¨ç¤ºã•れる代替テキストブール値を返ã™Icinga DSL表記。例)var cmd = bool(macro("$cmd$")); return cmdIcinga DSL表記。例)var cmd = macro("$cmd$"); return typeof(command)== Stringã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«ã¤ãªãŒã‚‹URL。Icinga Classicã§ã¯ã‚ˆã使用ã•れã¾ã™ãŒã€Icinga Web 2ã§ã¯ã€ã‚¢ãƒ‰ã‚ªãƒ³ã‚’çµ±åˆã™ã‚‹ãŸã‚ã®ã¯ã‚‹ã‹ã«å„ªã‚ŒãŸæ©Ÿèƒ½ãŒã‚ã‚‹ãŸã‚ã€ã»ã¨ã‚“ã©ä½¿ç”¨ã•れã¾ã›ã‚“。ã“ã®ã‚ªãƒ–ジェクトã«é–¢ã™ã‚‹URLã“ã®ã‚ªãƒ–ジェクトã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’指ã™URL。 public/img/iconsã«é–¢é€£ã™ã‚‹ã‚¢ã‚¤ã‚³ãƒ³ã«ã¯ "tux.png"ã‚’ã€Icingaアイコンフォントã®ã‚¢ã‚¤ãƒ†ãƒ ã«ã¯"cloud"(拡張å­ãªã—)を試ã—ã¦ãã ã•ã„。ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®åˆ¥åã§ã€è¡¨ç¤ºã«ä½¿ã‚れã¾ã™ã€‚別åを設定ã™ã‚‹å¿…è¦ãŒãªã‘れã°ã€ç©ºç™½ã®ã¾ã¾ã§ã‚‚å•題ã‚りã¾ã›ã‚“。ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆè¡Œãƒ—ロパティ変æ›ãƒ«ãƒ¼ãƒ«ã®è©³ç´°ãªèª¬æ˜Žã€‚ 目的ã¨ã€ãªãœå¿…è¦ãªã®ã‹ã®èª¬æ˜Žã‚’書ãã¾ã™ã€‚ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®è©³ç´°ãªèª¬æ˜Žã€‚ ã“ã®ã‚½ãƒ¼ã‚¹ã‹ã‚‰ã©ã®ã‚ˆã†ãªç¨®é¡žã®ãƒ‡ãƒ¼ã‚¿ã‚’インãƒãƒ¼ãƒˆã—よã†ã¨ã—ã¦ã„ã‚‹ã®ã‹ã‚’説明ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã®è©³ç´°ãªèª¬æ˜Žã‚’記載ã—ã¾ã™ã€‚ã“ã®ãƒ•ィールドã®è©³ç´°ãªèª¬æ˜Žã€‚ ユーザーãŒã“ã®ãƒ•ィールドã«ãƒ•ォーカスã™ã‚‹ã¨è¡¨ç¤ºã•れã¾ã™ã€‚検索ã™ã‚‹ã‚ªãƒ–ジェクトクラス "user"ã€"group"ã€"computer"ãªã©ã®å¯èƒ½æ€§ãŒã‚りã¾ã™æœ€åˆã®ï¼ˆä¸€ç•ªå·¦ã®ï¼‰ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆã™ã¹ã¦APIéµ: %s ã‚’é©ç”¨ã—ã¾ã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã‚’é©ç”¨ã—ã¾ã—ãŸã‚µãƒ¼ãƒ“スをé©ç”¨ã—ã¾ã—ãŸ: %sサービスをé©ç”¨ã—ã¾ã—ãŸé©ç”¨"%s"ã‚’é©ç”¨%d 個ã®ä¿ç•™ä¸­ã®ã‚¹ã‚­ãƒ¼ãƒžç§»è¡Œã‚’é©ç”¨é©ç”¨å¯¾è±¡ãƒ«ãƒ¼ãƒ«ã‚’é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’é©ç”¨ã—ã¦ãƒ—レビューを行ã†ãƒ«ãƒ¼ãƒ«ã‚’é©ç”¨ä¿ç•™ä¸­ã®ã‚¹ã‚­ãƒ¼ãƒžç§»è¡Œã‚’é©ç”¨ã™ã‚‹å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹æŒ‡å®šã•れãŸãƒ«ãƒ¼ãƒ«ã«å¾“ã£ã¦ç‰¹å®šã®ãƒ—ロパティã§é€šçŸ¥ã‚’é©ç”¨ã—ã¾ã™ã€‚ルールをé©ç”¨ã™ã‚‹ãƒ«ãƒ¼ãƒ«ã®é©ç”¨å±¥æ­´ã‚¹ã‚­ãƒ¼ãƒžã®ç§»è¡Œã‚’é©ç”¨é©ç”¨å…ˆé©ç”¨: %s引数引数マクロ引数å引数é…列æ¡ä»¶å¼ã®æŒ‡å®šä½œæˆè€…ã™ã¹ã¦ã®ã‚¿ã‚¹ã‚¯ã®è‡ªå‹•化自動化利用å¯èƒ½ãªãƒãƒ§ã‚¤ã‚¹æˆ»ã‚‹ãƒã‚¹ã‚±ãƒƒãƒˆãƒã‚¹ã‚±ãƒƒãƒˆã®å®šç¾©ãƒã‚¹ã‚±ãƒƒãƒˆåãƒã‚¹ã‚±ãƒƒãƒˆã®ã‚¹ãƒŠãƒƒãƒ—ショットãƒã‚¹ã‚±ãƒƒãƒˆãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸãƒã‚¹ã‚±ãƒƒãƒˆãƒ–ラックリストキャプションã“ã®å€¤ã‚’変更ã™ã‚‹ã¨ã€%d個ã®ã‚ªãƒ–ジェクトã«å½±éŸ¿ã—ã¾ã™: %s監視コマンド監視コマンド監視コマンドã®å®šç¾©ã‚³ãƒžãƒ³ãƒ‰ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ™‚é–“ã‚’ç§’å˜ä½ã§æŒ‡å®šã—ã¾ã™ç›£è¦–ã®å®Ÿè¡Œå¤‰æ›´ã®ç¢ºèªç›£è¦–インターãƒãƒ«ç›£è¦–スケジュール監視タイムアウトã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®æ¤œæŸ»ãŒå¤±æ•—ã—ã¾ã—ãŸã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã®æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸãƒã‚§ãƒƒã‚¯ã‚µãƒ å­ãƒ›ã‚¹ãƒˆå­ã‚µãƒ¼ãƒ“スãƒãƒ§ã‚¤ã‚¹åãƒãƒ§ã‚¤ã‚¹å¸¸ã«ã™ã¹ã¦ã‚’追加ã™ã‚‹ã«ã¯ã€Œã™ã¹ã¦ã€ã‚’ã€ç‰¹å®šã®ã‚¿ã‚¤ãƒ—ã‚’ã¾ã£ãŸãæ°—ã«ã—ãªã„よã†ã«ã™ã‚‹ã«ã¯ã€Œç„¡è¦–ã€ã‚’é¸æŠžã—ã€ç‰¹å®šã®ã‚ªãƒ–ジェクトã ã‘ã‚’é¸æŠžã™ã‚‹å ´åˆã¯ã€Œã‚«ã‚¹ã‚¿ãƒ é¸æŠžã€ã‚’é¸æŠžã—ã¾ã™ã€‚ãƒ›ã‚¹ãƒˆãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠžã‚µãƒ¼ãƒ“ã‚¹ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠžã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚¿ã‚¤ãƒ—ã‚’é¸æŠžãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã“ã®å˜ä¸€ã‚µãƒ¼ãƒ“スãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã‚‹ã¹ããƒ›ã‚¹ãƒˆã‚’é¸æŠžã“ã®è¨­å®šã¯ã“ã®ãƒãƒ§ã‚¤ã‚¹ã«å¿…é ˆã§ã™ã€‚ ã“れをゼロã«è¨­å®šã™ã‚‹ã¨ã€ã“ã®ãƒãƒ§ã‚¤ã‚¹ã¯ã‚ªãƒ—ションã®ã¾ã¾ã«ãªã‚Šã€1ã«è¨­å®šã™ã‚‹ã¨ã€Œå¿…é ˆã€ã®ãƒãƒ§ã‚¤ã‚¹ã«ãªã‚Šã¾ã™ã€‚複数ã®ã‚ªãƒ—ションを強制ã™ã‚‹ãŸã‚ã«ã‚ˆã‚Šé«˜ã„数を使ã†ã“ã¨ãŒã§ãã¾ã™ã€ãã—ã¦ã“ã®ãƒãƒ§ã‚¤ã‚¹ã¯ãれã‹ã‚‰è¤‡æ•°é¸æŠžè¦ç´ ã«å¤‰ã‚りã¾ã™ã€‚(オプションã®ï¼‰è¦ªã‚¾ãƒ¼ãƒ³ã‚’é¸æŠžè¤‡è£½"%s"を複製サービスセットを複製サービスを複製テンプレートフィールドを複製インãƒãƒ¼ãƒˆã‚’ä¿æŒã—ãªãŒã‚‰ã€ã‚ªãƒ–ジェクトをãã®ã¾ã¾è¤‡è£½ã™ã‚‹ã“ã®ã‚µãƒ¼ãƒ“スをã¾ã£ãŸãåŒã˜ã¾ãŸã¯åˆ¥ã®ã‚µãƒ¼ãƒ“スセットã«è¤‡è£½ã—ã¾ã™ã€‚複製: %sクラスタゾーンãƒãƒ§ã‚¤ã‚¹ã‚’利用ã™ã‚‹ã“ã¨ã§ã€ç´°åˆ†åŒ–ã•れãŸãƒ†ãƒ³ãƒ—レートをã€ç”¨é€”毎ã«ã¾ã¨ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹ã“ã¨ã§ã€ãƒ›ã‚¹ãƒˆã«è¤‡æ•°ã®ãƒ†ãƒ³ãƒ—レートを何度もインãƒãƒ¼ãƒˆã™ã‚‹æ‰‹é–“ã‚’çœãã“ã¨ãŒã§ãã¾ã™ã€‚コマンドコマンド定義コマンドテンプレートコマンド引数: %sコマンドエンドãƒã‚¤ãƒ³ãƒˆã‚³ãƒžãƒ³ãƒ‰åコマンドタイプコマンド%s ã‚’"%s"ã¨æ¯”較ã—ã¾ã™ã€‚スナップショット"%s"ã‹ã‚‰ç¾åœ¨ã®è¨­å®šã¨ã®æ¯”較ã§ã™ã€‚æ¡ä»¶ï¼ˆset_if)æ¡ä»¶ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆè¨­å®šè¨­å®šåæ˜ è¨­å®šå映ã«å¤±æ•—ã—ã¾ã—ãŸã€‚設定差分設定ファイル "%s"設定ãŒé€ä¿¡ã•ã‚Œã€æ¤œè¨¼ãŒè¡Œã‚れã¦ã„ã¾ã™ã€‚設定ファイルプレビュー: %s設定設定(読ã¿è¾¼ã¿å°‚用)æ§‹æˆãƒã‚¹ã‚±ãƒƒãƒˆè¨­å®šãƒ•ォーマット設定ãŒä¿å­˜ã•れã¾ã—ãŸé¸æŠžã—ãŸãƒã‚¹ã‚±ãƒƒãƒˆ "%s" ã«æ§‹æˆã‚ªãƒ–ジェクトãŒè¿½åŠ ã•れã¾ã—ãŸã€‚ã“ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’セルフサービスAPIã§è¨­å®šã€‚コンテンツãƒã‚§ãƒƒã‚¯ã‚µãƒ ä½œæˆãƒã‚¹ã‚±ãƒƒãƒˆã‚’作æˆã‚¹ãƒŠãƒƒãƒ—ã‚·ãƒ§ãƒƒãƒˆã‚’ä½œæˆæ–°ã—ã„ %s é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’ä½œæˆæ–°ã—ã„ %s セットを作æˆã“れを継承ã—ã¦æ–°ã—ã„%s を作æˆã™ã‚‹ã“ã®ãƒ†ãƒ³ãƒ—レートを継承ã—ã¦æ–°ã—ã„ %s を作æˆã™ã‚‹æ–°ã—ã„æ§‹æˆãƒã‚¹ã‚±ãƒƒãƒˆã‚’ä½œæˆæ–°ã—ã„ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’ä½œæˆæ–°ã—ã„ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ä½œæˆæ–°ã—ã„テンプレートãƒãƒ§ã‚¤ã‚¹ã‚’作æˆãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¹ã‚­ãƒ¼ãƒžã‚’作æˆã‚¹ã‚­ãƒ¼ãƒžã®ä½œæˆä½œæˆCritical (å±é™º)ç¾åœ¨ã®ãƒ†ãƒ³ãƒ—レートã®åˆ©ç”¨çжæ³ã‚«ã‚¹ã‚¿ãƒ é¸æŠžã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã®äºœç¨®ï¼š%sカスタム変数カスタム変数 - 概è¦ã‚«ã‚¹ã‚¿ãƒ è¡¨ç¾ã‚«ã‚¹ã‚¿ãƒ ãƒ•ィールド: %sCustom (カスタム通知)カスタムプロパティカスタム変数カスタム変数(vars)カスタム変数カスタム変数概è¦DB クエリDBリソースDN コンãƒãƒ¼ãƒãƒ³ãƒˆDNSレコードタイプデータフィールドデータリストデータリストエントリデータリスト: %sデータリストデータフィールドデータフィールドを使用ã™ã‚‹ã¨ã€ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã«å…¥åŠ›ã™ã‚‹å€¤ã‚’カスタマイズã§ãã¾ã™ã€‚具体的ã«ã¯ã‚¿ã‚¤ãƒ—を数値ã«é™å®šã—ãŸã‚Šã€ãƒ‡ãƒ¼ã‚¿ã®ãƒªã‚¹ãƒˆã‚’é¸æŠžã•ã›ã‚‹ã‚ˆã†ãªå…¥åŠ›ã‚’ãƒ¦ãƒ¼ã‚¶ã«å¼·åˆ¶ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚データフィールドを使用ã™ã‚‹ã¨ã€Icingaカスタム変数ã®å…¥åŠ›åˆ¶é™ã‚’カスタマイズã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€è¨­å®šãŒãƒ«ãƒ¼ãƒ«ã«å¾“ã†ã“ã¨ã‚’確èªã§ãã¾ã™ãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆã¯ã€ãƒ‰ãƒ­ãƒƒãƒ—ダウンボックスボックスã¨ã—ã¦è¡¨ç¤ºã•れるカスタム変数ã®ãƒ‡ãƒ¼ã‚¿ãƒ—ロãƒã‚¤ãƒ€ã¨ã—ã¦ä¸»ã«ä½¿ç”¨ã•れã¾ã™ã€‚ ã“ã“ã§æ‰‹å‹•ã§ã‚¨ãƒ³ãƒˆãƒªã‚’管ç†ã§ãã¾ã™ãŒã€æ–°ã—ã„空ã®ãƒªã‚¹ãƒˆã‚’作æˆã—ãŸå¾Œã«å°‚用ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’作æˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ ã“れã«ã‚ˆã‚Šã€åˆ©ç”¨å¯èƒ½ãªé¸æŠžè‚¢ã‚’外部ã®ãƒ‡ãƒ¼ã‚¿ãƒ—ロãƒã‚¤ãƒ€ã¨åŒæœŸã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚データタイプデータベースãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰æ—¥ä»˜æ—¥ä»˜ãƒ»æ›œæ—¥ãƒ‡ãƒ•ォルトã®è¨­å®šãƒ•ォーマット。 ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.x ã¯ç‰¹åˆ¥ãªç§»è¡Œãƒ—ロジェクト専用ã§ã€å®Œå…¨ã«ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 Icinga 1.xã§ã¯ã€Directorã‚’ã‚‚ã£ã¨ã‚‚推奨ã™ã‚‹è¨­å®šãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã«ã™ã‚‹è¨ˆç”»ã¯ã‚りã¾ã›ã‚“。デフォルトã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚¾ãƒ¼ãƒ³ç›£è¦–ã€é€šçŸ¥ã€ã¾ãŸã¯ã‚¤ãƒ™ãƒ³ãƒˆã‚³ãƒžãƒ³ãƒ‰ã‚’定義ã—ã¾ã™ã€‚ コマンド定義ã¯ã€Host-Checkã¨Service-Checkã€ãŠã‚ˆã³Monitoring(ã¾ãŸã¯ç›£è¦–対象)システムã®Checkプラグインをçµã³ã¤ã‘ã¾ã™ã€‚データフィールドã®å®šç¾©è¨­å®šã‚’より構造化ã™ã‚‹ãŸã‚ã«ãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—を定義ã—ã¾ã™ã€‚ダッシュボードã€é€šçŸ¥ã€åˆ¶é™ã«æ´»ç”¨ã§ãã¾ã™ã€‚特定ã®Icinga 2 Agent MSIインストーラパッケージをå–å¾—ã™ã‚‹ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰URLã¾ãŸã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’定義ã—ã¾ã™ã€‚ 基本ダウンロードURLã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ã¿ã‚’定義ã—ã¦ãã ã•ã„。 モジュールã¯ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«åŸºã¥ã„ã¦MSIファイルåを生æˆã—ã¾ã™ã€‚ Icinga 2 MSIインストーラーåã¯ã€å†…éƒ¨çš„ã«æ¬¡ã®ã‚ˆã†ã«æ§‹ç¯‰ã•れã¦ã„ã¾ã™ã€‚Icinga2-v [InstallAgentVersion] - [OSArchitecture] .msi(完全ãªä¾‹ï¼šIcinga2-v2.6.3-x86_64.msi)ã•ã¾ã–ã¾ãªãƒ‡ãƒ¼ã‚¿ã‚½ãƒ¼ã‚¹ã‹ã‚‰ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’定義ãŠã‚ˆã³ç®¡ç†ã—ã¾ã™ã‚«ã‚¹ã‚¿ãƒ ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã®å®šç¾©ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’Icingaã¨åŒæœŸã•ã›ã‚‹æ–¹æ³•を定義ã—ã¾ã™ä¸€è‡´ã™ã‚‹ã‚­ãƒ¼ã‚’æŒã¤ã‚ªãƒ–ジェクトãŒã™ã§ã«å­˜åœ¨ã™ã‚‹ã¨ãã«ä½•ãŒèµ·ã“ã‚‹ã‹ã‚’定義ã—ã¾ã™ã€‚ プロパティã¯ãƒžãƒ¼ã‚¸ã™ã‚‹ã“ã¨ãŒã§ã(インãƒãƒ¼ãƒˆå…ƒãŒå„ªå…ˆï¼‰ã€ãれをインãƒãƒ¼ãƒˆã•れãŸã‚ªãƒ–ジェクトã¨å®Œå…¨ã«ç½®ãæ›ãˆã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ç„¡è¦–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼ˆä¸€å›žé™ã‚Šã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å½¹ç«‹ã¡ã¾ã™ï¼‰ç›£è¦–対象を定義異常(hard state)ã¨åˆ¤å®šã™ã‚‹ã¾ã§ã®ç›£è¦–ã®æœ€å¤§è©¦è¡Œå›žæ•°å˜ä¸€ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã¯ãªãユーザーグループã®é€šçŸ¥ã‚’定義ã™ã‚‹ã¨ã€æŸ”軟性ãŒå‘上ã—ã¾ã™ã€‚サービスグループを定義ã™ã‚‹ã¨ã€ã‚ˆã‚Šæ§‹é€ ãŒã‚ã‹ã‚Šã¾ã™ã€‚ ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã«æœ€é©ã§ã™ã€‚ 通知ã¨è¨±å¯ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«åŸºã¥ã„ã¦ã„ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚最åˆã®é€šçŸ¥æ™‚間削除分割å­ä¾å­˜é–¢ä¿‚ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆè¨­å®šåæ˜ %d 個ã®ä¿ç•™ã•れãŸå¤‰æ›´ã‚’åæ˜ Icingaノードã¸ã®è¨­å®šã®å映変更ã•れãŸè¨­å®šã‚’åæ˜ è¨­å®šåæ˜ åæ˜ ãƒ‘ã‚¹è¨­å®šåæ˜ çµæžœã®è©³ç´°è¨­å®šå映モードIcinga1ã®è¨­å®šåæ˜ ãƒ¢ãƒ¼ãƒ‰è¨­å®šåæ˜ æ™‚åˆ»è¨­å®šåæ˜ èª¬æ˜Žå®›å…ˆå®›å…ˆãƒ•ィールドã“ã®è¨­å®šçжæ³ã®ç¢ºèªã‚’定期的ã«Icingaã®ç›£è¦–ã¨ã—ã¦å®Ÿè¡Œã§ãã¾ã™å·®åˆ†ã»ã‹ã®è¨­å®šã¨ã®å·®åˆ†ç›´æŽ¥Director 正常性Director キックスタートウィザードdirector設定Director データベーススキーマãŒã¾ã ä½œæˆã•れã¦ã„ã¾ã›ã‚“監視を無効化通知を無効化ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–を無効化無効無効化ã•れãŸã‚ªãƒ–ジェクトã¯è¨­å®šã®å映ãŒã•れã¾ã›ã‚“。表示å表示å個別ã®ã‚³ãƒžãƒ³ãƒ‰ã‚«ã‚¹ã‚¿ãƒ ãƒ‡ãƒ¼ã‚¿ã§é«˜åº¦ã«è¨­å®šå…¨ã変æ›ã—ãªã„ドキュメントDown (åœæ­¢)ダウンロードJSONå½¢å¼ã§ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚«ã‚¹ã‚¿ãƒ URLã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰packages.icinga.com ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰DowntimeEnd (ダウンタイムã®çµ‚了)DowntimeRemoved (ダウンタイムã®å‰Šé™¤)DowntimeStart (ダウンタイムã®é–‹å§‹)セルフサービスAPIキーを削除継続フィールドを編集リストを編集Eメールaudit ログを有効ã«ã™ã‚‹ã‚¤ãƒ™ãƒ³ãƒˆãƒãƒ³ãƒ‰ãƒ©ã‚’有効ã«ã™ã‚‹ãƒ•ラップ検知を有効ã«ã™ã‚‹ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆåエンドãƒã‚¤ãƒ³ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆãƒ†ãƒ³ãƒ—レートåエンドãƒã‚¤ãƒ³ãƒˆã‚¨ãƒ©ãƒ¼è¦ªãƒŽãƒ¼ãƒ‰ã‹ã‚‰ã®æŽ¥ç¶šã‚«ã‚¹ã‚¿ãƒ å±žæ€§ãŒæŒ‡å®šã•れã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã®ãƒ«ãƒ¼ãƒ«é©ç”¨ã‚’評価ã—ã¾ã™ã€‚ 例ãˆã°"host.vars.custom_attr"ã‚’é¸æŠžã™ã‚‹ã¨ "for(config.host.vars.array_var)"ãŒç”Ÿæˆã•れã¾ã™ã€‚ã“ã“ã§ "config"㯠"$config$"を通ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã§ã™ã€‚ 注:タイプ "é…列"ã®ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã®ã¿ãŒå¯¾è±¡ã§ã™ã€‚イベントコマンドイベントコマンドã®å®šç¾©æŒ‡å®šã—ãŸã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«è¨­å®šã®æœŸé–“を除外ã—ã¾ã™ã€‚除外スケジュールã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã‚¢ã‚¯ãƒ†ã‚£ãƒ–監視を実行ã™ã‚‹ã“ã®ã‚¸ãƒ§ãƒ–ã®å®Ÿè¡Œé–“隔。秒å˜ä½å­˜åœ¨ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆå­˜åœ¨ã™ã‚‹ãƒ†ãƒ³ãƒ—レートエキスパートモード外部外部コマンド外部コマンドã¯ãƒ­ãƒ¼ã‚«ãƒ«ã®Icinga 2 設定ã«ã¦å®šç¾©ã•れã¦ã„ã¾ã™ã€‚外部通知コマンド外部通知コマンドã¯ãƒ­ãƒ¼ã‚«ãƒ«ã®Icinga 2 設定ã«ã¦å®šç¾©ã•れã¦ã„ã¾ã™ã€‚失敗%s ã® "%s"ã¸ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆãŒå¤±æ•—ã—ã¾ã—ãŸã€‚フィールドãŒå‰Šé™¤ã•れã¾ã—ãŸãƒ•ィールドåフィールドタイプフィールドファイルフィルタ表ç¾åˆ©ç”¨å¯èƒ½ãªé€šçŸ¥é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’フィルタリング利用å¯èƒ½ãªã‚µãƒ¼ãƒ“スé©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’フィルタリング利用å¯èƒ½ãªã‚µãƒ¼ãƒ“スセットテンプレートをフィルタリング。「DB*ã€ã€ã€Œ*net*ã€ã®ã‚ˆã†ã«ã€ã‚¢ã‚¹ã‚¿ãƒªã‚¹ã‚¯(*)をワイルドカードã¨ã—ã¦ä½¿ã†ã€‚フィルタメソッド第一è¦ç´ æœ€åˆã®é€šçŸ¥ã®é…延フラッピングFlappingEnd (フラッピング終了)サービスをフラッピング状態ã¨ã¿ãªã™ãŸã‚ã®ä¸‹é™å€¤(%å˜ä½)FlappingStart (フラッピング開始)フラッピング閾値(上é™ï¼‰ãƒ•ラッピング閾値(下é™ï¼‰ã‚µãƒ¼ãƒ“スをフラッピング状態ã¨ã¿ãªã™ãŸã‚ã®ä¸Šé™å€¤(%å˜ä½)継承ã•れãŸã™ã¹ã¦ã®ãƒ—ロパティを統åˆã—ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’削除ã—ã¾ã™APIディレクトリをフラッシュã™ã‚‹æ‰‹å‹•設定用強制的ã«è¨­å®šã‚’生æˆã™ã‚‹ãƒ•ォームè¦ç´ ãŒä½œæˆã§ãã¾ã›ã‚“。%s ãŒã‚りã¾ã›ã‚“ãƒ•ã‚©ãƒ¼ãƒ ã¯æ­£å¸¸ã«é€ä¿¡ã•れã¾ã—ãŸãƒ•ォーマット以å‰ã®ã‚ªãƒ–ジェクト完全修飾ドメインå(FQDN)セルフサービスAPIã‚­ãƒ¼ã‚’ç”Ÿæˆæ–°ã—ã„éµã‚’生æˆè¨­å®šã‚’生æˆã—ã¾ã—ãŸãƒ›ã‚¹ãƒˆå¤‰æ•°ã‹ã‚‰ç”Ÿæˆã—ã¾ã—ãŸéšœå®³ç™ºç”Ÿæ™‚ã®ã‚¢ãƒ©ãƒ¼ãƒˆé€šçŸ¥ä½¿ç”¨ã•れã¦ã„るカスタム変数ã¨ãã®çжæ³ã®æ¦‚è¦ã§ã™ã‚°ãƒ­ãƒ¼ãƒãƒ«Director設定グローãƒãƒ«ã‚»ãƒ«ãƒ•サービス設定グローãƒãƒ«ã‚¾ãƒ¼ãƒ³ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚¾ãƒ¼ãƒ³æŽ¥ç€å‰¤"%s" ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã«æˆ»ã‚‹çŒ¶äºˆæœŸé–“グループグループã¯ç¶™æ‰¿ã•れã¾ã—ãŸãŒã€ãƒ­ãƒ¼ã‚«ãƒ«ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•れã¾ã™ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—グループã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—: %sサービスをセットã«ã‚°ãƒ«ãƒ¼ãƒ—化ã™ã‚‹ã¨ã€ä¸€åº¦ã«1ã¤ã®æ“作ã§ä¸€ç·’ã«ä½¿ç”¨ã•れるã“ã¨ãŒå¤šã„サービスを一度ã«ç´ æ—©ã割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚グループdirector ã®è¨­å®šçжæ³å˜ä¸€ã®ãƒ›ã‚¹ãƒˆã«ç›´æŽ¥æŽ¥ç¶šã•れã¦ã„ã‚‹ã™ã¹ã¦ã®å˜ä¸€ã®ã‚µãƒ¼ãƒ“スを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚éš ã•れã¦ã„ã¾ã™SQLã‚’éš ã™ãƒ’ント:監視プラグインã“ã®ã‚µãƒ¼ãƒ“スã«é–¢ã™ã‚‹ãƒ’ント履歴ホストホストカスタム変数ホストグループホストグループホストåホストテンプレートホストテンプレートãƒãƒ§ã‚¤ã‚¹ãƒ›ã‚¹ãƒˆãƒ†ãƒ³ãƒ—レートホストアドレスホストアドレス。 通常ã¯IPv4アドレスã§ã™ãŒã€ç›£è¦–ãƒ—ãƒ©ã‚°ã‚¤ãƒ³ãŒæ‰±ã†å…¨ã¦ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’利用ã§ãã¾ã™ã€‚ホスト設定ホストグループホストåホストå(ドメインãªã—ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ‘ート)ホストオブジェクトホストプロパティホストテンプレートã®é¸æŠžãƒ›ã‚¹ãƒˆãƒ†ãƒ³ãƒ—レートã®é¸æŠžãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—ホストグループホストグループホストグループã“ã®ãƒŽãƒ¼ãƒ‰ã«ç›´æŽ¥å‰²ã‚Šå½“ã¦ã‚‹å¿…è¦ãŒã‚るホストグループ。 ホストグループã¯ã•ã¾ã–ã¾ãªç†ç”±ã§å½¹ã«ç«‹ã¡ã¾ã™ã€‚ 割り当ã¦ã‚‰ã‚ŒãŸãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—ã«åŸºã¥ã„ã¦ã‚µãƒ¼ãƒ“ス監視を割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ãれらã¯ã€Icinga Web 2ã§åˆ¶é™ä»˜ãビューを強制ã™ã‚‹æ‰‹æ®µã¨ã—ã¦ã‚‚よã使用ã•れã¾ã™ã€‚ホストグループã¯ã€å˜ä¸€ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ãƒ›ã‚¹ãƒˆãƒ†ãƒ³ãƒ—レートã«ç›´æŽ¥å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’使用ã—ã¦ãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—を割り当ã¦ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ホストåホストã“ã®ã‚»ãƒƒãƒˆã‚’利用ã—ã¦ã„るホスト: %sリモートノードã®IP アドレス / ホストåIcingaノードã®IPアドレス/ホストå。 ã“ã®æƒ…å ±ã¯ã€Icingaインスタンスã¸ã®æœ€åˆã®æŽ¥ç¶šã«ã®ã¿ä½¿ç”¨ã•れるã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。ãã®å¾Œã€directorã¯æ­£ã—ã設定ã•れãŸã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã‚ªãƒ–ジェクトã«ä¾å­˜ã—ã¾ã™ã€‚æ­£ã—ãæ§‹æˆã•れã¦ã„ã‚‹ã¨ã„ã†ã“ã¨ã¯ã€ãã®åå‰ãŒè§£æ±ºå¯èƒ½ã§ã‚ã‚‹ã‹ã€ã¾ãŸã¯ãƒ›ã‚¹ãƒˆãƒ—ロパティã«IPアドレスã¾ãŸã¯è§£æ±ºå¯èƒ½ãªãƒ›ã‚¹ãƒˆåãŒå«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ directorã¯ã“ã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã«åˆ°é”ã§ããªã‘れã°ãªã‚Šã¾ã›ã‚“IPv6 アドレスIcinga %s セットIcinga 2 API - オブジェクト: %sIcinga 2 API - ステータスIcinga 2 Client ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆIcingaエージェントã¨ã‚¾ãƒ¼ãƒ³ã®è¨­å®šIcinga APIユーザIcinga DSLIcinga directorIcinga Director - メインダッシュボードIcinga directorã®è¨­å®šIcinga Directorã¯ã€ç›£è¦–コマンドãªã©ã®ã‚ªãƒ–ジェクト設定をグローãƒãƒ«ã‚¾ãƒ¼ãƒ³ã«å映ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ãŸã€‚ デフォルトã§ã¯ã€Œdirector-globalã€ã§ã™ã€‚ä»»æ„ã®ã‚¾ãƒ¼ãƒ³åãŒæŒ‡å®šã•れã¦ã„ã‚‹å ´åˆã¯ã€ãã®ã‚¾ãƒ¼ãƒ³ã«å映ã•れã¾ã™ã€‚Icinga directorã¯ã‚»ãƒ«ãƒ•サービスAPIã‚’æä¾›ã—ã€æ–°ã—ã„IcingaノードãŒè‡ªåˆ†è‡ªèº«ã‚’登録ã§ãるよã†ã«ã—ã¾ã™ã€‚Icinga ホストIcinga インフラストラクãƒãƒ£Icingaパッケージåè¨­å®šã‚’åæ˜ ã™ã‚‹ã‚¯ãƒ©ã‚¹ã‚¿ã‚¾ãƒ¼ãƒ³ã‚’設定ã—ã¾ã™ã€‚IcingaクラスタãŒã©ã®ã‚ˆã†ã«æ©Ÿèƒ½ã—ã¦ã„ã‚‹ã‹ç†è§£ã—ã¦ã„ãªã„å ´åˆã¯ã€è¨­å®šã—ãªã„ã§ãã ã•ã„。ã“ã®ãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—ã®Icingaオブジェクトåã“ã®ãƒ›ã‚¹ãƒˆã®Icingaオブジェクトå。ã“れã¯é€šå¸¸å®Œå…¨ä¿®é£¾ãƒ›ã‚¹ãƒˆåã§ã™ãŒã€åŸºæœ¬çš„ã«ã¯ã‚ã‚‰ã‚†ã‚‹ç¨®é¡žã®æ–‡å­—列ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ユーザーã®ä½œæ¥­ã‚’容易ã«ã™ã‚‹ãŸã‚ã«ã€ãƒ†ãƒ³ãƒ—レートã«ã¯ã‚ã‹ã‚Šã‚„ã™ã„åå‰ã‚’使用ã™ã‚‹ã“ã¨ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚ 例ãˆã°ã€"generic-host"ã¯ã‚ã‹ã‚Šã«ãã„ã§ã™ãŒã€"Standard Linux Server"ã¯ç†è§£ã—ã‚„ã™ã„ã§ã™ã“ã®ã‚µãƒ¼ãƒ“スグループã®Icingaオブジェクトåã“ã®ãƒ¦ãƒ¼ã‚¶ã‚°ãƒ«ãƒ¼ãƒ—ã®IcingaオブジェクトåIcinga v1.xIcinga v2.xIcinga2 エージェントアイコン画åƒã‚¢ã‚¤ã‚³ãƒ³ç”»åƒã®ä»£æ›¿ãƒ†ã‚­ã‚¹ãƒˆID作æˆã—よã†ã¨ã—ã¦ã„ã‚‹Icingaコマンドã®ID無視一時的ãªç•°å¸¸(soft state)を無視インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ãƒ‡ãƒ¼ã‚¿ã‚½ãƒ¼ã‚¹ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆå¤–部"%s"をインãƒãƒ¼ãƒˆå‡¦ç†ã‚’インãƒãƒ¼ãƒˆå®Ÿè¡Œå±¥æ­´ã‚’インãƒãƒ¼ãƒˆ: %s インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹åインãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®ãƒ—レビュー: %sインãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹: %så¿…è¦ãªãƒ†ãƒ³ãƒ—レートを追加ã—ã¦ãã ã•ã„。複数ã®ãƒ†ãƒ³ãƒ—レートをインãƒãƒ¼ãƒˆã™ã‚‹å ´åˆã€æœ€å¾Œã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸãƒ†ãƒ³ãƒ—レートã®ãƒ—ロパティãŒå„ªå…ˆã•れã¾ã™ã€‚ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸæ–°ã—ã„データインãƒãƒ¼ãƒˆã•れãŸè¡Œã‚ªãƒ–ジェクトをインãƒãƒ¼ãƒˆã™ã‚‹ã¨ã€ãã®ã‚¿ã‚¤ãƒ—ã¯ã€Œå¤–部ã€ã‹ã‚‰ã€Œã‚ªãƒ–ジェクトã€ã«å¤‰ã‚りã¾ã™ã€‚ ãã‚Œã¯æ¬¡ã®è¨­å®šå映ã®å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚ãã®ãŸã‚ã€Icingaノードã‹ã‚‰ã“ã®ã‚ªãƒ–ジェクトをインãƒãƒ¼ãƒˆã—ãŸå ´åˆã¯ã€æ¬¡ã®è¨­å®šå映を行ã†å‰ã«å¿…ãšãƒ­ãƒ¼ã‚«ãƒ«è¨­å®šã‹ã‚‰å‰Šé™¤ã—ã¦ãã ã•ã„。設定ã®è¡çªãŒç™ºç”Ÿã—ãŸå ´åˆã€ã»ã‹ã¸ã®æ‚ªå½±éŸ¿ã¯ã‚りã¾ã›ã‚“ãŒã€è¡çªã—ãŸè¨­å®šãŒå映ã•れã¾ã›ã‚“。インãƒãƒ¼ãƒˆIcinga管ç†è€…ã‹ã‚‰ã‚»ãƒ«ãƒ•サービスAPIãƒˆãƒ¼ã‚¯ãƒ³ãŒæä¾›ã•れãŸå ´åˆã¯ã€ã“ã“ã§æ–°ã—ã„ホストを登録ã§ãã¾ã™ã€‚Icinga 2 Agent ãŒã™ã§ã«ã‚·ã‚¹ãƒ†ãƒ ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹å ´åˆã¯ã€ã“ã®ãƒ‘ラメータを使用ã—ã¦æŒ‡å®šã—ãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—グレードã¾ãŸã¯ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ã™ã‚‹ã‹ã‚‚設定ã§ãã¾ã™ã€‚Icinga 2 Agent を自動的ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã€ãã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’指定ã—ã¾ã™ã€‚ã“れã¯ã€Œ2.6.3ã€ã®ã‚ˆã†ãªæ–‡å­—列値ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™Icinga AgentãŒè¦ªã®Icinga 2システムã‹ã‚‰è¨­å®šã‚’å—ã‘入れる場åˆã€ãŠãらã /var/lib/icinga2/api/* ã«ãƒ‡ãƒ¼ã‚¿ã‚’書ãè¾¼ã¿ã¾ã™ã€‚ ã“ã®ãƒ‘ラメータを「ã¯ã„ã€ã«è¨­å®šã™ã‚‹ã¨ã€apiディレクトリ内ã®ã™ã¹ã¦ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€æœ€çµ‚çš„ã«Icinga 2 Agentã‚’å†èµ·å‹•ã™ã‚‹å‰ã«ãƒ•ラッシュã•れã¾ã™ã€‚é¸æŠžã—ãŸä»–ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«è¨­å®šã‚’é©ç”¨ã—ã¾ã™ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰é–“接個々ã®ã‚µãƒ¼ãƒ“スオブジェクトインフラストラクãƒãƒ£ç¶™æ‰¿ï¼ˆã‚¤ãƒ³ãƒãƒ¼ãƒˆï¼‰ç¶™æ‰¿ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—継承ã•れãŸã‚µãƒ¼ãƒ“ス: %s検査検査 - オブジェクトリストNSClient++ をインストールインストールソースインストーラã®ãƒãƒƒã‚·ãƒ¥å†…部コマンドåå‰ãŒå¤‰æ›´ã•れã¾ã—ãŸ(以å‰ã®åå‰: %s)ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆãŒæœ‰åйãªã‚»ãƒ«ãƒ•サービスAPIキーをã¾ã æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€ãã®æ“作ã¯ãŠå‹§ã‚ã§ãã¾ã›ã‚“。ã“れ以上ã®é¸æŠžè‚¢ã‚’é¸æŠžã™ã‚‹ã“ã¨ã¯è¨±å¯ã•れã¾ã›ã‚“。 ã“れを1ã«è¨­å®šã™ã‚‹ã¨ãƒ‰ãƒ­ãƒƒãƒ—ダウンボックスãŒè¡¨ç¤ºã•ã‚Œã€æ•°å€¤ãŒå¤§ãã„ã»ã©è¤‡æ•°é¸æŠžè¦ç´ ã«ãªã‚Šã¾ã™ã€‚ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¨åŒæœŸã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã¯ç¾åœ¨ä¸æ˜Žã§ã™ã€‚変更を確èªã™ã‚‹ã‹ã€æ–°ã—ã„インãƒãƒ¼ãƒˆå®Ÿè¡Œã‚’トリガã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã“ã®ãƒ«ãƒ¼ãƒ«ã§åŒæœŸã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã¯ç¾åœ¨ä¸æ˜Žã§ã™ã€‚ 変更を確èªã™ã‚‹ã‹ã€æ–°ã—ã„åŒæœŸå®Ÿè¡Œã‚’トリガã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚空ã®ãƒã‚¹ã‚±ãƒƒãƒˆã¯ä¿å­˜ã§ãã¾ã›ã‚“ジョブジョブã®å®šç¾©ã‚¸ãƒ§ãƒ–タイプジョブåジョブ: %sジョブã“ã®ã‚ªãƒ–ジェクトã«é£›ã¶ã“ã®ã‚¹ã‚¯ãƒªãƒ—トをLinuxクライアントマシンã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã™ã‚‹ã ã‘ã§ã™ã€‚一致ã™ã‚‹è¦ç´ ã‚’ä¿æŒã—ã¾ã™ä¸€è‡´ã™ã‚‹è¡Œï¼ˆãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆï¼‰ã®ã¿ã‚’ä¿æŒã—ã¾ã™DNãŒæ¬¡ã§ã‚るよã†ã«ä¿æŒã—ã¾ã™ï¼šJSONæ–‡å­—åˆ—ãŒæ¬¡ã§ã‚るよã†ã«ä¿æŒã—ã¾ã™ï¼šãƒ—ロパティ(ホストåï¼‰ãŒæ¬¡ã§ã‚るよã†ã«ä¿æŒã—ã¾ã™ï¼šãƒ—ãƒ­ãƒ‘ãƒ†ã‚£ãŒæ¬¡ã§ã‚るよã†ã«ä¿æŒã—ã¾ã™ï¼šã‚­ãƒ¼ã‚­ãƒ¼ã¨ãªã‚‹ã‚«ãƒ©ãƒ åキックスタートキックスタートウィザードLDAP検索ベースDNãƒ©ãƒ™ãƒ«æœ€çµ‚ç›£è¦–çµæžœæœ€å¾Œã®è¦ç´ æœ€çµ‚通知ã¾ã§ã®æ™‚間最後ã®é–¢é€£ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ãƒ†ã‚£æœ€çµ‚åŒæœŸã®å‡¦ç†ã®è©³ç´°ä½ç½®ã«é–¢ã™ã‚‹å¼•æ•°ã§ãªã„å ´åˆã¯ç©ºã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。 正数ã¾ãŸã¯è² æ•°ã«ã™ã‚‹ã“ã¨ãŒã§ãã€å¼•æ•°ã®é †åºã«å½±éŸ¿ã‚’与ãˆã¾ã™é–¢é€£ãƒ•ィールドを削除ã—ã€ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã‚’ãã®ã¾ã¾ã«ã—ã¦ãŠãã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ ã“ã®ã‚ˆã†ãªçŠ¶æ…‹ã§ã¯ã€Directorã§é–¢é€£ã™ã‚‹ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã‚’変更ã™ã‚‹ã“ã¨ã¯ã§ããªããªã‚Šã¾ã™ãŒã€å¤‰æ•°è‡ªä½“ã¯ãã®ã¾ã¾åˆ©ç”¨ã§ãã¾ã™ã€‚ 後ã§åŒã˜å¤‰æ•°ã®ãƒ•ィールドを追加ã—ç›´ã—ã¦ã‚‚ã€ä»¥å‰ã¨åŒã˜ã‚ˆã†ã«æ©Ÿèƒ½ã—ç¶šã‘ã¾ã™ã€‚関連フィールドを削除ã—ã€ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã‚’ãã®ã¾ã¾ã«ã—ã¦ãŠãã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ ã“ã®ã‚ˆã†ãªçŠ¶æ…‹ã§ã¯ã€Directorã§é–¢é€£ã™ã‚‹ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã‚’変更ã™ã‚‹ã“ã¨ã¯ã§ããªããªã‚Šã¾ã™ãŒã€å¤‰æ•°è‡ªä½“ã¯ãã®ã¾ã¾åˆ©ç”¨ã§ãã¾ã™ã€‚ 後ã§åŒã˜å¤‰æ•°ã®ãƒ•ィールドを追加ã—ç›´ã—ã¦ã‚‚ã€ä»¥å‰ã¨åŒã˜ã‚ˆã†ã«æ©Ÿèƒ½ã—ç¶šã‘ã¾ã™ã€‚インãƒãƒ¼ãƒˆã‚’失敗ã«ã™ã‚‹ã‚¤ãƒ³ãƒãƒ¼ãƒˆå®Ÿè¡Œå…¨ä½“を失敗ã«ã™ã‚‹ã‚¤ãƒ³ãƒãƒ¼ãƒˆå®Ÿè¡Œå…¨ä½“を失敗ã«ã™ã‚‹æŒ‡å®šã—ãŸãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã—ã¾ã™Linux コマンドラインリストエントリリストエントリリストåIcinga 1.xæ§‹æˆã‚’åæ˜ ã™ã‚‹ãŸã‚ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€‚ icingaweb2ã«ã‚ˆã£ã¦æ›¸ãè¾¼ã¿å¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 (例:/etc/icinga/director)ログä¿å­˜æœŸé–“プロパティ監視ã€é€šçŸ¥ã€ã¾ãŸã¯ã‚¤ãƒ™ãƒ³ãƒˆã«åŸºã¥ã„ã¦å®Ÿè¡Œã•れるコマンドã®å®šç¾©ã‚’管ç†ã—ã¾ã™ã€‚ホストテンプレートを管ç†ã—ã¾ã™ã€‚ ユーザーãŒç°¡å˜ã«ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãるよã†ã«ã™ã‚‹ãŸã‚ã«ã¯ã€ãƒ•ィールドを使用ã—ã¦ãã ã•ã„。マスター/ゾーン/サテライトãªã©ã€Icinga 2 ã®åŸºç›¤ã¨ãªã‚‹è¨­å®šã‚’管ç†ã—ã¾ã™Icinga コマンドを管ç†Icinga ã®ãƒ›ã‚¹ãƒˆã®ç®¡ç†Icinga インフラストラクãƒãƒ£ã®ç®¡ç†Icinga サービス監視を管ç†ã‚µãƒ¼ãƒ“ステンプレートを管ç†ã—ã¾ã™ã€‚ ユーザーãŒãƒ•ィールドをカスタマイズã—ã‚„ã™ãã™ã‚‹ã«ã¯ã€ãƒ•ィールドを使用ã—ã¾ã™ã€‚必須マスター無ã—NULL値ã®ã‚«ãƒ©ãƒ ã¨ä¸€è‡´çœŸå½å€¤FALSEã«ä¸€è‡´çœŸå½å€¤TRUEã«ä¸€è‡´æœ€å¤§ç›£è¦–試行回数メンãƒãƒ¼ãƒ¡ãƒ³ãƒãƒ¼ãƒžãƒ¼ã‚¸ãƒžãƒ¼ã‚¸ãƒãƒªã‚·ãƒ¼monday, tuesday, 2016-01-28ã¨ã„ã£ãŸæ›¸å¼ã§æŒ‡å®šã—ã¾ã™ã€‚より多ãã®ä¾‹ã«ã¤ã„ã¦ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’見ã¦ãã ã•ã„æœ€ä½Žè¦ä»¶ãƒ—ロパティ変æ›ãƒ«ãƒ¼ãƒ«ãƒ—ロパティ変æ›ãƒ«ãƒ¼ãƒ«ç·¨é›†%d 個ã®ãƒ›ã‚¹ãƒˆã‚’編集%d 個ã®ãƒ›ã‚¹ãƒˆã‚’編集%s を編集ホストを編集データリストエントリã®ç·¨é›†ã“ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’編集監視対象サービス下ã¸ç§»å‹•上ã«ç§»å‹•複数ã®ã‚ªãƒ–ジェクト自身ã«ã‚ˆã‚‹å¤‰æ›´MySQL スキーマåå‰Icingaä¾å­˜é–¢ä¿‚オブジェクトã®åå‰Icingaエンドãƒã‚¤ãƒ³ãƒˆãƒ†ãƒ³ãƒ—レートã®åå‰Icingaエンドãƒã‚¤ãƒ³ãƒˆã®åå‰Icinga通知テンプレートã®åå‰Icinga通知ã®åå‰Icingaサービスã®åå‰ä½œæˆã—よã†ã¨ã—ã¦ã„ã‚‹Icingaユーザオブジェクトã®åå‰ä½œæˆã—よã†ã¨ã—ã¦ã„ã‚‹Icingaユーザテンプレートã®åå‰ä½œæˆã—よã†ã¨ã—ã¦ã„ã‚‹Icingaゾーンã®åå‰ãƒ†ãƒ³ãƒ—レートを複製ã™ã‚‹ã¨ãã«åå‰ã‚’変更ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™Navæ–°ã—ã„フィールド新ã—ã„ジョブ新ã—ã„インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹æ–°ã—ã„å剿–°ã—ã„オブジェクト次ã¸ã„ã„ãˆåˆ©ç”¨å¯èƒ½ãª%s リソースã¯ã‚りã¾ã›ã‚“APIユーザーãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。キックスタートウィザードを実行ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ホストテンプレートãŒã¾ã æä¾›ã•れã¦ã„ã¾ã›ã‚“ホストテンプレートãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“サービステンプレートãŒã¾ã æä¾›ã•れã¦ã„ã¾ã›ã‚“アクションã¯è¡Œã‚れãšã€ã‚ªãƒ–ジェクトã¯å¤‰æ›´ã•れã¦ã„ã¾ã›ã‚“é©ç”¨ãƒ«ãƒ¼ãƒ«ãŒã¾ã ä¸€ã¤ã‚‚定義ã•れã¦ã„ã¾ã›ã‚“何も変更ã•れã¦ã„ã¾ã›ã‚“利用å¯èƒ½ãªãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ãŒã‚りã¾ã›ã‚“。ååˆ†ãªæ¨©é™ãŒãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™Icinga Director用ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒæ§‹æˆã•れã¦ã„ã¾ã›ã‚“データベースリソースã¯ã¾ã è¨­å®šã•れã¦ã„ã¾ã›ã‚“。 設定を完了ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚’é¸æŠžã—ã¦ãã ã•ã„データベーススキーマãŒã¾ã ä½œæˆã•れã¦ã„ã¾ã›ã‚“オブジェクトãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“オブジェクトã¯ã¾ã å®šç¾©ã•れã¦ã„ã¾ã›ã‚“オブジェクトãŒå¤‰æ›´ã•れã¦ã„ã¾ã›ã‚“。関連ã™ã‚‹ãƒ†ãƒ³ãƒ—レートãŒç”¨æ„ã•れã¦ã„ã¾ã›ã‚“。サービスãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。ãã®ã‚ˆã†ãªã‚µãƒ¼ãƒ“スã¯ã‚りã¾ã›ã‚“: %sテンプレートãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。テンプレートãŒå®šç¾©ã•れã¦ã„ã¾ã›ã‚“。ãªã—ç¾åœ¨ã€å映ã§ãる設定ã¯ã‚りã¾ã›ã‚“メモ関連URL変更ã¯ã‚りã¾ã›ã‚“。ルールã¯åŒæœŸã•れã¦ã„ã¾ã™ã€‚何もã—ã¾ã›ã‚“。ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã«ã‚ˆã£ã¦æä¾›ã•れãŸãƒ‡ãƒ¼ã‚¿ã¯æœ€å¾Œã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆå®Ÿè¡Œä»¥æ¥ã€å¤‰æ›´ã•れã¦ã„ã¾ã›ã‚“何もã—ã¾ã›ã‚“。復元ã—ã¦ã‚‚ç¾åœ¨ã®ã‚ªãƒ–ジェクトã¯å¤‰æ›´ã•れã¾ã›ã‚“変更ã¯èµ·ãã¾ã›ã‚“。ã“ã®ãƒ«ãƒ¼ãƒ«ã¯ã¾ã åŒæœŸã•れã¦ã„ã¾ã™ã€‚通知%s ã«åŸºã¥ã通知é©ç”¨ãƒ«ãƒ¼ãƒ«é€šçŸ¥ã‚³ãƒžãƒ³ãƒ‰é€šçŸ¥ã‚³ãƒžãƒ³ãƒ‰ã‚’使用ã™ã‚‹ã¨ã€é€šçŸ¥ãŒç™ºç”Ÿã—ãŸã¨ãã«å¿…è¦ãªæ“作を実行ã§ãã¾ã™ã€‚通知テンプレート通知コマンド通知インターãƒãƒ«é€šçŸ¥ãƒ†ãƒ³ãƒ—レートãƒãƒ§ã‚¤ã‚¹é€šçŸ¥ãƒ†ãƒ³ãƒ—レート通知ホストã¾ãŸã¯ã‚µãƒ¼ãƒ“スãŒç•°å¸¸ãªçŠ¶æ…‹ã«ãªã£ãŸã¨ãã‚„ã€ãã“ã‹ã‚‰å¾©æ—§ã—ãŸã¨ãã«é€šçŸ¥ãŒé€ä¿¡ã•れã¾ã™ã€‚ ã¾ãŸã€ãƒ€ã‚¦ãƒ³ã‚¿ã‚¤ãƒ ã®é–‹å§‹æ™‚ã€éšœå®³ã®ç™ºè¦‹æ™‚ãªã©ã€ç‰¹åˆ¥ãªã‚¤ãƒ™ãƒ³ãƒˆã®ãŸã‚ã«é€šçŸ¥ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ ç‰¹å®šã®æœŸé–“内ã«ã®ã¿ç‰¹å®šã®é€šçŸ¥ã‚’é€ã‚‹ã“ã¨ã‚„ã€é€šçŸ¥ã‚’é…らã›ã‚‹ã“ã¨ã€ç‰¹å®šã®é–“éš”ã§å†é€šçŸ¥ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ エスカレーションレベルを定義ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ãŸã¨ãˆã°ã€éšœå®³ãŒä¸€å®šæ™‚間解決ã•れãªã„å ´åˆã«å‚™ãˆã¦ã€æœ€åˆã«ã‚ªãƒšãƒ¬ãƒ¼ã‚¿ã«é€šçŸ¥ã—ã€å¾Œã§ç®¡ç†è€…ã«é€šçŸ¥ã™ã‚‹ã¨ã„ã†è¨­å®šã‚’ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ ãªãŠé€šçŸ¥ã¯ã€ãƒ¡ãƒ¼ãƒ«ä»¥å¤–ã®æ–¹æ³•ã§è¡Œã†ã“ã¨ã‚‚ã§ãã¾ã™ã€‚æ•°å­—ä½ç½®OK (正常)ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¤œæŸ»ã‚ªãƒ–ジェクトタイプオブジェクトクラスä¾å­˜é–¢ä¿‚オブジェクトオブジェクトãŒå†ä½œæˆã•れã¾ã—ãŸã‚ªãƒ–ジェクトãŒãƒªã‚¹ãƒˆã‚¢ã•れã¾ã—ãŸã‚ªãƒ–ジェクトプロパティオブジェクトタイプオブジェクトタイプ "%s"オブジェクト/TPL/é©ç”¨ã‚ªãƒ–ジェクト失敗時一ã¤ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚1ã¤ã®å¤–部オブジェクトãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚設定ã®å映ãŒè¡Œã‚れã¾ã›ã‚“。一ã¤ã®ã‚ªãƒ–ジェクトãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚一ã¤ã®ã‚ªãƒ–ジェクトãŒå¤‰æ›´ã•れã¦ã„ã¾ã™ã€‚ã“ã®æ–‡å­—列を分割ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れる1ã¤ä»¥ä¸Šã®æ–‡å­—入力é…列を文字列ã«çµåˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れる1ã¤ä»¥ä¸Šã®æ–‡å­—。 空ã®ã¾ã¾ã«ã§ãã¾ã™ä¸€ã¤ã¾ãŸã¯è¤‡æ•°ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã€‚(例)00:00-24:00 or 00:00-09:00,17:00-24:001ã¤ã®ãƒ†ãƒ³ãƒ—レートãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚å¼•æ•°å€¤ãŒæ•°å€¤ã«è§£æ±ºã•れる場åˆã«ã®ã¿ã€ã“ã®ãƒ‘ラメータを設定ã—ã¦ãã ã•ã„。文字列値ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“オプションオプションã®ã‚³ãƒžãƒ³ãƒ‰ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã€‚書å¼ã¯ã€ç§’æ•°ã¾ãŸã¯æœŸé–“ã®ã‚ã¨ã«ç‰¹å®šã®å˜ä½ã‚’付ã‘ãŸã‚‚ã®ï¼ˆãŸã¨ãˆã°ã€1分ã¾ãŸã¯3分30秒)。オプションã§ã™ã€‚ å­ã‚µãƒ¼ãƒ“スã§ã™ã€‚çœç•¥ã—ãŸå ´åˆã€ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトã¯ãƒ›ã‚¹ãƒˆã®ä¾å­˜é–¢ä¿‚ã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚オプション。親サービス。çœç•¥ã—ãŸå ´åˆã€ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトã¯ãƒ›ã‚¹ãƒˆã®ä¾å­˜é–¢ä¿‚ã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚ã»ã‹ã®åˆ©ç”¨å¯èƒ½ãªãƒ•ィールドã»ã‹ã®ã‚½ãƒ¼ã‚¹å¤‰æ•°ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰æ¦‚è¦PHPãƒãƒ¼ã‚¸ãƒ§ãƒ³5.4.xã¯Director> = 1.4.0ã«å¿…è¦ã§ã™ã€‚ã‚ãªãŸã¯%sを実行ã—ã¦ã„ã¾ã™ã€‚ PHPをアップグレードã™ã‚‹ã‹ã€Icinga Directorをダウングレードã—ã¦ãã ã•ã„。ページャー親ホスト親サービス親ゾーンパスワードパターンä¿ç•™ä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¹ã‚­ãƒ¼ãƒžã®ç§»è¡Œã¯æ­£å¸¸ã«é©ç”¨ã•れã¾ã—ãŸãƒªã‚½ãƒ¼ã‚¹ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹ã‚ˆã†ã«ç®¡ç†è€…ã«ä¾é ¼ã—ã¦ãã ã•ã„ãƒã‚¹ã‚±ãƒƒãƒˆã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。%sã¯å˜ä¸€ã®"%s"設定オブジェクトをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“地図検索ã«ä½¿ç”¨ã§ãã‚‹ãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„特定ã®Icingaã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚¿ã‚¤ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„実行ã™ã‚‹å¿…è¦ãŒã‚るインãƒãƒ¼ãƒˆå…ƒã‚’é¸æŠžã—ã¦ãã ã•ã„。 ソースã”ã¨ã«ç•°ãªã‚‹ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’作æˆã—ãŸã‚Šã€ãれらã™ã¹ã¦ã‚’一度ã«å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚実行ã™ã‚‹åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 ç•°ãªã‚‹ãƒ«ãƒ¼ãƒ«ã«å¯¾ã—ã¦ç•°ãªã‚‹ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’作æˆã—ãŸã‚Šã€ãれらã™ã¹ã¦ã‚’一度ã«å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚クエリ欄を決定ã™ã‚‹ã«ã¯ã€ã‚‚ã†ä¸€åº¦ã€Œä¿å­˜ã€ã‚’クリックã—ã¦ãã ã•ã„。新ã—ã„DBリソースを作æˆã™ã‚‹ã«ã¯ã€%sをクリックã—ã¦ãã ã•ã„æ–°ã—ã„リソースを作æˆã™ã‚‹ã«ã¯ã€%sをクリックã—ã¦ãã ã•ã„%sã‚’å…ˆã«å®šç¾©ã—ã¦ãã ã•ã„関連ã™ã‚‹ãƒ†ãƒ³ãƒ—レートを先ã«å®šç¾©ã—ã¦ãã ã•ã„データベースãŒå­˜åœ¨ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ååˆ†ãªæ¨©é™ãŒä»˜ä¸Žã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。本当ã«ã“れらã®è¨­å®šå¤‰æ›´ãŒå¿…è¦ã ã¨ç¢ºä¿¡ã—ã¦ã„ã‚‹å ´åˆã ã‘ã“れらã®è¨­å®šã‚’変ãˆã¦ãã ã•ã„。 通常ã€Icinga Directorã«ã‚ˆã£ã¦é¸æŠžã•れãŸãƒ‡ãƒ•ォルトã¯ã€ç’°å¢ƒã«é©ã—ãŸã‚‚ã®ã«ãªã‚‹ã¯ãšã§ã™ã€‚ルールåを入力ã—ã¦ãã ã•ã„作業ã®é–‹å§‹ã¨çµ‚了ã®è©³ç´°ãªæ‰‹é †ã«ã¤ã„ã¦ã¯%sã‚’å‚ç…§ã—ã¦ãã ã•ã„。プラグイン監視ã¯ã€ã‚¤ãƒ³ãƒ•ラストラクãƒãƒ£ã«å¯¾ã—ã¦å†åº¦ç›£è¦–を実行ã™ã‚‹ã¨ãã«å¿…è¦ãªã‚‚ã®ã§ã™ã€‚通知コマンドã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«é€šçŸ¥ã‚’行ã†éš›ã«ä½¿ã‚れã¾ã™ã€‚イベントコマンドã¯ã€éšœå®³ãŒç™ºç”Ÿã—ãŸã¨ãã«ç‰¹å®šã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’èµ·ã“ã›ã¾ã™ã€‚ ã¾ãŸã€ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã‚’用ã„ã¦ã€ã‚µãƒ¼ãƒ“スをå†èµ·å‹•ã—ãŸã‚Šã€ç‰¹å®šã®ã—ãã„値ã§ã‚·ã‚¹ãƒ†ãƒ ã‚’å†èµ·å‹•ã™ã‚‹ãªã©ã€è‡ªå‹•修復メカニズムã«åˆ©ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚プラグインコマンドãƒãƒªã‚·ãƒ¼ãƒãƒ¼ãƒˆä½ç½®ä½ç½®ã‚¿ã‚¤ãƒ—PostgreSQLスキーマインクルードã®å„ªå…ˆç‰¹å®šã®æ§‹æˆã‚ªãƒ–ジェクトを決ã¾ã£ãŸçŠ¶æ…‹ã«ç¶­æŒã—ã¾ã™ãƒ—レビューProblem (障害)障害対応プロセスパフォーマンスデータプロパティプロパティプロパティ変æ›ãƒ«ãƒ¼ãƒ«: %sä¿è­·ã•れã¦ã„ã¾ã™ãƒ—ロトタイプ(方法)データリストカスタム変数ã«åˆ©ç”¨ã™ã‚‹ã€ãƒ‡ãƒ¼ã‚¿ã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚例ãˆã°ã€ã‚µãƒ¼ãƒ“スタイプã¨ã„ã†ãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆã«ã€ã€ŒWEBã€ã€ŒDBã€ç­‰ã®å€¤ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ãƒªã‚¹ãƒˆã‚’使ã†ã“ã¨ã§ã€å¤‰æ•°ã®å€¤ã‚’手ã§å…¥åŠ›ã™ã‚‹ã®ã§ã¯ãªãã€ãƒ¦ãƒ¼ã‚¶ã«é¸æŠžã•ã›ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚スケジュールオブジェクト用ã®ãƒ†ãƒ³ãƒ—レートをæä¾›ã—ã¾ã™ã€‚ユーザーオブジェクト用ã®ãƒ†ãƒ³ãƒ—レートをæä¾›ã—ã¾ã™ã€‚通知用ã®ãƒ†ãƒ³ãƒ—レートをæä¾›ã—ã¾ã™ã€‚削除期間å†å映Recovery (復旧)セルフサービスAPIキーをå†ç”Ÿæˆç™»éŒ²ç™»éŒ²ã•れãŸã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆæ­£è¦è¡¨ç¾æ–‡å­—列を分割ã™ã‚‹æ­£è¦è¡¨ç¾ãƒ‘ターン(例: /\s+/ ã¾ãŸã¯ /[,;]/)マッãƒã—ãŸè¦ç´ ã‚’æ‹’å¦è¡Œå…¨ä½“ã‚’æ‹’å¦ï¼ˆãƒ–ラックリスト)関連オブジェクト削除ã“ã®ãƒ›ã‚¹ãƒˆã‹ã‚‰ã€Œ%sã€ã‚’削除ã“ã®ã‚¨ãƒ³ãƒˆãƒªã‚’削除フィルタã‹ã‚‰ã“ã®éƒ¨åˆ†ã‚’除去関連ã™ã‚‹å¤‰æ•°ã®åå‰ã‚’変更設定を生æˆãƒ•ァイルを生æˆè¨­å®šç”Ÿæˆæ™‚é–“:%0.2f ç§’, è¨­å®šåæ˜ æ™‚é–“: %0.2f 秒設定生æˆä¸­ã‚­ãƒ¼ã‚’å復置æ›è¦æ±‚リストア以å‰ã®ã‚ªãƒ–ジェクトをリストア対象ã®Director DBをリストアリトライ間隔最大監視試行回数ã«é”ã™ã‚‹ã¾ã§ã®è©¦è¡Œé–“隔変更ã•れã¦ã„ãªã„å‚照キーを返ã™ãƒ«ãƒ¼ãƒ«åã™ã¹ã¦ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’ã¾ã¨ã‚ã¦å®Ÿè¡Œã™ã¹ã¦ã®ãƒ«ãƒ¼ãƒ«ã‚’ã¾ã¨ã‚ã¦å®Ÿè¡Œã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’実行実行インターãƒãƒ«ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆå´ã§å®Ÿè¡Œã‚¤ãƒ³ãƒãƒ¼ãƒˆã€åŒæœŸã€è¨­å®šå映ã€ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングãªã©ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨è‡ªå‹•化通知をスケジュール通知をスケジュールã—ã¾ã™ã€‚ 誰ã«ã„ã¤ã€ã©ã‚“ãªç¨®é¡žã®éšœå®³ã«å¯¾ã—ã¦é€šçŸ¥ã™ã‚‹ã‹ã‚’定義ã—ã¾ã™ã€‚æ–°ã—ã„設定ステージをアクティブã«ã™ã‚‹ã¨ãã«å‘¼ã³å‡ºã™ã‚¹ã‚¯ãƒªãƒ—トã¾ãŸã¯ãƒ„ール。 (例:sudo /usr/local/bin/icinga-director-activate)(ステージã®åå‰ãŒã‚¹ã‚¯ãƒªãƒ—トã®å¼•æ•°ã«ãªã‚Šã¾ã™ï¼‰ã‚»ãƒ«ãƒ•サービスセルフサービス - ホストã®ç™»éŒ²ã‚»ãƒ«ãƒ•サービス APIセルフサービス API - グローãƒãƒ«è¨­å®šã‚»ãƒ«ãƒ•サービス設定ã¯ä¿å­˜ã•れã¾ã—ãŸã€‚通知をé€ä¿¡ã™ã‚‹ã¸é€ã‚‹ã‚µãƒ¼ãƒ“スサービスé©ç”¨ãƒ«ãƒ¼ãƒ«ã‚µãƒ¼ãƒ“スグループサービスグループサービスセットサービスセットãŒå‰Šé™¤ã•れã¾ã—ãŸã‚µãƒ¼ãƒ“スセットサービステンプレートサービステンプレートãƒãƒ§ã‚¤ã‚¹ã‚µãƒ¼ãƒ“ステンプレートサービスユーザサービスグループã“ã®ã‚µãƒ¼ãƒ“スã«ç›´æŽ¥å‰²ã‚Šå½“ã¦ã‚‹å¿…è¦ãŒã‚るサービスグループ。 サービスグループã¯ã•ã¾ã–ã¾ãªç†ç”±ã§å½¹ã«ç«‹ã¡ã¾ã™ã€‚ カスタムダッシュボードã¾ãŸã¯åˆ¶é™ã‚’é©ç”¨ã™ã‚‹æ‰‹æ®µã¨ã—ã¦ã€Icinga Web 2ã§ã‚µãƒ¼ãƒ“スタイプ固有ã®ãƒ“ューをæä¾›ã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚ サービスグループã¯ã€å˜ä¸€ã®ã‚µãƒ¼ãƒ“スã¾ãŸã¯ã‚µãƒ¼ãƒ“ステンプレートã«ç›´æŽ¥å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚サービスåサービスプロパティサービスセットサービスセットåサービステンプレートãƒãƒ§ã‚¤ã‚¹ã‚µãƒ¼ãƒ“ステンプレートãƒãƒ§ã‚¤ã‚¹ã‚µãƒ¼ãƒ“スグループサービスセットサービスグループサービスåサービスã“ã®ã‚»ãƒƒãƒˆä¸­ã®ã‚µãƒ¼ãƒ“ス: %s%sã®ã‚µãƒ¼ãƒ“ス%sã®ã‚µãƒ¼ãƒ“スフィルタã«åŸºã¥ã„ã¦è¨­å®šFALSEを設定ã™ã‚‹å€¤ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“(null)NULLを設定TRUEを設定セットコマンドエンドãƒã‚¤ãƒ³ãƒˆã‚’設定ã™ã‚‹ã¨ã€ç‰¹å®šã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã§ãƒ›ã‚¹ãƒˆç›£è¦–を強制的ã«å®Ÿè¡Œã§ãã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹å‰ã«ã€é–¢é€£ã™ã‚‹Icingaã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’よã調ã¹ã¦ãã ã•ã„。設定設定ã¯ä¿å­˜ã•れã¾ã—ãŸã‚»ãƒ«ãƒ•サービスAPIã«ã“ã®ãƒ†ãƒ³ãƒ—レートを共有セルフサービスAPIã®ãŸã‚ã«å…±æœ‰ã•れã¦ã„ã¾ã™ä»–ã®ã™ã¹ã¦ã®æ–‡å­—ã‚’å…ˆé ­å°æ–‡å­—ã«ã—ã¾ã™ã‹ï¼Ÿè¡¨ç¤ºãƒã‚¹ã‚±ãƒƒãƒˆã‚’表示SQLを表示影響をå—ã‘るオブジェクトを表示利用å¯èƒ½ãªã‚ªãƒ—ションを表示フィルタã«åŸºã¥ã„ã¦è¡¨ç¤ºã“ã®å¤‰æ›´ã«é–¢é€£ã™ã‚‹è©³ç´°ã‚’表示通常表示インãƒãƒ¼ãƒˆå†…容を展開ã—ã¦è¡¨ç¤ºãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ã¨ã®å˜ç´”一致(*)å˜ä¸€ã‚ªãƒ–ジェクト差分å˜ä¸€ã®ã‚µãƒ¼ãƒ“スサイズキーをスキップスナップショットスナップショットソースカラムソース表ç¾ã‚½ãƒ¼ã‚¹åソースパスソースタイプソースカラムソースフィールドソースå特殊プロパティ特定ã®è¦ç´ ï¼ˆä½ç½®æŒ‡å®šï¼‰ã‚¹ãƒ†ãƒ¼ã‚¸å開始時間スタートアップスタートアップログ状態状態フィルターã¨é·ç§»ã‚¿ã‚¤ãƒ—フィルター状態変化状態統計ステータスã“ã®ãƒ†ãƒ³ãƒ—レートã®å…±æœ‰ã‚’ã‚„ã‚ã‚‹ä¿å­˜è¨­å®šã‚’ä¿å­˜æ–‡å­—ã“ã®æ¼”ç®—å­ã‚’å–り除ãã€å­ãƒŽãƒ¼ãƒ‰ã‚’ä¿å­˜ã—ã¾ã™é€ä¿¡æˆåŠŸã—ã¾ã—ãŸã‚µã‚¸ã‚§ã‚¹ãƒˆã•れãŸãƒ•ィールドテーブル表示ã«åˆ‡ã‚Šæ›¿ãˆãƒ„リー表示ã«åˆ‡ã‚Šæ›¿ãˆåŒæœŸ "%s": %såŒæœŸãƒ—ãƒ­ãƒ‘ãƒ†ã‚£åŒæœŸãƒ«ãƒ¼ãƒ«åŒæœŸå±¥æ­´ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ãŸã‚ªãƒ–ジェクトã®ä¸€éƒ¨ã ã‘ã‚’ã“ã®ãƒ«ãƒ¼ãƒ«ã¨åŒæœŸã—ã¾ã™ã€‚ IcingaWeb2ãƒ•ã‚£ãƒ«ã‚¿ã®æ§‹æ–‡ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚例: %såŒæœŸãƒ—ãƒ­ãƒ‘ãƒ†ã‚£åŒæœŸãƒ«ãƒ¼ãƒ«åŒæœŸãƒ«ãƒ¼ãƒ«: %såŒæœŸãŒå¤±æ•—ã—ã¾ã—ãŸã€‚åŒæœŸãƒ«ãƒ¼ãƒ«åŒæœŸè¡¨å¯¾è±¡DB対象サービスセット対象データタイプ対象プロパティテンプレートテンプレートåテンプレート: %sテンプレート「インãƒãƒ¼ãƒˆã€ã‚¸ãƒ§ãƒ–ã¯å®šæœŸçš„ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã™ã‚‹ã“ã¨ã‚’å¯èƒ½ã«ã—ã¾ã™ã€ŒåŒæœŸã€ã‚¸ãƒ§ãƒ–を使用ã™ã‚‹ã¨ã€å®šæœŸçš„ã«åŒæœŸã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã§ãã¾ã™ã€‚%s ã¯æ­£å¸¸ã«ä¿å­˜ã•れã¾ã—ãŸæ§‹æˆã‚¸ãƒ§ãƒ–を使用ã™ã‚‹ã¨ã€Icinga 2æ§‹æˆã‚’生æˆã—ã¦è¨­å®šã®å映をã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ユーザーã®Eメールアドレス。ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングジョブã¯ã€Directorデータベースを高速ã‹ã¤ã‚¯ãƒªãƒ¼ãƒ³ã«ä¿ã¤ãŸã‚ã®ã•ã¾ã–ã¾ãªã‚¿ã‚¹ã‚¯ã‚’æä¾›ã—ã¾ã™ã€‚Icinga Director セルフサービス APIを使用ã™ã‚‹ã¨ã€ãƒ›ã‚¹ãƒˆã¯è‡ªåˆ†è‡ªèº«ã‚’登録ã§ãã¾ã™ã€‚ ã“れã«ã‚ˆã‚Šã€Icinga Agentを自動化ã•ã‚ŒãŸæ–¹æ³•ã§è¨­å®šã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã€ã‚¢ãƒƒãƒ—グレードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚DirectorãŒãã®è¨­å®šã‚’åæ˜ ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹Icingaパッケージå。 ã“れã¯ãƒ‡ãƒ•ォルト㧠"director"ã«è¨­å®šã•れã¦ã„ã‚‹ã®ã§ã€åˆ†ã‹ã‚‰ãªã‘れã°å¤‰æ›´ã—ãªã„ã§ãã ã•ã„。å–å¾—ã™ã‚‹å¿…è¦ãŒã‚ã‚‹LDAPプロパティ。ã“れã¯ã€"cn, dnshostname, operatingsystem, sAMAccountName"ã®ã‚ˆã†ã«ã‚³ãƒ³ãƒžåŒºåˆ‡ã‚Šã®ãƒªã‚¹ãƒˆã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚%sã®ã‚»ãƒ«ãƒ•サービスAPIキーを削除ã—ã¾ã—ãŸã€‚サービスセット"%s"ã‚’%d 個ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã—ãŸã€‚引数%sã¯æ­£å¸¸ã«ä¿å­˜ã•れã¾ã—ãŸè¡¨ç¤ºã•れるキャプションã“ã®ãƒ•ィールドãŒè¡¨ç¤ºã•れãŸã¨ãã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è¡¨ç¤ºã•れるキャプションå­ãƒ›ã‚¹ãƒˆIcingaãŒå®Ÿè¡Œã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã§ã™ã€‚ çµ¶å¯¾ãƒ‘ã‚¹ã¯æŒ‡å®šã©ãŠã‚Šã«å—ã‘入れられã€ç›¸å¯¾ãƒ‘スã®å…ˆé ­ã«ã¯ "PluginDir +"ãŒä»˜ãã¾ã™ã€‚åŒæ§˜ã®å®šæ•°ãƒ—レフィックスãŒè¨±å¯ã•れã¾ã™ã€‚ スペースã¯ã€ã‚³ãƒžãƒ³ãƒ‰ãƒ‘スã¨ã‚¹ã‚¿ãƒ³ãƒ‰ã‚¢ãƒ­ãƒ³å¼•æ•°ã®åˆ†é›¢ã«ã¤ãªãŒã‚Šã¾ã™ã€‚ ã“れã¯ã€ç¾æ™‚点ã§ã¯ãƒ—ラグインåã¨ãƒ‘スã§ã‚¹ãƒšãƒ¼ã‚¹ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ãªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚対応ã™ã‚‹ãƒ‘スワード削除ã—ãŸã„ãƒ‰ãƒ¡ã‚¤ãƒ³åæœ€åˆï¼ˆä¸€ç•ªå·¦ï¼‰ã®CN最åˆï¼ˆä¸€ç•ªå·¦ï¼‰ã®OUプロパティãŒ"%s" ã«ä¿å­˜ã•れã¾ã—ãŸã€‚通知をå—ã‘å–るホスト/サービスã®çŠ¶æ…‹æœ€å¾Œï¼ˆä¸€ç•ªå³ï¼‰ã®OU最後ã®è©¦è¡Œã¯%sã§å¤±æ•—ã—ã¾ã—ãŸï¼š%s最後ã®è©¦è¡Œã¯%sã§æˆåŠŸã—ã¾ã—ãŸæœ€å¾Œã®è¨­å®šåæ˜ ã¯æˆåŠŸã—ã¾ã›ã‚“ã§ã—ãŸæœ€å¾Œã®è¨­å®šå映ã¯ä¿ç•™ã«ãªã£ã¦ã„ã¾ã™ã€‚接続ãŒå¤±ã‚れãŸå ´åˆã®ã€ç›£è¦–ログã®ä¿å­˜ç§’æ•°ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¸ã®é€šçŸ¥ã‚’ã„ã¤ãƒˆãƒªã‚¬ãƒ¼ã™ã‚‹ã‹ã‚’決定ã™ã‚‹æœŸé–“ã®åå‰ã€‚デフォルトã§ã¯è¨­å®šã•れã¦ã„ã¾ã›ã‚“。ã“ã®é€šçŸ¥ã‚’ã„ã¤ãƒˆãƒªã‚¬ãƒ¼ã™ã‚‹ã‹ã‚’決定ã™ã‚‹æœŸé–“ã®åå‰ã€‚ デフォルトã§ã¯è¨­å®šã•れã¦ã„ã¾ã›ã‚“。監視を実行ã™ã‚‹æœŸé–“ã®è¨­å®šã€‚デフォルトã§ã¯æœŸé–“ã¯ç„¡åˆ¶é™ã§ã™ã€‚有効ãªã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«è¨­å®šã‚’指定ã—ã¦ãã ã•ã„。曜日ã¨è¤‡æ•°ã®å®Ÿè¡Œæ™‚間定義ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚ホストã®å称サービスã®å称通知間隔(秒)。ã“ã®é–“éš”ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–通知ã«ä½¿ç”¨ã•れã¾ã™ã€‚ デフォルトã¯30分ã§ã™ã€‚ 0ã«è¨­å®šã™ã‚‹ã¨ã€å†é€šçŸ¥ã¯ç„¡åйã«ãªã‚Šã¾ã™ã€‚é©ç”¨ã—ãŸã„数値ビットマスク。 16進数ã¾ãŸã¯2進数ã®ãƒžã‚¹ã‚¯ãŒã‚ã‚‹å ´åˆã¯ã€ã¾ãšãれを10進数ã«å¤‰æ›ã—ã¦ãã ã•ã„。 ã“ã®ãƒ—ロパティ変æ›ãƒ«ãƒ¼ãƒ«ã®çµæžœã¯ãƒ–ール値ã§ã€ä¸Žãˆã‚‰ã‚ŒãŸãƒžã‚¹ã‚¯ãŒã‚½ãƒ¼ã‚¹ã‚«ãƒ©ãƒ ã®æ•°å€¤ã«é©ç”¨ã•れるã‹ã©ã†ã‹ã‚’示ã—ã¾ã™ã€‚ユーザã®å°åž‹ç„¡ç·šæ©Ÿã®ã‚¢ãƒ‰ãƒ¬ã‚¹è¦ªãƒ›ã‚¹ãƒˆæ¤œç´¢ã—ãŸã„パターン。ã“れã¯/^www\d+\./ã®ã‚ˆã†ãªæ­£è¦è¡¨ç¾ã«ãªã‚Šã¾ã™ã€‚エンドãƒã‚¤ãƒ³ãƒˆã®ãƒãƒ¼ãƒˆä½¿ç”¨ã—よã†ã¨ã—ã¦ã„ã‚‹ãƒãƒ¼ãƒˆã€‚ 何も設定ã•れã¦ã„ãªã„å ´åˆã¯ã€ãƒ‡ãƒ•ォルトã®ãƒãƒ¼ãƒˆ5665ãŒä½¿ç”¨ã•れã¾ã™ã€‚サービス "%s" ㌠%d 個ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ ã•れã¾ã—ãŸå‰²ã‚Šå½“ã¦ã‚‹ã¹ãサービスセットã“ã®ãƒ›ã‚¹ãƒˆã«å‰²ã‚Šå½“ã¦ã‚‹ã¹ãサービスセット通知をå—ã‘å–る状態é·ç§»ã®ç¨®é¡žç½®ãæ›ãˆã«ä½¿ç”¨ã•れる文字列検索ã—ãŸã„文字列検索ã—ãŸã„文字列/パターン。 é¸æŠžã—ãŸæ–¹æ³•ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ãŒã€ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ã®ä¸€è‡´ã«ã¯ www.* ã¾ãŸã¯ *linux* を使用ã—ã€æ­£è¦è¡¨ç¾ã‚’é¸æŠžã—ãŸå ´åˆã¯/^www\d+\./ã®ã‚ˆã†ãªè¡¨ç¾ã‚’使用ã—ã¦ãã ã•ã„。フィールドã®åå‰ã€‚一æ„ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã“ã®åå‰ã¯ãƒ›ã‚¹ãƒˆã‚„サービス等ã®icingaã®è¨­å®šã§å®šç¾©ã™ã‚‹ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã®åå‰ã«ãªã‚Šã¾ã™ã€‚Windows上ã§Icinga 2サービスを実行ã™ã‚‹å¿…è¦ãŒã‚るユーザー。%d個ã®ã‚ªãƒ–ジェクトãŒé–¢é€£ãƒ—ロパティをæŒã£ã¦ã„ã¾ã™ã€‚ãれらã®ã‚ªãƒ–ジェクトã‹ã‚‰ã‚‚"%s"プロパティを削除ã—ã¾ã™ã‹ï¼Ÿ %d個ã®ã‚ªãƒ–ジェクトãŒé–¢é€£ãƒ—ロパティをæŒã£ã¦ã„ã¾ã™ã€‚ ãれらã®ã‚ªãƒ–ジェクトã®"%s"プロパティã®åå‰ã‚‚"%s "ã«å¤‰æ›´ã—ã¾ã™ã‹ï¼Ÿ%d 個ã®ä¿ç•™ã•れãŸå¤‰æ›´ãŒã‚りã¾ã™ã€‚%d 個ã®ä¿ç•™ã•れãŸå¤‰æ›´ãŒã‚りã¾ã™ã€‚ãれらã®ã†ã¡ã€%d 個ãŒã“ã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚%d 個ã®ä¿ç•™ã•れãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç§»è¡ŒãŒã‚りã¾ã™ã€‚利用å¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ•ィールドãŒã‚りã¾ã›ã‚“。作æˆã™ã‚‹ã‚ˆã†ã«ç®¡ç†è€…ã«ä¾é ¼ã—ã¦ãã ã•ã„。ä¿ç•™ä¸­ã®å¤‰æ›´ã¯ã‚りã¾ã›ã‚“è¨­å®šã‚’åæ˜ ã™ã‚‹(ä¿ç•™ä¸­ã®å¤‰æ›´ã¯ã‚りã¾ã›ã‚“。)ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã«ã¯ä¿ç•™ä¸­ã®å¤‰æ›´ãŒã‚りã¾ã™ã€‚æ–°ã—ã„インãƒãƒ¼ãƒˆå‡¦ç†ã‚’トリガã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã«ã¯ä¿ç•™ä¸­ã®å¤‰æ›´ãŒã‚りã¾ã™ã€‚ æ–°ã—ã„åŒæœŸå‡¦ç†ã‚’トリガã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ä¿ç•™ä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç§»è¡ŒãŒã‚りã¾ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトã«ã¯1ã¤ã®å¤‰æ›´ãŒã‚りã€ä»–ã®å¤‰æ›´ã¯ã‚りã¾ã›ã‚“。ã“ã®ã‚ªãƒ–ジェクトã«ã¯%d個ã®å¤‰æ›´ãŒã‚りã€ä»–ã®å¤‰æ›´ã¯ã‚りã¾ã›ã‚“。ä¿ç•™ä¸­ã®å¤‰æ›´ãŒ1ã¤ã‚りã¾ã™ã€‚様々ãªåˆ©ç”¨å¯èƒ½ãªã‚¸ãƒ§ãƒ–タイプãŒã‚りã¾ã™ã€‚ã•ã¾ã–ã¾ãªã‚½ãƒ¼ã‚¹ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚‹ã•ã¾ã–ã¾ãªãƒ‡ãƒ¼ã‚¿ãƒ—ロãƒã‚¤ãƒ€ã€‚ãªãŠã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯Directorã®ãƒ•ックã¨ã—ã¦å®Ÿè£…ã•れã¦ã„ã‚‹ã®ã§ã€Icinga Web 2モジュールãŒå¿…è¦ãªå ´æ‰€ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã—ã¦ã„る(ã¾ãŸã¯è‡ªåˆ†ã§ä½œæˆã—ãŸï¼‰å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ç¾åœ¨%s ã«ã‚ˆã£ã¦ä½¿ç”¨ã•れã¦ã„ã¾ã™ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ç¾åœ¨ä½¿ç”¨ã•れã¦ã„ã¾ã›ã‚“ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã¾ã ã»ã‹ã® %d 個ã®ã‚ªãƒ–ジェクトã«ä½¿ç”¨ã•れã¦ã„ã¾ã™ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯ %s ã«è¡Œã‚れãŸç›£è¦–ã§å¤±æ•—ã—ã¾ã—ãŸ: %s ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯ç„¡åйãªçŠ¶æ…‹ã§ã™: %sã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯å¤‰æ›´ã•れãŸãƒ‡ãƒ¼ã‚¿ã‚’æä¾›ã—ã¾ã™ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯æœ€å¾Œã«%sã«åŒæœŸã—ã¦ã„ã‚‹ã“ã¨ãŒã‚ã‹ã‚Šã¾ã—ãŸã“ã®ã‚µãƒ¼ãƒ“スã¯ã“ã®ãƒ›ã‚¹ãƒˆã§ãƒ–ラックリストã«ç™»éŒ²ã•れã¦ã„ã¾ã™ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã¯ã€æœ€å¾Œã« %s ã«ç›£è¦–ã•れãŸã¨ãã«å¤±æ•—ã—ã¾ã—ãŸ: %sã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã¯ä¸€åº¦ã‚‚実行ã•れãŸã“ã¨ãŒã‚りã¾ã›ã‚“。ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã¯ã€%sã®åŒæœŸã§æœ€å¾Œã«è¦‹ã¤ã‹ã£ãŸã‚‚ã®ã§ã™ã€‚指定ã•れãŸå…ƒã®è¡¨ç¾å†…ã®ç‰¹å®šã®éƒ¨åˆ†ã‚’フィルタリングã§ãã¾ã™ã€‚ インãƒãƒ¼ãƒˆã•れãŸã™ã¹ã¦ã®ã‚«ãƒ©ãƒ ã‚’å‚ç…§ã™ã‚‹ã“ã¨ãŒè¨±å¯ã•れã¦ã„ã¾ã™ã€‚ 例)「host=www*〠ã¯ã€"www"ã§å§‹ã¾ã‚‹ãƒ›ã‚¹ãƒˆãƒ—ロパティã§ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸè¡Œã«å¯¾ã—ã¦ã®ã¿ã“ã®ãƒ—ロパティを設定ã—ã¾ã™ã€‚ 複雑ãªä¾‹ï¼šhost=www*&!(address=127.*|address6=::1)ã“れã«ã‚ˆã‚Šã€ã“ã®ã‚¸ãƒ§ãƒ–を一時的ã«ç„¡åйã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã“れã«ã‚ˆã‚Šã€æ¡ä»¶ãƒ•ィルタを設定ã§ãã¾ã™ã€‚ 入れå­ã«ã—ãŸæ¼”ç®—å­ã‚’自由ã«çµ„ã¿åˆã‚ã›ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€æ¡ä»¶ãƒ•ィルタを設定ã§ãã¾ã™ã€‚ 入れå­ã«ã—ãŸæ¼”ç®—å­ã‚’自由ã«çµ„ã¿åˆã‚ã›ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ã“れをスキップã—ã¦å¾Œã§å®šç¾©ã—ãŸã‚Šã€ã“ã®ã‚µãƒ¼ãƒ“スセットをå˜ä¸€ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ ã—ãŸã‚Šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€å¤‰æ›´ã—ãŸè¨­å®šã‚’ã™ãã«å映ã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€"%s" ã®ãƒ—ロパティを編集ã§ãã¾ã™ã“れã«ã‚ˆã‚Šã€é¸æŠžã—ãŸã™ã¹ã¦ã®ãƒ›ã‚¹ãƒˆã®ãƒ—ロパティを一括ã§ç·¨é›†ã§ãã¾ã™ã“ã®ãƒã‚¹ã‚±ãƒƒãƒˆã¯ç©ºã§ã™MySQLã¾ãŸã¯PostgreSQLデータベースã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“ã“ã®ãƒ›ã‚¹ãƒˆã¯Icinga Director セルフサービス APIを介ã—ã¦ç™»éŒ²ã•れã¦ã„ã¾ã™ã€‚ホストをå†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ãŸå ´åˆã‚„ã€ä½•らã‹ã®ç†ç”±ã§ãã®ç§˜å¯†éµã‚’失ã£ãŸå ´åˆã€ç¾åœ¨ã®éµã‚’消ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€åŒã˜ãƒ›ã‚¹ãƒˆã‚’å†åº¦ç™»éŒ²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã‚Œã¯æŠ½è±¡ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆåž‹ã§ã™ã€‚ã“れã¯%sã®ã€Œ%sã€ãƒ†ãƒ³ãƒ—レートã§ã™ã€‚テンプレートを利用ã—ã¦æ¬¡ã®ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã¯ã€ApiListenerオブジェクト用ã«ä½œæˆã—ãŸã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã‚ªãƒ–ジェクトã®åå‰ï¼ˆãŠã‚ˆã³è¨¼æ˜Žæ›¸ã®åå‰ï¼‰ã§ã™ã€‚ ã“れãŒä½•ã‚’æ„味ã™ã‚‹ã®ã‹ã‚ˆãã‚ã‹ã‚‰ãªã„å ´åˆã¯ã€å¿…ãšæœ€åˆã«ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’読むよã†ã«ã—ã¦ãã ã•ã„。監視対象ã«ã™ã‚‹ã™ã¹ã¦ã®ã‚µãƒ¼ãƒãƒ¼ã€ã‚³ãƒ³ãƒ†ãƒŠãƒ¼ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã€ã¾ãŸã¯ã‚»ãƒ³ã‚µãƒ¼ãƒ‡ãƒã‚¤ã‚¹ãªã©ã‚’追加ã§ãã¾ã™Icinga 2ホスト監視を管ç†ã—ã¾ã™ã€‚ホストテンプレートã¯ä¸»ãªæ§‹æˆè¦ç´ ã§ã™ã€‚ 事å‰ã«è¨­å®šã—ãŸè¤‡æ•°ã®ãƒ†ãƒ³ãƒ—レートを組ã¿åˆã‚ã›ã¦ã€Œãƒãƒ§ã‚¤ã‚¹ã€ã‚’作æˆã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒãƒãƒ§ã‚¤ã‚¹ã«ã«å¾“ã£ã¦è¨­å®šã§ã§ãるよã†ã«ã™ã‚‹ï¼ˆã¾ãŸã¯å¼·åˆ¶ã™ã‚‹ï¼‰ã“ã¨ãŒã§ãã¾ã™ã€‚Icinga 2 サービス監視設定を管ç†ã—ã¾ã™ã€‚ サービステンプレートã¯ã€ã‚µãƒ¼ãƒ“ス監視設定ã®åŸºæœ¬çš„ãªæ§‹æˆè¦ç´ ã§ã™ã€‚サービスセットを使用ã™ã‚‹ã¨ã€ä¸€åº¦ã«è¤‡æ•°ã®ã‚µãƒ¼ãƒ“ス監視設定をã¾ã¨ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’使用ã™ã‚‹ã¨ã€ãƒ›ã‚¹ãƒˆè¨­å®šã‚’æ¡ä»¶ã«ã—ã¦ã€ã‚µãƒ¼ãƒ“ス監視設定を動的ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ãã—ã¦ã€ã™ã¹ã¦ã®è¤‡æ•°ã®ã‚µãƒ¼ãƒ“スオブジェクを一度ã«å¤‰æ›´ï¼ˆã¾ãŸã¯å‰Šé™¤ï¼‰ã§ãã¾ã™ã€‚Icinga 2 User(コンタクト)オブジェクトを管ç†ã—ã¾ã™ã€‚ テンプレートã«è¤‡é›‘ã•を加ãˆã‚‹ã ã‘ã§ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ªãƒ–ジェクトを維æŒã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。 ユーザーをグループã«ã¾ã¨ã‚ã€ãれらã«åŸºã¥ã„ã¦é€šçŸ¥ã‚’作æˆã—ã¾ã™ã€‚ MS Active Directoryã¾ãŸã¯LDAPãªã©ã®ä»–ã®ä¸­å¤®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’実行ã—ã¦ã„ã¾ã™ã‹ï¼Ÿè¨­å®šã‚’手動ã§ã„ã˜ã‚‹ã®ã‚’é¿ã‘ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚„関連ã™ã‚‹åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’使ã£ã¦ã™ã¹ã¦ã®ã“ã¨ã‚’自動化ã—ã¦ã¿ã¦ãã ã•ã„。Icinga 2インフラストラクãƒãƒ£ã‚’管ç†ã—ã¾ã™ã€‚ æ–°ã—ã„Icinga Masterã¾ãŸã¯ã‚µãƒ†ãƒ©ã‚¤ãƒˆã‚’追加ã™ã‚‹ã¨ãã¯ã€ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‚’ã‚‚ã†ä¸€åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„。 手動ã§Zoneã¾ãŸã¯Endpointオブジェクトを作æˆã—ãŸã„ã¨ãã¯ã€ã‚ˆã考ãˆã¦ãã ã•ã„。 手動ã§ã®ä½œæˆã¯é–“é•ã£ãŸæ–¹æ³•ã§ã‚りã€ãã®å¾Œã®æ··ä¹±ã‚’æ‹›ãæã‚ŒãŒã‚りã¾ã™ã€‚ã“れã¯è¨­å®šãƒžã‚¹ã‚¿ã§ã€è¨­å®šæƒ…報をå—ä¿¡ã—ã¾ã™ã€‚ã“ã®ã‚¸ãƒ§ãƒ–ã¯ä¸€åº¦ã‚‚実行ã•れã¦ã„ã¾ã›ã‚“ã“ã®ã‚¸ãƒ§ãƒ–㯠%d ç§’ã”ã¨ã«å®Ÿè¡Œã•れã€ç¾åœ¨ã¯ä¿ç•™ã•れã¦ã„ã¾ã™ã€‚ã“ã®ã‚¸ãƒ§ãƒ–㯠%d ç§’ã”ã¨ã«å®Ÿè¡Œã•れã¾ã™ã“ã®ã‚¸ãƒ§ãƒ–㯠%d ç§’ã”ã¨ã«å®Ÿè¡Œã•れã¾ã™ã€‚無効ã«ãªã£ã¦ã„ã‚‹ãŸã‚ã€ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã©ãŠã‚Šã«å®Ÿè¡Œã•れã¾ã›ã‚“ã“ã®ãƒ—ロパティ変æ›ãƒ«ãƒ¼ãƒ«ã¯ã€0ã€"0"ã€falseã€"false"ã€"n"ã€"no"ã‚’ false ã«ã€1ã€"1"ã€trueã€"true"ã€"y"ã€"yes"ã‚’trueã«å¤‰æ›ã—ã¾ã™ã€‚ 大文字ã¨å°æ–‡å­—を区別ã—ã¾ã›ã‚“。 与ãˆã‚‰ã‚ŒãŸå€¤ãŒãれらã®ã©ã‚Œã¨ã‚‚一致ã—ãªã„å ´åˆã«ã€ã©ã†å‡¦ç†ã•ã›ã‚‹ã‹ã‚’ã€ã“ã®ã‚»ãƒ¬ã‚¯ãƒˆãƒœãƒƒã‚¯ã‚¹ã§æŒ‡å®šã—ã¾ã™ã€‚ null値を返ã™ã“ã¨ã‚‚ã€ãƒ‡ãƒ•ォルトをfalseã¾ãŸã¯trueã«ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ ã¾ãŸã€ç„¡åйãªã‚½ãƒ¼ã‚¹ãƒ‡ãƒ¼ã‚¿ã¨ã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆãƒ—ロセス全体を中断ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“れã¯ã€ãƒ›ã‚¹ãƒˆåãªã©ã®ä¸€æ„ã®å€¤ã‚’å«ã‚€åˆ—ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ç‰¹ã«æŒ‡å®šã®ãªã„é™ã‚Šã€ã“れã¯åŒæœŸåŒ–ã•れãŸIcingaオブジェクトã®object_nameã¨ã—ã¦ä½¿ç”¨ã•れã¾ã™ã€‚ 特ã«directorã‚’å§‹ã‚ã‚‹ã¨ãã¯ã€å¿…ãšã“ã®è¦å‰‡ã«å޳坆ã«å¾“ã£ã¦ãã ã•ã„。ã“ã®åˆ—ã®å€¤ãŒç•°ãªã‚‹è¡Œã«é‡è¤‡ã—ã¦ã„ã‚‹ã¨å¤±æ•—ã—ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã¯æˆåŠŸã—ã¾ã›ã‚“。 "purge"ã¯host!nameã«å¯¾å¿œã™ã‚‹key_columnã§ã®ã¿æ­£ã—ãæ©Ÿèƒ½ã™ã‚‹ã®ã§ã€ã‚µãƒ¼ãƒ“ã‚¹ã‚’åŒæœŸã™ã‚‹ã¨ãã¯æ³¨æ„ã—ã¦ãã ã•ã„。 データソースãŒãã®ã‚ˆã†ãªãƒ•ィールドをæä¾›ã§ããªã„å ´åˆã¯ã€"Combine"プロパティ変æ›ãƒ«ãƒ¼ãƒ«ã‚’確èªã—ã¦ãã ã•ã„。ã“れã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®ã‚«ãƒ©ãƒ ï¼ˆãƒ—ロパティ)ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã“ã®ã‚ªãƒ–ジェクトã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ã€‚ã“ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã¯æœ‰åŠ¹åŒ–ã•れã¦ã„ã¾ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã‚‹ãŸã‚設定ãŒå映ã•れã¾ã›ã‚“。ã“ã®ãƒ‘ターンãŒè©•価ã•れã€ãれã«å¿œã˜ã¦ ${some_column} ã®ã‚ˆã†ãªå¤‰æ•°ãŒåŸ‹ã‚られã¾ã™ã€‚ 典型的ãªãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã¯ ${host}!${service}ã§ãƒ¦ãƒ‹ãƒ¼ã‚¯ãªã‚µãƒ¼ãƒ“ス識別å­ã‚’生æˆã™ã‚‹ã“ã¨ã§ã™ã€‚ é¸æŠžã•れãŸã€Œãƒ—ロパティã€ã¯ã“ã“ã§ã¯åŠ¹æžœãŒãªãã€ç„¡è¦–ã•れã¾ã™ã€‚ã“れã«ã¯ã€Icinga Agentをインストールã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ 証明書を生æˆã—ã¦ç½²åã—ã€ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’ãã®è¦ªã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã®æœ€å°é™ã®icinga2.confも生æˆã—ã¾ã™ã€‚ã“ã®ã‚µãƒ¼ãƒ“ス㯠%s サービスセットã«å±žã—ã¦ã„ã¾ã™ã€‚ãれã§ã‚‚ã€ã“ã®ãƒ›ã‚¹ãƒˆã«å¯¾ã—ã¦ã®ã¿æ¬¡ã®ãƒ—ロパティを上書ãã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ã“ã®ã‚µãƒ¼ãƒ“スã¯ã‚µãƒ¼ãƒ“スセット "%s" ã«å±žã—ã¦ã„ã¾ã™ã€‚ ãれã§ã‚‚ã€ã“ã®ãƒ›ã‚¹ãƒˆã«å¯¾ã—ã¦ã®ã¿æ¬¡ã®ãƒ—ロパティを変更ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ã“ã®ã‚µãƒ¼ãƒ“スã¯è‡ªå‹•化ã•ã‚ŒãŸæ–¹æ³•ã§ç”Ÿæˆã•れã¦ã„ã¾ã™ãŒã€ãれã§ã‚‚次ã®ãƒ—ãƒ­ãƒ‘ãƒ†ã‚£ã‚’å®‰å…¨ãªæ–¹æ³•ã«ä¸Šæ›¸ãã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ã‚µãƒ¼ãƒ“スã¯%sé©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’使用ã—ã¦ç”Ÿæˆã•れã¾ã—ãŸã€‚ã“ã®ã‚µãƒ¼ãƒ“スã¯%sã‹ã‚‰ç¶™æ‰¿ã•れã¾ã—ãŸã€‚ ãれã§ã‚‚ã€ã“ã®ãƒ›ã‚¹ãƒˆã«å¯¾ã—ã¦ã®ã¿æ¬¡ã®ãƒ—ロパティを変更ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ã“ã®ã‚»ãƒƒãƒˆã¯%sã‹ã‚‰ç¶™æ‰¿ã•れã¾ã—ãŸIcinga Director ã‚’ Icinga 2 インフラストラクãƒãƒ£ã«åŒæœŸã—ã¾ã™ã€‚インフラストラクãƒãƒ£ã®å¤‰æ›´æ™‚ã«æ–°ã—ã„実行ãŒãƒˆãƒªã‚¬ã•れるã¯ãšã§ã™ã“ã®ãƒ†ãƒ³ãƒ—レートã¯ä½¿ç”¨ã•れã¦ã„ã¾ã›ã‚“ã“ã®ãƒ†ãƒ³ãƒ—レート㯠%d 個ã®ã»ã‹ã®ã‚ªãƒ–ジェクトã«åˆ©ç”¨ã•れã¦ã„ã¾ã™ã€‚与ãˆã‚‰ã‚ŒãŸé¸æŠžè‚¢ã«å¯¾ã™ã‚‹ãƒ©ãƒ™ãƒ«ã‚’示ã—ã¾ã™ã“ã®é …ç›®ã«å…¥åŠ›ã—ãŸåå‰ãŒãƒ¦ãƒ¼ã‚¶ã«è¦‹ãˆã‚‹ãƒ©ãƒ™ãƒ«ã«ãªã‚Šã¾ã™ã“れã¯ä»¥å‰ã®ã‚­ãƒ¼ã‚’無効ã«ã—ã¾ã™ãƒã‚±ãƒƒãƒˆã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã®æœŸé–“スケジュールスケジュールスケジュールタイムアウトスケジュールスケジュールテンプレートスケジュールスケジュールタイムスタンプダウンロードã—ãŸãƒ‘ッケージãŒIcingaãƒãƒ¼ãƒ ã«ã‚ˆã£ã¦æ§‹ç¯‰ã•れã€ç¬¬ä¸‰è€…ã«ã‚ˆã£ã¦ä¾µå®³ã•れãªã„よã†ã«ã™ã‚‹ãŸã‚ã«ã€ã“ã“ã§SHA1ãƒãƒƒã‚·ãƒ¥ã®é…列をæä¾›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ãƒãƒƒã‚·ãƒ¥ã‚’定義ã—ãŸå ´åˆã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸMSIパッケージã®SHA1ãƒãƒƒã‚·ãƒ¥ãŒã“ã®è¨­å®šã§æä¾›ã•れã¦ã„ã‚‹ãƒãƒƒã‚·ãƒ¥ã®1ã¤ã¨ä¸€è‡´ã—ãªã„å ´åˆã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®æ›´æ–°/インストールを続行ã—ã¾ã›ã‚“。トップダウンåˆè¨ˆãƒ›ã‚¹ãƒˆåを変æ›å°æ–‡å­—ã«å¤‰æ›å¤§æ–‡å­—ã«å¤‰æ›çŠ¶æ…‹é·ç§»ã‚¿ã‚¤ãƒ—ツリーインãƒãƒ¼ãƒˆå®Ÿè¡Œã‚’トリガã“ã®åŒæœŸã‚’トリガã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®ãƒˆãƒªã‚¬ã«å¤±æ•—ã—ã¾ã—ãŸã‚°ãƒ­ãƒ¼ãƒãƒ«ãªdirector設定を調整ã—ã¾ã™ã‚¿ã‚¤ãƒ—タイプ属性データをå–å¾—ã§ãã¾ã›ã‚“: %s権é™ãŒä¸å分ãªãŸã‚ã€æŒ‡å®šã•れãŸãƒ—ロパティã§ãƒ›ã‚¹ãƒˆã‚’ä¿å­˜ã§ãã¾ã›ã‚“設定を"%s"ã«ä¿å­˜ã§ãã¾ã›ã‚“。 ファイルã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’確èªã™ã‚‹ã‹ã€ä»¥ä¸‹ã«ç¤ºã™å†…容を手動ã§ä¿å­˜ã—ã¦ãã ã•ã„ã€‚æœªåæ˜ ã®è¨­å®šUnknown (䏿˜Ž)䏿˜Žã€é–¢é€£æƒ…å ±ã®åŽé›†ã«å¤±æ•—ã—ã¾ã—ãŸä¸æ˜Žã€ã¾ã è¨­å®šã®æ¤œæŸ»ã®çµæžœã‚’å¾…ã£ã¦ã„ã¾ã™ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸãƒ—ロパティをリンク解除ã—ã¾ã—ãŸã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸè¡Œã‚»ãƒƒãƒˆã‚’リンク解除ã—ã¾ã—ãŸã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸè¡Œã‚’リンク解除ã—ã¾ã—ãŸæœªè§£æ±ºã®ä¾å­˜é–¢ä¿‚使用ã•れã¦ã„ãªã„設定ファイルUp (èµ·å‹•)アップデート方法アップデートãƒãƒªã‚·ãƒ¼ã‚¢ãƒƒãƒ—ロードãƒã‚¹ã‚±ãƒƒãƒˆã‚’アップロード構æˆãƒã‚¹ã‚±ãƒƒãƒˆã‚’アップロード使用状æ³ä½¿ç”¨çжæ³(%s)ローカルファイルã¾ãŸã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å…±æœ‰ã‚’使用最åˆã«å°æ–‡å­—を使用ソースを使用ユーザユーザグループユーザテンプレートユーザグループã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ç›´æŽ¥å‰²ã‚Šå½“ã¦ã‚‹å¿…è¦ãŒã‚るユーザーグループ。 グループã¯ã•ã¾ã–ã¾ãªç†ç”±ã§å½¹ã«ç«‹ã¡ã¾ã™ã€‚ å˜ä¸€ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã¯ãªãグループã«é€šçŸ¥ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚通知先ã®ãƒ¦ãƒ¼ã‚¶ã‚°ãƒ«ãƒ¼ãƒ—ユーザプロパティユーザテンプレートåユーザグループユーザグループユーザグループユーザåユーザユーザ / コンタクトã“ã®é€šçŸ¥ã«ã‚ˆã£ã¦é€šçŸ¥ã•れるã¹ãユーザé©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’使用ã™ã‚‹ã¨ã€ã‚µãƒ¼ãƒ“スã¯ã€ãれらã®ãƒ—ロパティã®ä»»æ„ã®çµ„ã¿åˆã‚ã›ã‚’処ç†ã™ã‚‹ãƒ•ィルタã«åŸºã¥ã„ã¦ã€ä¸€åº¦ã«è¤‡æ•°ã®ãƒ›ã‚¹ãƒˆã«é©ç”¨ã§ãã¾ã™ã€‚通常ã¯ãƒ›ã‚¹ãƒˆã®ãƒ¡ã‚¤ãƒ³ã®IPv6アドレス値値ã®ã‚¿ã‚¤ãƒ—å¤‰æ•°å€¤å¤‰æ•°åæ®ç™ºæ€§ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã§ã¯ã€ç›£è¦–や通知を実施ã™ã‚‹ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’定義ã§ãã¾ã™ã€‚例ãˆã°ã€é€šçŸ¥ã®è¨­å®šã¨çµ„ã¿åˆã‚ã›ã¦ã€å–¶æ¥­æ™‚間内ã¨å–¶æ¥­æ™‚間外ã§é€šçŸ¥ã™ã‚‹å…ˆã‚’変更ã™ã‚‹ã¨ã„ã†ã‚ˆã†ã«å®šç¾©ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚Warning (警告)テンプレートã¯ã‚らゆるプロパティã®è¨­å®šã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚テンプレートã¯ã€æœ€çµ‚çš„ãªä½œã‚‰ã‚Œã‚‹è¨­å®šæƒ…å ±ã®ãŸã‚ã®ãƒ‘ーツã§ã™ã€‚ 外部オブジェクト(Directorã®ç®¡è½„外ã®è¨­å®š)ã¯ã€æœ€ä½Žé™ã«ã¨ã©ã‚ã¦ã€è¿½åŠ ãƒ»å¤‰æ›´ã—ãªã„ã§ãã ã•ã„。 外部オブジェクトã¨Directorã§ã®è¨­å®šã‚’併用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。é©ç”¨ãƒ«ãƒ¼ãƒ«ã«ã‚ˆã‚Šã€ã‚µãƒ¼ãƒ“スã€é€šçŸ¥ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—ã‚’ä»–ã®ã‚ªãƒ–ジェクトã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚å‚照キーãŒãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆã«å­˜åœ¨ã—ãªã„å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚null値を返ã™ã€å¤‰æ›´ã•れã¦ã„ãªã„インãƒãƒ¼ãƒˆå€¤ã‚’ä¿æŒã™ã‚‹ã€ã¾ãŸã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆãƒ—ロセスを中断ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚与ãˆã‚‰ã‚ŒãŸæ–‡å­—列ãŒç©ºã®å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚çµæžœã®é…列ãŒç©ºã®å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚指定ã•れãŸè¦ç´ ãŒåˆ©ç”¨ã§ããªã„ã¨ãã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚一致ã™ã‚‹è¦ç´ ã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚ã“ã®ãƒ—ロパティãŒã€ãƒ•ィルタ表ç¾ãŒè¡Œã«ãƒžãƒƒãƒã—ãŸã¨ãã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚DNSå‚ç…§ãŒå¤±æ•—ã—ãŸå ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚目的ã®éƒ¨åˆ†ãŒå­˜åœ¨ã—ãªã„å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚ホスト(DNS)å‚ç…§ãŒå¤±æ•—ã—ãŸå ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚与ãˆã‚‰ã‚ŒãŸæ–‡å­—列をデコードã§ããªã„å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚DNã‹ã‚‰æŠœã出ã™å€¤ã‚’é¸æŠžã—ã¾ã™ã€‚æ–°ã—ã„スナップショットを作æˆã™ã‚‹ãŸã³ã«ã€ã“ã®ãƒã‚¹ã‚±ãƒƒãƒˆã«ä½•ã‚’é…ç½®ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹ï¼ŸIcinga 2 Agentã®ãƒ›ã‚¹ãƒˆåã«ä½•を使ã†ã‹è¨­å®šã‚’åæ˜ ã™ã‚‹ã¨ãã¯ã€æ¬¡ã®è¨­å®šå映を実行ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã‚’除ãã€å°‘ãªãã¨ã‚‚指定ã—ãŸç§’æ•°ã ã‘待機ã—ã¾ã™ã€‚空ã®ã¨ã利用ã§ããªã„ã¨ã最後ã®é€šçŸ¥ã‚’何分ã‚ã‚‹ã„ã¯ä½•時間後ã«é€ä¿¡ã™ã‚‹ã‹ã‚’時間ã§è¨­å®šã—ã¾ã™ã€‚設定ã—ãŸã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–を無効ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトã§ãƒ•ãƒ©ãƒƒãƒ—æ¤œå‡ºãŒæœ‰åйã«ãªã£ã¦ã„ã‚‹ã‹ç”Ÿæˆã‚’強制ã™ã‚‹ã¹ãã‹ã‚’é¸æŠžã—ã¾ã™ã€‚ é©ç”¨ã•れã¦ã„ãªã„å ´åˆã€ã“ã®ã‚¸ãƒ§ãƒ–ã¯æœ€å¾Œã«æ•´å½¢ã•れãŸè¨­å®šä»¥é™ã«ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティãŒã‚ã£ãŸå ´åˆã«ã®ã¿è¨­å®šã‚’冿•´å½¢ã—ã¾ã™ã€‚エージェントãŒè¨­å®šã®åŒæœŸã‚’å—ã‘入れるよã†ã«æ§‹æˆã•れã¦ã„ã‚‹ã‹ã‚’é¸æŠžã—ã¾ã™ã€‚å¼•æ•°å€¤ãŒæ–‡å­—列($host$ã®ã‚ˆã†ãªãƒžã‚¯ãƒ­ã‚’許ã™ï¼‰ã‹ã€ã‚ã‚‹ã„ã¯Icinga DSLラムダ関数({{...}}ã§å›²ã¾ã‚Œã‚‹ï¼‰ã‹ã‚’é¸æŠžã—ã¾ã™ã€‚ã“ã®ã‚µãƒ¼ãƒ“スã®checkコマンドをIcingaエージェントã§å®Ÿè¡Œã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚パラメータåã‚’ã‚³ãƒžãƒ³ãƒ‰ã«æ¸¡ã•ãªã„よã†ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ デフォルトã§ã¯ã€ãƒ‘ラメータå(ãŸã¨ãˆã°-H)ãŒè¿½åŠ ã•れるã®ã§ã€ã“れを明示的ã«ã€Œã„ã„ãˆã€ã«è¨­å®šã™ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“。親(マスター)ノードãŒã“ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã¸ã®æŽ¥ç¶šã‚’アクティブã«è©¦è¡Œã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚set_if ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãŒæ–‡å­—列($host$ã®ã‚ˆã†ãªãƒžã‚¯ãƒ­ã‚’許å¯ã™ã‚‹ï¼‰ã‹ã€ã‚ã‚‹ã„ã¯Icinga DSLラムダ関数({{...}}ã§å›²ã¾ã‚Œã‚‹ï¼‰ã‹é¸æŠžã—ã¾ã™ã€‚ã“ã®å¼•æ•°ãŒå¿…è¦ã‹é¸æŠžã—ã¾ã™ã€‚「ã¯ã„ã€ã‚’é¸æŠžã™ã‚‹ã¨ç›£è¦–ã®ä¸€æ™‚çš„ãªçŠ¶æ…‹ã‚’ä¿æŒã—ã¾ã›ã‚“。ã¤ã¾ã‚Šæœ€å¤§ç›£è¦–試行回数=1ã¨åŒç­‰ã®å‹•ãã‚’ã—ã¾ã™ã€‚ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトãŒãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚µãƒ¼ãƒ“スã«å½±éŸ¿ã‚’与ãˆã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ã“ã®ãƒ•ィールドãŒå¿…é ˆã‹é¸æŠžã—ã¾ã™ã€‚ã“ã®ãƒ›ã‚¹ãƒˆã«Icinga 2 AgentãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ã“ã®é€šçŸ¥ãŒãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚µãƒ¼ãƒ“スã«å½±éŸ¿ã‚’与ãˆã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚複数ã®å€¤ï¼ˆread:array)ãŒä¸Žãˆã‚‰ã‚ŒãŸã¨ãã«ã“ã®ãƒ‘ラメータを繰り返ã™ã¹ãã‹é¸æŠžã—ã¾ã™ã€‚ã“ã®ã‚¾ãƒ¼ãƒ³ã®ã‚¹ã‚³ãƒ¼ãƒ—をグローãƒãƒ«ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚グローãƒãƒ«ã‚¾ãƒ¼ãƒ³ã®åˆ†æ•£æ§‹æˆã¯æŽ¨å¥¨ã•れã¦ã„ã¾ã›ã‚“。ã“ã®ã‚ªãƒ–ジェクトã®ãƒ‘ãƒƒã‚·ãƒ–ç›£è¦–çµæžœã‚’å—ã‘入れるã‹ã“ã®ã‚ªãƒ–ジェクトをアクティブã«ç›£è¦–ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ホストåを調整ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトãŒå¤±æ•—ã—ãŸã¨ãã«ç›£è¦–を無効ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ デフォルトã¯ã€Œã„ã„ãˆã€ã§ã™ã€‚ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトãŒå¤±æ•—ã—ãŸã¨ãã«é€šçŸ¥ã‚’無効ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚デフォルトã¯ã€Œã¯ã„ã€ã§ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトã®ã‚¤ãƒ™ãƒ³ãƒˆãƒãƒ³ãƒ‰ãƒ©ã‚’有効ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚到é”å¯èƒ½æ€§ã®è¨ˆç®—ã§ä¸€æ™‚çš„ãªç•°å¸¸(soft state)を無視ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚デフォルトã¯ã€Œã¯ã„ã€ã§ã™ã€‚「ã¯ã„ã€ã‚’指定ã—ãŸå ´åˆã€ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã‚’優先ã—ã¾ã™ã€‚デフォルト値ã¯ã€Œã¯ã„ã€ã§ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトã«ã‚ˆã£ã¦æä¾›ã•れるパフォーマンスデータを処ç†ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚「ã¯ã„ã€ã®å ´åˆã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã«å­˜åœ¨ã—ãªã„オブジェクトをDirectorã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトã«é–¢ã™ã‚‹é€šçŸ¥ã‚’é€ä¿¡ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ユーザã«é€šçŸ¥ã‚’é€ä¿¡ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚宛先フィールドをçµåˆã™ã‚‹ã‹ç½®ãæ›ãˆã‚‹ã‹ã€‚ 文字列ã«å·®ç•°ã¯ã‚りã¾ã›ã‚“カスタム変数ã®å€¤ã®å…¥åŠ›æ™‚ã«ã€ã“ã®ã‚­ãƒ¼ãŒé¸æŠžã•れるã¨ã€å¤‰æ•°ã®å€¤ã«ãªã‚Šã¾ã™ã€‚Windowsキックスタートスクリプト関連ã™ã‚‹å¤‰æ•°ã‚’掃除ã™ã‚‹è¨­å®šå¤‰æ›´ãŒè¡Œã‚れãŸå±¥æ­´ã‚’記録ã—ã¾ã™ã€‚ã©ã‚“ãªè¨­å®šãŒã ã‚Œã«ã‚ˆã£ã¦ã©ã®ã‚ˆã†ã«å¤‰æ›´ã•れãŸã®ã‹ã€è¿½è·¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®å¼ã‚’演算å­ã«ãƒ©ãƒƒãƒ—ã™ã‚‹ã¯ã„ã€"%s"を削除ã—ã¦ãã ã•ã„ã¯ã„Basketスナップショットã¯ã„ã¤ã§ã‚‚作æˆã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ãã®æ™‚点ã§ã®é–¢é€£ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã®ã‚·ãƒªã‚¢ãƒ«åŒ–ã•れãŸè¡¨ç¾ãŒä¿æŒã•れã¾ã™ã€‚スナップショットã¯ã€ã¾ã£ãŸãåŒã˜ã¾ãŸã¯åˆ¥ã®Directorインスタンスã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã€å…±æœ‰ã€ãŠã‚ˆã³å¾©å…ƒã§ãã¾ã™ã€‚テンプレートã®å…±æœ‰ã¯ã„ã¤ã§ã‚‚中止ã§ãã¾ã™ã€‚ ã“れã¯ã™ãã«ä»¥å‰ã®ã‚­ãƒ¼ã‚’無効ã«ã—ã¾ã™ã€‚ã™ãã«æœ€çµ‚çš„ãªå¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ãれらã«ã¤ã„ã¦çŸ¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã™ãã«é©ç”¨ã—ãŸããªã„å ´åˆã¯ã€ã‚¸ãƒ§ãƒ–を定義ã™ã‚‹ã“ã¨ã«ã‚‚æ„味ãŒã‚りã¾ã™ã€‚ Director GUIã§åˆ©ç”¨å¯èƒ½ãªå¤‰æ›´ç‚¹ãŒã‚ã‹ã‚Šã¾ã™ã€‚自動生æˆã§ç”Ÿæˆã•れãŸPowershellスクリプトを使ã£ã¦Icinga 2 Agentをインストールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®å ´åˆã€WindowsノードãŒAgentインストーラーをå–å¾—ã™ã‚‹å ´æ‰€ã‚’é¸æŠžã—ã¦ãã ã•ã„ã€‚ç‰¹å®šã®æ¡ä»¶ãŒæº€ãŸã•れãŸå ´åˆã«ã®ã¿ã“ã®ãƒ•ィールドを表示ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ ãã†ã—ãªã‘れã°åˆ©ç”¨ã§ããªã„ã§ã—ょã†ã€‚ã¾ãŸã€ä»¥å‰ã«è¨­å®šã•れãŸå€¤ã¯ã„ã£ãŸã‚“æ ¼ç´ã•ã‚Œã‚‹ã¨æ¶ˆåŽ»ã•れã¾ã™å¤‰æ›´ã—ãŸå€¤ã‚’別ã®ï¼ˆæ–°ã—ã„ï¼‰ãƒ—ãƒ­ãƒ‘ãƒ†ã‚£ã«æ›¸ã込むã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®ãƒ—ロパティåã¯ã“ã“ã§å®šç¾©ã§ãã€å…ƒã®ãƒ—ロパティã¯å¤‰æ›´ã•れãªã„ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚ 特定ã®ãƒ—ロパティã®å€¤ã‚’変更ã™ã‚‹ã ã‘ã®å ´åˆã¯ã€ç©ºç™½ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’実行ã™ã‚‹å‰ã«ã€ã„ãã¤ã‹ã® %s を定義ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚Icinga 2 APIユーザåLDAP検索ベース。 多ãã®å ´åˆã€OU=Users,OU=HQ,DC=your,DC=company,DC=tldã®ã‚ˆã†ãªã‚‚ã®ã§ã™ã€‚設定ã¯è‰¯å¥½ã§ã™ã€‚ãれã§ã‚‚ã€ã“ã®ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‚’å†å®Ÿè¡Œã—ã¦ã€å¤‰æ›´ã—ãŸã‚³ãƒžãƒ³ãƒ‰å®šç¾©ã¾ãŸã¯æ–°ã—ã„æ‰‹å‹•ã§å®šç¾©ã—ãŸã‚³ãƒžãƒ³ãƒ‰å®šç¾©ã‚’(å†ï¼‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹ã‹ã€ã¾ãŸã¯Icinga 2 Coreã‚¢ãƒƒãƒ—ã‚°ãƒ¬ãƒ¼ãƒ‰å¾Œã«æ–°ã—ã„æ–°ã—ã„ITLコマンドをå–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚データベースã®è¨­å®šã¯è‰¯å¥½ã§ã™ã€‚%sã¸ã®æº–å‚™ãŒã§ãã¦ã„ã¾ã™Icinga Directorã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¯ã¾ã è¨­å®šåæ˜ ã®æº–å‚™ãŒã§ãã¦ã„ã¾ã›ã‚“。 ã“ã®ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯ã€Icinga 2サーãƒãƒ¼ã¸ã®æŽ¥ç¶šè¨­å®šã‚’手助ã‘ã—ã¾ã™ã€‚通常ã®ç›£è¦–間隔置æ›ç”¨ã®æ–‡å­—列ユーザーã¯ãれらã®ãƒ†ãƒ³ãƒ—レートã®ä¸­ã‹ã‚‰é¸æŠžã™ã‚‹ã“ã¨ãŒè¨±ã•れるゾーンゾーンåゾーン設定ゾーンリストã™ã¹ã¦æˆ»ã‚‹å±é™ºåœæ­¢ï¼ˆä¾‹ï¼‰ -Hã€--hostname。空ã¯"skip_key"ã‚’æ„味ã™ã‚‹ï¼ˆä¾‹ï¼‰5%ã€$host.name$ã€$lower$%:$upper$%å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸã“ã“ホスト変数åホスト変数値修正ã•れãŸnew関連グループãŒå­˜åœ¨ã—ã¾ã›ã‚“。ok一ã¤ã®é–¢é€£ã‚°ãƒ«ãƒ¼ãƒ—ãŒå­˜åœ¨ã—ã¾ã™ã€‚ä¿ç•™ä¸­NULLã‚’è¿”ã™ç©ºé…列を返ã™ã‚µãƒ¼ãƒ“ス変数åサービス変数値変更ãªã—未知到é”ä¸èƒ½ä¸ä½¿ç”¨èµ·å‹•使用中値ã®ãƒ•ォーマット経由警告icingaweb2-module-director-1.11.8/application/locale/ja_JP/LC_MESSAGES/director.po000066400000000000000000010540711516513262500274130ustar00rootroot00000000000000# Icinga Web 2 - Head for multiple monitoring backends. # Copyright (C) 2019 Icinga Development Team # This file is distributed under the same license as Director Module. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Director Module (1.6.2)\n" "Report-Msgid-Bugs-To: dev@icinga.com\n" "POT-Creation-Date: 2019-03-29 11:34+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: ja_JP\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Basepath: .\n" "X-Poedit-SearchPath-0: .\n" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:602 #, php-format msgid " (inherited from \"%s\")" msgstr "(\"%s\" ã‹ã‚‰ç¶™æ‰¿)" #: ../../../../modules/director/library/Director/Web/Table/TemplatesTable.php:63 msgid " - not in use -" msgstr "- 未使用 -" #: ../../../../modules/director/library/Director/Web/Table/DatafieldTable.php:49 msgid "# Used" msgstr "# 使用済ã¿" #: ../../../../modules/director/library/Director/Web/Table/DatafieldTable.php:50 msgid "# Vars" msgstr "# 変数" #: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:29 #, php-format msgid "%d / %d" msgstr "%d / %d" #: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:51 #, php-format msgid "%d Host Template(s)" msgstr "%d 個ã®ãƒ›ã‚¹ãƒˆãƒ†ãƒ³ãƒ—レート。" #: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:50 #, php-format msgid "%d Host(s)" msgstr "%d 個ã®ãƒ›ã‚¹ãƒˆã€‚" #: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:61 #, php-format msgid "%d Notification Apply Rule(s)" msgstr "%d 個ã®é€šçŸ¥é©ç”¨ãƒ«ãƒ¼ãƒ«ã€‚" #: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:60 #, php-format msgid "%d Notification Template(s)" msgstr "%d 個ã®é€šçŸ¥ãƒ†ãƒ³ãƒ—レート。" #: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:59 #, php-format msgid "%d Notification(s)" msgstr "%d 個ã®é€šçŸ¥ã€‚" #: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:56 #, php-format msgid "%d Service Apply Rule(s)" msgstr "%d 個ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ã€‚" #: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:55 #, php-format msgid "%d Service Template(s)" msgstr "%d 個ã®ãƒ†ãƒ³ãƒ—レート。" #: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:54 #, php-format msgid "%d Service(s)" msgstr "%d 個ã®ã‚µãƒ¼ãƒ“ス" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:231 #, php-format msgid "%d apply rules have been defined" msgstr "%d個ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ãŒå®šç¾©ã•れã¦ã„ã¾ã™" #: ../../../../modules/director/library/Director/Web/Table/SyncRunTable.php:46 #, php-format msgid "%d created" msgstr "%d 個定義ã•れã¦ã„ã¾ã™" #: ../../../../modules/director/library/Director/Web/Table/SyncRunTable.php:58 #, php-format msgid "%d deleted" msgstr "%d 個削除ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:110 #, php-format msgid "%d files" msgstr "%d 個ã®ãƒ•ァイル" #: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:83 #, php-format msgid "%d files rendered in %0.2fs" msgstr "%d 個ã®ãƒ•ァイルãŒ%0.2f ç§’ã§ç”Ÿæˆã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:273 #, php-format msgid "%d have been externally defined and will not be deployed" msgstr "%d 個ã¯å¤–部ã§å®šç¾©ã•れã¦ãŠã‚Šã€è¨­å®šãŒå映ã•れã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Web/Table/SyncRunTable.php:52 #, php-format msgid "%d modified" msgstr "%d 個ã®å¤‰æ›´ã€‚" #: ../../../../modules/director/application/controllers/InspectController.php:78 #, php-format msgid "%d objects found" msgstr "%d 個ã®ã‚ªãƒ–ジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:256 #, php-format msgid "%d objects have been defined" msgstr "%d 個ã®ã‚ªãƒ–ジェクトãŒå®šç¾©ã•れã¦ã„ã¾ã™" #: ../../../../modules/director/application/forms/IcingaMultiEditForm.php:87 #, php-format msgid "%d objects have been modified" msgstr "%d 個ã®ã‚ªãƒ–ジェクトãŒå¤‰æ›´ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:119 #, php-format msgid "%d objects, %d templates, %d apply rules" msgstr "%d 個ã®ã‚ªãƒ–ジェクトã€%d 個ã®ãƒ†ãƒ³ãƒ—レートã€%d 個ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:265 #, php-format msgid "%d of them are templates" msgstr "ãã®ã†ã¡ã®%d 個ã¯ãƒ†ãƒ³ãƒ—レートã§ã™" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:213 #, php-format msgid "%d templates have been defined" msgstr "%d 個ã®ãƒ†ãƒ³ãƒ—レートãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:450 #, php-format msgid "%s \"%s\" has been created" msgstr "%s \"%s\"ãŒä½œæˆã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:453 #, php-format msgid "%s \"%s\" has been deleted" msgstr "%s \"%s\"ãŒå‰Šé™¤ã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/application/forms/IcingaImportObjectForm.php:36 #, php-format msgid "%s \"%s\" has been imported\"" msgstr "%s \"%s\"ãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:456 #, php-format msgid "%s \"%s\" has been modified" msgstr "%s \"%s\" ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Web/Table/ObjectSetTable.php:57 #, php-format msgid "%s (%d members)" msgstr "%s (%d 人ã®ãƒ¡ãƒ³ãƒãƒ¼)" #: ../../../../modules/director/application/controllers/HostController.php:178 #: ../../../../modules/director/application/controllers/HostController.php:261 #, php-format msgid "%s (Applied Service set)" msgstr "%s (é©ç”¨ã•れãŸã‚µãƒ¼ãƒ“スセット)" #: ../../../../modules/director/application/controllers/HostController.php:311 #, php-format msgid "%s (Service set)" msgstr "%s (サービスセット)" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:243 #: ../../../../modules/director/application/forms/SettingsForm.php:157 #, php-format msgid "%s (default)" msgstr "%s (デフォルト)" #: ../../../../modules/director/library/Director/Web/Table/IcingaHostAppliedServicesTable.php:100 #, php-format msgid "%s (where %s)" msgstr "%s (æ¡ä»¶: %s)" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:69 #, php-format msgid "%s Templates" msgstr "%s テンプレート" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:36 #, php-format msgid "%s based on %s" msgstr "%s (ベース: %s)" #: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:112 #, php-format msgid "%s config changes happend since the last deployed configuration" msgstr "最後ã«å映ã•れãŸè¨­å®šä»¥é™ã® %s ã®è¨­å®šå¤‰æ›´" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:256 #, php-format msgid "%s has been blacklisted on %s" msgstr "%s 㯠%s ã®ãƒ–ラックリストã«ç™»éŒ²ã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:292 #, php-format msgid "%s is no longer blacklisted on %s" msgstr "%s 㯠%s ã®ãƒ–ラックリストã‹ã‚‰é™¤å¤–ã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:48 #, php-format msgid "%s objects have been modified" msgstr "%s オブジェクトãŒç·¨é›†ã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/application/controllers/HostController.php:459 #, php-format msgid "%s on %s (from set: %s)" msgstr "%s 上ã®%s(セット: %s ã‹ã‚‰) " #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:288 #, php-format msgid "%s related group objects have been created" msgstr "%s 個ã®é–¢é€£ã‚ªãƒ–ジェクトãŒä½œæˆã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:72 #, php-format msgid "%s templates based on %s" msgstr "%s テンプレート(%s をベース)" #: ../../../../modules/director/library/Director/Web/Widget/HealthCheckPluginOutput.php:46 #, php-format msgid "%s: %d" msgstr "%s: %d" #: ../../../../modules/director/application/controllers/BasketController.php:193 #, php-format msgid "%s: %s (Snapshot)" msgstr "%s: %s (スナップショット)" #: ../../../../modules/director/application/controllers/ImportsourceController.php:223 #, php-format msgid "%s: Property Modifier" msgstr "%s: プロパティ変æ›ãƒ«ãƒ¼ãƒ«" #: ../../../../modules/director/application/controllers/BasketController.php:144 #, php-format msgid "%s: Snapshots" msgstr "%s: スナップショット" #: ../../../../modules/director/application/controllers/ImportsourceController.php:197 #, php-format msgid "%s: add Property Modifier" msgstr "%s: プロパティ変æ›ãƒ«ãƒ¼ãƒ«ã‚’追加" #: ../../../../modules/director/library/Director/Db/Housekeeping.php:54 msgid "(Host) group resolve cache" msgstr "(ホスト) グループãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’解決" #: ../../../../modules/director/application/controllers/ServiceController.php:169 #, php-format msgid "(on %s)" msgstr "(%s ã«ã¤ã„ã¦)" #: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:234 msgid "- add more -" msgstr "- ã•らã«è¿½åŠ  -" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1032 msgid "- click to add more -" msgstr "- クリックã—ã¦ã•らã«è¿½åŠ  -" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:611 msgid "- inherited -" msgstr "- 継承 -" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:66 msgid "- no automatic installation -" msgstr "- 自動インストールãªã— -" #: ../../../../modules/director/application/controllers/ConfigController.php:360 #: ../../../../modules/director/application/controllers/ConfigController.php:371 #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:239 #: ../../../../modules/director/application/forms/SettingsForm.php:161 #: ../../../../modules/director/application/views/helpers/FormDataFilter.php:465 #: ../../../../modules/director/library/Director/DataType/DataTypeDatalist.php:22 #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:43 #: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:37 #: ../../../../modules/director/library/Director/Job/ImportJob.php:118 #: ../../../../modules/director/library/Director/Job/SyncJob.php:124 #: ../../../../modules/director/library/Director/Web/Form/QuickBaseForm.php:119 msgid "- please choose -" msgstr "- é¸æŠžã—ã¦ãã ã•ã„ -" #: ../../../../modules/director/application/controllers/BasketsController.php:34 msgid "" "A Configuration Basket references specific Configuration Objects or all " "objects of a specific type. It has been designed to share Templates, Import/" "Sync strategies and other base Configuration Objects. It is not a tool to " "operate with single Hosts or Services." msgstr "æ§‹æˆãƒã‚¹ã‚±ãƒƒãƒˆã¯ã€ç‰¹å®šã®æ§‹æˆã‚ªãƒ–ジェクトã¾ãŸã¯ç‰¹å®šã®ã‚¿ã‚¤ãƒ—ã®" "ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをå‚ç…§ã—ã¾ã™ã€‚ ã“れã¯ãƒ†ãƒ³ãƒ—レートã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆ/åŒæœŸæˆ¦ç•¥ã€" "ãã®ä»–ã®åŸºæœ¬è¨­å®šã‚ªãƒ–ジェクトを共有ã™ã‚‹ã‚ˆã†ã«è¨­è¨ˆã•れã¦ã„ã¾ã™ã€‚ å˜ä¸€ã®" "ホストã¾ãŸã¯ã‚µãƒ¼ãƒ“スã§å‹•作ã™ã‚‹ãŸã‚ã®ãƒ„ールã§ã¯ã‚りã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:61 msgid "" "A custom LDAP filter to use in addition to the object class. This allows for " "a lot of flexibility but requires LDAP filter skills. Simple filters might " "look as follows: operatingsystem=*server*" msgstr "オブジェクトクラスã«åŠ ãˆã¦ä½¿ç”¨ã™ã‚‹ã‚«ã‚¹ã‚¿ãƒ LDAPフィルタ。" "ã“れã«ã‚ˆã‚Šã€æŸ”軟性ãŒå¤§å¹…ã«å‘上ã—ã¾ã™ãŒã€LDAPフィルタã®ã‚¹ã‚­ãƒ«ãŒå¿…è¦ã§ã™ã€‚" "å˜ç´”ãªãƒ•ã‚£ãƒ«ã‚¿ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚operatingsystem=*server*" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:214 msgid "" "A custom string. Might contain source columns, please use placeholders of " "the form ${columnName} in such case" msgstr "カスタム文字列 ソースカラムをå«ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®å ´åˆã¯ " "${columnName} ã®å½¢å¼ã®placeholderを使用ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:126 msgid "A description about the field" msgstr "フィールドã«ã¤ã„ã¦ã®èª¬æ˜Ž" #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:59 msgid "A detailled description explaining what this choice is all about" msgstr "ã“ã®ãƒãƒ§ã‚¤ã‚¹ã®ã™ã¹ã¦ã«ã¤ã„ã¦èª¬æ˜Žã™ã‚‹è©³ç´°ãªèª¬æ˜Ž" #: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:102 msgid "" "A meaningful description explaining your users what to expect when assigning " "this set of services" msgstr "ã“ã®ã‚µãƒ¼ãƒ“スセットã®èª¬æ˜Žã‚’記述ã—ã¾ã™" #: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:85 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:641 #, php-format msgid "A new %s has successfully been created" msgstr "æ–°ã—ã„ %s ãŒæ­£å¸¸ã«ä½œæˆã•れã¾ã—ãŸ" #: ../../../../modules/director/application/forms/IcingaGenerateApiKeyForm.php:39 #, php-format msgid "A new Self Service API key for %s has been generated" msgstr "%s ã®æ–°ã—ã„セルフサービスAPIキーãŒç”Ÿæˆã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/application/forms/ImportRowModifierForm.php:74 msgid "" "A property modifier allows you to modify a specific property at import time" msgstr "プロパティ変æ›ãƒ«ãƒ¼ãƒ«ã‚’使用ã™ã‚‹ã¨ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«ç‰¹å®šã®ãƒ—ロパティを変更ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/ImportSourceForm.php:17 msgid "" "A short name identifying this import source. Use something meaningful, like " "\"Hosts from Puppet\", \"Users from Active Directory\" or similar" msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆå…ƒã‚’識別ã™ã‚‹åå‰ã€‚ ã‚ã‹ã‚Šã‚„ã™ã„æ„味ã®ã‚ã‚‹åå‰ã‚’使用ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/DirectorJobForm.php:74 msgid "" "A short name identifying this job. Use something meaningful, like \"Import " "Puppet Hosts\"" msgstr "ã“ã®ã‚¸ãƒ§ãƒ–を識別ã™ã‚‹åå‰ã€‚ ã‚ã‹ã‚Šã‚„ã™ã„æ„味ã®ã‚ã‚‹åå‰ã‚’使用ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:30 msgid "A short name identifying this set of services" msgstr "ã“ã®ã‚µãƒ¼ãƒ“スセットã®åå‰" #: ../../../../modules/director/library/Director/Web/SelfService.php:211 #, php-format msgid "" "A ticket for this agent could not have been requested from your deployment " "endpoint: %s" msgstr "ã“ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®ãƒã‚±ãƒƒãƒˆã¯ã€ãƒ‡ãƒ—ロイメントエンドãƒã‚¤ãƒ³ãƒˆã‹ã‚‰è¦æ±‚ã•れã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼š%s" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:95 #, php-format msgid "" "A total of %d config changes happened since your last deployed config has " "been rendered" msgstr "最後ã®è¨­å®šå映ã‹ã‚‰åˆè¨ˆ %d 回ã®è¨­å®šå¤‰æ›´ãŒè¡Œã‚れã¾ã—ãŸã€‚" #: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:49 msgid "API Key" msgstr "APIキー" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:46 #: ../../../../modules/director/application/forms/KickstartForm.php:151 msgid "API user" msgstr "API ユーザ" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1360 msgid "Accept passive checks" msgstr "パッシブ監視を許å¯ã™ã‚‹" #: ../../../../modules/director/application/forms/IcingaHostForm.php:93 msgid "Accepts config" msgstr "設定ã®åŒæœŸã‚’å—ã‘入れる" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:28 msgid "Acknowledgement" msgstr "Acknowledgement (検知)" #: ../../../../modules/director/library/Director/Web/Table/ConfigFileDiffTable.php:81 #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:391 #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:401 msgid "Action" msgstr "アクション" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1473 msgid "Action URL" msgstr "アクションURL" #: ../../../../modules/director/library/Director/Web/Table/QuickTable.php:280 #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:424 #: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:62 msgid "Actions" msgstr "アクション" #: ../../../../modules/director/application/forms/SettingsForm.php:143 msgid "Activation Tool" msgstr "アクティベーションツール" #: ../../../../modules/director/application/forms/SettingsForm.php:122 msgid "Active-Passive" msgstr "アクティブ-パッシブ" #: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:27 msgid "Activity" msgstr "アクティビティ" #: ../../../../modules/director/application/controllers/ConfigController.php:141 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:11 #: ../../../../modules/director/library/Director/Web/Tabs/InfraTabs.php:29 msgid "Activity Log" msgstr "アクティビティログ" #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:233 #, php-format msgid "Activity Log: %s" msgstr "アクティビティログ: %s" #: ../../../../modules/director/configuration.php:138 msgid "Activity log" msgstr "アクティビティログ" #: ../../../../modules/director/application/controllers/DataController.php:22 #: ../../../../modules/director/application/controllers/DataController.php:64 #: ../../../../modules/director/application/forms/AddToBasketForm.php:72 #: ../../../../modules/director/library/Director/Web/ActionBar/ChoicesActionBar.php:16 #: ../../../../modules/director/library/Director/Web/ActionBar/ObjectsActionBar.php:16 #: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:19 #: ../../../../modules/director/library/Director/Web/Controller/ActionController.php:134 #: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:247 #: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:288 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:492 msgid "Add" msgstr "追加" #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:76 #: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:51 #, php-format msgid "Add %s" msgstr "追加: %s" #: ../../../../modules/director/application/forms/AddToBasketForm.php:68 #, php-format msgid "Add %s objects" msgstr "%s 個ã®ã‚ªãƒ–ジェクトを追加" #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:366 #, php-format msgid "Add %s: %s" msgstr "%sを追加: %s" #: ../../../../modules/director/application/controllers/HostsController.php:40 #: ../../../../modules/director/application/controllers/HostsController.php:79 msgid "Add Service" msgstr "サービスを追加" #: ../../../../modules/director/application/controllers/HostsController.php:45 #: ../../../../modules/director/application/controllers/HostsController.php:110 msgid "Add Service Set" msgstr "サービスセットを追加" #: ../../../../modules/director/application/controllers/HostsController.php:127 #, php-format msgid "Add Service Set to %d hosts" msgstr "サービスセットを %d 個ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ " #: ../../../../modules/director/application/controllers/HostController.php:74 #, php-format msgid "Add Service Set: %s" msgstr "サービスセット: %s を追加" #: ../../../../modules/director/application/controllers/HostController.php:61 #, php-format msgid "Add Service: %s" msgstr "サービス: %s を追加" #: ../../../../modules/director/application/controllers/DatafieldController.php:40 msgid "Add a new Data Field" msgstr "æ–°ã—ã„データフィールドを追加" #: ../../../../modules/director/application/controllers/DataController.php:52 msgid "Add a new Data List" msgstr "データリストを追加" #: ../../../../modules/director/application/controllers/ImportsourcesController.php:49 msgid "Add a new Import Source" msgstr "æ–°ã—ã„インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã‚’追加" #: ../../../../modules/director/application/controllers/JobController.php:31 #: ../../../../modules/director/application/controllers/JobsController.php:15 msgid "Add a new Job" msgstr "æ–°ã—ã„ジョブã®è¿½åŠ " #: ../../../../modules/director/application/controllers/SyncrulesController.php:28 msgid "Add a new Sync Rule" msgstr "æ–°ã—ã„åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’追加" #: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:470 msgid "Add a new entry" msgstr "æ–°ã—ã„エントリを追加" #: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:256 msgid "Add a new one..." msgstr "æ–°ã—ã„ã‚‚ã®ã‚’追加" #: ../../../../modules/director/application/controllers/ServicesetController.php:49 #, php-format msgid "Add a service set to \"%s\"" msgstr "\"%s\"ã«ã‚µãƒ¼ãƒ“スセットを追加" #: ../../../../modules/director/application/controllers/ServiceController.php:105 #, php-format msgid "Add a service to \"%s\"" msgstr "\"%s\"ã«ã‚µãƒ¼ãƒ“スを追加" #: ../../../../modules/director/application/views/helpers/FormDataFilter.php:516 msgid "Add another filter" msgstr "別ã®ãƒ•ィルタを追加" #: ../../../../modules/director/application/controllers/BasketController.php:83 msgid "Add chosen objects to a Configuration Basket" msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトを構æˆãƒã‚¹ã‚±ãƒƒãƒˆã«è¿½åŠ ã™ã‚‹" #: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:60 msgid "Add data list entry" msgstr "データリストエントリを追加" #: ../../../../modules/director/application/controllers/ImportsourceController.php:89 msgid "Add import source" msgstr "インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®è¿½åŠ " #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:372 #, php-format msgid "Add new Icinga %s" msgstr "æ–°ã—ã„Icinga %s ã®è¿½åŠ " #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:355 #, php-format msgid "Add new Icinga %s template" msgstr "æ–°ã—ã„Icinga %s テンプレートã®è¿½åŠ " #: ../../../../modules/director/application/controllers/ImportsourceController.php:170 msgid "Add property modifier" msgstr "プロパティ変æ›ãƒ«ãƒ¼ãƒ«ã‚’追加" #: ../../../../modules/director/application/controllers/HostController.php:90 #: ../../../../modules/director/application/controllers/ServicesetController.php:66 msgid "Add service" msgstr "サービスを追加" #: ../../../../modules/director/application/controllers/HostController.php:95 msgid "Add service set" msgstr "サービスセットを追加" #: ../../../../modules/director/application/controllers/HostsController.php:96 #, php-format msgid "Add service to %d hosts" msgstr "サービスを %d 個ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ " #: ../../../../modules/director/application/controllers/SyncruleController.php:210 msgid "Add sync property rule" msgstr "åŒæœŸãƒ—ロパティルールを追加" #: ../../../../modules/director/application/controllers/SyncruleController.php:249 #, php-format msgid "Add sync property: %s" msgstr "åŒæœŸãƒ—ロパティを追加: %s" #: ../../../../modules/director/application/controllers/SyncruleController.php:161 msgid "Add sync rule" msgstr "åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’追加" #: ../../../../modules/director/application/controllers/BasketController.php:82 #: ../../../../modules/director/application/controllers/DataController.php:124 #: ../../../../modules/director/application/controllers/HostsController.php:70 #: ../../../../modules/director/application/controllers/ImportsourceController.php:55 #: ../../../../modules/director/application/controllers/JobController.php:78 #: ../../../../modules/director/application/controllers/ServicesController.php:36 #: ../../../../modules/director/application/controllers/SyncruleController.php:295 #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:337 #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:126 msgid "Add to Basket" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆã«è¿½åŠ " #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1459 msgid "Additional notes for this object" msgstr "ã“ã®ã‚ªãƒ–ジェクトã«é–¢ã™ã‚‹æ³¨æ„事項" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1512 msgid "Additional properties" msgstr "ä»»æ„ã®ãƒ—ロパティ" #: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:140 msgid "Agent" msgstr "エージェント" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:141 msgid "Agent Version" msgstr "エージェントã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³" #: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:31 msgid "Alias" msgstr "別å" #: ../../../../modules/director/application/controllers/ConfigController.php:151 msgid "All changes" msgstr "ã™ã¹ã¦ã®å¤‰æ›´" #: ../../../../modules/director/application/forms/SettingsForm.php:78 msgid "" "All changes are tracked in the Director database. In addition you might also " "want to send an audit log through the Icinga Web 2 logging mechanism. That " "way all changes would be written to either Syslog or the configured log " "file. When enabling this please make sure that you configured Icinga Web 2 " "to log at least at \"informational\" level." msgstr "ã™ã¹ã¦ã®å¤‰æ›´ã¯Directorデータベースã§è¿½è·¡ã•れã¾ã™ã€‚ ã•らã«ã€" "Icinga Web 2ã®ãƒ­ã‚°è¨˜éŒ²ãƒ¡ã‚«ãƒ‹ã‚ºãƒ ã‚’介ã—ã¦ç›£æŸ»ãƒ­ã‚°ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" "ãã†ã™ã‚Œã°ã€ã™ã¹ã¦ã®å¤‰æ›´ã¯Syslogã¾ãŸã¯è¨­å®šã•れãŸãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚" "ã“れを有効ã«ã™ã‚‹ã¨ãã¯ã€å°‘ãªãã¨ã‚‚ \"informational\"レベルã§ãƒ­ã‚°ã‚’" "記録ã™ã‚‹ã‚ˆã†ã«Icinga Web 2を設定ã—ãŸã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:307 msgid "All custom variables (vars)" msgstr "ã™ã¹ã¦ã®ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ï¼ˆvars)" #: ../../../../modules/director/application/forms/BasketForm.php:50 msgid "All of them" msgstr "ãれらã™ã¹ã¦" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:725 #, php-format msgid "All overrides have been removed from \"%s\"" msgstr "ã™ã¹ã¦ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã¯\"%s\"ã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:240 #, php-format msgid "All your %s Apply Rules" msgstr "ã™ã¹ã¦ã®%s é©ç”¨ãƒ«ãƒ¼ãƒ«" #: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:201 #, php-format msgid "All your %s Templates" msgstr "ã™ã¹ã¦ã® %s テンプレート" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:174 msgid "Allow Updates" msgstr "アップデートを許å¯" #: ../../../../modules/director/configuration.php:31 msgid "Allow readonly users to see where a Service came from" msgstr "読ã¿å–り専用ユーザーã«ã€ã‚µãƒ¼ãƒ“スã®å‡ºæ‰€ã‚’確èªã™ã‚‹ã“ã¨ã‚’許å¯" #: ../../../../modules/director/configuration.php:6 msgid "Allow to access the director API" msgstr "director API ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯" #: ../../../../modules/director/configuration.php:7 msgid "Allow to access the full audit log" msgstr "完全㪠audit ログã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯" #: ../../../../modules/director/configuration.php:17 msgid "Allow to configure hosts" msgstr "ホストã®è¨­å®šã‚’許å¯" #: ../../../../modules/director/configuration.php:22 msgid "Allow to configure notifications" msgstr "通知ã®è¨­å®šã‚’許å¯" #: ../../../../modules/director/configuration.php:19 msgid "Allow to configure service sets" msgstr "サービスセットã®è¨­å®šã‚’許å¯" #: ../../../../modules/director/configuration.php:18 msgid "Allow to configure services" msgstr "サービスã®è¨­å®šã‚’許å¯" #: ../../../../modules/director/configuration.php:21 msgid "Allow to configure users" msgstr "ユーザã®è¨­å®šã‚’許å¯" #: ../../../../modules/director/configuration.php:20 msgid "Allow to define Service Set Apply Rules" msgstr "サービス設定ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ã®å®šç¾©ã‚’許å¯" #: ../../../../modules/director/configuration.php:16 msgid "Allow to deploy configuration" msgstr "è¨­å®šåæ˜ ã‚’許å¯" #: ../../../../modules/director/configuration.php:26 msgid "" "Allow to inspect objects through the Icinga 2 API (could contain sensitive " "information)" msgstr "Icinga 2 APIを介ã—ã¦ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¤œæŸ»ã‚’許å¯" "(機密情報をå«ã‚€å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼‰" #: ../../../../modules/director/configuration.php:10 msgid "Allow to show configuration (could contain sensitive information)" msgstr "設定ã®è¡¨ç¤ºã‚’許å¯ï¼ˆæ©Ÿå¯†æƒ…報をå«ã‚€å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼‰" #: ../../../../modules/director/configuration.php:14 msgid "Allow to show the full executed SQL queries in some places" msgstr "ã„ãã¤ã‹ã®å ´æ‰€ã§å®Œå…¨ã«å®Ÿè¡Œã•れãŸSQLクエリを表示ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™" #: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:48 msgid "" "Allow to use this entry only to users with one of these Icinga Web 2 roles" msgstr "é¸æŠžã—ãŸãƒ­ãƒ¼ãƒ«ã®ã©ã‚Œã‹ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã®ã¿" "ã“ã®ã‚¨ãƒ³ãƒˆãƒªã®ä½¿ç”¨ã‚’許å¯ã—ã¾ã™" #: ../../../../modules/director/configuration.php:33 msgid "Allow unrestricted access to Icinga Director" msgstr "Icinga Directorã¸ã®ç„¡åˆ¶é™ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯" #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:85 msgid "Allowed maximum" msgstr "許å¯ã•れãŸä¸Šé™" #: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:44 msgid "Allowed roles" msgstr "許å¯ã•れãŸãƒ­ãƒ¼ãƒ«" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:73 msgid "Also clone fields provided by this Template" msgstr "ã“ã®ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã«æä¾›ã•れã¦ã„るフィールドも複製ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:53 msgid "Also clone single Service Sets defined for this Host" msgstr "ã“ã®ãƒ›ã‚¹ãƒˆã«å®šç¾©ã•れã¦ã„ã‚‹å˜ä¸€ã®ã‚µãƒ¼ãƒ“スセットも複製ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:44 msgid "Also clone single Services defined for this Host" msgstr "ã“ã®ãƒ›ã‚¹ãƒˆã«å®šç¾©ã•れã¦ã„ã‚‹å˜ä¸€ã®ã‚µãƒ¼ãƒ“スも複製ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:191 msgid "" "Also install NSClient++. It can be used through the Icinga Agent and comes " "with a bunch of additional Check Plugins" msgstr "NSClient++ もインストールã—ã¾ã™ã€‚ NSClient++ ã«ã¯Icingaエージェントを介ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã€ç›£è¦–プラグインãŒä»˜å±žã—ã¦ã„ã¾ã™" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:107 #, php-format msgid "Also rename all \"%s\" custom variables to \"%s\" on %d objects?" msgstr "ã™ã¹ã¦ã® \"%s\" カスタム変数ã®åå‰ã‚’ \"%s\" ã«å¤‰æ›´ã—ã¾ã™ã‹ï¼Ÿï¼ˆå¯¾è±¡ï¼š%d個ã®ã‚ªãƒ–ジェクト)" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:64 #, php-format msgid "Also wipe all \"%s\" custom variables from %d objects?" msgstr "ã™ã¹ã¦ã® \"%s\" カスタム変数も消去ã—ã¾ã™ã‹ï¼Ÿ(処ç†å¯¾è±¡ï¼š%d個ã®ã‚ªãƒ–ジェクト)" #: ../../../../modules/director/application/forms/IcingaHostForm.php:336 msgid "" "Alternative name for this host. Might be a host alias or and kind of string " "helping your users to identify this host" msgstr "ã“ã®ãƒ›ã‚¹ãƒˆã®åˆ¥å。 ユーザーãŒã“ã®ãƒ›ã‚¹ãƒˆã‚’識別ã™ã‚‹ã®ã«å½¹ç«‹ã¤" "ホストエイリアスã¾ãŸã¯ãã®ã‚ˆã†ãªæ–‡å­—列" #: ../../../../modules/director/application/forms/IcingaUserForm.php:135 msgid "" "Alternative name for this user. In case your object name is a username, this " "could be the full name of the corresponding person" msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ¥å。 オブジェクトåãŒãƒ¦ãƒ¼ã‚¶ãƒ¼åã§ã‚ã‚‹å ´åˆã€" "ã“れã¯å¯¾å¿œã™ã‚‹äººã®ãƒ•ルãƒãƒ¼ãƒ ã‚’指定ã—ãŸã‚Šã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1493 msgid "Alternative text to be shown in case above icon is missing" msgstr "上記ã®ã‚¢ã‚¤ã‚³ãƒ³ãŒãªã„å ´åˆã«è¡¨ç¤ºã•れる代替テキスト" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:86 msgid "" "An Icinga DSL expression that returns a boolean value, e.g.: var cmd = " "bool(macro(\"$cmd$\")); return cmd ..." msgstr "ブール値を返ã™Icinga DSL表記。" "例)var cmd = bool(macro(\"$cmd$\")); return cmd" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:47 msgid "" "An Icinga DSL expression, e.g.: var cmd = macro(\"$cmd$\"); return " "typeof(command) == String ..." msgstr "Icinga DSL表記。" "例)var cmd = macro(\"$cmd$\"); return typeof(command)== String" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1475 msgid "" "An URL leading to additional actions for this object. Often used with Icinga " "Classic, rarely with Icinga Web 2 as it provides far better possibilities to " "integrate addons" msgstr "ã“ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«ã¤ãªãŒã‚‹URL。" "Icinga Classicã§ã¯ã‚ˆã使用ã•れã¾ã™ãŒã€Icinga Web 2ã§ã¯ã€ã‚¢ãƒ‰ã‚ªãƒ³ã‚’çµ±åˆ" "ã™ã‚‹ãŸã‚ã®ã¯ã‚‹ã‹ã«å„ªã‚ŒãŸæ©Ÿèƒ½ãŒã‚ã‚‹ãŸã‚ã€ã»ã¨ã‚“ã©ä½¿ç”¨ã•れã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1468 msgid "An URL pointing to additional notes for this object" msgstr "ã“ã®ã‚ªãƒ–ジェクトã«é–¢ã™ã‚‹URL" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1484 msgid "" "An URL pointing to an icon for this object. Try \"tux.png\" for icons " "relative to public/img/icons or \"cloud\" (no extension) for items from the " "Icinga icon font" msgstr "ã“ã®ã‚ªãƒ–ジェクトã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’指ã™URL。 public/img/iconsã«é–¢é€£ã™ã‚‹" "アイコンã«ã¯ \"tux.png\"ã‚’ã€Icingaアイコンフォントã®ã‚¢ã‚¤ãƒ†ãƒ ã«ã¯\"cloud\"" "(拡張å­ãªã—)を試ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1240 msgid "" "An alternative display name for this group. If you wonder how this could be " "helpful just leave it blank" msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®åˆ¥åã§ã€è¡¨ç¤ºã«ä½¿ã‚れã¾ã™ã€‚" "別åを設定ã™ã‚‹å¿…è¦ãŒãªã‘れã°ã€ç©ºç™½ã®ã¾ã¾ã§ã‚‚å•題ã‚りã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/ImportRowModifierForm.php:56 msgid "" "An extended description for this Import Row Modifier. This should explain " "it's purpose and why it has been put in place at all." msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆè¡Œãƒ—ロパティ変æ›ãƒ«ãƒ¼ãƒ«ã®è©³ç´°ãªèª¬æ˜Žã€‚ 目的ã¨ã€ãªãœå¿…è¦ãªã®ã‹ã®èª¬æ˜Žã‚’書ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/ImportSourceForm.php:26 msgid "" "An extended description for this Import Source. This should explain what " "kind of data you're going to import from this source." msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®è©³ç´°ãªèª¬æ˜Žã€‚ ã“ã®ã‚½ãƒ¼ã‚¹ã‹ã‚‰ã©ã®ã‚ˆã†ãªç¨®é¡žã®" "データをインãƒãƒ¼ãƒˆã—よã†ã¨ã—ã¦ã„ã‚‹ã®ã‹ã‚’説明ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SyncRuleForm.php:35 msgid "" "An extended description for this Sync Rule. This should explain what this " "Rule is going to accomplish." msgstr "ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã®è©³ç´°ãªèª¬æ˜Žã‚’記載ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:159 msgid "" "An extended description for this field. Will be shown as soon as a user puts " "the focus on this field" msgstr "ã“ã®ãƒ•ィールドã®è©³ç´°ãªèª¬æ˜Žã€‚ ユーザーãŒã“ã®ãƒ•ィールドã«ãƒ•ォーカスã™ã‚‹ã¨è¡¨ç¤ºã•れã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:55 msgid "" "An object class to search for. Might be \"user\", \"group\", \"computer\" or " "similar" msgstr "検索ã™ã‚‹ã‚ªãƒ–ジェクトクラス \"user\"ã€\"group\"ã€\"computer\"ãªã©ã®" "å¯èƒ½æ€§ãŒã‚りã¾ã™" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:20 msgid "Any first (leftmost) component" msgstr "最åˆã®ï¼ˆä¸€ç•ªå·¦ã®ï¼‰ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆã™ã¹ã¦" #: ../../../../modules/director/library/Director/Web/SelfService.php:115 msgid "Api Key:" msgstr "APIキー: " #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:52 #, php-format msgid "Applied %s" msgstr "%s ã‚’é©ç”¨ã—ã¾ã—ãŸ" #: ../../../../modules/director/application/forms/IcingaHostForm.php:217 msgid "Applied groups" msgstr "グループをé©ç”¨ã—ã¾ã—ãŸ" #: ../../../../modules/director/application/controllers/HostController.php:343 #, php-format msgid "Applied service: %s" msgstr "サービスをé©ç”¨ã—ã¾ã—ãŸ: %s" #: ../../../../modules/director/application/controllers/HostController.php:189 #: ../../../../modules/director/application/controllers/HostController.php:276 msgid "Applied services" msgstr "サービスをé©ç”¨ã—ã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:44 msgid "Apply" msgstr "é©ç”¨" #: ../../../../modules/director/application/controllers/ServiceController.php:110 #, php-format msgid "Apply \"%s\"" msgstr "\"%s\"ã‚’é©ç”¨" #: ../../../../modules/director/application/forms/ApplyMigrationsForm.php:25 #, php-format msgid "Apply %d pending schema migrations" msgstr "%d 個ã®ä¿ç•™ä¸­ã®ã‚¹ã‚­ãƒ¼ãƒžç§»è¡Œã‚’é©ç”¨" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:604 msgid "Apply For" msgstr "é©ç”¨å¯¾è±¡" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:166 msgid "Apply Rule" msgstr "ルールをé©ç”¨" #: ../../../../modules/director/library/Director/Web/Table/ApplyRulesTable.php:122 msgid "Apply Rule rendering preview" msgstr "ルールをé©ç”¨ã—ã¦ãƒ—レビューを行ã†" #: ../../../../modules/director/library/Director/Web/Table/DependencyTemplateUsageTable.php:11 #: ../../../../modules/director/library/Director/Web/Table/NotificationTemplateUsageTable.php:11 #: ../../../../modules/director/library/Director/Web/Table/ServiceTemplateUsageTable.php:12 msgid "Apply Rules" msgstr "ルールをé©ç”¨" #: ../../../../modules/director/application/forms/ApplyMigrationsForm.php:20 msgid "Apply a pending schema migration" msgstr "ä¿ç•™ä¸­ã®ã‚¹ã‚­ãƒ¼ãƒžç§»è¡Œã‚’é©ç”¨ã™ã‚‹" #: ../../../../modules/director/library/Director/Job/SyncJob.php:92 msgid "Apply changes" msgstr "変更をé©ç”¨ã™ã‚‹" # bug! cannot translate #: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:19 msgid "Apply notifications with specific properties according to given rules." msgstr "指定ã•れãŸãƒ«ãƒ¼ãƒ«ã«å¾“ã£ã¦ç‰¹å®šã®ãƒ—ロパティã§é€šçŸ¥ã‚’é©ç”¨ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1065 msgid "Apply rule" msgstr "ルールをé©ç”¨ã™ã‚‹" #: ../../../../modules/director/library/Director/Web/Table/ApplyRulesTable.php:129 msgid "Apply rule history" msgstr "ルールã®é©ç”¨å±¥æ­´" #: ../../../../modules/director/application/forms/KickstartForm.php:38 msgid "Apply schema migrations" msgstr "スキーマã®ç§»è¡Œã‚’é©ç”¨" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:92 #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:81 msgid "Apply to" msgstr "é©ç”¨å…ˆ" #: ../../../../modules/director/application/controllers/ServiceController.php:206 #, php-format msgid "Apply: %s" msgstr "é©ç”¨: %s" #: ../../../../modules/director/library/Director/Web/Table/IcingaCommandArgumentTable.php:45 msgid "Argument" msgstr "引数" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:91 msgid "Argument macros" msgstr "引数マクロ" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:25 msgid "Argument name" msgstr "引数å" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:313 msgid "Arguments" msgstr "引数" #: ../../../../modules/director/library/Director/DataType/DataTypeDatalist.php:66 #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:77 #: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:77 msgid "Array" msgstr "é…列" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1545 msgid "Assign where" msgstr "æ¡ä»¶å¼ã®æŒ‡å®š" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:383 msgid "Author" msgstr "作æˆè€…" #: ../../../../modules/director/library/Director/Dashboard/AutomationDashboard.php:15 msgid "Automate all tasks" msgstr "ã™ã¹ã¦ã®ã‚¿ã‚¹ã‚¯ã®è‡ªå‹•化" #: ../../../../modules/director/configuration.php:134 msgid "Automation" msgstr "自動化" #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:64 msgid "Available choices" msgstr "利用å¯èƒ½ãªãƒãƒ§ã‚¤ã‚¹" #: ../../../../modules/director/application/controllers/BasketController.php:50 #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:92 msgid "Back" msgstr "戻る" #: ../../../../modules/director/application/controllers/BasketController.php:32 #: ../../../../modules/director/application/forms/AddToBasketForm.php:60 #: ../../../../modules/director/library/Director/Web/Table/BasketTable.php:31 msgid "Basket" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆ" #: ../../../../modules/director/application/forms/BasketForm.php:32 msgid "Basket Definitions" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆã®å®šç¾©" #: ../../../../modules/director/application/forms/BasketForm.php:42 #: ../../../../modules/director/application/forms/BasketUploadForm.php:29 msgid "Basket Name" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆå" #: ../../../../modules/director/application/controllers/BasketController.php:140 msgid "Basket Snapshots" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆã®ã‚¹ãƒŠãƒƒãƒ—ショット" #: ../../../../modules/director/application/forms/BasketUploadForm.php:145 msgid "Basket has been uploaded" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸ" #: ../../../../modules/director/application/controllers/BasketController.php:76 #: ../../../../modules/director/application/controllers/BasketsController.php:17 msgid "Baskets" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆ" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:160 msgid "Blacklist" msgstr "ブラックリスト" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:148 #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:117 msgid "Caption" msgstr "キャプション" #: ../../../../modules/director/application/forms/IcingaMultiEditForm.php:261 #, php-format msgid "Changing this value affects %d object(s): %s" msgstr "ã“ã®å€¤ã‚’変更ã™ã‚‹ã¨ã€%d個ã®ã‚ªãƒ–ジェクトã«å½±éŸ¿ã—ã¾ã™: %s" #: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:57 msgid "Check Commands" msgstr "監視コマンド" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1261 msgid "Check command" msgstr "監視コマンド" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:252 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1262 msgid "Check command definition" msgstr "監視コマンドã®å®šç¾©" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1330 msgid "" "Check command timeout in seconds. Overrides the CheckCommand's timeout " "attribute" msgstr "コマンドã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ™‚é–“ã‚’ç§’å˜ä½ã§æŒ‡å®šã—ã¾ã™" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:322 msgid "Check execution" msgstr "監視ã®å®Ÿè¡Œ" #: ../../../../modules/director/application/forms/ImportCheckForm.php:23 #: ../../../../modules/director/application/forms/SyncCheckForm.php:23 msgid "Check for changes" msgstr "変更ã®ç¢ºèª" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1297 msgid "Check interval" msgstr "監視インターãƒãƒ«" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1342 msgid "Check period" msgstr "監視スケジュール" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1328 msgid "Check timeout" msgstr "監視タイムアウト" #: ../../../../modules/director/application/forms/ImportCheckForm.php:45 msgid "Checking this Import Source failed" msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®æ¤œæŸ»ãŒå¤±æ•—ã—ã¾ã—ãŸ" #: ../../../../modules/director/application/forms/SyncCheckForm.php:61 msgid "Checking this sync rule failed" msgstr "ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã®æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:419 msgid "Checksum" msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ " #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:231 msgid "Child Host" msgstr "å­ãƒ›ã‚¹ãƒˆ" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:247 msgid "Child Service" msgstr "å­ã‚µãƒ¼ãƒ“ス" #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:48 msgid "Choice name" msgstr "ãƒãƒ§ã‚¤ã‚¹å" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ChoicesDashlet.php:11 #: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:69 msgid "Choices" msgstr "ãƒãƒ§ã‚¤ã‚¹" #: ../../../../modules/director/application/forms/BasketForm.php:76 msgid "" "Choose \"All\" to always add all of them, \"Ignore\" to not care about a " "specific Type at all and opt for \"Custom Selection\" in case you want to " "choose just some specific Objects." msgstr "常ã«ã™ã¹ã¦ã‚’追加ã™ã‚‹ã«ã¯ã€Œã™ã¹ã¦ã€ã‚’ã€ç‰¹å®šã®ã‚¿ã‚¤ãƒ—ã‚’ã¾ã£ãŸãæ°—ã«" "ã—ãªã„よã†ã«ã™ã‚‹ã«ã¯ã€Œç„¡è¦–ã€ã‚’é¸æŠžã—ã€ç‰¹å®šã®ã‚ªãƒ–ジェクトã ã‘ã‚’é¸æŠžã™ã‚‹å ´åˆã¯" "ã€Œã‚«ã‚¹ã‚¿ãƒ é¸æŠžã€ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaHostForm.php:176 msgid "Choose a Host Template" msgstr "ãƒ›ã‚¹ãƒˆãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠž" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:106 msgid "Choose a service template" msgstr "ã‚µãƒ¼ãƒ“ã‚¹ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã‚’é¸æŠž" #: ../../../../modules/director/application/forms/SyncRuleForm.php:43 msgid "Choose an object type" msgstr "ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚¿ã‚¤ãƒ—ã‚’é¸æŠž" #: ../../../../modules/director/application/forms/BasketUploadForm.php:35 msgid "Choose file" msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:582 msgid "Choose the host this single service should be assigned to" msgstr "ã“ã®å˜ä¸€ã‚µãƒ¼ãƒ“スãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã‚‹ã¹ããƒ›ã‚¹ãƒˆã‚’é¸æŠž" #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:75 msgid "" "Choosing this many options will be mandatory for this Choice. Setting this " "to zero will leave this Choice optional, setting it to one results in a " "\"required\" Choice. You can use higher numbers to enforce multiple options, " "this Choice will then turn into a multi-selection element." msgstr "ã“ã®è¨­å®šã¯ã“ã®ãƒãƒ§ã‚¤ã‚¹ã«å¿…é ˆã§ã™ã€‚ ã“れをゼロã«è¨­å®šã™ã‚‹ã¨ã€" "ã“ã®ãƒãƒ§ã‚¤ã‚¹ã¯ã‚ªãƒ—ションã®ã¾ã¾ã«ãªã‚Šã€1ã«è¨­å®šã™ã‚‹ã¨ã€Œå¿…é ˆã€ã®ãƒãƒ§ã‚¤ã‚¹ã«ãªã‚Šã¾ã™ã€‚" "複数ã®ã‚ªãƒ—ションを強制ã™ã‚‹ãŸã‚ã«ã‚ˆã‚Šé«˜ã„数を使ã†ã“ã¨ãŒã§ãã¾ã™ã€" "ãã—ã¦ã“ã®ãƒãƒ§ã‚¤ã‚¹ã¯ãれã‹ã‚‰è¤‡æ•°é¸æŠžè¦ç´ ã«å¤‰ã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaZoneForm.php:37 msgid "Chose an (optional) parent zone" msgstr "(オプションã®ï¼‰è¦ªã‚¾ãƒ¼ãƒ³ã‚’é¸æŠž" #: ../../../../modules/director/application/controllers/ImportsourceController.php:122 #: ../../../../modules/director/application/controllers/SyncruleController.php:184 #: ../../../../modules/director/library/Director/Web/ActionBar/AutomationObjectActionBar.php:44 #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:309 #: ../../../../modules/director/library/Director/Web/Form/CloneImportSourceForm.php:34 #: ../../../../modules/director/library/Director/Web/Form/CloneSyncRuleForm.php:34 msgid "Clone" msgstr "複製" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:79 #, php-format msgid "Clone \"%s\"" msgstr "\"%s\"を複製" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:51 msgid "Clone Service Sets" msgstr "サービスセットを複製" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:42 msgid "Clone Services" msgstr "サービスを複製" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:71 msgid "Clone Template Fields" msgstr "テンプレートフィールドを複製" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:32 msgid "Clone the object as is, preserving imports" msgstr "インãƒãƒ¼ãƒˆã‚’ä¿æŒã—ãªãŒã‚‰ã€ã‚ªãƒ–ジェクトをãã®ã¾ã¾è¤‡è£½ã™ã‚‹" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:62 msgid "Clone this service to the very same or to another Service Set" msgstr "ã“ã®ã‚µãƒ¼ãƒ“スをã¾ã£ãŸãåŒã˜ã¾ãŸã¯åˆ¥ã®ã‚µãƒ¼ãƒ“スセットã«è¤‡è£½ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:167 #, php-format msgid "Clone: %s" msgstr "複製: %s" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1104 msgid "Cluster Zone" msgstr "クラスタゾーン" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ChoicesDashlet.php:17 msgid "" "Combine multiple templates into meaningful Choices, making life easier for " "your users" msgstr "ãƒãƒ§ã‚¤ã‚¹ã‚’利用ã™ã‚‹ã“ã¨ã§ã€ç´°åˆ†åŒ–ã•れãŸãƒ†ãƒ³ãƒ—レートをã€ç”¨é€”毎ã«" "ã¾ã¨ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹ã“ã¨ã§ã€ãƒ›ã‚¹ãƒˆã«è¤‡æ•°ã®ãƒ†ãƒ³ãƒ—レート" "を何度もインãƒãƒ¼ãƒˆã™ã‚‹æ‰‹é–“ã‚’çœãã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:59 #: ../../../../modules/director/application/forms/SyncRuleForm.php:20 #: ../../../../modules/director/library/Director/TranslationDummy.php:16 msgid "Command" msgstr "コマンド" #: ../../../../modules/director/application/forms/BasketForm.php:17 msgid "Command Definitions" msgstr "コマンド定義" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:19 msgid "Command Templates" msgstr "コマンドテンプレート" #: ../../../../modules/director/application/controllers/CommandController.php:89 #, php-format msgid "Command arguments: %s" msgstr "コマンド引数: %s" #: ../../../../modules/director/application/forms/IcingaHostForm.php:103 msgid "Command endpoint" msgstr "コマンドエンドãƒã‚¤ãƒ³ãƒˆ" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:48 msgid "Command name" msgstr "コマンドå" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:17 msgid "Command type" msgstr "コマンドタイプ" #: ../../../../modules/director/configuration.php:126 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:19 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/CommandObjectDashlet.php:13 #: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:57 msgid "Commands" msgstr "コマンド" #: ../../../../modules/director/application/controllers/BasketController.php:336 #, php-format msgid "Comparing %s \"%s\" from Snapshot \"%s\" to current config" msgstr "%s ã‚’\"%s\"ã¨æ¯”較ã—ã¾ã™ã€‚スナップショット\"%s\"ã‹ã‚‰ç¾åœ¨ã®è¨­å®šã¨ã®æ¯”較ã§ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:84 #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:93 msgid "Condition (set_if)" msgstr "æ¡ä»¶ï¼ˆset_if)" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:70 msgid "Condition format" msgstr "æ¡ä»¶ãƒ•ォーマット" #: ../../../../modules/director/application/controllers/ConfigController.php:255 #: ../../../../modules/director/application/controllers/ConfigController.php:466 #: ../../../../modules/director/application/controllers/JobController.php:101 #: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:78 #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:60 msgid "Config" msgstr "設定" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:18 msgid "Config Deployment" msgstr "è¨­å®šåæ˜ " #: ../../../../modules/director/application/controllers/ConfigController.php:441 #: ../../../../modules/director/application/forms/DeployConfigForm.php:99 #: ../../../../modules/director/application/forms/DeploymentLinkForm.php:149 msgid "Config deployment failed" msgstr "è¨­å®šåæ˜ ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" #: ../../../../modules/director/application/controllers/ConfigController.php:341 #: ../../../../modules/director/application/controllers/ConfigController.php:342 msgid "Config diff" msgstr "設定差分" #: ../../../../modules/director/application/controllers/ConfigController.php:300 #: ../../../../modules/director/application/controllers/ConfigController.php:402 #, php-format msgid "Config file \"%s\"" msgstr "設定ファイル \"%s\"" #: ../../../../modules/director/application/controllers/ConfigController.php:421 #: ../../../../modules/director/application/forms/DeployConfigForm.php:75 #: ../../../../modules/director/application/forms/DeployConfigForm.php:94 #: ../../../../modules/director/application/forms/DeploymentLinkForm.php:136 msgid "Config has been submitted, validation is going on" msgstr "設定ãŒé€ä¿¡ã•ã‚Œã€æ¤œè¨¼ãŒè¡Œã‚れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/ObjectPreview.php:40 #, php-format msgid "Config preview: %s" msgstr "設定ファイルプレビュー: %s" #: ../../../../modules/director/library/Director/ProvidedHook/Monitoring/ServiceActions.php:54 #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:82 msgid "Configuration" msgstr "設定" #: ../../../../modules/director/application/controllers/HostController.php:212 msgid "Configuration (read-only)" msgstr "設定(読ã¿è¾¼ã¿å°‚用)" #: ../../../../modules/director/application/controllers/BasketsController.php:32 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/BasketDashlet.php:11 msgid "Configuration Baskets" msgstr "æ§‹æˆãƒã‚¹ã‚±ãƒƒãƒˆ" #: ../../../../modules/director/application/forms/SettingsForm.php:89 msgid "Configuration format" msgstr "設定フォーマット" #: ../../../../modules/director/application/forms/KickstartForm.php:332 msgid "Configuration has been stored" msgstr "設定ãŒä¿å­˜ã•れã¾ã—ãŸ" #: ../../../../modules/director/application/forms/AddToBasketForm.php:111 #, php-format msgid "Configuration objects have been added to the chosen basket \"%s\"" msgstr "é¸æŠžã—ãŸãƒã‚¹ã‚±ãƒƒãƒˆ \"%s\" ã«æ§‹æˆã‚ªãƒ–ジェクトãŒè¿½åŠ ã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Web/SelfService.php:152 msgid "Configure this Agent via Self Service API" msgstr "ã“ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’セルフサービスAPIã§è¨­å®šã€‚" #: ../../../../modules/director/application/controllers/BasketController.php:229 msgid "Content Checksum" msgstr "コンテンツãƒã‚§ãƒƒã‚¯ã‚µãƒ " #: ../../../../modules/director/application/controllers/BasketsController.php:20 msgid "Create" msgstr "作æˆ" #: ../../../../modules/director/application/controllers/BasketController.php:102 msgid "Create Basket" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆã‚’作æˆ" #: ../../../../modules/director/application/forms/BasketCreateSnapshotForm.php:23 msgid "Create Snapshot" msgstr "スナップショットを作æˆ" #: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:252 #, php-format msgid "Create a new %s Apply Rule" msgstr "æ–°ã—ã„ %s é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’作æˆ" #: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:293 #, php-format msgid "Create a new %s Set" msgstr "æ–°ã—ã„ %s セットを作æˆ" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:154 #, php-format msgid "Create a new %s inheriting from this one" msgstr "ã“れを継承ã—ã¦æ–°ã—ã„%s を作æˆã™ã‚‹" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:144 #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:164 #, php-format msgid "Create a new %s inheriting from this template" msgstr "ã“ã®ãƒ†ãƒ³ãƒ—レートを継承ã—ã¦æ–°ã—ã„ %s を作æˆã™ã‚‹" #: ../../../../modules/director/application/controllers/BasketController.php:103 msgid "Create a new Configuration Basket" msgstr "æ–°ã—ã„æ§‹æˆãƒã‚¹ã‚±ãƒƒãƒˆã‚’作æˆ" #: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:23 msgid "Create a new Template" msgstr "æ–°ã—ã„テンプレートを作æˆ" #: ../../../../modules/director/library/Director/Web/ActionBar/ObjectsActionBar.php:20 msgid "Create a new object" msgstr "æ–°ã—ã„オブジェクトを作æˆ" #: ../../../../modules/director/library/Director/Web/ActionBar/ChoicesActionBar.php:20 msgid "Create a new template choice" msgstr "æ–°ã—ã„テンプレートãƒãƒ§ã‚¤ã‚¹ã‚’作æˆ" #: ../../../../modules/director/application/forms/KickstartForm.php:37 msgid "Create database schema" msgstr "データベーススキーマを作æˆ" #: ../../../../modules/director/application/forms/ApplyMigrationsForm.php:31 msgid "Create schema" msgstr "スキーマã®ä½œæˆ" #: ../../../../modules/director/application/controllers/BasketController.php:228 msgid "Created" msgstr "作æˆ" #: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:26 msgid "Critical" msgstr "Critical (å±é™º)" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:183 msgid "Current Template Usage" msgstr "ç¾åœ¨ã®ãƒ†ãƒ³ãƒ—レートã®åˆ©ç”¨çжæ³" #: ../../../../modules/director/application/forms/BasketForm.php:51 msgid "Custom Selection" msgstr "ã‚«ã‚¹ã‚¿ãƒ é¸æŠž" #: ../../../../modules/director/application/controllers/CustomvarController.php:13 msgid "Custom Variable" msgstr "カスタム変数" #: ../../../../modules/director/application/controllers/CustomvarController.php:14 #, php-format msgid "Custom Variable variants: %s" msgstr "カスタム変数ã®äºœç¨®ï¼š%s" #: ../../../../modules/director/library/Director/Web/Tabs/DataTabs.php:27 msgid "Custom Variables" msgstr "カスタム変数" #: ../../../../modules/director/application/controllers/DataController.php:76 msgid "Custom Vars - Overview" msgstr "カスタム変数 - 概è¦" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:179 msgid "Custom expression" msgstr "カスタム表ç¾" #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:183 #, php-format msgid "Custom fields: %s" msgstr "カスタムフィールド: %s" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:25 msgid "Custom notification" msgstr "Custom (カスタム通知)" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:436 #: ../../../../modules/director/library/Director/Web/Form/IcingaObjectFieldLoader.php:227 msgid "Custom properties" msgstr "カスタムプロパティ" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:67 msgid "Custom variable" msgstr "カスタム変数" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:306 msgid "Custom variable (vars.)" msgstr "カスタム変数(vars)" #: ../../../../modules/director/application/controllers/SuggestController.php:231 #: ../../../../modules/director/application/controllers/SuggestController.php:241 #: ../../../../modules/director/library/Director/Objects/IcingaHost.php:157 #: ../../../../modules/director/library/Director/Objects/IcingaService.php:710 msgid "Custom variables" msgstr "カスタム変数" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/CustomvarDashlet.php:11 msgid "CustomVar Overview" msgstr "カスタム変数概è¦" #: ../../../../modules/director/library/Director/Import/ImportSourceSql.php:40 msgid "DB Query" msgstr "DB クエリ" #: ../../../../modules/director/application/forms/KickstartForm.php:245 msgid "DB Resource" msgstr "DBリソース" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:15 msgid "DN component" msgstr "DN コンãƒãƒ¼ãƒãƒ³ãƒˆ" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:25 msgid "DNS record type" msgstr "DNSレコードタイプ" #: ../../../../modules/director/application/controllers/DataController.php:62 msgid "Data Fields" msgstr "データフィールド" #: ../../../../modules/director/application/controllers/DataController.php:53 msgid "Data List" msgstr "データリスト" #: ../../../../modules/director/application/forms/SyncRuleForm.php:19 msgid "Data List Entry" msgstr "データリストエントリ" #: ../../../../modules/director/application/controllers/DataController.php:47 #, php-format msgid "Data List: %s" msgstr "データリスト: %s" #: ../../../../modules/director/application/forms/BasketForm.php:28 msgid "Data Lists" msgstr "データリスト" #: ../../../../modules/director/library/Director/Web/Tabs/DataTabs.php:21 msgid "Data fields" msgstr "データフィールド" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:131 msgid "" "Data fields allow you to customize input controls for Icinga custom " "variables. Once you defined them here, you can provide them through your " "defined templates. This gives you a granular control over what properties " "your users should be allowed to configure in which way." msgstr "データフィールドを使用ã™ã‚‹ã¨ã€ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã«å…¥åŠ›ã™ã‚‹å€¤ã‚’" "カスタマイズã§ãã¾ã™ã€‚" "具体的ã«ã¯ã‚¿ã‚¤ãƒ—を数値ã«é™å®šã—ãŸã‚Šã€ãƒ‡ãƒ¼ã‚¿ã®ãƒªã‚¹ãƒˆã‚’é¸æŠžã•ã›ã‚‹ã‚ˆã†ãªå…¥åŠ›ã‚’" "ユーザã«å¼·åˆ¶ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DatafieldDashlet.php:17 msgid "Data fields make sure that configuration fits your rules" msgstr "データフィールドを使用ã™ã‚‹ã¨ã€Icingaカスタム変数ã®å…¥åŠ›åˆ¶é™ã‚’カスタマイズã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€è¨­å®šãŒãƒ«ãƒ¼ãƒ«ã«å¾“ã†ã“ã¨ã‚’確èªã§ãã¾ã™" #: ../../../../modules/director/application/forms/DirectorDatalistForm.php:24 msgid "Data list" msgstr "データリスト" #: ../../../../modules/director/application/controllers/DataController.php:20 #: ../../../../modules/director/library/Director/Web/Tabs/DataTabs.php:24 msgid "Data lists" msgstr "データリスト" #: ../../../../modules/director/application/forms/DirectorDatalistForm.php:15 msgid "" "Data lists are mainly used as data providers for custom variables presented " "as dropdown boxes boxes. You can manually manage their entries here in " "place, but you could also create dedicated sync rules after creating a new " "empty list. This would allow you to keep your available choices in sync with " "external data providers" msgstr "データリストã¯ã€ãƒ‰ãƒ­ãƒƒãƒ—ダウンボックスボックスã¨ã—ã¦è¡¨ç¤ºã•れる" "カスタム変数ã®ãƒ‡ãƒ¼ã‚¿ãƒ—ロãƒã‚¤ãƒ€ã¨ã—ã¦ä¸»ã«ä½¿ç”¨ã•れã¾ã™ã€‚ ã“ã“ã§æ‰‹å‹•ã§" "エントリを管ç†ã§ãã¾ã™ãŒã€æ–°ã—ã„空ã®ãƒªã‚¹ãƒˆã‚’作æˆã—ãŸå¾Œã«å°‚用ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’" "作æˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ ã“れã«ã‚ˆã‚Šã€åˆ©ç”¨å¯èƒ½ãªé¸æŠžè‚¢ã‚’外部ã®" "データプロãƒã‚¤ãƒ€ã¨åŒæœŸã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:174 msgid "Data type" msgstr "データタイプ" #: ../../../../modules/director/application/forms/KickstartForm.php:295 msgid "Database backend" msgstr "データベースãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:384 msgid "Date" msgstr "日付" #: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:21 #: ../../../../modules/director/library/Director/Web/Table/IcingaTimePeriodRangeTable.php:45 msgid "Day(s)" msgstr "日付・曜日" #: ../../../../modules/director/application/forms/SettingsForm.php:98 msgid "" "Default configuration format. Please note that v1.x is for special " "transitional projects only and completely unsupported. There are no plans to " "make Director a first-class configuration backends for Icinga 1.x" msgstr "デフォルトã®è¨­å®šãƒ•ォーマット。 ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.x ã¯ç‰¹åˆ¥ãªç§»è¡Œãƒ—ロジェクト" "専用ã§ã€å®Œå…¨ã«ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。 Icinga 1.xã§ã¯ã€Directorã‚’" "ã‚‚ã£ã¨ã‚‚推奨ã™ã‚‹è¨­å®šãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã«ã™ã‚‹è¨ˆç”»ã¯ã‚りã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/SettingsForm.php:32 msgid "Default global zone" msgstr "デフォルトã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚¾ãƒ¼ãƒ³" #: ../../../../modules/director/library/Director/Dashboard/CommandsDashboard.php:23 msgid "" "Define Check-, Notification- or Event-Commands. Command definitions are the " "glue between your Host- and Service-Checks and the Check plugins on your " "Monitoring (or monitored) systems" msgstr "監視ã€é€šçŸ¥ã€ã¾ãŸã¯ã‚¤ãƒ™ãƒ³ãƒˆã‚³ãƒžãƒ³ãƒ‰ã‚’定義ã—ã¾ã™ã€‚ コマンド定義ã¯ã€" "Host-Checkã¨Service-Checkã€ãŠã‚ˆã³Monitoring(ã¾ãŸã¯ç›£è¦–対象)システムã®Checkプラグインをçµã³ã¤ã‘ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DatafieldDashlet.php:11 msgid "Define Data Fields" msgstr "データフィールドã®å®šç¾©" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:17 msgid "" "Define Host Groups to give your configuration more structure. They are " "useful for Dashboards, Notifications or Restrictions" msgstr "設定をより構造化ã™ã‚‹ãŸã‚ã«ãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—を定義ã—ã¾ã™ã€‚ダッシュボードã€" "通知ã€åˆ¶é™ã«æ´»ç”¨ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:103 msgid "" "Define a download Url or local directory from which the a specific Icinga 2 " "Agent MSI Installer package should be fetched. Please ensure to only define " "the base download Url or Directory. The Module will generate the MSI file " "name based on your operating system architecture and the version to install. " "The Icinga 2 MSI Installer name is internally build as follows: Icinga2-" "v[InstallAgentVersion]-[OSArchitecture].msi (full example: Icinga2-v2.6.3-" "x86_64.msi)" msgstr "特定ã®Icinga 2 Agent MSIインストーラパッケージをå–å¾—ã™ã‚‹ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰" "URLã¾ãŸã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’定義ã—ã¾ã™ã€‚ 基本ダウンロードURLã¾ãŸã¯" "ディレクトリã®ã¿ã‚’定義ã—ã¦ãã ã•ã„。 モジュールã¯ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®" "アーキテクãƒãƒ£ã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«åŸºã¥ã„ã¦MSIファイルåを生æˆ" "ã—ã¾ã™ã€‚ Icinga 2 MSIインストーラーåã¯ã€å†…éƒ¨çš„ã«æ¬¡ã®ã‚ˆã†ã«æ§‹ç¯‰ã•れã¦ã„ã¾ã™ã€‚" "Icinga2-v [InstallAgentVersion] - [OSArchitecture] .msi" "(完全ãªä¾‹ï¼šIcinga2-v2.6.3-x86_64.msi)" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:29 msgid "Define and manage imports from various data sources" msgstr "ã•ã¾ã–ã¾ãªãƒ‡ãƒ¼ã‚¿ã‚½ãƒ¼ã‚¹ã‹ã‚‰ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’定義ãŠã‚ˆã³ç®¡ç†ã—ã¾ã™" #: ../../../../modules/director/library/Director/Dashboard/TimeperiodsDashboard.php:14 msgid "Define custom Time Periods" msgstr "カスタムスケジュールã®å®šç¾©" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/SyncDashlet.php:29 msgid "Define how imported data should be synchronized with Icinga" msgstr "インãƒãƒ¼ãƒˆã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’Icingaã¨åŒæœŸã•ã›ã‚‹æ–¹æ³•を定義ã—ã¾ã™" #: ../../../../modules/director/application/forms/SyncRuleForm.php:51 msgid "" "Define what should happen when an object with a matching key already exists. " "You could merge its properties (import source wins), replace it completely " "with the imported object or ignore it (helpful for one-time imports)" msgstr "一致ã™ã‚‹ã‚­ãƒ¼ã‚’æŒã¤ã‚ªãƒ–ジェクトãŒã™ã§ã«å­˜åœ¨ã™ã‚‹ã¨ãã«ä½•ãŒèµ·ã“ã‚‹ã‹ã‚’" "定義ã—ã¾ã™ã€‚ プロパティã¯ãƒžãƒ¼ã‚¸ã™ã‚‹ã“ã¨ãŒã§ã(インãƒãƒ¼ãƒˆå…ƒãŒå„ªå…ˆï¼‰ã€" "ãれをインãƒãƒ¼ãƒˆã•れãŸã‚ªãƒ–ジェクトã¨å®Œå…¨ã«ç½®ãæ›ãˆã‚‹ã‹ã€" "ã‚ã‚‹ã„ã¯ç„¡è¦–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼ˆä¸€å›žé™ã‚Šã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å½¹ç«‹ã¡ã¾ã™ï¼‰" #: ../../../../modules/director/library/Director/Dashboard/ObjectsDashboard.php:17 msgid "Define whatever you want to be monitored" msgstr "監視対象を定義" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1319 msgid "Defines after how many check attempts a new hard state is reached" msgstr "異常(hard state)ã¨åˆ¤å®šã™ã‚‹ã¾ã§ã®ç›£è¦–ã®æœ€å¤§è©¦è¡Œå›žæ•°" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:17 msgid "" "Defining Notifications for User Groups instead of single Users gives more " "flexibility" msgstr "å˜ä¸€ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã¯ãªãユーザーグループã®é€šçŸ¥ã‚’定義ã™ã‚‹ã¨ã€" "柔軟性ãŒå‘上ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:17 msgid "" "Defining Service Groups get more structure. Great for Dashboards. " "Notifications and Permissions might be based on groups." msgstr "サービスグループを定義ã™ã‚‹ã¨ã€ã‚ˆã‚Šæ§‹é€ ãŒã‚ã‹ã‚Šã¾ã™ã€‚ ダッシュボードã«" "最é©ã§ã™ã€‚ 通知ã¨è¨±å¯ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«åŸºã¥ã„ã¦ã„ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:196 msgid "Delay until the first notification should be sent" msgstr "最åˆã®é€šçŸ¥æ™‚é–“" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:185 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:869 msgid "Delete" msgstr "削除" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:13 msgid "Delimiter" msgstr "分割å­" #: ../../../../modules/director/application/forms/BasketForm.php:27 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:13 msgid "Dependency" msgstr "ä¾å­˜é–¢ä¿‚オブジェクト" #: ../../../../modules/director/application/forms/DeploymentLinkForm.php:85 msgid "Deploy" msgstr "è¨­å®šåæ˜ " #: ../../../../modules/director/application/forms/DeployConfigForm.php:39 #, php-format msgid "Deploy %d pending changes" msgstr "%d 個ã®ä¿ç•™ã•れãŸå¤‰æ›´ã‚’åæ˜ " #: ../../../../modules/director/library/Director/Dashboard/DeploymentDashboard.php:15 msgid "Deploy configuration to your Icinga nodes" msgstr "Icingaノードã¸ã®è¨­å®šã®å映" #: ../../../../modules/director/library/Director/Job/ConfigJob.php:195 msgid "Deploy modified config" msgstr "変更ã•れãŸè¨­å®šã‚’åæ˜ " #: ../../../../modules/director/application/controllers/ConfigController.php:248 #: ../../../../modules/director/application/controllers/ConfigController.php:458 #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:54 msgid "Deployment" msgstr "è¨­å®šåæ˜ " #: ../../../../modules/director/application/forms/SettingsForm.php:133 msgid "Deployment Path" msgstr "åæ˜ ãƒ‘ス" #smori #: ../../../../modules/director/application/controllers/DeploymentController.php:22 msgid "Deployment details" msgstr "è¨­å®šåæ˜ çµæžœã®è©³ç´°" #: ../../../../modules/director/application/forms/SettingsForm.php:118 msgid "Deployment mode" msgstr "è¨­å®šåæ˜ ãƒ¢ãƒ¼ãƒ‰" #: ../../../../modules/director/application/forms/SettingsForm.php:127 msgid "Deployment mode for Icinga 1 configuration" msgstr "Icinga1ã®è¨­å®šå映モード" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:77 msgid "Deployment time" msgstr "è¨­å®šåæ˜ æ™‚刻" #: ../../../../modules/director/configuration.php:143 #: ../../../../modules/director/application/controllers/ConfigController.php:50 #: ../../../../modules/director/library/Director/Web/Tabs/InfraTabs.php:36 msgid "Deployments" msgstr "è¨­å®šåæ˜ " #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:157 #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:125 #: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:100 #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:56 #: ../../../../modules/director/application/forms/ImportRowModifierForm.php:54 #: ../../../../modules/director/application/forms/ImportSourceForm.php:24 #: ../../../../modules/director/application/forms/SyncRuleForm.php:33 msgid "Description" msgstr "説明" #: ../../../../modules/director/library/Director/Web/Table/SyncpropertyTable.php:63 msgid "Destination" msgstr "宛先" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:48 msgid "Destination Field" msgstr "宛先フィールド" #: ../../../../modules/director/application/controllers/HealthController.php:31 msgid "" "Did you know that you can run this entire Health Check (or just some " "sections) as an Icinga Check on a regular base?" msgstr "ã“ã®è¨­å®šçжæ³ã®ç¢ºèªã‚’定期的ã«Icingaã®ç›£è¦–ã¨ã—ã¦å®Ÿè¡Œã§ãã¾ã™" #: ../../../../modules/director/application/controllers/ConfigController.php:403 #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:249 msgid "Diff" msgstr "差分" #: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:74 msgid "Diff with other config" msgstr "ã»ã‹ã®è¨­å®šã¨ã®å·®åˆ†" #: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:55 msgid "Direct" msgstr "直接" #: ../../../../modules/director/application/controllers/HealthController.php:23 msgid "Director Health" msgstr "Director 正常性" #: ../../../../modules/director/application/controllers/KickstartController.php:13 msgid "Director Kickstart Wizard" msgstr "Director キックスタートウィザード" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/SettingsDashlet.php:11 msgid "Director Settings" msgstr "director設定" #: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:79 msgid "Director database schema has not been created yet" msgstr "Director データベーススキーマãŒã¾ã ä½œæˆã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:156 msgid "Disable Checks" msgstr "監視を無効化" # smori #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:164 msgid "Disable Notifications" msgstr "通知を無効化" #: ../../../../modules/director/application/forms/SettingsForm.php:54 msgid "Disable all Jobs" msgstr "ã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–を無効化" #: ../../../../modules/director/application/forms/DirectorJobForm.php:37 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1222 msgid "Disabled" msgstr "無効" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1223 msgid "Disabled objects will not be deployed" msgstr "無効化ã•れãŸã‚ªãƒ–ジェクトã¯è¨­å®šã®å映ãŒã•れã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:20 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1238 msgid "Display Name" msgstr "表示å" #: ../../../../modules/director/application/forms/IcingaHostForm.php:333 #: ../../../../modules/director/application/forms/IcingaUserForm.php:133 msgid "Display name" msgstr "表示å" #: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:42 msgid "Distinct Commands" msgstr "個別ã®ã‚³ãƒžãƒ³ãƒ‰" #: ../../../../modules/director/library/Director/Dashboard/DataDashboard.php:15 msgid "Do more with custom data" msgstr "カスタムデータã§é«˜åº¦ã«è¨­å®š" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:36 msgid "Do not transform at all" msgstr "å…¨ã変æ›ã—ãªã„" #: ../../../../modules/director/library/Director/Web/SelfService.php:104 #: ../../../../modules/director/library/Director/Web/SelfService.php:157 msgid "Documentation" msgstr "ドキュメント" #: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:21 msgid "Down" msgstr "Down (åœæ­¢)" #: ../../../../modules/director/application/controllers/BasketController.php:212 #: ../../../../modules/director/application/controllers/SchemaController.php:80 #: ../../../../modules/director/library/Director/Web/SelfService.php:227 #: ../../../../modules/director/library/Director/Web/SelfService.php:240 msgid "Download" msgstr "ダウンロード" #: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:59 msgid "Download as JSON" msgstr "JSONå½¢å¼ã§ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:70 msgid "Download from a custom url" msgstr "カスタムURLã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:69 msgid "Download from packages.icinga.com" msgstr "packages.icinga.com ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:30 msgid "Downtime ends" msgstr "DowntimeEnd (ダウンタイムã®çµ‚了)" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:31 msgid "Downtime removed" msgstr "DowntimeRemoved (ダウンタイムã®å‰Šé™¤)" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:29 msgid "Downtime starts" msgstr "DowntimeStart (ダウンタイムã®é–‹å§‹)" #: ../../../../modules/director/application/forms/IcingaForgetApiKeyForm.php:22 msgid "Drop Self Service API key" msgstr "セルフサービスAPIキーを削除" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:83 #: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:26 msgid "Duration" msgstr "継続" #: ../../../../modules/director/application/controllers/DatafieldController.php:38 msgid "Edit a Field" msgstr "フィールドを編集" #: ../../../../modules/director/application/controllers/DataController.php:151 msgid "Edit list" msgstr "リストを編集" #: ../../../../modules/director/application/forms/IcingaUserForm.php:36 msgid "Email" msgstr "Eメール" #: ../../../../modules/director/application/forms/SettingsForm.php:69 msgid "Enable audit log" msgstr "audit ログを有効ã«ã™ã‚‹" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1372 msgid "Enable event handler" msgstr "イベントãƒãƒ³ãƒ‰ãƒ©ã‚’有効ã«ã™ã‚‹" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1384 msgid "Enable flap detection" msgstr "フラップ検知を有効ã«ã™ã‚‹" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:24 #: ../../../../modules/director/application/forms/SyncRuleForm.php:22 #: ../../../../modules/director/library/Director/Web/Table/ObjectsTableEndpoint.php:19 msgid "Endpoint" msgstr "エンドãƒã‚¤ãƒ³ãƒˆ" #: ../../../../modules/director/application/forms/KickstartForm.php:117 msgid "Endpoint Name" msgstr "エンドãƒã‚¤ãƒ³ãƒˆå" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:31 msgid "Endpoint address" msgstr "エンドãƒã‚¤ãƒ³ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:18 msgid "Endpoint template name" msgstr "エンドãƒã‚¤ãƒ³ãƒˆãƒ†ãƒ³ãƒ—レートå" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:17 #: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:59 msgid "Endpoints" msgstr "エンドãƒã‚¤ãƒ³ãƒˆ" #: ../../../../modules/director/application/controllers/PhperrorController.php:12 msgid "Error" msgstr "エラー" #: ../../../../modules/director/application/forms/IcingaHostForm.php:86 msgid "Establish connection" msgstr "親ノードã‹ã‚‰ã®æŽ¥ç¶š" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:608 msgid "" "Evaluates the apply for rule for all objects with the custom attribute " "specified. E.g selecting \"host.vars.custom_attr\" will generate \"for " "(config in host.vars.array_var)\" where \"config\" will be accessible " "through \"$config$\". NOTE: only custom variables of type \"Array\" are " "eligible." msgstr "ã‚«ã‚¹ã‚¿ãƒ å±žæ€§ãŒæŒ‡å®šã•れã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã®ãƒ«ãƒ¼ãƒ«é©ç”¨ã‚’" "評価ã—ã¾ã™ã€‚ 例ãˆã°\"host.vars.custom_attr\"ã‚’é¸æŠžã™ã‚‹ã¨ " "\"for(config.host.vars.array_var)\"ãŒç”Ÿæˆã•れã¾ã™ã€‚ã“ã“ã§ " "\"config\"㯠\"$config$\"を通ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã§ã™ã€‚ " "注:タイプ \"é…列\"ã®ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã®ã¿ãŒå¯¾è±¡ã§ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1276 msgid "Event command" msgstr "イベントコマンド" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1277 msgid "Event command definition" msgstr "イベントコマンドã®å®šç¾©" #: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:70 msgid "Exclude other time periods from this." msgstr "指定ã—ãŸã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«è¨­å®šã®æœŸé–“を除外ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:67 msgid "Exclude period" msgstr "除外スケジュールã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1354 msgid "Execute active checks" msgstr "アクティブ監視を実行ã™ã‚‹" #: ../../../../modules/director/application/forms/DirectorJobForm.php:48 msgid "Execution interval for this job, in seconds" msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã®å®Ÿè¡Œé–“隔。秒å˜ä½" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:249 msgid "Existing Data Lists" msgstr "存在ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆ" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:234 msgid "Existing templates" msgstr "存在ã™ã‚‹ãƒ†ãƒ³ãƒ—レート" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:178 msgid "Expert mode" msgstr "エキスパートモード" #: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:33 msgid "External" msgstr "外部" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:19 msgid "External Commands" msgstr "外部コマンド" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:12 msgid "" "External Commands have been defined in your local Icinga 2 Configuration." msgstr "外部コマンドã¯ãƒ­ãƒ¼ã‚«ãƒ«ã®Icinga 2 設定ã«ã¦å®šç¾©ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:19 msgid "External Notification Commands" msgstr "外部通知コマンド" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:12 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:12 msgid "" "External Notification Commands have been defined in your local Icinga 2 " "Configuration. " msgstr "外部通知コマンドã¯ãƒ­ãƒ¼ã‚«ãƒ«ã®Icinga 2 設定ã«ã¦å®šç¾©ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:141 msgid "Failed" msgstr "失敗" #: ../../../../modules/director/application/forms/IcingaImportObjectForm.php:42 #, php-format msgid "Failed to import %s \"%s\"" msgstr "%s ã® \"%s\"ã¸ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆãŒå¤±æ•—ã—ã¾ã—ãŸã€‚" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:188 msgid "Field has been removed" msgstr "フィールドãŒå‰Šé™¤ã•れã¾ã—ãŸ" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:139 #: ../../../../modules/director/library/Director/Web/Table/DatafieldTable.php:48 #: ../../../../modules/director/library/Director/Web/Table/IcingaObjectDatafieldTable.php:50 msgid "Field name" msgstr "フィールドå" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:175 msgid "Field type" msgstr "フィールドタイプ" #: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:103 msgid "Fields" msgstr "フィールド" #: ../../../../modules/director/library/Director/Web/Table/ConfigFileDiffTable.php:82 #: ../../../../modules/director/library/Director/Web/Table/GeneratedConfigFileTable.php:84 msgid "File" msgstr "ファイル" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:102 #: ../../../../modules/director/application/forms/SyncRuleForm.php:79 msgid "Filter Expression" msgstr "フィルタ表ç¾" #: ../../../../modules/director/configuration.php:52 msgid "Filter available notification apply rules" msgstr "利用å¯èƒ½ãªé€šçŸ¥é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’フィルタリング" #: ../../../../modules/director/configuration.php:45 msgid "Filter available service apply rules" msgstr "利用å¯èƒ½ãªã‚µãƒ¼ãƒ“スé©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’フィルタリング" #: ../../../../modules/director/configuration.php:59 msgid "" "Filter available service set templates. Use asterisks (*) as wildcards, like " "in DB* or *net*" msgstr "利用å¯èƒ½ãªã‚µãƒ¼ãƒ“スセットテンプレートをフィルタリング。" "「DB*ã€ã€ã€Œ*net*ã€ã®ã‚ˆã†ã«ã€ã‚¢ã‚¹ã‚¿ãƒªã‚¹ã‚¯(*)をワイルドカードã¨ã—ã¦ä½¿ã†ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:29 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:27 msgid "Filter method" msgstr "フィルタメソッド" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:33 msgid "First Element" msgstr "第一è¦ç´ " #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:194 msgid "First notification delay" msgstr "最åˆã®é€šçŸ¥ã®é…å»¶" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:33 msgid "Flapping" msgstr "フラッピング" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:35 msgid "Flapping ends" msgstr "FlappingEnd (フラッピング終了)" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1405 msgid "" "Flapping lower bound in percent for a service to be considered not flapping" msgstr "サービスをフラッピング状態ã¨ã¿ãªã™ãŸã‚ã®ä¸‹é™å€¤(%å˜ä½)" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:34 msgid "Flapping starts" msgstr "FlappingStart (フラッピング開始)" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1392 msgid "Flapping threshold (high)" msgstr "フラッピング閾値(上é™ï¼‰" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1403 msgid "Flapping threshold (low)" msgstr "フラッピング閾値(下é™ï¼‰" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1394 msgid "Flapping upper bound in percent for a service to be considered flapping" msgstr "サービスをフラッピング状態ã¨ã¿ãªã™ãŸã‚ã®ä¸Šé™å€¤(%å˜ä½)" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:33 msgid "Flatten all inherited properties, strip imports" msgstr "継承ã•れãŸã™ã¹ã¦ã®ãƒ—ロパティを統åˆã—ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’削除ã—ã¾ã™" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:87 msgid "Flush API directory" msgstr "APIディレクトリをフラッシュã™ã‚‹" #: ../../../../modules/director/library/Director/Web/SelfService.php:223 msgid "For manual configuration" msgstr "手動設定用" #: ../../../../modules/director/library/Director/Job/ConfigJob.php:181 msgid "Force rendering" msgstr "強制的ã«è¨­å®šã‚’生æˆã™ã‚‹" #: ../../../../modules/director/library/Director/Objects/DirectorDatafield.php:160 #, php-format msgid "Form element could not be created, %s is missing" msgstr "フォームè¦ç´ ãŒä½œæˆã§ãã¾ã›ã‚“。%s ãŒã‚りã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Web/Form/QuickForm.php:456 #: ../../../../modules/director/library/Director/Web/Form/QuickForm.php:481 msgid "Form has successfully been sent" msgstr "ãƒ•ã‚©ãƒ¼ãƒ ã¯æ­£å¸¸ã«é€ä¿¡ã•れã¾ã—ãŸ" #: ../../../../modules/director/application/forms/IcingaHostVarForm.php:32 #: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:32 msgid "Format" msgstr "フォーマット" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:269 msgid "Former object" msgstr "以å‰ã®ã‚ªãƒ–ジェクト" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:24 msgid "Fully qualified domain name (FQDN)" msgstr "完全修飾ドメインå(FQDN)" #: ../../../../modules/director/application/forms/IcingaGenerateApiKeyForm.php:24 msgid "Generate Self Service API key" msgstr "セルフサービスAPIキーを生æˆ" #: ../../../../modules/director/library/Director/Web/SelfService.php:121 msgid "Generate a new key" msgstr "æ–°ã—ã„éµã‚’生æˆ" #: ../../../../modules/director/application/controllers/ConfigController.php:259 msgid "Generated config" msgstr "設定を生æˆã—ã¾ã—ãŸ" #: ../../../../modules/director/application/controllers/HostController.php:149 #: ../../../../modules/director/application/controllers/HostController.php:229 msgid "Generated from host vars" msgstr "ホスト変数ã‹ã‚‰ç”Ÿæˆã—ã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Dashboard/AlertsDashboard.php:15 msgid "Get alerts when something goes wrong" msgstr "障害発生時ã®ã‚¢ãƒ©ãƒ¼ãƒˆé€šçŸ¥" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/CustomvarDashlet.php:17 msgid "Get an overview of used CustomVars and their variants" msgstr "使用ã•れã¦ã„るカスタム変数ã¨ãã®çжæ³ã®æ¦‚è¦ã§ã™" #: ../../../../modules/director/application/controllers/ConfigController.php:219 msgid "Global Director Settings" msgstr "グローãƒãƒ«Director設定" #: ../../../../modules/director/library/Director/Web/SelfService.php:97 msgid "Global Self Service Setting" msgstr "グローãƒãƒ«ã‚»ãƒ«ãƒ•サービス設定" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:44 msgid "Global Zones" msgstr "グローãƒãƒ«ã‚¾ãƒ¼ãƒ³" #: ../../../../modules/director/application/forms/IcingaZoneForm.php:22 msgid "Global zone" msgstr "グローãƒãƒ«ã‚¾ãƒ¼ãƒ³" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJoin.php:13 msgid "Glue" msgstr "接ç€å‰¤" #: ../../../../modules/director/library/Director/Web/ActionBar/DirectorBaseActionBar.php:40 #, php-format msgid "Go back to \"%s\" Dashboard" msgstr "\"%s\" ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã«æˆ»ã‚‹" #: ../../../../modules/director/library/Director/Job/ConfigJob.php:207 msgid "Grace period" msgstr "猶予期間" #: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:59 msgid "Group" msgstr "グループ" #: ../../../../modules/director/application/forms/IcingaHostForm.php:233 msgid "" "Group has been inherited, but will be overridden by locally assigned group(s)" msgstr "グループã¯ç¶™æ‰¿ã•れã¾ã—ãŸãŒã€ãƒ­ãƒ¼ã‚«ãƒ«ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•れã¾ã™" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:316 msgid "Group membership" msgstr "グループã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—" #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:257 #, php-format msgid "Group membership: %s" msgstr "グループã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—: %s" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:17 msgid "" "Grouping your Services into Sets allow you to quickly assign services often " "used together in a single operation all at once" msgstr "サービスをセットã«ã‚°ãƒ«ãƒ¼ãƒ—化ã™ã‚‹ã¨ã€ä¸€åº¦ã«1ã¤ã®æ“作ã§ä¸€ç·’ã«ä½¿ç”¨ã•れる" "ã“ã¨ãŒå¤šã„サービスを一度ã«ç´ æ—©ã割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaHostForm.php:203 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:630 #: ../../../../modules/director/application/forms/IcingaUserForm.php:109 #: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:60 msgid "Groups" msgstr "グループ" #: ../../../../modules/director/application/controllers/DashboardController.php:51 #: ../../../../modules/director/application/controllers/HealthController.php:19 msgid "Health" msgstr "director ã®è¨­å®šçжæ³" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:17 msgid "Here you can find all single services directly attached to single hosts" msgstr "å˜ä¸€ã®ãƒ›ã‚¹ãƒˆã«ç›´æŽ¥æŽ¥ç¶šã•れã¦ã„ã‚‹ã™ã¹ã¦ã®å˜ä¸€ã®ã‚µãƒ¼ãƒ“スを" "見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:81 msgid "Hidden" msgstr "éš ã•れã¦ã„ã¾ã™" #: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:70 msgid "Hide SQL" msgstr "SQLã‚’éš ã™" #: ../../../../modules/director/application/controllers/HealthController.php:29 msgid "Hint: Check Plugin" msgstr "ヒント:監視プラグイン" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:154 msgid "Hints regarding this service" msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã«é–¢ã™ã‚‹ãƒ’ント" #: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:45 #: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:95 #: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:39 msgid "History" msgstr "履歴" #: ../../../../modules/director/application/controllers/ServiceController.php:53 #: ../../../../modules/director/application/forms/IcingaHostVarForm.php:15 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:578 #: ../../../../modules/director/application/forms/SyncRuleForm.php:12 #: ../../../../modules/director/library/Director/TranslationDummy.php:13 #: ../../../../modules/director/library/Director/Web/Table/ObjectsTableEndpoint.php:20 msgid "Host" msgstr "ホスト" #: ../../../../modules/director/application/controllers/SuggestController.php:240 #: ../../../../modules/director/library/Director/Objects/IcingaService.php:723 msgid "Host Custom variables" msgstr "ホストカスタム変数" #: ../../../../modules/director/application/forms/BasketForm.php:18 #: ../../../../modules/director/application/forms/SyncRuleForm.php:13 msgid "Host Group" msgstr "ホストグループ" msgid "HostGroup" msgstr "ホストグループ" msgid "HostGroups" msgstr "ホストグループ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:11 msgid "Host Groups" msgstr "ホストグループ" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:19 msgid "Host Name" msgstr "ホストå" #: ../../../../modules/director/application/forms/IcingaHostForm.php:157 #: ../../../../modules/director/application/forms/IcingaHostForm.php:174 msgid "Host Template" msgstr "ホストテンプレート" #: ../../../../modules/director/application/forms/BasketForm.php:19 msgid "Host Template Choice" msgstr "ホストテンプレートãƒãƒ§ã‚¤ã‚¹" #: ../../../../modules/director/application/forms/BasketForm.php:20 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:11 msgid "Host Templates" msgstr "ホストテンプレート" #: ../../../../modules/director/application/forms/IcingaHostForm.php:308 #: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:35 msgid "Host address" msgstr "ホストアドレス" #: ../../../../modules/director/application/forms/IcingaHostForm.php:310 #: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:37 msgid "" "Host address. Usually an IPv4 address, but may be any kind of address your " "check plugin is able to deal with" msgstr "ホストアドレス。 通常ã¯IPv4アドレスã§ã™ãŒã€ç›£è¦–ãƒ—ãƒ©ã‚°ã‚¤ãƒ³ãŒæ‰±ã†å…¨ã¦ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’利用ã§ãã¾ã™ã€‚" #: ../../../../modules/director/configuration.php:64 msgid "Host configs" msgstr "ホスト設定" #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:55 msgid "Host groups" msgstr "ホストグループ" #: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:25 msgid "Host name" msgstr "ホストå" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:25 msgid "Host name (local part, without domain)" msgstr "ホストå(ドメインãªã—ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ‘ート)" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostObjectDashlet.php:13 msgid "Host objects" msgstr "ホストオブジェクト" #: ../../../../modules/director/application/controllers/SuggestController.php:230 #: ../../../../modules/director/application/controllers/SuggestController.php:239 #: ../../../../modules/director/library/Director/Objects/IcingaHost.php:156 #: ../../../../modules/director/library/Director/Objects/IcingaService.php:722 msgid "Host properties" msgstr "ホストプロパティ" #: ../../../../modules/director/application/controllers/TemplatechoiceController.php:17 msgid "Host template choice" msgstr "ホストテンプレートã®é¸æŠž" #: ../../../../modules/director/application/controllers/TemplatechoicesController.php:19 msgid "Host template choices" msgstr "ホストテンプレートã®é¸æŠž" #: ../../../../modules/director/application/forms/IcingaHostGroupForm.php:14 msgid "Hostgroup" msgstr "ホストグループ" #: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:61 msgid "Hostgroups" msgstr "ホストグループ" #: ../../../../modules/director/application/forms/IcingaHostForm.php:206 msgid "" "Hostgroups that should be directly assigned to this node. Hostgroups can be " "useful for various reasons. You might assign service checks based on " "assigned hostgroup. They are also often used as an instrument to enforce " "restricted views in Icinga Web 2. Hostgroups can be directly assigned to " "single hosts or to host templates. You might also want to consider assigning " "hostgroups using apply rules" msgstr "ã“ã®ãƒŽãƒ¼ãƒ‰ã«ç›´æŽ¥å‰²ã‚Šå½“ã¦ã‚‹å¿…è¦ãŒã‚るホストグループ。 " "ホストグループã¯ã•ã¾ã–ã¾ãªç†ç”±ã§å½¹ã«ç«‹ã¡ã¾ã™ã€‚ 割り当ã¦ã‚‰ã‚ŒãŸ" "ホストグループã«åŸºã¥ã„ã¦ã‚µãƒ¼ãƒ“ス監視を割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" " ãれらã¯ã€Icinga Web 2ã§åˆ¶é™ä»˜ãビューを強制ã™ã‚‹æ‰‹æ®µã¨ã—ã¦ã‚‚よã" "使用ã•れã¾ã™ã€‚ホストグループã¯ã€å˜ä¸€ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ãƒ›ã‚¹ãƒˆãƒ†ãƒ³ãƒ—レートã«" "直接割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’使用ã—ã¦ãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—ã‚’" "割り当ã¦ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaHostForm.php:39 #: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetHostTable.php:38 msgid "Hostname" msgstr "ホストå" #: ../../../../modules/director/configuration.php:118 #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:99 #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:89 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:688 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostsDashlet.php:11 #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:54 #: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:19 #: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:60 #: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:43 #: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:58 msgid "Hosts" msgstr "ホスト" #: ../../../../modules/director/application/controllers/ServicesetController.php:81 #, php-format msgid "Hosts using this set: %s" msgstr "ã“ã®ã‚»ãƒƒãƒˆã‚’利用ã—ã¦ã„るホスト: %s" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:32 msgid "IP address / hostname of remote node" msgstr "リモートノードã®IP アドレス / ホストå" #: ../../../../modules/director/application/forms/KickstartForm.php:129 msgid "" "IP address / hostname of your Icinga node. Please note that this information " "will only be used for the very first connection to your Icinga instance. The " "Director then relies on a correctly configured Endpoint object. Correctly " "configures means that either it's name is resolvable or that it's host " "property contains either an IP address or a resolvable host name. Your " "Director must be able to reach this endpoint" msgstr "Icingaノードã®IPアドレス/ホストå。 ã“ã®æƒ…å ±ã¯ã€" "Icingaインスタンスã¸ã®æœ€åˆã®æŽ¥ç¶šã«ã®ã¿ä½¿ç”¨ã•れるã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。" "ãã®å¾Œã€directorã¯æ­£ã—ã設定ã•れãŸã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã‚ªãƒ–ジェクトã«ä¾å­˜ã—ã¾ã™ã€‚" "æ­£ã—ãæ§‹æˆã•れã¦ã„ã‚‹ã¨ã„ã†ã“ã¨ã¯ã€ãã®åå‰ãŒè§£æ±ºå¯èƒ½ã§ã‚ã‚‹ã‹ã€ã¾ãŸã¯" "ホストプロパティã«IPアドレスã¾ãŸã¯è§£æ±ºå¯èƒ½ãªãƒ›ã‚¹ãƒˆåãŒå«ã¾ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’" "æ„味ã—ã¾ã™ã€‚ directorã¯ã“ã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã«åˆ°é”ã§ããªã‘れã°ãªã‚Šã¾ã›ã‚“" #: ../../../../modules/director/application/forms/IcingaHostForm.php:316 #: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:43 msgid "IPv6 address" msgstr "IPv6 アドレス" #: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:282 #, php-format msgid "Icinga %s Sets" msgstr "Icinga %s セット" #: ../../../../modules/director/application/controllers/InspectController.php:39 #, php-format msgid "Icinga 2 - Objects: %s" msgstr "Icinga 2 API - オブジェクト: %s" #: ../../../../modules/director/application/controllers/InspectController.php:152 msgid "Icinga 2 API - Status" msgstr "Icinga 2 API - ステータス" #: ../../../../modules/director/library/Director/Web/SelfService.php:192 msgid "Icinga 2 Client documentation" msgstr "Icinga 2 Client ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ" #: ../../../../modules/director/application/forms/IcingaHostForm.php:135 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:678 msgid "Icinga Agent and zone settings" msgstr "Icingaエージェントã¨ã‚¾ãƒ¼ãƒ³ã®è¨­å®š" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ApiUserObjectDashlet.php:13 msgid "Icinga Api users" msgstr "Icinga APIユーザ" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:34 #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:73 msgid "Icinga DSL" msgstr "Icinga DSL" #: ../../../../modules/director/configuration.php:83 msgid "Icinga Director" msgstr "Icinga director" #: ../../../../modules/director/application/controllers/DashboardController.php:35 msgid "Icinga Director - Main Dashboard" msgstr "Icinga Director - メインダッシュボード" #: ../../../../modules/director/library/Director/Dashboard/DirectorDashboard.php:15 msgid "Icinga Director Configuration" msgstr "Icinga directorã®è¨­å®š" #: ../../../../modules/director/application/forms/SettingsForm.php:35 msgid "" "Icinga Director decides to deploy objects like CheckCommands to a global " "zone. This defaults to \"director-global\" but might be adjusted to a custom " "Zone name" msgstr "Icinga Directorã¯ã€ç›£è¦–コマンドãªã©ã®ã‚ªãƒ–ジェクト設定をグローãƒãƒ«" "ゾーンã«å映ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ãŸã€‚ デフォルトã§ã¯ã€Œdirector-globalã€ã§ã™ã€‚" "ä»»æ„ã®ã‚¾ãƒ¼ãƒ³åãŒæŒ‡å®šã•れã¦ã„ã‚‹å ´åˆã¯ã€ãã®ã‚¾ãƒ¼ãƒ³ã«å映ã•れã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:17 msgid "" "Icinga Director offers a Self Service API, allowing new Icinga nodes to " "register themselves" msgstr "Icinga directorã¯ã‚»ãƒ«ãƒ•サービスAPIã‚’æä¾›ã—ã€æ–°ã—ã„IcingaノードãŒ" "自分自身を登録ã§ãるよã†ã«ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/KickstartForm.php:127 msgid "Icinga Host" msgstr "Icinga ホスト" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:11 msgid "Icinga Infrastructure" msgstr "Icinga インフラストラクãƒãƒ£" #: ../../../../modules/director/application/forms/SettingsForm.php:43 msgid "Icinga Package Name" msgstr "Icingaパッケージå" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1106 msgid "" "Icinga cluster zone. Allows to manually override Directors decisions of " "where to deploy your config to. You should consider not doing so unless you " "gained deep understanding of how an Icinga Cluster stack works" msgstr "è¨­å®šã‚’åæ˜ ã™ã‚‹ã‚¯ãƒ©ã‚¹ã‚¿ã‚¾ãƒ¼ãƒ³ã‚’設定ã—ã¾ã™ã€‚IcingaクラスタãŒ" "ã©ã®ã‚ˆã†ã«æ©Ÿèƒ½ã—ã¦ã„ã‚‹ã‹ç†è§£ã—ã¦ã„ãªã„å ´åˆã¯ã€è¨­å®šã—ãªã„ã§ãã ã•ã„。" #: ../../../../modules/director/application/forms/IcingaHostGroupForm.php:16 msgid "Icinga object name for this host group" msgstr "ã“ã®ãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—ã®Icingaオブジェクトå" #: ../../../../modules/director/application/forms/IcingaHostForm.php:46 msgid "" "Icinga object name for this host. This is usually a fully qualified host " "name but it could basically be any kind of string. To make things easier for " "your users we strongly suggest to use meaningful names for templates. E.g. " "\"generic-host\" is ugly, \"Standard Linux Server\" is easier to understand" msgstr "ã“ã®ãƒ›ã‚¹ãƒˆã®Icingaオブジェクトå。ã“れã¯é€šå¸¸å®Œå…¨ä¿®é£¾ãƒ›ã‚¹ãƒˆåã§ã™ãŒã€" "基本的ã«ã¯ã‚ã‚‰ã‚†ã‚‹ç¨®é¡žã®æ–‡å­—列ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ユーザーã®ä½œæ¥­ã‚’" "容易ã«ã™ã‚‹ãŸã‚ã«ã€ãƒ†ãƒ³ãƒ—レートã«ã¯ã‚ã‹ã‚Šã‚„ã™ã„åå‰ã‚’使用ã™ã‚‹ã“ã¨ã‚’" "å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚ 例ãˆã°ã€\"generic-host\"ã¯ã‚ã‹ã‚Šã«ãã„ã§ã™ãŒã€" "\"Standard Linux Server\"ã¯ç†è§£ã—ã‚„ã™ã„ã§ã™" #: ../../../../modules/director/application/forms/IcingaServiceGroupForm.php:16 msgid "Icinga object name for this service group" msgstr "ã“ã®ã‚µãƒ¼ãƒ“スグループã®Icingaオブジェクトå" #: ../../../../modules/director/application/forms/IcingaUserGroupForm.php:19 msgid "Icinga object name for this user group" msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ã‚°ãƒ«ãƒ¼ãƒ—ã®Icingaオブジェクトå" #: ../../../../modules/director/application/forms/SettingsForm.php:94 msgid "Icinga v1.x" msgstr "Icinga v1.x" #: ../../../../modules/director/application/forms/SettingsForm.php:93 msgid "Icinga v2.x" msgstr "Icinga v2.x" #: ../../../../modules/director/application/forms/IcingaHostForm.php:77 msgid "Icinga2 Agent" msgstr "Icinga2 エージェント" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1482 msgid "Icon image" msgstr "アイコン画åƒ" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1491 msgid "Icon image alt" msgstr "アイコン画åƒã®ä»£æ›¿ãƒ†ã‚­ã‚¹ãƒˆ" #: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:74 msgid "Id" msgstr "ID" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:53 msgid "Identifier for the Icinga command you are going to create" msgstr "作æˆã—よã†ã¨ã—ã¦ã„ã‚‹Icingaコマンドã®ID" #: ../../../../modules/director/application/forms/BasketForm.php:49 #: ../../../../modules/director/application/forms/SyncRuleForm.php:60 msgid "Ignore" msgstr "無視" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:172 msgid "Ignore Soft States" msgstr "一時的ãªç•°å¸¸(soft state)を無視" #: ../../../../modules/director/application/forms/BasketForm.php:29 msgid "Import Sources" msgstr "インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:14 msgid "Import data sources" msgstr "データソースã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" #: ../../../../modules/director/application/forms/IcingaImportObjectForm.php:26 #, php-format msgid "Import external \"%s\"" msgstr "外部\"%s\"をインãƒãƒ¼ãƒˆ" #: ../../../../modules/director/application/controllers/ImportrunController.php:14 #: ../../../../modules/director/application/controllers/ImportrunController.php:15 msgid "Import run" msgstr "処ç†ã‚’インãƒãƒ¼ãƒˆ" #: ../../../../modules/director/application/controllers/ImportsourceController.php:183 #, php-format msgid "Import run history: %s" msgstr "実行履歴をインãƒãƒ¼ãƒˆ: %s " #: ../../../../modules/director/application/controllers/ImportsourcesController.php:46 #: ../../../../modules/director/library/Director/Job/ImportJob.php:80 #: ../../../../modules/director/library/Director/Web/Tabs/ImportTabs.php:20 #: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:37 msgid "Import source" msgstr "インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹" #: ../../../../modules/director/application/forms/ImportSourceForm.php:15 msgid "Import source name" msgstr "インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹å" #: ../../../../modules/director/application/controllers/ImportsourceController.php:138 #, php-format msgid "Import source preview: %s" msgstr "インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®ãƒ—レビュー: %s" #: ../../../../modules/director/application/controllers/ImportsourceController.php:81 #: ../../../../modules/director/application/controllers/ImportsourceController.php:109 #, php-format msgid "Import source: %s" msgstr "インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹: %s" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1196 msgid "" "Importable templates, add as many as you want. Please note that order " "matters when importing properties from multiple templates: last one wins" msgstr "å¿…è¦ãªãƒ†ãƒ³ãƒ—レートを追加ã—ã¦ãã ã•ã„。複数ã®ãƒ†ãƒ³ãƒ—レートを" "インãƒãƒ¼ãƒˆã™ã‚‹å ´åˆã€æœ€å¾Œã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸãƒ†ãƒ³ãƒ—レートã®ãƒ—ロパティãŒ" "優先ã•れã¾ã™ã€‚" #: ../../../../modules/director/application/forms/ImportRunForm.php:33 msgid "Imported new data from this Import Source" msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸæ–°ã—ã„データ" #: ../../../../modules/director/library/Director/Web/Table/ImportrunTable.php:32 msgid "Imported rows" msgstr "インãƒãƒ¼ãƒˆã•れãŸè¡Œ" #: ../../../../modules/director/application/forms/IcingaImportObjectForm.php:16 msgid "" "Importing an object means that its type will change from \"external\" to " "\"object\". That way it will make part of the next deployment. So in case " "you imported this object from your Icinga node make sure to remove it from " "your local configuration before issueing the next deployment. In case of a " "conflict nothing bad will happen, just your config won't deploy." msgstr "オブジェクトをインãƒãƒ¼ãƒˆã™ã‚‹ã¨ã€ãã®ã‚¿ã‚¤ãƒ—ã¯ã€Œå¤–部ã€ã‹ã‚‰" "「オブジェクトã€ã«å¤‰ã‚りã¾ã™ã€‚ ãã‚Œã¯æ¬¡ã®è¨­å®šå映ã®å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚ãã®ãŸã‚ã€" "Icingaノードã‹ã‚‰ã“ã®ã‚ªãƒ–ジェクトをインãƒãƒ¼ãƒˆã—ãŸå ´åˆã¯ã€æ¬¡ã®è¨­å®šå映を行ã†å‰ã«" "å¿…ãšãƒ­ãƒ¼ã‚«ãƒ«è¨­å®šã‹ã‚‰å‰Šé™¤ã—ã¦ãã ã•ã„。設定ã®è¡çªãŒç™ºç”Ÿã—ãŸå ´åˆã€ã»ã‹ã¸ã®" "悪影響ã¯ã‚りã¾ã›ã‚“ãŒã€è¡çªã—ãŸè¨­å®šãŒå映ã•れã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1194 msgid "Imports" msgstr "インãƒãƒ¼ãƒˆ" #: ../../../../modules/director/application/controllers/SelfServiceController.php:104 msgid "" "In case an Icinga Admin provided you with a self service API token, this is " "where you can register new hosts" msgstr "Icinga管ç†è€…ã‹ã‚‰ã‚»ãƒ«ãƒ•サービスAPIãƒˆãƒ¼ã‚¯ãƒ³ãŒæä¾›ã•れãŸå ´åˆã¯ã€" "ã“ã“ã§æ–°ã—ã„ホストを登録ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:176 msgid "" "In case the Icinga 2 Agent is already installed on the system, this " "parameter will allow you to configure if you wish to upgrade / downgrade to " "a specified version with the as well." msgstr "Icinga 2 Agent ãŒã™ã§ã«ã‚·ã‚¹ãƒ†ãƒ ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹å ´åˆã¯ã€" "ã“ã®ãƒ‘ラメータを使用ã—ã¦æŒ‡å®šã—ãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—グレードã¾ãŸã¯" "ダウングレードã™ã‚‹ã‹ã‚‚設定ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:143 msgid "" "In case the Icinga 2 Agent should be automatically installed, this has to be " "a string value like: 2.6.3" msgstr "Icinga 2 Agent を自動的ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã€ãã®ãƒãƒ¼ã‚¸ãƒ§" "ンを指定ã—ã¾ã™ã€‚ã“れã¯ã€Œ2.6.3ã€ã®ã‚ˆã†ãªæ–‡å­—列値ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:89 msgid "" "In case the Icinga Agent will accept configuration from the parent Icinga 2 " "system, it will possibly write data to /var/lib/icinga2/api/*. By setting " "this parameter to true, all content inside the api directory will be flushed " "before an eventual restart of the Icinga 2 Agent" msgstr "Icinga AgentãŒè¦ªã®Icinga 2システムã‹ã‚‰è¨­å®šã‚’å—ã‘入れる場åˆã€ãŠãらã" " /var/lib/icinga2/api/* ã«ãƒ‡ãƒ¼ã‚¿ã‚’書ãè¾¼ã¿ã¾ã™ã€‚ ã“ã®ãƒ‘ラメータを「ã¯ã„ã€" "ã«è¨­å®šã™ã‚‹ã¨ã€apiディレクトリ内ã®ã™ã¹ã¦ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€æœ€çµ‚çš„ã«" "Icinga 2 Agentã‚’å†èµ·å‹•ã™ã‚‹å‰ã«ãƒ•ラッシュã•れã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:62 msgid "Include other time periods into this." msgstr "é¸æŠžã—ãŸä»–ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«è¨­å®šã‚’é©ç”¨ã—ã¾ã™" #: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:59 msgid "Include period" msgstr "スケジュールã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰" #: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:56 msgid "Indirect" msgstr "間接" #: ../../../../modules/director/application/controllers/HostController.php:140 #: ../../../../modules/director/application/controllers/HostController.php:218 msgid "Individual Service objects" msgstr "個々ã®ã‚µãƒ¼ãƒ“スオブジェクト" #: ../../../../modules/director/library/Director/Web/Tabs/InfraTabs.php:43 msgid "Infrastructure" msgstr "インフラストラクãƒãƒ£" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:310 msgid "Inheritance (import)" msgstr "継承(インãƒãƒ¼ãƒˆï¼‰" #: ../../../../modules/director/application/forms/IcingaHostForm.php:240 msgid "Inherited groups" msgstr "継承ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—" #: ../../../../modules/director/application/controllers/HostController.php:386 #, php-format msgid "Inherited service: %s" msgstr "継承ã•れãŸã‚µãƒ¼ãƒ“ス: %s" #: ../../../../modules/director/application/controllers/HostController.php:537 #: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:132 msgid "Inspect" msgstr "検査" #: ../../../../modules/director/application/controllers/InspectController.php:65 msgid "Inspect - object list" msgstr "検査 - オブジェクトリスト" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:189 msgid "Install NSClient++" msgstr "NSClient++ をインストール" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:59 msgid "Installation Source" msgstr "インストールソース" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:152 msgid "Installer Hashes" msgstr "インストーラã®ãƒãƒƒã‚·ãƒ¥" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:25 msgid "Internal commands" msgstr "内部コマンド" #: ../../../../modules/director/application/controllers/SyncruleController.php:97 #, php-format msgid "It has been renamed since then, its former name was %s" msgstr "åå‰ãŒå¤‰æ›´ã•れã¾ã—ãŸ(以å‰ã®åå‰: %s)" #: ../../../../modules/director/library/Director/Web/SelfService.php:68 msgid "" "It is not a good idea to do so as long as your Agent still has a valid Self " "Service API key!" msgstr "ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆãŒæœ‰åйãªã‚»ãƒ«ãƒ•サービスAPIキーをã¾ã æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€" "ãã®æ“作ã¯ãŠå‹§ã‚ã§ãã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:87 msgid "" "It will not be allowed to choose more than this many options. Setting it to " "one (1) will result in a drop-down box, a higher number will turn this into " "a multi-selection element." msgstr "ã“れ以上ã®é¸æŠžè‚¢ã‚’é¸æŠžã™ã‚‹ã“ã¨ã¯è¨±å¯ã•れã¾ã›ã‚“。 ã“れを1ã«è¨­å®šã™ã‚‹ã¨ãƒ‰ãƒ­ãƒƒãƒ—ダウンボックスãŒè¡¨ç¤ºã•ã‚Œã€æ•°å€¤ãŒå¤§ãã„ã»ã©è¤‡æ•°é¸æŠžè¦ç´ ã«ãªã‚Šã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:40 msgid "" "It's currently unknown whether we are in sync with this Import Source. You " "should either check for changes or trigger a new Import Run." msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¨åŒæœŸã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã¯ç¾åœ¨ä¸æ˜Žã§ã™ã€‚" "変更を確èªã™ã‚‹ã‹ã€æ–°ã—ã„インãƒãƒ¼ãƒˆå®Ÿè¡Œã‚’トリガã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/controllers/SyncruleController.php:57 msgid "" "It's currently unknown whether we are in sync with this rule. You should " "either check for changes or trigger a new Sync Run." msgstr "ã“ã®ãƒ«ãƒ¼ãƒ«ã§åŒæœŸã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã¯ç¾åœ¨ä¸æ˜Žã§ã™ã€‚ 変更を確èªã™ã‚‹ã‹ã€" "æ–°ã—ã„åŒæœŸå®Ÿè¡Œã‚’トリガã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/BasketForm.php:120 #: ../../../../modules/director/application/forms/BasketUploadForm.php:130 msgid "It's not allowed to store an empty basket" msgstr "空ã®ãƒã‚¹ã‚±ãƒƒãƒˆã¯ä¿å­˜ã§ãã¾ã›ã‚“" #: ../../../../modules/director/application/controllers/JobController.php:97 msgid "Job" msgstr "ジョブ" #: ../../../../modules/director/application/forms/BasketForm.php:31 msgid "Job Definitions" msgstr "ジョブã®å®šç¾©" #: ../../../../modules/director/application/forms/DirectorJobForm.php:17 msgid "Job Type" msgstr "ジョブタイプ" #: ../../../../modules/director/application/forms/DirectorJobForm.php:72 #: ../../../../modules/director/library/Director/Web/Table/JobTable.php:60 msgid "Job name" msgstr "ジョブå" #: ../../../../modules/director/application/controllers/JobController.php:22 #: ../../../../modules/director/application/controllers/JobController.php:54 #, php-format msgid "Job: %s" msgstr "ジョブ: %s" #: ../../../../modules/director/application/controllers/JobsController.php:13 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/JobDashlet.php:14 #: ../../../../modules/director/library/Director/Web/Tabs/ImportTabs.php:26 msgid "Jobs" msgstr "ジョブ" #: ../../../../modules/director/library/Director/Web/Table/ActivityLogTable.php:81 msgid "Jump to this object" msgstr "ã“ã®ã‚ªãƒ–ジェクトã«é£›ã¶" #: ../../../../modules/director/library/Director/Web/SelfService.php:245 msgid "Just download and run this script on your Linux Client Machine:" msgstr "ã“ã®ã‚¹ã‚¯ãƒªãƒ—トをLinuxクライアントマシンã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã™ã‚‹ã ã‘ã§ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:57 msgid "Keep matching elements" msgstr "一致ã™ã‚‹è¦ç´ ã‚’ä¿æŒã—ã¾ã™" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:60 msgid "Keep only matching rows (Whitelist)" msgstr "一致ã™ã‚‹è¡Œï¼ˆãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆï¼‰ã®ã¿ã‚’ä¿æŒã—ã¾ã™" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:31 msgid "Keep the DN as is" msgstr "DNãŒæ¬¡ã§ã‚るよã†ã«ä¿æŒã—ã¾ã™ï¼š" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJsonDecode.php:26 msgid "Keep the JSON string as is" msgstr "JSONæ–‡å­—åˆ—ãŒæ¬¡ã§ã‚るよã†ã«ä¿æŒã—ã¾ã™ï¼š" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php:18 msgid "Keep the property (hostname) as is" msgstr "プロパティ(ホストåï¼‰ãŒæ¬¡ã§ã‚るよã†ã«ä¿æŒã—ã¾ã™ï¼š" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:35 msgid "Keep the property as is" msgstr "ãƒ—ãƒ­ãƒ‘ãƒ†ã‚£ãŒæ¬¡ã§ã‚るよã†ã«ä¿æŒã—ã¾ã™ï¼š" #: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:21 #: ../../../../modules/director/library/Director/Web/Table/DatalistEntryTable.php:54 msgid "Key" msgstr "キー" #: ../../../../modules/director/application/forms/ImportSourceForm.php:87 msgid "Key column name" msgstr "キーã¨ãªã‚‹ã‚«ãƒ©ãƒ å" #: ../../../../modules/director/application/controllers/IndexController.php:42 #: ../../../../modules/director/application/controllers/KickstartController.php:12 msgid "Kickstart" msgstr "キックスタート" #: ../../../../modules/director/application/forms/KickstartForm.php:315 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/KickstartDashlet.php:11 msgid "Kickstart Wizard" msgstr "キックスタートウィザード" #: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:47 msgid "LDAP Search Base" msgstr "LDAP検索ベースDN" #: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:30 #: ../../../../modules/director/library/Director/Web/Table/DatafieldTable.php:47 #: ../../../../modules/director/library/Director/Web/Table/DatalistEntryTable.php:55 #: ../../../../modules/director/library/Director/Web/Table/IcingaObjectDatafieldTable.php:49 msgid "Label" msgstr "ラベル" #: ../../../../modules/director/library/Director/Web/Widget/IcingaObjectInspection.php:58 msgid "Last Check Result" msgstr "æœ€çµ‚ç›£è¦–çµæžœ" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:34 msgid "Last Element" msgstr "最後ã®è¦ç´ " #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:205 msgid "Last notification" msgstr "最終通知ã¾ã§ã®æ™‚é–“" #: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:67 msgid "Last related activity" msgstr "最後ã®é–¢é€£ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティ" #: ../../../../modules/director/application/controllers/SyncruleController.php:93 msgid "Last sync run details" msgstr "æœ€çµ‚åŒæœŸã®å‡¦ç†ã®è©³ç´°" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:64 msgid "" "Leave empty for non-positional arguments. Can be a positive or negative " "number and influences argument ordering" msgstr "ä½ç½®ã«é–¢ã™ã‚‹å¼•æ•°ã§ãªã„å ´åˆã¯ç©ºã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。" " 正数ã¾ãŸã¯è² æ•°ã«ã™ã‚‹ã“ã¨ãŒã§ãã€å¼•æ•°ã®é †åºã«å½±éŸ¿ã‚’与ãˆã¾ã™" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:42 msgid "" "Leaving custom variables in place while removing the related field is " "perfectly legal and might be a desired operation. This way you can no longer " "modify related custom variables in the Director GUI, but the variables " "themselves will stay there and continue to be deployed. When you re-add a " "field for the same variable later on, everything will continue to work as " "before" msgstr "関連フィールドを削除ã—ã€ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã‚’ãã®ã¾ã¾ã«ã—ã¦ãŠãã“ã¨ã‚‚" "å¯èƒ½ã§ã™ã€‚ ã“ã®ã‚ˆã†ãªçŠ¶æ…‹ã§ã¯ã€Directorã§" "関連ã™ã‚‹ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã‚’変更ã™ã‚‹ã“ã¨ã¯ã§ããªããªã‚Šã¾ã™ãŒã€å¤‰æ•°è‡ªä½“ã¯ãã®ã¾ã¾" "利用ã§ãã¾ã™ã€‚ 後ã§åŒã˜å¤‰æ•°ã®ãƒ•ィールドを追加ã—ç›´ã—ã¦ã‚‚ã€" "以å‰ã¨åŒã˜ã‚ˆã†ã«æ©Ÿèƒ½ã—ç¶šã‘ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:85 msgid "" "Leaving custom variables in place while renaming the related field is " "perfectly legal and might be a desired operation. This way you can no longer " "modify related custom variables in the Director GUI, but the variables " "themselves will stay there and continue to be deployed. When you re-add a " "field for the same variable later on, everything will continue to work as " "before" msgstr "関連フィールドを削除ã—ã€ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã‚’ãã®ã¾ã¾ã«ã—ã¦ãŠãã“ã¨ã‚‚" "å¯èƒ½ã§ã™ã€‚ ã“ã®ã‚ˆã†ãªçŠ¶æ…‹ã§ã¯ã€Directorã§" "関連ã™ã‚‹ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã‚’変更ã™ã‚‹ã“ã¨ã¯ã§ããªããªã‚Šã¾ã™ãŒã€å¤‰æ•°è‡ªä½“ã¯ãã®ã¾ã¾" "利用ã§ãã¾ã™ã€‚ 後ã§åŒã˜å¤‰æ•°ã®ãƒ•ィールドを追加ã—ç›´ã—ã¦ã‚‚ã€" "以å‰ã¨åŒã˜ã‚ˆã†ã«æ©Ÿèƒ½ã—ç¶šã‘ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:45 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:35 msgid "Let the import fail" msgstr "インãƒãƒ¼ãƒˆã‚’失敗ã«ã™ã‚‹" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:54 msgid "Let the whole Import Run fail" msgstr "インãƒãƒ¼ãƒˆå®Ÿè¡Œå…¨ä½“を失敗ã«ã™ã‚‹" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:36 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:32 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php:19 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJsonDecode.php:27 msgid "Let the whole import run fail" msgstr "インãƒãƒ¼ãƒˆå®Ÿè¡Œå…¨ä½“を失敗ã«ã™ã‚‹" #: ../../../../modules/director/configuration.php:38 msgid "Limit access to the given comma-separated list of hostgroups" msgstr "指定ã—ãŸãƒ›ã‚¹ãƒˆã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã—ã¾ã™" #: ../../../../modules/director/library/Director/Web/SelfService.php:238 msgid "Linux commandline" msgstr "Linux コマンドライン" #: ../../../../modules/director/application/controllers/DataController.php:91 msgid "List Entries" msgstr "リストエントリ" #: ../../../../modules/director/application/controllers/DataController.php:155 msgid "List entries" msgstr "リストエントリ" #: ../../../../modules/director/application/forms/DirectorDatalistForm.php:13 #: ../../../../modules/director/library/Director/Web/Table/DatalistTable.php:31 msgid "List name" msgstr "リストå" #: ../../../../modules/director/application/forms/SettingsForm.php:135 msgid "" "Local directory to deploy Icinga 1.x configuration. Must be writable by " "icingaweb2. (e.g. /etc/icinga/director)" msgstr "Icinga 1.xæ§‹æˆã‚’åæ˜ ã™ã‚‹ãŸã‚ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€‚ " "icingaweb2ã«ã‚ˆã£ã¦æ›¸ãè¾¼ã¿å¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" " (例:/etc/icinga/director)" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:41 msgid "Log Duration" msgstr "ログä¿å­˜æœŸé–“" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:66 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:563 msgid "Main properties" msgstr "プロパティ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:12 msgid "" "Manage definitions for your Commands that should be executed as Check " "Plugins, Notifications or based on Events" msgstr "監視ã€é€šçŸ¥ã€ã¾ãŸã¯ã‚¤ãƒ™ãƒ³ãƒˆã«åŸºã¥ã„ã¦å®Ÿè¡Œã•れるコマンド" "ã®å®šç¾©ã‚’管ç†ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:17 msgid "" "Manage your Host Templates. Use Fields to make it easy for your users to get " "them customized." msgstr "ホストテンプレートを管ç†ã—ã¾ã™ã€‚ ユーザーãŒç°¡å˜ã«ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãるよã†ã«ã™ã‚‹ãŸã‚ã«ã¯ã€ãƒ•ィールドを使用ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:17 msgid "" "Manage your Icinga 2 infrastructure: Masters, Zones, Satellites and more" msgstr "マスター/ゾーン/サテライトãªã©ã€Icinga 2 ã®åŸºç›¤ã¨ãªã‚‹è¨­å®šã‚’管ç†ã—ã¾ã™" #: ../../../../modules/director/library/Director/Dashboard/CommandsDashboard.php:17 msgid "Manage your Icinga Commands" msgstr "Icinga コマンドを管ç†" #: ../../../../modules/director/library/Director/Dashboard/HostsDashboard.php:16 msgid "Manage your Icinga Hosts" msgstr "Icinga ã®ãƒ›ã‚¹ãƒˆã®ç®¡ç†" #: ../../../../modules/director/library/Director/Dashboard/InfrastructureDashboard.php:18 msgid "Manage your Icinga Infrastructure" msgstr "Icinga インフラストラクãƒãƒ£ã®ç®¡ç†" #: ../../../../modules/director/library/Director/Dashboard/ServicesDashboard.php:18 msgid "Manage your Icinga Service Checks" msgstr "Icinga サービス監視を管ç†" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:17 msgid "" "Manage your Service Templates. Use Fields to make it easy for your users to " "get them customized." msgstr "サービステンプレートを管ç†ã—ã¾ã™ã€‚ ユーザーãŒãƒ•ィールドを" "カスタマイズã—ã‚„ã™ãã™ã‚‹ã«ã¯ã€ãƒ•ィールドを使用ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:134 #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:139 #: ../../../../modules/director/library/Director/Web/Table/IcingaObjectDatafieldTable.php:51 msgid "Mandatory" msgstr "å¿…é ˆ" #: ../../../../modules/director/application/forms/SettingsForm.php:123 msgid "Master-less" msgstr "マスター無ã—" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:35 msgid "Match NULL value columns" msgstr "NULL値ã®ã‚«ãƒ©ãƒ ã¨ä¸€è‡´" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:34 msgid "Match boolean FALSE" msgstr "真å½å€¤FALSEã«ä¸€è‡´" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:33 msgid "Match boolean TRUE" msgstr "真å½å€¤TRUEã«ä¸€è‡´" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1317 msgid "Max check attempts" msgstr "最大監視試行回数" #: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:60 #: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:65 msgid "Member" msgstr "メンãƒãƒ¼" #: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:114 msgid "Members" msgstr "メンãƒãƒ¼" #: ../../../../modules/director/application/forms/SyncRuleForm.php:58 msgid "Merge" msgstr "マージ" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:116 msgid "Merge Policy" msgstr "マージãƒãƒªã‚·ãƒ¼" #: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:23 msgid "" "Might be monday, tuesday or 2016-01-28 - have a look at the documentation for " "more examples" msgstr "monday, tuesday, 2016-01-28ã¨ã„ã£ãŸæ›¸å¼ã§æŒ‡å®šã—ã¾ã™ã€‚" "より多ãã®ä¾‹ã«ã¤ã„ã¦ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’見ã¦ãã ã•ã„" #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:73 msgid "Minimum required" msgstr "最低è¦ä»¶" #: ../../../../modules/director/application/forms/ImportRowModifierForm.php:71 msgid "Modifier" msgstr "プロパティ変æ›ãƒ«ãƒ¼ãƒ«" #: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:41 msgid "Modifiers" msgstr "プロパティ変æ›ãƒ«ãƒ¼ãƒ«" #: ../../../../modules/director/application/controllers/ImportsourceController.php:103 #: ../../../../modules/director/application/controllers/SyncruleController.php:189 #: ../../../../modules/director/library/Director/ProvidedHook/Monitoring/ServiceActions.php:52 #: ../../../../modules/director/library/Director/Web/ActionBar/AutomationObjectActionBar.php:38 #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:118 #: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:33 msgid "Modify" msgstr "編集" #: ../../../../modules/director/library/Director/ProvidedHook/CubeLinks.php:52 #, php-format msgid "Modify %d hosts" msgstr "%d 個ã®ãƒ›ã‚¹ãƒˆã‚’編集" #: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:175 #, php-format msgid "Modify %d objects" msgstr "%d 個ã®ãƒ›ã‚¹ãƒˆã‚’編集" #: ../../../../modules/director/application/controllers/DatafieldController.php:35 #, php-format msgid "Modify %s" msgstr "%s を編集" #: ../../../../modules/director/library/Director/ProvidedHook/CubeLinks.php:35 msgid "Modify a host" msgstr "ホストを編集" #: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:61 msgid "Modify data list entry" msgstr "データリストエントリã®ç·¨é›†" #: ../../../../modules/director/library/Director/Web/Table/ApplyRulesTable.php:115 msgid "Modify this Apply Rule" msgstr "ã“ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’編集" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceObjectDashlet.php:15 msgid "Monitored Services" msgstr "監視対象サービス" #: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:500 msgid "Move down" msgstr "下ã¸ç§»å‹•" #: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:490 msgid "Move up" msgstr "上ã«ç§»å‹•" #: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:173 msgid "Multiple objects" msgstr "複数ã®ã‚ªãƒ–ジェクト" #: ../../../../modules/director/application/controllers/ConfigController.php:159 msgid "My changes" msgstr "自身ã«ã‚ˆã‚‹å¤‰æ›´" #: ../../../../modules/director/application/controllers/SchemaController.php:16 msgid "MySQL schema" msgstr "MySQL スキーマ" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:145 #: ../../../../modules/director/application/forms/IcingaApiUserForm.php:14 #: ../../../../modules/director/application/forms/IcingaCommandForm.php:47 #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:73 #: ../../../../modules/director/application/forms/IcingaHostForm.php:38 #: ../../../../modules/director/application/forms/IcingaHostVarForm.php:22 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:556 #: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:22 #: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:15 #: ../../../../modules/director/library/Director/Web/Table/ChoicesTable.php:41 #: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:72 #: ../../../../modules/director/library/Director/Web/Table/CoreApiObjectsTable.php:54 #: ../../../../modules/director/library/Director/Web/Table/CoreApiPrototypesTable.php:37 msgid "Name" msgstr "åå‰" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:75 msgid "Name for the Icinga dependency you are going to create" msgstr "Icingaä¾å­˜é–¢ä¿‚オブジェクトã®åå‰" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:20 msgid "Name for the Icinga endpoint template you are going to create" msgstr "Icingaエンドãƒã‚¤ãƒ³ãƒˆãƒ†ãƒ³ãƒ—レートã®åå‰" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:26 msgid "Name for the Icinga endpoint you are going to create" msgstr "Icingaエンドãƒã‚¤ãƒ³ãƒˆã®åå‰" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:21 msgid "Name for the Icinga notification template you are going to create" msgstr "Icinga通知テンプレートã®åå‰" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:27 msgid "Name for the Icinga notification you are going to create" msgstr "Icinga通知ã®åå‰" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:148 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:559 msgid "Name for the Icinga service you are going to create" msgstr "Icingaサービスã®åå‰" #: ../../../../modules/director/application/forms/IcingaUserForm.php:30 msgid "Name for the Icinga user object you are going to create" msgstr "作æˆã—よã†ã¨ã—ã¦ã„ã‚‹Icingaユーザオブジェクトã®åå‰" #: ../../../../modules/director/application/forms/IcingaUserForm.php:24 msgid "Name for the Icinga user template you are going to create" msgstr "作æˆã—よã†ã¨ã—ã¦ã„ã‚‹Icingaユーザテンプレートã®åå‰" #: ../../../../modules/director/application/forms/IcingaZoneForm.php:17 msgid "Name for the Icinga zone you are going to create" msgstr "作æˆã—よã†ã¨ã—ã¦ã„ã‚‹Icingaゾーンã®åå‰" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:104 msgid "Name needs to be changed when cloning a Template" msgstr "テンプレートを複製ã™ã‚‹ã¨ãã«åå‰ã‚’変更ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" #: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:82 msgid "Nav" msgstr "Nav" #: ../../../../modules/director/application/controllers/DatafieldController.php:41 msgid "New Field" msgstr "æ–°ã—ã„フィールド" #: ../../../../modules/director/application/controllers/JobController.php:30 msgid "New Job" msgstr "æ–°ã—ã„ジョブ" #: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:54 msgid "New import source" msgstr "æ–°ã—ã„インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:22 #: ../../../../modules/director/library/Director/Web/Form/CloneImportSourceForm.php:30 #: ../../../../modules/director/library/Director/Web/Form/CloneSyncRuleForm.php:30 msgid "New name" msgstr "æ–°ã—ã„åå‰" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:258 msgid "New object" msgstr "æ–°ã—ã„オブジェクト" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:34 #: ../../../../modules/director/application/forms/IcingaHostForm.php:31 msgid "Next" msgstr "次ã¸" #: ../../../../modules/director/application/forms/IcingaZoneForm.php:29 #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:227 #: ../../../../modules/director/application/forms/SettingsForm.php:58 #: ../../../../modules/director/application/forms/SettingsForm.php:73 #: ../../../../modules/director/application/forms/SyncRuleForm.php:74 #: ../../../../modules/director/library/Director/Job/ConfigJob.php:190 #: ../../../../modules/director/library/Director/Job/ConfigJob.php:202 #: ../../../../modules/director/library/Director/Job/ImportJob.php:102 #: ../../../../modules/director/library/Director/Job/SyncJob.php:102 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:26 msgid "No" msgstr "ã„ã„ãˆ" #: ../../../../modules/director/library/Director/Util.php:183 #, php-format msgid "No %s resource available" msgstr "利用å¯èƒ½ãª%s リソースã¯ã‚りã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:99 msgid "No API user configured, you might run the kickstart helper" msgstr "APIユーザーãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。キックスタートウィザードを" "実行ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaHostForm.php:163 msgid "No Host Template has been provided yet" msgstr "ホストテンプレートãŒã¾ã æä¾›ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/forms/IcingaHostForm.php:151 msgid "No Host template has been chosen" msgstr "ホストテンプレートãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:94 msgid "No Service Templates have been provided yet" msgstr "サービステンプレートãŒã¾ã æä¾›ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:170 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:736 #: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:94 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:649 msgid "No action taken, object has not been modified" msgstr "アクションã¯è¡Œã‚れãšã€ã‚ªãƒ–ジェクトã¯å¤‰æ›´ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:223 msgid "No apply rule has been defined yet" msgstr "é©ç”¨ãƒ«ãƒ¼ãƒ«ãŒã¾ã ä¸€ã¤ã‚‚定義ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:42 msgid "No changes have been made" msgstr "何も変更ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/controllers/DashboardController.php:78 msgid "No dashboard available, you might have not enough permissions" msgstr "利用å¯èƒ½ãªãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ãŒã‚りã¾ã›ã‚“。ååˆ†ãªæ¨©é™ãŒãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™" #: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:68 msgid "No database has been configured for Icinga Director" msgstr "Icinga Director用ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒæ§‹æˆã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/forms/KickstartForm.php:238 msgid "" "No database resource has been configured yet. Please choose a resource to " "complete your config" msgstr "データベースリソースã¯ã¾ã è¨­å®šã•れã¦ã„ã¾ã›ã‚“。 設定を完了ã™ã‚‹" "ãƒªã‚½ãƒ¼ã‚¹ã‚’é¸æŠžã—ã¦ãã ã•ã„" #: ../../../../modules/director/application/forms/KickstartForm.php:52 msgid "No database schema has been created yet" msgstr "データベーススキーマãŒã¾ã ä½œæˆã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/forms/AddToBasketForm.php:104 msgid "No object has been chosen" msgstr "オブジェクトãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:241 msgid "No object has been defined yet" msgstr "オブジェクトã¯ã¾ã å®šç¾©ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/forms/IcingaMultiEditForm.php:82 msgid "No object has been modified" msgstr "オブジェクトãŒå¤‰æ›´ã•れã¦ã„ã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1171 msgid "No related template has been provided yet" msgstr "関連ã™ã‚‹ãƒ†ãƒ³ãƒ—レートãŒç”¨æ„ã•れã¦ã„ã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:82 msgid "No service has been chosen" msgstr "サービスãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。" #: ../../../../modules/director/application/controllers/HostController.php:121 #, php-format msgid "No such service: %s" msgstr "ãã®ã‚ˆã†ãªã‚µãƒ¼ãƒ“スã¯ã‚りã¾ã›ã‚“: %s" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1166 msgid "No template has been chosen" msgstr "テンプレートãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:205 msgid "No template has been defined yet" msgstr "テンプレートãŒå®šç¾©ã•れã¦ã„ã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:606 msgid "None" msgstr "ãªã—" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:57 msgid "None could be used for deployments right now" msgstr "ç¾åœ¨ã€å映ã§ãる設定ã¯ã‚りã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1457 msgid "Notes" msgstr "メモ" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1466 msgid "Notes URL" msgstr "関連URL" #: ../../../../modules/director/application/forms/SyncRunForm.php:39 msgid "Nothing changed, rule is in sync" msgstr "変更ã¯ã‚りã¾ã›ã‚“。ルールã¯åŒæœŸã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/ImportCheckForm.php:38 #: ../../../../modules/director/application/forms/ImportRunForm.php:38 msgid "" "Nothing to do, data provided by this Import Source didn't change since the " "last import run" msgstr "何もã—ã¾ã›ã‚“。ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã«ã‚ˆã£ã¦æä¾›ã•れãŸãƒ‡ãƒ¼ã‚¿ã¯" "最後ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆå®Ÿè¡Œä»¥æ¥ã€å¤‰æ›´ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/forms/RestoreObjectForm.php:76 msgid "Nothing to do, restore would not modify the current object" msgstr "何もã—ã¾ã›ã‚“。復元ã—ã¦ã‚‚ç¾åœ¨ã®ã‚ªãƒ–ジェクトã¯å¤‰æ›´ã•れã¾ã›ã‚“" #: ../../../../modules/director/application/forms/SyncCheckForm.php:58 msgid "Nothing would change, this rule is still in sync" msgstr "変更ã¯èµ·ãã¾ã›ã‚“。ã“ã®ãƒ«ãƒ¼ãƒ«ã¯ã¾ã åŒæœŸã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:25 #: ../../../../modules/director/library/Director/TranslationDummy.php:18 msgid "Notification" msgstr "通知" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:55 #, php-format msgid "Notification Apply Rules based on %s" msgstr "%s ã«åŸºã¥ã通知é©ç”¨ãƒ«ãƒ¼ãƒ«" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:19 #: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:58 msgid "Notification Commands" msgstr "通知コマンド" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:12 msgid "" "Notification Commands allow you to trigger any action you want when a " "notification takes place" msgstr "通知コマンドを使用ã™ã‚‹ã¨ã€é€šçŸ¥ãŒç™ºç”Ÿã—ãŸã¨ãã«å¿…è¦ãªæ“作を実行ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:19 msgid "Notification Template" msgstr "通知テンプレート" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:251 msgid "Notification command" msgstr "通知コマンド" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:173 msgid "Notification interval" msgstr "通知インターãƒãƒ«" #: ../../../../modules/director/application/controllers/TemplatechoicesController.php:29 msgid "Notification template choices" msgstr "通知テンプレートãƒãƒ§ã‚¤ã‚¹" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:13 msgid "Notification templates" msgstr "通知テンプレート" #: ../../../../modules/director/configuration.php:130 #: ../../../../modules/director/application/forms/BasketForm.php:25 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:13 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationsDashlet.php:13 #: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:46 #: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:61 msgid "Notifications" msgstr "通知" #: ../../../../modules/director/library/Director/Dashboard/NotificationsDashboard.php:20 msgid "" "Notifications are sent when a host or service reaches a non-ok hard state or " "recovers from such. One might also want to send them for special events like " "when a Downtime starts, a problem gets acknowledged and much more. You can " "send specific notifications only within specific time periods, you can delay " "them and of course re-notify at specific intervals.\n" "\n" " Combine those possibilities in case you need to define escalation levels, " "like notifying operators first and your management later on in case the " "problem remains unhandled for a certain time.\n" "\n" " You might send E-Mail or SMS, make phone calls or page on various " "channels. You could also delegate notifications to external service " "providers. The possibilities are endless, as you are allowed to define as " "many custom notification commands as you want" msgstr "ホストã¾ãŸã¯ã‚µãƒ¼ãƒ“スãŒç•°å¸¸ãªçŠ¶æ…‹ã«ãªã£ãŸã¨ãã‚„ã€" "ãã“ã‹ã‚‰å¾©æ—§ã—ãŸã¨ãã«é€šçŸ¥ãŒé€ä¿¡ã•れã¾ã™ã€‚ ã¾ãŸã€ãƒ€ã‚¦ãƒ³ã‚¿ã‚¤ãƒ ã®" "開始時ã€éšœå®³ã®ç™ºè¦‹æ™‚ãªã©ã€ç‰¹åˆ¥ãªã‚¤ãƒ™ãƒ³ãƒˆã®ãŸã‚ã«é€šçŸ¥ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚‚" "ã§ãã¾ã™ã€‚ ç‰¹å®šã®æœŸé–“内ã«ã®ã¿ç‰¹å®šã®é€šçŸ¥ã‚’é€ã‚‹ã“ã¨ã‚„ã€" "通知をé…らã›ã‚‹ã“ã¨ã€ç‰¹å®šã®é–“éš”ã§å†é€šçŸ¥ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚\n\n" "エスカレーションレベルを定義ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" "ãŸã¨ãˆã°ã€éšœå®³ãŒä¸€å®šæ™‚間解決ã•れãªã„å ´åˆã«å‚™ãˆã¦ã€æœ€åˆã«" "オペレータã«é€šçŸ¥ã—ã€å¾Œã§ç®¡ç†è€…ã«é€šçŸ¥ã™ã‚‹ã¨ã„ã†è¨­å®šã‚’ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚\n\n" "ãªãŠé€šçŸ¥ã¯ã€ãƒ¡ãƒ¼ãƒ«ä»¥å¤–ã®æ–¹æ³•ã§è¡Œã†ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:42 msgid "Numeric position" msgstr "æ•°å­—ä½ç½®" #: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:24 msgid "OK" msgstr "OK (正常)" #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:64 #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:146 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1056 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1061 msgid "Object" msgstr "オブジェクト" #: ../../../../modules/director/application/controllers/InspectController.php:106 msgid "Object Inspection" msgstr "ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¤œæŸ»" #: ../../../../modules/director/application/forms/SyncRuleForm.php:42 msgid "Object Type" msgstr "オブジェクトタイプ" #: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:53 msgid "Object class" msgstr "オブジェクトクラス" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:18 msgid "Object dependency relationships." msgstr "ä¾å­˜é–¢ä¿‚オブジェクト" #: ../../../../modules/director/application/forms/RestoreObjectForm.php:80 msgid "Object has been re-created" msgstr "オブジェクトãŒå†ä½œæˆã•れã¾ã—ãŸ" #: ../../../../modules/director/application/forms/RestoreObjectForm.php:72 msgid "Object has been restored" msgstr "オブジェクトãŒãƒªã‚¹ãƒˆã‚¢ã•れã¾ã—ãŸ" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:357 msgid "Object properties" msgstr "オブジェクトプロパティ" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1069 #: ../../../../modules/director/library/Director/Web/Table/SyncruleTable.php:46 msgid "Object type" msgstr "オブジェクトタイプ" #: ../../../../modules/director/application/controllers/InspectController.php:67 #, php-format msgid "Object type \"%s\"" msgstr "オブジェクトタイプ \"%s\"" #: ../../../../modules/director/library/Director/Web/Table/GeneratedConfigFileTable.php:85 msgid "Object/Tpl/Apply" msgstr "オブジェクト/TPL/é©ç”¨" #: ../../../../modules/director/library/Director/Web/Table/HostTemplateUsageTable.php:11 #: ../../../../modules/director/library/Director/Web/Table/ServiceTemplateUsageTable.php:11 #: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:24 msgid "Objects" msgstr "オブジェクト" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:27 msgid "On failure" msgstr "失敗時" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:227 msgid "One apply rule has been defined" msgstr "一ã¤ã®é©ç”¨ãƒ«ãƒ¼ãƒ«ãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:249 msgid "One external object has been defined, it will not be deployed" msgstr "1ã¤ã®å¤–部オブジェクトãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚設定ã®å映ãŒè¡Œã‚れã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:252 msgid "One object has been defined" msgstr "一ã¤ã®ã‚ªãƒ–ジェクトãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaMultiEditForm.php:84 #: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:45 msgid "One object has been modified" msgstr "一ã¤ã®ã‚ªãƒ–ジェクトãŒå¤‰æ›´ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:16 msgid "One or more characters that should be used to split this string" msgstr "ã“ã®æ–‡å­—列を分割ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れる1ã¤ä»¥ä¸Šã®æ–‡å­—" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJoin.php:16 msgid "" "One or more characters that will be used to glue an input array to a string. " "Can be left empty" msgstr "入力é…列を文字列ã«çµåˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れる1ã¤ä»¥ä¸Šã®æ–‡å­—。 空ã®ã¾ã¾ã«ã§ãã¾ã™" #: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:30 msgid "One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00" msgstr "一ã¤ã¾ãŸã¯è¤‡æ•°ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã€‚(例)00:00-24:00 or 00:00-09:00,17:00-24:00" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:209 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:246 msgid "One template has been defined" msgstr "1ã¤ã®ãƒ†ãƒ³ãƒ—レートãŒå®šç¾©ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:95 msgid "" "Only set this parameter if the argument value resolves to a numeric value. " "String values are not supported" msgstr "å¼•æ•°å€¤ãŒæ•°å€¤ã«è§£æ±ºã•れる場åˆã«ã®ã¿ã€ã“ã®ãƒ‘ラメータを設定ã—ã¦ãã ã•ã„。" "文字列値ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:138 msgid "Optional" msgstr "オプション" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:72 msgid "" "Optional command timeout. Allowed values are seconds or durations postfixed " "with a specific unit (e.g. 1m or also 3m 30s)." msgstr "オプションã®ã‚³ãƒžãƒ³ãƒ‰ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã€‚書å¼ã¯ã€" "ç§’æ•°ã¾ãŸã¯æœŸé–“ã®ã‚ã¨ã«ç‰¹å®šã®å˜ä½ã‚’付ã‘ãŸã‚‚ã®ï¼ˆãŸã¨ãˆã°ã€1分ã¾ãŸã¯3分30秒)。" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:249 msgid "" "Optional. The child service. If omitted this dependency object is treated as " "host dependency." msgstr "オプションã§ã™ã€‚ å­ã‚µãƒ¼ãƒ“スã§ã™ã€‚çœç•¥ã—ãŸå ´åˆã€" "ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトã¯ãƒ›ã‚¹ãƒˆã®ä¾å­˜é–¢ä¿‚ã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:213 msgid "" "Optional. The parent service. If omitted this dependency object is treated " "as host dependency." msgstr "オプション。親サービス。çœç•¥ã—ãŸå ´åˆã€ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトã¯" "ホストã®ä¾å­˜é–¢ä¿‚ã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:95 msgid "Other available fields" msgstr "ã»ã‹ã®åˆ©ç”¨å¯èƒ½ãªãƒ•ィールド" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:272 msgid "Other sources" msgstr "ã»ã‹ã®ã‚½ãƒ¼ã‚¹" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:148 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:403 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:439 msgid "Override vars" msgstr "変数ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰" #: ../../../../modules/director/application/controllers/DashboardController.php:46 #: ../../../../modules/director/application/controllers/HealthController.php:16 #: ../../../../modules/director/library/Director/Web/ActionBar/AutomationObjectActionBar.php:32 msgid "Overview" msgstr "概è¦" #: ../../../../modules/director/application/controllers/PhperrorController.php:16 #, php-format msgid "" "PHP version 5.4.x is required for Director >= 1.4.0, you're running %s. " "Please either upgrade PHP or downgrade Icinga Director" msgstr "PHPãƒãƒ¼ã‚¸ãƒ§ãƒ³5.4.xã¯Director> = 1.4.0ã«å¿…è¦ã§ã™ã€‚ã‚ãªãŸã¯%sã‚’" "実行ã—ã¦ã„ã¾ã™ã€‚ PHPをアップグレードã™ã‚‹ã‹ã€" "Icinga Directorをダウングレードã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/IcingaUserForm.php:41 msgid "Pager" msgstr "ページャー" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:192 msgid "Parent Host" msgstr "親ホスト" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:211 msgid "Parent Service" msgstr "親サービス" #: ../../../../modules/director/application/forms/IcingaZoneForm.php:36 msgid "Parent Zone" msgstr "親ゾーン" #: ../../../../modules/director/application/forms/IcingaApiUserForm.php:19 #: ../../../../modules/director/application/forms/KickstartForm.php:159 msgid "Password" msgstr "パスワード" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierCombine.php:14 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:13 msgid "Pattern" msgstr "パターン" #: ../../../../modules/director/application/forms/ApplyMigrationsForm.php:39 msgid "Pending database schema migrations have successfully been applied" msgstr "ä¿ç•™ä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¹ã‚­ãƒ¼ãƒžã®ç§»è¡Œã¯æ­£å¸¸ã«é©ç”¨ã•れã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Util.php:185 msgid "Please ask an administrator to grant you access to resources" msgstr "リソースã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹ã‚ˆã†ã«ç®¡ç†è€…ã«ä¾é ¼ã—ã¦ãã ã•ã„" #: ../../../../modules/director/application/forms/AddToBasketForm.php:118 #, php-format msgid "" "Please check your Basket configuration, %s does not support single \"%s\" " "configuration objects" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。%sã¯å˜ä¸€ã®\"%s\"設定オブジェクト" "をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:19 msgid "Please choose a data list that can be used for map lookups" msgstr "地図検索ã«ä½¿ç”¨ã§ãã‚‹ãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„" #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:66 msgid "Please choose a specific Icinga object type" msgstr "特定ã®Icingaã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚¿ã‚¤ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„" #: ../../../../modules/director/library/Director/Job/ImportJob.php:82 msgid "" "Please choose your import source that should be executed. You could create " "different schedules for different sources or also opt for running all of " "them at once." msgstr "実行ã™ã‚‹å¿…è¦ãŒã‚るインãƒãƒ¼ãƒˆå…ƒã‚’é¸æŠžã—ã¦ãã ã•ã„。 ソースã”ã¨ã«" "ç•°ãªã‚‹ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’作æˆã—ãŸã‚Šã€ãれらã™ã¹ã¦ã‚’一度ã«å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Job/SyncJob.php:82 msgid "" "Please choose your synchronization rule that should be executed. You could " "create different schedules for different rules or also opt for running all " "of them at once." msgstr "実行ã™ã‚‹åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 ç•°ãªã‚‹ãƒ«ãƒ¼ãƒ«ã«å¯¾ã—ã¦ç•°ãªã‚‹" "スケジュールを作æˆã—ãŸã‚Šã€ãれらã™ã¹ã¦ã‚’一度ã«å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Import/ImportSourceSql.php:57 msgid "Please click \"Store\" once again to determine query columns" msgstr "クエリ欄を決定ã™ã‚‹ã«ã¯ã€ã‚‚ã†ä¸€åº¦ã€Œä¿å­˜ã€ã‚’クリックã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/KickstartForm.php:257 #, php-format msgid "Please click %s to create new DB resources" msgstr "æ–°ã—ã„DBリソースを作æˆã™ã‚‹ã«ã¯ã€%sをクリックã—ã¦ãã ã•ã„" #: ../../../../modules/director/library/Director/Util.php:175 #, php-format msgid "Please click %s to create new resources" msgstr "æ–°ã—ã„リソースを作æˆã™ã‚‹ã«ã¯ã€%sをクリックã—ã¦ãã ã•ã„" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:86 #: ../../../../modules/director/application/forms/IcingaHostForm.php:155 #, php-format msgid "Please define a %s first" msgstr "%sã‚’å…ˆã«å®šç¾©ã—ã¦ãã ã•ã„" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1169 msgid "Please define a related template first" msgstr "関連ã™ã‚‹ãƒ†ãƒ³ãƒ—レートを先ã«å®šç¾©ã—ã¦ãã ã•ã„" #: ../../../../modules/director/application/forms/KickstartForm.php:219 msgid "" "Please make sure that your database exists and your user has been granted " "enough permissions" msgstr "データベースãŒå­˜åœ¨ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ååˆ†ãªæ¨©é™ãŒä»˜ä¸Žã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/SettingsForm.php:23 msgid "" "Please only change those settings in case you are really sure that you are " "required to do so. Usually the defaults chosen by the Icinga Director should " "make a good fit for your environment." msgstr "本当ã«ã“れらã®è¨­å®šå¤‰æ›´ãŒå¿…è¦ã ã¨ç¢ºä¿¡ã—ã¦ã„ã‚‹å ´åˆã ã‘ã“れらã®è¨­å®šã‚’変ãˆã¦ãã ã•ã„。 通常ã€Icinga Directorã«ã‚ˆã£ã¦é¸æŠžã•れãŸãƒ‡ãƒ•ォルトã¯ã€ç’°å¢ƒã«é©ã—ãŸã‚‚ã®ã«ãªã‚‹ã¯ãšã§ã™ã€‚" #: ../../../../modules/director/application/forms/SyncRuleForm.php:28 msgid "Please provide a rule name" msgstr "ルールåを入力ã—ã¦ãã ã•ã„" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSubstring.php:17 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSubstring.php:27 #, php-format msgid "Please see %s for detailled instructions of how start and end work" msgstr "作業ã®é–‹å§‹ã¨çµ‚了ã®è©³ç´°ãªæ‰‹é †ã«ã¤ã„ã¦ã¯%sã‚’å‚ç…§ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:36 msgid "" "Plugin Check commands are what you need when running checks agains your " "infrastructure. Notification commands will be used when it comes to notify " "your users. Event commands allow you to trigger specific actions when " "problems occur. Some people use them for auto-healing mechanisms, like " "restarting services or rebooting systems at specific thresholds" msgstr "プラグイン監視ã¯ã€ã‚¤ãƒ³ãƒ•ラストラクãƒãƒ£ã«å¯¾ã—ã¦å†åº¦" "監視を実行ã™ã‚‹ã¨ãã«å¿…è¦ãªã‚‚ã®ã§ã™ã€‚通知コマンドã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«é€šçŸ¥ã‚’行ã†" "éš›ã«ä½¿ã‚れã¾ã™ã€‚イベントコマンドã¯ã€éšœå®³ãŒç™ºç”Ÿã—ãŸã¨ãã«ç‰¹å®šã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’" "èµ·ã“ã›ã¾ã™ã€‚ ã¾ãŸã€ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã‚’用ã„ã¦ã€ã‚µãƒ¼ãƒ“スをå†èµ·å‹•ã—ãŸã‚Šã€" "特定ã®ã—ãã„値ã§ã‚·ã‚¹ãƒ†ãƒ ã‚’å†èµ·å‹•ã™ã‚‹ãªã©ã€è‡ªå‹•修復メカニズムã«åˆ©ç”¨ã™ã‚‹ã“ã¨ã‚‚" "ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:20 msgid "Plugin commands" msgstr "プラグインコマンド" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:50 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:52 msgid "Policy" msgstr "ãƒãƒªã‚·ãƒ¼" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:36 #: ../../../../modules/director/application/forms/KickstartForm.php:141 msgid "Port" msgstr "ãƒãƒ¼ãƒˆ" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:62 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:40 msgid "Position" msgstr "ä½ç½®" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:30 msgid "Position Type" msgstr "ä½ç½®ã‚¿ã‚¤ãƒ—" #: ../../../../modules/director/application/controllers/SchemaController.php:17 msgid "PostgreSQL schema" msgstr "PostgreSQLスキーマ" #: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:76 msgid "Prefer includes" msgstr "インクルードã®å„ªå…ˆ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/BasketDashlet.php:17 msgid "Preserve specific configuration objects in a specific state" msgstr "ç‰¹å®šã®æ§‹æˆã‚ªãƒ–ジェクトを決ã¾ã£ãŸçŠ¶æ…‹ã«ç¶­æŒã—ã¾ã™" #: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:49 #: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:86 msgid "Preview" msgstr "プレビュー" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:23 msgid "Problem" msgstr "Problem (障害)" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:27 msgid "Problem handling" msgstr "障害対応" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1378 msgid "Process performance data" msgstr "プロセスパフォーマンスデータ" #: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:67 #: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:35 msgid "Properties" msgstr "プロパティ" #: ../../../../modules/director/application/forms/ImportRowModifierForm.php:30 #: ../../../../modules/director/library/Director/Web/Table/PropertymodifierTable.php:113 msgid "Property" msgstr "プロパティ" #: ../../../../modules/director/application/controllers/ImportsourceController.php:168 #, php-format msgid "Property modifiers: %s" msgstr "プロパティ変æ›ãƒ«ãƒ¼ãƒ«: %s" #: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:80 msgid "Protected" msgstr "ä¿è­·ã•れã¦ã„ã¾ã™" #: ../../../../modules/director/application/controllers/InspectController.php:91 msgid "Prototypes (methods)" msgstr "プロトタイプ(方法)" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DatalistDashlet.php:11 msgid "Provide Data Lists" msgstr "データリスト" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DatalistDashlet.php:17 msgid "Provide data lists to make life easier for your users" msgstr "カスタム変数ã«åˆ©ç”¨ã™ã‚‹ã€ãƒ‡ãƒ¼ã‚¿ã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚" "例ãˆã°ã€ã‚µãƒ¼ãƒ“スタイプã¨ã„ã†ãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆã«ã€ã€ŒWEBã€ã€ŒDBã€ç­‰ã®å€¤ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" "ã“ã®ãƒªã‚¹ãƒˆã‚’使ã†ã“ã¨ã§ã€å¤‰æ•°ã®å€¤ã‚’手ã§å…¥åŠ›ã™ã‚‹ã®ã§ã¯ãªãã€ãƒ¦ãƒ¼ã‚¶ã«é¸æŠžã•ã›ã‚‹ã“ã¨ãŒã§ãã‚‹" "よã†ã«ãªã‚Šã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:18 msgid "Provide templates for your TimePeriod objects." msgstr "スケジュールオブジェクト用ã®ãƒ†ãƒ³ãƒ—レートをæä¾›ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:18 msgid "Provide templates for your User objects." msgstr "ユーザーオブジェクト用ã®ãƒ†ãƒ³ãƒ—レートをæä¾›ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:18 msgid "Provide templates for your notifications." msgstr "通知用ã®ãƒ†ãƒ³ãƒ—レートをæä¾›ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SyncRuleForm.php:65 msgid "Purge" msgstr "削除" #: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:122 msgid "Ranges" msgstr "期間" #: ../../../../modules/director/application/forms/DeployConfigForm.php:34 msgid "Re-deploy now" msgstr "å†å映" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:24 msgid "Recovery" msgstr "Recovery (復旧)" #: ../../../../modules/director/application/forms/IcingaGenerateApiKeyForm.php:22 msgid "Regenerate Self Service API key" msgstr "セルフサービスAPIキーをå†ç”Ÿæˆ" #: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:56 msgid "Register" msgstr "登録" #: ../../../../modules/director/library/Director/Web/SelfService.php:59 msgid "Registered Agent" msgstr "登録ã•れãŸã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆ" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:34 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:32 msgid "Regular Expression" msgstr "æ­£è¦è¡¨ç¾" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:16 msgid "Regular expression pattern to split the string (e.g. /\\s+/ or /[,;]/)" msgstr "文字列を分割ã™ã‚‹æ­£è¦è¡¨ç¾ãƒ‘ターン(例: /\\s+/ ã¾ãŸã¯ /[,;]/)" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:58 msgid "Reject matching elements" msgstr "マッãƒã—ãŸè¦ç´ ã‚’æ‹’å¦" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:59 msgid "Reject the whole row (Blacklist)" msgstr "行全体を拒å¦ï¼ˆãƒ–ラックリスト)" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:269 msgid "Related Objects" msgstr "関連オブジェクト" #: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetServiceTable.php:203 msgid "Remove" msgstr "削除" #: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetServiceTable.php:205 #, php-format msgid "Remove \"%s\" from this host" msgstr "ã“ã®ãƒ›ã‚¹ãƒˆã‹ã‚‰ã€Œ%sã€ã‚’削除" #: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:480 msgid "Remove this entry" msgstr "ã“ã®ã‚¨ãƒ³ãƒˆãƒªã‚’削除" #: ../../../../modules/director/application/views/helpers/FormDataFilter.php:507 msgid "Remove this part of your filter" msgstr "フィルタã‹ã‚‰ã“ã®éƒ¨åˆ†ã‚’除去" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:94 msgid "Rename related vars" msgstr "関連ã™ã‚‹å¤‰æ•°ã®åå‰ã‚’変更" #: ../../../../modules/director/application/controllers/ConfigController.php:67 msgid "Render config" msgstr "設定を生æˆ" #: ../../../../modules/director/application/controllers/ConfigController.php:287 msgid "Rendered file" msgstr "ファイルを生æˆ" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:97 #, php-format msgid "Rendered in %0.2fs, deployed in %0.2fs" msgstr "è¨­å®šç”Ÿæˆæ™‚é–“:%0.2f ç§’, è¨­å®šåæ˜ æ™‚é–“: %0.2f ç§’" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:408 #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:413 msgid "Rendering" msgstr "設定生æˆä¸­" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:102 msgid "Repeat key" msgstr "キーをå復" #: ../../../../modules/director/application/forms/SyncRuleForm.php:59 msgid "Replace" msgstr "ç½®æ›" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:119 #: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:79 msgid "Required" msgstr "è¦æ±‚" #: ../../../../modules/director/application/controllers/BasketController.php:206 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:139 #: ../../../../modules/director/application/forms/RestoreBasketForm.php:58 msgid "Restore" msgstr "リストア" #: ../../../../modules/director/application/forms/RestoreObjectForm.php:17 msgid "Restore former object" msgstr "以å‰ã®ã‚ªãƒ–ジェクトをリストア" #: ../../../../modules/director/application/forms/RestoreBasketForm.php:52 msgid "Restore to this target Director DB" msgstr "対象ã®Director DBをリストア" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1306 msgid "Retry interval" msgstr "リトライ間隔" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1308 msgid "" "Retry interval, will be applied after a state change unless the next hard " "state is reached" msgstr "最大監視試行回数ã«é”ã™ã‚‹ã¾ã§ã®è©¦è¡Œé–“éš”" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:34 msgid "Return lookup key unmodified" msgstr "変更ã•れã¦ã„ãªã„å‚照キーを返ã™" #: ../../../../modules/director/application/forms/SyncRuleForm.php:27 #: ../../../../modules/director/library/Director/Web/Table/SyncruleTable.php:45 msgid "Rule name" msgstr "ルールå" #: ../../../../modules/director/library/Director/Job/ImportJob.php:119 msgid "Run all imports at once" msgstr "ã™ã¹ã¦ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚’ã¾ã¨ã‚ã¦å®Ÿè¡Œ" #: ../../../../modules/director/library/Director/Job/SyncJob.php:125 msgid "Run all rules at once" msgstr "ã™ã¹ã¦ã®ãƒ«ãƒ¼ãƒ«ã‚’ã¾ã¨ã‚ã¦å®Ÿè¡Œ" #: ../../../../modules/director/application/forms/KickstartForm.php:185 #: ../../../../modules/director/library/Director/Job/ImportJob.php:92 msgid "Run import" msgstr "インãƒãƒ¼ãƒˆã‚’実行" #: ../../../../modules/director/application/forms/DirectorJobForm.php:46 msgid "Run interval" msgstr "実行インターãƒãƒ«" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:659 msgid "Run on agent" msgstr "エージェントå´ã§å®Ÿè¡Œ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/JobDashlet.php:29 msgid "" "Schedule and automate Import, Syncronization, Config Deployment, " "Housekeeping and more" msgstr "インãƒãƒ¼ãƒˆã€åŒæœŸã€è¨­å®šå映ã€ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングãªã©ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨è‡ªå‹•化" #: ../../../../modules/director/library/Director/Dashboard/NotificationsDashboard.php:14 #: ../../../../modules/director/library/Director/Dashboard/UsersDashboard.php:15 msgid "Schedule your notifications" msgstr "通知をスケジュール" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationsDashlet.php:19 msgid "" "Schedule your notifications. Define who should be notified, when, and for " "which kind of problem" msgstr "通知をスケジュールã—ã¾ã™ã€‚ 誰ã«ã„ã¤ã€ã©ã‚“ãªç¨®é¡žã®" "障害ã«å¯¾ã—ã¦é€šçŸ¥ã™ã‚‹ã‹ã‚’定義ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SettingsForm.php:145 msgid "" "Script or tool to call when activating a new configuration stage. (e.g. " "sudo /usr/local/bin/icinga-director-activate) (name of the stage will be the " "argument for the script)" msgstr "æ–°ã—ã„設定ステージをアクティブã«ã™ã‚‹ã¨ãã«å‘¼ã³å‡ºã™ã‚¹ã‚¯ãƒªãƒ—トã¾ãŸã¯" "ツール。 (例:sudo /usr/local/bin/icinga-director-activate)" "(ステージã®åå‰ãŒã‚¹ã‚¯ãƒªãƒ—トã®å¼•æ•°ã«ãªã‚Šã¾ã™ï¼‰" #: ../../../../modules/director/application/controllers/SelfServiceController.php:101 #: ../../../../modules/director/application/controllers/SettingsController.php:43 msgid "Self Service" msgstr "セルフサービス" #: ../../../../modules/director/application/controllers/SelfServiceController.php:102 msgid "Self Service - Host Registration" msgstr "セルフサービス - ホストã®ç™»éŒ²" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:11 msgid "Self Service API" msgstr "セルフサービス API" #: ../../../../modules/director/application/controllers/SettingsController.php:44 msgid "Self Service API - Global Settings" msgstr "セルフサービス API - グローãƒãƒ«è¨­å®š" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:285 msgid "Self Service Settings have been stored" msgstr "セルフサービス設定ã¯ä¿å­˜ã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/application/forms/IcingaUserForm.php:89 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1366 msgid "Send notifications" msgstr "通知をé€ä¿¡ã™ã‚‹" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:78 msgid "Sent to" msgstr "ã¸é€ã‚‹" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:104 #: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:15 #: ../../../../modules/director/application/forms/SyncRuleForm.php:14 #: ../../../../modules/director/library/Director/TranslationDummy.php:14 msgid "Service" msgstr "サービス" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:11 msgid "Service Apply Rules" msgstr "サービスé©ç”¨ãƒ«ãƒ¼ãƒ«" #: ../../../../modules/director/application/forms/SyncRuleForm.php:15 msgid "Service Group" msgstr "サービスグループ" msgid "ServiceGroup" msgstr "サービスグループ" #: ../../../../modules/director/application/forms/BasketForm.php:21 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:11 msgid "Service Groups" msgstr "サービスグループ" #: ../../../../modules/director/application/forms/SyncRuleForm.php:16 #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:58 msgid "Service Set" msgstr "サービスセット" #: ../../../../modules/director/application/forms/RemoveLinkForm.php:55 msgid "Service Set has been removed" msgstr "サービスセットãŒå‰Šé™¤ã•れã¾ã—ãŸ" #: ../../../../modules/director/application/forms/BasketForm.php:24 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:11 #: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:45 #: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:60 msgid "Service Sets" msgstr "サービスセット" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:88 msgid "Service Template" msgstr "サービステンプレート" #: ../../../../modules/director/application/forms/BasketForm.php:22 msgid "Service Template Choice" msgstr "サービステンプレートãƒãƒ§ã‚¤ã‚¹" #: ../../../../modules/director/application/forms/BasketForm.php:23 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:11 msgid "Service Templates" msgstr "サービステンプレート" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:166 msgid "Service User" msgstr "サービスユーザ" #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:57 msgid "Service groups" msgstr "サービスグループ" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:634 msgid "" "Service groups that should be directly assigned to this service. " "Servicegroups can be useful for various reasons. They are helpful to " "provided service-type specific view in Icinga Web 2, either for custom " "dashboards or as an instrument to enforce restrictions. Service groups can " "be directly assigned to single services or to service templates." msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã«ç›´æŽ¥å‰²ã‚Šå½“ã¦ã‚‹å¿…è¦ãŒã‚るサービスグループ。 " "サービスグループã¯ã•ã¾ã–ã¾ãªç†ç”±ã§å½¹ã«ç«‹ã¡ã¾ã™ã€‚ カスタムダッシュボード" "ã¾ãŸã¯åˆ¶é™ã‚’é©ç”¨ã™ã‚‹æ‰‹æ®µã¨ã—ã¦ã€Icinga Web 2ã§ã‚µãƒ¼ãƒ“スタイプ固有ã®" "ビューをæä¾›ã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚ サービスグループã¯ã€å˜ä¸€ã®ã‚µãƒ¼ãƒ“スã¾ãŸã¯" "サービステンプレートã«ç›´æŽ¥å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Table/IcingaHostAppliedForServiceTable.php:102 msgid "Service name" msgstr "サービスå" #: ../../../../modules/director/application/controllers/SuggestController.php:238 #: ../../../../modules/director/library/Director/Objects/IcingaService.php:709 msgid "Service properties" msgstr "サービスプロパティ" #: ../../../../modules/director/application/forms/IcingaAddServiceSetForm.php:86 #: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:85 msgid "Service set" msgstr "サービスセット" #: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:28 msgid "Service set name" msgstr "サービスセットå" #: ../../../../modules/director/application/controllers/TemplatechoiceController.php:22 msgid "Service template choice" msgstr "サービステンプレートãƒãƒ§ã‚¤ã‚¹" #: ../../../../modules/director/application/controllers/TemplatechoicesController.php:24 msgid "Service template choices" msgstr "サービステンプレートãƒãƒ§ã‚¤ã‚¹" #: ../../../../modules/director/application/controllers/ServiceController.php:76 msgid "ServiceSet" msgstr "サービスセット" #: ../../../../modules/director/application/forms/IcingaServiceGroupForm.php:14 msgid "Servicegroup" msgstr "サービスグループ" #: ../../../../modules/director/library/Director/Web/Table/IcingaAppliedServiceTable.php:32 #: ../../../../modules/director/library/Director/Web/Table/IcingaHostServiceTable.php:140 #: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetServiceTable.php:170 msgid "Servicename" msgstr "サービスå" #: ../../../../modules/director/configuration.php:122 #: ../../../../modules/director/application/controllers/ServiceController.php:57 #: ../../../../modules/director/application/controllers/ServiceController.php:80 #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:100 #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:90 #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:56 #: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:23 #: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:44 #: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:59 #: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:75 msgid "Services" msgstr "サービス" #: ../../../../modules/director/application/controllers/ServicesetController.php:62 #, php-format msgid "Services in this set: %s" msgstr "ã“ã®ã‚»ãƒƒãƒˆä¸­ã®ã‚µãƒ¼ãƒ“ス: %s" #: ../../../../modules/director/application/controllers/HostController.php:213 #, php-format msgid "Services on %s" msgstr "%sã®ã‚µãƒ¼ãƒ“ス" #: ../../../../modules/director/application/controllers/HostController.php:137 #, php-format msgid "Services: %s" msgstr "%sã®ã‚µãƒ¼ãƒ“ス" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:84 msgid "Set based on filter" msgstr "フィルタã«åŸºã¥ã„ã¦è¨­å®š" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:44 msgid "Set false" msgstr "FALSEを設定ã™ã‚‹" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:34 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:30 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php:17 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJsonDecode.php:25 msgid "Set no value (null)" msgstr "値ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“(null)" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:42 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:33 msgid "Set null" msgstr "NULLを設定" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:43 msgid "Set true" msgstr "TRUEを設定" #: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:76 msgid "Sets" msgstr "セット" #: ../../../../modules/director/application/forms/IcingaHostForm.php:105 msgid "" "Setting a command endpoint allows you to force host checks to be executed by " "a specific endpoint. Please carefully study the related Icinga documentation " "before using this feature" msgstr "コマンドエンドãƒã‚¤ãƒ³ãƒˆã‚’設定ã™ã‚‹ã¨ã€ç‰¹å®šã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã§" "ホスト監視を強制的ã«å®Ÿè¡Œã§ãã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹å‰ã«ã€é–¢é€£ã™ã‚‹" "Icingaã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’よã調ã¹ã¦ãã ã•ã„。" #: ../../../../modules/director/application/controllers/ConfigController.php:218 #: ../../../../modules/director/library/Director/Web/SelfService.php:93 msgid "Settings" msgstr "設定" #: ../../../../modules/director/application/forms/SettingsForm.php:198 msgid "Settings have been stored" msgstr "設定ã¯ä¿å­˜ã•れã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Web/SelfService.php:86 msgid "Share this Template for Self Service API" msgstr "セルフサービスAPIã«ã“ã®ãƒ†ãƒ³ãƒ—レートを共有" #: ../../../../modules/director/library/Director/Web/SelfService.php:84 msgid "Shared for Self Service API" msgstr "セルフサービスAPIã®ãŸã‚ã«å…±æœ‰ã•れã¦ã„ã¾ã™" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:21 msgid "Should all the other characters be lowercased first?" msgstr "ä»–ã®ã™ã¹ã¦ã®æ–‡å­—ã‚’å…ˆé ­å°æ–‡å­—ã«ã—ã¾ã™ã‹ï¼Ÿ" #: ../../../../modules/director/application/controllers/HostController.php:513 msgid "Show" msgstr "表示" #: ../../../../modules/director/application/controllers/BasketController.php:200 msgid "Show Basket" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆã‚’表示" #: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:75 msgid "Show SQL" msgstr "SQLを表示" #: ../../../../modules/director/library/Director/Web/Table/ApplyRulesTable.php:108 msgid "Show affected Objects" msgstr "影響をå—ã‘るオブジェクトを表示" #: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:457 msgid "Show available options" msgstr "利用å¯èƒ½ãªã‚ªãƒ—ションを表示" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:175 msgid "Show based on filter" msgstr "フィルタã«åŸºã¥ã„ã¦è¡¨ç¤º" #: ../../../../modules/director/library/Director/Web/Table/ActivityLogTable.php:91 msgid "Show details related to this change" msgstr "ã“ã®å¤‰æ›´ã«é–¢é€£ã™ã‚‹è©³ç´°ã‚’表示" #: ../../../../modules/director/library/Director/Web/ObjectPreview.php:51 msgid "Show normal" msgstr "通常表示" #: ../../../../modules/director/library/Director/Web/ObjectPreview.php:60 msgid "Show resolved" msgstr "インãƒãƒ¼ãƒˆå†…容を展開ã—ã¦è¡¨ç¤º" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:33 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:31 msgid "Simple match with wildcards (*)" msgstr "ワイルドカードã¨ã®å˜ç´”一致(*)" #: ../../../../modules/director/application/controllers/BasketController.php:332 msgid "Single Object Diff" msgstr "å˜ä¸€ã‚ªãƒ–ジェクト差分" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:11 msgid "Single Services" msgstr "å˜ä¸€ã®ã‚µãƒ¼ãƒ“ス" #: ../../../../modules/director/library/Director/Web/Table/GeneratedConfigFileTable.php:86 msgid "Size" msgstr "サイズ" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:110 msgid "Skip key" msgstr "キーをスキップ" #: ../../../../modules/director/application/controllers/BasketController.php:247 #: ../../../../modules/director/application/controllers/BasketController.php:364 msgid "Snapshot" msgstr "スナップショット" #: ../../../../modules/director/application/controllers/BasketController.php:36 #: ../../../../modules/director/application/controllers/BasketController.php:141 #: ../../../../modules/director/library/Director/Web/Table/BasketTable.php:32 msgid "Snapshots" msgstr "スナップショット" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:182 msgid "Source Column" msgstr "ソースカラム" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:212 msgid "Source Expression" msgstr "ソース表ç¾" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:38 msgid "Source Name" msgstr "ソースå" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:101 msgid "Source Path" msgstr "ソースパス" #: ../../../../modules/director/application/forms/ImportSourceForm.php:33 msgid "Source Type" msgstr "ソースタイプ" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:159 msgid "Source columns" msgstr "ソースカラム" #: ../../../../modules/director/library/Director/Web/Table/SyncpropertyTable.php:62 msgid "Source field" msgstr "ソースフィールド" #: ../../../../modules/director/library/Director/Web/Table/ImportrunTable.php:30 #: ../../../../modules/director/library/Director/Web/Table/ImportsourceTable.php:18 #: ../../../../modules/director/library/Director/Web/Table/SyncpropertyTable.php:61 msgid "Source name" msgstr "ソースå" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:354 msgid "Special properties" msgstr "特殊プロパティ" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:35 msgid "Specific Element (by position)" msgstr "特定ã®è¦ç´ ï¼ˆä½ç½®æŒ‡å®šï¼‰" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:87 msgid "Stage name" msgstr "ステージå" #: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:25 msgid "Start time" msgstr "開始時間" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:88 msgid "Startup" msgstr "スタートアップ" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:162 msgid "Startup Log" msgstr "スタートアップログ" #: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:77 msgid "State" msgstr "状態" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1614 msgid "State and transition type filters" msgstr "状態フィルターã¨é·ç§»ã‚¿ã‚¤ãƒ—フィルター" #: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:22 msgid "State changes" msgstr "状態変化" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1589 msgid "States" msgstr "状態" #: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:81 msgid "Statistics" msgstr "統計" #: ../../../../modules/director/application/controllers/InspectController.php:43 #: ../../../../modules/director/application/controllers/InspectController.php:151 msgid "Status" msgstr "ステータス" #: ../../../../modules/director/library/Director/Web/SelfService.php:134 msgid "Stop sharing this Template" msgstr "ã“ã®ãƒ†ãƒ³ãƒ—レートã®å…±æœ‰ã‚’ã‚„ã‚ã‚‹" #: ../../../../modules/director/application/forms/SettingsForm.php:107 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:496 msgid "Store" msgstr "ä¿å­˜" #: ../../../../modules/director/application/forms/KickstartForm.php:36 msgid "Store configuration" msgstr "設定をä¿å­˜" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:33 #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:72 #: ../../../../modules/director/library/Director/DataType/DataTypeDatalist.php:65 #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:76 #: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:76 msgid "String" msgstr "文字" #: ../../../../modules/director/application/views/helpers/FormDataFilter.php:534 msgid "Strip this operator, preserve child nodes" msgstr "ã“ã®æ¼”ç®—å­ã‚’å–り除ãã€å­ãƒŽãƒ¼ãƒ‰ã‚’ä¿å­˜ã—ã¾ã™" #: ../../../../modules/director/library/Director/Web/Form/QuickForm.php:206 msgid "Submit" msgstr "é€ä¿¡" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:139 msgid "Succeeded" msgstr "æˆåŠŸã—ã¾ã—ãŸ" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:86 msgid "Suggested fields" msgstr "サジェストã•れãŸãƒ•ィールド" #: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:37 msgid "Switch to Table view" msgstr "テーブル表示ã«åˆ‡ã‚Šæ›¿ãˆ" #: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:36 msgid "Switch to Tree view" msgstr "ツリー表示ã«åˆ‡ã‚Šæ›¿ãˆ" #: ../../../../modules/director/application/controllers/SyncruleController.php:243 #, php-format msgid "Sync \"%s\": %s" msgstr "åŒæœŸ \"%s\": %s" #: ../../../../modules/director/application/controllers/SyncruleController.php:112 msgid "Sync Properties" msgstr "åŒæœŸãƒ—ロパティ" #: ../../../../modules/director/application/forms/BasketForm.php:30 msgid "Sync Rules" msgstr "åŒæœŸãƒ«ãƒ¼ãƒ«" #: ../../../../modules/director/application/controllers/SyncruleController.php:278 msgid "Sync history" msgstr "åŒæœŸå±¥æ­´" #: ../../../../modules/director/application/forms/SyncRuleForm.php:82 #, php-format msgid "" "Sync only part of your imported objects with this rule. Icinga Web 2 filter " "syntax is allowed, so this could look as follows: %s" msgstr "インãƒãƒ¼ãƒˆã—ãŸã‚ªãƒ–ジェクトã®ä¸€éƒ¨ã ã‘ã‚’ã“ã®ãƒ«ãƒ¼ãƒ«ã¨åŒæœŸã—ã¾ã™ã€‚ " "IcingaWeb2ãƒ•ã‚£ãƒ«ã‚¿ã®æ§‹æ–‡ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚例: %s" #: ../../../../modules/director/application/controllers/SyncruleController.php:215 msgid "Sync properties" msgstr "åŒæœŸãƒ—ロパティ" #: ../../../../modules/director/application/controllers/SyncruleController.php:180 #: ../../../../modules/director/application/controllers/SyncrulesController.php:25 #: ../../../../modules/director/library/Director/Web/Tabs/ImportTabs.php:23 #: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:29 #: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:46 msgid "Sync rule" msgstr "åŒæœŸãƒ«ãƒ¼ãƒ«" #: ../../../../modules/director/application/controllers/SyncruleController.php:32 #: ../../../../modules/director/application/controllers/SyncruleController.php:152 #, php-format msgid "Sync rule: %s" msgstr "åŒæœŸãƒ«ãƒ¼ãƒ«: %s" #: ../../../../modules/director/application/forms/SyncRunForm.php:42 msgid "Synchronization failed" msgstr "åŒæœŸãŒå¤±æ•—ã—ã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Job/SyncJob.php:80 msgid "Synchronization rule" msgstr "åŒæœŸãƒ«ãƒ¼ãƒ«" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/SyncDashlet.php:14 msgid "Synchronize" msgstr "åŒæœŸ" #: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:30 msgid "Table" msgstr "表" #: ../../../../modules/director/application/forms/RestoreBasketForm.php:51 msgid "Target DB" msgstr "対象DB" #: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:60 msgid "Target Service Set" msgstr "対象サービスセット" #: ../../../../modules/director/library/Director/DataType/DataTypeDatalist.php:63 #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:74 #: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:74 msgid "Target data type" msgstr "対象データタイプ" #: ../../../../modules/director/application/forms/ImportRowModifierForm.php:44 msgid "Target property" msgstr "対象プロパティ" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:156 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1053 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1057 msgid "Template" msgstr "テンプレート" #: ../../../../modules/director/library/Director/Web/Table/TemplatesTable.php:51 msgid "Template Name" msgstr "テンプレートå" #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:276 #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:113 #, php-format msgid "Template: %s" msgstr "テンプレート: %s" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:687 #: ../../../../modules/director/library/Director/Web/Table/DependencyTemplateUsageTable.php:10 #: ../../../../modules/director/library/Director/Web/Table/HostTemplateUsageTable.php:10 #: ../../../../modules/director/library/Director/Web/Table/NotificationTemplateUsageTable.php:10 #: ../../../../modules/director/library/Director/Web/Table/ServiceTemplateUsageTable.php:10 #: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:23 #: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:53 #: ../../../../modules/director/library/Director/Web/Tree/TemplateTreeRenderer.php:43 msgid "Templates" msgstr "テンプレート" #: ../../../../modules/director/library/Director/Job/ImportJob.php:67 msgid "The \"Import\" job allows to run import actions at regular intervals" msgstr "「インãƒãƒ¼ãƒˆã€ã‚¸ãƒ§ãƒ–ã¯å®šæœŸçš„ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã™ã‚‹ã“ã¨ã‚’" "å¯èƒ½ã«ã—ã¾ã™" #: ../../../../modules/director/library/Director/Job/SyncJob.php:65 msgid "The \"Sync\" job allows to run sync actions at regular intervals" msgstr "ã€ŒåŒæœŸã€ã‚¸ãƒ§ãƒ–を使用ã™ã‚‹ã¨ã€å®šæœŸçš„ã«åŒæœŸã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:84 #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:640 #, php-format msgid "The %s has successfully been stored" msgstr "%s ã¯æ­£å¸¸ã«ä¿å­˜ã•れã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Job/ConfigJob.php:221 msgid "" "The Config job allows you to generate and eventually deploy your Icinga 2 " "configuration" msgstr "æ§‹æˆã‚¸ãƒ§ãƒ–を使用ã™ã‚‹ã¨ã€Icinga 2æ§‹æˆã‚’生æˆã—ã¦è¨­å®šã®å映を" "ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaUserForm.php:37 msgid "The Email address of the user." msgstr "ユーザーã®Eメールアドレス。" #: ../../../../modules/director/library/Director/Job/HousekeepingJob.php:21 msgid "" "The Housekeeping job provides various task that keep your Director database " "fast and clean" msgstr "ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングジョブã¯ã€Directorデータベースを高速ã‹ã¤ã‚¯ãƒªãƒ¼ãƒ³ã«" "ä¿ã¤ãŸã‚ã®ã•ã¾ã–ã¾ãªã‚¿ã‚¹ã‚¯ã‚’æä¾›ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/controllers/SettingsController.php:38 msgid "" "The Icinga Director Self Service API allows your Hosts to register " "themselves. This allows them to get their Icinga Agent configured, installed " "and upgraded in an automated way." msgstr "Icinga Director セルフサービス APIを使用ã™ã‚‹ã¨ã€ãƒ›ã‚¹ãƒˆã¯è‡ªåˆ†è‡ªèº«ã‚’" "登録ã§ãã¾ã™ã€‚ ã“れã«ã‚ˆã‚Šã€Icinga Agentを自動化ã•ã‚ŒãŸæ–¹æ³•ã§è¨­å®šã€" "インストールã€ã‚¢ãƒƒãƒ—グレードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SettingsForm.php:45 msgid "" "The Icinga Package name Director uses to deploy it's configuration. This " "defaults to \"director\" and should not be changed unless you really know " "what you're doing" msgstr "DirectorãŒãã®è¨­å®šã‚’åæ˜ ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹Icingaパッケージå。" " ã“れã¯ãƒ‡ãƒ•ォルト㧠\"director\"ã«è¨­å®šã•れã¦ã„ã‚‹ã®ã§ã€" "分ã‹ã‚‰ãªã‘れã°å¤‰æ›´ã—ãªã„ã§ãã ã•ã„。" #: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:69 msgid "" "The LDAP properties that should be fetched. This is required to be a comma-" "separated list like: \"cn, dnshostname, operatingsystem, sAMAccountName\"" msgstr "å–å¾—ã™ã‚‹å¿…è¦ãŒã‚ã‚‹LDAPプロパティ。ã“れã¯ã€\"cn, dnshostname, " "operatingsystem, sAMAccountName\"ã®ã‚ˆã†ã«ã‚³ãƒ³ãƒžåŒºåˆ‡ã‚Šã®ãƒªã‚¹ãƒˆã«ã™ã‚‹" "å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaForgetApiKeyForm.php:31 #, php-format msgid "The Self Service API key for %s has been dropped" msgstr "%sã®ã‚»ãƒ«ãƒ•サービスAPIキーを削除ã—ã¾ã—ãŸã€‚" #: ../../../../modules/director/application/forms/IcingaAddServiceSetForm.php:116 #, php-format msgid "The Service Set \"%s\" has been added to %d hosts" msgstr "サービスセット\"%s\"ã‚’%d 個ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã—ãŸã€‚" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:162 #, php-format msgid "The argument %s has successfully been stored" msgstr "引数%sã¯æ­£å¸¸ã«ä¿å­˜ã•れã¾ã—ãŸ" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:121 msgid "The caption which should be displayed" msgstr "表示ã•れるキャプション" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:151 msgid "" "The caption which should be displayed to your users when this field is shown" msgstr "ã“ã®ãƒ•ィールドãŒè¡¨ç¤ºã•れãŸã¨ãã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è¡¨ç¤ºã•れるキャプション" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:233 msgid "The child host." msgstr "å­ãƒ›ã‚¹ãƒˆ" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:62 msgid "" "The command Icinga should run. Absolute paths are accepted as provided, " "relative paths are prefixed with \"PluginDir + \", similar Constant prefixes " "are allowed. Spaces will lead to separation of command path and standalone " "arguments. Please note that this means that we do not support spaces in " "plugin names and paths right now." msgstr "IcingaãŒå®Ÿè¡Œã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã§ã™ã€‚ çµ¶å¯¾ãƒ‘ã‚¹ã¯æŒ‡å®šã©ãŠã‚Šã«å—ã‘入れられã€" "相対パスã®å…ˆé ­ã«ã¯ \"PluginDir +\"ãŒä»˜ãã¾ã™ã€‚åŒæ§˜ã®å®šæ•°ãƒ—レフィックスãŒ" "許å¯ã•れã¾ã™ã€‚ スペースã¯ã€ã‚³ãƒžãƒ³ãƒ‰ãƒ‘スã¨ã‚¹ã‚¿ãƒ³ãƒ‰ã‚¢ãƒ­ãƒ³å¼•æ•°ã®åˆ†é›¢ã«" "ã¤ãªãŒã‚Šã¾ã™ã€‚ ã“れã¯ã€ç¾æ™‚点ã§ã¯ãƒ—ラグインåã¨ãƒ‘スã§ã‚¹ãƒšãƒ¼ã‚¹ã‚’サãƒãƒ¼ãƒˆ" "ã—ã¦ã„ãªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/KickstartForm.php:161 msgid "The corresponding password" msgstr "対応ã™ã‚‹ãƒ‘スワード" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierStripDomain.php:14 msgid "The domain name you want to be stripped" msgstr "削除ã—ãŸã„ドメインå" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:18 msgid "The first (leftmost) CN" msgstr "最åˆï¼ˆä¸€ç•ªå·¦ï¼‰ã®CN" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:19 msgid "The first (leftmost) OU" msgstr "最åˆï¼ˆä¸€ç•ªå·¦ï¼‰ã®OU" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:726 #, php-format msgid "The given properties have been stored for \"%s\"" msgstr "プロパティãŒ\"%s\" ã«ä¿å­˜ã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1592 msgid "The host/service states you want to get notifications for" msgstr "通知をå—ã‘å–るホスト/サービスã®çŠ¶æ…‹" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:21 msgid "The last (rightmost) OU" msgstr "最後(一番å³ï¼‰ã®OU" #: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:51 #, php-format msgid "The last attempt failed at %s: %s" msgstr "最後ã®è©¦è¡Œã¯%sã§å¤±æ•—ã—ã¾ã—ãŸï¼š%s" #: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:46 #, php-format msgid "The last attempt succeeded at %s" msgstr "最後ã®è©¦è¡Œã¯%sã§æˆåŠŸã—ã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:83 msgid "The last deployment did not succeed" msgstr "最後ã®è¨­å®šåæ˜ ã¯æˆåŠŸã—ã¾ã›ã‚“ã§ã—ãŸ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:85 msgid "The last deployment is currently pending" msgstr "最後ã®è¨­å®šå映ã¯ä¿ç•™ã«ãªã£ã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:42 msgid "The log duration time." msgstr "接続ãŒå¤±ã‚れãŸå ´åˆã®ã€ç›£è¦–ログã®ä¿å­˜ç§’æ•°" #: ../../../../modules/director/application/forms/IcingaUserForm.php:160 msgid "" "The name of a time period which determines when notifications to this User " "should be triggered. Not set by default." msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¸ã®é€šçŸ¥ã‚’ã„ã¤ãƒˆãƒªã‚¬ãƒ¼ã™ã‚‹ã‹ã‚’決定ã™ã‚‹æœŸé–“ã®åå‰ã€‚" "デフォルトã§ã¯è¨­å®šã•れã¦ã„ã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:140 #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:231 msgid "" "The name of a time period which determines when this notification should be " "triggered. Not set by default." msgstr "ã“ã®é€šçŸ¥ã‚’ã„ã¤ãƒˆãƒªã‚¬ãƒ¼ã™ã‚‹ã‹ã‚’決定ã™ã‚‹æœŸé–“ã®åå‰ã€‚" " デフォルトã§ã¯è¨­å®šã•れã¦ã„ã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1344 msgid "" "The name of a time period which determines when this object should be " "monitored. Not limited by default." msgstr "監視を実行ã™ã‚‹æœŸé–“ã®è¨­å®šã€‚デフォルトã§ã¯æœŸé–“ã¯ç„¡åˆ¶é™ã§ã™ã€‚" #: ../../../../modules/director/application/forms/DirectorJobForm.php:62 msgid "" "The name of a time period within this job should be active. Supports only " "simple time periods (weekday and multiple time definitions)" msgstr "有効ãªã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«è¨­å®šã‚’指定ã—ã¦ãã ã•ã„。" "曜日ã¨è¤‡æ•°ã®å®Ÿè¡Œæ™‚間定義ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaHostVarForm.php:16 msgid "The name of the host" msgstr "ホストã®åç§°" #: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:16 msgid "The name of the service" msgstr "サービスã®åç§°" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:175 msgid "" "The notification interval (in seconds). This interval is used for active " "notifications. Defaults to 30 minutes. If set to 0, re-notifications are " "disabled." msgstr "通知間隔(秒)。ã“ã®é–“éš”ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–通知ã«ä½¿ç”¨ã•れã¾ã™ã€‚ デフォルトã¯30分ã§ã™ã€‚ 0ã«è¨­å®šã™ã‚‹ã¨ã€å†é€šçŸ¥ã¯ç„¡åйã«ãªã‚Šã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierBitmask.php:16 msgid "" "The numeric bitmask you want to apply. In case you have a hexadecimal or " "binary mask please transform it to a decimal number first. The result of " "this modifier is a boolean value, telling whether the given mask applies to " "the numeric value in your source column" msgstr "é©ç”¨ã—ãŸã„数値ビットマスク。 16進数ã¾ãŸã¯2進数ã®ãƒžã‚¹ã‚¯ãŒã‚ã‚‹å ´åˆã¯ã€" "ã¾ãšãれを10進数ã«å¤‰æ›ã—ã¦ãã ã•ã„。 ã“ã®ãƒ—ロパティ変æ›ãƒ«ãƒ¼ãƒ«ã®çµæžœã¯ãƒ–ール値ã§ã€" "与ãˆã‚‰ã‚ŒãŸãƒžã‚¹ã‚¯ãŒã‚½ãƒ¼ã‚¹ã‚«ãƒ©ãƒ ã®æ•°å€¤ã«é©ç”¨ã•れるã‹ã©ã†ã‹ã‚’示ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaUserForm.php:42 msgid "The pager address of the user." msgstr "ユーザã®å°åž‹ç„¡ç·šæ©Ÿã®ã‚¢ãƒ‰ãƒ¬ã‚¹" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:194 msgid "The parent host." msgstr "親ホスト" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexReplace.php:15 msgid "" "The pattern you want to search for. This can be a regular expression like /" "^www\\d+\\./" msgstr "検索ã—ãŸã„パターン。ã“れã¯/^www\\d+\\./ã®ã‚ˆã†ãªæ­£è¦è¡¨ç¾ã«ãªã‚Šã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaEndpointForm.php:37 msgid "The port of the endpoint." msgstr "エンドãƒã‚¤ãƒ³ãƒˆã®ãƒãƒ¼ãƒˆ" #: ../../../../modules/director/application/forms/KickstartForm.php:144 msgid "" "The port you are going to use. The default port 5665 will be used if none is " "set" msgstr "使用ã—よã†ã¨ã—ã¦ã„ã‚‹ãƒãƒ¼ãƒˆã€‚ 何も設定ã•れã¦ã„ãªã„å ´åˆã¯ã€" "デフォルトã®ãƒãƒ¼ãƒˆ5665ãŒä½¿ç”¨ã•れã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:173 #, php-format msgid "The service \"%s\" has been added to %d hosts" msgstr "サービス \"%s\" ㌠%d 個ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ ã•れã¾ã—ãŸ" #: ../../../../modules/director/application/forms/IcingaAddServiceSetForm.php:88 msgid "The service Set that should be assigned" msgstr "割り当ã¦ã‚‹ã¹ãサービスセット" #: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:87 msgid "The service set that should be assigned to this host" msgstr "ã“ã®ãƒ›ã‚¹ãƒˆã«å‰²ã‚Šå½“ã¦ã‚‹ã¹ãサービスセット" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1602 msgid "The state transition types you want to get notifications for" msgstr "通知をå—ã‘å–る状態é·ç§»ã®ç¨®é¡ž" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexReplace.php:23 msgid "The string that should be used as a preplacement" msgstr "ç½®ãæ›ãˆã«ä½¿ç”¨ã•れる文字列" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierReplace.php:14 msgid "The string you want to search for" msgstr "検索ã—ãŸã„文字列" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:41 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:43 msgid "" "The string/pattern you want to search for. Depends on the chosen method, use " "www.* or *linux* for wildcard matches and expression like /^www\\d+\\./ in " "case you opted for a regular expression" msgstr "検索ã—ãŸã„文字列/パターン。 é¸æŠžã—ãŸæ–¹æ³•ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ãŒã€" "ワイルドカードã®ä¸€è‡´ã«ã¯ www.* ã¾ãŸã¯ *linux* を使用ã—ã€æ­£è¦è¡¨ç¾ã‚’" "é¸æŠžã—ãŸå ´åˆã¯/^www\\d+\\./ã®ã‚ˆã†ãªè¡¨ç¾ã‚’使用ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:141 msgid "" "The unique name of the field. This will be the name of the custom variable " "in the rendered Icinga configuration." msgstr "フィールドã®åå‰ã€‚一æ„ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" "ã“ã®åå‰ã¯ãƒ›ã‚¹ãƒˆã‚„サービス等ã®icingaã®è¨­å®šã§å®šç¾©ã™ã‚‹ã‚«ã‚¹ã‚¿ãƒ å¤‰æ•°ã®" "åå‰ã«ãªã‚Šã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:168 msgid "The user that should run the Icinga 2 service on Windows." msgstr "Windows上ã§Icinga 2サービスを実行ã™ã‚‹å¿…è¦ãŒã‚るユーザー。" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:72 #, php-format msgid "" "There are %d objects with a related property. Should I also remove the \"%s" "\" property from them?" msgstr "%d個ã®ã‚ªãƒ–ジェクトãŒé–¢é€£ãƒ—ロパティをæŒã£ã¦ã„ã¾ã™ã€‚" "ãれらã®ã‚ªãƒ–ジェクトã‹ã‚‰ã‚‚\"%s\"プロパティを削除ã—ã¾ã™ã‹ï¼Ÿ " #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:116 #, php-format msgid "" "There are %d objects with a related property. Should I also rename the \"%s" "\" property to \"%s\" on them?" msgstr "%d個ã®ã‚ªãƒ–ジェクトãŒé–¢é€£ãƒ—ロパティをæŒã£ã¦ã„ã¾ã™ã€‚ " "ãれらã®ã‚ªãƒ–ジェクトã®\"%s\"プロパティã®åå‰ã‚‚\"%s \"ã«å¤‰æ›´ã—ã¾ã™ã‹ï¼Ÿ" #: ../../../../modules/director/application/forms/DeploymentLinkForm.php:64 #, php-format msgid "There are %d pending changes" msgstr "%d 個ã®ä¿ç•™ã•れãŸå¤‰æ›´ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/DeploymentLinkForm.php:77 #, php-format msgid "There are %d pending changes, %d of them applied to this object" msgstr "%d 個ã®ä¿ç•™ã•れãŸå¤‰æ›´ãŒã‚りã¾ã™ã€‚ãれらã®ã†ã¡ã€%d 個ãŒ" "ã“ã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:88 #, php-format msgid "There are %d pending database migrations" msgstr "%d 個ã®ä¿ç•™ã•れãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç§»è¡ŒãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:109 msgid "" "There are no data fields available. Please ask an administrator to create " "such" msgstr "利用å¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ•ィールドãŒã‚りã¾ã›ã‚“。" "作æˆã™ã‚‹ã‚ˆã†ã«ç®¡ç†è€…ã«ä¾é ¼ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:91 msgid "There are no pending changes" msgstr "ä¿ç•™ä¸­ã®å¤‰æ›´ã¯ã‚りã¾ã›ã‚“" #: ../../../../modules/director/application/forms/DeployConfigForm.php:36 msgid "There are no pending changes. Deploy anyways" msgstr "è¨­å®šã‚’åæ˜ ã™ã‚‹(ä¿ç•™ä¸­ã®å¤‰æ›´ã¯ã‚りã¾ã›ã‚“。)" #: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:58 msgid "" "There are pending changes for this Import Source. You should trigger a new " "Import Run." msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã«ã¯ä¿ç•™ä¸­ã®å¤‰æ›´ãŒã‚りã¾ã™ã€‚" "æ–°ã—ã„インãƒãƒ¼ãƒˆå‡¦ç†ã‚’トリガã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/controllers/SyncruleController.php:74 msgid "" "There are pending changes for this Sync Rule. You should trigger a new Sync " "Run." msgstr "ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã«ã¯ä¿ç•™ä¸­ã®å¤‰æ›´ãŒã‚りã¾ã™ã€‚ æ–°ã—ã„åŒæœŸå‡¦ç†ã‚’トリガã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/KickstartForm.php:62 msgid "There are pending database migrations" msgstr "ä¿ç•™ä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç§»è¡ŒãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/DeploymentLinkForm.php:69 msgid "" "There has been a single change to this object, nothing else has been modified" msgstr "ã“ã®ã‚ªãƒ–ジェクトã«ã¯1ã¤ã®å¤‰æ›´ãŒã‚りã€ä»–ã®å¤‰æ›´ã¯ã‚りã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/DeploymentLinkForm.php:72 #, php-format msgid "" "There have been %d changes to this object, nothing else has been modified" msgstr "ã“ã®ã‚ªãƒ–ジェクトã«ã¯%d個ã®å¤‰æ›´ãŒã‚りã€ä»–ã®å¤‰æ›´ã¯ã‚りã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/DeploymentLinkForm.php:61 msgid "There is a single pending change" msgstr "ä¿ç•™ä¸­ã®å¤‰æ›´ãŒ1ã¤ã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/DirectorJobForm.php:21 msgid "These are different available job types" msgstr "様々ãªåˆ©ç”¨å¯èƒ½ãªã‚¸ãƒ§ãƒ–タイプãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/ImportSourceForm.php:37 msgid "" "These are different data providers fetching data from various sources. You " "didn't find what you're looking for? Import sources are implemented as a " "hook in Director, so you might find (or write your own) Icinga Web 2 module " "fetching data from wherever you want" msgstr "ã•ã¾ã–ã¾ãªã‚½ãƒ¼ã‚¹ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚‹ã•ã¾ã–ã¾ãªãƒ‡ãƒ¼ã‚¿ãƒ—ロãƒã‚¤ãƒ€ã€‚" "ãªãŠã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯Directorã®ãƒ•ックã¨ã—ã¦" "実装ã•れã¦ã„ã‚‹ã®ã§ã€Icinga Web 2モジュールãŒå¿…è¦ãªå ´æ‰€ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—" "ã—ã¦ã„る(ã¾ãŸã¯è‡ªåˆ†ã§ä½œæˆã—ãŸï¼‰å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/controllers/CommandController.php:71 #, php-format msgid "This Command is currently being used by %s" msgstr "ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ç¾åœ¨%s ã«ã‚ˆã£ã¦ä½¿ç”¨ã•れã¦ã„ã¾ã™" #: ../../../../modules/director/application/controllers/CommandController.php:78 msgid "This Command is currently not in use" msgstr "ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ç¾åœ¨ä½¿ç”¨ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:895 #, php-format msgid "This Command is still in use by %d other objects" msgstr "ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã¾ã ã»ã‹ã® %d 個ã®ã‚ªãƒ–ジェクトã«ä½¿ç”¨ã•れã¦ã„ã¾ã™" #: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:65 #, php-format msgid "This Import Source failed when last checked at %s: %s" msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯ %s ã«è¡Œã‚れãŸç›£è¦–ã§å¤±æ•—ã—ã¾ã—ãŸ: %s " #: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:73 #, php-format msgid "This Import Source has an invalid state: %s" msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯ç„¡åйãªçŠ¶æ…‹ã§ã™: %s" #: ../../../../modules/director/application/forms/ImportCheckForm.php:33 msgid "This Import Source provides modified data" msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯å¤‰æ›´ã•れãŸãƒ‡ãƒ¼ã‚¿ã‚’æä¾›ã—ã¾ã™" #: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:48 #, php-format msgid "This Import Source was last found to be in sync at %s." msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¯æœ€å¾Œã«%sã«åŒæœŸã—ã¦ã„ã‚‹ã“ã¨ãŒã‚ã‹ã‚Šã¾ã—ãŸ" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:134 msgid "This Service has been blacklisted on this host" msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã¯ã“ã®ãƒ›ã‚¹ãƒˆã§ãƒ–ラックリストã«ç™»éŒ²ã•れã¦ã„ã¾ã™" #: ../../../../modules/director/application/controllers/SyncruleController.php:81 #, php-format msgid "This Sync Rule failed when last checked at %s: %s" msgstr "ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã¯ã€æœ€å¾Œã« %s ã«ç›£è¦–ã•れãŸã¨ãã«å¤±æ•—ã—ã¾ã—ãŸ: %s" #: ../../../../modules/director/application/controllers/SyncruleController.php:51 msgid "This Sync Rule has never been run before." msgstr "ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã¯ä¸€åº¦ã‚‚実行ã•れãŸã“ã¨ãŒã‚りã¾ã›ã‚“。" #: ../../../../modules/director/application/controllers/SyncruleController.php:63 #, php-format msgid "This Sync Rule was last found to by in Sync at %s." msgstr "ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã¯ã€%sã®åŒæœŸã§æœ€å¾Œã«è¦‹ã¤ã‹ã£ãŸã‚‚ã®ã§ã™ã€‚" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:104 msgid "" "This allows to filter for specific parts within the given source expression. " "You are allowed to refer all imported columns. Examples: host=www* would set " "this property only for rows imported with a host property starting with \"www" "\". Complex example: host=www*&!(address=127.*|address6=::1)" msgstr "指定ã•れãŸå…ƒã®è¡¨ç¾å†…ã®ç‰¹å®šã®éƒ¨åˆ†ã‚’フィルタリングã§ãã¾ã™ã€‚ " "インãƒãƒ¼ãƒˆã•れãŸã™ã¹ã¦ã®ã‚«ãƒ©ãƒ ã‚’å‚ç…§ã™ã‚‹ã“ã¨ãŒè¨±å¯ã•れã¦ã„ã¾ã™ã€‚ " "例)「host=www*〠ã¯ã€\"www\"ã§å§‹ã¾ã‚‹ãƒ›ã‚¹ãƒˆãƒ—ロパティã§ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸè¡Œã«" "対ã—ã¦ã®ã¿ã“ã®ãƒ—ロパティを設定ã—ã¾ã™ã€‚ " "複雑ãªä¾‹ï¼šhost=www*&!(address=127.*|address6=::1)" #: ../../../../modules/director/application/forms/DirectorJobForm.php:39 msgid "This allows to temporarily disable this job" msgstr "ã“れã«ã‚ˆã‚Šã€ã“ã®ã‚¸ãƒ§ãƒ–を一時的ã«ç„¡åйã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:115 #: ../../../../modules/director/application/forms/IcingaHostGroupForm.php:30 #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:106 #: ../../../../modules/director/application/forms/IcingaServiceForm.php:448 #: ../../../../modules/director/application/forms/IcingaServiceGroupForm.php:30 msgid "" "This allows you to configure an assignment filter. Please feel free to " "combine as many nested operators as you want" msgstr "ã“れã«ã‚ˆã‚Šã€æ¡ä»¶ãƒ•ィルタを設定ã§ãã¾ã™ã€‚ 入れå­ã«ã—ãŸæ¼”ç®—å­ã‚’" "自由ã«çµ„ã¿åˆã‚ã›ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:121 msgid "" "This allows you to configure an assignment filter. Please feel free to " "combine as many nested operators as you want. You might also want to skip " "this, define it later and/or just add this set of services to single hosts" msgstr "ã“れã«ã‚ˆã‚Šã€æ¡ä»¶ãƒ•ィルタを設定ã§ãã¾ã™ã€‚ 入れå­ã«ã—ãŸæ¼”ç®—å­ã‚’" "自由ã«çµ„ã¿åˆã‚ã›ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ã“れをスキップã—ã¦å¾Œã§å®šç¾©ã—ãŸã‚Šã€" "ã“ã®ã‚µãƒ¼ãƒ“スセットをå˜ä¸€ã®ãƒ›ã‚¹ãƒˆã«è¿½åŠ ã—ãŸã‚Šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Job/ConfigJob.php:197 msgid "This allows you to immediately deploy a modified configuration" msgstr "ã“れã«ã‚ˆã‚Šã€å¤‰æ›´ã—ãŸè¨­å®šã‚’ã™ãã«å映ã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/ProvidedHook/CubeLinks.php:37 #, php-format msgid "This allows you to modify properties for \"%s\"" msgstr "ã“れã«ã‚ˆã‚Šã€\"%s\" ã®ãƒ—ロパティを編集ã§ãã¾ã™" #: ../../../../modules/director/library/Director/ProvidedHook/CubeLinks.php:54 msgid "This allows you to modify properties for all chosen hosts at once" msgstr "ã“れã«ã‚ˆã‚Šã€é¸æŠžã—ãŸã™ã¹ã¦ã®ãƒ›ã‚¹ãƒˆã®ãƒ—ロパティを一括ã§ç·¨é›†ã§ãã¾ã™" #: ../../../../modules/director/application/controllers/BasketController.php:62 msgid "This basket is empty" msgstr "ã“ã®ãƒã‚¹ã‚±ãƒƒãƒˆã¯ç©ºã§ã™" #: ../../../../modules/director/application/forms/KickstartForm.php:253 msgid "This has to be a MySQL or PostgreSQL database" msgstr "MySQLã¾ãŸã¯PostgreSQLデータベースã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Web/SelfService.php:62 msgid "" "This host has been registered via the Icinga Director Self Service API. In " "case you re-installed the host or somehow lost it's secret key, you might " "want to dismiss the current key. This would allow you to register the same " "host again." msgstr "ã“ã®ãƒ›ã‚¹ãƒˆã¯Icinga Director セルフサービス APIを介ã—ã¦ç™»éŒ²ã•れã¦ã„" "ã¾ã™ã€‚ホストをå†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ãŸå ´åˆã‚„ã€ä½•らã‹ã®ç†ç”±ã§ãã®ç§˜å¯†éµã‚’" "失ã£ãŸå ´åˆã€ç¾åœ¨ã®éµã‚’消ã™ã“ã¨ãŒã§ãã¾ã™ã€‚" "ã“れã«ã‚ˆã‚Šã€åŒã˜ãƒ›ã‚¹ãƒˆã‚’å†åº¦ç™»éŒ²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/controllers/InspectController.php:73 msgid "This is an abstract object type." msgstr "ã“ã‚Œã¯æŠ½è±¡ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆåž‹ã§ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:176 #, php-format msgid "This is the \"%s\" %s Template. Based on this, you might want to:" msgstr "ã“れã¯%sã®ã€Œ%sã€ãƒ†ãƒ³ãƒ—レートã§ã™ã€‚テンプレートを利用ã—ã¦æ¬¡ã®ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/KickstartForm.php:119 msgid "" "This is the name of the Endpoint object (and certificate name) you created " "for your ApiListener object. In case you are unsure what this means please " "make sure to read the documentation first" msgstr "ã“れã¯ã€ApiListenerオブジェクト用ã«ä½œæˆã—ãŸã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã‚ªãƒ–ジェクト" "ã®åå‰ï¼ˆãŠã‚ˆã³è¨¼æ˜Žæ›¸ã®åå‰ï¼‰ã§ã™ã€‚ ã“れãŒä½•ã‚’æ„味ã™ã‚‹ã®ã‹ã‚ˆãã‚ã‹ã‚‰ãªã„å ´åˆ" "ã¯ã€å¿…ãšæœ€åˆã«ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’読むよã†ã«ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostsDashlet.php:17 msgid "" "This is where you add all your servers, containers, network or sensor " "devices - and much more. Every subject worth to be monitored" msgstr "監視対象ã«ã™ã‚‹ã™ã¹ã¦ã®ã‚µãƒ¼ãƒãƒ¼ã€ã‚³ãƒ³ãƒ†ãƒŠãƒ¼ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã€ã¾ãŸã¯ã‚»ãƒ³ã‚µãƒ¼ãƒ‡ãƒã‚¤ã‚¹ãªã©ã‚’追加ã§ãã¾ã™" #: ../../../../modules/director/library/Director/Dashboard/HostsDashboard.php:22 msgid "" "This is where you manage your Icinga 2 Host Checks. Host templates are your " "main building blocks. You can bundle them to \"choices\", allowing (or " "forcing) your users to choose among a given set of preconfigured templates." msgstr "Icinga 2ホスト監視を管ç†ã—ã¾ã™ã€‚" "ホストテンプレートã¯ä¸»ãªæ§‹æˆè¦ç´ ã§ã™ã€‚ 事å‰ã«è¨­å®šã—ãŸè¤‡æ•°ã®ãƒ†ãƒ³ãƒ—レートを組ã¿åˆã‚ã›ã¦ã€Œãƒãƒ§ã‚¤ã‚¹ã€ã‚’作æˆã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒãƒãƒ§ã‚¤ã‚¹ã«ã«å¾“ã£ã¦è¨­å®šã§ã§ãるよã†ã«ã™ã‚‹ï¼ˆã¾ãŸã¯å¼·åˆ¶ã™ã‚‹ï¼‰ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/ServicesDashboard.php:24 msgid "" "This is where you manage your Icinga 2 Service Checks. Service Templates are " "your base building blocks, Service Sets allow you to assign multiple " "Services at once. Apply Rules make it possible to assign Services based on " "Host properties. And the list of all single Service Objects gives you the " "possibility to still modify (or delete) many of them at once." msgstr "Icinga 2 サービス監視設定を管ç†ã—ã¾ã™ã€‚ サービステンプレートã¯ã€" "サービス監視設定ã®åŸºæœ¬çš„ãªæ§‹æˆè¦ç´ ã§ã™ã€‚サービスセットを使用ã™ã‚‹ã¨ã€ä¸€åº¦ã«" "複数ã®ã‚µãƒ¼ãƒ“ス監視設定をã¾ã¨ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’使用ã™ã‚‹ã¨ã€" "ホスト設定をæ¡ä»¶ã«ã—ã¦ã€ã‚µãƒ¼ãƒ“ス監視設定を動的ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" " ãã—ã¦ã€ã™ã¹ã¦ã®è¤‡æ•°ã®ã‚µãƒ¼ãƒ“スオブジェクを一度ã«å¤‰æ›´ï¼ˆã¾ãŸã¯å‰Šé™¤ï¼‰ã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Dashboard/UsersDashboard.php:21 msgid "" "This is where you manage your Icinga 2 User (Contact) objects. Try to keep " "your User objects simply by movin complexity to your templates. Bundle your " "users in groups and build Notifications based on them. Running MS Active " "Directory or another central User inventory? Stay away from fiddling with " "manual config, try to automate all the things with Imports and related Sync " "Rules!" msgstr "Icinga 2 User(コンタクト)オブジェクトを管ç†ã—ã¾ã™ã€‚ テンプレートã«" "複雑ã•を加ãˆã‚‹ã ã‘ã§ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚ªãƒ–ジェクトを維æŒã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。 " "ユーザーをグループã«ã¾ã¨ã‚ã€ãれらã«åŸºã¥ã„ã¦é€šçŸ¥ã‚’作æˆã—ã¾ã™ã€‚ MS Active " "Directoryã¾ãŸã¯LDAPãªã©ã®ä»–ã®ä¸­å¤®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’実行ã—ã¦ã„ã¾ã™ã‹ï¼Ÿ" "設定を手動ã§ã„ã˜ã‚‹ã®ã‚’é¿ã‘ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚„関連ã™ã‚‹åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’使ã£ã¦ã™ã¹ã¦" "ã®ã“ã¨ã‚’自動化ã—ã¦ã¿ã¦ãã ã•ã„。" #: ../../../../modules/director/library/Director/Dashboard/InfrastructureDashboard.php:24 msgid "" "This is where you manage your Icinga 2 infrastructure. When adding a new " "Icinga Master or Satellite please re-run the Kickstart Helper once.\n" "\n" "When you feel the desire to manually create Zone or Endpoint objects please " "rethink this twice. Doing so is mostly the wrong way, might lead to a dead " "end, requiring quite some effort to clean up the whole mess afterwards." msgstr "Icinga 2インフラストラクãƒãƒ£ã‚’管ç†ã—ã¾ã™ã€‚ æ–°ã—ã„Icinga Masterã¾ãŸã¯" "サテライトを追加ã™ã‚‹ã¨ãã¯ã€ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‚’ã‚‚ã†ä¸€åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„。\n" "\n" "手動ã§Zoneã¾ãŸã¯Endpointオブジェクトを作æˆã—ãŸã„ã¨ãã¯ã€ã‚ˆã考ãˆã¦" "ãã ã•ã„。 手動ã§ã®ä½œæˆã¯é–“é•ã£ãŸæ–¹æ³•ã§ã‚りã€ãã®å¾Œã®æ··ä¹±ã‚’æ‹›ãæã‚ŒãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Table/ObjectsTableEndpoint.php:45 msgid "This is your Config master and will receive our Deployments" msgstr "ã“れã¯è¨­å®šãƒžã‚¹ã‚¿ã§ã€è¨­å®šæƒ…報をå—ä¿¡ã—ã¾ã™ã€‚" # smori #: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:57 msgid "This job has not been executed yet" msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ä¸€åº¦ã‚‚実行ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:33 #, php-format msgid "This job runs every %ds and is currently pending" msgstr "ã“ã®ã‚¸ãƒ§ãƒ–㯠%d ç§’ã”ã¨ã«å®Ÿè¡Œã•れã€ç¾åœ¨ã¯ä¿ç•™ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:37 #, php-format msgid "This job runs every %ds." msgstr "ã“ã®ã‚¸ãƒ§ãƒ–㯠%d ç§’ã”ã¨ã«å®Ÿè¡Œã•れã¾ã™" #: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:24 #, php-format msgid "" "This job would run every %ds. It has been disabled and will therefore not be " "executed as scheduled" msgstr "ã“ã®ã‚¸ãƒ§ãƒ–㯠%d ç§’ã”ã¨ã«å®Ÿè¡Œã•れã¾ã™ã€‚無効ã«ãªã£ã¦ã„ã‚‹ãŸã‚ã€ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã©ãŠã‚Šã«å®Ÿè¡Œã•れã¾ã›ã‚“" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:33 msgid "" "This modifier transforms 0/\"0\"/false/\"false\"/\"n\"/\"no\" to false and " "1, \"1\", true, \"true\", \"y\" and \"yes\" to true, both in a case " "insensitive way. What should happen if the given value does not match any of " "those? You could return a null value, or default to false or true. You might " "also consider interrupting the whole import process as of invalid source data" msgstr "ã“ã®ãƒ—ロパティ変æ›ãƒ«ãƒ¼ãƒ«ã¯ã€0ã€\"0\"ã€falseã€\"false\"ã€\"n\"ã€\"no\"ã‚’ false" " ã«ã€1ã€\"1\"ã€trueã€\"true\"ã€\"y\"ã€\"yes\"ã‚’trueã«å¤‰æ›ã—ã¾ã™ã€‚ 大文字ã¨" "å°æ–‡å­—を区別ã—ã¾ã›ã‚“。 与ãˆã‚‰ã‚ŒãŸå€¤ãŒãれらã®ã©ã‚Œã¨ã‚‚一致ã—ãªã„å ´åˆã«ã€ã©ã†" "処ç†ã•ã›ã‚‹ã‹ã‚’ã€ã“ã®ã‚»ãƒ¬ã‚¯ãƒˆãƒœãƒƒã‚¯ã‚¹ã§æŒ‡å®šã—ã¾ã™ã€‚ null値を返ã™ã“ã¨ã‚‚ã€" "デフォルトをfalseã¾ãŸã¯trueã«ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ ã¾ãŸã€ç„¡åйãªã‚½ãƒ¼ã‚¹ãƒ‡ãƒ¼ã‚¿" "ã¨ã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆãƒ—ロセス全体を中断ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/ImportSourceForm.php:89 msgid "" "This must be a column containing unique values like hostnames. Unless " "otherwise specified this will then be used as the object_name for the " "syncronized Icinga object. Especially when getting started with director " "please make sure to strictly follow this rule. Duplicate values for this " "column on different rows will trigger a failure, your import run will not " "succeed. Please pay attention when synching services, as \"purge\" will only " "work correctly with a key_column corresponding to host!name. Check the " "\"Combine\" property modifier in case your data source cannot provide such a " "field" msgstr "ã“れã¯ã€ãƒ›ã‚¹ãƒˆåãªã©ã®ä¸€æ„ã®å€¤ã‚’å«ã‚€åˆ—ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" "ç‰¹ã«æŒ‡å®šã®ãªã„é™ã‚Šã€ã“れã¯åŒæœŸåŒ–ã•れãŸIcingaオブジェクトã®object_nameã¨ã—ã¦" "使用ã•れã¾ã™ã€‚ 特ã«directorã‚’å§‹ã‚ã‚‹ã¨ãã¯ã€å¿…ãšã“ã®è¦å‰‡ã«å޳坆ã«å¾“ã£ã¦" "ãã ã•ã„。ã“ã®åˆ—ã®å€¤ãŒç•°ãªã‚‹è¡Œã«é‡è¤‡ã—ã¦ã„ã‚‹ã¨å¤±æ•—ã—ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã¯æˆåŠŸ" "ã—ã¾ã›ã‚“。 \"purge\"ã¯host!nameã«å¯¾å¿œã™ã‚‹key_columnã§ã®ã¿æ­£ã—ãæ©Ÿèƒ½ã™ã‚‹ã®ã§ã€" "ã‚µãƒ¼ãƒ“ã‚¹ã‚’åŒæœŸã™ã‚‹ã¨ãã¯æ³¨æ„ã—ã¦ãã ã•ã„。 データソースãŒãã®ã‚ˆã†ãª" "フィールドをæä¾›ã§ããªã„å ´åˆã¯ã€\"Combine\"プロパティ変æ›ãƒ«ãƒ¼ãƒ«ã‚’確èªã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/ImportRowModifierForm.php:31 msgid "This must be an import source column (property)" msgstr "ã“れã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®ã‚«ãƒ©ãƒ ï¼ˆãƒ—ロパティ)ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:414 msgid "This object has been disabled" msgstr "ã“ã®ã‚ªãƒ–ジェクトã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:409 msgid "This object has been enabled" msgstr "ã“ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã¯æœ‰åŠ¹åŒ–ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/ObjectPreview.php:76 msgid "This object will not be deployed as it has been disabled" msgstr "ã“ã®ã‚ªãƒ–ジェクトã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã‚‹ãŸã‚設定ãŒå映ã•れã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierCombine.php:17 msgid "" "This pattern will be evaluated, and variables like ${some_column} will be " "filled accordingly. A typical use-case is generating unique service " "identifiers via ${host}!${service} in case your data source doesn't allow " "you to ship such. The chosen \"property\" has no effect here and will be " "ignored." msgstr "ã“ã®ãƒ‘ターンãŒè©•価ã•れã€ãれã«å¿œã˜ã¦ ${some_column} ã®ã‚ˆã†ãªå¤‰æ•°ãŒ" "埋ã‚られã¾ã™ã€‚ 典型的ãªãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã¯ ${host}!${service}ã§ãƒ¦ãƒ‹ãƒ¼ã‚¯ãª" "サービス識別å­ã‚’生æˆã™ã‚‹ã“ã¨ã§ã™ã€‚ é¸æŠžã•れãŸã€Œãƒ—ロパティã€ã¯ã“ã“ã§ã¯" "効果ãŒãªãã€ç„¡è¦–ã•れã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/SelfService.php:234 msgid "" "This requires the Icinga Agent to be installed. It generates and signs it's " "certificate and it also generates a minimal icinga2.conf to get your agent " "connected to it's parents" msgstr "ã“れã«ã¯ã€Icinga Agentをインストールã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ 証明書を" "生æˆã—ã¦ç½²åã—ã€ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’ãã®è¦ªã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã®æœ€å°é™ã®icinga2.confã‚‚" "生æˆã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:371 #, php-format msgid "" "This service belongs to the %s Service Set. Still, you might want to " "override the following properties for this host only." msgstr "ã“ã®ã‚µãƒ¼ãƒ“ス㯠%s サービスセットã«å±žã—ã¦ã„ã¾ã™ã€‚ãれã§ã‚‚ã€" "ã“ã®ãƒ›ã‚¹ãƒˆã«å¯¾ã—ã¦ã®ã¿æ¬¡ã®ãƒ—ロパティを上書ãã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:415 #, php-format msgid "" "This service belongs to the service set \"%s\". Still, you might want to " "change the following properties for this host only." msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã¯ã‚µãƒ¼ãƒ“スセット \"%s\" ã«å±žã—ã¦ã„ã¾ã™ã€‚ ãれã§ã‚‚ã€" "ã“ã®ãƒ›ã‚¹ãƒˆã«å¯¾ã—ã¦ã®ã¿æ¬¡ã®ãƒ—ロパティを変更ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:352 msgid "" "This service has been generated in an automated way, but still allows you to " "override the following properties in a safe way." msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã¯è‡ªå‹•化ã•ã‚ŒãŸæ–¹æ³•ã§ç”Ÿæˆã•れã¦ã„ã¾ã™ãŒã€ãれã§ã‚‚" "次ã®ãƒ—ãƒ­ãƒ‘ãƒ†ã‚£ã‚’å®‰å…¨ãªæ–¹æ³•ã«ä¸Šæ›¸ãã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:358 #, php-format msgid "" "This service has been generated using the %s apply rule, assigned where %s" msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã¯%sé©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’使用ã—ã¦ç”Ÿæˆã•れã¾ã—ãŸã€‚" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:383 #, php-format msgid "" "This service has been inherited from %s. Still, you might want to change the " "following properties for this host only." msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã¯%sã‹ã‚‰ç¶™æ‰¿ã•れã¾ã—ãŸã€‚ ãれã§ã‚‚ã€ã“ã®ãƒ›ã‚¹ãƒˆã«å¯¾ã—ã¦ã®ã¿" "次ã®ãƒ—ロパティを変更ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetServiceTable.php:196 #, php-format msgid "This set has been inherited from %s" msgstr "ã“ã®ã‚»ãƒƒãƒˆã¯%sã‹ã‚‰ç¶™æ‰¿ã•れã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/KickstartDashlet.php:17 msgid "" "This synchronizes Icinga Director to your Icinga 2 infrastructure. A new run " "should be triggered on infrastructure changes" msgstr "Icinga Director ã‚’ Icinga 2 インフラストラクãƒãƒ£ã«åŒæœŸã—ã¾ã™ã€‚" "インフラストラクãƒãƒ£ã®å¤‰æ›´æ™‚ã«æ–°ã—ã„実行ãŒãƒˆãƒªã‚¬ã•れるã¯ãšã§ã™" #: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:104 msgid "This template is not in use" msgstr "ã“ã®ãƒ†ãƒ³ãƒ—レートã¯ä½¿ç”¨ã•れã¦ã„ã¾ã›ã‚“" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:885 #, php-format msgid "This template is still in use by %d other objects" msgstr "ã“ã®ãƒ†ãƒ³ãƒ—レート㯠%d 個ã®ã»ã‹ã®ã‚ªãƒ–ジェクトã«åˆ©ç”¨ã•れã¦ã„ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:51 msgid "This will be shown as a label for the given choice" msgstr "与ãˆã‚‰ã‚ŒãŸé¸æŠžè‚¢ã«å¯¾ã™ã‚‹ãƒ©ãƒ™ãƒ«ã‚’示ã—ã¾ã™" #: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:33 msgid "This will be the visible caption for this entry" msgstr "ã“ã®é …ç›®ã«å…¥åŠ›ã—ãŸåå‰ãŒãƒ¦ãƒ¼ã‚¶ã«è¦‹ãˆã‚‹ãƒ©ãƒ™ãƒ«ã«ãªã‚Šã¾ã™" #: ../../../../modules/director/library/Director/Web/SelfService.php:123 msgid "This will invalidate the former key" msgstr "ã“れã¯ä»¥å‰ã®ã‚­ãƒ¼ã‚’無効ã«ã—ã¾ã™" #: ../../../../modules/director/library/Director/Web/SelfService.php:224 msgid "Ticket" msgstr "ãƒã‚±ãƒƒãƒˆ" #: ../../../../modules/director/application/forms/SyncRuleForm.php:21 msgid "Time Period" msgstr "スケジュール" #: ../../../../modules/director/application/forms/BasketForm.php:26 msgid "Time Periods" msgstr "スケジュール" #: ../../../../modules/director/application/forms/DirectorJobForm.php:60 #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:138 #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:229 #: ../../../../modules/director/application/forms/IcingaUserForm.php:158 msgid "Time period" msgstr "スケジュール" #: ../../../../modules/director/application/controllers/TimeperiodController.php:17 msgid "Time period ranges" msgstr "ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã®æœŸé–“" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:319 msgid "Time ranges" msgstr "スケジュール" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:70 msgid "Timeout" msgstr "タイムアウト" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:13 msgid "Timeperiod Templates" msgstr "スケジュールテンプレート" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/TimeperiodObjectDashlet.php:16 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/TimeperiodsDashlet.php:13 #: ../../../../modules/director/library/Director/Web/Table/IcingaTimePeriodRangeTable.php:46 msgid "Timeperiods" msgstr "スケジュール" msgid "Timeperiod" msgstr "スケジュール" msgid "TimePeriod" msgstr "スケジュール" msgid "TimePeriods" msgstr "スケジュール" #: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:28 msgid "Timerperiods" msgstr "スケジュール" #: ../../../../modules/director/library/Director/Web/Table/ImportrunTable.php:31 msgid "Timestamp" msgstr "タイムスタンプ" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:46 #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:154 msgid "" "To ensure downloaded packages are build by the Icinga Team and not " "compromised by third parties, you will be able to provide an array of SHA1 " "hashes here. In case you have defined any hashses, the module will not " "continue with updating / installing the Agent in case the SHA1 hash of the " "downloaded MSI package is not matching one of the provided hashes of this " "setting" msgstr "ダウンロードã—ãŸãƒ‘ッケージãŒIcingaãƒãƒ¼ãƒ ã«ã‚ˆã£ã¦æ§‹ç¯‰ã•れã€" "第三者ã«ã‚ˆã£ã¦ä¾µå®³ã•れãªã„よã†ã«ã™ã‚‹ãŸã‚ã«ã€ã“ã“ã§SHA1ãƒãƒƒã‚·ãƒ¥ã®é…列を" "æä¾›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ãƒãƒƒã‚·ãƒ¥ã‚’定義ã—ãŸå ´åˆã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸMSI" "パッケージã®SHA1ãƒãƒƒã‚·ãƒ¥ãŒã“ã®è¨­å®šã§æä¾›ã•れã¦ã„ã‚‹ãƒãƒƒã‚·ãƒ¥ã®1ã¤ã¨ä¸€è‡´" "ã—ãªã„å ´åˆã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã®æ›´æ–°/インストールを続行ã—ã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Web/SelfService.php:197 msgid "Top Down" msgstr "トップダウン" #: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:57 msgid "Total" msgstr "åˆè¨ˆ" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:31 msgid "Transform Host Name" msgstr "ホストåを変æ›" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:37 msgid "Transform to lowercase" msgstr "å°æ–‡å­—ã«å¤‰æ›" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:38 msgid "Transform to uppercase" msgstr "大文字ã«å¤‰æ›" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1599 msgid "Transition types" msgstr "状態é·ç§»ã‚¿ã‚¤ãƒ—" #: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:30 msgid "Tree" msgstr "ツリー" #: ../../../../modules/director/application/forms/ImportRunForm.php:23 msgid "Trigger Import Run" msgstr "インãƒãƒ¼ãƒˆå®Ÿè¡Œã‚’トリガ" #: ../../../../modules/director/application/forms/SyncRunForm.php:23 msgid "Trigger this Sync" msgstr "ã“ã®åŒæœŸã‚’トリガ" #: ../../../../modules/director/application/forms/ImportRunForm.php:45 msgid "Triggering this Import Source failed" msgstr "ã“ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã®ãƒˆãƒªã‚¬ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/SettingsDashlet.php:17 msgid "Tweak some global Director settings" msgstr "グローãƒãƒ«ãªdirector設定を調整ã—ã¾ã™" #: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:73 msgid "Type" msgstr "タイプ" #: ../../../../modules/director/application/controllers/InspectController.php:84 msgid "Type attributes" msgstr "タイプ属性" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:167 #: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:27 #, php-format msgid "Unable to fetch data: %s" msgstr "データをå–å¾—ã§ãã¾ã›ã‚“: %s" #: ../../../../modules/director/application/forms/IcingaHostForm.php:364 msgid "" "Unable to store a host with the given properties because of insufficient " "permissions" msgstr "権é™ãŒä¸å分ãªãŸã‚ã€æŒ‡å®šã•れãŸãƒ—ロパティã§ãƒ›ã‚¹ãƒˆã‚’ä¿å­˜ã§ãã¾ã›ã‚“" #: ../../../../modules/director/application/forms/KickstartForm.php:339 #, php-format msgid "" "Unable to store the configuration to \"%s\". Please check file permissions " "or manually store the content shown below" msgstr "設定を\"%s\"ã«ä¿å­˜ã§ãã¾ã›ã‚“。 ファイルã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚’確èªã™ã‚‹ã‹ã€" "以下ã«ç¤ºã™å†…容を手動ã§ä¿å­˜ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/library/Director/Db/Housekeeping.php:49 msgid "Undeployed configurations" msgstr "æœªåæ˜ ã®è¨­å®š" #: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:27 msgid "Unknown" msgstr "Unknown (䏿˜Ž)" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:136 msgid "Unknown, failed to collect related information" msgstr "䏿˜Žã€é–¢é€£æƒ…å ±ã®åŽé›†ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:134 msgid "Unknown, still waiting for config check outcome" msgstr "䏿˜Žã€ã¾ã è¨­å®šã®æ¤œæŸ»ã®çµæžœã‚’å¾…ã£ã¦ã„ã¾ã™" #: ../../../../modules/director/library/Director/Db/Housekeeping.php:53 msgid "Unlinked imported properties" msgstr "インãƒãƒ¼ãƒˆã•れãŸãƒ—ロパティをリンク解除ã—ã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Db/Housekeeping.php:51 msgid "Unlinked imported row sets" msgstr "インãƒãƒ¼ãƒˆã•れãŸè¡Œã‚»ãƒƒãƒˆã‚’リンク解除ã—ã¾ã—ãŸ" #: ../../../../modules/director/library/Director/Db/Housekeeping.php:52 msgid "Unlinked imported rows" msgstr "インãƒãƒ¼ãƒˆã•れãŸè¡Œã‚’リンク解除ã—ã¾ã—ãŸ" #: ../../../../modules/director/application/controllers/PhperrorController.php:19 msgid "Unsatisfied dependencies" msgstr "未解決ã®ä¾å­˜é–¢ä¿‚" #: ../../../../modules/director/library/Director/Db/Housekeeping.php:50 msgid "Unused rendered files" msgstr "使用ã•れã¦ã„ãªã„設定ファイル" #: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:20 msgid "Up" msgstr "Up (èµ·å‹•)" #: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:25 msgid "Update Method" msgstr "アップデート方法" #: ../../../../modules/director/application/forms/SyncRuleForm.php:49 msgid "Update Policy" msgstr "アップデートãƒãƒªã‚·ãƒ¼" #: ../../../../modules/director/application/controllers/BasketsController.php:26 #: ../../../../modules/director/application/forms/BasketUploadForm.php:43 msgid "Upload" msgstr "アップロード" #: ../../../../modules/director/application/controllers/BasketController.php:120 msgid "Upload a Basket" msgstr "ãƒã‚¹ã‚±ãƒƒãƒˆã‚’アップロード" #: ../../../../modules/director/application/controllers/BasketController.php:121 msgid "Upload a Configuration Basket" msgstr "æ§‹æˆãƒã‚¹ã‚±ãƒƒãƒˆã‚’アップロード" #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:295 msgid "Usage" msgstr "使用状æ³" #: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:101 #, php-format msgid "Usage (%s)" msgstr "使用状æ³(%s)" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:71 msgid "Use a local file or network share" msgstr "ローカルファイルã¾ãŸã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å…±æœ‰ã‚’使用" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:18 msgid "Use lowercase first" msgstr "最åˆã«å°æ–‡å­—を使用" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:271 msgid "Used sources" msgstr "ソースを使用" #: ../../../../modules/director/application/forms/SyncRuleForm.php:17 #: ../../../../modules/director/library/Director/TranslationDummy.php:17 msgid "User" msgstr "ユーザ" #: ../../../../modules/director/application/forms/SyncRuleForm.php:18 msgid "User Group" msgstr "ユーザグループ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:11 msgid "UserGroups" msgstr "ユーザグループ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:13 msgid "User Templates" msgstr "ユーザテンプレート" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:153 #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:60 msgid "User groups" msgstr "ユーザグループ" #: ../../../../modules/director/application/forms/IcingaUserForm.php:113 msgid "" "User groups that should be directly assigned to this user. Groups can be " "useful for various reasons. You might prefer to send notifications to groups " "instead of single users" msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ç›´æŽ¥å‰²ã‚Šå½“ã¦ã‚‹å¿…è¦ãŒã‚るユーザーグループ。 " "グループã¯ã•ã¾ã–ã¾ãªç†ç”±ã§å½¹ã«ç«‹ã¡ã¾ã™ã€‚ å˜ä¸€ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã¯ãªãグループã«" "通知をé€ä¿¡ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:155 msgid "User groups that should be notified by this notifications" msgstr "通知先ã®ãƒ¦ãƒ¼ã‚¶ã‚°ãƒ«ãƒ¼ãƒ—" #: ../../../../modules/director/application/forms/IcingaUserForm.php:194 msgid "User properties" msgstr "ユーザプロパティ" #: ../../../../modules/director/application/forms/IcingaUserForm.php:22 msgid "User template name" msgstr "ユーザテンプレートå" #: ../../../../modules/director/application/forms/IcingaUserGroupForm.php:17 msgid "Usergroup" msgstr "ユーザグループ" #: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:63 msgid "Usergroups" msgstr "ユーザグループ" #: ../../../../modules/director/application/forms/IcingaUserForm.php:28 msgid "Username" msgstr "ユーザå" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:128 #: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:59 #: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:62 #: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:47 #: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:62 msgid "Users" msgstr "ユーザ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserObjectDashlet.php:16 #: ../../../../modules/director/library/Director/Dashboard/Dashlet/UsersDashlet.php:13 msgid "Users / Contacts" msgstr "ユーザ / コンタクト" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:130 msgid "Users that should be notified by this notifications" msgstr "ã“ã®é€šçŸ¥ã«ã‚ˆã£ã¦é€šçŸ¥ã•れるã¹ãユーザ" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:17 msgid "" "Using Apply Rules a Service can be applied to multiple hosts at once, based " "on filters dealing with any combination of their properties" msgstr "é©ç”¨ãƒ«ãƒ¼ãƒ«ã‚’使用ã™ã‚‹ã¨ã€ã‚µãƒ¼ãƒ“スã¯ã€ãれらã®ãƒ—ロパティã®ä»»æ„ã®" "組ã¿åˆã‚ã›ã‚’処ç†ã™ã‚‹ãƒ•ィルタã«åŸºã¥ã„ã¦ã€ä¸€åº¦ã«è¤‡æ•°ã®ãƒ›ã‚¹ãƒˆã«é©ç”¨ã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaHostForm.php:317 #: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:44 msgid "Usually your hosts main IPv6 address" msgstr "通常ã¯ãƒ›ã‚¹ãƒˆã®ãƒ¡ã‚¤ãƒ³ã®IPv6アドレス" #: ../../../../modules/director/application/forms/CustomvarForm.php:21 #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:45 #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:54 #: ../../../../modules/director/application/forms/IcingaHostVarForm.php:27 #: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:27 #: ../../../../modules/director/library/Director/Web/Table/IcingaCommandArgumentTable.php:46 msgid "Value" msgstr "値" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:31 msgid "Value type" msgstr "値ã®ã‚¿ã‚¤ãƒ—" #: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:56 msgid "Variable Value" msgstr "変数値" #: ../../../../modules/director/application/forms/CustomvarForm.php:16 #: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:41 msgid "Variable name" msgstr "変数å" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1412 msgid "Volatile" msgstr "æ®ç™ºæ€§" #: ../../../../modules/director/library/Director/Dashboard/TimeperiodsDashboard.php:20 msgid "" "Want to define to execute specific checks only withing specific time " "periods? Get mobile notifications only out of office hours, but mail " "notifications all around the clock? Time Periods allow you to tackle those " "and similar requirements." msgstr "スケジュールã§ã¯ã€ç›£è¦–や通知を実施ã™ã‚‹ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’定義ã§ãã¾ã™ã€‚" "例ãˆã°ã€é€šçŸ¥ã®è¨­å®šã¨çµ„ã¿åˆã‚ã›ã¦ã€å–¶æ¥­æ™‚間内ã¨å–¶æ¥­æ™‚間外ã§é€šçŸ¥ã™ã‚‹å…ˆã‚’変更ã™ã‚‹" "ã¨ã„ã†ã‚ˆã†ã«å®šç¾©ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:25 msgid "Warning" msgstr "Warning (警告)" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1071 msgid "" "What kind of object this should be. Templates allow full access to any " "property, they are your building blocks for \"real\" objects. External " "objects should usually not be manually created or modified. They allow you " "to work with objects locally defined on your Icinga nodes, while not " "rendering and deploying them with the Director. Apply rules allow to assign " "services, notifications and groups to other objects." msgstr "テンプレートã¯ã‚らゆるプロパティã®è¨­å®šã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚" "テンプレートã¯ã€æœ€çµ‚çš„ãªä½œã‚‰ã‚Œã‚‹è¨­å®šæƒ…å ±ã®ãŸã‚ã®ãƒ‘ーツã§ã™ã€‚ " "外部オブジェクト(Directorã®ç®¡è½„外ã®è¨­å®š)ã¯ã€æœ€ä½Žé™ã«ã¨ã©ã‚ã¦ã€è¿½åŠ ãƒ»å¤‰æ›´ã—ãªã„ã§ãã ã•ã„。 " "外部オブジェクトã¨Directorã§ã®è¨­å®šã‚’併用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" "é©ç”¨ãƒ«ãƒ¼ãƒ«ã«ã‚ˆã‚Šã€ã‚µãƒ¼ãƒ“スã€é€šçŸ¥ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—ã‚’ä»–ã®" "オブジェクトã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:28 msgid "" "What should happen if the lookup key does not exist in the data list? You " "could return a null value, keep the unmodified imported value or interrupt " "the import process" msgstr "å‚照キーãŒãƒ‡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆã«å­˜åœ¨ã—ãªã„å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" "null値を返ã™ã€å¤‰æ›´ã•れã¦ã„ãªã„インãƒãƒ¼ãƒˆå€¤ã‚’ä¿æŒã™ã‚‹ã€ã¾ãŸã¯" "インãƒãƒ¼ãƒˆãƒ—ロセスを中断ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:24 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:24 msgid "What should happen when the given string is empty?" msgstr "与ãˆã‚‰ã‚ŒãŸæ–‡å­—列ãŒç©ºã®å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:66 msgid "What should happen when the result array is empty?" msgstr "çµæžœã®é…列ãŒç©ºã®å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:50 msgid "What should happen when the specified element is not available?" msgstr "指定ã•れãŸè¦ç´ ãŒåˆ©ç”¨ã§ããªã„ã¨ãã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:53 msgid "What should happen with matching elements?" msgstr "一致ã™ã‚‹è¦ç´ ã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:55 msgid "" "What should happen with the row, when this property matches the given " "expression?" msgstr "ã“ã®ãƒ—ロパティãŒã€ãƒ•ィルタ表ç¾ãŒè¡Œã«ãƒžãƒƒãƒã—ãŸã¨ãã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:32 msgid "What should we do if the DNS lookup fails?" msgstr "DNSå‚ç…§ãŒå¤±æ•—ã—ãŸå ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:28 msgid "What should we do if the desired part does not exist?" msgstr "目的ã®éƒ¨åˆ†ãŒå­˜åœ¨ã—ãªã„å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php:15 msgid "What should we do if the host (DNS) lookup fails?" msgstr "ホスト(DNS)å‚ç…§ãŒå¤±æ•—ã—ãŸå ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJsonDecode.php:22 msgid "What should we do in case we are unable to decode the given string?" msgstr "与ãˆã‚‰ã‚ŒãŸæ–‡å­—列をデコードã§ããªã„å ´åˆã®å‡¦ç†ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:16 msgid "What should we extract from the DN?" msgstr "DNã‹ã‚‰æŠœã出ã™å€¤ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/BasketForm.php:55 msgid "" "What should we place into this Basket every time we create new snapshot?" msgstr "æ–°ã—ã„スナップショットを作æˆã™ã‚‹ãŸã³ã«ã€ã“ã®ãƒã‚¹ã‚±ãƒƒãƒˆã«ä½•ã‚’" "é…ç½®ã™ã‚Œã°ã‚ˆã„ã§ã™ã‹ï¼Ÿ" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:21 msgid "What to use as your Icinga 2 Agent's Host Name" msgstr "Icinga 2 Agentã®ãƒ›ã‚¹ãƒˆåã«ä½•を使ã†ã‹" #: ../../../../modules/director/library/Director/Job/ConfigJob.php:209 msgid "" "When deploying configuration, wait at least this amount of seconds unless " "the next deployment should take place" msgstr "è¨­å®šã‚’åæ˜ ã™ã‚‹ã¨ãã¯ã€æ¬¡ã®è¨­å®šå映を実行ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã‚’除ãã€" "å°‘ãªãã¨ã‚‚指定ã—ãŸç§’æ•°ã ã‘待機ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:63 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:21 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:21 msgid "When empty" msgstr "空ã®ã¨ã" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:47 msgid "When not available" msgstr "利用ã§ããªã„ã¨ã" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:207 msgid "When the last notification should be sent" msgstr "最後ã®é€šçŸ¥ã‚’何分ã‚ã‚‹ã„ã¯ä½•時間後ã«é€ä¿¡ã™ã‚‹ã‹ã‚’時間ã§è¨­å®šã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SettingsForm.php:63 msgid "Whether all configured Jobs should be disabled" msgstr "設定ã—ãŸã™ã¹ã¦ã®ã‚¸ãƒ§ãƒ–を無効ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1385 msgid "Whether flap detection is enabled on this object" msgstr "ã“ã®ã‚ªãƒ–ジェクトã§ãƒ•ãƒ©ãƒƒãƒ—æ¤œå‡ºãŒæœ‰åйã«ãªã£ã¦ã„ã‚‹ã‹" #: ../../../../modules/director/library/Director/Job/ConfigJob.php:183 msgid "" "Whether rendering should be forced. If not enforced, this job re-renders the " "configuration only when there have been activities since the last rendered " "config" msgstr "生æˆã‚’強制ã™ã‚‹ã¹ãã‹ã‚’é¸æŠžã—ã¾ã™ã€‚ é©ç”¨ã•れã¦ã„ãªã„å ´åˆã€ã“ã®ã‚¸ãƒ§ãƒ–ã¯" "æœ€å¾Œã«æ•´å½¢ã•れãŸè¨­å®šä»¥é™ã«ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティãŒã‚ã£ãŸå ´åˆã«ã®ã¿è¨­å®šã‚’冿•´å½¢ã—ã¾ã™ã€‚" # smori #: ../../../../modules/director/application/forms/IcingaHostForm.php:94 msgid "Whether the agent is configured to accept config" msgstr "エージェントãŒè¨­å®šã®åŒæœŸã‚’å—ã‘入れるよã†ã«æ§‹æˆã•れã¦ã„ã‚‹ã‹ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:37 msgid "" "Whether the argument value is a string (allowing macros like $host$) or an " "Icinga DSL lambda function (will be enclosed with {{ ... }}" msgstr "å¼•æ•°å€¤ãŒæ–‡å­—列($host$ã®ã‚ˆã†ãªãƒžã‚¯ãƒ­ã‚’許ã™ï¼‰ã‹ã€ã‚ã‚‹ã„ã¯Icinga DSLラムダ関数({{...}}ã§å›²ã¾ã‚Œã‚‹ï¼‰ã‹ã‚’é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaServiceForm.php:661 msgid "" "Whether the check commmand for this service should be executed on the Icinga " "agent" msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã®checkコマンドをIcingaエージェントã§å®Ÿè¡Œã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:112 msgid "" "Whether the parameter name should not be passed to the command. Per default, " "the parameter name (e.g. -H) will be appended, so no need to explicitly set " "this to \"No\"." msgstr "パラメータåã‚’ã‚³ãƒžãƒ³ãƒ‰ã«æ¸¡ã•ãªã„よã†ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ デフォルトã§ã¯ã€" "パラメータå(ãŸã¨ãˆã°-H)ãŒè¿½åŠ ã•れるã®ã§ã€ã“れを明示的ã«ã€Œã„ã„ãˆã€ã«" "設定ã™ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“。" #: ../../../../modules/director/application/forms/IcingaHostForm.php:88 msgid "" "Whether the parent (master) node should actively try to connect to this agent" msgstr "親(マスター)ノードãŒã“ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã¸ã®æŽ¥ç¶šã‚’アクティブã«è©¦è¡Œã™ã‚‹" "å¿…è¦ãŒã‚ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:76 msgid "" "Whether the set_if parameter is a string (allowing macros like $host$) or an " "Icinga DSL lambda function (will be enclosed with {{ ... }}" msgstr "set_if ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãŒæ–‡å­—列($host$ã®ã‚ˆã†ãªãƒžã‚¯ãƒ­ã‚’許å¯ã™ã‚‹ï¼‰ã‹ã€ã‚ã‚‹ã„ã¯" "Icinga DSLラムダ関数({{...}}ã§å›²ã¾ã‚Œã‚‹ï¼‰ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:121 msgid "Whether this argument should be required" msgstr "ã“ã®å¼•æ•°ãŒå¿…è¦ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1413 msgid "Whether this check is volatile." msgstr "「ã¯ã„ã€ã‚’é¸æŠžã™ã‚‹ã¨ç›£è¦–ã®ä¸€æ™‚çš„ãªçŠ¶æ…‹ã‚’ä¿æŒã—ã¾ã›ã‚“。ã¤ã¾ã‚Šæœ€å¤§ç›£è¦–試行回数=1ã¨åŒç­‰ã®å‹•ãã‚’ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:94 msgid "Whether this dependency should affect hosts or services" msgstr "ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトãŒãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚µãƒ¼ãƒ“スã«å½±éŸ¿ã‚’与ãˆã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:135 msgid "Whether this field should be mandatory" msgstr "ã“ã®ãƒ•ィールドãŒå¿…é ˆã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaHostForm.php:79 msgid "Whether this host has the Icinga 2 Agent installed" msgstr "ã“ã®ãƒ›ã‚¹ãƒˆã«Icinga 2 AgentãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:83 msgid "Whether this notification should affect hosts or services" msgstr "ã“ã®é€šçŸ¥ãŒãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚µãƒ¼ãƒ“スã«å½±éŸ¿ã‚’与ãˆã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:104 msgid "" "Whether this parameter should be repeated when multiple values (read: array) " "are given" msgstr "複数ã®å€¤ï¼ˆread:array)ãŒä¸Žãˆã‚‰ã‚ŒãŸã¨ãã«ã“ã®ãƒ‘ラメータを繰り返ã™ã¹ãã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaZoneForm.php:24 msgid "" "Whether this zone should be available everywhere. Please note that it rarely " "leads to the desired result when you try to distribute global zones in " "distrubuted environments" msgstr "ã“ã®ã‚¾ãƒ¼ãƒ³ã®ã‚¹ã‚³ãƒ¼ãƒ—をグローãƒãƒ«ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚グローãƒãƒ«" "ゾーンã®åˆ†æ•£æ§‹æˆã¯æŽ¨å¥¨ã•れã¦ã„ã¾ã›ã‚“。" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1361 msgid "Whether to accept passive check results for this object" msgstr "ã“ã®ã‚ªãƒ–ジェクトã®ãƒ‘ãƒƒã‚·ãƒ–ç›£è¦–çµæžœã‚’å—ã‘入れるã‹" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1355 msgid "Whether to actively check this object" msgstr "ã“ã®ã‚ªãƒ–ジェクトをアクティブã«ç›£è¦–ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:33 msgid "Whether to adjust your host name" msgstr "ホストåを調整ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:158 msgid "" "Whether to disable checks when this dependency fails. Defaults to false." msgstr "ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトãŒå¤±æ•—ã—ãŸã¨ãã«ç›£è¦–を無効ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚ デフォルトã¯ã€Œã„ã„ãˆã€ã§ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:166 msgid "" "Whether to disable notifications when this dependency fails. Defaults to " "true." msgstr "ã“ã®ä¾å­˜é–¢ä¿‚オブジェクトãŒå¤±æ•—ã—ãŸã¨ãã«é€šçŸ¥ã‚’無効ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚デフォルトã¯ã€Œã¯ã„ã€ã§ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1373 msgid "Whether to enable event handlers this object" msgstr "ã“ã®ã‚ªãƒ–ジェクトã®ã‚¤ãƒ™ãƒ³ãƒˆãƒãƒ³ãƒ‰ãƒ©ã‚’有効ã«ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:174 msgid "" "Whether to ignore soft states for the reachability calculation. Defaults to " "true." msgstr "到é”å¯èƒ½æ€§ã®è¨ˆç®—ã§ä¸€æ™‚çš„ãªç•°å¸¸(soft state)を無視ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚デフォルトã¯ã€Œã¯ã„ã€ã§ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:77 msgid "Whether to prefer timeperiods includes or excludes. Default to true." msgstr "「ã¯ã„ã€ã‚’指定ã—ãŸå ´åˆã€ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã‚’優先ã—ã¾ã™ã€‚デフォルト値ã¯ã€Œã¯ã„ã€ã§ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1379 msgid "Whether to process performance data provided by this object" msgstr "ã“ã®ã‚ªãƒ–ジェクトã«ã‚ˆã£ã¦æä¾›ã•れるパフォーマンスデータを処ç†ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SyncRuleForm.php:67 msgid "" "Whether to purge existing objects. This means that objects of the same type " "will be removed from Director in case they no longer exist at your import " "source." msgstr "「ã¯ã„ã€ã®å ´åˆã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã«å­˜åœ¨ã—ãªã„オブジェクトを" "Directorã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1367 msgid "Whether to send notifications for this object" msgstr "ã“ã®ã‚ªãƒ–ジェクトã«é–¢ã™ã‚‹é€šçŸ¥ã‚’é€ä¿¡ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/IcingaUserForm.php:90 msgid "Whether to send notifications for this user" msgstr "ユーザã«é€šçŸ¥ã‚’é€ä¿¡ã™ã‚‹ã‹é¸æŠžã—ã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:118 msgid "" "Whether you want to merge or replace the destination field. Makes no " "difference for strings" msgstr "宛先フィールドをçµåˆã™ã‚‹ã‹ç½®ãæ›ãˆã‚‹ã‹ã€‚ 文字列ã«å·®ç•°ã¯ã‚りã¾ã›ã‚“" #: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:24 msgid "" "Will be stored as a custom variable value when this entry is chosen from the " "list" msgstr "カスタム変数ã®å€¤ã®å…¥åŠ›æ™‚ã«ã€ã“ã®ã‚­ãƒ¼ãŒé¸æŠžã•れるã¨ã€å¤‰æ•°ã®å€¤ã«ãªã‚Šã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/SelfService.php:225 msgid "Windows Kickstart Script" msgstr "Windowsキックスタートスクリプト" #: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:51 msgid "Wipe related vars" msgstr "関連ã™ã‚‹å¤‰æ•°ã‚’掃除ã™ã‚‹" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:17 msgid "Wondering about what changed why? Track your changes!" msgstr "設定変更ãŒè¡Œã‚れãŸå±¥æ­´ã‚’記録ã—ã¾ã™ã€‚" "ã©ã‚“ãªè¨­å®šãŒã ã‚Œã«ã‚ˆã£ã¦ã©ã®ã‚ˆã†ã«å¤‰æ›´ã•れãŸã®ã‹ã€è¿½è·¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/views/helpers/FormDataFilter.php:525 msgid "Wrap this expression into an operator" msgstr "ã“ã®å¼ã‚’演算å­ã«ãƒ©ãƒƒãƒ—ã™ã‚‹" #: ../../../../modules/director/application/forms/IcingaDeleteObjectForm.php:17 #, php-format msgid "YES, please delete \"%s\"" msgstr "ã¯ã„ã€\"%s\"を削除ã—ã¦ãã ã•ã„" #: ../../../../modules/director/application/forms/IcingaZoneForm.php:30 #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:226 #: ../../../../modules/director/application/forms/SettingsForm.php:59 #: ../../../../modules/director/application/forms/SettingsForm.php:74 #: ../../../../modules/director/application/forms/SyncRuleForm.php:73 #: ../../../../modules/director/library/Director/Job/ConfigJob.php:189 #: ../../../../modules/director/library/Director/Job/ConfigJob.php:201 #: ../../../../modules/director/library/Director/Job/ImportJob.php:101 #: ../../../../modules/director/library/Director/Job/SyncJob.php:101 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:25 msgid "Yes" msgstr "ã¯ã„" #: ../../../../modules/director/application/controllers/BasketsController.php:41 msgid "" "You can create Basket snapshots at any time, this will persist a serialized " "representation of all involved objects at that moment in time. Snapshots can " "be exported, imported, shared and restored - to the very same or another " "Director instance." msgstr "Basketスナップショットã¯ã„ã¤ã§ã‚‚作æˆã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ãã®æ™‚点" "ã§ã®é–¢é€£ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã®ã‚·ãƒªã‚¢ãƒ«åŒ–ã•れãŸè¡¨ç¾ãŒä¿æŒã•れã¾ã™ã€‚" "スナップショットã¯ã€ã¾ã£ãŸãåŒã˜ã¾ãŸã¯åˆ¥ã®Directorインスタンスã«" "エクスãƒãƒ¼ãƒˆã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã€å…±æœ‰ã€ãŠã‚ˆã³å¾©å…ƒã§ãã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/SelfService.php:136 msgid "" "You can stop sharing a Template at any time. This will immediately " "invalidate the former key." msgstr "テンプレートã®å…±æœ‰ã¯ã„ã¤ã§ã‚‚中止ã§ãã¾ã™ã€‚ ã“れã¯ã™ãã«ä»¥å‰ã®ã‚­ãƒ¼ã‚’" "無効ã«ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Job/ImportJob.php:94 #: ../../../../modules/director/library/Director/Job/SyncJob.php:94 msgid "" "You could immediately apply eventual changes or just learn about them. In " "case you do not want them to be applied immediately, defining a job still " "makes sense. You will be made aware of available changes in your Director " "GUI." msgstr "ã™ãã«æœ€çµ‚çš„ãªå¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ãれらã«ã¤ã„ã¦çŸ¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" " ã™ãã«é©ç”¨ã—ãŸããªã„å ´åˆã¯ã€ã‚¸ãƒ§ãƒ–を定義ã™ã‚‹ã“ã¨ã«ã‚‚æ„味ãŒã‚りã¾ã™ã€‚" " Director GUIã§åˆ©ç”¨å¯èƒ½ãªå¤‰æ›´ç‚¹ãŒã‚ã‹ã‚Šã¾ã™ã€‚" #: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:61 msgid "" "You might want to let the generated Powershell script install the Icinga 2 " "Agent in an automated way. If so, please choose where your Windows nodes " "should fetch the Agent installer" msgstr "自動生æˆã§ç”Ÿæˆã•れãŸPowershellスクリプトを使ã£ã¦Icinga 2 Agentã‚’" "インストールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®å ´åˆã€WindowsノードãŒ" "Agentインストーラーをå–å¾—ã™ã‚‹å ´æ‰€ã‚’é¸æŠžã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:161 msgid "" "You might want to show this field only when certain conditions are met. " "Otherwise it will not be available and values eventually set before will be " "cleared once stored" msgstr "ç‰¹å®šã®æ¡ä»¶ãŒæº€ãŸã•れãŸå ´åˆã«ã®ã¿ã“ã®ãƒ•ィールドを表示ã™ã‚‹ã“ã¨ã‚’" "ãŠå‹§ã‚ã—ã¾ã™ã€‚ ãã†ã—ãªã‘れã°åˆ©ç”¨ã§ããªã„ã§ã—ょã†ã€‚ã¾ãŸã€ä»¥å‰ã«è¨­å®šã•れãŸå€¤ã¯" "ã„ã£ãŸã‚“æ ¼ç´ã•ã‚Œã‚‹ã¨æ¶ˆåŽ»ã•れã¾ã™" #: ../../../../modules/director/application/forms/ImportRowModifierForm.php:46 msgid "" "You might want to write the modified value to another (new) property. This " "property name can be defined here, the original property would remain " "unmodified. Please leave this blank in case you just want to modify the " "value of a specific property" msgstr "変更ã—ãŸå€¤ã‚’別ã®ï¼ˆæ–°ã—ã„ï¼‰ãƒ—ãƒ­ãƒ‘ãƒ†ã‚£ã«æ›¸ã込むã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®" "プロパティåã¯ã“ã“ã§å®šç¾©ã§ãã€å…ƒã®ãƒ—ロパティã¯å¤‰æ›´ã•れãªã„ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚" " 特定ã®ãƒ—ロパティã®å€¤ã‚’変更ã™ã‚‹ã ã‘ã®å ´åˆã¯ã€ç©ºç™½ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。" #: ../../../../modules/director/application/controllers/SyncruleController.php:110 #, php-format msgid "You must define some %s before you can run this Sync Rule" msgstr "ã“ã®åŒæœŸãƒ«ãƒ¼ãƒ«ã‚’実行ã™ã‚‹å‰ã«ã€ã„ãã¤ã‹ã® %s を定義ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../../../../modules/director/application/forms/KickstartForm.php:153 msgid "Your Icinga 2 API username" msgstr "Icinga 2 APIユーザå" #: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:49 msgid "" "Your LDAP search base. Often something like OU=Users,OU=HQ,DC=your," "DC=company,DC=tld" msgstr "LDAP検索ベース。 多ãã®å ´åˆã€OU=Users,OU=HQ,DC=your,DC=company,DC=tld" "ã®ã‚ˆã†ãªã‚‚ã®ã§ã™ã€‚" #: ../../../../modules/director/application/forms/KickstartForm.php:94 msgid "" "Your configuration looks good. Still, you might want to re-run this " "kickstart wizard to (re-)import modified or new manually defined Command " "definitions or to get fresh new ITL commands after an Icinga 2 Core upgrade." msgstr "設定ã¯è‰¯å¥½ã§ã™ã€‚ãれã§ã‚‚ã€ã“ã®ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‚’" "å†å®Ÿè¡Œã—ã¦ã€å¤‰æ›´ã—ãŸã‚³ãƒžãƒ³ãƒ‰å®šç¾©ã¾ãŸã¯æ–°ã—ã„æ‰‹å‹•ã§å®šç¾©ã—ãŸã‚³ãƒžãƒ³ãƒ‰å®šç¾©ã‚’" "(å†ï¼‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹ã‹ã€ã¾ãŸã¯Icinga 2 Coreã‚¢ãƒƒãƒ—ã‚°ãƒ¬ãƒ¼ãƒ‰å¾Œã«æ–°ã—ã„æ–°ã—ã„" "ITLコマンドをå–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../../../../modules/director/application/forms/KickstartForm.php:72 #, php-format msgid "Your database looks good, you are ready to %s" msgstr "データベースã®è¨­å®šã¯è‰¯å¥½ã§ã™ã€‚%sã¸ã®æº–å‚™ãŒã§ãã¦ã„ã¾ã™" #: ../../../../modules/director/application/forms/KickstartForm.php:106 msgid "" "Your installation of Icinga Director has not yet been prepared for " "deployments. This kickstart wizard will assist you with setting up the " "connection to your Icinga 2 server." msgstr "Icinga Directorã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¯ã¾ã è¨­å®šåæ˜ ã®æº–å‚™ãŒ" "ã§ãã¦ã„ã¾ã›ã‚“。 ã“ã®ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯ã€Icinga 2サーãƒãƒ¼" "ã¸ã®æŽ¥ç¶šè¨­å®šã‚’手助ã‘ã—ã¾ã™ã€‚" #: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1298 msgid "Your regular check interval" msgstr "通常ã®ç›£è¦–é–“éš”" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierReplace.php:20 msgid "Your replacement string" msgstr "ç½®æ›ç”¨ã®æ–‡å­—列" #: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:67 msgid "Your users will be allowed to choose among those templates" msgstr "ユーザーã¯ãれらã®ãƒ†ãƒ³ãƒ—レートã®ä¸­ã‹ã‚‰é¸æŠžã™ã‚‹ã“ã¨ãŒè¨±ã•れる" #: ../../../../modules/director/application/forms/SyncRuleForm.php:23 #: ../../../../modules/director/library/Director/TranslationDummy.php:15 #: ../../../../modules/director/library/Director/Web/Table/ObjectsTableEndpoint.php:21 msgid "Zone" msgstr "ゾーン" #: ../../../../modules/director/application/forms/IcingaZoneForm.php:14 msgid "Zone name" msgstr "ゾーンå" #: ../../../../modules/director/application/forms/IcingaCommandForm.php:95 #: ../../../../modules/director/application/forms/IcingaDependencyForm.php:60 #: ../../../../modules/director/application/forms/IcingaNotificationForm.php:65 #: ../../../../modules/director/application/forms/IcingaUserForm.php:76 #: ../../../../modules/director/application/forms/IcingaUserGroupForm.php:42 msgid "Zone settings" msgstr "ゾーン設定" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/ZoneObjectDashlet.php:13 #: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:64 msgid "Zones" msgstr "ゾーン" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:346 msgid "a list" msgstr "リスト" #: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:87 msgid "all" msgstr "ã™ã¹ã¦" #: ../../../../modules/director/application/controllers/BasketController.php:96 #: ../../../../modules/director/application/controllers/BasketController.php:114 #: ../../../../modules/director/application/controllers/BasketController.php:348 #: ../../../../modules/director/application/controllers/DataController.php:104 #: ../../../../modules/director/application/controllers/HostController.php:480 #: ../../../../modules/director/application/controllers/ImportsourceController.php:276 #: ../../../../modules/director/application/controllers/ServiceController.php:137 #: ../../../../modules/director/application/controllers/ServiceController.php:198 #: ../../../../modules/director/application/controllers/SyncruleController.php:257 #: ../../../../modules/director/library/Director/Web/ActionBar/DirectorBaseActionBar.php:35 #: ../../../../modules/director/library/Director/Web/Controller/ActionController.php:150 #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:207 #: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:492 msgid "back" msgstr "戻る" #: ../../../../modules/director/application/locale/translateMe.php:11 msgid "critical" msgstr "å±é™º" #: ../../../../modules/director/application/locale/translateMe.php:6 msgid "down" msgstr "åœæ­¢" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:27 msgid "e.g. -H or --hostname, empty means \"skip_key\"" msgstr "(例) -Hã€--hostname。空ã¯\"skip_key\"ã‚’æ„味ã™ã‚‹" #: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:56 msgid "e.g. 5%, $host.name$, $lower$%:$upper$%" msgstr "(例)5%ã€$host.name$ã€$lower$%:$upper$%" #: ../../../../modules/director/application/forms/SyncPropertyForm.php:164 msgid "failed to fetch" msgstr "å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../../../../modules/director/application/forms/KickstartForm.php:259 #: ../../../../modules/director/library/Director/Util.php:177 msgid "here" msgstr "ã“ã“" #: ../../../../modules/director/application/forms/IcingaHostVarForm.php:23 msgid "host var name" msgstr "ホスト変数å" #: ../../../../modules/director/application/forms/IcingaHostVarForm.php:28 msgid "host var value" msgstr "ホスト変数値" #: ../../../../modules/director/application/controllers/BasketController.php:298 msgid "modified" msgstr "修正ã•れãŸ" #: ../../../../modules/director/application/controllers/BasketController.php:276 msgid "new" msgstr "new" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:283 msgid "no related group exists" msgstr "関連グループãŒå­˜åœ¨ã—ã¾ã›ã‚“。" #: ../../../../modules/director/application/locale/translateMe.php:9 msgid "ok" msgstr "ok" #: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:285 msgid "one related group exists" msgstr "一ã¤ã®é–¢é€£ã‚°ãƒ«ãƒ¼ãƒ—ãŒå­˜åœ¨ã—ã¾ã™ã€‚" #: ../../../../modules/director/application/locale/translateMe.php:8 msgid "pending" msgstr "ä¿ç•™ä¸­" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:55 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:71 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:29 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:29 msgid "return NULL" msgstr "NULLã‚’è¿”ã™" #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:70 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:28 #: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:28 msgid "return an empty array" msgstr "空é…列を返ã™" #: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:23 msgid "service var name" msgstr "サービス変数å" #: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:28 msgid "service var value" msgstr "サービス変数値" #: ../../../../modules/director/application/controllers/BasketController.php:302 msgid "unchanged" msgstr "変更ãªã—" #: ../../../../modules/director/application/locale/translateMe.php:12 msgid "unknown" msgstr "未知" #: ../../../../modules/director/application/locale/translateMe.php:7 msgid "unreachable" msgstr "到é”ä¸èƒ½" #: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:89 msgid "unused" msgstr "ä¸ä½¿ç”¨" #: ../../../../modules/director/application/locale/translateMe.php:5 msgid "up" msgstr "èµ·å‹•" #: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:88 msgid "used" msgstr "使用中" #: ../../../../modules/director/application/forms/IcingaHostVarForm.php:33 #: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:33 msgid "value format" msgstr "値ã®ãƒ•ォーマット" #: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:61 #: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:66 msgid "via" msgstr "経由" #: ../../../../modules/director/application/locale/translateMe.php:10 msgid "warning" msgstr "警告" icingaweb2-module-director-1.11.8/application/locale/translateMe.php000066400000000000000000000003401516513262500254450ustar00rootroot00000000000000_getInfo($name, $value, $attribs); extract($info); // id, name, value, attribs, options, listsep, disable if ($attribs) { if (array_key_exists('columns', $attribs)) { $this->setColumns($attribs['columns']); unset($attribs['columns']); } if (array_key_exists('suggestionContext', $attribs)) { $this->setSuggestionContext($attribs['suggestionContext']); unset($attribs['suggestionContext']); } } // TODO: check for columns in attribs, preserve & remove them from the // array use attribs? class etc? disabled? // override _getInfo? $this->fieldName = $name; if ($value === null) { $value = $this->emptyExpression(); } elseif (is_string($value)) { $value = Filter::fromQueryString($value); } return $this->beginRoot() . $this->renderFilter($value) . $this->endRoot(); } /** * @param Filter $filter * @return string * @throws Zend_Form_Exception */ protected function renderFilter(Filter $filter) { if ($filter instanceof FilterChain) { return $this->renderFilterChain($filter); } elseif ($filter instanceof FilterExpression) { return $this->renderFilterExpression($filter); } else { throw new InvalidArgumentException('Got a Filter being neither expression nor chain'); } } protected function beginRoot() { return '
    '; } protected function endRoot() { return '
'; } /** * @param FilterChain $filter * @return string * @throws Zend_Form_Exception */ protected function renderFilterChain(FilterChain $filter) { $parts = array(); foreach ($filter->filters() as $f) { $parts[] = $this->renderFilter($f); } return $this->beginChain($filter) . implode('', $parts) . $this->endChain($filter); } protected function beginChain(FilterChain $filter) { $list = $filter->isEmpty() ? '' : '
    ' . "\n"; return '
  • ' . $this->selectOperator($filter) . $this->removeLink($filter) . $this->addLink($filter) . ($filter->count() === 1 ? $this->stripLink($filter) : '') . $list; } protected function endChain(FilterChain $filter) { $list = $filter->isEmpty() ? '' : "
\n"; return $list . "\n"; } protected function beginExpression(FilterExpression $filter) { return '
' . "\n"; } protected function endExpression(FilterExpression $filter) { return "
\n"; } protected function beginElement(FilterExpression $filter) { return '
' . "\n"; } protected function endElement(FilterExpression $filter) { return "
\n"; } /** * @param FilterExpression $filter * @return string * @throws Zend_Form_Exception */ protected function filterExpressionHtml(FilterExpression $filter) { return $this->selectColumn($filter) . $this->selectSign($filter) . $this->beginElement($filter) . $this->element($filter) . $this->endElement($filter) . $this->removeLink($filter) . $this->expandLink($filter); } /** * @param FilterExpression $filter * @return string * @throws Zend_Form_Exception */ protected function renderFilterExpression(FilterExpression $filter) { return $this->beginExpression($filter) . $this->filterExpressionHtml($filter) . $this->endExpression($filter); } /** * @param FilterExpression|null $filter * @return Boolean|string * @throws Zend_Form_Exception */ protected function element(FilterExpression $filter = null) { if ($filter) { // TODO: Make this configurable $type = 'host'; $prefixLen = strlen($type) + 1; $filter = clone($filter); $col = $filter->getColumn(); if ($this->columnIsJson($filter)) { $col = $filter->getExpression(); $filter->setExpression(json_decode($filter->getColumn())); } else { $filter->setExpression(json_decode($filter->getExpression())); } if (($filter->getExpression() === true) || ($filter->getExpression() === false)) { return ''; } $dummy = IcingaObject::createByType($type); if ($dummy->hasProperty($col)) { if ($dummy->propertyIsBoolean($col)) { return $this->boolean($filter); } } if (substr($col, -7) === '.groups' && $dummy->supportsGroups()) { $type = substr($col, 0, -7); return $this->selectGroup($type, $filter); } elseif (substr($col, $prefixLen, 5) === 'vars.') { $var = substr($col, $prefixLen + 5); return $this->text($filter, "DataListValues!{$var}"); } } return $this->text($filter); } /** * @param $type * @param FilterExpression $filter * @return Zend_Form_Element */ protected function selectGroup($type, FilterExpression $filter) { return $this->view->formText( $this->elementId('value', $filter), $filter->getExpression(), [ 'class' => 'director-suggest', 'data-suggestion-context' => "{$type}groupnames", ] ); } /** * @param FilterExpression|null $filter * @return Boolean * @throws Zend_Form_Exception */ protected function boolean(FilterExpression $filter = null) { $value = $filter === null ? '' : $filter->getExpression(); $el = new Boolean( $this->elementId('value', $filter), array( 'value' => $value, 'decorators' => array('ViewHelper'), ) ); return $el; } protected function columnIsJson(FilterExpression $filter) { $col = $filter->getColumn(); return strlen($col) && $col[0] === '"'; } /** * @param FilterExpression|null $filter * @param string $suggestionContext * * @return mixed */ protected function text(FilterExpression $filter = null, $suggestionContext = null) { $attr = null; if ($suggestionContext !== null) { $attr = [ 'class' => 'director-suggest', 'data-suggestion-context' => $suggestionContext, ]; } $value = $filter === null ? '' : $filter->getExpression(); if (is_array($value)) { return $this->view->formIplExtensibleSet( $this->elementId('value', $filter), $value, $attr ); } return $this->view->formText( $this->elementId('value', $filter), $value, $attr ); } /** * @return \Icinga\Data\Filter\FilterExpression */ protected function emptyExpression() { return Filter::expression('', '=', ''); } protected function arrayForSelect($array, $flip = false) { $res = array(); foreach ($array as $k => $v) { if (is_int($k)) { $res[$v] = ucwords(str_replace('_', ' ', $v)); } elseif ($flip) { $res[$v] = $k; } else { $res[$k] = $v; } } // sort($res); return $res; } protected function elementId($field, Filter $filter = null) { $prefix = $this->fieldName . '[id_'; $suffix = '][' . $field . ']'; return $prefix . $filter->getId() . $suffix; } /** * @param FilterChain|null $filter * @return mixed */ protected function selectOperator(FilterChain $filter = null) { $ops = [ 'AND' => 'AND', 'OR' => 'OR', 'NOT' => 'NOT' ]; return $this->select( $this->elementId('operator', $filter), $ops, $filter === null ? null : $filter->getOperatorName(), ['class' => 'operator autosubmit'] ); } protected function selectSign(FilterExpression $filter = null) { $signs = [ '=' => '=', '!=' => '!=', '>' => '>', '<' => '<', '>=' => '>=', '<=' => '<=', 'in' => 'in', 'contains' => 'contains', 'true' => 'is true (or set)', 'false' => 'is false (or not set)', ]; if ($filter === null) { $sign = null; } else { if ($this->columnIsJson($filter)) { $sign = 'contains'; } else { $expression = json_decode($filter->getExpression()); if ($expression === true) { $sign = 'true'; } elseif ($expression === false) { $sign = 'false'; } elseif (is_array($expression)) { $sign = 'in'; } else { $sign = $filter->getSign(); } } } $class = 'sign autosubmit'; if (strlen($sign) > 3) { $class .= ' wide'; } return $this->select( $this->elementId('sign', $filter), $signs, $sign, array('class' => $class) ); } public function setColumns(array $columns = null) { $this->cachedColumnSelect = $columns ? $this->arrayForSelect($columns) : null; return $this; } protected function getSuggestionContext() { return $this->suggestionContext; } protected function setSuggestionContext($context) { $this->suggestionContext = $context; } protected function selectColumn(FilterExpression $filter = null) { $active = $filter === null ? null : $filter->getColumn(); if ($filter && $this->columnIsJson($filter)) { $active = $filter->getExpression(); } if ($context = $this->getSuggestionContext()) { return $this->view->formText( $this->elementId('column', $filter), $active, [ 'class' => 'column autosubmit director-suggest', 'data-suggestion-context' => $context, ] ); } if ($this->hasColumnList()) { $cols = $this->getColumnList(); if ($active && !isset($cols[$active])) { $cols[$active] = str_replace( '_', ' ', ucfirst(ltrim($active, '_')) ); // ?? } $cols = $this->optionalEnum($cols); return $this->select( $this->elementId('column', $filter), $cols, $active, ['class' => 'column autosubmit'] ); } else { return $this->view->formText( $this->elementId('column', $filter), $active, ['class' => 'column autosubmit'] ); } } protected function optionalEnum($enum) { return array_merge( array(null => $this->view->translate('- please choose -')), $enum ); } protected function hasColumnList() { return $this->cachedColumnSelect !== null || $this->query !== null; } protected function getColumnList() { if ($this->cachedColumnSelect === null) { $this->fetchColumnList(); } return $this->cachedColumnSelect; } protected function fetchColumnList() { if ($this->query instanceof FilterColumns) { $this->cachedColumnSelect = $this->arrayForSelect( $this->query->getFilterColumns(), true ); asort($this->cachedColumnSelect); } elseif ($this->cachedColumnSelect === null) { throw new RuntimeException('No columns set nor does the query provide any'); } } protected function select($name, $list, $selected, $attributes = null) { return $this->view->formSelect($name, $selected, $attributes, $list); } protected function removeLink(Filter $filter) { return $this->filterActionButton( $filter, 'cancel', t('Remove this part of your filter') ); } protected function addLink(Filter $filter) { return $this->filterActionButton( $filter, 'plus', t('Add another filter') ); } protected function expandLink(Filter $filter) { return $this->filterActionButton( $filter, 'angle-double-right', t('Wrap this expression into an operator') ); } protected function stripLink(Filter $filter) { return $this->filterActionButton( $filter, 'minus', t('Strip this operator, preserve child nodes') ); } protected function filterActionButton(Filter $filter, $action, $title) { return $this->iconButton( $this->getActionButtonName($filter), $action, $title ); } protected function getActionButtonName(Filter $filter) { return sprintf( '%s[id_%s][action]', $this->fieldName, $filter->getId() ); } protected function iconButton($name, $icon, $title) { return $this->view->formSubmit( $name, IconHelper::instance()->iconCharacter($icon), array('class' => 'icon-button', 'title' => $title) ); } } icingaweb2-module-director-1.11.8/application/views/helpers/FormIplExtensibleSet.php000066400000000000000000000010131516513262500305730ustar00rootroot00000000000000_getInfo($name, $value); extract($info); // name, value, attribs, options, listsep, disable return $value; } } icingaweb2-module-director-1.11.8/application/views/helpers/FormStoredPassword.php000066400000000000000000000032521516513262500303420ustar00rootroot00000000000000_getInfo($name, $value, $attribs); \extract($info); // name, value, attribs, options, listsep, disable $sentValue = $this->stripAttribute($attribs, 'sentValue'); $res = new HtmlDocument(); $el = Html::tag('input', [ 'type' => 'password', 'name' => "{$name}[_value]", 'id' => $id, 'autocomplete' => 'new-password' ]); $res->add($el); $res->add(Html::tag('input', [ 'type' => 'hidden', 'name' => "{$name}[_sent]", 'value' => 'y' ])); if ($sentValue !== null && \strlen($sentValue)) { $el->getAttributes()->set('value', $sentValue); } elseif ($value !== null && \strlen($value) > 0) { $el->getAttributes()->set('value', '__UNCHANGED_VALUE__'); } return $res; } protected function stripAttribute(&$attribs, $name, $default = null) { if (\array_key_exists($name, $attribs)) { if (\strlen($attribs[$name])) { return $attribs[$name]; } unset($attribs[$name]); } return $default; } } icingaweb2-module-director-1.11.8/application/views/helpers/RenderPlainObject.php000066400000000000000000000005671516513262500300730ustar00rootroot00000000000000 tabs ?>

escape($this->title) ?>

escape($this->message) ?>

table ?>
icingaweb2-module-director-1.11.8/application/views/scripts/phperror/error.phtml000066400000000000000000000002741516513262500301100ustar00rootroot00000000000000
tabs ?>

escape($this->title) ?>

escape($this->message) ?>

icingaweb2-module-director-1.11.8/application/views/scripts/settings/000077500000000000000000000000001516513262500257055ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/views/scripts/settings/index.phtml000066400000000000000000000001401516513262500300550ustar00rootroot00000000000000
tabs ?>
icingaweb2-module-director-1.11.8/application/views/scripts/suggest/000077500000000000000000000000001516513262500255265ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/application/views/scripts/suggest/index.phtml000066400000000000000000000001321516513262500276770ustar00rootroot00000000000000
  • icingaweb2-module-director-1.11.8/configuration.php000066400000000000000000000157531516513262500223110ustar00rootroot00000000000000getConfig()->get('frontend', 'disabled', 'no') === 'yes') { return; } $monitoringExists = Module::exists('monitoring'); $icingadbExists = Module::exists('icingadb'); $this->providePermission(Permission::ALL_PERMISSIONS, $this->translate('Allow unrestricted access to Icinga Director')); $this->providePermission(Permission::API, $this->translate('Allow to access the director API')); $this->providePermission(Permission::AUDIT, $this->translate('Allow to access the full audit log')); $this->providePermission(Permission::DEPLOY, $this->translate('Allow to deploy configuration')); $this->providePermission(Permission::INSPECT, $this->translate( 'Allow to inspect objects through the Icinga 2 API (could contain sensitive information)' )); $this->providePermission(Permission::SHOW_CONFIG, $this->translate( 'Allow to show configuration (could contain sensitive information)' )); $this->providePermission(Permission::SHOW_SQL, $this->translate( 'Allow to show the full executed SQL queries in some places' )); $this->providePermission(Permission::GROUPS_FOR_RESTRICTED_HOSTS, $this->translate( 'Allow users with Hostgroup restrictions to access the Groups field' )); $this->providePermission(Permission::HOSTS, $this->translate('Allow to configure hosts')); $this->providePermission(Permission::NOTIFICATIONS, $this->translate( 'Allow to configure notifications (unrestricted)' )); $this->providePermission(Permission::SERVICES, $this->translate('Allow to configure services')); $this->providePermission(Permission::SERVICE_SETS, $this->translate('Allow to configure service sets')); $this->providePermission(Permission::SERVICE_SET_APPLY, $this->translate('Allow to define Service Set Apply Rules')); $this->providePermission(Permission::USERS, $this->translate('Allow to configure users')); $this->providePermission(Permission::SCHEDULED_DOWNTIMES, $this->translate( 'Allow to configure notifications (unrestricted)' )); if ($monitoringExists) { $this->providePermission(Permission::MONITORING_HOSTS, $this->translate( 'Allow users to modify Hosts they are allowed to see in the monitoring module' )); $this->providePermission(Permission::MONITORING_SERVICES, $this->translate( 'Allow users to modify Service they are allowed to see in the monitoring module' )); $this->providePermission(Permission::MONITORING_SERVICES_RO, $this->translate( 'Allow readonly users to see where a Service came from' )); } if ($icingadbExists) { $this->providePermission(Permission::ICINGADB_HOSTS, $this->translate( 'Allow users to modify Hosts they are allowed to see in Icinga DB Web' )); $this->providePermission(Permission::ICINGADB_SERVICES, $this->translate( 'Allow users to modify Service they are allowed to see in Icinga DB Web' )); $this->providePermission(Permission::ICINGADB_SERVICES_RO, $this->translate( 'Allow readonly users to see where a Service came from' )); } if ($monitoringExists) { $this->provideRestriction(Restriction::MONITORING_RW_OBJECT_FILTER, $this->translate( 'Additional (monitoring module) object filter to further restrict write access' )); } if ($icingadbExists) { $this->provideRestriction(Restriction::ICINGADB_RW_OBJECT_FILTER, $this->translate( 'Additional (Icinga DB Web) object filter to further restrict write access' )); } $this->provideRestriction(Restriction::FILTER_HOSTGROUPS, $this->translate( 'Limit access to the given comma-separated list of hostgroups' )); $this->provideRestriction(Restriction::NOTIFICATION_APPLY_FILTER_BY_NAME, $this->translate( 'Filter available notification apply rules' )); $this->provideRestriction(Restriction::SCHEDULED_DOWNTIME_APPLY_FILTER_BY_NAME, $this->translate( 'Filter available scheduled downtime rules' )); $this->provideRestriction(Restriction::SERVICE_APPLY_FILTER_BY_NAME, $this->translate( 'Filter available service apply rules' )); $this->provideRestriction(Restriction::SERVICE_SET_FILTER_BY_NAME, $this->translate( 'Filter available service set templates. Use asterisks (*) as wildcards,' . ' like in DB* or *net*' )); $this->provideSearchUrl($this->translate('Host configs'), 'director/hosts?limit=10', 60); /* // Disabled unless available $this->provideRestriction( 'director/hosttemplates/filter', $this->translate('Allow to use only host templates matching this filter') ); $this->provideRestriction( 'director/db_resource', $this->translate('Allow to use only these db resources (comma separated list)') ); */ $this->provideConfigTab('config', [ 'title' => 'Configuration', 'url' => 'settings' ]); $mainTitle = N_('Icinga Director'); try { $app = Icinga::app(); if ($app->isWeb()) { $request = $app->getRequest(); $id = $request->getHeader('X-Icinga-WindowId'); if ($id !== false) { $window = new Window($id); /** @var \Icinga\Web\Session\SessionNamespace $session */ $session = $window->getSessionNamespace('director'); $dbName = $session->get('db_resource'); if ($dbName && $dbName !== $this->getConfig()->get('db', 'resource')) { $dbName = ucfirst(str_replace('_', ' ', $dbName)); if (stripos($dbName, 'Director') === false) { $dbName = 'Director: ' . $dbName; } $mainTitle = $dbName; } } } } catch (\Exception $e) { // There isn't much we can do, we don't want to break the menu $mainTitle .= ' (?!)'; } // Hint: director/admin and director/deployments are intentionally $section = $this->menuSection($mainTitle) ->setUrl('director') ->setPriority(60) ->setIcon('cubes') ->setRenderer(['SummaryNavigationItemRenderer', 'state' => 'critical']); $section->add(N_('Hosts')) ->setUrl('director/dashboard?name=hosts') ->setPermission(Permission::HOSTS) ->setPriority(30); $section->add(N_('Services')) ->setUrl('director/dashboard?name=services') ->setPermission(Permission::SERVICES) ->setPriority(40); $section->add(N_('Commands')) ->setUrl('director/dashboard?name=commands') ->setPermission(Permission::ADMIN) ->setPriority(50); $section->add(N_('Notifications')) ->setUrl('director/dashboard?name=notifications') ->setPermission(Permission::NOTIFICATIONS) ->setPriority(70); $section->add(N_('Automation')) ->setUrl('director/importsources') ->setPermission(Permission::ADMIN) ->setPriority(901); $section->add(N_('Activity log')) ->setUrl('director/config/activities') ->setPriority(902) ->setPermission(Permission::AUDIT) ->setRenderer('ConfigHealthItemRenderer'); $section->add(N_('Deployments')) ->setUrl('director/config/deployments') ->setPriority(902) ->setPermission(Permission::DEPLOYMENTS); icingaweb2-module-director-1.11.8/contrib/000077500000000000000000000000001516513262500203565ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/contrib/docker-test.sh000077500000000000000000000024271516513262500231460ustar00rootroot00000000000000#!/bin/bash MYSQL_CONTAINER=icingaweb2_director_mysql echo "Starting MySQL container..." docker run -d \ -e MYSQL_ROOT_PASSWORD=onlyforadmin \ -e MYSQL_DATABASE=icingaweb2 \ -e MYSQL_USER=icingaweb2 \ -e MYSQL_PASSWORD=rosebud \ --name "$MYSQL_CONTAINER" \ mariadb >/dev/null echo "Running tests..." docker run --rm -i \ --link "$MYSQL_CONTAINER":mysql \ -v `pwd`:/app \ -e DIRECTOR_TESTDB_RES="Director MySQL TestDB" \ -e DIRECTOR_TESTDB_HOST="mysql" \ -e DIRECTOR_TESTDB_USER="icingaweb2" \ -e DIRECTOR_TESTDB_PASSWORD="rosebud" \ -e DIRECTOR_TESTDB="icingaweb2" \ lazyfrosch/icingaweb2-test:5.6 \ sh - \ <&2 exit 1 } warn() { echo "WARNING: $1" >&2 } info() { echo "INFO: $1" >&2 } check_command() { command -v "$@" &>/dev/null } install_config() { if [ -e "$1" ] && [ ! -e "${1}.orig" ]; then info "Creating a backup at ${1}.orig" cp "$1" "${1}.orig" fi echo "Writing config to ${1}" echo "$2" > "${1}" } [ "$BASH_VERSION" ] || fail "This is a Bash script" errors= for key in NODENAME CA_NODE CA_PORT CA_TICKET PARENT_ZONE PARENT_ENDPOINTS; do var="ICINGA2_${key}" if [ -z "${!var}" ]; then warn "The variable $var needs to be configured!" errors+=1 fi done [ -z "$errors" ] || exit 1 # Detect osfamily if [ -n "$ICINGA2_OSFAMILY" ]; then info "Assuming supplied osfamily $ICINGA2_OSFAMILY" elif check_command rpm && ! check_command dpkg; then info "This should be a RedHat system" if [ -e /etc/sysconfig/icinga2 ]; then # shellcheck disable=SC1091 . /etc/sysconfig/icinga2 fi ICINGA2_OSFAMILY=redhat elif check_command dpkg; then info "This should be a Debian system" if [ -e /etc/default/icinga2 ]; then # shellcheck disable=SC1091 . /etc/default/icinga2 fi ICINGA2_OSFAMILY=debian elif check_command apk; then info "This should be a Alpine system" if [ -e /etc/icinga2/icinga2.sysconfig ]; then # shellcheck disable=SC1091 . /etc/icinga2/icinga2.sysconfig fi ICINGA2_OSFAMILY=alpine else fail "Could not determine your os type!" fi # internal defaults : "${ICINGA2_CONFIG_FILE:=/etc/icinga2/icinga2.conf}" : "${ICINGA2_CONFIGDIR:="$(dirname "$ICINGA2_CONFIG_FILE")"}" : "${ICINGA2_DATADIR:=/var/lib/icinga2}" : "${ICINGA2_SSLDIR_OLD:="${ICINGA2_CONFIGDIR}"/pki}" : "${ICINGA2_SSLDIR_NEW:="${ICINGA2_DATADIR}"/certs}" : "${ICINGA2_SSLDIR:=}" : "${ICINGA2_BIN:=icinga2}" case "$ICINGA2_OSFAMILY" in debian) : "${ICINGA2_USER:=nagios}" : "${ICINGA2_GROUP:=nagios}" ;; redhat) : "${ICINGA2_USER:=icinga}" : "${ICINGA2_GROUP:=icinga}" ;; alpine) : "${ICINGA2_USER:=icinga}" : "${ICINGA2_GROUP:=icinga}" ;; *) fail "Unknown osfamily '$ICINGA2_OSFAMILY'!" ;; esac icinga_version() { "$ICINGA2_BIN" --version 2>/dev/null | grep -oPi '\(version: [rv]?\K\d+\.\d+\.\d+[^\)]*' } version() { echo "$@" | awk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }' } # Make sure icinga2 is installed and running echo -n "check: icinga2 installed - " if version=$(icinga_version); then echo "OK: $version" else fail "You need to install icinga2!" fi if [ -z "${ICINGA2_SSLDIR}" ]; then if [ -f "${ICINGA2_SSLDIR_OLD}/${ICINGA2_NODENAME}.crt" ]; then info "Using old SSL directory: ${ICINGA2_SSLDIR_OLD}" info "Because you already have a certificate in ${ICINGA2_SSLDIR_OLD}/${ICINGA2_NODENAME}.crt" ICINGA2_SSLDIR="${ICINGA2_SSLDIR_OLD}" elif [ $(version $version) -gt $(version 2.8) ]; then info "Using new SSL directory: ${ICINGA2_SSLDIR_NEW}" ICINGA2_SSLDIR="${ICINGA2_SSLDIR_NEW}" else info "Using old SSL directory: ${ICINGA2_SSLDIR_OLD}" ICINGA2_SSLDIR="${ICINGA2_SSLDIR_OLD}" fi fi if [ ! -d "$ICINGA2_SSLDIR" ]; then mkdir "$ICINGA2_SSLDIR" chown "$ICINGA2_USER.$ICINGA2_GROUP" "$ICINGA2_SSLDIR" fi if [ -f "${ICINGA2_SSLDIR}/${ICINGA2_NODENAME}.crt" ]; then warn "ERROR: a certificate for '${ICINGA2_NODENAME}' already exists" warn "Please remove ${ICINGA2_SSLDIR}/${ICINGA2_NODENAME}.??? in case you want a" warn "new certificate to be generated and signed by ${ICINGA2_CA_NODE}" if [ -z "${ICINGA2_UPDATE_CONFIG}" ] && [ -z "${ICINGA2_DRYRUN}" ]; then warn "Aborting here, you can can call the script like this to just update config:" info " ICINGA2_UPDATE_CONFIG=1 $0" exit 1 fi elif [ -z "${ICINGA2_DRYRUN}" ]; then if ! "$ICINGA2_BIN" pki new-cert --cn "${ICINGA2_NODENAME}" \ --cert "${ICINGA2_SSLDIR}/${ICINGA2_NODENAME}.crt" \ --csr "${ICINGA2_SSLDIR}/${ICINGA2_NODENAME}.csr" \ --key "${ICINGA2_SSLDIR}/${ICINGA2_NODENAME}.key" then fail "Could not create self signed certificate!" fi if ! "$ICINGA2_BIN" pki save-cert \ --host "${ICINGA2_CA_NODE}" \ --port "${ICINGA2_CA_PORT}" \ --key "${ICINGA2_SSLDIR}/${ICINGA2_NODENAME}.key" \ --trustedcert "${ICINGA2_SSLDIR}/trusted-master.crt" then fail "Could not retrieve trusted certificate from host ${ICINGA2_CA_NODE}" fi if ! "$ICINGA2_BIN" pki request \ --host "${ICINGA2_CA_NODE}" \ --port "${ICINGA2_CA_PORT}" \ --ticket "${ICINGA2_CA_TICKET}" \ --key "${ICINGA2_SSLDIR}/${ICINGA2_NODENAME}.key" \ --cert "${ICINGA2_SSLDIR}/${ICINGA2_NODENAME}.crt" \ --trustedcert "${ICINGA2_SSLDIR}/trusted-master.crt" \ --ca "${ICINGA2_SSLDIR}/ca.crt" then fail "Could not retrieve final certificate from host ${ICINGA2_CA_NODE}" fi else info "Would create certificates under ${ICINGA2_SSLDIR}, but in dry-run!" fi # Prepare Config Files content_config=$(cat << EOF /** Icinga 2 Config - proposed by Icinga Director */ include "constants.conf" $([ "${ICINGA2_HOSTNAME}" != "${ICINGA2_NODENAME}" ] || echo '// ')const NodeName = "${ICINGA2_NODENAME}" include "zones.conf" include "features-enabled/*.conf" include include include include include include EOF ) endpoint_list='' for item in "${ICINGA2_PARENT_ENDPOINTS[@]}"; do endpoint=$(echo "$item" | cut -d, -f1) endpoint_list+="\"${endpoint}\", " done content_zones=$(cat << EOF /** Icinga 2 Config - proposed by Icinga Director */ object Endpoint "${ICINGA2_NODENAME}" {} object Zone "${ICINGA2_NODENAME}" { parent = "${ICINGA2_PARENT_ZONE}" endpoints = [ "${ICINGA2_NODENAME}" ] } object Zone "${ICINGA2_PARENT_ZONE}" { endpoints = [ ${endpoint_list%, } ] } EOF ) for item in "${ICINGA2_PARENT_ENDPOINTS[@]}"; do endpoint=$(echo "$item" | cut -d, -f1) host=$(echo "$item" | cut -s -d, -f2) content_zones+=$(cat << EOF object Endpoint "${endpoint}" { $([ -n "$host" ] && echo " host = \"${host}\"" || echo " //host = \"${endpoint}\"") } EOF ) done for zone in "${ICINGA2_GLOBAL_ZONES[@]}"; do content_zones+=$(cat << EOF object Zone "${zone}" { global = true } EOF ) done content_api="/** Icinga 2 Config - proposed by Icinga Director */ object ApiListener \"api\" {" if [ "${ICINGA2_SSLDIR}" = "${ICINGA2_SSLDIR_OLD}" ]; then content_api+=" cert_path = SysconfDir + \"/icinga2/pki/${ICINGA2_NODENAME}.crt\" key_path = SysconfDir + \"/icinga2/pki/${ICINGA2_NODENAME}.key\" ca_path = SysconfDir + \"/icinga2/pki/ca.crt\" " fi content_api+=" accept_commands = true accept_config = true } " if [ -z "${ICINGA2_DRYRUN}" ]; then install_config "$ICINGA2_CONFIGDIR"/icinga2.conf "$content_config" install_config "$ICINGA2_CONFIGDIR"/zones.conf "$content_zones" install_config "$ICINGA2_CONFIGDIR"/features-available/api.conf "$content_api" "$ICINGA2_BIN" feature enable api "$ICINGA2_BIN" daemon -C echo "Please restart icinga2:" case "$ICINGA2_OSFAMILY" in debian) echo " systemctl restart icinga2" ;; redhat) echo " systemctl restart icinga2" ;; alpine) echo " rc-service icinga2 restart" ;; *) fail "Unknown osfamily '$ICINGA2_OSFAMILY'!" ;; esac else output_code() { sed 's/^/ /m' <<<"$1" } echo "### $ICINGA2_CONFIGDIR"/icinga2.conf echo output_code "$content_config" echo echo "### $ICINGA2_CONFIGDIR"/zones.conf echo output_code "$content_zones" echo echo "### $ICINGA2_CONFIGDIR"/features-available/api.conf echo output_code "$content_api" fi icingaweb2-module-director-1.11.8/contrib/systemd/000077500000000000000000000000001516513262500220465ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/contrib/systemd/icinga-director.service000066400000000000000000000007561516513262500265030ustar00rootroot00000000000000[Unit] Description=Icinga Director - Monitoring Configuration Documentation=https://icinga.com/docs/director/latest/ Wants=network.target [Service] EnvironmentFile=-/etc/default/icinga-director EnvironmentFile=-/etc/sysconfig/icinga-director ExecStart=/usr/bin/icingacli director daemon run ExecReload=/bin/kill -HUP ${MAINPID} User=icingadirector SyslogIdentifier=icingadirector Type=notify NotifyAccess=main WatchdogSec=10 RestartSec=30 Restart=always [Install] WantedBy=multi-user.target icingaweb2-module-director-1.11.8/contrib/windows-agent-installer/000077500000000000000000000000001516513262500251375ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/contrib/windows-agent-installer/Icinga2Agent.psm1000066400000000000000000004657711516513262500302200ustar00rootroot00000000000000<# .Synopsis Icinga 2 PowerShell Module - the most flexible and easy way to configure and install Icinga 2 Agents on Windows. .DESCRIPTION More Information on https://github.com/Icinga/icinga2-powershell-module .EXAMPLE exit $icinga = Icinga2AgentModule ` -AgentName 'windows-host-name' ` -Ticket '3459843583450834508634856383459' ` -ParentZone 'icinga-master' ` -ParentEndpoints 'icinga2a', 'icinga2b' ` -CAServer 'icinga-master' ` -RunInstaller; .NOTES #> function Icinga2AgentModule { # # Setup parameters which can be accessed # with - # [CmdletBinding()] param( # This is in general the name of your Windows host. It will have to match with your Icinga configuration, as it is part of the Icinga 2 Ticket and Certificate handling to ensure a valid certificate is generated [string]$AgentName, # The Ticket you will receive from your Icinga 2 CA. In combination with the Icinga Director, it will tell you which Ticket you will require for your host [string]$Ticket, # You can either leave this parameter or add it to allow the module to install or update the Icinga 2 Agent on your system [string]$InstallAgentVersion, # Instead of setting the Agent Name with -AgentName, the PowerShell module is capable of retreiving the information automaticly from Windows. Please note this is not the FQDN [switch]$FetchAgentName = $FALSE, # Like -FetchAgentName, this argument will ensure the hostname is set inside the script, will however include the domain to provide the FQDN internally. [switch]$FetchAgentFQDN = $FALSE, # Allows to transform the hostname to either lower or upper case if required. 0: Do nothing 1: To lower case 2: To upper case [int]$TransformHostname = -1, # This variable allows to specify on which port the Icinga 2 Agent will listen on [int]$AgentListenPort = -1, # Each Icinga 2 Agent is in general forwarding it's check results to a parent master or satellite zone. Here you will have to specify the name of the parent zone [string]$ParentZone,# # Icinga 2 internals to make it configurable if the Agent is accepting configuration from the Icinga config master. [int]$AcceptConfig = -1, # This argument will define if the Icinga 2 debug log will be enabled or disabled. [switch]$IcingaEnableDebugLog = $FALSE, # This argument will define if we enable or disable the Icinga 2 logging feature [switch]$IcingaDisableLogging = $FALSE, # Allows to specify if the PowerShell Module will add a firewall rule, allowing Icinga 2 masters or Satellites to connect to the Icinga 2 Agent on the defined port [switch]$AgentAddFirewallRule = $FALSE, # This parameter requires an array of string values, to which endpoints the Agent should in general connect to. If you are only having one endpoint, only add one. You will have to specify all endpoints the Agent requires to connect to [array]$ParentEndpoints, # While -ParentEndpoints will define the name of endpoints by an array, this parameter will allow to assign IP address and port configuration, allowing the Icinga 2 Agent to directly connect to parent Icinga 2 instances. To specify IP address and port, you will have to seperate these entries by using ';' without blank spaces. The order of the config has to match the assignment of -ParentEndpoints. You can specify the IP address only without a port definition by just leaving the last part. If you wish to not specify a config for a specific endpoint, simply add an empty string to the correct location. [array]$EndpointsConfig, # Allows to specify global zones, which will be added into the icinga2.conf. Note: In case no global zone will be defined, director-global will be added by default. If you specify zones by yourself, please ensure to add director-global as this is not done automaticly when adding custom global-zones. [array]$GlobalZones = @(), # Agent installation / update <# This argument will allow to override the user the Icinga 2 service is running with. Windows provides some basic users already which can be configured: LocalSystem NT AUTHORITY\NetworkService (Icinga default) NT AUTHORITY\LocalService If you require an own user, you can add that one as well for the argument. If a password is required for the user to login, seperate username and password with a ':'. Example: jdoe:mysecretpassword Furthermore you can also use domains in combination and pass them over. Example: icinga\jdoe:mysecretpassword[string]$IcingaServiceUser, #> [string]$IcingaServiceUser, #With this parameter you can define a download Url or local directory from which the module will download/install a specific Icinga 2 Agent MSI Installer package. Please ensure to only define the base download Url / Directory, as the Module will generate the MSI file name based on your operating system architecture and the version to install. The Icinga 2 MSI Installer name is internally build as follows: Icinga2-v[InstallAgentVersion]-[OSArchitecture].msi # Full example: Icinga2-v2.8.0-x86_64.msi [string]$DownloadUrl, # Allows to specify in which directory the Icinga 2 Agent will be installed into. In case of an Agent update you can specify with this argument a new directory the new Agent will be installed into. The old directory will be removed caused by the required uninstaller process. [string]$AgentInstallDirectory, # In case the Icinga 2 Agent is already installed on the system, this parameter will allow you to configure if you wish to upgrade / downgrade to a specified version with the -InstallAgentVersion parameter as well. If none of both parameters is defined, the module will not update or downgrade the agent. # If argument -AgentInstallDirectory is not specified, the Icinga 2 Agent will be installed into the same directory as before. In case defined, the PowerShell Module will use the new directory as installation target. [switch]$AllowUpdates = $FALSE, # To ensure downloaded packages are build by the Icinga Team and not compromised by third parties, you will be able to provide an array of SHA1 hashes here. In case you have defined any hashses, the module will not continue with updating / installing the Agent in case the SHA1 hash of the downloaded MSI package is not matching one of the provided hashes of this parameter. [array]$InstallerHashes, # In case the Icinga Agent will accept configuration from the parent Icinga 2 system, it will possibly write data to /var/lib/icinga2/api/* By adding this parameter to your script call, all content inside the api directory will be flushed once a change is detected by the module which requires a restart of the Icinga 2 Agent [switch]$FlushApiDirectory = $FALSE, # Here you can provide a string to the Icinga 2 CA or any other CA responsible to generate the required certificates for the SSL communication between the Icinga 2 Agent and it's parent [string]$CAServer, # TODO [string]$CACertificatePath, # Here you can specify a custom port in case your CA Server is not listening on 5665 [int]$CAPort = 5665, # The module will generate the certificates in general only if one of the required files is missing. By adding this parameter to your call, the module will force the re-creation of the certificates. [switch]$ForceCertificateGeneration = $FALSE, # This option will allow the validation of the trusted-master.crt generated during certificate generation, to ensure we are connected to the correct endpoint to prevent possible man-in-the-middle attacks. [string]$CAFingerprint, # Use this switch to enable the CAProxy feature Introduced with Icinga 2.8 [switch]$CAProxy = $FALSE, # Director communication #This argument will tell the PowerShell where the Icinga Director can be found. Please specify the entire path to the Icinga Director! Example: https://example.com/icingaweb2/director/ [string]$DirectorUrl, #To fetch the Ticket for a host, creating host objects or deploying the configuration you will have to authenticate against the Icinga Director. This parameter allows to set the User we shall use to login. [string]$DirectorUser, # To fetch the Ticket for a host, creating host objects or deploying the configuration you will have to authenticate against the Icinga Director. This parameter allows to set the Password we shall use to login. [string]$DirectorPassword, # TODO [string]$DirectorDomain, # API key for specific host templates, allowing the configuration and creation of host objects within the Icinga Director without password authentication. This is the API token assigned to a host template. Hosts created with this token, will automaticly receive the Host-Template assigned to the API key. Furthermore this token allows to access the Icinga Director Self-Service API to fetch basic arguments for the module. # Note: This argument requires Icinga Director API Version 1.4.0 or higher [string]$DirectorAuthToken, # This argument allows you to parse either a valid JSON-String or an hashtable / array, containing all informations for the host object to create. Please note that using arrays or hashtable objects for this argument will require PowerShell version 3 and above. [System.Object]$DirectorHostObject, # If you add this parameter to your script call, the PowerShell module will tell the Icinga Director to deploy outstanding configurations. This parameter can be used in combination with -DirectorHostObject, to create objects and deploy them right away. This argument requires the user and password argument and will not work with the Self Service api. # Caution: If set, all outstanding deployments inside the Icinga Director will be deployed. Use with caution!!! [switch]$DirectorDeployConfig = $FALSE, # NSClient Installer [switch]$InstallNSClient = $FALSE, [switch]$NSClientAddDefaults = $FALSE, [switch]$NSClientEnableFirewall = $FALSE, [switch]$NSClientEnableService = $FALSE, [string]$NSClientDirectory, [string]$NSClientInstallerPath, # Uninstaller arguments # This argument is only used by the function 'uninstall' and will remove the remaining content from 'C:\Program Data\icinga2' to prepare a clean setup of the Icinga 2 infrastrucure. [switch]$FullUninstallation = $FALSE, # When this argument is set, the installed NSClient++ will be removed from the system as well. This argument is only used by calling the function 'uninstall' [switch]$RemoveNSClient = $FALSE, # Dump Icinga Config [switch]$DumpIcingaConfig = $FALSE, # Dump Icinga Objects [switch]$DumpIcingaObjects = $FALSE, #Internal handling # This argument allows to shorten the entire call of the module, not requiring to define a custom variable and executing the installation function of the monitoring components. [switch]$RunInstaller = $FALSE, # This argument allows to shorten the entire call of the module, not requiring to define a custom variable and executing the uninstallation function of the monitoring components. [switch]$RunUninstaller = $FALSE, #In certain cases it could be required to ingore SSL certificate validations from the Icinga Web 2 installation (for example in case self-signed certificates are used). By default the PowerShell Module is validating SSL certificates and throws an error if the validation fails. #In case self-signed certificates are used and not included to the local certificate store of the Windows machine, the module will fail. By providing this argument, validation will always be valid and the script will execute as if the certificate was valid. [switch]$IgnoreSSLErrors = $FALSE, [switch]$DebugMode = $FALSE, # Specify a path to either a directory or a file to write all output from the PowerShell module into a file for later debugging. In case a directory is specified, the script will automaticly create a new file with a unique name into it. If a file is specified which is not yet present, it will be created. [string]$ModuleLogFile ); # # Initialise our installer object # and generate our config objects # $installer = New-Object -TypeName PSObject; $installer | Add-Member -membertype NoteProperty -name 'properties' -value @{} $installer | Add-Member -membertype NoteProperty -name 'cfg' -value @{ agent_name = $AgentName; ticket = $Ticket; agent_version = $InstallAgentVersion; fetch_agent_name = $FetchAgentName; fetch_agent_fqdn = $FetchAgentFQDN; transform_hostname = $TransformHostname; agent_listen_port = $AgentListenPort; parent_zone = $ParentZone; accept_config = $AcceptConfig; icinga_enable_debug_log = $IcingaEnableDebugLog; icinga_disable_log = $IcingaDisableLogging; agent_add_firewall_rule = $AgentAddFirewallRule; parent_endpoints = $ParentEndpoints; endpoints_config = $EndpointsConfig; global_zones = $GlobalZones; icinga_service_user = $IcingaServiceUser; download_url = $DownloadUrl; agent_install_directory = $AgentInstallDirectory; allow_updates = $AllowUpdates; installer_hashes = $InstallerHashes; flush_api_directory = $FlushApiDirectory; ca_server = $CAServer; ca_certificate_path = $CACertificatePath; ca_port = $CAPort; force_cert = $ForceCertificateGeneration; ca_fingerprint = $CAFingerprint; caproxy = $CAProxy; director_url = $DirectorUrl; director_user = $DirectorUser; director_password = $DirectorPassword; director_domain = $DirectorDomain; director_auth_token = $DirectorAuthToken; director_host_object = $DirectorHostObject; director_deploy_config = $DirectorDeployConfig; install_nsclient = $InstallNSClient; nsclient_add_defaults = $NSClientAddDefaults; nsclient_firewall = $NSClientEnableFirewall; nsclient_service = $NSClientEnableService; nsclient_directory = $NSClientDirectory; nsclient_installer_path = $NSClientInstallerPath; full_uninstallation = $FullUninstallation; remove_nsclient = $RemoveNSClient; ignore_ssl_errors = $IgnoreSSLErrors; debug_mode = $DebugMode; module_log_file = $ModuleLogFile; } # # Access default script config parameters # by using this function. These variables # are set during the initial call of # the script with the parameters # $installer | Add-Member -membertype ScriptMethod -name 'config' -value { param([string] $key); return $this.cfg[$key]; } # # In case we run the script not through Icinga Director, we might want to set # script default values # $installer | Add-Member -membertype ScriptMethod -name 'setScriptDefaultVariables' -value { if ($this.cfg['transform_hostname'] -eq -1) { $this.cfg['transform_hostname'] = 0; $this.debug('Setting "transform_hostname" to default 0'); } if ($this.cfg['download_url'] -eq '') { $this.cfg['download_url'] = 'https://packages.icinga.com/windows/'; $this.debug('Setting "download_url" to default "https://packages.icinga.com/windows/"'); } if ($this.cfg['agent_listen_port'] -eq -1) { $this.cfg['agent_listen_port'] = 5665; $this.debug('Setting "agent_listen_port" to default 5665'); } if ($this.cfg['global_zones'].Count -eq 0) { $this.cfg['global_zones'] = @( 'director-global', 'global-templates' ); $this.generateGlobalZones(); $this.debug('Setting "global_zones" to default "director-global" and "global-templates"'); } if ($this.cfg['accept_config'] -eq -1) { $this.cfg['accept_config'] = $TRUE; $this.debug('Setting "accept_config" to default "true"'); } } # # Override the given arguments of the PowerShell script with # custom values or edited values # $installer | Add-Member -membertype ScriptMethod -name 'overrideConfig' -value { param([string] $key, $value, $keepScriptArguments); # Ensure the director will not override our custom config for arguments if ($keepScriptArguments) { $scriptValue = $this.cfg[$key]; if ([string]::IsNullOrEmpty($scriptValue) -eq $FALSE) { if ($scriptValue.GetType().Name -eq 'SwitchParameter' -And $scriptValue -eq $TRUE) { $this.debug("Skipping overriding of '$key', as set by script. [$scriptValue]"); return; } if ($scriptValue.GetType().Name -eq 'SwitchParameter' -And $scriptValue -eq $FALSE) { # Do not keep value } elseif ($scriptValue.GetType().Name -eq 'Int32' -And $scriptValue -eq -1) { # Do not keep value } elseif ([string]::IsNullOrEmpty($scriptValue) -eq $FALSE) { $this.debug("Skipping overriding of '$key', as set by script. [$scriptValue]"); return; } else { $this.debug("Skipping overriding of '$key', as set by script. [$scriptValue]"); return; } } } $this.cfg[$key] = $value; } # # Convert a boolean value $TRUE $FALSE # to a string value # $installer | Add-Member -membertype ScriptMethod -name 'convertBoolToString' -value { param([bool]$key); if ($key) { return 'true'; } return 'false'; } # # Convert a boolean value $TRUE $FALSE # to a int value # $installer | Add-Member -membertype ScriptMethod -name 'convertBoolToInt' -value { param([bool]$key); if ($key) { return 1; } return 0; } # # Global variables can be accessed # by using this function. Example: # $this.getProperty('agent_version) # $installer | Add-Member -membertype ScriptMethod -name 'getProperty' -value { param([string] $key); # Initialse some variables first # will only be called once if (-Not $this.properties.Get_Item('initialized')) { $this.init(); } return $this.properties.Get_Item($key); } # # Set the value of a global variable # to ensure later usage. Example # $this.setProperty('agent_version', '2.4.10') # $installer | Add-Member -membertype ScriptMethod -name 'setProperty' -value { param([string]$key, $value); # Initialse some variables first # will only be called once if (-Not $this.properties.Get_Item('initialized')) { $this.properties.Set_Item('initialized', $TRUE); $this.init(); } $this.properties.Set_Item($key, $value); } # # This function will dump all global # variables of the script for debugging # purposes # $installer | Add-Member -membertype ScriptMethod -name 'dumpProperties' -value { [string]$dumpData = $this.properties | Out-String; $this.debug('Dumping properties...'); $this.debug($dumpData); } # # Dump all configured arguments for easier debugging # $installer | Add-Member -membertype ScriptMethod -name 'dumpConfig' -value { [string]$dumpData = $this.cfg | Out-String; $this.debug('Dumping config...'); $this.debug($dumpData); } # # Write all output from consoles to a logfile # $installer | Add-Member -membertype ScriptMethod -name 'writeLogFile' -value { param([string]$severity, [string]$content); # If no logfile is specified, do nothing if (-Not $this.config('module_log_file')) { return; } # Store our logfile into a variable $logFile = $this.config('module_log_file'); # Have we specified a directory to write into or a file already? try { # Check if we are a directory or a file # Will return false for files or non-existing files $directory = (Get-Item $logFile) -is [System.IO.DirectoryInfo]; } catch { # Nothing to catch. Simply get rid of error messages from aboves function in case of error # Will return false anyways on error } # If we are a directory, add a file we can write to if ($directory) { $logFile = Join-Path -Path $logFile -ChildPath 'icinga2agent_psmodule.log'; } # Format a timestamp to get to know the exact date and time. Example: 2017-13-07 22:09:13.263.263 $timestamp = Get-Date -Format "yyyy-dd-MM HH:mm:ss.fff"; $content = [string]::Format('{0} [{1}]: {2}', $timestamp, $severity, $content); # Write the content to our logfile Add-Content -Path $logFile -Value $content; } # # This function will print messages as errors, but add them internally to # an exception list. These will re-printed at the end to summarize possible # issues during the run # $installer | Add-Member -membertype ScriptMethod -name 'exception' -value { param([string]$message, [string[]]$args); [array]$exceptions = $this.getProperty('exception_messages'); if ($exceptions -eq $null) { $exceptions = @(); } $exceptions += $message; $this.setProperty('exception_messages', $exceptions); write-host 'Fatal:' $message -ForegroundColor red; $this.writeLogFile('fatal', $message); } # # Get the current exit code of the script. Return 0 for no errors and 1 for # possible errors, including a summary of what went wrong # $installer | Add-Member -membertype ScriptMethod -name 'getScriptExitCode' -value { [array]$exceptions = $this.getProperty('exception_messages'); $this.dumpProperties(); $this.dumpConfig(); if ($exceptions -eq $null) { return 0; } $this.writeLogFile('fatal', '##################################################################'); $message = '######## The script encountered several errors during run ########'; $this.writeLogFile('fatal', $message); $this.writeLogFile('fatal', '##################################################################'); write-host $message -ForegroundColor red; foreach ($err in $exceptions) { write-host 'Fatal:' $err -ForegroundColor red; $this.writeLogFile('fatal', $err); } return 1; } # # Print the relevant exception # By reading the relevant info # from the stack # $installer | Add-Member -membertype ScriptMethod -name 'printLastException' -value { $this.exception($_.Exception.Message); } # # this function will print an info message # or throw an exception, based on the # provided exitcode # (0 = ok, anything else => exception) # $installer | Add-Member -membertype ScriptMethod -name 'printAndAssertResultBasedOnExitCode' -value { param([string]$result, [string]$exitcode); if ($exitcode -ne 0) { throw $result; } else { $this.info($result); } } # # Return an error message with red text # $installer | Add-Member -membertype ScriptMethod -name 'error' -value { param([string] $message, [array] $args); Write-Host 'Error:' $message -ForegroundColor red; $this.writeLogFile('error', $message); } # # Return a warning message with yellow text # $installer | Add-Member -membertype ScriptMethod -name 'warn' -value { param([string] $message, [array] $args); Write-Host 'Warning:' $message -ForegroundColor yellow; $this.writeLogFile('warning', $message); } # # Return a info message with green text # $installer | Add-Member -membertype ScriptMethod -name 'info' -value { param([string] $message, [array] $args); Write-Host 'Notice:' $message -ForegroundColor green; $this.writeLogFile('info', $message); } # # Return a output message with wrhite text # $installer | Add-Member -membertype ScriptMethod -name 'output' -value { param([string] $message, [array] $args); Write-Host '' $message -ForegroundColor white; $this.writeLogFile('', $message); } # # Return a debug message with blue text # in case debug mode is enabled # $installer | Add-Member -membertype ScriptMethod -name 'debug' -value { param([string] $message, [array] $args); if ($this.config('debug_mode')) { Write-Host 'Debug:' $message -ForegroundColor blue; $this.writeLogFile('debug', $message); } } # # Initialise certain parts of the # script first # $installer | Add-Member -membertype ScriptMethod -name 'init' -value { $this.setProperty('initialized', $TRUE); # Set the default config dir $this.setProperty('config_dir', (Join-Path -Path $Env:ProgramData -ChildPath 'icinga2\etc\icinga2\')); $this.setProperty('api_dir', (Join-Path -Path $Env:ProgramData -ChildPath 'icinga2\var\lib\icinga2\api')); $this.setProperty('cert_dir', (Join-Path -Path $Env:ProgramData -ChildPath 'icinga2\var\lib\icinga2\certs')); $this.setProperty('icinga_ticket', $this.config('ticket')); $this.setProperty('local_hostname', $this.config('agent_name')); # Ensure we generate the required configuration content $this.generateConfigContent(); } # # We require to run this script as admin. Generate the required function here # We might run this script from a non-privileged user. Ensure we have admin # rights first. Otherwise abort the script. # $installer | Add-Member -membertype ScriptMethod -name 'isAdmin' -value { $identity = [System.Security.Principal.WindowsIdentity]::GetCurrent(); $principal = New-Object System.Security.Principal.WindowsPrincipal($identity); if (-not $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) { throw 'You require to run this script as administrator.'; return $FALSE; } return $TRUE; } # # In case we want to define endpoint configuration (address / port) # we will require to fetch data correctly from a given array # $installer | Add-Member -membertype ScriptMethod -name 'getEndpointConfigurationByArrayIndex' -value { param([int] $currentIndex); # Load the config into a local variable for quicker access [array]$endpoint_config = $this.config('endpoints_config'); # In case no endpoint config is given, we should do nothing if ($endpoint_config -eq $NULL) { return ''; } [string]$configArgument = $endpoint_config[$currentIndex]; [string]$config_string = ''; [array]$configObject = ''; if ($configArgument -ne '') { $configObject = $configArgument.Split(';'); } else { return ''; } # Write the host data from the first array position if ($configObject[0]) { $config_string += [string]::Format(' host = "{0}"', $configObject[0]); } # Write the port data from the second array position if ($configObject[1]) { $config_string += [string]::Format('{0} port = {1}', "`n", $configObject[1]); } # Return the host and possible port configuration for this endpoint return $config_string; } # # Build endpoint hosts and objects based # on configuration # $installer | Add-Member -membertype ScriptMethod -name 'generateEndpointNodes' -value { if ($this.config('parent_endpoints')) { [string]$endpoint_objects = ''; [string]$endpoint_nodes = ''; [int]$endpoint_index = 0; foreach ($endpoint in $this.config('parent_endpoints')) { $endpoint_objects += [string]::Format('object Endpoint "{0}" {1}{2}', $endpoint, '{', "`n"); $endpoint_objects += $this.getEndpointConfigurationByArrayIndex($endpoint_index); $endpoint_objects += [string]::Format('{0}{1}{2}', "`n", '}', "`n"); $endpoint_nodes += [string]::Format('"{0}", ', $endpoint); $endpoint_index += 1; } # Remove the last blank and , from the string if (-Not $endpoint_nodes.length -eq 0) { $endpoint_nodes = $endpoint_nodes.Remove($endpoint_nodes.length - 2, 2); } $this.setProperty('endpoint_nodes', $endpoint_nodes); $this.setProperty('endpoint_objects', $endpoint_objects); $this.setProperty('generate_config', 'true'); } else { $this.setProperty('generate_config', 'false'); } } # # Generate global zones by configuration # $installer | Add-Member -membertype ScriptMethod -name 'generateGlobalZones' -value { # Load all configured global zones [array]$global_zones = $this.config('global_zones'); [string]$zones = ''; # In case no zones are given, simply add director-global if ($global_zones -eq $NULL) { $this.setProperty('global_zones', $zones); return; } # Loop through all given zones and add them to our configuration foreach ($zone in $global_zones) { if ($zone -ne '') { $zones += [string]::Format('object Zone "{0}" {1}{2} global = true{3}{4}{5}', $zone, '{', "`n", "`n", '}', "`n"); } } $this.setProperty('global_zones', $zones); } # # Generate default config values # $installer | Add-Member -membertype ScriptMethod -name 'generateConfigContent' -value { $this.generateEndpointNodes(); $this.generateGlobalZones(); } # # This function will ensure we create a # Web Client object we can use entirely # inside the module to achieve our requirements # $installer | Add-Member -membertype ScriptMethod -name 'createWebClientInstance' -value { param([string]$header, [bool]$directorHeader = $FALSE); [System.Object]$webClient = New-Object System.Net.WebClient; if ($this.config('director_user') -And $this.config('director_password')) { [string]$domain = $null; if ($this.config('director_domain')) { $domain = $this.config('director_domain'); } $webClient.Credentials = New-Object System.Net.NetworkCredential($this.config('director_user'), $this.config('director_password'), $domain); } $webClient.Headers.add('accept', $header); if ($directorHeader) { $webClient.Headers.add('X-Director-Accept', 'text/plain'); } return $webClient; } # # Handle HTTP Requests properly to receive proper status codes in return # $installer | Add-Member -membertype ScriptMethod -name 'createHTTPRequest' -value { param([string]$url, [string]$body, [string]$method, [string]$header, [bool]$directorHeader, [bool]$printExceptionMessage); $httpRequest = [System.Net.HttpWebRequest]::Create($url); $httpRequest.Method = $method; $httpRequest.Accept = $header; $httpRequest.ContentType = 'application/json; charset=utf-8'; if ($directorHeader) { $httpRequest.Headers.Add('X-Director-Accept: text/plain'); } $httpRequest.TimeOut = 6000; # If we are using self-signed certificates for example, the HTTP request will # fail caused by the SSL certificate. With this we can allow even faulty # certificates. This should be used with caution if ($this.config('ignore_ssl_errors')) { [System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true } } if ($this.config('director_user') -And $this.config('director_password')) { [string]$credentials = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes([string]::Format('{0}:{1}', $this.config('director_user'), $this.config('director_password')))); $httpRequest.Headers.add([string]::Format('Authorization: Basic {0}', $credentials)); } # Only send data in case we want to send some data if ($body -ne '') { $transmitBytes = [System.Text.Encoding]::UTF8.GetBytes($body); $httpRequest.ContentLength = $transmitBytes.Length; [System.IO.Stream]$httpOutput = [System.IO.Stream]$httpRequest.GetRequestStream() $httpOutput.Write($transmitBytes, 0, $transmitBytes.Length) $httpOutput.Close() } try { return $this.readResponseStream($httpRequest.GetResponse()); } catch [System.Net.WebException] { if ($printExceptionMessage) { # Print an exception message and the possible body in case we received one # to make troubleshooting easier [string]$errorResponse = $this.readResponseStream($_.Exception.Response); $this.error($_.Exception.Message); if ($errorResponse -ne '') { $this.error($errorResponse); } } $exceptionMessage = $_.Exception.Response; if ($exceptionMessage.StatusCode) { return [int][System.Net.HttpStatusCode]$exceptionMessage.StatusCode; } else { return 900; } } return ''; } # # Read the content of a response and return it's value as a string # $installer | Add-Member -membertype ScriptMethod -name 'readResponseStream' -value { param([System.Object]$response); if ($response) { $responseStream = $response.getResponseStream(); $streamReader = New-Object IO.StreamReader($responseStream); $result = $streamReader.ReadToEnd(); $response.close() $streamReader.close() return $result; } $this.exception('Could not retreive response from remote server. Response is null. This might be caused by SSL errors. Please try using -IgnoreSSLErrors as argument and try again.'); return 'No response from remote server'; } # # Check if the provided result is an HTTP Response code # $installer | Add-Member -membertype ScriptMethod -name 'isHTTPResponseCode' -value { param([string]$httpResult); if ($httpResult.length -eq 3) { return $TRUE; } return $FALSE; } # # Do we require to update the Agent? # Might be disabled by user or current version # is already installed # $installer | Add-Member -membertype ScriptMethod -name 'requireAgentUpdate' -value { if (-Not $this.config('allow_updates') -Or -Not $this.config('agent_version')) { $this.warn('Icinga 2 Agent update installation disabled.'); return $FALSE; } if ($this.getProperty('agent_version') -eq $this.config('agent_version')) { $this.info('Icinga 2 Agent up-to-date. No update required.'); return $FALSE; } $this.info([string]::Format('Current Icinga 2 Agent Version ({0}) is not matching server version ({1}). Downloading new version...'), $this.getProperty('agent_version'), $this.config('agent_version')); return $TRUE; } # # We could try to install the Agent from a local directory # $installer | Add-Member -membertype ScriptMethod -name 'isDownloadPathLocal' -value { if ($this.config('download_url') -And (Test-Path ($this.config('download_url')))) { return $TRUE; } return $FALSE; } # # Download the Icinga 2 Agent Installer from out defined source # $installer | Add-Member -membertype ScriptMethod -name 'downloadInstaller' -value { if (-Not $this.config('agent_version')) { return; } if ($this.isDownloadPathLocal()) { $this.info('Installing Icinga 2 Agent from local directory'); } else { $url = $this.config('download_url') + $this.getProperty('install_msi_package'); $this.info([string]::Format('Downloading Icinga 2 Agent Binary from "{0}"', $url)); Try { [System.Object]$client = New-Object System.Net.WebClient; $client.DownloadFile($url, $this.getInstallerPath()); if (-Not $this.installerExists()) { $this.exception([string]::Format('Unable to locate downloaded Icinga 2 Agent installer file from {0}. Download destination: {1}', $url, $this.getInstallerPath())); } } catch { $this.exception([string]::Format('Unable to download Icinga 2 Agent from {0}. Please ensure the link does exist and access is possible. Error: {1}', $url, $_.Exception.Message)); } } } # # In case we provide a list of hashes to very against # we check them to ensure the package we downloaded # for the Agent installation is allowed to be installed # $installer | Add-Member -membertype ScriptMethod -name 'verifyInstallerChecksumAndThrowException' -value { if (-Not $this.config('installer_hashes')) { $this.warn("Icinga 2 Agent Installer verification disabled."); return; } [string]$installerHash = $this.getInstallerFileHash($this.getInstallerPath()); foreach($hash in $this.config('installer_hashes')) { if ($hash -eq $installerHash) { $this.info('Icinga 2 Agent hash verification successfull.'); return; } } throw 'Failed to verify against any provided installer hash.'; return; } # # Get the SHA1 hash from our uninstaller file # Own function required because Get-FileHash is not # supported by PowerShell Version 2 # $installer | Add-Member -membertype ScriptMethod -name 'getInstallerFileHash' -value { param([string]$filename); [System.Object]$fileInput = New-Object System.IO.FileStream($filename,[System.IO.FileMode]::Open); [System.Object]$hash = New-Object System.Text.StringBuilder; [System.Security.Cryptography.HashAlgorithm]::Create('SHA1').ComputeHash($fileInput) | ForEach-Object { [Void]$hash.Append($_.ToString("x2")); } $fileInput.Close(); return $hash.ToString().ToUpper(); } # # Returns the full path to our installer package # $installer | Add-Member -membertype ScriptMethod -name 'getInstallerPath' -value { if (-Not $this.config('download_url') -Or -Not $this.getProperty('install_msi_package')) { return ''; } [string]$installerPath = ''; if (Test-Path ($this.config('download_url'))) { $installerPath = Join-Path -Path $this.config('download_url') -ChildPath $this.getProperty('install_msi_package'); } else { $installerPath = [string]::Format('{0}/{1}', $this.config('download_url'), $this.getProperty('install_msi_package')); } if ($this.isDownloadPathLocal()) { if (Test-Path $installerPath) { return $installerPath; } else { $this.exception([string]::Format('Failed to locate local Icinga 2 Agent installer at {0}', $installerPath)); return ''; } } else { return (Join-Path -Path $Env:temp -ChildPath $this.getProperty('install_msi_package')); } } # # Verify that the installer package we downloaded # does exist in first place # $installer | Add-Member -membertype ScriptMethod -name 'installerExists' -value { if ($this.getInstallerPath() -And (Test-Path $this.getInstallerPath())) { return $TRUE; } return $FALSE; } # # Get all arguments for the Icinga 2 Agent installer package # $installer | Add-Member -membertype ScriptMethod -name 'getIcingaAgentInstallerArguments' -value { # Initialise some basic variables [string]$arguments = ''; [string]$installerLocation = ''; # By default, install the Icinga 2 Agent again in the pre-installed directory # before the update. Will only apply during updates / downgrades of the Agent if ($this.getProperty('cur_install_dir')) { # In case we perform an architecture change, we should use the new default location as source in case # we have installed the Agent into Program Files (x86) for example but are now using a x64 Agent # which should be installed into Program Files instead if ($this.getProperty('agent_architecture_change') -And $this.getProperty('agent_migration_target')) { $installerLocation = [string]::Format(' INSTALL_ROOT="{0}"', $this.getProperty('agent_migration_target')); } else { $installerLocation = [string]::Format(' INSTALL_ROOT="{0}"', $this.getProperty('cur_install_dir')); } } # However, if we specified a custom directory over the argument, always use that # one as installer target directory if ($this.config('agent_install_directory')) { $installerLocation = [string]::Format(' INSTALL_ROOT="{0}"', $this.config('agent_install_directory')); $this.setProperty('cur_install_dir', $this.config('agent_install_directory')); } $arguments += $installerLocation; return $arguments; } # # Do we require to migrate data from previous Icinga 2 Agent Directory # $installer | Add-Member -membertype ScriptMethod -name 'checkForIcingaMigrationRequirement' -value { if ($this.getProperty('cur_install_dir')) { [string]$installDir = $this.getProperty('cur_install_dir'); # Just in case we installed an x86 Agent on the System, we will require to migrate to x64 on a x64 system. if (${Env:ProgramFiles(x86)} -And $installDir.contains(${Env:ProgramFiles(x86)}) -And $this.getProperty('system_architecture') -eq 'x86_64') { [string]$migrationPath = $installDir.Replace(${Env:ProgramFiles(x86)}, ${Env:ProgramFiles}); $this.setProperty('agent_architecture_change', $TRUE); $this.setProperty('require_migration', $TRUE); $this.setProperty('agent_migration_source', $installDir); $this.setProperty('agent_migration_target', $migrationPath); $this.setProperty('cur_install_dir', $migrationPath); $this.warn('Detected architecture change. Current installed Agent version is x86, while new installed version will be x64. Possible data will be migrated.'); } else { $this.setProperty('agent_migration_source', $this.getProperty('cur_install_dir')); } } if ($this.config('agent_install_directory')) { [string]$currentInstallDir = $this.cutLastSlashFromDirectoryPath($this.getProperty('cur_install_dir')); [string]$intendedInstallDir = $this.cutLastSlashFromDirectoryPath($this.config('agent_install_directory')); if ($currentInstallDir -ne $intendedInstallDir) { $this.setProperty('agent_migration_target', $this.config('agent_install_directory')); $this.setProperty('require_migration', $TRUE); } } } # # To ensure we handle path strings correctly, we always require to cut the last \ # $installer | Add-Member -membertype ScriptMethod -name 'cutLastSlashFromDirectoryPath' -value { param([string]$path); if (-Not $path -Or $path -eq '') { return $path; } if ($path[$path.Length - 1] -eq '\') { $path = $path.Substring(0, $path.Length - 1); } return $path; } # # Install the Icinga 2 agent from the provided installation package # $installer | Add-Member -membertype ScriptMethod -name 'installAgent' -value { $this.downloadInstaller(); if (-Not $this.installerExists()) { $this.exception('Failed to setup Icinga 2 Agent. Installer package not found.'); return; } $this.verifyInstallerChecksumAndThrowException(); $this.info('Installing Icinga 2 Agent'); # Start the installer process $result = $this.startProcess('MsiExec.exe', $TRUE, [string]::Format('/quiet /i "{0}" {1}', $this.getInstallerPath(), $this.getIcingaAgentInstallerArguments())); # Exit Code 0 means the Agent was installed successfully # Otherwise we require to throw an error if ($result.Get_Item('exitcode') -ne 0) { $this.exception('Failed to install Icinga 2 Agent. ' + $result.Get_Item('message')); } else { $this.info('Icinga 2 Agent installed.'); } # Update the Icinga 2 Agent Directories in case of a version change # Required by updating from older versions to 2.8.0. and newer $return = $this.isAgentInstalled(); $this.setProperty('require_restart', 'true'); } # # Updates the Agent in case allowed and required. # Removes previous version of Icinga 2 Agent first # $installer | Add-Member -membertype ScriptMethod -name 'updateAgent' -value { $this.downloadInstaller(); if (-Not $this.installerExists()) { $this.exception('Failed to update Icinga 2 Agent. Installer package not found.'); return; } $this.verifyInstallerChecksumAndThrowException() if (-Not $this.getProperty('uninstall_id')) { $this.exception('Failed to update Icinga 2 Agent. Uninstaller is not specified.'); return; } $this.info('Removing previous Icinga 2 Agent version'); # Start the uninstaller process $result = $this.startProcess('MsiExec.exe', $TRUE, $this.getProperty('uninstall_id') +' /q'); # Exit Code 0 means the Agent was removed successfully # Otherwise we require to throw an error if ($result.Get_Item('exitcode') -ne 0) { $this.exception('Failed to remove Icinga 2 Agent. ' + $result.Get_Item('message')); } else { $this.info('Icinga 2 Agent successfully removed.'); } $this.checkForIcingaMigrationRequirement(); $this.applyPossibleAgentMigration(); $this.info('Installing new Icinga 2 Agent version'); # Start the installer process $result = $this.startProcess('MsiExec.exe', $TRUE, [string]::Format('/quiet /i "{0}" {1}', $this.getInstallerPath(), $this.getIcingaAgentInstallerArguments())); # Exit Code 0 means the Agent was removed successfully # Otherwise we require to throw an error if ($result.Get_Item('exitcode') -ne 0) { $this.exception([string]::Format('Failed to install new Icinga 2 Agent. {0}', $result.Get_Item('message'))); } else { $this.info('Icinga 2 Agent successfully updated.'); } # Update the Icinga 2 Agent Directories in case of a version change # Required by updating from older versions to 2.8.0. and newer $return = $this.isAgentInstalled(); $this.setProperty('require_restart', 'true'); } # # Migrate a folder and it's content from a previous Agent installation to # a new target destination # $installer | Add-Member -membertype ScriptMethod -name 'doMigrateIcingaDirectory' -value { param([string]$sourcePath, [string]$targetPath, [string]$directory); if (Test-Path (Join-Path -Path $sourcePath -ChildPath $directory)) { [string]$source = Join-Path -Path $sourcePath -ChildPath $directory; [string]$target = Join-Path -Path $targetPath -ChildPath $directory; $this.info([string]::Format('Migrating content from "{0}" to "{1}"', $source, $target)); $result = Copy-Item $source $target -Recurse; } } # # Copy a single file from it's source location to our target location # $installer | Add-Member -membertype ScriptMethod -name 'doMigrateIcingaFile' -value { param([string]$sourcePath, [string]$targetPath, [string]$file); $this.info([string]::Format('Migrating file from "{0}" to "{1}\{2}"', $sourcePath, $targetPath, $_)); Copy-Item $sourcePath $targetPath; } # # This function will determine if we require to migrate content from a previous # Icinga 2 Agent installation to the new location # $installer | Add-Member -membertype ScriptMethod -name 'applyPossibleAgentMigration' -value { if (-Not $this.getProperty('require_migration') -Or $this.getProperty('require_migration') -eq $FALSE) { $this.info('No migration of Icinga 2 Agent data required.') return; } $this.info([string]::Format('Icinga 2 Agent installation location changed from {0} to {1}. Migrating possible content...', $this.getProperty('agent_migration_source'), $this.getProperty('agent_migration_target'))); if ($this.getProperty('agent_migration_source') -And (Test-Path ($this.getProperty('agent_migration_source')))) { # Load Directories and Remove \ at the end of the path if present to ensure we have the same path base [string]$sourcePath = $this.cutLastSlashFromDirectoryPath($this.getProperty('agent_migration_source')); [string]$targetPath = $this.cutLastSlashFromDirectoryPath($this.getProperty('agent_migration_target')); # Get all objects within our source root and copy it to our target destination $result = Get-ChildItem -Path $sourcePath | ForEach-Object { if ($_.PSIsContainer) { $this.doMigrateIcingaDirectory($sourcePath, $targetPath, $_); } else { $this.doMigrateIcingaFile($_.FullName, $targetPath, $_); } } $this.info([string]::Format('Migration of source folder applied. Please remove content from previous directory {0} if no longer required.', $sourcePath)); } else { $this.info('No data for migration found. Setup is clean.'); } } # # We might have installed the Icinga 2 Agent # already. In case we do, get all data to # ensure we access the Agent correctly # $installer | Add-Member -membertype ScriptMethod -name 'isAgentInstalled' -value { [string]$architecture = ''; if ([IntPtr]::Size -eq 4) { $architecture = "x86"; $regPath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'; } else { $architecture = "x86_64"; $regPath = @('HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*', 'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'); } # Try locating current Icinga 2 Agent installation $localData = Get-ItemProperty $regPath | .{ process { if ($_.DisplayName) { $_; } } } | Where-Object { $_.DisplayName -eq 'Icinga 2'; } | Select-Object -Property InstallLocation, UninstallString, DisplayVersion; if ($localData.UninstallString) { $this.setProperty('uninstall_id', $localData.UninstallString.Replace("MsiExec.exe ", "")); } $this.setProperty('cur_install_dir', $localData.InstallLocation); $this.setProperty('agent_version', $localData.DisplayVersion); $this.setProperty('install_msi_package', 'Icinga2-v' + $this.config('agent_version') + '-' + $architecture + '.msi'); $this.setProperty('system_architecture', $architecture); $this.setIcinga2AgentVersion($localData.DisplayVersion); if (-Not $this.validateVersions('2.8.0', $this.getProperty('icinga2_agent_version'))) { $this.setProperty('cert_dir', (Join-Path -Path $this.getProperty('config_dir') -ChildPath 'pki')); if ($this.getProperty('use_new_cert_dir')) { $this.setProperty('require_cert_migration', $TRUE); $this.info('You are downgrading from a newer Icinga 2 Version to a older one. This will require a certificate migration.'); } } else { $this.setProperty('cert_dir', (Join-Path -Path $Env:ProgramData -ChildPath 'icinga2\var\lib\icinga2\certs')); $this.setProperty('use_new_cert_dir', $TRUE); } $this.info([string]::Format('Using Icinga version "{0}", setting certificate directory to "{1}"', $localData.DisplayVersion, $this.getProperty('cert_dir') ) ); if ($localData.InstallLocation) { $this.info([string]::Format('Found Icinga 2 Agent version {0} installed at "{1}"', $localData.DisplayVersion, $localData.InstallLocation)); return $TRUE; } else { $this.warn('Icinga 2 Agent does not seem to be installed on the system'); # Set Default value for install dir $this.setProperty('cur_install_dir', (Join-Path $Env:ProgramFiles -ChildPath 'ICINGA2')); } return $FALSE; } # # Ensure we are able to install a firewall rule for the Icinga 2 Agent, # allowing masters and satellites to connect to our local agent # $installer | Add-Member -membertype ScriptMethod -name 'installIcingaAgentFirewallRule' -value { if ($this.config('agent_add_firewall_rule') -eq $FALSE) { $this.warn('Icinga 2 Agent Firewall Rule will not be installed.'); return; } $this.info([string]::Format('Trying to install Icinga 2 Agent Firewall Rule for port {0}', $this.config('agent_listen_port'))); $result = $this.startProcess('netsh', $FALSE, 'advfirewall firewall show rule name="Icinga 2 Agent Inbound by PS-Module"'); if ($result.Get_Item('exitcode') -eq 0) { # Firewall rule is already defined -> delete it and add it again $this.info('Icinga 2 Agent Firewall Rule already installed. Trying to remove it to add it again...'); $result = $this.startProcess('netsh', $TRUE, 'advfirewall firewall delete rule name="Icinga 2 Agent Inbound by PS-Module"'); if ($result.Get_Item('exitcode') -ne 0) { $this.error([string]::Format('Failed to remove Icinga 2 Agent Firewall rule before adding it again: {0}', $result.Get_Item('message'))); return; } else { $this.info('Icinga 2 Agent Firewall Rule has been removed. Re-Adding now...'); } } [string]$binaryPath = Join-Path $this.getInstallPath() -ChildPath 'sbin\icinga2.exe'; [string]$argument = 'advfirewall firewall add rule' $argument += [string]::Format(' dir=in action=allow program="{0}"', $binaryPath); $argument += ' name="Icinga 2 Agent Inbound by PS-Module"'; $argument += ' description="Inbound Firewall Rule to allow Icinga 2 masters/satellites to connect to the Icinga 2 Agent installed on this system."'; $argument += ' enable=yes'; $argument += ' remoteip=any'; $argument += ' localip=any'; $argument += [string]::Format(' localport={0}', $this.config('agent_listen_port')); $argument += ' protocol=tcp'; $result = $this.startProcess('netsh', $FALSE, $argument); if ($result.Get_Item('exitcode') -ne 0) { # Firewall rule was not added -> print error $this.error([string]::Format('Failed to install Icinga 2 Agent Firewall: {0}', $result.Get_Item('message'))); return; } $this.info([string]::Format('Icinga 2 Agent Firewall Rule successfully installed for port {0}', $this.config('agent_listen_port'))); } # # Get the default path or our custom path for the NSClient++ # $installer | Add-Member -membertype ScriptMethod -name 'getNSClientDefaultExecutablePath' -value { if ($this.config('nsclient_directory')) { return (Join-Path -Path $this.config('nsclient_directory') -ChildPath 'nscp.exe'); } if (Test-Path ('C:\Program Files\NSClient++\nscp.exe')) { return 'C:\Program Files\NSClient++\nscp.exe'; } if (Test-Path ('C:\Program Files (x86)\NSClient++\nscp.exe')) { return 'C:\Program Files (x86)\NSClient++\nscp.exe'; } return ''; } # # In case have the Agent already installed # We might use a different installation path # for the Agent. This function will return # the correct, valid installation path # $installer | Add-Member -membertype ScriptMethod -name 'getInstallPath' -value { [string]$agentPath = ''; if ($this.getProperty('cur_install_dir')) { $agentPath = $this.getProperty('cur_install_dir'); } return $agentPath; } # # In case we installed the agent freshly we # require to change configuration once we # would like to use the Director properly # This function will simply do a backup # of the icinga2.conf, ensuring we can # use them later again # $installer | Add-Member -membertype ScriptMethod -name 'backupDefaultConfig' -value { [string]$configFile = Join-Path -Path $this.getProperty('config_dir') -ChildPath 'icinga2.conf'; [string]$configBackupFile = $configFile + 'director.bak'; # Check if a config and backup file already exists # Only procceed with backup of the current config if no backup was found if (Test-Path $configFile) { if (-Not (Test-Path $configBackupFile)) { Rename-Item $configFile $configBackupFile; $this.info('Icinga 2 configuration backup successfull'); } else { $this.warn('Default icinga2.conf backup detected. Skipping backup'); } } } # # Allow us to restart the Icinga 2 Agent # $installer | Add-Member -membertype ScriptMethod -name 'cleanupAgentInstaller' -value { if (-Not ($this.isDownloadPathLocal())) { if ($this.getInstallerPath() -And (Test-Path $this.getInstallerPath())) { $this.info('Removing downloaded Icinga 2 Agent installer'); Remove-Item $this.getInstallerPath() | Out-Null; } } } # # Get Api directory if Icinga 2 # $installer | Add-Member -membertype ScriptMethod -name 'getApiDirectory' -value { return $this.getProperty('api_dir'); } # # Should we remove the Api directory content # from the Agent? Can be defined by setting the # -RemoveApiDirectory argument of the function builder # $installer | Add-Member -membertype ScriptMethod -name 'shouldFlushIcingaApiDirectory' -value { return $this.config('flush_api_directory'); } # # Flush all content from the Icinga 2 Agent # Api directory, but keep the folder structure # $installer | Add-Member -membertype ScriptMethod -name 'flushIcingaApiDirectory' -value { if ((Test-Path $this.getApiDirectory()) -And $this.shouldFlushIcingaApiDirectory()) { $this.info([string]::Format('Flushing content of "{0}"', $this.getApiDirectory())); $this.stopIcingaService(); [System.Object]$folder = New-Object -ComObject Scripting.FileSystemObject; $folder.DeleteFolder($this.getApiDirectory()); $this.setProperty('require_restart', 'true'); } } # # Modify the user the Icinga services is running with # $installer | Add-Member -membertype ScriptMethod -name 'modifyIcingaServiceUser' -value { # If no user is specified -> do nothing if ($this.config('icinga_service_user') -eq '') { return; } [System.Object]$currentUser = Get-WMIObject win32_service -Filter "Name='icinga2'"; [string]$credentials = $this.config('icinga_service_user'); [string]$newUser = ''; [string]$password = ''; if ($currentUser -eq $null) { $this.warn('Unable to modify Icinga service user: Service not found.'); return; } # Check if we defined user name and password (':' cannot appear within a username) # If so split them into seperate variables, otherwise simply use the string as user if ($credentials.Contains(':')) { [int]$delimeter = $credentials.IndexOf(':'); $newUser = $credentials.Substring(0, $delimeter); $password = [string]::Format(' password= {0}', $credentials.Substring($delimeter + 1, $credentials.Length - 1 - $delimeter)); } else { $newUser = $credentials; } # If the user's are identical -> do nothing if ($currentUser.StartName -eq $newUser) { $this.info('Icinga user was not modified. Source and target service user are identical.'); return; } # Try to update the service name and return an error in case of a failure # In the error case we do not have to deal with cleanup, as no change was made anyway $this.info([string]::Format('Updating Icinga 2 service user to {0}', $newUser)); $result = $this.startProcess('sc.exe', $TRUE, [string]::Format('config icinga2 obj= "{0}"{1}', $newUser, $password)); if ($result.Get_Item('exitcode') -ne 0) { $this.error($result.Get_Item('message')); return; } # Just write the success message $this.info($result.Get_Item('message')); # Try to restart the service $result = $this.restartService('icinga2'); # In case of an error try to rollback to the previous assigned user of the service # If this fails aswell, set the user to 'NT AUTHORITY\NetworkService' and restart the service to # ensure that the agent is atleast running and collecting some data. # Of course we throw plenty of errors to notify the user about problems if ($result.Get_Item('exitcode') -ne 0) { $this.error($result.Get_Item('message')); $this.info([string]::Format('Reseting user to previous working user {0}', $currentUser.StartName)); $result = $this.startProcess('sc.exe', $TRUE, [string]::Format('config icinga2 obj= "{0}"{1}', $currentUser.StartName, $password)); $result = $this.restartService('icinga2'); if ($result.Get_Item('exitcode') -ne 0) { $this.error([string]::Format('Failed to reset Icinga 2 service user to the previous user "{0}". Setting user to "NT AUTHORITY\NetworkService" now to ensure the service integrity', $currentUser.StartName)); $result = $this.startProcess('sc.exe', $TRUE, 'config icinga2 obj= "NT AUTHORITY\NetworkService" password=dummy'); $this.info($result.Get_Item('message')); $result = $this.restartService('icinga2'); if ($result.Get_Item('exitcode') -eq 0) { $this.info('Reseting Icinga 2 service user to "NT AUTHORITY\NetworkService" successfull.'); return; } else { $this.error([string]::Format('Failed to rollback Icinga 2 service user to "NT AUTHORITY\NetworkService": {0}', $result.Get_Item('message'))); return; } } } $this.info('Icinga 2 service is running'); } # # Function to make restart of services easier # $installer | Add-Member -membertype ScriptMethod -name 'restartService' -value { param([string]$service); $this.info([string]::Format('Restarting service {0}', $service)); # Stop the current service $result = $this.startProcess("sc.exe", $TRUE, "stop $service"); # Wait until the service is stopped $serviceResult = $this.waitForServiceToReachState($service, 'Stopped'); # Start the service again $result = $this.startProcess("sc.exe", $TRUE, "start $service"); # Wait until the service is started if ($this.waitForServiceToReachState($service, 'Running') -eq $FALSE) { $result.Set_Item('message', [string]::Format('Failed to restart service {0}.', $service)); $result.Set_Item('exitcode', '1'); } return $result; } # # Function to stop the Icinga 2 service # $installer | Add-Member -membertype ScriptMethod -name 'stopIcingaService' -value { # Stop the Icinga 2 Service $this.info('Stopping the Icinga 2 Service...') $result = $this.startProcess("sc.exe", $TRUE, "stop icinga2"); # Wait until the service is stopped $serviceResult = $this.waitForServiceToReachState('icinga2', 'Stopped'); $this.info('Icinga 2 service has been stopped.') } # # This function will wait for a specific service until it reaches # the defined state. Will break after 20 seconds with an error message # $installer | Add-Member -membertype ScriptMethod -name 'waitForServiceToReachState' -value { param([string]$service, [string]$state); [int]$counter = 0; # Wait until the service reached the desired state while ($TRUE) { # Get the current state of the service $serviceState = (Get-WMIObject win32_service -Filter "Name='$service'").State; if ($serviceState -eq $state) { break; } # Sleep a little to prevent crushing the CPU Start-Sleep -Milliseconds 100; $counter += 1; # After 20 seconds break with an error. It look's like the service does not respond if ($counter -gt 200) { $this.error([string]::Format('Timeout reached while waiting for "{0}" to reach state "{1}". Service is not responding.', $service, $state)); return $FALSE; } } # Wait one second and check the status again to ensure it remains within it's state Start-Sleep -Seconds 1; if ($state -ne (Get-WMIObject win32_service -Filter "Name='$service'").State) { return $FALSE; } return $TRUE; } # # Function to start processes and wait for their exit # Will return a dictionary with results (message, error, exitcode) # $installer | Add-Member -membertype ScriptMethod -name 'startProcess' -value { param([string]$executable, [bool]$flushNewLines, [string]$arguments); $processData = New-Object System.Diagnostics.ProcessStartInfo; $processData.FileName = $executable; $processData.RedirectStandardError = $true; $processData.RedirectStandardOutput = $true; $processData.UseShellExecute = $false; $processData.Arguments = $arguments; $process = New-Object System.Diagnostics.Process; $process.StartInfo = $processData; $process.Start() | Out-Null; $stdout = $process.StandardOutput.ReadToEnd(); $stderr = $process.StandardError.ReadToEnd(); $process.WaitForExit(); if ($flushNewLines) { $stdout = $stdout.Replace("`n", '').Replace("`r", ''); $stderr = $stderr.Replace("`n", '').Replace("`r", ''); } else { if ($stdout.Contains("`n")) { $stdout = $stdout.Substring(0, $stdout.LastIndexOf("`n")); } } $result = @{}; $result.Add('message', $stdout); $result.Add('error', $stderr); $result.Add('exitcode', $process.ExitCode); return $result; } # # Restart the Icinga 2 service and get the # result if the restart failed or everything # worked as expected # $installer | Add-Member -membertype ScriptMethod -name 'restartAgent' -value { $result = $this.restartService('icinga2'); if ($result.Get_Item('exitcode') -eq 0) { $this.info('Icinga 2 Agent successfully restarted.'); $this.setProperty('require_restart', ''); } else { $this.error($result.Get_Item('message')); } } # # This function will determine if and how we create the # API-Listener configuration # $installer | Add-Member -membertype ScriptMethod -name 'getApiListenerConfiguration' -value { if (-Not $this.hasCertificates() -And -Not $this.getProperty('certs_created')) { $this.warn('Configuring Icinga 2 Agent without ApiListener, as certificates have not been generated.'); return [string]::Format('{0}/* ApiListener has not been configured, as certificates have not been generated. */', "`n`n"); } [string]$apiListenerConfig = ''; [string]$certificateConfig = ''; # Icinga 2 Agent Versions below 2.8.0 will require cert_path, key_path and ca_path if (-Not $this.validateVersions('2.8.0', $this.getProperty('icinga2_agent_version'))) { $certificateConfig = ' cert_path = SysconfDir + "/icinga2/pki/' + $this.getProperty('local_hostname') + '.crt" key_path = SysconfDir + "/icinga2/pki/' + $this.getProperty('local_hostname') + '.key" ca_path = SysconfDir + "/icinga2/pki/ca.crt"'; } $apiListenerConfig = ' object ApiListener "api" {' + $certificateConfig + ' accept_commands = true accept_config = ' + $this.convertBoolToString($this.config('accept_config')) + ' bind_host = "::" bind_port = ' + [int]$this.config('agent_listen_port') + ' }'; return $apiListenerConfig; } # # Generate the new configuration for Icinga 2 # $installer | Add-Member -membertype ScriptMethod -name 'generateIcingaConfiguration' -value { if ($this.getProperty('generate_config') -eq 'true') { $this.checkConfigInputParametersAndThrowException(); [string]$icingaCurrentConfig = ''; if (Test-Path $this.getIcingaConfigFile()) { $icingaCurrentConfig = [System.IO.File]::ReadAllText($this.getIcingaConfigFile()); } [string]$icingaNewConfig = '/** * Icinga 2 Config - Proposed by Icinga 2 PowerShell Module */ /* Define our includes to run the agent properly. */ include "constants.conf" include include include include /* Required for Icinga 2.8.0 and above */ const NodeName = "' + $this.getProperty('local_hostname') + '" /* Define our block required to enable or disable Icinga 2 debug log * Enable or disable it by using the PowerShell Module with * argument -IcingaEnableDebugLog or by switching * PowerShellIcinga2EnableDebug to true or false manually. * true: Debug log is active * false: Debug log is deactivated * IMPORTANT: ";" after true or false has to remain to allow the * PowerShell Module to switch this feature on or off. */ const PowerShellIcinga2EnableDebug = false; const PowerShellIcinga2EnableLog = true; if (PowerShellIcinga2EnableDebug) { object FileLogger "debug-file" { severity = "debug" path = LocalStateDir + "/log/icinga2/debug.log" } } /* Try to define a constant for our NSClient++ installation * IMPORTANT: If the NSClient++ is installed newly to the system, the * Icinga Service has to be restarted in order to set this variable * correctly. If the NSClient++ is installed over the PowerShell Module, * the Icinga 2 Service is restarted automaticly. */ if (!globals.contains("NscpPath")) { NscpPath = dirname(msi_get_component_path("{5C45463A-4AE9-4325-96DB-6E239C034F93}")) } /* Enable our default main logger feature to write log output. */ if (PowerShellIcinga2EnableLog) { object FileLogger "main-log" { severity = "information" path = LocalStateDir + "/log/icinga2/icinga2.log" } } /* All informations required to correctly connect to our parent Icinga 2 nodes. */ object Endpoint "' + $this.getProperty('local_hostname') + '" {} ' + $this.getProperty('endpoint_objects') + ' /* Define the zone and its containing endpoints we should communicate with. */ object Zone "' + $this.config('parent_zone') + '" { endpoints = [ ' + $this.getProperty('endpoint_nodes') +' ] } /* All of our global zones, check commands and other configuration are synced into. * Director global zone must be defined in case the Icinga Director is beeing used. * Default value for this is "director-global". * All additional zones can be configured with -GlobalZones argument. * IMPORTANT: If -GlobalZones argument is used, the Icinga Director global zones has * to be defined as well within the argument array. */ ' + $this.getProperty('global_zones') + ' /* Define a zone for our current agent and set our parent zone for proper communication. */ object Zone "' + $this.getProperty('local_hostname') + '" { parent = "' + $this.config('parent_zone') + '" endpoints = [ "' + $this.getProperty('local_hostname') + '" ] } /* Configure all settings we require for our API listener to properly work. * This will include the certificates, if we accept configurations which * can be changed with argument -AcceptConfig and the bind informations. * The bind_port can be modified with argument -AgentListenPort. */' + $this.getApiListenerConfiguration(); $this.setProperty('new_icinga_config', $icingaNewConfig); $this.setProperty('old_icinga_config', $icingaCurrentConfig); } } # # Generate a hash for old and new config # and determine if the configuration has changed # $installer | Add-Member -membertype ScriptMethod -name 'hasConfigChanged' -value { if ($this.getProperty('generate_config') -eq 'false') { return $FALSE; } if (-Not $this.getProperty('new_icinga_config')) { throw 'New Icinga 2 configuration not generated. Please call "generateIcingaConfiguration" before.'; } [string]$oldConfigHash = $this.getHashFromString($this.getProperty('old_icinga_config')); [string]$newConfigHash = $this.getHashFromString($this.getProperty('new_icinga_config')); $this.debug([string]::Format('Old Config Hash: "{0}" New Hash: "{1}"', $oldConfigHash, $newConfigHash)); if ($oldConfigHash -eq $newConfigHash) { return $FALSE; } return $TRUE; } # # Generate a SHA1 Hash from a provided string # $installer | Add-Member -membertype ScriptMethod -name 'getHashFromString' -value { param([string]$text); [System.Object]$algorithm = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider; $hash = [System.Text.Encoding]::UTF8.GetBytes($text); $hashInBytes = $algorithm.ComputeHash($hash); [string]$result = ''; foreach($byte in $hashInBytes) { $result += $byte.ToString(); } return $result; } # # Return the path to the Icinga 2 config file # $installer | Add-Member -membertype ScriptMethod -name 'getIcingaConfigFile' -value { return (Join-Path -Path $this.getProperty('config_dir') -ChildPath 'icinga2.conf'); } # # Create Icinga 2 configuration file based # on Director settings # $installer | Add-Member -membertype ScriptMethod -name 'writeConfig' -value { param([string]$configData); if (-Not (Test-Path $this.getProperty('config_dir'))) { $this.warn('Unable to write Icinga 2 configuration. The required directory was not found. Possibly the Icinga 2 Agent is not installed.'); return; } # Write new configuration to file $this.info([string]::Format('Writing icinga2.conf to "{0}"', $this.getProperty('config_dir'))); [System.IO.File]::WriteAllText($this.getIcingaConfigFile(), $configData); $this.setProperty('require_restart', 'true'); } # # Write old coniguration again # just in case we received errors # $installer | Add-Member -membertype ScriptMethod -name 'rollbackConfig' -value { # Write new configuration to file $this.info([string]::Format('Rolling back previous icinga2.conf to "{0}"', $this.getProperty('config_dir'))); [System.IO.File]::WriteAllText($this.getIcingaConfigFile(), $this.getProperty('old_icinga_config')); $this.setProperty('require_restart', 'true'); } # # Provide a result of an operation (string) and # the intended match value. In case every was # ok, the function will return an info message # with the result. Otherwise it will thrown an # exception # $installer | Add-Member -membertype ScriptMethod -name 'printResultOkOrException' -value { param([string]$result, [string]$expected); if ($result -And $expected) { if (-Not ($result -Like $expected)) { throw $result; } else { $this.info($result); } } elseif ($result) { $this.info($result); } } # # Create Host-Certificates for Icinga 2 # $installer | Add-Member -membertype ScriptMethod -name 'createHostCertificates' -value { param([string]$hostname, [string]$certDir); $this.info('Generating Host certificates required by Icinga 2'); [string]$icingaBinary = Join-Path -Path $this.getInstallPath() -ChildPath 'sbin\icinga2.exe'; $result = $this.startProcess($icingaBinary, $FALSE, [string]::Format('pki new-cert --cn {0} --key {1}{0}.key --cert {1}{0}.crt', $hostname, $certDir ) ); if ($result.Get_Item('exitcode') -ne 0) { throw $result.Get_Item('message'); } $this.info($result.Get_Item('message')); } # # Fix certificate naming for upper / lower case changes # $installer | Add-Member -membertype ScriptMethod -name 'fixCertificateNames' -value { param([string]$hostname, [string]$certDir); # Rename the certificates to apply possible upper / lower case naming changes # which is not done by Windows by default Move-Item (Join-Path -Path $certDir -ChildPath ($hostname + '.key')) (Join-Path -Path $certDir -ChildPath ($hostname + '.key')) Move-Item (Join-Path -Path $certDir -ChildPath ($hostname + '.crt')) (Join-Path -Path $certDir -ChildPath ($hostname + '.crt')) } # # Generate the Icinga 2 SSL certificate to ensure the communication between the # Agent and the Master can be established in first place # $installer | Add-Member -membertype ScriptMethod -name 'generateCertificates' -value { [string]$icingaCertDir = Join-Path $this.getProperty('cert_dir') -ChildPath '\'; [string]$icingaBinary = Join-Path -Path $this.getInstallPath() -ChildPath 'sbin\icinga2.exe'; [string]$agentName = $this.getProperty('local_hostname'); if (-Not (Test-Path $icingaBinary)) { $this.warn('Unable to generate Icinga 2 certificates. Icinga 2 executable not found. It looks like the Icinga 2 Agent is not installed.'); return; } if (-Not $this.getProperty('local_hostname')) { $this.info('Skipping function for generating certificates, as hostname is not specified within the module.'); return; } # Handling for Icinga 2.8.0 and above: CA-Proxy support if ($this.config('caproxy')) { if (-Not $this.validateVersions('2.8.0', $this.getProperty('icinga2_agent_version'))) { throw 'The argument "-CAProxy" is only supported by Icinga Version 2.8.0 and above.'; return; } if (-Not $this.config('ca_certificate_path')) { throw 'You will require to specify a source path of your CA certificate with -CACertificatePath in order to use CA proxy certificate generation.'; } # Generate the certificate [string]$caDestPath = (Join-Path $icingaCertDir -ChildPath '\ca.crt'); $this.createHostCertificates($agentName, $icingaCertDir); $this.fixCertificateNames($agentName, $icingaCertDir); $this.setProperty('require_restart', 'true'); $this.info('Your host certificate has been generated. Please review the request on your Icinga CA with "icinga2 ca list" and sign it with "icinga2 ca sign ".'); $this.info([string]::Format('Trying to copy your specified CA certificate "{0}" to "{1}".', $this.config('ca_certificate_path'), $caDestPath )); if (-Not (Test-Path $this.config('ca_certificate_path'))) { throw [string]::Format('Failed to copy your CA certificate from "{0}" to "{1}". Your source destination does not exist.', $this.config('ca_certificate_path'), $caDestPath ); return; } Copy-Item $this.config('ca_certificate_path') $caDestPath; $this.setProperty('certs_created', $TRUE); return; } if ($this.config('ca_server') -And $this.getProperty('icinga_ticket')) { # Generate the certificate $this.createHostCertificates($agentName, $icingaCertDir); # Save Certificate $this.info("Storing Icinga 2 certificates"); $result = $this.startProcess($icingaBinary, $FALSE, [string]::Format('pki save-cert --key {0}{1}.key --trustedcert {0}trusted-master.crt --host {2}', $icingaCertDir, $agentName, $this.config('ca_server') ) ); if ($result.Get_Item('exitcode') -ne 0) { throw $result.Get_Item('message'); } $this.info($result.Get_Item('message')); # Validate if set against a given fingerprint for the CA if (-Not $this.validateCertificate([string]::Format('{0}trusted-master.crt', $icingaCertDir))) { throw 'Failed to validate against CA authority'; } # Request certificate $this.info("Requesting Icinga 2 certificates"); $result = $this.startProcess($icingaBinary, $FALSE, [string]::Format('pki request --host {0} --port {1} --ticket {2} --key {3}{4}.key --cert {3}{4}.crt --trustedcert {3}trusted-master.crt --ca {3}ca.crt', $this.config('ca_server'), $this.config('ca_port'), $this.getProperty('icinga_ticket'), $icingaCertDir, $agentName ) ); if ($result.Get_Item('exitcode') -ne 0) { if ($this.getProperty('agent_name_change')) { $this.exception('You have changed the naming of the Agent (upper / lower case) and therefor your certificates are no longer valid. Certificate generation failed because of a possible wrong ticket. Please ensure to set the "hostname" within the Icinga 2 configuration correctly and re-run this script.'); } throw $result.Get_Item('message'); } $this.info($result.Get_Item('message')); $this.fixCertificateNames($agentName, $icingaCertDir); $this.setProperty('require_restart', 'true'); $this.setProperty('certs_created', $TRUE); } else { $this.info('Skipping certificate generation. One or more of the following arguments is not set: -CAServer -Ticket '); } } # # Validate against a given fingerprint if we are connected to the correct CA # $installer | Add-Member -membertype ScriptMethod -name 'validateCertificate' -value { param([string] $certificate); [System.Object]$certFingerprint = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2; $certFingerprint.Import($certificate); $this.info([string]::Format('Certificate fingerprint: "{0}"', $certFingerprint.Thumbprint)); if ($this.config('ca_fingerprint')) { if (-Not ($this.config('ca_fingerprint') -eq $certFingerprint.Thumbprint)) { $this.error([string]::Format('CA fingerprint does not match! Expected: "{0}", given: "{1}"', $certFingerprint.Thumbprint, $this.config('ca_fingerprint') ) ); return $FALSE; } else { $this.info('CA fingerprint validation successfull'); return $TRUE; } } $this.warn('CA fingerprint validation disabled'); return $TRUE; } # # In case we migrate from an Icinga 2 Version with the new certificate path to # a version with the old one, we require to migrate the certificates # $installer | Add-Member -membertype ScriptMethod -name 'migrateCertificates' -value { if (-Not $this.getProperty('require_cert_migration')) { return; } [string]$agentName = $this.getProperty('local_hostname'); [string]$caPath = Join-Path -Path $Env:ProgramData -ChildPath 'icinga2\var\lib\icinga2\certs\ca.crt'; [string]$newCA = Join-Path -Path $this.getProperty('config_dir') -ChildPath 'pki\ca.crt'; [string]$certPath = Join-Path -Path $Env:ProgramData -ChildPath ([string]::Format('icinga2\var\lib\icinga2\certs\{0}.crt', $agentName)); [string]$newCertPath = Join-Path -Path $this.getProperty('config_dir') -ChildPath ([string]::Format('pki\{0}.crt', $agentName)); [string]$keyPath = Join-Path -Path $Env:ProgramData -ChildPath ([string]::Format('icinga2\var\lib\icinga2\certs\{0}.key', $agentName)); [string]$newKeyPath = Join-Path -Path $this.getProperty('config_dir') -ChildPath ([string]::Format('pki\{0}.key', $agentName)); if (Test-Path $caPath) { Copy-Item $caPath $newCA; $this.info([string]::Format('Migrating ca.crt from "{0}" to "{1}".', $caPath, $newCA)); } if (Test-Path $certPath) { Copy-Item $certPath $newCertPath; $this.info([string]::Format('Migrating {0}.crt from "{1}" to "{2}".', $agentName, $certPath, $newCertPath)); } if (Test-Path $keyPath) { Copy-Item $keyPath $newKeyPath; $this.info([string]::Format('Migrating {0}.crt from "{1}" to "{2}".', $agentName, $keyPath, $newKeyPath)); } } # # Check the Icinga install directory and determine # if the certificates are both available for the # Agent. If not, return FALSE # $installer | Add-Member -membertype ScriptMethod -name 'hasCertificates' -value { [string]$icingaCertDir = Join-Path -Path $this.getProperty('cert_dir') -ChildPath '\'; [string]$agentName = $this.getProperty('local_hostname'); [bool]$filesExist = $FALSE; # First check if the files in generell exist if ( ((Test-Path ((Join-Path -Path $icingaCertDir -ChildPath $agentName) + '.key'))) ` -And (Test-Path ((Join-Path -Path $icingaCertDir -ChildPath $agentName) + '.crt')) ` -And (Test-Path (Join-Path -Path $icingaCertDir -ChildPath 'ca.crt')) ) { $filesExist = $TRUE; } # In case they do, check if the characters (upper / lowercase) are matching as well if ($filesExist -eq $TRUE) { [string]$hostCRT = [string]::Format('{0}.crt', $agentName); [string]$hostKEY = [string]::Format('{0}.key', $agentName); # Get all files inside your certificate directory $certificates = Get-ChildItem -Path $icingaCertDir; # Now loop each file and match their name with our hostname foreach ($cert in $certificates) { if ($cert.Name.toLower() -eq $hostCRT.toLower() -Or $cert.Name.toLower() -eq $hostKEY.toLower()) { $file = $cert.Name.Replace('.key', '').Replace('.crt', ''); if (-Not ($file -clike $agentName)) { $this.warn([string]::Format('Certificate file {0} is not matching the hostname {1}. Certificate generation is required.', $cert.Name, $agentName)); $this.setProperty('agent_name_change', $true); return $FALSE; } } } } return $filesExist; } # # Have we passed an argument to force # the creation of the certificates? # $installer | Add-Member -membertype ScriptMethod -name 'forceCertificateGeneration' -value { return $this.config('force_cert'); } # # Is the current Agent the version # we would like to install? # $installer | Add-Member -membertype ScriptMethod -name 'isAgentUpToDate' -value { if ($this.canInstallAgent() -And $this.getProperty('agent_version') -eq $this.config('agent_version')) { return $TRUE; } return $FALSE; } # # Print a message telling us the installed # and intended version of the Agent # $installer | Add-Member -membertype ScriptMethod -name 'printAgentUpdateMessage' -value { $this.info([string]::Format('Current Icinga 2 Agent Version ({0}) is not matching intended version ({1}). Downloading new version...', $this.getProperty('agent_version'), $this.config('agent_version') ) ); } # # Do we allow Agent updates / downgrades? # $installer | Add-Member -membertype ScriptMethod -name 'allowAgentUpdates' -value { return $this.config('allow_updates'); } # # Have we specified a version to install the Agent? # $installer | Add-Member -membertype ScriptMethod -name 'canInstallAgent' -value { if ($this.config('download_url') -And $this.config('agent_version')) { return $TRUE; } if (-Not $this.config('download_url') -And -Not $this.config('agent_version')) { $this.warn('Icinga 2 Agent will not be installed. Arguments -DownloadUrl and -InstallAgentVersion both not defined.'); return $FALSE; } if (-Not $this.config('agent_version')) { $this.warn('Icinga 2 Agent will not be installed. Argument -InstallAgentVersion is not defined.'); return $FALSE; } if (-Not $this.config('download_url')) { $this.warn('Icinga 2 Agent will not be installed. Argument -DownloadUrl is not defined.'); return $FALSE; } return $FALSE; } # # Check if all required arguments for writing a valid # configuration are set # $installer | Add-Member -membertype ScriptMethod -name 'checkConfigInputParametersAndThrowException' -value { if (-Not $this.getProperty('local_hostname')) { throw 'Argument -AgentName required for config generation.'; } if (-Not $this.config('parent_zone')) { throw 'Argument -ParentZone required for config generation.'; } if (-Not $this.getProperty('endpoint_nodes') -Or -Not $this.getProperty('endpoint_objects')) { throw 'Argument -Endpoints requires atleast one defined endpoint.'; } } # # Execute a check with Icinga2 daemon -C # to ensure the configuration is valid # $installer | Add-Member -membertype ScriptMethod -name 'isIcingaConfigValid' -value { param([bool] $checkInternal = $TRUE); if (-Not $this.config('parent_zone') -And $checkInternal) { throw 'Parent Zone not defined. Please specify it with -ParentZone '; } $icingaBinary = Join-Path -Path $this.getInstallPath() -ChildPath 'sbin\icinga2.exe'; if (Test-Path $icingaBinary) { $result = $this.startProcess($icingaBinary, $FALSE, 'daemon -C'); if ($result.Get_Item('exitcode') -ne 0) { $this.error($result.Get_Item('message')); return $FALSE; } } else { $this.warn('Icinga 2 config validation not possible. Icinga 2 executable not found. Possibly the Agent is not installed.'); } return $TRUE; } # # Returns true or false, depending # if any changes were made requiring # the Icinga 2 Agent to become restarted # $installer | Add-Member -membertype ScriptMethod -name 'madeChanges' -value { return $this.getProperty('require_restart'); } # # Apply possible configuration changes to # our Icinga 2 Agent # $installer | Add-Member -membertype ScriptMethod -name 'applyPossibleConfigChanges' -value { if ($this.hasConfigChanged() -And $this.getProperty('generate_config') -eq 'true') { $this.backupDefaultConfig(); $this.writeConfig($this.getProperty('new_icinga_config')); # Check if the config is valid and rollback otherwise if (-Not $this.isIcingaConfigValid()) { $this.error('Icinga 2 config validation failed. Rolling back to previous version.'); if (-Not $this.hasCertificates()) { $this.error('Icinga 2 certificates not found. Please generate the certificates over this module or add them manually.'); } $this.rollbackConfig(); if ($this.isIcingaConfigValid($FALSE)) { $this.info('Rollback of Icinga 2 configuration successfull.'); } else { throw 'Icinga 2 config rollback failed. Please check the icinga2.log'; } } else { $this.info('Icinga 2 configuration check successfull.'); } } else { # Throw an exception in case we use a parent zone which is a global zone foreach ($zone in $this.config('global_zones')) { if ($zone -eq $this.config('parent_zone')) { $this.exception([string]::Format('The zone specified for the Icinga 2 Agent to connect to is set to "{0}". This is a global zone which cannot be used. Please review either your arguments used for this module or the Host-Template within the Icinga Director to use the correct zone for this Agent.', $this.config('parent_zone'))); } } # In case no parent endpoints are configured, print a warning as we can't write valid Icinga 2 configuration if (-Not $this.config('parent_endpoints')) { $this.warn('No parent endpoints have been defined within the module call. Either specify them by using the "-ParentEndpoints" argument or ensure you configured your Icinga Director properly in case you are using the Self-Service API. Icinga2.conf has not been generated.'); } $this.info('icinga2.conf did not change or required parameters not set. Nothing to do'); } } # # Enable or disable the Icinga 2 debug log # $installer | Add-Member -membertype ScriptMethod -name 'switchIcingaLogging' -value { # In case the config is not valid -> do nothing if (-Not $this.isIcingaConfigValid($FALSE)) { throw 'Unable to process Icinga 2 debug configuration. The icinga2.conf is corrupt! Please check the icinga2.log'; } # If there is no config file defined -> do nothing if (-Not (Test-Path $this.getIcingaConfigFile())) { return; } [string]$icingaCurrentConfig = [System.IO.File]::ReadAllText($this.getIcingaConfigFile()); [string]$newIcingaConfig = $icingaCurrentConfig; if ($this.config('icinga_enable_debug_log')) { $this.info('Trying to enable debug log for Icinga 2...'); if ($newIcingaConfig.Contains('const PowerShellIcinga2EnableDebug = false;')) { $newIcingaConfig = $newIcingaConfig.Replace('const PowerShellIcinga2EnableDebug = false;', 'const PowerShellIcinga2EnableDebug = true;'); $this.info('Icinga 2 debug log has been enabled'); } else { $this.info('Icinga 2 debug log is already enabled or configuration not found'); } } else { $this.info('Trying to disable debug log for Icinga 2...'); if ($newIcingaConfig.Contains('const PowerShellIcinga2EnableDebug = true;')) { $newIcingaConfig = $newIcingaConfig.Replace('const PowerShellIcinga2EnableDebug = true;', 'const PowerShellIcinga2EnableDebug = false;'); $this.info('Icinga 2 debug log has been disabled'); } else { $this.info('Icinga 2 debug log is not enabled or configuration not found'); } } if ($this.config('icinga_disable_log') -eq $FALSE) { $this.info('Trying to enable logging for Icinga 2...'); if ($newIcingaConfig.Contains('const PowerShellIcinga2EnableLog = false;')) { $newIcingaConfig = $newIcingaConfig.Replace('const PowerShellIcinga2EnableLog = false;', 'const PowerShellIcinga2EnableLog = true;'); $this.info('Icinga 2 logging has been enabled'); } else { $this.info('Icinga 2 logging is already enabled or configuration not found'); } } else { $this.info('Trying to disable logging for Icinga 2...'); if ($newIcingaConfig.Contains('const PowerShellIcinga2EnableLog = true;')) { $newIcingaConfig = $newIcingaConfig.Replace('const PowerShellIcinga2EnableLog = true;', 'const PowerShellIcinga2EnableLog = false;'); $this.info('Icinga 2 logging has been disabled'); } else { $this.info('Icinga 2 logging is not enabled or configuration not found'); } } # In case we made a modification to the configuration -> write it if ($newIcingaConfig -ne $icingaCurrentConfig) { $this.writeConfig($newIcingaConfig); # Validate the config if it is valid if (-Not $this.isIcingaConfigValid($FALSE)) { # if not write the old configuration again $this.writeConfig($icingaCurrentConfig); if (-Not $this.isIcingaConfigValid($FALSE)) { throw 'Critical exception: Something went wrong while processing logging configuration. The Icinga 2 config is corrupt! Please check the icinga2.log'; } } } } # # Ensure we get the hostname or FQDN # from the PowerShell to make things more # easier # $installer | Add-Member -membertype ScriptMethod -name 'fetchHostnameOrFQDN' -value { # Add additional variables to our config for more user-friendly usage [string]$host_fqdn = [string]::Format('{0}.{1}', (Get-WmiObject win32_computersystem).DNSHostName, (Get-WmiObject win32_computersystem).Domain ); if ([string]::IsNullOrEmpty($this.config('agent_name')) -eq $FALSE) { $this.setProperty('local_hostname', $this.config('agent_name')); $this.setProperty('fqdn', $host_fqdn); $this.setProperty('hostname', $this.config('agent_name')); } else { if ($this.config('fetch_agent_fqdn') -And (Get-WmiObject win32_computersystem).Domain) { [string]$hostname = [string]::Format('{0}.{1}', (Get-WmiObject win32_computersystem).DNSHostName, (Get-WmiObject win32_computersystem).Domain ); $this.setProperty('local_hostname', $hostname); } elseif ($this.config('fetch_agent_name')) { [string]$hostname = (Get-WmiObject win32_computersystem).DNSHostName; $this.setProperty('local_hostname', $hostname); } $this.info([string]::Format('Setting internal Agent Name to "{0}"', $this.getProperty('local_hostname'))); [string]$hostname = (Get-WmiObject win32_computersystem).DNSHostName; $this.setProperty('fqdn', $host_fqdn); $this.setProperty('hostname', $hostname); } if (-Not $this.getProperty('local_hostname')) { $this.warn('You have not specified an Agent Name or turned on to auto fetch this information.'); } } # # Retreive the current IP-Address of the Host # $installer | Add-Member -membertype ScriptMethod -name 'fetchHostIPAddress' -value { # First try to lookup the IP by the FQDN if ($this.doLookupIPAddressesForHostname($this.getProperty('fqdn'))) { return; } # Now take a look for the given hostname if ($this.doLookupIPAddressesForHostname($this.getProperty('hostname'))) { return; } # If still nothing is found, look on the entire host if ($this.doLookupIPAddressesForHostname("")) { return; } $this.exception('Failed to lookup any IP-Address for this host'); } # # This function will try to locate the IPv4 address used # for communicating with the network # $installer | Add-Member -membertype ScriptMethod -name 'lookupPrimaryIPv4Address' -value { # First execute nslookup for your FQDN and hostname to check if this # host is registered and receive it's IP address [System.Collections.Hashtable]$fqdnLookup = $this.startProcess('nslookup.exe', $TRUE, $this.getProperty('fqdn')); [System.Collections.Hashtable]$hostnameLookup = $this.startProcess('nslookup.exe', $TRUE, $this.getProperty('hostname')); # Now get the message of our result we should work with (nslookup output) [string]$fqdnLookup = $fqdnLookup.Get_Item('message'); [string]$hostnameLookup = $hostnameLookup.Get_Item('message'); # Get our basic IP first [string]$usedIP = $this.getProperty('ipaddress'); # First try to lookup the basic address. If it is not contained, look further if ($this.isIPv4AddressInsideLookup($fqdnLookup, $hostnameLookup, $usedIP) -eq $FALSE) { [int]$ipCount = $this.getProperty('ipv4_count'); [bool]$found = $FALSE; # Loop through all found IPv4 IP's and try to locate the correct one for ($index = 0; $index -lt $ipCount; $index++) { $usedIP = $this.getProperty([string]::Format('ipaddress[{0}]', $index)); if ($this.isIPv4AddressInsideLookup($fqdnLookup, $hostnameLookup, $usedIP)) { # Swap IP values once we found a match and exit this loop $this.setProperty([string]::Format('ipaddress[{0}]', $index), $this.getProperty('ipaddress')); $this.setProperty('ipaddress', $usedIP); $found = $TRUE; break; } } if ($found -eq $FALSE) { $this.warn([string]::Format('Failed to lookup primary IP for this host. Unable to match nslookup against any IPv4 addresses on this system. Using {0} as default now. Access it with &ipaddress& for all JSON requests.', $this.getProperty('ipaddress') ) ); return; } } $this.info([string]::Format('Setting IP {0} as primary IP for this host for all requests. Access it with &ipaddress& for all JSON requests.', $usedIP ) ); } # # Check if inside our lookup the IP-Address is found # $installer | Add-Member -membertype ScriptMethod -name 'isIPv4AddressInsideLookup' -value { param([string]$fqdnLookup, [string]$hostnameLookup, [string]$ipv4Address); if ($fqdnLookup.Contains($ipv4Address) -Or $hostnameLookup.Contains($ipv4Address)) { return $TRUE; } return $FALSE; } # # Add all found IP-Addresses to our property array # $installer | Add-Member -membertype ScriptMethod -name 'doLookupIPAddressesForHostname' -value { param([string]$hostname); $this.info([string]::Format('Trying to fetch Host IP-Address for hostname: {0}', $hostname)); try { [array]$ipAddressArray = [Net.DNS]::GetHostEntry($hostname).AddressList; $this.addHostIPAddressToProperties($ipAddressArray); return $TRUE; } catch { # Write an error in case something went wrong $this.warn([string]::Format('Failed to lookup IP-Address with DNS-Lookup for "{0}": {1}', $hostname, $_.Exception.Message ) ); } return $FALSE; } # # Add all found IP-Addresses to our property array # $installer | Add-Member -membertype ScriptMethod -name 'addHostIPAddressToProperties' -value { param($ipArray); [int]$ipV4Index = 0; [int]$ipV6Index = 0; foreach ($address in $ipArray) { # Split config attributes for IPv4 and IPv6 into different values if ($address.AddressFamily -eq 'InterNetwork') { #IPv4 # If the first entry of our default ipaddress is empty -> add it if ($this.getProperty('ipaddress') -eq $null) { $this.setProperty('ipaddress', $address); } # Now add the IP's with an array like construct $this.setProperty([string]::Format('ipaddress[{0}]', $ipV4Index), $address); $ipV4Index += 1; } else { #IPv6 # If the first entry of our default ipaddress is empty -> add it if ($this.getProperty('ipaddressV6') -eq $null) { $this.setProperty('ipaddressV6', $address); } # Now add the IP's with an array like construct $this.setProperty([string]::Format('ipaddressV6[{0}]', $ipV6Index), $address); $ipV6Index += 1; } } $this.setProperty('ipv4_count', $ipV4Index); $this.setProperty('ipv6_count', $ipV6Index); } # # Transform the hostname to upper or lower case if required # 0: Do nothing (default) # 1: Transform to lower case # 2: Transform to upper case # $installer | Add-Member -MemberType ScriptMethod -name 'doTransformHostname' -Value { [string]$hostname = $this.getProperty('local_hostname'); [int]$type = $this.config('transform_hostname'); switch ($type) { 1 { $hostname = $hostname.ToLower(); } 2 { $hostname = $hostname.ToUpper(); } Default {} # Do nothing by default } if ($hostname -cne $this.getProperty('local_hostname')) { $this.info([string]::Format('Transforming Agent Name to {0}', $hostname)); } $this.setProperty('local_hostname', $hostname); } # # Allow the replacing of placeholders within a JSON-String # $installer | Add-Member -MemberType ScriptMethod -name 'doReplaceJSONPlaceholders' -Value { param([string]$jsonString); # Replace the encoded & with the original symbol at first $jsonString = $jsonString.Replace('\u0026', '&'); # &hostname& => hostname $jsonString = $jsonString.Replace('&hostname&', $this.getProperty('hostname')); # &hostname.lowerCase& => hostname to lower $jsonString = $jsonString.Replace('&hostname.lowerCase&', $this.getProperty('hostname').ToLower()); # &hostname.upperCase& => hostname to upper $jsonString = $jsonString.Replace('&hostname.upperCase&', $this.getProperty('hostname').ToUpper()); # &fqdn& => fqdn $jsonString = $jsonString.Replace('&fqdn&', $this.getProperty('fqdn')); # &fqdn.lowerCase& => fqdn to lower $jsonString = $jsonString.Replace('&fqdn.lowerCase&', $this.getProperty('fqdn').ToLower()); # &fqdn.upperCase& => fqdn to upper $jsonString = $jsonString.Replace('&fqdn.upperCase&', $this.getProperty('fqdn').ToUpper()); # hostname_placeholder => current hostname (either FQDN, hostname, with plain, upper or lower case) $jsonString = $jsonString.Replace('&hostname_placeholder&', $this.getProperty('local_hostname')); # Try to replace our IP-Address if ($jsonString.Contains('&ipaddressV6')) { $jsonString = $this.doReplaceJSONIPAddress($jsonString, 'ipaddressV6'); } elseif ($jsonString.Contains('&ipaddress')) { $jsonString = $this.doReplaceJSONIPAddress($jsonString, 'ipaddress'); } # Encode the & again to receive a proper JSON $jsonString = $jsonString.Replace('&', '\u0026'); return $jsonString; } # # Allow the replacing of added IPv4 and IPv6 address # $installer | Add-Member -MemberType ScriptMethod -name 'doReplaceJSONIPAddress' -Value { param([string]$jsonString, [string]$ipType); # Add our & delimeter to begin with [string]$ipSearchPattern = '&' + $ipType; # Now locate the string and cut everything away until only our & tag for the string shall be remaining, including the array placeholder [string]$ipAddressEnd = $jsonString.Substring($jsonString.IndexOf($ipSearchPattern) + $ipType.Length + 1, $jsonString.Length - $jsonString.IndexOf($ipSearchPattern) - $ipType.Length - 1); # Ensure we still got an ending &, otherwise throw an error if ($ipAddressEnd.Contains('&')) { # Now cut everything until the first & we found $ipAddressEnd = $ipAddressEnd.Substring(0, $ipAddressEnd.IndexOf('&')); # Build together our IP-Address string, which could be for example ipaddress[1] [string]$ipAddressString = $ipType + $ipAddressEnd; # Now replace this finding with our config attribute $jsonString = $jsonString.Replace('&' + $ipAddressString + '&', $this.getProperty($ipAddressString)); } else { # If something goes wrong we require to notify our user $this.error([string]::Format('Failed to replace IP-Address placeholder. Invalid format for IP-Type {0}', $ipType ) ); } # Return our new JSON-String return $jsonString; } # # This function will allow us to create a # host object directly inside the Icinga Director # with a provided JSON string # $installer | Add-Member -membertype ScriptMethod -name 'createHostInsideIcingaDirector' -value { if ($this.config('director_url') -And $this.getProperty('local_hostname')) { if ($this.getProperty('use_self_service_api')) { if ($this.getProperty('icinga_host_exist')) { $this.info('Host is already registered within Icinga Director.'); return; } if ($this.getProperty('no_valid_api_token')) { $this.info('Skipping host creation over Icinga Director Self-Service API, as no valid token has been specified.'); return; } # If not, try to create the host and fetch the API key [string]$apiKey = $this.config('director_auth_token'); [string]$url = [string]::Format('{0}self-service/register-host?name={1}&key={2}', $this.config('director_url'), $this.getProperty('local_hostname'), $apiKey ); [string]$json = ''; # If no JSON Object is defined (should be default), we shall create one if (-Not $this.config('director_host_object')) { [string]$hostname = $this.getProperty('local_hostname'); $json = [string]::Format('{ "address": "{0}", "display_name": "{0}" }', $hostname ); } else { # Otherwise use the specified one and replace the host object placeholders $json = $this.doReplaceJSONPlaceholders($this.config('director_host_object')); } $this.info([string]::Format('Creating host "{0}" over API token inside Icinga Director.', $this.getProperty('local_hostname'))); [string]$httpResponse = $this.createHTTPRequest($url, $json, 'POST', 'application/json', $TRUE, $TRUE); if ($this.isHTTPResponseCode($httpResponse) -eq $FALSE) { $this.setProperty('director_host_token', $httpResponse); $this.writeHostAPIKeyToDisk(); [string]$response = $this.fetchIcingaDirectorSelfServiceAPIConfig($httpResponse, $FALSE); if ($response -ne '200') { $this.error([string]::Format('Failed to fetch config arguments of Icinga Director Self-Service API after adding new host to Icinga Director. Response was "{0}"', $httpResponse)); } else { $this.info('Successfully fetched configuration for this host over Self-Service API.') } } else { if ($httpResponse -eq '400') { throw [string]::Format("Received response 400 from Icinga Director. In general this means you tried to re-create an existing host inside the Icinga Director with a host template API key, but the host itself has already a key assigned. Please drop the API key for the host '{0}' and re-run this script to claim ownership. This error usually occures in case the host token was removed manually from the host.", $this.getProperty('local_hostname')); } else { $this.warn([string]::Format('Failed to create host. Response code {0}', $httpResponse)); } } } elseif ($this.config('director_host_object')) { # Setup the url we need to call [string]$url = $this.config('director_url') + 'host'; # Replace the host object placeholders [string]$host_object_json = $this.doReplaceJSONPlaceholders($this.config('director_host_object')); # Create the host object inside the director [string]$httpResponse = $this.createHTTPRequest($url, $host_object_json, 'PUT', 'application/json', $FALSE, $this.config('debug_mode')); if ($this.isHTTPResponseCode($httpResponse) -eq $FALSE) { $this.info([string]::Format('Placed query for creating host "{0}" inside Icinga Director. Config: {1}', $this.getProperty('local_hostname'), $httpResponse ) ); } else { if ($httpResponse -eq '422') { $this.warn([string]::Format('Failed to create host "{0}" inside Icinga Director. The host seems to already exist.', $this.getProperty('local_hostname'))); } else { $this.error([string]::Format('Failed to create host "{0}" inside Icinga Director. Error response {1}', $this.getProperty('local_hostname'), $httpResponse ) ); } } # Shall we deploy the config for the generated host? if ($this.config('director_deploy_config')) { $url = $this.config('director_url') + 'config/deploy'; [string]$httpResponse = $this.createHTTPRequest($url, '', 'POST', 'application/json', $FALSE, $TRUE); $this.info([string]::Format('Deploying configuration from Icinga Director to Icinga. Result: {0}', $httpResponse)); } } } } # # Write Host API-Key for future usage # $installer | Add-Member -membertype ScriptMethod -name 'writeHostAPIKeyToDisk' -value { if (Test-Path ($this.getProperty('config_dir'))) { [string]$apiFile = Join-Path -Path $this.getProperty('config_dir') -ChildPath 'icingadirector.token'; $this.info([string]::Format('Writing host API-Key "{0}" to "{1}"', $this.getProperty('director_host_token'), $apiFile ) ); [System.IO.File]::WriteAllText($apiFile, $this.getProperty('director_host_token')); } } # # Read Host API-Key from disk for usage # $installer | Add-Member -membertype ScriptMethod -name 'readHostAPIKeyFromDisk' -value { [string]$apiFile = Join-Path -Path $this.getProperty('config_dir') -ChildPath 'icingadirector.token'; if (Test-Path ($apiFile)) { [string]$hostToken = [System.IO.File]::ReadAllText($apiFile); $this.setProperty('director_host_token', $hostToken); $this.info([string]::Format('Reading host api token "{0}" from "{1}"', $hostToken, $apiFile ) ); } else { $this.setProperty('director_host_token', ''); } } # # Get the API Version from the Icinga Director. In case we are using # an older Version of the Director, we wont get this version # $installer | Add-Member -membertype ScriptMethod -name 'getIcingaDirectorVersion' -value { if ($this.config('director_url')) { # Do a legacy call to the Icinga Director and get a JSON-Value # Older versions of the Director do not support plain/text and # would result in making this request quite useless [string]$url = $this.config('director_url') + 'self-service/api-version'; [string]$versionString = $this.createHTTPRequest($url, '', 'POST', 'application/json', $FALSE, $this.config('debug_mode')); if ($this.isHTTPResponseCode($versionString) -eq $FALSE) { # Remove all characters we do not need inside the string [string]$versionString = $versionString.Replace('"', '').Replace("`r", '').Replace("`n", ''); [array]$version = $versionString.Split('.'); $this.setProperty('icinga_director_api_version', $versionString); return; } else { if ($versionString -eq '900') { throw 'Failed to query Icinga Director API. Received error code 900. Please enable debug mode with -DebugMode for the script run to reteive additional information regarding this error.'; } $this.warn('You seem to use an older Version of the Icinga Director, as no API version could be retreived.'); $this.setProperty('icinga_director_api_version', '0.0.0'); return; } } $this.setProperty('icinga_director_api_version', 'false'); } # # Set Icinga 2 Agent Version based no the installed Agent # $installer | Add-Member -membertype ScriptMethod -name 'setIcinga2AgentVersion' -value { param([string]$versionString) if (-Not $versionString) { return; } $this.setProperty('icinga2_agent_version', $versionString.Split('.')); } # # Compare Version-Strings and check if we are running a higher or lower version # $installer | Add-Member -membertype ScriptMethod -name 'validateVersions' -value { param([string]$requiredVersion, [array]$providedVersion); if (-Not $requiredVersion -Or -Not $providedVersion) { return $FALSE; } [array]$requiredVersion = $requiredVersion.Split('.'); $currentVersion = $providedVersion; if ([int]$requiredVersion[0] -gt [int]$currentVersion[0]) { return $FALSE; } if ([int]$requiredVersion[1] -gt [int]$currentVersion[1]) { return $FALSE; } if ([int]$requiredVersion[1] -ge [int]$currentVersion[1] -And [int]$requiredVersion[2] -gt [int]$currentVersion[2]) { return $FALSE; } return $TRUE; } # # Match the Icinga Director API Version against a provided string # $installer | Add-Member -membertype ScriptMethod -name 'requireIcingaDirectorAPIVersion' -value { param([string]$version, [string]$functionName); # Director URL not specified if ($this.getProperty('icinga_director_api_version') -eq 'false') { return $FALSE; } if ($this.getProperty('icinga_director_api_version') -eq '0.0.0') { $this.error([string]::Format('The feature "{0}" requires Icinga Director API-Version {1}. Your Icinga Director version does not support the API.', $functionName, $version ) ); return $FALSE; } [bool]$versionValid = $this.validateVersions($version, $this.getProperty('icinga_director_api_version').Split('.')); if ($versionValid -eq $FALSE) { $this.error([string]::Format('The feature "{0}" requires Icinga Director API-Version {1}. Got version {2}', $functionName, $version, $this.getProperty('icinga_director_api_version') ) ); return $FALSE; } return $TRUE; } # # This function will convert a [hashtable] or [array] object to string # with function ConvertTo-Json for argument -DirectorHostObject. # It will however only process those if the PowerShell Version is 3 # and above, because Version 2 is not providing the required # functionality. In that case the module will throw an exception # $installer | Add-Member -membertype ScriptMethod -name 'convertDirectorHostObjectArgument' -value { # First add the value to an object we can work with [System.Object]$json = $this.config('director_host_object'); # Prevent processing of empty data if ($json -eq $null -Or $json -eq '') { return; } # In case the argument is already a string -> nothing to do if ($json.GetType() -eq [string]) { # Do nothing return; } elseif ($json.GetType() -eq [hashtable] -Or $json.GetType() -eq [array]) { # Check which PowerShell Version we are using and throw an error in case our Version does not support the argument if ($PSVersionTable.PSVersion.Major -lt 3) { [string]$errorMessage = 'You are trying to pass an object of type [hashtable] or [array] for argument "-DirectorHostObject", but are using ' + 'PowerShell Version 2 or lower. Passing hashtables through this argument is possible, but it requires to be ' + 'converted with function ConvertTo-Json, which is available on PowerShell Version 3 and above only. ' + 'You can still process JSON-Values with this module, even on PowerShell Version 2, but you will have to pass the ' + 'JSON as string instead of an object. This module will now exit with an error code. For further details, please ' + 'read the documentation for the "-DirectorHostObject" argument. ' + 'Documentation: https://github.com/Icinga/icinga2-powershell-module/blob/master/doc/10-Basic-Arguments.md'; $this.exception($errorMessage); throw 'PowerShell Version exception.'; } # If our PowerShell Version is supporting the function, convert it to a valid string $this.overrideConfig('director_host_object', (ConvertTo-Json -Compress $json), $FALSE); } } # # This function will connect to the Icinga Director Self-Service API # and try to fetch the configuration for our host or the global # configuraton, depending if the Host-Token does exist and is valid # or in case it does not exist or is invalid if the API-tiken is # specified # $installer | Add-Member -membertype ScriptMethod -name 'connectToIcingaDirectorSelfServiceAPI' -value { if (-Not $this.config('director_url')) { return; } if ($this.config('director_user') -And $this.config('director_password')) { $this.info('User and Password for Icinga Director have been specified, Self-Service API will not be used.'); $this.setProperty('use_password_auth', $TRUE); return; } $this.setProperty('icinga_host_exist', $FALSE); [string]$response = $this.fetchIcingaDirectorSelfServiceAPIConfig($this.getProperty('director_host_token'), $FALSE); switch ($response) { '200' { $this.info('Connected successfully to Icinga Director Self-Service API over stored host token.'); $this.setProperty('icinga_host_exist', $TRUE); $this.setProperty('use_self_service_api', $TRUE); return; }; '404' { $this.warn('The local host token could not be found inside the Icinga Director.'); }; '500' { $this.warn('An internal server error occured while processing your local host token against the Icinga Director Self-Service API.'); }; } if ($this.config('director_auth_token') -eq '' -And $this.getProperty('director_host_token')) { $this.error('No template API token has been specified and the host token seems no longer valid.') $this.setProperty('no_valid_api_token', $TRUE); return; } # In case no host-token is set or no longer valid, use our API token if # specified to fetch the global configuration from the API $response = $this.fetchIcingaDirectorSelfServiceAPIConfig($this.config('director_auth_token'), $FALSE); switch ($response) { '200' { $this.info('Connected successfully to Icinga Director Self-Service API over API token.'); $this.setProperty('use_self_service_api', $TRUE); return; }; '404' { $this.warn('Failed to query Icinga Director Self-Service API.'); }; '500' { $this.warn('An internal server error occured while processing your API token against the Icinga Director Self-Service API.'); }; '900' { # Nothing to do return; }; } if ($this.getProperty('director_host_token') -Or $this.config('director_auth_token')) { $this.error( [string]::Format('Failed to connect to Icinga Director Self-Service API. Tokens were specified but informations could not be fetched. Please review your tokens: Host: "{0}", API: "{1}".', $this.getProperty('director_host_token'), $this.config('director_auth_token') )); $this.setProperty('no_valid_api_token', $TRUE); } } # # This function will try to call the Icinga Director API # with either a host-token or our API-token and retreive # our arguments for processing with the configuration of # our Icinga 2 Agent Setup # $installer | Add-Member -membertype ScriptMethod -name 'fetchIcingaDirectorSelfServiceAPIConfig' -value { param([string]$token, [bool]$writeError); if (-Not $this.config('director_url') -Or $token -eq '') { return '900'; } if (-Not $this.requireIcingaDirectorAPIVersion('1.4.0', '[Function::fetchIcingaDirectorSelfServiceAPIConfig]')) { return '900'; } [string]$url = [string]::Format('{0}self-service/powershell-parameters?key={1}', $this.config('director_url'), $token ); [string]$argumentString = $this.createHTTPRequest($url, '', 'POST', 'application/json', $TRUE, $this.config('debug_mode')); if ($this.isHTTPResponseCode($argumentString) -eq $FALSE) { # First split the entire result based in new-lines into an array [array]$arguments = $argumentString.Split("`n"); # Now loop all elements and construct a dictionary for all values foreach ($item in $arguments) { if ($item.Contains(':')) { $this.debug([string]::Format('Processing Director API config argument "{0}"', $item)); [int]$argumentPos = $item.IndexOf(":"); [string]$argument = $item.Substring(0, $argumentPos); if (($argumentPos + 2) -le $item.Length) { [string]$value = $item.Substring($argumentPos + 2, $item.Length - 2 - $argumentPos); $value = $value.Replace("`r", ''); $value = $value.Replace("`n", ''); if ($value.Contains( '!')) { [array]$valueArray = $value.Split('!'); $this.overrideConfig($argument, $valueArray, $TRUE); } else { if ($value.toLower() -eq 'true') { $this.overrideConfig($argument, $TRUE, $TRUE); } elseif ($value.toLower() -eq 'false') { $this.overrideConfig($argument, $FALSE, $TRUE); } else { $this.overrideConfig($argument, $value, $TRUE); } } } else { $this.debug([string]::Format('Got key argument "{0}" without a value.', $argument)); } } } } else { if ($writeError) { $this.error([string]::Format('Received "{0}" from Icinga Director. Possibly your API token is no longer valid or the object does not exist.', $argumentString)); } return $argumentString; } # Ensure we generate the required configuration content $this.generateConfigContent(); return '200'; } # # This function will communicate directly with # the Icinga Director and ensuring that we get # some of the possible required informations # $installer | Add-Member -membertype ScriptMethod -name 'fetchTicketFromIcingaDirector' -value { if ($this.getProperty('director_host_token') -And -Not $this.getProperty('use_password_auth')) { if ($this.getProperty('no_valid_api_token')) { $this.info('Skipping fetching of SSL ticket, as no valid API token has been specified.'); return; } if ($this.requireIcingaDirectorAPIVersion('1.4.0', '[Function::fetchTicketFromIcingaDirector]')) { [string]$url = [string]::Format('{0}self-service/ticket?key={1}', $this.config('director_url'), $this.getProperty('director_host_token') ); [string]$httpResponse = $this.createHTTPRequest($url, '', 'POST', 'application/json', $TRUE, $TRUE); if ($this.isHTTPResponseCode($httpResponse) -eq $FALSE) { $this.setProperty('icinga_ticket', $httpResponse); $this.info([string]::Format('Fetched ticket "{0}" from Icinga Director', $httpResponse)); } else { $this.error([string]::Format('Failed to fetch Ticket from Icinga Director. Error response {0}', $httpResponse)); } } } else { if ($this.config('director_url') -And $this.getProperty('local_hostname')) { [string]$url = $this.config('director_url') + 'host/ticket?name=' + $this.getProperty('local_hostname'); [string]$httpResponse = $this.createHTTPRequest($url, '', 'POST', 'application/json', $FALSE, $TRUE); if ($this.isHTTPResponseCode($httpResponse) -eq $FALSE) { # Lookup all " inside the return string $quotes = Select-String -InputObject $httpResponse -Pattern '"' -AllMatches; # If we only got two ", we should have received a valid ticket # Otherwise we need to throw an error if ($quotes.Matches.Count -ne 2) { throw [string]::Format('Failed to fetch ticket for host "{0}". Got "{1}" as ticket.', $this.getProperty('local_hostname'), $httpResponse ); } else { $httpResponse = $httpResponse.subString(1, $httpResponse.length - 3); $this.info([string]::Format('Fetched ticket "{0}" for host "{1}".', $httpResponse, $this.getProperty('local_hostname') ) ); $this.setProperty('icinga_ticket', $httpResponse); } } else { if ($httpResponse -eq '404') { $this.error('Unable to fetch host ticket from Icinga Director. The Host object could not be found. Ensure the object is already present or created by specifying the -DirectorHostObject argument of this script.'); } else { $this.error([string]::Format('Failed to fetch Ticket from Icinga Director. Error response {0}', $httpResponse)); } } } } } # # Check if NSClient is installed on the system # $installer | Add-Member -membertype ScriptMethod -name 'isNSClientInstalled' -value { $nsclient = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -match 'NSClient*'; } if ($nsclient -eq $null) { return $FALSE; } return $TRUE; } # # Shall we install the NSClient as well on the system? # All possible actions are handeled here # $installer | Add-Member -membertype ScriptMethod -name 'installNSClient' -value { if ($this.config('install_nsclient')) { [string]$installerPath = $this.getNSClientInstallerPath(); $this.info([string]::Format('Trying to install and configure NSClient++ from "{0}"', $installerPath)); # First check if the package does exist if (Test-Path ($installerPath)) { if ($this.isNSClientInstalled() -eq $FALSE) { # Get all required arguments for installing the NSClient unattended [string]$NSClientArguments = $this.getNSClientInstallerArguments(); # Start the installer process $result = $this.startProcess('MsiExec.exe', $TRUE, [string]::Format('/quiet /i "{0}" {1}', $installerPath, $NSClientArguments)); # Exit Code 0 means the NSClient was installed successfully # Otherwise we require to throw an error if ($result.Get_Item('exitcode') -ne 0) { $this.exception([string]::Format('Failed to install NSClient++. {0}', $result.Get_Item('message'))); } else { $this.info('NSClient++ successfully installed.'); # To tell Icinga 2 we installed the NSClient and to make # the NSCPPath variable available, we require to restart Icinga 2 $this.setProperty('require_restart', 'true'); } } else { $this.info('NSClient++ is already installed on the system.'); } # If defined remove the Firewall Rule to secure the system # By default the NSClient is only called from the Icinga 2 Agent locally $this.removeNSClientFirewallRule(); # Remove the service if we only call the NSClient locally $this.removeNSClientService(); # Add the default NSClient config if we want to do more $this.addNSClientDefaultConfig(); } else { $this.error([string]::Format('Failed to locate NSClient++ Installer at "{0}"', $installerPath)); } } else { $this.info('NSClient++ will not be installed on the system.'); } } # # Determine the location of the NSClient installer # By default we are using the shipped NSClient from the Icinga 2 Agent # $installer | Add-Member -membertype ScriptMethod -name 'getNSClientInstallerPath' -value { if ($this.config('nsclient_installer_path') -ne '') { # Check of the installer is a local path # If so, use this as installer source if (Test-Path ($this.config('nsclient_installer_path'))) { return $this.config('nsclient_installer_path'); } $this.info([string]::Format('Trying to download NSClient++ from "{0}"', $this.config('nsclient_installer_path'))); [System.Object]$client = New-Object System.Net.WebClient; $client.DownloadFile($this.config('nsclient_installer_path'), (Join-Path -Path $Env:temp -ChildPath 'NSCP.msi')); return (Join-Path -Path $Env:temp -ChildPath 'NSCP.msi'); } else { # Icinga is shipping a NSClient Version after installation # Install this version if defined return (Join-Path -Path $this.getInstallPath() -ChildPath 'sbin\NSCP.msi'); } return ''; } # # If we only want to use the NSClient++ to be called from the Icinga 2 Agent # we do not require an open Firewall Rule to allow traffic. # $installer | Add-Member -membertype ScriptMethod -name 'getNSClientInstallerArguments' -value { [string]$NSClientArguments = ''; if ($this.config('nsclient_directory')) { $NSClientArguments += [string]::Format(' INSTALLLOCATION={0}', $this.config('nsclient_directory')); } return $NSClientArguments; } # # If we only want to use the NSClient++ to be called from the Icinga 2 Agent # we do not require an open Firewall Rule to allow traffic. # $installer | Add-Member -membertype ScriptMethod -name 'removeNSClientFirewallRule' -value { if ($this.config('nsclient_firewall') -eq $FALSE) { $result = $this.startProcess('netsh', $FALSE, 'advfirewall firewall show rule name="NSClient++ Monitoring Agent"'); if ($result.Get_Item('exitcode') -ne 0) { # Firewall rule was not found. Nothing to do $this.info('NSClient++ Firewall Rule is not installed'); return; } $this.info('Trying to remove NSClient++ Firewall Rule'); $result = $this.startProcess('netsh', $TRUE, 'advfirewall firewall delete rule name="NSClient++ Monitoring Agent"'); if ($result.Get_Item('exitcode') -ne 0) { $this.error([string]::Format('Failed to remove NSClient++ Firewall rule: {0}', $result.Get_Item('message'))); } else { $this.info('NSClient++ Firewall Rule has been successfully removed'); } } } # # If we only want to use the NSClient++ to be called from the Icinga 2 Agent # we do not require a running NSClient++ Service # $installer | Add-Member -membertype ScriptMethod -name 'removeNSClientService' -value { if ($this.config('nsclient_service') -eq $FALSE) { $NSClientService = Get-WmiObject -Class Win32_Service -Filter "Name='nscp'"; if ($NSClientService -ne $null) { $this.info('Trying to remove NSClient++ service'); # Before we remove the service, stop it (to prevent ghosts) Stop-Service 'nscp'; # Now remove it $result = $NSClientService.delete(); if ($result.ReturnValue -eq 0) { $this.info('NSClient++ Service has been removed'); } else { $this.error('Failed to remove NSClient++ service'); } } else { $this.info('NSClient++ Service is not installed') } } } # # In case we want to do more with the NSClient, we can auto-generate # all NSClient++ config attributes # $installer | Add-Member -membertype ScriptMethod -name 'addNSClientDefaultConfig' -value { if ($this.config('nsclient_add_defaults')) { [string]$NSClientBinary = $this.getNSClientDefaultExecutablePath(); if ($NSClientBinary -eq '') { $this.error('Unable to generate NSClient++ default config. Executable nscp.exe could not be found ' + 'on default locations or the specified custom location. If you installed the NSClient on a ' + 'custom location, please specify the path with -NSClientDirectory'); return; } if (Test-Path ($NSClientBinary)) { $this.info('Generating all default NSClient++ config values'); $result = $this.startProcess($NSClientBinary, $TRUE, 'settings --generate --add-defaults --load-all'); if ($result.Get_Item('exitcode') -ne 0) { $this.error($result.Get_Item('message')); } } else { $this.error([string]::Format('Failed to generate NSClient++ defaults config. Path to executable is not valid: {0}', $NSClientBinary)); } } } # # Deprecated function # $installer | Add-Member -membertype ScriptMethod -name 'installIcinga2Agent' -value { $this.warn('The function "installIcinga2Agent" is deprecated and will be removed soon. Please use "install" instead.') return $this.install(); } $installer | Add-Member -membertype ScriptMethod -name 'installMonitoringComponents' -value { $this.warn('The function "installMonitoringComponents" is deprecated and will be removed soon. Please use "install" instead.') return $this.install(); } # # This function will try to load all # data from the system and setup the # entire Agent without user interaction # including download and update if # specified. Returnd 0 or 1 as exit code # $installer | Add-Member -membertype ScriptMethod -name 'install' -value { try { if (-Not $this.isAdmin()) { return 1; } # Write an output to the logfile only, ensuring we always get a proper 'start entry' for the user $this.info('Started script run...'); # Get the current API-Version from the Icinga Director $this.getIcingaDirectorVersion(); # Convert our DirectorHostObject argument from Object to String if required $this.convertDirectorHostObjectArgument(); # Read the Host-API Key in case it exists $this.readHostAPIKeyFromDisk(); # Establish connection to Icinga Director Self-Service API if required # and fetch basic / host configuration if tokens are set $this.connectToIcingaDirectorSelfServiceAPI(); # Set Script defaults $this.setScriptDefaultVariables(); # Get host name or FQDN if required $this.fetchHostnameOrFQDN(); # Get IP-Address of host $this.fetchHostIPAddress(); # Try to locate the primary IP Address $this.lookupPrimaryIPv4Address(); # Transform the hostname if required $this.doTransformHostname(); # Before we continue, flush the API Directory if specified. This will require # us to stop the Icinga 2 Agent, but should prevent any false positive in # case dependencies within the API Director are no longer pressent and will # ensure a possible config rollback is working as intended as well $this.flushIcingaApiDirectory(); # Try to locate the current # Installation data from the Agent if ($this.isAgentInstalled()) { if (-Not $this.isAgentUpToDate()) { if ($this.allowAgentUpdates()) { $this.printAgentUpdateMessage(); $this.updateAgent(); $this.cleanupAgentInstaller(); } } else { $this.info('Icinga 2 Agent is up-to-date. Nothing to do.'); } } else { if ($this.canInstallAgent()) { $this.installAgent(); $this.cleanupAgentInstaller(); } else { $this.warn('Icinga 2 Agent is not installed and not allowed of beeing installed.'); } } # Try to create a host object inside the Icinga Director $this.createHostInsideIcingaDirector(); # First check if we should get some parameters from the Icinga Director $this.fetchTicketFromIcingaDirector(); # In case we downgrade from Icinga 2.8.0 or above to a older version (like Icinga 2.7.2) $this.migrateCertificates(); if (-Not $this.hasCertificates() -Or $this.forceCertificateGeneration()) { $this.generateCertificates(); } else { $this.info('Icinga 2 certificates already exist. Nothing to do.'); } $this.generateIcingaConfiguration(); $this.applyPossibleConfigChanges(); $this.switchIcingaLogging(); $this.installIcingaAgentFirewallRule(); $this.installNSClient(); if ($this.madeChanges()) { $this.restartAgent(); } else { $this.info('No changes detected.'); } # We modify the service user at the very last to ensure # the user we defined for logging in is valid $this.modifyIcingaServiceUser(); return $this.getScriptExitCode(); } catch { $this.printLastException(); [void]$this.getScriptExitCode(); return 1; } } # # Deprecated function # $installer | Add-Member -membertype ScriptMethod -name 'uninstallIcinga2Agent' -value { $this.warn('The function "uninstallIcinga2Agent" is deprecated and will be removed soon. Please use "uninstall" instead.') return $this.uninstall(); } $installer | Add-Member -membertype ScriptMethod -name 'uninstallMonitoringComponents' -value { $this.warn('The function "uninstallMonitoringComponents" is deprecated and will be removed soon. Please use "uninstall" instead.') return $this.uninstall(); } # # Removes the Icinga 2 Agent from the system # $installer | Add-Member -membertype ScriptMethod -name 'uninstall' -value { $this.info('Trying to locate Icinga 2 Agent...'); if ($this.isAgentInstalled()) { $this.info('Removing Icinga 2 Agent from the system'); $result = $this.startProcess('MsiExec.exe', $TRUE, [string]::Format('{0} /q', $this.getProperty('uninstall_id'))); if ($result.Get_Item('exitcode') -ne 0) { $this.error($result.Get_Item('message')); return [int]$result.Get_Item('exitcode'); } $this.info('Icinga 2 Agent successfully removed.'); } if ($this.config('full_uninstallation')) { $this.info('Flushing Icinga 2 program data directory...'); if (Test-Path ((Join-Path -Path $Env:ProgramData -ChildPath 'icinga2'))) { try { [System.Object]$folder = New-Object -ComObject Scripting.FileSystemObject; [void]$folder.DeleteFolder((Join-Path -Path $Env:ProgramData -ChildPath 'icinga2')); $this.info('Remaining Icinga 2 configuration successfully removed.'); } catch { $this.exception([string]::Format('Failed to delete Icinga 2 Program Data Directory: {0}', $_.Exception.Message)); } } else { $this.warn('Icinga 2 Agent program directory not present.'); } } if ($this.config('remove_nsclient')) { $this.info('Trying to remove installed NSClient++...'); $nsclient = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -match 'NSClient*'; } if ($nsclient -ne $null) { $this.info('Removing installed NSClient++...'); [void]$nsclient.Uninstall(); $this.info('NSClient++ has been successfully removed.'); } else { $this.warn('NSClient++ could not be located on the system. Nothing to remove.'); } } return $this.getScriptExitCode(); } # # Locate the current installation of Icinga 2 and dump the icinga2.conf to the window # $installer | Add-Member -membertype ScriptMethod -name 'dumpIcinga2Conf' -value { if (-Not $this.isAgentInstalled()) { $this.info('Icinga 2 Agent is not installed on the system. No configuration to dump.'); return $this.getScriptExitCode(); } [string]$icingaConfig = ''; if (Test-Path $this.getIcingaConfigFile()) { $icingaConfig = [System.IO.File]::ReadAllText($this.getIcingaConfigFile()); $this.info([string]::Format('Dumping content of the Icinga 2 configuration from "{0}".', $this.getIcingaConfigFile())); $this.output($icingaConfig); } else { $this.exception([string]::Format('Failed to lookup Icinga 2 configuration at "{0}". File does not exist.', $this.getIcingaConfigFile())); } } # # Locate the current installation of Icinga 2 and dump all Icinga 2 objects # $installer | Add-Member -membertype ScriptMethod -name 'dumpIcinga2Objects' -value { if (-Not $this.isAgentInstalled()) { $this.info('Icinga 2 Agent is not installed on the system. No objects to dump.'); return $this.getScriptExitCode(); } [string]$icingaBinary = Join-Path -Path $this.getInstallPath() -ChildPath 'sbin\icinga2.exe'; if (-Not (Test-Path $icingaBinary)) { $this.exception([string]::Format('Failed to query Icinga 2 objects. Executable at "{0}" does not exist.', $icingaBinary)); return $this.getScriptExitCode(); } $result = $this.startProcess($icingaBinary, $FALSE, 'object list'); if ($result.Get_Item('exitcode') -ne 0) { $this.exception($result.Get_Item('message')); } else { $this.info('Dumping all objects from Icinga 2'); $this.output($result.Get_Item('message')); } } # Make the installation / uninstallation of the script easier and shorter [int]$installerExitCode = 0; [int]$uninstallerExitCode = 0; [int]$dumpConfigExitCode = 0; [int]$dumpObjectsExitCode = 0; # If flag RunUninstaller is set, do the uninstallation of the components if ($RunUninstaller) { $uninstallerExitCode = $installer.uninstall(); } # If flag RunInstaller is set, do the installation of the components if ($RunInstaller) { $installerExitCode = $installer.install(); } # If flag DumpIcingaConfig is set, print the current Icinga 2 configuration if ($DumpIcingaConfig) { $dumpConfigExitCode = $installer.dumpIcinga2Conf(); } if ($DumpIcingaObjects) { $dumpObjectsExitCode = $installer.dumpIcinga2Objects(); } if ($RunInstaller -Or $RunUninstaller -Or $DumpIcingaConfig -Or $DumpIcingaObjects) { if ($installerExitCode -ne 0 -Or $uninstallerExitCode -ne 0 -Or $dumpConfigExitCode -ne 0 -Or $dumpObjectsExitCode -ne 0) { return 1; } } # Otherwise handle everything as before return $installer; } icingaweb2-module-director-1.11.8/doc/000077500000000000000000000000001516513262500174635ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/01-Introduction.md000066400000000000000000000042611516513262500227070ustar00rootroot00000000000000Introduction ===================================== Welcome to the Icinga Director, the bleeding edge configuration tool for Icinga 2! Developed as an Icinga Web 2 module it aims to be your new favorite Icinga config deployment tool. Even if you prefer plain text files and manual configuration, chances are good that the Director will change your mind. Director is here to make your life easier. As an Icinga 2 pro you know all the knobs and tricks Icinga2 provides. However, you are not willing to do the same work again and again. Someone wants to add a new server, tweak some thresholds, adjust notifications? They shouldn't need to bother you. No way, you might think. You do not trust your users, they might break things. Well... no. Not with the Director. It provides an audit log that shows any single change. You can re-deploy old configurations at any time. And you will be allowed to restrict what your users are allowed to do in a very granular way. Doing automation? Want to feed your monitoring from your configuration management tool, or from your CMDB? You'll love the endless possibilities Director provides. Basic architecture ------------------ Icinga Director uses the Icinga 2 API to talk to your monitoring system. It will help you to deploy your configuration, regardless of whether you are using a single node Icinga installation or a distributed setup with multiple masters and satellites. +------------+ +--------------+ +------------+ | Sat 1 / EU | | Sat 2 / Asia | | Sat 3 / US | +------------+ +--------------+ +------------+ \ / / \ / / +-------------+ +-------------+ | Master 1 | <===> | Master 2 | (Master-Zone) +-------------+ +-------------+ ^ ^ | Icinga 2 REST API : | : +----------------------------+ | Icinga Director | +----------------------------+ Using the Icinga 2 Agent? Perfect, the Director will make your life much easier! icingaweb2-module-director-1.11.8/doc/02-Installation.md000066400000000000000000000057711516513262500226770ustar00rootroot00000000000000 # Installing Icinga Director The recommended way to install Icinga Director and its dependencies is to use prebuilt packages for all supported platforms from our official release repository. Please note that [Icinga Web](https://icinga.com/docs/icinga-web) is required to run Icinga Director and if it is not already set up, it is best to do this first. The following steps will guide you through installing and setting up Icinga Director. To upgrade an existing Icinga Director installation to a newer version, see the [upgrading](05-Upgrading.md) documentation for the necessary steps. If you want to automate the installation, configuration and upgrade, you can learn more about it in the [automation](03-Automation.md) section of this documentation. ## Optional Requirements The following requirements are not necessary for installation, but may be needed later if you want to import from one of the listed sources: * For **IBM Db2** imports: `php-pdo-ibm` * For **Microsoft SQL Server** imports: `php-mssql`, `php-pdo-dblib` or `php-sybase` depending on your platform * For **Oracle Database** imports: `php-oci8` or `php-pdo-oci` depending on your platform * For **SQLite** imports: `php-pdo-sqlite` ## Installing Icinga Director Package If the [repository](https://packages.icinga.com) is not configured yet, please add it first. Then use your distribution's package manager to install the `icinga-director` package or install [from source](02-Installation.md.d/From-Source.md). ## Setting up the Database A MySQL (≥5.7), MariaDB (≥10.1), or PostgreSQL (≥9.6) database is required to run Icinga Director. Please follow the steps listed for your target database, to set up the database and the user. The schema will be imported later via the web interface. ### Setting up a MySQL or MariaDB Database > **Warning** > Make sure to replace `CHANGEME` with a secure password. ``` mysql -e "CREATE DATABASE director CHARACTER SET 'utf8'; CREATE USER director@localhost IDENTIFIED BY 'CHANGEME'; GRANT ALL ON director.* TO director@localhost;" ``` ### Setting up a PostgreSQL Database > **Warning** > Make sure to replace `CHANGEME` with a secure password. ``` psql -q -c "CREATE DATABASE director WITH ENCODING 'UTF8';" psql director -q -c "CREATE USER director WITH PASSWORD 'CHANGEME'; GRANT ALL PRIVILEGES ON DATABASE director TO director; CREATE EXTENSION pgcrypto;" ``` ## Configuring Icinga Director Log in to your running Icinga Web setup with a privileged user and follow the steps below to configure Icinga Director: 1. Create a new resource for the Icinga Director [database](#setting-up-the-database) via the `Configuration → Application → Resources` menu. Please make sure that you configure `utf8` as encoding. 2. Select `Icinga Director` directly from the main menu and you will be taken to the kickstart wizard. Follow the instructions and you are done! icingaweb2-module-director-1.11.8/doc/02-Installation.md.d/000077500000000000000000000000001516513262500231645ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/02-Installation.md.d/From-Source.md000066400000000000000000000067111516513262500256540ustar00rootroot00000000000000# Installing Icinga Director from Source These are the instructions for manual Director installations. Please see the Icinga Web documentation on [how to install modules](https://icinga.com/docs/icinga-web-2/latest/doc/08-Modules/#installation) from source. Make sure you use `director` as the module name. The following requirements must also be met. ## Requirements * PHP (≥7.3) * Director v1.10 is the last version with support for PHP v5.6 * [Icinga 2](https://github.com/Icinga/icinga2) (≥2.8.0) * It is recommended to use the latest feature release of Icinga 2 * All versions since 2.4.3 should also work fine, but we do no longer test and support them. * Some features require newer Icinga 2 releases * Flapping requires 2.8 for the thresholds to work - and at least 2.7 on all nodes * [Icinga Web](https://github.com/Icinga/icingaweb2) (≥2.8.0). All versions since 2.2 should also work fine, but might show smaller UI bugs and are not actively tested * The following Icinga modules must be installed and enabled: * [incubator](https://github.com/Icinga/icingaweb2-module-incubator) (≥0.22.0) * If you are using Icinga Web <2.9.0, the following modules are also required * [ipl](https://github.com/Icinga/icingaweb2-module-ipl) (≥0.5.0) * [reactbundle](https://github.com/Icinga/icingaweb2-module-reactbundle) (≥0.9.0) * A database: MariaDB (≥10.1), MySQL (≥5.7), PostgreSQL (≥9.6). Other forks and older versions might work, but are neither tested nor supported * `php-pdo-mysql` and/or `php-pdo-pgsql` * `php-curl` * `php-iconv` * `php-pcntl` (might already be built into your PHP binary) * `php-posix` or `php-process` depending on your platform * `php-sockets` (might already be built into your PHP binary) ## Installing from Release Tarball Download the [latest version](https://github.com/Icinga/icingaweb2-module-director/releases) and extract it to a folder named `director` in one of your Icinga Web module path directories. You might want to use a script as follows for this task: ```shell MODULE_VERSION="1.11.8" ICINGAWEB_MODULEPATH="/usr/share/icingaweb2/modules" REPO_URL="https://github.com/icinga/icingaweb2-module-director" TARGET_DIR="${ICINGAWEB_MODULEPATH}/director" URL="${REPO_URL}/archive/v${MODULE_VERSION}.tar.gz" install -d -m 0755 "${TARGET_DIR}" wget -q -O - "$URL" | tar xfz - -C "${TARGET_DIR}" --strip-components 1 icingacli module enable director ``` ## Installing from Git Repository Another convenient method is to install directly from our Git repository. Simply clone the repository in one of your Icinga web module path directories. You might want to use a script as follows for this task: ```shell MODULE_VERSION="1.11.8" ICINGAWEB_MODULEPATH="/usr/share/icingaweb2/modules" REPO_URL="https://github.com/icinga/icingaweb2-module-director" TARGET_DIR="${ICINGAWEB_MODULEPATH}/director" git clone "${REPO_URL}" "${TARGET_DIR}" --branch v${MODULE_VERSION} icingacli module enable director ``` ## Setting up the Director Daemon For manual installations, the daemon user, its directory, and the systemd service need to be set up: ```shell useradd -r -g icingaweb2 -d /var/lib/icingadirector -s /sbin/nologin icingadirector install -d -o icingadirector -g icingaweb2 -m 0750 /var/lib/icingadirector install -pm 0644 contrib/systemd/icinga-director.service /etc/systemd/system systemctl daemon-reload systemctl enable --now icinga-director ``` icingaweb2-module-director-1.11.8/doc/03-Automation.md000066400000000000000000000106551516513262500223540ustar00rootroot00000000000000Automation - Configuration management ============================================================ Director has been designed to work in distributed environments. In case you're using tools like Puppet, Ansible, Salt (R)?ex or similar, this chapter is what you're looking for! Generic hints ------------- Director keeps all of its configuration in a relational database. So, all you need to tell him is how it can reach and access that db. In case you already rolled out Icinga Web 2 you should already be used to handle resource definitions. The Director needs a `database resource`, and your RDBMS must either by MySQL, MariaDB or PostgreSQL. This is how such a resource could look like in your `/etc/icingaweb2/resources.ini`: ```ini [Director DB] type = "db" db = "mysql" host = "localhost" dbname = "director" username = "director" password = "***" charset = "utf8" ``` Please note that the charset is required and MUST be `utf8`. Next you need to tell the Director to use this database resource. Create its `config.ini` with the only required setting: ```ini [db] resource = "Director DB" ``` Hint: `/etc/icingaweb2/modules/director/config.ini` is usually the full path to this config file. #### Schema creation and migrations You do not need to manually care about creating the schema and to migrate it for newer versions. Just `grant` the configured user all permissions on his database. On CLI then please run: icingacli director migration run --verbose You should run this command after each upgrade, or you could also run it at a regular interval. Please have a look at... icingacli director migration pending --verbose ...in case you are looking for an idempotent way of managing the schema. Use `--help` to learn more about those commands. If you have any good reason for doing so and feel experienced enough you can of course also manage the schema on your own. All required files are to be found in our `schema` directories. Deploy Icinga Director with Puppet ---------------------------------- Drop the director source repository to a directory named `director` in one of your `module_path`'s and enable the module as you did with all the others. Deploy the mentioned database resource and `config.ini`. Director could now be configured and kick-started via the web frontend. But you are here for automation, so please read on. ### Handle schema migrations It doesn't matter whether you already have a schema, did a fresh install or just an upgrade. Migrations are as easy as defining: exec { 'Icinga Director DB migration': path => '/usr/local/bin:/usr/bin:/bin', command => 'icingacli director migration run', onlyif => 'icingacli director migration pending', } Hint: please do not travel back in time, schema downgrades are not supported. ### Kickstart an empty Director database The Director kickstart wizard helps you with setting up a connection to Icinga2 master node, import its endpoint and zone definition and it also syncs already configured command definitions. But this wizard is not only available through the web frontend, you can perfectly trigger it in an idempotent way with Puppet: exec { 'Icinga Director Kickstart': path => '/usr/local/bin:/usr/bin:/bin', command => 'icingacli director kickstart run', onlyif => 'icingacli director kickstart required', require => Exec['Icinga Director DB migration'], } Nothing will happen so far. Kickstart will not do anything unless you drop a `kickstart.ini` allowing the CLI kickstart helper to do so: ```ini [config] endpoint = icinga-master ; host = 127.0.0.1 ; port = 5665 username = director password = *** ``` Usually `/etc/icingaweb2/modules/director/kickstart.ini` should be the full path to this file. `endpoint` (master certificate name), `username` and `password` (fitting an already configured `ApiUser`) are required. `host` can be a resolvable hostname or an IP address. `port` is 5665 per default in case none is given. And of course your Icinga2 installation needs to have a corresponding `ApiListener` (look at your enabled features) listening at the given port. You can run the `kickstart` from the CLI if you don't use a tool for automation. icingacli director kickstart run You can rerun the kickstart if you have to reimport changed local config, even when the beforementioned check tells you you don't need to. Or you could use the import/synchronisation features of Director. icingaweb2-module-director-1.11.8/doc/04-Getting-started.md000066400000000000000000000037421516513262500233010ustar00rootroot00000000000000Getting started =========================================== When new to the Director please make your first steps with a naked Icinga environment. Director is not allowed to modify existing configuration in `/etc/icinga2`. And while importing existing config is possible (happens for example automagically at kickstart time), it is a pretty advanced task you should not tackle at the early beginning. Define a new global zone ------------------------ This zone must exist on every node directly or indirectly managed by the Icinga Director: ```icinga2 object Zone "director-global" { global = true } ``` Create an API user ------------------ ```icinga2 object ApiUser "director" { password = "***" permissions = [ "*" ] //client_cn = "" } ``` To allow the configuration of an API user your Icinga 2 instance needs a `zone` and an `endpoint` object for itself. If you have a clustered setup or you are using agents you already have this. If you are using a fresh Icinga 2 installation or a standalone setup with other ways of checking your clients, you will have to create them. The easiest way to set up Icinga 2 with a `zone` and `endpoint` is by running the [Icinga 2 Setup Wizard](https://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/distributed-monitoring#distributed-monitoring-setup-master). Take some time to really understand how to work with Icinga Director first. Other topics that might interest you ------------------------------------ * [Working with agents](24-Working-with-agents.md) * [Understanding how Icinga Director works](10-How-it-works.md) What you should not try to start with ------------------------------------- Director has not been built to help you with managing existing hand-crafted configuration in /etc/icinga2. There are cases where it absolutely would make sense to combine the Director with manual configuration. You can also use multiple tools owning separate config packages. But these are pretty advanced topics. icingaweb2-module-director-1.11.8/doc/05-Upgrading.md000066400000000000000000000246751516513262500221650ustar00rootroot00000000000000Upgrading =============================== Icinga Director is very upgrade-friendly. We never had any complaint referring data loss on upgrade. But to be on the safe side, please always [backup](#backup-first) your database before running an upgrade. Then drop the new version to your Icinga Web 2 module folder, and you're all done. Eventually refresh the page in your browser[[1]](#footnote1), and you are ready to go. Should there any other actions be required (like [schema migrations](#schema-migrations)), you will be told so in your frontend. Please read more about: * [Database Backup](#backup-first) * [Upgrading to 1.11.x](#upgrade-to-1.11.x) * [Upgrading to 1.10.x](#upgrade-to-1.10.x) * [Upgrading to 1.9.x](#upgrade-to-1.9.x) * [Upgrading to 1.8.x](#upgrade-to-1.8.x) * [Upgrading to 1.7.x](#upgrade-to-1.7.x) * [Upgrading to 1.6.x](#upgrade-to-1.6.x) * [Upgrading to 1.5.x](#upgrade-to-1.5.x) * [Upgrading to 1.4.x](#upgrade-to-1.4.x) * [Upgrading to 1.3.0](#upgrade-to-1.3.0) * [Upgrading to 1.2.0](#upgrade-to-1.2.0) * [Upgrading to 1.1.0](#upgrade-to-1.1.0) * [How to work with the latest GIT master](#git-master) * [Database schema upgrades](#schema-migrations) * [Job Runner restart](#restart-jobrunner) * [Downgrading](#downgrade) And last but not least, having a look at our [Changelog](82-Changelog.md) is usually a good idea before applying an upgrade. Always take a backup first ----------------------------------------------------- All you need for backing up your Director is a snapshot of your database. Please use the tools provided by your database backend, like `mysqldump` or `pg_dump`. Restoring from a backup is trivial, and Director will always be able to apply pending database migrations to an imported old database snapshot. Upgrading to 1.11.x -------------------------------------------------- Before upgrading, please upgrade the [incubator module](https://github.com/Icinga/icingaweb2-module-incubator) to (at least) v0.22.0. As always, you'll be prompted to apply pending Database Migrations. Upgrading to 1.10.x -------------------------------------------------- Please check module dependencies, we raised some of them. In case you're missing one of them, the Web UI will tell you after the upgrade. You'll then be prompted to apply pending Database Migrations. PHP 7.3 is now claimed to be required, but we still support 5.6+ on Director v1.10.x. Same goes for database dependencies: you should upgrade them to recent versions, but v1.10 still works on the ones supported with v1.9.x. Upgrading to 1.9.x ------------------------------------------------- Please check module dependencies, we raised some of them. In case you're missing one of them, the Web UI will tell you after the upgrade. You'll then be prompted to apply pending Database Migrations. Upgrading to 1.8.x ------------------------------------------------- Before upgrading, please upgrade the [incubator module](https://github.com/Icinga/icingaweb2-module-incubator) to (at least) v0.6.0. As always, you'll be prompted to apply pending Database Migrations. Upgrading to 1.7.x ------------------------------------------------- Since v1.7.0 Icinga Director requires at least PHP 5.6. Also, this version introduces new dependencies. Please make sure that the following Icinga Web 2 modules have been installed and enabled: * [ipl](https://github.com/Icinga/icingaweb2-module-ipl) (>=0.3.0) * [incubator](https://github.com/Icinga/icingaweb2-module-incubator) (>=0.5.0) * [reactbundle](https://github.com/Icinga/icingaweb2-module-reactbundle) (>=0.7.0) Also, the following PHP libraries should be available: * php-pcntl (might already be built into your PHP binary) * php-posix (on RHEL/CentOS this is php-process, or rh-php7x-php-process) * php-sockets (might already be built into your PHP binary) Apart from this, in case you are running 1.6.x or any GIT master since then, all you need is to replace the Director module folder with the new one. Or to run `git checkout v1.7.x` in case you installed Director from GIT. As always, you'll then be prompted to apply pending Database Migrations. There is now a new, modern (and mandatory) Background Daemon, the old (optional) Jobs Daemon must be removed. Please check our [documentation](75-Background-Daemon.md) for related instructions. Upgrading to 1.6.x ------------------------------------------------- There is nothing special to take care of. In case you are running 1.5.x or any GIT master since then, all you need is to replace the Director module folder with the new one. Or to run git checkout v1.6.0 in case you installed Director from GIT. As always, you'll then be prompted to apply pending Database Migrations. Upgrading to 1.5.x ------------------------------------------------- There is nothing special to take care of. In case you are running 1.4.x or any GIT master since then, all you need is to replace the Director module folder with the new one. Or to run git checkout v1.5.0 in case you installed Director from GIT. As always, you'll then be prompted to apply pending Database Migrations. Upgrading to 1.4.x ------------------------------------------------- Since v1.4.0 Icinga Director requires at least PHP 5.4. Apart from this, there is nothing special to take care of. In case you are running 1.3.x or any GIT master since then, all you need is to replace the Director module folder with the new one. Or to run `git checkout v1.4.x` in case you installed Director from GIT. Upgrading to 1.3.x ------------------------------------------------- In case you are running 1.2.0 or any GIT master since then, all you need is to replace the Director module folder with the new one. Or to run `git checkout v1.3.x` in case you installed Director from GIT. When running Director since 1.1.0 or earlier on PostgreSQL, you might not yet have the PostgreSQL crypto extension installed (Package: `postgresql-contrib`) and enabled: psql -q -c "CREATE EXTENSION pgcrypto;" Upgrading to 1.2.0 ------------------------------------------------- There is nothing special to take care of. In case you are running 1.1.0 or any GIT master since then, all you need is to replace the Director module folder with the new one. Or to run `git checkout v1.2.0` in case you installed Director from GIT. Upgrading to 1.1.0 ------------------------------------------------- There is nothing special to take care of. In case you are running 1.0.0 or any GIT master since then, all you need is to replace the Director module folder with the new one. Or to run `git checkout v1.1.0` in case you installed Director from GIT. Work with the latest GIT master -------------------------------------------------------- Icinga Director is still a very young project. Lots of changes are going on, a lot of improvements, bug fixes and new features are still being added every month. People living on the bleeding edge might prefer to use all of them as soon as possible. So here is the good news: this is no problem at all. It's absolutely legal and encouraged to run Director as a pure GIT clone, installed as such: ```sh ICINGAWEB_MODULES=/usr/share/icingaweb2/modules DIRECTOR_GIT=https://github.com/Icinga/icingaweb2-module-director.git git clone $DIRECTOR_GIT $ICINGAWEB_MODULES/director ``` Don't worry about schema upgrades. Once they made it into our GIT master there will always be a clean upgrade path for you, no manual interaction should ever be required. Like every human being, we are not infallible. So, while our strict policy says that the master should never break, this might of course happen. In that case, please [let us know](https://github.com/Icinga/icingaweb2-module-director/issues). We'll try to fix your issue as soon as possible. Database schema migrations ---------------------------------------------------------- In case there are any DB schema upgrades (and that's still often the case) this is no problem at all. They will pop up on your Director Dashboard and can be applied with a single click. And if your Director is deployed automatically by and automation tool like Puppet, also schema upgrades can easily be handled that way. Just follow the [related examples](03-Automation.md) in our documentation. Manual schema migrations ---------------------------------------------------------- Please *do not* manually apply our schema migration files. We are very strict about our connection settings, encodings and SQL modes. Client encoding MUST be UTF-8, for MySQL and MariaDB we are using the following SQL Mode: ```sql SET SESSION SQL_MODE='STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,ANSI_QUOTES,PIPES_AS_CONCAT, NO_ENGINE_SUBSTITUTION'; ``` Our migration files are written based on the assumption that those rules are strictly followed, and there may be other ones in future. So please use one of the supported migration methods either on the web or on command line and stay away from directly interfering with the schema. Restart the Job Runner service -------------------------------------------------------------- The Job Runner forks it's jobs, so usually a changed code base will take effect immediately. However, there might be (schema or code) changes involving the Runner process itself. To be on the safe side please always restart it after an upgrade, even when it's just a quick `git pull`: ```sh systemctl restart director-jobs.service ``` Downgrading ----------------------------------- Downgrading is **not supported**. Most parts of the code will even refuse to work in case there are new fields in their database tables. Migrations are intentionally provided for upgrades only. In case you want to travel back in time please restore a matching former [Database Backup](#backup-first). [1]: Future Icinga Web 2 version will also take care of this step. We want to be able to have the latest JavaScript and CSS for any active module to be shipped silently without manual interaction to any connected browser within less then 15 seconds after the latest module has been installed, enabled or upgraded. icingaweb2-module-director-1.11.8/doc/10-How-it-works.md000066400000000000000000000114601516513262500225370ustar00rootroot00000000000000How it works ===================================== This chapter wants to give you some basic understanding of how the Director works with your Icinga installation. At least once you start to work with satellite zones it might be worth to give this a read. How your configuration is going to be rendered ---------------------------------------------- First of all, the Director doesn't write to `/etc/icinga2`. That's where you keep to store your manual configuration and that's where you are required to do the basic config tasks required to get Icinga 2 ready for the Director. The Director uses the Icinga 2 API to ship the configuration. It does so by shipping full config packages, it does not deal with single objects. This makes deployments much faster. It also makes it easier to use Director in parallel with manual configuration or configuration shipped by other tools. Internally, Icinga 2 manages part of its configuration in its `var/lib` directory. This is usually to be found in `/var/lib/icinga2`. Config packages are stored to `/var/lib/icinga2/api/packages` once shipped through the API. So as soon as you deployed your first configuration with the Director, there will be a new timestamped subdirectory containing the new configuration. Those subdirectories are called stages. You'll often see more than one of them. When a new config is deployed, Icinga 2 tries to restart with that new stage. In case it fails, Icinga 2 will keep running with the former configuration. When it succeeds, it will terminate the old process and keep running with the new configuration. In either scenario, it writes an exit code and its startup log to the corresponding stage directory. This allows the Director to check back later on to fetch this information. That's why you see all those nice startup log outputs along with your deployment history in your frontend. The configuration in such a stage directory is structured like your Icinga 2 config directory in `/etc`: there is a `conf.d` and a `zones.d` subdirectory. In `zones.d` Director will create a subdirectory for each Zone it wants to deploy config to. Please note that those `zones.d` subdirectories are subject to config sync. To get them syncronized to other nodes, the following must be true for them: * they must have a zone definition for that zone in their local config * they must make part of your deployment endpoints zone or be a direct or indirect subzone of that one * the `accept_config` setting must be `true` in their `ApiListener` object definition The director does not try to create additional zones your nodes do not know about. In a distributed environment it is essential that the Director can ship parts of the configuration to specific zones and other parts to a global zone. The name of its preferred global zone is currently hardcoded to `director-global`. Please make sure that such a zone exists on all involved nodes that should get config from the Director in a direct or indirect way: ```icinga2 object Zone "director-global" { global = true } ``` Please do not use this zone for your own configuration files. There is a zone called `global-templates` available in default Icinga setups that's meant for configuration files. `director-global` is reserved for use by Icinga Director. Zone membership handling ------------------------ Mostly you do not need to care much about Zones when working with the Director. In case you have no Satellite node, you wouldn't even notice their existence. You are not required to deal with Agent Zones, as the Director does this for you. Please refer to [Working with agents](24-Working-with-agents.md) for related examples. Currently the GUI does not allow you to set the zone property on single objects. You can circumvent this through the Director's [REST API](70-REST-API.md), with Sync rules and through the CLI. However, that shouldn't be part of your normal workflow. So if this restriction causes trouble with what you want to build please let us know. Explain your scenario, make us understand what you want to achieve. We think of this restriction being a good idea, as it makes things easier for most people. That doesn't mean that we would refuse to change our mind on this. At least not if you come up with a very good reasonable use case. Object rendering ---------------- This chapter explains where the Director renders which config object to. * Most objects are rendered to the master zone per default * Templates, commands and apply rules are rendered to the global zone * Objects with a zone property are rendered to that zone, even if they inherited that property * Host objects configured as an Agent are rendered to the master zone, as Director configures them as a Command Execution Bridge * Agents with a zone property respect that setting * Every command is rendered to the global zone per default icingaweb2-module-director-1.11.8/doc/12-Handling-custom-variables.md000066400000000000000000000007751516513262500252400ustar00rootroot00000000000000Working with custom variables =================================================================== Icinga Director allows you to work with custom variables in a very powerful way. It implements the concept of `Data fields`. If you want your users to be able to fill specific custom variables, you need to add corresponding `fields` to Examples -------- * Add fields for existing commands * Allow to fill an [array of interfaces](14-Fields-example-interfaces-array.md) icingaweb2-module-director-1.11.8/doc/14-Fields-example-interfaces-array.md000066400000000000000000000026161516513262500263300ustar00rootroot00000000000000Working with fields - interfaces array example ============================================== This example wants to show you how to make use of the `Array` data type when creating fields for custom variables. First, please got to the `Dashboard` and choose the `Define data fields` dashlet: ![Dashboard - Define data fields](screenshot/director/14_fields-for-interfaces/141_define_datafields.png) Then create a new data field and select `Array` as its data type: ![Define data field - Array](screenshot/director/14_fields-for-interfaces/142_add_datafield.png) Then create a new `Host template` (or use an existing one): ![Define host template](screenshot/director/14_fields-for-interfaces/143_add_host_template.png) Now add your formerly created data field to your template: ![Add field to template](screenshot/director/14_fields-for-interfaces/144_add_template_field.png) That's it, now you are ready to create your first corresponding host. Once you add your formerly created template, a new form field for your custom variable will show up: ![Create host with given field](screenshot/director/14_fields-for-interfaces/145_create_host.png) Have a look at the config preview, it will show you how your `Array`-based custom variable will look like once deployed: ![Host config preview with Array](screenshot/director/14_fields-for-interfaces/146_config_preview.png) icingaweb2-module-director-1.11.8/doc/15-Service-apply-for-example.md000066400000000000000000000040571516513262500251760ustar00rootroot00000000000000Working with Apply for rules - tcp ports example ============================================== This example wants to show you how to make use of `Apply For` rule for services. First you need to define a `tcp_ports` data field of type `Array` assigned to a `Host Template`. Refer to [Working with fields](14-Fields-example-interfaces-array.md) section to setup a data field. You also need to define a `tcp_port` data field of type `String`, we will associate it to a `Service Template` later. Then, please go to the `Dashboard` and choose the `Monitored services` dashlet: ![Dashboard - Monitored services](screenshot/director/15_apply-for-services/151_monitored_services.png) Then create a new `Service template` with check command `tcp`: ![Define service template - tcp](screenshot/director/15_apply-for-services/152_add_service_template.png) Then associate the data field `tcp_port` to this `Service template`: ![Associate field to service template - tcp_port](screenshot/director/15_apply-for-services/153_add_service_template_field.png) Then create a new `apply-rule` for the `Service template`: ![Define apply rule](screenshot/director/15_apply-for-services/154_create_apply_rule.png) Now define the `Apply For` property, select the previously defined field `tcp_ports` associated to the host template. `Apply For` rule define a variable `config` that can be used as `$config$`, it corresponds to the item of the array it will iterate on. Set the `Tcp port` property to `$config$`: ![Add field to template](screenshot/director/15_apply-for-services/155_configure_apply_for.png) (Side note: if you can't see your `tcp_ports` property in `Apply For` dropdown, try to create one host with a non-empty `tcp_ports` value.) That's it, now all your hosts defining a `tcp_ports` variable will be assigned the `Tcp Check` service. Have a look at the config preview, it will show you how `Apply For` services will look like once deployed: ![Host config preview with Array](screenshot/director/15_apply-for-services/156_config_preview.png) icingaweb2-module-director-1.11.8/doc/16-Fields-example-SNMP.md000066400000000000000000000077721516513262500236600ustar00rootroot00000000000000Data Fields example: SNMP ========================= Ever wondered how to provide an easy to use SNMP configuration to your users? That's what we're going to show in this example. Once completed, all your Hosts inheriting a specific (or your "default") Host Template will provide an optional `SNMP version` field. In case you choose no version, nothing special will happen. Otherwise, the host offers additional fields depending on the chosen version. `Community String` for `SNMPv1` and `SNMPv2c`, and five other fields ranging from `Authentication User` to `Auth` and `Priv` types and keys for `SNMPv3`. Your services should now be applied not only based on various Host properties like `Device Type`, `Application`, `Customer` or similar - but also based on the fact whether credentials have been given or not. Prepare required Data Fields ---------------------------- As we already have learned, `Fields` are what allows us to define which custom variables can or should be defined following which rules. We want SNMP version to be a drop-down, and that's why we first define a `Data List`, followed by a `Data Field` using that list: ### Create a new Data List ![Create a new Data List](screenshot/director/16_fields_snmp/161_snmp_versions_create_list.png) ### Fill the new list with SNMP versions ![Fill the new list with SNMP versions](screenshot/director/16_fields_snmp/162_snmp_versions_fill_list.png) ### Create a corresponding Data Field ![Create a Data Field for SNMP Versions](screenshot/director/16_fields_snmp/163_snmp_version_create_field.png) Next, please also create the following elements: * a list *SNMPv3 Auth Types* providing `MD5` and `SHA` * a list *SNMPv3 Priv Types* providing at least `AES` and `DES` * a `String` type field `snmp_community` labelled *SNMP Community* * a `String` type field `snmpv3_user` labelled *SNMPv3 User* * a `String` type field `snmpv3_auth` labelled *SNMPv3 Auth* (authentication key) * a `String` type field `snmpv3_priv` labelled *SNMPv3 Priv* (encryption key) * a `Data List` type field `snmpv3_authprot` labelled *SNMPv3 Auth Type* * a `Data List` type field `snmpv3_privprot` labelled *SNMPv3 Priv Type* Please do not forget to add meaningful descriptions, telling your users about in-house best practices. Assign your shiny new Fields to a Template ------------------------------------------ I'm using my default Host Template for this, but one might also choose to provide `SNMP version` on Network Devices. Should Network Device be a template? Or just an option in a `Device Type` field? You see, the possibilities are endless here. This screenshot shows part of my assigned Fields: ![SNMP Fields on Default Host](screenshot/director/16_fields_snmp/164_snmp_fields_on_template.png) While I kept `SNMP Version` optional, all other fields are mandatory. Use your Template ----------------- As soon as you choose your template, a new field is shown: ![Choose SNMP version](screenshot/director/16_fields_snmp/165_host_snmp_choose.png) In case you change it to `SNMPv2c`, a `Community String` will be required: ![Community String for SNMPv2c](screenshot/director/16_fields_snmp/166_host_snmp_v2c.png) Switch it to SNMPv3 to see completely different fields: ![Auth and Priv properties for SNMPv3](screenshot/director/16_fields_snmp/167_host_snmp_v3.png) Once stored please check the rendered configuration. Switch the SNMP versions forth and back, and you should see that filtered fields will also remove the corresponding values from the object. Assign Services based on those properties ----------------------------------------- You should design your Commands to use that set of properties. Change the example slightly to fit ITL Commands in case you're using those (snmpv3_*_type VS _alg). Your Cisco Health checks assigned to all: * routers or switches * manufactured by Cisco * with SNMP credentials, regardless of which version ...might then look as follows: ![Assign SNMP-based checks](screenshot/director/16_fields_snmp/168_assign_snmp_check.png) Have fun! icingaweb2-module-director-1.11.8/doc/24-Working-with-agents.md000066400000000000000000000060571516513262500241100ustar00rootroot00000000000000Working with Agents and Config Zones ==================================================================== Working with Icinga 2 Agents can be quite tricky, as each Agent needs its own Endpoint and Zone definition, correct parent, peering host and log settings. There may always be reasons for a completely custom-made configuration. However, I'd **strongly suggest** using the **Director- assisted** variant. It will save you a lot of headaches. Preparation ----------- Agent settings are not available for modification directly on a host object. This requires you to create an "Icinga Agent" template. You could name it exactly like that; it's important to use meaningful names for your templates. ![Create an Agent template](screenshot/director/24-agents/2401_agent_template.png) As long as you're not using Satellite nodes, a single Agent zone is all you need. Otherwise, you should create one Agent template per satellite zone. If you want to move an Agent to a specific zone, just assign it the correct template and you're all done. Usage ----- Well, create a host, choose an Agent template, that's it: ![Create an Agent-based host](screenshot/director/24-agents/2402_create_agent_based_host.png) Once you import the "Icinga Agent" template, you'll see a new "Agent" tab. It tries to assist you with the initial Agent setup by showing a sample config: ![Agent instructions 1](screenshot/director/24-agents/2403_show_agent_instructions_1.png) ![Agent instructions 2](screenshot/director/24-agents/2404_show_agent_instructions_2.png) The preview shows that the Icinga Director would deploy multiple objects for your newly created host: ![Agent preview](screenshot/director/24-agents/2405_agent_preview.png) Create Agent-based services --------------------------- Similar game for services that should run on your Agents. First, create a template with a meaningful name. Then, define that Services inheriting from this template should run on your Agents. ![Agent-based service](screenshot/director/24-agents/2406_agent_based_service.png) Please do not set a cluster zone, as this would rarely be necessary. Agent-based services will always be deployed to their Agent's zone by default. All you need to do now for services that should be executed on your Agents is importing that template: ![Agent-based load check](screenshot/director/24-agents/2407_create_agent_based_load_check.png) Config preview shows that everything works as expected: ![Agent-based service preview](screenshot/director/24-agents/2409_agent_based_service_rendered_for_host.png) It's perfectly valid to assign services to host templates. Look how the generated config differs now: ![Agent-based service assigned to host template](screenshot/director/24-agents/2410_agent_based_service_rendered_for_host_template.png) While services added to a host template are implicitly rendered as assign rules, you could of course also use your `Agent-based service` template in custom apply rules: ![Agent-based service applied](screenshot/director/24-agents/2411_assign_agent_based_service.png) icingaweb2-module-director-1.11.8/doc/30-Configuration-Baskets.md000066400000000000000000000112151516513262500244260ustar00rootroot00000000000000 Importing Director Configurations with Baskets =================================================================== Director already takes care of importing configurations for monitored objects. This same concept is also useful for Director's internal configuration. *Configuration Baskets* allow you to export, import, share and restore all or parts of your Icinga Director configuration, as many times as you like. Configuration baskets can save or restore the configurations for almost all internal Director objects, such as host groups, host templates, service sets, commands, notifications, sync rules, and much more. Because configuration baskets are supported directly in Director, all customizations included in your Director configuration are imported and exported properly. Each snapshot is a persistent, serialized (JSON) representation of all involved objects at that moment in time. Configuration baskets allow you to: - Back up (take a snapshot) and restore a Director configuration... - To be able to restore in case of a misconfiguration you have deployed - Copy specific objects as a static JSON file to migrate them from testing to production - Understand problems stemming from your changes with a diff between two configurations - Share configurations with others, either your entire environment or just specific parts such as commands - Choose only some elements to snapshot (using a *custom selection*) in a given category such as a subset of Host Templates In addition, you can script some changes with the following command: ``` # icingacli director basket [options] ``` Using Configuration Baskets --------------------------- To create or use a configuration basket, select **Icinga Director > Configuration Baskets**. At the top of the new panel are options to: - Make a completely new configuration basket with the *Create* action - Make a new basket by importing a previously saved JSON file with the *Upload* action At the bottom you will find the list of existing baskets and the number of snapshots in each. Selecting a basket will take you to the tabs for editing baskets and for taking snapshots. ### Create a New Configuration Basket To create or edit a configuration basket, give it a name, and then select whether each of the configuration elements should appear in snapshots for that basket. The following choices are available for each element type: - **Ignore:** Do not put this element in snapshots (for instance, do not include sync rules). - **All of them:** Put all items of this element type in snapshots (for example, all host templates). - **Custom Selection:** Put only specified items of this element type in a snapshot. You will have to manually mark each element on the element itself. For instance, if you have marked host templates for custom selection, then you will have to go to each of the desired host templates and select the action *Add to Basket*. This will cause those particular host templates to be included in the next snapshot. ### Uploading and Editing Saved Baskets If you or someone else has created a serialized JSON snapshot (see below), you can upload that basket from disk. Select the *Upload* action, give it a new name, use the file chooser to select the JSON file, and click on the *Upload* button. The new basket will appear in the list of configuration baskets. Editing a basket is simple: Click on its name in the list of configuration baskets to edit either the basket name or else whether and how each configuration type will appear in snapshots. ### Managing Snapshots From the *Snapshots* panel you can create a new snapshot by clicking on the *Create Snapshot* button. The new snapshot should immediately appear in the table below, along with a short summary of the included types (e.g., *2x HostTemplate*) and the time. If no configuration types were selected for inclusion, the summary for that row will only show a dash instead of types. Clicking on a row summary will take you to the *Snapshot* panel for that snapshot, with the actions - **Show Basket:** Edit the basket that the snapshot was created from - **Restore:** Requests the target Director database; clicking on the *Restore* button will begin the process of restoring from the snapshot. Configuration types that are not in the snapshot will not be replaced. - **Download:** Saves the snapshot as a local JSON file. followed by its creation date, checksum, and a list of all configured types (or custom selections). For each item in that list, the keywords *unchanged* or *new* will appear to the right. Clicking on *new* will show the differences between the version in the snapshot and the current configuration. icingaweb2-module-director-1.11.8/doc/60-CLI.md000066400000000000000000000565071516513262500206540ustar00rootroot00000000000000Director CLI ============================ Large parts of the Director's functionality are also available on your CLI. Manage Objects -------------- Use `icingacli director ` show, create modify or delete Icinga objects of a specific type: | Action | Description | |--------------|---------------------------------------| | `create` | Create a new object | | `delete` | Delete a specific object | | `exists` | Whether a specific object exists | | `set` | Modify an existing objects properties | | `show` | Show a specific object | Currently the following object types are available on CLI: * command * endpoint * host * hostgroup * notification * service * timeperiod * user * usergroup * zone ### Create a new object Use this command to create a new Icinga object #### Usage `icingacli director create [] [options]` #### Options | Option | Description | |-------------------|-------------------------------------------------------| | `-- ` | Provide all properties as single command line options | | `--json` | Otherwise provide all options as a JSON string | #### Examples To create a new host you can provide all of its properties as command line parameters: ```shell icingacli director host create localhost \ --imports generic-host \ --address 127.0.0.1 \ --vars.location 'My datacenter' ``` It would say: Host 'localhost' has been created Providing structured data could become tricky that way. Therefore you are also allowed to provide JSON formatted properties: ```shell icingacli director host create localhost \ --json '{ "address": "127.0.0.1", "vars": { "test": [ "one", "two" ] } }' ``` Passing JSON via STDIN is also possible: ```shell icingacli director host create localhost --json < my-host.json ``` ### Delete a specific object Use this command to delete a single Icinga object. Just run icingacli director delete That's it. To delete the host created before, this would read icingacli director host delete localhost It will tell you whether your command succeeded: Host 'localhost' has been deleted ### Whether a specific object exists Use this command to find out whether a single Icinga object exists. Just run: icingacli director exists So if you run... icingacli director host exists localhost ...it will either tell you ... Host 'localhost' exists ...or: Host 'localhost' does not exist When executed from custom scripts you could also just check the exit code, `0` means that the object exists, `1` that it doesn't. ### Modify an existing objects properties Use this command to modify specific properties of an existing Icinga object. #### Usage icingacli director set [options] #### Options | Option | Description | |----------------------------|-------------------------------------------------------| | `-- ` | Provide all properties as single command line options | | `--append- ` | Appends to array values, like `imports`, | | | `groups` or `vars.system_owners` | | `--remove- []` | Remove a specific property, potentially only | | | when matching `value`. In case the property is an | | | array it will remove just `value` when given | | `--json` | Otherwise provide all options as a JSON string | | `--replace` | Replace all object properties with the given ones | | `--auto-create` | Create the object in case it does not exist | | `--allow-overrides` | Set variable overrides for virtual Services | #### Examples ```shell icingacli director host set localhost \ --address 127.0.0.2 \ --vars.location 'Somewhere else' ``` It will either tell you Host 'localhost' has been modified or, when for example issued immediately a second time: Host 'localhost' has not been modified Like create, this also allows you to provide JSON-formatted properties: ```shell icingacli director host set localhost --json '{ "address": "127.0.0.2" }' ``` This command will fail in case the specified object does not exist. This is when the `--auto-create` parameter comes in handy. Command output will tell you whether an object has either been created or (not) modified. With `set` you only set the specified properties and do not touch the other ones. You could also want to completely override an object, purging all other unspecified parameters that might already exist. Please use `--replace` if this is the desired behaviour. ### Show a specific object Use this command to show single objects rendered as Icinga 2 config or in JSON format. #### Usage `icingacli director show [options]` #### Options | Option | Description | |-------------------|------------------------------------------------------| | `--resolved` | Resolve all inherited properties and show a flat | | | object | | `--json` | Use JSON format | | `--no-pretty` | JSON is pretty-printed per default (for PHP >= 5.4) | | | Use this flag to enforce unformatted JSON | | `--no-defaults` | Per default JSON output skips null or default values | | | With this flag you will get all properties | | `--with-services` | For hosts only, also shows attached services | ### Clone an existing object Use this command to clone a specific object. #### Usage `icingacli director clone --from [options]` #### Options | Option | Description | |---------------------|-----------------------------------------------------| | `--from ` | The name of the object you want to clone | | `-- ` | Override specific properties while cloning | | `--replace` | In case an object already exists replace it | | | with the clone | | `--flat` | Do no keep inherited properties but create a flat | | | object with all resolved/inherited properties | #### Examples ```shell icingacli director host clone localhost2 --from localhost ``` ```shell icingacli director host clone localhost3 --from localhost --address 127.0.0.3 ``` ### Other interesting tasks #### Rename objects There is no rename command, but a simple `set` can easily accomplish this task: icingacli director host set localhost --object_name localhost2 Please note that it is usually absolutely no problem to rename objects with the Director. Even renaming something essential as a template like the famous `generic-host` will not cause any trouble. At least not unless you have other components outside your Director depending on that template. #### Disable an object Objects can be disabled. That way they will still exist in your Director DB, but they will not be part of your next deployment. Toggling the `disabled` property is all you need: icingacli director host set localhost --disabled Valid values for booleans are `y`, `n`, `1` and `0`. So to re-enable an object you could use: icingacli director host set localhost --disabled n #### Working with booleans As we learned before, `y`, `n`, `1` and `0` are valid values for booleans. But custom variables have no data type. And even if there is such, you could always want to change or override this from CLI. So you usually need to provide booleans in JSON format in case you need them in a custom variable. There is however one exception from this rule. CLI parameters without a given value are handled as boolean flags by the Icinga Web 2 CLI. That explains why the example disabling an object worked without passing `y` or `1`. You could use this also to set a custom variable to boolean `true`: icingacli director host set localhost --vars.some_boolean Want to change it to false? No chance this way, you need to pass JSON: icingacli director host set localhost --json '{ "vars.some_boolean": false }' This example shows the dot-notation to set a specific custom variable. If we have had used `{ "vars": { "some_boolean": false } }`, all other custom vars on this object would have been removed. #### Change object types The Icinga Director distincts between the following object types: | Type | Description | |-------------------|-------------------------------------------------------------| | `object` | The default object type. A host, a command and similar | | `template` | An Icinga template | | `apply` | An apply rule. This allows for assign rules | | `external_object` | An external object. Can be referenced and used, will not be | | | deployed | Example for creating a host template: ```sh icingacli director host create 'Some template' \ --object_type template \ --check_command hostalive ``` Please take a lot of care when modifying object types, you should not do so for a good reason. The CLI allows you to issue operations that are not allowed in the web frontend. Do not use this unless you really understand its implications. And remember, with great power comes great responsibility. Import/Export Director Objects ------------------------------ Some objects are not directly related to Icinga Objects but used by the Director to manage them. To make it easier for administrators to for example pre-fill an empty Director Instance with Import Sources and Sync Rules, related import/export commands come in handy. Use `icingacli director export [options]` to export objects of a specific type: | Type | Description | |-----------------------|-------------------------------------------------| | `datafields` | Export all DataField definitions | | `datalists` | Export all DataList definitions | | `hosttemplatechoices` | Export all IcingaTemplateChoiceHost definitions | | `importsources` | Export all ImportSource definitions | | `jobs` | Export all Job definitions | | `syncrules` | Export all SyncRule definitions | #### Options | Option | Description | |---------------|------------------------------------------------------| | `--no-pretty` | JSON is pretty-printed per default. Use this flag to | | | enforce unformatted JSON | Use `icingacli director import < exported.json` to import objects of a specific type: | Type | Description | |-----------------------|-------------------------------------------------| | `importsources` | Import ImportSource definitions from STDIN | | `syncrules` | Import SyncRule definitions from STDIN | This feature is available since v1.5.0. Director Configuration Basket ----------------------------- A basket contains a set of Director Configuration objects (like Templates, Commands, Import/Sync definitions - but not single Hosts or Services). This CLI command allows you to integrate them into your very own workflows ## Available Actions | Action | Description | |------------|---------------------------------------------------| | `dump` | JSON-dump for objects related to the given Basket | | `list` | List configured Baskets | | `restore` | Restore a Basket from JSON dump provided on STDIN | | `snapshot` | Take a snapshot for the given Basket | ### Options | Option | Description | |----------|------------------------------------------------------| | `--name` | `dump` and `snapshot` require a specific object name | Use `icingacli director basket restore < exported-basket.json` to restore objects from a specific basket. Take a snapshot or a backup first to be on the safe side. This feature is available since v1.6.0. Health Check Plugin ------------------- You can use the Director CLI as an Icinga CheckPlugin and monitor your Director Health. This will run all or just one of the following test suites: | Name | Description | |--------------|-------------------------------------------------------------------| | `config` | Configuration, Schema, Migrations | | `sync` | All configured Sync Rules (pending changes are not a problem) | | `import` | All configured Import Sources (pending changes are not a problem) | | `jobs` | All configured Jobs (ignores disabled ones) | | `deployment` | Deployment Endpoint, last deployment outcome | #### Usage `icingacli director health check [options]` #### Options | Option | Description | |------------------|---------------------------------------| | `--check ` | Run only a specific test suite | | `-- ` | Use a specific Icinga Web DB resource | #### Examples ```shell icingacli director health check ``` Example for running a check only for the configuration: ```shell icingacli director health check --check config ``` Sample output: ``` Director configuration: 5 tests OK [OK] Database resource 'Director DB' has been specified' [OK] Make sure the DB schema exists [OK] There are no pending schema migrations [OK] Deployment endpoint is 'icinga.example.com' [OK] There is a single un-deployed change ``` Kickstart and schema handling ----------------------------- The `kickstart` and the `migration` command are handled in the [automation section](03-Automation.md), so they are skipped here. Configuration handling ---------------------- ### Render your configuration The Director distincts between rendering and deploying your configuration. Rendering means that Icinga 2 config will be pre-rendered and stored to the Director DB. Nothing bad happens if you decide to render the current config thousands of times in a loop. In case a config with the same checksum already exists, it will store - nothing. You can trigger config rendering by running ```shell icingacli director config render ``` In case a new config has been created, it will tell you so: ``` New config with checksum b330febd0820493fb12921ad8f5ea42102a5c871 has been generated ``` Run it once again, and you'll see that the output changes: ``` Config with checksum b330febd0820493fb12921ad8f5ea42102a5c871 already exists ``` ### Config deployment #### Usage `icingacli director config deploy [options]` #### Options | Option | Description | |----------------------------|------------------------------------------------------------------| | `--checksum ` | Optionally deploy a specific configuration | | `--force` | Force a deployment, even when the configuration hasn't changed | | `--wait ` | Optionally wait until Icinga completed it's restart | | `--grace-period ` | Do not deploy if a deployment took place less than ago | #### Examples You do not need to explicitly render your config before deploying it to your Icinga 2 master node. Just trigger a deployment, it will re-render the current config: ```shell icingacli director config deploy ``` The output tells you which config has been shipped: ``` Config 'b330febd0820493fb12921ad8f5ea42102a5c871' has been deployed ``` Director tries to avoid needless deployments, so in case you immediately deploy again, the output changes: ``` Config matches active stage, nothing to do ``` You can override this by adding the `--force` parameter. It will then tell you: ``` Config matches active stage, deploying anyway ``` In case you do not want `deploy` to waste time re-rendering your config or in case you decide to re-deploy a specific, possibly older, config version the `deploy` command allows you to provide a specific checksum: ```shell icingacli director config deploy --checksum b330febd0820493fb12921ad8f5ea42102a5c871 ``` When using `icingacli` deployments in an automated way, and want to avoid fast consecutive deployments, you can provide a grace period: ```shell icingacli director config deploy --grace-period 300 ``` ### Deployments status In case you want to fetch the information about the deployments status, you can call the following CLI command: ```shell icingacli director config deploymentstatus ``` ```json { "active_configuration": { "stage_name": "5c65cae0-4f1b-47b4-a890-766c82681622", "config": "617b9cbad9e141cfc3f4cb636ec684bd60073be1", "activity": "4f7bc6600dd50a989f22f82d3513e561ef333363" } } ``` In case there is no active stage name related to the Director, active_configuration is set to null. Another possibility is to pass a list of checksums to fetch the status of specific deployments and (activity log) activities. Following, you can see an example of how to do it: ```shell icingacli director config deploymentstatus \ --configs 617b9cbad9e141cfc3f4cb636ec684bd60073be1 \ --activities 4f7bc6600dd50a989f22f82d3513e561ef333363 ``` ```json { "active_configuration": { "stage_name": "5c65cae0-4f1b-47b4-a890-766c82681622", "config": "617b9cbad9e141cfc3f4cb636ec684bd60073be1", "activity": "4f7bc6600dd50a989f22f82d3513e561ef333363" }, "configs": { "617b9cbad9e141cfc3f4cb636ec684bd60073be1": "active" }, "activities": { "4f7bc6600dd50a989f22f82d3513e561ef333363": "active" } } ``` You can also decide to access directly to a value inside the result JSON by using the `--key` param: ```shell icingacli director config deploymentstatus \ --configs 617b9cbad9e141cfc3f4cb636ec684bd60073be1 \ --activities 4f7bc6600dd50a989f22f82d3513e561ef333363 \ --key active_configuration.config ``` ``` 617b9cbad9e141cfc3f4cb636ec684bd60073be1 ``` ### Cronjob usage You could decide to pre-render your config in the background quite often. As of this writing this has one nice advantage. It allows the GUI to find out whether a bunch of changes still results into the very same config. only one Run sync and import jobs ------------------------ ### Import Sources #### List available Import Sources This shows a table with your defined Import Sources, their IDs and current state. As triggering Imports requires an ID, this is where you can look up the desired ID. `icingacli director importsource list` #### Check a given Import Source for changes This command fetches data from the given Import Source and compares it to the most recently imported data. `icingacli director importsource check --id ` ##### Options | Option | Description | |---------------|---------------------------------------------------------| | `--id ` | An Import Source ID. Use the list command to figure out | | `--benchmark` | Show timing and memory usage details | #### Fetch data from a given Import Source This command fetches data from the given Import Source and outputs them as plain JSON `icingacli director importsource fetch --id ` ##### Options | Option | Description | |---------------|---------------------------------------------------------| | `--id ` | An Import Source ID. Use the list command to figure out | | `--benchmark` | Show timing and memory usage details | #### Trigger an Import Run for a given Import Source This command fetches data from the given Import Source and stores it to the Director DB, so that the next related Sync Rule run can work with fresh data. In case data didn't change, nothing is going to be stored. `icingacli director importsource run --id ` ##### Options | Option | Description | |---------------|---------------------------------------------------------| | `--id ` | An Import Source ID. Use the list command to figure out | | `--benchmark` | Show timing and memory usage details | ### Sync Rules #### List defined Sync Rules This shows a table with your defined Sync Rules, their IDs and current state. As triggering a Sync requires an ID, this is where you can look up the desired ID. `icingacli director syncrule list` #### Check a given Sync Rule for changes This command runs a complete Sync in memory but doesn't persist eventual changes. `icingacli director syncrule check --id ` ##### Options | Option | Description | |---------------|----------------------------------------------------| | `--id ` | A Sync Rule ID. Use the list command to figure out | | `--benchmark` | Show timing and memory usage details | #### Trigger a Sync Run for a given Sync Rule This command builds new objects according your Sync Rule, compares them with existing ones and persists eventual changes. `icingacli director syncrule run --id ` ##### Options | Option | Description | |---------------|----------------------------------------------------| | `--id ` | A Sync Rule ID. Use the list command to figure out | | `--benchmark` | Show timing and memory usage details | Database housekeeping --------------------- Your database may grow over time and ask for various housekeeping tasks. You can usually store a lot of data in your Director DB before you would even notice a performance impact. Still, we started to prepare some tasks that assist with removing useless garbage from your DB. You can show available tasks with: icingacli director housekeeping tasks The output might look as follows: ``` Housekeeping task (name) | Count -----------------------------------------------------------|------- Undeployed configurations (oldUndeployedConfigs) | 3 Unused rendered files (unusedFiles) | 0 Unlinked imported row sets (unlinkedImportedRowSets) | 0 Unlinked imported rows (unlinkedImportedRows) | 0 Unlinked imported properties (unlinkedImportedProperties) | 0 ``` You could run a specific task with icingacli director housekeeping run ...like in: icingacli director housekeeping run unlinkedImportedRows Or you could also run all of them, that's the preferred way of doing this: icingacli director housekeeping run ALL Please note that some tasks once issued create work for other tasks, as lost imported rows might appear once you remove lost row sets. So `ALL` is usually the best choice as it runs all of them in the best order. icingaweb2-module-director-1.11.8/doc/70-Import-and-Sync.md000066400000000000000000000072371516513262500231660ustar00rootroot00000000000000Import and Synchronization ====================================================== Icinga Director offers very powerful mechanisms when it comes to fetching data from external data sources. The following examples should give you a quick idea of what you might want to use this feature for. Please note that Import Data Sources are implemented as hooks in Director. This means that it is absolutely possible and probably very easy to create custom data sources for whatever kind of data you have. And you do not need to modify the Director source code for this, you can ship your very own importer in your very own Icinga Web 2 module. Examples -------- ### Import Servers from MS Active Directory #### Create a new import source Importing data from LDAP sources is pretty easy. We use MS Active Directory as an example source: ![Import source](screenshot/director/08_import-and-sync/081_director_import_source.png) You must formerly have configured a corresponding LDAP resource in your Icinga Web. Then you choose your preferred object class, you might add custom filters, a search base should always be set. The only tricky part here are the chosen Properties. You must know them and you are required to fill them in, no way around this right now. Also please choose one column as your key column. In case you want to avoid trouble please make this the column that corresponds to your desired object name for the objects you are going to import. Rows duplicating this property will be considered erroneous, the Import would fail. #### Property modifiers Data sources like SQL databases provide very powerful modifiers themselves. With a handcrafted query you can solve lots of data conversion problems. Sometimes this is not possible, and some sources (like LDAP) do not even have such features. This is where property modifiers jump in to the rescue. Your computer names are uppercase and you hate this? Use the lowercase modifier: ![Lowercase modifier](screenshot/director/08_import-and-sync/082_director_import_modifier_lowercase.png) You want to have the object SID as a custom variable, but the data is stored binary in your AD? There is a dedicated modifier: ![SID modifier](screenshot/director/08_import-and-sync/083_director_import_modifier_sid.png) You do not agree with the way Microsoft represents its version numbers? Regular expressions are able to fix everything: ![Regular expression modifier](screenshot/director/08_import-and-sync/084_director_import_modifier_regex.png) #### Preview A quick look at the preview confirms that we reached a good point, that's the data we want: ![Import preview](screenshot/director/08_import-and-sync/085_director_import_preview.png) #### Synchronization The Import itself just fetches raw data, it does not yet try to modify any of your Icinga objects. That's what the Sync rules have been designed for. This distinction has a lot of advantages when it goes to automatic scheduling for various import and sync jobs. When creating a Synchronization rule, you must decide which Icinga objects you want to work with. You could decide to use the same import source in various rules with different filters and properties. ![Synchronization rule](screenshot/director/08_import-and-sync/086_director_sync_rule_ad_hosts.png) For every property you must decide whether and how it should be synchronized. You can also define custom expressions, combine multiple source fields, set custom properties based on custom conditions and so on. ![Synchronization properties](screenshot/director/08_import-and-sync/087_director_sync_properties_ad_host.png) Now you are all done and ready to a) launch the Import and b) trigger your synchronization run. icingaweb2-module-director-1.11.8/doc/70-REST-API.md000066400000000000000000000432161516513262500214230ustar00rootroot00000000000000The Icinga Director REST API ================================================= Introduction ------------ Icinga Director has been designed with a REST API in mind. Most URLs you can access with your browser will also act as valid REST url endpoints. Base Headers ------------ All your requests MUST have a valid accept header. The only acceptable variant right now is `application/json`, so please always append a header as follows to your requests: Accept: application/json Authentication -------------- Please use HTTP authentication and any valid Icinga Web 2 user, granted enough permissions to accomplish the desired actions. The restrictions and permissions that have been assigned to web users will also be enforced for API users. In addition, the permission `director/api` is required for any API access. Versioning ---------- There are no version strings so far in the Director URLs. We will try hard to not break compatibility with future versions. Sure, sooner or later we also might be forced to introduce some kind of versioning. But who knows? As a developer you can trust us to not remove any existing REST url or any provided property. However, you must always be ready to accept new properties. URL scheme and supported methods -------------------------------- We support GET, POST, PUT and DELETE. | Method | Meaning | |--------|---------------------------------------------------------------------| | GET | Read / fetch data. Not allowed to run operations with the potential | | | to cause any harm | | POST | Trigger actions, create or modify objects. Can also be used to | | | partially modify objects | | PUT | Creates or replaces objects, cannot be used to modify single object | | | properties | | DELETE | Remove a specific object | TODO: more examples showing the difference between POST and PUT POST director/host gives 201 on success GET director/host?name=hostname.example.com PUT director/host?name=hostname.example.com gives 200 ok on success and 304 not modified on no change DELETE director/host?name=hostname.example.com gives 200 on success First example request with CURL ------------------------------- ```sh curl -H 'Accept: application/json' \ -u 'username:password' \ 'https://icinga.example.com/icingaweb2/director/host?name=hostname.example.com' ``` ### CURL helper script A script like the following makes it easy to play around with curl: ```sh METHOD=$1 URL=$2 BODY="$3" USERNAME="demo" PASSWORD="***" test -z "$PASSWORD" || USERNAME="$USERNAME:$PASSWORD" test -z "$BODY" && curl -u "$USERNAME" \ -i https://icingaweb/icingaweb/$URL \ -H 'Accept: application/json' \ -X $METHOD test -z "$BODY" || curl -u "$USERNAME" \ -i https://icingaweb/icingaweb/$URL \ -H 'Accept: application/json' \ -X $METHOD \ -d "$BODY" echo ``` It can be used as follows: ```sh director-curl GET director/host?name=localhost director-curl POST director/host '{"object_name": "host2", "... }' ``` Should I use HTTPS? ------------------- Sure, absolutely, no doubt. There is no, absolutely no reason to NOT use HTTPS these days. Especially not for a configuration tool allowing you to configure check commands that are going to be executed on all your servers. Icinga Objects -------------- ### Special parameters | Parameter | Description | |----------------|-------------------------------------------------------------| | resolved | Resolve all inherited properties and show a flat object | | withNull | Retrieve default (null) properties also | | withServices | Show services attached to a host. `resolved` and `withNull` | | | are applied for services too | | allowOverrides | Set variable overrides for virtual Services | | showStacktrace | Returns the related stack trace, in case an error occurs | #### Resolve object properties In case you add the `resolved` parameter to your URL, all inherited object properties will be resolved. Such a URL could look as follows: director/host?name=hostname.example.com&resolved #### Retrieve default (null) properties also Per default properties with `null` value are skipped when shipping a result. You can influence this behavior with the `properties` parameter. Just append `&withNull` to your URL: director/host?name=hostname.example.com&withNull #### Fetch host with it's services This is what the `withServices` parameter exists: director/host?name=hostname.example.com&withServices #### Retrieve only specific properties The `properties` parameter also allows you to specify a list of specific properties. In that case, only the given properties will be returned, even when they have no (`null`) value: director/host?name=hostname.example.com&properties=object_name,address,vars #### Override vars for inherited/applied Services Enabling `allowOverrides` allows you to let Director figure out, whether your modified Custom Variables need to be applied to a specific individual Service, or whether setting Overrides at Host level is the way to go. POST director/service?name=Uptime&host=hostname.example.com&allowOverrides ```json { "vars.uptime_warning": 300 } ``` In case `Uptime` is an Apply Rule, calling this without `allowOverrides` will trigger a 404 response. Please note that when modifying the Host object, the body for response 200 will show the Host object, as that's the one that has been modified. ### Example GET director/host?name=pe2015.example.com ```json { "address": "127.0.0.3", "check_command": null, "check_interval": null, "display_name": "pe2015 (example.com)", "enable_active_checks": null, "flapping_threshold": null, "groups": [ ], "imports": [ "generic-host" ], "retry_interval": null, "vars": { "facts": { "aio_agent_build": "1.2.5", "aio_agent_version": "1.2.5", "architecture": "amd64", "augeas": { "version": "1.4.0" }, ... } ``` director/host?name=pe2015.example.com&resolved ```json { "address": "127.0.0.3", "check_command": "tom_ping", "check_interval": "60", "display_name": "pe2015 (example.com)", "enable_active_checks": true, "groups": [ ], "imports": [ "generic-host" ], "retry_interval": "10", "vars": { "facts": { "aio_agent_build": "1.2.5", "aio_agent_version": "1.2.5", "architecture": "amd64", "augeas": { "version": "1.4.0" }, ... } ``` JSON is pretty-printed per default, at least for PHP >= 5.4 Error handling -------------- Director tries hard to return meaningful output and error codes: ``` HTTP/1.1 400 Bad Request Server: Apache Content-Length: 46 Connection: close Content-Type: application/json ``` ```json { "error": "Invalid JSON: Syntax error" } ``` Trigger actions --------------- You can of course also use the API to trigger specific actions. Deploying the configuration is as simple as issueing: POST director/config/deploy More ---- Currently, we do not handle Last-Modified und ETag headers. This would involve some work, but could be a cool feature. Let us know your ideas! Sample scenario --------------- Let's show you how the REST API works with a couple of practical examples: ### Create a new host ``` POST director/host ``` ```json { "object_name": "apitest", "object_type": "object", "address": "127.0.0.1", "vars": { "location": "Berlin" } } ``` #### Response ``` HTTP/1.1 201 Created Date: Tue, 01 Mar 2016 04:43:55 GMT Server: Apache Content-Length: 140 Content-Type: application/json ``` ```json { "address": "127.0.0.1", "object_name": "apitest", "object_type": "object", "vars": { "location": "Berlin" } } ``` The most important part of the response is the response code: `201`, a resource has been created. Just for fun, let's fire the same request again. The answer obviously changes: ``` HTTP/1.1 500 Internal Server Error Date: Tue, 01 Mar 2016 04:45:04 GMT Server: Apache Content-Length: 60 Connection: close Content-Type: application/json ``` ```json { "error": "Trying to recreate icinga_host (apitest)" } ``` So, let's update this host. To work with existing objects, you must ship their `name` in the URL: POST director/host?name=apitest ```json { "object_name": "apitest", "object_type": "object", "address": "127.0.0.1", "vars": { "location": "Berlin" } } ``` Same body, so no change: ``` HTTP/1.1 304 Not Modified Date: Tue, 01 Mar 2016 04:45:33 GMT Server: Apache ``` So let's now try to really change something: POST director/host?name=apitest ```json {"address": "127.0.0.2", "vars.event": "Icinga CAMP" } ``` We get status `200`, changes have been applied: ``` HTTP/1.1 200 OK Date: Tue, 01 Mar 2016 04:46:25 GMT Server: Apache Content-Length: 172 Content-Type: application/json ``` ```json { "address": "127.0.0.2", "object_name": "apitest", "object_type": "object", "vars": { "location": "Berlin", "event": "Icinga CAMP" } } ``` The response always returns the full object on modification. This way you can immediately investigate the merged result. As you can see, `POST` requests only touch the parameters you passed - the rest remains untouched. One more example to prove this: ``` POST director/host?name=apitest ``` ```json {"address": "127.0.0.2", "vars.event": "Icinga CAMP" } ``` No modification, you get a `304`. HTTP standards strongly discourage shipping a body in this case: ``` HTTP/1.1 304 Not Modified Date: Tue, 01 Mar 2016 04:52:05 GMT Server: Apache ``` As you might have noted, we only changed single properties in the vars dictionary. Now lets override the whole dictionary: ``` POST director/host?name=apitest ``` ```json {"address": "127.0.0.2", "vars": { "event": [ "Icinga", "Camp" ] } } ``` The response shows that this works as expected: ``` HTTP/1.1 200 OK Date: Tue, 01 Mar 2016 04:52:33 GMT Server: Apache Content-Length: 181 Content-Type: application/json ``` ```json { "address": "127.0.0.2", "object_name": "apitest", "object_type": "object", "vars": { "event": [ "Icinga", "Camp" ] } } ``` If merging properties is not what you want, `PUT` comes to the rescue: PUT director/host?name=apitest ``` { "vars": { "event": [ "Icinga", "Camp" ] } ``` All other properties vanished, all but name and type: ``` HTTP/1.1 200 OK Date: Tue, 01 Mar 2016 04:54:33 GMT Server: Apache Content-Length: 153 Content-Type: application/json ``` ```json { "object_name": "apitest", "object_type": "object", "vars": { "event": [ "Icinga", "Camp" ] } } ``` Let's put "nothing": PUT director/host?name=apitest ```json {} ``` Works as expected: ``` HTTP/1.1 200 OK Date: Tue, 01 Mar 2016 04:57:35 GMT Server: Apache Content-Length: 62 Content-Type: application/json ``` ```json { "object_name": "apitest", "object_type": "object" } ``` Of course, `PUT` also supports `304`, you can check this by sending the same request again. Now let's try to cheat: KILL director/host?name=apitest ``` HTTP/1.1 400 Bad Request Date: Tue, 01 Mar 2016 04:54:07 GMT Server: Apache Content-Length: 43 Connection: close Content-Type: application/json ``` ```json { "error": "Unsupported method KILL" } ``` Ok, no way. So let's use the correct method: DELETE director/host?name=apitest ``` HTTP/1.1 200 OK Date: Tue, 01 Mar 2016 05:59:22 GMT Server: Apache Content-Length: 109 Content-Type: application/json ``` ```json { "imports": [ "generic-host" ], "object_name": "apitest", "object_type": "object" } ``` ### Service Apply Rules Please note that Service Apply Rule names are not unique in Icinga 2. They are not real objects, they are creating other objects in a loop. This makes it impossible to distinct them by name. Therefore, a dedicated REST API endpoint `director/serviceapplyrules` ships all Service Apply Rules combined with their internal ID. This ID can then be used to modify or delete a Rule via `director/service`. ### Deployment Status In case you want to fetch the information about the deployments status, you can call the following API: GET director/config/deployment-status ``` HTTP/1.1 200 OK Date: Wed, 07 Oct 2020 13:14:33 GMT Server: Apache Content-Type: application/json ``` ```json { "active_configuration": { "stage_name": "b191211d-05cb-4679-842b-c45170b96421", "config": "617b9cbad9e141cfc3f4cb636ec684bd60073be1", "activity": "028b3a19ca7457f5fc9dbb5e4ea527eaf61616a2" } } ``` This throws a 500 in case Icinga isn't reachable. In case there is no active stage name related to the Director, active_configuration is set to null. Another possibility is to pass a list of checksums to fetch the status of specific deployments and (activity log) activities. Following, you can see an example of how to do it: GET director/config/deployment-status?configs=617b9cbad9e141cfc3f4cb636ec684bd60073be2, 617b9cbad9e141cfc3f4cb636ec684bd60073be1&activitiess=617b9cbad9e141cfc3f4cb636ec684bd60073be1, 028b3a19ca7457f5fc9dbb5e4ea527eaf61616a2 ```json { "active_configuration": { "stage_name": "b191211d-05cb-4679-842b-c45170b96421", "config": "617b9cbad9e141cfc3f4cb636ec684bd60073be1", "activity": "028b3a19ca7457f5fc9dbb5e4ea527eaf61616a2" }, "configs": { "617b9cbad9e141cfc3f4cb636ec684bd60073be2": "deployed", "617b9cbad9e141cfc3f4cb636ec684bd60073be1": "active" }, "activities": { "617b9cbad9e141cfc3f4cb636ec684bd60073be1": "undeployed", "028b3a19ca7457f5fc9dbb5e4ea527eaf61616a2": "active" } } ``` The list of possible status is: * `active`: whether this configuration is currently active * `deployed`: whether this configuration has ever been deployed * `failed`: whether the deployment of this configuration has failed * `undeployed`: whether this configuration has been rendered, but not yet deployed * `unknown`: whether no configurations have been found for this checksum ### Agent Tickets The Director is very helpful when it goes to manage your Icinga Agents. In case you want to fetch tickets through the API, please do as follows: GET director/host/ticket?name=apitest ``` HTTP/1.1 200 OK Date: Thu, 07 Apr 2016 22:19:24 GMT Server: Apache Content-Length: 43 Content-Type: application/json ``` ```json "5de9883080e03278039bce57e4fbdbe8fd262c40" ``` Please expect an error in case the host does not exist or has not been configured to be an Icinga Agent. ### Self Service API #### Theory of operation Icinga Director offers a Self Service API, allowing new Icinga nodes to register themselves. No credentials are required, authentication is based on API keys. There are two types of such keys: * Host Template API keys * Host Object API keys Template keys basically grant the permission to: * Create a new host based on that template * Specify name and address properties for that host This is a one-time operation and allows one to claim ownership of a specific host. Now, there are two possible scenarios: * The host already exists * The host is not known to Icinga Director In case the host already exists, Director will check whether it's API key matches the given one. [..] #### Request processing for Host registration A new node will `POST` to `self-service/register-host`, with two parameters in the URL: * `name`: it's desired object name, usually the FQDN * `key`: a valid Host Template API key In it's body it is allowed to specify a specific set of properties. At the time of this writing, these are: * `display_name` * `address` * `address6` Director will validate the `key` and load the corresponding *Host Template*. In case no such is found, the request is rejected. Then it checks whether a *Host* with the given `name` exists. In case it does, the request is rejected unless: * It inherits the loaded *Host Template* * It already has an API key If these conditions match, the request is processed. The following sketch roughly shows the decision tree (AFTER the key has been validated): ``` +-----------------------------+ +--------------+ | * Validate given properties | | Host exists? | -- NO --> | * Create new host object |-----------+ +--------------+ | * Return new Host API key | | | +-----------------------------+ | YES | | | v +-----------------------------+ | +----------------------+ | * Validate given properties | | | Host has an API key? | -- NO --> | * Apply eventual changes |----+ +----------------------+ | * Return new Host API key | | | +-----------------------------+ | YES | | +-------------------+ v | +--------------------+ v | Reject the request | +---------------------+ +--------------------+ | Client persists the | | new Host API key | +---------------------+ ``` icingaweb2-module-director-1.11.8/doc/74-Self-Service-API.md000066400000000000000000000041431516513262500231350ustar00rootroot00000000000000Self Service API ============================================= Introduction ------------ Icinga Director offers a Self Service API, allowing new Hosts running the Icinga Agent to register themselves in a secure way. ### Windows Agents Windows Agents are the main target audience for this feature. It allows you to generate a single Powershell Script based on the [Icinga 2 Powershell Module]( https://github.com/Icinga/icinga2-powershell-module ). You can either use the same script for all of your Windows Hosts or generate different ones for different kind of systems. This installation script could then be shipped with your base images, invoked remotely via **PowerShell Remoting**, distributed as a module via **Group Policies** and/or triggered via **Run-Once** (AD Policies). ### Linux Agents At the time of this writing, we do not ship a script with all the functionality you can find in the Windows Powershell script. Linux and Unix environments are mostly highly automated these days, and such a magic shell script is often not what people want. Still, you can also benefit from this feature by directly using our [Self Service REST API](70-REST-API.md). It should be easy to integrate it into the automation tool of your choice. Base Configuration ------------------ You have full control over the automation Script generated by the Icinga Director. Please got to the **Infrastructure Dashboard** and choose the **Self Service API**: ![Infrastructure Dashboard - Self Service API](screenshot/director/74_self-service-api/7401-director_self-service-dashboard.png) This leads to the Self Service API Settings form. Most settings are self-explaining and come with detailled inline hints. The most important choice is whether the script should automatically install the Icinga Agent: ![Settings - Choose installation source](screenshot/director/74_self-service-api/7402-director_self-service-choose-source.png) In case you opted for automated installation, more options will pop up: ![Settings - Installer Details](screenshot/director/74_self-service-api/7403-director_self-service-settings.png) icingaweb2-module-director-1.11.8/doc/75-Background-Daemon.md000066400000000000000000000035531516513262500235240ustar00rootroot00000000000000Background-Daemon =============================================== The Icinga Director Background Daemon is available (and mandatory) since v1.7.0. It is responsible for various background tasks, including fully automated Import, Sync & Config Deployment Tasks. Daemon Installation ------------------- To run the Background Daemon, you need to tell `systemd` about your new service. First make sure that the system user `icingadirector` exists. In case it doesn't, please create one: ```sh useradd -r -g icingaweb2 -d /var/lib/icingadirector -s /bin/false icingadirector install -d -o icingadirector -g icingaweb2 -m 0750 /var/lib/icingadirector ``` Then copy the provided Unit-File from our [contrib](../contrib/systemd/icinga-director.service) to `/etc/systemd/system`, enable and start the service: ```sh MODULE_PATH=/usr/share/icingaweb2/modules/director cp "${MODULE_PATH}/contrib/systemd/icinga-director.service" /etc/systemd/system/ systemctl daemon-reload ``` Now your system knows about the Icinga Director Daemon. You should make sure that it starts automatically each time your system boots: ```sh systemctl enable icinga-director.service ``` Starting the Daemon ------------------- You now can start the Background daemon like any other service on your Linux system: ```sh systemctl start icinga-director.service ``` Stopping the Daemon ------------------- You now can stop the Background daemon like any other service on your Linux system: ```sh systemctl stop icinga-director.service ``` Getting rid of the old Job Daemon --------------------------------- Before v1.7.0, Icinga Director shipped an optional Job Daemon. This one is no longer needed and should be removed from your system as follows: ```sh systemctl stop director-jobs systemctl disable director-jobs rm /etc/systemd/system/director-jobs.service systemctl daemon-reload ``` icingaweb2-module-director-1.11.8/doc/79-Jobs.md000066400000000000000000000030531516513262500211400ustar00rootroot00000000000000Jobs ===================== The [background daemon](75-Background-Daemon.md) is responsible for running jobs according to our schedule. Director allows you to schedule long- running tasks, so they can run in the background. Currently this includes: * Import runs * Sync runs * Housekeeping tasks * Config rendering and deployment This component is internally provided as a Hook. This allows other Icinga Web 2 modules to benefit from the Job Runner by providing their very own Job implementations. Theory of operation ------------------- Jobs are configured via the Web frontend. You can create multiple definitions for the very same Job. Every single job will run with a configurable interval. Please do not expect this to behave like a scheduler or a cron daemon. Jobs are currently not executed in parallel. Therefore if one job takes longer, it might have an influence on the scheduling of other jobs. Some of you might want actions like automated config deployment not to be executed all around the clock. That's why you have the possibility to assign time periods to your jobs. Choose an Icinga timeperiod, the job will only be executed within that period. Time periods ------------ Icinga time periods can get pretty complex. You configure them with Director, but until now it didn't have the necessity to "understand" them. This of course changed with Time Period support in our Job Runner. Director will try to fully "understand" periods in future, but right now it is only capable to interpret a limited subset of timeperiod range definitions. icingaweb2-module-director-1.11.8/doc/80-FAQ.md000066400000000000000000000063451516513262500206510ustar00rootroot00000000000000Frequently Asked Questions ========================================== I got an exception... --------------------- This section tries to summarize well known pitfalls and their solution. ### Binary data corruption with ZF 1.12.6 and 1.12.17 When deploying your first configuration, you might get this error: Refusing to render the configuration, your DB layer corrupts binary data. You might be affected by Zend Framework bug #655 Zend Framework 1.12.16 and 1.12.17 silently [corrupt binary data](https://github.com/zendframework/zf1/issues/655). This has been [fixed](https://github.com/zendframework/zf1/pull/670) with [1.12.18](https://github.com/zendframework/zf1/releases/tag/release-1.12.18), please either upgrade or downgrade to an earlier version. Debian Stable currently ships 1.12.9, but as they backported the involved erraneous security bug their version has been affected too. In the meantime they also backported the fix for the fix, so Debian should no longer show this error. When you work on a RedHat-based distribution please follow [Bug 1328032](https://bugzilla.redhat.com/show_bug.cgi?id=1328032). The new release reached Fedora EPEL 6 and EPEL 7, so this should no longer be an issue on related platforms. You could also manually fix this issue in `/usr/share/php/Zend/Db/Adapter/Pdo/Abstract.php`. Search for the `_quote` function and delete the line saying: ```php $value = addcslashes($value, "\000\032"); ``` Please note that doing so would fix all problems, but re-introduce a potential security issue affecting the MSSQL and Sqlite adapters. ### Connection error when setting up the database When setting up and validating a database connection for Director in Icinga Web 2, the following error might occur: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. This happens with some PHP versions, we have not been able to figure out which ones and why. However, we found a workaround and and fixed this in Icinga Web 2. Please upgrade to the latest version, the issue should then be gone. You probably didn't notice this error before as in most environments the IDO for historical reasons isn't configured for UTF-8. Connection lost to DB while.... ------------------------------- In case you are creating large configs or handling huge imports with the Director it could happen that the default conservative max package size of your MySQL server bites you. Raise `max packet size` to a reasonable value, this willi usually fix this issue. Import succeeded but nothing happened ------------------------------------- Import and Sync are different tasks, you need to `Run` both of them. This allows us to combine multiple import sources, even it if some of them are slow or failing from time to time. It's easy to oversee those links right now, we'll fix this soon. My Director doesn't look as good as on your screenshots ------------------------------------------------------- There used to be a bug in older Icinga Web 2 versions that broke automagic cache invalidation. So when updating a module you might be forced to do SHIFT-Reload or similar in your browser. Please note that proxies in the way between you and Icinga Web 2 might currently lead to similar issues. icingaweb2-module-director-1.11.8/doc/82-Changelog.md000066400000000000000000002037001516513262500221250ustar00rootroot00000000000000Changelog =============================== Please make sure to always read our [Upgrading](05-Upgrading.md) documentation before switching to a new version. v1.11.8 ------- ### Fixes - Fix: SQLERROR when Displaying Services of a Host (#3058) - Fix: Zend Error when modifying Objects (#3056) You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/44?closed=1) v1.11.7 ------- ### Fixes - Fix: Creating services named identical to template name prevented by cyclic inheritance check (#3036) - Fix: Choosing templates prevented for new templates prevented by cyclic inheritance check (#3039) - Fix: Inherited service not shown in service list of host (#3041) - Fix: An Icinga 2 log-level below 'information' breaks Director's active deployment indicator (#3044) You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/42?closed=1) v1.11.6 ------- ### Database Schema - Fix: Update columns storing large strings to MEDIUMTEXT in MYSQL (no issue) ### UI - Fix: Icinga Host Form shows applied groups that are not in restriction (#3001) - Fix: Host Choices shows the partially wrong template at Associated Template (#2982) - Fix: inherited "disabled" services not crossed out (#2983) - Fix: Hidden datafields should forbid autocompletion (#2347) - Fix: Cyclic inheritance causes UI to crash (#2853) - Fix: Clicking Groups repeatedly (x2) leads to "Page not found" (#2538) - Fix: Users with Director restrictions unable to create hosts unless you manually specify the host group (#2876) - Feature: Add support for 'Dependency Redundancy Groups' (no issue) - Feature: Show an indicator if there is an active deployment is running (#2917) ### Kickstart - Fix: Kickstart fails to remove a zone and endpoint correctly (#2459) ### CLI - Feature: Added an option to check a single import source or sync rule or director job by name (no issue) - Feature: Add command to delete sync rule and import source by Icingacli (#2706) ### REST API - Fix: Possible timing attack in Self Service API (no issue) - Fix: Set a default agent version to the latest for Self Service API (#2968) ### Integration - Fix: Don't require permissions for custom var rendering hooks (no issue) - Fix: Service modification still allowed in Monitoring View despite restricted permissions in Director (#3017) ### Internals - Fix: indexing of the stripped filter chain (no issue) - Fix: Director creates wrong url for scheduled downtime in activity log (#2456) - Fix: Basket restore of Host Template and Host Template Choice fails (#2996) - Feature: Add wildcard support for 'contains' and render with match (no issue) ### Fixed Issues You can find issues related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/41?closed=1) v1.11.5 ------- ## Database Schema - FIX: Failed schema migration of MySQL to version 188 due Integrity constraint violation ([#2970](https://github.com/Icinga/icingaweb2-module-director/issues/2970)) ## Deployment - Fix: Deprecation notice that sometimes appears on deployment form (no issue) ### Fixed Issues You can find issues related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/40?closed=1) v1.11.4 ------- ### Security - Rest API endpoints accessible to restricted users ([GHSA-3233-ggc5-m3qg](https://github.com/Icinga/icingaweb2-module-director/security/advisories/GHSA-3233-ggc5-m3qg)) ### UI - Fix editing of custom variables for multi-selected objects [#2950](https://github.com/Icinga/icingaweb2-module-director/issues/2950) - Fix: Check for the existence of service templates to add services [#1249](https://github.com/Icinga/icingaweb2-module-director/issues/1249) ### Import and Sync - Fix erratic job behavior during summer and winter time change (no issue) ### Integration - Fix custom variable renderer for service apply for rules (no issue) - Fix custom variable renderer for array type data lists [#2960](https://github.com/Icinga/icingaweb2-module-director/issues/2960) ### Database Schema - Fix MySQL 8.4 nonstandard foreign keys deprecation [#2885](https://github.com/Icinga/icingaweb2-module-director/issues/2885) ### Fixed Issues You can find issues related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/39?closed=1) v1.11.3 ------- ### UI * FIX: Property sort tables does not cause CSRF token validation anymore (#2937) * FIX: No error when clicking `modify` action link for services belonging to service set in Icinga DB (#2938) * FIX: No crashing of Host template form when invalid check command is entered (#2941) ### Internals * FIX: Filter can be now removed in import source modifiers (#2939) v1.11.2 ------- ### UI * FIX: No more errors when changing import source modifier priorities (#2270) * FIX: Choosing `HTTP proxy` in import source type `REST API` no longer causes deprecation notice (#2889) * FIX: Deleting data lists when using PostgreSQL as backend no longer yields errors (#2913) * FIX: Previewing sync rules with boolean properties now functions without errors (#2905) * FIX: Basket snapshots correctly display content if present (#2901) * FIX: Time periods now include `Add to basket` functionality (#2542) ### API * FIX: API updates for notifications return 304 instead of 200 when unchanged (#2882) ### Internals * FIX: The `apply_changes` setting from sync jobs restored from a basket is applied properly (#2904) * FIX: The `Get host by name (DNS lookup)` modifier handles failed lookups without errors (#2877) ### Director Branches * FIX: Cloning a host retains its services and service sets (#2897) * FIX: Service sets are now clonable (#2890) ### Integrations * Show Director labels in monitoring module and Icinga DB custom vars section (#2239) ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/36?closed=1) v1.11.1 ------- ### UI * FIX: Data fields are now suggested for service templates without a check command (#2815, #2826) * FIX: Unsetting a parent host or service of a dependency is now correctly stored (no issue) * FIX: The activity log now avoids a bug in PHP introduced with version 8.1.25 (#2828) ### Internals * FIX: UserGroup creation failed since v1.10.0 (#2784) * FIX: Hostgroup names consisting only of digits are now correctly handled (#2821) * FIX: Improved compatibility with PHP 8.1 and 8.2 (#2819, #2827) * FIX: The parent host or service of a dependency can now be reliably referenced by custom variable (#2289) * FIX: Services in service sets are now fully restored once a removed set is restored (#1065) ### Integrations * FIX: Icinga DB integration now works even if the monitoring module is not available (#2635) * FIX: Conformity with the content security policy introduced with Icinga Web v2.12 (#2845) ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/35?closed=1) v1.11.0 ------- Icinga Director v1.11 ships a nice new feature, which has been requested by many users: it is now possible to let Notification rules pick User and/or User Groups from Host and Service custom variables. ![Notification User Vars](screenshot/director/82_changelog/v1.11.0/82-1.11.0-05-notification_user-var.png) Behind the scenes, some Icinga DSL assures that Icinga behaves as expected: ![Notification User Vars rendered](screenshot/director/82_changelog/v1.11.0/82-1.11.0-06-notification_user-var_rendered.png) The IcingaDB module is now supported. This release also ships a fallback template for Icinga for Windows 1.11 (and Icinga 2.14). To improve security for those relying on default settings, all Host templates are per default rendered to all non-global zones in a redundant way, instead of being rendered to the main global zone. For those who want to store Secrets in their Host template definitions, this now hinders them from reaching your Agent Endpoints. In addition to this, with this release you now have more control over target Zones for services belonging to Service Sets. Also, some issues related to permissions and restrictions have been addressed. Various little Import and Sync issues have been addressed, automated Service Template import has been fixed. In addition to some minor Property modifier improvements, they can now be applied in a conditional way. Such filter rules also support CIDR notation. Most prominent use-case: as vSphereDB now ships ALL guest IP addresses, you can pick specific addresses for specific use-cases / host properties based on their network range: ![CIDR-based filters](screenshot/director/82_changelog/v1.11.0/82-1.11.0-01-cidr_based_filters.png) This release now officially supports PHP 8.2, addresses issues when integrating with the IcingaDB web module, and some dark-mode glitches. Search functionality has been improved, Preview Diff shows more details, editing multiple single Services with the very same name has been fixed, and the interactive Startup log renderer now wraps log lines in a nice way: ![Wrap Startup Log lines](screenshot/director/82_changelog/v1.11.0/82-1.11.0-02-wrap_startup_log_lines.png) Performance has greatly been improved for those, who trigger a lot of single API requests, instead of relying on Import/Sync mechanism. Our template usage overview now also summarizes and links objects used in Services belonging to Service Sets: ![Template Usage overview](screenshot/director/82_changelog/v1.11.0/82-1.11.0-03-template_usage.png) Commands can now be cloned with their field definitions, and custom variables from set_if flags make now part of the "suggested fields" list. In addition to major refactoring and technical improvements related to our configuration baskets, it's now also possible to upload additional snapshots for existing baskets: ![Basket Snapshot upload](screenshot/director/82_changelog/v1.11.0/82-1.11.0-04-upload_basket_snapshot.png) Speaking of baskets, they have been reworked in a way giving especially Icinga Partners and Plugin authors more control over related objects. As UUIDs are now supported in Baskets too, it is for example possible to rename an object with a new Basket Snapshot. ### Breaking Changes * Module and system dependencies have been raised, [Upgrading](05-Upgrading.md) and [Installation](02-Installation.md) documentations contain related details ### UI * FEATURE: allow to clone commands with fields (#2264) * FEATURE: Data Fields are now sorted in a case-insensitive way (#2358) * FEATURE: Data Field search is now case-insensitive (#2359) * FEATURE: Deployment Log now breaks lines (#2677) * FEATURE: Sort Template trees by name (#2691) * FEATURE: Branch and Sync diff/preview now shows related host for services (#2736) * FEATURE: Show more details for assign filter parsing errors (#2667) * FEATURE: Fields from set_if are now being proposed (#514) * FEATURE: Template usage table now shows Set members (#2378) * FIX: do not fail for (some) Service Dependencies (#2669, #1142) * FIX: Service Sets can now be searched by Service name in branches too (#2738) * FIX: Template usage table had no header (#2780) * FIX: Strikethrough for deactivated services in applied Service Set (#2746, #2766) * FIX: editing multi-selected services with the same name has been fixed (#2798, 2801, #2599) * FIX: Service Sets table with PostgreSQL (#2799) * FIX: Dark mode for some clone forms (#2670) ### Icinga Configuration * FEATURE: render fallback template for IfW 1.11 for Icinga < 2.14 (#2776) * FEATURE: render host templates to all non-global zones per default (#2410) * FEATURE: notifications can pick user(groups) from host/service vars (#462) * FIX: render Set Services to individual zones where required (#1589, #2356) * FIX: special characters like & and | caused trouble in filters (#2667) ### Import and Sync * FEATURE: regular expression based modifier allows explicit NULL on no match (#2705) * FEATURE: property modifiers can now be applied based on filters (#2756) * FEATURE: CIDR notation (network ranges) is supported in such filters (#2757) * FEATURE: trigger group membership resolution on group sync conditionally (#2812) * FIX: synchronizing Service (and -Set) Templates has been fixed (#2745, #2217) * FIX: null properties with Sync policy "ignore" are now being ignored (#2657) * FIX: Import Source shows available columns for Core API Import (#2763) * FIX: JSON-decode now explicitly fails for non-string inputs (#2810) ### Integrations * FIX: don't throw an error, when editing a Service via IcingaDB link (#2533, #2563) # Configuration Baskets * FEATURE: it's now possible to upload snapshots for existing baskets (#1952) * FIX: basket now shows where to expect changes for lists from snapshots (#2791) * FIX: Icinga DSL parts for Commands are now restored from Baskets (#2811) ### REST API * FIX: Commands give 204 w/o ghost changes for same properties (#2660) ### Permissions and Restrictions * FIX: monitoring-related permission checks have been refactored (#2712) * FIX: Hostgroup-Filters have not been applied to Overview tables (#2775) * FIX: error editing Hosts with hostgroup restriction in place (#2164, #2809) ### Configuration Branches * FEATURE: with this release, directorbranches v1.3 supports a "default branch" (#2688) * FEATURE: users with default branches get warnings in the main branch (#2689) * FIX: create a branched set, add services, modify them (#2710) ### Health Check * FIX: complaint about overdue jobs was not correct (#2680, #2681) ### Internals * FEATURE: support PHP 8.2 (#2777, #2792) * FEATURE: Unit Tests are now being triggered as GitHub workflows (no issue) * FIX: group membership is no longer resolved when not needed (#2048) * FIX: require Auth object for all object tables (#2808) * FIX: group membership is no longer resolved when not needed (#2048) ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/33?closed=1) v1.10.2 ------- This is a minor bugfix release, addressing some Sync-related issues: purge for objects with uppercase characters now works as expected, automated Sync jobs run again, and manually triggered Sync has been fixed on PostgreSQL. Some UI glitches have been addressed, and a few problems appearing only in certain conditions - related to Configuration Baskets, our Self Service REST API and the Activity Log. ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/31?closed=1) ### UI * FEATURE: improve Service Set table layout (#2648) * FIX: modifying single time-period ranges had no effect (#2525) * FIX: activity log pagination is now on a single line (#2649) ### Import and Sync * FIX: triggering Sync manually produced an error on PostgreSQL (#2636) * FIX: purge stopped working for objects with uppercase characters (#2627) * FIX: Notification Apply rule is now possible (wasn't since v1.8) (#2142, #2634) * FIX: nested property access with intermediate NULL values now gives NULL (#2474, #2584) * FIX: automated Sync jobs stopped working (#2633) ### Configuration Baskets * FEATURE: more details shown in error messages related to invalid characters (#2646) * FIX: snapshots for Baskets containing Baskets failed since v1.10 (#2644) ### REST API * FIX: Self Service API returned invalid JSON on PHP 8.1 (#2614) ### Internals * FIX: issue with empty activity log, deprecate outdated method (#2630) v1.10.1 ------- This is a minor bugfix release, addressing issues with modifying services via the monitoring module, Sync problems and a copy and paste error in the DB schema, which caused problems for fresh installations since v1.10. Please note that a long-standing issue for our Sync Rules has been fixed: with "merge" policy, NULL properties have been ignored for quite some time. This has now been fixed. If in doubt, please **preview** your Sync Rules to make sure, that they behave as expected. This release brings a small schema migration, cleaning up invalid Sync history entries. If in doubt, please create a [database backup](05-Upgrading.md#backup-first) first. ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/30?closed=1) ### Import and Sync * FIX: sync lower-cased all object names since v1.10 (#2608) * FIX: sync for Datalist entries has been fixed (#2618) * FIX: Sync now applied NULL values with merge policy (#2623) * FIX: Sync created Sync History entries for every preview (#2632) * FIX: "Purge" stopped working for Sync (#2627) ### UI * FIX: "Modify" Services via the monitoring module (#2615, #2619) ### Configuration Baskets * FIX: restore Import/Sync/Job when exported with v1.10 (#2620) * FIX: restoring Job with ImportSource or SyncRule (#2528) ### Database Schema * FIX: new DB schema failed due to duplicate line in SQL statement (#2609) v1.10.0 ------- An advanced **Sync Preview** is one of the features I'd love to highlight in v1.10.0. We have been able to leverage our Configuration Branch support as an underlying technology for this: ![Sync Preview - List](https://user-images.githubusercontent.com/553008/191472888-33849b3e-9d96-4113-b960-92708769e90d.png) In case you have lots of changes, you can browse all of them - formerly this hasn't been possible. Also, this now allows you to inspect every single upcoming change before applying the Sync: ![Sync Preview - Details](https://user-images.githubusercontent.com/553008/191472900-1968691e-a758-4c99-99ce-059bc3689356.png) This has been possible based on the code we implemented to support the [Director Branches](https://icinga.com/docs/icinga-director-branches/latest/) module. In case you never heard about it, [here](https://icinga.com/blog/2022/07/21/releasing-icinga-director-branches/) you can find the related announcement. This release also contains a lot of related fixes and new Features. It is now possible to deal with **Service Sets** in Configuration Branches, the **commit remark** can be proposed with a merge request, and the Activity Log shows not only who has merged the change, but also the **original author**. Powerful new features have been implemented for those who love to orchestrate the Director from the outside. Please check our [CLI](https://github.com/Icinga/icingaweb2-module-director/blob/v1.10.0/doc/60-CLI.md) and [REST API](https://github.com/Icinga/icingaweb2-module-director/blob/v1.10.0/doc/70-REST-API.md) documentation for related details, especially look for --with-services (withServices) and --allow-overrides (allowOverrides). CLI now supports **JSON on STDIN**, REST API can request detailed stack traces in case an error occurs. ### Breaking Changes * Module and system dependencies have been raised, [Upgrading](05-Upgrading.md) and [Installation](02-Installation.md) documentations contain related details ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/27?closed=1) ### User Interface * FIX: links from Service Previews (Icinga DSL) to templates (#2554) * FIX: daemon health visualization on systems w/o /proc filesystem (#2544) ### Import and Sync * FIX: Sync now compares keys in a case-insensitive way (#2598, #2419, #1140) * FIX: Sync now preserves Self Service API keys in override mode (#2590) * FEATURE: clone a row for nested Dictionary/Hash entries (#2555) * FEATURE: Sync in "override" mode now preserves Self Service API keys (#2590) * FEATURE: split a row in multiple ones, based on a Dictionary (#2555) * FEATURE: it's now possible to sync to a configuration branch (#2552) * FEATURE: Sync preview now allows to navigate single changes (#2607) ### Configuration Baskets * BREAKING: configuration baskets no longer contain originalId (#2549) * FEATURE: exporting/snapshot-logic has been centralized (#2549) ### Configuration Branches * FIX: PostgreSQL now allows for the same object in multiple branches (#2605) * FEATURE: merge comments can now be proposed (#2604) * FEATURE: activity log now shows author and committer (#2606) ### Integrations * FIX: Monitoring Hooks are no longer provided with disable Director UI (#2597) * FIX: cleanup for IcingaDbCube (#2484) ### Kickstart * FIX: breaking change in ipl/html, affected setups with ro INI files (#2595) * FEATURE: better explanation for missing DSL bodies fetched from core (#2557) ### REST API * FIX: addressing service templates by name has been fixed (#2487) * FIX: allow for object_name in body only (#2576) * FIX: notice on PHP 8.1 (#2575) * FEATURE: Stack traces can now be requested (#2570) * FEATURE: Hosts can now be exported with their services (#2568) * FEATURE: "magic" variable overrides are now supported (#2569) ### CLI * FIX: config deploy doesn't try to wait in case of no deployment (#2522) * FIX: renderer now shows full service sets (#2550) * FEATURE: improved wording for deployment error messages (#2523) * FEATURE: JSON can now be shipped via STDIN (#1570) * FEATURE: improved readability for some error messages (#2567) * FEATURE: allows showing hosts with their services (#2565) * FEATURE: allow showing resolved Host services (#2571) * FEATURE: "magic" variable overrides are now supported (#2560) * FEATURE: error messages are now friendlier (#2567) * FEATURE: STDIN support for --json is now available (#1570) ### Activity Log * FIX: deleted objects might have been missing related properties (#2559) ### Deployment Log * FEATURE: visualization performance has been improved (#2551) ### Internals * FEATURE: there is now a centralized Exporter implementation (#2549) 1.9.1 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/28?closed=1) ### User Interface * FIX: DataList-backed fields failed to validate (#2475) * FIX: No Host list limit when adding a single service globally (#2481) * FIX: Cleared activity log caused exception (#2505, #2506) * FEATURE: Icinga Web 2.10 dark mode support (#2433) ### Configuration Baskets * FIX: failed to export Baskets with Service Sets (#2488) * FIX: Sync Rule restore from snapshot on name change (#2467) * FIX: Do not export UUIDs with Service Sets (#2488) ### CLI * FEATURE: Allow to define deployment grace period on CLI (#2499) ### Integrations * FIX: Cleanup IcingaDbCubeLinks (#2484) ### DB Schema * FIX: applying DB Schema migrations failed on PostgreSQL (#2482) 1.9.0 ----- ### Breaking Changes * Module dependencies have been raised, [Upgrading](05-Upgrading.md) and [Installation](02-Installation.md) documentations contain related details ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/25?closed=1) ### Import and Sync * FIX: string property modifiers now preserve NULL values (#2371) * FIX: "to int" property modifiers now fails for non-string values (#2372) * FEATURE: introduce 'disable' as your purge action on Sync (#2285) * FEATURE: there is now a simple "group by" Property Modifier (#2317) ### Configuration Baskets * FIX: Notification Apply Rules have not been exported (#2335) * FIX: Restore now supports the set_if_format switch (#2291) * FEATURE: it's now possible to purge objects of specific types (#2201) * FEATURE: exporting Users, User-Templates and -Groups is now possible (#2328) * FEATURE: Data Field Categories are now supported (#2256) ### Permissions and Restrictions * FEATURE: allow using monitoring module permissions (#2304) * FEATURE: it's now possible to grant (global) access to scheduled downtimes (#2086) ### Configuration / Templating * FEATURE: offering choices based on a specific imports is now possible (#1178) ### User Interface * FIX: allow switching DB config while connection is failing (#2300) * FIX: Links to duplicate services in Sets didn't check for deactivation (#2323) * FIX: SQL error for Data Fields table on PostgreSQL (#2310) * FIX: SQL error when searching for Data Field Categories (#2367) * FIX: Icon used for Notifications has been changed (#2455) * FEATURE: show "deprecated" flag on object attribute inspection (#2312) * FEATURE: Service Template for single Host services provides auto-completion (#1974) ### CLI * FEATURE: config deployment now allows to --wait for an Icinga restart (#2314) ### Activity log * FEATURE: Activity log now allows for remarks (addon module required, #2471) ### Documentation * FIX: configure the daemon with main setup instructions (#2296, #2320) ### Internals * FEATURE: PHP 8.1 is now supported, works once available in Icinga Web (#2435) * FEATURE: Config Branches have been implemented, leveraged via Hook/Addon (#2376) * FEATURE: UUIDs have been implemented for most Icinga objects, more to come * FEATURE: new Deployment Hook, triggers onCollect(ing) Icinga startup info (#2315) 1.8.1 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/24?closed=1) ### User Interface * FIX: show Override button when all Fields belong to Field Categories (#2303) * FIX: don't fail when showing a Host overriding multiple inherited groups (#2253) * FIX: deal with inherited values which are invalid for a select box (#2288) * FIX: Service Set preview inline Service Template links (#2334) * FIX: show Services applied with Rules involving applied Hostgroups (#2313) * FIX: show "deactivated" services as such also for read-only users (#2344) * FIX: Overrides for Services belonging to Sets on root Host Templates (#2333) * FIX: show no header tabs for search result in web 2.8+ (#2141) * FIX: show and link dependencies for web 2.9+ (#2354) ### Icinga Configuration * FIX: rare race condition, where generated config might miss some files (#2351) ### Icinga API * FIX: use Icinga 2's generate-ticket API, required for v2.13.0 (#2348) ### Import and Sync * FIX: Purge didn't remove more than 1000 services at once (#2339) ### Automation, User Interface * FIX: error message wording on failing related (or parent) object ref (#2224) ### REST API * FIX: creating scheduled downtime via api failed (#1879) 1.8.0 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/21?closed=1) ### User Interface * FIX: It's now possible to set Endpoint ports > 32767 on PostgreSQL (#928) * FIX: Group list is no longer prefixed with a comma (#2133) * FIX: Change wording, avoid black/whitelist (#2134, #2135) * FIX: Inherited values in sets (arrays) are now shown (#1310) * FIX: Column layout broke with Web 2.8, has been fixed (#2065) * FIX: filter suggestion gave wrong values for DataList fields (#1918) * FIX: clone-related scheduled downtime links have been fixes (#1894) * FEATURE: Data Fields can now be grouped into categories (#1969) * FEATURE: Inspect is now available for Packages, Stages and Files (#1995) * FEATURE: Allow to disable the Director frontend / UI (#2007) * FEATURE: Endpoints table now shows the object type (e.g. external) (#2050) * FEATURE: make sure that form label and fields stay close together (#2136) * FEATURE: show more content, reduce padding (expect on mobile) (#2140) * FEATURE: location details for non-Director services on "Modify" (#1531) * FEATURE: Service Set table can now also be searched for Services (#1873) * FEATURE: Apply-Rule-based Service Sets now show related Hosts (#2081) * FEATURE: Notification Apply Rules as a DirectorObject DataField (#2199) * FEATURE: Hint and Error styling has been unified and improved * FEATURE: Form field rendering for sets now deals with invalid values * FEATURE: Better descriptions for time-based and other fields (#1897, #1264) * FEATURE: Daemon tab now gets red instead of yellow when not running (#2238) ### Translations * FEATURE: Italian translation is now available (#2080) * FEATURE: German translation has been refreshed (#2240) ### CLI * FEATURE: Deployment Status and related utilities (#2189) ### Import and Sync * FEATURE: allow defining update-only Sync Rules (#2059) * FEATURE: New Property Modifier: ListToObject (#2062) * FEATURE: Property Modifier: convert binary UUID to HEX presentation (#2138) * FEATURE: Property Modifier: get Host by Address (#2210) * FEATURE: Property Modifier: skip duplicates (#2215) * FEATURE: Property Modifier: trim strings (#1660) * FEATURE: Property Modifier: negate boolean (#2227) * FEATURE: Property Modifier Reject/Select: improve usability (#2228) * FEATURE: Property Modifier: clone rows for every entry of an Array (#2192) * FEATURE: Property Modifier: unique array values (#2229) * FEATURE: Property Modifier: allow to rename columns (#2242) * FEATURE: Import Sources now allows downloading previewed data as JSON (#2096) * FEATURE: REST API Import now allows custom headers (#2132) * FEATURE: REST API Import can now extract nested properties (#2132) * FEATURE: REST API Form remembers passwords without exposing them (#2070) * FEATURE: UTF8 validation for failed imports gives better error message (#2143) * FEATURE: ArrayByElementPosition now allows filtering by key name (#1721) * FEATURE: Use your Director Objects as an Import Source (#2198) * FEATURE: Property modifiers are now granted access the current Property Name (#2241) * FIX: Import Source preview now catches all errors * FIX: Import Source download sends eventual errors as a valid JSON result * FIX: LDAP Import is now able to paginate limited results (#2019) ### Configuration Baskets * FIX: Restoring Import Sources creating Modifiers now works (#2053) * FEATURE: Support Baskets from Icinca for Windows (#2223) * FEATURE: It's now possible to use Notification Templates in Baskets * FEATURE: Snapshot status/diff layout has been improved (#2225) ### Authentication and Permissions * FIX: Users restricted to Hostgroups can now use related Templates (#2020, #2101) * FEATURE: Optionally, restricted users can be allowed to set Groups (#2252) ### Kickstart * FEATURE: Friendlier message if object to be removed is still in use (#2206) * FEATURE: Kickstart now removes obsolete External Commands (#985) ### Icinga Configuration * FIX: Correctly render Service Dependencies with Array-style parent hosts (#2088) * FIX: times.begin and times.end are now rendered separately (#2193) * REMOVED: magic-apply-for (a hidden deprecated feature) has been removed (#1851) ### Icinga Agent handling * FIX: Linux Agent installer now fails when unable to retrieve a certificate * FEATURE: Linux Agent installer now supports Alpine Linux (#2216) * FEATURE: Icinga for Windows support (#2147) ### REST API * FEATURE: Self Service API ignores empty/missing properties (e.g. no address) * FEATURE: Search is now also available for the REST API (#1889) * FEATURE: Deployment Status is now available (#2187) * FEATURE: UTF-8 characters and slashes are no longer escaped (#2243) ### Self Service API * FIX: error handling has been fixed (#1728) ### Database Support * FIX: Added UTF8 to valid PostgreSQL encodings (used to be UTF-8) ### Background Daemon * FIX: Daemon Logger used to not override the given log level (#2139) * FEATURE: Daemon: prepare for future reactphp promise versions (#2137) * FEATURE: Daemon now logs that it is going to reload itself * FEATURE: Now collects the Deployment status from Icinga (#2045, #1988) ### Documentation * FEATURE: We now also mention optional/indirect requirements (#2054, #2220) ### Internals * FEATURE: Property Modifiers are now able to clone rows (#2060) * FEATURE: URL encoding for the Core API has been unified * FEATURE: PHP 8.0 has been released and is officially supported (#2233) * REMOVED: dipl has been dropped, we're using ipl/incubator since v1.7 (#2209) * FIX: typo in DeploymentHook::onSuccessfulDump() has been fixed (#2069) * FIX: forms now support dbResourceName (#2064) 1.7.2 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/23?closed=1) ### DB Schema * FIX: Rolling out new installations on MySQL v5.6 fails (#1993) ### Icinga Configuration * FIX: Render service\_name for Notifications (#2006) ### User Interface * FIX: Cloning Import Sources failed since v1.7.0 (#1997) * FIX: Switching Director DBs was broken since Web 2.6.3 (#2063) ### CLI * FIX: Importing Import Sources failed since v1.7.0 (#2005) ### Automation * FIX: Fixing linux install script version check (#2008) * FIX: Windows Kickstart Script - $GlobalZones was empty (#2002) ### Documentation * FIX: Missing single quote in mysql example bug (#2003) 1.7.1 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/22?closed=1) ### User Interface * FIX: Cloning Sync rules failed since v1.7.0 (#1982) * FIX: It wasn't possible to multi-select Hosts belonging to a Group (#1973) * FIX: Removed an un-formatted error in case Icinga is unreachable (#1966) * FIX: Check for broken configs has been extended to Icinga v2.11.* (#1985) * FEATURE: Show a warning when detecting a downgraded installation (#1992) ### Import and Sync * FIX: Upper- and Lowercase property modifiers are now multibyte/UTF8-safe (#710) ### Health Check * FIX: do not complain about no-due newly created jobs (#1994) ### Background Daemon * FIX: Daemon didn't report DB state to systemd (#1983) 1.7.0 ----- ### Breaking Changes * At least PHP 5.6.3 is now required, Director 1.7.x will refuse to work with older versions * New dependencies have been introduced, [Upgrading](05-Upgrading.md) and [Installation](02-Installation.md) documentations contain related details ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/18?closed=1) ### User Interface * FIX: Service-related links in Activity Log have been corrected (#1377, #1816) * FIX: Activity Log now works for Service Sets (#1287, #1786, #1816) * FIX: Assign Filters are no longer mandatory when modifying Service Groups (#930) * FIX: Object type for CheckCommands has been corrected in config preview (#1799) * FIX: Import preview in combination with Black/Whitelisting (#1825) * FIX: Routing/redirection when working with Data Fields (#1847) * FIX: Auto-suggestion field was positioned wrongly once scrolled down * FIX: Timezone inconsistencie have been fixed (#1700) * FIX: Link-like buttons where shortened on Icinga Web 2.7 (#1928) * FIX: Search in range-filtered Activity Log no longer fails (#1381) * FEATURE: It's now possible to clone a Service to a different Host (#1796) * FEATURE: Scheduled Downtimes for "Hosts AND their services" (#1831) * FEATURE: Auto-suggestion and more for Fields based on Data Lists (#1846) * FEATURE: Show missing dependencies (#1938) ### Translations * FEATURE: German translation has been refreshed (#1951) * FEATURE: Japanese is now available (#1869) ### Import and Sync * FIX: Avoid caching between multiple runs of sync (#1836) * FIX: Imported Rows Table (history) eventually failed on Icinga Web 2 (#1925) * FIX: Improved error handling on preview (#1941) * FEATURE: When fetching invalid data, Import refers erroneous rows (#1741) * FEATURE: Sync now offers a preview, showing what would happen (#1754) * FEATURE: ParseURL property modifier has been added (#1746) * FEATURE: There is a new generic REST API Import Source (#1818) * FEATURE: Sync now supports Notifications and Dependencies (#1212, #925, #1209) * FEATURE: Limits (memory, execution time) raised for Import runs via UI (#1954) ### Configuration Baskets * FIX: snapshots do no longer fail for deleted elements on snapshot (#1940) * FEATURE: baskets now support External Commands (#1854) ### REST API * FIX: Command Arguments can now be managed via API (#1416) ### CLI * FIX: importsource fetch did not apply configured property modifiers (#1819) * FEATURE: Service Groups are now available on CLI (#1745) * FEATURE: A new background daemon has been introduced (#1905) ### Icinga Configuration * FIX: Allow to render single configuration files larger than 16MB (#1787) * FIX: Icinga v2.11 version detection for Agent Installation script (#1957) * DEPRECATED: magic-apply-for (a hidden feature) is now deprecated (#1850) * FEATURE: It's now possible to define Scheduled Downtimes (#347, #1828) * FEATURE: Allow to render command definitions as (v1.x-like) strings (#1809) * FEATURE: host address now allows 255 characters (#1890) * FEATURE: Director now assists with Services applied to parent Zones (#1634) * FEATURE: Warn affected setups when affected by a specific core issue (#1958) ### Documentation * FIX: Installation instructions have been adjusted to fit MySQL 8 ### Internals * FIX: support different timezones with MySQL (#1332, #1840) * FIX: support importing DSL-based Command Arguments (#1812) * FEATURE: a new Hook allows to run custom code at deployment time (#1342, #1843) * FEATURE: there is a new low-level IcingaObjectFormHook (#1841) 1.6.2 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/20?closed=1) ### Icinga Configuration * FIX: rendering for Service Sets on single Hosts has been fixed (#1788, #1789) 1.6.1 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/19?closed=1) ### User Interface * FIX: restoring a basket fails when there is only one configured DB (#1716) * FIX: creating a new Basket with a "Custom Selection" failed with an error (#1733) * FIX: some new reserved keywords are now escaped correctly (#1765) * FIX: correctly render NOT used in apply rules (fixes #1777) * FIX: Activity Log used to ignore Host filters (#1613) * FIX: Basket failed to restore depending on PHP version (#1782) * FIX: Loop detection works again (#1631) * FIX: Snapshots for Baskets with Dependencies are now possible (#1739) * FIX: Commands snapshots now carry fields in your Basket (#1747) * FIX: Cloning services from one Set to another one no longer fails (#1758) * FIX: Blacklisting a Service from a Set on a Host Template is now possible (#1707) * FIX: Services from a Set assigned to a single Host can be blacklisted (#1616) * FEATURE: Add TimePeriod support to Configuration Baskets (#1735) * FEATURE: RO users could want to see where a configured service originated (#1785) * FEATURE: introduce director/serviceapplyrules REST API endpoint (#1755) ### REST API * FIX: Self Service API now ships optional Service User parameter (#1297) ### DB Schema * FIX: it wasn't possible to use the same custom var in multiple notification definitions on PostgreSQL (#1762) ### Icinga Configuration * FIX: escape newly introduced Icinga 2 keywords (#1765) 1.6.0 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/15?closed=1) ### User Interface * FIX: link startup log warning even for non-standard package names (#1633) * FIX: searching for fields assigned to a template was broken (#1670) * FIX: changing an argument type from String to DSL didn't work (#1640) * FIX: incorrect links from template-tree to non-template commands (#1544) * FIX: drop useless object-type field for Time Periods (#788) * FIX: clean up naming for some tabs (#1312) * FIX: "remove" now removes the correct Service Set on a Host (#1619) * FIX: do not fail when "inspecting" a pending service (#1641) * FIX: a problem when selecting multiple host has been fixed (#1647) * FIX: allow to remove renamed Service Sets (#1664) * FIX: resolved a side-effect triggered by hooked Custom Fields (#1667) * FIX: config diff URL behavior has been corrected (#1704) * FEATURE: allow to filter templates by usage (#1339) * FEATURE: allow to show SQL used for template tables * FEATURE: allow to defined Service Groups for Set members and for Services assigned to Host Templates (#619) * FEATURE: it's now possible to choose another target Service Set when cloning a member service (#886) * FEATURE: Configuration Baskets with snapshot/import/export capabilities (#1630) * FEATURE: Allow to clone a Service from one Set to another one (#886) * FEATURE: form descriptions are now shown directly below the field, reverting a change from v1.4.0 (#1510) * FEATURE: show sub-sets in Config Preview (#1623) * FEATURE: show live Health-Check in the frontend (#1669) ### Import and Sync * FIX: Core Api imports flapping only for 2.8+ (#1652) * FEATURE: new Property Modifier allows to extract specific Array values (#473) ### CLI * FIX: Director Health Check no longer warns about no Imports/Syncs/Jobs (#1607) * FEATURE: It's now possible to dump data as fetched by an Import Source (#1626) * FEATURE: CLI implementation for Configuration Basket features (#1630) * FEATURE: allow to append to or remove from array properties (#1666) ### Icinga Configuration * FIX: rendering of disabled objects containing `*/` has been fixed (#1263) * FEATURE: support for Timeperiod include/exclude (#1639) * FEATURE: improve legacy v1.x configuration rendering (#1624) ### Icinga API * FIX: ship workarounds for issues with specific Icinga 2 versions * FIX: clean up deployed incomplete stages lost by Icinga (#1696) * FEATURE: allow to behave differently based on Icinga 2 version (#1695) ### Icinga Agent handling * FEATURE: ship latest PowerShell module (#1632) * FIX: PowerShell module runs in FIPS enforced mode (#1274) ### DB Schema * FIX: enforce strict object_name uniqueness on commands (#1496) ### Documentation * FEATURE: improve installation docs, fix URLs (#1656, #1655) 1.5.2 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/17?closed=1) ### Configuration rendering * FIX: Fix compatibility with Icinga v2.6, got broken with v1.5.0 (#1614) ### REST API * FIX: No more invalid JSON in some special circumstances (#1314) ### User Interface * FIX: Hostgroup assignment cache has been fixed (#1574, #1618) ### DB Schema * FIX: missing user/timeperiod constraint. We usually do not touch the schema in minor versions, this has been cherry-picked by accident. However, don't worry - the migration has been tested intensively. 1.5.1 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/16?closed=1) ### Icinga Configuration * FIX: Switched Variable-Override related constant names broke the feature (#1601) ### User Interface * FIX: Custom Fields attached to a Service Template have not been shown for Apply Rules whose name matched the Template Name (#1602) ### Import and Sync * FIX: There was an issue with specific binary checksums on MySQL (#1556) 1.5.0 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/11?closed=1) ### Security Fixes * FIX: users with `director/audit` permission had the possibility to inject SQL. Thanks to Boyd Ansems for reporting this. ### Permissions and Restrictions * FEATURE: Showing the executed SQL query now requires the `showsql` permission * FEATURE: Grant access to Service Set in a controlled way * FIX: do not allow a user to create hosts he wouldn't be allowed to see #1451 * FIX: Hostgroup-based restrictions worked fine when applied, bug was buggy in combination with directly assigned or inherited groups (#1464) ### Icinga Configuration * FEATURE: Add 'is false (or not set)' condition for apply rules (#1436) * FEATURE: support flapping settings for Icinga >= 2.8.0 (#330) * FEATURE: include all itl packages in Linux Agent sample config (#1450) * FEATURE: it's now possible to blacklist inherited or applied Services on single hosts (#907) * FEATURE: timestamped startup log rendering for upcoming Icinga v2.9.0 (#1478) * FEATURE: allow to switch between multiple Director databases (#1498) * FEATURE: it's now possible to specify Zones for UserGroups (#1163) * FEATURE: dependencies are no longer considered experimental ### User Interface * FEATURE: Admins have now access to JSON download links in many places * FEATURE: Users equipped with related permissions can toggle "Show SQL" in the GUI * FEATURE: A Service Set can now be assigned to multiple hosts at once #1281 * FEATURE: Commands can now be filtered by usage (#1480) * FEATURE: Show usage of Commands over templates and objects (#335) * FEATURE: Allow horizontal size increase of Import Source DB Query field (#299) * FEATURE: Small UI improvements like #1308 * FEATURE: Data Lists can be chosen by name in Sync rules (#1048) * FEATURE: Inspect feature got refactored, also for Services (#264, #689, #1396, #1397) * FEATURE: The "Modify" hook is now available for Services (#689), regardless of whether they have been directly assigned, inherited or applied * FEATURE: Config preview links imports, hosts and commands to related objects (#1521) * FEATURE: German translation has been refreshed (#1599) * FEATURE: Apply Rule editor shows suggestions for Data-List vars (#1588) * FIX: Don't suggest Command templates where Commands are required (#1414) * FIX: Do not allow to delete Commands being used by other objects (#1443) * FIX: Show 'Inspect' tab only for Endpoints with an ApiUser (#1293) * FIX: It's now possible to specify TimePeriods for single Users #944 * FIX: Redirect after not modifying a Command Argument failed on some RHEL 7 setups (#1512) * FIX: click on Service Set titles no longer removes them from their host (#1560) * FIX: Restoring objects based on compound keys has been fixed (#1597) * FIX: Linux Agent kickstart script improved and tweaked for Icinga 2.9 (#1596) ### CLI * FEATURE: Director Health Check Plugin (#1278) * FEATURE: Show and trigger Import Sources (#1474) * FEATURE: Show and trigger Sync Rules ( #1476) ### Import and Sync * FIX: Sync is very powerful and allows for actions not available in the GUI. It however allowed to store invalid single Service Objects with no Host. This is now illegal, as it never makes any sense * FIX: Performance boost for "purge" on older MySQL/MariaDB systems (#1475) * FEATURE: new Property Modifier for IPs formatted as number in Excel files (#1296) * FEATURE: new Property Modifier to url-encode values * FEATURE: new Property Modifier: uppercase the first character of each word * FEATURE: Kickstart Helper now also imports Event Commands (#1389) * FEATURE: Preserve _override_servicevars on sync, even when replacing vars (#1307) ### Internals * FIX: problems related to users working from different time zones have been fixed (#1270, #1332) * FEATURE: Html/Attribute now allows boolean properties * FEATURE: Html/Attribute allows colons in attribute names (required for SVGs) * FEATURE: Html/Attributes can be prefixed (helps with data-*) * FEATURE: Html/Img data:-urls are now supported * FEATURE: ipl has been aligned with the upcoming ipl-html library * FEATURE: Director now supports multiple Databases, allows to switch between them and to deploy different Config Packages. Other features based on this combined with related documentation will follow. 1.4.3 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/13?closed=1) ### User Interface * FIX: Pagination used to be broken for some tables (#1273) ### Automation * FIX: API calls changing only object relations and no "real" property resulted in no change at all (#1315) 1.4.2 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/13?closed=1) ### Configuration rendering * FIX: Caching had an influence on context-specific Custom Variable rendering when those variables contained macros (#1257) ### Sync * FIX: The fix for #1223 caused a regression and broke Sync for objects without a 'disabled' property (Sets, List members) (#1279) 1.4.1 ----- ### Fixed issues * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/12?closed=1) ### Automation * FIX: A Sync Rule with `merge` policy used to re-enable manually disabled objects, even when no Sync Property `disabled` has been defined (#1223) * FIX: Fix SQL error on PostgreSQL when inspecting Template-Choice (#1242) ### Large environments * FIX: Director tries to raise it's memory limit for certain memory-intensive tasks. When granted more (but not infinite) memory however this had the effect that he self-restricted himself to a lower limit (#1222) ### User Interface * FIX: Assignment filters suggested only Host properties, you have been required to manually type Service property names (#1207) * FIX: Hostgroups Dashlet has been shown to users with restricted permissions, clicking it used to throw an error (#1237) 1.4.0 ----- ### New requirements * Icinga Director now requires PHP 5.4, support for 5.3 has been dropped * For best performance we strongly suggest PHP 7 * When using MySQL, please consider slowly moving to at least version 5.5. One of our next versions will introduce official Emoji support 😱😱😱! That's not possible with older MySQL versions. However, 1.4.x still supports 5.1.x ### Fixed issues and related features * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/6?closed=1) ### Dashboard and Dashlets * Multiple new Dashboards have been introduced, their layout has been optimized * Dashboards are made aware of newly introduced permissions and try to provide useful hints ### GUI, UX and Responsiveness * Many little improvements related to mobile devices have been applied to Dashboards, Forms and Tables * Search has been both improved and simplified. On most tables search spawns multiple columns, visible and invisible ones. Multiple search terms are combined in an intuitive way. * Pagination (and search) has been added to those tables where it was still missing * Some form fields referencing related objects are no longer static drop-down selection elements but offer suggestions as you type. This makes forms faster, especially in larger environments * Navigation has been simplified, redirects after form submissions have been improved, more possibilities to jump to related objects have been added * Form field description has been moved to the bottom of the screen. Might be easier to overlook this way, but while the former implementation was great for people navigating forms with their Keyboard, it was annoying for Mouse lovers * Double-Click a Tab to enlarge it to full width * Action Link bar has been unified, all links should now respect permissions * All tables showing historic data are now grouped by day * Property Modifiers, Sync Rules, Import Sources and more objects now offer description fields. This allows you to explain your colleagues all the magic going on behind the scenes ### Object Types * Service Sets got quite some tweaking and bug fixing * Groups of all kinds are now able to list their members, even when being applied based on filters * Command Argument handling has been improved * It is now possible to configure Dependencies through the Icinga Director * Cloning Hosts now allows to also optionally clone their Services and Service Sets ### Templates * The template resolver has been rewritten, is now easier to test, strict and faster * Template Tree has been re-written and now also immediately shows whether a template is in use * When navigating to a Template you'll notice a new usage summary page showing you where and how that specific template is being used. Therefor, many tables are now internally able to filter by inheritance ### Template Choices * While Host- and Service-Templates are powerful building blocks, having to choose from a single long list might become unintuitive as this list starts growing. That's where Template Choices jump in. They allow you to bundle related Templates together and offer your users to choose amongst them in a meaningful way. ### Apply rules * Various related issues have been addressed * A new virtual "is true / is set" operator is now available ### Permissions and Restrictions * It is now possible to limit access to Hosts belonging to a a list of Hostgroups. This works also for Hostgroups assigned through Apply Rules. * Data List entries can be made available based on Roles ### Data Types * SQL Query and Data List based Data Fields can now both be offered as Array fields, so that you can choose among specific options when filling such * New overview tables give admins a deep look into used Custom Variables, their distinct values and usage * Various issues related to Boolean values have been fixed ### Import and Synchronization * Many issues have been addressed. Merge behavior, handling of special fields and data types * Problems with Import Source deletion on PostgreSQL have been addressed * New Property Modifiers are available. When importing single Services you might love the "Combine" modifier * It is now possible to re-arrange execution order of Property Modifiers and Sync Properties * Preview rendering got some improvements * "Replace" policy on Custom Vars is now always respected * Using VMware/vSphere/ESX? There is now a new powerful module providing a dedicated Import Source ### REST API * A new Self Service API now allows to completely automate your Icinga Agent roll-out, especially (but not only) for Microsoft Windows * List views are now officially available. They are very fast and stream the result in a memory-efficient way * Documentation better explains how to deal with various objects, especially with different types of Services (!!!!!) ### Internal architecture * Many base components have been completely replaced and re-written, based on and early prototype of our upcoming Icinga PHP Library (ipl) 1.3.2 ----- ### Fixed issues and related features * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/10?closed=1) ### Apply Rules * Slashes in Apply Rules have not been correctly escaped * Services applied based on Arrays (contains) did not show up in the Hosts Services list, and therefor it was not possible to override their vars * Some magic has been introduced to detect numbers in apply rules - not perfect yet ### Host Groups * It has not been possible to modify Host Groups without defining an apply rule * Hostgroups have not been sorted * It is now legal to have `external` HostGroup objects ### Rendered Config * Custom Endpoint objects are now rendered to their parent zone * (Rendering) issues with the `in` operator have been fixed * You are now allowed to put Notifications into specific Zones ### Usability and UI * Selecting multiple hosts at once and deleting them had no effect * Documentation got some little improvements * German translation has been refreshed * Header alignment has been improved * Escaping issues with the Inspect feature have been addressed ### Kickstart * Kickstart is more robust and now able to deal with renamed Icinga Masters and more ### CLI * It is not possible to list and show Service Sets on the CLI ### Import and Sync * Synchronizing Data List entries caused problems * A new Import Modifier has been added to deal with LConf specialities * Issues with special characters like spaces used in column names shipped by Import Sources have been addressed * A new Property Modifier allows to filter Arrays based on wildcards or regular expressions * A new Property Modifier allowing to "Combine multiple properties" has been introduced. It's main purpose is to provide reliable unique keys when importing single service objects. * A new warning hint informs you in case you created a Sync Rule without related properties * Synchronization filters failed when built with columns not used in any property mapping ### Auditing * The audit log now also carries IP address and username ### Generic bug fixes * Fixed erraneous loop detection under certain (rare) conditions * Various issues with PHP 5.3 have been fixed * Combination of multiple table filters might have failed (in very rare conditions) 1.3.1 ----- ### Fixed issues and related features * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/8?closed=1) ### Service Sets * Various little issues have been fixed. You can now remove Sets from hosts, even when being empty. Services from Sets assigned to parents or via apply rule are now shown for every single host, and their custom vars can be overridden at a single host level * Sets assigned to single hosts have been shown, variable overrides have been offered - but rendering did not include the Director-generated template necessary to really put them into place. This has been fixed ### Usability * A nasty bug hindered fields inherited from Commands from being shown ad a Service level - works fine right now * There is now a pagination for Zones * Multiedit no longer showed custom fields, now it works again as it should ### Rendering * Disabling a host now also disables rendering of related objects (Endpoint, Zone) for hosts using the Icinga Agent ### REST API * Ticket creation through the REST API has been broken, is now fixed ### Performance, Internals * A data encoding inconsistency slowed down apply rule editing where a lot of host custom vars exists * Some internal changes have been made to make parts of the code easier to be used by other modules 1.3.0 ----- ### Fixed issues and related features * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/7?closed=1) ### Service Sets * You are now allowed to create sets of services and assign all of them at once with an apply rule * Sets can be assigned to host templates or directly to single hosts ### Service Variable Overrides * When switching to a host view's services tab, you'll now not only see its very own services, but also ones that result from an apply rule * You can override those services custom field values for every single host * Same goes for services belonging to Service Sets ### Apply rules * A new "contains" operator gives more possibilities when working with arrays * Service vars are now also offered in the apply rule form wizard ### Custom Variables and Fields * Issues with special characters in custom variables have been fixed * In case mandatory fields should not have been enforced, this should work fine right now * Fields can now be shown based on filter rules. Example use case: show a `Community String` field in case `SNMPv2` has been selected, but show five other fields for `SNMPv3`. This allows one to build powerful little wizard-like forms like shown [here](16-Fields-example-SNMP.md) ### Agents and Satellites * It is now possible to set Agent and Zone settings on every single host. This means that you no longer need to provide dedicated Templates for Satellite nodes * The proposed Agent Deployment script has been improved for Windows and Linux * Infrastructure management got a dedicated dashboard * Kickstart Wizard helps when working with Satellites. This has formerly been a hidden, now it can be accessed through the Infrastructure dashboard ### Commands * Command arguments are now always appended when inheriting a template. This slightly changes the former behavior, but should mostly be what one would expect anyways. ### Testing * [Testing instructions](93-Testing.md) have been improved * Running the test suite has been simplified * While we keep running our own [tests](93-Testing.md) on software platforms, tests are now also visible on Travis-CI and triggered for all pull requests ### Compatibility * We worked around a bug in very old PHP 5.3 versions on CentOS 6 ### Activity log * You can now search and filter in the Activity log * In case you have hundreds of thousands of changes you'll notice that pagination performance improve a lot * A quick-filter allows you to see just your very own changes with a single click ### Deployment * More performance tweaking took place. 1.2.0 was already very fast, 1.3.0 should beat it * Deployment log got better at detecting files and linking them directly from the log output, in case any error occured ### Work related to Icinga 1.x * Deploying to Icinga 1.x is completely unsupported. However, it works and a lot of effort has been put into this feature, so it should be mentioned here * Please note that the Icinga Director has not been designed to deploy legacy 1.x configuration. This is a sponsored feature for a larger migration project and has therefore been built in a very opinionated way. You shouldn't even try to use it. And if so, you're on your own. Nobody will help you when running into trouble ### Translation * German translation is now again at 100% ### REST API * Issues related to fetching object lists have been fixed ### Integrations * We now hook into the [Cube](https://github.com/icinga/icingaweb2-module-cube) module, this gives one more possibility to benefit from our multi-edit feature * Icinga Web 2.4 caused some minor issues for 1.2.0. It works, but an upgrade to Director 1.3.0 is strongly suggested 1.2.0 ----- ### Fixed a lot of issues and related features * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/5?closed=1) ### Permissions and restrictions * Permissions are now enforced. Please check your role definitions, permission names have changed and are now enforced everywhere * Configuration preview, Inspect action, Deployment and others can be granted independently ### Auditing * Director provides a nice activity log. Now it is also possible to additionally log to Syslog or File in case you want to archive all actions elsewhere. Access to the audit log in the Director can be controlled with a new permission ### Configuration kickstart * Now imports also existing notification commands * Kickstart can be re-triggered on demand at any time ### Performance * Config rendering got a huge performance boost. In large environments we managed it to deploy a real-world configuration 5 times as fast as before ### Import / Sync * Various improvements have been applied, mostly hidden small features that should make work easier. Better form field descriptions, more possibilities when it goes to syncing special fields like "imports" * Property modifiers can now generate new modified columns at import time * New property modifiers are available. There is a pretty flexible DNS lookup, you can cast to Integer or Boolean, JSON decoding and more is offered * Datalist entries can now be imported and synchronized, this was broken in 1.1 ### Configuration possibilities * You can now define assign rules nested as deep as you want, based on all host and/or service properties * It is now possible to define "assign for" constructs, looping over hashes or dictionaries * Improved Icinga 2 DSL support in commands, implicit support for skip\_key * More and more developers are contributing code. We therefore simplified the way to launch our unit tests and provided related documentation * Other objects can be referred as a dropdown or similar in custom variables ### GUI and usability * Form error handling got a lot of tweaking, eventual exceptions are caught in various places and presented in a readable way * The deployment button is now easier to find * Configuration preview has been improved and allows a full config diff even before deploying the configuration * Inheritance loops are now shown in a nice way and can be resolved in the GUI * A new hidden gem is the multiedit functionality. Press SHIFT/CTRL while selecting multiple hosts and modify imports, custom vars and other properties for all of them at once * Errors or warnings in all historic startup logs now link directly to the related config file at the time being, pointing to the referred line ### Agent setup * The Windows kickstart script got some small improvements and now enables all related ITL commands per default ### CLI * You can find a few new commands, with the ability to list or fetch all hosts at once in various ways being the most prominent one ### Related modules * There are now more additional modules implementing Director Hooks. AWS import for EC2 instances, ELBs and Autoscaling Groups. File import for CSV, JSON, YAML and XML. We heard from various successful Import source implementations in custom projects and would love to see more of those being publicly available! 1.1.0 ----- ### Fixed a lot of issues and related features * You can find issues and feature requests related to this release on our [roadmap](https://github.com/Icinga/icingaweb2-module-director/milestone/4?closed=1) ### Icinga Agent handling * A lot of effort has been put into making config deployment easier for environments with lots of Icinga Agents * Related bugs have been fixed, the generated configuration should now work fine in distributed environments * A customized Powershell Script for automatic Windows Agent setup is provided ### Apply Rules * It's now possible to work with apply rules in various places ### Notifications * All components required to deploy notifications are now available. ENV for commands is still missing, however it's pretty easy to work around this ### Automation * Job Scheduler and Job Runner have been introduced. Import, Sync, Deploy and run Housekeeping in the background with full control and feedback in the GUI * There is a new intelligent `purge` option allowing one to purge only those objects that vanished at involved Import Sources between multiple Import and Sync Runs. ### Data Types * Booleans, Integers and Arrays are now first-class citizens when dealing with custom variables icingaweb2-module-director-1.11.8/doc/91-Want-more.md000066400000000000000000000014531516513262500221100ustar00rootroot00000000000000Want more? ================================ Icinga 2 configuration is a full-blown DSL, not just a configuration format. It provides endless possibilities, the very same thing can usually be accomplished in various ways. Director tries hard to offer you as many of those as possible while strictly trying to keep things simple. You are absolutely right if you think that this might not be an easy task. We do our best to give you as much flexibility as possible. In case you miss a feature or have a cool idea of what else we could add please let us know. Just file an issue or a feature request to our [issue tracker](https://github.com/Icinga/icingaweb2-module-director/issues). The Icinga project is and remains Open Source Software and lives from community ideas and contributions. icingaweb2-module-director-1.11.8/doc/93-Testing.md000066400000000000000000000234641516513262500216640ustar00rootroot00000000000000Running Unit-Tests for the Director ======================================================= There are basically multiple ways of running our Unit-Tests. All of them are explained here. Let others do the job --------------------- Well, as there are tests available you might come to the conclusion that there is probably already someone running them from time to time. So, just lean back with full trust in our development toolchain and spend your time elsewhere ;-) Cheers! ### Tests on GitHub When pushing to [GitHub](https://github.com/Icinga/icingaweb2-module-director/) or sending pull requests, Unit-Tests are automatically triggered. ![Build Status](https://github.com/Icinga/icingaweb2-module-director/workflows/PHP%20Tests/badge.svg?branch=master) ### Tests for supported Platforms As far as we know, Director is currently mostly used on CentOS (or RHEL) versions 6 and 7, Debian Stable (Jessie) and Ubuntu LTS (Xenial). So we are running our tests on our own platforms for exactly those systems. All of them with PostgreSQL, MySQL (or MariaDB). This way we reach the mostly used Database and PHP versions: ![Test result](screenshot/director/93_testing/931_director_testing_duration.png) Run tests on demand ------------------- The easiest variant is to run the tests directly on the system where you have installed your Director. ### Requirements * Icinga Web 2 configured * Director module installed * A dedicated DB resource * PHPUnit installed ### Configuration You can use your existing database resource or create a dedicated one. This might be either MySQL or PostgreSQL, you just need to tell the Director the name of your resource: ```ini ; /etc/icingaweb2/modules/director/config.ini [db] resource = "Director DB" [testing] db_resource = "Director Test DB" ``` ### Run your tests Just move to your Director module path... cd /usr/share/icingaweb2/modules/director ...tell Director where to find your configuration... export ICINGAWEB_CONFIGDIR=/etc/icingaweb2 ...and finally run the tests: phpunit Try parameters like `--testdox` or `--verbose` or check the PHPUnit documentation to get an output that fits your needs. Depending on your parameters the output might look like this... ``` PHPUnit 5.1.3 by Sebastian Bergmann and contributors. .................................................S............... 65 / 81 ( 80%) ..S............. 81 / 81 (100%) Time: 1.8 seconds, Memory: 10.00Mb OK, but incomplete, skipped, or risky tests! Tests: 81, Assertions: 166, Skipped: 2. ``` ...or this: ``` PHPUnit 5.1.3 by Sebastian Bergmann and contributors. s\Icinga\Module\Director\CustomVariable\CustomVariables [x] Whether special key names [x] Vars can be unset and set again [x] Variables to expression s\Icinga\Module\Director\IcingaConfig\AssignRenderer [x] Whether equal match is correctly rendered [x] Whether wildcards render a match method [x] Whether a combined filter renders correctly s\Icinga\Module\Director\IcingaConfig\ExtensibleSet [x] No values result in empty set [x] Values passed to constructor are accepted [x] Constructor accepts single values [x] Single values can be blacklisted [x] Multiple values can be blacklisted [x] Simple inheritance works fine [x] We can inherit from multiple parents [x] Own values override parents [x] Inherited values can be blacklisted [x] Inherited values can be extended [x] Combined definition renders correctly s\Icinga\Module\Director\IcingaConfig\IcingaConfigHelper [x] Whether interval string is correctly parsed [x] Whether invalid interval string raises exception [x] Whether an empty value gives null [x] Whether interval string is correctly rendered [x] Correctly identifies reserved words ... ``` The very same output could look as follows when shown by your CI-Tool: ![Test result - testdox](screenshot/director/93_testing/932_director_testing_output_testdox.png) Running with Gitlab-CI ---------------------- This chapter assumes that you have Gitlab and Gitlab-CI up and running. Our `gitlab-ci.yml` file currently supposes you to have shared runners providing specific tags and the following operating systems, each of them with MySQL and PostgreSQL installed locally: * CentOS 7 * Debian Stable (Jessie) * Ubuntu 16.04 LTS (Xenial) ### Preparing the Gitlab Runners The following instructions suppose that you provide runner instances with a very basic installation of each operating system. We used naked LXC instances immediately after launching them. For all of them, please define the following variables first: ```sh # The URL pointing to your Gitlab installation GITLAB_URL=https://your.gitlab.example.com # The registration token for your Gitlab runners REGISTRATION_TOKEN=iwQs************kLbH7 ``` #### CentOS 7 ```sh yum makecache curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | bash # Sad workaround for container/chroot issues sed -i'' 's/repo_gpgcheck=1/repo_gpgcheck=0/' /etc/yum.repos.d/runner_gitlab-ci-multi-runner.repo # Package installation yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install -y https://packages.icinga.com/epel/7/release/noarch/icinga-rpm-release-7-1.el7.centos.noarch.rpm yum install -y php-Icinga icingaweb2-common phpunit mariadb-server postgresql-server \ postgresql-contrib gitlab-ci-multi-runner # Initialize the PostgreSQL data directory postgresql-setup initdb # We do not want to use Ident-based auth sed -ri 's/(all\s+127.0.0.1\/32\s+)ident/\1md5/' /var/lib/pgsql/data/pg_hba.conf # Start and enable all services systemctl enable postgresql systemctl start postgresql systemctl enable mariadb systemctl start mariadb # Fix platform-specific encoding issues echo "UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1'" | su - postgres -c psql echo "DROP DATABASE template1" | su - postgres -c psql echo "CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE'" | su - postgres -c psql echo "UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1'" | su - postgres -c psql echo "VACUUM FREEZE" | su - postgres -c psql template1 # Grant the gitlab-runner ident-based admin access su - postgres -c 'createuser -a -d gitlab-runner' # Register the runner with your Gitlab installation gitlab-ci-multi-runner register -n \ -r "$REGISTRATION_TOKEN" \ --executor shell \ -u "$GITLAB_URL" \ --tag-list centos7,director ``` #### CentOS 6 ``` yum makecache curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | bash # Package installation yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm yum install -y https://packages.icinga.com/epel/6/release/noarch/icinga-rpm-release-6-1.el6.noarch.rpm yum install -y php-Icinga icingaweb2-common phpunit mysql-server gitlab-ci-multi-runner # Start and enable MySQL /etc/init.d/mysqld start chkconfig mysqld on # No PostgeSQL, 8.4 on CentOS 6 is too old # Register the runner with your Gitlab installation gitlab-ci-multi-runner register -n \ -r "$REGISTRATION_TOKEN" \ --executor shell \ -u "$GITLAB_URL" \ --tag-list centos6,director ``` #### Debian Stable (Jessie) ```sh # Package installation apt-get update -q -q apt-get install -y -q wget curl wget -q -O - http://packages.icinga.com/icinga.key | apt-key add - echo 'deb http://packages.icinga.com/debian icinga-jessie main' > /etc/apt/sources.list.d/icinga.list curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | bash apt-get update -q -q DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -q -y \ php5-cli phpunit php5-mysql php5-json php5-fpm zend-framework php-icinga php5-pgsql \ mysql-server postgresql postgresql-client postgresql-contrib-9.4 \ gitlab-ci-multi-runner # Grant the gitlab-runner ident-based admin access su - postgres -c 'createuser -a -d gitlab-runner' # Register the runner with your Gitlab installation gitlab-ci-multi-runner register -n \ -r "$REGISTRATION_TOKEN" \ --executor shell \ -u "$GITLAB_URL" \ --tag-list debian,jessie,director ``` #### Ubuntu 16.04 LTS (Xenial) ```sh # Package installation apt-get update -q -q apt-get install -y -q wget curl wget -q -O - http://packages.icinga.com/icinga.key | apt-key add - echo 'deb http://packages.icinga.com/ubuntu icinga-xenial main' > /etc/apt/sources.list.d/icinga.list curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | bash apt-get update -q -q DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -q -y \ php7.0-cli php7.0-mysql php7.0-pgsql php7.0-json php7.0-fpm phpunit zend-framework php-icinga \ mariadb-server mariadb-client postgresql postgresql-client postgresql-contrib-9.5 \ gitlab-ci-multi-runner # Zend Framework is not in our include_path ln -sf /usr/share/php/libzend-framework-php/Zend /usr/share/php/ # Allow non-root users to use password-less root mysql -e "UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE User='root'; FLUSH PRIVILEGES;" # Grant the gitlab-runner ident-based admin access su - postgres -c 'createuser -a -d gitlab-runner' # Register the runner with your Gitlab installation gitlab-ci-multi-runner register -n \ -r "$REGISTRATION_TOKEN" \ --executor shell \ -u "$GITLAB_URL" \ --tag-list ubuntu,xenial,director ``` A lot of work, sure. But it gives us a lot of confidence when shipping our software for various platforms. ![Test results - History](screenshot/director/93_testing/933_director_testing_history.png) ### Docker, Docker, Docker... Yes, yes, yes. In future we might eventually provide a similar solution based on Docker images. Working with throw-away containers seems to be overkill here, as tearing up those containers would waste much more resources than running the tests. icingaweb2-module-director-1.11.8/doc/screenshot/000077500000000000000000000000001516513262500216405ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/000077500000000000000000000000001516513262500234535ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/08_import-and-sync/000077500000000000000000000000001516513262500270065ustar00rootroot00000000000000081_director_import_source.png000066400000000000000000002266261516513262500346300ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/08_import-and-sync‰PNG  IHDRüNm-ØEbKGDÿÿÿ ½§“ pHYs  šœtIMEà ŒU IDATxÚìÝwTT×ÂÆáß0 ½w{ÇÞk¼&Æ–DcbªÆ´›êMï‰1½›ž˜\£ÆXbï½b bT¤×æûDTT‚æ~jÞg­¬§œÙåÌ™wï³ÏÁÀçˬˆˆˆˆˆÈuÉFM """"¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""" ü""""" ü"""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""" ü""""" ü"""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""¢À/"""""×Ûš¾Ñú`WµžT‹á‹åj‘ÿ'šáQà~Qà~Qà~~Qà~Qà~Qà~~Qà‘«“­š@DDªÃhïÊ­Mjqg˜-Üíp±“œ™Ã’C'øtç)v©DD<ýüé]’Ê”´¬U<ïàO¢T¦¥Wýüßáÿ}†¿`ë8† ¹w·\]XBZì,~›½•ôíÐWƒwéŠõÁ®ä÷óÁ»êÚ¨%Ö»bÕˆÞ¦ËüL;oŽéÊÎ¦Ž˜Êÿß:¼Ñåß*[g>ÜÒ»²±¾=µ‘÷`WµuÁA=v^ßD6)ë›sþ³ÜÛ– ½Bèéò?:\UÑ—bCpX›îjɤÖôñ±Ç¶¨ˆSÅFêúy3ªMCvŽlÁÛ!všE‘4À0 ªÏäÁyÚ׈áܰÎ’õ™2¸yŸÿüßEÇæ¿¤˜´ØYLÝÜV}šãeT‹\kÑÝ1•©çŽ!m¸©ëßó¡V [³±Ë3“_`Ã#ÃxÄß—Ë÷ðÍ Eι,;aKfV /^ˆ…?7bzn)`ÀÆÖ–p_Š gQ-GzÿºE…sÎëK Æ‚#¢‰íí‡LYÏó»28`)›—2983 I]>kåÅú·Äwn,£i‘fØP‡–6€ã6†?vò™|¯ p– ¡™0yòÁ F”NßÅ'iÿL¿¿\_ óH¶÷à`;~/¢´ÒS&Wîõ±r8³”P—+S³ùÏì-g…$G{#fòK|:[,@þaúOW]jP½)á?dTê¹]ILÊhÁî¶<rˆ%çôë•sœÛ—ÿl¶®üÔÿÒl^úcož,>«ý-æ<¦mÜÉò京º)˜{zE²`Òn¦ä[Õx"òbÀÁÞ„gå3ö§Cÿ.¾3ÕfÑMåaÿ4£-~v ð üÅIüþÄc,iõw;.á÷¥ÛHH7Ô¨·„ßÖ‰|ýÇö§˜q iÏ->@ßP¬éKxvô©ýÌX¢b§1oã.Žæ»Ò #CïFÛ»²Ó&¥yXô?Í%>)Ï`"[ßÄÈ;ºêhË1¦<þ+;Žc¬ïŸ¼÷í ƒ?äý&æ?ý?˜Ã†Ï¥ñ&òrk§**a¥èÄz¦MœÊÒGÉ,´Å5¨!]o¹—aƒ°;ý²K•¥p_Žyžm]ßáÓ;Ã9½¥èÀw<ôÌzÚ¾ý9÷Ö9Yuy‡c[šGüüøi~,û“s°õ §UßÛ9 i¥³Rc§óÔì<˜BƒQíû3bD_¢]¯Áõ ùé|•V‹ypàÉÖ3_İðš¦ñÜIWÞªø ¶´nX—w{ÓÖÓŽ’ü<ÖJä‰uÇÙ^tú%Ž Š©ÇËõÌuªÔ—ä\ªŸŠìyxH[>µ=DƒÉGØSZ6s3ydSnµËaôO[ø:× ˜¸e@{~óI¡ûO{Xf¹ÚÞ†MCéf´²jEãÎ û•y©‰¼Á“Ým|x½¡37åQˆˆÈ?…•‡ãé4Võ ¢nåÐ?$†±»³—7k//þ{'±*ŽæWi£¥,úˆoâüéy÷ãÎ…ÖƒîãÞÍ0í™ÍûOŒcÑɰæ÷ãXžùf)éµ»sǃ2¬K '~ÁSÏþB¼ÙZñù9;&òÆwq¸¶èN—(WlŒ>t{îïàn]xêýOy¤‰cÕ¥/ØÃ/½Ïô½.´p/cî¹™–Nû˜ýÑ[L9Xž2ª]–êµ×y嵿²ó»§yöûuXÜÈ}ahs6ÿò:oþ~˜²Rs|þ[<:n*qŽ-<ú!.YK¿ç…&±ß|-ÎÐYX²;“†ú;WFÛ828Ú™´ÃÉl,:{ÌÛ¥cK6v¤Vú Æ.ÛÇóû oŶÁá´1•½÷µfZ3ŠòèŠCü’ãÌ«ý¢èVåâ»bæ.ÜÄÍqE`IeÄ” J¨j‰ƒ õ5fo¿P:YÒxsù^Ý‘ƒýV §m¥k ¼‚#˜×É´#ÇùùD1¥v|psCž °ðçÖxî_uŒ?‹Üy¢Wc^ñ½þž»¹9ãdçW´ã¹mRrÉö´°|wö^ÜåWi®ÃèÌí‘”Obj¶µÊÃäE·k,bqB>xxÓÑ©l‡pðð¢€3|mË&L.Üìk /9…­–k¤áNÜj–4Þ>`¦ø³½{Ž²Ê ‘u½Öõ"ò ýÇÇÓiÞqV~¸Š°ÿöÌí¼lùŸ„ý²´sµ²oÏccGÐÀѭñlÞÄgB¸ã¹‡éígá~p=ϯN ÍåoË3vã•7GÓÈÙô¢GŒ?cŸœÌoÄÓiÈ1~žw—NÏ1îѸºÑ©Þ»<üî,~Ùô/^j[¾ýf~ð)Bì+.¨pöñÇ×Ùl]ð ÀˮꢟÜÂÖt ž|šÚ¹bºµ‹ÀýÇÕØä˜±b‡5mí¥ËSýæ:·¼%'f1qA ~7½Í«wF`Ð%†à¼y{Þ\x¨âLþe'¥ F3þÅ^øºÒ¹ñ×<öê,&®¹×{ø\s÷nMMJfqI#F…Úóý®²bçîË]žf,Ï!'¢Ržqñc|cGÒãwÒvqiV€ãür²úÖæ­ÐDæ†ðZ-önÞLǹeëºãN0¿ 5k›:Tù…ÏÍ+à°¹J‹9šU@¢LçŒ ö¼ÞÖcò~bf's¨àÿMŒ$n@mÞ¯—Hç}e¯õ 0òöoy·|ŸƒO078Ê»•`Á üMJŠŒØPú?;ˆ\Y\Lø:–•Þ`4æïϛݼq*Éà³C…ãTe›ì½.Ùž]’™oñ¦_” ®‰™äŽÞþÜæRÊ¢µi•Îýµ~ê}$#mj1È×–os‹ ô$¸(›Õ¥nÄ„:át(‹/:ØYY»?›¬k¥;Œö4s22Ùw‘AŠÁhG¤‡öF+GÌÐÉՃξ8YHÈ,$O«{DäŸúí§Óæ‹ñà ³ƒ¢¤Íìη¥QÿvøÏ”Á9º]|­Ü|ìš<%_jÎäË£%´làC›²Ý<²^‘ù§ø>õì c\¼½iN¿îÈ,ûeRŽ%òG¡V¡.4¨íÙŒß[é"Î6ïJb÷e”ÓÑÇ.v¥,Û~ŠÃ•¾õ™'’ù9Z„:ã|úÁ“‰ü\éö]Ey9l·@—õy¯‘7ÍœŸÆØEq<Ìr†}žØŽ”»;rwNÞÃú>uèaÈæ½{™˜[©“Îi“ê´§Sa_-Á³N-MeÇ‘&Q¾[ÒøäXÕ×Tg»Æ¬TØîŒ3¶´¬ã„99‘ãäI¨Ñ@P!dóë ×Rþ5Tü„]äçÍjCÛ˜¦lÒ€ހɛï·àÓ[¬ û"ò ýæ"2«:þ“RXú?ÿ¸jgømL¶çFŒ&Œ—HàµÜ9ëæ9G¼}ád*Ù¹ゟë9Õ6ºàçéy”à^6PððÄ¡†÷J2¸ÇðЫ£ùuÒL~󳿃G81ÝofØ v;@QnuÊâq¡_×ó:»¼¥ä§ç®ø»ž}+!££~å3Íy©äQ̶wîbhUŸã™K‘ ×Ú­˜5qid÷dˆ[ãsœéHr¶Y aåxé`ÂKÙlüY£ ‡Íàæl³È–\ϹǸÅ\À)À§¦_>{{<±¡Ï ªèy&ʇ\ùETꥩÜ=s?o´«ÍóDg(ÍÏaÆÞc¼›Â˵z,â—ûø9çÌòºüüv¦›É8§‘Îm“êµg1ëâÒȪëÍH_#ËSœYמԄ$V^F?Y²™šTÌýA^D8@?»Öe±¦0K=o:8''Ô R°üZºÀ¢¤ˆ]ùÐ×ÍHS" /8Êæ§ÅÛ ¸±o”¹ã¶íàæyºÓ‘ˆüãx†±x@šW•ŸL¼?°ü±‹Sÿw÷á¿îîÒ“—šG)ngB¿ÕLfºyœÙ…~ôrÅßêÏ`§Bþ»+»üâÜšöS1[â³)Œð¦o t´33é„…4K*»¨ËÍAîäúØ»5ƒ¤kéôKI>3ñToƆ۳xOá×ñ[-¹¼;w'ƒ34e½×g’¡Ù}ù‡†ýg…¸Rа9sÓ“çÿ<ô_w—U[°„Õf¡,I˘±ÇŠstcBÂ[F:«çÅUZSj%{ûÖçØÞ2øÌò—K°^䙜ïóШçøí°ƒ½uwâæQ1<r’Yö!Õ)‹ƒòNåœÉ™Öv/Þù¢¥3àZ¯cñòc•2ª™ýÿ}ž'Æ~K\»Z-ˆ´Ëe_|Þµ‚ .û/Èå$‹þ™EI%×îR”Í7‡-DF0¨?¡9'ù9íü¤•—žÆVìÖØÏJû3ØÁʖùìIÊ$7Æ6páÌ2|#MÔ¢Ée1?# Å&ÚûÛ˜‘G\ùû ¸¿}8£= \šãÖ„‘-xÕdžRK!;O2~EÏo_üÿLV»=‹²ùöŸÐ îkâƒ_Öq¾K+½ìífœ<ÉF«3÷7õ'¼0‹%9¥çg17Û†ÎMkÓÓÎÌŒ#f®­?F[†­GÙhµ¡[ç<îsñ?SjÎà©ß7Ðté©kk`#"òw…}k.ãg®'|n2 •_\ú/u\½R®¿ûðŸšÁË/å0¨g4®¹ûY6}Gl£¹{p4Î>aÜÞw¯Ì‹çK‡Ð¯¹?¥É›ùsÚz ‚0¢'6ä]4HÛØÚ@ö¶m߃]t!çݺҀSH}ܳ¾gê{ŸaC-c&‡w¯aÞAÜo#}:\º,&ˆ1±hÝ&üqÝB yã ¦Å9cÇÅ×l˜‚û2¢ÃÞ›ö¯æ ¡{}Š®à·Üø$M\  Í6(œ±“_ãÅÜAôiæ©زd.›òÚñä.®Ù¡„Íq©œŠªÍw8›B\ ¨8'…gw…°´QcÖØá“#Øxøðx+_Ü2ñÌÁB²KŽñrbbš³Âå(ß°àÀ³ ìȼŒZÍé<¿%‡Ø˜¦¬°?—ÇÌX]\ùWý`n²Oaè²bJ©úÊð¬ô,N:FðRŸh,[RÙWjGÓZ~<ì q±$þÃVõÚ³|ߨ“JJt oÔ…íkN²¯ä lלÅäTø<È˱4v[ X˜láùhWœó“˜™yíuŒ%+™ÛWz±µ‹ï mIÃÕûyqO&ÇʧúmLŽôiL·ìc<Ÿ`ÆRXHª~÷EäÇ€ÉÎ×sÃþ¬í<—d¡”øò yƒ?ý¼ÑÓ?õ>ü—©þC¯ÑuÏ/üñߥœ(t#¸~?»ÿv:Ù¶4ºçÞžÈĹ øaUxÔ"²×žº£{ù}ø/£©Õ±;Ñ+§1yü8žÿŠÿ4?ÿ֜ƀ><ýœ™'Ígæ—k(°qö‹ õˆ¹ýư²gp¾tYð¢ã#OsüË™ûˇ¬w ²YwΙ_žvñ†°ñ í£òrøw&,ÈÃÎ+ŒßgäÑåëòí ü:úÿÊ÷,äÇéÚ{Þb(cGÜLkÏk{š87õ8ÓòãTÀÏñù¸¹˜e«bi“^—÷šñQ=;¬ùù¬ß½¡ë޳­<´}5g§ÚÔãåzuø²A)O¤óÖŸ‡ðêÜ„.cP²}ó6e…ñqË Þ²ÇÙRÈ–£‡¸î(3ó­`¼PKbð>h[‹±]ýp5XÉÌÉfæºí<»=÷:»ÿlÏry§Žó{~ cœ²ù<Á|‰ás5·[ZÈ’„|ðub÷áœò;ñ”°ëP…Ñ^ä'žbwñµØ®¥ؽ›Ö%‘ÌëîÏÈNÍÙ©„ä¬B²°%ÌÝ€[V$íaŽY?û"òOd%åÈ:Í1°ú_ADœöËž?~(žŽó ¬¾!ðÒÞ˜¹WþG÷á7ðù² *¬v½º~’Ò—ðì¨ Ø?5‘×Ú:k¿»šÆ¼_,W#ˆ\\<Õ¼w„yÐÜÅ#V2²²Y˜pœ÷·d“Y‹öEäŸz¨]‹ÁÅ'™p¼ª»æ f@Ñq¾:Q¬ûð‹ˆÈÕÅœ›Á'«2ød•ÚBD¤jVNKäó‹<Ÿ|ôþÇ¥ÒßB¹Ž)ð‹ˆˆˆˆ\Ç®›%=6^=?­‡zTDDDD¤rNVˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆü¿2X­Vë_}ÓÆ‰‰‰Q뉈ˆˆˆ\å4Ã/""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""" ü""""" ü"""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""" ü""""" ü"""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/"""""5fûÿ]€¢ßñÐ3óȨîBîâówûão¼Äë,ǘòøãL9QöÏÈG¾åÍ.(áÄì§yxâѲ'BïcÂø¾økZƒ+½=‘ë(ð_MJNÌ⩇âuóõ8zxé$ˆÚLDDDäÚuÍ%3“ƒúMDDDD¤Z®²~Onxûsî°û[Ç8ž­ïæiŸ\J׺¸Ù\MÛ¹n XÍ$®Æ¤?–±õpŶ„µîˈ;Zb­ò Åœ\þïN;½¸ÿß|÷¦#±/ÜÍ{+¿. £na‚ß Þÿx8uL*@UÛóÞ¶¼yom-ÀçÆ·y«Ý~&ý0ƒµñéXŒ®„´èÅmw%Æ·”ÄÕ“™øûR¶'æauò%¬q7n9~¦²3ÖÖ¾x¦Œ~ßa\û&?•{NQhãL`ÃvÜpË0úÔwçüKJÉ?º?g.`íÖ}$f[®A4iÛ“7v$ܵò» Ù;á^X’€}Û—øö/6þ÷k~]ÇÝãè¿â)>ªQ›•w]Q ;æOeÆÊÝIJ!Ûb‡›!Ñíé?¸-ƒª8›óëq^»½ÇÇ·‡RQ´Â}|9æygØÓæÅoyº©c5êÿ)oõò);Efµºk!Óg-csÜÒ ­Ø{Õ¢NÝæô¾u(]BϯGI6ñ˧3}Á:vJÃl5ààFã¶½8¸‘nºDDDDøÁšÃΟ^äµÙ‰gÂ}q&‡ÖMæõ=Ûˆ.¾zŠš÷3ÏÏÞÍ©ŠÀ—ÃÑMÓyg_2û¥3eæ~*Š›Šƒ¦0nG~4–ÎÞç‡?KÒ\Þ|f9KNçà<Žï\Ì÷;7°ûáñ<ÞÕ¯RçZH^ò1/MXOæÙ[!'yk¦ïaÍ‚•Œ|õiú‡:T½dªäË?|ï6çàVzyíQšË7ÏcÑÉÊ‘}ò0»Nf׊ٴzà-žìx&œ_‰zÔÔ¹õ?½ÃYóØûÛë¼:í–ÊÃ¥ô$ö§'±ÓRVŒ|gú×ÁþtŠ™ÿÞó|»%¯òÎŒ9í ›æ|ɦe¸ç§¸!Ä^Ë×DDDä²]ËO¬dmþ–÷*‡} 8{º”…¤Ì½ìÍ­î¶œh2fƒ‚l¡ä8Ë~]CÅ©_žzí~ÚúØR’˯Žc^Ru?׈K­ºÔ3îÆ¡â1GÂ#ˆ¸bwœ  ßóo0²¹dmåÛ§ßdQúéç<èüø[Œéà‡mþ~&?÷¿'–=srÏqŠ¡ªÕ1A}þÃËw·ÆÛ¶„ô؉¼6n.‰%{™1ïÝG†cgÍdó¯sH>ý&ç–Ü÷úãô qÀ`-"yÅç¼üÙš²Û¢¦-ä×µy­§Ïù#Á¼tŠÝÐû_í‰òsÅ­®;®A~5k3Ëq6oϬ¤EŽùŒ7zxcX öóÓÏ1ûPDz¸ºwöÀp¥êQSçÕßCI*k§,'ëô^q+o¾<„GVóA¦½0–ß$³`ÞŽ©]ΦÍ9½cºÒé?òHkl€’Œ |òø»¬ÉNÌerì¼ÐÁC³ü"""rY®Ùþ’´m¬:JEpêòÀHÚø”_Œ^-þ@/<®¢òcH3Œ€Ñ½]šºžy2t·µõÜÂèÐÆ¿â)kQÅUMôº÷à­ñ¶-°xµÎ}<+žNÝBJ1ŸÀª8KÅÀ¦þ÷Ó+¤|¹‹ÁŽ .÷1ªÍéÈneÿê}äVõy¶ 3þeF îK—NhtËM¬ Š*þÁ±³Y¶ëù%`p¬ËÀ'ŸgìØ±Œû Ã#˧ʯT=j<4>¿þäųö€µbÐÖý®›ˆp,kƒC}‡¶Æµ¼‘ŠŽ&³ ¬a—¹ü->ݸ©™GÅ—ÐèÙ‚Ý}NŠˆ[O¾ŽQ"""r¹1æÚ*­¶å1Órr/)§whD—zNgPǰN4u^ÄŠ¼«£èn>gÖp6¦3ëòMÞœ¹ÎÔpÖsâÔ¸᎕q ¬c3\,#àT<§,q˜äŠpJ׿Þg_Ðkp!²m(l(»ªµôD©Åp;甂!ª/1>WèBR“/ ÃìX°µ¬`q2á•?™`ò!²UÚÄ´!¦eÎ|^qMëq…öðªê_œ~˜”Škü¨PùîR\Ûü‡¦ž5L%åè±3g¥Rgñô°YüLKR<©–Ö8›t ‘ë&ðWÿ¶œ%æÌé× çs³¨Ñ ogà* ü›‹Ì‡Ûüõ¹r'/§óîÄcãä…3”~K>æ°åPXñ<Îý,vnîØCÙë s(¬â‚\;W'l¯ÔÚƒmË ?cú®J—ßZRÙ¿nû×ÍágÜU®„ IDATipã‹y±|óÄÝü‚k~"GR+-£ñé͈Ž>ÿæ6³«Ó‘fN+X“XðÃã°ºI]¼móIK>ʤ¬Š×z6ˆÂÓPÓzØÜ2 Ãú½eƒƒ‚X¾xäv~pu 0§€ËZ"oô§óÐ6L}oCY0?6ƒ—ï[AH¸7ÅIH®X_DßQ8xÅpK×I¼º4ÈcÍ;’ܪ5aNù$ØÅÞäÓ?€Î]êâ¨c”ˆˆˆ\¦ko†¿¤°ü6•F¼;>È#]¼*=YJîé°oHý_l ÷(šWœ5°rtÑD&ü¼±|ýêâÕ ì¶£¥9g‡}|èöè:zŸéZûˆÛxvtL¥Û”ZH?špvHvmÉ=ÏÝI}'ÃßÞfç&Œ|¨;~}šJüÖ ¬ß´“ø¤¬3Ëì}º3jHDÅÚýšÕÃ϶#èX¹V Êþ),†zö5ÿúxÄŒæ©þ!gVî—dp4¾rØw£å}cjwºò4ºëi†Fœ&åshó –®ÜT)ìûÑíÉW¸-Â^G(¹l¶×té^´{è}ÆEOfòìÕìLÎ£ÔÆ•–½¸õö¿ý SOü…í™ê0èéÈúj*«÷§QxWݹþ¼4h3'- öh¥g‚štâ¦aÃèá|ÎHÎŽZ½žâãÈuü9ck¶í'9§0âI³ö½pcÂ\j0þ«Q›ñj3†¿êÆÊ9³Y²å ÇO¥‘ShÅèèo@(M»öçÆžM 8ëÎ75«‡Á1š;Ç¿Kð'2{S<‰…]ChÖc#oòbÖc‰¯igÛ¸Ñtä8>m<‹cÙè0ÇR °÷ &4ª ÿºm mk9œu)¯Á)Š[^ÿ”èyÓ˜¹t{³±`ÂÅ'º-ºÓÿÆž4 tÐÜ‘+Â`µZÿò æ7£Öû_²æ°öÅ»ù ì6óø |oE×{ŠˆˆˆÈÅØ¨ DDDDDøEDDDDD_DDDDDøEDDDDäB튈ˆˆˆ\Ç4Ã/""""¢À/"""""×¢ÿ×?¼•‘‘¡¹OOÏk3ð_NÁEDDDDäÒ´¤GDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDþÁ¿ðÀ/¼ñÊ›ü–Px 4g ÙûײlÝrJµs] ~ã½ï¶’cU[ˆˆˆÈõÉVMp%•’½-+ö7"ªU®:rõöTÖn­NÅÛ%bó)ö­_Àñ¢ôîR{5Ï_R°u÷¼¹‹/~ËÓM¯úAyZì'צW¿æx«z…#¿<Æ“ÓsèøòW<Ö¸RÌq|öÀK,Ï ãÞ/Þæ¿3(M]È3|Í¡èGøæY>½{Û†ññƒ©u9GÚüX^¿kw|Æ»7`¼ªÚÓŠ9y3s§ÍdùÎÃÏ0cpô"0¬ Ý æ†Øô¹2ûåURÒôML|÷ æÅçSÿ‘/yµ‹'W_“8í ›œ ŽíxþË'hîl8ë;~tòã<1íÄ9ïsÄ'4‚¨fÝ8¨¡NÚyåú¡H*ÿH“;Aî¹Äm:ŠùÔ6&ñtD‡÷ë]1i±³˜:{%z‰€p#ŸýÛOb©ôLQÒFvæfM\•O ‰åP»M®¶®„5ޤA”ßux‹çðÆãùe³…ºÝncôÃqï΄š7òßqÿæ¥ßS¨î í—WÇÀääÊIÌw¥×èg¸«©ëÕyÌ´$²bi2`€‚-ÌßKÕ'q=h?b =ô=8†{†÷¢‰g*ëg|ÂSÏ|Ïvú•ëȵ7Ã_’ÊÊ Ÿ³%òvn°ßÂÊ­HʶÅ'¬=oê„ÇÌY½—c…8ù7¢ëÀ‰ °Ãš½…o>\Œß°[©½%÷æd¡~uÑ¥_wz™Ê¶o- ió"mØObj.W_‚£ÚÓ§W3ì PœÂò/&°£Ñ}Ü걞©swA§ÓÉ–M_}Ìü“ëùúÍõ„ {†‘QUÒãX¹`[ž$×bÄÉ'”¦]úѽ±7¦Ó/ºTY,ǘýÑwh:šGzVt¦%i.Ÿ|³‡ú÷?J?ÿŒªËÛÅ£µ€Ä X´q?ÇÒò±u $2¦'}Ú×ÅÕxæ‡(kÿ*æ/ßÁ¡ä Ìö„4lGÏž1„\hö£8…å_|Á¶ú÷0Ôg;ó—nãXN öža´èy=z–•Õ’Æî Y±õ )y°u§Nc:õíIS_Sûº:å68]ï0×ùÓ ®™DCõ#|°Ó1AûÚ1DÙ/aÓŽ}d–†âkS¶O¥lÙBšÁ—PçSXµÜ.íp5‘¼õ |iÑØ£}#^|ëún$k[~œÄ^pÿ;/Ñ'àÌÏIŸþ½iúÖã|ñû¯ìèû ­]4”¾>”R”W. èÔ¹9áWééÐÂÃKX‘b êŽ{q™ò-Ûçï «u<ÎÛ Ý‰jß•n•ÎÔaÆ Õxñãy|ôS Ÿ?ØMô‹ÿÿß/ ™±Óø3¨%]û¡Ý©-Ì_²–ÉŸÅbïEçƒè`ŽgùÜMÌý#º£Úã`ÍgØå\ŸöúÑҜȶÕë˜:Ꭰ•§…Ãó¿æÇ x5èD¯^XÓö±~õL¾<’Æ}÷÷$ئìó -dÒ‰ Üë5'²¶664>—E?2íP$·ÜÙ…`Oû Xðã6‡Ò¢C?‚ó8ºcë~Ÿ„Ïzšó¥Ëb¨~{W^kç~ÅO›ò©Õ²ý:9c>ËŠ%?sªäî뀉Ò6Nâ˹‡0…ÅÐéÆ@L™ñlX5ïfsߨ^_$!çîůZ÷¸…Φtv-]Àº©Sq ¸—vÞ%[ôS7Ö¶;í)8u„Ý›6ðÇ$|êCMÍúÚÛXr—bβP«×­ôŒÎeݲãäXÀUëy®Àde¿?ñKZ=ÇÝŽKø}é6ÒM5êÆícá·u"_ÿ±ý)f\CÚsË£Ð7Ôkúžý_j?3–¨ØiÌÛ¸‹£ùn„4èÈÐû†Ñ6À®l6±4‹~â§¹±Ä'ebãLdë›yG7BËÂS‚•Ç1Ö÷OÞûv †Áòþ@óŸ~ˆÌá?ÃçÒø?y¹µÓùupªK»p›læp~o|] P’ÎŽ É¢Gsk©Œ_¾šùíhî ”¤³'.\ºÒ"ÀT^†Ç™úß>ÕÇò2-oû:O-çûÉËÙŸ^Œ£czÜ>†ÛÛûa¬E'Ø0ù;¦¬ÞÍÑL‘-è5 1gMú^¬þv§˜÷̃|Wx}0„`[ `Žz5Œþò-zùØ€5›µ¯ÝÏ;ðÊ—™µži§²tÇQ2 mq jH×[îeXÇ  ‚KsII³€W$QÞçü”}iwëPâ—a[l-›iÅBjìt~˜²‚S(pð#ª}FŒèK´«Í…ûm°›ßÍ{ûÛðҗѤb…•…ÓþÍS8q×gãé`¬ùg ®âÇÐJщ‹µ‹…#¿ü›'gúñï¯^¦SEš4³gƒ¼¸:šg¾zšV.\|;%'ùó‚ûå%êSÃïšá’u«z€·öÅ»ù`/@ /Þ¾œˆ¿f\§<¦^¨M/õ]­qù/¦€„…«I75ãî.qL˜DìúùlÍhG7¯j,j0˜èx÷®^Ï{«g²ãÎF´uUâþÿ?¦† ¾­¡ö@T Åûö2#É^·ßL+ çãq|·+™ìÊ?`¶iÆÈ{o$Ì %Í£=øzÂ2–­N¢qçoÈÀ±ñíÜ7¨^ù¨¾kýÆ'¿­cɾ¶ÜY¿ür¬ˆŽc¡ƒÅ|<î^x8Á與—n¦ 䡌xdCèÐ[¸©aYØhÞ ç»°É/Š ²v]º,ÑÕo®sË[’¾–…›2ñh?#{×*;À7‹Æ×ü1¿nÜÀñö)=IJ¥‡( íÏý#ZáihN“ðÙ|>q- vÅpO ÷ |‹3]éñè`š»—d븥‘ðÝvŽdÓÎ#—ãÙN„´Èm}CË×Í7§{ ÍI"½‚jÖ×Þ–ê•Û5²}ð¢Ó !:\áAyÊ¢ø&¢'·Üý87&.æ‡_fñοáèÛŠ!·ÿ››ó·0åÛ|÷i8Mß¹‰€òP±é³WXãÞ–›ÝG¯¼ý,Ÿ1›÷Ÿ8̨_ ·Ÿ™¸ÇòÒÜÚ䎔&obîŒ/x*î8ãÞN=cÙççì˜È‡OâÛ¢;-£\±1ºÐí¹ðüù%>ÜÙ’§^JdÀ®90¸Õ¦6ìI 6±ˆÖÑöX³ãX{BïiJƒ:ûq¿‰5GÌ4oà€5ï [“ÀÔ´ !ö@qÕm’±á Þ6Ô¡ïð'bw‚5“'òçïá6Žþ~§X8î ¾Ùi%¬ËÍÜSß•œ¸%ü6~5E@€5ïõ¿…&mƒà×ÍìÍD°· –ãÛØWp„M‡òééã‚Á|„ %Ø7ê@{øñ¥÷Yhi@÷é’Åž•2û£·0}Àˆð D~£'‘Ѱh_|çŰ›ºÑ4ȱ|¨ÇÈ›Yq4àøü·xòÛØ7ºÁ£Ã±KÙÂÜ?¾ç…½i¼5~‘ê7ƒ+ {5ÁnëV–( Éék*,ÇX¹*CôÚù/ï3ªê­‚K·KPûöøMÿ“åq9tlïVv,4déÆlœZõ¦‹kAÜ%¶ãsý²õ±­Ùw-°¨}np¦ÅòŸ)¯1~Mÿ~}$ üÝ1Wu›^r_N½–?è"×8Xóö±`CŽ­ûÑÄÝ›^1¸¬]Á‚Mitîã[½k` ®Dw‡ØƒlM*¢m´f‚Dÿÿ1 ’€ÓßAƒ.ζàAŠ+e8¸9€ÕеÒ2<¯Vm©´ÊÆäׂµ—1ãð!R"9Ž+-Û„V:…gÀ¹n[¢÷²wÿ),õËnC?SÍÊîZ ;Ø·`: òÛÐ4ªþnQôUñóÉ}—.Kô_è¾³Êk¥ q/'ð¡{‹€J³9NÔð0p6%i‡ÍFÂÚ6,Íå›Ú­iâˆ}§(já~á‹\k·"ÊýÌO©ÑѬ”½‰¹m41§' ³9•t»Òÿ³Ö[þÕ¾¶¤^f¹åʰoÏccGÐÀѭñlÞÄgB¸ã¹‡éígá~p=ϯN ÍBYàòŒÝxåÍÑ4r6½èãÏØ''óÛñtrŒŸçÄ¥ÓsŒ{´Eùršntª÷.¿;‹_6ý‹—Ú–og¿™|Ê€ûŠA©³?¾Î¶`ë‚o`^œ¾6âÕ¨~L'nw*ÅÑAì_C‚5ˆ!M¼pölOC‡eìXŸHQƒJ·p¨ÂÚÖ½èéË)/†öÝ}Êv̆ÞÉl~»OÑ3s:“wQkè{¼qkù ¸Gwš»=Æs¦–}OÒÖ^²þÏ´hï¯sÙGo'2öî Í©ÑÆxâ7'RÔ:›ã[Ù›o$ºS=L'g±5Ý@ƒ'Ÿævek²»µ‹ÀýÇÕØä˜±bwA½Qw<Ë=ùŸ1iñ÷¼¹ø{ì|ÂiÔ¸ ›4¥E‹Ôr6–‡°Lþe'¥ F3þÅ^”­ èJçÆ_󨫳˜¸æ^ï|á~siØ›æö±lYž@AãF8EGW²&ÕDÓ;[áesùŸqÞ„ÅÉ-—lS­ö´õ™Á¼e{Èm×WX¦WbzEáX.¹·*÷ËjÕ§K;k¾Õ¨ÛùíbƒƒW¾®&0:〷=œ¾ÈåÜ6-M]téïj»š•ÿÂßJîîùlÎw§ã õq6õzÒÆmK®çTÏ ¨^âÇÑÇgö‘’S úµþÿ?£ñü’í%¯Bvñq>{„o°ÇÝÝÒ³ÈÍ+ G<œÎÙŠŽP˜c¦„²ÀorqÁ®†gù Îõ¹yä,]¼†Ís&±n\‚ˆnÞîâkg¥¸ :eq¹Ð1ïü"g•·”ÂìÀOdz~6ö®x”Û ÍY˜)áÀäñ¼RÕç¸æs±C¡“ÃEfS¬˜“·²|åVs*×€›¾¶†ËîëÒË,·\¡AyhKê8–÷œÁwø7£AÅ-HŒ8{;ƒµô¬}6 ÷¿ˆ®tG »Ü9™ÏvïäXóxY=éÙ¯!®•ÂîMû㲑±‰¶u/{¸^?ºÔ¶¯ñE…¦Àæ4rβ­Èäűµ{±øô¢¹Ÿ-ØFÐ1Ú–õ±›8qG(†]ûÈ%˜˜h÷‹ƒ ‘½iím¬4ø÷Å+¥V );âÈ!’;{Õ9³o¨Û·µÿü©l"àȦKÖßÓš¦î3Y¿á…­k“›„]ý‡¸ÑéÞݽƒK=ìâ¶‘jˆàÖ(WLÆBí­lúñ~ʾ.­âÕŠ;ouéc™S]ú=þ!}F a÷NvìÚÅ®‹˜¸lq£ñ-óøÆØ'mfw¾-ú·Ã×Xi#º]|1gó1 ;û\°ß NÑôláȆ-Ë9XЈ†Ž…Y¾–4Ç–ŒnZ6³^x™ŸqÞ£g5ÚÅL‡¶ÞÌZ´œ}y1´r1¿d3¹îíéYϱúÛ©BQuêÓůFßµš–é¢ÎiÓêì«…í³}ka§²¬¸x{ak炎D¾“.çï*“+Ž—¨çË9»˜öÃ,ŽÖêÀ ƒn"ªŽ/NF+¹Û¾ã½¤Ë ^v¹åJ°1U1(3š0^"{Ôr?gP¯#œL%#;—b\ðs=w͸ ~.PžG eßÎÇËYzkB›h;–îÜÌÑÌÖï.ÀµEkj™\ˆêáÓ lIé‰û¶ãàÝŸÆ>Ÿ>´ssƶÊ2•bÎ2ƒCÞŽg¿Àèꃕ¢ÜjÔß¾ í9²8n 'r!6¡„ÚwDåTãª-ìÍì‰ã¦D¨s Ý Œ1<ôêh~4“…ß¼ÅìoÀàNL÷›6¨ÁjDk –âR ¶&lˆŒ 2¦C(!÷ÈfæNú’)SÞáë°Ïc›JÅl{ç.†Vµ-Ï\Šð¹p¿œ‰êÙ§u±,?d¦aÝ£,_—ŽkÛ~Ô/–æ]ægœû‘îÕi;jwl‹×ŸKX¶?Ÿ–ÑX›‡W×´Vo;UìÕ©Õ¯Fßµš–é¢ûöYmZÍ}ÏË:Vœ×fé±ÌßY Ö¼tÏ‚sžÍbéª$nV‡KŸ›·RšB®ø»i€ üפ”Í[8Ó‹ òo|qê6ÖǦaøºH<»6¡ÛÀˆòPh%ïàâò FúbGAµ>çb“ù{§ðÍÜlš ¿‹nnø‡7Æ?¬ŽÇ?`vr2¹%axúEU£,™sVÙŒuÙrÈ|Ǥ袇4NÁx±‚Øí§ˆéP¾#qlñ÷|¿ÅŸ[ŸA}Ÿz›¶p,É‚[ãÀŠYGkî~ÌÚ ­ÐÇ£fý`I‹'Ñâ@T×.4-_WaÍ#ñ@”ÿ(×”ÝßXnùû奿QŠ[¥A¹™Ìt38xàæ–-©œÊ-9g œGj8„9ž”/÷®ÃN„· ǰ)ž[×±=ÓíNϾp«ßP¾cí¦íø§V- ºämž.”`Œ8y99t³*…þ’ÜTrËßkçâRú;Þ!Óš-lÝc`ožê¹ãêCÙ·‡ƒ¥ÔØ´ü~ï6¸Dôâþ—{q_a:G÷ïfëš…Ìœþ/¦¿Ì7®r€\œ4'û §‡¾a\·Ê÷b7âR§ CÈc˨/سå%]KVlã¸~ÛۣŃQCÛðÜ”?òbåPúwö‡ÒídÍ&·ª;O?äŠòKÔmÓºâ¾h_®‚ð»{7¯jnYKçŸa§Ö“–׋#­z'á‘9Ÿ™ë!øÎ”“W[>ó­—-YžŠ+XÓ WÞæ—³oѺZó³í6êK–’U þC{âpî1!¸g/ü¦}ǪùÛ¸+ú§d”³eY&7`£¶|?{¶ä²díš‚ñâØz¿(ðÿ§8FÜÉï&œ±¡÷cè}槈õ»³nÐ4â›ú&4?ÅÀöÓI½É„[ï%áÖ í NÌ=ɪ1?nz|7]¨¼!}¸÷ù>—X*;,mSÞ6åûåK”°³DÒwt$}Ïz½íKIÍÿºHy®´IA›‹ÄOÜîŠpkÕùçiôIá± §fæÑ.ƒ»ÚeœóõŒûžåä«WÐÖW\n¹&´{ôÜôãLû÷BÔºÒnOÜ?šžAö€=î}•¿†|ʧ³3ùxY9x•ñ0ÏÜÕ·ù9ü? îÕ—˜¥S™òÊËìxá=ž¿Èà‡@Ú[˜~¨‚°îíñ°;sZIñxLˤ,(‰vWyÁÔèOÆø7pûòC¾^þ-ï-´Ç?2ž¡ãGQùÁ_X`p¹ôòŸèU c·`ØYBh—6Í¡ÅDXR‹Ö`êØÐæ¾c@žoå“ÉsùþÝÔØŒ¸øE4æEFßÒú"?FgÄ'õ)þº’¾ÅÊ•3É.³bs°àF—ÑÏ3x@"!ÎÀ‘ðaâ ÿ/™4mŸ,9J­£mFðܘ!$yÚ]¢Ýš·þÖ}éæ±€Ìò(t÷;ë¡?Ï«N[‡¼[EÐmȆíM¸Ò¾Ü@ 6›í²ÇMää䜜|]-¨íx¼>‡ÛŸçžXݲ)r­i:šÅÿ<0Çg>åÝ\T!rýh<Äìça’Ý8Þyy~FU‰ˆ\[ìT"""W‘÷®dÁnQýñQØ‘kž7%""rl5»Y±( ‹¦Rä”ȳ‰ÞêEþÿK·˜ ‘Ÿ'ð[‹Yöõò QÜüä$ºkÌ·ˆ\£9ø¿e ¿ˆˆˆˆÈ#]}Qà~Qà~¹Jz¿ˆœÔÔÔDCCÃÉ¿ÆÆFUŠˆˆ\7Ìf3ŽŽŽª~¹;;;L&&“I•!""r£ßU""""" ü"""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""" ü"ò¤†‚?dø¯²®æ2¿ZÏŸnÎS? Q)""rUì¯ý"Ú¨;RHö’¬Ûu€ÒŠ: ޼Úß3…¤HoL†ë¹ jÙ6ùU&o»T¬ñgÀo¤›çæ­vÇWükqÞÅ  EDDDDÿRx5ÿ~7“"‡ :&õ¡»·MUGس)ù_¬cSß¹§w×qø÷ÂàØ†æÿ7r¤`.Ë÷º’0 •PÇæ—í\uùåÃ~Sù&æ//ÅÛµŠëa¶®Îd],ýRCqÔö""""¢Àÿóªf[fE´âWŒ%ÉËxò¤n‰´ýâm¾_ºIwã|½6·ÖqÄŸüE{²|¯…ÖqñĹügKcpp'È}7kVa­,!§¸;‰œQ'¿üRluÈžò_/ßDQ™Q d Ž;s(OÝ~V~ý)S­§¨¼,Ŧ0ìžÑôqÄv4‹ÿyðß„þ¿çˆÎŸÊœœU»Û‹ãFÑ-À¤uXDDø¯I5”oK(¡nƳr²±}R).hÀ¾ÑÀVCIÞ|ægR\Z‰ÁâKHtúgt&ÀÑõ{ùáÍØÞéA~Ó/ðäÂ×—ÌæŸüH»ûgÿ1¿3‘õÆ1Òc5ßÌÞ)ðpª/F[ Å9™ÌÏ)dï‘jì-D%§Ó¿G[,'‹×@yá2æ.^Ï®}ǰ:zÖ¾;ééÉ„™¯$r4p0ëm&®ð`ØSc‰s5œ<1Ø3ã|¼1”QOÞAT}¼±¿Q# -\JΖݬ5ãת©ƒúÒÞË¡Eå3˜Cˆ‰ÜMÎ*bÛZ)6Ñ.“¶ùE¶ñÌ{ù)>Ø`£uêîmg¡bs_½²œ: +[?ÿ¯Ï±÷«Q<ÒÆLeñfVÎÍ¿þl$ôw`« ÷­ ¬pïÆ­CÇ‘QUÈâé?ð÷§vóÀ¿£Ÿ¿Qõ-"" ü×£…PWÈ_Í÷s,¤õèL[oÇ“=uŽ!½¸%ä§[Ù=÷}>É>†Wl =½°ÙÊêåßóîž#Œ»?çm5»æ1ùÀ1Ü#㉠5cg«açì÷ø,·šà.) JqÁZ”Ï’¬Ï9Üøãn ÀFŽäLæÝÙ»phLÊ-8”m#{Ù&gÜ„˜.¿‰¼Û·ÇcÙ*Öî©&®}s—Ý>Öl©Â)*‘VÎ@=`«fËôÏØèÒŽ)ƒèb-fíòU|3ñ5Œ!Ñ“”¯ ky=Á#I©dÕ¢ýTÔƒEãyä`-üŽ)êñÿ;2üݱ´¾Ä»=Áø™¥Íç¨GÙYêFÌÍóܯc9q1¯ݽ‹xøÃmì·ÚN~ Ê؇ ~. ƒ´dž{z _MÛFêC1–&"" üסw2°v:Yùsøwþ܃oÝš6mÚŽÓ‰qí¶ò,È>†sÜhÆ äDgzgâ‚¿âŸ_­"kk7ÆÆ´|Î5{ëèõðoèé¢g¼ñèJæå–áÑã~îî|¢Ç»s ¾ÖðeN6û{ &¬i‹î¢)üf§ žŽm~àíOW’¹1™{Ü/{h½O{bÝ—“³¶ˆêöí0µ%kØZm&¦K(N€í§e×™»ï»…ÖN]ˆñàý‰‹X´¼„Žu-*Ÿ%ªð"e`˜¶ù…Ôshýf*ˆblF«SaÜàDÛƒùYóÄÀç_e`óÛ5G)Þ¶žå+÷á46Å€~¿"ÆåÔf KcHÔÞÚ´Ã 1„Ø«ÖEDDÿšcp ¢ëðGHºù(%»w±k×.víÌ'sí 2q¡ÍMÖÚãÁ­ìÇB—®áœ9cÀ¥m7bœ·°¥ð0õ1—±¸!]éè÷Ó05Å[8€}NÞb&rðc‘+aÄìeëŽZmpZèo¬,¥ò§­ïèrÞüÝD~ŒÂ}?Lbl0{([<žqo9ŪÒ*šp;µ ج”µ‚“;NúÕQà¿ö4^ÆÄ·á4øiÆÅ[N c‡³;Roµ²íïß³gÛ1ˆvÆH9e5Mpzämªá¸LŽü•±¦ºJjÏzÍ`wú§íp0›€Z*jÁåÔômµÇ8\nÃÕÛ {“+&œ‰6–Ô€s«Öà`áJ&äà×ËjÖ­+¦Œ¶Y=HììÎãH­åV9-ôÛꨨ¨“ ŽN¶_¬|"W²ûñíÐwæ3}A=F´j¾zVËž¬9ìáÄM»uû (¬3“4r8}Ú7_¾j*£pÍ~ øŒ)îÍÌb÷€1´m>k­/YÄôm¸¤Æáç þkŽÑ½¡fX»t9»cÐúŒËþ6ª÷í¦ °øºâìM ÛØ˜³‡>·E4WU;³Ù\m 0Êekù‰žl{[5»ówRwÑ'ù0‡DàÅò×&¹O@sÅÕ±wÁ$&ø3òé1´ó‰$Ä¡€½%õ¸Åžì)·U’9#’ÓßãJ¿?c\ÉÙMvõj½ºÓÉ÷Üæ;”WÀÁä ‚š§¡t-+ö€s§Öøù[¹ò‰\HÝ~òÍçÐÙ›˜½'±Éƒ·„÷¿ÏK¥CI‹q£bkÓ²Êøé‰´ö>Q–±êã÷ñïG C…«2Yôc%PЬZwm¾Lwx:¿©‚¡é1X* YôÝ|öØÇpϰÌŠˆˆÿ5ÉJŸþíØ:-›OßÜClç(‚¼,˜«9¶oë7Så™ÄÐŽØ›;–¼‚Os&3©)•®‘žØJ·²jéfj}z’Þ΂ÁÞF¨¿=y›f0#0ƒx?(ݲ‚¥{œpàâ¿tkï›Dz‡\¾^ò ŸU÷&>Ì•úýëXœ[W÷´1DÐ7%÷~ÎÇ5½Hlë…áx …ÙlµÆrû-æ«x¸~cpÍÍcÕNðI‹Ãû|­W¶‚O>®!%! ³µ˜µËò8h c@ï0ÍM¿`ùD.d/³'½wž×[sÜ+ôÿn_~È×˿彅öøGÆ3tü(*?ø k{ÿ ž|¦”w?ŸÇ·“–âäÓ†)÷ð÷GYðú›Ìž5ŸnºÐîÑ?rÓ_0íß 9PëFH»A\JÈ}?=‡ÿVŒåéÛÛœ9ž½±’+ç•¿ƒ}eV܉LJ£_÷ÜOæ‰:J7,dβMì=TAÉÀˆR3zãÙ’1uÍx“IÞ {ö¾3x«®ˆþ1‰ü*ú=þ=Nû!2Ûñ>x}Cî¡SQË7ïåh½ßVè=(8‡Ÿ©|"מ¦£YüÏq|æSþØÍE"""r}~9•jÊÈ~ÿMæØ â‰qÉxœv›ÁÉÀûóÜ«Á ¢À/"""'è¹בÆc›È?¡‰Ñ¸«åDDDD¤4°õzP{€ k·²kíR™bí¦±ö""""¢À£°ÕfÃâEBè>üWD»(ÎÎ+W¦¦©"DDDÎCcøEDDDDn` .""""rÓ9©©©‰†††“ª¹n˜ÍfU ü"r!vvv˜L&L&“*CDDäF9¾« DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDøEDDDDD_DDDDDøEDDDDD¿¬lýìLøë·ì®;û½:®þŒ—'LàïS×q¬á¯é†ýÌ{c¯LÛCÖ»«V»ã+^ûh 6Õ…ˆˆˆÈÅØ_§qý+¿äãy»qî<‚{oi»Qùß ©|ó——âíZEƒõ0[Wg²¿.–~©¡8ªzDDDDÎqé©¥dÙLš·×Ä;w«Âþƒƒ;Aî•lÎ-Âz8›œb#þÎT5×–ê|þtûpžúá?×4ë÷òõcÃýÚzj~ñhäHþ ¾úa GÕœ""r}»¾zømVŠ—Mæ“…{ñì6†_÷ÀådÒk ¼ps¯g×¾cX=kßôôdÂÌÌz›‰+<öÔXâ\úR{füƒ7†2êÉ;ˆv¾Ð|k(ÎÉd~N!{Tco $*9þ=Úb1žúLIÞ|ægR\Z‰ÁâKHtúgt&ÀÑpÞðòÛ±½Óƒü¦_àɆ¨/™Í??ø‘v÷?Π€r–N|›‚¨Ñ t,`éší”·Ç§ugÒoMÁc{&³–oaï±ZÌþ¸é¶[H0AÃ!¿ókÛÝËŸuÌ]¸–½8z¶&!ýVÒÚ{ž¿á[ú½ú#lZ2%kvr¨ªìÍø´Š#e@:| ±ôÊÊ}Év4`0‡¹›œUþ͵Rl¢]„&mËò³jàHþ ¾ÉëIbÿx¼Ô© ""ױ맇ßVCÑâÏùxa1Þ=ïæž3Â~#Gr&óÖKØãIÊ-ƒ”DUÁ&MZ@q=ÞíÛãÑTÄÚ=Õ§¦Y·5[ªpŠJ¤ÕEÂþÎÙïñáœÍ4„wgÐ[éiÇÖ¬Ïù÷²Ô`e÷Ü÷ù`VÇýâÉ<˜´NÞËûžw?Ì¢øªíÛ(ËŸÊÌÝž$ Îð>aXw¬dÊ[oòñê&bÒ†rÇ͉¸ÞÀìiy9­7²rË ¾\a%"ívFèOŒÝ.V}ó ¹G.ÞeyñïÕ±wþg|³¼—¸¾ ¾íVúu‹Ä±8›i“²¯þjÊ}©vhÂZ^OpÆH†ŽF’KõÚEDDD.äúèá·Õ°{ág,ËÞO#P×h‡ÝéæÖ],Z¸‹¦ð›¹L"žF€x:¶ù·?]IæÆdîíØžX÷åä¬-¢º};Ì@mɶV›‰éŠÓfÝxl órËðèq?w÷ >Ñ“Ü9_ë?ø2'›ý=Z³‘ÙÇpŽ͸¡‘˜ ‰ þŠ~µŠ¬­ÝÛî*–ß¡=ÃîÈ Üˆ¤a릗ø‘1z‰v@8.û7óÑÆ}oïæÓ¸†2 i#ÞýÄ ­Üްã£uì9Ö@wï wY^ô{•ì?n&¬ÛmÜ1 ¼yÜ|<±î‡xsV Gë Èé Ë]ß‚vLpÇÕ‡x‘20L[ñÿõæYw€ì)ñõòM•9•@Æà¸SCyê÷òõ“O±¸ÛŸx*h1“¦,¦ðhÎþq¤~˜Ñ=üpÀFÝÕLýô®/¢¬ÖKP{nºý>Fõ :ó Ž­ŠísßæëÙyî«ÀÁ¯é£ftOšªØ>ÿ3>›Ï¶’2ì)˜ÅówÎ&îùOù}ç#-X n?+¿þ”©‹ÖST^‚bSvÏhz‡8bh(áÛ§ž +q<÷8gñíµì8ê@P‡>Œ~x(~k>åýiÙ²b ëÁí?Ä€p§æakõ”æÇÇ_/aÃÎCÔ8ùÝãfÆŒ@ŒE]‘ó»>޵ÛYœ]MÜðïʱÕß¹­šŸÐR_º•ÝV#­»µo‰'8…&ÑÑÃÆþ­‡©³÷¡C¬ »×²· –’‚­Ô¸´#!øB·{Ú¨)ÞÂ|HH8-t˜‰üOã_çÉž®à–Ê3ÿ¿éèÜ¢å+[?ÿ¯Oß‚{¯Q<ò›‡{sæÂÙüëÏSØUwª>Í“6û“~Ï“<12†ªu3xõ·ó⬺Žþ-Ï=˜wÉr>ú×<ö74°î_xüåoØìÜ…a>ʽÛR¾p¿ûÝd ­zd•ˆˆœßu2†ß„;ÆqsŒ»ˆátÝõ ÙßÍ$â‘´·h²–c¥‘íS^aÂù¾n©¦|;Äⶪ€µÅV¢CK(ØfÅ­SÞDíñÀOç3{Äí-x8ž8p×ÖÔЈ3æ³ÎŸìÌx8Cm…•Æ ^C8çã£ñÜ›Ríì/y¶f2;q%C/þ=Ö}kX¼t ;Š÷s¸Ò€›¾ö†«.wËÚ=çb-üŽ)êñÿ;²ùŠOZ_âÝž`üÌÒ3>[Ø‹;ßz‚¾>'Ö®öÞûX÷Â6¬£mkŽˆ}úYênÁôéû'˱«°bÃtj]²‹à¾ßÿ–›š/eÅz³î¥•üx¨Žö+ù|ÎA\SÆóòã X }H‰üým_äþŠÿz©y¹áâ㯋=ػ‗ ~:k¿ØrÜì{Œ¥nÄÜü8Ïý:–§ }èî]ÄÃnc¿ÕFsór8öà‰çÆël€¤6ÔçåòÖö0îÿýüŒ@Üw®æ…å;8RÖ LùbM±òÊ‹øn¢wÜû<ñ‡|ºb JóÑ«ˆˆÈuøÂèØÆrâ@æNÚˆv|°Œï¿_Kð¨xÌ&WL83l,©ç.’ÁÁ‚3`ç×ËjÖ­+¦Œ¶Y=HìÜ< à¼ìp0›€Z*jÁåT ¶Õãp¹ Wo/ì1RNYMœ•›j8nS€c‹ÂMu•ÔþlgøÙ¿g«ØÈÔgPÜ“Co%º•/f£ÊµñZÉU–¶…í(׊z­ßLQŒÍhuêDÌàDÛƒùÙ™íÕ¤Ó†’-¾¸`£Éöž„;ÚÈýäŸ|v| ©Ií óJä®'Ï]¢úÑÅëÔeïæ‡+`³uO.»lž¤jßöO¬Ïîn&Ù5‡œübš:¶|^ç]O/²Ø1ðùWØü^cÍQŠ·­gùÊ}@øW׌á]hål8Ygîàߙؓwqñv[Ø ®$MÕöt¸¹;¾ÆSËæÓŸTßùÌÊÛKmš¶¹NÿYLÁ½Ñw;Îä»ÜPÆvŒ$Ä¡€½%õ¸Åž ¶ÊB2gäAÒ`ú{þtŒq%gC6ÙÕ{¨õêN'_û‹_sH^,!Ýa’û4WX{LbR?#ŸC´_4lccÎúÜÑ|ÀµQµ3›ÍÕ£|1QyÞXm-?Ñkm`«fwþNê.r òñŽl£¸Þ‰è›R‰o¾4b«¢xûÀçêÚÕ§…í(׈&¬åVpj·ó™'‰F‹?n@Åéíëæ‚ýÎ% îÉ<ú‡ùrò÷Ìûà/üð<ÚÜw£†v'ÄéÔMó¦c£®²’\ñ³œµ]]ñs…š£U4]Ƽλž^d9Nl÷ ùzêBÖ̯°¶„šÎ=å·s8ÏÕ.£Æ L»©ª”*Xûê¯q¾xVRgg=£VDDn„Àø÷Æ€í™;w*+ÂÇÒ7%÷~ÎÇ5½Hlë…áx …ÙlµÆrû-ææ>kü:Æàš›Çªà“‡÷%jÀÞ7‰ô¹|½ä>«îM|˜+õû×±8·¯î#hc;sÒ’WðiÎd&5¥Ò5Ò[éVV-ÝL­OOÒÛY0œøíÝ õ·'oÓ ffï¥[V°t\»þ6º‡àcXÏæ¹3ñŠoƒ—}%Å›rY[T”²qM!A]<¯lâæˆ¶£\#kf/3XpÔzfÒl¬,½À)î…Øá‘Áý¿Ï`\íQŠ 7±fÅ<¾ÿîu^<ú{Þy,î´žkÃOÐM®®ØSÊáÊFμÚVEi8µvÆ;œ[<¯óÏç‚§@G—óæï&òcÄî{üacƒ±ØCÙâñŒ{ëêjÛÎÙ'\I~â%F„Ÿ;Ñ`òÄUˆˆˆœ÷({Ýžªø4ôW´u8À¢oVPßõç~a‹ IDATÖ—ýyÌûî[~Xº™ã©Üqÿb-§õúw$ÚÀŸ„öž—ãnp%ö¶G›Ö–ÆmK™ñíw,ØXMë´1ÜÖÜ íDëpÿ Î˜÷å2÷»idÂ-ñV—Nèù܈»m$½#íÙ™5•Éß-ds],Ãïì‰ï5Ü*FÏ. ¿½'áu[Y2g:³—nâxÐz|,=CíØ±:Ÿ’+¾yЀÞ-kG¹6ú |;´ÇB¦/(:í†êZödÍaO‹§c£"çï<úÀx¾Ú]ÁÑ‹Vq) yà îl;vRÖÂs`ǰDZs”ås6Se;5ýãëf±ºÂŽ6]B¨½Ìy]ÎÚ\·¿€Â:3I#‡Ó§c{4•S¸fÿU×¶)8(S%[·ÕáBHȉ¿ ׃,øüsæ—4jü¾ˆˆ\àˆ}Ms"zìïÏ'`ôHà®N½7€»â\b‰Ýð³î]ˆõhá-­FWÚ¤Œ MÊÅN œ NÌ=Éšo ýžœ@¿Ó϶,‘ôIß³>Úö¥¤æùÐû± ô>3Ò1êwgÕ‰ßÔß0!õ§ÿûqÓã¸éìÅðIá± Yû–}Ï£]wµË8çë÷=ËÉW¯¨Ü&|ZÒŽrMpŒÂȸ%¼ÿÕx^*JZŒ[³˜–U†K‹§bÀÖ÷òI|óÚ[oK&ØXÆîM+˜³B†uÄÛ—~¼}z2zÀt&Ìý /4 gP¼?Mûò˜9u55AƒÓÕKy æ…;{;8¾µë~ÄMX î»wð‰"ذŒU¿ß8Ê(\•É¢+VdÐ6ÃÿŠêÚ`ę́¡mxnÊy±r(ý;ûCév ²f“[Õ§rÕ0¹ÿϯñØ&ò@è­Ñ¸«;LäêýÉÿn_~È×˿彅öøGÆ3tü(*?ø kZ:™€þ<;ÞÊ'“çòý»+¨±qñ‹ iÌ‹Œ¾¥uËIÙàB‡{_å¯!ŸòéìL>^VÁDe<Ì3wõ=ñ~ç–ÌËà^}‰Y:•)¯¼ÌŽÞãù-©Ž ž|¦”w?ŸÇ·“–âäÓ†)÷ð÷GYðú›Ìž5Ÿí=F_ééáÃþÄþ_2iÚ<>Yr”ZG/Ú$Œà¹1CHòÔMDD.px´Ùl—=þ"''‡äääëkIk°aíVv­]JÁ‘HFþv$í\Ô&""""7¶ÿš~[Ýa6,^D¡!„îÃE´Â¾ˆˆˆˆ(ðß8 –8î|>N-.""""ÿU4èSDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD.Ä^U "?ijj¢¡¡áä_cc£*EDD®f³GGGU„¿ˆ\ˆ&“ “ɤʹQŽïª~Qà~Qà~QàQà~Qà~Qà~QàQà~Qà~Qà~‘ÿböªùEØŽ±èîçíí`êòïý¿d,†³?ÔÈ¡¹ÿÃ#îS2/~ôœŽ™7P<õ)ž˜²œ»ó»Oïb¸Ìi4r$ ö…’1(/#PÏŸ~ý2ëFñׇü‹îAë)šò$OM=pÖëÎø„Gݹ· M!Üܼ\ÿѲ] ~DDDÿò5Q–ý>oÎ9pÞwM®¾„µïNß›â r6¨5¯3µ;¾â_‹£xðÞøóA¹‘Ô­ŸÇÆãItw?«¡KÉËÚù dåb–,Ü ¦€¹›*éœláòV³ŽäÏà›¼ž$öo´F ­ã¢¨÷òÃñ?¶ÎzÐcÌ(âÝíÀÖDMY »ÌeÉô²"g/þù^:Y ÿe;Oýˆˆˆÿ•s¤mj<~:¢Øh´Vpx×:r²g°çˆGïŒÇC”® M囘¿¼o×*¬‡Ùº:“ýu±ôK ÅQÕsãq ëj#óÖ—Ó-ÅãŒÐÝx8‡¬]Fü‚ì9Tú3žLîÎbÉ!Ñw݇ëײnîzÊ“zâqµAØ1Š1/þå?\îD÷¸‰>~§%jÛ(†.ŸÈ‹ÿ˜Ã›Ÿ%óö#q˜ÿOÊ&""׃ë$";Ю3ñññÍ $vOeà¨_sKÔoÏgw•M­y08¸ä^ÉæÜ"¬‡³É)6âèŒ:ùoPȈ5°yÞŽ5þF#³²Ç%‘ô(—æ×êÙóÅ# 9ee§oÓV~œx/ÃG¿J^奶õvÌ[ÎQ‡Îܜڋ]œiØ8—5gΚªØ6û-^|üFÎèžãïÖq´h<Ȩ̀F3~^ÅówŽà¹ÕP¿—¯Îè×ÖSc;Îê?bøÝo²¾æô ׳{ò# þ 34ž|­4ÿ+þöü#Œ1œw=Âï&ÎfKEÓ•nDôú5÷u1Q±ü{ÖWÚÎ,4ÿMÙNQÖ›<>j¿ZLCKËs%õÓü½í™yé·ã5|8£ï‚?¼¿Ý5ÍívÞrífÇU·»ˆˆ\Èõ=†ß`ÂÕlLÆŸâbå…˘»x=»öÃêèAXû'Ö<Öµþèf–f.aÍ΃TÖ1û„Ó)u}ã¼qøiÚ¶Jòæ3?»âÒJ _B¢{Ð?£3ލßËo~ÄöNò›~'+²¾d6ÿüàGÚÝÿ8ƒü±ø‰¬ï0Ž‘«ùföFHy„‡S}1Új(ÎÉd~N!{Tco $*9þ=Úb9Ù‘wée9GÃ!¿ókÛÝËŸuÌ]¸–½8z¶&!ýVÒÚ{ž(ký6-™Ç’5;9TUöf|ZÅ‘2 N¾ÐXÊÒ‰oS5šŽ,]³’ãöø´îLú­)xlÏdÖò-ì=V‹Ù¿7Ýv ɦ•Û`!&r79«ü‰mk¥ØD»LÚoÐ3<7â2:ðÝ?ç“4• Ÿæ~††¬^¸KÒX"ÍÛš?ì@Pø}7“Å›+èÕÃíĉ u' sŽcNìG¬ëÅO mU[ÉÌ®À9iÝ]±ËHÆuå2sл¿/F[%>zŽ?d–‘>ŒqCÝ©úq>ß|ñ'Š^ãåÛCé3þuº{7²wþg|“SGën}èHÍá=lÊÍfÚd;|íO݉²—åOefPn0œî‡ ˜›µ’)oåãèMï´¡ô´ncñì\fO ¤í=ð6¶¤ÜMXËë ÎIzL%«í§¢,Ïs£&~Ü:dÐÑô7æç•Òw€F áÀ*—¸‘üP[œWú´CpºùLg΢©ìÞ‹j¶g‘[a!9#ó%¶·ÊMsÉ«v§×Àv¸€Ètºº-!kÞj§ßB€.äÓÌCøÝúWþ06âÄP²ÔdBªá¯sf³sð#Äøøãëbö®øàeêÏ\.×öýˆw̧`ñjâ:à Ô-eE©Æ&âe¶ª LùbM±òÊ‹œ™s½ãÞç‰?ÌàÓùSšÏ\n5àì㇠[9TÑpÁOUZ¹íõ18Ì`«ZsÉòLh¿òŠê§©t%ŸÏ9ˆkÊx^~<¡ùÞœ>¤DþÇþ6ƒ/rÅKÝÎ_.ꯦÝEDäüÇÉýüäžçÄÑÜß?'ë.-ÜESøÍÜ?&O#@<ÛüÀÛŸ®$sc2wmcûqq;·¶?q‰ Â%s#vÕuØp€ò,È>†sÜhÆ äDgzgâ‚¿âŸ_­"kk7ÆÆ´¼ô5{ëèõðoèéâúAãÑ•ÌË-ãÇýÜÝ/øDÏvç|­ÿàËœlö÷LXÓ¥—åÞ÷ ƒi(³öø°7ú­Üްã£uì9Ö@wJö7Öí6îÞžX÷C¼9«„£uäôSújϰ;2w¢iغ…é%~dŒB¢‡ŽËþÍ|´qÇÁ»¾eå¶Dõa^¤ Ó–x£G~K{úuväå9θ™c=ûV,fŸG7mã§~BèÙÍ›ó³µ*™DW+Û²ò¨tïAzä%ác+gÝܵÔz¥‘ V«¤W’;YY X± ÃBŒTæ°› F¥…ŸºoÄ`!þÑðN…î-¼Üd0ÇžàLvÁbvÖt ½s-{¯äˆsìt¢—º¶$MÕöt¸¹;¾ÆSaÝ%¦?©¾ó™•·—Ú4œ©ÊDj¨ãÉ}EÝ%ËSD©Ã•ÕuO.»lž¤jÚøÜ;ÝL²k9ùÅÔvs?o¹®ªÝEDäFüÎÄ ¸•¯ÓnÚ­=NɆ¥,Ï›Êá1²ƒ…†Ò­ì¶iÝ­}sÐ<Á)4‰Žùdo=LSt0þ&Øšù™Õ]éÝ ·h2†GŸ:hÜÊ~,téŽù´ƒ–KÛnÄ8oaKáaêc.£êBºÒÑÏádÙkŠ·pú&œ6ŒÅLäàÇx¢Æ€‹Ô—\zYêÜ/|“kh"Ñî§ú Îî8a£ ÀèMò’Üü^Síq—ìdÃÆ#€?§”5DðÓL &\]ìÁ+‚V–Ÿ¦mÄÉÍ l6l6¨/½ÊrË šøÍĤ'àüç,VÈß},_z¯Oî{Ïø°‰Ð^Ýðš™Å¢ÂjºÄl'+¿ ¯›Òhs‰§éh>s74€-“—îÍ<ëÝr.+áÖQ!T­,ø[Î|´ŒÑÙ ¿ËÉ–¢Ó0¯Êgñ.+íÛ±xÕQ,ÝÑ®ù1 MU¥TÑÀÚW͈óMó’:\þƒÆlÔ”¢ þnÞ™<<9}ÄÐ¥ËSNù‘+©u••4àŠŸå¬ò]ñs…š£U4â~Þr]M»‹ˆÈ øñ$*àÌâ¶‹ò¥úŸŸ°&oÕ:`o-ÇJ#Û§¼Â„óMÆRM£KCî¾…… V7k2«fÁ5ˆ˜øžôMi¯ÉFCM 8ãa>ë"»g¨­°Òˆë…ŽyçppuÅtòÀÖDíñÀOç3¦vŽ<šlµ-X–¸`p6™0^$(X÷­añÒ5ì(ÞÏáJnþAøÚŸ›8 Fã¹Wìì/8ü é*Ë-7lâÇ%&D—?²på~ú'.cùAoz¤†w]0…ö¢«×,/ÙF©!‹‚j_úõiu‰û<)ÍÎd‹ÍƒÔGCš¿Ã©·³ø­±pÉ"Š†Ý§Å ¨æhu¸ÚRšjQ|¸ Ï ,-Ü;š£ÒItYAÞâ”Ù-eu™7©ý#NöØÛ9{à„+ÉO¼Äˆðs—À`ò䊆§Û*زb'8´'>èÂ5c0ž¹µ^º<˜6d^Aý0¹ºbO)‡+áô=PS¥UàÔÚùä¾ãìr]y»‹ˆÈ ø/”j½q‡‚ª2¬`1¹b™˜acI 8wÑ œ1`Ü…_ÝÝ…AuÇ9T¼‡m›òX¹ì>®0óÛ!­±wvÆH9e5Mg´j8nS€ã…o]%µgÏ×îôOÛá`6µTÔ6‚Ë©éÛjq¸Ü†«·ö-Z–‹¬ ç„LýxEÁ=8ôV¢[ùb6Ú¨\û¯•\e¬»êrË Ë9’ô$ Ë/duÙJù¦fêÎsŽFJ’s–ÍfVÅ&jn!5ÄáâÓo<ÈŠy;Áw07÷êDë3>^9õ+N[NÖ®QÜÙ™¦²`ñ^ÞÞ|³¾•¿Àï²Zñì/ÐÕrÑóø3—+ÙÂÒ¼L²jÖS0¾­NETSpQ¦,¶n«Ã»g›“=ùMeù|6q x”»ý.7ì×q`ùÇ|˜_‡[Ÿ[‰s5@C w›-(ÏWX?Ža‰´¦€ås6sÇcOÜCãëf±ºÂŽ6]Bp¤ê"};WÐî""rƒ~ì°³ê­ÔÛÀäIˆC{Kêq‹ <Ùsh«,$sF$ &åÀ×|8û8ïü5}Üðo‡ëV8ïöí£²±5ž~Ѳ9{èsÛO=u6ªvf³¹Ú@`”/&Ê0Öò=Öö¶jvç龜‹qsH^,!Ýa’û47B{LbR?#ŸC»,K+«µú#Û(®w"ú¦Tâêá³UQ¼ýàsuç`¿`¹åºOü´MKÆmñ ÞŸ þCS¸p–s¤Uï$<2ç3s=ß™BÐ%r_}ÉR²ŠÁhïóL×àž½ð›ö«æoã®G0¦g&¯M}‰?T §o;êv.á«ÌcÜò4] €;{;8¾µë~ÄM˜ÓùæìDÛ´®¸/ZÀ—« üîÞŸ6ƒ¥3£†¶á¹)äÅÊ¡ôïì¥Û)ÈšMnUwž~Èõ¤-g˲,LnÀFmù~ölÉeÉÚ4 âű0_Æ‚–”Çä~…õãӓѦ3aî_x¡i8ƒâýiÚ—ÇÌ©«© ̘®žØ],ð_A»‹ˆÈø FíšcT5æú¦òÞÂÏù¸¦‰m½0/¡° ›­ÖXn¿ÅŒS}+\+ç°äëé{ÅàmWÉÁÝ›ÈÙ¾½Ûàf;¤%¯àÓœÉLjJ¥k¤'¶Ò­¬Zº™ZŸž¤·³`°·êoOÞ¦ÌÌ ÞJ·¬`é'h¼x¥û&‘Þ!—¯—|ÂgÕ½‰s¥~ÿ:çVàÕ}Dó‡.½,Wú:£{>†õlž;¯ø6xÙWR¼)—µE5@)×ÔÅóÊ&nþåÊ-×?§6it÷È"³,€Ô”à‹ž;†§’è>Ÿåa¤õ¸ÄÎªŽ¢E‹9@·_`ºÁ=éå÷ßeÏcË=OÒíñ7ø}«˜¼à[&fVaòjMÂ/p÷-1ͽÞ÷êKÌÒ©Lyåev¼ðÏw¸@Y[÷¥›Ç2Ë£ÐÝï¬átŽ„ûoøɤióødÉQj½h“0‚çÆ !ÉóRÏç)cÕ—ïŸv_³#Þ­"è6dC‡ö&Ü|¹[TKÊãqeõïB‡{_å¯!ŸòéìL>^VÁDe<Ì3wõ%ÜÙpÖ“Ž®¶ÝED¤E‘Ùf³]ö¯™ää䜜ü(^eÙïóæ+=zŒŒs†ˆ4p ëmÞ]vœ°rwW/ŒÔQºa!s–mbï¡ êLnF$šÑ“O ‰Š+ÈÌÊeÛþãÔÚŒ8ytéÝN{¾­†’ÜyÌË.¤äH¸úÓƒéñ4ßiÖT±Å3æ’³ýVG/B#⹩‡Y.%侟žÃÿ+ÆòôímΫÜXÉΕsÈÊßÁ¾2+nD&¥Ñ¯{îö§BÌÅ—å<šŸÃö<K—1ñ­%xy–;#ì)ûq!?ÌÏcÇÑZÝ ëM¿dG ¾ù–ìc!Üz_e“ßa©÷žÕüX>jÙþåßø÷Ñ>ü桞x9¼äÞ^ÀاG4ß\wå9[ã!f?ÿ“ìÆñÎËð3ªJÔî""r~ù¯Í}û¦óìã“qzx"ÿ{EÏ©µ»ˆˆºZ*"×[ÍnV,Êcâ©9%òl¢·BŸÚ]DDøEä† ~Öb–}=…|C7?ù‰îºëCí.""WCCzDDDDDn`ºb*""""rÓ9©©©‰†††“ª¹n˜ÍfU ü"r!vvv˜L&L&“*CDDäF9¾« DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDøEDDDDD_DDDDDøEDDDDäÚ`m¯–m“_eòîHîzæÚ:žï3 Zôï,9zÖ뎸O¯^q8Îz¿‘ÃK'òöÂRplÏè'GétæûG–¿Ë¿>÷,ÉÙ“ÀÿÏÞ‡EUýà ̰ﻨ€* ¸ "*n¹å–å–eßRË´ÅÊ6«o‹íýê›­n¥™i𹡢¸+›;&(î› ;3¿?@EA-3û¼žÇçÑñræ¬÷~ιç^š„Ò5¦-¾V7ªB#e9iìܸ•=GÏ‘]P†ÂL‡½KcB"" kjZq—TuE&ñ_~É6—Q<;Ô³ÿ` ‡æNç§ ã5Ÿ+0³rÆ·U'ºu Ä^-ƒM!„BþÛ¢¥y·.4±TTÚ…Ùœ;qˆ=[~eÿÁSŒ|´-jD×YìIÉ®žW¤‘x¬ˆ¦µ¤«Á/ºͬªn†+йpê‰{Ö2÷h6#'ô§±¦ö•gíàǯb9¡r£EX4ííÍ1ès8~ ‰µó÷p ËãŒéä‚ê^¨~7:ô ÃÑ´j¢SQR@ÖÑ=$nZÈñ¼aL¸?K… 8!„B øo™%žÍ[b[s—R"÷-cÖ⯠`â_.-â—ŸKaOžϘÞh6®àHB…þAh¯ J-plEˆ£òÊGaá´pü–ÿ­ÛÍæÃ]ñ Ör},[Dzl'ðæ¾ÿŒ"ÌîÊχµ ¥ñüÿñÛ¦õ {ˆÍ=Pýj{üZ†àSs%¿]<~ø„_÷íàXÏš[È€»wUrñð&~ûm-;öá¼¾Lµ¸6mIûîèÑíå¡YJÚ7˜ºÆ™§gþ—H«kGO û?yŒiÛýxiö«´±¸ù¼äý±Ž_—®cÇþcä–1³vÁ3°÷?Зp ŠP½æ$¯`ÝObz‡Pã4r¶_õÏmõå…¹ovÝϳ÷ñ¼™Ôœ—gM%DsuÞ—ý¶Ží{_“÷þô‹ð­‘÷Z—f8±`2Ï,:wÝbƒOü[EsÿÀH|,÷P?û7–ùŸèni§ZÎCåG™ûÔóÄ5“ož ¬{W@Q2o=ü.F~Á}]PJ£JÀÿWÏ.¨½ödáþmdt÷%Тê‚u:y?¦éÙ2³3ëHKMäpAsZY)”®m“¦Ø¬;O~¦žJ´×Wde1y+@牧Õ5]\iC`t§R*0­4  ‚ü´Í¬ŽßËÑ3(1³Á«y{ºu ÇëÒ`.ÏáÀÆ5lÜ•A¦¾L-pð&²g7Z:ªª·åÌ`oÐX°ÙÁ/+÷CäxÆE9¢4s*!–µ iœÌ)ÂTçŠ_x7zthŒ®föŒÅœIXJüÎêãlѺ[?ºÙÞ|gQ¨ÑYª@©Fué‚[_€òÜT6ÅndWÆy Ë•X8øÐ2ª7]‚íkÜ i@}‰;è'í×é¼ùS*%æ^„´íI”§-†ìc¤íÝɯŸm%vãÃL{ö>iþâ¶1“ñÛ{¼úãJ툈Œ¯“š¢s°cýB>Ø‘ÀÐ÷þËÆæÿÀ¤‚œäeü’Ah¿(à¿›ÚïVò¾ä}Þš€b3OBÚõ ÊÓCÎ1í©Î{ü(^®/¾õæÝ†#$ÄÚŒŠóNsì`"—þ[ÒyõíGh©SÜcýìßX梿»îÀyHHÀÛx¹BÚYg—襂’“$,ÂÌ¿-µ¡hì!ñP>-Âlð$³‘Ò ™è{YíÇ+uxxj!y¿­ÒѵC+Û›]`féëQcöœ0¯VEÕ(œÈ¾®¨òÒÙ¹y3O\dìbðP—qrí\~I(£Q».ôw5£8ë8w²dž ŽzনÊ[ñÑ5Ì;wë¦!øyZ`b,&cå×ÌM,½M$½#-)9‘ÌÆ¸Ȫ|‚±¯l+*K[Æ‚¬¦DtêOGe6{ãÖ²cÑ"lÜ¡ÝF¹±‚â"=úòª}xlD(¶J€ZøþÎÿæl#v8´¬àìE ¼ÚÝϰž>Õ·ÏB´ÎäÓ§É-·ê{jÅ'Ëè8î)"œ«Fseî6Ö$æaÓá1FwwG Ð*Ç’Ïø)a'g;ôÇëR!îô5¨úN‡?ÞºlŽÌ:À‰¼Šü¥ùùÓƒ×}lâÚ‰QUù­,¨· Né¾>C†Ò¯zPH –±û1)*È ECꫵµ¬2Ý eÇø}Îô¶1¼1¹×Þ]QÚÐbÈsL:õÓ7Ìeí€`ºÿUñ_ÛZG®¦-/Œ¿úB tìÀCÖ¾*•Ýç+ðñ0ƒžÃkç2we2é§ó0±õÀ/¬£GFWý|Åi?3‰¸Ð©ŒÑıxýnŽäªp Šfø¸8íšÃ7Kv’–Y‚ΫC'>AOsŒ¹q¼ôøx¾8ÿäE¬JØÏ‰"+¼;2d샴sQ£(=ÄWã^fwç÷ù|”ï•I÷áï™ðâÚ½ýÎ_Ofö €¼ðÐJ‚_˜Ãëa@9ÙÉ¿2káFöedRl>Œѳ*`/?ÉÂÉϰ©ã»Lq\·ßmE1è>ìqõIÿnj¿[í{61L›Ü¿–¼ÛÒbÈóL>ý$ïmžËêû[2Ôë&#… —Žóè–|¸å7öŽ ¢å-ô³-¢ÞJ_SrbþÓ<û›Oý:‘6—òRÂÁãyuK/~ý<¡ZÅÝYfƒžôÕ³˜»:™´3˜ÚùÚs8£û·¼r-þ;Ç)@ÙY¶-œÃ¢ {9‘_*n‘ 3œNf(ªÇ[|»·xÆ-ž™ âIË­@ãL×áãÞÁ–3ÿÔvª<Ïòç'\jUË’KÙ9v.øž…[p"O…‹_kbúS)WJ øï|è 9’p˜r]kZ8@YY`O¿%))ÉìÏ §SÍýú\`ëÌÙzmbfžt2€VÖußP˜»ÑvðxÂúärúØQŽ=ÊÑŒdbwo%K|;fPT#ÔÙ‡8V¢¤Q»æÕÁksÏ0ZØ$³óPe­›>ìqÂ/ÿJ/’u:ƒ}ûsg®zGŽG[Z8©.¯zŸúƒs8Ð¥µ W¾-hÚÿI&+°¬Z4¯Ê³Güj,ƒ)-lÐ`Äh¬¯'yÓmP$.ª++þE9ÇØµi³¿ºÈ°ÿô'@k_o”:wœÕp(öWb‹ÚÒÒßg+bû_þªòÕ—õM¼iHܪò³;Ø‘ ®܇][©V´ì…ݶ•lÙ•MwÛ¿f}_ŸÎ–tšðîÕº ­ÂsàÛ|7ðò:{ ¯­ÌÄ¥ÝýŒìï‚áL"+—~És©gy÷½‡hZýzæÚOù¶I7†Ž™LßSë˜5ï?½c(ƒ‡?Í€¢~Ë÷ŸûÒòý~¸ Hüb[­ÛÑoàXbôiÄ/ýž9Æ>y…î6õHé@ôÔ±ýá5>Ù׆ç^‚Ÿ‹¨àìêwxö»}˜õbÐ㾨3SX¹d&¯ü‘Ã;ÓG৬ÊwÁÞ9ü÷Øy[w¡¿îºÅ‰»©ýjäŠÂ¼ \(½öó J µæ= Î¼ëhÑ·3v[W°-%‹A^n7¿‡X¡# Â’3ØuºŒ¶î7ÙÏn®ßt_sëЧ_—ŸZ@ÇVU×¹’ Ö'\Ä"´;Ú[Xú¸Se6²ïû)¼›O“nƒ;ÐýÁµü2ÿ-NU|È»C}PÿÝãÔ¹œC?¼ÁÇ«J¾ïAÆûZPx*•m«WòùÛJIw'%„uÆ^Þr„œrª @¯ŒfÚÛd©bèîÌ”gðó’t¢ÆÔwWbéàŒ£¥)˜jqtuÁN Fý>Ì߇!ðq¦¿CÕ]þÎt þ†Io,cÎÖ^¼Õ©úûÓJ¸ÿãÏéïeV믻©ý®Hã«÷ªÕ༻â¦XÁ‘£¹”s ? 4NXrˆÌ‚Š›îg7í&ûš›{Ú9,eÕ†ƒ¶o‹NŇãH,ÐãÏ­½+áΔ¹òüzæÄfâÔï=ÞÕ¤êœއ~<ï­ZIFÿñøüÍãt¬ÙVô™È”‡© u£io‚qߥs¶Äˆouü[žeÇC_L¢‹CU/kn†=/oäÀù2ú4ÿ§¶Síç!ʯ™Ž§ýÊ‚}e¸ùÿ>P}¿kB¬&1uy¶\,%à¿ñ~'öŸSo𨛷/‘F--ûßOHÍåaC>{–,aמÝdFöÀíò_3¼›ÐÄñæ.•Y›™ñ¿ ˜÷–±!º[4Î͈êWBúG¿q<=—Ê–ZÔh4Š(—ë›D¡ÒaV°Ÿ³–qÂ=‚^ûáï툅ÒHáîïùðô5Ç›Ô\Ç3Ae¡J)(­Ë+å0–^ +߈ÖÞ®ÆÉæÏÝ£¶÷Æ–œÏ*¤¼à,‹ê-ƒ{î݆ÞeÉÁ’ã‰5ÚÒ­wóûÒX·ìC¸6„äS”¶¯ n•>mð¾t{\a޵ œ[xyÏK{K0¨y»Í¥û}Ôx­Ú«+üðÅ}dU´¸¥:/;Ä"S‚ú´çÊiIe@¢ײ"é$¥ª'ݽ‰ò4«sTßMíçz¹, œ<ók,%cѧü|ô&óŽ &Õ+°VŸ¿™~Öàò_êI7Û×TD´³gÙÚxéà Ֆ—D¡uº5ÕÜÅeî‹&-c¸ñ`WŸ+ 4 !>ãˬÕwÁ8e½^xŸ^—®íŹœJßË–mgŸ«ÆƒÂ¯;aöW®±J#–1ü£Û©æØ¬3!2÷¦R€£b¼k´¥9{öÆsù\¹XJÀÿ—¯?’»o5+Óʱ ‰ ‘Ù’’΂Mí‚ãzUé+0o¹][ö‘r.7ÏÛ{ ]ií§ìÞ´…c=¯y»…‘¢3ÇÈtŽZÌšâ¡Jáäér¬‚]/ca±Ë’ ¬?ѪtN•›ãß9ŠKËèF=§ç7\°ðh‚IÞ“Ex´Ku£—qrÝLf¦8óÀ³#hö=äZrþ0Ù€•³cNJ=e0RôÇ/|»ò"-z˜h+œ}ƒqnäæìÇü~æ …•°o@}õ°‘Á}'¨l=°fgN^¤2¸î»CŽ‘iÛ“©;}^ù”¨Š:z¸ÚG%(u.Xç_ ‚Ú_ÿV™·—Ø5`ÔðÂB*Ð⤻&GJ-NZ(ÎÕSY½šm¢2½þY¥ e=±¦»õÕùPh°wÔÀùôuEÎõìŸ3è³ÑSÁî÷fHmØRV}NPÛØb®øg´ßÖ4 iSËë<‹QmPÁÑ›Ë{yN™°ó¶»Å ž‘âìLôèp¶2Åô¦úYº7k`ù«ÿÿæûšÏŽí°[dž´"Ú&.Y]ç®øÞòmÎ;Qf™¹…€gÝÕ)*5v8iªò‘÷wÓJ#úëY¸h={Ò28•g‚Wc<Õ×Õj+KLï¹vjH> ”ä—€y#ì¯}n@çŒP —K ø·ç’¶;™¼ksk¢Å»yãêè9±/Uõ/Þ*/ÌáÜÉCì9œ‹Ñ¾-#c|0͉'% l#[Tÿ‚¨««Â!(Û-›IM>MŒçmî8S{Ý£‡–ìd뤂 l凛ueΤ³wÿ)ô¶a laƒÒBK—HW¾^ÿ³Š;ÚØÅÅÓ¤¥ìäPI CûZ`Záƒb/©«—câ‹i!§$²ûD1Íþ]i¸µ®=Ê5u £[P" 7ÎfnQ'B¼´”ŸÝC|bví‡àkqåbsËJ³9´+™œKõj¬¤8÷8{w@oÑ‚þ!v¨Kë+C:ÎM¼Ð®fãÂ¥(;`oRÈùcH8Ž|±RMê­/y`÷ÎP»·§•nV¯çd·aWoéº2í#cmg±ã¾PT(057ÊЗ^z-íU—$Š‹ÊAe^uñT¨°vñÀº¾ÌXùîó“דV@ðuûº \H˜ÇÌ…ÇiéÝ‹H­S²É*¬„š—Fƒžl=˜7Ò`r›õ£ÏÖcÀêJêÆòrKÀÜó:¯,ΧøFëÕÌÑ>é5†ÔRá µ-Zr«æMþ9íwË}o'c¸ê#†ülØoI‡öÎ]Ç9Üêtkýÿ ®¦®D cÉ'øüÛæ¼þDîfW6ä%3Áд¥g ó’P‘–U© {²Uõo‚6rqÏ v˜àÛÆ³†Þõ;DZž#h\=ÈÊOo`éA#–QÁ8™*P(@ŸU@9TõmcÖí¥¤–Àx9ÐmŸ:ŽCéeØGø^®;C^2sg¬žmûl?å­ö½_xÿkg^…§¹0Pxt'+þo%?/÷¥$ý6Ñãéåy ï 4–qnË,¾K.Ã*ºÁZ(n®Ÿ)ZþÛéhf^D†Ù°jóJV Ø¥/Q·øÎÅ;Xf‡¦­paëâOÒk˜Oõù½„´_æ•8ožÿöeB½þÞqj“GZ™a &º¹ù¥“¶ë,àþ¯h§šcÓXG(éÔkÖ²tÝ : ¹4‰)åxÜ*Ž#íJÀ_ÿè éðWk0³¦è‰L‹®ï n=&3­ÇjÙ®OO£ë¥wœÀ´Ž·“,\[ÐõWÒ¬{îCpOF÷¬saÓ,†‘Íb®ûŸ˜GŸçò§§Ñ¹Ö×â9ßȺÊîDçZ~VéÅSÓ¢nosüG½^ÝL¬"Ü8ò6ëKÜJ\z<Ç”so2}åÿx&%–¶í‚hìnƒ!÷$Göm'ñhj¿Á¼òT$UÛ[h[Œ`d‹=|·ôežú£3[7ÂÁ¼ŒÜûØ·—,“&<86@áAß×>¥s½·M°m?ŽçÒÏóßå_ðtê"Û5Ç×YCiÖaÖm%£ØŠöÇÐZ§@©`xÏ¥L[ý/Ó;ÄÙ$–/ÚA±[F´µÅä6 ²–òúk 쀮0 ¿®å¸ic Q]$ÀKÅÚí3˜±d$Ñ^p&a)‹R-Q_~"N‰© \<Ìî=Qøã¥kŃ}™²àM^-HVÎ}˜”¸•$êÛóìZä×’™ ήý‚/ãKh9ö7Rßeíw;}ï &§¬¡}Û@|=P££‚é€ ݺøUÿõÚêà’|þ؇ڪê.qiþYŽÿ‘ÈÆÝç0¸õæÕQAT-˜Þ\?ÃØÀòßÖ]V3¼;…a»–å{Áý¡Èϡݽe6õèɈˆX>\ôo ¦K3Ê26òsì\ú>K íß?N­”'qWlfû¬op*´í±l8Xœfk\ »9ÞÓíTëyèšglÌšàà|óóT^ËH×+ ű$.K¹PJÀ/„¸b~ÚŒ™Î—aëø}M÷Å‘´¶€J N[Ðw\?úGùcSól£r£çËÿÃ7þW~Y•DÜ/ñ”›¢stÇ7f,O îJ ]õ•ðfn;›XÑrô»|¼‚Å¿o$)v!›+ÀÌÆ <=l ½«·|), zä}Þó˜Ãœ•±ÌÚœ6îøÅŒã¹‘]ªßï}{UÓl›t>8Ÿ%?®ç\©Íz3é±áD¸™vt|êyÎ~5›•ó?a‡… ~­º0yª%ó_Zty¡Â½c6-bÁôw9òò×¼¢ÁgÐ[|âü3—¬aöÆ\JÍìðm=„)#fkrÝ4.­ÍŸýƒƒ‡ôØîÎöûú^âÚ*̬qõíİ!¡¨vÎâ‡W_ÂøötFù›Ö^ä±ý§oØ^#8³÷nB»C8°>5·GÜT?ûë·ô˜ùDj½–uù^tíàRãân¼{ËlbC»‰Ÿðº÷÷Ì[·˜±zÔvhýÐËŒîP}çèï§ b˜ü\6_ý°†Å37aîàKPä>š aÝÇŸ²rÅZ·ðÞn§ÚÎCA׎Egb¦~‚ÕOß±pËb¾^oŠsÓN}Âoßa—\)ÿv £ÑxÓ¯.HHH <<\jO!jaÈã¥ÿÌÀì¹9¼ÙînZß*'cÞ[Ć¼Ì¸ÀÉ‹k Ú²˶íð0SÜ»uP™ÉÊÆ3Ód,_¾Û'忼ÝïÖq*í$þ&&RBñ/a,!ë¼)¶ÿ¢›»&:ü;µ¯öïÝ:¨<¿uÇøõÅA)í.í$ÄÕ¤W !Ä¿#Ô sÓB’|‡0ÚE)upÔ±ø[7$±oÃ"N˜‡ò|¨ý5+yÒîÒNBHÀ/„ÿJœ¢e‚ÔÁ=UÆ’Sl^¸€d…}&ÿ‡Pk…´»´“ב=üB!„BÜÃd¿B!„ð !„B!$àB!„BHÀ/„B!„¸3ä-=BˆË —ÿTVVJ¥!„øÇ°°°ÀÌL~q™üBˆ:™˜˜ V«Q«ÕRB!Ľr}—*B!„B~!„B!„üB!„B ø…B!„ð !„B!$àB!„BHÀ/„B!„üB!„B ø…B!„ð !„B!$àB!„BHÀ/„B!„€_!„B!¿B!„ð !„B!$àB!„BHÀ/„B!„€_!„B!¿B!„B~!„B!$àB!„BÜ‹LÿÙ¬Dz/Û¶¦šq† %• Ô`ïјÀ6tvE£¨:Ò˜ŸÈ7Ÿ¬ÀüÁío^{r%iü0}>Gì»ðä¸N8(ÿ¼|^LÛIrŽ¡m› »éTÅYÖ|þ5»|Æ0ù~oÔÒW…B!Ä=ðK8µys×£LíD“fa´tÒbÈ?Ï©#Ùüë~’öö`Ôö¸š50M \|=¨ÔÙ Rü™™5p1mÓ‚ð½Í€_!„Bˆ{?à7RºŒ×CÙ$†GvÀË¢F„^YHÆæ_X˼UŽŒïßMC’U{3r¬´¾âÒÉ„œä¬;ãILïì”R#B!$à¿3Êϲ}M*%ºP×µ;t”Z|£†2(ës~Ú½†äŽè¨ªž*Ÿ!á·M$:Av™Ž^tìÙ–Nj¨È$þË/Ùæ2Šg‡úRuc ‚ü´Í¬ŽßËÑ3(1³Á«y{ºu ¿2É0s*!–µ iœÌ)ÂTçŠ_x7zthŒNq_Æêó;øæí4ºÑ¶¢¥UW°QžÃkظ+ƒL}9˜ZààLdÏn´t¬*xyn*›b7²+ã<…åJ,|hÕ›.Áö¨.%Ó€c„øw© 'y¿$EÚC~!„÷–»zÓIEîAæƒ}h[<눛QXâÛ¡%:2ÙŸžOeõÇÇVþȺsv´ìÚŸ¾Qþ˜J`ÉŒ9lͪ¨%‘JræñÅü7kJdßþôwCŸ²Š™3×qª¬*@ÏXù5ß­J¥Â§=½ô£SSÅýÀ›ÏQnbE«‡Æ18H–-:n"÷72«3Ø¿aZµþP'×Îå—-'° îBÿûûѽ]SÌNídɼõœ)J;{!›Ojð‹èM¿^ñ3;ÉöÅóˆ?[jCŽB!„÷Œ»z…¿"ÿ,QáçaÅÜTvÞØ³“sg/RXý¡¦-£ÆôÀC Ð’–þÖ|óåz6o:AhíÕ ”eÃú£|úð؈Pl•!´ðýÿÍÙFìþpFû`Mb6ctw÷ª‡h[àXò?%ìäl‡þxYÛac®¥;;¬êX.¯¼°«þ´®ŠUpö¢^íîgXOŸê»!ZgòéŠÓä–SA:‡/‚Ï¡ôknQuD –±û1)*ÈŠÊ õ£q!n†AOúêYÌ]LÚ™Lí| í9œÑý[^Y)7è9¼v.sW&“~:[üÂú1zd4>Tœfñ3“ˆ ÊM‹×ïæH® · h†ˆÓ®9|³d'i™%è¼:0tâôô1ǘÇKÿˆç‹SðO^Ī„ýœ(²Â+°#CÆ>H;5ŠÒC|5îevw~ŸÏGù^¾‹Uvø{&¼¸ƒvo¿†óד™}`/<´’àæðz˜PNvò¯ÌZ¸‘}™›;áß¡#Fô$@gå'Y8ù6u|—)ŽËùð»­(}ÂGƒ=þ)oDBñ/pw?Vj0`ÀE=!¨B‰R†ŠJŒÕ9†‡âZãÕ6¦Ž­‰ð‚’SGÉ«¼úÇ˳q¬DI£vÍ«ƒý*æža´°1röP&ù§þà´níRã94íÿ$“þÓ×ï…1R|+i)í ö8Tû†Ò‹œÏØCÒþÀˆPêÜqVñØ_‰MLçÜÅ2Ðù3x][¢hà1B4˜±}ß?ÏK3·SØ—±OŽcHˆ IóßâíÅÇ(0êI=…¿]O®gFŽσQ®œ_ó%Ͻ4Ÿôã屑¹öS¾Mu¦Û˜ÉLz ýže¼ÿô8^]QAÛáO3åñìOoáûÏ×pöÒ86øÅ4f¦j 8–Gïo…êàï|ôÌ»¬=_Y”DOý˜ÉZ°Šâ¹>ç© ‚³«ßa⻿ªiàÇ'ðH¯Æä¯ŸÉ+¯Ì#­F¾ öÎá¿ß§¢kÝ…(¼ïX!Ä]å®^„RêÐ’AN–ƒ¯ºÎ‹heÁ9òŒ`é EInUølkqõ]…++3È)¢Ìpͼ¢$Ÿ*9¼`:ÓjûýÅb@ƒ­æê{ &f:lÌn¦TJo)-#%gv¿iGN%«P•³ަWBt…e3ŒîËúu[IZ1í+@¡u# $‚.‘ÍqT7ì!ªòüzæÄfâÔï=ÞÕ¤êÎST8úñ¼·j%ýÇãW°VG9•w'¶F§ˆ&²é<ùÁ2æ'ÞÇkí«4ëÀ¤)#Ô( Ì—ò¤D¾8ìÅÈ©OÒÝI a±ƒ—·!§\ªL¯ŒfÚÛd©bèîÌ”gðó’t¢ÆÔ7UbéàŒ£¥)˜jqtuÁN Fý>Ì߇!ðq¦¿ƒ“ 3‚¿aÒ˘³µouªþþ´îÿøsú{™É¤Y!„ü7CåHc‹v'ì&³u4.µ®¢—q&9…¬hço‡)'(¾PD%š+A¿±”üüRÐXc~ÍÌA¡Ö¢FCÀ QD¹\_% •ÓŒD ”‚ÒJ°¼¨K/•oDko‡Eƒô3Ae¡®?­kÃý‚ý,šµŒîôØoG,”F wχ§/ç{î݆ÞeÉ 0ul@Z×¼LHiíƒb/©«—câ‹i!§$²ûD1Íþ]é87ñB[¸š —¢ì€½I!ç á 8vòÅJ &NÞh WÝð!º^`®3ŠÈ-2P³óŠ39•eÀÖ͵V‹)ÙdVBͰܠ'[æ4·½ò ÏÖc ÆÃýÆòrKÀüú;z—TçS|£Òil0GKø¤×âsý^7…ÚmõB…Rví !„€ÿ6b -~½cR@ Û“þàÄÑÒ’‹¨T˜aãîKû~ˆh鉶f ªÐÑrp_löm&eÝnr+u¸øvâ¡û¢ð³2¹.˜.Æ0Áv=«6'±fOej+\›D1,&‚ÐxÿxF9¯".yËKPY¹Ò´ëº·÷ªÞΠÂ!¸5^{7²~ÁOœ1™aMjÙ £hHZ×ü¶m<4Ÿß×&±qÕ^̬]ñ îÉÌHùe1;w$Ӽņ/'6.‘­¿ï§Ô¨ÄÜÆ ÿ˜‘tkçZõv»0†/»ñ1B4ˆ]ÓV¸°ˆuñ'é5̧ºÿ”öã˼çÍóß¾L¨W(Ha˪T†=ÙŠª7F.îYÁŽ|Ûx`vÃл~'cã8Ös«Oùé ,=hÄ2*'S è³ (‡ª< 8°n/%\È_Z4P»·ÆOÇ¡ô2ì#|¹´ÓÈ—ÌÜk çFÛJ/B!ÿŸ–MëFáôl^bÆã¯‡UýÃߎ þ5Á=ܳîC”Z|#‡àY÷!fÑ<òBtý_W_Z¦®tŸ<îW~›f1ŒlsÝ¡1>ÏåO­"Ü8òF3(të;Fˆ†QyôdDD,.z7 Ó¥™ eù9ö.}Ÿ¥…VRÁðžK™¶ú^6 ¦wˆ3†3I,_´ƒb·þŒhk‹Émüd-åõ× Ø-]a~]ËqÓÆ @£ºH€—еÛg0cÉH¢½àLÂR¥Z¢¾ü[/˜˜šÀÅÃìÞsu€?^ºV<8З) ÞäÕÂôhå Ù‡I‰[I¢¾=Ï>¡EA¾t!„ðߌŒÒøBÜ6ÚMü„×½¿gÞºÅ̈գ¶kDë‡^ft߀êUqK‚yŸ÷<æ0ge,³6çƒ;~1ãxnd—ê÷ðß^6šMx“Îç³äÇõœ+µÂ£Yo&=6œ7SÀŽŽO=ÏÙ¯f³rþ'ì°pÁ¯U&OµdþK‹.M]pïØ…€M‹X0ý]޼ü5/„hðôŸ8ÿÄÌ%k˜½1—R3;|[aʈ„Ùš€ü®:!„ÿ £ÑxÓ¡oBBáááÿÈK2ÉØ¿“•Ë“)o÷Oõt—m,BüCrãxé?30{no¶³” B!jñ¯[á/;¹ŽË`îÕ–Þ\$ØB!„ðßKÌš>ÄËÓ¤á…B!Ä¿ƒ¼KN!„Bˆ{Ø¿n¿B!„ÿ&²Â/„B!„üB!„B ø…B!„ð !„B!î S©!Ä%ƒŠŠŠË*++¥R„BücXXX`ff&!¿¢.&&&¨ÕjÔjµT†Bq¯\ߥ „B!„€_!„B!¿B!„B~!„B!„üB!„B ø…B!„ð !„B!¿B!„B~!„B!„üB!„B ø…B!„ð !„B!$àB!„BHÀ/„B!„üB!„B ø…B!„ð !„B!$àB!„BHÀ/„B!„€_!„B ø…B!„÷"Ó»;{¥¤Ï{ŸyÇš2ò¹a46«í˜ 27|É—s¯ùÜ k7<›„бc0.æŠkþ¿’¬M3øßúl0kÎðÉChj~õÿçlùŠÏ×e]?KÒØâÚ$”®1mñµª» ûó2vž*½ÿ³Œ´ZÉG?IJã<ÙÍÓŠ³¬ùükvùŒaòýÞ¨©äbÚN’sœmÛLÇ„B!Ämº‡BJ-Í»õ£ÿþôïß^]Ûà«»Hê–_ùêÛU)2^3OÈbOJvõ¼"ÄcEu¤«Á/ºouºýéw_w"ü,ÈÙ·–¹ß¬àHq]ù©äž8vžÒÚw8}šZ Ô8ÓÈÓ/;5ŠÚ§\LÛÆÆí‡)¨”Î)ÄŸ§’œäeüüû.r/­¢dÞ:˜Ásºâ*×]¤xÏŒº Æ{³WÝëåBÜ;Lï¢XâÙ¼!¶5ç0]ˆÜ·ŒY‹X¼&€‰|¹´ˆ_~.…=y 7ÅU h;óУ¥× qÇU“¼Œ_’"í‚PêhìG¹fŠ{¨\wÃ4${;?.9«m>åE'I\>‡ŒÒöŒì‡æ^˜>ÞãåBHÀÿ+ž]Pzí;ÈÂýÛÈèîK @)§“÷S`Ú˜ž-ƒ0;³Ž´ÔD4§••¢AéÚ6iŠÍºóägê©D{MEq`æûür`7³ÞÙ{ÿgã½oþoVMa„ŸùÕI.°ãëÏX}`ß¼½ƒF¾Èhs ‚ü´Í¬ŽßËÑ3(1³Á«y{ºu ÇËB™Ä9ƒ½AcyÀf¿¬Ü‘ãåˆRú¸µ3ócÄ«ïH=üfø:ìgÊ?Ðçfuzb¢´(Œ€BÊ'„ðÿégf ¼‚\!í,‡³Ë ôRAÉI’aæß–ÆZ ŠÐ4öx(Ÿa6 Øçd¤ôB&zÀ^gVËñšϰ?°`¿;ÇtÇÇÖ…þIšXÑê¡qh×ÎfÑQ?†ŽŠÂÃÖ ¨$'a_­<ŠªQ8‘}]Q女só*fž¸ÈØÿÄàaR•§â£k˜wîÖMCðó´'²ÅaÐsxí\æ®L&ýt&¶ø…õcôÈh|4 ¹q¼ôøx¾8ÿäE¬JØÏ‰"+¼;2d샴s¹´Å­œìä_™µp#û22)6w¿CFŒèI€ÎÊO²pò3lêø.S—óáw[Q ú„{`Zv–m ç°hÃ^Nä—J‡[`$ƒÆ §“k+žŸÀì+xá¡•¿0‡×[å°pòd~óyïžk¦:ýøvoñŒ[<3Ä“–[Æ9˜®ÃÇ1¼ƒ*€Ê<öýö=?®ÙEÆîÍ;Ðh36½öÿižý͉§¿~H›Kb gŒçÕ-¼øõó„j¹q:•çY^[¹Â,ê¯ËŠÓ,~fq¡S£‰cñúÝÉUáÍðqqÚ5‡o–ì$-³W†N|‚ž>æ ŽeMtMiÛæ«–{ѾeiŠÆ´måFÕ£TÆzêç’[샬Hzçq>LkËk_M¢…æJzÇæ=ÍsK,xø‹éôqQÞFŸ»Qù„âîó/ˆ ¨­l0§ˆ EU›\‹Ž%r¨Ä’æáÞ˜fî­if §“’wÝ>XeÅzôúê?s8•ÏâßÒ(7õ%Üߪ–JT ¶²ÃF£s¬íì°2«¯ª•˜[Ûac®¥;;¬Ô (9ʆõG1øôá±½‰hBxס<6º ºìmÄîÏçÒöÑâ“e´û>ÐH_KYh=£žÔÙSxñÛõäzvaäøñ<åÊù5_òÜKóI/©îÆ¿˜ÆÌT-aÇòèý­Püžy—µç+ ή~‡‰ïþBª¦ ƒŸÀ#½“¿~&¯¼2´Ké`¤`ïþû}*ºÖ]ˆò×aB ‡~xƒ—þuÇÿÔ8FõiEÚJ>{G+ˆžú1“#´`Ås}ÎS-4uNæ/ìü’÷–êiýгL}f4áÊ},ÿøCbÏV‚ñ"É3žçù»1m=ˆÿ<1”vºý|óÆ÷4T§P|Ù¯}įhiÓÿQÆ=2€6‡øýÓwX˜Q¨pëЧÊ?ˆO-¸<~)É`}ÂE,B»¨UÔŸŽ²®r5¼.3×~Ê·©Ît3™I ß³Œ÷ŸÇ«+*h;üi¦<ƒýé-|ÿùÎÞÔ3•è³Jñ1…‰ÏL¢‡õòÊŒ ¬n¯?(t4iZ¿‹ ‡kIw'%„uÆ^Þr„œrpkðA%¶màa\øHÀåÿiHýÐ2ÔÕmó%“„âà 4@Ù‰MlÍVÑrT(v& ¬§|G]åB øÿž%HÊ.æQ‚¶–JŒ©$­c"³?H¼æX=»öeÓ¡‹sŠÑܧ/-m”—§ *K;œœlÑÜ ò†’|J¨äð‚éL«í]Tü*­µ,ë‹;¨äx"G¶tëݼ:د#Ö-û®M !ù¥Õ¿K÷û°¼ÒAÕ^]à·€/ìãôñ<™Ô§=WæÛ ,z帖I')íäPõqÓÞDy^ ¼0u£× ïÓ«úŸ•ŹœJßË–mg 7»0à×0û+ƒ[©sÄ#£ü?9C#‹öàòÔZ¡#¨g8ºmñUÙ±m‚™‘ÄÙÿÇÜ‹½ˆ kŽ—](#'‡^ù•íìY¶6žCúpBµ%¤Ç%QhÝnM5 O§e§“ê¯Ë(§ª²ù´Á[S]“ sl¬UàÜŠÀËOÿ*±´·£Œ@ù1æM~Ž%çê¨;ŸQüßô~¸ÞàÜØr•6¤ uõ@a@·Öv¦Ä“QDsM)Çã·‘£iÃã-­Pü ß!„ðßUñ~'öŸSo𨛷/‘F--ûßOHÍ%sC>{–,aמÝdFöÀíòÕÜ ï&4qü{U¨µ¨Ñ0hQ.×7—B¥CÃŪ¿›È®}q‡'Ó……T ÅIwMßTjqÒBq®žK;AlÜ­¯~ˆ\¡ÁÞQçs¸Xp=ì~ÿa†ÔöU¶…”Q|©ml¯Ù+mDŸ±ž…‹Ö³'-ƒSy&Øy5ÆS}kãAme‰i­‘]%úl=˜8ã`quÚJ#ÚKŲgÂóÓ¼ßXóí;üþ-(l| ï2€¶ÇÃ\¨ñìØ»åqlH+¢MÀaâ’õØuÙͤSË">»þº4Vü&*Óë·$*U(ëŠlMÝéóʧDUÔu¾²¡¾SeCÊÕ 2ÔÙ…%þÝZc±=™ø£%4o|‚øí¹èÚõ¦Yõ¤ó¶¿C!$à¿[”“»o5+Óʱ ‰ ‘Ù’’΂Mí‚ãzUé+0o¹][ö‘r.7Ï¿÷ý6—vƒªšâ¡Jáäér¬‚]¹ô»ÇŒ…iÄ.K‚°þôÐJGËtµV‹)ÙdVBÍpÞ '[æ4˜P€>[«+GKÈË-sk,-Œ˜£%|Òk ñQ×HÚ¢¥ê—ë)”W‡¨†Ü-|úÊ 6À£ÇèŽÎòâ§2ö‹[+WíL0·6C9E¨ôWåRTã8m“{=†±¥¹œH;À®­køí×y5÷u¾|2  öìH[»ÄoL'[GJ‘#Ý£½k<´Ú°t®Ë¥Æ¦þºTäÝb“«°vñÀú¶úMýåjPêè—Xøu#Ôr+Iñä™lbGž=Q=š\®³?ã;„Bþ?5nÏ%mw2y׿ÖD‹wóÆÕÿÐsb_ *K`¤¼0‡s'±çp.Fû¶ŒŒñÁ4'ž”,°l£éõUáŒí–ͤ&Ÿ&ÆÓëï ¡” ПæÈ‘ã˜zyálÑ„.‘®|½þfw$´±Š‹§IKÙÉ¡’@†öµ@^z²ø[˜y…Òˆ¶¬JeØ“­°¬~ ËÅ=+ØQ`‚ǫúmÕ'cã8ÖsÄåߘ]~zK±Œ ÆÓGŸ:ŽCéeØGøri—‰!/™¹3Ö@Ï Œ¶­=egSH+³ ìÁD77¿ôƒ¤í: ¸×9™¾yJl›µÂ‰¥¬Þt†èÕÛzŒzþX»“üêÔ >âÅïrè4õ ð±Ã;8ïæXf<Î×G2È« ®ÚhæEd˜ «6¯dEÁŠ]ú塺œË‚„–ε‹î­ë¯K»[=åǧŸgifÿï5ŠÏ?¸Ñ–ž†•Ë¥!e°­'¯š¦t ×±))–¸â½ä»ô¢‹÷•À^ýg|‡BHÀÿgÊdçªßkùÜ•û|}ñ ÔõËI½r:ÇÊÙÀˆ("#[àb^Á™Í»ÉÅŽÎÁµÜÔ!ˆ ÛÍl>˜ÄÉž^Üùs½ ‡àÖxíÝÈú?qfÄd†51Ã¥Ó&Ø®gÕæ$Öì) Lm…k“(†ÅD S@…tdñ÷P:D0¼çR¦­~‡— ƒéâŒáLËí Ø­?#ÚÚbréE)YKyýµv @W˜Æ†_×rÜ4€1ƒÐè*yp /S¼É«…éÑʲ“·’D}{ž}B‹¢:¤¾nÔ8øý?{÷Uµöqü;%=“N’ЄP¥„Ð{G¤èKñÚ°PT@@EEl ^Ë-V,€ ¢¢(=@ t¤÷ŠÔÐB éefÞ?!@ “^Ñßg-ÖR89{Ÿg?gŸgöœsB¨aë¦L&¨}]Ê;¥¿.†å{Ó“¬‰ÝBÕnu0špá Û¶ïÅ9²]Ëp†VìÎÀ&KxÆ‹¼žÒ‡¶ÕÝIÞ±9Ûð¥âV-ªÝSLhWr1Òe$º\/Atxz~ÿÿ–Ã˜Ð²ì¡ î8‚ ‹G~Í:¡y‘MÊÓyä:=â°v<üì•ãL@Ý®Ü_·ë5š ¤íSh«|–?šÁƒ:¿Í›aÓ˜¶ †)«RÁ'”ˆNC}û‚÷ðü5‡½JÛ½3˜ýÍ2NçxV³;#H‹3`¦rŸ×x?è[¾œ½˜©+’Èqñ#¼a?ÆêEc_ã5ߪc êÄÈщ|òõb~ür%®áÔiõïscé{ÿbÁü%l]ŸÆ-Û¹r3ߚġ>åÙ:e8^£-F¼ƒów“™±|:.ñ"¼QWƼZžïžþ.f¦à.Œ—ÍÔ鋸å“5dÙMxV£ñ —xWŠÞ<âR¹ QÞKXšZ‘̓/›Û¡WW·’cYÖE‚›pKcÇåRæ|¸ì R¥=M}–“A×fWü"›ӆˆÈmq¹¶Ûí¥þ†{Æ DGG+z"R"[R,Ï?ö1.£§ñjSÛû`ìyääØ0:»àTä¶nëé9Œ~r.µ'~ÈàêÎŽïÏz–ÏåKã`>šÔµðÕ"""7—žDq´>?5Ÿg äÅ¥‰E^÷iåܦU7U V)†õÌZ–1Ñ%Šû""r‹˜ǘ‚ZÒ³Á|8å]¾2ßGÓ‰»óÍ·¿áÕö%êy9öîF{ÖÖ,ßÄÎå³8æŘ(­¾ˆˆˆ ~‘ÿ}Å@Û¯a›1•ÙÓ&1/ÃŽ{@Õ»?ÉCëáéà»ÚíÙ'XõýL6"è1ò1¢¼õ’w¹ut¿ˆˆˆˆÈ_˜¾EQÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨à‘¤×rŠÈE6›üüü‹¬V«‚"""· www\\\ü"r-F£gggœ ‘¿Êõ]!QÁ/"""""*øEDDDDD¿ˆˆˆˆˆü!þ§í&äjDn…go"""¥¹Nþ•i…_DDDDD¿ˆˆˆˆˆ¨àü"""""òÇÐoÚ‘‹B?SDDä¶vrp[A¿ˆ8Ê>T“¦ˆˆÜ> Å)ÅÐ-="""""*øEDDDDD¿ˆˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆ¨à¹ 27óÚ½}5÷4ÖÛµ½¼ã|?¼/ßÙAÖ-?+ç7Ïỹ[I²*}þ>Š÷Â\îûÔœÌÿ —ˆ¨àù{Ëçüæ9ü0wÉ*þÞãn²P¥nµjâbP>‹È͡ߴ+""ògáÁ —&*"òw*øíÞ±‘V2¯î¸‹+uÃBx6:ŒV·ÃvN?ÁôTî¯åGÈ=Oÿ¯w²Ò« +úT¢ÚM>Œô“»hµ%€˜Á”ìr‹2;÷4¿Îü‚ïWïæXŠÁ éÔ³î¥[kòŽóýÈQÄ5}Q!q|93Žø¤|Ü‚êÒaà6ÄéoÏNîéõÌšöËv#%ÇŒ%¤6mï}„þ-Cp¾¬Á .úïl">! §À:t8„-‚ úmËàà’¯øjÁfœLÁèFDã»yàþvTv3@ImYÏ0oÌ0¦˜Ï³P÷Ùi¼\ÿ¼cqË=ÅÚï§1kùŽ¥æ‚“…Z­èóÐ@Z‡¹`È?É£F5އÜbùqÙ6%9R§‡ô&pë4&Ïþ•ø³ÙX*6çÞ§ž keW ¦Œ<7ÿÄ”ïW°óðY²\©Ñ¼ƒu%ÒRÊ Ë–ÁESøjÑfâÒ0û…Õu ô¼?ÓÍÏ“’ÆÅ–ËóC…çÆRcó,nØÅ±L/*ÖjI¿ÁýiììX û½²å$Æ–›Ç;Ÿ¯ÁÐç}Þí†ùzcS>…ù×÷‘üRy<Ÿ®‡›£q±¦°ó—/øfñV';Z»9=ï­ÉÊñÿ†1Óx¹±[ 9ŸÇÑOóÌ/<ýéË´òùý¢‘ÍÞ‡òÒêHžût Qž”-Ÿ»—ËÊU¹Ó„ &”ö‡NžD8å°ìàifÊ¥q*ýé¿«°q`מŠ7Ò³–ÁFÀ–Ïþs˜}ý¸«¢'^7iÖÊÏ8Çk›9“›ÁòsFBìÉL?i¦Yy—Ë ù˲˜Êv¾½·åÈeÿ?¡qåëÿ€õ4‹'ŽâƒUgñ‹îEï® ÎÜÆ3b9eïúÝé\ÍÆÞ˜El=¹ ûÝiuoînY ÛžÅ,Y¼K«öD8Z<Þ¤öª›÷ñå³™w6”=î¦k“*8%¬cñ‚X£:RÏ×¶ 쎉aÇÁml8HÛ>}èÑ"œ¼]KYWëvDxd±gêX^øn¦ÚÝé{w;êø_`Ûü_˜½1Ÿmëâ—·÷úmù{Ú¨9U’×°>µ£'ަ{UÜ Ø]bÜrÙ?õyÞ˜wšŠï¥o×æÔ 6sú×¥,ú5ÆëãkHcoÌB~ݽ…½ÖzÜÕïnZU¼À†¥Ë‰]ê“Átþ¿{éz‡;¿­XÎò}ž´êX‹1ŸS‹&2ò?ËImMïÞ]ˆ Éaêéú IDAT×¹ÌÙ˜Kývõð7;8iÙÓÙùÅX^šuŸ&½èÛ½%ÕÍ¿±tÎÏl5FÓ®¶&›#Çë`žØ3—߈»†øí+Ù”Nû]i^Õ‰ã«c˜oËVTõ´•cA¿w¥œdíò#ø6lN³¦QÔ ‚øëM—¦Ô‰¾Ö¸Ç°ß§ w7ÂÉ‘¸x¦³ù£Ñ¼>÷-ûЧËø'¯eÆŒõœ³æR®å=´ñ;XBÎ;ãaIfUÌZÎWëBë .…tv<ßO^ÄÙñP›ò˜³Ê˜Ïf«±,k®jΗK^Ùx„gV.ÓuR+ü‚nÖ¯Ržû|Š^\B¹Çg í6žæ?'ªÐ²ªóí÷@‚“/tkxÓwk0¹PÏ#…ïv¥r!ëSÏV`P5³VAä¦ËŽÿ‰™;s í÷¯ßW€íià5‚qó/Û6ïœ>Aû€‚Y¶¶Û_XÁî3¹ô(ïö‡¶×%g [“ Ôzf O4³`Ú5«†÷ÔÕÓ²±ã|é|1Vã‘—Ÿ¦­Á SË÷ÛǯeïÙ\º™×òõÂ3x¶Ǥ§b1´£Uõ2üŸs˜±ñNž«PR[^xQÎà fOÊ•ÆÏÈs nå’9œèEd§û`- ¢ØŽfþÇòùNeÛ w/<—æŒ;ˆZnhNÞ¦|p°"÷Nç@PïÃëyaõ!ÎçAùìÌœ±[­Çyë¥NšÚÒºîdF¼2‡ikºñZ‡‡æ]ë™eL‹9KàÝoòÊ?ªŒ[›hÂ2†òæÂî9”HãÍËÛù’ÇåÅÚÛf˜Ú1áÇ©ãa:Ñ!:ˆ±ÏÌä»Ùh}VÉ1h]¸Ÿølîyï¿ô¬XX(ç'”06F¯3îWº^\ºZ3-.™°ûÞcB¿Š+þm[RýýáLZ[¸t¦äœw mNÓ€ŸY¸|/éÍš`1@ÖÁX6¦YˆîTw ïLÙòÙžá@>µ)[®†˜4‹”Äx;w½r˜°“œK¾5ƒw¿£ùæ4öíßCë)q´ÙšY0wÚóÙ¶g?}g­¥ÊçqT›¾‘{לbOnáÅ(óÝ¿XÈã©|³f¦¯ têZ:,:ļ 6ìEVéO;Âà_ÖùyaÓÖsϪlÌ.ÜâZ}°eñÙO«¸ko.dž ûÔ8î=–qûêK“Iw´ ûÂ9ÞZ¼‘Sãý|u~ØÁ+‡2É.üw“«Ý*¸i÷àÎPgR º‡¹ã¡|—›*³;öF½:U*(â ®TíÚ W~èLcÿKWf“¥رÙÿøö̾ըìbgÏÔÿðUÌŽ$å€o÷Á€;¼.ûplˆèL#¿KS¥Ù+OÀn‡ì£ùÍîKËîµ ‹JÞwô ÚÓÊÁÍ'°•¢­b?À_/næº=û6¯”Ö¬$ŽîXÉâµ €[‘ý˜*7¢’›ábÌ|¼ ¨>µü~ß· °ÛÀ¹'7±;ÓLÍ(gºtl‘]hSÎÎáMÇÉql¹´ø !„*7 †ý›Þ@ç›™'ŽËï}î|'‘—FÁ¹bzE@êîœ ¨W®¹l8p‚ÉËwbönÌ FÀÎ…  £ëð|¥\&oIãL>é~¹©ld§fƒküÝ.¿Ì›,AxiEþÎÙ˳áÏÑžÁ;ša¯<ηÓañg™û|‰nß‹þ½›æZ¤´¸_c?vrÓÓÉÇ“@ËS©É“@OÈJÊÀVжŠsý¸ÙÉ8¼Œïg-c{üaN¤ñ«X• ÎW¯åÌW¯ð˜œ0]cß¶ŒD2ÈgÛÛÒ¯¸ |Óɵƒ›¡äqËLJ,]ñºÉÍ@·Ò¯c0—ßïpó õæ²^Üð/çgÎs!-¹äPÐo_.JÇÇÆ׎‹•ŒÄ 0àn¼â¼(‡g©rÞ™ -›â7/–åñ™4Š¡ñ´™œW…ñSuŠí€—‡+a.08æåF°®|a¸='¹Ä6¾-—ÄòLhÖ¡6oWqÂÜWÅ‹€õg0çX±aĈÀ •™€O6óV¦Ë-`ÂÝϲϓ”}yågMO,ò­Õ¥Õ¼?O{F<«uâÑ—;18'‰cñ»Ùºf1¿üô/%½ÌGÃëâVâ~ 8{zb&‘séV(Z6Ú2HÌ×*n1âæp[Å·sÍR:i5ÿzñcöVëÅ#O !ªV(3¤Äcð7m£›®x=b<ý*_½Z`pöÅÓ¡!5âjq2IÊ´×¥8Ù²Îr✠ßà‹+Ñ7ž'ŽŽKAÆd$f`ÃëÒVölR’²ÁÕw{É1 ©à¿MÆ[<6†kÇ×ÛliœÏ´A‘¢ßš™Df)sÞ¹BKšøÍ'nÅ ±lÉ,Gçv•Š<ÿUšs§´ù”¢iUä¹MnéÉæãyë¨7} õ¦¯áŽo7Ð#ö(«í^<Ñ!’~E¾Ž%0Œ¾¾— í̤óì™^µ} ‹ý¡atu±³ãXæÅ_ªS¹f].mãê[ž¡A˜ÌÁ¤DÖçhQ§ŠDÍ+0„¾ž°óXÆ¥‰õŠ>8|”©%·‘ïa¡–¬[¿—W÷œgw¦Üüy±]-ž uÒ/V?t½ \ÚxÏÏK‘{ñïs8»£Úöì¤mx—aã»#y\ü¨T·½Á€pH;t˜ßîR1Š*$±zá2ì—öaû|Ö§ oFN)Û*Í ¹§¶ŸëNãûúÒ®^³l©Äo=uÃÑvmH„s:ûäâFXXÁŸÏ3,ýúk–œ´:8ß°T¯O0ÇYw¼È-êÙÄó£Æ~Ξ¬›{_†#ãòûT<&–#E¾lÍ;¹œŸ÷Úñˆ¬K…ÊeAiǦì0á[³>fÑÊ„Kñµg°oɯ¤–6ç]*Òª±Y[0ÛÐ&Ì©ÌçŽý¦ç“ˆ”í z[pæž5èsñfLnnnÔôuÅûŠÂÕÍ÷"•vvvy8QÁõŠ NTp´Ìü‹d9oçËb0âa†Ô’rrIÁNÜ’5„×E ¹àáoÂ\Xò_ÈÈÇŠÓ¥ Ø­œÉÌ'g¼\À'Z¶«ÇHÿbî5»àSxOþ•}pø(ÍδaÀ\.„Iw†ðF^ûÏ¥°ìpoßÃ=™N¬kã[ä«q‘[}jÑiÜûx}û9߯þ‘O—™ ªÞ€Þãú“þÙD¶:¼#;Y§ö±w~é¶[Þž)¸ cÆe3uú"~ùd YvÕh<è%ÞUÅñ××<¨óðÛ¼6i b˜²*|B‰è4„Ñ÷·/x¿›#m9Ú²=‘+g1ó­IzáSž­ãHø;1rt"Ÿ|½˜¿\‰k@8uZ=Ä»ÃÜXúÞ¿X0 ›,ëÇ9*÷y÷ƒ¾åËÙ‹™º"‰?Âöcì ^4ö5VÇÆÍèCÓ§ÞçåJ_0}é|“³_xîŠtà9€Ræ‰ãb+,øk{•¶{g0û›eœÎñ"¬fwF<:!fÀ\r òn`lZ×§qÆýêøúÑbÄ;87™˧óá/ÂueÌ«åùîéÿàb6”*ç]*·!Ê{ KS+Ò¡yðe…‚cû)&Ÿ¸•Ëü²NDæ…ÈߘÁn·—ú›Ä 6}Ã'ä–|üâ-;£ûF3òz¿5ƒwÜÈ'~w°µ£ïÅ•òÓè53ž#Õ뱦¿ßÍ~þènZ,I¤v›¦Ì M¢çŒýl·TdAŸpî(œÝrSŽÑ}Öaª×ç×&y ›¹›½5°¬™÷Å¢Úšuž×V&@íHÆ—ÏåýbúP¸%[ÖüÊ]G™o5ꛯî³Gö9¸n5n=ÀÝkrèÝ¥>£ÿP`Ïá›_Öñ¬µ*«ï©@}/ú·â\–ó B?»ü Úöìu‡§¿FLƒRËEƒxÛø£Çíæ´gKŠåùÇ>Æeô4^mz›¿ÃÌžGNŽ £³ NEæëé9Œ~r.µ'~Èàê¥Xõ¶žeÁ³CùÒ8˜&u-|…¦òPn“Âö£8N.ùÚò7û"Èü—?@Ï@ÆÕš†Hܽ˜o¾ý ¯¶/QÏÁ_ãnÏ:Âšå›Ø¹|Ç\£å›Èaëg“Yøw™(äJÿÓ_¼â¬‘ÿ—½4Qqиé8þdýÉ9ËŠ³jÜÿžßÎöE;HmÜŸ+?ˆxTÄ/c‹w¤Ò´•EÿÙzn±¿™ 1s6ñÚøËœ7Aøåná³ÏÖPglküMšJTð‹ˆ”†-ƒƒK¾â«›9p2£oïæûÛQÙÍ€-)–çÿ† Ï¥ÆæY,ܰ‹c™^T¬Õ’~ƒûÓ4عðBGâæŸ˜òý v>K–k 5š÷`Р®DZŒwœïGŽbeËIŒ-7w>_ƒ¡Ïû¼Û7 sî)Ö~?YËwp,5œ,„ÔjEŸ‡Òº| óÇ cê1€ù<;`uŸÆËõÏóýÈ‘üRy<Ÿ®‡[áþ㚾ƨ8¾œG|R>nAué0p›â`Maç/_ðÍâ­Nv"´vszÞ[“•ãÿ c¦ñrc7rO¯gÖ´X¶ã)9f,!µi{ï#ôo‚3yñ4ÏüÈÓŸ¾L«‹F6{?ÊK«#yîÓ1DyrýýXÏ0¯¸ãjì^r,óOòã¨ÄFã!·X~\¶CIN„ÔiÇÀ!½ Ü:ɳ%þl6–ŠÍ¹÷©'èZ)—_'>Î;ñMÿÉê¹ýžy™þ4£g»óàoÑ#ØtcŠíº±£ðg‹Œ›9ˆ£c{“rþbÑ™qEÎbÁ¦ý$d[‹lÊ=¢uW ÅGIq+lûÀ¢)|µh3ñ i˜ý‰ê:zÞ×ʉ’r²ø¸ÚsOóëÌ/ø~õnŽ¥8ÑN=ë–áV{Éí_”šūIrªÏCmZâvh:›×/bkr3Úù]qS‚ÏtªtŠY‹·’Ü¢—þÙÊ™_—qÔ#Š˜qUÁï`׋µ©tÛ\7_röóÉØÖömþûð‹¹˜{ð †=·ž¦o~È#•Î\?‡›Ø‰)nì£ wæßšÇ;ïâŸS?ã³µuÛÊïÚ·x\o> sÁP–ù£²«có¼Ü2Š®ˆ”=ƒ=SÇòÜgËHªÐžû‡¥›òœYü£ŸŸÁìÂ/Éíilü`_îñ¤qïÁ4’÷E’±}o?=„—æçÓdàÓŒ}¼þ'WóÅsÊf¡v§z8gleùÁ"7Dçg媳"»Ñ,ÐtCci(1v7ƒ%íÍÎyììùì ¾9Zž¶‡òD¿Æ¸XÄŸ™ÀœyÅìØ¸ÙÓÙùÅžÿryµîbðð!ôk`dÓŒ×xãÇ#ä^#'ìe‰«õ4‹'â9»0ÕíÉÃÝG«Àc|÷ÖÇ첕rš(EûöŒýÄüš†[ãîÔóö¤F§hÈ`©Mçú.^ºsÖ‚¾'¬‰#Á§)íÃ]‹Y$w¤ ;i%ÆÚ‘mJ—/76?98å;3ìþr7|Êç듯žK1Ÿ–vþpdnÐ*´VøEäOÇNnz:ùxh¹b*1yè YI¿"÷ õæòÅ97ü˹Á™ó\HK&ƒ|¶½ý ýŠkÊ7\ >(øøâj¸¼‡—ñý¬el?̉#~«RÁ¹lëÎ^˜‹­¦­d$f€1ˆ÷Ë÷m²”Ãó÷ÃòŽfØ+óíô_XüÙDæ~Ÿp¢Û÷¢ïf„¹g*´lŠß¼X–ÇgÒ(ò ±›3ðkÛp—Ò짘èŒÄ’ci,Xñq2_½êcrÂt­OjtlˆûºÍÄý–MíªÇˆ[—„¥iwj~˜s¨ýkŒeéÙÑô.aloMÎ{{]‘ó®øù»Á© dÛJ;n©¤žO,Y.âÒäæGàu¾ (}\md§fƒküÝ Wäz^@ZiŠTÛ·%mfÑÎ|°Ç0þá˜+ö’ʲU'¹»¥ËŸ·0¸Ù±!noIJþL7z•K`õÊÓø5Ae8~å‘9ÔF™I%ÅÚÊù·±“âP¾ø\#Ý쥘Ÿ/ûBº gКLûô ~­õ$å)Û|ZÚùѹÁEVü"ògcÀÙÓ3‰œK·BÑÒÆ–Ab¸VqÃH:‰Ø(RÙ³IIÊWo<Üí¸âIôˆñô«|õ2¥ÁÙO’ þÛd¼â¾š½ø1{«õâ‘§†U+‹RâÆ1øƒ²WñŒ¸z»‚-ó™6(Rô[3“È,²gµN<úr'ç$q,~7[×,æ—ŸÞ㥤—ùhx]Üç -iâ7Ÿ¸H4IJ%³ÛU*ò£cû¹ª—n>%ÇÒRæQwèH”Ç6Å&Ÿ’õ)þ´éRíb_jÿcYúcv4KÛ›óñM;“†Ï"9ŸIâ¹,ð(‡‡±´ãæƒóÎ “¤Lx]jÛ–u–çlø†c1Ÿ»¥‹« w?wÈ>OR¶Š>ˆœžXxF—†#í[Iü5†}vÚ {’AEÊúüsÄ}ð_–­Xα>RõòŠÈŽDy¼Ê²µ§èµŠÕgüiÞ¦b1Å££m<€¯Åµ„XáZâ6Á¥ÌÏ+z›•J–ÃóS)8…Ðuø ÖŒøŠO¾hÂÈÀ[9Ÿ–nnzz¨®¬·Šné‘2s©E’X½p—~o Ûç³>ÍHx£°‹Ýã1±)òÝuÞÉåü¼×ŽGd]*TnH„s:ûäâFXXÁŸÏ3,ýúk–œ´^s²Ê=µ…ø\¥ ƒŒ IDATwß×—võ°˜ `K%~ë©k¬Ñ–• ßšõ ä0‹V&\zÀžÁ¾%¿’Z¸÷´ ï2ì±q|w$ƒ‹•ê¶¢×c#i‡“b½ÁgiÜñ" dÿÍ Œû9{²ìÅäDYâj¦\ÚxÏÏKqé±ÚŽÆ.äh©"æ`ûÖ3¬Y|ʵ¡GË;¨U«Ö¥?õšÓ½M $®&ö·œâs²±…„¸e¬_ºš³åZѦb1÷79ÜF.–cÛØÌdœK+2¯¤±{é²Ë˜§%ÍsN¡Ý>0œÌu3esj™çÓÒpdn[G+ü"Rö8 »þÌ„EyÁÖ—î ‚°%lbÞ¬õd…ôdP_Œ¿/Qû™—ǧѻc$–ôx–ÿ´„£æHꉛÅJÿÞáŒù*/¥÷¦Ký H<È–ØlÌhÆ3Oxb µø W@¡†U¬›2™ öu)ï”Büº–ïMN²&v U»ÕÁh6Â…ƒlÛ¾çÈTt-ÃÂXÅî l²„÷g¼Èë)}h[Ýä ™³Í7Òîkâú%?¼ó¦{¢ 5¥pd÷†°>õмÿÚ…J­ã³„y; t@+B.=àà~ W—¥¾±L»Qw¥j‡&x/_Ê·ë ò­ -²Pjp¨ýÔbWÏ:f[r Ž+ŸSK>ࣸlî<о׏!Þ¡ö ›s¹0 /eлS-,öûÓr<¢yºgœI¸ü舛³wWµˆáYãy%­/íkú{xßÅ$|×3Ôó4›¡eˆ«Kõ^ÜWw“¿ÇøÄÞtˆô"m,³cSð(UÌ×¼c+‰=A½[vÕ;RmÑ’ÀÙ?±nÉî½²â§j‡h¼âæ0yõnUÌ> ïd)ÚZr¬åÙ:e8^£-F¼ƒów“™±|:.ñ"¼QWƼZžïžþ.f¦à.Œ—ÍÔ鋸å“5dÙMxV£ñ —xW•ËÞ9îR¹ QÞKXšZ‘̓/›Û¡WW·’c™ƒ«ÜUÚÓÔg)1©tmxù}긔},K»Òä c5“¬SûØ»?¿tÛå|`ô¥õ¨'\õ±Óã8ïGåz}yþѾ4ò7Ó'â†MŸzŸ—+}Áô¥?òqLÎ~Uh8à¸+²ðΛâr¢ q5ÑiÜûx}û9߯þ‘O—™ ªÞ€Þãú“þÙD¶–"f%k.‡–Çqš`îmZìïDp mAËÀŸøé×Åì{ðÁ«?††w ™O,1)Á´)v¹+M,9ÖGÆÃüÄ–OŽáÔ'SY0ã}Ö»Q¿=#Çy0ãùY¥Y’¸zìë_oó ôÞŸ5£fp¤4óióe9Èq¹e—k»Ý^êo¸7lØ@tt´¢'rIÈ-y›ÐÏã./†¶½ávmI±<ÿØÇ¸ŒžÆ«M=nï ÚóÈɱatvÁ©ÈµÉzz£ŸœKí‰2¸z)~…¸õ, žÊ—ÆÁ|4©kákêä'ÃÓ_#¦Á ©u‹,öo)fò÷Ö·o_fÍšUæ}>Šãäà’¯]!ίØê㔈ˆ£õù©ù<;h /.M,r„•s›VqÜTZN¥Ûß™µ,=b ¢K*öÿè²9wÆL˜ïñå· «]1‘?†ÎP™‚ZÒ³Á|8å]¾2ßGÓ‰»óÍ·¿áÕö%êy9ö {ÖÖ,ßÄÎå³8æŘ(­¾üï?Îqvå÷l ïÇÁ·öÓ—-ã8;×.dÝðˆrǤ˜‰ˆ ~‘?KÅ@Û¯a›1•ÙÓ&1/ÃŽ{@Õ»?ÉCëáéàóìÙ'XõýL6"è1ò1¢¼ Šíÿ~p lóÃþ€–röÃÛŸnÇ=²;ƒï¾Æ=ôŠ™ˆ¨à‘ۅѯoÍêð—9ƒG8}•Þ@L|[òüÔ–JŽ¿)·†Ï3}–â "*øEDDDäoäFÖ•ëÓm£"""""*øEDDDDD¿ˆˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆˆ ~QÁ/"""""*øEDDDDTð‹ˆˆˆˆˆ ~QÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨àQÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆˆ ~QÁ/"""""*øEDDDDTð‹ˆˆˆˆˆ ~QÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨àQÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆˆ ~QÁ/""""¢‚_DDDDDTð‹ˆˆˆˆˆ ~QÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨àQÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆˆ ~QÁ/""""¢‚_DDDDDTð‹ˆˆˆˆˆ ~QÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨àQÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆ¨àü"""""ò§bVDäZ Å)"""*øEä¯âäà¶ ‚ˆˆÈ_ŒnéQÁ/"""""*øEDDDDD¿ˆˆˆˆˆ¨àü"""""¢‚_DDDDD¿ˆˆˆˆˆ¨àü"""""¢‚_DDDDDTð‹ˆˆˆˆˆ ~QÁ/""""¢‚_DDDDDTð‹ˆˆˆˆˆ ~QÁ/"""""*øEDDDDD¿ˆˆˆˆˆ ~QÁ/"""""*øEDDDDD¿ˆˆˆˆˆÜjf…@Dnž,ö¼õ Ÿl·–°]%z¿ó$YÿMl¥ñ¼>¢®·¢{1ôã±Dº·M ?ŒäÍÙ§¯ø{7|+U£J½vtêÙŠPwÃÿžÏéÙ£˜øC¸5ã‰ÿŒ¢–GÑm¬œû ¯{âªM„ÕïLþwRÃÏé/œVR¶Îgí© ´èÒo¹™›Ä¾ þ¼ðV‚ÌpûyÇY8väMÈ·bö]V7­OŽ´õ?úZ¯òÚZ8_k»Âqº0àÆv¾jUÐv>†wžü÷g¦1¼‘û͹äüüþG¬<˜IÕ!Ÿðd+_ ·jLnuüKˆå-Ÿ?oÖ9÷‡ž»¢‚_Dn΄Þ5œMó/Õg–Maéšý£án…—n£•-F¶ü)úìCƒþý©åe»ìÔ“œÜ·‘sÿÖM:áa"-EJ޼lŒK µ…U{Ó©e)¦(ñ¤v¿Ô÷3vl¹éœ?¸–•«¾áÃ] }g‘†¿h䓲u‹6· NÇÂÌd!¬vù~8þíßûþ»³r~õtV´Ðâ‘§h^Ï‚áo5&7yþ¼YçÜzîŠ ~¹ ˜ð®ÕŠ&ÿ?‡Ãñß²ô€Õ›·#Ê«há|üOÒgoª4mK“rEª„»ûÓyíÇüëÃ…L›ÍËÕŵ°ë¹GcÙpÎ@•àþãçì[¼ƒ´F-ðºêBh¡Rt;š„™f;u#*ô9&ÎŒcñöÔhîÃßæúéÁÝÏOÔ)"×a#/#dá¢M9•†¹\šÿßîjT8A呼õ'~úqû;KŽk UšöàîÿëJ¸å=†dp" ùƒô]»ž/×þ¾u¨o1Y‹]MªS}ú´j‰ËáéìÞ°ˆ½)ÍhâëH_œ¸£!þ3’r<+>WM¶äXÞþ Á£ÇReë,VnÜÅ©,/B"[Òõ¡þÜäŒ!ï8 ÇŽbcóI<0/¦®ÁÐë}ž»' “-ƒ£±_ñKÌfŽ$¤`ô £rÔÝÜÓ¿¡nÇöïHܯՇ»X9n³ÌçñÌ4†×;_Ìí%­¼3ë‰ùæÖï:Æ…3åkÝçz4¡Ø›¢¬gX^lûæ[î)¶þ8˜;H¸ N#[Ñå‰ N!®¸}{kK)ú^RŸJSrö3óéØÛêm^~1§ò}Á+/­§þkÒ·b1=Ì=Íö¾`áÚÝœJu" zCZô¨‹ÕL¶edÕ§³X±e?g³-G4¥Óƒˆ su,®êL[_}ˆ)ûÎòï‡â¨ôØdFµõÃp½}¹Ÿ+~¼¹ÄmÉ~^¼™#§Ò0ù†S§ó@îéqÇåßÜ„9èFbyËæÏ«nY*ÃùTøáâ¦ìGþ§ôЮˆüOånùˆÏåR³×P}ò~êv±üƒ÷Y}Æ äsnÉD^ÿçtmD—G†Ñ§sUÒâ¾ä_¯LçH¶ýÖuÌ`!¼Y8äfoBnáµu?«7¦áÚ¨;5¼<©Ò!wÛ^Vo:ïà…ÝNöÙc¤.¾n×^Ý·§±ó“ ü¸×“º½Ó÷îú˜÷ÏåËg'±ö¬õâ¾2vMã£i{ð¨ßžÆ ö ~=–w§,#%¬==Ê­Ês~éG¼5~GW‰ûw4îÅôÁ@Ó±ïñ`3OðjÃÃoþ—ûë÷EÉmسöòÓ«ï²8Þ“Ú=¡ÿ½¨í¾ŸåLdáo¹×X$½~û×Ï·l~›ñ Sæîóy B¯n q;¸€¯ßšÉ «£ÇF©ú~Ý>9:¦¥e=ÍšŽâËù»0ÕéIŸ‡ï#ªÜ1¼û1l%çñÁ)o0çXy¢ïÊÿõnŒË¡E|ýÜ–Ì+Ûykð ÖSïóh{_pkÌ?&}À#M¼1”´¯<ÿâÇÄžNü´1¼;mù5ï¢ßCèZßÈ®ï^ããŸw3ç Šå­œ?Ëž“×ý›´Ñ ¿ˆü­–ªÑ÷…§‰ö+X¨ês‚}¯­åð¹\Úxîcþw;±Õ|œÑÏwÂßЖÆu&óÆs˜½®O· ¸E+\ýqc?çÓóg2÷.bW¦7:×ÄÍTíÈ^+X»žäöwpÙ½ÃVrÒ/~¡`šµç§“t`%s?ÛL®S]Z7òçz·gÛñä„Ç©îa:Ñ,*ˆ>7“sÐø‚mdÓé­ÿÒ¡‚ Àv~ ¿,>ƒ{‹q<3´!´#ªÚ?yíý9ÌÝ|'Ck•¼ÿ¨þY%ǽ%ÅöÀÍ??3˜<ñ ÆÛ.«°{ÆÎÛ¾…½Éª==†ÿkRp?w“&Õ°|½cz6vœ‹ùÐdº~û×É·¶þÉ?ïEx·§|­Âo!ÚQßï¦à\¶‘ Åí»¸zúl)ú~>µ6¯-qL‡E•>»süÄüݹõ~‡}+<ÄÛ®=µ,#xoabÉ;ðìÆ°—¤²+@¢ðγß3{/-²–á¼5â⌟§˜<ð ÆÇì[Ø×Õcb;³ŒÙKÎâç›<9°ZÁñµŠ&8c(“/àx¡„oÎ4¤ü ÆòÍŸmýn '¯÷Yñ&íG´Â/"#†ê©]äv³W î€Ýy ›8˜i&¢[3üL— q·ˆ.DØ9¾å8Øz’=•}‹·‘ëÛ”Æ!“MåiÔÈŽ-eËéü+~à,±¯<Ƹ'fÜóÂð§x÷ß³ˆ·GÐþé'‰ö¿þ“…ï$¼ÈC½N:б:¤íÙIÒïMUëNtØ¥B;÷ØFNØ}iÔ¥6—~Ô€¥nêzZ9¶õÄÅx]oÿgŽ•"îWôÁQŽŒ­Õ·¡.v~ý~^²…“É9àEÏ'GУ®W™ŠŠëåæZ?ó6# ‹}kV »V²æ×ÀNikM¥èûõúTš1-Eô9¿kDбC¥Koì1¸R±swÊ;°‡àΩXäÕ0æ°´¯ÙvqúèÍ;oË6ØI?°“„Ь]å"Çg¡æãÿæå׿|³æ ß8uƒ±¼UóçääÍÊmùóÐ ¿ˆüO9yºcºÆ–™H&ùì}ïAž.nßtòì\| ö&Wød'% 3¶äõ¬ÚöþóDÌÛ¦²~ÍIÚß[©È¤êCÔ#Oõû²¿Áˆ³WyBÃÊáf.¹Ã^!Þ—¯ÈÜð pƒ3çÉ*¬<¼}‹¼5ÃNnz:V<ñ·\1µ›<ñ÷€ì䌋·]oÿééÉ%Ç€búà8GÆ6ßÒ‚/>μ™¿°fÊD–Oƒw8õÚöâΞÍ.ÃÀ_/ßÀNÖoËX8{ûætªï U)ï\úµ1ƒW´Ã}¿vŸS>×8œkÝîc#÷B6¸VÁçŠ=ƒð2K8>Ï ¯+òÇ?78uÌŒä›vÞ::\y|ÙÉé€ÏË?X›Üüðw»™sP*é©7Ë[5ÞHNþûü"ò·r틃ÑÕ<©7|<]+]}ï„ÁÙ÷[um±§qxÝapªMÍòf’ׯpØîCôãOÒ´\‘ÇÒlçØðñY¿j9 ½¤âÅnºYŸZ¡e›f³Îg`§Èj™=› ÉÙàêKa¥e0/‹£³§'&IJ·BP‘BÇ–Ar&¸TvÃHz‰ûww·—w’Šéƒã[#¦ª¸÷…NôËIâÔÁÝìY·˜Ø_ÞãßÉ/óòuËðîôk'Œ-y5Ó^ù˜CU{ÑwØêD†âa† +Çñâ¡R!î÷Ýp;:2¦×úikv*9Åþ‹ W_wÈ>OjŽÜ.íÁš‘èPšq6 ž—Š~ûÿ·wçqU–ùÿÇ_‡sX;È&¸ ¢¢ ¹ â*šfjfMæ49ÕLe›Óâ´LËÔL3ßš²mêWÓfÍ”–KZ.€ .¸‹™æŠŠ¢à²oçüþ€e; Zêûùxøx¨œsß×ý¹®û¾ßçºïsSDNV1˜[áj¶¶Ø~kë1 û‚Ú;º:Eä[Àý\Ý,Å'9žeÁ#0s‹ƒÜ¨\»ð¢jy©ŽŸ7&/ÇrärÒ-="ò«eÔ“vJ-Ã3(˜€ÖUü\O°þË/X—QyibÖ2²Ö}Êœme¸ÆŒ¥“ó R–ß!\Ó°ˆˆsºÅ0dd¯e}Zi‹5!3q9Gk,®"c%ËöXqî‰w=Ÿ!ìCzÌi¶&ì¢øì¬§•‚‹ØžoGÈuÁgo9hhùmZ®îÖf÷mE[^祟añár ŽÞuÄð»§1¦=–­8Rãë¥d¬\B†-ã3>ž#5¾|[v8ÄýàÕ€–?M=X«C°9¬¾¤³nuú¹šPBÚìgù糑Zlm¡õ.º–—GKÉ–Ûryi†_D~µ n=3.”×¾y‰· '0(Êkv*»V.fGQîþƒkÃó[e™ü´:‘ì t&/Âúu¯þG“—cïf¬”É$cïf6ÿxKàh¦ÞÑ SælÖßqƒ ¨õÌ9{üûÄgá<~X±Ÿqá]Zfã³¾å—ó‰‹íŒ¹p$’aêÌ„ñq¢îjôÀظoy'ñfX&2¤»?–Ì-¬œ¿’ÀqŒíㅡĆå»UÚP÷¼†z;£ä§²gÇnÂ;èÔÔ¾uÃ\Ú×3Ÿ°ôÍw1ŽÆß˜ËÑÝɬ>ã£ð46ýu†;Ÿpü kØöù‡ø\I+S.iãÙ¸·8FJR mFt«½ìZ™4àbCÛmøR€-}jg¡!ö$o|Ÿ/ÞI¿8¹å[–î6cá·¥«9„gt×UÌžó ogO ¸;û—³le.Î6 O‡üïyç¥BF Àœ¿‹õ VrÒÍïnjƒ[ÈÅí·M>TÔî“Ö70¶<ŸÌžw 'Ò/Ü“òC«XœƒïèÇéäj€Š–Y¿“›-µ¬àÔòwùrm)S#®íå~x¥cò²-GøEDÎr¤õø—yÚï+æ.L`ÞšÓ”9zÒãVî4žHÏÆæ ÓY5óƒ:þ¿=·u‹$€\~øúC~¨±NÏ6at¿éVFŒLk—rŽ,H"‹F h]çAÓ4€^­æ‘°9ƒwv®¾»ýât¸ï%¢÷~Iâ¬d•ºÐi4wÝ=™ž&êÉp`0Óñ®Wy"x&ó—Æ379¦Æë^Þ`tÆ/f(¡ÉsXôú?8òçøCDÓûÖÀHî^¼YKYþQ2%V#݈œôcG·oàyß¶¬¿6;¿8¦LËbÖ— $Ì\£O(üž§îwfÝÛo²jI"‡ö òÂew¯‘íü›Ûö¦÷)xÓsꓜüÏg¬š=ƒí.´‹Ê”éf¾~N=Ÿ$ü‰™>ó×±dÝ\f%™ð »Ž¸é“(úäv7X(/úÚÌ6ÿ*Ž2hÊeeR DäªãÎØ§_QD´þâÇ;×@¼ìTyav ÀÉžFQà‘+Xy:K¦?Ææ˜ðßïùø³d ãgðÔÍÁ)'gÛ<æÍ]ÅÞC')uò£}¿1Œ½ýBݪ/8Vd³kþG,Z½ƒ£§ø†÷fÐmÃ8óÿþÊ®‘o1}X_?ú,»½Ês“CÏÄÊ|Ì_ŸÛ@—ÿÍÄ6'X2ýO,oû<›…ÓE¶ÉZvœíß|Ì’u?‘™goÇž I½“Œ•'Xù̃ÌOXÄ¿¦,&üñ™<ÔË,…^þ9 â·’–‘‹g0ízåæI±´vnxÖÏR˜Êšæ°*e/'KÜïGÜ]¿¥w°Sõ|¡ õ­KY&ÛæÎ$~Õdœ){7ü:bäï&Ó»µcýs‘–B'~Ê· [IËÌÇèJ·“¹yLw<Œ5^ÓÐöV#áÏÓXßó&8/'!éŽäØãËMœ€Ï3™½p#i§J0‡Ä0jêý jë„¡¹ï»˜íÅJù‰ Äÿ÷6ì<™RæÀ®Dßrcb‚°?·4Ø–œå¼ñÐ xb:í·Íaõæd»Ôy 7ü~ÝýlkgC㺡÷ä’Tßø¼ûC½Ç‰ûhcµmhŸjòº.TAöÚw˜ñÞzÜnz‡oÁ–ý©œôÿ=Ìk‹Šéó—¸3©îõ;Ò†ò`g]ºäI°Ùζ}¨º7E¿Ì”À$æ~“DZNN~‘ô»ýÆöóS›_|ñÅ›ú¦cǎѺukUOä ’¹.Û[Κ¸”ýyÇHY•†GzD÷¦ƒŸ‰¬ÄWxåß+É ̈q#éXʾøïX±µŒ.ƒ£ð4œfË[ññŠc¸õG\\/Z•¤°ä‹%¤•ã5š¡¥ü´tYmãåuö¾DKÎ6V­Æ“OâÙgÞ¥ HÜZAÄàHuq*8½þß¼õïu˜o|®FØ·­Æúâ÷8Å5¶&³ùlìr2Û¾…þ|á3Ë›13¦Ñ¯ª!„yg°çÅUì?YÆõÎ:áH£ô±PD.°ÑDŸ»=¢’h_+é)‡8¾s;y„7¼:Hœh7ŠÀ_¨M™;wQH8ǵ=¿M#F7¹MeG6sÔêE¯‘]«ÃoÕúÜ"ÇéZÉ‘mGièÙ#FЦÆ]¦àa í%ûwrüpcÛ’^÷²MA ~üU¦UÃÊâÓdì\MòÆ ÀZÏSL¬ìßÄ1‚è[³¯Üèrß[¼ð·;vhÚöÚµíuî–&ƒnîöà׃^Æs¢¼Í`µ€µÆI¬©ï³e{­V,••TþüÇbÅ ½Âhíh%õ‹·ù61…c9¥àÙ›qOcL¤;›ÆÔ¹~ð~#¡ç ƒ}È0†w„ü];8Múå‚qݼ>½üûÃy‘m¨mKËÛüÿxó5äáOä€ð³aŸ&öcóضýïŽ#ˆ<׌n­pƊŪSØF3ü"rIØ{x÷D KQET°û)&ÐÕßýüYƒžÞÎy†¢ÂœF¶¥€r+8j·«øÐ –Ì_Ážý9žg‡GHš²P’S¸áãzþuq£³7>ÎUË=cÓözUÕÓÞT;Ôí16’ôšþ¾Æ··,õCþúB"ù?ÿ‡ÏX¦¿ñ;‚Ý£™ü—ûø~Ö’?}…•Ÿ‚Á#”¨ëÇsã¸þ8lSUýàäqA:ãéë '²)®´Rœn[¿\8®›×§—{8ŸÁ†Ú¶´3;ö6f"ËæøŸ¥ôyqþö¶Ö¢¾ýÉV¶ìC5úØÍÜè¾ ¢À/"—Áx~¸°sòÄW¢zžÚÖ¾opp¥|å|(É&¯Ô 5¾ÀZY”Õh¨,É£´ÅÛäFåÚ…u·©0«‰áÆ€ƒ«+F²8]P þ5Nò–BrŠÀ±sƒ3™…'ó±àz.$Z‹ÈÉ*s+\ÍÖF¶Å«ú‹ˆÄŽœµÌüëûè0ž‰>@·Î­1›àÌêgøËzc6Ž®N@yÅp?·-–â“ϲàpÑÛ{)ز½ömnáÁ¿ÇýªÁÁSÕv»tˆã¶g㸵ô4™©?±k}˼Á[9/ðÂý‘6Œ)/\ (Î.ÄJÙkk grJÀÉû3¶÷Ë…ãºy}z¹÷‡Úcª±Ú:µðXðõ<œFaÀþþÑWÌ^ÕŸ‡†ûagS-êÞŸš²½¶ìCæÇ‘‹q""—}POÚ9p(µ Ï `ZWýñs=Áú/¿`]†>]ÃqfËV¡üì;KÉX±„Œ'>Pœ•ÏÙß×cÍ'uÅ”¶x› xGtÅ­®6­¬Ù¦†ý|íÁ>¤7ÁœfkÂ.Š­ç~Z°cÛóí¹.˜†nKÎŒçHɹ+e‡HÜQÝ il[*ë<à—OáP™ ‘'Ò·[0f“,y¤mÏlðË9¬¾¤³nuú¹~ „´ÙÏòÏg?"µØzÑÛ{)ز½G_‚Ú‡Rý'¸µ7ö+…[^祟añár ŽÞuÄð»§1¦=µ^æý¡®ØRÛºÚ|1\}p0ñüGnêPIêÿ>&%Çbc-*/2@Ù¶‰´Íð‹ÈeapëÁ˜q¡¼öÍK¼U8AQþX³SÙµr1;Šús÷\q6߈É,˜ó ogO ¸;û—³lå©)Ý—Ð{’7¾Ï— ï¤_œÜò-Kw›±¯AZªMNnãÝu³kµ)çFNèvF;ÈOeÏŽÝ8„w"Ðgcã¾åÄW˜a™ÈîþX2·°rþJÇ1¶Wƒ!Â!ÿ{Þy©C#0çïbý‚•œ4Gó»›ÚãàÒè¶Ô5Gha Û>ÿŸë#ieÊ%mc<÷ÇHIJ¡Íˆžø]pï‚©õ ŒíÏ'óŸç݉ô ÷¤üÐ*'äà;úq:¹0ºÚ²½Å—÷ƒg3· 8‡tÁõÌ',}ó]Œc£ñ7ærtw2«AÀø(<¶©³i5ë[Þy9Ÿ¸ØÎ˜ ÷±qA"¦ÎLßWczãíŒmuÛØ­öø¼¤ûCÃûŠ-µ­sŸrkyKSÿp+žúšoþ»•ÎõÁÕ†Z¨àÔòwùrm)S#®­}ÓVkÃ>„M¿…¸ºkJè<å1F¶sÐ GøEä—âHëñ/ó´ßWÌ]˜À¼5§)sô&¤Ç­Ü;i<‘žv@0CŸ}·Y“°áf%9âv#Éî7þM€7=§>ÉÉÿ|ƪÙ3Øî@»¨¡L™næûçç\‚6ù3}æ¯?bɺ¹ÌJ2ávqÓ'QôÉ+ì®?Zâ3”Ðä9,zýùóü¡»™Žw½ÊÁ3™¿4ž¹ÉyàÑšvÃàžIC~¿}¹ïäy¬ŸDV…7­»Mä¾»'ÒÕÛmØ–:ëÇ”iYÌú2„™«qô ¥ã€ßóÔýά{ûMV-IäðÀëj`;OzLÁCm>æ»sù*¡{¯öDüæYnݹúÞf¶·âòŽÂfo/`ç?’{§—0oÖR–”L‰Õˆs«0"'=ÇØÑí«ŸÃßø˜²æT-¯Ã}/½÷Kg­ «Ô€N£¹ëîÉô 4aÀ†vötÛØƒÈZãÓùîô‹Mµ­kŸj™'ÔØ‡ŒåŽWñú¢ønh·w5ÛP‹JJŽïáÀÞb¼ +û&n´-û-¬UíØWˆG¡E§©ûcµÕjmò5£M›6­ê‰\A2Ê®àÆmå½?þƒ3w¼ËôѺQ®h–œå¼ñàû8L›É#ÑfDZ@9é³^fmÔ³LŠpT9lt]ÑySDDDäJf-áôIÞºqCøEDDD®2•d¯ýšío¥¯¿Qå:飠ˆˆˆÈˈϠ{˜¬BHt¿È5⊾‡_DD¤é~Qà~Qà~Qà~~QàiXÑVÞûíDþ¹ø8––Zfy:Kþ4‘'Þü‘’K¾•än[ÈâÅÛÈ«Twþrêè‡ê±õÈãs9Qq…´ùŠTÁñùðÈyäž×ÙUxÁïí´æ°ñ¹‰ó óÓñ¯)‹ |&EeÛ°@Y&ÛæÎ$~Õdœ){7ü:bäï&Ó»µ#†Šc$üyë{>Ãçå$$ýÀ‘{ü"b¹éðùa&³n$íT æFM½ŸAmªç×ÊÉÙ6ysW±÷ÐIJühßo co¿P·&Îé4R'KÎrÞxè¿<1öÛæ°zóN2‹Ý ê<~?‰îþ¶µ©ºÿ7Çüƒ?ø~ÏÇŸ%c?ƒ§nÆØP­rIª·þÄò¶Ïó·iQ8Ù4¾€Ê\ö}ÿ1 —m#=×ÿ.1 »¥ ›_~ þôRŸæŸßûñ»w_ ·Çϳ™%øÏTÞZ×™?¾ó$Ý\iÞØéåÒx.j\Ø´§Ú¾QÌ‘åkɳïÁ-ƒâxðü´i)»sûÓ×ë‚qæÑm2‰_¾3ýcñ8ûãJ²6¯ ÃÜ›1÷ó}ö…í±q–B'~Ê· [IËÌÇèJ·“¹yLw<ŒM|MCÇ…Ò½ÌzôYvz•ç&‡ž Lå>æ¯Ïm ÇËÿfb› µ>VÖÔÕÿ=«æ=˜Û‡ïä£/þÃ׺qïïúgbÉãˆS0á!m(vÆÑ¥;ÁAž›5g|%1¾øâ‹/6õMÇŽ£uëÖªžÈ$ÿrÍU'ùÕÇøoòI<ûŒ'.®'­Š aörNYÁ-j4:X8¸”]{رυ޷LbXL–Ý $/ßyÀPÚ÷0çÙWH:Õšž£Æ2(º=¦Ìõ$ÇoÆÒs8¼Œ`9Cjb<{üÀ™~ô ±ýC©øië’öaK;s1©_LçÍ9;±ë2š‘7ÆÒÑû {–. qkƒ#ñ(ßÝðº¼] èCpn2?œéÏÝ}‚!¡ž8ÎÚÈv´s-ãÐOóþ’ãÆÞÆÈ¸:ø›ÈÚ²ŒÕ›Ê‰ÖC>–-aûîTF{ËXz‡œaÇŠ•¬_ÏÖŒÜzƒ"]8ºf%÷ºÒ;¶f» N%¾Â+ÿ^I^à`FŒI·ÀRöÅÇŠ­et…§ÉÆøg-l¼N‡X¿(™C;V³3?”~£oàºP{2×Å“”¸˜A´1[o“]UÝöç#eU=bèÝ›~ÖP­âúÞ§¾~ˆçç†öóÇd±¡_ÌüôἿø(ÞnaÄðîxæ®ã»Ù8]Y†wÌ- /`Kâ:r;Œ¤w°cU0*ÙÇ’O–’Ýý÷Ü2(cq3ÇŽ©Ò†:5w\ØØåµ½ÆåkáO|÷ñ2r®»‡‰ƒÛâåvŒäÕ[ÈöJßæêZ±•ß±£²7Ž2°yé|cciãR=+2Iþh6ǺM!Öy ›Ò¼é3f¾öMX‡µ€}3§óÖ¼TÜ£Ç3rä@ÚÚbÝ÷ß²Ë.š¾žmzMããÝÓÍÎ¥+ÈjÇ(¯³AÜ’³U+0ôF"< kƒFÓoðÀÚýo,%#i!Û˺3òž ´Ú³ˆUI™ Ž!ÐÙXÈß¹”ä½fzÅß¾ä—=Ž8¸Òw¡ÞNBè> ^ÎÆ+ú¦·kì…føE¤E•îŸÇ¢ŸÊðŸð/¦Ml‡@ìP"ܦñÆ’¬ó^[‘å͘ÓèçSuä óÎ`Ï‹«Ø²Œ¥)ìÎ1öè“ÜÞ× зon_¬Å® +çN6vaL|öQ¢½«NÉ<²çåuµ'f@,½Ã^ãå ùnëü1¸±u¹ãìã·ÙFW¼ðpÊߎë}sHÏv'tÔ#Ü{gNT­¿‡÷^ül?§J¬„¸To‡C w=ö[œ Ð+”Š”Íü÷@ÆMˆ­Œ@7ÜÒ60cÝrË¡UÉÍÞ¥Ë}<ñtU«¿ž>Ý>äï_Èüõ£x4Öצ{7-§¯ÓÔˆêyX»X~ñ>:š @ý{ûóÚS³X¼p?½'7Þ¦ÕËÙ_BÜÿ½Ã°ê0]‘ÑH­ìi .ÔP¿ ªL`þê&¾ÁÃÚT ¤Ý;ñÁ†êdP Ý}¾eõªÝõí‹Ù%—³#ߨap*N6oìX mè»AÍ~6™Ê“¶îcVŠv/eg‘½FtÁÙtNw÷U¬_¾œ¡7á{Þ: ¸v£“Ãk¬KÉ¢_œF òÄz6e¸uoœ6Ö¾Ú`Ë:,'W0?ñ$>7þ“‡'‡U_EP8•“>f*írmxMAããýÁÞ¶÷êk®ªcÌÖ¸MÉ` dà}w‘òä'Ìút=aÓà~áN[qú?Ž˜Ìæ³ÑÑɬsÝ•F×cD¤•“½s…„3|XÛª-€Á‰6#FxÁ« Gé}.)ÝZጋŒ^a´v´’úÅÛ|›˜Â±œRðì͸‡§1&Òý¼™%CÇt­qÉßäî‡ `µBّ͵zÑkd×ê“zU q‹C¤k%G¶ÅÒ„uÕ¥¡íÀÄàÇ_eZõIº²ø4;W“¼1°ž÷Ä"»¶½ªo1ªª™›»=øõ ÃÙ™V#ÎÞf°ZÀ å[H-2>ª?çVoÀ9|$ѾVÒSÒ±õ9¶Ôéçeù¿‘Ðs/Â>dÃ;Bþ®œ8Ò„6…&úç™sšV+[Ôß/ò÷næ$í<$øÜÌ—ÁŽqÑœÍ2öÁôŒö¡bO‡ ­@1‡Wn¡È½1œ«–Ù̱Ӕ¾k기•Ím·æ±'áʼúÑ'JKJ(%^½<àÈ2RŽ×~4’Áµ+£I_±‰œÊªcÉõIœôèG¿öNµ›iÓ:¬ìßÄ1‚èÛ®ÆñÅ.÷½Å »ƒ`[^Ó´ñ~qcÍÆ¾Áä;Â)ßòßlÊ©=Ö¯ãˆh†_D® ÊΔ€S{<Î:v®þ˜šO˜³w3c¬'Ü£™ü—ûø~Ö’?}…•Ÿ‚Á#”¨ëÇsã¸þÔX¾½«K=˱RVP@%®ø¸]p¸3ºâc†’œB¬MXW]Ú°R|hKæ¯`ÏþƒϳÃ#¤µç[ììMµ¢Ñ¾Þe[в(¢‚ÝoLáѺ^àU@¹œ½în[~¾+Ì=ÈãüÙ"ƒ3ž¾Îp"›‚‚œÆÛ„oUÝ<¼.xªŽíµ²EýýRIQv!Øùãå|þ²n­p9û/cúá±d9S‹èžÊúm…x FˆcÓÇiÓûίYãÂæjcÛ-9[YóSXãyûþø –’džäc ½­íùÂàBèО8ýßr~89Šá¾¤¬=ŽG¿i´v„Ì ëaÓ:‚)É)Üðq=ÿ2†ÑÙ窾Ímô5VÎØ0Þ-xÖ³»X›x °-Žù ˆ±ë§1ÿãù±ËôºâŽ#¢À/"×#N^.P’M^©œÏ!* ³¨ý8é†Î v¸tˆã¶g㸵ô4™©?±k}˼Á[9/ðÂý‘Õ—µZŽWWŒdqº ükK!9EàØÎv8Û¼®º×SïG œµÌüëûè0ž‰>@·Î­1›àÌêgøË‹«¶“'ޏõÐóÜÐÖ¡v«¼p±é$m[ì( 8»+5g€K8“SN¸¸Xo§«þn´»Äµ2Ô;¶=œÀ’On±\ε£²èôy¿ÓÁ>x ݽ±iÍ~r ËÙUÔŠCÚÖøBkSÆiSû.÷ﯶ´½’œÍñ´z}ßÃôkU㫼–Slzÿ6¬YIÆø)´±?¿öÎáÃéf~‰ 2Øs [OúpÝ 68Ôñ̶uÜ…‡«PD^±ÜÏSKñIŽgYðôDZÑרx\¨[eI¥M:–Ùú 5ˆA÷ÿ–”'?ç«Ïú2¥Õ•v‘_3ÝÒ#"-:‡àÑ7ö±lÅ‘·V—’±r 6/ÇJá–×yéÁgX|¸ƒ£7A]1üîiŒi…Úü%dûÞsš­ »(¶ž[~ÁŽElÏ·#äº`Êš¸®¦<%°üx ‡Ê\ˆœ8‘¾Ý‚1› `É#m{f 䃞´s(àPjžAÁ´®úãçz‚õ_~ÁºŒJ›ò¶Ôéç(™¸œ£5OEÆJ–í±âÜ)’€6ÍoSSkÕü§5ñèÔ²fmgoH±rpÅFòk¾Ô± ½ûxR²}1I‹R(ñBŸÖöͧÖKÐwÍccÛ+O²ì øáú˜î„EDœûÓ-†!ƒü {-ëÓjG`œ;ÓË“«W°}ÅZ²}âPG‚¶ue˜ÃzàK:ëV§Ÿë7JH›ý,ÿ|ö#R‹±á5VÇ»Pœ•_cŒä“ºâÇ:¿­Uoä4ŠÉ·‡R²ñ}æmË»âŽ#òk>;‹ˆ´ ‡°ñŒîºŠÙsžáíì ôw§`ÿr–­ÌÅÙæ¥pé‚ë™OXúæ»ÇFãoÌåèîdV‚€ñQxÁ–›º>÷-ï$¾Â ËD†t÷Ç’¹…•ó7P8ޱ}¼p=cú0`g´ƒüTöìØCx'l8™ú„ãoXöÏ?ÄçúHZ™rIÛÏÆ½À1R’Rh3Ô¿Yµ6¸õ`̸P^ûæ%Þ*œÀ (¬Ù©ìZ¹˜Eý¹û®¨àÔòwùrM §<ÆÈvÍ®“áç©ï¬oyçå|âb;c.ÜÇÆ‰d˜:3a|gœÜ*mhS^ók5¢[³ú¡ÖÉ/d47õIä³Ùá½Ü[èæBÞÎ%¬ØnÆ©úJFuâ'(¦î ‰$íÿß Âß¾‰ã´®±cSßå7s/´¥Ïmk{EújÖßqƒ °¯Õcø÷ˆÏÂyü°b?ã:^øô>gB®ÆuõBf'‚ï¸Au,*2š°Ž?ÞÀØþñ|2ÿyÞ-œH¿pOÊ­bqB¾£§“«“¹ñ×]ïvöbOòÆ÷ùráô “[¾eén3öõ}S¼žãY­þw­÷ˆAÀ 3fÃc|wÈú+:Žˆ¿ˆÈyÉÑŸ˜é30ýKÖÍeV’ ߰눛>‰¢O^a·‹±óɽÓK˜7k)Ë?J¦ÄjĹU‘“žcìèöØÛ|63Óñ®Wy"x&ó—Æ379~‘kˆŸA÷0Y…¸ ,¾D?ô2–¯?#ñÿ`e¡'Ÿ`Ú|˜ ·GábKéQ¶ÌÅO†p®øts7¨ÏE䊤{øE®º‡_DD¤Šîá~Qà~Qà~QàQà~Qà~Qà~~Qà~Qà~Qà~~Qà~ùE˜T‘kCƒj ""r-Ò ¿ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆÈ¯œI%¹vYOwgòîŽc8S™² ¥&"¼]x4*˜ß„ù© ""¢À/"WFØ¿{Å>Ûs\ÅhD^YëŸaýñ]ü˜]Èßû¶WQDDD_D~Ý>Þ•©°ß ¯l=LL€;7¶õ©÷ƒ”®š4®¢ˆˆ(ð‹H {}{úÙ¿ÿ®Sÿ×?”¦é¥Ü¿j‹gðÖGë ü?_5I9UÀk1¡ôõwÇÃA‡Y[ä”V°:#—Ç’è*ŠˆH Ó—vE®Q{rŠÎþýÿ WØo@ˆ«#^~öß[Næ×ùºweòCV›oíɈo…ý&ðr41®½/)·õâó½ÇYTýáJDDøE¤8›t(hLk³ãÙ¿ç”Ö}›ÎëÛÓyk`vªgsy8˜øg¿PÞúñ¨Š!"¢À/"òë²'§ˆž*ÄEÙÆ»Þ«(""¢À/"òËT ªÁÅòu²¯÷*Šˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ(ð‹ˆˆˆˆˆ¿ˆˆˆˆˆ\z&•@DZRAnooIçó£ì+ªÄÎÁ‘޾^üþº¶<ØÆ³ÀÊÑÃGùO®™û"½ ÒÔÃ,ìÜ´™È-Åü¿‘6¾îÄ„ðT/º;4a‘•<ù¿-|ܺéÃ<1Ûô&õ“ˆˆ¿ˆH Å9G5;•µ&7&G¶çqOEE¬NÍàÏ‹NðMt/VõvÅ GÓÒy)Í›º*HÖÏÛú·çgX­ñCfŸoÛͬCgˆŸÐ‘N—öƒ‡úIDD_D¤Z9‹“²OÞ»µ;xÎþäîAÄ-ÚÄ=[‘É8GUËÖÀÓ!€ß»jü_{žÙ¿—A‰Ç˜¼Î—Ô¡^x¨P""ÒÍ׈H˰Tp¨Àfwú».8Ò811ºìä†cy1oÎ^CÿŸÊ ð(}>LbXZEÕë¬lÞ¹—ë¿Z‡Ó{I˜?Ṵ̂U™l/«^Ne!/þ/‰°MùìØ½‹Î$ÑeKU?¶p$- s6àù^vÿÙÀ •GI.±^u‡íaa¼ÓÖŽ¬ýé,+9ÛÍØþÞci Ÿ®™Z‹ˆ(ð‹ˆÔ8š8Ð/ÀòrÏš£,Í­ ²ÆÝýÛðÁõí¸ÁÕ‰)7öaV˜=8û3ç7}ù¼µ ¨`ÕÚ­D¯Îä˜W¯Ævâïœ9øÓ^zÌ=ÈÆòsË:}4•QkòðiÈ&ŒXÙ¿s§±ÆÞ‡g¯ïÌÛQnœØÊÀùÙP~•ÕÚ`ÏÀŽnP™ÏÒœJhÖö7òžÊúú髵ˆÈU@·ôˆH 1ÉÛå{xzW*£v¥âìêFl°½ÝÖ“ÎŽÀ€§«m `gO[gZ› ²à$ÞQŒwÇH6 ÷ÁÇÈþ; [šÎ3iÁ$†V­)çx%Oý&š'}ŒkéižÛCeP8›n ¢½@¿ ÞGÄ‚tßÌêGŒWQµ]]ð$ƒ%V¬¥9o§ â¾-ÝO¶½ïꪵˆÈ•N3ü"Òr7ŽëCî=}Y7*œgÚ;S|"ƒÇ—m§ËÇë¾9‡SõÜõQÍ6˜åYö«ø…s³£•-iEýüŸþÁÜé]öŠs³XUf ¶{+ÚÕ8ªyq§¤¤Rx•ÖÜÐÌíonÍ®åZ‹ˆ\©4Ã/"-ÄJi¥ƒŽÎôoïLÿöAü+§³³xgÃ>^ÜüøöåëöµçJJÊ)ÞvNüÌΞvNp¦°‚rìpvq æ×*JKÉÁJü’äºg1Ìå”îWQµ JÈÅžPgƒmÛo=ÿž¶ÖìB×b­EDøED€²œÃD}•†çÐÖwv¨ xû´â¹ë+X4s/kSÒ¾öSàœìq ”Ã¥V Fš·T^ ®¾Æ³,;Ãù_ 6Ú;à†=ãã¢xÞ·v µ39â}U}¶*gíþ|0zrƒ§cŽ Ûo(iVÍ^ðÿ×\­ED®º¥GDZ„ƒ«'1N°iËV•ÖJ¨dÊ% ô¶Ç἟T1{ûp¥|µ#—œ??uô(sK ôlç‚K=ëvñò¦¯©œu',{™‰¨þÓɱ„ÿ¬;È9Ö«è`g!u*¶ÐªcÜš·ýM}õš¬µˆÈÕA3ü"Ò2ì=øë_.?ÊÐÏs¹¥³}<1[Ê9t*›/öŸá”{ÿ wÆ„;;矞‡S ;‘n~ü£Û†îÜÁK[iëŒ%7‹[NqÆ3„†:b¤¢ÎUœ¼ù{O7zmÚÎÒ¶Üâ„¡ ŸE»²°ÔobMWh-cíþLœ«þUTTÌöãY|q¤˜JÏÖ$ÄT?ƒß¦í/mFͬµû骭µˆˆ¿ˆH# ´éÔ•}Þ'y}ëQ¾>p”yE•Xö„x˜¹±_7žìæK„€Ã°ï0Ï-ÙÁ–1ýø¶‰ØA½Øè}€'~Ì`Úþ2 ..ôëÚ‰oúÒÃÎ{ÎçyŒtï݃‡xtkï-¥ÐÞ‘žmÚ1¿ƹ®Ðš–1gã>æÔØÎ`7n¹®O÷ò§‡C¶¿²953ÔÙOWg­ED®â3´ÕjmòoJÙ´iÑÑѪžÈ•¼ó¿—töï֩׫ -P3Ã{Iªe ÖZµiºò*""""¢À/""""" ü"""""¢À/""""" ü"""""¢À/""""" ü""""" ü"""""¢À/""u²XUƒ‹•URŽ—£~¼ˆˆ¿ˆÈ¯Lg/Öfæª)þÈizû¹©"" ü"ÒR Ê+U„F)(9û÷úfŸï£kS)³XT°fÊ+«à© y4*XÅQà‘‹ÑÙËåìßXµÓ¥å*J=N•q_Ò¾³ÿ®oöùžˆ@zøºÒç›ÒOSR©ào«ÂòJÊ¢ç×[ù]§nl룢ˆˆ´ƒÕjmò§›6m"::ZÕ¹‚}´+“?$íU!šáû#ë ¤VàÓÝ™¼»ã;OR®›úmâh´£g+W æ7a~*ˆˆH Ò·¢D®Q÷D’|<ÏöW1šà™^mœ}6ww äî.*–ˆˆ(ð‹È/Ç|2´3ƒ=4ÝÍ>‹ˆÈ}Î×-="""""W/}iWDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDDøEDDDDD_DDDDD_DDDDD®Pÿ½D1\¾½UiIEND®B`‚082_director_import_modifier_lowercase.png000066400000000000000000000660011516513262500371600ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/08_import-and-sync‰PNG  IHDRŠeWºsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwxTeþþñ÷Ì$3i“Fz# „Ð †" àê‚€ QWWQÑõkß]Û®ëÚÛª»êÚÑEl« *½J½÷JH/“L2óû#BÂOÁ$œûu]¹®dæÌ9Ÿ™œ™yîó<Ï9&þ5׈ˆˆˆˆÂgA¹˜›ºùu)ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁx4u"ǸÇõoêä4LoÍkêDDDäRO€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒGS ""-‹ÅfçÚŽÑÜ”H×+~îjr K˜½û o®?†ª¦®PD¤é……siM_­ÁÝÈýÁá ¬ÊãëüÆï?ßšMO€\:Žq™|kiêR΂‰˜Ö±<Õ)˜¨fó îæþi£FbôsY”4ú®ªáð´G5j£F¿ÈÚŠ_¸Íò•<}Í(øî 5u¿º÷¿¨®ÛZþr>üó-\=jš“OÙÚ—¸aÔ(ÆM؃ónúÂc¢m— ÜãúŸòãü}/– Žc߯ô¦³¶bÆ]ýqnMŠÞçuÌÄ$$±üwݘÐ#‚ËBlxTUq¤ÚB›°VŒíÙõ7wåù8«Ž0‰ˆ¡F&0sD{>™ÎáL îŽJdöUíùrd÷µ:õþ_ƒ>§31ñ±<˜ï6æ“ãjêz¤1Uëf°¡¸½¼µjòX1{×ùÙ¨ÅNBz[œÁaØL5úqS¶Û¹ôŽ{ÔÕüÖ¤µ+Á'«ù¤ðfÇÉ÷Y»ù¦Ô˜0{xÊÝí™íÍ¥·2³ò<—àv²:»k™ƒò󼩖ÁDLR +/ #Œ ¾\²Ç6°ÃY›´=½|Ö± ÿì̯èF蔕ŒÝSEMW-"òk ŒL`æ°Öt3æ@^¸*¾]ÏKGjøG%2{XM€g¯ŽHÃõÍÞ8MÁù¢ &ß8‚Ë60c]½2OJØ5G²˜½ÛBX”‡óÎñvmmóijõnpQUV~©döíB¢ ¼†??sÍ9Þð…¦šå;òQA½„½á º²±WÅíföö*ÎkþvóÇïVÏ-´(ö>F˜«˜'¿]Ç3‡ªOzýŽ2¾ÎZϼœ6,øm ·nËô ù²¼):¹EDšŠ /›'Aõòy øÀ3–™¿­ ÇX<³š0Á¯šïH³îÏî‹‚ùm÷dݘ‰ëÎ>l¾² Ãý<锚Ââ1ã×¼kS¹'¤¶+ÅâÉò»úðqëÆöëȺßõÃ=ö"Ö_ц«Ì'ƒ&z¤µcÞõáן²ßõ`v¿H:Yëî·øò×ú³#ÃNzûT¶ÜÑŸÍÝ}°š½¹ïÚL–t°‚o ËÇögvüé³”w@(Ï\ރܱýqëKÞ莼’ìƒwý…ÎT‹GïÞÒŸ}Ùñª¿î°drÆ]Ä›aæÓ×[·þžé)ü8ºÎqý)½¹Ÿwm8”ÉL\|<ߌêEá¸þ¸nïÅ‚1ôñjŠªs °ƒSMlš±š‚“ZŠ5Z6‡½¾ÝÔÖ÷äÇ¸ÊØ1ýmžü¿Û¸~Ô(n¸ý>žzw{*N¼%ÝUYúÉ3<0v4£®¹™{I‹NítîçË{FqÃËë¨p—°øñëyèÛÃP:'n¨ä<8™ûG]ËßWÖ?¾ì$oå¼ôÇqÜtõ(®¾q¿=…-%®z뽚{>ßÁ¾ÙÿàÞë¯æÿ¾Î¦7U—ðÙ pÛ £5ê:n¹÷iÆ/Ìá–íbç¾|ö`"6ØŠçOíó?¹?{2òо¸ŸÊ kýõ›éÜ«îqݹ?Àtü=UzYözËœv½f/vøPûcï-Ï >¿­?îqÝëwì½äÉ5Ãúáþ}{xþ /Û9a¦k§xXÜ,X°‰ç€Üäeïbä²2ð áé>Ø~åJEDš–›ƒ{¶“9%‡õoöä…QlÞš.õÛ_îRž›¼Ž'rO÷¹zþ4ßP'¾C*oG;xoá&F//"(6–oG÷äÇN&¾]¶™«æç’Æ›£H>ölLž Ø™7¢ª™¼j;X•#*–/¯MçàA¿‹»‘Õ7’èüƒ<2w+m­ ±C;ÖŒL¤g½/æà˜$¦fpto.Ÿ¬¦Æåàã–sÝ'TbÔ˸éØàïLÖ@^ÞG#œ|¿z;·/ØÏ÷U<08¿†+öìk9§Ôkòd`fw–f†bËÉæžÙ[yz/\Ù«#S»ùÕ…3Éiél¹<žLçQž™·…{וÞ>‰…W%Ò«Å4Tê1ù“>8 󖙬̯÷¶ª>ÈÒ9û±÷D²O½åÝelúøþôÞòc/áÆq㸾_$‡f¼ÅCþŒí7ÔdÆsðòä XÒ‡qëØkÉ ÛÇ/¼Í†ÆÞ¹&_º>ðÞ=ø¿—ÿÉýyÓU“;íYî}î+6ywcäwsëÐ6ÍùÇŸÀ6DZâ¦dÝxþþÁ&ì]/¡_;;¦ŠÍ|üä+|³ÅnÃ~Ï]·§›ÏV¾ûdz|¹ë‹þþ¾„ÅåÕǃ×)ûü÷g'ó6Pa æwaõ¼Å—ÚzáÊ=ÀWÅ‹9Ãz-UÌÚY­¸Ø§¶ÁïLo+€/ÃB=jBxú1<ÔDYÎaV·”I!†ÇÛÀy”çw8hüï[6ïcÚ¶ &¦Ùˈˆœknr÷l'sj.' >6YiuÒb¥z¿ÌGyîÞ®ØMÈL~‰{^šÌgËÃ#!ßðùú*¢¯~™¿__{„sà%tñ¿G¿ol\‘¯àBíž`ñ%$2‚V6¨):y)wÙz>ÿl=®Ô;xá‰Á„YúÓ7ý]î{j2ã å龵˖mspÕ«o2,Ά pîùŽÕù&R|˜;{Û1z'ðñBÌ%ÜX›d²Ñ/gÂÏË“PïÚE“Å“„ðpžÐ Ÿšþ¹»’jjS\Ã}Þd >ãþÜogÓœ­¸¼öìBJïVá\ççbæâ£ä4’L¶3¿O.Ý{”½=£êÁû¥ÕDFSUÌB—?ñ>øì.¢&0˜>V7‹·Stêfš'‹Î~@A!["¸˜,VÚZ±YÜìu@¦=¾¡øV9ÙYXI™F‰ˆa¸Éݽ̩°ph$ §Ü]Ê “×òXh=죬=v@Óíâ`… Š ø±ìÄÑÑ‚ÒjÀtRcgÇÆlÕ›8X‘ŸË‹!,:ˆa­èB×Ö5ºkÞŸÍ·•&ºÇûpü ñ¡l>ý™§nª*+a­úõiÏËi­èìkò£<2sí¯ý§ûµúÿ¨ål4¨78<„N”óþæ²Ú€“©s–“ðÕnVUƒw`ý¬.æ®=žz{báÁ>-®ñ¾48Ó"˜ì¸´³]³²8Rà$gÑ1ÄÁäE›!—û ê¬:°‚å¤]Ñ›Ðã'Ç2á›rýBÝìZ±Ÿã»ròåô‹µß×=‚’ˆ·¹Ùôñ|2}{ò+!¨;7Þ£;ù·ÐàÅÃWõæð-}8|KÝ”ÁÒËZ3ÐTÌËÓ·0¾´Þ›¥Á>6û³Oeïî«!¨uÝ<,tlJŒó(oìo|®ÁÙ¬×R”ÇŒ 3‰¾øâA·Ö>8r²ym5!QAÄ[LDEG1:›ä”p?×±}é§jv»ÍôÊèÄÚQ©Œñ<[ñáÈ®¼ç»%=Y‘sÂM…£ŠÂÆ>ÿª«9\éjÒïfßPãrŸú…ìrñÔŠ‡ «N^Æ]ÃþÒj°áí‰'{ Öìr²Çþ¾xÖ=º¢¼ŠÒŸùrUäqˤmü½w,wöMç¾à*/á[öóøÊÃlv‚—×Ù×rŠFZx'×k"À×p²«Áú«•ì©[­¿ÍFf.Ú§ñ4Zæ‰P|Öϼ™0ù2¨+ÞÏÌfé¡¡ Íaá ¾è>âm°ÿø‚nªJK©Æ0{ƒ·„Å0?¨È/¥ÌÇ^ ´ò>ù…·ØÃñJ~f™®²<ʨfÍ‹¿ãêÆ*¥Š¬AÔŸ¦a Èàî§î`â„IÌxïY¾{L‰d\2œëGô&¦¥Îé ŠÏæoåÓ’a¿¼¼‚õùŽsæÕåú%ÿ7ù‡s7)‡{¼™K—R ^1˜c ëI_Û.ª0sü›Þ3¨Iƒ@³ôsuèI§zÇÁ#‘P[À†#GYëÓ ª÷˜Ð˜Fz¹Yµ§ü¬ZýÔqÖ„ì¼¹+O…˜q9+Y—}ˆæoâÑ#Ð*Ôp3”åŸM-µ½!vÏzÃP<韄ßêË;”Ï|¹½o½3 YèÕ«+ë¯I¦¯Ê òYVíÉEáf² ÊØT÷³µÒ‹Û/JäŽ S“Wûż“ÔÃNμ9,µÃ¡™ô‹;µ¡m‹ëNù,œº©Þ¸e7Åk`i‰™ÄnñĤu €müoÖ¾zgÞ©dïì©ìý%Z£»ÒÖZÊÖíU´ŠŽ!&¦ö'Êï³>ý”™jNóFuS’õ w}”/ö81Ù‚ižÉð±÷1:JveMä8'Îz®*æýÝNB⣸­caE¹|pôô{úÙ®·àÐ!²Ü¾ÜÞ)œÄÊ"f—¸¨./bJ±™¾bdu𿽎vö¦–­ÞG–ÛÌ€¾©ÜòÓ¶q9 xè¿Ëè4çHË ;""ç@£À]Ê “–’Øð¬AuAàLŸ«çÃÛ€=޹Ã=ynsy6~×-ŠŽ®"î[YLAI)ÞÇœ´t™÷òÆÞ Ì!Üß=ÿÂýüiW%5?ùÒ¸k>zÛ¹,6Gn1ë§æ·¢ü"y'ñäe)8Wå±Õe¥St÷„¦•d» ºäð™k©ÅG]ÜѦïwÝÉGG¡]BGUSq†WYp€?íˆâëî™åµ—s«ðà¯iVv¬ÝË,¸Éç±U%¬ÌèÄ|Û^ÞÙïÀígç7ícø­í0WÏýõO[uîxÓf`þó&óî4‘IL#g;²„ôá†!ÿã¯Óžå1×(.ïŽ+gß½”ЍaŒé„·u8צÏçÝ/åɼ Lñ§dël¾]ø‹æL˜ì¹~D"|þ7ž(ÁeÃ!o«fOayYo¼ÓS£SHMøÄµ' èC¾zùŸX®Ê ÚRÈž‹˜º bFv¤UK¸÷9ævœíþ\ÊÍyN‰äïm`í¢Clý‰ÐtÖëuñyü+ʆsÿQ6:*˜‘ãä±;¾å˜TØòÞQ΢nø1˜Õý‚yñêntX¸'6²¿®KÀìéÍei1 (ÞÏc;8++9×—áiþLxZ=°7 “×òè'.¶×MŽ"ñØý=ýë\°!`Áœ5|•ÀŸzEÒÆ³ŠÍ9ÙŒþq7Ÿºs¬¤g~^îÅ?’­¸ËËYºq+W/Ée““F„œÊÅ–mYÔ¶5OM§û÷K¾ïÔÎqgÑFþ`æÕ^Ñ<Ò? »ÉMaI1“–¬åÏkK©\}æZ¨ä³ÙIî߆?ôLedUKöäúœ<32þ§_wÿµœAG“y.µ5ï¥yPQVÊ”eëxpMQÝ8ÿÖ®XCZQ¯w‹â•v6|•¬Ú·‡«–ìcR ¿ØWâ@zÎfzaý2£iôŒ§&_Òn}‘çcÆ3~Êt>ZPÑ´|Ýx ñÞ& œÁ¾†ÿÄ÷ùráù÷“»0âÑë)}ïYVÿì mÄ|š×Â'òá·3øx~>•¶`»^Í#c†Ó#ÈÌ馅X".ãáG|éVSêÿñþS™˜êßZÎênç™å•'-ëÙãq>ücg¼Ï[‰ûùòþûùò`íŸmÿð>Ïô ÄD ¿{˜{Æï«½#þ6Þ~a¡–Ú?«ó–óå»ÿa溔TžùóÓͼ‘×Çþ…åÞôùË{ÜŸîu¾ª9®Y÷¸÷®á@Uƒ‡Ù¸§²Ñ囚<æ¿ñ2߬ª N'®&-JDDDDŒ®Y‡Ê¶³ùHõI7¹Kv±áHÕóÿ˙˚]5ÇÿôKÀo†_Dx3écjæÍÑ\Öî)cDLÇF9²×p IkjÈLP[x8¤`¶·ÁÿX´r»¨9~Ø?€^7ÜÆ-ílµºâ¸âÿ"£Ê X míù«W.""""ÆÔï¾™¾„õ»âp›ðj•@z¯K¹jäÚúׯ½’-oßÉã³K°õz’÷ÿLÖÞeâìíÞò&ÏiæÝ>""""òkiž!À+š.¡yÌÞ¥Û7“WJ´à.cφCµË§ÓÆséiB€“œÙ¯óäÛK)lp{IÎf}³™EÓäæ§æŠx¯ã½ ¸KXÿÉüí»ì þêBv/ùœ§7¯!åä‘IçOU6Ó^~Œ÷W•Õ»Ñãè.–ÿðËç.ãÖ¿?ÄÐ8¦Æ_s„y¯½Ì+j_ÿÆÓ‹ˆˆˆˆTó<8lò#±cDíï¹kÙ]V׊­ÌaíþÚß½Ú¤vš4•;¿àù“€'Á±mˆ ±žX¨l-ãŸû”MåÇZÈnŠV¼ÏËõ&|ƒüjÚ…[ØRz¶õûÐñ®xî/·rü€½7=îüÏ=ÿ}[ýÔË^Åîÿ¾T/øß­/2;S7’ˆòÕ|øâ—ìp4Þº¯ÜôãWœ¶‹DDDDD ®yöàIh‡d|'¤Ì½5ª¸8ÀFõÑ-ì¨kÇt‰Á–ÛÈCÝ…¬˜ø9ÇþöíÆmOßÏeq^˜ÜUäÌÿùç" ŽÎ`ââ«øÛ Ì5¹Ì¸ˆãÇÞÃòÐßn§Wˆ5ù+ùø©ç˜zÖ“,øE·!9¸ P`%0® ÉIu-ùšÆé.YÇ×?ÛÌ?¾Æzbj –ñÆý/±¨88…ÏW^Éã}Oí (˧Ú?•KsíÂìø·±7Þc """"†Ô<{[tbM¥lÛœG5n*ö®£¶ÝFz¢ãÅ—ïdÁ&gÝÚßt;ƒãê†ü˜¬Dõ»±=ßͶ…[)uCÍÑ5,Øwl%vúÝy3=Cj3’%¸£ïLàùyª'©Ü»ˆ Žº?BðÛÎÇŸ§%¨+Ã. ©ûËɦyÛiôx¿Gîzá/Œ9„~™}èušaC""""bHÍ´'Ì~‰tŠ€-¹»ve#B8¸n_í9ö½I ÷`w#«.ØCÎñk ÄÓ¿K+Nšþkò£m¯xXV;k×up'yÕ}°ÚÂñK•y¥Ñ/Ù礆³wB&|g2¿þ0ýs®†â}ûOôFäMæáë'Ÿviçíä9{àÛ`X”©Ý2B™ô,""""B3î À3„Ôd_ÜûVs ¼€­ÛŠkï‹éB¬WãǶÝU%¿”˜ÙÀS–3aõ?v¶! ²„JÔ8J8vŸ`|¶¡->´òý%Oèl¸p;μØ1…T4rå1«Ýú‘Óh¶=`#ºK¦7ã.ÝÎæì]l®è–Þûiâ‹Éêw¢ï*¥ÐáŸú-b7U%E'‚‚Õ›ÌV_¬P{{Eå Çì»Vœ“'öÌxúÔ;¬s5ëŠßiô&Ïb¬Þs>Š‘ D3&ü:ÉfrÈaù’¥äUx‘˜Žgƒ“ãO¤'ä8ö0õQú 91$ÈUÈúù»Nl%,‘`°†%ÆRöTlàǤ¥yoNWî]Ìš’óôT³àŠ'ûq8* HH&Qבs¨ùmùÕx‡§3ð†»¸á¢0<›ú9ˆˆˆ\@ZXhŒAIÉÎ:DÑá2jªËYøÖÛ¬K»k—òÕ” 9Ž»ú…bqWp`ÅLf.ÛFv^)&{(1í.â²Á‰°™p¯â½×fvýµÄnû‘¬-{8TéCXë4ú]~ ‚5Cª)Ú¶€ióÖ±;§‡-¸½4(ƒ8Tf^c5dz°ü߯3íÀRÞ}f) ×?Ìì÷y{Q #¸‰t¿cÍú*öN~6Ärýý×ÑÎ'†”ä=d- 'µƒlSí“B°6Í‹.röÜ¥¬ÿàžš^DÒ ‘Ü6"€²Í3ùê³§É®~™ç®‰¯ÛÝ,{‹çM­2úAFY²èóñ|ÿêË„$<Ç‘–3lHDDDÎÖÜT¦ he·a¦ pS±{Ü…¶±>˜q°gÚ»|¼¬€àÔL÷ Æ}t+KNâ½G¹íöAD¸ËÙò¿OØàÛž‹2/§›#›5 —ðÕÛ©7†îAp4kïLÙgB™WFâY¸e ¦òá¾bn;˜3×`ö¢óè»ð›ù1_ïnË57õ#&ÈŸ€.Xš½å¤wð­}ZU9¬ÞR†WÛî´öpá(r=øZ¥”²dn.%N°k,4s5‡æ0~úaÂ~û. ©mðwh•ÃÚÇæ³ñPWD6û±~"""-F .ª*Ê(+«;"Xã  {s&oÃé‘HF;ÌäP±¿Š‹ïú}ÂkÞ»‹V0kYÞé7pÛˆd|LIþ‚7¾XÂì­½Óºvµsgnþý•$xt£KJ ï¾=—¹ ÐqpsçìÆ·éN  ¿ã_ã3}C·v¤Ñ¼‚ ô²€Å›Àà`ü=¤,$kÍ>Ê;´Ç¨<°š­å>¤t‹Å 3ö¶@0™CãÎãë,r®¸)Ù–Å¢¸~`ü‰ù+&;]î~·JÌX꺛Û^JV'Žø[ì¡øâÆåþµë¹°µ°PÀ¢_eQÛm±\tõp:˜7&ˆéIǰïÊC[ÉÅN·žñuÀ„o›^¤xoa˶#8ëB@p÷žÄyX½gXWúÄÎå{v“w¨”= ½:Ô€Z^±=踒e[PÕÑ¿ÑNË#„´T¯XÃþŠö´ó®äÀª­Tøv k´õKKæ¢<¿°n?y8Å;˜°÷­þ¾xh¢‹ˆˆÈy×ÂB€éW\I§Àc ž¾Á„…áÝ`¸°§ŸÖã 7ÕÔàM OƒÓñ˜}ô†Ê®c[ ñå¤Õ™lØ ¿˜òòÔ°ãóøkc%Ú˩ƿ‘~Š'¡i©ø/YÅšlíb°j»ÿN]‰Ô iÑÌxÙ½€ròË]àâåª8LöAQØßª ""òkha!ÀFHë$’BÏy‰¦1týtô_DDä×f˜V¦90‹Ÿ5]ý虄;o+K~ÜDeHµ·c®¬[¸pTAf×8|Ù¬Y°‚C–8†ôÃæãâ’ÌHþ=çS>ª¸˜îm‚1`Ûªelu¤rÍ•>˜(ûÉZL”`çνxÄÅîc< 똂ßò,Ù!Óie˜ÿŽ\ÐÌôº÷5þÒú&Ìú/oO/Ü@×Ñqó•)x+ˆˆˆüê ÔÌô"aèXn™ÁŒeË™¶¾ üBˆéþ[®Ô…¸ëB@ëa·ÐißlÎZM¾Ó‡ÐÖ=yù Ò[Y }oáî 9L]°‚kK¨²ú™Ôë÷!Ån:19¹Qž„¤w%nÝ|æ|>‘œ1÷s]Ríä_kxGÚù®`eY8];¡³¢ËÃHúˆy~Äiî÷Œåš~Í5 nöˆÁë_ŸîA"""òs™Ün÷Ï>ù^VV粞&å.^Å{¯NÆóš?rKjœ“ÜUȲwÿÁTóåÜw[†¬%""""¿–‰'gN@KPS°‘•!¶{;ôŸ‘óÄ@ڱʃ¬_³•Ýk~ä°5…kÛùëD‰""""rÞ(4îª#¬Ÿ7—m¦zú í|DDDDäüÑœ™8q¢zDäT.—‹êêêã?555M]’ˆˆÈYóññÁf³5uÍšB€ˆœÂl6cµZ±Z­M]Šˆˆˆœ:ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆœg¬zæZF~‘µM]‹ˆˆˆx4ugÅ]Âê÷_aÒðl{÷NÁç”…\f½Ï?¦ä€g 7>tml¿`›Žm|úÂg”\z/wtÉã³>cg«K¸ç®¾„XÀU²…é_LfYv9ÑÃäFÿ)¼òéf|/¾“{Eœ“¶rç¼9¯-wÜÚ»é¬PDDDD„–êqîZÁî²vtðmÐ*v±uuÎù٨هˆÄjìxšj(X;›eÙÞt¿ò*º%û`)'!¶¯`+¿´½î*ÚÈÌ…y´ò+£Úq„­K§“[•Ê¥ýbù%¹FDDDDZZðÃ^±›»ÊHM÷;©±]S¸…U¹[™),>ÇÛµÆ0øÆÛêÝàÆép‚w<ééÉDZ¿þŒþ}ÿs²9“gQ{X½tŽÒde÷¦{'ï_.Dš5W;f~Â'SV²ý@!æ Úöø-7ß8€xë¦þiT^Ç?^EŒP±Ž×ÆþEIÜñγ 1ƒ»˜Å»Wwõá¯ïÜKš·“¼•ßðÑ—óY¿ë0^a´»è ÆŒBŠÝ Îý|yÿüxñs<ú=/¿¿ÓÈ×xeT ®2¶OûˆO¦­d[N Á‰tr7ëD°¥®æª\9ž¯ç®c_QxÚ‰JÍdä-7Ð7Ɔ 7U—òõø¯˜³n…•Ø£:ÐÿšßsýÅQX?ù3Ô)""r޵¬àÛ†îaùÌ_±ƒÒ´Îõ†ÈÔP¸y5‡¼Û206›Ùë=Æ]Á3™¹lÙy¥˜ì¡Ä´»ˆËw&ÂV·g>›æNaþú½*õ 86™n}p[Gõaæ½õ‹#nâÁk"Øñá‹|µ` =»†èarKëõ¼ûÆ,üG?˜¶^ÇHѶL›·ŽÝ98lÄuèÍ AÄù˜êÖû6ëÒnãÚÀ¥|5edŽã®~1¤$ï!kI8©md›¢hŸR¯Á rq—±éãGxrÊa"z]ÅÃ"på,gÊÿÞâ¡M¹<÷ü5tìW°¥h1­Ì8s×°µ`/Ëw—3(Ä“c/Y;k°¥õ!Á»šÜiÏòàûë±¥ eä‰X¯bÊ·òø–£<ûÂÚZÜ”¬Ïß÷"´ë%tkgÇì.eýðÔô"’ä¶”mžÉWŸ=MvõËŒO»ÁDÛ²ë=ÀÁžiïòñ²‚S3Ü'÷Ñ­,]8‰wöå¶ÛcÉgùgoóÃn7‘ú04·ò½«˜7q=N ì”"¼I5ŽëæÊç¢qË¥Äùb*k¸\ G³&ðΔÝx&dye$ž…ÛY¶`*î+æ¶±ƒ‰1¸©Ø=ƒ  HîBÛX̸(/r=øZ¥”²dn.%N°k,\ \GóéÔCøe>Ês÷v­ øÈL~‰{^šÌgËߺö tâ–í,c`+ ¶¬ã¨O2)–íl_‘MU̹«ÙRn!%3Ÿ²õ¼ûÙz\©wðƒ ³ô§oú»Ü÷ÔdÆ/ÊÓ}k·_¶ÍÁU¯¾É°8& æàdÆO?LØoŸç©›’j‡áõË ¦lÏO®aãH±ä³+ÏŸ”+îå‘ߥâMmͽ[íã®÷·“ëp›¿ŠÕù&R|˜;{Û1z'ðñBÌ%ÜX¡l=ŸŸ©Î!:‹ƒˆˆœS-+`Â'¾;‰Ÿ³rk]215ùY“çKÊ•QØ6XÚ]´YË ðN¿ÛF$ãcèLzô¼ñÅfoíÅuþ ˜»ÛIH¿;¹u@žÝºäû/>XRÔh Vÿ`½-`ö" 8+Ô4 ŽÝ̳WüÜ>¦;A€.tLüŽ_Ìô ÜÚ±vÑŠýU\|×èîyüáö¶@0™CãÎÑë'Ò<9ö.g·;ˆA—w¨×Ãg" Ódøe‘µ2wF:Lbé²ýTöˆeçÊXÛßÍ•>ïñÒÆuv&cÝ´†’,~„ùAE~5¶ŽôNófÖ¦U,…•;kˆ½1…v>m°,XÅ–ÂAx/φֿ£C€ ×Þ<ʨfÍ‹¿ãêÆ6TJµ!Àĉ7.ÊóK;ávËI±xv¼5î¦l×¾üzk·í"»ÐLp\b­'ŽÙ›2¸û©;˜8a3Þ{–ïÞS`"— çú½‰ñ2á*;‹:Ýà­A""rµ¸ÞÄuKÆöŸÕl*Ìà‣¬_—½ÃH"¬pøørnª+*¨Á›@Ÿéf½¡²¤œ [X#ð·žü kñ Â(ÿ™UºE8¨aÇç/ðׯ°—SMmðôóê/x1,V??<ÈãHi P¯áí*#¯ ¼¼1ãEbŸ<­bõf[ÊÂÈLÀî•AãÉÚ´¯].¢¯ª¸[ãˆ~dÜ÷$WÇŸ:£Æd ÂüÚß-õ?#ÌxÙ½€ròË]à¢WÅa²¸ŠŠÀ·x!ÿxüm6' ç÷÷ÞE÷ÔhìP8ïQnûç‰uù% æö¿ æ¶Ê|ömÛÈêE3˜ôÍ«<‘ÿÞº'óÙÔ©Ï9ÇZ`¯Øn´õú„ÕòéÑn=ë üIëÆÉÇÒMxx{c¡ˆÂ '7,*(v€5Âo» ªJ(®rƒÍTo‘"~ÉuLV?¬x“2ò&úEœú2›<íxS{#“Y£}ÅØlqÝI` §nâº{:S{`7Åk`i‰™Än1Ø0áÕöb’Ìo2ëûrû¥“î‰ÅÜž®áN¾ÿn2a\Ú5 ÀÝ•¶ÖÙlÝ^E«>‰Ç¤» WòÉÛ3`ÈÝÜÔX5&ìɉàkfÍÛÏÐëâë>[lûÏc<>»5¿÷rW±­Ê‡׎b@¯c+gÛê\ €’¬WøÓûGéûèS\LëôLZwHÅw×ü{ç. kÒ‰8›:Oœ$""ò‹´È€-šn)>¬_»šÍe) L¯N㪸˜îm‚1`Ûªelu¤rÍ•>˜8å”B"°ýLùðßÜžÀíé/pÙ­/ò|ÌxÆO™ÎG Š 0š¶ƒïâ¡/!þØáqK0{EîÄvK¬›ëc%®GžsWcíØ›Øã3ymÄ|š×Â'òá·3øx~>•¶`»^Í#c†Ó#ÈÜð¸Á æ@zÝûiýfý—·§—a N ëèǸùʔڣõჹÿ¡<ÞùtÿýðG¼BI˼…WîöfÖ«ÿ`Ê3¹¨ïƒ<üh%O˜Æ¤wQá¶à–D1OpÕ u§ý=‹:EDDÎ1“ÛívÿÜgee‘‘‘q.ëiœ»„Õï¿Â¤ªÁüáÎ>´²UûùáX^LÿqwÓ?Ì890õ Þ[Í]Gµ× X>ƒ˶qàhø…“rCu!âØLÀê6Íù¡ö:%‚b“èÖ· S&°=ãîèQÍ‚ã× HÄF5gý“wVÆsËýÃim…šüÅüû”ëT‘·~Sldÿ᪬þD&u¥ßà>¤y6¸þ@¢®,""""çÝĉ[H‘sbâĉºþŒˆˆˆˆˆÑ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ(ˆˆˆˆˆŒB€ˆˆˆˆˆÁ´ÐëˆÈùär¹¨®®>þSSSÓÔ%‰ˆˆœ5l6|ý§(ˆÈ)Ìf3V««ÕÚÔ¥ˆˆˆÈy á@"""""£ """"b0 """""£ """"b0 """""£ """"b0 """""£ """"b0 """""£ """"b0 """""£ """"b0 """""£ """"b0 """""£ """"b0 """""£ """"b0 """""£ """"b0 """""£ """"b0 ÿ¯½û¯ª>?þ¾¹™$° {O!‚€ˆ"Zq þ´µÚZµUÜ­ÖU[ìÐkí·Z\¸7(  ˆ,E–DöÂÊ^÷÷ÈF¦†pÞ¯çÁ'¹ãœÏ9'O<ï3n$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€‰®èHªxàéEëxtÞ¾ÚžÏöÂâŠÒ1©Zl4mS«pcÇt.i^«¢‡#IÒQ3¤€‹?ýðKF|¹¾¢‡rÌÛVXÌ'ë·óÉú…|±9‡?œÜ¤¢‡$IÒQ1¤€{rá:à( Ÿ½‚uªrv£´ƒ>ïÙ•£ãÙIúaRÀ=Z»•›§~åÙIúòÆ`)à¾Ü’»ûëÿëÝÒø ’âx¼OËÝßÏڸ㠯{rá:>ß”ÍÌ‹:sFƒTàT‹fP“̹ø$žY¼žÑ»‚K’T¾ŒI»%Dû+ápê'ÆíþzKÁÁ/ñyxî*þѳ9±Q®Ï£U-6š?vkÊ?¾X]ÑC‘¤ã’ÿ‡’¤röå–\zÖM©èaTzg6L=äÙIÒ÷cHÒÿ@T¨¢GPùÕˆ9äÙIÒ÷cH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$I]Ñt|ÊÞº‰Gf­â™ÕÙdæ–G‹Õ¹òÄF\ß0Ä@„Õ+VóÄÖD®éJ=Kì§”ù3fÒaVÞ~‡iX£*=Ôá×'Õæ„Ø#˜dI6·=?‹'ëwbU¿Ëô&·“$oŒIå.oËjÎzi)S¢“Ò¡ ·¤DSœ›ËGK×rÇè ¼’q“»$Q…RV/_Åï–×âGíܹ<´X.îÞ„ !ˆDÈÎÍåóu›xæ³E¼øõvÆ^Ђ3âÿ—ów;IÒñÆTΊ3uSH᱋NàÚj¡ÝÏ\{B=úžÁU³¿f|‡ Š«ÀaV*±ôhV‡+«†öz¬ w.YL¯ñk2­KO«Nµ Ÿ$©²ñxޤòUZÌ×Ù¥X•îI¡}Ÿ‹ŠgpFc~Þ*™¸¢<þþÒÇt_P9«éúø$ú-/ÞùºH13ç/¦Ï¨iÄ?6‰Ä3é7ys wM§$‡ûžŸDó;˜·h!­ÿ3‰6³rÙùt)+—/ç‚W§“òØ$¢ž˜N¯‰«™šùáÖÁ"ŠfÍ›óÏFQlZ²Šò¿}üh–ÿ;ÞSúÛ)0ëZ’Ž?F€¤òK·:±°c5W}¼š÷·S²×ÓUk7ä?}3 )žŸœÝ•›Ç@Bm^½ädž© 3yÊl2>ZÇšêuøsßVü¡UË,¦ÓkËø´hÏ´²V/嬷‘Ö¨.—׉&L„%óå×Õà IDATçÑzÌr>ŽIã®>­y¤c2-¥ç˘^´ÿ`+¹P =[$CÉÞßRGµü‡yOÉ¡¶SÀÖµ$g¼HR9 Ó£G)ú’ß,\ÊY —’”LßôêôK¯ÎÀF)´Ž !R’âi‚¨UK ~4”doäŽyy¤¶èÀôÓÓH Ôå²Úóiþþ*î\žÎø¦;ç´e} ¿¾$ƒÛÒ„€HAwOßBI½–ÌøQ=šDÔahz&mßZÅ-KÒù¨máŠZ5ÿIIñ¤°eù"[¿ü­ö}™ÞÓöÀíT¶÷_ëZ’Ž'ž Tî¢b“ùUÿ®l½êd¦Õ’;›$·a-·|0—6ONãô™[øæWŒdoÞÌgÄriÇ”]°S­éœaÖò\r¿}°v:—§î €¼­›˜\¢ï 5i¼×o·”:õ¸<æ,Ï!簼ǂG·üG»Î‚¼®%éxà™Iå,BAI„PT±q to’@÷&õø-²6oâŸÓ3¹oæ®­q2/79ð8D~~…ÄÐ8~¿ç¢bhÛsŠ)"€„*±ì}ÛAqA[ˆ0ö½©?‘XD>PµÜ–µâeg糕š&„ʶü‘}?O´¬ëlA\×’t<1$•«Â-+è8j9)§õà“Ö±{í †HM«ÉÝ}Š=r1¯È#¿ÉŸRC,¬(ˆ{íá—³ª’j„wÿ⊠í{ãq8&–db8¯Gî©qà®iTt©å°ŒÇŒHS–ì€p R„·”aùCûîÒ—u-ÛïñÀ­kI:Îx9¤r›”Bx˜1k%“ ö6¦o¶²¨›Cì>Ï씘šÆ‰0jÞV¶ìõü7«WóZ~ˆÎ«Påó®R=•“£‹˜¶¡”ôꉴÝõ¯U\>OL[ƶDŽ£_z¥,]²”_®(¥f‹ô‹?ºå?Ò÷DŽò}’¤c‹g$•¯˜jÜJ Þž°šÓžÙÊ…­ÓèZ-ŽÄÒ"¾þf3Ï.ÙÎ7Uëñ|Ë¢)%**y;»jñu«Ò!¹¶_ÉióçqJi#nh”@éÖMümÖ7lOiÀ›Æ¦ø ³ŧò‡ÎÉœ4c.½ ñ‹ñ„²w0zÑjÞ.¨Å+}£+éŽi!S–¬#!açw¹¹yÌ]¿‰gWæQ’RŸq=vý€2-ÿ¾eV¶u9p;·ëZ’‚ÁTÎB4lÕŽÌÔ<<{5/µš×sKˆ„chP-‘³»µç¶ö5h Eë–u8%sw¿7Yçtã͆ÑôíuŸ¦~Å­_¬eØ’BBUªÐ­]+^é^—N1°ÏgŽî#Ì ]:1¿Ú×Ü8{-·,. '&ŽÎ óF÷† ª:Ôq…¼úi&¯îþ>LzZ2žØ˜ßœT›N±{?ìò°îʲÎBÝNÇ纖¤`E"‘£þ«.3fÌ ##£<Ç#ézlÒî¯#×õ©°qT&‡[g¡Ç&¹.ˉëR’ÊߨQ£<[+I’$ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ Iÿ¥Gý·Øõ­MùET‹®èaHÒqɤrÖºz¦¬ÛZÑèôƮ̢K­äІ$—ŒI»e•TôŽy+³ów}¨£Ô·œÐ€§,¥°´ô‡Öqg[a1¿ž¾Œ;¦WôP$é¸dH׺z•Ý__;9“¬‚¢ ͱmCn!×LÊÜýý¡ŽR_Õ¶.j$Ñõ•9Œ[•E~‰1PV9E%¼õõ&:¿<›+ZÕáìFi=$I:.y±¥p·œÐ€ŸMZ Às™x.sC¨ò8ÔQêðÔi­yzÑ:~ýÉ2ægåPäMeŽ¢sÍ$†wkÂ%ÍkUôp$é¸eHwUÛºL]¿_®¯è¡T*wžÔè;R‡€Ÿ¶©ËOÛÔýá%IRRÀ}{ÔºWÝj<:oG­¿Ã·G©oì˜îQjIR¥fHò¨µ$IãÁ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀ’$IRÀDWô)²ïºŠdä¹øT´êΠË/¦wãDB?øà$I’¤Ê«rž ÈÏbÕÜÑÉo†=Âô-¥ûLkŸñ„ªÐâôséV{דq-è3è ZWK¡ã‰Èý‚)+ v>_º•Ÿì,†¸Nýi—dH’$éû«)¦ ?ŸüüËjsîïŸä?ÿ|”ÿ>q§V¶Náé7—QÈ!ÆÓ4V/f@ó]/¥uáüKϦmr˜¤vgpbÀv>Ÿ¾šB ’É´eñt:½-‰6€$I’ÊAå¸hó~{å˜;‹ÏjD _î~(¡û Üúãwï0çÎþ„Ì€:œ}ùé4ŠUhvÖôýkFg°èÓU¶Û3Ùêý®àì–É„ô>C¹àÝOyf|=}!K6.`@8ެO^åÙEÄíêœ9l¸¨Ý!Ç¿‘9”؆þ'%0cZ›gÎdýfÔøj*‹wÖ §·®â§ I’$©\TŽØ_L Ú÷æ’«.áäšaÈßóTj“ZÄíÞ[Ž¿m;;?€'…†Õ÷ZܘT¥Y»y{HOõ†©;/ÍW£~ZV•ÉÙ̦Ù;/YÉ”Ñ+9Àöõì(ÞûŽç;„iÝ¿ ‰Ó>&gÃtfó#ÚL_@>P¥óé´ò4€$I’ÊI刀çò—^A“˜Ã¿4Úëˆyˆ¸ªÉDÅleå–bz$ïšHÑVnÙùe|J"áÇ÷ز2‹"jP²5›wÞ]JJ£zµx jâ/\~ð1å/`üAÇóÝš÷'#ùc&îXÍ´™óÙ6wH—Ó[R¥ŒÓ$I’§rÜð=$4éAË0ÀzF?;•ùˆä²tÌHÆnˆ£m†Äíõž-žaLf6%‘|VMz–×Ví|¼Y÷v4ïÜbçk¿ù”)_çí¼— t+s_z„¿üå/üóõLr÷¹Áà;”S²÷kšÑ¯[ _¿ùn’»Ò¯¹€*I’¤òS9Î|Q©=¸ò¢÷ùõ‹_‘÷Ù¹yèâÂÅì<¸O\û!ü¸sUB{½©èKž¿ó'<¿÷„ÒqeD_Êàæsx~ézÞºój¦ÖK£tóZ² ê󣥓úú;F&±fëßæ¯Îcȵ—Ó55 ÄÑä´¤ŽCÖŽ5äU3úÑÌ$IR9:îÏŠ£Éàßó¯».ã”VõH‰+¦ $žÔô¶ôýÉïø×Ý©·ß%=͆^Çy'6 %B‰uh}ÚÏùóð¡´JALCÎûÝ?¸í‚®4­MÖÚµl!•Æ]Ïåú?çŠÃÞÀCÃWpF³dB°ú³ÏX•¿çt@\ã>ô¬ñíw)œ|ZSâËwH’$)àB‘H¤¬¯`ÆŒddd”çx*Î^,¬å¯þËz§TЧñ²lä ÜþÎ&¨>€á^M˸ÿK’$I*‹Q£FàL@eSšÃºµ;oRNíчÆ€$I’ÊÙqO@åQÄê1ÿäßïÆâµ@cžÙ˜ØŠ–$I’Ž;FÀ1#Bᦥ,^›GTÕ¦ô¾|ë¹y$I’Tþ¼'@’$I ï $I’È$I’Æ$I’Æ$I’Æ$I’Æ$I’Æ$I’Æ$I’Æ$I’&ú‡žaè±Ißùü§]ªü0‘$I’*™ŒŒŒr™Žg$I’¤€ùÁÏNz§ò©I’$Iç™I’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`ŒI’$)`¢+zG¤4‡ãŸæÍq³Y¾náêMiÆÎ?窅¢U¼wûÍÌÈx€ŸÔÄk¯Lbù–bâku Ûÿ»–s»Õªd ,I’$•¿Ês& ’MæÈÛxxä'·ùýâZtŠbþKðï7—S´ç…l›ùO¼“C»Kná7ü˜ŽáyLzä!¦¬/©À$I’Ž •æÀxéÆycüFÒÎþ#¿ÒœX€^ÔɹŽÇÇaÕ9×ÑtWÒoJ圿 £[Z€æ©kùò¾É,ÙXHŸ: ¶ ’$IÒ± ’D@„ì%3XC=ÎéÛxg„’isÍ?¸7;ŠäX x×Ã-ΠCjx÷»ÃÉ5I Biä¶$I’t ª$PJþ–l ™´¤ð>Ï„RIÛïà~Lr"áÐ7:I’$©2©$÷D—ä²-¯tŸgJó6²vÕzrŠ÷~Ô$I’¥’D@ˆÄæ¨Á*¦}´Š=ûûù,é.þx×Yšçµ>’$IRYT’Ë ºþÎí>–§Þ¸‡GsÓ­e E_Of̸-Ôx ­’BP|øéH’$IAWi"€¨:]÷7~ÙðIÞùð5FË!¦zÚ^rçlM¼WI’$IeŠD"G}ÍŒ3ÈÈÈ8²>6é;Ÿ_suŸ£Ž$I’t\«{ø×ΨQ£*Ë=’$I’Ê‹ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$Œ I’$LtE`©¥ù=I’$é_.SñL€$I’0?ø™€Èu}~èYJ’$IÚ‹g$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€1$I’¤€9®" tÓXn|÷ÏÌ=ô‹rgóÀŃ|Ãk¬).Ϲ—°yöÛ¼ôÎgd•ÁÛÊ:ž]¯»ùõÉä%I’¤ýWP&ádšthIÛVµˆ •ç„‹Ù<ûm^yçs¶É^úÿl<’$IÒÁEWô~pq-z÷ðŠÅÇÚx$I’tÜ«\PšÃÒñÏð̘Ù,Y³•¨êé´ìz.?¾¼/öF/ÉYÊûÿz•1³³6?™ôÖÝ8ÿ§C9µA<¡¢U¼|ÓM¼Õøþ{kG(bÓì×yúåÉÌ[¶‘¼øZ´êqC‡ urÔîy/yÿižy6™kwÚ”.†ðãA'ÊÞ½ízF¬Í—¡Ã#¹·k…ë§óêÈWøð‹•l-ˆ&¹^;ú\|—ö¬G,ÀAÆ)\ϧ/>ÉËS°rk uZv¦ÿ ^$I’¤rQy" ’÷sϘÔév>—ªCéÚ™Œyó1n]¸ŽÿxÍv¾…OüeõûpÁ~TÝþ%^ŸÞ²”­}€Aµ÷Ÿp1ëÞÎ-ÿG\û³¸ðš¦ÄnœÃ˜7žâ·_nføŸ†Ò2.‡yOÞÎýc·Ñüô ¹ú‚jä,Ï+/<Àêâ‡xðâô½ó¯Töþ6ï$n½÷"ZÖI ’·ˆ÷≮¢¶ôt-“¶±è£wyçïà ×û+C›Æ¸œ%ë÷àÍ<1/B“ÞçñÓ6ÉìX8—þ4…B áÿz=K’$é¸Wi" tó4ž}oI½îäÁ:“èK¯á—y›fžÍoÛìzqòYÜó»ŸÐ2 7½»ÔàŽ›GñÚ«‹8ãúêûL7’3_˜GiÛkøÓÝý©èégØýo3rêYÜ×n#Çn¤Ö¹äþ+šÐ;ƒôœëøã{cX6è:ZרMÍÄhˆN¢fÝ:¤ÆBÑò9|–¢í-·ñ‹îÉ„€¾Ý›SmÄ¢vä!–ýoÈÏ|çRÿ¢‡øý%wΫßiœXuw¾»é·‚%I’•æÆàü3ù:RžÛí €ÕN8‡Œ¤–Î^MÁ®GÓœA³ø=ïiÐA­!7s>÷ûžÂ5³XMûsºS3¼gº‰­Ï¤wÍËf­dSæ –S~ýv프’9ñúðØŸ.£ÉAèDWoN㸠G<Â3cç°<«ªwáò›†qÙ U(bã ÙAKÎëßh¯yÅÓlÀ@Ù*“$I’ª’œ ˆP˜M1IÔJÞoÈá$j%A^VÎîkæ«Ö©JxïׄâIMK€uÛÉ/Ý÷í¥9›È¡˜Ïÿü.:ج«ocÛæl ™ÚÉûL•pB*µ=êPµ ®¿ÿF=ÿãžÎ;O@(¥)§Ç¥t'=~ÿ (%[>Ä7!-aßçÂɵ© ì8ôì$I’¤2©$"6)‰h6ñMv 콋_šÃ¦ˆo’@[رa%$íyU$—MßäAbM÷;÷•BÓŒìúïŽsýÏïä¥åE„âRiÔ¡çý|—5…_-cë÷MÍöí¨F&o~°’Â=KÀŠ ï±âèWŸ$I’´[%9á§0dÀ›Ü÷þpî*ÌÀkSºvï¾:¼zƒzru¢rv¾6nû»ÜwwôoKòö…Lx}"k3¸qPbY»ÏtCɸô‚¦Üþâï¸;ûÎìT6-e΄1ÌÌéÎ-¿H"¶Ú†ž2–‡^½‡ûw æ´6).›ÌKc·PçG·Ð1)„ˆŠŽ‚íKù|î"b[·¢~Ã6TÛö¯<ô(áó3¨ÞÊòSyo¤_Ø‘´0°ßåIq-Îã’“yü¥;¹gÓôk]•‹'ðÆ„­$þ kZ’$IÇ»ð}÷ÝwßѾyÍš5Ô¯_¿‡óB±ÔêÔ›ÎÕ¶²hÆ>üà#æ®Ð ×Pî¸eͪ„ˆä~Åc¾æÄ[o"cË &ŽŸn§Zdz¹öΫè– ¥ÛY0v,‹SzsnÚÄMJ›SéQ/EŸLâƒq“ø4s3ñmÄÏn¾‚“kD Å“žÑ‡6±k™;mã&LaÁ7U8áüë6¸ÕÂQ$$æ²è“™4ñS²ÚŸE¯­èÜ2–¬/§3郉|4c+sÓèzþuüê‚Ö$Eqàx¢’hzJO­â‹“ùðãùlŒnÎÙ¿Jú⩬oqg´Jª<§p$I’tL™?>¡H$9üKnÆŒddd”ç˜þ÷úÇÂ$I’¤`5jT(—RrÔÙ#I’$U~Š€ÒœUÌôŸl€Ä´*û~Œ¨$I’•æÆàòP°ø9þüŸ¹Ti=«ÏmÂ!þÆ—$I’t\ T$tþ Ï¿ZÑ£$I’*V .’$I’dH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$IcH’$I]ÑØ_~~~EA’$I:&ÅÇÇ—Ët< I’$Ì1w& ¼êF’$IÒÁy&@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I #@’$I # Ü•°yöÛ¼ôÎgd•ìz(w6\<˜Á7¼Æšâ Ü÷på:ÞÛM’$é@F@¹+fóì·yåÏÙòíÎr8™&ZÒ¶U-âB:¸ïá Ëu¼;.¶›$IÒ¢+z×’¡w¯èQèH¹Ý$IÒq*‰D"Gûæ3f‘‘Qžãùn¥9,ÿ ÏŒ™Í’5[‰ªžNË®çòãËûÒ8!DiÖ~sÍs4øõí´šý*ï͘ÏÊܪ4lÛ“‹®¾”nubÙy@·ˆM³_çé—'3oÙFòâkѪÇ9 :€ÖÉQP´Š—oº™z>Èí5ßå¡ÿN%táßxxp:Ñ…ë˜öòH^ø+·BL2õÚöâÂ+‡pjÝ­Œ¾ízF¬üvÀ!:Ü1’{;mæå›nâ­Æ÷ðß[;’°kú“º=ÀÍõ&ñÔ‹“ÈÌ*&¡vú ¹–!=jP²•yo=Ésã>cÙ–ê·ëÁ ‹ÛðÑ=ÿ€ÛFro× ×OçÕ‘¯ðá+ÙZMr½vô¹ø*.íYXŠXñÂÜòV-nüϽôJùöpv>‹þ}wOiͯÿs]’øîé”là݃-W×*‡_—ÅkxíæaLèr'W&Làµ?竬êµïËk/ Ög#yüOÉܘOrÃ\|Ã/ШO‡_ÃC™'sÏÿ £c·ó-bùó7rëUøÉ£âœ:áï±-ëSúëŽ]ïÝk»•ág²n[I’¤ 2jÔ(Â÷Ýwß}G;5kÖP¿~ýrÒwˆä°pÄíÜõÒ|Âí2øÜ¾´OÛÎç£ßâ™ÅœØ§©E_3á©dÎýˆY;šrÚ9èÑ,†USÆ2zl&Õ{ö¢YR)ëÞÎMLdKýS¹à‚3éR¯€ùï½ÃÛ3 éÔ·#iQÛY0ö}æo]ô‰Ë©Þ¹Ý»u¡MmÈñþðîzž~1ƒô MhÖúïZD×3»Ñ>£M¶Leú¶îÜ:üV6K!!´cDz8¥7çö¨MLéÎé¶æKf,®B¯‹/åÜžÍ)]8Žñã‘Üë4Z&e3û±[ùý;«©ÕóB.<óÒ¶Lã…¦óMI!5{žOïOT³ oIDATÔ¥”¶ !èÚ”¢Y3ytiC.¿ó—œQ+ ´§Ú²éÜ5å+6…¨Ûî NŒ›ÍœI_‘ס= @áʘº)†®èBjTçˆmY´üî»ýo(ËÏà=Ý¿mÏ©›€$IREª4‡$óWÌäëHuzl·kç DµÎ!#©„¥³WS°ëÑ:gœMëÄ=»p± ûq^Kض`kVÌbAn4íÏéNÍðžé$¶>“Þ5#,›µj÷th1Þß=ˆ®ÇYwü™ßï €’¼,V|ñ㦭"”á2…ZžA״݃ œ\“D"”FJÙöåLÖÒ„³ú¦ï¹|$”Lû$;œêÍiaáˆGxfì–g@õ.\~Ó0.;¡êÎqǤsJ·4ŠNbqNÈcÉ„YdWëÆé-Ê>ƒ(\Söun|vM)OJµ¨Ý‰¶©ß¾1LbZ"DJ!¡*­9½s9s&±, €“¦±9á$îÓ‘Ìÿmy4Ë|$?ƒ‡Þ¶‡X™’$I? Jr& Bav6Å$Q+y¿!‡“¨•yY9|û¡5)õ«Þû5¡Òj&À†Ílß±…ŠùüÏ?ᢃͪz6…Ô 6¥:ñûì FÈYö!/¿ú!s3—±zk© ›Ñ öèZ*¶j"ÑÝÃ.!gSDÕ¦F•}§N®IÒ·‹U-ƒëᅥQϿŸ'†óÎJiJÆiçqéÝI±4èÙÔw'013—“Z/eÂìRûô£iÜ‘Lç@¥9›¿.#µˆŠ‰>°8Ã1„U¡DZÞ™*ŸÌfÒ×ù´k¶’IŸd‘Üm mv^™æˆmyäË\ÖŸÁj;çwÈm+I’Tñ*I„ˆMJ"šM|“]{ïâ—æ°)â›$E69›r(¥êžWEòÙš•ñÕH¬!ž$2†ÝÃEcœSlu’ÈÚùuxßÝÖÒ¬)üý·ÿfQóó¸ê†kéÒ¶>ÉѰuÒ\ýèÑ-×ÁE_-Jw°9·ö ’Ü,r÷z]RóþüìÞþ\]ÅÊÌ|6uo½þWîκ—Ç~Ù ¶AONNͤÉKØšÀœÜšœÑ·±G8F™røuÚz4+€*-O§KâTfMZÆÖ¨˜¾5Þg6ß=–2ÍÿÛòÈ—¹¬?ƒ{^/I’t¬ª4—Å5ìB²˜òÞBrv_RaûÜÑLßEÓ“ÒÙu`›Uc'°¼`Ï{‹ÖLäÍE[w AãδŒÍfñ’BÒê§“ž¾ó_½¤ |ð쳌_SrÈ•R¸n™…UèzÉ`úvL'9:¥ÛÈülÝA_ôW~„©Þ¦µXÆû­ÝsKA$‡/Çʶ]Sß1ãa®ÿù¼´¼ˆP\*:ô⼟㲦°ã«elýöÔH\CzuM!ï³1Œ~gyuzÓ;ýÛ‹ŒŽ`:û-Wlý£_—e’ЂÓ3’Ù1k,Fʶ:ý8­Ñžý£Ÿÿ‘/óÎÕXöŸAI’¤cY%9á§0dÀ›Ü÷þpî*ÌÀkSºvï¾:¼zƒzru¢òv½ø›7¹÷ž\pzk’³3™øúxVD·æÊ [“\Â¥4åöÇÝÙpf§Ú°i)s&ŒafNwnùE¡]»Ùû‹©Ñ’ú¡ùäéÇ©}ZêÆl%ó“±L\” ¬aê„94;«=QÑQ°})ŸÏ]DlëV4Œ?òåi8!'ço/ü–ßo½>-ª°å‹÷xûóDÈBTi؆j۞╇%|~õÃ[Y¾`*ï-ƒô ;²ç’ô8Ú•”±ãy÷ ¨Y/êí¹Ñ ŒÓ ¸\Éʰ.wùÂïO³~'SmâŒúÿøTêïõùš¡2Íÿ`Û²ŒË¼ßMeú$ç{,¯$IÒ£ÒD¡DÚÿôÏü1}$#ÇŒåé·AJ}Zö¿–[/?mçß Øm®ÿ}½ÀÏ}Èú‚ª¤·ȰŸ á”zÑ@4/|€¿ÕÅSoŒcÄä, âRiÚù"nz]«GòÓ|µûsÓ­›ø¿gÇñÚS_£)í{]ÉÃ×'ðÁ_ÿΘÑãYzj'ºö<ֽʋz¯îúw´?ŠåJå”aûÒã¼0ñyþ5¾*MOÀm¿«ËK7>B\tˆp3¹íÎ|F<ÿ>oýßTò"ak5§ëлò£&ì}L\ãÞt©6ž¶5¤_:ûlø²M'†úû/׉ ‡_—ÅG±ì{»ÉitKù€±ÛZ2 {­}ïõ îè·å¬»ÝÊð3x¨ùI’$K*× ;ŒÒ¬ üæçÿ&îÖ‘ü®[bEçû‰QPPJTl1{]ÓR²þmnýÕ;´þ/®nqÐ]Õƒ+ÙȘ;®ã©¨«yìÁ»>NS’$IA3jÔ¨ÊsO@Д¬ÍC‡ðÛ6íuUJ ßÌú˜Uá´­udw¶dÃ4>X¢å™]¨aH’$Zå¹(`µ{2èÄWø×ÓóLô%t«bÓ‚q<7êkªö¹›ŽUËöé3‘¼åL8‹y_ee|në’fùI’$œp¬ נϰ(}aoŒ|ws"T©‘N‹¿âÊ!I*ã'PFòWóñË/2;Ô’snú9]ªùÑ•’$IAw\Ý I’$é»yO€$I’@F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0F€$I’0ÿš—×g9["IEND®B`‚083_director_import_modifier_sid.png000066400000000000000000000752341516513262500357640ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/08_import-and-sync‰PNG  IHDRýuJ%O¡sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwxTeÞÆñïdÒ{Bz$@!¡š!´º*HQ)Öµ¢¯kwm¸®QÔU×ŽŠº(*¢ ÒC‘Þ{ï’Òë$“̼$@¢ ãý¹.¼ÌÌ)¿3sÎÌ}žóœg ¼·ÐŠˆˆˆˆˆØ,»†.@DDDDD..…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãìºë˜Þ ]‚œ…áýE ]‚ˆˆˆ\jé±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆ³oèDDäò`tòàÆ¶¡ÜéMG/GÜ­¤å’r ƒw·gkyCW("Òð|¹²2‹ï²+±Öñ¼oP ýʳ˜šS÷óKƒ·ô{6Ç4&‘iáÆ†.¥ „5 ç…v¾„4ø+'§±æ²ðŸÃ6l#Ç­¦°Î£¨’ÌÙO0lØ0†|M¥r%ëxñ†a<òs•Õÿ?ìÁ8ZQ½¶œ5|öÔí 6Œ.È¡xÓëŒ6Œ1“bþ“«¶=¢;$`ÓûŒæ¿wcUrSú»_¢ƒÎ± sïëud3btœW³#,²knëÄä.A ðs¾¼œãFš4áî®mØrkG^mꨖ$ùKóŽdÞÖLÏãþF µž÷ ‰"åúÖ|74އšœùüŤÏçßÅŽ°ˆpÆFdòó¶Ò, ]Ô¥|ó\¶t¡»W­C©2‹µ)û/ÎJDÆGcö ÀÉPɱß&3sWÞó ý;zbŸÓŒ¸V…¸97üÙv£eæ—Õ˜Vd ØÙÛèÏý­¢˜ê•ßìb^ÙE.ÁjfCjŽÅ&J.òª.ÂZİîÊ(å»{xfk.{ÍUgÖÎn jÛœÿvöåÉk:á?sw,§²«¹Ô¼ƒ#™7¨ì;oÆ_?náõãU-ú¾!Q¤ jJ{ààÛCâ°LÛÊ;g¹"p¡)ô‹mqkŠoñVænΧ[¢÷igЕÇW“rÀH@ˆ=™Yx½NÑŒ~î•X(/.÷X{u Ê ð¾§^¾á¯ØÖT°f_ŸçÖ8£Þz”ɹÙÖ-ˆgš eO9õ|Û\À“?¯¿˜k¸¬Ø{ñe¿,Œýq3/«8íõ7›Š™ºz ‹Òš³äº0îHŽfÎäm|Wr)/Z‹ˆ44ÎNøÔlÕ³?ü·ò©C8ó®«ü'í p4`€Kú_ƒ£+ÏŒì;\×¹ «oNÄroOv\ÛœÁî´‹aùè+°ŽI"ëÆXð«º4bt fÍ}=™ÔÌ‹»“Ú²ù¶$¬w÷`Ë5Íîew*üìé׊E#z`Ó›âÛº’L;ÇêçnükToö&xß:–÷ôfGgWí\xèÆDV´q·0ÖÜÝ›”ˆ³Ÿ3¹xùóòÕ]H¿»7Ö1½ÈÙ–7ZºâRs¢óÕbïÅÇ·÷æpœk.; %iczðn€ÝÙë­^~×ø~Ùó˜ÞÝÚ‰)kwM²£iDÓ†u#oLo,wucIŸ0z:_Ê Nw;’c lŸ»ÜÓ’a%ÇV-à[gúG»>¥˜½s>`ì?îdİaŒºë!^øxKO‚Öò V~ù2Ü=’a7ÜÊϾÍômù§Z3ÍGøîaŒš°™Rk!ËŸÁc?fBÑ"žUսǜ1ƒ‡‡ÝÈKëj¶›ÉZ÷-¯?9†[†cøÍcxöƒ™ì,´ÔXîp˜²—Ã)ÿáÁÃùÇÔT*°Rž±‚¯Ç?£†1lØMÜþà‹|±4 ÛëVmaßáb ÜׇsíóçÜŸzM/¬¥¿cÍåÛѾ[7¬c:ó°—áä1U4ÀÓœu¹vΗàe» ìèØ.‚>F+K–lg\­ÀŠ•¬Ôý ]U ~¼ØÆ§K\©ˆHò’qp‰3ÓØWóa{oÆK`×àft¨™¿¬EŒ›±™çÒÏö¹zá5¾Ð_-¢M,„šødévF®ÉÇ'<œGvå·v~\µƒë§“êÀ»ýBhyb+  êמwB*˜±~ÿ·>SH8ßÝÏ=žÀž¤+:±ºW0¡9<±pÏì*%ªM+6¢k/bß°ÌJô"ûP:_eTPi11é×5Ü´× ¥Çöí*n9Ñy»ƒ£7onÃÓAf~Ù°‡»–á—r/IŽç_þ'Š­-õqF½ú%vfe¢?Ni©<²‹ÁµÝÚ2«“{õɇ-ãâÙyu‰æl^^´“7غK¯¢ÛeLj0xŸ‡ÝÎy¬Ë©qUd°rÁ<ºô§¥ké­ÅlŸôÿüd9á}¹yÌF$slîû<öÔ×ì1Y¡2ƒ¹ãaÂŒ­ãqÇÝ7’p˜oÇÀÖºŽTƒy‹'ûû€Kþ1á¿<ÞÝ«Žƒ­‚ôÙ¯ðà¸ïÙîÒ‰¡÷ÜÏW5'Ág<ûìdv›NœtX)Üü/}ºŽ}Ijå¡t“ƾÁ´îtôwî»c0\wñó^á»ý¶û==Ý J*Nžh±ÏŸw6³h[.¥N¾ÜPã„ÝèÆ¨hg,éGù¾ ®¶–ó,×XÎü}%àÝ„+\«¾³·/ÝÜäo_ÕèààÎ`Åi™l¸\nê0º28 ÌÙ¼º×DÝŸx'Xعã0K¬ÝÜ—°Fûí""r±XI?¸‡ÄYéœÖ™ØàH“Ó&+âÕé›x6Í|É?4æî=æLFÎÚÇârà`!N~L (æÉ_vòa¡È#Óße-=3rò¬ÊÛ’Aßi»XXƧJY{c$/tôäëµnŒw!gϺÍÏ&Û Î×ÇâØ;0œW"RI®~—|‚Œ¼úíj^¯ÑÏ*¯ÈÄ¡2+XÌÊ/å,™'O_®rƒÅs¶q÷>3Vàó}dö ¤ÂÙˆ îç¯å@ý_®Úõ:x…óFœ37®£ïòBŠve±Ý©+3âCé´qËì¼y±›Æ´Ý$üœÆ @ÿKfû pÞh™J¯íe—Yß\žqÉ´u|yk³è;0#P‘±‚EG=I¸·9.+NMmÉ^ÎW³Žážø4ã숇 ‰-_ç×gðõš¿ñ„ß4¦l)'tø^º1¢ª³__:x>ÄÓ¿ÔÕOÈgß ü=Àè†_pMœ 2ÿô©¬Å[˜òõ,±÷0þ¹dŒ½éÿ1½0ƒ/–]Å‹½ª¦-Þmâú7ßePS' €ùàÏlÈ1ûèãÜÛÝЧ{ ¼&-ŮЄÇKzsÐ…cÀÝÙ—ªAƒÑÈÀ@^îÓ×Ê\þ{ Œ ªÎÚjïó'ßóîÏIûÒ˜mnÂÕ­ÜñHÍ£piÈMîæ-Ï&­ŽÌop:ÿqrå¡lu eˆ¿=‹*ö!¬¼€¥O"\q=O¥·/=­,ß]@þ™«iœŒN´wróØuŽƒÑ‘hoGœŒV™ ÑÛ^þ¹¸•›Ù—WF±zúˆÈ_†•ô»IœK¯ &òŒ§‹?cÏ\âÀ¸¥ßœ•ͦ –V ¥(Èå·âS­Ÿ¹E€á´p³w[*ËjÜèWš“ÎkêC›€&t œo6çU‡ì*™GRù±Ì@çWN6Kå«?8”Ryq!›ÌÔ³5âšÐÞÍ%Ù<1o;Ï©z“Ý›üŽZê£V½¾~´£„‰;Š«?ff-XCä÷X_.Þ~$9ZX¸é8kìyyi|U#ܨÕæ²`ðhÕíØ?5Ç+̤-[Dšw7úF9Ÿ6­éÐX}¸âê6ÕÀ€W»kHp¯dïºÙ¼B¢œÜìT—ƒ3Í^MøŸ¨³üèZ¶•ØwMwüO^eÀ-fIþVö¯=ÂÉ]¹åÕ$…;Ü×í}Zádeû¤wørÎzæ”Ogn~ø!F¶ó¼L?€3_ßÌÛ{’y{OŽÝ’ÀÊÍèg(`œ|QTã`©µÏ×gv-ËçãÕø4 ¢“€‘¶­ü 3góΑºï¨ÏrùYÌ-µ#!Ê 7ìéÔÌSZ*o©À/ć£_šRÀ7æK:DÛŸub_:WÍV«ÝÚ±iX,£]‡&|6´#ï6µÇz9m¬ˆÈa¥ÔTN^]Ÿd–Yä{ Ñ¶ôWZ¬g~[,çêðX^ùéÓX+9RT^N¹8àˆ™ƒ¦ZK¶˜9hO7{ªç.-)§è¾#–Ò,nŸ¾›—º‡so¯xé–’B~Úy„g×e²Ã ÎÎõ¯å u$ºÓë5àåæ˜Ù_kùæ2V/ÖÓÉ ìpUϺÏ6‹p ê½å„Á•˜þqy9…•Ç®b°KËÀ·ÇCD8Á‘“Z)/*¢wF+ë¹?WKçç²®iåA 5¡®eüokÁYOÞê·Ü Öï) ¬EÃŽ&&g˜É6g±•æ ñ¢ÈßÀÎ ¹½œ†ú­,aúár‹mÂQNÌßQvÖÏ%«¹ˆ×gn!xH<Ã3wpåÊ5æñ c¨³•õKêÝ*u®vT¿È6컵#/øÙa1—±9õãoçéãÐÄß@;(ΩO-UW;¼=jt+q w¬îç©/ëX{qã®Vn5Fþ1Ò­[G¶ÜÐ’^ŽP’›Ãª zÚ‘š[Ìöê»Êœ¹«G÷ø.y³ Æ¥%ý»x¶h+ç/%Ó?‘¤¦gk§¦‰$‡¥³¶×èwl¥`Ó¯¬,´#ªSaqmðb7?Í?\cdœ2¥ÌâП(Ñ1´#ÑŽEìÚSN“Ð0ªþ…¸cþW_1ïhåYP+…«ßàþ»ŸæÛƒf N¾4‹OdðÝ12 ÷í'ïòºエ÷þ\^ÀÄfü"B¸³­ùé|š}ö=½¾ËÍ=vŒÕV7îjHTY>)…*Jò™Y`G¯váôw4ñÓ!Óe6ºR%«6fµÕŽ>½byØïÜ?$c1åòØ«h·àøåur#"rÔø­EŒŸ¾’¨Ú£úTÿó}®^H6×ÒGSv`ÜŽ|²œ<¹­Sm-ù<´®€ÜÂ"žÚÚ”qñ,³;Ä;‡J±óöãáÎþxæáŸû˨<çKb­j]tñ`@¸¦ô¶˜Î‹]GÚ…ð€?l_—Kª* 3Ï_K%,϶pOóVLì¸Ï³¡UdSž © ô<çke¹GùçÞ¦vnÏ|çC|–^Ž‹ÿŠsdï¦CÌ7•žY_Ⱥ„v,v:ćGLXÝ=ø[ë0®sÊdøÂK7ŒÔ…çBó~ x.šÁdz!pH"auŒFdôëɨ?ñ¯Ù¯ðŒeWwÄ’¶–_¦®¤4d£»úàâ8˜ãóñ·O36kýb<)Ü•Â)yꞃG{F ‰â‰)ÿæ¹¢! hY{YŸ2“5ÅÝyô^w uÞòiÀµik¼ò?ãû ÿÅx}¡Æ<n[Ƭý6´-M.‡¸¾À¬¦úîÏ•¬Ý‘EfL0/5‡MËŽ±ë'Iõ^®)Ÿ)Yð^ˆæ#Ùl3”27ÍÌ31¸•ezÞåwD™óÓõ›/’|ymx'Ú,ÝÍs;ò8RÝäoçà€¸0úá™}&Ìee\èŸÁiü 88ÚãQ;ðÏØÄÓGÍXØS}soQ'ž7ÚãípéÆé·¹Ð¿dÁF¾ ‰äŸÝ‚iîPÎŽ´TFþv€)yÀÂÂ%ëèšÓœ mCøOKG¬%%¬Ü¶‹á+ÒÙhæ´g²°swË¢›ñâUñtþe%ƒŸy±Ûœ”¡¿Úñf·Pžè€‡ÁJ^aÓWlâ©METué­8-”ñuÊ6ZönÎÿuehy)+g0âW3/8÷ a-ç‡ùkèŸÝ’q±Íø$ΞÒâ"f®ÚÌ£ó«ûéW²iíFâò#y»So´rÂÍ\Æúù~Åa¦_æ?®ãÕîÞ)ÌÉ ")1”:G 5¸wÇk¼ö_ÌœÃçKòÁ;”èäûxìæ¾D¸€@’Ÿ~ Ïo&òÝÒøh=-;0äé}ò þp…ND }‘·¿á³ç2iqeN¾DuΣÓÅÇŽ³ÝÖa ÀãO›˜4y6Ó?\F©Õˆ[@ ºŒ~ŽQ×Fræ5¿‚úïÏÅÇÓù¡$˜û\ xoŸé<÷ Õs¹–2Rö•€¿+ÛVŸ®U²õ@!e1¾”¤g۹Ǽl¤,ìݶ.•ÑÌêÈ­‰í¹5±’´ü2ò±'Ò˱êjb©=‹îàWSC×+"Ò¬dÚK⯖þ-„§þªçÓìáŠY–^L”¥—¦oâ_—pœ~ï-¼¼“]5£[0+omEÉœ¥$í»,¿Yÿ²¬cz7t r†÷5t Òˆ8»ûpw‡PnŽô¦ƒ»=F¬äæ0w_:ol<Æš:®|Šˆüµ ehÅ1>H¯kXN!MÃTžÎG—¶G…͵ô‹ˆÈÅa*Êå%¹¼³¤¡+i¬¬dIå½s<Ÿvø\ŠN°¹yEDDDDät ý"""""6Îfº÷T§Óåýô†.CDDDD¤ÑQK¿ˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±q«Õjý½3­^½š„„„‹Qˆˆˆˆˆ\`jé±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±qö »z3'ÿƒÇ~Ì<íQCì?˜øB"^†š–°aü]¼¼¦ì´iº<ËgO¶Ç墕x„ï~˜ï2ªþŒþ¿‰¼œäJ2~~œ¾8\õDÄ|0~ þƪ?+²ÖðÝÇÿcÞæ£VíyêÓgéd··ï~ž%%.ô|þŽw¾XÕ‹ˆˆˆˆ4Ζ~ë¡-¯õ 9“mËꜾѩÌbñ;˜¶¾:ð˜ÍX´(ù«j”¡Ÿâ=ì8^qÚCÖÂýl=Þ@õü^æt6î¯<ù§{lþ6¸ |]EDDDDþši MgÓÁb†„yq¢‡)u#G´¦Úìðér;ûaì<šãyâÊj¡òd³¾ÝFÝÉí­œªþ´4åšD{Ö¬½ŒÜ˳)…8uËÄÿóeõÿ>æ›”=xßþ.¯$û5ÒË9""""r©4®ÐïJÿ,RBÑždUÄjX‹9¸õXÕ4¾ñ4wXy–Ðo&-åmÆ~°’¼Z¦í`Ù´,›ó·¾ð8×D8Ÿ¼Š€µ-_>Ç¿N=ð+ò8°b /îØHÌé=.žòTfOx†‰ë‹k±’®~UçBFßNŒ¼7©§);´Œ­¦ê?üúp]{ï“ÛiôéÈ ¾~Õ™Ù¾hu¶çÛ·á¾ñÏs÷Ð$%ö¤CÈYº‰ˆˆˆÈ_J#ké;÷(ÚÁÎtHßtâ!~dl>\5ƽsqö¨c¾ŠÜƒ¤Û?‚ÞšpÚíºw¢»EÀªª»l-ûȪè‰ã±œüi0ç8’Zºž”]"iç6Å5»Ù_p•>rêjCÖ 1ã¬S›î!ËÜ·ZÝœ ­’àWÇMÊ""""ò—ÖèZúqð#¶¥ÖÃ8Z’Ë®ÝUÏ…u ܹî¶kky!'ºËÎï3¦3àèyb4  ¬2 Tš 9ÑÀŽ«/nµ3³Ñ•&nfƒê©ÀtþÉN(Í£´Ž_úrôpÅ^Mû""""RK£ké'B;4ÅðÛ¬E{Ø‘ºŸÕõâ›ãq–Óƒ£û©@o)"Ïdך ØJyaþ©G7œìÀÎÑ G¨z¼4—’Ú}î-&òJ/Ȇƒ®5šíÆóÌ˜Ž¸Ÿ%À¼s¬ó™‹Qœˆˆˆˆ\æaè7àÙŽ`vFkV¬$«À™¨¸@j Æy‚½OÁf8Èâ Ùôîçwª‹%-‹÷ŸZK@¾öàÐ’Vr t+¿í+%.Îåd|.;´œ…iSO2âìG0˜ÊðŠlI”~·KDDDD.€Æ×½°÷¥ª‡•½³–WÇü0:„;}&×$ÆžHÉ•lÿòæ6U Ãi-#mñg|¶áD§-[ãa£_ºXH ?ü’ÕUgTæmà›f‘s¡7°.QÝiqâÝÈJaú†Í¸;Vߋ҇˝óÀë3øzÍßx¶uõÄW1öß·í DRg?ž|ä~˜ºƒ+ï÷9m¹Öâ-Lùz –Ø{ÿ\2F€ÞôŠÿ˜‡^˜ÁË®â_m–óÅœL®{•niQÕ.)°â1¼:k&û!Æ/7{°wÇ?8_G0\φ±>νÝ=0}º·ÀkÒRì MXq<ã*›i÷4¦l)'tø^º1¢j]ýúÒÁó!žþ%ëâ½À"""¿Ãeú-”—S\\ݽ§ÒDnêfÌØÙ>Š„VžØQõåZz¤œ+îû?zVµÎ[ó×2U..ñ£¸sHK\ í‰ý–w¾]AÊ®nŒnVµX“]{nýûµD:t¢CŒ7°…KÒ6¹œ… `‰¸†»FwÆÇжQ?óÞË™³5;ÚRg Î^¾x;Áè‚·¯/ž€_b½–²zãaJÚ´Æ(;º]%®Ät Ç;<¢û0_¯R»¡\L‡ÖpÀêCÿ«ÛÔ¸ùÜ€W»kHp_Íêu©”U‡þ°WÒÜùÔ¼áýó ïîÞJfEâiË-?º–m%öÄ]ÓS=þ ¸Å É¿®=L–Ãjˆ~§î}1xÐáþ·y¿Ð¯³\*³÷iA„“•5“ÞáË‚«HêÒ†¦¾¹ùáÎgÙJ3™›·SH4·$7«±.gš¼šð_¾¬ÿ &""r]&¡?—eŸ½É²Ú;…Ócø`Ú{ÙÁ‰¡óºÒ6àTØ.;¶‹t<èÔ5¢:ðpkÞ—ìÜ}suè÷íÜ•¦5ƒG@Gz†/䧃È:VÄA“‘Ènmªçð.´õ^Ǫ]Ç)oëYg geïG\¬'Ë×näHikZ¹”qtý.JÝÚÐ1TMùr9³R^TDîxÔú˜1ºà¥9Å'û¼{yrÚà9g|›¸@z&Ëé³[г(¦‚¯ÝÆðºVí“O~vàA ÇéCò]| 8ÇMÿ¯îá¾™<¹Ÿ¼ÂÏŸ€Á;Š„¾ƒ1¤;aεÛù-˜òMàI—ÓŸ3zâ ž}u"""—Ìeú݉¿æZÚyŸø7ààæK@€.µ†ÙspwÇñäw¯•ŠÒR*qÁÛµÖp9v®x»@Y¡‰™ÂÝÏ­VðpÂËË r ())ÄD%{§Œç_u•èQBžuÔp.øÇÅâ¹b=SM´ ?Êú=&<Ûu$Xöå²fÀÑÝ{²8^T 5,K1YÅàé‚y+¤÷SSYKÈ:^ nþ¸Õ>t]¼qÆ„‡Æ2<âÌÅàèã–9@ 9%ð<µnKi&©Ç-ø„Qû\¤z鸷Hæ®ç“¹³,‡Ã»·±aÙ\¦O{“çržçýâ9ýœÁˆ«¯+˜²É1Y¡æÍÉEYÕûõ¹¸.“Ðï„_³´ð?ÿ@Ú»š Á€½‹ FòÉ+µpzð(¥ÀŽANØQ €)ßD%5‚¿µœÂÂ2ptÃÉÙŠ#.Ä ½…¤ 3_6ƒƒ.ÔQù9Äã±’M›RÉc={LÞtnH=®ˆ4jNM;Éz–ÎÚÎM´ÇÍ`¥`Ó¯¬,´#ªSN¤pdÖö ¸•èê–ô²ƒsùq7ø^ÝŽ€Z‡›chG¢Sص§œ&=£NælKÞ:¾ü`. ¼Ÿ‘-ÛÄTæ/:ÂU7ETO&vÿïžMiÆãŸDŸë[Ta[)Þ¿Ší%‚£ýq¨nmÌ\»žc É„T',;.í" 4æ°ž#GÍxÆŸì»k-ÚÍœk¡Ë ¸×¯&kÍ?iãÎê-«XUrˆ2ßî´ó·ù·EþŒ~=5ð'þ5ûž± ãêXÒÖòËÔ•”† btW슫¦u*ø…=WÌäX< ¶“2m!in ücP$ޤ¶\ƒG{F ‰â‰)ÿæ¹¢! hY{YŸ2“5ÅÝyô^w½2ºç&LË …ÃèÛÚ›òý‹ùvN.A×>J[w`ÀÎÞ ö²qÓcZÚ´5^ùŸñý„ÿb¼>Pc·-cÖ~Ú–&F Vw#§–ƒ¹1~1û4c³†Ð/Æ“Â])ü˜’‡Û%y¥EDDÎÏæÓ¥wý–ñÅêÉ|fI¢kK¬Y»XñÛvÊüzÒ¿µveÕç-cÒç¥$vlŠ«)•KÖrÌØ”½šâäj¡ob0-øŠÏK¯ ss_ GÙ½~»L±Üp­+ŠÏY‹Áh€â£ìÛwû¦M t5´Á}ÍZVì¿~ñ4±ùwEþ nÄÝñ¯†}Á3çðù’|ð%:ù>»¹/.,Å€½¹—€%ÓH™¼ˆŒ _"Úã©»†Ñ©‰̵ìDÄÐy+ð>ûq.“çPæäKTÇá<1z0]|ìoº=øÏ7û”Éóàƒ9Å8úFÒqä3ÜzmLõÕB¯èKÌoS™2~ûžùˆ'; àñ§MLš<›é.£ÔjÄ- ]F?Ǩk#ë*×HòÓoáùÍD¾[ú-°'°e†<=‚¢O^aÃÅ}•EDDêÅ`µZ­çŸìt«W¯&!!ábÔSK%ÙK?äÝùúÜ?†¤suï©ÈdÑûï³<è½!êô_«µ–rtÍ\æ®ÚÍÑìbp÷#,¦ûw ȹzœþ7gà0øvÚNaéö#ä˜]ñoG¯«ûïw¢³M9Y[0kÉ6ŽdRîèIp‹Ž$%÷$ÆÇáÜ5e© ™þ³ì®æ¡;ð®ÿ-"¶Ï|ˆoz”_"úEDDþ(ÅËF 2wë2 ¼s+¼ôŽˆœd)>¦E³Xq Üš¸¢k`"""Œz7¤² ¶lÜÅ¿‘éí<ÏøµO‘¿²²]ÿãµ6ás5w^w–>õ"""r^ ý ÈZ~œ-‹²ÛF÷a£•›"¿HM.ŸbòÔ†®BDDäò§>ý"""""6N-ý"r’Åb¡¢¢âä¿ÊÊʆ.IDD¤Þ\]]qrª=~¢€B¿ˆÔ`gg‡££#ŽŽê=/""bK4VŒˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~§Ð/""""bãúEDDDDlœB¿ˆˆˆˆˆSè±q ý"""""6N¡_DDDDÄÆ)ô‹ˆˆˆˆØ8…~gßЈˆ­2sxÊÃ<25£Öã.øE´ Uû>\?$‘WCƒTW§’u¼xÛ8roþ/¯_„ñ®Ú’5‡'ïˆû“_ð|×sÖ·)ho¿9”ÐËø¼a··’ìu¿2?-œä«;à{Î7ÚŠ)m-3§NgÑ–ƒ¤çš0¸øÙ–>ƒ†rUÇ`œªwáÒ ã¸ãå­t|n"·sáÂòVþ‡±)yþ©Þ41ä²ð©»xo/8vz‚þ™€Ç‹©$söSŒ™¸xîÓ'hçòû¶é” R§>ÂCSÒÀ¥;Ï|øÜjNôû¶µ"mcÇg0â•»ˆwkDŸ"6¬qeX Ù0ñ ¦‡è›xxd g~5XÈ[=‘ÿÌL‡n~ì&š;ý‰ušvóÕø¯)¼òAîéÅ×ã¿f_“¾¸?#cå£ïwóÚ­­pù+ìÏ" ¬q‡þÌû×r ¸mj·XòÙµ!íâ¬ÔΕ ¨0*=¼q0T’»)…U©.t¾öz:µtÅXHdx ξŽu|øý>–ümÌ[šE÷b*LÇÙµréå±\™~ž/‘ÆÌ‹V=zÓ' F²²Ž`ÈÒxîíYüçËÞOcjðo´œ¢ýÜ+ ]Å¥ÓÐÛk-dý¤Éì$–»^Ë€ S_™®¹’v¯<Ìû?|Ãæÿ¤‹û¹và?{ T’±ðkV{ÿ7›9žþ”[S|‹·2ws>ݽOûª<¾š”FBìÉÌúsÛTv0…Å™ZÝüwÜ¿›È¦Ù›ÉïÒï3j®ï¶ºsM Oͪ랧·¯z‹\l—Gèw À£ôk÷ï~ú‡ZÞNÖ§ñnbG^Á^¯cÉ7ßYã+f“\"ˆoI°#àÞ›‘ï}AVgpð"Äë VÆTt”Õ©ÝéÜÎåOŸLˆ4:‚®¸¿/]É„¥ÓÙ|KÝ< €™¬uÓøü»ÅlÙŸI©s­z\Ãèщñ¨–böÌþœ/g¯cwZ!ö¾Qt8Š[µ;Õbk)fï¼/ùræ:öÍÃÎ'Œè.×qëÍ}ˆ¨nR´–g°jʧ|·t‡óŠîHò x*O+´õÔ¥<åß}ÁÔ…›9œ_„Ä&2ôöQô s:ç1]Y¼—ÙïMeæÚ]¤™<‹éÆõwŒ¦W¸3ó¾{øa¦GŒeâcmq1ệaQ·y$dŸMYÄîœ \ãé7ê>FõÀ¡>õT/ç·+Æñ„ÿ/L˜¸ ÃÐ×y°ü5žœÀ?>zžÄ“éÎÄŽÆðÜÒþùÑãt>[Ø­Ç{ð»··¾ïɹöŽñËã÷3é0À¯<9r&ñgëbd)"3Û ¾Ñ´jRëëÒèO÷‡³'¥û +üÞOê³u(;Àì™iDÜØ™&µ¯Jx·#¹Y:Sçn ·gNeçJŽ­ZÀ!·ÎŒŒÞÃ×'BÿÚ¦RöÍ]JŽC{nOº—}“Y·r6r»Ó§>aý,Ûj’H?ÿùiaW »L‰Èåëò8ÆÜšÓ9 ‡Åk÷R×¾F——Jòvlà˜K4ýÂSIÙVck)G×Îcުݤfaðð'¬U$·'èÄubsÛÎdñ–C+²Ç7¼%zFb9±ŒŠL½ÿ>˃náÑ‚ØûÙk|`#Ÿ¿²‘ÐAr{³-|üÎ|Áèhç3’¿{ ³mæ@Z.&'oš¶éNÿþ 4u5T/÷6ÇÝÉÞ+ù~æVHÃ}IaÄ´<ÈêÄ67‘j¡u ?jµëˆØƒ1=£`Ý~6-§[Œ‘ôÙ¯ðèÄ-8Å]ÅÐ{¢pÌ\ÏÌ?ãÙÙ¼2~4ÑNÅlùô ^˜“O‹þC¹sˆÅ;æñý×/’Z1q7Dàh-fû¤';3“ n×só  ,ik˜ùÓû<¶=q¯Ž¤¥Ã1æŽ{„O¶X‰LÌ­=(ܞ·ã—R4 âüõ8×ÒLìúêÞœe"þo#åJQêv–Ϟɻ/ ûV¢ÎzP[ÙþÉËìíÍQýð,ØIÊ´Ù¼ûè^òÞ|‘AuÏ“»ê}^54càÈGæ˜Á²)_ðË›ð‹Ç5Áæó×c¨ZNáæ/xéà1ü;ö¥S+ÂO¿‰ÏWcykK'{~8ÑA.uo‡Ñ‡èo˜÷+ïêˈëúÐ.Ä¥z .у¹'úlïe=œq Ô}M×|t«r‚¹®×™£o<‰OŽcÚ;óX—“D²_õ¬\p.·ÐÒuÏŸÚ&kñ.æ¬*Ä¥ËÕ´õrÇ.9÷å‹™³&›^üëwïK]Ûjô£}g&/YKæà0B.åM4"A—Gè7¸Ù9‚%ÓÖ²» Nô[¬Ìeû†L\[%ê”Zcg̤U¹øÆ&’ÜÓkö.V.·‡²¹ó®þ„sXóõüzÀJp»ž\ÕÔ•’CëYôÍÌ@ÀE¸ÐrØnZüS¶†2äö+‰ðqÃP\{ºJ²WOæÃ™pˆL ñÚ`òö°jÉ,>;\Àw'f`¥ôÀ\&gäâÕ²Ñá®Øa¡$ßLhòô)bÅÂt Íࡾ=b“ ¸øàÆ.2 +°ogÊ×[°ÄÞÃøç’©êЛ^ñóÐ 3øbÙUü«Ír¾˜“IÀu¯òÂ--ªº½%%V<†WgÍdÿ 1D.ç«YÇpO|šqv¬n$èCbË×yàõ|½æo<á7)[Ê >—n¬î»Ü¯/<âé_ªšD­Å[Î[Ï‹ýüÎ a9ìÏò$æšyâ¶ØêÖé>tor˜û&î!Ýd%Êñ­ÂW1öß·QÕ†DRg?ž|ä~˜ºƒ+ï÷©sóq_Fþ÷!úúU¥¦6MÒØôÌb¶+çÿÜó×Sy‹w›¸þÍwÔ´új„¹Ýü~bÖÂuJ÷¦°¦Ðƒ„äVuÜcUÅ’}þ÷àÙÖ¿{ëóžÔg‰ñ ÄßÍìÝñÂ÷¬'aδºù)î(ù/“çÆËó?ÃÑ/Џø¶Ä·mGÇŽ±„ºý™¤zú1@9+ÉÚ²lÏ6´ô®k]<ã’iëø:óÖfÑw`F "c‹Žz’pos\Vü™m²R´m6kK¼¸âªÖ¸€–ýé깘”¹+9ÞÿZ‚ê—úëØVÚ4Çé§ÕìÊDˆ¯®k‹\L—I':®‰²OeÝ®ü“-ñ•9ÛØ˜åFL‡Ó>*­ù[™¿*—øQÜ9¼];t [ÿ¹ëÿÙ»ïø*Ëûÿ㯓=!ƒ ì)Kf‚,QDªVQ¿ÎÖjkÕV­³Õ:Z[ÛÚZkëÏVëÞZ·‚" ,™"2DöB {žß 3@@4áöõ|<à‘œsÏuÝ'Éû¾Îußç¼vÄ~5ñ‹ó(^ó¾,¥Î€ËùÉÑ«{/u—ô©uÀbj¥‘ qÔNK£Vl%ÝWô%>ø’Šf#øéEÃ9¡{W²†œËOÔäÍSóÙ¶]×_®.¡×å¿ä²óN§‹DBDÜfú¤ׄþ§ö¢¡_ß%kg±  ŠŽ#úPwWˆ‘ØîÔ ³|Ö*6/™Á 2dȆ’ézõ<ô— hE+gòe8•~Ã;ìñ®`ˆÚÇ +©œe³¿dõ§ É¥ gmºÇvâh9l8«\ÏjŠ+kHTCN½å^þ°3`—f³òÓ;uÞýNâd;™–q»¿n<„3ÚAÁ’ÏØTVù:¡6'Ósy‘ÉuI$LEø0ëi=œ÷˜~É ½Ó)]8‘Åùa ¥ãg‘W»7'µ>Àè8U9kvõÝá´÷h½FG(¡%Ãu?O?õ ÷Ü|ge5 dé8žzàw\û£Ÿò»—ç³ýPõ)fÝ‚ „Óš‘v€aºPrNîËò÷gðU9@)ë¦Ld]Jo·ˆÛùÃiSxóÞû„â´Þ hEEEÑ€~=kÃÊ÷™²þ/Ê*ŠNoFjÅ:l,ùFÛ‘thÇÆH?JhJV1Üðó$bjã¢Æð·Wîàw¹#|\ %Ë'ñÒ˜­düà:'…ˆL: ‡½Á]ïÝÃm#Þµ>ëfñÎ+Ó)lxõJ%>æLÎë4‰G^º•;6ŸÅvµÈ]<ž×Ç縳êPê©,¦E×iC£ÐGL{âêîDƒè–LÄEyÀZ¦ŒŸCËS»Ñ°Ò;ÿ@ìöw¸ëö|ÎÚžäí ÿÚÖ%fqí͉áð?“¤JõœT÷ [ˆ¥é‰=I3Žw>…Fô§á!ærDÖ9ô1ˆÈ?üöVå˜Tå5!"¢"`û2>™·ˆ˜vmiRÙ-XãÚrÞ{1ó_£¹ëÊ…ôÔƒV©Ä–å²é‹ÙLš²”íõOáÚëâ6Uü8@ÿ7hŸAèíd—B΀‰§å,jM|‹GÞƒúgõ§Òs³ÃhSÅÚ—¿êŸub%ÛŠ¦Ñ ý¨÷úkL·”‹Û¶=¢¶–nYÉÖˆFtÈpª«ôm;¶B?±4ìÚŽÄO¦òÎ Híß™º•´ "¥#C²¦ðÔŒçx¼b½Z§Þ¼˜i.¤¸Î œt\2±QýÔâSÞ™ðOnëG×&‰®žÃäÙyìÙÓaHhÅàþ xøƒgx¢°=Z¦Ú¾–%s>fqQ{ÎýA!ö»å`9L{ávß@$–ô¦­è}æ9œuÖ‰4Û•bivöÝÜ_ÿ},ONʦ86ÝÎáæ‹Î¤gjBïkîçΦñÜû¯òï1ùĤ5§Û·ñ£´Û9S'‘Ž?¹—?g>ÅS£ÇðÄGÛ ¥m†^ÉÞyøú ½õ~j½ð(/O~•‡?ˆ¢~뮜uëùäý÷æV¹žýEÖʯnÜ̞˫H\tì)÷]Ïûÿ£GcÙ‰]+ý©œxýÏ©÷ÑkŒn"ÊÒhÖy$¿ùéHº§Gî;¾Q%Uª§ÏùÝFl³ô¨=Ž÷·5aHß*|òxèÐÇ "ÿHÚ{´^#Ñ4ê7˜v¾Â‹ù_Üö0·t­lÂ$u\Ï¿OåíWG1uê;|œSD8:™:Mè~á-œ1¬™‡ü8Ùªþ T&’:º’þÜ<–æ”Ó¦þO/âZ ¡OÊxÆäd0 £̳¯j›Jùⵉl ƒs°­èF'ЯÞk¼öñX>¿´-é‡ÝÖR6-ø‚â†CiWÛw¾¥o[(ìÝÍJ͘1ƒ¬¬¬o£ž½…s™ûè}¼Y2”_þü„JR²šQÿ|Œ™yi ¼êjÖ‹JYûî?ùïœF\|ãÿÑ2–÷éŸ9–±/aí–|HªCf»¾ ;©+_ÿ±-ÛÊÂFí¸On$©[ÑýÄ®Ž~Ž¥Y¿àŠže|´ë>ý-ˆ¥Œ ï?Èf7ãÒ_IÓ(ÏžÊÃûݧ¿„Íó?àݰzS.%1µhЪ†ž@»Ôè}îÿßÂK—$Õlå›}ËU<q9ýiõ¾É]*G¥Îõ=T¼Œ'®½ƒ/Î{ßJ;¶æåLùÞºéWŒïûWîé‡sIß¶šú%IÕ®|ÝÜtÍsÄ]ùoþPÙg|[JWòÂu7ðNóïyè§œõoÝÂÍSOæï\ÈâQP1øz`ªœ¤£ËŸ4IR¥ÂEkøè忹#~õ3zÔþîn¯X¼øYî}x"…í†sÙéÍr‹Ðï‡Pr.ùQS¦??•-ßê‡}7ÊÖã¹…Çó³sÛTòY’¾ Nï‘$I’Α~I’$)à ý’$IRÀy‡,I»TTTPVV¶ë_yyyu—$IR•%$$ëÍÐ+cè—´KDD111ÄÄ|ß/›”$)XœÞ#I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀEUw’ªOxbÑzœ¿–/¶±½¤¬ºKª‘jÇDÑ>-k;gr^«zÕ]Ž$I‡ÍÐ/}O…Ÿ|ð9O~¾¡ºK©ñ¶•”1mÃv¦mXȧ[òùc¯æÕ]’$I‡ÅÐ/}O=¶p½ÿÜ3{%}3jqZÓôJŸ÷Ý“#ã»)’ôí2ôKßS÷Í[½ëëKÚfð—>-ÈHˆ©ÆŠj®ÕyÅü|ÒF¯ÜÀŸ®©4ôýîÉœ¯òøkßôª_‹Ú1þš­Š­Åe|¸.‡ë§|á»)’ô-ðB^é{êó­»¾þÏ€6þƒhœË#Ûìú~Ö¦ÜJ—{láz>ÙœÇÌsºqrã4ÿaHâŒæu˜snwž^¼Q;O°$IG‡¡_ñQþ*8”F‰±»¾ÞZ\ù”ûæ­æ~­ˆ‰°?Tí˜(þÜ»|º¦ºK‘¤@ñ/“$%Ÿo- _ƒ”ê.ã˜wJ“´¾›"I:2†~I:Š"BÕ]Á±¯N\ôßM‘$C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀEUw’‚%/g3ÿœµš§×䱤 œˆ˜XZ×IåÒ®M¹ºI<‰!€0kV®á¿9‰\Ñ)†?죂Ïf̤ӬÂ}¤IZômœÁ¯»×çø˜ÃØdy7=7‹Çuaõ«´’ÇI’‚ÂÐ/é¨)ܺ†S_ZÆä¨d.ìÔœR¢(+(àÃeë¸eÔFþ—ÕI=’H ‚5+VóûõøAÃäÅpnŸæ ‹A8L^AŸ¬ßÌÓsñâ—ÛsVkNŽû6÷ïq’¤ 0ôK:JJ=e9“Iá¡sŽçÊÚ¡]Ï\y|C†ŽšÁe³¿d\§Nœ[eSbèÛ2ƒKk…öx¬9·.]Lÿqk¹pj– N¥vµÕ'I:V8n#éè¨(ã˼ H¬EŸ¤ÐÞÏEÄ12«?k›Lli!ÿxé#ú,(ü5ô|d"CV”íX.\ÆÌÏ3ð…©Ä=4‘Ä'g2dÒzæ•ìÜNy>w=7‘V3r™¿h!ížÈq³ Øñt«V¬à¬W¦“òÐD"þ;þÖ0¥(üÝõÁw"‚–­Zñ¯¦l^ºš÷‹¾~üHÚu*rœ¾7}-IÁaè—ttDÄÐ;#r×pÙGkx/§Œò=ž®U¿ lư¤8~|ZO^l ñõyå¼^<Ý( (cÒäÙd}¸žµ©Ü;¨-lÏò‹éòêr>.ݽ­ì5Ë8õ£m¤7mÀÅQDfégói7zE§sÛÀvü³s2-£ßëË™^ºo±Ç¸P4ýZ'Cy.ïm-‡#jÿ!Ö)?Ðqúžõµ$„Ó{$%‘ôíÛ‰–~Îo.ãԅˈOJfPf*C2SÞ4…v±! DJRMcCMÓÚñ4Š‚ò¼MÜ2¿´Ö˜~R:é!€\Pÿ3Z½·š[Wd2®ÅŽ=mÝPίÏËâ¦ôHB@¸8›Û§o¥¼afü !Í#2¸(s íß\Í K3ù°},‘ÕÕ5ß‚¤¤8RØÆò¢0áâ­‡n۽ׯÒ:í÷?NU[/X}-IAàH¿¤£&"&™_íIÎe½˜zjnmOáÆuÜðþ<Ž{l*'ÍÜÊW˜’·e s‰áüÎ);ÿõgòÃØ0³VPðõƒõ3¹8mGà(ÌṲ̀’ƒŽ¯K³=~«¥d4äâd˜³"Ÿüo¡½5Aˆ#kÿ‘öÙ÷¹¯%éXæH¿¤£$Lqy˜PD1±ñôiOŸæ ù-a²·læ_Ó—p×Ì\Y§/7ß¼¡¨¨”¢i·ÏsÑ4‹ƒíùe” @|B {^6PV\ÌVÂŒywJå#‰¥µŽZ[«_^^9DÓ">Tµö‡÷¾¿gUûl_ßǾ–¤ 0ôK:*J¶®¤ó +HÜ—iíbö„!ÒÒërûÀ2F=µ˜VRÔ|ÿ»ÄÇÅEC1+‹ÃÀ‰¾¢ŒÕÅT'r×/¬ˆÐÞ GFÇL4gíÌuö¢Q±¤…6ÖáR&/ͅȆ¥D¹µ ííá«ÚgË÷yü{××’Nï‘tTÄ$¥Ð7fÌZŤâ}Ÿ ³ù«V Ò¢‰Ùë™ÓÒéJ1/ÌÏaëϵf ¯…èÖ,„ì;!5^Q¥LÝXAfj"íwþk[ħ.çá­áý²«`ÙÒeübeu[7fHÜ‘µÿp× áz’¤šÁ‘~IGGtm~wBÞ¿†ÁOçpv»tzÖŽ%±¢”/¿ÚÂ3K·óU­†<×&ž(*ˆˆAa.cVo#®A-:%×ãOW1ø³ùœPÑ”kšÆS‘³™ûg}Åö”Æü¹E,‘”UºëP\ì–L÷óPÜ”Ÿ7Ž#”—˨Ekx«¸ÿuŒÑ&/]O|üŽï ™·a3Ϭ*¤<¥cûî¼G•Ú¿÷™XÕú,¼ÿq l_KR°ú%%!š´íÀ’´MÜ7{ /±†× Ê GFÓ¸v"§õîÈMëÐ> ‚vm28aÉJnw>³Fôæ&Q êßÓ¾àÆO×qÝÒB ôîЖÿõi@—hØë {‰äø]ø¬ö—\;{7,.&?:–nMšñzŸ&œ‘:Њ5\ ¯|¼„Wv}Ifz2gwmÆoº×§KÌîÇÙþýú®*}ªô8³¯%)ØBápø°?MeÆŒdee}õHúŽ„š¸ëëðU«­ŽcÉ¡ú,ôÐDûò(±/%éèò]XI’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’tUögœk_›‹JIªî2$)P ý’t”´KM`òúœê.ã˜7fU6=ê%Ww’(†~Iä•–Ww 5Þª¼¢]_hú†ãsíäe”TT|Weζ’2~=}9×vάîR$)P ýÒ÷T»Ô„]__9i ÙÅ¥ÕXMͶ± „+&.ÙõýF¡/k߀.u’èù¿9Œ]MQ¹á¿ªòKËyóËÍt{y6—´Íà´¦éÕ]’$J(ö Ô3f••õmÔ#é;òèÂõütââê.ã˜ôÎiJÃÀ‹Öóàüµ|–O©“ü«$62‚nu“¸¶s&絪WÝåHRàx¥”ô=uYûLÙ°'?ßPÝ¥SníÞô £Ð!à'Ç5à'Ç5øîŠ’$é ýÒ÷Tx|p;ú7¨í¨ô!8 -I:Ö9½G’$I 8/ä•$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$IUÝì'¼n»Œ–Tò\\ÛöጋÏe@³DBßyq’$IÒ±çØé/Êfõ¼QæéÕðåô…,Ý´€\€ÈX²§½Â33J)ŽÝYêœ9l<§ÃëÊ/<%ÇÐîñ̘ZÈ–™3ÙpaKê|1…Å;ÎV8©]‚w)’$IÒ7R³Cÿ¾¢ShÜqç]v½êFBÑî§Òš×#vW:S´m;;n“B“Ô=šFÓ4  ¶ä²çMtR›¤í˜jY›Fé‘°ºœpþ6oÊÛñxù*&ZÅ~¶o ·lwèß»žƒ%Ònh§~DþÆéÌþê7}E@B·“hë0¿$I’¾¡šúëœÎ_ÿu Í£½h("´ÇˆxˆØZÉDeä°jk}“wn¤t+«¶îø2.%‘Èã÷l]•M)uˆ(ßÎÚ-;®%¥“Z;(‚ºgð×^\yME Wi=ßj(YÉ1!w Sg~ƶy¹@"=NjCB·!I’$HÍžÓÿ Ä7ïK›H€ Œzf<«ŠÂ.`Ùè§³ –ö}›»Ç:[Ç?Íè%y”‡‹X=ñ^]½ãñ–}:Ъ[ëË~õ1“¿,Üq-@Eó^ú'ýë_ù×kK(Øëƒ¨(£|Ïeã[2¤w _¾ñ<l’{2¤•7$•$IÒ7W³Gú¿ˆ´¾\zÎ{üúÅ/(œû(×_ô$±‘eï¼'¶ã…ü¨[-BÅ{¬Tú9ÏÝúcžÛsC™gp逺¤DÏÈVsxnÙÞ¼õr¦4L§bË:²‹ñƒdúò E’X7 („ oñ÷{ ¹ðÊ‹é™ ÄÒ|p_ÒÆ&;w-@­¬!´4óK’$é(ìH?¡Xšüÿï¶ 8¡mCRbË(.#-³=ƒ~ü{þßíÃi¸Ï–]Å™]“ ¡Ä Ú þ÷ÞsmãCÝ„3ÿ7Õ“õ¢È^·Ž­¤Ñ¬çé\}ï=\rÈ n£i2ìNn™LˆbÖÌËê¢ÝÃý±ÍÒ¯Î×ߥÐkp âŽnH’$é{*‡«:)e—3f••õmÔóÝÛãùÚüòQþ8 ¥šî–SÂò§®áæ·7Cê0îyðrÚÄz-I’$éP‚;Ò¬©Ègýº§õH3¿$I’Ž’ÀÎé?v”²fô¿ø÷{sY¼®hÆðSšSÝeI’$)0 ýÕ.LÉæe,^WHD­ ¸ø:†7ô°H’$éèqN¿$I’pÎé—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’.ªº øÚŒ3ª»I’$©FÊÊÊúFë;Ò/I’$\éÿ¦g/’$I’*çH¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀEUwUR‘ÏÒ÷žàé÷f³d].Qi-è1ìB~tÆñ¤E¥«yùW×3±÷Ý\ßp"¿8‘%ÙeÄ×ïÄ ¯ä¾õˆ®î6H’$IÕ¤æô‡ó˜ÿØMüæñi”¶ÿ—ÿâJÎéÁ¬çïæ¯® d÷‚lýø!þüF>Ý.¸[¯ÿY‘óyçïcÌúòjl€$I’T½jüHø›Ô IDATùÆxjÌ&êþg~wI+bd‘™~w4ËϸŠv;O]J¿JクcpH:¤¯cÞm“X°±„ â«­ ’$IRuªá¡?Lî’¬ !çi¶#ð„’ézõ<”Aí lçÃmN¦gz䮵#“ë’H˜Šðw]·$I’TsÔðÐ_AAvLýäȽž‰ŒO£Þ>ƒ÷1µ‰ }wÕI’$IÇ‚>§?‚¸ä8 €ì‚нž©(ÜĪUÈ-ÛóQ¿$I’´¯úC$·îB«yâjJw=^Ä’goãú›ea¡sw$I’¤ƒ©áÓ{ :s0†¿½r¿ËÉàãR(Y>‰—Æl%ã7Ð9)´kN¿$I’¤ýÕøÐOD ½¯¹Ÿ;›>Æsï¿Ê¿Çä“ÖœnÜÆ~ÐŽxgôH’$I ‡Ã‡=?fÆŒdee}õH’$I:Êjøœ~I’$Iß”¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀEUw_+**ªî$I’¤)..î­ïH¿$I’pßÙH衉}~íå¿“:$I’¤cMÃo¸¾#ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)àú+¶ŒáÞ ÎáÁÙ^¨`6]4’knx•eGsïåäÌ}‹Ñ£ç²­ü0V«j=;—ûóè T|ÓR%I’ô½ˆÐ_%‘ÉdvhC«6õˆ Í —‘3÷-ÞõÉá…þo­I’$ioQÕ]Àw&¶ §ÿæžê®b·šV$I’ëØýù¬ÿ4oŽ™ÍŠu9D¤dÒ¬ÇéüðüA4Ší±Ø2>zø&ÍY̦¢d2Úôfè.¢Gf¡ÒÕ¼{ó¯ßôþp]gâ(eëÜ×xíÕI,þrÅqõhÞ{§ÿß0Z$GìÞ÷¸'xcìlV¬Ï%2µO¾Ž8žÚld­Wóúj€QüíÇ£isÃSü¢{<¥§3æÙÿ1ý³Ul/Ž"±A²Î¾Œ} PI=á’ Ìûßc¼;uë·ES§u7NщÃyA’$IÚWÍýá|–=s3ÿ³‰:Y?äŒT¬ŸÉ‡o?Ä_­ç†»/ ñŽYöÄYÝp CÏBRîçL{ó=žùõ2¶ÿån†ÔÛwÃe|5îþüÄ|bÚŸÊ)—µ ú«9Lzëqþ±x ×ÿá"šÅæ³ä©›ypÜ6š>›sΨMÁâq¼÷ÒÝl(û7œÝ˜Þ7ÿÚÏßÁ“ ºó“[Ï¡yýxÂ…‹xí÷÷1¥¬=}F\F³¤m|1ù&i‰Q™DZFµc låm ÑêÚ›ø¿^É„€^½Z‘üÌd"òŠÃ¾Óø‹—¾Æ¨%Ô?ëo\7²ÙŽ} Lûäëøû»›¿½–$IRàÕø yKVÍdM8•î§tØøB$wA§¤rVÍ]CÉÎG3N>™&q»×ÊÂà¶P´ô3²÷¹CNéºY,+ˆ¢Í©}H‹Ü½Ýø6§U'Ìê9«ØºtkiHŸA;C8@(™ã®x€;ÿp™• ØD¦¶¢Ql˜eÏü“7ÆÍaíÖbHéÁ¿¼Žjíø¡”-Ÿ-$Ÿ6œ4¤éûŠ£ÉÉÃipX=&I’$í­†ô‡)ÉË£œ$Ò“÷)52‰ôD(Úš¿kÎ{RýZ{ŸÅ„âHI‹‡õÛ)Þç~—›) ŒEÿ1×V¶ëÔmäfçɤ'EîõTd|éñ®:T+‹ {ï¼ø&Sž¸‡ O@¨v :<“ÓÎèCFܾ±¿‚’íEל”}ž‹HªO"p›‘J’$IUÃCˆ˜¤$"ÙLv^9Ôß#|Wä³µb›ÅAù›r© iwð°us!$Ö%~Ÿ÷4"âRˆ%‰Î¿¸ƒaM÷²ŤýÙ €m…Pk÷¾+ 7±asµdXiFÐr(çÞ6”sгY¿l §eü›ç­wrçÏ;·×ò‘Ä¥&@Ѷ‡a‹“Ëó7ø%I’ôÔøé=Ñ{I6³Ç.¤0üõ£aòæb^n»fîš³~ÌVíZˆ’•c·jw>žô}ÂytÃn4‹ÉãËe%¤4Ì$£ÑŽõ’62íùg˜º®‚äV]¨Ãj¦~¸šÝ³ƒŠXñÒmüù¶GY¶» Uíø?Ö}üþê[½²”Pl ;ô礟\Ljæ¿|9¹ûÝŽ'Š´öHf ï°ŠÒ]³n»¬;òî“$I’júH?D¦ŸÀéCßà_ãîáþŠ‘ 8¾>ëg1áõé58ƒÓ{¦Ú9“ûÿú}>'nObîB¦½9M‰Y\òƒæDïCÉ]qF þú¿ßó@þYôï\Ÿð–e,œ0šù}øÉO“ˆ®5ŒÓûŒáñ×ïàÁü‘ôn“Bé—“=v+u†ß@Û¤""2r—ñùüEÄ´iKýÆÇ‘´ýqÞûǃDžžEýÈÖ,šÂ‡_BÆ™I‰„}?^7¦Õ™ ï0‰—^¹•n9‹>mj‘·t<ïOÈá 3‰$I’¤Cªñ¡ŸP"­t/7f>ÅëïáÕ)Û v#š ¹’ËÎL£ø@D*=¯ù9iS^cÚKÙ\–F£Ž#¹â'#éÉÃç;ÅÒèÌ»ùM½xõ­±¼öQ6%±i4îr—Ÿ&R"€º\u?¿hòoð*/ŒÍ':µ9íÏ»oÇŽé÷ÑÔë;˜S^aÔ}bÕ-óÓãOáò›‹xíÅ÷ÿèŠÂ‘Ä×mE§óoçôáÍwܧ_‘õé{óý$¾ü(ïN}•'FQ§UW†Þ|>ßâo·—%I’`¡p8>ôb{›1cYYY‡·£‡&ôùµ—<Ü2O¥Î%I’$Õ| p×Ȫªñsúž ÊûôF’$I:ö}/BEþj>ÿð]>Ùñi DzI’$)0jþœþ£ dé³<úØ<âÚ眘S/I’$Ô÷"ôÇuù {¾º«$I’ªÇ÷bz$I’ô}fè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$IUÝ|-­¢¨ºK$I’j¨¸o´¶#ý’$IRÀ}g#ýá«~W»’$I’´Gú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀú%I’¤€3ôK’$Igè—$I’ÎÐ/I’$œ¡_’$I 8C¿$I’p†~I’$)à ý’$IRÀúšr¶Ì~‹—ÞžKvù· fs÷¹#yÍ«¬-«Öâ¾JÚt8n’$I»úš2¶Ì~‹ÿ½ý [¿Ç‘É4ïÔ†ömëªÖâ¾JÚt8n’$I»EUwÛ†‹n¿§º«Ðáò¸I’¤€ …Ãáðá®4cÆ ²²²¾z*W‘ϲqOóôèÙ,]›CDj&mzžÎ.D³øÙãùÍÏÒø×7Óvö+¼;ã3VÔ¢Iû~œsùùôΈaÇ€m)›g¿Æ/ObþòMÆÕ£mß\tÑ0Ú%G@éj^þÕõ|ØïOÜ\÷þöèBgßÏ}#3‰*YÏÔ—Ÿâ• Ÿ²j[ D'Ó°}ξôBNlè›®æÉU_¢Ó-Oqg—-¼ü«_ñf³;xôÆÎÄïÜþÄÞws}É<þâD–d—_¿C.¼’ ûÖ# <‡ùo>Ƴcç²|k4:ôåŒsãÃ;€›žâΞñ”l˜Î+Oý>]ENqÉ ;0ðÜË8¿_Cb(eåó×rÛõ¸öá;éŸòõpu‹þ}·Onǯ¾‰I|;åy§²võL8t_–­åÕë¯c|[¹4~<¯~ð _dGÓ°ã .¼ò,êÍ}ŠG^ÿ˜%›ŠHnÒ—s¯ù9Ú–ðñ=Wð·%½¸ã?×Ñ9þëý–²â¹k¹ñõ~üà_‘ù Že#*Úwì\wãV…× U=¶’$IÕ ò®»îºëpWZ»v-5úÊ©D8Ÿ…OÞÌm/}Fd‡áŒ<}Ó·óɨ7y}f]v"­ôKÆ¿=…%ó>dVn FߖѬž<†Qc–Ú¯?-“*XÿÞ=üêŸØÚèDÎ:ëz4,æ³wßæ­™%tÔ™ôˆí,óŸå¬eꄤvëKŸÞ=8®>,yò7üñ 49é\FëËqQløø}Þû¸”ž§ô¦cV_šoÂôm}¸ñžÞ2…øÐvŒÃ├޷>Ñ;¶?wíçÌXœ@ÿsÏçô~­¨X8–qc‘Ü0m’ò˜ýÐüáí5Ôëw6gŸr<é[§òüóÓùª¼„ºý~È€´e<~Ë=¼³©'Œ8a½š½ncGϤ¼ÇItN!1y+™Ê–V§pbãØ'=EKxù‘÷ØÔõR.Ѐ¨ÂEßNzºWÒ®¨ò*ôe.‹Æ¼ËÇ æ°¨¼3?8çtú7ÙÎŒ÷'0~Ü>Z›ÁÉÿw.ÃŽOàËI˜ðyýOêDfüRÞø¥‡Ñ»þΘ\º’·þóKšœÏ•#Z’*;âcÙ®Örž8hßEBÅ>Ç­ ¯Á¯÷wÐc›ìl:I’T=jüôžŠ-SyæÝ$õ¿•?]ÓäÀ ú·þ+¿øë[É„€A}ZQûÉÉDä&†èF}é]ç Þ°ˆ¼>½HAá²ñÌÌM&kh[€ÒCn§‰•´+œ?ÿÐ}9`gccûrÝÍÑ>>=[P:k&.kÂÅ·þ‚“ëE©½|:·Mþ‚-¥!t8™®±³™3ñ ;u$(Yõ!S6Gsü%=H‹¨âþp,KW¼}ȾÛwU^ƒwô>ô±Ñ I’¤êP㇋VÎäËp*ý†wضBÔ>~YIå,›½†âfœ|íwG¶˜&C8³ l[0Ÿµ+g±  ŠŽ#úP7r÷vÛ€ºa–ÏZ½k;´΀¯GÇ¢rê-÷ò‡¿¼0›•Ÿ~ÈØ©ë€0‡Ù¦P›“陾«"“ë’H˜ŠpÛ>ŸÉ:šsê ÌÝÓABÉt–Eò×夶¢Yl˜…Oþ“§ÇÌaEv1¤öàâ_]ÇÇ×ÚQwt&'ôN§táDç‡B–ŽŸE^íÞœÔ:¾êÛ©DÉÚª÷ed³î4ß¹¥P)µ£¡~Ú§}½b$‰é‰®€0„ÚqR·xòçLdy!@1+'NeK|w†ï¬épö¿ï±<’6ÎkðÀÇö)I’ô¨á#ýaJòò(#‰zÉû”™D½$(ÌÎçë›Ê¤4ªMäžË„âI¯·°=w+ù”ñɽ?æœÊv•šG uˆII%n¯ô&ù¼üÊÌ[²œ59¤5iIã˜#;gŠ©•HT¥‰ºœüÍùQŸ: {o;2¹.I_7«vWÿî ^xîMÆþ÷Þþ/„RZ5øLÎ?«™q! †Æýz“öÎx&,) {»eŒŸOÚÀ!´ˆ=œíì¯"ó¡û2\€ˆè¨ýÏ,#£‰<ÐE(‘¶'u#aÚl&~YD‡–«˜8-›äÞÃ9nç ]•ö€cyøm®êk°öŽýðØJ’$UŸúCÄ$%Åf¾Ê+‡=#}E>›ó!®y<ä¿9Ÿ jí^*\DNvÄÕ&1!LId]wç4‹ÙO1©$‘½ãëȽcjEödþñÛ³¨Õ™\vÍ•ôh߈ä(È™x+—?xdíª\qµã "—-°Gð//Ȧ`å’Z å§wåòâlV-YÀÜ)cyóµ¿s{ö<ô‹NÄ1ûÑ+m'-eshåÐ}Ê9’Ž ¡ÍIôHœÂ¬‰Ëɉøé9é 8¥Õ®Zª´ÿËÃosU_ƒ»——$IªijüôžØ&=hN6“ß]Hþ®)a¶ÏÅôÜZtÏdçÀ5«ÇŒgEñîuK×NàEaÛu¢q³n´‰ÉcñÒÒe’™¹ã_ä¼ÿÌ3Œ[[~ÀÎ(Y?‡%% ôbÚPp'Dç°dÚ&,ÊÖ2eüZžÚ‘ˆ¨ؾŒOæ-"¦][šÄ~{£› çÂ^ã¸ÿùßò‡œ³Ø:­Ÿ¾Ë[Ÿ$O"¡ÉqÔÞö8ÿûÛƒDþ0‹F‘9¬X0…w—CæÙÙ=¥<–¦'ö$eÌ8Þù]П†»/¨âvBû·+¹Kú2÷ð¿K-‡ô¢ö„÷ya4ûщ4Úã~—¡*í¿²cYÅ6ïs‘F•^ƒäƒöJ’$}»j|è'”HÇŸÜËŸ3Ÿâ©Ñcxâ£mÒˆ6C¯äÆ‹ï¸OÿÎÐÜÕ¿gà¢çyýÙØP\‹Ìã†sÝO/䄆Q@Íξ›ûë¿Àã¯åÉIÙǦѢÛ9ÜüÿÛ»¿×ªë8Žã¯í¨G3f?Æ´Ÿ¤äˆI:ƒUVb„#Šºëb»Ä‹BRØýðÆ dD°².L+Mˈ~(å&Å®ì*º+’ ú5/B¥ÎN73ÎuÑúœÇãøžïçûý^<¿ð>ŸoßÃ麼uÊÝv*‹ïË–þñìxópÞÛy4óÛ—eÅ]ë³ý±}áÅ:8’¯î¾5]«×榣²ï¹¡|ýÔ«\1ƒõ¶^‘;7?Ÿyû_ËÞ±=i˲Ûz2°íªìü¥Tç´¤²d]ž<“]{>É;Žçt£’…7¦«okz\šÉ/ÕîImÑHFO]Ÿ{ïXrÎ ŸÞqææš®kÕ‚ _Ë?f°öÉç½tmº/ͧ§:Ós{ǹÿÕHuæ÷ò"®Ýߦñ Nõ{³Áÿãã\0ñë‘<±ñ•Tûwg[÷ÂÿútþÆï9{v"­óª™;iF¥þã‡éßôQnyv8–Ÿ7Mϯþs >š­òòPÏ_Û[ÐLfýL³©ÿp0ƒ}½yzt|Ò”I=¿œ8–ï*×åæŽ‹û®ký§Ï2z²%ëjiüMiö÷4™ÊâÕyhÕ»~}{Þ˜óHº¯nÉø—‡óÖÛߤmÍÖ¬l›Þî0Ó's|ìD¾;oç×2P»Ò@“ý³M¥=k6?“‰½»òþî¡|ü[#—´_›å÷oÊúÞ•¹tš;B6Î|ŸcïìËç-y`ËÆÔÙJ Y1ÓLÍÄNô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?Nô@áD?îO=æ¡ÀpNkIEND®B`‚084_director_import_modifier_regex.png000066400000000000000000001174311516513262500363140ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/08_import-and-sync‰PNG  IHDRÿÔœ]×sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝuxTgÞÆñïÌd&îF” X‚† Á)´ÛZ¤ÛRYº-Õí¶ÝÊÖÝm·²í[¡P/U¼Hpww $q™d’™÷$ @Š&Ìý¹®\Ìù›¹ÏsžsÆÀG³ˆˆˆˆˆÈeÏx© ‘‹Cá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'ár© ©â¸·×¥.ANÁð¿9—º9Ôò/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'ár© ‘úÅäêÍ ­#¸µ‘í}-x9ÊHÏÉ'ew¬?̆ÒK]¡ˆÈ¥çÊ噌;RŽ£†÷„Ò·4“Ÿ³j~ÿB©3-ÿ>Ñ XïMæ×(Ó¥.¥ D6Œâ…6„×™5(8²™ýï¡ :”›^[F~GS9‡þxŒ¡C‡2ô¦7Y[|Žó,ZÉKÇòðÄ Ê+ÿ=ô_H+«œ[ÖrF?1’aC‡òïYY®}‹C‡rï·{°ã¬/?âÚ%ḷ×I¶¿wfiÿhúy]¤ƒÎÈô{zḩ!ÍuœW2Ù¨ ËÿÖo;6`@+.¥¥.3Ñ8$QZ±þ¶ö¼mQË’ˆ85¿°F̸¾? IàÑ`†Þ%庌σ'¿!éóù¬‰Œ‰âÙ˜CLܘEºýR×#5)]7 yéâ{Â!UžÉŠ”]f¦&o%Äa ÁÕPÎÁyß2e»7WÜõýÚûà’Õøfùx4p«;gßuŽIËvók0`tq!64˜ûšÅ2#Â+¾ßÊŒ’ \‚ÃÆêýyX ­]àYÕ"›4gå!„P̸ÅÛyjC6;lgØf7Oµṅ‰<~u‚§¬dÔžRÊ/qÕ""›_X#f jH#`ôãëà·õ¼u¸¢…? <–”AÑ´5fÞ½>û¯xÿWÎ7…¹í¦¤ßÛ•BŒ§®·rúš3ï¦nØîíEÁmø¡ý‰]–ŒDÇÄðëÐÎäÜÛ û™ß;’nnóBÔyä׆þ- lš¾šìãb9—Îb¯g"ýâ<Ç^ÈŽióì?ïàÆ¡Cq烼ðé,ö;¥,ùêuC‡ßÆýOÿ—ñsµnÚö1îþ¡Œx{ÅŽ|=}#üv æð̈Šn?¶Œ <4ô^^Y½=ÙFæÊyëñ{¹uØP†Ýr/O<…-ùöjÓÆý?ì 5å?&•úòpÿž®*¶öµÔÆIõÌôMNdIr0®éû¹?e+/í…k:·fj¯Ê“#MãØrU ɶ#¼2g ¬Ë'´E\KçzPª1øÐ?㖬̪v8•e°dÖ>¼;ö£©Gµá…lóÿþlYQ}¸åÞ{¹±g§ÿGžøŽíV”g0ýµ‡y{ÂL ƒ¸}Ô $‡¤ò㳡¦#ÖàIû‡ßãñ~þàÞ‘¾ý!vñ­á +ãÀ¯òÀk?±É½CîºÛ¯lLî¬Ñ<ýô·l³V|8È_7–—¿Ø„wû>ôlæ¡x3cž}‡_·xÑaÐß¹çöÁtðØÊÄÿ¼Ê¸]—_ü÷ññ$È+*;zÂuÒ>ÆýÙÆœÙ»ð·j'î&OFĹa?ÆOy5µ½œaº¦Rfî,¿@º{T}7¿ºX<ìRÑø`öbp°ÂôC¬®/7}˜<ã ¶#¼¾ÃJÍŸxUìlÙœÊ|Ä5 ²ÎˈˆœoìÙNòÔ×ÉØ`!ð¸Á x}üZžN·]´àõ¡Ûí7MÝÉÜR`O>®1AŒ )äñI[ø$ßäp(8ˆ…M½‰4qô,ËÏžAŸ_·2» /v³â†F¼ÐÞ‡ïVxòF‚;YÛ×ÓyæŽ8ðÝÁxv ŒâÕ˜ýô¯ÜZþ L¼þã2ÞªÖ+§ÀÊÞØmìÍ-æÙWŸ®ô„¹Ó62j§ ðåÎ<u ¥ÌÍ„;¯3ײ»ö«ëÄz;Q¼ïÆž5+é³(ŸB€­™lríÄ„„:¬ÙÊB£/uöÇ”¾¤‰éì¶dðÍþ86 Šâ¦û鱩¤žõÝ5àߟ֖·˜±"“>C0e‹™“æCÒÝq_|lhû‘E|=õ ^ÉOòÚíñ6ô&¹é[ÜÿÖ¾[þ ú•Ö—1ìm^¾!¦¢E³oÚù<È““jê?dÄ- ÁÞf0yÖ€@W(Ï=~(Gáz~øn=ö–wñÆ3ý 1ô¢G§<øÂÆ.¼’—zT [¸ÍÊuï~À hW €mÏDVghù¯G¹»‹7 w—&øŽY€1ߊËE½‰èü1àåf&ؽâãÐ`2Ó(4”WzâQžÍ‡»K(£âìíÄ}ÞàpÆý¹çÎtþ°rU3/¼÷縆òW/;3!½†ìop=óqrÅÞ#ìíÁõÁ.|^PFX˜?‘¥y,°ûãÇî\Êýèfq°h[¹'Ϧn2¹ÒÖ ÈÎaëiNX & q~\MöZ!ÙÛÁÙx–ÚØ™SB¡z‰ˆÓpp`÷6’§Â‚+ÃhtÒÛ¼1a-O]äàõ åß–y„µU ˜;ÅvÈËf^á±ÖÐì‚2Àp\ÈÙ±q? «ÝXœu€73 $ŸV!´£”ï×åT†í ‡öíç·‰1m>¸Ÿ¯ÏòL¥…ù¬µAÏn-x;>¶ž&(:Âc36ñÔ¾Šíø'j©ê  ¢ E|¾¹°"ø`cê¬å4úi7«ÊÀÝ/ˆž;³×fOµ=0'#¯ó¡}Œ''t© Þ­¸¢­+»f.ãp9€ô…sH÷ëLŸX·ã†µî]În‡?ݯjUü ø¶¹š$¯rv¬Ü;u›È'ŽÁýëÊ`p£ñÀ«ˆ:‡:KÓV°±È…ø«»|ôaW<› g°ƒ]+öqtWnz=£\îë.þMˆqu°iÌû|5m{²JÀ?‘[z›ÚøÔÓààÆ£×uáÐÈnÙƒ·&±d@Cúòx{ÚÆT;XNØçk³?{”äòij9þ ÐÁ `¢u³`"mGx_Í÷Ôfº¦ÜL¦IŠõÄ:4ôÀš¾Ÿ÷ö•îOŒÉ@xxÑäñ}†í¢>Úí\UíK§«Ùá0Ò9© k‡¶äfwÀÈè!íù ÚG}ZX‘óÂA±µ”œš>ÿÊÊ8Tb¿$ßu¾å¿Üî8ù‹Øn?ã#æ”?Œ£œ}eàëJw3l챞0e»=VðñtÁ\9vqQ)g¹eìÅ™Œ¿—»Dqwîö¢|~ß²§Wb³ ÜÜj_ËIjHvÇ×kÀ×Ó ØØuÂôËl%쩜¬«+þpe·šÏ> ͸yµ^ò:ÂàAó~íq%…%¯dpp: æeÐõAb\aßÑ”P†!Þ'&/B¼ 8«€B+¸5"ÐýøoòÅÈ?Ë2í…™RÆš7ÿưšð/ ” ,~þT¿ Ãà›Ä}/ÜÅ÷ߎgúg¯2ñ30øÅ’Ôg07^ß…ÈúzÏ¥|7w+_ç;É/**f}–õ„{8N>F]jµ?—±xÓrr[°‰9‡<¹­±+™;Ó˜ЧÕjº¶<~J+ãÎðš¸ÁÕ!6,ÎeaI>¶¦tó8@~Œdî`ι>böb*/eC ôñ%μŸ]§zÒ’ÝÊW3×Òàšö¼Þ ¢miÓšu ^W¨'&‰ˆÓñkÄÌA iWÓW±Ùw®‹‡ß6ð^æÅ}ÎÿgËÏËlÇb³ÁD˜§ ØJÉ,¶PŠ+ ]O¸¯ÚèB”+d–íÓj·ŸËæpu({ǧs¿Ù•øP?®lΣí[2ßÓFlJ6V«­ÖµœÈÅl©v#bMõ:(´–.DX PíÆU“Å^2rŠ)¶•’ßg¬ãÅÌ“c½¬„¬³\—–ÏæýHô|‘Y‹0 q> Òµgô 7!°xyáB&‡ Êj¿5a/$³ÜyâàÖ#dYPí ¼ “‚s¨Òèî‡^$=ø,Ãb,'½o°øãU¹ ¦/ÖñjÒŸ;ŸëÏ%Y¤nÛÈê…Óÿë»<“õÿ»?áø›Ëër¶¦góljI¿'£åµÜŸË`bIW7ó&ÔʾÙwÊ“¸ÚM·ŒUÛó(iÈÀ0èn±òm†#¶L6ИÁá¾ز:›´úôˆàò"Ƨ–òHË@‹ueææ’S~.9l¼5e=a×'0ìÐf®X’C¶ZýEÄÉTÿöÇ}mÛ)ÅÈÑoz³ÿ%9¨óÝ~ÎV«Va´©vjãê׀Ǡû@6a5®Ü˜à‡µq‚##âæ`Õž¢Z·R®]5¨Q+vÞÖž‚ŒØm%¬Û7ænâÉÃìE¨ ³jSKÅÕ?osµî&fzµôÇë õeÌbžÜÙ̳ړ‚LtîÜžõÛÒÃEÙY,-3Ó5ÔÈþìB6Uþm-qãή±Üåo¸èýÑÎ÷¦ôëèMúœY,™¹€CÁÉôŒ>9`»F'Òˆ,LÝT­_²ƒ¼µ“Y’o$¶C ‘ñ­ðe¿ÏL­ö$ö¦Leï9”h‰hOœ¥€­ÛK Œˆ$2²â/Üë 3¿þšiå§8Pä/{‡ûF=É{l\h˜ÌàQrS,äïÜENýºQ㼨õþ\šÇç»mÅ„sGë BrðÅ‘SïéµnöÁƒ,sxrg›PbKrIÉ·SV”Ë”<#=ÚDÑÏbå÷½Özö4¦r–®Ne™ÃHï-y(èô?Hc·fóÈ/Ki3ëpý:É9j þŽÞ¿„ØŸTyp¦ÏÕóé²mùÇ;šÙƒÍ¼¶9—LWþÖ!œÖö\\™Gv~OlˆfV| {yo1F¿ J Æ'gÿÞUBùiW£¢µÑÝ›Q¾Xä±ÞzòùZnV.Ý›ðì€æØVe²Õn¡MD÷æ•Ùì·CYþ¡3×R‹ŽØ¹«q3>o¿“/@³FÑ<^FñÎßJ²Óø÷Žp~NlËL·½Œ>PŠ{pž·°cí^fZÁAO­ÊgeRæºîå“}V^Þü¥E$׺bØì‹÷ø©óÏÆ}“ð™3Oÿ€Ð듉¬áéE¦ nŒø;Ïÿñ*OÙ‡rU»Pìé+˜ôóŠÃqs'Ü-ƒ¹!a.Ÿþø$Ïf^Oßæ>äoMá·”œsº'ÂàÝ–¯å±^䙂ëÐ62w°*e Ë »ð¯»½0Ôxk¨èøæŽæ§·?Ät]¦öl\ÈÔ]9¤5õá³Ï3‡µ¶ûs9+6gr¨y/7†µ ²õ4'Kµž®5—2á£pWlûްÑPÌôtO5÷Ƴ(ñ9õå¦3b^«{ðæ°´Z°g6ç°¯ò€Ñì΀øHzçíã©Vl%%œïŸÑ©û ˜-.xŸü'¬åÉ4v¶WÞNlÕû&üÌï9ÿ—møŸ?k _…7âßÃhl.esú~nš·›rì€ÙóWÒ)«1o·ç?M-8ŠŠX²q+Ã`ãz~œÌΖm,ŒkÈKW&8i ƒSO¾nËMcÈd#ïvŽà±^!xääç1~ñZžX[@E—ß²3×B ߥl¤i¯Æü£SK†”³85ƒ'ÛxeHÌéW„£”_f.§ß‘¦¼Ö²!ŸÅ»P\XÀ”¥ëø×šÜÊ~üå¬]±†øÜFü·C8ï4sÅÓVªÔ=\·8•ñõüGzÜbûÒÅ/…i9 è™AO.5xû›¼9–±S¦ñåü\ð‹ ®ÿ=Æ=ôã2*þ÷Ïy¥§Êɘø(÷M­x#æ>~c Á¦Šÿ–e.gܧß0c]ùe€¹-O|ñ4Œùï¨ç˜_àN·ç>ã¡· U½ˆˆˆˆHÝnùwì]CZé /Ú±qOIÃ×9å™Ì}ÿm~]Uül6ì—´(qVu:üS¸Í‡ËŽ{É‘¿‹ ‡/Q=–íkv•ý¯WËÞüepWBëÈõq.u<†`ížB®ô¥ªçuÿÒ.iM'2âßq$`ŒÞñ©:¥rØ)?ÚÌïKçw0²™kÅíÑ\ýÏGH*u‚š/zå""""â\êfø7àÈ$Ëî uu¥Ý}©ˆÌ6oÚE1ž„{’^tª‰Ø)J]ʤñÓX´z+ûól€ïð&´îÜA×t'ÖÛtòh+ûýÌ·¿Ífõž\Ê\ühÔq 7ßÒGó)ãàœÿã­Ÿ«nø'_¼ìÎÊgFòî–êÃå2ó©Ì$Š[?|›kýR™ôß·Oèó_­žò<¶Ïù•_§-fýî#XÜ‘Ðù ®Ò›8Ÿêµ—°åã»y:%×ÎÏòù?Xöͧ|Ÿ²¿‘ðjÿ :~™GDDDD.´ºþÝ"hœIÊ(ؾ™Ì²–D¸ŽBöl8X1L@ÍKNþm¤§ü—g?^BÎ ¯ç§ofᯛY8m·½ð(WǸ½ª€#Ÿõ_=Ë÷ úe9ì^ü/m^Cóã{ ]8¥ûùãí§ø|UaµXìbùäOX>{)·¿üWF»b¨iüòÃÌyïm¾XQ±r|j>k'S7ƒ ^ĶnPñïkÙ]X™^KÒY»¯âßnã 9EO™’?òúqÁßL@Tc¢ƒ,Ç*\ËØ×¾fSQU2v»âsÞ®ü1àéïU°s¶°¥ ¶õ{Ðúž7xí¹‘4?Ú@ïNÇ»_äµ×¦GàéV{)»y«Zð÷ ¦Cz'·%²²ÇE«ýæ8vXkNõ%›~dìŠS^'U7[þ1ܪ)ž2(t¤²&­”î¾®”ÙÂŽÊLÙ.×5ŒêÈaÅ÷“I¯ú¿gîxé!D»ap”’>÷#žûp!ÙG¦óý¢ëx±_ÆòÌþ~!GÛÚCúòÈ‹wÒ9È…ò¬•Œyá5¦Öúf^iP€ (°àݘ¦M*|yÍc:ò×ñóäªy“üø{ü££F <{)ï?ô €Œ)ü°òžîæwrëae>-¹â/]iâOcˆˆˆˆˆS©›-ÿ€kD;¢ lÛœIŠ÷®£"ï‡ëSsñE;™¿ÉVù-n½“þÑ•]{ Â{ÞÁ¨NUÏÓw°mÁV P~d óS«&âMÏ»o£SPŹ‘) 7ÝÝ¿ ³¨Ç)Ù» ÖÊÿõæÚ¶~G—ÓäßžA}‚*ÿgcÓœíÔØ¾ïÒŠ{ÞxŽQCÒ3¹íÂOÑ=HDDDDœJmù£W,mÀ–p`í ¯"c]jÅ3òÝb‰uaw ã•eï!ýèoÄЫ] ÇÝÖkð"®s ,­¸מ±“̲nXnáèOŒ¹ÅÓ³©ÇqÙ½Q2mdNàÑ'œrh[Úv2mñ<¡û“¡Ù@’‚j¸™YDDDDœZmùÇD˦ž8RW“V”ÍÖmyïE¶#Ê­æ¶lGi>GÌè…ßIðøT==(ɧÄåÖ|ªÜñÀóÄìlò Ðó\¨6ìXó¬g¬JqÅ5üb˜ÅÛ5õ‹ˆˆˆÈ êlË?¸Ñ.üÍ8 ¶³yÿ.6WväIhŒ÷)N[ ¯cÁÞ^@ŽÕÕ“°ƒÒüÜc'O\`´xbŠ×‹³):±O¾ÝJNñyY°Ó0bö¨ÖŒ9Œ§îm×)‚¼ÁìK¤¥Æw.Dq""""RÏÕáðoÀ«QÂØL:é,_¼„Ì27bãC1ŸðÏ*.þ1„™!ݰ‡¹«Ð«oб®?öÖÏÝul.!±¸€%¤)!,a@ñæí,&>ÞýhŒ.Ù»ˆ5ùhQ2ጙ}ج%ø6jJ¬~ÿKDDDD΃ºÛíp nIEÏ;¦.ªŒû‘´‹r=õHMHnY•–ËÙôÕgÌLµV<¾ÓQBúÜÑŒ^]uS€¦É-ð6€)¨TM$ÙŸ|Ųг ÊsVóýÇSÉ:ß X÷Ø.4©Ú*™)Œ_ÃÑž=Ž6~õwŨQwó蛸à#DDDDä²Q‡[þK혻Éqìј!ñ4>UŸƒo¼’k'P¸’ÏÉ/ÑÑxígofɱaƒ®àæî•WÌôÖ– ¬¡ coÝ‚W€'ÅYù§z2çyg Hbx¯oyaVPÈÞ:ˆ IDATÂ7 =±#<ŠHß±-éUq¿=z6Æý"Õ%""""õ_nùÇàI£6aǽäÚ(žÐ3tƒqmòWž¸+©Ú£9md¥î<>ø{wàö'o¥ÅÑûLv¿—ô ¨6%;UÁßFøi.8œ7Oâÿö(ÚT—±{Å\fÍ[^-ø‡Ðû_Ïó×&£ ¹\Ôí–\j‡éTý¸nTû(Îy-Dô„ÿÆ-fÒïÓX¸féùe€ ¯°8Úv½‚A×t£‘× ç>¦ºÜ÷¯5ÿ&.`}z!v£7ÑúsÈ$ö¼þo~Ê8ï yƒG3†¿ôͧþÌøYËÙ¼?f¼‚ÂhܾW_Ó¶anº­WDDDDþƒÃápœíÈË–-#))é|Ö#"""""HÝîö#"""""翈ˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'Q'~ä+;;ûR— """"RçùûûŸÓøu"üŸëBˆˆˆˆˆÈ™©Ûˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_D€rެœÀW“U^ùRÑJ^>”¡üBZÙ%-îÔ°\—»Ëb»‰ˆ\.—º€Ú)çÈ‚Oø`æá“Þ1ºûÖ$‘¾ý;ëS§œ¼mKYy$„ÄNMðþ“§_%;äƒ9qÜu{;¼ ¦BçTÆ‘•øiE7´#À˜¼i”‡- ×z{¼Õ°\—»Ëb»‰ˆ\õ!-WãN\ï~´ð©HÌŽ²b²÷odùÚ|µ;“[îDc÷K\âÙÉÛ¶ˆ¹Ûâi–XûðoÏÝÈŒ™zRf=ÌÖ%Ó8PÚ’+zFáza q^®qÜüÌ«—º ù³´ÝDDN©ž…"Z¶¥]pµ¦«ŽI´þŒf®aþ޾Ä&xq96ô̾„ûîaõ’T¬i,Ûß…Ä6î—å²ÊeÈ^ÈŽ_ñÕ”•lOËÁèI\Çk¹í–Þĸ°g¥ðÄ]ßõïÇh¶òg¦.Û@j‘Ñ-»3ìŽéÜÀR¹¯ÛÈ\ù+_Ž›Ëú]‡(v ¡Y׫¹ùæ4÷6‚mãz˜yÝ_ã±àI¼ýùB CÞã¡‘¸”`Ѹ±ü<{©¹¥`ö&¼e2CFŽ GX“½1©“yü¦)$<>–çÚaÜC1>æY>¤5î•ÓŸÓù%ŸÃèæ°-« ÷Ðúޏ‡]C0”ç°~ü|3}5»²ÍD´êÊ á-˜÷ìáѱ<×ÑÒŒ%ü<ö'f­K%§ÄïðVôþwnìŽ{¿û'ÿÂ?ÿï9’ýªŽt+›?¾—g4çßÿ÷(‰^œ~:å™TÓruô8óº,Kã—‡$%ñIFº§ðˬ5ìÌ2ß›÷\OÈê±|úÛR¶²âÝ•áÜÍÀ†¥,}õ.ÞÞÖ‰g?yÖGclìùöŸ<ò›ûð ®n`:‡mý´ëŽÊq«m·ZìƒÔvÛŠˆÔs¦çŸþù³9--ˆˆˆóXΩ8(N]Á²]%u$Ƴzs¹WK.ëV¤RÔ†Äè"æ}ø6 ›“=ƒ1_üÄ2G+:Äxbt“¶b*¿þ6‘IS¦3åFvg™iа^.y«øìõ¯ÙIá≌Ÿ0ɳW°)5Ȇ„¸Wt”‘»m.ã™À¤‰0sñveŒŠÀ×l€²CÌ©©†èR–}òã¶—BÉ~VΟÃÞ°Ž„­ý˜·¿ÙJ`‡6„Zª¾äKÙ;á]þóË>Âã òð!Àõ«×m$ËÜŽÝâ¡ô/u£Mcã©7`juC¯íM|`k&ç·åe´ë•@€m7)²mí©+²²$· ¼úW5öÃÝÇÆiÓØêדk»†b¶WLuÚ–mõ yø\Û½ öMÓ™1}3ÞÉ}ˆó*`åÿáå‰û é>„!Ú˜½ˆï¾[ÂáòR‚»_GÏ€Œ~üU&Š ÛÕ×2°S#Ìé‹™>e9å‰ýhíoÁÓ;›ùÓq¤ÉzD¹VœüX·1îÓ?8Ôn$#{†áR¼ùôÓ ô"¢C ËåR^‹u™ÏæiSYºq›Ë[sͰkIŽÎcÙÌ٤̘Æü´\ñ×á lãÁî¹³™½Å‹ä~ Dºogêœ ØZ¤she\¶íeÂ'¿³-úF1†²³Þ–Í}vñåi× ì'l·ZìƒUó;í¶ý³ý4EDê zÖò_%Ù‡(½]1R 8(Þ=o3²ñmÚŽ¸(ŒXÙóǧŒYšM@Ëdúw Àqd+KŒç“½G¸ãÎ~D8ŠØòûWlðlA×ä«è`ÝÏš‹ùéã Šï½™D8²ì[>™²s£$’¯ ܳ¥ó§2:5;Fõ'ÒHÍ5Ýh{Ó=xÍÃÏ»ã~kO"ý=ððm…ßüŬÙ[DB+ÏŠÅ*Mgõ–BÜâiXÑl…5×FDÿè×¼€Å³ooõù‘:Î~d_O=ˆWò“¼ö@ûÊ{Uz“Üô-îkß-ÿ O·ª¶ÐÔ›ç_¹‹xOП¾I¡<ö¯øñ·íô¸¥˜¾[½å]¼ñLBL½è‘ð)¾0± ¯ä¥•ÓÙfåºw?`Pteh.KgW¦ͯ~€ÇþÖ²¢%˜Þt LåžÏ·sÀj$6(”`Opñ"8¬ÀVó2ÙpÓ‡Ò'¨¢A U`:kŸšËƃ¥ ,ŸÎØ9ÙDÞð.Ï‹®h-îÕ¦ïÝÏk‹*Æ/;¸ŠÕYZþëQîîâèÝ¥ ¾c`Ì·âÀ‚9¢+ƒ~gêìÍté„·Šw¤°<ß›¤þÍðlgœŽž5,—£pý™×eÏÊ…uíʃÝLKwtŒÅ¶b9îˆæ–'ïçŠï®%<µ`'GlÂZ]A;ו¬š³“â„xÜÒÔy,Ì4ÓæÖDŒµœÿ)¶¥mÏÄ3®»ÛDj³>ÛùÌÛöê°:߯TDäŒêY3†ÒâB +ÿòްÓ~¿ ›K,IÍ|Ž.Pñ¾R:Ýñþ~õ$ÇzBîf.ÍÆ=aw ëK§víèÜï9®‡“²µ{å¸Vc[Fü}(}:u ©ç FÞÑ›`Ûnf/H£Ôº›Ù³vc¹š;o¾ŠnÚ‘Ôw8wÞÖïÌELÛ‹ã50áæ€Ÿ› Lîøàc1àÔŠ–¾åì]“JQå¸%i«ÙZäAóQ¸`Ä;®7ÛàâMò•Wð—zÀºw9»þt¿ªUµ›Ô ø¶¹š$¯rv¬ÜOIå« ®ø Í=E7Kt_ÇAîÆõ¤í]ÁÆ"â¯î±ž<› g°ƒ]+öM¯¢gUk9€K8W>þ&/Wÿòâ,ö®›ÇôEé€ãè±_[†¸+èx¬û¡É;OØvr·,'F\Ù;òX7ƒ7ñ“ð®*Ç¿ 1®6yŸ¯¦­bOV ø'rËCrSŸŠºÍ‘tëˆmÓ¶:€b¶§¬ À·3ýšº×~:5(M«ýº4Åt ¡{å” nøùš!´--Þ9lÂ3Ðvp€Á£9ýÚ»S¸j»ŠJØ;gGÜ;pUeMfþ'n˳Yæ?³žzÛžbeŠˆÔ3õ¬å?›…£ßeá‰/»FÑuØ`Úú¡ê±n‘hr¬‡fÉÁ­À›bªu•1àÙ¸3ÍÝ·°eÛal +^ HìD´Û±É›CÚÓ-j6¿ïÙMæÁöXM4êÜ ÿj·¸Eu¤µßJ–n=LikŸk8%— â[ú°hÅö· ™{ i«¶RìÙŠöJøRŸ9(-(  /B¼Oø¸1yâÅY…T=Ò/—ãFcp'0Ø!/?›BÊXóæßVÓ¬ü (%‹Ÿ?nÇ¥@…»f1îçY¬Ý¶‹ý9F¢e9»ö‹'.5&ër 3 ÁJÇñÓ6yãUµX¾IÜ÷Â]|ÿíx¦ö*?ƒ_,I}sãõ]ˆt3¢ºw&`R ³·Ñ¡ùRVЫ/±®f:'³fžy]:B0š]Nn%2™1êÌÂàI³~íñX¼’9»­´jœÊœÅYxw¾Š•'vµšÿ)¶åŸ_æÚó;å¶¹<Ô³ðïEÂÕ×ÐÆ¯*0{âû ¯3{yq´û<ÊŠ‹)Ç¿¾1zàç%ùÖ£­^Až'W|}]!+¢¢|¬”³ã‡7x¾¦½‹(ç†NÇLp|K|¯bÍ~+Í¢ÒXµÝŠO›ö„Yj3¾H]eÀâå… ™.(‡êG–½ÌBpk䎑 3 ±ãsl(‡•œ,+¸ùâéáÀ /’|–a1'‹?^dUüÛtüqnÏZÀžþ˜ÍMó÷î!±eÞ.3çIîøðì–«fFÜ|ÝÀžÏ‘";Tû¼)/Ê:zeŒx5éÏÏõ玒,R·mdõÂéŒÿõ]žÉzŽÿÝŸ€;`‰êN§€ÉÌ™»LC «Š‚¹¢wC,r:'UéîwæuiÈ9›€G\?=²bÎ.rŒóX’HÏMŽÖR«ùŸb[þùe®í>xlx‘ËY=ëöãJPÃ&4iRõט†a'ƒ±ú¢pqwÇD19Å'\à·“g‹‡ëÑ•a͵rÜoá8JÉÏ/‹'®n^Xp'~È]Üwß}'ýÝ?$îèÏñ5œž9$žæÞ¥ìZ»Ÿœ}+Ùnõ#¡m¨ž.!õžkt"ÈbÁÔMí:á oíd–ä‰íyôqµû¦¥°§äظ¶´Ùü¾Ùgó¢bÚg)`ëöR#"‰Œ¬ø ÷:È̯¿fFZù)?ÐJ¬b[©oJïÖ‘x»ÀžË¶Õjþì{x˜ðoÑ–vñǼôc· 8 Ù2c)¹•SÏ_ö÷z’÷Ø0¸Ð0!™Á£ä¦XÈß¹‹œª ×h’;úQ¼z “'®¢¸AOzFV}*ü‰éœ°\–ˆ³_—µâÞ”~IÞ䯘FÊä¥ä6èKŸ†ÇBþÙÏÿÏ/sÅj¬ý>("r¹«g-ÿgÏÒŒ0¶³aÙ^z_WÕå p×R6‹ ÆLEKס«8˜ÔŸðÊïØ²Ì5,Ü îmj%Ò¼Š}i6|ÂŽ~a8 ¶1m è8ˆ^5Pƒã†9”ÖͽX¶~)K‹öRÐ…6ÁN³yä2f êÆˆ¿óü¯ò”}(Wµ Åž¾‚I?/¡8|7wòÇX\9ðáßyîÙ|®ï×ï‚mÌþu{]š3rHsܽ˹ñúXûáEž)¸žmC!s«R¦°¼° ÿºÛ Ce¼>‘9(ŽÃ|ù)¡}3ç°mñ4fo.ÒX˜²ŠÆWÆct1BÞ֬݌¥y³ãºÿÕ–9ú*FtšÁ{ß=ÍË9CèÕÔƒìuS™°Æw Ñ-ðÍÍOoˆéº$"L9ìÙ¸©» rHkŽu9w¥aŽøM›Á¤uqSòÑÏ¥ÚOÇpòry·­ÅºÌÿó ”ûvÂwöL¾_ 1·õ ¢ZK†¡Vó¯i[Ör™Ohã©Õ>Há9,¯ˆHýá4éÒèOߤ…Œ]ö-£í=éÔÔGæVÏÛDIP7úµðÆXÕ☳1_“Ü>ë~ÖÌ_ÁAS4{Dãêa§Orÿ7ëk¾,îNbã yil[µ”­Ö– ¿ÆÃ¾D &¦±sç^\¢£ õ0fBZ7Çkù ï‚ ¾ :ÍÖ‘ËšÁ“øÛßäõȱŒ2/çç‚_qýïá‘[úT<ç¿2ü·¸ïEzmþŽß¾™EF‰‘-®âÁ;GÐ-Üp!fÈK¼ú=£›Î˜¹Y”¸Û~Ý<˜ŽþÆS>ÇÚŸ‡É䓯§óËèy¸ÅŸ<’wîsgæ»ÿaÊäìèÑ–ŽÝûÐ|ÞÏüðÆkì|êÿx<þ,–×@·߯òã§|7û[>šáCl‡<úb?þó}\] ˜ àÑ'­ŒùöƲb‡ Ï&t¼ùF\Óˆêa\cz’è;ƒ™¹ÑôíÚà¸íÚMÇLĉËÕÎýÌ벌sâÚ¨ýf2-7Ž]BŽïJ‰ëÙoË?±îŽªÅ>xªù‰ˆ\n ‡ã¬¯p/[¶Œ¤¤¤óYÏ)”sdÁ'|0ÓNïûî¥gði~Ÿ¾ìsþ÷?5¸• =þR®£˜´åÓ™¾tiG Á+ˆÈæ]د Ü*Ÿóÿî̃GÒ&5…›ö‘eó ¸a<=®êGBPUÓU)™ëg1uþFöʧÔâCX“öôìßæþæÓ×”ìŸÍ·ßÎ%µØæ7?Ä_›TQšÊÄÿŽfea(W<0Š®§YN‘ˈ=+…'F}Œë#cy±³ç¥.çÜ8l””Ø1Z\1Wë»Rž1Gþ1‘V¯~ÄMÿÄÍ<凘òø½Œ6ÞÁÿ^XùXL‘³SOÚ–Mv¿ç»×bP—z=ð<½jzÏàNDÒ Fžé|ÅBûko§ýµ§€ „Ü’0ðÏ׸FöæöÇ{×0ž!Þ€oZúé^¤>*?0™Çø×QŸðÚA•}×Ë9¼b>ûLQ «ÍÀªOïà"fî1wO"AúX‘sTO¿s(ÏÞÈÊ ˆº¶¾õìVl©` íΠv?ñÑ—ïð•Ë t7¹q:ß|¿Ÿ^ÏÐÚ§vO“qïaá쬟ý3©n‰<šXߞР""uÂ]P’Áú5[Ù½f‡,͹¡Ù©œGDê8S½| ûwcømìkL*tàIÓ«þÁÈ­ñªåÁí°îgþ¸Xiˆãê‡F‘è«O9w ÿu€£ô0ëçÌf›!’.CÿB3O}É‹s1ôåŸû^ê2΃g,}ï|‘¾wžý4ŒþÝybLmú:ŠˆˆÔ^=¹áWDDDDDΕZþEä$v»²²²£åå5ür’ˆˆHåáá««~¾¯& ÿ"r£ÑˆÅbÁbù¤‘:Oq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEDDDDœ„¿ˆˆˆˆˆ“Pøq ÿ"""""NBá_DDDDÄI(ü‹ˆˆˆˆ8 …'¡ð/""""â$þEä+çДG:th Ãqǃ¼<:……Ž‹_šm7_Ý=”Û>ØDÉÅŸûå§h%/ ÊÐ~!­ìÂÎÊž9G‡ã…åEvFçªr<<1ƒòK1§ÞÇË9²r?N\MÖ%Yù"u“Ë¥. Vù¬þüƧ9f,áç±?1k]*9%.x‡·¢×ð¿sc÷p,P»alû÷ÐCŒy–Ïi;€½3¾â«)+Ùž–ƒÑ?’¸Ž×rÛ-½‰q7TŽó0s:¿ÄÃásýöe•áš@ß÷0¢kæ×kånP¸ƒ?>ú™)+¶’nõ&²yg®»ýfzD¹U|fži{ÖjÙk·O:J3XúÃŒ[°‘Ô3 âÚÓPÂé»ûœÃv³gÕb¿¨ižg\'Ûmû_òÕ+Ù–žK@,‰GpÛ 6ÕZÐϰNÊÒøåáII|’‘î)ü2k ;³Ì„Ç÷fÄ=ײz,Ÿþ¶”m‡¬xGweøw30¦r»iÚgÚo:9˜öè}ŒI˜Ìã7M!áñ±<×ñä~"ÎÆôüóÏ?¶#§¥¥qË9•R2V-f«±5Ý‚ÓY›D‡¶ ª]V.'{Õ$fˆ¢[l»ûЦk<.€£˜´Sùõ·‰Lš2ù+7²;ËLƒ† ðr©œ€-‹M)¿ðóï™'áí{0(ÒNîu,úz3E@ƒ *áIó¿ã¶Å_ðÍ–F »ïZ¢¼0åT^¯„Ôä‰|ðã>Ü£é5$÷ô]¬Z2“Ofò›ß  à$oß&?ƒ_óxbÛ1ã 7£ˆFFÒ?.› ‘U>šó#õZ³ÿò;fWñHƒ£ùû=­ð23g3ß|µG«‡øçËdzÈ IDATh`èÃ5m?äÉW§òÙ²Aü©Å">[t†ˆ‘ÿaÌ-‘¥#Ã}zÒüÇøûòŸQÅâ4öžö%î†ÇyþÞV¥#×$Ñ-è |¼‹cùNš–.$'%Ÿ›ÿóC#mÕ~+çJ[þÒ/˜¸QOpÚ?òÙ{si:x'ï-u£ß北oÅ’s,IŒùÛC´ñ2è—ÊóÏ|÷SvÑû¯*ëåÌY_c^i¶Žõi&Z=ówóÁ$u‹ÁoÂRÌYù8±R|¢æu*÷ƒ#u9_ÌöIú—~Lkt”/-fë‰Bn÷¬~Ÿù â•?ßK¬@oz'óÂÓ_óÝäí\ûXpû³qZÍíÂ…ýøRÃÿñÍæBÝòoþ:2ªtŠf¿¾Äû>Éèé§«¯ÿÙ}[‹ýöj¼+ÇE¥7Žñ&i ølöIÜø^½;¦´-½‰Èùÿ˜ù#{‡þŽÅ.۽˶iëΓÏßI+OtnJÑšÕŒÝÉ]£ãÚ  ~{WòÒÒ=¤Ax¾ e_SÓqãà†¡„x¹›7!áaZê[øÇ„=*¦nß°vgñ‰þ˜’´­l8íE܆ض_Û™±…y«ÎàÙö~3¬yÙÈyÚ6ú–·¿]Áü]¹Íw ÷ÜûaîO + â‰ñz—OVdTY«o þž0{àˆ¯J*‡ÿü},\°GÔ ò{z„žÿrÛ'6‰ÒkPäeê?‘ºäMâ}Ð/ììËŽ“âÜÓì^ú?¦Ì}ƒqmÞæÙYÃÖ\7ÚÜЭÜÉ¿&¼â®£wÈ\f¬9ÀIçjŽ̓Iç§„˜|h30Ÿå‹j_E·† záÿTv·$/û6±tùQ Gùu›¦wãêƒ?@am9DA¿`<=[0ò‰!¬~écFoƒ ëÆpw{Ÿ Ê»özâÊïdìÇM±ß0vëfNw­²^®Ô¡8!†(›“ÕÞæóÌAôîÜšÈÀîz*á|×Ô¼NeùV³Ï@ÿÁ­Ë]´À„_ûHôN&yía ºú•.½–ÎAçÏÈ´ø„à…G Šx-Í<ÎßwoÜ¡q_óNÊN:o¯qºÒ®‚ûp‡¢¶‘E,whrþÜ,“ͦñôÏ/Þ¨Õ~+( ÿ?.*íŸq'Y)Éì§!£úE•k‹ñ¾Å{Yfü¬PxÀ…úõ.>³Du¢‰§é\Ÿøû¹ChZ›?dÁ+È œpºØök‚K—Öò¸1²zþÁdoBBŒ•¯Öm'½S7-ŤnÙHªwKn ·B¹ð_pb'Çð¡S—¨rSfLx5ëJœçv¤çTàr‰àÚ„ÐróJ­4ìÜ…+æÔºžE§w²?ßBt×ÖeÁ¿”Gãδó_˪§(lç[º0¢ í\lV«ÈÕÀ“†­;Ò©Ò ¿]"É|ôÌÞFV÷XsN“C1þï^n©ª˜€ ΜÎs(ÁöŠ“(,>!x×T çÅR“œ½ øïälLÙËát3‘Íhl½pÚ‰Õ?f8jlK6…Nð4™ðŒÄfÓøxOI×¶ ò5 üùQá‚%&O‚B<áD*9ŽªëåJŠ}{ðè«ñõĘóÑkLûLþMIì{£†u#ÂÄÉ/±Æu*rR˜M1Þ4ð©ôVcñ¦7ä¥åPBiø·úzQ›¾a¾•úăÀ O8–I¾£æýéJ»jîà 2ÓóÁ#š ÏŠ°ø„â dÕÐŽÚì·Â²Cù¢ÇÅ'ÔÔ'rÓ²B}*^ÇâHƒ²/aò\ª_iø7»»]8ÝÉ⎥šýíRÛ) ÿµ=nDŒ¬Þ…ð$²Ssl_®g[z"=ýRÙ¼) ŸÖà ³ÂÉsë9)ÎË£Oü+Ìvü=¡ +—<[!XÃðµVzÁ¶`j{iG~ù”°û›2¦ª|r)¦4ü»{{cÕ‹—•-ŒØ˜ŸyŠxxúã7‰O¾Â-Q~Oo²úaYû#8²HÍu@¹ÿï’Ü´ÿgKò2È«æ1GÚRÞüãûl¹‰„„VðqƒôE£ùÍØJõ°Ôü3)æÛ€wéÙ•¤'Á×{¬X3壹ô3˜ðJ¯Ð9§spP.ì:óIOË?<ÌU×˵:˜±Ä àÁ? à7iLÙÊúesøáÿáå´?ñÞcmñÄŒwëT(«·7nœæTv ”§ŽNç€G´g¹PX»Á¬Y”à]®Or9}*¼BðÌpeÖÜ®šûЇ⟦B~*iùN(÷ $û4Ù.´£vûm%àÚqqVÍǸ —´\øžßo޼“>å  aV—ê—îBË/äRÛI;{¯VÛ1²zù#_;ëq’õ[Ò(8½™Íg|iÓ¾ò!L¸yzb!ôúè·Ç†Çž{£4™ëån¹ãÝ9Ǩü;Y‡fÏg¹_j*:²ï·;ñŠkKƒj†rj®C1ÙɯóèoGóíþ"L¶@š´íÅM¿}’Û›BÖž½¤—8ɪq ·m‹L š4–ÎÜÆùßps’¹q+³Ì4íñ³/_|hælöäŸý.Ø?‡))Ø¡=þ§jÞŸ®´«æ>4Ñ MküHáûy)<_ÌŸÉZ´ËÕcj8.*}©\ó1n§yÂ8ļE‡ÎÿïOÊ—/ñôó³-ÏyIõ»’mw•f‰œWGþ[#:ÅÙÙ¼q=Ûs¶’îß¶lÚLQ…Õ¬ ZÎ.¶$ éæ˜²°í$gï*¶åš #$0 ¯…kY¶î$­{ŸúSĉuÉœ ª~]c nN„û:)·mø¹78gv ³§®ÎC¹®Æù "`rÇÓj‚¬ãdƒÉ§£†5åùoþÌËÙø®C(œÞͺù?²:§Ï<ìÍo0wt™Ë_ý‘¿¦§Os;g6Ídê/<ÏŽ³ºéÎÜïóþ”»HŠ„£Éß3y›ÖJ¯g¹ÇÒÈ´„ã?$´o[ÂÝÓIY1›…Û³#,›¿ŽfýC\oš m1•œæ§>`µçµŒÕš{4XÅ«Ÿ½Ëœø1 .?üê{þôJÃúÇá“ÂÂÿÍå€[÷ Óª? Ô\¼ Zâ—ñ)“þ=Ë͉4²¤³ë2fî…ˆáí²˜°DÖ´PiœÅ܃;~ϘY¯ñ’cƒãCq]ÃôÉ+Ék8”;»`æ‚«%\[ætƼœÃ°­ðÉÜÆüÿ-ä¨W"O Æ«¸æý‡_Æø‹¶Ë•ýèé{#Û.æÃoGóÊéaô‹ó%kç|¦ÌOÇ«íréØ9›h/z\ªP®KÇøu×qgÙü{ò+¼š5‚¾-ý)Ü»˜ogŸ!lÈ3´ó6a2¹P¿';ýŒ¶SÕ9y”„ÙÍ ™»Ù°q;Ö¸DVqå(£©Ÿá ããðÚ°œéÉЫ!U´Äì߆~‰Ëø,y"Ÿ:zÓ¥yÎÓ;YñÓ6 ‚{п¥6·ž$5ÝÄô…Ÿ0!£'ñ‘^äZÇÒµÙx\X¤ëì1ôíθ_0>¯' Í1e!eÝ*væ·âÖ!vL?óMOäê`%´ElMfÒÂã´FÔð¿ðFè×|:e§Q` ¤iÇ[xþΛè`éñ俱~û!_-œÈ»s}iÚi Ïý9œoŸx›› Ìôüýsû`?~õ+íaÄvèËS£½øê“«¬‰%tO={š¾˜ÃwŸþ„GpSÚôº×õdÞÞäÇsÙÝmÔ%´ÍVC[œœœÿ>ãÖyÒÿ•;Ê~¼Ð‹6wûq6ã—d€#b<³wõ-»Îÿ%tgeæ®yúa,ùó'.âxq QíFð‡GÐ)ÈÔ¼?»_ó Ï.¨¡]5÷!„2`ôø~ý1ÿ]úã¸Ú<ža£G‘ýÑk¬¿äÆÕ¼MgÙÌ—K9.\:Ưyžkƒ?5ù„‰ó¾ãýÙ9X£éxûKÜ3$®lV“ }Rù««ËØv׎wõìKÜO“ùæŸgÏKãx!þ"WŽ1“Óyѳß.*99™ÄÄÄËYŸª9³XÿñëüP8€ß?Ü£t„©ð3Þþ„ÕÙôùÝ£ôi`Š82óm>Z׈»ž½f6J¯ó¿zsV¥p$5¼ƒ‰ˆëÎÀþñ„=»ªø ÛÌ`ñæœÈ²Ð8†N×Ä“÷ãDv%>ÆC‹YòÞ{,»›gnmŠbŽÏËk£¸ï©›hb…’´åŒ{{¾·?ϱg?6rzóf.ÙÊ¡“YZ} éHï=ˆ p/½Î…rEÄ%Î" ˜­6ÜË ä•ŸÊ³¿ŸFë×Þå7ͯžëú9Òæó‡ß¾íÙÏøs×ÚŒ#ËÕHÇ…ˆÔFýÿ""å”ýžgÿÛo?àï×—Íÿ-áøôyìKž÷2Ýý®žò¤*:.D¤6êé´12KhO†ÆOâÝñ¯ó¹ÛHº64qzë¾üz¾}^¦ïÕüEDD.'…©,Áôyò/8¾šÀ”ÏþÎô'öàšþ=÷ÝÑ®ìò™"""R™¦ýˆˆˆˆˆ„®y%""""b ÿ"""""¡9ÿ"r‡ÃAqqñ¹[II?ß*""ò+e·Û±Ùtõª(ü‹ÈÌf3V««õê¹V¾ˆˆˆhÚˆˆˆˆˆa(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA(ü‹ˆˆˆˆ„¿ˆˆˆˆˆA¸Õu\ã }Õ‡¼9óx•Z½Cˆlݾ}âièiú…ëV×JÈLYÅÚÔ$t‰ÁÇ\ݲ_FÁžoygQ,ÝÑv…ˆü² vòÑSïbîßÜm­ëÚˆˆÔ õläßF³Þ70tèвÛÜp]ñ Kسj*ã¿Û@º£®ëøKs™²œÅ+v“Ur±eW¸[™=c1›çPœŠ+g3mñ! ~™Í˯HÞ¦·xì¯ËHw–-(ÚËŒ`Ä“9\\Õ3¤¯üÿm§3Vóý‹5ÙΪV¼PîZþrëžžvWug–k建^mëP|t*£ŸøÍ9ç·qÉÛuùyçû8ÕQõò+Ý÷pim®jÝsµÎJaæØùÍ/1ûäQ¦œ”Bžóçm·¦ç•ïã sÕ˯tßÃ¥µ¹ªu(>ά¾Â'[Ãöâô iÈõÏææ µ|üêX–§•ÿtsáñ("btõdÚO LV¼ín`rÇj9û _LFÊf-Úľ£gÈ·ùÙºýû'i/[Ǒ;e?2wÍnŽf¹Õš}"Ù4þ8o{{ZxÔXNþþyÂZ|þŽ{»aœ9;ønì7ìi6’G‡·Ä»Š7gæ:>zc F¤qÊO$ïØÏ‰; š´¡÷ྴt/]±(•­‹ç°xý^Næ›à&mé5°?탲Y9î-fXɇ[Iôȇh±h\Åe£^t©-ŸdÑ{ﳩÍoé¿’I?n^¿ã‘N–¼÷ZÞÏ-Á™µ`‡²J°DÓ±ÿôk€›=‚¸æûI^J«fù65¤eL0ú"Þ`rw±pW8I÷ú–~ðsf±iZ2nýŸåáÂwx{ú6n{2¯sÿ%_øÉþ×óŸ&V0¹Ó2© Ÿ-ØNvBçË?uÌäåZù®®÷³êb'î†$L£¿bÕ¢O ¹öÛ½èó*õqu˯tßÃ¥µ¹ªuâãK˜¹ÃJÏWbpÜQÆ[ÜðnÔŽ!ßKòƒï0ccÝ“J¿ÊÇ£ˆˆÔ·ðï 0'‹¬¬³ÕvRR˜CêžUÌJ)&¨košÚJHMžÈ?îÃ=:‘^CÂqOßŪ%3ùô`&¿ùí"ÜsH™:ޝ6Ò8á†4²’±'™éŸoÅé„H\,'ª/ú¤0~îTÖÆÞMb@>;gýÀs{nWeð?Ǚˎï?g‹WKº÷L§üÃlXº‚Iï'ïww’P¡¹Ÿ3)¹è®}n#ïÔ¶®^Å”‰fBíO‡ÛÁ{î&ï‹åÖ»{à‹µaåe6×Úb.íÓ¼}s˜xü ~Íã‰mlÇLÙ;¦òµ)”Îýnå÷4¶,˜ÍŠI“ð {€nA&ò3Šh4`$ýã²Y±ðYEàc»bƒü å¦,`wþÜï[zà;R“™¶5€þw¶¤uIö?Ne]zz”ýcìcÖG‰™@À„W˾DM˜ÇöìË%PgáqV}ó ÿ]º•ƒéî„ÅvdÀж.O9)U}ù®®wyêQÊ­a/ú…Láû…Gé9<·j·ë¤ðøJ&6‰›’^à†OÃÖô¹õFõlˆõbíº «[þkksU낳0"À鍸ý„ɯ;/¼ß’"¯óA¿òñ(""õ.üg²ú‹·X]Å#þ wðàuQxäïcá‚}8¢nàÁ;°ÄÓ®é4Þýl9³·$rwãÌÙEHÒ#ÜÓ;´´#:´!bòÛ|µµìMÅ…rîïèG“¾ÃèºóSæL]KÃÄCLÝl¡ã×ÑÜ«æ7œ|sîy`шóçÃ÷²péÚ öâX¦È®7sÛÀ(Jst<­üNòæŒ#¤Zh舿‡,žøâëX«XæJ[Ú•Ö)ïP!=ù==B˾}(. ÿÅé>ô{|8ñ~¥#pM|SÙóÉFœ)¦[ ŸØ$H¯A‘—²cåªÃÎ…{h”ô@Ùèm1Ç—Ì`ãëy"Ü wú28|Ó– û aX€¢#ËX•έýÎÍA4ÙãHŠϼmÙtîâSäJŽ3çïOóÑf'ѽoâþ–>dm›Ï·ÿ\J!g?¬—WÌÉU³Xkëε)Ÿy«,¿ WºX‚éÀÄ%k8yS -Uo×™· ¯¼Îœ¢Vôú±Þlÿi:ÓÞ| KÃÿpgSkµíªª«[þkjsu뺇w¢ïTŒ}‡è»“ëo“;>Á Êm¨òñ(""PçüÇ Éí·ß^vÅÈá×Ó3Ö‡ô5“™¶5 'Ptz'ûó-Dwm]rKy4îL;'Çvž ýàNNb‡ç?™ìD%Æa/»[s9§(°E’4¼>ûäãÿnÆ­óp®±»ô5s`B"=ÎßwoБ!gÿ>2"ñ¶‡¸¿,ø; 29±w#k¶¤ÎKš—ër["ºÐ®û……4N …ßùCÆâé‡N w޵TÉ™“ÂÂ=Hj]Þ 2on*-‡$l, è>$–c³p¨ „ӛדêGsÿr¥ÉN\R4‡nãì9 ù)ÿã›Í…4ºåïüõ÷#Ü0#ÿ7ÆÜTMmŠ8¾dS’OsÁ9ÆU”_¥+]Üiк¶£ÉìÌ8; þÂíŸXÇú4­~ûß:ˆ~ƒoãw/<ÉÐ1˜³òK_ ªlW5}\W} m®v]ÏVÜ;ú>zúmá˽œ™þö[|1{=‡sο]p<ŠˆPïFþmE5'6¬bµ[ƆûöÖ¯9@n›6¸ågO »¿ù'cª*Æ'‡ìŒ|0àg«ø¶`ñôdzìoGåäR Ø[£.to¸‚G‰OhŒGUëWÁ;Ø«âȘɆŸŸ Ò2Éw8É?±žE?­gÏácœÊ6áÚ·K+s­-¾¸{{c­bV»Ç…£x"8Éݹ€½}y°l˜Õ‘—Kp¿{éÓѯ,|™ðë|7÷žÜNn¾Ü 8ºõ8ÎÀë ¬ð/mÂÞ¢/M?ÅÖ¬DºúsrÓ6²ˆåîM87“ÌäA³ƒi<ýóK¬kåò«ŸúseëQÊ=(ŠÇf¶ž($)ÐVeýÜbˆ²9Y=ám>ÏDïέ‰ Là®§jhWu}\W}ïz›/ºnÌõ<ùú@Ø=›7ÿüÇJöðãG+øáËvÜ÷÷¹>Âý‚ãQDDJÕ³ð_ k ~°.'üð±zcÅ“¸áwÓ;ìÂ&šÜ½0§¬g.™Nð8ÿæà(È"ðL5–ãSöAÁIöŽ9,8êŽ{Kg¬¥Ý=]*ί­F~F>%”ûà,$+«¬^¸eoaòø©lÔƒAÃn¤E“ì'Ù>áßG.­‹\kKféßæê¾Ò›¨TÙˎ…ûˆHúí¹ó\Ì~m<¼âj&(ú *{N>éŘ¼üð¨tÈ™¼bIjö ³¶fÑ¥›üŒ|ðˆ&¨ÒïxX|Bñ².±º˯þdÐ+]‹=;9œÊ<;”PEýüyôÕ‡øzâÌùè5¦}&ÿ¦$ö½‰QúQövÁóªëã:ì{—Û|‘uËÁ'²¾áÄ=ùOn(™Ç¿ÿø _~¶žkF·!¥Òñ(""¥êÙ´Ÿê˜1›¢|Šœ` nN„{‡ŽáBHÙ-Øó kçÎeÍ)'>‘1øsŒäM忚ÎçàÚíe§·ºRNIé|ÜÌ-LÿaÖÄÛyàŽD¼Îá‡5©. wrÍ:N¿_|zË€gd4Þ»8\äA‹>½‰o‚½ôRBÞZeYU^âïÛ"RÎÜ,Üט¾­¼/í8ªve/Z$5ãÈ­d9-ØíŸJZ~Å£¼$û4Ùgïígâc#1b#FÜÅŸWæ6g4wŒ(]v˳S9VRUù«à•®GuP¹~f¼cðàŸÆòåÄyýOOpG‚mÿû/¼…¼jŸWMñ[þ«isUë–ºäM^|ùsRÊ_5ÖdÂ3ªCÚZ):qôŒZ""puŒü›,ØÜ€¼3ä”öúö gÜ‚/Ÿ×“„f˜2²n;ó[që;îÞ‰ôo¹–Éó?åËìkhßÈFöÞd–ïöÀvö­Ô…rLŽ 6N›Æ[÷ôÆß#Œ¡¶óùœXs]jþO_Æ„ñyôê‰=ÿ0–¬á„%’×Db7Ÿ"Ø´‰m³¦ß”@·lo]͆ƒyÀi¶¬O¡ab4&‹ rްgÏÜ"# µSÅ2ÚrîcÈ¥p’³cû#ûòÐ¥ ³š<ðsÇy&ƒ<xUаÇö%æãélÉìJ§6­ñc.ßÏ;H÷[š”]B¶€ógr€²“NÝqÃߤw1@>;?×ÞñòÈh¬€ÉêOˆ¥êò»_ä"ðWº%yiäb§‘[5ÛíBÛoðâÇ©\3úUFFÒ¤m/š´n…×Þ‡·g/é%mñ´TÕ®jú¸Žû¾æ6Ÿß'×5cuËdßö=l89ŠØÐrO.Ncß±BL¾!°«Ç£ˆˆA\áwÀþ,ÞFT—@®¹G0sÉælÌ¢ÐêKxLonЃ8àK›áá¶h: ÖÏㇵ^4ŒíÌÈûY4vJÙï¸×PŽƒôuS™¾ËF§»û•]±Ç“èþC‰ßñ%s~XKó{ ¼Hþo2ô>ÚœÏÒyëI+²Ò¤ Ã÷§mèĈ[3˜6w ‹gnÂæNTÛ<|“u“¾cÕʵiC‹¶‰Ü´˜ß|ÍÑ;Ÿâ¶ÁU,«±Oª>;Oäâœ9l_p€&IUÿ¦Eõl„· Ã4m?iE\ù²°öæ$5?Æô-™tëz#Û.æÃoGóÊéaô‹ó%kç|¦ÌOÇëìú&wüÂ"ð 4/ î>¡4Šˆ Ê+Ζ/¿‡ÇçŽå½ÅtüÍÓÜå^õzW E©8cnDë°J'ÙŸÛn›µÄ/ãS&ý{,–›idIgÿÖeÌÜ ÃÛUœbX¡]ÞÕôqÝö}ÍmΤ[ÒsE*®k»ýpúþ‰ÿ¾ö6¶»âÉ,.¤øÀZ¦÷ûÓïå8ŽÏ™\‹ãQDÄêIø7ãßåaÆt©îq7Âú=Á˜~å—Y n;»Ú¬ú)Îb vbúÝI\ÿó‹KÒ–“ëô¤Á¹‰°/Ç¿ã]¼Ô±â2“g CŸÃКÖt¼ñ~:ÞXÕƒü[à®–.xd5¸y IDATÀÏqn©o÷¿Táq[Ä…Ëjì·ôy| }\\n îÅcczU]–†3{; 4¡oK¯Kœba!¸m÷ó»ÿ‹×GD\™Ñ˜êú¸®úþRÚ\Óº…{ÿô»x¿øÜQOƲDDê˜áÞkϲ´¥Gs+GgMböúÝ<¸‡Í?Mæ³ÙÇðjÛƒ¦W0ø‹H[47äÀì5¤Öæçbë¹âcK™*–›û6¼r_ÃV×ÇuÔ÷—Òæ×5™p³Yu b‘K`ØðÙöÃïåÆx7Ræ|ŧŸ~ÉŒµiw¹™{7Ccñ"¿ aI·Ó9}sÖ¼úÕÄ™ÇÎ pô½.Wò¥¸º>®ƒ¾¿”6»²®{Sîzý Ó¨¿ˆˆË ;íGD~-¤¯x“WtäOèCA†$ŠNå•cÔk¿¥­×•ž^]ÿ²})mþeûGDÄ8þEDDDD  cl"""""¢ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡‹#‹ÈÅÅÅçn%%ü.©·ìv;6›­®«ñ«¤ð/"0›ÍX­V¬Vk]WEDDD.#Mû1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1·º®€k¤¯ú7g¯òQ«w‘­»Ñ·O< =M—o³ÅǘóÎ8ÖGÝÇS77ÁzùJ®JÈLYÅÚÔ$t‰ÁGEDDDê½zþϲѬ÷Úø[Êî;)ÉÏâÔ¾$¯šÊTÞ¿‚êeà 3e9‹SÚÐ"Aá_ªçÌZÍ¿þ°ˆ¾ÿx–ïê?|çm~›Gß2óÜ»ÑÒV‹²œyøé>Ÿ²Œ‡Ó)ô !º}#ï¾‰Ž ¬\Æý"""W­zé< kÙøøø²[GºõfШ{E»×²?ÇYו1“wK’š`áöªûïsdíà‡Ï—Y\Û²Š92íUž{g‡ôáŽß?ÁÃÃ;à¶é¿üýÙ·Xžæ¸<¹ÊÕ³‘ÿj˜¬xÛÝÀäŽÕrvü¯˜Œ”%ÌZ´‰}GÏoó'²u7ú÷O$Òn™¹ŽÞ˜GƒQ#iœòÉ;ös¢ÀNƒ&mè=¸/­Ý«ÞVQ*[Ïañú½œÌ)7;ÁMÚÒk`Ú‡”=Ç™ÇáäÙÌMNáPj.n>áÄ&öçºîÍð9û¥E õ£ä4?½ÿ.ëbï`m?­ßÍ‘L7‚£;ÐÿÆ^øïžÍŒ¥;8t¦{húÜ<„Ä0«keŸdÑ{ﱡåýܼ‘Y 6p(«[@4ûßH¿–°fÜ[Ì:°’ÿ¶’èQ/rO +µ¥>3yÑ2© Ÿ-ØNvBg|Ê ÁšÎØ÷g±!å89Þµ,«`ÓØ#ê.Æž¹â¨n ¾éF®infçü/ørÉqЏ„úá$}íd¦ï ãÀŒHŠ$Ïr¾û&ãW:ˆë7ŒÛnHÀ÷Ôf~œ²†Ô’K)²wLåëeùÄô»•;n¹Ž8ó>VLšÄê3Þt¸ýF´ñ¯öÜúÈãÜ]Í< LxµìKÔÁlÏ®8^oö §EB7ŽARDíË*ÉØCJ4êÞ™ÐrCÖðxÚ™ý©VQšˆˆˆTTÏFþ3YýÅ[¬®âÿ„;xðº(<ò÷±pÁ>Q7ðà Xâi×tï~¶œÙ[¹7¦ôyùæÜóÀ¢=:çχï/dáÒ#´Tiô¿$‹c™v"»ÞÌm£(Ãñ´ò;É›3ŽV¡Y뙳:ÿîrϵJG";Ä’ÿ_'¯âX÷¡D:j®ßýí˶éÞšá· Ê´§xç¾?Ò€wÜD‚¿ˆÂëØ6>Ùr”Ì*r¡ìv¥E§ûÐïñáÄû•~lâ›ÊžO6ràŒƒn1ø{XÀâ‰` ¾Õ|"`²Ç‘=žyÛ²éÜÅçÜü{Kp'ëä³åà ¦×®,s@/ž³=– 0,åÖ-IÛÁö4è¬QÔ³ðïIÜÀéXî„ß‚LŽlþ‰¥k&3-ê1F¶ñ¡øôNöç[ˆîÚº,ü–òhÜ™vþkYµó…eá?0¡ ‘åf³¸7èHÆ ù~ÿ>2Jb+nÞDâm‘Xv×QÉ©#{Ù¼%ʼn“¼Ã;8N0};†• #vš}Œ'óLx¹CÑê×Þ¿t“a±„t7YñörƒÀšœ;ׂ‡¯88PäJÛÛù–.lœ@ ¿ó_þX<ýðÀ‰fOË%3Ù‰KŠfüœmd'v©0õçr”er÷!4§ÜJN Ž,ä½W'°×½ ŽRøqA= ÿ6‚¢šV±Ú-cCÈ}{ë× ·MÜò3ȧ„Ýßü“1Uã“ËÙ󽃽*Œ$b²áçgƒ´Lò/HÁNò®gÑOëÙsø§²Mø†6$ÄílÒqP™xàY¡TÌ6üËB|+õs–†“ÅráULÌnÕÎ×r¸ÔöÒðoµ{Tl»H­™°·èKÓOg±5+‘®¾?+ý_´,gþV~÷)ã§l$Í·=£þô4׆êHqE= ÿÕ°áërÒÉ/«7V<‰~7½Ã.l¢ÉÝO¶Ÿ‘O å>8 ÉÊ*«ÖÊWÌÚÂäñS9بƒ†ÝH‹&!Ø-N²7|¿˜q·[² JÀë| qœáT†ï @Ü\©Ÿ)»V]ar©í™gïÕj"U1yÅ’ÔìfmÍ¢K7ߟutU]V é[~àý·¾bí™`âo~Š?ëNäåüm‘«\=;á·:fÌf (Ÿ"'Xƒ›ážÇ¡#Eø†„Rv ö<ÃÚ¹sYsªä\09¹f'ŠÎ—T|zË€gd4þ•²sQê.yТOo⛆`·ÎïN-[Ä="†@N²vã)Î_Õ°Có>å½q?r àÒêw©®DÙºxª¸Æ‹IÍ8²p+Y?û ©\–ƒ¬øã˜¯Øp/¼ÿ/ÝÑCÁ_DDä]#ÿ& 67 ï 9%€=†¾½Â·à Æçõ$¡Y ¦Ì#¤¬[ÅÎüVÜ:ÄŽùl8I_Æ„ñyôê‰=ÿ0–¬á„%’×Dbãd…ÍXü"6mbÛ¬éÆ7%Ð-›Ã[W³á`pš-ëSh˜@ÿ6«ùïâ |ž{ ñ‘ÞÛÈ¢ÕYv»¥ìjD5×ÏD^íúÂ…¶›J/ºèB·š ç{öÀ-2’P»‚–\œ=¶/1OgKfWºûý¼ã¥BYÖ|ùöLN·z€×_D#€.""R+WGøÇ€Æ°‹7¤Õ%°kîãÑ€Ì\²†9³(´úÓ›Ûô ÎÇ„³læK“¡÷Ñþà|–Î[OZ‘&]>¸?mƒ,Pé‰,qkÓæ®añÌMØü‰j;‡o²±nÒw¬Z¹–#ín£ÝÍ¿ãîЙÌ_ûSWçãîNó~wrm·È²+¹×X?ªºÒ¨‹}QcÙ5üÐÒÙr‚Ûv$rÓb|ó5Gï|ŠÛbt¹O©½9IÍ1}K&Ýzø¹ð-S1ÇæŽå½ÅtüÍÓÜU.Õ—+«cÐbVg€o«3¬˜ú]¥rMØ÷d`bƒ«åMDDäŠ19ÎZAŸœœLbbbÍ+þ 93×ñѦâ~ë Ü×ʳ®«#rÕÈÛôÏMMà¯/õÀÿ\JÏgË2fcþ2î1ZžûYÄÞÏÏóSó¸æÏãx¼•GeuäÙ?òì»»ªÝ¦{ç?òé вˆˆÈÅ)ü+ü‹ˆˆˆˆA\%'üŠˆˆˆˆHMþEDDDD °Ó~DDDDDŒF#ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""áVב_‡ÃAqqñ¹[III]WIDDÄev»›ÍVóФð/"0›ÍX­V¬Vk]WEDDD.#Mû1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1·º®€ˆÔ='0~û1Æn>žÌ|2 ‹ëºJ¿J~V7ZÚy¢]#cÔuuDDD.™Â¿ˆÁ9ûì`ÂŽãu]•_½ŒÂbVÏdÅñmlJÍáo]¢ëºJ"""—Dá_Äà>ÙvLÁ¿^[{€îa¾\ß$¨ÊÇõmJíèÛ‘+Ká_Äà^ßxèÜßw·ãŸÝšf·Öa~½eððâ~< À[›WþÏ~›²îT6ÿêÞ”.¡¾øYõrëŠ3Åüt4§—íÑ·+""W€Nø1¸grÏýýAïXÿ‹hìmãÃ>±çî¯9™UåzŸl;ƆÓÙ¬¾¥#×6Tð¿67†F³îÖN|¾ó83Ê>h‰ˆÈå¡ð/"çxºé%¡&¼lçþ>SPõTž×7â­ž1XÍêÏÚò³ºñ®MykÓáº®ŠˆÈUEïL""—ÙŽ3¹ô ÷¯ëjÔ{×EVû튈ˆÔŽÂ¿ˆÈ`6Õu ê¿`÷j¿]‘ÚQø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒPø1…ƒp«ë ˆÈÕ);ý4o¯9Ä燳IÉ-ÁlµÑ<8€ûâ›ðh¤'^&'‡æ£t/jHC GTâ`Kòjڮɫ´ÜBd°/݇ñb§PÚ[/¡È’lž›¸†OuàP?¼\z’ö“ˆÈÕBá_D.»¼3‡ôín–ºùpGÛhžñw£87—Ÿvå…'˜”Ø‰Å ÞØqpxÿ!þ¼¿CZ+TVÏÊ­Ý¢èi§“ìÜ\6;Íçë·ó;LfkεWrûÚO""W …¹ÌŠøqÙ^–âÏ{·´ç?Ó¹Giß3’y`í>æ¶mËP[V³^±Ò½Y÷ùšÊ-‹fô®ôš{„;–³»o~uV?©/4~#"——£˜}Ùðò¥›·©âcfF$FñÛ>ØŠòxóÛ%tÛZ9‡éüá"úí/.]ÏYÌê-;éóõr<Þ[„ׄÕô[|Œ…eå”ä0fâ"b’³Ø¼}qãÑrM.¥;8¸?Ã&¯Äÿ½E˜?ZI¯…‡Y–ïüåúàa¦YL ï41sz×!æåŸ]^›ö_ä9Ž‹ì'ÃôµˆÈÕCá_D./³•®aVÈ:ÌK3+½˜’rû†F2®O½=¸÷úÎ|ãž¡LمϹÅ,^º–ÄŸŽq$ ŒÿKjÁßZx²wëN:|·—UEçËJ;¼›AK2jÎ]anXp²kËfâ~ÜÏ÷ ^êÇÛí|8±}7=§ìeeQåÊÖs&wz6÷’,f)Zµ¿†ç”T·Ÿ Ö×""W Mû‘ËÌB÷îmy»hض›AÛvãéíCRDý"ÜÄŸ8› 0áïíA› Ìî4ñ󤑔dŸä…Íy6oËÊþA™Â¹=t 1³1zs›–néÌñ^™ÈsAL€³ —Wž¡¤a,ÉCmãΈZýpˆgvEðS+–ºêš+ÀÛÛ2Ø›ïÄYp¦æö·¨ø|—žÓêÂýäÚó®®¾¹hä_D.;³Õ‡ßèLú]X>(–ÑÑžä8Ê3ó6Òò“åô_}†SÕÌ ÉNMe=VFµó/ þ¥4Žàf›“5ûsÉ=»04‚»Kƒ?@^úišHjBT¹W7ÿ°†ÜåëöçsÚûk`¢ví¯mŸ¹¯EDê3ü‹Èe椠ĉÉlÆjó¤[´'Ý¢òGœ¤¥žæ•)ŒY½•G‚»ðßè Çòó‹(Ä(J™Ý‰ò€ÌœbŠpÀÓn¥üiÅœÁÉì™ËªÙð*"ð½lm­{ÙÙù¤ãNSO“kíwV¼.¨«}V™ûZDäj ð/"—Uá™´ûz?þ}»³"ÎZ.š áå>ÅÌøl'Kä‘}áUæ=<ܱRÀ'P.Ù;Š9TÞÁ–s/\fSÅŠ-îV|pç¦íx%øÂHjv³xÚø«á,bé®,°ø3Ðß‚åŒ í7UŒò®öÙÞJË ××""W Mû‘ËÊêíOwH^sÅ•urúT:ûð@w¬)åD<|½93å?uø0ßå›èeÇ^Ͷítq+bù ^´*»µ°åóÑò½Œ;㼊^ôìÞµ›Ç8iÞ˜~µkÿ¥>ÇYË版ȯƒFþEäòr÷ãÕÁL˜¾Ÿ§3<.ˆÎ~6¼Eì;•Ê»29åÛ‰±ž¸áÀl6A^³eàîK[Ÿü½ÍAúnÙLGoâ‰#ý4o¬9E¦cþÑÔ†…â*7mòäo}蔼‘ÞMx¸±¦ì,fl?ÌÔ‚LJr«§´¥»ŽáéYz/77ÇOóÅÁwßBDÃã£øC§P:XÏ/¯±ýô+}fªr?]}-"ru39ÎZÿKrr2‰‰‰—³>"ò 3½·èÜßÎßõ©³zÔ'5õ™é½EêËËD})"ryé[YƒPø1…ƒPø1…ƒPø1…ƒPø1…‘+ÀQëŸO”³Nç`ÓÑ‹ˆ\N ÿ""—Y\€¥ÇÒëºõÞìƒi$4ð©ëjˆˆ\UþEäœì¢’º®Â¯ÞÁìüsW7*ýLûÆ<±t7…Ç/U­«NFa1/®ÜËí"êº*""W…ƒ‹ °Ÿûû‘Å)¤Õam~ÝNäòТ”s÷«•~ U8‚½é–´Št€Kl3C¼y¢]#cÔuuDD®::“JÄàhβãLØq¼®«R¯ŒîÔ䢣Ò&àþ–áÜß2ü—«”ˆˆH þE Î|Ú7Ž^á~¥®F¥ED¤¾Ó´ƒÐ ¿"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""""b ÿ"""""¡ð/""ÿßÞ}GIU fg+»ËÂK[Þ›KQEQAMì&FQC¬‰Æž[4jbNŒ Û'Q,HGŽ€A¤¬€°”e l™ïEš€#,÷ù£GgæÞûÞ{çg^Þ$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$I}¬p@‘-|zïu<³d?ÏŧR£az]q)k%úÙ'I’$•>¥sæ??‹Uó†ó÷;îçÝo ŽõhS>_<}}úô¡Ï­CXSx¬Ç#I’¤ 8~gþ÷T¡zòrjÅD(ÊËbé„—xòÍÿ’Ç7 û`1çÿ¶ ÇzŒ’$IÒq®tÄ(š¸øxâc€øê´<¯/]Gý—a!gÕ*²sB¼pã|š é—äWQð¯! I¿íŸÜurPÀ†yÃxó‰,X¾š¬ TH¯M󮿤߹M(¶M㾫ÿÊ" ÞµwsÚÒ1k ÃU¨Ê9\yÍy4HÚ¹À¨hó?ÄÛãç³,s Q©5©ßª}¯<‡úIQ¿€g~½Ÿñ x&oÞÁ«+wžWæÿñÛ_Nâò¿ÝOåWúóô¼B(sükÍŠX;ôNn~m%Ä´æÎþ@»d9I’$éÈ”Îe?{ ǽÇYlšþþôÆL2ó¶SÀvV¼w?ýy“O¿\MÖö0q¡<6®ZÈ„Wï禇F¹ÏÊ¡¥o<Æ«“³>/BѶoùrâ«Üs÷Ë|‘¢õŒ{ôVzc2‹3sI®Z…ØM+ùbüKüaÀ³LßT¼×¾öO¨ õÏêIûÊ;ŸŒ«O—^gÓ(¥-ÎnA @î™üÍö’ç‹7³`ZÉ'…¸VÝhšdøK’$éÈ•Žø²=?Ÿüüðÿçuþvc;’Ö䵉ëÙ¶h0oÌÍ*ÓóO/ñ¯çþ΋ÿ¾›ÓË›'óÊËØÁÆS§ {\J÷z;)UhÃE—G“ä0IMÏæä8€­|>}5;€È¶%L]O«³šhûK’$é(”Že?GðÇkFüðñ¸–\zîIÄð宇:ÜÊW¼+”sgOcI@λâ,NŠe¨{î•tþ{†gmgÑŒUìhº{·å»^Éy ’ é]úÑ{Ø ^[˧/ä«õ ÈÇ‘5í]^Ÿ PÀö¸C3‡u—4=àx`ÿ_P%6¦Û) ÌœšÇÆY³XÛ·.¿žÂâ’O-œÕ¨Œ¿j$I’¤£R:â_1å¨Ñ¬3¿¸î´«†üÝO¥ÖN#nW%GÈß²•’Ô)GÍò{œnL*'¥Y»1›=t§|ÍÔ’%8áªWê""9Ù°~[ÉãE+™<|%?°u-Ù…»ãïñD(‘FÝÚ8õSrÖMgöwÐxúò2­Ï¢¡Óþ’$I:J¥#þ+öä‰ç®¤vÌ¿4Úc†$I’¤)kþBBíŽ4¬eøëãX™H.KG bôF€8št¬IÜÛl÷#–l£(’Ϫ ¯3dUÉãu;4¥^ëú%¯ýn“—ç•|W x3ó?ËO<Ásï-!w¯/Dq!E{¾6¡.]Û—`ùo1~Ü–®õü!SI’$½Ò1ó¢R;rÍ%£øýÛ_“7÷Enë÷*qáB¶—Læ׬/Wµ.Khû|É›÷\Í›{î(½×t®D¹èËèSoo.]ˇ÷\Ï”j(Þ˜IÖv€ê\pA: ¡åQ˜ÄJI@¬ÊSçÑ÷Æ+h›â¨}fGRÇŽ +{ ¹@ÙŒ®Ôµý%I’ô8ágþ ÅQ»ÏŸøÇ½—sjÃj”‹+d{Q<©éM8ãê‡ùÇ}=¨¶ÏÒºýnâ“kP.B‰Uhtæ¯y|`?&„ ¦&>ü wönK´h²23ÙD*µÚö¤ÿã¹òG¿˜CÍîWrvÝdBlgõܹ¬Êß=ýW« §UüþÿÊÑîÌ:Äÿ´WD’$IŠD"‡ºHåfΜIFFÆO9žcg¿ä«Á-/òçÎåŽÑ¯ëì`Ù [¹ë£ P¾;ÿ~= â~|+I’$éÇœø3ÿ¥Mqßf–|ù8µcjþ’$Iú‰œðkþKVxŽŽšËâÌí@-zœS‹Øc=,I’$0ŒÿãF„–²83¨²uè|ÅzTóöH’$é§ãšI’$) \ó/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$Dô±À¾fΜy¬‡ I’$—222Žj{gþ%I’¤€8îfþöÓŒ$I’¤ýsæ_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ã_’$I ˆèc=€ÃRœÃW£^áµQ³Y’™MtjÚtïËU½Z’ VñŸßÝÆ„öp[µ ¼üö–d’P¹9]ûÞHߎiÄës$I’Ž‘Ò3óÙÆü—îä/O£ É\ó\rrŸ½õ²‚»_ȦÏóè9´¾üvî¹í*2ÂóöÔ“Œþ¶èž€$I’tl•š™ÿ¢uã4z=i=å¡+ëÐ9ƒôœ›xtä–õº‰F;?Ê|—ÊåÀ™Ã4­É¼{'²`ÝίšpÌÎA’$I:–JIüGÈ^2“Tã²®µJ ”ÌÉýŸáùì(RbÂ78›¶»¶'W"‘Å‘Ÿ{Ü’$IÒñ£”Ä1¹YÛ€d*'‡÷z&œJÚ>“ù±e‰ý|£“$I’JƒR²æ?Šøäx —¬Ü⽞)Î[ÏÊ•kÉ.ÜóQË_’$IÚW)‰ÿÉõ[Q…U|œÙ¸;–MdðèMT¹àvZ$…v­ù—$I’ôC¥&þ‰*Gû[Ÿæ“^â͇ðÏÑ9Ħ֦õå÷rÕHp¥$I’tP¡H$rÄëefΜIFFÆO9I’$Iÿ#¥dÍ¿$I’¤£eüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$IaüK’$I}¬°¯üüüc=I’$é¸TÛwñ´'$I’$iÿ\ö#I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$Ä ÿÅFsgŸKxhVî_”;›G.íCŸ[‡°¦ð§¬u?/ÞÑ‚ Ø0û=^ùÏDæ/[O^| ;žO¿~Ýi”µëØ_z…×FÍfIf6Ñ©uhÓ½/WõjI*ëvg^] 0œ»/Aó»ñ@Ûv¬Î»ƒÞaüW²y{4ÉÕšÒåÒë¸ì´jÄìg<‘k™ñöKügòVnŽ¡JƒÖtëÕÜå>’$I:*¥'þ#9,|õ.*í/âŠ^U(ΜňžçŽ…ßò—G/§nÉ Yøï?³¬zz÷íJÙ­_2î½QšÞýlêÆïÞ6¦FWz5‚Ü%_°~Ÿ_ÔÙ±æ3äFÓìüT ïÞob£sè\)²ÏV²aÉLVP®]wÆ8@(™“û?Ãó]NíýLàD—¯G­¸ _}–×FÏaEÖv(߆+~7€Ë[–ýAøCëÿ»lpa·“ö8Vú7„ÊÕ!ãÌ ¹¬wÒã÷Íÿbò·äC|m*$ìý\8¹2eìN’$I:¨Rÿ!b“’ˆfßm+‚=Ó¾8‡ 9_;(6½.›"’v¿*’ˆïò ±‰ûüYGTB9âI"cÀý\Rë‡Sø¡ØrÄÎ ä’•[ ew»8o=«¿+¦|µ*ìû™dçÞIª×_=Ðë·g±rÉæNÇï=Å}YðüÍÍÙû³C˜2©e #YùØóKÌÛ6°í¯—$I’ôC¥fÙO\Í6Ô&‹É#’ùþÑ[ç gzvuNIßµLfÕÈÑ|¿ëEl_1†÷—@j«–¤íé±Õ[Ó v‹¿ÚA…ê餧—üS-i¿þ:cדR¿UXÅÇVQ°kË|–¼q/·Ýõ" ó"{í3²óßÙ3ÿJÿ_ßÃà„âR9©y'.üõ.¯Ù_/có~¾'šJÍš’Â>øx%;vŸߌÉ7G~ù$I’¤Ò2óኧҷû<8j ÷÷¡ÇÉ•)ÎüŒaïN'¯Z/úµ+OTNÉkã¶ãÁûrèÝ­ É[2î½OÈLÌà·½jKæ^û %·â²Þu¸ë퇹o[oÎiU6,eθÌÊéÀí¿I"6¥;ýNÍ“ïÞÏCÙ}8³q9v,›ÈàÑ›¨rÁí´H !¢¢£`ëR>Ÿ·ˆØF ©^³1)[^æ'ÿNø¢ ª‡7³bÁF.ƒô‹[P! ì³ )®þ…ü¢ùD^|÷oèM×FeÉ^<Ž÷Çm&ñg¹Ò’$I:Q…|ðÁtã5kÖP½zõŸp8Š%­UgZ§lfÑÌÉŒÿxó2#ÔèÔ»oïEÝ2!"¹_óñˆåœ|ÇïÈØ4“OÆŽbÒ­¤´8﹎ö¢¡x+ Ffq¹ÎôìX™¢)×øt:VËcÑ´ |ÖØW~~þ±‚$I’t\Š?ªíù—$I’âgŸù=?á Ï¯¹¾ËÏ2I’$©´©v”Û;ó/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñ/I’$„ñÿ“+bóÜ¡Œ1—-E;ÊÍóýúpëíCXWxLwös^'ºâ¾I’$ífüÿä Ùˆ›[ldä]¿cÜI÷ó§-ˆß¹ÿ™puÕ yg+6ŸÖœö¿¼‘žíÓJnLÑf– {‰¡ÏeÕæ*7îH׋3ë‘gàwƒ¸ù” ÖMgôï0ý‹•lÝMbÕ¦d\|çw¬F dþ-KãÊ¿?@›”璘óùúß7ñÌÔFüú¹;i–ÄÁ÷S´ŽOöw^§”ùñkY¸†1w`Zë{è0Ž1>gå¦ÒšœÁ¿îM…Ï1xè V|—ObŽœ{ÓoèTsó¿——¶£ÿ³h˜ðý €5oÿ–dž–¡÷ÓÑ¥rø(îeuŠzíØ¹í÷íÞƒ꽕$I:Â>øàƒGºñš5k¨^½úamóЬ}þöÖµöÿD$‡¥¯ßÅßÞý‚¨Æ=8ç¼3¨Ÿº•/G}ÈØÙ…49½9)…Ë™6| ËçOâ‹ì:´ïÑ“ëÄðíÔÑL»„”ލ™XÌwc2🰥êéœÝëšUÝÎ’Ñ1~öŸÞ‚rQ[Y:v_mY܉+HiÕ‘Vm¨›+^ÿÿ¹–ªg\Ê9Ý:R·r4>û˜I3 hÞ­= Úv$}ó>ßÚkºƒÎuÊÚÊÒ±£Y^®3g¶¯LtqÉþf~Éü%ehsñetíXâEc˜2n‰§žI­Äm,xáþ9b5©§^ÌÙgµ¤Üæ©|4x:YE;HíxmË/åÝ{2á»ê´>·'2jýí4¦ŒžEqë³hX>–„äM|6v*›ëžC›ô¸’?ùKùò(6¶¼†‹;U%œ·èàûIM¢JëýœWtÑ!\Ël¾þx$óÍá뢜qqOÚÔØÊüñŸ0mühfgVáÔK.¥Só2¬þôf,N¢Í™Í©’ð“&}Aaóî´L‹)y|Ãø?`EÍ˸ìܺć ø^ÖI^ƃ^»0ïsßá=øýñzo“\m'I’ŽLrøè¶/5“ÅYSùpÌ:Êœz·ßÔšÄÀ´©÷<=”fŸÇMMJ^›u·OqKïš%7êôÓ¨õÜÍükzÉöEëç°hSˆz¿½“_¶K&´kWä×'µ-Ÿ±DWëHË 0iâ"rÛµ#1ùËÆ1?;™]þè~Ê’°ŸóŠäÌÿñkÙiçÉÆväªÛúQ/!§Ô¡pÎ,Þøº&½îº™S+…f$¯˜ÎÓS¿fsAˆJϦIÜlLúšü¦Íˆ VMbÎÆõmCJÔ!ÿ÷²ð›~ôÚí»ÌÿPÞƒý3~üÞv©’€$IÒ±Pj¦ w¬œÅêHyN9§éÎè‘Üü|š'±rîjvì|´âYçQg÷‹ˆ©Ñ•³êCöÂù¬[ùKs£ipnRû÷“Ðà2*FX5gÕ®ýP¯ßÏ–DWãôÛgÀÎð/ÊË"ó‹IL™‘ D(>Ìs Õ?›æ»A8¹ D(Ž“½xë©ÍéÓwB %S¿[‰ß¿¾|=ªÇEXúú³|0vk6m‡rmèuËÎo^¶dÜ1é´Î¨@á—Xžòøæ“ÏÈ-ÛžŽu}?ûQyè×2ê¤SJ–Å„âI.i­¨[þû Ã$¤&B¤"*Óˆ­Èû|«ó¶“9i*›N¡óÎ1Îñ÷½—Gr·ó<ð½=ÀÅ”$Iú”’™ÿ;¶m£ˆ$*$ï3äp!SßÿMÙj){ª %P®b¬Ûȶm›È¥EO]Ío÷w¨òÛ( "1)å÷ù•—yËÇ3òýñ|ùÕ2Ön‰"¥F]ªÆÙg¨˜äDÂû-ë"r7æ@TeÊ'ì½ïpr%Ê|Ze3èûÇöö‡Lye Ÿ¼¡”:´èr!çõê@•øKÕŽíI9ŽKsiÚ`)ÓææÒ©+5âg??Tœ»áǯe$ €¨˜èu8æç„©sfkâgÌfÆò|êÕ]ÉŒY$fôØõÁ{yøç|hïÁbRJŽwÀ{+I’tì”’ø›”D˜ dm+‚Ê{,v*ÎaS.ÄÕJ ŠmämÌ!³·‘|¶nʇøÊ”‰G-n¾Ÿî'ÅþðH±å)CVɇ÷ïâM“ôÐ?ùºî…ôé#ÍU'1¶Nº‡?~}dçµQÄ¥ÄCq6›óŠ¡Ìîqåf‘¿ÇëÊÔíÆ¥÷vã’íY|»t §a܇Oñ̦xà7͉bÒO£eùáÌüô+6…Ʊ0·§v>‰˜ÃÜÏF_îǯehó‘\âëEóÄ)|1y[Ó˜·¥gÕÛ5–C:þîåáŸó¡½C{¼^’$éxSj–ýÄÔhC:Y̳¼]K'"l›?œyÙQÔ89ïóïÛ±ãX½}÷¶…™Ÿðñ—6§JÍÖÔŠÝÆò¥;(W-*ÕKþIKZÇ´·^gjfÑ/JÁÚ9,ßQ†æ}úЮY:‰Ñ!(ÞŠyßî÷õG¾Â#LJÃVT`ŸNÎd×ß/ÉaÙødïÜ{Îgåáþ÷0â›Bq©TkÚ‰³®Àùµ!gÙ2²¿ÿ£¸š´i[Žüy#˜0|ù•;Ó¶ú÷éûÙç¼bªùµ<$ õéÐ&™œ9£™>jÙ•»Ò®æîÈ?òãþ9Ãá½%I’ŽG¥dæÂN¥g·xnì@ž.îCç–•)þö3>y:ùU{ѳmyBßO‰oø€çɦÛHÌYŒǒ݈Þ6">¹ˆó{Õá‰w晜ÞtjQ™ÈÆ¥,üdós;pí¯’±e¿cˆ©Ð€Ê¡O™ûÚ TèÒœJÑ›Y1c43oÖ0gÂjžÝŒ¨pd/åËù‹ˆmЪû›6ÿÑ5zpAÛ±¼:ø<¿ùbÚÕ+Ö/F2~^"ñlB$ÔhLÒÖ—õ·¿î™AåðfV/šÂ¤åPå”Û59GµŽm);f,¾€Ê¿èDå]Óþ‡ºŸÐÏ+¹Õ!\ËìÃ?ù]â©Ù¥É?fØ ¨Þïtªìþã B‡tüýÝËC<ç}¾Äq(ïÁ(rŽâ|%I’þ·JMüJ¤þUsGú Þ5š!S¶@Juju½‘ë.;³äwþwÆÝ&cñ[Œ}{<¶—¥JÃ\um_ZW¢©~á#ü!íÿ2t ï}šÅޏTj´º„ë/»æå¢øëï½=Šq/N!?&¡R=š_v={ÔÞcYÄžÔ™feÇ2ukM:´¯Âž¿uhû‰!mßój™ðãײ£[ëLZ¦|Ìä­ èÔ.mŸ™ü¸#¿—‡qív9„÷àŽ'I’t<E"‘#^2sæL222ï€ÏO8èók®ïr¤Ã)ùK¾úÿ“؃¸5#ñÇ78žE ر½˜¨Ø8¢÷(ÞâuCy춨÷Ð?¸¤Þa,2)ZÏÄ?ÞĨëyàáî;S’$I¥Iµ£\c\jÖüMñÚá`ä¦.?÷!%I’$áÌ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’Æ¿$I’ÿ» ^·Ö¡vªIEND®B`‚085_director_import_preview.png000066400000000000000000000764121516513262500350110ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/08_import-and-sync‰PNG  IHDRVh²¦sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝg`TUÞÇñïÌdÒ{BBHBj¨Ò;ˆ¨»® ö âZÖÞÝõѵ ¨Ø+–Uwm(" "½„PBBIHBzO&3ó¼Hè)“ JÀßçdæž{îi÷Þÿœ{®7–Ú‘f3žî ˆˆˆˆˆˆˆˆœ©Xq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI.§;"§ƒý¶Q§; ­ŽáÍe§; """"""gÍXq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI.§;"r63àϸ¶ž„mdä±$«œÛéΗˆˆˆˆˆÈ©ÑüÀŠÁ) ¹c÷zú&U`ù2Õ(³?Ÿ]Kâ7y±ÈþGïýŒdòjËšëºÐ?g7Ñ_e²ÿ˜›Z¯°ÎìŽë®Í´_RH™ã‰ò¯Ëz¹lw:sàožÜÿñ&Þ/7sÁðž|ÔÍï¿ßBÒÐþ<”µ‰˜åÅ”ÿ÷G©Þˇ·?Èüücþfö'fð%ÜzóyÄxZ¼‹ÊäW™úÏ ®}çYÆžù“ÉLîþ<8¶+ÿŽr›•"› ? $—ûï䥬_‘3f¬ü‰Ø‚Úr‘÷A^->2Ñ;.˜P ¯éVdpÓ"6WÙÁäÁEÑf¾øv-·„Ϋ“I­¬ êäÿ´3¸Òý®—¸7ÞlŠÓ×òù+0}n'fÞ‹[ “7·;ÛþQA´w˃4§›ÁÍŸé“zs9—û¿MäŒJ*o¿ þ1<Ž&õ!àËM<–mEáQ9“µøgq³_{6\Ç݃{±çæ‘T^×›§¢¸÷¼sÈ›6ŠŠ«ºq³Ÿ¿¨^ä\Á­£ú’1ue×öáµXÜë²Ñ>:†…W ÃzÛ².ëÆÝafL€«$‰WvâêÞ=H¹e(Û¯èÉ•^Þ¼pi?ž®'ûF7& íMÚ”QØoÆŽ ô57¾6±ì¹:–þ‡ÃL®Ì¿±/7{ŽßÿM}¸ÖÓHT‡Ž,¹z8öÛF9©—ùaí™{ÙªnEñ•=y¢+¦–ð©RSÎì,W®ëàŽùðßÌÞ\ß¾†/Óªëf5\F`"¾[®}ê`V oCtÝÁÝüyrX(‘&wn¹ '·x»sÛ…ý˜f¢c¯N<Ö¦ñò9©Œ½Ý¨ÃÓÍ€ÙÓ___|ýƒˆè1ž„Qm(HÞKAúWÜwçûü2ïn»þq–Z)Ýý/Ýw3W$$pÍÏòß­EØlùüüèUÜù¿tjêR­Úù·Ü0ƒM9Û˜ûÑ2rmÀVÿöÖL¾þÇÕ<±¢;P‘4ƒk®çµäJÀFþ’‡¹òßi=}¥Fz÷íÂ=^y\÷åv^¬ ª”åñô›¸5݃GÆ´§[«é """"""Î9%ϸù‡P¹s>^Ëeû=xì‚8ºîÞBÔ‡y¢2ˆÇzxáø·áæªýŒøxC×VrñØîÜéoÄìÛ–¹ãCÉÞ°™ðÖrÙofž˜Ë„º)fß0þ/¼”GØÌð/¶2»¬”ûÿ»‘ÇrO~ ²3³:UñÈW«™½ƒEmbx«“îMì£1Göÿãn¹µã˱Al[¹‘Oy´(˜÷džéÌûçGâ¹c>XÍø­vn?¿+×´–ÙöÖ%Ò¦K:ÔÕºw›0ÆUfóUIm96VÞa˜7܇U¿l ä“-¼B(×ùžÐ|l•¼7+ï•–óï¯6pgÖÑú1z4^>Ç–ñÊNõÖa뺷cÉßÎòu¹x´ÇËÖì¥|¾=Š+ïŸJ_ÛzÞzö+ªÆ<À›¿Ë,˜þ Ëó}‰MþÊ äXªØ·<{ß Äy“zѺú·/"¾¯/éë÷S‰…ì­)T*ømk*H݉ÿxÚœÎÂ2yqM'R’R˜[ZÏ|[Ÿ¬É$= ”ËýÎüGžDDDDDäÏí”ÜÕØ« y>¹„|K%Ëö•QTÉ‹©•”V–ñCZfw& ¦2‡û6ä±·²šÍ»÷òP¶7wö¤sL8½òöñàîR²«ªøeË^Þ¶qGÛÚ)$&{9Ïþ²Ÿ9eä;°(ƒÁèB7#eEyÜÿß5\ø›…ˆ&öј£û¯ ¤s81Sxr_9‡JKødU2·ï¬"$º=ç–îçÎíÅdVU±vûž*òáú0ZIh…✃,vå2?#`¢_\¹»sIµˆj°ŒÜèÓ=”=<žRΡŠ2þ»&…/°c ,ªñò9±ŽO®ÃjNë$ {›Ÿ½–„„.eò”§Yä~>w\ÛÀfŒ`Ò”†uo‡%i›ƒ¸iBg½étî $„îaé®rü{!2÷Ws­P•ÊòDÆwÂãèŽ(ØÔÐöU´íß ÓžÍ¬,bw²ÅQ–ô%•IÜçFÏþáœÖ >&WzxÚØ•]UÏ#`F"#Ûrk¤ð ¡W·Fž¹&"""""ræ9%k¬Ø­VÊ<ìvjjjŽLý·ÙíGÖP¨.+å€õÈFì-¨Á×Ç•6Õ&JŠ*9²ô‡µšíåÎõ2a*kU)UŽ­ÄP¶‹‹ÖEñÈèsxɳš%;ðïÙ”ú4²“Vl5`4 ‡Ý¿‘ _ ªŽ,Äj­(â“FzœcÆ+8†M7D9^³ÙÀVw&,Gû8­,%ÌJ3ñ^'^H4sC; Ÿn¨Â`  Á2r!ØËDnúÑã¶[*Ù^n#È¡ôm¬|ޝãúëð K-§y5ƒ™¸iÏrGÀ€ÉÓŸ W @M9½B õ2J³‹©JýŒûoüâÈæÖJ;‘%•ÏØö±8)Ÿ1Ñ¿°Ù8ˆ{cÜ ÷ð7kÝÞµ÷ :V|NrfÛóÛ1bØr—mdoF)É–N\ݾ¥«½´ÝFÕH”‡#œ°@­ƒùVŽ % £Õ‰éTžŽ|ŠˆˆˆˆˆœèâµfOBM°×LDû»Pše!·ÚŠO´;¾(³&Wºy@n¹ +`Çîðlo7ŠÓR8oÛ¼ýü¸nP7¾WÄ´Æ÷†#Ów\ÜÜi{Ì£G÷o§¨ÌŠŸŸ+î@%`tóå†.n쮨¡ä`*qßd“m¯MÏ×Ë ªÊÖTÀJâÎ|<Æ„rN–+£Ê³øW©6Ø),m¨ŒjÈ)±è†åXƒ‹q9´_;Ee”÷ñu\Zˆ™—CÎi­q÷!4Ô³ÞO S]2áä…GÜåÌ|j8þ+ùTya2ډݞO–­')5óЈr=6¥&¶7›Ü>…+VRì߇Žm»ïý ¿®(¤0òbêÏÞ§¦Œy96>êÞ†»3jûû1,¥9Üø­+m.lÃO?$óa‘Þ $"""""g®?tWÏ0fô ÊÍ•^c˜Þ¶’~+cWJ&[ƒ;ðl'/Ú¸º1¬WG¦¹æñÚÁž51ñv©ï!º°ú¯1\à‚ÑRCNµ»ÝNj#û¨±TSéÀ%mÝð4{pñ€öÄ×»F…ä]YŒˆáñh‚<½˜tN/v4“‘šÁšÀhž‰õ¢«+=c:²êŠn\z ^Ã{*•çf1ÏÆŒ!dîÊ#ýÈ=mceTÅæäÊ;ÆòdO‚Ü=¹x` ç»:zlv2÷;Z> Õá©+ƒßŸ‘À¾éœþ9³M£¸¢´µŸðÈÝ/±ºÀVûyŸÑ´Kˇ+Ý>2â„GwšØÞàKÜÀ ö~·Šš¸.ø»…Ò+¦‚•ó÷2¤ >§»ÉÙ«ùvmûCcùj`!Ç2¼ÌF*òÓ™ðÙfžËÕ[DDDDDäÌö‡ÎX)+8ÈbÿŽl¼Ñïòb>X²ù6,äòÅnÌÖ‡ìq&róryzÁo,¨Ó‰‹/X+YxÐÈ{—öÇýË ´6bg ìÃèöïðNõ$†Õ³ÎOSÛöìOßWÜhß?Ó/ù èðÇFKPšµó–¸ñóØxÄäóiJ1iv3qmÛpYP ×~¾Ïê[ØVDDDDDä cà¥ÈÝ_T/ö È¥×—™¤ë~JN3ûm£NwZÛËNyšÞÁÜÙ;œ‹Ûzf²‘™WÈ·àÍýGÖë9“ý¡3VDäÏ¥´ —g–æòÌéΈˆˆˆˆˆÈï¤5<5 """""""rFúÃf¬íßBàþ?jo""""""""¿?ÍXq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœd°ÛíöÓ ‘3ÉŽ;ÍXqš+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI.ÍÞ¢b+3ny’Õ•à5òÿx÷Žn¸ý“?)Ë>>¹ã~æåBð_§óÚµ1˜OwžKÚþqÏ—dÊ%/½Â%ÕŸð÷‡P@;®|u“vœýýÂ^ʆç§ð܆j0õâ¾÷g°’óÃÜ6+pcàcïso¬™ßpN]}N60ç×oõžêꢶn&G¶†S[©«¿çëù+I>EA… WŸÂ;öaìE3¶G0®†ÓIù½ØËvðß—fòMR.Õ„1éÅ—¹2º•¶Õ#¬Zô(ÓÞÝSûßèxãù 5ó{+½‰™»OÜÖ€ðpÚwÄ—ÿ…~!µÇÚäXÞüË‘ÓíO6c¥‚-/^EBB ÷ýÈ!ëéÎHkà`¿0x;´Sí a=À¶,KÝ•¤oɬûwû¶esø“ŠômÀ‡^ÚµŠ Ùia/%é½û¸ïåÿ²rw&6ªKrHݼž¼}›FõiÎæ™ãLËmä­úˆ/’r©:v¤ûE³bí¢=GÿŸº„59Žv%™)lY>›gï‰å¹­¾’DDDDœ¦Ÿ†¤uq eÌß$®<ÂÃZMuñ#ÀÙîí‚©¦-~@K0a^¦&·?;ðí:Œ¶³‡vî)ÄÚ)“%‡m©GC9ÛöRb‹&ÐXMvò¬îÝåÖjë÷÷f=´‚OÀðTºq1¾P|`#óޜɼ”vÏý‰ca ÏpÃ-Íd¥<¯¬öŸþxàÿn¡Ó0¥­&k‹SýKKVä‚K"êﻡóÜs—áb£ª(ƒäeŸñÖÿ¶Q^¶žwß_Gï㫱TDDDÎB§æ¾¦|=ÿ¼öy¶q·>LÿÄÏøncå>ÑÄžÌÍú²æƒ÷ù~Ã^rmþÄ ¾„)7G¬—{ñ »q&»0ÐmÚôÙü?nJ¡È#‚®ƒþÆ×Œ ­îFÃn!'ñ[>ýß/$§fRhõ"¤},ýοŠ+FÅàeä¸G•bn~žÉ…³yç» ú=ömß»‡Òêòœú>Ó._Ê´wŸel`ýwl%»XüùçÌ_½“Ìb .^mˆê5š‹'_ÄÀp7 æéØcìùàÇüs€'•[_æ–'WRA7¼9 |’ëÏû?grKg7°W°ù>ùn¿¥åRî@ûnÙtÍ¥ ‹ô¨ÍOM>›¿ù¹Ë¶‘’UŠk›(âÎù+×MND¿:\ •íáü5ºïJ¶Î¼•'W”AàDž{ý&b]ÊØ4} Ϭ«‚IÌxa‹f>ÏÂBKx‰—¯ˆ¬åÐXÚæƒ|sï|𮿽ûáeÍæûûÿ^[ßá“™ùÒ%´3•°úÿnbÆVtžÆ;O¢jÞ½Üùi:бѶ`ðïɨX»McèéoÀdïˈÈY¤û¡»¯*ÿýÂЃ!íaÏÈÜ’AÕÄR&ådmýž—§{Ñ~ú¥Dº”²åýù¿E9G¾Ÿµc ³vœˆÝ‘2éë\›±:0.žü«»‹_8@ …üôú«xœ7‚Aý{â9òo<<ýoG¿ì@_êrLÚÇ÷EÇú™1›ÅÏ8»80fößsR"–ÂM¬É´Ð¹ƒjrHÜPv 2’HCé̘Òp›mfÙ5·_z8r^8±þ^tw#—/`ùÞj0E2|âPú=yÌo~ßnöñ4T—–,[V{¾qí5‰Ëú}úw÷@ÖrVdLâ*‡Ö‡q§Ãð>ø.\B1©lL«d|pËÆR‘Ö蔯±bˆ¾”§>˜ÍÇ/M£_ÝU›ÅÏÍ/~ÌìYÏpUlí•SáÖ$YNÜ8žëŸÿ˜¹ŸÏâéÉ]0Ö]ÿeîÖ2¬ù«øð‹Ú Lï·1ó³9|öù,þyQíí~áŠY|»ïø JöVÓûo7s×}·sn»ºœ)bê~i BÂèØÀ dMöj~úÍ x2ôÑùdÖ˜ûî½ ôÊÖòͺ|jœÈ“£ŽË{[3ÖC+ø¸.¨Ò~ÒÓ|<÷3føO&Õ[ùì»ÉOþ‚Ï’*H.›þo½ú&¼q½Ý€ßðáòC4ù”{#up쬀óWáÀ¾];Že?@k7dSX26°µ œQCÃë]ƒ£é´ íß§6€•¿]…V,Y[I­©KÀ–FRf5Ö¼ì*c`|&Œø÷¾œ©7ßÌÍ·&еÑ_p x„u"6äð/Ò<Ûu&6¸þ 'm}–ô 0Ö¿/‡’ÙWRÍ¡)T`"²W z‡9lM)¡:oû*"ÒÝß±ÁÆg$w¾ò s?ŸÇ/©ýÛ•l:d¥&c³ê‚*mÆÝÇŸ}Ág¯ßÍèÀã“°9T&vÚ:ÑfìŒ õLaã¹5!WÀ–¹–og½À÷]Ãå“oæO¼Ä‡ß®&­¼¶‡9Ò—ŽíÇ'öEúYM ÷QGÆL¯îãéå Ëúº¼Ù ¶±6 ˜¡#"16•Άj:5Ðf›[vÍí—ŽãIõoð¦ËùWpQŸº†êד ¯¼„Á!ÇVN,cÇÚññ}»EãÌ ªö-á—\3ÝÇt§}ŸQÄÊe^ÈÅ?¢îÇ ùyåØZ8–Šˆˆˆ´F§|ÆJÌÄñtñsÅèݓޡ°1Ì=.dd´®t ¾kŸíÉ…šê“nòCÏ¿– ½0q^ÇØáÇ‚ vl̠ȾŠÝ6€H&]3’vnÀ—“®aÀϲ¾*Ĥ\®?šžßØp÷ÕÝÿU®\(gåŒG)2þýúqÝ;_p¿Gí-bÙFÇòtÕ¸æïÿļ—&¯#€Î\4± ^À§—Þu;©å=ÈÚ¸RWW²™Ë~ì•Ø]*Ø»ê7J'„à×ÈÕkcuPݵ¡üYHqhßý;$Å?䓹*‘܋ðmÞXûˆDÄh†´ušsdá iWDÏ…üZžAâ¾úçí :ŽfïÒ=ìÞGq›¤Ú…TûÒ/¬öæÐ3z0㣛]=Ív¶ô ׈ôôþå¥é$¥çã²-hG¯Hãð'ôÄxl' ìâƒ[;!âüKበOâ†õÁþB ©¢´º†Â]«I0õàêÉ u3@Ø®¼ò–¾¾ëH©–ÉÄæ·C~ÓãB½ žt¾âÞ²‰•k6’´m{RÒÈ«,$=yéÉ«˜ÿÍ@îzñÚ9Ò—FúIúäúìÐD?³sð§–Ct`ÌÄîɹ}ÜØ¸¶Šƒ«ÉÔ÷«jǶ6CÞÞŒ!Ï‘2®¨'Ž¥Ã]lÑÜ~éÐ1:éÄ2vôüruÛ£i´dœ9^%{¯¢À¥cºzcòê˨²rWþLêäx"¬ ˆˆˆÈÙé”VÌîæ#¿B¾„r9ò7½® ˆ 8š!s Q@”ç—QYTR{Ïm ¢ßÑ›4ƒk~°>ÊòJ»X ìÐÆéWÞšBÇ0íúݼ>gé•élþ9Í? ˜ À”i#ÜÁ<58u¾ÇçÝFeqݱ¹pd­þÝF1±@[VÖ-ŽX½‡åßïáDö¢lʬà×H­7\åØ8zŒÇ篆ҦÅY¶ŸvǼQÅ€gh8>ì¢;UŽ–‰{‡f·™¦Ç…‹éáÛÐ ¶¯ÈþœÙŸs/¨¡$mk—}Í'ó¶S^²–Ïæ_À-Ž´÷š£A“볩~VÃöïãdŽ•'qãúâ±v5i+ÙZ0ŠÀU{°!C‡av4úràè8ÔþÈÿ›Û/[Vÿ;¾Œ›ÑŽI£%ãÌqÊw±pmm2Ä¡ƒK•/º Ž€}éP°šŸ÷]C縦G’š¢ Šp%(ØãÏö*Bù“hU/å(H+ f¨oíã –ÖþÝ+È_\€k™EVúyÔ^hÚ«óH¯½jÃ3ÀG×è0[ðë˜Á“Ø ïᕉSHOÞȺ5kX³v=)…2×ÏáEÏ®ÌìXžŽ^HÚ©©9zl­*§¡ÙØÇçÝ€›wíâ´öª|ò+íàaìT$«ÈnÞ¸x»•ÐîJfΘD;'j·á:ðÂtÌ ­Ççψ»£ûn?‚!óø*g/Ë׬Ø ÍØ!Ô?§ÁÑ´íxë„qc2E[–²¬ÊA=èÚ!޾–²œe‹7º‰:f “Ö¯Uõ‹Ú‰ÖÓº-dþò%¥`ˆ‹'Ü .QÄ·ƒ¤´•üTUxÑc`DË9ñ¯÷š° IDATô¯]ô™’Lr«ìtv«í¹Yµ³0àæh™¼èÔÜ6ãÀ¸ðöÝNh_6r—>Ë£í¦Ò£+Sž{¡þÀŸÈÞŒ›ìÇÁÕ÷óí!(Ë«p¬Wl=zÄõÔ§¹Ñ~VãXŸjb'q°l¼ºŒ£Ÿçj~-OaŦ-ï¨B6¬îuÜ¥Ó¡ž 88V”¯oúXZxŒÎŒ/'ù÷í"ç§^vJ“²¡¼î;ßâökß:á;E¬ýi×Åuobæ[%ûÝT›CC4ý#Ϥ‘WDDDÄq­êÇ£ì>eÉþ lÖR~[ð ‹ó¼è> ¾ÓÉÆ—Ÿ®à`µ¬Elûò?¬¯¤wïÇ#E¶šFf’XÉšÿ0W%$pÙÔ·Øßn8“nyéï¼Æu‘µß(=˜‹!Ú±<™]<ñ¬‹¤þ²‰,‹šÂdæÿoËÉ4êeÀ3ºµ»þ¯¾ÛN‰ ¬…Û˜ýØÜsï½<6'ྱµ7°¿²:½ªvM”šVò2/¼0ƒ÷–d6È9¬±:hxÒ+mÝ·9‚á£Â;;ç|N² ˆË€à†q4m¾qC‰ÈYCb¸Æô"Ì;œøH#”$Õ.tiḛ̂غtì”§®fñ?òãOëɬ:éÝ2­Bëé‡ðŽFG€üJ€ÐQµ§™ˆëâ°§pcH‡Sq3e" {_B¬[ùlîFò,v,¹˜;{Çqëÿx8\&Ím3Ž •'5##>íB°••Q–»w^ýQe³c­8ÄŽ%_±¼öMÌ„u‰ êôãÆûY3ú«ÃšQ6ž;À°‘üÅÖ–¡ÃÖÎì\i³¿Çq9yŒ§€ãíø³—°ua"õ,#~œ’õ‹Ù]~ⶪ*+©¬(§(kk¿xž/ÈÀ½ÿE hà­k""""gºV5c…ŠDÞ¿÷Þ?æO®=&sEwOL¦!ܰ€¿ØGéš×¹cÍ;¸,¾q“b\iüjЄWPi_ð‹Å\÷÷Éô<éu%&ÚôCÜìßH*\ËËS.çÝÀŒ%ù”ÔFè9:¿ _ÇòD £z»‘¸±ŠŠõ¯qûäך]4¦°Ñ\=ö{þ½$ŸƒóþÅ óÍ`­»EpëÅUWt#$ÈŸI1›˜“’Æç÷ÝÌ’v~Xr²(´®Ý¸þÊ6Gê4R†ïH øÄOvpß.´:†ˆ/f“n©­¬Øñh0®Òœ´{28RÒk·Œè‰‡Á“¨ža°­îu/†çs¸¾mnžË;‡_·Ü·án-Íñ;h5ýâ(£_w†DÁîýtèv¸~]i…iñ¬€1vš|­«cÌíÏçºá?3}E!Ù ŸcêÂòè`™ÆfµÇÆŸz×-öRnµéËò(ß2—çîž{ò—Ú_ÄM£Bðwq¤½ç5QZõ3GûTSû8VsÊÆƒNcà³|)%…YTaÇR»&®£é4Ðf:®Œf—³ÇØr·ãú^õÞöÂÍ,ÜR;Ø{ z˜·îíw̽lä.y‚ioíÄ^¶‘Ÿv•Ñ«÷1gÍC7|}r¢Þ™zS½õGDDDÎZ­èç#q7NãÂžáø˜ÀäAü…÷ðÒ£s îÄ\ú o<|ƒ;µÅÏl¡ÊàEpT<ÿþ¯Ü1ÿ&Æ•¨ ®aL´PNêú$rªëÿyÑ:Žûž½›„!±„x›)ËϧÄêA@d?.¼íßÜ7.“£y20趇¸r`$>&À-˜˜AWñÈ=ƒ_@ÔàCŸ©/ñÜ”qt‹ÀÍj·"ûOâžç¨}S‡k“žz…{/êKt0äfdQìL§¡—qÿŒG¹ ]Sa•&ê Ñ¢u|ß.aƒyx—ß7°ñ†èhÚ¦6ôé_÷&‚éÙÉ#.uÅ«î¯í‡ôp ´&­«_a ¢÷ Ã«f¶#¾Ýá‡} xFõæðZ¹ÑCâNÝ͔џsnÇ/HL°;<é<†o}ü+Í›S&Íl3 åýï¯ðêCW3º{$Á>µmÖàæKHto&Üð8¯?w5qž†SÐk5ÚÏNÑ>ŽÕœ²qï8–A~‡·lˈcÞæX: ´ÙßḜ=Æ;%}»¹läoZÈv+@ #ÿÚã„פ ðúºT°iQ2e ¦åN@xGâG_Í£/þƒá GÏEDDDÎx»Ý~ZŸ°¯à±g² =ü˜ðlz#9¥T­êDÎnUì|k-)†ð+xå¥"Z×üI‘&íØ±hU3VDDäOÁZBfVíá#5=#NDDDD¤Ó嬈ˆüA,¤}û o/ÞÌî¬0u㢑mu"‘3š®gEDäb£2ç7vgUaòï̸og¤ÖÞ‘3Üi_cEDDDDDDDäL£5VDDDDDDDDZ¨Ùüù9mœÚ®Ùgw$"""""""r¶Ñ£@""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$—foa-åÑ9x¦øø?ûø0eHž‰qÇõeNDDDDDDD¤5k~`#ƒF`^´ `Çb©bõö]L^¼‹ø«{q—á”fRDDDDDDD¤5rúQ W73m<Ì´ñp%Üׇ‹{µ£·½‚­v*í!öÓ=l¨©ûru>ÌÚÄûevª Óè3û7foÝA¿ÁðöjƯ/¢À~ŠŽHDDDDDDDärjÖX±[IN=DªW|šN²ºè ÿ.h×WeïyÁü¶q_”)²""""""""g'²ñË¿rü?Þú~5Ÿmç« (®ó=e»i v»]¯ãi†;v§pÆŠˆˆˆˆˆˆˆÈŸ+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8I')°""""""""â$VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""N:õ•ª¼~} S>douË’²¤Íáï \õâ*NMÉbå—³ùü‡íÙNuâ""8aªÉüŠ»˜üüæS?æ*;¥5PßùõÆ2®L~•ë¸í³T,õ|~8Ï—ÿ{SËòÜŒºk²œNáu²ˆ´l}õ:H˜2‹=ÇômKê§LKH¨ýìžydYkÿ^½÷C¦ùû÷d[›N«Õ:ñœœþ_îHH áÒ˜—YS÷¥*v¾u —òäúòÓšÝßËŸwÆŠ%›•_~Åÿ~ØN±µé¯‹ˆœr'ŒC—ÚG·#&Ô³õÎ;¥5PßùÃe|‚#ynÛÂ<7£îÎÄr‘–±—í`Ñú²Úÿä¯âç}Uõ1#‘}åvÀJáîíä·$­Ö¤¡1ҞœV{žóœáÒò$jÈÝ0‡7fýȶ|O:‰û1…W½çþþÐ,¯æ\ËO,Ø”კ|ïíLŒrÃ`/c÷÷ïòî7kI-ªÁ½M7F]1•kF´;zBªHáûéï3oýA íGpÃý·2º­°QúÛ">žõ köäRéJ—!“¸éš1tð4@Ci©áË{Ÿb]5õwßkâ…Û yæ±Fòi+fëWoñÁ÷›H/µböïÈ„iÜ2!v¼ÊÔ'~Á<øoôÎ^Š}6Ú™Ì-Cóøï¬ùlË35êF˜:’PS¿~Ê;s–±#§†€˜ümÊ-LŒõÂÐòÊVËJ~Ò×¼ÿñÓŠ –a S¹ñܘö6ÑGNwÖÏ:•[_æ–'Wâ9z2ý2ðóî*‚zžÇM·_Aß@ØîÖºñ®fèÍ\ÄbU_É‹÷wbo}cÇX_0½øjö¥fPV‰ ÆO¬mù’×ßýŽÍ¹Ä?—ÀÕŸ³Òý2^~ù2Ú»40scÅc·òöo\ðÜëÜëŠ%õSîºïJ?ÊÛww&c¾ccçÌšúË£*¹cã)8ÉïM}§Õõ)}H™>•‰¾\øük\ßÑ•Êä׸õ‰å0ò_¼u{'ò›SæÄ‘ÞÐ5YeÖqeÜT{hºZÞæ³d¯àÍždUªÐ>aêí“èîcÄ^SÀÔ ²ÊkóÜH44tžmäë“êî<Ê~t´œ¿N‘V®‘{U7€Òm ÙX¡ºR¼~«—ìåÚ.Ýp?6sfK*›Ò«ܵ†´Í`öÇl)¿ÈÌ«¢1W$1ý¦§XX{N ÝßÈxžÅœÆÈ÷=lKÒÇ|šØŸ»ú»_®gá½u‹ƒé5™?ðüsß²57ˆ~#záºñ’ê™ûXºv+*¢èëCEæj>|o6¨Úõ Ï}¼’4ŸAü-á|z“ùñµçøjÿÑ&V•ô‹‹"èÞÁƒò´å¼ûÁŠí`Ë[Á̽ÏÒߌt;÷/Œ‰©fçâ·xìå_Éo,íŒ`&Þs3]M@àXî½w,!¦Æòi§,é}¦¾žìàs˜ø—±t±îeùû¯²èè¼- W/d_@7:ù•‘¾ò}þ9} •â‰õ,cÿÒø|g%U{æðôÌìrÈ¥WN ]ίÌzüE–ýYByR5éóxæ©ÏY—Ó†Áç§§ë^–¾÷o>J®À^÷†úˆœZM‡å-ËVï¾ ÷!{Ë×<÷âOäXq¨—¬zŸO7–àåïNyCcGnÈIãP¨©þ<7Ô6l¹¿ðò3_XŹ ãh»ëKVÝ®Á1ð€}ÆuÆ@>7ecÁJî–äàAü˜Î˜v;>vúíkº<¥õSßi…}g—™ãzb&³©ÁBæ†í”âM¿Ñ16«Ì=¨vàš¬¹í¡%ç6G÷Q°ê[vùõgDO27~ÎÓ/¯8îó#õÚHy4xžÞíÇy'ÖÝÇËÉÑëdiš¼Wµ‘´0‰jb¸pòd†ùCÉÚŸøíÄ~Ú“Î%ìÚ~ˆšêƒlÙgÁ§[WŽýNi5v?aiä3«ƒciSêÏm¼¯&|4ÃBJùõ½/ØYa?&¥³óÞº…¿ZHûéöa&þÎÿãÁaþX3Ûsߟ’~Â7ͽïfú£ƒð©LbÆ”§X³üšQ¸äeP ¸zx3œ1Cú0l_9~>¨›E—ÛxîéÑ”®æ_7Î`{v:ÅV+e+¿!± bnüœ‚É2š {îá‹Ä$¥_ƒi»àÙàDD¸?æýç³­ÿ`®Ò¶}ûV¶‡e;—±­¤„C¥G+Íkø<}WOlëžäúé[ 8ÿþïÆŠ=Ä­ï¦WÈîMK8D0½}*—ŸP²[^ÙÊüµ¹Œ¸ ”® åŒVCöÚ¥¤b¢ç´‡¹c¨5çudÖg‰s‹±¶«ýVýmo4®§.Ía%»Ñqcƒë¾iì:'M =‡ŽÜÆû»°*{¿o¸êR·q»+˜1=(W;eûŠë;ÊL´;~r9X®ëo#¨Z9m5ºN»‡›GbLæ­o²;U Ž&úŒ§‹a7;×l&ïb/v¬9îƒÛÙ“êÍŽŽîì{½áò8§Cmþ›+±ã®ÙY­šúNëì;Ux÷G/×Ml\“DîE&¶lÊéh`÷ÛÍ+ó╳›¾&s°= m´9·9Þæ §ò'ØžM‡‡ÿά-óXuhç—^%»lƒYt¬làk55nÔù¦‡öxüˆŽò½¥d—”ÔX®»QñîÔ0WÇÆŽ¦Ôß6j(Ê,|‰h[;þ¼#ˆò£îæ°ññÕèϸ8;w¬bkF0kSÀ½ÿX:{ðtx쬢°‘ò°ÔÝ6=6Jë§¾ÓjûŽw7ÆÅ»±qý*¶¦¹±.¼G!Æ½Š Í,sG®Éj9Þœ?·9¾€Øøü‰íè)EdÕ€÷1ÉÙ+ól \>OS‘uÌ·›WNŽ^'‹HkÔDÇJÞú…ì´ƒ©bŸ½±[ž (gãâ”Å÷ãH ÙàMÇ¾áØ¿ÞÈî]ådÁ˜(~:²¯¦ÒêÑÈýD;ßjø³Ýï:6–6¥ù㹯î—sóÀ_yñï²$îðyüì¼·na`Å„OˆOJf9ö(?lE©dTžMm `¥$«˜€s®á™Ë(ܶ†_~ü†¥«>æõvñ¼ÐhøÌŸo ´ýEX»†`ªÉcïA àM/Mûå¿NÇNÓç÷jö}ù&_&Z|Ç+Ü6,€äSxv#Çx,3>~®€/çÝ/cÚ˜Àf¡²ÚŠ‹4š˜p¶2âè"=»{g7¬9kùþ§\zLd¬C}EN¦Æ Õ~³05R[,öbRÓJ€ö„ùzàÝX._ €Áxxî…£c‡#ãЉŒxxÙ¤(ÅÖÙ {É~öA탸¯/_Þž^ãºbܱ‹Ÿ,"³Æø1ñ44±Ýqc§k£åáVØ@Öå ¤¾ÓjûŽÁ‹nãzã¾~‹æ×†ÃGÇàa ™eÞœk2ÚC‹ßdáÀ>Jk¿YœžM¹=WÊÈÌ(ÚÖ~~\95Væíp[Ñðyzb§Ã‰Ø±7«œZz,"§Wãz‚+kÕþBjMßÈŠc"¦•‰‹Ø^Ú—>GþâBP·®øÏ^Ï¢Åj‚ÇÒÙßt4°b=ÔDZ½kð~b=ül<½›K‹€ê²jl€½"ŸB§ÆðzÎÉ\w-Ý6¼ÃÊd vOgå½u +®DŽ;—ˆùŸ“8óI^ÚÚ‰ÊÍKHsx{;ÅIÿaúì4üâ'0¡»?ž~@%î^®ML 72ì"âç¾AÒOóRÖ@2Vðc&x¾˜~Š—7œ¶Ñ`Äl w±q[c½Û—šj+PÊÞ5‹ùjw?¯«<›9£ÀƒÎçÇoý–÷~ç„R°æKíveäã¯Ó)¼9iÉ™ÃLøðñÄü÷?lû9ÞØ×‰²u?²>ËŸñ}þ¦YJ¨¦Æ #dÖ~Ó–üO¾¸‹®Ö­,Ù.Ý/dhˆ7ôá)^'±ã„qh\`sŽÅLÛa£iÿ¿9ìz÷)fìÃ’´„ÝGƤÆÇW#z£«)™íK¶‚û@ÆvñÄ€µñíŽËs!#&6\7›®(iuÔwZoß1à7ŽÞkYók øŒbtŒ`oôš£¾2wüšÌöPМc¨û¨›n^³åmf|E¼u#_'Û0vžÈÐ0—#Ÿ×ro´GË©¥×É"rz5>.Ú®ä§ý@çi¼óôX‚ŒUüöÞí<¼p ‹¶ßöhj®íúÒÁ¼˜Äà>¨a棣AMVSi•ó`#ãÔy|6±‰±Ô\M0+H[ôÏ–uºk5»›SL'œ“ƒÿØ2Š[.[ÀÝsïÙyoÝâyØæöñð=‰óÏbõ’õuOW7G·v!â/p÷_âñÜó_ÌžËüí.t›p;÷œÖä §)x$ÿøç ŒèXÅæï¿fá.#qã§ñä´sð76‘¶[4cFEáV¹…Ï>\I^£3ŒÝèxñµŒŒp'gýO¬ÌêÀÅç…ìÜž‹ã¨À«Çõ<~ëÚåüÊÜOf³¼ #nŠ)½ôV ³™Køù<ðÐ%ô Êbżl®îĸis]œÇéÎÚŸNããÆÑï ¹€¨¬U,ÙXHhïKyøîQ› ÍìÃMŒÍ‡Nfn÷¸ë\:ùf±vñZ »L¤Ï‘ qÓã«Á¿ãºÖŽ´îñcèâihz»ãò¼ŠÊ®Óþ,ÔwZoß1xuflïÚó‰Oÿ1tôhn™7ïšÌÑöÐŽîë{?\7Íç‹÷ã×ëb¼o|= 7^æÆÎÓÇÕÝZ<&:^N-»N‘Ó«±q1ˆ¬?“ÄŒèu̘äFû¡ñxcaë¢-³8¬Á#š~µÿŽì‰û‘¸†Œ_šN«¬mÃãTc÷M¥¦°qLÜ›`s.Û6íÃcØ%Ä5gúE“çd3ÜÊ…G.gç½µÁn×*""‡ôʹӡæ¨Jæõ©O°ÌïJfΘD»&OŠVr<Èmd1ðáw¸¯Ÿ‚!â<õimj2¿âÞ;g“Õç>z´/ú)CDDNµ;v-~HDDN;%fpçsk°u»Œ¿_ÝûÆOYY Á#zÜÔèn-d篋ù~^*x c|œ§n åOB}çO¡&‡õ‹Ö’¸˜õЭˆˆü¾X9#ðés3÷\/øšé|Ñ+ŒîçßÁMWu¢É™æ5™,þh.Í}Ó•ôôÒ­¡üY¨ïü)X²Xµd/C#GF5]¯"""- GDDDDDDDDšéð£@§hy1‘?VDDDDDDDDœ¤ÀŠˆˆˆˆˆˆˆˆ“Xq’+""""""""NR`EDDDDDDDÄI ¬ˆˆˆˆˆˆˆˆ8éÿÛ»ïè(ªöãßÙÍf³é=ZŠtPåP@ÁÒ”bA¥( Ò›TAÔõ‡JoÒáEšH -!•”M²í÷ IÈN’%JñùœÃñ˜Ý¹wî½Ï}föî̬ÓÝl¼wïÞ’Ú!„B!„Bˆ{¢~ýúo«Øl6[ î‹B!„B!ÄCïĉ€Ü $„B!„Bá0YXB!„B!„p,¬!„B!„B8HV„B!„B!$ +B!„B!„’…!„B!„BÉŠB!„B!„ƒdaE!„B!„ÂA²°"„B!„Bá YXB!„B!„p,¬!„B!„B8HV„B!„B!$ +B!„B!„’…!„B!„BÉŠB!„B!„ƒdaE!„B!„ÂA²°"„B!„Bˆ»gË!ù÷ø`ÈLvœOÅd»×;ôÏPl6[É5ÕšÊE㙹!‘ºïŽ¢ìâ7Yõ!Ó;Â;câè3c•õ%V›¸dcÚÀÅ”óOk1_ZÍ›öÆÚ˪aã¸Þw:ý£þe sã>aäè´¾Œ{‘¹¶ÀW,WXóÆ@–;õföG¨¬‰l|»+Ê|ÀÔ–ôþezÌ›@+ßb¬Eß“x·th5sÿÄ¡+è«Òú¹~<×86²c71oÆWì>›‰gDs^Ô›&A:pøµš¿‡Õ‹V²éÈERM:<ËT§å³½x¦a0ÎÿP/ˆ¿‰-=ãú0éHÎ_ÓÕ`äÂQÔu½ãÍňµ¸½-›ß?ÎòJ£ÝÜÀ–ÅÅ­K™¿r;'løVlL×/Ó¢Œ¥Xû*îgŽå”â%¿bňƒ1Zä:ß&lû; øì¬ù6ñÿϦøÕ‡' IDAT÷åšÝXÏ&vó"æ¬ÜÎïI&ôUiýBžoˆNuލl—{—o`æ›óq~s:}"rËŠÐ^µ~³[¿É?«ôÅKá$íXÊÌå[8™hÆ#,šN}ûÐ>­ÐyoMûof.äÇñ½¢hÛk=à¤ÚjmPéßz£ÄëWͳŽô} :L\³×¿ª¯ý9_µþ¢”é œ3,0‚µIù_ÐQçE¼U#“ #ðSÓ©LêŒ6sï¿´ˆJ¦ó|¸®ˆeAàS“™ö\8¨å¼Â¶Faõ 7ø6>ïk†ÀGhÓ³1W?bØÆh&MíJØŸ»f#ãÀdúM×0djGé`ùýéí“é?NÍ— è2!À+ cå×Ó·Þé%'NœÀ©DK5]cß¾4=“—#áê ƒ ô,…Ž#%Z™÷ £+¢u€‹Y-ð5€5ù{®ìâxêôU ë"/鍸t!íxm°‘p÷‚Oï'Öä_™7õgè6Š1¤ì]Æ„1„NâÙ€Ó,»˜K-†3õ-.|=O?\M™)Ý 7Ÿpìµüg+9gY9v*¿TìͰi(kÈ$vÿ7̘1KÀzV”ÕÚ9™ó n44Ž®ån}¤U\ð7ð^cÑãF5nÃRþ8Äþ}›Yýóeü*åªâÔçŒ_tž˜7>á­H—·.àãqK(5µ•б¯âþUìœb¶/w(F<;£E¯S‹®éP¦VËáö·¶¬?øzÊwø5)ƒE%Ö+%­eÊü£Tø!C«º“tð >ž1ð¨14ˆwl»·¿D°¦°wá ¶%iiã@«õ['­ýú›©ô…æÚ¦Í;DùSxë'ή™ÈøÉ_PiÆ+DjTÆÔ|…µã'±³|_FÏ©„éèW|x W²í^Yg·rܵ][WÄÛàEx“géÇ“©Ïmf¯©>/fѼqtÞÇœ™;ˆ¿º‘O>Ù†wç1,X:ƒ¡Mn°ú£…N·±þXr€ŒËÙèÖ…1óða·@öÌœÌÚ+f¬ Û™½ä‘}&ñÙ’¹ŒéìÁ®ek8wkF™¯mæ›+ ysÆbf½Q—«ß.fW¢žò…µÉ© O¾?’¦¾áôøx"ÝÊå]…Ì:ý%!ê•),š÷k¶±5.‡‡xn<ˆ4ÞU¨˜ÂÿN%c!“³».âÓ¸91õ=9ûËŒXH9ù)õˆôº3E<_¬ªñn‰³3ÇþÔ¨íÉ¥}ÈÂDÜѳd)FNÇ„‘óû¯à]·:†£þ“—*}™<® eoMEkÚYN$¹ZÚ@æå‹ý£(uë ^Å5”J^©œ‰Ë"Ý¡×îœËZ¯Hªû^âÛ¹KYw8–T“ WªôA¿&þh$^h–´+ÄS90o}{¿ÊÀw§óý±Ô;?Üb-VÜØ[74Š+‘Oõáõþ½i’û¤Ì ϲ¥ÐœßÎþk9Ø0‘xt û㓈½žUŒ}÷³ÂrÊëíÆËŠ#ŽÅ¨ãuš.­eáþ(z<޾X×¶f`OÖMxžÏõbð”½T~­/õ½tnw3oZw2ÿó$Ú è@hî{®ŠÑ^µ~ÓRÁ}¡àÑè–|Ü`-ØL©œÝ»—ŸÊ”÷Òªô¯ŒØã$yøqዱ íó2ýßšÉÖDw|ô Z•}±ßO¼Uú7ï²þßQ¿Úq=ÇÁ¾×¨ö¯ý×” 竽j™ªQz)vÎ+ ›‘Ø»‰÷­AÍà@j·‹$}×fÎgØÈ<¹‰cúú´ªàà%¹ËtÆ«ÆãÔ¼2‡áãVó{bWS­¸úâíüðŸ“ýÃKG6’~Ïa¿ÎL}4_-ø¶íEçMo°åTõô`3¹‘aF_¶=>žC¦ÆÔ_ím“N“r`Õ”áéW;ÓÄOƒ5¸%aË~âPBJ{ŸgÛ!…zƒ+upl‘˸ƒ[UžlSw¨V¯,®'¢x¢N.N>Ô®ÀÚ¸,\*Å™±œýqÏî{šÍÇ]iÔ)$×}}&.o[O\•ž¼W·4î 4ï1ÍA# ¿~Î…ðn kŽ·Þí{ÒvÃ(~:‘IТÕo´éÙ©6Á yžßÜŸÕ;®Ðþéú žRŸ oœmFŒžžè²ouëHns ç©Nu Ô+P½1U<‘’eŵÐ6©ÉæÜúä4D×è\†Ý{PkǼ» ¢‡Ô:7DNÔ¨æÁwÏcláÁî?\©Ý¥!9Õqž¼‹ YI?‡ç#Õ ( C<_Œ*ñnæúžõv渉7êVA;ó0W³Bøã¸èŽQœ8rš´Ž9:§ç‘Ž!8§4þîwœ,h ~,¤žü™Ï>]Ωêý_ÙÓYŠÞýíãšÆgYÆl²Ž¼fÂyï#×Wäù‰ã)¿n»VMdÅÙ¸…W£^LžnS«Ý—x}XÒ’ÀˇRM{òbo=×v~ÎŒñ“qþäÚåýfÑTŒ¸±·j'y ÞÑ}pr2³tg†¢Ã¯Z3"üœ¸n²`.ò¾ŠûšjN©‚÷] eÑãÙÑu°Nk2{WlÁ«óX" PX¬›b¿còÒZ›Ésµ=HصgÍ`K¹·iåèv¾IlŸ»‚ôöïñXH‹ìcµ~3Å~k¿þ{}ŠÆ rN/dà[?‘€7M‡ô¥‚^­ߥf²‘ìØŸÙ[o ýß+Eæá¯øôã)¸}2šV9*}`¯ ®xc¿ó²’Uâõ«×M(÷½ýþU°÷š„¿=竽†’™£vYøð:çú“k­aÌ~'÷( ŋƣf2¤z!9¯°í+˜8>¹g¾×ËÑuÒ0qÓ`«ÑŽªY Øtî""ÍœÜt CƒQ”×9w[¾n4­4ûÖ­fñÊL쳃ИWѧ9Á÷@ÿôŠ™ô¸dŸ_Á°Þ«þü«%ËFXZ†ýùì7|;{ KR|x$¦:Åੲиävó$ZãSƒV¡KØp$‰–áÛ9¬iÀåH?\ô2òSt\n¿¤hÐ:»q{ÑM¹õwÅ-’˜Š)¬<Ï£á›9æÚ˜N¥sG…´k™¸…øý™t4^Q4o‘Ë21âz;ë8yêeåHŠkhÑêpò Çïö· Šà7ŒñéX5Þ$î]ÆÜ§I4»âçkÆh-õçvZ×ü ·+WþL~…·I…ôÄl<«ûsûhÅ%€Po'ÒŠX¿˃97LzÊÔ@;ûçÎ8N”Ò¡·6 ²u{Ï'û‚–ˆö!èáÏ[Qn+x¾¨Å»•ôûs\W¥Œ_qüJÇ’BhÖ¤ [pær:ÇM•x>T›KAã߆jœ/ØŒçÙ¼h:K¹Ò¬û‡LmQ7ÅJ¢A9dÛÀC¬9¤ç(8»8£79òšÓç³Yr0ëËѤsšv›)…³{׳zéhÞ¾ö>C\$^dΞgòÜ¿þ?´Ó«<½k(›$Ó¶­®…>Ýx»3nÀ^ܲCZ?¢{O ºg6F‹çXüúNŒžzôEÞWq?SÏ)£y;d9#æ$-mFóiŸ( ~’“…ëÞgpž÷Ú‹‘Dj)Óš¯\çbÇhqêü+.Í×¶òßs‘ôäûWœÚu-q»·r¹B7FÕÆ @h“®tüa0ë¤Ð¢µ#Û%R•y¬4=ÉíJãd9]ÄÑ*¨½öúÍLl!ûm·/nq®ôsW=Ïõ#«™0y «B¦ÐÝî¼O¥¦“m`{^é}óª†àž<µi0›ÿwÊÉêû¢Ø{{ý«#aû¹úâ}Þ-éúÕŽë7ólÁyµh}_`ÿÞz&ǯMâQ»û¢äë GçS!c®sì8RT=Uûçµ*]u®è½q+¡²P4¸x»’óÆ2µ»Vuû›œ¨ðò†Öºùn[vǾ›Æg³~¦ÑÄ'(í^v5-ÌÜxc™,6w£Ñ{eÿzøÝ–¯­G8 Ú·cß± üçÅ 6}4›éÛª2®õÃ}üý‡V´¸ú¹aˆz–ic›â­X0&%“íîKNÂy µºón»^d];ΖŸ2a†;cØÛÆm(Šö¯AÒøR£E(˶îãÈùC觬³–T»õP†#w¢bÊ“ôÝnöüq ÷¦]È»¡ÅÕÏ…ÌkÉä:À–þ;›·'àïeÀxö:™6n.º˜S¸tCƒ‡—K±öÉ’z™T3k›‘ø+™¸Dº’öëT&¬ cÈû“¨¨ÇrùÞ|ï|®}×ü4÷BÛ¤F‹G  7.&Ci €-;‘Ë©<‹Ñ¦‡xn܇ å¢ 3®bÛFc¥Þ„é[yW4²dã6cÏ„Ûù–£Àù¢ïÜüìÏq­k†&²nÇNnx×¢B©Hj¸¯á—)¤„µ§¼« c|RãïÉì÷“çªéœ‹|7n4ŸgÜÌ–„ýù° î!a’~'>§-þ.`˺ʙ^T4àîéÈkw~|ÉØ?>KË3vÚ ”×¢ó¦Bãμœ¹Ÿ×ÿï8™J¼>¸¬¤þ…=7*S'àæÉƒâ„‹NƒF›N¨Å[{íÆ­:Óåõ,YçL‡1;ƒåê1ަúÓ¬´3i§·q_Åý¬°œ¢49 GñÒ´ œ«Ó®ÿPÚéжêK·ãÓ™>èGŒè ¨Úšþý£ññWìl£…+Ôá[‹¡ó˜—ó4MJ9Ro¾2ÌWØ0o:»Ï¡f©âý4¨âY˜p+Ç3›Ñ°”ÓeéBŸdxßTfÎJ¯D¾‘­yuP Á C'1kÉ;¼4=°útñ2µ<lE¯_Ò–êW–0¼×²¼#h9`O”Ñ£ó}‘§wOe|¿5hªÐ²Ë«<“>—Es~¥rÏ»k“¢ ¢fes†½I΄ÉtÍõ5†¾â³ŒìƬ¹Cø¿ O*µèD·ˆï¹Z¬^ý÷¸ïçÆÃDëGµÚpÑ‹†î·N¢<+7¡ÇH­U ßbÞ»¯ïÚà¶vç8hñ}¤.\%¬F)œÑZ7íö$êUõAƒ– ;ãŸ÷f®Ÿ8Gúõ}Œ´.ϾE¼þ6¯Ì‹ï¾ÀÜéãxés#å›ÑïÝ.”Ó:_ËGã]Ÿ~£û±rÙ·|:ò3ÒL ßpª·Â¢pÕU’x}€é#žgD·ùÌžý&_§)x„Õ£ãðAÄøk!;ß±Á 7yÞëUHÜzÛ]Q¼êñêÀß™:÷ zÍó ¼n'Þï×’- ¶¯âQXN)øQðE£Ïy–[íÇhqë4Çæ`již ÍÛ2ÕX/Óƒ3™»ô-zOÍÆ­L: DL€ǶÓ⋿ǭʳ“1hµX}üðq+ÎdžÂúÍ~ýöûBÁ£Ö+ }| ƽʢ ·Ò5h;h8íK;ád³ß¿ µè;êfÏœD¿ÏoàR‡ÇßBË@-Zìí‹•‹?©µA¥óQÜÿŽúíåY3çì{­Ÿ½þÕál¿ï¡¨ç ŽÎ'µ±‡Ø%3GKŒ)‘ß{™sÿ­bŒkG¦ôåŽ`û³`BŒzγQß~LùwG댯-–_'Ò¼¥?Z}9Z5öbÝ÷.tl\*ï‚À]•ŸLóf}é{f:óGlàz¦…=ï–¢ÚcƒèWÃí¡ÿbC±Ùlò{”%ÅvƒÝ㲺Úx&u,íØ“›”y`ýVEóÉ„6”è3ïa›„B!„B<`ŒG™ññ<ýÎSòb¼'Nÿø­@/›)„ß7²æT -£ƒŠˆ‡±MB!„B!þFN^TªZÃÃ~™J.ùúÑ?'ëägŒвO¡ÅCòSŽc›„B!„Büta´ëv¯÷â%· !„B!„B“Ü $„B!„Bq—daE!„B!„ÂA²°"„B!„Bá YXB!„B!„p,¬!„B!„B8HV„B!„B!$ +B!„B!„’…!„B!„BÉŠB!„B!„ƒdaE!„B!„ÂA²°"„B!„Bá YXB!„B!„p,¬!„B!„B8Èén6ÎÊÊ*©ýB!„B!„¸'\\\Þö®Vî¦b!„B!„BˆÜ $„B!„Bá YXB!„B!„p,¬!„B!„B8HV„B!„B!$ +B!„B!„’…!„B!„BÉŠB!„B!„ƒdaE!„B!„ÂA²°"„B!„Bá YXB!„B!„p,¬!„B!„B8HV„B!„B!$ +B!„B!„’…!„B!„BÉŠB!„B!„ƒdaE!„B!„ÂA²°"„B!„Bá YXB!„B!Dɱåüû|0d&;Χb²Ýëú{)6›í¾jbÖñéôyÿ2=æM yæ7¼9&Ž>3PY¯÷L[Ö1¦ \L¹1ñD°ó¥ÕöÇÓ˪aã¸Þw:ý£d° "s£$9:­/cã^dî‡-ðUËÖ¼1åN½™ýÑcjk"ßîÇŠ20µåFÝê÷V¾ÅX‹¾G1mŠßÃêE+Ùtä"©&žeªÓòÙ^<Ó0çl/ì±th5sÿÄ¡+è«Òú¹~<×86²c71oÆWì>›‰gDs^Ô›&Aº\ÛgóûgÃY^i4£›{£Zf>¦ |1è ¾ÏûgCà#´éÙŸîÑþ8§< éï|9°Ä”Tl9PŽ5í7¾™¹ÇbôŠ¢m¯Aôh€Ó…smÇRf.ßÂÉD3aÑtêÛ‡ön·Æ-[·.eþÊíœL°á[±1]¼L‹2zÕ:Õb¦(ñ$Žå´‚rE>¶4öŒëä#9ýMWƒ‘ GQ×5ÿ›‹’î¦Î· Ûþ>ûk¾Müÿ3é½C¹¦2Gì×÷ûm»q€™oÎÇùÍéô‰È'ŠÐ^µúmÙÄn^Äœ•Ûù=É„> *­_èÏóüHþY¥/^*Oº#mú;ê+$wÙsGŸ‹%ŸÕò³ZÌÜí1üv88½ƒ9d¯Ÿ Å™ÏÅcMÚÄ[¯ÎáLÅW˜óá£ä:œgŸšGÿw6`j>†ù¯WAs¶}ЗÇ}yâãô(«¬‰l9€ŸšNeR‡`´™ûxÿ¥ETš0çÃïì'ÕÜ—s†ÅF°6éÎý |j2ÓžQXm÷|§1W?bØÆh&MíJØŸUÛÈ80™~Ó5 ™Ú‘Ã#G:Xþ­ó)Ó%~œ4š//ÐeB€WÆÊ¯1¦o=¼²K;Nœ8PÀ¹Ð=¦ iÇkƒ„»+y¯÷Fˆû‡Ì’àBxtE´³p1«¾°&cÏU€]Oý¾ d]äà%ŸÃ#w¿ßïrβrìT~©Ø›aÓQÖIìþo˜1c–€)ô¬xoWá¬É¿2oêÏÐm bHÙ»Œ 3&bij§Y2v1—Z gê[þ\øzŸ~¸š2Sº®3“òÇ!öïÛÌêŸ/ãW©ˆe†ô!ZGÄkŸ0²®`ÃlLä÷õ³™úé,ÊÎES¥åÖßeþÎòÀ–xIDATÞ¼ÌWX;~;Ë÷eôœJ˜Ž~ÅdzfP>òbò-:Z®m`Ú¼C”8…·qâ욉ŒŸü•f¼Bd¾04žúœñ‹ÎóÆ'¼©ãòÖ|¡Oÿ`Ÿ‰»Sìœf?WÜÁœÌù7 G×r·–hü w¾U=Ï(%P§]Ó¡L­–Ãío;mYðõ”ïðkR‹Ú18š‹°ßÖö.œÁ¶$-mècµú;i×2eþQª ü¡UÝI:øϘNxÔš©ô…ÖÁ6™¯”|}Odª‹½N) OÕbQ-ï:˜CíççJ™öÛÛÅc¯ƒÇð|ÓÀÁ±Ð™¯«ôSÑç³£” ›Ø—Кǂn¯¬dsnë~RÜCœt€ŸÏxU:[ÎólùJûì«°Üh\¨>d ƒÉÝH­Þ ±Ø?ß™Gèû­)ûÕZ¶_îô×¢Ž-““›Ž¢­ý&Qî ‡.ÿæùT½ó+ø&å)&O.ê)gxjpyþ;l?_ªI×ÏÏ|%º°b¹ö=o¥Yý$~^w”DCe:öy×Í‹ùvß%²ñò»¯Ó*ØJì†ùÌøòÎÞ° ó‰ e¯!ôj¿±rI,/Õ©_žÂØóùto8NB¶+! žaPÿö”7ØHÿ}-óçÇÞó)èJ×á‰W^£Ó#^X¯|ËȉI<Ñ:™¯¾>¿G2)->æ“Îep²OÎaÀG™¼6s0•.ÿXxßÞàÙOÇÐÜ[)F{_&påf{¼Å´Þq2€þ¼ûiÊÿW&®ïû’Ù‹×s4ÞŒOdz êI£@H8°Š9K~æWMx…×çÉW_á±wlEì?bÀšZt-ó _oýƒ ÏHZö@ÆÁèȶ?·ÚÞ±]&?¬ÙÍÙžTzot)ËÙéÔÛd¾ÄšÑÙ‘ddÇð‘dŒO—ÜsÈfäüÆÏ˜½r'g3<‰hÖšÒ&TWødÿ¶¹qÿRp«Mhηü憎šåH;µ‹ke;òXÎF~9NóhL׎pÖJ— ®Ør÷»Ý9…j1m.xW¸Áwo çP§™ŒnêMÖ‘)¼:ö(õÇÌåõ*Î$mz‡?D3ù£&Ä~YÐçíoKÊ %”¦ý;­ˆ ÔîDÄô¤_ì ¶]KÃRQ‡ñÆDÖÙ­wmÁèÖñÖw“géøý ¶žLå‰ôÍì5Õgð“56@Ð3ݨ¼}¿\îBxYqGr"Aƒ·>ï•jev ó/ð~W'WO<=Ýnþ§Ñí£Üÿ­âbª…¬¤¢—§Úß—NðÍÂ)yr`·r*óÛáØ*<‡ÿ9Sߢìþ…ç]Ó¥-¬¿^‹—G5$Ìhö ã+Äcs»ã;n2þØÅÅÀGT'7-TmÓ–ÐÖs6ÕBd`î14qýÐÒ*ö CÍ Ü€ˆV]hòÃD¶^Ȧ¢‹ý:³ÏØ™R™*ñ$++ŒÂsšž<Á–c7WÜÁœÄ…4ªE–¥L ú{UóL¨kÉÔéHˆÛív9õù4®·Äk‘NÄ}iŽTŽ´8– Ýo+É¿.dileªxžýëÏÅècµúŸ®é†»³zƒWƒ'½;­‚Ön_È>àX›]I×—Ht¢Ê¸x >U‰ µ¼ëXìÌ—ìççÐXûýÛÞÏÁcx¾œëèX(F•ùSŒùì}šF¤°uïuí|3ïdŸcË jÂÉ?ßh!þ×õ\*Û…±Oæƒù9÷\%¢\ŠW]¡¹/ @Açꉧg«G¦›ÿ±w¾sIW‡vW°jëEžy±΀-ó$›Žé¨;¢®ÜUùSMTOMÅäl@§¹yŽ ¸U£÷øw0yÞw×u”˜¿Ç|åv»wcâ‚Y ­s•¯'Ìær³w˜»p"]=ðõºX²¶3{É)"ûLâ³%sÓÙƒ]ËÖp.Ç^©62-`ÖN?º¸€EÓRãÜÌß™ˆ%u/s&|KvËáÌ^:Ÿ÷þ£á§?e[ÂÍ‹È,q[øêXYºÁKO–#iç~â-ÙœÛv[íG‰4ï+ZÃúPÇ#ï dáíM ´Ye²îአ“Ó›áÚ°¡ºÜåüĤé íõ1‹æ£{ð>æÌÜAüÕ|òÉ6¼;aÁÒ mrƒÕ-äpº­ÈýdœXÎF·.Œ™¿€»²gædÖ^1c-d,Ì×6óÍ•†¼9c1³Þ¨ËÕo³+QOùÂÚäT†'ßISßpz|<‘nåò&Õ¬Ó_2qÑ¢^™Â¢yïñ¸f[ãìÀCáß67îWï*Ô Lá§’±ÉÙ]ñiÜœ˜úžœýå F,¤œü”ÀzDzÝ™" žVÕ˜¶ÄÙ™ÇFjÔöäÒ¾ da"îèY²#§ÆcÂÈùýWð®[ÃÑ‚Ç8ÿ¥²Z¯Hªû^âÛ¹KYw8–T“ WªôA¿&þhîqL¸TéËäq]({ûªØ´³œHr%´´ÌË1úGQêÖ¹¨âJ%¯TÎÄå€âJäS}x½oZ‡8±L·¢àlFbì&Þ·5ŠUžjÇÔ¤S¾èX¾U­ÂÊÌ=U¯}uy×FFìq’<ü¸ðÅX†öy™þoÍdk¢;>úüs_Á£Ñ,ù¸ÁZ°™R9»w/ >•)ï•ÿ„× Ï²¥ÐœßÎþk9Ø0‘xt û㓈½nT©ÓFºÝ˜ÉRyíá>Îß ¤v»HÒwmæ|6€Ì“›8¦¯O« ^æ“ç|ʯSóʆ[Íï‰q\MµâꈷóƒñyÁ%¿däV•'ÛTÄݪÕ+‹ë‰(ž¨€‹“µk°6. ›W}O©‡O7Î6#FOOtÙ7Ȳý7Àf6r#ÃŒ¾lz|<‡L©¿~Ïa¿ÎL}4_-ø¶íEçMo°åT:MÊUS†§_íL? Öà–„-û‰C (í}žm‡ê ®@ÖÁ±E.ÑöºTŠ!2c9ûãž%Ü÷4›»Ò¨SH®{AM\Þ¶ž¸*=y¯niÜhÞc0šƒF~ýœ áÝÖ,o¼Û÷¤í†Qüt"“¡E«ß h=Ó³Sm‚ @ó<¿¹?«w\¡ýÓêcas ç©Nu Ô+P½1U<‘’eŵÐ6©ÉæÜúä4D×è\†Ý{PkǼ"Ùêß67îWNÔ¨æÁwÏcláÁî?\©Ý¥!9Õqž¼‹ YI?‡ç#Õ ( C<'Œ*1mæúžõv汉7êVA;ó0W³Bøã¸èŽQœ8rš´Ž9:§ç‘Ž!8§4Æîw.è+òüÄñ”_·‰]«&²âì Ü«Q/¦O·©ŒõའÁ €…Ô“?óÙ§Ë9U½?ã+»`:kBÑ»óçgt3Î6²Œ&lØ¿ªÂ~™öN LŸÜ“ιÿ¤”£ë¤a<â¦Å(Oµ¿«àïíJ!ó»ø±Ux™‡‰3ï&ïZÉJ6’û3{ë ¤ÿ{¥È<üŸ~<·OFÓ.(ß·Ã'tÈ9½oýDÞ4Ò— w|‰«àÝ—''3{@wf(:üª5#Âωë&™éöêEM£½˜É&Ûîkêñ$î3…ͱ»øbÚ’–^>”jÚ“{ë¹¶ósfŒŸŒó'ÜÏÅÏ3wQ§5™½+¶àÕy,PŸ#êÞoËu¶Ï]Azû÷x,$ƒÅÅjeÑê7Å~Ëä¥ ´6“çj{°k!ΚÁ–roÓ*À^_8Þ&Sìw%\Ÿ+Þc\TúÔ~\¼KM»y×ñˆÆÍn~Ö¨5ZC‰Ã µùÓ2½èóÙQ®[Q=}!»®>Nç2fÎnù f# ŒßÙ·Úve;[R¡WM/4®´­«0iÃ)2ªÕÄM½ø¼Šr~a5ràÃòÏxÑxÔL†Tõó ¶í¨šµ€Mç^ "ÒÌÉMÇ04Ey=s·å+àÖˆAÓJ³oÝj¯ÜÈÄ>;y•}šü^8Zâ +ŠÎ€ËíóiEƒÖÙÛ SŠæö÷.cîŽÓ$š]ñó5c´–R-×­V?F>û ßÎÈ’‰é@§N1xÆÝ ûü †õ^õç{-Y6ÂÒn.(hÜ‚r»Y±Æ§­B—°áH-÷sXÓ€7Ê;‘~¸èe8Ô^·Hb*¦°ò@<†oæ˜kc:•ÎQÒ®eââ÷gBÒxEѼE,ÊĈëíŒääM¨—•#)F¬¡E«ÀÉ7¿Û«ãŠà7ŒñéX5Þªc¡u ÀÿÏÛ ”?cámRc!=1ÏêþÞs¨¸êíDZKxýÛæÆýKO™úhgâÜ9ǩ€R:ôÖT¶Îaï¹ód_ÐÑ>=`ηuÁsB-¦­¤'؟Ǻ* ¨`üŠãW¢8–B³&õHØz€3—Ó9nªÄó¡zÜ\ ã6TËwi³ä`Ö—£Iç>4í 6S g÷®gõÒѼ}í}†¸Üû˜°ϳyÑt–r¥Y÷™Ú¢ÇFóvÈrFÌ;I6ZÚŒæÓ>Qvže`áú†÷œç½Ï3yî_ïíô*OïÊæ#‰ÔR¦34_¹ÎÅÊ3Å­3™¶moÎ!óµ­ü÷\$=ùþ5§ìÎõ‡¤BqóãÍýŽß2—•¦'ù ]iœ,§ ©A­½öúÍLìî­\®ÐQõƒ1(Ú¤+Ìú#)´híg¿/j“™kK}öÆEG†wsõÅû¼]á»}ê\Á^\¤RÓnÞ½ûh/?«õoñáJ¾¾Å>Ž…ý~J¦mÛÂçÖ]s)OËšFæî¼BÇ'ÒØü›'Í: ]{û &b·nåJj½òÀ–“ƒI¿Žã5¨WŒ‡èz~Ñ] =Uûçµ*¹î3R4¸xßþÿBÎwܫѮ¦…™Ï`,“Ŧãn4z¯ì_¿Ûòµ õ§Aûvì;Vÿ¼Ħf3}[UƵ.¡1¹Ï܃›œl¤ü:• ëÂòþ$jê±\þ†7ß;¯º1! C­î¼Û®Y׎³eŧL˜áÎØn¢žeÚØ¦Ü¼•ß‚1)™lw?´  (Ú¿NãK¡,Ûº#ç¡k<œ²ÎZRýŠQ†#w¢bÊ“ôÝnöüq ÷¦]È»¡ÅÕÏ…ÌkÉä:À–þ;›·'àïeÀxö:™6n.º˜S¸tCƒ‡—K±öÉ’z™T3k›‘ø+™¸Dº’VØX(š‚Ú…¶I@n\L ‡Ò[v"—S-x£MŸáܸG å¢ 3®bÛFc¥Þ„é[yW4²dã6cÏ„Ûùö«À9¡ÓÜüìÏc­k†&²nÇNnx×¢B©Hj¸¯á—)¤„µ§¼« c|AcìÉì÷“ûÊÙŒýè³´§-þ.`˺ʙ^T,ä‘ovË´GAïHPÐíð{¢ÿ}÷7®åk9v5›üO24]^Ï’uÎtèC°3X®ãhª?ÍJ»â¡³W§î¥ìÅŒwOãIÜW ËiÊóãXѦðr@K@›Üïµ’vz;;nT&¦Î­_µRœpÑiÐhl•¯Üœ‹¬)Vž)n·ç~6l"½öëDæ:ÙŸ#…<¸¡Øùñæ>\ÚsŒ„ߎ2è¹Å€‹x»ÇŸˤìüSþö¢ÚoаZrÝÒjÃbEQTû±6ý=õ©å®€º¹ûÂÈÁíõéhÞkx•CvbÑ#¨¤s †Ë?M³ŸŸK_µß¿Ã] h»/Ì\úÚ‘±°’vúöØO~z;{UçV P\(ײ693áˆDŽy7ç-7n¿ž}ŽÍ;Ô8~¸Þ¬7û–½=õGÓ¨]ôª =¿x¦ ÁÅ;  {Ï@)ä|ÇàFTÛ:(SÖs°z'<šòlîçTÜUùrcÙ0Ž`|»›ï5„Ô%¦º3®¥aáá\X¹m²a11kt8)9$Ÿ?ÀÚåk¹”žNŠÑÞ%VR÷Íæí1_²ÿr:V½^®Z4øÔù—¾â‹_.rØÂÅ=Ëx{È'ìNÎÿô ¾µZr~%‹wêiÚ¼ :4øÖ.b–TNíÞÁÁ«ÙÞ;iŸ‚gÕÂ.­bñš6 Æ)OY:Bcbðùß ¾>p´”‹üºjËveÔ° eÏ}ÉŠ¹‘™ÈɵKY—Y›Ç*ë‚2Ì)[XúÝQ®g¤raûç|~*˜¦¥PŠ=EmÓ-VY9ùÇBO¹ÖMÐÿº˜•û®–v…½_}ÎAcAcöoòÏŒâAtà5¶nK l£ ܼÚÚ•ŠÃ¸¾m WëQ¬gƨŴÑ*óXñ$*Ú3?쉷>ˆêåì\{ŽÀF‘x(öÆøN®‘í¨c\Ë´ù?säB.j}Z7•¸p-ñhPÉÏz•öZJèîèX¨ÍôEžÏwGÞ‚º–Í,ýü>1uñË5ÔÆ3ø5«*íê”Æ×Ç|‚«Ñº–ŽcëZà‡G+9™ddäú—eÆP¤ÜgÜ•oÛ[ÛÛûœú×ùÎÍw*µ%Úy/Ÿ-:‚W³¦„ä®»)߉ *\ß´Ž£)fÀ†)~??4S±jàý÷³Ä%ä´KƒOÃyz÷TÆ÷[ƒ6  -»¼Ê3ésY4çW*÷,h-A­úÒíøt¦ú#zª¶¦ÿh|ü^šÀœ…£xiZÎÕi×(m‚´p¥€Ú}kÑ"tórž¦I©›Í×ø5-Zæ+l˜7‹ÝçP³Tñ¾õR<«nåxf3–rº£,]è“ ï›ÊÌùCé•hÃ7²5¯Š!8Paèà$f-y‡—¦çàVŸN#^¦–‡‚-£èõëCÚRýʆ÷º@–w- ã‰2zt¾Å‹¢·IÑQ³²‰9ÃÞ$gÂdºæúŠC_ñYFöNcÖÜ!ü_†'•Zt¢[Ä÷\-V¯>là¹ñ ÑúQ­v\ô¢a„û­ƒ®‚gå&”㩵ªá[Ì[rÕbZÜÖî<-¾Ô%€«„Õ(…3zB놣ݞD½ª>hTÆ8ßsÞÐx×§ßè~¬\ö-ŸŽüŒ4“‚Á7œê-‡ðA§(\u•îaL˜¹~âé×÷1~к<¯D¼þ6¯Ì‹ï¾ÀÜéãxés#å›ÑïÝ.”S=‹/¬Lï"Pi݃ñµÅòËák„]*zy…õ·‹&!O|®Øóû&û±¥Á·eÞmÞUÜkÑwÔ3Ìž9‰~ŸßÀ%¤¿9„–ZÈÎÿýñ¨õ CŸÃ‚q¯²(CÁ­t ÚNûÒNùÞ«GãUWþÎÔ¹oÐkžáu;ñ~¿–hµ:Q‰#ñ$î7…α»([ñ<#ºÍgöì7ù:MÁ#¬‡"Æ?ò/™nÅùØPXý18“¹Kߢ÷ÔlÜÊÔ¡ÃðAĨõ…ãc¡+ówÔWÔq)¤OUâB¡¤s vó3Än´×Þ9¼|¡dŽáŽ…úüÑøu>ß%ç0bê;ñãÞô©ã‡öÏÆ39µn¦j¯åš; ”©‰ó‡ë8”ugy¦D~|ïe~Ìý·ŠýY0!F=÷Ù΀5‹#SúrÇéCÅþ,S¾ÀÝÿë|'‘æ-ýÑêËѪ±ë¾w¡cãRyîªüdš7ëKß3Ó™?b×3-ìy·ÕD¿ní-¹ŠÍf+ÞÅÂ1¶ì?ÕÕÆ3©ciÇžæì Ìãè·*šO&´¡DŸ1zÛ$„B!„â>f<ÊŒÿàéwž¢{`8q¸'·ýûØLi$ü¾‘5§iôP,@<ŒmB!„BQBœ¼¨Tµ †‡õ2•\Òu£ûKÖÉÏ1þeŸB‹úɯ{íal“B!„Bˆ¢ £]ç°{½ÿ¹H!„B!„¢˜äV !„B!„Bˆ»$ +B!„B!„’…!„B!„BÉŠB!„B!„ƒdaE!„B!„ÂA²°"„B!„Bá YXB!„B!„p,¬!„B!„B8HV„B!„B!$ +B!„B!„’…!„B!„BÉŠB!„B!„ƒœîf㬬¬’Ú!„B!„Bˆ{ÂÅÅÅámïjaån*B!„B!„xÐÉ­@B!„B!„’…!„B!„BÉŠB!„B!„ƒdaE!„B!„ÂA²°"„B!„Bá YXB!„B!„p,¬!„B!„B8HV„B!„B!$ +B!„B!„’…!„B!„BÉŠB!„B!„ƒdaE!„B!„ÂA²°"„B!„Bá ÿÚi£ÄŠžxIEND®B`‚086_director_sync_rule_ad_hosts.png000066400000000000000000000421541516513262500356220ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/08_import-and-sync‰PNG  IHDRÑ ÉÝ9ÎsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝg`TÕÚ†á{fÒ{#PCè=tB· " "¢bEDÄÛ±£ Ç.Åv±‹ "(ˆ@PšôH€HHB:émf?BPÕçúE²ËZ3³YóÌšw혘¶Ü@DDDDDΙùrw@DDDDäïF!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'‡ËÝ¹ðŒ‡¢.wþñLÓ£/wDDä2ÒL´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØéÞw„ Ï<ݧûÔ¦ƒÓåÈebqåÎ>m˜Ó­kû…Q)H;¸ù3õ¦VLíÝ–m¼~cSîuÏååŸvòbb ¥Ç7:Юycv«Ï²~e4ÿ9…Ûå쭈ȥf¦ed > ¯˜I¨×ˆ5ý Ë¯)Ä;û3õ¦Œô®Ø¯{ç–LÍø“‰åå[Ô ¢üùõ®pÖ-;DݶuRÃBrb"w¯È"²K#Æ×uǯ4—iËw2n Žì¾Æ‰–qG› zù˜HHNeBt<ß©xWpr÷ãéጬåN ­˜õñ‰<¼òëK޶wg}–ÿr€Z#¸¹èŸx7àI ['JêmÇo~&GN褙F Ãy¿C0=¼,”æñí†XÚ‘OþYÚ³¸‡°vx-æ~»É9ýómBÂ5fnµ“¥¦*ý)ØEø/Y{øó|T8÷‡¹á_^Ä’û¸ÿÏ ÚÀìäÉÈ«"x*Ü‹:åì:pˆ§~?ÀOùƒwÅ¿Åë `ÂÅ+i]ërgˆ ùÙ¼½‹‰K±:ùó눆ÄÎû“1iœúÚØecì­˜T¥"{úZÇEü迟ð¹)$zöîÄ"ïxÂH!éJª‘0Ê(.LU:å\ÆM$ÒÙ %ìþ`4Ï% eÚË}0±ã½‡˜”:œiã}˜>j ½‰‚sY±#™2ÿ xp,C[û`Ê36òݳX²íùNÁ´ì'£†v  ê¨T¸‘—F~I³§“ùÅÿXí÷SïËäÅÑóéøÆ ­8 8æ]F½ZƸ÷£EÕ‡TϯŸ~̼µq¤»Ö¶?Ãï¿…v'5v¹™iÚ¢!c¼Jxþ6žM*ç„ÑÀ(gÃöz9´a[çp^­•ÁÐe‘ ÂÆŽ­qL®ÛŠñµmþõ±æ:O–{…2Øë¯=ÆÆñô¡‹ áB—sXÜx¬³7kVm¡õ¼ö×%úöæôHÝKÔ7›—æÆ˜«jÒüè´»Å=ˆOº¸³nC Q ÷ñ‹S(ߊ 3àèÍëƒ[ò”[6ãnâª%Iì`åµ5©¬×fWèU†iIŒß’Î3ß®c|¶m«þÄý§“•³m~ì„mOýØÊ=»¬ÜÔ½)û™Ï­½³©ÜŸm9ùðÎà)¼XÌ”íÞÁuë (0»b ›Aù)ÞÜ<¨eòÚÎ4–äp¸äL/Ê‹ ¼CÎÜÞ¤’sxøUúã_¿w9g1biß0ÂÍ•¾n×ðå1ÿ& IáÃÄd <«.œ+/Åõ$n©(/±ÙQ…Sš°˜ŸpÿÔ;‰ò3 3±wÔLÇ¥aSç ó¼]ÚyÂÁø<ÒOyM›ðõõ¤©‹…Ä"p ð§h9±GòÙVp–Ú~‘cAÚtc+þpâ›ÆÝ;éΡ‹ü{aC´­Œ¸<ëÑP`PRn#+§˜#GGvÃj¥ŒJÕß¶B~<\vŸ°²¨±/q™´mê‡Ã¡Ý,+²çÁ\B÷NãÞÃ1Êó8³Žè_~dÁÇÙ–6™ÿÞ‹K=¢Úº2iùŽtkKü’ÍØZŒ¡¹— Š‹'ü_&GgÌådÄ¢<è:êOËŽ„ xŠOÛw"šU£ÛFAb™¥{˜1z8kÎ(§´Ü†‘]Šótw–Šlf³é4}2(³øðúõéd¨É·}ÌÜø}[/e7ED®fœN-=]ð¸ûE/÷z2“3î§(O8gY1åÆÉ÷:2lf¯ž<9yõO¨1áàîqh ¼˜µ¹p]˜5Íyì=Å,J~ÆA®_èÌšëkÒ 4“~ÜÃü¿ëˆ!"R=n̸©9÷¢¦Í¯n#V÷‡.‹Sˆ½ˆ_ì_Þ[ܙݸ&Àáø›˜ÅÍ›k½ ö¥s0³b_º¸ýõçîëKkK ëòª3?o"¤vm^kíAÊC<½|;í>û“1Yž<ÐÔ¼³´g˜L¸6S7Äý䯳‘”^„ÍÛ—6Ç¿-6Q¿Y ¶^Šn>Y®ž´²”“RXJJa)éfoÆ_U›ng [—ôõ¶Ç™® wÜNØ×àp5ûšŸžÊ/å^<Y›Þ¶LÞO½x‹·ÙRÊÞU Y°#ï¤þ™Í€ÅËчîR/Š6N±Ìÿ~.ÛÚÒ¯±û9„RüêbJÝÎþ‚c-X9¼d2½ò+©ç0à™ŒrJÊŽ_Fú®ƒôô›q¯Y¼=(óÄ××___¼l±üðéì*¸Â^[ßÅäƒ^ w>í,GFâ^z/ŠçÁcøøÈW$"rQ9¸0­J€>°'•k¤ë6buÿâ>Ò¬ïÔçÖüÐ^MØñG"Ñ¥®ÜÜ1‚¥é\“XÆ["3 ÛðVÿp פ±ÇÁ‹1ÝÃLÝÃgÙ¶ÓöÜf˜ðõq'Ü­Œ=…ÖJõ¦%fOFv £¾mï*ÅÍ?€Û| öï.%#åÌíÙ,Åì-wåÞ¶A,X—ƒ-°&S›;ƒ‘ÚG—~0‘ÙÖ|Ô»¦Y$»ø3©³æ­ñĦæ2=;„¯Ž kU ÛÌÜÎ$0õJ[ìtÁ\Ê×Û>gº6J«´³÷,×ÊiÿW•å1ó€Á²F^¤ïŠçÏÒÓìw™9„öfHäO¼7e¥7]O—FÁx’GòÎe|¿ —&#®¦Î±]×úôlëÀó+öàÕû"\Ï¥Þ­o¤‹ãdÞo n‹oîF¾žµãúÛñ?‡ÏäH°Óa–þð;‘·6Å¿˜g¹ÞIû:‡_ËÕ5—òÍëá1¢7u¬X=g&KŒ¡\íy¥Ý*ß`ÏÎX^nÉÓ}[ó©ãNÆìÊ'çè`rp¡GM¶Ìç`üA>¸¼¹ Ì4iZ—¼ÿúÍ];éº"Çl²nhÍÓ5*¦süêÖã‰tîOºÒoqW FycÖqs—Lò„„”†ÍÝÇâ08¸¹ÛÉéQŸÿ^F µ„õñ{¸jå!ö.)ÙJY¶7‡GÛµ`Ç6jý’En¥ÍY÷0x}CÞiÛ”åM”°hëNFï(¢ÔVtæöl9<±,‰oºG°ævûRÒxmE^ÝOŸlÅ™Ü7'†)QõøßMõð.-â·1\¿©€+Lš·…Âî xæêBÍel߀ëþH"î:±t©_o;zvÆk£Ìf9©»û €•qYä6òavL§ÿøu™YüéþØxýü5³ýš©só(³¸P«)=ÇNfàU5+Õ&»Þ½®+vѹw8.çØ„É³-£&ÿ_ÌøšéÏ|C¡K0-û=Ænª}nuÏ®M¹sôu¼õñGLãDp“®Ü8òZ ?<|ò¾Žuüâ‹8}ô ß¿¶”,«'µÛfÂ}×z¥Ýá0Êòx~þ6¯mΓQíÞ©€•iű8Ñ2Ä“ZæR>üq^ÄÛ6‰ˆ\¹llß´m™×Ôåx€>dJŽðìüŠÅ†Ê™½…‡/R€01mùe‡]#Ø;Б3·²à ‘“ G¯7€‰ðV‘ìj•Mç¯ö±±üìGT—ñPÔÅ;ù ¬¤.xб Z0ùÝ»ªÔÿ³™¦G_ÜÌŽ´‹ãá?:ú:áf+c_Z6ßìLâ³äûØŠˆüÓ˜èîÎî}Ù$W™À2;{qsHóЏ˜ë÷¯Ày‘‹³;]Cýø¿Hâ·ïbÇE Ð—Š­ ‰Ý1›Y0çA×ës~Ù”L‘£7aÍ{rÛ½·Ð!؉¿*E JobÁìŸY»kçãàFƒ6ý¹mX?{[Nÿ€ÊUj¯/½Ñ—ý³¦óÝ:3ƒ^¹›äžå·\ ô6Þys05>sE›'sÏË)<ô!“{ùqúÊ+¹»—ðݼßÙOrž3õдãµÜr}[Tó""""òwPímv ÀÓ`ìüˆ7?Ëe@¯.´ªí…`òlÅO´ªt„A³¾-qÚ¼‘RŠØ¾2âVMq(KfÝŽ£‘<¨W…V™³.ØÉ̉K9p,µ—!ió<þ;!‡gÞM+÷ŠðY–´IOÎ$¦Rõˆ5+‰KÿÇÄ5[ýú“ô ƖŪwŸcÑöb VužžS”œõïóÔ«ËÉ<þ»rÒâ·’¿•5ÛFðêÄ„iº^DDDäŠWíšh“wKt:6“œÇö3yÜ= »û&¼ò.Ÿ|¿”-s)7ŽG³~´9Zò‘·u-IGÃnyÚf6M–ÁݺR5HZS9PV«n¼ÛGQÿجwîÌß‘`M'zÆgG´™°ÃxèÿÆ2¢O],…ùäómœ]þ¦ŠíäC`Xžç»ÏÆ(ÜÁçÓh÷6 }b¯½2ž](ÙùÓ—¦a=ÿ¦DDDDä"«þÝ9LÞtxx ¼ÏG?Å{ô×¶¼dâ6%·éw~þfÍ1vì­´ñ³`rkLŸ¶®ü¹¦²6°.åÔ±½ãO’¦[—SÔN2ð¥I ¯ï D…¦1ò½lXIO:‚µ£'¦Ì ,Ž­HȦF#™8º7f S8å±ðE"mû„’64s9ûëuÓ ¼0´^ $–Øj?Q wÿÂÚ< -ÍàŽ>˜€úµ\IÜþ,Ks â­æpß„^€Ð.""""ÏyÝâÎäJç»^¤ÓmYìß¶‰-;cÙ³g7Ûw§P|tŸüsyåu_¦¾t Awõ‰ÄmÍJ IãÏiÜRÛƒØ5 ;‡t§KÕR÷Æ´­ylÕ¢ ·ZxC`+³aå‡wqøèµ:5Ã÷Ø»%„kžy›6yV0¹V©Ý> s n½¡iE€¾ ÊÈØ}€¬ìø`÷}r´þÙ°RxìHÊv$ÔýBµ+""""Ãyÿ±““õÛõ¡~»>Ø “Ùþû\>ú8šTÀˆ‹f[Núú›qkØ›vî+ù½­ÞJfŸ`V喝ËGH÷.„œªG'*çY“Ù|Òâ=kqîñàîêãZ©NÅ„³_uüìx@îø\ÐE~6ŠŽÿÉ(ÌåÈ©v³[b€»Šˆˆˆ\ɪ¢ ¶Nã¹b(2©=p<÷ :tÍn¡´ºzÃÿü×·Û€"ŽÙ3¸FЧƒ'¿/σ„•lØ®€Pzt®v‡ÌNî8%@AV!6¼©öD²Ét†;lTÌ|ÿ©¼ÛÙ{‡“ë±)ðnxí=„""""WÕ^XèàêHNêaNbý ÙUeÅžQœÊÞ´£ñÒäC°Ç±HëBxïŽxÇ÷_­% ´ƒ«?1î؈À£ÿNZ½™Œc+ôlD¿òwÜqwyŸ˜âÓá LfŽu?û é%G«Q@ü†„sX è@@DðÑ';“ÝñGþ ÞFÙûwCL\2…ç²ðQDDDD.«j§Vçº}ˆ ú•y‡´Ÿyþ¡XºôhC½nØr³j[Ó*öujÝ—f^Íí:×ëE'ŸßXœyi•Â5£:tÅ%–Àöôª;‹Ï€}ŸðÒ»… êDÑöù|¾)‹rÀµU$µœÏr¢Sqð¥¶/ ­áÝW?æÚ¶~íûƒ…kNY˜Q… Ïfýiå´“Í¥qŸMå;×[ˆô/!5f_~µ† À©Í£LŸŠÛYÏ'""""—ÓyLýÖcÈw²ÿ¹Yl- ö±úç}¬®º_`Fìò×B?çºôìâÇ⟳Žþ"Œ¨NÕ/åÀL¿ÑCYõŸoØk…ÔUß0}U¥í>=s_dŽ­íeö£Ý ‘Ìz{#Å@^Ìb¾©ØäèFQZáYOaòéÀý÷FòøŒíàû·vð}åjDñðÈÎø¨ZDDDäŠw¹Õ„Kݘøa6ÿ2‡«cIJI%«È†£g ‚BêÒº×ÜÕß“Zq¢NÔUü<Ÿ €°(:ï­0L8×Ì oÖä‡ï~a]ì~3Špö«MÃö×2lhOxV·zÅŒ_×GyÅú%Ï^Ilj>V÷0Ú]3œaõ—ðÔk±ðÌìý8oú-à›ŸV³ïifÜêмûu º¾áÕˆˆˆ\J&Ã0.K®‘³‚§ï{8 öïñßCª¿PDDDDäº ·¸³‡­8›¬ÜL¶û5qÔ¥gÇ@hùÛ¸ä!ºhË[<øzÌñŸ]ÚßL÷ó.å¹t.yˆÆâˆ#Pfr§V‡ŒÕo-¦‘¿‘ËV-""""òw¥ÛAˆˆˆˆˆØI!ZDDDDÄNÕ®‰ÎÎξý¹ä|}}«uœj¢EDDDDì¤r;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“Ã=[y>/ÿ¶ßJ 091 kcóWN‘– ›pR6Ì&úPÑIYl)1ÎùТô½Ôžif«Ëξ¿µ …ö¬crΩÛ8Ûö¿¥’tº°–§2l—»'""""ÿjWÈ4±±é$fðY†õrwHDDDDä´®Œ]žÏçûJ¨QŸ[]J™›OÁåˆˆˆÈi\!º0ó0ß8r]Ó î­å@ÚþT¶T)éÈÍHfÄœ5xL_AÀ×Ûy>©«ÛOd#6n=¿øóôhœgnäÎùäceUôjœæ¤x¼ ÄÊò¥«pž›BRI&ý>ZÇsRydþ:ü¦Gã6k+þÕVi~&¬£Æûј?þ“þk28xªê‹ÒLú}¼žÉ‡ÒxèûUÔø%‹ìS” ä'ï"à;YzŠ[i3–m¢îGјf¬¤éÏûù)ÿT¾""""r…ªþÂB[1,ØÌøôÊQÕFvù±—óÅ‚5,´TÚìèÍ»ƒ›3ÜÝTé—V¶Æ¦“âìÇδ)óÁmO33Ð5¤âàòüTn™Ǻà:|xƒþyiL\±ŸÍV7n>‡íU•däÆßS3²!‹k;‘vðþCýÐv<ÑÈßSù­0˜»ÝMPšËÇ Vºtó'Ô”¶B¦­Háž.MXÛÍÊ/kvðèoû¹öŽFt5r;g;ßúÕåÃý ÌOãñe;¹Ù­+[¹âxÒsXćËö^'ŒÉáî¸QbÇó_È»?mf"¡L½¦Í(ä›uqÜ0ÏÆš[ÃétRc""""r¡œÇÝ9 Ž”}¦ÜW^^)T%%äU(-Ëç³øR¼kÓÎ<ƒ‚èjÎàÇØ|ÞñƃûYl dAÿz\ç àE#ŸúÑe€í,ÛOVZ˜O¢É'›Ò×ÃAn„úçâàbÂÝ3˜Î[™™TÆ]œÈ;œÂ/6>¨åT1moƒ x¹Ž@XÛ@^™W@ª ²ä³?fö®Ë7wf1*»#†+¦*±ÚplÜœ…íÝq¬vÔ°e$óF¦'Ónç.wàE¤Ÿ‰õ³ö2#½.B-g=‡ˆˆˆˆTÏ…½Å]5d¤òC¡ï r< IDATýyâàâÅíA°d*›ºzÓÍÑÆÃ%XüêÐÁùØQ&‚Cüh`> œmûÉÜkr·÷Vîµ–Ô`@mnª@gàÁ]u,\½;›´†þlÚ™EyÍÆôrJ³#‚Ï*›,fœL6.¤Ô;ŒH—c-™iÚª9+N÷àÍt¬é‚óé¶Ÿ–ANV.Iå¹Ü÷ÅŒ:Î ƒ"›QhÃÀBÕÌ.""""FõC´Ù‰W5£Vq¥©åò|^[~-˜èÙˆGü*•]›éèrb)ǦݤQÎì+«„¾Š’Žn!`6qr 4™ŽÿîlÛO꺳/ïÝÚ…»¦37!‹¹k¶òt´'¶bR°mûã± •è ß$Aÿ~>ø?¯Ë©Ïl³`2qÎsÀ& >gŽº†ÕJ©qò>6ÃÀâ̼Áõi[åUtrrT€¹ˆÎc&ÚBÃZ5hXùWe|÷ÇA¶”WloP«·©¬ ,™ûËp®Áo]½ñ:šülÅYÜ÷c<ówç‘âM`¬ë2X_ȵÎi©Y쳘ϲ½*ƒ”ƒ‰¼™îÁÿµ©ÉËõjò²­ˆ©ßÿÉ 1LöÆ£F0×8lãVv›ý™ìp¡ÔLX WÌ1Ùl.©I]׊¶âwîà¦æ^JøY–qš ƒ«qô' )ä'íéãã_Q.[­Ž\wô‰+ÏOgÜê#ôº*œg ç""""R}—µœ#?=•‹ÄU•ºb8ñD­†îOeÓU>t­W‹~kv1|±+Ó"ýÌÏàùÕ¹”ᘩ}ÆíU™p¶åñÁŸIÄ›#SÓ‰ÂÌ ¾Î1Q¯±NŽžŒ¨c¦Wl.5šÔ§£Ó¹=žµkq³e;÷/=€éGhq&×dakUŸ°s¸ŠÙÉ…EüoÓatðÁœvˆ‡w”€©jˆ®(IyÈ7…gÅá×5„–¶|¾Û¸©ËÃ. Ð""""Óe¼Å•õ»2ÉtbLp•,or¢_K<‹3™™nÅâÄìA ¹¡4•û~ÜÌDE5æ&׊°x¶íUùÕŽ`N{/vmŠ¡ç÷›¸& ÿV͘ÓüØ4,D6ôà 'nnêÉÉöÔÌ.þ|<¸)·[S¹÷‡tYzs³¦üÔÖýÜêž}øo¯0ÂÅÑùË Ûa㾨0j2ßâÁÄ­yÅ/—m¢ë¢ý,s¯ÃÂkÂhxEܸPDDDäŸËdÆ…»±pY7}ºyå Ø™Ïÿ–w‰0Ø·u#M¶ú²fX8‘—}ù¥ˆˆˆˆ\I.lˆ6¬$æ‘}´VÙÏ˰¿ÙýŠ­%¬JÎâ­åûØÕ¢=[ÛŸã,²ˆˆˆˆük\ØýPœOÛ¹‡°ÕªÃ§½kÓY ZDDDDªPˆ±“– ‰ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“Ã=[Ù~fy‚ù'o²øÔ¥ó ¹ÿš¸›Î~*#÷&Þó±æVŒŸù ‘n´§""R‰­`?¿ÿ þØFBN®5êÑ$’¾ƒÒ)ÌPvðk7‡Ã~×ñêÔ» w:ʼn 7òÒˆÉlµ5bì'“èæu¾ÈÀ–±„ ~À^À¡Õc|8±3çuù®ç¹;_e'MxlæKtö¸P=•+ÅÅ›‰v÷' €€?<Àš“ÀÊO¦ðÅ®"Œ‹Ö¨ˆˆØËš½Žžx‚©?m$!§ ,fŠÒ÷³í÷ïyãÿÆóÙö¼Ë7n—bÎ#C2ä^>ˆ+©þ>"gd%sÓRöý©.;ÄOOå³øÖý‘Ȉ¦ q¾8 ‹ˆˆ=lÙ¬}ÿ–¦þ]ùÔýôªç‘»‡EÓ'3sc" ÞœI›©Óô\ÎçÖ†§f} 3ŽÎš…–¿ k&Ûû×Ïe;Y“O§NžTû*v‹äé/Žý_¸”+ÍE ÑU8^Ûâó±Ùl”%|Á£Ï#½ÒW‚%qðЄ% ½wÞLèI'1(IYÍ×Íæ˜$r¨×ºwÜ{#-|,'ímM[È“}Ê·NŒáÍÒÙÑìN‡À–×rߘ¡´õµV27Îá_þÊ–ƒ9”š\ˆèÄ ÷ÜÍ5 ܱ&Íæÿý–ŸÜÓ¯E 6j ¥Õ5wsWó}|þÑOl:T„wƒžÜñè½ôv´»Ÿ""—“5m%s7–~\3î!úÖw©ØàÝëÆ<ÂÞÑ/³2ïæl¼ƒ&udä;w2ïü²™T‚iÑ{8£†u À(ÜÌ«'”spÖ1Ñš³“ŸÎbѦxÒ‹]¨Ñ° モ~us˜;n,_'aÉ„Û9ôøg¼ØÉý¯P~ˆ9U÷÷½=ÆÔƒÞàaup¤œ¤ïÇñè7ÉxF½À;6óÔãóH÷íÁ=}‹ùmÑËkФû­Œºó*BœLh<ÿ÷°fndY<àÐŒ[ûeòíÏ©ìXC~ÇŽxMÑö^§/4ÝÄ UÊRÂý,ÿò3~ü3–C9^! hwÝ]ÜÙ/ó¹fGvüħ³²>>‹‹!M»1è®aDÕu­~è»]‚……6JÒw°zg>àB“Èš8Vç,Yðæo±`Ûa\¶£eP ñk¾â…§>!¦ð _¹®eÚôßÉröÅÒ¶ýÀ[Ÿl!ßkê"^õ;ÖÌë~S×´Í'/Ï$¦¨Ò9rVðÉœ½Ø\°bó÷“xôù¯Ù]æ†VröþÆô«È²G?ED.ƒ¢›H¨Ñ^ÇôQ&&ôkçØHØœÄñ/©³WðÉ÷;(÷Æ­ ™­ó_cÂÿ¶SpŠ!î¬cbqŸOxŽÏWí#Û3œÆµH]ÊGÏ¿ËïÙÞ´¿ývÚ{8ÒxÐC nPeJÏâwò> ƒiÝ¿9@ÚÚ .¬Yl[› xÑ¡w8®•Ëw[)ñ £0•˜Eï0~Úr çÿV26,#°4éKÏ^] Êv,%&ÿèë|¾×)@i³'>ÁôÅ;8TL“&¡)»YöñxƵ—Š@Δ]2–óöËŸ³2>ÿf‘´ªí@Êö_˜öül´§EÎÛE ÑV¶L¾“!C†0dÈ-Ü>j2‹Ò]i<èIF¶ó¬F£å¤FÏec1øö}Šçˆ±Ÿçž&ÈüÙ[ÎT¯ÈÀÉ1íí÷˜öd{œ¢½»H/7(NOÇ­aSÚ}™w^{‘I¯Œ¥½·ŸyÖJç¨Ï=ïÌ`êûÓÕ â7^=Ÿcú´é|8©/>€5eYåçÓO‘KÍFqn6wÜOœ-xÔð («€¿FEwº<1©o¾ÃŒWn$ÈZ:›9UG¸³‰ù;çòk2„)oOaÒïñtWw(ÞÈOë ©ÙžnÔjוVU¾@5¹Rû¤}ñnÙŸ–Ž@ò*6gX1rcX}ðéXåÂ'ÝÇOgêï0cÊ B€üÕ?°!»Tãù¿…5õËö&F5ÿf':e;X¶+(8ßë(Ú5‡Ÿž=˜0õM^zé ¦>Û_ åçÙl?áSèé² ”&m ¶ èÉ]cg⫯3þú´iä@ú‘ò‹ýlI%¯œÃ3 7ØŠÉL?B9E$íK"ÏÚûo´QJJL ÙK&1jIåmV’ãÒ)ëâÅ©ŠãA«Z+Ë]‚jáÃz[˰&Ü[ÜÅã¾›øcÕr¦¿ô1ñûö’R `œ88ú4 ¯˜]ñõ¬( j†› ¬~¸96†qý¹ä̸x¹cŒ‚L mÀ U 6 2 pörûk“kkú¶òÁ ¸Ö¢Gð|—šÈŽÃ¥t¯]ùø³‰)vK¢ðiÑ–'Zý_?l€Ù‹‘\­GfòhF¿6ÎlZw•Û2éæ½Š}øvìIÝÊ“„n­èÕÌ«â=¢ÎUt žË÷©)Ħåã­ñü_Áš¾že D5÷ÆäèN—~Ìÿ9‹íKw“ß¾ 9ûÎ÷:-'kïŠ÷6½iz´FĽQOÚy/aÉ‘Dâ2Êisì+’Ófp nA=Ëzb33ùÁÅxÔjE»ö¹idMý.M•®T¸x ~ýøÂBkÆr^=[òGJ_†TÚóxXµÙÎð©ÞÀfµ<`,÷¶ª|Ÿ3Î5BN_"b2ÿ5ómª\)dP´ëSægãExÇNtØ‚ßþÀNrR‘Étªª£ó览ÈeàZ»5µØÎÁô•D'Ü̈ˆ¿¦Q°›ß6ä&j·©‰;*6˜-•²¶ €2ëÉ£ø™ÇÄ`,+¶UéP“ÙÇcwu'ÖL4í×·u«ˆÿ}[|wS†{ÖÅøk˜?q,¯ü“Æó+ië–s€8fŒ¼…•¶–îXÊî‚ÖU\ ì:­|‹¶Êÿ}N›]À| ϾW‹ß—,ã5ëˆIÜJtâV¢\ÌÉ“Z_«/•KòÇV,ž5©é OZžµâS@^‡ 0JHÙKîiÏàD5((ð¡që6´iÓ’z®ÅäåæQæP¥$®\Ía øæç™ôÄ nçFÁIÚ£Ÿ""%è*nhéd°àÍ÷Yv ¢¼Ãš·—_¦¾ËŠ<À½3ƒÚûþõ†Q°ƒ5 ·+-OÛÈÚCÁ4 ¬+Ï6&ºà_/àȶu$•F!1Ÿý‡x˜WWdb;~.ã„sj'îãÖ¨í=ÀØý _®/‚€®DÕ®2w\¸…å;s10(:°’•©€©&M=4žÿX³nyE„6y»5o¾¸”lgÙîb|Ïû:uÀ7¼.@Á–eGoŸgP·œ 9€c ýÏe^³œÔŸ2ãóe$ׯsS?çóiRÏÖý¬Ù’YíÏb¿K3ïo:6“[JQ©ƒ"Ü!µ`+oÝß–“r¸à 'p¤Vï4žÿ »—Oab~'j‰lÙOžc F½Û¹«Q-¸z»9¤~ÿ2ÏìªAAÜn*¾¼3°ÙÎ|ô¥ë§ˆÈEdö§ÛC£Ù2ámV¦ÿÁôÇþ`ºÅÖcСôô>Úzš°f;(‹_ž{‚¤Èò¶o&ðŒF· T^”ÃYÇÄ–-ÒÓo KÏcü£;iäžÆ®„#àÉmÍ|0›²pwÈeÓ³YqÇ­ô¨Y%¬›œN½k};z³bé²Ë¡ÆUÝ©uRýE+&&¶® ‡È¼{ ¦¯®Ïÿñ¬‡×±< ü÷úû¨XLÌ´Q<»}ÈØ°‚?6Æ£ÕµŒžò$½jTç’q lÀ†· ÂÙÈ$1Õ ù=3(àk·d`=Û).I?ED..KÀUŒyc2èD“Z~8Y­¸Ô¡y×AŒ}c ÷µñ:ñÍ£ º{‘¼e3 F Múååû[žò¯ÑžmL4¹5çÞÉÚ±.>¹{Øu ”À&ýõâXºXÀâG»›zæ Yæ±4±ôœnêõé‚Atëvr †Onî_[ê!ò\ƒh6à1&lƒ‡Iãù?_9©k—“P?ŠÖ¾•¯rêuoƒ;P²u±4;ÿëÔ¹·Lzû6%ÔœBLL7¡÷SxeX\N>âLx´É cÐ&ÌDòÖ?ùss<ÅMéûÀs<ÐÊ]î.!“aœý 2‘sR°žF¼ÊvãÊø³ßFÖ2&<0=Á·ðÖ[·PëhŠ.Kø‚Gªü½{h§ˆˆ\e™?í3v€ÙËe ÐF1ó¿bî’eìêõïF¨VŠÈtiÊ9DDäŸÏšG®T œë}-®g?䢱‘°j [RÍ·ÁC}ƒU+*"”Ê9DDDDD줙h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b§óþ³ßëÖ­»ý¹ä:tèP­ãô EDDDDì¤r;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØI!ZDDDDÄN Ñ"""""vRˆ±“B´ˆˆˆˆˆ¢EDDDDì¤-""""b'…h;)D‹ˆˆˆˆØÉáâ7a£ a-‹­dûÁ JœChÒ¥?z6Åï´.""""r¡™ Ã0.ÞéËI‹~‡§§®!»Ê§F·ñÒÄA„»šªwjk.»—|ÅW ÿdOJå.~ÔjÒ…‡ÝL÷zîTó¬ÕS¼“wxŽ? ks×Ôÿr}°å„Ͷ̥L9ƒ8‡¶<ýéÚ¸žÿKãgòÈ“ ÈðéËËÓFÒȹÒF#›åãïgÚÞÊG¸Þ”È~·2´W}Ü/é$"W¬Â¼tß„¾8•{8]îÞˆ\b…lxá.¦l¯…œð©ɵwÞË-}°œòXù·»¨sÁÖÔż9íä Pû5oýÉ[Ãêâh÷™K90ï%žýº€Cïá?̓pÈKdó¢/yoâJßœHß ËqÉdÅÆ ®½.¨Ò8ƒœmËÙsÂ~çÛÿR®XM@Î:¢÷ Qcç“ö27Á3#á‚AIÎ!ö¬_È·3þClök¼4¤.'!"rYS˜÷Ø8Vö{‡W¯ T‘+WÝÛyvds\ +Å9‰l˜7“¯&çãûÞDzèê•“]Ôšh³wº¶öÀRïzÆMz‘ÑÝ|ŽoOݰƒLk5N\ÏÂû òÆéF«Æ iÖ¾7ßÏÏíÌ[–DÙz öðo@rôÆ“q„ËðiˆéØìïùö¿ô ¿¯É«ë0ºzaÝŠý”œb7‹W ""ˆˆhHóö=¹iÔËLV›ý³ÿǪLÛ{Ü"""g&·PÂ#"ˆˆˆ ¢acZtèËßLXÙVì+ºÜÝ“+ÔE‰6¹ÖçúñïÒd] ææmñMXÈG19Ç·[|üp«NŒ7Ê(.LU¾~q®Ç ã&éì…v0šç†2íå>˜ŠØñÞCLJδñ>L5‹†ÞDÁ‚¹¬Ø‘L™ <8–¡­}0åùîƒY,Ùvˆ|§`Zö¿“QC;pÊgÍ‚dÜgG³)«?WרøÔjÙÉòý¾tÈ’ýöôÿôJD³&Ë“È~Q\Ågɶƒq ¼Ã@î»§? ÜMœvÜèåÀÂÇÆòu2ðÉC ]ÿ>{®n—ù‘Šœ+““+N8àìhÆ–µ”ñ£çÓñ7ZŠcÞeÔ«eŒ{ÿ1Zyiä™3…üó\ü×ÕìIƒNíðÚôãžÿ‚u™Ç6Ôæ†¡mކ+;9×£wg_Rg?Θ>âÇ•;IÊ-ÃÀ¿†­iQÇ3ÎÔë‰ÇþålÏ9:ëZ´‡¥‹iÔ¿-~f <™E-űï#L~ûEn¯ÏÜw¾"®ŒÂ|2a2‹mWñÀóSxá,|“×¥pºÉs‡íètˆè-ÙT´h·k{½;Ó)¤Rò>§þŸN ¢×’íÞ†îõ}iЭÎGÖ±|ÿ©æ¢Ofr«Eã@ƒÃ{Ò)­²­ìàLy/s·û˜8é9F÷våÏÞ`~b”'³pÒÓÌ:Ô[ž˜Â”gï¦MþB¦<û%qÅG? XSùmú×$‡`øµ-i×»¶˜hâ n/MâµYÔìÕP“绦6æ3õODªÏšÍÒ—âzÝcL™òƒkîå‡ésˆ/Šc™5áeæiÎíã'3iì‚b>fâäŶžaÜH dÐos{˜uFLå«g" åŠe`ÃfµbµZ±ZË(ÊÚÏÊÙ?rÀ¯×6t=·“œ!SÈ?Ó¥¹?FÙ~µ–¼c?‡öbôcwUǵz M´ù_&5ZÀ¢ë˜óöb>ÜB[ÑíÚ›¹µoc¼,à\7ŠH÷Y¾ýQ=|)Š[ʦ²f<ØÊ§¢]«÷Õ£Ö% à?¨ sŸM"»Ì çD´áá1Cèìcêðð‘>LL¦Ð9uø·Ô ýU5˜½| Y½û`Êg×ò½xvºƒPÇv÷ÿ”JXþgnm¢hàjÂ¥aw[Ö³~ù~îiÜøìuÎfg< $¿”ªË(ʳiªÅÀ~Ýhåo†ˆšøÖ‰Åâi¦4a1?%4àþ©wågfb神,ŽJú@y)–¨'™pKm#»7¬½§ˆÈÖn”%­dmvm®ëŒ-a–Ýç+Úzúþ‰Èy0 öàÑÜÖ9 ¸þ–ÍüüÜA²Ë¡0v>˲#ñâ]ô ´Ôõ:Ì® Y‘܇ëÏ0n˜ÌL˜0™Í˜ÍúºH®`1op÷­U~gªÏÐW便‡ #ëÎqÚLZ„ôÏt‰n2gÂr<ç„2hÜýô¬cÿrÂX|hÜ{8{Ç(ÏãPÌ:¢ù‘Od[Úÿ·wïÁQ•wÇŸ³—ìÆMÈ HÈBÂU$Ää2”BÑR:ÞuZ±Œ–Š`:HjG-P ¦Œ0Z#S@Xq¸•ÈP€&T@‹äRÈuwûG „„ÂÅâ÷3“?²Ù}Ï/›¼ç<çìû¾'SoL‰“ÓÙECSý5×}H%÷¤ª`Ë~y{<«îm ©\’5Pq —‡Nv‡lIªÑŽ}¥šˆÑй”–íŠ3Ssš-Ê®ˆ´Á ÏÙ¦ƒç‡)Ý‘¯ò]ê7©½üJ®£þF¶PYèÖÞbõÚµvD`‚î‰3t Ï­‚G•ÔØ‹êóVª¬Jr8®:qÆŽTzä-|â }8 ¿úôê­´´4E¹,:ÿïc:Wu\‹ž~DKê^è«QUW¾óUòu–du)®{Ä¥‰¢Fp²2âk”ýñ*OIÔ™»UÒeœú·µèÂóí5]>€V±*6.´Þ¾Ð){í•}¥ª°4%†\îgލEÛ?ÔñoªåLh¦_^Ïœàv¨?±P>U—žÔ®UË´ú­¿+íÕ’6šÌ¸SÝšíó¨úÒ<¶*UyZ·ª^Õ‰ Z´¾Fcžš¨X‡dØ•œ¡G’+íÝç4kûV=§‡S1é½åœçÖg§ÚqÀPÊoº) .´v9í_ñy}’Åbz¼‹-²¿‡­×¶ƒÅêäÖÿ>šå'Õ Ñ-¯¿aë*pïU‰Êµ{îM¼âg{å.|TI×HѾ‹§tôCñáj¸˜•¬iYË4lÿníÙw@{V¼¦÷Çèg¯ÍÖ¯O–6éz1s²b®x¡!›+@F$Ã!—_½÷ÓVa]U¹b‡N”jßîRÅNì«0«T|í5]ß«z(þ:?ÕÐì¾°ñç²È'|Í÷ËØ›W2p#ÕM,t]z$^±wåkçïòt¤d¢¢ ¾ê Õøê]Ä1ÛðïÖœ#y+Uz±î›r•V¶ne‹µJŸïü@¹‡Ê®’`±H²ÚeýþÿØÙe¨zùåëk×éS[ª†'¶d i›Bcî–qæS^¨Û‚Gg·djÆë›u¦¹«+¶õªÂm{ôÉÖÃrô¬Ž Òª™ú¯PQ ÷ÞRÙ{L×ÜYÊʪýZ0{²bŒ2å¹ TÑܯå«Ô‰Í9:èKTF÷ ïƒGç÷¯ÓŠ÷ Üû~M~ò%Í_úgMëT¨-[NÉÖ!ZeÇUT¨…„„¨7_ë³×ëÈ…¦NŠ …$g¨ëÅýrïqkOY¼F¤†Ê"C.Óí5W_ÑUã»ÜVG·—ýÜ!å_ÞñU~y@'ªÃÕµ­•~‰;–Å.—*TRî­=^újTY]w|ªÖ·GNªœ…®~ÔnÍ•hî»ü$]”$‡\~­Ëî¶öšØû}½ý‡Yª?V"¨2}ýÙ6­Í-UÒÔ‘Š® ®þ1JOµé÷Û«MÆ/×¢ù†‚RÆi =S‹ßΑÑè)æIDAT&¤*¤tŸV-ß/ߨ‡Öìè»Ú  œ•ʶhЫÑr¨vôÈuÕ_OE[ye.õ?D‰ëMÑñi\ò½™çVAE7uûþ ¶§ä¤ŽuÊ!¯*KNëxÞF­ù蔺Lš¯Aa ÿÙ½_hË{uÖ2M£º‡ª²è_ÚñµEéÁ ˆ¥‘¶jõ‚¥ ˜š¡hO‘våüM[|“42Т¦Ž–FH²2bëìrvŸ¡žAµÑÝaº½æëãæ—ÀÍáŸ8VéÁ¯(;k…V»ª|müë*IxLC;øÉþmóýÒbxôßÓ§t¶8H킯FüPV›,¾r•”{d„ß­H¿³Úºþcõ~°›,›´lÓw’¥Ëí.·Ñ­ÉŽxM_˜­Ÿ_¨‘l.¶ò®XÖ0 ™‘¥6WiÍæUzg]™ª­.…wì¦ôç3õÓÁêÝÀÅ_±CzÊû ȈmtœqcŒÀT=™ùk­\´J _Y­‹ÎH%Ÿ¡—ÆwºæÍaìíªÛuÚPÑK÷vnd6©úë”ëó­y* ¢Q æ¸AJÝ[þ¯"wA…º%Õ>ì=¶\¯½\÷$§ÚÆ$é¾ÇŸÒäû»ÑŠ¡€”_é…þ¢ì Òì•Y£ÔkÌ š>J—œ½Ýeâ6ºÉ·ýþ!ðèLîL=ŸÛC™oý²Áø[À¼;úSpï…/uôð~åæ)âþç®› \;:D{În×’?þSÞ”‡ôÌèŽ×†´Ä`8pc± 8`!0‰ ˜DˆL"D&¢“Ñ€I„hÀ$B4`!0‰ ˜DˆL"D&¢“Ñ€I„hÀ$B4`!0‰ ˜DˆL"D&¢“Ñ€I„hÀ$B4`!0‰ ˜DˆL"D&¢“Ñ€I„hÀ$B4`!0‰ ˜DˆL"D&¢“þЯ­‘nG–IEND®B`‚087_director_sync_properties_ad_host.png000066400000000000000000001403701516513262500366640ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/08_import-and-sync‰PNG  IHDRÛ $K`?sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwxU߯ñïî¦÷„’„ÐK¨¡‰‚ 6Tlˆ‚öÇdž`/¨úªŠ»"ˆ*"Ò¤*%Ô$B é !½íîûG„’P&¹?ו‹dwöœß,³³÷œ=3kbúR;"""""r֙뻑+…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b‡ú.@Î-ö{ú×w ,ÓŒeõ]‚ˆˆˆœeÙ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(lK­¹R†þ=³EDDäÂbbúR{}!ç]úÏ8¦˪}~ÈEDDþ}4²-µ¢ xæt #""ráQØ–ZQP|Xõ½‡b6ÓdIyUÜgqbí­M˜ûÝ?¼a eÛMÍH]¼Š~»JøW^¯Ð¹!+Æ´`Íœõ<žn«ïjŽSÓeë°ç°ú©;x3úø›¼Bè4èfÆÝI€£¡%ž‘Ò„Ùüç¡ïðþϧ¼Ðד}Ôç‹ÉÁ…Ë;„ò`«ôòuÂÍVB|Z?ìØÏ»r9ô¯|A‰ˆÈÍâʰvDíH#Îzü]n¾ŒoRÂç1¹ä\F„í2öÔ8.[y˜ÜJ·äQP‹Ç[‹²ù$ê9‡lØÍ®<6²7o[O÷­…”Q°§ÖA1ì6ž¹«.€½$‡Ä-¿2ë‡×˜êð¯ÝØ”s&o[“˜÷߇ùkðÛ¼zUfV\:äZ\;´¡,qò `Ƶíë ©iü]HŽÅ‰ˆÆ ™<(€{ZïáŠEûY_\祉ˆˆÃâÊèA]˜Õ‰ôúüžÄ®òÀíàÖ€w¯ïÈxo7ºmbȦCw…íÒÂ|þNÉ&û4oÍÏä•U™ehòK«mP4¹7¦EË–¸•ÿݪmKÜãÇóêò5$]ß”Ðs&mÏìÁõc" í£>‚¶ÉهׯkÇX÷l^úy;Ï(âh¦69нCö ãÏÁ%tø%‰½çÖ*"""§ÁL§n™Õ ÿæ­Y3úüžÄç#A»l¹‹{wâÝôuŒ9Pjج‰: ÛµáåÌ;—4eD#' eòÞÆl,GîtjÀïcZóóV’tçE _/ŠšoÅo~‡kÉLëV-x?2K¼,”äçðÝ?1ܳ­€ˆþ=YÚ žs“8`°0``/~óÞC‹…Å|2ºk~ßoD(·†¸á’{ˆ·–íä©ýÅX'<Û¿w…¸Ñ ´€ÅÛã¸k]:û+‡§ü>:Œ¥¿î£Iï–Ü·“V+œù½|ZÌÔ¬²x·eï•fF~¾%•š0;y2þ¢–<Þ‹¦¥ìÜwÇWìãçܺOD§M¸¸:@i!¥v /ŒÿŠö'ãËYí÷3ëŒcæ&æÌü‚Å[ösØÁŸ‘Cwçå„»›(Þý1¼–ÏM7y°bÞr¶&ÙhÛŸ›'ÞFŸÀ²ônÏßÃïŸ~ļµ±¤ºÒõrn½ëFºû;œØ§×p&ʼDà“{õ÷ÌzÔÄãfüü»Œ wª¾=ŠI\ñ3¿]ÆŽÔ,>aô½á^îÜ—j†Åë~dÛL»Ž­¸ß«ˆ÷çoáé„RŽÛrì¥ü³u—:taKï¼Ú$Qûþ¥S´DDäbc[T,S›E0É¿ì¹AóÖ¬¹Ú“¥^Á ÷:¶äþ˜X&4.hCŽ›p0Ÿøs$L;xòý°V\[’ÌÝó7sËæB®¸¤9],•š±æ3õ»õL:dc˪u¸ÿ\9hƒsƒP~ÔÛ®X.ÿ1Š;wZ¹þâv<âggsL‡2È­<9y1®™…ÕÛ2H´f7î½$ˆÂ;éõÍf&¥{2iPsz;‚Éɇ·‡wd‚)•‰?m ÿòt|;µcvGת§G˜]¹ûÒæ´JM`Ò–<òOåé2»ñÀ5]øŸo6Ïþº‘ÈŸwó«Kó‡6§W=Œ×þä>+VkùOÑaÖÿÀç«óñêÔÀ#u[“ùcÆ7$¶­W†âTÃçO¾Ä¼Ã¸eÒT^|pv|Ä”©‹H)ÿÈÇ–¹œŸï'|Äy~Òít)ø7'È–<;”&²ðÅÉ|~°7>ú ¯<}]ròÊÓ_[h?±Ïkz3ê·¸%ĦcÞå맺‰jl¯dÿ¼2mæ~ã˜òâ3Ü;Еu¾Áü%Õ>3u>²mqedk7HÙËË+í£llß¾‡oŠÒί*—9¿ØŠ²˜òSSÓÅh¿ãƒö¾èíôYšF‚Ác˜u6²íÚŒ 'Þ¾jñ*úí*¥i‹&\nMeÈ¢xd³ÓäÁžþ'&K›ÝŽ °Ûìe£¥•8¹yÐÄžÏkÛSYœk‡”|3¼(-´“—“Ì‚¢Æ„82+¦ÏFA\iÎbüâ²0b†”­1LÞO °1•'‡ºh¿Æ¡ÜîœÉ˜%{ù! 1n®¼ç놷©€ôʵXÌ”Doãê¿ó(,îµ¾\ýƒùoƒîý*ŽYyv › ™vzŒgbý¬M´ÖØÆÙTÛ hßú?îyüm®mGðøèö9¾¡´KÿÇxòÆPüMóç¡–ŒyþvX€–4óJaç“ Yž8ˆ¡€gºNø£zzaZ5ø{?bþ¶ÛhÝ`?ï ç®wGÓßÏ „Ó"ÄÄ±hÏ(Z5;±O¬E˜0a2›1›Ž.Þ[}{ãJö‘ajÂÐÁýˆh`†–ñmƒÅ³úc×:Ù¶¸ÐÝöïÉ!­ÊCv¾¾ž´s±p Üüpyp)1‡sÙ’gÓ·ˆˆœ×ŽnÓu<áü{ý¾èíô]–ÆÁ:˜,PÏ'HÚ9œUŠ3M9cÍÜÇú¢c÷%'e²ÛÖè”ûÊK=ȧ‡#øxt/ÆíNcÁþ ~ŒOgg‘ÈeÖ>+¿µñ% 6ƒ®íüp8ÍŸ€`+a}rGÆ(íVÅv3¡Üp:œÀ†Â#=ÙØµKNVˆ­”u ):Ùý'eÂÇÏ‹/>ºµïI=&®f&73&¬u†j+œ ‰É‚«_A~®÷…Å–•`%kßAŠDÒÆ÷ØRÎ!iêø»RKÀ°4¡GËcW 1û¶¥k •%qÎ%£xïÝ{+YÀ^Jq© û¡bìÍ*÷Y;yªoÏ9â >ÏŒ ø£w/ºwéFdd$!î•?†©ÔrÏÙ.;(5›M'9éÓN‰Å‡×¯ £— 1ß 2sݱDÕe™"""1;8àïtâ» §‹F]¡’sæI›ãÝ~ZÒVtˆû¿[ͧ¡ ÖÌa½#x©/Ï‹bJr)£3ÈH+£šÀ¢ß³È<Ú§\kÕ½šÍ&°Û©õ˜²ÝJVUCï˜,œL'.c6™°$3tÎ6VºÜJqqÝÏ«­mP¬|‚dÕ 9ã^ņü2&ÌØ+R˜±7plÂl»Í†ÍfÇì5€Ç¦ÞL˜ÓñË8¸{`*­eŸåì5´gvêÄØ7>âÒMkX»!е_¼À×ï‡1ì…縩•ëI¯fRç#Û¥…¬Í†«C|hlÎawGï¹éû¹f¡3k®iLxqwÿ´‹ùùÓ‘󟃛?ï]ßqUÌ‘ôkÖšÕ—CŸEIĪ»z^lÛ ø~G.4hÊ«-œOzd~`7ÛÄŸvðÑa]ŽDDDÎnþL¯´÷íÚË{çp7kÍê˃h]ýÓg^‹±ÍãèâNï Ò®³m+)$*½ˆýñø½w[¾¼¼€{7d’êáϳ}¼p¤°Êölv¾>î´p+aW¾µÂÉ_vŠÌžŒïB˜mÓãÖÀŸ›|ìÄG—…¡’>ÛgçÏÖ^¤íÜúZ^_8mÿf[;òáÀ¦˜6d’èÒ€{ûaŽÚS«Éõ¶âBv—º2¶k#¬ÏÂИw;8ƒ½ò³R6fÆ¡ ž¿¢%™«’ØböàÆn-¸›½¼[X÷#FE×6×0Àç)>}ã œo¹ˆ â~ùx!‡[ßIÿÆŽǪéï:ö:Ú»%³æ›ÙáÚ—Éé_Êüe›¹ÏÀ  `búÒ ð=ÖD‹ˆnìŒ8Dï¯ãØ ¯ <ª>¿RüdŠwÌ}O'2þ£§èVídðs[M,ÆMÕÌŽtoÂ}-ýèYþuíq©‡øv{³‹Nã$^‘sœÙ‰K[¸wˆÄJ•fg/n*aþÞ‚Z}“ù™8§¾Ô¦.XœÝéìǺy°gëN¶)h×J}}Õø¿I½>¶þ‰‰gLL|ýÕ ""R—lÅü¹«ê¹Â¶¢l¾Û[7eœ#'HÖG¯F¼?¸m“÷pÇ–ZNÿí³ÀБk9'] ÓHädNª5²m<…q‘Ÿ nd[N‚ö™S˜¹ð(lK­ Šú÷ôÿÕ‹ˆˆÈ…GÓHä8 „õG#ß"""ÿ>Ù1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆÄd·Ûk¼ôßúõ뉌Œ¬‹zDDDDDþ54²-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ uÕ‘½ µógó˺]$$¥’SâˆgÃ@‚[tçŠá×Ñ·¹‡’ÿy'uOßÎÿv´å¿Ÿ½@oú®IDDDäÜQ'a»8á^}ò¢ò+ÞZBNÚbÒ³v oxާol…›©.*’Sc'?î~^“B‰Ù•æ—^GßÀ:;N9oŸ˜¬©,{ï³£AÛ1¤{µ¤9ä˜5,JÅF »g¿Å=Þbt˜“á%É©²“·˜ÙóöÎôlUyØ6ãØŒFàˆ›>š9ŽáaÛž³“1¶²? ã¥Wo&ÌùȽ£¸fþ3ü÷óX¬¤²ú¯n ÃÑè¢ä,q¥ã=¯3½¾Ë9G¶mù™ä–ÿnòoFÃã®i<`$Cb°¿Ø„»—»=›µ/çõM%€+}žšÉÃnå˲cÚž^ž 0ì·¹¹q*s~o¯<ó|w¶~þ¿nL¤ÀÑ›¸iìD:ql†Šâ”,˜ý kwƱ/%¿»\ÎM7¦·åä+TÃû'óG6<Š—ïqç·Of³jO6έèÐ}0#G^BS×òÞJV¨o/¼qñŸÏàûõf†½ñ ×Z°æÄ²lÎO,ßGütŠÜmNçK‡r}¿0ÜͧÙ7V²£óý¼l‰ÝCbŽ3ÍÃi×ó*n¼¦+N5Ô¹ö^ŽÙ$TĺncDÈ­Lûß%D?uÓw]™üé“tq=…>ìE$o\Èws—²uoYEŽx4¦UÏ«¹aØÅ„{û¿(ŠžÎ„)KÉ,]žä³É]q=ùÿ”ˆˆˆH½3D„zá˜<#¸íш °Óþ²N8mÚ@1lýk/…íp(Idý¶òèÞ¨WÏÛÎgS–°ïHº/9L¦yüïÉ,žšv/îe!¯$a!/>ö;Š=Ôš™Àö%3eÍfî}ý1T¸8´Šwž=@riÙŸùɱ¬_ˆ˜L^{nM+ψ±e²êgømk!Ф¬ßô¿x牷X•Uq=RÙ»=•½ÛW³zÇ$¦Žï†wå)µêÛFÖßïóø«KÉ8úÀRR÷D‘º'Š5[Æðê”!„Tþ(á¸:=ôã$“Ü’òû]šŸ""""ç'ÃSŒÉ»Cz™Îa나úðÜ|Ç<ùò;|òÃ6ïϦÔ~ôx´L—ò©&9QkI(Å¥©›ØXžàûõ%¨rH´&³¯¤9]w· ïÏÑéßÙ+™¿-;€5eïÍ*ÚfB.¹™{þó c5ÿO¾ØBžš ÙLïëG3fÔ@Z•³Zw}ËËÓ°V^>wcY€uò! $OskgÎ8´[fô½1ñæþ„–gýÔ%Ó˜µ5Ê©Eßöüm|1£<ôºwaÔ£/òÚË“Ó×€¢í³˜±$µ†:Ûqå“Óyýްò;éùè Þ›rUœRŸ…±Ìý¡ƒòS8˜WþÀ€ŽôêÝpw3ÚacÑyv\Ül”ÏøÇ¹Õ8f|7®–•ˆˆˆˆÔ¿:¹~›É9˜Þ·?O¯›2‰ß²‘ÍÛcص+š­ÑI–/“»}./¿îË»/\I#‹;­uÃmÍ_ä“ʺ ©ÜêAÌš½e ]LŸÊSHÜÛеñ‘³/M¸5Á‹d¶v 4e')åK4éÕß#cû– ®|ê-ºäXÁäZinùIxöäÊNžGç‚;…ögPÈ\¾L’w’\|Ë4wdäµíÊ,'m+?x€àƒ;îM¸·½œÞ>Ëù= JÄZÒƒæ§Ô÷exGï£+Ûf≯OÊ—¶[É?rÔ“´•ƒ…C v®Ðv¥:k¯„ôSéÓ5€`wØìû†'nŸGpûîôˆŒ$rØ® pÕµ×EDDä¼V§K69ùÖ}aÝ`ËOd늹|øÑ2’{ì2¶d]Îe ̸µHw÷¿X‘WG‘1(Õ»ÊÆ8ƒ.îCPU•[œ¨˜Mf3•§[ ³|WŸŠa΄³_MýNa…ÜâY1 š=ixäK]Šr(´U^>Ÿ 'Ú sŽÖâàq\í8xàd…‡«h«¦¾m8.8ÖW~6‡«ZkÙEv¨¶+ÕY{6 N¥O¿¶Œ~x8YÓç°% €Äí+ùiûJ~ú<Û\ÍÝÜJï]ŸFDDDÎO†‡í¼¨é<óá 쎄Ä#—5:*ÍnÁD\1†[×­àõ­6 €Ã6À ®-éÉŠ¥9°÷/þÙÄÎ"€`.éxÚ…›ÜqŠ€¼Ì|lxsÚ³óÒÈ©‚m9¤99ÓÅ«|~q&Óqáßä≠ä¦åbÅçØz•ækËÙg3P±¯û6ãäzdxÞŸk_›Æè°jBki…ß+ÕY{§Ø'|"nâé÷‡’¼c=«V­bÕšì/_œè…¼ùf Ó_º²Êùá""""ç:Ã?¥wpu$+9…””þþq!;+yh/Lfwjyj4ùèq$U¹Ðb`O¼ˆå‡¯×’| ½ÏàÛ ZG°zéGδ¥³ì廹í¶Û¸ýþ÷ÙQx²*ÈYǯ[rŽž¼X´÷O~O(ÿ£qG‚j˜ŠâØáè\éÄ?þ ¾èÈ=vrwüvôÄI‡&­iXy•kìÛÿ–åÿÁDï9|,«ÛK8¿“;v°#6‘üÚœ ZÁÉ?•>íäEÏãÃ3˜1ó;¶úôføø'yóÓ¯xÿ¹Ñt)?§Ö¾o ‰ÅUv&"""rÎ3|dÛ¹Ù ú7úy)@ê/<{O }.éBó†nز²cÕŸD¥–-ëÔù2Ú{Sun~)½|þ`Q䤖%ÑÆý{Ñè ª¶ôàÒfŸ3k/÷ /¼“ϰž(Ø:Ÿ/6fR ¸Ft£‰s Ïš×&ó×_FkÇVÎ[BÙª8ÐñÊnøU®ÄìÛ•«;;òÖæH_À³Ï•0êòv¸glbÁw+ʯOîAŸ!ð8a¨¹¦¾M˜Ú_N„Óv6Û‰õ.ß»ÞH·E$ïø“¯¾^C:àÔå!f<Œ[åæ+1™PDÚþ4 ;4)m?~)'*È‹cõ/q¬®¼\À%Ü;¾Ï±œ›1 ‹~É,¿!„þ½N –@ß;ŠUO|Ën+$¯ú–«*Üïs ÷ëVvmðÛòÁÍšÈê¹³Ž[çNc¸»¯_͘}é=áÖ=ñ6k² (v³b·HààÓÑýÄiµéÛ'’»Ævã‘÷6_°þo?Tl£aîߟ×ÕŒ[`c܉#ˆŸõ0·.)ûR›ÊL§Òg«Œê¸†¶cOXÎWÓ—W^IZ]sűë•Û È-¶br N¸`¡ˆˆˆÈ9§N4áÒìZ¦|ɦ_ç°`u IÉdØpôlH£ ft¾ô:®ëßߪq¢iÿ‹ðÿe~Ù¥çBúӳљNÞ5áÜ|8Ͻ٘¿ÿ•õ1ñH/ÀÙ/”V=®âæQ÷¬åìšFƒyä‹~\Á–¸4L-éØ{·Üлê8«`ñïÇCoÐ釟X¾u7{dRäÞ¦ÍZÑeÐõ\Q3ܪ õêÛ€ð¦ß¾ýy;âö‘šgÆÝ¿).¾ša×ô£E-×Õµí­Ü7$í$³¤º%O¡O‡ .òš,ÏO¿ÿÃî¤4²‹ìX\}hÔ¬3—^;Œ+ºWq‰G‘óƒÉn·×8cwýúõDFFÖE='°g-gò¸iÄ¡·Mã×þ gÃq_™~o¿9œÆuuM—úì[DDDDNÙ9Õl…‡ÈÌÎ`ëwß @3ô ¨ß -""""r ÎÙ°]°ùÿ˜ðúŽ£»ô¸‹Ïx ‰ˆˆˆˆHÝ9gÃ6G“;M"‡2~b$Þ§wñg‘zqÎÏÙ9_|<Þ IDATþ¥6"""""*…mƒ>gûСCFw!""""b(__ßÓzœáaût 9ßi‰ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆÄ¡^z-ŽgÎÛŸ³%×fºÝq׆:ÖK)"""""F©Ÿ‘mk6q›¶²}ûv¶oÝÌÞ\ëi7U¶›ÐË0}Ëê’Zt—D™ë™še?­ûåU”ÆÅ3×òxº­¾+9ê<ŸFbc[LòÓ™•~ú¡]Î2[¯}³‚Î[ )­ïZDDDDêÉù¶Ksù"®ˆ†-ÃéR̼˜\òê»&‘rõ3gû,ÉÏHá‡~H)ÆÅ׉]½¨8þ]ÓýdzÇ„õÉ,϶âèæÉÈî­™ÑÁ•¨eëÑœ¸aA41XYºd-W#îj'îü<ŽÞƒC9µŸ/ò)ôðå¡þmy!Ô Pœ›Á³Ëâø0!Ÿ W.kß‚{úZép¨ um~-åÅžŽ|±)…?³ì4 äåþaÜèm†â ¾‡W6åÀš]ÌvoKÜ•~¸äeòÒò8fÈ#ÕìB°&¼{Qcz8×¢MÀVœÃÌ¿vñj\6ûJhÛ´1¯^ÜŒkˆS…•¬bb/.bð—6²“|ÊÎMÜI³_m|7º=+ÿOUW¯ˆˆˆH1>l[SYüÒ¾Œ+ªpc yÅG~ÏcÅKãÙP±—ÖŒúûU7ðn%*&$g?n p¦K‰n»Òù,=œ¾AJs“¹qn,ë›òÁµ~4ÈIeÊòx6Yݸ¡÷WV”±ŸëþH¡q·V, u"uÿ>&¬ØAXpwmÝߟ’ù#?;ÜMPœÍG{­ôé×€`SØò™¾<‰;û´em?+¿®ÙÆCÄsÕm­ékÏâÁ9[ùί\×€€ÜTùs;7¸EòW„+•Oµæ¥pçj_ï׎§ ùn],#çZñ»¹5ƒL€­€þŒ§EÓ¦¶pÇ­ä0ÏÙÂn!¼wukZ—fóÎÊ]\ô ì¼®1A5µé˜Ï;?ob Á¼{e8íÉçÛõ±\;ÏÆš‘-èEå>2:Ðßïÿæ›v‘¬ëäŠ5ùP5ÏOOvåu ¨Š…NÂVC½:WDDDêHŒl[ÉËÌ$¯ºùEyäUÌRy‡(¨é<·’\fí)Æ;4îŽàÙ¨}Íéü“Ë[AÞ¸cg_ÜYXpys®vð¢­=—°e%€­†ûOTœŸË“µà24r#¸A6.&Ü=âÅg %ÜÞÚ‰œ”$~µù0³‰SÙ\4êØš—ÂÝpBºðò¼<’myp?³Šüøl`3F¸¸óY~åsØîŠ¥0jÃÂUýÛñ|˜#f ·lþr¯ c``µáئ {¸ã Þ¿‹Oó½ø¿ë[p‡§ ð"Â¥€•sø"+˜Çjh³G"odx2ý–Üî^öøn~&þþ|7ï¥5£—ÿ‰}b+ÀŒ “Ù„ƒ \ükx~*«Ôžõæ¤×Po°¥ö‰ˆˆˆœóvI^z2?æ;0¸µ'^.^ÜÒÇ'³±¯7ýmìK)Ââ×”Hç#2äG¸9¨éþ¹4æï(Æ~¾–Â2$´×7÷§­³ ðàö¦®ˆ>Dj«lÜžIiã6\ê fG"ŽR›,fœL6ö§äSìB7—#=™iÑå'[y³×5r<R-nÞ\åm磴"ŠC³=»”…^ì¤däSàѾnÇR»»Ÿ–$ÖåXÁµú6S‹³I(ÍfÜ—+™x¤ »›{¾ ;•û¬‚c5ÏO•ëXC{'e'+³¦z-h2‰ˆˆˆÔãöٗÈ;þ‹N…™ÐÅ{™÷Þ<öÚËJh5|Ø¿£íšñ°TݲÍf“‰Ú·–WüÛØl”_“‡šã¤;%G¯px²6íXív,®ÌF×J[Œ““#&[mú´Tÿüœ°Š5¯ƒÝj¥Ø~â2¶šê­¶U‘³Çø«‘˜\ŽèÍE]tì§wGŽfkg«¸¿‘s5‘¨$‡ÏâKpnÜ’•7v'jdÙϦëÂèF ó£sÈÅLÓ@¬™éü}tŠŠÔäLâl@÷Wf'iÿ~ÛœKPÓÆ¼4 #ÿÜÞ“i~9|°#|À£a W:æ ûYbnÀ„@‡Z;3! ]1>Ħ uìÙ¾•ˆ…‰U×bËç×ôRŽädkþa~9 -:W1l¢Q7\r±:ÿصÃób³Õ…HOs mºÐÈÇ¿‚¢¬Ž¹9äæDCÛa¦þµŸ•ŵ¿ùé=?GÖ°ÛɳéÏÆÞ¤ômÞ„Ákvrë"W¦wó# 7gWgS‚ `&´Úû+3álËaæºö˜[rc'ò3Òù&ËDó6N88z2¦©™Kc²iØ6ŒžNµ[Ÿ†¡M¸Á²•»–ìÃÞÍà ¦¬ÉÄFH•‡C¥|ûçN:ôkB§f¯ÛÅr§~mRõ¨­WPƸmâ?‹âpë@ËÒl¦­H 5°%·ûš!½ú6=soOÿ‹_ß :Ùrù~CÐŒû\LœìBÚf“CYyÄå;ÒÒÍ‚ù4Ÿ³“ á|¼1…!‘>˜Srß¶"0yœ°¬{@ õŠˆˆˆÔ‘ó0l[ù{gî¸?°Rù&'wj€ç >K³rqp#f³rÿ²}ŒûiN>~Ü׿ —ïÀâQýý•ù…¶dNXܸƒkì8º¸sED{¦w8rÅ ÝZùá“Å í<91VÍìÒ€†·ã‰eñŒý1žÃN® jߎŸ»ºW9gÙäàô^®Ì^½•)9Ð,(ˆ¯‡µàrgÊæ‡W^ÞÑ›7‡uÄgùý9T‹3=ÂZò×Eia†‚šÚă)C;ã¶b7/ü–D¢Í‘ŽÍš²ðâZì³³—†ûðÖ?[‰ÌíÄ+ýð:ÍçGþwi£VÄÒû+ -‚x¬ÙË N\ÖrõŠˆˆˆÀd·Ûkü\}ýúõDFFž½^ ¢xmì ¬/pçâçgò@»ªF“Ï7vâ¢6Ð6Ê—57· ›‡2©»Ÿ—ÏÌ1 9…‘áºn³jÆ??""""ç’ú‰;.­¹óµ7i°àxêל8×X‹òX•˜ÉÿmÈ%¬c[:(HGψˆˆ\ˆê'ò˜\ðiнtnŒ’ì&ü~[“0>íTõô ™ž¹ÕÏ4‘ €N1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b‡úêØšÍ’ï¾cáºXfavõ£që^\}ãp´òÆR_…‰Èíß¹o²S÷#ÿ{õ;¶dZi6æ]ž ŸÃ}S–’r+ÓÞJP +fÏ^É”;ß&ÆÁ¤Ïž¢›Û‰Ë”ìý’™GšÿµüoÚhš;³6b¢ÞŸ8™?²+Þè„w`»_Ím£úâb2¦ïü¿yfô«l§-ÿýìz{ÓMõ#RAýŒlÅ3÷ù§ø`ÑVf•â„-“›áý''óELöz)LD.hÿÚ}Sѳg³%ÓŠcó~ôiê¦5¥Z&Ïøûûãã\Ìáä86,x‡Iÿ·’ ëYh¼ô sÁˆc™[t¬ç~DjP/#Û…»~âç½vðº„IoÞC7 ”¦³fÚ£¼±*™Å?Esãc]¨bàDDÄ0ÿÚ}“½„ÜìÀL»‘w1¬£Øîæý/Çb79â|~׋a\éóðÛü§£ PJúúyöµÅ$o˜ÅìØH&´u9û]ºucò—_bÃŒ£óÙo¾Îû© ^¶5/“go¼\ÊÇWüéq˽Œ OÂÖ !f;`{~ ½c4ƒÃÝ1a§(i5ß|8›•;Èvô§yçÁÜ6ö::úœøîdM=ÒO/îãÍ’ÙˈNƒ€NW1îþQtõµV26Ìáã¯~góþ,ŠM.ø·ìŵwÞÁ•áîXf󟇾#ÉçîœÏo þ!ÙLÄ•wp{‡8¾øðg6,À;|·=4–Ká둪ý+÷M¥™óðƒ|“`#ê•ÑL¸ö5þù+7äÔ÷#ÖÌ|÷Þ,~JÄЙ+¯ò;OGþåäðïq+wö\ÉËë³~Ù^îhÛªÝVlÞö3Ÿ~¾¿÷dRdñ ¨]?†Ý~3ýC2™{t{<Ìâ'oáà#³x®ÝFž«0M©s6˪U?ÝÜj~-×î½]ääêå“D—Є™€´ùL3‘)o~ÊœE«ÙYÎÀ!×pUŸ\L@ñ^fOy”‹¶q°$¶mƒ±'EóçG“˜ôõnNùC¡ü(>zó'¢³ó±ÆòÅ“ÏðŪ8y¶ MÒb–ðá³ï°"ÝŠ-s%o>ú,Ø’‚k«îtjTÄž5_óÜ㟰#¿š·”üµLŸ±‚Lg_Ü("uËüß'›Éµƒ5ù7^õ{ÖïÏÁ+¬m[H]Æ'/}ÆŽ‚ md-ç“9»±¹8`Ë;Ȧ^ä¡g¿!ºÄ 7¬díþƒï­"ÓÆé×)"ÇùWî›,~ô¸m,–ý|ÕÝÜqQÀ #-§¼)ÚÍ×O½ÌÜMÉu "€hæ~²„ôS]w9÷™\ í@vü~§W¿­XÓ—òÖK_ðמ\´ïFD¨I[eú³3ÙçC[n¡‡'€#m†ÝÃððj†˜O÷ý´Ø¯výœÊk¹šZDªS/aÛt%>>œ.ŽPšNôê…|óá›<÷ð8nÿ?lËÁìœÃÏûÏKxòÝ7yá…7x÷éËð’~™ÍÖ¼SÝ‹ºá)¦}òwu%oû\~O‚FðÊ[¯ðâÓ˜Ü× 7ðóú.›Ë†Bð½ìqžyäœò,w†› ãfoΩf'€¡S?dú[Ó˜þXœ‚Ý;I+µS˜–†[«vôõo¿öí:E¤¢å¾ÉäJh÷>tð°q=Ã<*íükÞÏNöÆoù%‹ï½ÍÓf0y€÷)®·œL8{”ÕÂCìû³úm¥8ábJÿÜ~ÿ#Lyõu&]I—Ö¤å8Ú-’pO7štïK„u²Ÿæûiníú9µ×òÉj9 O±ü«ÕÓÕHðï~“»¤ }»bc‰ŽZÏ_E‘˜¹‰oßøœv3Æã½{€{—´ó,;Ú½õº{/fñáĦ—q*Ý:vbø‚ÜJ9—@1àÓ±+ANt~ðc¾¹Ïæb¶LMàÐ♸¸bCVcÓ(éã…SUý¸¶$¢‰ &À¥Q|ø›k 6» ÷Ž·óˆïFV®ZÊŒ>bOÜn’ŠìÇ¿Aú„îëfW|=Ë>.kÔ>7X=üp²l6ìöb’vœf"RÉ¿|ßtR5ïGŠ;T¼­„”íû(öéO 7àI»]ðXºŒÜSê[Î}vŠrËÇx]œÉŒ®~[኎4·üMLú"¦NX„G“º÷èÍõãûÓÎÏN%œž÷Ó“*%³¯å.®5Õr ë#¤zÛVm^ÈÂ-Y85ÌõýšÓÉ¿9ú\Îð‹˜4ñCöäÄwØJ× ªx±!Sù•7ð£ÚlU¿ÐÝq1[Ún+ÿ­ÂÂ&³Žf€blÖ²‡<ÈØˆŠ×2ãÜ0ˆ“^ÕÊd>6jdªX¹‚ŸòÈS¿‚-zö¢ïÐŽlûîG¢KNh„ÊX2™ªºä’ýôë‘ .€}ÓIÕf?’xÜòöòâŽÛ-™Í'ì·ä_À^Àþ-eÛ;,÷”ê·—À0žžÖ„‹ÿdåšõì8ŲQ,ûi#¦¾È¨ÐSèû¬¼ŸÖ²«Š¿WõZ>i-"Õ«‡i$&ì™k™7>ßò5ëRKÊß|¬ä§$’ `ñÅßÝ ßMqò6ÿÉö;`'/v)ÿdŽ!´jàf‡²ëÞæ$’o{I[bÈ>Y÷G9àÛ<àð–õ$ö|vÌz‚ wßÇ«Ësh^6É1/χ6»Ð¥K'š»’“C‰ÃéœQÌ¿V“Þð,/>z7û»‘wš;†2N4<ëuŠ\ˆ.ä}SÍûS¥åZcRW¯`Oì¹D/ÝHå 'r¾³’ñÏW|²®ð!²KBªÝVì¤,ÿ”÷¾ø“Äf7óÌ»_ðÅô)Œhnkٻع¯˜€¶ƒ™øüƒ\ìoÁx%O¾2‘Am|Hÿg9+7¦àq÷¾ò—6<Ñ#B†ÜÏ­ÝálÏà@²w>°`€ƒ¬ÝœÎé|_ÀÙ¯SäÂtáî›N}?bòèÌÝSÿËUqËK$ÉÚœ+GõÃï´z—s='ƒôôt² ñ §ûµòÊCág®y[ñè2žçîB—‰QëX·i…í¸ìîg¸;“Åî× Ä2ÿ™Ç’ŧQa-ÞOkÓO-^Ë"gÊd·×ü!Îúõ뉌Œ¬‹zDDDDDþ5ô½"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆAê²³õë××ew"""""gEddäi=®NÃöé)""""r>Ò4ƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[DDDDÄ Û"""""QØ1ˆÂ¶ˆˆˆˆˆA¶EDDDD ¢°-""""b…mƒ(l‹ˆˆˆˆDa[D¤2{>;?|)¤Rj¯ïbDDä|VÏa»ˆè÷î`ÄCóH²Öo%µSDôŒ;1úm¶»Õž½šçFŽà†§–“Uá¹(v&cGÜÆ›Q”&Ìæþ#˜²*‡Óyï¶e.áñ›dnbé¯Åi³fýÛû<}ÿÜ4b7Üz7¿ôËãóNkäl±“½ùS=‚QO¯8n¬Å{>cˆŒ7“˜¢JwÚ±ô‰ŒQñç6îy|*/ÙC^½oHV27|ÉÓcGóÔ¢ƒD¿£&¾Ê‚=ǶñâýÌþFÜò*› jn±(v&ãn}™M'YöL÷ §£¦>íoòˆž>–·=ÁWÑzK½9_G5©ýë¬ß×¥Nhd»2kóº‰G~IåÄüïDH·pòw³#íØ‹£0~»­`ß³–¸ü£ q(6†Ã¦fôhê‚Ù£—¹–‹;aª“9ÛŠÙ7ïžþh ^—ÜÉ/¾Ì³ޤ«mÓ¦¼Î)çÅÑÒÙSívRÇìÙlùá7R:ÞË+÷»^7°bö/_M:@Öz–ÅWNÛeÌ­ÇðÌÔ©Lú2Ï>~'—5Í`ñ{OðÜœ½TýˆºaËü‹éoýëÈ©<]3"þó6O÷Iä«7ç°·¤l™âKø5¾ ¼û]ϼϳ¶o8…m²ö}:ÓfâÛ<{q¿ÿKaµËŠÔŸúxÕYMrÞs¨ïÎ/&ܺÊGl‰Ïå†&>˜(æà†”u&(5†uŠèÖÆììJ„Æ£háiÂl‰àú1õ½§¯h Ä0âMŠ#­hß)”Ò'1ïÏúßÔ´üv©SöR ŠÍx7oIˆO=ïÔ‹÷³bM&^}o¦ã–¯Y¿<ž1mÚà\i1‹Wá-[R–U[Ñ¡{ºNæÑï>fՀ縴AýŒÆÿE´Kžéß §‹®½‘®Q+Ù{ØJs ¶¢J\hèn9+}š}ê~ßpJ}š]ñt£ô@!6cË9mõñ:ªÉ¹X“Ôs+lçoà…ñŸ~ïå¤ÎËÚø|;]Ç}ã;7ë=æþs€\·p®œø·GúaÝý1¼–ÏM7y°bÞr¶&ÙhÛŸ›'ÞFŸÀ²ØWš¹‰93¿`ñ–ývð§EäPÆÝy9áî¦òþ¾¢ýãÃÉøòcV{ g`ò§ÌK>¹‡Q?Á¬gºãV¡D³O:ØY´ù EûàR𯖍ü†KV¾Ì¢ I”´i†cI2[÷–âÙKùº›Iðóï26x+/ŒÿœV]OÞ‚¹,ß–HIƒŽ ™ð £:û`ÆNAüb>þ`.kvÂ)$‚˯osÜÝI×Ë%…ùÞÏ‚Sy÷ÎpœlÿÏÞÇEUïY¶Depau7½(ÝÔÒʤ4SÓ´²¬ìfez]rÅ_¥Õ5wË®fÞo.™©7·P¯æ‚f€¨"²33¿?Ä…u•Àz?þáœù|>çýþœ÷œó™#[ǾÊüsaŒ^4†Öö ¹‡gòÊÔ+ š7‰æ'–³à?Û9q%µ£7ŸÁËya]ºb3’W(¥n†éšðä;ã×9s«ô0å$°yÉbÖîãjžžaÝðòs´rÑ”s§ô͞Ͽuï°pl[ô @g¿~“Ѻ0ëÓ~4,¬Âþê¾ÅÜ÷C(yÁ±€”ËÊé§;I G01©s¦=Š‹ —c³_gjêæLéDþ®r¶ëªa葬('6fûmyl«+ls©ccLc˯² Hx›~F°h|¾^vL´fs¡*í+_þ¹íìI×þX°–Ýû·“88€€ÒÕviНGûôÝ,¶ͤK„S|hP¬¬Q߸ȅ,>Å¿S9vä½™+Ý®ÒyÀd ýÀR&ýßVŽ]6QÏ¿}‡¿HgOÊÝsƒ¯Uåùý~ï,eË‘dnX¹Ôm¯E5`Çû¥c2ˆkÅPîÝï©5;߈¿S;&g~…sq_\/meÉüUìŠK#_±Æ5°+ýG ä7msq32,™ÇŠÕÎ<*Y”UÉ\-y&ŠÕ¾e$ɬ[zÿÁòɤ¾¸ŸúŽ #>â„ÿ&:•Á¾Él\²‘ Å·té;˜»ô<¾Q£˜<æEBs73럋8’m‚¼Ó,;µ™-xaL4SGöÄíÄbÆEoâöªC*[ç® Å§'zµ§ßÌÏxÁSƒ×à/øv|xÙ$Óº`GvüI~/cæ)b¯8âGH¸3i‘fõ8NfXáæUyý,Já§EÛÐþý-¢?›Ì ^ ¬ùü[âòÁ¶“™ãkÁð‰“ÙËC ¿%±¸Ï•ö g‚ZÕãÚÑ㤀¼óüz(Là×” K¿!¯A;š^ Õ9ê IDATÿ³·£ê4ŒqS'2"Ò†}‹f²îÖàÞMׄÈöN¤®|—7'-â‡]ǹx½ê6 ¡¥—ýÍ`*JaÃÔ²4¹)Ͻ7ƒ†zc3&,'.ÏTvÌ¢U¤?ÆÛ‰Ë)~½à"ÿÛ›Nƒ®ðPª¸¿ÊŒwáùï+è§Š& Ç>1†£×Ч¼Ü3l;˜‡·0ô+Øî’+Ï”ŽKú]…Ø®¸Í¥ŽÊ™G§Ïåeo õŸ›Åòé8)匉%¹PÅÜ++ŸsÛ÷’aJgo'|;5G—¹Ÿ˜ –’”¦Ø6$ÀÕÄå3W)°h‹ÏÚï)º»Ÿ`ÞÈ1|u0¿gPPz±¥Á€ñî–Œmþa,K¦å q̘8Œ6E1Ìþç\f•Ú¹™82å竱Ñl2>Â+Î`Ò+mÈÞ0‹O¶ªx²TLj-Œ!³ó €˜Œµf-¬¨Š#A•ÍÅ$²rÆöÚvá•ñÓ™úÁ B³71{Ξ;ß)5ï¨,Ç ÖæQå…¶åsµEy&þ´jוmÔ4íÿÝš9 P—'š¯àèx¹WupéÄ>N!³<:†ÿƒ~më MBâˆÅ¬;6«uüœáÇàÉ/ÒÅU øÑ¸ÎeNŽÝÀŽ”GyÎ(*@ñ>cŸ+^aÈGAAQ©P©Ê»¶¦£akoÔ»“xãÎîå¼u Ýmqk‰ýº½œ¾þ8ú ‡IV¼èѤ‚EÝ_£Ô€ó3X3á"…®þò¿i:2fT_ÂíÀOS¯ÏÏ çdåýz*,ýˆÏzçôÃ$ÙÓÙå'§aðÑpòH:Îa!8e­$MiÈÓu"ØY~ pò:Z_Îg0ÅžàW?fªÿz~Ú±ŸÕŸmb`ëL§ÇŸ¥ïߨ£†‚¤Mü˜äËË_ "¢® ðÅÇS!þµ¯Ù”Цˎ¹)#Ãb¶ŸÉ%<Ė‹»Ø›Ñˆ':¸cLZZåý•V”q®Â~ê\#·›LÌÑL"þæDnÜ6~-lÎð`G Io§¨Ô%⤠Á‚~W!¶Ý*is™C£R£*n‹úVÌ–“œC_šÏ…*´¯ÜÎO"fß5lC#ðµQ°nÚ™u,±1‰¼TÎR’2T:ôV£ ÆŠ:ÅÚ—¾“¢ñX·†ï7\ ùë·ôß`zôÆóêc¥˜È¹z•|kl‹/ï›ÍGÀ„-톿Iï0{šÒä] #°îðuÂÃî¼åùÓ—úYß³=;”7ÞŒ¢½£xñFæ%^H!’1iQ ™Ÿo@…³ªÌd®}-ƒß­N£Æ1 wõNÀÀµs•÷KØ–ígì?—òq²=IWßËìûõ,×»j8xÉž aèv§‹ûdæÎÖöíhN›6mð¬h-ªÚ‘€ÈDÀT”Eò‰ýlÿï¬_<Ž#W¢ùx/¹âH+8üXx«ù¦" ŠŒ˜2 05.;æŠc‘M‹X²ó,¹!¤îÞCf“§hWOEöɪï¯4kŸÊúÙ„ˆ0¦Æ#³S [alù&-ê(•oWâ›3&²-ê·å±]y›-PbLÌÇÌÍ\¨bî•’ŸÃþk6GøÞ\Æ£÷§“ŸÂáØ†hm¦ÍÆ|² @g¯«Ñuçê:~D x‡ÆÊhh»œø«?†Úc} WñÑÒtB‡´ÇU ­P{ÒÊÛî®y*€°ú&6%ePt»H0GÙ\MH¦Èí ¼õ·^ÔâÙs4“ —Jô£ÒºýEnsó €‚}гü}õGÌ\â͇CÃp¨}÷DÅPñ\¬u#º<éÈŸü¼ë,gNãPlEîíïì Ô\lù:P4z<ƒ"ôm¾z‹±;¶q®¯/õŒ&Tuºð~t¼K¬çPÐØÙ£QvÌGZvõ%Ù.’²ôÜsŸ¨Ö8«áÚ½ì¯ôÐØWÞOï.áXO‹áø%kvVy§öŠ™í|J¾‡É’vÞü§E̵Ùìn,‰ëÒ¹P…ö••GBÌ~2ÉeÏÔAD•xm?1‰C4Sm›r.pꊂ[S—ò—^U;#Yñûø-ÇŸAz@…m£Žôë€ò÷Øw<Þ~FLh°±ÑZž7r÷&F¨4%«ÖÊãȆ«ñ&P©,ZÿWi yÞù»ªÌ7&Y`úçVÉ\lºqœåS¦³1ˇ¶íZÜuø-fÊÏwo_rÞ¹ÿy¬æóÈl«!ÏÄŸÏÃ}Â̯‰9·SÑxí¿¦ªpóvÅÅËmÚ1N_»s2ÿâa’ ]ð­wÏÍÐÖ'Ä߆”˜õìNs¥U€ÃÍTôø·k@ÎøéœïVž÷P4h©ççŠñB,ñ·:l$óôaR jÍõKÑãß¾×låç$[šÖŶa+dëÖczwÀÇÖ@Æ¡5,û1Çðôí>Z4‡¡Ù²å\™5³*uñ»7°þXÙç…ªT€Z‹ZQ°kà…}ÖÎêqrrÂÉɉ:ÆÓ|¿ä{NVøe§ H|s³7†½YMéV÷º¿»™ï§u“B­N³nÕŽjÂx,ÀÅ‚íînÿý·³jm® bæ~å%³ÿ:ږØúÉLfμùóÉÄþx+YÄÆ$TþØ8S>I›WsÄ@d ‡:É<ô-s–Å’Qª¨4¡ µÖbãߟÑõüòÝ/üni>.çyô†ôcHÕÒÐÏù®;2æâHC]oW”Ô£$ÞŽ)—·D3júfRK<ª×Ò27ßÜìý#+ÙRð£äªöŸ\Es±‰G¿ãÇKá¼ÿÉdFz’ˆpôy•=¡¦*óXmÍ#sdž‰?³Úye»J²Ù=ç_4úÍmSÙ³b'l:òÏ =¶ê^tqÏ’™Ëнðõ N³ñË dú¿DD-å?ÐWA¥¸qé—¯9Pß±¼[ÚÖ4jÕe÷ 2»TïÖ0ªqjÑŠz_­"•Æôjb{Eƒ—¶½^>›ÏgÕçåÞ¡8¤ïãÿ–ÆaÀ ›3ý›·¥ÞÂÖ†Ó£¾еáné,‰ŸWüÑ+*rŒgÙòíF.«†òx‹ºäŸÛÇ®n]ˆÆ#’¨ð™=c,½{ÑÁß=Y¤ÿ™Uë¯8¸;^V õyœî ¶ñŸOa?8/Ã9~Yý5[Lýè®WQQ¥¨8é3Ÿ/–lĺÅ(‚‹­»ÇýÝ¡Bk®Ÿ6Þt ÓðáŽ3Ô‰ˆŸeÛ•ˆ“ûngÛ\Efcæ>n—Cl–ízw& ñ]_)29ðTÐJ>!!¯ÍŠn2ÏwÊFò3/q&v#+·_ I¿èXCý n­;â¶j%K6{òh¡ cþŽü°„ þ¼ìˆ ¶®®è²¯eWµc{rØ7ï3V¾Ô› ›v.ÿŠ8§nLmfËÝŸ^+w5!OÑAÍüÙ«¡ONײbé!L½^ÀYSrîÒWCÙÅïh~¾#Ùi™‡…«o¾»ù~iê…꼂d‡0Û*'ƒ]àœŽ¶-Q¡`ò2ï>·€%k?câ7ÔzOB{¾Ë°ÇÜË>ÚMíLçQ3©³q+7¯à‹5YªípiØŒ.#£yú‘7¯,h½è3y2V‹¾bÕGÛH7èiÔºc‡=އ†Š‹NÅ‘ H_”SIwkÉ¥t÷¸¿;;¶ Ÿ6øtÆfÇIÚGú`mÉvêü2qrí¬j›«Æ’˜¹w¹Äo‹%«ng÷/õÝ}Å'±™~€˜„<šÞüµ1n)SÆÝú#kêyò諯ÓÿÑÆæ¿HY´^½ýF6ó¾Á´«¹ÀÎ7 ãéѯХ^ñ@©Õ¨î:³›Û|@ãúo?«°á›h¾û]GË'3¦6Ê]ë:1ïú0^‹þßÌ[ÁÜñÿ!ÇÚ ÇFñAïFhKÇä¨Jb¨ ùö[š›o€›…Œ¢’[ÞÌÅ6-óVÏOY´l;©‹w«Çy%:”mŸ.fÅêS´^fG•ÏcÆ«$m_ÏzÜy¢Gvµ5Ê­,ìcUóLüi)&“Éì=îýû÷Ó¦M›?¢=URÿ%oLHáÕÅã 7÷|!*d uýhF®oIô¿^,µÆOü5’´| Ë|&1¾]‰WòNü‹7fëóù|D¬ä`ʰ…·Ÿ\ûHýñ=FÅöeáä¶Ø™ß@ˆ?^­Ï#ñW&«ïÄ_š1û"'b7²tõ9ܺv¡¡ÌÑ nCéç_öK*+=š¼«üžó[²I=q„K…tšZzÝØ”GZj½µœ0Díô0䑸K{è—‘q? —w°pÖOCžç'Ê7/Š)Ø4įœW¬EÒ£ñD>ñ ã&¤â{Ìfå\̘û±o?˜® jcôåsjî›LüÅ…§ÇûaîéBÔ„êÊ£ü¸oøèëäVøÖ¼8šAþ5¹øM< êe$B!„BÔfrWP!„Bˆj"ŶB!„ÕDŠm!„B!ª‰ÛB!„BT)¶…B!„¨&Rl !„BQM¤ØB!„¢šH±-„B!D5‘b[!„Bˆj"ŶB!„ÕDŠm!„B!ª‰ÛB!„BT)¶…B!„¨&Rl !„BQM¤ØB!„¢šhþÈ7ËËËû#ßN!„BˆÂÚÚúž¶“+ÛB!„BT“?ôÊö½~"B!„âa$W¶…B!„¨&Rl !„BQM¤ØB!„¢šH±-„B!D5‘b[!„Bˆj"ŶB!„ÕDŠm!„B!ª‰ÛB!„BT)¶…B!„¨&Rl !„BQM¤ØB!„¢šH±-„B!D5‘b[!„Bˆj"ŶB!„ÕDŠm!„B!ª‰ÛB!„BT)¶…B!„¨&Rl !„BQM¤ØBˆÒL9œ\4’q[¯PdªéÆ!„x˜Õp±Ï©yCˆz{-— 5ÛËäsjî¢}α¼;¿5]ÿ…I}£xvü®ÝubÎ[ÀШÌ:œKÑÅ•¼ŸÝYÜ˹ۘ¾ÑÏdMJÑ}÷âž®sê§ùLxsÏGEñì€WxgÚ×ìH̾§>‰ÅÄõß–ðþ (úMØY"kBAÂ× Š"jØNç—zÑ”AÌQDEÝý3×GGóå¶²k< ¤ü† C1~S2§æ¿N¿×þërïÄxÁyÖMBÔ ÿßrËßËËלƒLéÿ _ÆÜß~:ùœš3”¨°üT®Ì/µD~܆ ˜Î¡ âþ~ÏsBüYÉ•íÒ —Xûöó¼»ñ eë+<Ã}ÑäÄsâê“h^â>â `JØËÙœÛ;"#î4™JcZ{Y£²oJמOòH+”?¤#ZçÖNaÂâ#ÔùÛK|0u:ŽìK˜q'³Ç}ÂÖËŧ¥§Ò8ùƒ™®sdÕO\n9‚ï´Ã¡F¬€ó;~áw€kûÙžXºÚ¾Iå?˜‰ÑÑDGOçÃÑ/ñw¯4¶Ìû€I«“(‹?†1}s>ÛŠMßh&?Õ˜à|΄),Ÿµš¤Â›SpaÿM àÝ/Þ%Ħ{¿jS —¡#àµÏù°ó56ÿGžù D-ðÀÎsµ:6…¨:)¶«DÁÖ»HåHââOî$רÕ‰à€¦4oÉ€÷ÇÐS”µ?_¤°¦ÛøWe*"·@…C?<køÃ\ÁyvîI§NÇþtÔg²Gb¹Å³ºŽ'¾~~øù5¥Eë.ô~m3ú7"qå—ìN3þá;%/q§¬;Ð'¢1¶*@íH‹'Ÿ#Lw‘¤Ì›§}c~…Ö®Ô³S×X;ÿT6¸¸ÛR”•GÍE„¨Š‡þ<'D5ÑÔtJÈ9È”W—â;¢WÖ¬aob.NAOñÆ«!œý÷<Ö¸À [_z¼ö>/¶©‹!þKÞú(‡çŸ·gçÚ½dÄ50‚þ¯ ¤ƒ»€¢ôC¬^°Œ-GΓ©qÁ§ÍÓ {©¾vJñû-§ùè>¤}ó%¿ÔéCdêÖ¦_½N¿Øø÷ÄVØÞÕD•c!®&6ý–L~gG¬‹®räp&‘½øÛÿ¦³éà% £-LåhRŽmšã¢.îÛ°xLþ‚¡G™òêRš¾Ý›ìõkØq,…Bç–ô>’~!ލ0‘›¸…/®aÏ™ ¬<ƒéÖ; Ä §Â~Y_fÝ{o²¾E4_¼ä‹•1­c_eþ¹0F/Ck{…ÜÃ3yeêÍ›DóËYðŸíœ¸’‹ÚÑ›ŽÏŽàåǼ°.]±™ É+”R7uMxòq„뜹Uz˜rؼd1k÷Æq5Ïϰn xù9Z¹hÊŽ¹Ó@úfÏçߺwX8¶-z €³_¿Éè]˜õi?Vaußbîû!”¼àX@ÊÎeåôÓ¤…#˜˜Ô9ÓÅE˱ٯ35us¦t"W9ÛuÕ°aÔHV”гý¶<¶Õ¶¹Ô±1¦±åƒWY$¼M¿#X4¾_ /;&Z³¹P•ö•/ÿÜvö¤ë ,‚GXËîýÛI@€¹s¯¢ÃëÑ>}7‹mG3éáT#+kÔ7.r!Ë€OñïTŽyofÇJ¶2“¯Åc[q¾Wr¬‹÷_py7‹¾þާ®bpiIÏWGò|¨#*ÌÌqí»¼~Oa¦™y)ïüV–Ì_Å®¸4òk\»ÒÄ@qÓÞS U:WˆQy<&é–2éÿ¶r첉zþè;üE:{êPî>ÏùZ™=¾E¿ä»KÙr$™VîuÄkQ Øñ~ÙùÕ¶â&[c»¢fÕ¾+Ûɬ[zÿÁòɤ¾¸ŸúŽ #>â„ÿ&:•Á¾Él\²‘ Å—Qé;˜»ô<¾Q£˜<æEBs73럋8’m‚¼Ó,;µ™-xaL4SGöÄíÄbÆEoâöªC*[ç® Å§'zµ§ßÌÏxÁSƒ×à/øv|xÙ׺`GvüI~/cæ)b¯8âGH¸3i‘fõ8NfXáæUyý,Já§EÛÐþý-¢?›Ì ^ ¬ùü[âòÁ¶“™ãkÁð‰“ÙËC ¿%ñÖ¥ãÊú…3A­êqíèqÒ @Þy~½&ðkJPÈ¥ßÎ× M¯ÿÀŒÙÛQuƸ©iþE3Yw¡œkÔº&D¶w"u廼9i?ì:ÎÅë…˜ÐP·i-½ìoSQ ¦þ“¥ÉMyî½̘0„И1a9qy¦²cþx­"ý1žØN\NñëùßÞtt턇RÅýõhTf¼ Ï_A?U4ù[8ö‰1½V\åžaÛÁ<ü»…¡¿XÁv—\y¦tœXÒï*ÄvÅm.ulTÎ<:}./{k¨ÿÜ,–OÀI)gL,É…*æ^YùœÛ¾— »P:{;áÛ©9ºÌýÄT°”¤4Ŷ!®&.Ÿ¹JM­P¶ö{Šîî'˜7r _LãÆï”^|j0`¼ë£€Ù|…JóÝì±6d°má6lžÅŒïѧA<ßÏ]MBfç¸ ÷]^ ›i'…‰¬œ±€½¶]xeüt¦~0ˆÐìMÌž³çÎ÷ªC–䌘Œ²þ÷bÉ<‘˜Ë’i9h3&£MQ ³ÿ9—ƒY¥Ž’™ãkÊ9ÎWc£Ùd|„W>œÁ¤WÚ½aŸlUñ¤¹ópyj[ì q—ZøLMÓþ/Ñ­™ uy¢ù ŽÞx—{QW—žAüçã2‹À0¡#lø?è×¶ д!$ŽX̺cñ±ZÇÏ~ žü"]\Õ€ë\æäØ ìHy”眢Ôï3ö¹Fh ù(((**Uy×Öt4líz×ao<ƒÃÙ½œ·d »-îa-±_·—Ó×Gá0ÉŠ=šT°¨Ó`¡ûkôïàp~¦k&\$£ÐÀÕ_~à7MGÆŒêK¸½øáiJàõùY䜬¼_O…¡ÿññYOâœ~˜$›`:»œàäñ4 >NIÇ9,§¬•¤) yú±N;«À¯N^§QëËù ¦ØüêÇLõ_ÏO;ö³ú³M,l=‚éôø³ôý{uÔP´‰“|yù‹ADÔU¾øx*Ä¿ö5›úÑ´qÙ17eDâoXÌö3¹„‡ØRxq{3ñDwŒIK«¼¿ÒŠ2ÎUØOkáv“‰9šIÄßœÈÛÆ¯…Íìˆ!©â핺Dœ$XÐï*Ķ[%m.shTjTÅmQߊÙRc’sèKó¹P…ö•;ÐùIÄ컆mh¾6 ÖM; Ž%6&‘—0{cY¥Coù7 j¬¸R¬}é;)ukø~Ã’¿~›Aÿ ¦Gÿa<ß¡>VЉœ«WÉ·öÁV `>_Jò½òøÀúŒàùöõQãK¯ç±qây2Š çtåsA¯Jö]:†Íµ­ÏGóvDBëªê^Þ̶Ÿ®’mG *1Tl&gšYaçì€*3™kE`_ ÏV6fÏ-€ [Ú “Þaö(4¥É»F,`Ýá넇ÝÙWå炾ÔÏúžíÙ¡¼ñfíÀ‹72/±ðB yx˜9—£VÅ®,£%Õ¾éK­Ç£žuñu#­•ûúnܺƒ¥hu¨•»¾.£nHk?ýíëL*§@ÂÜ l;{•4Ûd œÛàt禷Î3/íVÎ\)g@m‡_ ·rk‡ò)Øù´ÂÓø¿¥\§î¾xðNCè¶Å_;‹½ ×ð<šD‘[$MëTpó@­ÇÏÿÎÒ E«C£(äjüUT ŸÁïV§Q㊻z'`àÚ¹Êû¥ lK€ö3öŸËÆ?ù8Ùž¤«ïeöýz–ë]5¼dOÐ0ô »ÓÅ}2s‡gkûv´ §M›6xV´UíH@ä"`*Ê"ùÄ~¶ÿ÷Ö/Ç‘+Ñ|<È—Ü q¤œaÞˆ,¼Õ|SEFL˜—sÅ1ˆÈ¦E,Ùy–ÜRwï!³ÉS´«§"ûdÕ÷WšµOeýlBD˜ ScŽ‘Ù)Œ„-‡0¶|“u”Ê·+ñ­ÙõÛòØ®¼Í(1&æcæf.T1÷JÉOŒaÿ5‚#|o.ãÑûÓÉOápl C´6Ófc>Y ³×Õèºsu?"¼Cce4 ´Ý NüÕŸNCí1‹>…«øhi:¡CÚãªóùzëWå»™css[¿ºwmkVKŽ«µ¿¥1l¾èÑåIG.Æàç]g9sú‡b“(ro_b{ËbÈ‚œA‡}гü}õGÌ\â͇CÃp¨}÷bÿD,˜'ô€Ú“VÞvws«obSRE·‹msÇ7›« ɹ=·þÖ‹Z<{Žf2€áRÕ›_Ëb÷á|‚¨.µ¯Øª¥*Ô%&`•&c·& ·^UtØYU--ÔN»äpàðQìNäÒ°ïÍ„´õ¦}_ýrœãÒ±l‰kE#¬h±Ö–ÿ¾*•RvÊû]Eý²ñ¦ƒOË~=Ë™”+¸„úÑÄÇÝæÄÇkIÒÒ³‘Å.ˆ¡3ÓõÐö<ÌÞeSøv¾7ÏL™ÄóMmJ¼_AÒZæ}_DÏ×£ðÑ¢ÑãÉ€ GhóÕ[ŒÝ±s}}©g4¡ªÓ…÷£ûã]b=‡‚ÆÎ¥ˆ²c®8Ò²«/ùËv‘”¥çàžëøDµÆY ×îe¥‡Æ¾ò~zw ÇzZ Ç/Y³ë°BÈ;ͰWÌlçSò=L–´óæ?-b®ÍfwcI\—Î…*´¯¬<bö“I.{¦"ªÄkû‰IB ™jÛ”sSWÜšº”¿ôªÚÉŠßÇo9þtÒ*lu¤_Ǿãéôö3bBƒöN±aI¾V’ï•kÏÊ·-‡wŽkUbØ\;M7޳|Êt6fùж]+‚»ã»‹ IDATâ¿ÅLù¹ô>,k¦ÙœÛ‘i’oHÖœ2ó„‚r÷16™0š@¥)ùI¨òãkÃÕx¨Tn-k-‹]!îöð_'0$ókbÎíiÀxí¿¦ªpóvÅÅËmÚ1N_»s 'ÿâa’ ]ð­gùµì2´õ ñ·!%f=»Ó\iàps =þísà~:§Á»•ç= Zêù¹b¼Küí‡É<}˜T€GsýRôø·oÀõ[ù9É–fu±mØŠÆE'Ùºõ…Þð±5qh Ë~LÄ1¼ý_û€Íah£D¶l9WfͬJ]@üî ¬?Vöù©* Ö¢VìxaŸu†s…zœœœprr¢Žñ4ß/ùž“>DYÁ)(ßœCÄìaoVSº…ÕEŽîïnæûiÝ$‚P«Ó¬[µ†£š0 °C±`»»Ûÿí¬Z›«Æ‚˜¹_y Ä쿎¶å0¦~2“™3oþ|2±?ÞJ±1 •?¾Í”OÒæÕ1Ù¡†NVF2}Ëœe±d”*îL(h­µØø÷gô@=¿|÷ ¿À|¾šs?ÇÚÜqU?À82qãèwüx)œ÷?™ÌÈAOîƒ>ï^ŸbIΘ¸qd%[ ž`”\ÕþX8O.çÿV0¤ã@ª–†~ÎwÝ]4w|5ÔõvEI=Jâí¼1pyK4£¦o&õþw5»B”T;¯lWI6»çü‹FCŸ¢¹m*{V,â„MGþ¤ÇVÝ‹.ŽãY2sº¡~Ái6~¹Lÿ—ˆh ¥üú*¨7.]àò5ê;–w;ÈšF­£ì>A¦c7‚êÝF5N-ZQï«U¤Ò˜^Mlï¡hPãÒ¶ÁËgóù¬ú¼Ü;‡ô}üßÒ8 ¸``¦_€có¶Ô[¸‚ÃÚpzÔ·B±ö!Ü-%±àóŠ?zEEŽñ,[¾ÝÈeÕPoQ—üsûØ•¢Â­‹c™ÀÐxDþ#³gŒ¥ w/:ø»£'‹”ã?³jýuwÇË ´>Ó½Á6þóÉ"ìGâe8Ç/«¿f‹©Ýõ**:Ã+NADúÌç‹%±n1Šàâ‡Eëîqw¨Ðšë§7]Â4|¸ã u"âgcÙv%âä¾ÛYÅ6W‘Ù˜¹Ï‡[ç%Ä›eG»Þ h|××™L<´’OccHÈkÆ­¥Œ†ÌóIJF‡‘üÌKœ‰ÝÈÊíhÒï#::×TU¥Á­uGÜV­dÉfO-4a̿‘–°!߃Q¡ÂÖÕ]ö² àª6Ÿ¯•3w¬³+ݺòãj…öjb¸Ò+ [¬râØ¹ýÖ¾6dßÄò5©mâ9u1w×* 5ä6²Ó21:xâô'8S= ÌÎgA!‡}ó>cåK½ ²Iaçò¯ˆsêÆÔf¶Ü}%¦òã«Æ!ä):h£™?{5ô ÃéúAV,=„©× 8k,9[ª&bWˆ’ú)L±jÆÐÜÙ³l:+®€k`$oODˆ½‚B ƒ§Áná2–N[O¦Æß¶C™úRwÜ+Zúªv¢EÇæ¬_Íè´q,,ó9½_+<9ÁÕ€ÖxÞõ]­[(-V‘jRbÝ[U¨œ;3jZ_Î_żI«ÑxÓcø®¾ùî6æû¥©B¨ó ’Âhl¨œ vs:Ú¶pD…‚}È˼ûÜ–¬ýŒ‰ßPë= íù.Ãs/ûh7µ3GÍ¤ÎÆ¬Ü¼‚/ÖdQ¨¶Ã¥a3ºŒŒæéGܼª¡õ¢ÏäÉX-úŠUm#Ý §Që>Œö8*.:G‚"}QN%Ü­%w–ñÝãþîìØ‚~ÚàÓ9›'iéSü¸53Û©óËÄÉýµ³ªm®KbæÞå¿-–¬ºyÜ¿ÔsBžÇfúbòhxóׯ¸¥Lw묩çÈ£¯¾NÿG›ÿ"e5ÒzõfôÙÌûvÓ®æc8ß(Œ§G¿B—zÅ¥V£º«ª0—¯•3s¬ ’+ߺÒãª@UbøÊ[jÓb0oõü”EËf°“ºx·zœW¢CÙöébV¬>EÛát÷nærnoŠJnËÿAÌÍù€Æõ1Þ~VaÃ7Ñ|÷»–O2fL?l”›ß1¸ÅÜñÕ‡ñZô?øfÞ æŽÿ9Öî=6Šz7B[Îüz?ÿTÄ®wQL&“Ù{û÷ï§M›6D{ª¤ þKޘ«‹Çnѳ„(Ôõ£¹¾%Ñÿz±Ô<ñ×THÒò1,ó™Äøvv%^É;ñ/Þ˜­gÌçCð‘X©FR|Q±}Y8¹-væ75-çS†-¼ýœm!ÄMr¿Cü¥³/r"v#KWŸÃ­kÊùA Á-b(ýüË~©Se¥G“w•ßsä?’®V¦<ÒRsÐè­åDõ00d“zâ— 5è4r/Bˆ»É ñ—f¸¼ƒ…³~ÂòçXÞßš®ÿ¤¾Q<;~×î:1çÇ-`hÔ@fÎ¥èâJÞŒŠbÜî,îåÜmL߯èçG²&¥è¾{qÏ ×9õÓ|&¼9„磢xvÀ+¼3íkv$fßSŸÄƒbâúoKxPý&ì,ƒ5¡ ák†GE5l§óK½hÊ æƒ(¢¢îþÈ룣ùr[Ù5HÒ~Ä¡ƒ¿)™Só_§ßkÿõ ¹wb¼à<ë&!ê…ÿÇo¹5ÙVËÝïüópËçÔœ¡D ü€å§rÿ‚ýÊ_;Äý+Û¥.±öíçywãÊÖÿVx†û¢É‰çÄÕ;Eo^â>â `JØËÙœÛ;"#î4™JcZ{Y£²oJמOòH+”?¤#ZçÖNaÂâ#ÔùÛK|0u:ŽìK˜q'³Ç}ÂÖËŧ¥§Ò8ùƒ™®sdÕO\n9‚ï´Ã¡F¬€ó;~áw€kûÙžXºÚ¾Iå?˜‰ÑÑDGOçÃÑ/ñw¯4¶Ìû€I«“(‹?†1}s>ÛŠMßh&?Õ˜à|΄),Ÿµš¤Â›SpaÿM àÝ/Þ%Ħ[™RñYëçŸjÍ'¯}·¯±ùÇ8òÌo ÄM’Gâ‘b»Jl½[шTŽ$Þ(þd[@òÁ“Ö¡~Ñiö](.L¹œ?œ ÂñÑ+¨ƒé=xÝëj°ý÷!? ëqú€‘QhJóÖ‘ x =õGYûóE kºU¦"r T84ñÃÓ±†OçÙ¹':ûÓQŸÉþ‰åÏê:žøúùáç×”­»ÐûµiÌè߈ĕ_²;Íø‡7û–¼Ä]œ²î@ŸˆÆØªµ#-ž|Ž0ÝE’2ož¾ŒùYZ»RÏN]cí¬ª‡~þ¹_*\Üm)ÊÊ£æ¢K<ìþòy$¦PBÎA¦¼ºßݸ²f {sq zŠ7^ áì¿ç±æÀnØúÒãµ÷y±M] ñ_òÖG9<ÿ¼=;×îàè%#®ôm ܵ¥bõ‚el9ržL >mžfØKÝðµSŠßo9ÍG÷!í›/ù¥N"S—°6øêuúÅ~À¿'¶Âö®&ªq5±é·dò;;b]t•#‡3ñˆìÅßþ7M/QÐma*G“ŠplÓuq߆-Àcò õ8Ê”W—ÒôíÞd¯_ÃŽc):·¤çð‘ô qD…‰ÜÄ-|¹p {Îd`åL·Þ%NöËú2ëÞ{“õ-¢ùâ%_¬Œilû*óÏ…1zÑZÛ+äžÉ+S¯0hÞ$šŸX΂ÿlçÄ•\ÔŽÞt|v/?æ…uéŠÍTH^ ”ºy¦k“ïŒ#\çÌ­ÒÔ“Àæ%‹Y»7Ž«yvx†ucÀËÏÑÊESvÌÒ7{>ÿֽñmÑ+œýúMFè¬OûѰ° û«ûsß¡äÇRv.+§Ÿî$-ÁĤ~Ì™ö(.*€\ŽÍ~©©˜3¥ù»ÊÙ®«† £F²¢TœØ˜í·å±­®°Í¥Ž1-¼Ê‚ ámúÁ¢ñuøbxÙ1њͅª´¯|ùç¶³']Oøc<ÂZvïßNâàÌ›^ö!è»Yl;šI—§ùРXY£¾q‘ Y|ЧrìÈ{3;Vº]eóLóT•r¦î[Ì}?åüV–Ì_Å®¸4òk\»ÒÄ@q¾ÂêwJÅç{ 3-ž 0u7Kç.gûÉtt^myºŸ;?ÝÍãs¦áXøæ“0Ë”ÁŽ‰Ã™_á\Ü×KÄœ›¶‚8mF†%óX1É#É£?«Úwe» ™uKOã?øC>™Ô÷Sß1aÄGœðÂäO§2Ø7™K6r¡ø2ª1}s—žÇ7j“ǼHhîffýsG²Mwš¥c§±6³/Œ‰fêÈž¸X̸èMÜ^õ`Heëܤøôd@¯öô›ù/xjðüߎ/Qh u#8ÀŽìø“ü^ÆÌSÄ^q&,ÄpgÒ#͆kqœÌ°Â/Ì«òúY”ÂO‹¶¡ýû[D6™¼Xóù·Äåƒ!m'3Ç-$Ö:‚á'1²—;‡~Kâ­KÇ•õ g‚ZÕãÚÑ㤀¼óüz(Là×” K¿!¯A;š^ÿ³·£ê4ŒqS'2"Ò†}‹f²îB9רuMˆlïDêÊwysÒ"~Øuœ‹× 1¡¡nÓZzÙß ¦¢6Lý'K“›òÜ{3˜1a¡760cÂrâòLeÇüñ ZEúc<±¸œâ× .ò¿½é4èÚ ¥ŠûëѨÌxžÿ¾‚~ªhò·pìc8z­ø£Lî¶Ìÿ[ú‹lwÉ•gJlj%ý®BlWÜæRÇFåÌ£Óçò²·†úÏÍbùôœ”rÆÄ’\¨bϹí{ɰ ¥³·¾š£ËÜOLKIJSlàjâò™«X´Åƒgí÷ÝÝO0oä¾:˜Æß3((½8Ó`Àx÷G ƶÒyªª9Ó£V…‰¬œ±€½¶]xeüt¦~0ˆÐìMÌž³‡kêeã³tG+™L71ÿŸŸ²Kו“§ðV{¶þ ÅåaÌ'Àd”µ¶Q ªl.¦’˜»5¨¥âTeé<’GK‰{R»®l ¦iÿ—èÖÌ…º<Ñ|Go¼À˽‚¨«€KÏ þóq ™Eà˜Ð6üôk[hÚG,fݱøX­ãç ?O~‘.®jÀÆu.srìv¤<ÊsÎ@Qêˆ÷û\#´†|• •ª¼kk:¶öF½ë0‰7žÁáì^Î[2ÐÝ÷°–دÛËé룿p˜dÅ‹M*XÔi0áÐý5úwð@ 8?Ó5.’Qhàê/?ð›¦#cFõ%Ü^üð4%ðúü,rNVÞ¯§Â‚Ðÿx€ø¬'qN?L’M0]Npòx '¤ã‚SÖJÒ”†<ýX'‚Uà×'¯Ó¨õå|Sì ~õc¦ú¯ç§ûYýÙ&–¶ÁtzüYúþ=€:j(HÚÄI¾¼üÅ "êª_|<â_ûšM ýhڸ옛2"ñ7,fû™\ÂCl)¼¸‹½x¢ƒ;Ƥ¥UÞ_iEç*ì§Î5‚p»ÉÄÍ$âoNäÆmã×Âæ vÄTñvŠJ]"N ,èwbÛ­’6—94*5ªâ¶¨oÅl©1É9ô¥ù\¨BûÊèü$bö]Ã64_ë¦ PÇ“ÈK˜½ñªÒ¡·‚ü5V)Ö¾ôǺ5|¿áÉ_¿Í ÿÓ£ÿ0žïP+ÅDÎÕ«ä[û`[|™Ç\>>Måó”¿sÕs†üx>:˜·#zZW øP÷òf¶ýt•l8–ŠÏ2*œLdúžÝmõVZëlÌÈ´#üã»››>Œù„V…³ªÌd®}-<óÕ<Ç Šçb1¹ò˜ƒ2qš{ØòyLòèaÈ£o-µoÊQëñ¨g]|ÝHAk¥Å¾¾vÅq®hu¨•»¾â¢nHk?ýíëL*§@ÂÜ l;{•4Ûd œÛàtçæ‡Î3/íVÎ\)g@m‡_ ·*Ä‚O+<ßñ[Êuêî‹ßá4Ô®a[üµ³Ø›p Ï£I¹EÒ´N7Ôzüüï,½P´:4*€B®Æ_EÕðünu5Ž¡¸«w®«¼_ºÀ¶h?cÿ¹lü““ÝèIºú^f߯g¹ÞUÃÁKö ó@ß°;]Ü'3wøp¶¶oG«ÐpÚ´iƒgEkQÕŽD r¦¢,’Oìgû`ýâq¹Íǃ|ɽGZÁæÀÂ[Í7QPdÄ”Q€©qÙ1WƒˆlZÄ’gÉ u÷2›1‘mQ¿-íÊÛlcb>fnæBs¯”üÄö_³!8Â÷æ2½?üÇÆ0$€@k3m6æ“U:{]®;W×ñ#bÀ;4VF³@ÛàÄXýé4Ô³èS¸Š–¦:¤=®j°hl¨džJ#3çb\׈.O:r1î?ï:Ë™ÓÇ8›D‘{{ ;YÉüsúFÎxßž´Ôká‡ÝÊKÀÙO `ô,_ý3—xóáÐ0jß}ÝWñ\¬µ1W*N-ŸÇ$Ž<÷ªöÛ@Õδ*Ô%&M•&c· & ·^UtØYUíÔ®v $Ø%‡‡bw"—†}|o¦­7í›øê—㿎}`K\+aE‹µ¶ü÷U©”²CPÞï*ê—7|ŠXöëYΤ\Á%Ô&>þè6 >^K’&žt(vA ¹˜®‡ö°÷àaö.›Â·ó½yfÊ$žojSâý ’Ö2ïû"z¾…Ï H=B›¯ÞbìŽmœëëK=£ U.¼Ýïë94vö(E”sÅ‘–]}É_¶‹¤,=÷\Ç'ª5Îj¸v/û+=4ö•÷Ó»K8ÖÓb8~Éš]‡BÞi†½bf;Ÿ’ïa²¤7ÿism6»Kâºt.T¡}e味ŸLrÙ3uQ%^ÛOLâÍTÛ¦œ œº¢àÖÔ¥ü¥WÕÎHVü>~Ëñ§CPaÛ¨#ýz üã=öO§·Ÿll´–ç#PÙ•ÜwÕ·ù˨d.¶(æJÅéýÏc’Gµ5DÕ<üŸí Éüš˜s;×Nñkª 7oW\¼<Цãôµ;÷ò/&©Ðßz÷q?D[ŸRbÖ³;Í•V7RÑãß®9~à§s¼[yÞCÑ ¥žŸ+Æ ±Äß~è°‘ÌÓ‡I5¨q4×/Eû\?°•Ÿ“liXÛ†­h\t’­[QèÝ[‡Ö°ìÇDÃ{Ðÿµøhц6JdË–seÖ̪ÔÄïÞÀúceŸ/ªRj-jEÁ®öYg8W¨ÇÉÉ '''êOóý’ï9YáC”œ‚"ñÍ9DÌÞöf5¥[X]TÜëþîf¾ŸÖM"µ:ͺUk8ª ã±; ¶»»ý÷ßΪµ¹j,ˆ™û•—@Ìþëh[cê'3™9óæÏ'ûã­d“Pù#×Lù$m^ÍS‘-jhî7’yè[æ,‹%£TAfBAk­ÅÆ¿?£êùå»_øÝÒ|„Jæ)«;&nýŽ/…óþ'“9èI"Â}Ðç=ˆ'mhqñuEI9LÒ­u»ñû©³Ü0ÂÙO&nYÉ–‚'%Wµ+QÑ\|/1W•c.yôp䑸WµóÊv•d³{οh4ô)šÛ¦²gÅ"NØtäŸAzlÕ½èâ8ž%3—¡{áêœfã—Èô‰ˆZÊ ¯‚J1pãÒ._s ¾cy·´­iÔª1Êîd:v#¨Þ­aTãÔ¢õ¾ZE*éÕÄöŠ5.m{¼|6ŸÏªÏ˽CqHßÇÿ-À6fú86oK½…+8¬ §G}+kÂÝÒY >¯ø£WTäϲåÛ\V åñuÉ?·])*ܺ8– G$Qá?2{ÆX z÷¢ƒ¿;z²H9þ3«Ö_'ppw¼¬@ëó8Ýlã?Ÿ,Â~p$^†sü²úk¶˜úÑ]¯¢¢JQq "Òg>_,Ùˆu‹Q?,Zwû»C…Ö\?m¼é¦áÃg¨9?˶+'÷ÝÎ*¶¹ŠÌÆÌ}>Ü:/!†Ø,;ÚõîL@㻾Fdrà© •|CB^3š/Ü6dž'î”5:Œäg^âLìFVn¿@“~Ñѹ¦*! n­;â¶j%K6{òh¡ cþŽü°„ þ¼ìˆ ¶®®è²¯eWµc›•ÍSÖºªÆŽ‚ÆÖ«œ8vn?€µ¯ Ç7±|M*F›xN]ÌÆ½a©yÌâOý*œZ=Eë¥3gö÷¼Ú;»ËÿãÛ i 4Dy(ó ÀHvZ&FOœþg½êTÑ\l6æ\KïÉÌ17esjÃJöÒŽgŸÀVòè!È#q¯úiG±jÆÐÜÙ³l:+®€k`$oODˆ½‚B ƒ§Áná2–N[O¦Æß¶C™úRwÜ+Zúªv¢EÇæ¬_Íè´q,,ó9½_+<9ÁÕ€ÖxÞõÍ/­[(-V‘jRbíYU¨œ;3jZ_Î_żI«ÑxÓcø®¾ùî6æû¥©B¨ó ’Âhl¨œ vs:Ú¶pD…‚}È˼ûÜ–¬ýŒ‰ßPë= íù.Ãs/ûˆµ3GÍ¤ÎÆ¬Ü¼‚/ÖdQ¨¶Ã¥a3ºŒŒæÿ³wçqQUýÇ?w†aG@A”T@p)MCéÉ4[LÊ%5MKËÊž¬\rÉ•V¿r×ìÑÌç—Kfê“©¡>.¸eîn¸…ˆÈ60sˆ)ë èÔ÷ýzñ‡3sï=çÌùžó{Ͻ>÷hý[ëàt¾t›0ëy_³üãM\38Ñ E7F 쌗e·âBXLÊñÂ;6-|ìÔ=ìïΎͨ§þí±ÛrŒGbü±5g;m^‰~roå¬h™+Æœ>Sy9$nÚCfívt.v¿¾âLÄSQØMÙK|R.…ÞzÙxrGßþ-uüBy|Ðôz¼¡é)-HçÛ•áof1뻩L¾šŒälƒHžþíë6”V‹æ®ë;¦ÚVOùãT¼Û5éÇÛ]>cÞâ©l¥6~Í;óZ\36}6Ÿ¥+ŽÓêÝ&Eûç›æ·âÜ’7'½Á×3þÍ磗Q+(šoÇ¢ÿt?v:M Œ§B* h䊹)eŒÅ&ûÜà;*ÿ;7^%eóÖàÉSBp8ªq$*G5î]»ÌùØ—wj¾újÏ êÞ¬ª.‰¨Ù Ô‹? S_ôz:¯ªË"ª½šüí0uÂΛ%ÞÉ9ò…:`ð×j¢™}¥¦S׎ª »N¨é·_1ª7›®ö¼@=eV«c<¨WÿSí5&A-ùŠš@âHÔd²rMü­³ÎstÏ:­8CÝíñ©š;óDµcEÝèô.yS§ÆÚ «Ü«ü‘ý×ü‘ÕœS¬˜6™?íçLZW7óͼt-5Õ6žÔ\Ò.ecådû¸QIÔÉ8•Vã—‘q/ —·0wúÏ#zòæS>òQQHÁ®~(¥¼cÝ †N ÇñÉO=8e£?·‰ÿ$‡ðÞWïaW……-O±þYíÇŸêO÷èþµµ !¯ÁGí®óËO'É5½¸ß$ŽªLµoë ²ªêÔ, ö~ÍiÀ|&ßäô\ØwŒüzÔ»r‚]çòˆ ±5‡³R¡~ü4Úpºö ¯ê T^^k×$ã;¡± ÐDã° ɪ_ÏÝÓ·ðuñ@©äè587 ÄÛ¥Š&ýY¶î¼F­6½hzð;voI¦_H6Å>¦­åM@` ·rÕ š4oM3Ïyÿÿ°½ýx:¸UÍy€Üäm·m͸è†X/´.4yæE"ü—” ܵó2É·õ Žƒ¶JÊX—>þÔ ÷µ­5v¸{ÚSp.ãýÙ£¸GÎ_­­«W²½‰ƒ0¤#WV®$!9×°gysP§ÿ5‹•{ÏqÓ>€N¯ÀË-kcH\ÀÛgÓ³§#[WmáÐE#¡Ñôz½­=o¥}×ö³bÎb6º„9ÿÞÌÑ+9h]ühóÂ^}ÂÛ⛚On » cÓˆgÞM”·S5;‰_ÎgUÂI®æ:àÙ‘Þ¯¾Hsw«’mîÚ‡îY³ù—Í»ÌÕ '@ÏéoÞbøÞöLÿ¬>ùØ_í·™ùAEO8êIݺ¸”zz’2wãRz0còã¸kr8üåLºÔ›Û’·­”í:X±vØP–ë'v&ëm~ßÖ–Yæbß1 #1' Hz‡{‡0oL-¾\²Mt&c¡"å+]Þ™Íì¼æDÔÑ<Ê*¶ïÞLr¿BŠgÛÅ)6ø>Þ°ï§³éPí£]«äGƒbm‹öæyÎeð/|MãÒ†÷§µ)w»òƽãT…b¦öÛÌü åìFÎ^ζ“iä)¶x„v ×><êv…ïëŸï+L3{üüKÛY4s ›]ÃÆ·ÏõdëgÛéÀÚŒ9¨üïâQÓÙRn;uÇãb}®®®âíTJ€KIÕø8*Cu(CQú ¬^t‚à~ñéøîxÿž±C>æhp&|6‰~X·pç /é¯ma梳ÄcÂÈ—i–ó Ó?œÇÁ,rO°hÔdVe4ᥑqLÚ…ºGç3:n=®z0\bãÌ¥¤úw¡÷ÓÐcÚç¼äm…o¿¯ønLT‘D]]ÂCÈJ<Æ`Ì8Ξ+nDFåFھäÀpý$ÇÒ­ Œôº´z¤òó¼Mèþñ6qŸOà%ß$V~ñ'óÀ¶•i£ç²Ç6šÁãÆ3ôiOöÏýŽäÂ:—[/Ük^‡ë‡ŽfrÏòÛ9 ?‰ßRõ@>?Ený‡ ºñ#S¿ÜŒ¦í@FOÇ;vÍ›ÆêÛ{7›FÄ<âÊ¥eïñÖøyü¸íçoä£bEí šú:ÞêL©¬ô!‹.ñâûS™:¶?Ín®eêØ%œÌUK¶yç0šÇc<º™“Ù…ïëÏóß„kÔïÐ/¥‚ûëÔ D{çŸý¡ŒzjhôXŽÉñº^øS&ç›öåÜ1§óelwуç‹÷sê]¾]v™‹}77Ÿ2“Wý¬¨÷ât–L‰ÆU)¥M̉… Æ^IyœÙœ@ºC3Úù¹ж16»‰/c)Iqн!*—O]EoÖ÷Ÿmà³<éy”YCGòõ¾4nþ‘޾ø‚AƒãÝ?ÌhÛrÇ©ŠÆL§Xç'³lêìÛóÚ˜)LÑ—fYëùrÆN®kë—ìŸÅ+ZÎø£ÞÜÏì?c›M†L˜ÈÛÙüÅ·$~)5.ž \»ÏcŒÆÜø4'îÊù.PÕhùu«Š‰v¢œ>w»p•m'8’8²lU±êuf-A½^¡ãCÎ(Ôæ©ÆK9tó%^}:ŒÚ ¸w ãߟ¤’Q^€Š ‘ƒÿIVµP€ H2ŸÕ‡ûào½š_Óé7áeÚ{h@ֺ̱QkÙ’ú8/ºz´Ñ0êÅÂ¥†<¦´sk6ø´ðC»íÉ7ŸÇùtgmCéãigdSW'pâFgœÎà‚âK§Fe,ê4¨8?ù:½Z{¡ÜžoÍʱçIÏ7puÇünÕ†‘úå¨x«I¼1;€ìcå×ëÙÈ0œ~ÚKbæ3¸];@Š]8íÜrìH+޼†[d®™ËHS|x„»i °>®¾'Ð:•òLq$|Ð'L ^ÃÏ[v³âóõ,ì½ÂiÛùºÿ#„ZZЧ¬ç§”^ýª/ѵ5@þÞ ‰¯Ãú¤5,Ùæjz Á†ùl>•CT„=ùç·‘Þ€§Z{bLYTáýW~¦ÌzÚxDå0øCD?æJÎÉMü–ߘÁá.RÊÞNÑh‹ô}’õ®@ß®[N™K|5-šÂ²ho÷Ùbm’½éX¨@ùJmè¼âw]ǾY4v ¶AíÑîaO|2¯”²”¤ NÖwS_e7Ä(¶t‡×ê•ü°ö¾y‡¾ÿ §S¯ôl]kE%ûêUòlý±/<½o*Ÿ£üq*Ø­â1CÞM¼ïÇ;ÑhV[ øSûò/lúù*Yp)Ö?K(süQÉØÿÛõ­öv7Z8)Ú¡iùç÷·6­yñ¤àvǘœæÅ§©¾ñ¢[yß`£ÁÁÍMÆ®€£Egl—rÚÉÊx¡ü>GåÛÉœ¶’8’8ª|U>*î—ê—lkðªc[xÞHAg­Ã±^] û¹¢³A«Üu«ˆÖ‡NžgÒ¸†éi`Ó髤Ù_@ïÖ’×;½m¼#ðÕmäÔ•|p´6©[µÆ þÍñ6~Ïï©7¨½+ãc6>­ÖM'!é:Þ‡R(¨CP­2.h ¾³ôBÑÙ`¥ÈçjâU4>Ïx»Òhq i†§v+`àú™òëeÚŠÝçì>“Eð…#d5x†—ÙõÛint°bßEGÂzáäó$í='0sð`6>ò0Í›EѲeK¼ËZ‹ªu!$¦7!1½Q 2¹pt7›ÿó#kææà•8>é@铤éO1kHoæÞ.¾Z€¾Àˆš®GmX²Í—0b‚ X¸õ49!\Ú¾“ŒFÏòp YÇ*¾¿âlýË«g#¢#혘Œ¶‘$mرé[4©¥”¿]‘»OT²Ìª·ù}»ü2›¡H›˜î3·b¡‚±WL^r<»¯ÛpkS0mì‰'©¡¶&ÊlÌ#S6Ž6Uºî\[+èÞïÒPÎÝ“„'ÿÈŠÏ&£õšN·üå|¼èÍú?‚‡Ìj[gʧÒÈÈ®D·i@ûg\8r/¿n;Í©‡Ù¿'…ÏG̬d9ãω‹½Úá÷çø££N“@–]jf<Ýï1¦ÜºÜu“¼¹qWúwq«^Ža/ð3m¡ ˆÄÙ‚×£Ën'-hÍèsi§"$Ž$Ž,GU¯ú%Û@ÅfZ Ú" ª Q@5–qÙMQРb¸ý®bƒƒuŦv­k(áîÙì=p‡£9øt ¸Õ1íýx¤‘¯wáȹk8†6Å£¬VtØêJ?®F£”l‚Ò^+«^v~´ö/`ño§9•z÷f4òÆæ—½$&êH± ¥K‡0L›O‡ý;IØw€„Åùn¶ÏOOÏ »"ÇÓ§¬bÖty#P¬œð‹¡wØ£´üúmFmÙÄ™îÔ1ªhjµçƒ¸^øYÏ¡`åàˆR@É6W\hÚ!€¼ÅÛHÉtbßÎøÇ¶ÀM ×+³¿âMãX~=ýÚGa;9ž#mÙv@!â݇pTLlç_ôª9å¼õO³˜*³Éݘӯ‹ÇBÊWR.Iñ»É ‡“ú[ä½ÝÄ'÷'ÔD¶­fŸãø…ºAî¥/½²8#™‰»ø=;˜ÖaN€ûmèÑ5åŸï³ëÈ5ºQ±ÂÎNg~<åSÆJôqõæ–LœÂºLZ=Üœð}y4p>5³ªeŽ?*ª¡äÈ©  Üž|k`<Ýï1¦Üºx›*Kñ9¨ì¹ànꃸC²œv2«ÏU¤ÌÇ$Ž$ŽÊ*Kå⨪T£¼¿’ ø-9ûÏP4^?Îo—4ÔõóÀÝ× ]ÚaN\¿ós/ïüRòÝ ¨sÏÍÐÕ#"ØŽÔø5lOó yˆó­†Tœ~¸>Ù{äç3Vø5÷®DÒ £N Æs{Hüó¡ÃF2Nà’@‹‹©z)N?RŸ{7òkŠ=…ÖÆÞ§9 ޱqãaòýZãoo }ÿJÿ”ŒKT'z½>‚çÍ`@ƒd6l8SbͬF«'qûZÖ.ùÌKÐêÐ* õ}qÌ<Å™|'\]]quu¥–ñ?,üce>DYÁ5,†€ìýÄ'Ä“DÇÈÚh¨ìþîfºž¶¢if}‚ÕËWrÈ*’'BPÌØîîòß{9+VæŠ1£ÏÜ«Ü$âwß@×t “>Æ´i·þ>× ?%“=ñIå?ºLÍ#å—TCˆiâ\Eg¶dìÿŽ‹÷^,±QQÐÙê° îÅð>Nìø~˜PÎ8åŽK…ûŽÊÍCßóÓÅ(>øtCû>Ct”?N¹÷ã‰:Üïßcn]îGÜ©Ü<¸Œ ú§fá³Ú·”ÕN•ésùÎ%Ž$Ž,GU¯zžÙ®,¶Ïø_ x–Æö—عtGíÚða˜öÚ§iï2†…ÓcóÒ£ÔÓŸ`Ý‚µd¿Bt}¥?ÐWA£¸yñ—¯;SÏ¥´KÚ¶4hÞeûQ2\:Vçv3jqmÒœ:_/ç yº‘}%’-î­ž&|É—|1½¯vm†óµ]üߢ“¨ €]ˆ‰z.[QgîRè¢èTÏÅÖŸ¨º×X¸ü_ ÆIÑm<͆ïÖqY3€ÎMj“wfÛR5ÔmïR¢cXyÅõ_N…¾ëÓ´öĉLRüÊò57í÷$¾Ö óïÌ“õ7ñïOçáØ/_Ãv¬ø† jžtÒPV¦¨¸†ã?›¯®Ã¶É0 mSÉýÝ¡Agªžv~´´â£-§¨Ó‡@;ó¶+ÒO,s™ì3÷xInR<{2x¸k;BÞu‘ê̳aËølOVèöwgÇfÔÓÿváØm9Æ#1þØš³6¯D?¹·rV´ÌcNŸ©¼7í!³v;:»__q&â©(ì¦ì%>)—‡Bo½l<¹ˆ‰£oÈ–:~¡<>è z=Þ°JïeÑùveø›YÌún*“¯æ#9Û ’熿Fû:… ¥Õ¢¹ëúŽ©¶ÕSþ8ïãvMúñv—Ϙ·x*[©_óμ׌MŸÍgéŠã´z·IÑþù¦ùm 8·äÍIoðõŒóùèeÔ Š¦ÇÛ±è?ÝNSãévÅî×c¢.ú w>y?âN̓»ÚSF;™ìsƒKì¨üv2^%eóÖàÉSBp8’8²dU5Õ »ví2çc\Þ©ùê«='¨{³ªº$¢f+P/þ4L}qÐ7ê鼪.‹¨ôjò·ÃÔ ;o–x'çÈê€Á_«‰fö•š6N\;ª&ì:¡¦Ü~ŨÞümºÚðõ”Yu–xº Ô‹«ÿ©ö“ –ì‰/G¢&«ùk¶…¸ƬóݳŽE+ÎP·C{|ªæÎ«?±ï¬â¢¡jKbž<ŽÏìOlß/8œ{çUõÆÆwå…1[¸~×Äœwrbû0ý@ç—ñVl,£·gR™¹ÛxmÃ{eejÁ=×¢Ò 78þólƾ՟ž±±¼Ðû5Þü [’³*U'q¿¨Üø}!ô¥ÇØ­Eú`UÐ'}ÃàØXbÎáD^±7ÕtâGÄ{÷_ÞÇ‚MIdUyG2pmß·ŒЗ1ë/p|öôxýX“”s§ëϲzBb_ú~Ϲ—cåq|ÆbûŒ`Éñ‰!Q-Ý=÷Üë<ö§›;Óóu¾MÉ¿_Å¢Z“3ÛÅ.²êž¼·î %ók¼£°ÊNäèÕ;Ionò.  &%p:ûÏ‘~òJCZøÚ¢q ¢C—gx´¾5Ê©Èý¦ç̪‰ŒZ½ÂˆISøhhw"[ùrô§l¼\#~-Ý?åö“L½ÁÁå?s¹é¦¾û0ÎUÚÁôœÝ²ƒ?®ïfsrñlûMp?ÆÅÅ7…†¿Â?|ÓØ0kãW¤Pú†ñÚ6f|¾»îqLx¶!áÿü‚±­SY2}·óý¹Mü'9„÷¾z»{9š !¯ÁGí®óËO'É5½UªæÏcBT I¶+DÁÞ¯9 ¸ÄÁä›…¿ìõ\ØwŒüzÔ+8Á®s…©‚šÃÙ©P? 'K8]ûõåɆ6UXþ{—ÄÚ5ÉxÄŽ`hl[ÂC‚hÜ"†ÞŒ¤‹Ó!Výz9GQEÔrôœâíRÅ“ þ,[w^£V›^´qÊ`÷–äR“gm-o ¢I‹öt}}2S{5 yÙ¶§x±oËMÞÆqÛÖt‹nˆ½кÐ䙉´9OJÆ­ŸUƼLòm=¨ã ½÷jìp÷´§ 3—ª«µæ©ñó˜UĪª PDö>&ZDÀŽ\Y¹’„ä\ÞåÍAœþ×,Vî=ÇMû:½þ/·¬!qoœMÏžŽl]µ…Cx„FÓëõ>´öÔPpm?+æ,fÃÁ³dX¹ãßò9¾Ò‘¥ðxKh<¼iß.`G­nÄ\ZȪTàë7è±gÿ×û»Š¨q !ÂCeýïÈkç‚mÁUÈÀ+æiûïÖï»H~HCtù—8”R€KËÆ¸k ë6p^¾b€×!&ZDÐ;]ÉZ³’-‡SÉwkJ—ÁCéá‚•œä ,˜»’§Ò±ö§c×"“q™õ²½Ìê÷ßbM“8¾z%kcG bö™H†ÏI G…œÓxmÒúÎOã£K˜óïͽ’ƒÖÅ6/ áÕ'|±-ž±©ùäJ±‹‡6xæÝÑDÙ¸q;õP³“øeá|V%œäj®Þ‘éýê‹4w·*Ùæ®}èž5›Ù¼ËÜQ­pRôœþæ-†ïmÏôÏzà“_ýÕ~›™DPô„£žÔ­‹K©§')s‡0.¥3&?Ž» ‡Ã_¾Á¤K½™1±-yÛJÙ®ƒk‡ ei±~bg²Þæ÷mm™e.öÝÓØ0bs’€¤wè±wóÆÔâ«Á%ÛDg2*R¾ÒåÙÌÎkND=Í£¬bûîÍ$÷ !ÄÔܬØàûx7¾ŸÎ¦C´v­’ е-Ú›ç9—iÀ¿ð5KÞŸÖ¦Üí þØÇ÷s±áànZ{Ö±/¯÷h‰»~Ÿ‰X¢:11÷Ü=Pæ¥9mzn¾û˜¹g7²pör¶L#O±Å#´½†ôáѺFŽÏ)oŒŽÁ­¼ Ê6å[W©q±ÜùOümU¿±^Õ‹NÜï#>ßÏãß3vÈÇ îÏ„Ï&Ñ/àë®ã\áiTãµ-Ì\t–€ØaLù2Ír~aú‡ó8˜¥Bî šÌªŒ&¼42ŽIC»P÷è|FÇ­çÏU†Klœ¹”Tÿ.ô~úzLûœ—¼­ðí÷߉*’h «KxˆY‰Çø£ŒÇÙsÅȈ@"¢ÜHÛw˜4®ŸäXº5‘^X—VÏ‚T~ž· Ý?Þ&îó ¼ä›ÄÊ/¾ãdÒ¶2mô\öØF3xÜx†>íÉþ¹ß‘|ûÔqyõ°æu¸~èi ÷,¿ò“ø-Uäsñ÷SäÖ˜ ?2õËÍhÚdô¤q ‰±c×¼i¬>WÊ9j›FÄ<âÊ¥eïñÖøyü¸íçoä£bEí šú:ÞêL©¬ô!‹.ñâûS™:¶?Ín®eêØ%œÌUK¶yç0šÇc<º™“Ù…ïëÏóß„kÔïÐ/¥‚ûëÔ D{çŸý¡ŒzjhôXŽÉñº^8äœbÓ¾\‚;Fât¾Œí.zð|ñ~bN½+зË.s±ïFãÆãSfòªŸõ^œÎ’)Ѹ*¥´‰9±PÁØ+)3›HwhF;?WÚ6Æ&c7ñe,%)N±÷!ÄCåò©«èÍÚâþ³ |–'=2kèH¾Þ—ÆÍ?ÒÑ_œj0`¼ë§€š}„¯GÅ±Þø(¯}4•ñ¯µ$kít>ýùâ­%FåÄ:  eͶ¨r&çž»˜£Ê›‹ì(™eSç`ßž×ÆLÄA¥ IDATaÒˆ¾4ËZÏ—3vr]µ)wŒ®mNS^ü•{ìÂí+2.š3ˆ¿¥jøSKKP¯Wèø3 µyªñRÝ|‰WŸ£¶î]Âø÷'©d€ bCäàÒ£U- È’‡Ìgõá>ø[¯æ×ô@úMx™öZ †µ.slÔZ¶¤>΋n@môŒz±:C ŠFƒFSÚ¹5|Zø¡Ýv€ä›Ïã|:³¶¡ôñ´Ç3²)Ž«8q£3NçpAñ¥S£2uTœŸ|^­½ÐnÏ·fåØó¤ç¸ºãG~·jÃÈa݉rT€@¼Õ$Þ˜ @ö±òëõldN?í%1óÜ® Å.œvîG9v$ ƒ¿Ç^Ã-2×Ìe¤)><÷D[ÂÝ4XWßhJÁGÂ}¤à5ü¼e7+>_ÏbÀÞ+œ¶_ û?B¨¥}Êz~J àÕ¯ú][àï­øú7¬OêAPÃ’m®¦Çl˜ÏæS9DEØ“~ é xªµ'Æ”EÞ_qégʬ§G4Qˆ?”Aôc®äœÜÄoùî‚!¥ìí¶H?Ñ'™Qï ôíºå”¹ÄW£Ñ¢),‹övŸ-Ö&Ùû˜Ž… ”¯Ô†ÎK!~×uì›E`§`ÔŽíöÄ'óJH&/´tú3è4®¡DzØtú*iöлµ$ÄõÎEoï|u9u%Ü­Mê–š;”NÁÁ¿9ÞÆïù=õµw%BÀ`|lÀƧÁºé$$]ÇûP ucªUÆOo­Áw–^(:¬4ù\M¼ŠÆçyoW-.!ÍðÔn \?S~½lB[¢ûœÝg²¾p„¬ÏÐ!à2»~;ÍVì»èHØ@/œ|ž¤½çfÌÆG¦y³(Z¶l‰wYkQµ.„Äô&$¦7jA&Žîfó~dÍüѼÇ'}È9w’4ý)f éÍÜÛÅW ÐQÓõ¨ K¶¹âFLP ·ž&'"„KÛw’ÑèY®£!ëXÅ÷Wœ­yõlDt¤“â“Ñ6’¤ û16}‹&µ”ò·+rW¤J–Yõ6¿o—_f3iÓ}æV,T0öŠÉKŽg÷u;£n-ãq ¦m Â=ñ$õ!ÔÖD™ydêÁÆÑ¦J×kkÝû]*Ù£{’ðäYñÙd´^Óé–¿œ]£YÿGðÐðÇÉ Ô} ?§Û¥ÖáÝe8²÷•ë Ža/ð3m¡ ˆÄ¹ú]o ¦æž¢Ê£ôi”37_£àîdÛ¦íŸqáüɽüºí4§Nfÿž <)Ýnž½42ðõŽ#9w ÇЦx”ÕŠ[]éÇÕh”’MPÚkeÕËÎÖþ,þí4§R¯àÞ,FþÁØü²—ÄD)V¡ti`ƒâÆ€ióé°' û°x"ßÍöãù‰ãédWäxú”UÌú¡€.oÄâoŠ•Þa1ô{”–_¿Í¨-›8Ó=€:FM­ö|× ¿"ë9¬Q (ÙæŠ M;·x)™NìÛyÿظiázeöW¼i˯§_û(l'Çsä¢-Û(D¼ûŽŠ‰íü‹C5§œ·þiSe6¹súuñX¨@ùJÊ%)~7ä°sR_b‹¼·›øäþ„šÈ¶Õìs¿¢P7Ƚô¥Wg$3q¿gÓ:Ì Ð`ß  =º† üó}v¹F×@#*VØÙéþl*Õ¨‚FSöš¼rbýnªÜ!)ªXEæžòƨn({n.:3«7°dâÖeúÓêáæ„wèË£ó™øëíOØ–9F›¥œø3}ì?‹n“ó€™E=5ÿŠá¿%gÿ™.¯ç·Kêúyàîë….í0'®ß9 ™wþ)ùîÔ1ÿ\v ºzDÛ‘¿†íi4q¾ÕŠÁ×'{ïü|Æ ¿æÞ•HtÔ ôÀxn‰®m3’qâ— Z\LÕKq"ø‘úÜØ»‘_Sìy(´6ö>ÍiXpŒ“ï×{éûW²ø§d\¢:Ñëõ|!ž„Ì :FÖFCe÷w7Óõ´mM3ë¬^¾’CV‘<â€bÆvw—ÿÞËY±2WŒ}æ^å&¿ûº¦™ôé4¦M»õ÷é¸^ø)™ì‰O*ÿÑvj)¿¬à BLç*š”ŒdìÿŽ‹÷^,ñUQÐÙê° îÅð>Nìø~¬¨íçréÉ~Ï.oˆcØ”_ c¶<*7.cƒþ)†ÉYmQ¥LÍ=w3cŒ*sn®}×Y>•›‡¾ç§‹Q|ðé†ö}†è(œr‹>§ô1ú^™wlóÝïy@ü•TÏ3Û’ÅöÿKƒÏÒØþ;—Îã¨]> sÂ^û4í]ưpÚbl^z”zú¬[°–ŒàWˆ®¯£ôú*h7/žãòugê¹”vÙÇ–Í¢l?J†KGÂêÜnF-®MšSçëå\¢!O7²¯Ä€ Å½ÕÓ„/ù’/¦×ãÕ®Íp¾¶‹ÿ[tu° 1Q/À¥q+êÌ]Ê]êY£ØúU÷ ÷€ÿkÁ8)²§ÙðÝ:.kйImòÎìb[ª†ºí]Jt +¯b£~âË©£Ðw}šÖÁž8‘Iê‘_Y¾æ¡ýžÄ×tþy²þ&þýé<ûÅàk8ÃŽß°AíÁ“NÊÊ×0bügóÕÂuØ6Fxáâm*¹¿;4èLÕÓÎö‘V|´åµbúhgÞvEúÉ=—³‚e® “}æn›ÏžLîÚŽ†wÝV¬:ólØ2>ÛORîCÜ^²hÈ8ËÉã¶Ø`$/ã"§ö¬cÙæs4êñ1mÊ}¼€%YQ·Eê._ÆÂ_¼y<_Řw…ƒ?.dmz0/‡» Aƒ½‡6YWÈ4€‡VÁ9âYZëâ˜ýå è‰ë},]´õé—pÓ^5qL#Yi½qý ŒÆ¢&3=÷ÜaÎUöÜ|g^T°²wÆ:û$[7ïÅ6ÀŽô#ëY²òF»DŽŸÏ³¡ÚRÇè{eƱ=*¶G“ó•øÛªñûbý^òdçâ),½¡1¼3¹/Ž ¡ô›<‡¹‹Y4y Vî´À¤WžÄ³¬¥¯ZWš´iÌšeq OÍÜ‘Pp lŽ7G¹Òï»îyÐÕmFSçå\²Ž(²>¶"4ní6YÏ‚ÙË™5~V^át<ç¹+nÝÎt½¬êDÐÌm)œ#ihh\ w‡36´jâ‚LjWyïÅ9,\õ9ã¾5 uò¦Y—÷ø„gÉG»iÝh7lµÖ-eÙ/Kùje&ùZÜ}¢ýÐ8ž{´þ­õÁ:_ºM˜€õ¼¯Yþñ&®œhТ£vÆËв“NÅ…°˜”ã)„wlÊ寕Üß›QO;üÛ…c·åÄøckÎvÚ¼ýäÞÊYÑ2WŒ9}¦òrHÜ´‡ÌÚíè\ìù=Š3OEa7e/ñI¹<zëeãÉEL}ûC¶Ôñ åñAoÐëñ†¦o¤´ oW†¿™Å¬ï¦2ùj0’³ "ynøk´¯SØPZ-š»®ï(N‘¼÷O¾µ”™cþM¶­'aO cD×èòM%Û€ (¹Ä,ªœ©¹çcTJùs37ïìÉ®I?ÞîòóOe+µñkÞ™×âš±é³ù,]qœVïFᨔ6Fß;“Ç\Ášš¯Äß–¢ªªÉk»wï¦eË–¢<¢O\À›cS4 Q%žÑ'„¹ \Z3œ¡kš÷¿/[k'þžòIY2’Åþãó°C‘wrþ/o~éÄÈ/úãÏ}ÅÀ¥ŸÞgØžîÌÐ ÓQíÝÿ¹YÆhQ³Éu ñ·fÌ:ÏÑ=ëX´â u;´ÇGq€u£Ð#¸ä94µV¹Wù#Ûä‚lÓÔ\Ò.ecåd+ƒ±¥1ZüÈ… ñ·f¸¼…¹ÓÆÑ“7Ÿò©À# Å_›‚]ýPKyǺA Žã“!Ÿ2zþp"*½~4ã3ßbÜwžxß. ñWRÖwò[>þæ(9eniKÈËÃé,϶U¯F/#B!„¢:“+—B!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆ$ÛB!„BXˆÕƒ«?±ï¬â¢¡jKbž<ŽÏìOlß/8œ{çUõÆÆwå…1[¸®Þõé“sÛ‡ér(8¿Œ·bc½=µäŽM2^ÛÄðžCY™Zpϵ¨4à Žÿ<›±oõ§gl,/ô~w'Öä¬JÕIÜ/*7~_È}cé1vk‘>XôIß086–Øs8‘WìM5ø±ÄÆÞýׇ7†Ç±`SYUZv‰o‰ï¿·{íÇBˆÒÉ™íâ YõNOÞ[w…’ù¿5ÞQXe'rôêI17y‰P“8ýçŽH?y‚ ¥!-|mÑ8Ñ¡Ë3€N¯ÀË-kcH\ÀÛgÓ³§#[WmáÐE#¡Ñôz½­=oM ×ö³bÎb6á‹mñŒMÍ'·PŠ]\´iÄ3ïŽ&ÊÆ ííf'ñËÂù¬J8ÉÕ\¼#;ÒûÕiînU²Í]ûÐ=k6ÿ²y—¹£Zá¤è9ýÍ[ ßÛžéŸõÀ'¿û«ý63?ˆ(LânÓ“ºuq)õô$eîÆ¥ô`ÆäÇq×äpøË7˜t©73&¶%o[)Ûu°bí°¡,-ÖOìLÖÛü¾­-³ÌžcF bNô=öaÞ˜Z|5¸d›èLÆBEÊWº¼3›Ùy͉¨'¢y”Ulß½™ä~!„϶‹Slð}¼aßOgÓ¡ ÚG»Vɉïšßâ¾)¥WçùXˆš¢ú-#Ñ_`õ¢÷ûˆOÇwÇóø÷Œò1Gƒû3á³Iô ¸Àº…ë8—ëãÆk[˜¹è,±Ã˜0òešåüÂôçq0K…Ü,5™UMxid“†v¡îÑùŒŽ[ÏŸWE —Ø8s)©þ]èýô#ô˜ö9/y[áÛï+¾U2°uu q +ñ€1ã8{®¸HD”iû“fÃõ“K·&0Ò ëÒêYÊÏó6¡ûÇÛÄ}>—|“XùÅwœÌCÚV¦žËÛhÏЧ=Ù?÷;’ ë\n½p#¬y®:BšÈ=Ëoç€ü$~KÕù\üý¹õ&èÆLýr3š¶=iCbìØ5o«o7îÝlóˆ+—–½Ç[ãçñã¶#œ¿‘еƒ"hêëx«3¤²vÒ‡,ºÄ‹ïOeêØþ4»¹–©c—p2W-ÙæÃhŒñèfNf¾¯?Ï®Q¿C[¼” î¯Sƒíö‡2ê©¡ÑcQ8&Çsèzaª“sŠMûr î‰Óù2¶»èÁóÅû‰9õ®@ß.»ÌžO™É«~VÔ{q:K¦D㪔Ò&æÄBc¯¤<ÎlN Ý¡íü\ hÛ›ŒÝÄ—±”¤8ÅÞ‡•˧®¢7k ø®qñ-,¨ºÏÇBÔÕëÌ6Z‚z½BLJœQ¨ÍS—rèæK¼útµpïÆ¿?I%£¼"ÿ“­j¡A>«÷Áßz5¿¦ÒoÂË´÷Ð4¬u™c£Ö²%õq^t ôh£?`Ô‹…—N y((( MiçÖlðiá‡vÛ’o>óéÎÚ†ÒÇÓÏȦ8®NàÄÎ8;ÀÅ—NÊ8cPq~òuzµöB ¸=ßš•cÏ“žoàêŽùݪ #‡u'ÊQñV“xcv&ÙÇʯ׳‘a8ý´—ÄÌgp»v€»pÚ¹娑4 þV;x ·È\3—‘¦øðÜm wÓ@`}\}O u*å7˜âHø O˜¼†Ÿ·ìfÅçëY Ø{…Ó¶ó tÿGµ´ OYÏO)¼úU_¢kk€ü½_ÿ†õI=jX²ÍÕô‚ óÙ|*‡¨{òÏo#!½OµöƲ¨Âû+® ýL™õ´ñˆ&Êañ‡2ˆ~Ì•œ“›ø-¿1ƒÃ]0¤”½¢Ñé'ú$3ê]¾]·œ2—øj4Z4…eÑÞî³ÅÚ${ÿÓ±Pò•ÚÐy)Äﺎ}³hìlƒÚ¢ÝÞød^)e)I œ¬!料 oÎ’ø®iñ-,©ºÏÇBÔ Õ/ÙÖ:áUǶð²‚ÎZ‡c½º8Æ™¢³A«Üõ¨­-þ¼ä¬q %ÒÓÀ¦ÓWI³¿€Þ­%!®w.zÛxGà«ÛÈ©+ùàhlR·ƒ¸‚ƒs¼ßó{ê jïJ„€ÁøØ€O+‚uÓIHºŽ÷¡ êÆT«Œ‹Z'ƒï\šUt6Xiò¹šxÏóÞ®4Z\Bšá©Ý ¸~¦üzÙ„¶"D÷9»Ïd|áY ž¡CÀevývš¬ØwÑ‘°^8ùU£´:´Š‚C}_3Oq&ß WWW\]]©e<Á àX™QVp ‹! {?ñ ñ$dÑ1²6*»¿»™®§m£hšYŸ`õò•²Šä‰3¶»»ü÷^Ί•¹bÌè3÷*7‰øÝ7Ð5ȤO§1mÚ­¿OÇõÂOÉdO|eŸÔM{—1,œ¶›—¥žþë¬%#ø¢ëë(ý¾ ÅÀÍ‹ç¸|Ý™z.¥]Ò¶¥Aó†(Û’áÒ‘°:·›ñÿÛ¹ÿ8ëŽãŸçÎ_—ºÓ©éœ¦›þ˜îιiµäF©KJ±ŠJrkQ£FcýZ9cÔú±Á–k3\e¡FÐ!Ñ0¢˜Ñ-qK²æŠ“JÓþИ›ÉùcßÔz¿þ<îžû>ð}xÞÜ}Ÿ¯]‘™ës²A½JVÉŠ«f vEç•ÈõÆa½th™¶—fËÙwFo×vʧXI’#ÍÏyIŠX“§˜ê:}˜£¢eA²BR”Û§šv)åþT…[6ý>òµN¿Ù¤ ¶rg.ÕP÷}ÜcSlAĤ‰ïÑm9ïéð³{5\Z¢ëSã®õ|ù¡¼¿*½¬PIAR`J± —7ë­çŽ+¬Ì£$_·>i|M§G·ª0ܦ©JÑŠ\+OÊ1©iRHf…\ã›EÏòxÙèï<+U°.@O¶žÓÏÝZí˜Þç.™'sç Ç¥ÚJ¯ú¢µ*¯\ÏÜW¨¸©–¾Ú#•¹q¼õUÚóË>Uÿã6S–ÂW¯W‚Îêç´ J˜ðäW`l¶²œ ê r_²6m&lQùª¨Ö‰c :úT£â]*zà!9«ǾÝáÿ¼bÜÊŽªÓÎuJvH²E*Ý-u+/3B6Y so×îÛ_QÍ»/ê‰×}²‡'(ûæÝÚvcÜä­ÝìQʯx^KšêTÿA޼3 ?í¡ŠNÌPÁ®*ÝzÃò±uvIÚ²¿‚ŽŸTÃÁfõùÂu͆-Ú»­XñšúæiEh­g•¬Žoäº)k|‹°9ïâ§qž¥ä»ähýJ×yR2ÏÙ‡&Í“¹s¦cž™éÌ™ÙûCç›Û5°4_Å©—í`9åÞœ#ÇÏÔÒ5¨Œô±—G:kõô¾¿ß¢˜•éÚ´ãAݹ)Ùÿƒ”Æq}/žë ÉüÜ…Ïõû_][[›rssÿñÌÈðùÚùxv¼ú˜rسæS¯wvy³Tõò½—­øÃý˜Ú¢ÿe˜‹‘ß¾WÇÙÏåmìVlÑÃJ$´ÀDlãÍw¡UÕ‡Þ׈ûíܜȖSàŠZÔËH€…l¾ûþ³ˆmÀb0„Ø !¶CˆmÀb0„Ø !¶CˆmÀb0„Ø !¶CˆmÀb0„Ø !¶CˆmÀb0„Ø !¶CˆmÀb0„Ø !¨ùHéBIDAT¶CˆmÀb0„Ø !¶CˆmÀb0„Ø !¶CþÇ ÿ™ÓÒ#IEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/14_fields-for-interfaces/000077500000000000000000000000001516513262500301325ustar00rootroot00000000000000141_define_datafields.png000066400000000000000000001101031516513262500345540ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/14_fields-for-interfaces‰PNG  IHDRòc_Iï7bKGDÿÿÿ ½§“ pHYs  šœtIMEà 0ÚÂ=7 IDATxÚìÝwxÕúÀñïîf³›Mï½-ô*½ (((‚zÕëUQT¼¢ bÃú³¢Ø{á*MD•R„„NHH#$!e“Í–ùý±! ^0Àûyž–™³ïœòÎÙ3³*EQ„B!„—µ„@!„BIä…B!„’È !„B!$‘B!„By!„B!„$òB!„BIä…B!„D^!„B!‰¼B!„By!„B!$‘B!„B4‚+A1ûߺ—g7Ðö¿_ñ|/ç&ÜîêRø×î|ýº^søô¿±8IX„Bq9%ò©?=ÌôoS.xUÎ͇Àðh:öÆÈAíðѪ$²Í„9u?­=‰IQ¡Âؾh%,r„Bqu%ò•³aÊËäľLNìÛÌÏË0ý©ûé iÊ¥<>ÝF1ʵŽ„•ÇÞœ¶Å?îÁ h»·c´$ÿL"/çA!„Í&‘w‰eHÿ`ÔÆRí!>µØþzúzæ=«Ããõ{‰u¹²g泑"œ0üãß@8Ðow÷“ }yœ/!„Bˆ2‘Ä­ÿ PL¤nø€gÞÝD@Öo|ºòZÞ˜V6ëhÉÞǪ…?òûŽRΚÞ‘±ôy7 h‰s·Ý±÷õ{xþ/my‹q§¾åóå“Zd ¤Çþ3yí5Gøå³OX²ù8ùŠ+-úÞÌý÷ޤ¥áüä­öå¹`ùï36å¾ùu')…n }ñ}îo­Ãš{€ß-eͶxNæšAe ¦ÃnšÄèŽÞÕÚ¸çÿ¸wî6L€Ç°—˜?¹:Š9ðîdæ¬/¹kþk\ç¯AÉ]ÏÓ÷¾K¢ÜÄ›oM$L[ÉZ÷îyüôè4*®„2ï˜Ë¿n²ÿ]Óy6_>Ùö‚L7ŸÃ«¾äó%9œcAЉÑÿžÂ-]½ÐT™‰{ç^ØThéòØÇÌêéŠ=ÚVRz´l9VÐÄ·yó¦ê%Ÿ-Oÿ›7œ¸æ™Ox¤ƒPÈþs÷½á/1ÿ>{Üjs¾*g%'îG>ýj9ÛO¢r ÷Ø»¹Å·²÷Ú8»w _þ´ƒC'RÉÊ+Æ ààJP«® 7‰ë:yã`M«ÅyèDImö%ý•B!%‘¯H¥#¨ÿ}LßÇsëòHݰ…´ÃÓ‚9e%/Ïúœ½E72qæØ–ÏßÁÖø™¼2¥ux†Î‰EÏ17%÷\*LÊöï™›•MËÖžTJ_ÏçøÆÏy^ ཇºàZšË7¤žKL,þ¸>ãä’ç˜}â4ç¢gJßÃÒW^ÃmÞ‹\XE*¯23ª/ž›V“ƒ™¸UqœíÑ`=ÞMç2ØP÷ Ħ©U©ì|UqEBQâ7<ý ÒË®!N°ùÛ9$„9WšÈçÚÈÆ½©ç¿lÉ'õÀ:¾=Ç©'ßdJlmJYË}u>w$„BјO­QˆêÛÝ:ûÌ2I+0ukÞû¢,iÓµ¾ž»oˆÅ9c ¾\O*µn>_ôiËÃ]\j¨SJh;êz9'°tÑrë±ßX‹]n¸–m|¿"Pø×JÜÓ™ž.*°6¬<¦ÌBü{O`\ï4¹Yh]²X3ïÓÒ$^EȰ)Ü}[œR×òÉ›‹I,)äïO>dsç§àUyfªr¢sLNÅ‘d¼ëqö¦—etœØJIdÆÆ€†–ÝBq¬*@júOÐ=_ðò‚cö—ZÝη·Bhܹp^ºàD6ánaPh>;~\I|! aÍÖt®\eeѵÁ€Õ,NëþUìÎéà /5¶œ86œ(}SÄzùkª:f²/*.H¬é¬ù´<‰wŒÅcÚ¡Kþ“oþ]Y€qm;–É3|i€§³#jKéû~æí÷×r†Ö~¿…›c×â<Ôv_#ðÓH§%„BˆÆNä³'°'òJÆkÁNþ8R: ªn˽þ‹^j =ytq:PÈÎ5‡0véBm~èÔs:3ÿÝ [wÌíà›dûëÃeÆímЗ´!kËãü’ X28™k¥§‹Ö¬†•GÕê>žyxxYBeM_Îcçöç1œ)w ¢•ÏÝ×®cæ²,°ìcu\.ýyU~¡âàK‡¶n|ŸšÖìN-¡£e—}æÝ5§üTrÉ1ûptoFéF¡t4T}á£ÒâÙ}ŽÀ hÜ#hÓ¶m…G'Ÿ·‰¶ãƒ<5µžj½ ‰Üÿ±=ñÌ:v3U'òhƒxm‹¿<J"«wœ¡ÿòâ7p´ô-‘C{à«kFCâ_÷DþÂóUkvÏ]t¨bøÏïbˆ·zuÀ+} Ïo(¸(‘woÝð ¿ðëWßs,-›‚b36«‰³çÞ’²—´’t¬ñøgT¨ýÑ“>ÝõŸQÀv€OÞúëØXœ37ó¿Åçn-t¦Û°V.ÁÖ4ry4¾=Òòk¾< œYÁ¼Oƒ¹oLg‚ 6 ³’9·“è0s.ãCª ·6€Ž­ù1³Ì™öå'!ˆ0hñl3i¦Ÿ[¸L—¨Ú=ÁDíäÈ,‡ÿdíN Zœƒ¢ˆðhÜØ:µI¯õ¬Ì†ü#¥É¯C{†wô(+kÝã¯Å§…7ì= ($|õ>ÿËïˆæà*j¼ wGú†Á‰“€’Ègo|‰õúvè’×òÍEëãAcðÂìÇ×ðÇþ(®1ç—ùKÊn˜­íy®ã¾„B!–Èìå•{/~ÝÓž¾»üÇ 4þ {ðßì,}Ü`qÂ2ÞOXvÞ&Þ¦pW'—Kóh½Æ.&€áÓîf÷ìω3BêŸñ쟾)v5îHGh·Ôã9·"È=&/ 8w&Lµ„sy«G[Úy×îë Çàn´Ò­åo·•Ï_Ù @Ô”yyp#_:é"64• ÓʯOb‡ë¦j@üµ„ LÈÏ?û7K?·?EÆÝOÇÙLS#Õ‹@†ß3Š5sV’”ZÉÇo¬ÀÅ_çG:¡aËøþ$`NäÏ=Äÿœq%üºœ‡~uÛ—B!4Êy:W?"Ú÷eì}ÏòáÛ2 àüÅÛÚQÌ~ûiîÒà²õ*:¼"ºrÝ”Wxcjϲ¥—Bc—Ç1d³ç½À½#»á¥+»F2xÕu|€AþšãèÒ²+!å™%ƒpT.-èXáxQ] ÖÕòì¸ucòŒéx)wâ@Ѐ‘DV¸8é4¼þÀo]㯠»Ù^G{{½ÒxF3ðî¹<3.´Ë®ÂÐöN^xjÝCìÏÊQ9‡Ð}“Vÿ‹·@A÷Õº?Ü1¢]äÌ !„¸ª(V8•{Ó ù,ä™À¢ƒü=!::ø€£|›-„$òæÿÂæüFÜ¡Ìz:K2/D³óÖC‡ñàä ñ¢Ñ3xH>?ïƒsõoÕ¸ÂÐÎÐß49!®xM³ë–üFÞa.lL•3'DsQIŸÂ/÷À¡}`“Ñh9¼6l‚ù»jNâ¬ù°z|¸ ‰ŸWº¦Ÿ>kŠŽD‘Þ©&¦CŸóÄÛ0j;ñÐëÐVn/ýz3\˜¨ÀÑ ÜÚ@ð`iê ßÑÛ²!e5¤ü yé`6ÙÛ·%·´]ž‚¸p|(t»¼Ý/¿¸'òñÌ·øÛ¤§Û#¯qoŒîê,ƒh6Iüšuðgîù¯;{A¬øº‚‹ò àX*Ä甿'9æ›`JWpU]ÅíIIäÈhìIy†g¥KfMæ·lð4‹¹#Ð6dzcËaã+Oðmøy–9£›ö„]êã‰NAnoä‚”ŸaO'èþúÙÿϸ v%5ì;ïwøs#´˜ ¯mí³sÖ.–¿ŒMñiÚÞtvzú\KÔzü"‚ *tÅÏIž|õfñ°kÛùI¼Ánèí=.þ:ýš¶— ?o‡ø"ûk9ÇáKg¸¿ ãÌÉ,™3·ù™B\…š~”˜6´q/Z‡C¯‚NÜŠE–(HìþI¦=°é^8tÌþo—k¡ï-µÝŽ¿Éµ?ž%…•ï|Äê}ij} oI¨·#ÉØu$ëÕRç#¸aÆžyúƆKºtµÊ>?¦•ÿÛ§%<2b+&ñ œÉ´"û—cn~pûpäQ¾Ý©ýðG¶ÄSˆ+UÓO¸vº>ì¿üëvAN}F;-´é #†A¯¦¹ü(>Àÿ}‡=fíÆ Çqó*vg(øÄŽáî["9¼ðkVÄebqmÉ;îg|¬겯 i5r ú]ëÙ›aBÐ…ëïúC[P–ì}üºðg6ìK&Ïn¡Ä¸ ×¶ÇÓ _?êh;v(ŽýΞŒóŸÍ™±ìY¦.Âoç•'úá©>ê¦èÄŸ|óå2þN+Æ)¨;#¯)9©²%“_~ÌÊø4²@…Þ'Š£&rSŸtÖ~zæ~ͪäxµfÿWÕl[Ù„«í,û—}Í¢õñ¤@‹³O(Ýny€‰±n¨k—Â]¼>ã#ãΠY/21BKqü|·‹soþûò]D+•ÅÎ…O=ÇX×#ü¾tëö#Û*½1ÃïgêèPT9ñü¶è'ÖÅ䬽£é=z"ãú„ WU_þ[cÝ®¢.ÂqO€ë'èÞ·AôZ8œYýf®ƒ¡ÛàãQë#ÙòŸ ȸ'Ÿf„¿}þ]1åž§ÇA)`ϳù ΄ۀÇyñÖH±‘»ùužøú(ŠÿXž}<’å³ìm2fôœv­ewZ1ZßNÜ0ùß Õ£¬¹ •×!åmªøÔ¾\ü+[“ Ïß¾¸ê:7Æ9±–m½šò]°á_Ê<ööî‹¿)í \ÏÖP—Åå7Q«÷‚åÜ@íwwºx‰Œ­¾þ2ý`ÎpTŽ0¬d­†}¥•fýnè>¼y쬱¯0F'¯ã³…«Ø~Êxþ)}­Í<‘_º†uƒI÷Â$œN†Ã'áT&¤gBN!›ÀdEeÿA(WWðö @ˆlÑA SƒbC[ 9†5Õ4$ñK'(:·Œ$²ö.åµ*´ž‘„údq,ë(¿ù#^¾“è²mJ8´æ=‡cPÒzÖ&ìbñ<5þ/ÜCÍa¾öës¯Ötk©æÄÎv-—¤‚ÿ2ç–hôŽ}àç_ñŽî@'Ÿb,ÎníÝÁÑbІv¡g„3ŽþÁ%ÎJa<ß½³¿€G4­}NóÛ¢Ÿ÷¦"ÒOáݾ?=ýœ0gìeýŽÃløú]4/01Â…–½{ÓrÍÖ‹WÓ¶‘ŽGñÈR>ûu?F§hú^Û s.Ç‘‘]RZœCuˆ‹ªVç­,vþz<­GYôÚÛ¬=è‚hß# ]~2É©ùXŠóÓÿÍcÝpŠìͰH+‰ë¶³þë×ÈvxŽ)==1×PþË^Û[.¾)U±Bñ1HÙÅùÓß9°ë;1œ õP²ô®öS“·RÏMùBì ˆîTç nµ“~H2¦±üƒ8ݱ-iÓ‚@_ûÎb†uÇ5ny;×sl\$1º<¶CBúwÇOs¦¬M&þòí®éNlÉFöžÞâ/7;{(¾æÃUÖ kY¡Mì_ø¾-#ð×!£Âö~UÖ¹º´õªËçwa'íËÀþ.)@I{¶"Ðy¹¡->Ì¢jêòƒ==e”» å§Á¾ ÷° ë^•´§sw‹]xÛ˜Z×w†Ämö[a”lØž#=¯ŒuëÃMì_üchcÞCBzùÙ:õ ïk…¸ìùï?ƒï@Ç.Э-ÄDBϾ ©Mr¦@ÁHÜûÀ¶]^×Ì€¡MWdÿ13yr´7G>É[;ŠA׋Ÿ¼“¨œ<÷Ü 2 “HʳíZarì–©ÜÕß •1œì'ægÜÅŸ‡ i©^ÅæÀ¡ ÿ™õ=Ürۿɬ/sfÓ*މ¦c…Úcà£Ì™U:+œÃÆWvp4 ¼:aRkÖ‡ÿd·PGsç¬ôñPÈøm.s–TxºC(7<9­Ø,Ì%]pMyÓr9xKd F%wïÖ‹§ØjÜöÂr)–bûl’ÎOß"ƒ{2ôF?\µ*@¡ð`-âR!‘W×¢º”ÇN¡pÏ{Ì<¨"¸åé™ öµÏîÚ,6Šö¿Ç¦3€®·þ{`ÉdóG/³P…\Ë´;: :T}]¦çå.CÉIå×Ù?èR§-»A'ì(ýr÷@Zc&ò ƃuÛ‚ÆÍdæÔy;xgÖ§$wñç!#Ñú+¼¯â²Oäu€©â6Ûÿœãî ^àf½#8¨A±¹ !7Nç\üd °¿· é…jœÜ€bð!H¯B­sÁ>÷lÅl³·—¯Á>—§õÄß0ÙÈË.¤@•kï¤ÜC tR*œBpã0¹æ\²‹là|n?Z":ÖõëpÅ9gKF°³=6aAèI-›•WÌ™ìXø5Ëþ:JÎ1-1š«}¸P}¶Õµ¼ž:&³8n7Ë¿Ù]úª'n}„{øRt¦q©ìžf¥ª¥Yc§Pt&ǾÏh¢<Êo‘T;P~lÓ>>{ú¿çï&7…³ð«¦ü ð¿²{ÇÐû!øõ ³öE|;\ü~Ÿ{a 'ø64.j\یᡗGQ™ÄÑÉۼŠÍÇòØ¿äv÷x”^îA\38œ•?$±ÿÏxRûlᨠ41éè©®ðkÑ:ÃÜÑGg³ÕŒU©®n¨Ë×2 #4ÆGT(Îîè‹ÕŒU¡ÂDÖ¹º´õªÊGå_@ÙrÙõÍ|½×>ý™úðX¢ UC]—§“ÎõÉiì?µã”ýŸ9g³„u¯ïþ¥õ§BÝ!ጼl#Žý®â¾VˆË"‘Ÿ_%^üúÙ3ö?u¥„QaMX`j•½×T©Ê³?MµI¤‰ô¹XÚ 1¦r2·4)ñ2à¬òÀSXÎ&“V¤ªU(LO!ÀÁ¯óžJ¡ÁἩgUÙ˜®Ø”*Ë«÷tÇ,§É-Q×*É®°´F!÷·|½ñ(Š6Š‘w¢»‘Ýß|ÊÚ,j8^m·½ TŽÁ žòƒŠrHOKã䮥|µ&™=+דÚçf|¼j 5`3Qh²rNœÆRé+ÆN…“·§}ÿ9G8vÖJ˜Ï¹YWp:wl][Æß=”`myœ¬ŠÁZP©ª.?&\ù=ƒ¡'x›hþ)P:\œhêbÀ·ŽiÎ`÷ž³„uŒÆÛ¿%ý[˜Ë¾×Ö“§’g²¼» £Í’OIHXÎÒÜ,¬hé0°Ýë‡ËÛ1¼^uݰUX ¤BSéöÕÔ9¯º´õªÊWYÎT@Ââ7ùè¯\pëÎ=N¤ƒ«Pj¬Ëâò”_¡“óv­ÿmann@i"o17f ëZßMd$çam£G]”AÊÙsc¤jGŸ«»¯¢Ù'ò£‚˜m°tMùÔ@½Jêƒ†Âø~àÕüŠ˜öÓküßñœRw“hœ:18ÚgÍpz{ij17Ï^y›¸H5I;c<ûŽ •f/œ Ôáá¡…$3™ëÿÇ×gƒðn3œëºzWx Ÿ Cô@:âÙiÜËW~Ïàh3ûÖ;?([DiÃf)"ëÐ_ì̪Íñ†Ñ¯6Û^xisä;^ùî4ÁÑ!ø¸i)LαOî:¹¡W©0´®E\¬~´öƒÄt#Û¿ý]T1q›kó†˜ké罟µgŽó¿^"¾cާH1ŒcÖ­#èãφœüö»½[{@A6©Gì7Ï·ÓáªËuГPT!Ñζ/Êmªo¼KNñǧqþþx¹(äO¶'Þmiíi¯õ*×öŒèb a{&ñi€¾ ƒZ;ײX5ÔÛë›2Õ²N›ê>ó™·ósæÿa¯÷Á®ü­®¿¦úºüZ{ä.ËYUùߎì‚%iö¦¨Øàl5ûQŸíب‰|]ë{ê’×xýhkôi»8`97F:Sräjïk…hî‰üÞ3С7<ÖL9p “ 9 Ne@v˜,çÉÕ¼½ 0"Â!¦5´*ý½é¢4Øë±ÞÍ*éiÓœ¶üÊŽÓ6ý;qÝ]ÿ"ÖU…Š&Μ‚ëËØ¸/‘;@ãBçþc¹yT+œªí\õD¹Ž§~".ëÛ6ÂMÕ“‘ç%ò rîÀmÓÆcýr9»­cUv; Ž!mUbi?ªÂ­ËmÜÿ K¶cõ×é„tH÷Àýü™Vóñ®½¹6Û^0WéJ¨S"û·$Rh_‰wËkyë@ü@åP‹¸80ðÎ8úé ögìf›º ƒGE²jå±Ffœ?{EJ IDATFZW{_+D/«¥‰&õ–ÉТŒìÝ£ÀPŸ/+œ:ë6ÀªÝÐm<ÔúŸžüj¸’e¾ëÿ8ÿµÐ§ Ç€ó³†ÔY°-:Í€ˆè¦›±¯¨ä8ÿ{òÖåy0艘ØÂQΗ¸bù >M.MCà‰ÞöGKÖuØüu5¬/½6 ê Ó£êWkÖz^jÇø³y#?U&DópiÖ¨Ûó·ÛçB¢ e„úƒ¿¸¹€AZ جPRlŸFÈΆôt8‘Ñ€‰2!Ä…ÎÄsñ]ÊV0Ÿ> Ó€×Xpúã¼Iy’ç‚qD]†Ò;ÙΞËqØ9Ž…nwƒ»¡iÊ­˜Hݹ‰»ØšfP¨$ñâÊÉö{¯M©o„nulRE§aG…q³M=ïc9ðí‹|±ù$y  ‰¦OIâ…¸ªù*8V~ã$)‡íRäX_9sB4ÄŸWý­ßƒØÖàÐ:ö†¿¶^p°Òþ§2Ù?ÃoB«‡ ]ÿ‹ø68‘7rtÍb~I­_n½w0þr:Å•Åàm´¥Ï’·Á/{¡uÏ‹ªÊfR¿ý e+p< ³kýÊ’ŸšLžM‡Wdg†Œ¿™¾>’Æ Ñœ4ýÒš³‰ðá×ðw#<ûJwÜÃÃ/Í×÷B\© «æ?£aÄÛàæJ.üý Ϩû1t]¡÷lð•›Ö„¨«ŒðV|ù¿ÃÚÃÚØŸè\mo…­›aY…&Ûµ?Üä/æ’Èׇ PÛ 56î„]ñp<·S>ж-ôì½¢A§« ûs …ŸÈÎc`ÈÔÒ_TΆýÏCb|ÝŽáÒzÎ/g‰·ueÕ¿ÃÚ Ï”÷‹€‰ ¨Šß\3Àª¿°ÿPÓ¹ft¯ç³è…’È3s>\7z·€s¿Ôf3ÁéLûSkr ¡ØdrJc¿µÞÍ || È\ÏõX œ> ¿ü ¦‘0¹•œ=!š"‘WûBèhh3\õåíïìF8´RöPÅÃüÏ¥Ð~´îŠ,¦¢þ¬ðíïPñðjˆ ‡öþàï Ž@~>M…)çßÒ¢ñ†©ý!H–Ÿ !‰|½M˜\z$7èÔÚ¶„ˆ`ò/—*Y§@Q>dfBÊ)8|öí‡äÒ×4“§Öq¹*H¹øfW•tÞ ­iÔWÀœ&£}/ÃîCöÿ øt™ÎrªÁRK7À®:>ðÁ%îî)I¼Wº¦oâîØ±BɃÝ[íÎK@ïûâ>sÉÏ•¯„‡^Μ áÒëÐzÙÿú€Þº<ÁA[!sv›G@›xX~û¤UG =:¨ÐËr!®xMÿÅ÷Ã#«¿;G±@‘ÑþÝ`±æ$¾åp¸1´ÙЖ»›ïæ>Âý“'óð{q¤m~™is×qÆvyT€â„™ñä’ÍÒD=< ׿ڬ’øKÚ.ÍI,œõ&_ÚiIeùÓ1o_ÑW¥ÎõK¢ôÒYbáñ±pG'èìoÿÑ(uéuµ“´†=aÖõ0®E3Jâ› }ÔiÜj†íDÆ]ѨûM~„v7À‡]á×ßaý.È(©ÇNtЮ+ =Cåòãç'³ðTY7‰Î#Èv½:zí¼µµ¼»ßÌ©?³Ãe¯~Ðwµ‚)µ„ñrc‘¸šÒŒFÛ“´Ë:иÓẛ¯êÎÇ‚%…Ÿžy“_ez'i}Ê¡m´ýÏ¥¥`<¾–¾_Íß'r1£ÁàBtŸ Ü5: ƒŒwÒ¥¸‚yçP¸éßpÓ]“G“!5ÒOCî¹›]Í€uàâ^^áé_~£l£Qã3j6s®B]RHΩD¶®XÈ»Ï`ÒS2Я6¡±’ŸaÄì_úƒµ*tAÝ(« „vÙä×OÎDôì×|ʣذ*Rƒ¯DJa<ßÎ[Dj¯{™=­~Úb²Oæ@ªF‚#ÄU‘È—<àݚLjªRiШ58èÝðkÙƒ±S‚ѼøëU×öZÚ“º÷ÅùÐA² ò(tjǘ»'Ñ'ÐUµåV•µç“½`Ø·›ä|†BŽg™P>šÍ#Z.'óÔ]­ÑVÏ:öKâ’³ž=Nrqýu$ÈEhñ‹ì‚_dù{ly ¬Z°˜?âR(°9àÖ‹[§ÞFçšÛ‡­!õ£8‘g‰Ûô˜aß_qü|žø.€GŸOh%M¶Y»5¯ÚÏ;š‚¯ßcU%mP]c[n¬±¾˜„¯*/ƒVÆç+!‘oæ´þtëÀŠuûÈ´´#B•Æš÷æ³Þo¾Ù‹ U[¿z“÷¿öã¹û;Óuʳèß‚ïüfðÜMahQÈÝü O¯­ØcsdŸ–'fÌ!\gâèâç™·`±÷ÄÍZýþ+û?ßnÜúøÝDz;b<ºšæ}Ì÷s¹§Á¾ì ºã™“XöÞŽvx€Wžh‡!{;ß¼ñ9FM5÷(F7å0yúëüÇ%ßÞ|•ù¯ÅÓyä]<ûnÆŸñÒ‚…ì‹Jgç–¯¦ÏW’IJ÷~àdש¼6;§œ],xãcŒª°ÒĦîñÒ.£]¢IXŸÉ½Ó^áNÏ|þþò¾>·?KËç}A\ÔÝ<3½+{YüÖG¼³Ô—g'¶Ä¹E'|ÏlçhþpüR‰KÖâ¥>A\º™6ayÞŸGÀ 0jõu]Ú«®4qZâI"õfRÿx‹Wç/'dÎxÂUÕ—[WÇûá¿=G´³Å’ÂÏϼÆÉ‰/•¥nIcuuñ¬O¿$.)WkZ¹®`Õ·KpèKt‹p‚½ÊW¹ZRYõÎ{üés3Óþ¯á 9É')vTÕÜ>jjo]?,ÍÜ­ñxUÒÓæÎ¹öØmМÄÒšÚr#Žõ•–¡¦~@Æçz“§<Ÿß]að4@q>Å60§nf]j8ã&ô&ØIJH±ƒq;¸‘cµ½oF¥%jDÂô*Pé écƲÌõØ¿Ê@D¯žDû8¡QipÌuíàèþÌòÇzW{¼¿Ø‘Í £Ûáá Âѯ;cG„ Vª¿Ö‹=šN>ZÔúº÷@ÑtdTŸP j->ûI*Çr, ._MÛ›OmegakÆ^ƒ›F…Ö§3×_VVþF9_BÚe½öï@äu×ÓÅO‡ZëCì€6èÒK÷wj+Ûr"¹áÆ®ø:ªÐzÅrý¸ wn⤠ÔîÑ´wOg÷É"̧÷sLß‹QÝ4N8ƒÅ˜ÄžÓžtléZËûêÐ^KcÛbø@Z8©@åHPŸk‰ÊßÎÖTså¶ÇÑ–×%ÊY}î;׋¿Ø«!žõë—Ä%ý–LߊI³ftàiþZúsg?Ì”Çß`Ñ®¬Ò¾yÒÃ7i.Tj^áÑ•-ž¯¦}\âúÑìÇÝÚ¯®Ÿ¹6m¹±Çú†Æ]ÈŒ|ýX1æA^ Öü ò͇ùö™|_á=&%ŒB“ó¿ç®:ap68” p*µÕŒU©Íþ/¸ÎRLœÚú#‹Öì&)»Ôj,F#Ú^flµ9^áŠüñ*{œ/tÕe*GÜÜK÷§Bãè€Æà‰“º¼ 9jl˜­ /_MÛ+ÆlŠõ>¸;–—ßàãQVþ:ÇSH»lŒvyQ;•ƒ­¼Ýé|ñ*kh*tž~è‹S1Z/í¢ز'…Óa ˜ZŒ'¶k>¿,;ÊéˆDRœb¸Á«–k‘ëÒ^Kãàê¡/OÀ\ðt,æL¡+5”[}ñç®ôìÕÏzõKâÒ' žm2© C&­ø4ñ«>áÃ?Âóù'è[p£Þ_'U-êåíã×f?îÖæxuýÌ…umË0Ö74îBùz±d²k{:ú¨ øiAãâ‹«¾æN£s¬áªëþ-éðÉ‚ƒtš6‹©­<ЪŠIøxŸÖöx/ô%9š-€BñÙ|ÌJ@ㄯå«i{Á }qgK”Ò›Ÿm³r))-SŸ/!í²^ûsöÆÉ”B¶IÁ>z+”ädR¬÷Æ p$¨Sæ…ÛÙ‘™KÐÐ`Ü‚;pf#;¶ŸFiq;Mõ`¥„ìŒlíô¨Å”MF‘ž`g j*wYNpAÒf°¦xšs›¶_O­÷¥ý¡„¯ú–£gÌ pñÅ`:Áé"…è:fØ ®*5Zµ sÙÖ fcQ•3ÃÍ}Ü­ñxµù¼¶AçZ¶åÆëëØˆ´Ç«ùÃ+Š«ÍŠÅ”Oæ±,ÿà-~În˸Zc´Áýà„E ·’\hÅFqîIöï9AA#<º®ûWÌFJ4nú»¡U9ckök}•® îM7Ã!VoKÇ (ÅI¬_s¼Þ_×5vùjÚ^Ü›®ÎùyU"yVsÖV¬>‰UU¿x i—Ñ.kÜ_PozxcÙò=œ1+Xrö³âÇD ]û¦³xNañ?³‘U'¼èî„ʹÜòë–\‚:‡TûS ¢²‘²z;3Í(–\ö¯ø™£îÝ褭E¹+QœðÐ[ÉMË+ëWjŠgS÷K¢á¬gvòãÒµì;™E¾Éй0¸ß~ã„:˜?G´Á}éïŸÄ?läd¡ Åf"'é0©F¥Áí­Æú¡õ%Ê·ˆCûÒ0) ŸdãoG0+—ç¸[ãñjú¼•µÁú´å†ŒõõèDý]Å3ò6²VÎeúJû¿݃hÙ~(Óæ ¦wiX>íAT?,bÞ̯ȳ¨ÑyѺÏ8Âc#úuÛ¿6dû~Ä‚¹Oò«§NîDE9s²¶Çs gÌÔñ|÷ù[<½Ö7ƒ'Qí[¢ßÕ8mhùjÜÞ1œ±S'Pðé‡<ö›C@†ôm…Ó *Õ%8_BÚe}öïƘiwRòõÌyðC,7Zô¹éã"ËtµkKbýà8h骵;Ñíܱ%ééÔÂ…&›¿R93Ð]ógòeºÇ^Lš:†pG€šË}q"ïIçë¯aóWÏ2u©‚K—é¼8¹mõñlâ~I4ÂŒŸÞ ÃÙ ,yw)iy%€÷ÐŒšz }½Õ@#¦MÁ¶`o=úFÅ×ðÞÜ6¥%5þÌAMí­¦ú¡ö Çíã9ðÑ;<¹Ã w·@:´D·íòwk<^MŸ·Ò6ئîm¹!cu}úQÿn\Q¹¥H\¶Iß™µ/ñÌÖ¼ðD?u˜©šK_þ†ŽÇª&U2þJ"ßÌ-ú!ŽOx…éœì_IÏy›ÔA#pÞò+;ÓL¸F çî{úQ´ú ~Øx”³ªzÞ:•;úøá`Nbáœ7IêÞçCÉ*ȣЩcîžDŸ@GT€ùô–|µ„M‡s0;xвÏÜqsOU¥Ç{““½`Ø·›ä|†BŽg™P>šÍ#Z.'óÔYþ% þ<@– Ô:OZšÆƒ#‚Î?qJ>ð"_Ä1ó3·8Ójâmxýô ÉeÇp¢÷´Ç©ÛSC¹ê‡ .$2{‘ç·_Ã3³‡à«¶Ï~ƽÏSß¹3õùq°æ ¾Û@Zžôþt~+wŒŒÁUM%1q¢÷·¡úìÍòóTS\‹ùxö—¸M‰öY„âøù<ñ]>7žPMñ•ÄóáAÒ4Ñ™’´-,øl1%—àËÐ^Ŕ׊‘#+ªªCÅ$|õ«.lCw†’¼¢šzw![åu¤b›3ÚÈ‹W²-ňc`&æûˆ¹ÜÓ΀ªÒ˜¤²â‚Á£Æ¸V7ö$¯®4ž¢™(IbÙ{ 8Úá^y¢†ìí|óÆç5¡åV5u¨Írí±óÛбÚmTµ¬#ê ýDÂúLîö wzæó÷—¯ðõ‚]Ä>Ü7KÃêg}âqq?VDâúÓÜóè«ÜçYHü’7øà½å„<3žpukÞ›Ïz¿I<úf/‚TlýêMÞÿÚçîäòâ23k¢ñjM+׬úv ýc‰nN°·SiûÖàÓu0aËV³=c ×9€r–ýĹçc„élüm+æÈ>-O̘C¸ÎÄÑÅÏ3ï\û·¦²ê÷øÓçf¦ý_? r’ORìXÚ°lõ«;ÞŸMßæ^}·ô–L6¾ÿ2?9 ¤MéŒEûNKêEoµ9GU–Wú—&#O­©pM9z4|´¨õ!téȨ>¡ÔZ|:ö%’TŽåXÊ×ÃÒÂI*G‚ú\KTþv¶¦š1ŸÚʶœHn¸±+¾Ž*´^±\?.†Â›8i:—|;ÐòÚ¡D9ÛOAeu\¥Ñ¢6ç’z2•\“‚ƒK ‘¡®µ?iÃR›rÕ9*“g'†g³e[Àvv?뎺ҳO0Z•ˆ^=‰öqB£Òà5˜ëÚÁÑý™åk.kˆI­âZ]8ªˆ§h&“|©±#?šF·ÃÃA…£_wÆŽA}n†©6u袓^·mjnsD^w=]üt¨µ>Ähƒ.ýYæ†×Ï:Ç£ÒäJMèµcèê«EåàA»QcËû¥ÔͬK gÜ„Þ;©Qéé1v0n7rLn+WÀ˜Yã oŤY3:ð4-ý€¹³fÊão°hW@íËè|¶l>…°eïaí oú^ˆ@¥%jDÂô*Pé écƹö¿‰ éጛ4€ *µ¯ðh‚ ªúÇÕ¯ê> Ä¥ï±(§?SþÝoM=ûÎúŒ¿õ)¯ùF£rÄÍͱ´sP¡qt@cðÄI]*G ³µ¼ÂºzèË;<‹9ShÅÊŠt¾xéÎý¯ §úâTŒÖÒ˧óŽWÅÉ ¾–ûo-á§Uïñä§8‡wcø„‰ ‰r®]2Á1¬…u-W-âp^&ïN‡-ùaéNËžuœô¾†;@1qjë,Z³›¤ìbP«±h{™±UQÞ Õªüõˆç°(g©ÿÍ€µð ÅNþxéUeó .þ^”îÚÔ¡‹µºmSc›» Žªthlf¬JÃëgãQE›÷ô-ïT:O|uçú¥ ò͇ùö™|_~LJ…&•ß\#Äå3fÖ*éñlÃIm2 lŧ‰_õ ~üžÏ?ÁP?Ú iGÉW91&·ëI À}¾`µgƒCyû×hQ[KÛÁiŒz?|T8W}¼ÊYÈÜø)m àÖÙchy®,õé;ë3þÖ¹¼Bù’RBvF¶vzÔ€bÊ&£HO°³ Þ8™RÈ6)ØG]…’œLŠõÞ*ÞSsa{W¢œ7}@HŸ <ØgŠ)‹øïñþ§+ˆ~á"j»ä¬Â14ε,Wý{v\Ú ¤uÑ6ï…Ïú4üû߇¯XÒþà“é4mS[y U“ðñ,>­¦¼ª¹üj´jæ²^CÁl,ª0ã_y<‡½r‹Ôçf@cðB_’C¡ìÓ_ Ågó1+ö!*½uè‚6T«m¨e›«©ü ­ŸuŒGUýRnV!6ÎõK¹œ6é tÖ QùâªoÇ„¹Óè,kâÅ•8fÖ‘ZïKû!C _õ-GϘê§Ç©å`º¨Þg}b¼7f1¦3^jì‰|uíßŃ駋¢«ºÚnÒñX¡0q1ï.>Ë€‡gÒÓ[S·~°†X6}þ ê]%õÍYm¤¬^ÆÎL3Š%—ý+~æ¨{7ziÑõ¦‡Ç1–-ßó‚%g?+~LÄе/aU-”U;á¡·’›–W6°[2÷°=!B‹‚ÊÑwWj•ºÞ3õ*W]ÃâÜŠAí¬ì\¼?²BØÙËÞi›”hÜôwC«sÆÖì7Öz6 Vå×úå[Ä¡}i˜PŠO²ñ·#˜•êã)šmpoº±z[:f@)Nbýšãeí¡Æ:TIªk½kH›khý¬k<ªê—Nþº‚]YfËY¬ú™#®¥ýRp?øaÑ­$ZA±Qœ{’ý{NP`“ú'.ÿ1Ìœøþqîþ²*©ÓÖ3;ùqéZöÌ"ßdÅ\˜FÜo¿qBLŒŸ£ýMº0ú÷r"nÁ7¬3¶fH{·Úµÿà¾ô÷OâÇ6r²Ð†b3‘“t˜Ô*žkÙØã±%sŸ|´“àÛäúHýye®OßÙøå-?7¢qÉŒ|½;%'bú±kþL¾L7âÒ‹ISÇîƘiwRòõÌyðC,7Zô¹éã"«¾áMíIçë¯aóWÏ2u©‚K—é<;*í?|ËWiùXT¸ÅrýFVßÀëQ®:s"r@G4¯o¢ ænb=쉲6dû~Ä‚¹Oò«§NîDE9s²1˯ö Çíã9ðÑ;<¹Ã w·@:´D·­´33UOÑL8†3fêx¾ûü-ž^늛Á“¨ö-Ñï¢vu¨’6ôâ½u«wUÕ‘0-`nÚúY×xTÙ/õ÷fç»3ù"½mHO&–õK Ÿö ª1oæWäYÔè<‚hÝgá±RýÄå?f¾x_8gO›ðlÝ¢Ò§R©õnÎn`É»KIË+´¸‡v`ÔÔ[èë­.K‹ûôÃ÷×%äö¼ÖµýöÊ!ˆÓ¦`[°ˆ·ý£â€kxon›Ò’JÅި㱕3»×’`ÌGûÝsÌXPú².ŠÛŸzîõé;ÿãѸåUJÊÎh䦥(Ь^ª«ÒGoeßñ2÷·ÑK<„BˆzÌ4æë—WÑêá©ôò¨ÿ·­JáÞò{¼¦?ϤHG9Íè܈J®!%B!„¸ì颹ãÙè†íC)!móJzögV˜$ñÍêÜIä…B!*U´—y3ç¯æº©ƒ I\diB!„—!Y¨$„B!„$òB!„BIä…B!„’È !„B!‰¼B!„BùZq‡Ìxr Éf‰…W s g=‡ ŗT–?ýóö5ß¾¬6elÊØ5qŒDódËÝÍwsáþÉ“yø½8Ò6¿Ì´¹ë8ckÆ…–º*þaò”Ôz5Ü~zæ5NN|•éœ$BˆÚÓ¸Óẛ¯ôwÛ›i£Ï³eñÇܧYÛéižTýàs9ÄèêøÈ=ðKWløöî;:ª¢}àø÷nËfSH =!A’P UzG@š€(ŠŠþÔWDН(ˆˆ4¢‚ÒE^‰€‚ HS&H‘^ A’@B!!e³›-÷÷GB )Š‚<Ÿs<Ç,;s§Ü™ûÜÙÙ»ì=~‹¬CW² IDAT Fÿhê·ìLµ¨xÝÑ„Së¾c‡çc¼÷Ic*hT¬ÉùôÒã¡\ëùö:‹N]xAÁÍ'˜ª1Íèpÿ½ÄTÒ£Üñ]*±Œòâö :q A«HSñ%Ń*MZÝÚõü§Ëx;´ÑÅIƶټ9'žª=úñʪhryò[×nå@FMZûk¯ó²S͘B1i ïF´ ¹ž<5øuŘî!hòsÉ8u„­Ë1mü!=˜¶ äo׫1ù)[ˆýâ;~OÊÇ=¸šZ¸øËXª™cËç0ãaR²l` ¤vǾôïR/…Ãs§³ê¬uÖ(^Ò+xÖÀè'+“TbšâæÅ,.ûŠØu‡8k›/Õ»ap§‚•*Û™,ž»˜ÍqØt>D6þ4!È €åŸú ï¡oÒ§JÁŠ•åà FÎâåñ½¨L‹ÆL&±iLûw“”íN³!Ãéæ}ŒU±ß±vïIrœ:¼Â›ÒwP?îñÑàÌ:ª؅ü²7™\Õàz]xü‰ŽDy(%–õ¿Bd‰+”4&9÷Ë;¼¹µoŒê@€¶` çìžÉè> y£%¼=™¤æíð:¸‡“™çÉuáÁçûÓ2P_˜õáâÏ}‚C[OmbÎw+ØvÒŒ!¸1½¦µ?–º¸í)y|¦)±<öd–¿zOdhmw,‡g3vær/L@6gO¼7’–eͲæ²"ó^öÎýÓÝŒ݉@™½3F03®ÿ}ï9jíœúq<œ|„·ø±öb•âç¼~ÆÒÛÎ¥./¡_MÕJÌñ«ùdêg,¨òÏÆ˜¨ùä`:ŸDbŸw.}¥šKMSt°Û’V3½J×QÓh¨Ã‘sšÄ Ï‚/-ØX6u{£žfìÐøäìã»)³øx‰?ãúDº6ÈœâvÃ+ÃÇí¡Aµ'³òÝé¬ó{„!ï·"Âd'#)‹A{ ?OŸÁ†€ÇxyrSB”T¶ÎÌÌyŒ¾>ÆÊ*ÄTò˜Ðâ× áKW³=µ-ÝBt žçÀº£x4N¸›“?œŽí×3rØ"ܬÄ7©±»¨óß&x;’Yõq ç~áØ=¼!ÿ ™È“¾ÙüñÕDæ]H[ÜX²%ðý„2Ægiå)RocÍgyoZáö46Í|—tm©é¥)slzÙÊžË. ið¸«þéÛ‰ÏîH {2{“ôTÔœ`ïi5óˆ;Eнá¸c¾¼„ÅÏy¶„ÒÛ®¬O-ìeôK1sZ‰mjK`éô…$6ĤQ5pÏØE쇟aVÂËœÓÿc’ÁWÖØ<½›#æ Ú5 F_Ìy¥(.^·JéÃ/ŒÃ8s$ó†1þápô¨dþ6‘7~½üº]z»DHÃ&A,_¿Ÿ4{ U”2ÆØ…rïÕóêÈשj´‘¼v ïÍXFؘ^D½,£ÊœËT3G6g0`è<ã™ÂšÉï1cÒAêwyŠqÓ‚0ïø‚wb±¿Î êO»VöÚ¼Øq-n;wäZ„-ùwvdGÓóþ|t †€F<Ð) Í…e,ÅD•¦MˆösG«hñŠjG·ˆ?†½¤LË™FÑêÑØ2INL&Óª¢ó ¦je/4€íÔV¶eT¥çƒ ð7(è+Ö¡ûC5Èݹ™D«‹•TtDvî@”GAÛOmfãéz¬ U<µ(7*FDbR°%ÿÆúäêÝŒPw Š1˜Æ´Ãûè&Žç•\V!n¤ÒƄƧí£³ÙòÛ)l€óÜ~=Q‰–-  EOT§Ö„PŒ„Õ‹ÆzŒ³6°•rî_XϨڭ;÷¸¡ÑûQ§MMÜN¤-~,¹0>K)O‰Ô\Ž,™Î·­yáÿšQIK™c³Ì¹¬è„_!šZN³;1Û™76¥kC-q‡Ó±›ØsÆ—º‘^åØ;\FÛ•6—Ù/EOÒúx+;s«ó@çxkô~õéÞ9Ü¥9]”Í‘—I&|MšRúó&‹Ëò/µ]¦ÅäkK6gÙcìBš»:¶å.w!Í;•½­É¶r·C™s:ªÞ?õüôhŒa4j„ª­K׿•1iôøÕmIU’9žaw­ì×ÑæBVäoÝI)7‹{ ÊÅûÏÀЏ]øSµrjë÷|ûónÎY@£Án6£oj£Ä/Ï—3.´3Ï÷Íç‡UÓy}v 騻í£†ü¹›8Ñ#ïH iÃsþ:p\¬6ŸÃbô£‚áR;˜ü|\šÓ… ¡¯»îœ&Ãì/m‰×Õ?..Ë¿¬>v=ÀœacŒš²Çú‚r{ù/Ýàê<ñ5XHÏu”¿ÊœË.S Zƒ­ÉwÍ¥°Í ubs€#×µ²_k› äoÝIÉTc~¹6 NtT,ç³±©A—ÔÓkù<ö(õ†¼Æ j>è ‡?{ÙW\T@½l ¸”æŠôFš÷fpóÞ¨Ö³\>™³—ý棄zTÂÝz’sV•‚YJ%?# ‹±&mÁ¦×8±]‰*6sÞÕ+ÿ—MpZOLÖœÉS‰.2ói=ýñ2ÆÐû­!Ô/öñÅ—õ¾‰Ê7pI¾ä1QE¯àÙŽ{”™l8Ò˜J›ÎQ¥G}*j(¸ø•6ÞK9÷]/Ûeù•9>ËK%÷ÈwLûî—7†Ê,» s›*AýmíŽÜZ£mFCÓŸ¬Þvº`ŒZØðó_¯]ªÍL¾Ö›à@oô ØRwðóó¥•u;>F™)Y®§¹j.ÙÃöçɵ«(O*x¹¡Q4(€>¤}޳tÙÒm*öŒ,ÿþ¦- wôþDùçñçþ¬*¨–D6­9†M-­Î-i˜À÷ 7‘˜ëDuZÉHˆ#Ù¬¢mE›Àc|»h+I¹PX29°ç9Î’Ë*ÄTÚ˜À-œÖMÝÙû?Ö›«Ó¾–·K[@J;÷¯iþ(k|–»Þù|ÖNBû ¦{Uãu*kl–5—wÕv¯O`ú&V¨Hýw»¨W!ž•[2 ©VüwpŠ™ó®¾qý¢mF£ü¸êYÛÙ=,_ˆC¹¶ùY]Ë©FÏG둵ìc>_¹—“™lÖ\ÎÄoçÇÏg³é¬ã†‹òöq‰·Éª‡ÓÝšMÚñ,ûd ?ž»›‡zVÇäÂ+6NN®^ÊÎ4ª=“Ë$¾BCšóxT—Úá粫ÛÄ…²—7®mœXð*ÏOX+çýmâÎü²«!‚ƒz1ÿË)¼ñ«Þ&_¢jEbÜU88Âî£OËYľõ:+}½q¯P…¨(/žü¾ÔïÞ‚ßæŽcÐÏ{†òöÊHStr±¦°}á×ÌMÉÆ®èð ©C÷gº®§Ç'ÉŸ·1ƒ?Å®õæ®æ3ô¡ªYïÅ¡Yóúo*xS»VUܶ•ÖÓ!tòÎØo™òò|̪¯ˆfô{!’S0‡ FYø-SGÌ%Ë®ÁÍ'„êÍ"¢NÉeâF*}LLWÁÍ[á¿r1™MúQÝÕ‡K—vî_ËcÊ eŒÏrq¾ûW›³ÑÏ졯 ú(=˜FޥͲæ²b¯Ý^‘Ô €¿¨M¤—4ˆŽ©€3ÁH½»<‹(Š›óž¾Î­u¥õ‹¡üsúƒz“3ûS†¯±c ªMû–ÕpߢEQ\˜ÓE™k~¾Mžå Ï_ø~ùB&ýŽ0úU£Q»ûií«Ýåïãâ99»â-†®(Ì¢B‘µ:0dL;b*†?º2Æ€âN¶ìš1‚¯N›1„5å±A=ˆ0põ§W.Í×8—]5†\({©ÝZ̸~.‚óg¬øV¿KNûÛ„¢ªò¡Šâ6 ös÷0óõT:Ǫ¤AD‰\ú¯ï0vkÞÙ _ùQúøZÙX4æ#Îõ—çkÿýs™5ŽyﮢÚÑÔGÎíq›-„·EŸOÊo+8êÛš¶áÄ‹+ƒºœ¿örôŒ'N,É¿³dÅiB›ÖÀ[®rÒÇ2—¹Î-šþã†H‘Ÿ5BÜúòö1uÄ ê£é6è^‚dæEØÎþÁ‚iŸ‘’kG5T¢Fëgx®µ?Ziéc™ËÄ¿˜l­B!„â6$Ÿ!„B!¼B!„By!„B!„òB!„BH /„B!„@^!„¢Ül ,zí%>=lùûmOfÙ/2uÞmÓ\–ß2ìõÅ$ÙäÔ‘@^!„ÿzk' dôÒdì—¿˜»‹cî1ëÛ0Ú Ôîö0mCôr’ˆ„üB!ĵP<¨Ò¤•´ƒ«T'4hi ä…Bq˰ÙÁ⹋Ù—MçCdóéÿH‚ XŽðÙ¨¯ðú&}ª¬^[Î`äü ^ß‹ÊÚ,.ûŠØu‡8k›/Õ»ap§t€3ë«bòËÞdrUw‚ëuáñ':åquDèÈÜÃÂæWãÿxñ‘:xç–ž¶Ô¼m ,3™„F-ñøó(gs²Èu¡ÇÓÑ<Ø€bOfÙø÷ø«÷D†Öv¿øþ¤æíð:¸‡“™çÉuáÁçûÓ2P¨X“7ûŶÌÇ\›vMòX»9œaãzQ¹è¾jæØò9Ìßx˜”,©Ý±/ý»ÔÀKƒKÇËOÙBìßñ{R>îÁuèÐÔB‰¿jK`јH¾·[V²3ÅŠWTGž~¶y«ç°pS<ç• šôDÿæèÊê÷Âò%6mƒiÿn’²Ýi6d8ݼã]îO!¼B!njŸÀ²©sØõ4c‡6À'gßM™ÅÇKü×'·²’'­fþz•®£¦Ñ"P‡#ç4‰žûí)ü<}ãåÉM QRÙ:w23ç0þùúx]–5y#_~ü#æ¶CÞ¹*&G «KKëp!o§…c{õ¼:òuªm$¯Â{3–6¦ÅmPvZ8¶_ÏÈacˆp³ÿݦÆî¢Î›àmK`éô…$6ĤQ5pÏØE쇟aVÂKÔüÒ÷Õ§©ZÉ€9~5ŸLýŒUÞâÙŠKÇ‹%¾ö@&ŽŒÁtn;ÿûðKÌÚÊ%w†jæÈæ  ý€g;ˆ†tì݇öQ8²SɶÅñõØa,¸˜ÂU '×ê= Zˆ_»MÈ#ôoˆ¾°e¥u)oE—‘‹ Å:O| Òs%ò&ÝÅ÷+Z=‡ ‡ ó9,F?*”‹íjòóÁ­¤UhÕÊ©­ßóíÏ»I8g»ÙŒ¾© §+ÇËMÇâHEã¥ãyV,ùxŠooCa~ Zƒ­ÉwÍ¥ÐÑ ubs¸ØïWäWvŸ`’5f ä…BqCiÝ+PÑ×÷Rà`ðºÔk=*án=É9«JA”¨’Ÿ‘†ÅX “¶ €ÔkœØ–‚Ulæ¼ËV•„5ïÍàæ½Q­g9¸|:3g/'úÍG õôÇËCï·†P¿¸=Ô6@1Qû©TùåS>üÌÀ+ϵ&HÚ2ÒÚ²\È[Íç\jÎ#@µž#5ÏH¨‡¶ümhªˆÑr–óù*wNÌg3ÉWƒŠ}¿ýôZ>=J½!¯1¨šzÅÂáÏ^cvyŽ—ŸA®‚›T,ç³±•p¼r×§Ì~¿ß_JSVŠrÞb !„B\}H3ûgé²=¤ÛTìXþýL Zîèý‰òÏãÏý)XUP-‰lZs [a\oOÛÃöçɵ«(O*x¹¡Q4(€>´mñí¢­$å:@ubÉLäÀžä8/ hÜ«Ðeè0:Z¾çýO~%9_-3­Ky+NN®^ÊÎ4ª=“Ë$¾BCš^Ã#'õ¡Íhàq”W!Ë¡b;»‡å«q”Ϫ63ùZo‚½Ñ+`KÝÁÏÌ8Ëq¼†¦?Y½ítÁ=‰% ?ÿuåcDof¿[&×úS¸FVä…Bq} áôò$ùó2fð§ØµÞÜÕüq†>Tµà ?Þ‹C³>æõÞTð¦v­ª¸m+ X­)l_ø5sS²±+:!Toþu®,†b ç¾Á/£ýd2Ìt0l`ûÒÓê\È[q§FÛvÍÁW§ÍšòØ D Ü±!‚õ&gö§ _cÇT›ö-«á¾E‹RL0¯»>-gûÖë¬ôõƽB¢¢T­SƒRz"{G÷%_ª×«Ž¯N:M!„Bˆ¿1,VÉÚ·€Oç(ü»÷¾ö6}ªèKMe=¾”YŸo!š½üOU3J¯ !„B äoíâYøkórÑ¡#—½›O`©V å…¸4D4lCó:Uð÷4¸¾ÏNu`É<ÉÁMkøíx.N@_©6m[WÁ²ïW~‹ÏÁ)­+„BÜá|Þ_lÞg†Ð´qþÂÚ½›ˆÏ«AŒ»tœ×Cq £ýÀáA] s"f¾OìÞóÌ !„wr o>¾™ýyP¿1Mœ{X»b?›âÍÜ]Ë„"}'Ä5‹è6GjqœÜÄ‚%›9v6‡Ë©µèµfRS2±£¡BH$•=.ü›?­^xͧ“øzw¦óB!ÄÈ«fŽoÚ… 4­B°ƒ÷Р܇9¦.·s$o9Âg#¦ð‡ÕH×&ñŸnW½Åúç—Œüpf}=^ü` wß ýD7+ßk®{•¿Êl qãµhæöÃ|5u>Ûϫה‡>°Ïô«Ì®9ß0i–Êð-¨@%Z<û‡^û˜Yê?VG×Ýôx¶?÷ÕðEX­æXd'bÜòÙýÑp>=lùÛÊâVíi&¾Ü“m¿ò ‡,·i{kðܤ—hàfaç”|~ÄzKÖU!$ÿÇãøclÆÞÍkX¹ùÙ./ñë ëø]jøBÎA~Y{”3©g¨¤=…¯g.iy·Ág_ZœÈãºt~JÁ~Í™ý ÚC!ÄíÈ«˜ã6qÈ `ãÔ¡}œ‚‚émGØx4‡z ¼nÌö¯ÊDÈKû‹“éñlY8™³†7y©eÅ«¿ü§:°«Zt×{ªÐsØzÊù'mñOňJÁ8+¯`iÀáqwú/Ì[ÅÝ›òŸWµ|9i“f8y©o%6~ü Gó®c5ÞšÎéLðð«„_D]ÚGÔ¥ií¯yoÖ&R]Šfuø„ù»o%KWÄaøc‹ïЩ^ÚC!$ÿ›âø\Žn:Œ u_˜ÈÀº(¨äìžÎÈOptãa²ïiŒ÷ ˆä}>΋}ª ·%ñý¸·XuÖNܶ¿Èk˜ÆüSøÃêÆÝtÀðû/ìIõ¤Óèñôð8ÂÊE?²qYvÐyW¦N›žôî\ _­™Ÿ½Æ´]¼Z¼ÂÛý£qC%ó÷ɼ6çOœ•:1úµ»YùúåÛI äXÇÿ¾ZÊ)ÜCÑ¥EþUû‹íYóí¬ß›Èy;*EÓìþ><Ô< £Rü Q™ùÚÓØôÕg¬8˜Â9³P0úEѸkn†›ã$?Œ}“•g Þžºtƒ–3qxuÌ-%­+ýSt«M5 –ÎãÛ 9mV=~•iøè@úÜÅÒ’Ê2¢§–Ÿ®ooé7„‚!¤-ϿڇšgÖðÕ/x¼JÁ µO#ž©á«Isxs´§ýúVx3·|Æ[ N`ÓzS­ó†öˆÂ£N_ú7;ȇ›Î¡ñ¡ã#=i[7œ :ÈOcëO X²å$åÒJ6€GóW˜ÚüòÜ ·’üU¥p›H>G~ZKÞ=÷R?؈íÌ~˜5‡µIT@WÚ±ÔâÛɽJ;žxª ‚ä%ï`åoEž ¤  ÕSÏÑ5&˜Š& b9{Œí+ðÝ–“Xµaôÿ]ü ÞØc3z _3òƒ£Ôê_JÚ¢eҸ؇-7§®š ÔêÑŸGÚÄdR¹g“عðb÷eɰBˆëY˜»åJä´’}z/ëØ@[…: NPh‚êQEŽ£ëÙ•œõ†}ìÄ|&‘”ÜÂk¬Ñí²†±rèÇ•$y× ^(|q,š4廓Èò®NÃF5ñÉNbײi¼ÿ]LD·k€½{Yg&7ÆáBÚ´ D_ô¾å ó?^Ä)ð‰¦ºßÖ|»—Ë·–ªyq|ûþT~ü#‘üðfÜס1çãØ0o³·gû¥BWòEÍãô©<*ÕjM—n÷Ó¡Q޳qlœ7ïÿÊ'‘ÍšY¸—^_ùZ¶jE»F¡¸••öX-á‹•8­FѲóýtnߘjÞyœÊØØ IDAT¤ž+½,ÊñR҉Ļ…µã…+‚øf…{â/§zôZ®;ˆ¿‚#‹?WÍÊÔ‚é*²q$ž¦h>”„cHÜÊÏ¿l'µB4múàÙÆ¾hT+§vläpvag÷ñÛ¦MlÚr€Œbb ÆýM1ßÁ¾tÐû×ã‘§Z⯎Œc×R1ô{±7 ‚Çѳþt|¤î•ÍUÜ u'ýÀFV.ÿ‰_vœDëMëþCxð.8sˆßº•øÂÁjKÚÅæM›X·ãVÊH{ÕDàZ{ܬººE=Ä3]j¤cóªŸXµv;f¹XÑ ÃJ!®Ó-·"o?³ŽÆýÀiþ䓸îSDsœEïMœ žo&L"gÜXº__2}—Á¿^þJ­;EaäÄÅW|ھ̘>Q•Ü=Ó‘èjòÌk/ÒØ[%³Öd^›GúæUíMÝ*miZñ7~>·—Mñfªígc¼ JUîmä¶H8aŽ[Çn3 ‰æÉ׆ÑÜG%uÍ[ŒYœ|áJŒùèJ6§nµéû½¨é®ÒÄû$o-IfÿÊíœi؉@-åÌÐU¦çëo¡×ÓnÇ–^'ßäû”LIÇ^5˜Ú] sßVâ býgSªí&L ™œÌP!PAñôÅ·F3ZV¬û‰³˜Ãy Û²ÂýPµ»4ÆçjŽÿ¼„uµZQ³†BÎÑU,ü:«±Ï5¨Eƒb¾O²d 3V§¢ñ惡uÑVÇ_¿–Üê]Êg7óÞû‚ßÒl7i–ò!Ô·à†LÍ=Rѧ`âr«Í3o~på{}¨ ãªàºtVRÏãtù¹äz­­¢à^©¼ÇÒ`ô­Pæ|"§r &²ÌÄd,„\\©Vô4êÝŸM#ñ-rRLúR¿ÿs=iKëg—êJùëj_Æ{+ópÝút¢~á«ì‰Â'Reˆ !Ä¿)WL4iQÌ¿øP£e{jÜàã]Ü#_ò­:rébWѧ°ŸO"%O¥²^%÷ôI² ŽŠî@C`ã{‰øñö}Ï¢©€‘ºícðºê*{ábx{Î2óU"ô*yéç.ÛsÙqÝî¦×Ó½X`‡ê}Ùß—`eæ«’½ûkæmŠGÕGÑåé®Ô¬`f÷ÿfóëÙ+óºPlÕ©–3m9ûßJ»ÞáÞ¼ N§¤¸k sNbÏŠ $7ïM„¶¸²”žŽ6½e¤_kщÁÃ$ZïäTZ>^ ßËß’½›¹“f³%Í~sŠ ñ"²C_ºÜœÆo;FzNì„¢³bñ—¿pÊv©¼Z%벿]¥âTÕ ÿ{Åëyç2Ëy,µð: §?>…›‚{¥Š—m7Qðªÿ8ý[E¢ØŽ±òË>o¢þÏr¯ß•y](ŽrÙäZÚò·Ku5”·® æŸbÝÌQüêîKPp0á÷<Ä“÷U¦^×6°a‘ 3!„ø7ò·z`cªÞ‘f>Ù”y˜/&~ÄÞªvì÷mÙ‰j…¿:«©TŸöÕñåÑTŽe^h]ÜY)˜¢ÛRÏtæ}Ìýtí¢mìÿùx‘ãv¢¹ïA6fbÍ/>4«î9çHŽ?DRàÓL¨u-ù‚z!€Á‰ÓžÇÙ?ggÑ@\ã†l¤mø†yçC¨Tó>Z¹’¶œ¬Çæ3qþB£ÃðóÖ“›T¸ÿßÝ»àS‘bËÒ‘û¼Wò~ éÄ5ñUº0ô•?µ…mú¦4iPä$Ëúƒ¯Þû’­go|ïÓü9F×Tñðóëp–2XÀ¼ßÓÉѯfKF ­}ï¦c‡L¶ÍÏŠ„DÞMåÔ/sàF•BÅ|´¼ÇR1Ç­g9††¦:<ù|ÖÅé©}_Õ+[WQ.ÞÈktîøUkJâ¸ÓJf¦ "ô´yŒþ’I?ü3›\I{ ÕÕ-ª#ûùs*î$g³lxT.ÜoŸ'_tBˆë^ïºU ¦:8KüïŸÛ[©˜jÐgÄ t­†WÆvî8Ä9Ï0êß?ˆáTÃýâ™7µÚ×âÂvÜJÍÚQÂo)µé7¤õ äþ¹žUÛ2‰jW·+Ž[GG ¦{ƒ´'¶°fù Öü¶Ÿ4C4Íî (ö…²óUð¾§}‡`´gõ¼ù¬K §QpÑœŒD÷èI]?=dÿɶMëÙ|$ —Ò–Ö»2•ÝÓ9´åV._ÉÆ#6*E¶àñgÛ +©,ç¡”tâ¸U牗 "ñG>˜29|ÈŠ„ËödídÎ{_²5]ÁÓËpãiÙ­AA~xaæ\Ò~~ýæÆÎØ@ª TóQNšÎ²?pTiNÇn]騢6ùqlÝ•ÆÜàs-ÇRs÷3Úbv§æãQ­-›øplÝ‘ËvÔ©díšOìöd,úªtêßv‰ìH)š“…¸¥?°÷¬ ¼ªÑ¤U[ZÖð&×¥´·J]Á‘•DR^%înÞ.ݺк†žôøßøzözgBq½q©ziIöf‡ædþ6‘Wç(ü»÷¾ö6}ª‚Ú“Y6~<ËÓJÈ*âq&Žl…¯F:Pˆ”;Í˳fQ-õGÆNXÁéâÔÝëòòG/à³nKvd\&JXwÞx£™;øbÒWl?çFµ‡1¸î.Þ}ó'RìÒâÎ6kÖ,i!ÄßêÖ…j7mA‹-hѬ…¥õ¹+w â…¸éÚõçùžQxTjDÿ¡ÝÌÜÆìI_±=ÝÆ(ºu ÃM£Až $„Büýní=ò^1Üßï1î28Iß8…1[¯fôïyå3™…7OÔ˜ôñ;ŸOšÇÎs—¶Ø(Á !„È_AëO›FSOõ$PÎŒmÌÿöOì˜hôD/îöèAˆëa±nž%ÿú®í$kþ÷ \˜!œyœÚ»“¸ó—‚x±BÁ µÍL¾SÚT!„@@Ñã\og&;¾YÀÁ|0ÖëÇ#µ½äc|!®ÓSP§J z4ÝĬÍ)äý¦Œ=ý›×—œÆ›˜®]2Žã¼òB!Ä¿/ÏÜû=ßo?ƒMU±¥]ö‹¢œgï’/ÈòÔ€âFXë‡éRÝ£H®’½÷[b÷ZÀ­õ¹‡ ²7^ˆë¶mÑ/tÑZcb»£Ä§™q¸úµw ¡Õ©ê§ƒÜ|»: ›4©Bñï äMþÞdî_ÅëÕÿvîènÎxÝC­Ý®ZiWsòÝ×;1££Æ#}i,©↰Ä/æý)fžxâ~ê„T§NHùóÈ>¶Žs—ð‡,Ç !„ÿÎ@ÞÒŽ†;˜þÞbþ,nÙÎëž|õšû)ŠjæÈ÷sù=´‘óxóJhœ9ÄmXËAÛ]´i__­t ׯIÖ‘Ÿ˜ñúJܼ}ñ6êиºgMu`ÍÉä¼ÙŽ* )„Bü{yPp«|ƒ†;˜öþ³]Ä?õê34ó/Z ˱¥ÌÝœš»xèÉVøk{q¿®`¥¹µÛJ /Äè­Y霑ÙB!n;Ó^cDg†¼òU/ÄìÞ xjdqA<`?ͺù¿’ Éd㌠Œ3†1ã§²:õ6le{2ËÞx‘©ûóJ|‹åð§ {}1I7h³ñίÜut¡ÎBÜÒ“£O}úžÂ§³fñÑືxi£ÛRÉ•YSB÷7?fhm÷ßb¬ù<“ßîEeý?\Q}½ßÂó5塾Bq»ùŸZ£`¬Ò…!/+ÌYr††Oõ¥‰_ ‡Wmä»ùàååì˜Í—~2Rïå…±’'úë|tÍÚ XtêÒýŒgh]Ú?ÚÎÕ½nüݶµ»=LDˆþÖ< ì'ùaì$û¼WjàqÓê|½Ç¿åÿˆöcfÑ;ôâD€53…ã·òËO¿r0ÝæÚV]=Ç |Á«×q#©'´ÝÃ4Êù†Wnç¼SÁ-ÄÀb{ ¹²ŸH!ÄÈó¦ª]ôJY×Ðpz¾ö=ojY4øuŘî!hÌ©ìù~:³gÆþîsÔ2¹KP8Р½Ö›Ń*MZÝYgÖXgq89»â&,KÆiðÀ7´ͺõfÈØ»ùæ­é¬O³ÿMåÐâhÂ|*³³ð¦"yë“¥‡þ¾9Dƒ§ëOSB äï°ë„¢E«Ñ¢ó ¡^Û†Túm‰çÔÒŸbјÉ$6mƒiÿn’²Ýi6d8]Üö°xîb6Çe`ÓùÙüAú?Ò„ ƒ“´5o3a{ ÆŽj¿¦àŸ»w&£çW`ÐØvžøõžX¸b¬’Ÿ²…Ø/¾ã÷¤|܃ëС©åŠÕFgÖVÅ.ä—½Éäªî×ëÂãOt$ªØÃ*#?Õ̱ås˜¿ñ0)Y60R»c_úw©—ÆÂá¹ÓYuÖŠ:k/é<ë`ô“•I*1 kOfÙøËêìÌâಯˆ]wˆ³VиùR½ëwªH\qÇï̱bßRä¤-¡üOUGsfG ý%¿Dp+SU§»%‹´øíü8óŽ×Çð`Ïêlÿü fLDuû?úµ®I°·,©ì_˼•GÈv©ùä`:û¹¡ x‡)6•œ½³xkn•KLStbð¢ÁÀ×ù¿º&ô¼Ì¤æ?‚¥1˜0¦|èwÖ“îw :÷}”uCðPòHÙ³’¯ÿ·†cÅ.Ù+‚›Ó÷™‡iZÙ@^Ê>~ùÝxéI]obº?EßvwãçNkGWLcúêd®ºuÑGÐ{ ùu5¹Í»Ð0Øìckørö&Ü;ý¶Š¤‚zšm±3˜·% »RZ{s ãSGÿû$ÑGæðñ·ûÈò(G=K«‡±ϽóYSß`Á‰‚=ƘALìwšÇ.&‰zOFøï0×®Oe¯<¶N{ŸåY‘åhg!„@þŽãÌKeÿÆ?Hw«Lå …ß uZˆÛ ¯ O´‡Õ–À÷æ°7êiÆm€OÎ>¾›2‹—ø3®O$~ Z²l=;ÓÚÐ%Hj6‡~ýcÃaD¸Áá˘ŸÀÒé±Ä×ÈÄ‘1˜Îmç~‰Y[¹0Náçé3Øð/OnJˆ’ÊÖ¹“™9/€ñÏ×Ç«hZV~€Î¿!}_}šª• ˜ãWóÉÔÏXPå-ž1>Ç'‘ØçK[STs©iÊ Û’V3½J×QÓh¨Ã‘sšÄ O4‹=¾-áÛÞ_Tñé±%°djÉýå&§ýíÖÊÎm§éÖ¶6ºƒœ°ƒýÌNbßû’ãéù˜";1pèsô91šÙÍ7vUG¾`Ô¥­5Š©Ô4W„„j6̇光ôK›ÌØï±¡àÓb$oÞ{a@sßàA´Iû†‡ýN²H³'‡ñBÿ4Æ~º›ì¢u0DÐcp_"÷Âȉ1WlÌ/?É‘T›WîD¿¶ +ÞÂo©v´žA„ûæPâƒ=5Zú2kê+|‘LÇa¯2hD »W~Ÿ!§15z†Q}{S{ß vçârÝÝBZóô‹`Z?÷WǬ ¦Siõ,K—»W݉®¼?–¸\'Š.˜Ž#\?¾BÜiîà³;9óÓx ÀÀÿŽåë¸Pº?ß—˜ Ûj‘;åQÐDöS[Ù–Q•ž6Àß  ¯X‡îÕ wçf­ ñ­GÛˆslÙ–Špž?Àúx/š4¥è.q[òïìÈŽ¦çý1øè x Sõ¿ÿÆúäêÝŒPw Š1˜Æ´Ãûè&޳巬üPLTiÚ„h?w´Š¯¨vt‹øiØK ʦŠVÆ–Irb2™Vg0U+—ü}„ò¾ÿª6)£¿ÄíÄ9à F/Œš‚›Ì¿o#îlÕAö±u,?‘µJ^™¸–4¥Ð‡´ mHKmåTžÕ’ÂöבU½UÝ‹{SyÅñÃOÉ´«ä§íàÇÕ'qN7ªÃ†SïCHx>n öœŽ'e—Û9þÓOì9kÃi9ÉŽ­§Q{Y±% ³ÓÆÙ½›9NU}u.Ö]ƒgµü÷•.Ø—Nbêªã˜Õò׳üõ(šøU¿p,· …®œÇBˆ;ͼ"¯Áÿþ7×#¤øFP x{.®<;rÓÉsó§¢Û…WÜ|0Z’1;· ÔnÉÂ%[8Õµž{Ö“X©ýƒ®ÎÝ‘›ŽÅ=ŠFåÒE4°"²vd§’m‹ãë±ÃXpY0cUÃɵ:Á¤)W~¨VNmýžoÞMÂ9 h4ØÍfôMm%_`¯%Mi'Zhgžï›Ï«¦óúì<"Ò±wÚGyœ—÷ýŵq©ý%n#ZL¾&°œÀâ7B›=È#÷Õ'¢¢œNt&¶ßõ%Ÿ×’¦´yâ¥æññ“ésY9Ý”D<Ü4_äý•0æ¥r΢^\HÈI=‡µðOû©U|k gçÁ¼ý¬'¹ ;Y³hkå?ÞÔ|²²ò WÓUùvæ òœ—ý|‡½Öź+F"Û·Ç™ü-ó¶§bS]¬§ùÊÒ•»¥Ö«üÇB äÅeÿ+/ÄîÖ“œ³ªDÈ*ùiXŒ•0i ÞìY³-ÕóbÙüWSü6¤Øú9üuPt [kªˆ1?ƒ\,׫XÎgcSƒ þÝÓ/c ½ßB}²7±”•ŸýôZ>=J½!¯1¨šzÅÂáÏ^cv‘ºª—}LíRšrµ¥‘°æ½ܼ7ªõ,—OgæìåD¿ù(U”«_êûõÅ÷ÕåéËî/qûÌRÜÓ8˱E¤Ù@Üžÿô­Îžiï2ãÏLlª‘šÏ½Ë³W„ \6ttA.¤)Gβ-Y4z»‹Û«]dfu˜Ïa1øâ¡l'¬±‚zåtay-œÜ²ˆé[¡¸ùÓm0/<Û¸7râ:!ëRÝU3û¿šÅ‰Ïóòsù|ðÙFNÛ\¨çUx)õPØœôÚK7×z“ûÕ!µí,„w84kô!Íhìsœ¥ËönS±g`ù÷G05hIxá†kÅ£÷Æ8ØùÝ"Öž­LÛú‹m`}h3šþdõ¶ÓØÕ’À†ŸÿºïëC[Ñ&ðß.ÚJR®T'–ÌDì9A޳üù©63ùZo‚½Ñ+`KÝÁÏÌ—VÈ4îød¦d¹ž¦œìi{Ø~ø4¹vÅàI/74Цà^©˜ã—úþ«Îâ«Ó»Ò_â½¾ð%t7/ª6¤ûÀ—x â!–üp3 èMY¤¤faSA؈ûj™.5g™->ÁÞƒÄ2Ó”“íÔ&6¤FñHïfTöЂ¢ÁèN­zUðÔ÷þ­ì4W£S“ ô€bŒ Í}w],Ÿ. ká¡SPós8ŸmÅ©:oÈ/çºZwgÞ VNÌムx/!¥Üõ,µ¶3;ãNµÚÁ¸) ÃiÕ1ªÔG —÷øBqÇ­uI¸ÈN!O’?o!cŠ]ëÍ]ÍgèCU/ûâ¤;UÛÔEûÁfrjúC'=‰·Î‰53™£[–°¯˜÷ç'°tÆbú=ýoÞ›M–9ƒcâ±ÜSl»ÓøÑÇy2Ø j''y˾XAâ øA·2ÛëòqjIäçéâ8ŒW^Ð2ù“µåªgéõÈdû׋¹{À‹¼Ý(‹óY)ì?pk“ØÎBq§-~©ª*ŸW q0`€4‚·€Y³fI#!þVòá¤B!„È !„B!$B!„BH /„B!„òB!„B ä…B!„È !„B!¼B!„Bù[‹^{‰O[®?/{2ËÞx‘©ûóŠÿpfìâë·^bàóÏóßéûÈ»UÚ¡˜²Þ·l}Åͧ ÷»Sx¾¦ñöd}êÓoô>5‹×%¸ÅkLÝ–J·Òì« ¡û›3´¶ûÝBq›ÑIÜâ´¨Ýía"Bôî8õëbvz>ÆÄ™© ¹•ËzCî’nÝúŠ<…Ñsü¼zãnoFžå»!´ÝÃ4Êù†Wnç¼SÁ-ÄÀb{ ¹ê-ÔÎŽóì_þ ɶ¦þñ~B äÅÍ xP¥I«Ë^pjƈIs«—µœT'4hn\}‹ÍóoôO_üÓw·xš0ŸJÅìP±&ï`}ò̓´8q”÷&AÍåĶMÿžvB äÿݽöÉ÷vÂcËJv¦XñŠêÈÓ϶"oõnŠç¼D“¾ƒèß<jæØò9Ìßx˜”,©Ý±/ý»ÔÀ«˜àÒ‘¹‡…Í%®Æÿñâ#uðÎ=ª؅ü²7™\Õàz]xü‰ŽDy¸ÝÙ“Y6þ=þê=‘¡µìüñÉÛÌÙkÆÆ‡ŒØâAµþ£x.ò«Ë‘¿3«”ò”UWg—}EìºCœµ‚ÆÍ—ê]‡0¸SºËËZø}©Ç²%°hÌd›¶Á´7IÙî42œa…+újv±õ}6ì‹ç.fs\6‘ͤÿ#M2¸'Ò~y‡7·6ãQÐ9»g2zC&ô#9˜Î~n(ÞaŠM%gï,Þš_°]Í-´ÿ÷pWš„™ÈOÙ΢Oæ±9ÕЉ¨nÿG¿Ö5 öÖƒ%•ýkb™·òÙNcñy~uk‘ck¼kÒ¹ïô¯†§ÆNvâïÄΘϮL'zÿFôz²-£}ÑÛ3‰ßò=ó¾ÝÆé|µ`ëÏ„aTÞ²Žì˜z„ùTÀ#ï ß:ÍiF |ÿ«kBÏËLjî(8–Á„1åF½³žt§‚[HKú>óM ˜Sö³n›;í[&2yÜb’´5xî§Èšú N¬–c1±ßi>»˜$ Žþû̵ëSÙ+­Ó§s¨Þåk“¯³é8öUîZ4òâŠø5×;µÈª¾âUF;üN@qeš—BT÷§èÛînüÜÀiÍàèŠi|´Z¢!„¸ãyT3G6g0`è<ã™ÂšÉï1cÒAêwyŠqÓ‚0ïø‚wb±¿Î ê{€Î¿!}_}šª• ˜ãWóÉÔÏXPå-ž1qy¸lMÞÈ—ÿˆ¹í†w®ŠÉ‘Âêé3Øð/OnJˆ’ÊÖ¹“™9/€ñÏ×Ç«<+µŠ ^‡qæHæ cüÃáèí)¬žTŽüí)ü\Zy(½®ö¤ÕÌ_¯ÒuÔ4Zêpäœ&1óø/[¸p,œâvÃ+ÃÇí¡A-«¾¶–L˜ÃÞ¨§;´>9ûønÊ,>^âϸ>‘¸••'Zü´#|éj¶§¶¥[ˆÔóXw&à ×$°ljù—¥Ôã‹’ž;UUG¾`Ô¥íúPLÔlÀçÓF27ËO¤ß{Ø÷Ñ6²û™Ä¾÷%ÇÓó1EvbàÐçèsb4³š‹ÏóªY0„Î/¦ÝÙo™6| ÿßÞGWQß}ÏMnv"aOÐ@ –EhÅ]D ´bŠVÚS+>øûxl­ûRO]NËV±ÚóТ|\*EQ+" X Å $Pˆ’° 1d»¹7wž?¦"I·ò~ýE¸“ïÌï73w>¿ß̽©J%ï˜B2vÖ!~ÂñEâ–IË)ËéÅ~>†«‡mãæYëê‘ :÷Œs×}·²1–α?¸‘ »·où´›©{—l½›þ¯˜8ÍO¹ŽÛÎܽî´ 7‚ÂåS¹öÎÕTç}›Q×\AVXÜøŽ‹dÐ¥Üs÷M¬­LYthßÄ>I-øhÍClwùþ}¸«~¨9à6E;\Ì%g<}çxoI’ӎ¼ OIÚÿp$a:}÷»ôn%’q4'ökG˜r<ô?†¬H”VÇŸJ'JX¿3AO>‰.­2I RhÖù,w‡uon%±/½QñîSüîžgHz-u"+€xÉb^*éÀ°áýhŸ!ÈnÅ IDATȧï÷Î"wÍ"Ö†GA›Z¿Áåhk%/£¤¸„²XHjN>ŽivÀ©QÛ¤rì sèœ]_¡¡qM|ÓR^ÛÙ‰ï_øZ§D[ôbȰnTþãŠc«iÞ‹³»ìbÉâMÄ䎕ü}CKN=%S¿ÁWÓÚ¤†$X?o.ÿÜ#ßΪ…ïk×™VÑúù†W_cíöjêÂ:v½È¼·àØm=Km*§µÛÈã]ȆŠ:ÂdŒ×RRmß“òÖóäËÙV߱й¯&û„S)Ü3ª ã=û2Å5!„5¼¿r-µmwo_ƒëîÇ ÙkøÛüÕ”×…Ä·¯`îüb’M9hÂëæ?OQe²þÇÃÒ'Ÿo»Õ¬º8Éhs hž¨(eý{»<$é#iöH¤‘››¶;d¤¤¥’’•Gfd_פ¥$‰×aŒMKŸàÑ+ظ£"UUDOŽ“Ü{Õ©aÝ /)¸˜Ëú¶%ºûB\·k »âk™yÓDfí]y±°ÊX’C}н©õ\>3~ж¦·Ä•£jyrþ®°‚ì'0pøHÎîœý‰0ßຢßhoåT§·¦EúžßHÏkCFM Uu»‡¦ Õ r8îìîÔÎXĆ¡íÉ}}!¥§sEëTêÞiDý&[:ôDWKyyíÞ;a"F]$Zÿ¹ƒ öý.äâsûСE$“¤fe5ÚèYŠ”œÖdÕle[õ'ï¤d·$3¶±½k'¶s+5d¥Éú@[Y•Ø·}uq’)ÑF}."%«5Ûù°6Ü;!Pµ½ŒXøÙûç°ôÉçÜîF ß6ÍçþGÒøþ qÜqy•ÿÁssf± ¨ÒsB’Žø ß” Êæøã#kè=þ—\õÍæDƒÞyà—<ø‘ð–EÏ¡ãó÷sïiüâŠÓh­ Í2º3üöñôÉ>üÑ®©õZ>QÚ@[ƒ Žî?œqý‡ƶóÖ¼)L{p]nAÇ ‰Ûß›•ßÞì–dÆÞ¯éR»s+5-ë©yìY|;˜ÆÂÕ}i¹h‡ö¡E Ö$‰×í 8ñªêýîÌ4½MÚ?”BЄ¾Kmw6?Õ••“ÃÔwˈ‡wÅo¸¼ 5ë*¶Q•Þ‘Ö™k?– ëŽG×ìb!–׆Œšêv‡¨®j5­8*-€xDÈjÕœ´`óîmOOFˆ¦ìXF³2?ùÆæ>ùœÛݨ}Öðþ’9LY2‡ ½ÝcìåƒYpÝlÏIÚÍ/ókÌõ%^EmJ.ùms‰ßò: Þ¬Ú7¿§33;rþ„‰ ¬y‚»ÿðwJjC¢ípzÛ"³”÷*ë LRSVÌ›+7P‘<ômkjý†–o¨­‰­+YöÎf*!AZG5K'D˜[?¶G úÑ·ùzžš»’â!‰o2ï‰Õd}g¿[þ‘^Èi'gò¯GþÂKU]9»G.AcêG[Ó¹u5ï¾QJ,„°¦˜EÏÕg0šd5e5)4ÏÏmô CÍ"­®œÒ-åÄCˆ¶=‘s{dí{ckDÍø¦WxyK.1€ÂìA$¼](È ˆ—,eYY'†éMËh@j^_تåMxÔê â›–²¼²+ßÔÜ”€h«Þ >¯”=ÇS|EÛ2ùfÏ|Ò2 0°óÞ;~Ÿ[Ÿ|Îín̾OmÓ›¾Çµ#;5 ¬­àÃ]1’aÒóD’öŸÐ² >—‘§Nç‘ۯ發\2êHçÎÙèãhAF!玻†”?ÜÇ=Óê˜ø_g3pü8‚Ù2éÚ”'"¤7/ kÿatèu8ö`~Óê7°|Cm c¥,›=“¥»H©äôbÈO/ 0 Ÿ˜–nê¶5FZ!CǦöϳ¹qÜý$RrùFÿK™0¬éM<ôóû õ3QvÒ%tÝsÇ ¡ú‘æô½ô"Þžþ{®=—£róéÙ£é¯yžz˜ÛÉŠ¹‹9eôÍLPñÏI\ÿ§ƒ?F³^è_ßÁù;Ë©þpEE•¬æô·ùÈŸnK”ðìäiDF]ÌÏd¬ Á®KyxÚ:JªŠyjò Ò.Á­S®$µ®œ/™É¤Ç×sXòlíFþ6u9—_ÉÝS©Úü/¼ò.ÕýëC YƲ™ñ­1Wsljå|X^Êo®'vÒaÊ>¶]Ÿs»±ïo~:Ÿ¾#.et~3RÃ%«˜ûÐÓž'’´î ÃйD‘ÂÊ•L»~-&ÜÊ;¥}mÛ1fÌwæŒ-Ïü·ô[È w-b§Ð_+Ó§O·$}ÁW éˆLñµ”.~š5y§qFašý¡/í-8çÇÓµu"dœÌ° Ú±éÕÕ”â%I ðÑyªW1éÚ©¼íÂà«Î¤g¾DÑVßaäø+ÈÏN%¨ý€Õ/?Ä/o£Î®‘$5ÀGk¤¯9­‘¾|´FÒÍGk$I’$ƒ¼$I’$ƒ¼$I’$ƒ¼$I’d—¤#]jCnû=zfÚ’$ƒ¼$I’$ƒü—/LRç|J_-A„”à0,#IÒ—èˆýS8L¼ŽÜ ·1²c€š·¦rÝÃí¸æ–‹8&¥œ·æþ/¼ø6ÛcIÏ£ëãw^©@²|5ó™Íóÿ*¡2Ì$¿÷ù\ú£tÎ ¾‘97ÞGñɧ“õÆ ÞÛ•I¿«Æp슇?Qï¿Ï+ð”vksÎ ÜÐo)·Ýù<[ërúŒåö‘eL¾ñaŠsOä¢Ñqj—<¢‰2Ö-y‚??ú›kCÈèÆwþ˜òI70kC€ŒîWq×%›¹÷¦Çx ¿u"…¯.¤ªgŽiVÍÒÉwóÔûñ}=À2œK»±—|zÝ Ò#¹Ý4jç_@vPMéÊg˜ù—ç(ª !’K÷!?fÔYߢU:$c;Yóôd~÷l‰€$É 8Äß{–‡_ ¹àW“9¥m*u›)Þ™Sû"QÊ‚)SYØæ‡\sßÉ[X:ã>¦ý¹ ·\Ù‡fÉÖ®€_üÏ-tÉŽP»ñQn>@=Iûl_þ"ÅCÏ£oÛ—˜W’€à(zœÕ•Ê×î¦8Ù!~ÂñEâ–IË)ËéÅ~>†«‡mãæYëˆ5f‘ ºô{µ•I‚Æ,“ÑŸ5é5ŸsÇ]Åé[ÿʽ_¥$lK¿Ñ{ÙVnº5ÇœÇ%g<}çxoI’ӎ¼ w¾$é3ñÑšR¢Dâe”—P IÍɧÓ1͈ñ’żTÒaÃûÑ>3B‘OßïEîšE¬¯ÞS •cCçìúî|J=Iû$ËVñÂÚfô?¥=Q Ò¢7gvü€W—Bû~œ”·ž'ŸXÎ¶ÚøŽUÌ}|5Ù'œJaz#W&X7ÿyŠ*“õ?~Öe"Zp gläñ9KÙT$¬)eÙß^¤¼ë:eBX'mNAaÍÓ¥¬o—;_’ô™8# Ni?ˆ+GÕòäü)\ÿ`ÙN`àð‘œÝ9›º][Ø_ËÌ›&2kïoÔ ©Œ%! i俦íñû´zçvζ³¥½!º‚w^x‹´ÑèøÔ&ÊO<ü’…<°-AÊq-ÉŒmcGlO´‰íÜJMFY)@²1õk)/¯=x8oÌ2‘Ò¬-Í¢]¸ô–û¹ïIŠÉNØ4ŸûIãûƒÆqÇå9TnüÏ͙ł¢J÷¿$É ßXÑH’xݾP¯ª&±çÅ ƒ£ûg\ÿᄱí¼5o ÓœG—ÛFÐ>§5Í2º3üöñôÉ>ÀÍù=ÜîÿÒ§Ô;÷®Ò¾Mõºùg8–Ó»-ãƒ-ØðÔ v$!µòªÓ¦Ez±HËkCFÍTÕ$‰'#D÷~:5 š•ùÉ7¸°Q›±ß¿YwϾb»jÞbί'³¢ò@+«áý%s˜²dAz+ºÇØË³àºÙî~IR“±Ötn]Í»o” !¬)fÑsEÄw_w[W²ìÍT&B‚´Žj–N$ˆÑö8½mÎYÊ{•u&©)+æÍ•¨ø”YÁO«'écbżüj5Çúgd­á…7Ë xÉR–•ubèÞ´Œ¤æõ`ð…ݨZþ Å1 ¾¢m™|³g>é… Ø™è¡~ëLëÆ7-bá–Î\<¼Çd§@!£y!=zw$'©mzÓ÷¸vd§„µ|¸+F2Lºß%IŸÉ;#ß÷Ò‹x{úï¹þõ\ŽÊͧgN¤¿VÿZ+eÙì™Ì(ÝE"H%§ C~z…Q€|ŽG0ûQ&];ƒòD„ôætí?Œ½¼®O«'éÃ^J—,bÛùÑüµ‡Y³gV»¶˜§&Ï í²Ü:åJRëÊù÷’™Lz|}ý]“e,›ùßs5wœX·奼ñæzb'âæ4µn¢”ç&O!q1~;šÜÔ$±²Ö,yœ« HϧïˆKߌÔ0AEÉ*æ>ô´»]’ô™aú-çÒר˜1cþ³Þ”²{3öŽ‘ì˜t#]_ëÖׯôéÓíI_(ŸïôJñiäŸr]w¾ÌKņxI’Æo­‘ôÕÙ‹ ¿½ŠîñµÌ›úw6'ìI’ ò’¾úªW1iüûA’¤FòÑI’$É /I’$É /I’$É /I’$ä%I’$ä%I’$ä%I’$ƒ¼$I’$ƒ¼$I’$ƒ¼$I’d—$I’d—$I’d—$I’d—$I’ ò’$I’ ò’$I’ ò’$I’A^’$I’A^’$I’A^’$I2ÈK’$I2ÈK’$I2ÈK’$IyI’$IyI’$IyI’$IyI’$É /I’$É /I’$É /I’$ä%I’$ä%I’$ä%I’$ƒ¼$I’$ƒ¼$I’$ƒ¼$I’d—$I’d—$I’d—$I’d—$I’ ò’$I’ ò’$I’ ò’$I’A^’$I’A^’$I’A^’$I2ÈK’$I2ÈK’$I2ÈK’$Iy»@’$I2ÈK’$I2ÈK’$I2ÈK’$IyI’$IyI’$IyI’$É /I’$É /I’$É /I’$ä%I’$ä%I’$ä%I’$ä%I’$ƒ¼$I’¤/J†ah7H’$I_/ÎÈK’$IyI’$IyI’$IyI’$É /I’$É /I’$É /I’$ä%I’$ä%I’$ä%I’¤#ÏÿÂï„ÇçH!IEND®B`‚142_add_datafield.png000066400000000000000000000532641516513262500337060ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/14_fields-for-interfaces‰PNG  IHDRRõ=.¸bKGDÿÿÿ ½§“ pHYs  šœtIMEà;äzëH IDATxÚìÝwxÅâÆñï©é•Bo¡„&½)R.ˆ ^AQPùY)ׂŠ]±¡Ò EĆ H±‹HðŠ—&M”ª”$@z;u$@@R ø~žGÈÙ33;3»çÝÙÍÁÄä""""Rbfuˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆÈßÇd†¡n(a§MY©N­H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚Tr°ë½A ù0g©^×ÑeŒÚŸ¾}úóÔw{XóÒ]<úm<ž"«ÞÍôAƒù ÎYh½—ÚpûùåcÆ¢¹)""rɳ–ê]žD¾5„·æ©i#ihº`A,Ä5}ŽOÉMBùô*|e-¥™}èÞ<š±MËÓО 3R˜¶.ާwf®ÄGDDä|>h©]›×Cyxc*É'?W-~ÜÓ¡å·ífl¢›Ò|Ü–*H¹~aéŸÁT²oeÑoi´hÂ…‰R.Râs鉯)·¹Út§Â5¶~Ü}s¦WuðÑšß¹ÿ`&É_ÚשÊk]ZÐ)| W§¤0%""R*ÕëÔãÝ*P‰JÔµl¦ÛúT’Í~ÜÛ­9Ô²A=_l_nåõD÷ÅR.¯ü‘Äè;ó o-ÚHrÛ΄› ²â¾%vÂg¬O0Ѩ;×z!ìä{‹z=#•ÕoŽäíÙ¸v`à'¹kPÎÌL*Þ3‰·nŠÂ¸Ž­eΔ,ÞšˆÃI³›1´oBÎ,¬øõ^dµÆ0¹jÍÿñIž¼4œÍÎã),@ž­uŒ¯è枈ˆH©X|¹.:Œrùf ¤wÍ@¦Ï÷ú… RFÆüðk&.džôŸ† 0\N c+þ¼…~åðÍ9A¦çdÉnÒ“³ñFåíC¯—¸O‚" äÑØÁÔ÷9ëEÇîÓÛ•q½eiq²™Wë~0‰¤3c"6üÎÍÍø(ø]:N¼r”ˆˆH)C¾ËÉÍ9Xñ=ùÌy —âs¶D·öR7/b‹©Ã'LeÊäÉLž<™)Sß d~^º£FgZëø~s ^Àuä¿|û[ö©å2{¯—”OÍë¸Öw5Îß@¢Ã¯ƒ”ƒ[X¿+íŒg¤ÊºÞ²4]ž:1L«ï‡ï¯˜°áäûŸ~¥ÎÂÃìðè8)6m¯:¢\)<>o uó?3Õ² 3£K÷ÈO‰V¤~]´ƒÀk_ u•ð|ú¡t¾¥1Ÿ¿¿„ÝwãîÇo vÒ JphMbš„rüd4ðkPèë%ORµé÷ü0ÌÓfðø€×ÉÂNh•†t0„ù#IY×[†NŒã†5¾,ïÒ†u2ëÏ,2ì~\]»Í¶Ñlù Ž)D‰ˆˆ”Ú¯›v3¥Fc†øŸ~°Ü8¾“«Ã/Ý£9°‡‘ûœ¥*Ûd†n•´Ó¦¬,ë©P±"O^Uë"| ò:ùãÈ1&o<Ä÷i^}툈Èy²øqµo?§ä°ÜDTd0~I©ì+å¯ò+H]AJDDD.GúG‹EDDD¤DDDD¤DDDD¤DDDD¤DDDDDAJDDDDAJDDDDAJDDDDAJDDDäEßl."""RJZ‘QQQQ)))))QQQQQ))‘KžµÔïôå›‘ÃøäàÉDÒûí‰ÜYÃVô{T~~æ>&î¨ÊÝ“ÞæßQ–óßÀppäçY¼7o%ÄgcP™[FðÝÇ[pÿ~“Ø»ka+ÑgñëK÷ðÆV¨ÈíÆÓ·ŠµlÚ,"""—¥R¯H¹þ²ƒù’ÈO+âü›wÈ“°„qï,â÷¼åFx…Hm&¶ˆˆˆ”©R®H¹8üßå9ë§'V-cßµ©çó÷íóØ.âóþÔùe¦>Ü_À“Gµ°ëpa¯RÔy,ʼnˆˆˆœOrdÅO‰¹¶DÓ¥þ!–ÿ‘)kXw7õúÞÖÈbï’˜¾àgv'»ñºŠîýo§Ò¹Ê-ɶ‘ÿÖ[®ôÏ3`Å_·<óÖž—Ì=+™?ï{þ÷û~’€O8µšvâæ;n¥} ]Ë:¯6‹ˆˆÈ?.H9öýȪy9ªÁ ôºi«ÿXM6é¬[²“¬†MñÀMüâ7xæým¸òÞ›¿…¯Çn#è/7K²mYñ’²n*O½¹‚ãy?±ùÚpå$±wíŒ_¿™#oŒ¦O­‚ÂÔßÑf¹T”âã>›=ËV“’£¨ß¥1Qõ:ÓÄ7÷Õ¬_³-#oU({sçœ !´üï׆“wÃ{¾Áì X°`3Ÿiñׇ˳w0ûݼÔŽaï|ÊìY³™ùÖ]Ա޽̛¾’cž‚ºâ|Û,"""ÿ¬ •µ‹ÅkÓóÞ].B0û×£Kã¼øâØÌâ­é€óÈF¶e潯zoúwªIh`9ê÷ÀõåÏ,¶$Û–ç¡ÿ±)íä_öóý¤—xæég=í'ó“±g û² xÿßÐf¹lƒ”AƶÅüš•÷×J M9ȃÇð­_5ïö—‹ßo&ÅoV2'7µ–«HðÉo°†R9ôÌ’K²mYñdž ãä_GÙ³k»víbWÜARO5,“Ôœs//ým‘KGÉž‘2ÒÙºxŽ“?´€Ñ#ü5 ü±˜I×Ð!  pg¤‘c€Ÿ ðf“œuV¢+Á¶eÅNØš?ÉôQ­,Á·$üm‘KG‰V¤ŒÔ-,ùÍUŒ w²dýq,›Ó ïg»²b¿ƒÌKXvøÌ·ØK°mY±WiO³ Ü?»6ÎdÞÆã¸ gÊ>Ö}3…Ñ“6QP&ú;Ú,"""—Ž­H%møßóž²5{ŒiO·#8ß NÖ–ñ ý YÀž%kHìÖ“ÛïhÀš÷·á2ö1{ä=|îKzRÆÙ…û5(þ¶eÅ/†;êÈ–·"‰#|ÿú ¾·ùákd“ãÎÛ¦A‹‚ëÿ;Ú,"""—Œ­H­_²3/ øÒüú&uÌ¿^wÚçýåà2~9 QÝŸâ•:jÜd›*ÓùþQÜW篙®øÛ–Ý}˜qo æ¦Vµˆð\Ùä¾GÖ¢ù¿ú2øözø’C/~›EDDäRa2 C‹'""""¥ ¯QQQQ‘¿(Ñ÷H%''«ÇDDDäŠV¢íõõ""""¥¤[{"""" R"""" R"""" R"""" R""""¢ %"""¢ %"""¢ %"""¢ %"""¢ %"""" R"""" R"""" R"""" R"""" R""""¢ %"""¢ %"""¢ %"""¢ %"""" R"""" R"""" R"""" R"""" R""""¢ %"""¢ %"""¢ %"""¢ %"""¢ %"""" R"""" R""""—4kI6ÎòªÃDDDäÊå_Â%&­H‰ˆˆˆ”’‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚ÔÍut“†÷çžÛúóâÂ=¬ù.žþ.OQotìfÆÁÌŒsžëEâ¦â±âp–UCó×WhÝrI+ë±Ó\P_iüÎÚn;ï ÊÜý.Íùg©ùCûp÷m'ÿ»ƒ¡¼Àô¯7qÜUœk't„ƒ½_ÎeïUÏ1mî§¼xCuª_?€k)Ïwü.Ã6YËÓæö~´Š°\šå]ªãu)Îs×Åœë"e9u/|6ê ŸÊÓíqg%qxÛùêÃ×xvÇüúx'Ê]ÐcÆEjBÁ#ñ1åîndëîDjÜåB±„R¿cÇK·¼Ë™×ƒa¶`Rۯ̱Õ\©‚™ÌÌ+>A‘ÔjÓ‡a žù)ßímÏ=µ³ùíÓ‰ÌZ±ø 7¶ˆFt½w8·µôcÛä·X™”/=À/V_¢¾Æ£¬ü~ÎíÃ9#“©¬{k$Ó¶gãÚ=‚Á3s× \™™T¸{£oŒÂ¸Ž­eÁÔ,ÿ=‡=’&ÿă}š|ÆdÇ}Ë´w>cc‚‰r »Ó%Ð ay/{N°aÖ>Y²ƒd· {H4ÝžxÛ£}Î:Y¤°¯gµý¬ºsö/cÆÔÙ¬Þ—A5hwûPîéV쟞eÔòëóRGB\{˜=âI–VzŒØgÛèÜɇLÄ÷± ÜYÛž¯<7G¿ÉK[oeÌs×bÈaÇÔaL5=˜A1pÎújà›½7‡Ìáª7ÇÐ=Ò8Øõî0Þ xŠ×徭íŒvg³õ\ã×1gAåŸãSÆ•°šïÍbÅÖr,Tn;G‡v¦¼£ˆ¶œsLž Á7%l“s;ïˆÅÔ³-'¾ÿžmIvjtʰž.¾ý€qiø×ïÍð'î ~ )÷¶Â#ã0?:‘[Ó&ðä¸Ídç£ÇéÂSeo¾Õ‹rIÌ»³—Jó•wWÕ=¼7b"žÎ-Hßð; )iXêöeذTõ1åÞò1ç5MHÿ}ÉiéXëÜ Á×SÍ×Y…õYEvœs¼Êýeõ¶À1±4WOöcAmÏ9÷\i›Èû#&âîØ””õ¿‘àmÈà7†P#¾€:ò7²XÇä<òÆâ̶?L}ßË|~ŸÁÍ‘Ïç¥m}yóÙ«OõßÎw‡3ÙûÞT™]ïÎÕ?/]ÇÚQys½VvçJ/)›fòÚ?²3ÙDTÛþ<|ržŸ=_ :ÇÅŽúž»k l»½€ÎÊÞÁœ7>æp—gˆ}­ìúœ·_{9U&2 º9¡³Ös0»# Ò¶³ÃŽÏ¡_9ähGôñ­ìrÕf@%û_†<²}W"¿YÌoÉíén†¬¬Øh¡åµñÍÞÁGÔ7°FIFÙÆç¿ìíîÏÀ~g^±;âXðj,›®Áè'ZiJåÏ=Éøã²þÜcD­’¶©6àJdýÆ žxëSªe¬dâ¨ñ¼²½ · ŸÌåãYôÒs|¼øZ^¹µÊ”ó'ˆ•‡Ó·0cÔ8Žü«%å<…Ì»öa…ßvvgËÁºŒ~õÊó'ß=ó 3~iÃÓ]òó8[ö×ã•W†PD~~óIÞ™[‡Wï‰Æ§4ãõ׎-xL ™«kÞösÖíHçq6í­Íè7"Êž[ÇG…ÕAIŽÉ |,œÝö’ôåe0¿ÁJ…v(÷íR¶¥¶§]¨ ²ãX¹š=V_r ?ßÝ?Ž8Ö÷\éJdíZžxëê˜vóÍ+£™8·¯=Ï 9Ç)Wüó¶HaþžG…,„ùƒ#5¯9„ú×¶¥f¸f³U:ô¦}à~¶-àI·/ìd´ «ÒšsgŸf”³™ñ‰jË-7—g÷ò]y«'·[ÁfoúvÆÏl!´Ion‰9}f4Y옲9xà(n3~QÑÔ µ”IÛû—³ÁÕŠ~75 Èb!(æ&úµvóëò}xË7¢žm/[Ž8ÈÚ·‰Ì˜Þü+t[¤Çm$¥R+ªúž£ûË·á_U²bc^ 2w,a«ï5t¬áSh}eñÔEIÊwì[Êÿ2Zp×m¨àcÂd¥ZLM‹1k‹=&Åi“9˜æ·õ :È‚=ª5×Vk³^\]Í‹_5Z]IòŽ |ìÏÀO±ØTw÷¨‚·˜óîÜ—>¡´¼©-åm€-ŠÆWslDZÓu›izs{*Xk$­nnJÎÚÿr¸¬ž}/dLŠìÇ¢Ú~ÎsEÍ{u ÊnLÅž?Åÿ z,œÕv®Àùm©Ð–‘{Y¾9/½{[­méXçèó]aýSÔ{M~4¹í&êY°Öçú;š‘}Žy^Ø9ÞQ‚>¹äV¤ðd’œ>!~˜Löþð1³màÏT7&³—ìL3mœFwºJ¸}!¼iñ¤¥ogÊÄ–w®LLÕ²pxÃOo—yG`cBNö–É—rQ§nÇÙkßÆÃ·ÏdþÇÏðŨԲ'wÜ߇&á–ón{nÝ1„œºof#¤R έéx|Ñ´z6ó·¦éÁxÊ·mN³ ™½3žè-G oM๮nÍåhz]mæ~·Žã®áÀ¿tm?*ÙÀUX}e0] ÝŸ³·ÍH$'(†p{Éë)pLJÚ¦`°øæo9ù †ÝjÅ/Ü?ï*Ä„ÕÇŠársÎQ4²‰›?†9)ÝyòÑÖ„˜!»Ðy…}š} ò=½ÅjÆëÌW·ÅŸðk¾k–røf!ËS6‡nacRd?Õö.ºÂý-Ŭ#¼èñ?û˜¼ÇÂYmçJœß–ò´ìÅW?n"¥C[-Û‚O»ç¨êSŒó]aýSä{ƒ¨zºã¬!QøŸœçæâã½5‹9GD.Å åŠ_Ǻ„`bbÊá=0Ÿ©óŽÑíùXFÕ ÀâÚËìGF“rêÒ Œ|G°ëÀW…o_’å¸ÀH‚Ã#yxâ`êž}ßñûôvåðÉ9A¦çd¹ÉHÎÆu²D_?˜QׯDz‰/ñî¬FŒÞðŒç6JÓvs@>GIuAe+€‹Ô#Ø#‚°àGõV8ñã*VçÐäÖp*V#õëU¬Nð¥^¯ˆž½2|ÕõÔùx.kwùñÇî:¬„ðVŸÉÍìÅsêCÙ‹#ÃPØ¥ó™ãWøþüu|ü2‘ì<¹mþrÍ…·¥ 1yÈz^m*aì yí»¼³,‚þ¯÷¥VÞó…λóåNçh²&À•|„ ¿ü-€Ç\ôøÕ7”`Lλ ªÛTŠ:ŠyL^ðcÁTº¾¼<æ7€…r-»Ré³el:ÈÖßhû|UlÅ=ßÐ?E¾×“NBªòžÌt§Æ“uržÅ<ÇáÅš#"—À­=ÃëÁëqãÈ8Æþu_0åÕ¹¤4ïϵìx¸|"¨é©[±:Ñ×:?B}²ˆ?–uêØ(tûò©yí}W3kÁŽ9 ð:H=¸…»Òðæ¿ú«Ñ™¦Æ:–nIÁ ¸Žü—¶fŸj“ëÈZÖlK Ûc`ñ&4ІÅlúË9¢4m÷©Ñ™æ¶uÌû~;2o…æ]jbÇLP¦„îý–U9õ©_Ίoµ–„Å}ÍšŒ4­Tð¥®)°!]¥°hú§ì‰êJ« –¢ë³W ^¹lÞvàŠÿ…E[2Ïè«3g×_ǯðý9{|ºÑ.`³æ­'Ña`¸RøsÇ~2¼@m)pLγM%á<ø-±ïî¡Å†Ó!ÒRâyW:Ùlû ;Ó=xÒw°hÎfü[u ²½è>;×xQ‚19¯~,FÝ%«â“íX(a_^óûÔÐ…· SµC,üdÛ‚¯¥}ÛyŸ«‹|¯‘ÍÖy Ù•îÁ›¹‹%ŸmÂ÷äý5…Õgò¥Ó}7ñ{ì“<úm!‘ iÜ ”Ä‚ê8×øu-|Îì°hú<=ï»ðô]cpZ©Ün Ö©A ¥b¡m)pLlFÉÚä,ý¼O\½”¸¬¾=˜_NîR­<ÿl÷bÍ»R±EÒ¶]Ÿ¼›]IÕvÃûå=€[DŸ{¼"μÚ*lLüΣÏUw‡ùê(î1yÑŽ…sž.çù}F’¢Iך|4iQw\û|^iÏwÅ=WÚ"iÝ*ù§æyÿÓó¼˜çøæ‚æH‡~þ–•1í¹¹E¸R‚½˜nF±.ÊòªÃ®$ž£_ñܨ-Ü4áùÜ߸‘Ë›c;ï˜LÈSã¹½†Mý¡cADJÁ¿„÷êôßÿTF»-!µÉ4 чèXб "¥¡/Íø'~n¤¬bÌð ì ¾š{ŸoJ€>;DÇ‚Ž)ÝÚÉ£[{""""‰‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆˆ‚”ˆˆˆÈS¢´XDDDDNÓŠ”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆˆ‚”ˆˆˆÈc-ÉÆGœê0¹Ç'÷ÕÇϤa©bUá¦áÜãêdm²X1WûGtdÚ–oؔݘ&¡éY³˜8¿k¹öª0Í2)>K( :u<™GÎ׃q±Ûïõ`˜]¤&äÒ)_…(Q*>“ÅŠÅj=}Õë:Īi 0õ~˜«+Ùð¤ngýÂ%lߟŒËFÕ67ÑéšZøQŠóÈjV~½‚ý)&«·$Æ×€À*u`å»_àmZ—œÝûHËÈÂT¥#ÝnjM¸ÝÞL®øœÕ¿ 5Ûƒ%¸& »ßBë:Á˜Xùî—кë×r$ÝFD‹^tmåæ·o±ãH&öªèÖ§ ó.« Ú‡à&×sÕÎU¬]¹›CxíØ¶õ¢®“‚醶_ø=[“ìÔº~(ßàâ뉰4.€ú½yü©;hh rö/cúäÙü¼/‚jСßPî¿®~ÎíL6w—¤ÿú;GSÒ°ÔëËãÃ{PÝÇ”{koÄ8Ì¿N‹¯ßbYR ¼ðÿµúR÷ÿ^cT§pœE”íêÔ””u¿qÔÛ¯ÞxæŽ8 «?‡Í“ÎUg9<ÇÖ2gÊ oMÄa¤Ù̓Ú· !®³êtW¥Uù},ßžk÷ΩN¯çÿC•Søpù6Žf¸±E4¢Ç}Ãéß* àJXÍìi³Xú[9–ª¶Ȩa‰´€« z¬›9÷ï ÉmÂMϧ^ÐD‘Ë;HÊu”Ÿ}É¡è¾ô½­6¾éÛùeöVF ¦{ü'ú¬Y°’ìVØ& ÷þ¥|77 o‹BÊö¤r0± ½ï¹`Ù<ãCVm‹áƦÁ˜[dKº<Ðrþ)[¾ä»oRaP?j„-„ø IDATZo ûãüéqßÓ”ËÙÂÒðíŸ14ÿ÷pî Iâ·Ù±jcn½º<æÂö¡z‡ö%à Àƒûöp¼j8•-šeWW"k6ñÜØO•±’7ŸϳÛÚpÛ&3§|<ß¼ðÓ¸–·ûTÁš½ƒ¯}ÌŸÿz†÷ߨ»>çÕW^㓪y°6à<ΦƒuyëõˆäO¾õ ÓWµáå•Ë÷Т?M‡Ž¤ëγn³eo/²ì_÷Öæ­7¢’pdË_.> ®ÿœu:÷ñÙ+±lnñŸ¾Š køàåñL®2ާZž£N#ƒ†Ï á›.y½K8&o*Ûª_ÇÆ=IÍP/‡–ÇòBì{Ô›ü$mì{˜3:– MGðö“­©`JåÀžäÜÛÎ}Ì/ ÞG"æóÁš(œò"-à +~G|­|¥™*"Y>lî&þ«·ù`ÌhÞ3š>ü/Iùžw'l`gvÚ^S‡@«kX -Ú…’¸åù1w%læ 7†Ö-*c7[ð¯ÙæÕlEìE 5ÛÄl¬áT©éOúá”Ü\ÍTlÜ€òvÌfÂu Ú'žC§@õk[SÁß‚5¬>õʃ¹öÕÔôÁìSZ ÃÈü3wû“p ¿æ½éÒºå[÷¦K‹@R³4î˜#%˜V·÷ n{TkºTkó^t¬æ‡Å¯í:D’´#'àØ¿œu®VÜõï[,ÇÜÄ]mܬýqNk(mþÝ–H`‹¢iÓ`wÃUŒfY¶%ˆÖ½:PÉn‚‚žˆ*aýŽýKX™Öœ{ú6#ÂfÆ'ª-·õ*ÏÎå»È*NætlKípÌf?ª]Û›ûÙ|Ô‰cßRþ›Ñ‚{ïlC” “=”15 2^o¶ÅŽ);‘ýû’î6ãMt¨.ZDä²^‘²P¾ût«“{£ÎdñÅÏzìÔ«Þì$r²°|ÚØÓéÍë€ò9¸½A§¶3©¸üjáwòœh²æWxâ3ÙñµŸÞÂl5c¸ò~OÈÈáØ†X½~7IYL&/Î3µø×jImÀå®Dì£ùuå°ø7)Mì6+þáþyóÀ„ÕÇŠátcžŒãäÆz*ÿÛ­ˆck:n‚ÁìK°ïéùj±šñæ½·(E–m  \@¢„õ{RãIMß΄ábË;0 W&¦êY8¼Å¨ÓÈ$nÑÇ|üý¦º1™½dešiï0ðä$’C9{Éê5jÞÆ£ýf2û£g˜{ª´êÉÝè;¤Dä²R&,~Áûç{F*ÿ¹;ßÀPºú7QgŸ4]‡N—â‚Í™†Ó XrWºé¼¥|ÜÈ“¸ŠN¥ÑC¹1ʳû«§Í¢4kE…îÃɵÊh¦yõÏÎ\øf%ÅU­¹BÊ‘ |"‚J~À™À0JX¶é¼å3ë Š$$<’GcSßçìåªíEÖé:ðæ£ç‹±¼T3‹k/Mr^Ùþ‡HržÜŸbÖ ”ë1˜{ ÆÇ^â™4ùD䢻h_ÈijI]ŸmüoÕ.Òœxd%îáÀáL¼ù·«Ð”jìà÷½xOÒV~Ûï(õo®<–ÂB}1ã%kÿzö¤zÊ|DNò©Ñ™V¶u|ºpéé;òéZ ­ºÔ¤D_(`ö#Ì'‹£‰Y§æ™•]’:k^ǵ¾«ùpþx¤ÜÂú]ig»ñ:3pùDP%Ò R~[ĪDw^ÙÝè°æ®'Áa`¸R8°c?éÞÂëuYË/ÛÈòXüƒ ´a1ëWEäâ»x›Û*ÑòŽ[0-ZÌcgãĆD êtþ7Uó_ ûT§í-mXñÝ4æýˆE¢j’QÚ¬x m£ç²bZ,~!þø–¯NÅ`k™ïCuÍ%9É/†{FÝÅ{“ßà¾Ï20kpÍ€Q là‡ÉY²ùÖ©W3~™ú}ÇûPÿ¡ ¼Ü­ŒÊ.Qµé÷ü0ÌÓfðø€×ÉÂNh•†t0„Å –µ{sw³·ˆ1Œˆ`‚«ÆÐ0"ïÞ¤O4w<;ÏÔx¤ÿœ–@ª¶Ȩ:5ò)¸ÞFæ}ü8e ïÄgâ1ûR¡qO†Ü[×~Òô‘‹ËdF±{Ž8Õary¨d/ÞÜ­üþÊS6†tRÇ]æúôé Ô"—Zؘ²’Ã÷w*Öùúr£kODDDDAJDDDDAJD¤Tt[OD¤DDDD¤DDDD¤DDDDDAJDDD¤ìXÕ"¹LSVªDD¤dŸúBN¹÷ 9EDäÒ:__ntkODDDDAJDDDDAJDDDä²P¢‡Í/÷û˜""""eI+R"""" R"""" R"""" R"""" R""""¢ %"""¢ %"""¢ %"""¢ %"""¢ %"""" R"""" R"—<Çvf=<”o¸.¶ìfÞ°Á,ØãÔ¸ƒûèR>|¤?#ú÷çíEñx/òX»ã—åÖgÞ^´‡Í¯ÞÅëß§…³ƒýâ¥q`‘ Ȫ.)#íg& šÈ¾^¯õÀHÊ]2Gvyš÷í \Ñ©“ý_Ïã`“ç3°>¾¦³_ÞÉgŽÇúè;ô©m¿ õøzn¾úÝ@׈`L)‘+…)ø†Ïh‹ó³÷áIÜÝÀ7÷uws\"µ„}mG Z±¸ÈHÌ!¨C$>¦¿§þô„üõ[‰hÕ Œˆ‚”È¥°Øl¹ôØrï‹[mXOþÌ›û¿Œmó™:ö[¶‡ˆ–wqÿÃ=¨”÷ í>¾–ï¦Í`Õ‰8í‘4¸qý{7!èì›ìY˜2| ^C§òÀÁÞéØåÿO÷¯…Õ±YNÄÓ©™çXJæº}¹oH^]ŽÝÌ{|æÿL¤Om9{¾eæ¤ÏØzÌLxƒëh°ŠÕ¡Oðô=ÑØŠª«$í.ª]ÞT¶Í™Èç?mãX†k¹F\;p87µÇâØÎ¬Gc1õhKò¢ïÙ•l§j·¡ÜÛÃÅ“?à{Òð«×›û»ƒèÀö'Ž˘7m6ö§CP ZöJŸ…±cüH>Ù‘;nOÍ«N×g_ [å¼1%›íï¾Åÿ’Sà•Xoõ¥æ]¯ñ`›2k#•ÍãòÕ?;÷EWf&‘&ñDÏ(Ì…•uÖ>žçDa ºsu BuäŠ\HzFJ¤,¹Ù¸ÖF·Ñ3™ðîS48ð)sÿ—”›±œûøáX¶×x€gfÌãí1þy<Ÿ®M.úY˜s.dgÛŸu¹ý剼ðÎË´MüŒy'ëÊ/{;_Ž›OV×Wxó“¬,>VŒd7`¤Å“‘¾=ˆ5ïYÉ©jN/ø—ô²ÆìK ïé7™­f §ûôJFoæqrxò¹s“!‘÷1toIÛ]X»ŒL.ù˜/~ØÀ‘47&³—œL3Íœy­¶øâŸ×2“›ÕŠo¸ÞC×&,v+¸rË*I»¼™ÇqÄtj±ÉFPÅ@œ¿§ç®n]Âc]ø~†Ÿ¹ :Ù$“/aQè× D¤D®æÀHÃ"ù¿qƒ©UÔ‚ÉŒÕìÅsêSÞ‹#Ãá_ŠzÊá›y” T°†“´ÄL¼UŠWW‰Ú]÷Á¯øxÁ1:>˰X\{ùâñѤ]àþ4Dà“y”tT´¸H?š="¨xAÆqÆú|Êrì>cœ}rNí9yfw“™œ·‚Ž=‘ znWˆ\ö×ÑÊw5Ÿ±¼ÒþÜÂÖÝi}¦Ç^Úá'øcÛ ¼€;áVü–Yªg©lÕ;Óд†…Ë÷‘cxHÛö%‹¶9N¯\QW‰Ú]ÔêŠ3·=‚¨òþXðöû"6s_ðþ´WïLcë:¾ùa™™»òÍz ;ÕÄVäYÒ`Ÿ,Ž˸c]FeÙªw¦¡±ŽŸ~KÉÇ£ÿeÅïÙ:ôD.(­H‰\,>µ¹áéa˜ßŸÁ˜{_';Á•ÒúŽ!4<{[KEÚÿßMìœü$/, #8²!11¡/Eµ&¿ôzäV>™ô4O|j!,¦W·guqë*I»‹ µzÓ«é[Ì||AÁV‰!ºœíÂ÷§_ ½FÞżioðÌü ŒÀ´¸c·Ô÷ÃDzI´­ojÆÆé0"Ö‡Z÷M`ø5eض2ÚO“_zýçf¾û£„R“ÚBIÖ‘'rA™ ÃЋ\ñŽè ¾óq°ÿÃ̰<žûõêùUºÌ'B·öDDDD¤DDDD..ÝÚ“ÝÚ¹4éÖžˆˆˆÈ?”‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆ(H‰ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ‚”ˆˆˆˆ”‚É0 CÝ """RrZ‘QQQQ)))))QQQ* ®C,?ï»4‚rQL4˜âœoŠYÊØ¡ýéÛ·?O}GC "rI²–YI†“ãüÄ’Ÿ7³'!6BªÆÐªcWÚEc)õ'ÊŸ|»ËíCéYÙ–û3K( ;wÆb)“¦çìœË×ÜÌíõ|5#䜮î×"Š1ß;ywØxlO¼Ã}ÑöRÖæ`÷óˆkúŸÜW?“ú_Dä Rnޝý”iK³iÒó6Ž©H )“„¸¬Þ²ŸÌZM.˵/s 5š^uÞÅ$oú†ÿf5¦}@:û~YÌVÿkùw³0Í 9CƒN/NE^†ÙEjB!"ñUˆ¹¤™ Ã0η#k's'.ÀÙcšŸu¿Ðo»—}Λp"Ûƒ5¤&­{ÞB×zÁ˜ø*ö \Mj‘µ÷éYY˜«t ÷Í­ˆ²;‰›ˬ?2ÀÅN•î÷sGÃ4MZ€é¶‡éYÙŠ3~ ¿^ÎÖ£YàEãνèÙ2 WnÙžæuÉÚ¹¤Œ,ÌU;rÛ-­©`7客m_ÅÒÿÇjÑ®K7®iP}xÉY¦Œùñ‰ÜWu“†MÄÝ¥é¿þÎÑ”4,õúòøðT÷ÉaóØa¼²:|°úR÷ÿ^cT§rxŽ­eΔ,ÞšˆÃI³›1´oB\Û™4l"®NMIY÷GÝUiU~Ë·&á²úX^Ïÿ‡+§ðáòmÍpc‹hDû†Ó¿U8À•°šÙÓf±ô·r,Tm7QÃ:iWAõ'X7sï/ÞA’Û„=$šžO½À€h ¶ˆH ”ÉŠ”ëøº+Ñ£NÐ9ºÊM%ö -¹uH?¢ Žoú’¿\HÕáýˆ±îTvÅWeðý7N2›>›ÎÜå•r}e¢{ÝN‹?ϺµçJ;]¼ã Kf/æX³¬‰âÁ)/Ò2 ²â÷qÄת±)¡2¹áfä¤ã´`+`)Ç@õ«P)ÈŽÙìCd“4ö'î„;ïu?ê^Ýp ` £aûÚ8·ÿFb1ž%wÆob»»>]ÛW'Àb! z;ºÅxÙ±é(.K 1íc³Öpj×ö'åϲâЪ7½ÛU¢R»ÞÜÚ:ã YšRÄåG(mþÝ–H`‹¢iÓ`w£ éêØ¿„•i͹§o3"lf|¢Úr[¯òì\¾‹,K­{u ’ÝtêÂãÌã'„ÛR;ܳÙj×ö¦Cà~6uâØ·”ÿf´àÞ;ÛåcÂd¥FLM‚Ì…×›m±cÊNdÿþ£¤»ÍøGEª ‘¿eEÊä„ÝD–Ë»é\I‹Ãë~`ñÚÝ$fz0™¼ää˜ièλ«hö%Ø÷ôIÜì‚ÝyœoÑQÏ›“ŠË¯:ÖÓ»á‡so6^üÁdÇß~º‹ÕŒ×•û;PAÑ-i8Ý•¨„Ÿ¨F´Ôœ"/?| ö=kN9ÝtÜ“Ojúv& “׆+Sõ,Þ`°P. cd·èc>þ~SݘÌ^²2Í´wxrÉŠ¡œ½dõ5oãÑ~3™ýÑ3Ì=UZõäîúÐ,\aJDä¢)[D}ªY°1.Wýõ)wÂ*>_™J›»‡2°¢f÷OšEú©3~'Ò]X1îôãäØCð5ŸQLŸi!زOé†Ü_ t“q<{ˆ_±—ÛìU:ÐAsAÊŠ ò?yh Š$$<’GcSÿìGÛO½§ ®_1aî1z¾ËK5°¸öòñˆÑ$ç•íŸqˆ$'T=ëh.´^ \Á¼Øc0îÔ8~˜ðïÌlÄG#jüDDJrm]&ŸþµéÚ¹~;›E›’œí•¡­Ë™ÿÅVÒ9¸­!”óÅŒ—Œ½ëÙš’ÿ›qìY±šƒY^¼YYýã|ê7¦¼ 0ùhsp"ÅqÎ,ejJ}ËN–­9H–×KÖŸkøq‡™zÍ*bÓøÊE?¢üóÉâhbÖ©ùêSó:®õ]͇ó7è0Àë åàÖïJÃ[Œ"½Î \>T‰ôÇ‚‡”ß±*ÑWv7:lࣹëIp®ìØOº·ðzGÖò˶²<ÿ`ÂmXÌú- ‘’²–U1múó`ÀJ–þü±_gáµøS®j ­;µ"¤J5®«3—/'Åâduj„ä«ÚJ£†9,÷u¦™oЕۻTÆ`-GÓk¢ùý›±¼´ÀFµ›f`“|UûTçº;»²ðë9¼½"Ã/ŠF]ï¤{uLú¾N¹Øl•èÔ«¿L}€¾ã}¨ÿÐ^îV›~Ïù¯>~& ·HI\Y+R®C,?ï»þž÷ËÌF½ï3wî>™4Œæ‰_0nú&2Ô1àõ`\éu[BiЩ# B-¾ …ÕuAúÏEjB!5#ñUˆ)ùµOYôãÄù9ùt±U¨Óôj:µ­CèÅZ÷²„Ò°sgL!Å8¹þäÛØXnJÏʶ’¿_þqLf f‹ ÿ¨ætïR™EËö‘ânzæ´:¶–9Sf°xk"{$ÍnÄоM!•M³&òáòmÍpc‹hDû†Ó¿U8Ï ÖÍœÀû‹wä6a‰¦çS/0 Ú§àòÎq Tà¶®íL6w—¤ÿú;GSÒ°ÔëËãÃ{PÝ'‡Í“ÞbYR ¼ðÿµúR÷ÿ^cT§rxŠ(ÏÕ©))ë~㨷!#Þ|˜†¾'[âæð#yzë­L|þBM9l›2Œ ¦Gxgp ì_Æôɳùy_:Õ C¿¡Ü] ü²70zК¿=†"-€ƒS‡ðî®…ÍQTÝYqß;á3Ö'˜ˆhÔë½VŒ¾2 ‹ª™>bæÇ'r_Õ=çlCÝô‚ƪèöœ¹@´û/u]°±sW¥Uù},ßžk÷ΩN¯çÿC•SÎ=WWÂjfO›ÅÒßȱPµÝ@F ëL¤¥ýísÖÎä47œ…ÍcSáãzÎ%/Égòük?²=ÙD¥výydÈõÔðõ1àû·µY.IFY6a´ñþ–tÃíqŽÌ$ãÐ+Oß~Ñx}ö&#Åc\x·á-Éö΃Æ7cÇ 9 ‘¢|:¸Ÿñ̪4Ãk†7k¯ñõ¨Û;FÿÏHÍÙe¼÷Ð ãýÝÃpì5>ÞßxdÆFã˜ÓcäýŘ4ÉXŸä6 ÃmdÝmìNv^ÞÙ ,lÛœmFì=·wYi$8sçþÝe<³ìxn99;Œ©<”»%(ïÎÑKŒÃ¯aœãÈsÇgŒ¼ûYcù‰¼–fn6Æßûñþ®ÃÈÚf¼ûÀÆÈÏþ0RÝn#uÛ\ã‰;0Þý#Ëðfþj¼|×cÆw î¼’rŒíS0†ÌØc8 Ã0ŠQ·‘õ‡1åþþÆÓ_î62=n#iӇư>·|°Ûp±oYEþq>W 믢Ús¶sÔuAÇΛfüòÌãÉOäöf!sÕÈÙmÌxøcØô5ÆÑ¯áu$û¶í5Ò<¥ì׿Œ]!s£¨¾(Éñ’³Íˆx«qûÈ9Æinþݘ;òNcðG»œ¢æïEj³\>Ìe{ÅnÆl¶`÷£rƒŽÜ6 »~dÕ‘Ü[eî”í,ùd"¯½ø"/¾:‘Y+ö’é¼iìøá#ƽò/¾ô2¯¾ý>Ëòn¯¹“·±øä{^ÔÏ7“ìœøjìxüø-OžÈ¸Éßq 3ß­¹¼×ç/ýšÓ¦2iüX¦Ì_G¼ÓÄ}5— i©¬›1–1cÆñéæ4¼gÜÚ3pÆÿÊ—ÓÞäå_äå7ßåËõñ8ŒÓu¾b!3ßÄÄ·ß$vîZœ†’ùËÅŽ ÒÿÎ;¸í®‘Ìw^ËC÷·$8ÿBÂþ%¬LkÎ=}›a3ãÕ–Ûz•gçò]d™Chб-µÃ}0›ý¨vmo:îgóQ'&‹Sv"û÷%ÝmÆ?*šèPKá彈QÔ¶ÖPÚü»-‘6ÀEÓ¦Á$î8FA7±‹,ÏDë^¨d7½d)߆îU²tCÒÿ·w§aRU‡¾Æßªê®žGhšY&PAA1‰¢¨h3€SÎ9ñzrï}ŒÃ=WsîAqŒ‰ÇðT”8¨\%(@”yn¦nz®êªº‘nDôû{?Xµ÷Ú{­½víÿ^k³›8 *–¾Æ'©ƒ9§S µ«g3?ÚŸ«/ìIv(Dvñ\=°ŽÞ\Õ´‡Á²íÚÕsXÈØQ]I†È;e4—‡›T·êŽÅÁö¡±2wd>oðÝ;髵«^çíŠ~üdì@ S¹t*îLVðÈ´ëAûF#mq(çKý+¾c. gVˆPæ‰ü`l_ªß›u‘ÆûïwµÏj†S{,¼E1½òæ²dÍ.b­#Ì}úEVt¿”ëÇv!}×Rf<9•i-Ç󣜹ÌXšÏù7£GV€š›ØBt³Ÿz‘Ï»Žæ——ŸH^ ’-ËIÙsîו±|S~þóP D7ð}w ®Œå›Û3þº‹Èg' ÿú(Sf·e¨¶t½x ýÖí7µݵÏÙ±–מ}•­}¯âß®këßá™§Ÿáµ–7ðƒ¢ú²?ßÒŽ_\w>y”ðîŸã•O‹ùÉ©ÙöªãôTérÝï¸u`6áÔ,2RCõ— Ú½KÄÊ6SV¾”I7ýœäÝ}4­$бŠÔ‹Òj)IDATÚX%›_}‚'f,`mY`œªÊ ƒj„{_Æ¿^þÏ>þ?˜²Úõ?q?û=+/™Á&n;ž ÁT²S÷®J Ô5ølÏAË eÐ"£‘)ð` úìÂÓÓç³uØ`VÍú”ì³/§]2D*¶Q“YLnòž…“É-ʤvq9uMùI:ȶcۨɅyËÓX¼¼€á?." ˆeZ±‰Ò(´Oªí+ÝXAJAIZ’ƒqêb{Ÿc©©¨%‘ñõým°-2[Z³½þ‚˜TÿÌVùÎjâ…M¨ÐâÇâ¡_†ØfMi¯Ú¥ÿhtŽ@×<¢Ç.ºf“è«¡¬V¤W¬gGdϱkâvj×›{}åy£Pc}ƒop0q–³¹4Ô' héfªÒ êïé¿_ïoßá>ë¨ôí>ίaWM‚pF˜xÕ*«–ñüý™8q"'þ'š½ â5P8”K‡å³jÖŸùý]¿ãÁçæðyyœXu)‘ô–d'7íNíÀ߇öÉU9„#eÔÄ›²ëeDÓZ™´7sf¤)«&“Þï.#³G5c)¿ÇY©ïñØ- ¤6ñZJ×~‡ËwQ© šR@»V鄈Qºh&ï–ÔÕÿ€oü€yK¶PKJÏ&/3™P0@j#åÅaÛíîÁ4òRªØTRõå(Ç7*oÏõ=³£N*eú#ϰ¼pg´®?S: £ò|žyeå±埽Â3„è?¼3ápkŠ[lgÁ?¶¢›ç1ýãÊ&o Üiýó™ñq)q ºñm¦/ªnRÝj8op쓲?ßìüÈ»x#}5¥ó¹ ÉXÀãS>dKm‚D´”5ËVS?2íÚhßøÇà€õNTóñ”WXV#^¹œÏ-$uÀÚ‡ï¿|Gû,G¤¨Û±Œ%;3èÔ1›p<—Œ¬\.½ñB: we¸k\H¬r>ÿ$/¾Þ™ëOË%¥z+åQhjøn¬á;Ž*¶—GID¨+ßFM8‡¯d¯DC,‡äêíTÖAý|Ûª ç¤ùS5ð«Ø…Ëo»‘à#á×WÝMarÛõbèUè×g4ãúþžÉ7ßHNA6Ùí‹éUP‡¯ZÅ›>È}›+‰Si}ÒyLøIRRB —w(Û>Ø~'1ôâ¾Ì{èg\úŸ)œø‹IÜyî7(ïËs3ƒGž ·½E§ñö¾)­˜k~s5|à~ú× ™|Õo¸¶g@*#~v‹î½•ñ/ç‘Ûº}zå²ùPhÒz2î×ç3ùþÿÆ SrÉÎíLñɹlkB[õ6p,XyøÇþ`ûóM| Ç.¥KÃ}•”®\ñ?'{èÏüË•¿#ʤý kùM·NdV»î§±¾ùçßÛ®ƒ”óÌ¿cÙhsÆ•ÜrE×½ûÔPÿýŽö¹¿¿¨ÇÎ|E"‘8"7FoÞû¿X=ìW\Û;xm9[W/æí™³YÝæ"ÆéCNl#o<ò$+zŒæ²³»‘—¥bë:6D 霶–å…tm—KJ¢Œ¼ð(³’/ã¦$ñÖCOðy÷1öœîä*)ÙXAV»BÒëÖ0mòKd\9s wçÁèz^¹*ˮ编™6éqgŸÅ¸qCiÏzæ>ùŸt¼† ßoG¸®„9=Æúa7pUïÌú<¶ïú˜~ÿ³l>í*®Ò6¼Ã³O}D«±7pAÑf^úʶë(™ó0On?Ÿ_ÿ¨³½JÚs/³i·Üú —ÜwCr}I‘ì¿rDª±ñ'Ö½ðîz¡¾ØÌ–íé6ðJÆìZÿ>Œ`Àß^å‘»Ÿ¥†d2[vâ”Ò1°™¿¿ô2/ì¨& “×y }¿=áä ﺈøË3xð?ž#J£UÏ‘\Ѷ&½P:”Kï^5Ì~ønÖî ßsc†·­nMjAŸÁ]ùôå‰Ü15™\ϵ'ï{§Ð‘ïÁ+/=ÇæT“H+¤÷ˆ±Œì˜BÀ÷uJ—¨â³¯QzÊOé›ãEHö_ŸŽØˆÔQ'r€+IßÍ5¨ô]î¼aK³Ïä—·ßÄÐV¾äVö_¤ R’$Iûð¹iI’¤ÃtüŽHI’$}Ë‘’$I2HI’$¤$I’ R’$I)I’$¤$I’ R’$I)I’$ƒ”$I’AJ’$I)I’$ƒ”$I’AJ’$É %I’d’$I’AJ’$É %I’d’$I2HI’$É %I’d’$I2HI’$¤$I’ R’$I2HI’$¤$I’ R’$I)I’$ƒ”$I’ R’$I)I’$ƒ”$I’AJ’$I)I’$ƒ”$I’AJ’$É %I’d’$I’AJ’$É %I’d’$I2HI’$¤$I’d’$I2HI’$¤$I’ R’$I2HI’$¤$I’ R’$I)I’$ƒ”$IRSì*/cöÛ³XðÉ)I’¤CQYUA]¬Ž²]¥$‰fQç$»$I: [222 ͢ΎHI’¤Ã¶cçvþ¾h>Ûvl%°yë&¶mßÚlê$I:lë7®aÛö@«–…”lÝ̶í%têÐ¥YŒJ¤$IÒaëØþíŠ:’™‘Ii›dgå:µ'I’t e»v²výjâñ8©)©dgåššFRR2ÙY9dfd5›¶pDJ’$’…‹>$(-ÛÁ¦-ØYºƒV- YºüSB¡$†Ù,F¥‘’$I‡¤ E+’“Ãäæä’ŸW@R(‰ùdgåNSß²ÙLíÍåE’$IG˜#R’$I)I’¤ï–›«Y‹ÅbD"¢Ñ(±XÌ‘¤oAjj*iiiÇeÝ|FJ’$é09µ'I’d’$I2HI’$¤$I’ R’$I2HI’$¤$I’ R’$I)I’$ƒ”$I’ R’$I)I’$ƒ”$I’AJ’$É %I’$ƒ”$I’AJ’$騗t¤ zóÞÛygçÞb3 ÚÑ­Ï™ =½¹ÛJtÓ'O%4æÎk›|èÿ¦ë†šÏ¦ð1¦Gª½¨¹Š•0ã7xlÃþý‘[8-3`›H’Aêð‹j?úW\Û;XÍ.¶®^ÄÜ™Ïòðº‹?¦9ÇÉØ×Î…/óvÕI Ê(gÕ¼WYœ~öͳ753u[æñúºlŠÂ‹™¹hýåpÀ(‘†¾úÝ>“$5ç ``0D(=¶=Ïæ²ððÃoòîÆ^œ_áó7žgÖÂ5l¯Ž‘”Ó™ç]ˆ)¬œ6…»*à/Y Ónäu\qrˆ\>{¿ùÈZ¾øÚú?æÜòçxlÕn¸ú$ê "¬yi2S?âÆQ0cò DO>ª•)¯ª"Øn£/êOa¸þÒVWº”Ù/¿ÆG+wIÎ£ë  ¸äìÈë3Š3—¾Ëëo~Î b ?—‘= QÍO” o½II×+¸¥øe~?óïì<}ùA v)÷ßx/Ñ¡}(¿ˆMñ^Ü|×pæÜ²ßg÷\Edê½<6{ ›*êH.èÍ÷zWöÏfó ·ðßÿ{oLn †%ÞȤÀ¿ðÇñ=m~I:ƒÔ× oQL¯¼¹,Y³‹XQ*áÖ§ñà —S˜‘`ÛÂyâÅWhÓå_<†~ëö›š‹W6¼|ú¾÷ñ)t=Àúñ§’7ï#¾(ïEŸì Ô¬ã£åAН("ÌF¨+cùæöŒ¿î"òÙÉ¿>Ê”Ùm™0ª-ÉÑMÌ}úEVt¿”ëÇv!}×Rf<9•i-Çsy§¬X±…xV$زb›:äÓ)+dojN"k˜=w'ŒíGqçíäMŸÅümg1ªÕî~ÙÆG+»ðûÿó ŠÂ@í2æìÿY|K:~_ýß[éœgýìÉüvòéñÀ­œvæZ¿ô* wbX~ª>ãµ!þ{Û^’Ž"ßî„[0•ìԑʉ`OéIQV˜`0…V'á¤ÔÍ|±½®uqùýWÏ)¦«>Z^NœÕk?bE¸7§îjÁ4ºŸÙ‹üÊ£× .D–.¢$ ÑÍ ø¸ªß;»9IA’ó‹:8—õ ×Sµy+ýG3úŒ"ŠÎÍd²mK•=©™©ùâuÞÝÕ•'ç‘ÒfCZ¬æµÿ·…ØžBY ¸xEáì™ÀÛÿ³`=Ï>.ù)ƒit8k4C2Wóñ¦¡–Ù~-¯/ØAœK_ã“ÔÁœÓ)ÅÆ—¤£È·:"E¼†]5 Âa‰6ÌŸÅ«|NIeŒ@ NMM^u‰¯{¨Ë-IeÓ½Þxoe}{³éÃÕ¤Ÿ2Œ–I@dOÈÛ;ŠLË!ÙFMbU;¨¬ZÃó÷OäË%bµÐº†¬®§ÑˆÔQDˆ”ÂÞœf?j^•,{õ}ªºý„“shÃCZ2õwØpþ:„2h‘±ß(åþŸ%*ùbæ<1ckËêãTUT›€` úìÂÓÓç³uØ`VÍú”ì³/§]²Í/IÍ&HÕíXÆ’tê˜MbË\ž«ŒãnàÚ6ië6òêýOSþ• Ô>ëny÷àËí·ïÿÈè2€ö³æðéºV­Ë¦ï¨û£*¶—GID¨+ßFM8‡Ô „ÒrÉÈÊåÒ/¤CøÀ› ·ÂûOóÌQÿ`ÖG•Dkd•щÄ欻„kÚ~Ù¿nŸÏ¢k¦1iÊVλ}2wtÎ ]É7ßÅÎÝ æôEǧ0oy‹—0üÇEßò$éPÑ©½D@ ­ý;WðÞßÞ`}~?zæí;BPËŠ9ï±¶*N¼j-ï½¹‚”O¢e2$·9SR–0sîrvFP±eŸ­¯´Çˆ²gòI 7Mzˆx€x€º‡+;íä×WRÛÄrâ‘ ¢)´k•Nˆ¥‹fònÉÞ©ë@f/FTÊôGžayáÎhísx’t´9‚7¸u¬{áÜõB}±™-ÛÓmà•ŒصþÕEƒù^·)¼xÿd2rÒIoÕ‘N9»7ŸÔ‚>ƒ»òé˹cj2.¸žkû4²ü×jq€õûå ¤Òá´îðÄÇ´¾ðᾂ!”Kï^5Ì~ønÖî ßsc†·% \İ«/!ð·Wyäîg©!™Ì–8eÄ…ô°Ï4{Í\FæY¿e@»|ö¾E,—a—œÄózåcÎmR9)]F3®ïï™|óäd“ݾ˜^ûÌÝ28qä©pÛ[t?€s”$u‰D"qýª$¤¤ïFÛ¿¼ÇÆÊZæ\Ô‡¡msÉ:ÌÞ°“s^ú„¶)¬¿æ ª$ýùŒ”š••µÇlˆÞ6€ »ë"I2HI’$¤$I’ R’$I2HI’$¤$I’ R’$I)Iãý¹ïÓùrªò½$É %5ñ&ÿ×[ý”龯I’ R6Ôt‘]%<²#™îÁRî_!n“HR³æ-–š,βÏ6±ºUgž/ZÇï`S—BÚ”•¬çš×WñÒ®Úñ‹”¤ïY÷`ßK’ŽEŽHIMUWÉcŸÕrjÏ éÖŠ6%˜V±ûOUFÊøõŒÕlíÙ—Ò_æý> ž\YKtϺû^’d’Žg%y®:›ëÚ‡IÏiÅØÌ þ¢š(P¹}3ÓüGï,rÚtèÀoÛì=½ö½$É %Çê˜÷éVÊZrnZBi\Ú-•%KJø,uµµT¦¦SÚ³|ˆ¹É_Îì{IÒ±Éßq© 5¥<°ºŽÚºÏ8áÑå€D,N<±‰ÇwtàΔ2£µ”Æ÷Üž$Ø^YG,{÷‰vï%IÇ&G¤¤&زn¯ZðÔ§³òªÓYqÕ鬼úTî.ˆðì’r- 9?±ûÖFˆµ¥[˜¸.öå¿êK?È÷’$ƒ”tÜš¾¸Œ¼î¸8/…6éáúÿ2³øñ©yT¬ØÈäð‡‘í¨xݦ,ଷ+8­}˜ðîõáÆ¿—$›‰D"a3¨Ùtøß 1a¨õ$}cŽHI’$¤$I’ R’$I)I’$ƒ”$I’ R’$I)I’$ƒ”ôÝ)L¯滛ʎÙ:¼½±€6é¾ÎS’þÙü[{jV®=±{þ¾–!/.<.ê"I2HIß™;tàÏK7±µ:zLÖ¡eZ2?-nûë"IúçñOÄH’$&Ÿ‘’$I2HI’$¤$I’ R’$I)I’$¤$I’ R’$I)I’$ƒ”$I’AJ’$I)I’$ƒ”$I’AJ’$É %I’d’$I’AJ’$É %I’d’$I2HI’$É %I’d’$I2HI’$¤$I’ R’$I2HI’$¤$I’ R’$I)I’$ƒ”$I’ R’$I)I’$ƒ”$I’AJ’$I)I’$ƒ”$I’AJ’$É %I’d’$IRÃþ?‰¾qùw*IEND®B`‚143_add_host_template.png000066400000000000000000001216331516513262500346360ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/14_fields-for-interfaces‰PNG  IHDR[(^s.bKGDÿÿÿ ½§“ pHYs  šœtIMEà*’º IDATxÚìÝwxÕâÆñïöÝ4’B„z¯"Eš¢ÈEP° WAïÏŽõZ°K1€{Qô^PºRB/Ò $ ½ínv÷÷G ¡÷+àûyž'ìÌœ9söÌλgN&†)ßOñ!""""ÏíÃ<05B-!"""r LIÁ¨f¹t¶DDDD¶DDDD¶DDDDDaKDDDDaKDDDDaKDDDD¶DDDD¶DDDD¶DDDDDaKDDDDaKDDDDaKDDDD¶DDDD¶DDDD¶DDDDDaKDDDDaKDDDDaKM """¢°%"""¢°%""""Ç2Ÿn¡oX'µÐy2LüU """ÙQØQØ…-…-…-QØQØQØ‘+*l9ÙñÑP†}š€ë¼–ÿ=ß² ‡›“CDDäo¶<©Ì~²ýîx‹Õ9¾KW{÷&Ès˲)»—Ü/0pè—$ºÏ7nçƒ!Cù$á2ŠxF=ZÔgó}×’ù϶¤ ¾–üAMˆ«@ AYDDäBâPµ˜ZLn^޲×T“ƒ»;Åòx¸™ ¹Ôš/E• .cÞÞ "­›øycÍÛ•CyàBú€ƒûz6cR”“ÏVl澤\ÒMvÚÕŠâµ.Í麎Ë3Hó©©DDDÎUµZuø½[E"‰¤¶i=ÝVe’ntpo·f|RÃuìXþ³‰×S /—°åfÿ¯ Hȱ3yû絤·éL¨ÀG^ÂOÄý–U „5èA÷/„”l{¦åçÃGÁîùLš0™%‰ÙM‡ù¯{4ïâ¿ËÇs¶‘VhÀZ.†ž~’3Þf~Z¼x?‹Ívjÿó5žíTþ/ë5ëÇ2!*ǾßȘ4Oñ(^>Ûg0+¥6ko¨Ç›{ⲿå-‘sSèõQt3Ì@óM˜gÚÎäàš¼[ÝR´‚ׇË{þWØ‹¶\{Xø[5noNlõ#„üô ñ‡¯¥g¸ ò·òśߑÕëe¾ì]çÆ/yqT…×o{¦åç#_¼ö9{¯{–ߨ;~`Ô«¯ñeÔ8î1}Ï'+"2ñß´¼‰$Û‰þ]·Áòä{ ޱþåàÎFì]·š ¥AëhLݓȣIá|Ò¨Oì?B†Î‘s²çvÚÏe="¨†æMëÒ¼d¡;ƒÇÿ³‰Ñ‡=ç]þEŸ³U0¥Y1tm‚­R;:”ßÍÜß✻±ÆÛšÛ{Æàg4Ò¸/·Æ 3gZ~rn¶Ì€Ûnã¶â÷¾³wi™ ‰w·ä®Þõ2™퉻Z²rA".“C~*»w§]hÄ/"†˜àËoÚy+÷à<áݳÒ2*ˆüB*†3 :˜Zݰ97>öïÜÎ5sS9rÌËÙ<;½(h]È£‹;²åËeÛœäÕº—FÁ0T¢m‡ L›¿„ý½n#,ç0 .Ù«ÁNX¥€Òߪóœaù©¡Æà7x²e@é+yëÞáÉÊ–K°¥d©…àÈœ›²1Ö¼•G|ÅäÏžej2TiyƒîïGSÿË« ø ø›N¢¼¼áU_ÇT乇˜¾G7EDDΙÉN÷˜Ž™4d oõÞ?œIú\^/jØòåüÁ/«sq;'2ìŽ1>· Ÿo‹öþƒå±!×S²çB²ÓóñFç–ŸœkPyʇ–NÂÏ ´–þl Þ“B†¢Ìn2’s°…b6Pûúù÷õR˜™À/c_⽯ðþP3Àw™ä–9éFFÕ "4)´c–xX³f374å³ }týí0”µDDDÎ1h•™ OQþ(ÀŒ½dÅ“æÏó{Qo#f®ÿ™ †æ<<ö}&N˜À„ ˜øþÜÎ’y»ðEw¦¹/žÙë3ðîäÅü´1¿thÎz†åçÃÝ™––x¾™µl‡ìí³øf¥‰–]ªcH^ɲ-Éóø0ù`Ád4`0:±å‘’šwYL8ÿ>þ žZ±|X×ý¸ iÁÅìßVSkÖ~¶yt¾ˆˆˆœ«Öm Zî ÿnµç`Oñµ¶y‹F|us¸/êÈÖꟷpí‹´ªZ&Óù ùáã¹ü9hƒïEÜø'>5˜ àêÄ6 æpItpÔ;íòóâˆåî‘wñÑ„7üm¾€h®¹s$÷ÔsàۙȂ‰yï@.£Š o`ؽu°Y|têÓ”eïßOÿ16ê>0–W»…ýeàHR½VØYØ¥5Ûj§ðõÞfgyõÈ‘ `²ÒޞǒŒ²“á D„áHË$ñü±Åä”KóPS¹|LIæÑ”d5…ˆˆÈEæ)ÈfqÁ‰×Þ©™\¶þµˆˆˆÈ%¤°%"""¢°%"""¢°%"""" ["""" ["""" [""""¢°%"""¢°%"""r52ø|¾“þ¥—øøxZµj¥9OS¦LÑÈ–ˆˆˆÈ¥¤°%"""¢°%"""¢°%"""" ["""" ["""" [""""¢°%"""¢°%"""¢°%"""" ["""" ["""" [""""¢°%"""¢°%"""¢°%"""" [""""Wó%+Ù“ÂÌ'FðeRÉ áô}g·G[μ­/“%ÏfÜ€(‡Þ¦ _÷Šâ"áÓá<=; €ˆ~£3 *–³Ú6Õ/ÝÍ›|@%n;†þUÌWì±zÏá©¡“HðëÀK=B}û¥¨‡üÄÌ\v7*¶½‰®5ý0èsBDD.À%Ù*LYÆü¤²¯¤òÛ¯I¸ÔærËOœÏ÷Ó§3}ú÷ÌÛ™‡OM"""è w¸Ù¿x!Éǽzdé|Ö¤ŽM iÙˆ¹ýižL÷€Á¨0“šDDDäª [®$ý–Zô³)†.u÷±ðÈXÁ¼„AÔ©ï8º®/]s?cÒ´%ü™^ˆ=¢1=î¸È“•{.ëžTÙÛkôyÆùßñËê½äølD4½‰ûêO“à’pâ%wç¯|ÿÝl~ß¼›4'` ¥F“NÜ<ðÚU±aÀGîª7¸ïÍ5¸š|ÀëÝÂ0:wðá°g˜— ÆÿÇÇ/¶'ÈÏÆÑCxù÷| *ƒÆ¿}ž·<}äí^Â~ø™ev’šç“ƒ°j èrÏCô¯g$aò¼uÌmD×¹»/ŸÄùŸ1éûÅìH+ÓÖ?=ÃûÇܲ…ÔÅŸòѬ $î?Df§èmˆ VÓÎüãöÞ4¯`¹DÝ×Cöö|7í–oN"à X‚©Z¿5=úÝF׺A˜ŠÛ«`ߦ~9ƒ¥›÷î üC*R¹f3n¾ïZ§2ý±|½ïhé»>Ê­…×ÖÏÌúÄ‘Ë#l9°ôHq֪׋>7ųüåä“MüÜíäÕo‚…˜óÏ~¼wñ¶60ãÝ-žpƒó\Ö=øñõwËÖšë¦ñæ¸Æ?߉òF/ñïóô[‹8\¼†ÅnÁ]Æ®•?2fÕz’ßx…~5l8j¶"š5ü ì]³‡ünaØŽlfKfqdK\Í^g{ê›RX¿#¿èŰ&4(>AËKÆêy椓;ò9¼kñ»ó¸¥^À»‡ƒóÞä™6ŸÕû’±m%ëwfüìxrrqæ`Û’)¼¾)…gÇ>DÓ€³Ÿù”·ÿÖ®9TÚ9½™»É9IÐJ[>ž'ß]BFÙ—Ý$­ŸÃ¤õ+Ùúè[ŒhŠ) Ÿ¾ð ³ŠV1:ü±{rÉMÛÇŽ´|¶ö@ë`}ˆˆÈ¶òÙ9yñÐDÝ. ‰¨ãO#ûrV@Þê9lÉiL‹äoaê”’ðTŽv>ǽ­ƒ8°p"¯~¹á¸bÏaݳdªu;£žïCõüåŒþ¿1¬Ì÷ælÉîHë6&P´Û2bÔp®´R8“—ŸþŠ?=»ønÒ¯t|µáAui &ƒkç:’]ͨ°öèmÔÜíl8覮c‹“›_lS*Ï€Oþ6¦¼_´,Ôêó/†ÝÜ”p2Ø»y[ìg5¡ûôǾ…ï&—­ Ú {ûÛ–#e^/¹ñ„.Öv0Ïõ¬Gý¨rX €'›Í_?Í¿:¿ñãº;iÒ!ø¬'šg-ÿ„·—Ÿ©¶0ù£’ JÇG^àÞ6!¤¯ø”—ÇýF,4™ëš§î¡Íl)Z5‡¼ÏkÝ+`‡;3‰Ík0›ÀT‰>c¿çÚ…#21€C>àîaú•]¹ÌÂVÞæ¬Ì.B¨C—å0úÕ¡KC+W9Á¹ž9›²iÞ6wòZ¶äoW­/wtªN° ‚¯¿“ž?o`ú¡£ÅºÎaݳã õ€ë‰ñ3‚£mªÀÊ€/‹C9\y¿³.«dç»™=þ%æx H-ºS†oç ó{PFB˜’œé°õHù«÷àßz-ýÙ²*• ;2¹!p {‹ChL«hÎçê\û~gmñˆQxx`k*™Â‰iÛ›˜¢7ႎÝí\Ãæ’¡¤è~ÜÙ1š@^?ˆëyœÿ3¤f"´^C²Ö,fÚÜ]¤¤çPàòP˜YR€C‰ivæbÞLtî]ÁúânFÍþ l_#ø·HÿÿþƇ;ìõ¬Øç¤AùŠà€v~õ:¯o©CÕ*U¨V#–†×t!Ô¢ß7‘+&lùÈÙ2‡Õ%×úÈzg$±'ˇ½n†U øp³qÎz2Ú\‹#/½4˜ËW"¨ä®š9˜ÊÁ@™å=‡uÏN9*‡¾ÁŒµ´%¼x|àÉ=rôÖ•3…;RN,›Kf¬TiQû/+(`?k·ï$cG>˜›Ð­[ERVÍ!iõvþ ÜEQN«Fëÿóz¤@ÙzY*V%ø¼æ¾ŸéØË´uh¥m]ŽÈ 8æþ¥;™_^’7œro……xÏ¡v§}ôCiÓ¡${[C+à_2üdô§B¨vº\Òr½bÚpßÝ+xýóÕÉObýÒ$Ö—æÎX¾ô,}kØõˆ¹–/›MsÖá,ùÿ¾i¼òÄ´ÃsX›v üCðòœ, |à0Þ|Òœ1žÃºgÇ€ÑxêË«É? °4{ŠI#[rºiGöèÖÔ0¬`‹ÏËÎ 8rˆnNZáÄXç°jÛ/üb+ЉhFlðùÝœ2ù—'HÜöîiŠÃt±½L[§"Ç #P˜ÉþÌãF˜g1­$hUýÏ?Ó†a6 Ö¾Æà×Ö–ÎùºØŒåKßWÚ!rKêèÍåБ’½úêoƒ•èŸæƒnGس#Ýûö³wÇ ~Y² gþV¾ûf=ÝŸkC Ò–ˆˆ\ŠkÖEÍZ™˜»ñ,.¯¾íÌ]uS¥fÔó/~íÏY,ÚíćÜís™¿ÿØM¬ç°îÅ`­ÒŽ¦Åƒ7k¿â»µ‡qû|¸2‰Ÿ9‘WƯ+2Ö¢UTÑÏù[—“„5ªCˆ4-ª¹[ÙPôÌNë7¡¢åüëÕ¬\I˜ý–÷&¯ )£€‚¬ƒì\õ ³7ežÓ(ÒÉX*5§AÉûÄiL^²‡ÌÜ#l›ý?7‚èÍÏ ¿$ÚToLí0FOël»dA ÀV¥méûÃÎ$‰ì‚l’–|Ãw»Š_lBÛ*VÈßÅœ¿òGš¨­ét}_n¿³uŠßOv6®âjYÖÒ®ôÄr½ú‘ sQG¶ÒÖüÂæâùL–¦ñá3m *3Z·a C_YF°sî R»ÝÀmë±âã-¸}‰L~ânþj';-çćI:êýºƒ#–ÛèȆw~#df¿>”Ùv_>…ÅëÔk~tߦòÔoI%¿»h§VãJXŒfj5‰€„%Q†Ú-£8ïG9ê2ðÁëØôÆR)$aÆ;<:ãèâè{›Ñ£áÎŽrÔãÖ ø}Òfܤ³$î1–×=ÐN/PIìÕÚÓÀ¶’5NÈýmO¦Ö£\Æ6¶¥8/mÏuÄ2pÈ5¬{w)¤±8îQÇ•]!˜kî¿Xø²ö³ø«ñlÿª¨ÞV‡w¾³ô½‹nWrÆ¢eލFTb É@ú¼—øç<€Z ÿø5:kèKDDÎÝEÙZ5w{ñÌN³žN¸-ãW§m‚Šÿ“4Ÿe)Ñãi^½¿31Á& |Ce:ß7’ÁµNÌ…g¿îÅiš61ú¹©e Âì€;ŸŸ ð4»®?ÞV§Ì$w •šÅâ_úÿj´¨j,TlT‡£c¨Në~T¯àCyçôiC¸£¸‘ 6Bª6§E5¿‹ð¦š¨Øý)F éB­âIa¶ˆÆôþ¿‘ô®Ršv¶1·eÄóƒhW-p“²cÎêýxêá\Úgךm;‚Ñ£î§gÓª—äKs9¢÷àþWG=ö0تѱgkêU-¿\ùN|˜ ŒlÀu÷¼Ìó7U.ýÖa®Ü‹ý³=ÑúD¹8 >Ÿï¤Cñññ´jÕJ-ô7åÉJ`sJ µkU,š åsr`ŧüûÝEè6ˆ÷ÞêM¤N/""rJS¦LÁ¬f“†­ÔßÿìϤcÀêï‡1?—‚’ùK†hny [ñ#'DDDät¶ä¤LÁ èÐr+¶$‘š[ôkpê4½–úö¢E%›• ""¢°%ç¶ÂZ3è©Ö RSˆˆˆ\ÍQع2]ÔÛˆéééjQ¹j…„„üµaë|* """r5ÓmD…-…-QØQØQØ…-…-…-QØQØQØ…-…-…-QØQØQØRˆˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆÈß7lå­á•[ûѯßÿ1ó€Gï®ÚDDDä/gþ«+ðÁ½ý˜ŸP›ßz»jXÈß2‘‡^XH@x_Þw;Õ,g(ÌäOåZUIsW%Äò7{' ÷óã0%ÙBóg?edS‡ÚDDDDa«¬C,˜µ•[†7Â,ÖÏXZ´Î…­.÷Žý—ÔÞç)Äg2ÿ%C…>O!¾Ë°MDDDä"‡­¤ø¹l<è<áÂo°†Ñàš6DûN¹­É9¿Ï`Ý] iãZÎŒ5.0eï|¹÷ñßÑ£™±ié^ÀFXöÜrÿ?éíÀ·†Wîy Þ(‡ÞAë‹ÿÎuý°wÞ"vdšoyO>rÑö“Ô§´Œpºôe÷¼ÅìʶR©õyèFbü eÖ©DõØ9k æ¼6þ>ªYÆ”O¦²pC y ¬Úœ·¦_‹0ÌgS6>œÉ¿3õÓ©,ØL®ÏDhíNô¿ÿºV/{Œe÷Ý–Æå,9àfͨ»èDËèòzÙ6‰0ž¾üÂT~ÿr<_/ØBª0ûS!º w=1„våM:cDDDþʰ5ç㘓v²%At©ÚŒa±¶SléO“ª³yÖf,ÛO¥ìŸH €–½¢X7s+…%«y³Ù—ì¥Z»¹.ÌHÚ¦,ܺßð£Æ{÷Pó”5KeÁ“¸¦C[œ‹~gÏªÏøpIkFu ;ÍHT* ­Ì ݯ§Ü¢Ù¬[ù¯ûW'îÁø•®“œos¨Ñ¬5-ì°ä®åƒgDz$Ñ-hœLüúUL{c¯æž*g.Û‘³ŽžÃoYÞ¼'×ïfÁ‚|øB~ï=A{ÛIöm«DLä5웹”D77éLË v*Ô ÀÈÁcŽÊ—}úò›%}Á„Ù[pVhI¯ŽÑXsSØþG ©ù>-"""uغû…!~ö#Öä–}ÕAã{ÿÍຶÓli$¨qo®Y²™?|ÀGîÞ‡›êìe}ÙÕ¬µ¹wô¬&ð¸]¸ºTãÀ°ql9¼?Ò<Ô :UùÚ>ú<43³Ý»™çd‘¼å ®naØOY§@:ÿë1î­g§ q>¾°ˆÌåsÙyo–®c¢îзy©k&|d,y‘¥Ù@HOžuµ­9¬~g(o¬LeþOÛ¹íÁ3•]Ÿ¨õÓYœ„÷fÄ}¨lʦròÿñþÖUL_y˜6מlß@á~ –/%1ÙBÍ^÷ò@Éœ­¼c¢™g(¿aù “áUb¨Yµýî ÅfÐÉ"""ò—‡-k•î<6 Þ- \ß;Š'¯¯z拵_mzu`Á´m$5t%ÊúÙ±£2{Y4i"ß-ÝE¦·ìy.ïi /OÍ;¼Øí@…n§«)GdpÑŒrKp$å€ìü#dº|eZ­"Mcƒ‹ÂrR3ŠÊ ‹¡‚0؉¨ +“)8œN/ð eRRFêLž2ó˜¥'eå;fßg«LOQ¾µã@nk¼‡ÉæòÙØ¹E ‚›òÏŸ W”UgŒˆˆÈ_¶J×kâÞþ OÏÇy¤GÕ³±P¹ËMÄL›D‚¥17·¯ˆ9±ìr/G–~À¤Å» ¸÷ÜÑæ¾|} »à ÁÉ€ÑXúãY:LBr¾Èò’8 à(O9«Js ‹ÉPús@x0’ñÙÅ!W'B¬Ü€=,»¡ð e›–Ö•‡îoM°ñèñC+ceÛIö]t`€ï)ÃtÆòmv?þñü$nÊ>ÈÞ½»Yÿã&¯_ÇŒ¹Iô£3FDDä¯[ÖÊÝxll·sÞÎT¡ŽŠà€)ŠØ`C™Qœb>_i°ð¹2Ùÿ».YÓ°òÝgyµY­Þ@Ô¦5m@þÉ]¹&½i°…ei³yåùC4+—Büº| ]zÕÆÎ–3”mÀѸ7í·°ôð"¦/°Ò¶š•¼CûضqUÿ5†ÆNÕx~T2ÀþB6ÇÄU•ˆ½iƒ«ãʯ½9Ž‘_dS3¶ü Ù{ è`åì:[DDDÎÃåõPSƒð:iŠå$U-ßaƒZF`ÉXÆ¿ec`+ê\²‡WDÒk`cœÛ7’ì±Ñò.FÞÓ¿ÓŒŒ›3ìÕÜÐ0v­bÙºýX«4§ï“/qW]G™AµS—mj΃¯þ‹›šD±j6Ó¾ŸÎÜUI˜ët eøi”e(G³·P/Ø€;)ž…ó~aõ¡ÂW;CùæàD÷?g:Ó¦ý—•‡Cˆé8˜GzUÖÙ"""r>ñÆçóô¦S||<­ZµúûµÈñˆ0]e‹ˆˆÈegÊ”)úÛˆ""""—’–ˆˆˆÈ%¤Ûˆ""""—ˆn#Šˆˆˆ\b ["""" [""""W¦‹ú”ªøøxµ¨ˆˆˆ\µÎg>»ù¯®€ˆˆˆÈÕL·EDDD¶DDDD¶DDDDDaKDDDDaKDDDDaKDDDD¶DDDD¶DDDD¶DDDDDaKDDDDaKDDDDaKDDDD¶DDDD¶DDDD¶DDDDDaKDDDDaKDDDDaKM """òw[®=L÷=æ(<ùr÷>fËìýn½k"§ãü“ICä“—ÚBDä2`þŸíÉç"uÃ~Y²ž]Gœ`¢Jý¶tëÑšj~g‘ùLÁÔïÜC9Óù×Á½—Ÿâ¦aºm87T¶œÿ:YÁö©Ìàfn«cW¼Âù²–ðܽãØ~Šåuÿï3^iˆá²eÛù`Ä,O¾Çà«Þ<‘+;lr8þ&Í/¤eŸ{¹¥vyLÙ{Xýó|ùi÷Üß•¨3]}ŒD7i|U5~úº™,ÎkH»€l—Ía“ßµôn¢žy…2]ÃKSÚà(øƒñ#Æà}d<7( Ò³åòZ""ru…-_ÞNæ/L&êÆ‡éZ?°èÞehMÚßÒôñ_óËÆ– n à%çÏy|6y-IÙÊ×ëJ¿›[a5ÝF? íqCe …[Y8s.«w¥ã²„Óî&þѱþF(Lß‚Ÿæ±fW:.£ƒðú=Ø'–#Ó§²&+¾x—M&+UzÜÇÀ&Aeî¥:I8aÒ-{ Ÿ&v`ø] 0¸Ø3#Ži†~Œè ³ã~Äݨy»’ÉÎËÃX¥}Kê §¬kH“ž´ßº”y þd'ºt£G=­+´’É¿`ΦTœÖpšÞ<”áýQν•ñ#â0ôjÃáY³Ù”f¥FÏá<ÞËÍŒqŸ0/! ÿº}yüéÔ0€s+ãGŒÃÙ¡Ù›v’–•¹ö?xxXO¢íÇE9o&ë¾ǧ ·’Sˆ%¬×~˜;Z:Ø4þmæ§eÀ‹÷³Øl§ö?_cd§òx­dÊÉ꩞""—oØrÞFRa$×Ç3IÌ`¯L£Z66lI¦ ‘?x2ؼÅΠ¡#‰2ìcñW_óíÂÊ<Ô³2ÇÜÐs§ðÛ×ÿagíþÅÛßÖbô=1ØŽïÕÕºó¯ÑOQ=ØË¾…q¼÷u&Ó^_DDÎÇÿ仪¯ —9‹á„Ý;‚ìø rqùƒZÛRÍψÑQ•6]bpmÝHêqsâÝÖ°>¯Ý;Ö¢œÙˆ%4–N׳oÝ>rRÖ°1¿6=»Äj5`°Q­~p¤Ær±´ OeõŽl¼øÈOZÍNkšE6£ƒÚíëjL!ÔoW³´Þ§«kÞCø·ìKß¶‘D¶íË-­8|0O½ò*äÜ=—_³šqwÿ¦„YŒØ"ÚpkŸ l_¸ƒ<c-o»žÚ&¬­èRÌÍúбª“£*m;„“¶í ¥SÞ4¿¹fÀNÛ››P°b1{]'t^êulCÍPF£ƒª×ö¥CÀnÖ§¸Î¹ž""rlìX ÓÈsûÀZ6pyÉÏ*À`÷/zÙèGHÀÑ*™B°¹ŽPà=6zòÒÈÍÛÃãߥt Èㄊ8ó2pùU%èbÎm7Q»e%æ/ßFfÓ¤¬Ú_ãÎT0.Àh'È~t4Êè(‡Õu˜ïéëÓ‚€«0’HLØ"ÐB}òªäÉ<@föVÆ><„’ï>w.†jy8½A`ò#Ô¿¸‡LX-füBýŠ»½³ÍŒÏUX4 ÀäGù2çŠ) <öüdr=Ç}…òå’ðóç|>{ I™…Œ^òr´súιž""r‡-KXªš`mBõ–^ |Îd6þé$üÚJØ YàÍ#=·°´Z…9é8­å°7*erãLÿ½©zÜ/Q¹“öbË?D¶ÂOu7Îw•>fþ5[õË"6ﵑ¸7ˆ¦=Ë— OyÉvãÃŒ(Ì>LAq½OW×Ö*è ¾xU3†S.4œGã¤îñ÷ùœ[ϽÀÂl’Ó\øjM¸w¥%“ãÃßtlßuï™ÎØ©‡¸áßq¼TÝ“{Ÿ?ò éG»6>ßYÖSDDÎoÌæ±ƒ_ ×uŒ`ï¿eþÉuR¾‹eÓ¾g½­=UÄç$aÑ ’ò¼xó÷²raÖº ©pÜ(•¥R Û¶ðóo;HwùÀë"çàN¶ïËÅT©9 í;øå×í¤»}ø s8˜t€lÕ»s­}9Ÿ~¿†T§¼N2’6°jGÞó*1ŸõßÎdk¶Oö6~š¼¿Vˆ:.Ð{]9¸maT ÷ćŒ?³4µøYvF!¶åíï` ¤rýöÜuoªÙ E·ãLÁÔ¯›Ç‚^')Ë@h½ë¸­KeN²DÒù®`øï>|}2X¨M㮽©e©L—;oÆ;s6GMÁmr^¯+Gàg.O“kbØ<ó]^šf¡êMqOórÇ&ÎS­c°SµEmø|={×=ö7³LÁ4¨_ÀÂÒzw=ZïÓÔµŽúßß(mÕdÀ #0~øßù:yX ®RŸNw£ùù”g çšvyLylÛÒ RÛ;ybàI&Ç×ìË ¦o÷ÈÊ…Ký0KéyÔ©OS–½?ýÇØ¨ûÀX^îvêz¶Ô»("r~ƒN>Ÿï¤ƒ<ñññ´jÕêò©©{/?ÿË­Ñóô°ÑãyŽ,ãÃI \3|Š'´¸ö0=nþw £[„Y=J.=çVƘ@ð3c¸3Ú¢ö¹ŒM™2åÊùÛˆÞ¼Ãr:ŽN"þ_ó°wå*rk¶¥–¿K)"""g犊qïû™ Ÿ®ÇѲõƒþ÷ùЗ³‰¯Þû=þ ¸iPMÊZ"""r–®œÛˆ""""W˜+ê6¢ˆˆˆÈ•HaKDDDDaKDDDDaKDDDDŽ£C‰œ†ÇãÁåráv»ñxÝœ‡ïr8j÷^~=†ÙûÝêrù2W ý€´ 3]Äü³† =s€‘‹÷qþ·;b¯çò|"gb ¦^§Žj‡Kõ9`4aPKˆÈU¶\{˜÷hSÌ•+I̲P©Unm]Èï?þÌšý¹Ø«vàÖ]ˆvŠ×ÿw£äíJ&;/c•ô½¹%VàÃu` ³f,dSJøEаsnhÍ]´ma“r¶í"ÍEëð]¬ÉÊ/Þe“ÉJ•÷1°ì˜û³W'‘å1`ñ¤õÀ»éZÙ¢^"ûàr&ø5ó6¤ÀäOTÛ{9¢3áeWrþɤGFc||ƒc¬g· >r¶Nåµ·Wýà nÊÑq±|Ö›ùiðâý,6Û©ýÏ×Ù)×îùLš0™%‰ÙM‡ù¯{4ŽãÓˆ7“u_ãÓ…[HÉ)ÄÖ€ë?Ì-C1á#/á'âÆ~˪ƒÂô {€BŽÖíôËãÜÊøqzµáð¬ÙlJ³R£çpïåfƸO˜—…ݾ<þô@ê}œê8\[?bîNMȈßHŠ·>¼õµ³W2eâÌÙ”ŠÓNÓ›‡2¼#Êi‚…ˆ\ña À“ÁÖ~Ü9ô"ò70uÒ4>ÛKǾó\p¿ñ³V5b赊.…™ì8Ń÷ÝL(é¬ûvSVfXÏÊXœIÌ<‡CMïä±ûªÀ¾%|óõ7Ì­0œ#‹·M©Ä!7fÜûH‹›†é¶áÜP¦Ü{böÖPz=2ˆ: ÒR8bÕ'®\Φ¼Çš&ðÎS­¨hÈdÏÎôƒÍ¹nãó±ö+^ŽÛF³G_áö†ÇÍpÐdøtÝ>Ë“ï18ÆZœÁ¶òÅkŸ³÷ºgùø:°ãF½ú_FcH=Ç £?¶jÝù×觨ìeßÂ8^Œûˆ:ž¢µy+_¼ùY½^æËÞÕqnü’G¥Qx=G÷sºå'M¥©¬XÈóï~ÃÈœ_yë©1<·¥5·þkS*`æ‹Ï3é—ky§_ÌùÛN}5×aVïªÉÛo=@¤p%2ùÕ8Ö7ŒqÏ4&ðÈ >yy ªŒæéö!šÐ*"Í_÷ybð§NçVDù™°„Ö¥i8kµ§qEF[Eê5 !;)ÒYUFµÛ×'Ô˜B¨ß®&®­IuƒëÀ:¶Ö¥k»jø›LøWkK·X/ÛÖ¥moô£NûF„Y pªF3W:¤‘ç1`­Lå“zˆ\ü¬•8Å9͹÷öÖDØ ¬ÁDÇV'ÐxÛø 9´ì}ž¿›öÏü›;NZ§){÷BâÝ-¹«w=‚L&‚boâ®Ö…¬\xâÄuc9êulCÍPF£ƒª×ö¥CÀnÖ§¸pî^ÄoknÑDHã¾Ük-³ŸÓ/?ùyDËÛ®§v  kD+ºTs³>t¬êÀä¨JÛá¤m;ˆëlŽÃH«>ˆ´}8wÏå׬fÜÝ¿)a#¶ˆ6ÜÚ§Ûî OÝTD®Š‘-£@{ñåÀ`Äl6a´—^ L#¾BO™õíÙ†££V×a ¼à-ÈÄí¨F€ùèa„9píÊÇ‹_ñ¶§¿ôX";Ñ¿ó<üò ‹Ž@…:­évcGjêû­œ›ÃsŸdèG»Šþ}ï¿Ù“ er»';•üÀXÊ[ϾÌ3nã9BüOËìò<ÝcüÎi.’'ç0±—Þ1·€sS6…€­ìʾ\~þœÏg¯!)³ƒÑK^®‘vNž‚Ã4$¸ä<4Ø «Pz³h?§^~R&?Bý‹×0˜°ZÌø…úN0ÛÌø\…øÎxA`ò§¼ÿѽy2™½•±ÁRÜ`>w.†jy8½Pzê{9<÷écÞÓiïôTG‘+ l+OG²Ýø0c ³S`-‡ÝF{9,ùGÈ-„â{ŽäÎÇZÎqôÛýÉ®>egÊTiÕ›»[õÆ“»ŸU?|ÉæUçɾÑê%rNº¿Å´î§Éáøåì#ÍQgyžqsEz Ü{¦3vê!nøw/U÷ÇäÞÅç¼B:` (½à¹ž’O–B²ÓóñF”ìçôË/ÔY‡áØ6-ΣqR×vÚo†g|OEDNÿ)rÅp²sÑr’ò¼xó’X¾`'¶º ©`kDêš¶3Ey^/y{W°`›‘:M+qÒéí'G2œ¥y«ðÈV6ïI§ÀãÃhó'ÀnÆhÐï*ÉÅg«Þþkølê*:}øÜìÙ¶›lï…mc.߆¡/ !rá(^û!ü“ýÚ­ÑAˆ-”Ô£a±Ew¦¥%žofm#Ûã!{û,¾Yi¢e—ê?æuåà¶…Q%Ü26þÌÒÔB¬Ñiî‹göú ¼€;y1?mÌ/ÝÏ™–_p»žÃqµiw®µ/çÓï×êô×IFÒVíÈ«n*"Ñ•3²e ¦Aý~ð:IYBëuå¶.•‹>DmÕè~{Wf͘Â;‹òñ9"hÐõvzT³a8Ù£´ÌåirM ›g¾ËKÓ,T½é!n8ÀÚ3ù1-¯ÑJHõÖÜ|}”zˆ\‚´ÃÀç†áyÿþïŽ7q™ˆjw#kExÛ˜ÂÚ3ìeqϽÂëæysc'Ñ["éÔ§)ËÞ¿ŸþclÔ}`,/w‹åî‘wñÑ„7üm¾€h®¹s$÷œlr|; jú6qŒ \XAQ±Ô+úJcpÔcÐ㽈ÿ$ç\ØFÁ.ùŽs†åÌqšã8ÙcÅl5ðÂŒ~Áãw¾NV‚«Ô§ÓÃh®^*"‘Áçóô‹e||<­ZµºÈ' úëß"¢°uQ­šø*3·äá+û™»í3>?—Ã…çY¨{/KâÆ°,Ù}Ù6°ëÏ©Ìû³@=í*7yX?ú |™ßÒ¼¥¯å®x;þýgêßÎí|0dèß'|˜+Ð~ÀÚ†™ÔqDDaKÎ_Ö†™ü¶"‘\àÉ&yÅ oHWÃ\ÕþàÛé \¶ÑÚë9æËÎ_ÆL½N©¬°%"“OU|¸®a鬅ì<~ÄtèC»fX}Yì^ðËÖ%‘ë1`ö‹¤AÿTZ9•­Ù90ù]LV*^wÝ릳øƒñ6©MÁŸ‰dåäa¨Ò‘n7µ"Ôjo.I‹~`ùÆ=dæ{0U§~ЪVF×~ýà?Ъ9«V’œm!¬yº¶,dãÌŸÙ–œ‹5ªÝúu¡’À's+«fÍeëîtÜ–¢ZßD§kjÔ¨'·/e寲Á»Ñ¦nˆzÜUËJ[º‘;ãKßøÝÃO îC+™2ñ ælJÅi §éÍCÞ¿‰ãßf~Z¼x?‹ÍvjÿsøÆðØ‚îŒ{¥#Áî|>â)~®ü?ß–@×v>xdö'ÆrOM »ç3iÂd–$fC`4 ç¾îÑ8\[?bîNMȈßHŠ·>¼Òå˜s.gëT^{{ѾÀà–¡˜Ž;'ó~"nì·¬:h ¬Aºx!äLÇTìç™-ýyïùö ØúþÃŒöþ‹¸û,|õÈhŒcpŒ÷ÁåLþðkæmMF2釭tÚàØ…®D¾5ŽõÍcÜ3 <²‚O^Ä*£yzøtÝ>Ë“ï18Æ @á¾f„|µŠÝùi˜µ•-®Pì{W³×Ù–Ú‡7±Í]“FZ!+_¼ö9{¯{–ߨ;~`Ô«¯ñeÔ8†Ô\‡Y½«&o¿õ‘VÀ¹E>k¿âå¸m4{ônoxâ0wþV¾xó;²z½Ì—½«ãÜø%/ŽJ£ðú3Óí:6s›2ÛÑ!Øù Ì_-ž¨‰¤2ç}S^‰cM“Gxç©VT4d²gg:Ãé˹’üo#r`ú;|òæ+|\üï«÷à)ù†|p»=uiÕº“ GÕ¶´®ãe÷Æ f îtÒ¦Qà1` ©L¸ÿiB‹1€ê­c 2æPªT÷#{FѾŒþTjX VŒF¡ :c;À¾´’‰5þT»¶ýL˜CêR§k¶§v¸ £­"5ꇻ7B ðà¶ç×¢Í5µ01‡ÄÒ¼m0©öQpðŽf}éÒ*’ ­úÒ¥y™©yêqWõÙDÓ½ úý+²SÉŒ¥¼õ$û?Mù"" ['O@˜Aøýpwú™K6ØÊa.8BA!}š’$K9ƒƒðæ½¹±yo¼yûùcú—üº°:¯/þØ?‡Y¿žÔ¥,X’IƒÃ¹1±0™å~Íù||íÁØ‚é:´7Ö“¯c©Ü¦êgÞÚ‡ O|ÍÜÊG¿ ˜Ã)ΣqR÷ø/ Îí`ß1ýØAõ–9<)K üiÒ/”*Uɘ±”%ìÄþ# ` Þ“B†¢Ìn2’s°…=¹OSæŠôxò6r?ͨïŸåùþµñ?Iâ2”Ç^p¤è—<ÌEçdvz>Þˆ³8&ÀÛ²+•§ÌguRë7ùsÍ¿£°¿Àpürö‘æ*©?gÕfýúMP_‘+ÆeóÛˆ–ŠMˆ6ngåª$ ¼^ ö­ ~‡‘j+aHÛÊΤt\«?~v3Fƒ 6'™™Î³Î[>wS9B‚íñ’·{;3=ç—T#ZPÛ¶…ß—î Ë寋¼ÔìÙŸ«žõ7fªxw¶ËaÖ–âØªwçZûr>ý~ ©Nxd$m`ÕŽ,¼F!¶ÅHPí&ïú‰_ êR¿¼Gµ„þ9ƒe9Ñ4,J÷¶èδ´Äóͬmd{^£• j­éØ= ‹ÙGí¶1ìœý.“¦[ˆ¸þ!n¬†®t mb¦²èÃ8åü°W¨F¥ ólK$-þÃÏsøñÝɸ°àM­Î½©¦¾õ7Ýr{K?j-úˆm¥ý»&^ñÃ/xüÎ×ÉÃJp•útºsÍ-‘têÓ”eïßOÿ16ê>0–—»…a©Ø˜:þÓ8R³)‘V0Õ¦iy/ÛZíW2ËÝ#ï⣠o0øÛ|Ñ\sçHî©çÀp†Çv™ÂÚ3ìeqϽÂëæys †²‡QA÷"nü“ ŸLPpubsølŽ ÀJÓnÕù0n ‘··§ÒÉN3[ Ÿ†çýOø¿;ÞÄe ªÝ=Œ¬Màiʹ¢. >Ÿï¤ƒBñññ´jÕêœ KÖ¡å i=»¾[ùã_Kö 뤆»Lôë×iÓ¦©!D®–02ñWöß×é¬>¯¯4S¦LÑCMEDDD.%…-…-‘£t QD¶DDDDDaKDDDDaKDDDDaKDDDDNƬ&9;†‰¿ªDDDaKäb:ÕCöDDDΖn#Šˆˆˆ(l‰ˆˆü?{we½>~üý<³0À ‹ ¸ƒ@%à®™ë7óDj©Çókf¥¹[jZbYin}Ý2Û;'C³p)·òX'­_éÑŽt,wÔ:!‚0À ³üþÀ]fÌ¥ûu]]Wó™Ï}îçyîgaFi¶„B!Äejô™­ýË"…B!jš\ÙB!„fK!„Bš-!„B!Í–B!„4[B!„Òl !„Bi¶„B!¤ÙB!„fK!„BH³%„B!Í–B!„4[Bˆ«Æ²ŸŒQÃXqÐzÍ)›%#F²æHù3ç?˜-÷+þöLÆôïÏÿ}y ǰžÆ¼YkïF©×‹çùÍÙ§:¾ó»Ùh%BÔ¬ucúqàáws‡ ÅíÖW›Ö< ášhQs¶ì哱óÐŽ}¾±7Ú·×[8¼:ƒ£Í_`ÖcM0(Õ® ¹¸^êÆÇ¹; ÿó‡. ÇÅÏc?KXMÇ}#nc7b i¶„¸niBˆëØIæ|C)§øx¦øùz€rØqª”?é(Aí½8'@Ù.–Œ›‡cÄ<š`¨ø¹íËVÔpÜúz½ u,¤Ùâzd;¾•µï/aKVM u“cȰ.„Ùö“1~.êÓ èÛà KÆ.ÀÞ¹ æÌ,òO¢ÞúO O¥žŸ8)Ý¿šôEd¨ÔJèF»ÀïÙ2IãÐ9ΰ{ÙV~»›übÚ°¦t|l4=ÛÔâÊsz'–#_“ñÎÇì8\¦hÚöIß®ÑTöœùO:¯Ïþ'O+D$÷ç±!÷Pß TÜB87çX=¶‚m¬{g1ßï:ŽUAB¡ôïÓ“ê*ý[N†iƒùQk ñ€é évé3 –l÷ùp¯%›%c¢¤¦pêË/ØwJOûGòxj9ÿ\ô[â[ž×8cÅ‘Æ]Òv†ÿÌ}–ö”b;0†ç2¢è:y m›+Ï¥µ"[Ç–þûgò‰ |uq†s–’]Y.’+Ö x÷rÞš³–ìo;€'Gœýâ5ˆ.âçç³üë=œ±)è‚âè4~ ÷ÅúUÖí¹Ó]M8NTò¸eëxi»…F§«øW»®â÷´:´çþŸã*Ä]•×”ìàÍÑËH˜1‹Îµ5€…CïbIÀsLêƒÖ~¢òqêf¹OÛ(€¼Õ™›õWÒ&µ'H(ãÀ»£X¬<ÃäÁ \2soǯ¬ŽÇö`ÿ¬®ç^…ùMœÅdy IDAT ;i¶„øƒX°nÆBv5ÃÄqI„)gøýЩÊ/Û—°û×[™ðÊ`Âø•¯^L#cK2£»„¡”îæóy+)ë1Ù÷DQž½Œ7fžÄÖõÂËõº1pÖD;8¶y! ßz—Æó&ÒÂtÙ›•îá³Ùr¬KÓ¦ÞûWòö¬é¬n°€cÛq2·0bæG4Vö³qÆTÞ_~ ψ㒛EÖ6Ì\Hv«q¤MhAàɱbú<–ÖŸËÖ'\ÄíOüÐgi·Ï‹ÛOnò¡º‹W_ÃΟL Ÿ¹”úæÍ¼?yó÷$“:rsÂñÍ´Èøª#{7@ã.Ž;B/4J0-ÇÎÁùÊp¾é´€±k¡”fóÉx7¹,/ +'– ¯>EÄ¡ºÈ…åxÅlÓ1tj:O)»XõÂl>ݒ̘.—63ÖƒËY±½-x‰¦!P–—CžAëªëw=¦›šè­©ì=LDy»Ž¾™Ô|ÜÕxMMã¶f+9<‡ßÑ•ðuÿ ût;’CU(ÙË™ZŒÅÏ—ñ/ÞTVÇ%;Ø_…öÁÝüÄ¥äy!®"ëá¯ø·¹ }(™p?EBý& ¬lËӄТ{ a:@W‡øæAœØ— (?¼‰]κ߃AÕ`J¸ŸÔx¿ ·¤Ô`â:¤Ð(ÔUõ§^û>´ <ÌžcW>Äj=ò ¿Ønçþî 5ŒMzrÿí6vnΡ@ñ'¡oOâL4Æ&ty¨eÛ¿#×zù8ÙVÔšÞ}ZªSÑG¦Ú³69›÷QèKÜ®¸É‡Çx• šõM%Ú¤A™DJCжìERC4þhug§÷æQî!Ž2Oëë)—ª‰æ÷u B¯€/7ÍìA\°5(äÛƒ9y.ö‹M£G);Îäb¶©"ãˆ Öø<¦Û8|yêºqWã55:ŽÛèùM <™ö ŽòCæI8)Ù»‘=†öÜåW#ãW—Oó“+[Bˆ«ÅQ|œ2cê©ÆŒ¡ š;Œ˜Ë4Ö½{ÜÇ­€³Ç_âõf\Åáñµžr‰´ª“ ÅHt·aŒê6 {á¾[ø2é7奉øÕT®ÞãImµ×±êWÀª··¯QT´ª»ý|K¥Ø‚3ÀÃ8»]ÕjVÁÔü§Jæ~ö'åÑz•>ãU­mÂSÌ50¿?ý±@R ÄÕ£¾›¶;XµâG ,Nœå§ù}ïaÌ>~8“.ªñü‹õßäPæ´S”½† Ù–ó½ÃZŒMNÚh°S˜õ%™ù¶ÊçÕ…fÚí¬Ù°³ÝŽyßzÖü¨¡YçÆ핳”ìë9TdÇaÞÇ·?á×¶uõ—ÇÖÛ [Y¹j',NpX(üu'¿ì/Dë.nÕŸ ¿òóK¨êqÚ—x=¯‘ë8<-“Ç\zÜW/¶ÜmdfçQfw¢úlÔ¡QŸÿâÑ]Š«÷¨lîÎRŽþc ÿÈ<‰ý*nWU‰Ûë×è#‰­u‚]»Oàly?°égóùZp9އ×Uµfc"O³éƒ¥ŽìJËMÍoæ^ó“+[Bˆ«Ç/ŽÏ ÇñîÌ4‹r‘º)1$.š@_NäšÒç™Þ|´h–j¿›v­k±MUQ]Lzµ|ôñ£0…alO\˜‹Ã½<½ž@Æ;3I[^ŒÓM›~ÏÓ»‰?ŠÐFЪmkŸ{”C§ vržxð²‡ãübé>iêû‹™õø ÊÐT?‘¤~ÃIt·®I=[‘ùÞ`Æ,ô#æ‰ùŒ¾+ܧ3?½/ñz\#7qxz­§\zì¢+ÉE{šÎ’¶¾û&éyfìªðÄ{ydàmø|÷ÖMÎC.ÞCç¼rîÿ£!÷ûµliÒŽ»Z׺j›UUâöú5šº´Ô“½‹&2e}(A‰ÄLJPàiêöuU®Y%˜®­aêfêNÂÕ]Ïjmb®‰ùýÙ)Ngå·oßNRR’dHü)ü~£}²³Ÿ¦dc›×OäwÙÞ²OÇÏG÷ô|úÜpH*ÄÉqìsfOÞI×9/Ò6XùÓÍ¯Þ ¾«Y¶l™ÜFâÆ`çLöŽž.Çé,çôΕ¬?NËfaèóöâßÈ-5R;HN_…øcN¬J8´a#…Íz¤ÈünPrQˆc‹åèFþ>{§¬N” X’K—zÜ&l=ð7f¼¼ ÿ®ÏÐ2Lš-!®úVæ{=3Ÿƒ¦;é7¹%ŠÌïF%·…à¼(„rQ!„B¸%Í–B!„4[B!„Òl !„Bi¶„¸AYö“1j+Z/ýwÀvìkþöLÆ<ÒŸÿûò ÿyu3¾8†Ã÷7áð߆òòâ_¤|ųY2b$kŽ”ËzüQù¸l­¯‹ú»ê¦&òâf›º®j@H³%„¸´µiýÀô ×ެþ”£Í_`ÖÒ¥ŒO¢A·ÿ¥k|7Ä_b[öòɈ¡×¾™¸^c¿x­ÿ̹r» q—«¤@ˆ&„¸ŽÎþG)Eye˜:Dà§TlÖá·ÿ…pÉÒÍ·ÖIGåÛ€Òl ñ'â¤ìàZÒßø„_òUj%t£]à÷l ™À¤qèJvðæèe$̘EçÚW¥½7Š%Ï1© ZÇv/[ÀÊow“_lC֔ަg›Z—~R¼e?ã碎™JÜêI|´§Û1<÷qÅÅêr³™ˆÿ}ƒ ÷ÖAlÛX÷Îb¾ßu«>‚„Céß§9&õ¢ùWMø wâ.FÅ»—óÖœµd@xÛ<9"•z~ àÄräk2Þù˜‡‹ÀMÛ¾#éÛ5ƒã?<Ÿå_ïáŒMAG§ñ¸eÝkl9u¦ æG­Æ¦3¤cØ¥—Ý-Ù,»{ç6˜3³È?]ˆzë<1üìûºË›%›%c¢¤¦pêË/ØwJOûGòxj9ÿ\ô[â[ž×8cŵ@×ùª<gþ“Îë³ÿÉÁÓ ÉýylÈ=Ô7(àv½ë²ÿmob?»ÖOÏ$Ñ›\¶ã[Yûþ¶dåaÑR7ù1† ëB˜ÆÍú”z¨MWuîCݸ̓»õ³WV7S¸¯ÁѳyY@ßX½ë˜/·© Ù#oõDæfý•´Ií©øPô2¼;ŠÅÊ3Lœ€Ÿ/±ùROëØÕ6`'oõ³.çÖyUêÆMž\­_|neu£õ>f_·)´„ßÑ•ðuÿ ût;’CU(ÙË™ZŒ­¤Ñò›õäv®n¶wsמ<³%D ²ÙÄ.G =ºÆ`P55íMj‚Ÿ[d0qRhꇪúS¯}ÚfÏ1k5æ´‘mE­éݧ¡:}d ©=k“³yEG6±Ë‘LÏ»ã*æÛ¬©M<ôÍìA\°5(äÛƒ9¹/`=ò ¿Ønçþî 5ŒMzrÿí6vnÎÁ¦Ñ£”ç¿Gr1ÛT ‘qDûð¼&„ÝSÓº:Ä7âÄÙ÷õ˜7%ˆf}S‰6iÐE&‘Ò´-{‘ÔÐ#ZÝÁé½y”{ÈWY¥ùð'¡oOâL4Æ&ty¨eÛ¿#÷=Ve=üÿ6·á¯%î§ èC¨ß¤1ªûõ)÷¹Î}­7yr³~Šuã.æªlSšðdÚ78Ê™'qà¤dïFöÚsG”ŸÏ±ùTOžæêfðyÎB®l q£r˜ ( l†ñܱ@ñ#8"Ðû/‹vš9ºñCVmØÁï…6ÕA™Y¥•ÕYõ9£¸(›Åㆠ={¦ï´™Q–PZT€ÅØ Ó¹=b ´ŽÑý|5„^Øuhü´8OÙpNs–ÀxLºs?ÕaªkÄšU„ó ƒHgíGi|‘ uÚÜËý÷%!ÀÛFÔ€ÑpáüPÕª8­ïë1oš‚ÎF¥hÐiµjœý^ åc¹Ë—Õ—Ÿ¢ª&ÂC.4Úà:ø—ýN©ýÕ`ñqÊŒñ„è+¯OWëc÷ápà0W¡nÜåÉÍúé<×»˜«´M©a$veÍÛ9Ù©=¿mÌÂØáaêè|ͧzò4WwÛ€¯sÒl q£RÃ0˜s)¶C¤pZ)’ØZ'صûÀ–÷›~6Ÿÿ<,‡µ›>œ:µÐ`§0ëK2ómÕš“>º·¶²rÕNXœà°PøëN~Ù_ˆ&ª ‰Îí|ûóéŠùä~Ǧ¬RªÚ÷裺ÐL»5ö`¶Û1ï[Ïš54ëÜ%w™Ùy”Ù¨þAuhTEõ'ȯ„üü’*¿oMæÍ]¾*ýÜ2g)Ù+Ös¨ÈŽÃ¼o3~¯mêê=¯7¾ÆîÅïë£ï¦mÀV­ø‘‹gùi~ß{³Ãýúè<Íõò:÷µnÜäÉÝúÙ\Õ—1Wµ6c"O³éƒ¥ŽìJËM•b󥞪[Ç>ÍYÈ•-!nTнžù+½1‰ K5„ÆßÍIµØzî4ui7¨'{MdÊúP‚"‰¡àÜA#¦½Z¾FúøQ˜Âƒ06ˆ'.¬š÷übé>iêû‹™õø ÊÐT?‘¤~ÃIôO ×ÓÝI{SW„ܘئ!œªê{ùÇÓëÙd¼3“´åÅ8Ñ´é÷<½›øã<”ÃÖwß$=ÏŒ]5žx/ ¼ ½ÎIRÏVd¾7˜1 ýˆyb>£ï ÷éL°Fóæ._•îE#hÕ¶ˆµÏ=Ê¡SP;¹?O}að9¶Ü¯øÛ3ýÓ¿?ÿ÷å±Ê? ½ªª× Ì’íz­¯öØ7CÎk8†«ZãBT“|ôƒØÖV›Ö< áôÇ:[8¼:ƒ£Í_`ÖcM0xû'á–½|2vÚ±¯Ó7VÍãrþ?æ]@Ž‹ŸÇŒú;cî0qÃýÅ»·y¾.jézݪXãBH³%ÄMFB\ÇN×àË)>^†©C~5}rØqþAq)Aí½8¥âû÷Êv±dÜ<#ÞàÑCÅϵ:©¥›?‡§ª¹l­«Q㕎÷¹Vï}-c–fKQ³œ”ìù”·çÿ‹úƒ_¤oÓ¬?õéômp%c`ïÜsfù§ Qo}€'†§RÏOœ”\KúŸðËq…Є¿p§Ñ!®ßËräk2Þù˜‡‹ÀMÛ¾#é{W({æ=ËG{J±ÃsQt<…»ë_ôÅAöüüñ|–½‡36]PÆOà–u¯±åÔi˜6˜µ˜Îäã|‚„Céß§9¦KÞ(%ûíÊò à x÷rÞš³–ìo;€'GœÍ£e?ãk(ç•®ÿî‹õ»bl®bÂMž\ßàè…bõ®Ç.ÏfÉå5÷êâ çR†ÿ̽²Æ;Ú6W^Vãa#oõ³ÌÍú+i“ÚSñAìexw‹•g˜<8\Õ[éÞ½Œ„³è\[X8ôÞ(–<Ǥþ1h-žÞ(ñ0†›õò)‡¯E„° Ó˸”ÒÝ|>o%e=¦1ûž(ʳ—ñÆÌ“غV#×îb÷¿òìÝvœ?™>s)õÍ›yò<æïI&uä"æ„ã›i/ñUG&ön€Ð7êÆÀYiìàØæ…,|ë]Ï›H ½›µ¶æ°næB²[#mB Oþ‹Óç±´þ\†ÜzÑòþĻʳí8™Ût šÎSÊ.V½0›O·$3¦KØ•ÛV#畯%‡k\Å”¬ºÌS|®ã»»5WÖÜ%=x0-ÇÎÁyq—fóÉx5ãa<´„ßÑ•ðuÿ ût;’CU(ÙË™ZŒÅ¯tŸ¸ª·(o.4»{oÏ\®—9´î{‡iÞ¬»¨ò€¼5ÞhÙ8¹õ-æ¿}˜6ϾDÏDSåš&„ÝSÓº:Ä7âľ|l€õÈ&v9’éywUCP³>¤6q½g¶ù†_l·s÷Œ Æ&=¹ÿv;7çx| ^ÑèQÊŽóß#¹˜m*†È8¢‚ÝÇ®Ѭo*Ñ& ºÈ$R‚¶e/’ú£ñoD«;#8½7¯âµj0qRhꇪúS¯}ÚfÏ1«Ûµ¶Ùȶ¢ÖôîÓŠPŠ>2…ÔžµÉÙ¼2oSL4°qÁZÔ ’oæäÙ<Ödν]·1¹É“7ã{Ì—§šóµ&<Œ§ O¦}ƒ£üyNJönd¡=wDùUk[£ ±x»½úšCŸ·{!W¶„¸®8Nðó?ØùîŒ p½;U  Ú0U«â´ÚpNsc3Lç¶PÅ@h#®v…s–ÀxLçïÃé0Õ5bÍ*Âîaºº˜ô@:k?Jã‹\¨Óæ^î¼/ .^  $$À]3æ&®’”6Ãxî办 ÚÕ:ëó9vMÁçæ¯hÐiµj['^ åóÅiæèÆYµa¿ÚPTef•VV§Ûµv£¸(›ÅㆠUÎõef”†%XàMÀš@B/ì¢5~Zœ§ÎΫsîrýC/]c·1ÙÍ|]yžt žëË}¾‚<לO5áÅxj‰]cYóÅvNvjÏo³0vx˜::(w;¶Ö»u ¨zSãj½b|Ì¡·ë.¤Ùâú¤‰¤ý؇(]<—·V¥1¢Ï­øûx«†áWv‚Rû¹­Ô†ùT)ŽHW¿ŽŸ9—¢r¨«(§(·}¸ »NÅHt·aŒê6 {á¾[ø2é7å¥'µ @¥ßžZÅKQj@s.ÅvˆÔN+…ùfõ«žîjÅîíèç|¸"ŸNi ˆ¦ü«ÆO¥ÐÃZ«ÆŒ¡ š;Œoq•çà1ç®ÖD"OÝ]L¶#KyÝUž\Ö—Þ«±±dû\s^Õ„â~ALÍï¡qú§dî÷gßpR­‡°»[± UØÏwù,Åœ>l?Šê~ ùœÔÕǺgƈDÙ‡_íPR ÄU8‹©•B¿†¹ùUÞþüe>HuQ]HtnçÛŸOãl¹ß±)«WÃ裺ÐL»5ö`¶Û1ï[Ïš54ëÜØÃCç`ËÝFfvev'ªÁFUAQý ò+!?¿„šêtQˆç_¬ÿ&‡2§¢ì5lȶ\ßYÊÑ,á™'=^‘«‰Ø=^!±cÓ‡S§vìf}If¾ÍãZ룻q»a++Wíà„Å  …¿îä—ý…W~þÓUȳ/9w¹þ—çÙML67yòf|ŸòõÕ„bL¤Câi6}°”Ñ]i¡ñ<¶>’ØZ'صûDÅv›÷›~6ûƒ‡1\åÓÏǺGÈ•-!n¬3™°;yäE;é/Må]í†tóþµŠ½žîNúÛ˜º"„ÀàÆÄ6 ᔫøÇÓëÙd¼3“´åÅ8Ñ´é÷<½›ø£P価(Éaë»o’žgÆ®O¼—GÞ†^ç$©g+2ß̘…~Ä<1ŸÑí«—% )}žéÍG‹&1a©†Ðø»i׺ÛTõìÁ·ŒÜïײ¥I;îj]Ë»AÝÆ^=ú˜>ôjùéãGa ÂØ ž¸0çµîK÷I£Pß_̬ÇgP†ž ú‰$õÎ× tõj<ϾäÜåú_>Ÿ›˜š»Î“ëñy7vU‚vWÞ~†ªHL×Ö0u3õ'qþîš»±íõdLYJPD"ññ!øte¼®Û1\æÓOãS]#®Åé¬üâõöíÛIJJ’ ‰?…ß­’ƒkÂYÈOÓG²±ÍkŒ¿'yZDr~=qûœÙ“wÒu΋´ –«>×J=ý=ÿeË–ÉmD!ÄÉΙì=]ŽÓYÎé+Y œ–ÍÂä /9¿ÎšÒmØHa³$I£%ªGn# !þÈ#–£ùûìYœ²:Q‚bIzl,]êÉ®Hr~eìÌ÷,zf>MwÒorK¤×Õ$·…@n# !ÄõJn# !„B·¤ÙB!„fK!„Bš-!„B!Í–¢ÆXö“1j+Ê_ˆkS3¶Ü¯øÛ3ýÓ¿?ÿ÷å1÷ŸÖ~“Õ«O± i¶„U9híå“C¥Ñ¹ò,ká=mmZ?ð0-ÃkâS¾,^ÁÑæ/0kÉRƧÖùÔþ̱K³%„¸ž8ì8% âz¢ !®c'â‚k¢Ù*§øx¦èüþtŸ…UØv©Ã?úCR DÍ9ómÓ7w#íÅN•ä³±ù®Þ8¦=Ö½|2~~Ï̧wŒ[Á6Ö½³˜ïwǪ ¡ÇPú÷iŽéòS û ~þx>Ë¿ÞÛ‚.(ŽNã'pËº×Ørê4LÌZLgHòq>»[Ç–þûgò‰ |u8 ó¾&ãÙq¸LÑ´í;’¾]£1X³Y2vöÎm0gf‘ºõÖxbx*õüÀIéþÕ¤/Ê «@¥VB7Ú~ÏÖ LwÑ—úÚÈ[=‘¹Y%mR{*>p»ŒïŽb±ò “'àç1¦)ÜW7‹7G/#aÆ,:×Ö½7Š%Ï1© Zóñ<_—ywúçŽa©–’ýve¿S‹ò#.ò~ùÁ±d‡û¸]å+ÖÏû:²d³dìB”ÔN}ùûNéix÷HO-矋>`ËÁBüoëÃãúg¬˜ Ë±9Ãîe Xùínò‹mhO£ë6 IDATÚÒñ±ÑôlS ÅCMYö“1~.êÓ èÛà`ÕëïÑÚìšû,í)Åv` ÏeDÑulöÏZá¦~Ü](ò0o‡§˜k(·N×k}žó ÿ¹<öÉSèhÛìv;¿x¿0uÎÙaK³%ÄÉךàe?òßÒNes ¼úßþM®åŸø…Cå±ô©«kf.$»Õ8Ò&´ ðä¿X1}KëÏeÈ¡—\r¶\ΊíuxhÁK4 ²¼ò &¢†>K»}óÐŽ}¾±g?õÏrÊ Èʉe«O¡J÷ðÉì9Ö%iSoƒý+y{ÖtV7XÀƒ1@y»½• ¯ &Œ_ùêÅ42¶$3ºKJén>Ÿ·’²Ó˜}OåÙËxcæIl]¯Ü•„ßÑ•ðuÿ ût;’CU(ÙË™ZŒ½´Ñr“çÝ‘ÓÃ|<ýÜ]Þ ó!Ï—ð'¾²ß)Íæ3Wy÷íK²]æË‡:ª8ÂgçO&†Ï\J}ófÞŸ<ù{’I¹ˆ9áÇøfÚ d|Õ‘‰½ q7v²Š¾Q7ΚHƒ`Ç6/dá[ïÒxÞDZèÝ×Ôsªjý)Á´;ç+Ãù¦ÓÆv®…R²ƒýÕºXä~Þnc®¡ÜV^‡—m•Å^šÍ'ãÝoç—ìÄJn# Qƒ4áM‰Õbw®…ÒœŸ(iÒ‡!9ì9n¡ø@&gêÝN=Xld[Qkz÷iE¨NE™BjÏÚälÞGÙec*=JÙqþ{$³MÅG”»[0ª‰æ÷u B¯ Ö#ßð‹ívîQ£Áؤ'÷ßncçæÊ4!´èžB˜ÐÕ!¾y'öåcÊob—3…îwÅ`P5˜î'5Þ¯ÒFAžLûGù!ó$œ”ìÝÈC{îˆò»âw}ŽéܱÐÃ|<ýÜ]Þ-Uœ“ËÉSÞ}à*_¾ÔQÅ@A4ë›J´Iƒ.2‰”† mÙ‹¤†þhüÑêÎNïÍ£ÜC®ÊÔ`â:¤Ð(ÔUõ§^û>´ <ÌžcgŸYsSSWNÍÔ_ÍlÀnæí)æÊmUëÐc½]¶_reKˆ—_£JY›ý_=FXRkšî[Ϫ½Çˆþ%—ÐVq°£¸(›Åㆠ=»ßsÚÌ( K°: à¢Ó ]̃ z µ¥ñE.Ôis/÷?Þ—„WŒ@B.ìœæ,ñ˜ÎßóÓaªkÄšU„ P  ÞPÕª8­6œ€³äeÍ0žNÑT;°ò³45ŒÄ®±¬ùb;';µç·Y;ï¾q•¯ꨢ6>WŠV‹¡VÀÙC¯‚F¯…òеw—+«ÝLÁײjÃ~/´¡¨ÊÌ*­¬gŸtSSWÖM Õ_\~p3o§™£ÝÄ\C¹uY‡¡šjÔ[Ðû!Í–70´‰äÔ¦ïÙQH|ïZÔ16¢hí÷ü;Ï@Ì}ᨀjŒÀÁ ¹ÃˆñótYÃHt·aŒê6 {á¾[ø2é7å¥'µ @¥ßnzщ«ŽŸ9—¢r¨«(§(·}¸ O»^5 ƒ9—b;Dj§•Â|3Žú•NSó{hœþ)™ûýÙw œ”GëUþ®bz\E«:°ŸïFXŠ-8¼›ÇŸ{È{ˆ¯y¾,çÿŽOyWÜÇí*_“ºúPG¾önre;²”×WäÓ)m!£¢Ñ”bÕø©ÖtïãSýy‘Çj°ýœk(æ*ÕáˆDÜ-±Wõ&´®¹(D oRÆ[Z”³–íeM¸¥–¿Fm >¸šLs4MëV<,¡îÆí†­¬\µƒ'8,þº“_ö^ñY9¶ÜmdfçQfw¢úlÔ¡QÕŸ ¿òóKÜþÅ¡>ª Í´ÛY³af»ó¾õ¬ùQC³ÎÑyº¢Õ‰xþÅúor(sÚ)Ê^Æl‹Ë÷SŒ‰tH<ͦ–r8²+-#*oç\Ƥ$¶Ö ví>°åýÀ¦ŸÍçsâi>ž~î.ïÖêä¹’ßñ)ïâv•/?êÈWîre³cÓ‡S§vìf}If¾­Æ·&_ëÏS«ÃQƒ1W©=Yí\È•-!n¼*¢Wp:¦zPÔ[I¨åà1‰úçΰýbé>iêû‹™õø ÊÐT?‘¤~ÃI¼|'_’ÃÖwß$=ÏŒ]5žx/ ¼ ½ÎIRÏVd¾7˜1 ýˆyb>£ÛWv±-ž^Ï 㙤-/ÆiŒ¦M¿çéÝÄÅÃÇB)MéóLo>Z4‰ K5„ÆßM»ÖµØ¦ª•ïü•@bº¶†©›©?8 Ww>\ƤQi7¨'{MdÊúP‚"‰¡ÀËùxœ¯›¼ß¢úç»Â/=SÕÕ«äwÜäýò„hêºÛe¾ü4^בÏÜÕhó>ôjùéãGa ÂØ ž¸°š?¤û\òX­æ3¦c®Jz¼¨^õí\\}ŠÓYùÅñíÛ·“””$ ¿ËÎÈ;ÎB~š>’m^cü=‘•Þ"tûœÙ“wÒu΋´ V®í|¼˜¯¸¹êOÜ|êÝà=¹lÙ2¹(„pÇΙì=]ŽÓYÎé+Y œ–ÍÂ*?Ð9K8´a#…Íz¤\ƒùø8_qsÕŸ×)¹(„pw)ËÑü}ö,NY(A±$=6–.õ®Üu8Ï|Ï¢gæsÐt'ý&·$@¹óñ~¾âæª?!®grQä6¢B\¯ä6¢B!„pKš-!„Bi¶„B!¤ÙB!„Òl q³ì'cÔ0V”'þoº5²d³dÄHÖ)ÿóÖÚM_ßÿm(//>@y '¤Ùâ&ÚWîå“C¯ÿƒÁ5Ïò#¬Ó—Ñ\öÏ”ÿG‘ój¼_Ÿ{šu¿’=çIl-Ây½å^[›Ö½€¾±zlÇ·²öý%lÉÊâ ¤nòc Ö…°JðŠw/ç­9kÉ.€ð¶xrĹy8±ùšŒw>fÇá"0EÓ¶ïHúvÆà¨lý&p˺Jêà/SjÙOÆø³qDyW%;xsô2fÌ¢sm `áÐ{£Xð“úÇ õzýmä­žÈܬ¿’6©=_VPÆwG±Xy†Éƒð«B•ØOì'×Ö˜ÞÿÓŒZþ4js7(­|ûn¯eO¥ÛY-4Oµã¤ìàZÒßø„_Ž+„&ü…;ñ´ _û’Úzu8 þëfœ¥»ù|ÞJÊzLcö=Q”g/ã™'±uõöjK8­|¥–?¦néi@ñf\kÜ­Qy»½• ¯ &Œ_ùêÅ42¶$3ºKª¯Íʉe«O¡,È<ß°`ÝŒ…ìj>†‰ã’SÎðû¡S\u¥¶ãdnÓ1tj:O)»XõÂl>ݒ̘.a¨¥{ølö‡ë’Æ´©·Áþ•¼=k:«, —¦²õ3UY8ô•æÐëÁš©ï×_Kø] _÷²O·#9T…’½ü©¡ÅøXÏ–‹:ÑÔN¤±~-«?ÈÀÒ¥511Q„›Î$øW¾};θÞÎôj§4›ÏædPœú ³»7Æšõ¯Ï:‰­›Û°¾’Ú*Íf™‡ñĵ!Ïl q•Yld[Qkz÷iE¨NE™BjÏÚälÞG€D³¾©D›4è"“HiÚ–½HjèÆ¿­îŒàôÞ¼ ̪F{¶#\ h#hÙ³%–íß‘{ùc$j0qRhꇪúS¯}ÚfÏ1«Ïó´hô(eÇùï‘\Ì6CdQÁÞÞ[)çÐÂ'xfÀC<=à!žПŸä`«ì7ob—3…îwÅ`P5˜î'5ÞÏû[#ª‰FÉ)4 ÔÒ¬‰:¯Æõ¸FšZtO!Lèêß<ˆûò±yóZÕDóû:¡Wà²H¬‡¿âßæ6üõ¡dÂý}õ›4&ÐÕžY1ÑüÁÄkQƒH¾=˜“ççñ ¿Ønçþî 5ŒMzrÿí6vnÎÁæËú¹È¡;Jµê£jë¯ O¦}ƒ£üyNJönd¡=wDùU¹Nckye<)~»ùç[“™úT?Ò¦¼ÏŽ<7«{ÚÎÜÖÎ&v9’éywUCP³>¤6Ñ{?öeµåqÏÓý ƒHgíGi|‘ uÚÜËý÷%!TãÕn¦ác3y²ñœýC+ý"aGÉ Ê›a<÷CEOPíÀjŸz×㩌† ³Pµ*NkÅš8=®o !•çÉQ|œ2cʸY™·r½=Éû–µËÿɾßNPZn£ìøN¾]·gý„ŠÛ€•äËívæ±.»èÜη?Ÿ®ÈGîwlÊ*­òØžÆreKˆ›ƒ®I=[‘ùÞ`Æ,ô#æ‰ùŒ¾+–î“F¡¾¿˜YÏ  =AõIê7œÄ*mµ´I)aýsrèÔNþ_žx°’‡ãcúЫåk¤…)<cƒxâÂtUšç-j[ß}“ô<3vÕ@xâ½<2ð6ô’ûýZ¶4iÇ]­k¹˜p9‡ßzŠqo]ô¿"äùÙRW[vÉë•€¦ôy¦7-šÄ„¥Bãï¦]ëZlSÕ³î2/Þ¯’ƒ²§qýª±FÕzm=žŽãݘ1hå#uScH\4¾Ö…<½ž@Æ;3I[^ŒÓM›~ÏÓ»‰?ÎC.ÖO笤Â}> w”¸ªËhêÒnPOö.šÈ”õ¡E$B·ëtÅÂÓµ5LÝLýÁIœ¿ké,åÔI…ºIõðå‰%Å‚>o9Ÿ¼ô6%NPMÔmÙƒÇÝUñסšJ¶›În¶3OïçŸ@¯§»“þö¦®!0¸1±MC8åÍ6\…ñĵ£8•_@Þ¾};III’!ñ§ðûò…–l–Œ]DЄyÜ¥»ùÆYÈOÓG²±ÍkŒ¿'²æn]­qžþŽcŸ3{òNºÎy‘¶Ág[²’ŸøûËß“òâHâå“§ntõnðgü—-[&·…×;g²wpôt9Ng9§w®dýpZ6 «fCtµÆ×tý%Ú°‘Âf=Hº¨© hÅ Y£¤Ñ× ¹(„¸Ž8±ÝÈßgÏâ”Õ‰KÒccéRO{Ž+®Õú;Ï|Ï¢gæsÐt'ý&·$@ú*q“ÛˆBpÝFBˆ?¹(„B!Ü’fK!„Bš-!„Bi¶„B!„4[B\#–ýdŒÆŠƒò4þ ™»›zý,þÛP^^|€òtÞBH³%ğȺ1ý˜¿µèʯÈÐÖ¦õÓ2üþd'E»VðÁÄAŒy¤/£ûà…çg°>»øÚGyŸ{šu¿’=çIT–·kš»«4Ë^>1ôæo¼ÿ,q ái÷!)⢠!®c§?üm…ÛX:÷s¬÷MdJ·&˜l§ÈÝ·“ÿV¥gpØqªjä#vk”»™CMæìzt³Ç'„4[BÜHgùûÉ?õéômp%c`ïÜsfù§ Qo}€'†§RÏO’¼9z 3fѹ¶°pè½Q, xŽIýcà¿kx}Ê×ÄNœÅ}·øãÌÿ'oOÊ tÔÿñpsÓ%>û‰ýäÚÓûšQË ‚Fmî¦ÑE¿c+ØÆºwóý®ãXõ$ôJÿ>Í1•g³dìl[RøïŸÉw$Ð3å+ö?Àäçï¤âC»Ë8øÞhþîxšžJ@ãõX‰ |é^ßs]ÄÏÏgù×{8cSÐÅÑiüî‹õ»âe.ãâ »—-`å·»É/¶¡ kJÇÇFÓ³M-4ö•ßàè…9Äê}ÈY"_AœáܬJÉ~û5¶œ: Óó£Ö@ãÓÒ±åG¾&ãÙq¸LÑ´í;’¾]£1\ÞÉx¨­%Û}}á¤ìàZÒßø„_Ž+„&ü…;©JM$2ð•‡)YuyÎ&p˺Jâl¯e«Ü×À¼…fKqAy»½• ¯ &Œ_ùêÅ42¶$3ºK˜ÇûûÚú÷òèƒÿæµE“øJ*¹o/&¿ÝD53]q…AS;‘Æúµ¬þ K—ÖÄÄDnÒ]ø=kf.$»Õ8Ò&´ ðä¿X1}KëÏeHëŠyfåÄ2áÕ§ˆÐƒ#w5ßüã+ö¶«ø.ºÒlÍ„¦ÏÄâgÍacá(FÿàÃ(µü1uH×HƒÇ+$ÖƒËY±½-x‰¦!P–—Cž¡’]™»¸’Uôº1pÖD;8¶y! ßz—Æó&ŸëÅø>æìRþÄ}–vûæ¡û:}cÏþBi6ŸÍþc]Ò˜6õ6Ø¿’·gMguƒ<ïïû•#wõUšÍgs2(N}…ÙÝcÍúˆ×gÄÖ­jñY÷½Ã´+rf"ª²8g\æ¾…¾šóâ:%Ïl q­hBhÑ=…0 «C|ó NìËÇæåyRø]#éùïM™ÂêÓ]yôáü+9"+ÆÖ<òÊxRüvóÏ·&3õ©~¤MyŸyB[ld[Qkz÷iE¨NE™BjÏÚälÞG€j¢ù}ˆÐ+€‚‘BríCüðŸS8€²_“­M¡]”ŸÏc¡šh”œBÃ@!Í:áù˵¥ì8ÿ=’‹Ù¦bˆŒ#*øÊ{¢nç¢×!…F¡~¨ª?õÚ÷¡màaö³z5¾ÏqzÁzä~±ÝÎýÝ0j4›ôäþÛmìÜœSµ‡ÖÝÔ—õÈ&v9’éywUCP³>¤6ÑW9>oפâ¨ã:÷Õ·reKqÙAÇ€Ñpá|GÕª8­6žcªMónMY5guŸ¸—(Wu}Ýdþ2,™¿àÄv*›M‹¦“þz¢^é±ðÅEÙ,7íÙ!œ63JÃ¬Ž Ð ¹ô}»ÔáËM?QØ>…߿ى>åêùÍ×±ª@ó ƒHgíGi|‘ uÚÜËý÷%!ôÒqîæb7Sðõ‡¬Ú°ƒß m(ªƒ2³J+«]‚‹ñ¼»Šq:ÌXã1ï7u˜ê±fa¯áúrš °›a:wP „Ö1žÿ²g_ãs¹&•ÌËiæèÆÊs_Ýy !Í–Â{ŠŠVu`?”u`)¶à¼èàå,ÚÉê¿gyGË?äç6ciâébµ‚64ÝãùrÑ~N–C1chƒæ#æòÇž,Ùç^vq—Gh›®Df|MÖ¯F²wÒ&­!ZÀáóXUÉ‘ènÃÕmöÂ|·ðeÒ?nÊK#¹ø-U7s±YÊë+òé”¶QÑhʱjüT Ýÿ¤Þ«±½ŽS‹¿™V ÇÏœKQ9ÔÕ”S”[Œ>Üte3áE}¸íÃÃð+;A©ýÜQÀ†ùT)ŽÈ*Æç2gÚ+â´ýœ]徚óâº=·–Qó6+¶òò ÿØ}ü}$±µN°k÷ €-ï6ýlÆq¾Ó:CÖGoðKô<9l<ÿÛb/Ÿ¾ÿ§+¹bÏû–µËÿɾßNPZn£ìøN¾]·gýÂt îÆí†­¬\µƒ'8,þº“_ö^x¿Ëw¡mh×ð7¾^²Œý¦Ž´©_q9¦*cùÊ–»Ìì<ÊìNTÿ ‚:4ªrEoãn.6k16}8uj ÁNaÖ—dæÛ¼¿Úqªþù•Ÿ_rþJ¦>ª Í´ÛY³af»ó¾õ¬ùQC³ÎÑùZž®Fu!ѹo>]ñúÜïØ”Uza.>Æç2g•Äép“ûêÎ[¹²%ÄŸF9‡ßzŠqo]´¡µ™Ìô‘Þ¡©K»A=Ù»h"SÖ‡‘H||g¯bne¿4á¡™í ѪIóçç±ìûx†t ¿äJˆbAŸ·œO^z›‚'¨&ê¶ìÁãƒî"Lhbé>iêû‹™õø ÊÐT?‘¤~ÃItÙ,Ô"áóé[»‰xèN"ÎíIüª0–¯lI[ß}“ô<3vÕ@xâ½<2ð6®xrÇÝ\š÷¡WË×H? SxÆñÄ…é<ŒÈ»±½êê‘Ô³™ï fÌB?bž˜Ïè»âéõì2Þ™IÚòbœÆhÚô{žÞM*y8Þm}xqqÐ?^Ow'ýí L]B`pcb›†pªŠñ¹Ì™Îyeœ]ç¾Úóâ:¥8ÎJO ¶oßNRR’dHü)ü.Ÿ¹(„×¥z7øß@,[¶Ln# !„B\MÒl !„BH³%„B!Í–B!„fK!„Bš-!„Bi¶„B!„4[B!„Òl !„BH³%„B!¤ÙB!„fK!„Bš-!„B!Í–B!„4[B!„Òl !„Bi¶„B!¤ÙB!„fKR „Bqõh%B@=½ä@!ÄÕ!W¶„B!¤ÙB!„fK!„BH³%„BˆÿßÞ}GGU&nÿNÉLÚ¤'B¨¡ƒ4APPQ”e5p±¡€(‹®®þ\¤X‘ ¨ÈZWeYQ•UêÒéH‰ @BH¯Óîï„ ðùœã9fîÜû–Ûžyï;ƒ(l‰ˆˆˆ(l‰ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆˆÂ–È¥¢ìgf˜ww9Oþÿ*×Ùδ¡òñ^×…Ö’ßΈ÷váüEËED. Ö_­$ÃIÖOËY¸r#»3 q›ì8"ê×þzumBE;Cää³3’«ïº "jñä(ÛÉÛ#§àóÔ?gS‹ˆ\:aËMÖÚO˜±¨”ËûÄóp˺Yä¦ý̦7²» B* ²y=f &í#ù½²„ЪgõÃù ë‹ˆ\jaË(ÞÅ¢¥iÄÞ2’~í‚*ž]ÚˆlÔu(“ss¾ÀÝ>ŽÂ)d{rë°þÔÍ^Ç·_-aKz1øGÓ¶×ú^½,™½±„¦Ã†Ò5Ô 8I7/}òÈu°VlÏuycŠSÒ((.Æ\¯;·þ±3Ñ6xóÙ±àsæÿ˜J¾Ç„O@]®x/7Äøè¨óÎuú$'¢ IDATh5ŸÎø˜…›Qj ¶Û}<3²Q'¾©ìgfŽzó“Sg«Ù:nŸÍÄWÖÐðá1 éÆñq±6N{…EÙ¹0ö!–[}ivÿDžé†sï"fNÿ”{ ÀÑîw=ʃ76įrñæ±á㩼·dé…n|"Úð‡!áîÎaX0(Þõ5 oü›¤C&"ÚÜÄ^=^·ª—WR¶i#0õëJÖ·óÙ’m£qŸGy²Ÿ‹¯¦¾ËÂ]ù´¸•'ÿo ­M€Aé™ÚáÜδ‘SqõlOnâfÒ½­õò#4+Xˬ7?äû-™”Ù¢èðÇá—mÏÖ¼÷&L`„י“RVQš_}9>&À„3cÛÝ-¸áªX,4èFï–^vlH§FSÍ~4»º5aÀJ뫚àܾ™L`¶bræp(#›b ß°b5qL~…¬µg!Ë ;ñÀ +‰¶›0ÙBhزó9¬c¸9¼ê-ž›¶—«ÿþÏʹÉZðÃßI)ÿ£áƒ¼õR"O8\=™”8Z~óÓ«]Çs„įWá¸n47ÆùŸÕ\$Oa¥- 9ö݇º”m)À ØOúäTÄ®ÿ~ÀóבšçÆdöR\dæª2Oi¥m 9z¾š|‰¨xìL-/çÌËOËâOX@Å;Ll>VüÃü+‚¤ «ÝŠátcTÛŽ °p¼4O^yÛyã/C9ú9ÐpajPL™] ¼d-ø¿“öéœWûè@‘ +lùD6'ÖúvÒêrfÌØü±ù`3Wº-˜NÌJÁø”¡È åWd7…Y%Ø‚ý0›ÜXM^<^ãè]g‰ Ã÷Ä»H1G \X1î‚,JmÁøš“õºôçÞ.ýñ$éóøra#žºµ¡Ž 9'7¾Ìœ«ÈŽ(ü í„ØžÕ®c½Œ›žº“¢÷^gÂgÏ2úöfœ)q™À0NØv`¾…é于nÛEnZ!öÇ)×¾¹¼1û0}ŸOà…FX\)|0j<9€%0ßÒ#yŽ^YÜä”à>ZNÕËÏUÚa:¹OƒÃ¢økÂô°Wù©­Ú}*"RõUä×Ùò㆗‘:ïæ¯ßGv±·«„œ´}d–zO¾žÀÝž–,Z“J±×Kñþ5,Þa¦y‡:øXC©”OòÞ<€;{+«w•`œ´…2v/]Mj±oq*«ïÆÞ¢-‘>à>²­ûr(õ˜íúZ1›ôÝ$9ÿìzÓ=`ïÏNâP™áÊeߎ½xÏmkxW†¿0”ºK&0ñó]”§;ãýµ“žY|ì\±7ìEgŸD>ùv;¿å“µ:_׈Êi^g!.{õ¢ü±à!wóY™é.?_ö¢“‘Èü¹xWÚr¾Þ|üœ¬nù9÷ëY´£¼OoäZßÕ¼÷Ù:2Ë ð–‘›º‰¤ä|¼:LEäbÙ+‘Ý3Ô±Œ…+ÿÃôyEx0ãÞ€=ï¢gc§½ºÙpã øö«Y¼º´Ã/š67 â¦vL&úu#å‹w˜úƒƒÀÐ4iHöIuChÓº”%oO"5ßDX«¸óºl€³4ƒõ_Íã‹ì¼f¡®äˆÕ!¿BÚŠcàs#ð¼õ.ßýNK ±WÝÇ3Mâ8Çu,W3bœ‡„çÆ3É:–gþØøäIô>ué9 «ÞzˆÛ§Øi1ì ÆõnÉ½Ï æé“òïBŒÀ†\óçg¸ït“ã›ÜÊ=^!aÔH‚#‚ŠmIëˆòçv&¿VÜód?¦=Å£³C iDËËCÈ:ú¡«šåç̯ŠvœîWSíM¸kÌHÌ3>äÉ?O¢!õZÓóÏ#褣TDjsÐÉ0ŒÓ~°LLL¤K—.oËœû˜›ðw w´U{ZDDD~u³fÍÒ·›EDDDÎ'…-‘óèÒ}¾fkÀ€'þ¢=,"""¿)l‰ˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆÈ%A¿ö)R…œœu‚ˆÈ¯ 44TaKD'¿ˆˆÈÙÓcD…-…-QØQØQØ…-…-…-QØQØQØ…-…-…-QØQØQØRˆˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆˆÂÖo¯xãïˆ'>þqæex.¾íÿ^úñ')Ÿ>J|ü=¼¶®ã\7ç>ÀÇ?ø%Vç:cEDä¢c­ÍyœN°Ù°œÝÝ”ì-ÿeöç IÜžFÇ„oXZ_} ÷ìA]í£³ 'ùü¯£˜•æC§gßã™~å¯[ˆiZŸlW}B}Î_ñFn³¾É€ˆ›ÐÖ ©ó¦ñö‚$gÖw2ÓˆÃPÝrk ½þÔ–ÙÿHâÓïösÅ]õñÑ^‘‹H­ŽlMr7£f$‘Sã7‹_áñ>dñÖ4 |ëÒ¤iB\ûY÷õw$k$£ÖØ[ðÀ„×™òòct·œ§B<^; Nˆ¼¦õmaúçŸÉö%.ä a»Êå&BÚõ¦µÒý—”2íJ¹¸ÔêÈVA‰AÆÂ—ÍÓŒ°3¡ÕÜÓÜDÞ}wE@ð53é‘«‰ò '‡““ñøžã7òœuŸðÂWß²%ÛDTçÁ<5ª/ }M€AYÚÌ~o6‹7¥QdXkÖ“ÛºùaÂÀ™‘Èœf³hC*ù°‡·äæ§žc`JqáÈLæu–g[iv×xž»­)þ¦“j]EY6²–Lä±77Q=€É¯ÝMƒÌ¹<û×OH1ÅqÏëãé_Ïú‹ëzgèJžú»iÊ£ÿœHÏ';ÞÎs‹ ÊGƒ[ø÷È¿1/ Àź ƒ‰êÞõ¯÷=Ĥû&±ÉË=Ó^¥´™²´UÌzw6K6¥SŒGýNÜ4hñWD`-^Çøû&±ÉÅõñmØ¿p)Éy–Jý^y‡æ³}E @‹u*F ühÿÄ›¼M)[§<Äó«J*­TÝr0ÆqE,lÞ»žÕ]4o¬±-¹xœ—9[ _bô?«á*IYÆV'@#âu-Z&‘ÍÛm?ñ†žÆ×ï/§è²Xq“™ô>3VÁ xç¹)ÌÛ˜F@Ç>ô¿¾)eÉ‹™1æüãÅ(ØÈŒg_á‹SÉiI·WÓ*(yÞ“êãÍ]Ï{c˃VÓ;Ç&hUW–‰È#~…dÌ%aöJ¾œö))†•÷¢o=ŸZª« Ói÷f-{]C£Š~ iߋ޽ÿ@Ϧ§ìh£`=o?ûßlJÇhxWµ¦$5‰9“Çðqré ïÌdñ7©DuéFëñ~?-g&ÛÓ ‚¸ˆZ D– bcü€#$ï/ÒY+""¿ß‘­“×TÞë:“'Úùñ=¥yy¸lÔqT÷hˇv£^áÙî~lÿÇ0Æ./"mÛ!œ½Ã)Ý8—åù@TF@Œ¥€˜´Çyk{sצeà—,Ï®á﯎¢£Ãxq{Íp,W¤3ÿ¥—È.°wÇ8FÇ7;%hA^•eeѵOWAâ¨×X=o*ÿ|Úá/7ÕÁŠAî¹Ô5÷xØ2Ÿ.mYÂé|Ûí¤®ZÉž4šô{€aGçlWnÇW¬,Bû0zƒ4³òã«Ã™¼6“E_ïä·Zt¼ÂèÔÙÆº¤­¼óüLB'£sHåÑ™êÊŠÁ¸Óðϯ3+^/dùÌ/èûò â|Ï­®³µâ›ž¥ä•zÁQÀý•êhªèï¿_pB=ޤpØÙ“P[)‡ö攇àˆP|MîcÛ3ë÷jv¼OÍ¢`Ya6{³]i¯¥¬UDúÁ" ˜FõtÖŠˆÈï7lÙ}ÀÑ¡fA Àr%CîoÏßfl$wùk __—¸º¾gî'-·!þs"ÑÕd˜nן«ÛX™µ”¹‹mtk`£øðvlÞGýǦðHû\´eù+˜ød6ÝZ‡Rv`>wMæÉæG·@뻟æë3L]½˜—Ç1~Ü Z˜Îª¬v®ý|3õvz¬´z` ½6Obú_2ev'^½§Å¹Õµu=š…Cò‘}|þÖ ì`ñ®Ê9ÊŸÈ t³õãÞLªCË[î¢WH¥>kߟ«·±*{>ãG¦cp:‰J€H®ë× _¶ý`¡M×zr€í?eánƒ¼Ïg[òÈÞ^>ù=;éc¦æ„Ùe ƒ»‡’^åò(Ì%{HÚø·¡k¬]g­ˆˆ\Tju‚üc o3ý‰š­£Y/º÷ÿñÆèÁôjU‡€â4v%§pÄT—N7÷¡©ÍC™‚:ñð‹qKûhr“æ3ç³¹,HJÅÚ¼;£|09:0lâ“ èKà‘ŸøaÙJ¶äT©ùÖH®yt,nfÅØ÷%ã^ú†Ô2ã,Ê2Ø;÷ >Þm`iq#nlE¡Ãè쇾~ƒO¶Á¹ÔÕÖˆ? ïOsl]Ɔ’ö èà_©3‚é8ð6Z…˜p¥&²dáwüxØ}jŸ9:1âÅ‘ôm )I¬Úp[½NÜúÔ ná÷ Z‰îÞ—f&8¸l n¹?­`Õêµl?:çìðVÖ®^Á?çã©v¹Aá¶ÅlqBصýhᯓVDD..&Ã0Nû°)11‘.]º¨‡äì%ü4c$cÁ/&0´…ß¹mÏ“É÷£aæî KxžÞQõ±ˆˆ\4fÍš¥°%ç!o¹ 8’S‚9 œ°€s G†“ܬ\œÖ "B}õyŠˆÈE¶¬ê©m&QŽZÚ˜È(uªˆˆ\´4P """¢°%"""¢°%"""" [""""¿žZ Ÿ˜˜¨‘KÖ/ù¥ëo]‘K™#Šˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆˆÂ–ˆˆˆˆ(l‰ˆˆˆ(l‰ˆˆˆ(lý–Š×1þŽxâãg^†G{î7çd×{C‰çÞ„m”©C.ÐãÕIʧ¯­+À¨îíî|ñx<ñƒ_bu®¡ý("r¡…-ÓÉÙÞVÞ~ žøøxž[UÍÀ@LÓúÄ6n@¨ÏÐseɼó`yÝããGðé^ׯ_÷A>ÿK<ññ™´¡DGóoÑ×gzý9^Ü$f}“×1 ­SÙ^æOÇ_‡æÎøxâã1ô™¾M.*?ÿ¬1ôúS[,%I|úÝ~\Úó""VØš2änFÍH"ç||··à ¯3ååÇènùÍ;®d÷BVçý+“eÿKÅ©ãI.¨ãÕÃáµóØà„ÈkzPßFÙ~V-ÝÌaßF´ï|9±¾N²^Æû㦱6ÏL„´ëMk ¤/ú/)²9gµúo#”d,|‰Ñ<Íø;zÖ÷gF"s>˜Í¢ ©ä{ÀÞ’›ŸzŽu¶2þ¾IlòÆrÏ´Wé´±âï(®oÃþ…KIγÕy0OêKC_à¥à§Ï™š0‡Y&"ÛßLŸÀÿñ¯•¹ôÇ;#[awà›×_ç«-È)õv"š_ÍmÝÏ ý0¶žÅ$/H¤°×–ɑ•‹Ø3° ÍíÔ¬\ ÊÒ~`ö{³Y¼)"ÃBX³žÜþÐ}ÜÐÈSñºªÛgÙËG#ÿƼ,ë& &¨{×¼_ïä[]«+«¢/ó·|ÆÔé_°)ËLT‡›¹)À[åÞ,^÷"÷OÚxÊhgã¡o3ùÆp\i«˜õîl–lJ§3Žú¸iÐ⯈ÀZ£:UÓ‡§ŒNeòÃGÓøxñ62Ëk‘ »2øoC¹*Ü|æmÕËà_§ëë[GÑ~ùTæŸnô=Ĥóq¼VÙ†J'œ‘Ïö)@-:ÔÁÀ·9ƒ_þ'qC°®sxⱓVº“ éNºÛ1ÆqE,lÞ»žÕ]4oì£+¥ˆÈ…2²uTÆÂ—ýϳá2 62ãÙWøâÇTòCZÒ­ÇÕ´ Êã@^U7õL“JT—n4°ºÉLzŸ+ŽàŒÜµ¼9i6³<ø6lGœç>Y™{òêÞ¤yipÕÍÄß1€ëZÚÈÚ¹„“g“r†¡*£p; ~,\5x0}Ü5,ÜUþ©&åxç¹)ÌÛ˜F@Ç>ô¿¾)eÉ‹™1æüã­¾}æ Zöº†F÷Áö½èÝûôlxêN­q«éË—>cS–{ý64,[ÁÇ•û²ŸËºÐ·woz÷îÍuc*êe'<ØŽQ°ž·Ÿ}ƒo6¥c4¼‚«ÚGS’šÄœÉcø8¹´fuªqVŒFþô!Óço#3¨3ýâoçO½;éL'³Ä¨z[y§ïë1´®é>¨¥ãµª6œÂ™Éö4ˆ .¢¢’¶(ZT­òÁ/7å=IðŠW-AÄÆøGHÞ_¤«¤ˆÈ…4²uràšÊ{]gòD;¿®á%Ó—,Ï®á﯎¢££üÓ¾Ûk†Ò3­çG·¿ŽfTG+;½[ynq>iÛáìŽkû÷¬+BnàÙñÃiiÏfé˜aLßqÂÉÖŒ^Ÿ‚Í—çu È1•mY›ø)ÛC“hË)£o…?}ÏúR  =×¶iKY[;k’ H\°“âÖíðT[®AÞÆ¹,Ï¢ú3rØb,Ĥ=Î[Û“˜»6‹®×V×¾Öt¾ívRW­dOšMú=À°gèëêÚT³¾\_ _ϳ¦•ý‹Gç­gžiçSïFîFñNf=·/ý‡§Ñ%‚•_±²íÃè ÒÌVȯgòÚL}½“;®¾N¥ÕõaŸ(NÜ{^g)nÀJT½8šÔïMüaØM¹+ªØÖ÷3ùL}}ùí8ÝëÅççx=sNwJ•WRpöSãŸ'ûG>xm˜i|ÇPzEZŽ}óuø%”ä•ê*)"r¡†-G—ûÔÊï,ÖðPx(·|’nv4 4»ð[« §I´/&¼7ˆ|Ü.^вòË?µ‡ÇeÌÄ4†ÇG ŒÒý,ù&ÿY™ÂÉhNŠ^ ò£™<6}· àwyšøàéÕŸ¤õÿø=?´%¶Úr=fV´5s£‡Î;©ˆœÔ\ÜÕ¶ï,F «mãYôeDS.³æ@bÃΪG·p¥±àµñ|‘jÐåQÆÜׇÉÍ£íˆ#Ò˜|‰nkÓ(ÍÊ¡ÔpTS§šôáÉaË¿Í@îl·O7-àý7T Guàþ±Ó®ÚmÔÒ™qnÇë™Ûð7úÅÚ*[Ûð·.'Å®òùXGÃ~YêB¦¾ð‰y6šß1†gno‚¯éøWqù§=À¦«¤ˆÈ…¶]fâã×S符zXŒ ÁDFÆföõ$,ðøÈÖ™+jÂl>ö¿'ÞiˆÆxޤpØ á¶BöïË;i4íÈÊ·™¹<B®â¾‡®§¡uMšE œ6Ðxs6ðýOåÏGKV¿È=ñ',,ÛÈ÷[ Ym¹'´5âyèJBÌÇëd‹ÁÆŽjÚWþ‚ÉT~óôg1¬y«êË Ì€7?ƒ|„›œädVóˆÉ›KÒ;Ï3sS)–¦ƒû—DY*µÿH ‡= µ•rho¾¡øšÜÕÔ©&}X©·|›ð§Ñ3¹¥àû÷ïeãÓùtã¾Zp€ÎͪÛVÞúº&û ¶Ž×ªÚJ¿!q•†£hË ³Ù›í‚H{ùòæO™0q.»Ýat{x,^sòȘ·ˆôƒE@0êè*)"r!…-»8:ü’ U~³ j?€kƒ¶±,ŸÌ¦[ëPÊìÁç®É<Ùül·g"°ÕMtòÛBbîÆÿ=“¶þ©¬ÛQéŽhÇÞo8óHI\FÊ™ÓÙë°½|ø¸¶1øWÜh‹R·°;×Å–ï6áy¼ºrM·ëÏÕŽm¬ÌZÊÜÅ6º5°Q|ø;6ï£þcShY“|êOd ºÙúqo&Õ¡å-wÑ«®Ï9´ñ }Ù²7ì[Ywø+¦Lƒk‚vóß Uý0€—ìSymi6àC½ðC,üðÀ‡:=ïäæöý¹*p«²ç3~ôa:§“¸¡ˆäº~Íðe[µuª¶+­Q²5g>, IËD¸ÙŸQ>ÇÎ/ØŸÐê¶u¦¾®s†×CÎÏñzæ6øžæ” ¡M×zr€í?eánƒ% S&Ìe·ðõ%sñt^X àGëûŸâî¦vŒ’=$íüÛÐ5Ö®«¤ˆÈ9ªÕ ò%¼Íô'~IЪ¸Ý8:0lâ“ èKà‘ŸøaÙJ¶äô˪i îÂÃOßA» e©[Ùç{-w_U>AÉl1f»åžÎÑøä®âÃ7ÿÍfGšŸ)‚z³öûŸëó/ŒØ1c3f,Ï?Ö àÙö=ÜWTS.˜‚:ñð‹qKûhr“æ3ç³¹,HJÅÚ¼;£|jÚ@:¼V!&\©‰,Yø?vŸ²‹Ïªg**¤#žº¶áfÒV}Å‚”(z]á¨b ƒÒœœŠÇ¡.ö­YÌÂ… Y¸p>+÷•€£#^I߶ђĪ ±ÕëÄ­O½Ààgúh¥:eZCkÞOâ÷s™3çÖf…×c£úÅàSݶÎÔ×5Úµu¼V݆Ó}–ŠîÞ—f&8¸l nÀë¤ôèWJÓØœLrr2ÉÉ[Ù“ï ·-f‹®íG ]$EDΕÉ0ŒÓ>üHLL¤K—.yó Ê Êðqø–§JO&ßÿ}3wC½Á ¼öÇ:X.©rEÇkåM–ðÓŒ‘Œ]7¾˜ÀÐÕÌ£ôdòýèG˜¹»Ãž§w”ŽT‘s1kÖ¬ó7AþÂP–ü…è@§Æ¡”¥¬`ÁnÀv9·\uÏoU®èx­üqÊVC¦ðö­%˜k2ÙÝ•O§ƒ5ˆˆP©""µÁz©7/¬i}¼ß.ãë ^0P§íM |7×EZ.ÁrEÇëiò–ƒˆ(G ßl#$2J»BD¤]âEDDD~;³fÍ:?¿ /""""å¶DDDD¶DDDD.Nµ:A>11Q=*"""—¬_2ŸÝú[W@DDDäR¦Çˆ"""" ["""" [""""¢°%"""¢°%"""¢°%"""" ["""" ["""" [""""¢°%"""¢°%"""ò;`UˆçòŒIÜìŸ3ÙWPzQ¶¡Ã—M£×¥>f“vªˆˆÂ–È…cLâ&¯O½¨Û°¯ ”ÉëS1»6ÖNQعp|´óKÿØžž1!e–Ìáú¯6ñÑÎC [""ÍÙ9AZQÀE´®‹ à`E[DDDaKDDDDaKDDDD¶DDDD¶DDDD¶DDDDDaKDDDDaKD*ñ°fÙ­( ¤šå""¢°%"Ÿ¥¤®ìIDATGyKIøì˜fnåkýÌ•ˆˆ(l‰Ô.g~&3²}hfÎeÚ~'^u‰ˆÈïžþ¹‘ZãeÇÎtöF5âóºû¹mK6éM¢‰1äeàÞ…{ø*ßDý˜º ³àtÝê–‹ˆÈÅJ#["µÅ]Ä{;ËèØ*œîM£¨“y¹…Fù2gOÎßËáVÈ~ kÚ|”R†ëèºÕ-…-‘ß»ÂÌ4f•ñ`¬ ÿà(òö®\@Ñ‘ ¾6"˜ÐÆA°ÉDúõ[çøéWÝrQØùs³jëaò.‹¦·Ÿ ,~ÜÞÔ—mÛ2ÙéwYE¾þD[޾ßBýŸcÏñ«[.""/]ËEjQšËô½nÊÜ;i<3`x¼xtÞÏ®Ï8»@W¹Þ£q ޹ñUœˆÕ,‘‹—F¶DjÁ¡ýYh ç_»’òç®ìþsWRwdR„“O·`„GÓÏÈâ©N<@Yî!^Ûï9ömEÿj–‹ˆˆÂ–ÈïÚ×[òmVŸ¡vêøÛÊÿ tpÇP w§±–`^½©…kÖÑtö:®]^ȱ6lë›lU/‘‹—#ŠÔ‚‡n½–‡NyÕÄeq—SWñgt}æ ªÒ;^;á½!U.‘‹•F¶DDDD¶DDDD¶DDDDDaKDDDDaKDDDDaKDDDD¶DDDD¶D.Ñþå?#º2=ï¢mÃò´\êøë'QED.úQS‘Ü×"šÉëSéþå†K¢-""¢°%rA×¥ïnOçp‰ë¢lC¤ŸCZÖá…Š¶ˆˆˆÂ–ÈÃÇlbRׯLêÚX!""µBs¶DDDD¶DDDD¶DDDDDaKDDDDaKDDDDaKDDDD¶DDDD¶DDDD¶DDDDDaKDDDDaKDDDDaKDDDD¶DDDD¶DDDD¶DDDDDaKDDDDaKDDDDaK] """rþü?={âi!ñ_ªIEND®B`‚144_add_template_field.png000066400000000000000000001126401516513262500347430ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/14_fields-for-interfaces‰PNG  IHDR[‘UúbKGDÿÿÿ ½§“ pHYs  šœtIMEà=s¦| IDATxÚìÝwXSgûÀñoIØK@EDÀ…ЏqÕ=jëÛiÕjÕ_‡UkµµÕîa­Z­³}ÕºGßnGk«U[÷D·2eB’߀¢B uÝŸëòº$$'ϹŸûyÎ}žs|µÙŠB!„¸é–{Ä¡”0!„BÜ:Rl !„BH±%„B!Å–B!„bK!„BŠ-!„B)¶„B!„[B!„Rl !„BH±%„B!¤ØB!„bK!„BŠ-!„B!Å–B!„[B!„Rl !„B)¶„B!¤ØB!„bKB „B!Å–B!Ä]I-!âæ±ŽèxÏï£böéh!„(YÙB!„bK!„BŠ-!„B!Å–B!„[B!„Rl !„B)¶„B!¤ØB!„bK!„BH±uOP»òÕ fú(e_ïGÆ“,6œobò*ñ<#'æcÄcÈ“ñtä˜W½?­•Œ !î¬)èfopÒÀè°kíOš°>æN\ÛLZ/;ÅsEZéÆüõ1®ßÍˉ–Û´I;ò¶kÑOùœ8‰Wþ<ËúëÍ{K.«wÅše½ë“¬Ìœ°g_ï°¸™–x’ÿ%ă'O¦m¿~à}/6øø0·?xjPZÍ\JNcáßÑ|pÉÄMíå{h<ÝXciéÑ4„Ï«ÐÀ¡à!SVóvÇðöñ,2­!ì8Y©Ì·D^ÚŸNjѸQéÜ>*Q'ù,1ŸŠ'ùÛˆ›¹ùgÓN:Æäãèâɇ½°ªCë“I¹æX¢@iµVì aÉã¯ãñ÷I8ÿ…}­L_Ürê¼<‹Û¸¢(öj ª:îí©MïÍÂpÚ„ Ãé$ªhPÕ“pó-èß{u<)õ<ß³) jY¸óÏŸÏ&U¥£MíLîÜŒŽž‡è°#)¸„°©fíºüÓÍ—jT£Žê Ýö¤“ªÔól·¦|¤º:4ßG2%1ÿî)¶œ½«ñUçZ ðÖ@nËwGóÒ‘,2•Zmʬ†nTWY1ädòåº#lnÒ€œà‘6 °˜Ù¹}?½ŽokÇX­Vò-ÒÓ“™ÃÈPüòù¼}tÑ©øyP[‘ÆÀ5ÑìÐy3±SÃýu8åç²áàqïIÇ«YsvT;KÝŸI°¨hß©%«Ǩ³ÕÂÇO‡bÙP°’£u)ii¨ë†s¤~,¡?$¯rá‹§›12í(UJâ²ÚùO×'{Ãn^½“WƒÔ®|U´¯—5vç@ïãFô¥å’ÆEOï‹tÞ>éÌŒªç¨W,ÞtjÅ ¢¨¾9íö3Õh4š+ÅÆ“,ý9Ê×gð\ˆ¦¤]¬˜½˜‘‰|hòÈ0Fö ÃíÚ¬$'ægfN_ÉžÞ {ÐÝÙ…¿6'³{Ét¾ÞMJ¾·z½ùC´·eŸœ]i¨Ìâõ£©œ3¦\öž‰eo±ç”œ÷©$ªoìßwb\˜ágßxÒ¹VaRÇ †úëq¶äsôT ½ÿˆçŒÅÆ{*JšŸñf¢ù¶åMpƒú|U#‡×Öæ‹sáY·ã—Óø5®û{…òñ¹Ý ½Tñ3r!îù+¦‚37š5çwÕq–»óY-Má ›•âÛÿÔÂxø[>˜”Bþƒ…õ[̾ÙéÇÐÙÒÜrâÏ«»}‹ÛÆŒ4väûóI‡@œŽ¥ðwb1¹–«E¼ÿÏÙûWãÀëaöŒ'&ô®ÏCŽÑdýeN[54ªâPp¹ÍÆ{öË,)7oïØæÂ…{ùêJ¡uµðN¦¤m·Öd}€üšó¾:·%“`1ñã„‚B pô®Æ`}2¯ïMá‚ÙJNzã÷çÒºž+ŽI,ÌpæÅT€›_5zX.óßë:ÔÖ6ô™il7»ð» *^xÆžgNŽ Ý]UxûzQ-í2‘¦;!^¥çÄ5‡ˆr䀭\r,¡/ò3“˜“âÄ‹ZT€gµêt7%òÍeómމè/ž£_ß¾ôíÛ—ã¾ãB±>3žý-Mܧ Þ%Z¿žz´ Çÿ:7–?Ýš¢‡*5Öd5ŽÖ\¾?fàýPOªžH¢Q¨Ù1‡9œmÏØÜ†9_.«˜TÝ‘Ÿ=uœ9•ÌÏUýù¬ªž5ô\<›I²õöÇËVNg(GØÊ% ¦úk¿Édj¸75%Ф¡;IÇÏu»k-Ô=7•q-œ ¢£vÂ]sñÊoÍéñ¤gcú¨¡/­¦l5s0Z<¯>/ë2¹Îp/Ê…ïªÎW>™æücú-aùÂwX þ-z1è…'iâyû ®ì´ËLøã2“;¯tmÄ’îö|w‘$[y¯(¡-vŽ'­—Üt.–pë…­±¦¼\Jnfß¾–kUà¤*¡ˆ²˜±ø0«®ðåÝ $~8'…°I¥£{ˆ^ÅS8óx-gæ\.vÓüQlAn®‘ YW?y–UìÒ@¾ÑH¶V¯ ŽZ ¼~î²³ò1YMìŒöæeÌ¢jžv3³u.¦; ^¶râÚ“ ûsÀf.•ræ’páÿ´ ¤¯_>]|sùïöœ;àk8¸záåíRìž­b9â⃛§cf§ÞõËÆ“WŸçì….7™lsÑÈÎ'3Õ€Åïê¤QçÁá|øàpòÓcØ0}<_.iÈÂÑ îˆ1•›Æœƒé|ÐÍ•ÄÚÊ{[‰ý{ÞÎñ”¡u¤ºŽæ•o¼^,!7½7ݾ tS•LªëŠçù”k?œƒ™}ûŽðˆsº^¤ë_—‰—ZK…V±›á Ž0ä¢FWt…7ÍWpýë_:“}9žÍÞLi솗R—Ÿ?SjYù): ‹{úVÓã¦S^ñF+ùV°Zó‰ËWSÛU}×}1XNR,KLU˜ÑÜ‹Z(Tøyyò_ *ÀœÌ‚d'Þh[‹N†–¥Xʹ +Iñ©$Tñg°&ƒ¿²-d&'sÑ·ý´Yüšvw}M‚®9`+—rJÙ¾57¯.9ðZ‡ "ÒãX›qç´µºó€nÿ]³D£,FÒÎbωŒk>}ç؉fÖݬ;˜†0ÅnåçÆ+E­)vG%c¶¢rtÅÃYƒJyûÎ`Ü|™Ò²*=µ¸«”¸¹zðr7”©iœ6—=vJbïxZfôâ‹–Þ©(U„UuÆKaû=JÉÍÛiÍî̵ë3¯žÝu¼†<Öýµ—Ú¿^"ÚŒ†V¯Z¦4^_½“:ã9W8žš5cIˆÃµ²e{©'×~=͜ΠIh©AaÌbåÎHÆ\ÊGéãÌóê²ÔMÚjæôÅK<»-l³‚ÅRè×± ænf¶oÙCû¨Ü»£ó3yÿ§h,ƒ9ð|#ÜRÒX¼#š_¬y¬Êd^wNìJ䤥üÛ0f¦ð±&Õ“9žK²´3^æà]öm–*ûs cTé¹dÕ”Ú!ü}$ë£~Ú|™ówC-ª ¦ßû/£œ·˜×N!ÜýÐqàŠ_‰UèCôúCÌœ5Ž‘«Üqu¯Eý0w.þÞ’s†?fÏæËølÌJ¾z1âÙº·m·Ì¦†‡vêø³s+¢ëıôBYzÚûÒ$!Š&&“$…–eÚ{à$³1ÂñêÍðÖËWošw;wбg*~@UðÕfY\÷[ûûx0uùá‚O­ÝDÖïùø)fo‘$º³zߪUy£±/ݽu¸Xò8›ÄWû/².Ã"_ù „½'û:ÚêrØ–Vüfx~>®èSÒ9S±¯Øb¹Gœ|©©¸ß¨iV ß 'oî7þ qÛXIˆ‹eL\¬„BˆJ0çf²5÷ÆñŸXùl)¶Ä}CéèÃoBioHdèO×ßP,„BܪÓ|!î–œDº.H”@!„øwOö%B!„Rl !„BH±%„B!¤ØB!„bK!„BŠ-!„B!Å–B!Äí¢°Z­%~öîÝ»iÙ²¥DH!„¢‚V¬X!+[B!„·’[B!„Rl !„BH±%„B!¤ØB!„bK!„BŠ-!„B!Å–B!„[B!„Rl !„B)¶„B!¤ØB!„bK!„BH±%„B!Å–B!„[B!„BŠ-!„Bˆ»ƒúÖlÖŠ1îÞÈöýQœ»lÀŒ'ïª5jC—=hâ‚ê½·áÌüôw<&4ø¶îM×`Gwbô­Fb·-eþê-7` : ñæ—E‡0Þÿù„™ƒ‚ДkÃ9ì?˜©‘V *}§AÿRºÚšÎ¶wžcÆ € šõ)ÿñSÝ¢Î#æ¿#ys]JÁŠ`†ÌœÌÃEï—{”C?`[àØžñóGÓ@w/ö}9ú§Ü9õoõç-Ü!„b«ìj쟳™0{;I×ám¤OV.j`NbÃÃùú,@0ÃçO¥‹§âºÇk3òëÉtt‡Ü‹ÛXõíl?rŽÔ<@¡ÁÉ×êÁMyäù´rOä‡×^féÅ«M:=OÍ/88´zïkÆ6Öf2ÿÁêµØqä7ßøÌk/#ZÈ>µ…5«×ñÏ‘³¤­'Aáy¤ÿ´ñ×Ú^űæpú·…,X»“©ùèüÓc@_ª•P4—k¯‚åÅ|ÃKo®'ÐF¼Ïׯ‡¡/WÒœçû•ûéúZK\K}ŽûmŽ+£ï0"oϼüâ\¦tóFi<Á¼oó{:(¾Ê×´ÅUaàðçCùèÀ YÓ /ÅÙ›7×^b{âݰ~9ë÷]"§Ê˜öå“%ž¨äœ\Ë„÷Vq2І2pÂ[<¤/½OíîO{s'—è¹/ñî¦tÀn“¾âźÚ±Ë÷¯bÙE@Æ+s_C·|*ŸÜpÑJÎÙm|ÿÝzþ>tŠÄ ¨ôx×lHç!/Ñ'ÔEeóX!îçbËšÅöÓE?Uãá>ͯZW(Ð:—t8.cz5Dñß÷¿äÏŒ‚•z'tæl²S.r"ÅÀ±>ýhånWEHÊŽYŒûliÅ6¥qþàFÜű1ŸðrÏëî)‹cÝÔO0˜Šê¥‹ìZþ—ŽT%îðEÌ…g_ØÉ’ÉJüg½J3—›yȰ¶{o~²™Ë…htL¹)œÞõ?¾ØsØ©x2¨´U>ñ§òÎ×QíBnü!~ü, ebíUù•Œ€Îa\þó09;—²î|úùVb¿k–õn ôÁ- d' ûÎaèæ6ùQ…+­–3{¹`lKUO «Ýpz©*•7¿L™†Ñ|¥¦*±Ð2œþÉïZúÆüߤqô °Ut”£?íÎÁÝ;à½é'.“ÆÎ?N1¸nÁjk~Ü?l.,duÍ"ÜMAtI}µwoOýƒÄk†œË§÷°ûlO„:’Y©<Bˆ»ÏMý4b~ÚR‹~ÐPÇK}ÓcJ:BTáÁ?xèV,YÌ·Ë×°â›Ïx祧hâ®UU¾†ù#B®¼.hè\V¯]ËÚµË Vµ Q,Ÿ_tÀô¤Ãèé,^±˜é£;à @Û,'ÊPB½çû c>™ÎÄ! WšÌ\<| ÿÞc™6ýCú²÷²)&ׯÞ8Òüƒ5,y¯…ëxöšÊòµkY»v-KÞivã•&C4Ëç \Zóò—ËX¾t9K¦=Cm`9Íê[H2—^¬®ZQt`v£Íði|½h…b²T Ö•¦ÀµI? ˆåçe»Iµ”Ôn;÷›²û^éZæ…Ë>y§›g%+f?±E/È>ΡæÔhVŽõ›PUC¥òƨk€w§3oÁl>ÓÕu…Ö™Ÿùø½eD›—æ¼8å2 ­òõgyrGЙ®Õ W[wÿAŒÀDìö-…qr¡u¯Pœ%÷ÕŠ9E…–†ÚŽå‹…ËY¶p6S_D‡:•Íc!„¸ßW¶*{ðUØ8º¨}qW@¼N-™Â”¨ºøûS3¨>ÚuÆScßy°ñÂNfþ܇þmýqR‚SÛþôùå/æ2²ó¢‘Fµ‹¿RK«Aýhä„ŵ-5å4€¾ ƒŸjE-½§5Yyê,GjŠ+ú›vvžwñdýp–u³Æ³À’KbáÉzj'g =ðq.áõ±û‰Ê.ü¡æã èX w¸?8žëñCRÅbí<„Ù+VËêrÝŽ¤PW§û3ð㤭dí_ÆÏ§Ÿ»éû}mU!,̃±©z”cÉYöžÃŠ¡-œˆÚ“È¡éôrÙÇT„´ DW©¼QÑà¹<îðòÈ)öûx~š±¼à¿î­yiâ(:ù•ÅòôgùbX•z±ò›Óµ‡M'rhšÈö­…wzu Gmýuûpõ}öÝY££ú·¢ª À‡Öÿ!È;yûS!îÇbKí^(8k5žçdr>avßøl-v…ÅÊõ'ç ž¼“)‹ö’l8ÏÁíç9XôK}}ú‡Çƒte7–ìdŠŽQžUp*ZNS:QÅS§L@6)Ù×·ÀƒÞmÑ诞5ñÒ‹*ÍÕµ9‹Ù‚nZ±eÎN&ëJÅÇ©q%íé¹(á eÉI½rxT{UÅUu¥Ó¨îÅ?:Z®X+Th4]éRàöOmeÑéDÖ-ý‡ÚæÊìwYÑvÀ¿y]tv’Ë%ö?EÚ ¨ÃéÖÍ—¸=9¿÷8']N^®I«‚{ï*ž7^Ô p¶+t5R×˾rµ<ýY¾ªðnÕ‹ÐE³ˆ2ç°oÓqR]"ÙZx]°j—.Ôt(;G5¾”´Z¾¶È× !¤ØºñÐéVŸ¶µàä€X~Y³.£[ᮼ¶¨ÊËÊEå¬G¥P ºò»|Œù…åI~:—Ү߸ŽÀ‡ßdn·dΈáìÅK\8±“ ÛNc4cõ²ƒt7‚²n“R:{á¤y)Id[@¯,˜à“’‹î~qÂÓI×”| TJEÑ‹=¬¤èaë-üÆ•“ç•vkš¾Á‚·Z”][ßo'Ÿ•A®ô Àb 5§±¶š1å[®®l©ÊY^ª|é<¨ ßøé1q¬Rû]vè[¤ØI”Õ©?þ ù2ØŒºµ}qØÈžè lÐ.aù5¥~aò–/oò¯YÙÒ¨mÅDO­ %gNg“{hïÍtdê¨öTQß¼þ,oî(=šñP¸Qûò0ìÿ…êó…÷WÒãj¥®^ªœ¼pRSü9RÍMЫnn !ÄÝèæž:ª|é4¨[á=,ù÷4ÆNú–ßvåĉhý½ž¥Ÿeä';ɰJG¼<‹¦î8öMÆl5rñ¯Uüu}±e8ÍÆ·p4EG†­èøàã<=ð!ê¾Üœ™I^á±V£w¸R¥ž‰£øbƒÖ¿5M\ 8µ†åÛΓ™›ÉùmËX]ts¿K8­ýrðos¥Ý¦ýKX½ÿ2&kañšv†Ý?Íf¬%\Ü)|}Õ¦„:þpòW6Ÿ5bÅJöñߨt©â±Î;µˆýûÓ¿†|‰¡«[ŽõŸ o=åMÙo[} p©MË…»ylq€wX]<œidãPáw®º4ÇWs«óÆ/Žç¹°‚ooMÿgï/ØCj÷,•§?Ë; õj‰€ñk·܉©¬×‹Ö>*›9ÚÔ­ð‡‹+ùrùNΧ咛‘À©=X™Žº’y,„÷ýÊ(pj8„÷_Ìb¼$©‡~bþ¡Ÿ®}ZÈÕ³úÚ]›ã¸w998k8ýfƒµ„¥­¦Kl]2‹ãK ÞÇAï€É`¼²–Ø&7eÁïô5¨J±@êïãù¿ßáêWHÔ§ÿÐvøl;i¤°uæ¶Î¼öà×î…§©¯¿ÃzJ_Ÿ§_ìÀ¡Oÿ"…XÖMÆ:Õ@nÑBJh³Ò×vô¡ôíÊί£0Yϰ|ì`~ñÔ‘™’uÃkìõÍ*Ò}x``wÖ¾»”JíwY}¯• ½á|ÑgátÔn\RMíp?ˆ)úæ3 uZÔ¸òô·.oZzŽ}ŸŒÞeÍi I|̇ú÷™88¬ô•ÚrôgErDZރ´ußÎoWNz44~¨9ž¶ú]_þû9õÉ'æÇOóãÕ_>Û”*™ÇBq߯l9ðï6†_¾ÉÀ®M¨åUt“¸'¯4êÔÑÏ7õà†\š½ÈÛÏDP£ð,]çÓ˜‡G¾ÃÀÀë7[“=[à…“ò F¬¨q©Ö.C>â½ÞÕ¯TŽêêñÊÿµ%Ð¥¤ÝSáÙúe>Ÿô=›à^´°¦v£Fã¼0ñó>¾gt•GÄK|>u8½[á­Lr­:\}‚hÚ¥ÃûÖEg£®öëñ&_èDˆ{Á¥.ƒ¢:ž‹çjW<Ö7‹®Îcôo¤®ô~Ûîû‚¢¡jÓú8]ù¹&Ít€ß°ºÅnw«E« Ç-oú:ôyç-z~ýÅ¥_&1aÕqr¬•ïÏ åŽ6ˆî««¾ZòP˜K÷ž)qo>ŒO?}™G#BðÑ+®Ì Íh^Óe¥óX!î> «µä;vïÞMË–-%BB!„´bÅ äã>B!„·[B!„Rl !„BH±%„B!¤ØB!„ø÷ÜÔO𧦦JD…BqÏòðð¸½ÅVE „Bq/“ˈB!„Rl !„BH±%„B!¤ØB!„bK!„BŠ-!„B!Å–B!„[B!„Rl !„B)¶„B!¤ØB!„bëß3dñ.Þ¸l¹¹5¥ßší !„BÜÅ–•ø³' [ðÝf‘%ñB!„[7¯ÐŠ;{’vë.iÊcÓKΗ€ !„âþ¢¾•…Vûu±œÀ‰W»ÑJmû5ñçNÑá×x¶gC VvªNc `ÍcýŽcŒ>–ÎI£³;#¨Ï”@-j 7#‰w¶œfþEYJ5 ‚Cø¹‹µ®Û~JÜYÚDxÇÆÌ©¥•ÞB!ÄÝXl]_héx¾GC>ðUb0™P(•8©׾̜ËÊÓj~ïÛŽ6Š &þt˜Gw»p´­+Ž€“W5–÷kHG+ÇŽEÓiÓ Ú lÄcêLÞûù¿Ö¨Ï½ R˜ˆLÊÃEq}!wšî¤ó`÷&Lö×HÏ !„âî,¶._ˆ)VhäòõÆ]|}ͳœ˜Ð¿ïz»Š©Pó`Ú!{› IDATË< Sn¼ÚÊ“Y[9ÚÊ•j¨[åÊSÖ©ÉÓûް!ÍLk,Ks½XQ… €«:«³,œ;yœvÑyüßCyËW-ÁB!ÄÝ[l]¸˜\¬Ð*MçÖkR¨ v¼Ziõ¸™rHµÖ|v‰áµÃÉD¬(VÒ ú˜ÁdÊ%Sç†i{b5òã¡D¼ê5f˜ZB!„¸Ë‹­&-˜²ŸçŠî†×Ò«õ‹]¹Si]⥺®(ÊçTŽ…¢{ö9Ò5Z<›|ž»sõH+6{«Q›3³ü0±€F«Ã՘å|hàPBƒ”z†?HÚ¶£ôÚÆÆæ®¸+¤ã…Bñï¸ù =jG†÷hÊìšEuœ‘mZ†´ æÓ6ÿ>nvmñUTlmØs‘¿s­˜|¹;ç _BÕ`ÉÏ'W­£¾‹5V.\bEfÁwg9V©Æm2¯î¾Ìé|+s‡ã²H.¶p¦qªÂ¼GëPçØaÚ—A†ô»B!îÚb«„‚+óB í~‹çœ­ïUéè[ËÄ[«¶ãðÍ!–ºÔâ­\q}˜V3›A+v¾öOkèè\Øtµ ®K·äÎÿ Õ‚=<}$‹Œë®Rjœ}øæ±ÚÔ8z˜Þ2¥ç…Bñ¯PX­VkI¿Ø½{7-[¶¬ÜÖós˜³±ð’¢w-Ž>Q“P•]!„÷‡+VܪïÙ*¤vdxÏæÇdàV³ŠZB!„¸ï¨où;¨tt¯«“H !„â¾$ß„ „B!Å–B!„[B!„BŠ-!„B)¶„B!¤ØB!„Rl !„BH±%„B!Å–B!„bK!„BŠ-!„B)¶„B!„[B!„Rl !„BH±%„B!¤ØB!„bK!„BŠ- B!„[B!„Rl !„B)¶„B!¤ØB!„bK!„BH±%„B!Å–B!„[B!„BŠ-!„B)¶„B!¤ØB!„Rl !„BH±%„BqßQßÌåX$ B!„¸w9V`™JV¶„B!n!)¶„B!¤ØB!„bK!„BH±%„B!Å–B!„[B!„BŠ-!„B)¶„B!¤ØB!„Rl !„BH±%„B!Å–B!„bK!„BŠ-!„B)¶ÄMa$fÁ0^[CÞ¿ðn¦¸MÌ5€ÁO àÃ_O±ç£gxû—xÌe6ó$‹G gILÞ¿³ÅßÏæ{‹Ûc›9%ýXù¾±ù¼cÌ6’UgM•ÛοÝþ²Ú}·÷‹½c'ö÷‚±ÓwþZÆ<\®÷þw+â^+¶¬FâþYÂç¯?dzO=É §ðê»_òË¡ò+ä‡ê^'¦s¬ÙŸ‰ÿdb-mû¦3¬xåÖž7!JH³Ûûö&â×Oâý¥Y´yîu¦´ Â]‘Î…ƒ›Øð×Q2µÇC*†2c˜ž‹k´Š‚.õiÙ ÌýIåN½Šæ}É©;…ÅŒµxßÜ·¹u‡ï×M˜3‹!î€bËšyU«Nüâ— îàUxÖìCH»§ÙÎ 9ûødÄ ò1=|T€‘s_f¾Ó›Ly&9™}K§óíoѤæ+pp ¡Û¸q„þ4-)i0þþVë2™1<É;»‰Ås–³ãL&¸ÒºïHw D—wŒù£g¢èAòºuD¥8Øc$/÷2±næ7lŽÉÀ±ÞãŒןzÎ% +†˜Ÿ™÷åJö'(ðjЃÎÎð(šhÓ9¼lK7GŸ•Æ»!]ŸÅSÍõD}UB[Û«9Râó=¯=K²¦³{ÚXæ3`:9šáK "hÊÎÆwÐ,&<\pVeJÚÅÚ9‹ùóH"FÂþ3Œ¡O†áZž}(1ÖÐ7D{ÝA¥´}õ´q†g%·Ä¾©‰á¯wyëÏî|<¾n¦S,ý¿W{™ï¶Æ9ï8ÿ}uº×¦ót°C±íå÷ýXÆG>ÁÇïµÃMKôœ—™£x•‡Õ‡ÒrÁPFÎ]Ón‘_•3×JHŸÒûÇF,KëçYüêç(ÇÌà™Åãñ†x„¢+gNÙ}èIØÁÚùKÙ™@®Ê‰êC3²UŒwÃØÎ'ö»×Õ‡OÞm{%nÇçŽâ+Ë+|2¬:'Jëã1æžA~‡pÒö&ÁÒ€á㻳ë­Â¾ 2”1N,¤XÂä©p”ë’Ó§Ô¶;”6v£Kí›!Mq_º‡ó†„f#:ÏíŽ\4¶&är$'LÁ ¬æpCZû´éŠÏO9œÚ†öžJÈ9Îæý*š Fgˆfai¹Xž ÖÓ¨¼¹ª¿6³mõO„²ÔX6е¿?ÊŒÇ5ÃÎŽœ²ûRF k'Íä@ãÑL×E:N¥¢Wp—Œm5¾­;âõóïD¥·¡µ» 1lÙM^ FG®í\Ï»ÌÓÁL˜ú"~ñØeï81%²k—#ã¦}KmÅI~š8«j3ypZ;óg„—=9¢À¥Üc¬”¼7&´{§†×&-aŒâ(Ëßù„E·âÎ^%_‚.OßTp¬õÅ¡óu˜0éªp_Þy‡Å·âí’Úeã¹ C+>ûCï‰ÌëUSÔ ¦NJ!¿{)c'gQ=@Þ®ãJEç=‹­úõCé¥.×ñâ~q[/ÒYsÒ0jÜp«àz«Bå€ÂÈùsqdå+Ñû…ä^rn<û'ûL-è×;• —ú½é×2Ÿ½ž)¸ÙPéJÓ§$ÄE…ƒ_Ku“Gi G¥ E;R£0•¸íÍ´´¢OôJîaóXýb““ÒzDPËS‹R©Ç¿ýã´q>Kd\)×ÓËû|[­³¿±=£)O?Ù/­_=R…“žÀPŽ}°;Öh»­¾±TiH]ÍiÅÉ9s€ìúÓÅý ‘ F2cö“V­5t%\¨ÒŠ.5γy ¬dGÿF¤®µeçB%•gû6ûÇF,Ë“ûeÅãV1žù²šñLÿVøj(Ü ¨_ gåÝ3¶U¾´÷9ÍŸS±†“›ˆTGÄ­¬\W¹ÐôÑöø9(n.¤ç£PZ0d+i•g-¥ -çómÝ*’OFæ1f¿2Maˆ­¦l9-žvïC©±öTUºí6ûFÛðšÖD]"ü|Y©,~…+åç~`Îê$º½?“·j9¡2fù«H+vÅ´x[Ë|~yÚæìƒ«§/ÍNë1Œ'íÞ‡Rc=ªÁ5—¡*ÒvÛ}£§f _’ÿØÎŽ\'žð¤ºsé?ngG‚Žºz—Ò \÷¤ö¢Uì:¡çèIo: ©†0Ûz?…ÑvΕüVÎ5[ýc:»Œ)¥Å²ÔÜw(µ‘¥Åã–-›;û ÏºHj^QŠ7çî۠«yWª­ÜÄóÎDq"âýhìÍõRŠ”2_kÎ$!= ïêÉO'G`j´k|žvŒY*:Æ®ë‡[~¦¢cåf¶ÁÑ ]vf¨ª¬y¤%ecñ/mØ)Ë?ŸÜÇ•2û¿”ñ;{T¹Œx[V¶\ÂéÛ7ˆ˜y“Y²9š¤l#ÆìDbþ^Á¬/·“ªö¥®W2£’1¦ø¿Y(KQòÄîbgT³•£+îÎTJ ¥wmñI9Wæ%m`'šjv³z]4Yf3YÇeõnM;ס’ûá؉pën~?”†0ÅneC¤áÊ{[ò²0i½©î㈠3é‘ëÙ‘XøÅ%´ÕæóËI[«;mt;XºvIF+XŒ¤Ÿ?ÄþWâhÏ>”ëëÏÆ*ÐvÛ}£Ä¥v8î§f{n=êy©Ñ4Ç#æGvf^­ôÞS87 kÃ4Ö/XÆ)¿®´ðU•ý~¶sîÆT¹\³Õ?ù6bioØ[E[«­ö±tõV¬¦4.DŸ%Ë8Üc@éÙŒŽùõÛD¹>@M¥Çi™¯µˆ\ý+'2ÍX²OðÛÊèZ´§ºƒýùc´;G*0ÆJè‡[­¢cå¦.v Œ|·é ¹V3Q?ñc”±ô”w>¹]Ç«3ë—òã¾”²¿ŸÑŽþ/müÊeÄÛFƒßƒï2Þu+¿ÿ˜qs21«]¨Z§]žê‰«ÆŽÏõæÈÌ7ó³n> hêNbQòäœá¯¹³™ŸY©Ã§a/žÿ¿ºh5VÚ=Ò„]s_`ðt-u†Nçí®õyúgX8g*#Weau$bÀ[ ¨¯GQÉKÖ }(ýÇ<ļÙã»Ú·ZÔmäNrÑ$ü8ý§1ïÕ—qõvÅÅ¿>õ½ ¯yhªÝØÖN6ž_î*˜'Þ}åüż;h póo@»#/Ç>”ëÞ®m×Ûè@ãÛ˜§µ¤5¡ª(\ëæeá„sKmuŒµ»7…·0¬%^*;ÞO¡³™s7¦pµòåZyú§qé±,½?N—?·ìè“oÀ2÷Þ~æcòTÎTo=„1µqVU½+ÆvaµEX×Z,œ…_ÿ¶øª+‘ëöŽ-[d²fì N¤€_ÄFõ ¹a¼ÙÊŸP¥}c–ŠŒ±’ò¾ý­Î§Š•›º@àØ¯=ÆÜ™o3t‰ ¯ÐntlæÉ6¥²ä2òüÎ9®ärqÛÏl©ß†^Íìøtb‰óž÷•Õ›ÒÆïýLaµ–¼¸{÷nZ¶lY®åXâŽbŽû÷Þ:Dïéï|šLâ!ñâf±f°kÂH~n>ñ½|QIDî Žå¼&¸bÅ ù’qq/O„9œ\ÿéaæ&……ÄCˆJŸ®µÓ©&¬V)¿ã»“Þ´ó’BKؤ–ˆ{²®HÛÎÇ£¦sµ-ϾŽ“Bâ!ñ¢Ò# ã¹ßøjÊÇ$çYQºÓö¹1ô¬.‡Ra›\FB!„°“\FB!„¸ÃH±%„B!Å–B!„[B!„â^/¶L±¿3kÔ÷À‡¿ÆÛ÷m¸ö0ždñˆá,‰Éûw^w§½Çí`s¿ŒÄ,Æk cÊÿÇ£Ë/ã1æɪ³¦;°¯ÊŽ)nSÁxxjþzŠ==ÃÛ¿Ø1.nUìï·lº+Çê}®xl$Nÿî|+ÅÖ-ë)N}¿šÓßcÞÊe|ø_žûÄxœÿvo ˆ»y_ÔUhÕ·-¼UwÇvËûÞ·¼oŒœþ~UÁxXµŒªIÍžy8Ôõö|s"}4ˆWæ&çÊç¡­džÃè!ñW’Yæ!ñïÍ÷Êœo:ÊW^aíù "?yžIÿdVþÏ)ÝKÇC)¶n‹+&2sq­åƒV¾Gè.ë»S¹S¯Cê¹ßäCÕ­Ú®=ûù¯¾·‰ô„âãAOË´ rä¶•í†=ƒïÎÙ¬:š°faõÜø F»*wsyR‰y¨¤± Äýz¸‡Üöob›?lyíÂÈò >~¯_ÄKôœ—™£x•‡…¢³5 —¶?J+9'~dÞÌÕHRâÝ ;œ¶³ÅcSþ/K:‡—Í`éæ(â³òÑx7¤ë³£xª¹­¿ce ²¤}éàIÞÙM,ž³œg2Á%Ö}G2¸[ ºVrK|®?)ÿ{ñQ}øäݶWâp|î(¾²¼Â'#BQÙÛw– ÿ°3[ß¼î±ñÝÙõÖç(ÇÌà™ †˜Ÿ™÷åJö'(ðjЃÎÎð°'¶×Ÿ©dñ«…Û­qŠù£g`îÔŒÌ}GHHË@U§/¿ü 5®)-d]ôi?™>-žaô¨«¿7•g?¯ìÓÂ*©o¼0ÛÈ‘²bpµÛÒÙ=m,óŠÆÃ’‚ ˜²³ñ4‹ ¬¶”ÚöërÀæûš“Ù·t:ßþMj¾·ºû€¾!Ú2ê­Î<÷ôvÞ›»‚Ö÷‡UsØé3€wkâë7JÈMÃ>>±‚ÆŸ|L`äÄÜ—™ïô&Sž ↿„g<ÆüÑ3QôŠ yÝ:¢Rì1’—{™X7ó6ÇdàXïqFëO=g”:Æ\Iü~¬}cþú¸ÎC]ó·”<ÞòJÈ‘©/QOgß¼¡ý‰)ïn¢ÎÛÓ·ŽKâ|öÆj¼^ù”gYˆ,mÎ(olŒí´5WÛ7Ï]›W©[Þå­?»óñø¸™N±|ôü^í5f¾Ûç¼ãü÷Õè^›ÎÓµ ¥Ï…m+y ç–2z[i¸ ód…æçÒæÖšþ²3.Ávþ©u›1²5ÕæÜ ±™ÄÿY¿à»Ú§)eKÉý;_Ÿìc«øì³ {Ÿ!Í=ee«Rò.sèl]žøŸ|9‘ «ùrÕ)ŒygøaòL"k½ÀÔe«Yðé@Ü·~Á‚©5=ï2NóìÔ¯˜ñå› ~ï3†ÖÓô æÌŸÈÃ>K½1†µ“fr Ú &,YÃâÅ3Þ=½BO£—ÆÒÑÓ›n,`îÂy¼~ÍÀTãÓ¦+>g6r8µð[\s޳y¿Šæ]‚mZ¶öÇlˆbÅgßaè1‘yËóácJvìI¡øß­w¨ÙáŸ.fÑÊ%Œ‘m³æs ÓÖ¹@)ûbˆfÅÔE\j6–™+V1óõ–Ä.™ÌŠc†Ï,J}® ŸÖñ:õ;Qé…¯2İe?4錮<}7}õô%âÄ•,þ;åêëL‰ìÚ©¡÷¤%,\ð&Ï-cQÑïË»ŸWöɱ侱µ½²bPœÂ–c‹‡…‹™»p#êíÊÇkbVÆûcÖ°d—Cf­äÛU+˜ùѳ´ð¶ç¸EEâòäÚænµ;7í›_\iúÔƒ„¸¨pðkÉ nò(mô¨ô´hçCjtBA_Ûcóv·JÌcÔøvIß­LïV¥ueØÓ¡8*ì˜3Ê›2æêŠä€ºJCêjNs(ÖHΙdל.îgˆL0’³Ÿ´j-¨¡³c_ÊÃöÏ“™Ÿmmßbo\nh‡ A:ið kO¸¯Æ®y®¼ó§½ýV¡Ü·æ“üÏ&~u–ˆ7?䩆.÷ÄýN·ÿ:©ñtºÚ •“:C,9f°dÄ“‘yŒÙ¯ ESÔ¦l9-® rÂÓ±ôIÝÖë ‰äºÔdz"Ç*¥á݃YõËn.wlǹ Gpy Õ4e\’¶ÑžÜ¬dráZ´; Ü«8]M2k6§7,bùú}\HÏG¡´`ÈVÒ*¯üçû–ìËëãv¥½ܪ9“™yç¦l>WU—æýøá¤µàâ¦Ch[¿G -äW¤ïlôgA;áV”* ^~ÎW–èmç 8Ù­J.º«OP©•Xòò¯ž½ªœ®ÉQµV%¥à÷ÖJæh¹r$Óv Ê6Ûîiw삟⥾KX³èþ Õš÷¢ÿóOæi_ËÔATurÂZË…ÍÜTWh~ñ(Š¿B…ƒZÞÓ±p\)PkÕXM…}mkŒUpÌ—=Þ*7-पB³ž YöÉ.ü‡ö"X¯°oÎ(Olʘ«‹ Ë5µþ„×4°&êáçã©Ñ”&Ñ¿²üx¼4c8u´7^ƒ.œl,š•þzct4ú¬‹¤æA‰CTÖRljׯ=©½h»Nè9zÒ›Cª•L›í‰:Š.;Ž 3TUÖ<Ò’²±ø®øŸû9«“èöþLÞªå„Êtšå¯N Íž_·/J'o´Yq¤›ŠöÝDzlÞ.7¸m?W…Wó®T[¹‰ç‰<âDÄû5ЖŠö])ý©tòB››L¶¹(kóÉJ5`ñ+;¶·va¶r9zCßØÊ‘cGmÆàæ¶ý¤Ý±GáLHÏá¼Õs8ùé1lš1ž¹Kòù¨¶/«—ØÏ6òMaD£´`¾r¤³`Ì2buº9}i{ŒUlÌÛ=Þ*8X3±ò›#TkJÂÊEìm6†–ÊÊÍ圫±ÚßÞëou¨Ù—ä?¶³#׉°'<©î@úÛÙ‘ £î£Þ÷Vv_lÎ畟'+Ò>ÛÛ·/.ÿÎ]û㞬S°R+—+Ë@䪟8žiÆœÍúqlÑžê ­Õ6º,]»$£,FÒÏbÿ‰ ìù›×¶^¯©ÕÖNûXºz‰F+VS¢Ï’e”zܵ9Ä'å”zf¤pn@׆i¬_°ŒS~]i᫪T{Ôc'ßm:C®ÕLFÔOüe¼òþ–¼,LZoªû8¢ÂLzäzv$æÛÑÃ7î‹6°M5»Y½.š,³™¬ã¿²z·Š¦Þô®# IDATkqýB_YÏUz6£cÀE~ývQ®ÐÆ_Sæ¾Väï•;v"ܺ›ß¥aL±[ÙyõÞ‰›ý~öªÔû–Ô76sÄv nUÛËŠ½)v;£0˜­¨]qwÖ R*PX œY¿”÷¥Øý=S6óÍÁ—º^ÉŒJÆ ˜âÿfý¡ì›Ö¿e±ŠŒùòŽ·r÷“5 g±?ð9F|¡áÇY4ÿoRÌ•˜3*0WW|L(q©ŽûéŸÙž[z^jtÍñˆù‘Y„Þ—T©}±c>¯ì¦xûW¶4>D´Îá»±ƒ8‘~Õ/-€6˜'Þ}åüż;h póo@»#·+ƒl¼^“oÀ2÷Þ~æcòTÎTo=„1µqÖT£Ý#MØ5÷O×RgètÞn}µåDíîMáÃ- k‰—ª’íqlÈ€×cîÌ·ºD…Wh7:6ód›RYp£ëÿ³wŸQ]Ưíéz¡„Z¥ÚEEQQ¬/G,ˆ]QÄ"*øø(Ò{Aì ¢HAB B éÙþ~ì¦úÿ÷IÃfî™3gfÏ]²Û¨’ŸcÚ]# ‹ #´nI1¸‡QÖX.H↱ƒx뵉Œ˜W€7$žÎÇ10)ðØìÀr^kŒ¢õ ¼õÊâ®?·ôyŽê˜»£ÃØœëÇ\Æ´WïãÞù„†'дU{8>Ç«ø.õ/Ž[æÜøi¯¼§¾—{OQ:?¼þ*Ó2 qˆmÙ›ÛoiŠ<¶ÿô‹“Ρwû¨Š‰ûË7C=oëÃê)cóY$á±-hÕ<‚ìj›ÊrÖXUÖ|ycrü›yBü²·xó¯f ~®+Qf#‘ƒGÐþ¾—xó§$Æt«âžQ•½ú_¬ KÍ6$¿ÏÞ†m©eCXZG{X’Bý  ÎM¥×YÌ‘Wþå>Y¥þ•³·V$.'dó¿ õï_ä¾)æ\nÌÍôGÆó¢ùQèÛð´.¶ ^oÙWSSSIII©TcEU8Åœ>dá÷¿Äuñ–Ó.xîŒyxÜJúLz„.Õ|ӛDzñ#ø¬Ãs<Þ»¦>QäL_ó§2{ÓGO=m÷j‘êTÉ{‚sçÎÕw#V½*bïÉm}9­Ã«cÓu“³f9›sœx½Nö®ø€6Äбu´ -‘3rÍ‹ÈÙ¬TaÏÝ·„gFMb}عÜúH2ÁÕ²ïz±oýš©O?Çcx#νm —Ôщœ™k^DÎ'ý6¢ˆˆˆÈéB·EDDDN1*¶DDDDTl‰ˆˆˆ¨Ø‘S»Ø²³ñ!ÜýÖÆª}éìÁf60cØPfntœ=3yÔ˜;¿á•Q¹ùº<¶ Ó÷'xŸ±:Á1¨ð\ˆœ¨¼´§1}Èæmq*^"g_±UMÌ5ètÝ:ƇO¨r¦3÷?ÿáýmy¬zövžú%ï)7f;›>šÏæ63íÝÙz2Ž®­É_½‰œ¼|̯bÈÐK¨`ð3æÖ„ñ=×fÜõ"Æÿz2î^íÉ_¾š¬}y˜šôgäÈK©g3^ŠÖ´)óùs—‘˜Ñ+x ‹#ïãé[ýbQO.̬͞EkÈ,pa‰iÉ·ŽâÚQ˜ìi~Žå&ã£{y|ÕÕe÷yHsÊõ}4ÿô9ïÝßÁÏæO`Lçlþ;z2®Éìûí/²<-úøE,wbàÍ%õ¹{›‹\þÈ£\àZÌŒ×æ°4=BãérÝn¾0žGiLŽèÛÄá4;8X;?ð“÷Cê°¾œxÑöS(|¿ŒM´U*—}ÆÊžÆôÑS0ôîÌž/¾`Í^+ñ`do'_Ly“EójÖQ÷]O³¯÷¿6|–´>׸—’-ßú‰weûW‰×-çÙasióì3\[zÅyýë#™|?OjˆÅï0”Þ»ëEŒcž&ù˜\~‚ë÷Nd|E×HÙïZìûs&&~Ǻq2ü@¬ýö½k§–±¶zDy«Ä^v>7ʯ̞[ÅuìsßïLfEú^•\³—3ߕ٧zDᨮ¼õ÷žâ,oÏñ5ÈÏôÑ¿âªåŽ»2}ôµw5P±U¶â4æ<7ŸüÞO0­OöUï0aÂ^\—ìÿwG:O˜Âªvw3q\BöüÊÌ'_âº/2ªKO¢?û†5¹ç”~GYñFÿmïnDÛK”¼ÿÔþl3šñ÷¥kÈåŸM9ü·?<ú=f.‹cð+Ñ6Š3ÓÉ0ƒ)†N`Œ$ì’›¹¬f@™¶}£ßpìfå–¦<ùä0j’ÍOÏŽååyyêæDl~útWû=¾Çr€1œ”{_Àûè0öšÌ£½¢ðd-`ûý_ñWÎ9t‹2BÑ:ýa¢Ã}GÅê@ß¶5aüSwPƒøüÁ™ñs'8/Cñæ¾ðÅ}ždZï8×ÌeâS{q]ä{Š­ .bèóciáaç¢)Lxe:§Œ¥ƒÕÿ±bϹ€ØO}õ¹"±¥áð{é¹þ%,÷¼Ì Äýe=»ùss#ÆOü?⬥9²ìxÄÀpì\ŠÓxë®·ÙqÞƒL™ÐÖÀó&0·îd7âØ¾µ\kúÍû’rã}xÛöuÓë+G+“Ë>bepfóÛ¡Ü÷Ülê,fò¸—x2­WšÊ›52YøøÃ¼ýUwž¼ºnéfäomø¼-ág¯eîD?ñ®lÿ*ûúò”?‚hUF.»³*¾FÊ®²Y¶,ˆûž{‡Æ† |úäx&Ïḵ °ÌþøßùìHç½Jí¹U\Ç>s¢‚}÷µÏû˵òîžUfŸ*N«¾¼õûžRÞžãc‹×ò–¯þÅW!wé|P‰>úܻʘ·SÅI}f˾e+<èq"F­ûqU’õ°ÿš%yí¸áš¶D[ŒØâ:sUßlø~=Žšé»™ïWäàŠ7|Ë*sgzĹMØÓ¿á—‚ö º¾5m Öê'%bôß~±ÉŠ¡8›m[3(p ŒK¤a„ Œ¡4ìÜ™ø` Q­»‘\³ì/e5øú}cÉ}Ï¡¦0ÇÒ±o2%Ë~d‡ÃŸöù‹ß»5:q~½m,úc/¼®ýšU]‰Uéûyút¦†°ÄѪM»Öî 8Ò±ÂÛ™«/lH ÑDX‹¾\ÙÜæûr®1œfÝ;“eÃh ¤n·~œ²…UŽrU™>ûu™ ¥Ý•݈³ ¬ÞWg ŽÉùïYîìÈ€>Í 5™MêÀ¿Ÿ^úG!åôÍä/ïË‹÷QmW4n~_ç'V¥9F»k/%1Ô„5.…îõÁÜöJέˆ)°>»Æ’³6ë°×û^>cêw—ïJ÷¯’¯/÷t·œøU׺.s“ ¤õµ}hjÂÒŒK®oKq9±®ü­Ð#s®J{nÖ±½Š{塽«ì}þß´[™}ª:óÖoÌ+²–9åô¯Òµ@åúhø—ïÏgÝ•-Oánì!­?Ð CÑq! öäe’—ŸÆ«ÿ¹Ëþð: 1Ô/Ân¨A‡óâøø»?Ù×­3Û¿]‰­ËÃÔ³ù|ƒ§ ›’Ð$¢Ê¨ØýµïM¸–á×Íä½·äÃP»Co®¿ýZGUìñfk#¿ ˜‚ˆ >zSp4Å;)rûïSqžï±øß8¢I¾¨ó>OewÏ®lýr5¡ÝPÛRƳ ÆBí&³Ã…ðí¡$¸aB`°Q#ØwÅî-dó—o3gárþÉua0z(.4ÒÉá-÷X~û\™X—¹qäg«3eæ|áÇa!¼vŽUù¸ +¿o&?y_^¼jÛgÜŽÊq¿ñõ7‡”æzäcLXÍf£‚öÇË€ÙfÆë<òõ¾Ö†Ï˜ú[ã寻òý«ÔëË]›åįªëº‚…P͈CA3‡ÇTN¬+_l™sUÚs«°ŽýåÄ¿zÏúíVfŸªÎ¼õû>ê©ÀžSÖ<úí_åËŠÊö±¢{—n#Ø+‚£±•ì¡Ð} '. rŠñÄ8É%,*–ᓇҤŒ“5O‡ ¨ýî·ü¹-„U«ƒéüH=ŽÞgŒ!±l'ÇG§syíG]2”q— Å•»‘o'?Îë³Zò⨻Do!±¬ßÿ?#¸òÉÈqàÅ‚pæì¤ 0† “ÿ>Ù×®õ9–r:CX›Khüö<–­äï 1ô\»Ò“o Š& 0ƒ<7Ô2^ûvâ©ëã.ÅÖymþ..|d ã‚1973ç®ñì«î>ûŒµ Pæ·VñéÊÊÆàØœÁVA®óÀ:ÉÝY€5&ôÐ_)ú훉hy_¡x*·£sÜ_.W7?kÃgLý­ñŠÄûx1±=¸Ý‡ž‘²ØñWµ½£sù_®kw>Y¹Ø¿kºr3):kwúîkmùYkUÚs«°ŽýåD¥ú^™vË›ïJìSÕ™·~cnO«ø~h¨`ÿ öJçN¥ûXѽërRo#Zã{‘ìM囕ûðÎ?òåªâƒgu¶„‹8'`)³Þ_Î.»YüŒ¥üÚ¯´ÜÇÂ7f³)î:Ö4Ua¾zК_ùàÛtJ¼nòÖ|Ê'kì>ÏÂ=Žœ¶êÄaÂM,ÍvUü½¥‚}ökc ¶"2wUÛŸmW6Çäc|/ÚYR™ÿÅZ Ün Ö-`~ª‰vç%PÑ“e_y_ÙxûŒ›·˜ô…³ødù^Üåæruó½6|ÆÔ߯†xW=YjÒ4z+Öì)cæÏ,\Yˆ§J;uÙ¹ì{”6é&nŸð%>¯<³jþÖç»ñ®çëwÿ$à@¬Ëë{×V•öÜ*Ë_Nð/ö¿í–³ÊìSÕ™·å½V…ßþU!w*ÛÇ»'W¶ ͹~ÌeL{õ>îAhxM[E°çàŒ6âê‡Fbœ>ƒ‡nzšb¬„×mA×ÃH.}סõ ¼õÊâ®?·ô9c²"‘k†çõ7y`Ð38L!Ôé2˜1ã ñÓ~sc:?¼þ*Ó2 qˆmÙ›ÛoiJŸ†ÀSäë÷׃%–Î]ŠøàÞ›X¿â:ßȨûJõ7fc)7ØÁ4¾¨<¶˜úCRˆ®Âi½!¨%ハק<À3MD7¿ží£øÉh,3Émú1 ù9¦Ý5’°˜0Bë&‘S‰{èì³ÏX[¼tíÛ–e¯ßÁÍ“l4¹stû—9[É#0‰Æâ­×&2b^Þx:ÇÀ¤@ }ØÁGÞW6Þ¾s4í?}Æâ¤sèÝ>Ê.W7kÃçÎïg]TG¼«| ­=oëÃê)cóY$á±-hÕ<‚ì*Å¥ö±¹|A F_kÄ[Ìž½êtªÅO¬S:æóÞÁX<ëòúî«?å¾KWaÏ­Ê:ö—Uí{yí–³JíSTcÞ–÷>ZþÖ•!  ¹S¹>úÞ“N]¯·ì‹©©©©¤¤¤Tª±"R{ÓGO%üþ—¸.þÄ>¼çÎø˜‡Ç­¤Ï¤GJÿ’íßòæ±lü>ëð÷®y\nËT{Ÿ«Û ˆÖ†TzýÉÔG–Ðýñ´ Ö§©‰T§ JÞœ;w®¾ñ¬á-bïÉm}9­Ã«ºùºÉY³œÍ9N¼^'{W|ÀbèØ:úøÕÒçjk;±1©Ê jËðçGªÐ9E˜‚³`?Þ·„gFMb}عÜúH2U߽ط~ÍÔ§ŸaË1¼çÞ6†Kê˜Oá>W{ÏNX ä°7ó+ž{l[ŽþëY[Cú?öçÇ™´®UW‰œ²tQDDD¤‚tQDDDä£bKDDDDÅ–ˆˆˆˆŠ-Q±u‚Ø70cØPfn,ý:gÆ·¼2j 7_;Çlâ·'ñÀ癸O»q¥1}ÈæmqjŽ…o áî·6â8#'""§o±e_Çÿ† 9XœQÌ5ètÝ:Ƙ;›?šÇæ63mÞl»¬ .¹‘Ë›‡˜ 8“ã,""rª— ÁqbŠ Yûÿ§˜Ü¬ÂzÄb3”†=6åbb¥³ƒÇ×hBƒ$"¢bë„[5õ9ïÝßÁÏæO`L([¾eÆksXšž¡ñt¹n7_OÀÑïVž\þš=™Y‹ÖYàÂÓ’ nŵ¢Žý4o÷–ÏšÄ;_¯%ÇeÀžÈ…÷=Êuõ63}ôd][“¿z9yù˜_Å¡—Pÿ»–ñþk3ø~u6vk,­¯Â×´&Ìά¥¼?}‹VeQb ¦NçÁŒÑ‹® ̸ëEŒw§éG0-­ç†Ñ Yz-ËYXHÍ›^aüåq˜ðÓŽ©‚ãH´ùègc¶–çhÿWÕ|Æ ÀCþßïñÜsŸ±jÄvÄèQ—RÏf¼””9 (þá!Æ}Ï<Þƒpç&æŒË7µïfÊC]q¬ãwM&àîIÜPwÓGOÆÝ«=ùËW“µ/S“þŒyà•È?ñªr.á¥xãgL{ù]þÈ2ÝâbÎ ñ@äþ¶§1}ôd\=’Ù÷Û_dyZ0tâ0â3}äµ#­œ,çx'#æ""rz[­†ßKÏõ/a¹çe%îÿ.óâ4æN|›ç=È” MaýçïÆÄvDÌúmÅ=hž—ÆZG¶í¿³ÝÞ…ÄÝ«Xïlĵ­‡æd[Æ?u5ø‡Ï|?wâóÊ.}åA«~ÆQÅ\¢89ÏÍ'¿÷Lë“€}Õ;L˜°×%‡½Æ±›?77büÄÿ#Î ¯å-_yݨœ,ïx')æ""R1§Üjßò=ËЧ9¡&¡I}ââ÷ïÓ}ØN³îIˆ²a4R·[?Î ÙªŒcŸM2˜¬Š³Ù¶5ƒ—‘À¸DFì¿fa !¹ï9Ô4æX:öM¦dÙìp€}Ë×,ÉkÇ ×´%ÚbÄ×™«úÖ`Ã÷ëÉMÿ†_ Ú3èúNÔ´0X#¨Ÿ”@H%£j¯D;¾Æá¯ŸÅU˜ÿñ ¥Ý€ËiaÆÞœn)áì^» g9óç©Ñ’¦–ͬÜi§(ýO “úq~D:«²ìäoüƒ}µ;R/àÀi@út¦†°ÄѪM»öƒJäßqT1—ì[±ÂÓ‰þ'h4ѺW%UÄšBiwe7â¬ÀP~^ûÍAÿÇ;)1‘ÓãÊVY<…»±‡$n9ð áµCp¬Ê?ö/÷¼…lþòmæ,\Î?¹. FÅ…F:9Žý"k£k~ÝLÞ{ûA>Ü µ;ôæúÛ¯¡u0` "*øP(LÁÑï¤È ž¼LòòÓxõ?wbÙÃë,ÄP¿ˆâ¼lJB“ˆ²þË1T¼_ãhì§ŸvOD¥ûä?^ÁGÄËl3ãÙë xýÍŸ­%É ŠyoÍ’·eR£s;Ú®]Àœu™$®Ì ª]"!." 8TmšÌF<ŽÒcP‰<°¶ð1Ž(S•s©4G[~ †¢ãB޼Ýh &*ÈTÁ¼óŸƒåÏs2b.""§Q±e€Ã¿Ñƒ­ ƒ\'”~·¯“ÜXcByvƹõc^›¿‹ ™Â¸„`LÎÍ̹k<ûÊöµk ,ØNŽã@_«xy1$¶âíøÇÄ‹|÷ûºcâ\þ¼ø‰—¿±ø¿@t¬Éžï–°´$˜ÖWGQ'¤>¹Ÿ,aiVM¯Œ¡*_'ì7|cT ª˜KÆàhl%{(tXA. rŠñÄ›ÛÎk9XÎñNFÌED¤ïó'÷èDØŠÈÜUtðìÙß‹v–Tæ±–·›‚u ˜Ÿj¢Ýy }áÇã(Ài‹¡Nl&Üä®ZÈÒlWÙoÈ;—ñëš,ŠÝ^LAaD„X0 ûß‹Y5ïSÖå»qç¯eáÜuìF+Ø.✀¥Ìz9»ì^ðØÉݶ’?ÖçaI¸.ÁË™5ÿ7²í^¼Î}ü³v •üBn[%Úñ5ýô”g(!mÒMÜ>áJ*/?cñ;FB'±ù3–”4£Y´™€úˆÜø ¿Ä“\»j—ýåAEÇQ™\²Æ÷"Ù›Ê7+÷áœ;äËUÅ~¯•Ÿ×¾s°¼ã˜{‹I_8‹O–ïÕ®)"rZ]Ù²Ô¦kß¶,{ýnžd£É“xà‚$n;ˆ·^›ÈˆyxCâéÇa3ùîgYq>ßÄž½êtª¥²ñò'ÐÿüYj¶!1ø}ö6lK-+šÐ:ÚÃúêU-üåïqT=— ͹~ÌeL{õ>îAhxM[E°§ªqqà?Ë;Þ ‰y ÛúŒÅIçз}”vN‘J0x½eß\JMM%%%¥RyNÃØÓ˜>z*á÷¿Äuñ–³gæ‹þdê#KèþøZëOû•ƒ""RA•¼'8wî\}¨éÙ›-mþ|[ÅADDä8ÓÇ爈ˆˆGº("""RAU¹¨+[""""Ç‘Š-[""""*¶DDDDDÅ–ˆˆˆˆŠ-[""""¢bKDDDDÅ–ˆˆˆˆŠ-Q±%"""¢bKDDDä,`®ÎÆ‚Tº‰ˆˆˆA呈ˆˆˆŠ-[""""¢bKDDDDÅ–ˆˆˆˆŠ-Q±%"""¢bKDDDDÅ–ˆˆˆˆ¨ØQ±%"""¢bKDDDDTl‰ˆˆˆ¨ØQ±%""""*¶DDDDTl‰ˆˆˆ¨ØRDDDDTl‰ˆˆˆ¨Ø[""""*¶DDDDTl‰ˆˆˆˆŠ-‘³³ØrngÁK“øb‡ó_¼ÎÉöÏ_bÒšM9e¼1d(ontœ¸¥´ó^1þýrÿ癸Oêèílž}c?ØŽó„zà ý5Ÿ®||ÿÞÙh×"©Fæu ï&?ÆO9‡ÿ$””Ûn¥E¯^ÂMÕ~¼’uóø„¾\×4@³,'ܹ@LòÚ¾Ž×G¾„å¾—¹-ÑZåâfÇóÙ˜ü0ïÜÖŒ@ÃÉ»7'•¹?ErÅÄ:XNøŽVãPì«#¶Î­Ì}?kNgü¹¡Îôù4×¢Wߌ½”ËîI”î}ˆœ^Ř©wÕ(njtpÃ2šÌëEVëQrþü”‹ZqN$@>é?Ū î\Ñ6R³-'Lóž=NÌxô~4Ðä– Œë{×2æ¾:ƒ¯Vec·ÆÒ¶ïFôoM¸3WFNÆÙ3™}©‘áªGÇé|ŸVŒsÃhÏmÀ•ü‡øÅ¯ò¿ï×QàÂÓ’KoÅÀŽQ˜gÖRæL›Å7eQb ¦^—ÁŒÙ‹X8}×»‡Ô™“øïWkÙë2` O¤÷ýrc¢íÈ{sù{Éjœßˆà ÝžÆ+#§`¸¬3»|Áª½V^2‚{.sòÉä7ùfcÁÍúqÏý×A‚Ö IDATÓ"ÄPºÆ·|ËSçðSz>„ÆÓmÀn¿(ž@GšŸxJo#Ž~ã=OÓþ“²b…£œ¶ÆÖÓ‚ÑO]~ÔE§´3~> A é\3“…«sè£Å,rº[~93øaÖGljÒŸá74"(//ÞyŸk åú¦‡ov[ùúÝÅvÌýçÄáÜü 3fçáIÙ^]˜Á¦MYxBƒ ÆKÖ¦MdÔ">Tghr’8vóç¶&<÷ôÄò{7–tâ‰ó£Iq/¬;ê¶“#wŸœÂŠöw3ù6„îù•7Ÿx‰©u_äþ¥íý¾¹Ï=ûÔ¶ÞZ<<ŒOÏ›ÌÓçEað䲦ÁEüçű$DxØþý2¦SÇÒɺ‰¹ã§°ò–›3›_—‡òð ³W°˜gǾÄCk:qí¦2·F&Ÿ>ú0o|Ù篩‹¹x-3&¼Í?ç?È'6…õðÔ“x§Þdîlä?ž‡îz•Ûâ´rÛ>"¶Îm¬<ÛæÓD­ìJˆ Tl‰T‡xGÞŶ÷ŸçÉñã?~<¦ýH¶ë°½8s9+ŠsQÆ„›X¢’èÙ5‚ín?ân€#së=IœŸR‡£‰ÐFÝèÑàГ!E™»îØ~]jS»K?®N awV‘fZNâ)M®èL¬°Ä‘œFöÚ]>·oùšÅyí¸¹[b,Flq¹öʬû~=E¦PR®ìFm«ÊzŠÈNóieÃh ¤~÷~t ÙŠ öôoø± =·ÞЉ8›ƒ5‚ø¤Bþ[l²b(ÎfË– ò]F‚âIŒ(ãÆSBžÃB¨õ¨­ÅFÇë.¥I¨ k\ çÕs»+éQ?S`}ºt‹eïÚ,€}Ë÷¤:;2èŠæ„™L„%õaP'˾KÇQ…xÛrÚ./¶gÅ|±…Xpäk튜~W¶LÔî}×5 ,=y2lÞuð_ÝE{),Úʯ¼ÀÁ-Üm‡š%8=¡‡íå¹8ràE+áQ«ÆÐÄ´®ÚÔÆ„-®%4ÏrROi 8T|˜ÌF<—Ïçܹ™äæ§1iÔXö¿÷z…a÷„)˜è`?Wj½…l\ø6o±œm¹. FE…Fα{q—dSšD´µrÇõ&\˘3™óÖƒÌÛ u;öæ¦;®¡mÔQý0Z ¶¸(rzŽZþADè³Á„Õb&(*hÿº5`¶™ñ`7%!ID<‡²Q;ûª|\„U:žGŒ±¼¶Ë‹íY1Ÿ^œÅnÌÁV­]‘Ó¯Ø2` #,<è°g¶Û‹# ÿÈ+¨ôwn?lŸ ÇêȣĥU™‹â|;ž¨#ÅZ·Ý4¿r:0€÷°wjSh,áQ±Œ™2”f¶£/“¤ü_œ[?fÒ¼]ô~l 'crnæíÑãÉÙßvPÁvö: ÞQ«ßïqèK‡òØ¥CqånäËIóòÌ–¼6ºGü½¯%–ÆQÅ,É.ÁÛÔFUžï6…ÄPÁ>ç>:Ù·³[Lhå7¬£c[‘¶ gù|zído+$:%VkS¤ºÎ¹O•ŽXju m XOŽÃ Y›X·½ÃÏ‘-qÉ4a-Ë6à\{VñËfû‰ÿ«!‘jYDÚŠÈÈ.:˜Ã¶„‹è°”ÿ½·œl»EN¿+[åU[µé5è* ŸÅ´§çP‚…ñ´¹à ~ÒhkÀEý;ñÑÇÓ˜²8„ àZÔoB®æRNG–Úô¼²-?¿vý_²Ñìÿ&ñÄ…ðÈHŒÓfpÏOS„•ˆº-èyã0ÚW¤XiÔ›Ú>Ç”Ñ# #¬^-böß7³%rýCÃp¿ö&w |‡)„zç f\ãxBm¾ÛÒ˜Îw¯¾ÊË™…¸ÔlÕ›a·6ÅVÆ–R«ÛÅÄ>òk [Ñ6¸ —‰“¸yÜ ¦OÈmïà ‰§ëãÜ<ƒã߯¶šÚ>cçÓKáúïI‹¾ëêX´>Eª‰Áëõ–yQ(55•””EHD*Ç[Ī×Çñ~£yä¢XôwÀ§÷n¾}ò Öö}šáÉÁ‘mîܹ§Ð•-9CNá‚hyû“Ô)´êËWO7Æ0:Œx’Q*´Dª“Š-©þzËJT„âpúMœ•ˆhý¢HµŸÇ(""""*¶DDDDTl‰ˆˆˆˆŠ-[""""gý5¢ˆn·‡ÃÓéÄív+ ""ÇA@@*¶DÎF&“‰ÀÀÀ3z‘ãK·EDDDTl‰ˆˆˆ¨Ø‘£Të3[; ¨œj[•»""§ã~}:Ò•-[""""*¶DDDDä(úœ-?êüw±‚ "r츽§Š-‘³wXOADä80¼zfŸØê6¢ˆˆˆˆŠ-[""""¢bKDDDDÅ–ˆˆˆˆŠ-Q±%"""¢b«ú9Éþò%æ~½—æYÎEËÞ ž‘©Å§÷1DDTl¿½úÓ'LeÅ÷¡º÷²êÍǘ>áE–f8Ob]ö?My‰Ÿwß>86Ìã› %ʺ³·€Õ3Fqa“p †Àzt¾é%~Úí®`Ñó wÖmpdÑcçÚ'ž ‹â+"¢b«lÖˆ"6ü½›o7žœÕ¬ËÀf0œÞQô¸ñúù缕Ÿòïéºw>;ý„Wæ(ûÎXvÖM¹ŒNÃ~¥ÍS?‘UXBÎêÿqåž§¹ Û8~ÉóV­YsMzÜ|Ýkê‹DDN''p×¶Ùº9ŽÕ+É9ç"bÌ.rVÿ…»i;¢×,ß_´²mÑ,ýk+¹ÅnLa ´¸ø*R‡atleñëâInBɆtò Š0ÔíÁ…}Rˆ²/ŽKYüÉ"¶ì3Ò I^¡œ¶mìø|iù0ç6š¬Ô<ÿv.jŠ;k9K|ϦÌ"Š#±Û•œÓ.«³´/îÖ‰­ßLž§)-vòó?ݸöúVd,˜Âw†k¸ñÒKh³n Ëo`;n"z\Hçf‘ʾ3”wÏWÜÿðïœóúžé_@£ ;g››]Â]³†ñóÍÿp{“ ¼ÝßýÎÎ]»±tǬ7‡Ó&$Ÿ¯_Í;2á¼Ú̶†Ðù¥¥|Ö£’®Ãø^SR(X9á·<Äì?wCt27Œ‹©C’ -ú‰ÁMnÄqÛeìþl3va>çÞŸ9’ÖÁpg³ðþŒþßlØë  ~/FL™ÉÓWÔÑ÷w‰ˆ'ôÊ–)º5‰æ4Öf:Á™Åº4#ZÕ(}3:P’Åvà¼;Ærûýã¸ê\ë?[ÀÖ¢ýWܹlË®K×›G0`ø`šî[Ä’5ùxì[ùõýÅ'fðر\ÙÙÆuy¥ÿæ·m+õ.¿Ž¤ÐpZÜp77ß5†KZ‡a´oã×ù_±/ñ:Ž}˜ýš‘óýl–m³—^Årç²-³ÝnÅÀ!}iÔªa™¿³½`ÿKþ!mƒ‘„6µñe°== Oh0¡^ö¤obw¡[Ùw†*Jû˜%%¸õâZGä¶!<…A—†ñ×ËÉõ–æÈ‚•]xcéJÖn\˜üÇè÷ðoÆÅoÀuê3âûìÝû_Ü\÷ˆ¶È_Â=—áï>ápñQ_Ò{~Ì+ÍÏ’m,\Õ™i¿¦±yËܺù†½»ãàUåàÖC˜³j/.W.¿=ÎÛ7 å³Ý^MžˆÈé^laަQë@þY±ƒ¢Œål³µ¡qÔaçÒÆ`jµjN+F£¨–ÝH´e²}ïþGÜ!$tJ"Ì ˜£¨›DþŽ}¸gÖ ¶y’Hi_«ÑDPB7ÚÕ·T¼í£8³þd‹»)h2X¿ šzØòWFé÷† tiM„Å0†%ѼF6k6äãÁ‹}ûïl·¶¤YM %Y»l×óRjS#¥çµ!7»HÙw†rçfPP“Ø £o›‰¬Ž;'‹`Šâò{¯£‘°&ÐÿÞ‹)øp6WàÙôÂÿã#{_ž¹§;5,jt»›gû9ùèÍ?)°ÄÑïî«I°¸øâlùy %¦Xººšµƒ1™Âhyãܹ‚/7è¡x‘ãRþœèÚ.¤i;‚R—°²pmºjÚ}蟽%ìZþ%KÛÀÞ"7ƒG‰‘†îýgÜ+ÖCõ¡ÑlÄë,=W÷Úsq6$ðÀé¿ÁJHdà¡j²¼¶âµçâ h@ ùP¨£q¦ã%ŒÛ«UaÔoW‹ÔÔµ´iÉîå[hÕ‹H3v àtÕ&Öš-IRî±Láµ)ÙÄ®b/„^p¹ÈÙž‹12–#`§nä¡sd=Bòבã‚#/cË•³ÂÈîÄÙüÄF\Ó( ¿Û‹“0…rp1`±™p;K¯zyö‘:õ.î~y«²nr÷™è_ìÑ䉈—êçD0´)I›Y•N³&áGtÀ½„ï~Ê¥áU#¸éîû¹yÔ`Z†W¬‹[8GÏ¡76{¾ýàmÄ µí=²=sÉJ\‡Ú+ÞSŒ%<ƒoŸG\¸0˜Bͼ?Ø´}i;ÂhÚ"úˆñYêt£m«²î ”Ô—s~çÍ/38üf±7ï7f.Ì£ÕUí 7ÎݬßY|0íJv®#'¤‘æCùåõqgÏYŸàœõdÙüÄN溽׋¢¼¿U,ùë>º•kç¯cwî>öf,ft¼þÂQDäŒ)¶0†pù-\vãU4 9òð^g nS8‘ñP´å76åVìÙ&sÍdê³–Õ› ðøk‹ýà™ß¶ 6-vrs½ÞR3™xã:–ý¶‡’í¿’ºÞHƒ6µ|^4ÆÓ¼A«¾ü–ìÈö$D˜”ag!Cô%<ýH2?¹’±ïýÅ®b;¹›¿åÙë¯åíÐá¼8(¾4‡¼ù|õÈ ü´Û…kÏ^|ð+®Hó@ÀF­ \6¤ùÜáÁɃéký„q“~fËÅž_&1î#3WÜÚ– rúç)Ρ$°>I ˜q‘õíTæn±kâDDŽ““ðÇG,õ¨QFgju¥sâ<M›B`x5P+¬b]4ØÐùªN,ú|ó ÁT‹¸ø *Ò¶9š&]ÙôÅ ¼ñ±…¸K‡syÛtºö~^0—Y?ã Œ£Q¯è\φÁ×ÇqˆkÛf¯ ªw3Bôùüg)Iw-diÔŒוØkóÁZ‹Žýïãë%ÿ¡[¸ [<×÷Ïå¡äp~Þa ñš‰|ød Á¶&Ü<öRÞ½£¦ëƒé:íoßxØ!B»óÂçÏ0ô–+¨ùÈ^¼Qm0ñs^송œÇƒ:Œã¹Þý¸)© ±õb¨Ñ²=ë ÇãEDŽSåãõ–}£"55•”””J5¶Ó¡€zöþ̇oo¤ÍÿÝDã`ƒrŠªm­XîÖùïâƒÿíÖ³ú:Pøƒ›ÜJÍ«x&9@""gw1òêbvÜÞ³BûõéfîܹúnÄjå-!ó·ß(NèBý Z"""‚>ðÚê¬ÂU|ñÚdµ¤û °©Ö[ÕÇÜŠËîi¥@HÅwã푳€n#Šˆˆˆ¨ØQ±%""""*¶DDDDN= /RA†W+""¢bK¤:ùú=‘ŠÒmD[""""*¶DDDDä(ÕúÌÖéþe‘""""ÕMW¶DDDDTl‰ˆˆˆ¨Ø[""""*¶DDDDTl‰ˆˆˆˆŠ-[""""*¶DDDDDÅ–ˆˆˆˆŠ-["r\ÙÓ˜5|ŸnužšíUÇ1í˜?r(ïorTªYWæ·üﮌ¾a Ï/ÜÄŠ§ñô™xÊí¿ãÙÙò¿!<>c#ÎS%®ÿ¦¿'c¾OUm^DTl‰œ}2?ÅÝ."×»ÿŽÍ|8âFý³‘™²4ï¿zZǻÇTºˆáDÓ\ƒvýcªÔ›ïÖOæ±­õÃ<3{6÷\Ú€ºÝÈIa”fgù ÊIÈ{["§Ž¨IîøÅ¥ÿïÞ—ÆfW,¡Ù¿ñ³õy5iÙ0äÔ.<îW `Š ±{Ã+Sl9ÉÏ*!4>›ÀLLNj阤bKN¼©³B R},uÚS×û&iš7²P’þ'ù‰}鞻ట-gwh+Fš(Ýõ=¬y×^øŒ´ÝÓa·¿”Ú¥U®ÝËø|Ú –üÃKóˇ0°_c¶¿þ¿äìƒ'ïà7s ƒ&pg§ª¶×šPg³ÆLÆÕ=™¼ßÿb—§7?5œÄ€£+&­*Ç´o`þ=/büÏd®‰Ïç¯9“xï󵊼 XÂéqÏ£\ÑÈv(ˆÞ\V¼x/ï¬-Ƶq4÷Ï)='t{ã+Ü×;£¿q1#^J6}ÆÌWÞeU¶Èæsnˆ"|L {OÙý«[^\½Ø·~ËüisX¾%BãépÍ®¹ ž€âå¼:j.ÍŸ~†ž5L€ÍoŒdVÐý<0°áQ›p%û[Z=»b&/?û›öˆí4Áw^B€ræûèSm{³ÆLÁpigr~Áú+õ.Á­—:ùnê›ü²)À¦ý¸íîëI 1€'—5s'óÁkØUàÂÝ’îƒGѧ}&{i.¹{¶§ðÕìÚ—‡±Inv(^~Çé³í@Ö—•ƒÝ£púŠ¿ãè¼nÎçlâýµWóà] 3”°qúHfîbü͵‘‰®l‰œÊ A ´ŒËcÃÚ½xpñçN";´!©©Í¶S£¶Ô´îÿ%W6,³páø™Lzý~šoͼ_ö–>›äHçˉSH‹¿ƒgÌçùgn$ì§—˜½¬„¦CîåœÈº?ôϼ1!Ý£Kt•ÚË)ýwçnV§7bÀSSÿ°à -€@’ªrÌÃ86½Çû©q\7ù]^ž=—§»•61GóÂIóƒšÒàÖÉL|cϼñ·¶5H_¼žŸß¿hÏJë+ºk5@enØù9æ/3Y1”d³ck….#5iP©Û‹û‹¢ ÆÅ±u{:ÑçÂDŒ&ÂZõãÒfVßÃð×?¿qýžU®Žô½¬9!&!Íúз£‹•‹Ó+õÀweû[Ú¯@š_Ó‡ÄP¦fôº®-%©?’á¨BþÂhuͥćš°ÔL¡s=0'_IJ½@Lõi{n,ûÖe•ŽÉNb·ÎÔ´a4R»k?:oamæþg©L´¹¬3ÑÀGRë0öŒW9ã,¯ícâVNüÊkSL'ºÖÝÆÏìŃ—¢u_³6 +]Ø´‡Éq¡Ûˆ"ÕÊBLë¦XýÎŽÝ%l(iÈå±l!íˆÊ*ýÙÚœZ5 =Tʘ‚‰>´M63Þ^À›—IA~3î¾óþ_ðº 1Ô+Âáñqo©Êí…•þnPå‹Ç<": ¯å–þ3ùìù"âÚ÷¦ï­×Ð<²rÇôøGÔ¡×îÆÒŠÐ]3‚¯£ùì_P9q-Ü=8‰PË¡<­‚cu>îJl³•í/û ‰˜ˆC…Š9<ŽÀ’»Ë‹}ºm "üÀüLXÌf¢<'gÀd5ƒsÿ¼z ÙöõÛ|øårvæ¹0=”iëØ?ëÆBÀh6âu/ã,¯í²âæ3þeäµ1š4âÓ/RÙÛ£+Û¿^MH·ÄY´ƒ‰Š-‘Ó‚µnj9f³â·râΣ– ¦Dš~ÌŠßòÈ lN¿˜Š-=cH,!‘±ÜòâP}Òm_ðVâ>•ÿöÒö¿ñ•w«rÇ<òwCˆ¿h(#/Š;o#?Nyœ™sZòØðTæš‚ÿql8ôºàhl%{(vØí\æã©YÉþÝîÿ&€18[aùN¨ep’ŸQ€5&“ÁŽÙèÁí>X`/°ã *«JöÀ“Ïî\PZ)¸r3)ˆ!ÐTNœþ%×¶yûý]ôxp #ãƒ197óá=ãÉ«Èü•3ÎrÛ>*ýÆÿ°ß9<‰C[_BÂÌyü±!õcè|SmLÚ¾ä8ÑmD‘jfnDËØl–~šFprÀKㆅ¤~º oB{â*øÆg¿ˆŽKùàÃåì±{Ác'¬Ú‡ÇH˜­ˆ]»Š*ü\ßö*´cTþ˜G¼Ag,ã´,JÜ^Œa„‡X0 •þ ÊŽÃÒ -¼©üð×><€+ãG­öýUUûgmЋVæT>ýr-…n7…ëðéo&ZõLÀb­I£¨=ü½fOi²~fÑ_…eÆ»²ý-½ TLÚû ØœïÆS¸žæÿ‰­C7jY«a¾ýÕxŽ\ÖâjaÂMÞê…ü±ËU¡ß-oœ~Û.#ýÆßg]Ý‚n-ö±èÍÙl©yɱ*µDW¶DN¦(µˆÂû%4jµÿlÙJ­äzxXEÍö ¿ŠckÄeŒÄøß¬›:–GDÛ‚¤¤v—UT²¿¥»x,m;äóÙý7±9jtÈm×&–Æôßη¿³a?®L~Ž™÷Œ$4&ŒºI$FWì>\yãôÛvY9x¾Ÿø;|žÑð‚v0~1uîH!Rµ–Ï“p¯·ì©©©¤¤¤(BrVØ©ÏG9ëx2?æÙ‡VrÁ Ð!\Ÿàvªªm=½û?wî\ÝF‘³·ˆÍ_~M^«Ëi¦BKŽ/ÝF‘³«ÎÊ]ÂÔ»&±)ô\®(™ ÕZ¢bKDD¤ú»2â]9atQDDDDÅ–ˆˆˆˆŠ-Q±%"""¢bKDDDDÅ–ˆˆˆˆ¨ØQ±%"""¢bKDDDDTl‰ˆˆˆ¨ØQ±%""""*¶DDDDTl‰ˆˆˆ¨Ø[""""§³B µ­Šˆˆº²%"""¢bKDDDDÅ–ˆˆˆˆ¨ØQ±%"""¢bKDDDDTl‰ˆˆˆ¨ØQ±%""""•¢O9ŒÓãå‘ÔtænÈfk~É9Æ¡\ß8–'R° št["'Î#©éLücÛ=Æ­ù%Lüc`Bç†g]±©âSDTl‰œDï¬Ë`QßdzÖ‰8#ÇøýŽÎÿd%ï¬Ë:¦Øz$5Õ{ YÔ7™„°€³bÎ7ç3ò§<šš~LXh‹ˆ¨Ø‘ãZlÖ ±uãnPfñ)"¢bKDDDDÅ–ˆˆˆˆŠ-Q±%"""¢bKDDDDTl‰È)Á•Çðw~ed¶G±‘3’>ÔT¤ZxÉÞ¾!K¶óÉ^'ƒ‰:ÑÜrn3¯cÁèÊåÎÙiØ.MaJì™wŽóà¬ÅLÈ;tFïfõy¬u LÕU”Ù1["⇧x7·,ÜFa»–lnN¬ÛÁß{YQ]…†×‹Ç`8…/E9ç‚Î,N4ãp8X³#‹'~ú‹äŒf¬¼$ŽúªDDÅ–ˆüŽ‚b""g']Ü©[4o^ÃîàýIDATÝ‚[Íûxö»4ùßÔüpss}?ô]¸;ƒÜÑ<Ó6‚F5jÕãÙ†>J+ Àh¡oÛš¥…P´{'3Š£y¾CõL‚Âkðh»–®Í;Ew3u¬PPì"ßOßsû•¢ ¾®"¯9UèÊ–H5 Žˆááócx()ÜǤoW1èë@:^]—Ä2^ï²Û)´…wð¹.q w¸pb£™º¶C÷œ%Åd—ärÜ¥ø±×íÂí:5âq±Ã!f<~ú^äµVhŒE^Ë1‡8íb""*¶D¤zG049œÇ¿Éc› €¼ÞßÍF°½˜,7´0xÉÜç$8ÄŒ¥Œ6-¶bƒ˜wCSºZNýØswó^ž…^µmyüôÝ•W±1ºr‰áé9;é6¢H5päf1.5ƒï÷ÚÙçö›—Ô?sñDFÐÐÌÔ2»ØçâÀÅà˜8úšv3ne.{<^ödng\º+š…TÆ1‚jÔfe£ßCºÓ ^7™{öòi–ó”ˆ×ëÅåñPd/aùæ­ ø,Œ [Ãè·ïî ŽÑ]F Oõ˜ˆˆ€®l‰T “ÅJPîîøp›€ÁB‹uy¯{ñF€@nnÅ»‹Áô‰®=;²¸y/\֡߯¦fª¯-„[ñb3†²js(O\Ñ ãâM´ýï*r½FjFEps—f\qÒ#àá—oÁúmé9\ÍÈp.kÝš•­£J?öÁè»ï—UpŒ—™ÊŠá©‘R¯÷ð‹ò‡¤¦¦’’’¢ÉÙµ ^] €wXϳrœ†WŸñc÷“³uì"rüÌ;W·EDDDŽ'[""""*¶DDäÿÛ»ó¸¨ë<Žãï9NI@Q©µ(pí·;4ìûD jN¨ÜA8#lLÙ¸O=?ÙT+ŽõLcšèŸq{Ôaá/Ê8Z;¾ò¦ž¯E¶ŠÐs1Mh„- ºM,ºà¾ŸvÁ†ÒÂ…ÅhÐäîM5¹{SŠ[@Õ#lªŸÙ l¶@Ø l¶@Ø l¶@Ø l¶@Ø l¶@Ø l¶8„-Â[„-Â[„-Â[„-Â[„-Â[„-Â[„-¶[„-¶[„­šudƒ&Ý«ØØÑZvÀ}þÆÀŸ_Eë ÌÇ;µëí¡ŠÕý3wÈÁPcןÓçüñ™«{¯ ŽÕ7yRËÑïhR@8ç¨æZ;]ˆúýk¦Eú+²y#*l¤‹,œ+ Vͦ@5hµîz§bê™knGLÌ;¨¡°Ô4C݆jd*ªð‹f3J>-5ø…iœ ±Ôo¡ævíMLQʦ¥zyf¤æ<Û[ukê=rÌ;^·K^“™Ïô¶ªQaŠ–O›¦O·¥(»À#ÉG¡-zèÖ!¨O”ï)«`neÅÍÓÓ˾R|ŽEÝîÔ¨‡ú)ÚÏ É+Gê}ôöGZ¹%Uv¯Iu/é¥Û† RŸ&¾¬¤ÕB-îŸxö*ê‘ š4h²¶xê¾Wÿ­áÆ ÖGyÛiƬ%Ú’iTXÇ~ºÎßSúŽœØf˜®Žm«äß)1פ°®÷jì¨e3”ÝGÖë™û¦êWEè†{Ú*ñÓÚu4TïxT4Û¬7f}¢m‡Ìªßcž|èEZEOEšÝ1NÏõðSÚ'é‘÷SäNKR–«·êZËêò¶.Ô+³?ÑÖLƒêuè§ëVé½Õ9ò¿j¢^ÙZ–C+õÔÐ9JRs=üæ‹êìTœaš°2_uo˜¢WGËzæ¼´¹èߺîÎÖJú|¥v™¯Ó‹¯þM³ÊØŸŠÎ?øC9¿aÚ“¯”T_ÞO±·Ô_ZY•¹ó[Íò‘v;O}`ª>_°YÖíTßìPÚºyšüî¯:╼ù›ôú„éZ¶9Uþ®×€«›Ë‘¸Rsÿù­É¦k£ïŒ×˜Ñ£5zôh™0O‰Å| ª¢uãÍY§ÙSiK¦[>Ú*Êñ£æ¯Î)ç¥kåò} ‹¹LÍ.¥¯GsÌ’§B=¦/>Ü"cý0Ý™ÚôÁ~~¹²Ã«ŽJýéM½¹.G^ÑÀ)+¹rµ?%_’dŠl®sÙ=âÉY«YSkk¦[¾M;(Ú½V”Øï†J¼€IÓÿ>Œ“§y7uiUO{éûsnóXÙ²^¢ÁÓ¦Ëj’Ü…N9ÿÒXFÌÐŽÌ-úõ[Í‚Ž?ÐW—=1Yc:ùɾaš†O^«Üµ_+ip5ܼT?äI  ‘¨HS¾"SGkNüz-]—©îWò$׺é5'UÉÇç!s=Ù=gOÀ¹ª¯ÇÿO $Õ¹Zã_®Ö>YZùô0ÍÙé-Çùê²1OkT'³vz¶kÂÊ<¥î8(ç5¡²•»¬êª5/—½cˆ27nÑQIAݯQ3ƒ|/ ;´:ó;-]iÕe­:’‘¢„­{ÕèÑ麴O2Î?u*T7´ºF}¶kCƧšþªtEP’¾ÜTxî»Rî¨Âc£P›ƒÕõ®j°nRR>Óâm×kT=Òþx¿ç|­Æg©}@²ÖŸñ¢Á¯. ‘³öêã9sµß?A+wUO϶¯®ù5W†5µ!oNª’““ý·ï7í·{Òs¨îë.KÎOš7ûCm ŒQ‹bã_}Ýxg;9vnÕþB‹Â»Þ«§µ•ŸA2uÖðçUÿáÊYÿ…/Zª¯×EOu ãÆ&(az«`Ý‚/Óˆ±·ª]ˆQ©?}ª¯w‡©w—Àsn¿ò÷@õpÁ¯*DöÑ]]m’ìúiÁw:è_zœìw“Žþ¾EIæËu÷Á§jm¢›‡ P‹@)û÷Út´ƒvô«–ž­žù5zÍñz½Å~Â...N111œ!@-çÔ®·Ö¸/¸õƒ'å´`Áî£P[Õˆ¯ë TVE~]‹s&P9¬l¶[ l¶[(Ý9ßúÁ0{ÕY?[×Å3 .8•ùvj¹ÏVƒ|Í€ÄÛˆ„-Â[„-Â[„-Â[„-Â[„-ÂþœakáÈáZœä¬±s¥­ÐÛ£ïѨ{îÑ¿¿< Ï5ªŠã·¯gz¸€ûý™Sð[n»SBMå(ºúð¡açXtýþéBíkÿ´¦Î_÷ g UÇ\ïd=WE½îÕòQw镵ùò–«¼é zBO1½uj¿•½lÔÔ†¢¯¼ªf6äqËk,Ôáôö “'UÌ|²žUP¯5½ÿôP¹~þèakáÈá2>:C± ’4Ì ¹{u–}ãveääÉxÉmzpD_Õ÷)Pük/iMvŽôü­7ÛÔäÞ5ôÊy2×iùÜyZýkºœÖ0µî7L÷ÜÒ^…ñš?f†\WvPÞ/[•áj¨v¡{ôsÂQ¹vÒ¸…Õç*ò‡ÙúøûÊ8ì’9¤­®ôˆúw®+“$WúZ}öæ|­Ù~P“¿"º ÒÐá½b’\%m×›¥­¼¢Eß$(×e%(ZW=þŒ4ó¡ªÎ“ù¡oweù…³­jxÍÃÜ·P+g½¥5Iyòmq‹|ì.E$yåØûÎý@~Ï—£Ô%öaÅö‰’Í_JŽ-ù?>MÆG'«Íòâêµ® ËûD½zÚèþgûñê:ž*­ìÞvöh/û¯IÊÍË—¹ùͺwèõŠ´•Ð[ÝiñãÓŽ]¿šY*?oxrµcÁŒ{ „­ªW˜©É—hìÄ! Q²Vüs¼®é¦Gz‡¨Õ°'tyât™ÇüG±Í¬ÇïÜ£/¦ÌT|ÇÇ4~ì¥ò?ô³¿8]ïGNÓÐNÇÆÛ¾§™Æ¾ðw…Y%y«ùÄúöªÓ«® ž\íjt­îŸú¤ÔñèÀª™š9çu5™þ¤.µ&iùä™úµý(=ùXŒB ¹JÝ-›áØv¿*a»ƒBiq\¸î˜ñ¬ÚK÷è ÍLEO®tmÙ¨SÞW¤}•Þœ0]¯$tS߇géåÐúöù§µpÅ•zòæ2MÐ'ÿzWz×ó“ZH¿}¬×¦¾¨OÌÐíMK¯Ñ“o·ù_¯GãËû´z-ܧz¨åéí½-4î¹ UºÖ½ü¤ÞZÔ\ãî.¾·‡*6v)ó†µÄãi»ÐŸi˜‚uéÝb‘d W«öAÊJÌ«„‡;÷~­uùtó-u‘Å(ëÅÝÕ·=íY•¨I2ªý€ž ³$óžˆ±Ž¢{vW£‹|d4úªþ·¨‹ÿïJ8à”ó÷úÅÞY·ÞÑM¡>¬ÁŠlÙDþÆÒ·ë0Ye(H×þ½i²»Œ²]­Æux}r^‚Ô.¶¯¢M²\£î %s‡Šiè+“o#u즜U(ɹ÷[msuÕM7¶V€É¤€–ýuSW—¶¬Ú£ÂJÔèéõZÆØeÕ+=TZÙý 6ý/W¨Y’9Lúw#î¥9«`ìÒú¶”+[Õñl °ÌyF³Q^§«ÄÏ®xòèp~¼æ=6Tæ¢ë„×e—¡á9=A’É_Á~¥Lâ^»ö}ý®–|µA©y.ŒØêèôÊS®‚€V ¶Vl»Þ¨ÛõÀmïé³ÿŽ×iRxçtÓàXµ¾ˆ‹ÉycòSãu`0Éb6ËVׯ(Zd²š¥Âcuæ±gÊáßJ–ã¿lQ`D€œÛóåVP…kô´º)kì²ê•*­ìÞöS°ÿÉKŸÉ?D>©:ê.{ùáœæRz „­ó´B!yO©?c@˜. ÓÓ†«é™÷pÄŸø’¸ö-Õ»‹3tÕø™å/Sán-y|’òŠÆ¶ÙS”ë”"Î8¥nWRðµÃ5òÚárçíÒ3ŸÓ{´Õä‡ÚPUFÿPùØÓ”_xüy/T~ÚaYC+þù‰3ëµøŠ¹º™nüÇHßœ§©ƒ'«@VE¶QÌ]#Tž×ÈÖ¦·h`‡—ôÞã#¤€­RÔ>Ñê7n„<¯¿¥ÉLU¡)@Ýiht”ü}JÞnsã­}}¶Þ;h—ÛhSh›t÷ý-¨¨? ßVøÄ½Z8wŠÆ/:,o@”:ßõ”nné+ƒó\뵊ƦG€ªïms˜:w?¢ÏÇݧÝÙR½nÕƒ·GËZRo]Q5óF©=† žÁë-~Á4..N111e0{ÕY?Ûÿ·^œYÀ‹#^óÇÌRÐØéИ ƒÊ©_Á¿]°`7¨N„-€jĵƒO+ýuÖ«œÔ8V¶[„-¶[„-¶[„-¶[„-œ‹sþ"jïˆ^œE€°²@Ø l€°@Ø l€°@Ø l€°@Ø l€°@Ø l€°@Ø lq [„-¶[‚ÿ'ÎÅö AIEND®B`‚145_create_host.png000066400000000000000000001303061516513262500334550ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/14_fields-for-interfaces‰PNG  IHDRO  ½bKGDÿÿÿ ½§“ pHYs  šœtIMEà 7k IDATxÚìÝwxÕâÆñïîf7›JB=@(¡÷*R¤©×r°¡A¯«×v+E –Š(‚¼ T "@ª émKvç÷G½Šð~ž‡'awæÌ™³gfÞ93;1ñÖ""""rNÌj…'…'…'…'…'…'5ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“š@DDDDáIDDDDáIDDDDáIDDDDáIDDDDáIDDDDáIM """¢ð$"""¢ð$"""òWó9—‰Œ‘]ÔRÈ4ýG5‚ˆˆÈD#O"""" O"""" O"""" O"""" O"""" O""""¢ð$"""¢ð$"""¢ð$"""¢ðTÌÉ®÷†3òÃx\ôþÕùÑûùékƢƹB“'EcúÒ÷ÎWYŸg\ºå¸÷3{äžY•KÙ¥ä¯yŽÃ?&Á}¡™n'ï Îñ—Qd3ûÒ«UC¶ ¹–ìûÚ“<øZ ïiÆÔú™Ô¡EDDJ#Nè:ÌnYŽÐ²ÇG‹÷v‰áñ.ô°és)«]”ºŠ¥‚©lÛÊw[rhÙ¡:¾ÿ‘~àÇÞ-˜QÍÉGk¶1$1ŸL‹uªñR·–t ÛLçÕYdj*¹ºÕ¨S_{T¤2•©kÙDuÙdšý¸¿G >¨e…zv¬_oeBZÑåžÜúq9iÑx"f¯}÷™íºf0(ˆÿ–©“?g]ª‰ðF½èè…ÐÒyÏöþ…0pì[ÆŒ·f³2!‚¢èÔCzFáçM'ö“ɼ¿8ŽŒ"¶rÑÜðäÍeYðüP~ö±S÷¾—xºKù¿¬#ÔnÃ[Õ xlî&exJFÙ Ùy$‹…Éuù톼²?–a‡ŠP~‘«Y‘× øÂ“‰–­š±Ô²“Ù!µy£¦µx¯Ë{aGËKž\ûYñSµ¶$¦f:¡ß~Oì‘kéaÂÌ|å rn|‘o®‰sËǃ¢ëKæ=Ûû¢0Ž™/ý®{š÷_®»¾dü¸—ø¸ÚYæòÁšH†Mÿ/­B¡ %${Ñ£ž ûÎIXǼÉàhÛ_ÞîjÄëyëhp: Óö'ðhb4)LJÒÉÒv#""W±C{vÒq1¬êI L´l^Ÿ–¥oº³xüë­L<â¹ ²/Ù=OŽø¥ü’M÷&¡øVê@§òûXòk*À¹ï6xÛ2°w4þf ¡Mûp{̱pr¶÷OÍMܤÁô¿ãî(ùwÿëÛq-s±îÖÜ}s‚-‚cnâî¶E¬]ž€ËbÃT˜Æ¾}Éä™ñŒ&:äò» »]€‡µ‡8Oúm´®Lha#èB«.ŠˆÈÕÌàО\³$ôã^ÎåéoŠƒÓ…^¥¹4#OF>q‹×PPç~š„˜ÀT‰ö*0oÙJÝxáyGp6&¤té&;á•~kÌs–÷O·*µ¿Ì˜ÖG_)Øø:c¾,[f !ÖÒw­„TĹ5síÛy´ÿ'Ìþèiæ$AÕÖ7pÏо4¸¼ºÃ0`9E(òzðFTgZ=_ "ÏÔ:Ì7ûuáNDD®r;=£C9î†S }jòö‘l2/ðPyI“‘÷;߯ÏÇíœÎÈ;ßÅn†ñ?ø'ýËcw¤“ï)­A¹™…x#KÖõ, [pyʇ½)=?ÈvôwK`8ö¼d²ÜPÍÀMVR¾áAø˜©{ýþ{ýвãù~ò ¼ùI#Þî&0.“²8ÓÌøzÁ„%fqÜ;6lØÆ-Íù(ø Ý:Bв“ˆˆ\ÕÁ©ÌÍág >ØKï¢ä&ò 8^^’ËvÙ›¾c³©%M~›éo½Å[o½Åô·_æÎ¨LV.݋Օ–F,‹6eáÜI?óí–£Ãg¶³¼!|£ºÒÚ˧ ãÈõxÈݹO×ZhÝ­&¦¤µ¬ÚžJÇÀâLh ‹Ù„ÉìG¨oÉi—Å ØscSñÔ‰áÝú~ØOŽV\,úi=u"ΣmFDD®nmÛ5=œÜY<þÅê.NaÉq³e«&|r÷3_’‘§õßÅxíó´©Væ B×6æË÷—°ûžÑÜóøL6†QsB©IL“Ž”F¿g|ÿ‚øÅpïSwóÞ[/3øó<ŒÀ(®¹ë)5ðÃØ“ÀòéÓy3%ÙNÅÆ70òþzøZ ºÜÚœUo¥ß$_ê?0™q=Âÿ²ŽžÏkì¬èÖ–¸ºÉÌ:P@žÍ޵+ÒN,}!‚>¯Oa`”õìóÙ¬|z0SvTãži¯ss¤åOû·â"þÃQ<¹(€È¾™Ô¿:Ösš·€õ/ÜËË[  wLžD¿ª>ÛuõYÌ¿‡Ï À¿/¼÷0 í—¢… ËY°*7V*¶¿‰îµý1i!""ü #OEÉ«X–Xö•4~ú1—Ú^.c… ˘ûÍ7|óÍ\–î)ÀP“ˆˆH‰K< áæÐÏ+H:áÕô_–‘0 6õ|õ\Z¾D|’1™0ùS-Ü¢&¹¬Ã“+‘~J+þÝM·úYñ»²Ö°4þê5ô;6­QÀÞ%1cÞJvgalJ¯;ï ò©Ê=ŸiO©ìå¬Húî)¤ýü!ï-ÜL¡Ãd;<Å{`$ušwåŸo¦eë%êhrw.ç‹yß³z["YnÀBõ†méÕ÷º×ÆRÒ^Žƒ+™óñ|~Ù¶ŸL`²Z‘*µ[pË;i’Æ7fÖÁc¥ï}o8·¿WFÛ>û>O4õÓžCDDáéÒp&,ç—ô’ìÔàFn½)–Õ¿¯¦\b—줠a3ü("eñË<ýþvÜ%ó:R63ÿítañ|¦=)|5á²µ&eã<^™É´g»PÞì%+ömž|õŽ”Laµ[q;2Ø»ö+&­ÛDÒËcé[Ë¿Úmˆb»öSØ#ßômlÏ.‰` ë9àìHCK2›v¿ÞŒFå/$8yÉZÿ.ÿyy9iÇåˆBŽì]Gì¾nkø×ÝCêÒWøÏ{ÛÎésÉŠ[˦=Y€ÿ@;ž¼|œy)Ä­üŒ [“yzòƒ4<÷;‡ ýÎoí¤Þì}ä"8e¬žÆ˜7V’Uöew‰›3cÓZv<ú*£;„a)Ü·ϽɊœâIÌ~Ø=ùägdWF!;úõ§mˆv ""ò—…§Bö,[]r@³P¿[c"ëÐľšµ(X¿˜íyMih‚ÂíÌù¬4 •£Ãˆg¸¿m0)+¦3îãÍ'{Óž#KŒöVj®fâ#“X[îmËÙžÛ™N¶8f¿Sœ‚Ú3zü(®­lѰ€Ÿü„Ýž½|1ãG:ëEDp}ZU†ÝIàÚ³‘$W *Äÿvì²eþN6§º©ïÇ–’$æÓœJ2 SÇgo—'+uný#oiNYض†ösºÁùÌë¾/f—§`:Œ|Ž¡íË‘¼t*/~¼å¤®Þ~0Ïôn@Ãjå°šO.Ûf=É¿M…¬Ÿøjã]4ërÎ7^ç¬þ€×VŸ­¶3û½ÒàF營ãþv¡d®ù§üDYü2c6×5EýÃÛØ^œj{›—zVÀ‚;;‘m¿Åc±€¥·NžËµ+žbØôxj {‡—{†ë«©""r‰ÃSÁ.¯Í-9ůG·Få0û×£[c_Ö®s‚s‹·æÒ²}0î¤ßØž_2_>ÜÙ¥&!¹þ.z·™o+ÖuÓž?Úö¿žh3ø5¢]UX» 0r8œçÁUð+sJ¾EÓ^`1€×AZñ•)Œ=kH(ìED`š4 峤LÈüéy®ßA Z°}]›wesCД„Êè6Q\ÈÆ\å·’-ªõç¡m©dˆ ºýÍDhÝÝÎ l+ê‰êË]£²@Ðõ÷pý÷óõqC^Â4&gÃÏÌ[²—äÌ<.EÙ¥NÈ ¨SóâóÀ6•t3j÷c@Ǫ˜! ãúýï'ÞÝänbÍA'ÊW$Ä)ìùd¶×£zÕªÔ¨CãkºfÕ÷éDDä/ OyÛ³¾ôØ]¹!Y‰ìÏ1°×¯†i]<n¶,ÞDV»kñ+È!T Ê"ïyL{nÊQ%´¤L>ØŽ¶ˆžüôc—ŠœÉìÙ•|rÞ|²^´QµU=ì߯ÁÁ!~Û¹‡¬]…àÓŒ=*’¼n1‰ëw²;h/Ź«m£.è+ðeëe­X ºülë^¦­Ã" :ÚÖå¨ Ç]/t'ñý„1¼¿ÅqÚ¥9ŠðžGíÎø¨‚£MŸNi–¶…U  txÈ@…0+ìqùdä{1E·cȽk˜ðëI/LdÓ/‰l:š#cðÂÓô©e×# DDä/OF.[oÄYúÿƒóûļ“Àï‹ù-ã:„âEy98 ð3ÞB2O<1ŸÇ´çÆ„Ù|úÃ¥% Œ °¶ø73žjÍ™nÛ±Gµ¥–i Û /{–/'ýÕ’zu"ˆ¶-f]Ü÷|ï[2TÙ‚˜ »d (O ¸Sö“éiŽŸåb¯{™¶Î‚>eµ‰ˆˆÈEãs¹Täûû², ·¼ú&wײP¸}:>·‚€ˆ>¼1e 5¬g)Ì@•:ÕÉpW'Ôz•}¢E‡øòчù,ÉJ˧?䩿~j‘+1<s˜å wpÛ¨&ø“æù¿§óá[ŸûÇOüKjoxŠ0,>Éžá)¸ ÛDDDDáé,c—°%ÕyÒÜd §Ñ5íˆ 0v^‹ ò~ÏÆ»Óεšù\`Ê^irä'2ëA2^À—ðz¹mè}tòÃT°±ƒ&°Ù[{¦½ÎÍÁ›JþÁu}q`éìʶÑúnÆ<|QöSÔçhtëþ¥?³7×F¥¶ýyøÁío*3M%zõoÀž…ˉ÷éÅKÓ†P#}Ÿ}0‡›“)ÀLPõ–ô8˜¾­Âñ9—²1p&ýÊœç°|sù†…°º]è7tÝk–]DzËnO'ójV¦¸Ù0þnú•ûOfâ ©L(Û&‘æ3—_”ƯOcÖòí¤9Ÿ*Dµãî'†Ñ¡¼E[Žˆˆ(<]L‹ßŧz'˜nÕ[02Æ÷4sÐ솚l[¸™ù«Q)÷[â ¤õÕØ¸`E¥“ys9˜ä¥F‡p]¸™Œ­ËY±cï¾ìO­7Qû´5Kcùÿ¹¦S{œ?üÊþuñîʶŒï~†‘¢4VüX…z^O¹±qíL&ÔdêˆFø&™ÅŸçQ«E[ZÙ+`ÍÿwžžÌÊ\ð‹jE‡$b7­cÞËûq¼4‘AUÏ^¶_ÞFÞ{f?å@DËÞ\²åË—óîs9ø¿ù}O±lßJDW¾†ƒ ~!Á !ͺҺ‚ u1“zü(Uî™Ëo‘8“·mÇY¡57vŽÂ–ŸÌÎß“I+4´ÕˆˆˆÂÓÅvïsÃ8òô{lÈ/ûªMïÿ/ƒëûžaN3ÁMoæš•ÛXþå;¼çNˆ[¹©Þ6•ÌV—û'NÂfÛ…«[ RFNaû‘Íüžá¡vðéÊ÷£ý£Ïòp vz·ñÌò’¶§âêŽý´u ¢ë¿ãþvM ñÜd¯^žûÑøØxõ‡¿Æ Ýñ`µòy~ÉB{óìø!Ôµå±þõá¼¼6eßîäŽg+»!Õ6}ÃÏ9@ÄÍŒ~àVªXr©’ôoïXÇ7kÐîÚS-(:„cõ/$$Y©}ãý‚â]j`¹úö‘>ú i›—óýÊMìMw‚O0U¶§G¯¶Ôð?‡,g ¡a×®˜ÊY.¼î|;u–;FqCë…Os‘9vÎa>·pG=»¶º¿yóæ¢;Hüi6ÿ÷ålI.kyêt¸‰{Ý@LÐ9ôoŸ tìßÂÿ@ÿvîäÑ“°Žy“ÁÑ6}P"rùì#¯òÈSGb?eÆÂƒDv»Ÿ'ž~†'GÞBý‚_øøÃåpçPã@¢š5¥Fà•s»VæÆÌ_•@®ðä’°j> 6fjËûÛU¹Iúî%žš±‹¨ãøàÓϘ9i$mr¿â…g>egá9ôoK ºt¦AˆE ,"WØ>òÊñ§ÞódìdΔy¸nxˆ»šMn†#ÿM›EJçÑ nšÍ‚©_c´©GÖºßHÌ5Q¾AwúÞÒšH›©ø²Ý´y˜nªX)ÊÚÁŠKX¿7—5”è7ñÏε0CQæv–»” {3q™ýˆhØ‹·ÆþÕTfýž6;~U{ a@³à2IÒIüܧ¹¹ŸñaB'FÝݘ@€‹ýó§2ÏԗѽaÑÔ¯p7©EÁÞ$r 0WíDŸÒzÃéëjrqdÇ/,]þ+{¨Eûn=¸¦A|MÚøþNŒÜu¼6r2Ž!Sy¦sرþ]°wǾ~o2¾K:ožŠÑ»‡¿_ÎŽL•ÛßÉ##{e7_¶{x"æÇ§08Ú†ûðZ>›>“Å[ÓpÚ"h~ËpFõkB93¸SW3ûÝY,Ý’ŠÃ@µöƒxjt;’&fÜê,ð ÀÇNÝû^âé.åõ‰ˆ\$êe;÷‘8‹*s}tàqC^&{šÔñeóö$MÀ“ŶívîþÕLùù“Y|¾¢ ö®ÂqÐÜÉü4ëköÔíǃk㟳ƒEÏã› #P/‡Ÿ|Íîè> ï_ŸPS>©I¹øš|‰¾õZ8ã”,} IDATÓ%¹SOãÍlAèªõÄç6¤Y°X¿ËLÌ€ÊØH‚¢lv¥TcÄ[#“ŸÏ`Ί*Œì]ëêÚ?*ƒ={Rñ€Aêž=$W#*H£—ûYUÙaiסXv¸k3¸YèñýÛ¿›ûñÓš½t.î4V­ñç¹7>¦ži7_¾8–W?¯Ã¤AÑø–]€+¹ã¦²©åcLùOS‚Ò×ðÁ‹“x«êDžl•Îgc§²¡Ùüþï6T4e³O&~&?šz‚î;uÙND.¯}ä•äO½öe8rqù`5T ¿`;†#—˜|©Óµ=5ü͘ýªÓ®[4®[H;á[wÊ6Ô¡gç:”ó1c ‹¡Ë5!Üx¼ä l)¬Kïn1„ÙL˜¬DÖ¨„ÿXcs¹ZG¤±~W.^ ׳ÇÖˆ‘%ÌìGÝŽ ³–Pv¨}´ÞgªkAÊaZ÷¡OûÊTn߇ÛÚr$µ@[ÞeîÄ‚7? ‡µå|Oîßåðæeã0“Í︉A,õùÇÀæ®ù™'Ü#îÜ·„sZpo¿æ„[ÍøF¶ãö[+°sÅ.2–òs^KîØ–H_&[Q15 ÒÃGDä2ÝGjäé™ìAØŠ2(p`+{€ñR˜ãÀd(~ÙìOh౪ù†âëJÇá=>îy 2È/ØÏ—ÓÞàèÇ 8 ²pùW'øbÞëm¦nëJ,[GvóF$¯Û‡Ó®Tð\€ÙN°ýØh‘Ù¯6×Þ3×5(ºWQe*cÁ7²­´ÝýíΪÌ!ØÝ©ä¸ °ß¿óÓó1¿l "2ô؈5$ÿÂ$ò='ôïì²sw0ù¡a”žoî|L5 (ÌI£0(†òX<]ÙáÉ^ê>_ò[| ÊÞóäLbËn'×VÂnÊo™ùEG«W”—‰ÓVû gÕ¿‚Bè7úfªŸpq'À·ð0¹nˆ8ÝÕ¯s¸÷øiLÔnCµï`Û_Ó¼wù2a¨€ô\7>˜€¢Ü#8Jê}¦º–²UíD'moÛ³*[•6Ô·NfùÆLÚ—½ç©0žŸ6Rý¶Úø›ÒÁ“KJ– J.B»³R(ð 'Àr|³EP.,‚G§Ž ¾ïñËvÆÅáŸw T;ÕVlÃÐg$"—Ï>òJò§ò›ü£¹®s$þ÷9Ë~O%ß]„#s/«æÍe“oz5 )®á$þ‡5$xñ`íŠxlõSá„Q$k¥V4õÝÎw?í"Óe€×E^êvÌÇR©%í»øþÇdº Œ¢êYWÉYÕE–vîâ݇'c{|2÷é›r"¢}äeéo÷ÝoÁ;ý ø‹¾Æo88°vùµÛS'@bºš]Š‚'÷  ©¬ÇTˆˆö‘ Oûàw¼9å{ÜM»Ñ0øÏ¯º‘·•'¼Ì'»«Ò£{mü”®ú³ª‹É¹ûCF?øÎ.ýi®ð$"ÚG^®þ~—íDDDDþBz¤žˆÎªDD´<y9yÑY•ˆˆö‘ O"þB?õS?õS?ý¼’¿m§Ëv"§àñxp¹\¸Ýn<DDäØívüüü®¸õÒÓENÁb±àççwEnô""òÇ貈ˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆüyœ»™1|Ä»Ô""WbxZ>en+À¸ÖÞ}€o'NbÑ!÷9ÏâØ9‡9;ê9W;ÃÉ¡U³xåñ! èÛ—¾ýîfØ¿þË[ó7“^ô'×ŧû÷§}¸å<ûÿ~fÀ3«rÛó×<Ç€á“à¾Àú8wòΰá s"rÅò¹j×Üë9¯—¹q?4¦C(@. «³ÕÿZnnª^tÕqshÑxÆÌÊ£ÓýðF›Ú”·98¿‘—üÈ–ÌFt­`ùóú±%„]:ëc¹*“k?ßLýÚ5 {íZr¬Tjs+··-âׯ¾cá|ìÕ;qû€nDù™J¦ÿ w“ZìM"· sÕNô¹¥5‘6`àJÙÀÂù+Øš\þ‘4îz+7´ŠÄ×]•aÃJ†oíTmÜ•»w=±¯å³é3Y¼5 §-‚æ· gT¿&”sï`Úè)ukIîúm$gå`©×Ǻž¾¦sš×Ý¥Y±[Hö6äá±=ùõß1?>…ÁÑ6Ü©«™ýî,–nIÅa  ZûA<5º+”ç û–1ã­Ù¬LÈ… (:õÅžQøyÓ‰ýd2ï/Ž#£È„­\47<9†Fó_cYFHÆÔyXîÅ U¬Å­ß²hG7>|õ‚L82’I·™ñädÏžT¼A`ºgÉÕÈ ²¨]e\‡b‰s×fHóÐÓ_÷v%0wÜT6µ|Œ)ÿiJPú>xqoUÈ“­×6&Öåµ C‰à_?õ43~iˋוÇ|ó®ß[›×^}€Ê6Àϯ¥ËuÆóÙØ©lhö0¯ÿ» MÙìß“‰ŸéW¶0Ž™/ý®{š÷_®»¾dü¸—ø¸ÚîµÌåƒ5‘ ›þ_Z…BAJIö ¢G=A÷“°Žy“ÁÑ6u¹âüõ7Œ›¨×µ Õü-XÃêÓ<Ìu:Ò´¢/fߊ4hJnb&Go¿0ûQ·cCÂ,€%”†jãÚ±…47¸R6²£¨>Ý;Ô Àb! F{zÄx‰Û˜\<¿ÙŸz›n5§9š˜}0¹2IMÉ ÀcÂV…* Rк}ÚW¦rû>ÜÖ&#©êAW!o~k9‚m%}È“ÌÂg1pà@Þ9ŒI[ qî[Â9-¸·_s­f|#Ûqû­عb>!´½¹VÀI³fÁ¤ÅÆ gŸ×D›[;QÙvr?v&,åç¼–Ü?°-‘¾&L¶¢bjtÚ-ÝMܤÁô¿ãî(ùwÿëÛnoÎ}+ˆu·æî›l±sw·-bíòܦÂ4öíK&·ÈŒd4Ñ!:™<ý ñÍ— {ÉžÝdÆÇÇ‚=È~4ÕY¬fŒ"O™éíÛí Í~å°¹Žàð‚בۯ>ÇV/0Ü×ÞB¼ø—Ì{æ¼h­Ü…~]—²üûø!*ÔkKt¦Nt+®¢ÊTÆ‚od#Z©ÿ\gþ!ØÝ©ä¸ °›ÀR‘îÿžL‡Â>ÿÏ뤻 <βsw0ù¡aXKòáÎÇT£§7ø¤¾hñ1ãuaÞì³Ìk  |À©CŠ'7 ÊÛÎ}PkðËŒixô•‚¯3æË’òòŽàŒ!Äzt !¤r έ¹˜kßΣý?aöGO3' ª¶¾{†ö¥y€úˆˆ(<]^<¤çº1ðÁåÁa+‡Ý f{9¬…éäAÉ5>òŽb+çwlˆíTNeï7ùQµÍÍÜÛæf<ù‡X÷åÇ|½´&cúD`«Ú‰Nê7W5[ÕÖÔ·NaÅæLÚw Ìߠ|}ƒ)Íõ– Ê…EðèÔÔ÷=¡çŽ3–NóšN?¯ÞA2\P휶n¶àò”:Zd~íèï–ÀpìyÉd¹KËs“•”‡ox>¦@ê^?‚ÿ^?‚¢ìx¾Ÿüo~Òˆ·‡û€ C}ED®Ð“è¿_•ìùa5‰^¼‰¬^¾ßú©`[d3ê[v²lM"^/Ö°<ÎL½æ•°žò¸áK ÕIz–óh~*JßÁ¶ý™8<fßí>˜M&õ9Öm‚šsg¿(vL‰÷—o'%׉ۙGZüvä{¾5{r­}5ÎÝ@šÓ¯“¬Äͬەƒ÷,åÿ±y{Ð)`ÍYGªÓÀpg±?n¹Þ [Wߨ®´¶ÆòéÂ8r=rw.äÓµZw«‰)i-«¶§Rà1°øhÅb6a2ûê[@rÚeòH‘‹ìï7òd ¡QC+Þ™@bމ°ݹ£[l¾5è9°; çÆë?bøEÒ¨û@zÕðÅtªgÖø”§Ù5Ñl[ð/̳Rý¦™ÂoóðUF!^³Ðšm¹åújê)R†•ª7=Ë«¡sùäë7xøíl<˜ ¨Ü€¶·ÿ›Û›ØÁZ›þÏÆüîL¿kØ©Ú.w¤åYË™7šÏŒÄóöúôDDDäO§?Ï""""¢ð$"""riü½.Û‰ˆˆˆüÅ4ò$"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""" O"""" O"""" O"""" O"""" O"""" O""""¢ð$"""¢ð$"""¢ð$"ç˹ƒiÃF1kŸûBff×{Ãùa<®?T‡ÝÌ>‚â]úô%‡ŠÎ&vòΰáWO˜ð©@ÇþýinQÇ…'‘«Ûï|þM<ŽËµz^ÆåPK ºt¦AˆÂ“ˆ\!ç„j‘ a£Þm=ÈŸÿ1?ÿãzFœ ܇×òÙô™,Þš†ÓAó[†3ª_¦½Æ²Œ,x~(?ûØ©{ßx0&ñØòžLÛ™÷þoô¿ù®Êc¼ÿl{‚\;yçá)ØŸ˜Ì ÚVû–1ã­Ù¬LÈ… (:õÅžQø¹v0môÜ]š‘»…doCÛ­L òvÌá¥×Ö5â9·ãøZÄËÔÉŸ³.ÕDx£^ô ôBèÙÖ©¹_=ζ÷ãÍg;bp°ã퇘èýS‡XùäቘŸÂàhîÔÕÌ~wK·¤â°P­ý žÝ•ËéÊoB9æ‰ÈeD»$‘ OÕ®çÎf‡˜÷å Oâq%0wÜT6ÕʔϾàÓ‰wúÓ$ÞZí É¨'èÎõ/Ì`æÌwyºK8!uZš´Ž}…àÉØÁvWöë9à„¢Ã[‰sצyeÆ1ó¥ÿã@«'xÎÞÓ†ƒ¿ÄÇ; ‹G™\GX¿·6¼úï½9’†öÒ\ä!ë·xîÕßhðÈX†œœ€ÂÌ|å rº¿ÈÇs>fÂ-~\“AÑY×)—Šº¿”­Ù% Qϲ Ъ{mìe—áŒç³±SÙPù^ÿt.s?™Âý¢ð3©üLu6Qx¹2¶ž`š÷¿™à_?ayêñ7:9÷-áÇœÜÛ¯9áV3¾‘í¸ýÖ ì\±‹‚SåS¡1Ö½ü–ä$ïFòô¡WH›RäìþÌÊ­©aç¾ĺ[s÷Í ¶X޹‰»Û±vyBñMÝ– ÚÜÚ‰Ê6`* NE^õ6ÏLÛGÇÿü—;rÃwîû Þ¶ ì¿ÙBhÓ>Üc;§urVlG׈½,Ù˜‰(صŒM>í¸.Ê÷øe$,åç¼–Ü?°-‘¾&L¶¢bjd>sù""—]¶ù#PåžÜÕz!Sçl¡U›c¯{²SÈÎÝÁ䇆a-Í0î|L5 pzCN.È·*-£ ™ýû!Z&¦P±] ZÅ-äÿâR¨»9™ò-£ 23ïŽÀB¬¥3Z ©ˆsk.Eƒ%€ò'Œ)yÒ‰ývAÝž¥g´i¤:‰'ïŽÀÆ„”îLvÂ+¡:ã:™*ÐöºHæ.ÛHæµíH\¶ßÏRÃp–YFn…A1”·bùg(_DDáIäJa  ñí·Rá‰Y,©rl”ÅA¹°:‚ú¾'ÌãÜ &0Ž»ÔçGÍÖ9²ì~qЬoU«“5ÿV¦Ø‰ùg8ÀŽ=/™,7Tóp“•”‡oxбùÄtäS‘^cî ÿÉŒŸû4Ïö«KÀ)”%°Ÿô?væzÀZ™.·6çðÛCé×÷.žYz/`­Ø”z¶ÚÍ©lSp]š—÷Bõ6Dù—”ëýOÝM¥5/3øŽ;¸Â"ïzŠA üN{9îhÈ ïÈȾd,æï=)@™üpÏã7âøt £óïï£v“c#ZgZ'sÍ{Ô$}ÛAÊwéH¥SkûF3à™‘4Ý÷ÜÙ~wý‹É‹÷×ål勈\.»}Ã0Îø(˜ØØXÚ´i£–A#O"""" O"""" O"""" O"""" O"""" O""""¢ð$"""¢ð$"""¢ð$"""rÐ9…ÌÌL5‚ˆÈEªð$¢]DD®fºl'"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""" O"""" O"""" O"""" O"""" O"""" O""""¢ð$"""¢ð$"""¢ð$"""¢ð$"rÙpîfÆð|ïR[ˆÈåž–OÇ‡Û 0ʼV¸ý#ÆMZBrÑê>À·'±èû²mhÇÎ9ÌÙéP“¿QØÉ;Æ+HˆˆüÕáéj“¹qóW%ë<¹$¬šÏ‚™j¹ô¼žãNR®ºå‹ˆ\">—_• \)X8[“ À?’Æ]oå†V‘ø9Ä-ù’EëÉñ˜°T¦í€þDý:‡ 9y0ó ¶ZlTí5„ 2Y0õ+<-êR°3Œ¼ÌÕ:sû?ÛPÑfo>»—}É÷÷“^èÁ§\MÚÜðOº× ÆìÚÏ7S¿†v È^»–„+•ÚÜÊím‹øõ«ïØp({õNÜ> Q~&вv°bÁÖïÍÄe %ºÃMü³s-B›õ¦ãŽ_Xº|7{ðÞ­½„ªç] <éÄ~2™÷Ç‘QdÂV.šž|ž»¢m8ö-cÆ[³Y™ AQtê?Š!=£ðsí`Ú詘nlÇ‘…‹Øša£VïQ<~£›ùS>`i|õûðø“hXܷ܇×òÙô™,Þš†ÓAó[†3ª_ÊxêãÜÁ´ÑSpwiFVì’½ yøÕ‘ÔN9M] 70vøg´xýnŒ°NâÞÍÔ€'™|O%~ŸöË2²àù¡üìc§î}/ñT—òxNW÷©–ÿ íǪxºuñOZÀóÿYFÌ3¯pW]?¼iËyé‰/äu†7ñ²iÖ>\±ä¼"¬á¸~ðCÜÙ: ‹ó<Û³¤œš»u9¹øÔý'ìM”ÝtÒG|Îm¸SW3ûÝY,Ý’ŠÃ@µöƒxjtW",ÆEí"r9D•³X»v­q1-›<Öø`k¾á-óZÁïc'.6’܆a8öß¾1ÎxwÅ>#¯¨ÈÈÛ÷ƒñî¸× Ù¸Àxcâ7F\N‘a£0ý q0·È0\‰Æ‚7& ºŽêÜg|ýòóÆ„Ï6nÃ0Ü©ÆÊ·'lÈ6<†až\i$æ®#ŒO&Œ5Þ˜>ÏXŸâ0<Ž$cå»ãi?¥E†a®$cÙÔñÆôÅ»Œ,·Çp¥o3¾™ôŠ1kkŽQ”»ÏX³`¶1룉ÆÄfŸÎ_m$äò÷çˆ{ÛöÀ4c]F‘aEF~òncwf‘al7Þ:Ðxâóßì¢"#{ûcÌÀ¡Æ;¿^Çvcê ÛŒ»žýÊØ™Sd8“–cïîo }d’±tQT°×øê‰;‡ç0܆aνƧÝi<2ó7ã°Ëc8’WodŒÿ%£¸W¡íÆÔ{o3Ž]brz Ãðž¹.ùëï~Ìø_jit;¦5FÎÜc¸ŠWÐx{èÆû»e¶«3ÔçTË/ëŒëâ6’=kÜ3ò}ã÷¬CÆwÏÞmŒ˜±ÍÈó†áÉ2~ÿqµŸî0<žcÿÒWŒAwO0Öäx‹×ù|Ú³´Ž/.3’Kö +Æ 2F~´Ûp†a8vï=0¼xÏ«íw3`Œž±ÆHvx ¯3ÓHؾ×Èñ­?ˆÈåã/¸lWDâ¼×7v,cKþ½öÅ~Jowr¥ldGQ}ºw¨A€ÅB@öôˆñ·1·Ù“+“Ô” <&ìaU¨h9ý¢,ü?{÷Eøü5³=»©$BH(!„ŽB¢ETPP•rTõúyzçyžåÎ~à×~6D¸]éMlHAñLè„’Bêfëï:†Pl¨ïçãáã3³Ÿ6ŸÙ}ïg&IV×,b­€5ŽæÍ#(ÛQv .ÓMZ‡Ö$GÚ1M Û÷ ³ˆMÅ[b¸ÉìMj„[\+:53£90hÝ.–Ší¥øÑjÖVgзgÑV[\½ºÇ°sÍNª‹¾ÆÝeƒÎO&ùüA\íaßžj¥öŸÃbǨÙ˶m»©˜D$¶ EŒ…ÚmKÈõwaØ€ÖDY,De]Á°œ+oÅ`FÑåºËhiÁž˜Í…MÀzΕôlâÂâjÂù=R’¿P»mÈÁˆ·™8ÏãÚ+X¿duÎ"K$ÙWö ÙnÆÉÛršNÚžãê?õ×ZIì;†á‰ðÏûà­²>Ü}CkÜ`FÓºçy4s`š.š\0ˆžm¬Ý}°§1žŽ÷pîÀ®$ZkCÎØï§°Ãwš}=úØ­ ù ò\nº>‡D‡a!=«)‘&ßÙ|‘_ôm; ÉýnåºL×á-Þÿå¥ü;äÝß•†Çz¤‰žx¾-5X’{1¸÷BÏ{•¥Å™ÃÅ—÷$Ãy¢O7;ö#ùÐb5 ùƒ—ܼìÊÇüÙ[Ä0Bx½&mŸÒ0D:¾Ö0±Z-8#‡³ØLÂe«K¨ª.`êø'9債ÐÈKd‹Î´|d’±àHlKgÍ»Ÿ{ókùÍ·˜øÚ}L.„Æ]ú1üÖkȬ܇דEŒíБ6b’=Ô®« @X"ˆs[%0ì6+qç–Õa%ì ‚û‹Ø_‘Ç3wÂv0‹„ýUiÕÔ†Àsü׋›î#_(‚õ¶åô/ÿúÛõúOýµà±$}i[^ûç šÜÖ ×¡ƒªØ4÷u^Ÿ³šíûfˆê*“®µ¯ÕÓÏCÇ78òƒÅÓgM!UAŽy ôtÆ>X±—šÈ,Øëè÷w4Däž ¬QDEGþ^j°þ·éŒÆVSLU$‘•ûj°G»0 ³0"{Áª]¬œú&Ó6åž+¾ñœÆÓ©=1õýýä ÃÈ$f ùã'Pq&qЃ;2†ÁcÐÄ~ÃEöŒ IDAT‚ÚÆ=è¡ùö3[zòÐò²;øÛewØ¿‰yÏ<È¿ßjË3}ãqVî¦Ì©V?e…•8â#Oû‚³D6$:®!¿w­§|‰ êi‹Q‹Í qð;Â[YKØ}lYáð)¶§6ïõŸN_ŸóÖ+_Ò¸[kŠÞyÃù±&þ‚<3ùkúým6ucñoáõ»âŒì"PAa‰p3à+)¤ÒÛrì{È錽%²!•;)ñçS<ºŠD~’κŸ¶³'v¤•e=‹>ÝNu(DõŽOYœo’Ù) £8/ JñØ7§Ó0Àpà±ÕR\V{Êù)ì÷°F“ëÄ$Då–•¬+ žQ›mIéàøŠ¹Ë6Pê CÈGåžÍ¬ßY¥ö3æ/\ÁÇ_í¡:ÆE¬Ç†Å4p¦÷¦‹-—·gçS R±~6o¯°Ð妨O³GÓ¾\à\ÎþßjöÖ†!TKÙöÏY¹¡œP¸†Ís&0eU 'š¹ŽúÚboDVƒbVÿ¯˜ à/ú˜w×V:üîà"ÖQÍî½G~µH½íùÆEvlûêïË~Výg<+›ÞÌïÇþŽ1ÖóÒ‹S„¯¿#žÆ #°¤ì‹¹|´÷Û¬ÄÔ°vÒ,ò*‚+òywâZ"²{j?ó±w4½˜îÕ¼6y%{jÄýeäo£"t’s ËHD+Oß G}¯ïÃì™ïðÄÒ®DÚö¹žKÒ„ ‹ølæ,¦•Ô2íÄ6Íaàe©Ø­a:voÁ—³žäÁ)6š\q'#Û$ð$w§oÆd¦‡;:‚ˆ†i¤GŸápØ’é=ì*Œ÷æóâ£ñbÓN‡>ÈÔûÙ Uoeñÿýÿ.ª"h:iÔ®£oÊÄá2qï0^zî1nžTIØ“N÷ïedkÆé>hähοŽÅ|ñ ~wã£Tc'¦qzÝ8šs ²ýƒwYÔº+;ÇQçÍ2WÖ‰Ûb8ésë|ñì¹cV,1ÚбM EGÍë^WvâãçoeðÓZÝö ¿¸¾öÏ{lûNØ—Ûiöék<ÿy+F=ÙV“¸_!ûwOóüYÜ{Á †wzœqw%:>ЍÔ,ÚÄÛÎüÄÙÒ½k5ïüv8ù%tþü~h ßfì-zÿh‚Ͽʯoø'>‹‡Ô®#¹7#ÈúÎ~…–ÈO’‡ë]¬ÉÍÍ%;;[#%"?}µyŒû1~šÓm9#ú%™"""" O""""ßݶ9 ZyQxQxQxQxù™ÒŸV©C0Äçóá÷û ƒ‘3àt:q¹\ O"¿‹—Ëõ³¼èEDäÛÑm;…'…'…'…'…'QxQxQxQxQxQx…'…'…'…§oðïdöÓÏ0g—ÿÇ-CDDD¤ÖºÂÅÏþKTïŽoLFÇnô:/ƒ+`‰¡MïÞÑQx+©ƒîad[Ao9_oû‚es'òÂŽÜq]G¢Mé;è̈ˆˆˆÂÓ!†ibš,±¤´îɵ à…óQaú7ÚÃìñS0®½“~I5ä/˜ÊœUÛ)ØÜÉä AŸ„BfŒ›†¿}3ª·RQ]Ù¸ƒv!Ñn[Y¨Š‹¦2oMÅ5A¬ÑMÉîw}2Ý”|ø"¯líÁ˜aíð> fŽcŠq c¤a?º_3ÆM#xNKª×o¥¤²3µ'×^•M#»QO=Q˜¾fŒ›çµfÿŠl-·‘”}%׿ødÚ\VïªÂ٤׽t×öÊòX2k«¶”â³ÅÒ¢ë\Õ³n=¥&""òË OßhDƒ,ÚÄ.ã«‚r‚Žl÷ïZÆœ¼8úß=œÌHoÉnŠíÓC`?ŠR¹ã–ÄQÊšI/3yI £/MÁv\ùöF¹zôÝaö­™ÎëÓg“z×2ÛžCìÇ«ØTцŽQ&xw°jƒIÖÐäcƒÓ!ýlÜÓ˜ÛnéO,{ùè•ÿ0ûË,Fž…YO=YV XFÞ†n¼ýÏ$Ö|Îä—§ðZA=ÝÅý1%|òÆkÌ^ÙžÛ/HÀâßͲ ÓÙÜr0w^ßœˆò<æ¼9… wpCÛHÍZ‘ÑÙ±Ža:‰røª|„ÙnÅ𕲧¨„ê 3.…ÏÁg¡L-»µ!ÎXbiÓµ9¾¼/Ø{ü3⦛´­IŽ´cš¶ïA;g›Š˜ÑYti¸—U*¦fû*6ÛÛrN¢­îvZbêûûÉ>†‘I.Ì@!óÇO â@¸›g“:o)_îp°uG.mÀ™üœ_ýõœ‹+wd ƒÇ ‰]“TDDälò£Ü¶ ‡B„BAü5eæ}È” K©hyÝ“½](ÎãË‚R¼Á0¦ÃÇiÅ4=^Ëæ¥ËÙ^"T½å‹7ãhÕŽ„ãý^Öhb˜„¨Ü²’ueÁ£òY:]šV²ü½EìŒ;—Ö±gö+NVÏé°%u¦ƒã+æ.Û@©/ !•{6³~g•f¬ˆˆÈìGXy °cÚ<4í@õž„T2rnàŽœD›ÀQy#ä-â³™³˜VRCÈ´Û4‡—¥bgXbhÛÆË’e{¹A\ë>\waÊ7ô¶%w§oÆd¦‡;:‚ˆ†i¤GÕmÃI“Î-áõµ4Ðê@Î$𜬞Ó+ŒÞîÂxo>/>:/6< étè3€LÍY‘•‡Ãõ››KvvöÙÕj_3ÆÍÄ}Ãh.Nüöù/Xü1/¾¼‰îc†ÓÞchVˆˆˆÈ é·…½ìX±’ªæç“áVp‘úYÉW®ã­O¥ÀÝ–+†7Ç¥ì$"""'ñÓ¼m'"""ò#Ñm;…'…'…'…'‘Ÿ)«†@䛂Á >Ÿ¿ßO0Ô€ˆˆœ§Ó‰ËåRxù%°X,¸\®ŸåE/""ߎnÛ‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<üì|ïiž™» ÿ푟+ë]áâgÿAÁE¿áWm#0n«ùê5žœŸÂÍcû’t&-òïàÝqS°\7†~)6UùÁlžú8¯,ý’EU¸ºý—Ýçá½aj¶-à•ç&ñÁÖ ˆnÁEÃîâ¦^ÉØ°wóþósW|EaU[|+.:šá$ã0ê®/\µž™ãŸcÊÊB¼®Ætrwôk†«ŽãO¿üZ6Oý÷‰ûS¹œ¿Œ|’¼ã^yá?xmt+MQx’o!$lZ04?{öøÖôv.y–·ßY“Çë¿Æ–äÿþžë§ðÏ'å¿MžäÆfvð•Q•ðûn£YC“½Ÿ¼É¿Æ?‚;íi®O¯ãK@¸’µ¯ü“)•ùÛëýh´k&ÿý1^O{†Ûú2rØé–²þxÎãwÞ!|hšïÿ”Ýó:q½Ò4DDáéÇÆW´šÙ3—°nw5D$Ò®÷•ô뜈#\Nþ‚©ÌYµò ÍLÎÐ!¤2™Õå•ðÆ“¬³Øi|É- íuì=ÉPMeÞšŠk‚X£›’Ýï*údFaÆ»k93¦.%¿Ô ºig:;Ãy¤Mõî÷0cÜ4[P™¿…’P:ƒnHãê<–ÌZÀª-¥øl±´èzWõl†›ºú1‚>I5uo×jÚY+µgR©å«\ ŽË.»>eMe&#¯êH‚Ë€ŽWrmæ\^Z°•Á·gâˆêÈu7v<||ƒ‹¯¥Ï{÷ò¿Õ„Ó£¿†ªó™·Ê¤Ç}—ÒÂcƒÌþÜxÞŸ¿‘‘m;à:îpãtËÇQoÀÀj;4C”üo!ùîn<ØÂ¥‰ " O?ªÚí,˜8Ÿ¯;ÝÈooi ;?äí o³ a —X–1'/Žþw'3ÒÀ[²›b»‹”+¯ãÜ'¿mgoÔ™«G!Ñfßšé¼>}6©w !ËRÀ‚IïS•3’?uMÄ¿e!o¼]N(ûP›N² °Ÿ »“5êrâm€7‹'LgsËÁÜy}s"Êó˜óæf$ÜÁ5ÑuõÃÄ¿«îíòSŒ£BŠa(Û²ÊP&ŽãNm°l#yûcÉL‰¨sÕ2P²…Â@Cº%Ú‡¤Vñøfo¥4Ø—¥þÖœ¬üÓÜÇʹ‰éy3iviùeù>™lŸòÿxè!:øßãÿ-8ü%×W´†¼@+útMÃm±àN;Ÿ‹³Bä¯Ùß´bøJÙSTBuÐÀ—BŠÇrŠ=u“Ö¡5É‘vLÓAÃö=hç,bSq_ÑZ6„²¸(;§i!²yz¦ a'Û ü2»µ'Þfþ¢Õ¬­Î oÏ ¢­&¶¸,zuaçšÔž¨ߦrÖ±%gÓ>"Ÿ)3¿ Äç£dÝLþûE|UÔ†‹YµÛx÷™·Ø×ýV®jZ÷€¯ \vãðåkwÛÁW/t’w åŸVvÚó ó ѧW Z­<}ï,$÷»•ë2,õ{7þ——><øáÝß•†Çz¤‰žx¾-5X’{1¸÷BÏ{•¥Å™ÃÅ—÷$Ãy*‹^våÎcþŠì­ b!¼^“60!ß~|®fÎ)†è8×ádòÖ¿ÿÀ瘓(ç‘-Áꪪ ˜:þIÇŸ`-4òBâ úq¢þEjõé§Èˆh˯îÆK/<Ëè™U¸šdsA×xvîÁuô)õídÁ罨H3ê|YÛåìµõí±üaÖ¾ƒÿ÷0¿ZqýcüM-°àëå¯ñϹ[© [ˆË¼áŽ kÜ™øúfæî§†IüùW“—ÙdÄx¿" ^¶ð.‹Zwe`ç8,†‡Ž·ü‘«Çç¾a¯QëjÌùCþÈÈ6‡Vq=>|ºåã?I€pyóVàï0–Q ö"òËd„ÃáúPÈÍÍ%;;[#%"""‚þ<‹ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ|_ôW=Eê ñù|øý~‚Á DDä 8N\.—“È/ÅbÁårý,/zùvtÛNDDDDáIDDDDáIDDDDáIDDDDáIDDDDáIDDDDžDDDDžDDDDžDDDDžDDDDžDDDDžDDDDDáIDDDDáIDDDDáIDDDDáéìãgç{OóÌÜ]øÏh¿ˆˆˆüœYè ?û .ú ¿jØÃâçžçÃÒC{4ÈÈæÒ½Èˆ[,-º^ÁU=›á¦œüS™³j;åA›;™œ¡#è“TS÷ö­¤‰ˆˆ(<@¸v/ëóK°Ä6"©­¨OW³¥ª í=Ôîâ³ ™×%c­ú‚Í$îžÃó³óøÚï&©]oö?—D{Ýk>öF¹zôÝaö­™ÎëÓg“zײ,,˜ô>U9#ùS×Dü[òÆÛ儲¾°ö$ûûÙ°;‰Q£.'Þøw³xÂt6·Ì×7'¢<9oNaFÂ\½Œ9yqô¿{8™‘Þ’ÝÛMü»êÞ."""g—³àÓ9Àö©OñÈÃÿàï¾È2{.ï×’¨ØÖtŠÙÍêM•„ïÎÏØdÉ¢S¢pm%¾@)_$pÙ÷qßÝW’¶k.ï,Ú‰¯Î^ºIëКäH;¦é aû´s±©8€¯h-BY\”‚Ó´Ù¼=ÓŽ¬öœlÿò#ÈìÖžx›ø‹V³¶:ƒ¾=3ˆ¶šØâ²èÕ=†kvRkZ1|¥ì)*¡:hàŒK!Åcm‘³ÊY°òd!¹ß(†fE`µGà´›ŸŠ¡Õ9q,[½‘Êö­Ù³z3ö6ÃhdÃæÄŠ½»Ò,Ê´ {dV½¿Ò@*ŽïUØË®ÜyÌ_±‘½UA #„×kÒ&&äÛÏÕŒÃ9Űç:œ*CÞú÷ON¢œG¶«K¨ª.`êø'9‚µÐÈ ‰½Ü{!‹ç½ÊÒbHÈÌáâË{’‘|‚í‘Z}Qx:†ÕåÁã‰8î!k“èÌsˆ_òë÷¸Ø´ÕIÛ ìN¤‘ËÄwŠOeö|ÄÔ÷÷“3| #“\˜BæŸ@`:£±ûÊñ†à@Ò PSQK(îP.ªÿQÝ8]1¸#cùh7î–™ÄÖÃ~/k4 ±NLBTnYɺ² ¶ÄŽ´$ŸoŠ×ñÉ–ZÂ_{²ýu±%u¦ƒã+æ.Û@©/ !•{6³~g¾â<¾,(Å c:ÜxœVLà p‚í"""rv±žÕ­3#É87‰÷¦o£ÁEmipø˜Æ ¥ïìéLzb)5FI.ㆋR°×f’»Ó7c2ÓÇÃADÃ4Ò£tÝp¤ÑwpÓg¼È¸÷=D¸“hÒÌÃþƒ¯=ÙþºÓS2½‡]…ñÞ|^|t"^lxÒéÐgiFŸÍœÅ´’B¦Ø¦9 ¼,kù²:·‹ˆˆÈÙŇÃõ-¢››Kvv¶FJDDDýy…'…'…'…'…'QxQxù¾X5"ß ñù|øý~‚Á DDä 8N\.—“È/ÅbÁårý,/zùvtÛNDDDDáIDDDDáIDDDDáIDDDDáIDDDDáIDDDDžDDDDžDDDDžDDDDžDDDDžDDDDžDDDDDáIDDDDáIDDDDáIDDDDáID€Ú¼|û¼ºÉwì¿ë}MãGaÂ6ÿÙÖ6¼t;£ÿ³ ßí9»YðÃ>öýï~´–ÍE• ‘ñÉ´èØÞç5'Ê¢“"¿ô«2nC†@üwx1Ԯ煱Ocûÿ¹¹…]c,"òÓ Oö­x›yié5Ü‘•L”ÕGYáF>_µ–ÍMésÜbX(HØ´`è\É/…%†Ö½zj¾z?‘ŸZx WobÑÒBR¯KÿQïÚIhÚ‰>M;8ÈWÀŒqÓtlAeþJBé ºmÉ%«™=s ëvWCD"íz_I¿Î‰8j7ðÖ3KȸmçÅš€í³Æ3Ý9”;û&a=Xž¿}3ª·RQ]Ù¸ƒv!Ñn@¨œüS™³j;åA›;™œ¡#è“bÓìïœÏr&¾8…_ìÁkq“zþHîÛ›†GT»‘—ï~ ówÏrs û©½†0•y“yäñOI¿ã¯ÜÜ%Ž#ëV5¬ÿ8‹JÊà[ùÀê¤å¯áÞ^qø¶-âåç&òáÖ ˆL§Ç1ÜÒ7×ñé"´Ÿ5žå?K¾bwe[|[.»ù.n臅0Õ›ÞeÜ3“X¹Ç ¾í%ôõ„ öHÛêßœÚ<ƇÑÿ<ö͞ú;Í.Ãïúû™ùì«,ÜTŽ»Õ ~÷§¡´ñ@ï‰úáËcüØgñ÷êHYîìµáîÝIËŠ¼óo0Ý^jí é4ðvÆ nO´d‘³-<ù÷­g{ ™~-"ëØ*°Ÿ »“5êrâm@ívÞ›8Ÿ¯;ÝÈooi ;?äí o³ a —'žBÅýl(JåŽ[G)k&½Ìä%)Œ¾4v-cN^ýïNf¤·d7Åv½ƒÊ÷ vï<4ŽÕïæ‰?fÓÈØOÁæÒo•Ó}M8HÙgoñ÷qùœó›‡¸¾Ýñ×—‹Žc~OŸõÇݶ«ÉãG^gÇE÷ñÊc™°a*ÿãÞL}–Q­]ßXq¤õåž§þHÓ˜;—Œãq/‘ùÜɱæñÆ?ÿKyÿ¿ó怦Ô~ñ&<\Bà2ŽÔSßþ:ß,öòéêHþòäÛÜ[ù>ÿúãÓÜÿU×Þóï$1ë¿ðò¼ xâšÆXkòOÜæ€o«¶4çñÝF²ðmeâ?ƱöÜßòìŸ;Yü)¯þýižküê«AEä¤~Ð÷‰°·ŸÕC„íàÛr°˜OÿóO~øa~ø)¦l©=ت2»µ'Þf¾¢5äZѧkn‹wÚù\œ"ÍnNéQYÓEËnmˆ³–XÚtmŽ/ï öúÓŠá+eOQ ÕAg\ )=x%ßCvÚº*Ïå¦ësHtöÒ³ši~‹×„|ýñóÜ?~Ýþü7nhyÊuí¶%äú»0l@k¢,¢²®`XN€‹·~óAn3šÖ=Ï£yœÓtÑä‚AôðlcínµÛ–²:”Ãõ—¶ ´Ûa×fÙª§þýu_³Qt¹î2ZFZ°'fsa°žs%=›¸°¸šp~†”äïÁw*ý°D’}e’íÞOj·-àýòs1¸ñ6Gây\{eë—l ZÓTDζ•'É=PJµ? v,±œ3äNÚÔîfé«ÿ¥<>øÆé$Êyä# äÝß•†Çz¤Ùžx¾-5„8… c:‰rZŽÊRÑØ}ûð†À–Ü‹Á½²xÞ«,-†„Ì.¾¼'‘úþ)§gß‚?pûK[üOú-<ÿÏKI8jz+öR™EƒÓx^û¤¯ “ûîÇD^øú¶ˆ8­gy‚•ûðz²ˆ9|‡ÚFL²‡ÚuÇ1ß|ªØ4÷u^Ÿ³šíûfˆê*“®µa‚Þ}x=íˆ9t}Nâ“<‡¯Ìõœx,ĹaX°Û¬DÄE †V‡•°/@ø¤ýˆ‹›î#µ÷±¿"gîÅ¡ïqaFZ5µ!ð¾ôCì[ð§cÎé”'.ÕD‘6<Ù2IµNcÍæJZ·ÄÄÄáÁnsc7{Û7ŽÎ>ÑØjŠ© ÀwÜ•ûj°G»0V#D0>ô.¯ÆOØyô§D5Å~ÂX1€@Å>¼öhœ&`¸hœ=.\M­ IDAT€ÙVíbåÔ7™¾°)”®Ù!§%¾ï¿˜Ò·ž<وʔø õ¯¼“¾ÆÚˆKþpUÿyЇÿß}üepKÜ'JP„ÃG•í‰ÇY¹›2ÿ¡²ý”Vâˆüƃ¿`ÏLþš~ǃMÝXü[xýî‡(,ž8½ÅT½£¨(­!”x¨žú÷[§ÔãØ1ŽkÈoÆÝA+G½ßºNzNEä—é]^1"ZЧg#¶Ïz›9ŸPRí#௡´°€½ÞбïpG±'v¤•e=‹>ÝNu(DõŽOYœo’Ù) ›5–&QålØVA”|ÉòM5„)¡–ÍK—³½:D¨z;ËoÆÑª 6çñeA)Þ`ÓáÆã´búYùî9š^L÷j^›¼’=µaÂþ2 ò·Qúv¯±68ÛEò’‡ydê&jÂu]é.bÕìÞ[}øÚp¤÷¦‹-—·gçS R±~6o¯°Ð妿ÐòUâwÄÓ¸a‚”}1—ö\Ÿé½97œËœµe„á¼ûÅ‘kðdû¿õ¸žF?Œi_.p.ç?ÿo5{kê¥lûç¬ÜPNHÓTDζ•'°’pþ0FE.cáGÿå¹YU1q5H£U¯!ôjf§Îw/G}¯ïÃì™ïðÄÒ®DÚö¹žKÒ†sûŸÏ–i/ñì'‘xbÓhžî¡ä˜¯¦1´mãeÉ ²½Ü ®u®»0;àóñÙÌYL+©!dÚ‰mšÃÀËR53ä{HO-zÿh‚Ͽʯoø'>‹‡Ô®#¹7#ÈoùK|7Fÿ=ȸûâQëÜ;°Ù±•Û’éue'>~þV?í ÕmÏð÷‹³qï0^zî1nžTIØ“N÷ïed]‹7ÄðN3îî±DÇG•šE›ø÷É Wk†ÿ®?ãÆÿ1“cˆŠiJVûöúÒt’ýßš«ž~Ôõ[8Íò×±˜/¾Áïn|”jìÄ4nC¯Gs®f©ˆœÊbP8®÷ `nn.ÙÙÙ?Ýú ˜1n&îFsq¢Ug\DDD¾=-"""¢ð$"""òýøùß¶ùiåIDDDDáIDDDDáIDDDDáIDDDDáIDDDDáIDDDDô+·EêPZZªAùÄÆÆ*<‰èb‘_2ݶQxQxQxQxQx…'…'…'…'…'…'QxQxQxQx:kùw2ûég˜³Ë¶5Œï=Í3swáÿ>ÛyÖö_DDäÇeýÁk ûØ÷¿e,øp-›÷TÄFtj]zöáüQX¾³ÿ¼;n –ëÆÐ/Åvú¯·ÄЦwoŒhËÙ}Oµßv<ä”L} ÓJÛ3ö¹ûéwà»IÕ§eÔÄüë©«I±jŒDDžNK€}+ÞæÅ…5´ïw-wf%á1ªØ³é3–¾ªfí‰:z-,$lZ0~Œ‘1=¤wìpöŸÁŸJ;QþǤ›È¹©%N †ˆˆÂÓ·®ÞÌ¢¥…¤^1–þ£Þ3´“Úî"RÛ…ÁWÀŒqÓtlAeþJBé ºm «óX2k«¶”â³ÅÒ¢ë\Õ³nªØ¸h*óÖP\ÄÝ”ì~WÑ'ÓÁ–“Y]^ o<É:‹Æ—ÜÂÐŽQ„ÊNPÖñ70ý;™=~ ƵwÒ/¡ã¦Ãy­Ù¿b[Ëm$e_ɵ9>™6—Õ»ªp6éÁµC/$ÝeìÇiNØ®0Þ]Ë™1u)ù¥ÑM;ÓÙ†È:Ú™äûîÆãð@Ù÷á˼²µc†µÃcø(˜9Ž)Æ5üv@š®¢cØÉ¼úbªf¾É—?H߆ǯ†ñn[ÄËÏMäí™N!c¸¥o:.C£'"¢ðt|Ù—Ïö@2—eDÖñ°ÕÁOŽÀ~6ìNbԨˉ·þÝ,ž0Í-sçõ͉(ÏcΛS˜‘pC[›ØuæêÑCHt‡Ù·f:¯OŸMê]CȺò:ÎÝqÜm*ÿn–ž¨¬¶‘õ?,#oC7Þþgk>gòËSx­ ‹žƒîâþ˜>yã5f¯lÏí$¸õx:Çûw³ìDíÊ(fÁ¤÷©ÊÉŸº&âß²7Þ.'”}‚îïj<2•h!®í9Ä~¼ŠMmèe‚w«6˜d MÖT×9H½Œ+;ÞËËSóèq{ÛcwÖäóÆ#¯³ã¢ûxå±LØ0•‡ÿño¦>Ëm­]<‘Ÿ€ôñ°·ŸÕƒÛVÏWl3‚Ìn퉷€¿h5k«3èÛ3ƒh«‰-.‹^Ýcعf'µ¦›´­IŽ´cš¶ïA;g›Šu‡·úÊ:Yã 7™½³I°`‹kE§†`ft£C#¦£­ÛÅR±½ÿ__»*ŠÖ²!”ÅEÙ)8M ‘Í{Ð3íÏ,}OãaFgÑ¥á^Vm¨ D˜ší«ØloË9‰zvªîóE§!ˆúä-ï9vìk·-!×ß…aZe±•uÃr¬X¼Uã&"¢•§:ò‡3{ „jì'P¦“(ç‘L¬.¡ªº€©ãŸ<ò0y°yñ½”¬šÇüÙ[Ä0Bx½&máºê++®ú¢¤é òP» «Õ‚3Òy8}Zl&á@ðŒŽ¯¯]¾šýø\ÍðÚa؉ŽsÕzÃ^vå~WãyLhÙ%‰EËóÙß©-»Wn#¢Coôðó‰/¬ä¾ÜØe6ã&Aç£V ƒ•ûðz²ˆ9œ;mÄ${¨]W¡AQxú&[|+šX§ðÙ¦ Zwˆ:.õT®²¸bpGÆ0xìšØ-/P´ˆ×ßßOÎð1ŒLra ™?~'(¶¾²~LõµËWP€ÝWŽ7N€šŠZBqß,'°ç#¦~WãáßytìÅÝ<›ÔyKùr‡ƒ­;¢èti,º~êù¦à¦ÝµW’ðû ,HqsO<ÎÊÝ”ù!Õ à§¬°G|¤ÆLDä'â½mgD4§Oïdv¼;‘¹k¶SZãÇ_SÆÎuKøÓÖQª#p%u¦ƒã+æ.Û@©/ !•{6³~gA¿—€5š„X'&!*·¬d]ÙÁÕÃÇVKqYíá¼P_Y¡ñ$Ô×.KbGZ’ÏŠM•„€@ñ:>ÙRK]kIáïq< W:]šV²ü½EìŒ;—Ö±ŠN' Å.âÆ®•Ìž¶ñðmPGzoºØry{v>Á ëgóö ].lªù‰°þÐÕÅçÜÀ(÷û,üpãfV²DÐ 5‹ì^]p›%u$‹dz» ã½ù¼øèD¼Øð$¤Ó¡Ï2šw§oÆd¦‡;:‚ˆ†i¤Gì’µ»·àËYOòàM®¸“‘çÖSÖyêë£#¾ƒs˜>ãEƽï!ÂD“fö×YÌ÷8†“&[Âëki4 Ñúõª§ðmÁEÖÕ×±ô%òmse1âÞa¼ôÜcÜ<©’°'î7ÞËH=,."òÓy{‡ÃáúÈÍÍ%;;[#%‹?æÅ—7Ñ}ÌpÚ{ôsõ""òˤõ95a/;V¬¤ªùùd¸œDDä—K?/%'ÏM•ëxëßS)p·åŠáÍõËEDDáI¤>†§ÃÿÜN!""‚nÛ‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆülé§íDê ñù|øý~‚Á DDä 8N\®Ÿß_PPx©ƒÅbÁårý,/zùvtÛNDDDDáIDDDDáIDDDDáIDDDDáIDDDDáIDDDDžDDDDžDDDDžDDDDžDDDDžDDDDžDDDDDáIDDDDáIDDDDáIDDDDáéü;™ýô3ÌÙå?³×û ˜ñä¿YXøŽË÷³ó½§yfî.Í‘_0ë]áâgÿƇ¥GªwÇ7&£c7z—AŒ°ÄЦwoŒh‹ÎŽüäL} ÓJÛ3ö¹ûéwà»IÕ§eÔÄüë©«I±jŒDDžÎ ÊÔA÷0²­‹ ·œ¯·}Á²¹yaÇ@#Ѧ‡ôŽtfä'ìLš±‰œ›ZâÔ`ˆˆ(<} ÓÄ4-X"bIiÝ“kÀ /,æ£Â6ôo´‡Ùã§`\{'ý’jÈ_0•9«¶S4°¹“É:‚>I>6.šÊ¼5×±F7%»ßUôÉŒ:x2D寅¼6ñ3¶W4h݇kv!Ñn|£-²<–ÌZÀª-¥øl±´èzWõl†Û ãݵœS—’_jÝ´3aˆÔ¤‘úØÉ¼úbªf¾É—?H߆ǯ †ñn[ÄËÏMäí™N!c¸¥o:.C£'"¢ðtªhE›Øe|UPN°Ñ‘íþ]˘“Gÿ»‡“ià-ÙM±ý@<²7êÌÕ£‡è³oÍt^Ÿ>›Ô»†e‚e|ù•“á·ßKª±“ÞšÀ¤%)Üyi ¶£+öïfÙ„éln9˜;¯oNDysޜŒ„;šQÌ‚IïS•3’?uMÄ¿e!o¼]N([“FNŸR/ãÊŽ÷òòÔ^y,6Låá<›©Ïr[k—ODä'àìx`Ütå4ðUù³ÝŠá+eOQ ÕAg\ ) ˜nÒ:´&9ÒŽi:hؾíœEl*>ø¸á £÷ù¤E˜˜®&œwa |y_°÷¸gÄýE«Y[AßžD[MlqYôêÃÎ5;©(ZˆPe§à4-D6ïAÏ4›fŒœÂ|Ž¢ÓD}ò‹÷ûƒ µÛ–ëï°­‰²XˆÊº‚a9V,Þªqù‰8;_ y)÷†±»íÔÞlKîÅàÞ Y<ïU–CBf_Þ“ ]¹ó˜¿b#{«‚F¯×¤Mà`ô2#ˆõéšÕ‹ÃWŒ7tl\ V—PU]ÀÔñOrøæJ°yñÕìÇçj†çÐÃNtœK¿ÛANíÂJîË]f3nòt>jµ2X¹¯'‹˜Ã9ÜFL²‡Úu4…§S(Éç«R7éiQXŽ O.g`Dö‚U»X9õM¦/lʘ®›˜úþ~r†ad’ 3PÈüñ8üñª¦´*p¸{ÊRjíÑ8K>W îÈ@û±û|Ø}å— @ME-¡8M9†›v×^IÂï'° ÅqdÎyâqVî¦Ì©V?e…•8âõ0ˆÈOŲ……‚økÊ(Ìû)–RÑò"º'{[,PœÇ—¥xƒaL‡ÓŠi„ý^Öhb˜„¨Ü²’ueÁ£*¨eÓÒOÙ^"T³ƒK6aoÕŽ„ãîºÙ’:ÓÁñs—m Ô†Ê=›Y¿³ KbGZ’ÏŠM•„€@ñ:>ÙR{ìmE‘zX]Ä]+™=m#µ·9Ò{ÓÅ–ËÛ³ó©©X?›·WXèraS ˜ˆÈOİò`Ç´'xhÚê= ©däÜÀ9-ˆ6£2PÈ[Äg3g1­¤†i'¶i/KÅMߌÉL?wt ÓH>ª+–Ú´ªfñ ²½Ü ®õE\wa öã›bK¦÷°«0ޛϋNÄ‹ OB:ú ÑFßÁ9LŸñ"ãÞ÷áN¢I3û5gäT.²®¾†Œ¥/‘h›+‹÷ã¥çãæI•„=ét¿ñ^Fêaq‘ŸÎÛ{8®w1%77—ìlýˆ™ˆˆˆèoÛ‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆÈ÷Ū!ù¦`0ˆÏçÃï÷ 5 ""gÀétârýüþ‚‚“H, .—ëgyÑ‹ˆÈ·£Ûv"""" O"""" O"""" O"""" O"""" O""""¢ð$"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""" O"""" O"""" O"""" O"""" O"""" O""""¢ð$"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""" O"""" O"""" O"""" OòT½š‡®½†k®ù5³Š‚ùE±ž=M P²n.“§.$7¯Š 3.6Ý®`ÄО$Û¿mñ»˜ú›»y§Ðƹ÷ý‡{;¹töÏtÌ,nR2šPâoB¬MÃ$"" O?Jp*Zü8|~5Uîdš'Û©*ÚÁêwçqþÀ H¶¿¸“[¬?Êò`8 |¢ŽVÜôðSºzDDäɇÃáúÈÍÍ%;;û´ Ýž»€/öÔ~ãÃ×°ÇÓ¶ûy¤» Bá²OxdôS¬ñAt÷_óèÝhhÂ>¾Þ°`zV-áÞQϳ™ Ƽò½b|ä?;÷/® ®ßcŒ¿©öÀ^>ys<ÅÞZÀê&!ý<†ýº/›ø#³öÛžä!ÏðÔ5) ?æW'³äóÝTcÙä\.¹þf®éµz% ÿ'ÿ#‰~7´eÃÌ…lª‰§Óu÷ð«ækyù¹é¬+±’Üm$¼óbRêZ!«^ÍC#åóPC.”Ŷ…°¥ÂNRÎî¾órZDG“Ä%CZ³yöb6Y/á‘ñ·V\_ûN¡lÂÔ~ÂäÿLfñç…T…-ĵìÅà[GÒ§© £ÎºÏ§‡¹œ‹ë³~{xtä£|Jeøø'hÖ_þ‰ÎËïGѵEW¡ˆˆü¤|/+Oó_y‰ù%uí‰âÂ&ç0:ËqÌÖš-ËøÒДk®?ï@p:¶HÈl @¨êpãDkP5ÿ{ƒçæ|EmBú÷LÇ^µ›õÿÛÍ^¯‡¬ÞÝY7ã#¶ú!¦coº$8IÈð`T|Æ ÷=ÇàJïLטBr×®dÊcxyŠ‘•¾›9“‚´lÞsÃ^ÖL¼Ÿ/ 'I™iD—l¡ðãWx¥sþÚ#†¯‘íeÉû)ôë{ÑKç°fÅ<ênʸ;ÚÁ‘zæOª¤Ù99tv&`«:Õö¸lWå^ºÿi–•CÃs/墘m,^¼˜ÿZNÄ¿O7Gu;’h‘ܳ¾9f&{Ž ¿õ—Îöœ—š°®@Qxñ×Qì»ï%VW½ÕE‡›þÆÍ­ß8Þ»?~{/À⎥aã4or1×܇ÃR³ýãØZh£yÿ›¸­“ SöáL>ªb/å/ßBK{%«ž¸ÇVìeÑ»ë¹îŽC¥Û9÷7ñ§Nûxcìx¯¢úÞÏc·¦±þÉ[yh¹—ë¿Æß#†?žIï{~ËM­x;ÔpÇ_—²ù6ßÔ–v‡±ÐêöÇy°O<”}øÀ)¶ïDe·!uí >(`ìmW’b© ¥ð×<Ÿ·’+öqÞuÕ vá]~ü˜ÕÇD'öŸ¤üv ê9/""" O`oÜ—ß> OP.:Üô0¸¬I˜Îèhl€ß·¢Š ¸NíVN8tìÿG´Êu ˜øù^{fÁ1øÕ¿§R]%©Ü[vàöb| ì€á$±i¬(Ä»¯oØ}ðØxZ6ŽÀ°8‰9˜!Û¦àÄÄé¼üAê_K‰&9æÀ²š-&™h ¢¦˜ý¾ðQg¢²b„—Sj_äIÊ{¨Œ½³øË¨YÇ´¨t{êªûTÕÆ”oïYÏyIµë*…§Ãêƒq¿KðÒßq÷%MN¸Òàjvmí«YãÛÊ”I¹t}>ñV ì§xãüi­idZ~¨{Ùï Ad;wT»&ålÎUy™+*ö°cÇ6ÖN{މk×0sÁv.aX) …¬´xÆ`PH¸x _ûzk÷²g[éP‹Óð>Öf1àðM9«õtŸ×ÙǦÂjÂɪ 7±ÀÕ€h»!Ž«çTÛ8IÙÖ#eÄ÷áÎ[sˆ9üzóÿ·wßáQT‹Ç¿»›ÝMï„‚”„^C ¥)¢‚X* (ô‚ØÀ‹þ®D®° ^@T,\; C)¡H(B ôM²ý÷GB@Hx?ÏÃóhf朳gÎ̾sf2 ¯‰…Ôrê.ùŒ'÷Ù‰LU–oõõ¯p¿ô¯£PDDžÊTÍ«ydêÕU®gmÏð;Z1æõ äüð#ÖÅãKaÆ>äÔa䛈ö¥Al?²‡_}ý©|·óåmJfÜœ|âצZ€‹}‹JÂYˆ/F“?Õ‚ °ßŦyÉÌ\]ƒÆ½ÒµÕ t ÜÂʬ%<û¯LZ‡¤“²¾¨Æ•½à˦³Ø#ÅüüÒ<׺™k~¡Nºš8+PTnÏReû¶TQ¶¿–7pyÐV^Æ'ßYèPÛBaæï¤nÜÃeN¡eµŠrQù}Ö-ô„6VQ~ƒJö‹ˆˆÈ…æoò’L¢¯þ'Sÿ5”nMjPx€ÛwqÄC›ë¯¥¾¿,u¹yÄ 4 ‚üMß³¾¨7%øÿ±”ÐzÔ2î#å«OX´è3~>F|—áŒîUC­ÝB“Pν),ýæKÖdº0µáþçFѳy4ìZÍÊõû±Ä¶¡ÏØgÚȳûXN ½µÄ¾m#Üf¢Û eܰføWRÉ©·¯â² Ám¸ï¹éÝ*šœÕKX´ð¾^½Ÿ†hUÉ‹š*賓V«¢üÊö‹ˆˆÈ…朼ª@NPö*€£¿Úoº0Ê‘“èϳˆˆˆˆ(<‰ˆˆˆœºm'"""r4ó$"""¢ð$"""¢ð$"""¢ð$"""r!9'oOIIQÏŠˆˆÈát1ÎçïБ …nÛ‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ\¤ÎÉoÛp¨cåï)Æ¢±*"òw<_H4ó$"""¢ð$"""rnø¨ DNægËV'ˆˆœEa O"—а°0u‚ˆÈŸ}q^ˆê¶ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆ(<‰ˆˆˆüÃÓŠéSYyÀyÞêsYÃ7¯N`ÖÄçùxuís¹ÂS½ÎݨbªzEç>þ—<åO-?}ÏázC¸ýŸOps»pMµÉùcßÁ¬÷ñÖÎ?ùׇí[™~ÏHæívžÛzN§N‘KØyÃxL‹–ç§"¯ÑMqŽ¿f¡˜ ÚÙr–yíìÿq!ó>^ΆÝ98 ~„׌£e·›Ø«%>Õ¸|à@ˆ4ã£ø¸zìÛxmÔÌc_ax|éŸ,wîá½ÑðQÆ Û5Í[Ïw"ÄQÎ6«Z~û¼¶m,ž>ƒE«PìKÇp_Ïzøw¬»~ƸgörÇÔáX>{…7—mbÇA~—?ͬ‡šá«Q,"BxZ1}*†>ÿàòÈ,í#<­P¼#¼‚B ±]¸ºw"áû>û€­ùðÞKì4Y¨~Õ]ôhŒ7w+«?ÿš­»³qšÃ¨Õ¾7]¯¨‡ŸkË_ûw‹x ·ï"Ï]Ú!ٶ׎{ÿ æ~_–ƒn!ü×Åü´q¹EnLÁuizÍÍ$ÖÆ¸s¶²äRwgã4úÞøz\ߊ`¸+ª—Àê÷?f_½>ÜÒ·AYéùX %õ®« Þ«‚¿gå¶p®¸ÿ6jpd§“cÑÍÁ‹~Ò)óæÿFÃÉÜÓåèí`_b›wcHón¥Af³F¿ŒñÑi 7cÛ¾˜äi X“i¤Z³\°‚oÃÆ2õÎx,ž\ÖÏ›ÆÛK·^àÂÙŒë†?Ààvá˜Jƒ@öºwxrÂwlÍ6Óa0Ý-u| ÇÕómOæÛ¬xên~ðñ¥ÁwyIsŒ>Ìfó !¦ˆ ÓËÙ¦CIy›òܤOÙ Õ‡2vôuÔ¶–”àÌü™÷gÎá«_3°[¢H¸q#ûµ Ĺ•飦áìÚŠœ”¤{š2úÙ+Y6f®+Û¿fé9y˜öãѪ*¯>i嵯]_®1Òé‰k‰4CÃ^ IZÂä¯v0¬YKüJv©+3¨}M~X©Õ¥µ°³%Å.a9sí·¼1ºíìø„[ןüý9¸+XÝuh-ÛŠê“tE}}Œø„5¦M‡P2~ù'€ÁŸÚZj6@y×¹Æj4oBµ@ F£•ðfˆ·ä÷,®ƒkÙYÜ€]l1`0qY |UÔkôÁàÌ&ëPÅn–°šD˜4².rŽý)¤:ã¸*!ì”"oÑæNþÂkŸcîü9¼p³‘)Yø·ÖîÁƒ/ÏaÁ‚w˜ÔןeÉo°&ß[záÁÊUþ |i.óÿó\~p/Îÿ턉&?ZC÷ðH®{fsæ¼Î]#ªh_%Û83Xù“™>G0y IDATßჷþIëÝïòÆŠÒ_ºp¤±ð¹d6Ô½›iï/àÝ—‡öýfü”]ºü0kvÅqï‹3xã•ûiê[ò³õ{pïÄiÌ|uÌ3u09w1{ô³d—¥¯|æ8 tžÈ™sB¿HL¼À8záõžt@a Ž "2¨üë‹r·©$WEÅÃÉ÷ÑÈzÂBûÖ*/dN¯¼m'µÏ'¼1>ß’zÈA§+ààPj&–Zu 3Τl¶ÐúÚjè&ºˆœõ è¿o¬‹ A‡xò—¼Ä¬ øïú\<æÚº™Z™_ñÑKÏðƤÉ|´x‹NíÕ—>5® )þË^OæÃÙo³l›?5‚Kó£¹&íÞHì¡%,šü ³^šÁÒuqxJêõ$õó7˜;éfý{&«í­éÒ­–FÖEΔÀà~uØ:so~·…ƒùvœö2vnaŸÍsRr°ÔéB«˜ÿME^7¹›ÿË¢Íö²Üãqà´Få 79¿`EÆqODy‹ØðÁç¤æ»ñض³äýõø&v¢Ö‰3¡F?¬…¤gž”©<.N§óØ?—§dJ¶©ˆµn:ûþÄÛ ×’a÷‚ÇNÎÞ_X½=ïŒ^D[iyåµÏ¿×¶uñÃûß²»Èmç—¼·Ê‡¤kêã ¸2Ö±ÞÓœÄÇnJzÝNœNN<¥}àöj0‹ÈßæéŠ‘–þWmº>ðÀšÞy$CŽ]‹ܲ/ZöýcÁ i7 !íN*9è„òƒ?õ†Ž£^Y‘¡Äõ¼—¸?¬tõ±ÚÑaH3:”—2+¬·½î릑tÉ1Ûû_¼¶w>~‰Ñ¯æâÆH@LÚ÷Œþ-|9>Eü›1lÌͼ2íq†Î5Ùôjº· g™Ñˆ°Äõá¶„É$EHd0ÁµÓ4ò¸§‘ÌQtLÌçÝGn#5 jt̘AñXOjV ]oJ`å«wÓoŠ•F÷Ne|W'Û“ïåÖäãÖîÏ”)ý©UÞ6«J;q |rÆ×çðè‰b!4¶)]‡ÜO›3éÎÊÊ+¯}WGÒê®Ç¸eútžúì~±tøÚúcÀMÖ/«±5¼Ø²pé$íÝQŒýïáÒÿž;~‚ðž/ðÆñÎ"rzÐ^oå“õ)))$&&žV¡êXù{бœÚXõ³evîâÍãÇñ#ù¨íd&õª®[Kgµo³Xöä8Öôy™1 ê‘¿Pvv6Ea§t>¾èQJ‘óÂMÖæµìÌvâõ:9²þCæo$©e„‚ÓYïj~‰ý¸¥‘¿úBDÎ uÈùà¥xÏ×¼:áñflÛ“Ð {1$i “¿ÚÁ°f-ñ+ÙI¤®Ì ö5qø1`H«²Oquº6ŽÍû ¡Nˆ´ˆœ=ó$rûSHuÆqUBØ)DÞ¢-Ìü!…×>ÇÜùsxáf#+R²p·Žµv|y ¼Ã¤¾þ,K~ƒ5ùÞ’…Î V®ògàKs™ÿŸÿãòƒóxqþo'L4ùÓj亇GrÝ3³˜3çužèQEûü*ÞÆ™ÁÊŸÌô™ø¼õOZï~—7Vdáp¤±ð¹d6Ô½›iï/àÝ—‡öýfü”]ºü0kvÅqï‹3xã•ûiêWò³õ{pïÄiÌ|u¡´¿!‰(3`ަU«`2Nµ¼ûßaÿ£ýK€…8<%?)Þµ’´ˆŽ4þctòÚwóéÔw8|ÅÝÜ\W·ìDäôé¶È™\uø‡âë¾€+cë=ÍI<šœY:å_ÌÍ¿Žq^E´Ñ…ÓéÄåñj0‹ÈiÓÌ“È1Ûû_¼¶w>~‰Ñ¯æâÆH@LÚ÷Œþ-|9>Eü›1lÌͼ2íq†Î5Ùôjº· g™Ñˆ°Äõá¶„É$EHd0ÁµÓ4ò¸©sóy÷‘ÛHÍ‚3fP<Ö“šC×›XùêÝô›b¥Ñ½SßÀÉöä{¹5ù¸u£û3eJj•·MçªÒNŸ…ñõ9<:d"…XmJ×!÷ÓæLº³²òÊkßÕ‘´ºë1n™>'†þ»_,>ư¦þp“õËjl o#¶4\º2dqJ.EÌçñ;æ—U{ÙíÓy¹w´†³ˆœÞ´×[ùd}JJ ‰‰‰ê)¹(¨àk?[6aaaç®bo?ŽÉGm'3©WuLÚg±o³Xöä8Öôy™1 ê‘¿Pvv6EåŸKc,îçÒm;‘óÂMÖæµìÌvâõ:9²þCæo$©e„‚ÓYïj~‰ý¸¥‘^C "ç†nÛ‰œ^Š÷|ÍË&qØáÅG—»¦wM‚gÿ¬ERïîêQx¹Ðµ˜žã˜ÙS=!"r¡Óm;…'…'…'…'…'QxQxQxQxQxQx…'…'…'…'‘‹–}³FÜÇ[;²œ­L¿g$óv;Ïm=§S§ˆÈ%ÌG] r†¼vöÿ¸y/gÃîœ?ÂkÆÑ²ÛÍ ìÕ’Ÿj\>p DšÎñQ|\=öm¼6j 汯0<ÞR²Ü¹‡÷F?ÂG'l×`4o=߉G9Ûü­BhùíóÚ¶±xú ­>@±_,>À}=ëág8¶©ûàgŒ{f/w¼ÔŸÃÿù7ïþœÆáB7X£hzÕ F éD ‹†²ˆ(<‰œNö/yž±ó ètçC¼”G„¥˜ÌëYþõr6f7£[µPštírî›b:®{E+™i0j:Ow ¦,[|0ÎCWyÜx&ÎjUÞ6¼9‰E7òôìžTß¿˜çÇ¿ÀìÚSÑÌ¿´.9›W‘ß—Ú~þu»±}ªd¦è÷¼=qÓë6åùnáÎ"¢ð$r®yó70oþo4‘Ì=]ÂKïûÛ¼Cšw+ 2;˜5úeŒNcx¼ÛöÅ$O[ÀšL#Õšõàê€|6–©wÆcñä²~Þ4Þ^º…ôæÈf\7ü· ÇT²×½Ã“¾ck¶˜ƒyèþk©ãk8®ž‰´Y<™o³rà©»ùÁÇ—wL`Üå%Í1úX0›Í'„˜"6L/g›%uæmZÈs“>eC&TOÊØÑ×QÛZR‚3ógÞŸ9‡¯~ÍÀn‰"áÆŒìׂçV¦š†³k+rR6’îiÊèñW²lì4\W¶!Í&Òsò05ìÇ£TU^}ÒÊk_»4¾\c¤Ó×h††½’´„É_í`X³–ø•ì$RWfPûš8ü þÄ6iRö©¢kîg?EDáIä¼pìO!ÕÇ] a§ôà ·h s'Há Ï1·Wmœ›ßç™ç²p]slkí<øòcÔ õðûÒdžJ~ƒ†3£½pf°r•?O¾4—††|8þY^œ_Ÿ)Ãâ±–•àO«‘cè¾íÄÛv•´Ì¯ümì%uþd扉ï0ΰ™Ùã^äíyöªŒŽ4>—̆60íñ–YÅ[ã§0#öeþÙpfÍ®8&¿x/1ÀžÊ2ÇaÖïmÀä‰wÅ>>÷³V´g|Uå•Ó>×¾ï8àŠâòè£÷ܬÔh‰ãó4²Ý-ñ3·p+~¯Á K£íoáÙoRä4PçÆñTû` f9mz`\ä xl9›C¶”Îã¸Óùüÿ†që­·rëà{˜²±èa+mk½I êQ£‰f7Ò¯©õØ,1„&]’ˆ ·b4úqYç>t Ü͆ôÒ‡À ~$ èM“ ¦ÀF\kE«~`ß)?#î$uÊpÀ€0`0½›F¥ƒƒHt=MB}0…4¡[û2S3qöÝ_³<¯5·÷K ÒlÄDÿ›ª±mév LA$ÞÔ‰‹Ž~JŸPÚßD”0GÓªU0§ZÞ‰ýï°áÀŠßÑþLj%ÀŽBž’ŸïZIZDG]ÇBÜ gy%yFuÇóÕLæo¶i0‹ˆfžDÎËU‡(¾ÎCä9¼àkSuº?6•ŽEiÌüßqzÿ°¾Ûv„¢€æ}vÜ`!¬ZÀ±«¯_Ìfö’µìÍua0z(´éh/-ÇDtر'›Í¡ÑøÀæ>ÕK ê ±íË~bò«ü` "ðØ>Vß’zÈA§+ààPj&–Zu 3Τl¶ÐúÚjTú»Že9ƒ huÈé3%0¸_¶ÎœÀ›ßmá`¾§½€Œ[Øgóœô­l©Ó…V1ÿ›4мnr7ÿ—E›íe¹Çã(Ài$6Ênr6~ÁŠ ×±¼EløàsRóÝxlÛYòþz|;QëÄ_³7úf-$=£ð¤Låq9p:Çþ¹<%ëT²ME¬u{ÐÙ÷'Þ^¸– »ï>r©YP£Ã`Æ :þañ£ëÅÐõ¦V¾z7ý¦XitïTÆwp²=ù^nM>nÝèþL™ÒŸZåmÓ¹ª´ÇÀ'Ga|}™H!Bc›ÒuÈý´9“¼òÚwu$­îzŒ[¦O牡ÿÁîK‡1¬©?Üdý²[ÃÛˆ=. .þ8›y³Ò)pƒ9¢WÜþ/†%êq9ƒ h¯·òÉú””ÕSrQ:PÁ×~¶lÂÂÂÎ]ÅÞ<~?’ÚNfR¯ê˜´+Îbßf±ìÉq¬éó2cÔ"¡ììlŠÊ?—Æ\À/¨Õm;‘óÂMÖæµìÌvâõ:9²þCæo$©e„‚ÓYïj~‰ý¸¥‘¿úBDΠݶ9/¼ïùš—'Lâ°Ã‹1$Ž.w=Lïš:ÏþY-ФÞÝÕ"¢ð$r¡j1=Ç1³§zBDäB§Ûv"""" O"""" O"""" O"""" O"""" O""""¢ð$"""¢ð$"""¢ð$"""ò—ÓÆEDD.!N—'SÒxG{ò‹ÏJ™µƒ|T?Šñ‰u1 O"""rñx2%MY6–ÝØŠºÁ¾g¥Ì]yEŒúßNžJIcBR½‹¾uÛNDDä2wÛ!fvnpÖ‚@½`?fv®ÏÜm‡.‰>Tx¹„°Ù©h=ëåÖòe¿Í®ð$"åëÛ·¯:ADä¥ð$"""¢ð$òwcgû#¸ÿí8Îh¹ˆÈyæuðÙÊMôül#×÷;›Ýê…'‘³ÁÁ’±}é;øEÖxÕ"r…'7;?Ì{³ø<-ŸLºDáIä,pZÉ7û‚‰ñù•/6æ¡ø$"rñÓ{žDΘ“ýË¿##~cÿ—É_¬#;©áF/…;?%yê|V2Ùìzz ¬ì’®Šå'ðä²~Þ4Þ^º…ôæÈf\7ü· Çtâºö­L5 וmÈ_³‰ôœ—̆ºw3íý¼ûò¾ŸÂŒŸr¬ßš°«Ù]lq„ã»o ûìàÊü•Tg 1–“ë+Je΄Ùìk;†7?ø€7Ç&òûÜ ÌÝZT2wFíÉFw DίOÜÌ K~-ù÷Å6^Í>zNÉâŸ_ýZ¶ì¦ï~Wx‘ÓW¼óVäÅÓ½EÖé±›¯<„°ï^ÆZO{n½6£‰°–}èßøXè¨jùÉGjMº$nÅhôã²Î}踛 é<^îJû’ˆ2æhZµ '`ßý5ËóZs{¿"ÍF¬ÑIô¿©Û–nÇQ­Í»XwÀŽm×z šôášÐ46²“·cÙ1í¨]Î{õì»—’âlÇКl2ܸ7CÛ»øù»´’àϰ=…f"çÕÖ=™|ºûHÉ¿=9l/»‚qòóÞ#eËïʽ¤ûI·íDÎPêW«(¬'-B `¨A‡NÕXôíÿØßk‘‡)lNèÑ#ÌàKdÀ²[lî*–ŸÄkcç³™½d-{s]Œ mF:Ú+˜y2úì{ìÚÈäcÄãpá<¹ÉÍßÊÔîÁ\ú'¨¼N†Ú…ØÍÍhS§ˆ÷6ï§ÍÞƒTOjMÛÔÏ™z¿¤Ñ&ž rþlUÉçiL¨ùèOÌ„Æbÿ5ÁgÞêODžD._®±á´ÏäþÁ¯c¼N^ï2–í»™øÁæ>z”¹ÈÏ.Â]ªX~"çžO˜úA&=ŸN智˜œ»˜=úY²Ï Ý¦ (B£x8ù>ô’a´«ÎáoW°¢8€V}É ¼ŒœÅ+øßA_ßYnÀ3Fâ[NŽjù”\¥æ(ÀTåI¦òöˆÈù4f`>zMæ-bÚÂÍ,Q|;´1]Ž^ .í~Ò5ÈúÅІ¦¾ÊÌ3˜1c3_}Áu²ùß7»ðÖéFo K6äàœ~àÓEe¿g©bùI‘ÆQ€ÓIl”?&Üälü‚®3j·µn:ûþÄÛ ×’a÷‚ÇNÎÞ_X½=F‚´"t×§,/nDÓüj·%|ÇbVÔ¡MLù·­uºÑΜ»Ÿ§’ïv“¿ísÞýÙD»+ëbù3íññÛ’y,Z“…»ôd^Ñÿ‹ÈŸg0ð1–þ30•…$&ã—]Ê4ó$r†;ßLbl8Ç ¥ÛÍÍùðͯÙqÛ(n{´ÉÓÇ2òƒP‚CëÒ¸E(‡ž†üšTºü¤€ׇÛ&“ÔÌ“ˆˆˆœÌèÇ?néÄ]^~fu‰Â“ˆˆˆTÊìcB™©œ\©.9}ºe'"¢ð$"""" O"""r¼h ûmö³^î¾;5ü-—D*<‰ˆˆ\B†5ŠfÄ÷Û9pÔ~›ßogX£èK¢õÀ¸ˆˆÈ%d|b]žLI£Õ‚5d9ÏJ™ÕüÌ o\ƒgë*<‰ˆˆÈÅÅl401©“ê©3ÎnÛ‰ˆˆˆœÍ<‰T ;;[ "" O"§¢¢?' ""¢Ûv"""" O"""" O"""" O"""" O"""" O""""¢ð$"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""¢ð$"""" O"""" O"""" O"&ûŒºE¿9ÔßÄî·GðÌœ8ÿû¹ŠöücÊ•þ o?4˜Ñƒóï/â¹è‡ÄVæýc$ÿÝãÔá!'ñQˆœŸîË×™GÿÏŸ¨–×ÑçÞþ4ñ»¾H¶1ÿá)ø<ü }ã,ÚÙåžM«Ñºß@ˆ4ý½ê:+ûÎÎîÅ ØÛâ_LÖ_ƒv·(<‰ÈYa¦î?^etRŽÃøbò‹Ì~»>Oÿ#D]ãqã5š0\Ìu›B‰ïÜåü´¡²ºÎIÿ9)È(&¨SV'…'‘³É`4a0™ñ­Þš+ºÖ䇥iä¹Zýa×áŸùìõ9¬ØœÃE“ëG0¸O ‚ÈeËûÓøðû-d¸ð‰hFçaлM8&÷6¾7•…ߦ’ë2`Ž§Ë£OqCœµâòʹ)_áºÎ­Ì{xî®m°­ÛDfNÆý~ÿuÄX‹ÙúÚd~ÌÎçîfµ/u‡NàžÎxª(ÏÕ¹yk6’éiÊíÏÿƒxß²–phñ^Þt O<~Á€bv¾1Š9†‡ø¿»ÞoYðú{¬ÝAuhÛw$}»×Á·h-3xŸ&'Ñµš °³kÖ(æùÿ“Ç×ÃÇ^UÝ^Šû”w¦Ïç× aM®áò@„žB_y+ر{YðèËœFߨßÊmC‚ŠöUÕíùãDÐŽ“ê:gûÎU‹æ‘i¬J-µs4ÿ\P›î?HÍf–?VWÆO|úæ<~Üt»)€í‡qÏ}݈0A¿ÆYOøð^ì GeãØPù~-÷!¹Þá•¿ã·Qí3ìžk©éë®bü6Áú—µYžD.PÞ¢½üºú ƨX?Êi|ùB2[ቱ- ÈZÅ¢ Sx·æËÜÓÞˆå²Ü>é1bC<\žLò«oPwÊc4N_È¢”hL{šf¡P|(C¾>•—×!ì5V¶nkÀy˜-û0vüÝD°ož|‚?¶çn41†ŽÛO¸õãHcIåmJ‹cìó÷e9ùÔÙ¡;‘Ÿ}ÅÖœŽ´3Bá6V®3ÑòÑ8¬E©Ìq6»=ÁsÏ6„òÚ¤ ,ŽFÿÚ§°*­(ÚÊÇ/- àºñ¼Ø«.ŽMsyeR®U÷Õ°ˆ öEUmp¤ñYEýÕ*½òöœÂç=§ûÎ[@ýñ÷³´Ë4îŽÁ“ËÎ ÆjKËo|61™Í-FóØ#‰Dr9°+»äVßÙè×¢T>®hlÔ«¼/Œ§s¼¸2X—âÏ?^˜K]þžø,o.¬Ï¸¡ñ•ßóÔæÂt²ý‹(·Šœ5NvM¿‡G‡ âÁácøÒÑ™w´%ðøü²çk~ÎoÍÍ}3±TOâºÞÕH[¾bcñ’¸,ÌŠÑèGÌ}h°›Ôƒ & †â öïIÇæ2â[=žÚ!¦ÊË;¡uU®k ¥e¯$"Ì€9šÆ-‚9²=WŸ¶ÊòŒA´¸¡Q”sÃÊÙž+b÷²r]¼nûšTß+èPÛŠcÏR~uµãÆ^M4™lÔ›Û¹øeyÚ©=Ð]EÝŽ=ËØìiOï«ãñ5šnÞ‡ëYNé³Ù+ØUµ¡²2s«hO•Îó¾£’±êØý klm¸e@{"­ –Pj6ªK€ñìôk•c£’¾8ã¥d*Ù&}{dÂ؈n(NùtGåã÷|µY4ó$rQN— ›Ä݉Á˜­Aøù–>ãb?¶†'ï ù[™óÈ=ø”~'y]6 µ q¸mþv6}¹–y. FÅ6# /æ&ý¹£ß;|:÷ –¤Ct›žÜxg_êUVžü§X·'Œ¾úÛÀècÄëpá­àÓVYž)€PÿJh6Fд{ÿ]’BV—+øýëMvH´œ¶ÃØd>º²™ 86åã>•ÓVu{l‡±6'èhQ_¢1ÂgóÖ)_4ñ¯¼ ••Yœ_y{ª‹çyßymìýºü±ê)Π8°1¡–Ó«·Â~ 3¼ï*•cïi/GpäqÄ'$¿â¹KÅã·ÜñvÚ, O">a‡Uø`°10ŠÀ°(îxù>êpêÚó.¯,ʤËÉŒª€É¹‹}–<C uzÜǨ÷áÎÛÉÉÏðÎ{Íx¼{ÅåNÝØ·žÊÇÃë=Íò •ÔâZê¾óëvø±}g$I·Å`Ü‘Xméä;¡†Oɬ^~z–È L;>FnwÙWö;^ÿ“Û[a_D`->Rò%èà–]„§ú)|6 ´œ}ñô]–rûìTúË‘º¹Òöœ…¡yV÷kï'Ì®`¬£ðµýN®ãè¾;Åz+ê×4ýÃm0cecƒ?q ”›2ó9œëJR+÷ E¾‘ø™*¿'·óØf9/tÛNä<²ÔéA;ߟøð£µ±{Ác'oß/üº#—£—%’èjþ˜p“·é Öe–Üxq¥ÿ̺­‡(v{1úhÆd4`­¤<ÏiÔ]å;{Œ~[ ÉÌ,,›ÍøSåýNlJ§¦9,{ë]vWïN«¨’¯Kín4÷Iá¿_¦bs»±mÿœÿ®6Ѽk]Ì–êÄ…aó–#xס•,Ûh;­÷™kw£©7…ï7æ””‘þË6ÒgsT°/ bß›ªhÏŸ;ËŸý}ç©d¬Zê\M[ÿµ|´h5‡í^¼ÎlÛÍsvúµÒ±ñ'öA¹ŸÛ[ÄÖEŸ³+ßǶï¬ÇÚ¶5,•_ÎS›E3O"—k½…ñÍ9Lºs"ÅX®Ù”ÄA÷Ó´Enj5™wEPd0±‰(9µz Ӹ陼sȆÛèKdÓžÜz{C,VSÅåNÝU¦{'°nÖÝŒN¶RoøT¸êO”W–ž¨×½5<»œšw'Rv‡Æ¯17Ê‚×_à‰…xëÐfÐ8nnä‡ÁàKÇ;z³mÆc<õyÁQMiÜ8”ç3ãׄ›ìÅ;¯åÙE¡„Ô%®Y(Ù§ÐWõì vù¾¯ª=Æ9Øw–zU¬ñ\ÿÏûñ¼ñÓH¤aÜ_‡€3ê×T66âø+÷2Š„¶ù|úÏÛØ• ÕÚfxÿøcmªhüž§67×õ/cðz½•^ܤ¤¤˜˜¨ž’‹Ò½ôû/ç9ø /þß/téIÚ†è%B¢ñ{©ˆ¹€ß·«Ûv"ò×ñ²ë˯Ék~=M‚õÅ#¿raÐm;ùk¾wrW0ã¡©üt9ƒþ¯þúî_¹@è¶\ÒtÛND䯡Ûv""""—…'…'…'…'…'…'QxQxQxQxQxQx…'…'…'‘¿œº@.e1õˆˆœÍ<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆÂ“ˆˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆ(<‰ˆˆˆüå|Ô"àôxy2%÷wd°'¿ø‚ü µƒ|T?Šñ‰u1 Ú©"" O"çΓ)i¼°nïýöä󺽀 Iõ´SEDžDιÛ°ìÆVt­zA~†¥û³¹jñ/ÌÝvHáIDäÒ3O"À›à‚ NWÖ `ég…'…'…'…'QxQxQx¹¸Yõý*êþ/Ÿ¢*–‹ˆˆÂ“ÈÅËSLòÂåfmâS½fIDDáID*çÈËàõ,3 Œ9LßçÀ£.¹héϳˆüiR·¥³;ª.Æìã–_³H‹¦¦ÀKnÆïÜþM‹ó \V3†{­^ð?ºmUËEDäïF3O"–ËÆÛÛì´nA§úQÔÈØÏ'Þ’eŽ\]²›Ì& 䌸‚U­¼ÌÝeÇytÛª–‹ˆˆÂ“ÈŦ ãïsW- þ!QÜXÀk;‹p¶#ùÔÉóÍ‚1¨qÙeçp»ÙÌÌ}n™çޙͨøä/!„BÜÔ!„B!„BH" „BI„B!‰€B!$B!„$B!„D@!„’!„B!„BH" „BI„B!‰€B!$B!„$B!„D@!„’!„B!„BH" „BI„B!‰€B!þ]Ú¹ðʳ=¤”@5oƒA!n²" „BH" „BI„B!‰€B!$B!„$B!„D@!„’!„B!„BH" ®ëQŽÉÇò¯ÿ²j}ødpgæT—¦(q¾üáÌǨ'D¯F#5.Dù‡‡ªÜØÔÇn¡û¶­Ü|Ô†âzÏ¿~»eÓå»ãìvTæ}ùìѦXWE1*ÙyÕ¶øÙù1¹ð•'5"îâ©g"¿ ‡m5º Aÿýá¬Ì6á´°tÛI”å?ÓªŽŠêaá|zS÷èP+ΤeòÕß1¼uÆF•–´ŸØïüÃ|:úc /Ä“õ=®áèÃ'4ù:ŠQ©ºr·¾‡­KkK:_¾~¤)†˜ ‚ëùÓP•Å„£^|zŠ&¿&sVÐpKÏN,!šše^•¢{xùÐBøƒœ²6 ;bØQì3zï ¦ôlÀÈ0&»…Õ{óÄö ’µ—–ñõcÞ|r’ÆÅÊxsÏŽü :D£MNÞ+Œs²ƒO5¦ö¨Çð0#^N;£ïº$bnö©*©îåÕdÇUk>õ›7å“ZyŒ]¶Ó®U'3‡S3ù-±»înÆ{§¢~ÆŽäB\ ‰€Î—™}êÓüÐ~B—gApm~ïÛ’™éÛã¬ÃœúfF.ÚïyàëëM#›íë²0äÚ\VÌqlß–„&8  ŸÊŽõyÆ3ÔðòcYŒ¨ãäÇß³¯Zy­ç2ÙjcF÷:˜¥ówrÇ,Îó',­oÝÓ”Þ§Òô· Ò¼ª1§_3¾ÊØN¿“—–QçθV5¸Í˜Âwy è¼VV¬Î&S±^ïÍ;}›Òçô!"V¥rBÑѲšGÁº›}Ì.©~®nŸ|¬•7§wïà“¢$ ¨w’|*–1qÕù¢•//ŸI#SÆ{!J^X«êÍu»½+ÖÝÉwýKîí‡ÞõSSP(÷iÒ¿;“§BJâi^9¡æ¾¦^Nœ:­ƒŒ©²²Î±=ïZÌámÄ|4œGÄC¿Ì²ü[xfh{|T€Æ›Žýo¦†‡ Pa=ùεå‰éÔèC:óPÿj^kpgzV?Á»3pyGÖ²GÛ™^uôž,Ül#¿Z šêN°+ÁJî‰Ýä4»ŸÞ~±ì9kåÜÑ]dÔè@mÃÕobîÚÄCwÚ€»¶ä à´ñËî³¶|ÞžÂütÏÔÑ£jÔä[2_¤^½Ù¬bMcÈÿò¥ÝWzµáÈÓ·pöþ† ò-è–žA5x˜Ƹéœv(äe¥0i—….M|ð-¡Œ¶s)|u΋gÂ=о!5èíLåË‹ÊèY­Ò™Â1›‚ÓžÏÞÄR÷ûô¾ûhg“ƒmg,\²F¨ö C-üÍv¼‚«3°Ž u*ñ…¸ò+NvnÞÅý±…7†©ð«ÝŒí\;Óë1Y³HrœÏÚ“2m˜jj±§œäá¨z¼{S[&ûAôÉx^ÞxŠUÖk/dõ‡¾ÇøN>x¼1\÷X‰@ÓùüYIde⣆S8)¶\Tµó°ªªÑ©WËÖî&ã–ÎÄ­Ý‹¾ëDjë]Û*Ï6t-hWÇÌâƒgh—Dpç¶´ù¯c’h´7‘Àv ð¾êcŸû6Qœ¹mÀ][Òa§xk±“”’ÏÊÙLoDíCg‰háGÊáX¢W7:¹™©¼³.•wƒÉokÉ¢;Ìlÿ_<)#Õ ¾,~¤ …EQi´(iZöÙ/ìé:½oKñöíÜìSZJýä^½dÀ¢¨0iJhäNÎêáÌm¬‚y£^ ?Ÿ’‹Bü ‰X,VN眿C<§ØR§Ýj%Wo$X'…?¹9vlŠÈý‡¹uÿa<Œ><{{+uɤÎP]3ɼ —?þ~Þ%ßXìMwu|ª3fÎHš”0vv¸šKÖ²#΋=ûMÜôv-t}Æý6œÐ!˜Ôµ[Øb1ÑæÁ¼ÂÉüe ›“ 4½/èšø•»6qá¹ümÀm[*yþÍÙÓgøç¦:<b§W°…/·äq-}AÓ’›Éü=Y¼u»áH°ZHεððâÃl¹¸P:ßË›HL§Púع3ÌÎ÷¿äb¹xMËjáœÞ“šZ8˜éÏJÝ'_Bý­½z‹îk2ÔLmìC@\:éüÄÁθ×+‚¯|â¹mc*I’Q¢õKŹ©IüâbZk_Õ*C˜VWaELN¿j<\ȯlùù$Yì (ŠD»–†>ÚÿÜ=Ð×½ƒ[ [ùrÙN’­ 8­dÆíeû‘s8u@;n çço–pÀçnÓUpj|µÁïįl°4¡y cíöý…¿sêÐî?t€¡mÀ][Ê+eûŠ%“OÎx0¶{=:g%²üÜÕ=3xø3­c(·èñÓ¨ñõñgT„/êŒLN8 /%E¶j|Ü>º:¨4„Ð/XWj‚çÈMcaš‰ñÝêÒÓ|–ïÒ/½†Ÿ—’ÀwÖ@>ìD=­ µÆƒV¡^ªÜïÓTJý\MË¢ÎâhØ”MŒ.NØÉç÷;høÛb!þ­·l™ŒýíóomÁÙŽ:TÖ¾ÜϘ3vÔÕ½Ú³1ÿç«E«88†§7g‘ëPñÍîtöèŠãv[6lçæhË$¨ÏÀ7G¡^ð ã›Fø…5§ÇcÏÒ@@ÄíuY0'št#T[ñmè‚[ÓØ´œ´úÔð•O#"Äxu¤Žç«1j<ÊßzD—Þ–]i{°ó÷t”þ!ìý+•¸«|ï©Ã–OžoÞߘz+"OÅ3`S'€3›7WÄàìQŸÝC[â«rr6=“o¶Æð[iUòYÍ‚^~Ù–ÌÑ’ÊhÏfâÊÃèz4àÀð6?Nß³9¤ÙKßç¥äú¹šÒâŽÑ'ÒÀú[;Ó(‘ÿ;Gއ‘nõƒ‰8MÄú4R$ Â-ŸüuÃ.˜)ÏöPR£˜·áº-›Î7œ]ü™¾x_ÁõâºÆ‚CCß:˜;‚ x;ó9˜Â'»âùýœS¾6(Ä5µ" ÄUnî][Õ øôQVIp=¥ôœML`Lb‚„BI„(™Ú³:<ÚŒ›ÍÉ _qñeB!‰€×5g^2·-L–@!ÄÅ% B!‰€B!$B!„$B!„D@!„’!„B!„B\oTŠ¢\ò'Ö¢¢¢èر£DG!„!„BH" „BI„B!‰€B!$B!„$B!„D@!„’!„B!„BH" „BI„B!‰€B!$B!„$B!„D@!„’!„B!„Bü[´U¿IkânÖüº†-»¢9•jÆSP(õZv¥WïÞtiàæJ–J±’°ùÿølé&™Q¨É}O±òë½Ø€ ~3˜3¸º¢šóØ1é ¦ïW€PþèC„i¥õß0̱ëXñw6twéËmõ=QI`¤¯ Qõ‰@> ëçñμ-¤\ð¾ÜÔ8öÿÇþÓ4ŸÖÿ+8 9ÎþÁ¬Ù«8ézmðõÇÓP/"5.nHæØµ,ûùõª÷¢—$BˆªOr|äy[Hs½ã׺/îhK-æ”XD®gSÖ•/T~Ê’\ÿ÷î9™ùÏ5Ã8Î#Üÿl¨0ÖáZËÓ¶|Ðy\Õ= y•W2 ò¤VFZþ S÷R!Ä¿•8’Ùð횢$À«Û8ÞÝÿ»5¥M·»cA[4q}xK—¯fë82m€ÎðæèýàÃÜÖÄÇ5¨_n áþ×E½v)«wœ&GÑÑ—¡Ï  ŸµØç dÿõ&ýuéá^pi@1»ö+.ÛÄ‘t;†Öô~ôajü:ùGj1xîLú…”6Ä]x|ý_€sÍÿøsofL„uìËSÃŸ†‹—xã1Xµ˜U;ÏW­ïÏL]“ÜãX¶ôwþ9p’t+  ^›Ü;躆éQa!æÓçxcmàÇíS?á™ÆzWXøiì |h[ñâ§c1,žÎŒK–+˳…ÜíÓúÞNl@ýg>eÚíA¨­GXðìþÌu‹—øü­nø¨Ìì›5œÉÿ˜pÏ}Ÿ~!ò}Ás¯®"Ðw~“ÏǵÂè&¡´Äoæ‡oaËSdä*&ÿ`jÖo˽C¥S ¦‚í'—mo>ÁûÑÄ|âã¨~[ÄÊ]‰X<ÃèÔ#î­ÃÙ?¿âóå›9–éÀT«3÷I¿Æ¦b3çòÄËòÔ}9ËäHaõø‘|~ >#?›N¯ÕEï7äùOG‘9åþ/þüQœøl}V všø9/·6V lå)ÃÅå._;ËÙûcÞù“tÀ£õ³|<áVªi$¯ÂèO÷\Ò»ã->ÖŒÜÍ_òÙo{‰=“B–Å€Æ+„†=¹ï‘~´«VxUQ÷éߥ¹Ü¶SÐ7òNnæ§ÿ­âï½ÇIÎs‚ÆHPíÜúäs hæ…ê_ïBâM4+š-' _ÕàžíÏ'ET轌EƒxúÖ¹¼òÁf2‹Ä–IÜž5,ܳCcf0ªkÀE3Œ$~œöA±×V’v/ç½C˜;±ce2Îþù>;€ÍõŽ%i/¿|w¥n¥Lâçs@ç·°åõ=ïÄ[x÷½GitÁ0‘•ÓÞÇê(ê瀓̨ù¼:ã/R]oë :l–tNlû‘·ï!aú;!®Uö­{æi2ŠV¢Ãi¨-sÀ_üYaƒ  ûèøfÉ7|4º;d²eáb¢Í—þª¦á#Lÿv)?,x‰Nž®¶~`ÑÙFÚ¿µŒE;ášp÷t/_ÎòåËYôz»Ko4G³tqaàC×ggòÕ¢…¼;¸)6gåbal÷<ó}ÅW‹æ1ªƒkdHø…oÿIãâMZ <úÆG,X8™cn¥z~ ‹?u Þ]5û;ÿßb½ÿ8 5€óKn źð[¹­¦kå#jÇÌ6¶l ¡àÂ]în†WI}Ö\þý¨}šÐ¾†ë²ËñÝ$ä+äÛåÚ{˜½gm82bØçé<›FZ‰;1m)ˆv%õ‡ÏgÉ¢oøvñ2–|ñ¯?÷…³®Ëh?æà»3ã#¦<ÙÜÕÄï;CXß—yÿ£·X߰ܬ=f©p¼ÊëÒº¯|™JíÈÚPú´ŒÏžmPôV½áŸ²tùr–/ÿ®`5à2ÊvI4•og¨Œ4~x×ÈgßÂi̘öm€ª.ƒÆ>D#£ ÐÔeoÌú‚%Ë–ðí×ßðÝ_ñvßà‚}fnäÇÝY%æ%•ªûËèßUÖvÌ1,™_˜èhØÿe>üj1ß}5écÓ½–Õ¿Ý'„¬\.ëéHöd»^ÔÀ na˜Ô`ê6ˆ+7²à8½‡Èx+-^Ð é4ð.xªÁØ‚Îa°í œ#%Ǿ+’-q'r\/ê<ÈcÝëà­ï»s×êqü”\Ñ’yÓ¹ªkªÓ©oG¾Ü¾‘\Žo;…¥WÓâ) ͇›‹{âN´~µð‡‚¬×ÇÑ4;­Ü|mÆ™›Fná‰" ¦Â)ÚDµ·¹¤ç^œcûRÓßµ]•íù¥3G%¾àÈÍ(:MjBð.œÑh}©áT80h:??Óxúcr[ö9¬c ý.h¹iäeK‰?’XRðȲ8ÁKCP§»iöõ\¢yì\{˜ ïýlrsh¯^—”»"ûñ ¬}c «#±p†]‡“yÄ Ú6Ü~{0‰Û×·ã0G½O¸–kÓ©A±ëˆ* :]ù.¨ü;3ô‰H¦}½ƒ4s{¶Ä±§(lÊ I¯s=Ãe´jE¥3ž?QÔ&PWpRÕèÎןÓáD©p¼Ê³ÐviÝW¾LJ±Ù¯‚³Â} "es_†ËÛvAu¡=¸¿ÃL‹tM]èK±›{m ¬žö Ÿï+}fj·ØKˆCåê^Uéþ]ù¸Û†.8œ’nGø7û„D äÜ·)ÝêÂÑX€V.ÛI¯ÑðS_8`åçXÐxQ{b2üôr`Ttˆ”4[Q§ 0iû³µºê®OiLþxfÀž‘BNáqس8S©o8dr:ÍáÝ)?í …›Ñyû W]8£ÒiUO@Q\tmdzðµ%/íöqÿvôiãAôÎ|Ì»V²FçºY‡Þ·Ô(uö]Ñýêt¢ž*’hÅÉñuëHKê´£qÃê4ðXÃö˜Õ¬Ö»¦#!miZ¼â6»óüŠ€ÆÍŽTêÜó*ŸÞžÆ©#Ç8†ÓG"Y½ùVó!–~·‡;ÞèŒG…Úó‚ö£)l?ÅC¥¦ðmE¹üx¡Ø±ÙW¤E{I›½´î+Ô'T*4E!¶cµ»NYö,ÎdV´T°l¥•¡„2W|Û 9û¾cAd±õkóV|·YÃ[ã¥kìo,/LÂïcâ„i¤Ç²ë]†¼»«è^ŸW¥ê¾òý»êڎƈؒN‘áˆÀxQ2 þ—û„¸~TÝ_ÔÓsðí®kQý÷û¼<õ[þˆ:È‘#1ìý{ÿ÷ÁË#6‘â“ ·¹RNà%•¹¢ÛvfFñùGßÀ§}ÚürúŸñùöLœ€ÓœYÔ†Lu[Ó(HÚ‘Îîu1n’€ªRñþ]mÇ#¬+m}]ŒÿžÙ‹#‰Ë´`9w–ãÛWóûþ,t×Ș*nàPajñ$o>“Ã; ¶’dì]Ág{W\ø±Å–y‡ßÄî¶I:›æŒaÓœâôã¦aÐôJ_Š26ã¡A-øgáld°yÎX6 x«Áꄊݕ­Â”ò3FÿváÛ5ú1¸Kj÷§A06å‘gº³wæFÒIà÷i#ø]gÄ ˜±.Œ4kwÁPžMßþ(:èhݧ=ê*Ü&æm‚ ®ð¾g [‡¢SkiØ&Ž%í»Q‡ZE7kV”b;æEs9¼¨ –FlfkÑqÔéÚ _õUh?•¨—Êì£üe2Òð¶öxîØJVöÌÉÀy 8Kn“ÆZ­%š ãÏI<õ'@Cžÿü]zø]Á²U$nŽT6ÏŸË–l€nñy×=ŠeÌÖed³eΧ´ýèen®Ýúmì´BîÆ©¼’Ü ßÌb­ÿÂY‰þ]mÇØ„A#{±ú:’±sì—™Œùåüë<Ý–Þ-¯‘1UÜÀ+*=a·áãÙ¯òØmÔ ,¼ÑF‹)°-{dôÐvø¨ –ºŒbÖÔaÜŽ_áäFëK­Ö½6eV _s¹4ß1ž©Ão¥¡ë›>¤5ý^z~aE½?CyCÂ]¯½Î#Ã]Ëž„ux˜‰“¹îx.»Jü;?Ǭé#éÛ¡AÀfÆ¢ð©^¶½0òáÆÎ<ôõ¸£Gµb™AGú´ò.#}©è~t„¶mZ°ò@mÚ‡Á­»t\—NõyJ~Ù–Å“ßlc|ªóúмýÏ}ɨäª,—ƒÈ‘ÔÝœ--[!D¹h¯ü.œÚ»–Q¹®×:†Ýß™ÏB4®× ÉñqŒØÏ/é6œ* 5ýxª[&ÕÔÉ’…BñßNÔ´hÛœ'¢x%Õ5.¶"à4§òÔª8rÛ¶àD+_ª;ò9˜˜ÎÍ5%EÁ©RIR"„âºó/œÛìDíŠáT0x^zvÏÏ9ǧÏ5÷§¶NÑ` }Ý )¾ zæ$w.Ú„jÞ&ꯊgŸíü6rRxbéßhçm@ûåÈ!…„˜Ýüt–$°góÒ·ЭH!ÀžÅðo#y©¤¥@zŽ IDATy[O~ÉÀm‡é¹$’°%‡Ùdkv*/¯ˆÄkÞTŸErWTÉ à´òóß» [°Õ¼x~½‹W“nŽí¢“Qø­HælQ‚ä`ó_[©±>“Üì…¬äÓôÿnªù›©½â$ë-Š´j!„×J"à`ïîýt:‡wÝÆì{´#+Ús³§ªèz?ºhÏñÊÆ“|wŽ£'—œÊ~8®æµn"ÿ©–ÜËÈcV®“ö¸ßŽs°NsGt'ñ® ý³Ÿq ƒÍLe¯ ì¹Yl¶ëñJOã  ò³3ùÛáÍÝ~¥„ÀnaeŠ7ŸèLü#Mè¡ÊaÒÊC¬ jÄ¡gº“ûp=jŽæ©cùd'ŸdÔq#óïŽòì-$Þ×€¼ÔnŽÍ^¬Œj4¡VrkÍ®wmÙ,<ýšyãe/}¿Žü,Æý~’”fdޏ‰È6 ßž°b“v-„âÚHTøz騰1ÿÜJCž¾ð”ïùݪô|ñ@sžÖf2cÝ}¹‰à²$«ØL]¥£§Zt÷T£3úòd='-X€ÜÔD~rò^„ÕÔ*ª…ÖbF='?ÊÁîíÇMšl~Ët‘’FzpFzfóÇ9©gÓHð ¢¥®´Èè¸7"˜Æ®‹'y© |cdfûjiTxúVã­¶¶Æœ#[­Fm³°7ÕLªS…¯¯ÕxÊ'‡qù8€¬¤Ö¨ƒx:Hãv¿‰iIüª1µ…7¾*¡áá¼*0„B”ߺGÀÎö݇xÍ\“%]𰱡ûO›ü‚˜Ø+ˆ‰€%7“Öîçñ?Œtx Œj-5õÅVtjy à°ZÉÕûRtï!*Bütäž±cÓúqOƒ×ÏäÑ7ÝBÝúôMŒgl¢™Î§Í„Õñ&PUZ" %¬Ø>m3É–,Y¼•·‡U gP~èx‚ [vñf&4«ÆûÝkÓÕݱáQl_îkjdrt:‰ª±?:SƒV´Ò‚ÕÍ~³-Vr ~Ŷ¯!ÜO÷oÜø!„BKÍÙz†NmƒÑDï§ûÖ,d@˜BrÔo¬ü{7Çq6-«jSÚÝÊ}ûÒ¶ºÕµ̱ëXñw6twéËmõ=¯ø1—[íuƒ¯xVâ7~ËgË6}ÖìzóÒö.„D@\trÈÚ¿£ŠŠÆ=›ã[ÒYAÉãðÏÿÇïG.:Éå&³i1Ó¶æù_¡Gе=ØšcײìçcÔ«Þ‹^Wü$XŽØ^÷1ø÷ØW1kîâ\¯¾þÕñ’@I„ûÕ‚ƒã¤!=Zø¡B¡Á#¯òJ†TžÔ*<¹k} ëÔ‹¾wt¥emìq›ùúƒEìÊÌ;ùþ÷8º ®‹î§Ã–:4%ÆÖ"íí ²¥!ÉõÿÞï2wX#ô!$p¦®aüˆ…Ä–òs¿;Þå“áÐã ûð:–._ÍÖqdÚáÍ;ÑûÁ‡¹­‰OÁO;&.ñ†pÿk¢^»”Õ;N“£è ‰èËÐçÐÆ¯p*â$÷ø–-ýœ$Ý è¨×¦÷z€®az׬LÁ¿™¾ý…-N‘‘¨t˜üƒ©Y¿-÷}”NeLo”´‰g¿:@ú©tlÔEG.ÛÞ|‚÷£By`âã¨~[ÄÊ]‰X<ÃèÔ#î­ÃÙ?¿âóå›9–éÀT«3÷I¿Æ&W$oú’Ï~ÛK왲,4^!4ŒèÉ}ô£]5]Ѭ»Ì˜ù%óóØQü_üùrŸøl} §ÓÄÏy¹µ±õT¼þCyàÇ`ÕbVíVGQHËÛ$V½û6¹æÒÚMÚcUÅà²ÛŸ“Ì ˜0}Ét-3©'¶u2šɪê~öF;-…DÀ=uPoÞ_Þ»h€6[Τ×à˜0´æÁ>uÑ›£YøYáà@÷Ñoòtg2"¿dòÇI'“- Ó+âyZ/:M6|„©ûS×¼•Y/}ȶ<°XGtvwnöˆañ§®“‹wFM}ž[jx`‰]ÁäWqÔq‚¥ 7Ð}JoüSí„ëŸÏ»wTCƒ‚-+޻ޡöÓ”9ÿ°¤0 ð¥ëÈ7xº“Iëç1åÛ½%®Ùp€|¹¹m ¹”jKü‹¯q-Äj›qÿ]µñ(é‚ïbÌ ½ ˆ^Ȥ¯bÃAü¾3Ôîû2Ï÷2±sÎ$¾?®@îÖ³Ð.Âh ê2„7îlFóZ¾èT€#›ÿ÷*oÿz27òãîÇhs³öòÄLJÿ–qËú×>Ïu}|ø§L¿#èü ‡9ºÜõTý¢@Y <úÒÜRÛƒì”|ªiÊ[…\ãM í~™ÿáÓË9æ(Þn¢Y\ÎöؤŠb`‹»ÜöÃ’ù…I€Ž†ý_äÙ{#¨N&§DrÈË€Ê\þr•»Ÿåtçæ)ˉØ=§§îÄT¿o&?Z熿T%„$%ÀþàƒI®$@SŸ‡ÞGïš:¬G"Ù“íúPý ê†I ¦nƒ°r# ŽÙ{ˆŒ·Ò²añ-é4ð.xªÁØ‚Îa°í œ#%ÇA~Þ?ìv ®äŸä÷¹“Xà´ìšE*Ç#‰5÷¦šW0~*HRàø¢iL‹nLxXµë5¥åM· s[W~Â.¢s]/jßÏ£=êâ§¿»ãÎU{ù9åâû(ö[!ì&ÚW+o `9¹ŠYoÉ^+@w¼2–ÛƒKú}=¤k=NŸnÔúú 'Œ]yâ¡NÔ5:0u¯Í÷ÇOùd¤›Q0¢BC@³–œÛ¹‰åœ 1#K¾{VNÑ1¤Ä¦c¿ÙíeƬ(vñ寧ê^®–4ò,ýÛø£ý W?ÊŠ­Žˆ!C¸½™7*Å‹Þu—sìØùvcÍ-{lX51¸ÜXæÇÿî,׋ZyaP'B5ÕiÐ¥ àŠõ3|å–"!$(ÏâúVæ½µ=æ‚XïW_çÁFT€37Âs¨G@5L…Ó$µ‰j:8nrIÏu^´U_jú»U¥ÅC{~™Ô¡€#7œ¢©c"Ç$–°¢šK–ʼn*°3CŸˆdÚ×;H3DZgK{ŠÆÁ¦ šô:÷×3”z—·3/ƒ¼Âà†R´š¯õ£¦pQ"`>¾‘}fíÖñ’YniK¿çö-fÊÔŸ9áÔuè;a"·ñ-å>øS+¨`@¥3žŸÔ&P B£;ÿ›N‡PÙX=í>ßWúÍuv‹' ò¿¼˜µ Ô$4÷ºdûeÇ6ú¡®ãRé1z\Øn*ÒU ª&—Ëâ1Ô‡SÒ•êgBIÊžÇfïgÑÛ°9£`Pé:úmžŽð):©½1™@~z ¹N0ª ÿ”´Â‹Ü&LÀ^|øD­.}ˆÕ˜ж«k;ž…¯uÀ«Ô¨sÏ«|z{§ŽãdüN‰dõæX͇XúÝîx£3Þ*@±c³Œ€*­Z…Úä'`ì9ç°(`TN3yïËBìÆÝäÌ‚ËlI›æóöìMËç¦6<ùÖXúÔ3º9Á¨ÐƦø‡Tj ßVJÄ­±¿±¼0 ¿‰¤eË®wòû ¶U˜¹Q±zºpE@§UU"¶ÅbsQx*ÜUUƒ Ų„ö§1âd¶¤Sd8"0j.£\ègBˆëS•ýeAÅ|‚Ÿ¦Mee€ž–OOâù›ƒ.¸n«ëB„·ëÅñe,ÞG¶%›¸Íß±ô„ë}ï6t ó¨Ð¾=ºm×¶kKw¥bSò3c‰Z1wæî.˜É›O°æ— L7P«E'zÜu?<ևƮ©´#;›|×ïfÿó6ƒ bРAŒ[‘ˆðmK3“kÇG㯓VrÿÁÚ3ŸmO²qWTëBç⮤æ·r:/&šºÜ3ô^äŸâpL 111‰Ë¼ð}œæL ï¡3ÕmM£ =jG:»×Å\ºrÇ tF¢nFl"Å'ª§²T(¶%«P{¬¢\vû ëJ[_×¶â¿göâHâ2-XÎåøöÕü¾? ÝêgBYpËräüïHáìÂÊþ/_ä‘/Ïÿ¼àëƒM4ü&v°…LÒÙ4g ›æߊ7 {„¦Æ îÜØ”GžéÎÞ™I'ß§àwƒbÆRxHÍÚ¡Ší ›Íå𢂇ћÙZt#z®Íðu—›ñð fD~M‰eñËO°2À@vzO¼­§6³óÞÓ…še«œÙÞ´·èäŒ#–•ObeñÏÔÊü÷î¤ZüñCín´Ðoc§r7Nå•äføfÆ“h½4É+wÌTkµ"”h€Œ?'ñÔŸ yþówéáWþz*3¨HlÝ´›ò¶Gå\ÕÄ »úrÛ_ìÅþéëHÆÎ±_f2æ—bMäé¶ôny…ú™BV.Ÿ†€.£˜5uwF„ãW8€k}©Õº7æÌ*á+Må+†çç˜5}$};Ô#ÈØÌX>ÕëѶ×F>Ü ÒצûhˆIùf+ Z¼k´ ×““™Ø·fÙ‘–Þ¯2eXOø,­šU5é9ô5†4¼p†ÿ÷v2ñ§}·0®µ¹—ʯ £&¦km/ÀFâ‘SXë>ÈøÚ_òb*3mÍ>¼øT7ê”ø]Êò×SY«'UÛò·ÇªŠÁå·?5~íG0sæ(úwn@ucáe!=þáíh_ÛõëgBˆë‘JQ.½‚EÇŽ%:—ÃË¢Q/ó‹í6¦ÌAùc+[!„D@!„×y ±B!‰€B!$B!„$B!„D@!„’!„B!„BH" „BI„B!‰€B!$B!„$B!„D@!„’!„B!„BH" „BI„B!‰€B!$B!„$ÈÛΤa3Økv÷!+Ñs†óÂ÷qؤqß?Ïcïì 'm-ã}…5©N Ë Pï§~œÂ¸†ñÐãeõ™ÿnûtfíâ‹ñ#yîű¼¾`¯T»²" §éˆ9¼? ºªØœ%šrØZþ_±'üȘ‘ŸýŽy÷4žžðÊ¿, Æà㉧·­ÁƒÖ€ŸáZì©TÌ®:jßÿ3ß}š&úk{˜¹œöi]Ë6ÏÁLÿð¦>ÓZFm!ª˜öjÍ’6~ΜŸŽ’¯ub34ç¡ÑOѵšëpœìüv?'ÙÎýã_âîZ€…˜/'³`ù鉨ïzŸYÃ]ɀ俿æ“_Ž‘¯ÊǬiÄý/ á–`'5òÿødùrœù˜õMx`ÔPzÖðk _¾9“?OXÙ=>£¶:=_G¿0Ý*ŸäM ùxE,v¹ç…áôÑ]Ʊ¨1úšðô1 V;ðññè)JYJß_©Ç©"áç Ì8FpÒì­ºpj;U÷0éÕ^TÓ¸‹µ;fö}8–Ÿ›?BíM?•©`jó<ï m‚Þ]Ìò¶3iô_ôŸý ­ù&£Öõç“×Ûbt3wÇéîXܦ€¥nÓ‘¼Ž÷&GÑåíWèäà䲉|pö!¦>×rˆ^ú!ŸmÍB§ÎÇ^íVžñ^êîcmÞÊ[/®¤V§`²22H:k¤ÇèÑô /ëÌ_Ù:rÓW*Ý^ܵÏrPœ¨tz´*°…¸"”lÛ¶M¹’ië•7‡MRÖ§ØE±+‰¿ŽW†LÛ¦œs*Š’¥¼ùðʇ;Î)NÅ®$®¯<=%²àgElÊéec•—–œRò]ï836)SFÏVvœs*ŠâP2¶¼«Œ˜²EÉt*Š#mƒ2ù™ÉEûKÙô±2ù«ýJŽk›Ž”ÕÊø‘ó•KùË`;ó?å¥ç'o×»ÊS¯­WÒe”/?VYôâxå×D»¢(N%çèzeÝ¡sŠC©ü±(Š¢ä'þ£¬?˜¥8ì)ÊÎõ»”T{áJß_éÇiWWŒU†ÌÜ£dýB9òsåhÖAeÎsS”¨÷±.#jJüÿF+‡LR~=eQœho}OÙ“WðÙœ­•§¦ìTòʈ™ûã,ýXÜq¿M‡’þÏ,eô”?”S‡—(ãÇ~¥Ìum9?AÙüÓʱ<§¢83•MoQ¦lÏ)(«›Xô‡!ʧó§âT26OV†OùçÂþý2qÈùø”}œîúfé}¥²íÅmû,3àyÊÑ%/)#çR,ŠâJ¸*+ù {Hôë@sÿ‚iA`ËVx­Ž&ÙÖo@e¬K×&Þ¨€Àæ-0ýqœ4{'¼uî·y,q?ß½3žy(úD²ì OØÍiŸvEû ºù&Þ|ùåp¦¬eòð­Ë*¶\òÂ;—]>]­[Z™5u*§ºt C—ntoà}Ù×ht!]èRðÿ¶=ƒŠ­ù”¾?K©ÇÙZüÂüѼ1ù™ðÑé1imXŠÛXûºpªÐtô¡g¸UÚDeÛYéÇYú±T~›jü;å©}¯ñÆT}'M¦™§kËZoªiðÝÔM8ujrbsñȵ¡`7±F *C-ÚÔ6¢Lau1$Ÿ ÍÞ¥ÒýÁ×íï•ÞW*Û^@UzûtÇ‘Ê_ïŽa~R7^›Þ½ÌÛ„¸ž. ¨€‹.¦«T¨ Gc•ê‚•=P«TxÔ¼‹qÓî£ÆEËŽ–‚µª¿òYí6Þühõ÷<·¬åSyÑò阗|”};·³iöVôœÌÛýj\™Êp³¿²êA¥Q]z(Œ¿RF¬Ë¦Áà]BYËh(E?u*å¬Í2³´c¹Œm:-¤g8ñ2˜IMÏG©Sdä_ÊÇ+aØŒIDøXÙ=í9–ßli±.‚í;p–çΘ˪#¥Rý¶¬2T˜&ˆž¯BÀøze-Õ®š{‚„]\¾ Üê1›é“÷S3¤ ]îmÎWË¿äÏÆ£hUVlŒ°i“–œ%9;˜û]ýÁzl1Óì"ÛžM\fŸ¾>“gS†¼1„¦•¬#µ»¾RÉöR%¬…¸RTŠ¢\ÒÅ¢¢¢èرãµ{ÔŽt6ÏÏêŽÓy§W üU$qýÊÛΤQÒoî"Œ7f,û?äÅeí˜>éüä›B\+•äì^À”¯pÎbE[¿/£»H ÄuNß ·ò1oŒ]I@ÓG™^‹ÃC…pîya8=Btà¶JµB\wJz6ñ¶mۮχ.çíR¦>ý¶•[øFåŸ_ú³ÙË~Ö½#eµ2~ä|%¦‚X/í™î9;¦(ƒÇüª$–ðŒw·Ï¥ÏRÞ8Lùì`žâTìJÂÏc•á³*–2Ÿgï¾|%ÇÚý³îݱùŸòÒˆóñÊÛõ®òÔkë•ô²ê!?VYôâxå×D»¢(N%çèzeÝ¡sŠ£õPZ¬…âz£•T¨rςוúlöŽx{TîY÷e)ù™î ¶œ\œ_<Õfö}<–Y»²È7õà­‡QÇÝs鵩.íë”Ï'ØÛ NÊzž}åÊçîY÷eq¦¬eòð­KX¶\òÂ;»¶é¦tA´nieÖÔ©œêÒ]ºÑ½w¹®‡•k!„K×¥Ê= Þý³Ù+õ¬ûÊ=z_?´y)ä8´=/S×0á£8]ÇTêsém€JSò‰±ÌçÙW¶|•»°¯®vo~4‚Æú‚{ž[FÙõ ò¢åÓ0/ù(ûvngÓì1¬è9™·ûÕ†/„Eg>áþ´Uʳà/ëÙìj-j{.–*ºÝP¯;M³Ö³::p˜sÈwËó\ú’Tö÷ÜnÓͳî+¿M7õ`cÝOÿåߘNw=ÆÈÇ“~0‘ü+TB!+×(Û©yÿ“H·çp:+¸7Æñƒ±!¾:„вÎÙ¥< þÿÛ»ó¸ªÊÄãŸ{ár/àD—µ(²RÓÆš,Ìši›­q²šÌ¥R0EÄÎoÛ IDAT1×DÔÆqm³É&Çi4-Óš_fc î¸fn©e.€¡(pánÏïÔ4åBZVú}¿^½^¼îõœó,‡žïyÎá<Öf¯6D^Ë-0©ßD:4í’Jòí1œïóh–ˆ¶ôîÿ%Ó^J᱊`‚±´úMw…€Å^ýºôçÜgÔùmWu[÷¢U µîÏ7Éê‡ÚÄU¼ÎsCa³‡úÜ×'‘Ðï©DD~Š´ú` Z ^DD.qº5 ""¢ÍˆˆˆhF@DDDDDDDA@DDDDDDDA@DDDDDDDAà'Éd ƒºb]ÙO±ôöÿ»/ŽYOIÁ‡¤ýy0KŽüÄÞë/`éÐ'˜±³âvb8¾r$½&nÁõ£;'.>Kº²u:1ö•a´ û R¾—†Î䳊o×UŽˆ0œ‚NÁ¢•ÝçÍ}‹”ß=Äß6T®5àÞów’‡D¡ù¾Ê¢sâÛö‘ˆÈÕe²›‹í3Ó™¹µ€ÜC Hõ mÃ|ä.Ê„Ï{hÞëÚ½oÛ,÷1zÈĸV3ªÿ»4º)–âÂB}Êí))ÜÛØx8ô¿W˜öönÜÁ~<ŽDþònŽ \lÉÈÂÄn4ÉšKv‘!ü†¾Œy,{ÅN^9‘¥_T°)m;¡ÁõHêŸJç†Õ½ÅßJhd8a¬VQ„žöR|{Üüß ¾ºán¢ÏØÎKþÊטñÎÜ7® +¹?¹âlPUYâ1/m Ö§žåw Ož"nöü=•YG1æÎòϧî§Ëw˜ÿMÃÒÆÉ û]sB­7`ÊØµ`"S?.!:6†ÑEø«­Ÿ•C‹Ÿføöß“9¸-N ø þ˨Á+¸sâH:Ô.¯âœ¨Üç‘5ÿdÆü­”øÝ¸ì ü¶ßc$5 ÜžÕô‘ˆˆ‚À&”kzŽ'Óµ‰q}9¼ù(¡Ïôgè$z¶'fèÛ|Y~1Ö`(ù ß-Ãpƒâ¤ÍÞH‡¡í /\Á sÓiÜs$Õ…Cïcøß7Ò2­N‹:MBØ1o­GNdzcû×KÛxdðÙ5r/ùk岺5cÁÑì.ºÔ®Gpˆ›¤û“ˆ9íëðk¸36›%ŸwäÓ.BMÑjf¾é¢ó˜ñ´qŠVþ•§ÿžÍõCo!²Ê²DÓ¬nxðÕÚMög!\{c]òöûixK-8zžu?ÉœOg?Ç{µeøo« €¿`%ÿøÀN÷‰#¸ÉYºI}YUƒúÕ»ùW4xg [Šoä–(?ù«—ðÕÕ¤u”%à9á?º’^;@‡Œ¿’TŽ,ŸÁ ì¢ÝÃ×V =-Õô‘ˆˆ‚À³ ¢ÖÆîpN„ÍNx°‡ Ÿ`°8qC“P,@xæ8ò¿ ÀÛ[îfò¢Ú’X»ò’¯NËë¨õþvò=íp†X°9l8šßKÒ¹Âód‹kOR\åÏ­“ê~ã[Íïnêyë)ºïëOݹ›Ù“÷)sƤ1ÀW†±çQì…È*'!BˆùYGp`÷læ,³ó›Fâ`qWֳᾺ7ß{ŽÌü›É5˜9÷ÞEATKš†[ÀR‹æ­ã±o¨Aý¢oäžfÿæ?› iÿ‹R²þ{œÖ½«]íл‰mNÕ¯î­ÉŒ¸µò»ŠjÚ3p‰ˆ(ü(Y‚NŽFÖS—9ãZü䥢ÿ©…x-ßøW€Å‚åÔ?"<ÚyQ88¶¬Sø8'æŒ2…ÄßMêø®4¨ñ4µ:?«CÙªd‹å·]ÜdoÜC¹¿!?·^XÝýeuàÚòe¼»½=¯«Uƒ dÀï=q;Àà÷ú¿>zÀú9¹îžD^û÷Zrã¿"Ë÷ R›;jØU<`q^í)"òã¥'™ªÊ÷³aoE{>ÃÛŒ:ÁÒà­g[¡ðpxË\W´$¶&#¿5«·”òïúrk7Üw›?ø÷‰Ñ5¤~k­dMŽ0ß2YKsðTS–ئØvÌúð›iݺ5î>櫨+©ruŠâÚ{þÀ)?ç³_!»¨úF®Û‚ÚEÛØ[bÀ_͵9ùlcàúYK¸›6¥±xÑjuêH#[õE iЊø¢ 'êç£ k"Cfl¢ÄÔ =ED4#ðããÙ÷ÏÍXÅQo вx*sC[ðç!=¨_ÝØ YÓýÆWäåþA­pZ€è[èóàN¦e fIˆ¡"üz%_Ox îX#¯åŽ ˜Ôï "NšvI%ùö¾‹ L{Ó»èÀbþî=qu½{î`òÄÁ¬¶[¨jN×äz§æ5ª*‹­N3¢ ÞÁüéJ"¢]Ü`^b_|<á°^@ÝOΦ8šÿŽ”N#ûÂÿh68‰º*T÷<Ôi%SÓ°¨^šÇãøÊÔ¨~Ø›rW{FñÄ_bOµqÕçD/ZEßLŸî;™–‘Ê{Áýj~ÛïÚÊ[ ÕODä'FËR¶ŽÑý–ÒyúPZ…ª9DDäÒ£["""šÐŒ€ˆˆˆfDDDDA@DDDDDDDA@DDDDDDDA@DDDDDDDA@DDDDDDDA@DDDDDDDA@DDDDDDDA@DDDDDDDA@DDDDDDDA@DDDDDDDA@DDDDDDDA@DDD.Ãñ•#é5q ®oõÝO•‡ýÿî˃cÖSRð!iÌ’#~j3¹Œ« .ïèˆ#Ìé ØáÄì Êq2ú©(ÊaǪEücÎvڌ̃WØN|WÁÁ_fê‚”Y|Pÿïÿ{ÀMβ—™òæVJ,~|a‰ü6¥w6²c X/ùËg’ùæ\VðG´ááÝiU]V=ßãU]?ß¡%L|î=r<'þey>‡ëöæ…±ID[µ™ˆˆ‚ÀôB¿„íó2yyu16«oLGúöïB³P ˜2v-˜ÈÔKˆŽ¡At§®ï}‡‹-™Y˜Ø&YsÉ.2„ßЗ1%`ÇKþÊטñÎÜ7® +¹?¹âl•^ÖL¦,Ú‹/Ä‚—ÆÜ—܋۫ý.À,Ɔé<óêNÊOûÔR«5}Ó{`B#à ‹p`µúˆˆˆ"4èÄuïÁÿ0}ÖnbÚµæ†ØÝglåËÿˆççs÷Øi$Å”ñÉËi̘׊Ì-)ÞÀìùG¹kô :Õó“»èi†ÍÞÊ-CÛ¨EkxyÎaîÌȤc]?gÜìm\Ó¯%¡¶;Ïãª_PÜ/IûÛ/OTöÿ›4w¶¥¶%p›‰ˆ(üXysÔþsúïD3Ç1–?3o»“a7†ã/XÉ?>°Ó}ânr–°nR_V¼f ðبÓ$„ó–ÑzäD¦7þú Ô­fæ›.:O§¡hå_yúïÙ\?ô"½ùàí}´OÏ}qVJ÷|ÌÚ¢rüq6¬žßUY9 Î6ýø[›ói ŽfwÑ¥v=‚CÜ$ÝŸD|ȉÚ5¼#o –rÆíïѽE·&±NXœ$Üz5¾W·sÔׂú‘íò|ûSWÝ~!´N­jO´Šœ ¬Û"Ý/±sc;B?ÚÄ!OKšÈA–ó<^ ú>kptÕßYòÒ¯¯u¢«n3m-ÄïbÎØ,ü6+%{K )õ`Ïá]Dµ¤i¸,µhÞ:û†W¾ 6‡ Gó{Ij|æ4´;w3{ò>eΘ4æøÊ0ö<н\—ë[V0iìXöµoKÛö·p[sgå@è»ï‰-®=Iq•?·Nª[³mê%{ô#6êįâÊùlíg¹êàö'¯Ž›¼¬—˜”}-½†µÀ^Í>ýåÇñÚø7Oà±iQ w !y¸jzûý[¯F*ö°pAÓZá´\X›‰ˆ(ü€ÜŸÏcÊ»ÐsÂhZET°iü“Ìÿz¿÷Ä”¿Áïõcjô@áÑγÑb!$þnRÇw¥ÁYÓÆµhùèßx>7[6¬#kê%¥óLç[|WõÈñÏ3æµÏ¾qk OŒú WÙ¿ûö´FßÊã|Áô YZŸ«Q'2†ð“uõeÜLÞÈÿ9OŽº‡fa–ê÷ApÅ1hÑáC‚iä[C…=аš¤ ó8^ ’%[Þa]{§¹QøIó•âv&nÅoeù.ü?¯ރ붠vÑFö–üš8gÛÖ¤ÂAµßR¿5‹ÞbMνÜߨÆñ-o2ÿ«[xðÎxlûùïö“xß/¸é66AKòpwn@p ïª<šgë'™Ðú"6¨ç{Kè5áQÚŽ³ñÅáì½ù!j[!k_ÌàˆG9à:"Î1»÷.äï†Óù‘;‰?1íooK“#KØT1œ;¯öñÅÜ5”'/“—Wc³ºñÆt¤oÿ.4 µ.¶ddab7šdÍ%»È~C_Æ<–€/ùY3™²h/¾ ^s_r/n³,Kî¡Lø¼!±‡vá½®=ÑûÖ±Ír£‡ÜAL‡Cÿ{…ioïÆìÇãHä)áæ˜`8¾šÑƒ>¤IÛH ç³?'”;RSéÜĸØ>3™[ È=Ô€ÔYÏ|=#P±“WGNdélJÛNhp=’ú§Ò¹¡ p¼@u·7ç¡¿¾Èw½Dÿçk3ô¹?Ðèdµ•3`Y¼ä¯|ïìÁmqã º’û“{Ð!ΰ,–Ïß`üŒåìÙŸOÐÔ4¶Ú,„üì y²=µ-%úÖË‘5ÿdÆü­”øÝ¸ì ü¶ßc$5©¦,çÓï†ã¦óÌ«;¿±0Tkú¦÷ Á®ÿ‰ÈÈœÃÚµkÍ¥Äwä¿fD1fE¡ßã5y‹™žÏ­7ÇýÆw®YþöfO™ß‘ÉÙÃd¬+9±¥Ç\bè1Ú,ÞWnü§ïÔ½×ÌîŸfçy1~S²{™ùïŽcư$^“·h é1q³)Üýwóøã¯˜ÝÅÛÌ´'3Lv‰1¾‚efdÏÑfÙaï‰r¦™ãךc~cLi¶ù@Oóò¶2ã7^“»p é5u›)?}÷eÍØGŸ1٥ߨÿá÷MÚã/˜åßø<ÐñÕý„òÏ^4}RæšýîÓ>¬¦œU•Å_˜e2R¦šõÇüÆŸ)\1ÎôÉXaŠjR÷æ)ƒÌ;yÞo|^ußú >6é½ÓOÕýpÖ“>ëSS⯦,çÕïÈsÐ̘bfïu‘ïÚeqkÀ}#÷4û7ÿÙTHû_”’õßã´î•H- ì$&xsÆfá·Y)Ù[JH©X°`sØp4¿—¤Æö3Ÿ ®Ëõ-+˜4v,ûÚ·¥mû[¸­¹³O_Õ°6v‡“ð¨p"lvƒ=Tø îÜÍäEµ%±våýß:-¯£ÖûÛÉ÷´Ã XÛrcÓP,@Dlž­å'–H>? îÕµ÷y”Ó»™=yŸ2gLs|e{Å^ˆ´gYô­;w"Úœª{Ý[“që‰I”@e9ï~Ñ­ŽÅÉu÷$òÚ¿×’ÿY¾_Ú¼r=a÷çó˜ò.ôœ0šVlÿ$óÏØ8ˆðhçÙ e©EËGÿÆóù»Ù²aYS°()g.|bÓ “ÆõÔ V¹ò“åÔO_ÿc Ë© ¿ã§šãUU÷jw{å´X‰¿›Ôñ]ipÎçà¾}Yªï[se9Ÿ~7ßø ²&2dÆ&JL5e©A¿Ÿëüs¶~’ S§2õ´ÿ¦ŒSÍ\<ö¦ÜÕÞÅÀ…Q<ñ—XN^è9šßKÇ©<›þ)ñq ´ï’Ȭù¯²ôªþÜÕ À$tHmâ*^ç¹!‹°ÙÀC}îë“HèiÿÄ{ä>^E‡îw_ƒ‡½­Ñ·ÐçÁLËÌ’CEø ôJ¾žðjæÂ=ûÞ⹫8ê-á@ñQöOenh þ<¤­œ¬‘×rG‹Lê÷‘N'M»¤’|{ Açy¼oþÕÀÈ'>®ñ_ TY–¨›èÝs“'fµÝBEPsº&×ãBž‘Ü·7Ó§ûN¦e¤ò^°Ác¿šßö»¶òvQ ²Ô ßED~R—ÊÆ˜³æG³³³i×®ZGäÇÀ›Ã‚!Ïáêûœþ|PD¾szÆIä'±tÒP›ÂÇù>µ‡ˆhF@DDD4# """ """¢ """ """¢ """ """¢ pQyØÿï¾<8f=%’öçÁ,9RóåüG–0¨û(Ö•}E)[ÇèžøÄu‘ŽW]YzŒc“ëRégCé'3èŸþ!‡}ßï9!"ò} V|?ùÊF˜ÓA°Ã‰#ØA”ãdæò’¿úu¦Í^IžÛ@­~ýd_:·;µ‘µN'ƾ’DðEz}•Ç+ßÎKé+¹}TÏ3Þ‰ïÍ}‹Ôä7(ŒªýDµlº2|èÝÔªz»*Ëé%ùL2ßÜË þˆ6<< ;m¢¾‘›=ûyoÎ^ÚõéIL€ŸŠ¢v¬ZÄ?æl§ÍØÉ§½ 0Ð9!"¢ pÉÐÈpÂ"X­>""¢=±¸¿ ‹é/n%qÄtÒ›Û9öÉ¿xqÙ§ÜÖì&¢¬.¶ÏLgæÖr5 uÖ3´ ;yñéâów&1ùƒœuësÕ•…¬8ð;¦>ÝšPSÂöy™¼¼º›Õ7¦#}ûw¡Yè‰há/dÃëã™»û ùå¹?í)îi8^ÅN^9‘¥_T°)m;¡ÁõHêŸJ熕›5æ†Nîsö@_ÍvPÂæŽçÍøÊÕ®CR¹¯qHåà»ò5f¼³·Å+èJîOîA‡8àbKæ@&v£IÖ\²‹ á7ôeÌc دfô iÒ6’‚ÃùìÏ åŽÔT:7±Þg€rš¢5¼<ç0wfdÒ±®Ÿƒ ‡3nö6®é×ò´5|Y1›•ñ"£iHe.8ø¦ÏÚML»ÖÜ»»Æç„ˆÈÊœÃÚµk\wÞ*³l[±ñy› Ë6š#ÞÊÏKÖg˜‡,6yÞ—m4c}Æd—~ý‘¿à#3¢GºÉ:ê3Æ{Ø,Kïfº=»É”cŒ;×,û³§ÌoŒ¿Èdìa2Ö•TnXšmFþña“¹þ˜ñ¯É{7Í<š±Æó>ž1Æø¿oÒÁì,?ósOÎóTŸ³?¯n;SšmF>ðˆ™¼®ÈøŒÛì››bzMßnÊ1þÂ,“‘2Õ¬?æ7ÆøLáŠq¦OÆ Sä7Æ9¸ Å<Ðc´Y¼¯ÜøÏÚgOóò¶2ã7^“»p é5u[ öYu9]['›ÞÃ>2î2sì¸Ë”˜o$ÿÃ|á>­?J¶˜ç“G˜÷£#=Íü)fö^wÎ ‘’f¾'¶¸ö$ÅUþÜ:©îÉØ…§¤¿#’0«‹-S2ic1îðÛ•xÝS°‡‚ˆ«iê´BPZu¸Çš“ó:Nb‚w1gl~›•’½¥„”z0€°„6åæ' Nⵄð9Þ›p^Àú5þÃÿeÜ“OܦÑoFðô=õ«_}0üJ:$Fb¢GàÙí¸s7³'ïSæŒIc.€¯ c죯 ‘6 6‡ Gó{IjlÇrÖ>›rcÓP,@Dlž­å5Øg€º•Çkwâß<ǦE1lÜ5„Täá:uKßÃÁÿû'»oìÉ£±AxNˆˆèÖÀeÄ‚=2Šà²Ã”øC¹.åy^=²„¡ÃwSÝccÆÌiC ÅúõÏîÏç1å]è9a4­"*Ø4þIæŸqØ`‚N=-°\`Mª¼5PmzBõŒ2X,„ÄßMêø®48çØDx´óÜ'ìiûä[í³Šº…F\q Ztgø`ùÖPa"ìÄAüGW1;+–2ša×I-"?qzZé"süì6®.^ÆûÛcŸ«·©ÁÕdtS¢Žïâ`™_![Vì£âÄw¾²BÜÎ+ˆ·bŠ·²ü ~ÿ×Ѹö±qŸ ƒÂ[)mNtM" 5«·”òoûpûylR¿5‹V²&Ç Žo™Ç¬¥9x. ­«Ýgå´Ç·¥É‘ÿ±©¢1-¯Žåèê5”'´&Ö;ç¿MÙ]ÝhaùîN SÊ®%óx{M¾~IDD3—ôœ@D[z÷ÿ’i/¥ðXE0AŽXZý¦;BÀ³ï-ž›±Š£ÞeÿðT憶àÏCzѪN{Lú˜©C±8.žk~VGnå@äh~/C¦òlú§ÄÇ%оK"³æ¿ÊÒ«úsW„Kx |<ôÙ¹*mÈïµÂi©æxN ÖÈk¹£Å&õ{‚H§“¦]RI¾=¦òªøŒ[€ãjzëO›ZUoè¢Üu½{î`òÄÁ¬¶[¨jN×äzØ.¤­«Ùg•åŒlGχ·’™‘Â;‚boåñþ „Þœ÷y}Çõ<úPÜYõñZÂÄçÞ#Çí¡0ï0þgí¼’‡÷¥]d5¡¡ì3ÞžóÎÁ¿Ö/‰ˆ\ÜqIËÿD9›?¡¸I[®‰ö³Þ2½ÉLèÖä‚Kùq¨øì%Ϊϰ±+ÿSDD3rfd³T¼ž×Fü ¯¼ámxd`#…€K‚‡¯>=ÄU¿ïFœB€ˆhF@DDD.=,(""¢ """ """¢ """ """¢ ßÞ…­=ï?²„AÝG±®ì;(JÙ:F÷œÀ'®‹t¼êÊÒc›\—J?J?™Aÿô9ìû~Ï ‘ï‹Þ#ð=嫪מ÷’¿úu¦Í^IžÛ@­~ýd_:·;õî}kNŒ}%‰à‹ô"û*W¾—ÒWrû¨3Dòæ¾EjòFÕ>õfA[£® zwåËpªØîG§ÊrzÉ_>“Ì7wಂ?¢ èN›¨oäfÏ~Þ›³—v}zà&gÙËLys+%?¾°D~›Ò‡;Ù±<'DD.¹ PÕÚóþ‚,¦¿¸•ÄÓIonçØ'ÿâÅeŸr[³›ˆ²ºØ>3™[ È=Ô€ÔYÏÐ6ìäŧ‹Ïß™Ää pÖ­ÏUW²âÀï˜útkBM ÛçeòòêblV7Þ˜Žôíß…f¡'¢…¿ ¯gîîƒä—7æþ´§¸§Qàx;yuäD–~QÁ¦´í„×#©*V¾Â¨ÊE‡ªÙJØüÏñ¼¹ó_¹ÒuH*÷5©|W¾ÆŒwöමq]ÉýÉ=èg\lÉÈÂÄn4ÉšKv‘!ü†¾Œy,ûñÕŒô!MÚFRp8Ÿý9¡Ü‘šJç&öÀû PNS´†—çæÎŒL:ÖõspápÆÍÞÆ5ýZzª¢>ެ˜ÍÊø?‘Ñ4¤²‹Š70{þQî=ƒNõüä.zša³·rËÐ6„8'DD~PçZ›xíÚµZ ùUµö|Éú óЀÅ&/ÐZôeÍØGŸ1Ù¥_ä/øÈŒè‘n²ŽúŒñ6ËÒ»™nÏn2eÆãÎ5ËßþÀì)óã/2Y#{˜Œu%•–f›‘|Ød®?füÆkòÞM3f¬1ÇügŒ1¾Ãï›´Ç_0;ËÏüÜ“³À<ÕçìÏ«ÛΔf›‘ã6û榘^Ó·›rcŒ¿0Ëd¤L5ëù1>S¸bœé“±Âù1Æc.H1ômï+7þ³öÙÓ¼¼­Ìø×ä.hzMÝVƒ}V]N×Öɦ÷°L»Ì;î2åæ›Éÿ0_¸Oë’-æùäæýCUu¤Û˜?À<þâNS^Í9!"òCÒŒÀ÷äÜkÏ<%¥ø‘„Y]l™2I‹q‡ßΨÌÀÓèž‚=D\MS§‚êЪÃ8Öœœ×q¼‹9c³ðÛ¬”ì-%¤Ôƒ¡r©_KhSnNpb&Àô úIDATê$^KøŸSའ缟øÌE‡‚iô›<}Oýj§˜¬áWÒ!1+Ý8Ïn~À»™=yŸ2gLs|e{Å^ˆ´Y°9l8šßKRcûYK([ÛrcÓP,@Dlž­å5Øg€º•Çkwâß<ǦE1lÜ5„Täá:uKßÃÁÿû'»oìÉ£±ç¸¬7nò²^bRöµôÖâÔRÅç>'DDtkà2bÁEpÙaJü¡\—ò<¯YÂÐứî±1c æ´!Ðbýúg÷çó˜ò.ôœ0šVlÿ$óÏ8l0A§ž \èºUÞ¨¶ ‚N=¡zF,Bâï&u|WœsÊ<ˆðhç¹OØÓöÉ·Úgu ¸â´èÎð!Á4ò­¡ÂE؉ƒø®bvV,d4ã¬êû޲aN&oäÿœ'GÝC³0‹N{ùQÓÓJ™ãg·quñ2Þß~ø\%¸M f¢›u|Ë ø Ù²b'Çž²BÜÎ+ˆ·bŠ·²ü ~ÿ×Ѹö±qŸ ƒÂ[)mNtM" 5«·”òoûpûylR¿5‹V²&Ç Žo™Ç¬¥9x. ­«Ýgå´Ç·¥É‘ÿ±©¢1-¯Žåèê5”'´&Ö;ç¿MÙ]ÝhñAÞ_ÈÚ3X`ù=#ÜûíB€)e×’y¼½&_¿$"¢KzN ¢-½ûÉ´—Rx¬"˜ G,­~ÓF!àÙ÷ÏÍXÅQo вx*sC[ðç!½hU§=&}ÌÔ!ƒXÏ5?«#·r q4¿—Ž!Sy6ýSâãhß%‘Yó_eéUý¹+‹%<>žFúì\•6ä÷ƒZá´Ts<§käµÜÑb“ú=A¤ÓIÓ.©$ßS9æqkp\MïqýiS«êí]”[¢n¢wÏLž8˜Õv AÍéš\ï‚VW¬nŸU–3²=ÞJfF ïн•Çû' xsÞçõ×óèCqgÕÇóåbf}tOÜ+ _wâ,þ^ ü%õ«ûM+ûŒ·ç|€sð¯õK""w\Òêƒ?ÆEÎæO(nÒ–k¢ýìŸ7„Lo2º5ÑRÄ—€ŠÏ^bà¬ú Û¹òO0ED4# gF6AÅëymÄ¿ðÚÁÞ†G6R¸$xøêÓC\õûnÄ)ˆˆfDDDäbÑÂ""" """¢ """ """¢ """ """¢ ß‚‡ýÿî˃cÖSRð!iÌ’#5ß®ÿÈuź²ï (eëÝsŸ¸.Òñª+Kqlr]*ýl(ýdýÓ?ä°ïû='DD¾/z¡Ð÷”¯a„9;œ8‚D9Nf./ù«_gÚì•ä¹ ÔJà×Oö¥s‹°S‹ðXëtbì+IÛ/Ri«:^ùv^J_Éí£Î\Ñ›û©ÉoPUûÔ+†mº2|èÝ•oÅ«b»*Ëé%ùL2ßÜË þˆ6<< ;m¢¾‘›=ûyoÎ^ÚõéIL`*Ø¿ô%f,Ú… /nûUtMy‚»Û±<'DD.¹ NX„«ÕGDD¡'Þç/Èbú‹[I1ôævŽ}ò/^\ö)·5»‰(«‹í3Ó™¹µ€ÜC Hõ mÃN^|ºøüILþ gÝú\ue!+üŽ©O·&Ô”°}^&/¯.ÆfuãéHßþ]hz"Zø Ùðúxæî>H~ycîO{Š{…ŽW±“WGNdélJÛNhp=’ú§Ò¹aå» «\}°ší „ÍÿÏ›;ð•«!]‡¤r_ãÊÁwåkÌxgn‹WЕܟ܃q6ÀÅ–Ì,LìF“¬¹dÂoè˘Ç°_ÍèAÒ¤m$‡óÙŸÊ©©tnb¼Ïå4EkxyÎaîÌȤc]?gÜìm\Ó¯%¡§*êãÈŠÙ¬ŒÿMCN4ófÿÇC—ô)Ü ‡Þ{š§ÿµCZàœùA™sX»v­‘ ãÎ[e–m+6>ïa³aÙFsÄ[ùyÉú óЀÅ&Ï`ã²fì£Ï˜ìÒ¯?ò|dFôH7YG}Æx›eéÝL·g7™2cŒqçšåo`ö”ùñ™¬‘=Lƺ’Ê K³ÍÈ?>l2×3~ã5y蓮G3Ö˜cþÀÇ3Æßá÷MÚã/˜åg~îÉY`žêsöçÕmgJ³ÍÈ1“ןq›}sSL¯éÛM¹1Æ_˜e2R¦šõÇüÆŸ)\1ÎôÉXaŠüÆã1¤˜zŒ6‹÷•ÿYûìi^ÞVfüÆkr4½¦n«Á>«.§këdÓ{ØG¦À]fŽw™òóÍ€ä˜/ܧõGÉó|òóþ¡sw¤ß}ج{¹ŸyjÎ^ã®æœù!iFà{b‹kOR\åÏ­“ꞌ]xJJñ;" ³ºØ2e “6ã¿Q™§Ñ={(ˆ¸š¦N+Õ¡U‡+p¬99¯ã$&xsÆfá·Y)Ù[JH©XKhSnNpbê$^KøŸSའç,TpæêƒÁ4úÍž¾§~µSLÖð+鉈ng· ?àÎÝÌž¼O™3&¹¾2Œ=b/DÚ,Ø6Íï%©±ËYûlÊMC±±ax¶–×`ŸêV~¯Ý‰ó›Űq×R‘‡ëÔ-}ÿïŸì¾±'Æ~ó²ÞK΢tFÌÞŽ»ùý úõ¢Pç>'DDtkà2bÁEpÙaJü¡\—ò<¯YÂÐứî±1c æ´!Ðbýúg÷çó˜ò.ôœ0šVlÿ$óÏ8l0A§ž g ¦ßúæGU·ªm‚ SO¨žQ‹…ø»Iß•çœ2"<Úyîö´}ò­öYEÝB#®8-º3|H0|k¨°Gvâ þ£«˜ËͰŸãW*¾s:¯Þ[Ê—Ná¯Ï-á™Q¿"V·DäGJO+]dŽŸÝÆÕÅËxûq às•à65˜aˆnJÔñ],3à+dËŠ}TœøÎWVˆÛyñáVLñV–áÂïÿ:Z×>6îsaðQ¸c+¥±Í‰®I´cõ–Rþmn?íBê·¦qÑJÖä¸Ãñ-ó˜µ4Ï´uµû¬¢œöø¶49ò?6U4¦åÕ±]½†ò„ÖÄÚãbçü·)»«m"ÎŒSž/ÿÅ€¾/±¥Ô@PuêEbŠŽ~ûöÑŒÀ%<'Ñ–Þý¿dÚK)fêA,Ž‹çšŸÕÇ‘[99šßKÇ©<›þ)ñq ´ï’Ȭù¯²ôªþÜáÅO#}v.‡JòûA­pZª9žÓ‚5òZîh±€Iýž Òé¤i—T’o©¼*>ãÖบÞãúÓ¦VÕÛº(¶DÝDïž;˜«,gd;z>¼•ÌŒÞ1{+÷O ðæ¼Ïë;®çчâΪ­ñ¯yô¶é¼2àqÜV?î FtêÕFZ+ZD~Ìã’–!þ‰0.r6Bq“¶\ígÿ¼!dz“™Ð­ gDDD3—|d³T¼ž×Fü ¯¼ámxd`#…ÑŒ€ˆˆˆœ=,(""¢ """ """¢ """ """r‰»Lþ|ÐÃEczV>ÇórˆèñÏvŒVˆf.jÚhÔy8ž¾?¯­i‘Ë+ˆˆˆˆ‚€ˆˆˆ(ˆˆˆˆ‚€ˆˆˆ‚€š@DDDA@DDDDDDärrÙ¼Pè໓y>+Ÿc9EÔJTÇ‹ˆˆXŒ1æ›fggÓ®];µŽˆˆÈ%N·DDDDDDDA@DDDDDDDA@DDDDDDäRõƒ¼GÀW°‚ßæ‹â2jý"…§ÿ”@¸E!""rYÌÕùÉãÿƤô®øV|Ä·:BDDä² 'YBB±áèDDD.à ì$ÒŸËç‡Ý """—[ ¬%é^—…OõaÒ†õ†ˆˆÈEöÃ.:Tñ9 ÞÈ¥Ó¸ü±E¨zCDDärš0ùð_ÁuCÑ ˆˆˆ\fA€O(ˆˆˆ\†AÀ_~ŒŠ PlJ"""?ˆäÿÑ•¼0i!{ ]ÔýÕ`‡¨#DDD~cÌY¹—M»víÔ:"""—8­5 ""¢ """ """¢ """ """¢ """ """¢ """ """¢ """ """¢ """ """¢ """ """¢ """ """¢ """ """¢ """ """¢ """Ëÿ?Yçk«ªUIEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/15_apply-for-services/000077500000000000000000000000001516513262500275125ustar00rootroot00000000000000151_monitored_services.png000066400000000000000000001615101516513262500344360ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/15_apply-for-services‰PNG  IHDRº7E;â‚ ²iCCPICC ProfileH‰•–TSYÇï{/½Ð¡H ½ Ò«”Ð(½Ú %”‚ˆ •AÇ‚Š¨#8¢àX ŠmPPÀ‚NAEY ¢¢²XÂÎîÙݳ_ÎÍý/÷}÷ÿÝ—{ÎJ?[ HƒåHçg C}=Ñ1± ¼àÀÙ‘€Иÿ{45ß3›ªõï¿ÿ×ç&ˆ8@Á(ÇsEœt”Ï¢£•#f€d£yÝU™‚).GYQˆ DùÔ'ÍpûÇÏðƒé5ᡞ(@ °ÙÂ$ÈŸÐ<#‹“„Ö¡¨ lÁçòø(û¡ìÊIfsQÞŠòüôôŒ)F5£øª“ô—šñÒšlv’”gz™‚O$Hc¯þ?ãGzšxvtP’…~¡è¬†žYujF€”ùñ‹ƒf™Ç^?ÍÉb¿ˆYæˆd YA+ä B¡P %A|H ­…6C…PT j _ óÐèÔ=„ aèôF` ¬kÀðØfÂp8¼ N‚WÂ9p¼.+àp|¾÷Àø5<†„ŒÐmÄ q@<‘ $ID„Èz¤)F*:¤é@î!dùŒÁahÆ ãŒñÃD`8˜•˜õ˜í˜RL5¦Ó޹‡ÀŒb¾c©Xu¬)Ö ËÂFc“°«°ùØblöö*¶;„ýˆÃáè8Cœ=΃KÁ­ÁmÇÄÕãZp]¸AÜWÅ›â]ðAx6>Ÿ?€?¿ŒïÆá?È-‚Á‡Kà6Š Ç —Ý„„ ¢QŸèD "r‰«‰;‰G‰ÍÄ;Ä!âIždHr!…“RHI%¤:ÒUR?é=™LÖ!;’CÈH>]~»üqùò/ð  Þ \…<…J…6…ABÓ¥yÒ8´Í´£´«´!Eœ¢¡"K1E±Pñ¤b§â¨’‚’R¤R¶R™ÒE% ¡ÐYô4úNúiz/ý‹²†2S9Ay›rr·ò¸Ê<w•••z••/ª UoÕTÕݪªOÔ0j&j!j«Ô©]U™§8Ïyg^Á¼Óó©Ãê&ê¡êkÔ+Õo«ihjøj4h´iŒhÒ5Ý5S4÷j^ÒÖ¢i¹jñ´öj]ÖzÅPb0iŒF;cT[]ÛO[¬}D»S{BÇP'Bg“N½Î]’®ƒn¢î^ÝVÝQ=-½Ezkõjõéõô“õ÷ëwèDl1h4xi¨bÈ2Ì1¬5ì7¢¹­4ª0ºoŒ3v0N5>h|×6±5I6)3¹c ›Ú™òLšvÍÇÎwœÏŸ_1¿ÏŒbÆ4Ë2«50§›šo2o4³@oAì‚Ý :|·°µH³8jñØRÁÒßr“e³å;++ŽU™Õ}kªµõë&ë·6¦6 6‡lØÒlÙn±mµýfgo'´«³¶×³³/·ïsPtvØîpÝëèá¸Áñ‚ãg';§L§ÓN:›9§:w~¹Ðpa£ ]t\Ø.G\$® ×8ן\%nÚnl· ·gîºî\÷*÷Lcf óó‡…‡ÐãœÇ¸§“ç:Ï/ÄË׫À«Ó[Á;»Ôû©ŽO’O­Ï¨¯­ïß?¬_€ßn¿>–‹ÃªaúÛû¯óo „”< 4 6/‚ù/Ú³¨±þbþâÆ Ä Úô$Ø0xeð¯!¸à²ç¡–¡kC;Âha+ÂŽ‡} ÷ßþ8Â(BÑ)¹4²&r<Ê+ª(J½ z]ô­µ^LS,>62¶*vl‰÷’}K†–Ú.Í_Ú»ÌpYö²ËÕ–§-¿¸Bv{Å™8l\TÜñ¸¯ì v{,ž_?Êñäìç¼æºs÷r‡\Š^$º$%¾LrIÚ“4œì–\œ<Âóä•òÞ¦ø¥NO J=–:™•VŸNHK?ÏWà§òÛ343²3º¦‚|d¥ÓÊ}+G…Â*$Z&jÊTD Ïm±‘øñ@–kVYÖ§U‘«ÎdËgó³o¯6Y½mõ‹ŸœŸ×`ÖpÖ´®Õ^»qíÀ:æº#ë¡õñë[7ènÈÛ0”ë›[½‘´1uão›,6mú°9jssžF^nÞà¾?ÔæËä óû¶8o9¼³•·µs›õ¶Û¾p nZ~ÝÎÙ~óGËK~œÜ‘¸£s§ÝÎC»p»ø»zw»í®.’/Ê)ܳhOÃ^ÆÞ‚½ö­Øw£Ø¦øð~Ò~ñ~II`IÓ½»|-M.í)ó(«/W/ßV>~{°ûû¡ºÃ‡ ù‰÷Óƒ#¾G* *Š+q•Y•ÏFíøÙáçš*µªÂªoÇøÇ$Õ¡Õí5ö55ÇÕſtkŵÃ'–ž¸{ÒëdSYÝ‘zz}á)pJ|êÕ/q¿ôž8ÝzÆáLÝYý³åçhç  †Õ £É’¦˜¦®óþç[››Ïýjþë± ÚÊ.*]Üy‰t)ïÒäåœËc-‚–‘+IW[W´>n‹n»ßÒÞy5àêõk>×Ú:˜—¯»\¿pÃéÆù›7oÙÝj¸m{ûÜo¶¿ë´ël¸c§é®ãÝæ®…]—ºÝº¯Üóºwí>ëþ­žÅ=]½½ú–öIp¼|˜öðí£¬Gsû±ýOäž?UZñ»ñïõ;ÉůÛÏž=ä ¾þCôÇס¼çÔçÅ/´^Ô¼´zyaØgøî«%¯†^ ^OŒäÿMþoåoŒÞœýÓýÏۣѣCo…o'ßm¯úþØ›­cÁcO?¦œ/ø¤ú©ú³ÃçŽ/Q_^L¬úŠÿZòÍø[ó÷€ïý“é““¶=mtÀ‰‰¼;5Ú]H23>y: o?Mà?ñŒ—žÔ¹TæáP@I êAPVB9ÃÝlm-ÿQ¢µÕL-r#jMŠ''ߣ. o À·¾ÉɉÆÉÉoU¨ØG´|œñçSÁD½ aº¶ìñ\ð/ñw¨¨÷¹¹¾þiTXtXML:com.adobe.xmp 698 311 Î.h@IDATxì} T•ךÞso9΀½h.ÆKf€N[OZp IÑ„•H'f쓹p[HGb1êz£Ž’Åb¢^®˜ †epè fd-Äâ½568Ùd LA‡˜-‡ŽÇÎíóîïûΜÀ?¸7‹ó}ßþy÷ÞÏ·÷÷¾ûÝïÞû[¿ ƒv€F@# Ðh4y†À·çY}tu4€F@# Ðh4 -èꆠÐh4€F@#0/Ђî¼|­ºR€F@# Ðh4ZÐÕm@# Ðh4€F`^" ÝyùZu¥4€F@# Ðh´ «Û€F@# Ðh4À¼D@ ºóòµêJi4€F@# ÐhAW·€F@# Ðh4y‰€tçåkÕ•Òh4€F@# Ђ®n€F@# Ðh4ó-èÎËת+¥Ðh4€F@# ]Ý4€F@# Ðhæ%ZЗ¯UWJ# Ðh4€F@ ºº h4€F@# ÐÌK´ ;/_«®”F@# Ðh4€tuÐh4€F@# ˜—hAw^¾V])€F@# Ðh4ˆ‡‚‘îŸãðþ“pßö²86¤¾ñSìZ|Ñy –ÚáX¾ða(æe¸ƒŸŸÚ÷7X¾nv½˜8A\¤xP<¦íôÎ-¸Ý7p `Ú‡ýkÒýé û´‡$›l†}Áƒj/:_€F@#ðè#0eA·»¶oU»CÖxñ2'\_ËŽå!Ã'ôqã÷Þz7}‘¼øòÆmt~z û«oÂöB >Þèð…>œ7^ô´¸qó6à¹áy8‹¨K¥ÀãÙNG¾¼ˆâýùþm(©úއ\ÒõÞêÄÍù"ÞWÆþZÐÕ}W# ÐÜ3St½##a3¹}³ ÿ:_Ç颧¥1¹ñ…OÈM}ó=ìzv1Fî,Ä‹O0¿›x蕹&* £xCAW.³á:~Ÿ¹Ý¸³|6®{ØýÙ¨ñü¦ñMçÏqñ37nŒ$âõÍ/BZ÷Dn®Þÿl·Ó‰êðЄÙlfQâßtâÂÅÏÐsãžÛ¼ñ!~µdûд]€Fà‘G`Ê‚®¿¦‹±·ê4ž¦Vä…ßw Š_¤®ð¶}€cW(z.€¡Ðä›[¸ía Ûb,_¬Néùüs“ôbó¿qû6É>‰¥’(„ûæÖ-x¨™(Nˆd3ð2˜ªQg`ñ“Kªh##ß`dD0YˆÅO,SËopåd%. ¨¶¥pQÐ/àÖ­j|¼ÌcyÈ<¦\ –åÖmß¡ O._:¦,c©0_jÜÏ'BUllôIŸïà›[·Uû,–‹‡ÇÝaÛÁˆ´Ÿ… YßÉË6ÂöÆñž\ŒãÍ+•8IBãÅ\ ºã_h@µ§òþgŠ›ÑN¿¹uƒýÆŋÙNCVoæíìÎÈ-|-ƒ@æá½B—žü&„{çÒ‡¤‹0/}b’vi}gÆ÷¹…öâg?s)Óë+1ró *Ï_R˜Û:]p<=þ…Üa¿¸m +qÀ› ¼½Ãò~í‘>XÖ©á'ß)éKYOví4€F`–¸A7ÊÇp3ÚW½†÷wŽ àðUU¤¶êOñÍs¯‚ÙH'NãRâVF‘—½€#?ÙˆD~Ì»/üÅçošU¹Ãß7ïý—e/• ì5‡òè¬ý1öT÷Ë^AÉkàtäy_Ä„WJðÓñÄs¤û Š÷œDPÖkÞÀO6?Vã|ãÓ}øÑmLíÀ3%†mM+¶æ+­³#ÿ=”¬[®òüâÄì¿z/•TÁ,žò_`»/>*Æþó~3WJ*ðC‡ÁHoüü~üî%C°S)ŒŸÞ8‚ωmï>ÚP`¹佈‚ï_ÄbâpŲ́ûÊ)ì9Lc Óofú;7>EÎ>PD±÷‡È+æî²\T•e‡\9UŒ“—zT|ãgÞ8ò<'/HÜNü8gzxûÒ›;1Ry¬v“’\øq*%2í Kª~ )ëÆ¾ï¿A7ÿ½3X·|n|þIç•`()”[ìÄÞ’xšáâF:?BÞã=XK¹òYü ªNÿ0ô;%ß7±È=rÙ‰BSðÍÃyÖŽ×q¦äEÕž¿ùü„jÃÎOÑæzÞ Â…ñY§7Ž”„Äæ•½%Xx~ªÝV[w`oE D~êüh+Š•+4nc¿´óÅ/±Ü¯…(÷äï*¸IN¹¶[|÷'øî­þXmÈJ7Q;³â„ºúûéKxsÝÞýàª/š3ÿ¶=}¿÷£“¾™Û˜™ ‘ŸãXña´É;ò¹exeï.üði£ÿÉ{¬ÝšZ7!á•ÈÅŰ}îNg-röT“Ò2¶É2$Ü`›*¾ä£|i?û %À;TóºŽã|pà|e/vþðiß÷/°ž;YÏêž~:SÂï7öm*F›ÕllËXJÿ;ñRßh4À=!0+».<±*k¬ÙÁÛ4EPV7°/o)äÚàLuP_AwóÞ*¾@트Åê×ú±-^ŒeËø¡ç5¤³¬'nžr%nÏùb\¹a¦¢€“÷–)äÚê\¦n^=‰âÚn3ÒøË“O9MO7>ï12“)g‹í¸¯~a–û>i,iU‚)š){Îb¸â}¾øXE»ýe‹rœ©xá…T—Nî‡Û¬ßÒ„ÀúS›Å©W§éwãÊ>¼e ¹¶'œË ௞| µÝ\n³ÜT³,7/Öúò¯Ïk>U!k~ø ¬;¸²/Ï'ä.cyL”pò­Ãè4^ã{Í:ß5„\E$äÏB<ý¢Ã éÁ…/¬Z·~^£„\²Ÿ!÷ç‡ð#Ÿ» ©kÌt·Û°ÿGyøù­ø7#÷§WýÑz®*Í&hWÜ"¾ /â)ÅýQ”÷K;Qõ³*¼î4„PŠ œ5â8\GPQõ3ü´h6nÜ…ÓG^1SÜ#‘âÅ¢÷‘k—²4ëùñÇÔÖŠ&«žl3â'P+ûÓ"•ÆK‹ ¯‹Ÿ~É›åÈöaÚ† –ô<ò…)ˆ9𢓂׫ð“:€2–§¬j¯)ìºqåK³À¤¸À ¯~×¼qïá§Ù ¾þÛåϼâ"Zj®˜XƒÚ“ 1¼´Ql¸oàÃwgÑž‹–m׿T•äš„¼x×ý”ƒï|°O¸ö/–ü|óêçª,·ÜW¨SµœmJÒíÆU¥RKÀ3ê….„ë½÷ùO³ÝnÄÆ]?õ·S¯ê5™$±yiç{øYÕ¤Z¯½§Gå9¾Œ²ÍÏáj•hâ÷?sÜüù©¯à”þì}Åáó>UÚÐTÚ™/É„7‹S_W}áÍT³‘JìÅ©ì—gðÞ©¾´´œ¡“¾{Òç§¾›¥]–ø,Wû¾6À ô9AófAâ:¼ïëwœ©(y—mfÏa·øôC£oóÞ‘kô‹’ÓUÈM0^ª÷êa|jŽ s¦êÀûxÿ½$,œ~·~þ‘/¯„—öâôO9+õqòV Ì@ßk4À½ 0K‚îø¬oßøÆçùÙ•‹¸pá>úð’éwm¦´àõÅâõ`ÚÅß;q¤ì5.T[€åÔ‚;/mH- l/0ïZ|hMÑRã(¨X1ër¬1…Ó›Ÿ}A!å®¶X…’=p“ÉÝøüªŠîxÑ?©<ä‡Óá^[Ean!BíB±ð ,¤IÇ•ÚqâÄ šWœ÷%õç ƒ äF<ðé³zÚp‘˜^ ‹¦äv»EÊLûæ_ñi /Õ|¦èßøÌ0X¼æe’1rÛz>»¢ÞOíGúµ×Ÿ÷øÊeÝ8_·ö¥ËÇÙZ[q°Ð—õJ¨éúBšAçEÓÞø¼"sÃ#·}õò¨ébF[èXåÓFãÆ UÝ{¼±S#¨ÜíÏÑsç:¯¶Qú¬íkš{´QÿJçxÑ·•ÓBÚØŽt~ÚOñ=žó=f:Cãi>ø.Î×àµUËY‰¥°?iyûÿ»eXЃ7ðîýÏn‹×ìå6xvfºOÿ0×7°¼ýÛÐÛY`‰CÞÛÖàÀ.ØÐöz¹%è.ÆÎ#»`—¾Ë÷íGH(°ïZŸ Û Xc7EY¶)«_rnÀ7hôå9YŸóEôßÐìÚçïoß°zØb¼´Fð·«^²5…aµ ¢bü¦â½²°Ó¾vérÚËO¿¯¿ô÷Á5¾™…p8ÙŽ´Óh4YAàltCåK‘ðkËŸ‹)l#pqÓò@Ï¥jTúžŒßBè1þê1˜û±Ìê$•  ;=A¶}—ª+ ÿÀß èÛ_|†ó«WiJÙ†Ï~.ÐTª®ÉÅÓ=Õ¸ØÃ +Ÿa¤7dÑkB0¤eO%ø5u#Œ6ƹ?»äž1¾ãM¸C…”¬ºR‰gqÌTKŸ†+¨îaûµç©ø¢ÆˆûJ¶Á°o|¶ç*+7Ð…xA –°qìý¤¾ò>p_b€—8`ð´]T‘RßÈV¶Ûõˆ2æ‹M"O‘´ô˜³pYîx†oJÌEnâçŸ}†¯Es»l òŸîA%_hOÛ|Æw-.õà|ôãLá5ùJ˜`µHŸ×Œn&{ÿ3Å-jq€.ú1±¾Ÿ Û™•&ÜõÉÅǺ(ÿ¢®Å01¸ÇŠ"}×úlpg@ A£êwVdÿu²>ç9ÙÝ:}ß-–= ðOªuð ÉGmÙrß,†øM?›ÍªaGÖ={͈²¾Ñh4"0+‚®Ø_^µx¥c µbä«8÷n.4“ÅX®„6üna ñ{OíÎ3'X@»U2OÅ0eAÔj«‚rö3Ú¹-}j™ÖUNo÷àƒw{TŒ§_|khÏy±§îó<ØB|mk ã\ zhl ¶3¥§Å©ù(Ù¼‹{daÌù±1ýÏQþÛ… OӴ༡u¥­kEÙKX¨ý&¦o^ˆ5®5¨V obßÞ‚÷6épÔ3æ"¯å«œ|?=Šø2YÈç"J0…z?áþR¿{âé9Õ|Iáä®¤í±ŠâÄŸ5[¸Ü_¯oKÁ,÷5Ü=Öýø«_öæêýŽ3·ެáÀæëvéäI¼ìéçðÜšN%èò…â¤* ×ú™Ð 5¿›¹ëEÏ$”©b3®|“y¾ÿ{Ä-tÁ£=KOmKx Kž˜b; MÙçëñÝ…¹ hp#°ï~mhô-Yó|ëf¾ .®}š›Ò¸nS³-e2rýº§3löSÏ©÷S õô|Í™˜åF^¯å>K¢Ðh4SCàžLîŒðCÌiànôyí>lz÷ª/·ÜüUê~!§ð,wõB FD3ÿeêš»6Í‘£ÉÀR‹uqAmm­|å*SöfýÄSxfq`ÑÔ‚³å †nÙ‹Ï;KøMv;Òó…Ï>4uÝsjàž/>÷'óKrþ2~Íí­¬ h mÝÓ, ¥s$ ndÍæ"O8_ôMG{MaÒáòïߺp¡n^½€/GüïGvc¸1£”ˆWÖˆ„ü\ÙrK)³Þ«}‹ðÄT Íª_§€åÞky_R 鯩­Æî þ‰î–âÙ1eYõÌSX˜( Üâg`nŒNߎ[=ç`9FðÅÕd«yù}&½ó/[óL©íûÞyàûŸn“”èæç\ˆgÆq_¬1O|¶¯J¤p7õv6I6Ó ^H“3‰÷*>õÙ—wš6ÔFí©%ýN“zPô€vu[I´FèbŸfþ6j.ºÍ$òþ­–iCÂd˜"~¶ÅÆN,’IÍGÜ­†6ÊÝÜ•¥øâTGqfñôE# ÐhÂ"pݛؿ)'$ÁTnq•hp¡åÏ½Ž—ª[”ýèí–¸EÖ‡ÜQáIx¾¾ 1q{ÛrmtÌÇ_”g·íDeÞ~%T¶|°ßÿ»9<…¯©©‘½*'>é ¬zf.ZÌ&a ž¢VgAÂ* FçÑcf·ê™„ñOâ³ð)¿&óRqZ(0šû]Üóc,çÖ^/CÅð…ßy/aÓ÷¯bYêkø í_ßûZÔ)O·ñÁž|¸xžŒòP u›‘_àŸ†€¸ÀŽ\ x²šá–ÁõŒ_¸Åòç¸@¯–Û^1“Û-(æ–W‹¹ãE”çkžðF”fx"ã¥W€«•fÞ xí9 P>·¯ï\ƒMJãìFqÞ8¸´ÝíSçÒŽóçTì…O&ðò®»ºyÕ>"S¾Ixöªs/šñx†³ "0É+ìé1¼ÖÈNæý*ÖΟç·Ëûó÷ÈÛ7Q¼é޼¿ 52“ª‹OH ð\ì{¡·ñî¦ïã¤,ÈR”qn‚÷?EÜÆ‘ëÁÒ¾‘fFÄÖ'ô%øÚÈ”ÛÙXº3|~îõø`Óa…÷yö‘ÏxÜnßqÍNÚæÏ0I¾f–»zx>ã¶^¯`ßãwkÍ›Ô •ìäòƒÏXîáD³-^³“»†X)Ã]Ù¾§ÐOŸãÂMš iãùA8‚Ú_# Ðhî{ÒèçE G*÷µ}¯ »‚„™'ðÚé ¼á³{¤•$MC°[ŒÄ€)Yƒ^HŽ/¦°ã]@ZÙ*Èr¾¨ ŸÆéŠx“rœ·—¼?ç>­Q¾ˆVÊàkÂ3†VZ|/™ Îp¡Z‚ωg¬…2–—u  mói~̺-p`Ûk¬˜Ä†^“ ´,¯›èö÷Ïm;ßBu±ûò– xâé×Pqà ß–GÞÛÜŽH ¹²˜=1.Gö+aØR¹)¾%É™¾Že8ðÆ 4Õ0Ümb$B®8çøDÛHþwAâ3¾-ç¿ðÚ¸¼—®ÚŒ÷öæš»<Üö ¹6,JÞ«,e×ÒgQ”ï ÈȆܒäš+Óm ¦æ7 ÆØÛ…jbøÚœkLár!œk,àmp|ÉÚ³ñ†|rÿæë4Ç0Ýí/yÈ‚õ`\ý¯ÛÁYeh§ËŸÛ†×S—ù"{9³0–F Åpïʸ qŸ°æ8ùâ}B®Íïð½§é´³ä ¯ÛŠ ÿø>¯¥«PõÞ^¤.3|nZB®ï ä}l^e©|høós1¶ÏDóÙ!ˆz^Oõ…z½7aœÞ½›«ÞC®ù®¼7-!—6ù4cyóÓ¾4¾›€÷lùM ?~§Ž”äûúŸ¤µ¥æcg®ÕÞÃ|­LôU# Ðh&Eà[¿ ›4ÖL#ÜQÓµ ÔwÛÆéöû÷—ÓÛDÃfdÍéùû—uxÔÌ2ÉHFyxÊmmRX`€äK;¸¶…ÂÉuð…pÑ On²˜·œÜuïU3NcæŠz(ûÜ€l§t;â¶l©­8í\C¤ù†õ`Öw¨S {Úqø†æ2 d׊{¯hˆÜÃ{IÛyÖ‡-Ûñ'"¨}Oᩇ(š$À7mÁaÌÓ„ï*¸¡7öQ°'ªÜIcÌ(( âìµ³¢S¸µòåkŸ°|S >ÊDïTÚœ¤dò(»{mvV=„”¯-Ƀϱ]ñ#5§õôå¥o4Àã…Àýt/Lumiýyèû?â^tÎ7ñ³¢g5&€F@# Ðhî;³`ºpßˬ3|Èè®=f¹,gþk~3‡¼Øºx€F@# ÐÌ3´Fwž½Ð‡£:wÔ4¬2·¸×ùÞ‡£"º€F@# Ð<ÂhA÷~yºè€F@# Ðh4áЦ á±Ñ!€F@# Ðh40SÚG÷YÝ­F@# Ðh4€FàB@›.BÆ!g{>’¥ •¨jì YЏ”4$EÙàõzÐÛ܊бB&²g\ÚZ¤Œþ¶&4vÎES.ŠŽ¡¡!|þùçøË¿üKõÿõ×_cñâÅøÞ÷¾‡úOÿ)þÙ?ûgX°`A˜Ô³ïí€Ç+tmˆZ´l¢óÈ àÚÙzöµX¬}5KæQÍÕªhAw:oÎÛŽw6gŽÃ–oc…Ù9Û+÷àxó Ò !ß5г׃ÖO.£y4ÎìЂ®»fʯŽÂÃØê$—ÔN#0ô÷÷ãÏÿüÏñþÁ?KÝãa{m=1ÑžS„«ãU~ž®l;Tcæ‚¢jàçíoÁæâÓaË4µ€4¬[Ÿ¥XLÝÙ«ÂÔ²W±â‘œX~ƒ"ì¬ó8A7 »öç"iI€‘û2*6Ϻ`žµn=RÉÍ¢{µ ;7x¿¢¶´´àã?ÆÈÈHP–ß|ó ä_úimm-víÚ…ØØØ 8³ýà麆²ò3覲%ÐE§mÁ‘ü^î½§µ—1ŠH8^¦ û E‚GÅY-ù}teºD48ÂÿöoÿvV+"Ä~ù—O=õÔvÖ»0úç0îÊh4€‡Hþ^þÍÌuààÆRtGgàđܱä§DÚ&eåϘ²Y‰3 áJBbâL„Ü™—Ó*¾>¼H_JHHðPÓÏ>ûÌ÷<ÙMD„ÿóò7ó7øÓ?ýSÕ?Qƒ#N¾Çëi¿1J­¿qï@o›å1#M „FÈlüö¢µ¥ ‰‘^¸û z®]Ç™…þkGQ|¦s62™„Æ ïkcX>G_»e!äzûÑÒÔ,ŠG|ììàœÐÖÚ‚èÄHôwöŽ Òϱ‰ÿ÷ÿþßã¿ý·ÿ6i)~ý×O<ñĤñfÁÓQm¥ŠDÌʵÈÉtW ¢³­ýÑaÖL2|Pi£"!²íh8&ü ÊõçëçDs Â;wðÞ{ïá/þâ/æ4'YóÛ¿ýÛÈÌÌœ“|ŒîhCDÀ(-€¿yz{Q]VNíÆ zŽŒ[‰üÂMpšs½MÕ(¯iÂà¨Á¢ŸßŽÝ¯Æãì;eè–ÃØüF/¶ÙùÄ#}#ÓÓ'"+3ó±i½Ó æÕ†þ¦³xëÌe%˜Ç­taǦLÕù»›P×0ˆÌÄt$‰í‚§ •,k³bGÀþ|v¼jÒb=ΕW¢ÁÝUÒˆDlw+Ú†(§­‹u>í«3wË»,ÿ<ú~üXÜnÚ´ QQÁ PúïW_}²þ"´Êâ³xšÅ,]ºK– þ‹/¾@ee%þïÿý¿Ê6Wìu׬Yƒ… â÷ÿ÷½¿ú«¿R Ónß¾’ö´=m±H[‡æú>¸Ò’B²œìÂ"d:âaô_/ºÚP~è4glìØ~x+’£†ÐÖ6{j²ê;ž~†—£“O‰‰vöú h’EÈ»zŽ%5aÛ¾*س ‘Gf¾Äü@xºPW~,ì®íØš™Oo#“(”-›Ñ–´¹+Ì©\/z[j°ï´! -ûsS z28˜ oÅšƒ Ðd¡íÌ™qZÜW˜|ì9Ø¿5‹<ýèŒÄ ì¯o}…ï,ý.0Ô…²¥¬?]Ê+HÅpK5Üщ´Ã^[¿hY9â·¡(Îø%fYk•Øw¦®-%ÈXkø{ÐRSŽÓJ‚Â"40ªåO#Ùi7}>ùä“I…ܸ¸8üÎïüŽ€N?‡é¤ðâ“*SÈM+Ä|?¿ZáL÷š€wz»ê°çhbÓ_Fâ`êÝÃdvìv¡«º õ|Žv°mÅ 1é©+ÃÑOú‘¾>ƒuçྋhûZlÍMBÍÁ t’ÿÊsÑŽõXòìƒåhêT¼."2ù[ñªSÚ´uG‹ñ Ûwn® 5è#CŒcÜŸ®ÚëPû9*¯Ç ý££#M…˜¿Z¡y~²?‚¾›S¾=§ÔˆÿçÿüŸç\È•ìDKôGôGÆ9wnõ•gqîœüŸCC×P@V¨xkŸø¢Ï#;-£}×Q¾wÚE¡âmC;üàè"<Ÿ“ÇpŒÁ¬S‘I&Ny8í!mh‡Ú*°O¥F†k-ì¶Q\¯/Çžêö€2 ¢–B.âb #™¾ë5(«3´-žþn ÷ÑN×üÿÖ!%ä:žÏFZ¢ —ËQÑ&õ1êQ/Bn´«äÓHÁØë ]ÎöjC°—‘z^ÎZ2¬h“aKß>´È¢±@'Ú±B®„‹M_ aU–‰“ûµk×âþÃèrÅ_úˆ¹âþßÿûJ µv`ˆŽŽVLVvhø•_ùg¦?^ÃøI©$•ƶ,¬ ý´ %ÈrŠKª£ Cl×K’R±›Y‰Ñ m œrm¦Æ9*ÖŒIÍðEQLKÛÂhŽM{CvoÏú9ïCf¾5Ë©„ÒÞô³LQK’°~w„Dt¤t6*Z“MóÎ=UˆüLr2yX¦øT6¨<ÓP’›®èy)„öN¬m°´«QI(8u»6¬•‚Že ›Ot¿;,5À"ä “¹)ÚcñKÆZ”.;á„ÿ~w#")TÛ˜&Ê4´ÜP²©JÈõ¢¿·ò>gFá~dŠK·£«^â›ê*Pšw{ÞËŒI‡aímíèðø4ÖFŽúw:tuu¡¾¾>l’ï|ç;øáˆ¢¢¢û ä²Þ\WzŸh¬Ëö ¹Áœ˜wJ»¾;ŠÎÆÔs’"šÌíîh'ŸûPßDÊó°—ÝЬ§¿—;½ ¢±¦l­Â ‡;뱃Õ.›õÜ€6‰î„›,2=;9kW*Móåò6lÇý€I»Š~ƒìôН6×À-lt¨ ÅÇ !71íyØ£ÇôͰ<_SÿÜä}Ý×ÙiLçÅÄÄàÍ7ßœÃ÷ÿù?ÿ'>øà%ìvttàïý½¿7guël¾lh6Æäàm¯G«hZ#i¸õUŽéúß@-GŠ—[°‚}ÜèNmDãe޳LÎܵˆiìÄ`t* Ö oã<¸PݪüVR•+6¶ö(¼±¯ƒMàHÕr)y%(HE§Rk:ÑM;-o–Ø/ú©zÚ/ຨj#ÊæÐÆ¼›»Ýèlé†7ÒmÔƒa%G¶Ò¬žîUù¡ QÎASð #:Ù…­«Ç Fbýû0! 3 ?øÁÔV`uuuøÿñ?ªþ#ý4”¾?ù“?QA²€EvMèîîÆÉ“'CEW~¿ôK¿6Ì6"‹cÂåù©%N¦6–‚ÙÚXe¶Ðß;€X _†KA¦ÒÔp8Gä¾Ó͔ܶãT…Úx;2àö YbS¸íP#m|ߦ/OgÐl¤ÔÇfKê ¬æêÏÁ–Ó8DÓ…¼¢ª§yZ°wßif›Ã§²(DÆ"•$Z|õBSÅNT±[畘i¨9­ãoÆaÚárp)yÆ%e˜æød[1ê©5-:±#ä‚S!ÝWsÕÑEp¥R˜ç_RêzœHt ro)Y£l!ò¡t#/º®U².Æ÷fÃþ´Ãå 73‡öÀpŠÛÓO]¦õ“ŒíÔäŠá0ÓwœÛŒÒzñ'vÒþC]×Qs(ÜKÁ=Žš?ø>K@x:Q¼÷¸‘LÿÞUUUª‡J,³)¯¼òʸý­CÅ5?ï]³OÉ€(4ÕÉxg•ÊE§' ¶½³Ƥáð|ØÚÞÇ6.@é¢réÒÖŒF½2G6­F{å[\K3Ìè†F¹íý7¹^…‚sßV;8pÒ /É ŽÆ ¹ñ:Ü£½ r–†åµšgâZξ®OFõ[Ñ8<Š–Î!DSÓ¬X¾#‡^Ypë@çÆã~­.~8žoTHÿÎ5÷Mе4:2)Óšsád#ËÍíÞœÑÈ;|éJŠåGš‹ÑʹMœroPk\—HM(èvµItÀ•CÆ6ˆæ3ÇùÏn±v ¶®_ÁÄ"uŠ3¨XËð3~-š£¦Ö ±qJ˜¼Û‰>]*ƒÔT%š"&N®dˆÖÉ w¹ëÆ¡Í}Þ’‡ßn2‚&õc\ˆr:^ÎFLë v7ãx1?>œBÚBÍN(Ó‹1ÔôãD ??_­¸–"ü‹ñ/ð«¿ú«øïÿý¿C¶ ådk0ÑÞ=ùä“HK£ÄF' Î6oÞŒ?øƒ?€ h…F p+{æ 㵜ÄrE»+30ƒl£³á¼ýnôRSš‹—_fû§jG¯—‚®ŸºÕ·¤.ʹ©µ¤ÀF+ì¼ GÜZvP iV|+dìÕ"ƒ(s€`&ðÑçÔè0;–hKãih1;²”U„Ü@'šÓ‚SÉ^ˆ¥¦U9ö=%‹ëE zh<Í™¥º l/t!™BªmI2^Þ*¿” •1«5…\ñ«»Þ‹TšZبÕv¹ÌÁC[³2Tð¥Q7~¤F©ØtVÈ¢äL¼\=´Öµáeg…ù($§¯Ç)NOwÑÄëP¿%ÚM ÿý¿ÿ·Z.‘˜õ=Ä%\ÜYó·EP­C*¹Ð LŠ:ÆMÊ;ÍÙ„höáj?‹f‡Vì1í ­vf‘wd¤š·Fˆ=Å®ž#”Ä-"*§e{ŽS¸5CÿF#ëei¸Á³ ža£GÚ¢M€}4¨ QðüÐißYFྠº³\îN.p;” FF«©=)èèÁÕâ“¥{Ú^pé.jm8¥RÛÚ w}Ú^>ÿ„Žè`&vÑ>Æ'Ÿºˆ$5òt«d&å½G}UŸ¤>†ƒŠðCíÐ)j‡|<ímÆ â§AÝúËi‹]§VS˜¯CMe-WÕ’×´q%­¿VcSëç‹À÷¿ÿ}Ÿk•DÌä?œS±Ãë’©A[?9Bœl]´sçN%Ц§§«Á­lo$BîÊ•+U1c8|ø°Úîh6÷õ´ÑÒ½¹sÉ4ŠÔÛ+³vŒßÜŒ}“ 씳ú†ÐKÁ36ßðVÜ™·áû€Ϻxƒ…uï¨ÅŽý}eÓùƉ$ ÑÓ©)}g[)MâÞ‡>ŽS6ªMt!RJ@°ëkDéÞFl¡Fv…Ý.Ò³]ÑÈŽÍv.RÎfU]=õÕ4¢?ƒßšdfŠ”Bûeф߃ê¨ÃÎÒZVõcåX=ºZo®Ešk²Òœü–‰: )tÇŒî!ÇÇ+Éÿú_ÿëá«°-õºGqît2vg…jùF¹ÃòN³Z$ƒÜØç @ö]µrÜï9öYBÚkª”k§ÆvÇúxjl·QcË€±L>ô ô¶Jã[SËoJð÷bžHH ¢Ýœ RF›“œæ Ñà<¾RQ+28©ØLC÷f”Ÿµc]|7*®K‰DÚJÑ.u ¢¼™ZÜL8Rñ ]ÿ©AâŠ-RHÓüI7M{(è’bWK <±%´[ÑÖ•‹¬ä(ÄÒ¶Ðë@Lª1>špâ% ¶ÜŽåGážcì´©ÍiÁm]HSˆØTmà„J,û²J4€VY&¦Àc\CÓpZQÉØZ´ýœfOä'£¥½Èç,¦ù‡KMmuàÎacH!§è0R#‡ÑÙÝ &fäAöï†þèðù„•*ùèu!Ö\tçíï¤hÂuÖ¡Ë“Jmº ÎÜÃØîpc4:}uhâZ†õÜøW4ºEÛcÐ?‰øÄ%è¨-F§};²YõÎ6jãJЕ¯Ù¥pˆ µ×Xze õÐ9^v=úÒ˸Û]‹7÷ta½+10¹ëáŽtá@ÅsÂðÎþ¹«”% {»Õ¸JÈ%7vs[§3zŒàjñY£k 3©Šê$ãhìEŒc-J6¬Ù˜BDÌpÊsu( ÄÐF©pµˆÁc]<¶î/„ƒVýÃ(//Ç™úfZYˆ¸lÔÃÎzŒv3ìx9÷lVÓ¯UÎQ ßÔLïã€Ër#ãÒPè"çÒî¡EàôéÓ¡t6œhd+**|ôd±Ë?ù'ÿdBÒ"Ï®°m ód±ú¸·ko¹† ”\£|ê£Hµ¥´«íå°Ò¶ÎÕ鈧`æå®Õ{ËU‹’UëÙ2鱞­ð6Å϶$©¤· ¶çÚzé' ÊҹЊҷì2 ‹6CæÀ"×—¢ºÅ #‹ÔRSS‘»ÄØ¡ó4Ú No[D!W¦O­Bøn¬ÒÈ•¶,‹“y§Ë¢;úȮմ“˜0Ÿq,ÝO³¦Áo»ÜÕTç°Ê¡|úPzôzÕ´EH–º'Çc _I}iZº‹˜$§²~+»$6JÜÿZB›êô,îÉ«zÐÞPr„?c} kqh¨°©ø¹Ý4e;thÖÛ’_Åáí.Ä‘§Ü¤6ùM9÷Ôm¤ÙPtŒ(E&ã&ÓÃ{}fCfålQÆ]èè°Eˆâ³#+KÍ`ôµÖâLãVÚ…ßEcÅ'ÅÙbƒ“ Ò|–´Q+r‘CsD‰ßI!×›˜hšû1’Š7Ï7Jªço‘AýbŽóPäßyçÎRõA¦8·oß>'YÊæ×»wïV´ÅØ^l¤“}GÅ…Z½îe˜ð‚(Y½=¶F_kóØ`õLææG›¶@3ŠÀ¸²ÜKƒ1Eâ*æEK<¨xs¯Zdöüöx5ÙŸ³Ä5ò_äǎ«Ç¸r²LªÎ,S¸BPßÏ 7n¼g:«V­Âïþîï†L/ :ÛÛ¹žû^÷»ßU«³å%YÀ6ÖÉ®*çÏŸ÷yË)hÇû~ùå—*\°ýóþÏ}ñššš‚ìw}÷ë†Zèšc`¸­3>Õ+)i±¦íƒŸé§ÓæÁ´•Ÿ’:4$bÿî'ã”ÁªÏÑ1-ÆÆSÎBÙÇúb©›8ÆMâ”P$eˆAîŽÐDH¢LO0©{zŠKIQæPƒl?ba¹8;ÒâcX½Á`LhÊÂÅŽòUj~0§pX%œÑõÔ©S3J?ÓÄrıcÇÂ’‘¾)üqì÷\läÏž=‹ë×Y@1=úûÿ3“ÏÀwP¸Ë}´#É—¬-åü'âþX³}çå"YrLòdq.˜µÉŽ"SÌFñPî”b¥›lBž?6²~žU̡ϬÒÔÄLÆ~H±Qú4M×½{†]m|χC̨±ÃL_ qc‹²:é5U;a|¾±™B®Ä–¸áÊŰn\9E7$íù µhS‡ýáþ!þëý¯AÅ»zõªòû·ÿößòcüžÅÞ6Ð ³SÑJÊ. ¢í•d‡†åË—sßÕ$uíÚµÀd÷ÿž‹çÂÎÖO»4}hmèTzÒŸv¡è˜…él¥±ÑÔ\ãöM([OÏÔ²˜0VßX!ÝŠÍBƒIÂ( · ÄV|}Êöy‚Òçä´´uëÖùŽå–­Èd°jÍX|ûÛßVûaO@fFAQ\”>›ˆwÎ(ã ‹êkåhâ鸉x¨Ð™çO'#wÚhAwÚ=Š Áµ‹& ½\(cûœé+ µbít™§‡€hg—-[¦¶ß³vN¤ [Œr­pÑÉiK²E` fW´´bs{ëÖ-õ/³+² CCCƒbž"äŠX¶"“S×ä í4ÙC@®²'¶ìI=Ñ¢4јÖp1ô•+WT?–~è~ã7~cN¶ ÌCßkîZн_H?à|–$9±Ú¿ûÚ.ÎþA! §–É&ñáœ0¼K—.… Vþ"ìʱ¢)œš¶œhxezËÉvbb–j±Ùÿù?ÿG ¹Púª˜%¤_•––B¶ü7ÿæßà'?ù‰XNDþ믿lp8.@{hQôb´GôÅébkî_þå_ž0™ì”0³}±¹ÈÉ)iÚi4÷KȽqã†ÒÔÊ6€/½ôÒ=e.ö»2ë£F`¾  Ýùò&u=4³€ÀTm˜j¼Y(’&¡ÐL€@ +ÑÄ,¡ººYÜI@ö°žŽ“½µE#¬F`>! MæÓÛÔuÑÌ©›=Õx3,ŽN®ÐL€ÀX!׊*‹Aö³Ÿ©ã½Ÿ~úi|ôÑGj1¨>ö*'fggCvUÑN#0ßЂî|{£º> øë¿þkµ]˜Ã-+«Ç:Ù)AŽïý›¿ù›±AAÏ+V¬z|´_}õU —¾×hfpB®•ÍåË—ñ§ú§ÈËËCqq±:Ú[“±ÅóùÈ^Ö²íßL÷ßµòÕWÀÆ€tØéǹÊ&¤æ®G¼G“VšÀŒûÛΡɓŽõé¡™Œ9Û÷^´ã)Vé.¤ÇHÍv==19¦'LM´8b'ËÉ¢²ßþíßV ËoìõÙgŸUûaú‹`+{pÊž»–YƒÒ²g§ìÀÐÖf)ÍD±Ü+õ™gžQÛYûeÒšé}JZ†Ú[ÚÓjïØ©Q[»'‘5ûN?d‡رa— ¶¶”×O¸wØÔ*:Xqk±«À‰ÎêC¨½ÏYO§˜CÜÉ„\ YlöÓŸþ6lÚ¿Ú `W/<áð!Y÷mïö"2š[^ŽÛ݃žh‹‰EÀN`Ó«†œÂ] ]¯:Cç?=j³ûAò¿‡W™ €ç• ;•E4³šA£￱ÝÎBáÇÚÎÓ†æz$¹B ºí•oâx³‡OÜ÷­Àú›êQ7éº-õMZGAwz{NÿDzßgBBÂì ºEW{ ¢®C³'Û·æ#Ù™†µ¨Ožžóì”;O‡p­hkIå1Û~Á>D¤ ½â\Ex;3×ÞÙ†3}F ÈSï·ãQ½^9"˜Wí ÷"ä<$f <9stR²œ¨¯mÇúú¯•)!7£°¹ÎXx‡úÑ;L)ÎÛ}r¥â@¾ç¢´¼öÃ'‘>^Z5Ò„ûå±½âBX…Ì‚<8£Ã¥žÜ¿ë,6êÄöSo#yòØÁ1ÿ›D .ä£÷tßäÙ˜^ì…Ä~O6¤ŸK'Ó¯ÙÎ4ïþ†£8㎂=n½òNEœ-GÅe·…FÆ¥ pk’}Ó†®¦s¨>S¯xG\Š ; 2Uìw_Fm[œÎ$õìímÂуUè&ÿˆIÁŽ’$™B²˜”UÔcÐêfl9€ˆ3¥êèоÒÍhŠÉÀ‘¹ð¶×áµ[F¼8{”¥C:q­úžûM.‡­¼ZÙXô¢bÏQ´Žªt1ŽlìÚš…îŠ=¨ÎÄ»;2Mz¨x«È.A¿DM•GQÕÜͰ¬tíÀ¦ÌЛúJ•Fû›ñþ[5¸N†\Wox:Þ^T<Ê—¤\1< £™IR9ξSŒÑÌ\Ø*ÐØw‘qiر;ÿ¡3aaï«­«¬²ç¤î•.žøÿ£ôÔvF¢!'¦ b–`p$‚﫯¾ªÂšy”í¬¹ÎZ÷)ƒxÊV÷: º‹/Ûý†:ŒSñE[_F¼9êéï@MqiÀÉcX»k?v$Z£þŽ—Ö˜‰vbå £üÙdΙdÎÒ~½¨Ü[jf)¦dœ¤atWš.´Á™Iu1Ýê·O!•¦mÅ Èã¡.éf^`{®Ø¼/d±UÂH'ŠŽ žMÜ+Ú2}1'ˆ[»;Ö¯ð1ñ®&ì=Ô’¹ˆèªÃÞÒZ•Nä;à®ÞŒòþl”f"VM{ÑÑP‰ÒšP€IcÖî‰Iª>‚Y51S±íá騳 QHG}n¼,oY1jä]Ùópl«]m½HJMVážþv”ÈLFŒº?ÈßG[ÈälHÏÍåµÍtƒ µ8R“*B®8Û¢X$™¼²¿ñ9R$ s ínòú XY¿µ:H3”8Ù³GËp¹Óª oÝJÞêc½ä%çÊp¦^«H!O*P<É wC-܉1ì³FìÞ¦J­jæ0šœe¥ E› -þ¶så¨$ ƒÆaËálÔ¢º˜®”ƒû¸´-x;Ú©É.¯¿nh£É‘«¾ búÔ÷c¨Õï„àUý×ðÎ;g@FÇÚBl]‹JòÙá¬ÝØj~S0Ô„=;/`Ýþ„ã‹þ<ýwáåù…æ¯D!œlâmÇÁ·. 6`5ªÜq)9Ø]°Úüúsžë»ñ«Qæ(GYÍùƒüÀÇøæ(üê¯þ*¶nÝŠ9ÛdzŸÌŽ_è”-EÈNŠæ´løštœ=ˆr ¹N×”"i¸¥;ßÇ€™ÄFñ¶þLìÙypeØÑ×Zƒ²†^êéí°œd&Ž£ÙƒûªÐïp¡¤d žV:Ú`åÔl=†bÓPHánK^K¢‘îÊ`W`ÇLs¡ ‡6‹øjOSÈ}Eû‹P˜#ŒM‘÷AÛ©Ñë58Ó²9…Ùˆ»Û‡šOLíí§Ø{±¥¨[²t×¢¹Ÿ^ŽXŒv~‚6áýtÞŽz´RPu8–@p¨j„k{ ¶»¸^s LÊ1k¸kk0H:u° ú랎g‹÷¡yÐŽí%%p­ä©?‡Êaeq—GÐ6W•£eQi¦`´¯Ÿ¸Í‚†*Äcâçr¹fUÓóòË/ã;ßùŽBïÎ;•ß9±œèô¦‰ÒN–L¶=xÑ6–§ªÄvìÚM³!ò²Žkuhhé‚-6ùû H/Á –:(´÷y›œ‰íkã­Ž ]Ä#°ÅÙ©Í"s긆s×:€%ÉÈݾV…å°ß§RxõR l¨k@[G'ú¿pÃÝëQáýmPâ³g©xžÞT×5¡ÝÝVq*ßœ%+Rëé%½~-‹”Œ4E/6ÆOo;êÎÕ¡cÀ‹%Id£ýlîK’0b9™2›!¸íö³kµsç˜HÎtQ ÎÙ´‚æ ,wGYîölFž€MJDȵqpî\¿±È,ÜAR„"˜„Ï@IDAT;ý ¹^–»£ßKš+iTÅÑ?¾ð9[2Žmz»à¦´9Ô€=olT3@ß<Š6“Yöw‘/FØgŒIŒ³Töz<†ˆ@·^œÛSL!—v¸Û‹°«p-†É[÷”5™ÑHäîu ¹CȦyU†Ý†Vò¤:Å0¼èïF—©ÈñR;»B®Ýµ%Û]ð/–™ÌKñw ¹1¢wí"oÉÄ’EIx9ÃЧ¸ò-§· §)äÆ>_ˆýE[³neXAOøßõ3¡y•gh1é9(*¡ìá°ÁÍc›{±vfáf·8ZÇòyö.û’‰ùb0fÒÃÉ#Й@6!È4Q鯙òDeäÀ•£dœ« c 0‡Ï÷M£+uX³fú¦àñ·û·³^-Ù ² ñg–i?ÊŠkImHÁŠEèhfwµ…ƒÐƒfjCÅÆ¨ s…Êvë† l,mÄ…vò9•Ξ]tYJ¹“ŠÞ–Íhn¡@)Cuh£W{ÜÍJ;›‘nG§]’푸îîbÃÎDw£pñ¾• í÷”‹]ÉOA#ì)p®:cÅàWÔèr´ºÚŒgÄóË’E¬DÉ»›È’€E)u( ¨‘‰Z‚M̉ÜÖcKA$Gá]ä¢YékWUŠOš{ád…k)ýfsDI›§fj…㞇=FŒ’9.¿N†ÆÒ‡°Ãå$fa· ¢{Ûh«Ü‚.²èæpt¢»)äJ鈉àûH¦¶øzúIK„y "WæáÝMé ‡Îs2õLí²ól«Ç õ(?ÊÙöb/x”ïLê#¦ ¢ÅóYpæ4ñ•YœÏ>ûL”£4»bZ$Z^Y¬&‡TÈ*pŽgÇ¥a×±\ oÔ¸TW„ÖŠ²_ÈÅ@K5JÏ4«l#bOpÖÂ<;‡ò¡–‰¦5l¾ˆËÉ·ÓïHêÉtÙ¦¤ÿŠËà OúWw÷ FÙæ†ØÆ—ÄHÿJA²j€½ÔP–i(í]/#•èºPŽ*2dPC,΃˜ÞC8^«CþHoö´aóÞrÞöÂ1,·h—[9“#_„8;+‘Äü—,"#®³_ò»’‘GmšNæí麎Fâà"AOo7úx|,¨¥–4aµà¤ÝQ÷Jk;5Å;hº›ˆ¸”âšNŠÓÐÔövwc” rаDò ¡"n ýö¯'É ÔSˆwPÒMm¿‘Í#ù;¯„ܰoÀ˜ŽíëEF!gãbqúrö› ì?YÃÚ *H *ýOúÂ8çq£‘ü`eá.dªéÓxlÈ ’‰Závo:’TÏMÄ®S»yO—¶Ç9àìåÞô}'Q‹®»Q¾ qH·/Re°“½¸9¸Df´Á¢Ÿ§†2SÅOŠWÔØßø=`Ò2Ò¡X¯ù¡üª £1ëùWbŸÇD¼**9 ›(7(†–bG­»ƒüÞ¤®Ë@g€z °>¾‡9³“…%Äa"¾èËÔ¼‘b†”GÒÃÒ‰î /›XÚó•9%Ø´š˜xQ>(‡»{écl³Ç–e¶ŸùÚfß}üñÇ“=8û¹NNÑÎÿªU«&&F;§ß$s|Ë] Ïð(Ç,Çñfÿó8ðö«AP‘cõñHZI]P#¼w-IÀŸY´¬/á‚qó-5–ïcjÓÅ+V#ÈÌÁiL£‹Y¼š£fï]ö5aµ³nN]–o£lœ‚]æ)q—½-™¡„\ñ7MšŒ(CíxŸÚÒëbÿ B%QÅdjÐ"PU×OV ê(G¦j…AßeìÛkLéHš0ëmÕ'(:Ö¿ÐÆ)+_ú1Ìj„¥Ãˆn­ïr9üYøiÈÇÑ Ô¾)ÌcêþäOþrT¯,³„]9þ÷óÏ?ÇoþæoŽ[¤&0ýå_þ%Ο?±¯ý×ÿú_cÁ‚ =IsáÂ9rdÜlŠ|,Y&yý»÷ïTºœœu½{÷.Ž;†¿ø‹¿PÏ÷þ“¡¦écm´TnÃiC†Oδ35Ø«ÜÚ5H&›o±5;}fÒ(eŠ( êì¤AôŒÞ…Ô¬õ ¬œiâkÜö ¹âm¶A_^§ÑÔ‘ˆÕ¤eœBæËíT‡™¾gÚÁÎEÛÈÀ›–³¹«“}ŒšØYÓˆšïij_ÛmIü"páKC ím7¨ð¨øTäæúJï'8î΋a· [!E¡•Ê q!éE@|jüYxªD,K7µSÚGàñrYo¶i&Ñi°Þ)’`< Vb[¹}ÂÂ$ðî°šåo½8éBfÓRϾH˜ü[.‰‚!ÛÈÛLŸ̬@¯|™½šý_”F.Âà,(ßG3<Ó‘õú\¤CfF‚ð)™ÊKĉBÎ~–ÖÖcß¶z²Þ”„™¾ŸˆW uÐôü[Ji°^ãCeKÊÄJ\FcCµÉ­üÖÐÄ#‹­mB¾\jy #ØbÃÓ1D„’M„"÷Îà¢cÒã°’8÷ÙŜݬD{#+­gâ–,Y‚eË–)²›ÂŸýÙŸÍXx;A7>#kc‡ÕK—7ÖÛð µ'deŒoìªà„ …þNs:2 kÜŽJ N¶+±4ˆ•ªÞ¯¶†I&¸*h”ÚK>v%N€”*#Â#§²h\M›£Fœ®ÉÀöMLÈ©…ŽéšªŽãúÐJÚÄOQÞâ‚7ë“’º6U¥M(?êf=íœÎ•ÂrùP9òpjkºIeâ‹- Ìš„8~\ÚÂÑ¡¿t[ìLð.&Îûq µÐßú­ßÂþáúÌ Dh ÜvÌÂ¥¥¥EõEyîëëSÛýùŸÿ9d‡9v4”ÉÐÿøÿÃJ®®b¿;44ÄécŽà—Û²ç Š<͇-ûE“KMìFjb'Jk ³ß)G¼åéOhÊÃl`œb§÷@PÏT.<€Ê{ì{%HŒƒÙ;¢cÕ4½_¾è/¬yPfŸ÷í¹Èt6–0>ÑÉ¿l`oiœfRÞPLx:ô%qoY«(G+fef!#цˆÄ d­^a½ÇrQœºÄÝÖj4tQGËçjÇE+ÆÐFöê÷ë@S:È‚²Fv\ÇJc 3€¢8CÝñ™²JtqÚOŸ´·w)!Úž&Z˜>”—ÕqªÞ±ùk—¯Ù¢†9d8Nã6\Sé“+Õ´áô#BöK"QsÑŠ—‚JÛÙZõðz nm£ £#â.:ÙÙ¢ÓÖª!WS‚PÌt€BånÞ¼‰ßÿý߇l*®O6¤t°-Mp ÿLïí®]XA³\x¸l%'O á6äX²\0ùVnqÄ&›š W íÙÖn@š,^¤Ý«UìXämÏã¢S.(ãJoáý×ÇkÛº¤S,«¤iœ5JÉp)ûrY×%}1* …ÛI?% 96`-y¶ñÁ &‰~”]8eŸíŒ“E»[Ó6ßæS÷2|§ø É—Ed…ø´l¥s¤¶(É€‚tcmjÿÑþ¶FÃl µM Kœ.ºÒ`·§À%v‹F•.øÇ'ík3ìqX»Áe˜ô_gUÃÓim4¾U+\´ŸO³Óœj-g\ k7eeeÜIèw÷w±gÏÈ t¬{T„\¿ý]_)Ái¸¯ Öüå"dOŒ*~)bÕjeA$g+ílÔKÒ³È9É/+›TÕÛª+ÑMmáËjÙ4(4;h¿Ûzšü’¤¼Ü7·¦ÃL" ÖËÞr·u튵½@>ÆEÒ!]ƒ¿ºQÆ|‡8(ö t¡½K¾äk©äk}õ(«ãÀkWÄ–_º»¡Ê[_³n\ÈÕÐÐF>¿ˆ¬Ì°ßï58å ÒäÊzÑ¡¡^œ­1p ËW.yíZÖ`"禭K3<§ÉÃÊ#ЙH61 ñpüΉFW¦BÏqaƒtÒ‰àDÈ–Fò?Nå_ÿõ_GffælóÑP 0hê R7΂"Ú­ØW–„’­™´áÍç¿Pg90åƒÐn íx[…y©=®2A K§•ƒÜ†ägÒ¼)‡‰u¿Œ}ûM{øHó7Dú…ô—@gÙ°[W+ìQrE/X³³Tèˆë¬=޽µœf?&¼ƒÕÜ]x¾wù¥5“ˆÂýùjð&³z;¸Àó­Ò*ld{'ûè†6õ\„.ÞWŽCÛ6ª¸Ü.»v¬7îÙ¾ÉeÐ]w&ëÅÊœ"„b½Â_w¹<8TS…&óŠæ#\`º‚åÍ&¯­-ÇNÅz…ç8kç€1¢µ¥;ñ‰ì\†šr*Œì#¹ÐÚµÂüV™%².áyU2^N‹Cyóõ"†ßŒh¸QU\'m˜£–¤"#æ .q†ÙG{b¾håt #„ç¯áe“Ü]ñâ Û Ìçîá[D1WäGFF ZŸ¹Xx6Õ2Ëâ4™îyÇz9ì’®NÓíåh1£ŒhqR@µ:ºQc5©"tF›ºäh“s6†60É[â[~¢íôÒ&)j܉3SE”ñHcˆ4ŒSk$_ÉÂÊa:*Äõ—'ll‰Kº‹…ø L@ÇÀz†õ [¨‡3@ö¨ '‹Ådÿkˉ ;Á§Øáš?ˆ–XhZ³3rbÚÞ½{gl’d•ï^¯ÆjÆÍâøÝè£yFRD3:È…^¾`cVÌ` 6ŸögKÍoÍû9«,%Æ¥¤Px&~$â!í”(bJ?åIÍ2²DÓ©µÕËŸÁÔîT^ä!e †6Eè)O(Jv–1z\ƒcÊ·TLVìÔDÇPƒÔìÅ1< ËA–Ǧ/Ý|¹9uêÔŒ«ÒÐРfJ I¿‘þ#ýÈrŽk•xò«g€k2¨ß´É—Šßþ2Û¢%S:Í8y1d¯R6`_Íí422Å*VQ–™‚Øìÿ—ÿò_hƒšŒ7ß|ßþ¶±Vâ=:®¼œžþqÂNuI"žyæµ{‘lÏè´ˆÆìÝÇÒÆ^³ÞÙÃóa¢¤݇émè²hæ ²“ƒhpçw~GÙé‹+NÙÈVd²@M„ß?þã?ž'5ÖÕÐÌ>rÈ’,à¼rå nß¾gŸ}V²ò לÌ~-5EÀÜ" mtç_M]#0ç<¬6ºVÅE«;vÍ«htä"U«lúª˜mfÃFw¶Ë¤éigŒùÃÇ]w€F`N+äJfZÈSÈ5q€F@# 0Ђ®n €F@# Ðh4ó-èÎèµò´±sÕ¨k˜•ކj|çΣà£Ý½%ž4Bž19ß@¿›£Ðˆ4ì(È5N)ót!}iòî4N½ïñ7qˆaC$C)Þg/šâÚ€Ñ÷ø¨3òævQ$0yT.Q1‘¸;ØK7 ±,^X¥Ñ¤er¨^9öU…:‘ÌŽ]'v ¾ÿ6Ëè[œy´ù ñ¤5³Ž@”:²{*  ]”S¶ì@î #~×¢P½ç:6»¯üM³]ÊQ¶QHÛàD2ˆþº§ÈÍð¢âL3y@$Rrv `µÑÞ¼½M8z°Jñ˜ˆ˜ì()0Ú;sïmªÄѪf¥uMt$¼mаŝ~¹ìÕuõkLÑ^WG*+±U„\¡g[„$òJåúq™Œ+eK¶Á“×#ÏÑ€ªÚxÓMEÓÿKIÍ}­2DýBó4oOm¬Åîw·úfhÛ*ö .áÑÆõŽYéBÑ&ãáÏиÑÆ¡ö¹÷ßBýur~ò}׎/fXx:ïÚ/ aRYgl fçYÛèN Ç.¤Æ£/6ÛKv!+Æ£-ÕI§ãìA ¹ƒpm/Áv—×k¡r£-)i2‘WA øŸÁ¿¾äîð0š«ÊÑÂQ^ž+åÿ³÷þAeiùø³»É*ùÖ‚kZ]âQÃn…•X†ÕD ~:VÁj·JW™)¡,ø£±+= 5ÝÔ m7S36Ó6=={»U(,R –ݵ*hg,ÉZÁ"*ÔVÐ Öf]¢ ¥A7è~ßsî½ùE î0ýž™&÷ž{Î{ÞóÜ{Îûž÷¼çìl,âQ˜cº@q~dæþÙ\ðCدê]²÷Ù“+¡iR$õvúßêAcÍ6¦‡nà 9X™\çPE9tÕNx½hÈ9UÆ@–cWµh2ÔHè¹[}®§nÅïóCïj‡Úú±$«,F¼XŒ[ç~xêðú¨¹‰°‹øÎ:&HÉ­nnC³Ýˆ0á|Ó€³¥ÊÙE˜:Œ¼~_BÑ Dgo?:›­¤dOcQ!J–¶læþù$š‰Ž›¬…Þ§dƒÿ”ð4‘’›$Ÿ¶™™%l“L ziPS©ßÂÚ¿w•>·”`-¦î—B"Š¥¥%ù/–ÔãL¹–_OGþPKŠ[2º‚U²*kávˆL…é¢Ê£(¹D÷ÉÔ"ÛDGd9d8HžRV…’[]ÀÕ}K_‰†ö·àBá°ò‘'¢«²ná£nX«?)¬KK!¨É‰ËJÔ× … 𨬵C©r‹Trõ¤ˆNM-P[«„Û{MöB,jXÅWC«35n©äFWBc‡35Vâ+O ç°E úÌèéÏÔÀÑ(z¢Jʯ8LǤc…ø ÇŠàž‡4G="SB>®ÃÑv ½MHÐ,`:êó p“_ª);;:šaÜŽ#¶£ Å t{#ßD®¶6’µ;úA%«$³Ç³’Üêï„5Äà9Yl22E3‹0:ÚÈÝ c,W]MsWøJ™5Ên£ ,‡©neq<¼ñ Äö—.½†IÕù7‹¹2X3äd¹èkÛJ?´§0¢¾Ì_¿2íLµ•LÎa< ):„0ã0Y« d¹¨·Ås ýתäv>”ÿ¢ÛJ«Î¬àæÊ^Áи²0¤ÒJ¸]»ÛJ%ßüø&fý"¾HG>@³1BhnÒ¬ÆÐf©î>¹`ç ÜmvL?ŠÈ>j;ú˜ê6AªovN”úÇ#ô|ŒfQ´çI¬Œ_Á€ÏGS X /»K±jÇÖ×±³C\,d5T¤,G"wt,J4ë3D"sw00B÷*:euoŽ¡ïæÆÂ뤜oHžÂQX ¤ˆ^íÈï!ÉØPè}jÉù·”H @~ò:òemwÒ€¥ÖëBUD‘>ßä´CHOcSʛ͉Ja7É ehyë]¼ì$@†"ì®ad@"¼(­ÁõN tº3¨± ŠF¤¼ ?yò›ínw’?º o{¥LÈ"{”›jHö¼s·–æ}Xݎ报 Š „ó×…dZE=Üd\[~$ä6õŠY2+Uá¹F„"® NKtU°–QµÊÄ™h±:h¦åþí¤»¸ÑuQ¼³5OÌÂtŠËκNfÁÇ{½çs9^òtjÙRKθmÌcàæ|ªâÕ†#F"(Ÿsªy§Ò‰ÇVW†3zF#(F7E@^dó“ý,ÿÝfh”¬¡´Hî,ù‘³{¡ Û&ýI³e‚•úŒé˧Œj³4÷BZ ­þâq’ºg†“{Š6]]ycÞ‡4”™Ëbh4¬ºF$$®e0+>Z·™Sºz»µ‚÷É2¼§)Ð"¤Ê9uX2”ôƒã®ÒçŸÒB@º(¨,©Æ#1(km­W#µöR®~é¯!}¥U)‰õÙYí&ý[”n:™r%Äõ ªŠêV+ ØF‘S·â#ÖpÐg¶¡L>öÖ_yÇ"é2hP‰õÚTßD–Zå±p>N'!7‡EEVÜ’ˆ‡3rQȲöV«g2À×l2Šü•±Me w•GþyîÈ>Uå"ý½P„øLé'oŸO¶L»+¬ÂJ’ù­Ñ­xª³¡þŒ¸¦ *’ʵü‹)™Ú§ £&•ųŒÊɸS2>å_E,9ÐuAq]¸@3™sW}‘!Ç&kC®QâNÉQrn½´Â‹Ô¯ LÓ“%ÜŠÙ±9¬$]?Z#ž\”ˆ$™¦èï|}Z’¼A´?1ÃoŠ|vEˆ¡ ªb²³˜®#‰ŸÀVtê®Ú43Zƒü Ubðkîw9C5•6©ÑOÅ(…è&BÅùÉ!³÷vó ¹#,¢ª±×/ˆ&P8ìe-&d@Q8s±'¢ *µ6²ßR ¤UµÎ ó¯ £%ÊÈ'ÉçÞËÈì? c#XÞªC/ítaÂ*^»4D 2jSÉB¸gSå»RA@{“ªDNôœ©×ÚÀ.ãÉÁ/3éi¹ŠÐµkãÆC”IcRË\¿D7“t•UñSN7˜ã*(]‡•ÑKIiž9ôs±Ê½ÏI.n½ç„’»‰™7obz£÷î7P¬Öàé2SZÁ]ÐâP‚ÈW™ñ3û[z¶oŸ_¬J™´2ÓÉxZÞy 9¢DË’j7ÄCÆ×–I¥èu**•62“.’/  'Ÿg$2[ŽæUÖhвAþüzŒ:‰ cZïMÑR/4fsâ‹É´3õga$™71ì#w? ù¼Ò!í*‚v|ê:Øbx}Æ;“ÞÌ´¦ª»Kòå¡“@aÙ)ò.ê“S½c»ýð±QzŒbmþsˆmF0yë5iÈ£|ÃØd1 atAL&±YAdóišŽ¦’³0Ýâü ¹…É+ž>A¹!‰)ß9 è`1'¤ß[ˆ|ßV5ÿ€œäÕõä"°»ˆÑ9A+AûOË)!MÏ$Èïz7ŽèAöë5X@.Ìå0"[d,J ²²’ßïö …Ë4de³¨dÝJnm!49-BIò‹Ê ãž?=Ç>oä:¹µ]kC#íšðNG}Zù ?Sòµ‘߬ÇA aìð?ßA¶Ø-Z¯"t÷=l䓨è¢w;ˆ»t°´ô2wüùóûÅ 7(—«‘ÜwDCÂ¥‘|ýíUi©« ¢¢r•6¢å@•¥­1pM <“ë¨Ê”}AEèËÊá¨ÊG?;i0 ¸BÔzÈÞA³ öF´µ‘ÿ^v²CÞYP.udU39haòît…¬ÐEp?dÁœü™ `íô‡àæhš³HóMI Ðäõ"tƒü´‡Ä”yêìÕXj²©XŸ¯lû•Y‰=ò2§ï ´%¤ìõöx00è§~_~(sàî»´{GÓEœ õaÞO3}D¼Ú^‡²à²*ƒè“¦o»; È5o¹"†Ò¯ïýˆÆÿÚ4ù—OÓn=´v„vëÑ×´¢ól#)y©ƒ‹v„¡Gô¸Ð{ ë¯ ¡OlSDAì£{¹ØžÀyëW\¦‰²œNL„°žKïª`¨mE'Aÿ^W•r*ÿ¶Yóý,)DסKbf„fYd í€D ÷dÊ"t ËNeh“Û#iºNFÉÇzù!:‡þÛÇJñE FFqÐIE֪‹çô&Å(yÚGFÂC^¢[„Ÿ™7/aÍÇàE§’SYâýSÕF„›AóL-|‘¤ ¤F*OajôDbHÊ…äá€ü½hAÏî¡XÕË!€Å.¬8äÏZÞÞ`±‹Å-ÛˆiÑâÞÇOSˆnYM¤Ë.ª~«éšq÷~Ö\‚4n¥<õ•Â-> ]7Ág%Ù˜‚kE…Nls™.§<ŠîS3®e$å´ ½±£½*åµ–`ïo!Ü÷¦|61÷ïß6ÒR4£&/ÇÞç«8)åÒ¶ž9F'±í_‚&ñ÷ˆóØ .õEŽt¨SrkSº ”Ó€{¯,ùénÒŒ%m=v¦âšÂÓÈ4‰ •OŠŠÔSö-^¤MÐk«È£Ó¡S"²“ÝSÚYˆmÚRäN_Íý—Sû(':U°¢{ª^WŠY{[/Z-[ðÝT÷ãM=á‹ÓŒ+º§ùí¥y_¼ƒ¹J.«ûñ¦ŸðÕiC€ÝÓöƘ_F Vtsá[Fà9"ÀŠîsŸ‹fò À‹Ñò€ÂQŒ#À0Œ#À0§VtOÿ;ä0Œ#À0Œ#ÀäA€Ý< p#À0Œ#À0ŒÀéG€ÝÓÿ¹Œ#À0Œ#À0y`E7(Å0Œ#À0Œ#pú`E÷T¼Ã$D6ŽqúÑ ž±ÆGgŽx Û û’^ÌŠW5¢§¿ÍG;ì”cgÁÅž^xO„Æ‹=襓ïö?¿í”ÃÉì—tØè¢ªØ…¦0µ Ž×xÿZ%óÔYÑ=tILݸ„“«‡Êu,‰uâ´ûýÂsäo?ÖŽãù0"“oâÒÉ<džîÏ„¡Lœ_³ï11ûâϪ:iì>z[NÖª¸§btŠiò _ÛóâoÃÏ3‚ž{÷q¯·å©˜HÈc—Þ^Vñ&þ8¾úŒß:‰=Uœ ú2èö©äy/ ÊqÆ‘0áµmèìÑñr+:ZPïn§“ê¼dŸ>’N%fäqÉOOdßœet’ª(ä õÞ—ØS$8êk{Š"Oo–•ñ[˜ÿóC¸4_ïÝ7èìjiÞÁØâ:=СÎÓËn³¬ä*¥÷'p&gáRÆ2+Mqz°ä{óë»Ð•ס‹N-«¡o ¹:Žþ$ÎY·11–´ìD«C¥% jbOh:c»"Bk£]jéìíÃñ·µ2ƒAß4â’ŽV­B¿ L¾Ù‡w+ôs &ʪè¾Þ“üŠc˜¼3Œù5Pe÷ «ÃM,î ÉÕIªóš,qøç×èœðwä9á…ðÌ¢PƒÄÊ8ç7(é®\ ÀÑyíµDFqgl;ôÄXçAïeíìïÌ÷W‹Ô‘žWs̪!ß ;z¯7Èc6 ݸïŒâÁ•-Íè÷ºQ©ù¼:7Š!¿8_žÒßm‡~ÚšÕ†JzåÉÍUŒÏnÃÓZ/éÈû›CX¤Ô-½wQ¯"¦3Ã|F| ¬Î«´²mîìGSm¥™Dd¾É±ä!ù«B[Níüù¤ZŸì¢öÞYÚp·Ë†H( s}¬G"¶_Ÿzú¹Yôv‡I=r4[…¿O©c.1­Îñ2² R^zp· á™»ª±ÝÔ'iÇžnFpsp m½^å”FSî߯'šWñ0h·ß [¥’zsu7‡ü ÁÌ÷'Ž¢òë;Ù5ã»§G ³¯Í•[!¼ùºú³¸þr­$¿2þ&|a3n¿ÝŒG7†äqÖCW°`tQ\+ ÔFoÝÁâ†ìÑá!··YÒÜzí1lÍ&ÌL¨™{ñn»NÆ9Úëxà—r³ÊÞ‚ë RñŠ>y€[A(âÔˆFo.Ôæ“XjÍ7pãæ8¬$[ZI¶ˆ°ÅÛè~¯ ŠôWÓÒO¦ì©¶VÓáã¡@=VÇo(ºF܇WT#®ž”E³ã"l5Ä›ZÏBuBº¢ädô nÝRô‡òj ôa!‰W›}ô€ÌòË«aÑS­ ’ÇI]²E÷Èš]çQ-†F¼ÞfTÓ7¾:y‹”Ü8<×úqÍcŲsêìF2ÇÆâüëÕh£ôÆ0_ïCN´µ8°»½ŒYÕ7&I–ŠíERr·ÐÜÖ—E ÑšÉ3S’ØÚÑÙ‚Þþ^4[õÏÎ"JlŽ¿¦’’[y½o‘o]‹PÆî6E?æÃR… m;vˆïGa1)!,Ê}¤ä‚ðèE·ÛA?n /ä%œLîÈ:ûç“hniƒ»º¢(ž™D a`¨qÁ%_R<Þ¸M$#“ %×⹆þk$–ýV_RdJ¼¿u8Ú®¡·³ Es8&åN„$)oKKaÄ`!¥®‰”Ø-<™šÂ*ùÅÕ¸=hÔªGgÞWÚl0ÆWZA¦í¤ä"º‚•hBÞÛJb=¥5TÖÀlˆ#´´Š­¤AÒjÖheüŠIèʦf–°™ÔÃlsOé!ù³4¡ž”ÜDt‰|Û°Žf ÈŒò²/Éj¢7 –”Ü$Õc•üú •µpËz5õú©´®>™ÁÜRzªSû[ÞlêVg“>Ž•PáØ>xfP©4ê‰÷ÌLÍîIœ1[!° ‡Ã4D ŒÑ;4Å B(¹z¬>™ÂzIgjܸÖ(¼p‰_/½?2&„æf°Ù†ªŸ Nee… ž³UXŸQ¬¶Ñ)Œ6`󜣒NKÎft´¸(&‰É¾,Æ-¸ÖßO]þAµwvßYÇôÄ)»-hw ¨7áóÃàjÇaÄÉ¥%u=A6gK'úé;¬£o}ö± g,¨Òí"ðX EHbÆ¿ˆ]úÆs•ÜddJÊ££ ½DßSú(-_¡z˜\示®Ú‰ŽŽù¯¾|›Ú³PìE(V§bøDpk€”ÜJa׃&cÂ$UH-†MQ=ཟ # Ö{ÑÙdD¤X!²>'û‡ÝCàk0Y¥Õ²Ìb‡ÍVKVÊÉzXe‡Å¨CEUœèX©-H˜Ê]¸ûvœ67¬Â‡¯ºï]o…³¡šY ë£ÂLQžûo ÉéDk÷Eˆä!Ux‹Z0Ô4á2Me˜Œ•°Ú… 2Š8IÃóGYã_'‹®¶'4”VN¡_1{XV׆w»^†“,»Rþ×–È¢#@tˆÝ5ä·h»€‹.#vñRÐ c$Ëøu4QùæŠýðLsTèM° ]g‚‹”a‰ D‡T§¥ºŠ*Xˆß()6Â* UWçE»³¦Z7®w   ³iøªä˜ž‰Ê7<ÆÃ±ilØ]ÒR›ˆ­ccg±¸h—˜ì ë¢sOFp…,š>DæMDæpu`#þ¼¯´ªš®È’ )Ô«}ð=ÂÃ%ñýTPs Yv˜ìÃÀÈÖÃ!llÑ·d¨>¥‡åOPÕ—aŒŽaÄ7?8l®LáuªÇÐxF=1ë²¹D–è‰iøbA¬´9cE[!oRHG©Î#¾‡X$á(,ß…ðÌd.81„›TþÒzëÒÑ#áœHŸÇd<‚‡ÇHÚQ#Ú+ù.®“u.‹KÜ&òµ¿ôHðëóOcl¨OY[H*g2À×%†@ñ¾½æånˆ±M`èU¼:0 µf÷«ªÉVG­–>ú~mµô]œ!ÛªNÉ— Š|¶… Ì\Ââð¾ö¦ØÌiËl]K?º_n€»ÕCrzáuEN×\è@kC-Œ•Ø,$”£‘}|IÏ ÉMÌ®Ï $DYxç‰×9×ÌW’Evt·;a2ÙÐñ¶7í Q¤S=ÌÄŠÞXGº†Mþ««¤ˆœ·NEè&Vd/ƒ·»•ÚîŽëR)$ñŠaSPH’@jM·›f¤L¨uwÀ+”ç¸î…D>‡ƒ# zâ%wSYÈÐC³äó¸9ŸŠ3¨ã£]úzt«l¤By’)§JP>­¬>[gL+›d ŠnT…²xl­’ËÁYcé¹â3¤­‚9 ²x6#Lt|}WÉJm'·ŠeZQå°Ð¨‡ÕeK?Ö*A¿âR» ÌB„ °Èz  ‘¦³À"z15ÃSK#~ c ‘–Iµ"¯¨ øúR$Œ¹eªOD§éž@¼ëÕö¢ç…Ðh–Z2Þ0}¨ñ(¹.ˆ æÝŽE”{­ gÞ%¶åªŒ€‚ѸwYT˵·ÐPsF>—(©L}þÖbaµšè˜ÑÔqîó+ÖÜÒ” \%±N³<{‚ŠGº÷"Å“ú—Z@¦×ºŒL²Ç£ÒuCFï‡gF^GË5Rj2š¼†{¹—î%lLhjmMQØU“÷»TR øâÔ!P¼o7àBG#fûfɽ̈Î.gº~$oÅ7’Üš)®ôéˆî{cÞ‡´ØMËÈ$)r6kZÁ„DœÓ©ÉÞlQ´:ó>†¦—E2i9¦•_û~qf÷y”ÍúhV$†òècÊY‡Æšô7-‰¥þdÄS]RwEë¡yý§[kúJ!\°NE馘R/´v™¯Üæ  ’Òg´áüÔŸ],+ºGÄšÜÆHëkÃý̆™I³øw”™’®3­²r¥ÆšnœJâMŒ“rºUׂû—håÕ8. .åÐIßãOXEoßo’>„wÆxèwáíÖštæ"WI©¹æ$ ºÊêfx¶ÇhÊ5»[ÉÉ“C§0¿™ÃÁÃa°«Å;÷»r|…‰¦Âpš©~ÒøêÔ  *¡r¤HLo’ÿÜMŸ6͘] ”¾q¹÷”Ñš¡ˆ«Øš kÕ"‡W*¹›äÿ~sdžÞ{ä>“~,¯ÈßÄÐMLÿ»·Ý›©Zd70q@»nÅUÃCޏU–¬¦| 3øÍ”jÒbx*9]8'”Üͼysž^Üwçöcé2$ä›!\ºéKGŠ+»:˜&0-¤”-‚O …ûvQòù|  Îâ˜_!Y¤øë¦*¨Éê³±ûºœÙ mJ·ýzîÇ’'»}AxkääÖµôârƒ‰ÄékÌïi—bC^»ES0=~ûۨjlBÆÐ6•V')V¨àTÙtQ°) û\b*ñƒÐMìaˆøIeÌ)ëØÒ$%]Úš¤›SÂ3»e×…ÃBMÅÎvLÚ0Àdx £ bê3‰ÍÈ "ä“vÐNI_ëî"Ð^s‚Nhò1)ºä°¿GÑKK®0mmE1éWZeBÓÌŸð{{‚M­š­urjUø ‹°:u¯¼:ŒÃ,r•9 Õ°Ò Eðá("B‡¤=iýs4‡AÂÚ–þæ‹@sP<‹c ÕnQ1mLÁâÖ¼°Ü‹p‹ê˜ØŒ`%B›d ¡°œÀ¹2DB“xÍ'ü³RÝ]s85¨ŠX™‘|èªH C[OŸ±yàõ8h¡¡áÿNä—TYkm.TYᩊÛ&–if23XÔíµ„ÝÆÑ|¹BSG6* ‡áa]»v.C¡¨¢èé¥Ù•f^îÞýw®‘ë!C0,Ý*ë›á±“ O#ñ'ð$¢˜ÙÇ-Q–tP< {ÑÜÉx“£½EÓ×Tà©yéËÊáïˆ|—#Ò}ÂF‹=°TYàò´Áã¢ÚŶ©'*ë[ÑÖØˆ‹bA \5È-T¾Sõ§xß!™3¿ASêw|⌮¨BMéÆi=‡êßj° žÚRxl˜ü¶·HQK ²²òT{Ÿ'iÆ‚>Sj­IlEI^-óRâ@þðŽóä‹CJî5ìóMÂ}bo0š¨Ÿr}n±Hw®úä‚h™òë‘Urº9µÿƒ9ÄHNÞz A ŸÄ{lä«2”Ë™éàØ(Vb1ÒenÁ$ßbêÔW™ÅaE÷P(àpS¼6×/½ŠµÃÚÖ^r†7Òâ¬AZå…V`nCy™ÆQL>c‘AŸ™J‡õG#’Žo~F™×Ñ Ób Î;ªh‘×^}ˆjf;ë{@Íó0ü%ž™ ÅqWpéõ¬ÓŽ=Ê:¹ÇîN;¾Ê4/ið”zT ƒî-XÆàÕKäûèÃZEzº/¤æ^eVŸžÃ3]n1 „kŸX¼°†!ªÛû¡-j[ÑC‹æ6Çðú•+¸zsc‰ˆB“×K i×òÿ$«ŸÕ./¤K’‰øÏé@€±h"‰Šš¼ñFí«ÄÀ0uè´pÌænGw7-NtÖÒ׸¨}ìÚ¯Zås‡ÙÙŠ7è{6ѩՙ1ZXšÖüâ”3ò÷noª§A•ð<ƒóý¥â}pþÊa®!—‹î7ÈÜ$w„x4¦h£b‘˜žü~U½9›Bw²$pýK4H?C¾yoЮõ¨Hnbn|0í’‘‘? zr@<7&h‘-æ£Epíí´˜,±IN[«òNVI9¡—„ö7®ã"é c£rÁZ%­cè~£­n'¬ªÝ†þ%Rnô•p^¸@J.é¾rðªMëf0Ë—%@Á¾=6‡ÁÙ ÔµõJƒˆù‚⯻8BÆQ+RÜ\Õe$vi·£W9×úvìÆ Œ ¾Ž+W®b|â³÷¹èáõb»+³›¾:'ɧý V’ï»Ë¸õ`ï~µ9¢ ¶&e°I G rLMq–G/ûGÐG æ’ö:é£+Êš_±zäê ¹å h2ƒV§¢tMM𺪧Ù}$4%Ü’ ŒLRòz?lòIIE0Óbý³Ðm1ÒGkhÒË®òÜ$뇾MaO 9¢84‚J¥ær'Sœ\wB[€äûФ1dè®>ÐãÞ{íHn‘ A–E?—™p´ºZ¦Éå'÷^ä-ÀŸ 'ÉØYXl—ú"4Õ9gª?—‰Â÷ ibΡ[8ùÞ'øÍJX ­‚…¬z‰Q;½$ƒxG9/)q̳ /›K´Ç$‡4;iOdIXÛØHEЏr²ÓÄ‚ky•ºTÂûï~C"‡@IDAT6âv1Y(ã‹‹E‡ÙlG) ± ð”ׂüÁù#««½’øŽ!L×¥ùÚ]4U†i€ú°·ûGÛF„Gðxšp<«¨ŒJšý * ÐÀC½¦«Èº^™q/xq“"Kc%y#+¯ƒ,åûa.Ó–ÀŸû´—3‡"¤oÏ“=©tèYòUĉATv?Ÿ'ó>Q¢ÿ×WTHÚùÊÉ›}ó ^¹9úλr ˼iÔÈdb‹t† T˜Ù<®zäòP®x$+ 1”Aè©°‘ù…¼%MIÅ5ƒä3¿Ü«Æ?sNaBÁÌe›â޶õ ™öww¨1ˆ/Çï(·,qOÊZЇ\~rïEúü‰­ˆr•¾Õ'a²&{žZÉUØKq'n ð›E¨²óËJM7zÂ6GÃU“ˆÆÈáƒÀZpï<|¾¸CÕVZ`Ä·³¡ì´²Oæ )ÂZÈ-;÷^¤Ë'ÊZËPpzvXÉ@®æÖ xŠß`ŒC&?¿Ù6¨Œ”z¾${p:lÐ}ê™/N>ÚX£ÝÒyùê”#p¾=OÅ>²¹AÄåïÑsS¿Ïìÿó•“/÷“± r{°âœº—n¾4Zœ˜)&aŽ«ZyÚoAºâcH#@¿Oƒ’]ÈÛ’QÞI\²E÷$P}š´½ŽØñªÆœw^õi(rž¶èžü‹¶7zhÌü³™êÚÉ—Ë%œ>Ø¢{úÞÙÓp¼YŶAÿ½Wzœçä`‹îÉa{8ʆJRr—…S3ŒÀ³A 8ëϲH>›R¹F€(UΘkòî´Pªü¾È|ñb´ùísÝF€`F€ø#ÀŠîøårÕF€`F€x‘`E÷E~û\wF€`F€`>À°¢û~¹\5F€`F€`^dXÑ}‘ß>×`F€(Qb¡)L-ÐvD2Ä05:qÞ³Ù|_é‚î8†z´@§œNcAùL‚xãm>“ÂŽ¥VtÆÓK$z—.½¯i|zëÁœ3DìßÂýûoÁñA¬׉ÈE Â+—^‘§ŽŠG±…YÌUE—¶àœ[œ•ÇXçf;éû,>ޱ°ØÒÓ‹G”¿I,ͤӟIï!€… qêãé¬èžŽ÷tb\ª›Ðæm*º™µ(<2ù&.ݘ¤Sh80ŒÀ³B ^Fhitn‘`AϽû¸×ÛR$ ?bN†jt´t JÛšV_¶ * ¡—èw=Vñ&.9¾ZDºeòqŒÅ—‰C0ÄQÄG¥Ii0•Ô¾ù :yXÕ‘yÞ· ãKð̰9>–Ÿ/¥dô nÝ™ÀdVVmEe<½ÃKçÆ× ¹:‰þ4YâðϯÁî}tvhÒ‡óa:E…òTÙáíê@ ’ŒLáµ;k¸øîuÔÒW“ŒÌÐ}oÓ=}ÿ«“·àß©‡u{³ámú’«àéî†Û¬õ™X$±0zc‹ë©C§—Ýf`+„7_÷A¶×_®•VÆß„/lÆí·[¡-áñ `³™åÇ»2õ>|³Ë’W]¸Ki°2ŽÁù Ê»+—ptÞ¦#“˜Ät8.i]x»U¡/#ø#ðhî쇻¶R ŽÄæ&ôg*}2ŠÁ‰ Zzï¢^E¼Ì µ¿¥Wð0ÖˆÞ®ót¯tÛ‰Ø*ü}CçšyzÞ»r®È=t=×èÞ¤ÝÛÑ{·zÚ4^WS‹3"{’,NÃ}ðç;U×ÒŒ~¯•Ê™ÝXÅ?ÇÅ~´×]ÇÀ˜(Õ!éã ¸:0CµV+ñJO6èÙµ·ZQ# £â¢ ¸BiÚz½0‹òM dý¥ƒŠ\ÅC}Þju*|ѣ袤+ŒÀ³G ödo>.Gÿív¹÷ìÊø-øBF¼q»ƒŽ‚&CÊÝo8pÛ[‰¹ÇshtÚRßîÁ¸M`òÍ>ì¸I¦Í=@`c—d­Ý×Ûa’M›¦÷óÊaÊwcHžÒ·1t $ó„\Ì•°BQÒÓ‘ÕSᅥÙå½²8º0Š;Ô~I-€±ÎƒÞËî=4d=’QŒÞºC'ýQÊòjXôDKézäãBt’«ã¤[$qκ‰Ù0¥ÕÁN2¾CÈø=¡@]“ ¸qsV’ß­êin[¡QÜx°î÷º`¢þäέ1¬“¢¢3ÚÑÝß¡ô+D?“¯jk5~º[tó¾’+è %×`Gg/š+XßÞA4.>o<Élo,’’›DsKÜÕRYõ‘’kót¢_¤í †^›"}"ŽÝvÕd2Uî%5z¾ÇÆ¢³[V²ºz¨QlÀ?èËkÝJñØbžký¸æ±bÙ?ˆ91ãSaƒçlÖçG”kt # âçœlˆÉmÄ×ÕÏ6ÂCRr+ÏzñVo'ZÎÕÉ6h¨qÁU-š:)ÚÞö$V¦¥’{ÖÛ‹ÞN/ÎÕñ‰nêkãŸç„€¥¥M¤ä‚”Õ™©'tjÑú~õtZ¶"IôtÖµ¡²†_+¡Â1²„^¿ •ÞÕ'3˜[¢A+=oË+k ­-j^Q&΅ϸggWÖÖÂ_Eh5Ф¾nï5j%¹ÁBÊt*õ[x25…Ujü5n)ÙâÃGäs¨‡ÉÙŠ6ÊØÜãÉDxfL)§òôj™ö¶&©äF—f0³°„pT jp8,ŠöÒ’¨ÐÖTOŠBKTÞBhQ­Ëü‡x¶M/aw{ËÒ a…uº"$§*¶07·Žò*¡´‘<ÝŽ¦dâa¸ÜÝÞÆâ˜K.´yìØ!Yü(¬L¯ ù˜_àô¸¤5Ôèð5Ù•_A¥#sw–§1ß+‹“‘I9Hµx®¡ÿš‰e?†¥ðÍå>‰©[¤äÑÖÓ‹Î&#"ÂN¤*ºÅè$“I©[LÌn¡¹­ .‹A’ñ3Ïìr ÖõŒUº]kÇ““±Ê¿ˆ]³æä*nÑ 9fõ ¿¿ÖDƒwæ$aaƒp££ ½¤ÃcÅç—²¹);VtñáEÄ©I´õt ¶Ò„†ön¸Êr á½{M N˜+X$¥RW祑W-*M6t]tQ†e<^þ4C9I&çž>nT5ãþípÚÜ”Wxê­‘€“‰3þP9‹dq%k±Å¨CEUœàY)¼æån4’ ½ŠWf¡³¶‘¥Y=ƒZè¯9!þõvŒµhpÖ*êM°‹cu&¸l6©h=Ñש¥kmp֞ɡ·ŒÀ³EÀU#[›'‹ìôìúî,ìuµ!epôjF|±Xé’֞ͥq MLÃÿp b¥Ëf–ýy'=‰Õ\¥ò|CX‹AèHPg®¦kw‘’Kicë4´ƒX\´KLvQFÃOHQÕÃùÆ=4ÑlÍæŠ5ã«:–ܨÝC™‘,Àcá Èèàt@ú-&ivéáÃ1¤ZÏ¢‡‘¥c¾Œò™™evþÜ8z³ÕTÊR˜Fy[Ëï*E†Ä¨Œürƒ»:¸Ü¦#ñ!ÄeY]ÞízN²ì:H¶­-‰Á`q9l²ÕIåÖBíÔV[€‡$Éë²8Šcœ– è*ª`¡r£«y4Ðd˜,Í@·N³ µîx¤@¨®µÅ鈎 =÷ß@“Ó‰Öî‹(§˜2R +-««MnêœÖgä60OŠ¶ëœ B·!ÖPï´«ÈÔXˆ¯hDú¯¨ŸÑ‘…·Ý é0o{OÄD«ÁIü²¢{TÉ—Fˆ´Q'S Bt¯³À’9ïAY„@Lsü@“š7õ`ï…è tÆ K)ù ‰‘‚R^¦þÈ26æ1pó&ú†ür Å ¨©”Æ€ Â~´Kñ¤ˆw9Sù².ô6x›­Ø Ïbàê%šÒx’R’ê•VcƒÍƒfk9³>\%ÿ¦OöhßY¤ù†8i”os7õÍæšfd3ŒG¥[‚äEÈPe®Œ J µY!Ed}Ò‚°ºˆþ¡<£ÉÊgj9S=Z[[ÑP“3(\›ÀLDøÒÔæØˆ¢Àjtµßàò'qÆ\Žû÷ÑßÙ¬>*W[zº£yøh›d)6×7‘;Ã=t6@s× â_FàØ0ÁAŸà:ù›¯..a·ºmŽr¬‡ÂtOŠ¢®õªíåi‹ÍÏê²¥³§›ƒh–…åpRé3’»ªÆ™¦º*&‹Õ øúp“½Ë”XLþ út••d_::£tó™¨m‹.*ªöWY„ŠÔÕì>OJê6Í^Å™{LÙêÐXCH9!àÀÍ›ä~µL³ÔT‰4„é+^wJÆÿ«V¯Ä¹,ör•SJ1Åk!Íáž4RýM?­©þ-ô©È´ô«~5yš>ó‰Ât°VííÄ€d©½ŸW‰%?¤³*qLŒ¯ô§­iêÂý¦-,ŒûÈ 4¿‹F¢!ì h꺦­Æ}w˜ðÁá|[úïIÊŒÀ3@@ûJµ_‹MñÕÍ*:³9iʬTP•TV“©6Kžš?ZVST‰î&µ§!G›[XÓ¬±ZÁ*ÉMò‡»éÓ¦ µ‡ôki“–\C³'ž6{ÚE Ý\DM±¶{Ü0ÕºÉò<±|ÆÚànÒ?‡Ç ÛFÖ#r}š ù ŒÀóAÀê gó±)øÈ ÔÒæ…ÓÃØr_uÖ“;.}*& ¨‹ah*dÊa-R²´›<¿Y@Zï.Iá‹wîw_Ô­1 KkÁ™ê®"Ä‹ÐÉX´¦'Wb±Æš;ª¦Èbu%WƦ*`zü†w·QÕØ$}¦’ZÞy 9ê…Æ£Ö¯î¡ŸªR‹b‹î!ÞˆÁRO£¨ønÜÁäÔ(^»2$GêØCË@‹¼Ê°Ç\„¦+iÚtÊ/ü^ªà¦Ejš‚b4D¾ÑÐ$^÷-Ó}ššŽç. «™šîyiú´aÍ1 ‹­ÝI´Âc]ˆÐw˜Äfd²þˆ™ºƒù2r©¸òaˆF0*]'äãôRÜçæBd ª€µNL4Q±ª ?öÝ8¢[ Íd4„¹•UaF]µhlZ+–Ùø#ðÌG…Ã[%Zïö“/Ù[èλP#ƒ­`XNùWÖ7Ãc§)ÇÆ‹pˆ…žä+?CÊj˜Êú!|uM¦Vi f¦ÝD¶È]AEèe²E·ßŠ.O=ÜoÀ-mbn|PY…½¸F;œØ`kº@OØ$…QÝð ƒHœ­äs'óÆ036’ñL»~¸fôw¹as·Ó?™˜üÇPæ¹3->[ï“.‹¾'¸ÛÝ€úÖ‚ƒå—|"jêëéŸ$€ÍÕ'ª57ˆÕˆ•fZH÷ÆuXi7‰d¥õõ5P’&!Ûåš³‰ó#pÂTXa£ÑÖ"ê¡,± ŽDç|ÂFk@ò—MùgÅ’*¸§T+lQ9l°Ðbë2ÌNáÒ#;î¾×±×º,:B²¸¶=žýcx]¾å´Óms®¤6Ãë=‹¾yŒôQk,«†|aƒ1ÅRkØ—ŽëFpEQPG‹oÔ"2ë^´®T [ ¯ƒX³4):@Q_‹^Z;0èÇàëê¬S™wߥjš.âl¨óþZ]DžÂö:”—¡ßÏ.è–HøÐ·)”/§‚ ;±õ ›OpéæìwÑ¡*„…*‘¤Œ¢­R™Ó)[[ÐWTdØr•g¡¯â.⽎ZlQCž4i*êM£«(G|üO^Éâ¬Õ3E„F«²þeqŸ¤UáO_VŠ4_<5—ÈGš!Peݰ† :?ïê|‹¶Ñ©ÀÒÚFlŸ9{»¬d# j™S€Zà _ÂèbP*¿©hØÑ¿X¸ƒ¾9²¤Òˆq‘Òì,TN9•£r6öKœï¹¨c%Qˆ‘ Ê!PE–âJ² ÕU *ËË©¬\Þóæ¸ãBà>ùOs(MŠÉañL=Mºå¯A’dq¢€,Ï’Šì-J¤ Qê^:‰Ð\} Ç½÷Ú‘$]€ÈX+T€ÓB:é-¯ÞROzK{½Eè#CÖâ"â*±EÃýŠ¢þÇù9yþ±‡0=nŸ;[´bûuÕ”ÁH#Ó8m-†ršó|,¹¬S…›7Ð í]úO„ŠBir3Ò6(ê– ¹O|_˜W±US&q_´Eg&ækFàd ]::hoIš>¤á—t™MÒ>Ñû)¹‚© )ƒùÃ)°ùŸˆÎSO® ´ Üé ªìص‚åd§+x·AŠ|Ž‚«¥Ý çàÌGkO©Lkù—ø€!PX¶Q[Înj®/"‹Å³ƒÈÃb4D±ùè®±»#7h8¨.P¨®OÆ&H«°â\½¥>¢'庀¦R«Ò‰f‹î!ßE"ÁZ„6ß¡ ©_²Ð¶Z¶#9$Ý|ÉEY1²Ñ˜ÅÖ^°EW¦ ´HËüR9ÊHÞÄ׃“~íÚóãüeÑV‘Qš©^gLë4"ÀÝÓøÖJœgò™;–Õ˜ øx‚ýM:äf›¶A|‘ô VtñpRF `E·ß óô¢"ÀŠî‹úæ¹Þ¥ŠÀ‡K•1æ‹`F€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ¬è=ÎË0Œ#À0Œ#P²°¢[²¯†cF€`F€8 ú6…£༌#À0Œ#À0Œ@)"ÀÝR|+Ì#À0Œ#À0ŒÀ‘`E÷È2F€`F€`RD€ÝR|+Ì#À0Œ#À0ŒÀ‘`E÷È2F€`F€`RD€ÝR|+Ì#À0Œ#À0ŒÀ‘`E÷È2F€`F€`RD€ÝR|+Ì#À0Œ#À0ŒÀ‘`E÷È2F€`F€`RD€ÝR|+Ì#À0Œ#À0ŒÀ‘`E÷È2F€`F€`RD€ÝR|+Ì#À0Œ#À0ŒÀ‘Й` ‰Dý×o|ã²N/½ôœN'ÊÊÊTÇp8ŒüÇÄÿ÷ãcû~äG~ÕÕÕÊˉF€`ãFàCߦpÜD™#Àœ>¶¶¶ð›¿ù›øÿø,æ?þñã×ý×QQQ‘Ÿ{óGôGøÓ?ýÓ¬è}èChmmÅOÿôOgÅó #À0Œ#ð,`×…g2—ÁœþäOþ$¥äêt:ˆ"ÅW<+¢ÑhJÉÊíG?úQ™\Œ£'''!,ÅF€`gÀÆuá›ßü&~çw~»»»ø¹Ÿû9|æ3ŸyÖX¡¼-D#q ÜÓ½Bgk“ã±¾ TÚÜ8g7b{§ fÓ™#”“›5‰)( ”3ÝÜrøþ4 °¾¾.Ùüø\¿~]^ߺu _ýêW¡=+TH$’ztíÚ5X,|éK_¾ð$“IE¸¦¦&•æù\œ¦ïýˆ¼n­`r:˜ìxÙ]û|àæRF€(>ŠîÊÊ ~ï÷~ÿùŸÿ)!ýüç?ÁÁA †ã…8¹‚7¯Œ`Fxßy6u&7±2Š«#‹puÞEkíáËL„Æ1à[¬^Üï²Ï Œö aqБod,0‡èô•kÅ;÷»P|ùUN„Ñ7࣠ÇL÷,pÒÒA@(¤"…|ä#©kq¡=“‘yþd>ÿ®ïú.™Bû7ßúÖ·òä:¾(­ ¦XïÛ­ð–ïýˆm3±¾ˆùERt—’h"E÷ØúŒÂóF€`JS­èþïÿþ/¦§§ñgögYà ¡º´´„†††¬ø£ßì‚ ¬âð Žã. ÎLµ6±«( ÅËIbêÖ«˜]¯@çý·!l-Ëy´yj`¨ªR³F°FJ.Êì¸ýn‡,#z‚µDå‘Vdêg×á¸ví5d96TÃÛâÁVEÕ‘è¯/?-Uvvvðå/âW„bîâYn;ˬ×ÚÚZæížë¿û»¿C,“ñŸþô§Q•úÖ÷$}ªƒÉæÆrú¦©EnEðh~»º*œ=_Oßv‚êV‰*ã)úÞØ6 ejϤ×C#z*\9#À0§S«è~å+_‘¾bZU„øÃrÁË“'Oä}1¡-<埔Ј0<åÀõ æ½”’QŒûX#w eUuh÷^†¼V'ï’»K±qŒ\z•¬ÀoÃccnfŽ*ØÌqÜym„žRØ áÆk¯‰+Ë©ä NRˆé>šÄƒÑ6v- úì5\¹ £wà_ZƒŒÖ•Áêj‡÷e²¯Nâ)¹",]AÌÕ‰ë3بp£Þ¦ÐMFàóùŽ åG‡ª:7:._@%Ý%#3¸qg•.ì;s˜XÜ ÊU£¥» &â/¡z?LÕºjt¾{µ)ÐDéJ±;Âýû÷ñ?ÿó?bGÌ–üáþáÒæK´°°]__‹/fÅ馢M4׈HÑ̸ÐÔ”Vôèûôg~ïÉU ßð!VYwuþÙ0}òå8ÛÑ…šˆ¾YRÞé¾ÑÛ‹ µÂ&šÀ“Ñaø×!Z]¹å,zº_†p&J·fTý1fÃ4$&EÛCmÃm-öyçQŸ¡¼zš1ºx¨¶I`ej˜xoe(/S/"^n›üË0/§n1Ú¿þë¿âÞ½{¸}û¶ô﫲²Rú~îsŸ{6¯H1BXŸÆ“M2"e)r›xðÚ€TöÊ­gÑì¨ÆÎÆ2|7o`… ¾5&CJ¨²XQ]¡G2ÃÆö6¢B¹ÔaµªÛ1é*`±Ú`«6bc#ŽH Âf¼z€>ß¼Tr-޳pÕU“0OX_‹ÂälF[K#ª°ƒðü,ú òÿU .«²ÀRM‚;¹õmÄUºØZÀkcRɵžm†£ZåYôÝ ÅDD]ð¹½»ƒµù1Rrã$L …uø‘‚@ae\Qîu²|«©<­dÈü§T˜™™9°’{<‹— (DH*ƒ?úbe«H‘û½'wÝÞA|-@Jî* &é{ÞÝÆ¼o€ƈò}Óýܼò}/¼ƒ¾ûuTX]h¤v½½6!I>Ý6&@¤`mmwþA¢ty ¼¿Tu¤\ë¨ÜôMÑ'Œ¨J®ýl=Ês&—¸m¦¾¾` ¡¯Š ¦=¿øÅ/âoÿöo¡íˆ&VwŸ=KÊds3ô4E—»-ÒITLÈ#YI[ð#ó˜ S›¦º’h]™EPSÈí ·ëeÅ% ö ¦×ã˜_ÚD—ÓƒúòÛF4wwH×…ÄV&§gÐÔq Yu Vt´·’²¸‚µKtO µžTÎéñ Ì`õô£Ë-l­éÐúö»ÄÄ6·¶±]³ˆ ²,­ml¡ÁæDsýc â°yºpA¸.$ãŠ"*é’¢úø1©ÆÄz] L¾»ñKX‹/"´õ2DŒ : ®½×šÕq\ `w=D\Ù°«úx&Hi/¯ñ «A>ÕòñoÉ °Ÿ«Á³`ôŸþ韎݅¡(ßêw.>zú_þ‘¿´³¥ÿ6*Cxí’Ü“T|ý^½:†H[I/ËÖ×¹f¸õ‹˜#¥w'Â}û ¢YnGÿ횉bø•„w×°´Dð y©]uÞî†tóO†²x,Þ6/ öHíZ®££¡IkWhÝ€¸mjHð/#À¼h”´¢+,>·OüûÚ×¾–õnÄFô¿ôK¿„O|âYñÏâ&±­Cm‡u›XÞàÎÃ4Œ)ù=jF•jYOIÑ„6§¦ü%±+̤Úm&ã9)}ê^I¤ÑUÌF™˜ºÓ‡Ù5Å“8ó‰¸VõP$wDÁy–§¨„•ç"‡•äö¸FV¯Ð:‰sµšåõ“ĉA‘–ÔâóÍ0'§…0#}$dË­èìïR·’„ÿž¶i òÿ÷Iq}Ø ò|ï÷~ïSå=lYÇ’¾Ü†z1^¤f!Vún-¢yr+šçŽêçª4L^ÅtªàTk”1åV‡tómÇ(2|±íÿQû‚}òR»*¸–µhیྦò j°²¹â¶)Aá?Œ#ðB"ÖÐN úB9ÕNXÚüý×I‹¬°ÊŠ‚›/ïÿðãÂ… 0›óøÆîWȱ=S£gp¹»—g±«úÉf‘/+Oé°;[ŠØ1Õd[_uù”Ü,"Åot‰lq–\¡©ORruÕ¸}ý"£70B.z]ÊÞ$ ê ¬Ð3”+ÂRˆK¥j*Iò“ „ 9Š· }eÞ¾ß@ ý ü£Ó´5Zcþn·§lÁZRþ-aþå_þ’C±]ßaÃoýÖoÉ}têÿ{XúÇŸ^mG©f’Ý®²ËÓ¡¹÷]4 ŸôŒ †Ž2¤²&°%#©í¼ôÿAñŽß/o1¬‹µÍré!Ê׊Oæ,Œå¶©¼þË0/'¢èŠUÜb‹¯ø‡8DÅvGŸýìgñ?ñÏvªs?îÍàuá#eR †Z,X¤]á›´àœi–…¹¥ Ž:¡èn©–Uòœ|}C=LZæ"¿š&`·»‹ÓëXÀx²V} ‘¤Mj*rI=™Ä´ÊWly ÉÚ´kÁZ` !}-|K FQt­ÛM+Õ¦±Ãd}LáÇŠ†Î ɺ¦èæáS”¼:õrwhr’ïqå#Ú{u—\JÒny²qT‰"ð4 ®VáZTªJnº)ÜæÞËØÜHºOêm8gÑabmÓÃÃзºa¤ÝÖ*ÐÞAíF ÛÁ‡µ´£zý–¥ÞZ«ÉÝòj4´ßL6Š·M^²–cqqÁæéà¢âW,h :Ü65Tù—`^4NDÑ[~EÉýØÇ>±iý'?ùI î§>õ)¹«Âó9º”ߜƋ­½ u¡><ÅrjFwnÝ“‹¶†dB#­Ü¾§<ë¡®&+é“aZ(6Õxn»TëP¶‘H+‚~ÕrÕSS7¼qZaXC`‚€Q|™Ý‹ $pëÊ‚XÞbl‚v\ Ejáåu¬Fn~Rd˃ӈ/ÏÃGÊ÷;÷ißBAÛÔ„þ¶8nhAΈ,MGÓ¸=—åÊò„–Zc—¦te ÕxòЦä8«D—U9à¥mÓ80¥@v;ÊmW)µïZ‹P¿ï†î~ć‡hÁØü>u;5£KK¥ü–é±Dm’w(áéõJW†Ê¢yµ¥PþæðºOÛàœˆEWøÛ>m»'G Ù~û·¿ø‹¿XPXG9ÅhUbõÙÊi1:…Ÿé髽xHÉÕ‚¦ðj÷âWàâái\¢È›._‹åßÒD@œ^–ïhÞ¿ú«¿’ ç{&ˆ}«¿ïû¾/oÞïüÎï”yè‡~et²_fø·û·ÌÛÓyMm7£‰)uP}b Å϶¢PË—÷P(o›™m/Yn›{1áF€ø #p"Šn)ö¥/}é¹)º¥„óÂ0'‡€ÁêAÏ5rc ýª90Œ#À”xE÷»¿û»Kmæ„`>˜»€¹†g2>˜/—kÅ0§9Mì¿Y A¸ò1,þ˜F€`F€`“CàD,ºF£qÏ­Âúú:ĉIb×…¢>®û[‘µ¶¶îY ³O6~Ì0Œ#À0Œ#ðAàDv] Y~ÿ÷ÿÈ …Yl/öã?þãÚbL4¡íº NMûÜç>wd˜#ðAD@Ûuá#ùtº½ãݤzê]¡Å¡bŸ\‘OäÏ âT5‘ÿ£ý¨<]-ó¹Øäå[ßú–Œ:µ».dVˆ¯F€`J½îØý©Ÿú))ÿüÏÿ\žn&„›~‡Ý„>Cüû›¿ùZå\úúz¹’8^”#ÀOúÓò –\Jñ!£þßÿû¹äýØØ~ò'bg…ܰ¹¹‰?þã?ƯüʯÐ!Ù»‚ˆãý~n¾gF€`NQt§‡CþÓ¸þË¿üKüÁüv»çW¸*üê¯þª´‰­ÁÄ¿¯~õ«øçþg™v‹ö‡Šóüü<œN§Ü#÷ãÿø:Ï""¹µ qª¯¡âLÖþ´yËŽ…0þð¼l+²omÞœ9‘1LÎÁ|®6yðDÎã¬[‘võ­sRiV*¾a^zé%9€ÌEâïÿþïe”\æ _øÂðƒ?øƒyóŠ#„…¢û£?ú£y·û (º±ÐN\pfí¯‰;¶¾¥w'M¿@±Í0ŒÀq"pbŠn.“Bi-„{ÂÕ«WSÓ B€jáßøm¹(­ºÂº+,ÃÂ5BXyæg~F*¼¹{ujyÿw Swú0»FÇ ©Áî}¶Â«­±æs¤èN¥Q+ò›ˆan1€˜í)ºûP’igaö°¢[Q~ôC ¹J‡T PÝx ×/Ô¤j·òàUøè¨ì÷.ÛRqÇq[˜Åì®9¿¢› áÕ+>X¨¸\¤8 ÇÖ·`â¤é(–£F€8Vž™¢[l£øÏ~ö³)%7·vßó=ß#OJ;þ¼\¤&,EÂÊ+Ü „…÷Ë_þ2ÚÛÛóžÐ”Kë¨÷› c¤ä&Ñ|í4™õˆ®®aëÌ>‡/蔩Û}RíÏšAGgÑiLû§”‰ôÈÞ¨ÿ Ù8 #pšÐüŠ×g}xâz ê̇r„à ÔL_F‡sz .¶µÁP½Ï ´@v™|ƒËÜ{ûåüíþ¸ú–B<œ4ýBår<#À0Lj@Á~úˤ´(ùè~ÿ÷¾è¬8±e™ð'üÔ§>…¥¥%LOOãßÿýß屿wïÞÅÙ³g¥…7+Ó1ßìî¿vAèŠó?aªµ!½=|¡)FgÃPì½Uè¼ûÌ‚B9üd&)wì-ÝèhPr&£ ¸sk ë$uF;ºû;@:´ Ñ…QÜ[”ôª­ÕØV¢éo3·^ÃRõE¼ñr­r‡î+é¾UÜç„d£·î`qCpf„§§nsŽê½¹€7Çaí¼ÖZåÙVh7l£û½.˜isøÎ„·…Ú@uðxÑáV³}xI®àÖkak6af"ؽx·ãx-k9µåÛL Ž£þv«æÂ MâŽo^iOº*4wu¡©À¸ÅÒŠÎSrzÿ5Ì.Së$Zžîn¥m%c˜§>ªÊhƒYž’–ÄÂèŒ-®S.ê<ݸ얽 ÚÖð(Âq¥ç0º:Ñ[·ŒÁù J»+—pP»lWÛeV} ö-I°¡“hxÍT‡! /lJúÅyÙE|gÓ ¤ì¶ Ý][2ß3Lj äZ脲톧"{è&#“è#%WOí´ÿ­4Ölcz螈O9'ì›–»;ËÓ˜[ÑæõÀ¢ßmK¶Ôä6"´ð..Ç€èÆãð\ëÇ5ËþẢF¨µ­8ñÝÙƒo­äû_ã‚«Z¨Ò¤<{;à6å L%¯EúêvP‰–Î^ôv6C_ÆãE¥Y™~HJ® ^jËm-¨«TGÖ9õ—SC»Ë¤än¡™ú.—EOí~3*ß…û®IÙwY<×Ð̓IJò²T]Úc{#¿?ÜS>G0Œ#ptDOúLBee%¾ò•¯ä-Kì{Ø gq„ÕjÅç?ÿyˆ•Þßüæ7Sd>ñ‰O¤®í¢Â†·ßéT¬!‹x|f½o½A>³ ò#&ËIùY\ïpËiF³I±Ö$dáehyK™JMÂXô…±N,k‹d¯\N mÕ¤G¥ Ëá)ÁnDdýÔ‘…·Ý)-!o{¾4’® ɦ,ñ”{¯¥LPyq—g0Šm¤jˆ¯å)Å@e–ì<ƒ&w–ggJºaÛZÀ<åsµ¹Ÿ:ŒF¥ ]8»x‰,V³H8›%#ûñâð¾öòUԪʿ‡G@´™µµµ=Åî"ä{&â…¯ü×¾öµ¼Ï¿þõ¯‹$²½Çw|‡¼Öþˆ-O6$ðRC+Ú–06;Œ…¦wa§˜Œ¡ž9;z¨ ãæ…®‹^ÂãÇ+hhÏž Ù7m’QU3î¿Ñ$H£þbWF&}Ò”µ>MíªÎÂbÔQ»­¡9‘e¬Æ¶àˆ”>àÚu¸k£feˆ®ìÔ@Q\¶b Yó÷-6:,§©£C°Á¦µl¡5hšƒÚ•Xĉ%É¿¸A¦ÉÿG$¬FÏýë OÎr„¨ …¢pUî»Öã*8-Þêv«¤»5P ñœŸ ŽeFà(Pôl‚É”žäÏ-±¶6[Àä>/vÿÉO~’,ž½rß^á¯+‚Ø~ì3ŸùL±lOÿ¬¢—ß~­àY\}£¸û®GÒ+#¥[ˆªì@ÂBgC½¶S‚ê÷&Ó¨è| µV FC jÉÝŒx-ñ~‰„Ðg7æ}¸I‹â” ìÒ{ƒÙ}eäß8·Cyô1%¨#‹X|dðBw6k9æ—šþ°—XFL’ĺÍúô¾Š¤øò˜mFk7ùH‹Ã[ …/~ñ‹ÿ …{÷îzt¢ñ»¤Ø9½^<¾2‚±áI´dX,eó£?é¯ÙDJ °@í+7ì—VäÐ5ånÈgW„Hœæz2¢EœÜemcéFHí’¸…”£NóW‰ÕT[—P7ÓüjOÅo‘¾…†Ë3Ø“r+¸Äl¹JÄÖê…um³ÔïÌÒUKo? mÏ¢3¦«’Ô£œJ …¹Já#_ߥ¬&Ø ¾±OID©[SC1žµ4üË0ŒÀñ!ðÌ]±³B¡°³£ø¦z¾_¼Øuá×~í×ð¥/}IN‰ý=Oúb“³]ëa ¢ˆ IDa'*,cy”vÅ„"Ódý‘ñ:´¼órô@-KJÀQj1 q£×^_‰¬‡¥P<É}XÛÞA—3§Œdò’,ÖM$À¦ÿÿöÎ'¤Í-ýãßù‘À˜&…Ÿº0‹8!‰‹&ê@]Ü.,L ºðÂT$íÕ¹W¹µ´^©·h;ý3öNCqÌBÁ,êâvQ,Ô….ê"É€]¤ ]予‹¸x…ù=ç}“˜ÿêmmkò=´æ}ßsÞsžó9çä}ò¼Ï9gî¦öÐt±J?O #š-±øÉÓ[—ï8²èi äù§&ðûßÿ—/_.C­“«B¯¼².¾ýö[\¹rn·»(Z­°ò׿þ÷îÝÃÏþó¼x5)ubb"ïÚ©œ˜Û0ÔëÄíÐ+ÌË £ú´˜™®|XfâõSR‘)­ðué1n=V’­å9Y7Фh•ZrËùÚ¯“Wâ«çn+éö¦_F$>‰ÍHòf°b°8'ÊÇ]—Âÿêz¹8•VýTîC…÷©sµ#š ê³TüǪÿ9o.¦-™2[Úú¸š]Vþ»)™@ºh¸tÈõ‚pTZ“Ôÿ`}/£2šdòÙóEõʾâb[äûÁ+ß±fWÕøÖ°ÊØÕ`|ˆßÿôSDÄ•!™ØD$*Z¯]<ØÅ–Z´û„aoKÍ P*j [2^W”2¯kÛb‘,‹ÃÄÿÞ®øˆ5»t r¿úzÕeŽ,¼EW&Ò‰¢[é»ËîQk/Ç0-ky'Å'7µGTÊc  OA c<õ²Õƒñ·¿ý-þõ¯•¥¶}òä †eƲE|Ë>×Jİ"¾³+ói e–u÷M¿þ8iëA×ÄE_À#—þªOž Ál¼±«ÓèˆSaLÝPI uq…°¡¹ó*.DÆð*üD¼ùÄSÎíDÝú†q ûŠû’‹Á5LÝ^ƒ©ÅS »%ŸVôÜAjl ¡©0ìtJ¶ûéÉrz©Ù? ®NØ±Ž·öN¸2M!–ÞÑÀLøÑÖÓª™Ô× Eøø²d‹á |pƄ׬ýQò7‹nk7‚Ù²\}\ØCP&U¥»²¬€0‚Ë%\ŽL«Æ›¬JðòÉmèC^­h"G3zn®$m=£ð''MaÍ„²É#ØÎÉwÀPÆ."8¦Fº|¨•IÚa—’¦õ%<¼ñœåÖã-óÝb뼄&qWšŸ¸!26Ái¯ÇÆF3<±eWŒq¬¾§º¤üÌP×ÈþÑ+ˆw/Ÿà+£‚pv¦—m+ÿÝeiëÁˆ?…©pHæ1¤¿q<Ü·¥É”‘9[,H€Hàø™lÏûߘ_ŬÔ+Íï¿ÿ¾lµfîÀÀÔnMŸm«H2%¾©â¯v®ÔÆ §–³XrsG×&%;¿ÉM²ÓZþ}šX‡SòP_¡¨0%‹ÈÑp̲4%÷Q²í¼ÆõÛóh—%‡Š—3ëŒò‘ vQ‘'”¥°*<ÿ¸úûûõ;::à÷û‹ ÿç?ÿ©_ûÓŸþT§.üùÏFOO¾Jaµ3ÚÝ»wñøñã’;£}÷Ýwú-üãñ‡?ü¡ðös.ýÕèʹ>ñeŠ>2­†d2%;%6è?zõ\ÒF8 7”ÑljêÅå¦d|šelå¨1§Òç/”‘´à²’K“íÓ 56¥Ë˜Vi•¥Uþ×°`|?5{)±Üw—r¶Råëuý)âÔ†§$@$ðSý¶þ)™÷µÍoKK Ê­²`’I¿üå/›Ý§I'¢Ìƒ£¤JY-Qù¢zH– f‹(¹¥"Ô5%Ë  æ׬_‡æÅ™Â/J­ÙYII>¡,…åòœ>*é¯ÇÖL+?6Óã7Á7O"¨“¥úöÅÂë)œ„Yaœ”V:ÕæŸJFÉuøaÉýµ,ÚtáêJ¥”û~R÷”Ë/¿RþŒ# Ó"ðQ]U 5‰euu±X ÊeA)¶¿øÅ/ VO¨´CÚi`¾ù]C±4g_¿æÇò¬Ú(+b"aø„æÖ-3A´TœJ§^)¿úRñj©?ÔÄ3壛Ô6Þ™pÚF3å|ÌOõÚ~(`Çö®v·å3ø˜2±, ¨eÕu¡–A³î$ð9øÛßþ†ÿüç?ŸT¤¿üå/øõ¯ýIe`á$@$@ÕM࣭ºPÝY;8[:;;õ7)ŸBjeÉU+¤PÉýôY& ÔZtk«½Y[ÈPÛ±þûßÿ–ÉN2Ûé#†ßüæ7POH€H€Hà´ PÑ=mÂÌŸH€H€H€Hà“ ëÂ'ÁÎBI€H€H€H€N›ÝÓ&|’üe·µ¹éIܹ3‰¹Õ­“ÜÉ´%$"Ïñ|µxEIy©* Ène³sˆkS®¼ž›–±wGßÑ«äÞ+ïÍH“Øæðòx½wiÌ€H€H ¢û {AäéuôOGÒh˜{ˆ•MÀf“íBµ]Ì\ïÇtDmåùB*‚ëý×ù¸.™YáµÍ9¨ &ŸK%sBtæk\šáñž‡‰Õ%,­—QtÕ‚þ"ËÓÉ÷=åå혀l©½¼¶‚Õí£ÇÐæìæWâh´ÛPgÖ°*}òpl~(¹4¼Y^Áâêö‡Êù A࣯£{„4ýäè,²b5ùI…wKA¼ö=No% ٠│¹®x÷åLQf;®ööÂò!ùfòæççAÀbÒ7o9Ü2¡¼X±·{0¹Ðw¥MO”ŠËF-Ù±Yþ¾“ŨMdGÞãtÌŒ‹Æø1ïc2 ¨TtOÔÒ),ÜÃ~GÌË3XÙ>@]“Ã7¿L/ /¯&‚˜yÓ•·º&7ƒ}hmûn=„²ãl?ü «VîßíAâÍ2^â ¸Dñ»5eÄ¿†aÛT;"Yà¹ê’û•fª^{1»“—ThÂÀ£ïÐfÙÂÌ­Xß5®Z]ì„9:‡©Wz‰øªžûø²U,\/–qÑëÂ9ýa›Àƒi¼zk,âßäöc°¯C߉MY_o…Ÿ†™ù5©OÜÝÃè;߬—}þÁ¥ CI•ú<’ú_ÞÇüÔÚï—¾'YÀƒà+ì©’LMèDgki…¿RZÕ¹Í××O¿ÅÒ†ä&yù‡‡ÑaIµ^-.¢Éê‚-ÍwuöBkïT¡pú‡q­Ã¦$LOÏ"–aìÀ¨s£˜oÉÝäŒ,ø÷ãØZŃК>FZ-FÊ­mavòÖ¶ÕX±Â?2ª÷…͹[XRC`7ˆëé jA›çªŒMéwZ“ß¾€çËv¬Ì„!ÃMînÜì;oü€Þšô‹„IDAT,“¯*VÛzÉÉyýžú;ÌRt)=72s 3 'îw%=Ž’òp ß0†;›Qªo¦JqöA…H€²èºEq¼ƒƒ½=¬…‚xÓàC¯ßýí5ü3^n.L"(J®Ë?€ñÑl{ëxxã)väÑåõûtë¢Õ㫪O˜íïű¥+Oø¾ðè´x%¾¯OþwÁº·‹Ä¾aÕó%×*ÊèÈ舔ÝsJ³LIÙ¢lŒŽc ËÝØ"Öäm½¥Õ_‹RõD¹ ô¡£Y%ÞÇÖÞô,5<¿5&J.àÅHà"öÖø5½ªË¡¬¯{Û+ÎGà˧ǺõðÐk*¯ýÿ!Jnã…¾@÷Î’o=£¢?¢`Hý±·‚éçñ¢X-¾€1QrÍRÏñïGp±u‹oáu ?Ë#ÓÊv«û‹¢Ä8ÐðÃnÞFx*ÝûYÛC\Úr7‡ohmWXŒcÈïÀFx ËÊëAKüXP”\‘{`D8õâ¢ã\¾EÕá…H@‹?Ç„(¹VO/FeüY¹~îÆ&°¶kÇÐø8üΔÞT7û¾Q"?oZ¼é±×‡öú=l&ŒêÃîþ;Ìðøºá÷X±-cå1Êæ Ä19!Jn£OÊA§5¥O—Rt›M8Ø~…•´§‰•ݸ\6¨±_ªo–ã8‹" 3@€Šî I½}¯söâñàxŲë]òíeLame&g}mhlvaðª(tØÀ‹h Í.§®ÜÚÝ>¸Ú «hî#¯ÙëF½¤¶:½òpsÉ/•žªÉ{m¨¿ V¤ØšmR¶Ä«8Kú®]A[£6—[ì®òxMÈØÜ w£(·¦fø$¿æBƒh*&RÀAGk³Ü{W}VÄ^ jèÖ’Sº¿Œ+^/ü¢Ôãà-Þåø÷îþ_ûÖ6œ÷¶•|x+ñŠC ÿ{¾½“¸0LcUò«ËyòÇ–×ä7F¤žçl¸¥Ïæ^O¼Mûf‹iÅ)7Ññ÷·äéc²Læ®ÕÐl$}v ÍØÄ·2á-_}ͤ,øÌȪ+rF\¢ÐÔiø8Ühœ¶vâYg«sA„Væöy³“ìJÞPxÑ܆¡^'n‡^a^ âõb0V¡¸È„>I/‡ ‘ð¸i͹]\½Š6ÁÑTüCCE³À³Ao6uЍÝÃ[y¥œ5Äç¥àÉçB Ów²}%ÓÇ•€rl4ñ= z‹ÛÿXuP]!¹:ÔC…|SE‰Ù3~º.É %<˜ˆKkÁU¯ú•™B¹¾yx'H€H€Ê ëB92'¸n<»,òÚS^h®Ïa9.C™ìô<¼,¹4¡Ã%¶¤ôno;×oð¸…XànëÓö¦åÕfRür7#$ä©™P>}2•[K&e"Ü¢®Xk)}—¡4ìb+Yâé*+0(Kéú?f @“ WáåmõnJÜŠA&ß,/G°£5Àá4VȬ¨°ùü®=ÍEæyÎÛ‡‹MùW[Ú¢í®av9.)™€·h¸tÈõ‚pTZ“˜ÂÖçñ2*¾ª=•[D+ÄŶ _¯ð…0»×­d;ñ(â;,¸NKÓOW†db‘¨áH©ë1åø”ÀÓÓ'`m‹«ô™å(ñ|LOÜ”²-vñ»UM,î22>5ÑãѨøÏ¿g¨¯Åª\”öžYFb'Ž…Éo±.¦â¬"^XtsÜ2&÷Äo¿ÞÝ å\¡ìÐåú¦ŠeTH€H <\sWùTŒÉP©BÎ’¶ºúFqawB&¹Ü@X¿CÍì6Xò@ôµÈ+ÉŇèÿÑGïÓ'§e3–³Bý2·¬¶žtIÞ‹‹AÜXTwÕ#ðè>:d’ÛRpS7ÖeQìò0ßM"âz »O&À­/É„¸¯Ä÷®åéŠ è“ ;{AL}Óoˆ!>Š#×sE:<ÖÌ饑’X6*‰:YéÁŸží­í%p°o†>Ç«à‰nÖßÁæ^4‹nk7‚Ùr\²äÚ…=e2X:§—K¸™V5”IÃË'·¡#S3í¥Î=7W’¶žQø“Òv¡)™lhˆã<‚í\F‡º0öpÁ± =¢ÎÀã¶Æb¾®Ÿh)ÌÖžïC ¹ó*.Dd‚eXÞrHF-n'êÖ7`ÖßZXÐsw©±)„d|MlŒ!5©Sïš9…õŨúΑù6w"à‹ ¸†ê:¦'ìuHä½eÈ)T\š:;íX_|‹ÎK‡îQåû¦™}0I€H ŸýWB‰ë¼ô´”¼n”ûÕò`…AÅIDy«Ná …çrJ93A¬SIÍŒýš£ˆL|áyæ¦ÃÏ”º¡0ÏÃè²GF=-ª:>HRQ-ó”©IÙBŽL«!™LÁÒÐp˜—Ú0â« ò /WAÕYmWX®âd–•ò•¢£ù–•›§B@“7)QõUãJ”`ôÛ‚1T"ÝI/•ÍWõ)b åÊ)huú:Bq/=.±ô^Ù¾É>˜ƒ‡$@$Gà(ÃE^bž@%åLŽWû‹rå«!«•©xn …ç¹qÆq)…¼8Uñ•Jõ,N}Â+R§\]¾âÝG¦•¢äªŠÎà›'Ô™䥲G6e~©¥9Í7?ž6³E”Ü …œV¿-›¯êS•ÊȺó¡Øì݋ǸJS¶o²fò“H€ Т[H„çUN %þÍo°½+¯}ݲ Õq*'Âê}&R;ØŒï¡Y–±Ëû­ú™ˆG1H€Hà, ¢{[2“ I€«.‰ˆ H€H€H€H€Î"*ºg±Õ(3 À‘¨è‰ˆ H€H€H€H€Î"*ºg±Õ(3 À‘¨è‰(7&;uÍa5Q¸eDnš÷9>íüO.["òs/£Çº1¹¹ŒéÉ;¸sg¯·N‡ÑIä9–ÐLD$@$@$Pµ¨èž¨i5¼YZÁzBm°pá´ó?¹Ì‰7ËX‘­seSãÊA‹bâa›h„­Q¶BÞ]Á×ý×ùÀ¨Ž-OeiK$@$@$P¸aÄIYˆ™÷×:éÝG§?íü– /EÚ}B¶PÍîG‘›s’x‹=Ô!p³Ææ¥)X»­húÀ ‚[žÑ*ÆÐ?õCϾCkÅ„Œ$  8k¨èž°Å”§%ßbîÎ V¶P×äÁðÍ/Ѭ"¯åµý<䲼ܦN}þÁ¥ èQVÝ-±Å§¤SÙì'ÖðôÛ06ö$«Ãã}°éš¦†ÕÙ­½“T&8ýøÖa“c Úf'`m{_N¬ðŒ¢Ã¦´ÌîŒa¿£æå2«{sCn>õ-°›E½l#ÑÖê,„ÖdW1)ÅéÇèµXÄš{kbIO0sýº‘PöɵXl¸êuáœÜ¿97‰0<ði+˜_Ûñ›Ð}ó&ÎëàŽY¯ò…;«3›ÛEàþM´¥•ëÈì-Ìîvàþp°µŠ“!¼“È2Ew¦^éY<ìïG“gß}i´W&_~’ œ]t]8aÛÉ.œØ˜âMƒ½~7ö·×ðcÌx±ŸJʦ²ÞnŒŽ¢ËaFli [*-‚ˆ’Ûx!€ïGÐý…3WwÌ“@å[ c×Ñ%ùû`Þ]ÇÔƒe=ÍæÂ¤(¹»ðcÈïÀFx Ë ½,ŒM`m׎¡ñqø)„§‚У$ú`ok¡Ò2ç Ï'%Ÿm+zEQè´"¾+)ÒŠ®&ÖÏ Qríþ!Œù‘ÚcZ `¶á O“$4ÁëïC_ŸüïjÇÞnûiW]MÛÅöÊ<æ# èt¡é`áczñ•êUIž\ÙÏ9RÑwx±¦—¨M„…U³Ë³¶‰É‰?ÆÇàH¥™ŠÜ—|-z6n/º:šs³ä1 À'@E÷„ ¨‰âVçìÅãÁ+ðŠ•Ô#6ñ·o”…°´vâZÏy4[ápÛåÊvs|TwÿO?kÎ{Û2º£~_îMÒ·tŠe±SÏÿª§x÷q±Ì®)Kh“v« M­â( ê\B”ìTL”\‰òxa5™ÐÔª¬¼[ȸW’9·lh1±RÎÀ0¼¶f´uô!à‘RÒuˆ­¬Iò&xí 054Á.ußÚTê´í¥$šá ®Ë%ÿÏ;uùòò791þxç]¸ä?ÞXD²®P¯#äÉË»¡¢k¿ûqYwçõvŲý…¯Qð¬Aª…v¯&Ó9´Ú¥N[qñ;¶H;5JL=<>/Ú¸pRž ÀY' ª ÃI(¥Ñá3¼Põûr^ë'7_bêá¢(XbÛÔÉŠ’ª‚Ù…@——0ñͬînŒ÷/©ì*h}£U¿M¿µNå‘Àž(›â l¿ÂÄmãu»Š·¨\äŸz[¿ý*ˆÃ¨Ã<*ɬò( f±ì– &£'ƲÑÖ´›€*CêSÉ©éNÆ5ù{ L.ŸLU3‚¸ýfCÙz¥S”“'›~`FÇ%'–‚kx³Ó…Ä‹LŽ^´J9©t/_ N`%s“®‹©Ë­‰|‘#S&?I€H€H€Î.*º?¡í4]+*¼qs¢ä&Ýxví<Ÿ“INo²‰Z;ñ¬3‰Õ¹ Bò ?,Ä¥…•æ\-p_|daÓ'ué+ˆòölЛ—(ÁÊèê轇AoC~\ú¬´ÌI3ʪ)­½JtnU”¹Ü{6ˆÒ¥äWxZ üf¢lK×KOSFžÌý™Ï±·`CÜ6&Ä]¸Ø•æ¤W„î{ÇùÁUôPº)2±ü$  8ƒèºðÍÐwuK®E¦dr áU=ç”Ò¤d‚×òr;ZNÃ'TËš@óP>ºë¡Dw4h;,®‰ÆæpâœXSÝ^±ÒÆB˜]‹ÍUÃN<Џ¤ƒÅŽv1üÆBÓX'¡‰æF±“ŸuÞYF§Í»h©×-®ë¡YD DÄ'8¸.ÓÎD&•Þîi—¿1LÏ®")ò§vâˆÆ+•’—{‰•k¥zU–§8C:ÝõºO2ê<ȸÜZqb8Àüô,âI!—J U %èJ°†„pc   ¨.´èž°=•á¯PI´˜ÆV\’ YÁµyÜX— drT½(…¡±¸{°"6 «“‰fþÌÒ…åKæ&ó;<¹ý•SïÆh@,ÄÚzFáON š’ÉeF´;ð¶sôÜAjl ¡©0¢êxte¼¢7’gÿ2gOÓ6p+ø OƤu-p‹?ëzÂX^ÌÒÖƒ Sán¤¨÷pßvNÜ*™òfÑâŽ&iÕÒeÊ׫²<úÍ\—d……õEØ/uZÍmñcb*Œ©ÊÏX‚(ÂÛä7‚G|×±øð~tð÷k9n)FJþ%  8£~ö_ gTöÏSl1á¦Ä,«,»b:—‚ô±~š%YÎ ý®²üroR¬Á %«8Qˆ-’Q¡j©Iùš\µèT.¢|¬&Vi‘¼¡¡(ã/5Qå P>Ó£cÊÖë(y³ÞYÆíÐ~¸¶²¥’b¹¹-‚§Rª>%n8ÌšG$@$@$@gŒÝ3Ö`·¦ûdz‹Ÿô°a¯”šq$@$@$@ÕM€Šnu·oÕNù&oÁbkEc CxÁ`uI€H€H æ PÑ­ù.@$@$@$@$P¸êBu¶+kE$@$@$@5O€ŠnÍw    ê$@E·:Û•µ"   š'@E·æ» @u ¢[íÊZ‘ @Í ¢[ó]€H€H€H€H : PÑ­Îve­H€H€H€H æ PÑ­ù.@$@$@$@$P¨èVg»²V$@$@$@$Pó¨èÖ|    ¨NTt«³]Y+   ¨yTtk¾  T'*ºÕÙ®¬ Ô<*º5߀H€H€H€ª“ÝêlWÖŠH€H€H€jžÝšï@$@$@$@ÕI€Šnu¶+kE$@$@$@5O€ŠnÍw    ê$@E·:Û•µ"   š'@E·æ» @u ¢[íÊZ‘ @Í ¢[ó]€H€H€H€H : PÑ­Îve­H€H€H€H æ PÑ­ù.@$@$@$@$P¨èVg»²V$@$@$@$Pó¨èÖ|    ¨NTt«³]Y+   ¨yTtk¾  T'*ºÕÙ®¬ Ô<*º5߀H€H€H€ª“ÝêlWÖŠH€H€H€jžÝšï@$@$@$@ÕI€Šnu¶+kE$@$@$@5O€ŠnÍw    ê$@E·:Û•µ"   š'@E·æ» @u ¢[íÊZ‘ @Í ¢[ó]€H€H€H€H : ü?ɵŽzœªRIEND®B`‚152_add_service_template.png000066400000000000000000001005561516513262500347020ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/15_apply-for-services‰PNG  IHDRkL” û÷,iCCPICC ProfileX…•y 8Uß×ÿ>÷ÜÉåšçYf2Ï$ó<ÏC*×<Ó5E‘ •dH!…DŠFSB†”dÊPŠB©T†Lyªïïý¾ÿçÿ>ï~ž}Î箽öÚŸµ÷Ú{ßu/¬¤-Aadkm^G'g^Ü8ÀZ@²€‚ä¢eii òçýßËÒ€¶Þ/$¶lýÏöÿo¡óð u²D°›G¨{ ‚ï€fw!‡€éEäü‘a![xÁŒd„ XüöÞÁœ[ØmKoëØZë X<‰Dö€zË>o„»7b‡:i£òð BT¼×݇ä{¢³;00x Ï#XÄí?ìxÿ7›nm’HÞñŽ/Û¯ë@Šú?NÇÿ^ÂÿŒ± ©T>dCë-Ÿ‘y+ó6ÙÂTnr3·@0=‚ŸøzlëoáŸpC»ßúsî¡:ÈœfPÀƒ¤k‚`d.QÌáþvZ¿±,‰¼ÝÑG™û†ÙþÆnä`ëßöQA榿í$ûxýÁ—í´è oà $~KþôpØn Bž6 |F'ýÛO{»ÕD ò¿Ò§ðÚnØîá> 8ÍŽÞ‹VC›"OM¤Ê¢•Ñ*úñÒü«‡ÕÅbõ±¢y¸#¬J¾ÿ™ òöD¼ÛâôLJìa>`ú0ï1ƒ˜qÌ+`&·­üÖ:èOþs^`Ækú¿½sClÎþÑA !¬ÐÚhu„?ÂÍŒfhyÄ-´â›"ýO†á¹ý3—ÿo‹õúó[N-F­ð›…Ûß•Ñù«õo+:ÿ1GÈÛäßšp2|î€ÁOá¸ðÂMp-Ü?ÜÂ#ar;þŒf½ÍͱãûGGºBzVzýŒNúÍ€¼½Þ ÌópØÖ†Ð ‰"ûzû„ñj!'²'¯Q»än^YiE¶Î÷ãã‡õö¹ 1÷ü##!ç·²,ídÁÈ9P™„õ…dBÈÞdSàŽµ{89bG†Þz`Ð ;ƒ p~ ‚ø$ ÐzÀX[à ³îÖ‘à(8’@8 ²ÁEPŠA¸ î€ÐÇàèƒà5Sà˜K` ‚ D„ 6ˆ„Ä!YHÚ éA¦5ä¹BÞP… 4ètº•C·¡:èôêƒ^Aï Yè;´Š‚QT(FJ%…RFi¡LP¶¨ý(oÔ!T4*u•‹*BÝ@U£¡ž¡Qã¨O¨EÀ”03ÌKÀʰl;Ã^0Ž…SḮ„둵~Ãsð ‹f@ó¢%ø4DÛ¡ÝчбèSè‹è2t5º ýý=þ…!b81âUŒÆã‰Ä$ar0¥˜û˜vdïLa–°X,3V«„ìM'¬öö¶[…mÆöa'°‹8Ž 'ŽSÇYàH¸0\îî® ×›ÂýÄSâyð²x}¼3>ÏÁ_Ç7âûñÓø5 Z A U Š(ŠtŠŠzŠŠ)Š5A˜ N°%øŽr •„vÂÂJJÊ]”*”V”¾”q”¹”·(ŸP¾£\¡¢§£Ò¡r¡ §:Cuª™êÕ"‘(DÔ$:ÈgˆåÄVâñ'5µ$µµõ1ê<êjê~ê/44‚4Z4h¢irhîÒôÐÌÑRÐ ÑêÐ’hcióhëh‡iéèdè,èéNÑ]§{J7C£¢×£÷ O¤/¦o¥Ÿ`€øtÜJÚ¦±ŒÂŒFŒ~ŒiŒ7»ç™è™ä™ì™3å1=dg†™…˜˜˜Ó™ï01¯²p±h±x²¤°T²ô³,³r°j²z²¦²V±²®²ñ²é±ù³e°Õ°²£ÙÅØ­Ø#Ù/±·³Ïq0r¨q¸s¤rÜááDqŠqZsá,æìâ\äâæ2à áºÀÕÊ5ÇÍÌ­ÉíÇÅÝÈ=ËÃÀ³—Ç—'‹§‰ç#/¯oo.oï<'Ÿ!_8ß¾n¾µ]»ìvÅïªÚ5ÊOàWæ÷âÏâoáŸà08*P!0"H!¨,è#x^°CpYHXÈAè¤PÐŒ0«°‘p´p…𢈆È!‘"‘Q¬¨²¨¿hh¯JLAÌG,O¬G%®(î+^ Þ·³[ewÐî¢ÝÃTZï$™%M%ã%k$¿H H9KeHuHý’V.‘~-C/c,/S/ó]VLÖ]6Ov@Ž(§/wL®V¸¼§ü%ù— f 'Z6•ÉŠ•гJJ®JùJÃʌʖʧ”Ÿ¨`T´UŽ©4¨¬¨*ª†©ÞQýª&¡æ¯v]mfðÏ=%{&Ôw©“Ô¯¨ïåÝëº÷òÞq > ’F‘Æ{M~MÍRÍi-Q-?­Z_´¥µÉÚ÷µ—uTubtšua]ÝTÝn=z=;½‹zcú»ô½õ+ôç  Ž4b M 3 ‡¸ŒÜÊæ•ŒcŒÛL¨LlL.š¼73%›Ö›¡ÌŒÍ2ÍÞ˜ š™×X #‹L‹QKaËC–¬°V–VyV¬e¬ZwØ0Ø´¹n³d«m›nûÚNÄ.ܮŞÆÞžÜ~ÙA×áœÃ¸£”cŒã3'v'_§Zgœ³½s©óâ>½}Ùû¦\\’\†ö ï?¼ÿéö¤9H:x×ãêàzÝudA*"-º¹å»Í»ë¸Ÿwÿä¡é‘å1ë©îyÎsÚKÝëœ×Œ·ºw¦÷¬†OŽÏœ¯ŽïEßo~†~…~Ëþþ×ü7ªñ®uAôAþAmÁÜÁ‡ƒûBÄC’BÆ©Ê>4O6!—†B¡ûCkѯ:]á"á'ÂßEìÈ‹øiy÷0Ýá Ã]QbQ)QÓÑúÑW ¸i9ÊwôøÑw1Z1Wb¡X·Ø–cüÇMÅÄ•'÷?þ<^:þ\üB‚CB}"Wb\âÄ ƒIÔIä¤á“j' “ÑɾÉÝ)r)R~¥z¤v¦I§å¤­Ÿr?ÕyZætîéÍ3^gºÓÓ/Åž :;”¡‘QvŽî\ô¹‰L³Ìê,Þ¬Ô¬…ìƒÙOsäs Ï·ŸÏ5Í­½ páì…õ‹>ó´óªò9óSò— < ú/i^ª,ä*L+\½ì{ùåƒ+ÕEBE9ÅØâˆâ%ö%W•¯–—²—¦•n\ º6^f]ÖV®T^~ózzª"¼bö†ËÞ›º7k+%*¯T1W¥Ý·Âo}¼íz{èŽÉ–»Êw+ï ÞË¿Ïp?µªŽªž¯ñ©¯uªí«3®k©W«¿ÿ@òÁµ¾†¼‡LÓ ‰›MÑM‹Í!Ís¼M´lyÝêØ:ÐfÕÖÝnÒþä±þã֭ަ'êOžª>­ëTî¬y¦ø¬ºK¡ëþs…ç÷»»«{”zj{Uzëûöô5ökô?z¡ûâñ€ÑÀ³AóÁ¾!»¡—Ã.Ãã/=^μ xõm$bdíuÜÌ›ÔQÚÑœ1α¢·¢o«ÆÇ¾Ó}×õÞæýë ÷‰O“¡“ëS‰ˆr¦y¦Ëgdgfõg{?îû8õ)äÓÚ\ÒgºÏù_D¾ÜûªùµkÞq~êùÛæ÷S?Ø~\[_hY´\[ \Z[NýÉö³lEy¥cÕauz-r·ž»!ºQÿËä×›ÍÀÍÍ™´ýUF*ÊË €ï× :À€äqêüëw¡­´{Hú„jƒÐ6M¬0ŽÏJÁCP§4§ò'ž¥®£™£“ ÷d(fœ`c‰bmb§ápà,áúÁ³‡7‘ï9?€µài¡g"@TNÌKüüîN‰e)i+™8Ù ¹A”¢ŒÒ~åT•jÕw{ˆêÊ{]5R4ok½ÑÁë*ê¹ëŸ5¨53†LL ÌüÌÓ-îY¾´úiÃl+ggaèpÚ±Òé™ó»}ó.Ëû×W‰ÍMÂ]ËÃÚó —§7ÉÇÆw¯?ä?Ðx9(!Ø'Äò2™7ú5l(¼1¢,2óplT@´Ó££ê1J±ŠÇTâ´Ž›Ä;$x&†8‘”u²$ùnJsjWÚЩ·§§Ï|Nÿ~v1céÜbæbÖjú~ÖÚõèyCwUOnohŸN?±ÿÅ‹¼¯A…!ÌÐðpÙˈWš#Ø‘$¾ÞLfŒ©M¼==®6þé]á{ë x¢jÒnre*ëÃîMÓÖÓ“3'f¥f'?–} š“›[ü\õÅý+Ý×ûó–ó¾ýÎòýñô… EÒ’G“«í’››ÛëÏÝBùÁ²ð ú6&ëˆSÇKP„)wQIU©­hÜicé éf™h™•YH¬Él÷ØÇ8)¹ä¸÷ñÄñ^ákÚõšQRˆGXAÄHÔU,J ýýÎ"f»Þ"µ¸uº·{Ü÷Ì÷:âíà#íKå;ç×ë_P˜”B>äBÖ å ]  ¿‘évX/J:Zà×Q¶¦XÚcØcKqïwÆßNÈNŒ<±?Éø¤n²i )õxÚÕSOù’¾xv9cñÜÌù¬ÏÙs9_Îÿ¼@{Q%/(¿´ ûÒDáìå©+o‹^÷•<¹ÚXÚp­³ìóu¾Šý7òo¾ªb¼e~;9½VîKV{ÔäÕö×cÈ7|x¢±´©¡¹ñÑõ–³­1m‘íqÓ; ž?½ÔyæYx—Ís‰nt÷HÏÞ´>¿~«zzƒVCnÃá/_‰yíõFg”}tn¬îíÉqÇwïñï?L´NLú 9M5=0S<{ì£ï'9ŸÏ_B¾†Ì‡|#øµ¹è»d°L³|÷§ÞÏg+Î+ŸW{ש6F¶×_´A&ÐK”'Œ…ÓÑâèL4V ;‹»Š÷¡¢X!tRRE­©ei¨i–h_Ñ5Ó—3d2Æ0y3[³¨³Š²1±­³Ïpôs6rUróäñæðeíJçOˆ$ é ó ÿé- 7ÜÍ'’˜•–z"]/s]6W.NÞUAE«Ø£”­ì¨Â¦òJµ@Íc¬:V}loµFº¦–®¶­.Ðý¡7­?dðÀ0ÇÈÓXÐxÜ$×Ô gÖjž`adÉjùѪÑ:ÓÆÇVÍŽh7fÓᨣ±“Ó[ç²}ÁÈý¿²ÿḃ:®x×>R¾›¿û*Ïk^‡¼•½×}š|ãü4ýsÀñ@ tP{ð‰­Ÿ‡*ÈNÈ]f¶ž±'b,2î0×á‡Q®ÑÌÑ#G*Ž&Ä8ÆŠÄ.kË< –Èz‚2 $-œœH~žR•z*tJþ4îôÈ™[é©gý3 ÎÑŸ{œ¹/s.+:[+Gû|òüÅԼɶK²…*—U®(I‹”ð]e+¥»F(£(§A"Iý†ëÍ“•7«^ÜZ¿#r×ùÞ¹û}5ŒµNuùõà ˜‡¢MnÍÇ]jil}Û¶ù˜¯Cç‰÷ÓS·Ÿ umt‹öìë=ß7öBvàôà—a›—u#|¯³G¥ÞR¿‹œL›‰úlþ}iÅjkýw~‡Û*X$;ÍDòLûÓH £É3ÀBÀ’€­ @¬(ƒJùŸø{@Hâ‰GrNfÀD<’išg$s> RŒòhýàX‡è!QHÉC¡ÓH>ØM  Jå:‰dyý¨U˜6ƒ£á2xG«¢ÑÅèWzŒ ’‘µb!¬&6Û‚ÃàŒqgq/ñ|ø|ŽÂ¢Œb•`F¸BX¦4§,£BS¹Qµ‰)Ä/Ô¶Ô H¦“A hÑNÒ9ÑõÐëÓ?dPf¨fTele²fš`gÁ²ä° ±Ö²™³Í°'sÈpLpr¹q‹sÿäyÌ›Íç±KžËÿZà®`ºP€°‰ˆ¸(Qt^lPüÁîK±’.R*ÒŒÒó2Ïe¯Ë¥Èû(+J*1)m*VSíWëÜÓ®Þ¶·C£[sDkF{Ièa‘soˆ7¢0¦2a4å3“77·²Ì²j°ž²%ÚÉÛ;9Ä8^vjsžv¡Ü/}ÀþàQ×R·ÛOO¯Þ >«~:þV‚܃ûé“Âäë"%ߎÞs¤7&øgÜP|V¢é‰¥“Y)»SÛOyžaJ›ñÚŽ:º*zòúʆb¯˜t˜Î›sXèYú#wZ–ÍyÛl»,ûËMŽßœöŹB8d‘¡\¨úˆbFé¢ÂP¥¨˜6‚áfx­†ŽF×£×1Z˜TÌ0V{;ŠÛ‹+ÂãñÁø ŠŠàG¤Ô¥|@¥BõˆhIü@OÃGÓLëB»Dw–^‚þ9C#‘±ŒI›é s 7K7ë67vm1NFÎ5®QîZžs¼|¦»¤ùY°+‚ß„¾ ÿ٣ح)á*'U ]+óBö‡<»‚‘b¼R« •ª‹Ú-uò]µQk—v¦.³^¥³qŸéEó`K;kY›;gû.GC§û¼\~Hp…H!nƒJžùÞ>ÇýþÅfÁ ¤†ÆÞåqäKlI\Ôñ¡øõDÔ |íI¹äД4»S³g’ÏJf¼ÊLÎVËù–[~ñ@>¡àZ¡Òå‡EÅÍWuK;Ë,Ë*loôVêWÕݹsþþ~LõzmJ½ÐƒÞ‡ñMŠÍ³-ùmÑž†>ïšì¾ÔëØÏø¢0}ØøåæÈ7£3oÃÇ7ÞÇOÂSñÓ¨™„èOÇæ¾|Ñÿ5_ðíô÷ðº?–®/š/¾^òYZZŽXžýéò³gEg¥b•¸²Ú¿¦°–»ömÝh½h}mÃvãæ/ø—ã¯›Ð¦Ýæõ­õõ’“ݾ> *m0c››?„À`#css­hss£I6ÞаóßÎö]C @þÛ-Ô)6÷ïÿXþ ÷wÍŽ©7]‡iTXtXML:com.adobe.xmp 619 332 üï;@IDATxì½ T\çyïûw¬!ªFM†‹$3N3¤ÖÄÍøÄCk¨{DOáÖpÜ gÀ]BëÈ(KÒ2ø ÝJʙ̩PŽîÒ­ˆè´ØŽ–z™s 7¾.¸·¨I!-4ñ4.rË´×3µ]&‰Gµgäú>ïÞ³ç‹áCÿ7aöÞïÇó>ïïÝÖüyÞwo@ÇðG`"   X—>¶.½¢S$@$@$@$@Š5Þ$@$@$@$°Ž P¬­ãÉ¡k$@$@$@$@±Æ{€H€H€H€Ö1еu<9tH€H€H€(Öx À:&@±¶Ž'‡®‘ Åï   XÇ(ÖÖñäÐ5   زT(YjUÖ[\Y+4A$@$@$íYËö¤ÿ$@$@$@šÅÚ†ž^ŽH€H€H Û P¬eû Ò   M€bmCO/G$@$@$í(Ö²}é? À†&@±¶¡§—ƒ#  ÈvkÙ>ƒôŸH€H€H`C XÛÐÓËÁ‘ d;еlŸAúO$@$@$°¡ ¬+±6ãDßðÔ<Àg0ØÓßì<Å*;Æìì,ÂáÈ•6w‘écà—Mnn= d5k Ÿ|»w»1µˆ†º5Ö…ÞŽëg¾….o/FƒK15x»Ÿßƒ^x{ö<çº|™¬,;/ì»$c¸”Ù·e[]»†¿ýÙOâ/vÿÞkøwøÙ ¿¿¯{ÿÙõ9¬Á °vƒdO$@$@$pŸüÁÂþú¯¤ôþàÀ·~Ç/Êœ’·KþÛ wk8^?<‰Þɨ\úÐ7ÀÑb[¼(ýd›e`2¥gë×f¤9™JÃpwŽ£ðà-µ!ðÃVµW.™í•8îî ÷Êùs7–¾ôYtü;.üø-¼4z?|ˆboÿµ(¿ûp.*úŒîÆ ë’ Ä Tå?„WËP«W¢Ïpê¯þJ¨õ<õ%<»3_ùÕø½“øÉ?‡ãmîædÕÅÚôàU„Lv8wø1Þ=Œpq]BðDèiqÃë V s‚)j(0Ñw‹R W‰ RŠ‚L£ ‡¡ä`T}ˆœ3Ûp&ÕK¶c/k‚g±æÃtÿIt‡v¡0Ћîq ¾Üïl.-޵žE׋€½Qk™@oàpÚtÿg|ho=‡¿ò°×žÂÙj" ´nÒ§&{ÎžÚ [F…ëb•;?ùKh+Þ‰=úS¼|c&ÞÛërÃôûßÅä3O éñ‡qî¯ßŠ—ñ„H€H€H`é>üè£xУåÉ/àAm_Ê5kBMYùW‰ˆü«ÔYnZåU°®öúálhFóþ2 äÅõ€ájƒ-"Ôl8~þ¸ÄØ•ø’¤–MM‰eYñªªÄ„–Þ1„K]¸*WxŠôÊÉŸÚ¾:+œéë›1w{Ý™§'»êÿþ¥~?ŠOmMâ˜äJ(rG2øYW/|ÉŠ?þ;CÄ&Uâ) À¢Ô5#šfTÞ.o_ø}ÙÏæ›ýG#kYÇÕk²é¿SÄŽ³¬… ŒŠlrÙ}èöŽc`l‡œ15ᣟë{ÎRÏã2C„ÕRˆf[<§j±ûH/¦oE ‰Á\¹v(I”ÅúV‡´'T5ÀÈU´Ÿ¾.{ä qÔSvIMôÍqAøEÛH`-‘´˜Ð|åeh–¨¸vgc²ú_ž°k´ŸÉƒÉiò÷ð¶=ý[_@Õ÷~‚báÛä:<'  X˜€j/—} 5ˆà‘ôŽJÔk²>þàÇ ö°©¤:XnúØr.Önz°WZ!î¯Feu5ª«+QYwhéAØl]Œ ´÷bjFöŽÉf÷€«ºe‹]J£^tNa&àÃé=níA½4õ3EWßò dÑqtpXŽV8väÀ¾«BÎGÐÚ3p$‚ðlSù_Ö–“¿ %¦(ÆÇý²BZd-fôjÞ¹Kó½óô%øfÂÏLÃ75=?ŠÖÖñ%"¯}›ÁÔT ]fÖäØõÓ­‰ Wn¢Ü'´ùÇeóã§É„?}k¿yí/‘.äÖÄ9vB$@$@€€Ú£f5µG­¤o_yÍßæÛW¾8ËoâÛ{ço2‹Á^¿ÿ)åƒÇ¿;¿™î‡ì•H€H€²›€z£B¥ý!|f[N|šz à+ß{ü{a@ö³ýŸþw–=ÈÐ1¼¤gI?:P²ìNn(Ñ®°,’šÍMD{-‡R¼HÒíD$z–“››aÉ3ÖIúYAåÿLlª|¥,ÍËìì‹#‹Œ÷îŠÕ»_þgy2´èÓŸ€E"l¯¿Æ·ÿ&ˆ›ò À½xHö‡ï«Ÿ¦=õù¤|ïþå­_ z[ÖX»78µõJ‹µÊ‰ã"  N`Õö¬mtp ¬еµ Ì>H€H€H€H`™(Ö– ŽÍH€H€H€H`-P¬­eöA$@$@$@Ë$@±¶LplF$@$@$@kA€bm-(³   X&еe‚c3   X kkA™} À2 P¬-›‘ ÀZxà#I‹u466†¢¢¢Åª±œH€H€H€H` ܼyŒ¬­ Pš"   •&@±¶ÒDiH€H€H€VÅÚ Â¤)   Xik+M”öH€H€H€H` P¬­ Lš"   •&@±¶ÒDiH€H€H€VÅÚ Â¤)   Xik+M”öH€H€H€H` P¬­ Lš"   •&@±¶ÒDiH€H€H€VÅÚ Â¤)   Xik+M”öH€H€H€H` P¬­ Lš"   •&@±¶ÒDiH€H€H€VÅÚ Â¤)   Xi[VÚàJÛ›lǹA¿˜µãЩCpäÌÓCdíÇÎAÕÜQþŽ–çÏSqcfGf¦á „““§Ó¶®9 ‰ˆ¯9Øf± ×l^{#3ðù/à(pâ>x°öcf$@$@YI`ÍÄÚXû>´Ž„4H…Mq´8oIÀ¢3SúƒR7‚hTó‰5ÜÆ”ÔS5CÛK²½+E¦ûðü‘^͵ Ïìu.MFÜhAË€ð5UàÊ+{×¥øO Âíî„_Ícr²VáÊ…º5õ9|cî–ñÂÏ•W°DÌÉ^óœH€H€Ö„ÀÚ,ƒF|¸jjTãW^òðæUg©D5·¥–dÕU4ºt2É3™,úåSröú9LÁ},!Ô,v'œv«îß­tõ¶n› N¶5èŒ] Àò ¬Idmf¬_[žŒ»ÀX ¥ó|OÎÎÌ *¼¼\˜ ,…gEe)-O–ÒîE¢…1#KˆÁ“——¹Ãðì B·ETHÛœ<àÆ¤h-™¬°j ›©ÕÔ•¯ï$ܽ“ñ«Ý2OÍx•øIdJ–©¥F;š=5p·Âg”Ú«ðí³uÈ5®ÃS¸ävc(yíÎZ†3ßÜ|ÑuÁ“hìT~8qêe¾§.ìË{Üš?ÎúóðTêÂdB–‚[$Âx7Ë›†‘ÀÎnÅxЀ£—TÉRi¬áMõƱ^?`‘%ÅËú’â]sf'[ì…¼Ëy“>%Y¬²TxA[* Œ^Âá¶!™ÁÔTvð ö—.mŸà‘ ÌŠXÓ›a³% ä0†/¹Ñ1$c‰'+žù&Jp•$Jwøùcšø«hjF¸»*pk*ûCßÒç2}i5>'v™§³°û{ 16e:0чÓ-½i÷’]ÆV_*]ä~P6˜H€H€H`% ¬þ2h` Þ rÙ…£žf”ļ õa:v®8ýBB¨©e2‘vHÓ&ZÕÀp²P³È†z‘t~%*––¢ñEX?Z“…šjî÷¢c83ÀÉ=ÇbBÍW¡Sâ}’‚C8âî—¨Œ<̰Ó«ëØ__œÙûD˜¨z"0¨…Ÿ"{²8Ñ þ˜ÅR†P3Yí°[-Z›¸h2VO“Œw5Î ¡fqºà´cB-ÕµÐqM¨Ù]…(++„î0ÔÑŸáCjíÊ,ói,<†&»ñÂîÃèŸ08 ">¹'.Ô¬Ò‡¾PDÇ‘VLé ¥r4ÆhÓ…šná³(+Œõôâz’ùÀõ>mNL%5š N°1ú–=Æ$¡fŸ­eOÍ›J‹ßz=~’ ÀÊXõÈšo°OóÖRV òP^kLjŠa³8T ÇWfF{0—½â8Îî-«0úÝûÐí‹KÉ  §cÒ¨‰ãß> e"<Õ}ǺçD|b8Htí¼ÎÈuì;Ò©µ÷kÂÏ&Q³NñROµ§® ZE û.a{HDÝ ˆ“Jäˆ íÖê]÷£Îá„op$ÑŸD"@•pHdLŸ½;ïJ«E0ØÑ—³ö<ÕÝ~$ŒHNš±yŸ­X`œÃ]ñqÚ«<8[çû=¹ñ0§Þ¥³æ ¾]“+Ëúõþòì>â•‹&D¬:çÛ©o.ÀÙ¦24JTNO~t·4¢;)J‰ÀŒ©µË8Ϫq†'$JÙ"Bˇáa8bösbVÔ¡äà)Ժ̸µÀªM‘ÊàªDo˵èí¬Dwõ™¬©pies?¦ÑÙ6ÏÖç[d$,*TN—t?èMâvxB$@$@÷J`•#kÓ¸:Ô|¬(µkG[Qy<Â2Ò{=!¹u#))wjuÕ7¤Óe‹ÇáȵXr–kBM]™íƒw›L¨? E² g¶ÙãíàT(07x}xýýýèé2ĆDž´Hš %.}‘€Ûõ ‘8ŒŒGãíDÕÉ+5"ŒhyÎò‚Eö_%5ÕN£²§+–g*Aƒ!ÔT–µdÑ«•á°Ø8gâmÊKìí™^¢öÉÉRàp_ÚÛÛå¡])É£ŽL:±ïÇ•óÍpY’2U”rÏa-*jׇ5Þ}=]‰(å˜?©¡~êj8C¥äæÚ´½„fG9Jôé@hèª~¯Æ¡”…© %ùó ߆1Û¦Â&æ Õ•cÖ9/í~˜ã"3H€H€Hàž¬jdmvB¢O1÷zíAoº«²ä89[‰"‰Œ™LÆ—¨Žƹ€ô¥5ù"6J­;íI“ IUã§6äÇûJoÆÔD0^Ó?Ô‹îø•~bUk\ïÒ=“/Y‹D'´Õ$ X„%:¦½3M–ήL¡¨Î!õŒ I~øo›Þ45òcƒMeäýÉTm%%åëKùKÒ.®URšHT¯ÈŠØ†;Ty¾{NL\èÍ2&•òv‰ˆ‘Ñøe)ͯå”K„Çw]ÄšDÖ¼º ‘Ș+“ÐZÌóa¶#îFpJúÐVäæ©<_öBãT ¢~L%±ÄCz1»²Iÿ\L¨Y ëá9T ‹¿G–…½óuúÛ_DGÊr®ˆlÿ„&U…•¥Pqú'Æfˆ|…‘yCû‹FŽ"ãõ<³9Á;8Òáo‘ú¤ÕOXJ;Ëu¡ÖË¡¦ô8œ5(еu¬ í`–׶IJ¢“èšH, k{Ö¤lÉ÷Cši^’ À½XµÈÚÔ€Wû’4ÖÀ™“îb>j*¬1!6.KUaì-­‚¥Û§‰Ðx§<-Ø™ÞH¿Î‘¶e¸‡T´$„Îc/`žš™ÛÏ—+ßèF|ɨb+m@E¯¾ßI÷© Vëܾ„¼ê eòÚŒýN¥rQ´ËŠCXÚK°SÆœc/©ê•x›žŠvÙcgww(mhBçý!¿ü¥‚݃VØE×øýÁ$–h3ã8ká’ý“ÊDpDžQgs’yg"ú4äÞƒqY’VŒ4pì0lòŠòü¹ª(zkLìª(š VÙ_˜+¯ßð%=ê[Y¾¢ná)듹 Šáq¸_Ø ‹ÕŠm·o!(™ÊùÉOâŸøÄœ|•!’#–‚蟘³8‘À$F¢±ìmFy}'ÏáꤪÈd±£ö¥fT:ó€H£WqcG5œÎ|˜Ã8|¸¶Úƒ( yÑêágq¡ÙÓŒ"[¢GÃr$^¿þtŽ¥'šÎ6£ØfböjêQ¸*å9ð\9‹¡ tžëÀˆ?¤<‚³l/î/‡x”hS›Ù¦ê;0ÖƒÓç¼Ê€LÖœð‚37©mR'þk N‹PSÉ{äyøkOáD…9eÜJ¨†c8wú&u£¨?áFbTR`¢ç:®ÂÒáºêÏàDe¾VÆ   õC`UÄÚÏþs8p`ÞQ^»v-c™Zú´Øí€ßqïP\‰ýýsë†C¸.š«æ`3lÑ œëB·û*Š®B^4Ÿ/ˆ % µ‹†"€Bv·`X-&C“8ׯìwα¨ßŠq“v‹¸ò¡­±ù׎ÂbØëm{"¬L.˜Â²ôÚ%ÓJêÂ2Ù ïP'܈àÊÙJ¥šb>d¶¹mâ[‡i+Íèí€ûˆW.×%Ú&õ·m› NñkR:´8 Qdi–6nˆO­â“Ùƒåðõv #7ò¯\€ÓäÃé–^¥¬¾¹æ©ë˜š«[ç°a ÀÚX•=k*röÌ3ÏdÍ׿þõŒùF¦ÅU…¥¡üƒðÍÐ?„³¢ )²ÊìÄÙW΢¢h'ì®RìáLáVX¦X„.…Se’L…8sí2.¯Ñ.£¾‰…÷´Y+pñ• 8{ùÛUmàíI/º½“ZÄÎòèÓøÚ³OJ ©S¿ß¿|[Ä™7î<‰}UjõùA+F Ç ÏÅó¸5a›)Œ«G0ä:ˆ‹ NDoGa²ìX‘®f'ºD¨…qð̔ڀ€ß°Å´"¶ #öÊðDìÆå=Õœ/½ “iÂS½8Òv §Î£ÐÕXíX9¹°Ÿ¦%J´@?v7ŽãÌ5ò¶ÈR Xk¿ *ÃP4WåÓx!¼Ú3ª,9ªö¾ÄÞ>#Q·¯BÝS ôæ÷1ùN¬Ú‰Ì½ý#joá©g«ð˜åŽˆ®6‰Ò‰€{VlÞ áû£oj•ï¼õ¾%BÍþt=Õ?÷ßx =?Ô m¿ãÇä{[ázâÉïoŸ£õùI÷@ 7Ï›-¹yy0‹±È1/7OòlÈ3+±o°ûvïÆníÇ©°ÊžÂÉ}'1:1ˆceî®Q¨¢ô «Ü¨üORŽ6‡ŽôwƾӱÿµZ³èzñ9tMÌbf¢}¾™xÛß ?gø¼}šÓâv`'cùÏîB Ó£9Wžó,bS|¶+F:+Ê|vb\Æ|Ã8ãÒ.cšõõã9íú9´OÇü £ßý"zÆÆpiŸîë¼>É<Œu¹cœvã¹Ã—âóànì{>ûîž)Íö’Æó‚ ¸W÷M¬á¡'ðlÕ#À[ßÇ«o¼­[%Äe¤­`·¯G²àáG“H˜T{G-žª¤TÏþ/M(~Ô…'Q¥c߉}xâÑ'Qâ’kÿ›ÚRë›?š”²ÏÀ%Q¶-Û?»tñ¶?¦ú,âÙgëQùô³¨«*‘ZL$°ö¦û[àî­¢ çÏŸÇñ¦*X´ÈR3¡I´µt¡ààq4ÕÂ7ІsIbËð6¯ v¹è<²'{ÆR²ßâAÓ™‹8ÓT‚¡¶FŒÆ4W44Ÿ·Ý·KÐ|ü%Úï†/¦#Ó#Ê/VŽ\ܾ5 _à¶ÖedºÜ8ªàŸOo†CEò"Óhil¿¤ /žBIh­ÉâÏð8qÔ¦ºŒŸÈù‚vt.­î8…ËÁ ;FdL/¸{QÓ|µ®(F:1ë":„·µÁ’ƒÂ¶fÿ|>E…›Íá;ê ÔÂÕ1¶96ÔÔêÛ#*šÄ¾ ].è_¬cH€H` $)¤´ºSwÞ¿ƒí®gñäÈIüðÕü¨R~Ã6¼yïM¼zùU¼a¦Ö)%Eú…öX ìŽDÚ°å!<¤[´ú[4™÷6^ýV»QK¬jóè£zö#®Gâå‡}×¥P[œ/KœÒ[¡ô6rCDPqRkÕ`á¾±°Å¥öÔT;ıi?:üh8å¶D,UèA0¼¹R¾%bóàyœP"KR³XöË >©˜^"™Qºw¯v±ºK §BPðwºì@ï vÀ!a¿•g¢ož‘ ÀÂR4ÐÂUWºTEȶâéúJL¶õ£¿ÿ-¹tiLze/Û{âkßxV"^~œýF·ä'¹ªÚÒ;jÏÛ#8ü:l_B}V!ûAÀRä˜gƒ»y;É*¡¨&Ù&Ñ!©ÉìÀþ³¯ r¢‡[¼péÁ•ËÕ0o“j¾n4¾Ð¯o´FSAA’­|T•˜ÐÒ+ѹR®Nž¢x;ãÄd¹d)Ešdcz^w#DæéÉn1Ζ~\ÔŽ»>ŠpTѰÀ¶CT”$RJR×;´¥V=ÛdÉ•?BÒ,Õ³0†ÛÝèñË8ÄihÕMBqRÂV;ª¼EýSõ™H€H`å$) •3zW–,O îÉáòߎé±;xG­Tʲè÷ÞãßןUûØ´HÙR¬ëbÎîz xýGè‘}ku•aË{oã­÷¶ã‘‡Sÿ™^ŠEÖ!Õ"ºáÓŽÌæc‚A†ò±Ë™$®æ6±ÔáTíŽôÞÀŒìS‘%”—§8 æVV9R'99+j€‘«h?}]žb-ÄÑ ej¢E–hC1˜ÜX+0¡ùÊ+(J)H®´„ó¥ØQ*‰¦Ò’¯“ºÉQâËH!µ@ê‚5Í?õFÇHÍç_F‘Dèúe[¯ÑÆ8f–âŸÑ†G X÷aÏš¾8¹%¶¼©Æð°ìs©Ð—¦±¶àɧŸÞ{—ÏžÅ5ÿVÈ–3¼á½ ÙÚ¦§‰)s®õµÎ­TbßÓiO„ž=yÿ­í2¼?QÈDë‚€E²ç ¾NÙïCX˜öù4‘¥ÜÛ&rèÒ¥aÌŠ Rú{C¢»ŠvÎñ<0Ú‡¾±)iA$<Áá „\°ÉÃE5b¤=Ñe̦PçI9ù»PbŠb|Ü/+¤Õs£gÒξ«B>}8Ý>ŒñyfÚ‡)Q†æ»dq4ŠÖÖ4_f05¥ú½»´RvT¯&‰L´waJÆ™õ¡W½2¤¤*¾–œnnÉ¥ CF‡ks$æ¹&ÎdœÅ“ü§fŒ$@$°)2g õï½Ê–GÐôo¤Ù± êð7Peä>Z‰oœx ïÝÙ‚íÚƒwð¾µ­Jƒ=²[ÊŒŠrYußH\ι~øI©ÿdÞ{ßjlKjÁSXCÉQéV½Æâ`àÑÑá–ñÊ«¼gìòŒ(޹ž× `-kFCQºÌàØ­ëè•ýeñHɉæ³ZàIÙošq˃ ðÆ†©½ƒ-7ÇX͋凌ú6ñ<Åùð„H€6õ#Ö"SpïÞݻݘZð‹1ŒžhllÄÔ}Sk ºŸ_wãÅ.߯»+b#ò_ïD¯·ÃÁ ;ÆÅæë9 Ýk½7îÏÍ6véÜmÝI÷ÁÓrÏ=={^À /¼€=»ŸCûð´6„ph mîÐ5AÁ¶Øœ²œH€²ÀªˆµŸÿüçhooÇÌÌÌ]ðˆBÿš™E4ºP33*=ÇÑÔìݼP½U,›D—Ow28pú×å*ö7=“JоØ'ñ–ÕOÛ,­“9«ß×Ú÷‰åÜ<{¥MMͨ°®ýÍ63ÚŽÖ¡JšOÁ)ÝG`AI}3Μ?3žzXÅHÇ JØÍìØ‹¦BZŽ`Œzmío'öH$@«H`ËjØ…BÁO~òüÑýòòò–ÔMº&ˆÈÒNWÇ% ùôÈŽÅÕ€ó'J0=êÅÕ;ð’ˉܜ†OCgÀŽæý.xO¶Aé(gÕq¯+€f3ìC»ûFü!˜ì…(·Gq}2„Ï)”Ûn¡ïä9\ôËW`²ØQûR3*óû<5rUêš`1EŠú0 ÑŒC¹ñ1†§ávwÂ/í…°KÉ;ŽŸ=„|q(0ÖƒÓç¼J¹ÉZ‚žCpJóH`‡÷ÂV{¥!/Z½µ³¸ÐìiF‘-Š~÷1Lª^‚½xþ9N]>Gš†˜™èÃÉŽ«†´ÑHÿµh>Z 5šÀp;wúQÛ¼!ï9x}!XœUð¯ƒM…Áv7:GüÒ¯–Î]u97)î‡Ñyã6ÌØ†m–aA(âˆ3Œ‰¾.tôŽ $M'ö¾tå×Åç,ùÓç0©CBý ÌI‚q²?ó9³_3àª?ƒ•ùZ•̬ÃX¾„©Ö¹|ÍS£¸Úw•/9‘Ÿk^œá‚÷š LàܹŒË½¨’IîéË'Ê…az  «m°Vao‘~/æ—ïÇ!£šÍ†rk7ºeŠ*ìf3£¸á%t·â\ï^9TdÔä‘H€H Ë ¬JdÍ`òî»ïâë_ÿú]FØb­åKïð·&Ô¬"xêkË`3©xR~ŸAÿn+="×€­àZÜmì°ŠŒ|Þè+W³¸´Ï­ 5K¡|ñ¹¢™D(ä—/91áºh¢šƒÍhn($¿Û}óÇèëõCÂ8s¢BzFz¯'"]á 4Ó…ZaU\Ñë! êþÎN\Bc«µ%8ØPspî#=Úþ£h8 .„ñîjX-2’Ð$Îõß^LÈw¹Tw’$ÂR^³hZ ùDÎí¬Aóñf”Ùÿx7ºÆôÑ„Sµ”ñµ¸á l±)æ}^ôÇ–ø|]1¡Vˆú*gꞨ´~ Ò,¯ å»JPQ!ÂÀï—ÿeœ·T”­%ÔDŒs••»Ê.×ó'gyöî­C…˽ž?Ž|ÙإٲÂóÍC(-­ƒç F ƒSšÁ…ælª¯Wg(⺼tJvªI jó9Ç™[]G…¤Eu‡°¿\EÕb‰e¦<Õ›Î,Ñïü ½×ÄH(&ún‰~¶Õáè¡Ò9÷³ê+Õoˆ¼<ƒT¹ ánì_S€*G["M*•Óm[j¯H€H€²•Àª,ƒ¦Ãxê©§Ò³½Ž}WÉWn†/«Œ­­¨.Ñ¿¤“uOT"gZÚaŽ}íª¯¸¤žB{ã1ŒÄª%•d<ëÔò»Ýû0¸MI•¢¸*"¤¸ÎhHß0¤–µIýº7|okÄn½†|ƾÁc×ÖŠjh#1 ÅÃ÷°öE.#TóéÁvé‰YÒâfJª¨Ù¥±0¬i…ÂIôƒ¤m0g2¬•eø˜Å#Ýš?eÇ/¢T­§ŠŸ2lI·dþô´Ãî“q NJž:W)óœée"lÆÛd½q5ÏѼ+ìhðÃ+˘^©VÒp ‡Êmñ¾3²ÎÄ2SÞ<Ýfb¸è½&÷rùÁ ÙW6€Io+ˆ³Ö’|óP¦eP½cSzàmf /h•ûΊ†3ßDyþRÿû˜g Ì& X÷V]¬=óÌ3øêW¿º ú×½Y[ú\bs¥>D+düú’P™²hIÛ§êkׄZ¡D厖ç¡ïÅ=úòRú—¤ª-Ës½“QÙçUˆB«E{ÂébhD–ʼ}Ô•J․Û!ÝÜ’åA-'õ£°é<ŽÛR2 a³ÈÒÆ,‹¢’, žSBMEæ®…Í߃ç‰"HûÆ_øŽ„Ýh86†DVê™]÷6- Vxð<ö'íÛÓ+îˆ/ÕFoëRдә:?çLï×äjÂ+'ŠSûœs•ƒ‚½gq­&€á«²Gn`#íµüf¼f&Ö‰uëL,3åÅÍi' 2œç^S m{qíZ |ÃWeŸÝ‚#è+ß…º´Í‡¦¥€?¤Zi}bv"&Ôœð¼,5ýVÓËR>s±-ã)•xA$@$%Vuôn…Z²4p”VkCC-8Ù7Š©© ô÷«å@µÀ•šº6;JáRÕ£C8ð¢/î>¢oÒ—,%xŒ/ÝÛ²ïm¬¿+¶è¦nèâB55R@[┥¾æ£Ø¿_6{Úý‡šQeQ5Æ1(›ª¥åZõÐH ^”}V»;cÍÕ7«DVj µëñ¶ÓèõÁçCÏ¥L§"Ö*å ÂF}u#xƒc>̤·QÂGK·e_ß:Û½ÚÕ-¿ÔM†«•r0ÛQjU9AœtŸŸÃ=L©’zÑ6éû´L ¦i bpp ³9NTkЃ²™¾ÓÓ²©þäV³¤|§vLw=ùÚQ^£ÏÍdNËÜûdâ`Ï% g‚™FW{&dºE®˜ˆÍ‘ã"¬3±Ì”—:读×Ô;|é'Øá(Ò—´Åb¦½‡9R®}Ó±û=‚>wK,’;…þÎÓ8yR~d®F±É û¡½e¥°L‹Ì.è, I€H€²†ÀªˆµOúÓòTãỌ¨™b1)5JEÙJqÑS«í÷šìmÃ…'HIDAT±c-èVOGJJ_¦K¿6V õ½Û64Ÿo†S.¢Arʪ$*¦¬XQ`7c§uéè@kï-”i…QôžH…òE«úw6  %j!¢ ¾DÄ`ߘø]ŽóÍU²óK}ÑN¡¤¶B³¯žê”îW|ž†b½mnyj´Þ¡IDµPY̰v®b±kKì(‚ª¾DyëGw«}þd‰#Ù²$X£ÊåéÓŽ–VÜr”h}G'{ÑwCꦚ‡É¬gäh Ì¨–ýuv1õ‹O¸ìj+ÔAjç‰(¢ã*$ciCGG':;;”®JO\D­Ë*K™Ý8r¤“2À’O<ú¶àœåËÜ7À.ÆeîÝ"z;½Còä­Ñ_ò1 ߈-GäÝ{înY޵ ¢ù%8ä6Zu&–óô¾bS²Ã…ï5e)|c-Çp Ñ­ýÒà¬×‚d\Ê´aoƒS¦º}Ú“2x¥÷µÅøÈ8&'åÇ7 Öwõ’&æꊌŠ<’ l|$i±qŒ¡HžJ»_)V¢Db%éßðKthF6èßÚ–{ž‘™ ùbo¹#›ß_¾[JRo…Š}]¼¨þ”‰7.±½š¼q^¢^Ûìv䉿3Wq¤m@´a®\¨3ô’TÕû\Ö¸Ä?ñp^)ŠÐÓpE¤®¥¥³‹ù%ãi»»ýœÊš¯2ÊeòÔç^4RlnæØehc–óÌý,À:ËLyóuœ–¿ø½& ´9Ñœó‹Gª9yÅÈá=èöÛqæå³Úk_RËW‘é><¤W~—8ö€E¢Œg$@$@ÙKàæÍ›Xõ=k+g±/êÅú · e$µ–«^ÞmWc9)bæÞú“\k R»3¡þPušøIí3Õ»E®R9ÉÂ('&Ú1™(¾¿Fg‹øš¨˜ùl©s‘2æ9¦S&ÿ2åͱ™9cñ{MÚ-yNäÐg¿ \òfî,97Ç‚²úS±'a“ xN$@$í²"²vÏ%’ðû1#/U/³µÉ&w[n\©Ý³ùtù{’~ÿ-y}‚D%µө^Þ›^‹×’Àßk’!E$@$' "k›C¬Å‡Ì   ÈJ¬­ÊÙƒ€ž’ Àú&@±¶¾ç‡Þ‘ lrk›üàðI€H€H€Ö7еõ=?ôŽH€H€H`“XµWw¨w³1‘ $,ç½µ«&Ö–ãLb(<#   P¸ Êû€H€H€H€Ö1еu<9tH€H€H€(Öx À:&@±¶Ž'‡®‘ Åï   XÇ(ÖÖñäÐ5    Xã=@$@$@$@ë˜À:kaÌÎÎj?áp8Žovj==}ðÍDây÷|2;…þž ûfîÙÔú0F @`v­Ñ   Ø”Ví¥¸Ë£ÆXÏ9´z'ÓšÛá¹r¸Þ ï@á‚r8órÒê,ï2¼Žnï,á”:ó–gdµ ûzÐèJ<¸vȹŽ<£+$@$@$@Ë!°ŽÄZý‡÷ Û/Ã0ÙÑм;-&„nùq}p&“Ê·ÈG+#ÓÄ”Jša`ÛŠÕM¯þç4Nî>‚Ik-^¾P­q1Û+q¼É‰›uõ»g$@$@$@«N`ÕÄÚÌÌ >øàƒ9øä'?‰O|âsò#ÓƒºPƒDÑ.Ÿ…Ó«’ï@A‘~>e´ O¡Çݯ/‹³ žãu°ibKÌ“È\TêZ ëá9Z‰\­]¾þ.œëBH‚ú3çQª•%>f%2uÄ= ©‹¨sê-¥êl¾>hÑÉÛT5{Pé0Ã×ã†{`N]9 GÎ|í”Í̾UÚfpúð1òöâ›'ÊaŽL£]®§´ë]vƒƒ öâùç|8uùì¡)x¯öaGåKpæ+ÿØèëBGïˆÈ\¥wØûÒA”kQĆOCgÀŽæý.xO¶Á'lœUÇq¼®`eE±& À]X±öóŸÿ˜×™k×®Í) LêKŸ–²½ ¡6§–ž1ÐÚ"ZË ‹)„Ï‹þÕØ/ênâR#Z‡B°—Ô¢ÜâC§·Gºòqy¯¾®Ã"œ‚bÀŠŠúrD&Ç¡):£Ó6Ñ5>j^„ìõ¨Î(Ô°`ÕÕvŒtL¢ÛÝ…üv¸½>X«<"Ôn7¿o·F¼ÛO½©øµ ù.à“qˆð,)/‚Y¢Ñp¾`ÖÀmmd¾®F´ÈÒ1¬%8XmAo‡îŸº‚jd›Ñ -îAj…IÚú¼¸Q}yÑy0ÐñH$@$@$°zVå9{æ™g2zýõ¯=c~4<«åoSŠc‘dr5àåËp¼Â®Õôù%8åC¯5%\*ªËQRZe)t}áȺ4¡fAÓÅ Ø[Y‰ý'ôè—f@>rD¨u¹Ý}ráÌ©J=£\;.Ô‡T°•¾„Z»œDGàvwK«Gëœ÷ä›0©%Pâ:Îêj‰CJ²V aoy,º¨ÕÔ?´q+&Vx¾y¥¥uð,ÔÊõ8¥1NWÃ\¾p5VU˜?ñ`‡Ö€$@$@$@÷…ÀªDÖÔH¾úÕ¯júîw¿˜j?þxü:ùÄdQKvAÜ (q±pª¨Ù¥‰m53©jD;¡£q:âùªVTõd6ÔI¼\?ñuïN­v,ôìÂü}¨ÆfT¿Ô€ÞÆNugC lÚ™ZèTiy¾ÅLÈ!MÈF a-H¨ ¹De93Æ}KCõ´Ã.á4Œ#$‘Ì0Ô¹JVT—äË1¯§eóƒH€H€Hà¾X5±¦F–,Øjªn~A!ÐíCtü†WPªoBSEsRÔÐ(sJT† ϧµ—ˆØbÉ^Q§¯~/Ü=8«"bó¦ }hueXWW¼•¯ó*fJ!ñŒi†v‹øfˆLM¦ÉÃe]_áŒ÷£DbšŒK*S§;´%Ru-©šv:S£‡Š©¨½y´¬jÊD$@$@$p¬Ê2hò8”`ûÎw¾3oD-^×VŽMEµÈX{ÿ(|>ƆûpxŸ>#4ov’ãD]¡’,Òþô9ŒJ[ߨ .u",eÕ.U?„–ÆÓR6…‰á~ŒF#&ÙxïiÖDßëFO¦êC¬ÏŒu¢c2ŠÂ†fTÙ%C–COöˆP\¨Ý‚¾™ôeÏàÎ]jÇ>‰Øi:ÕX• -¼ŽÁ1fÑÎ%Åmqî\?¦§'pîäVTR¾S;¦7I¿Ö*ñƒH€H€Hà¾Xu±¦F–ééϹ#ÎA¹ç š*”ªŠb¤»Mö}¹ÑÚÑ x¶) ûQ$SlM3G^ñ¡RÑÑ‹h(±Ëjê8Ú¤­»µC¾[ZY鉋¨uYEݨ²ché膛‹ÿ$¢m£'.ƒnôæøVÀ$’¦„šJMŽBM#Á X}%6 þßêŒýÓ,Ô¿Å=Q¬môæøVÀÙ¿œŽÛ®Ê(~Î  µ!ð_‹òå—æÄ¿ÅkÓëÚ÷B±¶öÌÙã!ð7ÿŽÄòqî(ˆÃà ¬×CÛá{7ñoñu»æÝP¬­9rv¸Qüœl”©ä8H€²”€úEy3<ØE±–¥7(Ý&  Ø(Ö6ÇþâÇï¬ÒwÞÀŸ ½¤.VÎv¶XR þd¿Èé' €Fà>íŠ~?¹ÖƒÈ‹DS’ù ìi¬Dè'£øë;ã7¿¼2OØ}ðî$~:üFÙ£¸ONæý¸øàÝ×ñÓŸ¼Ï•ƒ¯»3À>I€H€H`yîƒvy~ù,^ŸÙ‚_«Ü‡ßúòÃÀûï!tó-¼uxPãÁ­úqycšÛj‹>LÍöÜÒM‘óñ­êe­÷aº7Ý…Áàáç1Xrg+óªÈ2  ÈH`Í¿½ïüÈ5à³O} ¿mDζnÇCŸT~>>ˆþæ{ßÂè„Dßü Šë÷áKŸÖÝ}çÇ^ô÷O""Õ·;žÆWv?‰kMïÀ?ü*F~ð¦V|¿÷Ÿ¾†¼„Y9{#ß‚ÿ“O¡®îÉ ò%³Ïm•ü¡Wñ§ãoâC±’“÷ÊŸÝ ëve\ ÐvDŠžÂ‡æÅßýLÊ¿ð4jž¶`ðÒ«˜‘Û¿ðªž-ƶ»ª+ÞþÕ5ü÷×^×úă<¾{~óWU§FŸ•xpì~:sG|r¡²¾ i˜îàoÿ¤ÿÏOÞ’ºÛñÙ_Q~®ùt«N7ušêkA§_tÁîn'*oýÕ¤|~_üüv+k›ïþ£kïcêÇbÛü$~¿úI|úÓã‹E.ÄÿÄëÇßǤDêÆ‚[ñ[ _Ãç¶&÷gœÏgCòÿêm<èx¿[ô,Ÿ~ÿSÕÒè Gïk?—© ÏWã‹ÿÖ…_’ܼßÚ‡ªß{_*+AŽ<ÞðÿtÁt7u­¥»ñÛ¿þ¶ÊûçÅiY.¾sWÙÉqT¡þÙ§e¬•p‹úI{?ù[òe;úUaòŒKò¥Óš0ÛvJ$ °¸Šàt:`F×½>ÀZã{‹a³ÙPP\‹þFÅ7Î_ó ´ ÕG›a•œë¾ÀšúÌÎH€H€ÖÅTÓŠ{›÷%;ðS^ è†ïÜaôD\h=˜äåƒ•ÞÆàÿÞ÷m»¾ª]ç|á‘ RP |ð:Æ&ÔòdþÍCñ¦O2Ú&oz³=*‚ìGP¾*ñ©„“Õñ°nOòÔRé/ÿŠÑ‘>XcwS7øç¯¢ä ֽͮ¼ÐpCÙù\Á£zŸêÓè –“ì¯ò‡é~ˆŠ<“UB,‘,Eð’É¿ï1!Wªø¦d±´”K¡h1‹H€6´¯÷Õó6‹ŠuÝÁØðøâHé]+%’!}(¯ûAݱ:Ùÿ•œôWä¦_+O.Ñ"J Å_atÜ‹?ùó‡ðþmLX¥VÔ®2ÚwRÏ»~ü‹V;ðŽ&Ü’ ¦_§¥/SÝ÷&ñ=jŸúkø÷¿þÜüÞYü÷'‘Ó9}Åšù„oRÑ(áqÝð‹Ž ž˜d§Z,åD1+§» v9<’ lBk¾ ŠO—àqÙñÿ/?yÞïMâ""î¼BðǯÁÛó}m©3ó<èbã³_~LŠßÄ÷þd·¥í¡·dyQ"qûÕ/‰œÅÿõçoà¶fÔÓ2J¦E½èž’dä!„þ«J^ÑÎÔGdVÃEÚ$ X¿î÷÷ü澦ÿ¿½ûŽªº÷þuʦM0$c–7¬S ]R ¦Ï&#q€N2 ÕÂð ø T˜Bøg‘jòf›)AAJ E‘?­Rˆ¤¼ó2§Á¡¥¦*‘NCè4ÌÀNC‚†?xYf|¿sïþ˲ËÞ Ée7ùžÈÝsÏßÏÅåç9÷^€ŠwðʼnJì—_¾4Øñ¤ö€o›Ï—¯Ú«'€o~çIüxÚ üom%öý]¯›<~.þÓ–ŠË_„¬Ër_Z]öÕ©Úƒñ£Õj»R’4ª™ïÎ~×÷mFýÁmö\1&JPœ"µaz ¾/mß³ǵ ©x´`|ÕÕ˜}q¡¯>‡¯úü Wˆ);ÈöïpŒøM5»ñisäX;pæ4*ß;OÛµ>íhƒB’·‰³ç¢å /ß&'¾…QŽ‘8פ‚=&s¬È^ø*w¾‚Ùåò4ènd<]‚e^Âo8åÉd5štÉß*aœJ‰ã^ÆOµ|`úÚ2d©½P& P€°÷|-)Úìëëë‘••­X·ó.m¥ [Ö­ÔûÕnÈýiˆ$§ŽqÝGV›®Éë*$ˆóÆ'öoÜ:yúó[`)pÒàQ„6nJ¾ úô÷–lë‹ýßµkøÆ`ÝGõ5gƒmªºW£È­nLÒCn&‹ôgÙ¶»Îßâ×…¹þã°]nYY³Âܶ¬ª¹%8³z3Ýo£`½ïî9KHù° 3“ ÀÀ¸çÍ:\X”!ôûÕŠÚ@ÔÔ¥f°6€ÿÀsê½#7j8Ô/& P€ @_p´/TÙ&(@ P€è%k½Éf(@ P€ @_ôÙ6hø—îûœmR€ (@X¸²‹ËR€ (@“¬™ Îî(@ P€ @, ÖbÑbY P€ (`²ƒ5“ÁÙ(@ P€ˆE€ÁZ,Z,K P€ L`°f28»£(@ P€±0X‹E‹e)@ P€ €É ÖLgw (@ P k±h±,(@ P€0Y€ÁšÉà쎠(@ Ä"À`--–¥(@ P€& 0X3œÝQ@èrãJÛW¸ÒáFgWÀäÒ©qì‹‹Œ;=jkÄ‘ÃðÜi;‰\_ìÿ®šÃEÛÿš;Œþ '«¶a믜طÿÄÀ66ÂÅ2 @¬õ˜Ž)Ð7>û+ xÕbàų±ò…÷Ð)Í}y|'oëIÃaët¶CõÞc:èl«GuõN´ºÃuÏt·áPu9>wE/|~¿»+`›<ÉVšþ°+ßjìÞ^„OÍ¿›w›²nüélì;} šg6(ÐÏõ³ùp:ˆc7ê~U€CMÌXW†Ü 6ÀíÆ—m-hq5rK*zõ?JKR{˜3´””TéÈj¬3«÷II#× å¤ ƒò6`VþX­íN—+ºì†ú±åʺÞÇÊ5ÃÚwK0R«mENq<£ ŽÙP,D $²€‘ï¤DžÇN¸ð´üI5`üò2LŸ0B—ÕŠ4kÒìa&Cm¯©UY¥±d`Ñ+EÈL׃®Ö/öaëÆJ\•â¶©ÏcÅs9HѪv¡¹v'Þù}vÈÀê]%ðöâmü"ª^Z…O†/Ã/_ÈуÃ@·r¾ »UòïÄö½u¸)¥†8žÀÒÕ 1R‹%Tú®Ì\OE)Žž“ó=¢¹ßÆžUN4Éþ«í±eX±äqg,eÖO߯Æ-h}ÂbÇœâäŒQúÚù9’«Ö£Z:âx +×=ƒ4© §öoÂ[Õ R6ã'ɯ’: MÁ¦ŽÇ&BmB;|…º. j£µMj_ÔŽ‚Í%˜”nÅùª58 sÅ9'V¤N~?ù¿ÀûƒByÛW@öŠ\Ôm|gÅatÞZ,}6Ksÿò‹÷Q‹9“îÁÖ5ïh l’Õ´Ñ36`å<š«ÊqsîX1Vó5âÉB§[€Û ‰}ý8ú¸ÞÞ"£M•µî!Tð,²²võ£×±ûðýXT¼ £=xçp³VÄ#+0¥¨e. Î Ï㊔Ûóýþ¶ó‡Kñ[ ÔÒò$PÚ\†%ËŸÂ-˜RU-Z¨òÉ«…¨=7‹—„ Ô€Hmhù¨e/ß§+ŽŽ°iñÿ=`žj7–â¬c–üü \ýøu¼Xèf­Å¢¹qáã8ëÝÑ‹­,¿Zï3;¥žðSéí8Qwÿ|™«ôÙT‰:o'­µ¥Z 6mÝk(*™ƒëŸ¹üõB<®5Ó´Eâ&Áí¹àmÌ.Ô9W¡ÖõÖ–½‰‚©سf.I#÷MžÑòsPæ,]W¬ýÊMuáósÞ.<¸t¹»×¿Žä¹kQ0ÃŽ³5¿A³×áz[š]R6Ɇ|1RiÊò"ÌœbÓŽ[›ZÐêmʘx ­1þF $¼ƒµ„¿„œ@¢´ž:#CÕ×Á"Yž6°L‡sûrdŽ{ùy©¸ùñ í~¶–£•R-Û­°XmÈ”}Óæ¦6Ésãó* 2X +79HK·aÜÂ0_'÷ºñ‰¬Ô•ŸLEAY ¤z˜© É—¾ASK0ë‡c1,=Ϭ˜/õ Îy\— bÄÜ X÷ìã7%[[Ísü¬ Kgf!3o†ÈsMçô(%–²#§-ÄôÉc1t¸ã'§MÍšƒ¼jgÈÔ"”.yRæ:ÓÄâä§-rFæzPïÌ "mL––<%ùÞÈGނӅ£Äû ,š÷¸e`Ö+%2^or7㈬žž™ƒ¡ ÒåD3¾”©¤HYǽ@²ü3Îûk”Œ1$e¯~‹ó³0iÖÂnmY+ì™v©•ŽI“‚]Víº'cþá-º·ÄO @â p4q¯Gž`6ùË5Þöf§S£Çý–Äþd‘U9 ¿]SèϳÅ~C$° *î-#9—?@y…Úž,¤ûýUÄmCúHnX”RÛ#[{*Éápè+Bèòàºäð.z!ßM,eÏÝM;Žh}hõï Bµóðcú½bZ õ9x¼ÞajÅÂÿhW?ÙWH²‡ÊñÙ½NïõeÚ½ú‘Òs1Gî\¿XíÄöª¸ÒÕû+œ—›Í·ÿúÃuj‚zäc{ô 9®Ãny§W§Ôíì¸ O‘~%yVdæÛe›p'ömD§j¶@ ˜(À•5±ÙÕ@HBÎïÞ*Åyr²X¶&}É&O ªpâÖÅÉ®ß •2æi-ï@é¶R¼X­×1£Åó¾ ûÌÌw½„òNÔïPçÒ±b×VØÔ¡4ªÂ½qÏmÆüŽB”¯/ÄÈÍûñƒtu2"µ1æÙ×ð×ÉÍõØ£WOE®Eš·ª³zJTO–À6¢7Gmÿù¶s–µ¤gc†£Õ[Vá¨L kê#ÀGG°å9(}Ö®9úÔ;ºÏÛÉV”àsyÀaÏË…r"Ùyñçµ*ykJ›² ?9^ˆCÛ^ÆŸå´#o:†ÔñŽ×Šé¯”áŠ÷ÜÉåšçYf2Ï$ó<ÏC*×<Ó5E‘ •dH!…DŠFSB†”dÊPŠB©T†Lyªïïý¾ÿçÿ>ï~ž}Î箽öÚŸµ÷Ú{ßu/¬¤-Aadkm^G'g^Ü8ÀZ@²€‚ä¢eii òçýßËÒ€¶Þ/$¶lýÏöÿo¡óð u²D°›G¨{ ‚ï€fw!‡€éEäü‘a![xÁŒd„ XüöÞÁœ[ØmKoëØZë X<‰Dö€zË>o„»7b‡:i£òð BT¼×݇ä{¢³;00x Ï#XÄí?ìxÿ7›nm’HÞñŽ/Û¯ë@Šú?NÇÿ^ÂÿŒ± ©T>dCë-Ÿ‘y+ó6ÙÂTnr3·@0=‚ŸøzlëoáŸpC»ßúsî¡:ÈœfPÀƒ¤k‚`d.QÌáþvZ¿±,‰¼ÝÑG™û†ÙþÆnä`ëßöQA榿í$ûxýÁ—í´è oà $~KþôpØn Bž6 |F'ýÛO{»ÕD ò¿Ò§ðÚnØîá> 8ÍŽÞ‹VC›"OM¤Ê¢•Ñ*úñÒü«‡ÕÅbõ±¢y¸#¬J¾ÿ™ òöD¼ÛâôLJìa>`ú0ï1ƒ˜qÌ+`&·­üÖ:èOþs^`Ækú¿½sClÎþÑA !¬ÐÚhu„?ÂÍŒfhyÄ-´â›"ýO†á¹ý3—ÿo‹õúó[N-F­ð›…Ûß•Ñù«õo+:ÿ1GÈÛäßšp2|î€ÁOá¸ðÂMp-Ü?ÜÂ#ar;þŒf½ÍͱãûGGºBzVzýŒNúÍ€¼½Þ ÌópØÖ†Ð ‰"ûzû„ñj!'²'¯Q»än^YiE¶Î÷ãã‡õö¹ 1÷ü##!ç·²,ídÁÈ9P™„õ…dBÈÞdSàŽµ{89bG†Þz`Ð ;ƒ p~ ‚ø$ ÐzÀX[à ³îÖ‘à(8’@8 ²ÁEPŠA¸ î€ÐÇàèƒà5Sà˜K` ‚ D„ 6ˆ„Ä!YHÚ éA¦5ä¹BÞP… 4ètº•C·¡:èôêƒ^Aï Yè;´Š‚QT(FJ%…RFi¡LP¶¨ý(oÔ!T4*u•‹*BÝ@U£¡ž¡Qã¨O¨EÀ”03ÌKÀʰl;Ã^0Ž…SḮ„둵~Ãsð ‹f@ó¢%ø4DÛ¡ÝчбèSè‹è2t5º ýý=þ…!b81âUŒÆã‰Ä$ar0¥˜û˜vdïLa–°X,3V«„ìM'¬öö¶[…mÆöa'°‹8Ž 'ŽSÇYàH¸0\îî® ×›ÂýÄSâyð²x}¼3>ÏÁ_Ç7âûñÓø5 Z A U Š(ŠtŠŠzŠŠ)Š5A˜ N°%øŽr •„vÂÂJJÊ]”*”V”¾”q”¹”·(ŸP¾£\¡¢§£Ò¡r¡ §:Cuª™êÕ"‘(DÔ$:ÈgˆåÄVâñ'5µ$µµõ1ê<êjê~ê/44‚4Z4h¢irhîÒôÐÌÑRÐ ÑêÐ’hcióhëh‡iéèdè,èéNÑ]§{J7C£¢×£÷ O¤/¦o¥Ÿ`€øtÜJÚ¦±ŒÂŒFŒ~ŒiŒ7»ç™è™ä™ì™3å1=dg†™…˜˜˜Ó™ï01¯²p±h±x²¤°T²ô³,³r°j²z²¦²V±²®²ñ²é±ù³e°Õ°²£ÙÅØ­Ø#Ù/±·³Ïq0r¨q¸s¤rÜááDqŠqZsá,æìâ\äâæ2à áºÀÕÊ5ÇÍÌ­ÉíÇÅÝÈ=ËÃÀ³—Ç—'‹§‰ç#/¯oo.oï<'Ÿ!_8ß¾n¾µ]»ìvÅïªÚ5ÊOàWæ÷âÏâoáŸà08*P!0"H!¨,è#x^°CpYHXÈAè¤PÐŒ0«°‘p´p…𢈆È!‘"‘Q¬¨²¨¿hh¯JLAÌG,O¬G%®(î+^ Þ·³[ewÐî¢ÝÃTZï$™%M%ã%k$¿H H9KeHuHý’V.‘~-C/c,/S/ó]VLÖ]6Ov@Ž(§/wL®V¸¼§ü%ù— f 'Z6•ÉŠ•гJJ®JùJÃʌʖʧ”Ÿ¨`T´UŽ©4¨¬¨*ª†©ÞQýª&¡æ¯v]mfðÏ=%{&Ôw©“Ô¯¨ïåÝëº÷òÞq > ’F‘Æ{M~MÍRÍi-Q-?­Z_´¥µÉÚ÷µ—uTubtšua]ÝTÝn=z=;½‹zcú»ô½õ+ôç  Ž4b M 3 ‡¸ŒÜÊæ•ŒcŒÛL¨LlL.š¼73%›Ö›¡ÌŒÍ2ÍÞ˜ š™×X #‹L‹QKaËC–¬°V–VyV¬e¬ZwØ0Ø´¹n³d«m›nûÚNÄ.ܮŞÆÞžÜ~ÙA×áœÃ¸£”cŒã3'v'_§Zgœ³½s©óâ>½}Ùû¦\\’\†ö ï?¼ÿéö¤9H:x×ãêàzÝudA*"-º¹å»Í»ë¸Ÿwÿä¡é‘å1ë©îyÎsÚKÝëœ×Œ·ºw¦÷¬†OŽÏœ¯ŽïEßo~†~…~Ëþþ×ü7ªñ®uAôAþAmÁÜÁ‡ƒûBÄC’BÆ©Ê>4O6!—†B¡ûCkѯ:]á"á'ÂßEìÈ‹øiy÷0Ýá Ã]QbQ)QÓÑúÑW ¸i9ÊwôøÑw1Z1Wb¡X·Ø–cüÇMÅÄ•'÷?þ<^:þ\üB‚CB}"Wb\âÄ ƒIÔIä¤á“j' “ÑɾÉÝ)r)R~¥z¤v¦I§å¤­Ÿr?ÕyZætîéÍ3^gºÓÓ/Åž :;”¡‘QvŽî\ô¹‰L³Ìê,Þ¬Ô¬…ìƒÙOsäs Ï·ŸÏ5Í­½ páì…õ‹>ó´óªò9óSò— < ú/i^ª,ä*L+\½ì{ùåƒ+ÕEBE9ÅØâˆâ%ö%W•¯–—²—¦•n\ º6^f]ÖV®T^~ózzª"¼bö†ËÞ›º7k+%*¯T1W¥Ý·Âo}¼íz{èŽÉ–»Êw+ï ÞË¿Ïp?µªŽªž¯ñ©¯uªí«3®k©W«¿ÿ@òÁµ¾†¼‡LÓ ‰›MÑM‹Í!Ís¼M´lyÝêØ:ÐfÕÖÝnÒþä±þã֭ަ'êOžª>­ëTî¬y¦ø¬ºK¡ëþs…ç÷»»«{”zj{Uzëûöô5ökô?z¡ûâñ€ÑÀ³AóÁ¾!»¡—Ã.Ãã/=^μ xõm$bdíuÜÌ›ÔQÚÑœ1α¢·¢o«ÆÇ¾Ó}×õÞæýë ÷‰O“¡“ëS‰ˆr¦y¦Ëgdgfõg{?îû8õ)äÓÚ\ÒgºÏù_D¾ÜûªùµkÞq~êùÛæ÷S?Ø~\[_hY´\[ \Z[NýÉö³lEy¥cÕauz-r·ž»!ºQÿËä×›ÍÀÍÍ™´ýUF*ÊË €ï× :À€äqêüëw¡­´{Hú„jƒÐ6M¬0ŽÏJÁCP§4§ò'ž¥®£™£“ ÷d(fœ`c‰bmb§ápà,áúÁ³‡7‘ï9?€µài¡g"@TNÌKüüîN‰e)i+™8Ù ¹A”¢ŒÒ~åT•jÕw{ˆêÊ{]5R4ok½ÑÁë*ê¹ëŸ5¨53†LL ÌüÌÓ-îY¾´úiÃl+ggaèpÚ±Òé™ó»}ó.Ëû×W‰ÍMÂ]ËÃÚó —§7ÉÇÆw¯?ä?Ðx9(!Ø'Äò2™7ú5l(¼1¢,2óplT@´Ó££ê1J±ŠÇTâ´Ž›Ä;$x&†8‘”u²$ùnJsjWÚЩ·§§Ï|Nÿ~v1céÜbæbÖjú~ÖÚõèyCwUOnohŸN?±ÿÅ‹¼¯A…!ÌÐðpÙˈWš#Ø‘$¾ÞLfŒ©M¼==®6þé]á{ë x¢jÒnre*ëÃîMÓÖÓ“3'f¥f'?–} š“›[ü\õÅý+Ý×ûó–ó¾ýÎòýñô… EÒ’G“«í’››ÛëÏÝBùÁ²ð ú6&ëˆSÇKP„)wQIU©­hÜicé éf™h™•YH¬Él÷ØÇ8)¹ä¸÷ñÄñ^ákÚõšQRˆGXAÄHÔU,J ýýÎ"f»Þ"µ¸uº·{Ü÷Ì÷:âíà#íKå;ç×ë_P˜”B>äBÖ å ]  ¿‘évX/J:Zà×Q¶¦XÚcØcKqïwÆßNÈNŒ<±?Éø¤n²i )õxÚÕSOù’¾xv9cñÜÌù¬ÏÙs9_Îÿ¼@{Q%/(¿´ ûÒDáìå©+o‹^÷•<¹ÚXÚp­³ìóu¾Šý7òo¾ªb¼e~;9½VîKV{ÔäÕö×cÈ7|x¢±´©¡¹ñÑõ–³­1m‘íqÓ; ž?½ÔyæYx—Ís‰nt÷HÏÞ´>¿~«zzƒVCnÃá/_‰yíõFg”}tn¬îíÉqÇwïñï?L´NLú 9M5=0S<{ì£ï'9ŸÏ_B¾†Ì‡|#øµ¹è»d°L³|÷§ÞÏg+Î+ŸW{ש6F¶×_´A&ÐK”'Œ…ÓÑâèL4V ;‹»Š÷¡¢X!tRRE­©ei¨i–h_Ñ5Ó—3d2Æ0y3[³¨³Š²1±­³Ïpôs6rUróäñæðeíJçOˆ$ é ó ÿé- 7ÜÍ'’˜•–z"]/s]6W.NÞUAE«Ø£”­ì¨Â¦òJµ@Íc¬:V}loµFº¦–®¶­.Ðý¡7­?dðÀ0ÇÈÓXÐxÜ$×Ô gÖjž`adÉjùѪÑ:ÓÆÇVÍŽh7fÓᨣ±“Ó[ç²}ÁÈý¿²ÿḃ:®x×>R¾›¿û*Ïk^‡¼•½×}š|ãü4ýsÀñ@ tP{ð‰­Ÿ‡*ÈNÈ]f¶ž±'b,2î0×á‡Q®ÑÌÑ#G*Ž&Ä8ÆŠÄ.kË< –Èz‚2 $-œœH~žR•z*tJþ4îôÈ™[é©gý3 ÎÑŸ{œ¹/s.+:[+Gû|òüÅԼɶK²…*—U®(I‹”ð]e+¥»F(£(§A"Iý†ëÍ“•7«^ÜZ¿#r×ùÞ¹û}5ŒµNuùõà ˜‡¢MnÍÇ]jil}Û¶ù˜¯Cç‰÷ÓS·Ÿ umt‹öìë=ß7öBvàôà—a›—u#|¯³G¥ÞR¿‹œL›‰úlþ}iÅjkýw~‡Û*X$;ÍDòLûÓH £É3ÀBÀ’€­ @¬(ƒJùŸø{@Hâ‰GrNfÀD<’išg$s> RŒòhýàX‡è!QHÉC¡ÓH>ØM  Jå:‰dyý¨U˜6ƒ£á2xG«¢ÑÅèWzŒ ’‘µb!¬&6Û‚ÃàŒqgq/ñ|ø|ŽÂ¢Œb•`F¸BX¦4§,£BS¹Qµ‰)Ä/Ô¶Ô H¦“A hÑNÒ9ÑõÐëÓ?dPf¨fTele²fš`gÁ²ä° ±Ö²™³Í°'sÈpLpr¹q‹sÿäyÌ›Íç±KžËÿZà®`ºP€°‰ˆ¸(Qt^lPüÁîK±’.R*ÒŒÒó2Ïe¯Ë¥Èû(+J*1)m*VSíWëÜÓ®Þ¶·C£[sDkF{Ièa‘soˆ7¢0¦2a4å3“77·²Ì²j°ž²%ÚÉÛ;9Ä8^vjsžv¡Ü/}ÀþàQ×R·ÛOO¯Þ >«~:þV‚܃ûé“Âäë"%ߎÞs¤7&øgÜP|V¢é‰¥“Y)»SÛOyžaJ›ñÚŽ:º*zòúʆb¯˜t˜Î›sXèYú#wZ–ÍyÛl»,ûËMŽßœöŹB8d‘¡\¨úˆbFé¢ÂP¥¨˜6‚áfx­†ŽF×£×1Z˜TÌ0V{;ŠÛ‹+ÂãñÁø ŠŠàG¤Ô¥|@¥BõˆhIü@OÃGÓLëB»Dw–^‚þ9C#‘±ŒI›é s 7K7ë67vm1NFÎ5®QîZžs¼|¦»¤ùY°+‚ß„¾ ÿ٣ح)á*'U ]+óBö‡<»‚‘b¼R« •ª‹Ú-uò]µQk—v¦.³^¥³qŸéEó`K;kY›;gû.GC§û¼\~Hp…H!nƒJžùÞ>ÇýþÅfÁ ¤†ÆÞåqäKlI\Ôñ¡øõDÔ |íI¹äД4»S³g’ÏJf¼ÊLÎVËù–[~ñ@>¡àZ¡Òå‡EÅÍWuK;Ë,Ë*loôVêWÕݹsþþ~LõzmJ½ÐƒÞ‡ñMŠÍ³-ùmÑž†>ïšì¾ÔëØÏø¢0}ØøåæÈ7£3oÃÇ7ÞÇOÂSñÓ¨™„èOÇæ¾|Ñÿ5_ðíô÷ðº?–®/š/¾^òYZZŽXžýéò³gEg¥b•¸²Ú¿¦°–»ömÝh½h}mÃvãæ/ø—ã¯›Ð¦Ýæõ­õõ’“ݾ> *m0c››?„À`#css­hss£I6ÞаóßÎö]C @þÛ-Ô)6÷ïÿXþ ÷wÍŽ©7]‡iTXtXML:com.adobe.xmp 627 378 …ç`@IDATxì½\T×ÿýi“¡)ÓÖ±U6®[¥ÆiLÖ_µ fW’ >¯àÓ„Ôàõ‰šÁߢIÔi±/¥/µýýľ ihö%yÈ&ðZ!íZØD’t ESGŸ’‚-c·Ã¦3mú|νsgîüDAüžDæÞsÏŸïyŸï9ç{Ï9÷ÞO`_Û_ N! „€Bàš$pã5)µ-&¿çN€R$/Â'ö·'$!„€B`Ä>9â˜Q! „€B`Ì ˆ17æU ! „€B`äĘ9;‰)„€B@1' ÆÜ˜W „€B@‘cnäì$¦B@! Æœ€sc^"€B@! FN@Œ¹‘³“˜B@! „€sbÌyˆB@! „€91æFÎNb ! „€B`Ì \cîî/§ãqG:Nÿ̘PBÀD Ï‰£MNøL^¡Cœ-GÑæyã£ÏXnÀ§>ù‰q,¡ˆ&„€¸:Fùs^7ãßWdb^jÈFÜz¦·¶~8j¥yaY.¾‰>|¢îô¨¥y5úQá|kŠ ÷Ÿþ„öî³Xøo£Å& ïÏÁMä=cy_ 6æ<~Tøu|Ëö¾YÓ ésðßipuŸÆ­Çúp­ê€QœÿúzPþÈ&8ð¡âÈ! n)Êý[ðÒް«‘'Þþ㨯ò;y~t®Gsn&:&G]/êFñÞñ7˜eû4þôñ_ðËßy±ùä¯ñ/~7^D9„€I üŸ_œ‚/ÛR±ã­ Á°7ðþtß×3±ÿ—n¼ó[oÐ?ÙɺH4ùõÇï³k†\û/»Qzöc|söÜ<ðQòˆÃñê¹>à†k¯Ó¾éeà~„¿~ýÕ|sæç‘û•™ØáüÏüvâÄ«g.⦠ˆâZ¸pÓ ”2žVj !éÀ21ðp:\¿ìÂÜó\ E‚Œ~¨9³ÜÒJeÚ0è÷ó,S­€ñTøìÉÓ°D›p¡HؘV ¡ÀcrT÷·b±ý øî/Ρ½×ƒOS'øâT¼|ÿmønÇ9#w>ÆÛ½}Ú¿P Ž.ý &ëYºÜÿ‰/ŸÕ.«Y«oÞð¸>õ9d¥¿ÿó'ñ»/ðú¯õè_þ þûï?W_ÿ7|˜aÃ}øýõ­§݉­³>‡›uqöf.goîž÷4Þ96åÿ§AìiêÀúÞ@ 1ûùíÎ^¼È˜òu”Nù$ìœùÑ߇—ÿ§-ÿ†O‰!ÿgu'ßz OêÊã‹rðãÀ·j\˜7ýó¸é4v¥ ºØ¼ÿeÙבûç‹øô jfófœz,³ÿèÁ¼ºwð6ãüûc·ãæß¸0£)t§0¸Âæ+ÿøq˜óÂtàf´-ËDîçtÝûèâ‡øtÃïpêéZÝg}% ™ýÎôý^üÂtœú?ìÔ1=¬gÀƒÒºpD¥ž>‹§ «÷#rü nðýI3jj[Žc¥®¦xaé×Qð©ßã¾Ú.¼&ÑÕ;dVÖ4;&§¥ÀÕ„£(„c•Î}ªåÛ¡´Ä¾¨/í´(çsw`{ÙN8i¦ge#…‚á¼=8P^ŽV—2¢Ê#X’¼•Ö•öX–ùWPà ÿžKÿÌî}ÿ…7hØ)ƒî_ÿs<'„€Ïþü—¿à/·Ïû"n Q7g²U3ä”7øÏ‘¼$ú¨–<ÜB<×íáÜ0ï+s0°ôv,7ÅúQ¡2ä>‰ö_þ?v{Æ_£m®¾§NÍZÙ&ÛuÃGxõ×q–‰Ø3¦ãÿè)Üåó*×—l7¤À–¢„wýoñ¬2äþ8ˆŸ¾}µ¿þº¸(=S3änú½Oÿû‡pqö¢ô³p‡Iž±:ÔŒ”ô/â>Ñÿ‰å¥¡YþWoŒ#ÿ¯~Gö“È™? ßšAëwp裌iàŽÇ»›xn"ë§T _ž‚,ƹésŸáÒ5ÓÇó/ŽõÌg ž]|;ÚÈâ?þ.ëJL³<|ÏtÍë:sÏv÷áÕ‹¿gþžÓg(?¢ÁöÓ³Ô e¨~ã‹ÚÍBû//`Ï™ßkj—}E%IG7Þˆ\r.÷ïðÏ*cáF8¾¨]gú”þz~7f†œ„µ>÷¸Ýn¸Ï¹ÑçÕw¿ öwÁéV¦às7¡„†\viöW•ÂÓº»ÓÈrnl/¡!—Y„ªýÕ(Ìd[ÑóPA{Žî¤!ç@Åþý¨Ü¼Ž©å=fnÕœiøA×ÿfȨ%Öæó¿…2øÄ ! Æ;ÿ×õ[<øê/áSVÝ÷rf ¹¾ÿösVîœzŸ>”²Œª1‡_Ƨÿ•Æ'Îl“?ÚâxÁ¡ ¶4äÚh€Ñè:ùÛ?ÁÅ¥WeôÙ§èÆœ&(gÏVü¯üã«§ñ?Ϫ8ßš§®OGg°<^Ô ÚªZpõç[jhûµXzâ×Xùê;Xzʃ‡6mV¦û7¿‡ÇÇjq>•‚¬`̱:HÅ«k¾Ž¿LÇlâè:wAŸRâ˜ÊÿÑßÄ“¿Y–Ï}»Uœ¹éÈb:'ϺԙÉÅç]{A;)¸Ï,§!¬»Ì› <<ÓÆÓP{r¬—joDVº óþêsü§~U=›]H –eélŸ½ ]ÇNcÉ1}úõ™·þ é˜‹³ŒKýoÓPU¬\gz¸Oñ×Xßúj,¶1ÓéV{<_¦5½“dº\˜þÿuCñ1;/¨ìÆÌ©EÒÎ}å())AɆlj8%4cv¦­‘~,˜a…ÅšlÚ`Ng”ÌÞž6î¿ãž»K0#- VnFUÀè>´U\Æî~?2çæ s²Ê}ìÜ_ø N²MG:Õ‰}ƒK­üóÇø‡¿ù<õ8 ÖG·k‹ÌSÎ…€—K@tß|-|ôü¶!§äàð6ÊîWÜ€Ï;îËÁÓ_LÅ7çÏA£Ó¥ ¬øÔgðôÝ™Á ? fÚéý!hؼ~¢®;2‘5#wßð9.~ŒŸ¾Xë ÆVf W#÷œýY”5k:~<+áOëá§cóó'tÿæðüÑÇòœÆÝîЗˆMåGù׿ͥA.9ß÷õ4®’*cl?ÖŒ¯pƒGcƒ÷Û'9»w'gAgÎÆŠ))ð¸ûðá_¥!kúl> ‘‚úFóØÒsÄ}|"¸”ù…Ùøï‡oŽ)Ћ­ð­¿â2ëÍiøiq¶^¸€[›~Mã=0˜ßX€X(—@J?ýð#–ù&ܤÐi×?F÷0ê΃_à’ë¬T¬pÜŒ›Ó™Îï/âÛ: ºê?j.¿âV:BÆ[¤ÜùF/'ÊKŠƒ—ìñƒÃpçé˜æ`áfäžÚ€šòÔÀŽÕ•ÈÉ;ƒîwü¾pSôì 2í'¥Ü qªwð&ñų}ae‘! „Àx# öÈ©ýqf§žÒ€ÛIœÛ8}c. Õ3¯vÀ¦žL¤Ë™›TN ?Q÷K³Ü¡ãÀ ‹îÑËå²™Œ{3~úYÊÜÓõl´-§A7Þ„yŒ|òQ%HëÕmÇ?þJOq|üõ¡ôå8û­ÌåO$ÿ¯. ëîÏ#köLØ9ûàq_ Áæ2&â}ò÷vdpöŽ^už†+u g9õó®î1¶V…°ó7hÌqy3¾û ë>Ä_ž‰ÚM£ô¯q8³´FÎÖhΰuszÞGÝŒrF8^8òÖEì™õ׸o~¦vÛ=ûŠ{lÒ„ùøý^ÏÅ‘—ží‹CŸzã¡‹~ó^[ë <ñ×°Ò} »K¶cçs-xþ‡‹c<Š%:8+§:¾ºžßDeó¿»?DÆg>…™“>M|²UœB`<P†Üó‹æ + Ê]üÈϪ×-qÛ™ÚC§œz(b¨.Ñ(9Ô4‚áv<ð·8µx6–s¹îî/g÷…ý”CœÔ–´¦à½ûfâî/ØðøüÙØÍåÐxîÛN5 }7Óì>×ËÍùÑ®ñ7jh»ßZ–…§䩯ÏÁá¹6>`ð{mî¾9ØýeÊ2s:ßÃ|£“¸ê>±ç—ÂÅH,?gŒ¸I7¦hË~¯:c \‰y7þFÍ飯ç^CÉ?ýš¯Rçá§'÷±wJ¢ K`ÁÜ=oÚÍ„íW¢ë¿¸¾o¸€Qfû¬ jyÜ7§–ÿgÏü"vÏü îž;+”rýñ1o´d~{¯ÐTKvœÖg@ Æï¯}~>…kÇκSðú|ð¸ÑãŽ~wœÕfg8>Ž>†iÚ¶ Íœœ3ìY·ó8÷á Àš‘‰ƒú#æîèwÝæ_üš7†6mo‰ê ÷…OÝu7ûýÿ8ÿûX·á-¿B@qK@í‘3 9µG.÷è)|ƒ{è”A§¶ ÕêÌœíS©ÈâGíô›ùÿ ¯¾uV›ay½¡öe³‘ûÅ¿F;ÿ)×}æwXÏåâ°;\îêšÏ¨¹‡‹O§ÎöÅcÿÜÏÎ㬒 Ïæé†a7_ÏSÝXñöM¨½ÃÆ%É,”ªÈj9ö˜‘ÊÕÿý(°t+gs™´ë½‰å?ðg*ÉØÆ<–Ò‹åV&à}äÜï¹üÌeÃßë³zÝ4~gsçùs±»Š~‰8û%Ãx¥¦"—³5íœASÎåîÅJmrñ"g0§`^F:º¶á›û;ðÍ|"z~Jóþ6 aÏëożQ0Šü,Ù|óØðáo>Œ9j„»:¿új¬¼L“k°f.Au©%{¶cy£:½ ?\xþÕœ±E'P^¿Å­œ ËZ„l[+Ü=€·§Q»Hk«òÏôÅlý~ýûPÈý%µ+âcûÇ?¸„[¸Wr!ÛÿOhÌ?Öö+üyè¢d’”B`xv¿ýŸ|Í_ß–šÜ#§xøÆ¿üÿü_A3÷Óý?.Ú3CtŸÀ¾¶QíþîHçþ«ÏÞÈeÕq’Y䌚vvƒ‹{³^Üë6D¡£‚q¦ïanÎþ0*ÍÏàá/sVæ¿>‹|uÁµç._þ+Â{¼Œ[ÿà¬,§°Ù@^ÿm衵AžÏ|r_Urxü¾yøñSøÍ¿ŒÄÑ+ü_ŠsG/±˜)qVÎë‡ÅbEJŒå`Ÿ «5ÆÆ:5³ÇåØ˜×‚ $>øÄþöĆy5íÓü__¾syã¨îbÕòëá÷>ÀO… 39 .„€S¸x*û³÷"žZUÿ½Ùÿ_ð£OUcîÊN—Ç»úÿDéñ8SY——´Äž¦ã\ñaü>QûΨ—p¼·—Ñ*ðhs£%—¤#„€˜(Fu™U:퉢RÀGhä!^è B@! Æ-Q5æÆm)E0!0"}XoÚ¯9¢$$’B@+L`TŸf½Â²JòB@! „€Ę‹"§B@! „€¸–ˆ1w-Õ–È*„€B@bÌE‘S! „€B@\KĘ»–jKdB@! „@1æ"€È©B@! ®%bÌ]Kµ%² ! „€B ‚À'þBá§vtt '''Ö%ñB@! „€'dfnœT„ˆ!„€B@‘cn$Ô$ŽB@! Æ 1æÆIEˆB@! „€ 1æFBMâ! „€B`œcnœT„ˆ!„€B@‘cn$Ô$ŽB@! Æ 1æÆIEˆB@! „€ 1æFBMâ! „€B`œcnœT„ˆ!„€B@‘cn$Ô$ŽB@! Æ 1æÆIEˆB@! „€ 1æFBMâ! „€B`œcnœT„ˆ!„€B@‘cn$Ô$ŽB@! Æ 1æÆIEˆB@! „€ Gièq¼p»ûàõ–”¤X,°Ym°ZS†žÄ„éÅñÃ;±§Ù©•ÆbËÅ®ýk€3gÐG6™s°¹œn(ß ç°x}òfÄy®e/v·¸˜²OT>Ìëû€Û χê[ªÍ†ÉÖø|†Œ|¸}}p:Ý ìÛáftí‡÷¹cûs HɼntôÚ¯5)ãÀ2æh¼ì£ñÒ»¼ö"ÙµdLìd®_gÝ3dÑ×ïéÇs†FY9zaAÅ‘àªÍáõÐPp1à &óÀß׃^— éƒßÏŸQ2æ¼=uX¾©1fžQž¶9´ìŠ×µ·§åå5p©rš]:óÿá•Ïßœ¥÷L3Ê·7Ók˜ukNdˆÇã±.†(ºÌïqÁÙ«·ÑÔÑáÈ a…€×:Ñ7æ¼=ض|Ìfœ=+ 6¿®á„Û;kžÈÃä+’ËpõâT‡>XÁ’êž‚mÀ kŠ;`[e /AËpl²Q²Þ†'aXh‹=ƒ&Ív¾”o¢!ÈÆfw p*C¶?Òº»Â²¨ä9­»aÖm Ö•ú¹*u1\á TÃÇð=Ç›pÂé„/c1_ìA E!01Œº1w|·ÉKÏGÕŽ•0¯ú¼nœéñx€÷yàñªÚ«ÍJ£(d°ô¶Õ¢±UŠ6äј‹aÍy¸ì«ï\òM›œt²ÊÛÇe;æeKK Í.Q†>Ï ,¶©\Æ åS%¼.¶œm~ ºÉj.»^z)fÀ‹¾>/gÓü°MÍ`ã‹á=Ð×?åMcÙ, gû|èó0,Ir)ÒÊCÍÆš¹ /½´,”»×‰uËÕ,#ž_®L0°zY6ëÈ’ªåwÉÝ7w?[l,K‚À{¦#hÈe—Vã©eJ£–ù}¡z J<¾ Ë›!Õu }O¡¶Ì‹©Wé0ïj,©Ôaëäèú 藪ǩi ëårêBµÏ 5€Œ3’0öyûÐÏjKµ¥éê«•UqTuÉ:Òt:8âÀG†ýð«mæv*òÔG]ñð3`[ä4€¶}µhÕ8 …4梛ûpê92w9B@\;Fטè@m—Qx*HCÎ8 ü¦X3à˜«Ÿ˜—ˆò+Ž`¥¶ÖèESÙrÔºƼDÇ¿½\–lXG3âõÔ­C¹fÈ©´=ؾúAÆÏçßJm0÷º;°»|'º8ö„\: 6?…esCƒÿÑuËQO«Äž¿yÞzÔ´,XQ¹sûêQ²§=˜DÖš*lÉ‹,eà²/dä(Oûv<ظüIç2ëƒË¬çÚ`Ó¾VÍÈ2‚ä®­Â ãäapb[q9ºÔজ%éšy¥Ÿšÿöp/]yM{X!Ö>´”?‚µ½ÏÌßœ@äñPf }nÝýê;•Éré4þ–9àë9ŠG6Õó‚¥›óа½&$}ú"Þ<vSJ!üèLû) ИÓv+22 Á¤|9ËWöÈ&Í8Ì/ÝoíN(°,ú2[ m×cäÒmИµ£òù]°»Œ²„×­Ï} »ŸÛ‰Î^£’tÙ ¨û˺ßv ûZ]¦B¥cmÕ,4ß™®F¥.Ø–Ô«¹-E0î9Z†Mõ”ƒ7d¥‹½ØC}1\ÖŠJ¬ŸëÆ3%û‚udÉZƒC[òtÃ9‚¡ ƒM“Z™¬“!§|ü¨Ý´:ÌS¾]5ûÀ‰Æ8Ž3d”#ä83‘N#‹ÿ¼ÜmÛ°!`ÈYìYÈJ×ã¶ïÛ€£çâfÂØn<·:dÈ©eF;Ëa3蹸[°)`ÈYlvd“…CËÇ00üœE I<:G”ï‘’!GCÓa×k@M )çç­;ö˜ 9åÙÛŠ åMÁº þXY^ƒ²§«–{šNEbh|ýÁ|š÷膜žÑ4,ÊäÒÛˆ¦äÝ'ŽjF%—:Ï©¸PY‚"}Ç©ƒÛƒ†œ%Ý{ºM  #ð¡mÛò !—N7tt߆ tÌ”ÇÝÚ6ݳ +;À.’±Q½Ía†œÊ¢«vË2䔟¿«-çŒHá C†œ Ù UžDêìç~RegÚØ-Z‡Ž‰j°uN=4{ÀS%ÉÚ·qÖ/+à7´zÖ"Ê! „À„ 0º3sÁ½BìˆÓL–Ø0QçR‚üÕr™‘HÖoyJ_®¤—aâÌX¼Už2lhtÑ7[ös¶‹« ÑBƒËpE•G°$“9¬t¢œKƒN^hßYƒ%/mÑÒ æMÿì5œÈµ¢fy ÚF‡-{ ªžš®çVa_§òLðpAJ&¶ª@ÙƒúL¾©›¸çê Y ÉÎáð¾.ý$ð€H œÃ«–£Ù4·œÁ’ÇõY#†ñÛw¼{þfìZ©¦>9ÃY¾ µÎ€àë^O$¦¬ÇS‹3ô+|Tw4–³iHöóŒK¼£áÜ-5AùàX#‹õ²óú´J φOûVV=»ÿ6o×—P]-8ã]œÁ ‹`‹]¥‹hh·¼]¨¥‘^6Û4t¾f‰r×V¢(ËŠA¿ 6O>ÐÙ¨åÑÐäDžVhiÐë­0?+L¬Ð upßyºsU¢b‰®ðyáK±ÒoA¨ú+±K]÷žâòõvš?N´ñ"S›½ ¥:’#Uº´€Þ¨eÎX^Nvdì$ã¹Çì”ÎWSçO=W‚=ý’-•ÕëaíØ’}šw]ˆa:ÖTò©k»u›JШ¬4–§å™§u‡[‰ö¢+’1åU:Ï]•HË0ಎªžB&7sf8r‚³¢±$ËÝLCN¯L®É9¥Œ²¸ŽyYùàPÛQػϕë7CZð`2ÍšŒÈ‘Ôs\1ä‚Bà!0º3sþ`OËÁË3ŠR°˜ƒBWpO˜]Íœaà?5{¦Œ®¸ÎçB—1"N ßLnwÐØérÅŒ:•WD¹©|G^Àsj†Ê³3*H”‡a/F]÷ðr?•!¦š¹¨¯u†æáÍS‹%%àiGæTã˜K_1lŸ>ùWQÔ…òú.-ŽŸ†cÍvþã“¶•‡ÔþåùpP>e”,ƒËÎÉRãƒɂĹnÍÈáLèK8wü06íiÌ.8Úƒ9Ãçk[ÊS™¦!¯ÐŽvµ—ŒuÔâ@NG“º‡zàF;Šñ‡Áœ2šg;c!pŸ2Õ·«µµé˜f½#® ãÔ‹ž`]p"®µI³1é|(#Ö‘¡f6º¼à ] ;2? êÀ™Î°`a'Î:¬.o ó‹uKO.§ÅÊCü„€×Q5æ¬éTÍÚ¾9{ :Šrw„ Ç«øÂUcì7™ìÀ–ž‡ÛyGêÑîÔGÇΚôäîŠÿBÜ;÷žq°Qiö»µÙ-cpóÅ®q]¬ÁÆ4`šˆ›Äp.Xís¹8ܨtéE8øÃ|¤˜gõ¬jn$ž3–H]põó9Y5ºÒùý†¿~nüu,Ù‚—òÜhk9Šúúv}Ÿ£¿5-=úòžpT~­˜›Ã’5ª pó Õ|±“O ½ÙƒBeàòo,;F"3¬Ä!êÝòòfý*o2FÂ×toÌ%“ûâ,õ;5C±yÛ´ø•ÚPè«D A/ß1È‘u™¡fzµ-Ü$À‡BvÑh4篞6¾|ÇÙÚ  @AÅAÚSÂf‰£ò1é|ìüc5”PÈP»¦Ÿ)è¬(CÙˆãEãîFý„K¹OpÏœ eÜá2‚DþšvtŒ¤ž#““s! „ÀµF`t—Y'ç`±IœCÖÎÕe8~ÎXbÓÑxÝN.íœÒ÷º™:÷3N¼Þs8°nCpO¦z³¿— RŽ…x¢âÖ8Œ«=k< m»_åp|¢1-pèoçlJàŸèk>úÉÙ’Ñ+,Gò«–sxÜtÞÙÃwÑ)NûÇeÖàR¥(ôkák ×P×Â7¬ù8;uå¦×ÁWL¸ùÚð©â…KžÀ¡êÁKž>U!^´í-GYYž;ê ^»œ[¨°ï¹ºÐr²Ú3¬'#ÚºF6Ÿm–!ö #¬þëës¢CûâBÈßRÝó2ø†RåÑä,Ù>4ä4æ¯È}faqhºp6w÷áS¡ËÜ3§XY†ëmoâþ@£î•Ï=£‘å1óךʧ½©Þ Ž±x=¦v3Ì„ãïhã{à´k^´iìu r&ë0¨:ý:C-ÁѪçØÒ‰¯B`\Õ™9Uœõ•È^¾Ú³ì‚÷lX=¶tØy÷ìæ›ÞµÁÏ’…‹çÂ:Õ®í·Q~Îúr,¯Çˆwëe%höó Un~N£¡Èw…êÎÆ­€!¦ jȃ=ÅbŸÚ¤½ÿ),\³5ÅúlJcùrt0A& fH”Ëݸ2dHé^cð7k6ç£Sûr€5|rö0¹MMDo¯’t޼ôxÔŒŽtÆÂظ,«By:kø4gòŽé¼|mF 7»[˜¶cIž1@òœ>¢s÷8µ™L—§Þ%Ž˜yÆL<ŽgÆÂ5È­)Ö"á“ Å6ÃNËÌír±Xxáñ e®¥Ðº³­jÐ6MM¥E½æÆÈÎßßÚ,õÃÎ=n¾Îîjš¦Yœ7‹¿)#ækä£ÿ¦`~a.jw¶½ó çã,\SJÔ‚p5ó5-lœ1æ”ñ"¾šäqÞ¤T,:Ê×ëP=(ç«uÔ“Ï©ƒýèU喇Á)^^‰üU]ä×ëûüt]9̧«§b°¿W{¡·.ËèÝÙô¶îÄ#­¶s¿Þö•pœy^˜‘[L5‹iã$%•ÙÓZŽ¥ŒÉò®·qžK«âÖŠº¬š»¿•:ÕŽôì•ØÁý}#mGFò+„€¸ÖŒîÌœ*}Ê <õ”d…Xxzi 9ú:r¯CH[€-+LáØåUT ÈÁœN½±^V,œ‘cÏá ×Ù….Îâ©îÝf_„Šª•Á½J ×sfP7H”•èç“›ÚÞœ´nŽßŒìÀ«>z CÎbÇŠŠýx"ǘºS¹œ.‚q¦ÿ†žÂ0ùÇ”L!‚‡±Ò¤‘a¸ÉsWâ`åÚà«üä¦r,kö U¤0<çÓœU+ÂöbY²W`c‘Á6”‡%UOG¥ÝÕÙ—6PÚ°ˆ{wè3|Á¡œ/µ¶‹% O©Æ £nX{.rª3Ò"#è¯Ë0rŽüص,3®(–Tc–‡úár† 9›kX¿yÃaÄ|#ržœ“ƒ¬úªGž#H,"dˆ;¨ëGö‡t~¶ míŸ;ñÿ•këÑÃ6£ 9å²f˜Ö#r‰{‰V 8+ÄÚEŽ@42c>z66DeSçùBêiÇðâëÔ+VB†œÅQÀ'O—ĸA0XY±dóš eÈÙ­ÁÚC^~Ò8ð»…êÆQu ÊYXŽ3}ÚápëY‹$„€×0Oü….–üÈÉɉui~úÛóûjK*_ï09Æ—¸Ö6ÀWc¤Äz~XnjYŽ‹©*lŠZ†2€°@|Û¿žÀÑÆBC)øf ˆzû¾š¥Qoâ˜LYÆ«3äTò©/4Ä.i¤ô\nâÚÓPʦ1b@õ<°5VD&=Z窮™–"ïç'*Œ* ½@š/Þ}‰{ ¹ü8àUõÌg‡‡RMj¹’ik_4P²R×2ÔïÈøª„/ßéykâÔ-õ\-«”7jÛå‹ § 16²Q_£š–%ÍÞçä‹—õ=nUÏcßw=(Ïä!U¦ÊA×ejP./¿nâc|ÅÃ,©ªw‹U™’lïÂe=Gˆ"§B@+F`Ô—YÃ%U¯3ÂHÌÎyh< 8É·”ˆÎÞ,“ú|’r 2®!çð„TÝÐʦ1b૎y;ü"^½¬ÜI;Fd2 ö!;eÜ«FâI"ŽŒo’D‡x9”wlÊ(±NŽwmˆ™ %y]élüÚÔ8óvFº.›‹aó)°DýAˆµ9%9B@L,£¿Ì:±øHi®cúöjå'ù\9¬KN|‹B@«Dà /³^¥RH6‚€Z>זʮ¤Ԅ6ž ¡-á«%\©Ìñ\M"›ƒÀ^f¤W‡€ üW‡óUÉ…Fœ˜qW…´d"„€€,³Š! „€Bà&0ª3sá/¾†¹ˆèB@! „€s“''²oT¹¡d8æTD! „€B@L ²Ì:*SŠ"„€B@\Ę»þê\J,„€B@L bÌM Ê”¢! „€×1殿:— ! „€ˆ€s¨2¥(B@! „ÀõG@Œ¹ë¯Î¥ÄB@! „À" ÆÜªL)ŠB@!pýcîú«s)±B@!0ˆ17*SŠ"„€B@\Ę»þê\J,„€B@L bÌM Ê”¢! „€×1殿:— ! „€ˆ€s¨2¥(B@! „ÀõG@Œ¹ë¯Î¥ÄB@! „À" ÆÜªL)ŠB@!pýcîú«s)±B@!0ˆ17*SŠ"„€B@\Ę»þê\J,„€B@L bÌM Ê”¢! „€×1殿:— ! „€ˆ€s¨2¥(B@! „ÀõG@Œ¹ë¯Î¥ÄB@! „À" ÆÜªL)ŠB@!pýcîú«s)±B@!0ˆ17*SŠ"„€B@\Ę»þê\J,„€B@L bÌM Ê”¢! „€×1殿:— ! „€ˆ€s¨2¥(B@! „ÀõG@Œ¹ë¯Î¥ÄB@! „À" ÆÜªL)ŠB@!pý¸q4‹<øñh¦&i ! „€Bàú&:„i·!¹¾!Jé…€B@!0ž ˆ17žkGdB@! „@bÌ%$—…€B@!0ž ˆ17žkGdB@! „@bÌ%$—…€B@!0ž ˆ17žkGdB@! „@bÌ%$—…€B@!0ž ˆ17žkGdB@! „@bÌ%$—…€B@!0ž ˆ17žkGdB@! „@bÌ%$—…€B@!0ž ˆ17žkGdB@! „@bÌ%$—…€B@!0ž ˆ17žkGdB@! „@ãǘóyáé€Çã…×—Dêq}¹Çêâ=ÏÒ{Mû¶¡rë64u¹‡œY¿³Ǻúâ„mÙUz-è Ôgâ¼ãˆ$ÞC#ÐçDS³#i:çOEÕÖrTU Ö•ž©ÔßÐà'”ïµÅ;}qjê2êq8R /l¸ /îµÚë:Žšíåìg÷âMwœ: qXý›ªçú6\éabèôu½<æŒ76 =¥Ë Ö]NBÁ¸IÚ[0ܵ0Œ9/N,ǣ˖cÝ«±nÍr|{Ùƒx´ô(¼×"_o?ê_®ÇI÷•”Þ‡¦Ò hø9p{Vàó ®èAÔ8“çyñç5¨=Ñ›ìhË®¥WƒK~=»„yÇ–H|ãð¢®0TçÞþãh8rÔqcE^ð¹êðêzÀž…éS-¸ÔuÐÛžÔ_$®çáõ? obÿл¦FZñóÊ•$²GèÁPR»0IÊ2Á|=øÞÆ=øì¸ÝnÁ ?vI§óöw áå|¼Ë6’¿ìßóextu]œq•zy¤µ?36\vîÉ0÷EÓl^øÛÎÉÔB$noCLäšvãØJéÅk[—£þ´…›ª‘§ ¯û]xŸ“M– w•…pûÎç±Øž2âTFÑjÁFL.»Ç6<‚c¹UØ–?c˜YõãK@Þ¶Xœ©—¯wÓføíÖäéXlñe²ìɳÑBB*l¡À‰ò…ÇG—Sg£],+î)7Õ¹edz~±ç •µ%+–@KÁëFY9 iÒÖ_os9žnÏÆ¡ªÅº\£oÔÓ‹¨Dé“kÜþa„õ˜(»ä×ÂeboèA\¡“çpõB„—å²òå8ôû¯g6¯Ä­CIhý›ÕªúÅ!ô×½±Ìïå<à Qè¾LUïXVqT_dˆ:œ_w]߉ï7Tà# 5–å2ĸҿc:3çsµÑî,©Æbrj0I±Z‘nwàkó<÷áí«PÙÜàÀó*ž7ç^¼±wœ¡Pÿ¶hþ47l@7c4l|m0føúðZU(leíñÐ ïÀªVoÛÎ6l ¤Us ³ içKQÓ~.n]ôvÕáÉ@¼ª} ìB®·ãp ÊXT†c=ú­ØÙÆí¨=\8²²—ã=åÝ×Jΰéåaž-F9CéÑÚEÓ†­|-ËñXÑRþ[…êƒõx¿ß¸ÍóáúmÁt³,ñ\"Ù½=ä”' cŒ„â•1FÐ0¯~ò}*ÀíÑ¢r¼áRò»qxõRÔ9ô°^'ªXÆÃéß9ž¯ÃɈՀ÷jËðØÖ¦Pjœ–bO»*;§Ú›÷ëáÉ­‡q>€ÊçnÁ“EÛp6pès·éçJ“Ä1ë,AÚ¦¨ÁC3ï-M:˜ î϶ÊþhPŸ½èn¬Gw°Î,úPWºÔÔFèO†[ Wáˆe"Ÿë(ž>äüø¶¦GKñdéshhwš8é&ûUË{ƒí@éôY2LÆ7–Žy{(×Êu¾« —âÅ@›‰­/º\ç¹å ¾'©ZûY½½^¶ùíKµóÇJëÜ\¥7OV7y hü꺨qëDÝ„–¡îÄqìQí£è0yEÔGܸúÀâï?…Ã¥z[lÃáˆåí8>÷)ê{¬p±ú¾P<í¨ï8ÛW™Þ·ÐCq}ŒçoMIéþêè5ɽº-»tæxP–ÊÚj~,§Ø¬Ã‹]§P·A—ûÉ}ÔsjÇúù–}mÌ1à|n¼¸uU ¯*3­høðf-WlýÃchú¤b)½}j+·²tÔÚÅ*Ôu}\x=$«ô“}îꀜÛ÷¢ªtö´°¯ç˜°e} só`å~lk <Ãè+¥3ý˜ûäuØó³6^K \WÖØcÙHû[“0ˆîˬ¸u‘ ³Óµ`±Ú¥9¾~¨ëŽöÙ±tÔ\föá¦qè|³j¯m“Uݯ»ï™ú"ÖyU³oãÇgãÄ1ÓØ¯õ‹¬³ÊõµŒçÄw˜Fe}.f௧‹c±êëƒÊ¼W¯·ÿغ}ÜŸŒ©17Øç" îÍJ‹ÊÞÓ)Æô6Ï»xîÑÏUÇsðuŠÊ«ñì¶ ΙÊt¬¸mE‘f‰O e«sè£îBŠQß ïdØò5¸ôʬÛw*¯/u¡ºbfoÆêûí8^]‚uõXR¶…wøq|?s )Õ`õte#¦=°Ïî®À4!“ó3Ò’²Jü€×¦ºPû3=ÏiÙ…¸MÝ.ÜR€gÊ‹07iÞA/¦=´Ïî­Æê»­8~ˆ{˜Lié‡VÜYT ÞöÐz”mÚÂk0¥×¬Î7oÇ®—ûXÖýø~I.ÚX–HãG%XvUûpaÖ <[SgÊ 0%Îd¼2êòÆþëãÔ?UÔÂr)~ÀôW|u7®Â›ž©¸ÅæGK£ÎÑËä].o´µç-<ŸŒé*3-kü§kñVp jCÃy?æÍÉ€â±ãH;–èõp›§ßYy@«O?g¢.ù]0VPü^—~CìXu–(íÈ$T™•®ÜYR…ì,Å¥Ö=ØB8nÝûœ¨>ÔŠ/-¯ÀwW¢¤È¼Ëì=í¢Á™KnwÝχt§·ý0.`fg¨Û¥KIÏAþ-<·d¡XÓ£-X‘?~n Œ¡°ÉŽ4‡Ú1õùìîj”•`õ%1ߨ:fµç°Í©Æá@qù|-ƒ-8®¾è’ùi¸u¿¼ûÎ,®ÅôKíxze1Pˆ2ꮿ·¯ Ü ˜ 3-ËŽKµAƒÇçjG Ýí³&'l~ -Õ{0xÿ¶¿¹ ù›ªXžB vRɂΧ¬±Æ2Å7ö˜Ln±ú²ÛWT`YÖdÆŽÝ.c%«Õõ®ø 7Z—C~j¯ûPïÍEɦõøâ—L}Q9Çòì4­ßŽ=Ž)#·µ¯»‘ǺQãnÉCìYgK¨_Êå•pÜÎåJŸÉÙfñš¿ Gƒ{ÌÏqK” _újæ52ûo*LŒÃ15æ>8­,gãî$†tÊ‹—ÃB˜Ï#ðy·“2¸=S)"îp@-uÞ–ƒ[3Y¡Þ38ÊY°…T’yö ^ÏCñ#vø_¯ÎȰù¢pÛ,Ë‹¯åÎWÉ`Åî#Xœ3y)ã©3æþ† í lïùdç"=ÃeU˜¤ÅÖÿÜ’·’idbÒT;îʱ§Ïhw¥ÖŒY¸•e™”E™Ú``µ/ÄÊ‚¤Û¦âKó³™À\ŠÑa¦3Î4^6'‹qüÇýNjìÓ÷ *ChN¦Û,H¥LJž÷¢fp8+˜Dv-97Ÿ ·’ÃT=ƒ¨¿ñÊÐäñ~k#ÏòñÌŠ˜jËÀ=k×c:‡š†ffç³Ñ½Ý®uêÝ­íz¬·Ohçï¿Ò Ü]  @¦ä`ËZŒÙôh}ï>_KEX;ÓÈãy',‹ØQÍÏÄTòXSZÄÜ{Ü 8+y®ûª¿Ñu–,íP\uô~»*³ƒ:h…%5w2«îÓúЕ¬î?p¹1hËÄ]YÉ;žÛï_É|:ñ†¶‡rMG\˜¶¼0ºþØùÍ›¯†r;nÓôÈÛæØÙáÑkX. sä]ÆúLÏÈÀíó }‰äyÎŒ"uŒrÝf§¶YfáNÊ•n%»¸ú¢úåØ‚Ó‹ð£ª•4fçcž*Ökñ¿6/Áí9…Èg#øE—yÕ"Qoò©7ž ¡ðV}=ÛÎÜÎ<Õ wƒð®›Šò˜_†ž˜éo¸¬òÛŠ«w!9-AÉ–ú)÷Ì mþÞ¯Îà@¥Ú`¨ÿ0î>"û>“<œ{çoµ*F8öºG»üî 5ëÁ™½WüXPÀ¶fv1Ø—–íGi~æ=´’}Šï¸Tû‰v›G*±mËǾTõU·­ªÆömwÝ_ŠË~¹‰ýò삘”bÑú3Õç]Ô’µâk+Vâ®Ì L¡Áùw¬¿î3ºüzŽ6”ÔâDÀ\,^‘OíÄ…Øâ0xì°Šï¶÷²­+1“†ï]EQì¼­˜=ãZñ¥,ö±ö4Gênä¹.Yô_²þ™Þ=œ5é™ P¶­€ÁÔ¨£\ü²Fe =’þVËÆô'º/3]4#Û¥áoúåvÊ8ºœlRíµ?ÚºŒ}šVê¹/º…¸ãŽc¼á>F½™N[6Ÿýûô»8Ʀhue§t阗=3y欱=¼[«Ï {:šYÿv,¡á8ܘNàx¥eøcG€¼ÕQȬS8x¨œ³X´ÆËª±,‡«OÝé°}kÆ^ŠÖi7…5ÅiYìÄžo×ûD­MÚð%²Êyy7§:€iS—.ùØfjÔÌ[åe¸óíðý­Ú©j’Ö¯uF§¬x¹ì¼c#gÃxlÑ‚©)† ”O«dô‡ÉÈ•jµxzMm0²Y¦ §v`ÈÓ0Ù­X¼y-Þ¢<;žhg’g·¯DºŽ$,‰øe v¢•O/dÀ? óØ‘e¥ÏÉ¥ßt»zp²“FuùF¼VÁ;hž¿Éó¼m™aié'¼+[dÃŽ—ÛÐ_ÊÁX°i¾~ÇŧšŠIk^`4õ0ûÇH5Ü+ºÎ´› sæ´Ã#SÿlôqbÇúâà•銉[÷)œi*Î¥ÕàiÎhL¿#¾»"'ñdÆ|äYjÐüJÛÜ8®¬ÜÁ<Í~¯j)ºŽëšd¾:¼ãIÙÉ Íðãë˜Þ‚Cr%Ò•¦ªK ]¥ú*–2(&güõ@­…ý™Åw[°‹K´ÞÜ,}›úUž£]Ž['*b»-ÛJ&â(a\†2Ué‚î,6uÊ›&%³á©~zÕPQÂÆ€»E·ï3Â~g/ʪOà¬ko!›«iØQÁs7W8è=ÃHeØ™]${umº;/È3âÛ™ÇΈk.ÐWM³åÕëB+ÿ¨òv)Ǻ#zpuc¡;µŒ\®­¼h!£M ¶3žXr1ÛH2¬1Ò1~„ÕâñÆÊÖ‹²¾À%rŒ~/mˆæ>H%r ÊàËi$ým(/ã(F_f\b+j߯ÊO—Cz{h¯zÆ‘}QÜø¬0Õk-˜“”Ø8Ðël044´ßüÝC‹P[шnÏ\|¾–»7ã–Q¨Û°lÆèdL9+gdTÇ[Ï™¤Û‹±¨Z 6VÕyÐñŽfíyçFÓž24ìÚyu»0Ó¸n´RjœÍ8çum³e˜ÙEO¥™æŠ<7Ò5ýjσIy©0ÞSø ¹…42WÒÈìm\‡§fŠv8À=~ûðÁ¢ø —†á>ÊœÍa!†z¢î–@%ýÉZË \BÙOÍ.<×°KÛGñÊzì%Û "Œ‚a•1$Œ‘wÈÇ£=Ô¡ ¸i, Ѓ۹4ƒù(æÌã {}ýÜg3õ!;W?º•wýh­Á®­]Ü·È¥ÃÀ’ª|­þÚÆfÆê\„¹èØŒ(q¥ɯÖG‹5<Ö‰©Y“DuKîøIîJ¼Ó¸»žß‰–\õ`ODâa§Ü¾< -‡vbGrÎZm¦),È8¹tÆÅT3ÃSNÂwH:Æê‹‘£j¯#p³ó©7¯7à`Õ êM6JJ¿׉Ê&Z&#óäq-Á>q<ü“…i‘j­e`AÉápWä5jP̾ÏÜ1Õ©Ž…Tí¨ÞÞ KöfÎâ[y#³ Õ[;µÈ[£Ò5Êã×Ô†µ§XA#ë"ò\Å¡ß%þ,Øtk²ÂQû›r&±d÷ó¸‹Û^㞬 A«Å• ºÃÅ«¨H_Î*â9-üû ˜ÑÉ0SÞI˪ä1¢Ž°¿W¤xþCm—šhqtù~^½;Á8”¤ ãŽc.ú}ûÓ8cAWD­ŽÅì÷[±ë3ÜzÁ‰‚ ‰ÇȈèãúô“c*]F.VÌ>x™ï¸j<ÏŸw绚øÎ«Þ/òaˆYlðèõ¸¹™y5ڨƎÏíÄI§>kfó®œSKzqJr±·O?·Úµiú–ª:m‘ïøi8âdg¶ÃêÌbÀšd·³a6¢þDú)Ïž•åZ¥‚ú(³EµC/¯ÕÿŒÚÃR;B\êï Ü{´'¦0°—{3^«m`ذ6¯'ÿcÅ]Ù98mç&d²áwù·™¡É®X¾w‚ÜùÒ¿ôYm Óïn}IËÊ.ìhzö|[ƒ¶)ÖËÍóuÚ’Ò’E¬pLæR7o»/ù1iÑBjA fçÚµsKv~Ôk0a5#E£ïƒóîÝZgÅ휱ó¿r@ß\ÍûØó‡Å{8°é7½x‡ûˆzù@Æ·+Zy-5˜dÔAX%N;2îô¯æÓ«Õõ§8ûëã¦p7gHÔ@ž î¹Aüä 'Û—{¸¬®œ—wëÉ\:—ï¦Qû.ppÊ{('Yð˼NË·s6¸† ñá N‹w:ÑO•KÌ7¾ŽicßÍ%7]oëËÐĶ»ˆà)öù¼yðã­N.G?`èM‚:‰ˆ}š8®e*вÿ0βMú<ì‹^f¿pwŽ6okNË:k¾¶õ Zë·TßHc£Gµi¶Îx}Ÿ9ul›……l—obÒ@IDAT¨ îW}d¾–®Ÿßy¿®O‘Q"ÙG^µsöË÷R–ã•;ñ_åäãŠHoO[o¾ÜÊPíû¤Ù.(jpªlt$Pû§1·|èç5ö?O-ÛÀÙËø­?±.'’‰ãØ2¥']}ZyÖU4sJXÖ@S7Ʋ„ý-÷XîáÃcúC_‰ä \ ëËÌáã·Ks(u_—‡>E¦©Ÿ'ˆЛîCÏñBŽŸlï9{´v¡É|#Fôfâ@6X|: 9¶¹Iø»ŒØ¹_‹¾ckÌq¾gëA¬¸ÛŽwŸßŽuËÁª•«9 T‹K\†P÷j·©ýj½\2,áY®þЀ1–y{¸)·„O¼=ˆïÑ8[P¼3S‰•½äÞÚÏ'Eµ'ͬÚ^¶;i‘?½òA¬z¢o¥/³òÔ™êHÌ.54AhòNçÆÏ"nÖn«Þ„Z_ÿý‹´¥u³’Bã¢pŽ-»JðíõÛ0)7›}S+¾WKC’¥›·œçûðm>Íóžw–pÃí¯ìÄ·W–à ›ÚkÂ'©Öª'å"%|9†—•Áh¸™ÜLlç&dÅæ¬[¿ Ǹ¬¢œ9\"ÙU'úþÏv’×#xtå&¼;)Åj0w‰ËÖœ·Õ±ϰüêáŒG —cÇ¡N> P{›ô§5W‹¼€º¡Üôùóµß…÷;´ßØ8#UD¦tKLán]QÅ:äæêå|Ÿa1j;3P¼{£nìedk(VOsú}ŸèŠï"ë H˜vDBÖÌ%x¶$Ÿ·ó]ŠpSx ¶³SáÞ¦øuÏÍÈÕ\†â»¿½¥“î^Ë×Ѩ–^—Qܲäå›­­Úõ,ÖH=g sE™âÄñÖB([}w:7ö—S—ã;pQ©\B¾ñulzn!Åèäƒ*à°“·uIô%R6«ŽÈ$=—ƒÌ3aWÒp/7P«­…ù†Ž'ª“؈B2$Ž«´…Ëíß[Ãþ޼›Î- j6ÞpFB)™xfw)¦ŸfÿG«ø@Ç÷ªÚ´D>š»ï3ÒþNÆ]¹´˜¸|©öjª~ç6ucDí¿×‘Æ_ÝYª³Hö a?Jkâá4§¥J©a¡¸\Îãiy·8ù Çr¬â»FŸÞ²WÛ›œÎúŸÍ]„Õôº² ø”å¥Öí|Ê=ІgBiBýsÔ¥(@X¶‘ﲸÍzõ‡Úq[ÉFÍðX¶¤(^&éêrl0 }­´‚c— û7ëýŒfH§h—–Õ>–ùŽ)ƒø€7ÀÄyÇix[îË Y‡Ú÷káµêˆ­ËC‡Œ|ÃåâǧÞl¯Â‚ô^Ôn)fSŒ{:´vaåÙ¼1;¸‘oz8èÔ’Ž¬þ[y£¯Ü+ô—´“ ðç¡‹UŽ>nœ“cê`bŠðü8Âc8§¼›ïç—…^ªMÍŘïØ¼~ ¬Ö0ß@ÎppÆÈÂÞ;òªi2R˜¿š5PÍ.vZ¦<‡y¨òò³£Œ5ˆ¨< ù¢dReSñ áÖk œG^¦L¼•'7–6‚Ad2‰dWwËþ¸ìC)%,c(XôÑeŒŽÛç}K±««?:¸„TÃ^N¥‘WÔlh¨ŽÂcÅ8‹Q/‰ÒŽN! ³¬ç£ÞU uŸ¨Ž¢ÓW>8\´Ý÷Wâ¹¢ÌØA®„¯*CŒö•ˆo|SœT}™ ²¾$E N.;n ,±ô12mÅOYOÖ0…‰ß÷EÆþy öÃOdÈ1týŽì—õò|ãxÈ ' ¨ëW §®ÙÉ=¹|.Þòƒ&Òå$ÙiqÙ!‡úû`„ÄeU|Ôàb´³ ‘ׂIå F_fD‹ß.|AsÑr üyòÒ÷©Æ¬ŸËm³ âÇnªŽ|áý†!2=]{±®²ß­û¡>ùcº6^S‡0í6¦{æÂÀQQ§F ¿¼C2÷çañ¨Þa½é¢zg]¤‹©l‘Fp®ò2ZdtsžQ2©²™#0àyä5s¸¡'äJ ‘ì)L#lüE ;JXư'C”1"VìSvÆ»^÷ãβÜCSÈDå4ËoŠû0F½$J;:‘8:› î‡—>;¬ŽmKBIp¦)ZŠ+âc.ƒ)ƒD|ãë˜âdJDަ¾D$óÔ\žõ3Žá™,î0Ê›_=2ò¿¬ßì/+½Ä‘cëwxùb3Hœnâ«^4p¹3²Ó9yy¡— ¼|ÂÒ˜ùŽ÷räˆ7qY³3§yÍ.éqŽß.C©ª%ùKÚº<Ç­pC†¡ç¡H¦£ñÍL1âÚêýt •í\°ØxÍrær%:?3s‰¤”kB`(Ô~K÷ ¦ðuñú•¡$3¨ýx½©¸%còD(Ž”A\Þ>78¾k’39©SgðõVW$Ÿ‰šh¿ûw'ÌÀÔk¦ÃUû2û`ɸ–dæbÿfæÄ˜›¨­LÊ%„€B@\ó†bÌ ÁÞ»æ9H„€B@!0a ˆ17a«V &„€B@\Ę»jYÊ(„€B@LXbÌMت•‚ ! „€×16æø¦é–£x§ÏwÅX÷;[p¬«ïŠ¥?þæêâ=õõ+æT-è½rÕ62Éùe¦ú6í ò1ðžCÓ¾m¨Üº Mü:ÆP]BJ–çP3™¨áFÈüÚÄ1NÛŘÁ4ó¸Â}½j‡-N~U…¿ÍNýkcVî!f¬d©¬ã¶ßa7òûØü*ÃãoŒðºŽ£†Ÿ‰¬ÜºoºÇÛ6D½‰lŒ9?ÞàÈqý+—]€+›€&óe½ì~gûÝ0JªÎŸ¯çk‘úÑÀÏ&ŽÊ–ÁpNØ·² öñ¾|oãü‚_C¹ÝnÁ ö~¼Øé%ccGsß16æX~~k#òs£JÅbƒ%ÞÛ|ÝM0Ëq~T3¼ò‰M¿ žÉ·ÇÎÈjÁ^6S~6¦¬lKôǾcåÂÄSÕ—$‡IŒÄ"òím.Ç£šFtgmµR¦¸o˜ëÇ;ü¾c^ùF,.X‰Å9ü6ë¦Í¸×>„$%СÄyÆ(o”—KJ øæÍVlq® nã>à~ºk(òE¥9^<™?œ;Áßáe´‹ñ‚_“ÇcÄ–f¾,Ž»œ6'IÝ;’ÏùÿøwWk\ЦxƒSbL—ÝïDô»‰sÞÕÐ=~èhx)ŒVh~Þ±ÜÔÇ÷»øýsÊ6³ÿ_ñ8¾– oM8ÆŽ–x£œÎØsaòáúmڌģœ%:¬}„=€që*ýÚêmœ*]‡'··}7ê6®Ñß²¯M}þ0±£•^¹¾–aœøãTÖ÷èá9}]SÊ™/ú=Êo¦Öˆß ª·I¿VUË4jkùzœ‡ñØê½ü²`ȽW[†§´o²òS³]uxRKŸ²Ôã¨>WžÚZ‡“ÍÏiiªïžoæ² —_«RåSßp.v5¡ÉÙLÜœ^Õ¾*¬É™¹–ÅŸ±ãè_{¾ 3Ïç™ocÞ¬§q¥d-*˜–NÅ¥3ÇQÅÙ-u½²¶#d€Å˓̫XwotÕÊÿ¤âaÊ×ÛsO¡ßùZ~Sv)^ìÑkÑ\>3/F6éË:ìùY žj*¼qèEÓ†t󴥂ßì+ZÊ«P}°ï÷ëy„§¡{F2Úoâ<½=mØ`¢n†2ÓiubÅ@}8ú=æÑÛ²-þt÷© Þ?¶á°¾m$j\81 y.G·ûð↥x²êx¨5 §ý&îwb–Å«Úê:¼aZNÔÆ¦ÒÃð˜ú]=.î en8Ê–¡œ9ßð~1f_gŠâå+0…¿E«Jù«§ö—ß>̲êc,WŒ6hÿ'»Z‚ºgŒ©ZüDíIÛf@k÷^t7Ö£[õñL{Ëú&Ãï³xlë?£–ã|°PP×¶°Q¼ÂÆØ€\o:û¸ã]”m¢I~UþŒ+cî|óvìz¹Å;÷ãû%¹ÚGØõFËws šOÛx­ß_mÇ/ÞîÅ%W_à£Ó¬¬Ì~4y?¾[œ‹ ¯ïÃ[=ŠfJ–<’¥yç•lF¡š5ðCåå8Ž<|wï~<³* -ÕPÓèXÂQw¼Å¨ï„&Ó³åkpé•=X·ïlv¦{©¯KxT†ÚW\øRV:;&~8ºw–Tá;K9!³ûOèÂú¹ô÷?ª½ÿˆ«Ë6ãÞ9ø=}ü0û>Ô{sQ²i=¦³q öw¡»wP“Fuö*½ilƳ»+0Íå4IéÓ¹¹³ñ}–§x‘‡›ß¾œ =ˆ÷{Ïð;¬º‡Ÿ{ºŸß‰êö©()_‹Ù~'ö¿r&:•ÃËþŠ=°<²ÅØÑýÊntk­?Qž~\¼Ô…ƒ»° ˜ñÙ™^(_«=…w¨{wŠË·àkÖ„¼z[”¾t!SžÝVˆÁN³ù•VÜYÄÙ/ºÛZ²M[øo ¦ôºíǸº§E þIœ' ˜ª}¸0kž­©Æ3e±;³`jÆA î)ÝȨ»JËðCNÜVünÕ:Âøz¦bû½|{½ßeª7—~n$ñë÷ô¢¹r;ºkQVœK¯ïÁ·ù±w<´%l^¯ Ô#ÓöKÊ*ñêÕÂTjvŠo{·ãKüuƒ:ÖœÇkáÏÊBzX^fækñ̦"LKI\õïhý0'_·¬Ž%(¼Åƒú-å8Ë(½-;Qz*–,ÊÔðz1e|vo5VßmÅñCGƒ7[Ãc¢ÚãÔöç ¬¼w¦²]°MEk^|YÍ%BZëÝ…×ûzßom&ŽÖ±÷[¹T•‘I¶~¶;J¶US××"õ|+Žvêaü>/ûzìØÕŽBÎ6ç“CKu“6OË.äÞ™ã-x¦¼Hë?ÌùÇksÿTQ Ëý¥øõxÅWøáòUx“úíâË6ä£ÚÛŽ#íXX¢ë×mžf|gåµSq‹Í–F½óò†ñ]vJm­Æy Ï'czZ(-íÈÆ™öù™°Ú2qO®Cû´b".ª¯ßµ~;.䲌{+±€ù?MC Qãœ!Ê3RÝæ÷hY€7¶£ù|&Jhˆ¦DM&ìwâ•ÅʶJͬ öÛ^?Hýš•Åù©P¿«n¼^ãXVûºy%Ú8RòC3ˆã÷‹ñúº4ÌË_À/Bð7¿1Êr¶q'ÚÎ;ð ǤïnÚˆÙiJA•ÓÛÿþÊÃìÿ6£ø‘lŽ+j|Tzž =ãöù «öÁÙ¸%³lZн§]èUãëµð,XÂ2–­øîäi÷ó¡~ ·ý0.`fg¤„±†\ÕïR£Æ»$¶‰&ÅÕù3ŽŒ9/Nª<'Óm¤f80‰ ÞSVµ×…&Þ].,¯À<{nÉY†ï>ÀÊÒíŽÕ™X¶z1fNµaÚœùZ¼³*^Bg¥qegˆtÌËž‹™4¼gÚ9{cÁ3ÛWbfZnÍ{E¡Ž×¶îRL zÏà¨I¦tG•Ïÿëõ8kq è ígZ„þΣœ-s`qÖd¼ßÞH?Ëa…%5wR»O÷›¶ã™Ã4dræ"]µrUH~/ðG[—á®,‡ÖðÍK‰Ú¨Ÿù()bx2[VU¡•_K2*n³ `RŠ…l²è}†û´«ÉÿXáŸÀ]Ž…Xr¿ þöSa–íGi~æ=´’yúñŽKÕUò<óËááÜÜJæaŽ î6ûT–gšC+|^^¼ñ3',‹*ðpÖ ¤g.@Ù¶&g(EXÊHÏÊÁ4z)·2í[Y˜nô!,U\Ý KfˆyºiPùl¸•uÈÒ ÍÙrð b¯ þô"K’‰ô̧’"Oäyxö^VÑ´G*±mÅBÜž;_crÛªjl(ÈÁ]÷†ê‘ÑnÉSËÑ™˜4ÕŽ»rØÞNŸ!©É¸w9{Á·ðžÊßÓ…zêXáC9áñ,Äœuí˜kÒ²èIÄÕ„ºeŽ۫p ¡ïqÖõiÄ Ê*1[Œ}!V²Œé¶©øÒülft†ŸpÒóø©_sÖâ'l·; xƒÒ¹N¼ïÖÓ þM(k0fàÞ9À[­=<À±×=ÚÅwµêÛ+~,(È¢Ÿ_[±wef` »¿cçØ}F«Eàð\Rs÷fÍåR>ÇŸN\`ù¬³pk*0‰ú«ƒÆŽ8ô7V›kmäõ|<³‚ƒ±-÷¬åM$ÛwC³’1Ò%“+2¼:g{{^o»Ëh€Me¿µ¦´ˆþ­œYõcv>Ëûv»vÓÙÝÚ®"ðü„vþþ+­ÀÝ7zØcsñž9¡ÍÔßûÕ܆£Úª- ß‘ãÂä¡É3RÝžÄ:n,ÇÁ·9Q±·3£*H•*q¿¿,ª­²Oi ,}§ÐÀ»ŽsÃQq|=Æ6<ý²ùìwYw±Ý§ ¥_A_§OôáI½œi ™¯ª÷^½û,Ë‹yë‘O=·z— =éã6û ›1í#Ý1—cVZx©ù³çÏ¢Ÿª_öÿö4Ü~ÿJžwâ mÒeMG\˜¶¼0ÐgGWDìñ.‰m!Å•<½ñJ&>Ü´µõž®ÅÓkjƒQÙiã•ú5S~óršš¶ÝZNkßÏ@z(sØ`b~5qð×”Ké“7¼gg§¯˜;Í@"Ì R¦iœÀóíL/…3A¹¨­<Ê导_ÛÉ»Ü ­T{ÍàÄŽõń؈´BªS%? “J6 ;h“W0^èÀTZŸ‰ ½•AÜ}¤ëŽ¡íÆAÂ_?-Ë¢…Ac$€5G•c^V¨Á‹$OïöYñK£îó•c±µ;TKB^¬SÑUœ¸Ž\´”ƒ•í×ò0ÂÇÕ=#€é7~žV,Þ¼om܇O´ÓÊdz¼1HõU¦T¢gr/ߤ—Ëñw«óBõÍò)¶¦b"¤gÑi$óQ¶Èms2ô`&ÓìJ'•Ó yo?€ïìoÕ®h~“ô+éóiô*Çk§û0É]Çë‹°À£‘Ì=aYx=¡~ðzB}N™«ø'r A¼"g²&»úãuµaëåu]f»¸á0Q„,!½ åÎz¼øÚTíPÿ“LVSÐÙ‹²ê8ëÄ[Èæ ZvTðÜíç*—Ûg©rp@ßÇAÿu—^ 2yèŽ'–\Ì6ª1¬±ú“NAáâڜJ7, βüјi$’+<Ÿ°3*‚¹qÖn,Tésrtº]=8ÙIã£|#^«Ø©¿Éó¼m™aIÅ?IÀ%À®¡¢ F·è#Ç…!Écq@·)Ä¥f|žz}7 “Z"™ͼX²KP–ôÜBXŽìÔ–É¿ÖÅ’òÆÿï2UûI0¾ể ~¿8ò¾îÖ‡6cA×Ô’}-8Û¼»wq6Lw6L1µ£©JÖÓ.x-iñÛ¾¦«é˜¤£Õë•é)x*»ŒùȳԠù•,¶¹ÙÖ,(ËÁ Ñ.ÑxÙ§™Fàè„® Ï¸2æø ïº6ã'k#ïte )°¸zõ‘QÞ©Ý„¶ÞEx¶áqv}ç¸Þ¾axÈ!ØáçLåý3*Ÿœèô(ŒjæQöbÏz¨ªåj”šaD;j«÷âÂ%ÞmÜïÐüýjí ¹øQá[»ø£z³HÃËbŠlÈ¥ð˜YcÁ¦#X“e5¢ ý×H<^ %—jt u(O£1ÅSQ¹ø¼8DEV@2ydW÷"ã$ÉSÍ=×°û"â;•õ\šÎŶ‚ØDdÒJ—tí1]!«È,Íz¦ë,c à׆nSчQ˜T}D:î·ù ¹…eÕX™“ÞÆuxúg@V ç«¶á}/f¯zJ3¹#“ˆ:OV#B<ý B}æv†ƒÊS®·-=yXœ©ô~ 4ä>X´?Y¸âÑõÍZ0ãϘà Õž-¸=r–9™¬FZüÊ™o ¸¥a;oú²7sÍJÃfª·vrp6»èé:LCÎÃïymà{O@7˜Òö]f¿G±àâ§zx(J7™~R¹âÉ@¥ÖôÚ¸®mNç†:Os`õùàv.ÿc>Š9‹>HcR?wàY­NˆI~£ £GÐü-(9üîŠèƒ-ÈhSC‘‡‘¶SCÌ0ÝæÉ$®ª¸Q}d;ö8ªQjÌÈáßÈÄÍåJPX³PÈû–ú}{ñîù^mûFDquã†ù¼ï¢.G°MÔ/ޏ¯³ÎÀš=/¡ˆ{÷s©»ºª‡ö,6†’à˜¢Š>èæŸ¯rE*A{òjåïÅ…~p…MŪã˹•êÐNìèaœq¿= Ž)-1„ ê.ýÔ±º¤»pÛÄ𽿟¼™ -+îzȼ¾´Ý¼qðÁãîA¯‡€ÕŽTÈ6ZòuÍM|@áNK©r³¢‹ÇSiUx½ÜT[¯=à ¦w€^\ÔÕU6Ü@ËŽk?W Zm®?ÍeʇF^”I-u´TÕikò¾>'‰wR!ëK;)™Xr·:;µY‚;Óty§5Ÿí¨®ç’¥ÏÇÍçnÞèGðw’ÝNMjDý‰ô»Ø³²\ð´¤(ã½äv¼r'Þá«J|Ü[ÓÛÓÃŽÔ…T6n —™§Ö.ýn.³Þéâó²òžƒû+58ɽ“½¬«uÍŒ‘ªÅÞŸº–P²<¹©ûDõÁ‡ôYÌf\¿Wgv¾å9í¡˜óz±ÂR5Ÿ; Ó<陕Ë`´\ð÷X)ß®håùHê¿>ꥒ\g^êUýÏzÕQp¾ó!ê1 ¹K¼}Z2_É0—¤,IS`üøúÌ=K•›ðÿ·÷6ðQUwþÿÇ51ƒË° ‰‹ÃOÈ¢Ф¬‰k°’Za×ð+¥Jò/É¿ÀjPƒ-¤<µ!-èBZ¡èºD]j—Ø‹àKbÅ.|H­þ—è’ˆ ]ë¤8“¶ÿï¹wîÌÜ™<‡Iò9¼ÈÜ{¾ç{Þçá~ï9çÞ{Zf~¼ÿYí’ý²N°@ö¢ŠðQR§ì1|¹b¿–•ñzØaÞžKÜÒæ^o>+›ÈVVIH:n¶Iˆ¨kP\Û$Ì”±ä²L÷'J`î’~«Î§ßŸ¢Enkj•ß8ùïÖêy¿2®|S Z”ð¤Q]nmÑgèLb…ô¹ÔtmLÙ¯íU’1õð>mIrî¬I!©»§—Sgɶ—vêd ÇWå5jûÉ=bÈB–òïÊ —Ý!«V¹‚&eÚµsKêlm…#D‘.zX'¥kKÇeÚø-WÙ#|¶A]wÄi@ü×…Né#õ©Ÿ†UOêñÖÙ²‡wV<ÞÞ!×7ïƒ ";Ë"ì¾° S6˲;옓jÒW=mU=€õjƒ´aqª¾AXDÃuª›œ4˃§äšg•í·O‘2Fª±F¹8¹:Uì’w…JE¨÷{ªvž‘*íΣ£ÙµL/?P±y'Nµ8ál9‡SRŽÎ¸øô¹rãäÖ&\²L¶Št(Cô o›t˜ºG#ô»1§.^71»DÛpc¡<͸?±¯ÊRƒZçþÚ†2̾͆£{+p1e)Ë`€„­£!/G®g²5!¶œ°aº „Ge`W¹Q¾7ï¯Õž.{Öܲ¹WžpÜ%†˜Ì8|¿8O¶nȦpy’Km7k ³L:€ä¬ö§M—}+óça‘<8ñv¼Ì®ÈòŠ—N:_;ÎX.±ugMœ‹' gË&ê x$wl>/Ä®u¡ô¸ …ƒNµHF¿øÌ¥È‘‡Ž–­Æ·ž(†ûþYÚt´>y SáòÀHÖMõ²Ùw!å.ÄʵO‡y›Wýט‡î'sðËŸFB=+3ÝÏSI¯–pB6C/Àžz§l‡ Ïë®e%²¹»;Š °²¤J.„ê«Ę8‹ÆÅ`,cø¶؆"çéÆû?+•ö°_Ï_ßÈDA¶º8Ëõ¡UŒ£Ëòn#£¡ÇŠc ë %¤Ê†wÈC …:ƒYÉɃΌeV% ÎÏ[±²1Ї·â‘'ÖcDfªâ¾W!ýDœUöˆNW²Á^PC»`æ”%8yÈyø¶ÕúÆVTœ”ýQÛóµ1áy(FíŸÛ$wý.Ù—6W6?ôR)É/Äë6µWPžj[ºG3p:ËħŽÅ…ýkãë¹òÔoí(غÄdf2¼®>9¾ƒ‘¸=S-¹Øª½´j¼»U/b¶|ɳ÷G-—%‰Ñ^&ýxåÆr‹—‡§6ÈÅ_9å !q¾þ8c¡Ô݉í2¦éOÃkñ Bú\r>VIš£e…òÄáBlÚ}BT(Ã=¾¥0âõòG PqrÞf·Údff¡Æ±â„l^ßZä3ÔÆß™©¥Ì¸Û®ýŽOO×~gzV8´“Îü ÇEn¶Wm]†ñòÀ™ê¯‹ò ð½ÍG5£"äº ùt¬O7۶视„©‹·`qªMž¶/§)C q܉P%É–’¥ÝXZî×W¥­Ê~ÓŒxyXbmô‘lÚV«é~\ ?Ö…jèÓv¦J¶Iÿ‘¶Uq2‹×¶•¨¨õåx<×{ý-òl—ˆÐŸTùK—b\óÙÞ²<º;~Óªej¬~K¬ê[A#ž\óçÞ¦¢¦zn$´dmU÷ üë'#Û&izûìš¿ˆ3ˤ¶¶iiifAaýÚþ6¨k2ƒ¤&4,VuO¦;—̺ÅʹîZP>¿¿{`#~”£_,åÖJÒÈ“AV•Bf¼dŒÓ=I"ü8r¢¥óFRé5àí úuªÌ¤úeE 9Õó°X¤ŒÞB†Ä鼇âã–‹€QPR=¼«: éâi÷ó4«¿ð¼4þ±3uÕaLÚžYšHyªP·¯-š¥îž_¤v¦ÂŒý¥{9„¦2ÊUõ©˜Ö\µøÆ’RÙ¿´_ Zš •ê©,¡±C}ºÕ¶D§·¨zVý¥‹}ïTÅ"lA~’—(cDç˜wK×Ð"‹Þ¬žN®ò÷›F7zvX^“>×ɾp5zélT³òŽíF¥ûæXk‹r÷k ˆC¯ ÓçjÛv¤\t]÷Ûpe‰$Ó6}˜¶Ðí±N­JÉ h@½»êñXîVîÛ‰²²&½KÂC;h¤þ¤ôïÚ5õöä,Æéû7â)¯-aÒ‰c¥ODÛ¤2:Š׉i·¨Ú3ç+XÐÁuø~…Ü!¾&›~oŠÇG²ö¯îb—ÏNô%š†4±ÒüA…6•>´…“Ð ÃE ñïZ!ɃìVÛ’>âÓVÕs§s3Dt:¤Üj.%r0¤ÐúH}Ó7òq`èÃËkÒçTšN)Þ}½ºU‘!u94Ç®\Œ™†“gŒÓÝãŽdwÞQ¾aÓ‡i Ýëd€ 6žU·º,3æÚê…±¯)©Í„Õ?H†÷ÔQ[Ž£’o¡Ñ–ðvò·CÛ¤“r®6ZtÎÌ™•Jíih”wjÉScwØ$¥$vo06“M? .p4C› )bWÃ\¨^¶û#oþNIOzu5=ã§v=„¯o¯ïᢺñÖîJoÕß•ÖÃÂûT\ð‘OV>[)¯'hÅ~ù¤”|AŠ.Ê\üM9*O´âr]%*Þh2ízI k«q¾SV)¯WMÁøÑa±S¾ °3ì'ÚzI«î‹UýìÅrö¯îì0å5æšãë+ªåêœU^L¼|-ÆõøKoZµWgaNv>¾îãÊTcÐà'0þþµX5Û®´©Zïb|ÐÅ–oÜ?sÓy‘òýÓó°öà¹Î'éVÌÎåÀ'l>ËòÛoþ£°âºГu×üû,Í9l”Ï V7FU»¥^3êK;f®ã:6KÕ~Aמ‹ g¤Óf£0o.¾–'ßÿNžƒåÅsúà}l=T§2àÄ©Þuoà‰êªŠåúÙ˜sá­ 1ªdPÿ¿±b'Îzû««›¯Ç[òQÞ9zøÆŠZ1¾Z°oÙCØXÕàg(w1k廃¯7…"Ά£XëI¯.†ê{­Î†X¹Wf<>¨oÀ>„oOO~¯×Àc¢Ëcê”òè—Ÿ­ÆEتdY´ªoUztÎ)Æ[¾<â¿ÞS–ÇQ.K¨-~ ¡Vw¢zE¡öáêÃ%ò]œõ8«É—¼6/÷±ØXqÌ×e¦›¿ô8U±m>fð¹¤1ÚW'o©õñûº”µü°ŸÛ¥<•G%ßE’¯þÝÆ³‡wÊl¤Îûë+øu0HW‡æñœxyÝãø÷ºzT¯“Y%ÅqÝ>ß’€«ñ¾½î€|Œ~§œªÎ.á”衵œåx½QêB9O™×Æ·=ú0Ñc™ü•éüí~Žþ2ÈòâÁ§}e{lÝ|àÉÊ›×[²Œ³Ö“W¹|dÜ!®×Y·¯ã-ã;Ø'†VÆíRWŽzlö´³µÛz¸¹ðú†EØxÐË\Î…µ¯ízÊÚÆõb]¬«Fµ,/)ý6>Q!žõøŽè·±ò¿ºÔ‚!©ñÔÝúö,ÓõÿÆŠ=¾:j>ü¾±®ÚWïÍ5þó³UP!Öä‡{WH¹½±”nÖ¦àj¿¯SmLå·\ÿ¸º–Ì‰× uµÖÓ§Íòq5VKÛÙ‡ãŸÒä¨o’úøxTPËqþ¾.F…ôk3Y[G£`aFÉo΢eò«‡šÉ‚ë¶å,Òä걚ÎÍÆšÐºó´…–z”Ë8¦3Y„}oxÛ— Kjœ©¬Åqé×Zøâ§Ñ,ËÀ/oÐãcÙNÛ•ñ]߸óöH»õ:Óºðj¿ª-/—¼I9¤nrôoÕ¶J»÷ö¹¯Ëçë“’Wøö,²V¬ÐƵýE d,÷ŒáêÞÓöÆ[iufíaÜËPpgyfáóPæÜå3Ç|ùè×s¯Œ0׿–cÒ—ûVÇÔµûrþ– ‹Ê¹šËuv§|µØ;.›_{ôØþ¿Íµ{|ׂ¯ËuçUeh.’þþô@çÛŒ1Uo÷³1çF›|–«p}ž\¿qÁÞÁÈ‹—ëPV² q ŠPð€§_ÚŠÓÎ1˜š œ~Vö xÈ4×ìÁ‡˜„¤A‹á´y;>œ”‡'Ë˰jy¶6X[íi˜/§’QP¼w%¨\Ïo×–ýÈ(üfÙů ï7Ÿ‘ïlÊ¡8· ¨§Ÿ-EYÍh/E’»;^’;&qÈL_Ù‹uÈZ¾O–æâòoêpùr“ɇխ˜ž“­¥¹õ«K±juÆÅª;Kùh÷   TX/Áå—¶áñíïhñÌuóÉϸ;.Ÿ¨ð5xWc  œ©“FÂÙæÄ¸¯áɧ˰øn+Žíöss;¤éÀû¾%M· êrîð4(_¾Ám\S m­u8ÝÜÄ&`®ÈU.«Pôɼ¥ }@—eü+v‹”g>’‹ãòÂéw±Òs3ЦÚû™V_ô¶Fÿù¸Ôù¸Uu››²±ª8ãU· r!mÊêÂËk q°)ßz‡ô+‡|\ýi¨ÔÀ¼ëµFä«þ_‚ùSD1qfù¸]i;Uر×ÅR'÷Ø­~>’F{ß*)ÇG“D·­eøîê"Ül³˜ÊÒ2ñýƒ³30Z¾*3#K~#È‚[Æ·¾ê“ýþsó±&´îDY™íx´Ç…ï “U‹Rp¸lÊÕÍ—8mœy±;ê“eöe)Æ_®‘Á`?æËJA6ÜòAñ—ÏèqU»Þòb‹Œ;ðýÂL•v{Üs¡ ­ M|À·£QòÞ†¶û—`ùê,Xdñ[%°Ü¿ ?13ïÎKØU´oiEÚoØölÅ­y9Úx1þeX¾8MfÂ×½·ÏÇÛpíÁ–œ‰#aKÌÀ]ÉcôW'fí%r!ßÖDb6¾»u¾[)ýw;Þö0 Œ¦Ž%’Îz*ZӤΖazœ\¤Ë0,G5Vn¬ÂôÂÍøAé2\>¢Æ1=MÏÝ5'¼Ÿ”v»¼0#´~å¿öÄÆ§aöM"È’‚‚Õk¥žÖ"oöH|øϵÒÛž>H@º–ÊØ:w’-Pu9 ÇWµÇ-OlÀ‡™RçOoD†Œúx`V§!b<Âæ!±â„ƹž[®ç*y„ëߘiSxÙ³Wòý#eÔlÄ«'õ²¿D¶F$$"^¤Dºö¨\ŒNº±Œíúµ`f\#*~¦_k#éoL¯}ü½Sm& U¯žô³1gÅ]yù¸=1£¤B¾0BŒ´3Ú¨á+ôÌå;°lvf|5#¤ßmtbêýù~¯ËÝ9p Õ{1ná|m ö%445â²Ë†ÉiÓô8rq¼Õ.öe¦''#ÞpQš]¼[–=Ó0Y3ðŒB<Ç–YøÁ®Gq{òL̽ßwÍ;rOàÄñga™U‚Ü4iXb,nÈ–r!6qñ)i'þã¦H>É`užÁ™ñ˜Y\‚öÄ'g‰ñb‡ûµJϬ.$œn¶”ÙHSÃk¿]Y LY‚©R.«}&ò³Óo›ÓSEÐ\VØ4'úÅgãÇërq{J²oÊþ#ùlZ›-Qü#~ïÕ,žGÌZƒ-ƒ©éó1[.þoŸhôä§Œ;VíÙ"ƒò4Ü•.u€o&¦J\U—·.*à á|ûýó}íT§1ƒ >— ³6®§ð6L+nƒ]* 3R§a¢´Í.÷] öW¶¯ˆ\†Õ9¢ú\> Cáokô›#©/éþ؆skÂ$LýGHûœîszAmJÚvµÔIRvFÄŠq5%EdŸ‘=jòã¹Kú I>ᓘŒ©rÁV.|>ªíÈÍ—Ô‰Þg½|€÷kKJ —¶<9!•ŽcäûÒYËÖ÷'œ,#-²“/qðX#½*¸îœgjdË‚Uò1qÌLÎz9RÇ*j¦,ÅO¥ýM•±¬`…>f¼ß¤Ú¦bš,c»–¸L—vsú¤tBoýÅça¹ðŽ—v;5ÝsÒsÒÿÆ&`FºjvÜ*Œ'Ëÿ[§Ø%O=XoO2~•®£W]?¦Éx:F4þ Ã×yæ mFõKwN€%V]'mÀÉ3Z[ ©S£<³ã0yx£šŽu¯ð¥)r 9Ò ".áÕך¨ßi3Ù2‹ö’Ù)š_äkWý÷¦¬|Û1b´]®þò†“SËYWÛLˆ€ž÷ˆéy‘]‘¨¦4‹µ»sX¤…Kãg Ûd}FŠ¿Qʸ¡»„tdYÊqð¥̱5É®Ë3'xC ¿VÌY³omǦGkdFa6ž”4>Ve%Oœêrª9•ßÔIþ „ÇÛ÷ã–k™5S7ÅW©ìsjP3ž»|!¡.OîZ×Ü%*›1ù¸i ÏÖèmK"ë6sî¶`‹,Í83Spà·2ƒSœ¦åël<ŠMRþ•|-5(èNeoI™æ3â+3rgúåX)³Kãï/ÂwóÒ||¼é"ÅScÚîNôE ´dÄ[î.½3:n§D¶ØµÁÓŸÀHÁ†Q£ý!£äød£6È˜Ö’Æ È˜2ÆŸÈ{\?ñÉšæ{$– 7Ë`«œSfÕù¸ÑzËPmÄèTo¢”ç©Ëqv4§Ç6–Â`ú¶Åvkí©MoJ­N÷ Arª4%.¯³Ø”%7¢µ¡íx%y-©”3µ:õúé¿f²cŸ…—Óh¨Gk‚ëNëˆ-8)UúåK-¡×Xý¥^FøÆA½}ykE¾G.}¢+—Tø”ó†…Ô…/†ÿ@kË©vŸ‡¦ZÀÀ&3–RüÅ7äÀÓÜZ\}\ W÷*mð˜¾=„ääaRÇöwƒgö¬+ÆÑTÓ{@h?Pñ#Ô±„Z ãŽEÊ•o‰“±Dm‘ØôDæ§þŒ÷V’H|Ó¬âkc¥ú•ÿªûë­@”ÓtŽG’º°Epaùz »¿¤Pf=î&Ïø\§Þð0¿aóøaÇ:É_á027^ÿ’f¥eoàlcÞFª¬ ŒÁ¦9o’¹Á]%+PÊ0îðÚcÐùƒšr;¢ùhùŽÐs¤¿!¹d×Ù6ªWOþªW¥w ÜQ·G 9 ·>‹ŸV>‡éùƒÓZ­ ×gÅ= Sd²¤›ÖUøf¡¼¡Æ_53õÔþð¤,gZd9iÇKþ½)Æx¾cC~>?ãA¸AM”k3¤½ØÜ(© =Ö(#øXÒie3´fmÃkpzƒü`I³ç—÷c—,+$ þžd5Ê_Â~1ä>šU„Ÿ ƒŸ”戟Ÿ¢&#HæM™JܽX®– _*ÅáFíJœ"Å ‡HÏ/(ÃÉA†ñ©­IÂîôÏ Åôpï7:B‚T±JÞÚ(œ‚\°jÁç†è!e Weê»8ºÐ „G !­Y°![È×ù>Þsbñé$ŽKò'E{ÐG+—4[oSt›*l&Ñàg(ºê\– ŒÕ{µ6¨ÚáO÷oÁdÍ–‘™ù¥?ÄO÷”iÛoÙ0m¨†@÷ÇЂ.ËÖ¿W·ÂÊò”ˇN,lãxÕáXãƒêäWñý3Í2\x#ˆ¿‘¡?ZÈ‘šeÅÝk l_À×´¾ï‰Ú 9F¬Æc]‚C{XË7’u¦={‹!y‡¯{3ýºØ<"LDÏ€¾dÖß= ß­X£Í™xRµÍÊ&7þ"Ö±¯a¨øj ²`ªÌ¢»Õš2ñc­í«öÿÖç$«Hš»|¦ÑsÔÍ­Òšñ¡j ]¾Zz ÷èºi}tó\ÿM¾’é­ÓˆòU`˜<¼é íÑW?â§ò0^ÿFË*˜EVFÊ6”Ã’š%3“j5DÎ×m—k¿< ¢%z¡í×›±á×ù¾'†ÜL¹yTeýþ¹‘ò)Óþ1]i3†œ{õ°_¹¶&ÕúÔ0!{1dÓí~éùqúD‡…Ž—å¡q’îCI“õÕ´0ñeséµ²yØ…øIɲ)99õÖ¤Uº»I–{Ì•0M¼•<µì÷yP¥lZ—M°+w婢 ãeµkK̇7ËÃrî’ͬû÷Ö‡4Ô0©5ïX{:2,nmIsÜsµ=j@QË(é$Ng^®Ø¯Å Ûàe³òñ7êápÉÒ¶¦f©t^¨ñ²[{ #B<3}ýÄ,0ÄOÏOyljþ»ŽŠ>wLÖÚGFê¤>áø%é—§w?%Z[¤Ì-8Uß ;2¤~fÉ’øK;õMɲ¹øUy …ZúÐ^Ÿ„>°J»“ Ú iƒá¿a1ŽJñŒ×ìNg¨UšlúW ÄãÂõ€ºòF6üZF‡wì‘Y\ik/Š!qwš60">A–½zMÂNLÙtD.Dßç¤2/· [ŸGž:9¶±ïʆp—Ìz674h—:WS=Ž×7ÁeM@’,髽3>×Å|Æß9[’Ê^NÙ¼Þ*SY­õ8ë}—^OɲÚdÉQ–úO4 Utßœ¿A³¹ôkPø±FŸÉô×Ú³;BìØ«o„WTž”¥è¯Î ¼€ú`„H‘ÄYqûWíÀkä¡#á(ÿM ÒÖ µxÿ3>5]É*ì×ö¦:esþ>m nî,Õï:hÏž®{±¹EÏ0BÝ›i±=˜%0úÔqWú»ä"HÍÂK»9u°R3Ýn³¾Ž-–8_ÊñzƒÜÉør´²J„¦Ë¾M™…ÓÚf Ê*eKŽË%K5ɬ’º’ú›m—™ÕryÀJfü?¨¯Gk«Ï:)]k—›wâT‹lúi9‡S2þ»p|õôn”i×iE2nžmPíI\pŠW¤ñ%\ÁºœK;Q[¬Â^ÿl“0SÂ/˵>ã~5N$à®xý|úý)¢‚Oô~èëþªXªß:¥WþLÆ?ÑTÜÎéß•6#BûÈõë2k|æ|$ÉòKÙ …l2fÊRÃÑ#°ïNÙ»¤ÆŽ 'ç¾›k2æÞìø­w*(²vêÆû?+Åþ2O؈L|?[5é`’·E:ßwòÈ^µ½È7ÉÏ“Ê÷£*?ЉFžåªÉ9›Pˆ­¨x©B¸GÈ (Û!{ w þ´– ¥E+r7—àâŠbÙè|DvÓ,<¹"ËŸ¤Ã£1ø’lö?ölæÏÖËL}hÉØ$›©yIÊ|w¦À5زt~\™or³%|ËŠ±Ã“׈»—bN¢^w«t€Ë±úì£%\<§&ÓÓÿ}òUšx@~ªR}NËègtõåxq¾¶§Šà/£ìU J®Î½E¾Uí·+©’e°*XnË”jpÑŸ8(¥ŽÃ›ÖˆÊ*ÆútËAÙŒ¾²7ó'‹“åZ`ÞÜ­­RWgôºŠ ÉB[°Xëñ½% ôÀxÙ~ Ö•‹OËÆøÝ²©^- ɲf†<(t¬Q ’?VÌX˜Šƒ»·ã‘ù•²mwÀ]±ŠeÔYO%u"õ8ä!ˆ-ªŸkN–Föü7ËRÅyÈÄë2 6c¢¦oh>ʈ nÌËš8ß/h’¥“íø–l`W.KúõÄ1¡²ŒwòZÄ ?áe%`Ž<ˆµéÅ øÖ‹b|I²¼Vãi ádzºû~q¾#›Á‘ÍðÊŸµ …Y Ú±±\ÊC[JÕBü¼}jbv Z¥Ïn”‡L<ÁªÜ¹¶Ø`\þĆ#•—±9Z“ó±ja‹<¤T(Sèg–áÏÃeÛ³Õ.c² ;äiç]³µ1&\ÝË¿P¶=„F ô1©ãN÷÷X|Aܨv¸2ÿ ,S21] …£WcFHû_Çš>ö¯]Œ]Ú‰_–h7H¶ùd¡+Ë6ài7Ê©}ŠO匄ª¿ÅM«°k‡z F9½oŒâc±2Õ'6«J—â{Ej;ÑMʈûKð£Ä1Ú±ïOX¾’~ë2YÞ& ªôèÚ¸™‹X“:8¾„ËC³ }šhªDúX×Ñõo$nÏŒÇácµ}‡*ñ­™vy/¤ _2ì nË*ž·Ÿ¨c¯‹•-*ó§Tbÿ–Bˆ³Reûô|¯"?¸3ܘäM­~»ÒfŒéz÷øš¿ˆ3Ë¢¶¶iiúonæ×ög3ߎüäNEfˬžKÝx#§¼„=9‹qúþÒ)¼Æ‹y 5àv[Dnð•Må­Ë`s9}%W¬Õ·¿ì­íóPV§ ‰\¹vÞ©ò«^Ú#:y³™N‹Z1EO!¬{Ã~]_jDt :íl¼ d;•'fËÝŠÂ}»1Qî’•™èeât^2ݶ¥ö~yUÖ8ÊHa ¬[]gUçÞ˜Sçªb)æ¦í¯ëRN™gôµ×0} å(¾þhƒ,ëü³‡iNš^f,ûdHÚN´¡4⡳÷×£GÏË"õXSZ‚Ûjh>aäuKgsY‘Ú}ø±FMüëNi®ËË:b -£‰§.M9šDïÐ+’<-,¸ý5xëÓ¼îýiüGæÌýáŽLêXò±4üIDATÏ׬É (“ÒA¥1–À߬ŽOU,Âá'y‰’VF« òë©=e“ú–Tããü¹uíHËÛL¾OLd¾‘ÆM_v8¾DÎçŠÉ–¿a¬7‰Òc^Æz l³Ô¿ mæj•ŽëÄj¿ÎÌé”'Î ¦³YGm¹¶dUè›… +VY¦ýRå>]WBœgöá‘’#o—— 5j{E²ŠgG¾˜šdÐÙò›$ ï%…ôSXøŽÃ¤ˆ5ˆB#w6^hÊNøÈtÁeYŠÒö!õ—!ïÀ²Å8|9T†6Ú¬—.Ç^Õ9T%ÝG17má„÷7ö•p}àYÖ¹¼7aõ ì“!Út¢ …¤söòêV>aäõ ,órè%?Ö˜at5ƒ×‘_غì(a˜ðHò"…‰8Å'ØEb÷*˜˜Ôq§ó (“Ò!P+ã™iËkjÜž9ÎpcšÑ1ö_£L•a„,¢F: Ÿ·7U$J¸ôÆ:íx|‰œ‡W³ßpù›Å½Z?c^ÆòE¬'c¦]h3Æd½u3sÝ+šÚwpч›FvO@§R{dS½l&W³Zãåñpýõ =žÑ(<e™Z^ÕÒƒÜ`„}}`0Rf™H cΖ&¹ù´!^–õéH § tffnÀs= ‹òH€H€H€H ÚtƘëÄJl´‹ú x Иó’à/ @4æ`¥Qe   ð 1ç%Á_   €¢Ì˜“7l>€×ëÕÛ±ûÀÉ—ª+å }³    Þ eÆœoí­Ä®ß4÷FYCd:[kåSFåøH½§—ŽH€H€H€ (3æ,°É7>¼Ÿ3êmžVùÖ¢¼&±·³¡|   è5ýþWS-¶•â´¼ñÜm©°È›ý½_¡s5Vã;ÌMm’RŸÐ¾µ˜›l‘!—cË^ý›ˆ#¦ÌÆòù¸IÙd®l^ºw-MÃ2ã&^I÷Ë7ó2<&› ïV–bË‹u驊«779”e×òëq¬Y”‘@f®Anú¼µýq°þ3Öç%‹¿/¯+Ä« Kð”ö=K^ÝP€³³6"oÌ¢/w¿[¶TÉ˃EÆòä¦%H::   èyý<3×$ßCnR¾ÿtæ&´áC)£×¼r»øèd•rn,^¾÷Ø­øààlCnfáFü`k nuÄwòwzö½¹qñr|tzn-Xƒ‚©8ýÒ6ìx£I#×|X> .†ÜìÕ›ñäúùh;aXÎuÃÆGÕÇŽ³ðݧw`Õ¢.[òºKgŇ/U£UI‘ ï?)z9 -µó *ëÀÄ„1pË·Ú>:Y‰M[j0õ̾É!2ªÅü£#   Þ!ЯƜ³á(NËìÕªsqÓ˜ÌÈhÐPV;VíY‹»ÒÔ籜8þl=,³d¶+=£’±dYŽÄ>‚—t“I¥]¼õ9äfNÃŒì'4y¿«i_'^ÿ™žök)Ÿ˜åë³Å_ÏÍy¦Ft±`Õ†|L3“³EN»G¢%ãžd}V-NäUì’wǹdRM–D÷Ë©Êز"~ pù¥rolAs}5/9(þznV{FHÚ¢‹Zm•ðÊ“2;÷Õ™š!xsfª–2KgÉB’d5.5Mbɹ¶Äj°ÅÇÜ9åA‰Eøöæ£ÕèH€H€H€H GôïÓ¬ 3±jÁØôì6|ëˆØI·ÍÂôGð‘ñÝ$†‰4UâÉy›‘Ó´;žXˆ; ¶ɳ©W_ŽÇs·kãf!/m¤v|ײ_RŒErnÃÌûSpô%e‰³&ãûÅyøNÉ6<  (#2j8êï³£L½«R‡ÆÜUácâ¡Nà>ì0Ô›ËO$0@¨îÁú€¹Ò©& ˜ 1gF…~$@$@$@$0@ cîâi¼~ä4ÌßàÕŽÆ£Õ¨ûÿçS*¤-QÍ¡JàÒ94´ ü3·œkÀàÜM3T&ËMC‡@ßìØn?‹Ÿ—îÃï¸CÖ7WbÜÏcïÏÜÕ". <ðä³ß×áÔ àöYIUºï×¾‰÷ožˆ”¿ó¾ð4žýÁiÌÿV¶Iü@Ù<#Þ$аïq¬®j“… %{w#Ù&8Ú½õx|q1Ò6îEâ˜Øh×6¢~ŽšRTäà…’™ã1H€¢@¨]Ô+¶£MäÞxo.îú?6|ö'5¿6 6y·jLBîþ "ršJ1ºª×šêyÉ3®Õ¨Ù^ÏÆÛðég;°ÍŸÝ¦˜¦¤' ô6Ĺ%(›Ù‹%ΆJ¬Øö–l,CªÍ6·££ÕkªÆ¼ÂØüB &˜Br¡zU1Zg• 7Q Ña|S!ýç¤ob~ Rçbý±d¬ÍÓz1g è">2æ€?‰b×}ÎŽFÅàƒ’í¿oý'`ÿ»qø·\‡êŠ*´H‚kGÜ‚9ÿ<Ÿ7Ѳýã7ñbE5~/ñ®·ãÚÏ$¾&׆´œy¨•ÙeÜ5þi²ç$rä! ô1ëH$Èå\5slE‚} FÊD–î+^-õxºt+j*ì9±en"ÎU¯G…#éŽý(¯‘Ù=K2–m)BFB¨è:wË+œÈMw ´¼F¤X0{Ùäg$(‘zë×£¦Ù-'6 [#aº™æ:W-i˜ŸÚ„m'0{íwи¾B¥ÂŠyóœ½%¹‰Ú¹ïOÓaT4Çcã–d)XŠ +´ €ø=P._~’Çú‚ýÈ\š†ýÊ!4<{Šò3„¨r-¨~ª'µ³€0OÚô%ɨ,­î[„„CZ<£¾KŠR±¸tZ2¾ šsþ!úlÏœ2´Ú>>‹‹ŸÇÇœ‡ãS}÷ÛŸ®|ŠO›?ÕQµ7âÅŸTÁqó}˜¿$7^y/î;n‚ñ¼ÄCîsw`Î’EHqJ‚nÌÉ,ŸÈipCâô‰ryŸ çç•L Ò«(3Js¾9sCqA±r X&3ve%k0?Q}€ÛÑ‚úªm(oMÚ’eHµÖc[áÓhÒBÿ¸ÝN4×W‰!׊¥kÖ 'ÕŠƒÛ q´Eâyó@6îØ’%)¶O¿sIâv;´´Û*ÜXZ´Y“&b~Ž>›­Œ¾œ™ ™ÉÙ¹wjÄ^LC‚¥ˆMïÍó*ËåÏØG¶m؃iK×`YN*ênÃÖcІ ‡—ˆ!'_âØ¬.Á% [ôô;žäzÚí¥Ê,Â_žª¯Ä9)]þžA+7Ïy¸ñ‡H` 0™ó굕¡õQÍóø]~ìä‘7WfÌ |ö~¶¯nò­2Ó&˪ñ7 ÃïŸ×–h½†šJýÙûoJ<Ùs—;ñb§ÅÏ]„ßÿ÷z4ê¢eÒ! Y_™(³}£`ÿ|#>çõç/ D!ç™Ô‹^9›× c‚²ŒäŸÇ¹eƒBòRß>®ä¢F,X]…±_|‘|‘å e/¬ÕÓO+ÂÑy«ñF}ÒÆ¨<,(Ù”µ"ЬG‘W]ƒŠ=5ÈŸ6×#À.û÷ÖúöïN±•-HO›†D¥Vs;+&ÅwÖ÷T¹üÙ¨íKËžƒn[&£ñàTÕ4ÓØßÌ*)†ª€ x"ç0VTV¢a‰èï‘]²¹ž Š® }µ(2ƒÞir"YåIÈ ˆbSªwµ”ÕPÜü•åøâß Ÿ‘G›S?§¼±F ó͸y½Bƒžq#îïôX;ubhtú@4°XD›x$kS\йåÔoXð³Ø´ §4úâb@ K‚, zœË¢-ãÖ7ˆÑ• òŒŸœôd’“%vC·Ê\n¥´_3cN ÷ä%?!ñ{²\¾ll3Úw‚1 r\ß§eŒ¶ïÖ¨fBJŠ£5º^Rü6!3m’¿€!úúÅòˆH€>5æ:$Ó®Œ²d<¾S‚l>ÙçwZ<-ªÏO{¦ÂwÆ@4«¢­@¢2N‚]¬2ļN_L‹÷%Þý×"¡ë†ZDMŸ&Ön¹¨¤>wæL³Øwi¾s_¿~dHc ²ÙÍ”•Þø=Z.C΋ÍÙ$þéɰŠa©fí|yËaë™3ò7èy‰Cz9 Hç%Ù‹'FŸ™¡¬Eæ ˆ>}¶g®3E¿îæ —7É{¾ Ëžºö+ñ?²Ì4ï†ëlcEÜü¦ê8ŽóøMż/SÆ¥ØÎäÇ8$ ¬²OË.Š”?µõ-N8[Ρ¾Amt;Cž€u,ÇÑ1Ë\-8\Y%¾é˜4R ú#V”» {Ž6È2ê«÷‹abAÚ¤1°ÚÓÄDq`ëžcÚ»ÔZ꫱GÖv“çÏ š¯3ˆÔŒ1'ZdÉÑ̶O’üjÑä}Å\Püž+—?÷8)ÃÎGqIòl©?ŒJ±m3ÓD«é6™h”W )u]òàÅ>­€s|ËÆ~)ž£ }•ï¥3oÈ_;láleORþ @4裙9yuH¤R{­°˜‰øÊÂûðó½‡ðâëô×¥`á·nÔ½ñ>Ÿ¬i§qøCØ/Ûe®O¸ëNÃáy}I¤¬FýO h¶(6%›—bÕŠíò ÄM=ÛììNô,¯Z\¨\½Ûµ;–•-ñ?R êËWc³ŠÊ¦~ÉØ\’‡ÅÛ°ðÈ6]Ò,y4+Á/AlA£³ÚÓ‘j9ˆí+¢\^?òÜ?'ƒ;a6f[ä é„»åIW³ø=W.CÖõåXì)`ü¬",Ñ ˆüÍ%hYQŒÂ…:CØg¡¬(Ë0ð0Tßxì/={ÞFÿžÅÀ$<# ¨$pÍ_Ä™iV[[‹´4ÃŒY¤ ¿fïzwN?ûTžO6 ×E2ÐÚ¯ íŠ,¤ðiÕî fšÄî@µí„Ý5>))Èôw÷ÀétÊlœ±ž¼ë÷,Âzá¹üDhaV #ÜY¿ ×[ðìs¹p‹ˆkHd—È‘µFÓ0sÁN§ ÖPAzäKÇ0oñ6y(áÏC ù¡ñ;_.'.©i·`'@FZ±hÁV=»‰òä®2ÕKå¥ÖNÃê$Û«oSõrV&cïsùág+ƒÒò”H``¸fG šeš*móM#D±gÍÌuÀuÃ6Í™‰ˆ&†œYýH``°Š±àœ¸åŸr!aÕ‰1UÅ7¶ÓFŽW|D£hdöntã—2 tÝÍâ‡è¦\ÎúýX\|Лµÿ×2{w§É"«Ê•B„5¸BòòK1=òé;f66ï°ìlššž$@$Ðÿ¢vf®ÿÑPƒ¡NÀx—ÖW3sÁÌ-Mb¾Ø0&ÈÈ Ž¨Î-8ç&$x–gÍâD‰_—ÊåÓÙ‰&) mBBXCΕ$@$`B€3s&PèE$л¬òîN˜qºÖ1Ð^±Ö»*õˆô.•Ë—£|9c Ч3H€H ÷ DÕÓ¬½_\æ@$@$@$@ƒ‹¹ÁUŸ,M¸!ÖûˆugÌìH€H€ºDÀñY;þzŽÙ4æºÔ™ $ÿÿ 5PБ D'º‹Ÿâ–ÏùÇìèÔ²{Zјë7¦"ÀòÛ'øHT»è;æ @t(®mÄ7§ûÇìèÒîê´¡1wuü˜zˆøûq6ì…²wÏ£ñòâC:  ¨!ðZ³w¨CªŒ×jÌŒ.jß37a³Lƒ“À·Ä˜»Sˆyûnû÷øÄ%ß–£# èwjœZZU3rƒÕSiÌõ{S£ƒ€$~6{Ú`( Ë@$@$0Àp™u€UÕ%   #sF<&   F€ÆÜ«0ªK$@$@$@F=ºgÎø-Kc&<&   蜙뮔J$@$@$@}B€Æ\Ÿ`f&$@$@$@$Ð;hÌõWJ%   >!@c®O03   è4æz‡+¥’ @Ÿ 1×'˜™ ôs½Ã•RI€H€H€H OИëÌÌ„H€H€H€z‡¹ÞáJ©$@$@$@$Ð'hÌõ ffB$@$@$@½C€Æ\ïp¥T   è4æú33!ž$à™Wàd«Ë\hk=Ž>7Hª³­Áø¯Ÿ×#æ‹%ø§Û&àó“2ðHI¶Ä4߉? Å–¼aj&MI”1Éçy=ýWîLÄç$ŸÜÇr$ýÔœ ÎKæûì3ñµJÃçeYØþ÷©ï >1FknÄ'n&Ý1 Ÿ“PŸ3ó7¬·}M2ûøðÚ|ØG'`êCEøÇ¾ÔúeŠü(¦N™‰/ßgCû¯ß SÊ t<% AN€Ë¬ƒ¼‚Y¼h$àeÂÙxro~˜ÅP]çëÕJé© l(¨ðâzßQàÁõÃÈ;ËÃ{æÆÕ¡ìÕó9ÉǘbÐ ŠâÛÖ(K©«eNQ‹$‚§$@$0T Иª5Ïr÷3ƒõF“?^”€Xƒ><-(†q*L‚´I8ƒ<£¡”ÒôTÒkž7ðb#Zäx²÷Ü÷{ ¿cíã/á‡ßHšàñå}¡jÖní³3ññoà©§*Qq(ßþ§ Úlž™¿/¡:ÖÙÕ‚FÙ;à‚ãò„H€†..³ݺgÉ£š€S¿b~½¿øm“ì©sá“æ|ì~·œŸ«ë‡ÊñVc >>Yµë•¥¦õÂ81ÞþÐÚâY¢´bòeÉòÐN¼Õ,F¢QÇžÛ# “‘1EÛôfâÐöÇýØmÎ&Ôüt¿¦ÛXòÅojåu(.|~b2&IˆÛ©f×ÂùÄÊaÜMi2è¥ç§PóÊ>¬Ï[߉¸™H=uàì] Dž‘ ÀÐ!À™¹¡S×,i”ˆ±†7´Ôüšz¢T9û?•`ak1ö>UˆWt/ܽv/¾bÓ_Kâ÷…ÇJðvÄ[] ±lH¿/o’¥\SgÅôÿ'¯üëv¬\P)O³îƤ¯oÆÿm^½Ëb¯–ÆŽ…[ŠðùôðåLÆ~YŠ•‡€„ȬÏî‘%ãùhüy)~ù´'шLýS¢œ8Ãø{ây'­Éòª–"ìýA9þã_ÏàîG‹0éßJñ¿7IaÅy£yRÉ0¥‡ùýxD$@C“À5gVôÚÚZ¤¥ÉR  šƒ'Äú’‰Ë‰6™„²ÈëJB¿"êIS‰„8õ|EGNÉ”=jƸnI¯æºâ´×¢D ñÚ¼ùÉq˹ÛmJ„ó7æÒ&êÇy'µx¼ w—ˆñ:ÉëiŒÍc èYùMGœ™ëÙ¶@i$Ðóä!£Ñ.ƒ0cB%Óx.Ç‹¾èbìùÒɱȹ%ÐŽÓ’…ó÷É”¼_.^ˆ7Ôû÷ÆMòZŒËÆ,r~D<" 0hÌ…Co ¾$`Å?Êûå¦Ë{÷>‘}wמ€)“úRæE$@–¹[uTœ8y¿Ü$ùOG$@$Ð5|šµk¼›H€H€H€¢Š¹¨ª*C$@$@$@]#@c®k¼›H€H€H€¢Š¹¨ª*C$@$@$@]#@c®k¼›H€H€H€¢Š¹¨ª*C$@$@$@]#@c®k¼›H€H€H€¢Š¹¨ª*C$@$@$@]#@c®k¼›H€H€H€¢Š¹¨ª*C$@$@$@]#@c®k¼›H€H€H€¢Š¹¨ª*C$@$@$@]#@c®k¼›H€H€H€¢Š¹¨ª*C$@$@$@]#@c®k¼›H€H€H€¢Š¹¨ª*C$@$@$@]#ÓµèŒMC“@|ìÐ,7KM$@$ý83ýuD I€H€H€H ,saÑ0€H€H€H€¢Ÿ¹è¯#jH$@$@$@a И ‹†$@$@$@$ýhÌEQC   K€Æ\X4    è'@c.ú눒 @X4æÂ¢a D?sÑ_GÔH€H€H€Â 1 H€H€H€H ú И‹þ:¢†$@$@$@$–Àà5æ.žFuÕ18Â$Ð?œ—.á’üwºú'ÿ®åÚ‚Ãû£i@èÚµ’16 }c̵ŸÅ3ëÖaݺm8ýi º³Õψÿ:T¾p•gW.¾‡7ëjp¡gÅvC«vTm‘rw#%“ .ÎsG±|Þ<,\¼‹åÿÂóðTu}÷ é¬ÇCóB½³û":LélÅžªr8ÜÆd  ~"ÐGÆ\;t›Êcu E½€cozÏÛ þW8lØ0Ó± ó‡Ä˜|ÇìrŒÓ/<ƒgž¯Bã§¼Yõ<¶ly»,… WÓa,\±ŽÔ%(Ûû^xáYl^6'*ŠñøžÎtMÕŘ·¼¾I2«k‹Ö"ÞÚ‹„,€¶^Ì€¢I€H€®–@'¬«ÍBÒr9ü8®ddC™ZWξbD]xóì®~šicCƃ‹pïÄá*6=ó4®Ì˜ƒ˜ã/àÍ í66y‹²1V“ߎºª TÕ—¸Ãa·Ë/ãv¼ùÂnT¿§Ž1¶$<¸èAL&3†»«ˆ¨X·cSrñpöD@–h÷U¼€³Ÿ*-†á–ûļv 퇰íÐdØ8t¼ãÇÿ5š]S°üáû´2Ÿ¢zÛ6\¼#Jº‡D§˜8dj.oÑ^5ŠCí 5åå€e6; #µâÇbBF>6¶ÖcuåNÔÏÿ!’- X_°™KÓ°C9š%^òìe(ÊÏ °B}õX0¯Ùw#×Þ‚ê}Õ˜›’Œ‘±J¨œ?UŠŠêÄ—V³õ\ºì¬'2qpý6ÔËL[òì"¬ÉOƒJÚT»ËKB›€³Ø±¤¤Y‰½i%j*ò @è›™9QT™E7&Ý(¶NÞôLOÕÕ¼‰aö$1½ôpUž+²É-eN.}øA$ÅÈL^Í{Ê[síŸ~*ÛóxoøȾï\¹P‡š³úºíùWvk†\JvÎÍÀ•Fãz®š…9¹Kؽˆ˪FÍÆÜˆÌ;D'q·Ü—{gŒUÖžyúyœEr}f܈÷Ä ÛW§ï¾ko¿‚O%ßCÇÛqïœlüý”x´_8î+SûùcxÓÑŽ$)ë°áWP÷žö;R0üÊiœmî3/µLùgˆpâ\`ËÊðrþbÛ“Ó夵j­ÔG¶m؃iK×`YN*ênÃÖcM°ÚÓ“"ÓdHƲ’µ˜™  ­6œi>·f¹pxyrÀ²Íe(+Y‚K’vÑÓïH<åtÙ¥ÅÛ—S„eÙv‘½Õ·Dë’æ=¿h#v”•`–µåû½éôÔüK$@$½úÔ˜•’™÷Âq™Ñ‚˜K5猌¤Ç~ï<̹c"l£ìH²ËüÝ…ó2×¥»v±‡%eceî}H‘º” ñ="¦Ú›²\“ô ²Sì;q妈¿2!•† Ù«tÇıuãD™‘Sb•q6 o%¿Ã‘"×ıõÙB‘„‡‰£F!éÞ\Ìkóì+Çw(±b@f>ø r<ùÕ²RÞtC‹€³Y› ‹S¶X°³z¶IøÒ²ç?s2æ>l›´©±cb-³{“–œ Í–3ÊržÁþF`–̨eLH@BržÈ±Ã]S‰—?⬢øöœ4dÌÏ—VìFfD²ò17-¶Ñv¤¥J¦õg ÌK:  è' æPºa7bÆ-Ãd–ë8êF]ã(wØmóÇç=ŠWtÃHSnXŒÏØSÆÜÄ;’|q}YÍô9¯§{|Šcûv㕳bÀ©H8ÜWÉTÚ¯òÓ„‰W’,óïŠfƨ¿1v(;Sw2»—4 Ï×½‰‹÷ ñFÑ1{†GµØ“t}Gy~½©ø;„ÈÞ¶ib³6±ŽÜNuS!6šÏ¦³aŒØl^7&AŽê5ÃÊ-3qÊ©‰8mUU;óü‘ôqAþ ))@e>s'ámb¾e¤Œñ¥Rñ½îÜÑX±ýˆvª©bó)äÂ_  (%Ðg3sªüíí2–!˜öÓ¨:Ôˆ±30,F )/Y‚Ý'†\Òœ‡±nÝ:äÝ!Sb¾@=R»n}ySøµx#ÌÏQW%†ÜÌyx-Ö­]‹bˆ]ñ§Ô¼I½é¼çzö‚Ì Š‘çóòÆñÈHʼCÅBÅ3ÏË«PĸK±yBøCŠ€“’Å;rMA@ŽÖˆÌ†Ù ûÓ –šS%HO 8±ð4SÏ`ƒµž9#‰Œ&›œ*KÐãtÓPNœï`µr³ŠÊäÁŒ°%'^ü¼±øK$@$íúÔ˜Ó¦¿ÆÞ!—.åb0CÛ£æ·ÖÚ|³_Ÿ^8CubD‰Ù¥þ†szêa%kWÞ«ÆñÆ‹8ú¶<ÿž$ÑͯO•1¦_Á {S,¹Ùû¦9Í0kÇÅóz.Ãn¼E_¯ ê…ãZ¾%þñ ÀØ;îÿ0nì È„#>u\Áð[2Äœ£#@ùKÅ£…Ë÷¡I{ÁœõÕOaÃâ³ó‘è1àâäv`çΣ¸$K£-õ‡Q)w™i“4aÚÞ8wZÌ^P'³érq°TÉ\-õاž’Mžƒä,A—£É7ÛçlªÇžýÍ’Ÿ“ö\`òŒH€¢–€o²©w5ŒÑ !mSö‘eç=ˆ³WdŸšöäƒwÆK~o”½fcßěջñž_“ìÀéÓØýÂi¬œg×Ì1¿é§kˆÓÛžÇ¡Š§%`’n¹§ßÓ ´321öøó¨~f‹Xqce/Þp[…NOÄ<{ ì1ïᕊ-¨‘=wkLÂÃÎWŠˆA¸î–‰-é>äÝk0ÑB¨ —½v¼÷J#22“tÅø—Œfbïf X^OR¸°Ê’šW"{Ø’}çÚA}9/Ø®ÆÏ*Â’4ýùW{æ|X–cŲ7n/þY·ñ\Ÿ_»ò鉿Ÿk»rE^uHž€?Ä 3‘,[æ\ö­GÕù¬\9'ü ^h2ú 9.8/9á’åÎXÛHX KªpÕcÑ‚­(zv7ÝjfÌk@KÒ;eá6ÄßÒ©"˜¦õÇ1;Ré,V«¶Ï¥gº7Ï,!ýH€H€ú•@ˆÉÓ¯Úx2&†œ×Åh/ÿõžuükL;F 9q†œŠhÈ)™M 0î”_çxUgÛaŸ“AC. "z{ ÄÂ*/…3]ùÏ!ÿœò+Öšy1¯$(¢³v!LjcºØnÊ#šÞ$@$@½H *gæz±¼½#Z^Ž×({îÆN”wËõN”:$8ÑtΛ¼Z¤{mHÐ`!I€H€:GÀ?UÕ¹øŒeF`˜ ö‰|‚Õ ýºBÀŠ„ 4ãºBŒqI€H€€¾}š•ÄI€H€H€H€z”¹ÅIa$@$@$@$зhÌõ-oæF$@$@$@=J€Æ\â¤0   è[4æú–7sÄþüç?#Ìkq©Y4 ˆnê3 øÃàrɧu©ãÓ¬ƒ´bY¬¾% ‹?þñøÓŸþDƒ®oÑ37 Kàšk®Áµ×^‹ë¯¿^>±>xMžÁ[²°UËèyj¸á†z^0%’ @¸ÌÚ “ @4 1͵CÝH€H€H€H 4æ:Ä`   ˆf4梹v¨ t@€Æ\€L$@$@$@ÑL€Æ\4×u#   ИëƒI€H€H€H š И‹æÚ¡n$@$@$@$Ðsb0 D3sÑ\;ÔH€H€H€: @c®@ &   h&@c.šk‡º‘ @hÌuˆÁ$@$@$@$Íb¢Y9êFÑHÀñY;žxã,*N_ˆFõ:¥S^ÒXlMŸÛu:Œ‘H€H Š p$âÊ¡jÑI ïÕÓxñÜÅèT®“Z)Cô/*¾˜ÔÉŒF$@$­hÌEkÍP¯¨%à5äŽ>‚Ì[ÔêN±š&f¾X7à Òpå£? 5Ü37Ôjœåí1ÑS…÷êípµ÷ " è?4æú=s&   «&@cîªR ôsýÇž9“ ÀU 1wÕ)€H€H€H€ú¹þcÏœI€H€H€HઠИ»j„@$@$@$@ýG€Æ\ÿ±gÎ$Ðê^«CÍi‡y¼ ÿçu¾aÄœ}I€H`ˆ 17D*šÅŒ"íðäŽ\³ç]\‰¨V;êêå¿§ÿ×4Ö‡kA£Ë4˜ž$@$@C„¹!RÑ,fôpÔŸÇ*¥ÎÿÇ/ü9‚b1v-pÛµæj«ºï_aX " ü̯ƒ¿Ü,! ô6:ñ)pý0<ðÇ+xòÄydþãx¿.M Xöb3ÊÄçÛ0ØþŒõ…ʲë¯ÞÆ´sj>/›>§x?æÃà ¢x%¢Ïb÷ â!Y=úåéX¼ü?͸àÝó&˯š!wƒ çþo–Ýðgì5½3o^{S3äžKOÄG³FáÂï½ û©,Ì–H€H *И‹Šj C…Àé-Àµ6dŽEÊŒ1Rì+¨’}qÊ]9wAfäþ ï|%ö±ceÆî<'ˬú¾º6yÂ…ÛâÇãÁÛâ1vR¶Í²IªHË´šXþ! ä¸Ì:È+˜Å‹"2óVñ?Êør`Ù³Ç?éO.<òö‡xø6e˜éÎ;„μ5쟋üð„WI€H€;sƒ½†Y¾¨!pE|xJ´ùñÄ¿‘}pÆ•kã0ãâ'xè÷ò Ä% åOžY6™óº+²gÎç´cÃdº7¾/H€H€†"sC±ÖYæ~ àyðÁ6g%ùóoûoTT|¨=Q•¬æä>Á“¿:mwÛP#¿ùâó€{ÆÊäÝËÿÓˆšÿŽCRÛyÜ÷ëO$„]XÃÃ?$@$0„ nó‡0z›À¥óX'«ªÏÍ0<¹ªòŒ³c¥<•úâÙ p$LÁ©‰Ã°·ùF>wë0›Ô,]Œê¦…Ì9ÿß–¥×™‡ÞŸ_;ððßúd•(:  ¡Iàš¿ˆ3+zmm-ÒÒÒÌ‚èGCšÀ5;j´òÿ¥ ³w8|Ö†+ŸÉS¬g"_–g?i®Ža×™wÒ«×ËÐI=H€Hàê pæêR ô,ëâ"jò’à¿Þ³ùQ À€&ÀeÖ]}TžH€H€H`¨ 17Ô[ËO$@$@$0  ИÐÕGåI€H€H€†:sC½°ü$@$@$@š¹]}TžH€H€H`¨ 17Ô[ËO$@$@$0  ИÐÕGåû“@M“£?³ïvÞ^½GľÖmiLH$@$Ðßøž¹þ®æ?à<0a^ÁÌLH€H€H€H wИë®”J$@$@$@}B€Æ\Ÿ`f&$@$@$@$Ð;hÌõWJ%   >!@c®O03   è4æz‡+¥’ @Ÿ 1×'˜™ ôs½Ã•RI€H€H€H OИëÌÌ„H€H€H€z‡¹ÞáJ©$@$@$@$Ð'hÌõ ffB$@$@$@½Càÿ cš !HeIEND®B`‚154_create_apply_rule.png000066400000000000000000000331471516513262500342410ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/15_apply-for-services‰PNG  IHDRaR„a,iCCPICC ProfileX…•y 8Uß×ÿ>÷ÜÉåšçYf2Ï$ó<ÏC*×<Ó5E‘ •dH!…DŠFSB†”dÊPŠB©T†Lyªïïý¾ÿçÿ>ï~ž}Î箽öÚŸµ÷Ú{ßu/¬¤-Aadkm^G'g^Ü8ÀZ@²€‚ä¢eii òçýßËÒ€¶Þ/$¶lýÏöÿo¡óð u²D°›G¨{ ‚ï€fw!‡€éEäü‘a![xÁŒd„ XüöÞÁœ[ØmKoëØZë X<‰Dö€zË>o„»7b‡:i£òð BT¼×݇ä{¢³;00x Ï#XÄí?ìxÿ7›nm’HÞñŽ/Û¯ë@Šú?NÇÿ^ÂÿŒ± ©T>dCë-Ÿ‘y+ó6ÙÂTnr3·@0=‚ŸøzlëoáŸpC»ßúsî¡:ÈœfPÀƒ¤k‚`d.QÌáþvZ¿±,‰¼ÝÑG™û†ÙþÆnä`ëßöQA榿í$ûxýÁ—í´è oà $~KþôpØn Bž6 |F'ýÛO{»ÕD ò¿Ò§ðÚnØîá> 8ÍŽÞ‹VC›"OM¤Ê¢•Ñ*úñÒü«‡ÕÅbõ±¢y¸#¬J¾ÿ™ òöD¼ÛâôLJìa>`ú0ï1ƒ˜qÌ+`&·­üÖ:èOþs^`Ækú¿½sClÎþÑA !¬ÐÚhu„?ÂÍŒfhyÄ-´â›"ýO†á¹ý3—ÿo‹õúó[N-F­ð›…Ûß•Ñù«õo+:ÿ1GÈÛäßšp2|î€ÁOá¸ðÂMp-Ü?ÜÂ#ar;þŒf½ÍͱãûGGºBzVzýŒNúÍ€¼½Þ ÌópØÖ†Ð ‰"ûzû„ñj!'²'¯Q»än^YiE¶Î÷ãã‡õö¹ 1÷ü##!ç·²,ídÁÈ9P™„õ…dBÈÞdSàŽµ{89bG†Þz`Ð ;ƒ p~ ‚ø$ ÐzÀX[à ³îÖ‘à(8’@8 ²ÁEPŠA¸ î€ÐÇàèƒà5Sà˜K` ‚ D„ 6ˆ„Ä!YHÚ éA¦5ä¹BÞP… 4ètº•C·¡:èôêƒ^Aï Yè;´Š‚QT(FJ%…RFi¡LP¶¨ý(oÔ!T4*u•‹*BÝ@U£¡ž¡Qã¨O¨EÀ”03ÌKÀʰl;Ã^0Ž…SḮ„둵~Ãsð ‹f@ó¢%ø4DÛ¡ÝчбèSè‹è2t5º ýý=þ…!b81âUŒÆã‰Ä$ar0¥˜û˜vdïLa–°X,3V«„ìM'¬öö¶[…mÆöa'°‹8Ž 'ŽSÇYàH¸0\îî® ×›ÂýÄSâyð²x}¼3>ÏÁ_Ç7âûñÓø5 Z A U Š(ŠtŠŠzŠŠ)Š5A˜ N°%øŽr •„vÂÂJJÊ]”*”V”¾”q”¹”·(ŸP¾£\¡¢§£Ò¡r¡ §:Cuª™êÕ"‘(DÔ$:ÈgˆåÄVâñ'5µ$µµõ1ê<êjê~ê/44‚4Z4h¢irhîÒôÐÌÑRÐ ÑêÐ’hcióhëh‡iéèdè,èéNÑ]§{J7C£¢×£÷ O¤/¦o¥Ÿ`€øtÜJÚ¦±ŒÂŒFŒ~ŒiŒ7»ç™è™ä™ì™3å1=dg†™…˜˜˜Ó™ï01¯²p±h±x²¤°T²ô³,³r°j²z²¦²V±²®²ñ²é±ù³e°Õ°²£ÙÅØ­Ø#Ù/±·³Ïq0r¨q¸s¤rÜááDqŠqZsá,æìâ\äâæ2à áºÀÕÊ5ÇÍÌ­ÉíÇÅÝÈ=ËÃÀ³—Ç—'‹§‰ç#/¯oo.oï<'Ÿ!_8ß¾n¾µ]»ìvÅïªÚ5ÊOàWæ÷âÏâoáŸà08*P!0"H!¨,è#x^°CpYHXÈAè¤PÐŒ0«°‘p´p…𢈆È!‘"‘Q¬¨²¨¿hh¯JLAÌG,O¬G%®(î+^ Þ·³[ewÐî¢ÝÃTZï$™%M%ã%k$¿H H9KeHuHý’V.‘~-C/c,/S/ó]VLÖ]6Ov@Ž(§/wL®V¸¼§ü%ù— f 'Z6•ÉŠ•гJJ®JùJÃʌʖʧ”Ÿ¨`T´UŽ©4¨¬¨*ª†©ÞQýª&¡æ¯v]mfðÏ=%{&Ôw©“Ô¯¨ïåÝëº÷òÞq > ’F‘Æ{M~MÍRÍi-Q-?­Z_´¥µÉÚ÷µ—uTubtšua]ÝTÝn=z=;½‹zcú»ô½õ+ôç  Ž4b M 3 ‡¸ŒÜÊæ•ŒcŒÛL¨LlL.š¼73%›Ö›¡ÌŒÍ2ÍÞ˜ š™×X #‹L‹QKaËC–¬°V–VyV¬e¬ZwØ0Ø´¹n³d«m›nûÚNÄ.ܮŞÆÞžÜ~ÙA×áœÃ¸£”cŒã3'v'_§Zgœ³½s©óâ>½}Ùû¦\\’\†ö ï?¼ÿéö¤9H:x×ãêàzÝudA*"-º¹å»Í»ë¸Ÿwÿä¡é‘å1ë©îyÎsÚKÝëœ×Œ·ºw¦÷¬†OŽÏœ¯ŽïEßo~†~…~Ëþþ×ü7ªñ®uAôAþAmÁÜÁ‡ƒûBÄC’BÆ©Ê>4O6!—†B¡ûCkѯ:]á"á'ÂßEìÈ‹øiy÷0Ýá Ã]QbQ)QÓÑúÑW ¸i9ÊwôøÑw1Z1Wb¡X·Ø–cüÇMÅÄ•'÷?þ<^:þ\üB‚CB}"Wb\âÄ ƒIÔIä¤á“j' “ÑɾÉÝ)r)R~¥z¤v¦I§å¤­Ÿr?ÕyZætîéÍ3^gºÓÓ/Åž :;”¡‘QvŽî\ô¹‰L³Ìê,Þ¬Ô¬…ìƒÙOsäs Ï·ŸÏ5Í­½ páì…õ‹>ó´óªò9óSò— < ú/i^ª,ä*L+\½ì{ùåƒ+ÕEBE9ÅØâˆâ%ö%W•¯–—²—¦•n\ º6^f]ÖV®T^~ózzª"¼bö†ËÞ›º7k+%*¯T1W¥Ý·Âo}¼íz{èŽÉ–»Êw+ï ÞË¿Ïp?µªŽªž¯ñ©¯uªí«3®k©W«¿ÿ@òÁµ¾†¼‡LÓ ‰›MÑM‹Í!Ís¼M´lyÝêØ:ÐfÕÖÝnÒþä±þã֭ަ'êOžª>­ëTî¬y¦ø¬ºK¡ëþs…ç÷»»«{”zj{Uzëûöô5ökô?z¡ûâñ€ÑÀ³AóÁ¾!»¡—Ã.Ãã/=^μ xõm$bdíuÜÌ›ÔQÚÑœ1α¢·¢o«ÆÇ¾Ó}×õÞæýë ÷‰O“¡“ëS‰ˆr¦y¦Ëgdgfõg{?îû8õ)äÓÚ\ÒgºÏù_D¾ÜûªùµkÞq~êùÛæ÷S?Ø~\[_hY´\[ \Z[NýÉö³lEy¥cÕauz-r·ž»!ºQÿËä×›ÍÀÍÍ™´ýUF*ÊË €ï× :À€äqêüëw¡­´{Hú„jƒÐ6M¬0ŽÏJÁCP§4§ò'ž¥®£™£“ ÷d(fœ`c‰bmb§ápà,áúÁ³‡7‘ï9?€µài¡g"@TNÌKüüîN‰e)i+™8Ù ¹A”¢ŒÒ~åT•jÕw{ˆêÊ{]5R4ok½ÑÁë*ê¹ëŸ5¨53†LL ÌüÌÓ-îY¾´úiÃl+ggaèpÚ±Òé™ó»}ó.Ëû×W‰ÍMÂ]ËÃÚó —§7ÉÇÆw¯?ä?Ðx9(!Ø'Äò2™7ú5l(¼1¢,2óplT@´Ó££ê1J±ŠÇTâ´Ž›Ä;$x&†8‘”u²$ùnJsjWÚЩ·§§Ï|Nÿ~v1céÜbæbÖjú~ÖÚõèyCwUOnohŸN?±ÿÅ‹¼¯A…!ÌÐðpÙˈWš#Ø‘$¾ÞLfŒ©M¼==®6þé]á{ë x¢jÒnre*ëÃîMÓÖÓ“3'f¥f'?–} š“›[ü\õÅý+Ý×ûó–ó¾ýÎòýñô… EÒ’G“«í’››ÛëÏÝBùÁ²ð ú6&ëˆSÇKP„)wQIU©­hÜicé éf™h™•YH¬Él÷ØÇ8)¹ä¸÷ñÄñ^ákÚõšQRˆGXAÄHÔU,J ýýÎ"f»Þ"µ¸uº·{Ü÷Ì÷:âíà#íKå;ç×ë_P˜”B>äBÖ å ]  ¿‘évX/J:Zà×Q¶¦XÚcØcKqïwÆßNÈNŒ<±?Éø¤n²i )õxÚÕSOù’¾xv9cñÜÌù¬ÏÙs9_Îÿ¼@{Q%/(¿´ ûÒDáìå©+o‹^÷•<¹ÚXÚp­³ìóu¾Šý7òo¾ªb¼e~;9½VîKV{ÔäÕö×cÈ7|x¢±´©¡¹ñÑõ–³­1m‘íqÓ; ž?½ÔyæYx—Ís‰nt÷HÏÞ´>¿~«zzƒVCnÃá/_‰yíõFg”}tn¬îíÉqÇwïñï?L´NLú 9M5=0S<{ì£ï'9ŸÏ_B¾†Ì‡|#øµ¹è»d°L³|÷§ÞÏg+Î+ŸW{ש6F¶×_´A&ÐK”'Œ…ÓÑâèL4V ;‹»Š÷¡¢X!tRRE­©ei¨i–h_Ñ5Ó—3d2Æ0y3[³¨³Š²1±­³Ïpôs6rUróäñæðeíJçOˆ$ é ó ÿé- 7ÜÍ'’˜•–z"]/s]6W.NÞUAE«Ø£”­ì¨Â¦òJµ@Íc¬:V}loµFº¦–®¶­.Ðý¡7­?dðÀ0ÇÈÓXÐxÜ$×Ô gÖjž`adÉjùѪÑ:ÓÆÇVÍŽh7fÓᨣ±“Ó[ç²}ÁÈý¿²ÿḃ:®x×>R¾›¿û*Ïk^‡¼•½×}š|ãü4ýsÀñ@ tP{ð‰­Ÿ‡*ÈNÈ]f¶ž±'b,2î0×á‡Q®ÑÌÑ#G*Ž&Ä8ÆŠÄ.kË< –Èz‚2 $-œœH~žR•z*tJþ4îôÈ™[é©gý3 ÎÑŸ{œ¹/s.+:[+Gû|òüÅԼɶK²…*—U®(I‹”ð]e+¥»F(£(§A"Iý†ëÍ“•7«^ÜZ¿#r×ùÞ¹û}5ŒµNuùõà ˜‡¢MnÍÇ]jil}Û¶ù˜¯Cç‰÷ÓS·Ÿ umt‹öìë=ß7öBvàôà—a›—u#|¯³G¥ÞR¿‹œL›‰úlþ}iÅjkýw~‡Û*X$;ÍDòLûÓH £É3ÀBÀ’€­ @¬(ƒJùŸø{@Hâ‰GrNfÀD<’išg$s> RŒòhýàX‡è!QHÉC¡ÓH>ØM  Jå:‰dyý¨U˜6ƒ£á2xG«¢ÑÅèWzŒ ’‘µb!¬&6Û‚ÃàŒqgq/ñ|ø|ŽÂ¢Œb•`F¸BX¦4§,£BS¹Qµ‰)Ä/Ô¶Ô H¦“A hÑNÒ9ÑõÐëÓ?dPf¨fTele²fš`gÁ²ä° ±Ö²™³Í°'sÈpLpr¹q‹sÿäyÌ›Íç±KžËÿZà®`ºP€°‰ˆ¸(Qt^lPüÁîK±’.R*ÒŒÒó2Ïe¯Ë¥Èû(+J*1)m*VSíWëÜÓ®Þ¶·C£[sDkF{Ièa‘soˆ7¢0¦2a4å3“77·²Ì²j°ž²%ÚÉÛ;9Ä8^vjsžv¡Ü/}ÀþàQ×R·ÛOO¯Þ >«~:þV‚܃ûé“Âäë"%ߎÞs¤7&øgÜP|V¢é‰¥“Y)»SÛOyžaJ›ñÚŽ:º*zòúʆb¯˜t˜Î›sXèYú#wZ–ÍyÛl»,ûËMŽßœöŹB8d‘¡\¨úˆbFé¢ÂP¥¨˜6‚áfx­†ŽF×£×1Z˜TÌ0V{;ŠÛ‹+ÂãñÁø ŠŠàG¤Ô¥|@¥BõˆhIü@OÃGÓLëB»Dw–^‚þ9C#‘±ŒI›é s 7K7ë67vm1NFÎ5®QîZžs¼|¦»¤ùY°+‚ß„¾ ÿ٣ح)á*'U ]+óBö‡<»‚‘b¼R« •ª‹Ú-uò]µQk—v¦.³^¥³qŸéEó`K;kY›;gû.GC§û¼\~Hp…H!nƒJžùÞ>ÇýþÅfÁ ¤†ÆÞåqäKlI\Ôñ¡øõDÔ |íI¹äД4»S³g’ÏJf¼ÊLÎVËù–[~ñ@>¡àZ¡Òå‡EÅÍWuK;Ë,Ë*loôVêWÕݹsþþ~LõzmJ½ÐƒÞ‡ñMŠÍ³-ùmÑž†>ïšì¾ÔëØÏø¢0}ØøåæÈ7£3oÃÇ7ÞÇOÂSñÓ¨™„èOÇæ¾|Ñÿ5_ðíô÷ðº?–®/š/¾^òYZZŽXžýéò³gEg¥b•¸²Ú¿¦°–»ömÝh½h}mÃvãæ/ø—ã¯›Ð¦Ýæõ­õõ’“ݾ> *m0c››?„À`#css­hss£I6ÞаóßÎö]C @þÛ-Ô)6÷ïÿXþ ÷wÍŽ©7]‡œiTXtXML:com.adobe.xmp 609 82 ^hôNIDATxíxTÕ™Æ_Ô‰š©&¨D3£0D "›h„–ôѤº»À>Ä–Ò l»¢1»ÊK@H%Ð&t‰>fmÁ.¸5iM, 6QŠ#4 Œè • LÔ‰:£²ß¹wf2“LB¢‰æ†÷wò•ÒD åsÕ ²ñŒfßÖ¹9šKÍ^€éIf™3¥ö^Œ™Ó¬ä @%&Â`MǶ‚YˆÕVë@Iþ|Ìݼ_„–GÄT•Všœ5i©éH‘w-J‡H^üN’b1oÝ<þøvÜ9! j Ÿ2rõÚQ.â&ñžL(çY ‡Êy×`¯[2¦ToZ†ÌÌÙÈ[¿L)ºG qþ)µK¤yÂI;· m¬ååIÏ J€™Ä;·éV–ÌÌ—ãÉ6Iy†¦¶÷¡uHÆÆ'—¡ÍêÃZð†H€H€H€ºB ì8òøž5ÈߺõöF4ÖïA…0•R&Œ¯V²–¯+Zƒ]ûí°Ûk±sëN÷+¡ ÓZù?Ìã•ØZ1# åZËTΜ&òF’» K wÁÞhGõžJ8½æsΫºu”<~W•ÓÙˆ=%[uÖä€ãTDk;F³/U«­Ãš5bŸÝŽÚÊ(­>ÞaV @gÂ=a`o¯*“ŸÖ.IÓW KŒJX†‚–Í(,©AyQ¾¿ )÷Ì–¼ÉÖÚ/›•!±e{µxªôP7˜ßÝ¥Z±¬xÖ,_‰º†rä7¨Þ¤¥#qbgó† “ÿ±ªÜŒ´ìTì.’x³¢•0%¦"ÙâB«…òTæö´ð¾{£ÂO+¥"ôÅ÷µp[_ˆš:±¯Nom›YTÆâ•H€H€H€:"Ðæe­ÒÌ+oË÷xµ>sÜÀGƒ^y“¾:“ø-sàà±£á»_xK¿ÙìIÁ!¾à¼²/`«>Fû±ƒ“œ3ã•ÿE@[½Ø×ó«?çôl@$@$@$ÐO´aýda\ ôea1a}ÙPÚF$@$@$@ý‰EXÚM®…H€H€HÀ0( ³U4”H€H€H ? ëO»Éµ †E˜a¶Š†’ ô'aýi7¹   à3ÌVÑP   þD€"¬?í&×B$@$@$`a†Ù*J$@$@$П\T[[ÛŸÖõ À×N %åÜÿ¿ôÏggÏ~í–Ò   èG¢»pÖØ…&ýˆ—B$@$@$@}„EXÙšA$@$@$p~ ;¿ö›«%  è#(ÂúÈFÐ    ó‹EØùµß\- @!@ÖG6‚f œ_(ÂίýæjI€H€H€úа>²4ƒH€H€Hàü"@v~í7WK$@$@$ÐGP„õ‘ $@$@$@çаók¿¹Z   >B€"¬lÍ   8¿P„_ûÍÕ’ ôa}d#h ÀùE ‰0/<î3p»=ðx{k¼hr:áržé­ ¾öq؃'vWÃÕk ¿ö%Ò è—Žº?BîcÚÏ '›»¼F÷'Ÿâð™¼ïý¬Ë}ŒÜðßgXþÂëøø³Ï¿²eôÖœE\׎e³óq2b¥^˜ž¿³Í´èz•§±ÿ™W6_OŽ´Äsÿ±8_nSñ«Š…øòÖ{°gÑT¸‚3´ËÄÜQ€G²Û•÷N/—•aos,nššKTïÌÂQI€H€zžÀÛ~Œ-‡ÞÖoÅÇt:É~W3þ}#>?{×]v œ~‚¦¼xþÎdÄ›ûï@‹ˆ°ßÂ}7ÛpÉ…"ê±ÊÞš3²‹²aÖüy8í5ÁåÁ¾me8â3!mÎ< åâ/Ë`ë——0:S(טŒ??SlÀëjaê©áC·ÀlÃýK¡Ålí¦6cLöDŸò‰½&¼YUŽÊ×Ü95“F˜…“16K¨½ž7+nÍÑ]šÇUYˆû¶7 cíc¸ÛÖÿÂv ‘ €¼Þü¾¿§N…¬áqAËßý؇ˢ"µu3“þT=~<Ú‚»G\ÝÍžl~.ì”7¥¦ûûzѼ[D˜k&e¤axèˆ^'žÝV‚òçìð©rSþ«4ñMÕx ·ñ3çá&ÇN”=ç’ºDÌ_›‹[ÛŠ7¯'ücZl6 ±™å'1dñî”o@ñS ÚñÉÙ¸i&b¥…«f3ØæÀŒœ,4=¶ÕÈÀ¿Xëñtcf<´ S¬º°8¶»«ØððÊ4¼øt^4#‡jBÌ{ÊŽòâ­¨~Ml”3v~±"fO­ÁÞƒªÜ„ñsò°(#Ô.­9†$¥aˆžÅঽš69“ô¹õª.¬aþt¸þg ö»|ˆOž‡œ9VT¬(Ä+ÍúýƒKÅ&x±oÝrT8E$gÛ°kU™æ=9ur~2Q[ßÿʼn=+7`×A‡ÆÎcCÖ¢\|71^Ç< L¥½¹3qbæ*,ž³Åë6àØ“³–Hûþñx! è ®? –Ø0¦ìºò“fÞicßÙõ ž8÷ËÑÝO­òcAÕ‰÷°ôÀQœ‘#L%¬Lªµ?ô®+_:ŽºwÞÇu߸ù)×#íÚ(¬;Ž—¤L‰¾Õ/9ðÒÝ)¸è‚X/ó?*^;-?a2‡^¥ÓöCõÙã8“-^Ü>øJlN½¤QÀ¾M·Ý€å/Ã[|‚¹bßɺ=jÞ‹/¼@<{>*Ö‹k2!&vFDs³åépb—Ê'$"Vl:"bëDƒS7ÀcÇ ó5ŸœY3§">JSAé¼M€Mœ³cͲ–|ì´‡ÐÇù ðñ)!©KkØX„¿bÈ=ÈKpŸØuȸ/Å·Ð'ñl4»jP, £mZû#UE(®ñ¯I5 $/¾̘Ÿ‹œ¹SÅC&\ *Ð$õQÑVŒôÿ~ÆŒNÆÍ63à©Ç}‹×г"K<¡c¢]Ò>‡;_v`6^I€H€ºA ÑÝ¢Å6©ø&õó¿3@ ñ‡ãMauÏ·‰û»ÄO3îògûìó³8*ÂiƒÛmœ”€»Ä[敲ýù5lM…š܌ߊ9ñÁÇÚŠ2úÑ( ì³nÅTKEÒO¥œ¤Á10Z;ú{fÚ8MtÕŠ({¼ñ¨–16‹ˆÊ}þ˜Ö6ÒÇõ1—bgúøë]ÉšS"O¥€}z OH@Á-×ã—"ìT\œJ§D|=*K³îºã&\u¡&µÊÛDˆ*‘¦ÄšJª¿Š§»åšŽÙ¨v*Æë/®¸>•9׋jö~ WË'ªZKïK›rD))Û|ÂóÕ™·Š»J‘ÔyX¯£•*nÐ”Š‡‹–ỳ±tÝ2í¸2ØÃ’‡Ë7¡pÛFLTêu8âl1…)#kl¬ÖíÄs"@fÿûœòÍ/±iUJ}Äâ»ÓÓ115UÍê¡ëÝÛ#ž£_•?ŽGÊİÔéÐ4_]Ô¯…×^‰CruÇ8±Uû£NµôfU©æIŠ™œ‹5Kï‘9~ŠåâeCã^T«ý”µeJlÕ¤Ô$­ý¡:‡víÖG×?5¿.Ú„û§éÇ—ƒ§h÷K¦*.>V<$ùMGúòb¬yh=~‘“¬•ª±‹Ÿ¬M2'¢°|=Ò“G`°xìnÑDW#N«¡âÆ!+æu˜˜½S’¬8¶»jKc’§#-u‚xóÔÜ.¼ìÐçÖóƒH€H G¼ùþÇZl“ŠoR?¿CýYOϾ}&¬®A¼4¡é´ˆŽØ‹;8Ì iøKñ„©Ø2ÕvŸˆŽ!"6®¼Ô„Ï$Žì¦«¾}.õ+ÿ¦¿ÂŒôÁWHŒÕPÂæ`“>ße¦ aÏ—AWGëß¹{ų¥Ú|"ñ6YŠx ˆ¹©µ¬:Â*s’9¯4£í:Š'ÔSö¨xŒ{ªï‡ø¾x×þí¦k1>î2,;5bÿÙ`­žI»G˸»Þ8¥”ÿý¤vlªl~Kbäþ0ìÇåiY—˱mqÚH¨1”×­;I1P¼”Gï[×Ä9vg ÕöÜ;ØÁˆ>oà‹Ù„pç`k‡øä âÛQ)•7Ø›nQ7þcB­JûˆCæŠí˜ØXõy[äxÒ…m¹_š¢£nl[<Û‚tŸ8mBPœ@„Ç ñ¬•½æÀ>ñxªÚ+ª"·X¥u•ð\µ´ö ©_}5"k‚e-Á\÷2ºµ¯aüäDÿ ú/ù˜d›voŠVBHÿKâo n§ÝÆXäZ'?Qå­ ôœ§%‹–c¿RVR`ý>ê©Ï«š5×áÞ¬XD$@$Ð'\+G†.çJ×D_lR-"Fû)oX )¡Ò;r\XÔpâ=kþÄ×NìÚ««CJ¾ìjJˆ9DPª#öéw¯ŸÂÞ8 ϧŸÁ.GžÓ†êª Ð.Tü$Äšqä½ÖoÚ°:ñÆ)yk›”ЫoØÜÑV<Öø~/ž3•”‡ìOo½Ö|Úõq¸÷F«Vv…ÝF‰XënRG‘Ê£×"kÚj×O¡®‘©žNUbµ;é ‹°à$¢ÀÚ#ñ×+äÕšÀ7aÔ s°kÛLlB KÍøñ=k嘱'ZRüMLøÉ†˜ÔN¼éÕá§Q¸å® ”ˆ7kUŽÄ‰cæ«xªHIWeÑÚd¤údü¢b,‘ªº]Ö5Ó »HµªIŸ[Wÿ¦„íÖxl÷fM€Ÿ»‹ÒãZŸäÔ¼’­ãšL}\ÓØEøõЉ­ ˜# èqÅ›d—ã¬@záfÌýóaíVÅFý0$^ †Ð4öªËð”xÎ ¿5LóT…Öu”¿ê’((±ð9Fl›rö5⊋MøÝíc´ã¼>ójX“P”Š;K’ù7Þ¦œ§ƒâ…š÷ìÔf%c˜µïí9Øqc©9ÚÜ‚{Ç\±ÍQyÇã*™[ ÆÐt÷ð«ñà‹¯c‡¯ÆE›p£xÆTZ2n°öÚö\yuLHn£‘’Y¼ƒ—^t–Œ‚;‡ÅEjÒå²îùßB†5‹`¯î›«ðÀÊ]8ÜhǾ½áñ\'Ÿ^‹'jíX_¤ïaÚÙëmDÑÒB<#GŒÇv<[V¡‹º˜4 ŽMDV²úÅóa›‹¿h·ãpm%JËöû#C ÉšÓ1&xoAf²5xŠtxê ­¼¹j%ÖíÞcõxfo½Ä¥A— uظNÖ&ó¾\¹;kŽÇér&ê‹­¡óñ]<¯˜ïÇÆUUZÓ[&ë´ª[ù¡—]*1e-øèÓÏq@bÅÖ¾üf‡ý³„ÁV‰ Beg€W‡"TtÃÖúË¡cÅ¢Í+P´b%^9XŽÕšÀµà~yªÒï-ǀѨ\Ÿ9”dÃü óüÇ“úÏÓo6 |cCàVú%!ç¡ Í³sóÒbdoY)Ô¡¸ No3d²TÎïÞ ÿ÷ª°"ó =í‚)9 £‚n0y冪$kÎwc}A9=V¤ÅŽ!f:&fŒÃ¼’à¡B쯓µù§<3à™ ù6‡4ù"k:§üSĶ4º©«ótI9XâɲS”÷@Þ”LÃDTÅ?]„#OoÁy:5-Ù‚ê:*VíEZù=â\IÃ*/â¶+Ã<{çê×Ûõ]ñ„õŽëí•q|   èú"ºpbÙ‡WHÓH€H€H€HÀ ( ºq4›H€H€HÀØ(ÂŒ½´žH€H€HÀ ( ºq4›H€H€HÀØ(ÂŒ½´žH€H€HÀ ( ºq4›H€H€HÀØ(ÂŒ½´žH€H€HÀ ( ºq4›H€H€HÀØ(ÂŒ½´žH€H€HÀ ( ºq4›H€H€HÀØ(ÂŒ½´žH€H€HÀ ( ºq4›H€H€HÀØ(ÂŒ½´žH€H€HÀ œ•dPÛi6 –=a†Ý:N$@$@$`daFÞ=ÚN$@$@$`Xa†Ý:N$@$@$`daFÞ=ÚN$@$@$`Xa†Ý:N$@$@$`daFÞ=ÚN$@$@$`Xa†Ý:N$@$@$`daFÞ=ÚN$@$@$`Xa†Ý:N$@$@$`daFÞ=ÚN$@$@$`Xa†Ý:N$@$@$`daFÞ=ÚN$@$@$`Xa†Ý:N$@$@$`dÿ1˜2êdIEND®B`‚155_configure_apply_for.png000066400000000000000000001057151516513262500346000ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/15_apply-for-services‰PNG  IHDRw¥˜ÔÐÛ ¬iCCPICC ProfileH‰•–TSYÇï{éEJèM^¥„zo %”AATTGpDEAÇÈ("¢X°× 2((ã`Á†Ê<` ;»gwÏ~ïÜÜßûçÞï}÷¾wÏù@¾ÍâóSa)Òx™‚`OzdT4' …\ÚÀœÅÎà3}óýßãÃ]Íô·Œfrýûÿÿ5¤9ñl @„ã8ì4„O"­ƒÍd€â#ºæêLþ —",+@ D¸a†çøÌ ÇÍqÿì˜Ð`W„Of±‰&žÅNDò‘Õ‡ËCØaGv‹ƒp‹ÓÒVÍð„õâþ)OâßrƉs²X‰bž[ËlàݸüTVöÿ¹ÿ;ÒR…óÏÐ@9IàŒô2Èž5¤¬ò3/Î?`ž¹œÙñ³œ$ô ›gv†kôó,L cÌ3K°0—›É gÁª`q~^ª¿¯8…°Mïrÿ€‹–l¡ kNCÏü`HY T&ÐFH…VÀ8wà @(ˆ+$4 «A.Ø @Øvƒ P ‚pmà 8.k Ü€Œ€W`|Sá D…!5H2„Ì Èr‡|¡`( Š…!$„r¡ÍPTU@5P#ô t:] Ð4½…¾À(˜ ËÂ*°¼¶° ¯€át8··Ãåp-|n…ÏÃ×à;°~O¢Š„¢¡ÔQF(”+*J@ PëQ…¨2T-ªÕêEÝB‰Pã¨Ïh,šŠ¦£Ðöh/tšNG¯GoCW Эèô-ôzýCÁ(c 1v&&“ˆY)À”aê1§01w0#˜X,–†ÕÅZc½°QØdìZì6ì>l ¶ ;€ÆNâp8Eœ!΀cá2q¸½¸#¸s¸AÜîž„WÛá=ðÑx~¾ ߉Ä¿ÀO¤Ú;BCÈ&ê„›„ÂQš¨Kt †“‰‰åÄfâEâcâ;‰¤A²%‘¸¤¡®¬î¥.T¯QïSŸÒÐÕÓØ¤Ñ¢ñD“¨i£™ YªÙ­9¡¥¦å§•«Õ¤õP› m£¤½G»Wû£Ž®N„Î6Q]]¦nŽn“îc=Šž“^º^­Þm}¬¾~Šþ>ý~ØÀÒ É Òà¦!lheÈ5Üg8°³Øv1oqíâ{Fd#†Q–Q“Ñ1ÍØ×x“q›ñë%ZK¢—ì\һ仉¥IªIÉ#SSoÓM¦¦oÍ ÌØf•f·Í)ææÌÛÍßXZÄ[ì·¸oIµô³ÜbÙmùÍÊÚJ`Õl5f­ek]e}ÏFÖ&Ðf›Íe[Œ­‹íÛ3¶Ÿí¬ì2íŽÛýiodŸbØ~t©îÒø¥uK‡4X5"Gºc¬ãG‘“ºË©Ö陳¦3ǹÞùCŸ‘Ì8Âxíbâ"p9åòÑÕÎuk—ÊÍӭЭÏ]Æ=̽Âý©‡†G¢G“Ç„§¥çZÏ./Œ—×N¯{L&›ÙÈœð¶ö^çÝãCö ñ©ðyækà+ðíðƒý¼ývù=ö×öçù·€fÀ®€'ºé¿aƒƒ*ƒž›ç÷†PCbB‡|u -}¦& ë— _Þþ1Â-¢$B¹$r]äµ(¥(nT{4.:<º>zr™û²ÝËF–[./X~w…îŠ5+®¬TZ™ºòlŒd +æD,&6"öpìWV«–5ÇŒ«Š›`»²÷°_qœ9¥œ±x‡ø’ø  % £‰‰»Ç’œ’ʒƹ®Ü î›d¯äêä))‡R¦S#R[Òði±i§y2¼^Ï*ÕUkV ð ù|Qº]úîô  >ÊX‘Ñž)‹ëB=á¡,ǬʬO«ÃWŸX#½†·æz¶AöÖì99?¯E¯e¯íÎUÏݘ;´Ž±®f=´>n}÷Í ùFò<ó67¦l¼±ÉdSɦ÷›#6wä«äçåÿàùCSD àÞû-Õ?¢äþØ·Õ|ëÞ­ß 9…W‹LŠÊоnco»ú“éOå?MoOØÞWlU¼voÇÝN;J¤KrJ†wùíj-¥—–¾ß³ûJ™EYõâáQ¹oyû^­½;ö~­Hª¸SéRÙR¥\µµêã>ξÁýÎû›«Uª‹ª¿à¸_ãYÓZ«S[v{0ëàóºðºÞŸm~n¬Wª/ªÿvˆwHÔÜÐÓhÝØxXùpqÜ$l;²üHÿQ·£íÍFÍ5-´–¢cà˜ðØË_b¹{Üçx÷ ›Í'µOV¢ž*l…Z³['Ú’ÚDíQí§½OwwØwœúÕø×CgÔÏTž•;[ÜIìÌïœ>—sn²‹ß5~>ñüpwL÷£ ‘n÷õô]ô¹xù’Ç¥ ½ŒÞs—.Ÿ¹bwåôU›«m׬®µ^·¼~ê†åS}V}­7­o¶÷Ûöw ,èt<ËíÖ¥ÛÌÛ×îøß¸v÷þ½å÷D÷9÷G¤>xó0ëáÔ£¼Ç˜Ç…O¤ž”=U~Zû›þo-"+ÑÙ!·¡ëÏBž=f¿ú=ã÷¯#ùÏ)ÏË^¨½h5=3æ1ÖÿrÙË‘WüWSãHÿQõZïõÉ?ÿ¼>91òFðfúí¶wŠï½·xß=8ùôCÚ‡©…Ÿ?5|¶ùÜû%âË‹©Õ_q_Ë¿éëøîóýñtÚô4Ÿ%`ÍZÒà„Þ€ñÍD‰9<М§Ÿ%ðŸxÎCÏâA꺘±u¡y@zÝ®9O=cBln.nÿˆŒs³¹\dÄeb>MO¿S×À7ÁôôÔ¾ééouH±èJŸóå3ák„Øk»¨@ÿWêÀ¿Æ_ ø?hÚÝPiTXtXML:com.adobe.xmp 631 421  ÆG@IDATxì½\Ô×ïý1a8&¤l:¦HiÆÛ [eÝ+ÛâVY{aŸÅ­5$²¸k«¾ ¹«6U÷AöªÈ}‰¹êÊ®ð¨JЗÏ9YôsäI€H€H€‚ƒ=wÁ±Žœ h(îøA    "@qD‹É© Å?$@$@$@$D(î‚h19    ¸ãg€H€H€H€‚ˆÅ]-&§B$@$@$@wü @ ¸ ¢ÅäTH€H€H€H`ÒÄÓÑîîn8œ„L$0YtÍÁ“ºÇ'Ë<í’ ÌBüú±ñÏÉK‡sQrÃîkš^PŽM&½ïþQ/,o½Œ|×>œßazTSSÚþ¯Ö§`k”òþ~Ô6µ`å:&hÑøÅ¶q» ‹.O”Í Ú8ÌüÕú/c«¡Y%õxÛÛ.ö|” kÓÏñ…tâLv*²Ð‰9?÷Ö©÷ßýôÓ(ZsÔ|(gý°'nÙp´ñ—¸R$8Y ˜ýþèù(|Þ0ßýéßdŸœørNÊïöwÞwøòÇrá§4ÆRýÁuºN‹°s`û‘r¬ŒlV+݃Ž£†1c œÆq´˜U#WŽÒ>œúáô}* YñÏ uI<¾kéÀwÞŸˆ1ö¢æv"îôL„±i³¡Q#}25†@Mk'ðø£ñÙt¿ ë­F$ýhàÑÍüÒ-/|ZûþÍwÚðZÝm|輇{™¼_]‰ôêwðÉÌŸGH$@$ 2EálšIûC]ô‰ÀS®bÕ ÈZ¯n~¯ªÿúÁØÞHÿ„>4p—Cuî’ÿ$…ë—àï]s¢¡¢e€«óŠðjŠ(@I­ÕPf_e¶J”ݸ/ÿX}„°—аÃSGvn¬Ä†ïÁÐP XÓ¢EZÛNË%(UëØp¨kôpÚP¸ó %_gLGÑ¡Mˆ ךLãË}ÔZÚñ¶ü êËÈ‹z ÆH௾š‚¬Ç{`ûÌó€³—~„SQKPõ[Q0¨Ñö÷¢¸º¯=¹}õ\ÿé;XyÝ-X^]ŒS‚bk‰ËŸ{‹ðyW <.¼¼™‘îe¶ÚÚ°èï[ðÙ_Fê½.@Ã×c5væ%f|’Ø#žÀ›xûÙçÐðFaì®kï¶#ïL#ÊÕäbÑ…Æö>á8;û¡“ÏKÙ¥:ljQ€3/™s?Äš²FüÐ5¥¯‹Ÿ~Å)‹±ñŸ~ïß–uö¤[ò?}µõ}4¾´y/.ÄÑŸµy‹øN$@$0ƒ Üûäßä—?Ç%óB¤^vjØ÷å¯õûRg<Éý/ÜxZ< ntRŒR§d×F¨¨‡¿Îl­>(®yGNâH^*.ç¢Îóï“ËÞ KÕ ”õ¦b÷Þ?Ço¨=qÉ×¾õÒiX±XB½wa±õj#q¶Vc[~ l ™(8v ‡öîF‚ò:[q0÷ ¬©y8yòRí‘[X÷€ÑOM±&ZbŸÇƒàïïCåÕ3D`~\îßëBMX‚&ì">´ãõé¹ÏCÞ×ÌxñÝDÎ<†ÔøXÏ`£±u‘¨ÁÞ^¼%9†¹bG~Tú«õJØ=†Ú[ïá”­Ƹ…¸š4M²2Búú¶ªôù(˜¥~ÄSó%Ì)Iì.—ûŽ®xÅTÝIMáx#㋸ú‡fù‘÷”§áןáñpÂÝ¢õ¥ß{Nv·ïà¦NÔt}(5å½ÕíÁìw¶å4)áúõç5ñ\{ëŠo¨q(Ë^â±,ÂÂ*ÂÎjû×ñ‘ä‡!Óô¼»\<Ч½ûƒivj>…¿$ì܃Úã¿Ýüwä$~Ú›Åw  NàÉæëjnÁ©Tœ$…Q;•:?r‰×®–n·æÑ2Çð2áâzŠÊaµQ‡ÆªBl\—/ƒR#qàZ•0¥a‘ˆ/}œIóªXîzåŸ <6åÙHN2áKk7ˆð"®ÙTÛNœ«l‡iKÄÉ%i`ÿÞíÚKroD´3ÅÅ!!)¦èp8n_ƒô†ô”EÐé 0-ÿ—å¶O,*+Ó“æ¡fË—ñIæsHmÒØzÇí5Rƒï\Î_×ãk5?Gßg Ÿ¦_}»³Ö^ñ\Í ‡í¨ê’ë§žÁQÕ&)f±s½ÅªîüR4R Rðq/®¿ßkwŸ„…”ìÑ*»£ÄO8ÖˆSuãâ§^ÿJ‚Ç€’m÷ñ³ëâýû-ñÆ'"'*v[':> ós‰rà#}ÝšÐ×hZ.z±FTøBŸÏ&⣗bŽäíËw°õS–‰ÆÙmÑØç¾PýžÌÝó·Ëã‘ãùÃGãâ±t¶£Oæ…N+¿FÙéNvœº#!ÚÅócŠAL¬Øù° æY3O¥)}û Ï…g#<î!=Û%Œüçæçd¯Æ|ó…XüÝ¿ÝRƒ·$@$@3‘€ÚcçõÖyÇ7_ž„ð‡²ÏÒ=~‡Âäˆ;ÏÈâ’²qhC=vUÞF§„êßšÔ½rÊU\D’ÔH‘HÛ`ÄåÊrÐ ˜óèÀ­…°7ÂÅë§ tØ]~Ƀ ü+Mǵy?Â~-ÿ'Zx®kþ©_{wÈ8ß½ƒÆ¯<sb<Œa&´u ˆB¿ªjuEŒÌ©¸å—ë¾¼þ¡™qâÝ“ÛËÏa…­žûƦiT/~#5ʵOÜI8täÔ•xñóñ(KY("u!NǾ‡MÞ÷<^>¯öõÞKù³Ã’·ž”ÿ´ Å‹bÍ ÈÂs¸‡tXëIͨ—ìÿ³Ô¨yè~-)üScWþH\û‡çydþã¿âc‹ß¿¯I€H€f%쾿ú¬‡¤.ù#^=âj®l×R{ðTR‡,Æ“Fûs;êbQêz‘gVܰÊi’õ¡qEºÔ´àðñ«è”í4‹’Ô/^£ë(,¬€MK'š›U¿ÓŸûŸëmˇš—nMJ2Ž~Þ€¯Ä?‡Ó¿¯hÕÄ£$›þ®… k,⥖:q] 9Fák¤Ý³¼º"GMnïeÕ¯ µü½²MpüJù³Ô}Î^³Ëûô'›Û«xL_Yþ®®Ž‡áÝ4þF²ð$H3/^§ßôáívûCY}1VöÓ‰n³Ê^ºNÈóôj“ÛH<“/É æøåê–ÿQ~øþÀ!‘—4÷·o·<˜é«k–ãÔóá(«ú‘G4NîTÆb]=¸øåäl²81ˆï–<àò{?oǯä¯>&  ÙE JöR/èË/†œŠU‡ r÷7ps›Í䈻ÙÅô£^q÷Àá±Â¤x­Ûž‡±÷Ì){gR{¢q  ˜–ˆAÑ Ì}¨’&wšgÎ8  …ÅÝ(pXDꋯÉwÙ2‘ Àl!0á§egËÄ9N   FwÁ¸ªœ @È ¸ Ù¥çÄI€H€H€‚‘Å]0®*çD$@$@$²(îBvé9q   `$@qŒ«Ê9‘ „,Š»]zNœH€H€H  ÌùDÒH«¯¯GrròHÅÌ'   ˜aè¹›a Âá À£ ¸{zlK$@$@$@3ŒÅÝ [‡H€H€H€…ÅÝ£Ðc[   ˜a(îfØ‚p8$@$@$@$ð((î…Û’ À #@q7ÄÃ!   G!@q÷(ôØ–H€H€H€fŠ»¶  < Š»G¡Ç¶$@$@$@$0ÃPÜͰápH€H€H€HàQPÜ= =¶%   F€ân†-‡C$@$@$@B€âîQè±- Ì0w3lA8   xaÒxâÛ:`³uÂátáá×é`РׇO|W,ÚêÞÂás„Çe àÛiШ3±Y6¼•–n 㵤-šü'vü´F$@$@$0ÓL¬¸sZ°ó•|XÇ4ËX”¿ “¦gºQwúŠ/6niÜ€ò¢µÐ;›‘ÿÊX†ÔÒé HX‘‰-[2÷:Ðnµ ½½èíÒÃ$Ý:ì°X¬aë¤>h–H€H€H ¤L¬¸tâtcНœTu4ãÀÆ=ð—uF³—Öf+ì.©c³{lº N®aÉ%u-µeȽ«Çù‚•ÃÊÇš¡Ã#(ñvâ_O‡©îÑ¿w^“ !‰wá&¼yþ¼&*¾µUÊ5eÈÄ÷J³éWª.ëŽú »Øtùî&øG'n7;!:HK^ùµºà{xÕ‰ÎæK8°§Dó~ÁrçJ˜¼•®ÚÜŰ]ÂÆ]a§3b™9V+h¯=ü ­žJâ•<¼}ÂN£Éƒö]ï¬}U=œÎu ;y;…ÝP<¼'  x I÷Ü:¯@“J†hqí#Õ_¨”F6\¼Üèg±™+І—Nûê™6BÁZ”t:à  %D|ì»à¼Vˆ]%šU«ÝÄép©¤ÄÓ‹xË žBË[ßBþåvX/Ö±vô"‹oxe£IxH¶Û1Ìkgé[*¾ƒ‹J÷éRQ´ïá÷DÀL   0½ânb¯”9âMû‹¨ò+5®ÎC_ØÔ¯H.]òˆOާ-^a§²DØ âšqDBÄqRì4ªP¬[Ü©êÊV§×–œÛ½z±Í:jEØiÉÞ«cŒv_%,ËÛîvªŽ>r¸˜lÂP[쬚£Î(áÖC0ú¾ª¢^;}ëH2K‡V­¥U ׄQ{Äêœ °”Uj§~«òóaúÞ›H# ­¾ €˜ºpG&cË2qsiÉŽÂoîD]ëà'Ù9lTW7 {~žËÏëÈôà<=â|›ñnàèé†bÙs7Š”¨ç»ÒÃí³Õ׬ò8tž‡„c•=½Á×!OEC§ÓgÁ!Xšô¦tä-ód·ãà®ÓŸé7´ïI€H€H€HÀŸÀ´zîÔ@’_;„ewÁ}öÀŠâ]ßD±!F9``“o‹Ð·ºt¬ÌH °7Î*£_¯Ü’‡’mîCÖ‹±î’ô!›ê¬â‚[-ByÕÿQ(£›BÊk»Q¶ñ æ¼Q²ëN»`îjãÕ‰7ï LqiØz…µjVÜö bF™”úFŠt”ŸÙ4èP…«×…È”×°åò+(±HûEìzËŒÒW<æãc1 @è˜:ÏÝH‡aÃáÛgÊ‘—)aLo²Ë©S¯°“ˆ ­Ã½|Þ6|'   ¡æ|"ih¦÷¾¾¾ÉÉÉÞÛ)xwÈIT»o›nž9Y:ÆucŸú† µ7N|Ußñ(öbUòK³¡sï·>ù† éRº‚Ë¥¾ãQzn9$@$@$@$à%0íaYï@ÜïzDÇ~ð`pý‡»S_9æN.²ÂÇ$å+Ç<]†?z—7i¶"   S– œœ$ L/Š»éåÏÞI€H€H€H`B PÜM(N#   é%@q7½üÙ; L( ?PÑ­Ž…2‘ L(HïéÌXpq7ÖŽ0.“ <†e› ÀL%@q7SW†ã"   ‡ @q÷ÐØ„H€H€H€f*Š»™º2 <Š»‡€Æ&$@$@$@$0S PÜÍÔ•á¸H€H€H€Hà!PÜ=46!   ™J€ân¦® ÇE$@$@$@A€âî! ± ÌTþ wz>ÆÝœç;sðÂ3óñ85e@@Ì$   G$0áâî ßÿ1ôacÕg" ­ûã~ÔÜù¯ÿÖsøîò畺±Kýö^'êçâ©ðǵ*¿qÝÃ_Þ°â¿ýö¢Y'ïÜèüï÷¹ðåXæëÜs 4÷ÉÈ;ÒðK¤ŸÅ ‘ó&Ã-âøžˆÛ³·;ñGÿx õ•lLŒ™3ãH€H€H€f)Ùüvfõ ¨[›„¢ÿü9üí¿ÝÅÁŸü{@oüô~WB–þÂNU|6B‡på¶’”—pë›sú>Sþ/P"J‰"•.þûûX+ÂèZ»ð™z|éÜMüøWú,ü›Éß½ÐCéÿÁ×kn¡çE_ǸøçŽ_k­”¸ó »6ñH:U¬v„ô¸xî6$| iâµÛ/¡hoR¡íÏWþ þæš6_o¾w¾eMXôÿ]×~þ^æ>Rzó6)w_Š~+>ý´ªý“/|×Å‹Hàý¢ÛßþÔSc¦öù7üëû=¸š™„¿ûÚœáø?Þq “߈(©µÙqÊÒŽÿWÖ­û_Ã%bióÕ&_]2Ȥ„ÝŸŠ}&U'c¿õÅ…šyå¬û£Ï-ÐÄèXúSÞǧ崰 MÿS[·xê>†òÞy“ÿF±¨—>ÏŸàvˆâŽxû~/nà4sÒ7Ã_Jþ‹Âð÷%ü}ßÿ÷çc Â×ÿE„1 Àì 0¥âN¢-ûj¢L‚ìóO¿%¡S-”½yêTéhéiñð©çåÝñáxÍö^tºÑšieQ"”úEeU}í?Ay»&:ù ;eûžd|ua$VÉÏxÓå_~€ÕâaS)*" ÄkW/!Ù%µ±Íñ1þsÌÓê*Ñ{û×½wíiuT¾JÙ²×oïßÓN,g‹À {ÀZhøB$@$@$0#LyXv´Yï/žzìÉÖÚw}‡ Ôžµjëû¾ ÿÞöJú©}e+{”Q'jUhñÿ2Fy«Œøž$Þ©9±zø§ÿ.ûÍîkõ”'p"ÒPa÷„вãvÿ!!ÕüúVüBª‡<ÏüºxüÞ1{FNÑ*.*©Ç¬x“MÄœ:q¬Ò9á’(s $^ÿPö^ùe7ÚNí±+ïv`™„®•øVI•«ù19t±‰!Y _H€H€H`¶˜pÏݳâQ{ÿ!…’òÕÊáˆM²O-RN±.–P© ½~!Rµ/nh*NY,'=-r2ô_4‘¦Ô>yÞƒ’òDýíï›´ðflÙ?kÞ0Õ×ÅŒ/>¨éËwË!köU']ÿ§x!Ç+ì>''XUŠ]²nh”jŸJjÿÝ÷Ó^ñیץ%$·.‰Å^ÙèÒ+W›QeïšxšìˆÅî´$\¼X5PÝÑŒã¹{P+ž«±¦ØôµPòÅáò(&·º±ylò -¤*¾1Ä-jm•æ M艓Mì%ˆÃLK“»Wü+r°Ý®‰©o›lzÍÜ(ÎÅ:I¯üòÞêO2½ÓpõŠRó h{ë{ßí7бqÀ¨;[¿ÛE¼hEUá(²©[aGZ‚·ßI€H€H€f9 wЇ¿À‹°Ó:tˆKK\#ì"Ž› sÜ<œóÜ|á¸&ì–m9‚o§Eã·6¢RÄ—òÚ˜\J#ùªË#Fîªv²nÈ0¯ dÏ-êD{ešTÓÄãÐ6ÞþÛ´z²—å÷S⼕´wn5çРrn¤I»Ç¤3çá̾”AmÔMÒ¦"œ_oÃÕs§qâ¢ìk,9.^C Ù2<;Œ3H€H€H`6˜Ð°¬?%ðþæoþæ;o›^—¨" »¦Ü9¦µÉâ—r z4ŠWçôÚ¬¨¯>ív¸‹æÛZ#¯ÿÌkóaÞÛ/¢¢Þ‚úŠb\ÖtÕ $D¶”°r­VÐ~ñ8ª-Íh¸p•Ô¥Bñð¦À6õH[¿L«r£ø0.ÔYdÏ`=*Þª@«OÙy- ¼»\îY6^•ðuëðy'¤­×´®«±‡/Ô‰M .U¼…«Ê¨³§W@ά !Yö jfÃGÕÆ=óŠH€H€H`6˜Ïwâ#Žõ–»ßuîࢦ4±¶  6Èž:QGrVñTÎ9•‹p‰½X ËŰÈIÖÕËbqùF;*\DZùŠ!AJ7ÍãàÒé<÷†/›ÛêWÃ<\,Ì×B–2 äÛ¢…iÞ¬xìi­âVâä^;ö¬”C {´,÷‰×Wµqû4Ú6‘òmôÇ’ZTç{bDò&9P¨?É5¦­'`½\†üËwQþý!óŽNÁÉ‚^q4W`ãž*‰›٠ÒÇxìºÇ¤B¸zýÀHÆn3pûÑe|ªŽJ^V^{NÉWNÉ‰àæµÉw   ™A`R=w“3ÅðAj¨pyè>=1ß»"UŸÝÁcòaÌ6Ghï34üb,ã©Nøˆáá#b ÀL 0 =w“„Íé凌Íhrj7Îï€Ä#õ66i@lL$@$@$ìf¡çn’–$\¸Eü̷ɰ9IÓ§Y   à 0i§eƒgA$@$@$@³‹ÅÝìZ/Ž–H€H€H€F%@q7*’ Àì"@q7»Ö‹£%   Q Lø õl<&    ‰%0ÖgO¸¸kÇ;]Z#   P–åç€H€H€H€‚ˆÅ]-&§B$@$@$@wü @ ¸ ¢ÅäTH€H€H€H€âŽŸ   "wA´˜œ PÜñ3@$@$@$@AD€â.ˆ“S!   Š;~H€H€H€H ˆPÜÑbr*$@$@$@$@qÇÏ Š» ZLN…H€H€H€(îø    "@qD‹É© @ ÀL'ðÉ'Ÿ@ýŒ–æÌ™õê‰â.Ô?œ? ÌpN§wîÜÁÇ<êHç΋çž{ááá£Ö öBŠ»`_aÎH€H€f1{÷îáÖ­[¨¯¯“¸KNNÆ‹/¾ˆÇ|ÏúцNq÷hüØšH€H€H` ¨PlGGÞÿ}|éK_BX˜[ºxÅ›*õ÷÷ã'?ù‰V÷‹_üâ$Žh曞:q×ß‚âX˜µëçÏ|2~#l9_Œ›Kv +qêpùuÏË"àttÃá„RÐéõíÀB-<§J$0*û÷ïC§ÓaùòåÚïGuo±X´6&“ =öTèöwÞ* õ4…j¥}3…v[ ö—Z‘³+Œ£Œ©§é‹L)H1Ek}ôª\çk‘˜§¿õ2N7tÃÙÙ€Ê ¾¶è´àøÎ;þv^hv·sÚP‘ïÍ߉:›·7?³¼$ 1P9Q^»ÆÆFØl6íG]«<>e¢¦an§òJùÈ Èz=‰â~³¶\Á­›lÞ·Jz̵¨¸Õ"^:³Û'y«¶îCŠh1`‰ˆ»h”r˜í¸)»Ä¬ÍX®¼|ˆÁº¥·Pv³-ýfÍ–»ŸÍZ?ªuÿ’(¨Fæ¥fÄ+j(’ì]mè3¬ÂR­w^bjŒÆDÄØãÑ$¶™H`¢ Ø­6‰´¦#)ò–e¿‰J¶úZXå==Ù(¯Só…B\¶*¯áèlV`»­ÓV܃UX-^Àµq6ìÙUŒ£&ñ¦DÃå²£ÝR…b‹ÛwïE̽k¸þßË`q¤À$¢ÔÙZ‹‹_Þ› —õ.¬î¿ŸTò·å‹@5!ïP¹:=G'ª÷ä¢Ê¾GN®…íÂçGÂùoÃ-Y¹$@$0µŸNí¯Sï*D«’w÷}¤¶¡”?âN0‡aa§’òä!, "»üR˜Ûƒ¦åDˆÛu h¾ŠVÉé™i£&á?‘…KŒ"Þ$Ή6ew eÁ›¯½k‘µ*eWêpê:–d`Ǻ¥šMC|¢jD%Âså¾ç+ L,²Ïî›çÔ¯°‹…ÛpÍn‡ü-)ë•â!¹´­{"²îº–”ì«uûj•\›²H/›“ã°L4_­å. âÎŒ((ß§‰9õG‘ µ8WoC„ë++¥év$I·içMŽÛµÚ~À GöŠ]uD<•ªÐaA•Ušä¤À „©É \nÄ]qÞEõ/œÑˆù¢Ý4 ç9­ŒuµtÈ«_å‘úñ«bLÉÆþ ½VŸEÕÍjÔˆW/ÃèWAf" ' GÒ ª.=8\i\–‰L“‘‹L0Åîæ3­ß‹Ô†](ÉÏE‰qw;„ä¸p þdäçnóÍÄèZ¢eßßÀý"d¦êp°²Ž•fœkoaÁ€PôÐ<б2&%ìü’è9­·²||³Ì›oô^ðH€ÆM@yçÔ»÷Þ{O Å*ê‘(Ê›§öÝ1¹ Ìpõ¢É6m¤arÖ¶úlbÖ¥ÈùŠ+¸ÙÄ'ÆË9Œ0ÄG·ÎWay^–œlm’ýu"îbR´0¬Tž4±×®¶ˆÊíïÀu Ó&.M› Åë׿ö$ú ÄáV˜CBÀg\—qÁ’ì¼q½ÒSÒÊ4¤ÈŠ1%ý"ìxó<6Ùp4÷ _Â÷ßÌÐB¯r4CN¹îì,t»ü|]˜Ò׋k&'~—áÛÆ§µi‡Dj‘ ¹ì<ÍE+ª¿ÁR÷–c‡r÷1‘ ÀP‘>‡Ã1HÜiÑ¿ °,&¦ð@EØðä¥Ü »ÕæŸÚjåYyûqüìuÌOÌ@–öL’ùX·UöÅÉŽ¸Ò7öãÀñ³°ÎOÄæœU-Ù=hïD˜Ä(+³MR¯×kÎj¶‹*®#"~Ö(ÅÈDS@ .mƒ„?*ñ²]h°ÉsîœptÛÐP}‡«=Ô8†¯Ñ†f³ÔÁbë†>.ÉʸœÌ­ãŠty­Ea…†ðôÓ,õFJá‹V UçÂVÄf®u‡[‡TÖ/^¡ð(9ü,8:[aiî”P³é±ÒÛÁB4ÈA §Ó[s³vòwˆ Þ’ À˜¨°ìÓO?-;#žþyíG]«<¨@8Dö LøUX<òöï÷™ˆ_‡ýû|·ˆÏ܉RñÊ ¹ïi¸.ïuÄ÷÷ˆ‹À|ñØù’!9¯ïG_ŸòÓ‰ˆô+ÚÖ&"9ûT}±ê©«ÆÖ/íU?Ôu>´¼˜žƒ–É>·¼••s!;Û|)}÷Z¹vháM_æ.ÍUȯ,öÔŒÅö#inO]ÂZ˳#·ø 6V¹‹c3 ðf¶'Ìë·—Î]ôõ²ó®Ò†ìô„Á={ë†' àÈv|g× 9XqY«cH—ç÷%DcmÑ1ØåPÅÁÜž¶±2×7IGÞ`–¼#õï¼Ú[ã{ô‰u*Ï­Æd&è+Í‘gÆ|2Ò,Õ÷¸©ïh›öÔׄýoœE¦83…×´/0yÔóíÄ¡¦¾¢BЄ%ºµÊƒÇ©=rErˆ·OÐŽ”9ä9{:ùŒ1Fz÷øN…JÙtJ¾ô&c™Àι$@AF@…\/]º„††íëÇÔŠ@É%¿ïÔ×%%%!---¤Xø¹¿¡š!yF ³nF…Ý Yc²¨çÛÔb:´œËEþEµ«mpÒ­.Àõ­¢Úô#*7)›¡XHÊPdR”uƒ×‰w$@c#  eìƒbM    ‡#@q÷pÜØŠH€H€H€f$Š»¹, <Š»‡ãÆV$@$@$@$0# PÜÍÈeá H€H€H€Hàáð´ìÃqc+D »{äïgT‘7$@$@3†@d¤ç«g̈&f wÑVBœ@°þ‚ñeåôI€H`V`XvV.M$@$@$@ PÜæÂ\   ˜•(îfå²qÐ$@$@$@$˜Å]`.Ì%   YI€ânV.M$@$@$@ PÜæÂ\   ˜•(îfå²qÐ$@$@$@$˜Å]`.Ì%   YI€ânV.M$@$@$@ PÜæÂ\   ˜•(îfå²qÐ$@$@$@$˜Å]`.Ì%   YI€ânV.M$@$@$@ PÜæÂ\   ˜•(îfå²qÐ$@$@$@$˜ÀÔ‰»þœÚ¿J¯ ßo,}-ç±ÿÀyôùåMþeŠß¨4ŽÉï“=ÀØ 8Ýèîî†Ãá€sìÍ\³Ó‚ Õ– ´Ù‰K—`›ÐA>x¬A$@$02°‘‹&º¤=b²¿­goš‘½4j µ7; WvT—¡Ïh€½ÏŽêó¥°ö-E^¶yú¢Ið#à´à[¯ä£Ý/ËÿÒ°º¥¯šG+NçïÁE«Ë¿ÆÌC(Z俲_‰¦Õ[°ûÕ•ÐûòF¿pÜ­Ce–aBøèUÇV긋ÓU%Ø·6 qbplݲ ÀȦPÜÞÎZª+д$‰CÖó"¾nÙÝ~‹L)H1Ek£éUyÒFÙJÎX£Ü[­v­lð‹–KDZyÝ:¬Ó~òÑìðÔA¦„áËZþfœ®·ùš:m 8ð²»ÍË;O ·vZ.a§§LÙ¼à3èkKE>Öm>.b”‰H€H`ºxiSÒ¿¦ã¢–"+³EUWp¶I®#Ô< /"ë²âå¶}aKq¥m]"ø¢”7NÕ1 ëu·ÇÏ*ÂïÖM6ïÛ,bQJ̵¨¸Õ"¡_3Ún6JN ÌâÅ ‹Qºh±Š¸[.¡`C"²¤ÄÄ($ÆX¥ Ì v«H"]:’"0¨3I¶úZXå==Ù(¯ƒSkõAä—Y`JÏCAÚ"t¶v Ån¥­« ù…äìÝ {åAT­Æú3¯BïlÅÁ܃°­ÎÃɵѸ°gr ãü¾8[«±-¿ :S& ¶¬„®Ó—Á=Õ³NlÛ®@~•9GÊ1F?âàAóŽH€H`BL©¸S#îïëÇ|s–×Àõ³¸™!á&ï(zZp¶ô,šì"äTÜT’·È}c„Ñãh눰(ˆ\óKaZý0 ÀJ`gO÷•¼:i“˜èÎŽ7ÇûÊyAÓKÀK£ì³ÓØÈ#™'E ·ášÝ.þoU¦¬7 mäÀ5YˆÍÁÞM)ÚÞ:åTÉí¼3`÷÷J‘,"ÒžŽªük°:^…ÑzMÛÏ·!et" MË ¸\{[Ú¤ÀZ{IZQPeÈcÏ}2c¬u(9шÔÝDZhèxT&  ©"0H;MM§Ê59h,®Fuu›Ü𵮫d/^O"¶îÏšEûË$ßoˆJÐúo.?'IDAT!õ÷«={ñع?[Û¯7†&¬BÓL@¤T]òÆNGŽqY&2MD.2Á7²›ÏœàЄH]*LÞf/ Ö›ÇW™Ÿ‹Jo÷FùãK’N'aÃÊ€¹yrL¤¤¸JÊWcC2}v^t|' é"0¥{îMÒ°ÙË=AQM¿õ£Km‹“0mOšj®¸Oת}xcNnñg4/‘-¨}w=*ÄkoCK›òs0‘ÀÌ%`ˆ3JÈô2.XFxjÏieRRRFvj–öÛVõ6<¹DàJZ¾»ËÏãüyÏOÑZÍ™¨Ù5oáЦ½ˆÅöÝ9ÐÙ/cÛá«ø˜•¡=ñžH€H`,¦Pܹƒ¥ažp«ÜÂ5Y0Ï— M“…aùš¥@Ï-”á¼5êàkSU)š”#N%?'žv3ìÞ{ˆÏÀæ5K´³EàâRTÝìpÛà+ ÌPqi`’±U‰çìBƒ §ŽnªãpuóÀ¨Gg¾z$§K Ž_µhÏÊkµXÐéôUx¡_¼B¯.VÀæpÂéèDs³MkÆéÒÆ‚Ãǯ¢Sž½×ÙjA³Ï`/¢“3Pºw5\7N`çiK@ûÌ$ ˜s>‘4RWõõõHNN©xrò%¤ÚÓ†ùžƒ}"ì"´ë‡éNNØöôKûヌ1Â6$0Á¨Ø¼µ©‡Pš­í`°ï°à­ü¸<ä9wé²—m“Ùòœ;SA96 Ûg7`Â}åÀÕãßÁ‰ÚvOA, Êß„Ñvóò3›4œ£¹÷ÔãÐ÷ß„<][òs‹µƒZCC&ÊK³µº­Wc׉Z=9ȡƱ؊ͯÅkå¥PC²]:ŒÜ’X–w ßNaˆÖ‹$@$0…fž¸›Âɳ+˜©ÔóíÄq„‡#R=7åa“xÙòx½n¡è /H€H€¦„Àî¹›’ù°   iw!½üœ< @° ¸ ¶å|H€H€H€BšÅ]H/?'O$@$@$l(î‚mE9   &@qÒËÏÉ“ > %ØV”ó™÷ï߇K¾9âã?ƽ{÷¦e ì”H€H`ìÂå9ž#?öiìvfbMŠ»™¸*Ó¬#ðØcaîܹÚϬ<L$@$T– ªåädH€H€H€BÅ]¨8    "@qTËÉÉ „:Š»Pÿpþ$@$@$@AE€â.¨–““!  uw¡þ àüI€H€H€‚ŠÅ]P-''C$@$@$ê(îBýÀù“ Š» ZNN†H€H€H Ô PÜ…ú'€ó'  *wAµœœ @¨ ¸ õOçO$@$@$T(î‚j99   P'@qêŸÎŸH€H€H ¨PÜÕrr2$@$@$@¡N èÄ]WÓ\iìa]»p¥ê :úG(1»MWªQ×d± H€H€H€H`&›²Aô·àÔ tøw6ñæUX—aF„–߇óûß@_ÖNd'Î÷¯9æë®Æ:Ôõ/Ä*sÔð6}]¸.å ׬B̸fÞ[×oâV|ù@ù™MÐÅë À(Æ%qF±3†¢~ôH­ø5ÙÈÔÓcG›­š›Ux£­ ¯o]%/˳2Ñ¿ðá„6ˆ°Œ8))óÈÈ1 Ø¯Š´RmG4ìW•—$0"º¥ÌÕX‚’z3v$GÔt \òŠH€H€…À”Ê 0,„Á!?QX¸0FC)N]©Ãk*2Œþ¬«EÿªDç‹/¯§gKÏ¢É.Í~ñ’ßu§NU{«aˆOÉBöªxƒšP$üz¶H¨"'Ãb°&'˺}ƒƒ`õw ª´ }’mÀšÍ[}õú;n¢´ÔÝÇü…F„I•)…5h ¼ ^o]ma!V–ÁÈU×iÁñPÛ®Ÿéy{±)eQ° à·ËpPÖ›5¸#Þ‘ÀÃGÆÞݨúf! åïŠL·!—'Fë{’{ûv»è½ä‡íˆíH€H€BŒÀ”†e•’ìé°¢««-¨©(ÂÙ[=²n–†“ïhºŽ¦6;櫃1R. «_üuv¹T§W{zd?]üÃ(I€Z a×KžI×"µúå`ÅUn”®»Ü÷*Âq‰hº–ª 4¶õˆé>´µ´¸mTg²ïüutÙÛd/^n‰œz%ì-/‚‘@d2 rLî™Ís¿éÉâ?¶ãèé:- Ûi©Æi `Z¿rˆ?/pN$@$@A` õJ”Ìzå,Ž_ñ =Ì€¥™›‘a^蛋è(-õ´\ÇÙ›5ž»ùX•ã~\Jª9g«Q$;ƒ<{n>ZPuü<÷­s7ëG]E1ÜÝÈ)Ø­Y®ÈÈÛŒ¾ã¥rb¶UZ/ó‘õúNbdOßÒ&­ïãM"êÊé݈&t òz†Å73ö9Ô"¯ž6qyȼôMTi›ñ$So‘‚ìÊ/ÆÆËÅZ-ãê<ìN“Ð- ŒÀœO$T¯¾¾ÉÉÓo “FD¸÷ÎùƪöêÉ~:åÁƒxÝúdví« ÏÕ“Sµóç?ÐãÖ/¶Th8b°Í®˜À|õX&˜RN8¢Õé¡÷>?eJûgg$@$@³•Àzî‘xË"yÌDìù$—yÃÌ‹§P„ÝXR˜Ø BìŽÑÄXºapè©êÆÁ‹UI€H€¼¦tÏ·S¾“ LŠ»ÉáJ«$@$@$@$0-(î¦;;%   É!@q79\i•H€H€H€¦…ÅÝ´`g§$@$@$@$09(î&‡+­’ À´ ¸›ìì4˜ Ü¿£<>2˜§Î¹‘ ÀŒ&Ð/ÏÍýÍo~§Ó9£Çù¨ƒ øx·G5Êö$ªÔ/Ž>ú÷îÝ£À ÕçM$0# Ì™3?þ8žxâ ¨¯* æܳ æ•ãÜf$õ ãÉ'Ÿœ‘cã H€H€BƒÃ²¡±Îœ% @ˆ ¸ ‘…æ4I€H€H€BƒÅ]h¬3gI$@$@$"(îBd¡9M   Ð @qëÌY’ „Š»YhN“H€H€H 4PÜ…Æ:s–$@$@$@!B€â.DšÓ$   w¡±Îœ% @ˆ ¸ ‘…æ4I€H€H€BƒÅ]h¬3gI$@$@$"(îBd¡9M   Ð @qëÌY’ „Š»YhN“H€H€H 4PÜ…Æ:s–$@$@$@!B xÄ]WªkšÐ" Çi’Àl ÐÝlA§s6ŒôáÆØÙÚ ÇÃ5e+ ˜4a“fyDÃý¨+}WÚ¢½o+â'h}]¸yH]“ˆù#ö=¤ ¿§T cPv²^‰ƒ2yC$0NŽæ |sO=¶þpêµÐÚ€‚òR˜ô##»µ:»Ê,¾:ƒ [öîÆÊE`Üguð…½¶ÛÊ6à|ÁÊÁ¼# i$0AÒj3èiD]›ò¯u îfâ—ÇŒ£ñ(UÃÜSß„úÑ#&ã×d##Þ€¾~5®DQØšEOÀ‰K;_Á¥Ô#(ÊXôðf¦¬å#Œ×ÙŠü=UX]PŽUF'¾°ª:Ý<8š+±«ø¶:†ez]:,˜ íå²wºT9¹áwo£¢°'vEÂù}ˆ/3[5ÖåÞÀ‘óm¥6`Ùº\¨3a_Jôx{a} ˜ãÓB0kmú ˆ‰°ÃZ{=Ë3}ž6kM)jú– ¾§u-"»Âb°&'ËŠÚ/[iQ-–¬1¢®ªNe1KÖ gÝr‘c~ÉÞˆââjÄgïÁæ.éiªBñùäìËÆB¿ªêR“sQF¢†¢èBMY®[íZ ÕW¶ô¥y=cI\ƒºê›À’,¼¾.qˆeÞ’À`Í¢Ä*ye»°®Ì$«ñX9a¹T‚£%µpÒL8$ù ºfØv©Û“qî` ”ßË”ž‡Ý›R0šj­>€2{*VØÏ¡¤VZéLÈ+Ú”8w«NK5ä—iöTÙöCž-wÛXf«DÙ `ó7âP:t¼hÆ[ùù¸luɈ€ ‡Ê±6aøˆlµ'`5l@æ’Ó#N©ÕwÚ ò.÷ÆhD†î\Éê´àxáQÔzþ3n8„¢µ xÐ|4£¾—^¹2 :2úÈdd§q£Ò »ÄMãô¨>\(ó²jµýY:[«±³ÌŽõËl(–‰§ïû X”iõv­[Sæ!d' ùÒ[È/¹ mæÆ (/Z«f‚-»—á›…§Ñ™òmPÞiØøB$0ͦxÏ]joÚ“šì C}¸Þ1@ ¿ÏŽŽÆÔõÄ#3k Œa¨)=ë ›öÃÞ׆šªë0®ÊÄš¥FtܪA…¿eÊ`DLX?nÖ6z K¸¦ý ㇠;UAIºžŽtt´¡ÍÚ†®%÷úq¥ø¸;ˆ¸ÜŠÍY)葾Š+lª±\©nD⪠d.*Å !—¼fd3QP°FÑD­ÕE0Ô"N„Û±cǰ7/M+¹Ð©þP9xIÛ÷"oÃ2X.ãhmˆÕÁ·.{',UÅ(¹›Œ½yX¦· 8÷8T+§x£¶‰° —¾N~ﶬèÏÖfÔ‹ÃK%wÛ(ëMÅá·R†·ùB¡;¦'Oℤh‘Ü%"î ñV 0(´k@ŠÜ7ÕÕ¡©9% |Ý,Í\pn €õÊYœºâ.ŽP^¸ @4(³6c¹Qùêb°né-”ݬEK¿ñKæ¬^Óú½HmØ…’ü\”Èÿµ»Å‹•§ÔÏ4/–6¦X˜Øm>+=¡æž•3!sC* †hÐ&-ô«„Ù<)ñeœÙ,â­Ö#VÕÄÍš'Õkˤ×]®†›°w{*v(An­Ì<}7mJdÓÛ–ï$@$0ݦ.,+´ZQs1‰K±da bb±\ýu¬¬°pðŒpgôÉ[âcüD”Ÿâ’(®„¸Œî}p€ù"æÄ»g­.“°mbRRd'Nऴڰ$™Z¾ßXº”ûP“|~µ6ö+ç% Œ€ý¶uäZ~ŠÄ!Þ7ukî/àÔÿ$:$Åê=BÆ¿¶R}Ò®±¸ðµOnñIܿ䒭o°ƒÓ:Vè¹ÜÃhÁ¾%as¡ÎP€x§ï,ÜùFG%0ÙPu¨•—£¼ü#|TQ…½28÷ƒò…t{‹„©ùïäa ùgþ>ôÈZäAVuÚ"¥îŽ!(¡êÙã‡øNvÚµg—¶1î3¿h¯ÔñBö À…;ã¶¾b1s'”g1¾¿ß§rŒyy‡ÞåÞ¾ù|EÊ+è¸ù2¢ ôw£™á›þáíBLj¡PÓÞÅ÷Âm•K}7oŽà¹dˆ€wnùעȱ{Å(O¤F»02%7Ò…r÷KùýؽMþMrìW/[öª÷í…äAŽ^õrèÁÒêŒi/à÷ŽÁ볤7‡]ª~IxñÕ–/*­îpf¹gMÐÕrÞ@¡À4¼SY#Ym…þ¨|H–‹Ì6u„r°µråTX¼èíöÊ _ùÂeØØdI {!””Iîáóʹ0#Ïž¯® éðù“G²lÓï•T7ñƒ Àº Dƒ­e;‚øVnb³|P®]]]8T mø^BÜ÷ÁrmtM†ëmÇCµŒ}zH[oìótíµ­Y{Êqè=ù)Û£z“µ§Pþsû=|¶ÂÙ–Ø'mcH ¬’ã¾øÛ]ÜúúKm­eêj,”à ^_ÀŒýµèïêı*·ö~·JNøÿò@A§Rcެ¿ŽlcÄH‚ß_¨SÒ„z‡¤´WM¦0Üçÿ m/N_«×žJµ×ÂU€³½ÃíZ%%§¯¡T¿jr±ú¥í5MõÃéÖw–¶ž¸R;ò§ïœ[z·}S¥¨^rZÔˆ™R>#®+'ð?g;åÁŠaµK™ ·òôËËËõG?–ñe2ÇÕklÖ^q!pÖ‰ÆcZý°•àZSéB‰…§#ô5f›<5l”NŽ¡«Ä…;µ&ô·;aôÜRtBJø9îµNÀVsyñ>ÁÅZ9G P`]Þû¯LËy||‡c¹ÍI_ÿøþ׸*4Wí‹/™•µ˜×ä>¸¯/ö£ªùsì’9ÙŠ¬Ì¨4ßšàw¸(¯DÙ[ý9*ôW¢ÄYÍòÜœ:¦ˆÌ•޵šŠX††@XF§$p˜£.¹Ê°¬3Ál¬”§3뎴¡é›[È‹Än ÉeÀp‚˧ò _w.¢IÂHž:h2›—Þ¦_†·n3Úýß^9¸2je–ºWšã-hhàÚk¼gN½4™¤Íºw5ýY©qÛ”ú•ËÔ ÎqÛãC¡pLÙ°ì/=—uZIÿÀ4ºí¸}§6aȯË Þ…À éè]>î¤æµ»Ý%Á.f’K±sòú¦’̬¥÷ÙÅ–gú¤¦](z‹`§T™™)×g9Q ™âë“´³NÂWPþQB˜’$·…p¯ñ¯ ÆW < z…¡ „e'e·Å½bJ+Ç–1,Ä·W’—ÙH_ Š«²çpù„Ü“§ä©ešb”5¾—´y5ý1v^Å÷’ú_±O|ÌÓºì2\¹]¼Úî½âhÜL P 9jängN.ÜîLø+"æä=t²Õ¶s™K©± Á§>¼ÈܱL]±e¹D'‚Zneȵ¾Vpü -°f¯2Mm¼ŽÇ´(ÕúÓ9.P€X# îÖ¨¬– (@ ¤À;{Z6mDÙQ P€ (°Ž wëˆÏCS€ (@d 0Ü%[”õQ€ (@u`¸[G|š (@ $[€á.Ù¢¬/í~ýõW¬ðúÈ´÷!(@õ˜—_ÿïÿ[Þšàe¡ëÕ¨58îÆzÏÝtURà] (ÿáøÏþƒ_~ù…ï]ÂóX ^!ðÞ{ïá·¿ý-~ÿûß«¿îôÅ7õf†»M}úØø& ü~ä?üá­Yl(@ ¤‘/˦ÑÉfW)@ P€H}†»Ô?Çì!(@ P€i$Àp—F'›]¥(@ P õîRÿ³‡ (@ ¤‘Ã]lv• (@Ô`¸KýsÌR€ (F wit²ÙU P€ R_€á.õÏ1{H P€ @ 0Ü¥ÑÉfW)@ P€H}†»Ô?Çì!(@ P€i$Àp—F'›]¥(@ P õîRÿ³‡ (@ ¤‘Ã]lv• (@Ô`¸KýsÌR€ (F wit²ÙU P€ R_€á.õÏ1{H P€ @ 0Ü¥ÑÉfW)@ P€H}†»Ô?Çì!(@ P€i$Àp—F'›]¥(@ P õîRÿ³‡ (@ ¤‘Ã]lv• (@Ô`¸KýsÌR€ (F wit²ÙU P€ R_€á.õÏ1{H P€ @ 0Ü¥ÑÉfW)@ P€H}†»Ô?Çì!(@ P€i$Àp—F'›]¥(@ P õR;Ü…ðûýxNý¹ª>ŸÂ@o/F¼UíB/ÆÕañ„áǵ൛Ì(@ P€©&°Â]CÎ說©noRœ½½ hll„ûI()õmöJB3ÐÓß÷Ølò»G]ƒãzÝ!?†zoÂyªUGŽ¡Ûkœƒ&;[ÑP×çÉok¤(@ ¤½@RÃÝO?ý„ŽŽo0.óÜ# ¢ž™Á{˜N©±•»pútÊrÌI¨í]V1‹r«NõEx%áø&“ZÉÖŒ$ÔS… ­šJp­Ö®n ùFÐ5èEèeP]^<¤ÕWOÀDÃÍɘZ¸@ P€ ÀÛ $5܃AŒŽŽâ‹/¾xí€75z˜`Q󇃓Ñã:!Löµ N <êŸ: Lë#Aa?úZÎèëeûዘү§ÆpïÞ=< êeC^tœ‘‘$©ãð™tw\D]Ý ù•‘zŸêÀ¤w ÎÃÚ±œ½“ZÀ O£CF¡Î´ôal¨C;ÞáSðúájYXš2F¨ÿx/Néõ(õzõ.…ý#²¾-“ïujûÖ]ĸڎœçáQÎíŒG”þ,V¹pÆý#8|ø úÆÇqó”´õT/BÒÆ–S‡qêâÔ]Ô6G-/ì½8³\!5,k¾¸»:ëŨ̕5W#[ßf¶Wãþë8QfÓ×D}Y‹ÑTdAd¸ãѧ9ªg)@ P€x3¤†;£ ÿú׿^3àI@sû€¢&\i.S«u?Zµ Oõá’{A[ š.4¡¢h7Œ‘ ©{-pOø`+©Ç…¦zÙ·KDԦߋ™ü/•åç¸YçĨ/KAjó#õ ”íAeÄ0"÷çù™Å%g;üÛsÔz¼ýP¯êF^bj&ß„í]`Ë‘£DfÐãl„³Ëƒ%•Êr÷Дr0<Ÿ¼‰ÆÖ~Ìl/‰ú2˜¥^çY `²-"—,g"ALô\Bk¿_Û7èAÛÀÙjBn~¾|+“E¥˜i+ÕÏ ‘ˆîÖV ÏJ(Þf‘õ/៉`ƧœªmŽZŽÚ_™]©+™ÇVÂxÿ„¬Êc÷ÒÒH‚`ªìo/-’O9~e‘(@ P€IX“p§´Íx«igÈ;%ÔTîÃ6{ ”|nŒ%¢]®Epa³ Õ'Ï¡4W  0Êœ ÀlÛ“ÍÇ‘k$¿…(ãrþGVª‘K‡WÎU£´º GsÔ]>Œh’_·®_ÇAu{ã>I(°´jsÐtã®^o–8£L6¸nßÁõkMÅ$®x<àBíV·¬DqQ)ò•€‡RÕÂd*À•û·pýÂAuUÄ;){fÀ^Y)µÊ”S†úÚRXú£Ó?´•–‚zܾs·\åPÚ¯®Ýª1Úl,GïþŠ6FV0©F‚aeM6, Û_Z[ÖÏ(žûƒ‰ p-(@ P€o$°fáNiÍVÕ¨ñ¾!µ\³§NWƒž2ªsO3ÛKQa“"2ºÕ~¾A.cž‚qùswY½„‚ž~œo8&—';^ÆŒ„ô±Ý¬‡4#^Ä71•E¹²R‰h ¦œbØ•k²QÍ29ûaSR•)C wت¤8u³ú=ÑÞ(4bT=œDÕ ò‘SV õHÆð–±9l´-$ +OE•ûÕP—¸”Ö–ÄÛVnãJæ‰ë[ùX‰÷áZ P€ ’-°fáî“O>ÁÇüêö†&áöD`± ¤ yyò]dW÷›éïƒ_³ÊMø÷qûš ùÊøØ ºZûÔð•‘íÀÕû÷qÍuÚ¦Qtôy—?î¬ñZ޼3ËÓ•1’[J| YF_Ž-´°TpúîKû´?·`®Ô[(?c^¸Ä¿ÅXޝBD“jófå’³RÐÆNq߉۸¼yÜîz¸ôë#x±[ &“þ0‡±Õ¤ïµm{ÂaE£¿)@ P€xM5 w«vÒXÿH?‚EN4ÃñãÇqòäq?)÷Õ)NÆð†ä¡éttHPÙŽ}ù6e°U >ÓCÝrŸ›M(q(c—œ(@ P€H–@RÃÝŸÿügœ9sfu#vjBé÷ÊÝõõØ=¢¥š"µÄP߸Dy w°çàìñH&°£é\™dä ØÁ®KhlhD:XÏÊôÀ ×©…7+šä¾8»<ø™ñ"£¤9Ê!r°Ï¦4ÇÝ3fÜC¦=Á«'µUQ2c&‹¶œ]x®ú"iû ÜíN8­èö ¢6&¦a0™ôe}_¹y5EJã|èiu¢/:4‹­B[›‘‡ƒ%Ê~L ÂVV¢ß˜x§•Ú¸¢¹Qþm-> »Ì»;´ÑTeuÈ7ˆóçÏ£kB©ð¸[qö¬S»çPFkoʰi~= ³õJøE P€ @RÞû¯LËÕ4.¯Ùp8Ëm~çëC!mdÈlÖ“ÍB Â…”k©r±/>¡-”òÀÂìÖlز-&qél»Ä§¸¾¹{\°‹Úí-gW×¶„‘þ†^ѧDû…e¿ˆä%L‰ «ë–oãò汕…䉿cçݰÕ\ÁÕò•FãÂ8u=3ù¸òMsÔÃ/±õq‰ (@7Øòf»­Ï^KCÑŽŒCQÊ?r —F%í;¿æä;å«k[l«ô%Igñ16a¹¸•²ßëeÕåÛ¸¼yìAÍy•ø»Ë„þ@ìú¥K;å‰h×Wµ vKq¸† (ðÖ›jäî­{+¿ãÔïó! /5V^˜lÝm‡uÛëÅ ·n+ (@ P€k(°©FîÞÚ!à kžº·®ˆP€ (@)Ô*6fÙ* P€ (> wés®ÙS P€ Ò@€á. N2»H P€ @ú0ܥϹfO)@ P€H¤?P¡¼(@ P€ @rVûîᤇ»Õ8¹Ýem (@ P€Š/Ëò瀠(@ ¤Ã] Lv… (@ 0Üñg€ (@ ¤Ã] Lv… (@ 0Üñg€ (@ ¤Ã] Lv… (@ 0Üñg€ (@ ¤@Òßs÷v6!<V«ÈÈÈ€Ùl~»ê¸÷k„à÷­ÛaÝ–ñû±((@ P€I`ƒ„»Æ{ÛÐÚ±Áuû*ìÌxq.É_ y{ÑèŠ\¸Òžü°F P€ Þ‰Àw! œ9†Ÿô×dC}S-v[LÎúðhh&ÓÛ9ø‡.¢±ËƒŠ+ß :—#Ršæ4.V…'ç(¾¹^ EÅl+Ç…ÓvdXsÞœ{S€ (°®Iw@?ÿüó’NýéOÂÿøÇ%ëÃÓCZ°ƒŒÒÝŠ¥ËÍÃ>‡V|z¨ç»ý8zù+”çšáêÀ™î©…e„ýèkkƒ{§í`ÊÇåÛͰùpF‚2õŸ=ßÑËh®Ì“â“èjëĨO.CÂ{I-N/E¶,…ý#8sÆ ëÁìóßC×è L–4_®†¿»]²œS×W'‘·dD1Œ‘–ópûm¨©µáÞ¥ÌHö’Óh:^3–nG… ׫íðOö¡­Ó ­I”Ô~†ã¥ÚšDúÛåÃÁÏ"ÐÛŠa©Ôb+ƒër-¬J2 ùÑÛÖ‚~r4 jšq®|™}Q†#Û† ªÌ¸qä°—o‰Up ý÷ú°½ü3Øs·)•ª£©m2š‘¥œ‚¸Î•CÙ¢l›ìë@§{Š ´5W®©çF]ä(@ P€ë&Ôp÷ÓO?¡¡¡aÙÎÜ¿É6¿G _ XË]~üˆDf0ûRÛ=˜ŠYžº×"Án¶’zÝmÄOŠf˜­°[$‹½›¤±Ð$/©¡¤¨æ,7ú‡»Ðð$ŒÛWËÕ 4 bÆÝŽ Srdäp&8gÄä¦È "‚3£š:м}ZÔYìTDî[óÉvÚ/I ²Û`òúànG[^.š‹-1Û•aI»Ù„·—¥š=]Ž©ž. w9ñ$tW%Œ†üZÝ­­Ò›”òaÆ7ˆÆÖݸßlÇͺF K[èOݹ·Q+ Ñû*dzäý/üïü|À+ý‘PVTê€4 ˆÞ™äø5äÉ›hÂVt¥/ºú{p¶;·jíOõá’;G“€O=QGÿ8G P€ Àz $õiYedî“O>IØ—/¾ø"áúH蹺~«’0–”á©è)v9ÑIp6 —÷ãdóq¨W`³÷áh™Mݱ¨æ3”î³bjÈ­;K‰ 'Ë‹QÝìBRÂשZTûÈ)Ã;×qÝU¡-Û*p[–¯5—¨Ëu”,ª¼>+ñQÊ.Ü}¯âÚiµvxF½2n'—?õíõWpÿθ*­º9¨®-q}…ÊÂRœsñ7iÒ½h:ZmepçúU\¿qZÝ.•âÉÔ ì`*Bei1Š‹$¸É49îS¿%âªß–‚ziÿÜrý|PY)ã¤2IëkKµÑ?µ”þöÂ-ÁN e•¥(*.R|4)cv#ÊXžLÁY„Í6TŸ<‡RQåD P€ Àú $5Ü)Ýùøã—<%Øýå/IØ[“EýšUžÔ\í—#v—Õ«a%èéÇù†c¨:Õ±Ô"z`‹¼Ô‰¾ jOå*&O½Í,ˆqŸ¾QÚ‘ãØ¯^¦5ÖääË—Ò>“vð­+¶Õ‡=[-a±æi%ý2ú¸°OÊ‹r–ŒcÃz›¶[aU¶F&0cl”Åüýz]–lm»Œàý¿ÿèÕDFÑx¤ í£ê -îêÛ䫨rÿB°DØhI(ªM‹e•9­%At6ÑÆv½œ¶ŸÙ^Š › zÐ~¾UU§d$3ª¡Jœ(@ P€X¤^–5z ,¿¡"¨ÜfR;…9& … EVø­Úv%zÄî§50 Éír樲rù7ëV}§ŽÁ=cÃåo®"O.¯*aQ»ºIî¹ )×O%hEw}ª÷ Î÷ûPqYÞÕ'€Ë9„¥JœŒíç ‡–ò¢’Ðka/9'¾¤MÊvÅT™ø›DT~P€ 6„ÀšŽÜ½v3ÌØu/\ìþʯ#K0ìµPhåíKÈÊåª}Íy€T&åÕ-ò%©nµ¹N=Œò+×äOü‘{ì”I ~jX\ZFÙž^•5¯˜VÓ>9'˱/5}Åñ¸™ (@5ØX#wkÞݵ?@HžŠõËm~Ö\ë뻚–wÐù¥R³5WºX¡ 7Q€ (ökä.N‡Ùj…\9MꤼŒ97Ù•&µ…¬Œ (@"°fOËn”² (@ P îÒél³¯ (@ ¤¼Ã]ÊŸbv (@t`¸K§³Í¾R€ (òI By7' P€ (@ä ¬öÝÃIw«=pr»ËÚ(@ P€ ^–åÏ(@ P€H!†»:™ì (@ P€`¸ãÏ(@ P€H!†»:™ì (@ P€`¸ãÏ(@ P€H!†»:™ì (@ P€`¸ãÏ(@ P€H!†»:™ì (@ P€`¸ãÏ(@ P€H!†»:™ì (@ P€`¸ãÏ(@ P€H!†»:™ì (@ P€`¸ãÏ(@ P€H!†»:™ì (@ P€`¸ãÏ(@ P€H!†»:™ì (@ P€`¸ãÏ(@ P€H!†»:™ì (@ P€ØòNæãêÅ»x±ÌÁ2÷Âç‡ö,³•«)zþ±^LåD±5cí;šF_·žY ¿¢•û¬¯}̱î^XV#÷4÷µÇ(@ P Fà½ÿʳ&ja||‡#j͛ϟýˆ¹ù-ÈÜòþÖƒÇ;àdÅÌÏÍcKÖûx?ëÝäÌ×ëÁ<¶_Ä÷{jpú#ÛëíÊÒH(À@ËEôLÌh[-¸rã܆¦0úêŽÀÊÇуê¬Ûœ5߯I»9a cV>÷¢å¬A£¹'pã\1˜ñb”¸@ P`C ¼³Dey‡Þñ, x@¦è,ïGaÌãñûèûsêÚ¨þüSìÚòn]Å^ Wcýcêèߎ½¡¦êCdFí­ÍÎIpìÀÜE˜{8€ÇRÑË^Ôœ¬ÂN½§Ï?@ÏÝoµQÄ-;p º…¶,Ù]Ù÷ox‘ÿ!^<|öâÿæ?Øò—Ú·=øòÛ8$íÙ³ô KZÁXNÀ?ÔŠO6Šl³–5£Òô|ƒÒ,<ò3\v¹ •yZ$ó7_@ضŠ`‡0†.9᱕Àæ™@©Ôa D–ë×S€ ÀxgáîUýõ=¸…»ßþ%¸•îÄ3ß3X” 5?àÜS<èÿ{T`gЃß=@ïNê>4ãbíó/^À30€ùP±#ˆ¾Ã­žø²îCÌ?}€ v9ÆÉ;¥Ü]<ìiGæéf|`‘C½âûdßBTìكݖØé¹‹§Yù8ôÑ^ìd°[„æÜ ý’´òJá°1™mƒÝn©'àBëÅ.øô uôòm ef¼¸èì:Þg²ã„­â\- M÷ÉH JQDk¿íMW/Àa ïL#d ¼ÎcRdÆöí”–‡\uÿÆ{Ûd?lÍAQQ6<.¨£‰øýJsØ|«5ö¼˜ær 6 Ày bNþBùÈúu2"·sÇNä˜c\o^à|ÚŒªÂ||X^| YO¿ÿ!!缌Öí<ð)>­(”:ÊQ•/£rO¿ÇS)ý÷Ê_`{Õc¼oÙ)£vU°`££Z]’#‘•Hö=€ü=;‘¹cv(£Œ¶½Ø³g”ñ=Nx{éQIZ]hô-©&<=€güyp]»†Ëšg1!ìWÖ÷ £ì4nüýê÷?GçÙ:Œ?תˆ„ðº[Ñ:ºM®°G¼hx"Íp­P åü ÍÍÍò§Ù3>L¿ÔöpªÁ®¬é2®]©Fð‘Á /ÕpiFi}4÷ú}’ò8Q€ À¦Ø áN³Êܵ ‰‡3ñ¾‘ô¤h–E>~ü1áJÌz_) M[2•Hö /”K´Jåò±xŒØ%AqNIu2)_¶½6u^û˜—è'“¾=jg)ðfÖbܾvv0ì¬Cïäbhz2ªŒ­ÙàrUÃnµ"oŸöì <ê—õepÕ"{›¥'?“RôN-¶ÁT‚·NÂa/ÆÁ2 "£“ÉV«Ô‘£|ÛóÕQB»|ÛäØÚÂ#·¦jy°æ:ÐtY ƒzò“9kñ9\;]“ÏỷÉ@Xß—_ (°Q6T¸›ûÑ·¼Ób"Ã\PŠÙlËŽ¤mQSœ^ÕœòŒîNì·4£=ÃS%ôEu~i¡¨­œ¥ÀÛ ˜­…¨)S"Wý—Î,ŒÀ™Lª,ûa;„I cꇱ!ûåÿ_f#êð"‘—0•#[ßS4Ñ¢š^V9¦¶—^X®ìš£ŸŽˆÙ¨•±ÅA9ž 9âRCú®ü¢(@)°AÂ]&öî•¿=~CïØce{ßãÇx¦ ¨IøšÃÀÝ1eùÙã‡øNÙ.¹LšhÚ"!îûþûøA Ïã¡GÂÝ®=rùU"Þ^ÙgÞƒþoŸÊÒœ<Àñ?ÊÜ&®K­_Ž9÷BFþÔ~P 9/CÛP!—]íµ&g”16‰]J°’{JƒêÒâÇB.[XT’ˆy$BBÜMrèPÔ`ܬß'Õl«*‚àÖ|¹ä{TÖ{0«57® )@ P`£lY·†D®I#v•×á@ðox(OÌ^}¨´*KžN݃÷>EûEu²ö”ãòD¢I¶-»ˆÃ¹×a¨£(®”7…þNå’¬õ'WmûË€A7Z:FÐ\ë>Í»asì—õýò?>Å8^hw¨W}H¢¾t÷ -XMØ3cŸŒ ö÷;qÑ\{pîQå‘ eTQ¦ð:Z¡ø¨Y†Ú<2‚X†U=h«ÕÀO P€X#:½ÃCg¢âó// …ÕgP87'cjò><å})Ê$ik^^zRuúsìš!#h™È2¶i%b>•«ª{«N£j×<äÁYdeÉP^Ô´ç£|y@Ž!å¶dfªNÛ,íjþ2ª¤6k; å‹”6eª¯pYR€+(°jyRÕA«ó¼~it+j\Í0^7gΫĕ~œíìDÃh§Zk™ë6jíµpÕàloÄp»v°’Ó×Pª¿yẅvÈÈ›<«M&uÔza“Ì(åÁ:{õWhBº{à“9šNÑÚ„E4˾“pžÔw/€ëÆQyLƒ(@ ldwöã7F˜{Œ/¿¾«Bå)Ù•§9ÜýòkÌ:ƒš=|¶ue+n]Oÿˆü†Š¼jù ‰ZF(ÉlŽ}^8Y½t}¢*V»Nê g,g¼£ ­ž ܾUâÂ뾇ÜÚê%÷®ö0,G P€ïN`ã‡;3{*ï¼{ß&¯&Y…˳§>Ha¼¿šÂ«¨E(Ê!ïMsÃ’cä)Aél™ëï2Z¸-•»Í¾Q€HiMîRÚŸ£À: „àŸòÁ|.—jÍȵ×]×ùœðð ÞN`î¹{»so P ™fXóì¼ÜšLRÖE P`6È«PÖY‡§(@ P€)"Àp—"'’Ý (@ P€ŠÃ(@ P€ @ 0Ü¥ÐÉdW(@ P€ Ã(@ P€ @ ðiÙ:™ìÊú üúë¯ò»a#øùçŸñË/¿¬_Cxd P€X•@FFÌò²øTœîRñ¬²Oï\à7¿ù ~÷»ß©ÞùÁy@ P€ @”/ËFap– (@ lv†»Í~Ù~ P€ (%Àp…ÁY P€ (°Ùî6ûdû)@ P€ @”Ã]g)@ P€ Àf`¸Ûìgí§(@ P€Q wQœ¥(@ P€›]€án³ŸA¶Ÿ (@ D 0ÜEap– (@ lv†»Í~Ù~ P€ (%Àp…ÁY P€ (°Ùî6ûdû)@ P€ @”Ã]g)@ P€ Àf`¸Ûìgí§(@ P€Q wQœ¥(@ P€›]€án³ŸA¶Ÿ (@ D 0ÜEap– (@ lv†»Í~Ù~ P€ (%ðÿÅIˆ ‰ ¿IEND®B`‚156_config_preview.png000066400000000000000000001041021516513262500335400ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/15_apply-for-services‰PNG  IHDRvœŠE ¬iCCPICC ProfileH‰•–TSYÇï{éEJèM^¥„zo %”AATTGpDEAÇÈ("¢X°× 2((ã`Á†Ê<` ;»gwÏ~ïÜÜßûçÞï}÷¾wÏù@¾ÍâóSa)Òx™‚`OzdT4' …\ÚÀœÅÎà3}óýßãÃ]Íô·Œfrýûÿÿ5¤9ñl @„ã8ì4„O"­ƒÍd€â#ºæêLþ —",+@ D¸a†çøÌ ÇÍqÿì˜Ð`W„Of±‰&žÅNDò‘Õ‡ËCØaGv‹ƒp‹ÓÒVÍð„õâþ)OâßrƉs²X‰bž[ËlàݸüTVöÿ¹ÿ;ÒR…óÏÐ@9IàŒô2Èž5¤¬ò3/Î?`ž¹œÙñ³œ$ô ›gv†kôó,L cÌ3K°0—›É gÁª`q~^ª¿¯8…°Mïrÿ€‹–l¡ kNCÏü`HY T&ÐFH…VÀ8wà @(ˆ+$4 «A.Ø @Øvƒ P ‚pmà 8.k Ü€Œ€W`|Sá D…!5H2„Ì Èr‡|¡`( Š…!$„r¡ÍPTU@5P#ô t:] Ð4½…¾À(˜ ËÂ*°¼¶° ¯€át8··Ãåp-|n…ÏÃ×à;°~O¢Š„¢¡ÔQF(”+*J@ PëQ…¨2T-ªÕêEÝB‰Pã¨Ïh,šŠ¦£Ðöh/tšNG¯GoCW Эèô-ôzýCÁ(c 1v&&“ˆY)À”aê1§01w0#˜X,–†ÕÅZc½°QØdìZì6ì>l ¶ ;€ÆNâp8Eœ!΀cá2q¸½¸#¸s¸AÜîž„WÛá=ðÑx~¾ ߉Ä¿ÀO¤Ú;BCÈ&ê„›„ÂQš¨Kt †“‰‰åÄfâEâcâ;‰¤A²%‘¸¤¡®¬î¥.T¯QïSŸÒÐÕÓØ¤Ñ¢ñD“¨i£™ YªÙ­9¡¥¦å§•«Õ¤õP› m£¤½G»Wû£Ž®N„Î6Q]]¦nŽn“îc=Šž“^º^­Þm}¬¾~Šþ>ý~ØÀÒ É Òà¦!lheÈ5Üg8°³Øv1oqíâ{Fd#†Q–Q“Ñ1ÍØ×x“q›ñë%ZK¢—ì\һ仉¥IªIÉ#SSoÓM¦¦oÍ ÌØf•f·Í)ææÌÛÍßXZÄ[ì·¸oIµô³ÜbÙmùÍÊÚJ`Õl5f­ek]e}ÏFÖ&Ðf›Íe[Œ­‹íÛ3¶Ÿí¬ì2íŽÛýiodŸbØ~t©îÒø¥uK‡4X5"Gºc¬ãG‘“ºË©Ö陳¦3ǹÞùCŸ‘Ì8Âxíbâ"p9åòÑÕÎuk—ÊÍӭЭÏ]Æ=̽Âý©‡†G¢G“Ç„§¥çZÏ./Œ—×N¯{L&›ÙÈœð¶ö^çÝãCö ñ©ðyækà+ðíðƒý¼ývù=ö×öçù·€fÀ®€'ºé¿aƒƒ*ƒž›ç÷†PCbB‡|u -}¦& ë— _Þþ1Â-¢$B¹$r]äµ(¥(nT{4.:<º>zr™û²ÝËF–[./X~w…îŠ5+®¬TZ™ºòlŒd +æD,&6"öpìWV«–5ÇŒ«Š›`»²÷°_qœ9¥œ±x‡ø’ø  % £‰‰»Ç’œ’ʒƹ®Ü î›d¯äêä))‡R¦S#R[Òði±i§y2¼^Ï*ÕUkV ð ù|Qº]úîô  >ÊX‘Ñž)‹ëB=á¡,ǬʬO«ÃWŸX#½†·æz¶AöÖì99?¯E¯e¯íÎUÏݘ;´Ž±®f=´>n}÷Í ùFò<ó67¦l¼±ÉdSɦ÷›#6wä«äçåÿàùCSD àÞû-Õ?¢äþØ·Õ|ëÞ­ß 9…W‹LŠÊоnco»ú“éOå?MoOØÞWlU¼voÇÝN;J¤KrJ†wùíj-¥—–¾ß³ûJ™EYõâáQ¹oyû^­½;ö~­Hª¸SéRÙR¥\µµêã>ξÁýÎû›«Uª‹ª¿à¸_ãYÓZ«S[v{0ëàóºðºÞŸm~n¬Wª/ªÿvˆwHÔÜÐÓhÝØxXùpqÜ$l;²üHÿQ·£íÍFÍ5-´–¢cà˜ðØË_b¹{Üçx÷ ›Í'µOV¢ž*l…Z³['Ú’ÚDíQí§½OwwØwœúÕø×CgÔÏTž•;[ÜIìÌïœ>—sn²‹ß5~>ñüpwL÷£ ‘n÷õô]ô¹xù’Ç¥ ½ŒÞs—.Ÿ¹bwåôU›«m׬®µ^·¼~ê†åS}V}­7­o¶÷Ûöw ,èt<ËíÖ¥ÛÌÛ×îøß¸v÷þ½å÷D÷9÷G¤>xó0ëáÔ£¼Ç˜Ç…O¤ž”=U~Zû›þo-"+ÑÙ!·¡ëÏBž=f¿ú=ã÷¯#ùÏ)ÏË^¨½h5=3æ1ÖÿrÙË‘WüWSãHÿQõZïõÉ?ÿ¼>91òFðfúí¶wŠï½·xß=8ùôCÚ‡©…Ÿ?5|¶ùÜû%âË‹©Õ_q_Ë¿éëøîóýñtÚô4Ÿ%`ÍZÒà„Þ€ñÍD‰9<М§Ÿ%ðŸxÎCÏâA꺘±u¡y@zÝ®9O=cBln.nÿˆŒs³¹\dÄeb>MO¿S×À7ÁôôÔ¾ééouH±èJŸóå3ák„Øk»¨@ÿWêÀ¿Æ_ ø?hÚÝPiTXtXML:com.adobe.xmp 630 282 ¬C1@IDATxì½ \×ïýK)©Õ¦¢ 4•ڬȚº­èšýàMD[¸Ù…½ 7~œÄø¹6OlÜk»Á¾õËÆö-—[ãÄØ÷ã—7&^[§¾ÞÀnáÙž ´5Û¶¶Vã4¨©Ecœ5ñÐXJÂó?gf¤‘„x±áü1š9s^¿çÌÌoþ眙ëPÛ9vL€ 0&À˜`×<®ù\Å Œ­v_ÅÜgWÖ×ìš]âÒ0&À˜˜‡>6ëÌUfL€ 0&À˜Àœ$ÀÂnN6+WŠ 0&À˜˜XØÍÇVç:3&À˜`s’ »9Ù¬\)&À˜`L`>`a7[ë̘`L€ ÌI,ìæd³r¥˜`L€ 0ùH€…Ý|lu®3`L€ 0&0' °°›“ÍÊ•bL€ 0&Àæ#vó±Õ¹ÎL€ 0&À˜Àœ$pÙ¾pK&F²Á{ªY?öËxsáOùÝŸEí}™Øÿ‹³Xò Þ |ˆ…$ôþWN:¾þ¹¶þcs¡¢\&À˜À< Pœ~+ž+pBŒÀ–ÃŽWß„uG¿q7ÎHÃšŠ¯µôã—’3ÚÄ»}N¥õFõÆ{>Âχ†åÿpbV4?òE§¨Ùz}g‘þϯËÃß[¼_Þo†kðî‡Ã…·Þ¤ão¨Ñ¿ðEüñëŸÆ ?ú1Þ²[ñ> ÿ·ä±Íù_Áÿ̸7©!ÑÿÚ¯õÒ0î¿÷‹hùÊ­° ÿF±·µ뇴@Wåg”rµ"-%–”,-t ·É ?µU s;ü¹Èö5¡¡¨j<Œ j6T£?HzÐQˆÝ;Ê`öaòzîÛ<»YÖbÄSÕ‡€ƒûÃÓÜ„@i&ÒÓ…¸  ïh ª©CP È_·«ÚÑsà1·¬Âî2'ù+h­¬@»­ûWåÈ8íÛWc `Öæ¨Ö1ò¼*Nm]-ëKE”áÞˆ>p:—fÂ}³Ú÷Þû-|üøô=h“mïú¢ cw]ÄÃuÿÜr;úþÖA}L ëñcݱ~4ŠÔmwa¤èVô½{oÿ®|!nh?‰2µ›âØ#÷¡øÆwñ@C?~Q¢+³“ñ©cï ,û·_ãÙ3ô€£¹St·zßAÿC÷`Ý—?‡=??«â_&À˜˜Å> =ŒWß{®'wwŠEŠ:QìèIý# “¬SïnɆN"ÜÎ×üö¹{¿x7Fù–â|o±uš÷žö½‡ýsèÌú„ !æ YS¬p]ÿ>^xãm¼N‰8ì·†âïËŸ&áÀ ’F×›a5«âðþûîÁ“BÔ]Ås? o\Àk#ºIgJQwÓ»~üýOß‚ °î¯]ø²¡‰·ç^§~A2ï§Þ!ºN½‰½gÞÅMÔç–~Q$Iîc¸é†à&Qçõ]À?½õGò»ÅÎ;äQPô_ÿÈ…«"êD!J3?ƒÞá÷"DZ8à¬r ßýßbù]ŸÕ½ø— 0&Àf9ÒCù¢N! 91ú",u ÿ1HÖº>xF´»ôMügÆ…Nÿ ÿ7RdP³¦| «â˜Sˆ·4¸­$ÆH€½üÎðÒ𬀎[Ua'‹IVµåÿЃ¿~áWøï¯‹›ò|ó^qüvßJ7Էަȅ­7ß´/û -=x¤û ”½ð <ÒçÇCN«´Ö¼vî]ø£ðŽRœÍpÉøWëÙƒ-X½b-©@Û ¥ëK lk5š­UK‘“E–´3Ý ‹Â…é0™¬pfS\ϲ¯¥ h¹ÁŽfUˆ ÷¡‰¬å%Y2•ðÝ-”‚³éV,v§äá9¯ÀžUHÁz©£Žó´ƒ ‚r€”ž2ÐJûndÏÌØ°Lyjn€ËfŽŸ¹™þ‹_ÑÎFîC·ä¬Ÿ¼ ý/ý %/©fÙÇ_½(û˜÷œ¼ô~~§ .ê‚Þ3ÈûñXßñ*Þ¦tnþ4êmjâïkg^ßý3õ£ÖßàåK”îgn•óýVý¥x¸ø-½o†_á­/Óùòò¹?ÄÌÕM¼>e¾ÎO/Àº(¤vL€ 0&0û q÷ð‹â®viQÜdEˆ­š½ÂéÌÌÖé×NÿŸx Ç<œ{7ZÈ’$„nüþžUèî}M¤É[Ð{Õ!1:ø£î!x¿œ Wº ÷_3n£pÏýBÓ#Ó¯L“á ï<Ŧ¶HЕq;žÎÐŽ}ð‘>*è•Û%K"œ(.uÃjMƒÓéD õ íYYšÈ#iÖšh˜´I† ?wäìy‹aj¨‘ /òúSØBäÆb¡…< ¨XÙ@ª“"’D^6ív{€Ž^¸ÖTÁÑ\‰î˜ºza-¬’Ö?=ÎÕùÅu=aËØ-wáݳ(?èxßü ÅÞ–†çV§á¾ù&þ¬õ êkÚsËõšÀÑxdŸÑRzî­÷ñÍ[oÂM‚•<þú=ú °O¿Iò °Üyn³Q:ï¾ÿ¦êƘe¹ÜžÞâ–›´Î•™Ÿ†Ž¿íºæf\‡•wÛðO¿9‚w™`L`6sêt+^¾O˜®ÇßÑü;ÏÈäŒ —GØi¥zü…Xi…ã7o5ÃM‘›Dntc¼îè)½Ü‘¿šåEõ¢!µ;)îmxî“tƒ¾äÇ“ãu:¯î†›p/Eú15-­þ­ }Úxàjn“r0å  /c8¡ût'”©»MÇ#Õ˜~€~-.”φÚè÷‘0Û„†`Џ¯»·âÄÚhk-²p[Q][Có÷(MN¤úlhÙKûey™®„ ‰]…MåšÇFC ñÝ[È;ú¾ü…;ѰðspÝþ9²À‘õVð¡fÝÓ~ú>€úæ8§‡£¯¾½ŸÃ¹™ò1èå×½ã‚_I†ýÎ=i™û-š0ºþ·/â¿9ç_Þâý%.if}cÞfL€ 0ÙE@ˆºgóïÆâ;ÓdÁÞ¦øO’¨»‘¦¨‰9w‰ɺDwËdÓˆ÷Äß݃¾¢»°ìN+îÿB&°R¼çh!ÅËrØëVüú;qÿ-V¬Ê½ {hÈ4žûo4÷KÌ{ºákƒCøyŒ€-ç„™å|s© › ÊæûîF}–?ð¼+­s,ÌÁž/PYî¼õ_£|c¤q¥½„d›ÈY2rA®¨©9 Ÿ@@ÆÀ€f gFîR7)öÒÜAJrìÒ7ò9‹@W5Žö‰xŒøàóÉeæ‘Í.H|Mp’p´çä¯àíF޶(C„»šÎhYS­i±Ksÿ½w£3ÿNXO¿…þ÷h€î4fý¤_¾…†ôiž˜"p×w`ÏŸÀýYwc¹è\—.Æ|hɼó:^!axƒèÇ£xúeuÞžžÅ•þ­ÿõïqþ4ÑE åÆðsÙ4Ùö37áßÎŽà«'~†hÑw¥ËÉù1&À˜@rÄœ:]Ô‰9uîæ>÷Vhª€~ìJÿŠýÿ¢yvËxmÉWåSžxÒþ¢«8 fx&¿xêJŸócL€ 0(â-¿xG‰X(ÑöÛwð࿪ *šiAé¿xߎŠ÷:ÔvÎømà˶4¸>y ½~„—IœE[Úäq²¦xG†ñ£è¹qñËšøY¢ koKóxè d­yï}ú†°HÍœ[ힹĤ¤( )8ZaVEp‚ ±(¤çLKì!àØ±&å{ÝÁ®I…ŸñÀqÛd­%©J+Š~ôNØÚö4yðƒ×'OßaFCËUÁ8ã…Ÿ|‚â}Gÿ7­Í¡Å%V²Ü¢‹Â3¿Â9zÚcǘ`×[iît*ºü:jõ«X@ø³óï!8‰©5—EØ][8§^Ú+%ì¦^Â+óª »ËVÕÛ1¸ú8F/ຆ_\¶\8a&À˜`3A Z^Â[o̹šq…˜`L`î`a7÷Ú”k4£†±Þ0¿sF“æÄ˜`L€ Ì0_<1Ãåãä˜`L€ 0&À’$ÀÂ.IPŒ 0&À˜`³ »ÙÞB\>&À˜`L€ $I€…]’ 8`L€ 0&Àf;v³½…¸|L€ 0&À˜H’ »$Aq0&À˜`L€ Ìv,ìf{ qù˜`L€ 0&$ëÆÈÅ ÛÓÓƒùqøx!ØŸ 0&À˜`L`¶`‹Ýli .`L€ 0&À¦I€…Ý4rt&À˜`L€ Ì,ìfKKp9˜`L€ 0&0M,ì¦ £3&À˜`L`¶`a7[Z‚ËÁ˜`L€ 0i`a7M€ 0&À˜`³… »ÙÒ\&À˜`L€ L“ »iäèL€ 0&À˜˜-XØÍ––àr0&À˜`L`šXØM GgL€ 0&À˜Àl!ÀÂn¶´—ƒ 0&À˜`Ó$ÀÂnš9:`L€ 0&Àf v³¥%¸L€ 0&À˜˜&vÓÈÑ™`L€ 0&0[°°›--Áå`L€ 0&À˜À4 Ü0ÍøIDWàó C &³f“ V‹‹9‰¸S¢ žDMu-<þ %bBöšÝØœô Ü– §Ý2õÄguLƒ/üÄ;-Ó‰k¿šW§ÿèMì;y;{`¶¡js.¯ñáPåxF€¢õU(H¿ü9êuå_&À˜¸ö \Fa7‚“õµØÛÖ›’£»K.ÏRñàñ{1Ê9ˆ3>?Ú¡ºi¦ü*[å SŠÕ••ðS¥ò«±Êy•…AÀƒ K*áM ² Uû¡9Éþ@å’-ðD¥o2Y‘™[Œòò"اñ á÷z04D=it8*‡Ë´«øá!a.ú®oô2åÁÉ2&À˜Àœ%py„2€í˶À(é.¬A?¼dMF4Z—Ë)¾¾¨Ë^·›ZÉbh¯-…²šV¬äL€• ºWYÒ… IÆÃ$¬¹tRý'2nsAêkž®Tœ·àDUÞ¸ãÉz˜0 U˜l&ÆpÔ~W8Gcî¼Í˜`×8Ë"ìNî1ˆ:[!v=QãˆR@ñáÌ@€H#2BC¶BôÑkZÊ„78exX ˜Ô´´ˆ°Þž-a+òœv¹-F~3Kªp¢DÈŒñ·N‘·œVk¦3J<2ìÃhÊ/ÒI¤¬”Ò¶£°¦Ú#ò¡:ƒ0YS‘6•‚˜Ø}âTMùçd=G©¢dѲ§%*ศSó òì§ò„‚£-CËùX‹ñÌá¥rÛè&ÛôjæW=CÊ ´cû–:UÜ{Úà äÁ©2fdØV¨=üÔL LÔn)m¢“ýU¡¡a¿?aû$׆ F†ˆîn¢Ž’’°³è%à_&À˜`‰ ̼°éACÈTçÄŽý$ê¢Ê`¶ØáÌ {*¾쩬A„φ⭛±4Kf !· 4俥hÅ[«`iÙŽ&¸- çÄÖgªE a°u*¥jþ~Ô¬\$6"œ­° ûËœšß0š+·PZzæ&8]vxú½òx! g–9ã Í$RhtŽÂu( Gm‡P,ªs¯Ù…µyjíÍX²¥‰8°f«MÕ Ã¥Ê`'*·Ô«W‰BÚÜkðÄÚ<²¼Ð^¹ur¼Ñ8\)ò ¥Ò(qøBœ"ÊNV°C4DÛ‘A>‰îURtûÚ·£¢N4µÙ³UÈBˆ†´[V)’sù>T©mÑw`ª»üé»k°±A,º\äÇ…h.ˆ!±§Ðôlh§ÜLË,@£ ^±K W0U  ëîž5è2€§ÅT·¥Æv·gúŽ¢²º%ßQ\…ÝKõ~D¸¶¡MA_óÔ4õÊbé¾°ÑÔ„ýq¦&P;l vðR`ך}Ø–§¶C(.o0&À˜ÐÌøªXeÈ#‹Hßš¿™¡öubYEXÔ¹ÜÙ$„BKuôès›‚â-]Ku¥AÔ /ªk;Õƒr RÛ¤“Õ ›ÍýŽwB0­‹:«.º™ë¢n|øñ>ŠæåmÛ!ê„wWíF´ª¥’SµÕª¨Ó„æn_(*|ݪõËäFn¦LaN†@rh\u&¸²ªµt¨+[%×Ô —܃¯ZÖ‘“ªÕ‹Žxºú4þ>´“¨B.ÇaÁèùX¡áœnŘC6éþcÈÀD s¤îA»W?‰Ô’Ôý´ßá“Ô÷ªC¢ÎdsÀaSûI¤Ì£ðÞ–Q'Rð¶T¢SoŠ ÛPÍóäNÅ!Qg‚Ãé€Uû¼`Ë)¨¯PEɵ†E],Dìǘ`!3o±Óo®”…5L2  «ºÚPiqâ¤ÌƒJ²PxèHWMJNlƒ°Q.…›ö‘%-€+6¢WÜ…½^)Ò‹¶a—6¶xÉÓ†mi2¾ŒH¿EªÅ¨ŽD‘j£]ZÌñ -æƒd½Ú(­WZ¸?FÍ]¾› è;ZêQz ¥ë ŠÒQ)ذfÇ6¸,Aé®ÞNuTYËUk™çÐc¨$럷­ JI:ÒrŠÈÖ×+­6ýÇÛ¡”‘%Wk«ŒêX\ˆ4-#'áåk¯ ÍwT›ÉwË*;ˆ[;¢ÄÚµ8Â24 û«Þ÷bÇh¸ÇO² •,µƒWF÷ЇÝB=.AÕ#y)< Mržc -|q>³_.Šœ½™`L€ `ÆO %å4d¨:±*uN†‡…¿âó µULÆ·Ð+7´ Á.´{´›'­àì’ðâ˜ön3-ØLþX¬öPrž†=h%‹J_ëTÔö†ü“Ýêé†.E=mÇåÍXÄÍtÅ"UÓ¶À‘¦óò¢•æ·YHhéÿÅpqXR¤¡p±CFÒŒÞÎAÎ…"±8³ØÃõìjí…bHôB\šÞ¥º” äF˜®Hü8¨œ$H ÎV°04líë<€Ç6lÀ†Í1ß'gˆ–Üæ¤úOd’ÁI)~CßC/öÔ÷…£9v:’°g¢­äÚÐbÕ;;Y?k÷ oX—ÿtNÐkT¢ÅYˆªuÙš÷ª7ÖÏ ãèŒxŸ 0&Àæ ·Ø 29ëw {™¶¨¬?{7®Ä^« š øK=b*D^QòÊ7¡nuôk©\†§£žðÊZ÷&u^S<âão‡ñBÆð·ç¢ÜY«- ð¢VÛNÙ µ¡bÍ_#Ö,O¦‹›ôÂõ›Ð°¬ZZzë¶`Q=­äM]€ó’•‰¬xÇBó±ÒÝ‹amª‘aE‚ÖÂ’ ç^Ùóhˆ’VbŠIøþÞ:¬\TO+…SiEë‡á/T¤ '׆¶6aB%çp#ƒ,‹fGY[¨%U—“ëж„HÀ0¹zýRhñIB³W(ZÂÉô*Þ”]^ù:ê{ê o[5µS% ì¥ú„™$—|Rmh/À&w=jºÄ@_Y½6‡ƒN ñ¥‰B4SÄè9i?eáz”wh¯º¡¹•¹pxU–„™`L€ D˜y‹HÞœŽÍDZ®Ø`éñÓ O]ÔQ§[{åFZ÷mE¶MµZ é¢ÎäÀòªƒX›¶rè%×í[bÁ„U7VÅ\€ç¶JÀŒz_Ùš|§ž4¬®rìª* í'»a²¹ä°rHÔ™œØ´oGH…Ó‰Q&K?³ùNÍ\F_MŸ±’ØêŠ\mšâÂb§^J Âeç¡né¡@öµ²ÃÏêI $(}ÕâgEº#7'”Œ«P] AJ…Û¡{»´×ªèûz}´²ëÞÉüò>™þcˆ®¯Á3ÑfÚB4 ÷=© ‘J.dDÕãÊ*>W¦»PžI¶aÎÚFTÑйoÈK¢N4´=œfdÚÔG·R?Ò<ýÕhœÖ㌞<ÿ2&À˜À$pݹxõê¡/8ää„oôñÂ%ö«>ýªH¡€¦Vc±VŠá(1dk–_MH™ ÓOâ‚É£#dLu =”Ÿ‚ÖÊh/?¶bkãadŵB…_Pl+Þ…ýKÓéµ#4ÄlÆTË !9qÛ–rÉž_—DU’ BÃŒbèUý*…øÊ‚.Ì’‹~åC%ߦS6µï‰†¦¯OÐPõt¨$׆ÔÔÝÅôÆ }©dö·Ãtèr\&À˜¸R.ËPldá-H³ÇUFAŧœ„7»+冺÷ RŒQ’ÆAVYP¤¥L€V›:“-KpTÙB+“«ŽæiŠŠXiFøÑ«{ñÎÿ1:þ^ðClü÷ßàý? ù]ë—£N/¾yÏœ»ÖÑpù™`L€ 0)˜ñoÅ&*ǽï`gß›¡ \unº>¬-=2ŠG_z ×]¼MÂîÓ7™ðÓ¿…„ÝîþßáÜã ð¡è×ôÆå¨S÷[ÀoþðG,ÉüÌ5͆ Ϙ`L€ LÀv›¾r;ÿjï\ú fi«z½øÛô[ñ8…îÝÀ‡1ñ'`L€ 0&À˜ÀxasÙøc3êsÄÜ7þ¹Éúö·Ž[b¦üè#üÇð»øà£1yüfs¤ynÀ?Š¿jîßüãOÑðÚ[¡4F?øßüÑn«ïÆçŠÿñÊ >Ãàîc=!øïo½‹/4½‚·F2î© ¿è ¥£o¼ý~P†kÿÝüùs½øÞ©!yèêñStË<ôð§©\…­¿@Êá“2?Ý_üîÿÅYÜñý—që?œÄÃí¿Â;”v´«ý¥ÿ½ûõï¿¡ô^=Qú=ñê›°7ü»¬÷?†°E½K;~…[(íûˆËムï0&À˜`ó‹Àvÿé_~Ž_‘ú§¿þ"þåoþ_¿ 7†aöMY·£ËçG À×iH1Ú­þñ¶ýÅŸÈ!Ù¿ÿéo é?+îþ,Ÿ¼ w‘@–Ðh¦Æ|x› 0&À˜˜Û.«°æ«'~†ÿEsçº3 £‰ºDHï$ñ"ÄÝâ;SQÔöKø "(ãSªuÍ,””æÄq±ÂT-݉í7ßSE_>‰*!ì~¯ ¿.%A),xÃ$ ÅêÛ¯¤~R6î÷³ n ù‰4~Ki «øž†TÅ­pÕ_½'ëãG_Áÿ¦EºÕìM²èË••ª–ñwš¥/”8m<’ñ²¸‰ý¤´ kß_¸ò)—POC©…“°pÝz“©d­ë!Ñí„[Ñ— ^7²ˆæìe§ÝŒûlŸ¢2˜©\£¡à§ýêð²ðv“•Q Û¶ ž‡ÍrchˆøVZ,ħ°VÂ’(Ä©^ošVÈŽ 0&À˜˜ÇfÜbwáRÄÉÛÒz%D˜S§¿NÄY E ë›p¿ (†qÿÔ0´+¾°Ý‰!Èÿóú0Äb±8A wþg‡:Äj1]{iˆ÷IZ€ ,†×Óœ»¿ú¬UîÇ[Ä+1üû‰Gñ>]?‰ÅÂýüí‹rx¶€„£Ýb–æÂÿïh˜÷ÿû݆”‚T—£4ÄšM"õ¶ÂNX*Ÿ¶`5-ù¯w©Ö:‘F)½ºäT7±ÐC8‘ŽªõþúçRp”¬{bAŠX"†põ²ÉÀü‡ 0&À˜˜WfÜb§ÓC…Â:ö5{Šî5á¯x ±X4!Ž˜S¶¬vbqƒ¾Š5^{fЊSÒ¿ÿSZ ð¾A‚g½óNwß áX!ÿ’žpbÎÚK4gN£dÝ4¿îÙ‚»ñÍ®è 7¾ùE¶ÒbŽÇ_~ƒVó¾‡[Ⱥ–uë'‘Oóú„óþúhekfÓËr!‡˜Ÿ÷\3n–Âj'Ò‹5t÷ »×ÈâxÏñÿsìþ@CÏÿø?“e¯øÒçð·d+nÅüD9÷PrÖãó/`L€ 0&0\7F.^u{zz““ïpLa½º¿¥/´bµ2Ûo»>3l,Oaqû½¿N©É:1§ïFÆVºËéÄ|½4iÂú§;aE.VÞBl*´"V «NÕ‰WÀˆ9}ÑÖ>òÆYI…¨dǘ`L€ Ìo3.ìæ7N®=`L€ 0&À®ŸcwõªÂ93&À˜`L`~`a7¿ÛŸkϘ`L€ Ì!,ìæPcrU˜`L€ 0ùM€…Ýün®=`L€ 0&0‡°°›CÉUaL€ 0&Àæ7vó»ý¹öL€ 0&À˜À"ÀÂn5&W… 0&À˜˜ßXØÍïöçÚ3&À˜`sˆ »9Ô˜\&À˜`L`~`a7¿ÛŸkϘ`L€ Ì!,ìæPcrU˜`L€ 0ùM€…Ýün®=`L€ 0&0‡°°›CÉUaL€ 0&Àæ7vó»ý¹öL€ 0&À˜À"ÀÂn5&W… 0&À˜˜ßXØÍïöçÚ3&À˜`sˆ »9Ô˜\&À˜`L`~`a7¿ÛŸkϘ`L€ Ì!,ìæPcrU˜`L€ 0ùM€…Ýün®=`L€ 0&0‡°°›CÉUaL€ 0&Àæ7vó»ý¹öL€ 0&À˜À"ÀÂn5&W… 0&À˜˜ßXØÍïöçÚ3&À˜`sˆ »9Ô˜\&À˜`L`~`a7¿ÛŸkϘ`L€ Ì!,ìæPcrU˜`L€ 0ùM€…Ýün®=`L€ 0&0‡°°›CÉUaL€ 0&Àæ7vó»ý¹öL€ 0&À˜À"ÀÂn5&W… 0&À˜˜ßXØÍïöçÚ3&À˜`sˆ »9Ô˜\&À˜`L`~`a7¿ÛŸkϘ`L€ Ì!7Ì¡º\áª(èÜY‰¶ó”mjª6À2q`Ëxerë±¹ ]¦6<èÏ€9-Nû´r˜N鮸œ„·×ƒ!?0â—<• ß Ï Žpš7ÀäÒÁ¡GV¢ÃRˆÆÃeÓ{0%Ÿé?ó³ÿ%×v3ÍzÓS4ïÙ‰¦^:) ÎVLçöRõÜN¦¢ÆØLŽsDKè\¨í ¥ÉÃp¡þX8ŽÚŽpù£¯¡Dh#0ØŒ%›¤—±ŽÂÃ×¾uÔ·œåx¶ª B`ÉI°òõEeM‹ìÏ2ŽøcuakÕ&dé40€ K¶È9¸Å[«`iÙŽ&ÞØúL²èák°uƒl?5!õÜ¥èvVó_&Àæ"™_k2!ÍJOÁ$|¬V$XŒn4 íù:±¬",ê\îlT"7„–ê èÖ i§:oKM„¨¾-•uðiÇ}Û±Qu&‡ .›:¦ÒU»̓ZƾvlÑDÉê@6åë”áô‹¤–˜ñ‡ÊºÒ êNºyÑ|¬1dlow§ü-ȱSƒ(gXÔÑ0­Ó†!/‰žNÑyé@†Ú4Q>˜ƒá“ľ:$êL66µDLdÁ0:µ§Í•AöTrSi·¶½ª¨3&šä¶¸qY¹\ i¢.™$Nî\u6²j=‡ú›P±ì½LO̓½FQ'¼‡:°±²²)?º„š}'??”žS}TKzJ /:…®pD.ÔH¦R˜e5Qg¢r¸´3§«•̓álãô“Ô?w«mI!ÛŽëÖ‰:ñ°Ø)<0¾ÿù°sIEXÔ™lp:Ôüå.Š“T”©'ø“,gc ¢N¤<$x´†yèA½Ô¢N„׈Vý!< Μî‚*W)Í–ÖÐõFð:*D¹ÒÒÜñ¢ŽŽOÈêäNT„D®GZNþ~TW,ÃÉP ªýòj©®4ˆ:‘»ÕµêµF´Ñ ·•¬Ît ³cL`ž˜y‹9Û áSš±lK“¶ïÀšÅâÂ@{]m(LéŽF”dZ€2*ÉÚç¡#]5u(9± BÑ‘snBU™ÝÛW N sÒÅSŒ°Ù-ƒ¨¯U/²dn@ãîºÐ*¨_± m~ºµŸA ->Pü¾PZ©Å´z²Hä@ކ;㹓GëB‡ ·>ƒ2ñh¬ `û²-Ðr o ãd»¸IfÃ¥?u˃t3ÐË =iï–OÚÊ@+Vli'u§mØ"KÑŽm‹a ŽÒpÒ öèiÇeöÚ½¡|œd™©*Qoâbø1`¦!iç6ìòoÀÆ/edöƒûá4‹<§ÞnÂz²­Ì… §Ê:Q^êð»H7Ú‰aa‘¡õÚ“Y$«¤ERlÇŠu¡:DÇí“ÚÛ+ú9çr4Vɼ=Í•$©—»P×^‚mZPCҽѻÖÂìÖÕÕÒJo;Î(E”¿ U»"3]¿«È¢¼HZ”ýž>êqΈþª'ý;âé”Áì|WÄ¡‰û§h½?:±ƒ˜ˆ¼žCdi# ”—æt*%éãË`ì'vn¶ZYf%ºOÉC5ŠâiUû³£.êâÂE÷?_{zÕCLEßP¢Í’;õ$âþN³5»»huz°ï(VW·È¤½-ÝPŠTƺd—ï •çô­=,¶tAQº3F‘Ò±8ߪY±{ÑéQh”À‚‘¾V•Yû 2©«ILÌŠú÷^¦¡çÑ5“$ÅÄÛ½$ØVåÉå)¨•®pÓ>ZŒÀÎ!»¸×K}H/Šwîjù‡ 09O`æ…½B¢"$êL(ßµCŠqÁÑšòáÖ/Š'Ü.MÐMÛ-Dp;Yú¨CêÃub|~t Ã%"$-ÉZJΑ)E¬w\B‰<²±oÿ*by ƒ‡ðã2p€¦º©ÎäF¹.ê„9<ÏP¯± (vä]ejífr­Á~"”N»ÿyš*hȈwL—Æ«`!V¡ú8s¥¨Á-vGR¬Œ"ÉmwæÅŠ„¨Ö°˜3©i ‹Ç¦}ôºYÎ,”;°E Ü!ôxI¶Ñ°fz}èîñЃ‚]zUSH毧³[æUÑ;’èŸÔzûÑ#Pg[+LAtéÊþ>x•²+µ,Qý„aq9{'Ú²Ù#^’b@C€}ºž¢…%ÖDéG›b»¥:ÆS³fäÂáôÒQø†$³ RáYêm*.«è‚ÅÞ÷õ…û€Õ¸ÒÅnO i!@ìäT_ÏȪìMfÂc´¨F˜YÈ2¨ Èp„ û§‰Î½ý(ZGSC8²¾…QýDKË) {q—¬‡§¥#yYSþèá¥PÚÐÓ ý*èëÒöì4å"t ´‘T …N°1YΩá‡ñà˜È-0ö…€!¬>–#²Ùž‹|Sƒ|X ö·£Ï3 9j 7Jbòš«Vc¯K¥ámlÞ!/‡#òa v(öeL`¾¸LÂn‡*¶¼Rsù¬Ê1\ŒÌšÿFoñ÷ˆó‘O¤>/~[Ðê¿xÎBbÀ†²?³•â™ý…0ÇúhÙ›~ét–lÉ:Û›ÑÔÔ¥ŠÏ`/ Ë Ð„ñÌqY„4äçAîµbenlb¼¸ç´HC^QW-?ƒì4cøFåŸ9ľE€u×¹ÄÈ!ÒkÛ;° »F&?nÏÀd¨Xª±¢>“ —„’±g¹¨¢^¹ï—+bµš’ÉK…ši%l( ZY­·– ºùzŽÒD Ë«6£È¹€†bWªÖ¡p´„[‰Õˆˆ‰û§áÜ!iVÕ¸ƒþ¨£~ní¨ã+IÕ̤ytVÔt‘Jô·`cE›ì ÖüÅHŠÞµ ‹:O‹ì<Äð<õ^{ø¨ØJ®FƉµ7y΃ÍJØÙuG/ã:¸¡)X¨…òŽ«§!~Shu¸“ŒvâªFóß*ûåAWyI¤E^úŠ?I°²‡¯YçÅêâ;7´3n#Áep\Xö`L`þ˜ùÅtImß^í:eÊ^‡ª"í†âk=MÛ¡yNí4gE:²òuÉaX±났‹ù×L¯ÑÐТ‚ÞE{ÝèèÂQ†á£W¡ˆ¡Ô¼’µ8¼o¹‹Þ3,nb%ê",Z´T¶ÓEßøZ“~%ñG³‰è+ôâ`ãµ8”ŠH"ÎÄx†^ ¡ æÒý¡ í#4µm‡¿’ؘtÂí¤ØÓ`Ïžú¾p’bÞ›¶žª=ŠÝ“nV3ÞnáÜÇoÑkDBmêmÀÖ>xh^ÓcµRf|DÕÇbXÒuœæZizºCñ£÷ˆ—vök²¬FÇU³ Åt’ˆ1Xa¬YÈÓ”!u„–v¤dÐ<£~â-ª‘Á&ìŸ8Òô\¼híöú¹EÎ!Õë•í¸]WaaÈO¼òF¸ÅE!¿XÖp@íΣá¡rqVˆŒ“ꃱR6úMóP7ú}ªDShU³Ôž"IgRIÓöµ¿ÖÂð´WÉ?Ó_ÒŠ$Òs £,ÜN”ºC=b…®¸n,Z´bÆ„¬¨‡/ƒm_ûH:jÎA¯kÒ·ù— 0&™·Ø‘¨i ‰3é­Å#‹Â“õõ׊ä•oBÝêyƒm©\†Zi:êñ¨Ö3*¸{SYø¦žDE„,ßZˆÞê6 íGÝ–•¨§U¹© Fi«P`ê¼-x›QQÙAs™h5_Füg<¡Ô³Úä¶¾0è¦ò™‘Wš†êy¬·n –Ô…¢Ä܈71^6'b«åœ ¹˜yÄöLŽA^ù:b¯¶‰·­‹Úiõ2ÝŸ¼dBͧ׬¢‰áêMI˜õüØ»zj­4T}p3f¾Ýb×Dõµci¹ ½ÚŠ®†jt% }Ì^€Mîz²J‘hñ6aÙ#ôY¶Q²†èOù(Ï ß˜õè5ô`"ÌvÓˆ­x1õ0 rt‹•¿Òë¦0uO–¯ ;íxbsžžTŒßx‹jÔ JýsáúMhXVM-CÃuÔÕ[aK]€óCb¥¶‰¬xÇBóµb äeNËMrxQzÒ+mr#ú„‚†6ìyåp×­†@JKD±zQ ÚáózéS¿Ž’Ìy˜X¬L…³5KÈÚj’ï¯Ô \\cµ*=øUP¹#›ØÅ1ú‚žŽüMq¦\¢Á«úŠ>¡Ï.‘>BØJ'Þ-HB0V›ÜX]ÓE±Ä±4‡Ó OÈ\Gó=×$êKFˤš3ÿeL€ ̼Ŏ#Aô9gÝ(ˆ˜äƒÆ}[‘­½’dHu& qÄZãЭ_FTwL¡ñ•pn)YexfÇеQº Ÿ>Ñ%E==g§Ë|M Ô_q¬¿·^i©°"ŸVÉ­ÒÞ‡ºé,PÓ±d­BÕòluGû›½|J]ZFZ8=@¼‰ñúqçª]X®Ç•žV”nZZ7¢:ýW ~cùEå+‚%Ãi Ñx0Ìž¾7$Eˆ¯ƒìyëQž­ ]‘wVË)HÓl7‘Çdœ½€Vù­ÉWŸæBVQ¿q&JÄÀ*gm#Í©ÌVãS=uQçp/ÇÁc«B“Pr&'òó)uƒ¨sÒJìÝÚ0pæâõ LÕÉù€ù´ˆ 0}èŒ7´­n„û§Ü·¨F‹•Lÿ„% ‡ŸÙüpG§~ö¨´;œIDAT®½~‡ÞFt1ú‰ Ee®PØlzu¨ï‡|µPšiXÛ¸Ëõ¾Ag·—D8ÇíZçIªF§µ?yÎV¸h~‡x)¹êL+G—FOb¤ƒ&š+KAÃMLm¾iߎb8ªíèÊ&¨Îв’x½P71«´œµØ·µ”¦‘ç‰:“ꃑ2ï«¹Š¿¡¦ -«~ëÆÈÅ«fOOY(râž1ñõ!ÅGR’xãz2ëiаâËÑ—¸)Cú¦,”gôñ˜yPz!ý³$øúÁ *m„Çšø…Ç"}EŒ]‰J¾ø3ß)zNÄ@-ƒ`/nçdë‰Ç‰L&"ýñ =ý™l·èªFpÆO“ÉÓõ;½`ºµ[´Å1ùô‚j]GÇܧ/EPU©—%Ç›Úf„*f6Ó×8b¨Ùv”øb‰pñz݇èK1‚Ë0⯽’^hë™ð…±ÉöONŠdÿ¥/Œ›_Êù2lF”¬ì=qòÖûˆÈ=Vÿš¨Tq8J/ëó(i^í³ûKÄIE¯]¡vK¡v‹H<ü‚b[ñ.z‘rºüÌ–8ÿ“¿æˆiê ÃMîM8¶vׯdX©t‚ëKD¥x‡ 0&0ŽÀÌÅŽËbbñ)+ábÝ@'Ž;„žfì£t#"†þG^üã…ÖüeøÄq”.¹hÄV˜3aÚRÌd¥£Š?<&¶´•œ¢ÒÕwõ¸—± dLìFeeeI/I&k/ù!ü± ' 2‚O/Wì_ã2h’-N•JIP1]Ðéy™©Çúò˜~\ýUÐyÜC›¶q_›ˆ —|ÿLÔ>ÑiÎø¾`¤%»÷ûW8÷À`+}É¡A›†}µ-²¸I¤5’H-•À˜`L€ 09B€…ÝiH®`L€ 0&ÀXØq`L€ 0&À˜À!ÀÂnŽ4$Wƒ 0&À˜`,ì¸0&À˜`L`Ž`a7G’«Á˜`L€ 0vܘ`L€ 0&0G°°›# ÉÕ`L€ 0&À˜ ;îL€ 0&À˜˜#XØÍ‘†äj0&À˜`L€…÷&À˜`L€ Ì,ìæHCr5˜`L€ 0&0Ç„߀¾aåškÝ€¯;w6cø²–<€žúC8éAßQñ¸¬¹M&ñÀˆÚn3Õr#¾xâ¥7ø)mÏ|Êìá7ÖãÃ*¤óFò2Ti¦û¤¯ç(v6{Æg?IѶƒ—÷L™d‘8ø5@`ØçÈ¡_Eæ"2I¸aÒ1fs„€­u‡àñ á|nŽ­uN³´ N݃ږ~XNX‘Š5;Ö"Ý<ÍdãEøÐÛÛ‰¢@ Ò.W0CñtÀ›Sk[|YK±Ðnư§õÍý€É‹ÅEQ„eë—‚c ³êÚp>ÕL³¹ë7Á>ì©ï†Åª†·XíÈ-*A–ݯ† ýÏŸiFeM7¶6CÖÔ’ˆHÿL{jÚ|qÒ‹Í!"˜; Z7,Cƒ× «Ékáì^š3äLxú: Õ²«rÒf"¹ØiP¹d &‡xaÃþ>4‘¨Ûqâ0;1NÔ {CÜz…Ó7l<¨¬íBºÝjðÔ6)Ÿx9%*C4s™š¯ãÄáÃ8vâDXÔÑÁD}r|¡&öI/ÙOù,{~ÆkÛè”sÖnƒÍj–ý7f(B<¢wfx»záñÇ£:>F2>âÜLèbôóè~œ0> x»ÐÑG'd7Ùôâ$“„7õÉ ðÛwjå¶ ÓÚ‹Ê=I”ÇDA?‰:w‹:#Þž›®ºÅ®¯~ªÛ¼*]«»’EÌ+VïÅg6ÒFúÑ?„³p6•-„ròVïí†3Û…‘þ^ ­(\·e ÓC-¤#¯._;–UÔ‘Ê„åû‘å©AE]?LŽå8¼»(îMÆOÃm¶ÒÝpÚSû&,÷Ô ƒ–t#í¨ÜR‡!-×Âu»d|;QQÛKå-G¶r t1µÏlµbõÆ*ƒëîB°n#j=tÌ^ŠÆÝ%n­ÄÆLN*S•¡L#ìÜX‰^yÝ6‘•(¬:,Ÿ8ã•!"ΆÕYˆ¬ÔTØË×ÀéÐ{IÀå–”¡ÄéAgWÊJ–Ç»I< £µeî­Ï ÈIP†5Î6 ˆ´S2Q¶¼m[€U%%@I-Z†î!Y) §ãÖ‰Ò\põÕÁëd]¨jܦ>™SœÄAàÎAý¡ŠúƒÈe„¬+ ""« ÔªÆ*²,‰7È œÜ¹{ ¢£”,l%™" Ää Äþðu¢ºRô£ jÛ@- l®BY(…Ås‹^*Aá¦Ý(# J¼þИ@Üè¹÷4Sò‘-L¦!7‚öQ§vX©CØ «PEuŠ]†Ttn_Úa²Íôz‰ˆ³ÏT•@´¦°šTÖuÈÔÛÐO¿¬×¬Òƒñú$õоæT7Ñ9ds!7m]ýiØñì6b*hÔY:+W ÁCç2µ(¯ê|ØùH|t®›=½P‹'ê㌊µ+ô’¿ÕÚéACÔi9µó&6;) ê·l@›/ú =HY†Ñ^_.òSšê`v˜°æÐ9Eöí8N·rÒáìuû°4x”Î{Á/Sö½Ôz¬®nÓ"Û°fßÈ£~’¨?˜|'±¥b/¼Z,qÝHÜOð´7ÑiJõ¡kM½ÙAÂ*E«Šè ˆw^”£}uº8áJAoÿ<¶n*Cº8™â¸žŒéÈv¥ ¿×ƒ Õ…u[×c¡ŒD׈[РõI:9±oGYúÕ¶¥«!Ê׸к·I^/‹w<ƒ,oKÜr&àQX l< ’3)«‰,Ò.[‚JÆ©;{3kŽÀX÷Ê+¯$8:3‡Îzeì¥WN>ýêØ“>8öÔ©‹2áSO?:öàƒßûÉçÆ.ž;=öÔÃŽ=úýÓtìÂØÓ´ýà·ŽŒ½qáâØ¹Ó/=LñŽœVã‰ÈO==öèS§d:úŸ³/~‡Ò{rìœð¸ðÚ~xì¹£‡ÿ{î•§)åûíïŽ=õôóc§Îjy\:5ö(ù?ýêYéÂéÊp?¹ ¦qîU5Þ“/ž»xñ,ÕM wêÕéÑçÇ.‰`ç^¢8ŽÒâ¯Kç~2öèÃGÆ 5;"ê}äéwñì+2_Éh‚2ˆô&ãÎþäù±—D1)ÝoiexåûÏãSÄ—Ê) ­§xI­í^<}„êñäØÙ‹j[.ÏŸ¬GÒ~/ƯÕòû>8öíçEÛ]{é»´ý¢(ù O«(Ó±ïP>ß xQ”Úÿ•³²Lge›=<¦v#Êë[ß;òÃ#Äõ;c/Q;$*YTAcì^;{êEªïÃc/RZgÏž»(¼ðŠlÿçO©êâYµOêâõ‡¼.Ž=O,>ÙO=ý0õ¡#Ä›2¦¾u„Â<(úz¢2\|U2ú¾,ßYyžée£:vêÅïÊ6Be>5öê«§åµ"ÑyqA»>=ý“7¨ùϽôõ©‡¿¯Æ‹•‰ð£>$ÎíoùÉØê3§_,Õë«¢Üß~~ìœÆò'"½oýP+û9y¾?øð“c§ÎÑ5‚xˆËhÜrSVsPûðõ$WâHºN|K”—òfÇæ:«k±S<¨Ý^ŸÝ ž'Y¬Oo1Ñ£²©p = Ÿ4¬¥áÕE[º¡,],­4…ëé S˜RòPUX‡ÊN/Ê2ã?åÛ ÖÁ]·Ç=>䬥´·a¢iK–ŒÅhl,Ïë£Eݨ¬X†Ò]Ï¢`´GZ‡<õ;±¢fH]@–ü~2#¥ÊBe·º«°¹@-RJç,]OóÚ*ѯ”ÀÚ\Gó³È%ê 9³5 ôñ«xÑNÉme9ªUÑžƒÃÏ6B¡9nŠ'qŒÉ$³m_X"Ÿò+r–’ŽÚˆþÂÈ2_˜Ã›dz±³²’üR±¸jY°BÇg N"Ÿ l(Õ¸ÙíVxɧøÑ%Œ²Š¬¨£4`=}ÛiŒb9IqŠQJÖ1‘«=gžm\ B$•lM CÒ¢“KãÌ J¦FHø×{†,uôë°Ë¹‡"¸r¦:k1Y;ÕÞk±ç¡ÌV‹1ŽM,âõ‡„YÑAÑÜ9C0šóÙ¤9p¥°‹D©ÅÊ?‹Å ÍôŠ_†Tj“[+Ÿ;5Ù°V6aÎÌ ºˆftØíj?3ä8®OÒ±óý8Ê÷!SXeSbUv:uà†¸±6-Ñ_"¨‰5»T=,iÄׇQªû¸Â£Ú¦|ÈÈ 2²o¹þøma!KR¾c *–tÉ”¤µ‘ºÒhxÏ™‹ S-‚¹¹pÆ7;K€çb›ÚÐìQ°ÞÒŠ~êëey´ÕnG“ÏŽìì jHºDbÝÅëºÞ9¶Ô@+l®Ryѯ‰z|㯮y9+Ú‹,gfèâ^(¢TÖUÚ(G k×um‡WYß&.ÈÔ2kÉJ®^viÚDÝœy¼Gë“ ëC;uþ4­ÇÅéW¢Ø1Ê-|s!ÈÑ©–J‚<'æ‰6ÜJŒg@³DØ19Oà:a’ŒWËžžäääÄ;<}eÛWlA¿¼([i¾]¼êª%gÏãØBs»Äœ2?7ÑÓöî*š·a!ÁµbZü&ºp¨cgá&š—SèÉ,\4[qöÓ„Õ`û¢•ð“µaw=(æ­¾zlšè-'ÖÑÃDs“ês“NBÅÞŽPL“#UT>ßže¨U+¤s¨sèB— ²€­XV ïÀa}5e`hU¢7”šØpaÍYJ÷÷`ÃêšÐ1+=ÅWm"ëš™.€1˰ ™¡Ì"œpg y¶4yCá–“u²H,Vq bch~™WPµc=2”6íIXRl\MJ%ÆÆpì:ÚÕy† ¹ÏlMÃÆ•5t+1¡œæEºAqhþ‘héL¬©ª"qGóÛúŒó™ˆ\éVl¢9ZÝÛE[ˆ–æIúŽbÑÆŠê ¡GûS`~ò×Ê •MX(}=õ¨¨iÓPª°­$ƒæ·MÐB1Æoôì\„šà:œØ¶ÐpЇ£*ÐâÕ¼L.›E˨㕡½rêHh8JwaGN?–T4Qd'õ¯*º#ó&O8}S6öÛ {¢>I]bðäQ4´ôÎ,¤Ò|SÓªÃX•ª2ÐŒe[D¾Góâž­r¢fÑF’X kx#rú+Q!ú ³œŽı°h¾Þš¯GÙ/ß…Mö6šÏÖE)¸°ïÄ6Ðû|b´…ÊÀQ*ƒèš#vU‡µ9œä5Býheh^œÅ[w`i–°—Bí8~E%]¡ë‘Å8NAûö¨Ó®º°y=^â_…BÏö¸×¹H‰®yº‹œo›  #}ذ²:tpoEÕÒ¬8çE‚1?Ó//®N¬Û½‰VÇ'8)h!ÏcK*1¤_©ïëóHåÜEê“mzÑ׃Äu´TT¯ýF\#â”;1J„úæct½ÌÛ÷,JòJðèŠÇáÜ·FVÜG$Í;L`¶H4Ö|%æØ‰ü/ÒœhwúÈÃ4¿èt´·-çlQ'¶Ä8ßëÒÏÓ¼ïŽM<{FKƒÊuñÒ%*ßšW"'D%.Ž]œpLT¤±KSˆ#ò‰YÊ}*eˆ.S2û²Ü±0$9F˜øuŠXó’uY†+Ç!~éf¸ gh˜Ã™«h‹‹1;Ä —!2Û{ç䜽#§ÆŸÃ1_A¯DhŽ(×±8ïHl:¡cž›S9ÏeT€I—"Æ®Óx—ļXšS§š±+)ç4>:v:öQµØqûd‚Ht(v¹å˜.¼ò$O'ž8.KºoÐÁïʉÄ㲘S®®Å.žÊ¥Õ‡‹èIOu‘_çvmõµ‘5l¿6ü/-áe}ˆxjL1«L gç#8žEÃÜZ˜¯lA}ítÒÊráL.ZɽͰ’ûÊ…s›ZTH ©ˆVL¯ÿXªYZzé³WXðb¸Ó'*ñì/Õ‘£ 1_V/õd!5‰ÑDËxc”a°ý6ÖuÑ[Q–Àº#*{1kŠÀìv„Ðøþ'ñÂܰï¼Ó/>âeº4.”„3¦g¢ô’‹•D„ ÌSòœ¢—!&y ÎSJ³°Ú4PÑŠe¼úèõ:Í}Ã4Èåèr›S´™´Gº«Üæâ]yf¾€G5ï20Y+ìÂEä-&À˜`L€ 0d|,™@† 0&À˜`L`ö`a7ûÛˆKȘ`L€ 0¤°°K bL€ 0&À˜Àì'ÀÂnö·— 0&À˜`I˜gÂ.@ï.ÝIŸN Îì$Ê|'}#è;*~Ç¿±~v”sæJðõ`çÎfÌD+ùèËõôú~_ýžôÍ\!9%&À˜`³ÀÕýVì¤|/ÚL%¡ïz^Ù"Ðgìß"ÃÂD€Œ(}ÔÓoN}g¶¾¬¥ô†xZë?ìÁ¡ºføMâ•/ôíXz…A0hAAY9rèøÈ@'jÔÁs>™ôíËÔÜ5Xë6£¾¦ }gU¾ª‚>ï••W4ñgÀ"Êsv>ôöv¢(P¢}ryúÏ Û—…\SÚüY([hŸFb• 0&À˜Àì&0Ï,vômÇý'Ÿò2¶¢YÂèû¤“±‰ÄK•9ãÇOéíyÞ®^xüĉJ/¾5)bÐë£Bï˜RÎ÷ ƒ>©”IžèêB0-&Oúè£âÓI+·Ð§| ¶Ñwx—’0ô¢ßG_Ö4/ ½ÑEáG­™Hó÷¢Ž¾{ Oÿ&fTÆQ»ŠÎ(Ê_ìþÿíÝOLSÙû?ð÷'ù¶ º¹.`A7e!›n`!\èbØÔ… Æ0Â7Jp4ñcÆ?äkÓ 2‚$#"åC¬DÑ„1X¨  ’_» “( j“ :‰íâþžsÛÒÚ *HíûNÆÞÞ{Ï9Ïykx<÷^®J3ö*É!E ›Ô»ûûïÁžâwU…¶ƒf-To„»<ãÍp Íp• (ðÝ äÎŒ¼}Â%ïôIjTÝÜ §z¡ªlk:©¶É;±å—pjòNÇUI‚`:„öö¸ÎÝEžý Vf1û! »ãgy'íAãEßK¾A4¸Ë»LÕob`¤EÞŒ1%ÇžÁ`ÊšzdÆ=ŒÊÑÁÞ.˜m&„´2Ô:K?ùË’5»¥ùù°ž9/ïÓý²æ Lå2óxÄŽÕ—3(¯uÂÂ$1¾Á—Òy_¤ìS˵óvÔûÕÚ>®­FïP+ªÏ:Q 'Êîÿ×ø\(ݧH¹„ch÷´ÎÇöý©1Vä=¡®†®õw¸:~¾#³bEHçðßÎ]},ïÔðóŸwNŸY#ïÔ]Œ¼/6ù=™ÒðŠ-W]÷ÍËb2Þ!ìpGÆ1] Æ‘šŽR±³ÖârȦ6q¡(@ |¿™^¶[ïŠÍÃ×Ý÷QŸè¨Ó;Þk¹<Ý¡WþòJ_[žÖ«*ëôéÅýAÕE}Z^}é}P'ï$üEûnQ_[œÓ;ª*õº'ò¶Äå Ù^©¿ð.á­- KYù¾yûââôcÿíW^yŸç‚>7§ÞN»¦Ïy‡õ›rÜ/†u¯wZŸönù­µ›>.¼ÕŸï=”w Ö]Ô½ÒôâÛúð¢ñNÄGsÉïî\­¨ñÎÇ*9NÞoíÓÅ¿Þmª?qƒ·£R¯ì˜0Þ-¹<÷J¿yûUä=“F]•úƒéH?–çÔ»M+õ·Ë‘Ò©Äõ‘¸Ö½ˆÔ±8,eêto´Œ*ùqñ­^Wõ(á]‘÷×=š0¶­-LèuÒŽ1ŽŸˆ!±\§(@ |ï¹3cgäæfXLyIYºÙ,³?ûm°ì #_+‡½ ³ÑI1“\ 49Îã`‘º!®ÜkÇR©º¶wtý>=‹õ0j ;áWïY”ûÛÔ+–´Cn\¯ˆÌ˜Gš,¶—c¿I.‘–K;rßÛ—,fëAÔ·‹E^’¦ Ê=iò² T¼þÖµh#‰¯}Ê“ù²®†ÌØkÝø½¢(c(61°5´âÄhä°Â’jc¦Òò÷¤ñé“RN·Ê¥Þüø^F±eƒ]CÀ(Ðþ‘2Œœ8l•zä2áàyŸbR6"Éߦ%lÔ¿$÷£É oXòÏ J‹²šMe>µ!dÜÛVÍ]² Ì¡ÁÕä£ûÔ{²—|#òk¨V—}¥ƒÿÈ¥ÌÆßÛ°Õ÷`fÇa;ÓŽ¶ÃV1òãŠ\¾ž”¾Éßowüz[äI*}c“0iF ÑÀS8˜í¸ì(„Ëå‚i>=öäN‰ô+Ò% %’Bö½öÃ]!Yr0€A¹¬mv\FÅ–bH®žß(@ P€ß«@μ+Ö?p ½óIãhÿß >¹/÷ŽÉ}w7.Ãw«áS7P>{ ]KÕø¿²üöòƒq?—šŒ3Ùhs×BårIê[%Ñ‹.%Õn4:÷c¤é$:gÒC[äÞ±Xª³2ãÁO·bå4½ÑŒšÒ-?"kÎø úp²¡w}›ýÔ¹¯N;1rÿWtŽJ¶i,’Ô¹›áÜ¿Š+rŸá|t«íh3Új$QúÄâz â[ï Œ=DýÝ7±]bôÜbø#³ƒLµáôI 1tÇbIÒ˜_¤ÒÜyÖˆ¢ÕI\9׺»&³†îkN5AŠÔ1œ•d|=,®P€ rB g»ÏM¿G,€ÏkÓ%?!y4,O\Z>ùDrû22Ã,IÉŽ.ò$ª· ö­éÔq ²þQŸ{Õ¡ß~õ.Z&ÝÇš>çÖoJ¹_ ë^ï´>íUå¥6ïiã¢>­{Âhó´¢ë^cýýí;ÕþœÞQU©×=™3Ê¥ûcyZÕW©?xûN_[[Ô‡;ªôʪ'Rß²Þ¡Úá8¬½3ê»øW$öËÓz쯺ýJ_\[Óßy¥¼ü—.îtí«í Ò¿‰ éãtô9—býMW.½C渽¤ŸHï¤Ý·¿Éú_‘þIì ÞWÑñ[Ðô5ãˆEðQŸè¨KoÙnœUú°ïåwúƒ:ñ蘎à'(@ P`O äÄŒJ¤íÕ—¡ ¹0tBè’ ±FȤŽLŸùÐÙÔŠ€µ%û5ü#› TcQ—"ópèF;*¢3:±Ëyç@Ck½1§æ¥JŽŽJóiA±½ûM——Ã^l^?n~l&™ñ+S3I²”íFOMȘ•3Éa&Çy,RQà‚Ûc ãʬa|ŽÉ(¶þ‡q¹ØtgÛ_hD×hæ—J1.óVn§=r‰ÕRg­ õþãT¹<Óh¿^©Û)Ÿ.îõ7­¨»Ntù‚"‹R¦‹O¡Ûm]ß²±XZ‡àßãòq Ö 5œ–+ðácæN.’úß*=–O›Ö8y´i9”—FðŸLcžÁáâÈYPsþ¦Æ7L*Ã/ (@½";O˜í¸ì(D«Ë×›|\>n7Æ 8?_øÚÛqá¬S/¹J·it6n bvôδ÷ ¿¿=wŽcöeëåärèÇpì˜ þ¤¢ê¢ °¤næSŸþÌøWo·#<Ôd3¾Aüá‘äM$‰Gøµì[‘ŠBK씤MŽT•hJ…x-u«Þøû¤ÝrhrŸÙ*Æb‘.a¤oš&Ç«% 6)äÈŽ”q»RþaFEc7úŸ?ÇóçÝÑÿûñÜ}$cÜi,ŸŠû_©7uØèCB<(ÿ…|ºEîÛ‹-–Â2`¾Ç|øÇÐzkT²ÅØ^~R€ ö¶ÀÔ|bº'''QV&?è¾—EfçNŸtÑûäŒnýh:Ý€Yã¿» ðͯÊ}W¿ÃïúS ­ºmÎb)ÄÓÓ'ñ2zŸšªÇ^í6fÂÔ:$Åk:VYØÐü¬ “sX™ñà§[’œ‹†£7šQSªaÆÓ¿ÏO昪e»³´þ§—ÐðRî““ÜkUb1Ùhs×":¹­'ù#芓 /„mÕ(dÇÏm×pP …ch¨¿‹ùhSÉ)´7Ax¤õê†ÂõÅ&÷×µÁ¬JwdVk½È¯„Ò:¤‹[“{ìNÔwIË6ÜéwÃwé$ñ8u7ì³8qµ7!*“‘ŒWÈÔà zçöEʸ!ø~ ÷;_â‹ ö|?ÆMgÑ}6ò¤üB P€Øc¹•Ø ~(òèkôiÏøhe»Å²ý©™1Û#—l·uµNžÞ”§i7• ÉÜ’$o‰qø=?Â7ž×ª„rkKÈïÁ — Ïž×lêg¬Õ_˜,Ûx¢W•Lw¬Ò¯õ™Â!VõçÅ+½ýÏɦcøÃªü™Øm_%(@ P`·r.±Ûmà/jOžê<¦žT5™Aë‘´hîðûŒ¼Íõ¯¢ßõþ_tÇQwjb…6Ì-©dð˜1 (;M%pwËý˜ÛÏùSÕÌm (@`b·£¼_^¹1C­&>“'—,å׉LʯÙ¸„a…óøahÑD“ÌBnk2qc…9ú]Íì†Õ£[ÿ%…9*ÅnS€ À^`b·—Fƒ±P€ (@/ȧb¿‰E)@ P€ @60±Ë†QbŒ (@ P` Lì¶€ÄC(@ P€ @60±Ë†QbŒ (@ P` Lì¶€ÄC(@ P€ @60±Ë†QbŒ (@ P` Lì¶€ÄC(@ P€ @60±Ë†QbŒ (@ P` Lì¶€ÄC(@ P€ @60±Ë†QbŒ (@ P` Lì¶€ÄC(@ P€ @60±Ë†QbŒ (@ P` Lì¶€ÄC(@ P€ @60±Ë†QbŒ (@ P` Lì¶€ÄC(@ P€ @60±Ë†QbŒ (@ P` Lì¶€ÄC(@ P€ @60±Ë†QbŒ (@ P` Lì¶€ÄC(@ P€ @60±Ë†QbŒ (@ P` 9–Ø…0éiÁ€oi 4{åóCŒV0óT}†"…Và÷ù±Ü+qæNɧhð¥ép¿þ÷{ïËwšîìáͪ?žÉ3ò9ØÃ‘24 P€»'c‰]X~Lahfu÷„“Z aì~ ƶõ3ߌ ï þ^ýóCo0»ŽÔø.Wúæ¿^f Œ éádRÄü²Y ˜ÄÔÐ RʇV1xß…†«©÷o®î3·„0"çÒäJ¤¸Š©¥©÷[ZÐ$ŸÆݵ^Ƹ×úÒ•6yðõÒ¬ ¤?¾TØ«cÜ·*?F14û­þN©ËS€øº9–ØYà¼×îšâÍŠÁØLXѵÍǤØ }âèPâO$3æG§à[ýD™ íì׌˜LÀÛg=·£P¾«-¡41Ëö4McýÕ'ŸæÐ†Íí9ï¡¿»2›³gïÝAáú@EÉçbÛ܈Œ¸¿£ÿº/²×¬i€o ~XQb³àMï]üôãC$þ"cÜëanÔ ‰]â9œMʱbtö5Ò§YéÏÉXÍÉcaA±6×ýÍÿàЬ…êԇɒÓFïXeü¤(cÿ“3ý ùá:ÑŸ$BÕÍÝpËeÙÖtRmÂ2¦ÙmXõÍËOŠCho/ëÜ]äÙ `e³°;~ƵڃÆô%ß \£?ÀLp\kCm™‘ÔwNɱgp ؇ǣò#N;Šžî Œ{<•¶‚½]0ÛLie¨u–Â,Û2-šÝÒü|XÏœ‡]~hÇ–°”œòÜÂè¼aÕ/·ôË®ö/a°¥§¢?^m´7×Â* …ch¨¿‹ùX%Fl52ëñž¾qÙD—Gägy™³¥ªPšåý  W‹žòêvàé高GëÑf´Õhð\9‡¡ùHáÂCçñû…Ãb'3M-ç Dpœ¯‹NDˆšS'ܱ¶W|h¹êB¼K×Ð\[†@ÆòñºÅ…®©‘ZÄᎻE– 1àt}'dqêÀî>–@Q÷³{°›ƒtÆcŸœ ÕÍp;‹cÑ!èA««¾° %ŠñÁb‹î[ICú±ˆðzõ›V&û^‡nH],ÅpVb¤ì8ŽØÍ8â(ÇéŸna2P‹#Öpš¸38È?~ü¯ï£¡k4Ú€ ?·»qЪ¢S}º*®‘óKÓL°:Üp—‡áñôɹFßý‡°™ÂÈ/sâH©Š2Ý9™9Õø~G5põ©ÌÚ•Á8½ÕFYLšŽRù{a­ÅåÍØÆ?(@ ä¼€ža™˜˜È°7w}Ô':êôïÚzðËÓzå/¯ôµåi½ª²NŸ^\ÐT]Ô§åïƒ:½²òýí»E}mqN飯ÔëžÌéúò„l¯Ô_xzÖ†¥¬|_øh|_œ~`ì¿ýÊ«¯­-èss ²}MŸóë7å¸_ ë^ï´>íUÛ?™{$ñ]|¡/K ÿýPµMwTÊú }ÑgMÛQ%Çý¥«¯^µ¯cÂX_ž{¥ß¼ýÊX_[˜Ó‡ŸÜ”¸oêÃ^¯>=1­/Ä™Tµ)–eýI]ÔDö1T=2âÑ¥VïÛa}Bêšóþ%>U†i¤’ú´a[¥¿šS¶ïô¹Œ-ëÊí…׈U_{gŒÅÅ¿ÞIuéc0|êEû±¬ÿuSúþ[ìœNÃG9ꤽ*±Y\[ÓßyßÉèŗʼn½®Ãß°¦ÎJýÑÄ‚Œ÷²þVõ­ê‰Q&S éÆ"^qšµsúEÕ^Ây¬Žô>¸˜tn«ó÷æpüÛ·Q}j‡µ¹Gr.ÔéÑq™ûK·uuÆ{Èùd¸Ê%ç÷#9*•‡¬{‡U9‰íí´î–ÿ£å3“ê\É|>,è·SôןP€ @’@îÌØ)¼S^R2o6› í·Á²Of´rØ ò121Éd•Éq‹ ¤L.¸8Ö0Ž¥Ruýç¨ÌŽ©í€Åzµ…ð«ûßd†Ë"å´Cn\¯°û‹£;Åörì7u"\.íËA_¸„Cy8T[u5Îb•Y‘ù÷2ßÄä¨Ì†Ýq Àh‚ƒ2óv·> ó(€MúckhÅ 9F-…%ÕÆ¬cµåe6t™Pn·r1Rzœ×xÙðÁ+^wÎÂÑ|Ùˆ'èBÓÝ>XKJ°?_µœŸP§YÖ%öí¨P3§²D‰ŒõM?`šÌEã²ÁYkC½ÿ_9TÖSÆÄËq5£4ƒ–úq¨#óò4È=Y²n‘ÒÅ`–Ì3ý€öëÆì,ìER"¾X,É×ý‚ó“bûªeÆV‘<{}£c²Äx†ÒŽE¼©4ka醲„ÙÛT†Vƒr‰2ëÆ¸#eR;ø<3²;ˆ§-õøã½ü'UéÆ"Rƒ«̪R6ŒE¬~R€ @D ÇûÆÏÂ*ñEîÊ®E¾K~ÝÿŠ$r!¹”Ô5(A&?èÃC ¨A¹L8øA’¹¤œQÊlZÔE*¹(½giÉ?ƒÿÆ[Ü7J¿Á6ÒN8kÏ„"0Ô7i$0ª°oäµW`ܘ‡íL;úûûÑßÓ ól¯\®SGI—Œ?"‰‚K˜›Ùt¾q`–âã8ªâצ_1$—uGµù‘^„\C[ãu¹Ü¬¤SÜ‹9¡ÂT«M¿U ¬?ù¸„‘¾y¨K€jIƒE.[ËÎýÇq¯»Ýòÿï×/ËåJ[$YS%E QË{b…ä3¾×¢ÎŒŠcä|ðöბâeŽ!ÓX$4´yÕ¨U¨Ó2Ý¢ž½5% ~iäñãÒJÞž¿_•+Áõ{Ýxþ¼÷~¿ŽSÎÃÈ7KŸJäüêž_Aø»ài"¤‚“^1៙”¿?™ÏÉOÇfT‰ü‚È?âÇs 6 üGÍßmÜû>99)ÿò.‹}ÍêOÿÀ4ôÎ'õÁþ¿|r_î7“ûÓn\†ïV+§n |öº–ªñe#øíå¨üAMÆ™ä­6¹GKÝf˜ô ¾U½èRRíF£s?FšN¢SÝh[lÕèis®'+3üt+VNÃÑͨÙôÃ7V8ýgèý N\},ØÑÜs#§ë!)(‘¤­ñäþ¶z I²i,¦¸ÿl„]¦öüO/¡Aú[LöSèv‰Æ·Ï%¹/.º[³E³»Fæ*3/AŸ']C8Ú܃šhb”øNK|†„fƒM”çW%Ögg0p²SIDrO^Âýj©ZÛxo ©äڬǖ*¹¡ÅáÍzwMøá¼g[Ðòcêb÷HÆc°ÉýumÆìSÐ?€“ ½ñ]jMüž‰ßßMpõÎûLò Cxu6u¯áqKšä¶Œc‘ÜLò·%´;‡ðÏ¢ñ`dtBïä|ˆÄ¦ÒݰˆŸiv3¢éã.ÅiTr6öðWÜãÁöÃy¸Ïªû$x*®/ç£QÉùu£ýJ#SĘñ\Á­ØÍ•ƾF”j4çd íX¬÷Yî…½$÷Çng†{>×ç (@È™ÄîsÆØïù.¸ñ¼¶8MqõÄ <¶`Qö¶³¨'åòÓö m§ãØÌ ª‡*,Æ%³ Å'SÇ žô5o38õä¤E’å#3j©ÚO>pËߌ'4åñàTU¦ŽAæÖ”ƒ\’´l³O[*v zòUžHÕߌ1d‹XÕ?ƒWPÿ²ϺÛ<÷6Öô‰ïŸêS¦óK¼7žâÏÉ4¡¬L¶à§V =ýg×ÿ”æPn¦(óLìÒò;ÝŽ©§#EfmzdÖfcÞ’®,·S`Ç–p_fíŠÛûQaÝñƾaAx~< “š .â_Ào8lšÈ&v*ñ÷wmžÊP»(@¯& n‰ÝéÉÖ¯,+¢(ðrì©Øíi3™Ûž¦ÀN0©Û UÖI |¯¹ùTì÷:šì(@ P€9-ÀÄ.§‡Ÿ§(@ Pà{`b÷=&ûB P€ @N 0±Ëéágç)@ P€øž¾yb’7_ðö…ïi4Ø P€ (ðß<± Œt¢¾þ'¸^¾ ,J P€ (ðÍ»¢#nô¸É;%åß\(@ P€ >[à›'vFäòЍðÔìúKë?»7,H P€ rX`o$vaùÕòXÂj»N P€ ¾T`O$vÛAh˜Bý±KðÉKã¹P€ (@ l_`O$vÁùI™­³Ãýß6Øùžïí"KP€ (@؉É$‘˜l°í3sP(@ P€ >S`O$vùy˜ÊËÀɺÏE£(@ P€"ðÍ;ÿÓK¸ÚåCE™Æ¡(@ P€øÿ貤+?99‰²²²t»¹ (@ P` |ó»=dÁP(@ P€ @V 0±Ëêácð (@ P .ÀÄ.nÁ5 P€ (ÕLì²zø<(@ P€ˆ 0±‹[p (@ dµ»¬>O P€ âLìâ\£(@ P€Y-ÀÄ.«‡ÁS€ (@¸»¸×(@ P€ @V 0±Ëêácð (@ P .ÀÄ.nÁ5 P€ (ÕLì²zø<(@ P€ˆ 0±‹[p (@ dµ»¬>O P€ âLìâ\£(@ P€Y-ÀÄ.«‡ÁS€ (@¸»¸×(@ P€ @V üœB½ÿþº/1IEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/16_fields_snmp/000077500000000000000000000000001516513262500262645ustar00rootroot00000000000000161_snmp_versions_create_list.png000066400000000000000000000655511516513262500346010ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/16_fields_snmp‰PNG  IHDRUµЪ­bKGDÿÿÿ ½§“ pHYs  šœtIMEá: æ¸' IDATxÚìÝwtÕÃÆñïî&›Þ @¡H ½KïE@,¤(RDÁ† êÏ*о*‚‚JPéJCïMz ô¶;ï &Ý@ƒ<Ÿs¼Ô¹6o—üku,ƒmQ&êºpé3VuøÑÁý; ¬ò½î–vt9kbC¹»q9Š@@‘RÔíP[Ä/ìJ°R®]+ŠìšÆ´5ljKŽáÐÒ©Ì?a¬”uøZá°róŸlò,ÅOmKQË5ûPõ¶ânOá«e >žŽ>¦.""rk¨[¯j–@•ÆÌåÛhüý¶,Ÿ±²Ð¶I^(Rð$å{ÏKÖ‘X±µ²ýÊ¡ Ÿªm©Ê.GÄâZ¶+#‡ÖåÜìÑ èó,Ÿì(O¯Ž!X«“× ƒ´ØSÜ¿ø'ËT$¢o–´©Èøæ•™ÿà]D=ZOB\зT‰ˆˆÜZ¶mÙÈ3v²}(=Û‡×3YúÛÞ¿Žßþ3†qK¯`™&¬¾)åºyû3 V)z†xSÆ 1ãY¸ïJ Vk~"""·^fpõ¢C±LVIËþ¹i‹;­ƒÍl<™Lòõ”¯P%"""rýô½à"""" U"""" U"""" U""""¢P%"""¢P%"""¢P%"""¢P%"""" U""""7É-ÿê""""…žT‰ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆˆB•ˆˆˆH! Ui'óxx8ááá„wͪ{ÞwNÙÅ\ÚwÐô£däc[‘ÿP¨Jãø¯‰ýëŸÆAVDÄb×¸ŠˆˆˆBU>¤a寏,?08¸r;1JU"""r›q¹žS¯ds€Uj»³7"®`{L+Ú^×28¿qSæýÎÎ?“ð½£mºÞ…-Ç’ó³­ˆˆˆÈ-ªR8´r+‰þMèÞ£“"fs†C¬ˆˆ¡u»À,Á29»t,ÿÜAÊåŸDÝÄœq[1]Sn~¶) ¾ü—t€[“ð¯ß‚ eÒ<øÒK‡WþAt–%@#~+S§_IwñèKc;ºmW›ŸmEDDDnñPe´9¤øS¿e9Ü\‚høwªâhÛßÛXÉÎ4Z<5„.u+R¡vg?Õ ß«ËÍó¶""""·z¨2’Ø»b;©þõiYÎ p!¨a3.Ū#¬Ü}ù3P6.žˆ¼ôu ¦ÒÔ½ÃãÊ2žGÙº”ζ¦—ŸmEDDD }¦ÊHÜÃòíi—þ·œÑ/¿f›£«¶Ý®#Å-`8Z·3™1› ëº^~¶), ð¤Ê ~÷2veä²ÙÑUl¶üB±'‰ø3õJ.J=ÁÉl_¿ŸmEDDD ü?©2.²sÙîKKtµytÈÝ”rýûåÌ kùbò:.rŒU[¢èйÞw¶¤Še'»l üúÉÊ ºÊæÃ,š´œ¸l…›ò±­ˆˆˆÈ-ªŒ¸,ßséÓRžuºÐ®a <²næÃŽyëXÇÝBÔÝ÷P" !ýz.eÄ·ȈÞÀ×oopX¾)ÛŠˆˆˆù^þ‹Ý¾œ}vwj´ ͨÜÊд–Ï¥ÿ?þ+[.Ø+eî{•÷‡t F\pÅ¿l}ºx–»Ü¯. ?ÛŠˆˆˆ&Ã0ôÑo‘ëdÖˆˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆˆB•ˆˆˆÈ”ï琢ը‰ˆˆÈ^@@@¾¶×W*ˆˆˆˆÜZþQ¨Q¨Q¨…*…*…*…*Q¨Q¨Q¨Q¨…*…*…*…*Q¨Q¨Q¨Q¨…*…*…*…*Q¨Q¨Q¨…*…*…*…*Q¨Q¨Q¨Q¨…*…*‘BÍ埪è͇ÂÙaÏò7‚+4äÁǦyLÎv¶]`óÂå6BiÛå.Šç£Õ™g~àù§grºÒ3Ly»Þ~fø“_ógù'˜4¶EÍ7§^Q¨rjùÿ½Ì²©×¼bÆ3´3C¶ ¸ÅÑÞ>TmR‡@s:q'w³cÏ>yñ8I½F§’Nš’Åæ`µ½5;^_¸1¹øS&´4®¥ýp1å–Èn\½"""¢P•-öÇŽ§åøšG[.µUäþAOQÛ0Ù5y¯/ÝÏÜÒúɲœXø_.ØÌ±¸ LžATký0ƒ»‡°úÅWXðÿÉÿ¾„ÛŠ¶}¤Q®ÁÇžÉÑ#'9m¹Ü#…£K§ðÅ8“†‹O5Û?Ìã±ê…ìõÎûöyÍÉQ¾?SÕaø›<f½æçîÕûòÖó­œ<¥ºŠÉ›ÊíZPHØ»“{¦3vú:޻פÃý÷Ð80Š]‹>bR„'í† ¦Ž;`­ÉÿëM™?l»%>‡'hÎ¥ú–1“Ws˜êtyèš•ŠaÛ÷ïñÁJ3m®ªWDDDÄ‘|?©2y”çþQoÁ;/3c_ú•@õöÈΔu3å«,‹w ÞÀùä’<êÓëñJÔl@yÛi¶Ç®c݉Xb£3𭌯 `÷%¸t1¬êä¼mT2v|±ä£ 1§‰Lîø”¬I«¦wÑðX$ö>ø—ÊZoq͹q¡*k°²|ø!Ë]:ñ³ó¨l‰Q$xÅÏσÌdú—Ÿ“Œ+¾¾™ŽjÇÍטcζx*÷ËðŽeI\ðOÏ<}ín¤sôû¼m›;;‰gcñ­õ¯>DÆá­lX½˜E[—ñÙge©öZ™,õŠˆˆˆÜ„PU ™‡øqâ'ünNçâ©=l?–Êt{ –6 “Ó¬baLÛŸÎ’f,X]€¸?ùã£TOw¶m¾’ »gòîôc¸WjÃ= Jâæçƒ+‘Ø<=q5g¯·Zãòš1"""’£x…+=ëÖ°æ· l?c&¸ZGžz4Kzú@_Ú”ó$a×J~Ýk¥e¯šX³ûˆµ„мuE<9Á‚ ?cêäd[[~Úc!¸Ó†w­OñȵÌûö[æ­Ž¤xÝ®¼øTcüݲÖ;_³EDDD2†¡•-‘ë¤Ïb‹ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆ(T‰ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆÈP¾¿Q}óæÍ5ùÏkРA¾¶×—ŠˆˆˆÜZþQ¨Q¨Q¨…*‘*ß_©p&]ƒ&·Ž`«æ¯ˆÈ­z;ÕèI•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆÈ†‹†@JM^­AùœÐR¡Jäva<ÙRƒ "r˜&ü·ßÀjùODDDD¡JDDDD¡JDDDD¡JDDDDªDDDDªDDDDªDDDDªDDDDD¡JDDDD¡JDDDD¡JDDDD¡*¯–ËÊ?Ó¯ùyæ©…|óÎ'ües^@ÆI~ûd<ëÎdÒá2 ýO~ûv2ÀÐü¹-Ùb¶óÃG#Ô»ááÝèýÄp>œ·¨ÌË$oáááô~o1ö¬Ó'õ/?̳?žÁ–¸WÂà 4#WŸ2©ûø¼8á=Þ!"åÒy1gh8ááYÿ{˜'F}ÎÊ©ÿÚׇò=®ÿüP¸–lËÏÕ#¨ˆEóBDäŸ Udžæ_öPgH%ŠØ8±ö'Öo;L|šϺ4º¯¡Þqìún&ûR`æg¤=8˜Öw¸e+Æ¿…ÓŽSµ•ÖFp梉"UÚÒ¦S=\mÄï]ÊꕜKÈÀä^”ú÷ЪÉX·°`êa*4peÿ¦}ÄÚŠP¾e*&­eýæÃÄÛ‹P¾M/ZÕ Ä‚Aúù6þ²†#§/bó ¡R‹.4ªY·òh;“_6§âZí~š*PÝvŒ¤#l=éKóA¨t)õU½›ÇžåËçI²—ÅÀZœv÷”bý—ù-l$-s®ÜUÛÌÖåGx¤R<HæÀŠ]ø4©ƒå#[³¸yâåå…ð kÆí`É«»9–`pGS–%†__ÊwÞäÿú†bìÑ«xå©y„½ý1ÜáBÊŸ«˜:i.¿ŒÂæ_‘=Ó¯u¬ÑKõò~:wwcÁ7» ñ µ·MfÊ/œKq!àζô}¦/MŠ»@ÚaæN\ÏC“êRq»~⋯±íDÖâa´ê5ˆ‡›ã½”Q£vÓ©wVÌZÅÞ &J7éÍóO¶#ÄKÄwr._Däó?:J?¾˜U˜¨Þý9}ªµ]wòÛÊã¤[ŠR½{/Â|ü¨ÚkÈ5êÊý"i[Ò¨ß <Ò§ž‡—³ùD*FÒ^Öþ¼¯æ}éõì t»·2 ³?îÒ’£=ñ{âkp÷ aÜßăcK¾bcZCº }‘ûšxðçoˆÊ#å(ëg-%®ü½<øÜpÂ;–æü²oXw<ìÉ\L¯L›Þšy»&ÐíÆäJ½2Y9q?¬ÛϹ$füë=Æ‹ÕÇßü÷“¥"ç‰ê‡˜òù.ä¸òíJpÓæxn_ÆÁäË¡-qË÷кaq'ïx Ò¢òû²$ú–%ØËtÕY@­vHؼŽSvb"Vp¼XkZ–vÅHÚÉ”7§rºÖ`>œú5>q'‡&¿Á”I€=v#3ÖzÒùÙh7–BçW&òõ¤7èê¾–/¾ÙCÊU-²E­áãw"£õp>›6…1½KñÙ;Ì=–véü‹ÛÌìÍ!ôo2“Çô È¶é|»;™ä“óT¾ˆˆB•Ã{Bii˜½JöàÓùŒ•ÕžÅûš3°8 ÛòÓÒÝ$Ô c×ò#·{‚"–ÓWmh!¤ÇëŒh€f«7þž¸88iL~ÕiWé fmVž-ËÝ ‹cÁNâù8RÏýÀÈ> ÿžã™é˜«&’n.þ”ö¿tið¬1QÎ燩/Òç¬;å¶£K×.4ñÉú/;‰Q‰XKá{åÔt£Xˆ7)G.…I‹¥ü]®œ·qÎÊ7iº‰ˆB•Ó[ ñ˜Ë¶¤CØÎrbË"V×àû)™—«¨‰.¶©`ñïî4îÙ Å<1§aùç óÙ>3®Þ¸ïÀƒýâk¾T¶-9žT¼4[„äˆ÷8ÁŸQŸ ¡ªÇ¥ðÖš^gË‹[Ù×;¼³Ï)ÿñd½çøèÓåtÍ4® KõÛ4w)'RùõxiÚ ÀsíÄ·úR¢D`Þ/›|©ÞîN&Í\ÇnÏíDV¸—ºEÍ€g€7îeûòÁ{)aù뼌&?|ÒVÉ„åòÜOŽÆ¥j7F¶ëCFÌ1¶ý<‰ÏÞŒ¢èçC©œ¥ÞE½°m?C¼­.žÀH'úLîÞXˆ“ ³)‡ó6:ÆaùUÜ4ßDäÖrƒ° li)¤¥dù/5»‘å"zx! ¾]± É®žxxY1g½Ï™¤gäÿÃJöôTlf+®.{œƒkWðgr©)™ùø•så’ø;›¶Ÿ!9=ÄSÛXõåD~?™¦Ù"xÞÙ‘Æ–5üßg?²åð¢ãb8wt g,ãB‰ÚTö·äô؈zýŸä®³s˜uøÚ¯1­CûÒǘóÕ\NÜÑžš~7â ïªí »¸˜)ߟ'¬cM.k¯æ=ÔŒ™ÏôUGˆKK!êà þ﹘¼÷êO2ÙIˆ˜ÈèW¿fÉ 7oüÜsGŠ6èDÅȘ¶ü0qiIœÙ<›i^4o_7'׋¼•/"r;>©2Ò8>o<dzÝ1BéðXå¿ßÑV¿—F§æ³nÊû¬´[p/^‰š]Ûdìþ”*çÎêãÉèñíËçõ­ª JwSoÿ<~¸ »gå4§eÕü¶ðg*>\6ï·"¯Ê4¿ÈïKg2kI"†g Ê5ìIËJzR%`ò©Í€7žcþ·ßóåk3ˆI5pñ*Nùº]ù¿.”·™9=8ªK¿!-ØñΚ^  VûP>¿ŸÚ#ªác‚ñMm&ï*´«fgÌîÚ ®ê}å ¯É¿ƒGFñå—c<)»OYîº$CøbŠÎ–[êÇ[sOYØê,äsÇùñÿÆÕHâð¬Wx¥Oo&lŒÇ(lô>÷  Èõ°Òç†4 ÀlK!öô^6Ïù’^>ËwPÉËtóOâ ¶tª–Û÷B¦1¸½odÿöñÏ<ÏžM§¸ã¹‰ô«å…I‡D¡JD „ÅÍO//LxááÛœû^ð!~ØX¬¿ŸçÚ·a*ßÌXÅјtLžÁ„uHï.EØüÞÖÇ&Â[Ï4ìCúTw%:§m¨†—³gÊé‡Y2y=?©K°-–½ó&0oYQ).øVjK×!}©pž_¯®¯JjÎÛËé²é°m±Kùðµý´ wcլ݄¾ø]gþ”¹l;…ͯ" L×–ep»ênc^ÊøW·Sïn+~ÞÈÙÌ’Ôî9ˆqß3oqQ¶ jõÅ£m‚qqÖ†,c½”ñ¯î¦y¯"l˜³ŠÃQ&J6êM¿í(~¥æTOÊTû³¼<¸î€-rãF®¡á»ciQ<ûÍ9óä,Ƽ}†î㟧’`;ËŠ—Fp¨çD×Hs2Ž©'Vå<¤q~ýtfÎ^ÍÑXW‚êÜMÝGÏ8÷ÝˈÍûq4œÕ頎뜫©»Þç­9èReKWì"ÆLXÇô¼·:ÞqWÏ÷i—ú s¦/b÷ɬŸ«û ºÜåNÄ[CY\þM^îŠ+`YÅÇÃæúÚÇÜã“åpÚGÇÇÃ5檶 {…°ˆÉ¹«-Š ãÞdåùøxSž|ŸÇê{‘°ç§kûÑ(—«ëyñC µf-ø]?0kúÏì;„5¸>í’¶wzc+È<Ìéܯn%ÞIûòrNöo¬Ë´ü'r£c–Wkypö?I»¸™_lÀ?ü ^Ÿ4™QC½`2¢KÐjøK4¤ùËÓ§º†£m#my®;u÷d¦­€–#'2æÓ7hï¶–ïfî!Õ%øšún›C¹¹µÍˆÛÈÂß=i9ôÚÙǼ1S‰¬1˜‘_|ÍKîäøÔ7˜·;)Çe{ì~‹iÎã¿äù¼Ù1åeæ§tæéO§0ìovÏ[ÈÉ4ò5>ö‹›Y¼5„ßžÌ[oôÀ/b: öf]ós'¤YMع–S©—nd±[%ªt{jæïi‡³q4’v:‹ôãó˜8q ]_çõ ïÒ­ÂVìIÄžÏñÏÏqÌpR§qçjê‘™,¹Øœþã&3zhR¾Ç̱WÍVžë™þÁOd¶Îÿ¾œÂ°^¥Ù;é–œð$¬u’¶®ã\€‹ÛWp:°5 B\óÜGœ«ÛÒäâô¼«%F/¼BëE¸käÿ1 ¾/öè59÷ãxÚ5çKÛÒÙÛo»°’¯Æ/Ç£Ëk¼1ñ#ú6ŠgùGÓ9’zãÎ}[.íËË9) U"ÿ žØÈð¨A·ÆÐ£E¼½ñö÷ÇÓœJ|j7Ï|lë„aO#9)³_EšûŒÑýÃp»Þmsi›a*F£¾½hP­,.~d‡{'º·&Þ>¯Ûƒna÷ê£äô‰Ã-”Ö]jàáKHz³V¢}—šø{øR§6ElI³ço| Kºµ¢”·¾åS?Ä 1!«î9 IDAT=[`q¿£%•Œíl;‘¶H¶¯=OH›ºøઘó8$íšï`,östÕ¯$TéG×–ð-AÅNhì òÜÆ?OÇ1SNê4yÞ¼¹j²Öà¾^- ð£XèÞуKþà¢=ëÜ)±óŽ>HxûÊxùÔ '÷WgóŠã¸ÕhO¹ÄMl?“ööýz’âmš’ýÁ‘ó>&:<GÉÈ6ËáoÍß¹”õISÜÖÅúqŒô«êñ³š²=‘¼ðû"N–îÉ}ÍÊáë[Š*÷¥WתXmÆ :÷óо<œ“’3-ÿ‰Üp6Rb“1{û`uu!nÏ,¾Ÿ¸Ÿ¨ žE<‰Ë„²9Ýx\\HÎã¶Ž¸WÈ ^óYöÍ‹,>çNéíhu_êøX¯ùœG~¶Íµm.þù¹6’/Ä‘ùã_x¥#3sX"™×,b²âi½&ÌfÌ<]/md2› 6>?Jøýuy3aÊéS.hP5“Yëþ$Åg[b*Ò¾V@ßi`¹Œ£ÅÉXÄ‘œŠgH <þzÁ%€R9ß²õ=ïÇÑNJ”“:ó1¾ù«¿²½R©+þå1¯‹$ÙV4ËÜÉ 9*KÑRxÿõ°ÐäF‘RÞ¤MÀð­N“ _°hóY:xícù²4kP d ËÎúh#ÅÉÜL7²ÎãüW='uÚ;Ùë¹úÚ‘x. · ,íw ¢V» K‘+¦ óðÚykûòxNŠB•ÈMg$îcýö‚Ã˱õc>›ïEøKoR·´–Ô|õìÄoÒIyÞÖñ>-&K•n lÓ‡ÌØcìùe3ÆFáÿñP*äg[·|¶ÍdÂb¾ôðÛÝß·2}ñvg.­¤d&D“ˆžþo>ÇÇdœk]”kQ•ôÉkØåµ‡øJ=©ìkröàï›wæEÎ'ØrÇ!w8ÄÍûŽäÓ‘¤åñ6¶x"cÓóÙ÷üG3žÅ=Ö™tçª=ñ,ñ鸚€L.žŠÁæYKö¹ãYÔ ÛÎ3$ÚêânŒtâÎ&áèÙäK¥6w’øÝ:yn'ªü½T-rõ ÞY͸9™›^髲´%?ãʵmpÖb²Ô“þEÜI?MªVy]+ÿÀ­a[Êh^}îç¡}R`Šœ"ס°¥%“œ”DJ|g÷ÿÆ‚>d›[[º4. ©‰dšÝps…”s{Ù4w;RHŒO¿ôù"#ƒäËK&¶Ü¶Í•¤íÿÆ×l?™€aõÆ×Ï=ûI~¥¾DÄγ¤f$p|Ùw숷ç2ŽÎÆÂFpëVøí™Æ¿'>9†?WLeùI[>ûžJbž£¥Öiyçª=e óçl&2!‰˜} ˜»(šÐW/µZð¯×‰rç`þªÃħ%q~ëlæïð¢^›òX1áÖžÐøÅÌûñ<¡jâcÊOÏMS~Ï%‡rë‡3®oÚ–bGgñóÆS$'GqtÕWÌüa7sçáÕçþõ´Oô¤J䦲qjÚ³¼4íòÍ×+ˆ²µºóì°NÜáeƨןΛÆóÍóýÈô-GŽá<Òö;fOü’ƒãúP¹šß¼=ˆÉ#&ò˜³m?|Ž;=r¿˜4{’®>aî¨þLµYð*]¶Ïô!Ô °Ë^Ÿ³m¯JNÚv`t•ì[û5 çóQÌùz ¯M‰Ãð)K.#y¸žïuüªyþÚgž•¸+Ì…íûjÓäNo‡í³6ãÁû·òÍ„§a ¢B«ît¹óOvå2æ&7Çca¥+%2cöh^žd¡x­{èÒþkóÕ÷¯h0&¯Ç\Ë8ªÓ„ßMœ«.-¨k_ȧCß'Þµ$a†Ó«i 渫ǹ%}‡Å0{úÛ¼úu®E+SÿñQt¾Ü“wšT±3iomz†å|¼÷ÑùÜÌþ€&—s)·3ÑY?ryäRê I`ÖŒ—ùI*î%ëÑö™Ç ó6aö*Ø<¼úÜP³àí“\®T†a¹]œÑwßI6©þâ)¦ÏñòUp׀ܸÞõ>¯O-ËÓc¢¤«ÆCœ ¾Å•iùODnKFFqÇV³d‹…ZmB¨DäºiùODnK釧2nÌvŠ´Dûòn¹nZþ“ÛŠ–ÿDD /-ÿ‰ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆB•ˆˆˆˆ(T‰ˆˆˆ(T‰ü§¤šÄè^O±ät¦ÓíRwŒaċߙÃföÈŒ}ìMö$ß&ƒ–v€ÙC1ïHA¾##…õã­¹'ÈüÇüOÔùoôËù¼ü·æ¶ec¤ñçwOóÌccÙkÏöRæéù¼Û»7_¬‹Á®Ë¥B•ˆ8çÔ–îOõ¥F€Eƒ!r;2¹Qöþghç¿9Ó6ÿWz²cýä9DWÀC ‹è†}+\Ï5"³éõ^,.ÿ&/÷ŰǬâãaó}ícî-g"zÃT¾™±Š£1é˜<ƒ ë8ÞTÃ#v)¾¶Ÿ–án¬šµ›rý:p|òV:~R—`2îgÈŒeÏÌÿñù¯{ˆµ”$¬Czv­Oö·½¤žXÅü)sÙv( ›_E<4˜®-Ëàfeï¼ Ì[ATŠ ¾•ÚÒuH_ê»öRºë}ÞšS.Uv±tÅ.b,Á„u@Ï{«ã—½¡/~@g×ß P§ã¶ºÆ,eü«»iÞ«æ¬âp”‰’zÓ¯Uö}0†õ±‰ðÖ3$ û>ÕÝ÷™4ίŸÎÌÙ«9ëJP»©›âè;¿—‘÷±Ãp\§=z)ã²Ýû´Ký…9Ó±ûdÖbaÜÕ}]cßíøøšõËFüžŸ®-³¬}éy"ÚÿÏ·+gç3öùÐóÿÙ%ãÂ>xa 5_hÏî‰û®ûíÊéËÌK?‹ƒv4 "uÓŒýÆ“GÆ>IŸLÎ-|…ñêóìkRÒzcæp¡o[Vn¡´Ú•/OâÇíUè]Ç‹¸ß¿dщj„¿×‡í Æ|jcÞ>C÷ñÏSɰeÅK#8Ôs"ƒk{êb­'U"…_Xë $m]ǹ ;·¯àt`k„¸b\ÜÀÌ/6àþ¯OšÌ¨! ˆ^0™ ‘¶K÷ܸ,üÝ“–C_ ]™¿ïR¹í—¹„õ¶N<ùét^Ö’ô_ÞgÚÚ(lYïçI;™7f*‘53ò‹¯yiÀŸúóv'‘²{2ÓV@Ë‘óé´w[Ëw3÷ê ©Gf²äbsú›Ìè¡MHYø37Æb\Õ‡6Eö¨Ngm5ûÅÍ,ÞƒoOæ­7zà1ýi5ü%ÒüåéSÝÃi9éÇç1q⺾ÎëÞ¥[…¬Ø“˜ãRгñOÍÇØeäRgÖ±k幞éüDfËáüïË) ëUš½“ÞaÉñ4§Ç ÍIöè59—yÒ°zE¸°å0ɆAâ‘bLp>â0‰†AêÑÍDÔ§J %ç±ß›óú²£y™é¨Ç3ðm0€ð ÛønöNâO/eæ"h÷ä½”´ÞØ9\˜Ûv5ë]yô~?"¾ü†½§6ñÃŒƒ”ë=ºE-ض7Mc…*‘[ŸOö”KÜÄö3`a߯')Þ¦)Å\Ïôxk =ZT ÀÛo<ͩħ^U¦b4êÛ‹ÕÊá—õ.û™Ýës·÷ò$ Ê½të\”cË·qÑþ÷Sª¤]óÙáÞ‰‡î­I ·Åëö [cؽú(é€aO#9)³_EšûŒÑýÃpô—ïLÖÜ׫!~«ñÝ;úqpÉ\´gíCY\üX€:·50,A4êÖŠRÞnø–oLýƒÄ„tŒ«žÌ9.g?GWýJB•~tmYßTì4€vÁ.}¹·<]§r©óï±+±óŽ>HxûÊxùÔ '÷WgóŠc¤;<Ø»ÂQvb·.vPæIüëÔÄíÄ&Τ¦r6"’ N(vfË¥oû÷šõ)fÍëØãd^næøæÅŽûf V¿Ç(½íC>zgÜ;”–!®7|æ¶åð¸ŠÒ÷>C;Ÿ5|ùêGì/Û—îÍŠaÁFÜVÇíÍÐå¸ÐÐòŸH™|«Ó¤Â,Ú|–^ûØp®,Í¿´LçâBòžY|?q?Q)<‹x— e¯œyþù]{ú™rÙÏìWš7Óå¹â_¦(–ߢI±y_þ™ä q¤EþÀ¸Çò×–Ff:æ°D\ª dP¯ù,ûæEŸs§tƒv´º¯ u|¬W¶ÍÊâW–¢Yê+ˆy]$ɶ¢Yú`+`§û¥€ÅWÆÉ„)ÇV:ës É©x†”àJ7\(˜ómÎÙø»çyìì¤DåRç•±Ë 9*KÑRxÿõ‘:“EJy“z4»Ãcp–¨ó©x–É©)NÊ´„4$”‰ì9qÓq/ªvjBâæÏØwâ$–C&* (•cy{góòÑ‘Îûfö¯GûFÓ·²4÷4-uù†tcçpan[ιêZ÷kź7÷Ѽo ŠZ.×ëä˜^û9|ôg}ªDn±TE¥6w’øÝ:yn'ªü½T-b¾ônvëÇ|6ß‹ð—Þ¤ni,©;øêÙ‰Yö5a1_{!Ìm?ûœĦ”r5ÄÂî×/K•‡ÏîþÞ¸•éˈ·;h¹TnfB4‰øb‰9…¥J7¶éCfì1öü2‰c£ðÿx(rÈöijħàj2¹x*›gQ<,YûPÐ:‡PÜá~~x¥¯“ s®w#gõ{7ï;’OG’j”ÇÛØâ‰ŒÍé·¿AZLtÇÎŒgqOçuf;Ï¢^Øvž!ÑVw `¤w6 ·@oÌAƒÕaÁÃY™î!Ô)ŸÌ¢õë°d„^ªiåRùiýïR.eÝ!<޽³yÙ”b%¼°ísܷ̳Ëù~½;•‚òӼ݄õ¯Ž‡éÏáBÜ6‡7foÜ\<ðõ4ÿ=§œÓKͰÿ½¤y‘ó 6]£ÿZþ)xªÂ3¬=¡ñ‹™÷ãyB;ÔÄçòMÈ–šH¦Ù 7WH9·—Msg°3!…Äxç_àl?°§neþœ œKH$z×|fÿ’@•Îuð5ÿÝ&Ÿ÷P9v>?­>B|Z ±‡V0}ø ÌÝŸDÒö‰Œãk¶ŸLÀ°zãëçîô"`OÙÂü9›‰LH"fßæ.Š&´C]üÌÙÇ¡`u:Û/%÷wöFÉ©¶\ʱܺ~{¦ñãoljOŽáÏSY~Ò–ÏñO%1ÏcçF©<×iÁ¿^'Êÿù«Ÿ–Äù­³™¿Ã‹zmÊcux ÖÖQfœ•iò¦\£Ò\X¾˜¨àz¹yR/˜óË]º)e¼Lù>rž—õ)[ßI;2N±æóï±Ý3œÏ?JàÆÏùy2ƞÅ¥möDNm[ÇîIäÿ’óyâæî5ù;Ï’š‘Àñeß±#^_À 'U"·Z¬ò®B“*v&í­MÏ0ïËAÀ„O½þtÞ4žožïG¦o9jt ç‘¶ß1{â—]ÅaHs¶_;àQáaZ±ˆÏ†~H¢{ª?8Šõü0_ÈRŠ_z>Åœ¯ÇðÚ”8 Ÿ²Ôè2’‡ëà‘ö$]|ÂÜQý™j³àUºmŸéC¨ƒwÑ.-¨k_ȧCß'Þµ$a†Ó«i 渫Z^À:MnŽöó…'ïZŒÊÕ¼øæíAL1‘5—c¥+%2cöh^žd¡x­{èÒþkó5þ_Ñ`LÞÇεL^ëK`Kú‹aöô·yõë\‹V¦þã£èê†}·ãcànv\‡ÙI™^•S’}uîÀÝdÂT±Å؇µaåKO½òÉѼ´˜µÃÌ™…ÿDzŒÎ<Ó!wk=Ã×ðÞ¤9ÔÓ‡ò7pš¶¥G²ù«ñìj6ŽÊe¼ò}óu6O,4ãÁû·òÍ„§a ¢B«ît¹óOvéýÏß C ¯rû8“®1È«Ô]ïóúÔ²<=ö!Jºjÿu±–’„uèOÏ®µñ:ãà<îö*•—d?æ}ª{èò}“hùO¤ ‘êÂJ¾¿.¯ñÆÄèÛ(žåMçH*70ó‹ ø‡¿Áë“&3jH¢LfC¤íR˜¸¸™Å[CxðíɼõFü"¦³`oÎk öØ-üÓœ'ÆÉóx³cÊËÌOéÌÓŸNaØÞìž·“i7¶Î+÷Á\ʼ–;!ÍjÂεœJ½æê‘™,¹Øœþã&3zhR¾Ç̱Øóxn8½6äãøç$#r ëmxòÓé¼6¬%鿼ϴµQÙÚF^æ§(T‰&~_ÄÉÒ=¹¯Y9|}KQåÞ¡ôêZ«ÍÏôxk =ZT ÀÛo<ͩħ^ †%ˆFÝZQÊÛ ßò©b˜žãEÕp ¥u—ÚxøR§Ŭ•hߥ&þ~„Ô©MÛEÒìÜÐ:¯È¥ÌcÕ-©dlgÛ‰4°E²}íyBÚÔÅÏÁÕæ¦÷Ïá~©œ]³„ó¡poã2øx§Rç>4 ¸ÔФ]óÙáÞ‰‡î­I ·Åëö [cؽú(yúdŠk­º·"ØË Ÿò¨[Ò 1)ƒD'åf\=6¦b4êÛ‹ÕÊág5e{J•”K9ùšcÙêÉ[é€aO#9)³_EšûŒÑýÃp»ÁãñwÛÊâràÇ“üŒ‡ÉZƒûzµ $Àb5 {G?.ùƒ‹ö¼œiN® öëžWf÷úÜß­Ž< ¨r/Ý:åØòmÄÙuM. ´ü'R@‰ç’p *Ç_÷:× jµ º|w!yÏ,¾Ÿ¸Ÿ¨ žE<‰Ë„²ílñ£„ß_§Ÿ Nžû›¬xZ/'³³ÅO×KÛ›Ì'“˪ӀËg=×2sâQU3™µîOR|ö°%¦"ík8~w“ûçx¿LÏ&â\ìïe×"”ôwå6’/Ä‘ùã_xe¤ŒÌtÌa‰dä¾Tcñ¥¸¯åJ{Ì&`#ÅI¹éWßá]ü òËé2mwÚ¾t#Ÿs,Çzœ×áRm ƒzÍgÙ7/²øœ;¥´£Õ}]¨ãc͹¦‚ŽÇ•¶]ç1ÉÇxXüÊRôïÿr˜×E’lóÎÃ|´9¹6Ø8óÊìWš·,m+SËoѤØLÏcQ¨)ô<‹¸“~ šT¬& ó»Vþ[ö”:ø1ŸÍ÷"ü¥7©[ÚKê¾zvb– aÂlº‘­1HÚzuö¿—2/r>Á–·2sNU”kQ•ôÉkØåµ‡øJ=©ìkú×ú—èp? žE=H9EºQéò1¼Hd|&`ÆÃß·2}ñvg.­\d&D“ˆžyéNŽí1ãî¤\¯ôU×”aÉ1桜ü̱ëqV‡/–˜SXªtc`›>dÆcÏ/“˜16 ÿ‡RÁíŽÇ•¶9ß6×c’ñ°'ž%>ÝWÉÅS1Ø<‹âaIËÃ|4;¹6´!è:ç•ýâIbÓ J¹š€ âŽGa÷k·åœƒóXþIZþ) âMÛRìè,~ÞxŠää(Ž®úŠ™?ì&Ãb–šH¦Ù 7WH9·—Msg°3!…Äø›÷+Í­Óìî5ù;Ï’š‘Àñeß±#Þžk™ÎVÜC[S1eóÆR¡mÕ¼…›Ò?»Ãý DË6=8ƒŸ7Ÿ!%-Žc˾eS´ 0áSã*ÇÎç§ÕGˆOK!öÐ ¦¹ûST•Arjn713ÞNÊÍû09o_®åä©­ÎêH"iûDÆ¿ñ5ÛO&`X½ñõs/À %?ãQ€cR@ö”-ÌŸ³™È„$bö-`î¢hB;d_Âv< Š9¼6Xœ÷ÁžÈ©mëØõg’ÃóËžº•ùs6p.!‘è]ó™ýKU:×ÁßÓñyœ÷c.zR%òo<¥îaÀfÍx‰‘Ÿ¤â^²mŸyœ0o3¦zýé¼i<ß<ßLßrÔèÎ#m¿cöÄ/90ºÊMh ŸÖilƃ÷oå› O1ÂD…VÝérçŸìÊ¥Ìz#B<Æ«Ä]a.lßW›&wzcú×úç|¿»>Âãƒ.2}úóŒ˜àÃ-»Ó¥ê16[-˜üÐóù(æ|=†×¦Äaø”¥F—‘<\Ï÷Úþ¸£r5/¾y{“GL¤ˆ“ž8)—˜|ŒHA˹!m À#íIºø„¹£ú3ÕfÁ«t=Ú>Ó‡P·|Ù|ô#_ÇäzÎíÀÔµ/äÓ¡ïïZ’°NÃéÕ4KT^çÕP×&œô!㛿ώÆïV¶|Ž!Õ£ÂôbŸ ýD÷2Tp=êùa19:¯=æjêÃê7‹É0´è*·3úî»H*‡¿xŠ©Æs¼üDÜ i+íqðœ?¡•Š]Zé±cõË£9ÒëSÓoIÝž3w×û¼>µ,O}ˆ’®ÿœ<»˜YÛkУc·ã7l[oíökùODn(##¸c«Y²ÅB­6¡…6PØã61ç½Xsø"6#ƒè­sYy¡<µË¸ë@Ê?ÏÍžÉÔ¸«$úÊÒ[“–ÿDä†J?<•qc¶S¤Í Ú—w+Ômu)ó ý»ÁŒ±(Ù„{`Uš=5˜Z~&HùçYŠRýpÃ-LËr[ÑòŸˆHá¥å?Q¨Q¨Q¨Q¨…*…*…*ùwÙ#0ö±7Ù“œÓ«)ø¨oÍ=Aæ +³K;Àì!ƒ˜wäF|YÁÆ.ë~)‡&1º×S,9ù/õ© }¸•æøM`$qxÖ+¼Ò§76ÆcÜÐy%·}£ºˆH!a jK÷§ê ?RrKÉ<ÏžM§¸ã¹‰ô«å…)í¬ÆD¡JDòãð¤Lµ?Ë˃«áØ"1nä¾;–Å!~ÏOÌ™¾ˆÝ'° ã®îƒèÒ(ó©YŒyû ÝÇ?O%Àv–/àPω ®íyU-6âwýÀ¬é?³ïtÖàú´{üIÚÞé [êx"8ë;ì4ίŸÎÌÙ«9ëJP»©›âè,d½a*ßÌXÅјtLžÁ„uH晴íOÛbÙ;oó–E•â‚o¥¶tÒ—:Å\.õÇA›­×üeÇ}7¢—òákûiîÆªÿoïÎã¬Î>Žg&ÉLö…BIXÂ.Ä((d±‚ E¡µ EŠŠµ‚ *m¥PEѺ,(Æ—E@#‚ˆv([" «ì ÙÈ:IfæyÿP™É­b~Ÿëò¯Éœå>ç<Ï=ç<ÌÌO#öñ—éïý)³±eoÎà–$Þýƒ’šb5¹i÷€06¾8…µ¹…ðÂ#{…álدrSNåÝ O±3Ü—ƒ‡÷•ícŬµÜúzW¢<Žýeêµ·ãê`ß̱n×BK*Óÿ’ÆÃÂX·pû²L4îv/÷îC¤§>VÚ}ª4æÍ†\ÃdU?Ç=…ËÓ\­áüÉŽiÏóef¼6ŽÙ£%.ujÇÀ;§ò\~…;c}t½BéøO¤Žbzt‚ßpÔ^‘änþЬ&}énÁ™ý5É//Á‘ôý×lÆ kÂ÷3ÿÆŠC¥µªÃyêKÞ™¾ßÏ2iÆ«Œè–ÏÊW“Ùoç²ÔQ~h13fl"tÐs<÷Öß¹+n©x³‚h IDATé…¸ªø[ãô:æ½½ŽÁ“xnæ,ž~(‘ìOf±.ÃyÁßÙÓfñ^*$M˜Á”7&Ñ×ú ÌKÇNíÚì©ïFÞz–~çGÒØÇè¶‹ÅSæÑñ&¼ý.OjÍ¡9“XœV„Ë]»³Ñó‰§èÎ_cx_Œ¢nË1j;å”Õ0æžúo\¦>•ÕbüÝ«ÍãZpÞÈòÍ1Ü9y/Lº‡à­É|ò}qµc|Ñ<Ì›z×hŽ{ꉇ¹ZãùŸJ·ÇþÌ͸vÂ?Õ­ IµœWç÷«wo]\•T‰Ô?¶«’helcËáRpf°í›Lbzu%Øì$oór„ßÉà¾mõ"2q(wtÈgcêAÊk\ƒƒSß-ãH“¡ÜÞ£9AAÑ´8–aƒÚáãt\†:J9ºê+ ÚÞÇ ¤8BƒѲß(úD¹¹,øu䞦pÏMq„‚ŸÙN¾Ýyñ ÈUJqQæà–Ü0îMžÏq)«qß+ÒÃA·ÃHlß ¯=³ÝÖ»v"< †]ïá®î¶úe5n·AÑÎ÷åÔ"v…nËÙÍżšþ_–>Õ´-Õ«§µpæ}–HºÝÕ“è+A-ºsMŒAaA1™ÕŒñEõŸ󿄸ÔäG¯«Sw}º”ù_›6”WêW°~ÌûJ¦ã?‘ºò#±ƒùk~¤$0M9-éÛ93г ±4ˆ&àì£1&+aÑØTñ°Uþ®¹““EX#á{ö:ëIç>‘@9G.¹%YvübÎ+ß+”èð*o)˜¼¼(NŸÏ‡3v“UbÁ/Ì<4«œl¶͘a)|ñþã,?i£IbzÞ>€.&qqÕ¸ïà²^!DW)ŸÊ£4ã#¦Ý¿ôܱ‘á(Ã_ˆÓR³vƒËc9ƒóŽ=ÅÎI‰Ûrò((®IÌ=÷ãrô©¦m©n\}0¹] TŒ«%˜FÁgo7&L˜'EžúXåëì˜W¼T5Ç=©—§>ÕqþSËyUfT×/QR%R?²*šßÔŽ²Y_³Ó?üVCidÌø5ðǹã8…ήØ,€QFÞ‰"¬áX*>òÿ'‰pœ&³ÀYåF²_˜²=ÙØ *ž9rœbç—ÿÆzÝÍ4¸ä:Ìø5ô£øXv£&À™OFnYÕŸ¶7¿Æ›)þ ~êyº6 ÄbßÎ;šqÑß•ædci{£{ Ç‘{ôÏf2wj!¯=@¨‡6›kÜ÷ÞĘLXÌk ÀÚtONîOʼn“£ ›B‚1¶¼TƒvW_ŽŸ©¦±3cu[Ž/y‹?¨AÌ=÷?ú‡×.CŸjÚ–êÆu,qVwkálFbÂ|ÑŒ_}l\ÅÃúçÆüÜÖYµsÜ}ÿƒ°äõЧºÌj=¯üËV]Ü/¹biE.-öfZ–¤²xi.q½Û¹ñZIèGóÌHYµüÒ"27/ e»? ½Z`µ…àS¼—­;N`//àа=¿ª§X¼ixCo"ÌçÓõG).ÎâÀªw˜÷Qå¯ËP‡•è›{œþ{ˆüâ~LÃÊ#Ug8í…8ÌV¬ÞPrò{6,šËŽ‚ óËÎÛerQ´mÓ'½Ë¶#>ÛÎ\h<ÇŧÆ}¯|Ù2Øñ6Ú䦰dõ~òKKÈÝ›Jò±hw‘ÇvF9Åvg5å”Ô"vžÊqU£˜{ê¿é2õ©¦m©n\=­ÏŸék>ÆUäW5šãžçFu}ªéü¯ò°²†óJ‡}¿,–gŸ}öY…Aê‹çe.Ð;Ÿ}Ÿ²!¯+wþöF"Θ¿„mQôzà\mÃRÇ:°æË Z÷»‰ÈðV´itŠõ ßᣅ_°ßt-¿êxš£>ÝèÞ.ø¼Œ Ÿ†ÍðÞ»„ß›Kêúƒ˜ÛßIŸÆûùò“ý4½6Œ=ßdк_M›·Äÿèç,INæÓ%+HËkN¯1£Hˆ´zŒ‹¥ÒÝÅSß)ÙÏÚ•GhÙ¯'¼Ád‹¢Mk »>šÅïÍçë-YDÞöC“bðÐîæ½»rb-_Ìý#q¿¢k³fnʉ¾è_'Z‚ÝÇîú.ñ´uSŽÍÃûº]•Åú3ýjÜÀ}ÿ­—©OžÚráø›±E»W“‡µ`T+(åøêåüØ¢×·oï¶ýcËJå˜k8Ǻ›Mª®O5œÿ͓ڵú;ÊúÑ1Ü Ìf‡k6^ŧ~ ¼Â¿MÄd†¡a”úâøeÿ.>;ûÞ~˜9Æ£LüC[l ±Ô[Z r颮ðo“ÐñŸHåä\ÍŠM:÷ŠÕMD´´¤žÓƒê"uT¶oÓ¦l#¬×ú¶°* ¢µ µ õœŽÿ¤^9®ŸâùÙÒñŸˆˆˆˆ(©QR%"""¢¤JDDDDI•ˆˆˆˆ(©QR%R”îaÁCcX¼¿â» ÊöÎä™a³â˜C±ù/Ä·6\Ÿ0õ÷Ï“^\‹q©M}F.þ<˜?sóß“Ë8•ù9/þþ¯ì,¾øí?ǹr~Ì.VžWïã…E‡qÔ±LÏåÿ²çcÙž7ùó£É-ײþ)éË?E®¤Ù›!'jQ0~éãb !á™÷èè°s`ö8fŒæÏê\ñåf¬Å«4WD”T‰ü8Éßùó“?e×±"|¢®¡ÏýÒ»uFöç¼òìn’[Y5?ØÇ_¦¿÷w¤Ì^Ä–½Y8ƒ[’x÷ JjŠÕä {ÝÞŸ»Š9e˜ü¢ˆ¿u4÷cã‹SX›[/OÝIŽ%Šø[G1´_¶\ß¿qýÚÇ™ãúh pf,cÚ„¯¹îïS¹©¡‡ä¤ì?ãåÌåûÅo±ø‹­d•xÔª7ƒA—ÐL¾ª4žÃ;øzʪ°Øüñ=s©¶z›0yùâëïîg`\Å€QNÖš™LûøkçZˆìþ;FŽîCÚ´)¢Ò-ÀyœÔ 5«¹.g “—‘v¤Ÿˆx®2†Ý¢0Ï”ÉÇ2}<­|ç RŸz’½Cgð‡¨ó‡·”̵ÉÌ[°š¹ÞDvù]KÜ}µû9êëi}¦/¹¸‰ðM­ç£}3Çz˜T]W5ñxàj¿óºx¼Šùáã¶ÜÊ?ðÍ¡ý‘¯§ý•T¿áüilO½ݯ%«ÉýkFš›µ3°AÊÕ«¤ã?‘º¦T§¾äé+ñð,“f¼Êˆnù¬|5™ýö3¶¼õ,ýΤ±Ñ+l‹§Ì!£ãLxû]žÕšCs&±8­×éuÌ{{!ƒ'ñÜÌY<ýP"ÙŸÌb]v#z>ñÝCùqâkUÞ€]§7²|s wNžÅ “î!xk2Ÿ|_ŒëägÌz} ¡wÿþ9•;­géö<\U]€Ý՟ᬲßîê4ŠvTÝÇ]~Ä'„qjÓ>Š ƒÂý[É1AæÖ}öÉ ½†vá^¥Ý–—V„¸r7ñmÎüaú¿ÿë¶ÏžHJIþøÆlÆý:€´ÅK9Rzæ–¸+NßÈÈi³xfìõ”,}‘y›}¹é‚ø†Ó£ìø†£öŠ›rîæ¯ÈjÒ—Žá5¿ƒØÓfñ^*$M˜Á”7&Ñ×ú ÌKÇîUíxÖ‰ýV¦Ç2ìÅw™üü=mMfÙî’šµ©rY–ˆU¼é;’_^‚#é þú¯ÙŒÖ„ïgþ‡JkÜìòC‹™1c¡ƒžã¹·þÎ]q{HM/¼,sÀ™ýuÕm<\‡ùhó87ÜÖU‹xPÅü¨K¹Fé¾yåYRm÷òDZ= ÷®f-yxÍíÚYŸ«€’*‘ËëÔwË8Òd(·÷hNPP4mŽeØ vø8+>m¦ºFbûfxíù˜í¶~Ü=°á4ìzwu‡´Õ(óëÈ=/Láž›â  $?³|»³Ú6–HºÝÕ“è+A-ºsMŒAaA1Ç¿^Afìoؽ) iÕ8×…ºY¿ê:Ë(Ø™â¦GêÒ ëá ·Û9±5ƒÈ~·q|SÅÿoù[§kˆð¾ ŠÜ–w€rÀ°Æró€« õ "¦K>­è; !¾ÁÄt¹š0çiJÏÜ¡M>¹}ØMÄ„Ññ× ¹5˜Vü›üJwpÛUI´2¶±åp)83ØöM&1½º\Ë+¥á*¥¸¨ spKn÷&ÏŒŒç¿ö‹xÞ1ôÒ“(+-ºÑµ±Aa‘£Nmò&¢Ú±êŠ×öå¿“Á}ÛêDdâPîèÏÆÔƒÔ쑞RŽ®úŠ‚¶÷1()ŽÐ F´ì7Š>Q—gŽ‚“¼ÍîÚx„ZÏGOsÃS]5Gmûp*Ÿº*;Æš×&òá¾¶ ýÃÍ4ô®~-åxx­ÌÃÚ7¹±B R7…'‹°F6Â÷ì6¼w$ûDVìæØ¯"ƒ½'ŧò(Íøˆi÷/å쟎2Ìñ…8-^§ÏçûÉ*±àæGžšÕ¤–`Ÿ]Æ&L˜…' ±EE`=×¶0‡xs°Š"L^µ¬¿Ê:”xè£9ú:b™AúáØùÓ®ßõn|“]‡`Ùk"nT.üÉ/—ǘ•€É?Ÿ37a³³Å?4™Í•šÜŒÿ(Bš‡c^“A±+æÂ¾ùÆ‘ØÎÁü5?R˜Î¦œ–ôíZ«OŸ¶ö£3,…/Þœå'm4IìCÏÛÐ%ÐÓc"Z‚hxî,Æ„Ùdº¤6ùÄT7VQ8¶biMÀ¹j­„E`?PPÅCæ\ô³.J²ìøÅœ·~¼B‰¯:õ¬õÅEq–û6Zbj;=Í ‡ÇºjÚ÷¡ª=GîÒcûÑÎ{%Ë¿>N›þÑX<®¥<ò3ݯ³rkG”T‰\V~a6Êödc7¨x¾ÁqŠ_þëu½‰0™°˜+6„m!X›ŽàÉÉý©8U0pdSH0Æ–—x3ÅŸÁO=O×&XìÛyçO3jÖ“ ³éâ hß¾”΢Ìhu¦m§ÉȯêßTm~­võ»©ÓSý|ítiQ̲µk°”Ç28º9¥Íí,Yû”Ä1 ™­Våù—­ªÕX¹ O_f€wEÒyúhN¿ø^”-ùÒü¦v”Íúšþéä·J› Ú¤B¥9ÙXÚÞÅè^Ãqä$ý³™ÌšEÈkc+æÅåVåxÔ¢M•óÛUÕŒ•?~Güqî8N¡³+6 `”‘w¢kxCåúÏMßqšÌçEãë×Ðâcؘg>¹e—gŽbƯû6šm1µœžæ†çºj:ô¡ªü:¬/#AƒíÙLþçÛ¬Oü ×GxZKA˜·}îvÙ}çv툻Q‘:ixCo"ÌçÓõG).ÎâÀªw˜÷Qå–ÊËÊD`ÇÛh“›Â’ÕûÉ/-!wo*ÉO<Æ¢ÝE8í…8ÌV¬ÞPrò{6,šËŽ‚ óË*ŽpŒrŠíÎZ´Ì‡ÆI½hðÃ\>Ýxœ’Ò<~ñlÈ®ºŒjë¯Ù·},SÍ»5áÔÊådE%iõ%&!ŠÌ•ËÉnrMýMµˆYI­w|\%›HY¸‘Œ‚"rv}¢eÙÄÞÒ• óÅñµÅÞLË’T/Í%®w;üjU™‹¢m3˜>é]¶)Àð (Øvá…öüú\…ݲ†´ÃEµˆumÕ M„¾º±²’Ðæ™‘²jù¥Edn^@ÊvzµÀj Á§x/[wœÀ^^À¡/>`{åsV¬DßÜ“àô÷øøÛCäçðcêV©ýuU½}ç±>µžžæÆåˆGUó£š>T5tÞ6¼Íf‚ºÞÇqûX’¼ž|—§µdÇßÓºõ°vD;U"—wñD߯¨‡ ˜?÷)&¼nÇÖ8ÞÜO|€ *=Gj Ndèø,¾;…ggça6£ã€ ü&!_ûHúo˜ÎûãïÃÔœŽ·æ·½?`ÁŒñôá´iïÏû“Ç0ëÉŒŒ©YÛ¼cnçþ1§INÏ“orUÒ´;ÈFK¥„ÄD`‚‡ú_y”Ö5|žÚì¶A˜ÿ6ÝiÌ.Œ.Wa3™0µL ‚]ø\צb§‚šÆ,rj9Vá7ÑÕµ”7ƾD¾wcâû=Á°±˜ÌÄwT'_ðkŵñ^lÛu5×·¨eg!´Çƒ Úó:‹žÉ§ÿ& ô~d8±VÀqa}ñl|g:;{L£MSÿÿÒ¹š6U‘ W7Væð$FŒËaAòdþònÞ ÚpÍýOÓ?ÖŠ…ÜyÇfÞëažô‰$®ç´þ‘•çhÓAŒSÈÜÏ0q¦…†oc@ß“|SE{<ÍÑ„'c«îµ‡6R‡ùX±=]õܰ\†xT¥Òüèä¹î‡<œÄ‘CX;a6oïȽW»_K“‡u–æ~툛Ï$†a ƒÔÇËêG?]§÷òÃÉb[ETìÚ;O²zâ3ìö¿¿\ÿêì aßùÏÍiƧÞMcc}o?ÌãQ&þ¡-6-©§s£ökçÒEù\Ù1ÓñŸÈ/1©ÊÛÀÂ_åë}§qådo^Ä—§ZpuS¥žåä\ÍŠM:÷ŠUB%šR+:þù%.ì¦w2rÈÛÌ}y ËŠMØÂÛÑãáèlRp<(Û7‡iS¶Ök }[XÑÜZÑñŸÔ+õåøODäJ¤ã?QR%"""¢¤JDDDDI•ˆˆˆˆ’*QR%"""¢¤JDDDDI•ˆü¼”íÉ3ÃfÅ1®ŒO˜úûçI/öüûö)<ùø‡d8.~­¦eÔ†+ûs^üý_ÙY\÷¾ý¯cùKž'”îaÁCcX¼¿ì’ƧV*Õù¿P»¹\žWïã…E‡qüÌú!ÿ;úFu‘ú~ˆì͇µ@Á/¸o¿Àú~ɱQR%Rì›9Š9®?1ñöØgÆ2¦Møšëþ>•›B~ú&/#íH>ñ\;d ºEa>:Ÿ)“3dúxZùΤ>õ${‡ÎàM¿å•gw“4ØÊªùiÄ>þ wÆžÿò×Íáý¹«8S†É/Šø[GsïíQ¤MËòÏ3ñÞX¼WÎ*^·˜Øg_c`sSÕïûu{|Ëö±bÖZn}½+‘ôÐáö=G.éóþÊ?¿J'×Ò˜ø[F2tÐÕ^P†ýð*Rf/bËÞ,œÁ-I¼û%5ÅzÑ/æ8Éßùó“?e×±"|¢®¡ÏýÒ»uÀ™¢ÊÉZ3“iÍá\ ‘ÝÇÈÑ}ˆôqºµ×y}‹òP¾ÉS;]¹|¿ø-±•¬/‚ZõfÐC#èQÅåóüXfÎô¿¤qã°0Ö-\ž,»ÝË}£ûYù[£îêp°oæX·ó¬‡%ÕCžú{~ÝÇI0ž­}ÿÁø>p"…©ãçÂÐ0a@Æ©¼üØ :=Ö—í³6pëôÆìyy ks á…G(÷ ÷FyŸÊArëJ7¼ÌÔ÷ýøíÔièàäÒ?3}Ý5üib7vWªsx›Û1óÎùü‚uÔü¾[8’üƒ›8¹ŸçzÜ(%sm2ó¬æ@®7‘]~E×ÃóÚÆÆ+÷ÃÛmýþ:KºâhÈDê(¦G'Øñ Gí Aîæ¯ÈjÒ—ŽáœÙ_“üòIOð×Ífܰ&|?óo¬8TZm¹FÞz–~çGÒØÇèÝ䟆7N¯cÞÛë<‰çfÎâé‡ÉþdëNsE›×p²ÀÅém© ¿™Äo÷ïËpºoG5ï)ÏXÁZg?|#™gÇ%QöÙK¼÷Mç—hí`ñ”9dt|€ o¿ËS£ZshÎ$§Qù÷±œ§¾äé+ñð,“f¼Êˆnù¬|5™ýö3`ÿ•é± {ñ]&?A[“Y¶»¤Æ±öT¾§v–¤Íâ½THš0ƒ)oL¢¯õ>˜—޽sÄuz#Ë7ÇpçäY¼0é‚·&óÉ÷Ÿ%ÙÝÖaó8Ï<ÕQm<ϲDŸÆ©Mû(6 ÷o%Ç™[÷QhØl$+ôÚž©¯(z>ñÝCùqâk ïàëq|.šWnc]B`â(Çmáƒ;È?ö9ó–AŸÒØïâ:«›[篣>M}ÜÆ©.k üÐbfÌØDè çxî­¿sWÜRÓ qyZ;Ù.îGë%U"¿(¶«’helcËáRpf°í›Lbzu%Øì$oór„ßÉà¾mõ"2q(wtÈgcêAÊ«KªLt1ŒÄöÍ ö©´ãב{^˜Â=7Å@@H~f;ùvƒÀŽ}i^¸mÇËÁ•î¯ŽÐ°× DxyzŸ‡ w5ï1ۮᎻièïGhÛÜÕ¿Wná´ë?;E;SØnëÇÝ;Hî÷pWwH[}€²J»b§¾[Æ‘&C¹½Gs‚‚¢i;p,õÃÇy&ýòŽ¡çžDù[ lÑ® ‹JÉõ법襁†«”â¢2ÌÁ-¹aÜ›<32žšü¤®a‰¤Û]=‰°Ô¢;×Ä”QÕ®º«Ãý<óTG1™ÕÅóo"ºtÂzxÇívNlÍ ²ß-DßTñÿ[~ÄÖé"ªûM¶*ÇÇQ©¯ÕÌ s(ïû=M¶¼Â«[ Ç’ã]U´<–S~Ñ:ò0uY”rtÕW´½AIq„5¢e¿Qô‰ªSmʬSýòs¥ã?‘ºò#±ƒùk~¤$0M9-éÛ93г ±4ˆ&àìã'&+aÑØTñ«çÿ®¹W‘ÁU/M“—ÅéóùpÆn²J,ø…ù‘ç€f€)¨×ǽͲ'¸ÅëN6£GbÊ£:ïsÇTÍ{ÌÁM=w†çMHÓX¾Í¦ÄpvŸ†âSy”f|Ä´û—ž;r2e˜ã qœwè¤ðdÖÈFøž+2’Î}*$]vÀDàsÅl2NJ<ÄÚEMÊw’é¡^íG3fX _¼ÿ8ËOÚh’؇ž· K ¦êæˆ%˜FçÆÒ„ÉÍ;lžêp;Ϩè_•u8)òÏÊ|b®#–¤>Œé?íú]OáÆ7Ùuø–½&âF5Á‡ƒÕôµªñ¹hï®ú9’@ßnï1íË&ÜvC´››”çrÊŒ*Ö‘›±0Õam€‹’,;~1çÅ×+”èð3©v-ʬ[ý¢¤Jä——UÑü¦v”Íúšþéä·J› `Ư?ÎÇ)tvÅfŒ2òNa ¨Hr ×nøŽÓdœ÷©ÔdÂRå²AÑæ×x3ÅŸÁO=O×&XìÛyçO3μ/ˆV½ZSøÁöúm#«Å@Ú…™«u¨ p>Bn©A´· ('ïP®à›ð·œÛ·…`m:‚''÷§âôÈÀQM!Áø™.Ü4÷ ³Q¶'»>&ÀqŠ_þëu½‰;óE÷i ¾bm&§å÷"Òm;ƒ°äÅÒö.F÷Ž#÷ éŸÍdîÔ,B^K\uÛUU¶ùâX—æd{¨ÃÝ<óT‡_ñll©¼íJ—Å,[»Ky,ƒ£›SÚÜÎ’µßAIšÙ ôrôµú9á8±’×ÚhõK§?²Ã—–ã_¶êâuä¦}…µ^gæSC?Še`7Z`œùdäVìÖ|½ÕemÊÏ™ŽÿD.-öfZ–¤²xi.q½ÛI,„$ô£yæG¤¬ÚG~i™›²ÝŸ„^-°ÚBð)ÞËÖ'°—pè‹ØžïªQ}N{!³«7”œüž ‹æ²£ „Âü2 LøÅ÷%69‹?Î$ö–Nšª_Ýê—}3) ×q² ì),ø¬€¶ý»tîªb"°ãm´ÉMaÉêýä—–»7•ä'cÑEÏÚxÓð†ÞD˜Ï§ëR\œÅUï0ï£4Ê-ž.SÂ<ÄÚ§Få[<´³ˆ¢m3˜>é]¶)Àð (Øv™/œ®jë¨zžyþ¼\«xšhÞ­ §V.'+*H«/1 Qd®\Nv“hê_E…F9ŵ>¢ªfN”åë~ˆó¶'5þw„¯ÿ'Ÿî.þÏâ¹:=—cªq{ \æ¹ûUi%úæž§¿ÇÇß"¿8‡Sç°òˆ³"¹«f휻º¬MÑN•È/“_+®÷bÛ®«¹þ¼Ue Obĸ$Oæ/ïàÝ  ×Üÿ4ýc­XèÁwlæý·æIŸHâza@ëÙY“RÂHúo˜ÎûãïÃÔœŽ·æ·½?`ÁŒñÃ+Ò: -×·u1óû«¶=žß·ç™¶µ®«Óðû =YÆ›c_¡ÐÖ”w>Í= Á˜OWJp"CÇg±ðÝ)<;;#°Là7 AÝø¼¢ocÔCÌŸû^·ckœ@ïGî'>Àäq—Ää!Öç6ªª)ß„»v†â[ú ƒö¼Î¢§G2ÇiÁ¿I½N¬õrM" ¡=ª©ÃÍ<óxq÷Ï*ÆÛ¿Mw³ £ËUØL&L-ˆ`>׵ᢷxGЦ½?ïOì'g02¦i•Û9áˉ¥ ™1Q ÒIDAT/ðEy¹%›O$CÍ‹3ÒeÊpZX/¬sT'÷sëüq¿”5•ðd¬Ûwz7Äè1…Ì]ð gZhØù6ô=É7˜ö´N§ ¿ ¿÷ð·üóQ]c¯0&Ã0 …Aê‹ã—ýß}o?ÌãQ&þ¡-6…Xþ+4Ϥ~ˆò¹²Û¯ã?‘:2Ê È;¸š›,tî«hž‰Ôs:þ©£²}s˜6ea½ÆÐ·…UÍ3‘zNÇR¯׳Ÿ""?[:þ%U""""JªDDDD”T‰ˆˆˆ(©%U""""JªDDDD”T‰HÍ•íÉ3ÃfÅ1G¯–°çÕûxaÑa •ˆÈONߨ.òs^ ‘½òpá¡CDDI•È/“}çK¼°0ŽmwòyêNr,QÄß:Š¡;÷9¯<»›¤ÁVVÍO#öñ—ècÿŒ…ÉËH;R€OD<×Àkml}a,Ë[<ÏÄ{cñ\9«xmÜbbŸ}Û÷±bÖZn}½+QF)™k“™·`5r½‰ìò+º–œýAûáU¤Ì^Ä–½Y8ƒ[’x÷ JjŠwN¥¶Œû3ñ[g±ø‹­d•xÔª7ƒA—]DD.…ŽÿD.%±Ú?§odä´Y<3özJ–¾È¼õ¹€‘·ž¥ßù‘4ö1zú­%ùå%8’žà¯ÿšÍ¸aMø~æßXqØø›ã(Ú¼†“å.NoKåXøÍ$Æx_PWù¡Å̘±‰ÐAÏñÜ[箸=¤¦â(ÚÁâ)sÈèøÞ~—§FµæÐœI,N+º¨-ןNæ½THš0ƒ)oL¢¯õ>˜—Ž]Ã)"¢¤Jä§bòéÈíÃn"&4˜ˆŽ¿fÈ­Áü°âßœvaŠ Ûˆa$¶o‚±ã3„ßÉà¾mõ"2q(wtÈgcê!¬ûÒ¼pÛŽ—ƒ+‡]_¡a¯¸p㨔£«¾¢ í} JŠ#4¨-û¢OTÅ.Ü™Âv[?î؉ð€@v½‡»ºCÚê”s~[šâ†«”â¢2ÌÁ-¹aÜ›<32ýT¯ˆÈ¥Ñ~¿È%°7£¯éÌÿyÒ<óš Š À+„È`/ œâ¬B, ¢ 8ûh”ÉJXtöA¸>îm–m<Á-þ»Xw²=bŠ](\”dÙñ‹iĹê¼B‰·NJNåQšñÓî_ÊÙ— GæøBÊ Îk ØÚf̰¾xÿq–Ÿ´Ñ$±=o@—@Ÿsï%U"ÿS®Âä—àmœ>šƒÓ¯¾ÀdÂb0ã×ÀçŽã:»b³Fy'а†`6ѪWk ?XÃ^¿mdµH»°Ê›ÈfüúQ|,»Ñ‚àÌ'#· 0c ÀÚtONîO¸ÀÀQM!Áø—­:¯-¥9ÙXÚÞÅè^Ãqä$ý³™ÌšEÈkc‰Óv•ˆHéøOäR’ª’M¤,ÜHFA9»>aѲlboéJð+ËBHB?šg~Dʪ}ä—‘¹y)ÛýIèÕLøÅ÷%69‹?Î$ö–N^´ed%úæž§¿ÇÇß"¿8‡Sç°òˆ0Øñ6Ú䦰dõ~òKKÈÝ›Jò±hwI¥Ý'EÛf0}Ò»l;R€á@P°M‘Ë@;U"—²€Âo¢«k)oŒ}‰|ïÆÄ÷{‚a7„cλðï,áIŒ—ÂäÉüåݼ´ášûŸ¦lÅÖ) -×·u1óû«På1œwÓAŒSÈÜÏ0q¦…†oc@ß“|˜‚:>‹…ïNáÙÙyÍè8`¿I‚œ ¼Ð2hÏë,zz$sœü›$Ðû‘áÄj—JDä’˜ Ã0©/Ž—]¾²ì;_â¹9ÍøãÔ»iì­ØŠˆ\ª(Ÿ+»ýÚõQR%"""òó ã?©W.çñŸˆˆ\^:þ%U""""JªDDDD”T‰ˆˆˆ(©%U""""JªDDDD”T‰ˆˆˆ(©%U""""JªDDDD”T‰ˆˆˆ(©%U""""JªDDDD”T‰ˆˆˆÔ&Ã0 …ADDDäÒh§JDDDDI•ˆˆˆˆ’*%U""""¢¤JDDDDI•ˆˆˆˆ’*%U""""¢¤JDDDDI•ˆˆˆˆ’*%U""""¢¤JDDDDI•ˆˆˆˆ’*%U""""¢¤JDDDDI•ˆˆˆˆ’*%U""""¢¤JDDDDI•ˆˆˆˆ’*%U""""¢¤JDDDDI•ˆˆˆˆ’*QR%"""¢¤JDDDägÃK!úÈÞJ;Æ?vã`~ å.ãŠëƒ·ÙD‹ _éØöQ˜4¬""?)“a†Â õÍ;ñð·{1ýyëÆV<Ð>J+"¢¤Jä«õ¼üWÌÿõŽçx›¯¼}žr—Á‚½™üîË]ćúñýÐD ¬ˆÈOHÏTI½´ït C[^™ Tÿý¦UCöä•hPED”T‰üï¹ÎlКMWö“HgÛïÒ†³ˆˆ’*%U""""¢¤JDDDDI•ˆˆˆˆ’*%U""""¢¤JDDDDI•ˆˆˆˆ’*%U""""¢¤JDDDDI•ÈÏ’“o¿Zƒé­Õtû¾g5›úùZo,¢ÔÃk""¢¤J¤Þ1JOóÆûðï´Sr)&""õ™—B R§”Ь£GùÜ;’OzØûáq柎bbèÙÏ)Nöüp€ß¯?Éš"3m›GqO5xMDD®TÚ©©SNUƧ;OÓ¸m׆Eð@;³wc?órÉ©¹mUM:qxDÞh”Ï‹ÇÊqV󚈈(©©WY¼™åÏ[ûa5[¹½C™?œ`›ÀÉÖô“œŒŽãÕø šøúÒ³sKž 5N¶»}MDD®d:þ©5ûöcsY1Ûæ}Ëx.vW32Zp]´A^¡“°0Ags%³͘Àãk""¢¤J¤þp3g—„ë»’ÒÒŠÀ(gÅ—ÿæÑ´Þ&’"‡“i[p¨À~Åö㪠wnÊo•P‰ˆüä´S%"""rè™*%U""""JªDDDD”T‰ˆˆˆˆ’*%U""""JªDDDD”T‰ˆˆˆˆ’*%U""""JªDDDD”T‰ˆˆˆˆ’*%U""""W‚ÿ+ÃÔW¨IEND®B`‚162_snmp_versions_fill_list.png000066400000000000000000000520001516513262500342460ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/16_fields_snmp‰PNG  IHDRTþZ÷<bKGDÿÿÿ ½§“ pHYs  šœtIMEá:.3eùà IDATxÚìÝwtTEãÆñïî¦÷„BH5tB ½HGP1(‚(‚ß6DìlXP‘®‚ ¾ˆ€ˆHïEjè„H!¤o’ÝýýJIHB^žÏ9œ»wçΙ»óìÜ»‹±+lˆˆˆˆH±Õ"""" T"""" T"""" T""""÷0;5AáÙ·R#È=ÇðÝJ5‚ˆÈuh…JDDDDJDDDDJDDDDJDDDDJDDDD¨DDDD¨DDDD¨DDDD¨DDDDDJDDDDJDDDDJDDDä^£ÿYDþNnÞ ¬[†n;@Ü…D<Éçû‰±ª}Däæ39{ñt™Lþ{8…”ÜèYÞÈ߉·¯ìb­P|²¶ÁyüéLÕçdkKbý›½:7KòÞ '|ÐTŽä>œô}ŒëNxQD¤™'˜9$œððœz1pÄ8–OÇö/“ÛÕÞÿ.þå*±©w(_Uv$::–Éûϲ)Ó•Á­êùp9Z8ôÎ/"79Ly3ºk¦t¨ÇÜPW\/‡)w†?PŸÛÖeICO¼‹ùöSÌ*k·Ðþ€™«æ6«•Äë|²4'œfà’sN)Ú”UÜ×ÝéìK·cà‹aøû˜îÝúež`î¨ùÓ»/}öU¼áüá5ü2f4£¬óÉcÁØgÏämÏÄuUyµE LyÏÕâÖ±üh*†8^~8íÐR6%Àáê üôg¼Û¦F[&Nìbõ̉ŒûÄ _=Iy{‡[ÁÑ;ˆ?;ây€jËN³ÿrvŒäe¿@f=\‘…íÓ©¶à ǵR%"7IÝ:! õ¾¸ÈÓ¬slÛè¶ßÈê2ªtö"L½ú!¼ph+ïÇýͧ˜Ë86²2³8o¾úOB¦õbÀ2Q%¤2kŸjí¹fìéT–&N—"œ;o· ¢¢Ñ™¡Ö¤¿«CnÈô ëL —^‡ ŒtjT›Cý[aÜ’èn•yÜÝF—¢•y'0æ·ñóˆÁ–óDLÉÞᄇ÷ ÿ“Y›YÑÌùKããøûÿã«iyöIÚ±eŒ1ˆ^ááôxöuÆ-;Nº ¬q‹>àsV¯ù·÷&¼ûS¼øÕN¦^[®5nÃaÍŠñ¼ÚwSvï½R¿ö‘oÝ2ŽðÀpÿr”̼jžr„-'‰Ä—FìØ²äWZ)•KwáÞ¬^¦«Ó—ÉÑWWW\ݼ¨Ö‚Gk„[ìn¢’rwk<+ÞìÉ piñËzn9oôÌÏQ™×oÿmúý˜üÛ*çxÀB®Ù|úR_ïNïÁoóýÚhÌõiÆuúâоQ0aÉ'xxyÎ0•=†/ÄžäñE1¤•­À?“f¹i¶lÚɳQ™—?P·o^ŸÝ=êñQéKQÈÌô%»ø8¾xŸänÉu1ç’ÁÌoãËñ-;(ûã6†Äx0¬ŒýÕ+ ÖT¾š¿›I)é|ûÇ&zž°º|ÏÀÊL¯ cþü‡’Ó¶3*³ã›zâqeÞ RwNæ«EðÀ[ãùaÂûtsZÍÄŸöfÀƒo¼N;_:½7†¡¡Îy„’LùàGNÕyŽ/~ü/VáÐä÷™²3`MØÄ¯›éûéd&ÔŸ­Óøy¿WžåZÏÿÃ/«]x`è+<ìP¨}¤äWw»R´êÿ"}›—ÌsIÔàZ‘°²X6~³×íçLŠF¼Âúñj¿x¯¬(ù4íÏÀZ‡˜2ngóì^{š·Äeûb¦^¬wò>–ìõ¦Mc¿–dm˜Ïdíâ${àškÍ×èMö•HÚ´Ž“™Vâ#–r´dZÙ_¿ýs´i‡„iù·U–¸UŒùä2Û cìÔ)|Ô;ˆˆ±£ø-ÊœÝOyõéîÔüÇÑ2ÎÃ˘ؿ÷4™y÷C|ô)f¤:бœ3ŽšDäf±¤1eñ¶¡ÊH°›!G˜Šà™Cé÷Æcq_Ö u,WÝCu'Z{኉º5üñ?u˜¡û9‘–ÆŠí‡øèüͼTgÀ`4âãh$+5‘q 7RuÕ’ÿúÛf5“œœÑ«2‡eÌ€j8bÅ0iÇþqêLÿGB)åæN@ƒ<Û¶,Ä ØLþ´ëÑšrnŽxUlJË ‰IyÞ+d3”¤m¿ž´ª]‡"ì#¿ºÝ(ß aÁ®äyiÚ>ˆG?šÀ[¼9±l2oèIŸ!#=m)“r¥&“û¤Nä|·"–¼2•}éf´öÜÍâ}ÉØ°‘¼g1J¶£¡oî,"'â±ðpÂûÓkàÆmó§ÛÐ' q¼vÌy…v $i#Ne‚5žˆ¥'hßœÒv…h›\mzý~¶pnÓö—|”~ªâëêA`ã'x*4‘•‹¢®Û§ÅG·G œMÈÌóMËÓ/ˆ©+ÐÑ ÊU¯ÂìûJSU_‘›ª~Xy€9¹>Ð;x€!7¦àî¡ÚýOÎÌq•¬Œ R1âåf">>ÄK³µ5ƒIÖ›v£ï…“yp}Y^oVŸóž¶Ežæó­'øoúÝ}Ã…KíŒxj³|•§O;Q¡q{êöÍÜ(ø9+ɱ ¤Ÿ™Íð§ÿ¼¼­-+cd2l€É“2^v—ñ í¼ò²+Ò>ì‹]w°Y2Ȱ¸S¥í“Tmû$ØÌÄí_Ç_¿NåÍ7bùdtOÊçŒó^è7h/~3–e5‡âvMýýhÜÖ—?í&©N5v-9B@ûø˜NåÚÐD`÷x­…7F ÜðörÁ.Ÿ d"3þ9M¸ë>–æþÆ~˜ Óþ9Ú´ ~¾ª½ã’1ù–ÁãR48R2д#IÙA2Ÿ>u¹¾¸Ž›¡™·=\ª.œ=ïÉexÊ8Âæ}±ÈÒ "7i9ÆÞa÷Wç‘\÷È–©Ác·ñÈΫ¿ýw[UZš™ÈÄ«oJ¿ôÆŸ˜…·î$‘`´§ª›CìÍYrsuÄ|ê(]öÁÑÕk‡ðÃCŽœüy?«ïÚ{Öm¤Ÿ;‡]î oÿ4™ñQlýkc?ˆ£Ä¸!T¿ÎŠ¡‹·NÁ}øüÓ(eÊ./3é‰xân^ÆÂΦ&cQöáݹ“ù×ý:×mR#>cÀw^Œû<5œ³ƒƒoµ6ôìËæW·°/áqÊ»]]¯†ýö"_}»„nY¶k‚’oƒvøÿ¶ˆˆãé¬8Dû!Þã¯K¾”*å[¸¥ZƒµÚWaÂôuìvÙNL¥.Ô/al…jÿì6-¸Ÿ«æ8F·®X¶G“h©‹ °ep.:'_7LÄçÓ§6ÒÏÅ»/n‡Y§²x¦zî<ÄÚ܉ʖÉßkvÐϱ* îáƒX 6Í"r3Òƒƒ;¯?P—‘—ï™Êdkœú¾vdßSU¹†ºîH.V¨*æ%?vövx;æþc ;öž!:°ŸWq£”ƒ#jTâuCÞoŒ#ÞöE«F‰àÖu­Dw;ŒY™œN³\}é§eÞŽÀ”™žLJJJŽ?éXlWV$’"ÆóÆÛ?°áx6G7¼=®ž0m™$§YòìÏÐ ŸÃ´åGH0§wp)_¿ø “÷âΙ|Ë-ì>R ®»5™¨ÍëØr,%Ï1àR¥MM«øzì\6Žæ\B´‘Ùc^eð§ËˆÉóØÎ0wÊ b,EÝçYvIÄz9…]àÈž¸b41‡7ð먗ølU«""r³»¥¥Ýió ÷ÇeáTÞïïìNˆ§wÖñÚ’¶ñÓŒ}d¸Ö¢ëSP·Œ3泇Xÿǯ¬<šEêÖùigc^®çJîE ëéü´¥ /7ò¤( D'"Ž“Þ®.æ“l?Yˆ™Bè1ôQÊ;€53™˜½Ë˜¹`/©¤³í·ÅœlÖ“`{¹•%]‹ç³07äѶضŒ3l7ƒY˶u6«“•Ðé±Çi_Í “å, _{ŽÉG/–“¸”7zm åûøOu§|ÒC:'VOgÚüÍ8z–L¯ *×nCÏ>PÕýâBœyß|‹•ÉàÕnÿ´ßoaÿ©4ÜËÖ£ÓÓÏòH¨OÁû¯u¥Œïón­?e9é~Ê'dæy¼…ª[aÚ%{+◿΀ïž´õCó^ä9»c™ªõJ¯æƒQÕÔ­]ŠÄç>g[F"N“Y¯×”Ê?ßÿÎÚÏPÕ¹‘ʱ$Žæ³˜#÷“Y—òö³—(sŽçò{­} ªÔ©O­KׯÕÁëh¾Úk…˜ýD›É#P¥±ëëA¼·:Âx}ÒkÔw56V½EÿoöcÇÎKßJE#¹û·kÆÂôQ>ãl¤_ÃYÀ–ƒQœI²Ã'°Ušvã©GêSòÒñvœi܈ˆÈ-ý,}Û÷h½ÀÖ oòñ¯ë8|6 `KOàÔ®%L~ëM~Ú—‚Íè@Éê¡”s¿ô"7ÊÕ¨C9·|¦[ {§ çÅou–Tdž?ÁÞUSyóůXwí£„ßòþ+Ø{* +Y\8¾‰_G}ÁÒX rÿÇç0êóìOH'ß+‚…­[aÚ¥ÈqÙéòD½u'§R/_ˆÃàÑ¡cÇ3~üx>y<˜k²Š{*¹ç0yá©ìU®ëñ¡†pv7G­€¤¨ÝÄ®UªP¢(u78àæz1ïÈg…Ì™J­ëá ±õGÍ—ƒ`ÔÆ¨ìöònH‹ ‡b‘kú÷†úÈJÂæïx饯™¿õ0g’,€™ø“Ø0ó#†Œ˜ÁÁ4[ÑÆé­7""rç*ëùÍÌZ•€ÿC¯óõ÷?0vÔZ—8Ã_3¶qOê÷Æ€&^Ù/òhLÿ/Ò¥lÞ×|²¢1ñÏìëJA¿ÅÄ¿òã§}©ã $¬gò/»IÉ=«$Y¨>”·?|›!ÊfOØ–ý,Út‹¡pûOÝÁYßê4ms?-Ê»ä9é¶n…j—‹ÇàèW›¦aa„5jHE·ü×ìK· C¥ìZ]X3†¡OõfÈÛ_0qú,Ûto|}}ñq³¿¶î®5éñt€£¿ýÈúxëõ;ס4µËÛ'ˆ8aÒ9µý`$¸N™R{ThÏ“ÿdûܳ¤lYNdz(µrÄGS­üçñfx€ ^lXú[3!ùâ§üB]&ñ}‘_=MˆÓÅ8’y¡Øu«Vèv1àZ³'/Õ,DýìËðÀ#qüy*¿¯<@¼ÅÌ™½ë9³wýåî÷oÔƒÁ»PÝ#w¶6áÓ´ÝÿÊ/G·3uÆ.êv¿Þ]®[v%rw ™5Mì;’R'Ø… ½4}ïõÏk©ŠJÛ˜ßýSΕhU×…5kS‰ßAlïJøŸÝÁîO´ Æ 1Å#¹û7ëTñÇ®ùÄ6_ÈnóÚýÿãaÞR}†rzÇKÌ:ÇWoç܃øQøqj¼é瓈ˆÜÊ烦óû HÝ=q»ç1ÎèM…ú iÚ²=íªúãT¤¯ÈgìüÅ@³Oúä1ë§àX¢…Z^Wr/]òÊ~ì\pw2[á?λTk@Ù+[„ºÝôv¹8!»‡Ðñ¹‘t˜Flä~>Ì][øgÓlYœÙø3#3KðÍðøäŽ2ve¸ÿÙN,|óoέ˜Â¼í®»àéR“åìîÃ\Htdg à^…ª%ì Tyr¥f÷—Ú©tՙʭëâ²v©§7²3¾+Nû¶pÀ#Œ–ås±ÆHîþ-þص‘qöÙq»4¡•=®, ÛûQ«²+³Î¤@ü1⳸*P]oœÚÝ¢q#""wx Â±=F}EÅE±xå:¶ŸLëy"7/"ró"æß÷Ÿiý‰¼PlØ,—.GyQ±VY\s¿ÖÞ¯[pg®ƒ³ýu¾ýV„ºÝ‚vÉL8NÔ™4¬F'üÊãW©.~•êÒâþîô3Ÿà¯÷_áÇÌÛ—s(­®]r®ò(Ï4ZÉèÑÌý~eöýJ-Š•¥‚ã|Έàð'NØÀX®‰×I~W¾å`çZ’Àà2”p¾~ǹTnC]çu¬K;Æú½§ñÞx,;ŒÔ¿òNÅ#×ôoaûè:õ5äú—áRº²Y‹~¿ÓM7""r*泑Dž5ãVýA^ì2»s‡Øºa ç.bo"$¬šÇ®§ÃhîQøCððRÀ± O {5û¾˜¼˜oó®n6Ìg²] ?3¦îšÄˆ1ûš ËKaî—'sƒ£•˺Á Ù«ùÍä/ô~‚Mßs0î8)× NAÔ+›#²jµ=)@`h0.Æ]×Ib¹¾åW.•i]×™uëÓ8²|+ŽenÔkUþâå®›1FŠ0v¯P¾x°ŸDΰãp"•öÎî‹Ìv¸Øª>AxÛY·â|R¢¹ƒÕŽDlÁÁ%×›µÑ• êUð3^;¤ìšÂ[ß°¥Lù*p¤B×~´\6’ÕI×;b{JÕªˆÓܳ¤ËQ§ŒÃ-_t iC¨óþ¹x‡¶KÝVTr¾™c¤c7¯Ÿuw®J-Ù1z5çRv0}ä‹ä¬‚©ü£<×) ˆ'dQÎ'¹•nûÏ&ÜCyæÃ÷xöþ:ù¸\œ@p/U…–=_cä 0<&üZõ#¼V‰ìßHJ!!#ŸëRF/>ÿõkMõ@¯ì¯ç;zX·3?ü„ ¼Šq EØ-\¸º¾]ŠÒØŽ”{ä=&~úiT™×ìo/š\ð)]‰=LJFÒ£²óuW1 nµéÙ»…ù±r§ º\Ρ»Üú ÝàBÛÐKßgs¦NëÊWÿÿy7aŒÜX™ðiü_~žÎuËãçfð*S…¦`ì¨'q6ÜÂóIDDnéÈ;ÃíÛïm-[DDDªh,磈:jÎó9gK¯5G-ee,8†4¡äÁ œ\¶šS=A°=€…„]s7ùO¶²âÖz©Wíù:Ï_SÓ‚··¥pðωL𷉍„L .þÔlÓ‹çdå«o±2` ï<›Å;á¸4mŸlrÝ`bM!òÈ N™.¶™-ÈES˜8{‡ãÍØ¹Ú¡ýñgù+¹ö;éej9ç¬s&±›g2é—¥ì<•Œ“uî{bO6-áØÏü畹ąô¢·ÿzþXE’KZõy‰þM3™óòÕe¿þF)&¿5—¸j}Pv=s÷—&Ì~¶§Ñˆ‰¼ZÏ[ÒFF øŒ·ŽŒú¶?!Ž:aDDDòRäK~‡}@¯j×<îT«¾Ü:ÿÕ)Ò8¸h-çq§é=y´– bV²âxFvü‰YÂgüÊÖSŽÔjÝ’ ñ‹øëdŽxt築S×ÙÞ|`O[ÇQ§P:v}¦¾qìšÿ"œiÿÒsÔsBøNo‚Žæ³íæÄô3M^ÉajñÐcТL<[ÿ”Ï—h“k¿•rÒßxÿÓ9D˜«ópχ¨aØË‚/_g\D—®&Úþ¼h_j…bJŠdùø)lK/E‡\e_ G¶}S™´2{ß`v¬ 3»×F‘¤G­g&ø4iM9Œ³Ô• IDAT…)‘›·Bep®@ר7ùe_Æå05rø;æMË–¼‡…“Á§3Büñ¿?‡]ÛX»4’'*Vä̲y°BÙ§Þã.¥1¦6Æîù÷X•ÉÉŸÏízÛÛ°ºÖ£gÿ¼CRÁrŠíç×±îøyΟË£~v€Õƒ€ ’8žÍgÛ¸T¬x`*BûeÆŸ"089ã^:”ÖÍÑ8*k)¼ËäܯNW5g:‡þ\È\höÜóô u!³¾=C_þuì¤WŸ‹›•ë˨‘ñ3ıdø &DžæX‚‘F¹Ë>sq{Ÿ¶¼óej¸°](A-û]lß¹ŽãæÊ6ì! _Úµ*‹ƒÎ‘›¨r†*Ó_°Ä®3¯ íT`˜vüÍÖtÀéó'~‹9#°~1Ÿêít"àJpEïì€âTšª%¹€²¸Pàó¹]o{ŽNÄo›Î´IãHÅüîÔ.ʶ×çÚ‡A'ñó¢5L³†é€GHz¬Wðr¡ÍÌù˜ìk–ë>xŠu9Ÿ‹9B|fö« î~¸™›#®Ùmo±å¿Žf¨C9×ì¾3xÔ¤Cm¶o`ãÑÖ˜v$@É®´ Rœ¹éêR¨êòÆ·t)ÌÆÖsl]°“,€„]¬[•ã¹”Í,Ú×›GKy±LÀRÓù Ï^©¦GÏ_{XoŸAäïc™¹5‘ªO̰NÁ$Ï{…ÿL?•G,ü¶…h’OŸÇ£Îc¼ýˆ?™‡·°aåæoYÌØ±ÁÔ|·lŽýænpܽ{š yGÊÚƒÍB†9«ƒ/¥‹ ]‹«Ê6¹… nÔèP§­Ùð÷"L±à×­ö:QDDDnI * Kì?ü}À¥ºñùW=/Þ„)£4ò¶.<@ß>¨0w*‘SßeÔÉú¸[ÍÚË«Oöµ-èùÜ®·½ K¦ÈâÔ¶åüŸÂÖ§r¤ v@Â1¶m;B5sAÛ…¤ÝÓùdZN!my°ai=ݱ'‹‹ öÆœû$¸qÜ//[9ò@+|6.bËü…”nY-dö†XJuù˜OZ^oßW—]Ú?ϘŒkµöÔwÙȺµ«› <%""R°Ûò;T§×,æ(P²ISrÌÎ.•[QÓ2w,dóý ÑPÿTv.[ÉA×–´-#”î\àó×ć·w¤â#}h[Î…¤]ËX±×V=CqNGìã¼] -ÛTÆ…ãÌûnv°­¥(-a" ók ëÖ¿˜ÕÌúùgf­ŒÁ¯~7^}¡)^Ž9÷;‡«¿LiÀ¥ZoÞzá~*¥naö´iü±Û‰áÃy¯g%®{ϸCAeçàR…va®Ù/}ͧDDD®Ç`³ÙljÉ)eËHú}A©žcøüNü0‘;ŒæJ¹ÂšÄá ËXôûN²(Oû¦þ """ TR$Y1¬þégV›©ßk mK™Ô&"""… K~""""7Ȩ&Q Q Q ¹‡ù[~›6mR«‰ˆˆÈÿ¼† z[}ËODDDäé’Ÿˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ(P‰ˆˆˆ(P‰ˆˆˆ(P‰ˆˆˆ(P‰ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ(P‰ˆˆˆ(P‰ˆˆˆ(P‰ˆˆˆ(P‰ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ(P‰ˆˆˆÜUê—‘Ÿ0ûhÆ•¬)Y<Ž?ù™1ØŠ]² 2Žñ狉ÎäʹQYÄmú‰÷ŸïM÷ðpz z‹É«£ÉPȈÜÓìnYÉÖ$ü=•ßöûñÀ³Ý¨[¢ø»J;<Ÿé+¢¹—ÆéŽSªUOqQïÉmg‰[Å×cVâùì‡|ßćó¿çƒï¾À·ÒÇt °S‰ˆÜ£nÍ%?ËöÌûžY‡ƒxäÙGs„)æ˜mÌ›ü%£Þ}—FOfÞ¶2l;šÑs¢0_Êcñ?rÏ[q®Ô™®¡.˜\ 8ÖîÊ Sò/I;¼†Ãž­éÖ<w'wÊ6éL#÷hvEkJDä^vó?RggÇœŸ™s¤, ~ˆêîW2›--’¿ZD|Øc<׫4–ckømÖO,ðÂý¡á÷œÉ(O°ƒ…„ýÛ‰/Õ€ªžF°&q.£*ÝŸ $zÇYR¬¾xêî/ù¸5z›Ÿ0-¤Ÿ?ÍÑÝkØm.K›5ŽˆÈ=ìæÆ[‡çOeib)JdF±çD Ö+O’¹–½x yE¼]ð­ÚšÎµà`ÄiŒ¡T°agLXØ·=Òa!¸£;!Íà^š°æÕ¦äßc0b4°œù‹ý‡òæ˜E¸tDÇÒºÜ'"r/»é³€1ð~úv­ÛaÜs‰(Ý“úÞ&ÀJúùd2â×0é“ .Å,K&Ær©d9T"´¼…y»bIw>ÊŽÄ2´¨ä®¯!ÊÉäß…Ïg´âÔ¾uü÷ë7øÀùK>ì视Q ºŸÞ©Vo;ÔëJ—#ã˜;kA}šãgoÄÑ݇Ryn`c¼6²RIÅgƒeê”#sþ8%¹l*ºÔCrG‰^ü5?ÅÝÏÿõ ÁÉÞƒÀÚ­éPýWFï*‘{Ö­[2zPã¡nÔJ\ÎÌU'1Û ¸VlLŤµ,ÞMr†™ '¶2û»ñüu,ûVt§À:”3oãïuI‡•ÃYyJî0ž¥àÀ_?2oW,iiÄí]Äœí6ª„•Q㈈ÜÃné—JtìÞˆ‰?Îdq¹A‚¾Í|Ô8""÷0ƒÍf»ƒ~'3ƒc|Ã,Û£ éZGõˆˆˆÜî˜{¾mY©$FogÕ>#ÕÂÊ(L‰ˆˆÈ]ãŽù®wæÉELúé0^a]h`¯ž‘»ÆvÉODDDäyQ Q Q Q ‘b³Sˆ€Åb!##ƒÌÌL,‹DDäprrÂÙÙùòØô³ """"7H—üDDDD¨DDDD¨DDDDîjE¾)=:C&w_‘»õ=ûn¢***‘»š~ØS(3y¥ADä68õl+*‘{mp+5‚ˆÈ-`øî÷ë.ù‰ˆˆˆ(P‰ˆˆˆ(P‰ˆˆˆ(P‰ˆˆˆ(P‰ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ•ˆˆˆˆ(P‰ˆˆˆÜÅ*qó&™Ï™Œ«·¥ìdþ§Ÿ°,*=ß×ZϯgÖç?q<ýFj`ƒŒc¬ùy1g3Á¦¾•[Ä¿Ù_ gPïw§÷Àa|1k+qY7HÝÌ;ááôþtñÖœC4‰õoöbèÜh,Éx+<œðAS9’ëœ!}ãú†Þci@æ f '<<çŸ^ 1ŽeÇÓ 1Ö³ˆÛôï?ß›îááôô“WG“¡®¹ó•[Õ†”2ïeÿisΨDÚ‘­Ä8T£z§[z æÈùü1}!Çcö²öçɬ>œªÞ•›/ósG}̼”Æ þì{~ùå{>ûO+l‹G3jö12/mg€´M㙸î–üÊ2€!nËš¯z8íÐR6%r&‚Ÿþ‚¦Neê“ùúƒA´v\ϸOfq4ó:0n_Y‰kø‡|ÿó|ô„/¿û‚ÑYêO‘;-PÝB¨œÅÑ­Ç1_úÈlMæøöS8U¯OI ‰{0Lõ.“¾ø†¿×D‘nÍõ滜ÿŽùS—æË9vLú˜¿§62b·±zê—ü0ê]&™Ìêí1dÚÀ±BgZÕrÁäbÀ¾fWšWrQïÊMgK9–´|¼3µýÝqttÇ¿ÆýôÐŽÒI±¤\Ï~´´*û&gM\>‘ÊÞ—FìØ²äi—LåÀÒ]¸7«‡—éêôertÁÕÕW7/ªµà‘Çá»›¨ çXñfOýxäòª“õÜrÞè9˜Ÿ£2I;¼†Ãž­éÖ<w'wÊ6éL#÷hvEkJDäŽ T\(Ó Cä&N¥Ú.橃ì;ãNHh)L){Yý×\[ö¡çÐWèÞ¥*I°?ÁRøÉ,-’õ3‘P¡ ¾8ŒðNAÄ.þ‰uGÓÁšÊ…Œª´íý³Î’fUçÊÍgp­HXÙ ,?Ùëös&Å‚ #^aýxµ_¼.ŸQ&|šög`­CL·Š³ys{š·Äeûb^\Pµ%ïcÉ^oÚ4öÃ.ÿ3󹃬]¼ƒd`Ü}¨Ó¾I›Öq2ÀJ|ÄRŽ–lC« {ܽÍÏßö¢¼½…ôó'Ù¿q »Íe pP‡ŠˆÜ$v7qªÁ!°!ìboT2åkº’|h+ç½êÑÚ×lhñLœKxစtWw¤™­PÈ«éG×åЈ‡›TÄÃiM³»X²ã4”/OÙ& (Ù¤´zVn û ýh5VÍgѲɼýÝ ÌÞ©Õ° ]iMˆ{Že%“ûdËßñÝŠš¼ÙÖùÚâJ7£µç{,Þ—Líú®$ïYÌ’íèå{Š…Wm™EäÄA<61ÇC®ÕèöÊ“„80„v dò 6œz‚ e/±ôíÿCi»ìÏMFXÎüň!Ó8މ'?¡ci;õ§ˆÈ¨‡ªÕtå­I©ZžcÛãðª[lFÌÇÖ°~þqÍFœÜH¶€_!еÙl€•Œ„d2ϯaΗ0\zÎ’‰±¬î—’ÛÃfÉ ÃâN•¶ORµí“`3·ý:•7߈å“Ñ=)Ÿc{£W#ú ÚÀ‹ßŒeYÍ¡¸]súѸ­/,ÚMRjìZr„€öñ1ʵ¡‰ÀïñZ oŒ0:¸áíå‚Ý¥Á³íC&2ãŸÓ„»îcÙé`îoìGΫ†&ÿ.|>£§ö­ã¿_¿ÁÎ_òaG?uªˆÈ¨°Ã'´[·y<•ƒçý©YÅ#6ÒÎfÁZ'š>ñ •Jº`Ì8Â’qæ3kY¯|sÉ’Ì…4+`ÀÞÍ{¿Ž<Ú·1F–ÔDÒqUOÊm‘ñ¾óbÄØç©á ñ­Ö†žýbÙüêö%êP‘›5?زoP*4}ÓZî&¹¿È–ßø-3yåå¿Û·RɈ܊ÐñÝJN=ÛªÐïÙwý×3"""" T"""" T"""" T"""" T""""¢@%"""¢@%"""¢@%"""roÒ7/’‹á»•j)ÚÜ¡_J—ÿe…ý¥t¹óÞ³ï&ºä'"""¢@%"""¢@%"""rW+òMéwóõM‘[A+T"""" T"""" T"""" T"""" T""""¢@%"""¢@%"""¢@%"""¢@%"""" T"""" T"""" T"""" T""""¢@%"""¢@%"""¢@%ò¿oã[áü§g>^›ÏÙØE|Úïv¥^ûÚŒCx£ç ,<•uÓ땳lkÌ<>î÷{R¹êï¹¥ïøˆ×^ý˜­Žù¿>?ˆYG2°žË¿ nÅñv»‚Ž· vºírµç-7¶Ïx‹·žîÍwÿ$b»Mý+ÏÂÔMäf³SˆOØS©mH'rÊKLIÀ[Cëà`tÀ1uyþ'ž;! _oÓÍ?©s–t¼‰²-¯Ú.îûX‹$+–=ORþÅñ‘„CÉj4z|5 À.~_¾½›–=}Ø0s9‡ã ”nÒ›g´Çß!g•ãØ0ú–Å&Á˜—˜2ø3ú5p%©€r¿xw?­ÂY>c7_ý‚G+:«ÿ‹u\§Oìó;î¾5Ø÷yÎq,[°ºg\ao>W'À3ŸÑÃWÑø“¹ÏO¡O®O—üDn¥ôƒ,ÙS‘žŸþÀÈzà1ùûÓ®Þd÷d¦.…VÃÇóÑ·ïÓÁq5ÿ¾‡ôk\Iª…ùpvóaRm6’Do€ØˆÃ$Ûl¤Gn"λÕ}‹÷柳õ–Î þvï¾ÔŠŒ¿?cêê8¬);™õÑÄÔ~Žáàõg«pôÇ÷™µ;åêËCv´ö:M½}iùæž®å\`Ø [®Ñ›jm*‘²eg2¬\ؾ”S¾mhh_¼¶,àx-9§îÂÖ°œ]Æ÷_.Áù¡wyüWôi’È’¯¦q$l60}â¼Âßç½ “ñ|CÎ͛̆˜ì½¥™Î -é;z2o iFÚŸŸ2}‹3÷åÕž—öwnÓ>ÿƒ¬VÃxgÒ^êÄÞ £XxÔœC/lbÁ–@9™ßïgÄ4æíÍuíÍäK“WÞ¢M) ÿšgx`½N¹¶„øs­ ­†¼B» ûb÷qûíz}’çqôʳnWŽåMžé;Ws2=;Ÿß²‚¸ ÔöU˜*‘Ÿ} ­oM€«#îšP¿´ä”¬k&c›ÕLjJFÏÊ4i,oô­†ãµ…Q²^(ŽÇ7žÎéˆü;w¤dôæìo=†ShJ:óÍÀ©]»7ÄÏÕïê]èþ@ ¢–láäŽ9ìpêÌc]Bñusǯ~º7…Ý+#É(vd’¼«°åp¯ÝrÉÙ Öxö­8_Ûæäµ€Q¸¶Ìïx·rÁze%$¥ÐuÌâìÚùœz‚‡[”Ãã Õ» ¡g·8XlàR›~Dû*áíæ†›—.ÆtÓ³•Á¡6÷¼@oOJÖ~„Ç;yrpá6­ù5ª…„- ˆô}”ðUñvõÀ¿át­•Ȧ¥Qd6“?Mº·¦Œ›#šÒ ÐFrRÆuî‘*D¹†’4éÓ“†5Ëáé`¸Íç@Á}’YÄãÎy,¥ª´&Ķ­ÇÍ`‰aûêXÛÖÇS³¤’.ù‰ÜJ&ü¶¬ ŒÕ’ɲ‘Ç¥¯Â´…´³…/×àQ‹f•&2Ói:ºîcÙ`Z4ôÃX Ù–…;Þs¤YÜ.>f%µÐu´|&GÿR8_.ÒŸ:í/^tµÙ‘ºg¿ßO\š ² øRySÂ9G]Êùb\Cª50ŸFµ’—Œ©DÜ.7­#>eÜHLÊn“'¥<í.·»¡PwG¢\;/ü=íþ¥s à>ɰñ¸s‹s%ÖÈbƺc¤¹ïas|e:ÔñÖªƒ(P‰Ü ŒÎc6Ìñç0Uï΀¶O“u>Š=Oà—ãð3„J¹?¢;•§^…Tæ¯_‡)³"áeÊa.—Îë×BZ% vsñªj½p‚ófeì @& Gã°z¶ „ïËöᵑ}õÃFVÒ9’ñÄÅPÜ60âäåVør „´­Bò×qÈe;qºPÃÇX¤¶¬P¨ã½WSR1êhÄÅljŒçH·ƒÈ:Ë®eÛplÜŽ2Ç0vŽ+á¯@ý wLé;ø~èø+uI>Mb† ì @NÆcq)s¾³¹—®XvF“l©“ °ep:G_7ŒÄbì¿\“ñß: î׌åE;řr÷Õ cò*v¹î!1ä ªzô&E8{Dä_d%eûx¾|ÿ¶ŸHÂæà†‡§Sþ'¦ÁrM‚8»dqaø;:@ì’œ jNY×âOÖô-Ì™¹3IÉœÛ5‡_ÿN¢úa„>HÕósøcåÍiœ?´”iÃ^á·\÷Á\™3IM·\÷­Ç­vQÊ5àR­0kn,;†ân¸±¶Ìûxëáa¼²O÷B×Ñ¿æí(9ƒ¿þ9Ijj‘Ë¿gúìÝdš XÒ“É2:âhigö²ñ·_Ø™”FrâÅŸHÛÌœ™›ˆIJ!~ß<~›ŽŠëg×%Ïö4áÖ™r±³™³ü0‰æb·üÊœ®„µ­€C±GÁM(·Pý_Ü~+¸O 7X7§Šm¨œ¶”Yž§R»…ûÀ ¢*‘; ïƒévà~Ñ—-&\ƒÂh÷OSÑ1ï ŵjSJ³[½ò8 *‡Q’}84®ŠÛ LΕzÑšùŒòÉNe©õèz„yb26䉗ã˜ùÃG¼;%›{0µN¯0k'0û’T­éÊO#1ùµñô ,`qÀ³å·ê4«neÂÞºŸÄŒ_^gø7é8•£Ýÿõ§š›CX_Øø%?½ü Yå¨Ý)œ'Ûý—_ÇO"´/ØùÞG}ëŸ|;ä3íKS­ó0z6÷Åd0æÛž&ßVôy)ž_§äí’°/Q•ýGð@EGˆ¿y#å¡ÿ‹{Ô'Ö¯0us ¡Q5;¶ï«K³*n(OIQl6›MÍ ÷Šhý¦ŸÜaÒw}Æ{?óŸ£´½Úã_î O|m/òæÀê—EnŸ‡»·îºä'""÷<[f Q+Y¸ÙD¶¦¤ÈtÉODDîy‡dôGÛñi;ˆÕ Rdºä'÷]ò¹sé’ŸˆˆˆÈ=LJDDDDJDDDDJDDDDJDDDDJDDDD¨DDDD¨DDDD¨DDDD¨DDDDDJDDDDJDDDDJDDDDJDDDD¨DDþ¿½ûŽ®²L?þ½é¦‘@HH2@¤ ŒÒ‚²k7ƒ XQ)3Ö®(:û[DQÇQš Ž²".®Ø]éËh@) UŒ@5¤“Üß‚¥Ìˆ¬óýœÃ9œû¾÷æÞçÍ“|ó¼on$É ’$I2¨$I’ª@0 : ’$IÇÏ*I’$ƒJ’$É ’$I2¨$I’ *I’$T’$I•$I’A%I’dPI’$É ’$I2¨$I’ *I’$ƒJ’$I•$I’A%I’dPI’$T’$I2¨$I’ *I’$ƒJ’$É ’$I’A%I’dPI’$T’$I•$I’ *I’$ƒJ’$É ’$I2¨$I’tDaª£ 0nE.Ï|‘ˆ½Å”W«Ük Ð0þn;ó4·H#àa•¤_M  U7c–çrËGk3¯g\×& i‘æ•$ƒJúå4}ukvñJ¯tú6N&<¤ê­ï”Wymm×ÌÉ!=1š•WuðÀJÒ¯Äk¨T-­ÛS ÀU¿«š1ßòëß$€Õ»‹=¨’dPI¿¬Ê ³!ª}åÑÁç_éB³$T’$I•$I’A%I’$ƒJ’$É ’$I2¨$I’ *I’$T’$I•$I’A%I’dPIúçTðѼ,ãþ—߯,¥âì;{FMRzŒm’$ƒJªV‚¥{óU%g¦FðÙŠíl¬tL$©º s¤ãÊ)ò¿ù†áux§Kzã[¦îIcxâÁŸQ*X½æ+~©H`XuIDAT²•¬ÂÎ8=+Ëø'¶I’ª"W¨¤ãê©2Þ_¾‡Ô3ÒèX³6Cj•ðª"Jl.Þþ5Ìͧ^ûVlº®-cRöòxn9ÿ`›$É ’ªýùŒÍáÖ¦ÑD†DrqËxòÖlaÙ~€ ²¿ÜÊÖSótzñß½Ëye_ÛƒÏ?4஑$ƒJú…5I8€©kóªô똲æ»çß,1Úƒ*I¿"ÿôŒª¥—Vmåú¹«~3¯grÏt®nšâ•¤_I˜C êèÚfu(Ü_ÁÙ›ÙXPRe_Gƒø(îj]Æ”$ýª\¡’$Iú™¼†J’$É ’$I2¨$I’ *I’$ƒJ’$I•$I’A%I’dPI’$T’$I2¨$I’ *I’$ƒJ’$É ’$I’A%I’dPI’$T’$I•$I’ *I’$ƒJ’$É ’$I2¨$I’dPI’$T’$I•$I’A%I’$ƒJ’$É ’$I2¨$I’ *I’$T’$I•$I’A%I’dPI’$É ’$I2¨$I’ *I’$ƒJ’$I•$I’A%I’dPI’$T’$I:AÜûdf’9àI–¸­h ÓÌ̾ÜùêJ ƒ´ª¦Çûe’™ù ÷ý´û•®Ëõ™™ôâ ŠâÇÜÿítnËÌ$óþ<’T]‚ê°À*ýš÷{˜ië*©wñCŒ¸ê b´$Iúí ;¡1Uþ-³Ç>ÄË_–sÚòHÿÄ€`9y‹§1iÊl¾ÈÝGT38÷ªÁ èÉ‚‡3&'œŽ÷Oä®¶1 >eäͣɎ=‘cn¢I¤I'©`!kÞȤw±aw9è:´èÑŸ!~O»Tîþœ)#Æ1÷ËÝD7èÈeCѧa4£Í‰³S=/IUЉûÚ]±Ç>ÄsK I9ï~¹æLâËß{šçïåàYîòUo“UÑœn]R¾!‹GŒcIAðès"»ÏKRÕsâV¨Ê×1wéwÿÝ»}'%•P# „µï~ÈV¢é<äôkMy»pn¿ã ²Þ^εÃzÓ2|9˾ÈbSéï,ü’b’èÕ­´‚TÆ´¥ßMMHlÕ†¹,Û•EÖ¦]ìÊ/¢2ñÀnÉ—1bD?N/¥{Ü-Ü÷Á'L_´…¨G›_0àfGW’ªoPA³¾Ch¿r<¯|6žG_;•‘ý›M)»¶õï×uè]¶­gWô¥ô>3‚eK³ùtcwB?ß µ/¡k]sJ'³‘ñQìüìU&OOáÄÇï?l¯ÐS›’IZó4ìd×7ùì8Öœ¨ˆux%©ÚUT;®¸° ÍÏ‹&÷ÎG™÷ÖHž­û$wžK\b$Îïÿt—Ö ‡`e¥åTF$‘Krï6D-ý”…ÿ3ƒÐ'ê„~ìðJRµ ªBj´eà}}ÙpÏ4?û(ÿ•úÿ¸ø_»QóÓ,yïCR»6€µ2}a)â©ÆÉĤgÐ.úS²>žÔ!óœ4ì)<¾æý‰Ï²äûOÊâZ\ÀYåÀ~r?›Ë»; YúÁ˜:ô"¨Ü×x|LÝjç2{úVˆlÃÅO¥Yý£Ï‰Ç{9â’TÕüüBQ€¨†—s÷¶œÂ&¦Gvr?¼å|-aúäɼ½"г2ïå‘~‰ˆnJ¯ö1ßÝ=õ\ÎI3§t2)bÕ‚ùÌŸðß<æ­(äôK¯£çéÑ,ŸÃ¼•të׊`Kv»+L°z9í›Lþ)…u;2`ø­t®JtúÕÇž’¤*% OŠ_**\ò •MJ¿¿òäe§žø¥3I’¤ÿ#¿~·T°náf¼ñûi@ÆÙuŒ)I’dPý$û·ñ÷ÿ|…¿—žF»þƒè™êQ‘$IUÊIsÊO’$©ªò¯\H’$T’$I•$I’A%I’dPI’$É ’$I2¨$I’ *I’¤êé¸ß)}Ñ¢EŽž$IúÍêСÃ?½¯ï”.I’ô3yÊO’$É ’$I2¨$I’ *I’$ƒJ’$I•$I’A%I’dPI’$T’$I2¨$I’ *I’$ƒJ’$É ’$I’A%I’dPI’$T’$I•$I’ *I’$ƒJ’$©ºUyÞÏ­“Ö8ºªò*v.cúÓ÷2øê?™ù®t7Oý÷Rò÷Ø¡h1#23¹úñ,vVrÇ` †÷çö·¾¥bßBÌÌ$sðˬ/ûÑ(Éaü ™d^9’ìb |3Óþ”Ifæ¡ÿú3èþñÌÙTBÐy(I'¥°ù`{×d1ÿ“…Ìy E=\Uqå›ykä(ÞM¼’ýMa׺˜ò×'Y9ŠÇúÖ' Å‹&01«wu©Eè‘+ü,æn¼’FM"¿¿¹xílí @Ä¡;‡RÿÚÑ<Ü£!Áröl^Îß§Mdücq4|z ÂR{×|â<”¤_Ø ]¡Ú¹z÷„‘pdUå ׳ds<]¯øάGddušŸÏÀ›{‘ZGáÁ©ˆd2.oFΤ |”_qä O¢cÇ0–ÌZOñ÷7±zörâ:·%!ô‡õMLL 1± ¤¥wáÒ¾‰Í[Á†=;˜7¼ƒ_ZÏÁÅ®Êsy ßP^ÙPìwJRUªÓ/Ä-· âÒfÑ^œ¥*/Óˆöõö0gÂsLÏZÅÖ ‚„Ð~ w <‹„ï?ÉC©yöM j¹–ÆÏgû›*œ´sº½l&kŠÛ¾f­L¤G§äc,)ݱ†g~ξøú¤ÅÕ¤uFc eñM9@%;³g³±vºÕ "‡’ô+s¤£¯Ëå>Góùï1cÎó<4n3¥‰hÙ¡]Ú&q‡,+…Ö¤ÓMƒX8lãæµ`xÏS¸ÔÎt¯ñ3söqf»ö}9“Õµ{Ñ?)—°ç~¾š8˜¾¹)&Ëî@“ÈV½iòüTæ^EÃz{Èž½™´Œ[Iu6K’A%l‚e”UÄÑ´çšõÁRòWeñþk/3ü<{¢ Ù?$¡#/dسc™Óâvb›mÉtê™ÄÛ3VPÐ:å³Ö“–1ˆš¡¹?Ú1”Ó®|„{º$B€ˆX¢ ;x¯FK2šLdê'[ÈŒÉaΖúœß)ùÈ×nI’~žŽ¢({47 ™Àʃ="IJïA¿}HÞö9»+›N 2´ýf^3‹-ûƒ‡…RÒY½¨³nÙ›²™µ±.m0 DÄ'‘’’BJJ2µ‰)€@<-3š²wA+Îe[ã>´«åT–$ƒJ: E7íÃÙ¡óyfì[,^÷-;vïdëW‹ywÊL¶§´¡YÂÖ„5hÃP:n™ÆÔue‡O¸Zmé]wÓ^|M zÓªÆñ\8 ¶yoÒ÷|À oä‘Þ§5¼þ\’ *édˆkÃF÷àÇLzø6Ýx3·?ò7–Ä\Ƚ#® aÄQîߎëÿx.5ޏ1‘Ö½±#g7M{·àx/{-*É£ }šÇbOIÒ¯ü=# I’¤ãç •$I’A%I’dPI’$T’$I•$I’ *I’$ƒJ’$É ’$I2¨$I’dPI’$T’$I•$I’A%I’$ƒJ’$É ’$I2¨$I’ª°ã½cII‰£'I’~³¢¢¢þé}Á`0èI’$?OùI’$T’$I•$I’A%I’dPI’$É ’$I2¨$I’ *I’$ƒJ’$I•$I’A%I’dPI’$T’$I2¨$I’ *I’$ƒJ’$É ’$I’A%I’dPI’$U a'î¡*)Xù_x—Å_ï!_³.¸ž/nIB¨­ª©bç2Þžü3—®'¿N©Õ€6WpÍ%íH Š3âšÇøªÃ0þzggjü%XÀ‚3­ýhžìõ5_÷$9IòØ3×Ò(âP’Ãø¡2§¨-üí~Ú„mfÚ°aLÛz賈¤V“sè;øzzÔ‹"à<”¤“Î [¡ î]ʤÑÓØÞávž<™1wt¥ðÍQ<=o»£¬ª©|3oÅ;…:úE¦Ly‘Ñ·v#8ó FNÿšòƒû xÑ&fí âh€@~s7–þàæâµ³Y´7ð£™JýkŸâo/¿ÌË/=Ï3ÿ>˜î‘ ÿس±üøça…GT’Nþ *Ù8Ÿe•gÑÿ¢–ÔŽŽ¦vó>ôëÍšeUIÁÂõ,ÙO×+þ…3ëÄGæç3ðæ^¤äQXy`Ljd2.oFΤ |””l O¢cÇ0–ÌZOñ÷7±zörâ:·ýÑêQ€ÐÈhbbbˆ‰M -½ —öíHlÞ 6ìÙÁ¼áýüÒzÊì]¹c.ôÊ+Ê9K¨`×ç¯óèí×Ñ7ó\sÛã¼¹jAµ$ÛØTá¤Ó•èe3YSt Øöå0ke"=:%ãÜ{Òkøxæç싯OZ\MZg4¦`Qß”T²3{6k÷ [ÝðcÎÃм9<9zÑ—<ÌÄžæöÎ{™þÄdrJ<Ö’ôs°k¨‘ ÔŽüî@ñ¦,þküf”ŸÏÕw”U5…×åòGŸ£ùü÷˜1çy·™ÒÄF´ìЃ‹.íN“¸C–•BkÒé¦A,6ŽqóZ0¼ç)‡?\jgº×x„™9û8³] û¾œÉêڽ蟔ˇ?Øs?_ML߉‡Ü“Îew Id€@«Þ4y~* s¯¢a½=dÏÞLZÆ­¤†A ìhóðTòg<ÅWõ®âßÎ=„´½ôOü±Æj"+‚ð®Ì’$ýBA,ÍeÁ”±Lœ[HËK†ñ׋ڒájUMÁŠ2Ê*âhÚsÍz€`)ù«²xÿµ—þ@=чì’Бƒ2ìÙ±Ìiq;±‡Í¶d:õLâí+(hÎòYëIËDÍÐÜíÊiW>Â=] !@HD,‰ Ñ„œJ5Z’Ñd"S?ÙBfLs¶ÔçüNÉ„s–±rK!Q©)Ä|œð:t:¯ŽZ’N€÷¶ åßò?£àÅܶÜ=ö)îÌlgL©J+ÊÍ C&°òàEOH’Ò{Ðo`’·}FÎîŠÃ¦SB‡ m¿™—ÇÌbËþàa¡”tV/꬛Aö¦lfm¬KF›Ä#LÂñI¤¤¤’’LíÄCb OËŒ¦ì]ÅŠ…sÙÖ¸íj…üƒyBL­(JóvP|ðiíßÎâf°|·—«KÒIT…+^ãõ¯[rý5]H*ÉgÛ¶mlÛ–Çö=e޲ª¤è¦}8;t>ÏŒ}‹Åë¾eÇîlýj1ïN™Éö”64;ÒûjÐþ†¡tÜ2©ëÿܩՖÞu70íÅ×ÙÔ 7­jÏb›÷&}ϼðFé}ZñÝÃ1ƒ¤víEêú©L]ð ûŠòY5ëEƽ¾‚²0ߎN’~®vÊ/?g{óxúŽ…?¸=ü¬áL½§µ#­*'׆ÿ<Œ7_yƒIOagI°˜d¶»{G\HÃ`ÿîߎëÿx.Ÿœ„‰´î݈ñYE›{Z€òãyn±gÑ¢’GW´aHóØW@í?æ<|ñž ¸û¶ÆO¾ëþRBtZ{.¾ã&Úĺ’,I?û{F0ô·¦%I’~×ú%I’ *I’$ƒJ’$É ’$I2¨$I’dPI’$T’$I•$I’A%I’$ƒJ’$É ’$I2¨$I’ *I’$T’$I•$I’A%I’dPI’$É ’$I2¨$I’ *I’$ƒJ’$I•$I’A%I’dPI’$T’$I2¨$I’ *I’¤“ÖÿÍq~Qü IEND®B`‚163_snmp_version_create_field.png000066400000000000000000001265641516513262500345320ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/16_fields_snmp‰PNG  IHDRVr˜Ž?bKGDÿÿÿ ½§“ pHYs  šœtIMEá  ¬•µ“ IDATxÚìÝy\TUÀñßÌþƒˆ*®¸‹[škj™š-–šši™Kš[¶Ùª™¦e™i®iV.efe枚殈û.JlÃ23sß?pAa†@ÓÞçûùôGrçÜsŸóœsŸ9wTÌúSA!„B”šZB „B!…•B!„VB!„RX !„B‹TŠ¢È‡×K¸Ù[%B!„¸…ìX !„BHa%„B!…•B!„VB!„B +!„B)¬„B!¤°B!„ÂJ!„BHa%„B!…•B!„VB!„B +!„Bˆ²å !¸÷8»û0¸azUt'Ì ’Ó3Xw:–OOfh–ø!„¥¡qñ¦…¼ûWG>ëG1kH,æD¦„_Óo"²‹úiÑŸ à•å—î¡¡VT©*{ûÕçójZââ’Xpò {óÜÖ¶ç»W¢•V%3B!„(qQåÃ'7`a§F¬®ï†Û¢Êƒ7º4⻇²±©>%¼Ý–lÇJ9{ç0ogMƵòCs§£`Lâà®Xª›ÇØFÎd”{™ÑY¡xýÇdj}Bø­sEÏŸ¢ÖæxN¯ÿäÿr#O@…«;ÎaÏóéÔ.”Óä[yº2ðÂÝEOËðl–þµ‡¼p^¨X }e=Kvì@•]•g+;Ûu~«çÊúãÆqî®dÆ&’£TÁQ˜2ø'5÷žè•ÿQ¦ÑgØq{×”<þøë0/hkÒäô1&&™Pdn!„öUN¼Ù¥!“n|¦*É*"ýÈÿÌU#V«ñøáÌW¥¦ò¢ñÀa4‹ÿegs^õ»R?õg–l9Gš!‡äÓ›øbô«,8ž*wªµ !aýZ*4¦¢Ö…ÊMƒ‰_·–İ©êfÏï7s®´TêØß#ßðͶ‹¤e§rfýb~¾dº§{óÞö¸Và—hàxë0ù¹;álÎáë ‡z1“Ì !„Ân‘k(ª ,Ýx€?¸åíZFðªoÉJ¤2ù”ŽÊ3’/·áðGÛòÿß»)CßHfþüÉ ›†Ù#Œf¿ÁËMó?xîY«!œ@‰¬Œ«JÕÄ œ[ÔÄÓÎï°z®Ä›Ç9…=ÉÃ3™õýx^œ¥!¸QWžíœÀ÷Ð`®ÆòøZ-ë­Æ¡ç+°þüUNäi¨àÃãåT,øu//Åe§J!„(¡ûŽñz`C>λåƒê 7„NXPYÅú¿Ž1­„¿¨REîÓ% Üì­w¬m­»7/6¨@ïŠî„:Ajz¿ˆeúWe´„BˆÒÝÃÝx8ÀÈ–8íŸiÖ8Ó>XÍîËÙd—´m)¬î½ÂJ!„÷'ù#ÌB!„RX !„BHa%„B!…•B!„ÂJ!„B +!„B)¬„B!¤°B!„RX !„Bü‹ä›×…B!ʈìX !„BHa%„B!…•B!„VB!„B +!„B)¬„B!¤°B!„ÂJ!„BHa%„B!…•B!„VB!„B +!„B)¬„B!¤°B!„ÂJ!„BHa%„B!…•B!„VB!„RX !„B)¬„B!¤°B!„ÂJ!„BHa%„B!…•B!„VB!„RX !„B)¬„B!¤°B!„¸?9”¶Ãé kWT56w"í}m¬×rŽðé Ø¥ÿǦ2ó¹*8–űÿYÙìÿ ?SŽ(·ý»·€ T ­A‹nÏðH4v·m"åÀï¬?‘5éÔµ1þšRvWIç¯ñ/0ã´µƒfSô\Þ¾”%köqêâò¼C¨V¯=Ï>ß…šj0Åóë«#XrÌœÉñW85gã7¥¡<ÿå4ºiÐùœ—>ØA6î´0‡áÎÅŒœÕFÒðÚ3¯f­¢EØ{Œ]|Sö.VíN¦Q§4¶ÄÃt…u¯eÁÅkmglb|Ÿ]´ž0—W"œKÏ‚´ÔjI-­…Ÿç¥qdÃÖ%¶ySžz¨b~»ÅÅØªÒå‘Ba¯Rì+åpfó~2¼[Ò³WG‚8æC·?Š2¿~ c?ù•SÉS ¤œßßÌbŸþöví9¶¦d¶ÏÏç«÷“š“ß¼L’Îì`Ùäøþ´ņfÒö|É„ErüfŒ¤_ÚËò¦³)éÚmYÉâø’7=s-‡.\![¼«—9¾íÞý9%›@ãO†þùÇÇFkLéœ;›~í,ñùGI>}žlÇ4 Õ–dKˆ mŸ Áµ*çü®³d+6ÆCíD@D}*y\oËJµPÉ]Sfñ,[blQ)óH!„¸«…UÖ)6íÏÀ»Iª†5§u~eÅÙÍI)PY)ûY¼ä09>ÍxîÍÉL?€þ¦B7e{Ž-òv·…•ûs5UÃG3f1ýíg©éÈŽm—ȵåút&êõÅ»¾ËðΡ¨L'Y¿÷ &À·žy¿ÅÒýæ-[Îâ©ià¤ý͂8Y7ÃŽ'å!–#q7wT.Ÿ¸Bž’Ãå£ ùÿT¥9án%{„§r.Oõ€kõå•®mŒ‡Ê‹È¯ñÒÞù/ölΠ·FóX¨cÙÅ3s+ïôéA·þ7|ù%ò,Ž¥-1¶P“•2„Bˆ’(á£@…¬“9˜àM“¶•Ð:hhÞ:˜åËãàìf¦<ÄÚücOm&ÚàA›/Ó­ž+*ª1tÄE޾÷'ÛµùX Å…{mž:½Ú›Z4¦¢34~¸;y`ÈÌµéÆª©û¯ôl‰— éîM“9™W²0aâê¡Ä86âÙ'êá먂*éûðoD­¾BÖþ-œ××§Nh3ª;nãP^G/dbPN“ ª jx&œ!éD Y†\Ž^ίDCšÕÊ?g‰Êd-î×7» ™”ÒÇ£¬âi?)6Ƹ®CùYÊ<B!î^a¥dq|Súüí*ÚVÊ¿›5oEðòÄqŽÍRèðH L¤_JÌß•P…YÙ…ëuƒKX$!ª?9¦Ü¼™Ú~¬…‚ȧ6-›¹°kÖ´”Óç.“j°ÿ=Êà|ýä®xhó 0’síw!óòñóOn ç21&êT¥y%8tbÇrUuœ$ Rû”ûù {âŽ{%‡SiDÖõ£Äßr`Î%óúµjÝѪJ²ŠgÑ^WáRÁÒÕ툱o᢬´y$„BܵÂJÉ<ÆÆ¨kw×´Œï³±Ð1ç· ¥cg5×j‘"·CÔ¨UPpËÞc‹¬-Òö0cÌ4vfh ŠhN§šA¤l\Í]Y…MA1]ÖéMxÝP =½s Â[¨½¨Õ´"œ‰%ûÜa¢•jÖ®EØnØsþÇŽfàQ›FåKþí\Š>ŽÓÉ× ¢r•ñq(}<Ê,žÅ}x½41.êÕ¥Ì#!„â.V G7p$¯˜ÃÎoaJ' ÔàUÑ q˜”ËŠÑó@üýåC\¾åSîö[Wv¬¸V„ó—“èä9Ñ|¾nu™†Í3Ø Èm z¿6.ÿs?ø×«ï÷±¤ÆmgS–4õ©ì‡_ _8‰-›R0NÕ›¦-iŸòˆß¾š¨Üü ðæá¸©J»ÏRƸP.–6„Bˆ»UX)éDo8š/siÈs/?B…›,Æ+Û™·`'é\`˾dîR÷m‰ÐDsĤãÏ™³©4¤;5ÕgY3w#i·n'Øql‘û+n< ÓóÉ…3k³3»lÃØ(ÿåq$öóÃg¨Ú½*Zݶ}=¯÷¤¢}ŠI=C˜#87&Âõwvd§r>¨X—PW'ÜkW@óG*)1Y€Š*„ãjë竌W9}èf­‚1;…ËG·²zó™ü¯p{€'›û¡Æh_<®Ÿ;/ ½ùnƳ”1.âBJ—GB!Ä]*¬”´Ãl<–ÿkѱùm>ÄàÁá•;ÙÿÜGò#])çÓœ½×óúw§ÈKÙÅ¢I»,¶¯²ãØÂ ¨_Ÿ•¹JLË8áäF}^™|3¼S¥î l³“©ÛR9½ôMž_Zð§´¦!× NçJ4¯¦aÇáü¸yT«¯F…¦bÊq„ü_ ¡iMOlÿÜú~œ>¹ˆ÷¥Í°4òPÙ¼Ê{i³‹‰ƒ_ã±w'òô]Šg©bœWÖy$„B”ŒÝ_·p5j#'ÌÎÔk^øo²iCy°Áµ/Dºø'û®˜'B»¿Ë´—¦^¨78âÖ„ž¯¢Y¡ïÁ´çØÂ\j>Ç[ƒÚPÅK¸T³-?ú„!õó?Œ“wøö¤”A) ö¦éËÓ™üB;"*zã õ¦bÃGüáÇ nâ}3¸*7ª6¯tc7¥b½ò8~Õ©|=€¨çWÒ­kp ¥fã‡yaÂT†5»ynÛã¡!°í ô¨ë—ÿŜى¤å*w/ž¥1e›GB!DI¨E‘ñ !„B”Åž€„@!„B +!„B)¬„B!¤°B!„RX !„BÜivÕÕ«W%jB!„ø¿àããc×ñòu B!„eD !„BHa%„B!…•B!„VB!„B +!„B)¬„B!¤°B!„ÂJ!„BHa%„B!…•B!„VB!„B +!„B)¬„B!¤°B!„ÂJ!„BHa%„B!…•B!„VB!„RX !„B)¬„B!¤°B!„ÂJ!„BHa%„B!…•B!„VB!„RX !„B)¬„B!¤°B!„ÂJ!„B +!„B!…•B!„VB!„RX !„B)¬„B!î${_m–  !„âÿƒ«[P²c%„BQF¤°B!„ÂJ!„B +!„B)¬„B!„VB!„RX !„BHa%„B!…•B!„ÂJ!„B +!„B)¬„B!„VB!„RX !„BHa%„B!…•B!„ÂJ!„B +!„B)¬„B!¤°º£~ރ瞹ù_ÿÙ8s gtæâ_l8Å×C†ðíÙ\ûO¬dqòûwÙ§íHàøçýxîÕ5$™¬¿Ì”ð+oõŸHTvQ?ÍáØ§x}Å%òÊ(>ÏgýÜ÷ÒŒ×}ÔÃé¹ f«c÷t›ÿúØ”âœ%ž 7æ}?¦îÊ@)Mÿ{ÞíÅÈEgÉý·Çïÿqþ–QÌõQ“2æ'âe˜gög4º“kY0a,£û÷à¹Þ÷Ö–í¸Œ^AüG8ܽSið)¯·öAmÊ!5ö8-ŸÏ‡oÆóúÇ/ᦺ3§5&µ;–ª¯ÎcxCgt/3,;OÙ«¥äX¾F5¦œ¯æžnóÿÒy?‡á ÝPÝÇ9!þ+1Ï%îɼ¿èáO<Ç çjè¨#öØ~š;†½Q¯òîÐføHêHae;gWÜÜÜPá†kDkz½îAÚ+Søaçã¼ÓɇԿ3÷Û-œNÉEåL½./1¸»/;&Ofkj&|0’ÌqÓZÏ‘+EûTÜ L¦d¶}<‘µ‰:˜>†/FL¦Çåe|sn  ú˜-|?ÿGvŸNÆä]–½†Ò§](Ž·¼c5°s –nåtª#Á‘ð@ε·¦«Dÿ0›o×"1ÇïxvÄó4,*´F‹ýv±ò'ýè/,^¼†¨K:kѺ÷žn›^ËžG¾àýN(q?3~Ô÷Ðç &u†¤u¼?zM§}J·àë3UÏÉÙÙeÅ´áupL kxoÜ6Z2…Nå(ú\-‚Q_^Æø qJ§¾¾l]¾…“WTThÑC;â{rã–Wå™ÚGøuîh‚©×åE^x¼.®ÿXˆSÏw©»ööX¸Ø•¥\¼·"ú:¨6ÑSo=çààíLx÷$?£eíwG©ñÆ4ºéÿ(²Ý[f‘­s­Ð¼ŸÆ+MÝȰÖ÷[ú3¾U¬î:XŠ‘­ãìd$åÀræ/Zlj'B[>I«ŒÕüÝd ïvô&Å–õí>›/·¬©æTþz8«Â'òqÿpœsÊ&\Iõ‰3èYYeq­tM½u¼ª¾ø0gçî牯"©heu0^%ê»÷˜¶ù)šòÔí<z4ÄóÖ-JËóÕlÏz{ZnãëoOQeÈ ^m@þª„…jÔªêÁ»oÎá‡6uy±ü_L´˜7Öæ§­ëÌ]¸üŸûW÷mTnµh×Ð…Øý1èÓv±à«]ø>3Ï.`Ê+MIZ½€mÉåxäÍ7iëëOÇ÷f0´ž Š¥cn{¾§ñ§ÍëïÐ9È—Vã¿`dSÏ[Þ¹*YÑ,™´˜øúC™ôõ">z©çNàÛ#Y·<:Ƚ°’OgíïÇ|6÷cúW;ÅïG319G0{t?‡Ù_M ›v;‹¿;†¾¨' ¶öû¶ÉøÕÔ_Èk÷Ÿ,ZÈû}Cˆžý«/yQ·‰/ {Î’¥(dž;DŠ ž%SQÈ9¿—Dß&Ô(øöÇ™JmêCôv.êóåä}’Ú‰Èås]0ØQª/{Ú5%mæËO6âÒý}fÌÿœa-2øuúNé­ŸÖâ8” ?æÔ}lNm͘™óyï)wöÏ{›ïsºð朅¼û”;‡~ø‹·uݹþ8f¯XÉ’V²hî«<àãNÝn- p°=ÏŠbNÛËO{+ÒwÊfNê…ÏÁ%¬8–ÿ¼Bv)«ÓZ3ü³LÙ’ì_¦2×UÌvŒ=ñ/6nEõõ”w‘ç4_ÝÍÛ]yxä«<âú·Mùaó\+bÞ›‹ë{þt u´~ƒ´#G-Ÿ)þf|¾¿^1sþzíæÇ¨4Ìv®÷ë|AíCÝUÉÜ·“¸<3W£6q) =­B‹AÁñêêdó›—°Ž­¦G7g Óǵ%÷÷i|µ-“÷…l;ÖûÛVtǶrÞ£=Z^/ªnÒVîÆSu Dm»Hžµ¼±2Þ¶¯3wá> …Õ¿Iƒ«¯+æL¹®õ0y2ÛVÅÏÝooÜÕzÒõEnvk%Ñ3£f¿ó£ô¼>î5îÅs-áЖó>Ka fÓŸ¤×@ŸvUñó*G­®/Ò­ÂÍÐ)fYY¹¨½«ñиY|<¨Ú¢Niw¿M¤î[Ë™€§è÷HMüÜ< nÖ›^õ2رá2¾‘õq‰ÙÃe½žØ‰w}˜À¸}ùÿ¿/×úM(wÛ=¹J["”(vÅÀ”ÈþmI„uŒÄGmí\JñY2ëínÛÑKük C{Ó«u%¼¼*Pÿñá êQ­©ø Ø6Öû“ (Úp:?Ö?OÂ"èTîÕÇ×Å‹°È†øÓ1Xª^r/±~úlÎFŽfhû ŠÉ³â–*EDÛžíu×âÞ‚–! :].  rªGÏ~móõ"¨þ<ßÅ‹k’f.éXY‹¿±ø¸Yék¡ëRÐfೄøçO%—º/1¶ßÏüöÍ8†Ä;S©YG:?ÑfN…>×a¿Íd%g¢ñ«€§ææô¯èŽþœMHsj¨æp8æ\t£A×–èöÌ":æ2š3*j¼Rx»T¥Um# wÄíqŒ)Õx¬jŒVÏe,¢0EQlгµvÍ·åCF|Ú r¸^žcM:å¿ÛL±ÜÛÇÁzL*'\µ×nrj5j ®×n¶*µÚò.“¢ãÈâ)¬VžäþõqWŸgF¬~HãEyo‡7#uƒ5ÞaÞHJG|+û£Þ‘H–IU±²ÿ<.7+}-¼òxSÁÛÈ+~<®§®s {ÇüFJ#0çØ2~Ftq™¸Ü|îèKEoGÎØµNÜßóEåU—vÕæñÓžxº»`[|šæïæ ãU\ìÔÞ!øÝ :>a~h¶§cr·é¾àXâÔàâ높‘€Î~…¶4òÐ%eãàᎣ*ËBÞ˜ÐYoñö¬3wý> …Õ]£džàÏC9TìJÞ¾L]åÆsã'Ò,Ôýa¾>§è&›µ¾YçêãŽsØó|8¥ šü¶ót)èðÂ=ëǹº’›ˆ^©‚£ 0e5P0¤¤àñ4£;ô'/õQkç²`R2>³†SS[Ú~«qósÃt8Ž S$.@É%5. ­¿;jçŠ4«’Í;vâN¿Š•0TÒ³lçTÙUyº’smºÞ®6†yÛ8ävŒô½©ë¥*ö\ùá1ß,„ŒéÄg˜lгÕk(t¬3¹'SÐ+äßtŒW8¸ñ Ît šÅ>(è­ƒýÑZòݞ͟3k_8?îFˆÖ¶<+öw6T*ÔŽ1éâIËUÈOJ#i—S1¹úáªI-ÅXYŠ{Š‹›•¾u]µ=ùQÌkKžƒ×û®QSÊu¸-×,ŸW²c’ÉUª_k#øŒüÛ–Îæuâ~ž/€fØÐ¶ IDATÊ“Úk°hÙNN¸F‘þ üÔ¶­•EŽWñ¯3§]&Å ê¨òH½ŒÙ« î óÕ‡”Øç WăTœÿ#¿ìïÆˆ|nYûòb7óÓA¨5ª2Z-äW‹ãýìZgîö}@Þ©2 “>›¬¬,²3’ùçÄ_¬˜:ÝÎx¦¥Š>£Z‹Örâó׊ï9 Ë!=ãÚ£%ÌkÛ¹Æâ޵mVãY¯+uRfùŸçH7ärzsǾʒ9ÚÑÚ¡>G¿aéö‹¤g§rnÃb~»”¿@颿0ñýE콤CѺãíåŒÊÂÍÅZ¿ÍÞåø6y”ðÄU,Ût–tCñû–³4Ê–« U¹Þ2„¤ kI nL­ aMƒI\¿–+¡RÅÂ]Û¥j{jeobÉ/W©Ù©öµIgý\ÎÎÞ8eŸaÏáxôy:ή[Áþ +ÏœnŒW1×pË‹ jÕrç–±rW,YÙÉœÞô5 V%×AÚbÌd76öÇ©„¹srŸ-I¡Ý«ÃhvËo'YϳRͨœ},[¾—x]ÉÇå›_S¨Þ9?×bƪÀ\Âæø;”.nÏik~Ø0ÆVv ÊnÌ­ç¨mœ¨Ðî!üO}ÏÊ=qdÒ8³î;¶'›®­“¶®o÷ë|¹97Ü":Q#}-ß®J¢Fçúxª(Õ_ÜkÖïgÙ²]Äé2¹ý3‹~×Q¯[#¼Ô¶Ì×,ëë½9“˜ý;9Sôg'5AØ#˜èÏßä‹•;9y)‰”„óýs1¿³„+ Ð'ÒËÊΗƒ•ñÖØ½ÎÜ•û€ìXÝùÇ~1‹F1lѵôu "¼aOÞ÷(ÕÜÔ(MòԮϘ;jF¯J4z´/u\Á׳çsü³þÔ©ãÆ¼ C˜ñÖ^±vìŒÑÔv±qZ{7å…×’ùfádÆÌKÃìFãîo0¨‰'êÄË`Ø“Œ~9“ùKÇ3b¶†ò »òô# lDëa<{b&K^Èl“÷ÐÆtÝŸÚ">S`¥ß'Þ,ú & -ÃÆ¥²hñ$F-Ôáè_“–CÞâɪù'ð¨Ù‚ œ@‰¬Œ‹JÕÈ œ[ÔÄÃÒ u­N«öoHûšî7&²µsihEß'÷3wæ;Qó¡ž<]3†ƒEÞ{n¯‘ ¬_Ã-/­Ø•‘¯èXøí› ý\KpcºŒD=wj7K}ÐàgmÌvô'¥$¹mà⺠Äésˆ{§¿ßX¹óêœ7¨g%ÏJó5mhnú)C¦‘æXžº]_cP+ÕVÆªÐØ¸Ø÷Æí¶sލhGŽ'Þ,ŽülžkvÎ#;ÇÜZŒløsþšÒQ/§3wñX†Ìô Zûž<]ç;ð¶c}»?çKUÑ=‚vµÍL?Ö"®¯EÖ×ÊãïDX,Ô¬½®É@p©Ö‡‡YÃÇC¦“áJ£§ßb`/ÔI¶Ü|p5X‰[n";|ÆÁÖŸP'ÌB¥R¹P¹Ç‡|Rc ËWþÈì_bIËu# ¬õûMeLÛ*¸ªÁ\ÂÜSaç:s§ïÿÇTŠbßÒl)Nÿôœüj³•ÑL³äþÁèiŒù:ŒñÓž¡‚£Äã~cJ;Éoª×ÀI˜X÷æxN÷ý’Wê¹H€„Üî!®v>Û“¯Éü?£äéH=¿•Õ{54é.“Iˆ9mßLþœgÒ1*y\Ù÷#$U¡i¨ÌH!÷ûƒ„àÿ‹áÌbÞÿ0 ÿŽC讕€ñ/p {Šá½ç1ê~ÌVáP›£†ÒÄ[%Ár¸ÏÉ£@!„B äQ B!Ä¿D +!„B)¬„B!¤°B!„ÂJ!„BHa%„B!…•B!„VVåpìÓ¼¾âyÖS²8ùý;ŒìÓ‡v$püó~<÷ê’Lw©/†S|=dßžÍÀœ¼žwú¿ÇÁì»©ãœ¢ä §ç2ü™¬Ž5–<ïïÁ<¼'úp_Ï‹ûsÍ»L ¿òVÿ‰DeÛ—ƒw„r•¿ÞêÁsÏXøïÕ5$$ZÎ=ëóÿN¬)â^toóº1‰¨Ý±T}uÃ:£ |™aÙ¡xÊ>›¸G9–ïÀ€Q)ç«‘`Yóî7*ox÷"MzNÏÃLÝKLÛµÚ¬-wuþËš"…•…wv.aÁÒ­œNu$8òȹþ…ï ú˜-|?ÿGvŸNÆä]–½†Ò§+{>žÈÚDLÃ#&Óãò2¾97€ ‚1'¯gÂÛGéÔ×—­Ë·pòŠŠ -ú1bhG‚,´Ù.g¬õ¥àǺɓٚš Œ$sÜtJ‰;æòþªmœOÕÜò9^)æœN)ë™ðv-:;±í·ÝÄËÓ¬ï¼úß®9D¢)ˆ¦Ï¿ÅàÁù÷tKzÎwOòð3ZÖ~w”o|JÇEÇÄê_ÑÐsröpf™G1mxœSÂÞ·ÖŸL¡S9H?ú ‹¯!ê’ÇÀZ´î=„§[£¾¼Œñâx~æX"\S<¿¿ö:ÇûÌa\#×Ûß·’½Š¯ÿNtlÚ Mè6x]jº£ÂÈ•¿3÷Û-œNÉEåL½./1ø©:¸¦Z˃ۮ$zã–Wå™ÚGøuîh‚©×åE^x¼.Wo×4ºéÿ(|]ÍÙûÁpV…Oäãþá8æ”-L¹’êgð´ÇYVÏý›'¾Š¤bIòþöñ¸òÐÎ>eØËbsĉ”Ë™¿h'Rœmù$­2Vów“)¼ÝÐZ î|þŽ ýë¶kœNߪNÿ¹5oh=ç2É'“•¹ç~k'ŠžëÝ}ÙaGßœÍW‰þa6ß®;DbŽÞ5:ðìˆçiXÜ-O…ƒ³Ûµ£ÎŽ*T.¸¹¹Ýø{zæ,+¹o(0ÿMöôÁh%ׯµ9«2Þµ¼öô¬ìPñ¸[ë½å5Ýý?ð&â®\Bî…•|:k~=>à³¹Ó¿Ú)~?š‰ +š%“_(“¾^ÄG/ÕàÜ |{Ì…Ö¯¿Cç _Zÿ‚‘M=¹ýþoNÛËO{+ÒwÊfNê…ÏÁ%¬8–b©Í#Y¬õå–’3˜GÞ|“¶¾þt|oC¯ÿÅyýiÖ ç…OñåG½ð>¸„OäX=§˜S÷±9µ5cfÎç½§ÜÙ?ïm¾Ïé›sòîSîúá7.,Õ6%<çÕÝü°Ý•‡G¾Ê£¾'¬k™3•ÚÔ‡èí\Ôç@Éûþ$)´‘LÉÛøjê/äµ{O-äý¾!DÏþˆÕ ö=HÚÌ—ŸlÄ¥ûû̘ÿ9ÃZdðëô%œÒƒ’¶‹_íÂ÷™ |¶pS^iJÒêlK0Y̓"Cyv)«ÓZ3ü³LÙ’ì_¦2×UÌ·Åë׿‹¾®Wêv¨Jæ¾Ä嘹µ‰KíiâXú¼¿}<î…<´³ØËbrÄÿ3>߉_¯˜9 ½ƒvócTÚ͹jåüw# ^c—PÇÿäšW–ùdmîݨG-Íõärvõ-ûÈfo€Nãç0û« tÓngñwÇЗÕM͆Ü˱£Åæ:€ÚÇêÚS6ñ¸;ë}qkºV6ˆÙô'éµЧ]Uü¼ÊQ«ë‹t«j]ôÏìw~”þ×'Ð݃ Æ½x®%Úržâ†JÑѶg;Bݵx…· eˆ‚N—K†Å6OrÆJ_lÛ—­HçÞíqÓâþ+è²ò¬^G. hÃéüXCü\< ‹lL Suº?V_/Â"âoLÇ`.ãsªh3ðY¬†ã©Õ%޳s•¶D(QìŠ1€)‘ýÛ’ë‰ÚDê¾µœ xŠ~ÔÄÏÍ“àf½éU/ƒ.Øñ9"#‰­ábhozµ®„—Wê?>œA=j£5)àV“'3°mUüÜÝñðöÆ]­']o²šEŒ*§zôì׆0_/‚ê?Áó]¼8±ö iæ‚ñ A9ü‡…뺈s½N„ëö°÷Ÿ<0§½ù2A¤Ü-oþ w,ïÿµ<´©Fl¥µÉ㟭ëH¨Ú—ž-Cñt$¢[Zûªm:ÿÝÈß›×X 'Õ]û»»æ)d–a>Y›{73×mí›P̲²rQ{Wã¡q³øxP-ÊìÏ Û˜{¶õÁ†\¿¶›æeqí)»xÜùõÞžq–Ge'ëq )‡ËõµÇÁ‡-`";) }Â*ÞðÛwgŠ1uD&FÅÝzÃ/Ê{;ÜH:5ªbÚL#=ÛR_l¤ñ$ÈKsóœ*U±×‘«*'\µ×&ŠZZã‚ëµÅX¥V[ß5*é9¼©àí˜È´gÀÚã@—ª´ªmdᎲ=ޱ#¥5ðA‘¬äL4~ð¼Ñ=-þÝÑŸÓa,b¡¦È¿ùm"#> mP9\¯÷Ã1ˆ&‚®½Ì¬£ËønöI®ähpóu%ÕáVóÀB(½Ã¼1øŽøVöG½#‘,“_xåY½.Å«.íªÍã§=ñtw;Á¶ø0:4 DÞašK‘÷Ōǿ•‡6õáúµÚKË9bD—‰KpÚÃåKEoGÎØrþ»‘¿7®±Ð^ÖdÍ3[]7ìÍ'Ësïæ5«Š™ë6öͱîKŒí÷3¿}3Ž!ñÎTjÖ‘ÎOt£™‡S±S«Ô¹=ílîƒ ¹~ýLמ2ŒÇ_ïíg)¬,§®dÅ&¢Wªà¨LÄ_ÍÔ8û¸ãö<NéB &0òt)èðÂM[ÌãpjUáM8Ëmººb……¾ØúáF{Ïé…»aKéXÒsªThÔùǺZsqp!¼]m ó¶qÈíé5zS×K¨qósÃt8Ž S$.@É%5. ­¿;ù§1ß,6ŒéÄg˜ŠÜ8uós&÷d z…üÅÅx…ƒâü@BOÏ`ê*7ž?‘f¡8èóåð9ÅÄÇÂã%]OÇÙu+ØŸQÔ jÕrç–±rW,YÙÉœÞô5 V%×A…QŸ‰Q­Eë9ñÇùkÅ÷Ðåž‘kß  äìcÙò½Äë²H>þ+ßüšBõΑx«o]è¬]—n¨‘¾–oW%Q£s}< -²Ú²Íû{!mêC¡·ö%Ì'*´{ÿSß³rOÙ†4άûŽíÉ%{Tpgó÷ý¿¶æ•m_-Í=Ÿs¯Ø¹nSß²ÐEÍaâû‹Ø{I‡¢uÇÛË™›J×Ö»C1Yv¯¶3“i­·°'×-­=¥ˆÇ¿0_¬³ìXÙÈ)ìIF¿œÉü¥ã1[Cù†]yú‘6*寮ðZ2ß,œÌ˜yi˜=ÂhÜý 5ñDeL)YÉa¥M-–ûRø~@:nÌ›0„oÍaDE+K›µëH¹3qµçœVÍ;ÇŽŸ±¿åTêVªRtµíZVì;Þö5ÝolkÚ2l\*‹ObÔBŽþ5i9ä-ž¬ªEC+ú>¹Ÿ¹3G0Ø)ˆšõäéš1,ò# ]ùŠŽ…ß¾ÉÐÏõ¸7¦Ë˜AÔsW£j2§v}ÆÜQ0zU¢Ñ£=x©ã ¾ž=ŸãïDØ—ðmhnú)C¦‘æXžº]_cP+4Wo+¬\€Ê=‚vµÍL?Ö"Ü‹|¼P⼿óÐŽ>*­J˜#Ž!Ýõr:seÈLªµïÉÓu.°ÓIcÿãœ;œ¿ÿÕ5odƒ²Ë'‹sïÊÍ¢ÁËÚ\ÿ¬¿}óÁÕ0ŒgOÌdÉë™mÒàÚ˜n£ûSC ä&²cÁglý uÂÜŠþMìÒ?+ᵕ>Üv;rÝÒÚc9¯Š‰Ç]Ÿ/ÖÇ™y£ïûÂJ¥(Š]E{¶ñdŠ[Ëׇê1 KE Õ¶ž“_`¶2š©Ã"nüêñýD=1_‡1~Ú3Tp”1¿çs2í '¼©^#'`J`Ý›ã9Ý÷K^¹þ›‰¶þ}Ÿ¿÷3™{w3×ËdÄd¾¬3í|¶'_;'À”Âá]ÙD6/_dQ¥äéH=¿•Õ{54é.7%qW˜ÓöðÍäÏÙx&£’Ç•}?òGRš†Ú—’¿âÿ%×˂̗Òs4~4zª‡ÅÎ,æý£ðï8„náZ‰—¸+ÞbxïyÌŸ:„³U¸Ԧè¡4ñ¶ïA ä¯øÉõ² ó¥ôäQ B!„ò(P!„â_"…•B!„VB!„RX !„BHa%„B!¤°B!„ª,˜~å­þ‰Ê¾;g8Å×C†ðíÙÜÿÖuY`N^Ï;ýßã`ö݋ӽ0®†ÓsþÌVÇeÕ¹×s­Äs.‡cŸàõ—È»í'ú¨É óñwpø öíß[,Çàž›ÃJ'¿‡‘}úðÑŽŽÞç^]C’é_Z2îàam.ØzÞ;1Ÿþ«ä B…¸ Ëw`À¨Æ”óÕH0„¸“ˆÚKÕWç1¼¡3ºÀ—–Чúÿkµé¾-¬Œ¤XÎüEë8‘âDhË'i•±š¿›Láí†øðÝ“<üŒ–µß¥ÆSy8i)s¿ÝÂé”\T®ÁÔëòƒŸªƒkêz&¼}”N}}Ùº| '¯¨¨Ð¢#†v$ aã'Äñü̱D¸¦x~íuŽ÷™Ã˜à[ûråïÅ–Û¿¥/Óé[Õ©à{BÒ¢Wñõâ߉ŽÍB[¡ Ý£KMwT˜H?ú ‹¯!ê’ÇÀZ´î=„§[ã˜b¡ßƒj=u2[S3ბdŽ›Îààí·õaÝôÙ®õÁ³ÐŸæÎìý`8«Â'òqÿpœsÊ&\Iõ‰3èYÙ}̾Ÿÿ#»O'cò®FË^CéÓ.§+ñ1Åñû¸±ìyä Þï€÷3ãG}}¾`R÷`HZÇû£×ÑøõN ä‘¸c.ï¯ÚÆùT Á-Ÿã•¡ v²06Ý}Ù1ùÖ8 ½íïg飧1nyUž©}„_7áŠ&˜z]^ä…Çëâqu½Í1UŽXnÇK£Ø›Å›ˆÉs‚¼Üãz–Õsÿ扯"©ˆåvœÍW‰þa6ß®;DbŽÞ5:ðìˆçixûhë99{8³Ì£˜6¼΀)a ïÛFëO¦Ð©óQ}Ùò\ú—Õ9wÉòkÇÕ7Xé»b{^{‡zØÀTL¼,æš©Dñ¹e-Q $ì\‚¥[9êHpä#FЦÙß§¦Ó>¦ùÅo‹ÈåªÄα¶¶Ýûà]©ÍMñ0ãóøõúˆ™ó§Ð;h7?F¥qýKÜÍWwóÃvWù*=°à«]ø>3Ï.`Ê+MIZ½€m ùû³æ´½ü´·"}§,`æ¤^ø\Šc¶ïM*i»¬·_ /]Boýk¡¦¤Í|ùÉF\º¿ÏŒùŸ3¬E¿N_Â)=˜’·ñÕÔ_Èk÷Ÿ,ZÈû}Cˆžý«/,÷û”7¼ù&m}ýéøÞŒÅBÁ><âú·Õv-ÆÜRb\©Û¡*™ûv—`æjÔ&.´§Uˆ#JV4K&-&¾þP&}½ˆ^ªÁ¹…øöHеøh¨ÛÄ—„=gÉR2Ï"E‰Ï’©(äœßK¢oêûk@š5GÂyáÓE|ùQ/¼.áÇ9–Ç&¹\‘qºþìRV§µføg ˜2²%Ù¿Leþ®«˜íŒ©¥vL¶Æfì'̘ó®ÅþZ‹qö‘ÌÞÆÏaöWè¦ÝÎâ/tµÎTjS¢·sQŸãIÞ÷'I¡ˆ ЛV·ü­Ì«¬ôÝž¼jŸ¾ÄÆX?gþ`k¥‰Ïu¹Vòé¬}øõø€Ïæ~Lÿj§øýh&–þ8E^Â:¶šeÜœ%L×–Üß§ñÕ¶äbóÊžõË®µà’—msÖå¸ÅþlCp¡9lÏ”ùÚ{Ò•6¯¿Cç _Zÿ‚‘M=QÙqϲuþ<ê{Âæ±-ÔŽ-÷º2Xwm³µùT’>ÕsØk!—­®m÷ƒ»RXý³u UûÒ³e(žîDtëOkß›§VT´ø,Ö­„¯O=LžÌÀ¶UñswÇÃÛwµžt}þ¡h‚hÛ³¡îZ¼Â[Ð2DA§ËÅæ¿ËãVLûúâ㤺åbâ_k¸Ú›^­+áåUúgPÚhMFR÷­åLÀSô{¤&~nž7ëM¯zìØp\;û}³!(‡ÿ°Ú®¥w¨–ûsçz×íaï?y`N%zóe‚:lº ¯-²ïöæ•í1 ¸x™kRJŸkÛ Älú“ôÚèÓ®*~^å¨ÕõEºU°¼¤ª›Ð«gSÊ»¹âWû1úwóãìúý\вžö¬_ö­—ñµaκž´Ô¿“œ±3¶õëÂm×}÷ÖÞk%p±÷,ÛæOާVÛ>¶··cS¿K¿î*6ÅY±2ŸŒ%ë“•{½åµMÞ ‹ËÄ%8àæö®£/½9s£ÞTðÎïŠÊÁ¬£ËønöI®ähpóu%Õá7ªa/Ê{_ï¶ 5–o`ñg‹m¿@_n_2â³Ð•ÃõÆuѤSÇÅäL4~ð¼^P«´øWtGN‡É®~ìCYŵ[ô{«¯S¼êÒ®Ú<~ÚOw·l‹£C³@4˜ÉLJCŸ°Š÷üv£‡Š1uD&¹Šµø€6¤95Ts8s .ºÑ kKt{fsÍ5^ Á‰  ñ$ÈKs3ªkg*nlŠ¡ñ#ÐåÆàà[ÙõŽD²L~vÅ´èvâIŒ/yl ޵;Ö}‰±ý~æ·oÆ1$Þ™JÍ:Òù‰n4óp*œ1.UiUÛÈÂ1d{cGJ5kàƒ£Õk47WlºŽÂ¯u±Øw]yåbG ¬›ŸE嚉ìÒÄçÚ8f'ëq )ÇTqð!Äßò­U{‡àwsÄ'ÌÍö+\±’WF ^´Êî9b}-Ð;gƒÉ;g©i¤gÛ[ûeþ·ÖÞkF±÷,›æÉjÞß>¶…4Ûú]êuצ8ƒ9Ú°½OZ³å\¶¸¶IauóM–¿ Ù1Éä*ÕóÕ˜N|FåK¥B£¾ön~ß ¦®rã¹ñiêƒþ0_Ÿs˱j‹µ”ùæ„4¦Ÿa*¼[`CûuÑ›{n~ÎäžLA¯pí:®ppãAœhO€Ÿ¦Ãqd˜"qÑJ.©qYhýÝÑj½ß…ª¿ë}Pãf¥]+ï­¿NåIíŽ5X´l''\£H Œ~j@ÁÕÇç°çùpJ5ù1ËÓ¥ Ã wÃ+ñœ+Ó¬J6?îØ‰C^8ý*VÂPIϲ;PeWåéJΠ·4†6ŒMqïuñ¤å*਌¤]NÅäꇫÆö˜j,¶ÓÿRĦÀØXޱ')±8D<ÍèýÉK½@ÔÚ¹,˜”ŒÏ¬áÔ,t¿r!¼]m ó¶qÈíé5zS×KeÓ5Z+Å]G‘¯UЧ¤XèûË”·9¯¬µs{ ¬[Ýâz¡Áµ4ñ¹>Ç]ÉŠMD¯TÉOSñWs­<Ú¹LŠA!ÔQä‘z!³W+NYŒ›ª´s¤˜µÀ¹b1sÖ×TKcçBêŠvÅÀæ~ý[kïµü(öžeÓüQ[]OÝTÅßlêw©Ö][ãÜšeܧÌ}“­ä²¥µíþpW À íÂÿÔ÷¬ÜG¶!3ë¾c{rÑû-F}&Fµ­#äÄç¯ßs@—Cz†õÇ}jgoœ²Ï°çp<ú<g×­`†¹ÌÚG‚Zu Ü¹e¬ÜKVv2§7}Í‚•GÉupÀ·É£„'®bÙ¦³¤²ˆß·œ¥Qn´ìX§bßôç‘YäV¾Æj»Z+ ƒõשp‹èDôµ|»*‰ëã©ÊâY¯+uRfùŸçH7ärzsǾʒ۟£¹¸Þ2„¤ kI nL­ aMƒI\¿–+¡RÅêJ¢?6ãt­…œ},[¾—x]ÉÇå›_S¨Þ9oµ}1-ºÆ„6°36Eö×ZŒ³ÐEÍaâû‹Ø{I‡¢uÇÛË••°¹TmO­ìM,ùå*5;Õ¾¶X[¿Fg7ÁL IDATçŠ}óÌL¦Å¾Û“WÖÚ¡ÇÞš~¥Ž–Ðíð9ú K·_$=;•sóÛ%+ûÈúý,[¶‹8]&W¢fÑï:êukLH}ÛóÊÚ1—d-(vΪ­Œ‰;cpsNس¶ÝÁµ·HNVïYj›çO)×S[•jݵ5Îê2îSñ÷â"×6s&1ûwr(&Kv¬Cº3êåtæ.Ë™Tkß“§ë\`§“æ¶ÍM^MòԮϘ;jF¯J4z´/u\Á׳çsüËKe@+ú>¹Ÿ¹3G0Ø)ˆšõäéš1,£öó/weä+:~û&C?×ãܘ.cQÏ]…Ú½-ÃÆ¥²hñ$F-Ôáè_“–CÞâɪZH±Öhuê¸1oÂf¼5‡o¿.+í&Z¹uX{ r ]m3Ó5ä…÷ã ònÊ ¯%óÍÂÉŒ™—†Ù#ŒÆÝß`POT)ÅÎ&0HQŠ€ ‚HW@ª`è½ ÒÓ³éÙ÷GCIAŸs<ç=²3sç–™ßÜ;ÙÜCç»O³,¯\îAîb!ïøˆ$×Ôê<’‡ëø`1çS7WqýÚó|ø5] ³ù]\¸Š:¸dL&-d˱d¬Á•hÞc6 Å96ﺳª‰Èíë_›:2Ò³nÆÊÜKÇ¡ÏÑ©MqÎ.ýеGÓÉ›²Ï¬bñÂ}x6êC'úÓ°Øq¶ýž†‘×ý%e›R¿ï3ôìÝ÷ƒËØt,#e7«Ø…G“>ôxê:ß[‘äõ‹Ø›`ÏÙζ]IÕ¸{À0îoèÆ‘Å_²!£í‡<Ë} Ýø}Ízb²ò/7ŽT3+Ò²W³ϑæP»Ý¤nâã%Ðî¥qLÿ:\W3á«]¤ýÙÿ61sS¿EÔ¨nøo™Ê×;SÏgŸ_YׄçÇ~Á¨Nžlÿ"“ÓÚñÚ„‰¼ÝÉ“Íß,àpFÎ~ÒNgvBžا’òÝ{Œ]Ož]ÊìGȲ$oZËY⢗s4¨ÍŠ;c¤lgâ“9Qc MžÄGUà@ÔëLÜž‚8â70mµ;ížz†Ö Só=Ç 3fcÞOV‹ç;e"£z'zìÛÌ>’Q`]ˆˆ(Xþ‘ž³?|Èo¿Ê„óÿEù–“™Å*ÒþÂë4ªŽ·›;¾å›Ó° ÛvŠì ŸË"6z+i%ï¢~õbxºûZ·-5ò)¶ÙŸŠMjàæŒ{Ñ*” 4HKÍÆp)Cã¾Ò¸Z1<ÝÜpõðÂÅœIZÆù[•s(Õê—ÅÓŃ€råñq.NÍúáx¸xX®,žŽ²ù—³%ê×!ȳ(•êWÂS¿p[2Øl™˜}Ëq×scÓ¿¾ hXBhÕ­9¥<]ð o@“âIÉ™€áν÷Õ$Ð͛҄XËÓñ¾ê¸ùP:¢&AÙ‰¤ŸïŽ&k5z=Ô”Òþ>­ñýïña翟g²2á[½5å“7²þD8âˆ^~œÐÈFu2HÞ6 ®myôêñô"´N7i›W&0LA´ì׃fÕJáoÍÿÿç±›±7¨#ýÚT$ÐÛ°zÝy¨z?/9’³Ï<êBDävv–Íø7ïKëJž¹®ùVÜô óJd&ØÈŠ_üÑë/,ö,Ì%R±¹>—”‰KÖ??dñ$ÀÇ9ŸÃ{âëa¹p³Á”³¡Éb&ã÷5¬[xŒ¤ 3®^®Øì|¡ŒÎ¸:OB&3&³ËùmMæóeÌ¿Ürûs¯ÖŸ‘Ícîägé}Ê•2õ"iß¡= ½Î¯oY|(æët¡ÿ™s/ˆ›¬x¸œïcf3f‹ç;¶É|q wò-I·?·u& t æ5g°Ù!¯ç “ÏD–ŸÀŒ §è䱇§Jrw½`,8°M ýô\Fô^ðW¿ÍÎÄ\ÅF¦8ùRü|¹ <ÇócÁcÃX ï ÃÍ… 0OÒ%c/¨.DD¬ Ë„“»/^¾^—¿c•+|9{ºá|®‡·9gËžšD:¸dlºð9_2bÈ4Bq3öT’³ò;ü.ßéûç²èWtïKÙ wÌ™‡Xöù‚«ù•[né±±8Ué̈ÈÞdÅaËãûF Ÿ¡bN Ç|òƒ=ùñ™8›€lâÇawÀ#¿wÆMÞÜYñÓײÓ}+gÊÞKí3`àîç‰kÉ>|ø^;ŠXrúmVr,Iøà•±L&,çûsçx~,xx`ßz’${mÜ-€‘IìÉ\=±wÝêBDäVò/-V™p+S0Û/lÜz’ÔÌ llaåãøåxF®Ï9ã_£&î¿/aãŽÓ¤¦'s6z [Ï]ýËKŽÌtìf+ÎN”ý«—ó{jéiÙy¾¯uíå–ÛUrô8^xyë%c¸xâçãzCƒ#íW¦ÌØÄ‰äÎíúž¨ù±Tj[?sþýÓ³Jk*%.bâ·g©Ô¦:>¦œ÷©~Õãæ1uå!2ÒˆÙ¿œO†>CÔî´Ë wŽ궥ܙ¹LYv„ŒNnšÉ”hš´.ƒ‹ºŠˆüGýk_Dcò¨H“N‰ü²d:3Û0Ü‹Pª^wš•÷À”ë{°œ‚sW»4Vý<‘¯°à^:µãØuµA®üÝDìÃOã¶àp¡TÝ&4«õ3kü@¹K^—rËí/°é úìù”¨gf´Ý‚W‰xº7•\ÀH¾~ÇqjJ#û^ëÿ>ñÎE©Ñþ97 ,ð{ÛLž•‰¬ê`ÔΚ Ìõ•'&ߺ Ã_Œbàø^%¹óþ ®ë)öâÀTØs´5cèsqŒŸôE%ãX‘¦GÒ­¬ ΝˆÈ“É0 ãj68©wOåj-|ÿ-õó…ÿm jö¯•9mÛû šX’×?ìBqgµ¡ˆÜfÁ㳟9ñH³B_·o5úêd‘[DÖï 7s)W|2ãS»'D†¢,&"¢`%"p.ٞLJ·WEˆˆ(X‰Ha¹U–IŸ¨DDnEú K+++Q°¹áô["W`úìgU‚ˆˆ\ýýCß¼.·³«ùæu¹ù®Û·-Šˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆÜ–®úåõ[}íSDDDäFÑŒ•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•È´ñ¥N<Ñ#ÿ†/äÜÙ%¼×ïv¤þ;åË<0žz<ÎâÙj¬K)œñ/õîÅg’0.ýyÆ>fÀœC™8b¯S[^8îƒ|²ö4û?íÅÃcÏ3Ç™ïy§ßìºâñÓØ÷q_Þœ}Œ|[Úˆÿ[}öFö§ÜûÎ}®ùwú¶Q ö[ÎüÝâܨ¶¾…ǃ\;'Uȵ‹xa Õìéž8Œ‰Éýy驸˜­¸¤®üwxH+º>A ŸEu©ì³ìÚø¥‡Ž£o Lÿøq'з†+¶àÁôI-×?ñ˜kòý[}öFö§‹ö¬îùoQ°ùWX\=p;?”\œM˜œÜpóðȹIŽTÀÈ"fíx>ønÇâ-„4xˆ‡ûGb5H?¶’yg³å@ vŸrÔí2ÍJàrÉ]>ûø F½u’®£Ÿ¦¼`?Åòç‡s û8+±†Ñ/ï¤IÖÏZÉÁEë÷¢oÿH‚3²8jm>­M(YÄnšÆ´iË9c!¸ÆÝ4 ØÀz¯§yªÞZÞÏcÿkººœŽØ%y–%ÄšMìúÉ|5m%‡ã21¹‡R©Mz=P·ø%Œ~y+w[YÿÃNe¥f÷ÔMø–9‹¢‰±‡P£×HjŠ…¯7°“´k>³¦.dçñd¬A•¸³ëÚßieËo°âl2ŒÆÄAïÓ¯Ž÷_á*û$?½7Šuñ6xóIR†}D¯ÐëЖöÖ_tÜQ´ûc³÷åÕê¡Ï¹9_4»ÁÙuS™>ógÇ;Rënj§…IV«Ï^ÔŸìñìžós–F“æ„wùVt܇ZA—ÜVì'Y>âi¢[ÂÓ‘Apjï<= ºˆö¡çóá3‹©þLk¶Em¤Í§µ ¹ª@Ï®é¯ðùO»ˆ·¥Ò]Ó½CM|,…l“ÕÖ·øxx¤Ž·.ð×HK"7Zú~–í §Ç{“xënxGOeáÞ4Œ”íÌ5™3Õ2bÂ$ž¤G'¿Îœ)WyGâ&m£ã[Q¼ùz7|¢§òýî‹×1²ÿ˜Ï„ÿ­Ãû¾Wyõó÷éZa??,?Afû¾ÚræU#q=Ó'¬Ç·Óë¼6>Š‘ƒëû}ëÏä¬9âeM\ýO?àɶ‰/2/­Oüo"ÃðdçœϸºòØcW1õÃùd7{ŽW¾˜È°ÅÙ=þmó¢þ3/Ñ¢ˆ?wŽø„Gr‡*§Pš?÷< üiòâzßáv}ÚÒ˜ïq »Ÿ¬£s7îWü:¼ÆkŸ½Kç²ûX¾Ë†ã÷Ù‹>²3Š)ˡوqŒúßë´vYÍ7Ów‘~ÙÓG•"ü9÷ëAR Û¡hâLp6ú 6à ýð&büêP9ðÚfÁ²Î,f½-ƒþ7•W‡5#óÇ÷™²:GaÛäFµõ->DÁJäæåFó®Í õpÁ«L}j5°¥daÛ1m®mérou=½®ÝÎ `çχ ;—…Kõ;7§˜§ ÞeP'ÌÀ–œ{/™œX±Œ¸J}èØ¼,~ÞÁ”mû­B º¤\e9ó*‹á^noŽ¢[Ó²øyzâéë‹»9¤ôœ‰áN‹ö5ñsó&¬VAÖò´n__7ÂjÕÄßžH†ãjÊc'aó"v¤SëŠøyxR·;÷ߑĦåG®ºŽo|[öÜ2øcåO$WîK‡feñó.B¹¶j¾Á}6û²µáÈ 5%³O9 Ë WÂåòT«:.Ç6r2=SÑgi{A'Íùÿ[~ǵz‚¬×xs­ÃýëìáŽ_å{éÜ.€#Ë6óǶ¿Ù&ש­oëñ W¤¥@‘ÍâM°÷ŸOã&Ì&`'í\gæòÁ£ .ÌZÙ™˜+ÙÈ6¸Â4þÅ7aŒ\·9‹E|œ.ÃtÙCvRN§à‚ÛŸ?rò£X KûwzµåÌ£,&''RwÍàÛq{‰I³àîïNB6”üs;“wëùp`6c¶¸áî|~[óŸ¡ájÊã 5Ɔ% žªßÿbž¤NÆËMÒ–êܲŒ¿>—“Ž{X‘B¶åõê³s­ÚŸ=æ±ô«gYtÚ•âu#i~_{jyY/ë}Ö°z„3Ž]ÇŽa:êA•¶ ±mËžcDZ0Qö‘âX9rmÁʧ8~*ØßXÖœ#îôßl“ëÕÖ·óx+‘…É„ù²‹¸W_O\Jôaø[íÈY1ÈNŽÅ†îWºèŽ¿–z²9›l/à—Ïß…ÔgH7ÊàiìIœ‰Ï,`ÿ×PÎ<ÊbÛ<†±ó<èôüÔ.î…%}_>5îjo£WQ3îØ·ŸÄf¯«02I8•‚K çµM×_¯¶¼†sóHýñ¯ó vÏ¿-oHŸ½8xgÄÅb©Ü™þ-{“„]?ŽgÚ;1øŽBÙKïÑ®¥©U&•…ëÖbÉ §S±Rd”Jgþº_ ­,íKºBƵÕ‘xœø ƒbÎ& ‹„£18|¸ïïµÉõjëÛy{œáÖÊ6ïJû ¿³ãj¢UÙn<Ö/•é3žçÅñV‚kÞM‹*ûø0ç³ÿ«)g¾7€ˆ‡i·q4_=Ý—lïRTkÓ‰ž­¾aæ¸/Ø÷BåToÍè3,Ž™SßâåIÉ8T¤Î£#iî}÷‘s«zðÕ[ˆ>Ž‡Ã®O™®õÜÌgs­Dú°1mæ ¼8ÞBp{hßú4«²Ï°éËÑìhüKxÜ ‹¼¿Æƒè°ïSf|˜Év Å#hõdoÂ]®ÜþP”=µJãj2a*A{°Ö«˜3ëvÜÊ>Hs2vÈGØ\KpGÇ‘t‹ðÁb¾Š6ùÇÛúRø61 ÃP5ÈÅI½¡™Kû>Äìb¯1¢s =e‰ÈM!ôŸ>ÓR ˆˆˆˆ‚•ˆˆˆÈÍEKòŸ¢¥@‘››–EDDDDÁJDDDDÁJDDDDÁJDDDDÁJDDDD¬DDDD¬Dn~û˜9xså|ƒ#v ïõ{…©7Yov™ÆóBÇY|"ÿ¿µ‘¾mßý–3Wø˜ãÌ÷¼Óï v¥Þ˜cßÒýÈùöý¾¼9ûØ ü‹&ùÃH&úµn¼4å Y7ªMDþaú+"rs^œBZÑõñý,ÿ©c‹ÚD¬Dþ³~zoëâmðæ“¤ ûˆ^¡€‘EÌÚñ|ðÝ*ŽÅ[ið÷$Äj~l%ó&ÎfËì>å¨Ûe š•À岿Þj'iÇ\fLý='R°†Ö!òÑA´ªà‰ýø F½u’®£Ÿ¦¼`?Åòç‡s û8VË`÷œÏ˜³4š˜4'¼Ë·¢Ãà>Ôò;{YY{ßa%i×|fM]ÈÎãÉXƒ*qg×´¯ŠSÜF¿¼•ˆ»­¬ÿa§²‹R³ûê&|ËœEÑÄØC¨Ñk$µ ½ø"âˆcãCXTæ ^ìŽ3àˆ[ɘasu ÷–2»~2_M[Éá¸LLî¡TjÓŸ^TÅ-~ ½º—f\X9c'¥úÞÅѨʹù´6¡dç¹ ;ž]Ó_áóŸvo)J¥»¦{‡šx]<=RøúÏ<Èâ¨u´ù´6!±KýòNšôðgý¬•Œ1Q´~/úö$$÷fŸ¼aýÁ{qÝ„?û!휹â¶Îqù”×9ƒ³ë¦2}æÏŽw&¤ÖÝÔN3 ¬ç¸Âß…üŽQ¼û}áÛ$›øßf2mÊbÄY)Ö w&}ÇæÚï0´•/ñyô#­ßÈu¢®$ò74îyøÒäÅ1ô¾Ã-çÓ÷³lW8=Þ›Ä[otÃ;z* ÷¦a¤lgΨɜ©6&ñü#8:ùuæìLáÒÛŽýÜ ¾½ ·ö¯òú¸éS?‰eOåPzþåIßÅ”åÐlÄ8FýïuZ»¬æ›é»Hw ½¬¬öØULýp>ÙÍžã•/&2¬Gqv›ÅG3rnæñ¿²&® þ‚§ðdÛÄ™—ÖŽ'þ7‘ax²sÎŽg\zEñ£R‹²¤l^Ëé,‰[—s"°uÜ1×3}Âz|;½Îkã£9¸.±ßG±þŒ=çÖž°¿¸ÓlÈ3D–ø+µ´]֙Ŭ³·eÐÿ¦òê°fdþø>SVÇ`Ï«®¢þ/åHÜÄ¢Íat|+Š7_ï†OôT¾ß}ÉúÞêøzõ‡K릥ÿž|·Í«¼YGç0nܯøux×>{—Îe÷±|— @å)ìñ3ó;FA±ê*ú}^çè8ý#QŸ®Å¯ËÛ¼ùù;Ü_d ¶%ä¿€~$¢`%r3r£y׿„z¸àU¦>µ‹ØR²°í˜Ç6×¶t¹·:ž^×îFç°óçÃ\üÖS6ç~YÈñâݹ¯q)¼½‹QùÞ!ôèP«½à'ÑAjJ&fŸr46–®„Ëf6/âp`G:µ®ˆŸ‡7!u»sÿIlZ~„LÀp §Eûšø¹yV+‚ kyZ·¯Ž¯›aµjâoO$ã²»¥ ¯j­)eÛÈÖ“YàˆcÏOÇ nÙˆ 'À½ÝÞE·¦eñóôÄÓ×ws:Ié烕)ˆú}zP·j)|rϰٵ÷w®K°‡;~•ï¥s»Ž,ÛB¢ã¯Ùª”B×ÿêÔBýÎÍ)æé‚w™Ô 3°%gbü#ýKê¦$Nû¾ËsÛ¬<ËkãøÊŸH®Ü—ÍÊâç]„rm!24ç6_y² }ü½Îçù»º~åsLåäªÅœ ïɽ JàåLùv½©ç—s|£€~$r=h)Päz³xìm¹4Ì&`'í\gæòÁ£ øs¥ÇÈÎÄ\ÉF¶A®å;¶Ó)¸„ÁíÏs¡FdHÎí'î²[ œÿ“Ÿ®Uû3 Ç<–~õ,‹N»R¼n$ÍïkO-/+¯.9H±a (†ç…¢ºà_Ì“ôÃÉ9O÷&+îÖó7D³³Å w眽˜Ìyß(MÞwаìn:Å]{Xº$ëç,Ù99‘ºkߎÛKLšww²¡ä…+’/!>—_–Llgö)Žß… tÆ·D–5±¤Ù=ÿ:ßB×ÿ•ÚÔ‡"Êe„éì—Ö=ßsÉ4ò*¯´˜tÜÃrõ+'?ŠºXžL£°ÇO 95¯c8_•o¿w¤¦M²±²áôWý9ûSÔ×™#…èG" V"7#“ óe÷]3®¾ž¸”èÃð·ÚhÉ DÙɱØðÁÝtñgÝý]ÉÜKºV}Ž+~Ã¥^+ÊäLKýµ´’ÈÙd;`‹} IDAT‹¥rgú·ìMvüvý8žiïÄà;fe/){€öí'±ÙkãjŒLN¥à艙¸¿qþÞ”oYÛ7k9ྕ˜2÷RÅßœ3k´y cçyÐéù7¨]Ü Kú6¾|jÜEug1_ ÚΑxœø ƒbÎ& ‹„£18|šâaI¾†ú/l›þSýáÒºÉ[Ì•yÓ‚{°;©'În”ÁÓØ“8Ÿ ˜q)Ä> >¾ s¾Éãɿߗ-d½º¸‘v,†L£üù}$r&)ç7 mõ?‘ë@K"—‘EjK f<«ÝCÅøyÌÿùIiÄXÎÔçžaöÞ´K>ëLp£VžÁþ 55†Ã+¿dúÜdY̘\}±¦ zû)Ò³’9ºô¶%9)[Ç1úõIl=žŒaõÄÛÇõâA~¡¬|#ÚRêì\æ­{œáÖÊ6ïJû ¿³ ~Ñaß§Ìù0“í<ŠGÐêÉÞ„»Ž‹ËúHõfôÇÌ©oñò¤dœ*RçÑ‘´ wáïLX˜<+Ó°²ƒñ»kÒ½’çùó3áñ0í6Žæ«§û’í]Šjm:ѳÕ7Ì÷û^¨œwÈg»ê}À­ìƒ4g!c‡|„͵wtI·Ìç®­þo¶þp5Ûæ×vÎ%:Ѐi3_àÅñ‚kÜCûÖ§Y}•ûÌï³Vò>F7¤|ú=…l‚°ûxt@"S§>Íðϼ(ݬ+í«a“Õ ï|úŸÕõL® “a†ªAþ+NêÁTä¶æH<ÀþÓ¾„—ÂÙØOóó‹/p¨Çÿè÷çojÊM-Ôzk—_K""rû«„ÌzïcVLÄnd»y6+Ε¡f WUŽü#4c%ÿ)š±¹Íiü±lÓænàTª ×À*4î=6Õý5“p‹¸Õg¬¬DÁJDD¬®x+++Q°Q°Q°Q°‘•‘ÂÁ/ñRïùdíiöÚ‹'†/$Æþ?c3`Ρœ/ýÊ<0žz<ÎâÙj‘è0‹Ül²Ï²kã”:¾5\±¦Oj ¼þ¥Ç §Vt}<‚@?‹ÚFDDÁJäF²“´c.3¦þÀž)XCëùè ZUðÄ„¤]ó™5u!;'c ªÄ]о~(NqKýòNšôðgý¬•Œ1Q´~/úö«É‘ß`ÅÙd3Œ‰ƒFÑîÌ:Ü—W«‡ÙÄÿ6“iSs ÎJ±¸3é;6×~‡Ç+,ãÝ·NÒuôÓ”wì§XþüptÇc%ÖðÑ«{iÖÉ…•3vþì{4;;¯¦­äp\&&÷P*µéO¯öþlzoëâmðæ“¤ ûˆ^¡YµŽ6ŸÖ&ôZΩ$!VõùoÐR È߉UçVðåèe¸µ•×Ç}LŸúI,ûx*‡ÒÁ»Š©Î'»Ùs¼òÅD†õ(Îîño³øhŽÄM,ÚFÇ·¢xóõnøDOåû}îÔæ%ZñçΟðHoL¹Žç8ý#QŸ®Å¯ËÛ¼ùù;Ü_d ¶%à(DY„ ,øÅfCž¡…÷¦OXo§×ym|#×%öû(ÖÇ¡ùsÏÓÀ/&/Ž¡÷nŸïµœÓîTuQ°‘‚ûe!Ç‹wç¾Æ¥ðö.Få{‡Ð£C¬öl6/âp`G:µ®ˆŸ‡7!u»sÿIlZ~„LÀ°„P¿ssŠyºà]¦u lÉ™äýÇ;³8µj1gÃ{roƒxyS¾]oêùn¦ ê÷éAݪ¥ðõ­F·7GÑ­iYü<=ñôõÅÝœNRz~/rÙoÀ9‰ˆÜ^´(ò7ØN§àR·?§•œC¨dq<Ɔ% ž¾šdrÁ¿˜'釓sf˜,>ñùsš0]47u%ÙØNÙp ÂåÂñü)êëÌ‘+G)Èý7Ö| 9<““©»fðí¸½Ä¤Yp÷w'!Jæ{|©×ýœDDn/š±ùÜý]É<KúŸù%û;–,a"¸x`;‰íÏI #“„S)¸zæ <“ óUå în¤Š!óÂñ9“”ë·õ Ç_˂ىœMÎ5e2a1ç®”Íc;/ƒZ¾ÁóïȰ¡(ån*ðrqýÏIDDÁJDÎ nÔŠ Ã3øa䦯pxå—LŸ»“,‹¾m)uv.óV$)#…³›g2o›-Ëpmïr[)Ú¬%û§ñ擤e$pdé×lŒÍI9fW_¬©ˆÞ~Šô¬dŽ.ý†mIW~ûÊžn#Ûì‚‹3¤ÞÍÆÙÓØžœ†-éü²‘EêeË‚–k?'‡?¶¬eç±uQ°‘+s*v ®Gì7Ï3⑌[ÍŸ|”Jž&,Íè3¬-ÆÒ·x¹ooÞŸz„òޤ]¸Ëµ/ì>P“SŸfxÿçøî\CÚWñÂbµ` lLÇû‹³÷³Ç>èy$·¤}·+ìÅ„WÄô+½ƒ¯žîË‹¯}É.ŸôlåÇöq_°?;ˆŠU=ØöÖ¢¶¥]­®õœ²Ï°éËÑ|»îœ:ˆÜÖL†aè½RùÏ8™yk—ß‘x€ý§} /„³ °Ÿæç_àPÿÑï75°ˆÜòBoñ¯gÑŒ•È­¬62ë½Yu0»‘EìæÙ¬8W†š%\U9""7ÍXÉÊ­>c…‘ÆË&0mîN¥šp ¬BãÞiSÝ_OI"r[¸Õg¬¬DÁJDD¬®=䊈ˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆÜbL†aª‘¿O3V"""" V"""" V"""" V""""¢`%"""¢`%"""¢`%"""¢`%"""" V"""" V"""" V""""¢`%"""¢`%"""¢`%"""¢`%""""rºþ»trtKÞÊ‘gI²»âV™‘­ˆ(î~íI.ë8 >ƒ¥ëÚs&ëø>žx”ºƒÑ4Èr;5 ó ¦í£vÏÖu“ú„À·•ùSg²tË!bÒÀ- 45#»òÐýµ tR啇ÞåpÝ¡Œy¦!þvz#™u/ `VÄû|Øêw^íó!{Ûóî'½ ·æ:@ú>ô+Rkñ¤‘Ôt:ά¡C™u:w)\(߈.úÒ¢„ë¿Òo3ögÐÈÜýñh:‡9©cˆˆ\ÿ`e'þ·oøbáJ¶hC—{Šâe$rtËbN‰c@oêX®Ë‘,µiß©þ^×>é–vp!Ó:IbL§&£H³ÜWÞ]½Bò øß½ý üº1ìý¨àñ×0m̼íx‡w»”ÄÀi›Æ1amEžmÀ{½ L1kYy´áå]þê—–³)ÉÖ‹z<%{¿Ï«-0Y$ßÁêYøü]/Ê|Ü“ÒÎÿ|U8mÅcC#ñ·¨_ˆˆÜˆ`e¤dÙÒôL§:~ço&>ToÝ…ì³_²eg MIÞ¹„yK£9–”…É5€²õîá&¥±ù†OW£e©Ã¬Ù|„seëµãÞÞìüz:[’Ò`ÊXÒºäÀ¬Z°‹¦Cˌۑµ,üqΦâäW‚-ÚÓªj –¤_™8ñ(w¶òâ·Ÿ¢9š`"¸j+:ßAPÙ¶Ü7¯7¤ãRí~Ú)TIA}<å›{Ód@[ª…ä$Ÿ*wÓ¯ÿ)¾Øv–GI|¬ÁDÞSŒu_ŒcM¥4 ¼BøpäΚf6/;DÏò•q •}ËwàÕ°–ߌ‹R˜ÅÅÌ€G¥Æ<Ðe‹_ÞÉ‘dƒÒþ¹æ¬qüôò¾)ûŸô Ç 8bWòÒãs¨ôÖz–v"í÷•L?›_öÇ`÷-GÓîéÛ¢ÖØ%Œ|q/íººðýW;©4ü%jn‰bâÑœNs¯B+ú<Ù‡†ÁNqÙãÖÑe|mJ`'aÇ|&LZÈ–cÉXƒ+ѼÇlŠsìFŽÜIÛ^þ,Ÿ±’ÝçLoØ‹§EfUŸ‘ÛËu}Ç*ëÌNŽ8ÊШªßÅOèf_j?4ŒþM‹`±íæûù»ðnÞ‡¡Ï=Ãà‰ÿe¿ÅÛÈ<±‚Õ)Õè<äw¬JúÚ™|·×JÝž=¨ííCÝÞƒéîrÑq‰ÛøvÆ:ì5»òĈgx¤U0çOgÕ©¬œŸÛö°r_ w÷†giŽ×þe,?šŽTb3+Ò¹oªdŸ#Å¡!ù3y„Q"‘ãÆ3wí^N§Ø10ãÑgûÕÁ×ü× “ƒGyìŽLü|çìWœó!´QÜ·.eêùàfÛòÝ~´¨œÏSAFì~~Yº ›wIB=.Y4ûQ#²,É›ÖòG€ƒ¸èå jA³âÎ)Û™øÆdNÔÈG“'ñÑc8õ:·§`Žø L[íN»§ž¡uÂT>^í^Ǥñ¯ÓÁu5¾ÚEÚ%%²Ç¬bÌ»óÉjñc§LdT¯âD}›ÙG2rÆ`Â&fn ãá÷¢ˆÕ ÿ-Sùzgª:”ˆ(Xå';%‘LW?<ó›s-Ã=ý¥}bø¸¹áîé…›9“”Œó©Æ¹ ­"«SÔ˃€²hW߃£`Ë3ô8HÜ»‘ã¾iS·>®UnAëðT¶n>E€ÙŸÚÍkâæŒghª¤¤fƒÙ‹òêêU”ˆF•ðÑ«üRçât5ž—Úøq|E/÷ïAŸ!#ù`êrö'_’ž,þÔ{ô1jžÄg?åJÙʹhCšûìdé¶]KÙÔŠº—ÍpesxºtêD§Nyð±‘|þ[žêIy—Ëâ¾Õ[S>y#ëOd#ŽèåÇ lDQ'ƒämóØàÚ–G¨NO/Bëtã‘F°yåa2ÃDË~=hV­þV0Øl™˜}Ëq×scÓ¿®Ç*b7-boPGúµ©H ‡7aõºóPõ$~^r$gŸ–ZukN)O|ÃФ¸ARr¦ú“ˆÜv®ëR ÅÕKFiŽ+A®dœL˹™™= ô¼ðCL&½¢.ׯ°g’i÷¢BËžTlÙŒ bö®å‡™Sxñ…³¼ûAJç~rñ½“~Ö3ôÓ±¬¨úž—À`êµ dþ’$רĎe‡| ˉKGaÝ^cxc?̘0[=ñóuÇ)®lò¹ƒÈò˜±á<ö°âTI¶³ ¤ŸžËˆÞ .¼ôndgb®b#Óœ|)î›sip¯ÖŸ‘Ícîägé}Ê•2õ"iß¡= ½¬A[Œ K`1¼/ 3‚Âóuº0Íú5Q°*˜µHÂß³nw"ejúü5fØØ÷ã˜`+ùzµ+mzõ¥j°;–ÌC̳à¯KtZÉYEL€ÛÙ$®Þ¸æ9›dÆÕÛÇÁXRíàjŒ,’bÒ±ú¸b&)ç%aµµ\©ÑïÓÿ3_FŽL·œX©=úå×g7³'¡+¥=/uû1(b(ÿo²ËS`V„Ì^Bô±t~:ZœÈ!~˜ã.Ÿ…²zR¤H`ᦙMÞÜYñÓײÓ}+gÊÞKí3`àîç‰kÉ>|ø^;ŠXr|²’cI¯Œ•`2a1çü{zl,NU:3"²7YqGØòÃxƾCÀçC¨˜ë=<°o=I’½vÎŽ‘IìÉ\=±&f Bù¸®‹_&¯ŠÜÝ,„ã &óíÚ½ü“Hbìì\1›…G}©×¼,Ö¬t²ÍV¬Nw”­?-g_j)©Ù9ïwdìeÉO{‰IM'áè:­K¦DÝòx™#›ôLÇe§àSñNÂÖ°dË l™éÄîý‰¥ݨV»(z7V®'÷ mh`YÅ'c¿ã׃'‰Mˆãôá_Y0m)çŠÔ¤¢¯åJÓGD<<ˆ;OÍbÆÁË—¿Ìµh]ü³¾œÍ±Ò­©îs=ˆ Ï*­©”¸ˆ‰ßž¥R›êäìÖ„Oõ{¨7©+‘‘FÌþå|2ô¢v_ú攃äèq¼ðò$ÖKÆpñÄÏÇõ ÉB@ݶ”;3—)Ë’‘ÂÉM3™íA“ÖepQ·‘ÿëüu Î7ìÍ _X²z3VÆ’b¸âS´˜MfÊ”vå»)£™Ùs(]r­ š}«Ó±k2 Ocô¢T,>%¨~oš³B’Y®çÃCMy}(ó¾þ–/^F\º“G0ej·gÄ+í)c²¯4T›¾ƒ›²ííUWø¡5Z‡óùè½Ô^/9ïþݲzV&²ªƒQ;k2°Šç…Y[“o]Žˆá‹/F1p|¯’Üyÿ×õÆ{q` l:ˆ>{>%êÙ‡m·àU"‚žîM%0’s}2¨CŸ‹cü¤·x,*çÀŠ48’ne] VýFDþC÷ Ã0Œ›¥0‡¾aÌEè3 Áú¾A¹Åè÷àDDDD¬DDDDn.7ÕR ˆˆˆÈ­L3V"""" V"""" V"""" V""""¢`%"""rÃék8EγÛídff’••…ÝnW…ˆˆÜ®®®¸¹¹Ý¶ç§¯[¹N´("""¢`%"""¢`%"""¢`%"""" V"""" V"""" V"""" V""""¢`%"""¢`%"""¢`%"""" V"""" V"""" V"""" V""""¢`%"""¢`%"""¢`%"""¢`%"…0kH':uÊý߃<6òsVKÇì§¿gX¯7Ø’zsŸ‡#f Ïöz…_Soïö²ÇmeîÇ#Ы3:u¦×cÏñÑœ-ÄdŸÿ@꯼ҩ½Þ[Kœ#׆F2ë^|§¾;‰Ý¶ž—:u¢Ó€)ʼäé{øüáNtêö6Ñi@ÖñûÈ¿!cÿxúuzœÙdßÔûüg*cãú`âÁÌǵžã _—”[nNNª‘«e¡dï÷yµEf#‹Äã;X=kŸ¿ëE™{RBtóÈ:Îwo¿Ã¿n {ÿ*øAüÁ5Lóo;ÞáÝ.%q0AÚ¦qLX[‘g`¹Ò¾L`ŠYËÊ£Ý/ïráŸÓ,gS’ ¬…ï#¥ÿùªp.ڊdžFâo¹©÷y³ù/œ£ÜäÁjŘWYŸëZäæOX¹º´¾».ÅÝÿ™ ²¬ã øxâQêDÓ K¾ÝŸÎÁÒum‹9~;ù3aqqÇÃÃ3àQ©1tÙÆâ—wr$Ù¸$X¤ý¾’ÉãgóËþì¾åhÚ} }[”ÀÕ”ÍÙµ“ùdêJöÆfbr¥æ=ýy¼SU¼Œx¢¿ùŒ‰?Fs:Í ¿ ­èód;°ÏËækˆß6—q“~ ú\‹Õჸ¿¢çùâeqzÍxF|»ŠƒqÂ=Ä3ƒ" ³ÚIØ1Ÿ “²åX2ÖàJ4ï1€†âbÊçgŽëUî¼ëÆ#n #Gî¤m/–ÏXÉîs&Š7ìÅÓƒ" ³^¼#å›{Ód@[ª…äü0¤ÊÝôëŠ/¶%ÅQ_k0‘÷cÝãXSiͯ0þ¹³¦™ÍËѳ|eÜr¦»Ø·|^ kaùÍ(t)íŸë„qüôò¾)ûŸô Ç 8bWòÒãs¨ôÖz–vʳެ±Kùâ^Úuuáû¯vRiøKÔÜuåúÏ8Èìqëè2¾6%È» c _¿¹÷sÛåÓ/MÜàq‘}’…obyœ ^y’äç>â‰by…ÐÜõfÏïøWp-ã+¯1äö²r?UÝí²zÍ·]s÷•‘ñpY«.ç7À H:жÌsÇ3üÙ¡ ìÚŒâ ?ñå„9’öÏL‚[jÓ¾Ó]Tò2ÿ#ÛÉ™AFì~~Yº ›wIB=L—ÜØ·3ñÉœ¨1&Oâ£Ç*p êu&nOÁ‘°žÏ>[O@××7)ŠŸ¬Ë™yQ¬8m'u{/v/cÒø×éບ _í"­€}^:ÂìgWðáûËp¿ÿU&Lü˜§&1÷ƒ©ìI?ÿôýÌÛÎÀÑ“˜øN7ü¶Leúî4ì1«óî|²Z<ÇØ)Õ«8Ñcßfö‘Œ|v½ÊmäS7Ž„MÌÜÆÃïE5ªþ[¦òõÎË×\LáD”HdŸñÌ]»—Ó)v ÌøFôãÙ~uð5ÿuÝòoð(Ýq€‰Ÿ¯âœýŠs„6j‚ûÖ¥ì?(ö‡e»ýhQ/8Ÿ§Ôüûf?jD–%yÓZþÈp½œ£A-hVܹÀzsÄo`ÚjwÚ=õ ­¦æYÿõ‹|Úðjê÷R…Ý.¿~iÜèqáÊ=/d‰fÉ‚Uìü#»gÕ[´çîšE°Éøi>?n:H\†¯âµ¹«ã]Tõµv’ý‚Å8x.k`Ý{ K¸a$þÊÄ/qg3+ë—!¬]þX°¦CËãsè>]YŒ–¥³fóÌ”­×Ž{x³óëélIJƒ)cIë:O°jÁ.š-O0lGÖ²ðÇ 8›Š“_ j´hO«ªX’~eâÄ£ÜÙÊ‹ß~Šæh‚‰àª­è|oAê«ÿÙž0€.rý“G%:<Ó“ò.予$o›Ç×¶¼õ@uŠ8uºñH£_xåa2†Tã±wGá[,7²IöóÅÓœNBzÎ]Ýpd`³eb/Ç]Ï¥~¦ ®í³ú¸æ*ç©Õ 9\¢;Ú–Â×µÂ`Ÿ}¸ØÏ—Ò9Œö=šSÒÃáõi:ƒŸR2ˆÙ´ˆ½Aݦ" ^wZµ†ñKÑ´d^?;B»zף܀G>ucÃB«nÍ)åéá hR|:K’31pç¢Øâ\œŽ£ÆSeÕB–¬ˆâåÏŽ“áÎu[pïÍ)ï•kfÊâO½GcýÐÏøì§ª¼ØÒí ËB iîóK÷بVÛÛ®¥ì jŃ'X|}äÒPßê­)5ƒõ'ºS¦D"ÑËùE ’7åSo½À0Ѳ_š…9‘Wýçî—vb7å݆;_Eý^! µ]ýÒãF‹¼Öü®4²/ýyÔoá÷™ßøÊo ¤íš«¯È-¬.»l¸• V9+Óö!£j,K¾ZB\D>Xûïk˜=ç+ù áncßþj¢EÏ¡TõIfçü¯Y¸´庄ãœÍìo¶àÛ¶7ÃÊ9qê×ï™3k)ÅŸ¸âçŸWl¯KóŽ](í}œ™¹ŽŸyb«ƒî£ËŽXÏüÊüY3ùÎ=zöàܧs°tLÛbÎ8s=y%nãÛëpjÞ'jyègfΛŽsÀ@Zx€Ã¶‡•ûÚÒ­ÿ3xÆýƼ©ËX~´*Ý˹ªWÝö,„u{áý0cÂlõÄÏ×'ÓŸ—· ½ÛÙÒOÏeDïn,Fv&æ*6²-NØvÌàËÿíåLšÏwb³¡à^­?#šÇÜÉÏÒû”+eêEÒ¾C{zYòÝg–A®e;I§Rp-Z„ “$Î!Ô»+$§ti€Å›PË…¼Ùdì¤ÄذÃûÂ\ ó$íP‰yý,—ëRn09å]79MàC1_§¿ÊÇíÞ°g’i÷¢BËžTlÙŒ bö®å‡™Sxñ…³¼ûAJç~(ô½“~Ö3ôÓ±¬¨úž—]1ƒ©×2ùKv’\£;–"4ò1ü-'®ª\vô¹ƒÈò˜±á<ö°âTI¥€>”iN¾?_y÷›ÜK>l1y·¡ý*ê÷ò¡Q˜íòï—7z\äUö+…‹åW¿¦Bï3¿ñ•߲Р…h×\}Enñ`f\½\pĤ’th;»­wÒ¯Q8~N@Åæ´½cßDŸ¢E ÀÈ"-= s±bDt}‚ÊÙÎX±³}§‚›Ó¹zž&(×è~îó8Žóù'ojµmI ŽÄã—<5”¡UduŠz˜À«íêoç‹ °•ʳƒ&îÝÈq߯ ª[ P¹­·ï`ÁæS4n ˜ý©ÝüÿíÝwxåþ÷ñ÷î¦l’MBï„€A$¨4ƒ"‚€(M<ÊQÆKEà IDATƒõè£Ø)J”¢(Ešt¥…éMzIB’M²É&»óüD …àTàóº.þ 3{gî{¾³ó™{f7õ(ácˆšÔ)¶’M9ª¨Û‚ ¯€0ÂÃîr/ÝŒo° k¹|ô~Â-¹•šmO$•@ŒMðÖ·~ôzõ-—õÇ#s;õd&&âQ³Cbº“t˜-‹Æ3ú­BÇ>CD!mÚL—ÿ~¿P+Y»qàmrαiÙV¬wµ¤&€É„Ù”78ú…úáÚv’TW}|-€á$ñd:Ö° \æ‡óºl·}ãÈÆæ÷]ßvç•÷½Ç1tô3ÔôÉ=Ñ„E¶ K¯³l´™ÝÉRÁvù˜5ìEÿèŒøt9sŒÖn½ƒVeóõg³9Z¡Q¦ëR+¶š­ˆLYÌäoÏù@×­©àÚÍ×cC‹.´©ŠëÌN–~µW›þÜŸ6“O×ç¡'b¨Í©­ó˜±.ˆ.Ïu TÊOLš°™ˆ'¦²çv,fÖ:<Û‰ÊÎÍLó+÷ ìAu+¸S6]ü…_ñá» hø(5«€ÇÙMÌŸ¹î†nµRY4jÙÿMÇ Þ—½®jæV¦YwËÇiW7”¬ƒ«˜ùí~ªôèGŒÿöË~F:;>ÅÆègy*ʦªÑŒÕõââԒѼ¿äBró ¡t•f<ÙùNÊø˜€ê´,…E‹f0banßp"?F‡êþX³Ûsßѹ,÷߸-ø†W¥É#­(ë¦bèÜ1ƒùË&ñÞ7N¬aÕ¸«S*û˜à*_BëEm÷¦}üvP*ÿëQ¬ˆÙd¦b+ó¦gV×àüGÖ×ÿ¥¦\IÛ˜3b}»u"6¶Ýú æão¶ð{S›x=6–nï¯#É}É ;ë_yœççÄ•¶Wcc‰í;•ƒWQænÆ>KlçwˆsÙÇøz@,±±—þ{œ>CDzòh&úc¶r³ñЈü½òCÞq¿Ë{”ÃÀŽã˜°®:ƒî%ßßbSÂ:VéL¥ªÞDÅý+ؘj¯KW¶P®û¼Ñ"³‘MʱüøõƾçOÅ]©à©ú+‘[“‘ÅÉŸ¦1fúìIò¤tôý4qü~MmàømŸŸÍOûpUážÇúѳ™ ¯à«Êo1ªG%¼wâ*^}ö"ßIÿÌ·žGÆ×§,.ÎoŸÃ¸)‹ˆ;žŽµTêןÕm˜ j¿EY¬¦+§Î÷Õ&/‰ã´Ãƒàj-éñ\¿pÈÙœ^;ž!ß®á@’…ÒMžàÅþ1”ör‘¼s>¦,dËQ;^Å#iÞ¥/7ŽÀ|l&ÿyã$½G¿@mÀuŠy/¾D|×qü·TQÇ(9çÙòÅëü¿¿’`)IÝÖOÒ¯S=B,Eï¯;a)C‡n£ik/V~÷3GsJrW·¾4;ÿ-“ÄqÚU‚õÊ¿c"ð¤à>z&.eèÐxZw aÅÌUì:g¢Lãn¼Ð?†ˆ¬ ûitIv¼;ŒIiðúsØÌóQ^…·ùÊÚ<êÍw_Ä9ô#óü)ÿ~Qıs'±úµ¢ÖTg×}Ψi«Ø“èÄäA½¶½y6¶þWܳ0Ò²ùXMû¶¦N‰ÜäS¢æýôê}ЉÛÏ’î.G€WqbÚ–býÄq¬B³°|¢•gwÖ3³yùAºV­Oît{WìÄ¿ñX¶—¥0‹·/~~~˜¿È»yè‘í|ÿZ<‡íBLzï‘›†nŠ\çáoxçÓM„uúã&¾ÇSUö2ogn€ôL~ësNÔíÇÇŸOáã>ÕØ?éM&Ç{SûÆuÏp“·‚#ÅZЬÌå—⮳+ùèƒåøvxƒ “Gð|ãTæ|8Ý™`ÔþŽô<·K2vLbÄRhóê8¦Œ“ŽÖ™ðů8~_!sswV¢ßð)L~·3Á[¦1c—WÂF¾7Ÿìƒ=u2ú•!nô;Ì>œu}Æ(¿õOÏ Wk^0±ƒ›‘µðFü€ëú››56ñ}RSþ;z"Ãbmü2þ>w´á&óN¬Í_-àPWí£;y#³6–æÉ÷'1iXgB¶LãËøKîqzDÐöåÿÒ2$Œþ7’ç£|®ÞæùŸ™þ£/mž‘Cvد¬¢Ž9˜ºE¬)#ycÆl ôÑ77e#žkÈ™¹“XyÚ•w’ɯÑeSX9nµ÷3yìιò7#¢IS|·-cß…á3Òv³|W0-/äªÞ +q?-ÛNZ@9"üªDÁJä–uxùj’kõ¤g‹Ê„†S«ÝSt,•{¥nŸËÏÖÖ<ýPá6"tæ©&°yÕa|¢ZQÕþ Ndƒ;‰¸LjˆiBÉËÎ.9œúq!‡Ê>F·{ÊXŠ;À3jâírc/°ýCä{ wiiNÌAU¸oðhFöŽÄzñœWšv]šSÎÏ›ÀJÿ¢I„Ajz ³§ØÃôz :a~”nôOD¥òÃÒÃíi¢¬BÇ(ß7!kžèÜ?_Âjµçéö¡ìû~3Gâ®±¿Þ•hÿ`=Â|¨M ¯ª<ü`¡>Tˆ®G±œ2Ý. éc`XJвssÊÛ¼ ªtMˤڅ<ëS„6MŸ·WšÕ)‡çžyôk{Šiȳ Ï«slå$^ëÝ…†òá´ì³_±¾%„FO÷¡î¡)ŒY}–ü²•gÉÆ4ŒgÙî4 Ò~]ÆÞb-i˜g†+‡CúòHl,±±x¼ÏPÆn-AÇç»rÉ]D‘›‚nŠ\ƒô„LleÂñýý"Ú#˜rżég“É<=‡!Ýðûb#lj¹f9µ‰©:™?Ÿ"Öo7+O•ãþFűÀ%³.RO¥c-ÎÅ‹tÏ4º¯àâd!íg\v{Ì·No†>1—9Ÿ¢û)+ÅЮc;û_x°Å@D åâIÚl2åö!! KX)..ò¦XiŽƒvrò™YÀ¸2n¸ £üY‚Êæ}±Ã„” ŲægO½¿¹Ûê…Ÿ÷…b6c¶øàç•»’Él¾¸}i…ôÑ` ¤TÇcÃÕfLŠÐ¦Ge‚<iîÇd’3Š>v¦À¢Ô˜<ÝÇ[¨/‰9P%¿pêrâtùSíÞ®T¿·+Y$ìYÇ¢YSyåå³¼÷a*\Šƒî¤Wß üd4+k=-Ϧ8î cþÒxìu#Ù¹ü 1}±œ¸² (Ýù¼tw0fL˜½lùâ¡É*Q°¹µÙŠû’vü £"ž&À•ʉ$'`Æ'؆µ\>z¿ á–Üà‘mO$•@lfjÇTcüŒuÄûnãLåöÔ½r&ÂŒ_¨•¬Ý‰8 ð69çØ´l+Ö»î¥Laí›.<™‰‰xÔìĘîd'fË¢ñŒ~+б¨`2aÎsÒ²àê‡kÛIR]õñµ†“Ä“éXÃl¹(î?NÚ9)œLuåéCÁcTÀ|Oò1² Ê{š€l'༛ðb{‹ØßkaÆVh“ ›ÿ{›sîGg}Uô±3¡¦ ìGòÖ·~ôzõ-—õÇ#s;õ—o“qÐ{LCG?CMŸÜ€Ù‚.½Î²iÐfv'?JÛå}jØ‹þÑñér:æyj*¬AKJÌ^JÜÑLV)CÌ€`ÌIygà¼ÂÓm¹é©†E®Aù˜æ„ìœÊÔ5GHÎHbÿÒÏ™{Ô˜ŒjKTÒ\¦­:Hr–ƒ„}+5ðE&ír&l5[™²˜Éßž%ò(óœ¼=‰hÚ’’g2sýqÒ2سü3ÆÌŽÇéa¹Jû—Ï ØãÆñòkSØpÔŽám#8ÐZ„°`!¬akªœ™ÃÔåHÎJçäÆYLó£i«ŠøXƒðÎØÏúm§pdÛÙ·ä+~I½òéïBƨ€ùžÌÍL±ãö4ÎnŸËø…v굦\Ý¢ö÷ZX-¤×t×ÉÈ&ÍáºÆ6 «å®iìŠRS“™F¶Ù«'dœÚÅêYÓÙhw’’÷ö¦oµ¸Ë²†Q£ç±éÀI““8}h ¦/ã\x=ªYò›:#úÉþÜyêkfæóõæÐ;hUæ0_6›£Z¨i(ÑŒ•ˆ\àU®#C¤1zúË<5ÚBÄméòÀi–¦ †ô’ÀĉÃè7>·9îì0„gäÞò±Õ ¦–›añõèWÓ–ï &ÏÒmüœ±ÓþKá™øFDóà OSÏfÂÄUÚ¿4 ÝÓŸ»?aÒ 'î²à_6š‡^èN¤7öB®´Š5càà$ÆOy›>“ìx†Uçž~Cé\Ù wóäÛ5êYžð*AÍ–Ò¥úolº†1Êo•ÇiËBÞìý1)Ö²4xd(}b1µ¿×­ é#‰ElijQµýøä}yÿåq ®Wô6 «o®mìLW­)A Ÿ¤ó†áŒúwOrËÓ M,Z}ŸÑÙùÉ@êø\²¶=žzs s¿ü–‰oL')ÓÀï8ë·cÈëí¨èùÜÆPŸžÏÜÃöwÖä³0˜º­*1vøê½T ú;ßDn&Ã0ôýk""""×nŠˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰ˆˆˆ(X‰ˆˆÈí%##CÁJDDDäÿ*11‘µk×ÞòáJÁJDDDn¨¤¤$6oÞŒa·|_¬DDD䆇*€èèh|}}¬DDDDþl¨2 ƒúõëvË÷YÁJDDDþ’P¥‡×EDDD®C¨ÒÃë""""×!Téáu‘ëª@¯‹ˆˆˆüŸC•^¹Î¡J¯‹ˆˆˆ\‡P¥‡×EDDD®C¨ÒÃë""""×1TÁíñðº‡JCDDD®EFF›6mÂ0 4h@hhh‘v«3·Ã¼œH¸\.œN'ÙÙÙ¸\. ˆˆHÌfóÅg¥¬Vë5ýÌjµâãã£`%""""W +++Q°Q°Q°Q°+++Q°Q°Q°Q°++++ùó<®wƒ+G¾ÁÚóüßäBé* iuCÊø^%ÇecÁ'ß`yt­Ky^Û/þ¿¼¶È peÁô½ÔïÚŠ’ž`R 0£,sÎ^R÷¶T½ã~žèÙšjþW©û¬½Œ{v8žƒGÑ«²W¡«ºNÇ AÛy|ü«Ô:>žþCã¹Äp:•ö¸.틈È?,X…’ô¥[&·û¹ßضjŸMHä‰>­©àsóFÇ…ÌX}’”§¦%¼Y¬ê«*ÀB…'?âµ{‚1»$ßÅ3&òÊK§x탧¨íwýëÞ³dKú Œ¦DˆEÃ/"rë+0{YñññÁ„>~uˆyÌ—´Of²"¾1½ø“¿”¹Ëâ8ššÉJåFmy¨q;¾œÁ–TLãÑ~<\Ƀóù­Û´—M~¹ùù²×ö¢þÎñ|c<̳UÀp'm`ÂØÔëÿ4u“fóɪRÜ[þk7&ÙJåFmhwlfƒ¬3q,]°†øã)¸l¥‰jÑŽûë…ãS¹5’fðåÏ™x×é@…*¹È„Åê‹ÍÏ~øÕhJ·ÿús~À»Lÿ©oßLâºÏ5m{˜|#¨×¶7ÏvaÍÛÃX‘”¯?‡}ðÇ<åÉÙüÖ­Åe—u€ÙãÖóÈøú”u'î«1L^Çi‡ÁÕZÒã¹49ËÂ<íûhw‰ˆÜ É3V&Ÿ²ÜQÅ‹³{Ï•¶‹ïæÿJ@ó ü"Ït¬ÎùŸ³55ˆF]»P? †ÝŸááJÞ­{ÞuÅdAè¯õ§dT%8¸ƒÓNÉ{¶‘^Ÿê¹]vžXÉéuè4àEžy¸™ëf1ïW;.Ç!–|±”„Êíé÷Ò`úµ-ÉÅ_°øP&¸3HtV§SÏG¨™sŽt· H ©{¿Hbîðáèæßp$o`̘ „>ú&ã¦LbÄs 93w+ÂiûòiÆÿÉóQ>­{ÚUàïÊØ1‰K¡Í«ã˜2þM:Zd¿âðˆÈÓ¾ˆˆÜd3Vùå7«¿7îÙÞUhÛûilaAxã"ÃæÙIzV>)ÅZ±u ¿ýáEEc;Î8)ag÷¶dJÞU3dxV¤eL%ýLàß„6ÿÚÁÄŸ÷qÎÏ.¯;éÕ¤Á@õæ´®½“¯âNA¥ TmÒ€ˆ&%U=r|C|qŸ°ãô½ƒ>ï #¨Tq|ÈÁ„ÍœIrf>aɯNÁë2Ij¸³HKsb®T…ûæ_No¬Ú ""·b°r“iÏÂìプ‡™ÔÃkY2ï(ç³ÌøXIqAéü®ø-fE\7o²*ETßíCÕ"×ÈEFRf¼==HÜ9“Ï>ÝÇ[¨/‰9P%¿º÷ð ­ˆëþηNo†>1—9Ÿ¢û)+ÅЮc;û{é""·Z°2GÙ²?‹âÍ‹“³g_þhån=©UÜ‹ó _\ß«È(òºù&+JÕ-OöÂíìµ!­l *]ò±Û‘„=Û ¤‡ p‘v6·5ÿ¼Âï£_ŸF›s·#'#• üT-rmuŸ¶›å[”í\†ì#yë[?z½úËú㑹úË·îíE^÷×d&&âQ³Cbº“t˜-‹Æ3ú­BÇ †v…ˆÈ_憲žÅëí”mXðʨdÿ‰e[O’æÌ"娿ŒǢ߲T-Rh¸qef–žNzjÇv¯åËw?æ'kKoR #3l³7VOÈ8µ‹Õ³¦³Ñî %Åy¡î³IsäÞ̹ںy8ìqãxùµ)l8jÇð¶hÅ|éTÕ%틈Ècyã7Þ¸ž þe5¿îÜĺuëX·þg6ï=ƒQª1±6£¼¯¯àp<ޝcÉ╬ÿõ4¦ŠM¹;ôë:IéèZø'ÄóÓ²9Yº!wTŠ(xÝú5rŸúÉLΙß_Û€Z!`ñÅóø/ÄÙ«òÀ}u¹°¾ëü¯l›Æ¬9ß³ù|yðw—ôÆd6“ýÛí7.é©&"rƒ˜ Ã0nÝî9ùmþ'|c<Ì€åñ¾ðÓ¬ƒ_1rI8=ú6£¸‡Š@DDD®[öOÚ9¤žÜÆšÝf"£K] U""""7Ê-;_“}|)¿8@Pt{îŽÐ­¹ñnñ[""""³†@DDDDÁJDDDDÁJDDDDÁJDDDD¬DDDDn4}=¦È.— §ÓIvv6.—þü‹ˆÈ`µZñññ¹eû§¯[¹Nt+PDDDDÁJDDDDÁJDDDDÁJDDDD¬DDDD¬DDDD¬DDDD¬DDDDDÁJDDDDÁJDDDDÁJDDDD¬DDDD¬DDDD¬DDDD¬DDDDDÁJDDDDÁJDDDDÁJDDDDÁJDDDDþIÁjÖ;ïòÍagžŸg[Ào|šs®ÂÈ>Æ‚‡³øDö?tÈ pþÆ‚)Ë8™ †jHWÒ6æŒBßnˆíD·>ƒùø›-$ä\X!c¯ÇÆÒíýu$¹/-';ë_yœççÄ•¶Wcc‰í;•ƒWB™»ûd,±ß!Α{œ|= –ØØKÿ=NŸ¡cYy4óo«Ë¬}ãéû,³ç¨(Dä¶äñWý"Kh}ÚÅV#Äÿæž$sXÈŒÕ'IIppjÊQ›uáÁª¾ª¤ÛYö1æ½ó. ‚;óŸ^¦Z0œ?°–é#?ä÷»¼÷H9<LàØ8Ž ëª3èîP,ùµeSÂ:VéL¥ªÞÔÝþlL5×eGåºÀ-B1Ù¤ÛÉ_O`ì{þTÑ• žýPx–lIŸÑ”±¨.DDÁêÆž|N°fÁ¯Ü3°*ÅÝvö¯žÏ’Hʲà_¦>÷=|µü“ùùËlIuÀÔÑ8íÇÕ¼/kƲ‰É“pgK¶®ŽãH²‰âµZÒ©}4Å<]œ_ÊÜeqMÍÆd ¥r£¶<Ô´Vû&&O:@Fžl]¿›³®j¶lGTÚ,Ùp€$w5ïëÂCÑax`u&Ž¥ Ö<—­4Q-Úq½p|*·¦CÒ ¾ü9ï:h£PuÛ3Ò²ùXMû¶¦N‰ÜäS¢æýôê}ЉÛÏ’î.G€WqbÚ–býÄq¬B³°|‡gwÖ3³yùAºV­ì]±ÿÆw`Ùj\–Â,Þ¾øùùaü"ïæ¡G¶óýkñ¶T1]rà$±úµ|Uù-Fõ¨„àN\Å«Ï~‘Mç ÅIDATCäÛ#éZÁÇo«ø|ül~Ú—€+¨ ÷<Öž-Ê╸”¡¯ì¡Í£Þ|÷E<‘/½J½-“˜¼$ŽÓ‚«µ¤Çs=h\ܲ0{Üz_Ÿ²¸HÞ9Ÿ S²å¨¯â‘4ïÒ—ÇGà™¸”¡CãiÝ-„3W±ëœ‰2»ñBÿJ[Î÷Õ˜üÛù‡û[¦2-æÛM&uÈàÿôän¯,\v„,K(ºv¡~@ »?“'T]Õÿ}ËYq$#mßÍÿ•€æ=8øEžéXó?-fëùÜÛnû^6¦Ö¡Ë¿ÿÃSM}ؽð3–f5¢ÇÑ«©{ØÀ©l0‡XòÅR*·§ßKƒé×¶ 'ÁâC™àÎ ÑYN=¡fÎ9ÒÝ*¢ÛɯÑeSX9nµ÷3yìò¿+îID“¦øn[ƾŒ Á-m7ËwÓ¢QñB®„ ²÷ñÓ²í¤”#ÂÏtÅ‘LÝ˜ÊØ7®ãx6€›¤¸)Ö‚fe<1Òw0ù­Ï9Q·>…ûTcÿ¤7™¼#pŸÿ™é?úÒæùi•<K¡Í«ã˜2þM:Zd¿â¸b‹\ kùÞ|²[ fôÔÉ ëV†¸Ñï0ûpVîñ˜¼‘YKóäû“˜4¬3![¦ñe|;&©}«ËÎÙ82³1ÛJýè¿жìåw9 Ýêê7¯G Ol5©SÌ =#ÃZ‘¶½Ÿ¦]ÝRúøàkóÇÇì$=ëBúñŒà®Æ• ôö£Dµª„x–¡iãJxûQ²Ze]é8݇~b—×´iR‰`_ª7§umØw ÌþTmÒ€ÿ’D7‰$Pÿ‹g6žWæØÊI¼Ö» = åÃi+Øg¿"=YBhôtêšÂ˜ÕgÉ/[y–lLóÀx–íNÃÀ í×eì-Ö’†yf¸r84¡/ÄÆÛ‰Çû eìÖt|¾+Uó\“˜ŠjEUû/l8‘ î$âV#"¦ %= ìÛçò³µ5O?E¸ÍŸˆyª l^uˆ,À0ãÞ^]hV§ ÷˜ †Ž~†š>¹",²]zeÓ ÍìN~” ¶Ëk,¨a/úGdħËé˜cä La ZRböRâŽf²úHbcNÊ{ x„V´©gSµcª1~Æ:â}·q¦r{ꇚß`Ör=øèý6„[rk>ÛžH*øg­“ Ë…c!31šÓì¤ÃlY4žÑo%:vÕ/é£-Ô×¶“¤ºêãk '‰'Ó±†Ù°&fSÞã831©Àökx«ÞDäŸíÜÈ2ÈÉràp\ò/Ӊ˸$í_ÀgŸÏ®³^¾Øü¼.ß#‡Lçµ?¼ärf’cöÂË2“ްmõ öfdåÞ&,r+&ü*5¢’ý'–m=Iš3‹”c[˜3f‹~ËRÅH¾Õà.ËFžÇ¦'ILNâô¡M,˜¾Œsáõ¨dÉoúˆè'ûs穯™y ïד˜Cï U™Ã|ýÙlŽVhETàõ˜«1a«ÙŠÈ”ÅLþö,‘D‘Û¬‰À¨¶D%ÍeÚªƒ$g9HØ·‚Q_dÒ®+ŸlrcÇ˯MaÃQ;†·à@k>ÉBhÃÖT93‡©Ëœ•Îɳ˜çGÓVñ.äý£h틈Ü.3VF{f gÏeg‰Jtî[ýb– ŒjÏ}Gç²xÜ|ã¶à^•&´¢¬à¢b+ó¦gV×t®\ÔKT¶ê÷Ó|×7Ìùd n¿TkÔ”Ñ?°`Þ"êt/WôÓ­:íKaÑ¢ŒX˜†Û7œÈÆÑ¡ºf¬$Ÿzñ¯ÇSodî—ß2ñé$exø§býv y½½€œü&êÓó™{ØþΚ|S·U%ÆßC½—jáo‚ëñÍn&[ bj¹_~5mg~MA é7$‰‡Ño|2nÿrÜÙaÏ4 À”xy` »§?=v¤AO2ÜeÁ¿l4½ÐHo0ì—¬Y¬'1~ÊÛô™dÇ3¬:÷ôš{L'|­WXû""ÿøs‚aúŽK‘ë@ŸiQ°Q°Q°++++ù3<4"¹\.N§“ììl\.—DDä°Z­øøøÜ²ýÓ7¯‹ˆˆˆ\'º("""¢`%"""¢`%"""¢`%"""" V"""" V"""" V"""" V""""¢`%"""¢`%"""¢`%"""" V"""" V"""" V""""·2 Ü® `Lü Fí8ÁáTÙnã¦ëƒ§ÙDÅž«Sš¾µ"0i·Šˆü­L†a¹}ºóÏ®ÝËôgLÓªô«¡+"¢`%ò׫6c#û’3ø²e$T.ާùæ›ïÉvÌÚ–'Vî&2Ø—]5ÔŽùé+¹mHqðX•›3TAî­ÀÇ«`o²C;UDDÁJäïá¾0Yk6ÝÜO&ý¾ýnM>‹ˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ÈßËÅÚÕë0ùíÊÂu•uW,]Gµéd²LDD¬DnKFV ŸrS§¤[ãÏqÄ­1¹yhDþt¬"áøq–z–à»»­ øö$3S"x%ø÷ë{÷¢×ϧY—n¦Fù:;)Â2¹YiÆJäOç*'‹v¦P²Fw†£_h&“÷dya±ãÜo´]•@Ùè(Žö¸ƒOÃSyÿD6®«,+‘ÛNŽ=Ñ ~ü»š/Þfo¬ÀÙ}§Ø–à"î×Óœ.U™‘”ññ¡yÝ*ü7ظØ^à2¹™éV ÈŸâæÀþlvf°mÆZ^0áv“éNgÜ™Š4*eœæ"$ÄJÀïyÉìE”¿ºLDD¬Dn/® >ßItãúÌ­âÀÈæû•[ŸÌùRA„xt>;þXÜÙìIsc§Ðe""róÒ­@‘?!ýÜI¦¥ûÓ¿²Ò¾^”ôõ¢¤Ÿmk’ýÛ V9ÌDÕ(AÄñ¼°73Î,~ùõÃ’ LX¨]à2Q°¹Ílˆ?Çùðî÷½< …•*I3’ùä¨ï°²|×"”ƒ¿ÄQbÒ&ž8êÏÛµ}±>…,‘›—É0 Cà ·eñù£3õEDD® ÍX‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆ(X‰ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ‚•ˆˆˆˆ(X‰\Kñ›r¿5Ý}“GîïÛo1é∈(X‰üMªù0sÿÙ›ºÓ÷ånõ`_íT‘¿™þ¤Ü¶>ßsšž«öÜ2ý™vo$ݪ…kÇŠˆü<4r»ê^½é9.>Œ;Æ{æMÛ VÕ-KW…*‘¿f¬DDDD®=c%"""¢`%"""¢`%"""¢`%"""" V"""" V"""" V"""" V""""¢`%"""¢`%"""¢`%"""" V""""××ÿ-ºª5÷w#îIEND®B`‚164_snmp_fields_on_template.png000066400000000000000000002552001516513262500342030ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/16_fields_snmp‰PNG  IHDR1 AeÓbKGDÿÿÿ ½§“ pHYs  šœtIMEá ¿JŽœ IDATxÚìÝwtTÕׯñïÌdÒIHB¡…Þ‹ Eª€Šˆ6ì ,?Å^±W쯢¢‚Š`AbAzéé¤÷d23ï !„L Jðù¬åZιsï9ûì{ömcà“åvDDDDDD꣚@DDDDDTĈˆˆˆˆˆ¨ˆQ#"""""*bDDDDDDÎ'5ȃ}Â5B% Ÿ®P#ˆˆˆÔ:#"""""*bDDDDDDTĈˆˆˆˆˆ¨ˆ1""""""*bDDDDDDTĈˆˆˆˆˆŠ1""""""*bDDDDDDEŒˆˆˆˆˆˆŠ1"""""¢"FDD¤.s2›ièéB}³ƒšCDäüÎÙ5ùðM£0Ãé MfÇpÔVú_ µêBü`#¾Ý”,{­Ô[­[‡1ÆšÀ;sÉ?϶ßྫྷlU¶y ‰JHâýµ‘|o¡ð}·É£nkE“}Ûh²<ìÿP@;“_؃«ÐFu+öΕÝïß‹ksÏò¯Í¹ï‹7Èrž¾{ ‰ƒ_å³ûZãRÙBswñîø—I½ïk^éãUÎÄ1Ÿˆ/îçÙˆ1|úÖeÔ7ÕõV4Ò0„—/ ax ;ÁN6Ó³X¼/Šçw¦p¤ðÜ}ó9/TÜ%fz´jÌ˃VïTÎÎËLcæÎ£LÚJ´UÍ$"âXNufxÏf´?rˆwâ ±•ùgÿ†|ÐÆÂk뉲ý‹EÌ?½óoÓº1ÏdðQ]™H¦ñúÚxYƒ//®ëЀ¯vÃ2s;S2ìçäkí¶¶Æe›Vˆö½µÑFu0öÎ×öŒ¹­?Ae3‡Ñ—6 ù¾4kÓ¿wæ=ƒÿFál‚wb<ï¯;ÆÁB̓¹ÿâŽ\°‡ö‹OgGyáŸêg/Ú‘wÃÌP˜Ëòƒ‰lϲââáA¿Æ~ÜÙÇ—›ZãªßðWŽ] &"RI3â’.Ìoç®Y“À^K©ÇäÊðmù¹K^i£ûÜ(¶ZÔl""gÓ¶KÇ¢ÀèÅ Ww‚âBÆÕ/”¹Å @H‹¶,ÉΣźŒê§ñlËL®\Ó«#»nï‡}B_¢Æ´ãÉs©*Ê€_PC¾}1™`¿§7[‡„ÒÛÅF7ž¸±/sB ¸6éHú}êlçe¤²6ø9ãlöaú}™Óăúw%a\gnp fzujú›ûb›ÐŸ¤Úóbcœ ÎŒÙû hQª÷ŒîA,¿w;;»a6û0ý®þüÝÆ¥¨ƒ+ZžÑÇn@þ•ø/+ y',ÙÓ£ør #]z]Œ}|;†9_ #í´6ªZì]éì@<ŸÑ·Ýxhoì·6§k©K¢œ¼²uB?~of¾0Ú5ÿwûµ<µ,;€-‹ˆ…òÌý·qí˜ë¹ã‘·ùiKòY/¥´e`þûOrïMc¸þއymÆVRO;m`'+â>yæ^n3†17Žãñr «%7š wƒÌ¤t¢ÊlSôá(^ÚÄÑ“ïW4fË‹¯ñ=˜CÕò‚ÁÉëûvbïý±OèËá‘áÜTÏtê’¾ÊÖ¡¢qS5mÁ‡a&ìâ’§0vk ×ï`ÀÖ Mø²;È(9'ì=ÌG©¥÷{E…Ìmóë¨p†”N¢Yñ<³3³f»Õšï˜Mø»š©ïvúæR;2ƒ 7 íΜ.îDî‹ä¶eQÌ+¬Ç›Wwã½N£{_ŽhÁõ†4Þ]u€·§áÒ<œ—øâkËã‹[x0,1è6sí`£ÙpÈ̵]Òa0ѹk{¦„ÙX²/‘½…NôéÝ•u}ü±=Ê]Ë"ù.ׇIûð^ˆ»…û3°ú2ÄÃP2™ ¦·1‹/çqú¾¸’åÙòYv,çúþ´q0Ѫ‘'N@³Po E…ÓÅ¡®&ž`[A]hdb²ôŸW1ö–VϜѷqü| …dÏ®ô6–ô[H£`:[Óø*®Žâµå“•‘AÆiÿe’[XNaÏeÿwOóÌô-»ŽaÂý·Ðß{/?½ñÓ÷ærÆ'òóãsÏòíú|ÚŒÏÝ×öÀ¼î&/M+ù[{ÚF¦¼òëlí¹jü–uÓyãëdŸïuŒ55É6¼Â[0¥³?­ ¥š5·Vâ³T[åc¶¼øÚͧ»«Œ®ÜvYw~hofÃŽn^qœMž¡ÌÑŒ¾Î8´Ž›:ÊWvòÇÚÊÄõ)$ž5v¬ü½õ ßæA—öA´®ó÷d‰ˆœÃÝ\n ÝyF!óÄÀ¦ q>½€¹~Î~®áÈš_Næ×Œ-·7;Ë?fàìÌKMM¬]¹™1{ò(¾=”Nî ݘx‘¯-H$ËÇŸ~ι¼»,‚Sl@K³­<ïcÆÛhçXV.1…v¬–|¥×‘»Œ&ê»;Ó 0ðòðfìÅáô5ä3e69x€Á@S·ôøá0›,`òfY7öoÞÌп³È8˜Ê‰1ñrÏÞø5žøèx6Ú[2¶¡3ŸíÏdž—´öÁœÉü,;”ÚÑš<x½’åEM'µ³ý½Œ¬Mw¡oÇcr ô£½9ŽƒÃý`çÚ RêB»;“¥¹U1ö,õWÏ pFßâœÇ2K0£Ã\x=5—Bƒ3CZyR³—U¹u$C¥-á•{—”yÓDç§§ñ\7÷ÓëÔ Ìü=ކ×Næ…ë›ÁïÛ ï'ᇙõòÀ’³`'{÷lF{rÉ3¯òPWO À€A¼tÿöÿUAÜöæ3bÂ=\f.¡ƒŸ³ã²ÉµÇù<É´0{ù^ºiÉÄÞ¸©·•Ãq)ü~,™‡“XšZt¯Š#c6¦œø2yØÙx‰cyÁÕ¿!/…Áœ?v0îˆ0;:߯‡Y—Zù:¤U8n Ív~‡ò? )å¹öJº-“ãmÜÚÄ—ΰ«®ŒU‘±áꎇ,ÿøf"­¡\{I£R—A…Ð{@#fþ¼˜‚ÒEL! »"É÷íÍåíÎÖÍBÑÕj<\MP˜Gœ¥ôJÛIÉ´€³/fÆsÝB3ï÷ åÃ+BøGb♼áŸ'XêæÓt,)<¾,†ýÅ+o+´™œÅÁ\[©GÎÙIË*,™ »¸šqÇ7ÇöçÍ3ˆ·°ð×Lœzq±ó V3À˜ÁCG Îh'G–gÏÏä—$x¿‰~´³eñNl*Æœ& raªÉ—àœeØêF»W“eÊÊ*Åžcñ\týÓé} …lˆHÇ:8ˆKÜâYL{:·ÄZ°Õ•˜v ¢u§.g¿±¿T{f¥“O43ºžeÿÙàC®µtwØÉËÌÏ@¼Jg%ƒ3¾õÝ1-.jñè³™L›±¯ßø‹¯1Øn#oº‰!-=Ïï'¢ ¸ X­6²23˜·'ƒy{¢0:»3¼c8ßôhɬ¤t†f8låÄ—ÃyÁ€‡ä§“|ZàÙHÌ,zÔH€y£®çì˜pöpÅÏå§6{÷Eñu“nL)®¶ é¼µ9YŒˆH<üCùexÙ¦¨ì5´“Ê<µìß+b*e';Ï NΛ P2ñ3àçeKvñ‘01ÇrÝñ£¸º{ЧQ}Æu ã“«œ‰›±‡¹uñ¾%—ÕG“O{:Y¹»J;%×üä’O6¯ÌßÏŸe¯š³i)jÓèc ìèׄ›‚\°´òÅ?Ëy¨C˳°æH.íýØÈŸôhvçå`:aãÎÆ>ôsr#3.’½…êp«Jì9Ïgö-ØIŠMd³!œƒÜ°µöÆ·Ÿ•yâŒÈ€“»fÂóÂýtñ,s?’Ñ W àÔß»ùºAÖ 2 ¡éÔÄ<=9§T:á×i4v…%í8û·o`Éü9L}) ß)OÐÓûü½©Ü-0œÈÑü8{#$žJݶ‚l=Ää=x­‘;.Û³¦òã˱¼PÃÎ.øžVõiàë†g~.‰å¡ÊÆÍù׿%Ú¸­QÆxÅ29ý,ëjÍáó¿vruž÷JæŽù‡ø#WŒˆÈY ˜€Pæ]Îà³= ¥ÌSËjRÈü#.Ó’R9ˆ㛸œªšœ<¸1ܕ¤T" „¶êÀá›Úr•+äåd³ô@ãV&dö ›ûç·“sRSØew¥§k>ÛOd²åD&[Nä`jÔˆçZºáT¼ÿ,ÌJæ»d'.mÛ€ûC¬Þ“zÆåSŽ/Ïαèb=ês+7âc29a³²ãhÎ Bù_ lŠÌ$ómóªÆ^åñ|öï²æ¦23ÙDÿ¡<ØÖîKãÄ:'rnØ•0ã fúѤY3š5kF³¦ °mŸÇìU‰ØNË>fۇ㖶–?öf•LÌm)[ùkÉ+’W¾Á„ßgS&˜}Ãè0à:&ÜݯücN;¿«ì¼Œ4vZ]¸­‹?!e2¯ÉÍ‹>žši!5űPÇò‚Øøt|¹-Ø|êÒ=Ï`æŽíÎç Èu?g/Úš@ž¼6(”ŽγdðÒü­ üeßdØ‘òy4b~Ù&+ž~ÚÉ»)g2“‚kv.åù˜‚´8^ŠjÄŒùÉós3ŒtoÝ„‡¼óøxi2 v;.ÉYø4fÚ°BÞ=”N¼Ù“+ÚW|“› \}ýÞ°€Y1Ydf%òüÆü1¤3³ü¢™Ÿn ¼a´vgùâHÒJæsy,ŒÈæÝ^nMáÚè‚r«YG——›šÌjK(7zYù5:—<ì$&¤íF;2ù$¡ õøcRcoq|eñ\Á—Ùòùë`÷ ¡-•›bêÐ¥dUdªß›úÏæµ'ñ~ô•\l'~÷J,¦ýÿn£ì<×£íh® ÛÀÏo<c.§£O*[, Òóäcx7nŠSÜl>™ìÉU}[â›{Œ­KVé7„ÎõÏïàÚsSxjK&›{´ãP½|y8ƒˆ;^^ž\Ù:˜Þ¤0~SiYÙŽå€rã˱¼“xœ×ãðÁÈÙÃÒ'ujJÏœx†·`)¨,oØqªtÜœß2bsËîzüÕ¾9¯qeܲ#ü|ò‡@ xúø1®‰Y;SIÈËdE""RÀú¾t)SÀ\;ç³³ìÌþuÆ«;ñÈÉ›aôrøê€üg~ìÒžÏ÷‹6“׳/· ç[w;ÇO¤ðÔ¯y7®hrœ—t”‘KL|Ú#˜—ú‡àdµ°/&š×aÀÊæ=ñléÊÌË\˜õÕž 3ìþ\±™¡-y«ms¾ó4’–žÆô¥Ûxî`©ɱ•È^M ;ËòÜ.Ï’Åœ;76ÊᔢÝx~z* Âh’›ÌÊì ÷ŠªÆÞ°o÷TÏt0Gž ²WcÇųìB¾4ÅàE—{ßæù ©ÌXü %[ðnÇÀ_対~œñ 1—¦\÷òë¸MýŠßçMe¹!ýçfóâ²¢?17ÅSÿËeê+øñóEXÍ^„¶Á#w\Ok·ó½A¬lß¼6I¡¼Ô-˜ë;×'ÐÉNFv.ÛFrÅæXþ̰6s@ùñåP^°åòÑÂÍdöiÉÓ][r—³•ÈØXn^|„Åùv ò¼QXé¸9ÿsíâ5Û¸ÒÚ92ãú†|ž•ÍžL+fwwºø8º§ýÍ­G/܃ ""µåð¾=ô1µc]?|K0Ö¼TŸ·ãÕù_=«×ocÄŽìšM3ød¹.ðù݃Xq[klK×3(¢à›Ù' PãW–?]¡Føïõ:õƒ‚˜Ø±×4ô ©› K^;c“˜¾+šé±ù¨‘DDd¢uxMããø£œ§™Ü|¹+¬Y²j|›‚“[äŸ0†ÓӞθhÝù÷Ù9‘ÏÓ‹ãyZ!"RCVöŠål?KoÍM㋵óM*bDþ!&7nnÀ]ëQxl‹ô”#1"çuãâÅÝ=Ñ1=Ž;V%‘¨FDDDDEŒÈù¬ -š>_D«!DDDDjȨ&1""""""*bDDDDDDTĈˆˆˆˆˆŠ1""""""*bDDDDDDEŒˆˆˆˆˆˆŠ‘“ v»Ý®f‘ºBgbDDDDDDEŒˆˆˆˆˆˆŠ1"""""¢"FDDDDDDEŒˆˆˆˆˆˆŠQ#"""""¢"FDDDDDDEŒˆˆˆˆˆ¨ˆQ#"""""¢"FDDDDDTĈˆˆˆˆˆ¨ˆQ#"""""*bDDDDDDTĈˆˆˆˆˆ¨ˆ1""""""*bDDDDDDTĈˆˆˆˆˆŠ1""""""*bDDDDDDEŒˆˆˆˆˆˆŠ1"""""¢"FDDDDDDEŒˆˆˆˆˆˆŠQ#"""""¢"FDDDDD¤RNµ³+™‡Ö°ð÷ålÜq˜ô|ìf‚CCiÚi£®¹„¦ª—c#sß|>ÿb›ŽgbÅHøøOxm˜Û^º7wÙ7úLšÊ#\«±üã_ZK.`èðßLêŽûùÞ#y˜ñÎ 6dœšTZíŠÔ³Ö8dÄîgݯûY·t#÷¾6‘KCÌ\û×ÉXþn“ˆˆˆü3jxz$Ÿ#³_敲Œ³õùéè©ùeèšx3½y`2ØÉ=¾†éo~ÈÒ€DN_ů #Ф†?»­ÛÉõ/bðÀ>„:Øéòät¾±pruýo6PÓÑ<ýÚüOV¶l-|—¿ÝA@Ôl¾ßr)O]ì]­ËÝÎlÿ^Åí/""""@S@Ô_¿uò¥ï`žín:zœœ:pkt 㞈aÏ£³‰8´œ]éCìÇ/ÿǬX€\ÿÁû\[2SÌeû[wòê& `¦Û³_ót·“SLòã·òûÏ¿²rW1)¹ÜýhШ }FŒaDÏF¸{:«Ÿ½‹#JMNw½É­c\èùü—<Þ©xyÖL­šÇÂÕ»8u”ø õ†Ñ8¼FŒ wSGà­'øóÉûø2 ˆÑo¿@Ë ÓùqÕN'âÕ¤WÞzW·7sdÉL~Z²…=‡“À7Œv¯ãŽ1=iàRÁ´ºœu&vß0 ¿+Þäÿî aç[·ŸõžkÚ~–ÌYÀÚ݉<–B¾Ù‡°}~Ýu ÷tøL‚=÷(«~žÍâÍ»ˆˆ·Ô¢_y-Ïz ÍÁ>9Ys$-âÉ{§r€<ðåë ð­ÁMFÂG<Æ“10ii:PÀ¶ß¶’Ús~†*´M¥íŽ36²¢Ö2ï§…¬ˆ!!-»‹7 ¹hØ5ŒÐ¿“' cªã•ÇE¹±|.Te|œ‹ñ)"""RëELá vlK.yvÕ5´ó8s2jÊ7°3Í &|íÕ½ ÌNÎþïxæ¹ùD—~7'…˜kùéÀZþê;‘·ìŸ#3vK<Ë>x–O7¦—Þ(Rc’sí+W°åáWy o@97t§²ñ“'ùåhVÉ;™Që™õrGû8±~íñS—Í¥cëÜÉD¦=ÏG:áqnš.LXÆ{O}Êß™¥·/c[gÊÖ ì~ä èã_ééöì}|ÿü üzìTÅØÀÜ;ø;° f}r.ϾÜ¿ôbê-]D*`;²™ãyðs«½¶i›>áñ·V’Zúíü £¶òÛç[Y¹óQÞ¤õ.„kϪ<>jy|ŠˆˆˆT úÓ KûN¾ð§cû³LM~t»æVî¸ãî¸uÝü«9›µ&²ü«S$ß¶¸zìÍ\ÅE4(ÞŠ´5S™u  >ô}yÓž½˜“ç* íåËYÓ™ØÑ ($ö÷˜R2As"¤Ë@®¸¼?OVI¬þ¿YqÂZÎÊ}4 ïf]èÑ¥)ž§¦ü¬[{»)ˆ6Ý/¢mð©mM_þRmLÄ‹Öù»É×rò½×1ù»Y|r[sœ+h—¥^2Iwo=Œ›ÆãÆÁáÅÛžÂêO¦°&ÙVIçq`Öû¥ 7Â:õ¦W§P\É%&ÑZ³>9ÇœƒÚ\²)ÑI³V­m*kËQ|}ª€ñkןá#¯dP÷&%7£g­ÿ‘• ÖZ.Ð*‹eǤýõ 7ØÓþ»þÔ“ÉN/‹«>>ju|ŠˆˆˆT¬Úgbìù™dž|åMïs|£KA,;OÎL¸ûÉèá`cPãI<8eäph÷ ,mÃ0;™1;™NÝa4ãl6ZùGø}Ááâ³%N´¹ó]^¸¢!fÀ~óæ>÷3…{˜»4†~7„ñTµzC&ñÁÝð0XI\ô ¦FÏÆZpÇû/3<Ä ¹ûøâÁç)z2q ÇÓ ÁÏùìóU'3fçRël0a6›1Wд–˜e,Ø_<‘ Á ÏßF¸ À:¸=Ì3 “ `;sWÆÑgTóv¸=s's—¥¿ò¡ÿ“™Ð£&¬¤¬ÿˆGß]KfMû0úöæ‘É-ȳF7½jçÔ”Á쉷 KZ®­êmSAû[“ö°ýDñû!×óüs×ÒÈ ÍE¯ÝÅ[Û TަX AíŽCE±|.Tg|Ôæø9WE ØK=iÌpî3Äà„«`¬;xçÑI x ½zv§Ã W˜9ØñEY“w±ëä!ußÜ4¨aI‘bpḭ±½˜ûÚzrøíd\†ÿiKð¢Kÿ–Å—†™ð ËȢI~“ô.^šká16¬¶ÚnÛŠî7üº÷¤Ñ‚ÅR´^ /îF½…E—XEÿ½ô«žº!¾l=½‰'¯ »†k»Õ+žPšðëq=W…®åûèZè'/Bšx›)õÆZlSàå¼9kXÉv›MVr“b8rp‹# KúÃf;OGºG(á Ýϸ‡¥ éQ)öšZŸ""""笈1¸xái¬YœÈ²BÀ9¼ØÝ%œ+†4díü˜¢éWÒ–ÿ¼‡å?^at¹¸C®ÊEÜ+-¨ 3â)ùàö4t9}*ìÚ°-A¬/zhAF<™VÊLp]ñv5–7{/\ ÿTqg%3¾dKHùó9nûó,št˜d ø»”_¤Äqò¯æáÔ+}HÜäG˦}Îú¤¦ì–,ÒóO¾rÃ×Í^Kms²+M˜™ì_¶Ek6±} ™Öº3Ð}ûLà¥Ê~ì²&ãã<йðU¿ê0Ó:èä‹DvL§ÜƒÐ¶T¶þ8…?þ˜?™Î²Øjþˆ‡ÁV·¼ÉOÜÌàve~43óÛÏàíGã‹™5þ-ƒ¡ôã´ìçñoÛØ±:xè?/³è®êµã¿Û'•)HØ[rÖ·Pšøk·m¬‰,}ãAžûüWVï)*`<‚[ÐmðU\Úä¿u§z¹ãã<йðUÿr2§útêìǬآû(Í[Ä‘~7ѼÌÑlkÊVæþ²”}6€BFÞ\fA…äYJMkìùddXÎZÈ„ö¸šû$kcà IDATz\ÍÝÙ±ìÛ¼õëÖ²zËÑ¢ß!‘Å3×3ºÃÐ O ™¼ƒñ†¢Ë¿âv߇6®§ ƒÜã{(yfw^&8?g^&<<€¢§Ä5ûï ©Æ}œëáÁ~²Ìȃ¤Z[Sò\k gŸÓ>©Y-—Ë¡%Knº75»ˆF®& j¥mŠëœý?òíöâ„^ÅÓO]G×`W öLÖNZÀ’ ?]…?¢ª:ãã|‰ùO¨ÁT™&—]Aã“/ãçò«?±+ÅR<ß·c9±Ÿßû²¸€{Ò-È fÜJîo?ÁŽ]‰XNNŽ,aAęߖ½õ]î½ån¹å6ødyî!´ï?ŠñOOæó×®8uÏJf"Yå]æc·•Ô!Nþíiï[ü"}9ß/¦À~r>|˜ß¿/ºÞ ¸kk|ÎÛ — ß–m8¹)±›w‘\jÛ­É›™óÍ4¦M›ÆŒ?‘SA!æÜ°á'KÚcsùisjÑ•‚XIùûG~=^K}R˜IlÔa>ÌᨸòûªJL6‡LæÍ¥iÅo¸Ðux| µ×6`#+ö8'Ë8¯–Ñ>Ø`=ñ7E”óájĸãÛl;§5uuÆGmŽO‘Jç+5úpƒË™0zOþRtÇwþ¾ŸxéîŸ0ûágÌ 1%·ÔÄă^·'Ì àCÓf^Uô¼«¨ocâæŽ„˜Np`×1²Êù.×á¸ç®' È]þ&Ïgö£s³ \ó‰Ú¹š“¿Xc nJ½“[e2•Tiöèu¬ÙáO§M voÆðÍXôÝaÀÊþiòèÖ¾t ²r|ëö&ÈÜk.mxÆ“ÉÎ'.M‡1,t?Fƒ=b*/NNà²ÎAØ“³cÅRv¦;­Ç§¢ßÚ4xwbä%^ìXž d°ê‡8Ò± íÑlÛM~-õ‰-mï?Vƒ»<ò o<»gØ ³H8KF©I±¡ÙµÜÔÅ C-¶ põöâä-`™ËÞfRvOZxe²íFŽ–W_V=Æ+®WÏËç Âv©úø0ÖêøÔi©XÍf š_7‰§¯;mA–´N+`êÓãöILèé[üw.„_5’f%G q{·°e×1² ´(g<„»¯+¾)ØÂ±ÍK™ÿÓL~š¿„¿£Š§ØÆfŒ¾¹;>ÅË5¶¡ÑÉK[ÃÔW^ໃù€!WLdBOŸâ´·c%‹þ*5A#ÿ{çùC_Ía\õðÍ´)>ꟸi>ßNÊwsNNÒ!xÈ£L¼4°âK© ´¿åA†Ô?ùF.Çwn`îhò1àãU;}Rcö$¢FÁÁç0øöbÂÄᄚk¹m0àÑ~$ƒüN¾ÎäÐÆ%ü±d#G Ñ!Ì\ÒfIÉ'ã¾ê1^a7Ÿ5–ÏͱªŽÚŸ""""•ÍVjÊTnw¾Ã½—³à÷lÜI|–\| nBX›>Œ=˜6¾§•9t$/½ãÍŒi¿²þ@,….Ôos ×Ü6š€_âõ¤2÷ Üi}Ó›|Úe ç/aËáxN¤æ`5¸àLó®ƒqÕ`:º)Ç0€ûï?ÌÇ߯$"¥Ì/Λƒ4ñÂVÍcÁªDF#>Ó€oHcš´èÊ ‘#èæV'ž¤äÒd$/|ИßfÿΆ}‘DÅe`u«GHÓÎô~—÷h„›bôîʸ·_§ñ÷3˜¿f/‰yn6oK÷ËFÓ-âm^YœVã>9U^!át¼xWìKSã9iƒGnñQ<¦ÍbÉÎX²\‚iÕ©7WÝ<ЦÛ'•üNЙsˆì}áÎÕˆñІYE±|NšµŠã£¶Ç§ˆˆˆHEs3»Ý®KÑEDDDD¤ÎÐÅç"""""¢"FDDDDDDEŒˆˆˆˆˆˆŠQ#"""""¢"FDDDDD¤Hµ'&55U­'"""""ÕV¯^½j}N¿#"""""uŠ.'1""""""*bDDDDDDTĈˆˆˆˆˆŠ1""""""*bDDDDDDEŒˆˆˆˆˆˆŠ1"""""¢"FDDDDDDEŒˆˆˆˆˆˆŠQ#"""""¢"FDDDDDäŸ)bì¤fäoU‹ˆˆˆˆÈy_IJyëvBgl¤Á,ȱWú‰üä#4Ÿ²‘—Smçtc 3¢é4e&ÚÔó"""""*bŠ ˜M[vqɆtrÒcyxWùjg9ÿŠ˜BþÞ²‹~ÓÉ+Yº7w5wÅEí,"""""çUc/dãæe /^¸º#O˜^LAfçÿÿg+ðún+7ïÌ µÔÕhÖ¼4&/ÞBé+0|ºÏo¶rëÎ Òì¥W%—×ì í´•>]C³y‡ø>ÕJyµÙ-Y¼9g†ï"XèÀeo"""""r!1öB6lÙI¿¿3N]6fôâ…«;1)ØÉñ/°çòþXîÌäA-y4ÐÂ÷k¶2x[vÑríÌ^¶‹ÇÀ ŽáLØœ{-|·f7Oœ|‚€-oþÜÌ »-\Ü©%34⢬hn^p˜5e¾ÏšËW‹·ótš?ß\ΕîEƒˆˆˆˆHàTÓfýæ Ø”Ái5‚-“—ç¬áå3>` ,¼ G‡–»8s“¶,è?@ Zü¶‘›·gc‡Öô3ä³ÓâÁØí˜ÞÂ@¸'QÓw°#½[É1L:£.ïÄ—MÍ1 `û¬cü_b3zy¯¶5Ÿ¹+·3>Ú“÷F·æ/=iZDDDDä?QĤEs{٦⪇cÇ“òŠCÛù0†·¯‡Ëï™lȶÓÏ׋×Fv-YNzf«ŽÄó·‚íEïÅǧrÌäË”†æ’3@.õ±ú– ¬®FÈìVÖý½“Obò16âªz&tFDDDDä?RÄ8¹{Óß"²ªð!ÓÙ¾ÒLS×ÓË w7üÉ&¹°è~•Ô„^Çâ„l⌮t t)u¯‹ôìBpñÁÿ´+F½\(̰²-Ήû»Ôcú¶(?ÈìæÎúÕO‘ÿBctñãÿ®iCÖ/û˜•Sz©^ÜÕÉŸFe+ƒ‘F ƒÏ²4 Qy§ß\ŸŸ›GN„:°¤Ç0lN$YmÂùº_ ƒüÌ8[Ò¸íÛì+Z8®&(È'í´Ÿ±—–K–‹MŠª(F éÀGM­„ÇüÍ#k²>¬}Ì ‘ ¾ˆpö búh0ÌÙÇÌìâ7 3ù3³kÒØáSVþÜ“JRà €-Ÿ9ÛSÈñlH_9Ç“Ùj÷dJ÷.ó,:c“›‘Îæ|;ÅELH°…‰|oah˜`ÍŠçš™qÚ‹E€ÁDc/'ŒFgÆ÷ å£ÙÇy`wC6tq×£ EDDDDþ EÌÉBfÚ(ÌÙ[RÈÄDì¥T©±ÙKÿ¥y°¡‰¨#Çy+ÆÀåƒCé`«—7Í8Ê+«“ÝÌ׬4¦ïL$p?Ï¢F¸<°Ï4ˆãáßwàÞ³!ƒÝ Y¶ã݃YÔÈŒ¡Ì¯nzÔããñ\¹é?·ìÀͺ;FDDDDä|Wk·‚8{2mT[nò8õ^LÄ^FïÊÅâÈL>¼7¼9=2ãyjE$Ÿ§ºqß¥Ýø¥• N€‹?÷ Â?!šG–ä­£6F_Öƒ¿{ûáË·ÉVìF7º²;_µ6±rkc—e¹K3F†3Ä¥œÅ`fX¯f °¥ðèßiŠ‘:À`·ÛkõW-Y‰ÜùË^fd81jX~jîŒIm-"""""çcSTÈ$óòúxRC›ðf<ÕÎ"""""r>1""""""çŠ~EDDDDDTĈˆˆˆˆˆ¨ˆQ#"""""*bDDDDDDTĈˆˆˆˆˆ¨ˆ1""""""*bDDDDDDTĈˆˆˆˆHÝäTÝæØÔx"""""R}îÕ<¥¢31"""""R§¨ˆ1""""""*bDDDDDDTĈˆˆˆˆˆŠ1""""""*bDDDDDDEŒˆˆˆˆˆˆŠ1"""""¢"FDDDDDDEŒˆˆˆˆˆˆŠQ#"""""¢"FDDDDDDEŒˆˆˆˆˆ¨ˆùÏ1¶,/ýšwÇ]×áÖ±wðè3ï³`{"öÚü" q+~bÞÚx,ÿúFçshê8n{âO’¬ÿìúç]Èû÷ßÀ­×=Íšä,j ·ŽûŒƒù. wÿwëµ¼º.{­m[•^‡J×çBp>Ån%Ã9e)“®ÄÏö“_þ©0VÏ«¨;ýSå>tdëÍâ±ëä×èÂäkûÊô]þ>¾¸óZ^\žrÁ䓪ög•Çç/°>ÍÖªr ü{ûÉÓYIX8‘[¯{ž¿³Îü޼½qïuw1-"ÿ¼ëû*÷QUÛ·&ãúßÊ ~ï…•ËÿÿÀœí‚-b¬I¬ÿøa^üüb}»0tìŒÝŸÆù›øùõÇøl] µ×¦Ĭø™ùkã±ÖÉP¬õÏçÈ‚ŸÙféÅÍO§ƒ·3¾ÍÚмen:'w÷ý?ÃàäK“6-hâ^ÃäR—bµ®ç–sÕ‡uaû.¬¾ûçú³Ôø|üvÚzþCcñôï0œ·=.úèB/Þö]èùÜé_¬`H^õ _®Í§ã“yà²Æ¸±Ë®Êâ×å»/¦±»óD:yZ©É±ä`¹˜¾]›át¹ûº¨a¤¶¦w7îx©[Ñ‹Ü]ç.V ÕÖÿH^ðÛ—­þ¬¥ñù_eòiˆ·)Š>NçÙš©äÂÏçÿÞ¨³Ä°rî.¬­ïãŽa§ Ì!\rýV~´½1t ÝÍÛw½áñi<Þµx(ZO°äé Ìkñ“Ç·Ä;Ù2óÛylŠH"ÏìKãžWsëÃiáÏo?Èѯr÷ ˜øõót6'²ù§©ÌYµ›è4'šufð-㹬­7&€ü|ýà+¤Ýù7MgÁß‘dyµ Çµ¸¡éf|ö ›§` éɨÿ=À°¦n啱e`Ñ—_ó×–HÒœCi7èz”)óm™{Y4íþÜIj¾¿æt9Ž[. ÇÝWîúw´Vð™²+bOeõ³ã™zàî½®wñ3îåØÛùðµø[‡þøŠ™n%2!FÝrÓ]Œèê_n°T¾môËYŽ Uؕճ– úÔÇO<ÈÏþOðñÓ=ð0ØÉÚð ¾·ÿQïñÆ a˜±ptÆC<ÿW8ö(ÜOÕŠüê^Úr /x+MÌÅa˜ø/>ð->}Á£=¼0X*‰©œ-ÄréZ?®z±[nÃVÞ·•·}%ý™¿/î{Ø[>gÒÅ¥Ûn"/WÖvU‰Õ*¤{A<gNå×5»‰Ít¦~›Œw‡º`p¨?ÎÃÜbOcýË÷0%c,o¿=’`ÓÉ·WóÆ}’5öÿxeD0†Êú3_Üÿy^¥ÇæÏ˜±Ö‰›ß¹OM*êÃ~Ø…É™9í'VïÅêל.WŽã¶³ÙJc± y£ªãúƒ+XÿØ ÄŽ}‰î¿¿ÀO¥ûîÓ1%ydã×òËê½$äyÓ´ßXî¹s0!.ålKuû²6Æcþ>¾˜ðY÷¼L¯½³X°n'ÑY^4ë7–»ïT´¾¥Çdï¦Vö÷€=ÿ«¦}Á‚õ¤º4¦Ë•·Ò/þC>Œ¿—ÿ{¾9›ËŽÏF±îÑÉŽçµóu?Y™Â8~›Xæ;>¹Š& ãiâkªòþ®0úgžyr Þ½œ¸¹óX¿û8ÿ–\4r<·\ÚäÔ¼¨²X);Ž×dæËîÄÒ9ôuúzgWsgÍ— Rø½lû~ruõr|5÷OÆå Ýq«Éü¡6÷µÍÌݦªöùÉÜýÌ›çsÆYUçÿ¦íì’-mÛâ¡éÀ.ø•³®mîäÕ)ïpcKÇ&*iù굯øÛÖžËÇMà–í°¬ŸÎ{Óv’c dà3osKs0µ½—?¸Ÿ6.)løà1>šwœÀ·sÏ}×ÓÕe'?¾ø³ö垺VҞǞi±ÁûRnþßúaõ”Gyô¥Å8÷¿ƒC³ÔÌœºŠäòÎ?æfÎ Ï2kC>-¯Ïícz`^ÿ/K;õ¶Tþþäufým§Íð;ï- jžÅÚioðÃ|0•·þ•|æŒr܇‹Ì]mMÐü.^úè1º{—Ñö\"f<ÍËßlÁØe ã&ÜB_¯½Ì}ó9fîÍ=óúQ¶­Â~)ïBX[·ë´ÏVÒ§¦Út ððVb ˆÝ…HÜu,;`KçÐ_Lc·Ò w¡a¯Nx&mb{BaÉ‘®´+9fnOÿÖžlÆT•óÕ v«Ú·´}•û³¸íB+k»ªÆª£¬I¬™üŸ.J£ùð»¹ïž‘4Kù)¯Ï "×^ws‹Á‡Ö[b<¾–=)Ö’™{—sÈÚ”=êcrt,Ùó9:÷m¦ït¦Ý Khèb¨úx´Ç±èíÏØ0±÷ßÍåͳX?íiÞøõø™×–;‹UгªŽë“&LõÏì;·¢v<òÃ[ÌMëÈ5<Éø+·| SWp‰IUû²–Æc‘<ýð6¿&µbø=3þÊPb—}ʧÅže}+ù{kËÞx’¯VÐfÔ=Ü1ºù¼É”uiØÎ:>k8•8_ö“•ö-ç;üÚsçKãháRÍüh9Â/o|Æ.žŒCš¤²zê“Lþ3¾è„³£ûåÒãxðp®~¦LyåU¾œŠòeÁÙÆK5r|uöO•ÅeMçµµ¯­làHî®NŸŸÌÝåsGÆYUçÿÕ31–´c¤áI‡ Z¹¦´ n ûsƒ¹ìÞ{¸&Ì \B;?7æÅe“k3áD=Fw‚ƒý0EÏfî¦øÅƦ·ðÀ­½ð6@{ïÖ?·ÿžàöa˜èNý˜5<³ø0)…`:ý,DΞÙ,Šö¤×Ó¯ro—¢Ü÷¢ Þzp ûK#™ãù¡ôºï îîãWTYöjLÒ=¯r,>{k?Üˬ¿Kþ¡J>ãR¦]¸úáçnÄ€AÁþ¸–¹ÍË–ºÙÄÑ`Ìdž¸® Î}:áõô#üòÃF¼8zUܶŠûÜËʨ´-\Î/…±Ë*íÓàníp_°I…´ Næ`Dþí‚IÜJtÞ`êÙ¢ØqÝÖ’²W1º6éK[·lڑĈÐ`L¶Tv¯ŒÄ©íDZ{(ŒYæXLU­Š9£ïŠ]Uï[Ú¾Òþ<[SIÛQÅXu8Ïý9Û tâEÆu/:ؽ%›8%‘ciÕ¬®æ>íÒÜ0…õ{Ò4Àƒ=‹+öam~;]LŽ%»•é½xqòXš¹M«Êx,éµnóÔ½Ýð4½»üÆLY8ŸÈ+î§ucѽJyÃ\Åqtֱ咟P”ÝüGòÈCWìt%këÌ8…àò¾V±/ý²kg<Ÿ%Ë8”çE' s¹Û&ðÓþXF„œ¹¾•ü}aä|~ÝëB¯g'qg§¢ýsÏvî¼0q&±gŸ9Q5Ø{ŸOûɪçc¢Vίêþ®èH –vÿã™ÿõ.ÊÛ.¦áë÷óÙ¯ 9:hM³Ü/—Çä’_ªœS–WºÏJòåýíËl{nL5s|Õ÷Oî•ÆeÍæµµ¯udRYîvx.V^î® Ÿg;0ÎúîóèæšoU¬…Ø0`ª¥5pòoAc<‹¾˜Æ_[£H+p"dè½Üw[oüËÉâ9G·Gst8•äÑ«w Ö£ÛI(85YìØ¼dBkr÷ÃÍ@«õŠ?gÂÍσÍZN…ZHâ®Hò}{3¤í©#&ÿ nU*ò]¹vÒ›Ü×Ç#VrOD²mù çÙ9kÙ[ÏT6Y‹ÞÌk(ýú6* ÜâKûzôo„íèvâ N›:´mUë—šl—c}êÒ¨'áæ8vDfaËŽbç _º HHA$»ã,Än'ÊÒ€.mê¹ów §wg¢×í!Ýö´]¬Žt¢Õà¶xªSÔl‡_ïq¨ohû*÷§CmwÎ’ iv’lnKÿ¶§.e07¼Šg?y—›Z¸ÔáÜFߎô ‡ÈUûÈ´ƒ=k«÷Yi>¸[ÑzUa,õ¹„F®†ŒG7: )Õ—F?:]ÞsæA"ËœF²8‹U³ërõèFÀÉC|Fü< Øí% ªõemÇSëÛýÔúš*_ß³ÿ½•”}{HwëHÿ–§0šƒ{һṧuk?Y{¹¢$9Ðî²Î§&ÃF?º\Ù—Ô½L³Vi¿|ÖqìPÌÕ0_Ö Ç[X7‡â²Vû»:ûZÇ>SYî®iŸ—ŽÍÙª6üŸ‰1yáI ÉyØ)§:¶Ä³aá*Òš fH«òÌ~Ú™ÀA<ðL&ß¿oþÅ ÌÔo;€+ÆÞÄÀ–žeª5ùyàˆoéSm˜ð¨ï ¹éäÙN•x&³±Ìú™0;Ôr6ò2óÀ3ÏÒopÆ'ÀñRñ;ßÍ\ÌžƒÑ¤9Ò¤™_%c®:Ÿ©xy…YéäÍ_Ïå\Ž–k-]öÚÈw`ÛªÖ/5Ù.ÇúÔàÎEMàûÍGɨ¿cS†·îˆÝ÷GöJf`Á^Ò};Ò!°œ6xм_+Œ¯æ@ÆÚî]Áac[îiãÁј¢òX®í¬Vß:ÐöUïOGÚî\±‘›šž­ÏˆQïúEÿŸSWs `¬GûþM±}»ŠCÙ½i}p9û [rK×â#%nþg™Ü;¸ ƒ'õ½N_q'ï`<9NVí´åYˆÅªÆYÆu9íáqÖö¨`Ÿæp_ÖÞx,YßÏ*ìÌ+ú{+¹)9àYÒ`ò$À³êû;Ú~²²+’ª‘ ^z;•™âÁÒs­ŽÅŠSåã¸òå8/+ «êæxGr‚W‡â²6û»:ûZGóE¹Û^Ã>?[82gs47©ˆÁ) =­}í¬Y±›ŒÞgž’³D/á§Y¿â9nCË+bl9¤dÛOÛ”zGó@ÇQXÒŽspÇV,˜Ã7¯¤áóÉt÷>ý”‹—+¤‘žo7CIÏNÊ×0œkå ‘7_7È:AV!”D•½€Œäœ’eÿ·_ø–¼w2îÎ>´ óÂ)/Ÿß;‰¸³c®Æg*Û±9¹{`&Œ‘ÏßODz×RÝt Nm›«ÛVy¿ji»ìS£­. !ÿ¯-ìÛAnƒ+iè‚­©™U[ö±ß‡KëÛu)¿¼Z_BSûWl8”€aÅ ­ µ·Áñï·:˵°Õè[ÇÚ¾’þt9{|½íÎ݉f/ÈI!§t»Û H‹‹'ϳANu5·íý:  ‘eë#“pZ¾k«qt(>×_•±d4Êh:º {I™…€ùÔg3OƒõÜUÏ3UÌU×ù¥Ãs¨6Çc5××pö1ãêí YId[Ku§-›”l¨Ò5Îkui?Yù”ªJq `Ï&%ëôƒ-;‰\ñv196^ +ÇŽÅœ‘ÌÊò¥wÅAU½ïغ¥9—µÛßÕÉåŽ~¦âÜ]Ó>/?gŽæçóÇ¿w9™KS† òc*Ó—E“_:×Y“ØôãŸ$NßNõ0À€•¬”Ü’¸,ñ›ÙvâT…™²ê ýßûlͳomû_Ç]ãúᙌ¨´Â3{“Nsˆå[’NÍ+ ޳~]"¦Æhà\i¦~ûp\ÓÖ²x_VI2¶¥leÙS\³([S.»v(üp ör¤‚@u>SéÚ†t%Ôx‚ÈL?š5£I³f4iÚÛŽyÌ[ˆí´hq&°Òm«j¿Ôd»íS~:Q/yKVÅãÓ®9Þ&7u ¥pÿo,:h Y¯¦g}’ŽÑ§=½°ïßX²Z nGQŽvðû+eji;«Þ·•·}ÕûÓ±¶;gç{ñmÙïü=¬9P*F“Wòá#3mwŽýq¾æ–â- èJŸFyì^¼„%»­´Ú©ä€Pmä‹ÃËÈeÇ_»‹n¢/Îá›ço#? #­ê~LйÒX¬NœÕl\ÿÓjg<ž›I¸_›VxæîduDvɘ)LØÌú芋¢ê絺µŸ¬èÈ}õòc»—íãTšMaÛ­äù´¢¹Ÿ©ŠûåšÄœù²² e5s|å9Á±¸¬Ýþ®N.wü3åîÚêóꌳsóÝà™0ÓpÄÃŒÝó43?„gÖ {»&Ô#…#ÿbýá|ÂF£_  iÑæ|?…y®—ÓÔ~„U?ÿN¾Û©ZÌ+¬)¦¸ÙL}ד+ú¶Ä'÷;–® ËoꛌF–ØílÛãK‡–ƒ¹¦Û|¦|þŸ$]M· GVüÄ_ нÖ&WîmFsYØ~}ó9}9í}RÙ±pGtÛ©ƒ ÅÜ*Ý6Gú¥ì:¶Ëã,ÁâXŸ:‡t§•Ûo¬?áB·Á˜1â޿ܹÄCÆ" IDATÐŒKÃ+x’ŠÉŸö½òÝ÷‹ˆ0uà¾v>§úÑ‘ïwª,–ϲs¨aì:Ò·6Ú¾MûÓѶ;gÇJš_ňÖËøþíq¾þ ÚÖËbïo3‰ôéϽ18ÕÝÜRܱt¾¤!³¾ÿ…íæ.<ÐÞ§jyÅ«²3æÄÄÉYìæ÷xõÿF3´½;'6Îã·=Nt¼ÿ BÍœö»>ÆJcшK5⬺ãú´¾kúÏìýjk~3áTº§ÅLë&xšª·¿;)gÝ;¼nÃ¥í`Æ’#8÷|¾µîýímžŒy± 5®ocÉŒÏùæ§\ôîÆˆ‰ÕØر·W1í£EœÍs§é˜ÕÍK¿}Ç×_ýÄÞ¬:ô™4…§jé+nq¥ ä±IïóT'–Ï䛟v’Ñp4ã«q÷ލÖÿQFj…É•ÌûêVíË¡áØÏ˜Ô¯öÇײí|6¦"å¿XEÉw,½ðàDôЩŒ¢Wc¿gú³X{LG«‘ï2¬¹{ñg,•ÔÍl¿ÙÚú—£^j…}j@L°¨Ftµ;÷Fµ>Ñé* ©Uæ«74xÖk‚  kGDÁç •œ_A,—°¬(ì*è[%moca*n»J»LS…Ž>dPk=Ç–NcÚ—‹9fß‘áŸ'ÒQõ÷Î-ùmêÓ_À¶v" ¼¨\cÉ‚cÜù`O¿ÞŸ ¤M,˜þ±—|hÿâT^låYh ã»øåÿìÁÂy¹<ó»¹|Y´îٔ㕔MA\–ÌT@.Wº)#wWXŸ[1Î*íÜ••JMe¿r¥ô+F„øW2¥nåýa_ za:¯·tC%M"m'Ä?…1—ì6:[4wh{&á‡*“øpPèóXÞß]^â"&ŒÝD£?¡—¿öQ§JËñ—ÿhöVÞRQKÓ aQŠæVÜFTa´Žr•E¸´ÿ(9gæòjÿ‘ÌO¸w™Ý”vœ]§ø†{c+M$îCŽ—¸%±‘&Bã­cìØü;;—FSg,µ]e.m'Ä?‹­;ÚÖXÅ’/fQe@;ª«.³÷çoøÝXŸQµ]ä⃸/9^âRÈ&Fˆò$é´SÄ.\Οö Ô¨’߬%m'„¸´þtyõ5 ³~äç©Ià ïšxêA4p‘+îSŽ—¸%ßÄ!„B!î ùMŒB!„â_A61B!„BÙÄ!„B!„lb„B!„B61B!„BÙÄ!„B!Ä?qcLù·{÷bÄôcd+ùBv<3>Á¤ØL•Z–\.oZȲíWÈ-×Q³95sÆÿJ²¡”Oœ[ÉÇ/ˆÌõŠÊ´Ý_ØŽ9§¿ã¥Þýø*î»'ö¢ÿ˜¥\1ü•í[ñ ×VñFŸÁüx*§Rsw¥Ïw|ßVîzÀ’ûW·íß+‡ýuí#ó¢øWmbT6®Ô !ÔÏþ¾ß*\–.nZÄòíW¨ÜœŸÍ™‹ØŸÛ”g^Lmg[\kÖ"(ÔýyLGG‡ÒÖ-Ýß.!!«à¿™È:¶ˆy²©úø`ZzkþÉ[˜{ý6îY"ålý}™ëU.¸OyOÁ©Üöý÷ø«ç»ÊïÛÊlËr샴–xðrØ_Õ>2/ŠûÃæ¾%-çž{'æÁH …Ê’þÕHnF*¿&´¨_{ ÞÉÔ{'ûHz nÎî©+ù~mÞîQõNå^dý·ë¹éщQ]ª£ýG™âý&Äߑƹ*Î6.Tq±ÇÍ× Û_œäãÄ|÷wëÛÂí“iQŽ}ÖÿÞØ“yQüË61dÇ3cøD.õûš·›]eæˆ÷HúšÏЇHLs¢f«¾ y®~ºß˽Æîo?åç­G¹šåL`«¾ ØþÞgŒiœZ3‹y¿î#ájÕcèðôót«ïq§²ÙñÌxa Y#ޥўéÌÙnÃ3>É¡×ÞæRßwh°z" ÞeÈ“uóí[Ôµ3sLÀ˜vœµß|˺½ ¤ÚV#²]Ú”viÄtƒ­o fæ)€Ö;„!3&â9gS.=˧ïµÅU¥ .EÓˆÙ2˜H?ñ+ó~XÆ'’ÉÒºR£ñ£ôØ…EWNT8ÕëÇÓÑ0sÑlv·œ@sw¸±û{–w ñøÞ„èU{= g²dK‰©6xÖ¬Kû~ƒéጠc/SŸŸŠjÜlÆÕÏOw†$6¼>‚e!ïñÑàPtÅâå8ߎšLêÀ7©ûÇw¬ø=4§=1‚'0gúÏì9‚Ư1=Gäá@=*Àxû(kgϯ$p#[…Î=ˆ=ѯS0öªlfä½-ùϧý Èß}®­aÒÈpyec9Ý»†Yb¿½O ‡¤²ë[RÌ}þMœUE;°Œþ6‘¶ï3Æp”¦ÿù„gÂõ¨ÈåÒÒ×™ð³ƒ?~æž3õµ® ‰‹˜ðê^~£3—YÆÎ¸ äz„Ò°Ç`ú=€ªÄ`T»†Ë¬?ŠEãùüõF8¨L¤íšÌ¨ÿ£çÿ˜ò¤?Zr97çEÞZ̸éc‰4˜«g<3ÊÊ)6—Y5n ŠŽuû{e*ñßµfb»¤¦0×'e)k,YÑnµ ¬.ÔN5®H‡Þ5¨z½*:%m§$×m¿ÞÞ„{\ãTu Êj®­KW}ßjT8ÕfaÕ{Xx£ cÞL]WµyÓL]M©ìüÏP¦ÝêËÔ©=ðÍSêV¦ ÿ”´¾_0¹ã fý9ßµu‡œ+ìž7“¥Ûâ¸tÛ¯Zmé5èišTÓÝÉ7fÇOÙ¹¼Ô¾->•yœ<¥c_Áx7•Uç?×Ïüm7ŒgÖÝëOûÆ·ø-¡Ué9ºN"3-\K˜²Ï³eö Vì<Á ] êuíO«+Ÿòé•a|1±zkƱÙqcá|c®ôWŠç¨¯zñûøRÖ7•Õ>•=/ Q†èÚL§~šÊÒä0º Çà®Õ¸´ñ+¾Zw©ÀmRg~ú?~I汑¯2¸kU.ÇNcÚúü[©¦LNÌyÿ|¿u½^ ÑNGùåƒ7™w4óÞ3æ¦lÎý2•ïÙÙ®%UÿÌî/ÚN˜J¿ ÐD ç?Ÿ¼@-;ÇÌ>Í’‰o0W6¡Ýól¯Fhw~ÂçSK~®]åBññ|„‚žçÏ^¡AÑ«´.wùæË`JÝͬ÷fñ»1ŠÎƒFЯ[$¹;¿ã³‘¡ôV'Mö¥fîæýt˜ôôx–þ°cdúÔsFeLa×'¯ðÙ² x·y–¡ÃûP_wˆ“^c~|fùžó7eqdögìr~ˆgF ­ë¶NËØwÖcÛú9F¾Ø‹š7v3oæ®ã ~ÿò}æÿn¢V— ÖvAilŸ=…ŸŽg:ª6­ƒcò¸šw÷ŠRêÁÍœ×FÑ:ܱð„RR¿9ÞPVßÒbNq«p¬ÛŸþ 2Øðõr.ä€áêFf/ºDè€Á4ñÔ(¨¯•í{†Ÿ§Lç°Ccz~Ž7Ø:óU>úõ yÅúÉÂØÕxR«®'y§÷q1 ‡KÎb®>Iš 0ÞäT\š &ÔÐ)¬gY9Eã]|¬œ™Kúw±­´OJü®™óYÚnEWfº`úL|H{.-^åÕîU l0Íäcs}\´ý>{›Ç›ZÒÇ)V+?Ûã*÷ [>™ÄÂKõ:ñù70Šr·¹ºª\oŠúÂvޤîÎU·ÆrÊH›F^…7¸†d¶}ô _­M%¨Ë†íAÍ”ÕL{'2MŠÆÙ\^fߪJæsc_Éx7Wç{· hT(ǾA‡ë*ÏÑJb×p•S^eÖÖjõÊs×!{ÍLÛ‘Š±Ô±X9ÇÒùÆ\ÿ¨KÉaææšŠnŸÊœ…x`ïÄ¿ Dšº#o½Ô“*6@]2÷`á±$r»ùÝL=xùÅGñµêV#mßH~9‘D.¾¨nìbñšËTéõã{` мN¯¿ÌÏ?í¢Û¤¶¸˜ $ÝlʤúRÓNÙñ®\°÷ôÁM§Bmﯯ;Ú”X3ÇlƒîÈbÖ&:ÒôõwVïN"jÑЇÿ5c¥ìí<|p·W£Â_ìŠüäΨ´.ù—¡  9—÷r,Ó—NÆò˜¿hI¤»že—ÓÉ4‚½ÂŸ²Øøud`Ïõ¼ùó4fåhÙ“Zƒ'Þj…§ò7òËY„ù/£º3y7ovÌx~]´no5Ç¥1¢ìÇÈþMqVA”ó v¾¹'ÇóìÃÞhh€×ÅmLXš”<ðä:²«Ñtøx†4w¿³coZƒä¡ïrþJ:¦pv-ˆÐoâƒÉt«æ‹Æxƒ¸Í ØDŒ!ÜIe¶ßl+«oј+6G*èoµ Ÿ{–M/ÏàÛµµyèÈNôåÝ6ÞwÆG®ùúª¬hG×;+/r#G3at3\T@›&T}ÿ¦/]ɹvƒ²¸.k¯Å7&ûñOÎ#Ô÷:'OdàéË„}$fµÇÍx–ƒ ú€Pò”׳¬œRt¬¾ûW<h”ôuÑ®UÚ'%È»d~,YÔnªâyHç`—?¨õ…1ÓvŠrm¡öó‘دTVVÝåV+õUwŠŸ—ž™o3ëH ú¾÷"ͼK\Â+Ê›JâÙ%ª-Aªiì•7/ ñ7º>àùç\£qÀÝA…Éd*ò™˜{ŸQþLNâΪѪEõüä hýhÔº:Æs¸\ Ùù4oIuƒÆü1ó¸v8l×ftˆ¸w%EãшöaÖJK깊Ê`ãBõÖΘͺ}gIͱÁ¯ã0†h†‡E¿Å·¥z÷átðHfÏŽËx<2„Õ´wçp™ Ú4ð¼wõѶ:M›yc8w€«åyi*¼£ƒî.Æ4öîèUž„…¸åŸKƒÞÝ•ÑpçJ.˜'Þþ€áÍÝQc 3)ý±›8eâî¥ }0ÍjÙ’¸ã7`J=ÌÖÂÚG`þ ;Ëê[VÌ)íoWk<ȹ'2c¿{øÎD¤´¾Ö´c~ŸGvª{o‘®v§^×zènådjágor-ŠÝü¢WoL°ö2Ò0¦ŸåP’+1Ûâ—“@Üå\r.àlnêÕrC£¸žÊrŠÒ´U±mAY­9ŸEíVù8§RûØ•ìr« N.˜Ìg›®£ªÞ„zUKÛ(*ËÝJêªv¦E0$l‰ç¶ Liñl7Ô>¦Hn5róø!®k#hqïÑ!mÕî¼ñåy:D§è|•Ë•§ì±o¾¼RÍÔ¹LVäèÒc×@Jünê£iêp¯,¾iVµŒ2TTα°.Öö³¹õM…·O%Í‹Bü}îÄ ÂÁÓÑLT8x8”2›ÈK»I6‰,x© J¸å™iø³Æ*ô¥ÇÒcQßÎGo ^e‹‹§=ªóÖÝrPTõ½‰1[A4Þí9á6sç®dÎ똃¯ˆ6<Ò÷iÚ†:Z´£UéCèÔ#€õßBçG‚óŸ6’}+ l½q-t[Xƒƒ—#dÞ$ËXz•,-5Zu‘‰­MÉôÄj~œ·ž#'Iµñ& ¦{‘õ¼A­ÂP¾•ã·Úqt§Õ ­å¬à}> ë«6s û;Èú¶èFøÜ9âßž&~ZËêkU;*'¼ @ãäg¸™iç{eÈU\—‚ÝLػ緼ösQH—ðhL® 8zê:msŽrÓ5šÚÞ6ÔSINQÊÚØVÞ'֜ϲv«¨|lI¼ZÓÇj²ãÊ1®LÙœ;æÀC=j³uÙ|ìiƨƮ%Œg#Yfó¦Ò\ìFTë@Œ?láTz3ÂOÆr,/”~õÝ‹äU™72À1¼Ø9½¼i ÎWQ¹ÜÜqÌ}ƒ¢9²ì:C™ïþµ8G—»2S2ÀÑ ‡‚Ð8âéhfa^9ǺX×ÏæÖ7•Ñ>•1/ ñ·ÚÄ ì-ªÒÿÁÆÞ-þôx뢋>;¡ÖãmÇÝÛújJÁé”SM’«Ò’H˃{Ͻåpëz†•¿QX—œ{7Ôì•Á·èÇÝ“ÜÔ œ<¸‹M+–ðýäT\¾_üw9fnâÙèî,(u6w/Ñ¡s²ƒœTnf›@¯º›Ó“ÓÀÎ[5”ø.Hc)éûnyÕULøYm2h`s"ü°É>Ê×ÃÞær¶v oI i»N]Eµé8ª°‘„+j …õÅ\Ì)ìoS&§–ÎåˆÊíé,>Мa1w&@eõµ’)”´ÂgLO&;œujëêRè¿»ÖÐìu{‰?t‚Ì*]©êì‡1PË–½ñ˽Œ.|ÕtÖ³Â.ðYÖ×–Å`9ÎgA»U\>®ì>V“S®qeG½Ñè×0ï#/2ï»%œŒ~ŽP}ñÇCõfó¦Òºjp¯Ó†ê¹óÙ™ŒMl†°AÔvS;§­“2RÈ(8œL9¤^¾B–c\¯¢ryÙÇ©kvìkÍ‘·ÍÔÙGWv Zœ£U¥+;g;HK&Ýw_¥iL'%?Ÿ-ß8VUd]Ìõs)µ4·¾©àö©œyQ%Ñö¢õ«O5u ·Ýñ¯Y“€š5 ¬‚ñà2–m½†Q]ÇÔâŒ]êvÖǧÝÝ0Sö±ñ¸é/ª‹-ÞfË`$eËÆŽþ˜}·AëêODëÞåívÿs­Ò²–s\©ôxzÚ£ÒT¡íÀnx]_Íë.–ðÇ•ån¥uÕxÖ§yõ,âÖo`CœÐŽuŠÿF n¡á8gaÛñç¼¾™O_Çì¸ ã§¢r¹Òã”=öÍ·W3u6»P±:Gß¸× Ã1ó[O¤ß-KÞÕ=ìL,ÿ\¢hÑ¥¸.Åœ]1íSYó¢¯;1å¤ñjÆã­óÑgoóUbWêûš¸·™5›‰xqz…IO­V‘{éû¸R;Ìü15µ§“ÿ.–~ð&<Þ™(—\¹‚3Ž«¯0XZ½Ù2¨qòDsy13ÿëÈ#-BqÉ<ÏÁß6‘æÞÚ^Z ›„ù27!€¾ãž!ØŠ•_{‹Yδ¯'òeò£ÄøärfÓBÖ]õ¦ãˆw’µ7!U`ÉÜi,³ëL é [­&[_ÁÁí‚7‹Y6k.Yü±½ÇÖÕÛ¸ h·Çr¸vw¢=µ ñ ªYU~œ»–šÚ tQÜoŠê[Qý{ž_¿ZJjÌhzGûáìÿÑ£?ãÛeí™üTMeõu²¾=3v|ÈûÚ^<é@òžå¬8` ¸wjê€ÌãÇÊqhë×€0ý*v&鈩í‹5ÎÁѸgþÂEjòPðß-Td= õð5eü{¨å}­¨¬å‹-¥ív?rm±öUÚÇ4®tAѯÅFþ·è{þhù:ÍÜ ï®ìänŹXãEÝ–U™?÷ghë12ªä<¢ êN·ðÌ: Û>á–ÆÑUóHpiÍøhg4æÎ§Fg6—+»†ivN¸n~ì+i™:«JÿI}~ÛZŸ£‹² éA×àÍüôÿÁ¶ÏÄ꯱gÅZÒ]U¨Uå˜K”æVÅuQ2gçcåÛÖ´OeÍ‹Bü«îÄ r"zèTÆ?Q«±ß3ý‹Y¬=¦£ÕÈwÖÜ]ás—vvlGÀíULûhgsSÈc“Þç©&:N,ŸÉ7?í$£áhÆ=VÃú?ühi]”A[£'c^ìBëÛX2ãs¾ùi#½»1bâBõw®ü¤9Ì©¸3¤Yû'¶Õî4ó£ºùqé·ïøú«ŸØ›U‡>“¦ðT­;»m5:¿4”æÞ ,ÿìf,9‚sÏ×èûç¿WÔÕbÿG9¨'V2ï«oXµ/‡†c?cR¿zØ_˶óÙùWš4xÖk‚  kG„‹ªbë[!ýÇ•µ_±ôr}žm‚«ÔîÍxæÉ’–NcCb®õµ&}è<~áI±ü4íÖŸq¡ù )ŒïâWüJˆµãÐ.€˜` PèjwžGÒúD¤ª4¤Vþ£9WÏ"c=ÇÌ¿çYÞ×å*«ÒØRØn}®-¡}•–µÇUí¾ý7îgÞÂ#Å_%¯$w+Žg ^1-ñlkw ©´q:NøA­õ[:i_.æ˜}G†O|žHG•¢ó™Ïå s¤’ã˜ûJÚÇ\ͯü­ÏÑÅ*]Îo¼O߆Fö/˜ÆwËâpzü-ž¯ë„VgSñã¸u1ß?ærØ_Ó>•6/ a.Å›¬{UFi<ñÏaJÝÊûþ@õÂt^oé&I¶€¼ÄEL»‰F~B/­4ˆ2öÿ¾9Ú˜KvŽ -š»IcÏä!üPe ­ðÇ/ÿVóÍÐ>âßÇÞÊkmji:!LÜŠÛH‚*ŒÖQ®²BˆhŽÎ93—Wûd~½W¢™Ò޳ë´ßpolÿFu© ÷¿}„PÎFš@ü›ocÇæßÙ¹ô0š:c©í*[!„ø§æh[ÿv´­±Š%_̢ʀvTW]fïÏßð»±>£j»Tê¦âï0ßÜÏöB61BX2©¤"vár.ø´gРFòƒC!„ø'çh­?]^} ìùyêFÒp»f#žzc \T¯ºT†ûØ>BXJ~#„B!„¸/ä71B!„BˆÙÄ!„B!d#„B!„²‰B!„BÙÄ!„B!d#„B!„²‰B!„BÙĈ¿)cÊo¼Ý»#¦#›\.oZȲíWÈ-çqsÏÏç•>£Xš˜WÞ#UX™*ú¼…Û®|ÇË9ý/õîÇWqר=±ýÇ,åŠáÁ©ë¿Ç_ÓÊûûßÝ7EÇXö¹•|ü“ôïý:Û®'ûZ/úšÎÉìH¼dÇ3càLŠMÁ„°²95sÆÿJ²áßx~!d#þ%T6®Ô !ÔÏ59\Ü´ˆåÛ¯ðàäÞûU&óç-Üvå;žJÁùçµñƒè¯i åýýïî›Âc,›3+±?·)ϼ6˜Úζ¸Ö¬EP¨zõ?;^„¢²ÙHˆ¿Ý"Á9†çÞ‰ÉÿéÒ V·]ùhœ«âlãB{Ü|°MñÅI.‹ücI[3Æ2ÉÍÈAåׄõkbÔ2™zÒLBñ÷ÝÄì|§ÓnõeêÔøjîü7SêV¦ ÿ”´¾_0¹›/ªÛGY;û{~ý#Ù*tîA4è1ˆ~‚±Wqç6ö SÈñ.öLgÎvžù|µ¯¬eÞËøãD2YZWj4~”þ»âXÒ•Cé'~-ýóÙñÌñiCÿCÓ£óY±ã‰iNÔlÕ—!ϵÃOdçÛQ“Iø&uÿøŽ¿'æB£'FðdàæLÿ™=§SÐø5¦çè‘<¨Ç¸ˆ ¯îåá7:sù—e쌻@®G( { ¦ßCØYpQÛ”s…Ýóf²t[—nÛâU«-½=M“jº;×Js¯±gáL–l‰#1ÕÏšuißo0"œÑ`]ùUÖ|'c/SŸŸŠjÜlÆÕ·¿SxC^Á²÷øhp(:EíÏŒá¹Ô÷¬žÈÂD€wòd8=š_eY|Kþói´ù§¸¶†I#À啌mädö~AÞõÝÌ›½­G/ap¢^×A ø3æÌÕa ÆbÁÝ2ÕaÌ·oQ×¾À JŒÛwhâ˜Î©5³˜÷ë>®fáP=†O?O·úùµŒXÕ_aUÑó~Õ‹ßÇ9χOrèµ·¹ÔïkÞnë¥ÅN•V›©‡Ú©ÁÕ òpÀ;¢U¯WE§R“JâÀÒº~ûuµ•ú ç IDATçÆ´²û¥´þtV™ïs}RÙe¶6Þì¬)sÙ¹³¬þ¾ËpÙº¾)Ñ\þ·0—ç)͹æúÛ\|ÿ™Ÿžù?ÚnϬS2¬wCfLÄsÎ0¦\z–Oßk‹«JAþ¶d¾2WþÒúǾÌÆü9óç™Ýß~ÊÏ[r5Ë™ÀV}:°ýœmn2\fÍøQ,òÏç¯7ÂAe"m×dFýï=ÿÇ”'ýђ˹9/òÖº`Æ}ò;Ç™™'¬Š)…u-Wœ‚1í8k¿ù–u{Hµ­Fd»>´1Pî|¡4ÆÍžÿé/!Ì^\›4iÒ$k¾˜[·_Õ‡X·á UÚµ£¦ƒ0q{ß÷ÌÛiO×Á=±¿ÉîO&0{¿õ»>F§ÖµñÈŠgãªXÒ¢;QÏÓ Éì]õ ðÇ9'j·hAL@2ó'~É~§F<Òóú9µa›®‡Ó®‘/Ú"IÅ”º›éÊø¼!™½«ÖsôÔ~ÎhÑ­Wê{\aûšUulAë0'Ô†ëì_½Ž½ãÈîBÏnq:ó×­eãŽdjtéKVUIÙ¾ž'=iÕ&»´£ü¶fwî%µÆCt}¤1~™‡X¿b9ÇZÒ,ÄQÙ³~†d¶}8†¯wØP÷±'éÒ¼YûaéæL"ÛÕÃSsƒ]á‹™w~Šîmk¡OŒeù¢-dFµ£¶—•å·7ZñÃe¶/ߎªù£4¯’¿Ã0epú·U÷hOÇlµw2{WÅr»nožîÕ÷cë9Re8ï¼Ù“Hß$¶®9„C‹Ž„;«#7v|ËÂÃÕéýl{ªêJßÂoÆñÛºß9²ë ™áðXצTÍ<Ìú•Ë8¬mJËZ.hrÍÔ¡AujÄ4Âín™ºèªÇFU¸ÏŠÆmƒ:~\ÿ“Á³åôìX×Ë›YùËVÒ#Ûí¥…²bµq Šœ×1ƒ«‹œ'Ê…Skc¹]§müÓK‡šQ§‰™zظÞ,_-újiæŽN£2“˜¥uuÎdOeĹ*“sÊîUIýY73}íFügfÊlM¼¹Ài+Êl6w–Öß©í©cEߌ7Ìç,ËåšÛ r®IY—ߪüüTçqú<ÖŸ3¿±ßy ï¼óaþ±’m·ëÒ¹} vF3Ç*2a™¯0S~çâýSt\c͹‘CqèÜ’G{w¡žûe¶ÿº†x§V´uDmL){òvD{m3¿0Q¯Sȱ°®šÄÅ•çîé»Xl¦_ÜJèOôy^âb¾PRf ãM›kU™ÍçÎ’ûÛ\yõMÑ&Sšÿ-Èå¶ rn ‚þv4ß!÷Ƈ‡îöjT¸ããë]‘×i˜+Qz‹êhwSA¼*ÉO–Α€É£/¿ø(¾6@Ýj¤íÉ/'’ÈÅÓ%óóoL$ö+â9žœG¨ïuNžÈÀ#Ò— ûHÌj›ñ,/@õ¡8¨’-˜'”ǔٺjʧ&2Ž,fm¢#M_—aõQ-úð£¦q¬œùÂÁlŒ?OçÏ{úK%ëµûvb×hZC–xn›À”ÏÖxAícðк`žxû†7wG̤öÇnât–‰¢¯@ñiÞ’êù ª¨¯°vÆlÖí;KjŽ ~‡1|@³;Ç-º‹SøyŸF ¸{QE〻ƒ “©`ATxG៱4öîèUž„…¸åN zw{TFCâÛÙ©î½ \íN½®õÐÝ8ÊÉT%?¹4zü×µ´Ž¸÷˜”¶jwÞøò¿<bKƹ\&ˆ6 <ï% Ûê4mæáܮ攧üÖ|Góí] }0ÍjÙ’¸ã7`J=ÌÖÂÚGà¨h£§v‡ŸU»S§sÚÛ'I¸^±?ƒ-·9‰{8c¨F«Õó[€ÖF­«cåë¯L®‹#íÏÆ4$³gù~²=£ sÓTZ´~õ©¦N"á¶;þ5kP³&U0\Ʋ­×0ª+:V5¸™‰k/N˜‹Iómhi]U•çæûÅúÁ ¨ÌVÄ›ue®¬\h]ßXžÿ•–¿ìœk¾íÄwEŽ ëXññZq¡44¸×®ƒÛõ]lØr—È œ5zªÇT#ïØ*ÖžTQ³i Ö>èj>¦,¯«åqªÅ+*»Ôí¬/Ðç)ûØxÜTA㨬×+8ÿƒÑ_B<àwbu[VeþÜŸ9 ­ÇÈ(—»uϼY̲YsÉjäíõ8¶®ÞÆU@»=–õ»íT|OæäˆæòbfþבGZ„â’yžƒ¿m"ͽµ½´@6 ó?dnB}Ç=C ³Ÿ¯\;>ä}m/Št yÏrV0Ü¿;5Ž|]Pwº…odîÔIØöy„·4Ž®šG‚KkÆG;£µoÏc1Ë™öõD¾L~”Ÿ\ÎlZȺ«ÞtÑç¿òʈ7!U`ÉÜi,³ëL é [­&[_ÎM‹ZEî¥ì?âJíð5D5«Ês×rBS›á‘ÆU~ߟ¬ÎS¯ äÇ×U°ç¼ûÅãtŒ²'i÷2V±!ú…G¨¦PV‡âe27šñx«Å|ôÙÛ|•Ø•ú¾&®ÆmfͦD"^€^¥Fg6Vs Ÿ7°|±£"Ãâz(:®Ù8P2Ž‹Ô5´râÜ|¿”c8ø)(³ñfM™•´¹•cÒŠ¾Q”ÿ=µ–•ÿºùœ«¤¿5fÇÍ%Åíd~ ZÖG;e}_x\WáêÂÒòbÅÄ…¢Xlý¦_ÅÎ$1µ}Ñ¢Æ98÷Ì_¸HM v´úb¾’˜ªea]-S°¯õ8üw±ôƒ7áñÎD¹ÜààÊœqÔ”Y7%mhP°®°QpþûÓ_÷Öfß|FVçâo°‰AƒWLK|çÎ'¥v" ¼=Jëÿ(#]cÆÂ•ÌÛc‹WH}ÚýŒgfðñµl;ÿ0µ#K¸ÎQ£'c^Ìä»›X2c-­~‘ÝñlBõw®¶¤9Ì©8iŸÏ®Äê«|è<®7y+ñÓ´+˜ètðSÞ16Uè8áCôßÏdÅÒilÎÐãёᣞ&ÒQ¸ÓtÌGØü4ƒŸûŽ=©—Û¥=® ãéW›sbñ*L¿†Ê'œö/ã©æù?pTT‡’Êd.œˆ:•ñ>3Y°á{¦_ÏÅÞ7’V#ߥWsw4€Æll9ïÇ]Ë;VÔCÑqÍ·¡ÖÒº~5®râ\A¿X¿ûV06­Œ7kÊl¾Í­“–ö¢üïYøQ+så7(ɹJúÛ\|[2g˜+–ö‘’x-Ú?#1”‘+dŽT+œ‡ìˆ Ö°óP5¢«ÝyöMëMþ’\RËÍú‡GÅT=ËÆ€5qŠ.Ç&½þ›Y¬[>“]ÚªD¶Í8ÏÅ|[mh.Æ•œÿ¾ô×½µ™Чh“•¯†È0Jã•G^â"&ŒÝD£?¡—¿V¤‚™R·òþ°/P½0×[ºÝKº¦lû`Ž£_1óÞ„’sÿ- Sò¢Ä¸÷½•×'äï ‰âŒÌ­¸$¨ÂhåZø*Xn*WU~¸J~BÉ‹Bˆ¿-yÛÝ*óÐügzYe}È.œ~¾“¼òãOÆ[ÇØ±ùwv.=Œ¦ÎXj»l›έ^Cn»>T—ÉZ!$/ !d#*–>z$S¾’v°x“vŠØ…˹àÓžAƒùѰ-5A i&!„¼(„ø[“ßÄ!„B!î ùMŒB!„â_A61B!„BÙÄ!„B!„lb„B!„B61B!„BÙÄ!„B!„lb„B!„B61B!„BÙÄ!„B!„lb„B!„B61B!„BÙÄ!„B!„lb„B!„B61B!„BÙÄ!„B!Ä_Ae2™LÒ B!„Bˆ¿ ¹#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!d#„B!„MŒB!„BÈ&F!„B!̲©ÌƒŸY<…ïã²KùW?ºD]ðÍÿ–“Z /u÷ÇÖÜA³O³è¿?r»û8ž‹²GUì¹$®ü”Y‰­x{X£üÿ–Ç• 3YåÚ—ç¸ÈÎMˆ¿L)GÖ±`Á¯ìM¸Dj¶-.¾D·‚§ºÔÅÛV¹XøòË,¼ÊÀÏ&󈯦вÌàwÎóÄÑÝ#‘y£Ç²äš†¨Ñ_óvK×b9 ãàÇ ›¼ û–¼3c4‘vÙý|7§þ Êïà†t}öYsBSZŒiœÚ¸…«wpø|*¹6NxDóPŸ§éZ×[Õ?³çŒ)¿ñúi\kÿ.Ó‡‘û ;µ­èÑ­µ5Ýfïo³±ÁD^iêŠJÈ¿&&rÎÌãÍÙ.Œy» ¾iK!ľ‰À6V£q+š´ÔŽÔЫPå8R¥F5œ„ש‡_iNJ·çB+/éêÜñÒìawü ®±‡ËÍ£“éSˆJg¸Êæï×sݯÿ›üþ怶iö>/~õ#«{6àéªùcÕÕÃþoùao=^jè\æ"Wëí‰éøFŽÞnFSçŸÌ:Ö¸øé¹™ZäKúê4lÝ–ÝŸÿ¡7ñ`ÌØE,]wvÏYˆHÞü%_n˦ÞÀÛ¹vù§êÚ£#k&eÖ׳9Xo õþy9EåÃÐÉ1ùÿ/½ö´·9°x ¶íßÃßV†Ç¿.&Ôn4x$æÆr¹qOªÊuD!Ä¿‰1'çK?þޤŽcTÏ •1“ ¿¯aÝî$ÞÈAïJ£‡¡e¨s‰W;™صj »O\â¶5ë·!Æxïß5N5¨Uý Û\Bá:6Õéá$÷²…¨ty·¹| ôáxÚhðhÜ‹Þ »°/ë>Cï”/™5c>"‡e_úÆÀ>¤ 5÷¯`ãÑ4š4qº»áÉ>·•ý™A´m’ÆÒm拨õ&Üi[Ïß "›˜Ü‹ü¶ä0†ðá ítosç‹~´yª¿}Ïá‹9ÔÕAî5v/˜É‚ÍqœOµÁ«f]0˜nù¹+û8Ó_˜Ìçß$æïX²;ÛN!4ë=‚~50û«ŸÙu:¿Æôyy$]õ¨¬ùNÆ^&?7ÕøÙ¼cŸ¿Kâ×WG°8ô=¾Š.;ž/†½Çíaÿ¡åÑù,Ù~ˆóiN·îËÈí¨¦²ãùbèDŸ~‡Æ«&27à]úõ§W‹«,>Ú’©Ÿ÷§f~£®­áµ?à:n;Û„Sþ`E¼­ŸóÊÏå&ÒNüÊ÷ß-cç‰d²´®6y”AÏw!ÌQuçüfËhyûñò¸½t}³3YƶÃÈõ¥É£ƒØ!½ûQSÎvÌÉ¢­q$Þ¶Å;¢-O ~šÕtwê/1Q(&ìÃÛ~ãÖŸëʳA²“B”OåßÑ5æ’™‘NzzÁÿem0•0#ds~ý7ÌúõªÖt´#ÑöçØ4ï[֞˦Ø7r/±éÛY¬;š‹³.tmŽMÜÏ,Ü—Và³2në‰yìq¬>v·2È“~¢òÙzQ«†–Ì3™±|/3ï]]P9ÔâÑÁÏѱZmƒÆ“Vƒž&øæz¦/I »ŒC«ìCi¥æhlxÏw$wÇwLùöé& ÊhMûäžá§÷§sÀ¡1}†?’Ùôá+|ük*!]‡0zX‚¯¯æÓwçp,Ó$1QBL¨ìkÒ¸j*{þ¸B®dH!D9Uþ˜´½üøñÞb{§à¾ãy&Ô®ð¢áv<¿í¾Žgëaôk›ÿŒmTMf~EìoGiñl=œ LŠ™g¶°+IOí§Ò3D ¨îÆ÷Ÿ-ç\*zÖïH Zðpuét!þ*WšCÂ'ÓYñöþ Ã'¼õëÇРQ#jWs(¶q°ñëȰÇ7ðÊ¢é¬n3…Ǫ•òªÊ°¶‘¨>Ýȱô†4tTAζÿq‹×ÁíæªYÜJ½Á [Àd 3%mó¾á˜É‡Û{©HnêynàH]_³¿ßÈ»´‘¿g>ô¿¼ÒáΆÖÍ#°}i<+î£çÄæ¸ÞI[¨köcÌ€¦¸¨ ŽË ¶MXçSãÒÉ ð¾¸1ëNs=¼¬ýŽ¢ÜVwäÝ—óí©çOæ¾Ì9–DNw?ô÷V¬8xúà®S¡¶÷ Š¯;zçDé7±ë@2=«ù¢1Þàà¦l"ÇáTRkesaÏY¨Þõî]¹œË{9šéK·Céí¯ZRÛ]ÏâËédÁAi-l·ü‹[9Q£ùÏKÍpUm›Pí½øì—•œi?¨À#‡¥Ë=·šûU4~u#Þ¹óÔ$ ξ´Œ5§úâ&1Q,&Tø×r%yÿqnööÇS~#„x 71vatz´!…G¯ÆÁ¯ø­äܤã\2zÑ:ÚëÞc6DÖñæ·Í \Ï+¸‰1pãÌ%r#i ¿»ÈP;‡Ó¨ú ÎeIç q¿i<2àÝú$%pxÿ~öíßÇîù_²fÞ—x6Ì„Qñ/´±¥F÷a<û& ¾Ž¥ù¤ŽÆ|¡] Žám‰0}Aìñ Ä8wi'¿ßð§{7Ô[JøÊíÍLyas‘ÿhODŸ—yª–¾øFŇ³ -égp‰ z6ô¼÷Ø«muZ4÷fé†\ÉÉ_°¢Â7:Çü“iìÝÑ«<‰uËÿž{w{TFC»ÉÖ|G߯ ðþ37kðpPa2)8Š>˜V¶LÝ~„ÔG|qO=Ll‚ /EPâÆ˜Î¥Ä œ¢Üïnm®ɇ݊ u}O mÍÖ÷~`ÖμèRÊñ#haäËØdÔâú®]\¯Þ‰zš’UÑ×¥ÿ ©šŸ‹TZ'|kRÅE[â“N¤q99 ºâŸÉ½Âö[¸Іú·²ÀÖ·B/ Ñàèå™7É4r÷á]V]äX´f2±5ß)š_M%m=­›T„´ CýÙVâoµ!êÈ&N©#x1¢”2ÒIN½‹þîÝ7w;ƾq›ÙsVòí”u|‹ïÈ6ôxúi:„:æNY-n•>.…?`ãì#gHÍ4‚Ù÷Íɸ‘Žá8<ŒÊ/oÀÀ5‰‰bB…ÎÑuF2· ’"…ú&FyD£³ÃZ‘r‘Ó IDATõïA°]‘Vëp·…{«5:G[ÈL¥ÐœcÊ#ýV–ÅWŸ„+çÔl^xýšÿßç…~Ä«ÒW¥Á£ÏÑcëhæ¸@f·jÅrSgÔ`7ÏšÃÁÆRR†#µÚ†c˜¾‘·<9µ# ¿ö1xjàrIŸ×ùP«^Œ¢G…l<£ˆp5±iS7›7¿wÕþÏ=LâæÌ[ŠÓà¶4w²ƒœTR³MÜûe¸´ä4°óGw¿›1fp=ÝTRÚµ:_;×jIiÛN^Eµé8ªð‘D8«Ì,› O?îuglžä¦^àØ]lX¾„™ï¤â:m²\ÂuWAÜÂÂqÉ>¦c÷^$c¼¾™©£Çñõá $&Jˆ Ùiií=‘—„ !ÊëzS»Ú%’vu¶0gÉwüœÔ”0w)g²s2w,üŠSÀ. %M¼²yþ·¨Z5"Ð!“;wpI¯‘?¤&Ä}¦r®Ï3=k2~Áy±15¥Š« ™I§Ù»™ãªz ïŠ]É÷MÐx·ehŸu¼4÷,Pò9T.Q´ Éæ³ï—‚OùØ@…½PKõî/ñì‘×ùnú˼¼³ M"p'…„]ëØz:›€^ƒhç­ÁÆÔžÞ –óéô‰ü/ùQùä’»ÕW½yddƒÒ÷•’Õ½ « æLc±]g‚Lgظp5YúrægŠÜ‹ØçJZ8i<¨Ó¼*³æ¬å˜¦6££\JÏ»jüªÙ“–xѢƹF 6—óåGŽtoŠkæyömØÄm÷ÔõÒVz3¥oÿ·µ½èé@Òžå,Ùo t@w‚Þ©Óu§gøFfÿß$tO>Bm·4¯œÇI—Ö¼UÇ­½ÄDñ˜È#õB**϶¸k%G !Ê™ƒ¬U=Á]‡Ð¯µ)û×±ä—5ì:gKÝÇòX”sñÂj«Ðæ¹çé¡åÜŽU,ßx„ìðÇy¦¥7òw´„¸ßtôšÌ§¯õ¥‘Ý9¶/ÿ‘Y3¿ç—-§ÐÔïÇÿ}…v>6en"ª=2ŒG}ËÊ.DµAeŸfñ©èoëO× ŸòV¿6x^ý•ófóÝ¢œPý?{wUÙÿqü=  ;( ¸ Š æn¦dYi.¢f¥™i‹­fûÓÏöl7³Ò´|¬,µ¬Ì­Å]qßqWpATÜXdŸaf~€ŠJJššúy]W×xfîÃ÷œ¹çþœsŸs’ðüHÞêVrpÅÉŸÖC>à™ÎÁìŸ3ž‘ŸMbea ÷¾>ŒûÊ»iÀ¥dªNç§¢M` ?x‡OÚŒO÷èy1ëáFö7S;g&¿ÿ#»,F5§ ` ¿™èsŽÊ]©Ñ8ömåpé”`SH7^x²#¡G™üÅH>Ÿ8´ N ~õ>ÂÍ—¸F† :?ÿ0‘‡çóíç_2k—mãÿî ®øw‡sU:¼ü>ƒÚšÙüË(>þt ›=Úóä«ÐÐÓ }¢¼}‘GêÖ,*ÇÕÇGw&‘‹íʺ툈ˆÈcҬŠ}ðS æµ›üÎ9 ¶›Ï+ƒgÒô½wéTåÊÍ%*Nû‘ÁƒÐòÃé]S§.ç>áÈ[Ë}IàËsŸv)"IÇBDDäB†«doœÇNC}ÚEûž÷ˆ¾“cîŒÌdáÊ#èÆT×ã>á Û\¶ûÝÂ-! 0"rñ4ëJDDþûñm,Z°’Ä_6bŒB¬o&%¼ˆí~ß6—ÔÛï!ô_:ŽÍßð)ÿµ‰‚s-äÎo h“_þ/ß,+"¢Ë@ìÑÓÒù`n™ksÎ×–1[_~ꀱÁ#¼÷É£D¹f°dø3¼?uAñýx|P/š¸&1aè |½µ LPÄîŸßc̶kG‹¶±x]ÅšCÅ'û€Ìõ ÙcŠ¢]„§v‘¿ÉùÒ7áF¸ZðÓ:öÖ§¾ÙÖ#lÞžOPë:xæ-?µ¨í8‡¬DwîE×hï’„Õ ˆ¬'~¬GM—’£¸È74¦Bk*ºíÁœÔ,Š[úcÙ½ˆåGÌDßÓŸnuÍ€Øp?¾þd{+Ü–n>þx¹0¸zãïï…ñÈBæo³Pó·éÙØ' ¦A¦ÏǰláNZ÷‰ÂÀa#3/’ƒÚQÍÅ…¾„º®gKr6­üq²ç’²áÆZ=q7ÎTnÔž¸‘ÛjhÇ”k)ÅxP?¾†óؖׄ&ž°ìcɪã„tÁ/{æ©e­ÇØ[TÖƒžã±ýK>—-C8<ðMöÌÃîz²ÈqjÏ›ƒ»Q͈«IÁÚALØvKçªØ7MaFš'­_z“'ybÚ6 âµGG±¥ÂmùãQ9WNZÅcÚ&¯,$ü¡yæÖŒ@›V‘¸<õÓXK·¡­ð-íg·àî&ÌÍùD™°|ýQºU¯‚ўɆ)87xšH/Mù».Ã…ýÜjÄÂÖí+ÄÛÌÖÜ@b¼N_S5ÚÝ7îÑÞ8a§0ëÛ×m`¿åìûùGÔÇ÷ÄŒ+'3Þf‡°‘¹ûÏ4­e>9uÅÉ;œ¦5 ÔV …é)#˜Fá>§ÖÛHT_lé)d”¹}‘t4A.¥í¹V#:ÄÄáÍ{ȵƒ#oë÷ ‰ Á]ã¹öS žáñD:63{>Àz`+3kÒ6Æïô>À5Œ»_}‡'oôÇ ùGRX=oÉ…μ½Y•f n”ÕˆK¾Ì~¸—œñôqÃPøwÛ:µ¼%ß&_¼L†Ór Ù× E¹9 dÄdÀÍÛ|jpfp£zÃê8ý²‘½ù±„îÙÀ~§ºÕ:uÈ5Í3’›#í|6ù¢8¶|9ÇjÜN\%ã·.v·cã&Ì&ig™ÎÔ®ã_nàYÙó/:0;…9…àˆWÙ .ø¸cØûwÛ:õ¾EÇ Á%¿Ón¼aÄ3À ²)°Ÿ84dÀ½’Ç©>ÊàAÝ›êãôÉb¶oKÔæ$;EòD¤·ú‘kˆÁ`&$®&öéëIË÷aÿæl*5ª‹·d”YÌ–±‚ ãþÄ{;]:DèŽÑ²—_†çèYïùW_ýN¸zº@AVÉ€âÄ(ÂQLÞñ“”¿ÕVé ÉÅݬ¹äZprc§ »\‚p)³J'C™Á‰÷š vÌbSZ†õû0ÔìZ:•Lä:`ð$">Ûèyì8^™ä¥Gnw•p°l>“7^þ†Âøþ Њèš^8ma䃯°ÿìä_öf_3ä!§ªžì,dË?Õü¶Nô-^n`É"«Èæ+`#÷h.¸ÕĵÌ'ãé}€wDkê8¾"qç! ¶cŒHoõ"""Âéò4cÀ=$–êÅ)¬Ù”ÄÆL?¢ëûžu&Åzd'íUhÞ¶1aîkæ^8þV.ó«U ×ÜM¬ØsêB[{ÎNV§:.¢-nUêP‰¬Ù^æ”Ö#lÚ”‰S•:T2£Ðž¡D³gå V¦B¸Z%wZ¹>R Þ‘ñÔ·&1gÉBU¡u〳ú€¢´u첇rgÏöÄÕô°ÚBJÞßéLF…aÎZÂo[NÝÌÞ±–?·9.¢-¡1T%™Ù«žzv”e‰Kc¬C°Ë9úŸ(Z‡XØüÛL~Û áíà£>@DDä‚8_®† ¡ÄU·òóŸ‰àO¸ŸÎx„¤³o5üXÄ¢™s±†â||ëWlä`Ú´ŽäÚ-©[GJ¸ÕjMóÀ-,œ8ÃMM õÈeç²¥0O­P[>%gTЦ°c·'ujÄѦþR~ž>ž³[î_Ìu Y‘éK³®õÎJœ¼¨Ó 2³æ¬"ÕJ÷PM#‘ë+ÆøD_·ˆO¾ž A½hä gL(5Ô%ˆ)Lùò; ›ÖÄåØ&æÏLä à²d>ëv&®w#öˆìÎ5—óã°—!áúd²vútRÒÄÞ¥3™6o3Eáݹ·uàÉÔV±¶\nGpÁr~š¼ƒ6oöx˜ž-+qtíü2u>Û¬u¸¥ß@n q=πĈO½Hü§q„ê4Œ\)†¨vu1Ø ¨e3‚Ê9„bªÙ•!oÂsû Æö%S×Xhþì'¼Ó7÷m° ì­ÌÏÅ5”ž¯¿Mß®lýu,ŸO\F~Ó'y¹[¦¿Õ–uÚßL휙|üþì*ö§õx¦s0ûçŒgäg“XYý¯ã¾óyû€€FÍ©Ão&Z§aDDD.|Xá(¹\ŽÜ$Æ4C×ÁÜ×ÐKGaE®·> k1CüÃc£yí&?õ"""ÈI%¸lÃòv­#Ä…zjð"röÙç±ÓPŸvѾêDDD.‚³JpéÙóRIÚ°M‰»q ëI˜§†/"×Up|‹¬$ñ—c‡ë«>@DDD!æ_ÎQx€5ó—rÈ¿];Ö×]ÉD®·“›ÌìÉÓØÔŽG6Õ]ÉDDD.’®‰‘«Š®‰………QˆQˆ)¡çĈH¹l6‹«ÕŠÍfSADDD.777Ìf³ qzNŒˆˆˆˆˆ\U4LDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDD®ùã°cÓ¬/xí©éÛ3„÷2àñ—ñÓ*:J*ØÀ{w'p?Ÿm+ºâ³ýƒgHHÌ´tÛ¿xÓæ³úµ$$$ðà¸d,Wh-lGóùûHHH áñI¤cös $$$ðÔÔØ®à6.>0gxpÜNŠNßÈÌ~© }G°¹ðä_©O“0ˆo’‹Ôsˆˆˆˆ\—!ÆžÍÚ/žçÕq³Ù˜–A¾p’up‹'¾ËSCf¯Eèêfeïoß1ooàM­Ðʸ*’n³YüRIÐylR*ÖK’ ³Y=áGvS›Îjãzò÷.Çw;g¼ÀHն݈1fæøE¶i늈ˆˆ\)ÎWªáâý0~AàJÔ]OÑïæ†T7ç°sþÿø`Ü ²wý̤¤Ûy®6ÒÕËFþ±<ÜZ<ÅO7Äì°â|ÿ <—5+]±]¼6W`ŠéJë #X2Â$7®cCj~¹¯1ø6¢K 6,úi)71 ž«6±ˆˆˆÈÕb¶Íø’Ù)yØÿr AMHhXn#ÖŒT2œêÓñŽ&Ôòp%âö蟒É/{¸ææŸöþöìMüøÎwü¶.•ï0ÚÞóýÚTÇõÄÑ}{)s¿åÛ™kÙ™–Í« ¡QméÕ¯+±•œ¡ø?y‚ï÷Cõ{?áîÁp`*Cž˜@fZ Ænd̉?Û þxçÓþ„¹”÷÷9ÈO™Á‡LgõÞBüê5£Ó¸½¶Cé¿í_ÊßLaÁ¦}d0û‡Ûþ.îÿO#ü¥u8¼š_¾™Ìœõ{È(4âU¥.M;ôæîÛ"ñ)]ÆQ˜Ê‚oÿǯ+¶‘–m"°v4m{?@÷XŒ' zˆeßaÒ‚Mtݾ7-íØç«@î2þ¯ß‡l%€N/õÃøÛDæ&¥QàJË0 }mÜÏ<Ãb;ÈÔ!3!­äÇÂe¯Ó§_[ÞÕ›´ÿ½Ã»Nmãië“ÎÔÁCN¾.}ÊÓô^ÿ(c‡Åã[tž:”YÏί<Œû´ÑL˸•o>ìvÆÊ±çÏ?Ù‰¸öÑx€â£¬»„ …ç*–;uÛ5ÁsÑÍØBïÁqxÔ‰ˆˆˆˆ\5!fö¿³0ïÜËŽDоY þånwö©ŠpØžÄØáÿãÐ-7Ò,¦fZ=þ6­N,Xp ôrXòñ0ŠOÌ-ÊLfö§Q9ì=ºWwGÆ>˳–6`‚œtv.›Ä›ë¶ñÈG/Ò.°2 cýù~7î#¿KU û6r°¤!öl?FqÃÊL*iÓјj.õ×¥1eø·':¼}!_½x¢_£ku޼MŒm8³3J#³ƒ‚Œ],›4Œ#®ŸðV§ª w0ñõw˜–^à¼ÌEä¤oeî¸WØSôoþ§¦¢=üôò³LÚã“?U 9˜²‚ÞÜÌÞÁ1¤•?N¶ ô,#V8ƒp ¿|ĆómÄ Õ¬lÄ8Âï½¥¸ôǬÝ,û.ž¡ŸÐÿ̳NžÔoß™æ3§±üÔœŽíšPÉiçÜi<©kb§Ìb}¸ÔiC‡›Cp«HN¾ÉqÖŽ}‡´VvœÝ†e‹–g€1šøÏ’ÐiŽfÈ„)%{†÷ðÆ Ê»òÅ\û&bܰdÍvÄë®NDDDDär»àÙ<ýžëJ­s½Ú¯O<ѺÜ`ªÙ‘þíª±~&ã?x‘Gúô¤Ï#Ï1lôïÊ=ë,SÝ>¼=î;¾Ö—@*Ë6eblçñõ죀‰ˆ¾ðíĉL=„›|€Âõ|÷ÓNŠp¡ZãÜÛÞ$Z¬¤oÞljËmN¥ÀšÁö]y€‘zÍCq;×x;4׿šÄÄÑÏsk`ÛÁO“’Ès@áÎßX”xµæ…/'3qâ·¼y»?à yånò˾E,N¨Ç 1ßò¿o'ñÙCáqòçBö[äl˜È/{àÏÇ|ÁÈÏ¿äã¾aÈeÅ„Y쵂eït¾[•xÐô‘™0ù[†?ÜólÊÕìŒí÷|=™‰Ÿ¦…'À1V¯>xöu+/":ôäö0sÉà?ìvzwkFàùb³Á“ˆÝiSµäGÿ¸.ôjJqÒùëpJiÇÃéÔÿ žÐüì¿;c+›2€*ÑÔrÿ›§Rܪ %³>]m‰ˆˆˆ\U!Æ«Á=¼òÊ_¿V<ùÖã´>׈ÕÉ—ÆÄè×ãî;ZYÓW àÈ.Ö̙ĈçgøÒÌ2AÆ•FÝÛSÏÛŸ:-¹±zÉo-¹E8p“²ŠTŸ6Üs[-Ìp®Ü”ž]jp|K‡‹Á­VsÂŒ@Öv’33Ù½-<¢iö´ÍÌÞÇæt€Pš×õே¸fšßÓ™HgL•Óë® @ÁÖU¤YÀ-ú Æ|ý5ãGÜC•ÃXüǯÌ\[zZÆfÃîƒÉ;3ô >›4—ÔÐÁ|ó㦌º—Z& û×” Skù–o¾™Äœ}N¸YËæcŽ%­ã(@p'înS7£™mzsG•smÁŠ×ì_Zýç&jy1ÆrS¨Sé6°`¿¤»iEêPöJ{yš¾n¢YÃjg½›õH2GçÀ|ÿî¹HƒÁ5½€c$Ô]ÊDDDD®„‹¸°ßPdàµ×¦²Çþ7ÌÉ·p¡rd[ºE¶¥à°f²z!Ó¾ýŽ¥‡sX6i.½¢ë–.ì‚Ùµ41Œ¸œ~!…Y¥S©|ª—˜ñöÃH*¶ü òm`ð¨KóHÚµŸ ;S0§º7ÑÚËî`ÛNØg‚›é{®ŒçKÍÊ.'ka®R o¶’{„\œ²Y÷ýÇ|õÇNrN ­M§¿ƒ©fGêžÌg?%‘‘¾‘ùS62ÊXðªÇ>Eß^äg”ÎÙ;º’ߦ¹¹ε—Qò·|kœúÛý¨á ¤ÿÕúW¼feû‹ÓÉükt¾\„Ø+PxžøÙ‡ên@‹ó2)ܽͧ_SÁÜïæcr(È̼ԋˆˆˆˆ\=!¦œ ãs#O¾õX…Lúï¯1tâ.ìUîà¿oÞE¨ &ÂZtá¾Üe,ýbœ5ˆ>ÇÀÒ·ôâ„ìýdC#€ãK¦›aöÅì8ùÙ$v yÁŒ…P5º.u*ÃÂ],M,$ð!àœF.‡—–Ð5û(ynÞ¸9ÙÉX:Š‘ìÄæCÂÀÚÄÖÂ2óY†L)“*œ|ˆé=”/þs˜ík–±4q ‰«vq!`%yÅAÀÈ&Õp9g›9,ÿu‡‹ÁQ´¹?'Q 8×¹j®Åd$—>È1¸9·´Œ ˆdæ/N?-|¤ýü w'ôàÞW—âÑ´ ýŸQït¦2€õ‡óLdžàlYÌŽ\à hß\Æ~ø>|6]EÎTŠŠÂ`ÿt&.IÇâ°¾d23üS5»rì6;àZ:Tü=EÇ øû{±Sx¼w?]Õ/"""r%üCω1`ò­R2ø® sÄ]ô‰[Íèuìšö!CΚ"TN}[àç´£bÓªíèÛîwÞš{”-ãŸáÞï\ÀZzáµ[÷t¯wò"}×êMˆpûƒe…%íÄ»b2EPÓ4•#VÀX—æµÜÎÛfÁšÏÔþ¶cdsgïÆøœ±Õ®Š‘ lÉ_ðpïñ8Û‹8yy‰Ý‚ g‚šÞHÍI{HNžÀàÞ?áëo$7#·d¹ê͈©ìŒ¯Oonü?fžÇn ØßÆ‘ô,¬@ð¨ê®uºpWÃŒNÊaÙÈÇX6’¼f—•ÁOÀÂáYóáAïrþ:Tô©˜¦€0XBêá½d߀ûßù8ò8˜šT"¬Šž#"""r%\¹ÉBÎAÜòüHÞ~äNÕ ÄËT²:f¿`Â[÷æ¹ÃèSßL…'þ¼ˆ{èCÞØŽÈ꾸X-=ƒky7ÿ÷Éó§ß*ØJó°Ò?=(ŠZp«FƒÒ;bÚœ°ó>¤ ·ÝÛ(ïB2‹Lø×nIŸ7ßâîºnp¢RëGyòŽúø7?Âïx’·oXr FÊ–²aªÞ™ÿ¾>ÛVÃ×µ¬Œ\î•©Ûúnþ;´µL`p ß»os›z¹dr =—*‘ÜÒÿMÞìŽÙi÷ü»Å-ÿËh=ìRDDDäŠpR äúãJ­öí ÆÊÆ?“È®pŒ/ yîjrðã¦;#`DDDDbD.çj·pw3Ŧ’x¨b—÷;²ÖòëÒŒá=èRG×Ȉˆˆ(Ĉ\N_÷I »™þÛnÎs3þÌ:k ûµáŠ].$""""º&FDDDDD®.:#""""" 1"""""" 1"""""" 1"""""rµq¾Ð®\¹RÕ‘ Ö´iÓ zîN&"""""WM'………QˆQˆQˆ‘«Ð?ìò€EÅ‘ ìra¯Ó™¹ª(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ\rÎÿÆ• vц¹P,ªˆˆˆˆ\Ût&FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDä’sV äʰ±fé*ºl)Ä`òçË»r‡«*#""""×sˆ±ç±'ñW¦-JbûÎ]²xS½N]ÂohG×7PÅÕPº`;Æ<ÊKfý®~„ÄÞÂ]÷u£I éª…¹«w±-$ŒG‚œÏ:%—Ÿ±ŸW¶›x¢Y 5.Ñù:»ÍV`¬6ìú<ŠˆˆˆÈubŠ±à“—ùti&ušÑò¶æ»gïÖÕ,øîæ.îÄ˯ö!Æ»Ìݹ.]ïoO5—ÒAvq>™{×2û÷y7ÍÎûï÷&ÔåÚ0³—­£ßÖØ”GAÇž.dò3Òè?=™ÅV˜[ÓÚR]EDDDD!æR²²oÚû|º´€è{Þäé.áx„÷殕ßðæûÓùà‹zŒÒßÿæVÚÆqÚ”¦ö4óÂàÉKXu¨¡5®þ’íHJ* 0ö†ÏÜ¥A¦(3J À¡”-ôrwcI3o}ZDDDDä_áš<¾îÈÛÌ”©{pmü(Ov-`LTnÚ—gz× `Å$æ(>oÎóðwL¸™ ×D}êԯ;e~Qd†mßKÿéÉ,²–ù7*¼å¥OŠˆˆˆˆük\“gb,û–‘”ïN㎱ø–›;Lßt;µ¿Ëòü§ºOé`ÞBîñã/=ã(. kß~žœŒù†Gi`¼&êc4ûóJdž03‰¯²N™Ï眾 GFw®ÏÞ&-߯²¢Ó¢&G–MKy|¹dOÏØõ#j3(P÷Ÿ‘k<ÄM#‡@êýõ,N^!„zÁª½™Sbò—òî#KÏZÖPû.ÞÜ–ÊÆk§Få™ÓL£:×§“Ç?sö)qG:¿XεD1+w¥³òŒß6 ®Å @}PEDDDä1v›0`4œcn0âl›Õvêw.Qôyª 5OÜ„Ì^ȱó™ôÓ$>™Ú˜÷ïªÅ5t2ŒfžmÌô™8|ÆnÑ¡Eä ŒˆˆˆˆˆBL¸ù`f#»ŽY! ü8 “v|ªzsò‹KeêÅÄ~a£h|÷=Ä;‰Ë9ؽ֩€s ÈÏHcàŸg€bfÍÛÈGgܵì¢v´ z'\”£DDDDäz1®!Í 7-aåœmô­ÃÙ'l[ýÛìþ܈󩧕œÍàFP-Ø|„ÜkèA&ùÇÒ¸F2‰Ö¿XàŒ»–]lùøÞ¶||Æ6Xµx9]·ŸXÆô‰££v)""""çqMÞÌà݈·’³àFÍI¥Àqúà9{óO ÿr †Èî¬Àƒ_œŒ°æc¹FBLÞ±}ô;3ÀxTaÔòßÙAæ£CÅú¤ˆˆˆˆÈ¿Æ5zÛ'Wêö~ž~©/3þ‹§Ù¶°-¢ëä’ÃþëX¼j…Aíxö©vž÷b}&³ X2É(p€ùêŸßtôh›Î0c:×§£‡Žc°ÏÜÀØÌA&åGŠ Hw‘‡kö9ì×îüïHÞ|ðN"ŒûY5ã[ÆOšÃæ,?š÷|šá†²¿/ eázòË{‰k$Ýî‹§ª p“wd'KgÍcÜÐCG¾ÆmÆ2 ð¹•Hã–/JåÞ°0\Nk&…EI¸ÇÆfþç+gpö¥vD]üƒÝ•èå¢?‡ùɳ˜´ú8öHUC.O€™½lý¶À¦< :Æðtóɾ,?#þÓ“Yl…¹…0­M ÕÕщÈ5BÝÙ…²îaÖËx{Ì2НðºØ±ðëÙ îÅ[os•ž‘)ÈLãÒp(e ½V¿¨ö’¶¦0:ÝŠ(:~ˆ·Öå ÎðˆˆBÌÕV9*ùXH_0œá_\á SœÃÁã`®NÀi#q#•š%Ðó¶&”9çæ{/÷5´°dÌD6çŸ{Äå^·-ÑÆmÌÛ’{Zà)Ú»˜uuˆò©Ð*šª4$Ü 2S39«T¢nÂ9c9‰ûʦ˜"ö&®!ÇG|]w°ç²cÆ^zô>z$ôâþÁïñÚc§Þ¯h+ŸöïËûkRYòÅK<Ðg(KŽÛÉÝñŸ½ô0÷&$Ð{ÏŽ˜Áö\Ç©×ôëÁ ó2Jþ>ëaVLx‹§ö&¡GyþC¦n9~j\ÑV>½ÿ^†­ØEâÿÞâé½H¸k/ŒšGšæ£]·œ½ChØêîJhK°Ê!—IúµyÀ·Ì/JƒÌ°í{é?=™EeyTáÅ(¯‹ ëÙ¼=kï´bµ±jã&:/>¢ #" 1WcMŸx›ž±d/¹ÂAÆ%€ˆËÆ2fÚöœúF1xDÐuàý´¯^&Ý+sÓ€{ËžÍèŸSÎy-ˆÁ½ñQNl™¿•Ü“)ÆBjâòBã‰ö­Ø.äÈ?ÌÁ\0û¸•³ÓðŽº…hÓ1–-ÞÇÉcIcéê,̱ñÔ5°íÛyiüœ%0èÑ>´ñÞÂÃ^fü–‚SËQÄîŸßc̶kMµ‚•Œzã+–Ú£è‚âûñø ^4qMbÂÐøzk™6(dÇÄ÷øáh}º<ü,vªÎþ¹Ÿóñô¹¸N™kµ¡K÷îtïÒ†7ÕC.Ó×ÙŸW:6<+È|¾x7‹,§˜Ñës§‡á¢ÚkÕ,†¯ÃíŒúm#,Uùºc(UwmV‘+B×ÄT„=‹3'’˜œ{Öô+‡#7v—`ðC­ð¿ÜU5øÒâ‘§Iùx4Ó¿Æâo\ £Q£hÜ´)ÑÕ=Î ÎÁíy¸ûžùq4³Úã?Õÿb2•Áƒúñ 0Œ˜Ç¶¼&4ñ4€eKV'¤{ ~Ù3Ï~­ãY™dº)$~ÿ%ÛþÜ_ëôk^N4ãÅ- ]xy"iwס¶ X¬`å1317×Ã-s9ßÏ:Hµ0´Wé{܃÷óƒ™ôýrº½?%íÎnÁ;ÝM˜›¢­Ÿ±¥  =DÏš& 5Ñþf¦Ì£ÀeÖ¡øÀ<&¯,$ü¡yæÖŒ@›V‘¸<õÓXK·¡­ðp@ŽS{ÞÜjÎ@\M Öb¶#ÐYÇáEäòf&ñUV9 x1ªs}:]d€)é¨]ˆoË׎õôýmŽ;bø¶#Ü;s3iÀ´ÖTÕ¡QQˆù±fÃsYŸqîŲ×.dGfsš/ÿYå&Ü÷æ ô:’ÂÆuëX»n-+&~ÆoßFåæyéñöÔ<íËÅ…ÎÓaþËLþb>­^mwùßZx†Çéø”ùÛói|ƒÅ–±2³&cüpZTÎKr2ìÑ…güÒÈ^ƒéa¦Ü¯Rƒ'‘·4ÄõÝe$¦ÝMíÚÒW.ã°[CÔsÇ’¼š[uz´®q*™‚iÙ¶ßÿ¸žý–xüK߸ʭ q+ùÁ¹R]‚æ3sôÿðîÞžÑ!T¿íaž:™\N­BÞžõ ÝšTæät©Á­™:g=é–ÒTiÖ˜ÀŸ£•< 8ºbÄý ,Î)o­ËCŸ½Å­•5¹AæÙVÁLŸy€Ãg|ÅwhQç¢ÏÀœdnnËXëjÌJ¯{ßßa£ãŒÍtsiIJÞÚ "¢ó¯áZŸL¤‹Åvú™G1ËG1rì rÍ1tuÍ®@€ÁaÃZlÇÉÙ„[@]š´¯K“ö=qìgÍÌÿ1rÒX†×nÀûÎø.2×§ÇCmXüÖ7|µ¬1OüÕå-ž‘Üiç³ù;ÈoűåË9Vãvâ*ϺHs,}½ƒj¥'w &/ª„„RÕÇÄ_•ðŒ¸…×wXš¸Þ!n¬Yz·˜~Ôw‡âÜlŠHc½˜pÖK}(°Ø› ¸Wò8BŒ73ä¿9üoÂ Æ û“q˜lЖ.÷Üíõ<Ëœ¡²Sx¼\ñs-»–F<<¡ ›;¥0 xVöÔ‡§}Þú˜îöò>~~ 0"—B~Fÿ<3À”¥™5o#qײ‹U˜}”Iû,øÖ¨ÅíVoJœçUv2äÆÉ³*NFC™íàŒLw†ÄtÚµmë—3gÚÏŒ}- ßQÏÑìä::áæå–,²Š`>ñ6ræ‚[M\N+”Ã?¸zÉ´>¹<æX÷ÏH&Ñú ”^ìÏ?d ³ðÐô¬ªÇ´¶•ضl¦¸òüÑ< !…ˆ\Æ¡¹Jp¡=ù6f|µ˜l÷X^»rÀÔ€Ó1æO]CÆO“´ßŶ£ààSþ-„ühÞ¿/‹óãN ËxGÆSߚĜ% IsV€Y¾ŽS\x®4ÀèØŽˆ\N:lr¡ÜêÓiÈó´ Œ¥N%Óí¼ Þ¸·[mž›ü!íoÆ-ÍêQÕ×™‚#»X3!Û q<Ò³nåŸ7ÁÏC½þä©ïö5ÊoÃ'ŠøºE|òõTêEÓ gàŸ¾›ú·ÐÈ}KæfàÚänÂKçrZrW›)¼5↧ÝI“*Ò7-dúü4¢ž¼wCùÝ;$çƒSøìO:ßXß‚TÖÎY@Žÿ­Äž~?jœƒÛѳñ4FŒÊGG»Ò4ÈJÊü˜u(5>ãaŸRM'¹|ŽÍbÓfLçútô0бc ö™›y"Èä±üH]ø×þ‹’YTiíªâ¿3Cv¹ðldž<¡#" 1W~MðûW¬‹+µÞ`DèL&ÿ<%ÓV]ä„Ù¿*¡úð߄ۉ rë_ÿ-Õ;ÇÁš¤."""""W…QˆQˆQˆ………Qˆ¹´œU‚+Ïf³a±X°Z­Øl6D.)7770šµªò/ÞEDäÜ ‡Ãq!/<`QñDDDDDä»\Øë4LDDDDD®* 1"""""¢#"""""¢#"""""¢#""""" 1"""""" 1"""""" 1"""""¢#"""""ri9«WÞ…>©TäB°h?Ä›I70tôS44ÿ³U³gÌåÅGq¸Ý›Œ~$WíHr!¬GY÷ËWL˜“ÄÞŒb¼‚#¹©GfƒÊ#—ÝÂÜÕ»ØÆ#AÎg™ÌÏØÏ+ÛM<Ñ,:l)" 1òïâ gÃW¼øÆlòÃÚÒ©O7ªº¾m)¿÷ëvaøS-ð;ù¥·ƒï¾J¤Ù‹m¨tÞ/5[çoæø­ð9m0V@ÊÂõä—÷×HºÝOUà(&ïÈN–ΚǸ¡‡0Ž|ÛËÆ¾1·iÁòE©ÜÆi1¦ …EI¸ÇÆfþç+gpö¥vD]üƒÝuZR.ðãWÀ–ñ/ñÖEDv¸‹A¡Î¤¯šÎÏ#^à ã^º©’j$—,ÀÌ^¶Ž~[ `ScxºLÉÏH£ÿôd[an!LkHuut"rPwv¡¬{˜õòÞ³„Œâ+¼.¶C,üz6Ç‚{ñÖÑóö¶´Ž¿ƒ¼Ê»ƒb°,ý–Y©ÖSwßÊØÖã›5Çqœç­M•1lŸÇ–œ3–,ÜÍ¢õùø—“,Ì5hÒ&žøøxâo¾•;{ âµ×{PÕ¶©îÃzfð‰æÖH#Ë“j9ýߊö$².ÏLÜÍuq¿¥3xßÀCo ãù.51i¯– É0y›øu^þ·¿ÄKý;qsüÜ=äu5°±öûY*\2;’’J €=‡á37ðÑ¡bì@Af”€C)[èµêøEµ—´5…ÑéVì@ÑñC¼µæ(íÚ"¢s•U΃J>Ò gøW8Èçpð8˜k…pÚHÜH¥f ô¼­ eιyÆÞË} -,3‘ÍùçŽ1îuÛmÜÆ¼-¹§ž¢½‹YWP‡ø(Ÿ ­¢©JC½ 35“³Jeð!êÖ(œ3–“¸¯lŠ)boârÌqÄ×u{.;fŒà¥Gï£GB/îü?¬9vêýжòiÿ¾¼¿&•%_¼Ä}†²ä¸Ü¿ñÙKsoB ½ðìˆlÏuœzM¿¼0/£äï³fÅ„·xz`ozôá‘ç?dê–ãØÊ¶qÿ½ [±‹Äÿ½ÅÓz‘p×^5´"},®GÅÇv²Ïj&¢Yn'?z~„ÇU¬TH.™:õkó€o™_”™aÛ÷Òz2‹Ê1ò¨Â‹Q^Õ^NvoÏÚÀ;­X­E¬Ú¸‰Î‹(ȈˆBÌUÅ@Ó'Þ¦g¬ÙK®pq "ÄDÁ²±Œ™¶†ý§¾Q tx?í«—I7ÆÊÜ4à²g3úçÎ5ö6¸×#>ʉ-ó·’{2ÅXHM\C^h<ѾÛ…ù‡9˜ f·rv:ÞQ·m:ƲÅû8c,i,]…96žºæ¶}û"/_ƒS£=Ú‡6Þ[øaØËŒßRp*`9ŠØýó{ŒÙàBÃv­©V°’Qo|ÅR{âÎ °.ϰqIä™ßì,þ ïOÝGP|?Ôjä IDAT‹&®ILú_o-Ó…ì˜ø?­O—‡ŸåÑNÕÙ?÷s>þã€>×!çª:â}w-»Ã“¶ã(ø…¨@r龆Ìþ¼Ò±áYAæóÅ»Yd9=ÀŒî\Ÿ;=.î­VÍbø:ÜΨß60ÂR•¯;†Ru×f¹2ß¿*AسØ1s"‰É¹gM¿r8qcwI?Ô ÿË]Uƒ/-yš”G3ý›a,þÆ• ð85ºÆMÿŸ½ûŽŽªZû8þ–Þ!@BBB %t*WA(*¢ ØQÑ{õÚ úZQÑ+b Š ô*½—€¡^fæý„$$™’€€¿ÏZ®…$sÎÞÏ~ö>ç9ehK³º¾gæ¨ÞŒ8›‡¾~Ý^à꺕ÄÚ™¿±&³ê_ËZ5mGÛÓ>Ütîdam¸ùÙÖ\wxëW¯fÕêU,›ü?ñaíoçß÷ô&ºÌÁŃ˜~#é3çq¾|žêM@ÅG-ü’ºÓØþ6s¶æ‘ÒÚ—’ýKX~4š~ÉÁçWð‘ìy¼0j^¹¿ô¡ñupC#o*<”ühÜ«9ž/-aáÞÁÄÅH_¾„C^ÍžèCQê vXërM—z§‹ K»Õ㋯װ¯¨;!'7Ù¹ 1^'þÇš@”qÓßû˜€½éÐ,†ºÿÉý§*—ÓMÈM[Ã~0 MØéoPó¨GçN|?{ éE'‹ ²] Í“/¡¾ìvû?~ª¼që dW”  Œxç9. »˜Ïpìî[ÌäñðÓ–Bê÷}„‡ÿ©õSÎI!óp§(~œ¾ŸCåñ}:4¨ö˜ò…LŽ-˜P¼‚á3Ö<°%_\n¥ïOàÑŠ%4 "¢"æ¼á™È5oNæª"kÙ;1ö2—Žç­ ËÈñNfàS£i÷70Ø­—Ø0š-x…'Цwmz_‹=+§Ì[S&ðz\^¹²Ü±È»!׌èÊ‚ç&ñÑ’î­ìõ¿Æôhlã9ÛÈkÕ”#K—r¤Þe´ 5ñ’>Þ-:êrꜼ¹c°øKí@ •J ø5êE²ç‹,^¸‡b¼X¹ø^É·ÐÐJr²(d/ŸÝ{ŸñÑ@ò­e³ŸPßSEˆ)¢£ÿ“ÍÇŸýÄÿ^ø•ÿa!¢I7®2„KýJÝ¡²Qp¼<"ö,ÝJ~á~ŸE¾“`ð óÓä©ÀMÏýmŸø_ÄŒ=Ÿ´ÙïóÊû 9T«ƒŸƕɡú²9'ò2÷rû¯å ˜Wifü¾ž×Ê}kYude0eOAõês™o1 Öb‡91ñ> QsÞ1Zðð²”98d.yŸw',#Ç»Ÿz˜Kêyòwü“E©3ê±?èôÒ[ÜÒÀ£T‘R‡”þ·rÕ‚ûøbÍò¯¬{FáàŸ|#ÃS–ñúGŸ±æöJj6øÑ¨{Ö÷~gÛñ0R&ªgkÂLp Â¢¯Z¶&ÁÅtÅàÛˆ^-¼x~ñBÒº‡°`¯'ÍoJÂÇ` ÀÇ Ñ ;Š–~å¢lô¦–§îªM†Rã`&$y £“P|l[Ö,eö´o™ðô1‚Æ?B»Sm4âåïEÇ8Vhçô?îa%'#¼¢ñ4– T $ªî‰ÇúþQJHÿí5 áÿÍ;·t BÕ‹œ«æÈ^ný)•…Å•üÂÉ—ý©¡B¦àØ~Fü¸µ™Ö-”-KVsÇOÆ\ÑŒ{ÂuJ!"çðÔ\!pw%ßÂO- ˧ƒžþû K­&ÄXŽ0çû•dZË¿ŽïdKø†V|UØLûaCi”?Ÿ¾ÞNAÅå»Ó°x³ÍcáÁHº¤„Sã÷œ >4ìÕüøÓoìölN†>:­ˆ6f{võã∋‹#.¶6¶5?0uþ!lf²#ó^à®{^çl°EÓ¬ÛµÜuÇ%øîfç±²ßÄà›LmR™µ"ãô·‘íaá¢C˜ê'å¡´wä[1hPÿ]÷³2.Î7í¹kùì“Õ„\ýÏW#çNî‘=ÜR¾€ñdüÕÍ|f!óÚÁê}ûÌÌÒÕܱÃGN0º¶#"ç’.›¸Ë«!WŽCLj4µü­‹·! 7ˆã‘/Çq÷¾vôj—Hí 3ù‡w²rÎ<¶Zr絉xU|ßSDwF\÷+÷žÔ«xMéžPÈ›Ÿ|µ®£m-3PÓ_ÇfÀ·a/Zù,aÑo™x¶LÒÉg¹Má¹¾ëTž{ãI^ß{m"í¤o˜ÇsöÒô¾›ñ1T\£ÄÄb>0•w^õ£_çD‚òw³jö\²C.¥EÙï£ÆÕ“kS¦ñÆ{cy-£?mk³cÎWÌ8AŸ»SÊýcŸR‘âãd©sXïE\Áf|»¾l·½ë3 Ok%†œÇØP®€ù _CúúèÛ7ÛôµL8úW!“ËÒÃ…PËýÃþWóSYY+‘i=k²o#£wzðp߿ܫFDTÄ\H,7jCðyÑOêz†7b§óå·¿³hÚ2² x‡Ô&¶ÕMügÐe´¨e†âÊûR·ÏHúÿö(ß§WV_Ò´g†M›‰èØ®:ÇÁªù$Ò³µ/‹”ЬG#N½jð§åÈ—y¢Ö>›õ o)Æ7² Ýïy–:‡TzWÈ3€GïËg”¹|ùþL¬ê6½’n½Ž$o(óýÒÆºŒ~Ëä˜2{"o3×’ÿ;œ++ûB)ãŸø8YîÁCRÀ柿bóùÜEEŒœ51 ›ðƒu#ýáx©ÀäÌ}šcŸ¾Ži×¶%›úVkƒ/kO³F ^#^o Ô˨µQDþ»›_©´¿HÁ«)zLIÎµŠæï?5+ŠEçžú³ý®nÕÞÇ Aƒ˜:uª’OÊ„ß˾áÕÉ1+©;²»VmzTð-dÖücLÞk¦‚~ ·ˆ\DçÁº#""rÁ2E|e?õâÆEID.>z±_DDDDDTĈˆˆˆˆˆ¨ˆAïĈˆœuz¡_DD¤féNŒˆˆˆˆˆ¨ˆQ#"""""¢"FDDDDDTĈˆˆˆˆˆœEúv²ó€Õj¥¨¨ˆââb¬V«"g•——˜¼•‡UÄ¢4ûs•4"""çƒÝn·»óÁýE žˆˆˆˆˆ¸/ÊýÏéq2¹ ¨ˆ1""""""*bDDDDDDTĈˆˆˆˆˆŠ1""""""*bDDDDDDEŒˆˆˆˆˆˆŠ1"""""¢"FDDDDDDEŒˆˆˆˆˆˆŠQ#"""""¢"FDDDDDDEŒˆˆˆˆˆ¨ˆQ#"""""¢"FDDDDDTĈˆˆˆˆˆ¨ˆQ#"""""*bDDDDDDTĈˆˆˆˆˆ¨ˆ1""""""*bDDDDDDTĈˆˆˆˆˆŠ1""""""`³gÊ=Ü;øf>^y{ùÚ2YñÒî½é ¶žíµýWâ± [(ræ…›ùìŽk77óÌþRÌÁy_1sq:%çÍÈ8jÓ9h³S±;Çqp¢M.çH9E»âƒ{¯çÞÁ±<ó0‹þ3ˆ{G¾ÇŸ…Nn =ÿv ÿ·$»’6’ö¿áÜ÷Ø/džÍiå°SžœëùWóy÷÷*›“eûR6v?/ì;‘h¹ì[øŸ¾ø(ÿ½ýZî½y8Ï?ýS¦­ £Ð^­µó¼<†Wkû5wœ,³ÝÒkë9Yg«îGÉžÉüwÈ=ü²¯ä‚œ •ÆÖ‰Ï:Õ÷su,TsîÕí7‚ŽA¹¬žø-» JÿÄNÁÖ¯ù~m!µ¯¾vá¦ó¢½Sõ’ˆ«íSƒ-"}þ×Ì\r>1ŽÚt>¶ùïˆCMçH!»§͆â |øv’ü=ŒkDLBžº—úr®óîüR¶/ecq1õóBË1J²üíûyéÝoÙJb¯Á\}õ%D{îcÙ”yfì$¶·×Lj³?UåîùÜî ïåÂÉ ©æó2y|špÅmX=î'¾šu)£¯¬ƒ  xó'ÎâxÈe »¼ÞyÓxC@k®ÛZÙ$g)GlçaˆjOÛ–qxMo{†¦ «üƒÖ¦²}ÉÕ|^(æÀôWøli>‰×?Ë­W$á{êŒïú®˜Äø×ä%òø}0þ3çIU¹[cÛÍ_¯t<[c¦Øªˆq1}ðkqšýÁçß|ÌÊÎÿ¦m0d-ÿ„™{|i9úZb½ P|ˆµS'ðó‚ ìÏ2Û‚ÎCn§{£€EOÞJÞñ2†?æÎ–>'6m=Ì‚ÇïbfÂsŒ–ˆGù]neÊýÏuËã4]9‘_ÿØA®_-ÞÅU±ùöƒoXóg&æÚí¸üž»éVßCáf>»g,¿ÏƒÝB p7K'}À¬¥Û8æCÓ¾Cið >LÉóÿIÁëÔúˆÕßà§E›È( ºË`n¼¹'‘æÌ~ô¦íx–GnLfÄOÐäd°à÷ÇîáÇÐGxî‘¶øìä.{†ÇßXGpÿ×ø÷µÑ˜)fï÷òòìxî|{4 ­›˜;鿬ØAV¡à´è7œ½ãñ6pâ¶þ½Ï‘;ü¿¤lžÌ¯KÖq ן˜.ƒ2´‡Smªðçct;yÛá»Ï~`Íö -AÔmÛŸknîK¬Ÿ¡Ô±³’Øyžþy¥ûu#~ªêç[ƒ·©LŽ“ïLìGY6öv>ßð c'pãø±„|1’·ößÂ3ÿíN€°å6ó#¾¹Š]‡ ð©ÛšKn¸Þ-C+Œ³-g+s?þóVíà¸G]v»ŽŽ#s4ßåg™‰Æ®äµU]xøµ¡Ô³ü5=fÜ}“xàF´ñçT4\³q}œËGqs©O¥†­(ÕS&ðËâ ¤g{šÔ¾Ã†ÐºŽç‰>9³ßû^ pij´\õß,È Ð+“½ÇËίFÎÌë¿ò®ÃA>?}©¡¼p˜“õ座iþËX~,7W9½j¤MN®E¥çU¶ãQz\›øúÓ´òËuiþºuœr”wVk|E¹‘»‘™?¦áÑj4C¯L·LX,§ eصxþË),ÙSÓÛ¸¾vº9_‚¼2Ùëüz±rŒ 볋ëm•¹[c{év·sòôÊÙ5ÍÁ1ÔÙ\)9²Œo?ùŠå›÷c n@³¾Ã¹æ¯ùàN,Í3ޱâ¹L:>˜'^¸Š¿رg-à­»ß ÷ú·Ó7²]X;Û¹8Ïí{Ùƒ²ËqóùÅ~S)· &ºx ßµž¼ÜÍüòÙjl‡rU‹ ¶LV½õý¸‡Ð®·pÓ×ÑÌsÓžy”ï·äWïC{[?y“•þ½x÷]t ú“eŒæ¿ÏÎÂrÉ­ 5ˆècËøî£ù-âg=È¢—Ç0ya ýGpý€dŠ~y‘IKŽa+w²¾ûë—˜‘ÕœËïÃ>u88w<“~KÇfŠ Ó£/3(Œîäáq£Hð.›„ä0¬®"½ ˆƒëÒ°¶“klY¤m<Œ)®=u=²æ½çùþ;‰—cÈí7ѹAË?y¶•~©¢€´¯^æç# éuûà éS—ƒsÞå“ÙûhS?÷t}ŒìY˘üâG¬¶5¥Ç­w1¨oJ–NäýIëÈ·;;G¹ájüõÓˉ6•^«œêã_õ| É¼Ê Lw½þÍýË:ùìüâ1^ût%ƃ<â&ÚúoâçWçÛÍĹp'3žþß/+¤Á·s퀶˜—þÿ›s¬òyãô|«"‡ÊlГÈöÉøùƒ‡JNÝq:¾vû,MißÐÕÈyo'ÆÄé¸9Û§¿Ö€ –¿þg#æò;:ü*¢3g0éÅÏØ™ow~¿öBöþð2_®ó aÏ«ðDùùåì¼Æ¹9îN_j*/\ÉISx%s°fsÕîÊ<°99¥Çµ["= \›¿î§å£5¾¢ë{—°5χ¦—·8q1å ":_F=ö±f«™î¬nÍ—«¸¤{k¼ÃõÙÕõÖQîzWws‡ƒùèðêd®Ø0wÜ{lëÎÕ#ï GƒV|òoMÛsâ4wbéhžI蚈qï"¶ž:A³“³iZcéØ&£ÍµÓÕyî ïÕ9†Ëù~'æä|®Ý›úÏâ¥ïÆ3¹ÈÂÚ¬®øÏ%„˜Àºïwf¬( î¶q ëŽ hÓ¡1–‡á÷oVqé¿;Pê.ö&n½±þH ØÆª'g|í#\{i&RÙ¿Ûɱ)õ¹¢Óøe³')>ÉõÍ}1­ûðÊÃ__>oC®âŽQý‰0ÉuÉ]}7?o?L1‘x‡Ö"ÐÓ€Ñ'”ðZ!åîYˆhÕïé›I=RB\­#ìÜ–GpãH²v®bAOmilÜ Q7&âSr„ý…uI¹ã†t 9Q¹¶!sÔ³ìMÏÅÞðäU;ä{sÿ=¨e’£)XsÓ¶¦¨o”ƒ6™Îø¹ißTÇcTîÀW|`%©ù‘t¿c—׳]H öffz.6ðv"væŽsÃ¥øªî§GáA‡mòt¥¦²×¼BjäcÄ@áµBñ¢ì"k;¶”Ÿf Ö€W5¨>€ŽÉø>þ3¾ZJï'ºXªxÎß4•¹ûüHyäYnjq¢Xh›R‹wîOj%óÁzÀÉùæ ‡JŸkzÆt&Á{.kÖepiHL¶£lY°S£‰/_¨¹šó† ‡cbq6n.ô  d÷ f¬5<ú)·>q7©E"ì{øæïLl”³ûµr$«£_LŒ—È%·LÞ¥:7¯Ë^;©Ñ¾Ôª‰¼¨Ý¥œ¬|Öd®]š§@±³ëlÙqµÃÛŽòÁXýãTPžyWåf2ÙK.ÄFTþ›F¿êúÃúÝDZô®ëòÚéü<-×ÂÍ;ùv–kë…3ë³çq'ÚSéåaSÍÛKµÛµ µUç¾Å™9äd®[ÝÏÝ··>q—®CkÂóïfÒŒi¤]6Џ<7béÄ<óoÚÃxVlÌ¢S× övÌߌ-îš†šœŸ«VîŽ?ëLßã]=†ëÅœ ìN D]q'—„d°vÉ‚/»ƒKêXNÜæßµ†C4 cJØé[mõhÝ!Ûî5dTë+F „5kpêäÕä‚§!ŒñÁ'÷eÂ;؃ÍZ®B¶rlËFŽ{7§}‚ï©I`®ÕŽÖQgî%¬MkBÿ*#¾û°ÛíNUÝuÛk9À¦9ØrÓØœDó^݉,ÚÁÖôbЬaOqmš6 ÆäÏ¿ÈÐŽ!±R±ƒ 󿲫ÀŽÁ^¾M)§Ûdò%èd›ÜY%Ý#ShÆtæ}ø1óV§q¼ÈLä¥#¹ù¦Ž›œ‰sûu)~NöØÙñ´8ÙGgí]Ánk]Úuª‡åÔN¢huI=l»×p°Lœ‹Éذƒ¢ÀŽ\ÒèôÝSH[º$jd,Î!ïxÚ$yp`ÉF²m`ÏZϲfâ»7.÷XŠ9ïʸ7çç…•¬më8jiL‡F§‡3Gõã¾7Ç10ÞÓµývìB¯JÆÅ…yíÞwÔÊ‹7r²r5•«&Wç©+ël©qumþºœr?U\”¶Ú&Cãd0a2‚µØêÖÚéî|qww´>Ÿ8VwsGå¹_“çWÞ$õ,µžChò¯¦˜³·“–iu/–NÌ3c`sÚ6€´…›É±ƒ=g3˶X‰éÞúÄÜusítmžWÝ÷²w4ÏnNéNÌßÈà@÷~õ™?z\ωõÉFQvxDàa(s•Ã'Ìò³(°U~ríÌ)¹Él,W‰›0;Œ–•‚Ì<ð ǧôïšüñ;óäâëvið'9¾[µ‹œðÕ¤cé™Ô{à—lK=BÇâMd6§Q¸ùÄÕ÷í3˜:e[S÷rÜA½Ø â`À7Ô¯†ž¿toŒLá=6&›o&ÿÄ7¯üÊ7XmԞסc‚ßÉxU;çöëZüœ+|O£S}t¾X´ædQÄ^¦¾Žiœù8Zµôå E9àoé®<ðóÁ°»cit1‡ ¾ÄtnˆáÝìÈîF¦¹ì26fh£€ ¯‚¹>fU‰“q3»:/lÍߤ âØÉua¿ÞU攳óÚÝ9î¨/VŽÔH^Ø(t9'«¹î8‘«&—ç©óëìéqu2«}œªÞ~*Ë%Ïp¼XÏž#ÅVñKUö‚C¤gƒdeïAÖÜ<-=_Ü]ã«^Ÿ}ÏB«»Î¹w¡¶ªùèþùUùÝøæ_¶æ€H|ÙC^‘ÕÍX:1ÏŒÁ$u‰Åþù|Òr;Ÿ:‡Ô’Dµ 95ï\_;]œçUöÝVf{%g9§TÄüÍ7‹Ì'NÄ=̧JZ<ü¼ èÙEvN¿%e%ïHxEãa*x[Çríg­­–/ÈÍ Ï §Jj[.Çr 3Ö‘jì*)QÎZɶ¨mäG^Amÿ(ì±–®ÞLjñ<“n&Òl§óîÓ“(ì:ŒÁ·t¢a=L…›øôî'9D ¶©\,œ£ R2°Ù@†5@IÖv®]ÊâéßòÕóÇðã’=µÓÉýº?Ž NO»*û`pi§&_ÌDsÙ¿GѨü- £7a^pú?0âè 9‡É-áÔKØ‹È9’WÉ"îâXœo»_R¢í±2õ †ù[1$ÞMCµsþÔw†jÆ­ÄÕ>ñô÷„üÌk§ã{<=BßÚø»°_£ÉPé®]š×nå©ã¾xÖH^ñr9'khÝ1ÔÜ&·rÒ¹yf"(¹Q'³bg¦y°&§Q±zk§+Ÿ­²ïe!ó9Y.NèSv|ê'N*‹Vfœ®UŠö°rÉ!LÑÉDxœ˜¤¬äfæŸziµäà 6dœ­v™ Ijˆoþ:–oÏ=uðµZÁÊ}5½/ÁM“ Ì\Ê‚é4n€¿É›¨–u±nμTÑíbñŠö­f-–n{Ó¸ž?& øÐ&öäÚÿþ1*wèØ‚xúÁ×YŸ æÀh/¹–ÁÃ.Á·p7{²Jjp¿ÎǯfÕD˲Dµ"Êx˜´ìêÄÆQ/6Žzõkc_÷3ÂVf–{Ö$¯¬EÌß’s*GmGW±p›½ÇÒÉ( ))ÑE¤ÎœÎü­×½ þ†êç|ÍÇÍùy„áF–o+ßÌyLxèa¦lÌã†ö{öçµã¾ÔL^Xu9'+W3mr}žº;g'ÏÍ~ ­¸¬W¹óßdòï»)°—-`²7Ãĉ› Ñ ºÕ÷8Çívg½p<îg¼þ®cÓÙXïóÙ<{§¦€5ƒµ?­¦(´9 ‚LnÅÒÙyf mEÛºlým6 6ZiÐ+ùÔ±¥:k§óŸ­ºïeŽÊçh Иóˆ©vO.o5IŽeâ‘þ4‹(fÏü¯˜w(‚®#SN$«9‚ØH˜1e<3½.'Úþ'K¿™A¡÷Ùk—güUôj0^ý/–kþE¬×!ÖMŸI^ ƒ‹w9ŒF%û×°qSI ëã[îÞ¯¥v ¼§³2ÓæM#1cÄ?¾9Aùßq€8ºÄŸx¾Ü–@(S™ùñç¦D㑹¥¿,ä0`Y2‡ÍÍúÑØ¯fÚTæç NŒQ¹šÚ/:SúT>ÿ??ztL$ `7›~ŸKnð¥4 ³Ô\n¸?‡q¨ïÚußèc™þ†u¤O—©¼÷ΓLÜwÍjÙÉØ49óö’0êfÊ¿Rá•4nõ–òË+ÃÕ—Ó0à(güÈn_S¥ýu6¦®7>”¤u˜:y&;MÍÚ$°Ê‹ãÕ³êÆÍé«Óqý¸´áï|;î)<®éCbPÛ~þ‚]]¹«YF_÷÷[:ïâƒkn^»Û³OÍä…·9YÙ¬™\u}-rw=[yèî~Ê®ñµÉ˜ú ßì¬Ï€o¤þgΞÄ\;†{çÛdçÂN´hÒ€Plm_ÍŠ•iFôä¶»{jroí¬N|\_/¯Ï&¯êWMÛÿÖó+'úXùoŒHׯ>ùãfo2Óxdj[Ü[§æY¨Lá4é\‡ï&ÃFKK†•:¶TçœÈâÄgè{é¯(3œ£5@wbr.(æ IDATΫ–‡rß« ëÅÁß'òÙûSXWL¿'^ ÒÉïķԥǽ#h¾ƒ_ßy‘Ͼ߈_ÿG¹:é,V1–ºôxôy®N±±þëñ|õãü®~‚ZøãáéJÍèEt¯ÔË™Î'¯ÍžŠ^ìòªOrP—FuOÜo4G4'ƈlCüÉ[§æzývë%ølÿ‰ïÞÿÙ«‹hqÿ›ŒÒ¯m3Y¾»ÐÉG6µ©ÜÏKœ£ò TôîÕ—ºGòóGoñÅW¿“q%·<~3qÞ5˜.ÄÏaŠ]L‘šèc™ã„?‡¿Ì]ë’1÷>ÿs·xÒîÎg¹©cÈ™Ï={ÆrùÏÓ¿';~šÀ_/¡ å>îêSùU £ëcéìUÇí L‰=Htô(ÛcVqsúÒPmºŽy…Á—x³}Úx>yo*Û}z3ôñÛhèg¨Æ~ËæÝÈšš×ÕèKMå…Ë9YŬ¡6¹º¹½Îž­¸÷zî½i,+²ÎÏ ³ýWâ± [(rrœj2F×|=kÖŶ6¸[Q#Rþ´›ôù_3sÉßu¢r1õ±ÝÓ¿fCq>x ‰¾çç¿i0Q/)¸Ú>Zdä¾6ˆˆÈÙ`VD.$6ŠóŠ0Dµ§mË8¼ÏÓVZsÝØÖ'þ'½†MDDDþEŒ-{s'}œ;È*4àÜ€ý†3°w<Þ p3ŸÝû¹ÃÿKÊæÉüºdrý‰é2˜!C{éyr;9[™ûñÿ˜·jÇ=êÒ°Ûut¨ì‘ û1V<7‚IÇóÄ Wn:ù×Y xëî7ȽþmÆôGm+-o%ïŽxÃsgKŸg=Ì‚ÇïbfÂsŒ–ˆÇ‰†’6ó#¾¹Š]‡ ð©ÛšKn¸Þ-C9Ñ ;yÛá»Ï~`Íö -AÔmÛŸknîK¬_%Wã«Ú¦“}5:j—£q0`ö£÷0mÀ³‡Y;u?/ØÀþ,3!±-è<ävº7 8=F÷½@áˆgi¹ê=¾YlfàëOÓÊ/×AΕb=ÀïÝáðÜ#mñ1ØÉ]ö ¿±Žàþ¯ñïk£1SÌÞ/îååÙñÜ9®+ÇŒåàà÷y°ks¿Z1ªlj¥³zÊ~Y¼ôlB“ºÓwØZ×ñÄàʼqe}r3æ.­Y)>ä8œX/ÆÉåØW1·¼Ó+ž7–Cg-ŸÝŠ­ˆˆœ—ÎÏ'=lGYóÞó|ÿ‡Äˇ1äö›èÜ ‡åŸ¼ÀÛ Kýbi_½ÌÏGÒëö‡Ò§.ç¼Ë'³÷c(ÜÉŒ§ÿÃ÷Ë ipÅí\; -æ¥ÿÇÿæ«øÙwC ]1î]ÄÖ£ÖSáœMsøÓKÇ6án› ìùìüâ1^ût%ƃ<â&ÚúoâçWçÛÍùØ{Ö2&¿ø«mMéqë] êÛ„’¥yÒ:òínlÓ™¾:Ñ.‡ã`Š Ó£/3(Œîäáq£HðªÉ(Ï“ÈöÉøùƒ‡þz@ÅÆñµóØgiJû†~gœ´:Œ­£8TÔÇŠn‘Ø0wÜ{lëÎÕ#ï GƒV|òoMÛsâQ'Æ,ùW¹¡‘ ânã¡×¢¹ïQV½õý¸‡Ð®·pÓ×ÑÌsÓžy”ï·”#{!{x™/×yа["= œÛ“La$$‡aýséEE\—†Èذ\;`Ë"mãaLqí©ëî-¢êƨ¢mZ3XþúCLœuŒ˜Ëï`èð«ˆÎœÁ¤?cgùÉãÌöÍMwbîêš`Ët.­—ŽâäF쫜[Æ ægæÙËgwb+""ºã’â#ì/¬KÊ0¤cȉJ«} ™£žeoz.ö†'¯ Ú!ר›ûï@-3MÁš»˜¶õ0E}kcß4•¹ûüHyäYnjqâäµmJ-Þ¹<©îØ€ÓîÄƳbcº†`°ç°cþflq·Ð4Ôä|Û\©ÙŽ-å§™¨5àUF ª c2¾?ÀŒ¯–Òû‰îxXIj~$ÝïÁåõ,@ƒ½™™žK ¼M®oÓQ_ÙF ÃqˆÂ;´žŒ>¡„× Á#ïϚˊʘ˜Î$xÏeͺ .­‰Év”- v`jô ñþg~ªØAl=;‡ò}¬ìªA«û¹ûöÖø€­ Ï¿›I3¦‘vÙ(âòœØOH-‚|Œ!¼V(–}S™±¢€¸ÛÆ1¬g8& M‡ÆX~„ß¿YÅ¥ÿîD€ÝÊ‘¬Œ~i01^lGçð¶£}•¹Äa!¢U¼§o&õH qµŽ°s[Á#ÉÚ¹Šý= ´¥±q/Dݘˆ!Ãý++ÕQ¹K3%»g0c­äÑO1¸õ‰»p-aßÃ?0ç`Ĺ6o^Ÿ\y7<\^³Àzàw's êyjv§Ø(×c_õÜ2\nÞ˜ÎZ>»[Ñ×xÆsÅã/2´cF¬dì`ü¹ì*°c(wÉ,¬M ¡•b&_‚| Øív „Œ ;( ìÈ%N_}7…´¥Kbåe†1°9m@ÚÂÍäØÁž³™e[¬ÄtoM°Éµ¶9«hï v[ëÒ®S=,§Î£huI=l»×p°L¡ DÓ™÷áÇÌ[Æñ"3‘—Žäæ›:žh—ÛtÔWg¶áxÎ~œÁ;ž6IX²‘lسֳl§™øî©è=xG±u%FRÏRm0†Ðä_M1go'-ÓêÆ~ìäíZÃ!Ð1%ìôã<õhÝ!Ûî5d”£Ž]¨ãep:?Êó¨ÛŽXË6íÈÁ–›ÆæŒ š÷êNdѶ¦S|` {ŠkÓ´Qp¥uûYÉÚ¶Ž£–Æthtú1BsT?î{sã=Ëžt;³}WÖ'—bîΚåbT:OÇÉœqmÝ:›ùìÞñ@DDÎ_çé;1vò·Ï`ê”YlMÝËqsõbC*¸åoÀ7Ô¯’&…9àoé^<ðóÁ°»²*&˜¤.±Ø?ŸOZnGâSçZ’È V'¯¸:ݶªûg/õgkNEìeÚèë˜vF)°‚)¼ÃÆdóÍäŸøæ•_ù ¡ºÑóú!tLð+W:·Íªûêä6ÌŽÆÁ˜T3Î_b:7Äðîvdw#aÓ\v3´Q@…woªŽ­¯sqpª]~„ù—ræ€H|ÙC^‘ÕýØ(Ê.ɶq<=BßÚ„YNçÙ‰í»’›®ÅÜÈ—×,×r ªõÒQœüÝšŽÖ­s•ÏîÄVDDÎgçåãdEûV³ÇK·½i\ÏP|h{r]9ÔXmWÖ"æoÉ9u²]ÅÂmUoÇÚŠ¶u ØúÛll´Ò W2ÿºÜ6°’›™âåY äà 6”zeÀÕŠ(ãaÒ²C¨G½Ø8êÕ¯}ÝÌ\x›ÑƱ/ðôƒ¯³>ÌÑ$^r-ƒ‡]‚oánödù/,8Þ¦ã¾:» —9“êæ€1 ))ÑE¤ÎœÎü­×½ ×0Žc[sqÈgóì œê‚5ƒµ?­¦(´9 ‚LnìÇ€OýdÂIeÑÊ N{íaå’C˜¢“‰¨äå÷úd"¸i2™KY° €Æ ð7yÕ².Ö­Ó™—j º],žÕšý5# Iøndù¶Rë@æ<&<ô0S6æ•ùm'¶ïnn:n»;k–û9àjœ<\޽«ëÖÙÌg÷""r~:/ïĘÃe*3?þœÂ”h<27°ô—…,Kæ°¹Y?û9ÞŽwÒ@ºÕ[Ê/¯<W_NÀ£lœñ#»}MUß80…Ó¤s¾›ü --Ö$ðô3âδ­ôWëš#ˆ„SÆ3Óër¢í²ô›–úö&SXGút™Ê{ï<ÉÄ}WЬ–ŒMó˜3o/ £nÆË`Ä3:SúT>ÿ??ztL$ `7›~ŸKnð¥4:})Ù…m:î«ÓÛp¦¨0(Ù¿†›‚Hjà8&.ÇùÌJ”¤u˜:y&;MÍZª_åëx?±5y9‡2}lX_SÕÛÊ×xcü@º6öáÈ?0{“™Æ#ûPÛâ^¼Mµ{ry«iLúp,ô§YD1{æżCt™Be7ŸÜ[KíxOge†'Í›Fbƈ|s‚ò¿ãqt‰÷«æM¹š‘G\?.mø;ߎ{ kú”öŸ¿`W@WîjVöCƒÛ·»¹>9Óv“k–»9àjœŒ¾®ÆÞñÜ‚¢²ó&áìå³ÉÝ㈈œ—LO=õÔSî|0û,~·¾1 žøÀ 6/üå‹×’^AÛÛÇpe½ý¬]°’¼¤^$‡gýÏsÈmv%ê{Ÿ<spþ÷¬µ\BÏŽ‘˜ÍÁÄwh×áu¬ž7›?¶dÔñv·ÚÏŠ´X.é·±â[/¿\VÏÚ@QòPu¯Ë_h;Õ¶°c¬™1ÂÖWÑ>&Œ˜F!Ý4Ÿ…³~gÓ>ÑWÝIçÂÅlòéJ×–¡˜ ž„·ìB¬)•Õsf²pÁ öÔ¦ÝÐÑ ê‰‡Œ‰$Õ.`ÏŠù,_¸u[öCýËtÏWpvb›ŽúêÔ6¬¬s4˜ðòfîÉ<£q‡^ìòJ¬*`J©ås"9ÅÖ3~6oׯG(HNº.>‚¹ûŽ)""¢"FDäï,ú¼, „“½-ƒ"""*bDDDDDDEŒˆˆˆˆˆˆŠ1"""""¢"FDDDDDDEŒˆˆˆˆˆˆŠQ#"""""¢"FDDDDDDEŒˆˆˆˆˆüs˜©Y6öïÛÏØ?ö3ýPé%F"ý¸´Q}žiB¬ùÄïlÙ²›©¦Z<œàç?4R³g.àÒÖ2çéãKÇ:aŒjÍ€ g7V|”k'®c·Ž,H°8ñ9ˆˆ¨ˆìÙ“J»÷s<"’:F“`¶²#ýï,]ÇÏMØpi8µ 66oÙÅsÜûO?¶3¶c-ê›Àf-fgÆ1¾Û¼‹A;³wms >[7Ì5""¢"FDlLZ¼Ÿ½AõYwu}š™Nþ}R·ÔZGÒœ¼Ù*”ªS<ýèŸIË¿bE=o‘Ω[37WE£EDDÊСQDj°ˆ)&5üéo*ýuãêódÓ0bÈçåÉ °ßNAÚ:ǯå§"ÀZÀwKÖÑlâ| ï.¤þÔ¼´¿˜’¿6QœÅ-/d@Z.Sæ­¢Ö‡k˜’Ø‹Y²v3?[ˆñÝy„MÙÀS» )º€ÃèX‹qmý)9°o²í'þÒÕ~Võû¶JÆà"Œ¥ˆˆ¨ˆ©šÉ‹Î¡F²S·sçš#l)²Ÿ^l<sI<#Ã|¸ãÊÖ¼–: Y98‰îæB¦üº‚«óhШŸô¨ÏUæ£<úýJ\ÛÐë‘L¶–\1uµŸîÄåŸK¹8èNŒˆÔ»B›“ɈŸW5 àª&õ±å1}]*7/߯ aA¬jíQúCäXÁìEmKéKýBü-PTL¶N|g° ?ó©…«° ˜<òxô‹yçä]¦ídîßÌ5÷=“a¼³.‹~Ç"R ,yÙdff^ó“Šs;uÊœÂÚwžcü÷[9‘aÆ’yŠ­ß¼Ã”ÖnáY–¼5Ž…›“n†‚Ôì™þ&_ìϽ­:¼`ü,Ö¹@5›¤=+™:|ÏN_ËÁ”|°fszËWŒŸþ+iVÕe‘;Í38Wò9ºã ùXÉ>ºÓ@¹Ú®yöøÖÚõkDIkÐM×iãBpëû©ízqz»jQ´oQ k:[§ç…—³ãx ¹¶& ÒO³ÃŒò+’ÌEöB¿Mƒ/6Ÿ%+ß ˜` €åÀ:f]*µ'~a_.àAT5…˜R³ÿGÖ¤®ÍñÑ<æÎý”Ñ÷zVü|˜¬"ÓªÄò¿_0wê ´öÌûøê‹mdZ­¤oË7G¬àÃËÓ>dÒñnêÈ`ÓœÅÕÀK)É?ü}{ö¤g¡Ÿáó‹ë}{u*ïèw|öKàLƒ'ßeμO™0 >η°¦È'x{ö<æ~0”Æ.çøõ×SäßFö½ÿe¦}6‹·z]ìI±ØíMf6Wð½XÛ÷nátžê²ÈfAe#$ï<ÈK§v$bÆ›Ðjn×\ÈÝj»¾Q(i ºé: ®Ô¸ÿQ¢Ê^ d‘Ó¹MUìN¯dö²dÀDoóéܹ|1u8ÍÝœ-|öÕþB=L¹O á¡>Oó\߯TŠˆ! wæœÝºƒTÀ>,š '7ÿtÉp2‡ð§™6ی՜Mê魬ݸŸK¹”üÍX® ùŽ4êÚŽPw[ ÿSƒå“v“½ûŽç…aM¸t›2ùí›OÙXÒm°rÏþÆÎs]¨â®_´ˆüUò8qËuÊ̹m›IxˆÇ¢Êã`„ Q]¸oá/|yº$ëõàžGšSÙÙεi^ņ Û-äeäa¹å:ìGÓ–axÚ›p Å“}œ¥*m¢ªâlo ¸vL?$‘oÎÇ\Òïë¯Ae"%ep¬DDl?±…ÄÌNíMS]ÂýLürÛ×W7ªfRJXƒnm…nîü…cîQtm[GàÝ€NWdÍ'ÇHÛµ¤‚*\\Ôyr=º^|œÀbOLuØw í¿ž$?ÄÝ¿žì‹ º:$Nbîhc´\`óçï2cÉ~Ò/š¦ëŸˆ+z_~0Ö€£9ÜØÍ…Œ³d˜-R2/þSòÏü¸¨è¼$e˜A!FDî0ßGÞfb×ÊÜü…¦²n¹N™ÉL¹xÏÔàQ˕ڶ <€…Nv—ïÑÚ`´5ü:l‹ƒÉp¹ ÿþ³Ûù¾z2Fä®Ö< vƒÄÃìL<̉“@¹*8œúíúF5¢ä5èÖÖyµNä¤^êr/uùq (ƒ‘c˜³RȺfD™;å}®– ›2ÔŽ©’œ°…3•cÓQÀ6”è”abJ…”õS˜´d?f§bûÅU»2y?<Çðbo/f”VpiS­ä_H&ÀÁ ¸8™86~•iÃÃ)vd¶~Ñ"òW1`ËuÊ'‹SY/œ ­\lóN¥ýu¸¾¯ˆÜ;ÊFT¸|;[6n$=ÊÔÂÝöT)µë’Ö Û]§ —Æ{]8Aj\ìœ5“vêüÅgw=p´¹¶¶Ø\óÿF<#£©ÂAŸØÄoÛʲ¿Œá1ÔpU„ù7(½gb̹äääùÉÃl- åÀÉ‹h@#Z5©ˆ[{½ƒ=ßn ©¬¹‰¬øz€mµº”³·' v%l€ì]kÙ—a¬ä&®`úøq¼=y‡rõK‘¿ÒíÔ)[¼ÂÂð8ñs×&ÏšÇéuóøþ䨦[­Ã¥ý}Eäf7œ*EP8òÓZÎa¤b˜‘?4y'ÛuIkЭ¯Ób¶\«Õ»8TìÂ*>_v„+$obÞÂc¸ÕŒÀ÷&=:F¯:DW8È7ó!‚£CqW†ùW(µž˜ìcé»±è§ÕxrÚjW-‹‘Ì>d@—YØZr)¸rtçQô}Ù “Øç <ÍçHÉàÁ.õp7 ~îõý?'­dTÿ­xš9{:•| àÁ‡(käè-"ÝŇÇmÔ)ûjóŸZ«˜º- “³aÒ-ýen±ßñï+"·Öj½Bv…ãé刨äˆ!£ôÚuÉjP ×i°ÃÅÝÈ#iñ»¼mèÏÓÿiI–?1fE2»f=K·Ïì ?ïâ|‘t}4èš7¯Ÿb¼©U‘#ýL.‚‰ w×P² ›¿b•^Í1ä¾`<Œ€CBj]!}p9Ïnfþ´ív?an9œÏ5áYµ ÝGá±À‹ã" N5èõæëôŽ ÂÏî<'O§cçJ«>£Ý#äâƒb""eŒ¹:eô¥å o2¨u(e } ½}BîDQ»Õ:ü'|_¹1»rÔ®|é²Í-ˆà2ÆÒm×%ªA%]§5:v"ÒÛr“°í yW"ŸÏýZZÞ»ü<Œ.~Toòÿ÷Þ ´ô-ÉssF|êE]}ø¿z4á6:Vþ-çV«ÕjÕn‘»NÁq {†y'¡jß{¯¯^ò/¡¸*""""w%kÎYN¦T¦y¤—Ì¿ˆ­vˆˆˆˆÜ]rÙûÉ›|¸zÇ2Àú}abDDDDDþ¶,dßͱ àR¥%}6ÅKã‹þUôLŒˆˆˆˆˆÜU”YEDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDD¤tÙþÑüüóÏÚ‹"""""rË4hp[ó©'FDDDDDî*«ÕjÕn‘»…zbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDäb HÙ¹˜)#Ÿ¦o×XbcãñÁ/1ñ›Í$åY/N’ŸÈüÁ±Ävz‰Å§Í¿[BÎö tÊ¢ÓfÈ?Êçc‰íÌצb-fY['Ð#6–ØÙ™Ë®I=‰½ö§c¾8‰Å{ÓùýZ­œ_=’N±ý™y ¯¸µ°e|wb{¾Ë¶ì;¿×,)+x!6–ÞSö«cTDîrªi""r§Ù–Þ¢­¤oÁ‹£–‘U=š‡ºw ¬}6§÷¬ç§Ïưùðp&<Ó˜2WÎrûølF< _ŒÂë¦ÑÊÌ5½wCáϳ9¸z YÅÍbJ‡ž1”5Ö2Ïîgýâ•Ìyã¤×hëk,4±ˆÖ„'²qÍ1ºU¯ŽÝ5«9ÈšmÙ8ÕŽ¡ºãßs[ªÖÄ3ÀI]e"r×SM‘»'Ęϰzö2ÎtæQ©hºôyLb‚_çé>eq‡zt-wé$çáyóL>Iˆä™únn°h“¯7Ö½+Ù•Þ„Æn…¦Ì9Ìš-Y¸8r!µÈLލC ýåZÓ¶‘Æ/`áÒDZt«Œ©ðI×=œÖ¡F&l\˱nÕ©^(Åä‰gs¦#‘-q*¾[]žUWG§ˆü3BŒjšˆˆÜ5!¦ Sià‚Oát€¯†±t:¸§Bkw©ÝN)“™1m.­kö'Ìéú1Æ)0šª›¿cå® 5r½xr®esv5be°0þæ›hò¯EˆëÖ;O׆ ÃöÄ'v¥zµË)&—£ñ ¤;Fè– ö-žÁ¬cÿ™\*Ôå¾nÓ¡®×Å›»›÷ŸKö Ñ4ùu*3ãmé3ù¿Dœ^ÂìYß²a_29&ª4jOßÇ ØÅpqž'Fr¼Ç‡Œmá‰!?‰Mó¦3oõŽ¥ÚâSµ6m{öã¡P7Œ—×1` éþG³]sùzÝ6Že¸R=ê1÷iAy{è"w†•Œ}?ݸíÞ¬-æîeê Qœüêþ2‹¯7$Ý5&Ò½êN>þà+6JÁ6 !‡æ*Ž˜/`ès <øÊ}œøæ[â·'’ïD£öýèÓº2ކ’lz*k_{‚‰cÒÛSÖxùãµü÷‰‰¤w}Ÿqíü1ª¦‰üm¼ß»›ÚÈu”^Ͼ5*™ÈÞ0i‹8‘m¹šœkо_oÚ”/ŒÞ4ïÛ•ê–1õëƒ77mp "&̆]q»É¸ò`LÇâȬC¸Gɾ–5+‰SàèîPÌŽ0àÖŠpÓ96¬MäÊ“1yÇYÿk*޵ctÌfϧ/òÒ¬lêÄ2pPw¢Üv1ì+ÌÚ•}õ™k.‡¿~‹i[í¨Õ²å²fʨ¬·„Ñ®ß@oW“üõ³;s™Eô±¤°n³Œ[˜ˆ_L/žØ™úöÛ˜3r³wZ9ì›ûó“ƒyxÀs z¨<'V|À»KNê(¹S&uS ÚîõÛâ•çï¬9l›ùëÜZÑç™´ö8LÜÃôê2ì¢{3|H,ÕÏobÖ‡kH¾_|ŠrßfdçKËhÛ Cùâótø_ ž\\_҅ƼñÎcTw0»{2»²ýyhàtªhšîéÈ—§2ɶ€s¡m(8¹’y?çòÄxžm탈º'»gžç»ù¿Ñaä=x\¼!ݦ £‡v œ-Y‘ìß2gÏYh #]äÈ;•pó¶{ƒ¶˜×.ÇKÓØTíΰžq7@„û>â_Z†w—çé¯/Fêá{"žaKq®€KÏšÉ Âÿži‚‡ˆiDù1ƒxï›ï9ܲo¡¡²×-Êx„Çh˜ÂÚhã‰ÁšÁîU»1WëE=o#Õ4‘¿Ùµ‘ë)Õg,Þõé9z:s¦Œå…þSË5™Ms'3Ꙟ |{ Çr‹Þ¢³£R»Üï}„yÆ‘d¾þÉØ%$†PëNâöfaòOnàçó‰Ž(Sü—J_ÍØAýèׯýúàé㘿Í@hç¡t©áXü38B[ÕÂ>yñÇóNÿ¼$‡Z´r"/ñWšËÓ¬ÂÕd  It,G·p¢Ð‹Íü›6£’ÃŵØz`sš¦~Ìâ„#œÏ³¥|Û<Ó« ÞÆk7!óÈNRVõ½¹òOvhz/æ#[8]x ëá{9–ñr6`µZu”‹Ü©»>%l»7o‹ükUÃåRá1:yâhð&4¨Ì¥vnÄÉÓ ƒÅ\¨gÂŽZ÷Ö¾`l<©÷`$öçw±7Õ\²‚ïQ‹èê°ÍnÒ¬`ÍØMÜ.3­êâm„\Õ4‘¿µ‘뜓Kïî™ü 6¶&|©ß&úm:aÍ>AÂ3é‹éL¨Z“qÉ ŽÁt|"еc>aƆz<í~廄Ò"ÔÂä¸}dÕ ãÜÆœ«p/‘^Fò‹›Þ±6=ÝG¹K;“+þ•ªPÖÝtƒ—p©ÑŠû7XŸH—J$¬?…CD/‚  ã¹gÎÓ™ó»YÝÉ6_Þܼœ¯œ°¾-þr:Ïùž™c—2¾5£y¸kWZ¹ arÒrÀΗ2ö…·Òˆ‹ d_ Ûr9Špñv)Í×͉ü땬햬-M6EjÓf2¸âç~í¶n¾¸p˜Ôl `,AŠ)CDt,³×°/³ ¡ûâØYÄãu=±Áªš&ò·£v ò§‡˜¼3èÅ_¸çÍIôªfW(¤”£^ûÞ<¼vŸoI$û¡ò¿k°®Ýè[ofÌaK?ËuÚµ 5bB0O]ɾ4o¬?K@Ë‹wO7½½5"ë–`ÈE‘Õ8× Um^_Ï‘OÖ·§V÷œ rœœ1Q‘Ø‘ƒˆt)…lñs€ËƒÕmŒ†B,¶xF<Êðˆä§&²gËF–/úšé¯¥â1åy^ÙF\ /•Ô\+WŸÞ5“‘œ±·¹f׉H)—̵ÝÒh‹ÖLÎ¥_ÛãbÎH&ÜìKÚ©nÄ«v4•>šËÚÉØÆíÀÜ—Úe.Îo«š&òwÌ1"RŒRNfò«I%Ó9â&Rd¤ƒ%í{’ÁÙÇbŸz±)C£>=¨‘½†i ö“sVíCpþ6–¯[MüšÕó)ɽÈ[,N·ŠÄ19žï¾_Á1ûZ´vÂØ•«CE›³ìO÷¤rÕªT­Z•ªUÊbÙò-_®IÂRìÞµpnõX>5_ÒÁäQ‘ðèN ìß×ÜcJ½ö]ç*”åË~M¾úPp^"ñë’0VŽ ÀN±ÈŸåVÚî—ö•…^fbIá×ï#Ç=˜ Ï’W>£w¢*ä°mÙr~Ún¦FÛˆ+CÔTÓDDänQj=1·:tëP•ççgð‰†´jDY[²Ï"!n5{ ‘<Ù)‡âûM0úÆðDç¥<óÙ Bñëp#&0—÷f/¿Î4ð³îô…„çàVÔqÚÀº)Ø×Œç‹g|£Oþõ%c&¾Ê„ãRßßÊé«ù.î8aCzRü[¢mp«TÛS_2ùmÚ5 Â#û¿-_Eºgkj_û>jlZÒ©Þ"&NÉ;Éíià—ÏÁ¸ù,>ãËýƒëùcŸ"Ršn¥í–†ÌuãxÕ˽59ûë"¾Þl&¨g;ªßJ³Ñ‡ºÍË1{ÎW$˜"î~åF¯jšˆˆüëC ØS9v«üÀ¼¯W²nÑ&.äÚàèY–*uºórì½Ôö³¥øXL”¿íWŒ`áéëå wÂZbصß& ñ+­oãD˺ά[[@x‹8_>É\‰ðÿç79ËfóÞ¹|œýkóÔhº4õ¼n¯©RF Éfú«˜÷áÌ&Wʇ=ÄÐÞ q„kÞ/mãI³áocš;/–ÏbRª晴tû__ºÞ D¤TÜRÛ½ãw†üh÷|'ò¿[À§«Ocñ$ªß³ômp‹…܈o½fÌ™Kr­Ö„¹ª"ªi""r—0XõŠ ‘¿µ‚ã :tMÆ¿K—Š&íù׳Ñ.‘»‰ÞÚ'"r—ËÚú>/OÙAö&ráñQC¨ïª[""¢#""1§ˆÁL˜ªý ""ÿz&FDDDDDî*z&FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDänfûG““£½("""""·ÌÁÁá¶æSOŒˆˆˆˆˆÜUJÜcø`U±ŸŸè­½("""""·,à6çSOŒˆˆˆˆˆÜUbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDD!FDDDDDD!FDDDDDbDDDDDDbDDDDDDbDDDDDD!FDDDDDäÏc[º‹/àÂî¥,þò'v:IZ®®~• ŽéÈ÷ÖÆËÎù‰üøüP~<Ä£ãGåg¼f ¹;'ðcŽqï„·iáyœïŸÎÒ³F}Èà{<0YcÎö Œ»Ž§f<ýþª;är`JÞ[›yí„'¼ªÕ'º[/š¹b¼ÞW°dplÕ|/YϾÄT l]ñªT‹Æ±]‰©å‹ÉðÏ<0,çWðΠ)œ‹Íkýªq~õ7l15§eÿÒ>hDDTËDDä¯ 1V2·Ï`üØeäT‹&æ±øØe“¼o=k¿î#ÃyipcÜ®œiöñݬx"ž‹Âã¦ýCf®ÞIF“{p½&DdslírŠ›Å>”6]cð1Ö²’÷³yÉJ¾uã;¯ÑÔ§˜cN&aÊf¯¿€Wx4Ñ÷TÆÍ|–ƒ–òý››Iü.½šx^?ÝÅ F*„â^Ö ò8½fKœ‚ˆÒ‰_DTËDDäbÌgøeÎ2RËvæÅ‘)kºôyT¾ÎèiŸ²úáz<péDãîyëLnޤg]7nÔÁaëãuÿJ¦7¡¶[¡)só˶,\Ë:’~¡ÈLoC%ûË´¦Y/ÆŽXÀòå‰4êR¹ÈÎ0s~íd>[ŸKhÏ·éݦö—Vý`Ö¼1œ/g|ÌÞˆa„:ÿóºc nué<²î¥ÿËTKÕ2ù„˜‚t’ÒÀ¡FeL…ÿÁˆGýXî;¼ÇBkwŠèÆ})“ùrÆ\î©ÑŸ@§ëÇêÑTØú÷dÑÀõJàÉ;¶–ÝÙÕhØ ƒåëKðåýjQÕu¿&ž§€"!&ÿ¾ÝŽ%øI:·¾`0Рck6¼¿›½'ó ´‡ü$¶~9×îàä[<«Ô¦i×~ÄÔp»ØS“»—/žÅ…^¯–0‹¥¿$Ó%ÈGòp•|=í+¶NÁ¶lCî{j0Ñ•1ÜΊ5ï4›¿˜ÎOëwp:ݯèÓ•ºåì/ÖÒj-ëüµ~Y¨–…жÉ–ìV-“¿§£÷cüo:>E®§ôì·ó¡ZE9›¦3ÿ‡Îd[®Þs®A«Þ½¹§\¡tcô¦~ï®TL[ÆÜo’w£;kNA4 µáÀêÝdY/šÇ©õ dUŽ!Ƚd_ËšÄÙ ppwøÝް\ØÍŽ3P!*²Øám!}xáýq<h–~›ô,3¾KÄ+ªÝûw&Ü~‹F`ážl®l¢5‡½³ß#ÁµHÃlš6œÿ^†©yoú Š¥bê&¾™±†óæ?0O‰äpdþ[üx.˜Výž£ëýå9÷³—ŸÄrÍâÅ=#Þ"¶*ØÔx’çÆ?Eý¦8Ÿû…I—÷i[WsÂF£`µ*ùçF˜ ›˜ûÆ 6[ÂhÑ{ ±Ô¤`ã,>üdÙÖ[h[·Ó®óóÃ[SÙíÜûûô¦yåólšùS—ž¦ÄMßœÌÏžeÖ²T*Ýן}¦bÊb>yc‡²­ÿìZfô)RˆÑ,ZµLþ¾üéø¹‘Òë‰1xÙÇÞŸJÜgcùõ3{¼ƒ# ­]—°z *çü»à`,Û†.í—óæ×SYÝ|,­Ë™®³lgªDÕÄ0y%‡2ëîb€¼DÒh{Ú¿ŸÇ’CÆ…ó¤ÙV39)I˜÷‡¬ž4m^™¢k*H=F.„ø9s³›œæS+YükUOŸ–>úC1=÷<+¿úÖ/ÝsåÙ›*ÝéÝ­1®qÛÇo¯.£L§çéÔÚ#õð<Ï+‘Zž`ž›_A¦Mžyª~¶@DEr¶ dÑÞ³ä=€ÃÕß Ž^~¸Û°qòÂÇÏצ:®b˶dZ—óÇh9Ïžµ1ÖFuWƒZ•ücåŸJà@¶?1ýŸà¾ & AeYr:“ 8ÞBÛº•ví~±Ò:„§7ÁÍD5ÂïÍA|úí÷î[h¨ìõ[Ìâ­"†ÿ—Çê^ìÅ®'žû–5‡ð°„{ IDAT£²‡j™j™ü]ØWÒñ)r#¥úŠe¯ú<òêtƽ7–~}&Ø%™­ó'óÁs=yíÝ%œÊµ™ÃŽ€åu„Å3â8wÝ»qœ‚b¨fÝɦýYX‚SØžZ‘†µÊ:ÒWóá3ýxe`?^4€Ñÿ7Žw¨;”C?¹ Œ7ÝCV²Žn!‰j4©ç}õ!» Ômì‹åØ’ó®n·wx5.”3:yboð¦Zõ2—æ3âXÆ ƒÅ|õŽçmÍS2Þõëáu9Æñp6`µ–`)ŽÕ©bÇ© ;I·€õÂv6²¥zL(Ϊ«òfô Ä׿4«?ú˜Õ›–g‹ëôìÞ„2Æ[i[·Ó®ínS›+Úx~$v©»8t¡$]f.ìÛÆyS(k\†kÐŽ!ïçÑêvªeªeòw¢ãSä†J¯'Æj¦ À‚ÁÖ„½w á­ oÕ‰NÙ'ØùÓÇ|º`:³ªÔäùû‹ÄÇ`îíůo~—›êÑÃý:Ëw ¥Qˆ…ÏWï#§v©?oä|ù{©ái¤ ØbP›öO܇ߥ.ƒÉïŠUðq3zŒ®~8“ÁÙs9X±ÿý4ù§ùmñÒ*E–žv¾¸ÙžÊˆ“· d_ Çr5.mmŠ,ˈíM~ ·3OÑ e-&:{¹ÜÞ›Õ ÎTjŒáƒµL&p×*ŽÚ„Ò£†ª«ò1>-èóB:_Íýž¯Æ-å+LxÕˆ¦åºÒ$ÐåR3/YÛºåvmpÅËͶHòʼnäg[à¦k´s> œCp.¼ƒ®Þ¾€™sªeªeò÷¡ãSä†J­'&ÿàÇü·ç`Î+RÊöPoZÀ©m‰äX‹9!…w£cØ9{»Ó-×iÜ.T‹ Á¼c%‡ÓO³uãYüî©‹çõÎdv~T‹¨KÍÈ‹?¡aAø^'À½Â¨ænåÈš¤sC¯àÄrÍ›Ï/g ˜\ /•ô¼ÂšÉ:—nØýÕRÔ’Ejf1_â¶« —fT´î'áÀ¬Ù‹!¨ÕÔ½-ÿ‚û>îáÒçõ™¼3åx„JqÌ}2ÛÓ¬w mÝèú=“ÔŒk{\Ì™Éd》}IŠŒ ö®öBVáÅXóH;uŒ³iÕ2Õ2ù{¥Ÿ"Eˆ±õ­I9Ó96~—@Ñ‘–ôC:ŽÞîØ×mÊP»gªe¯aÞ×ûɽ^ã®C•ümlذš„$êÖñ¹s_Ⱦ Qm*R°m:óãŽsí9=™Í ~"…ê4ˆðÄ¥r>`]BòÕlóIØ„±b¾vjÍÀ™Ì”ì+µœù•ÉwøÀq £^Å<,ù5{¡jLMTWåŸ.uíX^6íé`ë^‘ æx¬Osœs‘x¡ ”מÃÞU…^fbIaÇâßÈu ¦r™’ôCq Á5w'?ïËàêbV3ýÙçøbgNªeªeò÷ºHÓñ)rý¬Qjç·:´{¸*ã¾ÏÿN6¤Iý |ÜmÉI>ÄÎÕ«9lˆ¤Ë£AØsªø†ëCçØ¥¼þÅ ÂuÖFÃê¹|:g!øv¦–¯-p§.$L”}àÙõ"ß|4”±›¢‰­Œ;)$þ¼”_çR4ò1b´¶ä¾:‹øä£‘Ì:מpß|×Ìgu’/Qêý¹ÇÖ—*þ°ø‹),q¸ŠÖÃlüj1¹Ž°Ú(8¹…»< ®Œ³Ñ‹ÆåørîÃéQÓ]ÝÛòçR± ÆÓ_òÙ».´h„[Î1v­\Ef™ÖÔð6•úú³7Œã=S,Íj8sþ·E,Ýj¦r·v%z¨À®j;Z¯äëñÿÅ®ãýyd°ïÇÏ9êÅÀp7lTËTËäoEǧÈõëyé-ÚžrŒâåg£–ÃQ~ûáS¾üx6Ëã`Œì΀7ž¥‘¯í C„Û´ò»QRr'(:ƒ¼5ÄûNG2»ŠÄü‚m9´û¿±´/ÉTžO?A}Ÿƒ,üsîÄ¥ý ù#g~*¶jA…Œ˜=a‰yF†SyªiÝ)%æ xýùUD¾ñ.V0i‡¨–‰ŽO‘Œ€Ûªl£]'·YVIß±’#†`…y¨¨Šˆj™ˆŽO‘?­vÜ*KÚ~]û3 ‹¶c¬5œî*«"¥œíï3aÚrn4‘C±#‡®§‚UËDǧˆBŒüY3°îËEœômI×> ô¦‘¿˜Cø`^œ¤ý Z&:>Eþ=ôLŒˆˆˆˆˆü%ôLŒˆˆˆˆˆü+(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆÈŸÁö.ÀÓ’£½("""""·Áá¶æROŒˆˆˆˆˆÜU V«ÕªÝ """""w õĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆH±lKwñ¤ì\ʼy?‘pð$©¹v¸ûW¦VËŽty 6¾vÈOdþСÌO ¢Ï{£¸ßßxÍr¶O ßkÇèøþÛ´ó:ÎçC†óu’‘°!òj3 EÖ˜µuF­#Ë©¯MBM‡\vMêÏÈÕ™×Nhp·z}ìÕ‹¶Á®Kðm,™X6k&ßnÚOR–e*צm×Þ´ô¾ùŽÌ?ziÛ!èÉ©Œné}‹ 2Ÿqß°ÁÔœ‡›úcÊÝÍûOŒäxÛÂówûADäŽÖ°;N5MDDn_)öÄXIß:ƒ_Éú¼ ÚtÌAݹ·¦‘mŸáù÷7rÞRøìºÏfÄsÎR’e›Ù·“4kÑϳ9¸z YÅÍbJ‡þƒ4hƒ>A¯ØFxœ\ÍÌ‘o²<É\‚³ ë'¾ÊôøÂÚ?ÁS;ÓÀ~_ŒËÂcù7?]Ÿˆ'>éâï_±•Ë­îÏ<ŽÇ-à«u§)Ðq+"·œ`þX »óTÓDDäö•ÞÍ7óVÏ^ƹ€Î¼3ª#M—>iCLðë<ýÁ§,îP®å.~lððƼy&Ÿ$DòL}·Þ…3ùzcÝ»’]éMhìVhʜìْ…{€#R‹ÌäXúQ1Ú_þ 5my1lø.M¤E·Ê˜nôu’âùú·žÁ€(Ol€æõüH0Žå«y¸GÕÌŸÏñøx’ëÓëÞSÌZ¸‚­)1´ôÖh>ùsü±&""ò÷RzWÑéœJÇÊ!ø\sf4âÕ0–NmëãS(B¹ÔîFÏZy¬›6—YÖ.Ú)0špãVîÊ ð”¹Gײ9»1aî%ÚD“-B\áü±ã¬ùogb‡~Ë©B2ÖÔµ¼Ú9–a‹N“ŸkÁ·F#š»_Ùioü] ?;Ÿv¬ä'²6þ,Îuï%*&šòÖý¬Øšruž¬FuîÌè„B}Hæ³üôlGúNÛG®ù Ÿéɸ]VòM÷N£¸2i~ëg¼Êàž‰íü8/|°‚ã¹:°EJ‡•Œ}?2ù¥t‹%¶K_ž›ø={3.U¢Üݼ߻c7"þã1 ëÛ™ØÿôeÄ”•WÛeî^¦öíÆØ {XúÞtíH×/1yåqÒŽ,aâóýéK÷§Çñýál¬@Áñ<ÕeKv®fæèaôéÜ‘î_fòÒ#d[k*koRÃòþH +Â’¾‹E_ ×Xbc;Òµÿ&->@¦õÔ´LÕ4‘ÂöÔØŸp(¿ð͈y.¶ c6¥k‰BL©-Ù·•Ldo˜Î´E œÈ¾zŠ48× }¿Þ´)_(ݽiÞ·+Õ/,cê×¹Ñ9ËàDL˜ »âv“q%Åäq,>Ì*1„{”ìkY³’8•ŽîžÔŒ Â&qÛRÌW.VÒvƱ×\…V }p¨Ôž£†ÒÒ߈՜KfÊq¶þ´€5)îÔi\»¬'/q ë“]©ß:Wß4/o½µ!eF_Z¿òWcÍ'yë½A„9^ÜÆƒsßd^j-:=õƒ*lj•S˜¸ô´Žl‘Òˆ0©›˜2jë-a´ë7ÇÛÕ$ý,ÆÎÜvõžöÍ}‹ùÉÁ<<à9=Tž+>àÝ%'¹’/¬9l›ùëÜZÑç™´ö8LÜÃôê2ì¢{3|H,ÕÏobÖ‡kH¾G¿ûCHþv ã—æº›šwŒ5Rp¯×k99¸E4Â}×)»Mþ ëâ{9ŠÚ8ãílÀjµêÈ)»>^؜懩³8áçól)ßvÏôjrMðoXïj»4:ãõ»viÀ¿V5\.]‡ÔoHý6°fŸ ᇙôÅt&T­É¸‡ŠÄÇ`:>ÅÚ1Ÿ0cC=ž¾Þã-.¡´µ09nYuÂ8·q#ç*ÜK¤—‘bß³ãX›ƒî£Ü¥ÎƒÉÿJU(ënºx×ÐP†ˆè*Xf¯a_fB÷ű³ ˆÇëz Eì}*ìS™àðÜN`ü¢UœˆùÏÕ—’{tRàŠ×è»âÚ;³b+)1-ñ.~–àzÀ€‹—s‰^-"wàÆŒo †¿œÎÇs¾gæØ¥ÌÄ„oÍhîÚ•ÖA.—j…o—›W£É¦H…Óf2¸âç~í¶n¾¸p˜Ôl Ø”N +®6eî[ÌÌ9ËØ¶ÿ8çm}©ZͳõJ5Mä–œ lŒÍ{kÙMØÎU° åéP7½‚\¤4CLÞôâ/Üóæ$zU³+RÊQ¯}o^;„Ï·$’ý`ùßÄ\#ºÑ·Þ&&̘Ö~×é«0¸P#&óÔ•ìKóæÀú³´¼xÇñTqÓÛûQ#²n¡·“ýî’¯ÚÑTúh.k$c·sp_j—±Ì$­x“Q?ú3hLBì¯||\áày²ŠÝÌ\Ž®ÚÈy‡Hú „ÊWÖ]ÀÙUï3iå¥!eNÅÌjÉâ\f î>ª’‰ü©%Ó3âQ†Gt ?5‘=[6²|Ñ×L-)ÏÓоÛ¥5“sé×ö—˜3’ÉÄ7{›Rªa¿g>ý£^ù„œ˜> ì{á]±ÍÝŤþ¯râF3ª¦‰ÜjŠÁ­F3ªYg¿ÿ †U{1„ &ÔMDJq8™É¯&•Lçˆ[˜@J‘q –´CìIgwLŵE›24êÓƒÙk˜¶`?9×kÜ¡1çocùºÕÄŸñ§Y=Ÿ?tÏè]‡¨ 9l[¶œŸ¶›©Ñ6âÒÐ #®Þö¤ÙÄú£…\-HfçÎð©ŠWqq0÷q›RqŒ¼Ÿ¨ÈPBC/ÿÔ¢qÛ&x]RffÒS²¯ /Ë?ý+¿žÕ*òwrnõX>5_ÒÁäQ‘ðèN ìß×ÜcJ-í¿v’ö•…^fbIá×ï#Ç=˜ OcéÔ°âÊÚñͲTáÁNmˆ¬èŠ-wf Õ4‘;s‘æF³Jyìüñ~Ü !-kâ® #”bOŒÁ­Ý:Tåùyã|¢!­QÖÖ쳇Hˆ[Í^C$Ov ¡ø~Œ¾1<Ñy)Ï|v¨Pü:ÜÈ Ìå½Ù Á¯3 üláüÙ4£u›—cöœ¯H0E2<ÜýÊMAÇÐX*?œù¯ÁÚ!Š@×lެ_Ä¢£ž´}­i‘1ç—Nö‡ãø9ÕžZÑAíl±+ß„zß³dÅVRš\æÍ™Â—÷QÍz˜•ó“ãX¤˜ äŸØBÂ"ªêàù³¹Uª‚í©/™ü¶ íšá‘}Œß–¯"ݳ5µ}Jÿ¯¬d®Ç«¦Xî­éÌÙ_ñõf3A=ÛQݾtjX±7¨|ñãK¾üè3rTÄîÜâ~ˆç`·.Ž-µÚé&r'½ˆ¸§3æ,a1œ!aîꬹ|)½EÛS9vG/OÙAö&ráñQC¨¯?R!Rê,i{X³êgâ¿Ùޱöpj{¨Ý‰(ĈˆÈ5œ"3aªöƒÈß&Äd`Ù¼EõkÉ ~ ôV2‘"ôLŒˆˆˆˆˆÜUôLŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆaûG““£½("""""·ÌÁÁá¶æSOŒˆˆˆˆˆÜU V«ÕªÝ """""w õĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆ(Ĉˆˆˆˆˆ(Ĉˆˆˆˆˆ(ĈˆˆˆˆˆBŒˆˆˆˆˆˆBŒˆˆˆˆˆH±lKwñ¤ì\ʼy?‘pð$©¹v¸ûW¦VËŽty 6¾vÈOdþСÌO ¢Ï{£¸ßßxÍr¶O ßkÇèøþÛ´ó:ÎçC†óu’‘°!òj3 EÖ˜µuF­#Ë©¯MBM‡\vMêÏÈÕ™×Nhp·z}ìÕ‹¶Á®Kðm,™X6k&ßnÚOR–e*צm×Þ´ô¾ùŽÌ?ziÛ!èÉ©Œné}‹ 2Ÿqß°ÁÔœ‡›úcÊÝÍûOŒäxÛÂówûá÷2Ù4²'ãvÝh{þßG<ᨖ!òô‡jØ÷GkZ)o‘kˆ±’¾u/ŽZFVõhêÞ²öٜ޳žŸ>ÃæÃÙðLcÊ\9»îã³ñ4|1 ¯›^ݛٷ“´¦÷à~Í™.›ƒ«·Uìõy(zÆPÖX È<»Ÿõ‹W2s䌓^£­ïMbŒ%…õ_eúör´èø5=²Ø·b_Œ ï¼AlÅŸòòOÄŸtñ¿÷¯ØJJLK¼o)Åäq½î=Ŭ…+ØšCKo›?õWíÑœ˜Ëÿ›»›sr¶b=¢b‚°W[ùGûc5LDDäï¥ô®¢ Ò9•Ž•Cð¹æÌhÄ«a,ÚÖǧP„r©ÝžµòX7m.;³¬7\´S`4áÆ=¬Ü•Aá)s®esv5bÂÜK´‰&ÿZ„¸Âù£‡‰ûogb‡~Ë)óÕ·¦®åÕα [tš¼\ ¾5Ñ,ØýÊN38xãïùÙùXn´¢üDÖÆŸÅ¹î½DÅDSÞºŸ[S®Î“•À¨ÎP¨É|–ŸžíHßiûÈ5Ÿbá3=·ËJþ/£éÞi —GÇå'±~Æ« îÙ‘ØÎóÂ+8ž{;¿°\öÔØŸp(¿ð…Ï<Û…1›ÒÉ?¾€§ºŒ`ÉÎÕÌ=Œ>;Ò}àËL^z„ì¿Kû¾ŸÈKƒzÒ1¶3½‡¾Åü„s¨½É]ÏJƾ™ü񼁮Û¥/ÏMüž½Ö+7Þïݱ›ÿñ†õíLìú2bÊÊ«í2w/Sûvcì†=,}oºv¤ë€—˜¼ò8iG–0ñùþt‰¥ûÓãøþp6V àfmÏšÊÚÒ¬aEXÒw±hâ ôïKllGºöÁ¤ÅÈ´–nM+(I ÊÝÍû}z0.áë>|‰Ç»d]šò“Ø4g Ãúu!¶cwž|a< w¥a(f{Dþj7;'‹(Ä”;jT2‘½a:Ó%p"ûê)Òà\ƒöýzÓ¦|¡tcô¦yß®T¿°Œ©_äF×á§ bÂlØ·›Œ+Ïy‹O ³J á%ûZÖ¬$Ne€£‡á1AØ$®c[ŠùÊÅJÚÎ8öš«Ðª¡Ž•Ú3bÔPZú±šsÉL9ÎÖŸ°&Å:Ës£AXy‰kXÿÿíÝyX”åþÇñ÷0 û&»ˆâÆ"‹ˆâš(hjuRËH§E35Ë­ÅSýô”™ÌLÓ´EÛ,s9Õ±Ìã ®iE¹ä¾o¹¡ ˆ¬Ãüþ Ò±¼ü¼®‹`žç¹çfîïý|žmÒ]iÙ%WßVt´”\RVÓ½£/]^xG1âq^›šL¤cI÷Ïý7ó2›Òû‰gIî^‡ã«f0eÙIÌ¿ûfOÝvѸ¦ÿ@Ú©Kq£˜ŒÍ«9dФs—’³c…ùü•™lvnMŸÁpgƒ RÞ}–ñKN–„K.»>ù'Ï}˜†MóD†$?DG·ÌŸðîÈÅ¢1'7s„ÉÜÄŒq³ØPIACx´G…>dÂì­¿íÀ“Çž¹¯1?=”žIO“Ü=ã+ßæÍ¥¿þ6.-yl=•õn·3`øºx$åíQ$]Ž]ü#Œ–HãŒM|øÎÒ/-TÕØ3¸aÅV>ÁdðÝ´Wøx“…È»üøCtk|Õ³'ðÉî|ë×´êj€%Ÿƒ_¼Æ»[ìhÚ9Ž@Së'?ÅįŽâ—П'†ô¡¥ýVæŒÍG;s±TÒ‘?[us²È­Îz—“™©_~ÃÁÎi”³‘Ͼ=Aû_gLŸú%;Fí£q{vŸ¶‘^/%à©gâÉMªàD;rýé>ä1z×3qDy:²ðD¹Åà\²N¶MW^Ñ‹:¶@L=rœ]g(è@é¾:6 bd¿¶¸ Ú}ëž[Žwßg|‡/Fbñ=¾Ž‘Ëp¶ˆÒ{«{QÖªažåp~ qCžahû’ËÒhÄéA/sèD–0û¬ëÕ4ÛôC0%5þôù¶¼úÆ?hì` èØB&}ŸGØc“xª‹F ãmáØ †¯çÿD¯1·áQ¡="¶jçd‘[œUw'Þ-é÷ò{Ì™1g÷¤©k:›æNgÜð~ y})Gò+—·#¨GwybÞ;)œ¾êé.a „[¶“²û" ð×ïø>£ñѵ*SÙ«™<ˆAƒ1hpOŽžÈü­ÂûŒ oGŒM‰o {×ì$Ë– ;IÙa&øö”›ÿ±#èÞ?æiÝFúÇ3iyg> ްæ»s¸Ç¶Ãß’G^^nÑmðcOùKÊþ ÿÖ-ð½Emœñv6`±XþØÇÆt·ãÈúídƒ%s)ûm ïÎoõÒŽ¦w4+Ùy°ñ$öîì3v°;ÓLþÑÙo$!®îoGvM´‹¯KñáÍ/Р“›ø¨W06'Y<ó¾M;DF-Ý’Þ¿]¹:áß:ö·qitÆ«t\–­aþMáR:ŽŒNž8¼ ©UzðÁˆ“§†bs™±\õس±V «È¾1ÿø×« kï‰ f.žÙÏ«RÙ—gázœj­¾¦UÝ—×Ó>Ž `!çÐf~¥··ôþíàŽ]]Úßæ‹ùÐfNª.É_Qæd‘[xN¶Úš-f ‹Š±±5áàLË®Á´ìÚKîqÒÀ[Ÿ¿Çä†Lì^!ž8†rÿcY;þcf}Ë“W»½Å%œNáÅLOÙÃÅæ‘œÝ¸‘³uï ÆËHa¥Å 'ßIÒ“;“+þA ¨ín*9jh¨Et|Š?ZÞœv„ïIa{Q¶ð¬Š ØûÔ'Ô§>¡Qa¸ýšÄ¤E©Oø;•=Ü'ÿp*߃ó+_dàÊò;ué)e•w` ö ¸x9ÿî3.W_3ÁB±™º–YñDnOeŸM8O†—yЂÁ?÷ò[7_\8Hf®™¢ çÉçsžìÜ+ÖïN®YƒNn^FßNŒz>›æ|Ãì ˘ ߈xz>ð]B\Jk…o—j‹«ÑdSጅSU U9öŠÁÆ:5¬²Ú”³ç[fÏYÎÖ½ÇȰõ¥a#ÏÔ«ëTÓªë’õ8]^O1ùYy`çK-{C¹þvñqÜóäë³-A5™“Eb®¿‚}üϸíßoÑ¿‘]™R‡Ø{¡çÚa|¶ù(¹Ý¯˜Ä\£d`ì&&ÏšÃæAW™] .4IÄŠ'[ìÛëñ KWná\ûBkü93Xèp',Y5ÿ[ò+3£Âã›IûŃè†Vúǽˆ¾­³æ,e—1Ša‘îWÍY?‘±¦DîˆpæÌ‹øâg3!ýzÐØŒ>íø{Ç…ŒŸ2–ÉÇ¿…“¿¬æë”cDë‡“Š¯ÜÄÜ‚`{b!Ó_w¡Gû„¾/¼BÿˆÊžì“Ç”ï9oE|¨Ó•·"®…ìYÉ–ìzŒ|ŒŽ¾ûùÏ”W™öŸí¸ß7šþáŽe–s Q×N4Ì^Ì›pÀj7¢ñiÞÀÖ‰¨Š‡| ~ôx6‰ðÓ)|òöû|{ÀŽƒ&ðw”$bƒ+1I¯ñ½9¹ê#¦¾5‹Å;íIxâežlïyýîßù˜‚z1zØßh¾Žyï¼ÅÛsWq̯;#þÕ0G+o¼º±wÝkØUú Þ=ŒÔ—Ýßðáô÷ù*­€6OOåÕ‡cpÚµ”ÔÃùXLÖ«i5ꇊ3'q£^ç©_ñ!oMÿœïó¢yð¥ ôkr©MåÛ#òI1UÏÉ"·0ƒ¥ü#sD°d®eÌài†Îäŵ.ït[Àˆ©´›ô&}ë黽En=õƒhN®8'‹Üêt‡‚T,—œß¶Š½†P:Gy¨XŠˆˆhNù˱UÈ%ÅY»X“ú=ë¾Ü†±Ù(šy¨\ŠÜ*.n™Æó3~!·ª9„ñè¸a´Ô—TˆhNQˆ‘¿LÁ¼°åóqد3ɃZé ("·§è¡Lž©~Ñœ,rsÐ=1"""""rSÑ=1"""""¢#"""""¢#"""""¢#""""" 1"""""" 1"""""" 1"""""¢#"""""¢#"""""¢#""""" 1"""""" 1"""""" 1"""""¢#"""""¢#"""""¢#"""""73Ûk]A^^žzQDDDDD~7‡?´œÁb±XÔ}"""""r³Ðåd"""""¢#"""""¢#"""""¢#""""" 1"""""" 1"""""" 1"""""¢#"""""¢#"""""¢#""""" 1"""""" 1"""""" 1"""""¢#"""""¢#"""""¢#""""" 1"""""" 1"""""" 1"""""¢#"""""¢#"""""R)[뮾ˆsÛ—1oÞÿHÛÿ+™ùv¸û×§içûéû·føÚ ð(óGŒ`þéLÇ]þÆrkÈÛ6™A/áþi¯ÓÃëŸ Å§D{‡±q*lñâ–É$[ÏE§8^|wùìxk0cV甡Á ߯-¹»º…ºb¬Á»)ÎÙÇògóßM{9}ÑŽZõ›ÑíG¸'Æû*ùÇ·]|n%ÿ<ƒÓ_fæãaØë³*"×è÷×°ë¸mÕ4¹9BŒ…ì-³øç¸å\lO÷‡zQÛ>—“»6ð¿OÇóóÁQLÞ–Z—g¸=|:k­ÿÙ¯jϙٙ²¬ö·á^.Åä²õf.V¶ˆ}8½ú%PÛXŠÈ9³— ß®bö˜Sßz‘n¾Æêf`6LË{ÛêÐéþLjð¸Èž• ø|üxãUë™®¾ìضÁÖƒ†M‚ñ pÒé2¹)â×°ë@5MDDnŽc>Åê–s6 oŒ»ŸËócBWB_áÉ·?áÛ^±N‹axK·+ΰ”eòõƲ{;²ÛÑÖ­Ì+ó²fóEÜ9ŸYa!Ǻ´ì˜@ðåÃ]èÖÆ‹‘£ðÕ²£tz°>UMáæÓëøâ§""ŸMRGOl€±~¤'MdEêQz>ÜðêËÿmÜZðظú„ŠÈõ)É×RîGˆQM‘ëÈzÄŠ²9‘ŽõÃð)73ñjHïn-ñ)¡\š=H¿¦¬w.Û/Zª\µSp$Žø/'Ì¿ýÝ’¹–±}¹è$ùÅø6iC\¨ûåN38xãï…¹…ÿÎî¹¼í#åïdÚ€‡™˜v„õï<Ç£aýéLë?£W`M5m‘ÅÂ…=K˜þ\&&’Øw OOù†ÝJ+QþN¦=ò 6`Ýã9°‰Èè«8–©PífæÀ™ðÝ.–MMÒ÷ó@ÒsL_uŒ¬CK™òÌ`ú&&òГùæ`. èØžè;š¥ÛW3ûå‘ ès? yžéË‘k,™¬½A5¬Ú¶\êÕ4‘k²÷ýA$&}̲#–ðtb_ÆoÊV‰BŒÕÖlçC“ ¹ß½Ç»‹Ò8žûÛipnÂ=ƒ¡k`™tcô¦ÃÀh|~93¿ØO~«68…iÃŽ”\¸œb 8².œ DyÔìmY.žæÄpôð#*!›£ëÙzÎ|yg%k{ »Í ¸½µŽA÷0zÜ:û±˜óÉ9wŒ-ÿ[Àšsî4oˆÝïݺ´mw‡’‚%Ÿƒ_¼Æ»[ìhÚ9Ž@ûÒ3Lw"ªi›ˆÜ “¹‰ãf±¡8’ƒ†ðh 7|È„Ù[ɹ\‹òØ3÷5槇Ò3éi’»r|åÛ¼¹ôW.ï³[òØ:{*ëÝngÀð!tñ8HÊÛ£H»»øG5,‘Æ›øð5¤_Z¨ð Ÿ¿2“Íέé3øîlAÊ»Ï2~ÉIŠjP'®k «ª-—ߣjšÈµ¨Û.×ôH;uiT“±y5‡L‘tn⢒[žõ.'3xÐöñ‘ìs&_<µÛãCóæ-ˆmÕŠ¨@ç+”m@W’î[ÁS fòmüî ¼ÊÅ gB"0LYÅ®œ–´t1@ÁQÖÿEÐ}ÑÔ:¿øÊeÌydefaXÌäžÛϺÏÞg—Å“n ðõO Ø0ƒµ¿œ§k‚'Ëv¦îÄܨ?±ÞeïYÉgï¬dž[Vr½ZÝž/Ñ?ʹÊËߪÞv}ì83§Ï·åÕ7þAcäï¼ôfñˆªiÛDÄš N¤±#ןîC£w=G”§# Oä[ Î%ûãdÛtå彨c ÄÔ#÷§!ÌÙu†‚8–¾Æ¦áCŒì×wD»ïaÝsËñîû ƒïðÅH,¾Ç×1rÙÎQzï ™‚Èa¼4¼ ¡ ã“™úå7ìÁ´ìLË®½±ä'mñ¼õù{LnÁÄîâ‰c(÷?Ö‘µã?fÖw±¡Qa¸ýšÄ¤E©Oø;W}¸OuÛ.]¯“—så;65m›ˆXõÀŒo'F=ŸÍs¾aö„eÌÆ„oD<=x€.!.¥ãÑ€‹·KµÅÕh²©pöÈ©ª… ®ø¹—­›/.$3·øwÔ‰?PÃ~o[`Hß¡|r  BH©Cì=гÝ|”Ü+G-®Ñ20ÒfÍasöUn75¸Ð$! óÖUìÉ:ɦ gˆ«â(ž½MbZТEÉOó¦!” F¼šÅT¸ƒµûÒÙ“ò æÐ.4«e˜9½òžxj6»ò˽|\!'ƒ‹UÝ[í¶KÿFÃU SUm‘yÜÇ3ú>FMœÍÜ÷ß`ìÐ{ ÎNá½§óC–¥l³Â¡Îf›ËýÊ|!p³·±n ûÝmQM¹)·&q4²ìeÝÞSlOÝ!¬ánŠ0"V 1&¿‚LgIù*såç:г°+œ}Ü+¤§M-Ú x˜&¹kxwÁ^ò®6¸Ã-ÜÊŠõ«YwÊŸ¸X®åJ£ws:ÖÍcëòüo›™&Ý¢K/—0âêmOæ¡Ml8\f (íÛÏOC¼¬üMqWo›ˆÜ(gWO`È“ù!LõˆŠïÍÁpÍ?ÂÌ"+o=­«Ê<̤ø?~óyî¡„xop «¾-ªi"×a'Í=’¸ ¶/YÌ’Ö9¢Â÷ã‰Üº¬¶ëmpk΃½ò̼I =ÞšÛ[‡PÛÖÜ3HKYÍnC ÷Á•Op¾ <ÖgÃ?=Ô­|î‘$ç3õ£¯À¯­ülkØ‘0úТC>šóÒL1ŒŠr¿|Ñ1<‘ÿÊx,½:ìšË¡ ‹XtØ“n/¶·þuÜU´MDn · ØžXÈô×]èÑ>Ü#ü´"•lÏ.4ó1Y}û9ë'2Ö”ÈΜùq_ül&¤_ÛßøVe[òUÓD®ÏÜïEômu˜5g)»ŒQ ‹Ô8±zˆ{ê'ŽcJƒÅÌûbëmâ|¾ ŽžµiÐü!žO¼ƒf~¶T~ €‰À»’¸gåh¾ºÚ×܉ìŒaÇN|ÛµÆïšßߨ8æÌ%½i"ËÞ9g âÞžÇæƒ9,7ƒ%ùŽx7Œ¦ï ýéá|ŠJm‘ÂÔ‹ÑÃryïóTæ½³³É•ÀÈîŒx¤aŽ5ÜyÿÃG†üèñLo ¿^À'«ORìLÇAO1°k@™B~ƒjXÚ¢š&r=æ~ŸæmðŸ³3aˆÒi‘ߦ"KùG戈È_LѱŒ‘J»IoÒ·žIm¹…X2×2fð4 Cgòb‡Z:#RJwQŠˆˆˆü5# ç·­b¯!”ÎQ 0"eت DDäâ–i3ïìSÆàÃ¥vDDDDDjˆIM """" ˜""""¢€)"""" ˜"""""ÕfØíöËþ"cÊ2õ´ˆˆˆÈßD3˜""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)"""" ˜""""" ˜""""r™̟»¦î§ø”Çmé‹ybÄͼUpÙ7ÞÈk{bŸxò¿¢Û:ðG'ê›/Î:}ê±wbOVEX0.ã¶}ú¦žÄ÷ðÀå”ÇÍn!lœØƒŸÃÌÿš¶8¿=ÛB·Y~s7 'öÄvgv çV‡‹ö­òßÞ.á™ØûØFtµhž™›§7¶ªÇkÝÂy³c·ÕqÃGÓ"#3u¼q¬ì'Â.ü]Üá’Ývk³y˜UýßåµA˜/Õz¦ ïŠ,r“ÙB£ÐÚ¼Ù¾¿Û6Ñ~c.…5Ý,EÙLŠ%'Æý_¾{T¹-L.<~CnÚ¹ö; )ý|olÕ&’嘽a?Câ (vrc`ËLî†ËwÛù$Ûþ¿ëË´Í[4 ÀÕŸ1þX“`ýWÿãfg®ëÚœ/[zà—”bµ8àBC>ÏJæÞù{ø8Õú¯o¹Øá²]›V¬èâÂï‹¶pëÞÂã“…f_ÞÖ’{‰gàì,,8ÿ½ÑA }alEùlJÊ&«üïµG³É èÂìÆDlÉeG ÆXóÓyuuº^mqfˆtçЦܼ)"²YŸûÍmx¼©_®Ï-\ýQ#ÜÝЉ”}YÖ€aÝy8!‹<Æ !Ø™ÑýÚ1£‰UÛ¢¹wK Q…v0ÌD„Õæõž ˜2Ÿ£xE!Sä¢iÒª%+ºxá Üз-6ûÆî+ÄêâÛÃZñ€@(ó‡ÚèþóAÖŸï×4}+ß¿ò0wÜ8‚ëGßÍ“ïÏcÞ±·ŽbŽ®ø‚IGsýˆŒºãqÞŸCaI€ÙƒA>fÀDDOÜ2RX–o¿D›öDÛVüWYvò«Ã¯}ƒ°íÛË€_¢·ËʵW4ãQïB^ù~OeØØ¾z=n¿§‘eñâÍëZñ„kOý±…î ã8T+‚UƒjÑÀTYŸe³aOÁôu=B=¹£ž™5;Ó.½†+Éå‹ýÅ„·oÇž!x,›¦.& lÄ'¥³8­ë¹Æ¥²vÈ`^ǦáèÍ»×µän#™ ¿n¦çòT|Z5cVK,çXïûÒ÷R=IÏLdãBŠÒ™™\Ħ}™ä»ø3ÖÿDJ2,^¼=¬£J¸mö6nÙQʘ¾ hg©Â¾\á5÷\Baô.:»§R=xªw=:˜òOã—¢‘¾8§fbt~¥³çÖ‚tž\™F¾O-&ú+aŠ\,¹©± ýåKއG'nèј{}O„Ëí[£è½.ƒ´ ˆpˆÜNƼÿ0z^eÏ9äïú%Œýïzšêy&±ë?°üh_®Éˆ!ÍcXÿDú™ ¢6>u÷`ö0a˜Ì&&Ó¥;ÃfªÝ‚Ô»O~,;!†ak26Çd¢h÷_ ÙXv¸Ò%°øesÏW™‘o²ÙœG7äî€ÃŒ‹Md­9œ[ƒ˜s¤gŸ@®sÍãÝýW¸ìÅÅ¿ÖYË™“AZ¤?ãˆsó%²$ƒ¯r½¸¢––dÝC‰‹I'Ævi¶mH‹¶d·¨ì+GNÌtu'ÌžÏë%³0×IùMó¤´ÐŽÍnÇØmvJíàÆm®Ù<ô˦唵[T¡ =†‡2Ú;çsOï3,‰Ì)Šdl¨…é{Šñ a )“ñ±%—`Ë•°`ù&º'…rO#žîW‹×¬Ì ¾Ù~˜IÑY¤ØÎ=~Ö¥žÞ&תMßÐ:ŒqJgìâ~Ì·yŒuuá#W‚|κÞûÌgîËK’Å1 É:’ȦÈIJbµÍŸ¡Ýy0!‹< ëÕã6K 7,Šá·B !—[Ü}ØÙ¡jûrY_@ÒŽ=<½?Ÿ nK2ÿæF¨Ö•œ<Æ/E½¼áà¶tŽœáýÆd@VR QøÑ9À‚SŠb›]‡ÊE.RÈò³ÙÃÃék99ÛEm¢ÏºÌ —0Á­óDžFźٳ6ðÁ«s+™1ñûu¤‰Ï‰o£N¡­©kYľäœ_E¯àÿ2åî»YÔ¥3íÛu£g×ÎøZ °þCz©ÂE>Øídçå³/ÏzòIö¶R6Ä–k7ðöõ$ÔÁ“é·^Áç'æ8°˜ÀæjžÎ‰&&7òÀãHáá¥ÆòSŽý¤;W9GRXemÆP?Öx{ã“ËÔ$g†×õÀ—Á^¥,ZQPã"Õ”Œ{¶-ï¤Ù“‹?_ª}Úkó’ã™–É·væŽý)ü“ÂŒý)Ä[9ežÞ ÈÏ—ÜVW˜¹ÍKO'ÊB'äžÚge³‚Óc¬ÌkâCàÞ4Ú6óÅ!~7K .Ñ?[1«£²:ú †ÉBÓZþŒiƃW´¡¯çÚ®ÉÁããÇàôv°Telš¨äŠcV›‡BÑQ;¹ƒ&uϺÞüسôå%ÈÍ?˜k]KY°'‡l€Âl¾N‚~õƒi»:‹•%õBܰdbËñe#&>›Ìö.UÚ—Ëú¢„ ‰EûJc·Ú(þ¥/g•–áÓ®ìÚ†%‘®e_Ñ™¤º{h?/ýVDä"(ÌÏgw>ôõªøh){Ó É©÷– ˜N¾u?é2w[ú‘Ón-sòb&ìX±c¸·âö·>§÷Öµ¬ÛźéOóÍÔ&\ÿôÓŒløÏè S/ò©|²×Jf…i“a`+JæúŸ°ñ”Ë=‹ K±ÛaÑ®ܺÒÚ¹„«ZØ´9•8Û©ßøÏQNi.?¤¼Q׃NÞΉÉf[J6y-üèd#Ò–ÅäôK÷Ý» ?—I9T¼á•ÙÍ­ìCü´~Èà¾ï×0­NÃëùr]×6¼Ü=‹ÿÎÙÁs)U[Ÿ°•÷XÙ²;ÜÁÁôô¶2* æ/ÈäR¼¤ÅÅ¿Ÿ·5˜¼$†M¥`·•—ÀqÉüÒ½#k‡ÐjC1ç?¦JÚÁ^Rµ±i2Àn¯ô{â¹Æ­µôÌ}9)éR»>ÚLÛ&þâÀõƒ»Ÿ2ÛæÏXÿý¬L(›;ímaËT¥¾°‘kýçÎçEåAÏZnxoÉç´]Ò^ÂÒµQŒrmÇwŽ”&¢ï…K‘‹öÎåâËÛÃZq¯×©ÏX¸¾OÙ…?¯.?ñ¤&3ÞukaIÛÉžÌïEqQ.ñ'<ÀDÆÖŸ™ùû!¼Û ä¦ Oòúgr{àæ-Œ¹ º´ÙÉÌÌ%ÍɦF ±¹EÄæ‘`÷à¡.¡tv,{Mb\}Û0˜.ÙL‰)>íÃúÜå”°v>þõBç_ÊŠ„"2ÓS‰2yqg3œS’ÙtY4´AH:¼ÞÚ„˜xž^ºƒöÓ×s_Ž'›»ázJû'¥åSèîCWןún>>´6±!çÌç ä¦$òg©'´«C['–^’‡ï¬6ÂCy0ÔrÚn³6¥U‡•ßsMqÉX½|hsü^j š·$êê|²Î¶Þ³÷å%ÇâÁØúŠâ÷Ñã‡MD~_ö¯Í¯ÙŒ…!M‚Çr¬öóï‹ã}^|Ò÷ú3ý–éÜ?{–kšòüЮ<˜‘ÉŠ´bJ]èæA­’®ý:šÙº¬GäbÚºq;·x¶å«Ëñp™fÒâö‹Á¯×6¤7<üë>\À “ »Ý~ÙïÍÆ”eQR#‰†‘íØ™A—o°¹T-"Uü&ïêÅ5AvÖÄd“T}ê6gï•E úfÿiç]^Ö{‘Ù™ÞMCîMO %Eì<šÊÛãù-ÊMÃEäâ39Ó¯¾#[ž~$ÓÝÇŸ>dð[Æ…ýà¦H˜ÜèVË—‡z5¤éŽDnÌ«ñ_‘˗ų6«nªOúúhžØ—K–«/ÏõoLߘ­4^™M¾šHD.·/Öj‘ª„ >î_SìAnÛž¯p)ÕR’Àõóø´k3¶uqÀVTÈÚ}»é·NáRD.OšÁ‘eRˆˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆˆ¦ˆˆˆˆ(`ŠˆˆˆÈ?Í¿â—|DDDDäï£LQÀLQÀQÀLQÀQÀLQÀLLQÀLLQÀLLQÀLQÀQÀLQÀQÀLQÀQÀLQÀL̋ΞÅêço`ĈÑLÞQ¨ö8c;e°ôÉŒ1‚£^fkšDDDäßÊá˜dÈ?°ˆß×&Qbr¡~ï¡t v¸hë*Ø÷;ßï°j¤ˆˆˆˆ\Þs!³fœèÔ|ÐE ˜ö’Lö¯ú™iŸÏ卯‰ˆˆˆÈå0/¶<6½6‘W7æ©)DDDDþ΀ùÓý#øö(àÙ—ÞêÇ¡Søaƒ‰áo½Ê`3ö¢£¬ûé[þÜ´C±©¹R§^8­{ãÚ p;vögÑ>žð4‹²Z7òîÛ×Q»¼V[_aÜK›)Â'~Ê+=í,zr<ŸÎ…†ËªÔÃFæú·¹ÿuäø]ÍËïÝF#';9›'sï+kÈðíÇs“›¶<¯ù•~[Å®ØdrJ̸øÓ m_†_‘þ–²Õ—bÆ}ñ[*x-/=Ä¢i³Ù°'S­Æ´é5’1ƒ¶ô+¾ž·‘è˜Lü#è<ì6ÆôÀÝtj¿Œâå‰nÌ›:‹Õ³q nDËÎCsC'-5Ñgc§8i sfÍeÝ®Ä$åâàJx›ÜxSšx™O~uUÇ]M´‘ˆˆˆÔlÀ<ΖÎê÷&1oG!V)ÒÖ0åÿÞfyR…×å%sø¯dÿµ†5ÑOñÊøvxU÷CÚ0áêˆ{l2¹%å9{à?æ‰×–’v|R’F‘|0еÛÇòÚ3ƒ µœ£þ†]_ü‘®åá(yîLœz¸: RÅz˜ðn?–q‘[ø ªÒæñÕªk˜te! ¿.—xÐcüM4w3€b‘'fîÃZ!¼dÄó×âéüu”g߸‹HS[êRÞx*“L[ùßñѬøêyöm©MJt¥ÇòVê^–~þ<ÙnïñDß“¯þÊXÍ{ÏÅ’XþâüĽ¬ŸýQÆðòS×PÇñBÛâÌ­Y÷/>þ%ÑÅ"kz-þ‚g6ìæ±ÉÐÉÛtaãî<Ú詾z÷9ƒ Ÿ‡ÉÝRν ÁÔɺ?8þ!ïÑŸ[ïy 7õ¤NùdSòâ÷™¾#{u×eøÐí‰xó¶å8Ñé±)|ôL?Šv2sJyqkèÇ^äõ—Ÿbl7ŠþšÎ”ÅÉXÏUó…5‡=¿õ0ûÓãÎÑ46—…ÅèïaËÚï™}¤¬,—wrk Àž½‰éß•‡K·æ\uó¸oC"=ÊCÒ"~ŠÊ>½Mm™dväš®£Osïcµ$!:kH'†Üp½›{¼Ís6“n;¥Œ‚X­µèrí­ŒÕ‡F.å¯Þ1“O–§`­‰¶¨Œ5…eM/—&B¯¼‰‰=Àؾõ0ä¬fÊôíäÙûŒ»óh#9³93ìÚçy~Ts<Í`K_ÌÓ[˧›ü3iÒX9t£s;÷¾¸œrYûG4·GvÀ­†6$÷Ÿ¬Ë0Óò®{¸®“7Ð Ì…ØÿÇâl;{ç­!©ß0j¥þk=Ì`îËÝ7,æ¡oCú|^{·¼ K+n× Ÿò¯Öü|¼›5§y©#¡'0®sÙ,cÿ},ŽZIv²Só°áÅɛΓa@€· øîçY™?éúú›Êÿ<«òÜTò¬àR®tyü%îPvû·óâáÇ~&{æo$­÷ MÞ§åË´MÌßSÆãyæž>ø›€Î )Ýs?_ÅBÞ–å.jMÓüÍÌ9ïqWý6‘‹0M-¹aH³ãá¬8açñ«®kõéKçc/4pk:€.ÞËY %±{H.é@ýÙŒRwÇPTKØùÉÃÜ1µüP±ÝJ~vùËv_8ŒZNg®ÿßZ7 aWOdø²Çùùøåê&¾‹+NTÊ!¸÷>Ûl¤ÜŪ¹‹9xp?Ñ7sÖ3F}ÑðØyŠfW<€<À¯1 Ž+6»âå äöJæ•]ÛÒ¿eY¸p »‚žµ~滣@â.‹è\mqJ I»8v´;¬sóãasŸ}‡69V0\p„â0îj¢DDD¤¦[ Þ.Ô°æpìväîî'Ϧ9¸èd…YÚjj3ld¸³·=?›¬Ê^fÍ#»ÈNg®ÿßZ·òõ:Õ£ÿ~þx_ùßm¹öŠ “;Ç^DÜò©¼óùbW¼ßû¹ªnrÀlœáñªn–{àÉÜ\ÞE9gèÇól‹ŠOfK.Þ.Îç0pò ¥n…Ó ª;îL5ÜF"""RƒÓ0NÊ8†³ΔMå¦äbÅûÄJJsIÉ-ÿ¿“N&Àvr(©87d+-¥jÔ„£Ë±+MüòúûÜÚà,WŽ”ž¹þ¦šõ8¾vñËûNgP[_ ¬äµ•T509¿‰&)GR(l†{óD:þÅÖb;{§À.#içWDbô¾þf-©€c›™òŸZ¸ÖÔÆZ“YðÜ£|±·œ"¸íçPÍzÇü·¿&–•<œ§oÏâí—“i?À7Ÿ,¥ó¤þš Ì–c)¼€­³¾gnFNÉëù廨¿a˜ä³öõ§™|m?[âX9{1ÉåçåÀvøšŽ'ý“úÉ£:mQI[^ØÞõf0ý0p`*/¼—ϵíZ]ayï+¹ïŽvx€QÍq'"""ÍE9Íìßû&¿Ç#×v¦I˜/΀á@½=¸ñéym\k>•²h;°‡0gd#®v5Ê®ãÇ@ƒ¦¿`RbÓü.£Ö¶åóÑêcáÒ·ol˃>&Œs,fqv¥}'žxÒ«~=·ÒfÃ>¾kÔšqî†F²ˆˆˆ\2jðx¨ߎéAÎ=ÈÓŒîFŸü¹c­äÕö‚ Þ:PJ÷Nõ¸Êµb@2ð©U‡w:„ÐÂn=mÙâ¼t&ÍÝHð'Ë0}¶ŽN‹ãÙXd/2þŸm`RL"÷ÿ¶ß)ËpÅ*ÔÁVœÃGK¶Pï³e­¢ÙÜCüžkû{Z»´u9'²}·cáÒFBjn5 2ÓªY]ú’Íñ%ØÎ±]Éû¨;}7?8ÈUß®Æá£U„ÿºŸ²*ßî3·±•ÕËÖàøS±öc¯¶²tñjœ~NÐÞ$"""50 \,fÜ-fÜ-&½ø¤KT2 ²2ˆ²ºpUåôN“ £:4à‘Ú§Ì~–dñèOÛy-߇W®n˪~¡Ô?ºîsrðXV²åóáòœ›5eÝ­yÅ?‡W–fciÙsïý¾•Ç3½xn`[Ö_΀‚X†Ì>ĺ’¿£µ-D?i2‹'—aNB*/ÌÝ@½¹Õ h†“+Ý=íL*¤° ÛeÍKâÖ•9´oߌeW7d`ñQnøy‹ŠN)ø¬ml¦uc?|RY”,Ôgóùa+][øio‘š˜§ÎÀ:á,íïÃâÛx8öäWZ\D„:UýðnVB,Óò=™< !·…zÒµ^(_ô«B33˦ ‚Z6æ¥pùxsgÛ@ óˆ³BAêQÞJóäë06Ô“Ž¡Á¼yU#ºæ&òqŠõâ¶´µ€¯Ö&îQ~^‚ÝûrÍ/;ù¿ÃE´‹ ­fóšñs€ü"yUØ.&ú^ÑŒÿFøÐ½Nï Œ {QoÆ—`¯F»ù3Ø)‡/ãÊfN³’øÓæÍÄ0‹ö&.Ö9˜†…zF&Ã>_~ü¡]Kóã›p¡Ô3Ì“a7p<ÚIJ˧À=€n©»ùúiN`}Ž Ü“…ŽÁNXŽç0ŽFÙò™éÙÄ•–]œt'Ê-±)ߘ/Z¸œ±h+cãX›I­ùr{l€ƒ+#;6fJ«j^n·’V ®N9çØ.»'`rehÃñofW/yÙù<¥ˆâÚÕhc_wÆÔ5sÕî ’ù±%:ÒÚMèí¢ó@EDDäbL‹SÇ^ÁV{ÙìXq¿;zÒKœ=½‰ …yÉ%<äåxòTª-ŸÉ?o`’GK’ú{uf äØ4œaÂÝ\yرÙ혜™u]C:œ²åNÎéz'k!3—…K€âäx^rlÌ®;›ãSjÇÍÉ|^`/ÊgU¶Aƒ g,¶³o—‘`àpR³˜›“f0ÏÝÆfÚ6ñÃ}N"Ë2Í| ú{ã«}IDDDÊ]´Cä†É„[Ås2O ,n¾Ü ‹ÖaiáÉ'7%Ï2 ºF¸ãQ!ù¹âœ›Ášü¯ÏËÈ`›Õ‰ŽçÚoowüŠrÙe·æîD˜»!F“ׯ±®ø"4‚­¯oáÖý' 7ù…ñGÿ`ê™Mxg¸+ÛþŠažÜ^Ûߪl—-Ÿ?S­Çä5?‹¹YáN8U³Ý‚èÍ[›°ØäÇÝÁhþRDDDŽùßýÎŽáĨ+ÃùnÖ^ú~—ÏCm‚¸ÒÇüŒ4ÞÛp”à ø=Ü sé‰E²×ãnçŽH¶B¾Z´…ÑÂ¥áÆ‚¡ è]Íu•æ±.ÁŒvò X(žÿîɧk—¶Œr7pu9Çvå”òÝ’]´èFOÇf­ßÇrç`VÔ±`ØªÑÆÆÖ5è½'›€¦ èä¨IDDD.0`†»Â²ü _¹£W-~¾Á™w6ÆñãŽ}¼“]Š›«]š6asÇ š™9)4/ÞÞïåyì÷8’ÍNthÁªîµhX•¹X³;Ï këŠý¼0/£6 -ë×eNPÕð\îâ[½ßÌã}êðëâ#ìõ cá°ô9 kM<À€_Žou¼¹¯s^<öK>çØ®ÀpðæýÎ.ÌZ³ƒgr ^Hß kHw PTÝ66Ó®‘/ž{2¹¾™îÚDDD¤Ãn·Û«½”ÝN‘Í~âܽ¢4|Ïã[3´²Ù¬âTzÍŒcéí­ÿ5 ûõœÜr¤ljÐäÆüa èëü¿9\¼ðÙù|26’Á52Ûhç@ÔfšFù°ö¦†´ÓïÍ‹ˆˆHç §ŠÒX 7e2ìóeg^Æ5ä_Õ°7ömÉŽ¹»˜A03Õ?¯™ËK‘µ(ÕGÓ™¼9—-›ÒBáRDDDNŠç5ƒY»¼Rû¯Hvp0ã¬+Aþ'jr³0å mŽÇV—i}Âèâ¤N‘‹0EDDDD¸¨¿ä#"""" ˜""""" ˜""""¢€)"""" ˜""""" ˜""""¢€)"""" ˜""""" ˜""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)"""" ˜""""" ˜""""¢€)"""" ˜""""" ˜""""¢€)"""" ˜""""" ˜""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)"""" ˜""""" ˜""""¢€YÆž¹Œ§FŒ`ĈŒq3ol+8þ\ÉÁéÜ}ü¹ |u¸äÜæodÒˆŒñ,ksÕ¡jù×Ì“qè¯$Êb¤ìƒÑ¤ªOª§4žŸîÁˆ·óÉÞ"µ‡ˆˆˆüÏ9œÏBû—üÀÚ¸Bì•=iö$¢ç@:×v¨BYÉ;‘c¯‡¯QD\T|õ+ãÚŽ§¿ú &,NêPµ‰ˆˆˆü#æÂ¯~`qö™Ÿ¯ãÒžÃCÏQ¸ƒ2Ø·•¸Â^ø:¤°ëP!ø6! }7)Ç_g%móO|ñõ¶ɤØpÆ?¢3CÆÝÆÀp7È^ÍóãÞe)’§¾|–Ö¹ðøÄiĸvæž±^,žµŒÝ)ØjwÜ7ж>æÓjRrø+ît6)¾}¸gp!sf¯ãHiM¯¸ ·v'ÄÑÀš|¬Ü®<4±+¾]£ßæ©ö®Øó±ôëéüº~ñ™v”–ÞæÊ×Óc4úú ¾= ÅÂÿÜLü£Óy¾Ù–“Ú¤ëÙËY;gÚŒ?Øx0"³;!Íz0|ÌMô¬çR¥/ """"Çœ×!ò±ÏÜB3ÇÊŸóîzO ­Bru¡nëÚPpè”ìy1ìLˆ&øV¨•5qo¾öŽäàÙ Mj›IÝ»Œ©/}ItÁYŠÏ_LJSVfvÆ ˆäí¿0yê6rígY&}1ÎØL¡Oîù‰DÏ{—g>ÛI^Åeò£øü­ÙŸF±(>̬gcÊüÄ—Ó´i-ì »YòÙS<õÍ~ŠªX¾-}%o?6™9Û“piÔžVAE\û Ï?1•è|{åë7|èpóÍtð°ÐdøD® ?}Êò\e[S—òÎK3Yu0¿æíˆ¬ã@ÂŽ?ùð¹OØœc×^""""?`º4ÊS/ž2½ºÜËK÷]I`•æEÍø4j‚7‰ì8”GáÑ(âìuZ×âD±v SRpmÔŒ£^âÝ×ÿË‹/?@G ç19Ö³”ȰW>cÊŸóÅcp öï"¥ôluòàŠ§¦ðÁ[ïòѫà ²–}φ […×rý³¼?õKžhëBÁ®Ÿøýàq%ÿùàm^xá->ø¿~ø sg±ã¤tz¦ò‹I\ö3› Á§ßLzt"<óã H[Ĭm9NG¨°þv>ÔiבpWÂÚw#ÒÿÔÆ/=gÙEq›ØSø÷bÌ}òÌkoòÔ5iÓØ”¬Rí%"""R-ç·˜Q2á•g¾"º<;ÝÃK÷÷$ÈRõRCZQ×¼˜ýÛbH¨»Ÿ\BhUוè ëqk9†G}¶°rõR¦¼ð9ì'¡¸,|žunÍ%‚È0g À%8 o6’d-Áv¶…\#éÝÜp®ÛnÁ?ócb<»“K¸Â·ü5–V\78’ײð¿?†À­Mšy”LvkÜ‹ö^ Y˜ËÞÔR"ÏY~žÑ d,|‘ +VÊÊѽ)”„W¶~àœù¯˜„s”m\Õš§ü•:ŸWîž{X$í;táÚñ=iæë ½DDDDþŽ€y"dþçõD9Ó¹;-Õ,Áµ.‘µ!jßf¶¤%€[7šú;T˜v vMãÑgç’„' ;u¦Û°–ìüþvŸëF†éÄô¬aTy›Îü×±€ç†³éÜK[åÉöLåÛ±YËfIƒ?Àí‘î^eÂ)  »Ï¹þÊ»lçà†Lú$‚Usæ°hÕz¢c£XŲ_ç3â•Õ@W ‰ˆˆHÕ]àmŠ œC»1äêê‡Ë²xëK“Æ^¸ˆ?÷X1ÂZSË©b+&vÕ’€àëŸãÅÇîâºö®ä•\¤ÖÈßÆÒ¿²±c§ f«SÍϘÏ}ÖÅÈÛ¶„¿r쀼½KÙ” XBiäçP…òÝ  /Ï›&­ÛЦM+ê»’“C‰ƒ¹JAÒ^éì¬ã9ʶ“¸|*ï}ò;‡ÂndÒ3™ùá3Œ¨o€õk·¥i/‘êE¼ÿíê ‰¬‹yáv²¬ܲnFJ…ç͸x¹™$þøÏî oïnÊ•ÍVÓõÉaù+÷°§ž/y‡ãÉ|ûÝHGR*_µép‡­åÇØe¼|ßAšÕ1}˜ ÖÕ#iåa@Ú¹ÊwıÏ`šü6•ÝK_å™ÜÎԱDzmÓAr,-™ð^Œ3Ú7qsÈfË/³X>ú®ð¨ø ag-»3 =rˆZ»’œµQìXÒ” S:ûÛ7ê7ðÒ^""""Õò?¾ÑºkÝÖÔÀ…†Í°œ’CßÇ-íƒp²§›h§Å¸G^ žuÛR±Ödu¼»rý€úØãÉq ¢ùàGxqlS\Îv„Ý©>#_|»û5£–)èè8nJŸ»^åå›Âq®bùæàüçÕ ômâMê¦å¬Ü’„{ä îyõqzœeÓìKûk{êé›f³8¶øô—œµlÜÛŒçùûÓ&ÔàhÔzÖo=Ha`3úÝ5‰»"Ý´—ˆˆˆHõžÝnÿ×߇æÄ}*¯æµn£¡ã?«|‘K‰IM """" ˜""""rÉÒ!r©QšÁLQÀL‘ê;¯_òÙ°aƒZNDDDä_ cÇŽÕ^FW‘‹ˆˆˆHÒ!rQÀLQÀQÀLQÀQÀLQÀLLQÀLLQÀLLQÀLQÀQÀLQÀ¬¾<Ï[ÆSrÊã¶ì-|úÜK| èòoY{>Íü”å)V2¹<†tÖjþ;îy6æ_&”»–goœÀW‡KÔ¹""ÿ„€yÑYÓXýá‹|¼>Û%X½¢Ã2óû…ìLÏæÐê_˜ùý4ùì' Ì~ðF›Ì…~ͱeÍ7_³=Ǧv‘srPÔ<§:=¹*_ÿK®G0£G´Q£È?T Gfý‡'¾?T~D"@M"""—vÀ´fïcÅœ…l>˜LžÙ‹ZMº1h`j;@ ©Û2gi1E˜ÜChqå0®ncfÝǰ$øó^Øs#OŒ4˜5y¡×u§pÝ*¶J¥Ô³¯N¯pwLØ)NÚ¼9ËÙ›M‰áˆwÝ6ôÚ–>P¸—™“P{h2W®$:±]:8œ„¿±rO2εé8dšx`ì… lš÷«wÅ‘YìB@D{ú^Ý“Æ^f0ìdìŽÁÿª4ݶ†C©ë©Á&g÷Âè‡iþøµ¤|= þðÁ£‘XÒ·òÓ'3Y¸ýYþ4ì8Œ;Æ ÜÍÀ–¾˜§îùNo½ÅðZe»raô{Lx­„‡?ÅÞ§àÛ£ÀÔ‰ŒÚø$Ó'µÇ%ÿ ¦}Îìu{I)t#´ín¹s$íý 3/Œÿú”:´"¤ß#¼Ñ¥”Â=Óxö“Òsn‡ýŒë0“µa2¾“ÎÈ·Ÿg`°{î6¦<øñ×¾Á¯¡ôÈ"¦}ü#«ö¦Qd8Ø´77Ý3šîA–òúÍ üž$ÿü3ëàÓj(÷ŽoÍéñó¦Xr]Ã8áqÆtôźÿ î½±ã¼YôíB¶'ØlÚ“›&Œ¦k°¥õ®üm²4u3?|2ƒ…ÛãÉu ¦Õ€[™0ª#þPz–~«ÎvŒëè«CDþ‘ÌÏ=÷Üs5]h̆åõiM‡†˜ìvìåÿl…GÙºîΑ]iážÀüO¦³ÞhÁ€¡éÖØ“´MóX¸×V­jcIYÁ—_mƩà ÷éH§xÖ,Ú-ºsE–Xvm!ïŠûxp`(ŽÖt¶¯ÞÀžÃÔî1˜«{µÂ+i-K6æÑ¡žöD–Lû†tu_º6¦tïr–ð£]dŽÖ4¶¯ZÏÎxgÚ\=”~­=‰[½˜¥k÷âÐæ†_Õ¿äõ,ßn£iû†¸ÛÓX?ãS4¥ßàôˆ ¦dïRæm,$¼mC<ñ©ßœ¦ujÓ°ES¼œ1lrv+f}IÔÎØZ^Åàž­iàÌǞc®ÑÛ&Žch?Leæf/z\Ž[Ñ!ÏÝCè€4õ(;Û¥4e=¬¶ÑeÈ®ØÇõ‹Èþݳ5?ž‚or:3zü8®»²Å[¾cêŸù´î‰Ÿ=³œ\‡@œÝñôôÄ5o ¬,¤Ó°^Ô¶œa#JžuµÃšpð¦®÷¦G·`b¾z™oŠ®å™;Úãe;Ä·Ï¼Ê ß«¹ãÎ[Òµ.Å[fñݶúõ¬‹si+~žËª}®ô¹ëF÷òcß/ßðÝï›qì}7÷ëGÈ‘?˜µÂNç­ðÈÚÊ¿/aU´™Î7ÝÎM}"(Ù:‹™sÒhÒ·=Aıô÷(üû¤•{ÒÙÛÆÁ8%ŒþŽÀRÏAŒŸ8š«šÚØôÍ Ö¸v£W£gí7wkÕ·cäàVÚ1DD3˜Þ~ÉÙð¯Tzê¡/ ðȶæ„2à¶´ñ6¡¹fóÅz¢ÒÚÑ%7‰,#ní[ÒÐÓµýñŠÅäbÂ0L† “©üßfÇ­ãz7÷à xöhÎÊ/SÈ.ÌfÚ^Åu‘ ÷4µñÌØÄ–™ÚÀÀn"´÷@:ÔsÃÀƒÎu—p¨ ƒ»4ÀïΠXú}yV(IÝÈš¤Ú\}"=  6!þÿîB6%ô"´®#&g7\Ü4ʤj¬%Xz>Æ“#ðù[?cIFcÿ;†^f ‚zžIìúÏ,?Ú—çZ†É\¶Ÿ˜Êö“âƒóùýpw~x+Wú@8 Baß„,88ŠFõN¯Cu>Ç:šùÐùöq,{h*S¾ù‹”e^Œ|õ*jY€"BûŽåÁžiãkâ›´€ÅóRȳ‚wÙwbÝ4Žͼ0ðåêæß²#÷f¾ønÅwo%«jvhuçCŒêä‰4 ƒC÷|Îo;GÓ²yuêítÒû[îŽ_X–׆{ïAo¨Ë½Y |{”´è%gí·‘~UßÌS¸4ʨ®˜+¾-çífö·ë+y‰©”z5¡Žû‰ëŒ vØB|f)Žaiã3ƒ_'¿Ã–fMiÔ¨‘Í›áé`Pé &Wj‡zœXŸÙñĬ¡c ­»º‘·‡­;{˜ý{±ú6«0—늟·#e‹8XpqõÁ©¼ ÃlÁdv SâÈ.‰ã—É/òÛ±uØ­Xm`ä”BY´©³á-˃•̘xŠý:ÒÄçÄ^äÚšº–EìK.úÕûÒ—»—´â}¼÷(¦œHµX­`dc¯wjªÿÅòœëÀ ³_wî¼u)|¼œ›&3(´|mNuè5Ä›¸½›X²êûöìdëÆÃ”w©ÐFÔ p>¾ŸZ-¸‡ávl?µ8a6 +¼>ŒÛMM>MileñtJ›W¯Þ'æ0KIÝOiÐÕ4ð0ŽqüÿÅÊÑÙ3ÏÞo~ç±"" ˜åÍ#Z¡µOú ²e'ãtÖÅ ìØ°c¸4`à„Gi½?š]{°kÁ,þ³WÞr3=C*[ÖŒ£CåÇ¡í‡Y<óÖ„Фic¶éGËйÌÜzîí¨´<›ù#ïèW6óRq»]5ªä±lÜœDõîZg§àÐrÖ¦GpÃøÛ¸®WZ7ª…sAáyÞâÈÀÙ?×ÂDRìîxyyáåå…‡q”u‹Ö§I©¡}Ä»n-,i;Ù“ybʾ(.ŠÃ%þ„XÊò‰½”¢’c¡¥„”]G(°U>nÝj×Å#ï0q6oüýýñ÷÷ÇÇt€9_ÏaoÜÛ²jë(9òÌ.aà„aø¬ù„¯wæaÇNîŽYÌIhÇãoþ—nBÏv qËÍ¿°[,YãÙr(ÿx¬³eîfK¢™à†¾¾]W·mðm„)q‡òŽ•l%iá+<òòbŠÂÎÞo""ÿÿ³«Èêt¡µû4æÍZˆ¥o |KbÙ0wya‰ô·àu”͋דaD§z”$íbGª ŸÖî˜ðQ–Lz®~gÿÐspõÀ±0†íQ{p¬íDÎá,þöî;<ª*qãø÷NK¯¤'„’E¤W¤Š€®ØÖUWWW׆e‹¢®úÓEEE%Ô¤I "-!HBHÌÌïZBqQQÞÏóø<Μ;çœ{î¹Ì;·em1.[û +ô¿¸¾Û":Ð.8-À³_Bùd¬^ÂFWO’<õÇ‘äÒðhv-=ýãífâ6ª+áÕ™,œ¶€’¦ãéiŨ!Ì–OÚ¼U´ÞÓî%L_VRëg£Épp47‹üb?Âc’é•ƇÿžŠÏ¸^4pìcÝ'ï°Ä9œ¾>&¨þ t•ñÝ‚9¬§#7l†×ùÚ°g³àÕ9Úó1F\CNÎzþöú‡ôxñúâVžÁª›põ èÛ%¼÷y.]|—]FXÈOÅ2¾|í¢' ¦…gëfO%ç'O'ø;b{âߣóõûGëé—4œžïþ7þó1 iCÀ‘ÍÌ~w ®kGÙ¼þ9·UšÛ"¢€ù³1ÜÐoÂHÜSRY:kef?"ã“? fb2¬Ç|¯™ËŒT'fÏ`b; #9)³¹šF-²~ÅûL=2šû®?O ŒîÍàN³0u6Ûð!¼iMŒ#}î–¯Ê"þÚ‹µP®w Ö‹Xùa:¥NOB›vcdrê™5©äí#ñŒ{æa¼þ;“wŸI¡ÄDl‡ Lߟ03àÑœ±wdÊ[Syäna-®aÄ]É”½rüæs-»´ eÎsD·»G&&aá§Lg9{W¤B4ÃËÚàmØ9ðù«|x¸ Þ§a3d½V?ÉëŸtç_7æ®AS˜:óyVHã¤dn{.‘´)o1ûãïèpûOC[s&Œ cÝÌg™]!ñ½¸÷ɱ4ó0àh­ÏÙoÀñ£õôˆç–§ÿŒõÿfóúcPîÆU}ï篈ÆfåÜÛMDäJøs¹\. ƒˆüÞTïšÆ]Ïáo=F[O‡ˆÈ/IçsEDDDDSDDDD._:E.""""—”Ž`Šˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆˆ¦ˆˆˆˆ(`ŠˆˆˆÈï‰EC òóq8TWWc·Ûq89{ÛB IDAT‘+Œ»»;WÜzë9˜""""rI鹈ˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆ(`^Rû?ÿ'O¼ö%‡¿ÑQq•óíÌÿ²²Ð¡"?»/þ:”¡Ckÿ7†;zžw׿QíºàIË‘¯ßæÁ±C¹éï«(vý:ºŽÇFLbÖ^ûù—­9ÀÇ÷ÜÈmÓwQý£"çá4:Šm­Ð†QÀüqâË×&óƆbœçY´jï"f~˜Ê7‡°çËyÌüð+ÍùùwĦãxü¹çxî¹gyâ¡ñôip…/þ™§>ÝKÕåË#l›»˜üVwòü}ñ3.åþ“˧÷Žà…üj?¹.‡>ˆˆˆæOå݃þW™È-:Jöá0®¨A‘ŸÙ7ŠØ¸8ââšÐ²]Oþ0éžIæÓøòóü¸j¨¨6á×(Ž(††TDD~E–Ÿ½…ÊÌœ²”ÈÁí(^½šŒ¼j|wfð Xr—~ÎêÌ*Ü#iÝMôkæƒãÀB^ý°š~ý½I_¾™Ý‡]øG·¦×u}hx¬»Ž#ß³*%•Í» (3ûѬ ÉÚénoo oêFɲÅìðíEÛÂÏYuXôOgŽà¡±9º-•”/¶²¯¨ “w8-»_ÏÀ¤Pl†‹¢ïöÔ(ñ_¯eOEGøj¢È/Ìp£Aï!\õÑ‹¤m/¡g(ßÍÒ·ßâÓõ;)¬ô"ªM?Fß:Œ¤ÀRÿúGÞÜ ì¾—›6ÝÉÔçzà‘µŒ·ß˜Ëš‡¨2Ü ‰¿†‘wŽ¡k¨çá4¾ós:¼ð7DÛ¯*3^aÒ?ìÜ÷Æý´:ÑGÿù~fçÓïà¦åÇ“ðü‰«Usx ¿9“Ômû)±Óþz&ŽïG¬—T“³j&o~°‚Œ‚ ÌþérãÜz…÷ÿé´>ÌyÍB\ä_HuM &ÿ™š2ì/ÏóücãH(Máù¿¿ÇÎê@z?û:·6¶>ìEÞ{¶5{˜óü›¬÷ìÉm=Ë俎%±l ÿymÝÅ]ŸiŽà†^bT”…ã^åýÇÚÖ.]N'‡ãGÿ99Ù\e&ï>ò Ÿ–´dÔÃÏ1ùOƒÍx‹GŸ[B¾ìûçñüV`ê6‘G'?ν<Ø0õ>Ï 9£""ryûeÒ“ËDÔ5h×Ð :6XΞŠ^ êÔü:6æ‹Qæ€z€ ¡g¼ˆ †¼W²vO­kÙRE¿[ú‘èo¢õ,bß´ l=Ô–¾€³sÂpFô9¶‚Ž* ÄÉd`?šO‰B—¤VÄøš 2ŸÐ,LÇò¶ÉÝ €‡—fˆüŠ?ÿÜð±AÕÑjªö.aþÞ8n}m,Ý –ÆQðý¤wYºû&š43cÂÀ0™0› °[ˆê=Ž{{ 1РĘ¿”´Å…”9àbÊ&ó±ýÇtlÿ©c'§hñ#ŒY|¶27‚òŸ³¼(ŽqOÝLÏ3GCß|v<²€•9½¹¶h‡Œú\ß·­ë™ .’€™˜}Lع²¦Ù“z'¯ 3°X-xxàvü{Â0[1µî?5Ó,Êóäud&ïh✤çSêv¿fD{Ÿ:øj Ž%Ì’Îâšcßœ&"ú×¹r¶ˆö$¼ËgS^"½yØów°ý ‰€oÍùu~S•ìgçwî¸á¤ª$—ï7.dΊšŽ~ž.õL¸ù&Ó?*ÿ=Ÿq½hàØÇºOÞa‰s8}}LgÌw«o nå¬Z± ÷Xо]Â{ŸàòØÅwÙe„…†fË'mÞ*ÚoŽi÷¦/+©ã'§Épp47‹üb?ÂýÝ~Òc<š]KOÿÇxû…™¸êJxu& §- ¤éxzDºa-üÔ÷’oš@rË@ªöm`MŽ‰ÐžÇ.w©Ý‡iQÀ¼XÖ$÷ äۥﳼü´aȸ>D»4 ß„‘¸§¤²tÖ:ÊÌ~DÆ'3~@;Íœ=`š½iÔ²!ëW¼ÏÔ#£¹oØ@†õ˜Ïâ5s™‘êÄìLl§a$'jFȯ¹ó]ž~ôÄ+w‚· ùÏaDç°c§œ­ òÔSئNgî?Ó8ìð!ºÝ <21™ üø/¸7Í]ƒ¦0uæó¬"ÆIÉÜö\"iSÞböÇßÑá¾ÆÞ9)oMå‘»m„µ¸†w%SöJÎYöŸZviAÊœçxèУü÷Á„sŸö®ƒáϸgÆë¿3y÷™J,AÄv˜Àäñý 3p+ {“·?}‰Çg90ûD‘8è&ö Ãl®:­3LФ¹Œ®:/lüuØ,䕇¸öþ14q×ù­Ñ_òL¹|]v§ÈEDDDä·MG0EDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDD¤ Èϧ¨¨Hƒ "r… ¸âÖYZ‘KJ§ÈEDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDäÊeù9*Ý2õ >;Pû7ü#Ò¼K?z6Äj€£p%¯¿ö^Cä––ž?µ±Š Þ~a)Qï¢O˜E[TDDDä÷0Lõû3¦_V\Øä@澘ó:Ù½'2¦kf(;vÆdùéáRDDDD® €éDDTnÔ§QÓ–ÄNãÍ/ñÍU7“èC×þ1Ú"""" ˜?‘a%´M7¯˜Kúî2šå2ë…ùÔwÉ‘pp[*)_le_Q&ïpZv¿žI¡9 yõÃjúõ÷&}ùfvváÝš^×õ¡Eà»ï¢:?Å)+Ùžu»aÿA"½÷¡U€“ýó_áüžÜ3¾-~&€*öÌ{™Y‡{ó§[Úà[ûŠÔÊÌœ²”¨!]©\¿†m{RãÛ˜Ž×Þ@ÏXoLçlËròó‘ƒÛQ¼z5yÕø4îÌàA±ä.ýœÕ™T¸GÒþº›è×ÌàªÌeÓâ|¹#›âj‚ã’è=°MýÌš©"""ò›ñ‹Þäc¸‡íï¢è@ 5µÞ¯É_Ãó¶b´Jfôø± nãÆŽsX[xl)בmÌ[˜CD÷aŒÙ—ØêMÌ™¶€Ý•®Ó¨ÉcåóÙá–È 1?¢/qùô³ Žºl„µn‚{î×ì>ê<¶|ÕÒwVS¿]>g Ç!6.Ø‚¥í˜xç8z…æ°úÓäØÏ×Ö‰þdmjQýnæö›{µ‚¯|ÀÞúýwÇxúEdÃâõÔkkìi¤ªOá·r똾Ĕ¯göŒedW»4SEDDä7ã—½+ưâa{…Ú‘Éq4Ÿ#„.I­ˆñ5Ad>¡Y˜4jX«"§™à6ýÒº=±¾& ߢM¤o,¦Ò Þa­iâ>“¯÷”‘ÐÚ‡ªìtv92(Æûì×:]xµ¿ŽkZÔà øvkÁê…©Ìçi Àe"êš´kè…,gOE/ujŒ~ó҇(s€ýàFÖæG2ðž¾´ö1€HƒàÀË©lÊíIT›f«ˆˆˆ(`žÁe§ÂV+ö“oÛ"Ú“ð.ŸMy‰ôæñ4iÒ’Ö-šãk1°LÁ4‹:u§¹É;š¸'é9¥8jL[ ½(ÌÎdË79dgíeWfŽÀæÇËÃIhâÆ¬¯÷RÖ*–ÜÍ»p6ºžFžuÜfdò$2ʇ“'¨Í6ÌÆ¶`ö¤ž¿íx¿ ,V ž¸¯Ã0[1Õ€‹ÊÂlŽØ³™7e2ŸŸhÃåÀᣴPÀÌ3óeeû‹ ¢ü°P~ò}ã1&=@® vìüK§‘¶(šî£GÑÅ ÓiðØk—ëôSÇ®Š½¤Í|Ÿ á4‹oJLbZE-dæ–“ ”ðÖqØÞÛÂÞÃV¾ùb†6Ä£®ÛØ 36ËÙ ÏßV]ê¨ÏéÂpoɰ‰}ˆ°ž¾¼ÅÓ]3UDDD0ÏLPÕäm^Ín¢¹®‘W­˜å¤t×jÖå†Ñ©K{z5kO/G_½õ +6çÓ> päû¼J®ŠõÀœeûùþ°‰ÀpÌ>Ñ{V²îp#Xw€òöWâ¬Õ [x±Ö÷X»ªšƒæ&Üíþ“tam]8÷ P<+÷Sèò&þøM=Î#;HMÝOþ}hjÕd‘+<`:Ë ÈÞo;ö̲CÈÜÀʯQ¿÷­´ô5Aå©peqæ°9mE¦d:4ôÁž¿ƒíM$x?=]É7ŸÎ#$¹3 ÝŠÈX¾€½ž Üë‰á¬U§¶Ê}lÛš‰-ÒÒ½I[[ŒË–Ãþ Ã<0¹…“gá­ÙxµéC”ÛO „çmËÿâj´Et ]p:+>Z€g¿6„:óÉX½„®ž$yê.‰ˆˆˆ&ά¥Ìœ~2>áÞöC‡sM‹@¬? k±Öc>‹×ÌeFª³g0±†‘œˆ9°6 ¹W ß.}ŸåÅàß  CÆõ!ÚÍ€ŠZ!-º7ƒ;}ÌÂÔÙlÇð¦41Žô¹ X¾*‹ø›àa¸qUcܶî§y›ˆŸ|eãyÛºöb·D(W»ë‚E¬ü0R§'¡M»12¹õô”"ù 1\?¾ñ2c?°WfâÚûÇÐä’\Šèàðú©¼¶®îê÷£ëEDDDäuEýñnge!Y{w±nU>ío DáRDDDDó ˜E[I™»WÌ5 î|e­¼ˆˆˆÈ/ä²?E.""""¿-º=YDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD~Oô(H‘Ÿ‘Ãá ºº»ÝŽÃáЀˆˆ\aÜÝÝñðð¸âÖ[ÏÁ‘KJ§ÈEDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDäÊeù9*]õê“lŒ™È="±Özßy$·^\„ߘãvY „óH:o½²–øÛ'Ñ-È|Ñå"—Š«äKžþó2¼ú8í‚I£;t|/v”d2m:)›÷Räð#:±£'ü6AÖ³7TSÀ—3^ãƒÕ˜"iÑm·éFX‹_tý§öŠ7¼Ä½/•q÷´Çhëù¿Ö'""—»ßæLÇ!¾|m2ol(Æ©m(¿§pY™ÃÚ÷ßc[éf¶}?óž|Š9‡Z2ú‘çx|bG\_ü‹¿Mû–ràÈcÉ?ždæ®úÜðÀ³<ÿÈHšü„gŸšÃUgk¨‚Œ·ÿΔ•]ÿøw—ÀÑ¥/óÌG»©>ë>w‘õ׎—‡×1õµµu\šúDDDSD.Ðþ9aäè{˜’V®ÓËÊ¿ýˆÏ²1ö¾±ôhGó.ù÷Žv”¯šÇ¶£.HÝéI÷I·1 ± ±Wõâ–ûFR?gŸï¬<3_ÝÊ'Ë‹ˆŸxÃ:·¢u÷1Ü;¢>¹© ØUy–|y‘õ×þ1¸æ¿ÓÈðõãÔ'""¿ –_³qÇ‘ïY•’ÊæÝ”™ýˆhÖ…äíˆt7;·¥’òÅVöUaò§e÷ë˜hfý¯²ü °è%žÎÁCc›â~ú×'Õùé,NYÉö¬#Ø þ é5¸­,€‹ªÜÍ,Z°šŒìR,Á1$u®õ~žòÊÌœ²Œ†7u£dÙbvøÝÀ=Ãb°Uæ²iñ¾Ü‘MqµÁqIô؃¦~æº×')›q®2MÒ+ExŸûùW§*3ßæ±7kjï)”fçPé׌¿—gx5jEhõ<¾É³ÓÆ\ol[:7<µ'˜}à 4Ws´ÊqF[Õ9_³§¦>CâýŽç>3Á­Û2ë+2ÖÐ<êôWÿ‰~\õoïïÌ# xñ?Žÿ±>QÀt9q:§Âv:k½ªÎbé´÷ØìÝ#¯#ȞņE ™þ>Üus{|®áƒy[ñé–ÌèXÊv­"eÁÜN÷ÛïÄôælo{'·¶8s%jòXùÁ|vÔëΠ1±8òÙž¶O?‹¤ÑÍWáUþóf¤°/òj®‹Gñ·,OI#·&ˆæ€«ìÜåǾ!³ù³ÔkÚ‰Þñ¡X‡Ø0kËv$@0l_¾Ù3j˜8©/aEu¯OWWÝe=B,š¥W«QþPYäÅ(®UbÂÍ׎æs¨ÚnÇ"aMÑŠ]G)<êÀ–xO>_{ÿ«bÚgd80*ÊýŒ¶jJò8bøâ}êzb³O(Þ”sÄqÆ? ¶ÆW?€£à ^'‡nþ™U/ÿÏõ‰ˆÈ0]”~5ç¾:ë×(~@åþµl)¢ß-ýHô7Q„z±oÚ¶jK§£ù”!tIjEŒ¯ "ƒð ÍÂäaÂ0L† “é,‡øœf‚ÛôgHëöÄúš€H|‹6‘¾±˜J§ƒêm+È4Z2âÆž4ñ0€(‚]¹¼<¿pPtÎòmÔ`NΈ!Xû5¬Ídà=}iíc‘„Á—SÙ”Û“5u¯£ î20ðmÕŸ6–—˜9k-õÇ$á_ò5sß\J1&?º\ÓU•ÇW½ÂËŸ}OäÐgéj>cÿ¬©²ƒÍçDV=cmÞ¸a§Ò~î+›Ï_?àÈgÙk3)èñ0‰÷„¯ÿÇúDDDÀ£ù`nêLí¯ WÙw|:{à ,ï 5~͈ö>¢lÁ±„YÒ9P\ƒ­~{Þå³)/‘Þ<ž&MZÒºEs|-œï š-„„Î^fg²å›²³ö²+3G`sÀAÉbŒ®ÇOÅ;BäK iÛ”Ÿx˃ȆþÇÐEea6GìÙÌ›2™ÏO|ÌåÀᣴkLÝë㲜c]ES@'&Ý¿O™Â½i>´Ô¨ý«ñõ81Oœݹ€×_x‡¯ŠëÓcÒ¿˜pMC<Œ3«ÅÍ örªj]ëé¬.£ nuλ ­ßAÁ²×xÿÐ5<òצxPñ?Õ'"" ˜'¾À|BˆˆúñcŠ 8çÉ N\0éve°cçìX:´EÑt=ŠáçnÝU±—´™ï³¡"œfñM‰IìC«¨…ÌÜr¢ã¬mŸúßs—{mÁÝzê=—Ó…áÞ’aûaýÑXxºc²žc}¢ê.ëå¦Y*€ÿÄQL~g¥‡JÀ¯îysøó¢z4´NŠ7½Á_Ÿ_Ž£ÝÍL¾=™f~u ´ø…ãëüžƒeNð<ö#Ïq´€£øîk9k¼ðúídì¡,/ƒ¿™ZÉsc‡6ôE¦ÜEÙEôWDD0/èËÒ+´–’=duêì ®ºðòjüHô3Qºk5ërÃèÔ¥=½šµ§—£ˆ¯Þz…›óé2Èë\ñ’Š=+Yw8Ž÷ÞH¬;@ yû+_jÁ/Ê×÷™äT¶$ÎÜ”eÿ@‘óBÊϨ݃Bñ¬ÜO¡Ë›øã_”Î#;HMÝOþ½ˆØ÷eë“KëÊ,6Õ±®=£¢5KÇá Ì|7ƒ¦£ÇÒ)(¨!{ãZ ƒ;Ъž×ÑÍL{eîƒçéQ­ð9ÏÕ¶ˆÖ4²¬`ÃÎRúûaà (c ^Mh|æ? ®£[.¢~7bG?Ã?ŸºQ©ò»i<ñ¶ƒ±Oþ‘„ˆpÌUŸˆˆ(`^ ·èN$x¿Íâ9©X{·$ОÅW ×SV­ƒ¬XJrØœ¶"S2ú`ÏßÁöƒ&¼1†á¤âP‡zQÏÛZë (Ol•ûض5[¤¥{7’¶¶—-‡ý…U\߉˜eóødN=’»Åâud+–fã 0áwÎòº¾°;Ð.8-À³_Bùd¬^ÂFWO’<ÍXœu­6gÝë*`ö Áúÿxí%åC’ð/XÁ;"áî~Ô·Bù¶¥l*£_T9;6}uÚ.ج5±>•|·`ëéÈ›áåÝš®ñãñiÿeIÀpšUmâ÷÷SÿÚ;‰s\e§-OæEÖMãàSKU”xc6ÕÞ°QžP¶ù<õùêh¦ˆˆæO`¸5 ß„‘¸§¤²tÖ:ÊÌ~DÆ'3~@;ÍÄdXù,^3—©NÌžÁÄvFrR fs5Z6dýŠ÷™zd4÷Ý{Ú©w[towú˜…©³Ù†áM;0hbés°|Uñ7^Åì,š¿ŠÏßY…¹^ í¯ŒWÊjL¾ç.?ûH†rõ¸[°.XÄÊÓ)uzÚ´#“;PïœëSo£îuÀÚˆ¾›²WgñÖ3)¸E4§Ã„'¸¹k &”dåc'‡”×þEÊé¤íߦóðUåì]‘B a Ð /³ÍoyŠ{W™ýüýL7GÒzÀÃü}HClÎÚËÇa¿èúϵ2ÐßDms‘ß0Ãår¹4 """"r©èÊ'QÀLQÀQÀLQÀQÀLQÀ‘+›EC òóq8TWWc·Ûq8‘+Œ»»;WÜzëo‘‹ˆˆˆÈ%¥Sä""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)"""" ˜""""" ˜""""¢€)"""" ˜""""" ˜""""¢€)"""" ˜""""" ˜""""¢€)"""" ˜""""rå²ü•îÿüŸLÏêÂÝ·w¡ž©œoßþ'söŸ¾ŒÙ+˜Æmz‘ܽÒ g9û×/!ms&û9ñíÀ€ëzÐÄ×|Iúì<’Î[¯¬%þöIt 2_t¹ˆˆˆˆüŒó¬Âû0v`l€ËQÁ¡6°tÕÌ6Oâ¶¡ç鈃Û?dfZ­Ü@w¯ClKK壹¾Üys;”÷DDDD®¼€ix…ûñ×õ£#qÏ›Â[¿åP×PBÏÕ{.ëWeQ¯Ï] H Ä D:(_˜KA¥‹/C[RDDDäJ ˜g&N3nnfpØq8KÙúöKÌ·å¾Qñxvrÿ‡ÿîLà¶ v•Ó®‰?'VZB»2ò–º*wQŸÎ┕lÏ:‚ݰáß ‘^ƒûÐ*À¸¨ÊÝÌ¢«ÉÈ.ÅCR×h\µ>ÎòÊÌœ²Œ†7u£dÙbvøÝÀ=Ãb°Uæ²iñ¾Ü‘MqµÁqIô؃¦~fÀÎÁm©¤|±•}EU˜¼ÃiÙýz&…b3ÎU¦I*""" ˜ud>'£àá5 IDATN§'઩àðîµ,ý¶¯ÖM´zãÓ& ׂ­dW6£‰‡öB¶ï(%(é*ü.åˆá?,bƬíì/1ب ½ö ÙÙ.à¬ÉcåóÙQ¯;ƒÆÄàÈg{ÚB>ý,’F7_…WùwÌ›‘¾ȫ¹vl,Åß²<%Üš š®²s—à8ÌæÏVP¯i'zLJbubìi,7Ú‘<|Á°}ùBfϨa⤾„­áƒy[ñé–ÌèXÊv­"eÁÜNWWÝe=B,š¥"""¢€yÖ|¹çCþùÔéï¹5¸š›ú4ÀÝ0pk܆(ÇB¶¨¢I¬;5¿!£4„Ž-ü!§’Ç~–~éE¯>ÃééVDÆò…|0ÓÅ­·÷!Òö£Æœf‚ÛôgHëöÄúš€H|‹6‘¾±˜J§ƒêm+È4Z2âÆžÇÂ,Q»ryy~9à èœå'Ú¨Áœ0œ=B°ökX›ÉÀ{úÒÚÇ" ‚/§²)·'jò)1Bè’ÔŠ_Dáš…ÉÄ£ î2̺ԺÉÄ›O=êùº|N’áݘ6QoË¥*¶>‡¿É ,¼ ñþŒ<ð¥ÃÐëéeXÉžWVðeÖÕ ‹q;½-[ ½(ÌÎdË79dgíeWfŽÀ怃’Å!]‰t?qþÙ„wt,¦mP~â-"ú@•…Ù±g3oÊd>?ñ1—‡ŒÒ¬1íI x—Ϧ¼Dzóxš4iIëÍñµ¸,u—‰ˆˆˆ(`ÖáÇ7ùœ¹€7#±§n'¯Üƒï3ʈ¸º)¾&¨ñðÅÝä"*Àzrq³W(õlvJËjpáFí(æªØKÚÌ÷ÙPN³ø¦Ä$ö¡UÔBfn9Þ”q–àVë½ó•{mÁÝzê=—Ó…áÞ’aûa=mA,žî˜¬0éve°cçìX:´EÑt=ŠQu—õŒrÓ,‘ß”Ëè¬wL"‘UßóuÆ×d”GÑ.Î`©×˜`ã0{VŸ\ÚQšCaµA~VN~.*ö¬dÝá8†ÿñ†ôíLB“Ü+*qÏÔ~Qþ¸ 2É©«—°ÑÕ“$O3g›Ó6PdJ¦CCìù;Ø~ÐD@‚¶:˼5CEDDä7ÇüÄO‡ƒêêjìv;‡C""r…qwwÇÃÃãŠ[oý©H¹¤tŠ\DDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDD®\–Ÿ£Ò-SŸà³µßqÃ?¢!Í»ô£gó@¬8 Wòúk_à5ôAnié‰ñÛ²gÍçå™G|ÿ(âÜβ@Eo¿°”¨‰wÑ'ìâW×y$·^YKüí“èdÖŒ‘_ԫㆲÂó:ž}q MÜkí%[xvü?p>0GÛzj DDä÷0Lõû3¦_V\Øä@澘ó:Ù½'2¦kf(;vÆdùÉáRäŠPð9o¤ôàC£±j4DDä7àg;Enò ""*Ѝ¨ú4j–H×ë&pk¯ ²¾XÄ7Gœ˜¼cèÚ¿/íÃlÚ "çØ<Šœ¹ošçÐ`ˆˆÈo‚åkɰÚ¦WÌ%}w Ír™õÂ|껇äH8¸-•”/¶²¯¨ “w8-»_ÏÀ¤Pl†‹êüt§¬d{Öì† ÿ‰ô܇V'ºï¤tçRÞý"=E.üê·¢çµ}¹*ØvÆÑQWe.›/àËÙW{—Dï=hêg\TånfÑ‚Õdd—b Ž!©k4.ÍùÕ˜ éyý˟ཷÖÐááîÔ;Ë•5‡·ðñ›3IݶŸK1í¯gâø~Äzéü€ˆˆüò~Ñ›| ÷¢ý](¡¦ö—cþ>˜·£U2£Çep7v,˜ÃÚ¨ÉcåóÙá–È 1?¢/qùô³ ŽžH~Õ?²ô úŽâÖ±ÉÄ;¾fÞŒÅì­üQ4tbìi¤ªOá·r똾Ĕ¯göŒedW»p•}Ǽ)dÚZsíØqÜÐ)])iäÖh¢È¯ÈEò¤Á|=wÓœùƒ§2“wy†OKZ2êáç˜ü§A„f¼Å£Ï-!_=EDäW`ùE[3¬xXÁ^a?íKÒq4Ÿ#„.I­ˆñ5Ad>¡Y˜;YÀÊœÞ «oÑŠˆÈï8`ºìTØÁêaÅÀ~òm[D{Þå³)/‘Þ<ž&MZÒºEs|-BBg/ ³3ÙòMÙY{Ù•™‡#°ù©zMÁ4 w?y:ÜäM\ ‹M¹¥8NL•…Ù±g3oÊd>?±°Ëà FiÅŠ1Bºyòn]Þѱš¶i¦È¯œ1=i~Ómt]ûó}6T„Ó,¾)1‰}hµ™[jùÿïTK¸\`˜O¿þÌåta¸·dØÄ>Dœv;®ÅÓFaæY®W3t ›\&Ó· cÇ'rÏþí‡ga.º‚XDD~¿Ü5˜®jò6¯f7Ñ´iäU+:)ݵšÔu¹ø4iO¯ëFpÛ}"9 ‹›ó8²g%ëÇ1ü·0¤ogšDà^Q‰³vÝŽB2Tžü*u–î!³ÈJX}¿Z ÚÀ=(ÏÊ< ]Þøùùáç燑ÃúeëÈ®´àå« “œ“×n:)Ëþ"§&Š\»k`— Œnz€9o¦‘W`Æ¿AÖCßY|ê‚˪ì­ìµ¬‰ˆÈ/ïg;‚é,/ {¿íØs0Ëq s+¿>DýÞ·ÒÒו§‚ŸÅ™Ãæ´ ™’éÐÐ{þ¶4àƒ›§¶Ê}lÛš‰-ÒÒ½I[[ŒË–Ãþ Z•ìøücVèJcÛ!¶¥-&Û¯3lèNí»‰lhœÎŠàÙ¯ ¡Î|2V/a£«'Ižüâ;³lŸÌ©Gr·X¼Žì`ÅÒlh¦ÈåÁF¯Ûn$õ¾ÙìÃLàÑìZzú?ÆÛ/ÌÄmTW«3Y8m%MÇÓ#RSDD~O3k)3§ŸŒvø‡7¤ýÐá\Ó"ðG‹6ðˆȰóY¼f.3R˜=ƒ‰í4Œä¤@<ŒÞ îô1 Sg³ ›v`ÐÄ8Òç.`ùª,b;‚Ù?‰!= 6¤¾ÏŠ#f‚ubäÈ„[9-`b åêq·`]°ˆ•¦Sêô$´i7F&w8öèß«¸q‚EóWñù;«0׋¡ýµƒñJY­™"— kô & ^Î_?;xlòˆgÜ3ãõß™¼ûL %– b;L`òøþ„éO‰ˆÈ¯Àp¹\ºHKDDDD.“†@DDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD~k,‘ŸÃá ºº»ÝŽÃáЀˆˆ\aÜÝÝñðð¸âÖ[*RDDDD.)"LQÀLLQÀLLQÀLQÀQÀLQÀQÀLQÀQÀLQÀLLQÀLLQÀLLQÀLQÀQÀLQÀ¹0–_«agéw,š5‡Ûw±· ÷Àú4ë4ˆáC»ëcÖ–¹Ü”oäñ±ÿà[â¹ÆÓtòÖˆˆˆÈÙý*G0íóüÝòvÚVö”Ლ©8¼Ÿ- ^ç¯Í`ûQ×¥i¨æß3”¡C'ðæÎ*mm›ˆˆˆü~ÒÌ]Ë?b]v%gf_âz  c¤ÆÙÊ…|ñú4Ò}¸ÿ‘qt ³QSøÓþþ/–,âÕ¹ÝùϸXlÚ>—϶ümÖ,œ˜°ºi8DDDäÌÔY‘v¤îòh$ÚÝuÖÊ7°$Ó’|÷8:…K+ÖàöŒºµ/ÙïïÄYZ@ñîõ<þà§ä¯ÞBŒ ªv¾É¤R1‚—_B¤ÅIÉ7óyûÝlÜ}˜*³7áÍ»qÃÍ#éu˜Oîû³sJH}dx‡§:zá*ßÃï½Ãg29PìÂ7<–¤A73¶OÞ&¨ÉžÃŸïý\ÿîŒï[Îâ”Mä‘´ýÃŒk²éoÎ'ý@~±=sﺇYÏXOûÞYÜóÀ§öâÎA•¤|ºžý5ÁÄ_=œIc»n3p,àÁ;ÞfŸggþ|G«f¯€1/òp’çyûx!õƒ‹ªÜµÌž:‡ÕÙ±Ñ(¡/c& ¦•¿ùìíü MÞ{èŒq{²y:OŽ™LSkžñm=Ï]7œcÛ4ô8ûù]øI§ÈÇ=:šæu^ôï|7½.ªÎäZ—A.€_[ºD×>fàÓæ6&ÿûß<{wg. gŽƒ_ðÒ33Y³û(õZ´¥u´…Üí‹xí‰7Ù\@»Q£hç`¥Ù w0$Ö ª÷2çÑ¿ðú’o8`#>>Wîw,Ÿú0¿¿‹ÓN¯dúÇ»pº[p–e³qÖ#Üù÷Ù|g÷ÄÅ»–ñú›ë)>×ýÃi¼öîf*Bñ.Ï#cñË<:õÊj¦|+o½0—ÍQíââúxŽú‡Wóâ_¦²-&I\ZÅîuïóäCÓÉ(w½}£Žqû‘óÕ}ÎmSêÒž'""¢€y:ƃyxò™!Ó¯Ó]Ö€C˘óui­Kjµß6à¬ãvºšóÖ]u®mSR£=ODDäwì'ÞEn™ðÜ£³È¨ßwòÌ==µž'Ѻ{aª+K¨tð?ÝÇn K Îm#ß\Âs·/Á»~k’ÚuâìAó@ œ‘cj8¼k€Wb/šû;QëÕ´'I~©¤–d±ó` '‚¯,±0yàc„¶ˆÂÓ‡w @±³ç¹Èy¶æš¾€{ƒ®t û„¹yø®ÀÎÕÇ—±^ÅA­ ÷<ÖÇÐÇÖç­¿ ߌ\ŠR'3)µv§äì,Ä{¶ö9˸íÉ=OÝFÿólQÀ¬+d>òÏ`–nu§cß¶„X/$¶ Œì/ÞÂÆ\;q O|ÈEÙÖ7yrêvª#¯ãá§>s2¿9§ÝXdëÇãoƱ&%…ek6‘µ•Y[YñÙ†>7™›¢Ï·µþÿø‹ÓâqƵ‚†a\ô8ÕýêDÀóÂÝôÓûxöW.œŽcGIÃý‰ ­k?WÈ„[p8V¾;oûgwþºÝÃbνmëN!‘ß«ÿñ1EîQ]¸nà……Ksp{ú51€>{ý#¶;pç鈴;/Ÿbï|-Ì¥Ùä—»ÀUEî¶LNÝ[TCÞÊé¼òæ|öÔÁã¯Îdæk2´‘Ž=¬ûúP­q.\®cy: ¦î@Ù×Ëù¶Ôu,Øîü‚MÅ€5Š&õ.ñѵò¯ùâÛ#¸pQ±o kòS}š‡ØêÌüÕÇ:ë÷&86€²2š%$’˜x<*)=RŠÝr!×'œ·3~&œ§n×y·ˆˆˆü~ýòç*Í!\sÇ-lüÛt¾Þ=§&ÎÃÍÛûÑ œ>]øãèøØœÄyA^ÙV¦Ü:‘BjÈÍ/«]Þ>¥l]·šÒu[Ù¾<žPÓavíu^4jì‡Ù(ÇËp„ôysX9f8Ýão`PýuÌÍZÁ³wï¦y´‰¬Œ½”‡q•%—r…KYùÜd6 ¤lïJÀ>#h`@áÙ?áy!}–™‹Ò(Û´ ­ƒ<1§ŸààšŽ9Nö“]¨ì‘+¤YÆ_«"éÔÈ‚£ÛqvíI¢JmÏ\Ó®6Ò÷oàD~‹û·â®ÖÁØ6kg÷¯dÅÒ‰Ì3?C§ÆW®ËD‰ 5ðe&;öŸ#$Â5×:2HؼŸlõ4ßÜR9•¦RíØy[.EDDä?ãæŸ"Ï<ÊæÕGqiôÍFPºLJ…Ö î}î°Ob͵x‰à’œY:“í§­6ëäÎÙÍ»HÉÉõKÛ9â7Ã)Ð㊄f8úP2°4¾¥ñ ¥b“{ibGâæ­œÍΧ.!„•†„M{I·åz ã({ögà^µ2î79_šœ+P½ÕTñ³×HÌkË&+¿¬h@Ô}и²[®Ù:nÕO<«çná\ε_¦K…HÜNmäpòå…l©qì<æJ…J^šý 3öf°faµå· WÊD–Ãë‰?wy¬ã›8”îMh%/L€-ý(ÛfgÂçïòÃÀ™ôk ’.t8}³>Âú›YüÓ§Œ™º—L²8³e3† äÇÞeø×È]{œ,Û…å?ýœ¥G²ÈIÞÍš_‡0ö“wùñó/™6c Ónú.f}þköl`Ùøïøy໌ün4«÷¥£q|ÛJ[Õ‹àÒ3eJ?ÚTöÆbñ ¤yo~Ý›žïò9g×1ôñú”u30Ì^„ßý&3f^Ü£HÙü=”ÁÙ00L®”kööe\\;Çö¢yy7L†ƒMº ÝDŠ­(mçóYôÐLÞh[™’v&÷Z¿>Ë‹ÛHßÿ Ï5.‹«aàÔ‚~sŽ_úpš?›w¿£É-˜ºÝ³úÌå=¡àÇon?DD䟘v¥ s%iÉ÷ü2þ6nãô¹llXp !Ð×)ïJ-%©Ú®Nûæ°bÏ9l×z¡î õ8Á®½É•ôƒë9Y"œ²^ùÄK[99~2Ïqz×_¬ØžŽSùЏç{a€Sù𸇨±?åÂëÈ"qÛnÒ½"(çië)¶ü2‚•‰e¨yß“tzèNJ§­`îØù$d^xåÖDvÌŒ%9 >ujùa$,aÞŒUÚѶk7šVw`ÿÜIl:™}åÑ–?ccj9jß߃êávp¿OZÍÅüŠõÛæ¬ÇÕ‰Ž=£¶ïÖψåd–òíÌ?–nÏ­¦Ö[“ˆùm“¿çÏ1ÿÌ{Sæ.¾iÓWw6àÝ©+Y9÷sZŸü’Íú±"ÅéëpÏSLu{œïç.cñïŸÒîôPí>‰c9±y÷téáÁÌ]2Ÿ‘=ܘöìý|¶5£ð¶¯Ü=ÏÆÒ»þÝ|ŸóC¬"vhGNý‡ì& û(ßkïI¬\5•7ÂÖ0¨û¬MR–ѧA;>>~g®`ɸ)÷×ó4j?”}Y…?~3û!""ù»ù×`N”nóW°mËvÖÿ¶š•€½wBj5¥fTN¦¼ÁÎâ߈¦562cÎ*µ' ¿ MWñ`íæ=¤V¯‰‹‘ƱMñ8Vj…‡åøÕ°¿0zPÞßÙ5áÎæÁØ_ã‚Gù<•KÄnÚGZÕHJd'°o÷9Ü£Âq7Cö‘ÕlJ¤Ñ3wêbx{CÂ?Ùv¬9¾¾@N6¦ˆhÝØ3¹ÿ8)†/‘5ªQÚÕ>8ûÂÈ[2/cgJiêwmM%wP/§Ó½’݉5©é äØpªÕÚ•½1•TaøœËì4˜oW98ÐrÈÜ[wP?6„ôâ³…ŸÐ¢éååÒ6áóu¼÷Sº•2u¨YV•ëË÷ëP¯¦=áO~ÉønÏÓ&ÐÔ¦ôþï>øg²Áùè&™ªðêÓÓª´ê„± ‹·¹ð¶›8çÞ;IŒÄϧÛòÓèþDû™€~:¾‡g¶îâlUßÉûÑ¡ØQ›²ïÎæÛæ[8š g—ƨ#uùrÑç<^ÖÔ%Òg‹|͘]Oòâ¡‚ù¦õCDDþ¹€ `vÁ¿zKü«·ÄfMåÌ¡ìZ½”ÍsG¦÷¶(7Žø7nOÈö üµ¬÷5È·QÜ*VÃeéâÏEQÑrˆ]G nâ9-ŸÅsÝäƒaÂÎÕwW‡‚§l g£ÊbÌXO|jåS¶—âE¥0/LØH?y˜sY‡YøÝ,ºRmVrrÀHÉÆæ ˜œð ò¸tÊÞο•!øXÖqâl6¸¦” Èu’Ù“îúÏ:ý{;ÊÝ3›³Î ºeO—Íg—µ„sO=ïKãÂ\ª1í*d1|M<™M/±3[Wp8m%9ÒãÒøÍ"+LGÓ°9Wå±Wüضb#'¬íœ/ IDATfå²Xæü¾‘ÌÎ8×zŽÇ+´â‰ `†w¾»Û?@·û£ t°qtn!mãœëÒ˜ ®ØAf…ÞÔô¾øªi:‹ÎÎ;ojÕ ¸ô>a8¸à`dq|ãÒÊt¢a©ËµpoC¤Ã¬ŒKæø–‚OǹþÍêG1¶‘ˆˆæÉ>¾”¿–gSí®¦”´Ã\ϲ5¨[¶*åæ}ÇôÍëIlR¿«²](u[…òëŒßÙR±Y¾m›<+⺄ûSvÞÀ1»JDùØÁ¡|²â…›|ŠwûŒcp Œ©ìØïÄíœóŒ<z¶†cUZ>ÚŠ’y2f'G +`X°·»|2œÊÓ G*îÛFÜž½Ä-Áê?ƒ¨ñ@jzörŒóë½xá€aÆÎ¢Dy»po9’ {SÏ_br¤dék쮆KžON&Ì&ȱæä¹ä$ÇšƒÉã&­ø”Ú%òŽ_oOl‰±ôkÝžoNÕ¤Ó}wsg÷Ox¨Þó´y¡U¯–|»é(ÏžÌÔ™ó˜òJCÞx¡oÏžÁ“…´}å¨Í±æ€Érík§ \Šqa`6ldÙl…>~3ûQäm$"r›¹é×`šLYœØ¶’-R¯¸žÒ8Ÿ—Læk¬Ô„så¶Ô)}’usÖ‘œßBfOʆ»rjÓvl8€%´^7ùÔ°Q¢aÁ&ޝ_Çömgp­~áîq{o?ÓqÆæ‚‹›;.nî”0ްyár2òk-‡Ô}‹Y¹ê(Î!u¨Ýî!:=ß›†‡Ø¶á8Ù¹úîäë9i?ÇsÝé”ur/§²Ý)馃Öm¹s–ð§lùò”/_žòep½Ö0ÈÚÁì g/íoÖãK˜µÇBHÍ@r1°¼Ïld{ŽeÊ”¡L™2”2­áË׿dÅY§ àËÝw1mý"Æ}Ú‡GÛ×Â#ñì…qšÍÑ9yõóõ”jÿ<ÿ5ñ{ù¶Ü2†ü°ûÛ¾òÛSºfÌ{ç³þôÅñžÅ¾a퉼ë{öxM±~•p<´€eÇ.ïAç¶ÏcCzê»ò¸å&ö£ÛHDä6sÓßMÞ5ˆ YNì¤dׯOùÒ^8’Ê™ëY¿:•R­êœ…ùÝ”iö"¬MS¶ÿ¸€DL¸æórÝÃÂqZ:Ÿå&G*tñÅr¦®?a:Q*ª¦É±oj…y] Äv¥êµSÿÀ±e ¼r޳oÙ\¶Ùšîd‚«Œæœ#ìˆ]I²©Uƒ\ÉNØÎžS&Ü"\0_>GŽ]éúTtŲibi^·¬Cl»‚´Òm©èmɧm‘‹Î0ññnTý¶ÍÜö2©ÿs,ò~œ¿Úø`ä7Î5_àÙð¼ý,Þ_ô "{“?z…¡Ö÷xÚÛ‚ƒO Îgÿbìè8×våhìPú}GŽëj–nOâîì5 {óöY¾¥W³R7OeÂN3å+…gm›¯ú0éÛþ]wmÆ“~„íÍvœ˜IÿWçóò@JÛ(°·n^æ1ÿ&¼tÿ«”ø ¡iËùöù¯Ihð †9àV¶ ÇKàpàfõCDDþ±€‰ÉÐNOã¸f!ëÖ/ vY*V³#.>e©xOª‡ûø•Bæ’õhZo=Óò›.Ì^U(ﶘ ÙÕõý;¾?ÒÀ¡LMívqÀµZÞ/W·øÕåq,sg³vÊ:RsJàÚ˜6­ëžŸåÌ'`:”¿‹–g°|ùdf,ÈÁT¢$eêÜOÃ(/LY'//éLýGÆ~öŸ¬˜¸œ4³;¾•ÚÑ¡UmÜòm[äâg¢&|ûQ&õmOÿ8(Ûø ÆÇ~J#Ws-èAÿØE”x¶7ïwÁ‘lªuxƒ™ƒ_ ¢=Ðh£^zˆçúv`¬@»_àûmñàsôÿ`ÆaÊ»=éýñC4-;ïpÚ¼4™ÁOWÀΞ‚Û¾ò5»5áË¿&âðä›<Ñø-κV åS¿2ãõj8¤0 ׯ|±l&O¿Jß¶_’`_†Ú¾eÉ7ÏRÁ°+èqÚܼ~ˆˆÈ5Þ«m6[±¿{㈾NnSöÅÛ‡Ç^ú·íÙf7ýõ¤­êEH³ ;:öîÚ>""·\ÐK|fE>®üW˜´éEDDDDSDDDDnYºçQä_̩ηħª""rkÑ ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆü—èkŠDþ!ÆXADDncžþT¤HÑ÷OEŠˆˆç¸ò_¡Sä""""¢€)"""" ˜""""r›¸®›|þ«× ˆˆˆˆÈÓ ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆˆ¦ˆˆˆˆüYT‘[Óú÷¢µ3ïïÌn¥©Ôüa:ß[o; e9_?7šr¾¡C°Ý¿£c©kòì0|ßúŽè ö·ß†µ&±oÁxfÎ^Iܱd¬Ž^”ªÔ€t¦VYg €ŒíŒíõ«œ:ðòÇ])ëh\~~Úz¾úcl/Žä™Êûýü;¬I ¢Ó—ŸÒÜÏœgU9‰1|õüPâ,5xzØ„;&³~Àã…«ÿgyâ'ñQß_pí5ŠÞõ]1þ%mߪûÓu÷ùvßOESä?­\Wž<À–•L–ÙL›ö ?X>§ï}ÁÚÿu292ã}¾ùõ»Ó3ÜKÊ!¶Íǘ÷õqøæ ‰'~gâìfôéTȶ>Ȫõ'iÒÆË϶‘¼y!þeãÊp©H½¶p °¿éðïlûŸKàG™ÿúˬmù5}Zûbþ7ö¹˜}L¹ÙÄ…„âxáÿeÃBqŠ{Š/çD‡`J©Dÿ.ûˆ½¯N_ÐíRh¬HH•@Ò_îÏüØÃÔ¹ÿrÀs¯\šãÓ¾giƒ÷iêwíðG˜ ­åL«vx_\Ìv–]ÅáêKr\1ÇÕÿqÓäI«®‘ÿº¶oU·cŸESDŠ8-88Y ;lÛÕÛR÷±tÌpæ¯ÚEbº3þÕ[Ó¡ûýTõ¶62ÍgêðɬÝ}ŠLÃï°;hÿTWjúÚ™$,ÃÄI±ì=‘†É½<5ï}ŽÎ-ƒq0 k;ŸIŠSk™=|4K·Ä“jïO¥–Ýx¨s<Ï¿R²–òëØ_Y½óVïj4ïÑ›»"=0ÖÓë™;| ˶$ÙâC™ZéÜ­5ÁÎçç` ~üfö£š¥®eH¯Ñ”}¾i³¦²jÛ²½ªÑüÉÞ´‹ð¸ú"w[Ù€qÅÆs¬@ë—úSÝÁ;×sÌx7éIãÔw™1j ‘}›â‘oÆ4ãÕ§©±l?ÝšF>ç²%meeœ'5:ù²4îÆ•í4«>xš‰ö/óþ«u9¿ 298¦Ÿ­kN¿OÄ?«€š¦®eH¯q„¼Ü‰Ä‰£ØìÝ›·^¬LÒµ¶QZÞS³nëâÖ?÷ißR›‹÷܂ƴåÚ·²ã™÷Zof~~–—×¼ÎÇ/ïOyNuSàëÈoü_ÿ~z>7³°èõ+úðf­Kv.ÕºÐížwL}ø¢Bô-÷áF%¹•Y±ZÏÿädœåØšÉL_‘ŠKµš”¼r–)û±¿ÉoG*Ñö¥Aôé÷•SfòÀqÄ¥Û k?s>ƧæÜßï#^ìÓÊçæ2fØr’l}h? ÅÔ°ϼó]š;±qÔç,8œUxÛWÝ­L~{ ‹sñÀ›ƒèÕ½is¾`ÄŸGÉ9ô`ùÈÛ¼Â+ï÷¥uÀþ6…Ù@úN¦¿ý!ó“ªrwß¼ø\{|¶ç«ÏærÒZøã7³…ÕìbÝŒÁÒâ^ùtwícÞÐ_9˜‘Ïæt(GýºžœœÚ‡÷?ü‘˜e[9–”… ;ÜC«S1È%}iš>yn›F2}C¶kÍøÔ¢¶o<+7ž>__lœÛ±€ƒnõ‰ô·Üظ2<kV‰œ±Ä¥^x™‡Y³*¿fñ5ŠPÓì£,ûa‰!èÐ:£ m”[ac¡¸õçê}¦¨Ï-pLÿSû–%Vƒ¾âî@ ]¿ãó~5ϳ‚ö§ÜÝ-jÝ/§¼ëÞO¯¹®c¾ù÷¡ØÛ=ï˜Í`ŠH1ض~J¿®WLv…EóäÃUp¼bÆ!ëÀ\åþ¯ºQÛÃB(q/ŒfÉþ)[Þ‚ÿñh“¶„{š ¸'Ìcù¼¤YÁþÌÎehÙ²1a^& Ä=h'&WSámWvÈ3둺u«R£xäÙhª»@0]’Žòëá#¤Ùt|ŽöuKa"¯ûֳ胃œÍ†ôÝ¿³âL(÷¾ý(uKšP]³÷?X}´%ÍOòøMëSpÍܬ6\ï|†»ë`<îiÀŸïâLàpeXs!ì‰Oy1t&‹—¬bîwsù p,I­6iwG.yf) ìËuâá–‹øfĆõ$4¿isIª5(Éœ¿6p¶yK<ö.Úƒs®øÚ¸¡q®ÕZPÞ:œ•{Ó¨Q‚ìø%l<D³zþä]pMƒk–&}éy_,@úæko£¼9£àmÝÖ«˜õ¿*@õ¹…ŒikÉhßÃdÆÀÀ0™0LÆÅ—wÍý)OÀ{»çS¢€)"Å‘ëf 3^¥(éé”ÏEñ6ÒïâLænÆôzq¹fªr¬`œÉÄæDÝ»<8¶{ +–íåÀ®-l[‡Õ¯þ…ɵ6ÔõÀø^O³¬n=ªF5¤n½z¸ÛAÒÆBÚÆ!× ÙœÞÕ÷.ʸ\ü­þm_ã€Ôµ`v¥L¯K³u†#ã|›IãÉòªCù\çƒí«h7Ÿ'ÒI:\ÐãY8„Þ¬~…Ôì|¸s%8Ô;W_0tnÈìAùæP¾ù#ز“9¾c«æþÆÂQýÙ™0W»„æÍ6F *D÷¤æŠALø­¯w̯Q;|j5Âsúvž¹ƒºö;YµÛ™ˆÎØ%ÝȸºðÜ#¨šÍ”%{Iãäòå$—íH¤‰´…Ô40;î{é€sí±f@êå6  Yàuõϳ-ŠúÜBÆ4üCûÖµû‘ÿþtåzu/V»…o›kï‡X >kS´ížwL‰¦ˆÕ7c8Û™cÃpnH÷] ²Ï;eqq†”­ü>è#%W ²N-šu£fÈpÇ^œ\‹ zÐpêm\ÎÆõÙ8îMfŽ£Í«oР¶|^ &ÓµŒ†vŸ§Õ00°‘s­“Ĺ¿©ýHÙÊŒjVܾd˜Î„ß³iÖ3š 0,®øWmA‡ªˆøù¾XÑèPÊ]Ù=·tìÅC‡[ëþü³€_=jzMcÅæ3Ts_È^ÇZÜhI76®Î?ÁƒŠMCÈ¿„ødW¶®L"¨S-<Ì\XM­€á€“½‘k"÷ZÛèMÚs,w,]ç8,hL6Nn昼‘~X÷P§«×uûië*=ÛêÊížwLÉ­G×`Šü7¢(NÁ8Ÿ‹ãxŽžÞ>xzûàfÚˉ3‰K³‘ºu Õ¤ÇÀtëÒ:QpJI½pÍž•¤SùmÖ~Ü¢ÚÒþÉ×é;x0Ñ%w²xÁA,¶}õçV÷r~Ç7søœíÒ¬Äɘ úd's œŠÁ-(KâöŸ½<Í‘¿‘ø,‚| yÜtûQXÍ®ã לÉå»-ùª¨l2f;ÌFþoÕîõŸ CÅx挈ádv~Ó~DÔóâð¢lY¸ û(eóÆ—[µ§­g媅lH©H£(/L…Ž»kÌP]s «Èc៼ս 1=—C›ÿ©}ëFµîEšú½ý°°uÝJÛ]4ƒ)"Ø—oGãÀf}õ#Î][`=Àúß~fIÎ4r1cqóÂ>uk¯Á¡¼IÛçòû Øœö°/>ª9{YöË,N™ž i¸™W²ö¨ Ÿ¦”(°mÓUaĵÆÔ÷6‡NŽ5pO^ËÌñë¡]n@ÄÍë‡C5ÛAdbn#³7µ{ŽËÜ Ì™?±¿%“mvƳt8uŸH˾)[Ê´çáö ølæÉü/Õ€ê>S™ŸE`‡›;¾ *5 ÁØGX«j¾®¨ã.óê€T¢ m”_ô±ð*hL;›þ¹} ³'¡õ«°pê@>KìÏ€§‹’ ¬ûuÔãº÷CsFÞ>¼\=Ïå·Òv—Øgl6›Me¹>G2U¹~ÿѿĩk0EDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDD0Eä_ çt Ÿ=Ú›yG³o¨kü$Þ8š¯–'óýØÔµ y¬'“÷þM[3e9_?ú ¿È*ví2w£÷Ø–öïÿ—íy“Ææ ¿vkûþüžo^~œ—ަw÷ž úø'VÇ»Ü^ÆvÆöŒæ…Þ£‰K¿b-iëùþѺ>Ò·2ºG4/<ü2 [¯îcb _<Í Ý.Œ[2ëߋ慇óþ¼ôô‹|ÿË*Neé=Kno•@äöb¸T¤^Û8Øc¨ÿ­íi=Êü×_fm˯éÓÚóz,frdÆû|óë9":w§g¸–”Cl›7Ž1ï ëãþ4ðÍU¿3qv3út *äÀwUëOÒ¤_®úÙHÞ¼ù-^®+Ï?Ž`ËJ&aËl¦Mû„,ŸÓï¾` PQÀ‘ÛƒÉ=’V]#Uˆÿâö´ÞFc1c±³÷ãÕé º]  ©HúËý™{˜:÷_:ȹW.Íñiß³´Áû4õ»vôöó!᯵œiÕï‹‹Ùβë¯8\C}IŽ»"$—$($Ç ÿ/ŠSÜSü¸x9(`ЦˆÜZl¤ÇýÉä‘SÙ°ç4v‘4êFNî%R÷±tÌpæ¯ÚEbº3þÕ[Ó¡ûýTõJfÕO3ÑþeÞµ.Î@&Çôâ³uÍé÷^(Ó^†ï[ß]Á멵Ì>š¥[âIµ÷§RËn<Ô¹ž–Öáß[G& KÆ0qR,{O¤ar/OÍ{Ÿ£sË`.ô)+a)¿Žý•Õ;O`õ®Fó½¹+Ò`=½ž¹ÃǰlËA’->”©Õ‘ÎÝZìls:†/^üˆAŸsg©óëÎØþ ï~‘Åãß¼BÅbÖîêr[9»n4ßMžÏî^Ó®Ç£Ô tÀ ˜uH]Ë^£ zª5‰¿MeC\îUï¡Kê;”yë‘Z"„&O¾JÇZ^˜ éûÅöÊ>߉´YSYµíÙ^ÕhþdoÚEx`J]Ëg‡áûƸ ëÃÌ£ÀÏÏòòš×ùøÍZØÚö8B^îDâÄQlöîÍ[/FâP`‹Q_ÛébŒE;2ÍgêðɬÝ}ŠLÃï°;hÿTWjúÚåÓvÙ€qÅioÇ ´~©?Õ¼s]fÆ»IO§¾ËŒQKˆìÛ|3¦¨¦8MeûéÖ4ò9¿-i++ã<©ÑÉ—¥q…캆' d§ëmLnï¿*È-/“V1öýØìÐŒß|níüÙ>r<‡/^ו}„Øßä·#•hûÒ úô{ŒÊ)3ùaÀ8â2Ü kV‰œ±Ä¥^8øffͪDüš5Æ×’;¤neòÛYœÓˆÞD¯îuH›ó#þgÁÅm=Íò‘18¶y…WÞïKë€=ü9l ‡3ôLûCæ'Uåî¾yñ¹öølÎWŸÍå¤õ&×.ßÙ°ü2>žŠ]úóÊ›=¨–½1ïdwª­àZ§_ãÊÁÌxŒÛI¹GÞåµþà³ëW¾yñöT|œ>ù€NåãY4zÇ²ŠØ÷ì#,ƒ¥Å ¼òéîÚǼ¡¿r0#w6  Õ ¯¸;ÐB@×ïø¼_M‹ÔöQ–ý0‰ÄthŒ]!ý-V} "E²ö3ç³alpjÎýý>âÅ>ݨ|n.c†-')¿2;”£~]ONNíÃûþH̲­Kʆî¡Õ©ä’÷g_š¦OÞƒÛ¦‘LßtÍk>->µ¨íÏʧ/„fçv,à [}"ýóû`eÅj=ÿ““q–ck&3}E*.ÕjêL4ƒ)"·–SKe³©!={?@ª„âoÛÇ{ÓÏ‹ÌeáPîÿªµ= „Ò÷Âh–ì.ÕZPÞ:œ•{Ó¨Q‚ìø%l<D³zþ˜9vi¦/uë4V¥FñȳÑTw7€`º$å×ÃGHŠÛTà:ÊVvÈ0ÏàŒQ†–-æe‚@܃vbr5]\Ÿ£}ÝR˜Áë¾õ,úà g³!}÷ï¬8ʽo?JÝ’f ”@×ãì}çVmIkç¢VÎZhíòŸ/.A䓽hUÝƒŠ”~ÑÊá‡1wãÔõ[¬:\œ +û@wUvÇÀ‹f•'°ë\îo»ží"˜õå’³!}WÁ}oëXm¸Þù w× ÀxÜÓ€?ß?Ä™¬¼Ó†ÉŒa2a˜ Òw¥í,,MúÒó¾2X€¬½Ó èog\âŠS_×"E Ç‚ÿñh“¶„{š ¸'Ìcù¼¤YÁíÊ£•áBØŸòbèL/YÅÜïæòàX*’Zm:ÓîŽ0\Ìy_‹}¹N<Ürߌ˜@ðž„æ7Åb.Iµ%™ó×Î6o‰§‘ÂÞE{p®Ó_»«¯Â´mý”~]¯˜D ‹æÉ‡«èL0EäÖ’¸'£t§ó§1/·JQø˜ÿl¤ÞÅ™ÌÝŒéõ ãr…«+g2!,‚ú¡ÙLY²—ôˆ0N._NrÙŽDú˜áÒ¬W6§wÇcõ½‹2.×c‡Û×xI‹&¸ynÌp(׆º~ßëi–Õ­GÕ¨†Ô­Ww;R³+e*x]ÊC†#ã|›IãÉòªCù\ç-í«h7Ÿ'² È3«Ú]ƒ¹4UË9_êÉ#ŒpKâIÉÜU¬:œoÏ?Ç ¿7°ØÛQÂÕ§ LFzÑúîu¾½àPï\µsÀ\èù§¢¶íLp¸ï…ƒAac+•SŬ¯á^”±8Q÷.Ží^Êe{9°k ÛÖÆaõ«_Àvó |óG(ßülÙÉß±ŠUscá¨þìLÈ«]BÉÿTˆîI̓˜ð[ ^ï˜_£vøÔj„çôìu?ú‘/^¶Ç§ò´¦³‡)~íòË%ïäÑ{ b' dö)3¾U:ðTß(m\Œ:_¡}/³'¡õ«°pê@>KìÏ€—«¿íÂÆÖuÔ·(cÑ¡â#<ÒöK~?ˆÕxQ¦F;Åòo‡óÇôD¾P“¹Ÿgö¦vïÏq™;9ó'0ö·d²ÍÎx–§îsiÙ °Àœ¥L{n¿€ÏfžÌÿñR ¨î3•ùQÔ vЛ’HqßÛl6›Me¹>G2U¹~ÿÑéq"LQÀLLQÀLLQÀLQÀQÀLQÀQÀLQÀQÀLQÀLL¹õ6›Í¦2ˆˆˆˆÈÍ¢LQÀLQÀQÀLQÀQÀLQÀLLQÀLLQÀLLQÀLQÀQÀLQÀQÀLQÀQÀLQÀÌ";¼z!kŽd`»Á•çœü“×££‰ŽŽæÁ÷—“THƒYqcy&:šè§G³?«ˆË¤®æèh¢£ßbyÊ5.Ê2[ÒbÞŒŽ&úþ÷Y›zŒ¶¤ÎVN.x‡¢{3ùpÅñÏ}aœ]þéGì™,Oy‘è‡Þ!æ„Uï"""ÿÏ€9â“Á zíf¼‘iåÔºö\ø_ö¶¶&ÛþþgÇ3å…h¢£Ÿ`Ø® €ÿXmÉ›7f3TïLË@; ‹“Nxùúáçwá'¸Îf -:ÅVFÛÀ?1üDDDn–ëyRŽ HÛȨ7>ÆöákÜì€Qì|yŠuó÷\þÖVlK¡^=×â·U5ysìXr0açX‹°Œü=þö:[IX<ÅÉÎ4¹§&`=Ëá„,(÷$~Üš’W}¤ªA‡.¼·h"‹¬N{³¶“ˆˆÈÿ#`^’¾‰ŸÞ¼Æ]e‹ ­§Ö³°Tá;Oñˬcl‰ÙFJݺ¸^hÈš¸Ž_†þ̼G°úV§m;¯«fL [Æ–´”÷ºÍNS$ý†w'®o&8ËŸot!¾Ïϼ¾îò2?½EÍ`KÝÏÂq?óÛÊÄŸ±áV*„Zí¥[«P\L`MøƒWŸÅõxî1wb&ŲãøF´£G¯©ái¬œZ;…ãæ±áà2 G|BëÑ¡ûã´ q.´FYqcy¡ÏtNxµà¹öéÌœ¾‚ƒÙ%©ÜäžéÖˆRöF®×Ñ€—ž ௠±Ðõ úÕ*QhŠÒ>ØÈ8ºŒ ?Nbñ¶Ã$ÙùP®út}âªy˜ó_ÿC¯Pq|¿"Ô¹à¶!‡³[f0jô¬Þ—H†Ù…Rá¹÷чiVÖéêñ–ÏÂYûÀíZ†:]ø]"q§À®²/.ùÎ×;Ú².n‹b˜sˆÖ]Êb§÷‘rã7ù¤oæ§w`s±®!´rrÍöæÊ­h~GCü€¬-1lK¹3ö0þ­˜º>ž§Rø²ƒ©#c8™»™¢,“›Ù‹Ú]ºPÛÀް{Ÿå¾|¦Ò2ã˜Ô¿/Cæn!>ËŸÊ•°ÝÁ‚ûÑoüòœðM]Áà!qÊìˆA ›¦ñåÈ ¤ØÀzlŸ}ü+«&ãV>œ°@3'wÅ2òßؖVŒr%Æ0xôZÒ=ýpI=ƶ9_ÓÿÇ-œË¤S72üóɬ?E¦­˜}( ýœÄÅ|Ñ÷Kfn:ŽSÅZDøe°oùxÞ{m$ÛRmù¯ßäY¤:Ö¶õäB¾úp Kö¥à]¥&‘AŽnžÍàw‡±6ŸóÙÖÄM¬>v¡u v¼°ŽÔcI…œcÓy÷ɈîÜ•gß΢Cé—>ˆ8Õ!ÔÖlâ¤.Ź&à\© ~Å9åi=ÁêûƒŠÍªàXº>@ÖlOÁ†¤u™uðmÏC¿æóo‡ðfs÷\e™+NÕ¬Cˆ+@ ÊÔjH¤ÏÕ“¸iÛ§0ã àÚ”7¾û‚÷ßÿœïÞn…'ptÖ$6çIv¾tø#C¾Έ¾µqÒölçD¶ô'(Q1œÚ~Èן àƒzSÛHÞÏäâ$WšôÂwŸÍÐA÷R 8û «NçäNÛ”êüߎü‰×j8³×j?“c±SY›ž­^ã>ÏÒ»ÿ»t1àÔ|&mHÎý5½‹PçìBÛÎ<¼†Y€OsíÕ‡þF¿»ëUɉ³ÙW.8²™#€_åR8^\Ë©ý$ÖøÝ¤úW%Ì/›„msøö½Q—kà@e?àÈFâÓõ¦ ""r£,7Ú@‰¨|øòøãÒ5ë‰Õ,ˆ¥YUw ;gÔñâ÷Y‰lŽÙAJíHŽo=@P²A3*”0W›Gá²0–ó7 ga™ë‘M➤ÎQ-¿p¾Þ¹Rsj¹ÿÉŸg±ëd6QÎÀâJd™ó—8ù—ÁƒÕ·f‘c3p®ö(}<×±xéB†¼?œ}{÷p4ó|8.Öý$%"¹£Šà܈†þS™|,ž Y4ñº°Œ]÷µ¤T‰ó}ˆ/B" m?·mG8ýç<ógž­È‘]'È Éoý@vaÊäh!mÓ¦:¡«Ùzr.Ÿž‹K™HjÕ®O§§šîuåе‘~æ,Y@ Ï—>9™½ëðÈÓe¡d "}±Ë:Ää>/11>–i›¡Z}W “^%k2§ÓrÀYßÞ%""ò ˜%¢zðQŸÖ”v(ÖÕ—$¬ZÈAv1ô©ûš;vl‰aǹÜmç#˜‘»i“)×uw6l….sãr·uq=9¹Ó¡aº< œç…ØHÛ>Š>oÍâ8nT¨[†«±å—iìȺ‘WAþý³sÆÑt}( ýëùYRÿö½y"Ò%w¡q(Y ;vºþüÙ mÛÑ¿ï eÉÌ™Ì_²’m‡6{h#±¿Í%zà÷ãrLv˜¯cÚÇz| „ÐóÓhåsñ€žÎ¶ÁÏðöÂd6-Ø…]¯ûiéµ™¹ÇçÍgÖPÖõ qGSó ÷Z…-“Ãg{€$ÖM›Ä¢®ÐÄ5ï"%*ßKû2Ë™|(–zí#<ÈÄ¡mq$wÝO„«…Þ¤cÆÉ½p†c“?ä­í%9·kG/„®œœâT-™EŸcgY/ÎÅÅ“ xµzˆ:žœÈÿEêéÂڷǾE{Â~ÉŽ…ƒèŸR Û!6¬ÙG²]5žù¦>×<×_hí(SHÛ\“Ù¸|1ÉË7²yAeüL‰ì‰³Δ+õµ¶ö‘°–#ÛŽÞ1gnqó¦rdÆë<ºØ÷´cœÊÊÞËCÕ.ÜÉŸq”Ç€Hõ¦ ""r£®kºÆ0__¸8¶b!‡Ê7§ºgîÕ;R®IÎ@ÆÆìÌ ã±^¡]UJœ;ÂQk9Ú>دܯér¡Ë\û¼¨Õ©9¥ qÍtbe^½ŒC9îÿàžnN€é(Û¶ÿÊ´è9ˆ¡hÄBéö½x¤–¶S:f£j÷>ÜÏŠ ')òm> èܺ9ÇâIvò£JûWøà±Ê8´ ŠÓ‡Ú7û·åAÏÐ2̃“k±xÝq\"ÛñÜ W¹£¤ù†ê\XÛ.QOñ^¯öD•68²q%+×ï#Ý7œV=ß¡gäÕ_ódö¬JÈÚ½’>8T¸Ÿ·ßxºe=09Æi‹/›wç÷;ta8ãà*ve‚oí|ô5˜"""7̰Ùlúû%·¨ËßSy÷8ìÿ]íÿó¬$Ì~ƒgG£ñÛßÓ;©ÏIcëwÏòN¬}7H_´.""rè‚3ù1S²ñƒ4q=ÇŠßÖpºlgÖ1}Y2Τ©ŸÂ¥ˆˆˆ¦È —îZ 6N&&¾°;ª²‰™Äz[ºu©~é/H‰ˆˆÈ uŠ\DDDDn&Í`Šˆˆˆˆ¦ˆˆˆˆ(`Šˆˆˆˆ¦ˆˆˆˆˆ¦ˆˆˆˆüŸ]ןŠ\µj•*'"""r¨S§N±Ÿ£¯)‘›J§ÈEDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDDDSDDDD0EDDDDSDDDD0EDDDDþ¿óðê…¬9’Áõüsk¼MtôkÄ$æþ„ÔÕ¼Mtô[,O¹5Š–sòO^Ž&::šß_NÒmö×ܳâÆòLt4ÑOf–v¢[w¼Z9¹à=ŠîÍäÃy7TÆîŸxúÂ~qú¬dsxÊ‹D?ô1'¬ÚŽ""òÏÌŸ fÐkŸ0ëàõ…Ì7+§ÖŰçÂÿ²·Å°5ùÿP…ìx¦¼Mtô Û•¡‘üÿ¨÷-¾ lÉ›7f3TïLË@»ÜŸòˆýi'ó,m!°Eg¢ØÊèqH¶i“‹ˆÈ?0sl@ÚFF½ñ1ø›Cf‰š¼9v,cǾEç[!_žbÝü=—ÿŸµ•ÛRÐñXn­ñj%añ';Sÿžšx—b'ç6ÿÂÄvú™ó<Ãð¨A‡.œ[2‘EÇ5‹)""×ÏrCÏNßÄOo‚^㮲Ž×{(<³•™£F3gÝ>N¤;R²b:>Þ;Cœ!i)ïuÿš¦HúýôÕSþàÕgGq D=ž{̘I±ì8¾íèÑëAjxž?hæ$meÚÐü±îÙþµèÐ1¿OçHÀC|ýÅ}Z¬œZ;…ãæ±áà2 G|BëÑ¡ûã´ q¾f_¬§Ö³°Tá;Oñˬcl‰ÙFJݺ¸^xRáë¶‘qt~œÄâm‡I²ó¡\õ;éúÄ=Tó0cM(¤®Ç˜òro&8ËŸot!¾ÏÏ ¨ç|UÈ(¨9 E«¥5q¿ ý™y`õ­NÛv^j+ÇfôåùŸ^õˆC½·Þ'ÇÔý,÷3¿­ÜIün¥B¨ÕþQºµ ÅÅDáý÷4×0ŸEœÝ2ƒQ£ÿ`õ¾D2Ì.” o̽>L³²Nµç’O½_üˆÈ_߸j¼¾îo¯…½þ+dųpÖ>p»ƒ–¡N¹~ˆY?-"½Zzxÿ—Ǔs=ɉЖuq[ì˜C´îR;½GŠˆÈu¸ñ›|Ò7óÓ»?°9õzŸ¿‹1o¼Ã˜¥{9íZ°2NìŒáÇw¿á¯“Ì¢¤®`ð¿8evÄ ƒ„MÓøräRl@v<¿x‡ «’êW•*^ñL<#¹cб9|öñ¯¬:˜Œ[ùpÂÍœÜËÈb[ÚµÃÓÉ5 ؘ+·¢ù ñ²¶Ä°-åBä*ºsóEß/™¹é8Nká—Á¾åãyﵑlKµÞG“µ»t¡¶+€a÷>Ë}!W¿Ú¢ö± Zfìaü[1u}<)N¥ðeSGÆ\qz5Ï<ŽÕ©_«µjÕ¢fd9.Æ{g{L™qLêß—!s·ŸåOåÊØŽî`Áýè7~EÜÆE®áÅZœ\ÈWŽaɾ¼«Ô$2ÈÂÑͳüî0Ö&Û n/ÃóêzW,U¤mpÓÆk!¯ÿªþ&nbõ1° ­K°ãå}z妤Óc ñÎ'‡;Õ!ÔÖlâ¤&1EDäÿ0çJUðs¸¾çžÛ:•y @©h}5ˆ>ÿ–7:CúZf¬:ŵoò¥ãÀòÝpFô­¶g;'²!mûd¦ÅÁÿÚ»óðªê;ãï»d»¹ÙWH„„YT@DE±–Ö¢ãˆUËÐÎк!(›H7«(.]Çé£3îØÒ"’D  "eßIH²'7÷žù#A²ß$ Éçõ½W£y ªÏžÅ6(žQ3–ó›UKX¶b>£<²cœ(kã“Õy–¬´c€‰A‰Íõ¡€ãŸ¤í«¿Lî~ÝuœÎø€Õ4ùq/˜Ëü…ÏòPœ Î}Æ»»ÊÜ·ÑéCß‘©Äù؈NGbhóÁèδ±­Z”f¿ÃºB |*ËÖü†_¾ü*OO h·KŽ|€ÿ|â žx|wEUQ4‘Çî„kßû|rðÏS«ÅÒ¥¿dõ¢ÉëÞew…Ñír_Ãæ‘«6o;@èDfÎ[ÀÂ~Á“w¥’4ØÊÙ Õí//§Žèæõ÷ëÀ>¸RýÕÝö×µX[mþnòˆ!½ø:_Vâ÷vâ9þ!îìëÙúfz÷fHŸÃ©j½AŠˆH×X/w¶¤Y,ÿ›‰°teî:ÎÉ£–L/O;#æÿŽ·d€Ùйâ@ë³ú $1ºþ²¼Od4dQètà2ê8wà€âhúy›/¢ÇŽ!üý8Ó0Êæ;l& ‚²Ùüt^]ú[Ž9LAm}0këò¯óliÇ2ah&_Ʀ³vÝyvoÜOù¨$.¸]w-{ (Þ°Œ9šŽæ=‹‘.òŸ  ðMšD|Ã=¾ƒ'’° r9XTG’»ír_CÇXG(ÏÈ ôÊbOÑzžt=öèDRFáîG&\ËŽ?ºY^ª÷å(—Õ_Ým+'%p¶ [ÃY¤“Óid}i<ÿ6c(¾¦º6Î|¶Î2Š«\à«'™‰ˆÈ·0mI³X±à6úxuõîK£aˆÒh”xLf+æ‹S´•ŸÌ—†_M¦&ËtÕ9[ÎÛì?UûþÀ‚gÖQˆ?®͸iÃøçÿ|Èþ6»ãäLf:õwdÍ#÷°¦ñˆÑ?7²¿bX·ËYßèÈ©óy8ÑÞdôÏ+¬ìwÓÆŽÕ¶Ãml§–FÃŽiò²Ùì&ßTî›kvR1ógZŒ&êšEàFÿ¾xÿªÑÁ}춆MY"ocñëÙò—¿ðÙ–mìÍÍ!#7‡Œ×ó½çŸd€Ûå_Þ‘vYýÕÝö/cF¯'MÕ—u§Ãàµ9?àµF¿Éûïç±ÒU¼ü@<0uù^j‘KŸž]æö¤‡Y~Yá²>ßÅFb.|•I^ `”±ó<:ûG¼ðy{—ÈÛYfLý2˲?ç`…F%‡26=µänù‚B òûϲ짳™žb£¢½g:: ÉL¯—&¿BCC~‚ê/AÖì&m5n×íIX\\7"‰¤¤áÄúTSVZ†Ãjéä¼Ñ$œs9mlÁ“ð뢱g¾ØÄÑ*Œrö§gSÖ^©Înâås ˆ¾û)æŽ Ærqß è‡7P±+­áñNÓÙ^xôaPˆµCÛ宆MÕqúóßóÒëŸp,ú^¯~‹·^YÈ÷bMà<Æ—»ÊêðòZ«w[ûàJõWwÛ®E¸ôôǨ,®l8†, ÉЄHHB¿†m LB”­¾ß¹*9_XüòÑ襈ˆtõÓ­ {óm\f,—=ÔaÂ>lƒw±¡ð#žüñûžaßñ à3’{»€MؿϤàÖŸßÀss÷ããǃð °%œ~o9Ïì £âà~ .Ž(¹ZË—™¤çÄ1ûç+˜zq˪ÙûÊ¥—ñUÚAÌóÜ­ÛƒèIS¹níïÙŸ¾’…å£ékä²kûQÊ<†1ç¥1tè™G&O|=JÉþð]>ÿ×0¾ñ³;ÒF³ûZ¤ÜÃ-Á»Y_¸–§çl'Ư„ãí|£Ë(gǯ‘U à‡ÏÉYý‹†–Gßάißejô—¼—›ÁŠyG‰ïk&wïqÊ€ÞwÞÃp?T¹Û.÷5lÚ5-ØýÊÈùr3e_æ°;mæó>n¾Äö%&ÒÍòZ«wdË×nòûfúkûÛßòžXϨDz³ƒü½ùTOë/^ ¼÷ žýzŠö¯y”…ˈºý1æNЬ? ¨)`!Ð;‘(o½AŠˆH×tiˆÂd¹á²aY¶¡<üüBf\C`é!ö¨%|È­ÌY2Ÿ›B-][¦Ï`f>÷cn¿. ïŠ| œý™úÀmD4ÊÕ}¦Îãþ”¼Œsäž6úоÛà[wál>¶5<€þÔ¸lÞÄÞ”„/P““Æ—»uƒ%r O­œÃ-×R´ýs6gbO¼ƒÇVþŒ›Ã:ØfK0)wO¤œßþsk[œ;t®mÕr.ûO"Ÿg,SfÜHp›s8©ùz˜´Œƒ;¶±m[ýÏ–ìÓÔxÆrϲU<:9žÞæöî̓È!Lš½’÷ÅÑÑLÓ¹š°'=Âsó¦’ÔÇD~Î6¶íÿ¯;¬[Ô_/±vã núßå|ùñvv#An®:%Ù|ôE¾7üˆñê¨""ÒuÝrê8—ýzçS²§ÚðÀ/r£ïúî›<?sw]·¨¿6æ¤(mó^=ÏôÁ÷úx´» yï/àÇï0ç¥EL SÀL¹Jh\Ø=,ÜÞ7˜×' fQæq<"¢€)"­«ªsàc홇ÖÅP]Yçl5|OŒÒ(]s“ú¶ÈED0ED:¾{jðvÊ[ ä"" ˜""""" ˜""""¢€)"""" ˜""""¢€)""""¢€)"""" ˜""""¢€)""""¢€)""""ß"«J r•q9øÇÞ£<•SĶ j=¼HèÆOGÇp¨µGŸþá½ :Óô-,&<€é#âXçƒOGRs–›þx„1ÓSy!TçØ""ß½»Š\]é’¯væ0~S1aƒãX{w2i“c¸Ã(dæ{x³Ôh˜¬ŠUoobÄîjêzX…,‘qlœžÌÖéɤM‰ã‘^þ4‹ÉÙåT^ñÝÑsë,"r94‚)r5q”ñ›œrbSFñç_¼o[Ï‹³IDATðgB”ò?ïdÕ¾ ¼ÞÞðzÏäám#%Âÿ†ÚLŒ cŠÿN’2ñΠÆ’=ǘ¹ÃAÙJtp ?œœÌãq¶ú{(ÍžÜÈ‹Ûw“Z>œÜ)Áüê»Ãüü(?ý$3/FõÈ–z3 ­ë; §À¶é0Kÿ^@¾Ëƒa±ýøË}t_Ûpž>Âm~Ýú…2ïÖ–]üK>i—Ûi[ÖùZ¬™ˆÈ·Íd†¡2ˆ\¡êÕ Œ¹Tƒf50½šÑ£ëâ®fªˆt':çLQÀLLQÀLLQÀ‘nÃfµPUçR!š©¬sâëaQ!DDSDÚQ@ R•uN€VSr˜ôSÅê$ÍlÌ+ad˜Ÿ !" ˜"Òºä0;K¶ÇáêY…Õá2x.ë@«iIj,³ÒðÁѳT;5’Yítñþ‘³ÌÎ8À’Ô<"Ò­èo‘‹\Aé§J˜ôñ.zòAeÒ§`|ïÀ¿K;UÌâÌãd–QëêÙ!ÓÓl&5Â¥©±Lˆ ÔÁ#" ˜"Ò¶ž¢˜DDDSDDDD¾ºSDDDD0EDDDDSDDDD0EDDDD0EDDDDSDDDD0EDDDD0EDDDäÛð‰>ÈÝ "ÿ4IEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/16_fields_snmp/166_host_snmp_v2c.png000066400000000000000000000721351516513262500321620ustar00rootroot00000000000000‰PNG  IHDR‡µ]ÿbKGDÿÿÿ ½§“ pHYs  šœtIMEá Ø{M IDATxÚìÝwtÕßÇñ÷lKï½)$’@èÍÐAj(ÒTD,ØEQô'ذ!Š"(EÞ{ ÒK½„–R(¡…lêî>!% Š>ˆß×99J2{çνsw>{§¬b2™L!„B¨¤ „B!„„C!„B!áP!„BH8B!„…B!„„C!„B!áP!„BH8B!„…B!„„C!„B!áP!„BH8B!„ÿ Íÿ׊9GY1} Nr^¥³¡ :Ò+¾Avjé™~£|Ì!Âñó4°•&B!Fÿ/3‡Eé+;l$SÖíãôù\LZ5y—δlo¼þ3®›îÏŠŠÓ™7<žøø§˜˜\ ½-í&„Bˆ ü©™Ãëg³íl>f#œÚžàæí¨ïcbîï† l˜ð{®Þ­ñÖÔ÷ÔQ|a'?½û)kϯ`üÜf|óD:韇u oOŸŽZ i!„BÂa)k¦Ïfݵ»ÿÝߪu»ùš-Üpq«Ž™gÚ{‚ž%ICëKß§[sö×dŒ9ç¹rj;£^[Èç|<þIuP<‘gßZÃUïÇøj\w|4F®\”©ËØuêj[¼Â›Ðíñ>4÷½Äü—_`fÀUÖ¼Õ—ôW~at}LúÓl˜ñ ‹v#ýŠ {¯ êt|œ­‚±UAñÙ9¼ôâod:6c`k=+—î&Kñ!¦ë³<r€É—°'=‡ ôñ)šyjïØÎ¢”é e!œãx®c>KnçL±aM{1t@c¼t †óËxíÙ)¤Z7ä¥g½ù}fôÇ›u¬+¬ceÊ™[™ùã6>Ë5­+Uk·¦ÿS©å¨6¿þ>¯2ãõ;Úíýð=¼?ð+Ž©"yóçwˆ±.¿l(§oªX™ÿà „Bˆÿwê´ò#û~—i=džÃx£“ï]SgaÖa2bhä_z JÁ.z0~ö kˆS%jf¸¸/ÿ7ͧ®ãR#†H ™Vðí{IÔ;Q·o_êÚh íö,݃, 0…9#_eªƒ¤yæ)ó(ë|“7=A™“¨W62yÞ Œ–Œ¹gÙ5ý-ž{w&G‹¬±ÆÀ•k™0q;WÊ; ~ißNM$ßÉ[}‡W~ÅÈ’[ú5ú}Lú|.‰éÙš¸·:–S¾ñÒ&ƽúK÷ŸÃ*¤œÚö+ï¿>™Ãz“ùõ+wi·ÛTTv¹}“c’‘'„BdèšÒ•2‘|¢ sëÇL»ÝËɬ l¥m}#„Bˆ‡)Þ ˆo}âÆê}–Ôoƒ»¶2®žìâÌ•$ve\å™ÈÝ7‘÷<@¡O'^éuë57³—ÑXæ&µgFM fóÒ¥¬Ý¼ƒÃiûHHÛG¢UÄùÞþmA©ÿ¿ñ²AO¹ãÚ8EQî¹îþ¯?™ –ª?_Góÿ2a4”ÌNzv|§"K?{F……›ZŽV¸~ó*.ÛÒ3°ü¾©&wµ!„¢¿ø(KßFtêP¹` v‹¥MˆœgÑ„Ùì¿bÀpå §®ãTÖ9®Øzc¯Ñ È9Ë9½ Ldî?Æ­û`ŠÉÚ8™¯'.á´ßcŒ?iߎ$¾ª†ÓlÛ›]jÌ„ÉT’…°r÷®çPŽ©$”&o`÷@ëKˆË}žÕÒïeák˜0‘—º™ÍY€ÊpwÝ]óú=Õñ®åÛâä@n®#¡µ£ˆŠŠ ªU>9×r(ÒTæœþívGį lS…}#„BˆÓ?~OíÎ#Ï>É®·'³÷ÔFZ€…­E×ó0Ø5bH¿ØéŒÛ@Vî>¾xz³Ü‹É<—[º lírØ·m9Ûöq`}ªKœH16T­æ€ZÑc£¸ÆžsØØ¿ͺÑÑosÓøhØ)ÂýU¤N!ðîГ;®ÞÏ Îaã˜ç8VřܔtrçVë¤Àó¯°®L³+*_‡.®#¡‹'stÃXF^¯¿)½»O‘£­ÅЯ Üít¸¢»£ÝšÚ•^@‹_¹e×'°‚¾B!ăéÿå!ØZßö¼ùõh4«E€«%×óÑ9ùP#n ïþ< œT(6µxüåx"Ý-À¤§À¶O i‚ý­ƒmÔÞÖ‘(_…Œ};Ø‘tŠ|÷pZ ÅàHµ3uº¶À×.í^Ⱥ´B°¨JÏ?á™Váx«29|ø,x†7x,õ Âò~o¬cCz´©Š1++jtÁ‡O„aUÞÙé{©c9å«=ÛñÖØ¡´ uäâîlÚsÛÈö<7ö5q+gæÐ\»Ý¾H¹ek*ì!„B<˜“É$ÏùÜzá­ç4þ›ÊB!Ä“Jš@!„BH8B!„wÓÊB!„â&™9B!„…B!„„C!„B!áP!„BH8B!„÷äO}}ÞÎ;¥å„B!þebcc+\Fe#„B!n’ÓÊB!„B¡B!„p(„B!$ !„B ‡B!„B¡B!„p(„B!$ !„B ‡B!„B¡B!„p(„B!$ !„B ‡B!„B¡B!„p(„B!$ !„B ‡B!„B¡B!„p(„B!$ !„B ‡B!„B¡B!„p(„B!2š¿¥Tc.gv¯gÝŽ#¤gë1èìp ¨I£Gšáe‰P˜ÊÂ/¦°×²!ƒ†¶ÂW§Üz}Áqf|: SÏWéW%‹yã~æ@¾m†¦³ºìª®íaò¸ÅœUÓ÷µ¾ëôšò sΔ­’ÚÆjÑq´oŠÓ[mäjâd¾\ª¢óKOPÛ¾tf6‘—üã~½H“ç†ÒÔM}ßšÉpa#¾Ý€MükþSõ¼mìd¯cäïHÖDóö”·ˆ²Ìaë;O2îèmoö¾D´ì౸k+± W³ô§É,MLá²Áÿ¨6ô{ª+Ñ®Zé_!„øo†Ã"ÎmžÎÏëó}¤-UqBwã;×±`ò9ŠžíK§R©Ë[Y¼-’ÁÍ<*¨Ì9ö%_£^}§RÓ&rOí%ÝÜâ^­Ð!`2ä‘}r«ŸÅLõP7¿}]*ì‚¢ñe){NåQÛ®Ô: Hßwš"×F„9«ïkK)V¾DÕoˆÎU#ÁP…¤.ü€wgæÛ{ oÔô@““FÒÊ|32•Âq#iåQj<¿˜ï—6çãxÊ]gؘx‘öÓ®4ä©W¬N#aÚ|4º˜?íC …ô²B<èîÿiåÂL¶oÏıÙctkA ¿UªGÓªW/êZžbKÒEŠK-nWÅìß—’xÉPn±ödïK檱Ô/M¹œÞ›…­¯Šr{ðrÅÛ×___ü‚©Ý¢B´œßwˆìb3 aD´œM:I®©Ô 2Ù²—ˆ0îs6DeHã¶­‰õÔÉž( àË–žÆ=þ ^ˆoBdh5êÆÑïÕ×hc}€…ëÏRTjqçp_2æ~Ïš¬òÇŽK˜+ ‰d—^Ìt•ƒRp q¿sìØøLpp0!áÑ4ï5œgct¤mÜFfQù›`8¿ƒ5ÉÖ4:˜vQ!EÄñäË}ðËXÁâä|éc!„øøf‹)4w¬ÒyÓ¤W?´ö¥© §ÚˆÍŸÊºå 뉽Ê|†uŽÄjã>N\«K]GÕl˜BR¦5š:’˜UAµ5j0a0™[…AÑ~°8‰S×#‰´+9bfíçD¾ õœQ¦üLv¯\Æ–#g¹Rh…[pZvhNu5ä'3틵TéÝ„«kWrÄ¡Ã{ú“³ K7ì#õr*[/j6ëB‡:è ’™öù\žN{-†kÇù}éO'Wí€wh#Ú·«‹¥r£ìÕøvoLþöÍì?}‘bûjÔ´-‚låâч©ˆüb@¹mµ ¤û«#©oáRjæO{‹Á´Õ¿ÇŒI›©÷f3\Ì~xQãÓ ›9 $]jC›—E˜®bÃi'Æ»³ætEcGƒ¥•Šó)6^fã»Ïð½ÅËüðV=J†I!'Æë»[ðñp°Š¡aË[5°÷ÂY]Èõ‚’7†â‹‰Ìž8•5ûÓ¹®ó$¢Í†öŽÅU#»€B<î¦ÐznÇ¥ßóÍÔel9Â…ÜbLh°÷ ¢š‡UÙ•jܨש!¶'V²:9ÓÝ*êB„ÓöžÈ¡dòЄ>5‰ ›pÂÌMFŒÆ’Ca.ŽþÎêCù؆àlö ¤`ƒ¿’ÆžS×oÔ£ˆsŽ£w‰ ÜY †lvLÿ‰5Ù~4ïõ4O÷oM ~;3^ËÙÂ57\"qQ—}Ð2ÖåÜff-؇R«=ý s´G–Íaë…Û¦/ ÓXýÓ ¶äV%®Ï v«Sêr&ÿº‹Ë„mC6»–%¡‰éÊ çž Î#ƒM È(’ù¡`Q•¸NdÍy…aïÿȢ͇8{­ZœCjS+à¶:_ÚíŒÓÞÉLÝsí®cGãV‡¦élØ{ùæØÉ9²ž ¨ïen00nü\åìιLݪÇ>"O#qÕ1N Yc…gÙ´ý>4! ¤7ï}ž˜®0pfÝ"ˆòµÄ¤?Ää·Æ°ÊؘÁïåýÁ±ä.Çg+3¥ÿ…âqÿ?«+VvÂ@¿íìÚw„Móv±°t ¤Vl3š×ñÇFU6”i½Ó©Î>~^¶ž˜*©ª˜M‡T¯åHÂÞäDÇà äqfo:Öa­pÕœ»3žþOFßvì hJïVXÞå?Ŷ1þ “Nq="»âóJÎÅ%&g5¥ïbë9: o}cfÑ/WHÿj »3[àë‹Q×îÅcÍÝÑ'ÏqUq§QZÚ«ÀÇ;4TVesyþ™­$åøÒæÉ6D9ª_<¬/“úÓöeÇÐÜ0š°‰íÄ#5Jfì›Ô`ÓϸV ȵþÿ~Š-‘C>åÃêKY¹q'ó¾\Å4ÀÚ;’&í{ЫU(öê²cÇ¢ZW†¶ÞȨfÒ*|05Í}ÜS»Q·±s6ìåR\K\•ëÙp»úýñÖ¦Þ9v|Ê“½ÊþÎ*,ž×ÔÀZQ°Šˆ£ºa Çóˆ©mMÑÙÍl¿ìO‡†žeÞPLYìœý5_-:ŽOüGÄy¨¸¾s ¹QUo6¬Î;–(§©,úâKö„‡R“ÈáØk¸y –‘ܬ‹;„âo{«†:· <5{H¿R ö€Ê_»[§Õ:Ôr'ËÃEíHh\?Bãúa*Î!ýðNV,b餑ì??†OcYfŸµ&¼÷`oË÷óãø¼»¹BµxÄ6ÆuÞzö_~„ÇH8fC½ÞÞ讚Y¼Ô )(j¬œ½ðr¶º¹ß)ŽÄ…3å÷“äÕ%kË6®VíBý›wò¹ž¼Œ ŸÿÂÎ+~4ú)O=R+¥ˆÓÉé{t Ú3‹hñíø:£¥ç…âá ‡EY[X¼¹˜›á­Em[µhZU«IØŠñLڗĹ¾øÝ‘Ë‚iÕ.˜ñ ³#´¹ùã¦sµì7“tê:ÕmörFW¦nZH5“ónÜbyoS7XW¦Š2Ÿ=§®â‘}„kΑ%§”1a2šP,kÒsP+¼µe_§±¶D1Pr}–V)Uj´ú µOæHòIެþ‰u+üiÖ¯/Í]+ªŽ‚‚ ã' 5:¤Á‡UaÊB¾[PLÇgã ´Ec‡oDý";y8om\Gj¯`ªß¾›ØG3``ÿùŽe±=ÍtÏú4vYÀúýW¨ë°#Vuè«æ>#•Üb}×ýÒ‘ZQ0m3)9v$n»F`|×<¹²û{Þ»CÝÇùð™ö„:”ºGÚh•J®‘BˆØ}V©ŠÈ8¸ƒí§õ·]¥”Ü©Rße¥*ìk´£¥ßE6.Ýsë:»2éЉ°švd%áØžT´ÕkUê¹k÷­«SUEÚî=$¼‚SDø»”,]=°ÎÏâ‚ɰS2ؾvgÍÞˆi$çÄ&ÖlËÄ.$–¸N1øåhï”Æ®Äs¥îüÔ.4ñ9öËg2gõLÆÏÏ¡Hmƒ«_8-^C—Æ>åÞw¤õïÈÐÎëycÑEó÷nH}·ù,Ì¢Y•¿ø4jÅ‘ˆ¸ ”£)D¶©uã‘6®¦£ˆ –~û)Ko §1oOæÍ¨0žüà%´ßÍdÂ;³Ð[zÑzotõ—þBˆ„b2™LÒ B!„ëÂ…B!„„C!„B!áP!„BH8B!„…B!„„C!„B!áP!„BH8B!„…B!Äý§‘&âþ1 RTT„Á`Bˆ‡Œ¥¥%VVVõ6Ê×ç !„Bˆ›ä´²B!„p(„B!$ !„Bˆrü©R2 ¥áă·Nö}!„þ¸ño$3‡B!„B¡B!„p(„B!$ !„BˆÊoHâ>ò™” „¹ôAÍ% !îéÙæÒBñQ&<ü“rZY!„BH8B!„…B!„„C!„B!áPqÏâã㉗†B ‡B!„B¡B!„…B!„„C!„B!áP!„BTìïùú‘q4jŠ}9[mÔŸåèïë9x$…+yF´¶xÕjB½F5p*]Ç)ãÅÌùaV]^ãÑpkîi‹LzN͚ΕVOíª–Ñ#„B<„þ†™Ã".m›ÎÒU'±ªÕ–6ýŸ¢cçø÷³aÚlŽ^1”]üÊV~ßyC…åž#ùÄ5ŒeÓ ù§÷rÁÜâž­èðø º<>ˆÎýúÒ´¶¶Îbõ¶sw]—1÷›'Obs² ¿Æ]hÓ«7êz‘»k.‹îçºá!èq+_ª×mH ‹Å;>dÞî+·µë Ϭ`ù¼5œ¼|ôí X>o§Œž‡…!“…/>Æ+Ë+3…BH8¼W…™Ø•‰mãÇhÑ(_??¼‚£©×½á§Ø·ïb™u€W¶,åÈåòK6þ\=ÌõÒ)Æ”Kú,¬|œPn›S,]qóñÅÝÇÿ`Bšv£i–KqµØÌ Ly¤¯[ÈQS4mŸêCƒº†Ò 3{F£9±ŠÝg þýnHíV­©á¡»§×é|›Ó ¦Š‹W®sþ²'Q­£dô!„¡¿á´r1EæržÎ›¨îý¨ªµ/u*S…}­ÔÈŸÊ®U©Ú3•ù k‰Åæ}œÍ©K¸CÉB&} DzìläÈ‘sTKQ£³Pƒ¡ƒÉL6ÔŸæÀÑ<Û4Ç·L%,üšÐ ‰¹cÄr޳gÅަœ'Oí€kH#µª‹»¥ùÉ,ÿv5nêr}ë&N+ĦJCš¶ "{Ýb’ŽŸ§ÀÒ‡í{S?ÄÕ=.OÎ}·•*O %Ê¥äÔnQê|fÎ3÷\|L%å¹wnLáÎÍO½ˆÁ®µÚw#¦šmÉú¾Y‚Ãc}±^ö=»²Õ_òSrÚ:­`Õùô  €Œ%_±ürKõ%'9ÇVñTÙ¿•Œ¼úxÙÉú Ÿ¢Èø}g%pø|jÇj4êñO·ÀR“þ«§Lbáöd.äÛà݆~O÷¤ŽkÉ-¾˜Èì‰SY³?ë:O"Ú `hïX\ ù`È j¼Ö• 3¦°ÓõÆ¿‰åÝÊs<Ǽ—_`f0ùYzïzCºF!þãîÿ̡֋ÐP;®mþžß~]ƾC)\Î-Æ„Ÿ |Ü­Ê®TãFÍö ±:µ’í'r1Ý­¢!;^ ùdÎS &òÏ$qÑ:œ*Îf®31oüær9ùw¶ÉǪZf"±áò)²‹ñóµ¹³QÔN6iED€ ªÂ4¶ÿ2ƒ}úªÔí9ˆNêcf9‹çìâÚ¡¸ø"û×§á÷8Ýû4Ç.=¥ßÍ"÷-ŸH}¯‹\³ËÅrùв9¼2 uTWº ~‚ºî$-IàbQéu¡öSÏëªÆ¹ÕpödzfY{IϽ1=[ÎÑ…xDƒboë'iSƒØ>}‰tÓÈèù ŠÎ,`ì7 ¨š b䇣x.Ί?~Îâ´"(Î`Ù‡o3-½:=_ËØwž vÎRƾ;ƒä|&ý!&¿5†UÆÆ ~o,ïŽ%wÙ8>[™Y2+_œÉšïæp>¤ýÚ +¯¼boº}þ%}}5<1ž_߉‘ÎBˆÿ¸û„W¬ðm;„N>Û9|ðI‹v±йT§1QþX•I_ ÏÆ4‹ÞÇ’•ë ó¹»$TŽÔp$ñÀ ôµc°UòÈÚŸŽeõV8jîœ64¥þÆÔ±e§óoJ똻¯ÄXxB,±±(?/žÝʱë¾4è߆ê*Àg«ËdNÝÁñK1ÄØ&îÍÚ`ƒ‚µüÖ“‘G“ØjX+`[ÄyÙäý&ïay§ÊôÑ„UNÔ sA„5¬ÁÞÈ-†Òw (Š ¥ä¿*­G$þÓHNÉ%¤–E{H3T¡I5Û’.°¼œ­ldäüEÅ—SÉVüèÒº ‘.*öÁ)àj;…)«X’ÌÓß ™“QÍŽÊêS½ðÊY@BnÏuá­¸ IDAT‹§£ðüÕL~HË@o Eh›¿Ê=ýÐ…'”S^oBª«Kö• •J‘ÎB ‡µ-žµ[âY»%&ƒž+iGIÞµ…«&“~eÝâ|іɇ–x6éHБ™ü¾5šî ÍŠ}H-l·ì%=7ŠMÉ–4uAgfqÏVthP²E…ÖÎ;‹»N•*jKÔ\!¿ÈÜ>i—KICÁ¹‹ìCñ,uêYë„«f®ƒ ¶ÆÑAw#‡)¨µ,¬ÐÞ8î**-ŠRXjÓîqùЍ¬qó¶»µ­j•:æë¼ ¶`Åþòj‘tS@¼­$0Üo–miá9š Ï<ÃÚõ©Óˆæ ë㬅Ë{“É.<Î7ÏôfÂÍW0@¹¬ç©tŠ=:PÍî~ÑâÛñuFèAmCPM÷cÌDnZyåÞu¶^!„„Ãû3#rn ¿o+¦V‡f¸iAQ[ãT%šzUjRuõxHâRS_¶ÿò6¿N¥ÇÛoÑÒhB±iÄ+cú¨+»OhílÈ>a•êîׄ(Ø”š7UPžÂué!„·òÖ}/PUÄ…Ã;8˜ª¿-*)%J¥¾ËJUØ„µ#Ö÷"{Vî!Ç`6ÁQ%ÜŽìýGHÝ›Š&¸ÎÚûToÛ`jTQHOØD†¾tÍMeíáèE5á¾Øº» ¾všs¹·n›.ºx’ìbÜìÿþëð“â›wÕs=í<…ÆûS¾Ö³6¾Ú4öoÙLº:„p_K$Þ—“æ3mÉicÚÑgè|òã·<å~Œ•kΠõ À.7…³FG\]]quuÅIu’¥3–’¬×à\ÍUÖNçþ±8·f #>ZM–áÎ=ƦÜò¤/„B”ußÓŒÊ%š¨ m$Ìù‰â ¨æëŒ%z®¤&‘´KW«Ø’@gî,©Ú™Ð¶Í8òãz.¡ÂÎLuBñڲ–m*Kûº£¹KQ÷^q{Ûµãää%,ûñ"µDàåjEqöqþ¾‹¯V´ ³ÃÂЀ›)l]°M‹šØ¥qhÕvò|Û⢢¿9ê±×^æØ¶ý4 @ÉÚÅ–¤Ü?óÅHAöy®åÚà`£E±ð¢z †¥ÎbU»î2HþZãIÖüºœsª§h_Ó™‚ÔlÎPáÑ›Àö´õ]ÇoŸýˆÝqRÙ6ÿV{ÑÚNC^´˜ú.ß3ºGãt-‘™S“0=ÚõOý´(·<  R \ÏLãÜé!„px¿Ó¡=Á]ŸÁr÷ö$­'a«ƒÚ[×*„tDípWÊûn µ[}šÕObÁö«æÿî\ƒjö›Ø[\‹`wÝý­ºS4­Ùs`ÓvNï^ÁÁ+ùhlÝðˆèJ·&8iM ïƒnŶÏÚFžÚ÷êíéÔª.öjþöpˆEõ;Ôgݪe,<¤ÅÞ¿6u­Gâ’ì{/Km‹wxlú•…9ýè„ \kVCwà U#½ÑÊù[ØÖ~šWzNdÊÂ/5Ý€ÚΗ¨Ž¯0¨µ'j t=Ý“™ûÉ:.ìð¯Û·µÇ[hÂxòƒ—Ð~7“ ïÌBoéIDë¼ÑÕm‘™GÂkÊ/'j6ªÁÒ9cx={¤tŽBüÇ)&“鞯GÏ(”†{x¸¶ëGfï¨Jç!mpû§Coݽíû>“nþ¿éÙæÿÊmŽ`îܹ2„âöà4!ôAÍ+}Üø7’‡Õ‰›Œù8wæ¶œÃ>¦Û}»žS!„Å¿éÊ>6/Ü…©ê#4«ëVîé!„BH89µgKz¼ÖRB!„øSI!„Bˆ?ÈÌ¡¢ ¹E!þÛdæP!„BH8B!„…B!„„C!„BQrCŠeB‚4‚BˆßñK¾>Oˆ»»×¯ÏB!Ç;9­,„B!$ !„B ‡B!„¢ꆔ‡á|ºB!„¸“Ì !„B ‡B!„B¡B!„p(„B!$ !„B ‡B!„B¡B!„p(„B!$ !„B ‡B!„B¡B!„p(„B!$ !„B ‡B!„B¡B!„x@h¤ „øÿ·{TPwVl¸Æ©õ¿²tÅR²r0X:ãU½!q½zP§Š @Á¦{‡VxùãþT±Tn½>/‰ïŸùÓ‹“vš©Ïb·ÞŸ®_|J u™U/­ãËç¿#EÍ3ß"Ü2‡¤ÑO2åXÙ*©í}©Þ¢=ºÅ⢽{Õ9Él3‹„m‡8Ÿk@çäOpãîtîÚÏÒuü—2¤Ïá£WÃnØ^h`‡òw÷ó?]§°ìEáñ‰Œ“MŸoß"ÜêÁÚ_L¹˜óé&j½:”0›ûßúÆËë÷âb"Æ~Nk/‰… ò1#ôFŠRç0ñ§³4xébœT€‚ÆÑ-ï÷¡ŠŒ%ðõì\"z dp¸šëi^=ƒiï§RôñHº— x3kEs^éê_ÁÇv&]¤i[n½ÚDÎ ¤š[¼jž2 ÀT”Ãùƒ+X°à~Ð|ΫÝÌ®Ëxu¿ü˜m†(Zt{Ž.Þ–èSw²aÞŒ;[Ì›/7ÃIýïÞ'Ûê·ë„¥·ÅÉÚ7^&±åW¼ÒÆõßÑÏ•XG™:ýÛ+o ÿpû¶èÎÆŽ ÞFZ_H8â`íHÀ‡rƒ%ç*A¸•:DëïóJ N‘°â4Î]Ç1àfà !¨†ù/dmÂYb{Þ ga¾œ[ð=[~@3»ÇÇPWÎÿžÈ•Víqùc1ÓU’OÁ.Øœ”ÛjÖ>øcyãßUBƒ±J›¶q¡S^Ú;¦886ã[¶ã2f5n\Y—ZÕÔüYžKß0«õ>¡rˆ¤UÿÈÓBÿ\?WºNçöŠ´ýL9ûY³Íš†ï{ȵfB¡ÿ>&ŠÎoaöôÙì:vƒK-Z z‘ލ“þ[¦MbíÎd.åÛàY» ö¤¦‹™¡n*¢ PLeoH›—FRÛÂ¥ÔBKÓÁ4ѿǒ)›‰|µŽfó¡ǨfXÍOàÈå64v-YÈtí;RœˆîêΖ”Ц@4XXi 8Ÿb“ùÙ†yTØ‹0‡Ò‡2«ÐntënÇc!F¬0]NbÕ¤il=x†+~uºÐc@lÐ'2aØTü‡´áÒ¢ùìMÉáfgúªMÚôïX½' ½uMŸ~.uœQßãòŠ™ÓhG¾æ½qE<ùõBL%åUy¾+yËç³ópÅεhñô ´pD¥Od³që-ì'¾ÂÒLà—gyy÷†zþÄ÷©½õ^KœTyÿîY&œëǨwãpTÝc?§³úõJ­ã >~Iaò°½Ü•K³¦pÀåÞ\Ìä?.mð:P~ýâs[XøÃ v½„οq=‚ÙýÍš}ù±·ÍPý±½ïŒ'>ÎožÆ¬9 œ¼‡Ê¡1Ýž£GË,”;ÇDAÚZæOšKâñl K\B¡ãþĸßöÉÂt™>Ã,ÝË|ðZ=J&É 93mŸíiÁ›ŸôƳ¨œ1¤OdB™6y–þvßW¾/L®î™Êø¹k9~Þ„sHÚzœ:>(nKáÝÛ%¯tûé0d'²bÒT¶LG¯ó¤zË<Ö#'Íí—s`Ç›浪\›ê+Øw1‘Ÿ²†¹“ç³÷Äe´>‘4îŠQÞÀÿ=6¤ „ø1\fÛäuX¶Áˆ^¥÷ ÖLœÇÙB 8ƒ„ßfQFuÚ½4–WÞ|‚°ëKùaô Ròͤ,‹ª4¨çÄÅù¯ðÁÿ~dÝÖCd]+„‡àÚ„øÛ–}ƒÐùÒìéÎØïŸÌ½×0Ýí§k꺧³cßå¹G×sƾ‘žæ>0J~ŒWÉÚ=—…ÛõØÖŠÁÍÌ5‡Eçö“^äAx°ýo`¢»÷㑨ò±ðÝÿ±öZM}u />××#“øò³U\üc&®0õ3ŽQµß{¼>²®É³ùúÅO8ò$Ã?ù®ÕÒÙ8u9YErùŠg°iò:4qÃñéhõ?Åêïfs¦ tÞö¦ÕØ/yÔGƒwÿñ|þf}ª5ŽÁ&eÉWonó޳-)Ÿª-£qPý‰~ÖøÜ¶Ž˜’™ÜâL¶þ0‡KAèÔ&í=Ôß”w„ù£¿ Q÷}Þù€þ­mÙùítÒ +Ñ,i øá»T1tÔ(ú¶°bß”ÏYÖLÃfågÙkÕ‚žo~Ä‹¯ ,wÓ&nãÚí;©âHhóê&¢¿ñdzìÞy æMpW*1†Ê´I÷Òûøí×tBúŽdÄÛƒ¨U¼iLæ¸ÞTá¶T¶]LúCÌ}w ›ŒéõöX† Œ%oå8~Z“i& å‘¾3ëð@nžQ®L›–×÷×v2ýƒ8`ÑœÞo¿Ï€öž™ü+g‹ä-\f…ÇÄ!Þ]ž£c=/TáÜ=‰žáj1e®bCj0=¿@]GÂ×R†OeóéÞT ³¸í@iKèSŸòbðR6mÞɪñ«XXzER§mÚ?Šm™ÙA]Õ®ôi¹‘¯šI£ÐÁ›;ø©Ý¨ÕЕ¿ïåj‹–8)×9¹ñ6±ýq×ÞyÕ¡éЧ¼Ùÿ¶I­ÐxžîSs÷•õ—ÈÃGëò¯¼Ë?¶˜íW‚éöîãÔsSÁøØãä¨eìÊlI;ç’™Î*½Ò8Ìgš‡Í$9·/=ÛGà €Sû–‘ANñ­™ÑÊ.ïU©°o®õP­ï pìÜ5¤q¥¨ìGwE¥FAAQ©PT º€æÔ°ÍŽƒW‰mâDÁ‰u*ªÁcŽw^oVÉ~¾}%õ+BÓôUw÷+9Xè+[Îf³½ O>ÛZv „VaÀ¥ýŒ™W‰px%•+Š-[6!ÔYA>8øCegf‡3jð|ä oÚŽp'5ˆÃùÕl[}<ØkÊîÃvµâ¨f˜ÄŽ“yÔˆ°¦8}3û®øÓ¼¾'ÆÔ©å¡3m’}˜°&òéa´ªm‹B¾/8ûâDVíëCptùÛ¢«T»˜ÐZÀN}ýž§¶ƒÐ÷Z&³Ïfgò¢Ìe…E9•Zˆsc×[ ¢6-·ï Øn™ÍU#¿Ð‹¶ ÔÆÓtŠ÷'åÈ{¸„C!Ä}§¶Ã/ÐùfnP´–h”’BÞÙd®gÚ°ÞÌ(5+g4€r¥w¬ÔŽTkÑj-úa*ÎáÜÑì\µˆ SFrìü^ëL™H©X?˜˜íc™¹(Ž7º˜«¤×:qZ¸žcW¡žî;ÛÑÃí53‹—º!E…³nNVw½éB¥³AË®ᎥLç^EoÔ¡?“N‘s,ÕJÿÖùÔÆG»–Ô Eà\Òž®–7ÚEA£ÓbmçÕ†R4¨”ü2íOËW¢?‚]Jõ§êʜϱ¬Jl”ßm5£Q¯~}´f¶ÏŸzÉ:¾›í[O’š|É)<˜-[qˆ Ap1ó6Ÿ$?"”‹Û¶‘S¥ ‘®*òŽV0†Ì´É=÷…/5«ÞºC\åJ¸§‰Í)—14¨Rî¶”Û.7ƒ{1—§cpï€Ÿí­¶÷l÷:ÃÍÕÇxKy:ìmÔ÷Ö¦åôý¥çQ|»–\¾qãC•}õ(\Õ¿Ë{¸„C!Ä}§h±Ðš?蘌&›F Ý]ÙÙí+)J]ÈÌÅÅ4¿(;üî;êô4üó¨OŒó¶¸B-‡ œ´¬Ck˜ ‡·ßRá›–{8îlåÈ©ZxÜ6;cÈdÃ{ÃYîú/…›k?ÆÒ'ÅïõæÌ¿p3§©8ƒI]©þ¬ â×4‹O6p"Ë’Ä ¡Ãñ6ST¥ûÙÜÑ@±ÀJ§ü‰ýÑ„Éh2Ót J%6W± ~ì$êïÛÆ¾¤}ì›ñ6K§†Òöµ·ilU¦ L×±dìGlÌ $2¶¡Í4‰oîV¸#!Í‚(üu3é9vÚq ÿ®upTCNEcÈ`®M*ß7[¡Ì˜0š@¥Qaº~ˆÅålK¹íâSö½•ªÒ»ªRrRâÞÚ´œ}W¥Rî\·¹ß‰–\s(ÄѱòÀ&7…sFGœ\\qrqÅ^u’ ³–’’gfð« IݶŒ„Ã9w\?¨Rj-jÅüÛ†Cƒ§è’ÎÊŸÖq±Ø\‚ó ¢¾3g7nçà†Ãè¢ãuŸͨrЦi …c¿ÍçxN™C§×²-]MÕ†A¸ú{£¹tÓWoÝê[˜¾ô"Wü]µÿ@¦b ‹þ¨c—ž!ÿ>]•oQ¥9aºc¬_0ŸdM4CÌ?¯ðÏ÷ó_¡Å)вö‘®7ÝšÑJ>‰¾Âí7pmß|-?}T;:>ý¯~û-ñnÇØ´>•Û®®Ch²b4f4úv"6*«ëúrn~P°¯G@^;vn`ïõG9£úcè^û¢dóÒ8p2÷f_.äà9 |‚),w[*Û.ªz œ;ÀÙÜ›káâº1Œýdõ­ëmoî¶8[r-×ðÚô¶¾rÇxvgn®ßHNò>.äZf…ÿ(]µö4ñYÇò/ĦÞ†T’ýÂfc/ÛÞù9PíG›¨%Lÿì-Š:=JTˆ'6äpþðzV­¸F`ÿ¶xë€sSƒž4؃-¯Ï$5.fîõ`¿p:óÔ¶D @äß U9=h ‰oMdüké4ïÔ”`o[ 3ö°qî*²«õcp}g¬Š¥žÃ;ÌûjºÞq+<ÆÆŸ—‘2zÞZóÛu?á¥;®ºsl_ü;5ãÃQ^ÅÜõWÿäGr•b@Ÿ™FöUÜ,P¬ªQ¿¶†o6ǶEîòäžJ÷³á¶uü¥ü¬Â¾nObf~ÀŒïЫSÖç7±dE6(~¾Vc<ÉÖß–“­zŠfáΞÙAb¦ ×fŽ·´4öÎèô‡Ù½i7Õ¬¸vd‹—Çdu‚S鹸ØÜqñâAƒjß3}Úr,ÂGj¯Tn ÝífšJöEIõìÿáKV>Þ•êVìš5™×μn‹ædyÛ’GÍrÛ%÷æì¢{QoÆ»Ìúnt‰Æ!'‘¥¿&Aû¾w>e@ëJÕ»O^ ¸Ž šÊ´©[yý§Æ©î£„Îú†_¾ö¢gç(ì.í`ù¯Éñ7j ‡Bˆ”6€ÖïŒF;e2+Ç­ãªÁ¯˜n<ód{ÜÍtµ u_øÛU3Y¹v&ÓåP¬¶ÁÉ7œzÏ¡eCŸrß 4~éÓq=Ÿ-½hþï^ ©í:ŸµQÄXÜ×MU{´dÐÇ®l˜·”½+'³ñB.:G_ª6ÆkñMñÔÚ0º½ÿ&V?McáÇKÉѸP÷)^Ð×âÙVátÒŸ§üȸ—u¸†=BÇ¡íY1!ãOl°Á j°aþ>»4’Ñ/ׯ+üGb¹éµ›r×®l?ß¾Žgþb8¶‰ ç;Ï2oâ,~y¶ÁÍé0´3_ÄR£”„­#žf`÷‰Ì_ò%_Ï4 ²ó%¼Ý+ôˆó¼#[[„ô£_»/˜ýëXváŒ_t{zŽbÛ7“X¶ð(‘Ãcî<Å«8R½yʱB[ÕºuƒFEcè®wZW²/µ[kï¦0s +²Õ¸×èÄW{á«ÊÝ–cD>WN»¦ßÚ<«0ºz í3ùuô,ò-=©7‚§;™{€½>±èW$×XU%ÚtPEŸßšòä{…Ì4—™ÿ›‡Ú+’¦ƒžÃî§yò>ý/¡˜L&“4ƒ•“Q(m .®x—×bÄçã§{Àjwõ(«¨‚½ÀDÞÞqŒþɉg>H€NúâAaÊÙÅä·–Pãý÷¨ï,W›ýUÞÁ¾-{BüËsÏr"q9 ¦âÚ¼Å}»žó¾Î<œbÍ×ÿã×åId\ºÊ¥“ ÌŸ²mÆd}澨°¯ì"hY?—­ÛÎɃª §•…âßHÎodö×+1FÏs½ƒÑI_<`,ðïò8>Ÿ,àXó¡„É÷+ÿçÉie!îœVBQ9­,„B!*…B!„„C!„B!áP!„BH8B!„…B!„„C!„B!áPˆ-Cú>èÏ—Ûrx˜;gPì\‹O¿@ûGTr~ó4fÍIàä…~ILßÂìé³Ùuì—Z´ô"QQAéïÞþṬ}ýÎõMþ£ïuwm_'M9Ûé|žÕ•{9‰U“¦±õàr4®øÕéBm°Qʯs„㧈n,ï?¤ —ÍgoJ5;ÓwPmÒ¦Çê=iè­ƒhúôkt©ãŒš?¿_9Ýèã»÷Gùý_á¶•;Ü}läÝû6ÿ¹´¨ÁÂJÅù›™./¿+h‹¿8öow÷}•¿¸¿–ß7ûKK~ÊæNžÏÞ—ÑúDÒ¸S(ÆÊ¶—þÎ÷¤ÿ½(Áó¾„xi!@Ålš¼MÜpF|:šGýO±ú»Ùœ)€â´üð]ªFƒ:j}[X±oÊç¬?[Å$|ü6‹2ªÓ¼òæ„]_Ê£g’o¤?ÄÜwÇ°ÉØ˜^oeØÀXòVŽã§5™Tê²ÀâL¶þ0‡KAèÔ&më+™Y©Bu§,öŸ¸nþÔrÑiV~6‘½V-èùæG¼øÊÂrW1mâ6®Ut.ZãC«±_ò¨ïþãùü͘’Ãe¶M^‡eÛŒøàUÚxŸ`ÍÄyœ-¤Â6*·ý wYßÍY9í[ÞvªË/—üc,|÷¬½V“G_ËÏuÄõÈ$¾ül ï3f¦³~Æ1ªö{×GöÂ5y6_¿ø 'Bždø'ÒµZ:§.'«ˆ¿¾_•וéÿJn[¹cã^·¹Ò  %?Æ‚«dížËÿµwçñ1]ýÇ?wÖDöI$’X"AÅVRDÑ*E´Ú*õXZõtQUÑm©êS~ÔÒV-UBÕ¾¯µ”‡Ô„„$öDÖÉÌüþ°ELf&–§è÷ýzõÊ̽ç|Ï÷Üû½çÞ™Y´=×Zõ(§½}^ÛÌ=;±¸›¹{‘jcÌî2ßìŽÃõ6dîäç‘Sا¦ÛÐôhëǡ鳹ñ2‡æê­Ç$!+‡B<ºLÜZõ¥}CT€ç3Y=ò—àw9™ËJ -[>N˜· BðJ@å¦Â˜¼’õÉ¡t߃Ç< „ 4à'¶œèJ¹+ Ù™ÉËou¦Ž‡óRæi楤‘ëÈC&#šfCèÝ) `L\hcݨX]jÔ¬;tc#nûMz³¿'_¡g³½Ô@<έbÛªóäšÀÕÞBJ‚‚¢R¡¨”ë‹‘ø?ÛvQåQ‚w§=lüô$…`<½Òv›ƒmÇ¿¢³•ý]ÛiÎñ5•³ÙOwUIÛ…¼„Ål¿Ês÷$ªœ%Àí,‰Ã—òçé–ÄxÛn3zk‘SS±k/šV÷@Á›èês8’ý]ÚFà¡€WÛ–}FV!Óî2¯lŒjÛãïng>]â(´17JÛg´ŽMUË/ù û­ÿæÖ™7^¬S±‡êlÏÏnT¬l;º;žû׿¢ƒ¹zéðº»Ê7?»ãpµ¨¾¸uûTMè=°+5\¨ŠŸå8#¦f#IA• IDAT9¯àÛIBŠC!]j7‚CËÞ8ï)Z=êkÿ£¯Ô†(ßXf÷ïÃQ ©Ù„¨† ñÐBfü.efÿnÌ*r6›@¹œCú‰TL>Oèzý¬¥Å/æ=põS‚öÛåBp¸Ïµ‡…Ü[û+À‚NžzòÒ²¬¯NꃈzÚ“3Gw±ýD’ìçàî$L¾î*~U¼‹ÄÏ â`›ƒmÇ߯²*—Ž–_àûi"ód*FïTö¼y³SP‡í’ÏÁûÚ¬vÃ×àtíC –2n¾8_kº¢Ñ£Ròˆ™í¼"g·ñppüì[ÉsCœÒô¹*uç_¯†_­¿5zïò”ór¶r[Úܳ‹;Ÿû×ç¢#¹jâÜï3ï*ßìŽÃÕÒôcçP*t¼z«úZñî^-ƒzS)æjÑc’âPˆG™¢E¯µþY>Å5‚Σ§Ò0~ñ{≟5”%?…ÑæßÒØlAqiB¯ØîݲD§ quár¢T*‡?%h)ÌÃd)ršSô8ën¾ÛbgÊÿ³±+ø}ôçl̪Bíõ ‹îA½©|·¡í*Eüì¶Ùdûý6ãe.9¾wÒOÛ9¢ `Á|ýfý´Yq¼_w•W¶ÆÃ‘¸8Ø·’çÆPbJ×g‡CXì)wG®`±XÜÍÜWJ‘«w›o R)·ï¿È¿96Wo=&‰{Cž9â¡b"3>Žß–À=2†vo¼Ïï¾£s¹6¯;‰Æ?—ì$Κ=ñ*kÀ«¬wU"ëç.!)WƒG%_”³ûHÉ¶ÜØÞ…µ£ýÅ*.šK!FË+ûK‡O’g.¹²p¶¹¿ë¯3“{9'ƒ›•Ž…œ¿²þL=^K—:Ð ² ÎWrn¬2^]ð+M»lWC޵ùήµKŽïJNí³ÝOK|¸ù£IßωŒ›_ÖSOªÑ@A{ŸsÎ^ÌlçÕ›´?þ÷fn$ó÷Ë ½8Ú‹ÅÝÌýÒäêZŒî&ß-^!>˜Sþää6˜É:ÏyÓýž«BV…xÄ®ç4æDþøeU¯ñD¸7'w°û´ Þ”©Ü–ÇÖ²lü÷¸to¿)™=¿ýÈsWšºªq«Û•¨Y3wÒx¶.Y»Y2{´} /— º³l_¼‰šÃQXÉüu6/!u6÷wí¦ RÓ )×Þ×Êc\ wot9ÙµyúÊÎdZÉâ¥ç°8ãxj6;íRP)&rNŸâb†Çí(m›í~WsIûSlÆ·¬g‚í~V(¹úªí‰òÆ‚of¢ëÖ”r lüa)YU{寅üû›uº»È+OÕy›±´;þåîÍÜÐ]Êeàlޝø•½4$¦MØ[Ï÷3޶c‘KÍ;žûªÛânkÌ|Âï"ß5^µ'lî·ü8¡<]ž‰Ä-}ËfÁŒï=š«BŠC!þÊD¼A¯N“‰û}<æ˜P¹U <æ]žoá‡J­†Å¢1ãÖ’ar£|½çèój[|4€¦:†¿vÊfÇÎ%ÏÉj-óF‡ 4ZϾù4?Ìøžqïè0T’v}Û²|bZÉÍÑÛÞ`ÉI&!½<µC]­ÞÂÒW}™—c¾fÞìÑü‰7uÛÒ56’mßNeé¢ÃÔPÇv»Ô^„6ªÁú¸Q|•þ±}ì„Ð^›íplìOq.9¾.*{ý¬is»Ïøçi3Y4f YÁ½Æ m0¨ÿig/f¶òÊxÞæ¦íŽÿë÷hn¤–®ÏæR7-a~D· ÃYý?ˆ£ÍX$P»ß]ÌýâѲ‘«Z-w‘oŽƒÊ»¯~RÀü©ó™óÙÔåkÓìõ~¸M[po檸ó3Åb±H„pLšŒJÉBöŸc³2Šw>lާ<È"„xÄùëþ>È¡Zqÿ˜ÓÙ¿æ aÏ6x$E!Er¸BÜ7‰KØZæyÚ…»Èï¨ !ÄCBn+ Q r[Y!„-r[Y!„BÃþCç*ºûsK»>yŸŽZÿ³ó㱌ìŽNFDŠC!ÄÝQ\«Ò0¦Nþºûp¢, í÷‘L˜—MÄó½èî‹æÊ)®šÅÌÉÇ|DcŸ"ÞùÅÌ]Í»ƒì\N²sÏšµñåæ»-dí[O²µ—Wêο^ GXŒYœÛ¿œ… ¿`Šf,C:ÛÞWaÆ~ÉF}^ü°žWv³ìÿ¾c’âËÐWÂqRþ—ñv¾?LW…§Yóþ;ìnù ï¶öA}ß{¯c®TéA¿žÕÑßú¯h<ÐÞï¾ )…ø'PyÔæ©îµïÏÆó³aù ¼;Ž£Ç‚¯*!5È{ç#ÖlH¡A—›Å™Gõ œ]ølm<’'|K>d{†8·i7—ŸjKYõÍU…#›’p õ!+©ØÉ¤LA!¡8]ûÿŠa¡8'½É÷›·q¾C0åmœQ SÖ°ù¤/-¿èFÝ P‘nç¶»h-)/†¢ÿÆS<Øù.þ'1W\+Ü2Ÿ…‡B+¬ÝrË?4OÆyuÂ`ª:pnËLæþºÄó¹¨<*Sï¹~<ß2}n‘[Bå÷1±ÿOTüWGr—űó`…ÞµhþÆ@ÚFx¢ ÏneÑ”Yì<œŽ.(Šχ²ëÛ­<1þsx[°É/”b?¤äT…ÖoD}Ù".«)Û¬7ç|Âï3¶P{ÈxZ­ÕxF>sÜ]jMSÃÕY2°#É‹º}Øšdïì¢Aï¬Â< Í—Ø9²suï0òßQ¸(œœÙŸ¯þÛœwßTã[£a†ë‡;ÎÞeP ó(4[ÙvNéâyÛ¢ÆÅÝ,Ÿú[÷§’£ó£Z˼ð|¼4òO­!nê|v½HâDÙ°'i÷fwêùhc¬€%ç8[gNeÍÎ#¤ç¹àW§5zu¡fÙâ‡ñ|ŽOëÇ„än ÿ¤%^*€\ŽNz‹‰g_føÇ-pËØÃÊ©3ùcÿI²4ë?Ëó=Zì¢ØÏEËn&öŸEÈ;IŸ;ƒ}e2lPíb'z yI«™?=޽Ç.¡ ¨MÓa w‰ýñÎbç§%ç#BY8àæ-Ð’ã]š˜a3þÚ˶cR)mŸŽË£cOO¶Í[MÂ3ÞÕ¢iß»;‘¾ZŒ‰¶ÿ`ºTò˜S,æÞ/Ñ8e+O?¾Å;»ÞgÌÐ2mäÏÍ«¥TV½7%Eßû¶X0žÛʼŸçñgÂyLekÑüõ<]ÛÕ-·±™§÷DÎî’ç]x6kŠ·h}ô¶Æ:çöœýl\`ؼ ñà+<µ)“6 jò:}‡ç¥æÎÄÏ˺£•§±yúZ4-0øËXÚgÕ¤yœÌKî!âb¿f·îI^6’î­\ÙùÝÏœ*égõ•håÅ…¸wùÙ÷¬ýãg2XÐâZ‡ªA®·Dtxâgpÿk:‹öfRÒosj õyÌ'•ñ—® ²¯ã¤{#jûY;q›0™®þgÎÏàÌ®ù,Úžƒk­z”Óy] óá $å\ÛcA »v¦ãý8a/ñևݩ¨,&òÎÿŦåÇÑ×h‚¿#K6âYœ%çó?ÅfsSºMÿ^ È]1Ži«Oc6ž`ÅW“ÙëÜœ.|Πw{P={%3'o#ÓbgŒ ÓØ0f(¿¥U#æíѼûÁ+T¿²„)±³HÊ+e=šÖÃ%i=G2®•c¹GÙ¶'J-ëâQÀ¢?cMfMÚÅ ~í0šÊø¯VrÁähBžæ)¿’Ò­ƒo»hÉÜÉÏ#§°OM·¡#èÑÖCÓgs#]mõ'ßÃæxúhŒw©bVÊ9fõo?Ï8F`ÇÁ Ò“ð¼UÌþ= ÙûÏs`LŠÆ¼M=ZOû þÝÿÃØê¡q´ýšž*ö^§«Õ)Û¦¯Å©Í`Bkÿc¬ž¼€”‚{§«gÂlº9§oÌm‹óÎd¥ýŽŒu±œ²r(ÄÃ_^Næ²HË–æ­‚<‚P¹Y¹¾3YpkÕ—ö ýQžÏ4fõÈS\6ZðÞ7íùQ¼úV'j¹)V‘é1jAI+t®„½ö%ƒB—°yËNVþg%¿NåkS¿Íó´}2 ×[Vt•:òbËL˜6‡&a½ µv ª.G­ÆåX±i/Í[â¥\!qã1\tÇG{ûS‡–_òA÷b‹—ayãÅ8) úZ-¨lšÊŽÄ\jD”¡0u ñ—ƒˆnèwóy¤ÂV¾7ˆ¥§2õxñ_ pwd¥£Äx­MYÈ9°9‘¼üVgêx(@0/ežf^J¹¦rø=ù =›ÅàqnÛV'×:clL^ÉúäPºŒïÁcž B…Hð[Nt£bõ[ïë‚£©Q&–û3hð¸ùÇÖrÀXƒ"<ÉO˜ÊöË¡<÷qO¢Ê©PÜÎ’8|)žnIkGbbDÓl½;Z9‰˜¸¸uûTMè=°+5\¨ŠŸå8#¦fØíÏK6ÇóŒCñÎLú«T1³9Ç,Ô;h¨Öëmž~̨XRMeÝÁîTò¶ý÷ Ýb›cãm%æ¦\• E¥`,Å1BQ©oyïµàÿl?ÚE•GEÞö°ñÓ“dÞű¨¤Bú¯1¼ßýö¯\ô/6æ]Eç[Ûo쇒>¢ÂɯÌÍ1qxÞÙÏ'K°ýø )…x(X ó0YÔ×ð"è…°á”Q Ûj,˜KX"+š‹W_¯ÇYWrLT*åö6ù7‹½þ(J ãYŠx—2f¶æXkƒ1AU¬xQP)™söþngLìÄÜæ1"ÔÙþ§ŒÌó»Þ~ ¥”óÎæX›ìÇO›®!þ~ÊÕ³ FËÕ—K‡O’g¾zœÇoËNàC»7ÞgÈwßѹ\›×%ãø“>Z¼ªøÂ™xR¯?ËE!—Ž$’c.á¡. yÛR6̺­lP©µµbýÐâÑè5:TMeÅ´µ\(´viêKDCoR6ngÿúƒèê6¥¼îÎ#è^«Á¹{رs={¯T¥i¤7*Ì\‰ŸÂ·_üBr‘g-ùYX4h5÷òd¡Á£’/ÊÙ}¤d[n¬^\X;ŠÑ_¬äÔ¾_Y¦¯Š¥ÇKhYç+9מ¹´5Æ'Ñøã’ÄY³'^e x•5à®JdýÜ%$å–°’T1šêºÖ-Œãˆ¦.M«º  Æ=ÈMú~NdÜ|À° 5žT£ ƒÖN.:˜g!>˜Sþää8˜É:ÏyÓÕ±r¶ÛŸ’ÆÓÑx¯&ǯ41³=Ç ‰‰)•I97æ‰9ã0Ϫ1Tö¾ºÂ]âß xÙûîÕ1âAÙOéæ¾óÌ!+‡B<øÅ¡“ÝY¶/ÞDÍÎá¨N¬dþºŒk—o*4æDþøeU¯ñD¸7'w°û´ Þh¬¯Y-ØÜëB½9#™5i!];DPæÜf~_~”@ë«{å[Ð:òw~þêCŒÚYÕ²8wp+—gR¥{üu¹ÕWôÍ~4êõ<[ß›CjÊZ)"|¢á¾èg¨]©ûQ0: ïNcèA£ÊÿÇÏ3—¡L˜»¨ñ¬Û†ÐÙ“™5#˜N-ªá’{‚¿,à|À3¼¤¿§')·º]‰šõ1s'-€gë⑵›%³÷@Û—(뙀.ç »6ïB_Ù™ÌC+Y¼ôçcOÍ¥¦1.S¹-¬eÙøïqéÞS2{~û‘-æ®4u-áß¹2 ëhøvóQ\›w'ØùZÑXµ=QÃXðÍLtÝšR® ?,%«j/¢üµ(¶rÑj¼kOØÜoùqByº<‰[ú–Í>‚_tôÇúx:ïr!ÕJ3ÛsLëdt &Ùü÷ÿ&àÿÊ3„”9ÃÞyßs̵9#ÜPÒlÿÝ Ûcbu~¡ RLäœ>ÅÅ w\l#l½×ƒrZ>†Ø<Y²9¾âWöÒ˜6a8—píe¾r’ e(>ûTzþÁ¾»XûíåSœc¤8âaäγo>Í3¾gÜ;: ÕŸ¤]ß¶,Ÿ˜(”‰xƒ^&÷ûx&Ì1¡r«@xÌ»<ßÂUAªãå‹K]†½Å‚ÉsùqᏆFótßgÈÿf?NÖVÑÔeylàX\WÎaÅš9üü[…j¼*„Õo-Ø<ˆhÛñb»u|µä‚õ¿—oLCkò#i|—…šâIµè”„$žªÅõÇÝÔ†æôx7“ù?Ç1í“Ë꽩Pçyúöè@ý½FŹ:†¿vÊfÇÎ%ÏÉj-óF‡ \T/órÌ×Ì›=š?ñ&°n[ºÆF²íÛ©,]”@í~6ÆX­†Å¢1ãÖ’ar£|½çèójÛ[>½[,©lZ§Í‡¨]寉Xq®Îs#>ÀyÚLYB–Æ@ðc¯1¨G j{¹è` áÝŒW?)`þÔùÌùlêòµiöz?ܦ]ûä“6Ø~JOGã­Ñ–&fv昦œÝ˜(ºp:wócïìÏYrʆµ ç°TvV(´ów;cbµ÷"´Q ÖÇâ«ôˆh£ýöÞÛÇñ ›q2Ÿ'uÓ6àGt«0œKj{âÏLaåßË=Çû_½ˆ¿Ýëbí§Ží±–â°ôÇ2‹Åb‘0ᘴ‡ü cÊ8Ìþ£**EVÅ] `!wï8b§yÑgl/‚åw«!&.,O—ÕbðØžÊØÞ7ÆÄiÄŽL£ÛÄaÔ(Sú¿‹G‹ÿ#0×ä™C!þIWƒùÇY=á3f/ÛCZz鉈›±mý»yÞOíuF,*CÔ•qVr9:©7Ÿ.u£a³Êh/ïažäÇ)ßóÛ’uHÓ^O‚ùÒZÆöù†+ Ÿ¢ŠÛÕ+ãüCö႞jLYãn&öùŠK!eøóÛÌù«"MúÝvehº¸›eߎaÆäiü¾t'r „TÀY¦K%ÝLì3†óAÎü5}?NžÆŠ ‡0V¨CH¹lþö&¿œ0“}p+÷–£qý3Lîý)iuZSÝKMáÙ­Ä}=š¦Ìdã®S(Þ™ÿá ´Í[P>wÝõMsœ­Ó¿dú¤IÄÍ[Êžã¹x…UǧŒ °—´š¹ã¾ä§ïg²~ûQ ¼Ü8÷ßdüZ¶¾±Ÿ› 8·å¦ýšÙ3g³jÍ..è«R-(›uï à÷43YñKYu¸2ÍëŸfJñöD¤2åOH®Õšp§½%ÇÊ× lÆ#À©Ø)Øxš?—îBWÝ“CÓ¿à‡)?°bÃ! êêwu{[±È¹“øÙq-Ζ·°}â~œþ Û˜¨¦%~ʧL™8•ßWþ—œòu©æïŒ ù§Öðë¸/øñûY·˜/ãV½&þ.jÛùå«pbZ›sçFÈ,—Øùé+ŒÝDÓ&Ð)WÇöäÌ·öC6uZÔÄ5ß^¬lý¼²?Š…7éÖr¯²'šb©`÷8 -!¯mËRŠ1WiQkü¨\=• Ÿð긚Nì°mx•;ʯÇ1ë§8v¸„{XMÊ»ªí¶Ï3s77_!¨|2¿}=–Y3ãØ¹ÿ.¡5ñw× ¤°cY<^Íc¨¦ÛËÄësÊ[]ⱫŒþövzëîë¦~.jåt/Ä߯BÓz¸$­çH†ùê?äeÛž<*µ¬‹GA‹>þŒ5™5i?dƒúµÃph*ã¿ZÉG‹ÕÂÓü1åWÒC:Сu0Úâ‹{9˜ÿñ(6››Òuèhú÷j@îŠqL[}sžû/LcóôµhZ `ð—±´:ΪIó8i,KãéRIC¹NãøjD4îEŽÍ–ÜCÄÅ~ÍnÝ“¼8l$Ý[¹²ó»Ÿ9UšGèŠ÷­0 c†ò[Z5bÞÍ»¼Bõ+K˜;‹¤< –Ìü¥cåT6þ´Œ3FÀx‚_Mf¯ssº|ð9ƒÞíAõì•Ìœ¼L‹½˜émÏ¢g8Å“°èj˜o )çÚ† Rص3ßèÇñQ‰•±³—WÍ£[ÇB))÷JJV[ÓÄÖ¶J;æÚ¢b"pUé(ߢU\”kê&~žqŒÀŽƒ0¤'áy«˜1ü{²Ì›üx~™JÕ—>bðÐשU¸ž™#§s4§ä÷ÛUzìJ Wj„âg9Έ©YÖOª—“¹¬Ò²åã„y« $ Tn*Õ;)*Åz¬sŠ··¤XYðÞwñ°€ÿ³ýhU!xwÚÃÆOO’QÆÓ+mÄ¢ƒK¿nT¬®w䦻ö¢iu¼‰®>‡#Ù/Ñ¥m xµ`Ù×id* ~O¾BÏf1„{©*xœ[ŶUçÉ5;vòËÆÜ¹µPp«Õ‚ʦ©ìHÌ¥FD S·9ˆè†~˜“r V%µÃ„ëVÛy•—°ØytëXäí+9÷J]ÚÈccòÊ{0æ`ACµ^oóôcî(@Å 2h*ëv'$Ä‘÷—¡öýyªŽ+ U©0ÈDʠɬŒ‘ÐZÖßaëØ•k)õ´ÈVÆIDATÔƒR ñðrªDƒHg&mÜOV“º¤¬Ýƒ¥FBÝÌdžLÅè݀ʞ7ïUèê ]Còy#8Rª]÷)aÂréh*&Ÿ§ t½~$Õâó0qî÷™¶÷ï ¨Ý-{ãV„¢Õ£¶{þ2rép f¿®ºÜܯwx(Îq§Ý-}³›r„ËG™Ù¿³nVd˜M \Îáâ±s(:|cŸjÜ«EbPo²ºy}¥6DùÆ2»þˆjHÍÈ&D5lˆ‡VÁê§PlÆÚV¬î0j7«xÙžÓµ[ŽöbQ€%¸´ñ+À‚Þþóej7| N×^§ Ñi)ãæ{í¶/(=*%ïZ€ƒˆzÚ“3Gw±ýD’ìçàî$L¾ˆ™­¹s{+…²`K"ya\ض¬ŠÏRÛ "÷°#±*yìÒmæ•Éþ<ö¾=wlæ^)•¼-ÈŒ¿c ¤VˆÛת<«îkbûñtL!޼¿5+¹yá~¶$]ÂT«´Ç.!Å¡uH`³zè¿Xϱ3NìÞ§6 œ2 XýÂEAÁ‚¹„/r°æa²yðEÑãlãY‹Ù*•ã•ß¿¢E_ê–åê~‹o𢫋¥ï›ÅlAqiB¯ØîénݲÆÕ™³ÿUnï§J)±ïŠkGO¥aü6â÷Ä?k(K~ £Í¿‡SÙÚlǺäXÝYwJ¨©‚’DØSµn~`áNbU´”³“Wvçqisï¶Øš+v¶¥ÁvßÍ_]8»ù±wöç,9eÃZÐsX*;+€ý¹¬.׊žÏ)l˜3ŠåÕøÔèÀ›CºRAWrüm»¤À¹‹c‘Åb±H„pLÚ}ý•2–¿Ç§Ëj1xlOu~Íš!/0få9L÷`sŠkUÆt ž¿Žÿɯ¥Y2IX¸‚ 5úñ÷ö'Úîql$¯þæ\BÜòKCBÛWµyª{íÿÝ-…ä¨p«ŠŸ‡’+B)…øG²j qSç³ûèE 'ʆ=I»7»SÏG pnËLæþºÄó¹¨<*Sï¹~<ß2}Ñê©0•Uï dÉiàÇ·xg×ûŒy[,ÏmeÞÏóø3á<¦²µhþú@ž®í‰ °ägëÌ©¬Ùy„ô<üê´¦C¯.Ô,«¹z[ú­Éø ûËïcbÿY„¼Ó‘ô¹3ØWv ÃÕÆ©X_ò’V3z{]BP›¦Â0}EIûóÊ`ë°7ùåpboÿ·ŸÆF£O)96æKk7h1£ÇÒªüÕCZþ¡ |2ÎÈ«SõúNMi¬ú÷à[c3´þ­mÏÙmµz[ñ±;vöãaéÒVNÉûO’¥1XÿYžïÑš`åZ;¢â¿:’»,ŽÓ(ô®Eó7Ò6³È-¡|ŽOëË„än ÿ¤%^*€\ŽNz‹‰g_føÇ-ð¼åþQ y­aãû·çÕôâ±ê]Èô[rÅv ÏneÑ”Yì<œŽ.(Šχ²ëÛ­<1þsxÈeÛ…ž„@ˆ€ñ+¾šÌ^çætùàs½ÛƒêÙ+™9y™(<µ)“6 jò:}‡ç¥æÎÄÏ˺”bÏ”ixjôxÚhðïþÆ~PïjñcºÄ¶ékqj3˜Á#‡ÐÚÿ«'/ ¥(LcØ¡ü–V˜·Góî¯PýʦÄÎ")ÏÊ“c…§ùcʯ¤‡t Cë`´ÅËÜÌü²Ÿƒ»“0ù6ºúçJmˆòevÿ>üÕš‘MˆjØ­ƒ·ÞÔnVñ¾q«@Ñ:¡Q®V¹)G¸\p”™ý»1«H‘g6r¹KñâPíBp¸O #éÇΡTèxõöçÕ7à^-ƒz“cû+elî¹[úç@{m¶Ï^< w÷g »‡<}5º~1œÐ“©½PÙS}³È ¨C€v Éçà}uLƒCËS=jk÷‚œ*Ñ Ò™I÷“Õ¤.)k÷`©ÑŸP+Ÿô±™g&{±²žwÖÛhäÒáÌ~] ¼-Þá¡8Ç–ãR !,WðûèÏÙ˜U…Ú ê݃z!Sùnõ“ªkGO¥aü6â÷Ä?k(K~ £Í¿‡êlÿCŠ} …¤ÅlAqiB¯ØîényW”âE¢ÇYWòU*åööù7»û£ T±±Ú§ÂIžù^ŒŒ½öÚkŸ½x€¢÷¤¬/_ å¼qR«qòG“¾Ÿ7+ó‚ÔxR‚ ÚR÷B_1šêºÖ-Œãˆ¦.M«ºX¹ ¸Ÿyf%OªøÂ™xRs®Ç¥KGÉ1Ëñ@ˆ¿›¬ ñ LDwot9ÙµyúÊÎdZÉâ¥ç°8ãxj.5͉üñË2.ª^ã‰po Nî`÷i†'<­Lb•b"çô).fxPÎN-¡«Ü–ÇÖ²lü÷¸to¿)™=¿ýÈsWšºª TPãõX{Âæ~ËÊÓå™HÜÒw°löÌø:¶¿b}±›l >>tgÙ¾x5;‡£:±’ùë2J¸ô-½ÝUWÛíUÛi_õíÄÃj1Wµ=QÃXðÍLtÝšR® ?,%«j/¢üµ_Ês®LÃ:¾Ý|×æÝ v¶¾V ±“g¥É+{ëîu¡Þœ‘Ìš´®"(sn3¿/¿J „ø›ÉÊ¡}Õ—y9¦Gffü§ß°úDeºÆö£®ë_,]”€ºÖôêÊÙßÇ3aØP¦Ìý/.1ïÒ«…ßí“XíEh£˜×Žâ«i‡ì×Ú`Z ‹¥]…DVŒû¯ÇÍ&Áó9ú n‹Ï\>ª¼›ñê'oR+w=s>ûˆi‹Núz?j»+w´?Û±9L¾S8Ͼù4†ƒß3î÷øa D÷m‹¯µ¶—66´×^ûŒ^vâa­„u®Îs#>àI·½,ó>ã¾ý a¯1hH †;º[îL`ÓÚ8áEè*è­ï•26òìNbgƒâA—aoQ3s?ŽÆÌ54éû åõ:œ4roYˆ¿“b±XäWŽ„pPš|͆x(™¸°ü=>]V‹Ác{¨{Z”q˜ýGUTЬлÀBîÞqÄNó¢ÏØ^ëdÔÄÃÉÿÈ]Y9BˆG˜9;…c»—±hQ2†èæ”@N\JþqVOøŒÙËö–žAzââfìD[¿éÓF!þ©dåPˆR•Cñ°)<1‹/>Y9¢#/÷éHE—å–m!—vÍeî¬U>›ƒââCÅÆ/ð‹MñÕËmeñðzV¥8BŠC!„RÞ ·•…B!„‡B!„BŠC!„B!Å¡B!„âP!„BHq(„B!¤8B!„R !„B)…B!„‡B!„BŠC!„B!Å¡B!„âP!„BHq(„B!¤8B!„R !„B)…B!„‡B!„BŠC!„BñQ,‹E „B!@V…B!„‡B!„BŠC!„B!Å¡B!„âP!„BHq(„B!¤8B!„R !„B)…B!„‡B!„BŠC!„B!Å¡B!„âP!„BHq(„B!¤8B!„R !„B)…B!„‡B!„BŠC!„BñPùžLØL:¡ÎøIEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/16_fields_snmp/167_host_snmp_v3.png000066400000000000000000000760451516513262500320250ustar00rootroot00000000000000‰PNG  IHDRŠrr]ûebKGDÿÿÿ ½§“ pHYs  šœtIMEá "F. IDATxÚìÝw|eÇñÏìfÓ{ï4’@¡—!€€ ÒÄzçY9ì¨Ø@°Ò¥I•Þ$ˆ¤Ð!Bz#!=›ìîý$, w§÷{¿^ûR’Ùgfžißyžg&ŠÁ`0 „B!D3*©!„B!AQ!„BHPB!„…B!„E!„B!AQ!„BHPB!„…B!„E!„B!AQ!„BHPB!„…B!„E!„B!$( !„B ŠB!„â·2ùoÍX_~†­+Ö°÷D ª0wô!¤ÛPÆŒŒ!ÐF-[æMÕQ^žð6§åK_§›µT‰BñW÷_iQ¬ËÞÆìÇg²dW2ç *1hÔT_ºHâæxþ¹¥œ¨0ü13ªÏæÛ'F2räd>M­•­-õ&„Bˆ_á7·(¦íþšÃY5tj[‚úÜAW/3”æ¿Ó²ç£E$TžqücÆDºº›R_ø#‹^z—[™ÿM ó&b*Ûç‡eGþ¹bzTh̤:„B Š-رâkv•Ýø÷¾ÑtºÇûº芎°ý¬pdðãéæÞ:4.÷в¾JE_^@izõ$+s.³cÆ8²Ÿþ‚׺Za¨:Ïž/¿`ѳd—°õ$zèLˆ ÂZõYkøûßV“käUlÛôyŠï~„‰Á'Xüéw$dWcØ—ûÿ6™wÍuë_waO<½žBÇXZæõñ\¬w!´÷¦O艇©‚®`3Ï>²„ ËîüýOö¯Ü ÷Ïá…hË›.ã­”js`åçk8p:‹23­ÛàþÉà ·WŸÿØgþò¹ëêíÕ°^ô!gU‘¼°ôE:Z¶\6´°mZY\!„Bˆÿ9¿¹ëyâÌñ„Ý ÉϾûã@PYà`£t¸µõÆRµ#@©¾}K d–‘ôkk‹˜ûõ¤‡ûZ¾ÉËæLA½¯L£‰`ÄÐH<,–1û–1ò¦åWb{:€’³˜¾£ñBéÈI-¤.ÐØü1Ro×EtroR¶2è&ÛF!„å x-,ÎxÇ…ï“Íé: #®š›…»¶¸s”‹¥‰Í­#¨ÕÕ/¨Lþ”W??ÖkO¹ö_r˜^ßäáµû@^þ4ˆƒ›6±óàNg&³73™½¶3ò­YÜë{³¥oôÿWþÑ4ô)×¥SåW×Ñÿu5¨Ya®úíËhü_ôº†VK÷¡O29²ñûlT˜¹x áÌMçoÜÍË6whyÛøË1B!Äÿº?àõ8 æÞ=6äæ!@íÒ™Á PÀ†¾æx©]éIÖ/ÛEz^>¥ÖžØš˜ (Ï"¿Ê†ZrŸåÚó3õäí[Ì¿>ýŽó>÷ñòüå,_0“‘­ÐçpRq£†1CC.vðèLÚÍ©rCC@MÝÃO¥€Æ›`§?¸µ«*‰=§Ê0` :ã ó•a®¦7Ìî¿joX¾5..TVÚÒ¾:DÐÚ¢†ò²rêLn¥ßÿj½]÷oR¶á¦ÛF!„ÿûþó}€jWú=ò Gÿ¹˜¤ôu¼6efÖÔUT£°éÁ´ñm±1Õdy•ÉÌ}h «\ëÉͯl\Ö6å$>@ùádNìÅMu‰´ ÀŠÖþv¨•*¬LÊHX·†}÷!&ô†úæ›Ì½¼ùx:a¾*2O_ ð2š.ÿ‘+\ξ·ål+G*/dS8ÆÝGg ÃòV–±øfå›b;”‹9³g63+ºâkÈ$é§tÊ5áLÿW7”u™+¦×Õ[o›Æhði±ì®ÜdÛ!„âßå…ÛïÁ¼ð¯×˜ŽŸ³9µ5˜:xÑ6v¯¾ÿÝT(Vá<ðÔH"]ÍÀPE­u4§õÂöZšÁºÃ4^}|(¼r’p$1×0⦾ÌÔH+µ#Ñw÷ÅÛ .ý´ž]™Z0kÍèYïðp\žª\NŸÎ÷Pb§ÎæÍ±˜ÿÑ+kßQ[£Ï˦ܶCÿÁ¬‰¡X´Ôƒýk–±…òÕîw0cötú‡ØSôÓ>$äc9˜Gg?K?—ZÕ[óIZ,Ûä¦ÛF!„ÿûƒÁ ï*¹ ®½çðÚ{ ÿLå !„B¨¤ „B!„E!„BqˤëY!„B%-ŠB!„B‚¢B!„ („B!$( !„B ŠB!„â?æ7ÿ ¿üQjO!„âO sçοé{òz!„Ba”t= !„B ŠB!„B‚¢B!„ („B!$( !„B ŠB!„B‚¢B!„ („B!$( !„B ŠB!„B‚¢B!„ („B!$( !„B!AQ!„BHPB!„…B!„E!„B!AQ!„BHPB!„…B!„E!„B!AQ!„BHPB!„y&·­d}%ÚÍ®#)dW¡3µÁů=úÅáaŽ Í`ýÜ%$™wgÊô8¼M•k߯=Ç—ï®Â0úÆ·ÊãÛ9K9QãÆÀ'¦ÒÍQÝtVe ,ž³‘,uãžGi§–¼Ãš‹MImå‚T,ƒcBp¸nÍõ\>¶˜6©þ÷‰´·mœ¡ T§®fÎWEôzt:½]ÔX5é ÷ñÑ‚=X|–ÛY¢È>ùÿKWÆ™_ñÕæ#œË-§ÞÜŸÐî ;ŠÞ­­öÚæO{‘½–ÃxsÎý›7ÚcªysÒÛèŸ^Ì̶çùpê˨òåùïr§{³c¦x3§}LªIÿ\2ƒæåüðâƒÌ9ÓìaëMDÿ±LÕWÍÍW¡®ð(_²œ's¨4u¡M¯Ñœ†dE!„øó¹=]ÏÚ\âãs±¹{zGàëC«6QÄC'ót%Qßhr›V.ïßıKº‹µõ³£89•ËúF?4Tr>)ko¥ysÆÓÛooo|ü‚hß÷†k(H>Eq½‘ʰ $ʲ¦ÒÐèµ¹ÿ¹§ˆPþàœˆÊ:€žƒÐÙÝTöÆÿgµélÞtבÏóäÈ^D†Ó¶S,ãŸy––'X¿;‹ºF“;†y“óÍ'ìÈkù˜q u&gï1ŠOf¸ÌÉ=°v½þ˜±ò" (ˆ   ‚âè3æ éhJæ¾ÃäÖÝäö0s'Û2ܸkú½ô ¤Ë¦òåÒÁ]œ×Ê&Bˆ?£ÛÔ¢XÖØõËÔ“^cƪ±m”PU8´BçšeìÚr’б‘تŒgZ» H,ö%“VÖ‰Nöª+9ñ‰¹6´ímϱ¼›,–¢ÆÌL º:tc³°!0Ê6&’^I¤MÃUT›wœ´'º„:¢ 5¹ü´m3‡R²(ÕZàMÿ!}hc§†šT–ÏÝI«{{qyç6Rìîá‰Ñ¾”ßÁ¦=Éd”Ô¢²ö ]Ì] ‰vô6•åï‡ÓÄ'ì¥AWvŽý›vp,½€Jµž!=|G'¼Ì•+e÷ˆžÔÄäøù"êmýézç=ô ´–§f†:jê¥ÙŽiÀˆgfÒÕÌ©Q‹ ×¾STõ _.ÅžótéÊŽó7;fL0·0úêõ%ì{éa>1{ŠÏft¡áðÐòóÒÇyî§¾Ì~TWxg"]L~9f­œ,Qêk¨ÓË&Bˆ?£Û“-4D…Ùpiß'Ì[¶™C'.PXYl½ñw³h:cº ëŽuÚ6¾O­Äp£…µ&¡¤´r®;ª2ɱ #ÔØ•Ò G¯oøè´•žÙÏ÷§j° ÆÑhDV°舯’IBzÅ•å¨#ÿÄ9ªœ"sTƒ®˜#+±£Ø‡>câ¡ûPÏÊ¥;ÉÒ^YrÝ%ŽmØK‰w7úwvCÉ?ȪuÉ(áƒ?iãÌHÙ¼† ›5kj3ù~Ñ—ªlMìØ)Lº§+[XüÕQJ®o]1G7'bÒñn¦<:‘X·¬ßKNìÌjf­‰íæ@Þš§yüÕÏÙpðYeuÐàÜžp¿f7¦Þ ž>‡¤Å,K(»á1câMo·lö$•ürÌ”§ì&Í®]=Œ:tº+ŸÚËdýø Ë~¨Â6¢#î¦öDĶAz/©UWæ¨Íâ@ü%¼úõ¢Uè8^|é~‚̓Žê‚ãlÝ”ŽyxüÌe !ÄŸÑíiQT,:I>ñMNáÀ·GÙ˜;Þ9†>ѾX©š4GO†E'³tón:¶JkÅhR¤M¸={“Ò(êˆRÍŤl,Cãp6É¿>'ž_Í;¯5»ûõæÞ8?Ìo0^J±ö§£¯ÂúÄt*""±©/àTj%NÃpTC]öQ~È÷bÈ®´8záá Ùîà§Ü¾x»úzÔíÇp_WL€ÚŸó¹¬¸Ò#:œ[x9c㖉ʢiN¯¹ø‰åÞ |p ìU€7n–%d,:BrqGúØzV‡Ñ¯mC “m¯¶XZHY= ‘úOK±&rÚ»Ìj³‰mû~äÛ¶³°ôŒ¤×àQŒ‰ ÁVÝô˜1ó¿›éöñòg+‰ ›J;c·}j:õtaÍž$.ÅöÇY© eO6]ïÇS“qý1sâ]Óôg¡#ynB[,‹ˆXÚè²÷\5Û[R—uø_†tw¿v2©Ïâ›§þƪÀ²#ü­3ö2>Q!$(6½@YãÕߨþtUeœ!éÈ!â·,&½t ÓxÓdTžbŽ_ß¡„ŸZÉw¢x¸—ÑBq Çnéh¯É$)Ëœ¾N˜T™¼ÑÃ,(*Ìlœp²5k¹U±Â¿c+”u‰œ¯Œ ¬â4gÊéæˆU…Y”Õe±nî,6^½øtèô ”×cpTxµ²ÿ¥rM=;ÓÁaæ~@BX(ÁÁíˆl†­‰5Wg¬§2¯ˆz»|­¯-¡©K î& d—Öƒ- ²ÄËÛæZ7¤Úµ\„ÿÔö„ÄŽ'$v<†úr²OÿÈÞ­Ø´p&Ç ÞâÝ A4i˜S, »w*=˜Í'kcy„±B5¸uî‰ó·»9^Ò¾fgÙ{ÖŠ.÷zbzÙÈäfAQcá臣Å/û›bAlp=KöÿLuûòærë»èÚøMjw½øQøñÛÏùèåE¸¼?•p+ÙQ…B‚"P—wˆëé6<O (jK\ü£ˆóoGèÖù,LN$¿¯7>×e´ âîbþº écüZêJ¸íAÓ+hc•ÄEÓ6ôvÑ@†‘Ìwåa–_×ë¥`Ù:ŠVÊZÒ/ãVœB™cdC·3 zŠy;FO‰ÃSÓô{&–æ(:Æui”FËáÏÓŸ¦}ÚiRR&åûEìÚêKÌøqôq¾Ùâ((Ð_í\TÔ˜šÈ÷¯F{a=¯«gè## 0ÅÄïˆXÆGô¤óâ'˜±oc‚hÓ|÷°b¤<1ïc6wmü wïJO§uì>^J'»=¤XD3ÂÛ.»Ojx˜Åò†û£=áý©]~ å6;\FÀÈhœÔjòΑ^éL¿#Ö.ÞX»xÓʵ’c|ÅžŒ“þg!„ø³¹-cUª:rN!þ|U³±SJÃS–*õ f¬Â¶íô÷)bߦ„kãòš$EBÛÙ—˜ÂÙ„ 4mÂoéýn¿**Z¶¦ck™?%pìd)aWžvV0wvò&Bƒ5vvvØÙÙa£ä¿ó0Y5ÆJÓSžv€‡s± îLì°û˜úÔ“ vÈäè±üFO²ª°rsÂäòy2+®ü×þL^½^v&²·þ•Dµ–´C›Ùt²üºñ†* ÖÜ åX…cÉŒo“ÍšOw‘Wo,)ºÑ¥»#çwÇóÓ®Ó˜E÷Äç7?d¯àK`U"{â÷_ÌÀ(GTè)KüŒ—ß\MZm£½¿¶œZƒ frs#„ÉrÎQôÖq|å"¾Þõ'SÓIO=É߯be|~=:ãv£p§v$jh Nùç(2¢o‚cXÖw²=UMp¸ë?4O±À¯ckT÷óc±aŽ¿t½™zv¡“K{¿ÞÌOiYd¦cÇšu-±ÅÙReôÂj¢ÏáØ® l9|š Ù™œK>ʉ"îÖ4vfæÛöÖYl[³ƒäóÙd¦ÆóÝ7ñTút!ÒY‚â_™‰g,#;Ös`ö Þûê{;Îñc‡Ø¶ìfo*#tØ ünîÔîÄN…çÅrŒ3<ºuÃáÌ –ÓÕ˳ßsx8DPÆî%[( H¤¨qŠD»êÝ,ø| ÇÎþLjâN–|ø-¹Þq ð3“,„ÆëÓ퉟¶DŒzË#{Øwl7ëTQ¯6ÇÎ¥íGL¡g;çglâÚ•a=ùüÐeã¿wjK˜ÝÖ…áv;Þ?¨`á×M*gmÛ¾dÛÄÞD³y+ûV'P®·Ä­M/ÆîÒðŠ’:#eatŸïØvð–îУ¶t!°ÛhG;¢®+º6¥™'Å|Ó¾_q˜Jµ^¡ƒ™tG§†My²ù¯KíDï¼í–•¬ù~%ó×–S§¶ÂÙ'Œ¾O¾Å]=½Z¼!ÒøeúðÝ<¿¡Èøï=»ÓÕe-ëk:Óêw†6ÅžˆØ@”3ˆ~å59 vé˓ϗ±è‹µ¼÷ÏRêÌi5Š™£µäD!„øSR ƒAªA!„B4'ïhB!„…B!„E!„B!AQ!„BHPB!„…B!„E!„B!AQ!„BHPB!„jò„…øƒèt:´Z-uuuèt:©!„ø 177ÇÂÂâÿn½åOø !„B£¤ëY!„BHPB!„…B!„E!„B!AQ!„BHPB!„…B!„E!„B!AQ!„BHPB!„…B!„E!„B!AQ!„B ŠB!„B‚¢B!„ („B!$( !„B ŠB!„B‚¢B!„ („B!þ÷™Ü¶’õ•\üi7»Ž¤]\…ÎÔ¿vôèC„‡9 €6ƒõs—dÞ)Óãð6U®}¿ö_¾» Ãègß*oç,åDŸ˜J7GuÓY•%°xÎF²ÔAŒ{vA¦UœZòk.6]$µ• þQ± Ž ÁáÖ¼¾ô,{¿ûžcç‹©ÑØãøö¸™)-~¯.g;ó?;Ìeëh&?1ÓßQ5©,ÿ;œ&>Á`/ñi UœZ±‚¢A“‰qQË^ýgWsЧ¾Ì*_˜ÿ.wº7Ûß‹w1sÚǤšDñÏ%3è`ÑrqÚô¥<þì&ŠoðûàÇòFoÎm^È¢MÉ”X¶!öþiŒìà@ܵœÿj›>É#}ÐüŽU3ÔæÿÍ*¶;CÚÅÔ.­ëÆã†ÑޱᠬÏZÃßÿ¶»¿/áõ6(ÿ*7T_`×ÖŸ ÜŸêãlÛ_E§!Ýpý#ΆJÒ¶~Î'ks¡Êÿ˜ñ<9¹^f Ô¦0Ú‹ìµÆ›sî'ؼÑÚV'ò椷Ñ?½˜™í2naº¹÷ÔLžß¨aÌœwåÛxKé(Ú3‹ÇdÓ÷µx(Ìò?R¯Bˆ?¿ÛÔ¢XGþÁ,Ýò3V‘ƒ¸oÒdÑ— ýqÖ-þšc%º¦“—üÀÆÃÔß´Ü|’SËÐ7= S™žD¶±É=â˜0e S¦Laòƒã¸³£ÙV±ò`þÍç¥+âȪÕц2䩃ïèç™õÜPlÌÜm¹MÏAùdS&u7+®ÅéÌ1Xû,¾]´ŸB]ã¬z’ÕËO é:™1¡…ÿí ¨Í%>>û˜û¸§w¾>´jEܘ1t2OçPbQ““¤M+Š÷oâØ%]‹ÅÚúÙQœœÊe}Ó»õóIyX{; 4;û)Îxz{ãíí_íûÞð` ɧ(¾IR¬/HàÇ|zëK;?O|C{14Æ•ò“ äµt6¯+àø©2¬ÚÅÒβ’3Éyhoã4óíà¹%d]r§÷d¯þ‹p u&gï1Š†ËœÜsû`×ëö÷QÌœñ "(èê'÷êì?VÿØ0*@!÷§Tlcht!½Fsûyâ3µ@-i×S;ŠH›ß/ôÅXð!;kûòÌ¿fñèèôèØ‰˜¡ãxê9Lk—ÅÚw—r¢Ò€Ê>’»'N`P+³ÿPM빜~ŽJ·vx˜Ö‘:3ÿ@ÿÆy¥?§QáЉÁ±‰̨®Vd%dRÛh*Ç0or¾ù„y-Ÿo6bÎ}uÅôÔ2¾L*Çpåæ5ã»Eì© ãþ ÑØIJBü׃"õhÇL=é5fNVQzn?{óvÖ +<Àʤ îëïaäøÒ’³/?r?£FŽäÞ)Ï2o{5FŽúÜ}¬?®¦ó”ûéìdÒ,ÈzÓoÊ8+°.ñ2†ªc¼>v*‹Ò´hÓñðÔÄÇɬ''2zô{y1?\½[«:Æë÷?ÉÊø-|øìî5ŽG^ÿšÓ©|÷îßypÌHF=ø<‹¼„±SR͉¹Ü?r4Ó?O§úô\&Ës› (ÙûãûšÌ:¨¿”Èê·žbÊ}#uÿÓ/?ÛGa}5)«>å—{yl€ç/ÌÄ%šÞnÙìI*ùe/OÙMš]7ºz4ÚÎuçY3ûSâ-û2õÅ7™õü:TngނÔ6?˜êóÙ=o>‡éÂcÇânÒppîý÷{æÍé˜2c¦w?ÎPï:ή݄þŽ„Y^Rwq³çíEÕk 3g½Ì£±ùü}6f6¨ª.$’­¢WˆµÑnOµS$ݼt¤'æ\ׯ¿´Ÿy Óù^{á:TÏœ~Îñ«aM›ÍÆegi3ñÞ{u îg¾æ¥Gßát›ymî,&f³eÉ2äfóvO²ô«ïcAø?±zùëÄ::3`ÖrVÿk>º³,›ñë/·cÜ o1ëÉ¡¸^ÈÌ·¶“5¨Õç°íó]hâžà­^cœ_:kçMZ- +åÔÁ“‚£°84—'þöߥV¡2iV ¦Þ ž>‡¤Å,K(»á9ð–¦S;Óû¡û(ÞÄÂm©$¬ZÁ)»;˜6äÚøÒ[ßvBˆÿw·'U( Æ$ŸxŽ&§pàÛ£ìÌïCŸh_¬TMï‚5=ÌÒÍ»éØj(­£I‘6áöìMJ£<ª#vJ5“²± ÃÙ$ÿúœx~5ï¼Öôgf~½¹7ÎsEÁÌ? oÝ’³k 4§¾è$§Ë]éÚöê ~@WȾ°§0føˆ¬oÔh§Í#9¥óÀöxš)˜zGà«>ËÙ¤<´¾¾ÜÊ3-Š¢BAAQT¨TÊÕë,®½†Ó7Ì 5^tï“ÆK ®U‹¹UCÙV²GÿinÑè:y{ÿ¾˜¾:Eá^;FÏ„§~iúR»Ð©§ kö$q)¶?ÎJ){Ò°éz?žšŒFIÊïþù[Ÿ;èà¨pÌÿž]Û ©Ô½ÉµÀ‹ßç³ÖÄÎ|˜îûV5îô}b1Ó*ÑšXb®VÐåmæ«”pÆ?àŠ±^Øú’ ŠîЋH'yáàwµMóûO=U%•Ì[cgzƒƒGmƒ›-TWPßlnLˆxèïÜÛÅöó.dãÉû ohi ;‰av(82¤íJNTŒã¡;#pTÀyh«ÞÍár=\7ÈRQ¡Ö—QfCk7KTµEdUÙÑÏÕ µJ¡*e#»K‚˜øÚôuUA´²Í'eÆföåôg´ 3`7h:c»{¢œîéÎÚ—2)®ƒšŸ—³àp Ï~0‰€Ú6}4—e/þƒs¼Æãý<Ìüïfú€}¼üÙJâ¦ÒNe¼ÅðV¦3ñÈ´»wò슗xsz¾0Š` å7l;!„´(Þ.jk|£ú3âÁÇyîÅgytÂ0::•’°e1‹wf]?nO1ǯïPÂëñÝ´Æo•q Ç.?‰ô =†šL’²Ì iëd<ñ6z˜eÊCSyô©xîÁ~´¶lXmÅÚŸ(oéÇs©¥žÂ“§©ôˆ&ԾхJåHçñ2mâz{^dÃÒ­œ¿AÿŒ6/‰” 3"=1K_½*Ï&‘û{*ª,ñô²¹vùT›¢–æ?=µSOšÐš3÷azÏ£ önžb4¸uî‰sÆnŽ—è1TžeïY+ºt÷lzÓaæKßa½qÉû‰Ý¿âÓw_䥥š=°e úì*Þý*»žfb¤ñ§‰UfV˜«0Tr⛘¿‹`³JÒ¶Îãùé2åo¯³ìHu€yÀ úº§òÑÃ3cÎbÖ,ijSWBÔ×fÌ­Í ¶Œª Ö×PV¦Vfן”Ô>t º¶¼*‡P¢Üuäþ|©aÕ6xº\y“ S ÖnX]ù‚¢1kñxÑWä’­u¤µ“ õ—ÎSjî…‡• ÐQš‘Ö)œFëdæÝ?Mç ê~ ¹Amœ~9>&WV¢¾¼˜ÊºZjë ¨mCþÜ^»Ç‘?z—-9ÍúŽKÂîJϺ|²öç?4wKÓ™ÑzøCô³«G2Žñí›nï[ßvB Š·A]Þ!¾ýf9WΣŠÚÿ(âî›Æƒ]l)NNÄØð)Å*ˆ¸;‚¨øa#G _QÔŽ¡„Ûæ“˜^AuVMÛÐÎEsƒ†Ík³x{yâbÛì"¤XãßÁ‹ºŸOWUĩӕxF·ÁVe@{)‹ 9eÔ£ÆÂÞVáô‹GÙI>Í¢%7é •ÔrjÅl^yå^yõ}Ö_4@å’ZHŠ–‡°+jLM$þõ診t™: $³Àèø0÷®ôtÊ`÷ñR*R÷bMï¦mÓ†ŠS¬øçtž¿™¥Ö´é7ÇǶjród(Obé{ÉÏÓ£ƒ±¸ÉîTŸý=«Ò;r_wGª/ᵕt~ð9ž¸ÓãŸÌakN=Šu“ß_È;ÏÜM;‹â¿ø'S§¼ÈêÔêf]¢ V­ÚáZŸÆáôjãÇ@Y ñ™àÑp“Õü4¥nÖ¡RÀ 74þÑo¨þ\6͜ȸG?%½ú óÇ„ç7’_ºŸW'Náíc•78T0\]KEƒ¹ÆøXÅU·‹7ßXÉñR(Ö„˜Ho»Î_Ql£˜0©¥?fsæÏ·2b抯X¸yaÓ,ÿµ´í„â¶E•ªŽœ“Gˆ?_uÝCQ•ú3VaÛöúû±oS%ÆÒ“ÚÐv6ä%¦p6!M›p\ó;;¬:àU{ޤÓIœ®ò¦S * T¥mâ‹/÷’Ýè\n¨«¦Î ÆÔXó„6—¤3•˜´̤‡§3}zÃçábñTª8›”‹öêõÌ £Nwµfê)½X@­^vÆÿ7u72}wL¿ ‡>åË“FÆçš¸Ñ¥»#çwÇóÓ®Ó˜E÷lö^N'Ö°)·#Ͼ÷ONFŸŽXUT]»ùÐ]âÐ'sÙUÁCO݉ïÍÆ@ÊHüz/#îÄ߬ž‚©˜ÇŒáÎÎ!DÄÞËŸ\ŽfTP’¸–åßǾãŒþ<ï|¾€É®gÙ¶#ãºO?T°oáN”7ÛÙë‹8²ü Ž«£¹»‹óõç]6 Î%úÒ3$ä©qpü}cgÔ®Ä=÷>¯ŽðÆ,xï-˜ËÓ½°íþ,~ôFØ`ï牦ø$gK¯Œj³’¹PçL ËÍO<*Çî<þêDÂóÖòÚ“o°6¥ŒªœÓœ¯÷¦‡Æè9бÇdÆ·Éfͧ»È«¿ñ©ûÖ¦3~ƒÒÒ¶Bˆ&—¡ÛQ¨Ú9ŠÞÁ‡Y·ru=»ÑÖÇKª(ºÈþø*üuÆMFߣv$jh Ç>ÚM>*ì,²cXÖûw²]eN»‰®h É«&~UT´ ƒçw¬ß~ÓV£ð·RÛàN´Ú±‰ ›ÝíƒEm.Çwí§Ø¥#ܯ?Áks9[eAX¯|ÝÍ]t­èî¿oÎ&‘«õÃÏÌGM ÜÇ%÷([U6Šì Š¢§º¸€KV8ɳ)Ñ”˜ÅæùßRÑ÷Eîë@NN<ÿüh5}æÜ©²ïÀˆûªØ²ý_/ª ^cƒGp ãvçú†€Z²ÏReNgóëËïŒÙ—gIÊÑâ×ÊûòÍ–Í,œ§Á±U{úÝÕ…½ë®üÝ µ5­Ûµ"~ïW|^6ž§î’ô¯({ë|V_êÁ³÷†b©(Œ˜NìWùhm ïŽhÖçÙ®.kY_Ó#ï4ÏcCçòùòÙìÇÿèÁL}«»æ.då·§˜¦J£¸¸ñ}^Úxý²øOý„Ù®´äéKøqÕxŽžEÃöP°‰zˆ'ÓÿÅdzþN¡i+úLxŠá>¦˜y=ÄÓ£?eÉúxy…µ7†>Í”î¨õ…\Ø»‰M¸3䎬Ԡñˆå²oõ*¾ß³’Ý9¥¨| γO “›Æh²bÆäqî^þ&+ À54–¿½: c¡ò&ôU Ë¥wæŽ!aØ.‘–iÀ« m§‹miãwíÉlÅ"”‰o¼€ÕgËYöÆ&.›8Øe2³& ÂýW çSY1øs Ûò/.É¢ÞÚ’–¾®ñÊôá»y~CQ‹åÞêtÍëuûo;!„hrÆ0 òæ,!Äÿ$mÚ"{)‡i _¤£åThÍ)~ZÂÈ'zb»‡þÖç˼̙»?ൾŽ(ÚŸYòØó$ ú€÷ïñB: „ÿëä]Bˆÿ† Nm:‚ëÀÿ™¿PbâJ» 5g¾ùšý§ÏðÓö ¾dGHˆ£„D!ÄŸ‚œ«„ÿ?kÚŽœDÛÿØü¬à)FÏÿ”…/í¤Ö¦=&ÏàP ÙBˆ?ÇiSºž…B!„1Òõ,„B!$( !„B ŠB!„B‚¢B!„ („B!$( !„Bˆÿ.y¢N‡V«¥®®N'"„!æææXXüÿ½UÞ£(„B!Œ’®g!„B!AQ!„BHPB!„¿Óo~˜%G+•'þú}(n¦¿£kRÙ2ï;ìÆ=AOMËÓ*9·ü]ödÝx˨)Ü;ÈûömxCé«VP7™(gµa¿F}!‡>ý'3>\Ç‘sEh­=iÛk ϼñã;Ø7ÜÕiÏðFD 8BÚ¿:aÑxÍ^HWï'ñù>µq6¿ü¼úØS´‰žK¦Û4ýü Ý­¤ª…BüWƒb—¯`Ó¾jZÅ b ¯êšB.þ´‹=Ëó©h¡öBDéìÿ1’»{ºÑr´È'5­Œ¶5…¨9ŸD¡±ÉÝã2Ð `ÐUsùüâ­â{õtîîu“yéŠ8ùÍjNjº36 «êTŽmÚÀÅ‘Ñü0UZX÷“§¨¨L!5n>¿")êŠI^ô1iQqw´ý¯kòU,ð2•»jô EåïcÛ¶"BFÜC€µ(¨­]¸]ñM{q+;Ô¢))£&~yµ¾ ÑY޲[RÍñ·3³„»^ÿ€}ý1->ÅÖù3x çqªOleš¿æ7•{rù×dä¯ã‹¤÷éÞC’¢Bˆ[s{ºžµ¹œ8š‹uÏûèÛ#o<‚¢è2b afé$'¡k4¹¥Ÿ ¥‡6‘R¢k±X+_;.ŸH¥Bß臆J²Oäaáå€Ò,¼)æÎ¸xyãêå›oÁ½ï¡w †K'Nq¹þ&y­0S´Ü—_OÜÛô¢WOWªN'P\×RF. -¥ ‹°X,+¹p2ºÿàæ4sòÄõÊ:;»X£VL±vóºò3/œìLQnÓÜM½ûÐ­Š¢Ò JÜé0 ƒa·ªò~Hë7òåÌq èÑ>æðöÚuûx7ÅZö~!xÙª™¿©9ŠN‹ÎК$“^a‰OT$mZ™S}6™bíµßëËX÷Î|‹¯UP]ÆZ–ÍYCvU‰ çq¤¨žâï?`ÑWg¹úU]é).ÿ€%o¾Â¢ù_ðczú_ŸàÉÛú ¿8Ö(l×’óÝ;,\–Àå¬-|5o=égv²õÓ·Y8{6«Vl%½äZª6ÔärzÓBV¾ÿ Ÿ½õ6k¾ÞEFÙ•uQ ”§f`7’0íirª9Ân•¡–ŠÚ†:l²{YG3cí6>ýÛ† T_Æ79N ™6Éýí(XÿI’…BüWƒ¢ÆƒÊ~Âê¯6“|ê%•õ0ÁÊ+/W‹¦36q¡ÝàîX¤o#>­’å0•]0Aö…¤þ\~%$¨¹˜H‘e­ÄDƒ½þÊG[IIê~âSj°ðÆNcw¤7†¬d ®&źBÒΖc³ok_hУ½œÎ©£¹hüÚáxÞä:ŠOž¦Ê"`7\ÚúaRu†Ô|í­Õ›Ú™ö“¥³³Ǹ'˜to0¦ é’3Û0í4Š»&Ž¡ƒSI›ö·Ü²i”)Ní‚1ËK"ûj"¯ÍæLš·¨ ,U`(?ÎÞí98÷ÍÐÑð©û‰_l&»ÆºbN®^Ä‘K>tñwß7ïêx¶¯ØIÖŠ%Þ¤Ƕt;ŽH9Ân•U&ò íµ´éÿï®ÜKJa-Ìðê:؈¦7B}=õõÍ?ºfÇNÉ_|K®ÃÜßÑ“è±1X¬gi¢$E!„·æö\É ¼Mc˜W<§O¦¸á(GS§£cèØÁ‹&IQÁĽ'1QÉ|·m7¡¾Cñ4Ö¥²Ç¯­=ÇN¤QÕ¾#ÖJ5ydz1o‡½Iþõ91c5Ëf7‹J¾½Ð×SEAÓ: 7ÝRskñõ7GW|’󮄇6©+$aá~*̃‰‚åÊ´y¤ž©ÀÔ¿=Îf ÏÜÕgÉ8‘G/·2ÂLQT(( ÿU]™‘»':Ä ^ØôJãÔ—TêÀåW[Ó¸Eâk¶œÔ •‡ÛP—“@¦®½ü­QJÁ€ ^ƒFÝÆ …Ö¸:CñÇ[8ž‡›ÍQŽxÑsú‚¬À ''(øh§óúâêkŠÊܪ¡î,dܯ;fðI"»ÍeÁòu¼1öcžìÚÄ1öñ—xuZO®ån¹ ºc»ÀXA–ø^ýßÊ$¾X›‡Ý ˆ¶Q°é:žšlø"‘zöD¶BˆÿNPP[ãÞ¾?îíûcÐUQšy†Ô£‡8±}1Ù¥S¸'Ö»ipRÌqï5”À”•ìÿ!ŠÝŠmp8Ö‡’È®ì@°I&©9æøõvB]mdòF³ ¨ÐØ8agcöKT¬ü ñÒñÃÉ\´þ>”>Mµ{ZÙ5j»Q9ÒöÞGñ½œÇùƒ›Ù·b+6S†ài~}Z¬ËOâB¥Þáž -–¾z*dK¢Hë‹Ço}úYe‰³‡Íµðª6Eõ[{uM=2cëñ T· ¤81 ƒß]xZ(P ¨\håeùËЕ•/>özÎæ–Q]›Ee]{æÏbßÕ :ôzP*êS9¢~=¦Ì¦Ç”Ù´E¤ì_ÏóÞåƒÇz±óB< ïvÁúʤ#±þ™¶˜5úº¾`=‡ýë—W&.e]¾-è„-€SÆuQرa) s{ÒËZª\!Ä!(Öçbÿáz‡Äà¢Em‰C«(º´jGëïç³þD"—z{ãÖ¼QÅ*ˆ.qA|ýÝFN÷1ž™B ´9ÈÙóøY%‘§iCg di¤¹ò0Ë ã‹bW„õ»OP\eAæ™J\z´ÁJe ®$›Â[ÜÜm1³sÁÌÎÇ!5d~´‹³ùðôk^ª–¢g¨¦–ôU³ù¬ÉïΚ7_ãKbÐkÑ·4ÂRQ£1ù£Æû™âÜ.Í׉ä–høùÂÉŒªfc¦”†'“UêÌX…Uètö."a[åÆˆQ;Ð*̆âã)d$e`Ž£æ·.©‚…\µçH=“Dzµ7a6¨0P“¾‰Í«÷RÐx`]5õ5&j#¡M›Kjj%j¿Á ›<‘S>#ÆÅâ¢T‘q"—:h¸`tÔÿòDL=™hõÿ¹®qo·&“㇒­&ÌÛüZÐq1¿æ—í¦¯ºHf‰ [w[,œÜ0¯É£Ô`µ­Ö¶vX*9œØs˜‚Z9˜~µI5GWÈ»‹š=¤¤ R&füª{…Š–n(Ĭß|$%“œÜðIÜõ&•"6.Mhx…“BÑ‚ÛÒ¢¨rŠ¢Càaö®YD}·nø{;bN¥‰$­Â#®sC¸3öŒ‡Ú‘A1¤|¾›K¨°1²Èv!aXÚÉa•9ã\1¹AQ·­hãñ{wAã; /ˆ÷ ZvÂc÷&ömw£{Ì´¹œÛ»ŸËÎ=èçv}2­ËM$£Êÿ¸»5j]3XÑj»Î%Q¤õÃÃÔ[M gǯ—JÞQ%V6Šì Š¢§¶¸€²J+ìnÇKÍŸô¶sÚЗ0 ù#?¿‡i›É¼8ô}& ïNõóO1º{ NsvÏb^ÿ ˆ^s%ÒâÖwôŠcKØPäÀÈÆÓ3ÒîÚ/ôn<÷*÷n\J¿ٻï°(®ÅãßÙeaé]i‚ ¨¨ bl±FSŒ&Öcz/777¹¹WsÓcŠ1]Í&c‰½×ˆ°‹F±ƒŠ AÚ²¿?,EPóK¼ïçy|Yfçœ93³óΙs–Ómh£NEù£ƒ"&¢n}ëÚE¬O]ÈâŸó±™­¸ù…Ýs0 ëøUúU6fÿf$5KerÊÉŠïS—e¤•ÄUí7Ž‹3\ nPc_Ájr~è¡É3žvwä³bþ2æ}}›Å¿ZItéпKrb!G6l§À-Žº5¬—®?1Çï¶“q¨ˆÀ°0šukÆ‚93˜²Ù‚GhCšÜÜ”u?åœÛ87‚ꄳqÙ·LÉíOßî×c9áW/Ç{©Ù ¨üXQK-“}صà[Öœ÷ÐÚõïHu' ¾ß=8̙źIëÉ/uÁ'ª5;5½>öêL ¦ÿÄtü>|™¡Ÿ½Ä ×r(´xR7‰{¾IáowÆ”XELdÍèiäõ㱞›Õ¸é‰î¸wû‰¯Ö¦M’’¢ˆˆT“ìv»ýZÞx°H÷×eãÔš/˜¸ª&=èta¼aÉÁ™Lø&‡6 TCr¼òã¾Æ—‹/üßþp²ODäF L/æÀàä+¾^Ü(ôEwÿcJ ޽w'WdãÑè¶ß0¾SDDDnt Šÿcì'ÒY>e öšíHjrýþˆˆ((Ê_Œ¹zîx¾CÅCPWú?§6‘³4UUDDDDEDDDDAQDDDDEDDDDAQDDDDEDDDäÿ—¾Gä:0>^¬F‘¿þõLÂOäò®æOø‰ˆˆ®7=zEQPE¹®yÖó:hSDDDDÎR¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆˆ‚¢ˆˆˆˆ\ 5ÈŸ„í»Ö™B³ IDAT~ËôY«ÈÌÊÅfõ!°v Ú÷¹ƒÆá®…[÷ØË¬vîÁÓo Üjüúþ3©|úà›ØŸÍC±»ùúÑWX›Ê­ï½MÛs¹¢J-àýG?!Ó!?{‘:Ö\R‡ÞØíå«dö¦vÛ¾Üq["¾–ª7¡äèf}1–[rÆÑŸš-{Óû®d‚œëß~ùëøøáϨöòGôŠt¼þ»ëÀ÷¼öÜw¸?6†'š»cüÉ×+"r-Ô£(ò§PÄÁŸ†ñᘠ¸µ¾—!¯¼Æcô¡NéRÆþûV¶•_üÈ4&ÌÚGI•ëÝËêÔ£”·Ü‹ØSÑâ5ðèÐ×yfèë<ýò‹ÜÕÞŸ=Sßâói{ª.«ä ‹ß}›%…‰ô~ñMžx°-+FòÉ„­دGR;ÄüçîâÍ9‡/Ú¾ë• Ë—g¸EÓ¬K9þ¶0w½Öûgh3ùËS¢ÈŸAá.ÏÚÏ­Ãxkè¹3šZukPðôKÌ_¼ŸÄÞaNXÏØ`²'ÊŠÃHº¨·°,¯?/]ljŽ]ñ=¿˜ý$K3qªFnfùå —„ÖŠÂzîçð˜(œ3à‹e+9Ò#ŒÀJzKöÏgÙÞ:¼u' 5€pî<œÂÐ) Øß·µœn°»lÏtÐà/³^E‘¿*{1…%€qQ×›5’NO½DC'ß2Ýÿf|Û ¡uþ¿øiÌr<—„W…YÑŒW|Î?.fëñN´ò;»ýÔfVez“pk5VdVQ/Ã'g() ¤ô8«‡=Èǧö|S\ €"öŽ}ŒwÖ·åÙÌÔM$ÆïüÇŠ gŒ’JJ+Üh ÷ÍçÇ/`ÝŽŠ +¾1íèþÀU³Pz|ßœFý7Þå¦À³ë,Üú!ÿ^Ì=Ãï$ó_O0ýð߇yzí ¼ù”Ø)>¼‚‰ã&²fûl¾q´üÝxaìù»X1öKæ¯ÎàX+Õv¢Ç½½©çëpöÑõc_þè­œ™ù#«·¤Ä'޶÷?A×:yÌÿÛ¥å.ó¨Û–³ŽY_~ÍŠMÈw¬Ní¹ëŽD¼*ÙNŸÃÌ­j½ÇS™óåX~Þ´—\?BßÂ;æjT^çú^啸¨¬gx¨ú(>Ýs'¯ü«Þ&€3ìøäa>ÎîÏ‹ý3ùè½näÅʉóØžUŠOídn2€ø€³w •¶§ˆÜ7Åj‘?§š4oêÍÑŸeؾ`ÁÏ›É:UŒ žQ ‰u+²:“tO<6ŒfJÚ).÷d×Á¯1Mª`UúqJÏ…³¼m ÙëÑœÕ+º˜Û°ÙÎþ+-z_ ‹ãl˜;³?ƒE;ûØ|sá 6Jm`œ(ÂvöýaQ¾eÞÊç.%ßq[µn„¸Ú½z—¿ñø¹Ÿ®m;mœÚ{€bŸD"ÊŒ-p¬Ñ–ùì9R >×Zçów5IŒwæ“%›Èm™Àþ©Øë>F”»Gsqµ~ymòŠ¥N€”]9œÎ¯¼=/I©"¢ ("צxÏÆO+!yH/BÀpp§z½öô¨×Šúÿ}œáËp°W5/îUóHà–ñ¼úÉ',nÜ»âìÐŒF>“IÙx‚8ÏEübmÌM5¡‚ xñd–Kð":©Eß.ç@®;›W"ôÖÆx™ífï`_žá5}pñ ÆÅ/˜þyl~â[VíDtlùµÚOoæ§7^cIn$ “ì_’¦E[pLhEà5Í G\{ÂΤ²jõ"ÒNGÓ*Þ¥œNÿœo}Çž2cãì…¹Ù°8\\y;ù›¿gQV#¿>”ýz‰óé|J/”ØK(*>ß"Åß¶—‚Òk«·sP®y™d—záí뇷¯¦_X4a:™g~Ûý¶gÍŒììÏ;_WG¼ÎoÍaßÆÊ·óòÌx„ápl»Oþúe6EÒ9PìG¨Ÿåw9öœÂ“‰uÜÎÂÉ?’á@«h×_¯í›3ó/“¥'·±%ÛŒ_„/n×­=EDAQDÊG‚ÀötŠ/aí;/2ú»¹¬OÝÀöÔ,ûæ->ŸuŠÈî º\¸3W§ù½wPmßzÛ+šD`¡ZÓæxlǤT uZ†ñ[¾ŽÚðªOóˆS¤ŒIníNÄx€¯„ÎD,ä›13Ùœñ ™éó™4rGjt¤U¨Ó%ÁÍÁÃÇü Ö.[Ë®›I›6‚Q3c?µ“]ò(µVÃÏ1›”iKÉÌ:ÄÞ•ß0~áÉ2ŸZ&ÃFþ¡}äœ,¤ªéŽ]i]ã3ßÿ‚2Ø:©Œ`y¶nWòQx¹ò ÜúÐÔº† ŸL"}û.2×þÈ„oS!2_¯Ê·ÓVÉv8EßLSÏ &}0–5›w’™:ƒñ#fÝ•¦A×+(Ë9‚f Ø»b–Æ s.»|ë?ýy«¶°kãB¦¼÷9;ÝÚÒ¹¾;N¿¹=EDAQD®0)úÒä‰wyðÎZœüy<ãÞÊÈáŸ3“#My!kT:NÄ!¤;}»\þ÷-hèWDK<‰a¿qì˜áEíäZENÄtŒãüÐC³_[>{Á{~dÔ¿þÆð÷'’p½Ø‹à ŠtŠîOÿ.þd|ûï¿úóvGÐgè#$¸m`Æ”mZëpËÝðÛòßþ_͇䇺p¾!ÌÞD5¯Ké‚×ygÔV «ª·%Œ›^J÷à_˜=üEÞþ-Û½nãÁgºRíJáTRžáËí¯š–ö zùn"œßÞž"ò—`Øív}È:X¤6£³þÆ«3ãxæÝA„œën.þeC‡äÎ_¦®‹ZI¤*AŽ7ævé¾ODäTiÞ~vmKeñ”=øÝôøo»*"7*E‘ÿÕ xx ?œMiý»èß9D¹„=‹\=z‘ŠÜ¨ž5™EDDDDEDDDDAQDDDDEDDDDAQDDDDEDDDDAQDDDDEDDDDAQDDDDEDDDDAQDDDDEDDDDAQDDDDDAQDDDDEDDDDAQDDDDEDDDDAQDDDDEDDDDAQDDDDþü »ÝnW3ˆˆˆˆÈÅÔ£("""" Š""""¢ ("""" Š""""¢ ("""" Š""""¢ ("""" Š""""¢ ("""" Š""""¢ ("""" Š""""¢ (""""¢ ("""" Š""""¢ (""""¿/‡ë¶æÒ<ö®]È‚U[9“ÍÑÿ°z´l—Dý@+@Ѧ¼7†4k ?Ô‘`Gã×÷îà›·'`ïýýó˜4ü+6Ðéñ!4÷1—/êÔzFŸÆ~sýžïG”c>›Ç¼Å÷{ËWÉìêODB{º&Åà}[^rb;‹šËºÝ9X¼‰K¢[dž8—.l¿ö2mG–ðñÈE¸özž{ê¹`TV){>›ÇãhçûHò7ëþ ³Û ),¶—ÑpÀÉÉ£`3 y…eù¡ úèmn®~Ñ1Ÿ³€—ø„ ‡þ1æEâ«*«ˆÂâÒ g88áT²åªÊ‹Ëùž§žüϧÆ0¬¥{åÇ,`;¹…é£F3}]&Çmž„Æw¢ÿ}·’àgùZº€Mï=À[¶gøìÙú8ÅGÖ0ñÓ±ÌÛtO¾ŸÇc£^¦‘ËÙW«Úv‘? (“½|_-<Ú5 §Ë}¦^C™†s0ñÍZàèçPé·0sSŠpý‚׆–ðæÛ}‰túƒ›¾ä 3Þ|›™N=xø•æøæ®ã»Fò#€×Á¹ôOVßklËÒc+ùbäÏœ¶5¸òmWV‘?$("%å^Iq[›óá(„ðš~ÍŠÔ£4l÷khr÷'gétÖÅÝMSŸË÷’y„y’“žÁÉĦxŸOŠö\¶ž¬Ža„9Vü¾k)ÓäI«Î‘U6«Sh2óçóÍÄÓœv¯Î€^ñ:‚ÿ²Š8šy×Fƒyªg('G_jX€Â³?úÆúqpñ:r:w¥ÚùSÃ~’M‹2ñŠ®Æ‰ÝWVšµî`^zš²}Š%GWðåg[hÞ¸ä^Uy&¯Üzwƒ+Ë6‡W1/Ã…¤W†Ð%Έ¦æÓyl~ì{¦eÜÆSqÖ?6¢ï›Ïì=ÜòÞ´ vÂy ;…G'-`÷À:Ô>öçªï5µ¥-‡åŸb‹‡û…céJ¶½Ž“ÎLù#‚"%Ù*xÙ1ˆÖ}úkñ(Ó#h»a7 ¾fÁÌMÄöm€G…#'MxF5ÀyI:;O5¡‰—é\NÌ$õ;uÛx±.«ŠjfœœÌ`+ÆVšKú˜÷ùÉÒ‹§ûÅâbœíå98{Ÿg4äþž&üjÆái¾P¾ÕÊa+¢Ä~MQ¶L;PÁØ÷æ~gkNΟÍVÏÛx¼‡‰ïþ„ï {¨1oäeëô¯Çšq|Ûü:÷"6ígvŸiF˜‡⿤’ì=RJõ››P¿Žïe ›ñm”„ë÷‹I=Ö‰Nç†ØOnfÑnoZôªÆ¼óA±4‡y/<Àg%w3òíî\t¿ev%¦N¹ÄÁ¼Ikñèó2½jY1 ®²¼üu üAC?â¾ZŽ”KeÒgc™·a/'üˆL¼…Á÷v¢–«íÌE\:–Ï&,fËá3˜½"hyÇ#ÜSVÃΙÝóõù¬ÜqÇàtº5æ×_E[T]7G—~ʘ½-x¸ïa†°]ñ¶‹ˆ\š¾®K uÜ9¶äSF|=ƒ39’W‚<‚kà\¾`šöhÛÎÙÌÍÈãr9ÌäM}ï#¤íÌ=÷Áj'O*]ëë[AO¤½”ÒÒ³ÿlEyÙ¶”¹› pŒÆÇâFDB0ö½éì/8Wbñ6nÍÅ/¾>ÕÃ:0``GBÏ®§ðÄ.V§±f=+ÙöÊÊ<ÿÙl;ƺ©‹9Üœ‰\¸Ô•× Ã…Z]ï¡wb]ÚêGËj:‚ÿªŠsØ}¬”¼”xrPoîè7„gßšHêÑâòwrþip€EiÇ/ó¹[²Ó³9ÍËìÃJX››éžK•gµ£K>a|nêŒåZÊ+«`;_¿ø¦œ¬G¿¿¿Î«Ot'`Ë—¼ôú²màq'ÿ~ãQ¹Ÿ{®i/dï‚©l) #>ø\à)9Èì/`éø8¯¿?”~a»øñ£‰ì,ŠwóýŸ‘âÒ–!/¿Æ«/ $>o#F®ä„ýê›Þ)ª/ÿsÑN€ÝƙØ5}Ö¸–„Y¯ ¾UÔ§xïdÞ±SëÁ¼ôê+<ÒÞ™U_¼Ë´}ÅØO®fÄ??g5™_ù7OÜ\ÔÏ¿ewÙÝ^I[\I[Ú/âãÿ¤õ£}©ëj\Õ¶‹ˆü1=І3‘ÝàÞÖ¤oeÙ¤5̬~‘Ä%&‘Ü8×r3K`+z4Nç« iÞšF…I‘Úq^,NÛInB#<3ìM;€KlGü²/Íl»¿ã­¡]$ÂÚpgÇ0¬†SDÁ¶™¤($º–•’£›Ø’[fu½Ÿe;Â’OF²è(`¦çí1¸U2ާò2/ÜÖcn؇»’«Ý¿¶ƒ[%u0Y]Ï>¦tvÕÑûfË=À¡36òXîyº7Þ;YøÍ×üçüX³ ÝEþ4iåÏ÷‹Ò8Ö¾~Æi¶.Ú‰{³Yö”9…\‰î>ˆè+(Ûž·‰ï&¢é“ÏsÉ܉+-¯Œü­ÓXx<Š»‡¢m53E¸G6[_œÁ’ƒèòk!öÂ,VOü¦î F¯×h`†3€ÍŽgç‡èÛ"3à{[ ~üç>rŠ‹ÁîæÉä.Äû˜H|²ç²`öòlàU°’—ï~—­Ô-tÐG¼}³7Ž®V¬%ŽåoPKöóÃÓO2á àÒˆ‡ŸLÄë¢s»ÂúU^§ã{È1B¸å¦Ö4ð5AT ¼Ã¶cv·“½l"kL-yá™>4r3€(‚í»xøÓÜ2G%máTEÝlÙÌ9–ÃÉç¹XH»\vÕÛ."rý‚"€ÙЄ„&tÀnËçèžm¤­ZAÊÌÑì:1˜n ¦\Çœa%¬mwâ6ç§e <غ•â‡çÒ4vާ¡eiû­Ä´õÅ!¿‚ÅËL,Á0áä‡Ó…‹…áAB°ÙQX+„c›¶Ø’X¯2½“&û?Bô‰,¶.ÁÔ¯fáõP7jZ/ó©ZE™g×éLp¯Š'¶\Iä/Ïì›ÌKŸ·ÀÙË'@,15 Ùùä¦l»•gjŸ_ÒB@b+ü&-dÃñv´uÚÎâí®4½3Ç“×Rr ‡æ~MŠßí ¯í\ÁD”«-ÏÆ‰=(òM$¦Ì5§à†„Yæ³ãp1„8¥œÎ˜ÁÇïþ—Õ'BH~èmîkþëä ³;Qµ}/Ü 'Ο4N¡´íáÅþŒµ,\þ ;¶o"uM&%Õ›Ÿý½[s†ýðC¥=¨î^x»Qî,2W§óËï“p8“Õ“¾àãWFáÿîâ\Êë[E}¬‘i[}(?ø ó›7£q£–$·h†¥;c„ÜJÔ…ž>3^1ñT7/-S¯JÚâìæeêfãðü‘|›ÓŽ_¨³q6ƒW|V¶í""×9(g­`Úòš÷L"ȆÙÿˆ:FÔ#vÖG|™žJvÛ`B.I®QtìÅG“§±*&¹âÏ7ŸXâ<–“ºë4µ]ÓØëX›6þØSQÇfù‰%¤2"âkP÷½û%íRW’².”ÿþƒoGÇpÇ?ž¡®É¸4œ_üZ%mQy[sxËnò²¶ð?•{×ë{Q½×»¼ž\ȾJ·]ÏŸEäŠ&S17­&¥~n.û½€†˜Ì—i£n:¬ÉÜéëñ²×%Xobë¹³"u+Û]ö`©Ý—j¸¶qØn‘ñÔ˜¾€´-Žìɦm”;&ìäïœÎ—q÷=.Ìp¶Ÿ¡ØnÆÑ|=ïº/W'¹‘ä®ù€—'ºóÀÐ{‰=—m'öp°Ðhkùàà@Ó>LY˜ÂZ-85þ;!Ž×rÌÛÉÛ2%ùõx¬çå¿ÖæªÊ3ã„%gÛOØ;7¦p:™Å~´õ·`?ʨcíù ÃúÅánºº:ŸÞø=Ó5â…OŸ¦¡ËÙ@”¹5Ÿ S4NWõè¹:.uï¢o©;¥œJýœW~ˆdèȇˆ=—‹J s)´;àä`TQߪêcãxêT~Ú]“î=»Ð7± }‡d3ë…G™8ï-£ªQº~ ;óZ’àv¶çòäöt²lWØ•Ö͉ZýÿÃ[=K.¼R°mÿccà¿ aPù+_ªtÛEDþ höK MôJ&Eq«æÔ ñÁ…|Žf¦²4%Ÿ°Î‰œ›XQ—! Ý“X÷ñB²1]qÀ§NÜ–ÎgŽÉJ½»«QæÛD®>–¹EôSæ¬Â1ü"\ ÀÀ#º áó¦3uF‡à\xˆ –’ãß’Û«_ß/ ®¸Nr#q‹jFðá·yw„7CzÄá™÷ ‹¾OVíü­–””]ÚB`óæxOdz-ÿ†=V´ç±mÆ÷¤”&rûÍup碟 €v-M§ ì^"+=¦® ¼2œcn¦­×ËŒyw,NýZX´™£fp²ö½$×°Ÿ6—µùÕéœÏÖµ«ËŸË1 ¨åPù“Åçü-,]¼k-gŽožÃ7ÓcwÞɶýyT¯êÑs1‡RW’‚ÁIø6îL½±Ÿ1ò‹06îù»Yòí$÷ä©0'ò7U^ßàJës†Æ¥¿0ïÛ™d›î£k= ÷¬bùAm}hz3 ¾ÁùÿÖx<­â»¯3°pEÇMþö*ÚÒ?”ÿ__=sÒ ³©„À𚻀­ŠmùC‚"&êßñ .«±dÝB¦,˧ÄlÅÓ?œ†·¦U=¿J v¨ÖŒ-SùbEÅϺ|ëRÇsË‹ã¨_éä+Ie®D&ÔÀ˜’Ed“šç¾’L^ñÜ~W>3ç,câ¨Ó”XÜ ŒN¢§^ï?&q™:ÉÃðJäáÞϘ/'ñþKßPäìOt³A tÕ¸((‚%¨ÍüdJAé Ž'«ª[¢Ç\é¶ë¼‘ >ãív»]Í r(ØÌ—Ÿ§×ã­ÎÎ`½øg‘«¤¡o"7ûi6O_EµNñxü,""r Ô£(""""R¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆü 9¨ D~6›¢¢"Š‹‹±Ùlj‘ˆÕjÅÙÙùn»õ…Û""""R!=zEQPEQPEQPEQPEQPEQPQPEQPEQPEQP‘??‡ë¶æÒ<ö®]È‚U[9“ÍÑÿ°z´l—Dý@+@Ѧ¼7†4k ?Ô‘`Gã×÷îà›·'`ïýýó˜4ü+6Ðéñ!4÷1—/êÔzFŸÆ~sýžïG”c>›Ç¼Å÷{ËWÉìêODB{º&Åà}[^rb;‹šËºÝ9X¼‰K¢[dž8—.l¿ö2mG–ðñÈE¸özž{ê¹`\IûÚóØ0úm~ÜwùEÜæ‰îÁX®×>¶ç³yÜ8Žv¾$³Î¦ßIÑ®¯xüùéõêÈF>@m§²m~’eÿ¸2*~¯kÒP>¬N¶Sl›÷-ßÎXÅŽC¹”X}‰mAϾwЦ¦ë•g""¢ øû+&{ù8¾Zx†˜v¹+Üó™#ìX½€É£³)~¸½Ë‹ã?3me†$TQ¡lÒ3NÑ´™w™®P;y»Ò8PÑâØ- GÀn;CÎ/«˜»tãÍ1$¹Š²lGY5á;VYZÐsP<ò3X…-[æ3î£7:ô >üj›ýZˆ½àk¦|Éû¯ÿ‹ýûMF~»€í'ÏíXÃÎñm{ðëÜ‹&E[Ø}F2…{³ò˜;nJ¦]}N®^ÌîÂkX‘½˜‚’³û©k$·?÷¶ðUc‹ˆÈÿSP´’PÇcK>eÄ×3X±1“#y%ØqÀ#¸Îå vð§i¸íœÍÜŒ<.—ÃL^ÑÔ÷>BÚÎ\Îf;ù{R9èZ‡Xß z"í¥”–žýg+Êãȶ¥ÌÝ\€kd4>7"‚±ïMgÁ¹‹°qk.~ñõ ëÀ€ q<»žÂ»XrÇšõp¬ì]I™ç“¬íë¦.æxps:$ü:†Ðp­´N~WÕÿëHõÑX¥±ëô¹¤Xx€õE„4‰ÂÝöS˜<ó AI½¹»ïMÔ*ZË÷£f°«À¶Vżœ’ûÜÏýn"2?…ñ_Íg‘ ju½‡Þ‰ui?¨-«9èlúí1‘=‹S8îO›ojµ®‹ÓÉÕ,ª()ÚmØl—þ+=ò8Õ¤}so²¾–ÇþýS—ofÿ©bìXð‰nH\˜›š[DDªt}®î†3‘ÝàÞÖ¤oeÙ¤5̬~‘Ä%&‘Ü8×rIÑÀØŠÓùjÆB…w§¦QaR¤vœ‹Óv’›ÐOã {ÓàÛ?‡ìK¯¥»¿ã­¡å_s kÃðN Ûf’~ èZVJŽnbKn5šÕõæBì´aÉ'#Yt°FÓóöÜ*é<«¼Ìs/”–`n؇»’«Ý¿¶ƒÛ•ÔéJ£bõD[Ç’¶;† Ü)Ü¿ž¶pºGºaœ;Dt»¶±®Ô$ز>œÉÏ»;ⱆŸ³kÐíñ›hàn5ôƒÌcí¡¶‡9b²ºžçìª3éwɉ™,Zu—ødj9X£Ûc^ÚE»¹÷¢Ç϶´7¹»Ï¥«ˆyj ÃZºcn4xàm^­=ÙKV3éý9Œ\‚кëô郇†(ŠˆÈÿKP0»šÐЄØmùݳ´U+H™9š]'óÀMÁ”ë˜3¬„µíNÜæñü´,[W¸R¼câð\šÆ®Óñ4´ì#m¿•˜¶¾8äW°x™‰%&œÜ}ñõpºÐ›i¸Elcö†CÖ áØ¦-ä¶$Ö«ÌÔäCbÿGˆ>‘ÅÖ¥3˜úÕ,¼êFMëeÒbež]§35½*žØr%uºâ¤HÃh'Æ¥e’W‹CëvRZójºp0ùüë,k“[(QÞ¥¬?xмÂýœ*ÞÏä÷^ešQ¦«ŒÜÀQgÏïw/bõ g$×:;öн6­£ Ò×,b×=1Ä–™¹Rñd.efÍ›½ˆiߟ˜öý±—är`ËjÏšÊô/_bÃá×10J.""|P,ÎZÁ´å%4ï™D ³ þ tŒ¨Gì¬ø2=•ì¶Á„\’\£èØ%Š&OcULrÅùÓ'–8å¤î:Mm×4ö:Ö¦¿öTº.šXRA*#"¾Åó6’•ïÌŽ-yµ©‡ÉNѱ,ð 8Ðg/œ½ü ð*`Ç Hͺ‰šá¥*Ë0°ZŒ«¬Óµì GDáøM*™Ç,lú"{…ãl@ €a`*W³?ÛívJKíÖzôÜ‘ Kùe\¬:s~wìZ´š“œaå«éUîw«Y´ûbË$Ū&³eNá“É%t¸‘N`8¸\¿=ýë·"qô㼸d((ŠˆH®ËE“©˜ƒ›V‘²;ÿ¢ñ††˜Ì—)Ø„GÝ.t9Ê’éë9^Ñ„³7±õÜÉJÝÊöõ{°ÔŽ£Ú5Q [d<5 w¶%-ùÁ4‰rÇ„üÓùï7‹9PüëÒöâ3ÛÍ8š¯çÄËÕéÚ86¤–e?/]Î.s4C­¿ö8ÙŽ²#«àÂ>*ÍÛËŽc&|=pó À¥ ‹#v7<==ñôôÄÝ8HÊü•ì/ЉóûçÄ],Z} KÜ`^}ç]Þ}÷ì¿w^éK„‘ËšE»¸šf7™‹Ø¹bÓ7å^2æ×d̵¹ˆˆTéºô(šýh½’ÉãGQܪ9uC|p!Ÿ£™©,MÉ'¬s" ¨¢7ûÐ=‰u/$^TÙ§NÜ–ÎgŽÉJ½»«a ¯±®†[$ñA?1eÎ*Ãï ÂõìwzD7!|Þt¦Î s㜠±aÁRrü[r{õë{‘­¸N×È)†Qü7}?®  .÷=+lš2™j][îtœ- géÒ{j¹àhnJÿõ,ž8—N ”f³eÙÖØÛÒØEÐç÷ω‹X“ëJ³[ÛîRæîÄ“žõ¿ç½5‹ØUP‡:çöŸ-w/Û·¹\Òsmrò#,ܧ öôjô#Þx‘¢[o¦Eí긓ËÁÍ ùaú)bïî¬F‘ÿŸ ˆÉƒúw<ˆËªE,Y·)Ëò)1[ñô§áíƒiUϯ҂ª5£GËT¾Xq²âßûÖ¥Žç2–ÇQ?à7Ž•3\‰L¨1%‹È&5q9—ÉL^ñÜ~W>3ç,câ¨Ó”XÜ ŒN¢§^ïΘËÔé“"Aõ#pJßK„ ò# -atmïÃæ¹ß²ðx…%pûÝ u2€ÚÜ}–³XòÝzrK]¨Ýš¾]›â«I¿» ÖëÓ†®µ].:0“¿Êáæg­!‡"""R}ùÝ ¬´àû2w²ri6Þ‰·ý†±œ"""¢ (7VP<žÎôÖ`lGÏfþÚÙ"""rUôèYDDDD*¤é«""""¢ ("""" Š""""¢ ("""" Š""""¢ (""""ÿ¿ôÕz"¿›ÍFQQÅÅÅØl65ˆˆÈ Äjµâììü?·ÝúE©=‹ˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((Šˆˆˆˆ‚¢ˆˆˆˆ((ŠˆˆˆÈŸŸÃu[si{×.dÁª­ÈÉÇæèŽX=Z¶K¢~  hSÞCšµƒêH°£ñëû wðÍÛ°÷~ŽþáYLþ èôøšû˜Ëuj=£‡Oc¿9Š~Ï÷#Ê1ŸÍcÞâû½å«dvõ'"¡=]“bð¾‚-/9±Å?ÍeÝî ,^„Ä%Ñ­cCœŒK¶å°âÓ¬¹—'{„âXæWöÓiŒzg:.ýŸ£o-§ß¿­íùl7Ž£ï#É߬£ú/ dÿ÷<õäwx>5†a-Ý1~ãr"""¡ XLöòq|µð 1í:sW¸7æ3Gرz“GgSüp?{— 4ÇfÚÊ I ¨¢BÙ¤gœ¢i3ï2]¡vòv¥q ¢Å;2°[Ž€Ýv†œ_V1w鯛bHreÙŽ²jÂw¬²´ ç :xäg°xÊTÆ><Ú5 §?É»0sSŠp?Yzñt¿X\ €bÎÁç ¹¿§ ¿š1Dxš/”oõ°bØŠ(±ÿ–¶)æè†yL_”ΞㅘÜ©—t Ýàh€½àkgÏ`ÅÖýœ(rÆ?ª1º%SÛÓ Œ}o>áw¶æäüÙlõ¼çîäø¶=øuîElÚÏì>ÓŒ0Øzùë6ø3‚†~Ä}µ)9ºŽ‰Ÿ}ͼ 8íXúòЉø•Y.h#Ãøšè'o%oú,Ùtbß8º?øw6ôÂg­àë¿añÖc8…5å–;£XúÞ ºŽ|d/(Ø;Ÿ1ŸþÀòŒ +ÕbÛÑ÷‘´ °hŸˆˆHéëz°’PÇcK>eÄ×3X±1“#y%ØqÀ#¸Îå vð§i¸íœÍÜŒ<ì—í]‰¦¾÷Òvær¶SÑNþžTºÖ!Ö·‚±yöRJKÏþ³åqdÛRæn.À52‹ ÁØ÷¦³¿à\‰ÅGظ5¿øúTëÀ€ q<»žÂ»XrÇšõpü :{9&§cÄu¥ÿ½é™àÄÖßóó‘°å°jÜ(æå„Üç~îp‘ù)Œÿj>û‹ÎÕÑvŒuSs<¸9Àp¡V×{èX—öƒúѲšƒŽê¿{þfF¿ø:sJ[1ä_oðï!‰äÍÎ;³qÉýVÉAf±KÇÇyýý¡ô ÛÅMdg!ØÏl嫾Çr§v<2twqcñãØUtþe7ß¿ñ).mòòk¼úÂ@âóæ0bäJNصDDäR×'UÎDv€{CRX“¾•e“Ö0°úE—˜DrãP\Ë%EK`+z4Nç« iÞšF…I‘Úq^,NÛInB#<3ìM;€KlGü²/½ïþŽ·†–Í)¬ wv Ãj8E$l›IúB¢kY)9º‰-¹ÕhV×› ±Óv„%ŸŒdÑQÀMÏÛcpû ƒÅl§³9iT£eã8"=LPÃ÷€}˜œMg­áçìt{ü&¸@ ýàÀóX{¨-Á@i æ†}¸+¹Ú…g²ºž<ãìª#ú¯9½q2‹óâyô±^4÷2€0=yˆÏ÷$ÿâg³ãÙù!ú¶ øÞÖ‚ÿ¹œb;ÕÒ'²° )O?~;MÜ ˆ 牜 <5ñÜ{Kîp7O&w!ÞÇ Dâ“=—³g/ÝcˆˆÈÌn„&t 4¡v[>G÷l#mÕ RfŽf׉Á‘ÅÖ¥3˜úÕ,¼êFMëµ¥EÇ D⽿fê{ï³¾N,ÑÑõhP·ûË~Nïgò{¯2íüêí6l¥`ä–`LÎÔ÷B×ôE G3PÐ÷ó;ÝBp÷¿1 ÝE§€;Qµ}/ÜÈ'LÅÙº[`"\]½(\¿?tî.)”¶=¼ØŸ±–…ËaÇöM¤®É¤¤zsíùã‚bqÖ ¦-/¡yÏ$‚,`˜]ðH cD=bg}Ä—é©d· &ä¢÷®QtìÅG“§±*&¹âüéKœÇrRw¦¶k{kÓÆß{.]öüdëå*j¸_ƒâyÉÊwfÇ–<‚ÚÔÆÃd§èØxè³—?Î^þx°ãƒ¤fÝDÍð‹ž?&ì¶KŸáÙKK)åìï çº<ô, wnakÆ/l;гBIêß—„R;†µ½w$¨Ü1+† 0°Z4ÿõFb/µƒÉteã@ Ëeö¿½ÂcÏÀ¸0ÉË~z3ß {™¹‘4mÖ˜íÒ*êK†-Ô>‘Š]—1Š&S17­"ewþEã Ï]´LæËl£n:„eÉôõ¯hBŒÙ›Øzîd¥neûú=XjÇQíšÇá¸EÆS£pi[ÒØ’L“(wLØÉß9ÿ~³˜ef8Û‹ÏPl7ãh®àBmrÁ×Û™}¿SnVt)y{¶q=Läî\Ƽ•‡pN¤}»òôtõÞÇšu‡1ûàRÅ»žžžxzzân$eþJöè`½QïÕ|"0emdwÞù³ÅFö¼×yæµ¹dÙ®t=ü¢0¥“yáyu G·ýÂéÒ³AòôÆï™~¨Ï¿3”'ö ¹Q$®§ó±i'ˆˆÈÍ~ ´‰¶±aü(&.X˦Œ]ìÊØÄ깟’OXËD.;ÉÒìCB÷$|³wpÔn¯øÂZ§n{ç3'ÃLt\5~Ë|MÃ-’ø |Rç¬âth“síLxD7!¼(•©3V‘±ï ûv®cöKÉñoL£ê•h¥fû$‚N,åëq3IÙ˜Á/;·°nÑ÷Œù1džhìç€CéAÖ-˜ÊÌ•[È<°ékØxÔ„wu7œƒšÒÄÿ(‹'Î`íÎýìËXǼï'³æ¸~.ú#:7&ÏÆ}h뼆OGLbÕ¶]d¬þ‘O¿NÅ^+_ó•ŸÊÞM{Óʼ’‘#&³jÛN6-ËÈ9`X<|pÊÏ`éâµlËØÌÊÉ#xgÚaì'w²mžv…ˆˆTº®Küô þâ²jKÖ-dʲ|JÌV<ýÃixû`ZÕó«´`‡jÍèÑ2•/Vœ¬ø÷¾u©ã¹ŒåÅqÔÿ-S W"j`LÉ"²IÍs_“&¯xn¿+Ÿ™s–1qÔiJ,îF'Ñ¿S /“L-ÕZ0`°+K¬dÅOkÈ-2áâDTÇ´KŒÀÕju£wòOÌ^þ_Í+ÅìâO­æ½éÚØ³ÚÜ}–³XòÝzrK]¨Ýš¾]›ž Å:`oȨèË=ÞÂòÉx>~yùÖêÔ¿é^¸5Kñ‘«8”ësÿЇ=rï¿ôíܱKUqÇᯒz/BƒK›ÈµU 'ÁM„V[ánÍQK ‚ æ:ˆ8¸ ‚8J$ƒˆmA9Xxo‡ëà$´‚r}žÿàüÎp>œ—ß»ž‡•áŒWŸçï»Ã”ÛZRz2™êØ\Þ¯¾Í^ºÒót4Óoú³3·œµ£Œ¼ð2¸úmi4c@(~åÓqkú*¹¼ÕÈÙçÙT—åÕüTzÛ×cž Íâük6g_gaë ß~æÇÉn>,ï§}pèr(\“?ŠÐ4þåçþÇ,®lçË÷?iéìNåÙDf^ åq‡›òEnˆÑ3B¡€P@( ¸]ÜŒ¢(R«ÕR¯×S…h"¥R)årùÞ=·=Šü—Ñ3B¡€P@( ŠE„"B¡€P@(€P@( ŠE„"B€»ïÀs ܈âIEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/16_fields_snmp/168_assign_snmp_check.png000066400000000000000000001473331516513262500330610ustar00rootroot00000000000000‰PNG  IHDR·JæfbKGDÿÿÿ ½§“ pHYs  šœtIMEá 'c*å~ IDATxÚìÝwte߯ñïîfÓ;!R( U½«t¢Ø(V{oØõËóªXPbÅ‚R¤÷^¥-Jzï»óþ‘¡Cˆ×çÎ!;³÷Ìüff÷Ú{ï™5ñé‘+€Y%…[…[…[…[ùw0†¡»%\hÑÆ/UDDDD.Cê¹…[…[…[…[Q¸Q¸Q¸Q¸Q¸…[…[‘KÇᢞmËa÷‚ïønö:ö&åRæìKHãNÜxûÍ\S× Ó%Xá²øé<ñøx=1‰7;{\’eü]n¹©+?øXIa> £òðÆ4Úª™Ž>uØq[R¬âê½¥WèþÒí]·‰ð¹VzÜâÄÚááÄÍ\Í­y!ÿŠZ\nžž ¨ãC ,¥ÅìLÎ`F|>™vUGDDÎÅB¨·…ä¬JNžâäB]ŠØW|qïÀnK84ãM^ù>Ÿv·ÞÍóWàÇ–¹ßòñèC”|0š^–j/‰Ù½ÝûÀ¥¶ãlIÝOÏåÙäf‹•Áµ׿*fÚ7ÒfCEÕ¼8[q·Æ‘›iÿׇ¹ó®…Ù…g‡´åöëi³½ˆ²Íë‘3ƒ;5å›f¸%¥eج¸PŸ¯²SxxÞ>O³éCˆˆœ1ضnÙœå]˜¹p3ÃbŠŽ\‹‹/ïlÆÃ$ÐwÆ~Výݤêá¶ø³gÄ?ê‹ Å @š6«Má#£™±8ž®·…U<^áÖ;’›FD^±»Ý^\ÀÆ#9dWü½&1‡¬š™Ñ°&›óØ^ͽ·¶‚ Æ®ÊÐù¦ZœãÄsfh¯ÖL©gfå_Ñ<¼9•­E˜,D„ÔæÝ®õåŒÏÏ[£€+""§Ñ¨y3–wôÂÒ³vc3#öasñaÜÀæ<æ̼ítùõ«Kªø–Uå54J)*L'½9×gð3£y S ŽöÛ˜÷é‹<84Ѝ›‡óø˜ïؘVÑßU°‰7‡>ɯÛWðÅówsϸU,xe·½½ŽÜcM—°ÿ›‘D=ü‡³7ñæí÷óõ¾ò-.KÛÄwo?Æ]C¢¸yèü9m=G›>ërÿ9q—Ü;˜-8šÇÌ¿·-/Ôàó¨Îéã‹`vôàÁî­ˆ½¯+ƃ]ˆîW—ÜÍ`rdèÀk)ì_¿J»½MçŽwÔ¥™K æßß‘ýË…3¶cvá©[¯%¡‹.&'î‹êŠ1²œÊ[õ iJΨ֌tÿ‡ö©;V®…™† "XrçÕØGu¥xDk¦\去ٕ—nmÏ;>f"¯î@ñ€xŽn¾¼Þ¯-É#»b¿¯ëzÔ¦­“éx»'ì3?zuíDÉà BLÇ?ÍvëÑ™âAA—eijG4àËzf.ßDÏÕ)åÁÀ°±÷ða¢¦ogb¡'o÷ ¡©E/à""rªøÄtÖ–{Óå¶^-™Ò,ˆnŒäqŸc“í‡2ÙSzý1U~¦S]ztô!yúÓ<òú~_¹“øœR ¬ø6hA³0÷òÆË™ýÖKLMhÈ-ÏŒeìË#h‘;‹±¯|KÌÑ7Ȳ$|6”¸³oZöhˆ=z)1ÓKâY±6ƒÚݯ¦V¥®`£`'_Ã<{îm,¯ßߎüÙ0nn¶óYîåÈdÂÁ\þÏju¤IÝ:Œ w 5>}Gs¹Å…‘Ýè{$ŽçwäQhvåÑZò®w6¯ý¹™ö3÷1Ï%„?Ö¥ƒC) wec  CEÅÁÛë;²{÷öTî >[;–bÆìM°°ºÑϰxÐÏǘ‰õÄ-3•¥ÆeZÚãµ­üïtQÜ©F(¿÷ À¾7†>¿måî]6nº¦ O{1æÇõ¼igÛªu¸ÍL'ÛêŸÁÍyÎ5“fo¦Ë‚xÖŠ`e¿ZÔ3ŸnŸå°~O:™5ééz4{ro «w¤_–µ‹ŠôÅ9=–QÑŸfº­0ƒçW¤SàS‹Q~J·""rª¼´8nüm?‹W'†\݇}Ûm[¶Ò}m&é%ª>,ÁäNäÈ÷x«á,æ.[Ï/Íc*àZ+’«ûÝÌ^ð´@Iì8…ùn¥AÀVеë3<KVÀÈìACÛW,Ý[Hë®”Ưdmf(×w ÄäcÈÛþKó[òð#Qtô6a<œÄ—q‰dÜvöå6qº,w¼¹öU¤=pâc9I‡¸:ëØPÌfŠwïdÀ†|ŠÿPžª‘ÃCÓ0¥ÀrØ” í†Ö皱ܗÌK8Øu¸ g»æóß}…””÷ÃàâWë¬íŒ:”Iz¤íœã‰wó%²4“iy^\SË kŠ.ÁŽÄÊàÐezaQÐU­È¹êtSl>éGWwBŒÞݙ‚<Ž˜îIY‘Ý0°†Ý Ì¯ îrÍá‰ßö3)·¼n[‹\¸zP0C½“x=ïÔ}†5™YÅ‘Œ¶2yO Aô5g12®ô²¬]7o8ðW‡Ï°oÍ&È>’ÊVjС¦§T;%vCÃDD䔀;àWƒƒÂéyÂØUƒ­[¶ÒcmÖEÛ‹ ·oõ¸“F=îÄ(Ë%!z=KÿüY_f[ÊÞNa\ é%{ùø[_)LØl`Ê,Á¨XÜ¿ÊÿØø\“wsz4(cÒòý¶hDòª5d×H‡šŽw•‘“@YÀõÔó8Ú÷f%¸ÿs¼A撟Ϻ\¸<Ãmå Ê0 rò Ø›o;ñ¢%{ëŠ*JaÂÛד`O&»†¯ŽúÀj»«#)ƒ¯“Í|ØÀÃÙ„‡×$ -Ž_rŽ€sµSx8••¶&ÜXÃÕÞÞødÄ1ñˆ3ƒÂ<ðÛe§¿W —VûEoÕ%sÿþ•BÏ£ÙÅoúÕ>eÞü”&eGòõ°Ü»/•™‡R™²/•'}ßa" †+.y©¬ªÔcŸ‘ÁV[í=Ìwò>Jó˜|ÈÆÜF>øÇ¤Óª‰/ »Y\xyÆAg3—•‡úS?èZ¹¶SKGº–ÿ}MŽ„í¡ÍÜ$öÙôB.""'**(`wôôªüh1E•†¤þ á¶$vŸýVFÿQQÔw“ƒÁÍ{pgó.´›ø(/.[Ä¡!áÔ´˜Ü:óô˜¡Ôw<1X=Ü0Ù“nŽ•¾6yÓ¬{8ÅSW›ëÁ¦59ÔjC“¾í4ì˜Í§[aœc¹—«“/(;-ÃFVÙñ½o6™°§pó/ûÙpÒââ¢2 îÊÅ­“?-œK¹¾¾•›Òˆ?)©œ³²<~J5ñ^˜í½9|(‡¿RsÈ¿ªíìDÚ³ù0ãòM3…yl8rò­ÀÜÈ9í~Èä‘W3)´&ƒêø2¸SKþÓ%›7fmçµÔó[ž °šN¿ÏÀÆæÝéäõ¤«·[C`Þü,.×ËÙ¶æC×Znxo.à”Í7JY²f+·º¶æ‡GÊRÒs¾‚­ˆˆœÊââË›ó°×ÉS¬ÜÜ£ü"³ÊwQ¨Š*¹5[JØ·j6³väžòÕ£Ù X¬XL&Üj‡á‘K¼Ý???üüüð1ïgÖ·³ˆ)8Së&|š÷ ¼` KÖ.amnú´ò=ieð­€9y;ócáÈ‚1<õŸäUe¹ÿDYYy¤;¹ÓØTJ\^1qyÅ$<Ñ1˜Žåó$Ç'±ÞÑ—õ‰rÉaü¡NÎçn§”5û ð«ÄÝ~e,O*&+#­f/îkâƒsj K®„šš åÝî$Jà¥%Ûi3yäz2ª©®'ÕÿHzEî>tr=þÍÍLJ–bÖçžyŒF^j2–yòTëPzØÓù<¹ì²ýÿû½…8…ÖåÉËéoÁg/æÇ%[¹=–~³³±‘ÓÛG+]<¶3&‘••.2Ò³S8ãøw„[‡Z=ˆj]ÆŠ±/2î»ù¬Ú´m›V1wÊ»Œ•Cã׿Nõûq]p?Ž›Àü¿bسiSßÿ˜yɾÔö8óâM>ÍéQ?‡Å“æÕ¸‘^¦SˆW›!tsÙÀçÿºÝˆYÿ+ŸOÙ‚Þˆ ˆª-÷Ÿ(?%ñ™®¼~]„zÒ)¬ïöĩž%쮸xÎ^É×)VîîL@b" NsÑ×¹Û1HNLãgMz9å3?ÛŽQ’ˬ'®¯ãÄž}9=NærùÀPlö`dûF|Y“®þ^ôkX‹Û¼á`ZùM§í† o7ê»ZÈKŠã›O>ìSŸaµ=éÌ„ÞÁø'Ç3ùl¿lPšË7‡ Ú4ð¤ð`ë.ãÛ¶ìåËæÖRƒkžzÏ9ß3}þ÷|òk.¥7üBšÐí±1 ìR»| ­5ŒÁo¼ã„‰üüî"2l„¶Ä‹÷ö£–œ±ßÙäMóá˜vÇÙ§§é.2¹4æ®7ŸÀúÙ÷Œù œiÞû)ž¿)«•³/÷JbËã­QpM8/_D-s)Û¢ÿŠxbŽf+£„»r±¹3G&iUl§$7ƒ¹yuiT˜ÎÖ’òvWÄA ;¿&œÚüO•qx/ƒ74à¿­š°¤£‰Ò¢|ænÝÉC; )µ[X¼/‹ÇÛ4c½û6BþÌàÉ_·“um=Þ»![1ì¥ËÊDöŸõâ:›b2ÈièÍôèÜòqÖ—){qÎØ…õ†Æ¼~c'ÏÌbyz eŽ.t ñ Vi*7}Í [9ƒ-¶q§g+¦EX+îŠPqñXz<3ñûMõéN&Oþ¾—ùÅU_ŽÉ0 ½]hÑÆ/U¤:Ž$êG¶fWd&¿ÛϦÀ-˜Mgº7fd¸7-=­8”³#1¯·%ðG¦ ý¯ˆˆœ•Ù™^uÙ|àÔo{Ý}üèA&d^Ü)Ü*ÜÊßÀâäFçZ¾<Ñ­>·o rC>Å*‹ˆˆÈEsP Dþ÷¬ž|Þ»6æ¸ܵ­@ÁVDD¤š¨ç¶*ESÏ­ˆˆˆÈeɬˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆèÊDDDDä ¢ž[Q¸Q¸Q¸Q¸…[…[…[…[…[Q¸Q¸Q¸Q¸…[…[…[…[…[Q¸Q¸Q¸Q¸…[…[…[…[…[Q¸Q¸Q¸9OÕÒJiÛçÏ`ö²ì<”F¡ÍŠW`¡ ;Ðÿ–ëià„éØÌù¬{e8ïE4æ©oÞ¤£ûe\!#—Õ/ßÅ»jÐÿÝQÏñ„YжÈ}¯¯¢pêð _=Ý—K¶>™,yá>>Ý8´â¥I/ÒÒ¥æ­îý\ÝË®ª’ýLzø9fgþƒxÿ¿·fÕ‰/""¢p{¶Œ L|ã]æÅ•SÙÉØž|€íËfÓrÄËwí ³–enç·¯~fÙæ]ÄyÚê:†ß3H_‡K°Ÿ©Â²/ ^x œÈ `÷4žý;‰µnà1Ãhâ¦D.""òï ·…‡Øt¸âÿŽÍèÓÊûÔ1Î>öú`r¢†ó™C`Ê’q<=~ EÇ+%7%–M3?eÓÚ}¼òÞ½4w/¥ñ³yëÙoˆ.©ÔBF<;}Íèõ»yæÃÇhï]¾6¶ôՌ喩´¸übw¦»s5«£_`ÌÈÖxU{Àµ“µásž{g éÇ#)¶’r`+k¶àÑý ¶–okÜÌ·xnê^l•jR˜™ÀÎE“Ù¹5‘—ß»ŸHÓ„/“×þ¸Ç¥wt4‚³5ýÜ8!Þ•à§×^ç`ÆÑ²8¼îÞfòöó'šÎ¬go'**ê„wVÜ)¡2£`SÇW5·–ÜúÌ[¼ûŸÑـ⓿(`äldòÁÖ­)×Ýñ =r7"=ÊK[È/[sN¿Ž&:?÷ ãîªWñ€íŸÏg£{áB½³8˜L‡·qûÀNÔ>ºçcÿàýÅ—x?Ÿ{ÙR¯ :NÞ/%‡™5îÿX“ ˜Â<úQºú;è•@DDä Qåwu£$Ÿc‘Èѧ‹èø2 Ž4@5£C§¶„»™iÙª®N¿°;ßÀÙÕŽ°¥odÞžòÔbj8’ÑõÀÏ t¨OÙžG™ù›—[܂ƛ˜µ¥"™ùõçÕWGÐÀ 3ê<üÖ2rÉcÍìhî‰l‹[5¶`÷Ÿ¬Í°Ðìþ‡ÜÞP/Ä…¸í¯°(Ç fîjŽôˆAÞMšÒ´Ì‘à¾rw_Ì@[¿½,Úº‚| rÒò±ã…¥ÊkäI·ßfT¤&ÊhïzˆÇ¾Kr‰O-ÂhTùvmÕ½ŸÏ½ì ©WÀM+|3rÙ6y,Scl€'‘[¸ >[…[LŽn½NžÒBJ/ây“‹?µÜ`_>pè{ž>ƒZMÛж];Ú z€¾þ.Ǻ˜‹ŽìâèƒMñ9:ÁDß—?¢e® L.Ôt„’ý;Ê¿zjõèI½c_—›pk܇ŽÞ˘Ÿ¥q{H)mKÝsÞÿÔBØÕ×ésbÄ,KYËœµ)•)%m÷¡ŠPhcÇOrïÄŠeØ(È©˜-i; E©؃‡_îöBRìbåœE8°è ›È¯®=m£m¸[EsÀ'Ì Ø{©íÒîçs.ûÂêå{Ç@Å`ár© ˜²¸âÿnÍéé{DDDäŠ ··jX!¶HÛË‘<å&ývò’˜o/‹‚ïé¤Kc†=9˜¬Oa[@!‰;WðûÎü> <]ÏýÞIG+¶¢œcãr]¼]*«0áäL˜ïñf ‹rÍëîï~bqpÇßÈв)²ŸÏV{Óì†;vÊ8¤³dmJ¥¡ v ³ÿeä}ºælùäàZBü²‰|ôÕ"b‹*'ËjÜÓf+ÖJ½˜&³3`û_ìçs.ûÂêu!ÇÀå¯dÒì\5¤úM…[p ¥U(lÚncñ®<š·r?1•%òçØçø! œ¿CŸÓF(¼#oã•Ï’½žU«V±jÍfç•OÍÝ=›>äÓ·ûâáè†#P ägœõ«z“³Î@>—š‡ ïã\–GjEû8yàT­”™qt9€ýðîÇ «wæUzè7ÞýdQy/sÍ–ô¿¡í›7"8ï{½ˆœ¿ó©Öý\=õ*Œ;ÿcàd>íûº}[ qÆdVöM7?õߊˆˆ\)ªéÌ5hÛ·iE¨ÈgÕ§Ÿ±(¾¸ÒEO¥$/ŸÂïGǶ$Âã´£:Éß=ƒ ãÇ3þ‹ÙîÝ‘Á#_äƒIßòùëÃhYqK)ãÐ6KÀÑ¿!þÏŒ_½…´£Ýö4–þç~†ÊðG>'º¯¢VÅäÄ… 9X||™yÑsY•U‘ðCR³Z¯)rÀ/"°¢¸éì>ͱŽa£”̃»ˆŽŽ&:&‘ÃFÆöõÃ'\è4êIFôë@ã`wrwÇT)ØVë(TÛ~®®z]Ø1pïž<ñð0î½¥ââ»ÒíLýqçi/<‘¦‹ˆtf|;ÝEÔOóãa {Ÿ?þs#›îï@Ρ­¬©H8ÕƒÚÖÓ%/{«/#X²'—¼;P¯†™ÜørŽÞÞÊÃw XüÛÒ½Î&Çû'òæÿpSkOR7ýÉo›3°.‘­ q³c+®oa壿J!m¯½^Ê­}šà–¾…Y?.§¼ãÖNý¯Â½Z¯*2áÑ´‘Ž;ÙRb3ù~r¹…Ö5ŠIŽ^Ì·ß­! plù8ã_ Äb=ÚsXÈ–é?2'3§”uüöCÜy/ÏìpôsJ1©‡S)º*¤šz£«k?WW½jázÇ•¬ÍÑ7»¥û¯¯³8r–Ldö ïqK¨'ˆˆˆüËÃ-àX‡A/>MÚkãX” EìÖUÄž0“õ<Ë£×øñ«c熷qOÇÍüwM.Fü2¾ýtÙÉsÐrHê8Òû¡;X?ú[vCòªølU¥Y½¯å‘{[ãaL>t|àa6¿ò!ËS 8f“cæUšÙBh¿ÇÑÌ­Ú¯˜7y·ã¾ûÚó§ëÈ.ÜÁÏîàçÊ3ÔìÊÃ#;âm2c‹ìA#ËWì¶Aaô,&FWT.0kòJ¢ì"lp†šp Áƒ}ä'?É‹Ný‡¿{?WO½Ë§[–k¢†4`É„ âùí›UôÝ•ú)h‘y¸,~xàƒOiÿçoÌY¶‘]qYV<j\¿½£Ò9ÔõìáÑâG—GÇQ£Ùï̘¿‘}I©äX\¼ ¨Ó‚î7¢o뀊•5áT÷&^û4œ™S~fEô§âäJƒ¶ý¸ýÖn„{˜+5Ý™G>¬KÛŸ¿cöÆbã2(v«IXÝFt¼ñ´ô»D9àßí)þ/dS¿_À¶}‡HÉ7ãæÆU×\Ï ®¦~ÅzZ{ñôK|õÍL6ÎÅ)°!-»ÝÂðk³ùhÔÿm‡´ùÓÙ:èYÚºŸ~iN ncTÿd&ÌÛEFiõoMµìçjª×…§Ùü¯FïŸG3/J·Mã§íx°™«^DDDþáL†ahÄ¡ˆˆˆˆ\ôE¬ˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆÈ¿D•o–™™©ê‰ˆˆˆÈ%áããS¥çéV`""""rÅаQ¸Q¸Q¸Q¸…[…[…[…[…[Q¸Q¸Q¸9'‡ª>ñ™–3.Ã~öäìÌš!á´sP¡EDDDä2·3ì€'“‡µà—§…)tŸ²›µÙy$ÙÏÝ–­(‡/×ä¿û²ØSlàææF·a¼ÓÆŸ&V 8•k¾ÙOÇÁíxÇïJèl6HŠç¹ ‰ÌÏ´ãíãÃc×Fð ¯å´sOúy)w§œ¸Ûêø{1¸E8o†»àR«tÅÕXDDDn/Xç,gøE´`+HcäÏ;øÚîË“mñž…Œ´4>ÚM‡L;;® $ôŠ*¹AJìZÏI& 'ZÔò£§§å¬Ï²†3¿³'n@AAëbãyuþÖæ´b~+w\u,‹ˆˆˆp‰ 27¹„þ¡Žœ>º•±põ¾6‚˜uK®w5•?Zƒþ&ÿ±ŸW“k2©ÆTq{Ÿ­:lÝùà¶V<îcÆtާY]ià‰'žt«[“¾ž[h¹~/?4hÁÝî&Í"""ò¯WÍß?{ñýð«É½ïjr‡7¡‹©˜/þü‹Ç—`;ÍÜFa&ïï/£Kû:\çZ9œ™ð©ÊGmƒ¸Ê°òÜ’ü ^³À/–bž°–ö‹ØPlTLL§÷„õ¼z(™GÿXïø¥¸NÙÊ‹•ÖÁ^’Ëg‹7SgÂRLŸ­¤ÉœƒÌ̳ÿo*^VÄÚÜãŸ-ê¹ ¶v’Òò. ! Í›„Ñ“¾N(Å~Ží*LÙKØäÝü²ÿ×}¿ ‡ÏVþû>~Ê>ývŸ¹Æ6V-]ã/IÄGç¶±dÑ*œ~MÒ%"""WR¸5ábµànµàn5ãàèÅ=|X<ÿô·0;“­6® °Íΰ” IDATžÚ³kváÖ¶õxªöI½¾¥Ù<ýË6Þ)ðaÌõ­XÙ+˜º‰{é2'‘Gsš½€O—%áܤ1kokÁ¿\Æ,ŽeCYù´ÿ›¹…g³¼x­o+ÖÝNŸÂ8Ì8ÈÚÒÿEÅ­D$›ÍóË3+)7笧Μ ‡&'Wºx8RDÑyl—-ÿÃVäÒ¦M–^_Ÿ¾%‰ ùu/ ‹Ojø¬5¶Ð¢a |R“YXpôE_ÅÚètU Q"""r%…ÛSîh8Kzû°hþ_<wbz,+)&‚Îÿ+õì¤8&xòaŸúÜìI§:Á|Ý«6~IñLͪH·vhÖ·Ã=hàãÍ}­üñ/Ê'Þ…i‰¼Ÿîɧ×ÕcD°'í‚w]:å%óyªíÒ–ÃVÈ´5IÔ ÷¨b°{ïnøm¯ÄÓ:2øËk¡†ÛÉ?í²c¦ç5Mx#‡.¡A|Ô7‚.ÅG—PŠq5vó ¤¿S.ßÄ—÷gIâO»7£B¬:£DDDäouéÆÜš¬Ô1e1ð«eÇÚµ8–ÿ8ö·ÅÁŠH;Ciqq ™†…šÇ²¯Á‘ô ÝkÒ¹Ò07__"-I¬Ëµƒ;`¶Ò.Ð ë± hÆÑTþü¬ŒâËÊ/„»—ãí–ÚÁ\`,—,ØNY¸…áûKpô¯Í«-ùf[:û퀃+·´kÈøæxßÃFz¸:™È=Çvž€Ù•Ž}¢±¸zÑÏËà«ÔbJj_@}ÝfáºÝ™¤4¨Áæè Êj7¢»‹ÆýŠˆˆÈ•n­^Lq ŸØŒò^Á’túþxÂ,ΞÞDÊÜ”Ržðr<±Ù^À‡¿®çUféuîÅY€Ò£Ý&3î–Ó-»a`vògúàú´=iëœ/Q9lEL]TlJRxÛ±!»îkŠO™›“¥J;Â(.`eމzÎXígß.S€ ‡ÊbÂØíœÐs{î[hըYšeá‡8èÓÛ_O"""ò7»¤ÃLf3n•Çàž–Ü|y8®;Ì’¢ãU^j2MtŠpÇ£R ¨áŠs^&« ŽÏŸŸ™É_6'ÚyœksLx{»S£8]†•w'BÜ2åòášxÖ–\‚"Ø‹˜¶h3ÃöoÜ\#„Ù½©c1ãUÅ` 6þÚyˆ…xrOmG|Ïg»ìü™f;dmÙÌÉ6îï„ÓÖØ½f }rxÓa™kð@ ê·‘¿ÛßûÛa&'n½6œ¦ÇÐó‡žhÀµ>d¦óë‰õ¯ÇÌp',eÇŸâÂ×-<1o?®ý‰(Ëáãåñ¤F0ÜÇ eg_¤›mFù$ñêܽÔèDs#Ÿ7íç3£8Ws<³1máf†V ¶&ßæßXҢ|Ö&Ypà °uxcO:¶âVw®.çØ®<€2~X¼‹«®¡«c!Ó×íe™s ËC­˜ìPc«#ÂLtß“CÍÆõh﨓IDDDþÁá6Ü–\ü 8zÕâ×!Î|´!žŸ·ï壜2Ü\ÝèØ¸›ÚÐÄ ÕdõâƒAÍð^v€gfÆ“bq¢m½Vv©Eýó釶¸3z` \—ïã͹I$Ú­4«Ƭ«ƒiPÍýØ‹–oaè> Ïöå÷E‡‰ñ aÁÀzô¨Bˆ¶%ï§ÏoÇ6‚°šÞ<Ò»)oý…²slW!`rðæã.L_½Ñ¹P'(ˆïÖ§‹(¾Ð[hÝÀÏ=YÜÜÄwK"""r0†aT陆A±Ý8>V³8>ß'ðäÐÜxº^¼’4ºMgÉ=-þ5ÅývÖrî<\Þ%jö aÞÀzôtþ{¾¼/LÙKøŒ¾Iÿjée5Ø¿u·ú°æöú´vÐÉ$"""¿ªG“ §ÊmY 7g1ð«¥g~Žkпª¸·õlÆö9»˜B SûÕ­RíåÈVœÏªÄ >Ü”G½f¹JÁVDDD.Uï¹=ÃN~™qÆ+ï,8몣¿EuöÜ¥ Õ¯ ØC˜Ô#„ŽNÚ©"""r%†[‘¿‘Y%…[…[…[…[Q¸Q¸Q¸Q¸Q¸…[…[…[…[Q¸Q¸Q¸Q¸Q¸…[…[…[…[Q¸Q¸Q¸Q¸Q¸…[…[…[…[Q¸Q¸Q¸Q¸Q¸…[…[…[‘Ë;ÜYKy!*Ѝ¨(¢¢îཿ M+=0™ŽM{i±¥çn°`¯FEõ2kò´SUQ¸ýÛspçÊ#¬œѤi¿\˜²~y4Ѝ¨{ø"¦Xõ‘-‡ª>qßâŸX_„qº‰O"ºö¥Cm'LçÑVÊŽƒäuð5¿5áÂWƵ5/M›†3V'íTÕDDDDn/Ђi?±(çÌÓC]ÚÐvPð9àCÀLöÄo!¾¨¾©ì:X¾¨™±›ÔcóÙHßô _;Ÿ¿gQbrÆ/¢¾án³Š×ïþ/{Ì‘¼ðÍ˴țͳ£&qȵðbÑô¥ìNÿæý¸÷‘[iåc9eMJc§ñèÓ3HõíÁCý‹˜5c-‡ËjÒøš!<8¬ AŽ&l)GÛíÄ£j±üû¥0ô^hãŠQp%ßNæ÷u{HÈ2ð §Mÿá ë»ùüÚƒâ¤Õ|?a:+¢ãɱúQ·Eo†Þs#ͼ-§_þíÏÐàÛçø> ›/ÞAÂÓ“y½ÉæjÒÚõìmƒì3™4e6dPlq'¨ÉÕ ~;]븜ׇ‘¿[•‡%Œ}'MO?Í»Ó#a > áM2ÛæS”¸•xÃDh‹ZoÖ (5×Mh{ëÛü÷Ý7xë?ÑÖÈ=È¡\ÛYÚ÷gà˜ Œÿä+¾~¦-N@á¾]¤–m<¸æ…ñ|òþùlì ‚€ì¥?²>Ó^ižb‚n~™'~Ãs­\(Üõ 3×òâ'ðæ›ïóÉ+½ð’æLgû ÉøLí—¼ôW6O¯çxõéQ<6ú5î7AúB¦ÿ•[iH¥å·ö!´u;Â=\ iÓ™H¿“‹_vζ‹ã7²§ðëÆðGžfô;ãxá†v´lè@jv™ÎùGp¨úSMÆŒžFt x¶ˆ·íJ€õü[q jN˜eûþ:DRØ>ò¢y˜+Ñ•–ãÖl8OûlfŪ%Œó+ìßGRIyð=kŸ¢K‘!Θ—À¼ÙÀ[)ö³=É5’îM=1Îa]èø+?''°;¥”k|+æ±6gpÿH‚\˃c¾Cn-{ÐÄ£ü |·†Ýhãµ€ÙqĤ•yÎöóñŒN sÁ[<¸ òJÙHŒI¥4ütËΙ=KH:GÛ¦ëZá´ióóÀ<ÜC"iÓ¶#7ìJ_)"""r¥‡Ûã÷Åwk2«3z·Æßz-¸†Y¶îÝÄæô$pëLc?‡JáÖ p×$ž~yGð¤~ûtØŒ?þÆîsÝ%Ìd>Þ5m2÷6ù¯£áÒ gó¹Ÿ}t‘'†é3µo`·•÷öŒ{"Ý+ÍeÆ©fVvŸsù§wî¶ëó꬜5‹…+×·•¥q[Yúû<¢Æ¼Å­õtUšˆˆˆ\þªáV`&œƒ;3àú ¶åñÚ—F ½ y!î±a iA-§Ê°„¸•«9Þüo=s?ƒÛ¸’_z‰*RðKvæ``Pxh%+“sMüÏøùÀ§~Î@þ_‹Ù™kù1KؘXƒiPÃá<Úw§fxMòó½iÔ¢%-[6§®K¹9¹”:XÎ+ħí•v¹‹úŽÿ¬öEDDDä²è¹Q¸9†%ˆˆˆˆÈC=·""""¢p+""""¢p+""""¢p+""""rvUþ…²õë׫z""""rÉ´k×£»%ˆˆˆˆÈCÃDDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDn«ÃŒw^ãµÿÎ'¾Ä8qBñ^¾}ëM¦Å©ú"UdÏaÞ—oðèð!DEEqÇýO2fÚ*â‹ÊÏ·²øé<ÅèU¹ÿ«•*Kà—Goæþ‰û(9y}3ñ\Ô¼·µðâ—“·†—o{i±¥§N+ØÄ›·ßÏ×ûJªµžUm÷|”ÆNãÁÛ^bEŽ¡[Där·d®æ5)”©Î"Õl³6ðÅ3/2aƒ…Ö7?Äó/=Ë}}ë‘>ûC^øp9i60»7 {ÿt©íˆéJ.†-‰߯ÓsR°]ÂzŠˆÈ?‡Ã¥lÜ£NMÒ—ÏbS³´÷µ¨Ú"ËÈgÛ”OYdïÁ 蘆wÅçÓ–mi[ßÂco|Ã{ÚñP“Hn©zUW=ë¨T"" ·˜ñiq=튦°hÎ߉ç)ýÄ%G63wÖ2¶ÇåPjrÄ;¬%=nìE3(Šaê‡ó©}c[²V¬ :¹z¸±8Ióÿ`Åž kÓnÀ­ôiä0Š’Ø8w6«vÅ“UâB͈6ô¼¾+ ½®å Èb¹Û˜¹¦F÷¡¥wåÊ„[“AÜu‹é¶ìѼ}ïÔzãî ‡ÄåSù⇥D§bñ®Gç›â¾Þa8› ,m?}1…ÛÈs ¤yŸa„»]\°Qp€ù“¾bÆÚR‹ÜnÕ‡;ï»…6~€AÑá…LúügVƤSlrÆ¿qwnh(]¬Ç±%òËOñ}"0q·nxžÉϘ*^WV1ᛟX¶;›_3ú|ŒÛZzŸòUÕy×óØëÕ™Û=û6¹Î^'¬‘¬MxéÝD<2†Gºø¡W.‘ M —4:פý€N¸ï›Ëü˜üSÇþ•%³ì‡™ìrjIÿ¡÷p÷m½‰(ÜÀŒß£É;:sY«ÄÜg8 ïŠOÜR¾ù¿ˆ ¹Ž£î¦Oí4ÖÍ]KJ`KgÝ´¯YB×!÷qßÐÞÔ/XË÷ß,ö Öºvãþ—ÿÃ[Ï£eþ<>þt Y•OcK-½ÿw;6â¾{¹5®¶L}¹—ëŸbìØg\{¿ÿ…%Yϳµ{Žm:k+ÛÜÓx}ÜBî{ƒ‡lEDª?/mó&¬A]Ðf+ßÌ^Lë:ý©[¹ÃÇn¡f«ëÙŽpO3PÏÌlÞE‘Ü 3ÁÝûÒ¶Ž&<趘ƒ…=èß±&ðêP%?¦“oƒÒ´ ¬>R›ëíM¤‡ ¨M$üw“ºæ¨=.ÿhöü p£†ëùÇž²ÌC¤›BØûj"k˜!¢6>a{°x˜ÈÛþKó[òð#Qtô6a<œÄ—q‰¤G/fqf#ÞN7 AÏ#ìzq6Ë{rKÈé^> 2ç¾Èй§['j%±ó˜Á}ŸãZN½`Øûàæ¸•õî9‚Ç»ö¥¥¯¨ï‘ù,š›J¾ ¼+¿Â˜-˜0a2›1›MGWÐÁq[Ç ,„sÃ-[˜óêa2ËÇ‹¨çYÚ-I<Û6 !(÷Ìu.hZÞxáÞ_x{Ül¬7¿Ã=‚°êp¹Ã-`r&¬[šíüž™+ZñÀÕ•¦9úÓ¢“©ñ{ز#‘ø¸XöíIÆæÛ¤RïŒ+5¼^cÂÁꀋ«Nïc&‹³©0(J'§4žß>|‹?ކhÆÍ¦ÜÓ¼³‰üØÜp$•œb;œÒ¯gPšŸM¾ÝÏJ“œë_G·À7ÿÀ,ìØ6­;ÓµS|­eŒI ,àzêy=a¬÷Ž7°‘8c*%5ÚÑÈçxcNÁ-³.doJ)„œþåíÃ(ž»1ä„pfd¯ç“±sƒü¸ÒKöòñ·2þØ6l60e–`8…Òm€7ñ1Y¼r?{÷ì`ˆXÊ;ž_‘,Ôð=V“Õ«©êyÆvϵM¤8S¡4v”Æ0iì>̆§¤lÊ'î""—i¸LnôêÁ'¿ýÁºF]¿uƲhêw¬+ ¢Qã†ÔoÙ‹fÁs˜ºåœ-ž¾cÅn`r¾Š[îíE-ë‰ó;¸:koË?žÕ¿ A¬æ¯ý¹Üè}â™`KbÖKòcÍçùú‰ãSLî͹çý¯è¾e k7meíä—ønb#n~éYÚØ 0›Ï|’É„Ûo0fÂÉ7”ðˆð>JÚ3ãRùG쀵.½ºÖ!°Ýpîl”ÎÌ/ç‘ {(ŠˆT‰ÃÿlI_Zõ¿–Mãs3Þ˜ppõÀ±èÛ¶îÁ±¶¹±X´: Ã1‘é…øz_Ø"kµ§mÍÍ,ýi6®}Z`?BôŠyl0ºÑÆU?Æ&WDº¥óÈ»Yù̼þDý^CÓÚî'lfÎóH©'/tòÅ\zðØK«}? ¾›Ãó=ô»Ê—âCëX™h& ›¾m†ÐmÊ+|þñ/0¸>9›ø~ÊŒî v“ºy¿Ì¤÷§âtG‚Jö0çëÙd7¼›®µ«>"Ô©~?® ^Äã&à1¢a¶C¬ùu2óìCèíaÁêé‹SA4Ë—nÄ9Ü…Ìóøö —}ìŽÏ'ÐïÄ`i6ÙÈKŠãH–AŽ—ºžUÛ&¯³ÔÙלRéu2€î÷ âϧ~dâÊμص†.*¹lÃ-ààß·0aUvy íÉa΂ïÙ†A ÛÓÿÞ6ÿ<›ÅËãh|Ã…. €kFÜ…uöŸ,ûq3¹vW^ÍíýÚSCïr¥œ´=yö?fý4‹5s&2;%'Ÿ`v„÷†\C°(=þÜ[ÜÇÓ·|Á¤ñê4`Zöš{{âàÀ]o>õ³ïÿò8Ò¼÷S<S(ŽVñö ¸}9•)oÏ"ÛÁðö÷ðÖÝ×x1ç“5ŒÁo¼ã„‰üüî"2l„¶Ä‹÷ö£–ÐèNîÿ!¦Že9¾ÔkÓûÇ´dч_ñý/»iåÍ>\Õ¹)³¦á¹ôÑ|ùð¥®g·É¡ñëlM8©©ÐyÝB^ž<¿Z?Jk“z‘ `2 C÷È‘+‚¾«…[…[…[…[Q¸Q¸Q¸Q¸áüó»"rz6›’’JKK±Ùl*ˆˆˆT™³³3...ÿÚí×ÏˆˆÈCÃDDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnEDDDDnEDDDDþŸ½ûŽŽ¢ìÛ8þÝlzO =”„*j¨J*RAA‘&Šõµ+Š¢Ï£ˆŠ]¬TiJ¯Ò 5jH¡&ôdwß?h¡é„ësΞ™Ù™ßܳ{ͽ÷Ì*ÜŠˆˆˆˆ(ÜŠˆˆˆˆÂ­ˆˆˆˆÈn÷Mýï|ñ7G¬·ieìYlû-‹YÕJä–a;¾Yߢÿc]èÔ©ÝúþCÆýÍþ;ûÇól§N øû8öµR‰Lìÿ }GÅ“wîúÇ«ºñá†ì«Œå¼õp?ÆíÉ?ZÖÞëÚ—ïãó®i=¯t¹—#Ï8ú=ü&KŽÙÕ°EDn‡p{˱áï/ÞçëÒ°ñÔÜ=2ö·9l:zŒÝOfìo+ÕRäæÛ´U|óò|·ÊL­Ÿæµ7_áñûÊrdÆp^¾˜ÃV0¹—çÞ6íhâˆQ¬çd¦<ÿ0/Í<ˆõ:ÖSDDn?*ÁùœÂch•5—Ÿ~Ï Ã#G;ÕPQäæ²g;æ æÙšòú‡OPËûäyi:Ô‰0óÜ ø-.š§+Gñ@(ÕëZÕ³´J%"¢p{!9Û;|6!íë¶d [Ròð(Û€öm"Iž=•%qÉv!ºÝC´¬è5q&Ÿÿ–GËV†]Gíx‡GÑ´]sîò=±ÊÖc;X<}kv$ÓìEpņ´¾¯!ÎÆÉ×›Ké‡î&}î_lõlJ­CSY|øóÞ‹{˜W»—%#vÓl`oj.&÷ ª4þ÷×ÀѰ“ºm/þ­:Qiý2vg×£”§‹ÜÄ,v<–i˳©Ø· 5¼ ábàV¹=;{pÄš‡-k ƒû|Cð Ïé I‹Çòͯ Ùr0³wY>ø4·(…³‡×ðû7c˜›H†c ÕZv§ßCÑø;@ÁÑuLüf,sb÷‘îàODôèÓ«%‘nW×lÏÚÅìÑ#™²b;‡rÜ­Ù’GïLmÀNξ¹ŒþzK·!×p¦d¥{éúô£4 °œYˆ5‰‰/¼È/IÀ¨§xhÕküø²ØÉ;ð7ßýð;‹¶Âê_•6O<ÇÃ5¼ÏûŠê²ëyâÙ—\éâuö:kl¤­ùŽ7ÿ·šrÏáÙFþ˜ÕìED®È–Pp˜esmùO>ƒOÂB~øìWö„µ¢ÇS½hr˜þZÁÁ‚“>Çb™<3‰àÆéѵ‘y«ÿý våØ!/ÙßÿÄß™ehÚµ½:ÔÃgïLFý¼ŠÔS_%Z²æ…¤†Ö§YÝò4~òiš•0Ъ?o>R‡KùuòŒª­y¤WwÚ×tbëŒñ,;T†+‘­{Ò9ú.š>Ö†%ÕÁ-7W^J,{ò¨QÞóüƒÖ!€†¡]U¯³¦åï›ÌÐ 1Ý݇ïäé¦.üóÝ0¦&äcÏŲ́7†0ËÖˆ¾ï åÝŒžˆ´ IDAT¾ÑdÎø˜þJÆšǘ73%½ Ý^Âûϵ!`ËH ™ÅK|Uo·Ù°Z­ç»³›Ò¦~Y< ðªW–¿!Ó ~€ÊÞß‘&•Ü0(Ch Hùl&Ëv7'ȲŒuÇCiÙ³åÉ^—P\SÙûý?l8R‹OÀV€¹zŽ)yb#­¹† “É ?ãéFIÖ®J„§ BüñHÀärâ£Îäì†#€‹›Z‰Üt¶Ì£dᆟëåÇž‚Ô½1ÂøO‹»‰ò3A¹|JÅaö0ÈØ8™…™5xæÙNÔ÷6€R<“žÌ· IÙ2Ÿù©åè1è1š”4å(íy€­oÌ`QR3:‡]èmÃNê_oðè_Z'Jy{f1mO9ÿ¢;} ’²¡°£ßfïzˆò„6ëÁó1÷QÃ× Dà{`6óþ:D¦¼ -Ñ0™OϦÇóÉU ¼ãÓ<\?3‘´í¼Ž™÷‘Z'æ+¬ç%–›—t©mêBÐñ‹×9ë® ÏÞ1‘ÁÍÀòày¡i5w‘Û$Üš]ñó>u‘‹ƒÅWœN~.f &£P‹©C]O_cr§œµIiw:LWEÂÝÏô¹8–ˆ$Ða-‰ià ˜\)í}Ñ t ަ†Ïþþ k+W¢|ù*DÝUOC­Bn9&'79ı\œ×¯g'?3L› ž…&9G´¢Ià ¾|òIæÖ¯GíZ ‰iP_K»·'Rp?e=Nµw ¡m^eV’¦Œ%Ï/šŠ>gæZR–¹ì8˜a>ªÜê=Å«íÃÎ göô•|>t&`'3a;Gòv0âɇøòô3¬X­`¤æaw §I;oöo_Íü¥;Ù·‰u«öPXÿ2ßc<ˆ(ç{º:†Å‹q êyÑåµMYÚu±:Cþž­¿ÑCã1Ùm8%§S8©¹‹ˆÜ&áö‚.$ “qösMØíö‹>ßÀÎé/A œ-_¾áR–ûú½Dõø-lݾ“­³¿gÞŸá4~¤MBõñ"·KÉʱŒõ;Ó6Ðûì#ÇšÌô7ûó[‰×øþ…3S ÷jô6’{×-gÅš ¬øñM~U‘ß|…Ú6;˜L—?.É00aÇzÑŒ8ù†Y.ò¬NRÛÑ}¸œŠŒ6;†[C^ò(ŽgÏkñpƒŒÍŒ{ïf n½ÚDÝÛFåFòÞüË]GË%ù+®ç%–[Ô6‰/ªÎŽ”{t0O•ÏËþeRËy4Rï?""WÕ!tË®™õ0;RrN”Ú2÷±ã¨ ß o<üpHßMBÆ™›zåÚIJ!^—“×m_œåÉx”¦i»‡éûÏÑÚ'Uk¨UÈ­w úÖ侪±?ObÓñÂÓNή¹ÌÝo¦B£²§ƒ$XI]7‰±Óvã]ë>ºö{ÿ}÷½KÆñלD<Ê`JÙÈîLûéç˜3„?˜GnX0–#›ˆK;3*4wÿöäûYâJ¿47p )…GæöÛ¼ñ÷÷ÇßßÓN¦ÿ4íYv26Žgzr-^ùhÏuoGL­Ü2²°Þõ¼’mrÀ÷¢užÍ`)Có˜ÒF?Æ#0íÛY$¨½‹ˆ\[øJ©6M™LÉÖ (í”Ê–ù3ØãZž‘®8SŸêî£ùkü,Íªà›ŸÀÊ™+È »(È¿ð‘aØÈ>r£®¸Ú’X3ïRM­©[Úƒü[ÙxØ„Ouwµ ¹Ó- ŸèÅÒ—¿áÝióŸ{¸+ÄÜĵÌüm#áõ¾˜òwŸ>oµØv2çç™0õ¦u_r÷þÃÒ$M|ð­Ý…&cÞæë¡cM|Ž­á—1ë°·íFHå0šx¿ÅèacqêÖˆ ¼8f~?ƒô ½ˆ ¹ò¡N­i:ß>úM)eÝËòI?2ËÖ…f,ž¾8emañÂÕ8Gººy?M=ˆÝ%žmû3 ô?ûx6V2’8æEãõ®ç•m“×%êìk:xfAæî}¼¾ø£–6ä?]T&"Rì­¥­›ú²yöÏÌOïR5騣9áN¥hÙ»+ÎÓç0{Ür2Í^„TjM¯ûêàkæÂáÖìN™*¥Y±ðg¾;öÿ×ù~:ÇL㯥øaŽ ³k "ëw¦um_µ ¹5ÖÀf¼ò±?ÓŸÎò™£˜q0'ŸP*Üû,v¹‡PKá¶oà^ýq^êü £§|ÂÀqVÌ¡Ôhó}Zâà@Ï÷^ÀòÕ/|ùÖ¯d9R­Å‹¼ö@8Žè1øuܾ˘ÁÓIwð'²noÞïÕŠ@óÕÓ Âñ»QLøß<ŽZ=¯Ó7ú´&بøÏ´Îwc‡²_ÊÖnMß!5˜7|$¿LÜFݾ…gª4¼‹éã‡ðê‘|ûÌõ®çn“C¥‹ÖÙ’x΢ÂÛòD«¹¼õã8Ö×êO-ÿ¹†ý¢ƒXožüÄ™|öÃÚ¾ø(嵓DDDDäò˜TQ¸¹ÅÜ’ÃDDDDD®„znEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnEDDDDn •@äæKMMUDDäšñññ¹c·]?â """"ņ†%ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆÂ­ˆˆˆˆÈ­Éáz¿@~Ò,>ÿv9éîµéÝ¿ aŽ×páÙ[=l6¡}ž¡yà¿Ø{&±£>dRÂ…'—êü*=+»¨uÈmãóXèÚŽ>~”òÎF¡cdôú/¶—F1 –« %"" ·Wm9»™t€Œ­¬OiAX¸ã-³ñFH ½/œ³×È„³Ÿ“Z†Ü~Nåëé1ü·S8UCDDîP×wXBþAb7íJSª¸f²mC y·ÒÆ»– $4”гÁø»h´†Ü~|+‡’4ákæ¤XU ¹c]מÛüØrÜ•rµ£¨ÊßlÚ¶”–áœê¼ÍOœÉç¿åѲ•;kç¯a×Q;ÞáQ4mל»|Šœ~Fû¦}šпW-¼L¹ìžü)ãŽ6㹞5ñ¼‚¼j=¶ƒÅÓç°f×A2Í^WlHëûêâl@ÎvÆŸKé‡î&}î_lõêÀË#Ô¢ä&1S²I_Ze½ÃO#—R÷õÆø™ÏVÁÑuLüf,sb÷‘îàODôèÓ«%‘nd­á½'ÆPþùÈœ>‰E›’È÷«J›'Ÿã¡êÞ˜{Ö.fÉ”Û9”ãFhÍ–<òxgjû;hˆˆÈ-á:vQ擲a Ç]"‰ ò ¸j),™ÛXŸrvß­ýX,“g&ܸ3=º¶ 2o5㿟Á®ûeM?Á‘À¨ò8'¯gW†íÄŸrY»=°:åð¸ØVÚmØlç>N.7/ÙßÿÄß™ehÚµ½:ÔÃgïLFý¼ŠÔScÖ£¬ùc!©¡õi Ö$7—c(­ûµÇgý(Ƭ=†ýÜé9qŒyc0SÒ«Ðíõ!¼ÿ\¶ŒdÀY8Õ¦ ’øë»yXš÷gÈ'ƒèVj“>ÿøÜÓf¼ÿ&c+Ðùå¡ }«ÕOgèÛ?±=Ç®ú‹ˆÈ-áúu·ä¥°akÎ‘Õ v2p ­F¸9ޏõ)ä…ŸçjDz÷w¤I%7 ÊZR>›É²ÝÍéìyééeJú\Œ¢¼óXÖïΤz”¹û×o-M›wŒ‹¬¢5þþ;èì¿eæÕî`ß2Ö¥eÏ–Ôð6¡¸¦²÷ûØp¤1ž€­sõ.<Sõ[ÉÍgàTöúµXÄÀo¡yå¾T)tb—µu*óSËÑcÐc4)iÊQÚó[ߘÁ¢¤ftö¬v¼Zõ£kƒ`Ì€_‡Lz;#ù—0‹i{ÊñøÝiìc‘” …ýÆ0{×C”¯¬±ê""RŒÃm^Êz¶f8Œ€k8UC vÆ­'9/œR§Ò­©C]OP“{8å|l¬M:ŽÕ³ˆé…Â-ŽAT/ïĸõ{ȬIòšxleþCWãâQà”™\üqÄJjÊa ¼*î~&8–ˆ$Ða-‰ià ˜\)í­`+·P¾u¥òC}i´l(_OjÊ°Ž§OåHÛ›Hž_4}ÎŒWp ­N)Ë\vÌ?ÀìA¹ ~œz†aqÂÁtâ443a;Gòv0âɇøòÌ)"V+©y€Â­ˆˆÛp›Gòúmd’ËæqCÙ|Ö´m¬OnE©SéÖ00•?Oüßn·_Þô3Ñ“ ¨r8þ´Ž=G-lÚ Jãrñl{ú‚²ó?’/rAŽa``Çvê _Ãg‹¡V$·V¾õ¬I÷^5è?â+fDw.âÉ&ìXO·iËEÛ´ÝfÇpkÈKC%ÂñìcÒâá¦Â‹ˆÈ-áúŒ¹ÍKfý¶LÊ´¦×“ýè×ïÄãÉÇšld·>ùÌ]¬‡Ù‘’sz| -s;Žšð ò8Ñ{TÔôÂñ6¨:‘––-^Ê.syj‡;seÑÓŒ[€é»I85†È;´“”/B¼ÔW+·öaíÛ°7THdü7óH)8Ѧ½Kc9²‰¸´3'o¹û7°'ߟÈEÝ<ÌÀ-¤™{ØoóÆßß|L;™þÓt¶g©ê""RŒÃm^Ò:â²\¨|w5Â8ñ,]ƒeÈŠ[Oòét›Ã¦)“Y²eûv®cöo3ØãZÆ‘§†"5½§ ª—s )v?–е½ŠoIÂëSÝ}?ŸÃ†Ý‰$l_Á´ +È «K”® —[9¦}$xßZ’N~ËáR±-M¼·3zØXmŒgûš|5|éZRôq"ZÓ*4‘ß>úŽÙë··fc‡`VŠ/!º}žˆˆÜ®KJK\G–GU¢ÃœÏž`¸Q¯)` `)E릾lžý3óÓÀ»TM:öhN¸“A—žNöy¿W+‹Ó†}T®ÌÕü\„áTŠ–½»â<}³Ç-'ÓìEH¥Öôº¯¾f _Gnm–ð6ôk?Ÿ×þ8|¢M»T¢Çà×qûv,cO'ÝÁŸÈº½y¿W+Í—³ÀRt4ÇïF1áó8jõ ¼NÞèÓš`È-°Ÿ?xõ†ÉOœÉg?¡í‹RÞùßO?Ÿ•£+¾ã‹åeèýLËáYDDDDîŦ¿Å–sˆ„=ñ,_|Ÿè”T°Q¸½mÃmê¦OX…=â^Ú×+¡Ûs‰ˆˆˆÜnê°‘kI—8‹ˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆ(ÜŠˆˆˆˆÜ^t;X‘[€Õj%//üü|¬V« """WÌÙÙ—;vûuŸ[)64,ADDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnM×kÁë¾{‡? ÿÅ ïàÒTnØ’&•}±`=´ˆ/¿X€[§WèYÅã _+?aŸŽ=Fû»QÎéOÈÞÂèa³ íó Íÿý&ÛŽ­eäg˨ôd?îö7«ÕÈ-çóXèÚŽ>~”òÎ…Ž¤ìu|Ðë¿Ø^Å€Z®*”ˆˆ(Ü^ SX+mŠ;ù‡IŒû‡ã¿d³><Ú(³K(5ê5ÀÑßኃ­ˆœtp*_Oá¿Â±¨""r‡º®ÃL®þ‡†F™Š5hÔ®77õ'aÁŸl:fÃäA£V-ˆtÔž¹J¾•CIšð5sR¬*†ˆˆÜ±nè«jÞMÙ…X»+“ê“7l~=úÓ:ÇÎaú‚ ìMÍÅäD•ÆÿáþÚ8vò¬å¯é‹Ø˜pŒ|ÃïR5hÚ¾9U}Nm‚ãÛg3fÁZv§Úñ «J“¶-¨VÂñ¼^a{N2«ÿšÁß[÷“–çB‰rµiv ¼Ì€Üä5ü9c [öÇ¡Dµ…cW[‘[š™’MúÒ*ë~¹”º¯7Æï#h Ž®câ7c™»t"¢ÿCŸ^-‰tÓw'""R<Üð Ê ç’„{ÛIML§ ð‡î¥ü:yFÕÖ<Ò«;ík:±uÆx–*€‚ý:­N5hóhoz=Ü‚rÙ«˜òÇ2N¥Î¼LŸ}˜2-ºñx÷ÖT²®gò±'çœXj=Â?ã¾gΑ0bº<Îã¶ "k¿ü0—ýyvì™Û˜üÃtâ£hÛ½êû?}Éj,r‹s ¥u¿öø¬صÇÎ?!ˉc̃™’^…n¯áýçÚ°e$†Ìâ€:{ED¤˜p¸á¯hXp±@~vþY¾ÖŒ¤%iX»*ž&ñÇ# “‹ lfJÔlEǨh"=M@ž©«Y»*8vœ©Ôî•sÁ ŒÀÎ6’>›Îâø¦”Ž8ó:ù)«Xv „ûû· ÊÃBò‡ÄOç°:ù\“gTáá›PÞÅB)aOæÓiYj-r‹3p*ûýZ,b෿мr_ª:}ÍÚ:•ù©åè1è1š”4å(íy€­oÌ`QR3:‡9¨„""¢pû¯ÙóÉ΋‹ƒüÓv ަ†Ïþþ k+W¢|ù*DÝUO(IõnÚǺMIìOØC|\ VßÊg–k*A… çÓCLîá”óµ³:ù8ÖÓáÖNΡýËßÏäáï3õÔ“íV¬60Žç’–˜†Q²!§¯87ቯ)V­Enƒ|ëJå‡úÒhÙP¾žÔ”aOŸ>’¶7‘<¿h*úœ¯àZR–¹ì8˜ ·""¢p{Ù6ç ûÒ |B½pàLo¨áR–ûú½Dõø-lݾ“­³¿gÞŸá4~¤ý’™?ögþÉ¢b¥ DÔhNÕЙŒ]WøCýäãÌ+a·ƒa>{,¡ÝfÇp®Bç>Í >ë’rWGÅ]`ì¡¡ñˆrå[ÏštïUƒþ#¾bFtç"žl`ÂŽU£ÊED¤˜¸±cníy¤¬YÂ.©YÆ­Pµq<~ s–'ãQ>š¦í¦ïÿ=GkŸV­IáØîE,?ZŽ.Oô¤c‹T/Œsv¶Â˶".1çôG´íønâR-†yJðÎþ¸æ¤pÈ—^^^xI¬˜»œý9x…zc?GÒ鱺62÷ï$Õ¦Æ"·ÏaíÛ°7THdü7óH)0ã]*Ë‘MÄ¥`›»{òý‰,¡›‡‰ˆHñp]{nmYÙ¿ÏñÄ}n3÷‹Ö!¬ÙãTñ4AΙÐé`KbͼH5µ¦niòleãa>Õ=prõÀ1g/±âp qâøžUÌ[–†Ý1‰}‡²¹ 0ÈaëÔ‰,º¯e;ï/ö{5à‰ÒξrÍ1¸.uJ¬eáï3pmY“Û¶,™Å*{j»:àU©>s'3i¼­ïŽÄíØVÎÞµ¹}˜iÚ÷Aæüß/ìÅLIÀ¥b[šx¿ÅèacqêÖˆ ¼8f~?ƒô ½ˆ Q¸…Û¢ÃmÂlÆŽ:+ñ*Mt§.Ü{—ï97™7p‰¼ŸÎ1Óøké~˜cÃìZ‚Èúi]Û£íëOdæœ_ˆÅƒ  uiÓ§k'Ì`þâ"ëÙ»6c þ™ó3 ™ñ/SŸ®]c²pV¸Å!€{zôÄ2ãOý¶–ã6W*ÜM×ÖuOÜ:ɳöÎçÏi‹™úãbÌ~D·mÛô%j-r[±„·¡_ûù¼öÇáG™K%z ~·oÇ2fðtÒü‰¬Û›÷{µ"P?¼'""Å„a·Û5ØNDDDDŠ“J """" ·""""" ·""""" ·""""" ·""""¢p+""""¢p+""""¢p+""""¢p+""""¢p+""""ňƒJ róY­VòòòÈÏÏÇjµª ""rÅœqqq¹c·ß°Ûív5)4,ADDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDä·¶Ãsx­S':uêÄCï-ç˜ý.‘â%ôð•/<Í»Á³¼Ö.´ˆälåðêùìÌ•šÓäÞ†ù›æ±%ãD°õð><–¥»2ð»«Qá$oü“/Þù†5ÇíEN?OA"S ä—UûÈ ¨Â]¾‰Lüb IZ½¬|ñåbŽ˜1Èå`ìd†ZOƹ‹5— ZM ››’o;Æî­GOLÛKRžÌÝ›Hœ*Õ#Üùä|¶Í|óé,’±`CÊš_øøç8rÛÑ%|üòp¦ÇÀ¥|mªä²kùϼûê(¶dZ¬ Œ65‰Gȳÿ‹ùDDDDnÏæR¶=¯¿~Àõªÿ ƒŸmLÉ¢ú„­‡X57`P>æ.üBêQ×ÈßÄü­ؼý«‰Ëü›ðس/1à¿ñzÛhjTpàPzA‘ÓÏ•½u“÷þmô¿·yuà‡ ît‘,Ɇ|Ç—Ÿäû—ëàdÇoåÐy‹µ\»*À»8žÈ†DÀÙ€Œx¶É")60S¾AY\ÏœÐô­¯ùêó‘|ýTE mÛvŽZ HY8‰59àÓüU¾ôÏ x‡^‘™ËøõÇ ½v.A¾ÅˆQ?ðjMË¿˜ODDD¤xr¸òY“† Ç–<ð¬û4ƒûÇ`)znë¡UÌßPŽ˜*^7Dû2uæQ6ÎÛFF:¸V§œÓ*6žÅ'gáEí:õyà‰*û:`u¸ôtûYÃ& 8·“LÀ3ª¥œ À‰°õ)9qÏKïåˆ sÆ\Ãðf¬ùØ.Ðê\ª°*a-»‚Ùk¦â88y)w'`‹Ï"¨_Á£Pù¨éޏ‡„âÉ6Ò­ùØìy¤lI uÎûô›sVÕHÚ~ˆ¼ÈS¹ºÛDä EróÑÀS-^DDDn‹ ¸oü¯³78S¯E-JZ.g>+W.`Ûùê‰Î|UhjÞ¦ylˬMÀ– ü¦K§OgîÒØ’°… XøÇ,: yŸ‡Ê^zzÿ¯iÇV`=ù¯³þ|‘M3éÖ6Џ¼Í5‚«¶Ä³båL‹ºµÙ4m»W®$;©Ë]Þ&È*´|ãBË·c³Úló½£Ü M3áT" ÛN†[7œM—?ŸˆˆˆˆÂíe\çІ´ ý³X°rÁ‰hkxøáçdœ½‡SÉÉÝÈümé„eNâ×ÕÇñ©×•Ÿ?CÞXþøh0vïfùú4J˜Ë„‹N?BÇfgoªOé@8Àñµ‹ØžYª®ÙìX¸äü^Û]*Ô+[ö°àÏCàÙŒŠA¥!Öýý'i€ÍêEÕÀ‘‘%`ãA23½©X½*.†•´m+‰=`Åd¾È$ŠžODDDDáö:°XÉ‚€Hú~øÍýOu?æ°å‹~¼½à8±óã¡éq6,_ÂñåØ8¿¦£Äï±n”)ë‹—íRÓ½ÎÙ8÷¨iê»YGçðîS›)í™ÎžäÌk°Ef|«F‡Œ! IDATÈRòÁT1Š`W_¬î¸S¥N0.ÞQ|†…°¦m¨8uÛ e@F=Âí ¬_½‹ã–ªôû¬þEr󉈈ˆs7åGRV,`?@Ù&T÷)¼ Δ¹§n@î†$Vè˻϶¡F¨AÒ†øgÝ.rJV¦yßôrǣƗ˜îvÞë.xìÝçiU±ΙI$[ËÒ¦{K®ÅYBÉDùœøwpT)\ G‚«†œøƒS%ê—r¾ü¨xo íG³ŠÞ^½ˆ%kàÕš§‡¾Â½%Ì×|>‘â°ÛíwÌ=¢¬ûÙ¹?œKPº”ŽäÆ}ËÓoÎ&­to¾üï}”T¹m9ÜIk;¼„ÏL$ w¢Ú=Hƒ€ã¬2›4¨Ô´~ ¶""""·µ;ªç 8²v ?þ:›µ»’c·àXžzm»ÑµyyÆÐösævÄ»t-ZwïMûjÞ˜oË XIL·RÒË˹Sr³IÀ™ÒNÆ5}ŬÛ‰žžB*€Kt©@m:‰ˆˆˆÂíUƺ#+øîÝaÌ=A“öiÙÍ—‚äí¬žó+ï?³ŠÞäáÊv¥»ñöUp°[ÉIK`õ”øyH>#ÐÄÿv‹·Vbccé°2›æ15ù,ÒùtÀµfeÐŒŒ&„q÷Gp‹¡#@DDDnoY¶#,ùâSææ6áåÏúR×ïÔæÕážæ™;ìu¾ùðª|þ4ÕÜNL1\ƒ‰(W·Ó ©HåÐL6ôÿ‰E;³iâï~[• ~óF:¬L'˜ºp-&£&ŸD8cÊNå½±ŒLØO×™&¦´-KmG"""R|«a‘É‹˜k&ºÏ£DûÛ §PîíÓÈŒ%L^—ŽýË1]pÄ'ËíWž @?jž‹Ç”ëè¿%™37ð]Úé-¤b˜"""R¼«žÛ¬=ëH4—£KÅBà 1ûEQ?ÄʤuIä5* €6«+6òÒ÷³jüìõ½›nå]n»¸ù…1º ôœ¾“¿ór™º,®pt§Rµ(Æ×ñÆç*F%¬Ú•®‚3ÿÏKË"óô²˜³#……Ft¸yùÒ&@ÝÄ"""¢p{ùá65»s¼/’ÚÌxBÖ‘ Nç²-ÃèÙåœçey追©æ~{ŽIuó ㇶ½¦Å³$ÿ¬ £rµ(~¿Ê` ðãÒmLλÈDk:Ÿÿ~ÖŸ¼ÊUW¸…ÛÃÙÝ r‘U8]à ¶Žå€c §3ã1 _P†ücûXöËH~ýì¢?ìLømúÕ½“‹+‘.œn(ë㌻®#…Û[Ÿ[é*”,˜Ëò]ÙÔ®zþû±­¬H€¦Á§³ïù”•'Â5Ž¿ß^ÅÖôN„ûß~ãn­ÙGywF,£;%Ÿé‹N\dVø. W"¢¤•³ÏŒ\¶åe³í¸õäÿÌ”òuÁítˆ6ôÒ}ÁDDDDáö_±„ÝKëˆ)ü0r<1ï?BUBÁ´à0ÿŒý‘Xsm^¬ë‰ì‹.ÇäæÛH϶q»]sw*Ø~_èâ± ‘AxíMbe>@S®®.à¾Ðª/úVʶB÷¹-ÉgítŸ[Q¸½:æ Z>ÿ$Û~Å»ÏÆÓ²}cª”òÆvh'kçNfÑžZ¼òÑÞ—þ^Þ0;`²g“žm½íJ´usüYÁöÔÅcN©®ôœÏÒSwź„U$ÆIˆˆˆÅîR-AMyñÓa<ãÆî¿ðÙCøjÒ ·ç•Ï?äñ:>Eþê˜Ù+œ@KK¦ÅÞvÛ_¥f5FD8rî]\}CÕ&‚†ÀâÃ;­ËÑXÁVDDDŠÃn·Û¯dƤ¼ë³BÁº þêënËañÞ<ª–ö<ï®™i‡YŠ-¼Í\ËëÊΖ Ÿß‘›“ ?Š#“3÷”q¾à$7oZ^‡—tô(Áóµœ9f““'¡&í¹ñÔs{›¹^u¹Õ\I.Tÿšˆˆˆˆ ·""""¢p+""""¢p+""""¢p+""""¢p+"""" ·""""" ·"""""7Å-÷ eV«•¼¼<òóó±Z­ÚC…8;;ƒÙE…¹]Âí«ùD€Sˆ;O¶J """rI– """" ·""""" ·"""""׉ƒJpㄌ\¨"ˆ!±OÌYÿv,þÛœ”wþßî„í–Û¦Dn庲?£"ˆœÃøR'€""ru4,ADDDDnEDDDDnEDDDDnEDDDDnEDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDDáVDDDDnå¦\ÑDHÿUdŸówkâHênt˜s\E*æò¶ ¢¼aÐè×ÃØU9¥à ȳ=H—žÏ3hÔRòUù·¬$¦çq¡¦cÍÍfO®ÞuDáVn7ù;øß]ÎT±‡Uã–dö«G¯ç_äáŠ.*‡Ø³Ù2úm†/2hôÄۼѣ:³?eðï»ÈSuä_ÛØØX_Mÿøœ³®5û(ƒ¦­äži;Yœ­€+ ·Åᓃ¼äulØžŠMÅ›nZðÚðxºº›Šq™ Ž丵¿Cel`ÒüT*õéOçU‰jü(Ï?FòœÄçhÿËå‰ß¼‘+ÓÉ&© ×òüÎךÊ{3b™fÇš¶Ÿ®3w³ú*Κ¬VëéÎk}Á ·7E>És¾æûw^fÌ҃ܟ‘y‰2°mU Lž¥¨Ûý V¥ŠæÙÄ{–&e=1NµèþU,¹Û\µ<¯nÉeCÿ285›Fzá…Ú’ÛØ—û&qøô‰{6«_È|‹¹v26~KŸa¸†Éƒ21ýùeW¦O§…WU†Ìÿ™'£KÐi6Ç/¶.ì¸ÄsÓ§Ó³güHÿfñ5¸–jƳœØ_'§˜8‚Gjálr§l‹wX´{w¬B ‹¹D]úOI¢È^ù,¥B{2qâ봪䇃ƒ7‘Mžã÷H EÖlékùªg}J{f_*·}“iûò®¬.éÓiá³+³‹Þ×EÕ命éÞøxû‹éWªyIëÙ]FýJ^'{óÍ”ˆªEÉÌl9¬ï`äòúQÓrºU1eÁ:úoIfàÌ |—vêïÃ|ˆ°\ùëüôç Ú­N'ݚø?WÐfUiê …ÛÍ‘ð.oÒ¡j.k¿|ƒ±79àÚmœû°ž™±Œ—´æ¿îeÈô,ýéyÊ,~†Fm¾bW>änJûîc0uý‚YKç2ª'“ŸêÌG;Êðúú- ©äHµá;Ȝկ³ZJÍúÔǺd +N½eoáç‰ITìÕ öu jÿ“<{òõ¬e,™ú!­S¿â±^ãI9•«óâù¦÷»ì®÷"CŸ©†ébë²9÷¼íÎ-ê¹yq|Ñï{œûŽeÅ–… ©¶†!½Ãª¬“ ÈÙÆ°—ÿ¦þÇóY¿à"–½KLä,jð 7-áã:Ûñü§l:™_­‰ãèþô*j¿5ž…Ó?â¾ã_Ó¥ÁÓÌ=÷]¸¨ºÛù¬UC^‰kÀ;“þáŸYÃhyx8íb^gÅ©¥u)b__V]îîµzÐÆö;o¾7‘m™ÅïS´ =…c†%ÝͧÿföÀt’ŽYõ.—ÅÍ/ŒÑm"hx:¸æ2uY£SÏÛJÕ¢_ÇŸ«Õåž²m‹å¡u9´º» Aqé²ZW®-•à¶ ö.žÉúÄœ³.رTÆgãÖ~ùð6*‰ùÆG[’¿h€çšæJ8¾ô#F'Õeø¢aô,íÔ%ÊK|ÊØíóɱ$˜îâ•'»Ò<Ô Ñ ®¶ ?3&³&ÃÀ0;à`6Î; hÖ›úùÏ2få1Ú´ô"gë/LL®Âs#p´ÆQùñáüÜýZ…8uÝý5#¿ØKZäçàÔcSÞ…p|öÅ×å¼Þ©ä"ž[`'à™‘ î\ úzg>ˆÙÌþÀ ب7ø3ú5.‰‰`žo<€yG?૚l‚ðç›òVÇí̇ € 'š}ù ƒ:”ÀĽԯ ë#Ÿå£ÿ£é~…Æ»^º.Ö /3lC4_ìüîA& šZ•`e™—ùzí êE]y]ŠÚ×C‹¨‹ëqHNa´|qžß½Ëà7Séÿv/êøš‹Íöäæƒ£N…Y“£;Nä““¯ÁTòïîm zM‹gÉYã *W‹â÷:ÞWlœ<ƒø²ô›¶‘ÇìUù¡M¯NßHªò[mo¼u1\ê¹=ï“"…µÓ&1oÆTæz,˜»†'°il\°š#7éÛ>ŸŽß³hÅ Vz,›úåÈçÀ†md‡5¥aЙó·Ê­ˆrÚÇ?{rp«ý4=#–Ó;¼ º<Ç_÷R¾}'î*ú<ÇМÞõr™7n ÇÉaë¯8Pã :–¶€[z¼ØðÓõÑ<Ñá¿°áì Z|ˆŽ)Ó©õúëRäs-~D×Ár:иáX¸u[ü(_Êýdƒ7áäâŒo¹²x™Î<ßRøMÕ¡2íëù>@ÌAwÓ:"Ÿ«Ï»Hçâu1“¶yû³óX¸3ŽŽŽ8::âRºËò°39ûÄ ÔÕ¥è}}Yu¹cNãý©ÿs¯ g^Rñ¹ÔÊÁÉùYuaËË$œ”ä_†OW"]Îï+ëãŒû5jNNžA|uYÜ6Çòx‚7#Ú”ÁyS,nÊÒ…ÛëÂ1’†ýÊg?O(ôøwû7Æp¨Ð•þ/ÝGÉ›Òçmà\•:uëR·Ð#ºfž—œÍÀlرÙí˜|›1"6™Õ“^£‰Çn&¾ØÐÀ{¸âXÑ·–2ЬW4™³fý‘mü6ᵟlG¨ØŽ.䵆e¨Ýãæð¥A¯ÿñãQ8ž5¿ Þ.gšÜ¿Y—"Ÿk8áîd*ª|ç”åïÔ†ÓÙ‡ŠÙ6«íü:]ª.V&ï.LÜ´“;O>vícß¾&¶õ9±JWQ—Kík.·.wÌ»•ﺶ5ÌÛ”^|­Wž¶tgžé¥µf$/‚<õåœ\>köQÞËècçNÉgú¢µçÝEáŠÙ ذ3…? 7³yG [}éVÊY;Ano ÇÖ|Í'Ÿ-"£BWžåJ¹Üª½!ªUÀ9a>ËRÎt-gnÍúœ0¢K9ü×^¶Ž 6Ï0xäTV'îdD™e|ùm,Y—Ñ\›÷&úØŸü0á&®ÇS­ƒ1c'uþ †ï¸ŸÉëñÓ‡/ñX›ÚxM¿Ä-Å þź\åz_ümü¹>ýt˜´XÊÌx"k…œîa-º.&¼+VÃ/m[m„……Fi5Ã_Ίô«©KQûZçíÒƒóÕ›Ÿ²³Á˼ҴDñ9Ž¢ŒC"ÿl?~²½ZIÝ²Žƒn幫„­ü»`û}¡‹Ç*D]è"³© ¯AÀµ°ríÙæÌ{m" ß¾‘GãœÔ¶2y*’È5:éW Š<äÉJIýVwú<Õ–0—[ûk>ÏFÿGÀ{x¡ó+¸yˆrÙËņ̃lðUtÅiïj¾yó3v9ŒàÙ˜`²6Nâ—83ezሓQ@êöÍìL)I¹’¹,ÿô=&Ò‘·žkˆ LÍé]»/=^ø ÷&ãipâÍÈÉ?·ôÅŒ3 ·:$/üŠ×?ÚƒÍcoM%²ô¹kjÆ©àëbKåïÓ¯ÝàÒÏ%í:T2_{v§Êˆ—ˆñÜÉøO³È¯'‹[ù_ðþ²«‹[­þlËQzG,ݶ;3¨]eV°•kH­©Hï“—_lwË[Ããn>^6ýgñò}uiðÐ0âïÁÒOa1ðmõ%߉fë¦I݆üçÕ?ñ{aŸŒÀb âÞ‡b°~݆è~KȰcý˜á ³žc§¾ñ4мw4¦l7Z¨¼†÷¨OÃÞdnÐLÿ£?å/øÊ—½­—Þ×:rO÷7íÌ ·§àØu0ŠY°=ÙX©ÜsÏ78Îô¡/òÊg‹q¸ïuÞîXGí~¹LUjVcD„ãYÁÖÇWßPFº‹‚ŇwZ—£±ÓÕ4W†µ­DOf—|Ô¶2]låZ¿-Úíö+ºG’~úæ_ ¹ðL_ÒS1*È-*{å³DÆÄñMòlÚx©7ô éË…$ö9ûؾʄ–±îGþ(hËCu|¹Uï‘p¡÷Ó`%S¹ÆmªH¶ïÍ£jiÏóv˜¥øÐÂÛ¬_G”êJÞ 5,ADŠ5÷ÑMe)šÉ™{Ê\x,‹›·?-U!¹]š²J """"Å…znEÎá=‚D]Œ%""r[RÏ­ˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆ(ÜŠˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆÈM¡ûÜÞ$Æ— U‘Ë`µZÉËË#??«ÕZì¶ÏÙÙÌ.wÜvËoS"wLƲÛíö+™ñŠ~·ZDDDDä2;þûy4,ADDDDŠ …[Q¸Q¸Q¸Q¸…[‘Û‹~ÄẒ{µ‰Üiν‡öpÜ\è¾áz¿¹=ŽU¹õ¨çVDDDDnEDDDDn5– """·ù‰© Zµ—u‡38–WpÍ—ïåè@î ¬]š˜o\áVDDDäú˜p”žóãÕ¤ ƒ¼p·˜¯ùkdä[YšœN×9[Û¬MC}TøÛŒ†%ˆˆˆÈmaàÊ=|Sž–á¾×%ظ[Ì´ ÷囘 ¼½rŠ®p+"""r}l8’A“Ó“Ú4Ô›õ‡3Tt…[‘ë#»À†‹Ã‰.®f² ¬*ºÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆˆÂ­ˆˆˆˆ(ÜÊÍ3±ÿƒôϹ?mm;:W;uãà ÙwT=lGçñêÃÏ1)éênâ]°<ÏvêÄ€¿cW3+V´oEîTVö¥å÷y `ÍÍ&>×~Ã×'1=ü‹¬Ïž\½C)ÜÊu:ö’™òüü4ó wÒõ¡&÷òÜÛ¦B1TOí[½¨ÍÊml׬‹¥ÒÏ«é¾=笀kÍ>Ê‹“VRqÒNædÛoØúÄÆÆÒxüjúÇçœp­ÙG4m%÷LÛÉâl\…ÛÆN^ò:6lOŦbσÀ;Šzt§Ui'CûVDnsÛb7rÏòtþŸ½;éúÿ8þº³dÙ‰$d‘ØIEÕöµÓRE©¥ŠjUiiim´åÛ_µ¾¨ÚµÔRj©­ö­”"ÒØ ’Xš Ù33¿?lI$3[-ŸçãÑÇ£BÎ=÷sÏ9÷=wîÉ$—_¶¦ïéW—•ʈÕGø_ª]êZýv–?s~bŽ¥ót²ÈeÍÎà ‹½puY©Œ_„9itiè±á,‡î±?:Ž[ïaêòuÅ^!~–È×ïš”GÒ–Ìݨ#ä¯èÕ¨<êǼÇù)¬˜¹-GΑ®qÁ§îËôï× _[È%q÷Bf.ÝɉËY¨¼iøê`4Ó°~øP–$óÞ¡ûÁQü4®6·3~*»Æ b†åÌú¤ö @.±?a䡦|û]7Ê'meþŒ_ÙLŽbEùjÍè1¸*h!3œño-¢ÆG¸²h>\†2mD5R‹ëKK/¬”»_ddÝÂÜY+Ùw:‹JA´êPè‡!ó ›çÏaõþh®dÛR)¤¯èJçkÆûþ¥?½=·°i¼ékAþ?á,›¹€-G¸náJ`«Þ¼Ý½..#Ûp)2•òXñAÁzg´ë\&Äuçû/[à¢ÈâØÔwøââëLîÇgßdÓ·Ÿ[—láH’žòÕšÐãí^4pÕß?™Æ%Ê g|ÿ›ÇÖí(ãßZ@ÕaÈX·’]ÇÉs®EûACé^Ûá‰|¥?¾×EæTZ#ó_Ÿ²¯¡Þ¤Itv»1n²OLáíÿæñÁ´îD¾{ °66×sGɸÿªJnÎÔצ±=ïÆZ¿dKúìÊ”;Å´Ô[ÿJ¡–—#þÚ‡ßŸŠ®Î„hÓØ{³?«wD Ï©ŒóÉ(æ§ÝéO€‡#>÷ØŸE¿ïg©kM–[²ú÷p»Öà—:8<£oYÉ•[“,ðì6šÎµr8<ýîùwß®3èõètº"ÿéïÜO˜Å‚O¾duzMz~ýbƒ›[ó×ìI¬I*OçI“éYIƒWßi,z'Ø(6÷Gb'Ñ™7·–{?ö§àÞìÜ8Ëò‰3ÙoÓ”c¾â‹Q½ ÎØÄÔï÷‘v«sùIlùa9—«väõ6^(%õåüݯ9 é˜:v­š0hÜç íàJĬŜ½õOóYÿÅh&øÓõÉLÓ—Ú×Ö1qì"¢sÊï»¶`@>μO&°I߈ŸMäóuÉXÿ-ßlLBglÙEÞNÒ¸©g}ª½ŠÝÙM»ɳN³-<ÿV!8ª@Ÿ²›©sbðé2œ°ûœµ™oGÏæH†ÁøþeË[Y¥å—ÈÆÙÛÐþç=&L£§×VN[FLΓº?…ç”…‰ùoüR‡ûÝk@iÆ]‘>ño³sñà·N>4»½¶çðËQLK¹$ƒƒØ^ßçGþl=˜ßÞ‡†ú³æÏ(æÚÕƒXþœ#Ž÷ØŸn½©xêÝ#²iýB*F¥Û¡´;ç_¹rûŒÓ_'~÷þNÈ.ôŠ¡Bu†sxú'À¿u×@êÆOèµ±¸¿³¤yr ÛSýèÖ‡¦åÕ€•Ë\âä'ëٕ؂©ñ$+¼Üò‚œUà玣Wj{ŠJ‚‚¢R¡Ra Íñ×Íaçé,BkÛwaûS=i×À>J-ú2¬I‚Ô€N—6³mã2tà ËCÛäCFuõ@ dE–Ü—Ât\úcU 5¼¡v àG%ÃÞ™qíFVÛÄÚ8?|ß›ÀïJpúíl>ÓÁÆúÎÅÛõ½~t;3‚ywHžwP/ÞMObÖùDÒÎ1ºªÕ ¿õ]´žÚÊMµ cÇÑtš¼èHVô6çÕ`PÊ0 !pÀût¯W¨êgÏaͱ^ø;o2kÛ¢:e[¿Mn¨çÎ X9ö<ÉyÀ“XÂ"s*3b¶ÑùßÅÖxsEÇlîã®òÝ}âq ¸k:+¼¼2†­y…ÏeAÁAl«ïðH‚mÁ€ûc…~kcø£Hª±ì9‡{¶–e*2½#¼½ö(} µø±½#×¥µžÉ+¸nïºr‘ÃkW²#©¤'ðÓ8ºãÉõÛRþ_¨žmýwùRᓈ!ýÓ&nt¤Å'ë\—Ç;ÑÛ²Rm¼´[9}9+ÿÖ4u cú Al}¾>uBÒ¤A}œ´ ¦.I+4¯šÏüݱdÕàâÞ}¤Wy™úåÔ ö¤iG.DbûžXNG#â`ù®Ïßi@m‹oÍò·ûnåc¤/…äqåôeNøÙÞú;5Á¸ªw2ÎG“œ{š©ƒº3½@(Öé@IÍ…jFú~ûª]>ÿD'_¡Þö·¶£¥Rû‘„a uǯF·aÀÒøCKVUhbÍ;Ž‘þBg¶D ¯5„še¸¨=xÎÏþv*Çj„¸êØ›Lz¦‰ýCÂm©¨íñów¾ýÂTÑZ¢y’ß¿*4§LϪ˜÷bÚÔ¼2T¾{^ ñ¸°²±!À¶¦Ž=U¬°ÿž¥µ ¾Ö ·¼­°{ý±,S‘Úéé±ú¬ê°¨}z­:B/«:¬­e#áö™fáK§IKéTäÊaêþé|7e×ý{ðÞˆ6ÿJ°K'O|ý|±(ðS}Ê9¬þš‚ : (v¼9iÍ"ö±?<’ý÷–í¶ IDAT?fñ¼^=š®>¦6ï@­f¾ä,ÜCÜ5{Â÷]ŧKœÕ`¸~œEã¿bÃ5êÕ¯CP³Þ4ò›Ãøíß[‹;3Øh_ªZ Š*•rwp,ð3ƒÞ€bÛzácQ¸fZ{[E)±ï…Nçz¨TÅÞ¯cr¦—Z¼›†bõåŽ'Y±'R¡öÕ±S¸yó¿ µªp»*åfŸLl[”v i±Ò>E—0ŠÌ)Só¿Ø›—M¾¡ø÷¡LŽy])û Ä#¦ËJáƒÕG˜–Î]K–o;ŒJ aAU«Bç҇ݟÏ×aþÕ»û³n×þLñµº¿‰†|"c/rTëÌxO5Ç£/r‰ñ^VÏÜñ—{nMÒs5|“oÛauÂËúq]ÈÕ8x¹¡M>FTÚ˰9"‰ËsÁ·œŠÔˆ•,\{‡Ð6ôx{_Ïþž7ËG±qK<¦ÒTp lŽof;öï`ÿµª´ qB…ëG—³.)”¾ chïŽ4 õÁöz¦‘‹Á:3ú¢¥œ_yôç“a¸}\Ò£"¹¨»Ñ/[w/ì3⸠wÀÅÅU±¬[´ŽèLc}/üZÏÉ»ª‹G9{{;:.m™Àð¯¶p½¢©m”âJB•&[D±æ×•Õ„Ð2 @(Ö%pølæí¢O;Åá‹j\}œ)ã~ÿÛO;Só_{c¬òÉÉ3Ü>±^9yŽ,}ñóÝVÆx‚ƒí”÷´Ö¨êF£ÛÉñƧ(ý˜°‡lçxxÌß׺ú³fçá»>&ÌÜ`{àp$¯Ÿ²b|{_<£Ò+ÊŠ°Õé^æÙ‹znMK2/¦aÚ›÷?ê„§õã}…Â: M¢™?i!»ŽÆ¾ž¾[Oº[š¸[¢ÕDzeñ÷Ì]»ã1QÞ¹‰=‰**Tq@ƒ‚JÑq=é<—Òr028µîG~\wŠ[YOq ¤¹ÏU¶Ïß@ZµV•Un\Å)ã„ef4»wâTôqö­šÊ7k.cHáÔ…ŒbB®Êx_ m[K½åïåßþž£QÝõ3ß-ˆFw3Zú´¥u¥~ùf6›ÿŽ&*| 'MeÓE'ÜoÞÃ[|ß ŸÌËÖéFSëƒÌ˜º‚¿N!úÀJf,ˆÀà@E?ÓÛ(Ú^¡zX{Ó4DCì§±¨ûü ]rÏ`ï÷SX¹ï§"·óÓÿÍâ„}S^­m•¹ÛÏ"ãó_‹b]W‹Kl[µ›è¤$bö.bÆÖôg‚ÂcÖBÆx9S(ر«yU6vö¥yÁ€»'ŽàaÒ“Çc ÛjA¬x±*‹:ø ÜköDZ÷ûsèv°õ£òé£ôж"¬cu^+ólÎS¹-Á$-®íFóa»'£·Šu5ú~ù1¶³²àËu¤k\ð­÷&_ôk«ZÚÑu&óWOfÜÏ:Ôö•n?‚þ-]Q«s¨Ù°ë–O`dò§ÌîNÜÎu¬Ã•vm°UsóS|QNÅÔªÖíû–¬^çÝöß1{áDvã„w¶ œÌ¶ïæ°dÅ)ê º;øÙë‹þJám;7fø—¹Ìñ+?|¾[m ¦ì¬7“¯„…a1{¿~½=žÏuæ“þmq»5ÊKè{Ñú½1þ}´?,aú˜¥dZ¹Ør8£:y¢Õbz….¤9®çGµ±ÆŸÆAXï:ÉóÍ}(øf‘bQ7{º²oáW,¹ å«5gØç½ °¾ñ`›YÛÏ$ãó°®NïÁíønÎl>bkf¼ön[2¦$–8fŽ»\©¹xü?ÈÏWóúé¼›ŸŠpóá1çJ¬îdà¥U±lÇ‘o_ò£å#x\¡fH S¯fHlÞÍOE¸ùð˜S%æµ7ðƺXöâÈgmýxÑò^ç¾ “:xÐÁ^Ï!ër|ÓÁƒ—Ë<»/@ƒÁpO‘(‹šÙÜ,¤BÇÅu#º®¦ôÁûæ˜È™Ë»cykÎBmží ][ž…ySÜz*ë…Å„–é;1¼ÓÄô?Ôg³ål.!ÞeîúT„ë©ÿ° G::ªM>+Qt{÷œ}ôÙìŽÏ¥Vå2w}*BFÚ?ìÁ‘–jù&Ŕ䚈>ã§ND°nE<Ú¼‡‡„!„x8TVüǧø©ì]xé_èOã*Å÷ÇÖÁ…VrÄ( ·B<"ºK»˜õíFôµ_ãÝvò™ B!„„[!ž`ZïžL^ҳؿ³ð}“Y‹¥FB!Äý’Ç]…B!„„[!„BˆGÉF£&+_ÿH¶•™¯ÃV«–¢K¸B!„x8BÊÙ±#!õ‘lkÛ…4BËÙKÑ%Ü !„B<au«ÐG+Ï\![÷p®àfëô¬ˆ½ÂÀQ„Õ­,EÉçÜ>Bò¹•B˜¿¶ÈçÜ ! ڞʸq¸t\ýƒ¸*u+Ø3¾nš¸;Höy³“„[ ·BH¸•p+„ìóÔd'¹-A!„B<5äsn!NGnn.yyyèt:)ˆEXYYÚú™š7Åí³B ·O„K:õ“˜œÈ„(VÖ38o²ä° !Ä%·%!„B ·B!„BO=y#„Ϩü ËÒ¥ Ÿî½vóÊV)e†3¾Ç@æÆäJ…n…B<&'»ª4kß‘Fî(º$V{.#χ !ždrq^!žÕpëD§¾A7þ ‰V!áV!Ä¿'—ÄÝ ™¹t''.g¡vð¦á«ƒÐÜ’Í a]Í Lëç‹…>™­Ÿ¼ÅŒøFÎþ˜çì²"'1ð‹ËôžÔ…ý£fã6öc¦È’D`Þ;t?8ŠŸÆÕÁâŸp–Í\À–# \·p%°UoÞî^ ä^ÚËì—±ëÔt.µhÿÖPz;È¡ÿš½1‰Î¿óçœÔLn Cn&k£.Uà‹ÍìœxÕÕB 'áV!Ä¿-ïÜ*&N݉sçþ|ìÄÕˆ_™9{ªý—ºuÊñóÁã$ë|©˜sŽÃç¼3NÌ幪*’þ>M¶{+j8ªØ q§ó¤É¨>Áž“™Ø¶šÌãÌþd{=º1è³`Êþó' ¦Ë7ßñe3@—ʶYÛxyÐp&öMfÿ’i,¾‚ž³ß”ƒ#þ5ÓwžbqI·‚ëÒ™¸+½ÐýkK¸•p+„âqŸO²âÁË-_ ÈY~î8zE¡¶· bH öks­#Î)‘ÄYÑØå''£óÑpòH Î!µ)§N¹Ýž¢R£  ¨T¨Tpýè*vfóî.<ï ^¼›žÄ¬ó‰dx¾2˜×ž¯ˆ_:t`øsr`„n…B˜Ïʧ5M]Ø>h[Ÿ¯OІ4iP'­–õÐNæ@|þ ÇÉðìH3ßKüu8–«Í4„'ÙØß -)%Egþ‰N ¿B;¼í•›?ÓR©ýHÂ2ÃAmŸ·ÞáU´Vh9.âßåïjOPæÏþÐçfqôê­ÊÕx;[s{H£àæ 1H­BˆÇ‚bÈ›“æÐ,bûÃ#ÙÿÓhÏ àÕÑ£éêçMŸ|Žåtâe\‚ý¨âãåæCÄÄh‰ÓT£½§¥Ñö z¨Œ|རÅJÒ¬xÌŒmÊØÎH:Uàsn˳ðùœÛg|˜B°’ "0øଖú !$Ü !„x€ìj`DW?VOfܨÑü÷çÃØ·Áˆ–®¨M¹Ú;!T¶ÔŽT rÜ©WÓáîÅ_íH͆5ÐožÀÈY'ɱ®Æãßç…ÜLó£§îBÕr8£:y¢•ò !cŠÁ`0ÜË/&Ê·. !ÄCã&ŸN$ÄÝ¡eúN ï4)õ¿Ï»žÌôS×H3€Ê² ýj:ᮺ÷íIöy2ÖB¹­Z!„O%­3Cë8K!ž1r[‚B!„p+„B!„„[!„B!$Ü !„âYf£Q“•¯$ÛÊÌ×a«•Ͻ“p+„Bñ„”³cGBê#ÙÖ¶ i„–³—¢K¸B!„x8ÂêV¡ÿŽ(Vž¹B¶îá\ÁÍÖéY{…;£«[YŠþ’ϹBˆÇ|έÅ۞ʸq¸t\ýƒ¸*u+Ø3¾nš¸;Höy×B ·B!áV!Ùç©Y å¶!„BñÔo(BˆÇ\!Bˆ{#Wn…B!„„[!„B!$Ü !„B!áV!„B ·B!„B­B!„n…B!„p+„B!Äý/qx„äë4…0­è—< ó¦¸/lõB<è1%ijB®Ü !„B ·B!„BH¸B!„B­B!„n…B!„„[!„B!$Ü !„B!áV!„B ·B!„BH¸B!„n…B!„p+îÇŠ÷^e༊~e¸>e#»ôäÿ"³žÞÏ g|Ìy¸_˜®OÙÆÈ׆²21ÿ™kR‡§Cþ…å éÒ…O÷^à å&éHHÏ%¯¸¿ÉÉ".GF‘p+ž¸u-‰ÕÃ^cĆËè¤B<ù ¼]UšµïH#w )‡0l9‹Ëñ^Lv¡€«ËJ!lí¯ew–\!áö)` 7)‚ÈèTôR !Ä“´À;Ñ©ooZW¶”b£bŽ¥ót²ÈeÍÎà ‹½puY©Œ_„9itiè±á,‡îã 4NÇ­÷ƒtùºb¯ q¿4RSòHÚ2ƒ¹u„¼ó½•Gý˜÷8?%‚3²åÈ9Ò5.øÔ}™þýZák«¹$î^ÈÌ¥;9q9 µƒ7 _Ì€fÖÊ’D`Þ;t?8ŠŸÆÕÁævÆOe׸A̰ü€YŸÔÃ^È%öÇ!Œ<Ô”o¿ëFù¤­ÌŸñ+{¢“ÉQ¬(_­=÷¢QíÛ ÞZD:qeÑ|¸ eÚˆj¤×—–^X)%¼Ð¸´—Ù?.cש+è\jÑþ­¡¼ì€ ÙçÌÝ~ œÝÂÜY+Ùw:‹JA´êpãELþEÖ|ð>ëjN`Z?_,ôÉlýä-fć0röÇù’Õé5éùñ¾Úž 'æðé„M\ÒAÞ¹ULœºÕ ýùô‹q nnÍ_³'±&©<'M¦g% ^}§±xLè`  8ØÜý‰DgÞÜZîþØŸ‚{³pã,Ë'Îd¿MSŽùŠ/Fõ&8cS¿ßGÚ­Îå'±å‡å\®Ú‘×Ûx¡*©/çKx-¯KeÛ¬mX·ÎĉòŠ{ «¦¯àL.gþöµé˜:v­š0hÜç íàJĬŜÍ4ÎÖ)GÚÑã$ë€ìs>äápbî=Ÿ&Û½>5lãÍÞ¶E~"ë¿Íº~8‘‰cúRûÚ:&Ž]Dtv‘·ýLÕ^)E[ù‰lœ½ íÞcÂä0zzaå´eÄä€ÁXJ1¦ŠÛ?ñׄÌãÌûd›ôøÙD>X—ŒõßòÍÆ¤BkUž‘ùf´Òñijuö`~{Þ®9¬ù3Šù©w‚mµÀ –?çˆã}Ñn½©xêÝ#²iýB*F¥Û¡´;k¥råö!Ð_'~÷þNÈ.ô†¡Bu†sxú'À¿u×@êÆOèµ±¸¿³¤yr ÛSýèÖ‡¦åÕ€•Ë\âä'ëٕ؂©ñ$+¼Üò‚œUà玣Wj{ŠJ‚‚¢R¡R]½›ã¯›ÃÎÓY„Ö¶!ïÂö§zÒ®+}•ZôeX“6;©œ.mfÛÆ+dèÀ@—‡¶É‡ŒêêÈŠ,¹/%ì>ž¯ æµç+¢Æ—]#Ø0î©ù€Zcæöu\\·Œƒª†ŒÞP;ð£’á ï̸h©ˆýÚCÄ\ëˆsJ$qÖA4v9ÁÉãÉè|4œ<’‚sHmÊ©Ôfï{nÌ*ÖÆù1àû޼訾xW‚Óo/`ó™îT­nYêÚëão«2 3P¶õÛôhà†pîÜ€•cÏ“œ§£ÌÆê`zLuu¾{ÿ×÷1¦ï$NóWž}¦ñm×'~ɺ~t;3‚ywHžwP/ÞMObÖùD2 ,bù%Î}ÅhÉ'¶?þryšîú­á¼ÂëõÀ –=çp_ÁÀ²LE¦w„·×¥¡?¶÷a亣t£–\Ánšü‹^»’I%=%žÆÑ‡H®ß–òÿBõlë¿ÃÈ— Cú¦MÜèH‹O ×¹.Žw¢·e¥Úxi·rúrVþ­iêÆôAƒØú|}ê„6¤Iƒú8iL]’Vi^5Ÿù»cɪÀŽûH¯ò2õË©AíIÓŽ\ˆ>Äö=±œŽ:FÄÁ8ò]Ÿ¿Ó€Úßšåo÷ÝÊÇH_Š£¶ÇÇÏéö‹ EkÅíjiîöó¸rú2ŠG'ün¿µªÆ! Wõî›MÖ#@;™ñø''ó#Í|/ñ×áX®6ÓždG`7´––fnÛ@Æùh’sO3uPw¦ß¹4NJj., =TríUdœ4ÑVåµóów.P;K4ªÒÔÁô˜Âùîcûذ{žñ¿þúT/YÿD'_¡Þö·ŽŸ–JíG~ûß•<ßò9[b:W/4~ü%Ü>U,­mðµ¦H¸Õàíh…Ý ž–e*òC;==Va€Uµ¯B¯UGèeU‡µµlä  ·œ…/&-¥S¡êHÝ?ï¦ìâºÞÑæ_ ¶ `é䉯Ÿ/~ªO9‡µÑ_SPa@‡Å.7'Í¡YÄ>ö‡G²ÿ§Ñ,žÀ«£GÓÕÇÔæ¨ÕÌ—œ…{ˆ»fOø¾«øt©ƒ³ ׳hüWl¸æC½úujÖ›F~s¿½àï[bkqgu4Ú—ªÖw?Ý­h±*!øÞËöU*åîmü™µ7 |òYx8–Ó‰—q ö£Š?–›£%NSöž–÷´mƒÞ€bÛzácQøkím‹Ù÷’kŸfª-ñÚ™¬ƒ‰1UÜþ‰GÇ 7€Jeò³’çÛGÔ)e%ñTÐe¥ðùú#Ì¿ZôoòX·ë0*%„)¾V÷ÿ"ÖOdìEŽjï©æxôENX81ÞËJ‚pûhè¹>ƒÉ7ƒí°:áiý¸žÄÕ8x¹¡M>FTš¯r7®´ä\ˆ$.Ï…¦åÔ¤F¬díÙ*´© =ê¶¡ÇÀKü>ê]–m‰çeŸ²&õc`s|3³c¿'®U¥[ˆ* \;ºœuI¡Œšñµmn,†q'3\ Ö‘ñ[É}©@éŸï6pÝìík)çWýáƒÄd4$ÄNô¤GErñÖ/)öø?ïÎÕß¶²=׆êÝœ°©P‡ÊùóÙºUEžw/|l \ßoî¶lݽ°Ï8Žõn>@¦Kù‹… OQ£w/ž³,míï¥-sê`jLiïéû Ü–àä]Õ–£œÍhCù2  ãÒ–¯ùú`(q.0ßJšû 4 ,¹w[=ÁÇ_˜lçxxÌß·"eã9pó!³5;÷p ù8É맬ßÞÏè£ôвb|Çêt/# ·jÊ“y1 »ÐÞô§Ö÷Õ)ë€4uÃüI ±ìÙˆŠ¹Ql˜»žtÿ~4q·@{%–-‹7pIõ&mk:‘ÿ{UThê€P):®'çRZY*–Í'jýröSŸWÛ`«€âHsŸL›¿«šÃ *{£Ú2NXfž`÷ÎCXùZ“z|‹Ö\Æ`é ¸–/ÚSZ½‘¾28UpÛ&B·ùÛWãR¯A‹¦ò¿o+2 S0eSþâ—Ñè¨p»5êQnÖ"µ¡´©hbåCh…æŸþØ+ ¹fo,}ÚÒºÒ6~ùf6ö}›ã¥‹gßʟؤïFËî9.©ö&ÛÊ5þ‚ÈTŒ)-ä<Æâ¸-¡ln4]0–SWÀ+!8^ gÉ‚ z⬾RŠù戓‘6Ü«{?þâ©pòxL¡`{ãá1,Smxcm {nÜýqtó É=~ºÜ¡ÛÁÖʧÐ3ÚŠ°ŽÕyM‚­pû(iqm7šÛ=½U¬«Ñ÷˱µ_®#]ã‚o½7ù¢_k\Õ ÔÀˆ®3™¿z2ã~Ö¡¶¯DpûôoéŠZC͆5X·|#“?eÖpwâv®c®´k€­š›Oîû¢œŠ#¨U-nÝ¢gð:ï¶ÿŽÙ '²'¼ë´eà„`¶}7‡%+NQoÐÝÔÎX_ôW oÛÄ~›¿}P97fø—¹Ìñ+?|¾[m ¦ì¬w&H¹Ú;/!¡l•­•#Õ‚\ Þ’z5PÝã¶ÑzñJX³çñë×ÛHÑÙãù\g>éß·’fe µ7Ù–‰Ï¤4UãcJVˆÇaο1þ}´?,aú˜¥dZ¹Ør8£:y¢Í»Rªù¦ÑT(± -rüŸ5C™zí0Cbón[GpªÄ¼öÞXË^ù¬­/ZÞÏxuaR:Øë9d]Žo:xð²[ñ ×EƒÁpO7M%æJñÌåf!5ÂܵåY˜7Å­§²^ˆ=¦LÒg³;>—Z•ËÜõ©iÿ°GZ:¨åÛîÄcŸäÊ­B!@eEã*Å?ÔeëàB+©xR†²”@!„BH¸B!„B­B!„n…B!„p+„B!$Ü !„B!áV!„B ·B!„BH¸B!„B¾¡ì‘Òétäææ’——‡N§“‚Q„••¨­Ÿ©ySÜ>Ëz!ƘâY¡ ýüâ=}oµB!„¥äfaþïÈm B!„â©!áV!„BH¸B!„B­B!„n…B!„p+„B!$Ü !„B!áV!„B ·B!„BH¸B!„B­B!„p+„B!„„[!„B!$Ü !„B!áV!„BH¸B!„B­B!„n…B!„p+„B!„„[!„B!áV!„B ·B!„BH¸B!„B­B!„p+„B!„„[!„B!$Ü !„Bñ†ÛCãºð^’ÿût^4¹™áLï;_cs‹mC—°œñ=º0yß5 ²s×÷ñ¿>o³&>¯ðÿ‹‘ëGæóý»0tì’ã—Ö£ SdHiÌðÐæÌã>Få<6\#âó»×´÷ cÆ/HÎ+fyLëøþøÝ\½ßbt?ð¶ž2¹§gòi¿¯8‘õ,Îg OÝÆ7}†²9)_ŠQ ÍãÖ¡êoý—á™zòâ—3sîž(¡Ž*@Aãà–cFÛPìªR¿MG¬Ü,Pä?€ä“ÄÖQÞâŒhUõcu¾½JÔªüSc0õkˆƒá8õ[wĦ¢FŽ›žè9cj|–vŒ<ªq^¥ï¾QKÀwËÇ~gÕª¯™¥™Ä‡¯xñØŽÜuѯ>öÊS²­'a{–泜SÅÓnmÜ|ðºõêTW’ŒSe_¼Ê8ü™ÆÛP• â?½‚äè> ùd窰¯ì‡kY ÔÓ²w°ÔÅLOõœ16F®ÿ ÁÃÆO_?¬nþ¹r€Öqo1û}\éèEÅ'¤ŽÊÓ²-™ÏBH¸}ŒVZò.ïeÙÏË8us-šöJ» T™áLg&åÇL£‹\Þ³¥Ëw{% UYoB;æÕ^X*w·™s~++çüJøédr+œšÑþ­^„–×!–Á¦9 ùóØ9®i\ð¨ó2¯ön…—Õ%¶2„Õ'0¶/Z}2Ž{‹¥çBðýÇÔ²SÈ>:‰±/óò”Ïñ=¹¨}ÍáÌÜÁL‰ïθϰ{Â/ IDATZà¨Èâôï0ýÒëŒÛûôúc« OÝÆ·ÃÖ8q-o^½Ê99…ϾÍã)éj]`Sù l9”uIÀOïðÁ¡Qüwt´©%·_l}’Ãù}ÎöK ÓÂÿ½yíÕº8jŒÔÎVÌp¦Y@åw;‘µa%N$’ïT‹¦†Ò¶¦Ž}cÞâ—³ÀÙa¼x0ã?´âÇ!?âñÙT:W± ÿÒ^VÏZÄS)XxÖ£ù«~šº—'Eývãu0„3}È"|?èDÊÒùuʘaAXfžaïÂ9l=MJ¶-®µ[ѱ_Wj:kЧFÇ”±ý t(æ¾!Sc4×Èx7òwYçŒñºÕÕ6Þç›ûäùV+R~[ÉßqY”­ù=û׿üÏ?°ùðy2m|i<à#^®ã„0«©±UÏ`k1ãóVpDŸÌ^cc¤\qþш»Ú±4Ù¯»Ç‡•ÙiWƒ¥µò³É/æ=d£µ¹¯ñ`ªíŠ©ãaM±Ï2þû³æŠ‘m*ÃÏï™?K½ýÇd+휹±s:Ò/`Ú¯[9}Ù€SÕhÛ¿uÜ-Q ž+5¹ÆäšfbÌböZq?ë©5q&Λª»ûvïu+¡M4ì5Ô¼µÙq[øuÞJþŽIEëD£Žè%Öüïɽ¬ŸÊ¾yÛ°j=œáã?¤•[ [f®àB‘ÛpóϯbÖ;Q5ìÏÛãÆÑ³©5‘ó'±ýB1÷yåeã73ùÛº)]?þŠa#zS-c gî3~ÏWv«Ç~ÉÖ«5éðᆠnËÉ9LþfÿàŒH9®?NšÈ>lj @ÞŽ'åy\‰ç&°}QU^ÿŒ‘ŸvÃ%zS†}MLÕ7xïë/èäÀ®¸˜w£-“5-i{ºbÆg¡Îø1:ÎKÕ¯"ã£t‹:Ýÿô9é\<ô+«÷gbW+”rE0Õ‡û˜3–‹«£ÎÄï›;WL3sç¢9ÛÖ9sæ @N$¿,N jÏO>º?µòw°püúsz·uåä¼Å\G~žÂ+·p{y0íëUD…/N¯D°ë‹s¤¹·:?-ž4Ń-^ ÀI¾î”õŒBe_ÌHÖkpmÖ—>ÛPÝQ øPöòföm¾B–Ê”˜m×°?ÍÎcûP¯œðÃÝþ±ãÖs0©Íkb»áñ×;âI‚UÏ9ŸàÌÉdôÞb¥àP»6e®//u_-¼šPÃ&Œ¿Ž¥S÷Grb¶q<¯¯:5ÇhZÙšyaI¥FAAQ©PTŠÉýmSISè@e_ÅÌ`^§ µË*€=¯&±ìB")§¶oË Ð°où6껡^jÀ–ñçI˃ÊÚ;}S«åÎv¯ý½Œý9õxãW¨e¯@@ez§a s^Då¡iü!_ñ@äÅ®bG¼]'÷æ9ð¥’;Ľ·€=g»S¹š¥ùcÊÈþaiÞµ02ÞóÏ—f.”²nÆú¬PS¹[?U+‹‚Mª-!:£']ÛRVǶlø.‘kù—¸ÉxM½LŒëÂãÓØø-皤ا.ܪíñðqº}éYÑZ¡)ftZViM½ a,2ˆ?ëÕ§fpCêÕ¯OYmqÿØ“zí¸xúûÿŒ%>ú'ÂãÐUxÞØ¥=®žK Ï©.Þwî ¶p¯»v+ñWò°ð¯‡·v2GÎeP%ñ8™©ïs‰È¿c¹ÞDÃñ‹vø÷uö’}µªBÝ`k~ØuŒk C¸°-C!øÙëMöÛû)¼Îtû…ý|RO' +ß»[û¡ÅµÍHÞCÇåµ ·åtãX{ù98Ö–¨M¾çGê© è]»áa{g»NÕý°^™dÆ8³Å«zù›Å@Ö…hÒrO³pHw¨‰^JZ., /’¥SæìŸ‰öŒwƒÆÈøÊ4³n¦ú¬¶§‚‹ÕÍZ(h,´ØØWÀZ¹õN¼%*%»t5õº×1p¯žKׯ‚㣔 VK‚¦M=,QlKßW°Â£q(–_ï æ¢áGÞ«Ž¦úSÜ©*?á>žÙ4Ò¾Ao•ªô…m«”ǺèÉ× ¿»/ %_¹+¶Š%ÖJ¡}QlÒ/¬ž…[ÖØÙÞµ¥Sf쟩öŒw#çnfÝJÓçR2“5ÕÝë¸Ïx[ª~¥ÞE(»Ÿ>pý8kîi<|L3Dzy}³Cÿ§‰öÍ}KÕ¬¹XŠí?nëœsæö¬,t3 7€J£2ë|ù ×4sιf¯÷½ž–|Þ47g˜ª›ÊÒH¼ÍiËšK‡•»K¤RäAK#žò/qÐq5r%¿m8K™à6´0Š¿ÿž.墸c{_Ž_Ú½ý9ÿ;†•F1¿Z/ZŽ C;¿ÝFºÎžŠ¡ôF[ÊkŠ{ácbLõ7oŸŒ·Eл%¡2Š‘ñ•›Púº=h¦jj*Ü3>­î¥Å´cV¿ô™$ì^ÇN\iÒ2kõ#¨Í}Œ•³Æ²ùsÁëþÚÔÛÂÖ9u¹–ô鬰sÉ~OVS¾FGÞú°•,0+Ü>Ø5ÍĘ»ÏCþ`ÖÓâÏ›vü)`ì|®Î1o­qjÌŸåòëœ_Yòå ÔƒhÜ0ösW J8ÿ †{úv¾Ä\)Þ¿OÇ?¿ä‹ µ>©R‘BÕI?űÓ*ªW¥ŒúÆÛZYKØ\GMꇗÔKê&„ó¦x¬¹ÝÃ1RIÙžLúŒ Ä„o`õêx\š4¥¢Lл_¹åœaË”/Y¼!‚Ä”tRbw²rþ´uI½¤nB9oЧõ<&WnŸLùgñõgÑvâõA¨l+ÏMS%R-eé¢Íœº”‰b[žÊ ^㵨`)õ’º !ä¼)w÷råV­B!„xj­ܖ „B!žn…B!„„[!„B!$Ü !„B!áV!„B ·B!„B­B!„n…B!„pûØÒ%±õÃ×øï¦Ëè¤r<„B!áV!„Bˆ‡í±üú]]j›æ,äÏc縦qÁ£Î˼ڻ^¶ y±sùâÛl:õq`ß²-D]Ôãäß„{\A €!ó {ÎaëhR²mq­ÝŠŽýºRÓY™áL²ß:‘²t>G‡2fX Êù­¬œó+á§“ÉU¬phFû·zêt™Í#‡².éfÁjŒâ¿£ë 5ÒÇâ·Q«{²tùNb¯d¡*ëMhçÁ¼Ú ˻¾ÞÚ@NIý)¯r¹\ª¶r83w0Sâ»3î³8ª²8ýÃ;L¿ô:ãÆ6Ç>½äýЧnãÛakœ8‰–57Z<9…ϾÍã)éj]ð ]dû'CØQ}cûø¢Õ'ó縷Xz.„ßL-;…죓;ñ2/OùŠÐÌí%ï_f8Ó‡, ò»ÈÚ°’'ÉwªEÓCi[=ƒ­EŽÇÿFב™,„B<…žŽ¯ßÍŽbõØ/Ùzµ&>œÀ°Áíq99‡Éßl⟛ïAëSwóóü<: ç½ûP={3óÇÍ&*Ãù‰ìüïh~Kô§Íûñq_ª]_Ǭ°EÄeßÌñùIü9k9)¾éØÊ mÞY6~3“¿­›Òõã¯6¢7Õ26±pæ>®ªÝùÏÄÉtp×àÖk“>Ū},º ÕùUÌúa'ª†ýy{Ü8z6µ&rþ$¶_È»»Æúc€üR·eI¥F¡ØÆí :]ãGY§Ù‘M•!”Í-Å~”–Úÿr\;~œ4}Ž€¼3OÊò¸yš·úøÚÄÝ¿õKäyÛÐ4áÿFÏ3lþaçtw!„Bˆ[4_¶]Ãþ4?:íC½rjÀwûKÄŽ[ÏÁ¤´ hðï÷>íž+ƒT®†Íaû‰^TqÚÄŽx?ºNîÍs àK%wˆ{o{Îv§² ËCÓøC¾âq£9WqmÖ—>ÛPÝQ øPöòföm¾B–ʨÔ(((*ŠJ1ÙÇ6Nwo#ûhÁ™“Éè½5ÄKÁ¡vmœTjãõаoù6껡^jÀ–ñçI˃ÊÖ…‡B!Äcn¯žK Ï©.Þê;ͽ6îÚ­Ä_É»‘|ÔÔòµçV¬Q9T£zûÏ$s-3š´ÜÓ,ÒE·[Сג–‹Á PÛâU½ü·ô¤^;.ž>Äþ?c‰>Ɖð8tž/¦‡:Ó}tº{–UZS¯B‹‡ âÏzõ©ÜzõëSV[L83ѳڲªBÝ`k~ØuŒk C¸°-C!øÙëMyÇΣÞÚÉ9—A•Äãdzt¤¾Ï%"ÿŽåz Ç/Úáß× ¥¥éz«íñòs¾ýÖ‚¢µD-wˆ !„âI ·ÅR è¹õžµªHÐQP)`Ðë1è (¶ éÖ O‹ÂÿFcg‹¢K¬-îAÃõã¬ø»®ùT·Mzê;‡ïwÞG‹lC± ¤ËÄ9ÔÜGdD$‘‹F³nA­?M?k ÆRSý1§-°Â£q(–_ï æ¢áGÞ«Ž¥ªua†ültuñ5°ö&¸J>¿EÄŸtÇÚ~TªâŶCÄÇjIÐT£©‡eéê­h±ÔÊUY!„B<áá¶Œ§š”cœM×áær#Då&D’çB=-于ÇeR'ÈЧŸâÄ%5.Þ.Ø;xa›qŠKz‚œoìž.õ/~[| ¿ž½¨u×É2/gÇÅPNù€j6y$œÊD_lÕ¦ûxW#c{\š¶oCû:mhßï»Ç¼ËïÛãiá€E©ûcN[7XVnB5‹¯Ø¾*‹KšT½Q7Sû¡ÜH³äæÝ ºy¤ž:G¶¾J ßž*õܹ¾n+ûsmðíâ„Uù:¸çÏçÏí*ò+÷ÂÃÆ@æsê-„Bñ‡[˪¨Wv +þ·‹î(—Å®×s­j?ê¹i! ƒÃ3¦àÖ÷%|m.ò÷²ÙÄØ5eh =–š¶¼à¾ “gcÛ«9nºx"~û‰=ún4²SÝÇ…š2NXdžàЇ°ô¶æêÉM¬Yƒu g2p©¤ Rtd&'9½,.¦ú˜St*4úXþüeɪ7y±º¹çþ"TwÔ ¨ð®_‹3ÛÙ¶j;ÿŒ&Çûez¿ÓOä%qp}8¶/¶¥ºÓ«•'?\³°û·ÕìÚ}„¬ëòÊ Ðýý;]ô£A}/¬3¢9´a$U§qãZÔ4ÒÇ»·¡ -_ÕYmXŶM[9|:÷–ƒx½?6E¢ñþTåÅ-ð.e[7h±µ:Ë{®òÆë·¯h›ª5Z*WÌ"zË26ü¶ƒèkUhùz5’¯Q£uœ‹¹H­²´$y÷VâÊ·§cK_¬Õ¨/íâÏÓŽ¼ðúKøÚ«L×;þÞPøéÓþf÷ÎTªµk†«•Íõ;Çã?Ï»ÊLB!žBöê{È’ãçÜ“;—°ñ‰tŸ>†6rÐKGÇ?¿ä‹ µ>©R!„B<þîåsn5R¶§›>ãgNE°su<.-ߣ¢[!„B<Å$Ü>íáöò.–MÙˆ>ð5^oí!\!„Oµ'î¶!„Bñlx:¾~W!„Bˆ{$áV!„BH¸B!„B­B!„n…B!„p+„B!$Ü !Äÿ·wßñQÕùþÇ_“IHI „* A¤ AÅ"zUv¯%*öz]Ň׻wq]]Q°ÝëëÚu-û˪ËÚ( «ô*ˆôÐCKH“™óûƒ( ‘$Øy=ü‘ä;ß™ïgÎ9÷ùÎ÷œ‘$Ép+I’$n%I’$í$I’d¸•$I’áV’$I2ÜJ’$I†[I’$Ép+I’$í$I’d¸•$I’ ·’$I’áV’$I2ÜJ’$Ép+I’$n%I’¤U(‚À2H’$é`àÌ­$I’ ·’$I’áV’$I2ÜJ’$I†[I’$n%I’$í$I’d¸•$I’ ·’$I’áV’$I†[I’$Ép+I’$n%I’$í$I’ ·’$I’áV’$I2ÜJ’$I†[I’$Ép+I’$í$I’d¸•$I’ ·’$I’áV’$I†[I’$Ép+I’$n%I’$í$I’d¸•$I’áV’$I2ÜJ’$Il¸]9e,SW•|ÏÛð!¿+(   €AwÆÖj:Œ,ý+×Ppí ,‰Ô°Mé†PPp;Ÿ•|GÇ5ió#¶Žç÷œw7ÓJëÁ÷“Ô9ʆ1ø àFF®Œ–½<˜‚Êíl×Ï-ŒÛaåëÿEÁC½>êA’¤únŸ~àQî»ùF-ÿ>7JÑôÑ,ªü­bÞhæ?þ¨+ yý? ((¸Š'–»duŠgóÒ‹s Û¹œÜ"ˆ°aÙ& ‘ì&¹äæVþ´nFj8žýÏ¥;syᥙü›Ÿ$IúñÄïïcP6‹go½Ÿ`ÄÍœÑ:‘P­³mÓ?Z´ë÷È\ÆÌ+áè£Ókß×¾¤ÅïÿúWbÄ‘DkÐF?޽ÎQÖ…ñÅ©œðïG‘¢[X¹.mÿƒ÷ŸJÎ^§t=øå±i ûøU>ÔMþO’$Õ·pûí³yî÷÷Áð›9£MR­Bi´h£ñ8ÿ”"þ6j ŸžGIïÞ¤WvÝ8¿=þ<ÌZE´I7N;={¯™âêÚ[ÿŰ+bA\WnyêJ–Þv#¯¬ØÂ‡·^DáçÖqú®6ÏÝÎQ)”.aìKÏó÷I (ÜÑ,ž/ãÒíI‹ƒèºðÛÁϲ,åh®¿¼!£_ÇüõФËé\}à zd…(EÓ^çé—>`æòÍì%ѸýÑüòÊ+8-/µÚE–þ•ÿòë³ûsýÀí¼ûÖD–WäÐá„ó¹îÒãhÖ ´Ûë8–_nÎ'¯ŒƒKþÀ-=SªCMú‡€òÕŸòÊ“¯1~ÞJ¶&4¦m·S¸äª§sf¸êç¿à7öò-5¨ó¾û†[>‡g_øSo¤<œF³ŽÇsöeÒ·MòÞÛ[¤±£CÆIœÜ>¹òoYZ šVågÉ´?¹7fÔèœzQ<6H’T'ý0”mŸÃswþ…9µZ3eÃÔ1,ÂÐï¤>ä‘ÏG3¯¤2š–/âåÛïá…”$7£ óyã™Ñlؽ›š´Ù]8›^]D¯t€Ž8{0çäU1…¸c)¯Ýv½ÿ9…‘¦tèМ`õ|Æd/È£}BQ8‰嬛ý&|f&%D×¼ÇÿÞÿÿ˜¼¼˜ŒC;rD‹0Žã™Ï1¯¬åÚ8šG_˜Æö¬\ÒJ×0g¸íÉÏÙ¶{Š/ÅSŽdZa;‚ZŽaýÇ6Žç7ý‘wg¯%ù°žtÉ-gñg/3ìæg˜WTýüqY5ªsu}G7ŒåO#^dÂâu:Š®‡Ä³zÎ?yôÎ'˜VÅ‚èÆÙLY í{Ó:©ò9J×°ªbkÞâÎÿ8Ÿ‚s/aðOññŠíßœ%’OûX7u6\z+IR=·@êáÈ­ÍÇÌÑõL³qXßN4jq4½‘ÏóE [§¿Ê¨µ@“ ü!|ø1~߯ánԤͷ„’9ä¨|òÒRhÕ³]ï=]öÅë¼³H?‘[ùwßý Ü1€,`õ¨×˜³Gªl™÷>Éc<ÅÓ7õ"([ôë+¶¯_OÊaé5h=pÃ﹑^ €â%,+®MŠJç„[ã‘âñûΦ°eÜߘ¼)¶{Ò§Ù¹·óð3ÏqsäZŽá»úßÁšqo0m;d ¸™¡Csãmwre^Š>âµ™ÅU?ÿQjPçŠjûÞ±r* "@ã~\vÃn»ÿ¹åùt?<žõ[*ö>'Y5‡U@n‡f$}ý,EKØD ¿¤´é‘‘[Áºyïñð°gwÕ ©9rU³(ÜîA’¤º*þ‡è$¥ûÕŒøï“È­ÅRÅèú)ŒY О¾G6$”ʱùÙ¼=j#sFϧ¤WWÖÎ]FÈ9¶/íRB@:ûu'mì8v^h©A›ýQÁÆEË(R»÷§cå‰ÔÃûѳá‡|¸e 7TнòSo’ÛÓµÕÎ%ÉM[‘÷Ľ IDATÉÖF#Ä‚©/cHÖtÆÿk,Ýý‹¿ZÄê;ƒy­®]JéÊI2I­£OÓ7¹¦ùë"œ]Ù&¡ ç ìJ³”c(¬ÁºVÛ óV°éÃá\÷áï"«®gG^UÏTT7¨¬®¦oþ­í§0wÃûÜ{íû¤µêJÏ^ÇpÖ¯úÒ1ûÛ›oÀöÍ[ˆ)Y)ßœ¹…åsñµm § ÇvmBBd#‡üšW Çñæì‹é|L:¡¸d²S€h1›Êbê]ò$Iª—á6¥ûÕÜ3äTZ&Öjµ-ë&e9 yüWçñøî‘çóÑÌßÖ…†ÁÎøڽ븸ÝÖYÕ¶ùþvïëëç‰ížLCq»¦À÷x!e_<ËÛG±– Úõ>š>gvæó¿½ÉüÈ÷yT=¾„T’âös ûè?Ý9;Ütà\Õ5m÷B“˜ÓŒæWûüU ªí;©i;†>Ñž ï¾ËG&1oÅ,Æ­˜Å¸¿¿OÁ½Ãthâ>ëÎî‰'ï^§o …el)*%F:aB?ìEŒ’$ég±ßÓS9Öý*FÔ:ØѵL»3Ú†ÒѸqãÊŸ¬%—ÏaÌüäÑŠ0°îÓOX\@PÂü±ÓÙõAxšTÛfßá*ªÎüYíZ“l›9¦òödÛŽeêf ¡%‡5ªÉyÁVLø”µ@ÓsïdøM×pN϶Eö£à¥3;w+eË&0a ׊ŽM|çyK­Æðý§‘“—À¶m™Ñ­;Ý»w¡mòvŠ·‰× ~WTÓwÀÚŸáÏO¼Ã’V0ô‘yñÑÛ(h‚è>›Y´W°MÊÌ (ÝTÊÎØ\ο\MAA×>¿sqP¶”i Ë€Dr›¥ˆ•²± §“•쬭$IuÕ~ÏÜ^ÿä+ÄâïÇtWtídÆ®Èãšÿ¹‡¿Û™÷èuÜ1¶˜Ùc’pÃyœœ=‡÷×¾ÍﯛJ›ôÍ,]]ºG˜iسº6U5 µÀV¦¿ù_r>'¤ïÙ$¥ÃÙ lõ#WŒãžÓñ8VÌ[J1ÐüŒóè’‚j/ “Ü0ØÌš‘#¸ý‹¶-œÏêÊÀ‹Õ¦jÅ||ïõ,h“Ͷ¥…Ù. ?+ë«~DÆPT]ÿ hÐ G¼ý óÇÞÇm%GsH°‚™SSœÐ™ëþ| ß¹¾¢Ú:'Ъš¾Û¥3ë³ñ6‹9c:·‘EK •¶‡î½¶ºA‹®4g«æ­bû™ÍI%‘ÖýO¢ùo°êßqÙø¦4,[CQ9Ðæl.è\yÇŠòÕÌ_ 4ïJ‹$ ’$ÕUû=E ï_°X3q,+íG·¬Ý_BmOèN*P>k bGpùðßpú‘MIÙ¶ŠÕѶœ6èx²wɪm³wæÌ¦çYýh™§¾Åè;ön“Ø–ó†?Àµ:Ò"“ S?füôµ¤u=ëïû-'å„¿W«ë;­û¯vÃ@º· ±jÖ$&ÍXÌö&pÍP®éº÷­ÔÂYG’ß"_NbYåÉGb»ó¸ãÖAôn“IÜæ5lŠoÂaý®dÄgrHåÄwùòÉ,ÜMzu¡±·¹•$©Î Aàw2Àv݇ö îä Ú5¨[ýÿô¢¬ûç­ ~z ÇßñÜØ%¹)cî#ƒ:®1—?rŸ_â IRæâBdÂä?ˆÒ·1ñïSÙTƒS·`ótÞú´˜Ôãqb®ÁV’$ít ¥uáÂK:쑌.¬îê½ G¿ÆŒ —^Ôí›oÆ“$Iu4¸,A’$I gn%I’d¸•$I’ ·’$I’áV’$I2ÜJ’$©žØï¯ßÍ’–®×ÛJI$Ê„Õ[¸ðÃy¼xrú·Ìr’¤}pÍ­ô3˜UTÀ=ÛÔ«` fh¯ÖÌÜP²×ÿ‡N^Ê“}ãÔC²ë}°HKóo‡dóDßùcòRwI2ÜJž²ŠÉñõsü:ЗVD« þýZ8;ùmý[fVy2 I2ÜJ:Àƒ} ýÕTu2 I2ÜJ’$Ép+I’$n%I’$í$I’d¸•$I’áV’$I2ÜJ’$I†[I’$Ép+I’$í%ÞHuT,¿æ-æÖY˜´%ÂŽ„D:5ËᦣÛpqãøz}æúìÈq\¹nÏC]›& 9§[wç%“\“NÊ×sÂs_qÌ9ùÜߨyIª+f:mžGèñ tµ„wJbu¬faºtlÍÉlåé±ZŽë;Û~GŽšI’áVÒO!!«ò°hê4{!ÿóåf¾(‹G‹Ülú7J —Â-ççsoV]úôfÛ/Ñ0²…!¯ÏæþÒ,î=£´¤íª/9nÔ*»¢e<1fKr[qß‘i$ÇJùó;3øíæ†ÜyZ&ý"SËVðË·–01R·ÊJLḌ€Åk·³½6ãÚWÛhu>ˆj&Iuˤº™n9åÄžLÈ]É£ 70âÃUüh˜™Å…]Ú0¬cCrâ ."Å…ˆÁ–Õ+x¶4ƒ?žÕŽ+ÒC@]“ÊÿÆJ^ÜÜŒ¡i@,Fâx»×Îåeë–ó`Q^|(—¦ì|ÌQY0ùůø¿õm8ºy¸¥Û0â¡´<ƶ «ö=®F»VV]Û¦{Ö¹lýªƒ§f’d¸•ô“ˆk@ŸŽ‡Ò§ã¡±_¬ÚÀó³Wð§OfðÑÖL?6ƒ´=°¶¨”²´ú¤ìZoššM×ðj&Ç ˆ‹'¿ERåz݀ͷ²²b+—½ð WïÖW$q¥1 µ JQ¤$†(®f\A£]«®Á·ê|PÕL’ ·’~le–sõô€_ŸÔšžñŠK cËfÜß² gM˜Ì1 V3;?ƒck¸ð( D¾Nh¡0™ñ»Âo,ˆKlÂkç´£×·Ž‰Iuë”—2akˆCs“Hˆí{\¡(5®Aè[÷H8˜j&Iukn¥:(cÊ¢•üiåÎ £öØ©C@\\g®!r¥T²‰OKwÍ5nÛ´‰™ÑDòÓ«:„ÈÌL£Qy _ ´JK¤UZ"ÍBÅüñ³•LÜQ—ªeæÜe|DWµh@vÇUÛL5“¤ºÇ)©jÙŒÛÛ¬àÒN§¬G+ÎkšL#",(\Ãݳ"ß§]ãÄ…6mÞÆW¥ ä5kÅå)3øõû_‘rLÚWlåáOV²®i{.ËŠ£ª›´¦6iÁà¬Õ }ïKõiF— „‘Ó¾âñ  ×&¸·ÓŠl߯ÄÕaR (-+cÒ’BîZPʱÇô`PZˆ”äjÆ©] v¯sû:Z3I2ÜJúyÄ%rñ)½hŽHR¤Dª¤WO4)YH wðë Ìþ¿ÿ=æø“[ó&¦RsËÙò'¶Ø|ç—jŸ?íþël¼ÿÞ?cXÿzúé¹ÉñõÂó(ðž¥?Ÿ®ó<ýøÂÛn|~nê믯Ž^/Þ: YC­“乞»øê¨íç—Üjù´„gžv¾Þ©¼þ†ò¬â­ý·ùø ¬´­‚÷;¸`ï¿õ™Axþvž8þõ¡Òîù=kîG~̓|ZÞÛ§µ ôÉÈo¿™Ÿ­¿ß^ÿd|ß_-ÂO¶Ì/ñË—/\úÚø×Äï3òŸ_¸îú/Ëyý=gÕsö³º3ͯˆ²æÍ:ú &÷k™ŸÂßÄïåþ4~ªívâœe§üLלÇ+Ǹè³8nßÏé&SŒ~û§÷Ó‡û¬†â›ŸA~ŠúqǗРÿM¿ >‹Á¿ÏÅÝqÛoºÊÈËÑÔ;:s|åÛó»—ócΙ2‘“1÷c+æå¹LCžÓ¿´Â!î¼ü–®ß~^î·‹PŃ隹²ÀnÇÓÅHîGl…ëç@»Äç“Δõê1vb2„}t6»\v¶x_œÃŽufîCô¸”üb’>’ÞOÊ06ß)î¶õÉg¯Ç`ŽH!‡‚oZè8+ÆDü”X‰¡žBŠ)¥œJª&µÔsÈ1§œsɹ^B‰%•\J©¥•^C5Õ\K­µÕÞ| ``j¹•V[k½{Ó¨ÓW§}çÉð#Œ8ÒÈ£Œ:Úè“ð™q¦™g™u¶Ù—_a+¯²êj«og6H±ãN;ï²ën»bí„O:ù”SO;ýÝk/¯þòó^s/¯ùë)µ+ï^ã©)å­ '8IòóÑáñ"Ð^>³ÕÅèå9ùÌ6OR$Ï$“|c–“ÇpaÜΧãÞ}÷Ãsä7“êùÍÿ“çŒ\÷ßðœÁu¿úí ¯-Áݼ{²P6µìÛslM9Œ±{;{G~_}3'Å‘+ѱ1Wcþnäæcq§ÄPÎžÓæO-k»³ñßÌ>tòØÑ¶„YË>. JM |«äÒê±å‘¯ò¦¯kTV€ ôg×p|ßÍL!o¡¸RÂ<“iè 9¸ÆÓUÊÁ»Ñ•fÓœëôgÌÎT)¾±5W2ÓÉ`ø®fîtMß•ÿi,€îk_7) KÀ@‰vÐÀÓMP/[À X»%|eíâÖÀ+É RÍ<ˆÚvnà.R*ƒ‰€³O©“u€Ü)qî„:1És{ãbøV–†é…ˆ þ!jš&É``dF× xÐôË̤{nn¦\wïùïjiˆL€Z€1€ý (à•5¥4Î>^P¯ßÖÝ:Ô(MªºÓ2Arp‰,S»Æ˜¯[¨ ¡êô}¨à›qøÚ…C Â*Ýê³R{ðþ$Ôa«Ç°2µIQ`~b ÀÅ/]Ãz{‡ö]øFýkçzˆ•E¤½GñJ~ùN!¨3dZ˜©3nʧPNiÕºG%xóuëš¯Ì LžÕ´ºm#7æ3±›*6‘ü¶°"]¨ˆÍ\¨ œ ¼‰û ý‹ð<U‘ü±¿:³ÅY±âY˜YHR&•Qz:“2ÊÃÝ)ù‡šK:ŒÖæú¥sóUïßuî”{ÄŠVñÖ7 u{7ºŸ9@ö£weú§Þ¥JÃý|F`VŒa¾ä7 ø~þæïðýüÍß-àûùc£ÌVhWï“J¶2ÊʃHEjÓ. Bœ¿LÁ±"TŽ£ÚÒ.Ôç tœ™ƒ€kÊÔ:%ŒI—‹)¼ŠÖ®ªXO½z"°Ô´Èâ.¤GÑÛæ p-¾¯%ˆÿ ;urTÙ<­@ùðk„HäzØ¡¹¦- ² OsW?"¶áyEÙ $ðŒ#P¨ yƒÙö«u`§öN‹Lž'óDuCý0d6†ÅÕ©ÈfJ\ï½SÝë-hH$†áÓ²jÞ }Ë”`T=åЋ©)c¿>ËžâKP¨ó”0VdC§Ô"éIÍǃÁB˜_´µcµ¾!³‘Êj(WyR|ç˜C>éZY¨KqªBÞ¹ KV}¬Ú`i¸Äk†X9Pi½‡ÐƒW•gSY ¬tNª ,ìˆxî’·o«PÔ€$è 5Æ„°O ô ¸+’éØLïQ“³6Kñ°b#„)b`sÿrr[|¨õ-éß:ê¶ëAkj!²m[Âil™-Jb25+Þ™r‰2Ur v7Xw](câEÛ d'2t6 ¨…‘¢ H À¼µ“ƒ0ñ˜ÿà;_>0ÿNôÀ¼žPÚíºpA½&¶¼Ïý”)‚>‚éĄû®! xTâkí¾‹}™¼~$I#xM޹܍À3”~€‰„™;À /Pq‰º<Y=y¢‚§éa¶"y [òºŸ*¬ÛûUwУk÷[[=2¨K‰°F°Ðy´•ôM†BI£D¤£G.ñ$}¨áé$XØB€F@ÎðŽ©Ù eƒP‹£¸`H5h 6(ÄÀúi™×š%BYnÈ-hò ¶…Ú.Ò°Ö‘ÏvR À0Yl[ˆhûÝE ¥¼ÌÚüj"lYŽŽJ [¶_šï^üó§¤äƒ’KfE ¬\þa‘”⬠š…©,^xppÙþáÝ óV@ŸDî'§)ô…¤vPL"`Rö ¬ŒÈ7+†üY(Šv‘r Ø h¼eéVd™«ñFr07ŠZqo1 *Lq‰ôKäõ%1ëP!'ÄÊO’—YÂÙ&DD÷jÕö«ÏÐNÍJŽž¡õ“ØE_Ñ.Clf¾/å…Î!EüÜèþà #j%Ú(F”¤Z´ÐPg…2Þ††‚µ8v¿E•@9G; ¨-9Öp—­•Ø¡*·4—¦ÞÜUó•D°-JçI·ú1év2?¯Š?´½-éDmŸ¦ß44{ý7šøÍTÿ¶SóÝTÿ¶Só'ëÿ“NÍßõ»NÍ¿ñÔ{§ðC¥›vÂ| 1ÁÍ9ˆT¸TGƒ(äàzmØâ`6$Ò®œzÇ÷Ð+ÜÎ4é|È˳ڭ=¨-=N懢„Áþîvn.z 8Ù´B ËO”£fCw(áäZÒÌ™ÈÄá€T*?üg}L”Þ‚f÷‚A%Ø yÄ4ñF>2žÒEPN7 £éÚÚÛÞe 5PƒR|‹h¹†àóâ“à$ñ\!@ñjFïÚTU€ùÃ-šˆ­è(vXAþa8øKŸ3• M+Ú_ßņѨ"¨uT7K =Î2Zno9‚ñÍóÏMþìùô$u©lX›?T`ô£8\‹ïáÿ©YyjõÔÐlM„µ«Ý!Ì>X%>A®6Ñ.¡ø2žyЕS½‚LâšBá Ìrp ˆÐXB „càa3^ ÂËǦ¸þ¡¤Y@V ~?#dCû¶ÎLGa=G•±!³ªI}¼gní¬~w2NFWO¬YÏœ=ÑÆ“¢^¡of¢2Z:1”B;I0@B‘у̵nS¤H€™,œÃMG‰&úÅ1‘ë=R×\Y?.¯³ÏPØlÕ‰ÙDņN[q“º‚V/ððTõú ”l÷„>Q똎%¡ ™o]NŒ½j'aÓÖ-¤ }³‘=]åñ¸[O3wHFDð„õ<òÓBçç^«ƒ·×æßvðöÚüÛÞ¾oþmoß7ÿaøEã8÷ÂUódN: ±}Z¤N„æ ½³¸EJ½6ûö†ˆºUz%øP›µ¹ZŒD ÀKtÀ²F(ux¯­w(¥ˆE pŠ,6»ùæXGÛ.¨¥É”ã`Š›ø,¶#!"·aψ!×¼N&u:TöÃ!¢´7?ðÅCšè¯4åÈ»ö3xíhøÛ]šÄëæÉú2 ®PÝLnÐ>hϲå Ó(\Ô-ÍÍŒœÈ¦µç2P¸rÓ¶1œıQt´ÎR€w*È¥‡éA±0A2j#2ùý6Oó>Qrµ$²-¦}F „ÅÖ4óžEZ§£u踶%TñFê^gGF¼æh ƒ$T"ÅHSx': ð”[rÿ‹A7qÔ¯MÉÂW(¢sÂà ýË.¦yö ·Zb ¯6ï‰êå­6ðXÔOL…2…5’žÍÐýš“ª~ÐÌùÔŠc—LÑÞ«>Zþ»ñ‘ÎÆÚ¤c”WÀ07¾˜¨¦­˜Ø[¿KÎ9N&ééØ¢È‚WéÚ™aÈ”¼6金CÌl´öñ 4ƒC‚êQ~ù‡œC 2HsˆÀÞ8É—xáåš*ç\wÚF÷.nýøbîa¿µý‡EÒÐ|ìõßtj¾hùujÎï[þq§æOÖÿ'šß¬ÿž—ëXmVÄpy¡P÷Úý›nXÌξ´Œ¨±e§ä?×SJº¥‚Іè¡ARw"BŽŽfŽï–¬…¶M ÕFQŸ¥²“‡»Ÿ™º…ø« Z†, (#»‚öë‘QÚxÒNÍÝ[ ÔÜ °‘n•r(d#k·`ŠBöD…ž`Ë܉’‹®zze-;71iC æìzx5I¦UuêûÝ½Úø9!<Χ¨3t²+öéjÕž¶×­Í¹êˆ †`‚N›²6çz¾§hQé;=†c‚•Òc´yP»k%Ï[¼5u¨MýOD7í×ÍⓎ\äþj]x˜ö4Â^¾½U@À#÷x^Ü_KvŰ® (çP9Ý´w f£»3!Y«Š°Píp¥\œÓ‘j¾pr©[ó£_œìËK¤­ç¯öä9 ”f¯Y¸K?œè•yÆö^ièõ º þôæË¡ ~Ò‘ÏÇWeõö^–ß¼–“´ùøæm"·¤·ÙMTv#?êO¯Þ&òÝ?Nï59óavï/¥ÞÏÚ]+”Bm9ejtZ#Ð[LîÑXÉ ]÷°…¥9 ΓátÖý–™ÄŽãûðBíGhËm×ÙuºIa§~V 3&ÅÑ*øƒ€„S/Ëì^Dsä ­m-uXòíu±Gݤi*)AY‹vÉ` !»Ýt퉡w<Èf!‹F‚m#ïè{v9_Áú¸ÒÔ¶Æ\c@§u‹IÁŽæ—ïTX6 ³¥ŠsžAÉT¿Þ_*ˆH­î_¼5I(?|ÍO9Þ"&šrHqÏ áû0/å1ôZ½@Rfu¥úPH34+¨Â¼)¦¨ŠbT’cµ¥£‡¼‘iãÕýÀ*œ:¼4¬.x`ßÁ,¡*!↔«„ÈPûê)ÄBq©èêFkå&oXÅ÷‰åí åópæÓxÔY‹ò×Äó´}Z>Íî) $ìê-0íî1‡ ñ°t8È0åËF®ß·?çüe?g;Œ…±­Äù0à&„óû†¿[2¨@Afô7vød7û ?¬`~×ô×uÞ; _ZÃüÚìÓ:Ëst>šãWkÐʼ7{Vø¬ïYÝg3è\ç ,šÞ3k‘~ðªùáÖ8ro;Q)ț԰PE "¸²ãE.¯$"õÞd;)ðlÙØÞþ ö¿û¬9ßù¦ûS-©ÀŠ Û&¢H©hC›Ð[p˜j‹»œXºƒY8ÑWàŽS+Ê|A#ËÔ-PÃéÊáY!Óuh4JF<ÙJ”“|ÚLÖQ´)€ÅºÖ©Lôq*ùùñ’ Û‚›Ç@Š×B- @:>­Jx`²¤¤&² Úoíh#%Jƒ|¸Û¿ê`¨ª" ê9. Rº@® qÏLrŽ}Æõ²¬J’PtH7,Âþ&m‘–ª×òcÒoÓÊÖq#:ËFWV­Šz— í]8ÐÔ;„¨q¥Sö©b:Ê‹0š²6Änß›=Õ„OOù§¸¡ÿ䑲Qôªm¢áâ5æÄO9 ¾BÉg)OmeEN7Ñ*u ¢Î€RÂpÒ´ì sîCïã$dÕ6kl0…Çc:×´E² D˜X»MÛGÈ…«›de®€LDøÄºZŸ©6“µ¡Ï”g. 8â°Â$¶¨S×^ÑGé:݃FÆ A¼‚ pB ê#½”dyxÄ,±”J'ÌÏCŽ!¾½Z ·”F‰–œ™:¡¾À–YÁ„÷–„³-îŠ.N@‰£ÔQÑ(®·°±]×H{ׇ¯íwy2üöùç&öÀüòä»}ÿ×çcž·àz>ÍÏî'†h-k_ÓiW’ÞŽIUWýpGÕü{Úºͬ×QçÖ½ä«Í~nòj‘t€zv!‚êËÚ‚×Ñ€ ½F0¼HrèîH”º×–Š=ÛÂ:JWmÅòÓëTŠ#ëÔŠ@ÜRþ9Jû‹CróÅi9Ì+¿mëbcø ľþt©ïaXÀöZ ]‹8 2P\Êg”ÅÌkRhD0²I ÿ¨|±£¡`îäuWòžta©ŒZ âÔäóÜã=½‡‰¨ÕìÝL©1ÉåŒö²î0ónRwX˜ÓÝ1]¦`¦$ õ¡×{úÐó~hý©ËúÙÝŽ\7uêÿòÊTñ6t¤õR¢È¬]Ú¡5{ÿ¿¡”`|ä,ÀœWvØÅf.`Á¤²é3bز=´ˆ•/I½£R¨›;!9ž-±sÒõ?¡ :?õ›¨Kd¡ ÖPÄ>ty5ët× pÏÁ<‹Š^›Jþãa½â¨è*i²]×4’—0Œºó9‘¯ýßsðûi>< ÷ÕÌÿEœÑ•ê‡àM…iCCPICC profilexœ}‘=HÃ@Å_S¥R+V)’¡:YqÔ*¡B¨Zu0¹ôChÒ´¸8 ®?«.κ:¸ ‚àˆ“£“¢‹”ø¿¤Ð"ƃã~¼»÷¸{õÓ¬Ž1@Ó+f*3Ù1ðŠnDÄúef³’”„çøº‡¯w1žå}îÏÑ£æ,øDâf˜âuâ©ÍŠÁyŸ8ÌŠ²J|NãNþ+¹³3s»ÐÐrajuömÀžq}XÙÄŠé’íÍ6žº¥‰½ßÍR’˧1ñäe90þáÇ]ÛÂìÆãÿêÌ-ۣ鴭˜òHû©ûé¿âh߬ô(ÙÙvìõ#0Ó¦}[–wqbvô>®M,¢ÔÅA­1c¨;nßnåƒ\ãïë·—ÚW0Ï ¦]Û’»½!5-ƒ_v“gq¦mh O]ĸfq œ˜èRe ‘Úto¿²=3;“¶›î ’Øk?týyç†ÖŒövp“m3C6ç‘§°{iq”²!%—œŠÿ¯9’Kv`7f7 ¤É¦|¶ÙÏóea&/¯ÊTë-ªU^\Èú”\r«|Vm‡Õ“Ûzp`ÃzFl( €\–%à|soáÎôuù«ßþ/L.>¼~]KîvÏåÅ_vð||ɉ³‚&':µjÎÜ^XrU­~Kâ CǯH­èØšhØŒ5WA÷IĹ ºG—ëÝ­ 勞cd|ùù2_kÏ–gnæ»)sÏÍQÜxÛþ3uû Ž5A)Gþø„IãnãÆ¨(†ßó8S碸,‘ÿ}?_&”qðÓq n…Oü%¯Ôf Î&ÀÙŸ÷tfBhÓ¢z6È/ÀììÉØ¾8xoŒ±=‰Ük<Ì`ræ¶ë/§hH •vo§Ý0F4¤µ›? FucjÐÑ]~ÆrÌn<2¼‰=+¦˜\¸7ªÆèÖ\ër´T¯z—‘;®#£=.Òó‡Î•ÛÂL³¦MXzk/ãúP2²#Ÿ·òÀÃbã©á]xÅ×LÛ^])¹ÖoÀÙÝçw&yt÷ve]¿P:»T*÷¤}È >Ý)B½ãMeáŠ~=(B˜ébo»³ô£*xÔeú°n仜ô›[ól˜s¥3/gصô ÜÃ`:y:AY>¯Íßʨ}%ÇÏœµ}Ní/ƒƒǰ³‡?/ ‰$mL÷ta~·ê›kPïEÓÖfZ¶nÊý^%¼?w+ÏTºF9¶ÅÒwMnõóJ=MK©m¹f{̦¤Ÿˆ¯þ ›±æê¦|;ôXÐ=êðî=<•X~ÁÎZý-a×p8°Ûí§üU:5W¼›ÏŸ|‘Ù9­1a “BØ™8e>)v(;ü/O]†¹×=Lœ<‰ñýÜX÷ÑÌI bèo1"̉ð‘ïðõÓ±ÕÚ! Næ£V«3-6àõ'Ò2Øwü“ÒQ}Ò45 [ (4Ûxàšö¼æ›Ë³¿o"ò—}üîÆœëÒÕ©ŒE;s°„Ô¡ë±ðåäÎ-]ص+…Ý•GŠÏVŽ¥„E‹©æC˜°º3ذx2Ø×˜iRß ÷¬4–µ´iO´m忪>]üëóó•upìÝÀŸb¸k§z·äQïb¦|Í„,[W­Ãý— r¬Þ¼>¬ Oز˜0w=&p nV¥‘¹ª}–ËêÝds¥­¢vg/îi`aõö ŽÔÚsÑU´_Uw¶~d=yQ'`¾Ú”kË’5g #¶3ðò†´·T³üjá÷ñ²|>ÙWJD§Nì¾¶)5ñ¡…›ޤd²8£ {MÛ§r‰ÉbN a“³okÍS*cÞHŸåéø¶iÉÌÖnX«©÷¢ik‹ÿjfƒ”ƒ¼”XŽã ¦;vÄñM‰CZzâ¥t!R»ânI6Ž9)ðú…ÕeX¥ƒõЮt_šFÂ<3ó7Lc0Èš÷$·Í«ê9ÂsX’Õ„‘ÏßÁA  ¼RØùä\–¹’k²‘aªÇõWõ¢­¿š„⾋§“Ù‚ &³³¹ö~Ï7‡¶"}ÌÉå&âúÕÙǧ6`1S¶k;W¯?zªÔ-(‚GüóÿÕ~f@.3 :ßÁØÀƒÜŸÌK·×qâ×Ãå¸ú1Ì–ÏÛûŠ(­tÉ–[@ݳ–3öPmˆt'ÁݶeY|™ïMïº.XSô s&áP&‡jé)ÃVÈmUÕ3vŸ:Pió žQÈ«;RY˜o@J!G2¼(/6pÀp”àR;m¹üû§ý|–w´ÝbŠÝè54ŒÛ|’x.ÿô}†5™_KÚ22ÌʌݥxÖ a9›Ññ¥ÔÖ3®Öú­È8¥o:¶á7'ãD߬A?Z›q"<‡7®Ç{*Cæ`n @.;MÄõ±V»jaÚeÁò ôL c|Óžê_—Wœì,¾ÞzI±9¤9jÐ>é§÷³­&ǰ ¿°úÜá’ÉÈÅù¡ €‘67Þóµè{Özï³\$mmq¥“'ŽË#ͨúK™¯¯'-]-Ä-ÀŸuËÙ“ÏÖ]› Rۯ麶ü'àä\vh×z,K#ñ þ-svÝ»Žã‰ëêQyðÇȉæ—ìdJ¤Ô?’æ¾'Nrº„µ#ܺˆ½©e¸6ÈÁÏ3mÌuëJ§ö‰ŒŒ$ÌÝö‹dïWº@ à · ½ö“/‚r”³.±øøÜ??/œ¼øøÖ^¼gœ!v3›0ÙÌI™|’læÍ¦žxÎ!"":éñü˜gTÚÓ¦jË):œÆJ{K®ó·²ÚÇßÌx>Mqeh¸'; ñ.gÑEçý"ºó%kÿn®ßRpÒœI³[Ó‡ž¶lAj"Ÿå´å“Û»rϾ4~=œÁOÒÙYbœrÞÃDnùi¬ª4¢]™IŒ=„.žfÈ?}ŸQ–ÏŒCvæ5÷%hOZúᔸ‹%µø¦#U] V^RxÊkÕ÷#Óñ°k&¼Ž öÌCD—œøÒ›œ”É>Gê÷C­|÷.eUl«bã0™­´¨ÀmêñPïö\鵉«sñ¬®}ª8ÆE5;†ëױᜓÀÆâ#œ±1Û¹i~Öz ã/–¶>úeÓ|†³2`PfñáõëÑÕ ÊwWš¹î‡=Ä(_ˆÔ®>''œO?’=]ø+fDþ aׄ‹_}"šDà\ù³#óði·‹:ùe&ÌØ10y´áî7>¦ïæ5¬ÝÃÚ/^àë÷1ô…縹ñÅòMçä Ôª~/·“]~âÈl2a/JæúãØtÊ­JKË0 X´3÷îA´s-ãêÆV6lL?íÔ@µå”çó}š‰×Â=éâãÊáC¹lIË¥ •?‘u´uäðffíýVQT˜Ïú”<*çI‹»{•\9J²¸ÿ»Õ|V?¡ üÚ­-/öÉã¥Ù1LL­Y}vÀjªzŸM»2ÈL;ÃëÁüÙÔæËŒÎ~Ú9ô£J·Bqœ>ÒfÇ;ë~H.¯U£tnõù¸ƒ‰7—bC9Ž2b’x"!•ŸzF²¦Ym¢s9T]û˜«è/FiÍŽa³ £ÊïöÕí{ùEÒÖåŬͅ«Ã|5ç±¯Š‘ŸüôÃ\3×…5ׄQšÁ¨Ÿ÷2§Pcº"µ‰“-€÷nhÅ=UÌ3òkЌՠûü¤“§[žï°]ûšÅ‚Ox]¬ÛÙ}bËKb8X@D …¬Í³øâ—øtÄ-cÿë½ËÝõ°pá!.å»Ïdgç“éæI[K9I…¥$–’föfBÏúôªøÆ”œD´³#å–Ë´C%§| 5(§Œ5û hÂ]åü‘TBvf:1foîmé‹kZ*.‰†6R¿>¯¶ó éP"O-ÝF§ë¸?Ó“Q-ÝO™ïm’QH±‡/Ým'¾†ºûúÒÎRBtÞ™ÏÁä§%ó{¹t¬O?GïײðögGÝjÒ+¢,‡’‹±øœ¸˜AÁ~46Ÿë~øûÙf:G„ñP˜õ´7P‡8”×ðx­JMŽá„´"Þ¾´¯Ôž.kMÌÕuñÏ=[½æ‹§­E|›þá¼ÒØåŒ#3éñûè7/Ž1?ÇòqŽnÇ RÛ‚î»§ÝC{ò^å9¼ š±z@Í.à½bkå­ÇÜš_Ã>OóÙ_à2¢'!¥»ù퓹ä4»‹>¡ÎXÓö³ðëßH1ßÍàV~”ZÇÊ#fê\áƒ`6ÙÉOŠ'%Û›—Kæ Ý‚ÔD¦e…ðüÀ&d®Jb«Ùƒ›:6fy§b¾£0‹OR›2½Gù‰;XXøçÊI>’ΡËÒßžÁÔFY¿æºðVذ<—ŒKdð¤ÄìÉè.a4rìejb)6ÿnö18°«”RÀa˜ðõq§±­Œ}IñL/lÏ›S¸&•½N^Üß;Œ ä½ÌÈrœùh*Ëcú!ƒ%ͼHÛǺÒH´žg‡ij [ ¾PÄø™¤zðlw/¬Fµû¡6)ÍNâ…ƒõø|PÜ6Åó}rXiÌÓm­¬X•HL9”T×>gè/ÕÃi‡ã™ioÍGýÂ1mÌ䈫?“»ùaމcwrîYêu\Dmm°wÇn^lÞ‘§ú·ã3ëîß™OvÅ{ÉÉ•ËCØr8ŸÃq‡ù@¹B¤–1Ó¢eFUºë¡;è±<$k™×¶ã©@SEàmÈc!iÜ›paƒjeØ5¹µ`ä‹pÿð >ñWrœˆèr7“ïH°ÅíîåÑ›>à³Ùo1éK;Ï0Úy”{® Æb)¡UËøuæžÈ˜È‡·;ûôˆ‹‰=ŸÉ³·PØ;‚§†P×\ƶ‡¸zE{Ž h¥,Ü™‡#ăÛ³Hÿ“唿e2/¿!Í‹2ˆ)=ZîŠøbðw0+±ô¢™]݇iæá½ [ß”·;´di7eÅÌ‹ÙÁøíE”9,,Ù—ÍCZí±•z¿gòð¬md_ވ׮ #È^Âú¸½ô\™Èþ³(ÙÙ¸'“Üf>ÌŒÍ;eîë%Þ/šÂ³,LíÎÇ×…SšÉ;Ëv‘vy8ÀÙ÷CmÛnG _.XOzë†3›Ïnâ•}…GçàžCûœÜ-«?†ÅÜóc,/÷iÈ'74Ä»´ˆE;b¹fS%vÎ^ïEÔÖFYÏÎÙŠup+ïÓ‰[»°2µ˜‹3mB<©g.åߣ“X® ÒDjÛ6måzÌnéz<è&:€’ž™sô¢µ'Ê™³l ÷%\¸ãØÄ»KÏ©lc\ŸÄ.2M[¦~*çí0kܶ#;ÛfÑíëýl,W‹ˆœÛ‘•NM¸¯‰]|±9ÊØŸšÅ·;˜q¤ä¼ÿ€‡ˆœÏã×™¾ÝÙµ?‹#§^àâÅ!eÌ9XÄ…¼n[¿ &rY\ÜéQ×wô nÛN¶+芜;Gv`äîj ‘‹îø-eÉÞª'I9Jrùîà…_…]‘ ÈêU‡÷¯ ÅÇ[ 4%""òSع€ŠÓâhùAœBDDäobVˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆ(슈ˆˆˆ(슈ˆˆˆÔ>&Ã0Œš.Mdd¤ZMDDDD. Ù…]…]…]…]…]…]QØQØQØQØQØQØ…]…]…]…]…]…]Qع9ý¥µ•'òãÃòÍ€pîœö*WYΡ€Ö=s¯Å´à‘é/ÐÍã"kq#‹å“F35ÖqôÿÁQü÷ÍáÔ·ª3Šˆˆˆ\ÜaW0²·²x—ãÄÉ«X›EýzµyWî_Ä/kR(3»Ñ°ïuôV×…ÝóÌŒ-¸u2ŠÀ-ÛE7 à {ëb*g]Hbåºd†Ö «Å;àpÿBfÎŽ\èrÙ`…]QØ=ÿÜh=îuÞ½X[ÛÈfÛâ]8NyøÈÊõ¤ÞF]‹:¤ˆˆˆÈ%v JS6ñëÌßX»s?‡Ròqò #¢ýn¾å*š{W¤@#‹¥îåÝ}€SžúìIÚ[+ÍöêǤç;±íó/ø}ÓŠ¬Þ„µº‚›ï¾‰È`gL•ëKŽfÖ×sX¹eiÖ0Zu½†›{$ðÆ3sH"Æ}È”¾~G_ã(ààêŸù~ÎJvƧ’WfÁÍ7˜F®dhÔ@ÚZ+•}–­ÌÙvb C£›î4“o÷ðëS¯åºËéír.ë‰Ü] ù~ölÝÇ‘<‚FвË`nº¦AÎkY~mæÈ`áFóAܱu*aÝ ·v+S߸žtQØ=»²„¹L~|:±¥'³g&°cñ'L\³…ñ¯?Î5¹­`Ó'.æPþ±‚sHØ<›×žÌæé©ãië^ S—ðÆcï±±èØ ã‰™?›«(´˜}ß>Åf%TzÌNQV";Ï`Gô>žxë!:{Ww r¶˜ÂаOozY7ñíž}@<Ë7¤1äš`*oå¹­§ƒìõïóÄ+KÉ8þX9©q1¤ÆÅ°fëH^™8„0ë9¶™ÍŒÍ?øTòË*–qõ$0Àå\©íþþY¯ö4–½7£"èš »üÆýûAF^Ùàh˜*Üȧ_l¥À¨IYÉ*kHÏënfİ>4r®x™ã™¼"ÿäõ+,Ä÷²Ë¸¬Ü™°AcÞÕ3Ð>ðKc–’‡Anz¼Ï:ÒiälcñΊ¨Y·-XLí考ËÙœ1 Ò8Çõ,Üõ;kó,´5ža]|0깿íçì™·š”þ×S÷ÛL—¢‰ˆˆˆÂîŸT–²“”Š×ëz¾ÇÆš-! zú-ÚçÙÁäF s soN‡Ðc‰Ø„-¤^Ä’ 8Ê@IR ñðõût"ðXB5¹ÓâªÎx®XJ^å îÇ}O÷Giq;YùÛbââö»~ãIËAζ%˺uºu¦ŽÓÑ Ù±{_~Ÿıts&W Ä|ÎëYFú®CÆv¶ð0÷|Z1­Â°S˜[±XÒ6‹¯§®Ë¹µ™ˆˆˆˆÂîŸd/Î¥¸âßn>n•æU˜pñ #Üï¤Ìxvç“FWMfóiŽÙ ³)¬ø·Í×ý¤y@<àäk”°üSÞúx1‹+~iä°}Iì‰)‰‹ùæó£M_žvb±ýËbÈì%æs]OE9E'ª+Ì%§ÊÆ. ·Ä—sk3…Ý?ÉììŽ3PdV;à¯Ï +P ä§åáÀóx}åy)§Ö–þ‰WßYÌ€Àö ¹¦]Ú4',ÿœ¸˜ÜeÝ,Ž=1[6eíoÌ©jÁ}KØšÕ—¾þæs\O3Îndž¾¸öÕ©ÜÞè,?ÉV®Ž/"""ÿ ûjÎAͪøwÂêÍ'.Òr¤³ì¥QÜvÛmÜqÿûÄŸ§ú›ž¨oÉ âÝ‘ͦ9k9eÆ.™Û¢]Üè>îaFîJ‹0òví©QЃœ‹ˆµ×dѽ,ÙšqÎëéD@“àŠ™Á®¸œ÷ò5ÊÈ:°“ØØXb÷¡ð<ÌKÐÔ¹Xüí#»– Îômð93û?å…ÿ+dh—:m›Ã›2)ÜÚv¤žËù«¯w½/ù:82“ç^ÊçÚHrcæñËÆ’S–6a±O-bóÌïø-« .©ëøéÛø&Ã\v,>6…Á›þ“§1ºùÉS²ëÆM\H{–n#»Ïåøžãzz^6€¶Î;Ø\j°gÆ;|ïvýKHŽ]ÂW_¯!pnÿÓž¬‹íO´›É|lrC i‡Ó(nU‹ISDDDDa÷ìé3˜«ÆgÕ¾eŸ’W}Ë´U•ž÷¹œûï鈧‰ó3¤èT—£¯aÙÄ_8ämÿ¯¶W<çæEE•6ãÛ¶Í-³ËE±¿òiìÑg\‚ë`MN¡ (Î)ÆUN¿0r·Ÿ˜ÂàÙ^ NOí.á=iç±åùàØ½”í9½éås.ë &ŸHî½»#¾·‘¢íüðæv~¨¼@`îÝ Ÿ?•NÍØ‚Cqg?Àsëbý¨„ˆˆˆÔ~ÿ}v1áÒpÏý÷¢z´¤~€&ÀÕ¯>mŒáå7Çéc>¯õÙšßÊäFÒ·u}|­`ö¡E¿±¼üdOËâýyô©[èZÿèœY[p3zÜü4SŸýM*V+}ÁLbòªJâ¹;–[1GÖ½]oºV±˜[Czµv;úoûN–îÈÅ8Çõ'‚ú=ÊŸAŸ6 r7ÜÑeèý¼òê8ºüùdêÖâVîÒ?«¹x˜ èñxitt4‘‘‘—lcïx›Ñ“VP´|ä3žëæY+OÓ_,ë)"""òwûÇý^€#s)“ƽËÎrÀ¯MC'ù{˜ûÕ £]}·¿5@^,ë)"""¢°[‹˜};sÓÀPžû52—ñÚèe¸ùxãÈÎáØe_u¯¾‡u´ž""""¹æ4GVÿÂìßV²ãp*ÙŬ‡·æŠë‡1 ]0.&­§ˆˆˆˆÂ®ˆˆˆˆH-eVˆˆˆˆˆÂ®ˆˆˆˆÈEæ/½º)++K-.""""çÌ××·ö‡Ý?»’"""""†¦1ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆœ‰Ó_YYYI»óí8Ζ¾\hâmÅEûFDDDD.š°[–ňÏc˜Yfg+ÓÉÏvR‹í€3c‡uaZ‹öNå¥ìÉ.Åls£±Í‚ZIDDD¤6„]ÃNZ€g‡´a¤Ç)a×^Èë?Çðùv2Ë«/Î^œË‡ëðö¾lv—¸»»sEÓp^éDK+P’Fïéûé6,’W.ÙF+7ïâæµ$`¢{Î,mkÃù´eKùìÇÕÜ•zò®näÍ– x¡…'>¦ó°N—Z‹ˆˆˆÂîÿ®gf­å™ÿ¡{a:£ØÎ'?îÔœ×|-d¦§óÖúXºf9Ø>0˜ú—Ôn28¸3–þk³(póáážM˜QEЭÄÁ‚^¸………¬;˜À¤e›XSØ‘?:y`Sÿ…Ý¿šµ{³Iñ'¸ÊÁÂr­ÞÍ'F¿ÞÔ”«mC”õ¸6ÈD‹9û™”Ègþ—Ð^rñÕ–Š ‹+®iÃK5IµºÚèTÇ /¼¸¢a ƒ¼6Ó~ý^¾mÞŽ»Z†é½•´üí¿äQþ/#®¸ê/»&ñk×ÃB›–á\IŸ$–á¨f»ŠR÷>c'_ìÚÇU߬Â齕Dü¼ïsª¾ÄðÌmlgÕ²Õ8ÿ˜D¼qbÝ—.^…ˬ$ ˆ"""rɆÝS˜¬ÜзW&Äråšl2N BE9YÄØÝXÇùô‹³Ìn ï܈GBOy®,‡GÜÊ+…¾L¹º+û‡ÑðÈ^zþ–Hܱܿ(äÝåI¸¶lÁÚ›Û1% )‹°¦ìèsÿ÷ËfËòâÙAˆ¾&‚AÅñ\;;޵eA›X\èìuì?ÅLùe+ÿÞ–È£?¯¥ùoG8à8‡æu±ÑÓ âRŠ)®ÁvÙ R¸ku‘Z²ìêÆ *Mä_³ö²¨ä”‚ÏÚÆÚ5óÇ7-™E…;´4—ÚéÞÊŸº`‘LØ «7ÏjB˽Û°>—¼JÏ•—–ƒa.5OH9Iñ|VèÅ›sg˜Ý„ñIÿP’ø"»"|9 Nëf¼ãÞ„Ÿ IDATáIS_îíDPi!É(J?ž¼;°1#üèÌk›Ñ+?™÷Òì¶-Êòyó÷X¶4 &üxâÏæ­{y#±Œú­q«ç9¤E“'(,qPPƒír`apŸ–<ßÄ—žõCxkPSz–¤ðzbÆ9´±{@0C\ò˜žptD9'%‰ß>Œ«ç¬›=‹ˆˆÈS»æìš-Ôót0ë·ÕÌ:öØÆ8æ´jÇˆŠ«©,NN¸QLz™œòJJJÉ2,Ê %£"@zTšöàîçG[Këòìà˜­D»`=ž Í8W,ž™KBy.÷|¹‚±ÇŠ0 ŠF¡ bpÒ(+àÿ~ßÌà vHqbB×zÄîMæ×Œ2¬6O®oÛˆ7Úúâ{.•v2ÊÁæb&·ºíòÌ6®«c=H-6o{|œVBiè9´±Ÿw„[¸+‹Ô¦þlÚ‘Iyhsúºé ‘JØÅʵ{ž1´çóÔ¬xVZKW/šÊ¼Ô2þí}ʨ £7gE3ɳ5)ý«¯Í‚AÙ±ÊLf<,U§F‡a`q fö°Ft8¥Åœ­&è–ðîüÍ<”P1r\œÉ”½žlÚƒÙÖÿ¡Ü’BVæB£:.8;ªÙ®LN'm  àp@M¦Úžhc šûãñk2˲-|›®òÁOÇ ˆˆˆ\@µÿ ²á  ÒL‹»÷…™X´î0KO¹h+?-‰²Ltmâg¥pVÇ߆k~« Oij‚¬,¶Ø]‰ô¬¾ ||<ð+Ê#Æn%ÄæLˆÍ™@GSVfE鸺ª¼÷æmæþÕn8ìÊÜkÐÑú¿lgËŽC,›»Cñ«Év9 ù=½üx°µæð[4t©ô+w5kcÀ`9åðÆÆÃ,6û3&Ø Mב ɩ֯¡á ×^iʂɅá—GðíÌ=\ùm!ÿn_‡Ë}(ÌÊàÿ¢ç[Ÿo¹`©tÑ–WH=FÚ6óïùû±u ¢Iy.SÿH 5¸ wøš¡š±p eœoÏÌÛƒ_Ú8òù~ã~>¤÷¹žç¸V^Èûó71þ¤ [—_nˆ`°Û¹ÕUV\ÀÚ$ î±î@"Ïï. CdG†{˜°¹U³]ùå|»d'­zÕ£s3×íe¹s¿×;yD»Ú6°z22ÜLßݹ¶hDg€"""r©„]“…+p®w/0äžr ˜³w]fýË•·Ö'ðö½¼•[Ž»Ín-š³92˜vV ÒÝLVoþ;´5>Ëãxì—R-.tnÔ„•=Ci\“±m‹¯o‡í}¼0/‰#+­„3·wMÏëØxó—oaì!'ìÎê…ûYïÂìš0Ävî¡Úž¼Ÿ?ß½¹·O3&·¨øA‰j¶«09ù0µ«3Wocb4 áë¡àògÚØBǦ~xíÎæÆ–žxèø‘ A èñyøèèh"##ÿteE……ì+rœ˜ëYžÇsè=´ªúýZ{>O}¿óUyÁÿp;QÂW¿®ãÖøŠaiÏf mÊ îÏÉþ¢Ô½DÌ.䃑mr^Fa öÇl¤EŒ/kniLG'€"""raý¥qÃÍf£uåߨµC[—žüz9Ož1Ž{ò¦Ó?df§É…áý[óëÞ/bú5Mþ¶ {¾ÙK Xu$“77æÓ¨u Z)芈ˆÈ¥vOcñ`Êͽ˜Pfp¦ßE°X,x9ýs.c²¸úòjTO^½Ä¶«,7…1 qÔkÄgmÜ+]Ü&"""ráü¥ÓDDDDDþJúñ*QØQØQØQØQØQØ…]…]…]…]…]…]QØQØQØQØQØQØ…]…]…]…]…]…]‘‹)ìÙ˘ETTQQ#xmKÑñçÊâf0æøscùò`Yõ®gRTQQO³&_@m"""" »µF v¤p4Ò:È‹%]ûñÜ”'òãQDEÝÍ{JÔ"""rÉrúËj²§³æóYp°GUÏ›œðëp3£®‰ÀÍtö¢R· Ïh€Ÿ©„„˜Äs_[GžúòK˜±º¨¨MDDDDa÷åÈ#nó¶9ó"n¶þÜqMng\—fu²Ø°™„â+ðsJcçbðkN`æ.ÒN$k26þÈ'_-`ËálJM®4éʵwÝÉ wÈ]Åsw½Íns[&Lšvùsy|Üg²ueüHoÏ\Æ®4j3˜{îN_ËikRvðKxt6i¾—sWÿbÍÛ@|y -zÿ‹±·÷$ÄÙ„=õX¹Ýù÷Ø@~ÿh.cßãéÎ6ŒÂ,ýj?¯ÛMb¶WH®¾ƒÛ¯j‚‡¹fåƒAIÒj¾ùh&+bȵаÝUÜv÷u´ö±T]ÿ½iù;9ÃÂ'Gøè žk¹é¤6éh;{Ùà gû/|öù\ÖÇeRbñ ¤e/†Þq }¸aÒ±%"""µÀ_7ÁÚá“ኀªŸvn1‚çîï‚ÏYS’áíB¡(ŽØ´2Œ‚ClOÏ&Íñ«´%öäy¼þÊ÷DÎëQKš‡ZHß³ŒO_œNlÑYŠ/\Ë»Óþ ÓÅ%¤ný‰7?ÝB¾q–×d-çÓïc(ñ­ƒGa2±óÞf»È­üšÂ>þïÏìÊ-<:ª]z™cÚüí$–Ó¢E]Œ¤],ùx¾ÞGI Ëwd®à¿½É¯[SpkÚ‰6uJˆ[ó5Ï=ñ)±…FÕõ[|éC‚a¢~»º8_Æ 8- [Ó–tþ"o¿ú<“_zÎÎ@ÞåÙÏR~×OùˆwߚʻwÆ(Ú·“´ò³­“'½'Lã7Þæ½—‡ä¯þ‰ Y•'k”rãÓLýt:Otp£hçürð¼œ'ßù//¼ðï<Ó_ é·™l+0jP~)ÉËf±±|û?Á¤GÇñàÄg¹+‹˜¹%¯êú;úS¿c$ž6êuêAÛ€SøË«-»4a»Ë€€+¸ãþG™øÊëL¸&’öÍœHË)ב%"""µ‚Ó_]¡Å¯+c^| ÓÄ×X’z.A·"‡´!ܲ˜}[‘¾|Bhn#öø&Ü[ßÁ£¾›X±j)Ó^ø˜¸ýûH*=„Ï:æèÖ„¶õ\1®uêáÃzRìe8Îö"[[ú^æuô5á=é<‹’“ØZÆå~ËXÛ0lH[BlGƒdâ¾CîíûÑÒóèv»7»‚NÞ Y˜ÏžôrÚV[~>Þ±Id-œÌØ…•WÊΑ=i”FTU?Pm-%©š²Øš†–õìNŸÏ”1óñ¨×–N»qÃè>´ôsÒ‘%"""ÿ̰{4ðvaôK“h´<›–zRßµæ3†e?Ï'jÊd†7ÒUn"""ò÷ûÛn=fñiÍÀëzSÐ=ÏýhÞÌ’ñûn;¦zí¨ëR¹ŒRâW®&¾ñY&?6Šal”]  )ÜÂÒ¹ZÉÊdÀJ‹ ç3~¿ðmŽ+P°e ;ò À `ÏR6dÖ0šú;Õ |#ŽÎ)(ð¡y»ö´o߆†nÅäåæQæd©ÁEbF•£ÖÎÕ”m²ü3Þûb Gܤw¾à‹w'ÕÐö¬Ù’&2ˆˆˆHmpžov&¤m8–…[ɱCp븛Ò*Çhܼm@6É?¼ÈÓ;)س‹¤ŠpçpœïõÉcù”ñìnàGÁÁDòïˇÑÉ×iU¿ÂÖb(Cê­á‡øe¼t-뛉=HP÷ê›hãi‚ŒêÊwÆ­ßšÏù”]K_fb~WêñlÙGžµ5cÿ¯gœ³arÆÝ —M?Ídùmÿ¢·gå¬Ô«¦ìÆžyĬYAÞš¶-iAs&û€; ycѱ%"""µÀEø£&láí¨ €[b=%¿‡ ¹Ÿ[;ÕÁÅÈ >Ù Õ]2´.@"k·¤c?Ÿ«ãÓ4Ä‘œHž[.òSF·Çãlê. ¹iò«Œéß’ºæ$bc ¸ýF½ÌK·DàZÃò-Áƒxòå±\Ù܇ô ËY±)¶ƒÿòãô `w‰ö ˆˆ\ja÷/ Ô¬zw2ï¯ËÆQãÉÁßùâÛ…lÏÌåÀªŸøâ»h2”yåB¿ x4¥ïkéêŒé^¾št€ìh–ø‹Ó®=‰ÙÝÌ£¿¥¢CNDDaW.—ú}ØÆLRV> ™ÁôÔ?‹ÚE.ð›€O[ny;¸ü}+Qz˜?ÖdâÕãzxæ½üÜ‘óÁéb\i{î^þøu!ãRÉ·xÚ¼ƒu&ÔÕ”‘¾u!¿.á`V Z]~=W··°öýwX’üþ/ì¾™'n21óÍ„ ëIñÚ•lK§Ü»]¯JßL@iÊFæýºœmñ¹”áŒOƒöô»®?­} x_¼¹€Ðë:“½b±I¥x6îÎuC"HZ0‡»S)r %òÚá hî‰0Š“Ø0o.«v&]êF`“N\yušy[Àlµë£h±e5Šºî¥N*çGyúF¾ÿàsnM$ß9˜6ngìðHJ7òÂ=P÷ùw¸»î6^ý9Mº‚_g±|ûÊü[3d̃ oçƒ(K^ÅçÓ¾bÙÎL\»pýð&üñæ*¿û}| øð">{ÿVîÉ ÄäJP‹¾Ü2þ6zÖ±žqÝJ-cM¦'¯êCOf³*zF6§y¥ü}özM…q,øìcf¯ÝCZ±;apë½7Ñ)À 7žy»ZðÓÃòÍàÓq _ÿfLê„M]FDäÒÔ©ukd8p8Nþ³;*M:(gÁ'_±ª !ýn¹‡»‡vÅ÷Ðo|úõz²ìPž²’ogÅ`j=˜Ûîºë:¸°sîLVgúÐkÌx® ´Pgàf Œ:¶,}²Ž˜ŒŽtËO!ÇDNmhìe‚Ð<ëÄcv3c2™1aÂd2c>69Ñî‘×Ò÷2,€W¯ËX1=|;€…ÀÖ6’/3ŠWÖ6­Ï¦Ø†™°¾ƒèÜÀžt _B\Q?†tk„§ ¼»6béwØ¡,}=«SBüÀU´ó4¡Ô 4qä­ù¬Oº‚°pgÌ®î8¸¹«wÊùŠºäoû‰eí¹ïþ(ºù˜€pîËIâÃø#žBíÞÇrK÷ºXÿ¡Ý™õLYe9›bUiy`=MТflåßßW¼ÖáDØ•#y¨Ï ÚûY€Æø¥,`ñ¼4 ìàSÕ;NÉA–®ËÆÖ¾n&\›ö¦¹e=ë—à®æÍq¡úzKÎç—ƒÜûÎíôñ343±oìtæÇ §iƒ³m˜Ü,GßÌfÌf“ºŒˆˆÂî…ãÖò:†w¤òTU£`³¿Y8(HN§Ì»9õ=N J;Fì´‰ÄìrœëEÒÞïs~þï›lº¬M#šÒ¼y ÝÌTyå‰ÅFh˜ç‰ú,ÎXŽ}Ö9Ñ®»;i »Ù¼ý ñÙ·+»Ë“^ïïsìÂNV'l6_\*Ê0Y¬˜M¥€AqZ¹e Ìyû%æ«Ã(§Ìn`ä•Ãј+rž•“¾'‘ò:WÓÈÓtüËcØ'x pã)Ç„'Mšù?&LVœÌe¤íNÂQ·7ÜO”ت î3“Žþ×¥>W\ëCž ,Y¹Ÿ½»·³yýAʃ»qíJ,%:Û¶}"pðlF¯&&bÖ/%îÎæ´p­®^ñ{È(ÝË{ãoåÃJÇVi¹#«£ÁÙ¶KDDvÿÊò ¢nX(•g÷¹©œõÒ“  Ln<öQÚí‹eçžýì\ô‹ ¡×È‘ô«[Õk-8;U=’cdñ_³®(„æ-šÑ¸}Z‡ýÆ›«ÛŠ3”ç00¹·cø=ýq:yy‹«›z£\0†Ã³¹fó–LV\­UõaÃnTÑÛM˜*7òwðÕ /ñ[^cºtíDÛ¾·Ó³ÉǼ°äL•·4šŠX3ùv¢Nz.š¥î¤E Sõõ: Ì^Wðø”[hä|òRNî˜Ê϶]""¢°[k˜q¯ã5çñùêøýè.MÛOr¹7í½Íäí[Áš¤`ºõˆ¤_óHúÙ³ˆþøÿX¶)…^uÏmj@Ñe¬ÉlÂÍÝH„+@9)‰¥ò¶e&\ê`+ˆ'¥ÜFSߣãKŽÜXæÏ?LÃhnU‡” s˜û5 ´p äeì¤,|•W×wä±ûýkXŽ•€ˆ L+c8XØPNú®ýä;Ü8:]â{~IêÈ„÷¦  ŒÃ{‹Ï|ÌDZ4:kë{˜tG ÜŽ…×ÜL{þkÖ/£¸Eójê5ãŽGÞn•yÒ±ÎÑ·5{ÆZfÌØI«;ï ÒE½@DDa÷"áZ¿í<>cÞÌ…X¯l…_Y<Ñ¿­¥ Þ Ú8ã”s„‹×‘eL—ž”¥ìd[ºßvX“ÉNQF*™ùîøW³õwœŠØ³çPò®gñ™.G8œV„ŸÏ¹­»sÝ.tÜÄ’ïçâ6 uÉìøc¹‚H›FœäB1áÝî:º[§ðþÔaX|s7òÍç›1®¿%­Æ_6};]GçÏ_ãÝ©?1ú†6¸§¬àë¹`ª‡ N6oœ ÷ðDz ¸F¸‘µc>_ÍJÆá¶] 7p?iŠRqÜRÖç¹Óõ†Þ4oPé²0ÛëÚÌäÍõK‰+nI‹³Ö .30t1ß¾þ#ûn?Äê§³ÐÎ@O3”VßFf“ü¤xR²½ ñqAG¤ˆÈ¥áâ›±æ΀»o¡»m ¾üˆO~XCfø`Ü"®æ¦>¡¤¯üé}·‹öbëv7uòÃbñ a«†¾æ£_UûùçÒp7tóáàÂoøtú¬L aȽ×ÓʶŸ%ÄŸû}@êÐ{ä\x„åß}Ì'ß-á€W/nÞÝOW.dÜõìÀØ)ÿ¦Wé2¦=ý8OM]ŽùªGøÏ õ9— &ïHî›<ŽN9óxkâÓL_Jÿ¢hàꌛՄ[«‘<0$í_¼ÌÄIoóS\#FMOÏ­|óã.ŠNšPľÅëÉóëÍàf¶S+¢ÝÕqËÛÀÒ¸âjëÅΰçŸç–zûùáÕ'yêÕ¯Ùæ7Œ'ŸLÝš|¥·øÒªÇe8Lá‰wR¬.#"ré|†Qã_ŽŽ&22R­&òeÏÚɆ½šulŠÀ `ó[Üÿ¡7O¾}ΗV½""rñÓµÈ"RcFÑ^~|ãEÞýe3‡2rHÛ·Œé­ÅÚ¹'õœ/½zEDäâ§‘]9å¤GËûŸ/ &¹“{M{ÝÌØÛzêbºë…]‘ZJÓDDDDDaWDDDDDaWDDDDDaWDDDDDaWDDDDDaWDDDD¤2'5ÈÅÃápPZZJii)v»] """Õ²Ùl¸¸¸(ìŠHíg6›quuÅÕÕU!""R“ÏN5ˆˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆ(슈ˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆÈ¥ví©,ÿàÞ[O‰ñg 0(MÝȬ©Ïóظ;¸1êFnõ0/~¶„}yö£Kä®à©¨(¢nz…f3ÊÃø¨(¢F}ÆþÒK¸g®gRTQQO³&ÿ‚wÒ—<ÇÍQòCBÙÉ{=s)oŒâ¡ÙG°WÞ©k™ñÜxnŠ"ê_wòȳ‰Íså$üøQ7Obñÿ³wßÑQTÇ¿³›ÞHBz º”PB鈊¾Š, ‚ïÏ^QP@_»€¢XQP©JQzoBo¡C*$!$¤m²»¿?B -PQžÏ99²»sËÜÙyæîÝÉq«Žp…Ý¿Hþa/XÏ¢Ï_æÝß”;ðÄÿΨÿŽbÒ²­<–ÝÑLnú6ÍÇ‹/|˶SvíÍ+U˜À´!½éÝ{ããòÿòâíY[ùqâ6hx7B‹ïuâ—Îa÷…»Ör)o½Ç¬m)˜ÃjSÓ?‡Ãk~`ÄKIµ:Úþn¢ØÁ÷?n&KÃBDDDa÷¯•Ë–¯_)_àµgÉgß°-éÈ3c~dÊäÉLþì9:øÇ~gÌÔýX´?¯·Æ¼òÃüðÃkD»ÿ™Y9¶b2+²Üiq{c¼ ÀnáDünVÿü.oN:tñuÓ¾¹,HBúðÖ;#xë¹Ù ¶ÍbÕ1+†w#z¶ô {åO,KÑ쮈ˆÈÌáï)ötàåmžï†³QJJ]Ǽ=vÀ—nO=H‹ gý£é÷H'â'ÅaË:F¶íÌ+ Iß8‘7žÏ¶d;Aï`ð“wRÇÓìä'­fò—SX±3žLG?ª6ìÄýn§ž·¹¨¼ŒÌþæ{þˆ=Àñ<ük´¤×Cýéé~‰º-çƒg>a]¶/·<÷ƒ›ù`>ï%•g'yî0†~½«ksžû M,KñäX¶:ÓhÈ'¼ØÆ—‚«¨oá¡òìLŽûÞÆ;c" òãÆ3øåœ ¹—ßmÎÚç‡29à$ ^îG³ßñfXÞ|øcö˜ðÒ·¯ÑØ ì9Yòãwüºn v¼‚#irÛôïTXÍáùÁßpØ­9O».ŽÓãö’T¨[G0"hf°rW"[ãó¸=Øêšáµls¥s¿*8êX¹!ý_PËeË×ï1+¡°ÔgZ’w’P¡1­Âœ‹=bàÙèQÞzï=F>ÕŸ3­±í`üÇóHƒ<’7NæƒI{Èlé+øà¹™½5×M¨˜Ï5“xó…¯Ù™c‡¼8&¾<Œ‰«ösÂ3‚Z•8¾g_¾ñ ËSÏŸ%´çîeʨOY—íL½‡_籋‚niå™ ê8˜~ä®eâìÝl›1‰m…àXÿaiU®a}/ÉìKÓ~ýhê àH­;sW¤ó%vÂ!¦¼úãæm'¡ ˆÚµC°'íc•± IDATfñ„—xiÒ>Î[ü³–±ã–“îìƒùÛ:ƒ¿ÞÌ¥VšXÓ·²>«7#Üåô/]kóàë¯ðÊ+Ïs_Ý cj!YÇŠ»z» `Ã/'ÀÊÉ´¬€KX4ÕáØ†­¤jrWDDDa÷ïàÕ¥O.ÛrO-QpõÁÍ\–-{ÓþµÏùlÌ>\ ÈØGºµä¥ÓÙ˜>_`سƒúê<i@ÚB¦lÎâÔŽéÌ?÷fôG£yëýOy¥•;ämdVLg'mi¬7’©‡íTêù Ïv­„ÓEõ(½<»c(]Ÿ¸—*@Òô·5ï8ÔáÁÇÚâo¾úú–šó WÂGé àFå&­hàwñ>ÉÝ5YGÏ[xyÌŒñ>c^ïˆ4w Û²‹'Ùzú’±}ÊØç›â äîÛÅñK\×X·‘ÖÆål÷&¢~QQ ¨áwq¯Z-Erpv8=€M8º…bkþéB\B¨$n!!OºˆˆÈÊáï*Ø-j o?Û™Ð2|¾lrqÇ °ä$ÏZ†Z•iéx„V‹ݜ´`³[HÞ™À‰o1hÁyŠÄ¸$RÜâ±ÞõìàAá_1ùI;˜ áôÓ3Ö2k#€3þUƒp½äR I%–wœ‚–^8…uçÉ»—óì”x 1Qã¾ÇihrJy}ê{ôZì­BÒ÷&pjz9¸×lG“ Xpò(q©…D^…€kuTvÁ\+ãÍzR¬Ø.šÙµ“—q’ÀÍÇ­ÌW^f§¢P˜Wˆ 0c£0¿è.Ž.Ž&W|Ýk'rm஻쉈ˆ(ìþEÜOÝJ¥-Ö=Í)¨.A¬çHÆ&Ö'P½ŠãÙ°”½eœ·flgæ÷‹8œÂ ÷*”Ýðô ;Û›Z £ˆŠªOU×<²2³(pp¡bÕ €“[cˆÏì9ìüîEôIÞYVlƒGžñ2÷„‹øjö Ê]^ÑšŒüƒÓó[ ¸‡&å÷„‚kS_“CÑ:â¬xRrì`Ï'ië2/Ù?öóBsñ€éŽ ½y1;²ìEqKØ8V¢FÅ+¹n2pñöÂÎ×ÒG¾5"ð2·Ç’öÌ]¬>d*Ñ ÒéŶÒs‹Æ«fuEDDnTÝÌ®s-}1™ÇLŽ˜Ë;åfàÖÁýYõüwì<0ƒágàìáJÁ©Ü¢€äEÿ>upeu)r¤rûîÔúíkv/Í«§šf?Êæ Èr¬Ç OZP¿^/ÚùnfAÊL^zz5ݱëÐIpm̽u½1ùcNž¸»V¢Kÿ[˜ýÖ2â§Ͳv¯ÓÁß\®ò Ë!~3D ìÞ×xôÔû¼úÛ~~·€¦ov»êú:¹Ö¦º;$goáÃGòS@!I)ÙdN'Ü2‰1…e÷ÿ‡6žç?Å­öt¯¼†©G—2ò©Ô 3qtç!²€Û§¹åN¡ a#‰;ÉëBYîræy‚—1=i:/>±šŠùÉÏ稞´8ÓÿùIìNBê¢]DDäFõ—Nyæ+ºgbc¥î¼òÁsÜÓú&Âý\È?•‡“O(uÛ?Ì›?Oû€2}s sPW^=ˆµ¼IݰŒ±)x4èÆ£ŸçV3†ÛM õ*}šUÁ;s/»[¨Ý‰AÃ‡ÒÆïÂ2 ÜëÝÃjP¸ƒ&m¹è”\ž£³ÇðËÀ³-t®FÍž÷ÓĬ{¾ç³%Çà*ëk¸×ãÿëMƒg°çïÑ„k×y•ô¥Éí¨ä éf²èè%îXì\•{Þz—Ç;Ö!Ä”ÄÎñT›öŽfdßH®4Oš}n": ö®ãpYòS5î~õº× À1#™ã6_ª¶¸W‡ÜŒïé$†8 4­ŸYºˆˆÈʰÛíe^¾Ctt´zM®!+Ç~™Á_%ÓúõÏZßõl3—c3l©ŽM÷ ¥]‘•3ÊßÌŒë>´ñÌfí¯8q þ¼¯=#–™«³p¿¹·*芈ˆ(ìŠü úô½¿l™Ê¢„‚«ÜZ! ‹¦°É^—þýâ©[2ˆˆˆÜØ9CËDDDDäßJ3»""""¢°+""""¢°+""""¢°+""""òçrø+ ‹‰‰Q‹ˆˆˆÈ¹’%8\ï¹RZÆ """" »""""" »""""" »""""" »""""" »""""" »""""¢°+""""¢°+""""¢°+""""¢°+""""rc„]ë±9<Ó»7½{¿À¢t[é/ÈYϰ޽éÝû5Öœº>Ú`K]À‹½{Ó»woúŒXC¦ýÆh‡~`PïÞô~ü{èÀ»ÞÇ«ˆˆˆÂ®”'®“»ˆ}§ÿW¸s;²þ†´[˜À´!½éÝ{ããòµ[þŽþÖ>ùK9üuy/•5ßO`þ¡\.97k8àÛè^퉫q•e¹5æ•~À† Gçë!릱qá¾sÿ/ØÁâ§hÞÜCcP®·ñ*""¢°{lYØ´m‰—Š«[Gè‰kYòcÆfó=Äàxž þ5ZÒë¡þtŠt‡ÌU¼ùðÇì15à¥o_£á©9ò˸Ë܇gú"u ½=‘•NQ±nc„9´íwƾ1žYö’·—ïsq×.Ó>¸fãµ”ú‹ˆˆ(ì^cæŠ-x|ä³´ó¿8è¾õr/ª•qýBöŽéÌ?÷fôG£yëýOy¥•;ämdVL—ÿ [½F}ÉØ>eìóMqr÷íâx!äîžÁœxÀ¯;Ãß}†ý·ï .öZ;yÇãV£Mû¼ÍÇïç­‘CiêdäpÖeB¶õ8ë j´­KÅÐæ4ó ¶³x×)씥ìB’—Ngcøt|aÏfè«oðp¤i ™²9«ô6Z] kM¤'€•›´¢ß…ûåiãåúÒNfìOÌMºóÖgóþ§ãx¥]…‡¡wãþ<ó⋼øÂSôÍ%À§Oô­m×4f@ÒÜ)l˶—¡^¥÷á…ñÏ¿=€_;xêY^}ç=^êMTMŽŸÌ+y{[ ©|ax–a\«ñZZý õî'""7‡¿º@³osû9ŒWÿÇâcåºPHúþx,€w½F;xÐpèWL~Ò&LÙ{.ýR×ê4¨ì‚¸VÆ›õ¤X °Ù I‹;H.àÕ 9á.àLå–-˜6c¸×{€g}bY±j ãFLàÀþ}$YŠBâåæÉ¬Ç׳ø@uÚÞTÃіѾü67m‹vsªi'K-ÛBÒÎ$N,x‹A Î+ĸãX"Kk#”þ¹u9ÚxÙr HÙq˜À¿e["Ü À“:í¢ðX²”S¥ìÛ”Å1zn2˜"¸÷•4®`#qßar÷¨öÔ9½îýf;šTXÀ‚“G‰K-$ʵ´z•Þ‡-½p*~TªæõìIǨÇçáQ¹Mš¶àŽÇÚRÇ×ÂÆoKÙ^´ËÕ,W5^K«¿ƒÞýDDDa÷Ï ¼Íxlä0ª-Ë Nç› s)ÏêA;öÓS·öbéË09àh:óŒËe9Ó¹©lÃ8o›¶Bëů½à?¹»¾áÙ׿’‚ÍšÓªW=¶ÿ<ƒÝ—½•–•c1K(Z‰ÇgÝÃgŵl_Äî솖¡l›µ¨ÑA݇2 G±ÇL8ûãÈîRÚX¶¾-sKèKûésÞ¯M¦R²¶œÝ“ùÙ&òð ÅÐèUŃ âx±ŸYïl/ã>.µ/§A]yýÓÊ,_°˜kbØyt Knaé¯óè=ê%"JÝÞ‰«;P®j¼–Vÿ·èSM߆‘¿¿íÖcfïzt¹½u9ƒnQ>÷©„prk ñù€=‡ß½Èã>É;ËJZÆPÂ6Ã1Y±ËˆË¶ƒ=‡½KWœ% GW®&ºû ÞzîQîjâFvI÷Œµ¦³¤(êžñóó;ýム@þ6ïÎûԲð,Zû‘íM­†QDEÕ§ªkY™Y8˜Ëùe#ûy \M/âD@Í àØêåȵƒý»—Ä’URW_Χ#%¨|ÇË né‹ù̾‰ÇÈÞ¼øô-ÛìdÇ-aCàX‰ÊT¯Òúð|…$/û†Ï&.&±J_†™Èı¯Ò»ªÖƒ¬Ùœ…O™·w©þ¾Ü>¸Vãµ´ú§¡… ""r#ø~–iàQ¯í|7³ e&/=½ƒšîÇØuè$¸6æÞºÞWà <ê÷äfÏ­,;±€7ï Š×I%eç¸Vp2Hžú6¯íò';n7I§ƒ‹Ív©¬Ã’£‘<ú¿‘tô;S³ÿŒmMžäÑfÞ×dŠÛÑ¿9ý©K½øo-$,ÿ…ßãÜ©âﬠ+"""rc†Ý\öÏŸI¬½}ëA Ó±°zMj†˜ûý<–­E¯Àë¸7+Z<ŽÛÉÙ?›_âò iÿ·„8jĉˆˆˆÜa7û kvæv[[ª{Ÿÿ4p oM—¶®dÚ )>ijÏŒåËOVSûñA´ö3`94~²Òû¿wS͹€Ô­ ˜½d ‡Näcöæ¦[zq[”™µŸaq*ðûGŒØs//ô¯‰s^þ˜Ãª]ñdX\ñ¯Þ„·µ¥f3äÅ1ñÃ…Téӆ̅¿³Ãó†ö‰Ä¹„&Ù²v2{êFrªvçÁ–œ‰ºÖ̽,Ÿ½€ŽqÊ\ÐZ­èÖµ)¡.ÆéræSé®›É[»’­R)¬Pæ=îäÖÈ¢%ö’ê)r,û¾bÈ»9Ü{¯Ëg.c[’€Úmé;è~Z]|±fÏ9Àüo&0smÇóܩԨ3÷=rMü;yGòÍçSY—F¾áB@í[éûÄýÜèXH\>‘ñ?-eç±\ÌÞÕhu÷<Ò)£´m_¬0u#¿Œÿž[8åDýÎýÔ'¿Óž–”U|ùí/,Û}«_=º?6”{£Š>Õ)LßÄ´ñY°õ'üˆˆîÅÀ‡;é^ô^Tòã×¶""rm™ßxã7Êúä„„BCCÿ”Ф¬cáÆ|êwlI· ˜\ ¨Ae'ŒÂãl^³¯FÑTsL!vÝQü›4%üôk¬»X»ÝNuñL[η7âÝí£©æœÀꅛᦛiÓºŽ»bÉnóOw«Œ“-ußÁ¢œÚtìÑ•Ö ‚)Ü»„ßcòˆl‰—=­«7²ÿ@"TiJó¨HB}JX–`=ÁÆ_&²*«&wöï@¸ëégZŽ2oüw¬3n¢óí]¹¹¦iþ`Aœ;õë‡âjKcëªuì9”KhëîÜvk}*¤¬añº,"šÖ¢¥ÔSyW®‚5}sf-dånZö@ßöÕ)Ø4…‰³Ó¨Õ¡ ijdÖü:t¥¾G sÞ|³šqÿcsWÛ bâëßshؾí™üêh–ûÞÆÀGî£gËp,±Søis0Û†c>:•×GÌǽË@íו®{ùõ‡ÅТuÝKÙ¶ƒqAèÞÁWÏ`‰W7|?]jÛØ0é{V»µ¢]Õ,VÌXÀš-YÔë;˜·Gáuø¦.Ì¥q—FøìáÛçÞ`®ÑЇ?ÌíM+’4ÿk&n¬@ë["ñ°”ü¸süµk‡ˆˆ\{×ÍÔ‚-?“|\ðr¾v7ˆ°žJá¤@«&õ‰ð2 ÔÏÀ£˜\M† Ã0a2  y=«SBé6¤ = ”ƒÄæ±>©•ÂÌ ûзm@)W@Êê)Ì9àB£ûzP×ë\›òެfSV%:?Ô™(oP‰@·þj[ÒÓÖ °‚{tOn­[3àÕº.+¾Må” Ž—RÏp}G®Žg=þ_ú4óÂjT†ƒOLà·í÷S¯î¹çYÍcÖ¡HÓŸ¶¾& ’ˆJû}˼}¨á@¥òtÛ®Dùš|Sæ³èãd[ÁùÄaÒŒÊôêÔšMP=Ÿð=˜=M¥o»Žóy5>µmK³£xò©Þ´ð6€pž<™ÄGɱv»ë îmŒ™Hzܳ‰¹ÃŽp¢röüÆâÕypø´ 0Õ©â•®—ç°,±ÝSK~¼Ç5k‡ˆˆü«Ã®áà‚䨀‹§' sO‘gwƽ!N!ÑDù~ϯ|HlÝÚÔˆ¬A­Zµñw5õüÓ{Þñx2 âùíã‘Ì9S†½«{V!fWB«x—ÚiùG—ðË¢D*¶@çH·b³¿V²“S)¨P‹0sØÉ?’ ‡X2 Á 0»ZÉó\/˜0e¬' »riÙëßfÐ;›Èp®É£§SÀ%> 0W¦iuϳãÖäS›FAVíO§ðlص‘}4Ž4Ë^>{â>¾(6-…6ì',ØÃh×Ó›ø¸ ,^¹Ÿ½{¶³iý! ƒZàÑ…vAÃ÷øã,lÑœ&Q‰ŽŽ¦’»‰›KÙ6Å?U)$5.ÂÀÛ¨æyæ·ŽTêþÃr6‚Ù“ˆê¾g)ÃÑG£è˜Ì8œ€¥b4µ|Îõ…s¥†„;.dï±\2Ž–ôx.5¯U;ʱDDäŸv}©Èö%æÒÂ÷‚ÛsYSYûõ–xßËsw–2+eµ`=}J3\«Ñmг4Ü·“]qûÙµp"‹fÓúÁirÁëlv ÷†ôØžàózÅÀìâZŽ \KNÛöœ}Ìûe5é!Ô¶2eš·1 ìØÎ¬H6Ì8]æãÍRë)rnõŸà½±ùE£ÌpÄ«âåB” ³éü±e2ŠÆÞ…cÑäÕŽçGõ¥šÓùÏwp÷€S;øaÄHæfEЬyÜÚŸ›«O`ÄâÓÏò¨Ï€÷'pë¦5¬Ý¸…µG0éójÜ9bKÙ¶q‰ã“éòwU1K=v/<&MØÏ¿&¾äãökÚŽ²ï#)«ëæJ^Õ‰®fp`Ñ æœRµ$Ųñ¸‰JuC.v+VûÙžŒ#ÇÈ·Í>>øøøàeÛÃŒof°+ÛÆ©m¿0+©1Ï¿7œ¡ý{Ò¶qžyy|+'6Mg⬃x7îJßA/òî—cv ŽâPâ¶í]³ûV ÀHÞÆÁ³YIY0ŠgFÎ'ÙZR¯˜ñÁ1m;{2Î=1?~ ‡ üˆôw)åqó5lG9ö‘ˆˆ”Ùõóu`Ë›ºweûøY|?.•­êîïJAê^Ö-YÏ ÿ›é]ÇÃzþ‰Á×ñ±+·R£m8FÒzæ®ÏS0`ÂÁ–ÈÆEë8aêF³*ž¤ìb[ª Ÿ†˜ð’›vŒôSîT iFSÿXÿ2×δ%³cù|6ÒŽh7 JMºdlšÁ¯»òhÙ„ŠY É:ÿºÂÙ7˜À°4ôø†?¦,À±ÃMø%fîZ²+w¥ŸC©å8•VO‘«–ͪ±Ÿ6àvêº%³fò—ìtmÅ+õ=Ï›‰tŽèF—ÐEüôÞ—x<ØžpëaVOû–ö>tñ4ãàV§œ8–/Ý€K¤+'vÌãÇéÉØ\÷±;>—&¶ý,˜4—ÓºÝäKþáu¬L4ØÎ·mºè"°BÃÛié8ŠÏ?w5Â's#“¿ß„½G?*š—ØZ×Z=hçýß¼?ç~7lÙÃܯæp²æÃ´ uÄÕ¿¤Çp<~­Ú!""†ëæn &×êÔ Å)3ž};cY³‰ý)øÖïÌîlAˆ³ÅîÆáíM¥Š®_Ê’›9”]‘f·†“¾/êÍêà_…#‰­kV²z],;æج½ZVÆÕlÆ!7m«—“Ntý0ªÕ­ŠSÂ&V-_ÎÚíñ„¶âŽ;Zݬ0­kâpk،ꗼåAI«ç³é˜•ì£;ؼi›Îû‰%Á·1ɨ‚íàV.[ÁºÝÇqŒlÏ=wFètérlYû‰Ù”EdË(ü=+©ž"WÁš¾‰ß—;Ñ÷ÁÊl˜ü=?ÿ¾‰“·òÈ ˆ®è€a)v7†Š¾ÔjyÎûóëÔiÌYG~d/† éA¤› GÿšTÎÛÊÓg2géVR\£yèɽSœ™ IDATÖÆþÎâ¤tëÕÚ¦ƒ,Ÿ5ƒßæ.dõžl»>Γ=kâáè]â¶/ºVv¦QóJœ\7›©¿Ì`^lAçé»ëâeKbùoñl×F¾EÇ”õÄf~_œA£ÛÛêæOýX·ÏgÆÔé̉ǩá½<;¤+aΆcÉ;Ö%âµCDD®=Ãn·ÛËú䘘¢££Õk"ÿR–}_ñäë‰<6á5»©?DDäŸOS """"¢°+""""òO£e """"ò¯¥™]QØQØQØQØQØ)ÎA] òÏa³Ù°X,X,¬V«:DDDJåææ†³³³Â®ˆ\ÿL&...¸¸¸¨3DDDÊrîTˆˆˆˆˆÂ®ˆˆˆˆˆÂ®ˆˆˆˆÈõá/]³›hQ‡‹â¤cDDD®¯sÑ¿fvEDDDDaWDDDDDaWDDDDDaWDDDDäÏ¥?*!ò:a©:ADDÊ-a`[…]ùg±n«N‘Rã–ÞÐí×2QØQØQØQØQØQØ…]…]…]‘2ìZHžû._|±Š“¶’ŸiK]ÆÏ#ßà·9IÍl9‡Ø2ãs~øß|ñÎÿ˜:e)G3 K}]aÒ<&|ƒ/>žMŠEƒMþNÙÄ<aÔeø¶¼ G*G¿í€‹Ê e'±«³DDDa÷oæZ‰šM[QÑá/Hºéìœú=눺k wü§=ÁY+ø}Ò2Ž—` Hß¾ƒSÙ»ˆû«Ó®--_¼Å´ Ø4Îwš¾<ž;y{È.v­f?±„ן_„Ë]cx³u u–ˆˆ(ìþÍ•v aÇNÔ túó3cÆ.vÇ»Pý¶Û¨[­þUÑ¢W{|ÓcØšTB€-8ƾ]™¸ÖiO„[6‡¶'S ñ&#ÃçVÞw®KŸç¥?RO_å±õçøöä-¼û^´°IDDþe®çÊÙ2ãØ8w>»¥’çèK¥FhÓ¦qÌýtú ¡•ïAæŽOÀí7c‰YÉÞC©X½ªQ¯Û4®æ °žØÎÚ¹‹Ø{$‡€Ú4hʾ_wPwÐj¸ÛÈš?–±/>“Bœð ¢ém‰ôvÀf±àRƒˆçsaÛÕ7s!ù–ËÏ™ÛÂSnTnÔ€HV±ÏÒÚ‡T,Ÿ—V/{^»ÎaËžx²,®øD4!ºK[½Ìwùv‡ç±eÂÖ§ó?⫸{y oMœ4ÞoøkÛÀžðAûš xrCÚ¾O“´xúÝ8ê½6•þUŠÞl'cÿô¼3m-‡³}¨ÝmïŒF0' —=?<Ïã¯DzƒY86â?þaÜãõñД°ˆˆ\—g¿ëUÞ!V}7‰öz´îû=ºÔ²~ cÓ.þXÞšÊÎ?6aŽºƒ^=HÓ€D6ý¶ˆc°çîcùwSÙïE›~Ñ®±+q¿-<·¡0‰Ø©³8èÅÍ÷ ç=¨œ»ž¥sv’c‡ vôx°ang ³¾u5I¶*û9^¦ò¤mßIŽk$5½ð¯ŽCÎîó–2”Z/kÛþŠui•i|×#ôº·3•òÖ2³”Òn« ´..–8>éÒŠçv·àé눙ÿ!]Ó?¢gÛ—X{ÊNþ¶ÑÜÞÿ{L}Ç2oåB¾èÅŒÁ÷ðÞŽ|õ­ˆˆ\Ÿ§¾ë6ë^ÉÞ¼ê´íÙ†ªîÈ-Ùé¬<ž†åÂoÐXÁµIOšÖ®ˆ ¨Ý².›L%×j'wÿJö[kÓ±GÂÝ€° Úe`êŠÓ¯µ™ñiØ…[ëESÙÓ„âž±Ý3°ØÀÍ\<æspÅt–¬MÀ»Õjú˜/]yK2{wŸÂ©ZCüœÁ)¤>Aæ=Þ–LAå0)½^…)ëÙz,”Vƒ:QÃÃBñ÷3H;Éí(©Ý`8˜000 †>š–bœjfü‹hüB[záÁ½³^£¹gÑ´lî–q¼¿¥)c÷ýBÌ@4ë˜X_å¿|;œ1y[9jªËó÷¥c%3D×"¤þj*šÕ±""¢°[v…œJHÅêÓ ?WãlU}¢ûÐ /îü§›Ýðñ<7MmvÂdœÙNvß¶ø¹œk²gX(NFúé35š¹s"a{v&r,þGã’±ùÖ)V€üøµ,›1C9Ôèö-]v¶´ e3³©T/¤è9naD†@üÞͤZÂv*­^v,©ñdij|ÜHVžé{!…V;A§ ! ¤v‹”ĨçÆñð—íù®ú(Fwñ;=†ldìXK|î:Fx2è츳k±bOÊÅ­ã<Ñ‘aáL¸û.ºwéνƒºUDDvËÃn³ƒa*Û7à 3Ž—~¦Ý~‰)ÆÙíÚs±þ§IlÏ ¦JÍšTjБÈйÌÙr.èæìý™S6a«Ñ™žÝ¢ r+iËBê¶Ýä’ÏŸFóÅyí&.¹ ÁaFéõ²Ù1ÜÒéöø·— Lή`-¹Ý"%2îU¨^µ(~S›Õ†ÙÿAf®I#×óÇ“·/f×|º5‰‡~ŸÊôÙó™þB'^y¬//[Â[-¼t'¹î\§p›qòÆ8q€ÔÜ3¡ÐJfì$¦þ¼Ì2ßKË oŒôý¤]Rh%;>‘üÓ›Í?¼”­'ªÓñᇸµ}KjD†àl±œ»×hî^VÍÚŒcóè}g‹R‚.`I"..sx7zDïE?wõk?9Þ–DA©õ2pªˆKvi…n¸yxâæá‰‹ý(›¬$YË#åOz;ð®UßÔ¶äW$88˜àà`ü­«õôhVdôÇ(žÁÝŸäí ¿±!a?ŸÞ´™/¾ÜJŽ:PDD®C×éÌ®kµVTs˜ÄŠÙ+ euÜsãX¿d/D·ÇÝt²ÌÛq«ÑŠ*‹fÙ¬ÜÜ¢ÎÛˆ‰ÉÿèôîìŽC^<û¶ïÁ1Ø™œ#ë‰Y•ŽÝ9‘äÔ\\²6p$¯"uüòHÞ·û¼@îA€ûù× I›8œãJµVõ t9÷€ÝúU—±hïfR-á•R/ÇàfÔñ‹eÃô9¸th„¯-™«æ³‹vÔu5(ý>f†a%?í™ÙîTpwÔ¬›”ʽñ×þŠ×{Æ÷ƒÔ/ØÂ/o?Ãöá£zODD®ÇLi¿äâÑK‹‰‰!::úŠ Küþd®íÔa'šŒ¬ŒÛéIØüýSùåw:?Ú•€¿é }½ÖKþZ!Nå;FB',=ûoûà¶ê@)=ì[JÂÀ¶e>ýÛüûoJeI`ÓŒY³—ô¬l²7±fÞNLÕëáë¨z‰ˆˆˆü›ýëïdòmF§;rX±hSça¸xX··µ­ô·6þz­—ˆˆˆˆÂî?ŠèZ£ƒê%"""rƒÑßÖ…]…]…]…]…]‘âtKW‘(cÜRu‚ˆˆˆÂ®È¿GIîQDDD.¦e """"¢°+""""¢°+""""røK×ì†8©ÃEDDD䯣™]QØQØQØQØQØQØ…]…]…]…]…]…]QØQØQØ‘¿W>¾xˆ!?foÞ¹ßÚ3W3æþÞ ¾ŒLû¹ß[öŽç•¾÷óͶ\ÈÙȸeê~˵©ÊµÞÞ5(Óš0…}{óÑš,ì×{[þ•eçsàˇòÜLŽ[K~æï«kÄš¹“EŸ<Ë«õfHÿŒ~ÿv¦”úº‚ƒß2¬oo† ÏÁüëëÝáoëÓSkøøAüv¸àü_Û‰E¼÷ÀPæ'êí^vEnLNEEbÎÙǾÔs'ƒüÃë8bûÁµÍ9{ê#sß²Œ*Ô s¹gÒ$>w/ïÌ;†õ/;{—¯LãÍ»ö¤qˆÆu“@þ†~ûÔåoÝWÖdV¾ÿ&¿î¯L§§Gòìó}‰H›Îç#§p¤Äk!qÅjNœŒ!æPþuµÿ®YŸ^OcVDaWäFcàRµ !$³çЩӳ7RbwQÔÿÂ=l‰?}¶ç’¸5BæaܽcªÐ€Ž÷÷§u¸³†ŠöÕeÙŽ¯cõ^7š>ú(mÔ ì¦öÜ5¤/ÁI¿³x_^ Y÷Ö¥ãÑ¢/ój;ÇVñË¿°~Ïq¬ëÑnàPnkà °ç`ÕÄ ,Œ‰#=Ï †éùð=ÜT!…ù/ evðÝ`þo˼ó_ãÊ·WÑ¡è#ô§~$ò™»È˜ü›|†0ìÿrvº0¡üeældÜàñ¼6†ÞplåD~š²”ýÇs1U¨Fã;Ÿàîá8_2û—Üë‰MÌ›0‘ÕÛåàGX“^ôîß™pw°\º¬¶,{ñ‚6¼Ò—r•m'ÿèB¦O˜ÊƽiX *Öº•îÝOãÇË—}a;¯¤?KÛ‡e`MÛÈï¾gÕörœ‚¨Ù¡?÷ޥؾ ÞÆ¸§¾§Ê“w;w:1;)ô­G»G†Ò­~Q= SV1ó‹‰ÙŽSX3Úß] Ÿ®â–F]Rúè‚:åæâјFÅ>ñ0ySÁl!'ßZBÖ]ʦžÔíЖÆÌ$výRâï«EµbÙ²äze8&.Óu²YøB)c)§<}Zž1Û£ý{ÞÈ.qüØÉ;´€©_Ogó¾8†6àæžµ°ém^J:ª DnŽÔªéNîþ]œ([æn¶¯HÝúÕ©U‘ŒMÛɰ‚õdû3œoÂÙÓ‘õk¾^„K—gxfÄstÙÇ‚ñÓˆ·…‰,}çf&Ö ëGóÌËQ;{_ ÿ‘C…!tý=B¹ ï¿Ô¸è${¥ÛË;½¢ÐšÌšñ“9ÑžÃ8ï´éZþ2‹g»£3øâ³¥˜Z dаaôkçÊ–oÞgqüeÖ–´Ý¼=Ì|ýmfÞDçFñôÝ©¸k½7Tk e%\º å)»à ¼7žÍ®í¸ç¥‘<ýljgÏcâø5dÚËÑÎ+éϲìÃΦ¾>ж›ùÏ+£yêáhrÿø€¯$]h Yñõ"Úá™ÿ §GØæÄ¡|°ŸÚÄäa²ÑéVú¾6‚û;y3öŽžÙç¥ôÑE‡PÕ> ñ$u=O_ ØóIZú+ûláԽܒŸ|W¬%Ó=ЦU|oU§ÌÖ[ÊPj=ËÒŸ—ëkhÙÆRû´\c¶œý[¼ü’ÚkM_Î7o~Á6ç¶ôyåMúw b×דˆ/ÐÛ¼hfWäçLPãj˜Vo!>ûN<¬%É¥6·ºá×°nsÖr «õâ·b„Ó¦Škñ DBz=A÷fÁ˜ˆÄ÷®M,{ë' ¡ iKGrχý‰ö1‘„…ò-+ö¡J 3†É„a2®~{á@¡S›çyü®°K¾¦ò•yÞy6ã0Fe:thM-_D†R!l&ÏËÌ ”°Ý¼½¿±6£:w¾þÍüÍ@uB=SØ?lë“:Ю„².Ù†r”Ù [ä6]©ãc"¨pl>kæ'× Nåhgyû³Ô}X»¤Ëíäì˜ALN÷ îMà N¿Ì$~‰O$÷ÂdµãÙi=š‡`¼ooÉ‚ñdØÉÚ2ƒØ‚f<<ø.êyP« ýÓ·2jÚé×ÚJî#¯ÎŽöüd¶Nû„ïgï%ðŽ‘´0_&ëb]L. ÚæjàÙ†jæõl[~»jÖ‰ÒëYp¸ ÇÄeû ×2Œ¥2õiÉÇÇE㤠”þ½Lñ%··7]þÊ.‡V<6ô?Ôõ0 nu‚ìxsB–ÞæEaWäÆfàZ­ A¶_Ø•‰÷ú}Píq‚Á©R3ª:~À–ƒm?„5 =UЇ³'•#|Ï~ d8ºà`“Üø82,{™üô}ü|æºTËŒýœ÷ß[Œµñ<ýH7ªy•tqÇÑå1d‘ËæÑý‹ÂúY1¬;ôµŒÒëY¦c¢œãð ÷myÆlùû·,íu&)Ö¸xl˜ ½ÅK ´fWäFáLí®[6›ØônªY¡è Àð¤jt(y±¿²âˆ•U±lgE\CÂqËÚKB'^Þ>xyûànÛÂïg°?§¼wí¼ÖÛ+/+™[¦óë܃xEu¥û#/òÜØ±ô®|U‹S¾%f¼ÂBpHßÎÁ“禼, [H(ð#ÌÏ| ˺8èåìø…ÅÉ8j8ýûõ$:*÷¼¼Ó3íÖ?±ì«Ý‡T¨)ۈ϶ŸÝ/©‹F1úÝù¤–ùžVŽøT ÀHÚBÂÙ2 9·Ÿ[YúèR›˜:n)Î݇ñÒ{”t¼¬Û‰CÝ<=ê}^]ôóÂ+}©ld±mùòK­§éo>&®ôø(ÿž‰$%·×ŸÈlñë9rv|ØÈŠÛRê=šåƦ™]‘† Áª`¬ÙIV…ÎÔôs8Ì*Ôi‚OöTR©B»*než%qªÖÖ!‹˜ûÑ—¸ßßžëa6Íü–Uö>´ö0&ÃJNÒQÒNVÀßñ*·W¦{6•¯Ìâ'ZÛ~Vÿ<—4Ón©ã‹åÈ:6&™ð»Å»Üo–Î5zЬÂkLûx"N}nÆß²‡eßÎ!«ÆÃ4 qÂ!µä²ÎkCçrÌ\˜Ý*à”džp®æJæ®yüök26×}HÈå¦rµóïÃRêîYÿv9Žâ§Ï¦A¯FTÈÚÈìI› [?¼ÍÇ˼/½ßN½IÿãÇÏfðŸžõq;¶‚Y¿§Q¹ }”_¸;ÅãlÞÞùlÏ âæÐöÇÆœÐk4 ü‚ð›` Û²Üix{ª…»ËhӾݸ„£yuˆ(±ž×â˜0®b,•ïø(^Žgiý[ñJÆ#>M{Pë§Oùî“`î¹= Ïôu̇@½Å‹Â®ˆxD6!ˆ¤×lJP±ï 9DQÓk*©N Ï[cZúZ8^Žã7_óÇ‹8iõ$¸ñ]<þP7|¨Þ¢.K¦â½ôWþøUn¯,a×\Î2‹õ[ýGxø®ñLŸõŸL¶bò¬D®Ïrwû r f¸ÖæÎ7_Âõ«‰Ì|g6Y~„7ÀÓý»àg6 ¤²Ìùç·¡øíÕÊrYSçAîïú!¿LÍz|©Ü¨ÿÅšO'0gæ,­ß<qïðÿòÛ—“™4ü'ò\‚¨Ùþé†CÁñ²÷¿W4ý† fÚøŸøîÍ)xToËmOô¦à£M¸8¥ôÑn iŒ›qnV3+>…BY:þ,=¿ÁÔ}ákkPìKü{w^Uyï}ü»÷Î<!$$@Â(2 dA¢â€¥j­³UǶ§µí鹞§E=mOgÛ§j=¢V[qBP‰ "³2*"3„1Ȱ÷ó•A&ëоŸëâYkïü×ß+ù­{ß{¥ŠÞz‡Š&ƒ8§]Â…¥ÒiÔYÄýæ]æ­­¦ óñëüÂçÄ‘¯ßçK'}~9f¿w‚þ^ÿOŽŸôA\7®†ç~Ž¿ýb¡¬n ºñ6’™àx{ôF"‘“~dþüùÚ5é+RRc¤/Cx÷rÞ[¢Mö˜tPµäî~$•›w=y1Ö)}¢e#g®Ù•$5:‘ªULùÓ/xzò"Jvíaךé<ÿè\¢Î@VŒuJ§gv¥Ä™]éËRGÙ»ÏðÌSSøp[%Äæ´>û ®¸r™±ë”ÑØgv »’aW’dØm´\Æ I’$î$I’dØ•$I’ »’$I’aW’$I2ìJ’$I†]I’$v%I’$î$I’dØ•$I’ »’$I’aW’$I2ìJ’$ɰ+I’$v%I’$î$I’dØ•$I’ »’$I’aW’$I†]I’$©1вRÃÑ2ÆH’ôerfW’$I†]I’$ɰ+I’$v%I’$î$I’dØ•$I’ »’$I2ìJ’$I†]I’$ɰ+I’$v%I’$î$I’dØ•$I’aW’$I2ìJ’$I \TÃ)¥‚¥ü–ç7}k|·ëøKòˆù¿cíÆ‰üiü^.úá·h{”ª>à±ßO!çÆghh÷Ýû&‰—ý˜ë»$ûI«W2þ÷izíw)ÊŽ>mRýŽ·N®?'­’eãŸdçÈ8'#ä™ú…ígõ?à?_Žæ›ø-ßÈ=tlÖ³óÍÿæö{73ä®{¸©s&I2ì~E²‡sõ¨Ü#Bm€¨Äfœ0:Ö—2ë¯÷ó^¯ç;}Ò¾Ôië`|=úžML³(GÍÑzý%ögÿúWùûÜbví¥jÖ |´?—¢Ë ijæýbÉs3ÃfÜÅ„Gf0øgÃøä"Rñ>ÏŽè¾?â› º’$ÃîW*”AvN± ¬®@R>Fæ;b¾†þÄæfdå<õ÷}ìKnÁ·/ëAºA÷‹¿F‰grÅM}™óÛ'xjq!ß;+™µl˜øoVvææ«{‘jÒ•$vÿÕjÙ¹´˜WÞ\Âú²ý„’²èrÎÅœß#ÄÜ¿þ…i;WïáîWð“«;ܶ€×^y‹÷6ÒZ÷`ØEçqf“O=LùÊ)<ñæBÖ{&C.N·Œ#L¶<£×Ð;óÓ麲eLz}:K>ÚM8µ }/ð‚¤£ÎšÕïYÉô‰SX°v'•Ñéä÷Îè!I AýÞUÌx¥˜k·³/”JvÇþêMv\à@MœBΘTÏÉÒµ;©KmKß /ehAm"Õ[x÷µIÌZ¾‰Ý5ñd´ëŹç¦CjèØµ jÆ’èõØÿ8dùƪ;¡ìà 4yÏf]U_òRûõÜ?øT¿o{Íéß«+ù)ÈnFræF‚ñA A‚ "£çHÆt+¤ %d“Rö. ßÙMubqt} ÛŭȦäÏ™³f ŽQãqj Í^ÄÎM ‘ÍÙƒW3ÿñí”×Ñ +×ÍdIU;.¾d“@&ïÛÅ+ÛKÙ³a‹ÊsqÝz¤2ÊØðÈ<–”žÅà  G3ôŒ¦„€”gðöã;ÙWŽ¿½vÇ;ÌÞ–MÑw‡Ó=9dÓ2#@É=¯óΖ!¤W»¶šÞëCóûG³¿XÝ@0.ñÀ,y|¢gé—}Ò·ÁÍ—¼ÁŸü¿&Ž?ýí㼈5ë_gâúnúËÕ NäçX}ëã¼¾örn¬Ý@i H·¦Ah—M“¼„’½±‹$ɰ{rŽúµ qMãˆiYHô'xédáh_ОŽ;‘„ú#ž+¦9ÝÏNdǦ,z¿„M׳úíÔ7í|ÈSgÐ!+þÓÿ’ri—áÝ­åÔ#ì·†j ”@Ëìd>ç Åcf²Ž=›vR—Þ‡¬„À§/IF¿Ë¹ŽzJgS›Ú‘ܤƒA"&£€Q Ù¼»R|¯ìœã|¯cnP½c{k7ñòŸ~ɤO©£¶>B¤¼š=[ŽUP_zŒ0LÅÖ_¼n}…bisÑM }ãN¦g}‹«º'¼¼&BÅÆ•”Ö¬âþÛ®âÁCÆDM]˜HY ±ÝF2¤Å]ÜwË-¼Ñ¯/½zœEaa!9‰ÎêJ’ »'åDP Ä·¥èÖ;è¾ú–¯\Ãò7Æ3õ•,^{-ÃZ¾o¤j=SÇ?ͼª,:vê@~ó83g2ãú„ÿ;ø("'y·† "&êä’[$@ðäï B˜ÈÇÿ?Á÷:ÎöH8B ±;—ß8Œ¬ÃFB€P\,»7Îھ̺õ• Ä6'7â3³I>&‚)Cøñ¯®¤mÌác"*1‰`LWnøýà ]4‡¹ –0wüÝ<ý×¶\z÷\Ñ>Þ;9H’œSì½Ç0å«ßfÊœ-$·/dØè+øÎ¾GQó­,X¸š#ö®Z79»ÚñÍ›¯cÌð³éÞ¾%ñ55„Ý©~+6WüåëX±+šæ9)Ǹø|5œ Ú“’•Fp×Z¶TE>)ˆ²wŸæþ§Q“Ñ”è=ëØ¸ï`Å5;Ö°µ.•ìÔ/z ®Y& ›ÙV—@rr2ÉÉÉ$F62óµ™|Tþ€Ãñj;²×š˜ò¾ÚºõÕ‰ÎcÌ]wóУ<÷›©ìªO&·÷þëÆ"ZF ûMÜ1ö{ñ~þd=¡äz\p7o«v%I Q ‰DNvçùóçSXXh×$I’tJð~A’$I2ìJ’$I†]I’$ɰ+I’$v%I’$î$I’dØ•$I’aW’$I2ìJ’$I†]I’$éëe ¤SG8¦¦¦†ššêëëmˆ$鄈5ìJjø‚Á qqqÄÅÅÙ I’Næw§-$I’aW’$I2ìJ’$I†]I’$ɰ+I’$v%I’$î$I’ »’$I’aW’$I2ìJ’$I†]I’$ɰ+I’$v%I’dØ•$I’ »’$I’aW’$I2ìJ’$I†]I’$ɰ+I’$î$I’dØýzÔ–¼ÎÇcÜï^ac/ÒñE¨XýþÏ8Æ=¼ˆ²­ÓøÓ¸q<öAÕI>¾’eãä­õ¶²QÛÏê'nã²Ë¾Ï?>ª=b[=;ß¼“+.û~PIÄfI’ »_iÔeûÒeìØ·œÅ[HÚ­/eÖ½ÿÍ_çí&Ü úUÉÚïPÖæbn¹¼ )‰¹ôì{6]šF8þ¬•ñÏóþ®½¬›õãŸO©™·‘Š%ÌÍ KÛÄ„GfpèµM¤â}žÿÑ}oà›Ø,I’a÷«ÌºÛYºl/‰]†Ñ%¡‚—lÅÉÝãˆÔSS ¡E6IÑ„’ 8r8½3£Or3²k-eûØ´«ƒFõ =dK«@â™\qS_b–=ÁS‹Ë?žÁ­eÃÄGx³²3ß¾º©&]IR#ÕÐ ªÝ¶„Êh׫g2‹÷?\ÂÖ¹äÆܧ~ÏJ¦OœÂ‚µ;©ŒN'¿÷pFéHjèøÛ"Õ[x÷µIÌZ¾‰Ý5ñd´ëŹç¦CjˆÚÍ“ù˳û:$ž¥³–°¶4B“¼n }g¤îfÆýaÚNàÕ{¸{Åüäê¶ì[ZÌ+o.a}Ù~BIYt9çbÎïIÌQŽë¸5ï]ÅŒWŠY°v;ûB©dwìOѨÞdÇ z%ãÿ8…œ1¨ž;“¥kwR—Ú–¾^ÊÐü0 úK€’{¹{åEüðÊXžûãk´¼þvF´Œ¦n×ûLyy*K6ì%:³†d³tÂ2 ¿{Ý“"”}¸f#/£ÓâÙ¬«êK^Š'E#Ž»¤õº–kϼû~ž¢3®!¿|½´…ÜËî`póW:‘ʵLyìa^œ»’Õ‰äôÁU7¥W³( †’ãyà™é|°½ŠPZ[úã6nžGœAY’Ô…Æ7îdwÞ¼y3ÙÙÙ_eÔ¥äíW˜[–ψ󺓻‘ù ×i×›©O9V¯gòƒãY’Ї /:¼+¦NaY\º7ÛΫÇÚ–UÅü'dje'λp»eQ·êM^_MAÏ’*W1oÎBÞÛM—s‹Ö3›ºÕoQäG­ãåžáô³=z(g¦—2ë•Yl©I¦ãÙ=iC“6gÐ)/‡ü.i•GÈÀÒ¸hÕ>†E/<ÇÂøî¤Ï¾öãÇ·ŸCóèÔ•0éΟðTy¾}óõŒœOíÂgxôÕJºëFJÉ~v÷GÞÈw¾5Šnñ«xéÉiÐï\ÎHõmIRÃÓ°fvk¶²dù>â ºÓ2bsº’ZÁŠÅ[©ÉÍ%¨\7“%Uí¸ø’AtN ™\¼o¯l/¥líücnÛ·e-³·eSôÝátOÙ´ÌPrÏë¼³eDA„Ú]xC:%  ­2`ëŸ'3{Ýy´m$@€@ H0µû¶±'Мþ½º’Ÿ€ìf$gn$ÿÙ•!Ç«yφE,*ÏaÄu#è‘rÈL(cÃ#óXRzƒS€zH,ÍÐ3šRžÁÛïd_=$ÀÇu\p¡bÕLÞ¯ëÄØKÑ!ÈkÁ¥{×rßôC²O\â™èøDφÓå¤o9‚›/yƒ?ù3~M~ú ÚÇ85ë_gâúnúËÕ NäçX}ëã¼¾örn¬Ý@i H·¦Ah—M“¼„’½±‹$ɰ{Yw1Ë÷Å’ß­%± ¹œ™ kV,fKM.y1uìÙ´“ºô>d%>=„Œ~—sul)ž|ŒmÊÏ`oí&^þÓ/™ôÉæHµõ"åuÐfÐ1çàtI¹´kRÏÂ’rêÚÞª˜–…ôH‚—þðGžÑ‰öí騱Ÿ »Ç«¹žÒ™ÅÔ¦v$7éàãb2 hµÍ»ë %“̧óf¡˜“˜­g÷¦RÂM“ðåNkM\`—#ÿ´K›‹nbèw2=ë[\Õ=ùã1¡bãJJkVqÿmWñà!çIM]˜HY ±ÝF2¤Å]ÜwË-¼Ñ¯/½zœEaa!9‰ÎêJ’ »'ŠºlYü!ìgÙ“ÿòö}Èâ-#ÉË  GÌbåN´-ØËoFÖaG Û@àÀìè!Û‚ˆD>{3¦@|[Šn½ƒî«?`ùÊ5,cÞ±%IjpÎ{5[XüaQmЏþ–[¹õÖÿn¹f-©dÅâ-Ô"%+வl©ú$ÈÕSöîÓÜÿÔ"ê3µmUé™$Tlf[]ÉÉÉ$''“ÙÈÌ×fòQõ'»ïdÕÖꃿø+>bÕ® éYÉG\„)_ý6Sæl!¹}!ÃF_Áw~ð=ŠšoeÁÂmGÜ=âø5×d4%zÏ:6î;xC³škØZ—Jv깉"µeÒ5<¤zö~TB•7RÕÑ#0‰Ùy$•¯bCm2Mš4¡I“&¤„WðÂc/°¼¢Ž²EÏ3~â:ÒÎÅ•·þ'¿yè^nÈ]Gqñïš"IjÌÌnMÉ"VTÆÓy`Wr[ÄÜIäìü·xnÅb¶Ôä‘[ПÎQO3ñÅ·a`;’+W2­x‘~ÃhÑ>•ÎS޾­iN+zg,dÚß'?¢'™á­,›1… ¡0!{ªyÿÅh^t6­cËø`Ú$ÖÇv᪶‰À~zªJ·³k_ áLGY°ˆ>­“©Ý¶œ÷viÒ=‰Ð‘â85g´Î {Òc¼öb¢ÏíBzíFæOžKE«Qtkµÿ|pIîПŽSžå¥Þæ‚m‰+{©s÷B Ã8Ul~#³§òÌï"éÚaäÕo`ö„Ç)Ž\ÎÈä(¢Ãk(~z2Û‚7PÔ%ýæ1³$Hæ´†wkI’NØÝÏæE+¨L>“ÂVqGd¶$òû¶'ö©,.©!¯u{Fßxo¼<—Ful:ù½Ærå€L¢£2¹-* ]{Ñ“^å­gRN ³Ã@®,êCÓÐÇ™2:¢aé,›ò4ÓvCZ^OÆÜpñI´éÒ†¹ÓŸæ¡½Wñƒ±ç3vðD^›ù‡ %dPÐo,E½Ò9rõb ¡ýqëqÕĽRÌ”'çPJ%»S×ê}àž·µÿ|W‰¸øú‹xõ¥iLxô-Zuc襃¨ûûjb½í‚Ž&:1wÝEÌCòÜo¦²«>™ÜÞcø¯‹h€î7qÇØxìÅ{øù“õ„’sèqÁÜ8¼®Ú•$5DÈѤÃüùó),,l”¨Ý<™??^Ê…?ü6íãÇ1Õ—o`åæ ­Ú·â“Ï¿U­zŽ¿LJäÊÛF‘í I’7ïÔ˜ÕlfÆ?žâÅ9«Ø¶·‚Ý›ñúäu8“æ]I’tp™]#jڇ˿QÉÄ)¸¿¸š@\­º^ÌÕÃr0ëJ’¤ÓË$I’Ôh¹ŒA’$I†]I’$ɰ+I’$v%I’$î$I’dØ•$I’å}v¥SH8¦¦¦†ššêëëmˆ$鄈5ìJjø‚Á qqqÄÅÅÙ I’Næw§-$I’aW’$I2ìJ’$I†]I’$ɰ+I’$v%I’$î$I’ »’$I’aW’$I2ìJ’$I†]I’$ɰ+I’$v%I’dØ•$I’ »’$I’aW’$I2ìJ’$I†]I’$ɰ+I’$î$I’dØ•$I’ »’$I’aW’$I2ìJ’$I†]I’$ɰ+I’$î$I’dØ•$I’ »’$I’aW’$I2ìJ’$I†]I’$v%I’$î$I’dØ•$I’ »’$IÒ—$ÊH Û+ëKùíâ,Þ¹½5u§Íq§ÅFÑ+#™q½[Ó?+Õ I2ìJͳ«·sù”NËcß½¿Ž76•1mónÞº¸;ŽxO× /$ɰ+5 w¾³€_ôiÃ÷»å:m޽¢¶žÎ^ÃËJøùüõL½¨Ûg.~:w-íÈYÉ$F‡Në±²·æÀÅÁèÉïóRQ—£^HÒéÈ5»R¶jO?ê‘{Z]€Äè¿ìÛ€;Êz!ðøÐŽ j™vÚ]€”˜(.m›ÁÿTÀÏç¯÷ä‘$îÔðÕ…#D§åñ§ÇF°ç(KVí©âìÎ^éü¼¦G½8$î$bQ§éEÀñ¤ÆDõâ@’ »’$I’aW’$I2ìJ’$I†]I’$ɰ+I’$v%I’$î$I’ »’$I’aW’$I2ìJ’$I_µ([ 5ráZf}°–ÿZ²“y{j©‰ŽåŒ¬ ~Ô·5W5‹:}¯x#5<6a6×o?üGbëæ©\й5wwJ&ídþñþ z| ýÆòëfÎHRCãOf©q']–.ZÂ93ÊÈèPÀË—ôdÚy­)Šlãšç—ñÐÞÈÇ»Uñ›¿Í û{ÕÔf µ(`ꘞÌÓ“i£ ¸¹é~œ¾sì£òK9Nß>KÒ¿Š3»RcV[Ο–ì£M¯Þ<Õ+‘XRœHÍßò›å\Û'é㯟ž¢ãè•™BÊǽÒ&ƒQ)‹èñÎ*žéØë“Ž#I:…9³+5jaöÕDˆ–ð’ùш®T\Ø”ÔÚ=Ü1a)¿®l¯ÎïÉÌórhS²Š“7³6üIª«âÁiëXÙ<‡_uM$!\ÉŸ'.âGe)ŒÕ“ù0ªz#£_\ËÜÚS«mؤÀÚmÕTžã:Þ¾õGés#ê™$5T.cwÚeø9½˜™¹‰{WîäÅ%üHMk•][sgçT2‚   €=[6òXe ¼$Ÿë’@ ÝâªxûùMŒßÝ’Ÿ'õa¢;vaRïË#ª¶¯æ÷¥ÉÜû­|®I<ð˜³Ò¼óÄjîßÑš¾-C§PÚ Ñ4 *÷‡©ØYrüãjzðaU'Ú·Åá}®ÚQÒxz&I†]IÿÁúwnKÿÎm‰„kY^²“ÿ]º‘{f,â½=Yxv I‡= ¶ÒJª’2èŸpp½jbz:ÝB[˜W^I@0Š>ÙqŸ®÷ݽk/›êörã“osë'‹D¨ GˆT†‰â”Yý©§´bƒì=Ñq5=Ø·÷àpªg’dØ•ôu«Úù7.ŒðCóè`4s²øuNs.™9Ÿ~+¶°´0…³OrASˆµŸ$¶@ˆ´¨ƒQ,‰ŠoÁ‹cÚÒóˆŸ,11ѧTh‹ì¯dæ^h›KLøÇUÏçèÁá÷`hL=“¤†Ê5»R# †ygõ&îÙtàƒV‡ü <Êo€Ì¦ Äí+cvåÁ¹Èв2×ÇQ˜|ôiiI¤W•³¤>𬄲bÈïáW3?âíšSéWõ,^¶7Hå†ìÒOú¸Ÿ»§g’Ôp9³+5b1iYüßÖ¹úÕ…TõlÅØñ4¥–›·r÷’ZöϦ[†` BÙî ÖTFSÕŠkñ¯¯!¡_sÚÕíåÿÍØÄöí¸¦I£Ý$6±y6ÿÖd ?{m%éý³èÞÇ߬áAZóïq w޲¶º‚¹[B$¡²ªŠyë6s׊ zžÅåIâOp\µŸ¯‡ö¹Ý)Ú3I2ìJj‚±\5¼7ÍÞ[Ç]ËÖqÍ‚Zö£h•žÆuçõä' ÖÜcZÆ=ï¾Gá¾®l•Î.=“´·Öò£‰›ØŠ¥wÛvÌMþ±Þ %ñ.îNÂŒÕÜýÚJÂÑœÙ:Iƒrh߀ßCªßº†/|zäe¤rÓàüw§$>ïqpßÏöùTì™$J‘Hä¤ß+›?>………vMúºNÐû¦ù·Áöàˆî›~Z÷åD=³7’t€s’$I2ìJ’$I†]I’$ɰ+I’$v%I’$î$I’dØ•$I’aW’$I2ìJÒ×,* .±GØSSGjŒS’ »Ò)èjOÓP·k-ÀQÃ[§& ÌÞºÇAr„IJéÛ"ÅFH’aWjø:5Ià·‹>:íf1kÂaþkî:€£†·Ÿ÷jÍ5S?äÕvQŸöc¥²®žñ+¶qûŒÕŒëÝÚ“G’>ˆD"'ýtþüùÚ5ék2aÍ.{}Ùé}E0ëÒôÍülà}e})¿\¸w·—Ÿ¶³ßŸˆ Ò73…» ÛÐ?+Õ“G’ »Ò©át t†7IÒ—ÁO1H Ü­›rAë¦6B’¤‚kv%I’dØ•$I’ »’$I’aW’$I2ìJ’$I†]I’$ɰ+I’$î$I’dØ•$I’ »’$I’aW’$I2ìJ’$I†]I’$v%I’$î$I’ÔÀýNTO€¹Ï^IEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/24-agents/2402_create_agent_based_host.png000066400000000000000000001215511516513262500331550ustar00rootroot00000000000000‰PNG  IHDRµËçˆzðsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwXTWþÇñ÷:( (EP°!vc4jЉ1Íšnº‰i¿MïÍ”ÝMÛMLoÆt“˜˜hbÅ^°bAE”¦Ò;3÷÷ ØËRœäózŸGæž{ιãŒ|æÜï½cbR‚ˆˆˆˆˆ3·öDDDDDþW µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…ZqxÖ50îÞÓøë2½» µ§ """âð´R+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðZ,ÔV§~Îøøxâoû€mU'noß?G¯¹ŸŸ²kO}{m?Þ÷7îøtÕGÛ/þ:þTqêá€LVW.ì݅߯LÁçPuûYl½¼»xâcjíÙ‰ˆˆÈŸŠÅ+{úÓÙrä&«»ºzâÕLC·P¨­f÷Âeä&² í$Rí™Î–ÃÏ\ÃC3÷akí¹ƒ³W{>úû ~?+ˆ>F)¿nÍæãEäyùóäyýØ9&Œέ=KùS°¸qãyqü8´;+.$ªQ°µº·ã+byçÜ>üçÕ,Á¶eBmõn-ßO›!×2Ä«ˆÄ…iü bíÍäâÍk—uãVÏb^úu9¡S7rãÂíL˜¿™³¿\JÿÅyÔ„F0ÿ‚@:ªEDDDþ'fzõíÉäÎu«e~º²ü‚@ºXmOîl[×nØà^¼j¥©O[›¸¿£ªÚµ€åû½è{ÁpÎæg–&. m\4Ñ. - *Òæðɇ?±|{Î!±Œº";'»ýôÕî_ÇLaΆÝYýè<àrn»e‘& šìESøàÛ$ï«ÀâÁ¿Màö‘Vfd•ëpÆ?û<÷_Àº¿&­æä¶‹a·c³Ùûc?ø$Vnã‹'^âç¢\÷ø+L¼ ’?æ©Wf±×5»§ñêÛ 0½§&>Ë„sÝXùÑëLÏiÏ•¯¿Åu!VÂǽÃ×O÷=ƒ-`qãï]Ýao:/gÕ#üÛÙ¼9•oª¬ŒéæE›£¶99öªBžú%‰WòÆUßCí®­›9+!—̦X™•æíæ’.,¿$˜Èê|îøe;Ó˵F+"""§ÏêîÇ{Wôà¶£Ô5úvìʲQpÖ¬¶5Ãâ`óÖÔV¦’XŒSÏÛ˜øÚë¼þzݟמ½–S «R©Ä ÿ¨öØ3V±£¬!TÙ)Ú–ÄpÂí§Ë‚wxNù›ØVx°£ªÌ$Òküˆô·P°î'¦üš†wß‹¸ö®Çø×G“¸5,9svqÿÛ3н‚ï“K¡]8ÿììrÌO.y;8÷TÆÿ’ÌÇEÍt.@DDDþ¬î~L:,ÐîÚžÎ{kl;veÙ¨@ºå>¶ÿ«f µ•© ¬*ñ`ÐÈîNxxÝŸŽ=FrY/'JV%ZiÁoà%ÄÖ.å?o|Ç’ÛØ¸ðKÞü"&àDÛOŸ[ô%ŒðNá³×§°pãRÖÌà½7gPÔu4Ãq²ïdÎדøä×ålÞ±µ f±$ÛL‡NÞX1a6Ù(ÍÉ`oaÕV‡j°}ó6^ÚoåÊó{óY7O¼=U&«+ÃÃ=ñ6ìNÝ͹¶3lþ"""âXÌÄtëÈm>²kËf†ÌKçž_ÖóRnã`Û‰‡›þ–^.÷Üñ<׿ãiv]ÁÖo?dvÉ0îºa í/š\hç•άyIÔö¾áéß×—½Ëg2mÚ Vdº1ä–«ñڼߑЭC§ãnñ:,›ÛKØ2ëvœÇè8_0*Ò˜÷ë:ÜϹ”!!ôÜÛ¦ÙLûá'f&fâÜûºï"Â\L8wèNgs‹~Æô™sY¶­Œð‹ÆsÏ¥]ñ´:áTšÂâ_ä÷œn\4$àÚÝ“õüªôÓØë$Ø«Y”ZŒkPwu汞þœÜŽ«bByõœÎÜ×Õßìf”h…VDDDþWûöä±ÞÝŸ±þÖº@»°î¢0ÃVÅ‚E8…u`¨{-Ó¬ç–Uý;cOŸ‰I Ç]¤3îÞÄCJc¦w4ïf'úE…pO”/}œq·×°s_ßnÎdrv•¾CDDDšŽÙ™‘=غ³€ìÃÖÍÌ.mø[` ÓÓ+¨h†¡j[Y³‡Z‘¿}Aªˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðL†aÇÚ˜˜˜È€Zr>"""""§L+µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡gmÑÑŒ>{'o'Ûë~ˆç7Çætò]T¥|ÀÝOÌ¡ûoć÷ Nµ½C¨ÍâÇÜÏ7ÙáÜü¸½å:(cå37ñïd€üüE{6ËL›ŽQ²§oæ­íó¯·á|H“ÊorûóK©\=ÃÇõ­5æ*"""-®EóQ¸y[íس”{â uø˜)Iå;çòëò½Ô˜Ýè4ò2†èµ,""ÒZð7°Aá†y4δÒ•{¸2ôO°zêP̸t¤C~¸à®"”ÓdP¾sSN\Ø}´B­ˆˆH+i¹ßÀF!çmÅ~ØÃÙKV±ïŠ‚Nåì¹üÜèy÷kLjíiˆˆˆˆ4‘ µFÑÆƒ¥W3Ö:•oS È\Ī}—rYà‘©¶fßJ¾Ÿ<¥v’ïLL¿ ˆxx,>ýö‡h\§Úæ\ž}¡¿˜Âïk³©pjKH\sëÕ pÆt`'Å[çðýϋؒJv‰ í;EÒmàh®¾¤íM`ÛÃô‡îá‹ ÀÇ£?IO0JV2ñ¶“d¼F2ñý»‰všÔ/¸÷‘éä^#^äý 1¸œü³LõÞµü6u&+¶ìd×ÞR¬¾!DÆâšk/ ºmýslðøíLÚXûðägOçt:ÇoP½'‘Ÿ¾žÎ’õ)ä:…ÐcÐ%\3$“ן™N.y÷‡¼2Ò·n{éË~áûéKØ’±’ n>Dô9+ã/¤—¿S£¾›–­$…?þ ;IËȣʽ=a#é=òr®GãÕj£Š=kgðÝO lLÏ¡°Ê ¯öÁtx1»r‘^°ç3ç±;ù µa§*V¾xñ!×óöë—s”—³ˆˆˆ4£ µE–t>Œ¡Nkù6eÁÂÕ¹Œ¹$€Æ9 j×t^~ò 6WÖ?P‘ɦùŸ²y•ÆQF8ÕöÇU¶™ÏŸšÇ®ÒúŸkŠÈ\÷3ÿ~¢§ßž@¬‡ °S¸ê}ýgùv¬e_jûR“X¾aÿ|j !NíèÙÇ2r¡v÷TÓ?Ò™š½›É°ÕïV²ƒ…6¢;˜)IK&gº ;…@ 5™3˜øÈç$W|̶?“Íó>á©åë™ðÚ#Œ8™ ÊNêøÁ¶o>¯?ük*vÌ iÖ»l^ë”N+Ùñí“<öSf£ÇlTd±yÞd6'îàÑ· Û¦µ¶¼%ü÷±·XZØø÷‘¾yé›—±,ùq^¹³/mÍ5dýö"NÞJíÆ5”ìKgͯ“X³x¿v/Ûšqo×ÏŒ}”ÖÔ7sõÂßÏåY‘–×2Õ”Fçm¥.Ã…rvœ?~±ÃèX¿y÷Â5äÙµ·å0kÒÁ€Ú¦ç…\;î:.îíƒQRvdÿ§ÚþDl{ØUÓ‰³/»†ë®΋ì‹3}S)`”obÊ»õÖ#ޱOä_/?θ!~TmžÌ»óöaÉÀ¾Ý©»¹À~¶ì(ÂŽâ´­ì?0`›2+*²6f×=dŠ`p„û)Ì9—ïM®´fBι–»ÿï~Æ×±.d•¯áÓ)(;™„ÇQHâ'ŸÖZ!çÝÁ/<Í=—EcÉÍmëÅëøfz} õìÍ•ãÿÁC÷ÝÂ¥±^u•,ã×Å'ù$Ÿß¹–øøøCþ\_çƒC.dÅï´.QpㄸëÚá„Õ§Ï}óÞfòƲº±+Søé‡ú@ëÖƒËÇ?Â3O?Ì­ç…Õ½Y 3yænjL> yô^»9¢~ >ü.ï=u>§t# i-²RkmdÞ–úÔ4„¾þ,¦Þœé™@úBÖå_È…õi &k³NëFŒcâ“c² !ø™{øpÛ¡%§ÚþÄÚsù‹¹>Â0´;ßNÆŽÜÌ"l½¨Úú;+J,ô¼cW ôÆD„º‘±ñæ¤ü±Œ½ç_N`Ø@º:-`M d%ePy¡'Yê«“·•šÂvoÍ¥&Ö‰”Ôòº)„¤k›“_µ´å¯fÖ¶ºHhêz'OM8?30¨3µÛîãË ¨Ø°ˆôª8ºŸpù÷ÄÇo)XÏŒµUuÍ;ÞÄc·_@€ˆ‰Ä{ÿ&..=¤G[y9>ݻӽ֙‹îbì _Ì@œ I ”`PœW†¶MºÒi/XÃoëê—®ýÆðì³ãèâ 0„A÷L\H ¥,Ÿ‘Ì­±ýq/ßKVÃç ö=4¸‘fzu ÄÎl-3pu·Q."""­«B­AÑÆù4dÚƒûÓÁ О¾gòå÷9@* ëösÁ(ÌTdlbOýÞÑcÎ&°a–éÎÇÛ66 §Úþ$xDÓ'¸!ù™p ¥ Éö;5ämÝE]¤³±éƒpÛ§õÔ°Q^\¿kÎF²*/'È£3ƒ:Áš¨NÛÌÞr?¶¦Uþ Õ„ï6±oË.JË\Ø´·n×ö}zÒîÒ]ÍÞ-ÔïJè îø4¬Á[¹èé·ˆ+±É çcõp*ÇU9IdÔ/«† ï‡Ã\MÄ\ЯŠ”4êÒp.÷<}.Ø+ÈMÝÂ’™óHMÝAòª5‡´;9‡^H¬Ï¡OPí¾Ì\±ïǪs6Q¿öMйçáÚ°Å„GÌ({/dv!Ôdlc_M:¹µ'Èv”»¾á±›~&¨{?úÀ€+ÇsQ{7}c‰ˆˆÈ¨ùC­QĦùɨ.ÈšÇ7_Ô [›{°ÙÎIì?ÿ<üÌv*‹N"»ÑÎǵÑÅC&œ½ýð€FAèTÛŸ‹ó!«…&³ù° ˜ìT<Ñm”St´~leWàÑ–è!’ y›Ù¹·#›÷.èÛ§+[¿ÛDFÖ&vív!ÓàE÷¾œÂwR`«,¦¡œØÍ»qð2áâB¸o£Æ':ÇÂã[y!õkʸûxô,žþxrØsnT‘¹ðSÞúxé•?­Zoz^r7ñå ù$¬ØwH ‚QYràyñlïyè*°Õ“öž@!PYD¥p‹áÆ\Eá¤Ù° ‚ìÍ‹ùeób~ù ¼¢/æŽû®gpûSùבæÖì¡Ö(Ú̼䃳{WÌdúÑî˜Ï†‚‘ŒlgÆÅ«a9­’ý…U4UƒšâýÂTSmßÌ8»5*?.ý×ÛÜq¼cÁ¯güÈ$,W­&Ó‚béJ„d”lgíZ3Î]v*—ˆÙÙg  (Û_Þä§ñÏ ' (Í-ÁŽ×ñjKöñ!¢f÷4þõμºUSÿ8Æ\r.{ERú ÷?5bš‡ÉÕ W  (Í-ņ÷Á}m)¹ U.^¸˜,xÇ^Ã3ï_ΞäD–.]ÊÒåkÙ]ß®dë Þx#€I/]¤ÚY‘3H3ŸI5(Ú<—dÛ‰[blgþ†B L¸‡ÆÐ¾~ÿ­3–²·áª#[>+glâÐîNµ}S°âPÿäå³5µè`yƒQCAÚ’““INɦ¼~UÔ)¨/Ý=*Hú}Å€o·Î´q  G@&sgï®;¢ˆÁœÊ5bÎí»Ö?¹lÝÁ ïìy,xùn¸ánº÷}’+ÕÃ)Žçßåàxó“ÑpÇ{!k§¯à°ŠZöoL¬/p㬻ÿÁ¸Ñƒˆ ñ¤dkJ³Zç€Õÿ={î\Òª¶”&ÿqà2khWü­e[æ£wßåݾc£÷`®ºó Þøì+ÞþFâêÿMŒ]È®æ§|— i2Í»Rk³y^CéA[Οø.wFºYµõî~jE¤$l¤pø9øeDð4¾Ëcǧ<ùòÆôõ¥(i&¿%!;bûÿ ¯î£ˆuÞ̺jƒ”Éïð½ÛÕômWÅžäù|õõròç¸x÷‰ Ü\ÂØÅ‰…ëj°•Ø+á=q69ãÛó¨®\¡»r ׈`iߟ‘¿`r:°óS^üo9Wì@ÅÆéLY»ŸZÀ-¶/¡§¶|Üñ†…~É×@öTž¹”K´£8é~]SuXk§†eÍ ÖMýŽ™Q¸ì[É´o3šfBÇ`öéÃŽxk} äýÆsÏ×0vT7<ò×ñÛw‹ê÷'gé§ÉD•=ƒ¥óR $l+¡ô²AD´3S’¹â†[wyùáY8&sÃ?T¹»s©ìŠ‹ÅÔl÷Û‘£kÖPko:XzàÕ‡¡LT.ágÓÛs KÁ¾-MEÃêʘ»/gé“?“ m˜ÉWêw°XÀvXPu:ÅöMÀä=€ÛoíËCï­¡¼b?¼¹‰7ðÎ=wÆ»!ݘ<ˆÜ Ö¥Ô?Dl¨+`¡CL(Öéyõ·ÁjOßžíN½tÀÀƲô±oÙaƒ=K¿åÝ¥¶{ŸÃ½·õÅËDÓ,)Zƒ¸ðÎKXðÔ¯d%›~ç«MõÛÜÜ ¢qe«ŸØs‰¶|ÌVT$ÿƧÉu[\:à´g/5@eQ%6hÚ² ³ƒÇßÍÊÇþÃòB¨J™Åä”Y‡4 ¸à~ÆõôÀ¸v‰glÏå|¼±#s!_MZxX‡º\r!áÎuÇåŒ;)Ò&ÿƒëçéËDDDZC3–ožOr})€Gïatr=J3·N íéV÷wÛ6c`­뵼øòmœí‡3`ò "zèõ<þà9´=¢“Sm߬´?÷!Þxò:†÷êH{`ÁÃ/‚WÞË?ÿu7gù5N6fÚF ¤áǶ]ˆª¿zß5¸; {u§Oàé\„dÂ¥ÓU<ÿƃÄéF˜Ÿ[]Hó £×¨ñ¼úæÝ ðnÊnîÑ×3ñÅqŒì†˜=‰9÷.^}â|ÿúKÀù<ôäµ ««½uèÊkžæíçþNTý´òfO%©¤éOâ[ü†òÀ/qçèD‡úâ ˜<üéØ}WÜÿÿº=Ž6 O5QOü—çïMŸŽíiãR÷©ÄâæMPÌp®ôMž|à">·˜ë¹gL ¾ºnLDD¤U™ Ã8fŠHLLdÀ€-9ù¨Üüî|v1e@·?ãùÁ^:/"""ͪ…¾&WþlìûxöîIl©|‡óð+ãØÎн4…_-§îû Bèæ¦@+"""ÍN¡VN‹Ù§?W_Ìó¿eÁþüûθy·Å^XDÃebA߯¨ ½ÄDDD¤ù©ü@NŸ½Œ´e¿òóÌ%lÞ½ÂJ;Nž~„÷dÄåW1ªw.Z¦‘ P+""""O_c/""""O¡VDDDD^³^ÅSPPМ݋ˆˆˆÈŸ”Ï)µoÖP{ª“9*?‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃ;#C­Q¸€Çãã‰'>þ:þ½¾âÀ¶šÔÉŒ?°í.¾L¯9q‡å«x6>žøø§Y^ÚŒw$zNDDDäOäŒ µ‡ª"mó^ꢫâÔdòZyF§6‹ï‹'>þV>H©jíÙˆˆˆˆ49k³õlËcù3;½ûѶ›¬øö¹†;.‰ÄÍtü®ömJ£Ä舯©ŠÌ¤¬SŸ‹{_žüòKì˜qr9õÝÿ”ôœˆˆˆÈŸHó…Z{ ©ëV³1ûØMÜÜÏç¦K"q;f ºv(`[æ:2+GàkÍeKZ%øFã¿+¹ÚÙÈ_ó#Ÿ|5›õ» ©6¹â5ˆKo¹™‹"= x)Ïßò¶™cyüó§é]:ƒGîþŒ]0®-ó¦.`k.´ï5šÛîKË3©Iÿ’ûú™\Ÿs¸åüJæþ±šŒZb†ý»n<›@g¶} ýžÅÿÝåÏïÍÅå®÷xº¿;Fy _Mæ—•ÛÈ*4hI¿‹oâÆ ¢ð4Ÿ\ÿ`P•³Œo>šÊâäLŠüèÔûn¸õ2zz[Ž>þíOÑí›Çù& ˆ9O\GÖC“y¾ÛÚCž“¾îÇïìmú•Ͼ˜ÁªÔýTY< ì6”+oº–áÝ8Áç‘fÕ|åNû샌ð;úfç˜ëxþÞx7 ¹Þ;*RIέÁ(ÛŦ½ào£™ÛöüÁkÿüžÄÝ%´‰èFt°…¼”|úÒç$W³s(_Á¤w±ßÅwªØ·ao~ºžRã8û,äÓòé€gù’ÿøOZMqã}Ê“øø_ØZ\^·J]ÎÔ§æÝY›Èª &&#g+ó?~œÇ¿ÞAÕIöoß¿˜7~“ß6ìÅ­K?zu¨"uù×<ÿè§$—GßâCÿ뮣¿€ÑWÞÍU‘G.Íž¨o[^o½4…%©¥´ëÞ—Ø0+9gÒs°¦äxO˜ˆˆˆHókÖšZK»ÁŒù!Føú¸sÌuL|âr"NTw€Ÿ.Ñx³‡ieTf'‘i˜ë„ó6•¹¹¸wéFÿ±/ñŸ½ÀÄ—ï§¿3P’Æ®ÛqúoÏå¯|Ĥ·ÞfÒ#ýq*vl!·öxsòbØãïòÎëÿá½W¯$(]6Õ‹,ªüÛÓ¼ýéç<ÚÇŠ-?òënÀëžxç ^|ñuÞyæ||€œ™SÙXfœDÿÕìYðk*ÁçüGyö¡»¹ÿ©ç¸%Òùs™º¾äèã÷mGXßDz¸Úo±~‡/Ðמ°ïêÌÕl«üFpÓ½ñÔ?_ãñK×ÕJnÑqŸ0‘f×|åõ,¾ƒÿÒØžú7ó÷J ­ãØ‹pËã¡§g²—6t8ˆ!—÷dÓwÓØz¢»}™Ì—ªM';'Óq~ªçäë1ÖÀ·oòÐ}ìþí¶ºÕà€1÷sk¬g£-f\üqbë Ç?:ã„}»DðÌÛ¡,š3ŸÅËIÎHbAF ~™Eü+¡«ÍDDD¤õ´Ø-½,Þ=¹ð²¡§h°úݵ-ì™ËïÛl˜B{äÒ¸j2–,c/ð·ç˜øð\Õϲ“¸}íi)_OÂæb *v-aÉÀLL{çcì`ŧs8®@Ùúùl.1ƒ²”VN!ti×è³Å1û÷Ä?²®Ž£¬Ì›èÞqÄÅõ¢“[%%Å%ÔX-'q±–qÔUhçôm°wág¼7e>Ù¯åÙw¦0eÒSÄw2-åëóO¼,"""ÒŒ༱3±áXæl È=;âaÊm´Ý‚[[w =?¼ÄÓ[ü)KÙJÝÉtûQï'ö¿(aá+ØÖÑ—²ô,J€¶ç\E?ä}÷˜+ºœ2ðò½©t 3“‘œN tñÕôò2Aþ‰úwÆíÜ1DOÿ”­ ¯òTé ÂŒ Ö¯N¥Ä©'wýw0Ǭµ09ãá PÌÚiSYxÃßæÕ¸¡'軳W IËS²<‰ócè`ÞÏŽtð SD[޼_„ˆˆˆHËq€/_0áÞ› ÜèÜͧC¶[ s/×÷뀋‘Oƃ·<Ä•AY¬XŸÇñ.;eÞgñ·Q°ïɢĭÝÇ<È+wÆáy¼eR—N\=ñ_Œ?¿Aæ’“3! †sïx•—¯Äõ$û·\įÞÅyÑÞä­^Èâµ{ñŒÍ„Wa¤ÿqb¥Å—~WŒ Äö¯þ™yÕG69Aßžqwòü½cˆ 1‘´’•ëR©lßóïx–;b=tK/iU&Ã8ú i€ÄÄD Ð’ó9c¸¬ïÅüó›é|¬jƒ3´‘?3X©9>…Zqx*?‡§•Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡×¬_“›˜˜ØœÝ‹ˆˆˆÈŸØ©Ü…«YC­n&""""-Aå""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§P+""""O¡VDDDDžB­ˆˆˆˆ8>z‚8·#û¨ÍœÊÿ=ðmÿï3^â…©ÅBDDäøZu¥Ö^¼‰iïÄô5EøvÆe׎eô Î¸e/bê¤O˜VŽqý˜ÝBˆt=üþÇŒnËg餉¼¿²ûéloBUé¿3åÛ9lÚ_LÚÒiLù.‘|[3*:¶ü¥¼ýàc¼7;—ƒ®bÂãpÛŽñHý‰7þï &o,9¹÷˜gF޹”³ƒÿ·@kËáç®á¡™ûÐËYDDšRë­ÔÅløùg6ÇßïCL›†•ÈhbûÆñýÇü:u6Q÷]Nè º2yvæì ;7÷Œ[”KØp.,ŸËWß—RêÀ ñqøj±VN…=ŸÅ“Þa±i$ÿ÷¶kx»÷gØùç0÷õÇùàÉôyg]OЕÙ;–+ÆÅ6÷ŒEDDN›å¹çž{îX³²²n–mù‰L›•AØ×1"ø°š‹¡.ìX²Œ¬}éášÎÊ ûíeÎwS™öûbÖ§áÒ‘ T¦0域“Õ¹?Qm,•9¬þí;¦N›ÎóW²9»Š¶aáø¹Ö-LÛŠRHøá~øy&s–m £ª-C ñƒw˜—g§tÇ ídP¬ßÁÔoËcÑ{·û¼û Þ]ìBï¸ \MU¤M{ƒw–¹ÑÃ|² w×]ÌùñG~þ} ÒKð ëD{·ºywž¦²/  n4QYk)‰ìC'O•@ËÉ«ÍþƒÿNÞFô}Opu¤Û!+¬&k:vugýÏ¿°#ü|†xlfæ‚R"ƒv1å߯3鳟X°!Ï.=ocÅT¾†ozޱ£èãkÁ(Oeö‡ÿæõ·ßãóof°lg~11¹×½FkóÖðí›ÿäIŸðÕôEl+÷£{øý¡ûø:ËNáºü¸%‚1Ãpj§GDDþdZ-%UîÙAž9˜žaG¯5·éL7{väQP½“_gçÑé‚ë¸ã¦ÑÄØÖ3íÓél+?ìä©-Ÿ•_~œ¼P†ÿývn¿a‘+øæó¹dV•éüþÉ׬6z2æ¦Û¹yL4•+¦òýZgŸÀyþ:\xOÞÐׯýZüzÈö„ÇvÁ5g=©%õs¨ÊbmJ5¡ý£ð2ƒQœÄ/sö|ÎÕÜ|ÝDV¯fê'3H­<‰yâNä蛹z`νé:†´oõògq(åéëȲD14Úó¨%–v± ¶‘º.›j€ª$>˜’EÏŸâÕgoc@mo?ù.kJ{Õf3câ“|‘Õ…«~•WŸ¹™¸Ò¼úÌW¤Tå›ùô‰W˜e?›;ž{•çï@ÙŒ7xm®™K_‹ëB¬„{‡¯ŸîËŸ©^DDZW+%%;U%•.xkw|Ü¡¢¸;`àJ·K¯`h”JàÕv²ÿû+Ëw^Dרƒ»ÕìYŲ½ÁŒ¾ïz{™€`‚üMd¿5‹U9#ð-_BRE—_1Œnž& ——îç·}ùTÓ&L&3棤“É|Èvk@,]\§°>­”Þ±^Te®e‡­#c:{b*g¢.‰gDŒ&:ê{þ;“eiçÚæøó wÆìê3€›GÓ>ýò`§¼  õmQkñ¢C(Ï/¥0pgÐø{¹¢'&ºÐé!©>`zR1}ûÜ­:}¿¦Grû;72Ü× DÒ9ÄÄŽ»>gVêß ,™Æ‚²8î¹7žÁÞ& œ{Šrø0#›J‚êÞCf3棽ÉDDDNS+…ZÎnNP]Nå±®¸2ª)¯'o§ºU&³?]^–mò #Ê×`õžj„ZƒÊÜLŠk2™þŸ—™Ñð;Ó¨¥Æf`”TR”“G­ï@Ý6Zñ<–›lù§vÎôîâ—ëÓ)ëIΚØ;]N'ÖÍ9:ÄýÀ*™É3Œ(k³‹)«:ÞçrÈ¢s%›~žFûÑgÑÑ¥€äù3HwéÁõ8;ožª5”&` dÔý·³áñyþÞŒºìz„{cÏÝÉÚ¹ÓX˜æÍˆ‡ïd€·‰Ú}`¢œ•ï½ÅÔ[® —[6‹¾ú”ŸQLìæ~È{Ì¥óh. žÇ·¯}„ç¸s ·íbÙŸ3ÇË…^Úö¾Œ³œ^áý·„«úàS¼†o¾X‡qÉu´³š0›l”æd°·°-Þ.ú"i­vK/³{Ýc;âQ‘ÃέXµr ){+pèÅð+®äœÌ€½8…ÕiÁ\2ÒMóç²`u:Õpù5çáa†Ú|6,OÁ½÷@¢¼ÛÖ½ÎYëXºh+6eR<„+®L°« “S;¢bü(Û²œ… KHÜ^Œo¿K‰?§#îV ÖŠ,6.[Db~8zøšúÍGÛnÅÝ9‡U*éqñyî·k/ÙÎÊVÎÕžmóg³ q¥¾q\|ÍEum̞ǧHS°xufððî´)MeÃÊEÌš9—5»Jp ÆÕ÷ÝO|Ï6X[þfoŒdüXO–|û%ßÏÞDEØhîyìzzµ1CM‹¦¯ÁkÄhúø·#ú¬¸ì˜Ï/?üÈŒ%)TE^Î}÷]B¤»“K }…P´ò7~ø~³ÖæpÁxø[wÚXp*Mañ¯?ò{N7. [z‰ˆH“0†qÌ/JLLdÀ€-9ŸÓS¹)¯ÿF»q÷1:¸¥EÚØ¿â#&-ïÄ­÷Œ"¨~øš¬™ü÷ó|.y𺸿‘3^ùj^¼íC‚^x‡[#u£ˆˆœyÿZ[%ûw¥’_cÁÙÒ²+œFe.»¶&2{Ñ|ââh¯%'ù3²•±'y95V\¬:‹ ""g&‡¿£õî|üÍVܺ¢·_ËŽ­ ‰ß~X…Ñù\.äïøO¦ÈQTnù˜Ç_MÄsð8F¶ø™‘“óç(?‘¿4Ç/?‘¿<…Zqx µ""""âðjEDDDÄá)ÔŠˆˆˆˆÃS¨‡§[«ŠœÁìv;ÕÕÕTWWc³ÙZ{:""âÜÝÝqqqiíi´8…Z‘3˜ÙlÆÕÕWW}ײˆˆÈñ¨ü@DDDDžB­ˆˆˆˆ8<…ZqxÍZS›]Ýœ½‹8ž çCÖ{DDDZÚá¿‹þ,´R+""""O¡VDDDDžB­ˆˆˆˆ8<…Zqxúò‘3˜[YAkOADDP…‡OkO¡Å)ÔŠœá||þzÿ1‰ˆÈé+(øk.ˆ¨ü@DDDDžB­ˆˆˆˆ8<•ˆˆˆH³(,,$''‡òòrl6[“÷o±Xððð $$OOÏÿDcÿ–žÏ¿×g°>¯”âêÚ&ÀÛÅJ?/žëß‘!m›¼G¤P+"""MnÿþýìÞ½«ÕŠaÍ6ŽÝn'%%…¨¨(¼¼¼ZtücýÝŽ}<¾"•ÏGFÓ×ß 'K“]\]ËÜÌ.¹‰_F÷àl[•ˆˆˆHÓËÊÊÂjµR^^ŽÝno–1l6¥¥¥¸ºº’••Õ¢ãoìçW¥óùÈh†y7K hãlåÊÞɳ‰éÍ2†£Q¨qpñññÄÇÇ·ö4DDQYYIEEE‹ŒUQQAYYY«Œ´±·UpV@ˬœ^ÞŽ5¹%-2Ö™Nå"""Òäš³äàpG«—m©ñ6v­ÝÀj6µÈøm­5CÍ®#ÒJ­ˆˆˆˆ8<…Zqx µ"""rf0YqquÅÅIñDN]+¾jªÙ3ó_|øáRŠšç¢ÈPNê7²6¯éï½'""ò—br¡}t±½zC—–©I=0¼³7!;êëB‹l«à§¹ì÷LKâžyk³®DÁö$)Ôž&çá îa&¯°”}Ä]G›æ¹H“1{vaä˜K9;عåV"ŽPÍî…ËÈ(LdAZ §Z[??p Í܇>‡ŠH] ÄϹá'|#š;ØÚÙ°f#7í¬ /mƒgçbk´ù ¨®Ý¢å¸'£¶U"Å™sK¯ÊfNšÿÅý)]¶˜Ô=Õxt:‹aE’?o:ë¶ï£Ê5˜î£Ç2¨‹öì™|ÿcý†¹±cEYû ¼Âb0ú|"|êË^²µ¿Ïakú>Ê-mißegߟö®¦úñæ?Œ²„ßIuJ×Â?HÊf¿Å')×pÓµ”ošÃâEIäVaö$òìËÒ·Nfƒ’”]xŸOÇ ËÈ®D ×ñQ¤µ™½c¹b\lëN¢z7‹–ï§Íké¹ák¦1.:—Ö•ˆ´“«ÉN­ýx‘͌յ¶¦¯U<2Ð6¨ ¶Ìμªf”fzÄváñô$^É«ë=?mƒg”0¢8›‹¶ ëÚ…—‚­­¸á8ΜP P›Ç†ù ºø&âØÎÒ©³ùí½Õ„¼’1ídÍýŠåsVÐ5â|ÚFI‹:{þÕôq+`çÂÌ\ÍÅã/#ØœÁŠÉ_±Ås g_})Þ5lš=“éSáêëÐÀ^ÀÖßæÓ&r¢»Ó%¸3.Ÿ¾Ïޏ \Ñ×ö%0{zîCF3:‹ŠÔE,™5¯°ñôõw'ä‚› töÀÜ£†ë™õTÊ_[mÞ¾ÿà ælÈ¢Ô9€^£nä®±ð«^Ë·}@Ð ïpkÐF^¼ó ºÚ÷$˜Ý ˆŠ!¬­Aaz2;öUž°<ð¤Ç?f mмÁÖìâÍÄËbá—ƒÁvf6?6jÝ¥Ãý Öyõ“rf=M†™öç\D·p¼ÃûÐ3Ô Aç2t@¾íÂè: çŠ|*êÏ8zQ<ýºw" ¢ƒ¯º˜€ªlØUNuæ2¶•†0øŠQtíB‡¨Á »l®+Ùž_ßAm æ^c¹pÔP¢Ã½0›Í˜0a2™1™ÁV¶—RS{¢úô"$4‚¨¡W2ꊹÕ=mfWœÌ`qóÀªPr†0Ê7óé¯0Ë~6w<÷*Ïß1€²oðÚ9Gžn¯Íææátþ}¼òÖ \žÊOÿùš”*0J×ñþ“o²Äe$^x‘û.òdÁ¾$µº~ßš4¦¾ú+ÜGpÇÓ/3ñ±‰+›ÅÛ“–SxÌÿý«Øµ`q ‹ð!rhw\ŠIhT‚pÂqk³™1ñI¾ÈêÂÕ¿Ê«ÏÜL\é ^}æ+R*ã—-˜+_‹ëB¬„{‡¯Ÿî«@+Ò*̸µÁ× 0{Ó• CkøLwºÄÖÖXñ Ä£‰RË‘ÖvÈÿ¿O¡yK‚íc~Gö®@{êάåE‹;ÞmjýLXœ¬¸ºûÐP+n2;a2Uloö§c°ûšÙ3ŒPoÛr )uÉ£¶M4ÞN~‘øY×’[T ^€ÅöaÞ«Ö)`]}¾`áÛo²5&†°ˆ.t샛^ar¦2(Ý8eqÜso<ƒ½M@8÷åðaF6凇M›AÛ ïâÚ³‚°í®<‹ŸžÉ¤ Æ hÝ4–VäÁû®¢¿— b:rþþïûú}íVBÎÇÃ/"Î×tÆwïlæý‘K™ ¼ö¿KU: + qN¤› ×.ȶ¬bUB·DGã‰ǭNŸÅ¯é‘ÜþÎ ÷5‘t1±ã®Ï™•:–.w\`r³Ô}x5›1·Ð7þˆÈáìTìËd¿_D}°õ$$¦3¿Ë Ÿˆü\,f£(3‡²&Y¦5ãÖ!ô` 5ÊÉÙž¹cW:8Ô°g*ÕÁ]ö0Nø†±w%Íp·&{m-yÕG®”TÖRªBÚSrf…Ú£:Î/“‰C'Õý|̯Æ3™£á$‚ÉŠóq®®4¹E0䶇蒚Lúޤ/˜Âª?‰»nýCT(g¢ZòR²¨íp1^ ¯m'BÆ<Ê åkmnñ"ªk»ìLN.XÍ5änËÁ4Œƒýø÷ˆÂcjNÝ.aŒ¸Ô›Ì”ÕÌ_²“íÛ6±nU:µƒ9»ª´ ݈‰€WW†F™HZ•@êÍÑĸžh\;e)äWoç½ ×óaC£–êZ;FA5FÇã—ˆœ)ŒªÐî­h²ZZ{å>RÖâlª¡ªÖóQªl¥dmYGžTW7ýÝjËó˜pX  êÈè‚]¼×Pc«`{J;ÔRÉÿ³wßqU•Ç?ç.¸lA@Y"¢(š+9pUšYæÈôgÓl_–ÙЦ6l9ê—¥–eîr¯r/Ê­¨ €#@E†pÇï7½\^ý¾_¯^¯äÞó<ßgœs¿÷œçœ›6û7¼Û7¥º.ýËç’¥‹£cMWœTwåú-«~[ˆ¦Uî¥Ù6 E5:å«’òÊSP§sŽr²Àgs;—­%_•B\ˆãÑìÍQáïVá’!ª–ï0?”…ÿ°¿ #~î `âÈÂ÷y}"/<åSÉr´øFø¡ü™ÊÂ6ø¸)€‘w¦qʬçÌ2‡Ÿ™È+_=K‚ @){¬œI)ÞÇÒu'ÑÖÈýbПKROnä‹“Y¿tÅ1Ñ6êUáŠ[þ.ÒK $úŸ9„™rÖð¿ÿí îá~$ÉE!Šåô¿¤íP ¶Þ—d%×'¡=_¯©›´9]n¾pµÌìØ~€oN\øKhLþº³ÕK½ðžµ…wŽKl÷óAv5ÆÕ' ØâØä´¡4KöæÐâÉÌšò;4 hÝ·3Áz@Êý$^¿—5SÇ1sÆjN†¤ÐµgîµZåF`l-,›'3ã÷ TahÛ"ˆã«aöw˜¿lÎI=i[ßÛÁ;Nܺ<ºÑT»ž¯>û•µ;÷±{Ýt¾ú~3–ˆh|*ýmL…WÃn4R­fìg¿±vç^¶.ŸÄع9 (((h\Ã_Ná‹aS)t ¾Ýs¼|OÚÒc•/Ç#‰'ß~œ‰c§2æµi¸G%ÓkHJ>ÜŒ^« ëÏΣ7i+ð&¬a ÿYŸÅ£Ç3å×4~6·óGá"ö.^O¾wKRj»”­ p{Í IDATˆ„N‰èßÝÀÒ}ÅÄÆZ¯m(ÝGŒÀiÜD~y1¹&!ºóêÀ5Tpæ"j/âšÕaδ‘¼”óß¼˜pf}¯¢JYбw›™š¾¨r3H?vZ‹‘âàìb§7àë®Ê‰n-°8¨€èp//úN®ÒyòV·úÄgkéZSóõæ– X*¼« Ö­[GRRÒžu]NÙŸaÌšÇÔshùTBd´…ƒ,óUR÷íJ–!„B‡'gj…¸ÉåååUuB!ÄMO’Z!nbÖ~»[!„Èò!„Báð®ë™Ú@§ëYºB!„gÈ™Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©â–tš}ãfÈ 38fªêX®LÉž¯ymÀ»l/ªà §VóI¿Ç˜•^zCãº&9ö2Ìy‹ù°ßÓ,È6^ÑëBØÍ’Ïæ7{0äÁKÿ{æÑ¡|õÓ:rÎíV·Ð~&*G’Z!ÄaÊfÑ ðÞü£Tyž}3Åb‹#Å*Ä•¸Ò9^«OŽÉs#Fòì°Wy M5Òg¾Ï7³Ò‘¯P·'MU „Ba/Å%ˆˆHœÏþ»ft$úƒ·r5Ǻ†R½J£UA’Z!n…ùâ©ï ܞܙÓÙr ¸nô˜ÀÁ¾dÁ¦ƒºDÐrЋÜÝÐsÚÞþ¸N=ÝØ0{9»›ñŽN¦Ë >Ô÷×`ÊÛÌüñ“Xµ5ƒ|/! ï¦Gßö„º*gëû‘ˆçºs|Ê6ºsÇ‘oY” üïqžÝð2ïý7åà"¦ÿ…{r(Qœñ‰nMçÁ}Hô;S'6}Ïç¿,bÏQ ÞQ-H؆A:”2M´îã¯IãY´n7¹Å®$´§ë€žÄù”9Ì3YðÒÓ̹$–†è¬múï¢È9]Q?xµ?VJ8úç$¦N[FÚ±"Ta$Þû÷µ EW¶Ó.c%?-`¡øÀB~™8-{óÐÕ£y×hÌmoýu{ë³£-vŽ‘ÚVÝgË«ùä=͛κíY½ëÒjÐÓ¤Äë90á >MïÅÃÛâ¥(bÏ—óÅ‘‡xãõ6xª®G;O³ÏF½†ï—æ¼Å|¢]õ3ûÅéíŸ2|t)úQú‹ª2fÉ«O±4v$¯÷‹@kÎaÕƒ™šÑ€Ac_¡®›Bñ?ñú¨£Üýé»$.¹²¾Œ-`Q9sÜ™+ hÐé5`,Æh)g¶YÝo®nŒ*}üו,?âvQ’É’wQ«÷p^úïýøîþ™O‡¾ÏÞ¨‡òþÛÜ–Éòïçqøìò3sÞr¦LÎ äžçòB?b‹ðíãØU`â]ÌxýŒ£Ë #úDg|vŒġóù÷ÜõCÓaV=…£áéÚé:C— }>ç£Wq.ÝÏ~Í}+z¾ò.CŸïKLÁ|&}½š“ç>N§òÓäL¢z¿ÆsÿH]ãR& ÿ‚mùe>±ŒY,{ï¿ÌÈŠ¢ã3£xîÕ‡‰)˜Ë7#~ä@q™÷j‚¸«l,•ÙþZößŬõƒÚþXã›/—¡j6ÇÞxƒÞ­ô¤~ûKUb]¡11å®àÛ7¿á]2½þû&}SØ1q2状õº½õÙÝ{ƨ2óϘÅʉ‹Ñ´ÂsŒ KÈ>ŒÌÓ:j4OÄõÀRvŸ8›²íaõæbjµm€GÙOÖkÖNõ–Tb¿¬,µµT#Û6Ž›€â ¶J÷±=»(åXêN6!Â%ýÊûÒTίt&L¦3ÿ™OŸàð†_˜±¦·º‰T+ûÝÑÖ>~5cdÏñG\WòBˆÛ†šš÷ y¬ Þ$ÇLawAoz¦Äã¡€WJ<óFg‘o?À‚ŽØÏЩ‘; P³:ž%Ûûâ4‹5Ç#¹÷õ~4®¦" 2!í¹¬ÏnKGoÀX‚ªå‹<Ú=äÌÆtE¥BQ)Pª! uúµìH¬—ÇãèV/8F‘ œ .Ôôw%¸¡E¡& ýš%ÿœ¤Nü…–•¦Ïgiz=G÷%ÉKD¤1ä;VîïEÍÝ%=¡¨Ô—ÄRºßÆö¡×¶ÿ¢b. Æl½ÜíŒõ>c:Ç•`Ú¶mA´· "‚ðÙ…ÊP‰sVc1Q²f&;4ÍüôýÔqS N$–}¼9>0‘gõu{ë§ãö¶¥òc„ÊF¿˜,Ú=F—&¨ÏnMYøÖ!N–‚Sh2u\F°vë ’Zxqzïb¶•ÖáxÏË®"\ËvZ«÷ô®ñV÷Ëö®¶§ÀZª%Äã:o駺♛J¦s=ùl'mGæ0 i[sñLHÀ[¥¾ª¾Tô—Îñʲlû€Wú\ú7çè z°ÎeбyŒ»ò1²÷ø#®Ij…¸]¨ øû:ŸýÀUÐ8iq1ø£?{ðWÔ:TJñEï¦n„áü´Ê3†Xköã¸K&¥ÞI„yªÏ¿Ý)( í"Ò•‚7 v¥fŒÅ];yrxÏÖ¬J#}÷V¶o<€ÉÿŽ‹b¨A\-׋bˆ&6ÀŸéy˜Î'µfŠíæxɦ }ˆŸÎ½Ùb¤ÔhÆr¼ —/W¸Àb{ûÐkÙ¹˜.Nj+ÓvÄêT·ýG0ù©GYÕ¸ qõ‰o˜D€«ºœòʰK)¹iÇPÕ¸÷Ì“3Ľv}|Õ+*ñº½õ®–m±gŒ*5ÿ „Fúœ¿¤©hu¨ÏýùIõõ|¹|+ùÍphñf,už"ÒPÎL»–í¬°^3'3lì—v%µàܘ0íþÎ( VÖ6 ƒ»Ò$ü©[Ò8•¬aÛa7j÷D£Ó]]_^©Z}xòáXtŠwuªyé¹¼×*qŒ¸â1Rq2õjŽ?âZ’¤VˆÛ‰]GVU™•³™r/¨) οªèÐ[YÄi9µÙ£Þey~8õ’ܗĈñŒ]viÊÅEX,˜- Ò\úih1[P¹·bàˆ vºt{µ‹›ÍfÛÜÞxþŸv¨¨ÿ.í½ÊõCåcU9ÅÓcÔxš¤®&us*©SÞbÎø0Ú½þ&"õV›`+•J¹|û‹þfëu{ëSÜ® -•£Jõ»¢E§­¨@g‚[$¢û`){;³ñ…è!±¸”óökÛΊë-(·?Êì—ec3c²Tð%AFýZFfnN#=û(^ ‘Ô¨Y§ÅHOÓ’©‰¡U°îôå•){£˜5¶öNmcÖÑ4¿Êã¸v$©B”ϔɶ…4¬wæL©ùÄN¶QáSË/} šÜ­ì?a"Ð÷ÌbIf*™¥¾4ö-»˜­< ·ý̒É þôYb\JÉÞ[|éG¯é ÿ¤Xÿ̃)o+[h ˆðACæÙ7©Ð†â’¿‹ÌRuüÎÖL¹k˜ñÃ"ûö#ÞÉÚÇŠR‰ííé¸s±WÔިɶ¯*ëCÔÜ1›%jѪsG:7ìHçGX1ìI~_’N»Èh*nŠ­X´xEøaÞ²žŒ‚fĺ)€™üÝ©gŸ…lëu{ë3q2uæ¶Å{û½|ºZÉÄ8½Ë’ߊ8¢iÀ (×r˜kßΊêu±¾_*#%¥çZYJÞÎ ŠÍµÊo b Vã NÍYÄš"zxãì× ã·¬Z¢ÂX³Á. ×]}_^_¶Ž} ßu¥ct;“¯æø#®%Ij…(`ÓWŸØ¿.‡Ùòó8öê›ñhœgu{ ã×O&áÔ«9ÕJv±ü»¹äG  q N—Wž‚J1Q˜}œ\³fƬß˾Ìê …üýÍþèwµõY¬Ÿ:‘žííÂÅ´t K¡Eàbæ‡kŸ6šÒÙ<ã;þ²ô¢…[y×8/¥š­íK®mÿ]øˆSPÛèßöĪAcNcÕOóÈQ=±ޔd¬ec¶ ß;=ÑX Ø÷Ç4¶˜“hŸ‹ë%Ÿµ¶b)¦Q£.DOýŒÿ}ZžÝêcÈ]˼ɻ1ã¨ñ²úúåc`½¾"⬵åJ†Äž~¯V‰bôa4IÐðÙÊ=¸µêC¨¾¼7]‡vVP¯.Êú~©”øáët„5³V×#ÕþùL[” ª ’ZT¸Ç6Æ{âvjià„âN¿\¦o„µqUJ®º/ËÌqw#ûÿ˜ÆšÐ±Côùå#WÃú1B}Ucäj÷ñG\/’Ô !Ê¥8ÅÒ£W[&¿Ëœcà݆~Ãû㦠ýo¾‚~Â$f¼7‡|/¡ahßøV´tSíEäuX:}$æ¾Æˆ§ûÓ§ãh~ž<ŠõxÜ …ûGÔgõgã™;c'1A]­ýîUX6e$¿ç¨ñ«Ó•Á/ô"L¯À©‹ÊÖ†ÒnØ´ßNäsÂd zbw}8¿òŽrecy6ÁúöWÔZë¿‹cw޵Þõ†ÄÙ«ñƒÐýk¦ÏçSL¨ 5ˆíø<÷µ @e>FæŠ9,3ûÒ²C,e—lÚŽ¥%/á—ñ¿0å_QW¯GËO`˜ð+*o믗e½¾]Ô{ÒJ[ìûÚ:°2¥è n^ç•;HH§¢Û®};˯WÑÛØ/õ±Ü=¸ß};ŽŸuÂ7ºmI¡hâ‘ [¨öM Ö{ G<¤T^„×õ… ñuL«ª^!,?¢ ݬË„BܺdùB!„7)Ij…B!„Ó¤V!„B8ui5ði:ÕóD……Ó1}ü/lÜ“C‰âŒOtk:îC¢÷Ñrãq.Óä Û㪜í‰x®;ǧL`³×Þx¶XÈ/§³eoÚ z4ïͶñËIõíªk°Xks¹e&\×ÙqܞܙÓÙr ¸nô˜ÀÁ¾dÁ¦ƒºDÐrЋÜÝе=ý݇Ö'&±Øžq*7æXNþ9‰©Ó–‘v¬•G‰÷>Á}mCÑ]œ˜³äÕ§X;’×ûE 5ç°êÁLÍhÀ ±¯P×M¡øŸx}ÔQîÕƒ-þ±2ÞT¢o­ÏßËæûã_ã7ìszTÿÇ®>7§Màí éÔÓ ³—³û°ïèdº êC}­ýsËÐ;Ž|Ë¢Ëæÿ¥ñYk›ñÈ_ÌøæGÖíÌÅ)¤1mî‹dÃgqç˜wIò¸4M+µóTk¥M6Ë¬ÔøÙÑ'áNÖË£„£•™£æþ6˜ŸöŸýwø¼ý²;? ±¯ýöï·ŽçVý™\õðáÇWôbff&AAA70!n/ù×ëšqi6ëgÿÎ?Ûó é6˜ž÷µÄ;csæçÝ®^Æ]üöêp–+͸÷?h“èÃÑE™¹Åƒ†w6 ®MS´ëqêîOy³$N¦l–½û³óÓí‘´kŽqËT~_HL«zxj.údQ¹ÖºÌöÆlÖÏZÈ–ò‰êù8÷u®[Æü±¤ˆ¸»àaÞÏÜá£XïÕ‰ûÇÊx[²lÇimþ–½ÆXšÍú¹q½3…XÃQ»úÜõÄf–Í[ĦÝÎÔïõ[EbLÆÌy9„µjˆ¯y·}s+¹­îoƒSÙùq|VÚæY¼™É¯¾Ïß¾]xà?èŸÅâ 39tÚ‹øNmr¾tî›ólį”3OÝ3˜a¥MÎÇm”©²sžÙê÷#VËsËþ•O*3G‚ïLÆ}Ë|޶ùÕ+wß·Õ~“û­fµŒ¹2dù·*“C»ÇèÒ$àÙ­) ß:ÄÉR(N›Åšã‘Üûz?WS‘ŽöÆ\Ög·¥cu5 ŠJ…¢R(Ý?Ÿ¥éôÝ—$/AHBÆïX¹¿5ct—T­¨.Ý ÞýWGEÞÝ7³üí Nµ†€Öýéײ#±^j £ X½àE&p/¯¼‹ï²ÑoÀX‚ªå‹<Ú= &þ7“šf ~ú~ê¸)P'’Ë>ÞŸ@iº6‡–-³"jjÞ?€æ±(x“3…ݽ陇^)ñÌE¾PÙ׊ÅÎq*'æâÒ9®Ó¶m ¢½U„GÈ.T†²çCµTKˆÇuÞÒOuÅ37•Lçz4òÙNÚŽÌaÒ¶æâ™€·:×êx—fW"N+ó6T¾Ïý :b>C§Fî(@Íphèx–lïCˆ“½s 0¶:_+n›…üÔߨTÚ˜w§®AèšôÍý›‘¿VÜZkñGÕ)gÌS'XmS[eÖò¾‚}ÃJŸØÚ×î3VvŽ^zìQŸ«ÇÎöwô¶o¡µ5Å"I­·*µÐHŸóg­µ ÀÄÉŒLJ½“ó¼ðuÝ)( í"Ò•Bõ‹ ²Pth7ÇKö0eèCütîóÈb¤ÔhÆr¼ :Ûk×Ô‚ý/ŠÇ™ó'xu!4îäÉá=X³*ôÝ[Ù¾ñ&ÿ;*ÑÐJ´ÇP»R3ÆÿìA¯”Ü´c¨jÜ{ærã™q¯]_õŠÊµ9´l™·Ûß×ùlÿ(hœ´¸üÑŸ-SQëP)Å× ®,f]­4öÁä§eUã&ÄÕK$¾a®—ŸÊq nL˜v gP+k…Á]i~„Ô-iœJÖ°í°µû¢!×ÊxW6Ίæo%ØÓçê`êFÎÏa•g ±þ&Öì;Æq{çVåâ+¿m¥äíÎÆR½%Áçç¥ï˜HôJ¶•ò*Š?S²ñUbq·Vfù…×hß8³¡ÍùàT·òs´üþ±³ýÞØ?‡ÄMA’Z!nUŠÖŽÛ$ ær°c1[P¹·bàˆ ¾d-–‚ÚÅ­r7cX‰Çrj³G½Ëòüpê%5$:¹/‰ã»¬òá_^_™ö(:ô-ÀS©”Ëã¾èo6Ûl¼¼ÌŠc©\ÈWÛW³âOQãi’ºšÔÍ©¤Ny‹9ãÃh÷ú›tŠÔ_º>ŒúµŒÌÜœFzöQ¼"©Q³6N‹7ž¦%SC«à³§Q­w¥â´sþ–eצª2 ³‚J‹¹¼½›sËvlµÍ‚Å|yŠ¢PvÅÍ¥*ŠßŽø.Ûÿ­ôɵÜ7°=TNvÌÑrÛv%íÇÎ9$nòH/!n;jÜCÑäneÿ‰ ‹zK2SÉ,õ%Ä·ìµ4}`(.ù{È,5àîé…»§®æ],üþ7Ò ¯öA ·ý̒É 9‚¾½»’T?×ââJ>¿ÒÞöhñŠðÃ|h=çj1“¿;•c¦Ñæò\m?\IÌ&N¦Ngæ¼ý¸×ïHçA/óÂØ±ôÞÏ_KÒ)½¬ µqjÓ"Ö¤»QÛçà†w°jÉVŒ5›ìr=â¼ÎL™l;Px¾ŸÍ'v²ýˆ ŸZ~xÙ=·®†¯0?”ìT2Ï÷ƒ‘¼Ýiš¯$þònbªäþRa™¾®éøÙšFûæ¨MWr¼ŽBÎÔ qÒEu¡±Ç0~ýdN½šS­dË¿›K~Ôj9sVÆDaöArNxP-,…‹™7f®}ÚhJgóŒïøËÒ‹nå}7.³½ÕÏ µ‹N…»Ù°rº0='wÌgÖÌØõ{Ù—Y€o2åy\ºÜÁf{N—­SW£.DOýŒÿ}ZžÝêcÈ]˼ɻ1〓­6_ó'W\A?¸Ù9N—ŬBcNcÕOóÈQ=±ޔd¬ec¶ ß;=Ëù€PáÛï‰SØ©M¤e€Šs8uür™¾BÔÆµg·n|ßÚRÀ¦¯>%°7"\³åçqìÕ7ãÑ8Îj{çØ7ÿ/¦Â=±u'À_þÆý]ãq9º’Ù¿ç€|Eñ—76÷—ÖËÔé®dü*îëóAcçµÍþã…p’Ô qRô1Üûæ+è'LbÆ{sÈ×øÚè†ö퀯À‹È;ê°túH>Ì}Ï&ÐnØ´ßNäsÂd zbw}8¿òŽ"ê2Û?j=çØþôé8šŸ'b=Þ7HáþõYýÙxæÎØI½!q—Åsñ£³l·çr*ï–<<¼„_Æÿ”w~E]½->aÂÙ;r´¡ÖÛ|/ûû!ƾqº,f—øA èþ5ÓgáÓ)&T†Äv|žûÚ”{)Oí›@¬÷Žx4 H¨¼¯ë :âë”ó¸­òTAßZ£8ÅÒ£W[&¿Ëœcà݆~Ãû㦠`ÿܲwþ_‹{½ßxœ_¿žÊÿÞœ†[d2žèAé˜Í8kÊÿÆ`-~ Ëy¿ý¥ÔV™\ÁøYë«óA;ç¨Í>¾‚ã…p òœZ!ªÐu{N­¢RJÓ&0â­,z}1Œ:6—N\æã;øg¯šZõ£Î>*ÊBQêÞšàÁàZæù¢×#þ›­Oĵw«>§VÖÔ !„7 KÑ|ò“çm&+÷¹i˘>q šÄæT¿E!®Y~ „BÜ$ÔÕSøôI¦þ8š÷¦¢¸úQ³é“<Ñ+Éi…°N–Q…dùBˆM–!„Bq“’¤V!„B8þ5~Ã>§“xûãB:õtcÃìåì>lÆ;:™.ƒúPß_{Y˜–Â}ü5‹ë´ IDATi<‹Öí&·Ø•€„ötГ8Ÿ2‡&c& ^zúÒzÿÛµííìsÚ;b·púà"¦ÿ…{r(Qœñ‰nMçÁ}Hô>j¬”pôÏIL¶Œ´cE¨<ÂH¼÷ îkŠÎ|Œ•¯=Æ42üíx«­ ¼•¸ü´ד¬aùË—Çì\¦tSÞfæŸÄª­äk| ix7=ú¶'ÔU9ßß5Ÿ¼‡¢yÓY·= £w]Z zš”xOTöŒ·é0K^}Š¥±#y½_Zs«ÞÌÔŒ û uÝŠÿùˆ×GåîQ=Ø2l~Ã>§GõlÄ`¥Ÿå4¯O–q«*ÉdÉ»¨Õ{8/ý÷~|wÿ̧CßgoÔà yÿmî Ëdù÷ó8lÏRLMwC— }>ç£W/K|ÌyË™29ƒ{žcÈ ýˆ-ZÀ·oŒcWA™Æ,–½÷_fdEÑñ™Q<÷êÃÄÌå›?r ¸Ì{Ë«·2ÛÛÙ•޽t?|ø5[ô­èùÊ» }¾/1ó™ôõjNªíÕxð7¾ùrªfyì7èÝJOê·±äP)¨\jÙ™ä–5ÑÛ:b[‹ËBÅõö³9®ïbÆëï°èd]^ÉÐ':ã³cœÏ¿çÖ+³X9q1š6Cxîƒt ÙÇ‚±“9pÚÎñVûP»A5ò·m㸠(Î`û! tÛ³K€RŽ¥îát`"<ËtŠ•¬ö³ÂáÉ™Z!nYjjÞ?€æ±(x“3…ݽ陇^)ñÌE¾ªÛQª¢R£  ¨T(ªËOoYÐ;ð:5rGjÖ€CCdzd{¢b.¼¯4}>KÓ#è9º/I^* ‚ …Œ!ß±r/jÆè¬Ö[ºßÆö¡öõŸ±cÖк?ýZv$ÖK „ãqt«£ÈîvÆzŸ1ãJ0mÛ¶ Ú[Ax„ìBePâJXÇþ„UfplÄåt¼âzlkñ®Y¬9ɽ¯÷£q55IáioÌe}v[:z& †vÑ¥I *À³[S¾uˆ“¥PzÈžñÖR-!×yH?ÕÏÜT2ëÑÈg;i;r0‡iHÛš‹gBÞêÜKµƒÑJû…ŽO’Z!nUjþ¾ÎgožQÐ8iq1ø£?›¯(j*¥ø:ÔLÝÃù›vTž1Äú›X³/ÓùÄÐLÑ¡Ý/ÙÔ¡ñÓ¹7[Œ”ÍXŽ—`Ag寋ííC±¿*;  ¡q'OïÙÀšUi¤ïÞÊö0ùßqE±:Õí@cÿL~êQV5nB\½Dâ&àju­ÁålÄ¥«e¥«w‡™8™‘I©wažbr J H»ˆôc¥à ¨ „Fúœ¿¨hu¨U•냲ãíܘ0íþÎ( VÖ6 ƒ»Ò$ü©[Ò8•¬aÛa7j÷DC™¤¶Âl´_áð$©âVvë-¦bL–+ù°WO"ΡRÀb¾ô³ÅlAåÞŠ#$ØéÒ÷«]Ül†ns{ãù^ûØOmcö¨wYžN½¤†D'÷%1b÷0-E‹N[~´v·>ŒúµŒÌÜœFzöQ¼"©Q³6N‹7ž¦%SC«`]Ù­¬Æ`µývô³âæ$×\„g>Ì-FJJÏ%o¥äíÌ Ø|…™2Ùv ðü3CÍ'v²ýˆ ŸZÞ\H‘UèCqÉßCf©wO/Ü=½p5ïbá÷¿‘Vh뉣ÊUn5±[(Üö3K'2päúöîJRýp\‹‹+xNª­XœLÎÌyûq¯ß‘΃^æ…±c鼟¿–¤SùÕž¶â2]E=jÜCÑäneÿ‰ §tK2SÉ,õ%Ä÷ò›íëƒrzN1P«q§6-bMº µ½qnHq«–lÅX³)Á.•l¿ÂÈ™Z!г¾NGX3kq=bQíŸÏ´E¹ ªUÞ»Q)& ³’sƒj—å3lúêSûw#Âå0[~Ç^}33\zy9,…‹™7f®}ÚhJgóŒïøËÒ‹nå}ß.S¯­íK®¤'*»‚ÚŧÂÝlX¹]˜ž“;æ3kæaÌú½ìË,À·†=±jИÓXõÓ’s_cÄ£—¾¬8ÅÒ£W[&¿Ëœcà݆~Ãûã¦À©‹Þ¨ ¥Ý°h¿È/æ„É@õÄî<úp ~å™ÊÖûl‚õí¯ ©­lìαýéÓq4?OÅz¼ nÂý#ê³ú³ṉ̃“zCâìˆUøA èþ5ÓgáÓ)&T†Äv|žûÚ 2#sÅ–@r»hôVV„Xkõž´Rúôe1_üEýo¾‚~Â$f¼7‡|/¡ahßøVf•Š½ã ¨}ˆõžÂé•áu}!CG|O;/5*¸Xëg»ÊBÜŒ‹ÅRáuºuëÖ‘””t#ãâ¶’uEgo^¥iñV½¾F». W=GŽ]!ìèdû=ŽH¾œ !„B‡'I­B!„px²ü@ˆ*t«-?Bqó“åB!„Bܤ$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„OSÕq; tªê„Bˆ[ƒœ©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báð$©B!„O’Z!„Báðª.©5ýˊχóÑï™”–yÉrrß ‡ŸÒNWIh7V!Û&}Ãòc¦ªDáN­fØñòGN!„¸½ÝÚgjM9ü5öm¾Z{sUÇRŽÓ~gÒÔ…lÍ=Éþ¿~cÒOëÈ‘ÜVˆkϔ͌¡ðü¼£È.&„·¦[;©½ÉéB’é¯";ï‡rhÙ±>ÞꪎJ!„Âñhª:€Ê0ÜÊ9 Ù¸ï(§ÔE7#¥c#‚œ ”ÿ^Èœ¥©È;Ú­:qwÞM§újÖ|õ9Kþ~Ã[»फ़ ÓF/ F÷æ¯ù“¿÷ý‹Ñ#Œ&]î¥u„ Prd#ÌYÎ?ORŠž5ëÓ¦Û]ÔõÒ@ñn&^@P·F_¹’íÙ%›ҭsÙ f±r×QŠœƒHêÚ‹öÑT€¥8› Ì寇8^¢§ZdCÚvJ¦¶‡Tòv¦ãÛ¡1[V±¿¨ ¡îUÛ×ÂQ•µb_O]Æö£E¨=Ãhvß jгÆÜÍüúõ$þÁ /áIw3p@{"\(ÜÈ[ƒ¿'â‰ö>5û‹ðŠïÆ“ƒHûß—LßpS.t|ìEú%y£,…ûXðíxf¬ÙͱbWj4hÏCƒzÒз¢CŠ…âŒE|ûÕ/ü¹;‡ÓŠ3~1­yð‰>4÷×Pzø/¾ÿâG–íÈEÚ˜»{E²bô_¤Œ}—dOÅzgÛ5ô æLgùÖ,J}êÒùѧéWÀoÏ>Í”,`âãôZÿ2ÿ{£!.e#¬°|5'Öfè˜\z~ü&ÔXNmá‹¡yÏŒèT£µ¶ÙÙ¿¦½ò~!<àÆŠËù'ÛŒ_L2>Ö‡¦ÚË{Öα0þ»‘Ÿ¿þž…grÊ)€øö}y¬W¾šk?O„âFR>|xE/ffft}j¶’¾aY^õin@e±`9ûŸ¹8‹ÍkÒp®×”8·læý?Ö*q´ïÖ‘æµÝÉÙð w»„öØ ¾›´]R ]Ú$¦ËdÕ¢-ל–-ê¢Ý±‰‚–O14%'Sÿµ–]ŠjÑ™N­ãñ8²š%kó o‡%›%ßNæCR:µ¥i\ÆÝËYšæCb=ÿ3Ûÿ¹–­™ÎÔïÔ»Ü9ô×b–®Þ¦~îíˆÏѵ,ÿÛLLÃpÜ,9¬ýþÆpW—Ž´¨W㞥ü¾®˜ˆ¸«µxÕªCLh Â㢠öpF­\Ÿî·¶ÒŒ_xý­¸vÈzw¤ž~3Xw´¥Žn/ß½0œyJ3~|Ýù½`"“6zÐâÎÜLÙ¬˜>?÷¸Ðæ?OЧ•{~›ÌÔÙqjý(CÜEõŒ¹L[a¡Iûx<-YÌ}ó%~ÌoLŸÁèžN馩Lü½„6õðÑ”3‰K÷3åµQ¬ðîÄÀAѵi(%›¦1uKuîJEW°™/^xŸµÕºðØãÐ< ‹™_Ïdÿi/’º¶¡¦&Ûz–lVÌøõÛò‰¸w0ƒzµ¤Zú¦ÌË£^§6´èЧµ‹8yï§|90g¥LŒFëm Ž¡Ú¾Ÿ™¸Ö“ÍHÿá]&Ÿ¾‡×6ÄÃl½mÎFûú×pb3sg/âÏÎ4íý¶‰¤tó4&ÍÉ!ºmCü9ÄÒÙ©ø¶íH¼Û»ÆÂR¸ /¼ÅR÷?Þ‡1f6LþžU.Íh’Å÷×ržHV+„¸ÁªüLmþº Œ\WÞ+Z<€âŒUlίAû‡ÛSßSÔÀß%ô kIÍIäŽSG8¡øÑ¬a<áî ùbð?ˆJ¯BQT(((Š Õ¹c» \“ºÒºŽjÀ½EV~÷/§Ljª5è@÷zID¸«€ Üó6°iýqŠÍà`QQ£uGÕtEÁ@“Ð%ì+jCç;Â0(àÑ$Œ¥?åP`‚Ò׳êH)CÚ‘`P€ «)d™ÏúìVÔuBå슀Þõzwµ¸…óÒÉQ‚¹»] êù¨ 2¯Ð]¨ * wÌbI^$ýGô£•Ÿˆ¤¦ûv¼:—åYméé &êÁ´õ@Á›Nu¦ðÏ©Þ ê·¾ã™úA'ŒP’9ŸÙ"ôy_’½U@á5ö>öó÷õ"*Vwy€f 5ÚöghrGê{«p¼,`ñÇ(0Y`óoüUÒ˜ç†t§‘A˜š<ó7Ïü|fó’6ê¬ ˜,xtxŒ›¢|îmÊôבW Š^}æX R¡R]žtÛ,?Ö‹& `Ù3ùbò6Ž-ó ç¨jÓÖÚžØ×¿€ }†^ÝQ€¨`ØÿÄxfmíCÝ:öÄ}ñXX8õÏo,+¨Ï“OõàOåÉÙ|s0‹cÛ—\ÓyÂå'•…⺪ò¤VÛ^M«]r©ÊR°“SÖf ÿK©G4!n–ÿ:U‹ @³‰ÌãFœ‚“¨ïý=3?ͦ:1DEDC5½ŠrïQ»TÃp¡>µÓ…³£N~$4u娡]lޚšƒØ»ó0&ŸØK¶÷ñtâÌ& ­/tgËPÔZTJ `¡øØ!N–bÖ'ï2÷\#¥& –|#œIg…¸jÎáh0‚/}”Ew4¡aýD’’’¨á YË3)ñI"ÚëÂ^¦«‘@¨v{Ž–‚ 6XÍùü¼Ö:iq«îë¹y­Õ¡VŠ w“S²‡/Ÿxˆo.š×%F3–¼N­ÿÇßÛL!€®6ÿ=‚v~!´êêÉ¡ÝXòg{vmeóúîJ9¶+s`KÂÎUˆ–jq‘¸NËÌ6ë´Ô<Ó†ÈÚ>ç÷mE«CS©»l·É‚µOsõ]ÊÓ_-§úƒ£I©q6kÓYkÛY•îßsï¦Q¤s¡¨¼bh`bqZ.ÆóIm%úRx#ÿîÎÄè߉0Ã…~®Ñù%F`"kƤk8O„âÆ«ò¤Vcð#°FÐ%_ê-'Rιž  f,(ú0R{ž„½ÛÙ±;‹&±xNuZôïO›Àò¶UãTÞåQÀRt€Å“&³¶¨:Ñ1µ ¯ukÌcÒf[­¨ <³Å5^ÛP]séûÕÎz[… QiŠ[<|4žÖ›W³fc*k&½Åä¯Â¸÷­a$—»‚ &,ý­ruYÌTî­xq䃄]ò½LAãꆫå >{úLÉŠw5–SÛøñ­w™—Nã& ©×º/Í#ÇóÖ “å²zÎ\e©\ŠñL]ÎÚ+[¿c³|Læž È;x”bK0Zm»¤(;¨P_’+¨”3qÚ÷¥ïG¥ªüÂW1O„âF»ÉŸ~ ÂÕßí‰ýMŠßa6n:B‰µí_ÆêÜHîü0ÝÛ5%!*}IÉ>LÁÙ×—‚LŽ]0  \-ùó?É“âš1‘·y:“fïÇ3±#>ö2ïË#!ûY¸0çÐ@´9[ÙuüÂ¥‹Ó‡R9PêKD5{¯+¸…â–¿‡ôR^^^xyyánÞÅoßþÆŽ ŠÎ?üýýñ÷óF¯¶p꟟™È‹Žàé¾]IN ÇP\|vßÒâᇒ•ÊÂsÉ“‘w¦qf·WÙ¬óêØn@iÆ,>ŸQJÇÇîÆkÕ×ü¸µ ¶Úv…L™lÚ_x>•4ßɦÃ*üü/:ao¿hðóC9üûÏ¿fâÈ‘<÷îbŠƒ®å<Bˆ¯ÊÏÔÚâr nßòÇ´…hÛÆá]zuóÖPÜ‘z¾NhNd±qñZòT)4®i ôÈþùW…W‚j@QLå%÷”+>6Z«Ö¹¢)>Äß©»p Ò‘`=‹WäbÑe‘q¬oOûbw lL£j›Xòó\ôíào>̶ ØH+’\ät‡¸VThÍi,œ<#ªGH‰óætúZþÌRáßÊ÷è.´òÆ·MB×»9ÕKv1oÂ\NÔ@rìü]x ‚3õÃq¸õoC¨)U¿~ÇBK/:Êûž¬ qñÀ©p7+–mÀ9BOÞ¶ùü8ý0fý^v*âΆÝhôýŒýì7ßë‘•Lž›J0Jeê´ù VA¥˜8•}#Ç=¨îad×Üi¬¡ ÷uŠÆÕVù¥‡˜ûù¯œj5ŒZ‡“•µ†ÿ~ñÉ?L¨Õ¶àg_ÿžQÀ_c?%ä‘nÔq9Ìê)ãØ®oÆã —œ(µÙ/–v^ÔN„n4ÕŽä«Ï~…î ð:¹‘)ßoÆÒ¥7ÁqÁ×tž!ÄvÓ'µèBiÿȃ8ÏYÈ‚VS ö (&…y¦kD'z&Ïæ?á»…fÔ.Õˆ¸£') ½Q«K¨W‹5Ë&3îäC<{·ªjµçž;~eÞÂ)üêµÓyP$›~™Ë’‰éjgìZöíÜßYþÓ&òÍ.ø×nÁƒ)ñ‘;ƒÅ5£à–0ˆç{~Í·3ÆðÆ&Ô†Ôïü<Û ÑÐÿWpýfß¿3‡_"?ÂÛ:p%óPJ÷#p7‘_Þ_L®É@H£î¼:0…À Ž(ú¸þ é<šq“F±o¦ðŸ‘õYšOÿ!¤Á¿/dÎÒTäFíV¸;ï¦S#”Ìy|þÓiZ·Òó÷_©ì˱àZ6]÷åÍ,9²‘?æ,矃')Å ÏšõiÓí.êz™É˜ý)ÿ;ÒŠ!$⡜fÿoŸðCn[žÐw墂Šw3iôjtoNñš?ù{ß¿=ÂhÒå^ZG¸¡X­Ks~û n8¾r%Û³K0„7¥[ç²Ìb宣9‘Ôµí£ ¨Kq6þ˜Ë_;q¼DOµÈ†´í”Lmõ"!„Bˆ›ÌÍy£˜³!žò2O`¼èÏÆ#2uz*JÝú èK·:vÌÆª£gÞe9™ÊÌ…Gº³'÷nGDɦM˜Ë¾â2å³Y>u6;tõéÜç<ØŽÈ¢õ̘¹S'êE᜽…}ù–3ïÿ{÷e} zü;3¹‡B!$ÜÃÍBE‘xAëÚªÔ[õl×îéö\vÏÙ§ÝÝ®»{zÚZÏ^ÚmµVZ/ÅÚ"¹ ¨ AP¡(%×2™™óA  «$/|?Ïãó8ó{ç}ïD3ßüæÍäÐV*>h¢Û°¾d…8Y¬–3V‘ô¥[y𛓛¿×_žOeÓ™Žut>µ,™[IÑøûxdòr*òÌ“/°¹ÛõLþ/÷3¾°–e³ÞbG3ÛŲ_?ÅÜÚnŒ¹ë!ºg<Å oñü3ó¨jú\¿ ’$IÑWjp2éÉmˆ’8îîØíì ufäÐËè“‚ÂNdåWNC¤Ð÷¦Û¹z`&!zÑ-jžœÉ’MãèÝó¸Å#ä ¹žÛ•Rœ ÉÞó6+öÒ‡v]Ñ/m ïl:@É ,UU°!Ö“û^y=I 2Koæš‹s‰Ù£/æõgj98ñaŠ®™À°ž™„Èâò ø¨a,7ŽèMVÚ_Þ›×^ÜE} ¢µ+X²½²Ç®£$+Ò5/Ķ'f³¢újŠz¤|!_I’¤¶¬mFmØÈºyS˜_^ÀèÉ“¹2 „B„OèÎ÷‰Ä »O4lfþ”çXÖPÀ€ýé3x—Ídʪ£[¤P0¨/)¿YÅæ]ɼ·úÜÞ“Ó~ X(BJÒ©ƒ÷ÌÇ:íNO½¿x‚Pf “KAÒ‰ÛGÒÒÏ´SI’¤óRŒÚ&ªW¾ÎFº3±×ño÷Ç©Ûð:K«»0bd)c”26¶‡å¿x’…Û1ˆÕòaM#ƒŠÇ]¢~ îÓ± ‹$vÙO‚†M Yº»/_ù‹;(NhfûÖ&âÇÍ"¥ „âäß°dqµ‘~Lêžö™ÎælŽuöB¤uÊ'£¾’íÍôË9¼6ß¿–Ù³·Ðëúñ HþL;–$I ´VÚØÁTmI9ü9µõ»Øº~‹ÞÙA×k¾Á%Ù!8öK^a’âÛX9{Âe ï™Etû:Þ­ “SÒîÈ[ÿ¼÷‡ßÓ¹ì z¦îaí‚lN½„¯õÎ<îˆ!"©™$5V±fõzR S©Û¼‚ù‹w“HÝÆ–•Uµr IDAT tì’N8µ€’¾Iüju™CÆQ”úÙÎïŒÇêðéö—Òu8Ãò*XðÛ¤B~¼†÷Ïa%WSšqšË#$I’Îs­µ‰Ê9Lyúè­:ô`ÈM¹fH>¹è˜^|wŽ™Î¬7^♹q"y¸“²¡ ×É=(Û‘÷ç<Ç‚½Ð¡Çn{`Åé@ÃÇûIí5ž[GüŽ™sŸg YôÎõ¥â¥,X\ÉÀ;û‘N*]/ëMêê-\4¤ëg¾RõŒÇºùSî0)Ÿ+'䯲èÅ êâä÷ÍÝeÃÉõ½$IÒ*”øä§ÇY¾|9¥¥¥çr>ŸYtëLž|f7ýå=ôûlW |BŒÝoýœ]Ú‹¾9ž®¾­/I’ÔfµúJm[”hÜÉ–ÍXº¸†œÒ/ÓÙ •$IjÓŒÚSˆíYMùK+HôËÄËó|’$I’Ú¸óæòI’$]¸ÚæŸÉ•$I’>£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’x~«Ô†Åãqšššhjj"‹µöt$I‘‘AjjjkOãœ3j¥6,“––FZÚçò·Ÿ%I:oyù$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$I—ÔjGŽÕ²øßÿ…}â± …$7”Ø_ÁÏô*íïùwõImµ)žJb?r y”Ñ"Ÿz\ú¢%ö½Éßÿ×yLø—ï2,ãÈ}±&Eã§Ü>””JjRˆØ¾µ”?õ4å+7³'ÖžîƒÇóµneH§äS>®¥íÏæxçëü%I­£õ¢ö\ˆíâÍŸþ;ïý&ï಴Î{‰Æm,yî7¬©ËcÂq÷\ñ}îû¿kOù˜.·ÿˆß‘ÂÜþ[¦ì½‚¾ó0}#•,œòsÿ»fþùwsÒÏ–±f·°}—Ug8Þ¤îœ*5ƒ>IRë9¿£Vº`DÙ2õ¯ù/n" @Þ £i?È÷ÿîǯ=6×¾É/~¶–C;Ú1›¹dpÕwfÂ¥é@?z}»ž÷ÿ|*¯|ðeþë¥i'ì/¶cY‹Û?v†ãü'èó—$µ¶@|oŽíÿÅåsYùÑDÚS8`$e†Q˜¢Ô®™Kùk«Ù¼ç‘v\rÕ-Ü08Â[?ýÔ¯>Á߯ÿ ÿãÞþ¤}bßMÛW2«|ïVî'J zfìÄq\š“$8T½’Wg¼ÎÚª:’òú0tTwÇ}†ñƘòãyôœt%ûç½ÊûY·ò­IŤ4Vóö¬¼¹®Š½Méäõʵ7Œ¡ûÈéÏgX>)-Žé–DÁ¸¿ä#ši\ÿKþægÍ'ŒF²º3à¢ãîˆí`îïÞ&û®¿áöâ4â5]ü%®èùñÿ!‘ì:Fš8p(vÒÑb -o¦ãüæ}Ðç/Ijm­µ‰8ñxü„‘xü¸[M•Ìyê7¬l7œî¾™NÑJ–½:“§ŸƒoÞWJVí¼ðòj²®,ãžâ,ê7,¦|ÆTrz<ÂUüáŸý”w¿ôg<4¼ãÉ'Û\Í¢¦³.÷*n¼§˜œØvÞ?“?L+¤×}—‘Q·†©O—³µÛ•Üto1é{ßgAù|ª›;qßßòøá“ÙÃÊi èØ÷r®½(ŸäØ.–ýú)0Œ²»&ÇNÞ{mÏ?ÓÌƒŽ§ËžÓŸÏ¨ÄéÇÆtný/¥ZSˆä](ê{Ú‘ÚÛ¶1jý;Ï×MàïËŠ¿Þ{ûOÇm’8Ä–ùÓXïÁW‹>ù£ ¤|ªíOq¼ónþ’¤ÖÖê%T·ü)þqù©F’i4nYªº"Æ}<ƒ;„"ò3öð§§–±z×—q`;ûB9ô2úd‡ °Yù•„ÓÄBaB„…„Oµ´7äznTJqv(${ÏÛT¬ØKcÉO¦}Háí36¿å_x<Óög:Þ…6IÒ£Õ¿E§_4‘IWäqüËH¢þüáùe@œúšZ¢íнÝÇá–’WL—¤ ¶îm&¥[)ƒ;>Ë´ý˜Š‹Ò¯¸ $/= '¿ëx¢”Δ\‘ÉΪõ¬zoU•›ÙðÇb¹1ömÝK¨ó( Ó> L»îÅä†×œÅø‘t {v8òD'hÜYÅþh¯üäqf íD3ÑX‚D]3)}N>‰¤ÎU:+ÍTÏy–·:ÝÆú§âmô8>˜Á¿ýðW,ßÛ1þ€®éIúißk?›í[:Þ…8IÒ¥Õ£6)«3]‹>ù‘^;hñƒ¼B!B$ˆ“ ”Þ›²G¿CɆµ¬û`#ëæMa~y£'Ofl×–hØÌü)ϱ¬¡€ûÓgð8.-šÉ”UG:ùE,:î_[?|;‰´äïKÄ„2K˜ôàX NxöCDÒÒ %·p>ÝZk[}¦6êÐGÌšµƒ~÷ãÄOœ‹³÷íŸò?ÿi±a÷ñýGÊо¥γÜþ´Ç»@ç/Iú´zÔ¶,Lf~.Éû6Qy N~‡Ã+’M;7RÓÜžÁíÃÔmx¥Õ]1²”±JÛÃò_<ÉŠíŒîšÙâÞ6-déî¾|å/î 8  ™í[›Ž\ß›Dû¢Ä?\϶†Ké› ¾j#{âg3~*!Ò:å“Q_Éöæ úå~•Œï_ËìÙ[èuýµþiéiΧšÁ‡*yûtçÚ­»¿,¦3HP¿¶œE/áϵ?á²ÄU<õäBÒ&~—¿ÿê¥dañÿì¶?ýñ.ÌùK’¾HmIn»ä^˜"©™$5V±fõzR S©Û¼‚ù‹w“HÝÆ–‡¸làŠçýž—§æR6º˜ÌýëX8§Š9@˜-ŽŸZJ×á Ë«`Áog>~ùñÞ_<‡•\MiFIñÓO6)§k‡‹H:³F>Z¼šÆ÷Ó'óÄD;¸~oìÂø¢ƒ¬{ûø‹Ü“è8`ÅYüqÆTÞârî¸aœiûìH‹Ç#QÂþ>9Üæç/IjsÚ|Ô’ÚƒñÜMZù\æüz)õ‘ö,ãþ ÃèŠoàÎ1Ó™õÆK<37N$#âwR6´#‘H½.éÅ[ Ÿãçû¿Æ·'ŸpYCj¯ñÜ:âwÌœû’$IÒ§æ¯ÍK’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðÚþŸÉ•.`ñxœ¦¦&šššˆÅb­=IRdddššÚÚÓ8çŒZ© ‡Ã¤¥¥‘––ÖÚS‘$©MóòI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’/©õÝÄ–WžàéÊ‘üù##Éäý§ÿS·œ¸U$3ÞCÆRvÕrÎf¶‰ƒlY:›ù+×ó§]qrЇ3áæ1ôËŽ|.³Nì¯àçO.aà#2ºÓÉû<Ó¸$I’>­µ§Q0Ž{oèA ˆ5°kã2æ,~ç#òð˜ü3L8Æî·_dÊüM¸±ëywÖ+üö¥lþì¾aäØ˜’$Iç¥6µ¡ôNt-*"íÈín= I«ù1/¬~Ÿ]£òÉoiÆÑjÞZ¼•üë¿IÙЄ®·`ßÌjv4&ÈÉ ƒ3$IÒ¹Öæ¢ödRS#‹‹×±ú—O0=ùv¾ýµdeÛ¬ÿÇ|PÂ÷‡Øp0—áÅÙÇ.NÊÅÝ_?ýÞ›¶¯dVù"Þ­ÜO”:ôÌØ‰ã¸4' Hp¨z%¯ÎxµUu$åõaè¨î$Ž=ú ã0åÇóè9éJöÏ{•÷³nå[“ŠIi¬æíY3xs]{›ÒÉë;”koCÿö Jíš¹”¿¶šÍ{iWÀ%WÝ ÃòIiqL’$éÂÕö¢6'Í ìþh sÞk$³¤SÚ‘5¤ˆÄŒÕT5 ¤_:ÝÉ»ëêè4ô2:ÔÏa?iÄ7¼Ê3Kße˾0{ áÚÆ0àTä6W³è…é¬Ë½Šï)&'¶wçÏäÓ éußedÔ­aêÓålív%7Ý[LúÞ÷YP>ŸêæN\Ä÷·<@|+§- cß˹ö¢|’c»Xöë§XÀ0Êîš@;yïµ<ÿL3>:ž.{Þà…—W“ue÷gQ¿a1å3¦’ÓãF%N?6¦sÛûRJ’$+m®„›^äÿü݉÷¥ö¸’Iãz’FˆÔÞC(ŠÍdõÖFú§Ñ\ûkë:sùÅ9°­‘æØf¿™ÉµãîâêÔ=¬]0“¦$xè‘q~r93!oÈõÜ6¨”âì0PHöž·©X±—ÆxŒ¦÷—°!r wßqÍဦˆ¼D5OL?ÄØÛâøÍQ"%“¸{Lg’€èÖY,Ù^HÙc×Q’ éšbÛ³YQ}5eÍÛÙêÌÈ¡—Ñ';…Èʯ$œ&¶ãôc’$I²6µÇÿ¢¡0©Y¹äf§»œ Ô®7CŠbÌZSÍ¡ânì~o-õ#Ø!B¨&dsùí·0ª(èEQÇF6=¹7+¯äÎ>©'+¥3%Wd²³j=«ÞÛFUåf6ü±†XîE@Œ}[÷ê<ŠÂô£Ó®{1¹á5g1~D$žŽ<Ñ wV±?ZÅ+?yœG/ñM4%HÔ5“Ò§”ÁŸeÚ~LÅÅéWÜ’—&‘tú1I’¤ Y›‹ÚOþ¢ØÉ´£÷àB¢sߥæ`:®­§ë•ýi†hz6i¡E9/ÉF2óÉMi¢®¾81j ›™?å9–50``ú Ç¥E3™²êÈ¡B!NúÕ²Pè¸myüðí$Ò’?¾/OÊ,aÒƒc)8áÙIK'”Ü›²G¿CɆµ¬û`#ëæMa~y£'Ofl·–Æ>ì’$I.ñ…h×g0…‡>äµï°ö`Ãúf’s{“ÞͦÚCǶŽÕmcgSÚ'Ÿ´§†M Yº»/w}ãëÜvÝ”ôëJzSq’h_ÔøŽõlk8úˆõUÙ?›ñSÏ=­S>õ[ÙÞœAVVYYYd&*ycÖliŒQ·áuæ,­&«_)coþ û[”u®aeE5»O;¶¦Ïã©•$I ¨6·R{6Bíú0¸ëtþ0û-RzÞIïv‡WBCYý9`/¼ô{rÊFÐ#y'ïÌYÈî®c™TtòçDR3Ij¬bÍêõ¤¦R·yóï&‘º-;qÙÀÏû=/OÍ¥lt1™û×±pN1r€0Z?µ”®Ã–WÁ‚ßÎ }üòã5¼¿x+¹šÒŒ$’âÛX9{Âe ï™Etû:Þ­ “S’MÊiÇÚáGðJ’¤ Yä{ßûÞ÷N7¸uëV ¿ CÇØ·þ-VíïÎð¡ÝÉGÙ¹êMÖ†/eÔ N-×v(…ÌÐFÞZÛ@¿ë'087ùØý¹}z‘±ko¿¹˜%kª¡û•Ü~ÛåtM=ù3j“:t#¯i+^ƒ·ÞÙÈžÔL¸å2b.cÕ®"¾4äb.é׎=k—ñÆëËX·3•‹'\EÆæ-d Jœú·4ž²‡5K? £d8}þE³p;º_Ü‹”­«xsñbÞz¯ŠháHn½u…i!’szÒ5TÍš¥o°dYk+É~·\ÑìÜÓyY­$Iº…‰DâtƒË—/§´´ô\ÎG’$IúÔ\ß“$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IRàµø×h%µ®xÛ½Ê{û„ÚõaÔõ×QÚ%¥µ§*RÇ‹ŠØöÒO™[kí©H’ô…iƒËŸÉt2š> _¢â£” ¨æ×?œNîäÇ(+„Ú5s)m5›÷"Ò®€K®º…†å“4m_ɬòE¼[¹Ÿ()tè9˜±ÇqiÎÑÓŒS÷Áž}­‚v'èÐýR®¾é:å̉ÆjÞž5ƒ7×U±·)¼¾C¹ö†1ôoª^É«3^gmUIy}:ª;‰sù4Ig%Bç«æúƒßã7¿xƒáu¹§¸:¦y÷*~÷³)Ì]³…}IèSz Þ?žâÌÐÉK’ÔµúJí)¥u¦{‡{¶î£ù¸»›·¿Á /¯&ti÷Ü/‡¤²nÆT–ìh†æj½0u©ƒ¹ñž¸ÿîëèÛ°‚?L[Ë£µÙ´‘ésjéuÝWyø¾2ÆÞá÷O¿ÂúƒŸÈÑØ.–ýú)æÖvcÌ]ñÐ=ã)nx‹çŸ™GUÄ÷¯aêÓå¬OÄM÷NæË#:²¡|>ÕÍHmOJeN$ç§y¶bÿÉ?|5®çÙ¿þþ°ï¾úWÿÈ÷¿u#ùkÁÿþÇÙlwqW’mp¥'“ž цè /À±ÛÙêÌÈ¡—Ñ';…Èʯ$œ†x„¼!×sÛ RгÃ@!Ù{Þ¦bÅ^ã $H㢛oetßt wÆÙöät–nœ@ÿâ­YÁ’í…”=v%Y! ®y!¶=1›ÕWqÕ¶%lˆ\ÂÝw\C¿t€"òÕ<1ýà9|’¤³"µ÷­Ë´ý˜Š‹Ò¯¸ $/= t¦äŠLvV­gÕ{Û¨ªÜ̆?Ö˽èãý†óè_~ìf¨]wúvLðvMÍÇ¢6AãÎ*öG«xå'3ã軯‰f¢±‰ºFönÝK¨ó( í*L»îÅä†×|qωôŸÊà¢I3jÉ?ñÓ—ÇòÃÛŽÄØû§­4å–2 çãëR‹Jè‘<wDÁ¨•$@Û|µjÜÁ–½!rŠÚ“ÄÇ«Ÿ¡ôÞ”=úJ6¬eÝY7o óË =y2×tªfþ”çXÖPÀ€ýé3x—Ídʪãö:òÏ1  EN¼n0OÊ,aÒƒc)8á IKfÇú']iòÚCµm¡ì!Ü{ÿ`ûÿÎŒÒ;ϰqˆ0 b^).I ˆ6xMmÕ+_g#ÝÒ«Ýqñ§nÃëÌYZMV¿RÆÞüþö·(ë\ÃÊŠöoZÈÒÝ}¹ë_ç¶ë® ¤_WÒ›šˆ¿ëØNÖomøxu›X¿;™ÎEÙÇÕ}ˆ´NùdÔoe{sYYYdee‘™¨äYo°¥1Bû¢Äw¬gÛ±]%¨¯ÚÈž&µ5a:Ž|€¯õßÊԟͧ¦ B‡]IÞõë÷~|í¡ªÕlŽv¢8Ï“$C«¯ÔÆî jKÊáÏ©­ßÅÖõËXôκ^ó .ÉAãÑ-Ã$Å·±rþ2ö„ËÞ3‹èöu¼[&§$‹äÔL’«X³z=)…©Ôm^ÁüÅ»I¤ncËÎ.B4²î•ß±pÂ(z§ìbÍüYTe åþé_¿)]‡3,¯‚¿Aúø!äÇkxñVr5¥It8‚ây¿ç婹”.&sÿ:Ω"FN+<ƒÒ§éÂØ‡ï`î·ŸçODè ¤¸‰«;ü ¿üáR¿:Š‚¦õÌ|jûúßϘB£V’ ­µ‰Ê9Lyúè­:ô`ÈM¹fH—“>(>½øî3Yo¼Ä3sãD2ò(q'eC;’Ï­#~Ç̹ϳ†, úçÆ‡úRñÒ ,®¤xD: å¶1!–Í}Ž…û"tê=‚»ï¾šî©@ÃqJÊçÊÉ_'yÆ«,z±‚ºxùýGswÙðÇ”=ˆ;ˆòêôżò«ÅDrûPzÓD2Ë_?O™ôŸ’ÜýF¸€ÿ9­€Pú@&ÿÃ_‘ùSxöÊÙ—Ô‰âáðýû¯§‹O’¡D"qÚ‹æ–/_Nii鹜$I’ô©µÁkj%I’¤OǨ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IRà%µö$^<§©©‰¦¦&b±XkOG’¤¦¦¶ö4Î9£VjÃÂá0iii¤¥¥µöT$IjÓ¼ü@’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤ÀKjí H:Qùæ]üàJÞ©=Àþ¦æÖžÎç¢CjCó²øÞ°žŒ,hßÚÓ‘$‡ŒZ© yqÃ&ÍYÛÚÓøÜí=Ô̼ª=,غ—E·”0ʰ•$}ÎŒZ© ùÛ›ø‡á½ø‹AEd$EZwBŸ“úhŒ¿\²‘Ÿ½¿ï.ßÌü‰ƒZ{J’¤óŒ×ÔJmȇûøoƒ»Ÿ7A ™áñË{°rg]+ÏF’t>2j¥6¤9ž 9jå™|þ:¦&°ï<¹NX’Ô¶µ’$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ穆èþo =óK¢gÞ>V_ͰŸ-ç÷&>Ó¸$I­É¨•ÎKqÞ[¿“J€ƒµüª6ÖÚ’$é eÔJç£æLÙxˆ¼¾½¹+­‰?¬?@}kÏI’¤/PRkO@Òçïà®í¼TŸÌ ås7[xqS ïŒlÏÈä·Ù_»Çý‰—¶7‘–Ó‘G‡dsüzî™Æ%IjK\©•Î;1V¯ßIujGîéœÊоÈh¨å™ã.Ah>PÃ/À+É]ø›KøMI³mbUììÆ%Ijk\©•Î7Ñüê£&ÚwïÂÐdÈÊÏgd¸–iëðDA{2Ið§•ÌŽt¦||/nHÈf`â½FøÆ%Ij{\©•Î3õµ5üþ`×õÏ"¥eóÕ|ع©†Š(@œ?m?D¤c'JS>*D—‚އÏf\’¤¶Ç•Zé¼£âµì ™©åo:a¬–gj‹]áŸB¡c÷i\’¤¶Æ¨•Î'Ñ:žÙ%µ°/óF¶'ûH…Æwóà´xåu(hO.iĖײâPgÊRì¨ÙÍÆ8@ø ã’$µ=¾™(Gì¬aZc·)ŸQÚqYîáJºvá¿u S»©†Šhˆî½ºq]l_›½‰ç·îcþúøÊ’ý¾b6|†qI’Ú£V:oÄX±n»2óùó.Ÿx&”Âu—å’Õ¸‹gvƈ´Ëgê—ûqsS N[Åí+ë3f·¦^Ú=Ó¸$ImM(‘Hœöo^._¾œÒÒÒs9é‚ú·…$þ˘VÇå|??IRëq¥V’$IgÔJ’$)ðŒZI’$žس¿IDATQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZ© I ‡ˆÆOû׫k÷¡(íS’Zy&’¤ó‘Q+µ!s2øÁª-4ŸGaÛó×omàò.Ù­<IÒù(”H$Nûʹ|ùrJKKÏå|¤ Úï6îäöÙï·ö4¾0áPˆ7¿<˜Ëó [IÒçË•Z© ¹­OÓË.eD—l’\Šp>HO suaßRbÐJ’¾^Ü&µ17öÌåÆž¹­= I’Å•ZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$žQ+I’¤À3j%I’xF­$I’Ϩ•$IR൒$I <£V’$IgÔJ’$)ðŒZI’$ÞÿÕR­äðžþIEND®B`‚2403_show_agent_instructions_1.png000066400000000000000000002466351516513262500335000ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/24-agents‰PNG  IHDR´¤ñè¬AsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwtUûÀñïìf“lz'Ðz/¡c¤ISÁŠ "`{õµ¢øC,ØEE±"È«  ]z— @HHHBBz/»óû#…ÔM! »ú|Îá²;{ï3÷Þ™yvæÎ¬Â'ÛT„B!„°Pš€B!„×CZ!„BaÑ$¡B!„MZ!„BaÑ$¡B!„MZ!„BaÑ$¡B!„MZ!„BaÑ$¡B!„MZ!„BaÑ$¡B!„MZ!„BaÑ$¡B!„MZ!„BaÑ$¡B!„MZ!„BaÑ$¡B!„MZ!„BaÑ$¡B!„MZ!„BaÑ$¡B!„MZ!„BaѬntBa)ÔY!7:³¡,Þ~£CBˆr†V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX´†Mh5v̹+„ËÑ—{KkïÃÁYYÓTÛ !Üx:î‚:«ì¿Üz±¾·-hõ­]›6+„]A:”†©âÆ«áøúW´E]itôïØ†w÷'gVÆé}91:û<¬lçðoï¼ð¯ydÒ$&M[ÂÙÜyR¬lѵ5ÜÑ—ä7‘;½gƵçµÖ¸þæN«gB'OZU’ÓXÙ¹2»Ž ‚埡ÕèyvÊ þîd‹ÕŽÅ”„ ]}„>«Ðoí >•KpŽüÖÝۨΛÆWÇ¢ø>ÙˆÚå[’·…¥Œ¥z£¡s·.ìäJÂÙóŒýåƒ7Eð»Ò„å:0Ý©a2‡÷ØÌãÒŽ=\H9Àö‹œÑbYûäþû{<†Æ­¹Æ¬½øâÎ>üÑÏ—îj¿‰áË ©\uôdÎО\@°õŽRQB«ç¾¡ÝX=°û†ùT*©µ²sçãñ]øxHwÖuslФößqÜ6ÆÜ,]I#µèï½1i¤xöemO‚Ždp¢ž.†¬$ÞØT¿…Z(i‹*èy¢‹äîC™¦Vil¿œ‰õ”î<ÛΞ¯÷gPß)׿º?ò.ñ×Þ$œúßE§ãßq`ÇE¦¶m‹ÍŽËL(6.,º­=Ù§ñúo§x5*—¼’7­èÙ±-ë¶dë°|:þK„ñFF+„ {tby«Âo™-Ú°wôû3–pw>߉Î…Ë êÛ™¯îgjTAƒœÌ0›3´ÖönÌÙ‹¸!§÷aÿ?z•ìå5´iĶ{bœBîÔ¬è考֎9“{󦫆.û;Öç¹µb$=Ï-Ö `íΟÓzñ‚Ÿ‹'õ'áV7œµ#3w'bzêÌ„ŽlÁ (ÖÜ;î&²G{âQR¦†žýû¢ÞÝ‚Nzwþ|¸/yvq•åhô<=9„ËŠ.Û+6LŸ‚:£c‹Úß©iÒfõ`†ƒ…^ë³.ݵK&Çe…>óäÖ~äMô¡iISi¹yHr'øàovͧÁA  ”½ôŸŸÁÛóðù\ Š—¬jü@ÅvéÍìZŒMkwŒ&ᑌÓz³±¯šÔ[U_6\ƒ]·ÜÈíìMr¤Ç°w¶#õÀvÊŸ¤ÍÛÍÒ¹³¸÷öÉLûï{¬;´Žgï~í)…‡5+œŸ¼ÈÌ{'1éöûyráwºZÔSY‡™ïüxx;_Í{œûoŸÄ]Ì㻿S0\fõcet>_Íbò¼Cd5òú›¦¡}§Ö<æ”Ëgë3·t2  pèD(ƒ÷¦£hÅ›MÿSV„0/FN cáÕk)ª{‹6ìÕš&'³…. cÎå†If¡‘ZEQ°ÒTüW²3Ò9³hbgž³Kæ…õG°)š‹¾AìéGK ظð¿¡M0ž cø/Çxð´ñƒÚó_çþx€’ß½ûßK΀šRm ÓYÓ¾EsZ‘Èù’¬AÏÃ[Ð:>šŽg’¥±ãñ1ÝxÛ5ÿûãÁ¿ç[~ׂ>Vùl>ŠÖ§ }Š,+{îjeÙ3W8[úŒ¯©r´¹lŽÈ¡‰¿ þ@gÏHW@ëÈHW- !(À ûä¶g™çâjÇW)µKÕŒK \Ÿ¥±çl"ÉžÞ µ+ªÝÚ‰i͵ì9™HŒ¹5_~KÏçس'gÇ¶æ™ Úé5(‰¹’Ä–ÄüÂËҦƮ¨¬Òíp,™_k86k>˜Ø‰G”xfþï0!;®âÚ¹=«:éÑUSo•}éf6ßÓËÉ%rû>’í»1¨¥+;`“z€m¥2Z5ã(ŸÍy]6ƒ™ýê|¿Õí¬$¼8³+ˆaýksXq¹5w<óoÌ}€nëycî·„å¨%Ëløb º[gáû¯rw³pÖ|ða?&¼ó>wû[ÑlêÇ|÷r쿪¦Õsg;¸Á‚ËT~òÕÈ©Sá|ŸkÅèöŽ85rˆBˆŠŒ¹)¼ô¿ce’Z7_&–Ú@#Ïœ¢ß¶¢ðªJ£L9ð騴ޕ½cààìÓ”ìÒøÏ/X–®iËÑ3p‚?÷ºÄò®MÕ,Þ:Ϧ ®d“èDAŽŠQU1ªQ¥À܆R4~¹úHÙ×Òb#·'åZ®Õæ$£^þÕ{ò´{:³¿½ÀòÌÂv9œ¤Òë¾@fzFð@T{µÜ×ÄŠu— °uõb¢]œÏ&¯ÔmRz_“åÌŒL&±‹Á¶QDÛ»Ñ%?™•Î òµAod€¿5Ñ‘IDšéå½êÆWiÖµKÕËyTè3tq¬ËíÂTËÏæáØÄ‡[5)̈ʫâ}#åóçŽC ¸âÏìÖ̹ŗ·€Ô”d¾;Á+¡©$«?û®R¡4v5› nþÜo“ÄÔ-üœÉT;=ŸºÚáíéj²ÞGµU÷¥YÊ`Ûþ캅¨W°m=ˆ¶ÚƒÜv‘۶ŕԣ¿°;¯7O?>‘^Ž ´kΉÇùÏO…EäElä·ˆ@¦|!n Vþ çg~ÍÆðÉ´nTœGÌä®~¾h÷ ýX37šä|PôZÆÌÎojméé—ÂÓI¨´ \]io«%*ì<Üî[ÀÙÔ Žgþçc a>Š“Zå¶.<ïQvßyæý·'p¹‚’Ð&_8˸¿3ËÌÅÓè=øz¤ ¡‰»úŒv—:˜™”Ä1ƒ½5dÆ]fYj–ÞׇiçXw)‘_.^åt®jF“&ª‘p¡¥’ ª¤efq.ÓPrIcû/ç”´“‹›þVN|yÏ@>-nEA¯QPì4¨±I,Óð^kG/¥èI“«Q¬NWKõ¬Rm9Ù—ØehÏmî:ö¸¸àšÅWWl™ÐÌÓFF;°ù¯lr¼‘êÆôø*+3¾¦cI©v\’A…>#?ƒå‘6´uÅ+,‘îíݰº|†­Ùõ¿Þõ˜ÇîÐpv‡†£ht´óõàþÎMyrP7†:¡ûž4«? ThcvÍÆf@;¬S£9\2¸Œ„;ÉM€OÛf&ëÍŠ2Ñ—f(÷â6¤èéX˜Ò;¶a`±ƒÛ -ílóI8‹Ñw-í‹:<;a¿*0’FbÞ9>}Ÿ/¢W`DMÎCmh jãNñ}ŠÎ+‹ØO~¡ÔTquTòµ.,º­%}4~ü8TÃm?‡q¬1ÃBTJce…‡uÅ­×Ñ֊Ƙ±Ø( mvV¯¤Sú˜®µ·'­šÏÆÜdûqË<™ÐÜ }»ðzH: Öã¥ø ¼•¿)¬Rª”R§™5Š‚!;Žq«Ã9RPvѼ¼|T6ŸNǾŸ]móÕJÇ¡ÃW+œÒ¯¶œ‚ ~JPx»™#½]l¹™Æß idvt'¸‰‘.ÆTÞK2×{¢k7¾êc,K BŸ#gÉíMˆ‹ÉMaãŸ)˜ã-Pz¾ì®ðÞÖH€jÌ'4:–ç¢ãùe@0{ÛøÐù@‘Õ ÛAÍ«ÙØÔ( ª•Þq_ݸ5˜è˸†›§U79„o;@*Ùì}í>&•yïÛ.>@»v ª¡bÔ JÑxS*§›yvá]´´.»”•½J è°Õ™ÙÙך(Èa_ŒòwÁO“ÎùJÎæd\½Ä˜õ6ìãG`^"ÿᅳéT(!þM¬ì<øt|G¦U2È­yö ‡~cËN‡¬gfð½ÝÈ•Ä,r\égwm'lïêJWm.ÒU|x««±‘—™³í=—ïç±$Gnoo^sÀêYJJIzGºh ˆÍÊ#6+3/ ``Ñ· ¸èXX»1µ•7“ôi,ŽÌ-—¨5('Ÿ½ç³ðhîÃü›KJÒUŽiœ™ÞÞÛ„xåU ÅQj1–ÔjÆeÕ×N2âø£À‰§{0ĘÈgf—\25ô ôçI]…QŒF ¨Ù8¬LMÆftB6FgWº•ܪвC'ŽòÅ=ÍT½ËÚ/䄳í@ºNÓxmÑ;¼óNá¿E¯ÜEK%ƒÛÂÉA‡G JÌ1"J’´®ž¹@†@ƒ½_3Òϙ«+®®®8Ïò˲_8iŽ£¬ŒÙüšîÍx³•M•g[®FgȆpù_(_¦šßD!þm¬ì<ø¤\2y.‚OKÏ©mÞ†=Ã}hÓ€?=`íJ‹âë¬n¼7¼Y{ã9gåÄcƒüñŠ;Çòd¹ŽŽÌèíOKã9>ºœ‡»S\T.žÉ#0ª ®.ö´²Ëç\–Á ç*ÖMfüe'ûðêˆ ’vÇr\ãÀ=Zñ0|\4OИ•ÌÒøÖ|ÝߟŒË§ØTÉmË5)'.æ*‘7µàC"¥QóÓY—fÃûÍáÐŽ4-üXY,WSó±tÞä¸4V½õä§óu¤ÊÖ6N$œg¿™~ÈK‰e~DSVÜÚý‘(~ŠË&mü¼y¹‹Ž»/s¬r«?U´CõcS%áR« øbH3”ÃIÄØºóZ_74ÇÂ9—f¢^cµ}iNr·q0Ýž>ãѶy©t[uæ¶Î«xïà6ÂsÚÓ®çmôZñ6Ÿ|ô 3ÆwÆþÊN¾[ŸJSÀ¦ÕHFømá‡E_à0uÍ ‘ìYý5›ÔÉŒpÔPýŠ+h±Q\IqÆÇÅÆŒž rîÔY^oÛƒ9·te™îΠèá(V¶ÜägÅß—2¸~‰%76X!ÚµoÎÃ¥žfyúýw$«K&ilWæxîeÜš·àŸ¦G7ÌI³HhÕüTžZs‚”›Zòö¼ ¹ ?Ç€]—¹`.câÁÖ|н=Ûú*äçd²áØ)fŸÌ&ߨeëùžìÙ‰ÇiúGRµS,†!ƒ×ÖþMÖ @^ჯ&Ÿ#µ3š°â¬]ÍcÓétŒ>üy2¹ðíu('/=‰ -h›È±¼ÂrwF倻‘5—óÌö!ìµ£’T˱dr\VÉÀá°$ÒÚ¸°*4½pÞ´92æ²òσ\íÔ‚¹Z°¼‡cQI),Ût„7ÏgΉ­É8¬L Ʀ1'‘i«Cy#¤KÇ·À9/›Í§Bs$“\¦ë5Õ— Ò`u•Íù-IwÄÈ6åÎ+ÎtÕý‚Cl Ï¡}û`}m_}òï¿´ §Ö!L~|y‹Ž¢×) kÆÄW_Åú‹¯øù­-$ è5‘§Ä׊êZ­+ûw`ݪ…<—øŸ?۵¯ìÝHj~:ÿ÷ëqt#;òlHOîé“É®øRµÖtöq¤©&Ïÿw€GðÑ?BˆÚ0râÈqÆ9tgm{Û’dö²ÈMe7нèQÀ¯ÛÿæÑJf>Ù&û!ê•B«.=8Ý%™¾ß]àpAõŸ–AÒ å’Os蜖6=Zã¢PÉ<ú>}îÌ‹ÂO_ìC×k>MÍ(™mpÆ|½ÈÔ³ot$Bˆš0æ±õ\å—ˆŒ¹iüÑð!HB+D=Ò95á³a~h¢Âyàx¦œIµbå;’gŸNã³ïñß•Y(ö^´ø(sï’ŸÇBdÊBÔPCO9°$ :å@!jÉ Û%„B!DÝIB+„B!,š$´B!„¢IB+„B!,š$´B!„¢IB+„B!,š$´B!„¢IB+„B!,š$´B!„¢)ªªšü¥°ÜXñ!„BQ+r†V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E³jÔÚÔdv¼2ƒB…{OâÝ÷& kÔ(nˆÜ°%Ìzq©€ïä÷yw’Ã6¾šÌ¶¦óÉyÀª;s–½H7}CVøO’Éþ¹÷óv(@;žþz>}ntLæ@ÚE!„yjÔ„VM9Ζ3Æk/Äíf_Ü$š6n^];*Y6óÛÞ+äkô´|ý½Í9^Q9sîGs‹ÍÜâB!LkÄ£”JÊñ-”Îg!–]ûã˜Ð´ÏV^•¬ ›Xµ6°¡w‡‘rp·HµéG vÞÍi’˜ zoì|b޹±ªâiìvB!j¦ñŽšj '¶œÁXîå˜]‰ﯶÑ"¢z:ÍZÄ'7: ³#í"„Â<5ZB«¦ž¸6Ý åL¶ZÅa*DÿÅÁø±ÜæS>£UÉ‹;Àšï~e×ßa$èüéØg SúGóÎÜ_Ig}ÎÂÁn(H;³‰ŸÖþÅñ°pbÒmðjHûÞ#¹cLw¼¬ —¢à2«Ÿz‚ïc§!¼òjON¬ø†?ŽÄ­sÆ¿ãÍLy肽­QŒ‰lz~K‹cÊeÿü{™ä½3Ž !ÉßÏOËa÷ñ $êüh×s“z—Oå‹Õ0îܳ|6s›ÓßÉ,˜eφ¯V±;< ïÖtì9Œ;)fz¥Ú¾0¤‡±}õÿØqü£®’kçE@ó@ºÇø-±×jûÌ`ÑÑ|@O¿——ðT»¢rýèæîȼ˜ðÎÜåÍŠÇžá׫€×x^º ›—­eÿ™8²è=öA¦mIâ¶•|»á ¡‘)XyÑgÜÜ?,‡’³}fЕÍ?ÖÕ¢¾’rr‰;²ž×lãDD,)¹:½ühÝ{·OD £LÅöf/öxw"~E[söÑ…<øúaò)¿¨ä]9ºU¿³ïô"¯d`åæO`·áL¹km«‰çí›8óråó²k4¦jÛoµiG!„ÿj”Ъ¤ž¸6Ý EÈ êŽðCØy Ї=ƛ҇%CüVÞyæSg¿ű‹9uij’ò¤üŒçÞÜFbÉkć#>ü{OåÍ—Fã_þæ³ÌS|ýÒ"3ŠþÎO%úèZÞ~1…—?šM; vî^8DÅ“‘_´Œ­#žöTuÍü•sVp*§è…ìhNnýŠSíQë+îäÝ|øQÄþ™Æua>›Ä[ó&Ð̺ŠàÃÕ]|øüûìN)ÝñDœŠ'âÔö„¾ÀÂ=pÖ8Òá–ÎX=LÙœØAN—öØäÇpàdQ£5Èßr^ÝÆÛ/¤RœÃg\bßwóˆüÛ„ÐhŠÂ&ÿjÛ¾œGšý‡<7Ð õ£IÕÕg¯ù\^7Ÿ§—Ÿ)Y_È'=>‚ÿ}ÂáÇyfÑcôv®alÆ$vø NäMë5ùÑëyíÙ¯ Í»öš!)šS[–òÒÞ¿™½èYnö4Oß•j>¦Ê}°>ÛÑEæ?!Ä¿YãÔTNl9ƒ€¦ èæ‰G—A4/zûÒŽÃ\5”^>…K¿*Jfü‡>Ì‹¯¾Ì£·µE›PêÀV´xÖI¾Y\”Ùwcò3¯ñÖ‚˜Ú߀ÜSËY¼%C¹Ïaˆ#2¿n›ÂÝChYœ¦íäד¨Š+ýŸû˜E´,zÆÞÏ,æÓ—nÁ«²LÈËÆO®%³NFp×Ô»ÕÕ5=³b³Ô5îì(â ¾ôS'¡uñY²s?ðùŽ„ŠË—j×}K—$6Aøoö“̼+„€¢õ‰ßòËOd¢¢àÐaÝl _O?¶è¢D¨ þ(GŠ2Nïýñ)Ÿ`SHõ fÌ”»ÛÓ£¸rbC£1øôfìÜÞ¥èõ¯;L’ÑŒú±:ÕÕÆšŸ‹’0}GÆ=ò,s_~†‡†nt);Yþû%òk[Æ‘ÂdÖÚ/j}RÒÀöO—%³üoº‹Yÿy‚©C›&ÎY‡ùê›ãdR˶ªÕ˜jÀv¬es!„øgi”3´jê ¶œ.JC|ûÓÃS‹Véʈˆ"vp4q#ŠŽ˜jò߬?’[¸|óûy~ú0¼µ@»@\’fóÚÎŒ2ågùƒ}éZ:=<›‰½]P€–MõD˜Ë–4•° {¸rË8|Ë|Ò‹qó_ãž–6€Jˆo<3> ň„èT ½kÕ@ù—ÿâÏâKµ-§òÚœÑøZ·öÇoî£|~¶ì´ƒºÇmGßg_ç©^Ž(À°Î<õÌâ0rvãAÄ«’¯*Æäì;Z”•zŒæ•W¦ÒÚ ?}Zª<úÚÒÉ`ïúPêÒ {»¶ í®gÿÞlH:ÄØ{ l¦%ùä~bðf`?*>u-i¯<ÍpO-d‘üÈmÖ.‡ñêDŸ¾= ´×й½FVs&SÅÖÎXaN¹)MÇÏcÞä8iܳœ­Åg ‰‡Øx¶0¥TÚÌà¥ÙCðÐ}ZQpöqVFAöñ¿ˆÈíFÛš—[ë1UæÓ7¦…Büó4BB«’zb+Åùl“¾½hbàE~>¬ü)gÛÑ$† ÷DäÆ#ªètN@HO<‹Ï )ö´Ö ÇÛH/)?Ÿ«g")L œ\òÓ¾*º6ªÈJ+Z,ö—sÆákS*4û¶t÷+~AÁΧ)N„’ó•L0½žÙQ'‰+ú«íèø·®Ö“¾£;ðåÙ¥¼µŒ»tO9öæÖÎŽ%s ­B꿆•Ñ@ÜiâòFâUIR’{²(ß!CiY²Œ‚}»áôuÙÁŸ)u–øü^´ÐÙÓfhìöî"‹xöŽçŽÎî(ü˜Ï ú•ŸnàÖšVÎE¦µÃÉÈÜÛвøº³Ög[ PÕÚ·Gƒõc Ô >Eï…¯=œÏ"¿çùû×âÛ¡'½‚ƒ žð·zékwyDÓ‰;Ƕ/Lfë ÿÊi®ý¿iŸ¸W®õáÖ—ß§[º=ž&¦«T¦Öcªô´…ÑŽB!þ‘>¡US9¹5ôÚeâË[ø~Eaµ ×»°ýI· ÅC†¬²Š^·sµ/sÀÒ:xâ¥Z#Ù©%mQ³ÒH­,C&i¹*”N„´Öeæ)* ÕßRU#9%qèqwµ-U–‚µ‹ö×wéž²÷ıt£hñ,~À}n:9Uœ®RsÒ)žÚëàåPvަ•^@ “ZR†]ë!ô´ßÅ_™pyÏ1‡z³ç\á›>ƒú]KÚKÓXU>ßRcebΪ¹ôc Ô¤>};î{j")Ÿ¬æx@61§vò¿S;ùß2pl;Ї¿‡¾^5üU{/\¬ë¾V†œ´’¾×»”NlÜüiæV·rk=¦J/p#ÚQ!Ä?Rƒ'´jê)¶„^›õxeßïüZÙ‚ç·r¬ºŒ©Z©çvBñÔÀWëTROm&´Ê»”J/zŽ­ÇSPkÏÖx½½u'QÅweS8òë>ÊΠµÂ#È»hE9žzí`®æ“|ñ4¡¡¡„†ÅUמ«.BÁ®i»¢¸UάßÍ•â¤ËÈþõ'ËÝÌtq§ïçãé%±äFlåÏè¢?ü:áSÅ{Çeþ IDATeckïŽ%sOc6oæbI’¬’º¡äÆ«¦mð,ÉJli5¤7΄ñówû ¿PøÞDßz}ø¿¹ôc}PÉ<³–//fñ’9áÒ—‰3^äÝeßòÙ¼ûèVôô35ò81y•}º VÅ \ò%r‹>¥f~(¢ÂsÖ^m®mS{Ž^» Óx•í æÞ{ïåþÇ>#4‡ LÅS·1US×׎B!þ=ö ­šÆ©-ÅÓ œ¹åµÅÌhkSf‘Ü3K˜õÒ&RQ Ûv‚”›põêÅ ¦+ù. ˆYżŒ v'íØ~;œ[®ÇÃéb}Š£y*aË?æ'ýôpÏ%.t+ß~·—«€u·'Yü¢/vÔž¢)>7–KÂ¥r:6ÅF[ñŒ™Îo 7ûý—A=ÿsÄ1º‡©Ç~g]…¬þzâÎbï[sxoü-´ÑE³síâ°¢Ó­=pÓPi¢qíΨ®:Þÿ;®®ãÿæå3yx{ì²îÇ¿Š¾(8ÐotGJ­œM‹ÁôqÙÌÆH/l¿>Es¡ë‹ùôãõSУؽuÀ¶³édÜÖ‡–îÒ£ãI+¾%ßÑ­‰ØLUaåJ€+ dïåÃ7¿ddw7²/ìdýÞŠ“5´^½Ü|Ë#€ _1ÿÃ,&ônBö‰_ùæH€¾KšÚ˜ˆ§’¯¿uS5SûvBñïÔ  ­švòÚtÇî l^ñmÓl]6±#Œg·q2u]|1c Û_ú ýä|{²èz=dg—)Cq fúC=øï§‡ÉÊ>ÉÏïäçÒ x†ð茾¸Ô)sÑ`çí‡=È..Š{¶Tñ@~]SFÏÇî9k‰RÿηNjÞÓjÁP6©­sÜZì 1ìY³œ=¥^¶é<•‡û»U}Ú]ãJßGf±ÿùØ›¹aY¶±Ì"ÞÞ`j'û²IžMsnîçÆÆß“Š^ð'¤O}N7(d6ýXl[Obr§½|y"5zß~²£ÜZZQôÌà*b{³—‰Õq£çجxÿ09@zèF~ -|KïeGv|Ù .h½6{2»ŸÿóˆÛý‹w—zßå&›ÖGÅDBow+Œa¬ÿv/…ÏY÷§k€þß‘ÌÞ@Æœd’Ò9ñã÷„М›{{I2+„B³a– ­ÆµwŒðc޺˴·glGïâŒ1%µäéU¾£¦1Ü×,ÃÿGÉþû=YZò·m¯ÛÔ Ó „B!êÆ<3BÅN÷-àíÀßXûû.N]Š'%%ƒM›uâæqÞÕ9=Ûð´:t@¾bOÓàq̘Œ³´»B!̈ÅÍ¡B!„¢4ùt!„BaÑ$¡B!„­AçÐ&''7dñB!„âÄÕÕµNŸkЄ¶®A !„BQS2å@!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX4Ih…B!„E“„V!„BX´†MhÕtö¼4‰I“Êþ›üà“,øîñùEËeìåå)3Y‘o²8³’u˜ùw=ÌÒóyõ^t~ÄJfN™ÃÎ4Õ â2°{Ûn”ï/qÎhzɼäZ/Þ΀sùÔ!òëVÂÛÂ÷óí(Ÿí¡Óïüža:hCNŸî8FÛ¥;PoÇaùAÆì'´x(æ&0hÉ>ž»j¼áëgÈŒ¥×’,L¹µ›¯†í•´¿—ñì}“˜<÷/¤éKiäý¶1i ÏMy‚51Þ+ˆ^Åc“&ñÒîôŒóïÓÚ­ÏuPSÙùbÅctéÓ>#·¾+j2Ûž/_×½Ìzn!K·„“Y´ÒÖf®1ÛÁÔvf––÷òÊôöØj~:1Çÿ`ùÏo±ÐêÞº£ºF âÊËÚ§Ÿb×°xs¤ÚŠÖƉ»4ÅÑUƒÒØ•³ùôc<›éÅG#Z¬ÉdÅž0Fýjäàí-éYÉ 3d]eÆÏ'Yjt㩞myÛUKÒÕ«¼0”>ÉFNŽð& Ôòõº~ÆlÞúñ ßu æP'ÛFÚÍTmÛ¢Üò :îÔ4Žÿ¼+fóÆô>87úÀþ‡hàý”Æ¡5ƒGEïg]ý0Ç>-×>µZŸë¡8Ðmö›,Ì*üâŸ±Š…K¢òÌ pÓ :—¦Xs²Aª×´™ÊËSÛ`‹JnÊeÎ\ÏŸ>ÏÙä·˜?©9º†l3:vV§ÆãÁ‚Ö©!4ÊqT±÷£UPvE·n„ýż¹c/±ã›•I„åÒÚ¹ñ|·Rw~úU–ÄYqߨ õ·œè6¼€íßFòN|3¾÷+¿i°yÏY–ª>¬»£5£ìŠvŒõRh÷ë^‰ód™ûµOÜÈõUkÐ~Q ÈÎÓàÜ"—N.Di\º0~j—š-l}Z«õ¹.ZüZTôW®Á’ˆW‹@‚¼Jí3³¨v'ƒ‚ÐКŽ=ûÑÍ{Ïü¸”Ý7Ïc°{cµƒyk¼ñ`Ùn̉!Å [½äPPÉùs5+œ?—}ÉÚ}a$äØãß}8÷L¿ƒžV€JÎ¥Í,ûìgv…%’«ØâÕn0w;—Mt@1}Ã’¶ŸÖ¥%ýoŸÍôaͰUª+»¢‚«‡ùiÉ 6¿L†µ7‡ßÇÌÉÁxFJÞ•Ý|ñõOì8“€Á££g<Á”n.hª]ªËv.‘”Ã_0ç­C=¶Çx\ûÖUp™ÕO=Á÷1ÀW³˜|ðy–?£\w\ÕÉËHäÿ¶_à‹è,­ôÜÒ¡_ôö   ‘a_‡Ñf\o>rIfØò ô@ò±K¬ŒÎ"ÇÁ•'CÚ1?À-“Ï3ÛÂY›‹»'Ï;±rS<ÝÝûí #1†'wDò}\.YhiîëÍ‚Á­˜âTq¦LA^ž^îÜ^jt¶z|5’ò+25;™w.0à¦æŒ°+{Hsõ àý^:.« eV¼Ôúyi0楳d×9Þ¼Fdíšùñæ æŒqP —­jýý xㇼ”ì܇ÍÅN$u/×ïv5†ÇwDòó•àG/Óýä—KŸ•QL¸³/¸®{FÌišÿaäÇû:0D-Œ=xˆ‡#ù9Á€oÓ¦,»ÉÃ{β0"“$k'fßÜw[Ø`õÞÚªúÞ!‡×Ë/?n/Õ/&ÛÅT,E㲄1‘MÏÏ`I8þ$“Íæ‹…7ã˜|”ÕK¾aÓñK¤ZyÐ*xÓN ½R8ågÆ·txn"‰+—²Çíq?Ûµè€]$ë0óg¬ pöpâ׬aßÅl\;߯£3ºraù§¬9E†] ·Î|–ûƒÝÐIµ¯Ó¶6Ûùu—ab¿ì_q?õJOôÕìç³/nbéçkØ{.kÿ. ß–*'efþ´%ø¾ú1ùž`þŒ´~r<™ëÖ°ãd ùîýÈLîl`K}ôé£ÕªkÙ>Ï(¼S¼>Ö5èÿ*Ö·«K=Î+lØã Š Í†N¤óOï²åD*7‡óZ™~­ý­ô8;ÉÏV“ÖuØÎÊlÛוŸ˜x/»Ôø¤òå[±þéÞÎÌ\#ÝfÀ`(ú—›JôŸY±' §Î=ð.)¸ †õ¯ÍaÅåÖÜñ̼1÷ºe¬ç¹ß–£BþEV½±„}v7óðË xíùûè–¹‘>ÙKŠ ù—~á¶£8—^{…ÙCôìÿâ~ʯ¾ìrÔ¬S|õâB6ððÿ½Á¼‡ƒÉ\ÿ.‹6Ä&†d¶|¾ý¨§yãg˜èwž_¯&<¯úõ0Uöµ™+FÒO®dÞ¢½4þ*³K'³V~Lxç}îö·¢ÙÔùîå…gÁ¯#®ê¨y)<±úŸ©^|z[¶ßäAòñSÜ~"› 3éŒY|²#ÛöíØ7¥+ =ÒY¸ù"{óÁ˜›ÄŒ5¡ü`åòqÝXÙÉŠå›/p¸¸C:¯þÆko>Ó#[127†û·&WI˜zÏl›Ô–Ñ¶×ÆÜ‰ÓQü¥:p«kÅ /Ù©É3èÑĺâežÉ½Zò´_%ï•Z·;Ê3ÉNüß­Ý90&[s¢»6œ}ù×–©tý v¼pg0 ]:÷ïM昊ÉlAFw¬ ãW7ŸíÊ·]mÙ°ã"G‹3ÚüTþ»ú8of¹²pTwvÝâO‹˜s øý2áÆZöSe Y¼³'•¾ý»ò÷¸æ´Š‹ äÛ“ìðdûän¼ë•ÅG».sÒÐmaªï•jÚ®šv1Kù†Ñ¸3tÁb¦·´ÂçŽwùvA®¹gYñâë¬MíÈÝ/,äµ'FÓ$ôK^Z¸‘+Å}cˆcóâï‰i5š{n Àº²öͻ̯+ÎÒfêÿ±hÞxŸù‰¹³ß"´Í¼úÞkL ¼ÌïË~'*È©CuÙί§ Sûem%û©jÊ6$þÅ;/}ÎAÛyeOŒñæèçßq±¦Óu bØðÅt·<ÎÂ÷_åîfá¬ùà;Âòë±OkÓ‡µmŸÒëR“þ¯j}skØ^5рǕÒ»¦´õR¹r. 3vk9F«<ÎnÖ0¶|›×e;+ßuä'&s—ÒUTµ\¬Wãogf¦QÎЪ'Þæ;˾¦o7‰çîë@¹“cäElä·ˆ@¦|!n Vþ çg~ÍÆðÉ´ne…ÿЩ<r+ÝÜ´@+Ü®üÉ– dÀ&9’D¥)ㆠ¤‹»‚üpmv­£¦ú²ÛÛ”ŽšŒ¿°=³>6‰¾. ÐŒGScù<*†,P!`âl¦ôõAK cî8Êï¯\"¹òbLÕu'>é&Ên_Xö¹Õ¼¾h=ºÛßä?C|*k¬h´((( Rzã*ß%E_by®_iÎ$;{¾ÎÊffr©å÷[FhÒ© ¯Ú¡ü»{±`m&qFˆ¼ÄOV mÆX[ÀÇ•ÉtkÉ„ù¯0¼š²ËopªQ¦êyŠ[]囩éõГp¾š²±&èÞי幊gÞùœ5ÃßåÞÀ¦´uŽ«b”g4ª (5»{RÑà ­¬Dc%g ”’ö0æ¦ðâo'ø0Ç‘ñ-ÝÖ¶Sšœcøéª*S¹F¯ßc)hÑŠ!þ ÐW½6¶N.φø|þãl]¶ŒY¼·æ¯8vâÊ-•Þ¨ªhõެؒîå¶"kkŠÑÔúWO£T’f+Jµý£E%_­e?ªÁ@žjºôªÞ­ï¶¨}ßW¯¸] v±Ôˆ¢ AÅP|>I±Á¾&òõ„PMuÚÎk[F©ëÁjÆ)¾5±_.ÏtÙ6\:TÉX×T?þ¯Sõ>°fŸ¯aŸÖ°ŠÚ¶Oíã»Îõ­Q w\)SVVgâš´öÀš´r1ÔfŒÖä8[ ãÀ®ól}’[øŽ¢ÃÉ][m?WŸÌcJkïù— ÉT­ÊµeCogfÆÌ~XAƒ½_3Òϙ«+®®®8Ïò˲_8i$ãÄOüÛƒg½Ê÷%¤G+srŠ&1H>º†o~»ˆK[¹kæó¼õÅ'<p‘M›¢°2Yvù Ë ·–^(q'¸Xòž+›òô‚?‰3`‚RÍzTSv kÁ-!Íñ¾Ÿ{Ú&òÛç¹|Ý…«.®ê®Ekð÷Ô£IMæhÉg•ðS'è²>† 5žI®!ÀË%%‰¿KŠ*Qqi$©…ÿOŽŽàÝw~¹£+ßökÊýÍqÏ/w“V)jnnŽÃ±[Žhj2™ÐÚ»ñ¨¿Âæý—Ø–Sö½Œ„X¾HVèä€c¥ŸVpqqÀ-;c>vÖøØYãiLeá®KìÌ»Þ'jhæm‹!é*Kµs|\RQkhân‡mF2{²®Õ•™œÌß[‚­LöS¸PU2 ÅŸ5›Izîﶨmß_S]»\ïîN‹K3_t‰'9›r-šÜècDä{èÙ ¬K×»×¶ µšýrm˶Â3È cÔAÎg^£©gU³ß­‹ÆèÓÚ¶OcÇw½êc¼Qs‰øs5ÇÕ¶ éè\MbUÇÙµogÅÆ¯&MhÒ¤ M¼ÜÐk«ëgSùI8Wª|/²Ô\bSeD–›slNÛYã0»Ç_Ú´É¿-ü°è ¦¡™!’=«¿f“:™ŽZ¬ìœ±Î ã¯í‡° Ô“|j#ß®‰Ã¨?Ï™èlz/°é»ß¹¢yˆ‘ÝÈÜÏ® MnvÁÁdÙåv Î]o£Ÿn!Ÿ}´&vÇ5í0߯8Š:ænܵ ×µ&Ë¶Š¿V¶ ƒ§Oà§ä«]ýy1ĽÜY7b #6Š+)ÎøTzJMãªþ€ïД۵'˜¾%µ‡¾9‰¼´7 c—–økrªý|qÌ>͸mÏIÜÉ’n®¸¤Åóâ±\P¬Ð  ³¶FŸ—ÆÊ³‰Ø{i‰½à ‡³1X§³;©€@«2ƒ756†uyzfºØqµL]~Þnô*Ÿà*6L¾)V…1ô‡,þÓ­ 7¹Z‘•œÈ‡bw àû–6h«8âØ{ù1Ë5–¹ÂpëïCgc?¾Àç4çQ[jðåC£¨$§dr!KG¶Ô·K…€M¶÷4÷lÔóI7¼2®ò{ÒÈ/œ¸ƒ“OS¦Úå?/`×׋ ‚4>ú+šxï îwÕài_u?Øæh•ÍÒ#Wì‚&þ2žÌÅ¡fÝ×ÀmѤº¾w+×v¥BuíR“XLÑ·ÃÍ./³ìo°¹{>ygù}ézRÛxׇéã»áœ´ŸW„a I½µk±†ïÓ:´O©ýøuǧfrfý*öчÛGµ-™QŸê:Þ ©—;c‹ FrSc9wðwVm¢Åä·èﮩöqa×wœ-ÛæÞ×=ªëgSù‰;¶&r+2‹êР3¹f»5³KhÑ5c⫯býÅWüüÖ’ ŽôšÈ‹ÓFâktœÊã£ßã‹oÞà/ÜhÙs$/ìÆ–÷¾äûÕgéýätþ{Ç–­}ŸWVÐ:úÓmô™6Ì­¦Ë.GqìÎÌ…ÿaå§ß³øåȲõ¦ó°§y~|º|Ó mµëaªìËåŠ ÃŒ›yyùJþîñ8=Kí‘´®tìßu«ò\âK|þèu¶o54¶î|9±=Ïo¿ÈC¿\$ÕZÏÐíù­»=6†š&´ Ñ{ðõø6<±5‚»~‰ÄÃÛ›ùC›“½!G-8ùµbE—Pfï9ÁJlèÞÜÏ&º±tS/Neüpw®=yT%>9›²xoëIÞ+[£G÷ã·€Š+gíìËš;myÿ`4?Ÿ8ÇûiØÛÙÓ·][Ž{ÓUGÕ;1­/ëŠÝ_癿!–£ŽNÍ›±~?­k’/h¬èÂû‡NœÑ™¨[ÝÊÌõÕ:4aÕmdÚÿ"±vqãѶxîˆ@Ñ9óî„N¸ìç™ß¢‰×ÚЫe»øÑJ˜ê'­oögò_aôýVK+/ž ñ'mGv o„¶^]ß»”]~ȵ¢ªm—ë¤èÛ1õõ°ÿüV¼¾ŽT+{?ÄkŽÀ»žb^§:¯s;¯mz“ûå3ô~ªcÙýÔ³]M—í>ˆ§_Ïcég?óé¼ÕXùváÖGfãüùêëhÉÊ5FŸÖº}Jíǯ;>cÛ×±oFÝÚû†§uoưÌ©ø/[<[¶cèŒYÜ5´yÍã¬6·Â˜¼Þq`ºŸMç'.ЉÜ%¯8)Ppèjb¹JÖÉ\¶³Æ ¨ªjòzÀn¬xÄ¿D~V*¿]Qèß̉&E‰Fò¥PÚì°fý”@z™ßW-!„B˜)3›C+þ-Ô¼4^ßxœ©Ç’8ž‘Gd|Oý•€Ms/:H2+„BˆZÔAÜÖ.þü2<Ÿ‡÷„Òuo[úµeS§= C!„¢˜$´âQhÑ’ -ZÞè@„BaádÊB!„°h’Ð !„B‹& ­B!„°h’Ð !„B‹& ­B!„°h’Ð !„B‹& ­(aLÚÂsSž`MÌuþà½YQIû{ÏÞ7‰Û_ØF|Ä÷Ìž4‰¹û2«ÿhD¯â±I“xiw:&‚¯rÒøtÇ1Ú.ݲx;Ë2fo<¡ùE ä&0hÉ>ž»j$/9‚Ö‹·3à\¾ÙÄ_Õ®ë?!3–^K°0¥²ËãÛ5ÛQWþÏmK ³%ÔMƒŽ¿‚tž\^¾ vàñýq^¼˜Så¯\×$.Ó} „h æûZC,kŸ~Š]Ã>àÍ‘^4ÐϤ‹ú`Î}¥¦qüç \é4›·§÷ÇM=ÅQc±«ñÚ׎ơ5ƒGEïgÒ 5ÔŽ!ë*3~>ÉR£Oõà£x IDATlËÛ®Z’®^åýƒ¡ôI6rr„7¥–×Ú8ñ`—¦8ºj®?~c6oýxï:s¨“mƒïlj´®ÿÒ¯ðŠW+6 tÆ¡Üë6z{ô7$¢"åÆH½Ž¿*ø´mÇôX¹¹Ùì gÎ'°½³sÝ+ —âú˜oB+D}P ÈÎÓàÜ"k¬èÆ„º5Xu—.ŒŸÚ¥Áʯ6ï9ËRÕ‡uw´f”]Ñ¡8Àƒÿgï¾Ã›ªþŽ¿oÒtï–Rº(¥…²¡Œ‚8@T%KÄñ©¸eˆÈv""‚ ÈáOD”%Ù ”Btï‘ä÷GÓÒ–6M¡E«Ÿ×óÀó4¹¹ç|Î9÷æ““soz»)4Úz•)1µXérûjkgÆwtþ{ª{OLŒÕãõqë¾1³´¦mm{ìÿîŠTà~Œ?k[[ÚÕ¶Á{v×p:ò k¯e3ÞÅó¿©^Bˆ{SÍ m.Ñû¾eéú=„Äe¡vô£ãÓcþD],Ðg†ñëÊål9J|¶ ^A]yaø@Ú8ƲñÍq¬‹VŒfбñ¬|5…éc¶ƒØ÷ÙŸt_4‹‡u¿3ÁȘk¦/g [ŠÇ´/êq¶‚>ÀhùK·•žì¿±rÉM G±Ä­Ñ£<7æZ”÷“ý‡±¸ÖŒÄÞ.8”ªczB4¯ï½Îº˜2QãëáάGëó¬½ Ðq)ô*#ư7U‹ÆÚŽgÚ4dqSÛ;fMU6#‘™{¯²4"ƒ8•%mý¼ùâAOÚZPS».ž„Ÿ¸ÎñZ<¼½Yùˆ3'^bvx‰æöŒéÜ„yõ,0«ìöÅl¬M}ÌQ©·¢ymïu~ŒÍÅÒÉ™QAö%ûð.Ä] ¡ñ®>|¦%ct9‰ ]wŽKAmØÓÜ3cãÈMOàÃ=Wù*2“3+oRŸ¯‚]ñ̺Iû5ô{¦- ã9=ú¾ÿ§ãûçëqxS©1Ò ž.6þrMè+cmeE½4fJÁìknO¬£ó“u‰8t™ 6¸ÚEÏ€bõª¨²Sâxç0VÝÌÁÚ¥ãÛÙ³fW¯>Ä`kŒWBˆ»R­_ÀåÝØÌG ÷ zhïϘ˜.Vùj.[#ò ?š3&±:ªßùˆ>x‰Vé;øèƒµ„æ{Ðoî|ž÷2£î/ønrk¬M(O—¸—Å«oà?à-¦ML«¬_™7é+Îdܹ®IŸyžg³S÷ ¯|øS_iGÆŽyÌùå&ÚìK¬ž8“-)My~ÂlfŒëIíå¼?{'±…g-m ¿-^Gtýž¼ð¤OÁ§úÒ‹1[o¼}*ŠÇ”:æGóËW»Ñ<þ³çOãùºalúü;Bs@›°¹ï/ã˜e'FN™Ê¸^îœ\ö×òLè»âÌ<ïì+SêV•}Q^œy.<6k1Ãý̨3pkgu©Øû…>ý$K&}Æ‹G3m:¯=iËžÏ×–kÂ`+TÖ8(ÎHTºü¼kløh)‡­;óÊäYÌÿ"­2v²pÑ!ÊZº—•’Äi­Ýj—ñ殲bP[?Þò4òƯËdÁ¶“¼“dχOq´—?OfGÐ{K‡óno³hïM,7âð³-™íšÆìß®qHkÍ„gÚ1ÛI¡yÇ`2zݙ̢McÚÿ…²ÉÜ%½‚Øß½>Ýs¢ü{<1zÈI¸ÁS¿Å¢ hÀξ-XÑHÍæ}!ÌIÔ•Þ“é±æ¥ðöÆ3|œéÄìAxÜ‹zÑ—yðç( w«ÍdîÁ:tlÉ©>¾Ô §ÓÚsìu÷gÏ VÌsËdá(Îiïbû b6Ú¦yŸÃÀM¡lÕ¸³¬wKÖ¶´ä—½×8YaF«'_wç¿Â—¹ùú³È;ƒ {c¸®ËçÀ‘P6ØÕcekÌ+úÜdÆm<˽_>Õš=¸’tæéI?»™=­ûê:8*@]ƦÜdYD4ñ!¿ó{RC¦ ¦³›À×>– w°7ú1ºù¹¨;½ËÄ>'ÁÌkw<–{e¥Ñ‡å•ß>$§¾ùÖŠë¨ÕãÐmÏ=àpé÷›>ˆ$)OKüÁŸ8eÖ‘ o=Ck[ÀKÆè%iö]iŠªd_e^¨ nÞŇ]ôE¹q‚¢Q£2ÔM­RP”Û妜ÜÌŸ¹Á¼õZÚÚ)ÐÈ—q gx㓆[²ÆAqåÖí.Ê×™áõØ^ïô$­œÕ@}œce÷/ñdhÁ±ÔÑœŸ›C fxYÜݬOÖ­hæ&رèùú ¶Q{Z;+[}…/ã}iï è v³†Ìô·Fx¹1kK1:P©CÛ+˜•UŠÆýù®¡'ÝlÀ¯´h–ŸÍ&Y6™éD(Ö¼ÛÄÇm¨m‡K*f–wîÌÔXSnF°2ÓžÏúÖç%»‚˜ZXf±S$ß&{0Å@¡}°?£<ÌQaÎëרíÇ—-œðPÀ§…#“É$®(¯®ÌöÆcvÇX›ê¹~5‚j7¶w­G {éÓñÛc<Ê»q—%w>ÞññŽìР(æô(€Uë/3ôp á—4LàIC5dÅÙ7X•ãÌ7]|` `Ã7™YŒJÊ$¥‚k¤TJùcĤ¾22þÊvâ8¶'J>Ö<¨%ÏÛ«€V‡&°);Ú–&䦞ÐUÐzâ®ß`½¶«KoK Ž-kÒ“hz¬`WÿÑe1BÜ«jMh-ëw£³û4ÉoÚÓ¦UkÚµk‡—ФS¡$ä^æË1/°¬ð<¢Ï'7_‡>)÷î®pU{Ó6àvâªrjD»–ÝWɶ»ýé›|n…F‘_»~v…[kðêùÓнå[r]ÚètûÄbáÕ’ºšß¸—.€Ú†€¦µ)ñEo‰ÇôdDÑ¢Eyí£&7ÁX<ñ$XG™PG;ºÍX) ÌTyÄ_‰GåÝ€¢%j[á®ÞWAßUt²Õ’|½‚º•Hh«¢/ʋӘ<â/ÝDçñ0~6·Ë­Õ4› 7+zñmeƒÏéƒÊ–oáCçÞŽD†ç÷W¹|é'…“ïÞ¡ì¢Ḭ́"›[yz(ãR–œœ\’ôjj•™êINL%2?•akö3ªhüêÉÒéÑgê ŽQ•†vîEñ+jæ¦æÏ†´4'$&—S9“Ì/×ÒÉu¨€›'/9œfèêÃ,÷¯EOúÖs¥QI«i±ªHJÈ$˶‹-K°qv¦…ú&GÒ´`[S;µáë+ µ gGK”ÂÕhŠÁ\™í+ˆ¹pe·©Žë±9¨ëÒ΢pc÷:Îø«b6uÙ…)88šµ–™­‹¸Iàž·åU§‚ˆŒƒ|®Çg’ëàEkË¢hÜ¢){)¸úÿîèˆ5±¯*;þŠ_†^GlB<Óÿ<Ńú Žu°Ç@eF°§%w¼Z_A踓‰Ö±AEÏ«¨ëiãñ,L;®Ôrá™w¡ZZŶ9Cç.çÑ“‡8|â4‡¿ÎwKüè7} ]uzTöywösø•øžVÁÌÆ…ôòv[DŸ—M¾¾x‚¥B]"‘QP) ×•±ä@§•Êô5Š‚ =ÚÂT[±À¦ô™³Ôcú bT™—×>Sé¯2®ì„ÿŽ:j°Ô”}jT©”;OšÅ+¿ï¦òl«ÊŸpK×­˜{ï‹òã,Ÿ½öκ(ŸÅ-ãU¥Ç\Yã ÄË«[åË×§ŸgíôYüœVŸàömhñè‹<°œé¿—½½¥½#ÄñK\o8˜—l_]&Ÿm:Ê»fÄ>^öëuz=j+w¶ô÷#¨Ô™ÂÜ\ƒ¢¶ê»{ûÕå$3qÛYdÛÑ×Ï…'ëólíËt½Pð¼Ê‰…Ï<ÀK7âٞȦC§™´Çމ}Z0ÃݬÄ4-Ö&ì÷,».jôäù]ÙËÛ¾¢˜ ^\~›ª”2ö­”q,—bÚEaz’3òÈ¢“²I×Û`©T4Ô„ÇêAQL^³ª×jÉÕß}ÊV¢¯îbü•¼( pw AvNGóW{PÔ8–ùµBÅ}PÆÛ Jј¬ð¸ªT4BˆBÕ¸†VKÒÉM|»íŽ­Ÿä¹Qãùä«E õ¹Æ®]˜yÖÅ6í2×óìprrÂÉÉ {Ý%6¯ÜÌ…2Ö¼*ú|rŠÎdyÄ_¸AVñ¯–´Qüu-³(eÒ%_䯵ýœKeîf8û¹¡ÄœåZQYZbwÍæ­Y»Éöô@“pŽKÉ·gar"OžçŠ­rçâÑó´ÏurÆã†kÝ{©£†Znè"Žq¥(~)—N£-h‹ ëV.5Ž•ªÛý苲ÛÀÕß %ú4á™…åæsëâUÒ cʤ1Wå—¤'ýìl»ÙšwçLcÜ‹½éÔº>vÙÙ”Wµ3c½~;rƒ?²K>—“¯’ÚØbWæ«mqÎJã´VCksêX›SK—Âì7ØŸ{ï÷ÛLŠ g^² ›¶díÞ öµÃ%¯ð"5=7oÜàÝSéÔ©ëÉÌÎÍ8>8˜…Îi, É ó®bµÇßÅËô$fÞ®FR§´–´+c9MU3sETÔu·D›x‹cE7MÕ“ÈÕ*“Ù  9©cl'ê\ ebT>z¨`¨ðªe…*%‰“Åêvþ,-vD¬uÕëÉÐÞ>Ï„ßÌ ­Âᣢö}ì+½á¿ŠGuE} ÂÇÍ%9‘S¹·ŸˆI%Q÷ã¸⿪ghUhtWÙõÝÏĪ†Ò½©39×p ZEíÎŽØÖïN7ÏݬŸó¶CºPW{ƒ¿a—~ÝìTÌFjI¿Al²u¬Üp7e÷æ}´~¦1ª°,ß™ªzÅÊÌàÏE ðúM¬c8´î+B¬:2©¹]©O½ -ŸâÍl–,ÜýƒpJ=ÁºÕ'Ñ÷zï¦ÞtvœÌʹßbñüƒÔɽÄÏ_ï ¥áËtòÔ`ôÜÅXÑÌhû˜Uµº×=ÔQkp/Z¬]Èçóê0¼o+ðýêP´Ô®°ïî4%ûÊ=°‚ºý }q'Nmž¢íêOY´p3#ú6Ç&v?ßíHÅPLsÕW~I fÖ˜g†²oÏq,ý­H:¿“µ›bÐY]ábdî¾6%gÉ =âÏú ¡<¶>“7ZÕæ'32“Xp4š0'ÖùY .'²qód´ÓM>ø%çŽuh®Kç‡WY†/c-0á÷7TŠž¤ä ®fj°V—ø­17Ç*7•5—°qSs3*š '²Ðš§ñgb>½ti,=I˜*€W=ÍÉL¸Åºd…zæw^|gb¬Nx3Äú$o켊u7òSY¸/’8÷;©LŠé^T³¿Ñ)TŸzÞ[þ_5ǽQGžÑÌe·×Ž)æú¼;‡¾Åº8pkÔ…×g¾HË2n…¢Ø1jö¬ùr‹'¯'ÓÒæO¼Åø¾>h40dæl–}Ëê™ÛI1sÅ?x(3^î†{eÖëkê‰Qcín<…F÷TG•Ëü53—¯—üÈ—S7bæÑ‚'GŽÁaÙÆŠû®ôÎÔ¥ûªe¥êv_ú¢ ŠC;ÆÎÍŠEë™ÿþìtbÐkÈs+V+sÕZ~)VM‡ðZÏÏøêÛØ‡3~mºóÊìVìþl9ë6^$øÍÖ”êælzÆ’ùÇ"ùñìeæ§æccmC‡Fœlç^ð^Þ‡µ-ï÷i‰õ¾+Lÿå&Ñ: Í|ë²ãa/˜2A¦2çQGæ?K»ôæD<é\â+o{Ïú¬n˜ƒgYƒA¾ž,éïÌ×»ByÿD*}`cÛPÆýBçCz4–6tkÑ„EM­Ê\³lR¬80¯_3÷†ñζHâÔ´õ àÀƒžÔ¿?º`<æúv2þzµmm6ôÓòêžë ûé:æŽÎŒíH­½×¿0.Œn›ËªP]N?[ó³ù0ÃÍíqP më† =ÍпjóW{;ããÀÒ…åý3~Ï5†n¾Fй5i̶ ,ÔÖ|ú¨ƒö…Òa­šúuÜx·“©{³ Ê/=FºÜ®š¢©ž¾Š¹t‘G/{@cÉñ¦½ƒI÷é­¨TV®|Ó·!ã~ç¹Í×quwgúc¾dý’€šŠ+m&á{¶³wz<H…—-!Pôz½Ñï8Ž=J»víîW}îZûA4#–O¦µ)÷øú‡û·ÅóO¤MºÀñËj¶n€£@OÆÉù¼ºÌ‰Ÿ¿ŒYwXÿ•/„¨zy™)l‹UèXמچÄ;éF ÷š³ãYÚÊÏ Q-þ£?)è³.³qîLm;Éõ„â¯ìᛯ£iû Þ÷!™ü»ËBT=}n*3wžaÈéDΤçr=.†7÷ÅcáëFIf…¨6rx‰ÿ,3î¼ûV*KVÆÛk2QlÜhðÐX>x> ŒÛõüûÊBT=sG/6wÍ㕃!´<”ÊÂ’ìjooÒ !îοfÉB!„øo’%B!„¢F“„V!„BÔh’Ð !„BˆMZ!„BQ£IB+„B!j4Ih…B!D& ­B!„¨Ñ$¡B!„5š$´B!„¢F“„V!„BÔh’Ð !„BˆMZ!„BQ£IB+„B!j4Ih…B!D& ­B!„¨Ñ$¡B!„5š$´B!„¢F“„V!„BÔh’Ð !„BˆͬúvÉÉO‡3óHõG-evC­%zÓ›¼ö]6Meé¸&X^™}~#¦ì#Àg‹>éHÈûÃYt0 bÒʉ´²ª¾šÿ³dpäƒÁ|Ј·¾™NÛ¿»NÅè“øc£orB—2zâ.RAó™7À«: ü³ÇÆ?¯½„Bü[Uã ­õÚ×G1üs.†Ü¢ç²‰ ‰-ú+ãÚeµ…iI /Hf· ¦8««¯–ÂTz2¯îâû5kXóÝFþŒÉÿ»+$„BTkB«`× Ã_×®T˜´æÅq!²XBtó‘Y…äróBa²kK£ w4ÕWÉ@…µ»/µkצ¶¯;ÖÛ"‘‚„vÖ-lÙ´‰ƒ±yWED‘ÊØB!þ^Õú  Ú¹)­Ýàz{žè짨cúŒ\º ÆZÑ’© $6—v¶æ‹Ë9†ÚÐÎÛÈ*¿=+šžÃ¢¿»âHƆB՜Тq§US;6ýžy‘\ŒÏ£µ†Ü˜óD¸>ÄãŽ{ùéJÃÓÑÕwFÉŽæRœáõ¾í¨o£Ü±Ûü¤3lüâ¶½Aº™#>AÝ<´-œ‹‡£%õâ.~ز3¡aD§YàVÏŸÆÁÝØ+7sÃ~󣨸æ8ÖEö]˜2­ gWËÿýM–Ư¦yvè@Ú¹›sgM r.±dÔ$~K<žåóyýñ4T%ëäl^žy‚<Àô2f?ê\°}1íàûMp6ü&É9ìÜØW´dçîùì³xk]á⇭¸GZž+'wü‚£ß€n4¯¥)hÃmþÓç>εՋùᨊ~s?¢·»º’í%„BT­j¾FÃŸà†˜ÿ~œ\⹑‰Þ×–”°0Ò3ï Z׿ÈOWbˆ>EngÔq—ˆ2,MðhÓG /¶Ëü0~øp× ç%sãÈz¦ßÈæ“9/àg #ùØÞûøn¿¸°ÓÄ…æÐ™!|ü~O¼J¯eÈ8Ï7ïïæzzá¾Sˆ<¹…O'&3yáZ”‘\ß<¢¶Oç­UÉ/öXZ\8'¶-âÄþ3¼3çU‚MøÙÄ:kã~gî;_r¢h²;‚Ó;sþ¯Z—¡¨°vqÃ6"Žô•–vÔrµA]¼Iª³oî%ö[X0~>&máçã?ƒ!˜=¢5†æÎ¹¾•Y“Vs>Û°mV$ç~_Áùc6%†b{ˆGíB³ Zù×9“K[sòbÏQ¸<'í W’µÖV‘v-„[˜Ó°½ÅV¥W^6WÖObü¦ÈbiÉJŠâüîUœ?z…÷æ¿N[‡Rc^—ÈŸ ¦ðËÙlÀ¨l{ !„U¯ÚWÝYûµÇ¯`J’›!1ä’Kôù›¸7ñÅ;°.@æµË$äëɈ 5¼i;Ò´y­22îd®¥xѾ÷³<×ç< #¸¹›ÿ»V°TAŸyŽo ›V zgŸÌšÀŽ®äœ_ÅâÝqhKïZÃõ¼z<øÔ³<ß¿~æ†ÇS÷³õ\zÕ½9g‡²éGC2kÕ”>#ßåƒÉï0ô1Ÿ‚IÞϪŸo`Ò*USê¬Oæè×+ ɬ‚×c¯0qÚdÆ>ˆ:>ž /ïRœèøÞÌyÉÏð€Áï,æË÷Ç­Ä{ÕØ7÷û᥋‹’Y‹€'xqÌëŒz®>†ºÇí^Ȫ³Ûko²sÑíä̾Y7žò<=Z:¡O»sÞóÞâÑP§u nLÈ…+)èБzí"‰EÛÜä\d6CÔÙ肇?:øY—¹Góº}yïýILšdø7~$ºÝ~Þ®A}Í@Ÿz’u[ ɬmKú|“·_{™Þ-ì K;ȶ³©wŽùô¿ ’YsGܼê`GåÚK!„¨Õ~Å>v^p1R®\#5ÇšÐ9€5¾þÎX×nFŽsŽÈ¬8^(Hv±hH[/‹2öhOç‰3ÝÂ…|‚­¯3î»( ¨ølôd^ü?§¨iöÊú;¢~ÞVDœý€Ý©zB9Hìã}ð(±o7úLŸÁ ~€žNqŒX‚-ñ‘)hƒíª¤Áô™±DÝÆ¡í;´ÁßFEóÆuб‘‹z,­u˜ö…mÅuV'bÇ_†uɾƒ?ü ÜÕ@#Ç0cº±*¡Šû¦Â»[T»*éÛOf2]{2eÊXt¤½Ÿž±3ö’F:‡v„0´E[Ì£öñkáÒ ¿!̘Ô3àÉŽx~0–e—JöʽÆcáLCÍNäAÔé²»Ùu¦ qÕ8š‘—œÇ‹ñäµÐ–Yð"ï`Ú—ýmÊÆ›Æ- fNÑç¾éö.áñxŠ÷†a§@~f&NMšÐ$߯'G1¨½3* U­küqúÒГz+”®¶wß©LÔ{5äÝøž7*Ñ^B!Du¨þÛBª]hÖÊ"nÁÍóD§8Ppƒ:4­cŽÚÖŽžÉù› x]M@ñ ¦^Y÷3UÕ¥­¿a}¤NuÝP…ÐåiÚP«0CQlhôD[ìöÿAZUVÕ}csï±çÞ<‡a^å‰, IDAT.áWx³clu¥ƒã^~M†¼ˆKÄåµÁ%â1†-{>HÂ#D]‹=›°üÒÙb4î=Ŧ>íëÁ‰PȽvžØLW.^ËjÑ©kmþøþq®“žaÁ9ÃÍ?Ü‚šá¢ãROÚ©•Ì^wµ ¾š¦ ?ˆ@+Cï¸waìä. Ë">ì~ÞMXØBŽ0>TÍx¦wcìÕedUª½„Bˆêqîs^ðµªÍÖ½dd_ç|ˆ-Q:À©¾v*иÓÄSá×äD.]ºL²áÝÑ»mìÊš„RiÐËö• ûJWGVÊí»"è3SI)«ZÚ RsôP<¡U›—˜RTªò/»VxñÍþ$/ÚÈ™D€,¢Ïïç§óûùi%Øöà•×^ ƒ› IM¨³63ÃÜÖN6%’eµm-l¡ŠÚ*Ö,›»>;Â¥¶n¶%gÍlq³’ì²u:²‹êg…‹“e±ý)˜;ºbCñ¶ª‚xƒ½ 4nçj¬/çc‹z´jÈÅïÏuŽë7,ˆÔØÑ¤u oe—³›ùs~3¬ëuä‘7_ç b¯Òç¹wó—ï&<»Ø +ð6n8]äVÙöB!ªÇ}ùá Ÿ`hör2ï&GêHTž©­+¼׆ó1ÜØ·Ÿ”LWZ6u¹ã«NÓ¨0·*\LéJïOò¢Ÿ‘·ÿ*ÿ}€’3¹ºüü2f¨Ô8¶x––ô!&ä(þù'ú‹†oþÓ.î`ÞÈäÝØÌ'_ì.˜½®ÕŠž½ºÜ<¯ôuŒ{7©eìE)–´V¶½„Bˆêq_nÅ®ØÔ§½/€žÈ¿ ¦`Ý{a©h¨e¸0,ïÚ©‚ Âläq·‰Ž®î†À¸–r;¡Ôç‘tí!!!„„F“YekT˜fˆI7ˆÏ1ìXŸAØñðRéɸ¸…¯/fñÒï9ëØþ#&2oåZ–L}‘V†k}ô×Ï}/±c^«…×Eþ¾ŸˆÂýê’ùkëaîfíÝ5Ýýïs÷¦E뤣û õi€žô_Š.3ónH-3kïF†¶ÒsqÇŸÄ~àÑ&pdǹR}Y5ñh e„‚]“®´0?ÏÉ\=¡«¾à«´vÉ!&äwÖ~wˆ[€y«×Y<Ñc¹ÉÌœðq’€¬C,øx9݃œÉººŸ‡J ­ ÖEðçï{Iþ¸”FúSíñsQ‘Gjá­ ì\±­¢ŸüU»µåaï5|Do`ê¬tz·s!õô/l;‘Sáë‹j®*ÌŠrˆ¿OvSo,*õ‘èþ÷Ê)ˆ-5Ì?•·¶óáÔ<umŒMÂI¶¿ÏÌÛò@ϦØ* x>DgÏÍ|ú++˜4+†ž­I9ý3ÛCJ§gU…Á 4ì=™‡6M ˜Q·iÌsê6r…Ë·È5t“wpCʹ лk>ó÷Ɯʗ®;}ödÑ:bÌño\µ¦ppeqrÃ÷üœ€EÜ6¯¨Tûj*Õ^B!Dõ¸? -j\[´Äù»(ÃíˆêÐÄüèY•½ŽpÍ0[æì_áòIcÇv Úš·¿„G›ùकmuÅGÇ„ŸVÀªÑ ŒíÙç{ªØýîP»>Äëóf2¢{;½±›Zø6éHßqsødx+시‚UÃç˜>k]]1[z o=‚CµÄ£Â!°^…:4 À©à5–žMp/|Ü® AuªfT¨ÝçíIÏÑÞ§`=µµ{C:>;™…>C€¡-nýºÓi}¢ªl{ !„UOÑëõFß±Ž=J»víîW}Ä}–}þsFLÙOÐø­•Lí`W=wvB!„¨&÷iÉø;éÿ`ÊèE\Èœ;ñÎì‘»˜¡KeÇÚCüƃ-}¬$™B!D# í€Ê©-»y2u{$îáÓ{°rt@—œBá%a=†ÑÕC†ƒB!jYrð_¡ËàÚÁmlùùçoÄ‘œ­CcëŠ{ÝftîÓŸ®-ݱéY!„BÔ@’Ð !„Bˆí¾Ýå@!„Bˆê ­B!„¨Ñ$¡B!„5š$´B!„¢F“„V!„BÔh’Ð !„BˆMZ!„BQ£IB+„B!j4Ih…B!D& ­B!„¨Ñ$¡B!„5š$´B!„¢F“„V!„BÔh’Ð !„BˆͬÚö¬Oaÿ¤¡|Zþ&ŽOÌâóî§ÿú÷8¼±’éíPÊÙ6/| ¯M¸ÀsKgð}y[ý»è³®²mÁg¬?C.à>`Ÿ òASÖÆY'™õÒlòÞú†)m­«°Yü5ó%>Ê›o¦´¡*÷,þ~•c«j‡FŽšÓ>w©ÚΕó¯og!Dµ«¾„V±¥Õ˜™© 7|³—FÒåq<è¬4ŽÞXj²x´go¬<ÍËMfï™ö&[Þz“O|ÎÇÝÝPßÓÎòˆÜ:…·V‡bùÈ4–½Ú‹Â§ô\Þ±Œ%?äz:ØÖ}€#^¡G›‚Øô™\ܰ€„p->=œëÓýÅ—èÕÄ¡T½t$XΚ³u>gjiP›[›~‚O?Ää!s¹PÆSö]fðå¨ÀÛõ®(®ª O'tçz6üz”‰ä`k`Gú LWÿJ´Ém¨%ùì6V®ÙÁÑ«Iä)Ö¸·ìÃÛïôÃ×ÜÔ:WUY9„.ÃÄ_“KîßëÎíCµéei“N²qÙ*~>Iº^ƒ_úF¶†ãÇ„²Š˜:ÆÊ¦ÄeB¿›T–©ª ß‹iŸJËÆT¦¿Œ«xlÜg‹T0MÞ⿬úZÔØzÖ'ÀðWŽÖ’€[=ÜŠŸ¥[ÐwH‹ê«FË ÛÄ‚Ÿóñ±‚¸ÏèH>üÓ¾¹Hó—?d\S8÷ýVLÿç…ïð€£ Ðƒ¥í<³u\°ÖÆsvû׬™ú1 §ódíâí’OJT"z·hæíˆme³p댙ó †Ï{ŒÚÁ'ŸŸ¢u'ß;’„òãª"ù·8u0›¶ýý?œ•XŽüðË'ßÂbá$:»ª1­}LkÃì+ë™2m+ªGžçµâ¬J'6:‹J½VqYîO1áõŽ8ú(.¸ª*Q–6†ŸÌ懤1õ-šÚ¥q~ëb–N[€ã‚ñ†Ц”UÔ)&± dž±²Lê÷J”Uªé÷BÆÚ§2Dz Lê/#*36î S·…Œµseö#„ø/«Æ„ÖD™'˜>l)Ó¾`¨¿9ù·NðÃÒÕì:Eº¹;Í»¾È¨Aíp(ñ"É'¾bÒ'Ç xu6¯>èŠ*3Œ_W.gËáPâ³mð êÊ ÃÒÆ1–oŽc]4°b4ƒŽgUé¯,µñüòÞ(–3Œ/?îF­rÞ‹ô™Y·`¾CGb¿r*»Jì#Û‘ÛøU†=Ù'¼‡ áðÈ…l9|‹ànn¨{?G`Ñ‹à_+‰ƒ'Vs<2‡'k[YœúøefË3l³Š±Ï¬J~ §Ïg×W_ðÝÞpÒÍÝiÛûa2õÜžÕPYãîëW¬‚9„î>C²[žô·4=®Âm²ÂØþéj~:M޵eä“~X& ú ®ìü†›š‡bçË}‡3¼WCl@ãËÀi3Ší±1.ñc{¯fÑÙÕLiS¶Ñ'sbÝ‚^ã‹Ñ)|ÏkؤtPÔ¹*ËËZøÔó+{|™P–>%„}—u4|õEkìˆÔyi(§ÏbÛ±èZ«hQ¼Ñ²Lc`ÚØ0Z–)ý^‰²ŒŽCû¢ÂcÇ”ö1éXÖ‘rúG–¯ßÙ°82´ 6-yüùW\«ÄÉ×xÈ»u‚M+×ñëñpR´j켃è1l4ý›Ø‰c£âØ+.K1%.S·¦´³IûBˆBB[Œ>ó<+&ÎæOïgùa+ndõâyÌqüŒ)M ·Ò‘vn-SçÂ{ølÆ<èŠ:?ší3&±Ž® {çe¼•Hþ\ÿ}Ǭy/Òoî|Tï¼ÍÇæóQ÷Úw~¥ª²Æ·SOzâ‹uyøõiœZµ€£#ø¤…=[K?ŸÍ™(pïï!ÉSìhé?žŽ&·›V¥^¢ËŠåÌî½D©ýéâY8gjEË÷Öñ#¹\Y1– çzóŧ=)1á£ÏäüÊ,;êË‹. ƒãMv/žËZ=ÍÊ«~ú9~Ú—Œï3â]¼*Š«`#ôW6s²ùÛ|ô¥'éǾáãÓYîùc[Ø Oôö™L^ÝFNel#Gr®þÊÒϧ3ßás&>âRæÕ‡ºÜLò°ÅÍ¡ì…e· ÛäDpô²ß§³ùiúh~»„Ê%€ú cð£>X*À]ÔùîË2´bø*Æ=³œ\,©Ý´3‡½ÀÃ^e~mZVYz –êÛ¯QY`¡Ò}>†Ü®µ°4©,Ƙ86*”ÓïU1Mé “ŽÛ§xLeŽU=ÙÉ™¸tÌøu©e“KľÌ3‹yŸòt±±¢6Ô§bùÄÙ¨Õ‡Ñ3Þ&ÐIKü…Cü•˜…;SƆ‰çŠÊR›—IçCÚù.ΫBˆÿ¦PB«'ýìföd´bì«èà¨u›r“eÑd6.Ø&ëòFfÎÙæéy£K4@nøN¶…û3ü‹éä¬ü©ï¥peÔ7ì Dƒ†j• •ªŒ·YņÀžCŠÍ¶”¦#éð2ŸmÁkŸ6ÇV¹qgísRHÎ b¶Mbü÷ Ï|ô:®6›’BŽž¢Ù̜Я;q'I–<ýáxº»Wbž!ë;$ã=p(=šÖAý†ueÏ»ÛË­âÑ-ÏkÌèŠÏhTWç': 5Þæ@×—yæÑ¬ÞÂË-Úb“ÊæMWð¼˜ÿ=äZº>ÍËìaò/§H~¸ Î¥›=?–½kw‘Ú`}üK&«¦´±mô9ÉÄgæsyýFžƇCì¸uè[|9…\WCòS‰:ßsY¨±oÒƒÁ }¨çnƒ.>„]ß}ÇÂIÉX.x“`Ť¸T r׳yËN.6îKC›L.ïÜÀÑ ÈJJ' egÊØ¸‹²Êì÷ª‡Ö¦ôE¥ãŒU5µÂbÛ»ö|†Û?àxhý½Q™Ô†:¯ç÷Ôf¼úñst4¬KpyhÀís–)cäØM(Ë„¸”Jœ©ÌyUñßöJhó¹E~íø~GƒWÏ÷˜ä…_€¼PV~t•^‡ÅÍò ôdD„’{™/ǼÀ²¢)|róuè“rÑßcÍ´·ö²xÙUÚ½ý)MmÈ3¾½¹ nn öæeŸiÍ}ûóáÜÇÉJäÔÏß²áÓŸ}ü}ßX¼>)ÄäXáãçT”œš×Ä])çM9ÿ&{·^À¼õxZ;Ýžw¬L\Jí@j^T£vÀ·®-y¡7HÊo‹eòU®¦é¸±l$—•z¡{<éùà\|V—̉•ÓYÝžq³ºãQjšÒ>F·Ñ,Ö4ÌÈ^AØ)PßsýcãÎË kÑóJÔù^˲ ÷Ž}éU¸ÿ†4öSùÚ¶œH¢í£ÎE³ÁFËÒøÐçí—‰ütÛ¦½éæw–-ŠÊ03gzYƘ66*YV9ý^UãÐÚ”~¯ì±SŠÆª6ù,;¾ÛÄž3áħå ÕiÉÍÓã•–c8/™Ò†¹Ä†D£÷@ûrzÏ„±aÚyIJLˆ«ø™¯¢ó¡©ªj?Bˆ§PB zT*#o¸æüo&£kmà¹ËØÔuÿó7G¯Ó£²ïÌ»³ŸÃ¯Ä•Ì f6¶(¤ßS½r£Ž’ÇÉ)ƒÙYü‰¸xþpk&.Ÿ@…Ž•ƒs¿7™× ÐF³)Ì=J\”¢˜;ãY×ðÅ?À™ØQðÃÎ|Á×´»(*TÅJQ¡R(3yϹö ¿D:ÐqdÓ‚µ¡•‰«œïóôúbUÀš‡>\Ƹ¦–e¿ .…“ßLaÎQ?FÎE{ç;“xSÚÇè6öØkÀѧöí¯üÍñt„œ¤$²õ`^‰:ßkYeÍ ™9ûS× BcÒÐr;ñ3»‚¥owÞ^Ô•¬äD2°ÃÉ&žonŶ®C¹syes·c£Ü²Œô{UCÅ”~¯ä±S£ý•ÉOÓ§±Á¬£^J › š¼0ÖN˜Í#¥ÝMaÊØ¨ªØMˆK©ÄùÐhTU´!Ä¿ß?(¡5ÃÙÏ e×Y®e<‰›½h‰Ýõ ŸkÍëM=ïä‹»Í`^Ç×Ëvòè¬Þ¸zÖÅ6í×óìh]» $mÂaV­º@Ó—ÓÎþÞjf8”Oç?KÑ ò¢Ø6ûSþôËÔ›âi 艾×󸘻‰º6ïÇÿ½õ=+tdbÇîtóÜÍú9_a;¤ uµ×9¸ñvéÑÍ®àž·*EKúÍb“¨ãXê‚}wlà0íyºG 6¥’ÅÂ/çÛäiq0µ^®·ÀR»Ð¾o[ÖÎý†¯~vf`8ÿÃJÎkÚòf{WÔ€>ã4«¾:ŽS«æøÖvÀ"'†3¿¬aOš3]ò6ýälH÷‡øpóVε{‘fV‰Ûø3ÑÜù¦¬K:ÆOG³ðý_©‹ÁL«Pâ.¾þ±)#»x~ì[Ö_³çÁÿ5*¸[„e}ûù³õ'|á0‚~m=0K‹æÊ©ƒœµêÍÈžÞh´IY:‘O÷;Ðçõx¥G–^Ðï.^x8hÀ„ö1© Õµèгß-^Î×»¬éß̆øC«ÙiGûÁN™Pg³ª*+û«—Æ9¨uÝìQ/²{ݷܰ{÷Ú8¡Tblä\ÙÊæÐZ4òs‚Ø“l[µ™Øºy»…áGIL(Ë& SÊ2¡ß«lšÒ•8vŒ1¥¿+7|ì³8ûWiMš`›ÃÁo×¢¯Â™Ô_*\Ú¢ó3X6g-ê!]hè¨ãÖ…Såù‡ ÖÅW86LŠÝ„²L‰Ë„ó¡Iªj?Bˆ½PB Š]£f¿Áš/×±xòz2-ÝiþÄ[Œïëƒ&ªä¶Ÿ^Œèö“W­áTë×è?mæ_­àÇOv“¨µÃ§m&+\§çDÓŽMؾa6ï%¼Ï²w[–¼2V—IøžílÇObsWgIŽíÇ2yðR–ü0•·3ÀÆç0‚†û)fö¸¨ÂÙµj77SsÑc†cÝVô÷%4¶2ý&ኇLfز…Ì{åyò-¨ß¾~ʯ¥6Ì'fßVBh«ÜËím”€¾E­f˜›äZûðàÐɼܬðÆæ<{Mf¦Å·¬úio¯Êµ µ‚è2о ÜÜHŒ‡¼x¶|:‘-ÅöîõÂæöñ@mJû˜Ô†j\;½Éä”e|½n ¯/Ó£vôçáW>àå–¶&×Ù´þ2¡,•Vi'Ù´x©y€b‹WËÞ¼9áÚ~õÎô±‘Á…m?ðc|6hœñoÿ"S_ê‰oaÖgBYUÆ”²Léw“ ¬hšÐ&;ÔÄ”þ²hÈóo â‹Å1l§ [ûZvîÉÃŽ« «LŠ]K†ÏËŠu¬˜ü©Z5v^AôxŪؒ„ Ɔ‰±WX–)q™p>4MUíGño§èõz£Ë§Ž=J»víîW}„B!„¨ùˆ+„B!j4Ih…B!D& ­B!„¨Ñ$¡B!„5š$´B!„¢F“„V!„BÔh’Ð !„BˆMZ!„BQ£IB+„B!j4Ih…B!D& ­B!„¨Ñ$¡B!„5š$´B!„¢F“„V!„BÔh’Ð !„BˆMZ!„BQ£IB+„B!j4Ih…B!D& ­B!„¨Ñ$¡B!„5š$´B!„¢F“„V!„BÔh’Ð !„BˆMZ!„BQ£IB+„B!j4Ih…B!DVÍ m>‘?¾Æ€0`oÿ‡Öèöù`€aûÉJ¯ÞÚ‰¶œÐ¥ 5Œ×~Œ$@ŸÄã cdÐ,NfŒ!„â¿Mfh…B!DföwW $Öî¾ÔNÈ+w¬%Ý&‘q#„Bü—ýÃZ+šžÃ¢¿»¢†‘q#„Bü—ý³Z}L΢+€Y“VN¤•&ŠoŽc]4`ß…)ÓÚpvõ·üß_ÑdiðjÚ™g‡¤»9 @Î%–ŒšÄo©€Ç³|>¯?ž†(³NÎæå™'ÈüG/cö£Ž¤™ÇkŸ&À¥³¼D =i'>cììƒd8?·Ÿ½BS¥¼Š“ûÛ7üÌá W¹›Ž™³þ­ºòìsOè .±µ6-”=b\‹¸E޵>¾þ´|´}òæp†1ï«_}‡­··¾Ì|«6¿­Ü‘‹1dÙúÜûe†÷ö#á5¬ýå!ד1s  }Ÿ—üD¶ª*Ú€.ƒðƒ?ñÃÖ\ˆˆ#-O•“;~AÑo@7š×Ò´~%û«0Ô¸#ü°j3ž¹J‚Æ“Fmž`@°îþ›‚ž!õâ.~ز3¡aD§YàVÏŸÆÁÝØ+7óòú_!„§VB[‘Œó|óþn®^ô“—BäÉ-|:1™É ÇТ܄³<*Û áåñÅé\Hø…5z1å‘lv­5$³ØñЈçhbdßy‘;˜ñî7„äÞ~L›ÉùÝ_óþ¡SŒ™ó.Ý ’Zí­,?Ÿ?“‹ÇGøù8ÂÏä`ÈfhCé¯ÍoýÁ§’I.ÌñÒopø»©\?åI|ˆá‚) ïV(,ŸJªÍÞ{ȹä"é»ÞG6WÖObü¦Èb;Ó’•ÅùÝ«8ô ïͶ¥ÚÈÄþʹ¾•Y“Vs>Û°]V$ç~_Áùc6èËmõJ0©:’-á½ÿ ¡è…ùÄ…&.ì4‡Î áã÷{â¥©Š !„¢*Õ¬Õ†Ú®çÕãÁ§žåùþð37<žºŸ­çÒï.ùQ»òÐðÿÑP  %äûÍüuè{¶Ü(xÚªíp^leG¹é¬6ž=_®2$³*¼yŽÑoŒcÈc¾¨2O°âÛ3dè}2‡—..Jf-žàÅ1¯3ê¹Nø&qãv/dÕÙŒ;cÑ%“âÖŽ^Ï>Gï6®†õÜ ‰D['˜ÞÏôçÑÆŽ†Ç³9±ý‰¥'8ïrúÔ“¬ÛjHfm[Òo䛼ýÚËônaWðXÚA¶M½³Î¦ô—ö&;ÝNfí›uã¹!ÏÓ£¥ú´ŒòZ½rL¨‡>óß.6$³6­ôÎ >™5! Ú)çü*ï®è.B!„ø;Ô¬ZÜè3}/øYz:Ñ­ä IDATyÄ1ba:´ÄG¦  ¶»«€Ôî1ò™Ý¼ñ]8$îäãÏ OhšóÒËÁ8Iûµ ÇÙy© •SŽàý1]pUíë“é5ÖD@Ö™}„ç´¢Qæ ¶Ÿ4LãºödÊ”!4°èH{?=cgì%tíah‹¶Ø”(ÉŸaSþŸ½ûŽŽªê8ü»3“ž@HBz HQ©)‚¨( ‘Žð R¥‹ôj©* ¢(ð¾"H•òÒA@zGH…ô2å|P“¹&Œîg-×’ä–}ö9÷Ìž;çNólQ#¤Väj¯ñü/Ð*Ñsì`ž 2@‹GÈè9žm)@R ÉVʃcø§¤Päá‡yØâNÉçÞ¤]Ýëw~k=æ›HD‘“ŒÂܾ¸B¿¿Ô¥­¬;¹yù®LÙ‚â&à¹ú”Ó—¹Ç\v`—~éGag"€‘GßèCë:þh@ùR^\øs Ç×ì ²éË7Ú?›B!î/×*h}*S«„Gæ?4¼‹•¢G¸ØÌ6'>žv£Ô ½iµyËÿÎú™‡:¿Aƒ¢ö«sä_Dfþ©ºß,~Åxnô'ÔL´‚æEQwÈ8uˆ¬Ãoò å=³Ž¢áSåYžðߺk`¾pŒ(óã”»õD–µ×èM! ¬Dù¬õ Fo {)€Ê&÷x ShúŽn¶T¢OÿŶÕ9}ú$GöüN¢½äèö—"õÂ!®dnQ¹Å“ˑƢ<Ñâaæû§KZÝ8ÌÄ=G:VÍD/2ïÉ++) ™»^þ“Ki/SÜçÎ!„âAr­‚Öè~Û@Í`Èy)@ny”¥ÙKY>ûDæ¿kñJƒÝYÓÈZúéåïuË €’” ¸¹mjZâm}ƒ}o¿›iò%ظ¤Å“fãö!Æìk0áð Ã{=†Jçâ–/ødþFΦÝòs½äëö—´øÔÌÿ÷"°ˆç-¿×p÷ÂìÍŽp ŽÔq€JI >»ãX“IHWëµÚB!„ÈO®UÐæÚíwmmKŽwûTÊ_¬XzâæÒ÷òíêóToS÷ö0¸ûà¤Éq)Ù|ì~“æé‡'×oŠ&E'aÅÿfX’ˆÎzhÉôºÙ|~ÌÜxýîrÑš´x± uªU¦dÒŒÚH‚ÞrdÀÃ/ë6uq×ÒQdµ sBÜõoŸÈwܽ²z9ˆ—>ø”×ÊËÓ_B!„«(@eSÑ ˜²*Ê«ç‰NÏ,iU2§÷žÍᡞ4N-ûœµq×ÿ呹ÿ…f±æ’Ùîé܃+œùÿwì'&ë¶6OyƒÎ;Ó¥ßlޤ{è#Ïüõß6p&=ë(Ф#kn<,f*U‰¢æ­†•¸?wg.•ð¢^ïAt}¾.UJú’xô¸Å,€†w©*™ùS]µÈ¬¯Z°Æ²kÕ¡ûô–‰ Š¡™C,GOÇß|ã£Ì\=óGŽáÈñ¿IÉ“¯]B!D^º¯eSôî|çs÷'Õ¦@j¿ð,U|óà$¦"”.\RcÆûóy¾V©§þǪ߲ý ™Œs+ùì¿™+9C[1²{<Ó&oäš:Å·s6Qwl3‚s¸íj ~œÆe±ð,pê &ÎH¡URÿü‰Åûâ°^ÕkSÊ îµx¡†Ÿüa†˜Ÿ7ÞL»g«â»ŸŸ¿ßÊõ´¾Ôkñ¾æSm £[VãSÙÿÃ÷¬¾Z¨]¬øî‚ÓGw+ñJ¬àûK N~ÁÈ)WhQ;€ø«ùùÈýúN ¿‡Ÿ¥ºûaög(Ž/œÉR¯6ÔLçÊ‘_ùæÛ߈Ük¾Å¬wŠã}Ÿ¢B!„cîkA›|h=ÿ=”ÝoJàÝ iÞ´†{©6‹>ù4 ñÈZ¾?rýW^ÁÞ¤FÝñ!¶åoÖ~¾”륙á_ JµtÚTÞÄÜ£6,G2o[mÞ~:0û¥ÆPšõiÇö·¿ã¤®lÿŽYÛoù½ÿÓôëQ? ЊðD¯Þìz{:¿]ƒôãkYx|ím‡ m6€®fSô?0ŠToBeã|ŽZ!õÈÏ|‘™OÐÜ®DbÒâÓ°‚ãëy³¸•¢Eï—Ù>ò?\â®æ›ƒ™¿3ÁzŠZÍ?œ×»×fÈç¿“’zˆ?>Ä·nP´!}{>Áé!„Bdúç-9À@@ý·˜Ò¯9UC3¼ò)Éco3¹kn_i%jÓ¾9™ù9r©–t¨UÍLƒN͸þx½&… X¯C›2ddê–öÃx‡V¢~ûÑ|:®-3cY÷ïåóx ¯J˜8¥M*áh¾Å©üT'F ~šÂyØûL7´‘iX­,Á>`Ä'¨V7;×±ãôsŸã|áÉOCûñó#ï2³[Üm±lx§'³ÏÕbø¼<î«‘z`*oLŠâµ©ìùµ1p [,ëßîÉœÓÀé·h··óÞm„ßU;íMÉ>G^w´Õ~_ßí^çÑlãékå£lbô´;†r3†Sú×~ŒN\—·ÎmÅÿÔ9˜¯lgѬoØüWeêðr»Šlýx;Ï6…†þwŒÙÛæMwû×FžÅ€ÝñaMM¥P…ÚÔ+{³p5*F€1ƒ¤ôì?ÏÊ6î6aìu÷øö´Ÿߪ(={;cžâù`#X£Y3üMæÓƒÏßoNQ¹»ð¯W`ßç˜Ï¯à½O7cxª£&¥O/vÍ›ÊO—ƒi5õ:–4Q¦ëL¾]û®bV¥æ‹wÞe­íIÞ÷ãß'yÕ4>ZskÚ1½3™ÿÄ?BÇï2i@ BŽÌgÔ»k‰Ì¼&mq[˜µè<"3aDj¦®cÚÈyLv§ÜÓµñ=³‰?¯eNk©'Øø{•ž­•ý»Fò´êZ›˜ïÇ1¤ÿÖù¶b`Û0ÜuÚŸs Ìgøá½9ìônÄ£§0éíר™¼–O?ûk*—¹³üͪI#Yté!Ú }÷Æü5“VñÞ˜o8žvLJ;¦ÙçÞz•s7âõÂ`Þ{o(­KœdŬeœ¾c]EŽq]¸{ –½míö/€õ f-áï°tz®ô]¹Î1·éÅuǤrvç9| Ã/ë5H§?°üÍšyqkÚŸw?™@Ç2§Y>ý[ާƒ5v+SGÍegCzÏ€CÙ?÷[ÎØYšfw|ÜJ¯ïu,]0ë;?ûÔëØº¹·w©öXQ®ýy˜X+vž}óiöý˜¹üÇ ÒJÔåá"»cà6†@ž™2‹×Ë›(ÖfßLiH‘tÚ«3î§·pvÍ6ž;¦3†ôæ »×#1æåuiçX*i?³G~Ì6Æô™0‘þÏù²yú×wÍ‘Ùѽ6ò*ñá^¾ãßëKí¬‰O¥s~ã9b+CÍ’wßÍ1îu4ºc|û'ëçGó.Kõ€+ì>‘t}ÙÁ›² [ТaY¼ l%#î§»äÀrõ±Z)^nöÕ P±EÊÃèg@3ÑÐÐ  †;ïÆ(’þ\ÁæäšôíÁþP†¾ñ—™{áo¢üʯW+ÒuBŠ”-É_ï¬bËßÏð2 ð V¯´«S x¨œé3ŸŸufdõ†Ôö™À¦?ãiøtRodŸùazU÷Ïþcs,§Î$¡HâJF-kCeî Ù‹áÑ&J>Ó•·>GÍ#F@ä:6®‰&Ù ¹È]Æéµ¬<[×g¾FÃP°’'ßüе§ÛñPUÛâÊ6÷ J·îCû'Ša¤/¶ÙÏê±ç¹zÇ35öú47ýo¯S`ÉÀØpï´)@ÊÇsû˜½±˜c8z6ƒ¢ ‚¸qOËf¿?ü¬ŠÂÍߤC½âÀVõX>æ"WÍV¢wü—?Lõ1¸-µ}5 "%ÕizÏN¼·ññðÍí2Îêôoؽ%Ýcß1vò²OSö/°{·)’cên¡Ÿû”¿~²{ž–µªá·r/'_"0îg½ªÓ èŽÅf⯃qÖªAQcœ1Üž*4ƒCæ844Ý8ÚÞ£»èÓÛ^ œ›G³'åÌ]?Ë8ù¥Ý1ÔÃlgΈµ„¹;³¼¼.s<–"~ÿ ¶gÔapÿÖ<î§A•² ˆ=ÈÀ¥zcÔ~?¤ÜùFÄ™r1>Túv/Áôÿž DÄš„Üy{Ô~Ü©ZÙ[Æ7ŽåÇX˜2%üt8’Œú…ñÐ|¨Ü¢+•õR(þ5 lAëÖœF¡˜Õ«ž¨Ëc5kNI#öŸF²sü–(ãš%[ gVþþÏb2é\äæèQ²eÜ6p"Ê …c)¯èw£@5©B­P+OÅa©Sކµ¼˜´éñOÕâôúýØíÇ#…²)~¬1lýd3ŽV Óˆ!Ä}5•Ù³6Ö/oAÑñZùîÕÚ¡ ^òçâñ½üºí'Žbÿž³XBŸÈeîÉŽ›q‚ÏûtbnÖÉ”… ‹ u5…‡þú&£an¬'Õܘ÷ÝKŸaýús:_ye" |0Ú•?9sc=¡•Èõï2xÊFÒJÇ-öÇ®Ý|—~ñgÍAT(šY`Z/±ïLÊ Ñví(û®)€ ð,ךîÇøéÇåüiªE³Ê>Ù^h¶´Òð¤çõ4›B3`ðÓd=©Ö3T²÷dXŽ1!ãÏ¥¬¼\›aM`Àk/Ѱv~ii™or“; ŸeðM<Á9³EŠ¡H‘"²cÅ—+ø+O¿c57qÙÛö¾9öï:®8òÖ]§í2øRÔ+ƒkÉY'R$Ùí=n­ŒíÂNÞhøcì·Å¡6túצ»½~¸€)Wc'/ûÔˆ®c§sïÀy4?*=Q‚„½øõ¬7U«à]ê1ÊZþbÆC˜Ë×#ìî…Ø¹”íÍí8̓yT—ÞücÑŸ3r¼‚ r*g÷x]æp¬  Áhàì5bŽž"Iw’°×ÎwÅ ?>TÒ~ÌØŒg˱Lú¢Ýb6wq;šÉWÓñò“o—ÙÊ¿;´š7aõ¸` _oô§Y±X6-9ˆ­ükÔ0¢™ƒ ud㊭Ôn[ÃéµÌ_†r€7Û)Ö»šHCwž$€ôs»Øö·Fþ˜ƒf%éò"¯¦˜ÿ­mj®Ñ’znï2ûÓeкE~gÉ¢ý¨;Rê‘R4òÍ—SãÑñIŠecõ‚UÄWêFÃnp ™íŸÍ t÷–<ì}…ß–ÌãˆW}FVËühË«­¯¿R“Âq»ø~Ñq¬„Ücnò°Û¿FØí%ß\¼íS¯Ê/Ú¿ŽSõÆ€c¹×=àÿpŠÎ]·ڷ NΣ~/©ýñir`ÎÈù:ð6:“³{½.³c Èc-y|ч|öé z¾R ŸÈÿñíªXÐJéÜu´ßŽÍwŽÄ ?> Å®coJ(Ï–L᯽»o9¶‰€ÊÕ©à—ÆÑU?°“º¼úBe¸ï!?ÖxÎ]²PìåëªäÛÎ'_ .òq ­‘Ц=‹… dz9Õ‹Ðj-Òë9Š›SU^ëóÏŸÇ;ýÜ ­RŸ–=Ÿ'en$ á[ãu†´™Ã—ÿù„±_[1ú•¤f‹!ôhŠÑ˜Î#õæçÞexì(æÞñõ4š_-Þ|w _¾„Y£¿#Å3”jÍóö+¥qsƒ®“Gà3w1‹&ÿL¼)ˆ uº3©[sBhîUéÞ1”ßOaIWiÂ[“_£Æu^„5¨Ž×–¿x¢I9}ûžæó]GöÄ6g)³Æ­€"e¨Ñl3Zgß»ýù|Ú2ª¿ß–0»¯D{1ht¥‹™·ø=¶@ùÇžçwk²ñãù,YvŒ:oå.w­'LÀ}ÞüøÁFâ¬~”~¼5ïôxžâÙc‘Û÷ïëèxÐéÓ\lëf ɹÍú¼ýþ-bwleë–!iõ)me 0€—Ýþ8J^öã16`ðä Ìþ‘ÏÇ/ÃT¼:ÏõêCá¹Ëî­ I·lèVÆ~ÿ:3–LäbìämŸj^Uì^ÇŽÒ˽#ç1­AÍÀ%\*\‹²^€¡UªÁ9ê<âŸ'ƒåE{uÇé Ú·-rfu˜Ýñ©½9ã¬Î<‰s9»—ë2'ZápúNêÍŸ}Ç'£~ ÐC i×?‚Œö㥳 Ån?80ß9ƒýñqˆRå#1ó7?ö!?ßvd7jü‚ÕR8»ùg~&”ž«Œ½¸‰ÍUl*åb‹Qç¡ÌåL¶;Î'·m…Ò±k×.½MþQÒOÌW¯·Ÿ ö&ÛÛÊ¢.¯¬ÚôüJJP1ˆ{‘¹µ%ìVô­6ÆXó.°\ñ!„k]–¸#jç®cêª%ë'6•´ošú¿^ Ô‰|x )¨1äD?6›JØù®zcì¯êM»ÂÈ··å’-ù"Gö¬fѲs„4nD)‡?rÿš_5^©—̆í‘ò´­B—J=Á²©“ùlå~ÎÅÆ}r3_ÍÛ‰ÛãO޷ׂÃ=Çf‹cïº+To.%Lä¨À~mWAeÜÂÜik°ÕhOßJåü9ẫ°Ö](;y6y“²xKa‡©øó œÀìE3äë4Ÿ`zª/c:V¼ó+ˆÿÑ1Üklé'f½÷« }$û°…ДRveß½{7ááá÷+!„B!rEnÞ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„piRÐ !„B—&­B!„pi¶ µ\\ÎäùGI¬Qk˜üéRoÛ"…=ãÛÑåÓ#¤Û=’"iÿ§ôì=Ÿ¿R˜/°´o{FmODÙÝÏÌùïúÒ¦ÿ2.Yœiɽžÿå÷ñ…B! ˜[Ц_>ƒŒ;qù$„…à~Û&wnnFbù©Ôµ •½´\D`"´é&jD°Î)òçüB!„¦@öÌDŸJ¥x-4,\=s€ þÜYWÝL˜Üä\&Z¸ôË\6¶áýÚ…nÛ.ãï |:ô~¿­Ø“tÒ‹FÅÝ1'2tÁ1Ò̘‹µgú´Ö”ÈÊ”ùßÇ™æ/ã¿oç¢.IUÚ@óRîyp~EúÅM,˜ù¿]JEÙ<(ñdgöxšP·ëûZãöðõŒ…l»”† S±útéÿu‚nfÈre³†¯b÷¹8,Áõè:¼/MK¸åª„B!\A»C›~ò;>˜0WçÅï3aÂ>\qŒ#ßMeö–(¬7¶4`r7ar7åXÐZcþÇ?Ùx¾[CŠÞV ›9½íOüœ…_NïRû˜7{±¶ëÇ j2–/¿ý†¹oUæÎ ˜´DnÍ ÙÐÉ|ðé ú‡ᛯ’œç·Å²mÖ<ö•êͬE‹Y8£ …¶ÏeÁ¾¬%éœø~¿ïÍô¹s™;÷S?žÈÞß#1g^3sêQ„ýŒ¯¾þŒ7Bö±hñÝñ !„Bü¸;´Ú1lø1¾øàMÞnCΰä½-<6¬+=nßÖèî–óZ•Èþ¯¿åò“ƒRêÎ;“Š7hÊÃþF €šÏÖÄý->ãš IDATÝÝ\HoD —A*ežiD˜—øPºJ–õQ$[Á'«p½çóÑpì|ê¼ñÑ€"U /ncÕåDløaÄ€»·‰øß7±åoêT-CØ‹ýés[|FÊ4{‰ZA&4©Z;ËúÈÛãB!„ø‡(p-€-á—}Ãruí"gÝ+òÂ]·J5Œî9-9P¤û/Wåÿ¦VâF|ƒýn,a0zúãi‰&Õᇿ4Ü}ËY»h<_\È ¤zSÚ÷è@ýbYI2àYØ+óö»†f0ÜŸB!Ä?G+hÓ9ùý ï>©´â|4a*é'Šòñ”}„wéÅs%³îvºöÚT¦hnw­­Å|UóÿGp»©U(»û·6ÒâÓ°Q#`M»FºÉï¼Ê†ç·ÅmcÆÇëðïý>Óž ÁME³fXÖܲ·æQŒ:}¨Ö¤óìXü³¦§Ò”fåQ„B!\E[CëA…¶èR+ŒæƒÆ2v̺‡—¥AÿqŒÙï–bÀJü™#»”‚í¶cX‰Ú¼€U¼H÷Aw»™Ûœß¼…³© lñÚp€Œ u(å‘íÆ¹äÜùUÚ5’l…([.7ÍFâÑl¾hÆ’f¹ÞNk [>ÇœÝqX£o1ÂÊÆdµB!„øw*`whkGÏáÑVî`‹áø ?j5ϦÒT)Yø.sBÆ2·_U²¶Pñ{Yô} †>OöõÛ°àI¥:Šcúr<úAõycH= `‹ÝĤ!ó8šÊœYePçeMA4õ!=ÊÛßÙóò4íogö¨~ì $ø‘èØ¶2,}¡ãy«aµšUcçÜa¼>×€IS˜‚kÓµ÷“à–§æ„B!þ4¥”Ý¥•»wï&<<ü~Å#„B!D®°%B!„B䎴B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„¥؂Örq9“ç%°F­aò§HÕÝËÌ鎉ˆˆÈö¿ak¢°š/°´o{FmODéëüw}iÓ—,yÔ¨ 1ëG1ìÇ‹¸~j¬\Y9ˆooâªý‘K2~\Ûýê¿üÎpäú¶Ÿ•x„ï'ö¡SæÜÛ¶Û$¶ÄÙÞ?ÿã@RðA‡[_—:ÒkÔ6žO»ñz”vd½;v ]DCÖm} ;ÉUÇ·pE¦@NÒ/ŸA kˆ;vù$„ÕÀ]w/7ÊwžÅRØ;¾3Æ0§_U<²61_p0¡M‡0¹n!‚÷Ô„03QG£È(ö ã(Èdü¸¶sÿ9r}ÛË"~ß׬¸ð(o/˜AÂÙ%0?ó[Àç'ƒ'uFÏchu/l)ùí«É|2ŠÏèI/ð¬Ú›Yßô$jõpüú ƒý'*àãCܳZК‰>•JñZ>hX¸zæüÉËyÏre³†¯b÷¹8,Áõè:¼/MK¸6b6Ndè‚c¤™30kÏôi­)qK¦¬q{øzÆB¶]Ê@Æ©X}ºô:AŽD¨H;û ŸMûž?’¼(R¢6/<~šE›Ÿ`ê‡/jëµ,›³'0[ÁÿÑ–¼Ù³}40ŸãÛã8Óüeü÷íâ\Ôe"©Jûáh^êzÉow‰;'Ò{i5FwIcɬŸ8›zòù”¦é7±`æwüv)eó Ä“ØãiBÝk$kÆcÁ‘dƒé¼Üˆf ¢ñ¨éQÉÃó;Ÿ?»ñéæG‘zf3§-å`Š/¡U¨[Ƭs·þvöã×?:ýos ï96â6£ßÒ0&LïBXÖ;ÄÔ?™Ñg–~3XÓ[ì^¾›µ 'AÓð«ô,Ýz¿J #˜/°tà0¶ŸËÄú~h؈Y÷6ýÖ4à“[bÔ_úý«·¿ÞøN=½ŠO§}ÏÁdŠ=JÃ*'ùñ`sf¼ÿ,AV½øõûÏéøœ¶„?Y1ç+ÖŽ"9]£HÕgèܳ=u‚Ý®g®¥w}ÛÏ5j-ã‡/äxbŽóþ›[ÑcÑgýA7òП_í·¯ ÏO¹cð.ɯ¶dÅ–ÿ°ç²™*åÝt÷Ñë_»ùq }zù±O|[íÍ/zyý³w|ƇpaJÇ®]»ô6ÉSi'–¨÷ÇRý;wVFWãÇVo½ÖIõ9I}¾9RY>R²Ú3®­ê2ã°J»õÇçÕ÷}[«ˆóÔîh³²™#ÕæIT§w÷ª¤Ûö·©„m#Uû~?ª‹æÛ"TÍz]õœsX%Û”R¶uò§éjæšK*Ѱ,—ÕÊ¡íT¯‡U’M©Œ+[ÔÇ=[«ÖƒQQ¥”%J­ÝAu›¶U]ɰ)[ú%µnÒkªûŒ*Év3þ6C—ªã)6¥l jï´®ªÓ”=×ã×Û_)•qj¡êÕ¦«ê7t¦Ú|!EÙ”R6[æ/­ÑjÈvªûÌý*Á¦”%f«šÔ±ƒš´3AÙn¤&AmÙ^õûá‚2ßÑ<ýó;™?½øtósI­ØVõ^ø—J¶)eMøCÍëÕZµþ«Š³Ù?õuŽÆŸÃøÑë½øÌŸ-iŸšÖµ»šq0åfœ»ßS¯õœ¯Ž§)¥,WÔêíÕë3w«8‹RÊ¥¶~ÐEuš°UÅZ3ãëÓNÜ–5¬*zíPÕnàJu%óâ´;¾`w½ñe¹¤V l§ú,:¦RlJYã÷«¹=[«ÖCשã·ÛyŸãÏ­6Œé¤Þ˜¹SEg(¥ÌÑjÇ'ÝTÛa?«ËŽÌŽô½ëÛü(eQ‘««öY9ÏÍþzí+èó“ž”?Ôû;ªþH¹ñ#ËßÿUoµé«¾?["TäªÁª]Ö¼àhüºùÑiŸãÇ.½ñ­7¿èÑß8¾Cã[¸¢·†Ö£B;† ïDõŠ-8f cFüášÐôHz=œ7wi•‘2Í^¢V ÍHÕÚ!X¢#Ivh­’woñ‡6±å³Äexöbú<[ý÷Ö@ê9~¿èÇã *à£[È´¬t£]*á0¿ž(L£Wê⦡¹§Á+£öoæ\zÖF&Ê<Óˆ0/ 4JW ÂE²Õ±ý ^…ð°Z(ݶ+ Jz¡š–ùîÛDñó™þFuü40©JxqÑ—±¡OÿüNæÏ‘øìå'é{/P¯AÞüªÒø‰ \Œ«üí½ø=¿æó0-¹³÷çƒ$*@ÅóÇê#4}–r`‹?Ä–ÓEhØ¢EŒ€©(á/>ŽÛÑ-œÒ_Ä~=CöÆ—“ûë¯ëý[„ºO•ÃKC¡‡irg~ä||÷>þTüA6/L£k䘂¨Û{:sÆ4%ؘ×ÿ¦×¾??å’5ñ4¿þ—K6¤^¨þ¦ºñëæÇ~ûzý±ŸÎøÎ‹ùÅÞü˜'Ç.«@.9°%œã²oAn ®]ä¬{E^Ð_@› < {e>§¡  l~ìçF¹v£yËg9kç‹ „ToJû¨_L?H[zÉÊ“BžYï%Œø+„ñ`æïSãH6G±rtÖgm¢Ì¤Q…x³âúÌ áîãAÖKfÐnį»¿§šÍ-„GJ{q÷˘™ØÿeáŠÝœOV ŠÄ‹füê9”Îï\þ‹ÏN~ÒâIÁ“Â7òoÀ³g.žŽÌßþ׋ßÙóƒ;eš=OÈð•ìŽ}œ†ìá—3¥hѧ8&À’G2>ùÜ,± Þx[Ï“®p`!»Îørn½ñeK‹'Oüï¹ó?>gÆŸ5%–$åM ÷ÍþÑÜ|)œõq²Ó×ÿƒ¥×¾‚??9D»&v&ÀèKÉÍ6òeJ:P1ëÇoÑÉýö9ôúa·iöÇ·Mo~qhYƒù=OŽ/\U+hÓ9ùý ï>©´â|4a*é'Šòñ”}„wéÅsŽ\õùLó(Fˆ>Ô‰kÒyv,~YÓ‹SiJ3‚t^™4w_<É )#«|¶’™HÖÍaƒwQü<ŠQÊ4ڔʦ­fûÇ×Ýÿ#nÙܲÅmcÆÇëðïý>Óž ÁME³fXÖØ?m®ÎïLþœŽÏÃOR¹–fãú» ÉÑIÝÝÉ‹øõú?¿Ï` y’–-cù¶‹Td ‘UÚž¹¸Õ舖LL²•¬ƒÙ’bH6ùã¡i`³fE¬0§ddóf0ûñå¸ì÷×_ÊZè®þMŠNº™_‡ãϯøœFï€ëý“b%ëKjTZ —b ¨DN^ÿš^ûܯìùɱ n>–ë]uâwd~´×¾@‡ÇOñé̯ºó‹“òûø¢`+`K<¨Ðv]j…Ñ|ÐXÆŽA÷ð²4è?ޱ#ûˆbk [>ÇœÝqX£o1ÂÊÆdpìÕAó*Eõ«ìÝyŽT–¨Ýü¼#úÆ ®V¨*ÏTŠgÃOûˆµ*•óf1uÉa’xÕuv•v$[!Ê– ÄM³‘xt#›/š±¤Yn¾èjÜ=!áÂR(k*‰I×þëžßÉü9Ÿ½üø†Q+8Ž›O’¬À³5¿_s¼ ÌçþÏïó_ŸZ/?FÒÚoøfm2½X ¿Ì¹^+üî±ùçýÄYs;WîEUoBEoÀèMÄŽ!PéømÇ¥ûöõ7zãKó-O­8¶ÿzœdæ¨Ý¬Þ{íæØÈçøõãsnüi…¥qØ56­Ììkû¾|‡a³ö’`sþú¿~’œ¯ïü¦×¾3?Y¯°zLw^w×îã×Qéů›ö9ýú£3¾uçgóãÈñàøù«€Ý¡¬q=W„G[¹ƒ-†ã'ü¨Õüþ=}h‹ÝĤ!ó8šÊœYePçeMYOBR«Y5vÎÆës ˜4…)¸6]{?éÀÜ€©Í{EpxÚz¬/DÑ2á4oTŽ» 0òTÿÁDÍþ’¡Ýf£Px–z‚6½*àíÈL'÷7†m9öñDº­÷ °L]Z4)ÇÎ=f¬ t?ƒÕ‰_üèô¿nœ™¼z‘FÆAüHk¦Vô¼åøÁ44ˆèY_1¸û瀑Àj­ñÆãÒŠÞ©%›gLaàÁ`ÊR§ÞCxnutÉŽ“ôÆ—©ÏõiÏñ'Óm£;EÊÕçùú%Øu(sÍ~üúý§39Ÿ3ã/˜&ƒ‡puöW éöf+®ü,ƒg®1ÅÉùÀÎõmt2?úùÕi_A™Ÿ”•Ôkñ\ÍHÏÓqoù{%cF,á¬lX˜O¿Î‹0˜JÐrÂÚ–µ¿¦›Ÿ ö99~ôÆ·îüâ$‡Žog|äAâÁÑ”Rv¯ÇÝ»w~¿âù²råç¡ ÞÑ’Ï&?¿|*ò/ó€úßÇ–ñƒù¥îûL~.¶,¬\Y9”ÿ{Ž™ï9òµaB!\‘Lï÷•+«ÇÒóí9®PéÙ¹5’€jåd½ú¿BAè+q{—ðÝåê¼údÑp1+„âߢà-9øÇ3Ò Í|Æø+Ñ &ŠTkÏ€–¥ä㎅ÜÿéÇùbè8Ö&Wà•AC©é'B¸>Yr „B!\š,9B!„.M Z!„BáÒ¤ B!„.M Z!„BáÒ¤ B!„.M Z!„BáÒ¤ B!„.­À´–‹Ë™<ÿ(é€5j “?=@j.öW‰Gø~b:EDAÛn“Øg˯psÉFÌúQ ûñ"–²¿#Ìœÿ®/mú/ãRžŸÄ¹øÓŽÌ¢wÇ´‹ˆ bÈ¢­¹û½Sñ™/°´o{FmOÌÓ¿á~ƒŠç£^%"sÜfý×yÚŸ¹ÿùÛα^;ÀÒwûÓ9"‚ˆW»0àÝïØ5×”O®ç­ý¨$æK4V®¬D‡·7qõÙÞüjßýº¾ jÿØk¿«¿> WU`ÿRXúå3ha qÒ.Ÿ„°¸;¼·"~ß׬¸ð(o/˜AÂí{š‰:EF±µ¿#L„6Â亅Îóô9¿gÕÞÌú¦'Q«‡3à×Üÿ>¿ãsŠV˜§&ýÀS¤°w|7fŒaN¿ªxäú@ùÙN°Å±mú¬rëÂäÅÏPÂrš_¦cêçe™5¢.…ä— —P@¯¯ûÆ^û]ýõI¸ªZК‰>•JñZ>hX¸zæüú›óÖ¨µŒ¾ã‰X8ÎûonEŒEŸaôÝxȬ±{ùnÖB6œHMïҳtëý*5ü€"qçDz/­Æè.i,™õ‡c3 BO>ŸÒ”@ƒ"íì/|6í{þHò¢H‰Ú¼ðøim~‚©¾D¨ñú¨es²ñDf+ø?Ú’7{¶ ¢ÖH֌Ƃ#É(Óy¹ÍDãQÒ£’e‹ûÛoŸ1'2tÁ1Ò̘‹µgú´Ö”È)æs|;pgš¿Œÿ¾]œ‹ºL$Ui?|ÍK]ËaÛÃ×3²íR6LÅêÓ¥ÿkÔ 2:¿"ýâ&ÌüŽß.¥¢l”x²3{§)ežiD˜—š¥«a‰‰"Ù `ÀÝÛDü¡Mlùã,qž„½ØŸ>ÏÇ¡¬† ŽÏô7ªã§±HU‹ۈ¾œHAY2R¦ÙKÔ 2¡™©Z;Kt$ÉÖüï Ç ÓèÅZ¹¦ êöžÎœ1MÿèÍ^ÿéŒï<íëU~ÿb_FÖãÍNãåðŽFJ>UR€æEÙð‡q?»‡ éúñ9œ?•Ì‘o§0/ª#5¥xÖàÕk~ÏŽäßNÿª¤Sì½@½axk`ð«Jã'‚žW5Ÿ‡iÙȽ?¼¾ÆXÅóÇê#4}–ry3ÿØuèµO?ÿNÎ_:ñëßÙþ0­BY?Oü‹øP¾ …<üòÊàjªÍ±þ±;¿;Çé×_G83¿ —V —ØÎqÙ7Œ 7P×.rÖ½"/8¾€Öþ±SâHƇ Ÿ›CØàˆ·õ< é |4Ð hn!ËY»h<_\È ¤zSÚ÷è@ýbŽt¢™ØÿeáŠÝœOV ŠÄ‹füêåAØyÆ€ga¯Ì'*54ƒáFûó»ÿ­)±$)o½oö¯ææKá\-ÇȹÿôÆw^õJ?φ“Xt¥.'wá1ÿܼ·6àà}ã‰VÍÃws$©ýøÍŸùØWL?™ŽGx+ »ßÚgöŸÿóƒ#ù·Ó¿iñ¤àIáñð,䙋§ƒÝ)ÓìyB†¯dwìã4d¿œ)E‹>Å1½ùÇ‘)ÀÎü«G¯}úùwvþ²¿ÞùïÐLž¸išAÃèaBC¡i …Ò}pûó»sœ}ýuŒ3ó›pe¬ Mçä÷3X¼û§ÒŠóÑ„U¨¤sœH(ÊÇSöޥϕtn!¥Ñ;-™˜d+]Ô¶¤’Mþø{ÜzùqËæm›æî‹'$ed]ÞV#Ézójð.ŠŸG1êO™F›R÷cÑçío_þÑ<ŠQ'¢u"Àštž‹ßcÖôâTšÒ,+¤Ùâ¶1ããuø÷~ŸiO†à¦¢Y3¬?kîKäÎËïþ7z\ïß+Y_R¢Òb¸A%‚œ~¿¤7¾ó¢TÚiþ;e<«};2yJSJçz\ÚH»–ŠÂ[ê5ÒÜüð6éÇçhþŒ%#xwT)~zg3Ö•gTóPL´?¿çgóoððÓT®¥Ù#`!9:)Ww×!OÒò¡e,ßv‘Ь!²J[Â3·êÎ?š†¦Íš•…9%#›b)ûù×Ùö9’gæ/½øõί¬Î÷ݨð냳¯¿ÎÒ»>…k+`K<¨Ðv]j…Ñ|ÐXÆŽA÷ð²4è?ޱ#û9]Ìh…¡qØ56ÿ¼Ÿ8+`Žbçʽ¨êM¨èíÀþ^¥¨r•½;Ï‘ªÀµ›ŸwD߸ ´BUy¦R<~ÚG¬P©œß0‹©K“œu iÜ=!áÂR(k*‰IŽ/ü··¿³ísš5†-ŸŒcÎî8¬€Ñ·ae c2Ü2;Ù‰_¥]#ÉVˆ²åqÓl$ÝÈæ‹f,i–û·äÀ‰þq¨ÿ ­ð£4»Æ¦•™ýkcß—ï0lÖ^ò AzãÛéþ±Å³göd–»ub f÷PÌX9¿y+gR¨oúK¹pJyèÇçhþ ¾!Ö¦Û[ ‰Yü+Τ;Ôþ<™ìp6ÿšoµ‚ãØ±ù$É ,1ûXóûµÜ½ kþÔzù1’Ö~Ã7k“yìÅjøev£îücô&ÈâNǨô ü¶ãRž}½“^ûtóïÈüåL|:çÏ“þ±wþûñúP€_Ÿô®OáÚ ØZÀÇÑsEx´•;Øb8~ÂZÍsÿ¥E92ÓdÐ ¢g}ÅàîŸF«µbÄ;ö•A¦4ïÁáicè±¾E˄ӼQ9vî4ÀÈSý5ûK†v›BáYê Úôª€÷ã{S¥Õ‹”šú>ÿ÷ªÂè@åˆQŒz¥´ƒë´ììïdûl±›˜4dGÓA™30«£ ê¼ £)óIÕò:0R«Y5vÎÆës ˜4…)¸6]{?yËÊvâyšö·3{T?v„üÈ tl[™–¾ÇŒÐñô}h'ãG,á¬lX˜O¿Î‹0˜JÐrÂZ»¯aŒß·-ëH†è‡úßÏÿF÷`úѬêf ·€W½±Ìô(^Æ`š ÂÕÙ_1¤Ûg˜­P¸ò³ |} ¨Óý§3¾:ýóVâv×£Ù®íeù¶xR˜Ç€ŽóoþÂ7œwf¦ºC iÝ([ÛÆOãp<2–Tÿ:tZŸ ŸýüÝNçjGwg IDAT½ô£?ú†ªüë?/æ‡œéæ¿¾ÎL%x®O[Ž}<‘në=,S—Mʱs«ÊŒÑ^½H#ã ~¤5S+zÞ ÞüS„ðN-Ù½üëÌ_º×—Þ7Õè?ú'GùýúPɃýú¤÷ú-\𦔲;ìÞ½›ðððû ²råç¡ ÞÑ’Ï&?¿\⥀﻾ö© +`ùË+¶8¶ŒÌ/ußgòsÎ?¬+ăñ½>ÿ¥ Ø’W`åÊê±ô|ûGN§+TúEvn$ Z¹¼yÞJˆJÆ·sþ ù³·w ß]®Î«OÚ¿#/DÁòo¸>ÿ½ Þ’ƒÏHHƒv4;ðã{¬D3˜(R­=Z–røk]„(¸d|;çž¿ôã|1tk“+ðÊ ¡Ôô“*@¸’øõù/'K„B!„K“%B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\š´B!„Â¥IA+„B!\Z-h-—3yþQÒkÔ&z€Ô<:vÚ‘YôîØvD YCt¾ü!g3ç¿ëK›þ˸”W¨<T⾟؇NDDDжÛ$¶ÄÝú×Þó3>1ëG1ìÇ‹yö7Ú…B!rR`ÿ°Búå3ha qÒ.Ÿ„°¸çѱ=«öfÖ7=‰Z=œ¿æÑAïb"´é&×-”Í߈ÏoŠø}_³â£¼½`5 g@~Æg&êhÅòú¸B!„w+ ­™èS©¯åƒ†…«g®PÁß±?±h>Ç·o½ÃáÆ­ =´— Wã¸j¨J»!oÒ¤¸ 䮿o#fÝÛô[Ó€O>lAˆQ‘vö>›ö=$yQ¤Dm^xü4‹6?ÁÔ_"Ôh#fãD†.8Fš9s±öLŸÖšY™6ŸãÛã8Óüeü÷íâ\Ôe"©Jûáh^êzÉnÛÃ×3²íR¶ÿgïÎãcºþÇ¿îL&ËD‘H"ö¢"UTµ”útÓjß·¢”XÚÚ×jìŠÚ×RJÛßGµË×RU{-¥¶ªõC""û2“™óû# ¡d&h›Ñ÷óñð‡Ü{ÏyŸsîyÏ™sïàTäE:õïH¨¯í°DG2vØ Î&šÈà,Ÿ¼» Ð~™‘]yÖÅF|(÷§Ï—•Ù)/æmää-”íÅg“㣳Ÿ%ŠÍc‡²äT2Šp:|­GÓûÒpĺ—w¹hÆ5¾4€/Œ}Yôq¼å‡„Bñˆò]B›~~-³ÖœäÚùKh'?aœ!ƒÛ¿ÿAFñiÌo܃/ùÙHlu8iéœùYÑcâ$J9§rfÅ Æ}ö#UÆ6ÄçqYX¢Ø6o竌d~—`œ£w3wt$é^ÊŠK‡o£Ñ,k¤Hüi$½Ö=(¾DŽï61aìDʹ&qxff~~œºVÃtέ[ÄÏï3kt0FRù}Ó"6Ž¢ê+6žOï÷ ã–½Lô÷Ãxç+|:¹ñ}m¶Ÿ†«_) \û/sVW£ÅÈ%Œ*æJ¡i€­øôþ4;Ï‘½X[%‚éaÅ|’i:\= àéæŒä²B!„xù.¡u)Ûš¡Ãΰ4â>hEIþà‹É»¨6´3å\lŸIO±ºµ)îàF©Ïá¼ý WÒâãö˜¦^âðUª÷,‹»ø×¢Yí5ü|<e('J¾Ü€2nàN‰ ¾dl&ÙîzÎF'âï`×Q#¡Á%)óFú>fØy¡sóÄÅ’A±w:S¯˜[f©e§O(>}^›°œ×žhäB!„ø7Ê—7…Y.q½@|  ’¯rѹþyZ@«ÃXÈx§qšKœÍI¤>;”¬é $+W<]³K×ãQÄÓ¾åwh8»»Ü™™Ôt(+ ¥[äýzppåXzµkO¿ñËùéºéñƒ·;<šÁŸŠ%Ü0{šâB!„È!ŸÍЦs~ÝlV8ÅïiL÷*éç 3cÒjtêÍŠÙ±+iq©XñBXSãH3x`´§µš†¦Õ’ýè…9Å”•l‚æ\WL$™²ÿb!1*‘'ù Í¥¡a} KÒeö®šÌ¼Y”ŸÔß¿í#ˆÃC²ôüŸB!D¦|–~¸PötªZ†¦ƒF3zÔ‡t«QŠzýÇ0zø{v&³.ïÜÍ© T'wœ £t¬%6èøz@ì…L€J¿ÂÏ{¯Ýyü”æVœÊþ·9´ï© 2¢°iïÍ'—ÐZbØ5s ÄbôŠP¦¤Nº¿ýQ fO|šgWH¸rƒTÊ’Jb’ù·‚Ìrnðý¨nôøx/q !„BˆG–ÏfhK,§/yó|sg°ÆpöœU›Ú½x6‹R!V6ŽÀÙ¨[¤ ¥Û)¤ƒŒÿ}˨¿à¢¬&,æ½+Ñ9¥Ù¸I¼Sʛ훱sö$÷£P¡R„Ö~×ÝYKœŠÒ´w'§¢ûVO —¬AÓ¥Ù·ÐÀzk/ât:(³ ³:Í _¡wʺÓÿ¡ë}¨Ú¤û¥ÇBNšÂÉ/„Î}ê<þ mØ_y}mW|F*4ƒâÓ>¡KK…Þ¥Aa#ñv‰»7µ) ©qñÜ6¥#ù¬B!‡¦”Ê5Ÿ8pà5jÔø»ây|zìÖ_ÍÂMCßÛŒ¹_¢ Ü²/„Bñ·ÊgK…ߦ׸®PéWÙ·;ŠB•Jg>õ@!„Bü­òß’ƒ|O½Ö496—±Ý¿EÓ9á]© š·ùŒX!„Bñä=}K„B!Ä¿Š,9B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„ÍéŸàOT£Øîô*“çt¥¬³í˪ÿ€)û.øÕ£eÏN4,ኖzŒˆSІ,bHe7Pé\üf4Ã7ùÒ;b u}’löýõk*Pë?miÿŸ ùïmFó¢î„õÔ%…Cc»2§Ð(¼ŒKöv•À¡ycYr©ƒfŒä÷h~Z>™ÙãtžÑ™g]lŸÅrj=?\|‘öÏÜ—‰ª8öÏÇò«õ Ÿ1š*·Ø·|³&ðŸÚŽìÝSÎlá0ÏP"mÛ.´£lÐý5äBçJèÈ̄՚r•Ÿ—OdæxœÝ‹ ÷ìh%îÐb>þÊJ³qý¨ã«ìkŸ=õÎàÚñH–ÎÍÈøù¤í3¸ØêÿûâWñœû~cgÎ&ðÓ±4òÍã¤úï|½ô8å;O#È®dÀLôéhLEòVUÞêw" ñ`&ÖôÄïAy M{ü#²Æ²gVß:1qÕË͸ÀÓÇ0í³RÌû°&ž÷wñ#õ¿=þ¡ö !„øWÊ ­ *þ(ß´:¬-¡îh”¦AÏÐ~ŒÅØñ¦ììMy¿8"×á¡5qÍYþí£l:µ>jMh p§^Qø\Pøg÷–Jâ·-¿@HZ¥}Ê­gédÇìèèŒÅ¨Õ²ßìú¼n¦BŽ$ÍteSg#¸ßdÂʸÚÓ²<Ñ  iÁû}ÎÑwÎz~m6”÷¼Õ¢9yQ®^J®^Å…Û4òµwª ƒk?,d§O+> ñ¼Ó>KÜ1¾Z°‚íç0[ àóÍx·×ë”s×ÀÅæ±CYr*E8¾Ö£é}i8b ÝËg¦ÝÖ„|³`9‘'£IN×ð~™½Úêg°£~+1ÛÇ3dÉÒÌ&ÌEÚ0ë¾ÆÜË·q¼ùkŽá¦oQðÈ~.E_'Š`Ú @Óâ΀"íâÌ¾Ž£Inx áµêX¹³Ó¦¼I€^‘~uKæ¬åçk©(« Eët``÷—0ÊJVôªÞn:  uê—`õú‹ÄeÔÄÓ`£ýæK¬yÿ#N6lAÀ¯‡¸r;–Ûº`Z~—F÷÷`¾ÎÖˆ¬7vfRÿºøêm÷ŸBñ¤9ÜÛŒùæY®[ý©Uôn‚§¹•¦A“Òö¢ ~+”[Ÿ­cûÿªñZŽM¦˜sܰúQ'ðæHÅà»û¨Äl>‡V bzæ9[9\‘ò˜ Þ)/Ä®†»Ç[ްtþ:ÒšM wÍBábg r¡5}Éɨ Bžy@Ò’›Œ8No‹ä’ñ9ŠH?½€£·c¹o?C)ZG|LXñ»å[b~déF+¯Ž©OáìY<ËMvL Ò»7“>«ƒŸºÎ¶)òÉÒ’ÌêW w½?MÇÎÁsd/ÖV‰`úýK,1ì˜Á¿~LZНÃÏs‡1cš3'½F€žÜëG‡o£Ñ,k¤Hüi$½ÖÝ×›åÛ8NZ"Çw›˜0v"å\“8<³?3??NÝ«án‰bÛ¼Uœ¯2’ù]‚qŽÞÍÜÑ‘¤x =€õ{æ-âHñaÌû¸ ÆØ™<`>KªVå£P4½/!¯7ËïM1¨ …ïÚ‡µßIKçÌÏŠ'QÊ9•3+12¶!>9ODk,ûŒgöãúÕÅWoGÿ !„‡Kh­¦dLÊ£óc¤xJá\ê5ÂÊmgÍ×§¨ß(Ç&s fœq3è õÓDp(I˳t›2’F¾:â~Ù̯Úó -cÄ=£åLóØr*‰*Õ=ò<‹jI¼ÀöÏÿ׋½Fí'ÈT¿,úKJ®ç¯d-Ë_øµ­æâ«–N¢ÉjßÖ4öï@XæÑø>ׄ®£ÛóB -¨ó×õ²]†Jä—Ï×p½N8ƒs$¹*á$ÿw΋×Äß Ô{»:k§îäRz%‚]^$€Š?ζ³^4èV_€/5ûÌ"ØäŒGÎ>|Hý6ö·ü\ q¢äË (ã¦àKÆÖh’-àžz‰ÃW=¨Þ³,îà_‹fµ×ðóñ¬cu¾Ô½˜š:cævï`jZùîz"V<¸'Ëm/À²¨Ú zÿ¹{¿AȵýzŠÕ­Mq7JÕxçí¹’ÞŸìBT2§ÖLbQt†Ô˜MÞ !„‡Khu®ž¸h—IJ·‘å9ùRû:¬™´–=•‹ÜIDu®^¸j—HL·‚W0½"æÐ1zãGí#Í Xoq8ò7t‡RÎAÔ-cfaä¯$T«…—]÷4åHõ(V¥)C‡¿E1™ -`|¡ÞŒbÆG ˜½õYF6 øËËšGŠrÃÛÍÎ ÙkpŸ½È’ã9ò*/•rËC2¯H=³že'ƒé2­<9—nZScI6GóíÈîlÍG™I£ñf®¹×bI¹E’2âc¼{nh†xÝ“p=¼~[ì+ß gw—»ß0è4PV`MO Y¹âéšÝx=E<Ñg'´˜¹u쿬øæ—“z"ñªÚ÷Ö Ò/³möVÞ¨ÉÀ‰¨V0çØÚj¿c!ão4—8›£H͸»‡ùÌrfOÇ¥Fs¼œŸôb!„"o.¡5øQÂiÇ/¥ðªÖŒ¨ù*›GâÖ¼/ùÛÛ$ c…·x£È ¾‰½V:«ü ”0låÄÅ^ó÷À½ 7®&#NYïÙ–›û‰bè¼C$X±Y¿ÍÛ,ÿñhnÅ©ì›Cû.‘ª #ú›öÞ¼“Ъ´8’¬ž”*íƒA³’xz;;¯šÉHËÈ<÷¬ñœ?‘¯ í7¨ÉŸ“Y»ÚoáòÎÝü‘ª@%prÇ 2J×ÈZ‚IWÀŸB>!t}¿>1«¦òÍéßx!„âå¿I•?=uívåxªfä¹.céo˜Ïê¡™eÒãÔ˜¾c:ñœQ³}ü=•ix¾Ð’&…²Ñœý'7‚;ަóXÞNx•¨LÝÞ½©çÅwÛÿG@ÓA”ÏQæU•æõ=µå 1õ›>ÙÇé Q«×@N žÈôÕ•™ÒµGìnßCäXòàä]–ZÍGÒÿõ ýè S¯{s¾ _ÊÊ#•PÍ3×¥*þ+×ÅPoÈ«}Ь·ºýÉž¿Œ!]ç£P¸¯E«Þe1Þ)ØH…æoP|Ú'ti©Ð»"(l#Þ.AïG£ðÁÜž¿œÁ]çb¶€WÐ+„‡7ÆOo»~ë­L¼ˆÓé Ì&Ìê4ƒ:|…Þ)ûI ¹—oóøglŒSQšöãäôQtßêIá’5hÚ 4ûöèý_¢Mߘ?â=öøàWñ5Ú½DÄ—“™0–þ•ŽóõžxRXÄ€v‹ï–[ Í §’ÉFÿ` Tˆ•cp6ê©Cé6äE ýé㯆{p;½ù#§®&8¢ ÒvÚè¿<=`N!„°‹¦”ÊuÚïÀÔ¨QãïŠGq 76 !|o3æN|‰‚õrUó¾8”ãm2þżßä(„Büòß ­#K=Ï7Ë¿ã²é!ÛåiÞ¹)°4Ô1êO€…ßcôîç6¶¥¹Ê¾ÝQªZšG|*œBñÔ“„öIr+ËÛïø÷Ö/ž=þõZÓäØ\ÆvÿMç„w¥6 hVù"„B<˜,9B!„Íážr „B!DN’Ð !„B‡& ­B!„ph’Ð !„B‡& ­B!„ph’Ð !„B‡& ­B!„phùï‡T×­öhz7@¥^`ËÒ…lØ}žÛ¾ÁéЧ/lŸzŒˆnã9\¶/óÆ4ÀGé§çÒo¦3Cgõ œ ¨”óü°x!_ýtx‹ߊ¯ÐéÝvÔòÏñhû´S|ÖgÛ^eòœ®”u¶¯yÖ˜H†õÛD©3hY,³ûÓOÏ¥÷èhú,Ku£"ùì&-ÞÈÁK d(=¥könw^)冖ÿû ̹×|À Ü¿]ÃX¤Û÷¦Mhá|4àf.¯Èའ˜1½EóO`B!„p0ù/м¨;a=uIáÐØ®Ì)4Šïã’½]%phÞX–\ªÃ #yÁ=šŸ–Ofö8…gtæYÇg±œZÏ_¤ý3÷e¢*ŽýsDZüj}ÂgŒ¦ŠÇ-ö-ŸÄ¬‰ü§¶#{÷”3[8Ì3”HÛǶ í(t (ý,ŸG¬áÆ«ãY8¹,îÖ[^2œÉ_Q~V{Jè\ ¹ˆ!•Ýþ||ê½ÛUF<羟ÁØ™³ üt,|óˤ¼3±¦'~ú:!„B8²ü—ÐÚ âòíA+¡ÃÚèŽFiôüíÇXjMh p§^Qø\Pøg÷–Jâ·-¿@HZ¥}Ê­gé”9{üØíKâR¢å+—À]è|x¡ýH&56àdä­<ÍÉ‹rõPrõ*.ÜΠ‘¯©dó%Ö ÃMߢà‘ý\оNÁ´6€¦ÅEúÕ,™³–Ÿ¯¥¢¬.­ÓÝ_"À H»øs§¯ãh’ÞECx­úVî¬Å´)o ·³}‰%Óf`x«!5_¨È3…‹Rî™G,0#ŽÓÛ"¹d|ް"ÒO/`Àè­ÄXîÛÏPŠÖ ÃIKäønÆN¤œk‡gögæçÇ©ûa5Ü­·Ø3oGŠcÞÇU0ÆþÈäóYRµ*…z Y¢Ø6o竌d~—`œ£w3wt$é^"3ÝÔáÛh4Ë)I¯u÷Åa‰bË´éì*:é˪ã­nòãŒ!Lû´(³†×¥.sëñsàûÌŒ‘T~ß´ˆÍ‡£¨úJ „Bñoãp ­Õ”ŒI9ct~Œ¯Î•¹Ôk„•ÛΚ¯OQ¿QŽMæÌ8ãfÐAê1¦ˆàP’—gé6e$|uÄý²™_µçZƈ{F=Ê™æ±åTUª{Ø3?œ;}¯ ŸNá-›Ø¶}#Æ¢ ¬Æ›ºâ›9`Ö4öï@XŽÃ 6ÏÜ>2—Vܳ]Ã÷¹&tÝž hhA½˜¿®×Ãë7ʉ’/7 Œ›¸S¢‚/[£I¶€»Þ—ú£SSgÄ]¼ƒ©hå»ë‰Xñ@Ÿz‰ÃW=¨Þ³lævÿZ4«½†ŸÛ×|kü¯ìºàMý^UðÖ¦ÆÕY6~¿§Ö¥»g£ñ‡w°ë¨‘Ðà’”y£?}óÚÏB!„xj8\B«sõÄE»LRºxŒ¯˜|©ýNÖLZËžÊEî$¢:W/\µK$¦[Á+˜^sè½ñ£ö‘f¬·8ùºŠC)g ê–1³0òWªÕÂËŽŒVTÎ{ÖTö_³¶»òFwBÞèŽJ½Îáof3-b:ÞŸŽçr_CËÝ탟½È’ã9ò*/•rËC²­áìîrw\§²f†‰™[ÇþËŠop9Y¡×)¯šñ¨¹¯5=d劧kö=E<ÑۛЦĒŒ;¾îwÇVgôÁh¹LBºw¥[ä}÷¯‰\9–¥WLøWnL›îmy±ˆwæ !„â©âp ­Á/ˆNÛ8~)…Wý³fDÍWÙ¼8·æxÉßÞ&i+¼ÅEñM$èµÒYåW „a+'.¦ðš¿î½q5qÊÊî,7÷yÖJ:“éÜ2GqúHŽÅÕ¤žwîi£æ\ÒHH³Þù[Fré.ž¸êi×°ó´'µTÀSš[ª½Õ‚àoçp6¡µ·…nA´ê€™ ØQs4ýôv,9ȽLkìfÏØBÁ>Ÿ0½Ž?u“ÍCû³9Gû\1‘dÊÎØ-$F%ru£7úà®%“l¬جI1$;¤ Kfßj.E ëKhX’.³wÕdæÍ ¤ü¤&ä›{Þ„Bñ·q¸·­@eÞ®_€£ËV²çj –ô(¬šÊŠc|=ò8cëH£wªb>s–¸Œìò+ñvŽ._ÅÞk©XÌ \9u>k{Q{·rÑ£cVm`ÆÌë—„âô‘Gb±æV KñB‘xöE!Ú¤°$žçÿ6žB{6”â.Zêi6.˜ÁŠ=WIµÖdþØÉ9]ižÈë Q Ϫi_öwV.ÙK¬\‚z1ÝÝØïüûb*aÅm—¯ÒâH²zRª´ÍJâéíì¼j&#-+ ¹§²ÿmí»Dª‚ŒèlÚ{Óî„VóªHÃ2qìÜô ±À;o¡*7¢œ°Ä°kæˆÅè ¡LI/œtrC˜Bño•ÿfhÿôÙQ´Û•ã9²š‘續¥¿a>«‡vd–IwPcúŽéÄsFÍöñ÷T¦áùBKš>ÈFsöŸÜî8š~Ìcexfd8ÿ‹íû IDATáU¢2u{÷¦žWßmÿMQ>GAšWUš×÷dÔ–ƒÄÔošûc¨œyu@W®ÌY@¿¶S±âJ@åÿ0¨OM j@™6Œ X´v8f'cEG‰j¼9´/u é2Ëõ€5´àE£ óx·ä}õé S¯{s¾ _ÊÊ#•PÍó±Öùêý_¢Mߘ?â=öøàWñ5Ú½DÄ—“™0–÷ë¥iï0NNE÷­ž.Yƒ¦ J³o? õÖ& ^ÄétPffušA¾BïäKÃSè^ÞFƒqsÞr»}èñ©Ôœ{VÇSô>TmR‰} ‡Òc¡'MáäBç>uðq¸gB!„x4¥”Êm‡P£F¿+ñÔ±pcÓÂ÷6cîÄ—2“v!„Bˆ'(ÿÍÐ:²Ôó|³ü;.ßÿ+^ÙŒåiÞ¹)v|³ïÀ,Üø~£w?ϰ±-(ÍUö펢PÕÒ<§š !„Bü‰ÌЊ'N%ýÆ×ŸÎeã©D4Þ•Þ¦oŸ×(ë&­B!žþ×­öhz7@¥^`ËÒ…lØ}žÛ¾ÁéЧ/ÀÖñ©Çˆè6žÃeû2oL|t~z.ýf:3tVʹ€J9Ï‹òÕOˆ·ð­ø ÞmG-ÿ?a–vŠÏúŒb»Ó«LžÓ•²ÎöµÞɰ~›¨1u-‹ež^é§çÒ{t4}–¥ºQ‘|v‹oäà¥2”Òµ{·;¯”rCËŠÿÀý¿¶æ\áK>àîß®a,R‰Æí{Ó&´°'ô¿{|øSÿºàT–=;Ѱ„kfÿ÷˜‚6dC*»Jçâ7£¾É—Þ©ë“d³ì¯_ÃPZÿiKûÿá¡Ãîþ{ôñBñTR6ìß¿ßÖ./Óeµ®ok5|O‚²þÓ±<€5v—Õ¾¯Zñ[¢ŠŽ©†÷?uóçéªkÇOÔ„œ'«ƒcÞQfŸTi÷¯Lí¨Z¾·Pý|-I¥Å]PÛgöT­Þ]¦ÎܳãCŽO9ª>iÓBµhñ®Zõ{ºRJ©´ßæ¨î½ª³iJ)ëmõsDÕ²ÿµïZ’JK¸¤vÎî¥Þyïs•µ{féGg¨n]†¨z¨Ï~»§†\YnnVƒßé§¾¼b¾ó·´ßæ¨Î­F©ÉJ©´Ój~·ÖjØWçT’E)eŽQ‡æ÷Raï®RLYñ·k§"ަ<¸‚û¶[ÍqêÌG«¶­G¨m7-6ãû·ÏýýgI¾¢öÌí­ÂºÏW§RîßnQ·ÌQ=ÛQëΧÞw½=¤}y¨ßjJPW­Wc;¶RVÿ~_9¹ôßcŒ¿Bˆ§S¾\r`M8ÁWSÂéÙ¹íÚt¤ßø•ì6ß³OÆÌÖ‹N­[Ò®ÿ ¶^»»Ýrë«Ç¿G—ŽéÒ© ý'­åhœ,7Ø8¨#JàÞù Ñß ¦ýˆ‰7_bM¿.LÜô_æŽûˆ¡ýºÐ©ß6_¹Êð!±§Æ¯|(è–5{¬Ç»z>Ü‚g\l¯âòíA+¡]Ú莋Wiôü€Þo='¹þ¨Û]ÎÞ”/Gäú#Äßwˆº}”M‡ V×Ö™å{” ^QŒè]ÿìé-•Äo[~whUÙÄ­gIµ¯fÛíKâR¢å+—À]8ùðBû‘LÜ„€G˜^Óœ¼(W¯%­×¹p;Ãæþ2>÷Ò‹Q«e3J&üÂÁë÷^c¦+›˜:ûÁý> ¬Œëÿ6D3xP,¤ï÷©Â­Öók²ý—³Œ<Ž¿Bˆ§SþKh-1ì˜Ác+&-ZÅêUÓi繋Ó¶pÃ’µfæ÷£©1d.Ë?ŸKOÿ#¬\uœdK[¦MgW¡ŽL_¶œeK"hiØÌ´O÷«yQª¨3±Ü"…99Žø” f¢ÏÅâY¶(Ft8i‰ßm¢É‰D|:›þeN±úó¬òmЮAƒç™?aÇ’’€IWrÏ—ÁÇÙvJ`¾y–ëV‚‹ÞM 4·Ò4hB€‹)…f$ø­†¸YÇöÿÝû&oŠ9Ç «ïfošk ƒ‹f&˜€J<ÁæcP±n*Ö Â|h+§!Ùx`hÏR¯|ßO›Áç[rþf*¸¥Ü3~¸=JÆ”Çém‘\2>GHƒÍÝe|þLe˜°`ÀÕp7~k–NZGZ³é]³Ð_øB¡áQ.”¢¦?8õ iÇ_!ÄÓ)ß-9SñÇÙvÖ‹ݪâkð¥fŸY›œñÐV@é)ÙäMªú:¡áCpˆ?[£H¶€[ü¯ìºàMý^UðÖ¦ÆÕY6~¿§Ö¦x9oÝÄdR|=ì6;1{Bu.]5S8´0NÄr¢äË (ã¦àKÆÖh’-à®·ÑC1Þ=[¿có–›\Þ÷"ËѸc_:×/†­œÇjJƤœ1:?F ¡Î¥^#¬ÜvÖ|}Šúrl2§`Æ7ƒR1}@‡’¸-‰$¤ëð*U§˜‹D]ÞÇñ‚¯ÓPíçxôuÎÝö¢\‘ìY7 gw—»3p:íNùöÐ\üyáõÎôx½ñ_æ.:EàÍ©`ó™_÷Ëëø !„xZå»5´èýh>˜Ûó—3¸ë\Ìð z…ððÆøe¯¡µuü AÜœ·œðnŸz|*5çÞÕñÔg?žõNàgë›T-¬ÇÙ»Aéß³»xY| ÀcMDi¸?ßÚ.fáäwYŸJºõ}zy—$´í0Ú”qyÀs6GÑnWŽçljFžë2–þ†ù¬Ú‘Y&=ÞAé;¦Ï5ÛÇßç -iRø ³Û¥¹Üq4ý˜ÇÊðÌÈp«DeêöîM=¯(¾Ûþ?š¢|Ž‚4¯ª4¯ïɨ-‰©ß4sÆ)WtåÊœôk;+®TþƒúÔ¤ ”iÃÈŠEk‡Óiv2Vôx”¨Æ›CûR·RyàZð¢Ñ„y¼[ò¾úô…©×½9ß…/eå‘Ê ¨æ™KR*ã“gºBÔê5ƒ'2}ue¦t-Æ»Û÷9Æ×É»,µš¤ÿë%0@û<Ž¿Bˆ§•¦”ÊuÚåÀÔ¨QãïŠç)b%fËffôcì«~ü…÷ÔˆG"ã#„B<-òß íSC‡WµÎt±zç¿u*õ<ß,ÿŽË»wÊXžæ›RÜ!žž$ãóÔÕ/„â_Kfh…B!„C{j&§„B!Ä¿“$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!š$´B!„¡IB+„B!Z>NhÍ\^ÛVý¿âZÆ?qü£³ÄãËûÓ!,Œ°–ðñZ~¹myB¥g¶«Íˆ½$*ÛûýíÏÿ¬ÄlÁÐ W‘®ù7zºÇ?íÔ<ú´kKë°0Âoææ“zéÉTÜ>¦t•çÓÿéP„ùL>Nhh<˜‰ƒà§ÿ'ŽDÖXöÌŠà;õ:W}ɺ¥#ilÚÄ´Ï’kú¤ýCíwf¢OGcú§Ãÿ§{ü]ƒû0oõ*fw-…áŸæ Ó V§S+ov,üA>¨ !îáôOðgVb¶gÈ’3¤™M˜‹´aÖôÍ©5áß,XNäÉh’Ó5¼ƒ_¦C¯6„úlo¾Äšcø£é[<²ŸKÑ׉"˜6Ãд¸3 H»øs§¯ãh’ÞECx­úVî¬Å´)o W¤_ÝÁ’9kùùZ*ÊêBÑ:Øý% €²R ¤½ª7¤„›(Cú%X½þ"q5ñ´õc¾Äš÷?âdÃüzˆ+·c¹­ ¦õàwiø€ƒÍ×Ù1‚õÆÎLê__½íþ³Y®ý“9ýÕ‚l?—€ÙŸoÆ»½^§œk‡„s°ÅgŒ{ÑíN¡¢¿Æ Ÿ›1w|]¼´‡Už)÷ñÍ¥~w P$îOŸ/+1²S_ÌÛÈÉ[&(Û‹Ï&5ÆGE±yìP–œJFN‡¯õhz_Ž˜B÷ò.vvÒãɵ}vô¿-–؃|>{{®™Ð°âTäE:õïH¨oæ'Ë­C¬·‚mçAÓð(ÿ ]û´¤JA=ÉûÇðÞ7E q;Á¡ëEiÞ¼0G7ÿÈy§W=¾5ϸØê[l\?6¯?õÛê?Ëãnõ«Ä£,:‹[-#ø aaô*ó_|Èøãu7®9%so¿Íþ×åñõ!ñÛÃæõù˜çWîôø5èΫ‘cXúc>jà‹|^B lØ¿¿­]þ"V•°g¸jóÞuÕœãÏ7Õ¶QíUÏ9ûÔM“RÊ|SíÙU½3t“ºžaÇñ¦Ëj]¿ªÕ/ÕÙ«RÖuhzgÕ~ÒA•¤”R×Õ·CZ«ÞKNª$«R¦»ÔŒ^-T‹ðTt†RÊrSmû°µê6ç•`U*#f·šÐ®­š°/AYÔŒŒ(µet;ÕõÓã*Åžf›.«u}[¨áÔiJ)kŠ:½¬·j;b»Š±(¥”I]ú¢¯j=ü'•qKíûô]Õmb¤ºf²³ÿì©?×þ‰V[G¶U]§ïV7LVeM¿¦¶L診Í>¦’¬)êØÔΪϪ ʤ¬Ê”t[Å%›•U¥ª3º¨w—ý®þæŸúËÆøæZV~_¡z·ê¬Þ2Gí¼’¢¬J)«5ÇèXÔOÃÛ¨÷Ö_Qyéš'ÂVûlõ¿Miê·y=T¯'U²U)eMQç7ÎRs6_ËìûŒêûÛ¨s¨Ø ¥”9ZíŽè¤ÚÛ­nY”J>0Fµj=Ný{[íÝJµ¾MÝL<ª¦vî£V]0ÙÕÿ¹²uýغþlÕoOÿ=ÎøÛl¿U¥ž[£u©¾ûŸI%ŸZªúu™ ¶EeØÕ~›ýoóõáN *ê»pÕ:»ßìŽßVûm]Ÿy~ÙŪRN-RïvŸ¡&Ø´âß /9x0œmg½hðFU| €“/5ûÌbÁ¨Æöµ®œ(ùrʸi ¹S¢‚/1Ñ$[€ÔK¾êAõzeq×Àà_‹fµsÌè|©?z1³zVÆC½w05­Ü¼žˆõþz,·9¼tË¢jónûçp³»•zŠÕ­Mq@s£Tçp¾x+9—©dN­™Ä¢è& Ô;'gì“Kÿ¨„“üß9/¼]ƒ†æH½·«£~ÙÉ¥tgüÊy“øÇML¦?X;¬'=ÇDmJàÒU3…˶ù•€­ñͽþÌ2tnž¸X2(ñNgêsC4;٧¿š]çonç§M:œNÄÿºƒ]G/kr¥ÌýéûJ Àÿ+».xSÿõ*xë§ÂÔx£:†Ó»ø=5³§Â(åáJAo =SO|ÝLÜNµÚÕÿ¹‡gãú±qýÙUÿcõ_îlׯáZ6Œð–ðuÄ ¦Î:@ù>ýh=¸v¼~äÖÿ™ìx}xäømoãü}ÜóË>nA­è\áW–­?Cêߺ”K‘_åÃ%¹³¤Ü"Iñ1ÞÍ^5C¼ò”Ði8»»ÜùJ\Ói ¬(Àšž@²rÅÓ5;××ãQÄýñìcÍÜ:ö_V|s€ËÉ ½N‘xÕŒGí{kPé—Ù6{+oÔdàÄNT+˜—Ï:Œ…Œw8k.p6G‘šc͘ùÌrfOÇ¥Fs¼œŸt²–Kÿ¤Æ’lŽæÛ‘ÝÙš 2“FâÍ:J—*ŠÓö‹D]>Ïñ‚¯Ó0}?Ç£‹qî¶劸f–i¾Ä—ç«+f\žíÆÔ1MðÓÛ_K®õ+pÕ@Ó¡ü©X¿$Í%~[Ûí;Þÿ¶(Ýz$ï»Mäʱ,½b¿rcÚtoË‹Eœ±¦Ä’Œ;¾îwë×}0Z.“žYƒæäŠAÓÐtz'4š¦P(ãŸÕÿ¹öOî×­ëÏfýúÇí¿ÜÙÕ~ 6hÅ ëǰë-³ªxå¸YÁöëGnýŸÉöëÃãÅÿp¶ÎߌÇ<¿ì¦yÒ¡ ? ]Ìw/LX‰§mµ°"¯.¡Õ á®%“b!ûž6•õð-êkëõØ&͹®˜H2e¿¸ZHŒJ${rÇ»‡Ù3¶P°Ï'L¯ãAÝdóÐþlÎQ†J»À'åûí˜8©1%\ò”•´¸T¬x¡¬©q¤<0æ-}±0>QœÍfö–gÑ4àoL±0.ExqÒtZÿó›ˆÅ¯Þ‰'8¹'—:ïÓ(æ8«öýFr†µ|³ö7ãÍQshlÉ~ƒ3â™õþgk|]lÔ—Ã_µ¸.—ømm·yþ>ð4—"„†õ%4 ,I—Ù»j2ófR~R|Œ>™õ'[À7³~kR ÉN)hÇyjkü\Ûoëú±uýÙ¬ßl_=*»Ú¯R8µv!¿<óã¾eÞ÷5óf±Ìr;^?l³ýúðXñçÂöõùxçWžb)\®oüÀ¨Å;©7:ßÐ !žJ·ä@ózž†eâØñí/ÄZK,G–}ÄÐy‡H°÷«ÜÊw+NeÿÛÚw‰TÑØ´÷æ7T•G’Õ“R¥}0hVOogçU3i™_Zã98"_Ú3nP“GHf,\Þ¹›?R¨Nî8AFé™_1fÑð§O]߯O̪©|óÇßóÍ3˜—ËdzmãnY•Êåmó˜öÅI’è½J¨~çÿö9Q³J%js{ÛÜ*XŽ"wâ×ãêYooo¼½½)èárw¶ÉÆøÚªß¾Fèpv…„+7HU ,©$&™ó0?ôðø·}Íî™cXp   /P„2%½pÒé³ê¯HÃ2qìÜ”U¿9š}ßBUnD9£íâíëÿ‡·ßÖõcëúûÛÆßrƒïGu£ÇÇ{‰Ë±ÁvýVâ-fÖÏeèÕ¿-]Ã[¢ûfëΦ¢ìh¿}l¿><´éöößÃÚoëú|Ìó+o {µõn­c塸'2/„p\ùn†Özk/ât:(³ ³:Í _¡wʾÙFჹ=9ƒ»ÎÅl¯ WÏZÃeëøglàT”¦½Ã89}Ý·zR¸d š6(;ý€zÿ—hÓð'æx½>øU|vïñådfŒ¥¥ã|½'ž1 Ýâ»å¨ÁGs©l×BZ¥B¬l;€³Q·H-J·!/RèO?4܃Û1èÍ9u5Á]¨¶ÓFÿ=æü:êö'zþ2†tBáZ¼­z—ŨÎ~<ëÀÏÖ7©ZX³w-‚Ò¿gwñ²øØ3!¤Ï}|ÁFýv1R¡ùŸö ]Z*ô.… Áˆ·Küõ9²Õ¾ÇMjõ>TmR‰} ‡Òc¡'MáäBç>uðÑøÑhÐ nÎ[Nx·Ï=>•šóaÏêxjb«|[ão+<×Ïûõs¿þ·þLvŒ¿²ÏmSú½‰’ú-7w1ï³3TA5/š×+ èx”!Ó—<¥Um´¿§»=ñ?üõ!ãß2êÃ/¸h«ÉD‹y¯ÃJtNEi6n³ÿÖ~›×çcž_y¤¹>KX׊ Z¼ŽßžïA°ý'â)£)¥rý`{àÀjÔ¨ñwÅ“Y¸±iá{›1wâKü«_/ÍWøràPŽ·YÈø=þš5 B8Œ¿ùúËïäõA!Èá–üõ,Üø~4½>ØÀ…t…J¿Ê¾ÝQªT;Ó(„xdrý !„È»|·äàŸ§Ç¿^kš›ËØîߢéœð®Ô†ÍŠ?u¿º#Dþ#ןBˆ¼“%B!„¡ɒ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáÐ$¡B!„MZ!„BáОÂV0syí@†ýÚ–…ãkãñ·ÿº™¨ŸV1wÍO\¾O’2âQ¨ :¿G»ê…Ыx~ÙY§ï}ü¯[íÑ,ô¦^ÿSéXÖåï­\‘¯É í¦nÿ̼ùG(ûÞ,¦t&¨Ã'LéàÉ®9‹9’¨@ó¢î„õlذ’žw¢ÀKãX½a«²“5•À¡ycYr¦ Ýf¬`õ’I´òÙÏìq«9›Žíã³XN­ç‡‹¦Çþ¹ãXþ{=g¬`õ²Ohã³Y¿äBŽÝSÎlá0ÏP"mÛ.¤ç­t®„Ž\ņ ørå't<Êüñ+8zÿŽVâ-æã¯¬4Þ:¾z»ÛgOýë¿Xʤ.•¸ùåhF®½@:ØW~޸ם]̈Æ6ϜͮëŸëJÿ¯—§|çVI2k'3ѧ£yÀÙùTp îüի˜Ýµ”üºÙ¦¬N§VÞìXø×2þéh„ùÉÓ69ògæëlÁzcg&õ¯‹¯,qÇøjÁ ¶ŸKÀl‚Ï7ãÝ^¯SÎ]»c ï}Y†q³:Q&{V2õ³ûN'ã½9 |ÁÜÒkj ñʇ2nh—ôxWïÂî·(dÇ„‚Š?Ê·­„kKh ;¥iÐó´cñDA®µgqö¦¼_‘ëðÆÐš¸æ,ÿöQ6‚Zµ&4иS¯Ç(|.(ü³Ï•Äo[~þ´Jû”…[ÏÒ)( e:c1jµlÆ7»þ¯›©Päî6Ó•ML}Œà~“ +ãjOËòD3xP,¤ï÷9Gß9ëùµÙPBÜóV‹æäE¹z (¹zngÐÈ7çTu×~XØC# IDATÈNŸV|ây'~KìA>Ÿ½‚=×LhXq*ò"úw$Ô7sšÎrëkç­`Û¹DÐ4<Ê¿B×>-©RPOòþ1¼÷MQBÜNpèzQš7/ÌÑÍ?rÞéFoÍ3.¹¿ö´M‘~uKæ¬åçk©(« Eët``÷—0dnO»øs§¯ãh’ÞECx­úVî¬Å´)oëõ£ùkŽá¦oQðÈ~.E_'Š`Ú @ÓâÎ`‰bóØ¡,9•Œ"œ_ëÑô¾41…îåí›qË­~•x”Cgq«e4,Œ^¥qþ‹¼.ãÆ5§¤sîí·ÙÿºK¬yÿ#N6lAÀ¯‡¸r;–Ûº`ZþÿìÝy| ÷ÿÀñ×ì‘l6’È!!GãHR¤A ÑRUª4ÔQwEA[­»ÕŠŠF â–RGZß–"ŽŸ³êjÜêª:KˆÈ½I6»óû#IEKv"”ðy>þ±™ùó™÷¼ç3Ÿ}WÜ•¥¯Å;~`N9ÎÚyKˆ=y“ô, GßWé>  ®¹åw|É_AkP­c'°hwcƹðÌL~ ‚P,Ïö ­9‘ýó&³Jz‡ Crƒ-¦[l#Öª=“æÌgá¼I¼nˆaê¢ã¤Ë*ë·§næn6œÉŸN”I=±ß¬ÓÖ×R°u™úU8ÏÜÏfñÓ±D2RRÈV•¦jM/œ­,_°Œ·ÎrÝì†où» ždS™ –þ”µV˜ŒIz|ßjŽmÜ*¶ýuï4FvÂ9n˜]ñq¿{å’tîÔð-mÞhS³é(ÔhâC@oŒ‡¶p:½Ð_H.”œ“ -:íÝú›SâX4e™í>f`§Ç8%ìªP>ûONÆ?Ä”NN§·ÆrIÿ"þåîMXL »Yô“™Ö}šx¤œÅ¹UóùÕ}QQDE}Ch½TýÀÏæéáìtêAøâ%,^FGí&¦³—D3H*‰ôK7ð:‰²q|»«"ïMF­[»Ùû—ÑÂøUÐómöDÎ'Îs‘Ë¢Y:³'ö¿D±0.9¯~[#£9ÿÒ‡Ì]8—éCªóû†sd©¬r‹å«ÐH©Û•MËQŸöÍL†zbù·ÇHP»Ñjâ,†{[áÞy:Ñ+V°"z¦âdÖRù’½B[’ý ±×dœþŽˆ­.ôÑŽŠV–Ûo±ÿQ¡‘²8ó«LÛ¦6c#ký΢9»¹}Ÿ ü¢Ößòö lŸÆf}'¦Ìfyt8Ýìw2cúfn˜(þø*Š'_ÐzÒ&¤×W|ËáÔ‡K‚ <[žÝ„VNçÔŠ)ْ̿OF´ òDN9Éÿs ¨}Ü´’•;íë!ÞÁ¥,l_¤]‡Ö#UädŽl8…S‹×¨¬äš«õàÍñጴ#þò-.Ç|D÷>3oûU²Ä^sv:Ù²z«bYƪÒW½ÁúN‘^àB+30b…V†£„÷ïF×®]éÚ{ÛL€LÒáMœjÒÔKmµ@ªfDZùTsé0¥^`Û·ÿãºG3•Í›–39<ÿ¶ÝÊ"þüÒ”$Å YÛ¡“²HÍVX9“ý“»Lpç~D¯LŸñ©]ªÀåVNåð·+¸Þ8„7< &º*¬ô’Olgç‘‹$fëðj;”Á¯¹£ÌÉ'ØyÁ‘fm^ÂQ hÊP¿m=´§wòGÞ5^SƇJv:J;ÚáôBEì­íp±ÉæŽÁlqüZ¤r¡ÙøDô÷ÃNµ£/õÝÍܺžŠÀp‰ß®ÚQ/° ¶hÝÒ®ÑÝY0EåË*¾„—’-|\ÈI¸IºIY÷Ærùº*Á„v„ÂfðUĪB«ZYû-ô.5Mái H6Tªÿ"VrEAÿ÷øÉÉÇØzÖ ¶upÑ Š`Þ¸¸ª‹?¾”ˆ'_°ñîD/Ÿ,^sƒÈiAài]r`¼Äê?áû+¹3ÖÕúòÕ„–ä_“,~Ï,!â|Öõ;àP`fÔlH$Ýx“ucCØ’Ÿ3ÊF2ñ!Ù(ƒÎŠŠ-[ãöá:Ü®G3²ñOOÚ vWÜY’µµÛôÂÓê"éÙ½ qܯ׳>c…çLz[øv•Jgµt™´,3çašÆ…Fï4fÅ”•ìñ+÷÷̇Jç€NºDj–|6‹7·2yÜ>2Í€ù6¿ÅþŽªÆhªêA›&^F¢bOR·!J¦PòBu)<^jÅèOÞÂC äM’êká³7ã™1f3·Tcl«²m0š IdÈ68Ú(¼IPé;Ÿ‘Õ.²pødÎù·¦i%›³G2†3kX|Ò—ÞÓ«sïÒY-•;e˜íÄ.›È¢+Ù¸ùµ KHW^.g…9#‘tlq±½{lUzgô¦Ë¤äÝñHZIBRI¨­5HÈH’ŒŒ¬`üJÎ#·þÈÒµ¸œ.£Vɤ^5b×(¯¯²RH—uØëòw®Æ®œ=êcù}i¡|5€„•­õÝ' * dóCÝý“¢ö£Å=¨µ×L`»CW"^r(pç^xû-õ.z'ýßû”¬KaeŒÇ à€²ú?˜)ã6i²gýÝñ#iKá—Pæs|)õ$ãkn#ìñïÞ…£ðó«_\A¬V„çÝÓ™Ðj=xsÜ,Z˜ò°{u>ÔÁ|ñ©'?™ÉÌÍ/ði^¤җÁκ/O §“çýƒ Ú­1íª}Ï{®R•MÄû¼C}g%É™¤ãØÿo¿êžû_*[<½M»uÛ‰½’†\Å©ÐÇjZWo*h¶rìR­ÝìrÿÖx•M b±éГ¦nŠÓjô>oѶÜÖÆ‚Zªœ·*h·pübo¸Ùa[Ú]¶M^¥L·ö{ÖL_Ò«cÁN‰åhRd´y á(¿¬º•tø4÷ÇÝKKhŸã„.žÁzßÏxë±\”dRÎìãšM5Þu-Úþ%o:õõ烯籽ÁxZäß1¯ðó‚ݸvžFû÷‡d]Ž€àÁƒ)í2{£¿$2ÂêSZâ¬wÆVJ'!Ý.¹cÊœ–@º¦4¥,)Q2~ ;?̉{˜9c3¥M%¼±Zù›FeS~Ý­J¡#›´ìüäÆDj|*ù“«Ë/âSë¢RÔ~9ƒS+£8üÂ[´HZGä†úLxÓ#w†ÜBû•1“™dÀŒjro˜2µv蜚Šê_µÞ)wüd˜ÈÀ&g&p-\Ê»`]Ìñ¥¸O$¾þc?eéÓv#ãì p|‹{&4Axþ<¥KÔèìKãè舣£#¥í¬ÿQQKŸƒª”NÎþôÖŒ„è¯Xûgîó<ÉÞ—W«'³õ§8n›ÙÀå­‘LÿîäÝ5lRiê¼U—´Øå,M§nÛZ _O#¡•/²uÙ|6]ÈÈ{„)“ue»®ÛSÍÓò1©”훕âÈâe칚)+žÑ_±ô¨ »"Fl;¯¼S㙳$åäï¿íƒì8²$š½× ˜Œ)\9u>ïóâ÷ná¢]¢cˆ‰Éý·fa(þšß‰KäÑ®ÐP¶ÅP×gEøÎg>âg‡æLnÿ‘ÙóOáÞ¶>EþV›„}¼[å–-Ì]ƒ&nîXÈÏ´¥oà}¾bJ`çטw  .U¯ŠhT¹)9Ô ¹W;Ö&Ño²oÝ!d¿W¨ªWP#%ã·óCÎL"ÍlO¥ÊÎh%3©§·±ãª‘œÌÌ€d㉟Ûí»„A†œ›X¿÷Öß ­²ò-5B…•R®ÜÀ ƒl2šf¼w~Ðtƒ ãúÒ$øÀrù¹oΈøÕ‹C»Ò'´#ªµÓYuÖ€¬ ýʘ¸¼cdS8¹ý89•ëç.A°Ôt¥ý÷ ö;Ô¤¹WÛ×åS"q‹Ç0:ò)æâ/Kåç{2ñõŸ´x´îGàíU,;”üHž‚Pr=3´Œ„­o7F¼9†±_-Ç7¬7/Ú:Ódh(7ç.fTŸ¹ÈÈè<Òi`ô‚ªMµ¶©GÃÛL¯ª{pÿ,¯f_Æt]@Ô—ï±2Ù@–y+ÐõCºxYßç=¨ãè¶³À{P%=/öžÈPí\–îAD¶Gï žÐ“õ’åíÿQûÚiYæ ?åÏœI6øöÏ"YÚ9*øÑdà@âùyÛ_”m5‚êv$9Ô¡C3{Æm>HB³Vv&DåDÃÃ9>òs—û1­qŠÛ÷–Ž-ö”©XŸVA•Ù·ŸÜl³ü\z|:´ÅsúTzw”Q[;áü)Ÿ¶¯p÷5W² CR2w²³îMT,”oºµ“È9g¨;<Œº*$‡×ø ÇF…/ÂwÚ êXh[%õ×RÉßÌO?àlüm ¥è;êeœTó×:Æ}ü`ÎÎ&‡¼ß}*MyÚMšÂ;•ö߃گvå•Бܙ»„‘}fc4ƒ÷k„†æÏPs|Y*ÿÿu|½O tÕîSƒ Vñ{Í~ø*„‚ šc]¢˜ü²Ý#ÕÜs£ØñUá^Ïø íÃ2‘xè;V^÷#¤q™‡ ¶*êö¢·Ùñi]×Qt†ó¬]ò3—ôF|}u:ôjÅC, ,å?LÜØ0‰ñ»jòáÄ·©ÌUöíŠÇ©NeŠø _Ax€G_Aî%ÚÊ:Ë¢QˆM¯Bû£¨]ŒßvÔ:½€×#¬ÚgS…öï}ðü–ÿ\PãØ™–Gg31d’Jƒc­.|ÐÎSüê•P|0¾ ‚ $–‚ ‚ %Ú3ó4\AAx>‰„VAA(ÑDB+‚ ‚ ”h"¡AAJ4‘Ð ‚ ‚ %šHhAA„M$´‚ ‚ B‰&~XᡘIØ2ްäL ö(b'‰ÿ%šÙ+~áòdÒd=vN^õzŸnõœPËÉìBÄé{_lÓh6âEò–çüzúežŠdÄç{HÌÊ&§Rs¦¶¢Œø¹¬žíã/Âã!fhŠ‘›§oò _`-Œ|çW"çÆQåý¦õòÅ»ûT¦u·gç¬Ä¥Ê 9Ðä³5ÄÄ,㣚J5Äò˜¢ó“59…C‘YxÆ‹¾3–²|á:9ïgæ¤åœÍÂòöyL§Ö°ñâ}Z '±ö$–üáMÿKY¾x*]œ÷ñùj.øóŒ3›ù¨¹­²ŠÖ *c£‰‰‰aõ²©tw?ÂÜÉK9møçšI:´€/¾7Óî“!4vQ+nŸ’ò×|·ˆ)½kqkõxÆ®¼@(Ûú¯Y¹€O[˜ØôõLv&˜ÿ]VÖü°èÕ{uÂ[$³ =üùUè|¹<š™}*‰__»¯gûø ‚ðx<“7¿æ”㬷„Ø“7IÏ’pô}•îºàš{ù0%åûyKÙv.£ J×lÇ{ÚPÕVdR÷MfÐêZŒí™Éw‘?qòv6TÀœ)-p–ãÙ4q4 O¥#J÷ÔHjš:êÖ–ëfH YvÆËÝé2€Çz½ùÈö6N–7GN>ºƒf>ìJ€»-• êÿÒîDì‘I“•#Õ]“ˆ]GÛÑ ÐÜÿ#¬? Çt&À]ØØoÎdÜòG‹œÆï›ƒÿP:e~CÔ–³ôô.BBY€JïAÃŽíX»ó¼nħÜÝϲ¯¬ç«™Gñò%Á^:%-+Ik‡‡ÿÛ tŽÁ³Öp¢Ýhüm‹VФq j`—GsáN¯¸œªÎáÚÆ(v8wbª¿ýßõ7%äÛ™KÙs- 3šr/Ósh\r§éL·±2r)[Ï¥‚$aWý5ú êÈK¥Õ¤ïŸÀûkËãosœC×ËÓ¡CŽlÚÍyÍkŒŸÜ™¬-oKd²®ngᬕüzÍ€l¶¦|ãî iJYmîç™72;|GÒlp,ïÏõ.°lGC¦O{“²j å/±bøþlõ¥ãöséæuâñ¥Ë‡ÐÊÓ LÅ;¿ ðòåÔ#ÌÁíŽa|Ô¼ j9“óß}ÌäcM˜4©­ o¿ÅþW]bŰ1œlþ6eOâÊDî¨|é<ò=^qW–¾ïø)ˆÅ_Å+ÿñÆWAž_ÏÞ ­)íÓÃØ¬ïÄ”ùÑ,§›ýNfLßÌ `ºÅöð0b­Ú3iÎ|ΛÄ놦.:Nº ¡s­D©k?2kùmš]Ȫ˜V}ñ*Î*@íF«‰³îm…{çéD¯XÁŠè™Šƒ­ºL}‚*œgîg³øéX"))d«JSµ¦ÎV–/XÆ[g¹nv÷üÝO²©LPKÊZ+LÆ$=¾o5Ç6nÛþʹç£ì„sÜ0»âã~·=’ξå±Í-rêq6…M|¨èñÐN§ú Ê…’s²1¡E§½[sJ‹¦¬"³ÝÇ làôª„]ÕÊgÿÉÉøËþO9IœÞË%ý‹ø—»7a1%ìfÑOfZ÷iVà‘rçVÍçW÷ADDEõ ¡õR9ô[œvÄ_¾Åå˜èÞçcæm¿J–‚ –9;lÙ ½U1,cUé ‚«Þ`ý§H/p¡•±ÂF«ÃQÂûw£k×®tí=m &@&éð&NH5iê¥Ç¶Z U³ãØ|*‡IiM©Øöíÿ¸îÑŒFeó¦€åLÏÿ†m·²ˆ?…4%‰@1HÖvè¤,R³dÎdÿäîܹÇ+Ógü@j—*0FäT»‚ëCxó`¢«ÂJ¯!ùÄvv¹Hb¶¯¶Cüš;ZÀœ|‚iÖæ%Õ€¦ õÛÖC{z'ä-ÉДñ¡’ŽÒŽv8½P{k;\l²¹c0+ß…R¹Ðlü"úûa'ÚÑ—úîfn]OÅ `¸ÄoWí¨X[ ´n i×È…ü|]Qù²†Š¯áe#dKrn’nRÖý…±\¾„®J0¡ᇰ|q€êƒ†äªVÖ~ ýŸKG“FxZ’ •꿈ÕŃ\QÐÿÅ=~–â_qÇWqˇÇ_Axn=KŒ—Xýñ'|%wFÀºZ_¾šÐòï€XØç¦ŒÛ¤Ézœõw¿e!iKá—S˜ ‰¤o²nl[òsBÙH&>$eÐI ©´nÔ¨`óÈsHÖnÔnÓ O«‹¤g÷&Äq_ÏúŒž3émáÛU*=ÖÒeÒ²Ì@1¾I¢q¡Ñ;Y1e%{üÊýÝN•Ît‰Ô,38ø2 l=nneò¸}dšóm~‹ýUÑTÕƒ„7M¼ŒDÅž ¥nC”tX~B .…ÇK­ýÉ[xh¼IR}í!|öf<3ÆÌcæ–jŒmUö± V³!‰ ÙG…7 *cç3²ÚEŸÌ9ÿÖ4­Tp¬ÈάañI_zO¯Î½KgµTî<–a¶?»l"‹®dãæ×‚.!]y¹œæŒDÒ±ÅÅöî±UéÑ›.“’wÇ#ith% I%¡¶Ö !#I222f%ã»ÐóËÈí£?²tí.§Ë¨U2©WØ5Ê뫬Òeöºü«±+gúX~_Z(_ aek}÷ ƒJÙüP7Dÿ¤¨ýhqêDí5ØîЕˆ— ÜÙÞ~KýŸK…ÞIÿ÷>%ëRXã1(x ¬þf)þås|Yb©üÜÿx¼ñU„çÓÓ™Ðj=xsÜ,Z˜ò¬{µ²ÏÕz'l¥t2LäO@Ë™ \K—ò.XëË`g]Ž—§„Óɳ°5mj´ü›Çf’Žo`SüK¼ýª{î©lñlô6íÖm'öJr§Bƒ¼ÖÕ› š­»”Ak7»Ü¿5^eÓ‚Xl:ô¤©›ÒC*¡÷y‹¶åF°6ÔRå¼ýûPA»…ã3xÃÍÛÒŽè²õhò*eºµŸØ³f²ø’^ ìNËѤ:*¸Då%„£ü°êVÒáÓÜw/-¡}Žºxë}?ã­ ã+42)göqͦïºmÿ’7úúóÁ×óØÞ`<-ò︌WøyÁn\;O£Žý¿ûC².G@ð`‚Á”v™½Ñ_áNõ)-qÖ;çŽßt¸äŽ_sZéšÒ”V°¤D¥d|rþ˜÷0sÆfJšJxc7´ò-6ʦüº[•BG6iÙùÉ‰ÔøTò'W-–¯à©uq(j¿œÁ©•Q~á-Z$­#rC}&¼é‘;Cn¡ýʘÉL2`Æ5¹7L™Z;ô NMEõ/„åøW¼ñUÜòïæã#¾ ‚ð<{J—¨ÑÙ—ÆÑÑGGGJÛYÿ£¢þ\r¨Is¯$¶¯;L¢ 0%·x £#‘bÉÞ—W«'³õ§8n›ÙÀå­‘Lÿ5j’ +¤\¹AÙd 5ͨ`þBB+_dë²ùlº‘÷S&ëÊ>v]·§š§­Å ©”훕âÈâe칚)+žÑ_±ô¨ »"^!4î¼òNŒgÎ’”“¿ÿZ´²ãÈ’hö^3`2¦påÔù¼Ïsˆß»…‹vALˆŽ!&&÷ßš…¡øk~'6.‘G»:@CÙC\7žák8Ÿù(æð 0gróøÌž ÷¶ð)ò·Ú$ìëôàÝ*°laîD0qsÇB~¦-}]þ=‡nJ`çטw  .U¯ŠhT¹)9Ô ¹W;Öç_ãMö­;„ì÷ Uõ j¤h|?øü‘3“H3ÛS©²3ZÉLêémì¸j$'33 Ùxâçv‡Cû.a!çæÖï½õwBûŸ_¦l×—~_ì%©À–ËÏ}sFį^ Ú•>¡Q­Îª³díWÆÄå»øÓ ƒœÂÉíÇÉ©\?w ‚¥¦+í¿µßRü+æø*nùŠÄ)nßXò q¬BÃcÚ&ïØ©ÿuC:ðsè"–Åùñ~ÕßY¶*ÀQ­)¿Á v¦NËZì‹M¿(IFãêO¯As¿ƒ+¯ŒÁ­È%„ö¨q®Õû×Ã^‚ ‹ýU¼ñ­vkJ—æ¿0÷Ó÷Ù[Ö×oÐíoÂVÉ̲Ö¬<­s2|![ì)S±>­‚*³o?¹/Ø(fù¹œ_² CR2w²³îMt,”oºµ“È9g¨;<Œº*$‡×ø ÇF…/ÂwÚ êXh[%õ×RÉßÌO?àlüm ¥è;êeœTó×:Æ}ü`ÎÎ&‡¼ß}*MyÚMšÂ;•ö߃Úo1þs|»|%6¾ ‚ð<“dY.ôÆ÷ÀÔ¯_ÿ¿ªÏsÄLÂæ |3„‰­]‹³Vž 7Ö"to;fÞ”ÒÏû¢HãVͱ.QL~ÙN¬Aø<{3´%† ‡º½èmv|Z×}áAZ§ðzÒ•x”lªÐþ½žßòŸ jÜ;Óòèl&†¬CRip¬Õ…ÚyŠÇÁ‚ Â#–‚ ‚ %Ú3ó´[AAx>îÉ$J IDAT‰„VAA(ÑDB+‚ ‚ ”h"¡AAJ4‘Ð ‚ ‚ %šHhAA„M$´‚ ‚ B‰&ZAA¡D ­ ‚ ‚P¢‰„VAA(ÑDB+‚ ‚ ”h"¡AAJ4‘Ð ‚ ‚ %šHhAA„M$´‚ ‚ B‰&ZAA¡D ­ ‚ ‚P¢‰„VAA(ÑDB+‚ ‚ ”h"¡AAJ4‘Ð ‚ ‚ %šHhAA„M$´‚ ‚ B‰&ZAA¡D ­ ‚ ‚P¢‰„VAA(Ñ4OºfäòÊáŒÜÄŒð·)_äšwû‡gJ:Ê÷s²î·¿0H¶”¯ó:½v¤¶£úì=·]žèJÔäFØI…ÿÝ“hÉg&aË8Â’2%Øã?>I”ßÇW~ü/ÑÌ^ñ —ï$“&ë±sò"¨×ût«ç„ZNf÷Ø"NË÷leÓh„ëCLÅÝþ!™ÙÆÏr>^ͪEci‘½žés’"[ÞüÑyBí&¹yú&Ù–ÿð™#ßù•ȹqTy?‚i½|ñî>•iÝíÙ9kq©2H4ùl 11Ëø¨¦†RM'±<&†èüdMNáPäDžñ¢ïŒ¥,_8…NÎû™9i9g³°¼}Ó©5l¼xŸ# '±ö$–üáMÿKY¾x*]œ÷ñùj.øóŒ3›ù¨¹­²ŠÖ *c£‰‰‰aõ²©tw?ÂÜÉK9møçšI:´€/¾7Óî“!4vQ+nŸ’ò×|·ˆ)½kqkõxÆ®¼@(Ûú¯Y¹€O[˜ØôõLv&˜ÿ]VÖü°èÕ{uÂ[$³ =ÛñAç;ˆÈåÑÌìS ­å?Š@*]žÙµ‘k9Oº6Ïž§ðæÒL¶ɌZx†Lc6Ær]ˆøÇ £9å8kç-!öäMÒ³$}_¥û€.¸j-oo¼ÄŠáø³Õ[”ŽÛÏ¥›×‰Ç—.~@+O+@&óâFf‡¯âHš Žåýy£Þ–íhÈôioRV-“uu; g­ä×kd³5åwgxHSÊjÙL)ÿN ¨×œ 6*À‹ÆÍ*°|ÍE’r`o)B/±bØN6›²'qåN"wT¾tù¯¸ßgcãu¶„}Ê}/¦ m‚‹ÚrÿYbJ<È·3—²çZ6f4å^¦çи¨ÂÚo&qçD/*ÍG‘Ãð³Í½@Êwv1qðb?œÍP?=椣|?o)ÛÎ¥`4Aéšíxo@ªÚ*» ~üófȸ™Ô}“´ºc{fò]äOœ¼ U0gJ œåx6MÍÂSéÈ„Òý5’Ú…æŸN#¤ú¸£þ×ñ-¬}2‰Û'ðþj/&EôÄ+VÒpœ™ƒÃÉyÃkÛRX/› $ËÎx¹Û ]PãX¯7ÙÞÆIAóåä#¬;h&àî¸Û"Q™ þ!íNÄ -=•#Õ]“ˆ]GÛÑ ÐÜÿ#¬? Çt&À]ØØoÎdÜòǸœÆï›ƒÿP:e~CÔ–³ôô.BBY€JïAÃŽíX»ó¼nħÜÝϲ¯¬ç«™Gñò%Á^:%-+Ik‡‡ÿÛ tŽÁ³Öp¢Ýhüž#ïCã@ÕÀ *.æÂ^q)8UõQìpîÄTû¿ë_øù¦Û‡X¹”­çRA’°«þ}uä¥ÒjÒ÷Oàýµåñ·9ΡëåéС G6íæ¼æ5ÆOîÌ Ö–ÎOK,Ä_‹ñÛBù–®¦âLJÂÊ—S0ot·;†ñQó2¨åLÎ÷1“5aÒ¤T´*¼ýû_UÄëKë¯„Åø]ÌñU$ÿq|5®A!´ŽÀ¢Ý䂘oztžÂZ.¯ŒgñŠåD óæ_O M lŸÆf}'¦Ìfyt8Ýìw2cúfn˜l ”ʱ]Ù´õ9aßÌd¨×)–{ŒtS<[#£9ÿÒ‡Ì]8—éCªóû†sd©¬ržù6{"çç9ˆÈeÑ,Ùû_¢X—Š  vÁ¿M;å_]M·8¸ý2zï)£(^¨ÐHYœùU¦íGS›1ƒ‘µ~gÑœÝÜþç‹9‘ýó&³Jz‡ CrOFËí·$‹s«æó«û "¢¢ˆŠú†Ðz©ú-£Åö«p¬Ó–:rN¤åö&ní[Ïiû¦´ñÑ#™n±=<ŒX«öLš3Ÿ…ó&ñº!†©‹Ž“®dÛÒñ·¸ k%J]û‘YËoÓlìBVÅİê‹WqVj7ZMœÅpo+Ü;O'zÅ VDÏ|2ÉìýŽo¡íSáX¿=u3w³áLþt¢Lê‰ üfÕ˜¶¾–‚-¨ËÔ'¨Âyæ~6‹ŸŽ%’‘’B¶ª4Ukzáleù‚e¼u–ëf7|ËßMð$›Êµô§¬µÂdLÒãûVslãV±í¯{§1²ÎqÃìŠûÝã!éÜ©á[Û¼h&§gÓQ¨ÑćÞmá´¢ÁurN6&´è´wëoN‰cÑ”Ud¶û˜ œc •°«@ùì?9ÿS:9IœÞË%ý‹ø—»7™v³è'3­û4+ðHÙÂùoŠgóôpv:õ |ñ/ ££vÓ¿ÙK¢$•Dú¥ø DHÙ8¾ÝU‘÷& £Ö­Ýìý˨àü´ÀRüµ¿-–oáúPÜø`¡|ÉÎ^¡-IŒþ†ØëF2NGÄVzŒhGE+Ëí·ØÿE¹¾3oûU²Ä^sv:Ù²z«b„YƪÒW½ÁúN‘^àÄ’±ÂF«ÃQÂûw£k×®tí=m &@&éð&NH5iê¥Ç¶Z U³ãØ|*ÿ«hL©Øöíÿ¸îÑŒFeónRåLÏÿ†m·²ˆ?…4%‰@1HÖvè¤,R³dÎdÿäîܹÇ+Ógü@j—*0ÆåT»‚ëCxó`ð(üü7'Ÿ`çGšµy G5 )Cý¶õОÞÉy×xM*Ùé(íh‡Ó ±·¶ÃÅ&›;s±Ï‹ñ×BüVT~aׇb²\¾„®J0¡ᇰ|q€êƒ†”qSpý)¬ÿs)¸¾'X¼æ ‘Ó>2Oᒃ™2n“&ëqÖßÍ^%m)Š”ÐIXÙZßARI ›‘sV é²{]þY]9{ÔÇò·5rûè,]{€Ëé2j•LêU#vî-AκÌÖ™Ÿ±ìF†Þ“º¥‹rW¡wÒÿ}·!Y—ÂÊ¡ÀñÌ"Îga]¿ fΔÓR¹óX†Ùþ@첉,º’›_ º„tåårVXn¿Ž*¯áøñFÜjLó”­l»]•wš”E ˜ ‰¤o²nl[ò(Éćd£ ºÜÇ~«?þ„ï¯äÞq[WëËWZ⪶|üí_R!iݨQÁæ‘?& ­¿¢Ïyðñ5[lŸ[¶ÆíÃu¸]fd㟞´ì®ød—¬Ý¨Ý¦žVIÏîMˆã6¾žõ+2Í€ù6¿ÅþŽªÆhªêA›&^F¢bOR·!Jx~B .…ÇK­ýÉ[xh¼sP_{Ÿ½ÏŒ1󘹥c[•}lÁÔlH"C¶ÁÑFa Qé;Ÿ‘Õ.²pødÎù·¦i¥‚c]Æpf ‹OúÒ{zuî]:[øùoÎH$[\lï[•Þ½é2)yw<’F‡V’Tjk 2’$##+¿…Ÿÿ–â¥øm±|5v}(.EíG‹{P'j¯™Àv‡®D¼äP`æÉòõ§°þÏeùúR¼ú?˜¥øSÌñ¥Ô“Œ¯¹°Ç¿{6Ž^Àϯ~Ap±ZùQ(q ­Zï„­”NB†‰ü f93k àRÞÅÒùd‘dU Ù¤eçŸ&RãSÉ¿97'îaæŒÍ”4•ðÆnhå[l=”Mö!g^àÇ)ÙPªŸOiA¥Zÿf&3É€Ôä^Ð2µvè -µG0_|êÉOcf2só |ú/¨’u9‚ ¦´Ëìþ’ÈwªOi‰S’åök=_¡UùŸÙ¼÷å®îÁðÒ{ÔuÊ=V*}ì¬Ëñò”p:y>à$Özðæ¸Y´0å0=öyñÍÒñ·V²ÿÜ=¡}\‹— ©¿¢ÏyðñUÒj·Æ´«ö=?ì¹JU6ïóõ•$Cf’Žo`SüK¼ýª{î©lñlô6íÖm'öJr§Bo´®ÞTÐl娥 Z»Ùåþ­ñ*›ÄbÓ¡'MݧÕè}Þ¢m¹¬µT9oÿ>TÐnáøÅ Þp³Ã¶´#ºl=š¼J™ní'ö¬™,¾¤WÇ‚ËѤ:*8óÂQ~x¦"éðiî»—–Ð>Ç ]<ƒõ¾ŸñÖc¹(ɤœÙÇ5›j¼ëZ´ýK6ÞtêëÏ_Ïc{ƒñ´È¿c2^áç»qí<:öÿîÂÎg½sîù—n—Ü1eNK ]SšÒ â\qÏKñ×Rü¶X~ŸZ•¢öËœZÅáÞ¢EÒ:"7Ôg›¹3ä ®?–Y¾¾«þ…°¿‹7¾×ã‰Ä×ì§L }ÚndÜ‚Ž/ÂfáJÜ’É¡&ͽ’ؾî0‰&À”HÜâ1ŒŽðñUÔ>©4uÞªKZìr–ǦS·m-…¯§‘ÐÊÙºl>›.däO™¬+ûØuÝžjž–׈I¥üh߬G/cÏÕ LYñˆþŠ¥GM¸Ø1bkÜyå:Ïœ%)'ÿµhdÇ‘%Ñì½fÀdLáÊ©óyŸç¿w 킘CLLî¿5 Cñ×üNl\â¿—‹†²-†2¸n<+Â×p>ó?;4gróøÌž ÷¶ð)ò·Ú$ìëôàÝ*°laîD0qsÇB~¦-}ïó… ç¿äPƒæ^IìXŸwþo²oÝ!d¿W¨ªWP£bžÿ–â¥øýŸÅÓ 6ŒëK¿/ö’TàËåç¾9#âW/ íJŸÐލÖNgÕY²‚ö+cùúòÀ¦+í¿µßRü.æø²T~¾'_ÿI‹Gë~Þ^ŲCÉä Àóî©›¡5ßÞÎg#çs: dc6Fù4#ºZ“ÿMRW^ ɹKÙg6F8x¿FhhÞKÛ¿`¡šò´ÌÉðq„l±§LÅú´ ªÌ¾ý€j·¦tiþ s?}Ÿ½eq­ñÝÞñ&lõ—Ì,;‘¡µŽñÞd2˜ÏÝÜÝo©úŒ™ʃ&}’¿™Ÿ&~ÀÙøÛJÐwÔË8ýëöCÂÖ·#ÞÃØ¯–ãÖŸÌúÏBÔR;S§e-öE¦_” $£qõ§× Æ8«@²ÐþaÍÊ F…£[j,˜Ê~ÇŽ„xøžºÊ™&CC¹9w1£úÌEFFçÙN« WÔ…(æþÐãÓ¡-žÓ§Ò»£ŒÚÚ ïàOù´}…ÿø56ÿ>¾/Ú*kŸMµ¶©GÃÛL¯ª{pÿ,¯f_Æt]@Ô—ï±2Ù@–y+ÐõCºxYßç=¨ãè¶³À{P%=/öžÈPí\–îAD¶Gï žÐ“õ’åíÿQûÚiYæ ?åÏœI6øöÏ"YÚ9*øÑdà@âùyÛ_”m5‚êv$9Ô¡C3{Æm>HB³Vv&DåDÃÃ9>òs—û1­qŠÛ÷–¨;/—ÕÞç·ìÿ±½á(a}'ó[•ÁDNÂYY§g3äk+FGô£ª5ÈçÙ¸ Šï¹@²I‹K×èù^7ºxõzæ)æ Ç6Mk¾œÕ‡*V ›ŸWþ¿ Êï@:öïIó :$ÃQÂúMC5ŸQ~6 gqqíx>YïÂÀ°á4qN³Ø?Ê˗Зõ¡áë]y÷uoìT(î¿»õ—З«E‹wÒ% Ì}Æ‚LÚáY„ηaØô¾øØHˆóïq{Òý[\_9i_\ŽÛG_Ñ£Šõc«¡ %Ï3:Ckäæé›<è&Ÿýò‹ëáë/ßù•ȹqTy?‚i½|ñî>•iÝíÙ9kq©2H4ùl 11Ëø¨¦†RM'±<&†èüdMNáPäDžñ¢ïŒ¥,_8…NÎû™9i9g³°¼}Ó©5l¼xŸÈIìŸ=‰%xÓÆR–/žJç}D|¾š þ<ãÌf~ã*dîcë…¬¢u‚JGÀØhbbbX½l*ÝÝ0wòRNþù‡f’-à‹ïÍ´ûd]ÔŠÛ§¤ü5ß-bJïZÜZ=ž±+/Êö_ þkV.àÓ&6}=“ æ—•õ?,:Fõ^ð¶ÉÏöžôøÒå?n%½}_©t=zvrd{ÔF®å<òŠ ‚P‚•¼›{KLñlš8š…§Ò‘ ¥ûj$µ Í?FHuk@&ußd­®ÅØž™|ù'ogC•Ì™ÒgÓVͱ.QL~Ù 3 ›?âýM|=­ nj0%äÛ™KÙs- 3šr/Ósh\Ô ÊSÒQ¾Ÿ·”mçR0š tÍv¼7  Um%@ÆðçÏÌ _ͱŒR8—õ¡AE#çÓÌ)ÇY;o ±'o’ž%áèû*Ýt!ÀU«hÿ…¶_¶\ÿ˜ $ËÎx¹Û ]PãX¯7ÙÞÆIÁ„Šœ|„uÍ|Ø•w[$*Ôÿ#¤Ý‰Ø# ¦È¬©îšDìš8ÚŽn€®àþïaý!h8¦3îzÀ–À~ãp¾ ã–6Èiü¾ù0ø¥Sæ7Dm9KOï"$”¨ô4ìØŽµ;ÿÇÁëF|ÊÝý,ûÊz¾šyß!_ì¥SÒ²"‘´vxø¿Í°AçfꢊD ©…­ù:±ß|ËÅz˜×Ý]ÚQÞ‰Ñ!û¶Oc³ë¦ÌÀEJà×Ù2cº3_Oyƒ²XØ¿d¡ýXê? Ý_¦>A¾gîg³rM$Ã#…lUªÖ,­h{ã­³\7»Ñ°üÝO²©LPËÊÊ+!éñ}+€ÛsV±í¯º¼Qà£ì„sÜ0»ÒØýîÅSÒ¹SÃ÷îßÈ©ÇÙtjŒö¡F–7ÆY[8^ƒÚELÿÞ_N6&´è´w·7§Ä±hî*2Û}ÆÀNñQ‰„]ÕÊg¯æd|þ/ñís’8½5–Kú .wﶦ„Ý,úÉLë Í(“ŸU<ë矒J"ýÒ ü"'ñRÄfîêÏìIþ,}?н½Í “Ù9Ÿ8ωüâ%ô‰»ùòƒ¹,¬S‡1vH»}Ï ,Åõã/h=iÒˆíáßr¸îÔµ{*Ö‚ð„=£K §²±ÇÚ”C…wzèaƒHŠ¢9€ +½†äÛÙyä"‰Ù:¼Úeðkî(I䔓üß9‚Ú7ÀM+!Y¹ؾòá\Ê9í]w¢Q z Tv¾4oxwBN>ÆÖ³µ­ƒ‹иÐ`PóƵÀUmyÿÅo¿ZÞΈ@;â/ßârÌGtïó1ó¶_%KÁ4—9;lÙ ½U1†¦,cUé ‚«Þ`ý§H/ð¤\6f`Ä ­ G ïß®]»Òµ÷¶%˜™¤Ã›8!Õ¤©—ÛjTÍŽcó©4ųt™R/°íÛÿqÝ£Êæ]ºåLÏÿ†m·²ˆ?…´û<É”$k;tR©Ù 2g²rw‚ƒƒ î܈ã•é3~ µK#r*‡¿]ÁõÆ!¼áY´$¹$ŸJhÊøPÉNGiG;œ^¨ˆ½µ.6ÙÜ1˜AåB³ñ ˆèï‡jG_ê»›¹u=óÐ>(^ÿ[Š?ÅÝ¿26Þèås‚ÅkÎ`x˜S„gÎÓ9Ck¼Äê?áû+F¬«õå« -ÿ˜?·DR!iݨQÁæ!ój©Üy,Ãl vÙD]ÉÆÍ¯]Bºòr9Ëß2I7ÞdÝØ¶äçl²‘L|H6ʘ3“É@‡ƒ.ÿC:{Ýßw¦ŒÛ¤Ézœõw+iKáÿ¸ÒÂþÑIÅl¿e’µµÛôÂÓê"éÙ½ qܯ׳>c…çLz[øv•Jgµt™´,3ça¢Æ…Fï4fÅ”•ìñ+÷w;U:tÒ%R³ÌààË€°Yô¸¹•Éãö‘iÌ·ù-öwT5FSUÞ4ñ2{‚”º qPÒaù !€º/µbô'oá¡òÖýéká³7ã™1f3·Tcl«²íd4’Èmp´Qx“ Ò0v>#«]dáðÉœóoMÓJÇŠŒáÌŸô¥÷ôêØu•àó°$­$!©$ÔÖ$d$IFFŒÜ>ú#K×àrºŒZ%“zÕˆ]£ÿ¦}Å=ÿ-ÅŸÜÿx¼ñ%· {ü»waãèüüêW(â“Až9OgB«õàÍq³haÊ'j$˜ ·IDAT½õ–4zìÕEø\5Úûm#IH˜MùÏ>eŒÙ÷ÌÎIÖåL@0˜Ò.³7úK"#Ü©>¥%.r•¾ vÖåxyJ8î3³%›ìÐa )3?¡Ë!ýVùskj½¶R: ¦ÿoïΣ£*ó4ŽoUÅ,¥HHX¤A6P@DD0è(´M„°/h%*<*«âC#«Œ# êÅ †E¤1Ð,Ò(¶ÈA#K!²Tê¾óG@Òœ& !HežÏ9õOݺo½¿[·n=õÖ{oqe€Ýd§r""ªGà_DûEÖ_*6é¾"ñÔ}<óXµü»¨Ñúžþb3ëS.bêV*ôCÎ/²5]I|÷Ë%žŒ άç8‰‹×ÓŸG¢Š»ËZ5ü«Žâ³õà´j_n¿!5ý6ràè%žŠ ¦B˜›€Ü \—;å=ó-ëÿa“Ãtt+Мs=ûÓ[Ѷ8§¹_„cš^gÖ­@ÃöÍ©VÇ„¸$,Å—¦ð§2ùP6dü¸“õèY²ö­ÀÄlÎóï.`s«‰D_IlžÖ-þšÈoÓ,äF#‹o¾ÿ€Rì´íÌ™µ°ao2³M~æ ‰cãI¼Eõ]ucïÿ¢Ž?¿íeq|¹¦/•Û×ù¿™°x m'F@CDÊ¥ÛtÊ“€0Ün7n·›°`ÿk:ZÄrËÁ‘r’,ƛŅ‹Å<±ÃDD0¤I%09)üuÇ ~;¡Ö›ÊÖw'± 9 /à¬X•:µBq9 M y~+¤Õ?OÒÚ=œõ&‹cIó˜ñÑA2 XëÐ,2[“i /u‰Kÿmj¡z/í뤳ù‹½¤yo{–¾ÂØy»É°‹n¿XnxûYø™£$-_Dâ‘K—C€!'e'Û~ ¡^ EŽØX›Ò¥]Eö-]Îöã—ðæœ"yÅ;,Ûï%"¸„ŸX®jtèÞ Ïÿ =ïJûMèòh0û>XÁŽYx=¤|øòò^’@s׬ߓÆÍà¢Jt<Ãï?ÅÍü˜ÃÙ7ù·S;›Ó>ç/‹¾§Zç–ø¬6‹fýèS÷g–/ÙAš àåô–%¬£3Û^ç§ørüþ»ÜÉ"ŽO×g²Ó¹h‡pWípü,› ‡6±å¸‡¼ì¼ü}«Œë+6ïI¾š0Áoì ½ÀzEŠ¥4ûÇ?ñãÎ'Óöì*–ï>CS‚D¤ü¸=GhK-ˆ†1©1ãMžífpúW¢A×qŒëR³èyh–›}žfËœi¼ø]$•*ÝEËÖõØfç0á4ëØ„ Ç2x¡—epE6gÀ°6Î.äùá<ŸÀéùK7ƒ! ÆƒÄ­K¸ªóïûóã¬×‰ÛèOx­VtêP›»ŽíÇì\'îÑ ŸÔŸ{‚¬¢×¿¦?!ÿÖŽ•w±Öså®@õ›Èæ±<¡/³ò\„ÖlÊÃC‡Ò6ôë6ý/UžEý Y¡Íˆi„ »Hm÷ÄÍ rTâÁ!/r`ôTf~Ø”·ãîdO±ë»ŽS\îº<3žøN—_»m?ÀY™¶ƒbX—ð>Ë÷4eäÝ?°|U*mÇXDZë]>¨>1ž „'ýûÎ󋈈ܦ4B+"""">­Ü ž‰ˆˆˆÈÿO ´""""âÓhEDDDħ)ЊˆˆˆˆOS Ÿ¦@+"""">MVDDDD|š­ˆˆˆˆø´òh=)¬Ñ“qß\ ÐŒ(›Ôã»æ8y7܆‡c+Gÿ '®iÄ›¾ŸÕoÄÓ·kWºvëÏóo¬dï9o)û\7£>‘[£üÚ[ÂÃéC§¹Þ?‹*Ñ£™:êQ"î¶ÓØ>û-Ö™NL]±šUï':÷Kf¼·‹Œ²Kè׸õ‰ˆˆˆÜ®ß»e%ïäfæ½´Žä_ÒÈ‹lÍ€—F]=ÿOî½gw³rÞ2’~º–EpýljÖûÂò“¥7mÿ9gÛOäbaãªúýãûÑ2 ÞS$NË’ï31$Ð÷S'–3‚öãÞfP}ÿbôÌ&uÓëŒYò#Ùž\Jz^+œ{&1ò³ê4<Àî_«S™}‰_sØõ8_ïÁü 9Ç7³dîJþz" cûS½M_^ôUòË/u}Þôý|²`›~ÊÀã…°{Ÿæ¹!¸»‚.ì|a«›0¾6Í[ËÁ³¹PwïM‹&\_¡DDDäf3EøöÛo‹zÈí%÷˜Y5âÓõùE&ùŒÇØžSfË”>¦Ï»ÍEcŒÉ;i¾z¹§<7Ù¤åc<§Í¶·ú›>¯m3g½Æ“m~˜7Ø YpÐdÚÆû’9¼v¶™›xÂä^y;Ã|ójO3òãã¹áŽÚ&cû«¦çÈ5æxaä2&ö6qÿñ¹dŒÉLždb{¼f¾N;g¶OŒ5±¯&™3ö™w 3+Žäã=c’^îaÎÝk2lcòR·™)½{™);3ŒmnB}y§ÍÆñ½LÜÌmæd®mìœfÔ~fàœýæ¢}ù%øy™;ÀŒ3×lI¹dlcŒmÛ7¼¥DDDD S>ÇËŒ“ZÿH³–+œFÍ£È;sŠL/ØçÿÎÖ#nÚuº·pU¦Eçð;´•Ÿ³Üäâüß7³ußQÒr¨Ó9žáWÃïV×á=ÇßÞŸÂÒS­y®Ï=^¾ÛU¹!wæ¦ÒjâLD`.ç²lpDÐnâbfÿ¹)Á8ÝhQÍæÌ¯°)}}&ã ÿóS(viE”Ÿ…uG5Úvy³w ¿ää?Æ‚¿7šÝÐöÎ@,À²¬²ØB""""·é”Ï/¬~ùU>Iñà_o ïLêxu®iQËqxy‚°…åp€±1€})L*QáêÄUGP8AÞcdä¨àGíãy¡Â§¬_>™÷Sr‰jMÏA½x¨ê·¦~Àä#iΖŸlÅ‹SûsØÕï–+?ËÂrX8ý]X,Ë`0€‡³û?gÙgÉË48† Ç=·¾²véê³³ÒÈôœæ‹ñƒØx¥KÆC6 9ï1`åÀò‹¢qÍü0+"""R–nÏ@ëw'œ0—hoþYP–+ˆg –ÂN+“ÔL/Dä'2ûb*™®0Âüóã—å_•–]‡Ó²+x/cÇŠéÌ›]úÓ:^Y¥L™ì#|>m2_UìÍÔiÑÔô/~,´Ó¶3gÖ†½ÉÌ6Qø™3$Ž'±ÀcJSŸ#¨2ÁþUyhÚLbk6¦ëį˜¯‰ˆˆˆHiܦSœ„„áv»q»Ý„û_ÓÑ¢–_ŸÚ˜öuÒÙòå^Ò¼€ç4;¿ØiÚ»ƒo*[ßÄ‚ä4¼€³bUêÔ Åå(Î,w@FÊI² o.znÎeÂìóìš?•OýúðÚ¨Ž% ³&;‹vwÕÇϲ¹ph[Ž{ÈËÎËŸrPÊú¬FMVDDDD|š­ˆˆˆˆø4Zñi ´""""âÓhEDDDħ)ЊˆˆˆˆOû?dÖ9žà4IEND®B`‚2404_show_agent_instructions_2.png000066400000000000000000001636551516513262500335020ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/24-agents‰PNG  IHDR¶'m9 sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwtUÆñïìfÓ{B …Þ‘&%t PÊKQTjEPAP©¢€¢‚b;E@Á€ôÐ$ÐCI€ÞÛfwÞ?R²HHX~Ÿs ¬«Pn(Ë·—u„3¶B!„ÂBH°B!„A‚­B!„°l…B!„E`+„B!,‚[!„Ba$Ø !„B‹ ÁV!„BX ¶B!„Â"H°B!„A‚­B!„°l…B!„E`+„B!,½ ¶{¦=ÀåNØÝ´HëàÍñøµ²öžU§lèÔ/uüÿe>Ó’­<©^J»oíVÓãØU[‡R:›({fޝ¢-î”FG»†uÙñT;2Æ`݆c½kñ´§U©}P<èý‘öcdਜÊ,ëÚ”OŠ•-=›ÖaÓ 6Äy„ÌÑm9ùDf×qÄíA4B”wZ;ú7ª@ÍB2•½ê:âTŠ›·¬3¶;¦ íÈl±*ëº%ú]9Lë_Óö÷c<’‰ó†¬oæˆm)lΙĪ£áüoD-…òï'f·Åý2–JŒ†Æ7aGG7¢O¥ïo‡éü÷þT*²ºÿCŒv.ñ`Í,.íØC @BÛÏßãdk¸Êï/åµ?£0ÜÛ-›ÍÚɋϷfS[š©)¬?y…/Î%ãTi][p®wü­Ëº–Bˆ|Z;žîú0¿txˆ}ݽ©] ÜZÙ{°´_–viƆ‡J-Ü>ÇìrƘ™ÆÁkI$æþ{ï•$*´á÷º¨}8…c%|”1¤Åñþ-ô>%mq:'^jâÈùƒxê`*9+‰í—S±ÚŒ)õøj %½èþȺĿ{ãpn÷$‚¿'hÇyFÖ«‡MY׫œPl\YðxžsHbÎúÞ Ï$+¡-Öcc‡üÓ]OÃ?¯rÁX–µB€†ÆÍ±ºfηMÏêuÙÛÚþu•0–ökÄ—œõ:¶iÌÒ˜ýŒ Ï.ñ“åòŒ­µƒ;³zµ$rLÆÑ­ÙßÅ—–ùŸöêÖ©Mà°Ç9²9_7tÄQkÏ´!­øÀMC“­ÉìëKYîD±IÎ2‚F‹µX{ðר–¼éëÅòíˆ~Ôg@cíĸÎ͸0:u\{B{U§£k†?ñé½+à™_¦†íÚ >UFvüõ|>öÊéîÛ–£±cÒ.·Ï½œ¯Ø0z`ê˜FôÍmçÊ‘4¾9cïÓk€ÖÛ¢xc©ÈqyKŸUàÑ€¶d ð¦r~SiéÔ¥™ý½ñ+wͧÁQ  Ü8%@ŸÂü-Á<6“ì¼5o7~àÖvèU‰ ś֎ÌííOôØŒ£Z±¥'U4fl÷v}Yz v×2/ngoœÍ»й±=‰AÛ¹ù¤­>r7+gŒgøÿ†0êµÅl8¸)O½Éö„œCšÆ–eS7| ÿ7‚—ßûžƒ1¹=•vˆw‡¿ÄšCÛY5ëEFüo OŽÅ÷ÿ%`̾Ì/¯¼À·z.¬ÏYI»Çû_4 ÕáçL>ÝÌŒ‚¡@Íæà±P:ïMÆ®JM>¨ü`Ne¢|1rüèiÞ‹¹U=ª×eïcuø±^¨ÍqéÔi¦].ùP elEÁJsëùJ: hÌëöñ¼¹ñ0íÿŽà¼Omvõò¥†l<ªðG׊Ïœ¦ÇoGyö„~ðšKï­ âÍx#Á»÷ã°>6ÿŒh¹S  t:kT¯Æ‚ZVDGÄr6?=Øñ|çêÔ‰ŠàÍàTÒ4ö¼Øçaæ»%ñö¦Ãø¯?Ë&[?Ö=QÖVz¶žHDë]‘ÖyAËÊ'kÚpòä5N<\T9ÚL¶^È ¢Ÿ+~@ç@/7@ëD/7- ¡vgâ£ÙžV>/›_k,™—ÀM}–ÄžS±ÄW¨DWûÜ­[;3ªš–=Çc¹RÞšOŸÂʳYÔjÑ‚S}ë0¹¶+õí4(¹r-Žm±úœËÕE]nYÛáh<ëÌ›Šµ+K4b¬Ÿ?°#·Æ ø©‘:Û½m_º—Ëïî@&·ï#Þáa:Öp£V‡‡°I "°@²USŽðé´Åì²éÌ„wÞåÅGÙ¾ä[Âò^ö6ΞÆ×—ë0hòû¼?ãNÙÈû3¾ãt†š¿ÎæÏ·¡ëö"ï}øOU ã×%ßsÚàKÿ…ò”ŸUG.åû·šcïáö´v ®k×.0÷r6…ŸŒ5Æ™Vônà„ó=®¢âVÆÌ¦ÿqô†pëîçÀoЋ'ChMD)]e¹çS¼6#©aaK \\¼+óŒ}¯üvŽ/“U ‰£vtèïÇp׫,²w¤²šÆ¼(þNQáZWbÉÎP1ª*F@5ªd—·àP€Æ·!1coü[ÒÕ‹<±'áz×jП<Îcr. ÛyÕb’G2¾;ÇêÔœv9§ÒòéZŒ«pgÂ#Ù«­ÅÓ­Øp)[7/ا°äl:Yn§²óô)²œqã‰m≿m8î4ÑÇómŠ }lÐEiïgMÄÅ8.–ÓË~¦ÆWAÖÅK¦Æå¬né3t‘lÈlÂH?«OeáTÑ›G5 Œ Ϻͺ,éùkÇAÚ_ócBO¦uóa˜Ï÷Á˜šH´ÑôøÙÃ-í ±7gl*¸ûUa„M#·]àç4€TFÚÛñ‰›=•*¸¹Ý‰ÚÛ÷e¹”yÀý Ø?@-;Û:©§=ÀÀó<[¯6¨$ùÝY­˜ôâZ:)P¿/ÅóÊÚœ"².laý…ZŒ^ú4î 5ýÎŽûŠ-aC¨S 0¨¸ôÇ“m}ÐýÛòëŒâõ ØiQPP44šrv¾SkK '¸–Lt¡]¨àææD[-áé`ïéAŸlN%¦œú Î×¢üÈ ·ÊãMxÃóÆÏ–‹'Ch·=šË¥x¼çÁ6þÜ)žø/õ†¹z;O¾êå h¨èa]J4» œL‹ã¨Á›VNR#/óebV>ÝšQg£Ùp)–ßÎÇp"S-§+ }Ž®ÿ&’ ª$¥¦q&Õ©c6û/gä·“«»3~VÎ|1¬Ÿä5¢`§QPì5¨WãX©aq'œ.%R«V*Æ„óK²Z —“å¤_Šf—¡{èØãêŠ[\8«®ÙÒ¿ªž'ŒôvÉfë¿éd”z#Ý™¢Ç×R£ÌKŠÉqI ·ôúV_4°¹ž^§ciÖÀ«Ë'ù'½ä÷»D³ØÆîÐ0Žú>žŒh\™—;>LWçÃ4Û“„“‰ñ£À-í`L7olV©hub‡ò—‘УÇyð®WµÈí¦…Ñ—åPæù@‚ìhP+'Ú;Õ¥Cm…£ {¦õmõDŸºŠÑ§#5ò :*4¬ÃOW#©á§‰Í:Ã'†ñYÞ*j6YÙFÔø,Ôj€Ö‰Úu=È»CÑÙ`u_|Næ|±ÔÜæj ¨èµ®,x¼­5¾¬éªáñŸOsô^VSQ(•žÖ·¾{l­(홌÷<ئ§¥pàZ2íZ’L¼Îè0fÆóš=|Y¥ý«¹Ó¿Mæ$3÷÷£L*ÅŠ— ›o+”j ¡Àig¢`Hä‰_Â8œ}ãªYYzT¶žHÆ¡­MmõmØÛÇ—ZY±<ÿÇÖ•Ó)RBæƒGRQÛÕÜ_Ÿ a%¡k4ŠÙ ²paÎ f>I %™ad Ã³–Ê•£\ÈkÙÄœRn†X>N4¢ê“ÙdÇÕààŽ$bïócfžLùcél‘ãÒxûw’>™¯.ªüS×™èaì/§_ ²®òî…Ê|ýh3쇳62XtÔõ­Ä[MtìÜ}™£ÙijüܦLM•èKáüdhÄç]ª¢ŠãŠ­³Û¸£9ƩȤ"¶k4Ù—åIFX ’hݯ#õªˆÝª 7þ‰Å Ëh@ýÓòëù,ûø7ÆôkŒÃµ|¿1”Ê(€MÍ^ôôÝÆ >Çqdª.²ç—¯ø[BO' ¦w\A£H¹ε¼]mÊÑ“T΄œbN½æLëÖ”/u!¼p"…܇A XÙòˆ¯ÿ]JáRØ%V”me…h¨ß ÏxúÁÅ!´ÛÍU]çÁïwPNVr›SªS/=–£Y9åî Ï#¿^Î*·s/•¸bŽ¥"Çåm8t:ޤº®üšœ3¯º<2fòí_ˆiTUgus6ÆlÂãøòïÃ|p6-gά9ã°0fŒMcF,£~ åý€ê¬ìW—¬t¶†„Òçp*™ŠÞnQ}Y* v§Ò9»íÉîéU÷¦sÉŠ MkŽÝ܃†eР?ggÕ²ùpúO8× `È‹ÉZp;ºª xç¬?_ÅÏó¶gp¢JËLÕ +L[­ Û=ĆŸÞãõØé|6¥é-¿ÚW–T}2o¯ F׫!SZ0¬u*»¢2HÔZÓØÛ‰Êš,>û#ˆ±¥ôÈ !Dq9v8˜'›ñ{ÛüP{Ùd&2c]Î eS=³Y·ý?&–B¨PX(Ÿ B”…šMšs¢Iýz1¯}›†âàE™ñTmùÙ]!„¸ ™Š „w ´§"ÜOJu*‚BC9{Ü—B!„wF‚­B!„°l…B!„E`+„B!,‚[!„Ba$Ø !„B‹ ÁV!„BX ¶B!„Â"H°B!„AQUÕì_ Âßß¿4ë#„B!Ä‘3¶B!„Â"H°B!„A‚­B!„°l…B!„E`+„B!,‚[!„Ba$Ø !„B‹ ÁV!„BX ¶B!„Â"H°B!„A‚­B!„°l…B!„E`+„B!,‚[!„Ba$Ø !„B‹ ÁV!„BX ¶B!„Â"H°B!„A‚­B!„°l…B!„E°*³-«ñì˜9†C9ÿ®4E‹‡PEWf5ºg2O¯`üÔ¿I|†|È¢~¥ÛjC˜;ÞÍ«~bwX6•êаEw~„ªvŠÉ¾0$Ÿfû/°#øçÃcÈ´÷¢JµZ4íüý:ÔÀA¨Iì›;†Gô€mßZÁ«MìsKÈ ôã±ÌØ‘xÑážô‰àë&³.ðêÇœIÙúåïì?IºcZõ}–Ñ}kø-ßm>@èŬÕY3rÇÃP–,€oî;;ýÈ{<;çzn~¨d];̆Ÿþd߉s\¼–‚•»µîÁÐ'»SÏÅD}æ?ÂÉ· Ÿ·mÖ˜*n¿§…B<°Ê ت$»> ¡z@G:èóãé³@8;FÓ»O% ž Qÿ°pò'JÏûK8G·,'äp…BÊ7’pàS^ÿ Øü¿ev”¨°£ì ÉÓ{ãwóMj©!|5}Srÿ­O$âÈïÌŸšÀ[O ‰½{/ãHÑç®cëDOnw(ͼ¸Ž¹Ó¾&$#÷éÿg!PKªÞñ»ùèíp"³sþ™yš  §9t*Žy³úSÕú6• 1»øèÙP°¢¸Å…=ì }“÷Æ4ÇEãÄCÝc}äY¤sl×2š4À@… ã¹V±í}nª`L óßL !/˧\bß÷³¸øŸ/Ñ¡äV}Ìi¿˜E’ÃG¼ÞÁM9êÇ"™Úžƒè¹¼á]&­>™¿¿ '9ê‡Ö/ãÐÎ`&/xV.fÖÍÇîf²ùXPùNj>b#³§|EhÖõ¿â"Ù¶’é{ÿc‚)tªPD}nóÉü1uÓ K²]e^„B<¨îý@M䨶“¨Lû‡+àÙ¤#Õr_ÚqˆCÁõZ¹*7Ô*øu}ž©ï¼ÅÄÇ롎.p€Ë]=í8ß,Ï C3dòlæÍ}“‘í<È YÍòmQnz†H.ê«Óþñ¡<5 €y0i'뎧 *n´{}) ž©‘»À†V“—óÉônx–ˆ WÙ²ìz¨unÔ“'G>ÅcMÝP“Som–;­wz8‘Úô{š‘CºP'ï¬Ù™ùlGô­ëh×}+–ç›ÚÝyzÂËŒ{2€*¹ûµícVKEEÁñ¡îIßžyçjhïVô<€Î \sÿžÁ¡ ‡ˆ3–£~4ÅÔö2NóëϹaÌ®!OŒÂŒ·&ó\×*9oÀ„¬þózsë–r8'ÔZ»âåçM±OR¢ÙþÉêÜP«Áï‘'ÿÊKŒìZ-'@§bÕ7Á¤R̶*Ö˜*Åv,fs!„°÷üŒ­šxŒm'rãˆO;šWТUšÒÞ.Dvp$¶'=sœjül<œ™³~µ¼1º;•´@ýZ¸ÆM`öΔÊO;¹‰}ÉZ=?­\Q€•í?6ƒmI*§7ïáZ·'ð¹á•^<ñîl†Õ°T|¢óq(F DG$bhåT¬ÆÒ_þ—¿ò.áÖÉìi½ñ±m‡ïŒ‰|vêÆéw^o{ÚL™Ã«-P€îÍ]xuò¯DbäÔ–Ävî…W!__Œñ‡Øp$7zöfæÌ‘Ô±hGë*gï ™ön å¹&-q°¯G×fvìß›q º:œZUµÄßÏ*Ñ¡­7·>­­£fN¢G-¤×&~ì,v¦J]ÆÌœDWO ônHÖ˜YìJRbH5€]9éGÓLoO›vËyße¼ѺM j9hhÜÀ#¿p2UÅÖÞxËœó¢Tî7‹YCÂY džâT1^kˆ=È–S9ÑR©;†éºà©Z×$ûÔ‹|éÁÿr!óa²5¿Üb©^]6í(„²Üã`«’xìòrmÅ6-©hàEó¶Þ|»ö*Fà‘8º÷¨€ȼz”ðÜÓ;UZP!ïL‘â@ýî-qÚHr~ùzbN^$'8¾âUF­Ê½fªHKÊ]íê1.güQú–T×9P·ksì÷î"(öŠbPGNí½ó2½y€{jºävšÖg ð¨K¼ëÑZ{\l4@U‹ß¥Öf0c{Š>p6¸øoŒøŸ‡ZÐÒßÿþcyÔË®x—N4Ü·AN¨½úk'¸–ûÿ•[?„[ÞÆµÞ<úÖ‡<œlÅŽ ELc)L±ÇTÁé eÑŽB!,ν ¶j"Çÿ ½~ùøò6~ø:§ ÙÑ×W;·ý(qݺâ©CZi¹·ws¸áÀ¥u¬€#¶FÒó'⢦%‘XX= ©$eªP0i­o˜Ç¨h4˜¾õêvŒdä×Ã7Ûe)X»zâp7õ.Økp*Ø('*ä=(?3™ŒÛœ¾R3’É›úëèåxãN+G¼ #1¿ û:]há°‹Sáòž£Äv­Äž39 ½;¶½Þ ÒX>ScUÄœÖòÒf0g{võyúÕ$,û…à8€t®„ìäüñ%8Õ{Œç_F/3ÄÁ Wë;ß+CFR~ßÛ¹ ƒ 6î~Tu¿³r‹=¦ ®Pí(„ÂâÜÓ`«&†°-ôú¬Èkûþd]a+žý‡àøÎtöР±¶Cd)ÑÉqÊ?f'_+4XÛåfò¤ï¼yºF¹›'è– 6Ny§«2ˆKÈDÅ6ÿnt}R\~XÏ[¿XõÎ,ðÿ©Ñ$ ¯Æd¢ófgØ:cw›ô¨Ø:aKÎÉÓ”è ¸^ Ù)×˰qÂ&/ùØÕ¦«¿ÿ&Ã…] öæD&€´©T‚ƒ©¼ôcIÑâÚd(3>}‚ÈÐ vïÞÍ¹”ÛÆÉ'7²hQ%–ÍyÔ¼y¾ŠRDX¿ñ¬´1;û–Kók¬ÉF©qiq¹³çn®ÖŒ©b)ávBaqîá•;•Ä­„Þön¦‚«žáŸàTÀºB¼rÿñÏNÂóîâ6&pxÝ>nœak…gíJ¹;ËɰÄëuUOüù„††zú i%pMúöE(ØW®Ÿ[o•“ws-/|bÙ¿ñøM=‰7, IDAT7=ÝE½“÷³)89¿.™þᯈÜø6Âû6—“­+5ÌŸ›zeëVÎç‡e•”ÐÍù7YU®K…ütbKÍ.­pà4?¿/ç‹…Ï#´)Ñ(/ýXTROþÎçË—³|Å޹¶aÀ˜©,úò;>õ4ç>5M½Ì•¬Â^mEƒU^‹¿Dtfî«ÔTÂ^¸å;k¯º×ßS{Ž\¿YÓÃö¹Ï3|øpF¼ð)¡Ü¢¨úÜÙ˜2×ݵ£Bˆý;c«&²-o‚ Ýf/gL=›VÉ<¹‚ñÓÿ&•ÓÇHx7¯–t¬ü-߇W~bÖÜúú{tt3ëeÞ´§‡zÐÄ:„#Y*§W/e­Ý š{dúß}¿—Àúá—Y>Õ{ŠOÑä+Ë$úR4 +c£½õ šÎ·|cÍePÏ®bÚÜHz7w'ñèŸl¸%ÝßM½ÓØ;o‹ûu£®.‚¿o# +=Úw …¦[3kªãÃÿô³·géÒ£±GذæßÜ/ Ž´íÝÇ;gS½3­]·²%’£rÚß7 uî\é’R~úñî)háìþg)@à©dRoM  ÉQ$åÝÂï䉣¶ˆºµ +7ª¸ñ@ú^>úà z5s'ýÜN6î½u‡Ö«%«}Íê À¹U¼ûQý[U$ýØ:¾9G6`פ9•mЍO!_‰ïtL™§øí(„âÁsÏ‚­štüú4§ft¨vë¡Ú¦j{š:þÍŽ0ž äxbG:¸úÐsL¶O_Ï ùø&¾;žû;;HO¿¡ ÅÕŸÑÏ5çµO‘–~œŸçç‚+T`â˜6¸ÞQ‚Ñ`_ÉΑ œ_ý*Ã¶ÝæÁþºÊôÿ»§ýNü'ßç.ÓjÁpc¸½ãzk]±7\aϯ«ÙSàÏ6Gò|;÷ÛŸ’׸Ñfìxö¿±„½ yz «Oo¹a•JÝ_bd#‡ÞM5:µugËŸq¹ð# uINCÈQnú±ØÖÈF{ùâXjľ[¶ã¦5´ÔéÓ3÷™Ã·©Û-‹ØwZômÎ×"HÝšМEv^ö¤GÝ8ñm%ºOÂî7~ä¬"wÿÈòÝ–»> £šã¤QŸùR;Sf*^; !„xÝ£©*I!ÿš{9Þ¡iGªö!»êth”÷ Ö†$¡¢`_o³ßIçFUpÓÆÑ›ú]ÆñþÔnÜú VxuyEÓž" q5¼@‹ƒg Zõæ§­ç§»úØػ>î&ïOQ°«û$ïÎE—zžXŠ£õ: ãÍIä^Î/zWìÎk“Òª–vŠ‚}Å:´zâUæ¿Þ£ð›¹ ÐzvàåEsÓËŸz•ݱ‡ T{¨ý^ZÀ¼Ñã|˱¦j@{òžH‹_­*–Æ)²òÒ%ÀÊ›S?bÖó½hVÍ g›œX§µsŧ~Ã^_̌޾ùJ+~Ý4¸·{™¹/ô¤A¥Ü›¶üh1ð æŒ¬_È#Ølª`Ö¢I l×€*žv(€­{÷Ëû‹Çã_àGŠSŸ;Sf*f; !„xð(ªªš=Å0((ÿÒ¬O±d„,aÌ̤ &}ɬ6N¥{|yqÃOêÞøª÷‚š°ƒi£>æ4PeøÇÌÜ»Dn>B!„¸eð“ºÅcŒ dæøeœÈܘüÞXZyXaL9ÍÆïö’ó¼v?šV±{0Bm2fÄ—˱5?p€jtjå%¡V!„åB¹¶·– êéˬ —!n;óÇlÇÎÕcBbþS¯|EŸr¿+÷½ôÿ3vAhþ¿m[þŽ¥2 A!„¢øÊTiôô\æ×ZÏïî"äR ‰è=©\µž@¦•°‘Óµ¥O«Cè*û?Á˜qþ¸H» !„¢œ¸¯çØ !„B‘G~Z]!„BX ¶B!„Â"ܳ9¶ñññ÷jSB!„â>çææVì×ܳ`{'•B!„Â\2A!„BX ¶B!„Â"H°B!„A‚­B!„°l…B!„E`+„B!,‚[!„Ba$Ø !„B‹ ÁV!„BX ¶B!„Â"H°B!„A‚­B!„°l…B!„E`+„B!,‚[!„Ba$Ø !„B‹ ÁV!„BX ¶B!„Â"H°B!„A‚­B!„°l…B!„E`+„B!,Â}lõ\úq"ƒ^ü…ËÙeñú;gH8ÊÚ÷^døÀ üß^zïGŽÄJ¨ôœý:}ɪéõÊbÿËž‘˜¿§3åçîù®ëÃY;q(Ów'Sd÷Ü•’Ø¿ÛÒ¿æ(»þSö1Ô |}6óoY!ĺO‚­•º½ÆœW;á¥-‹×ß!c»–Ìc£Ú›9߬eͪ·è–µ…Ÿ ©ô’N!ÊhÿË=Q'£È*ëj”š’Ø¿ÛŒr1~Ë®ÿ×–ŒäFàg›À/„Bq²*ë ÍH̶w™¼òú,ôÞCY²h¾jmL:Æo+¾bKH©™ n º2|ÌPZyéL¿^‘ï_y›ó=ŸÀõð~.F]å úúKô¬l ¨d\ØÄ²Ekø/Å7ßæ<Ö2Œ¯··aáü¾TÒªdF²ré콜Žj´Á·ýp^õ•t€jıù Æ´ìL; P“öUøî§ $d·ÆYgb÷õùþå©„t@¥ã #^Ó€!¯£‹O!/Ö_åïyÓùÉ~$s_쀧ÖtûM%yß»Œ_Û˜·FdðÃòu„ÄfA­1|2·šœ3z¿¬XͶ3Iè àÚèqÆéMmPIÛÈNj֜ꀻw#êŸåçàž|ôA< á¬}e ÁC?ãÝvN(‰ùë ^ØÜ‘ç÷¦¢ÖTù`ˆ;À·­f×å,ŒXy·cÄ‹OÓÊS †klž5…•¡©¨Lbø¯Z­'§ÏgT]sá®eG²üõ]Œ#Û«-#_ŸH7ßœþ3ÄäÇå«Ùz&§º=xvüÿhꪽûgb|˜¿ÚÃoóÂo¾4·;ÆÁ«¾ôï_ÿ6ïä¬Uf¾;„6&Þ%°¦ÆŸ©ñ[4-^FÑkËÛ¬ÚÙž©«ž²A½šmÆë³.©k&PM^«žN3ªª1I=¸h¤:lî5EUU5ûªº~òuìÊ5ŨªY‘;ÔÅc¨&mR£²UU5D«[ߢ>·ôˆšdTÕì˜ÕÙO=©ÎÞ—¤ Ûìkê_3ŸRŸý8XM3g·³.©k& PLúY=Ÿ¡ªª1M=ùåXõÉéÛÔƒªªj–zñ‡ êi»Õ¤ìXußÇãÔçælQ/g™Ù~æTáÜjuì ‘ê “—ªÛÃÓT£ªªFcîÞeG©¿õ¤úì¢ÕÈ,£j̼¬þ5ûiõ¹Žª)FUU³/«¿½2Dðõ)5ͨª†Ä#êgc¨&ÿ•Sÿ¬Kêš CÔi»òÚË Fo™¬ye½™mFùj†zbùhuÌŠ5Õ˜Ó>g×-Q—n¾¬æ71IÝ=m¨úÂOáj1wýî厯/}®EëU£þšº}ö0uØ{sÇW¤úç›CÕÑKƒÔ¸lUUõQê¿óF¨ÃÞùW5ÜËý3s|Ü4~SƒÞV yGݯîš9H4m«üŸº`äxõ›°,3Þw¹&LJ‰ñkfÛ¤…~®ŽµX=Tœ× !„( ÷ÉT„©‰Ál=íB§>ÍðÔVž´¿„3º™É]µ¢j×NÔ´S@q J}O²c¢H5é9áDËŽµpP@W± ·-pÖFãIÀÌ/Xò|œк5ÀßÇHôÕdŒ7oÇÏ¡U³ùòZ[Æ {;³÷R‹_‡¶T¶;ªù?„õ…„œö§¦úý\>êδW»QØÉÜ;¥±sÆÆM•Á#éèg‡(JÎÙR5)„θЩ_k*êk:ök‰zd;3AM9ÇÁ«n´îP;4ÎÑ¥­ùg½L•¬í­H<ÈŽÿ.—eKÍ>/2¡‡%ØwGÕRµ{_šyZ¡XyРyE²£¯‘jcâqv„¹л)nZÀªþ}Z¢;¹ƒséP®öï6ãתB}ª9Ùâêæ„{ª8Û8ái—E|ºÑŒ÷ÇÝíŸéñQôø5‚]½AŒ¬œ/:Eú=B$„¢¸ÊùT„¢ÒbIQíñ°¿•#.Å:ê+X;Øw¨S4 ¨FTÀ˜™Dªj‹³m^þ×âäíŒ68ïµzbþÁêß‚¸”ª¢Õ¨$Gèqj{ãÔÌKlýh6_G¶æ•9#háZœïìÝíó'C+6ŽX믑^`ΟþÔW,9›‰\¬‹sÐ6ƒ¢AÑU¤a;n.Ù˜Gª>Šõoâï¼ ªz2¨O¢^Ř‘H:¶¸æ·Ÿ[g[³'v›*[Õ‡¼ÅË¿²åëY¬ Ï¢b“n õ$í¼­ïz×Ð_dí›Óø%\€MçXðv÷ë_œL-Gƒ­‹]î>+(Íõñ•G*x:\¿{ì —HÊTÁá쟊¿Š•-:EAÑ(hm¬PPQÓï»Û?ÓãC)rüšMq¦ùð¡lšò»¾ÇÀ*åæk“Bˆ›Ü×ÁVk’JLš¼ûàÔŒ.Ç€§¯'¶w™ñkGlÉ"%+ï4äkÉäÝnŒÛÅG‹ÿÂuü,j_Íæ)/²¹@jFÌÅŸŽO1gn7ªØ·RF2Ò1â‚0¦'¡s¾@ÏiýòÞôʬ›úýUƒé=+•pÇjÑršUc_'oÚÍ]Ä Ê·ìUƒ3¶¤“a´@6)Ñ)ù퇢 (`4äýEEŸ–•ÿSå(6Þ´8VÁr‰=ß¼Ïò%>ÔÛÏ’¸¡ó£ïŒ¥t3äÔJ±²ÇY[ŒåEÐÚ{äŒßTy•5¦ÄjåŠkî8)õý3ánƯ9ï»Ù?sÆGŽÂÇoqh+täÙ>›˜ñÅv:Î,Æ!!„÷Ô}=AqiDçš ®?Bœ0ÄqøË©LY~¤[æÜAùv•iR1žƒû.’®BvTöDç35#£3Õª{ SŒ$ŸÜÆö=ÙÙ9—Z‰øt¿ê†ñΫÝï Ô¸´ý_Χ« &xŒìêþ9Sri+âîÑœg_ æ›üvþÞ<žHqn@׺‰l]w˜X ¦siërþBª Šc šUŒc÷?§IUAÄŸ®OÓÐÚãéqa1djf8{÷\ά“©ò1İã÷Y‡Ð:zS³ª Vš©CÑ`m Iᑤ« ÒINÑãñ[Zl]qssÃÍÍ W'››Þ4¦–Ñ~. é\3írǯ>Š}ë¢6éBmû{µE¸Ëñkòýq—ûgr|”(~½FÓ1v _L,ÅÇ· !„¸åúŒ­16Ù¯}ÎÉLPõYèÕ“¼:ü´VywF{ÑeÒkÄú¯=» ½\êõ`Ò¤œ3*&__ÃD¬|é9v !‹f0êog*Tõ§g§êìÛ( ­øC;ïæÓé/°§’^ ã©Áõ˜·ö}>ª4‹óë®DÒøœ—žúâz¹ŽþL]:‰&fM´ÕQ­¹‘u³^âôµXÒ][ñÜäv¸ß’ž<Å«}§òÖ‚ïh0ïêgl7Ñ~wùd^œDÔ§_2ùÙOQQ±­Ü†Acka¯ä´ß£†rzñžÝf[õvôjçËþãyUvÃØãlÿh.¯{áî^Vmë`ûoÎ¥z“åk=hÖ½1û>›ÂèÏ4X)*V^Í9¾};Þí©ß¿•~À3ÿSÑÚ¸Soàt¦÷«Röópµ^tyõU¢—Ťç>´x4îϛϷÄù쟩÷dz9~k›Ú=ï—<ïnÿL¦ØÖaà³ yõ‹5œh4š¥±!„wEQUÕì“AAAøûû—f}Ê9‘&3iÏã,›ó®¥}\Óßü8¬ûÈõ“yeç£,}ßœÇ- !„B˜O¢E‘ Dþ9“1oüLX¦ŠšÁ¾¯áÞ¸:÷ÊB!„°(åz*BÙÓR±ãº]ƬQëQ4V¸5ÊKW.ûËØB!„â2A!„BX™Š „B!,‚[!„Ba$Ø !„B‹ ÁV!„BX ¶B!„Â"H°B!„Ažc{׌Äü=ƒy‰c™;Я˜ šÎá9Ï0÷ˆ­6ï;†–Š=g1ÿ™Úب©œÞ°‚OÞË¥4¼ö乆ÒÜ]›³z‘ËÍ(¿jÂ>¼ößXÀÓµîòçw…B!J™Û»¦'êdYÞwðR5“”T-UŸùˆyy¡½uö-ãýõ:žž½š•R Z1“•ß5¤ÞĦ8(&–cªü¢)®-1èO^ÿl]æ>¯Œ!„B”c–Uôùþå©„t@¥ã #^Ó€!¯£‹OÎo‡bòãòÕl=“ Š‚SÝ<;þ4uÕ*ÉûÞeüÚÆ¼5"ƒ–¯#$6 jᓹÝðP¯±yÖV†¦¢2‰á¿jQ´žtž>ŸQuÍ8ÃiÌ )ì\í ŸbŒ%èãx^LÇÊöh°§ÍÄå´1w¹ÁDù&iñê4Š^[ÞfÕÎöLíäYìp,„Bq¯Xv°Eƒ•’É©½*£çÌ¥šu:§V¿Ê;Ÿì¤é¬Îx¨×øká"vø¾Â¢/[â¦F³sñd~ìË’ip×(ØzUÃñò,ý®ÞZÉ ?;PU "=g-Åù­1üØt‹Š;Á˜Ab†žk›?àÅÏΙa‡o³^Œ|~MÝ´y…àköx§naþ¤œŒÖãT·+#Æ Î™j`j¹©òÍ¡«LïQm \ô-GZ¼D '¥øÝ „Bq<7iñëЖÊ6€bG5ÿ‡°¾p€ðL0&gG˜½›â¦¬*àß§%º“;8—žój36†lª IG?;@QJ*ÜYãÕ¨%M› `ÚŠøñ‹étÓoàƒe ©$¦ÄtÈ–¾3–³êóÙ °ßÆ¢Eÿ˜·ÜTùfQ°«7ˆ‘õóåO§H7û˜…B!î­òlõYûÚ0ÌàÁƒyú­¿n e¦–£ÁÞÝ>GG¬õ)¤gƒ1-ŽTðt¸~öRcï½!™¤ÌܧhPtiX%'Ô–(ÝÆMfB¿‡©d«AëT‹îOvÆ%l''“UÐè°ÖÚШÿ£ÔwÑ¢ØøÐ¶_'\Âvr&ÍŒå¦Ê7—âLóáCñÚùÃõ%Ý B!„%¢üOEÐùÑwÆRºr‚˜be³¶Ë1’‘Ž´€1= öV µ÷ÀAI%&Õž9ÑטCª•+®6c¬])L.U3£8q,÷F¨”»=ÕhÀ¨èr¶§ó¢¶'OÌD%7X«€¢É™ëjb¹Éò‹A[¡#ÏöÙÄŒ/¶Óqf7¼d²­B!Ê™òÆ-¶Î®¸¹¹áææ†«“ÍM•6µÜÀ¥íÿr>]5‰ÀcdW÷§² (. é\3íŽgôQì[µIjÛ›Y=Eƒµ-$…G’®‚jH'9E9çCcŸ¼ÇÂßNdcjý°ôú¨ë €Î‡ŽÝ}9¿æ'ÅèQõר÷{ ‰5;PËÞôr“å‹¿^£é»†¯&šµB!„÷’¢ªªÙ%((ÿÒ¬OÉÒ‡³ö•)µ}Ÿà=œ¾Kºk+FLGç¼§"ÄâÇå_±õl  Å£q_F?߇ºŽ9ÁϹŽ×^ÙMïeïÑŽ°ï*©¡?òþÂ_9‘¨¢µq§ÞÀéLïWÉ ª¤žý“ÏWü¾óI¬œ©êß—gG÷¥Sî¶ ±ø~)«6'&Ûš =Ês <ǶÈåf”_,*ɇ–ðêö¼²p4 ìåF2!„B”D° úï¶s*ù9²B!„¢Ü¸¦"!„Baš[!„Ba,{*‚B!„x`È[!„Ba$Ø !„B‹ ÁV!„BX ¶B!„Â"H°B!„A‚­B!„°l…B!„E°*ë ”>#1Ï`^âXæô»Íë¹ôã+¼¶§‹ À×ìVÉyÝëÇŸä³wÛâtG¿ÙkNýÌ &óßòW˜X‰_Ì%À5§2jÊIþøäS~;x™Lª·ȸçºPÅ6g¹!ökV¬æ¯à+¤l©Ô¸'#' ¥…»¶@Ñ¡¬ýpë^#Ð:7eü‚©<â~ó÷"‘ë'óêî>,{¯nGY8q.A)W1`péÆœåc¨kc¢þ%ð“Ȇ„£üòÉJÖºBºâ€o³G9ö<ì¦5kÿM¶šÊé +øôç½\J³Á«aOž{a(Í ´_‘õ»«òÓ9<çæ1 Õæõ…–Š=g1ÿ™Úؘ»Ÿ~ɦ£‘¤kݨÛe$/ŽhGEf•ŸÓufŒBǧõ7ÑE–oÎø)VÿÝ4¾ÓûoÎûëöÌkÿ¢Ý¿æíßÝ0õùE·Ÿ9¯¿í¶ö±àµï¨øÆž®eNk !,ÁlõDŒ"Ë»¨u¬¨Ôí5æ´vÆË¼bÞc^ÜÒ3¦Ê7F²eþþñžÈ‚ïÚâžÄÊ™2ߣï÷óÅJ5Q>`Þø¸Ýø4Q¾©þSL”oÒ]öŸ©ý7ëýUTÑæ´ &ú·¸å—©ÏŸœ•nß~f½þö×–Œô'¯¶‰.sŸ(Æ !Äý̲ßê†klž5…•¡©¨Lbø¯Z­'§ÏgT]ÀH̶w™¼òú,ôÞCYrÓ[cÒ1~[ñ[B¢HÍTpkЕác†ÒÊ«Sú«ü=o:?Ùdî‹ðÔæžqZ±šmg’ÐÀµÑãŒÓ›ÚŠõ3š|˜¯WGÒutg¹¾ õ$›ØÑiVGül°©Å£ƒ›²né6. ­E]­ÏŽO3¡M[|l *m:úñíï—I6€CÜf½¾šÓÉYdsšÆý‹h+tå­yÏRÇF%ýüF–.ZKpš#•êÓºªžÂÊN%5ä{¾iÂØ…µ±5§þ¹²®låãÉ›8‘ˆÑ»=Ͼ6–N>9í_dûªF›bLËÎT±Ó5iP…ï~º@Bvkœ•¢÷ßË5±ýqïÁ‹éXÙ ö´™¸œ6ê^týî²|CI`çjWøœ"å;%Ÿd×EºŽ÷§¢N þ \“ ¿ì%²Ï@ü”¢Ë7D™&ú×hªþ&úOw—ãÇhªÿŠß&÷ßÄûËÙJ%3"•KdïåtT£ ¾í‡óʨG¨¤3£}(úóIM2Ñ¿V¦ß¿Eþ™¨¿‰ÏŸZ‰&ÚOoâóËäG¤¯N£èµåmVílÏÔNžÅÿr „¸ïXv°ÕV¤ç¬¥8¿5†›ÎcÑ-—ú5xv™É—]T’w¿Å˜57½ÞCàÂyüå5‘¹Ÿ·ÂS‰aï²×Y¼Ðƒç>F¥‚Ÿ’Æ8ö¯x—5Ê`Þ™˜j1D¸h[ÜÆ2÷“öx©WÙ:ÿM>XU•%ã`²~fP“8¼úbz¼Ás>{,°Hž«:W¸­½jᚺ—+i*uݼðïÕ3·=IƒøeÝUªøãeZ¯¼óeW¢þ|—·÷àã÷»áQðk¸Ê–¿åBË·Y1¼¶)GY5ez—Bê©`Óª½T¼†O…Qÿܶ+§f}‹N‰ìýhº‹ÆowÂC5Õ¾ž4ïýxúFs ðöõ†’Ó$Eï¿ÉåéW¾fwêæOÚÁÉh=Nu»2bÜàœKÙ¦úßê.Ë7f˜¡çÚæxñ³3DfØáÛ¬#Ÿ@S7-˜*_Qc~’Q°qvB‰=GŒü¬Š.ßäø0Õ¿¦êo²ÿîrüdšê¿¢Ç·éý7ÑþÆXv-ÿœÃ•_gù{M±ÛÉû/}ÊÊf͘ÚÊ ÅTû˜ø|ªhªï_SŸJÑõÏ6õùc¢ýôQ&^ocÆ)u]ezjKà¢o9Òâ%ZÜÙ|1!Ä}Dn+‚šÌÖÓ.têÓ O`åIëñKX1£ÛSÔTB¿ŸËçQÝ™öj7|òÎ$%…ðÏ:õkME‚bíCÇ~-Qlçbf‰Ôă«ù&þÿìÝgXWÛÀñÿle"(bÅÄ’ˆŠÅ5&ÆhÐXb¯±EE‰1±'F±B(vÆ–øXáZ½¯×ú€ÏçÏê…_hÜÄ´Ûs¶çŸ¾dçE£òñìX¿Ÿ¿2dŒ÷ŽóßN“ž•‰I.@úOeéø ý'¿Âõ‹ÇOqÿ¶àiÇWåBÓñ ëW; ÔŽ>Ôu7s÷V2fíci|²t|-ÕÏâøg¡üŠÇŸ§(ìþÙ$l¼:ÐÃûKÖÇðäÇI‚ !ÿþ[ãUÖ~ö9?\7`]¥73&4XZÚ^¦´{¤Èzœõ“´Åpx,ê3ž_JØ¥ ¬ë¶ÃÁêáÕÕlˆ'Õx‡cû°=7š“¤ãM¢Q_€È9ñËV&ñΘ·pSCÖcÛUVz´æt2Ìz*6z“@«ÒXg!+l­òÜÓèë0qÝ÷¤Ü>ÇÞUßðù—fBÇ·¢”…ÞaNO$ ºÜ´Tèìu¿[’‰ù)›¦“©”g ‚¥ògSSÌÕîÁÅV­+Ž.ë.†,åí+g\cGø—,¿]á_u§vñÇJh©þOÛ®Òb¥¶¦z»·ñvPî4hÀš1û¸˜öÎJÿ3¦ïjçNàǣ̭‡®Í;7cãçû8—Ü×âÒ׸ѩó?¾–Î_Ëã_þåW<þ—"'Ÿa×E[jwud&Ôbù+˜IOLÇŒjÀ”ž@†Æ½FYûÊé—ùü\¬ _M ¤lžÇ—–ê_ÒêRþíSÌ•Ê.p*1r¾k’ 5–Ëg±ý-¤/gÜáìÉÛ8U¯NÉœzÉffI‹V­ }G K]>ïG7 ÀÄíMŸò“ÛÛ¸YYNßKÇ·{¹D‹éçwü ÛÐX8~ û÷ÓXj7ùÂgo£øÀiÌjä†V¾ËÖ¡lÍÝßBû+Ÿò;¾–êg)}«ûù—_ã”ÿøcIa÷ÏK]Ÿ^­·0nánüÇþ_áå%XŠ Fg_GGG)ngýX¡-l—TXé éúm 2È&É)Oû‚Ó£$‡ê4óL`ׯ£Ä›S<1KÆy˜¤Ç¦ïOâð&å¬@Rgqqó""Ö#Þã9õ¿g_ ½å ‡TÌ“Z®ñìß}‰T²âbØz$ÇŸ"gþuŒ«rYª»Y¬ü˜¸¶{W 2˜9µã8™•ü(c­ }͉š÷?j?bÒˆæE`¹þÛGëŽóÒü¹fGâŒÈÆXüg‰ž©¤—,–¯Ðé›ï°ëÛ¯™¹á,I&0§^fÛ÷»1xPÕVAùMqìÛ¡KO’l’I¿±‹e?Üãõ6µqRa1ýÂöO‹é[8~…í?ÛWaÿ~Kí/§'b¶§|g´’™äs;Ù}ÃHVzf,·¿ÅñÉÒñµP?Ké[*¿¥ñÇ¢Âîÿ-­úâo Ë'*_Ax9I²,+>Ǥ¿•ßx•UÃ?çt“Ö8ÜË…» dº4¤çȾ4)™ç­Oi_9~'cú}Ë%T¨Õy‚¢buLMKõWÐ>¦{ZÁâ­§ˆË²¢ÄkoÓ{ðÃ÷ æü ›¾L꥟Y0ÿü™„IcO¹ºïÑ«ï{øØ©_™Œ;™?k9û®¥£±+CÝ éߪúœéËüÓ·Ô?,õÏüÓ7[<~…ï?Û×bÿÎÿüÈ·ýMñü¾p ó~Kű¤3®ÕÞáÛÍ„®çõþÖÔ…t íŸÿø¤àøZ¨_¾é[, TùŽ?–ûOþãWAÉ$ cÄB=ÃgöÅGÁÍ» /ŸW °AA^/ÁRAAA°L¶‚ ‚ B‘ [AA¡H­ ‚ ‚P$ˆÀVAA(D`+‚ ‚  "°AAŠØ ‚ ‚ E‚lAA„"A¶‚ ‚ B‘ ù§ ðb¹¶z8ŸžêLÔäØýÏÜHì¯+˜»êW®ÝO$EÖcçäI@!t©ã„ZNdߨ>„{ôWmŒ'jDulÙp™m‹£X¿÷÷MZ\|é:°+ KjÁÒþ†ã„öžÌ‘Jƒˆœ€³ 2ÎÍeð+BÂúRÙä´KlYÅ¿^&ѤťZ ºÜ…úny~Œ=ý ßÇNM+¦Fô¢’•Âêçä03÷Ö¸xùÓ¾_wš•Õ!ŽÚw:Ò¨ŒªirW6ŒçóM. Ncç‹í£< }Ioê¿Ý™ÞöÂN…âö{X~ }©~4€N~%žpòȤ x ÃföÆÛFü½efâ¶#4qS‚<ŠÜ€”~&’_ýB|F&Yåûðí´–”PÿÓ¥z^þÙñUN8ÀŒ‘+q=ƒn•¬ÿ·™ ‚ð¯%fl_ ùþoD΋¡Ò0¦÷ðÁ«ë4¦wµgOÄBb’ehüå:Ö¯_ÎèêŠ5™ÄÊõëY‘´ÉIŽœÈ¢óžôž½Œ•‹¦ÐÁùwÂ'­äB–÷Ïa:³Ž-W2ŸPÀ~Ÿ;‰¥xÑoö2V.™F'ç„}µ–Ëy>žv~G¨HÙô츜Q°FPéð»‚õë׳vù4ººcÞäeœ3<þA3 ‡òõfÚ|>˜F.jÅõS’ÿºï3¥g î®ÏØÕ—Éeéç)ÿºÕ ù"ÐÄÖ9áì‰3ÿ=¯Œ?øqñ ªö耗j2rçÜžÐ;‹Ï@"W® ¼Wy´–?.€T¼Ý;8²+j 7³þéÒ‚ðoQÔ&Hòg¼ÅöÐ/X§ïÁ”¡qQƒ)á8?Ì_ÆÎ‹IMP¼z>îÿ.•meâwM`ÈZO&…uÇ3w–Òp’ðA³ÈÁð7lÉ/|1âH”ñt·Aº Æ±NOFÛÞÃIÁƒœxŒ‡Ìø}Ú?w[$*Ðo4Ò¾xì‘!ßÜsX9RÕ5èu1´©‡.oú÷±é0ÔÓ?w=`‹ßq8_–qËír g·ß¡tHÿ†¨íèîU€À2•ÞƒúíÛ°aÏ8tˈw©‡Û2¯obFøq|O%ÈS§¤f"iíððý€a/2(b§Ú„àk[°\$•ý(·r—ïgñ¦KÞ©ë,nn‰b·s¦ùÚ?(¿)þß…/ã—›™H˜Ñ”jH÷¡ÝðsÉž¶3Ý;ÌêÈe츘 ’„]Õô؞׋«Iý}C6”Æ×æ$‡o•¦]»ÛºKšŒŸÜ‘ŠÖùõ_%u“ɸ±‹E«ùí¦ÙlMéF]Þ§ %µÙÛÓ¯laî¬5K±Á±´/ïÔ¹ÌòÝõ™9ý=Jæ{þH`¼Êªáø³åûù«wn‹>ý„–e¬ÀËÖ‰!,:“ŠL0]T#©]höÅtúTU6—_þrò1懄q¯}(£›•@-§séûϘ|¢1“&µ£œUþõ·Øþª«¬6†ÓÍ> ä©Ã\¿Ï}•G~Ì›îÊÂØÂ?0'dÃü¥DŸ¾Cj†„£Ï[tíß ?×ìü Û¿ ä<¾‚×€>´ŠžÀâ}àB‘™ ᙽ:3¶æx~Ÿ?™5Ò‡Lœ=èbºË®Y¡D[µeÒ· X4oÖ3mñIReŽuÛR;}?ŸÏ^”I>õ3G¬ÑÚÇÒ  êu ({‰y_FðÓ‰xÒ’’ÈT§ruOœ­,_¸Œw/pËì†O釞dS€æ¾”´V”Iz|Þo†mÌvþõè´FfÜEn›]ñvx“tîTó)mNÏ“O²õ8TkìM5/Œ‡·s.õÑG÷!gebB‹Nû°üæ¤OYCz›ÏPÏévJ »Ê~”Îü“Ó±Ï0Å“•À¹Ñ\Õ¿†o©GSÜ>ÿd¦U¯¦y5gpqÍ~sHXTQQß\'™ÃGb1˜bÙ6s{œº1kÉR–, ¥½v+3¿ÙO¼$•DêÕÛÔ:‰>%cøno9>ž4Œw÷±ÿ/£…þ« >æ{ü¹€˜2‰\¾‚eáݱÿ5ŠE1ÉÈ9åÛ¹‚K¯ʼEó˜9¸*g¾H†Ê*;€°˜¿ ”̉½™4õ¡ß„3Ôó +¿;A*€Ú–#îe…{Ç™¬XµŠU+µ–ò—ìjÒ#¸9ñ+¾!ú–‘´sß¶Ã…n#ÚPÎÊrý-¶?*4Rç“i=z ¡³g3²ÆY»{O˜Ð/hù-ïÇ®™¡lÓw`Ê‚¬\1‹.ö{˜=s·M¾Ä?0¾ -û}pkÕwM~öqI„¢ãÕlåTάšÂ‚;Íù|D ¹“)rÒiþï¢mëᦕ¬Üño[ùèn®f€dûm¬8¼éÉ2 'rìç38¶ ‚’k¯Öƒ÷ÆÏb„¿±×îrmýhºöúŒù»n¡` 6g¦’)[¡·*Äa’e¬Ê¿CPåÛlúñ ©y.¸²1 #VØhU`8ά~]èܹ3{N`gœ I8º•SRušxê±­âOå̶IáY.!¦äËìüî?ÜòhJƒ’9SÂr:G|ÃλÄ^ºNŠ’€ $k;tRÉ™ 32§óûä®Ô±/a'+ÐküÞ(–ç²+'sô»UÜjÔ‡wÊä xUXé5$žÚÅžcWˆÏÔáÙz(ƒZ¸£̉§ØsÙ‘¦ï¾Ž£Д në:hÏíáœk½¦„7åítw´Ã©b9ì­íp±Éä¾Ál±ÿZ¤r¡éø…„õ«‰jG꺛¹{+3€á*GnØQÇ¿¶hÝêÓ¦ÁÃY1EùËʽ€§’-e½]ÈŠ»CªIYóçÇrþºJA·‡Cg3#ì U&ÀU­¬þÚ?›Æ (c H6”¯ûVWq]AûöøÉ‰'ØqÁ€ÖµpÑê cþ¸@\Õ…ï_ÊÄ?4¾ aãÕÞ§X²î<Û Â+ïß¿Áx•µŸ}Î׳g¬«ôfÆ„æä^›,nŒç—v)ëºípÈ3Sj6Ä“j¼ÃƱ}Øž;ÊFÒñ&Ñ(ƒÎŠrÍ[áöéFÞ«CS±åÏ2¼;È]qÃIÖn¼ñnÊX]!5³'}w2'âKV• §§…oa©töXK×HÉ0Ca²i\hða#VMYÍ/5K=˜ QéÐIWIÎ0ƒƒýC#èvg“Ç Ý ˜ïq$ú,ªj!TÖƒ„=DEŸ"©v}”L©ä†êbx¼Þ’ÏßÇC äLšêßÌ—ïÅ2{Ì|·WalË’/¬cš ¤É68Ú(¼YPé𻀑U®°hød.ú¶¢Iy›<³I2†óëXrÚ‡ž3«òèÒZ-:Že˜íD/ŸÈâë™¸Õ ¤SŸÎ4,e…9-žTlq±}xlUzgô¦k$åÜùHZIBRI¨­5HÈH’ŒŒ¬ ÿJÎ#÷Žÿ—er-UF­’I¾aÄ®AN[e$‘*ë°×å&®Æ®”=ê¹mi!5€„•­õÃ'* dó3Ý=NQýÑâÐ7ÖM`—CgÂ^wÈs7Ÿý-µ6z'ýƒ4%ëbXc1(x  ¬üOgJ»GЬÇYÿ°ÿHÚb8ä–Y…ì_Jý“ãkv%ìñíÚ‰-! ÙüÖו«™áUöïlµ¼7.‚@Sî@¬Ç^]€í€Ú#ˆ¯¿(ÃOc ßV‘/r'•¾vÖ¥h8eÊ ÍÆ]D_OA®ä”ïã6­«e5;8q5VnvÙŸ5Þ`ëÂhlÚu§‰›âð½÷û´.5‚ Ñ –*ä¤ïMYívN^Iã7;l‹;¢ËÔ£É)”éîïD_0“ÁTz´ÏÛ(ÑO¨‡¿£‚È6'0Uó)«r%ÞÍ|q÷ÔÜë$ÁKf³ÉçKÞ!'™¤ó¸iS…\ –¾dãE‡Þ¾|2g>»ê'0÷ÎÉxÍ ÷áÚq:µìÿÞ’u)ü‚ᦔkì_1•È0wªNi޳Þ[)•¸T¸d÷)sJ©šâW°ÔDIÿÍïü0ÇÿBøìm8YÜÐÊwÙ2”­¹e·*†ŽLR2sƒɱÉäN¶ZÌ¿€O³ JQýå4άŽâhÅ÷ LØHäÏu™ðžGöŒ¹…ú+c&=Á€Ôdß8¥kíÐ+85•?j½SvÿI3‘ûðMNãf¸”vÁºýKq9þ‘ñõ±tJøÓ«õÆ-ÜÿøÀG&6Axµ¼KÔèì‹ãè舣£#Åí¬+´¥í *憓³/½†5%nÅ 6ü™ýœO²÷á­ª‰ìø)†{&@6pmG$3¿?ýp›TœZï×&%z%+£S©Ýº†Â×ÚHhå+ìX¾€­—ÓrmÊd\?ÀÞ[öT)cy ™T¬&m›ãØ’åür# SF,WÌ`Ùq.v¹5î¼ùa-Œç/•›~ ÚØqlé öß4`2&qýÌ¥œíYÄîßλ&¬XÏúõÙëã«9KtL<ÏwÕ€†’CT;–U³Öq)ý9?S4§sçä™»à î­Ûá]ào¿IØ×êÆG•þ`ù¢ì5Š`âÎîEl¦5½ýŸðÅS{æL`þÁxL€ºX)<Ë9 QeRr¨F3Ïvo:J¼ 0ÞáÀÆÃÈ5ߤ²^A‰”ôß|Î9=³=å+8£•Ì$ŸÛÉîF²Ò³0’MjºÝçð«dȺsMûï>l•åo©*¬ttý6d“äã£ó…¦Ûü<®7}¿ÞOBž –óÏ~ÓFØožôÚ™^ÁíQm˜Éš dõWÆÄµÝ{ùÓ ƒœÄé]'ɪP7{i‚¥ª+m¿§Õß¡:Í<ص1§ÿ˜â‰Y2†ÈÃ$™ ß¿,åŸëŸ_§Å£U_üï­aùáÄçòD@„—Ó¿Æö¹‘°õéˆ÷Æ0vÆJ|B{òš­3‡sgÞFõš‡ŒŒ®L}: ¨„>ÏàjS¥5ê¬çfVÖ==‹Çó«Þ›15õcV'È0£¿c9ü:J'Oë'¼Gu]öäyª¤çµžªÇÊn„eªqô dЄ—,ïÿXyìßhOó‡ø)w&M²Á§ÛxÉòà®ÌÎÒàP¶& Àß!–Í;ÿ¢dËTÍ“äP‹vMí·íqM[>ß™•õûçäȯ˜µ²&Ó{y£¸~O‘g)„ƱõÛeè»e³_½T öÔ%ðïÓŽÍÁ‹YS“!•ϲ|Mþ£ZQúIRjgj5¯Á¨úF©ÐH2W_z lDö¤”+oŽÁÝÈ¥÷þPã\£Ÿõ«ƒ½iÛKYÿ}µ[:5û•y_ aIg\«½C—½];•ð’Ö´4-qzÖ8úl·§D¹º´ ¨ÀßÉ~!G!óϦǻ]kÊÌœFÏö2jk'¼‚¾à‹¶e¾K6aHHä~fÆ£‹…üMw÷ùíyj¥¶ƒ É¡Ÿt;ƨY‹ñ™>ZêßÏVIùµ”÷5óÓÄO¸{Cq?zjˆ“ ²þÚȸϾçŠÌ™™d±!]—£Ò”¦Í¤)|X^aû=­þjWÞ ÉýyKÙk.F8xµ 88wƲýËRþø_¯O(® A½ª1báÎVï‹òN(B"ɲ¬øæöàÁƒÔ­[÷E–çßÉÏž‰Ál©7¯Þv}†Õ®fâ¶M`NÖ`&¶z–ýáßÀÄíM£Þ߆¹_5¡ø«7¯³vx':E1¹¡ÝsEÝ+£Ðã« ÂC¯ÐŒí³2ø{VߪIŸF%žqÐUáP»=ÍŽ/ÃÚe —ذt3מöf}}UÚõhÉ3,|9ò%˜¸ýó$Æï­Î§? 78°7§Z(à+€á)žÇø*‚ðló“qÅ£&Z‰¶#FñF!~3RëTÏçX´œM%Ú~üÉ«›ÿ+A›GšŸËÄ>‘Tktâ“6eįh …÷ÇWA„\b)‚ ‚ ‚P$™'ã‚ ‚ «M¶‚ ‚ B‘ [AA¡H­ ‚ ‚P$ˆÀVAA(D`+‚ ‚  "°AAŠñ …f&nû8B0%È£€ j$ö×Ì]õ+×î'’"ë±sò$ ÇºÔqB-'²olÂÎ=úªa›ã‰Q@6\fÛâ(Öï½Ä}“Ÿ@ºìJÃ’Z°´¿á8¡½'s¤Ò "'ଂŒss<ÇŠ°¾T¶9í[Fñï—I4iq©Ö‚îw¡¾[žWô§ŸáÛãØ©iÅÔˆ^T²RXýœü>øõ0k\¼üi߯;ÍÊê Ç í;iÔFÕ´9ƒ+Æóù&„§±sŠÅöQž¿„¾¤7õßîÌGo{a§Bqû=,¿„¾T ?@'¿Oè 2)G#^`ð™½ñ¶/¤·¬0ç׿_ú™HF|õ ñ™d•ï÷ÓZRBüüVÏ~üå„̹·Ñ3èVÉú…•P„1c[hFÃÓ~Ù5?òý߈œC¥!aLïáƒW×iLïjÏžˆ…Ä$Ë 9ÐøËu¬_¿œÑÕ5k2‰•ë׳"7h““89‘Eç=é={+M¡ƒóï„OZÉ… ,ïŸÃtf[®<¡r¿ÏÄÒ?¼è7{+—L£“ó¾ZËå<O;¿#T¤lúv\Î(X#¨tø]ÁúõëY»|]Ý1oò2Îÿ ™„à ùú3m>L#µâú)ÉÝ÷‹™Ò³w׎gìêËd€²ôó”Ýê…|hbëœpöÄ™ÿžWÆü¸øU{tÀKµ =ûùõ2Ðù $rå Â{•¿æöDÏ~ü¥âuèÞÁ‘]Q[¸™õÜ &¿TQ›ùsÒI6Ì_Jôé;¤fH8ú¼E×þðs;Œ˜ŽóÃüe켘„ÑÅ«·áãþïRÙVd’LfàÚŒížÎ÷‘?qú^&TêÏ·Sq–cÙ:1„EgR‘ ¦ëj$µ ;˜NŸª–ğ8eg<Ým®¨q¬Ó“Ѷ÷pR0Á 'cã!3~ŸvÆÏ݉ ô´/{d@AðdåHU×¢×ÅÐ:¤º¼éß?ƦÃPLGüÜõ€-þ}Çá|YÆ-·çÈ)œÝv|‡Ò!ý¢¶_ »WË.iZ0~rG*Z[êß–ÈdÜØÅ¢ˆÕüvÓ€l¶¦t£® ïÓ„’ÚìíéW¶0wÖŽ¥ØàXÚ—wê\fùîúÌœþ%Õò7^eÕð üÙò}ŠÇüÎÕ;·ˆÅ‡NŸ~BË2V`*Üùùç/'c~H÷Ú‡2ºY Ôr:—¾ÿŒÉ'3iR;ÊYå_‹í¯ºÊªac8ÝìJž:ÌõûñÜWùÐqäǼé®,Œ-ÜñS0þ².ÿ;¾‚×€>´ŠžÀâ}à‚˜ „¢¯hÏØšâØ53”múLY°‚•+fÑÅ~³gnã¶ 0Ýe׬P¢­Ú2éÛ,š?‰· ë™¶ø$©2€„ε<Ånþ—ˆ•÷h:vkÖ¯gÍ×oá¬Ôn´œÐMm8 IDATÁp/+Ü;ÎdŪU¬Z®ø¢«.Q—€²—˜÷e?ˆ'-)‰LUq*W÷ÄÙÊò…Ëx÷·Ìnø”~èI6hîKIk…A™¤ÇçýfØÆ¬aç_NkdÆ]ä¶Ùo÷‡õ‘tîTó)mNÏ‘“O²õ8TkìM5/Œ‡·s.Uñ¯4ÿœ•‰ -:íÃò›“bXc@=§Øi%ì*ûQ:óONÇ>ÃOVçvDsUÿ¾¥ \LqûXü“™V½šæyÔœÁÅ5 øÍ} aQQDE}Cpd‰Å`ŠeÛÌYìqêÆ¬%KY²(”öÚ­Ìüf?ñfT©WoSsè$ú”Œá»½åøxÒ0jÜÝÇþ¿Œ ú·æ{ü¹€˜2‰\¾‚eáݱÿ5ŠE1ÉÈ9åÛ¹‚K¯ʼEó˜9¸*g¾H†Ê*;€°˜¿ ”̉½™4õ¡ß„3Ôó +¿;A*úü²”¿dW“Á͉_ñ Ñ·Œ¤ûž°.tцrV–ëo±ýQ¡‘28ÿ›LëÑS=›‘5βøÛ}Ü{„~AËoyKã_!ûWaóÁã+Ú2¼Û§·V}ÇÑäg—AxyéÀVN<ÁŽ ´®…‹иPo`óÇâª9é4ÿwÑ€¶õpÓJHVîø·­ƒ|t7Wsž¨«lì±6eQöÃø{Ø ’ôœæ µ¼7~#ü툽v—këGÓµ×gÌßuƒ c°93•LÙ ½U!£,cUþ‚*ßfÓgHÍsÁ•i±ÂF«ÃqfõëBçÎéÜs;ãL€LÂÑ­œ’ªÓÄSm*gưíL Ïr 1%_fçwÿá–GS”Ì™–Ó9ºàvÞÍ öÒuR”… YÛ¡“2HÎT˜‘9ß'w%((ˆ Ž} ;Y^ãðF±<}DNæèw«¸Õ¨ï”Éðª°ÒkH<µ‹=Ç®Ÿ©Ã³õPµpG ˜O±ç²#Mß}G5 )AÝÖuОÛÃ9K54%¼)o§£¸£NËaom‡‹M&÷ fEý;_*šŽ_HX¿šØI vô¡®»™»·’1®rä†uü+a+Ö­>m<œS”¿¬¡Ü[xÚH ÙRÖÛ…¬¸;¤š”5~,ç/¡«Dp{ø1t63ÂRuà`\ÕÊêo¡ý³©ñhÜ€2Ö€dCùº¯auå×´aŸ¥ñ¯°ý«°ùà _°ñê@ïS,Ywƒˆm¡Èû÷/E0^eígŸóÃõìë*½™1¡ùƒ1¿í¦´{¤Èzœõ@IÚb8äÄ&C<©Æ;lÛ‡í¹±¡l$o2è$THZ7ª•µyî¿$k7Þx·e¬®šÙ“>Ž;™ñ%«Ê„ÓÓ·°T:{¬¥k¤d˜¡0Ù4.4ø°«¦¬æ—š¥ÔS¥s@']%9à >ô ÛLw€t3`¾Ç‘賨ª…PY^4ö4}ФÚõqPÒ`¹!€º¯·$äó÷ñÐ9“¦ú7óå{±Ì3ŸðíUÛ²ä ë¸fCi² Ž6 oT:üÆ.`d•+,>™‹¾­hR>o_‘1œ_Ç’Ó>ôœY•G—Öj©Ðq,Ãl$zùD_ÏÄ­f út¦a)+Ìiñ¤b‹‹íÃc«Ò;£7]#)çÎGÒèÐJ’JBm­ABF’dddÌJúw¾ç—‘{Çÿ˲ ¹–*£VÉ$ß0b× §­2’H•uØërWcWÊõ‰Ü¶´¿@ÂÊÖúᕲù™nŒ§¨þhqèÀë&°Ë¡3a¯;ä¹ÛÏ¿þ–Ú?› ½“þAš’u1¬Œ±<PVþ§³4þe²Yb)ÿì¼Øñ5;{|»vbKÈB6¿õ5AeÅjfA(Êþý­Öƒ÷ÆEhÊhõØ«•mWë°•R‰K3‘;9-§Çq3\J»`­/u)N™E‡2ù vj´Ï}q–™„“?³5öu>xË=û_*[Ê4ø€6w}=¹’S¾ƒ½ÖÕ‹²šœ¸šF+7»ìÏo°ua46íºÓÄMéá•Ð{¿OëR#Ø j©BNúÞ”Õnçä•4Þq³Ã¶¸#ºL=šœB™îþNô3L¥Gû<É©£9žPG—ªœÀpTͧ¬Ê•tx7óÅÝSKp¯“/™Í&Ÿ/yÿ…\œd’Îà¦M>r-Xú’zûòÉœùìª7žÀÜ;/ãu6/܇kÇéÔ²ÿ{{HÖ¥ð „_˜R®±ÅT"ÃÜ©:¥9Îzçìþ›j—ìþkN‰#USœâ –š¨”ôï|Îsü/„ÏÞFñÓ˜ÕÈ ­|—­!CÙš[v«bèÈ$%37È1‘›Lîd«Åü<Í. Eõ—Ó8³:Š£ß'0a#‘?×eÂ{Ù3æꯌ™ôfP“}ã”®µC¯àÔTTþ|Xÿ ׿ ›ÿøüEŒ¯•¥„?½ZoaÜÂÝø8c,BÑó,EP£³/Ž££#ŽŽŽ·³~¬ÐOß.9T§™g»6%Þ˜â‰Y2†ÈÃ$™A²÷á­ª‰ìø)†{&@6pmG$3¿?­l €¤ÂJI×ocA6HN1*˜ÏÐÊWر|[/§å<ڔɸ~€½·ì©RÆÖâ †T¬&m›ãØ’åür# SF,WÌ`Ùq.v¹5î¼ùa-Œç/•›~ ÚØqlé öß4`2&qýÌ¥œíYÄîßλ&¬XÏúõÙëã«9KtL<ÏwÕ€†’CT;–U³Öq)ý9?S4§sçä™»à î­Ûá]ào¿IØ×êÆG•þ`ù¢ì5Š`âÎîEl¦5½ýŸðÅS{æL`þÁxL€ºX)<Ë9 QeRr¨F3ÏvoÊé¿Æ;Øx¹æ›TÖ+(‘¢þýôóGNO ÅlOù Îh%3Éçv²û†‘¬ô,Ì€dS†šn÷9|à*²îdÓþ»ÛÿÙùeºÍÏãzÓ÷ëý$äÙ`9ÿì7m„ýæIÿ¡éÜÕ†™¬¹`@VPeL\Û½—? 2ÈIœÞu’¬ u³—&XªºÒö{Zý-…ì_…Í_‘g_§Å£U_üï­aùáÄçòD@„§ÿŒma¨]y3x$÷ç-ed¯¹MààÕ‚ààÜ;vg æÎ¼%Œê5]™útP ½â =ÞíZSfæ4z¶—Q[;áô_´-káõ=¶Õ{3¦óB¢¦~ÌêDæaôw,‡_çOéäiý„÷¨Ž£Ëž<ïQ•ô¼Ös"CµóXÒ°L5Ž^ šÐ×ô’åý+ýíi^â?åΤI6øtÏ`"YÜ•ÙYÊÖ¤ñ€ø;IJyç_”l9‚ªy’jÑ®©=ã¶"®iËç;3¢r¢~ÿáœù³VÖdz/b×ï)ò,…Ð8V¢~»± }7çØ¨ýu üû´csðb–ÇÔdHå³,_‡ÿ¨V”~RgP;S«y D…Ð7J…F’ѸúÒc`£ì/ÏàÊ›#Fp7r)Á½¿Ô8×hÇgýê`/AšÅö*\ÿV»5¡S³_™÷Åö—tƵÚ;tùЋеS /9‘aMKÓr@§g£Ïv{J”«KË€ øìr2ÿl Î/Ù„!!‘û™,ò7ÝÝCä·ç©=<”Ú*$‡|Òí£f-Ægú@jY¨?[%å×RÞ×ÌO?áBì= Åýè=ª!N*Èúk#ã>ûž+F0gf’ÅB†t]ŽJSš6“¦ðay…í÷´ú[ÿ Ù¿ ¿Ï:¾þ¤«BP¯jŒX¸†³Õû⣼ ‚ð‘dYV|ózðàAêÖ­û"ËóŠ2·ms²3±•«x%ð’2q{Ó(‚÷·aîWM(þªÇ Æë¬‰NQLnh÷âÖ ‚ íÛ—† ‡Ú=èiv|Ö†(c¸Ä†¥›¹ö´7«ë«Ò®GKžaéàË‘ÿ+ÁÄíŸ'1~ou>ø¸Á½±8Õª@_,‚ Ï…lÿ%´Nñü§ ñ<ÙT¢íÇŸ¼ºù¿Ô¸ùw¤ùñ¹Lì³I¥Á±F'>iSFüŠ– ‚ðKAA„"¡È<ùAA^m"°AAŠØ ‚ ‚ E‚lAA„"A¶‚ ‚ B‘ [AA¡H­ ‚ ‚P$¼?Ð`&nû8B0%Èã¨ðóÌßÄí£ñkkæ~€ãÿä× S~#±¿®`îª_¹v?‘Y“'=†Ð¥Žj9‘}cûvîÑW)Û4OÔˆêØ²á2ÛG±~ï%î›´¸øÒu`W–Ô‚¥ý Ç í=™#•9!gdœ›Ëà9V„„õ¥²5Èi—ز0Š~½L¢I‹Kµtÿ¸ õÝòüÄ@ú¾8ŽšVLèE%+…ÕÏÉÿàƒ_?³ÆÅËŸöýºÓ¬¬ÉpœÐ¾Ó‘F-`TM3¸²a<Ÿora@èp;§XlåùKèKzSÿíÎ|ô¶v*·ßÃòKèKÕ ð£tò+ñ„¾ “r4‚à6 ›Ùo qþ½hÿtûÖ³—_N8ÀŒ‘+q=ƒn•¬_X Ax¹¼3¶FÃÓ~Yµèç_XÏ^~ùþoD΋¡Ò0¦÷ðÁ«ë4¦wµgOÄBb’ehüå:Ö¯_ÎèêŠ5™ÄÊõëY‘´ÉIŽœÈ¢óžôž½Œ•‹¦ÐÁùwÂ'­äB–÷Ïa:³Ž-WžP9ßçNbé^ô›½Œ•K¦ÑÉùa_­årž§ßÆ*R6ý;.g¬T:üÆ®`ýúõ¬]>®îǘ7yç ÐLÂá…|ýƒ™6Ÿ¦‘‹Zqý”ä¿îûÅLéYƒ»kÇ3võe2@YúyÊ¿nõB¾4±uN8{âÌÏ+ã~\|‚ª=:àe“õýÓýÿŸÎÿE{Ùë÷ì嗊ס{GvEmáfÖs/˜ /©—ï¿ L±l¢3©ÈÓõG5’Ú…f_L§OUk@&ùÀd®­ÁØîé|ù§ïeB¥þ|;%gÓuÖáD§(&7´CÂLÜ¶Ñ ÙêÏœéïâ¦Sü!¾ _Æ/73‘0£)ÕîC»áç¢V?˜ŽóÃüe켘„ÑÅ«·áãþïRÙVd n&bÖZN¤ù¤7õÊÉ;¿fN:ɆùK‰>}‡Ô GŸ·èÚ¿~®ZEéç[Ùrùóc6Ä‘(;ãénƒt @cžŒ¶½‡“‚ 9ñ™ñû´3~î¶HT  ßh¤}ñØ# ¦Ì¬©êš@ôºZ‡ÔC—7ýûÇØtê鈟»°Å¿ï8œ/˸åžr g·ß¡tHÿ†¨íèîU€À2•ÞƒúíÛ°aÏ8tˈw©‡Û2¯obFøq|O%ÈS§¤f"iíððý€a/2(b§Ú„àk[°\$•ý(·r—ïgñ¦KÞ©ë,nn‰b·s¦ùÚg—ÿ8ÿò“úû†l(¯ÍIß*M»v%8¶u—4-?¹#­e2nìbQÄj~»i@6[SºQW†÷iBÉœ/º~ù¶¿‚iüÇŸ;¾€×€>´ŠžÀâ}à‚Zᱡè*Ú­Ú–#°ÛŸÕ¯‡2ëoº$t®å)vó¿D¬¬Íc1ÎÃdIL–2Èàâšüæ>Œ°ñ>è1ðǦl=K­îh-åoºË®Y¡D;`Ê·p•o±cúgL[\ްÁ5°5ß"ú›ï¸Rgó»z¡K9Îâ=r÷c×ÌP¶¹fÊ?\¤8~›û)³g:3gÊ;”ÄBú’…úc©ý,4‰º”ýy_FàOšG™ªJT®^\ÑþÆ»¸ev£~釞dS€æ”BÒãó¾÷¾]ÃοjóNžM™q¹mv¥‘û˨¤s§šÏÃÏÈÉ'Ùzª…xS-à cÄvÎ¥Vã…ÒËÊÄ„öáþæ¤Ï[Cz›/PÏé>F‘°«ìGé̵œŽÍ·¢Öò.ye%pnG4Wõ¯TêÑ}MqûXü“™VšR"7º(ê矒J"õêmjFNâõ°þ„ïíÇÜI¾,Åþ¿> b¹D~‰\@L™O‰üúuôñû˜úÉ<ÕªÅ?;¤]?‹ç¿–Æõ‹_ЖáÝ> Ø5ë;ŽÖþ„ÚvÿŠõ!‚ üƒ^¥ùSÙØcmÊ¢ì‡=ð÷°A$E£:€ +½†ÄS»Øsì ñ™:<[eP w”„ rÒiþï¢mëᦕ¬Üño[ùèn®f€œò‡o9ÑÀß½*;šÕ8+!'ž`ÇZ×ÂE h\¨70ŒùãqU[N¿ðõ·@ëÁ{ãg1ÂߎØkw¹¶~4]{}Æü]7ÈP0íeÎL%S¶BoUˆn*ËX•‡ Ê·ÙôãRóŽ;™ñ%«Ê„ÓÓ·°T:{¬¥k¤d˜¡05.4ø°«¦¬æ—š¥ÔS¥s@']%9à >ô ÛLw€t3`¾Ç‘賨ª…PY^4ö4}ФÚõqPÒ`¹!€º¯·$äó÷ñÐ9ëõo æË÷b™=f>áÛ«0¶eÉvbš ¤É68Ú(¼YPé𻀑U®°hød.ú¶¢Iù¼}EÆp~KNûÐsfUl Ú‰^âó°8þHZIBRI¨­5HÈH’ŒŒ ¹wü¿,Ûpk©2j•Lò #v þ7õ+ìùoiüÉþÇ‹_²ó°Ç·k'¶„,dó[_T¶€O"A(Rþý­Öƒ÷ÆEhʾ—4zìÕØ®ˆí“ö‘$$ ̦Üg¢2Æ´ÌGfë$ëRø Â/L)ר¿b*‘aîTÒ ±ƒJ_;ëR4œ2‹O˜é’Mvè0žØe‘z7…ܹ6µÞ [)•¸4¹“ïrz7ãÀ¥´ ÖÒ·XÿB1“pòg¶Æ¾Îo¹gÿKeK™Ðfã.¢¯§ WrÊ÷b§uõ¢¬f'®¦ÑÊÍ.û³Æl]M»î4qSÚ}%ôÞïÓºÔ6DƒZª“¾7eµÛ9y%wÜì°-îˆ.S&§P¦»¿}ÁLSéÑ>OrêhŽ'ÔÃ_É×âsÃQ5Ÿ²*WÒáÝÌwO-Á½N¼d6›|¾äýrq–I:€›6UøÈµ`éK6^tèíË's泫Þxs#7ãu6/܇kÇéÔ²ÖÐåå<ÿ€B?æø_Ÿ½â§1«‘Zù.[C†²õT¿‡žíü·4þèt‡1¾PùĆ EÎK°Aξ8ŽŽŽ8::RÜÎú±B[Ø.©°ÒAÒõÛdM’S~D­ÇÅâ/Ç‘ È×ùmÿM|×Çž9˜0 .V ÏrhTyFÕ|ò—ì}x«j";~Šáž \ÛÉÌïO“*ƒTÌ“Z®ñìß}‰T²âbØz$áÁÒCÉ¡:Í<صñ(ñ&ÀOÌ’1„D&Él9}Ež¹ý$´òv,_ÀÖËi9Á€LÆõì½eO•2¶gp¤b5iÛ´Ç–,ç—i˜2b9¸bËŽ›p±+à•KãΛÖÂxþ Y¹é× m€Ç–®`ÿM&c×Ï\ÊÙžEìþí\± `Šõ¬_Ÿý·nQ0¾š³DÇÄó|W h(8”AµcY5k—ÒŸó3Us:wNþ—¹ ÎàÞºÞþö›„}­n|Té–/ÚO¼ÀÄÝ‹ØLkzû?å}>ÿr ia|z:9=³=å+8£•Ì$ŸÛÉîF²Ò³²ûÖ ®Ÿb¦Ûü<®7}¿ÞOBžý,?Цô"tíTÂKNdXS—[?¥d†„Dîgf<0Z”(DÿxŒ¤«BP¯jŒX¸†³ÕûâS J ‚PTH²,+¾¹=xð uëÖ}‘åŠ$3qÛ&0'k0[¹ŠWò‚ ‚ðB¼3¶Â?O…Cíô4;¾ k_”1\bÃÒÍ\{Ú›åõUi×£%|IÀË“¿ ‚ ü ‰[AA¡H(2h‚ ‚ «M¶‚ ‚ B‘ [AA¡H­ ‚ ‚P$ˆÀVAA(D`+‚ ‚  "°AAŠñ …b$ö×Ì]õ+×î'’"ë±sò$ ÇºÔqBý·Ÿ,Í–÷'KeÃe¶-ŽbýÞKÜ7iqñ ¤ëÀ®4,©}ÂOž>¶¿á8¡½'s¤Ò "'ଂŒss<ÇŠ°¾T¶9í[Fñï—I4iq©Ö‚îw¡¾[ž7÷§ŸáÛãØ©iÅÔˆ^T²RXýœü>ø‘k\¼üi߯;ÍÊê Ç í;iÔFÕ´9ƒ+Æóù&„§±sŠÅöQž¿„¾¤7õßîÌGo{a§Bqû=,¿„¾T ?@'¿O89dRŽF¼À†a3{ãmó2üd§™¸íãMÀ” q ‚ Eš¸Î‚|ÿ7"çÅPéó0†\ %,ëc†9­æÓˆ…xGŒ¢Ž¿\GcÒ8<±Nã˜?Äë $q8r"‹®6bÄì±¼a{‡_—N%|’г{PÅÚÂþ9LgÖ±åJC>ªøXD*'ðûÜI,½Ñ”àÙãyÝî–N!ì+-n3ºûñ´óÛ8BEʦ`Çå.Tòz<‡|¨tøÍ\Íi7øméWÌ™ îáýñ~äƒf/äëÌ´™4˜F.j@Yý”ä?Ò'‹›'¢Y>ž±‰_3­sE¬%éç)¿œ•ÈÅŸg3qN8îßLäM—ÇhdüÁ‹OPµÇL¼^Š ÀÈswÈ,õO—CA^¼"Øš“N²aþR¢Oß!5CÂÑç-ºö«ɸ±‹E«ùí¦ÙlMéF]Þ§ %ü©ÙG¢ìŒ§» Ò55Žuz2ÚöN ¢39ñ™ñû´3~î¶HT  ßh¤}ñØ# ‚'+Gªº&½.†Ö!õÐåMÿþ16†úc:âç®lñï;çË2n¹G^Náì¶£à;”éßµýݽÌ–>JïAýömذç?ºeÄ;O0•y}3Âã3x*Až:%5+Ik‡‡ï x‘Aë8Õ&_Û‚å"i¨ì@¹•+¸|?‹7]òÞ(dqsK»;0Í×þAù_dÿR’~òÉ \[ƒÿgï¾Ã£¨ú6Žg7½„„Лˆ@P®(UT°4EQ¥« báEÅ.¶÷‘"U@‘*ETzMBHo[ÎûGŠBv#a½?×åuáÎΙ3¿™Ý½÷ì™Éˆû³ùxê×l=– —÷áqmˆ6GY0z(3¶e`D/íXöZOïEúú ""rIðí9¶®D–Mx™E!7ý}>|"÷”XÁ+qĸ±rêtÖWìËÔ÷ÞgÖäû)ñÃ[ÌXŸ†7gØ^ª!-*ýΛc§ðõæ$2SSɵER½v5¢<‡*GÂN»KWþdг‚«Ò¢m}ÊzʬâîhIèúOYzÈyÚ¢ÜÄß8⎥V¹“!Æ *ÇUqå Í?ò&m 6ÁU××âªæ5q¬[ÌŽ ¯ÿÊò_g..ü ò?ÙwêzfŽû”ìÛŸæ‘Æ%ÏãIg^½åsw³õ¨ÓóÓÿ̙̎% Ùr%õËžž~«? IDAT<]‰ß3ók7·ôº‘Röž×óËcûXÅV!ìàÿ˜òá1n1ƒO?ÿœO_hM´ °—¦Ýè) ¨@¹®xÿ£øèýÉ µ""â³|zÄÖ¤lfÉÎZ÷ +ë–=HmAY{IËqCD}^žÂ}ñK3r5ÙnÀ}ŒŸnÇvÕPª‡€EM®¯æà­…¿zm"¼ÉG§C{®nÇÐÿÜAò‚-rÍcŒ½í(¯<3É‹¯`D»2çíÄsg%“i‚‰ öòËBÁÝ+ö0cÀ~« 7T >%Ô²~ýŒw¶ÆñÀ„œ:µö|Ÿ_žÛ,–i®ª\ìÓ;DDD.5°õ¯Àm#§ÐÆ•÷ã­åB »wËí!% µ2HÌtQ0ëÂd'r0bÊÇp|%“_YDdß—˜x]iüM †ögWs“¼e> Ž^MÇÖåò²…R±iGnŸ³Œ…ûÓ1——,4løÇÖ¤’ß6ïÍä–Òù#¤Ž,x{!ÁwÝÏ ¥½=<!µî CÙ|µìVÕüökQÉ1[ödrképB#£Ê Á/¿S®„5,Üé&‡éy÷)ÍÙ²)¹1Í£¼ˆJ§\|uæ®Q«e}ÊUógP¯- zçæÆåŽJ^N2-C꯫9|÷Æ­}+¸&¬Ï¯NcYãgiSðÍɱŸyoOl×ñÔ+qz=Îïùå¹ý ݱãGÁEDD.—À[;A%"‰ŠŠ"**ŠÈðÀ?uúìË­ˆÚ´¬–̲9Hr®$Ö¿ó C§®#Õ &;™tw ªTÆßr“¶c)Ë8pf;ñüC¶…¿ÙÃ’÷¦³`Wfþó 9ûWóÝá\Q1ÔãšV—;o cã;ï±ò@&®œ£¬}ÿ¿ÌÚä"&¼ˆIů­ºÔÃñëN’í×áÎál|÷}VÌÂåHeÿ¶ßó—;9ºj1{Â[0êýÏùüó¼ÿ>›1ˆú~ÛY¸>É‹©ƒ”iÓŸ~×壉Ÿñ{öߟÇ{Fîlâ·ü×§o£\‡»¨Uä«ß,JÔ»{/ÿƒ÷f¬"É à"~ù æÑ›ÇüeL½ØÎ/׿|‡^XE²ñ¾}ïvËF@¤î?B–ãÊ"-ÝáÝ_‘KÌÅ?b{.ì±´4˜ão¾Ëà^¯ãpADÍ›4¨MÞT†Ò7Эå¼9üqV•‰&öª[¹§KM^žý"“ËŒæÉK2AÀ"´öƒ<ÓýmÞzñQ>IÉ"Çý$}¢*Ó¨û0ºU <Ã}TGrÏŠSî£j…på£éïÿ&½I¹v¢j¶¡ß¨û¹2Äò¼þŸúSâš»i[ê'¾v<LÜ}ÏòSyoP^qúQ©.×?òÍ#Ž2oé!Ê´HS²"êq×%¹è'olwrÊGq°•¤IŸlü<?¬Ëø^XïõþÅ)S!ü¢.§É]#èß¾þPÄúöR4ï}óÍä½õuy¼úvÞû4‘æCn¡ü™€‹ëü2.²’S8ž›szàôÔ¾WB¨uW*Nx‰î6ØKR³Óp†ß™_#bc¼¼Y»v- 6<Ÿý¹D¹I\4ŠW1ú–Øs™-+""""“oØ^06"®íÉî¨Kan‡w²~ç«wç±/÷,ËCjpWÏvT<_Ã~ÿôöEDDä’£[ñ >3À(""""ÿn ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">AÁVDDDD|‚‚­ˆˆˆˆø[ñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">AÁVDDDD|‚‚­ˆˆˆˆø[ñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">AÁVDDDD|‚‚­ˆˆˆˆø[ñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">AÁVDDDD|‚߅ߤ‹øož¢ïŒÝ”ë6‰‰Ëÿ8µãè²é^ÙP‹AIXQÚÊ`ÍÈûÿ·×¿ ÙVòÉûsXûë^â3ˆ®xWÝЉ{Û×&Êþçç«>…×çb–ËÁ¥Ó™ôñ÷ìJvBD ž›Ú¸Àº_"""çß…Ï”&ßÖìJruÝREè€!ó%Ìùñ([0U[ÞN³2³ûîæ¿×Ì¥Á¾åž=ŸC'ËâØ¾­¬x+«Ötçù‘wrYuÊ*ªO¡õ¹ˆ¹V0õÍeì2ù8œSè*""">ãÂOEÈÞÃê?\\‹kËaECæ‹ùìÿþÿûòKVuS‚)S…Ò¥KSºJBŠ\Û9®ž90zAh !®}/ïw­/óÀ±ó#ÞX|שë¨>…×ç"æˆßÆü yÃ&N|€+4Z+""ÿ|Ä6çÀOìÈ{ÆT ºÐ[?S‚ ïû_^ÿÛ­SûœÖ?¿\‰Y?Üä †Þ_Ÿ0 ®¯Ρ¾¯³Í»WläØ-e‰ÍÿÉ]õ)¼>5·wþ?#«U§|L .…n‹ˆˆ‡ l$lÚÌqà²ÆÕ µ\¤îXÌìÿûŽÍ;wq(-ت—×è:w¨Gl€îc,~ªÓv´“Ú1=èTá^^›peí†Ü£ë™ûÙ|Voÿƒ½GÓñ+Y˯¹‰nÝÛR3Â~ö>pœeO=Äë¿~õøÏ;ÏpM0€—mšã,{úOëûä‹Oðñ! D+ž}îZ¶¼÷>߬?D–®jA·;Ó°L'à6äYË—}ÍÊ;Ið¯ÀU;ЭÙ&Œüšàò¾oñBË’yë¸3سêÌþz%Û÷Ç“æ°U†Ëêµæ®Ní¨SÊ p¦$9 寮š_s°•¨Jhؤ"ÕE~pS} ¯Ï™åüWÚN–ñ?VlþƒÝûÉ ‰¥R•˹ºåÜyýe„Œj;‹P§¿¼F`Ï̾t™y±Îk)~6غ“ÙþÓ!  â"±á&ù§7öÒ2Žx’“ø]›ˆßµ‰7÷ä¥áí©àg#$:–°ýñ¤Ì@ §TL(vÀq`c‡¾Ë¶Ü“›r%`ëÒ ÿq#ýþ;”©ä/}H;cW‹Ôfa2¶òîð¥ìM/h8…þñÏ$3âµ~ÔÍOR®øo™0ä ~Î*Xq?›NeëúRgh4›ß?ùO}yà”Ç\d?ÈÖ¥³Øºöw†½ú$ ",üb¯£Çƒ•È2~”º*üdPter<3ÿßþÁø,P} ¯Ï9Ö•¸’ÉO½Êɧ4Ïž­ñìÙºŠUÛžæ…>õ‰øó” Ou É{„Š'-;ÿ9~¡”ˆ)É%2=XDDäœ]Ð&ãwVï"kS·”&óÞŸšjC¯¡ë±¼<îiz6‹ gë,¦.ÇeEÑlØþûÀeù-ÒhÈTÞÞ†XXþƬüPa£Â Ýé;à z¶®’÷læÏÌ|3æÌ}8#WÑÚ,”ë{U¹îönÜÓñF.+˜Vœú=_ÿ’Ž0ɬ13?´YThý0Ï<7‚Çn¯‰=!çŸë˜º¿ÎmaWs×#Ü¿·Õ Ï{,ms¶¤b{ÔU´¸ùn¹¥- Jûç·à&é§ÿãÇüQçÊø«>ÞÔçœja’Y=mê‰PX½-÷õ{’G»ßH¥üïñK_cÖ– þR:Ou²¢h6l*o kFpþ¢*÷gú”\êé ˆˆˆø† :b›½g ¿¹ ¸VC*BæúoX`§öÃýèØ( ¸¬b0û·Œdiªaç‚UmsåÎ2øç:¶Ž…¿æÅ«F†÷kEŒ h\ ç¯ýù`?dmþŽ=9×peÐ_ûð×QÄ6=^˜ËcÆrïey»±\<}^Û† Rp5 Ç~|#óÖçä=½Êý<õP[ÊØZ—™Ô±ß§ŸÖ¢+3“¨+¯äJgn~”®Kb®)µ›e›–‘†!517g˜_é&uÓ{<7i=9uèzçLwV} ¯Ï¹Ô¢VæÏÌÝ?¬ÓžgŸíÉAÍh|™á±±+H#çmãÁº 8=z®Ó?pï>‘‹Êü,ÌåÐÏÛÈÄÎU«Œƒ};öæ…\ü2m ½gæÿfj\d¦æ¯vx ³ï ÜYFG·s4ÿß_ITÁ´½,7x•kÒ\`S*àL}(Ž6=­I½òéÎ"¤lEJ°dÀípc€œÃ›ØŸ +Ýx-¥ Ò–J­¶ ÿ~ÙiüÊ´â±­ÀEÂ®í¬œ¿”]»~gÛO?Ÿeâ@>“Åž…Sxþí5°*Ñ~èZ—.Ø êSx}έ¹ürâ–båZµæ²iÙ"´ÖM4‰\Á¢dpìÿ•xGªž:…À‹:‰ˆˆüÛ]¸`ëJdËÆc@UUÃÂIVʉ “˜ÌTRθ^©9Îl]Ù©L) Ž >en…E`É T.YXŠ¡MO‰ÂpÚ¨ e³ýe»®Ìd ¦s†D…ž6?ÄVŠ08=™¬˜É«o/eOö)6—ҙȚ™cùï¢y]©Ë}Ï¢CµS敪>…Öç ŠR‹¬ì´Ï ‹ ;}´Ø/ŒØ0 ÈN!Û §=Á‹:‰ˆˆüÛ]°`ëNÙÁÚ@™k¹2ʸ .Ò‹á¶—_ã¾ËÎ6‘Ζl¡9@FRæY~^>[ά(m[@0þ@.ž†›ðÛs¦ýË(£cßW¼œ™÷mþZœa{¥®8¹½o¿gÁÕõîdÖ½š?Í %iËÚüŸ´ƒiÚw =oiL­ a¤íØù×ÐF»¾2´Uí̸zŸ!´©>PX}ÎÒ·"Ô" ÌU”Ë_|hÉvç´bHß¶àÄEe~kp¶ëöDDDäì.ÐÇgûÖìÄA 5V$o¦ Eø•7Q7`+r ;gMavpgêGçpdÛ·|øÑ$×<ÉÔgÊX6ëD{ ûȾª"± hYå=fíþ˜É˜É™ÜÕ¨4Y[¾æýõI8àºõ©x¦>œ™Ýë6‹§:öØ4¯øí}ÆèqéÜÖ0šÔM ˜ósΟžma÷/ÌbÃgŸ2ÿxuã×ðÕ'ûÿÒ¶IÛÈ'ÿÛbݲe3YóҬ9å9~Quiwsu©>…Ô§6‘&žE£3cgVçñ£iW„ZØêqëÕþ¼ºÑ‰s5ÚA×›â=¶¹Ÿ~—ÐÃhÚþ*Â4Ï@DD¤È.L°ufýÖt°âh\õä%IVdCz°>ƒßø™Ì¬_øü•_øüÔõJÝÈc}šiAÞŸf-O(ìž5{—ÞËkn§m¿®üðÔ'üî‚#?|ÂÔNi#òï]ŸpçÞ3öáŒìe¼kÓÂóRoø•£]Ÿ,>‡C@Ú/ßðá/ùË‚ƒ!+ë”'ÛˆªÛŠšö·ÙႬms™¹-oI`™Òø9ŠÈNÉÆ8¬ã·}ØphÕ\þïÏ۵ѤE˜êSX}ÚÖ&ÒfÈÍÈÄå23È5E¬…E“Gú²æ©Iü˜ 9;2kçÂÓ6U¦íô¬ªù³"""ÙŠà:¶…õ @¥F\~êG¶±­3ñ?÷pc*ĆZ€Ð˜Ëht×ã¼ôr_šÆœœ±\ë^k_‹’§ýLnXµ#£'¢S³8*ÅcA%+Qç¦Gxñ•¾4Œ´Ò‡3ñ®ÍâcRó^ÆŽéIËÚ•ˆò[XYjµz”Ÿißÿ½Lÿ§;+åÍ5 )SƒfÝFðÚ¨.TÏïVâ¢ÏØ”fÈN<\øò©>¿oE©…=æzžœø<}niHÍŠ% ¬ÐRT¹²w>ñ_^~èJh~­ˆˆÈßbc¼S[»v- 6<Ÿý‘?ÉÞ:‰>Ï~O7èF7 ×hÞ)T) KT.î¤e<Û÷u¶;’72ä…Ghí‡;}'ó>ü‘¼Ëš*pu¥àehS}DDDÄ ¶[T:·+Ïè¹!i9ãû,'82wr —F•»µ77•ûw.ÕGDDD¼¡© w»WÍáÿæ¯dë¾x’³Ýø‡ÅP¦rmZÜÑ‘›®.Cà¿y8RõlEDDDÄ'èúkñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">AÁVDDDD|‚‚­ˆˆˆˆø[ñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">AÁVDDDD|‚‚­ˆˆˆˆø[ñ ¶""""âlEDDDÄ'\bÁÖ¾á5úô}›íYæ”Ç]þ¿gµì8æŒëyZ~¶Í¥ðýð»éÔ©Óiÿõ˜¸…¬"õÛÁ¾O£sÿ/8è,ÒŠç+y³_èONèt÷ý<ñÂ'l8îòz}“µ‹…¯?ÅC]:Ñ©S79“Ž8е&mŸŽéǽùõïÒk,+’ܧ<ãâ­ï¿‹‹#sÒý©e÷æ…æØÏìǺ1ü‡´¢½.½åë¯ß¬M¼Ü½`¿îæ¾ÇFòƼ¤¹ÿüIJÿngèçøçJçíûÿÙ>_DäRâ÷Ow HrþàË™›©Ñs5ƒ-rwÿߪX¹dg®åËé(Ùá~Z”ñójy¡¬®ûדɺѽ˜Rr$Ó#°È÷£L›Á<߸±ö"¯|þ¸“X9éeæùßÏóï·¦¼sßLÅ„7ª0õ鯔°<¬oRY7u43ö^ÇÀWFpMh¼1® Ñ6<ׯÐö=¬¸’~âƒÉ³Xy0 7~e›qÿûh“¿ÑmRWþÇt{üssÀqÊùû̧u4‡Ì6;3ÝÆ¸Sͺ‰=ͽã~2éÆãâðu½¹µâŸ‡2ÜØJ5çážm¸õá®ÔáO#Fž–ŸC·R6³dg-:Ô#Æð‹¡qßILÙÆûŸüŒ•[· Z°V(•jÅàLŒ'Ãdíåçá4h~9¡ø—nÂíMc8Ñ´-†Ÿ}›I×%Ü{T ˹I8œÆ_¦Ùyâ:ÎÏ3ÇòÎѦRs ¾ÿçÊsý¼àØËì§ÿÃûó.ˆ ¼âAþ;ªmæ*Ú)râ*M+0ŒÇQ² ®¤±lXþ¥¹ªRð_~þô®~goßãú¡þTí:‚'C¿dá{£™¹?—ÒuÛЭwwš• À•D†#ž9#z³¸`ÆA6µHqÜÙ)dDĉúÚ*TÄ+Rí„ņŸ8{ìA‘9òë@å¶·PzØÖkÀüÄ7»+Ò¾_¹byãò•×ï©ÜYÉdš`¢‚½< …Žÿ¹ÖÏóùiÚ?ïxzÿ÷ôù""—š‹?Ø:ö3ïíï‰í:žz¯fº°ì!% µ2HÌtQpƒ “ÈÁDˆ)CÐ9v× #ˆ\Òs bž‹´£i fº“V2ù•EDö}‰‰×•Æß$°`ha&{ÿ7šùa÷ðü¸6T ô¾Óþ±5©ä·„Í{3¹¥txÞã Þ^Hð]÷Ó<$:¯>.ˆÉ«;=‘ ¿H"‹°¿ËSý¼â_ÛFN¡+¯ Ë/„E’t“œ…›ìälÿpBN{åÙñ?C›v¯êwöö½Yß ,K£NýhÔ \éûXõþ‹LTŽãÚRŠðÀ²47‘ÎgÉ2®p‚È"9»à‹“Œ„ô"Ž6ºÉNÉ>ÑWv29~'ëc/}·_ñ_®<@up´Vz3¹Ò ¾ðú=!õ×Õ ¾‚{c‹’ÎÏ|þÙ<ǹÕÏ»óûìý+ñ狈ü=ùTñËg0<ØüBÿ„ì™Q›–Õ’Y6gI.À•ÄúwžaèÔu¤þÝßOm?¸"uKgÝê½dpƯeŒ&;™tò0ì IDATw ªTÆßr“¶c)Ë8pf;½ î~zóy¾ô¿—ç¶-R¨°Âêrçal|ç=VÈÄ•s”µïÿ—Y›\Ą۱"®¢eµd–Ïͯ#žÕsÖaê¶¢zH‹ñ7xªŸw안$**Ѝ¨("Ëø¢q±oùwìÎ2`RÙºl Ϊ ó¦xê¿Wõ;{û×w%²âÕQL[›„ °‡•¥Zåüly¯4«D­k¤°äëõs&‹}K¦2áã­d°ÂªQ/6‰UË'À3q= ~N.b}]ì[¾‚=YÜ)ü²d¹—7:Y+’zw\KúÂùpa×v¨Cx1åKþõ{*w6ñ[þÇëÓ·Q®Ã]Ôòf.‘§þ{:þÞÔϲ©ûeÀ¸²HKÏ»ÀðŸ~¸Ø?_Dä﹨GlMÊ:Þû4‘æCn¡ü?1õɤðýˆÞLÚQ0â2’{V@pÓgyk`m‚í±´4˜ão¾Ëà^¯ãpADÍ›4(oŽ™ûØ2ƞΎ0Ž\f{|Ý/ÿÊàËþúÍ+a6kÆô àu9MîAÿö•ðǛׇ‡oW6ÇßCýò„Pë®TœðÜm°–¤f§á ¿³þ^ßçÏ?þù""ç…eŒñz:ãÚµkiذáùìÊÅ‘¹C´êv^þ"õËY]àú9ö3{ÀP6w{‹1Í‹?KŸïö/î$VŒÄ7_âù›c/á‘5½~EDη‹|*¿‹#óŸ¥ÏSŸ³+Ç`r°ú»£”¬S•P}(zAõ»ô¹HZ÷1Ÿ®ËÝ×y1‚yQÑù'"r¡]ÔSÄNéæ]i»éuF÷žƒeó#ªN7ž¸½"úå̪ß%-g'3‡ŒbaÆåÜ9p××äÚ F矈ȅ¦©""""â4ADDDD|‚‚­ˆˆˆˆø[ñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">AÁVDDDD|‚‚­ˆˆˆˆø[ñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">AÁVDDDD|‚‚­ˆˆˆˆø[ñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">AÁVDDDD|‚‚­ˆˆˆˆø„K$Ø:Ø÷ÉctîÿÅÛrö¶©ô½§;];u¢Óà$¸Î¥5Gæ ¤ûSË8nЧŽ]ïÒ§ÓÃÌü=—¬Mã¹§Ó`æÇŸS'‹™›ÄÅÃúùŠùÐ\ öÏ?“¶OÇôãÞNèÔ©]zeE’¸ޝˆˆÈ¥ÃïŸî€wü(Óf0Ï7.A¬½x[ŠëËÔû?O|[¼m[PÁö "‚mØ\%²§|1}q¿#žÜ²—jûç›!eý|µ¿6O͘ÌÕ§ŸÀÿñ¹t\äÁÖMâÒ1 ™ñ+ÙŽ\e»1ibGÊôÚ±—Œbw»;ˆ\¿†½ñ‡9J݆=A»Šy-¤ná«iï²pk<9Qq­éѧbý=oÞ±ŸÙ†²¹Û[ŒiŽ…›ÄEOñø‚æ¼:¾=¥í†¬Ýó˜2q6›3È.S‹Æ•œ:XëJÞÄÓf±ô·T.ˆ¬};öiOõPË« Ø‚"ò !2ØŽÍNpP!~'×õ´®cëødê,–ü––Ex›èÕ÷n®Ž´{U?WÒO|0y+æbáÆ¯l3îïbìà:Ê‚ÑC™±-à z|iDzÇÐrøxz× 9–1cÊ'üx0 ã¤üu=ÐûÊø{qü<¶ï¡^8ŸõsÅ/dô°YìLËÅÉN^zô;,À^ª5#^îÅž¯ˆˆˆ)‚5kÖåéÅÈmRWþÇt{üssÀqÊùû̧u4‡Ì6;3ÝÆ¸Sͺ‰=ͽã~2éÆãL0KFÞkž²Ú$äc fÕ«½L—¡sÍaç©í;ÍÑyƒL×AߘxçŸÚï×ÕügeªqcŒq™„…CL׺1ÆyÐ|5 ‹é;k»ÉpãJÝh¦?ÒÑtö­Ircœñfñˆî¦×ÄïÌ‘\·qç4‹ÆÞgœ¼É¤»½Üõôµfô£ÍÚtcœGæ˜!L5Û³ ºíaÿœGÌü§»™‡¦¬5INcŒ#Þ|÷òýæÞç¾3Ç\^ÔÏd›íS2}¦m5ncŒ;Óüþõ$3eÁA“{âФšþÓÍ<þÙ~ãøS×+Á,yº«ypÊ“ê6Æ™ø{Ow3vu~==nßCûÞô¯0ç½~Æœ[݆,2‰®"_)’‹|ÄÖ ÆÊ­[P-ØB©T+çâx2\’²™%;#hñ`=bübhÜwq¹„Ô“þë—¤iÿj„X@x-›Ä°x[þòÔ­|û[-^hLi (Gó;ðÉ—³7§qA^l$´Ã^¯ƒ_0ØCÚñÜDC@`~ûöÏô +vEqcŸ«‰²”¢a‡¼3fd]OÉ€Âëj·âGÊÏËX±1„Fq•©Ö¡?ý¼--†Ÿ}›Æ¶B- *ކåÜÌ;œ†›pìxÚ¾Ç œSÿÎý¼èD!ÇWDDDŠæÒ¶X„Rðã­e³À¸1€+óé&„è“ Ãò#‹YÞpg§IAs"m•:qEž;+‰ G¹ÄÓþ93“È ”˜S–-$š×>Rs @aõªvÁ“¡_²ð½ÑÌÜŸKéºmèÖ»;ÍÊxÑwÇ6ýY_­e_†Án3¤pÞôÔç¶}Oέç¿~Þ8ûñ‘¢ñ`{vö’„Z$fº(¸„ÉNä`"Ä”ñœ+- Ë·«à*uƒ#3÷Dh±†DÉÙnÀ8ÉHHÇ]°<¤áei6n"+Sš>…§ý ‰Î[žá‚˜¼åîôD2ü"‰ ôn§X–FúѨ¸Ò÷±êý™:©5Ƶ-hò¬ÜI+™üÊ""û¾ÄÄëJãoX0´? Îe§‹±¢~"""ráøôå×VDmZVKfÙœ $¹Wëßy†¡Sבêö¸:ØCˆ ‡¤]‰ä&g??®:xâ¶SVX5êÅ&±jùïdp&®gÁÏÉÄ`«D­k¤°äëõs&‹}K¦2áã­dÃíÀ<íŸq-«%³|nþrG<«ç¬ÃÔmEõ/6àJdÅ«£˜¶6 `+KµÊøÙNùݲ©ûeÀ¸²HKÏ»€Îd'“î.A•ªÑø[nÒv,eùÎl'Þ”ßSû^õÀu„ù#ä¡V‘|JÝÏ{ýDDD䂺¨GlÝÇ–1vðtvä€qäâ0;Øã ì~ùWÆ_æ¡{,­ æø›ï2¸×ë8\Qó& jC¬œ‡æ0òéÙãwn.NÞæñïaó+ÏíÏ£K•(Þ{;Ë'cÀæXJ–¬B£¦Wô]þOÍ~å¹¹_~}e ½]¹1í[UeõO\°Es}ÿAÄ¿ùCz½‰ÁT± ¹AÁVDDDD|‚‚­ˆˆˆˆø„K$Ø:Ø÷ÉctîÿÅÛrö¶©ô½§;];u¢Óà$¸Î¥5Gæ ¤ûSË8îõ*.…ÕÇMââá ýüg*]ñˆˆÈ?ç ¶~”i3˜ç¶ Ö^¼-Åõeê‡ï3¹Wü‹·éóÕÎÞu?°=ùÔZX}Äïˆ'÷,Ͷÿ΄ ¬Ütˆ¬ ÒEDDDþ¿º…s“¸t CfüJ¶#GÙnLšØ‘ò½vì壣ØÝî"ׯaoüaŽG·aOЮb@^ ©[øjÚ»,ÜOFŽET\kzôéF£X/b¬c?³ es··Ó, 7‰‹žâñÍyu|{JÛ Y»ç1eâl6g†]¦+;85º’7ñÅ´Y,ý-‡ "kßΣ}ÚS=Ô*R%œÉ¿ñã¢yÌ[¼‰¬j7Ó»†å¹>®£,=”Û20 ¢Ç—v,{ -‡§w@Û´¬l~ÿj,oO‹¡QÛöÜÚ¦>•B‹ù›…ˆˆˆH1¹Èƒ­˜VÏòN+CÚ#èóé_—ûYilþ.—±£Ÿ§zP:?¿ÚŸW?ØÌõO_K¨+‘e^fQìcŒ›Þˆ+‘_Æ+¢yuÜ­”9׌æ:ÌÂ×>`OƒQLëQ“ ôM̺GDÁò–M|™…Q0îëˆ5‡Y2þi^šY™IÕÁc¶5¹$lÿž…sç±t»¡f‹öÜ÷B_jÅP°j¡õ±—¦Ýè)”чO®~™‰*é€ÛcšÐsTcºÚÈ·óæðRßé„×kCû[ÛÒøòÈ‹ýä‘™Kd*B!Œ•[· Z°V(•jÅàLŒ'Ã&e3KvFТC=bü¿÷Ä´‘mŠeJƒIÿƒu‡KÒ´y5B,°…ÇѲI M›Ô­|û[-îlLi + Íïl€Ù°œ½9žÛÏÙ>¡cæ’Vïa&¼5‘a÷µ"î”P{aX—»†[É”·ÆÒ­ê>>>‚/ö9.h/DDDD<ñA7‹€ÐÀaϲY`ÜÀ•yŒtBtÈÉkù‡QL“iÝÙ)dDDPÁ÷A%‚N|[pg%‘áˆgΈÞ,.xÐ8Ȧ)A…GT¿Ø†´¼òWø6™ hSS®(éƒ-€!çè–ÍŸÃüå¿rímÔŽÒ”¹¸ø@°=;{HIB­ 3] N›ìD&BLùO¹, Ë·«àB-ƒ#3÷ÄZ[`8Ad‘œí쀓Œ„tÜËCJX–fã&Ò¹bÑÓ´=¦=†7¤sÂ6¾_0—iƒÞÅÔlIû7s}­ÎwÂ5YÚ¸Œùsçóý¾0êµ¹•þ“†qy¤OŸ6"""r‰ºô§"ЍMËjÉ,›³$àJbý;Ï0tê:RÝW{1á´+‘\ÀäìçÇUOÜ6Ë «F½Ø$V-ÿ ÎÄõ,ø9™‚l•ˆ£u–|½žc.Àd±oÉT&|¼• ¯ï4`XêJZ÷ÆÄé¯Ð¯i ¿|òóz9À²©ûeÀ¸²HK?ý·³ÉùõcÞøz/¥nÊÔ7_ä‰Î×+ÔŠˆˆÈEË2Æx±Ö®]KÆ ÏgNã>¶Œ±ƒ§³#Œ#‡»v¿ü+û/‹÷p×pßÀço¾ËÂÉ8\Qó&x´ õ£í8ÍaäÓ³ÇîÜ\œ€_@6¿òÜþÜ8ºTñ#cÛ§¼AÁVDDDD|‚‚­ˆˆˆˆø[ñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿp‰[û>yŒÎý¿à ³x[ÎÞ6•¾÷t§k§Nt¼€×¹´æâÈœtjǽþCÅçWñîßÙœ¿ã#"""â­K$ØúQ¦Í`žØ‚X{ñ¶×—©¾Ïä^Uð/Þ¦ÏW:{×ýÀödïê…Ù¿ós|œ X¹éYÉ—¹¸ùýÓ(œ›Ä¥c2ãW²¹8ÊvcÒÄŽ”/èµc/ Åîvw¹~ {ãs”8º {‚vòZHÝÂWÓÞeáÖx2r,¢âZÓ£O7Åzóû™=`(›»½Å˜fáX¸I\ô/hΫãÛSÚnÈÚ=)g³93Œè2µh\ÙÁ©9Ì•¼‰/¦Íbéo©8\YûvíÓžê¡V‘*áLþÍcÞâMdU»™Þ5¬¼ýò¶¶ìH™_Ö±ÿxÇmqtü(­ÊÏþeïù†×'~ÊÆô`¢Ê×çÖ»xoy&Œ¿2ös?>®¤Ÿø`ò,VÌÅÂ_ÙfÜßÿ>ÅØ±¬l~ÿj,oO‹¡QÛöÜÚ¦>•B‹ù›ˆˆˆøŒ‹<ØÚˆiõ,ï´2¤ý0‚>Ÿþu¹Ÿ•Ææïr;úyª¥óó«ýyõƒÍ\ÿôµ„ºY6áeÅ>Ƹ鈱ùñõa¼2!šWÇÝJ™sÍH®Ã,|íö4Å´5 JßÄÌ¡+pD,O`ÙÄ—YõãÞ¸ŽXs˜%ãŸæ¥™•™ôXÎåždÒ³q„Ås§³àç£Ô»©þ1Mè9ª1]mäÛysx©ïtÂ뵡ý­mi|yäÅ~òŠˆˆÈv‰LE(„ñ£rëT ¶À ¥R­œ‰ñd¸À¤lfÉÎZt¨GŒ?àC㾓˜6²M±üdnÒÿ`Ýá’4m^ láq´lCAÓ&u+ßþA‹;SÚß (Gó;`6,goŽçös¶Oc蘹¤Õ{˜ oMdØ}­ˆ+µ'Ø©p}S*V0U^IÀžŸØïEûeíåçá4h~9¡ø—nÂíMOîŸW 9>`# Ä”_–±bã’rƒ¨Ö¡?ýn*wÊ´ ‹àr×pëC#™òÖXºUÝÇÃGðÅ>G1ì ˆˆˆøô² <ö,›Æ\™ÇH7!D‡œŒb–Å4ÙÔB&AD|?°T"èÄ·wVŽxæŒèÍ₃lj‘â0Tø­_lCZ^ù+‹?|›Ì„´¿©)W”ôÿS°µR2äÄ6­À0GÉ*†‹¸Ü9©d˜ JœØ?;áeK`ß\”VÎ~|ÀŸª]Gðdè—,|o43÷çRºnºõîN³²§´aÈ9º…eóç0ùo„\{µ£4%ADDDNçÁöìì!% µ2HÌtQ08m²9˜1åc<åJ°,, Ü®‚ µ ŽÌÜshmá‘Er¶°N2Òq,)Ex`Yš›HçŠEOÓö˜FôÞÎ Ûø~Á\¦ zS³%í;ÜÌõµbÈŸELvrn"°î¬d²ýà ñæÈzØ?+ Œ rIÏ-xÄEÚÑ4ŠóÆ V`YuêG£NàJßǪ÷_dê¤rÔ×–+‹C—1î|¾ßF½6·ÒÒ0.ôéÓVDDDþ¦K*B!¬ˆÚ´¬–̲9Hr®$Ö¿ó C§®#Õíqu°‡I»ÉLÎ~~\u‚ÁP+¬õb“Xµüw2 8׳àçäÁÏ*Gë),ùz=Ç\€Ébß’©Løx+^_éoXêJZ÷ÆÄé¯Ð¯i ¿|òóüïbßòïØeÀ¤²uÙœUæMM8×ý ®HÝÒÇY·z/Yœñk™»*¡ø‚­+‘¯ŽbÚÚ$\€=¬,Õ*GàgËÍùõcÞøz/¥nÊÔ7_ä‰Î×+ÔŠˆˆÈY]Ô)Á}lcOgGG.³ƒ=¾ÀîCËáãé}™‡ì±´4˜ão¾Ëà^¯ãpADÍ›4(oŽ­óÐF>ý1{àÎÍÅÉÛ<Þã=l~å¹ý¹qt©EÃ{ogùäq ØKÉ’UhÔô ‚¾Ëÿ)ݯ<7÷믯Œ¡×â@¢+7¦}«ª¬þÉ˶h®ï?ˆø7ßaH¯71‚*6¡ó#—R´›"äñ‹äòë;óÄõùÿïð§J}7_~‚G‘Ùˆ‡4£¤­xö¯Ý#Ø:q$½— T冴kQ•Õk«8ŽO4õÚÖaõ[Cyè-~–Á/¶>=û^G´ ¬š½óìߨ“ˆˆˆü+YƯÇ×®]KÆ Ïg¤(þr»®óÍÅ‘¹C´êv^þ"ÏÿEDDD¼æÓSä\¹82ÿYú<õ9»r &ç«¿;JÉ:U=ߪLDDD仨§"È?ÍNéæ]i»éuF÷žƒeó#ªN7ž¸½â¥ñWÚDDDä_ESDDDDÄ'h*‚ˆˆˆˆø[ñ ¶""""âlEDDDÄ'(ØŠˆˆˆˆOP°Ÿ `+"""">á ¶ö}òûÁAgñ¶œ½m*}ïéN×Nè4x ®siÍÅ‘9éþÔ2Ž{}wàó«x÷ïlÎßñùç¹I\<œ¡ŸàïïÚYêãØÏìǺ1ü‡4.’ÓEDDä’v‰[?Ê´Ìó[k/Þ–ƒâú2õÃ÷™Ü«Ê¥ñ×´\éì]÷Û“½K¨fÿÎßñùç9ˆßOî9µñ÷êãLØÀÊM‡ÈRêñÊEþ'uÝ$.ÿ’íÈÅQ¶“&v¤|A¯{ùhÀ(v·»ƒÈõkؘ£ÄÑmØ´«×B꾚ö. ·Æ“‘cך}ºÑ(Ö‹˜çØÏìCÙÜí-Æ4 ÇÂM⢧x|As^ßžÒvCÖîyL™8›Í™aD—©EãÊŽÓFß\É›øbÚ,–þ–ŠÃ‘µoçÑ>í©j©ÎäßøqÑ<æ-ÞDVµ›é]ÃÊÛÿ'ŸakËŽ”ùeû'qÜG×ÁÒª\ñì_öžox}â§lL&ª|}nm°‹÷–7aÂøÛ(c?÷ããJú‰&ÏbåÁ\,Üø•mÆýýï£QŒw ÐÓñu[Ç'Sg±ä·4°,ÂkÜD¯¾wsu¤Ýsÿ\GY0z(3¶e`D/íXöZOï€!mõúήÈû³ùxê×l=– —÷áqmˆ¶y¨O¾ÜCKxmÈ7ü| wÙëè5øZ”óDz²ùý«±¼=-†FmÛsk›úT õ¹o"""Åæ"¶6bþ¿½{“±ì8þ¹gfwfgíy­SNQ‰"KB!ñ<%ŶlRB­e-'çSQ¶ˆErJåõ{" å¤MŠR¢”EìÁÚ£ÙÃ}ýþX+¡Y»Æ÷ýzy½Ê}ú^ßëºÍw®¹î™ãXÜA‘óÅbW^¼Ý¤å°o»É¦p“%—o^Âkoï£Í¨;ðw¥³eÆt6F<ËÔ-×ÒùrÎH^ÆkSï§rik× >yým~o>žù½ëcÉÝË¢ÛpmOcKÂt> ÀÔ¹­‰P'Øüò(¦-ªÉÌgã¶¶UvÒ~úœOÖ}ħ?)ê·{€Ç_Hƒp_4‡“VÀÏ_*žš2•Z¾6~^:Œ‰s?ç¶ í +í|¼+…Í‰Ëøå¶1Ì{²!¾©Û™3î *ÜMaêJÙ?ph徬ú3Ç5ÄŠ_×-`Ã7)4íTÕý ³»þ%…3ØVíy7'D¥ñù«ñÌx½3_hC¨»øŒ•èf!coð¥Ð4OòààðŽLzM˜Ë€,¾œÇëóvÐx|;ÂÂï¤Ïø–ôøã;>ûh-Ó.  iG¸ÿ>ZÖ ¾Úo^!„âw,E(†2QóÞvÔñÓ@ó§Fƒpœé©ä¹@eícóÁ ÚuiJ¸` §åÀ™ÌÛ±L>2W¹¿²ûD(­ÚÖÁª! !íï §èÔ*{?Ÿ ¢ÝÃ-©ä£¡ùV¥íÃÍQßnåHûóü4Ÿ“Ö‘Óôif¼‘ÀÈÇ;а¨¨=ÇÈ mZQÝ h~ÔŠ¼ßß¿æ¨çwËv„oŽмm]ü5ð©t'][ýÙ>Ó?`À×j"ë‡-lûîw2ìêt OŠZÜ÷¯žõÛ‡pÏ·bL‰ìÒŸÛøÕæI|îü1»œÔèч¶7ø¡šV’ÙxUÛvä–`#C¹½Óíøþ–t^ÿiøU½ûŸËì7&S;™·GaM²£×B!®^0é£áëo>Wìi ”Ž\gN‘«¬„Yÿ,Å4Ÿ •ÑbS=?‹3X²½?0` ´œ{VÚ~ IDAT· Û2Ès¤²vL6ý¥rO² ,Å@¦ˆHÚßò3›Þy“3i]x S+nõ¹ °5` µž»¦f®€¯#[<Ä¥d“§,žkŸ‘€*÷•ä,ß?àCížcxÎÿ}>yk‹ŽÚ©Ô¤#1ýå®*…KpaÕ¨Xs´°3ßÜWÆßG„Ñ}ÿ:Ïd‡?áç}|o°†au%“] À×]|ž4Ï€æS‰F5ü(Ùâ’"F*Dœ{³`´cq¦]Њ‚”ïÙ²~-ë·ÂzǃÜ"K„Bˆ yAaû÷ŒÖPüµ<Òϸ(šœVùéO‡ðjáîêJÐ44 tWÑôÂqÆ~®è1˜°`#3_Œ€“¼´\ô¢íÖŠ˜«p×Ô¢«—¼š6†· ÷èH¢Ó~äó 똷U¿=tùm„sv1ù™6t‚0º-“|Ÿ¬žô¬›öi¾°`'×^ô7.rRr(Ë/VÐÌUh5ˆQàÊMfç²—HœY•zSï#ÜøÜÀƒcgÓÑUƒf²x¶¦s׿fkXáö<…'=7Šv‘¼u;¿Ù¨löoùgíÈÂ¥ ¥mŸ_ušT:Íî]G°)p¦&±ngZÙ¶®t¶½6žùI¸c…*Ô©„Ép~•hÄLHH!!!˜ÿœvÓ¿ZP#Ú×Éd뺳Û©ìZ»Õ¤7Y=ŒQ3àkì£'±)P.9¹Ž2üz.É[·ñ»MžÅ›÷b¯Û‚êf(øy9s?œ0”ƒ)§°· _ü]„ʦ}D±?a,ý7R±f$ÛÕf×W€VýFÓû³ë<õ†“¦0E4£ÏÀÖž=øæ¦!‚Æ‘–¸„¸~s#a»1êéæzœ+ ºu¡úŒi<ùˆÂh¥~ÔhF?\Ãí:`÷ùÑqb¡^ ÅcŸå`Z&öð»xzx+B @ý¾LçiœB!„ДRO>%%%Yžñˆ’¸èëºÊ›‹“ëâ‰ÛÙ•9Sî&¸ü/(„Bá1¯^Š JËÅÉõãˆýÏj(TÁ1vmO!´qm÷_U&„Bñ»ª—"ˆ+ÍH¥¶=¹oï&ô_‹f0Ò8†¡]«_¿Ò&„BˆëŠ,EB!„^A–"!„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð ×vaë8ʪgcýEÊݾ?1»Ï#üç³ ÷û–ˆNú¦ÑŒX} gIu¥±axQQü‰žÀ×gÎßÑAòŠg‰²†ã\$ÿÇDöz”žQQD ß@š«$89¶z=†­#¥DÇ];‡—õ4‹~±cÛû2½¢†³>µ¬û÷ýSZ¥ë_÷Ê&?:Ùß-eT¿G‰éÕ›'ÿ³šdGÙÆ)„BxÂt¥øÇøÖ"jÌTìƒÐÊôÄR¤b¯r¹Ç©õ2¯ö¬Ïßîc¢rÇáLiH„ñ¯[, ’øN,©ëG2ô³ËÁ{,Aø-ù0¸±³ò+ë÷sß?¥UÞý[&ùÑ3ùzÅr;Mã­èâÆ±BQ¾®úÂÖuj7+—²ùPhõ:Ñwà#Üügaÿc3¯ÇÌ7DzЫ´¦ïð´«ê(2wLeXâ~òѱÛÔø/¶=Wܺ2÷²fþR>=”ÃÁ·v器¸É¿p=û{>˜¿„Oö§’W Òð^zÇÆÐ"Â\)l˜0‚…?案£÷ûF4c8íG¿Lÿzæ2h½Nú§“ˆ_ø3ù;Ž*1ÌLèNµôš»ö¹=¾Øü+òÿ˜9 +ù.×j͸¿ùaÞÚz'3^~ÊFwÛÝŧÈÙ5‰«3æ‰|–'~ÈþSv¨ËÜ© ó þ2X‚°˜¬û18ð³TÀj*l{ÞWãüA5šù}ÏîÕèÖ­"ßmøœ_L7©'7šǶ°pö ¾6 ¢]—¦„û¦pZœÉü±Ëü#çòà®}î¸Í¿íß  yÛºøkàSéNº¶ ?W4¹ÛîI|¿@Ì.'5zô¡í ~h€¦•`FÑ¿)#猤©?#:31¡?7Ÿ÷¾ÃT±µ,‡zcMÍ„ûÙ9mÓÁÎ=ãÞdæÓMÐÀÒȪ:i'rÐÿþŠ¥LÔ¼·uü4Ðü©Ñ gz*ye°V¶ÔýãA~Üs‘ûÛ.v¥Q§’¹Œ—ù!„%sUr¨ŸÉ Âýÿ|)6Xðº’É.PN‘©pîÅÚh ÆâLÃæÁC<º-ƒ*ÓE„.N®FÌêóþ*üA^~ýqj—ò:îÚ‡ÅÍñnò¯«lò”…@KÑÉT ĸïìñn¶»OÍ€æS‰F5ü.³h2bö;¿fÂâ÷×­šÉ‚¦¡4Œf MS(ààÔÞÿ±ôƒ$’óFƒ"瘃€V%¹¾†¯ÿŸŸfÐ@éÎq:ްjÔ ¬9Zø´•ùæ~¼2þ>Þ8•¶<ÉOñüööóÄÿßi>þ"½ê–Íò !„âr]Õ…­Ñ†¿–Gzž  _œõÜtòLÁ›‹Jü¬|t‚0®üL LX=h™ÁZ‘sîšš@tõ‹«Hå-¼þE“Û*?ãé^-K™LOyòðØåq×>·‘¹É¿¦WÀ‚\{Q™æ"'%‡¢ÉHÍ·øížÇgÄç Ìë;˜õêF‚N#¡u%|TF aCY^Äç;›Ž®Âi&+¶µ´ýSÁSû±WyãÖ•L~e&ÞþQ—1΄Bˆ²rU/EЂѾN&[×}K† p¤²kínT“Üd-ÚËEòÖmünS gñÃæ½Øë¶ º§j ¹·^›?ÜÃ) l$oNdÆòýä)Ђn¥}L¶¬={}W{ÿ—‰»É.ú,Z3àkì£'±)P.9¹Ž«bÕ¡»ö¹=ÞMþ5¿ê4©tšÝ»Ž`SàLMbÝδ? [wÛK_ySù™äêÔª†¦“sàS¶sàÌwz¾Á-#–À`BBB !8ÀìñMYÚþ)>„6êÀÝá'ùîh~™žY!„(©«zÆc† #-q qýæFÂwcÔÓÍ ÔtœX¨×BñÁØg9˜–‰=ü.žÞŠPOªCm†Ä‘:o1ñ}ç¡PXªßIô€ºXµ³×ÎéyKÞwÕïD\Üùkl­4èÖ…ê3¦ñä# £9”úQ£ýpég`õS[˜<| @9ì8Ô†õ^ƒÑTøÍ }62vÔr~w€n·ãäM÷~ ƒ©]'N¥G-7í;Ë•¼„A=–œwåÚôM|‰G¸É¿©D±?a,ý7R±f$ÛÕf×W€Ýlw—ÿ+ÌXénbÚÁ¼ÑƒÙY9ŒˆF÷Ó«G}¦¯z‰Y•'0äÖx±˜þécé®ïüc­›þ-eÿ”ÆÂ/±@•õ©…BˆДRÏ%%%Yžñ”×ü_Üp’º%2¥m°¼ø– '×Å·³+s¦ÜMðEIv·]”¯rÊ¿+…uñÃØÕm.“Zʽ%„⊹ª—"”–²çS ƒrñýf¶œ ¡a yá-3.N®GìVs¸@¡ ޱk{ ¡kSø5¹î¶‹òõåßàGhFÆo©ØËð´B!DIyõŒ­ý·Œ¿†_󦀚´xdþu#~RT••ûï¿>‡ÌA3˜iü0ƒÞOݳIv·]”¯&ÿŠüÃÿÇË/­â‡\#Ö1aR5ä92!„ÿ0¯.l…B!Äõë—"!„Bˆë‡¶B!„Â+Ha+„B!¼‚¶B!„Â+Ha+„B!¼‚¶B!„Â+Ha+„B!¼‚¶WÉ+ž%zÈŽ;/ܦ“¾i4#Vã¢MWÇá%ÄF=Í¢_ìØö¾L¯¨á¬Ou]¸W1ísOåüÈÊIƒx,*Ѝ¨(zô̶ ½Lâ/=Oú§tí/ŽgùB!®¦+€0Q¹ãp¦´ $Âxá6©R±W¹q¹g°ág´ägÀà ÄbÌ"ÈïÂ÷KŵÏEÖž·ùàè­ügá,n *ñ Ê™'ýSšöϳü !„ׯ/l]_óö¬¥ì8nGCÇTå.žò8- + Wæ^ÖÌ_ʧ‡²q¸ øÖ®<û7ù+2¶M`Т`þ“øMüÏþDìéíL´˜‘sÒÄŠþ·Çk€"g×$®j̘'òYžø!ûOÙ¡n,s§v$Ì “þé$âþL¾ÃŽ£J 3ºS­¨W\)l˜0‚…?案£÷ûF4c8íG¿Lÿz>dlÏàUu˜8ó êøž=Æö=³%à<›ço÷§¼¸Ö` Âb²ìgÄà ÀÏR«©èªnÚç8»Ïç·Î¼ç+ޤž …†ÄŒJç꾸R?aÂÈ¥̱ãä ÓžÙŽ+Þ˘é}¹Ù ®S»Y‘¸”͇r@Ө׉¾á¶`£Ûü[¾ÏàªÑÌï{vŸ¨F·nùnÃçübêĸI=¹Ñ¬(8¶……³WðåqJ7S­uožï7•}ÜõÙ}ûq¿›ü¸Ï¿BqQ%ðÕW_•d÷«@¾ú)ñ);¿ÊÓ•Rúõˇ3Õì Ç•])¥œ©jÓ˜GUß„íê¤]WzÁqµqòãªß¬½*WWJÏþZMïý˜šº+[éJ)¥œ*e}¼ê»XýRàþx¥”²ÿºT ˆî£ÇÏV[žQºRJ×õ âÔUöŽTÌàÕê˜ãÂMÙê‹bÔà÷Žª‹6åîQ }ú©YûÎüyž¤—Ôã±oªƒùdç§y*6º»êÞý‚?=ãÔ{ÉvÏRœ›¤&<9A%å*å<¹VÅHT?]tí¿iŸ=Y­|¶»ŠŽ_¥žÑ•Ò³Õî„>걩_«Üs;9UÊGq*&~£Jw]pZçIµ~TŒzjv’Êp*¥©jûô'Ôc·«Sg÷-.ÿyIãUtωêóŒÓjǸhýÂf•–óz¥Ï@µì°])WšÚ<ª§ê7û[•­+åLß®&÷zTM>7T±ýã¶ýîâ÷$?å_!„¸>xùŒ­_«‰¬o¶°í;+-Ö¤N—! :»Ueïç³CA´{±%•|4 *mnΊW¶r¤ 1 ñÀf&­ßÃéÈ» uýÁ¶“©Úù9jù‚:íæx ü1»œÜУmoð+œAÕÊfFMó¿…®í|™°n9Z@ß­ÿ‘ÐŽS¨mv¼¹~,óVÆ–.ÿ¦ŒœÓ“­™˜ ðõàÚç(5ïmG? ð§Fƒpœ›RÉs¿›íõ¬Øv8„{bo#ÄP‘È.ÍYÿ¦Š ¨`!+$€Ð€šš „ûÙ9mÓÁÎ=ãÞ¤¥ÁŠ¿„4$²ªÎG'rÐ  ´« ÜÆïëA~J›!„‹xyaëCížcxÎÿ}>yk‹ŽÚ©Ô¤#1ýå®*¾è¶ ò©¬ÓŸMEË•ƒ|åP`±P÷_íõ1Ii­iŸ½™OOÝD6•1.·Çk Ð|*Ѩ†_9, ð¥æ}ÿ¦Òȵ$jÎ=|ÍÇ¿UçAUÿÁŽ5bö;[âi&,~%=^Ã×ß|.7šA¥£<8R?“Aþ„ŸW¬aX]Éd(ðwŸÍdÁGÓÐ F³ …¦) ppjïÿXúAÉy £A‘sÌA@«’¶ñ2ã÷÷ù)mþ…Bïáå…-hæ*´ˆD‹(på&³sÙK$άJ½©÷f­H€¹ wMM ººÏ%÷©ÞÎÕ>bãÎ#T9¶ÛmÏpGhakðàøBF|Êé™'c¥Öt½y ïï8ÆMl ¥A"Ã<{x¨àÀ|†ŽÛDú…ÑûÔ¢çô‰*¶MWžÑ†¿–Gzž  ۬禓g &Ø|~{yù×3v0ëÕœFBëJø¨46Œ†² ¿ñ !„ÂÞýø´+m¯g~R.ÀX¡ uja2V9Z`Cî­—Åæ÷pÊ(É›™±|?yESbÆîz .§>û€5{L´êÒˆ€³5‡GÇ—–fÀ×ÙGObS \6rrÎØiÁ4}èr?y‡w>ÉãŽ.ÏÅçNáR„Õ¬^}ÁŸå¯\õE-€Ôˆöu2Ùºî[2\€#•]kw£štà&kéϯò3ÉÕ©U; M'çÀ§l=æÀ™ïäÜ—¹ëŸ+¿Bq½ñî[cMïkÌ®7FðÔLšÂÑŒ>[S8©F›!q¤Î[L|ßy(–êw= .ÖsÅ¡f]hôæ4¾ y„þu,žßàÉñO?µ…ÉÃp ”ÃŽC`Xï5Mç?Yo¥A·.TŸ1'QÍ¡ÔÍè‡kPTzúÝÜ…vÆa¬¦;3n²wÉ”ÛöÝXÊ #è0li‰Kˆë70Ö¸£žnN`Lx+ÝMLû/˜7z0;+‡Ñè~zõ¨ÏôU/1«òž»§"ÆbúÇè¶Ë7~!„âz£)¥<ž[LJJ"22²<ã—CÏ`Û„8>n9)ÿŠ(õCMB!„×"ï^Šp]p‘±{9+N4á‘Ö¥¨B!ÄuË»—"x»‚ƒ,ŠÏ'yuyxX<·{º¸V!„ ÉR!„Bád)‚B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð RØ !„B¯ …­B!„ð Rغ¥“¾i4#VÃyá&ÇQV=Ãè/rðøË€Ë”“c«‡ÐcØ:R\W$òLd`¯GéEÔð ¤ý%EÞÁµ¼6â)zõèAèGé?òu6ün;/_Åä×#¥8Þ¶—éFETÔ#<þìXæ~t€ýÂ$¯x–è!k8~yA–Çá%ÄF=Í¢_ìØö¾L¯¨á¬Oý»Á Èýöub¾ÉO¶Â(¾ÿÊÚÅ×?ÛŠRæ÷Êõ+s/«^Bï¨(¢y‚¡/®àÛÓžç¿ÐõÒþ‹•÷ø+Ùý!„ðRغå õ@*ö+ÆUÊÒp ‰ï,cVßZø\¸±à oO—“-GòÆò•¬|÷už¹q? §¯áwGÑN¥Ío)7Xh1fï-_ÄÔ'“¶jcV¦à/;™¨Üq8S†µ#¢\~³X'÷ðn¾ý£ Äo – üŒ‚ü ,XÎþ÷%üÊû‹öQ¯O4õý ¥®Øþ+k—¸~¡Òæ·¼ûçoèì˜9ÔLY¶Š•‹ÆÐѾŽs¿&ûRy½·ÿÊ{ü•èþBxïþI]ÇÞ}î¿ìoßÊ?ìæèé NÒsø3t¨ê( Žmaáì|y܆ÒÍTkÝ›çûßMeÀ•† #XøcŠ8z¿oD3†Ó~ôËô¯g>wçÉ-$Žüˆ¤#8#ZÑgä³t¬Vîe‚G\§v³"q)›倦P¯}>ÂmÁ…¯€zö÷|0 ŸìO%¯@#¤á½ôŽ¡E„ùqCÙR8’@½&5ð7†0nl S;úPÙ„ù-}ÿ¸2÷²fþR>=”ÃÁ·v器¸Éÿ¯??¬ùpC³î<7ðƒf¿Ç]GÐÌ_‘þé$âþL¾ÃŽ£J 3ºSíÜ]£ÈÙ5‰«3æ‰|–'~ÈþSv¨ËÜ© óøõÓEꎷYþ_W $µ‰Á„Åd%ØÏˆÁ€Ÿ¥VÓ¥~ZÙÉñß`kX4Óšâé/?~ù¿Ìœ„•|—ëGHµfÜßü0om½“/?Hå¿4äR××Ýä×Ýøts¼ãï>?žß:?Dðž¯8’z‚3r(«ûz¿›ñ§t*4‹&¶y{jø€:´¾§ï¼÷;™Î–úHûK«´ãÏóûCá5T |õÕW%Ùýʳ'«•ƒº«îq«ÕoùJ)ýŒ:°x€ztô§*Ý¥”r¥©Í£zª~³¿UÙºRÎôíjr¯GÕä]ÙJ/:‡ž­¾x!F ~ï¨r\êüÏvWQC¨¤4‡Ò)jëäÇÔc/îV¹„—ÿÓ<Ý]uï~ÁŸžqê½d»gp¨£ï VÑϯU'—Øì<©ÖŠQOÍNRN¥”#UmŸþ„zlâvuÊ¥”r¦©ÍcSOÏÞ¥ÒìJ)GšÚùZ_ÕcÄ:uÂéa~ /¤R>ŠS=ã>V©çÇá<¡>£¢žyI-û$IJ=£\ÆX\~KÛ?ÎTµiÌ£ªoÂvuÒ®+½à¸Ú8ùqÕoÖ^•«+¥Î|§¦õꥦwæÏpN}ªFFǪ¥¿žŸ]eïxAÅ ^­Ž]pû¯KÕ€è>jpülµõè¥+¥tý¯ÙqÏ®~]:Tü(E]ª‹•›¤&<9A%å*å<¹VÅHT?å_¼›3í35ñÉ8õÞ‘K«¿ë?wãç„ZßS X¸_åêJÙOnS¯ÆvWÝ/<ÛëÿM~ÝOwÇŸ½?£ãW©ƒgt¥ôlµ;¡zlê×…÷§»ø=ÿEñ¦¨ãz©¾¯ïSg.Üt·¿xå8þ<¼?„Þûgl0rC›VT7øQ+ò|?ýš£í ó çžqoÒÒ`Å_BYUç£9èx6s¦ŒÔ¼ïAš†›Ð£a³J87¥ç7'0×eÞÊØR·ðïèY?°íp÷ÄÞFˆ "‘]š³xÒ6~µµ!¤`›Ñ®_SÂ}Âi9p& í¾ ÿ¿Tù1V¦Ó TܸŽÍŸ.`ôªÞÁƒOô'ªY¸û ¥»¾ÊÞÏg‡‚h÷bK*ùh@UÚ>Üœ¯låHAc^âÍ€E+ Ç~ÑBÛK‡èˆÙåä†}h{ƒ_áLœæÙŒPÁÏo?ù3Ò] —Ý‹!ô~Û>5ˆž2™‡nðàöôoÊÈ91ùÑÚ™‰ _óû¨¾}û]N´ŽcxuϧÑÜŸPu„oŽÐü麅ýSéNº¶z—/÷•ÍõU–»ñéÉILÔ¼·uü4ÀŸ ÂqnJ-¼?mnâ/Éøsæ›E“YœÒŠaÏÝ‚Ÿ´¿ÔÊdüyr!¼ÊuPذ†ZÏ-&ÖÌðu¤`s88µ÷,ý ‰ä<…Ñ È9æ  UÉÎo ò;{~ Í`¥_¡‡ÉþJ?“Aþ„ŸWa¬aX]Éd(\gN‘«¬„YÿÜ®ùT èÜkoéó£™+Ó¬Kšué²à›f1cz!¯O¢“Û¥»¾nË Ï‘ÊÚ1ýÙT4”ƒ|åP—ýº-“3ÊO×ái4ŸJ4ªáçñÇûEÌõú3ÂëIDATkYÀÁá·ây#ü¿LùwÉ–"€³ßÙ#4–‹* …íç÷X¼¿!OΨ‡_ ‚t7~t•Mž²h)Ê•‘€*ÿRØ^þõÝOOhøú›ÏõfÐÎÝŸz»ø=ª ™Í³&óÖÉ–ì\ïí¿|e3þÜÝBos¶:ù™6t‚0RX¸äû`5ž±ƒY¯n$xà4ZWÂG¥±aÄ6üC‘˜ÏÐq›H¿ð!]ŸZôœþ"Q%˜Ý¹£5 -ô<„þã¯ç¦“g &جa$´pûEϪütާCxµp|O—&?ŠüãIl=H«v 4€æW…;êNõ³9˜ît[Ø–¶ ÖŠ˜«p×Ô¢/•KÛÅ1gÿ¼‹ã~7óXDIroÄçŸ|h§$GùèÍωèù2MKVz»?š^ vríEoã\ä¤äð—á\ªë?>-¥\*©ù¿'ãOåæS'°¾B/¦LíH óA]ïí/…2BˆëÎuðx¨‹ä­Ûùͦ@e³Ë÷8kGRÝ *?“\=ZµÃðÑtr|ÊÖcœùNÎ}­ðµ@öÑ“Ø(—œ\G™ÌÈ.EXÍêÕüYþJ©‹Z-¨íëd²uÝ·d¸G*»ÖîF5éÀMVЂn¥}L¶¬=»Ý•ÁžÅÿeDân²uóó÷WG³àÃù¯²tÇ1l: çñÛöO8d¨Í­EOŸ“ßÒöØ{ëe±ùÃ=œrÊFòæDf,ßOÞ…¨ç“úýÿ˜³àGªvéF¯˜Ùq‘ºu!Ñ…~mÃK8ìÁøñ«N“J§Ù½ë6ÎÔ$ÖíL;¯°(íõ‹Ÿ¥å.~·ãOÏâëySxßç1&»ïEÝõÞþ³\'Y?¶O½¸“ÌüÃYúñ'„¸]3¶>Ôj¦óá„¡L9…-¸ýâï"ÔTº›˜ö_0oô`vV#¢ÑýôêQŸé«^bVå Ý£›¹‰ßèfü i¼÷wdq† íõæŸç­ÉgÇÑØ~}·¿IÑ›Cå–™Åiû_¿Î®¼ÇŸâú¤)¥<~””DdddyÆS¶GYõüöżÁ¤»äß:!Ê•‹“ëâ‰ÛÙ•9Sî&øš»á®õøKëZoÿµ¿¢,\K„åÃÅÉõãˆýÏj(TÁ1vmO!´qmü¯‰¢âZ¿´®õö_ëñ !ÊÃu°AQ>ŒTjÛ“ûöÎaBÿµh!cÚµúU³L§x×zü¥u­·ÿZ_Q¼{)‚B!„¸nÈR!„BᤰB!„^A [!„BᤰB!„^A [!„BᤰB!„^A [!„Bá®îh(8È‘SØ’Z€^¡݆ÇÓýf«ü4®B!„¸ÈÕ=ck¾™~¯-åíwóBÓc|°êGÎ\阄B!ÄUéê.l‹h¾„U €|;ºÇ¿“&„B!®'×Fa{ŽTµB!„âÒ®‘ÂÖ@@šXŽï é˜MÊ[!„Bq‘k¤°ÕðoüñÒ˜ÿ|oF~tוI!„B\U®îoE8OÁ¡åÌÜh!fÊ"¬ˆñJ$„B!®*×ÈŒ­‹Ìƒûɮމö7KQ+„B!.v¶  ¯€…B!Ä?êÚ©‹ž“_gB!„—pm¶*Ÿ¿eâ€Ï•ŽE!„B\•®î‡ÇÎûI]r}^¨åJÇ$„B!®JšRÊ㯅MJJ"22²<ãB!„â²\K„B!„pC [!„BᤰB!„^A [!„BᤰB!„^A [!„BᤰB!„^A [!„BᤰB!„^A [!„Báþ@0ÝÖÞIEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/24-agents/2405_agent_preview.png000066400000000000000000001117151516513262500312040ustar00rootroot00000000000000‰PNG  IHDR¿ð¯ÿÊsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwxSÕÇñw’&iÒ=é.ÐBÙ…²AÁÈQ÷À… ÷Þ¢8Á[p¡ »Ì-P tÒ=Ó™4¹¿?:(«ZZ~ù¾ž‡ç¡ÉÍ=çžsnî'7çÞ¨xoµ‚B!„v@ÝÚB!„â\‘ð+„B!솄_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„váµ+ÐÖ)s‡·vÎkª…kZ» B!„µä̯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»Ñ2áWmdþ´á¤]è‚á„§4Nþl{!?kZ¤è6C1±ñ±ÉLž|ü¿©7ÝÃó_G“ei™b+S¿çÎÉ“ylƒ ¥eŠh}_:öÄÏÎúNZT­RÑ6L­ehÖ^7”ò¹Ã±Ý2˜=cÙáíÐbŸˆí½? >á$ÏŽ2³3C´­]›¶IåàÈ¥½;óç”ÁäϹˆŠ[†°|7ží쌇=!þi LìéCØ)b ƒÑƒÛ#œqiá*8´ðú[ŽÚÀƒ×ôgÚÞhúí)§²µës:¯çÉ[ºá(GwÿÉ’^æ‡×xyJ(Í} T;wfÄØquv0ê²VñiL ¦|[ýΗ±ÔlÔôêÉÚü}ˆqie˜õN\Ö³#K&:aøv7‹Ššÿ£S£ûãÿ’š>½¹Áû0Ó­ç°ø¶?Æu.¾,×›Ý +;—åûË1itDú0”/s#¸tE2ÑæÖ®©âŒi ÌÕ‡%a:r‚0äïtV¿:½xwBOæ¸Ù˜bÜÉØ&L-Tó7üž'TN„uꄱúïÎ];átd/­ÝDú„PBš9ýªÝ#™03²yWzž²–æñ↼֮FÛ£uáîHgŽlÛÊuÛJ¨ ˆ5i%è®âÁ®N,ÞR\ýxó±ëþppæú0=Ùø7¸#ã#œ¹/½’Ö®W¡Ò»óêUݸ٩ˆç–ÇòtJµWå@¿]øýÂŽü;ÚB?ÒI´µfm…gFM¯¾=Y¦À»C›FÿÓIÐ×ßªå† îÅ»9[˜™RÙ"'KZ}ίÎÉ“—÷'cÎpl· bËÈ@úëkžUѹ«§_ˆmîp*föåóÎ8kŒÌŸ:—<ÔD^8ˆŠq^¸µæF4…ÊGƒT–S©¥Ûyæúûøiï>zø&n|ye€RšÀŠ÷å¶ë'3ùê¸ç…¯Ù–S J>kŸ¸†kŸÛ‚©vD˜9¼x“ïø–äÂí<3m6Ÿª:tœv=Ö –Ýw5³?=Tu±å²òáÉL¾öy¶W­¸,æ5®¿ú!þÉ9O4:/þž=˜w|Õ4u,Õ;.u^ü=«?ú²pòP²/óá²áC0Oò'¸öt»†‹G¥b¢?Amî¼g €êøo,ż²b7³UÔžTë\¸mD‰· G¹íâ.ïÀ•ÎÕo'¶Ãå~Ü>þ"ÊÆúà]§¬~C£\מ†ºý:g/ž;€ì[‡c›5ƒ½ Q7¢ÜÓõeË5ØY3zµc²“…ßã2ù$¥ß~ô>ჯ£›/ïŒDÑmÃȘÒ{Ú±í–(n¨þäÜ`_Ü2€¡~¼=nys‡S:#’çCthÔmýýRM·ž¹Óµ‚~ßÍuƒ/€Rɶ=qŒØdÂÆKÁö9mFˆóŸ½1ñ¼s,Îzuˆ`ÓùvbMð­’| žùi-|¡…ïJ¥ÂA}ò¿Ú7.­¯NêÅCÆ|ù}ü“Ê‘€N¬¿<ŽjÐ{…ðë¨vØÆ3æçnÚge°n<àVÎ K£y$߯î [pZžKaKnÈY±bµVÿ«($5ú>ßXŠk¯¾øÕü¬¬\ø GÃÆ2ý²t•GùýÙù|žÖ™)ó^äÅ'n¤Oñï¼øÄWÄW¸Ñkd¶¸5Ä—V s*ë6ç8âBêPë[Å‹^ý|(ØK®(OfG `I`ÇQ3`!}×AÊÑÝ£Õ?#Rƒã«Ž&¥Æ%j³Gt sV*ì.bã\ò}üe¬.]çʬö6îÍåh[ûŽßRÌ'‡Ì„÷ëÇq™×É®5*lÍÌcU®+€ÚÈ]Wöá"žús–âOÇ –ïÀ šqV·bòY¶¯;Õ|PppbZ˜žýû39Pç[~•η&õäVU·ýºáksðèÕï{Ð6PîiûÒ³mŽSÐáƒE_dU°í`¥ofz›ð¦Ö{²hb7¦V¦sã/»˜¾§’Fu¤om;7¦/ŒÜ~‘?åqûôÍ.Éqá‘Q¬)mÛï—×D!3‘çÓ*9õGm±± |SáÀØn.¸žã* !š‡­¢€Ç~9.{0©ÎN´?–!«³ImÁón-:íÁ¿GE=NõŒ•dÀÍ?˜EÜûóa>3)@1å.œÄõîé¼nt&X)ååØ,þ)V ³”£¹®T–+Ø Ø”ª3¨m”²çn¼æøÇ ]'óÐŒîÔä$*Íh†?È£SBÐæCŸ±<1œ[ÞÁpO5NXŠC·-fEÂTîè5’ëǬ9XFßÞF,©ëÙœÂCüp £¶sâŠz×3;ª.Ë·qÈ4¯¼ ‘ óŽc_l.Ö0öíÎÃ+ª7>môÚĆÆW]º&Œ¥†Æå‚b@£Æ²/Wl­ž6 Íà·ŠHfiYrÀŒK;.S0'Å|šƒyk²ð÷Úm\Äí½™I/…ù|½;‘'ã ɶÁ;€û½LÜþÕa–”TµÃö<…þ3¹Í'‘Í9œÔjc›4áÌhçÀoÉ•8zø2ÉXÌ[‡Ê0×^ž¨Â3(„ôyÌ\•È¥%Ì4xßÈŸG½åÞ¡9}_¶IZgn訣09ƒm0ef²ÁæÍUÎÜS=õÁ74„©šl®^™Ä²r ½˜éÎìí_µŠFõ…2÷`þ¡R,@êŽ,lÖ6ü~©q¤Ÿ $'˜È>eÝTxx¸ÐÍQCJ½½PÉÂbv—Øãüq!Îo5XuU${º*i,C×d“ÖÂÎ ¿ù‡0~WÉqsÕo_¨içeÄPœÍ†Òco_%yyÄXý袦$#Ï #ùdÆ fÊæ·ä\~>’þ ¥ LØh¤:¼¡Ò`ðôÇßÓÀqyRãD§íª/~S(I‰'×|÷oŸÎ‡5ãB©Ä\iCÉ7C×^Œì\Égÿ¦¬w26l¢°ÃU òÑp¬±^®Ï@ºhß$:©„ˆ´XJBÆ1"<“-;S4ÂíéÎôšÐìå5—úÇ×ñJ²;–T ŽKŠ[%[ÒÊ•m)fI’•¿ºxàŸKT7OÒöóoYóow³°™Ù—À†¸Tj-]¼¹¡W0÷ ëÃ(×Dm,ÂÅÓ• W>ž~!ï×4…J…A­BeTWa?¡ley|’¡æÎ.¸$îC»œ~4)uÞmT„´3¢+Le{ym…ˆ‹ÙËE€—ÐzË-M©§/Û 'o?&+ùû€‰"€ò"¾Ê„K:øµ¡u5¡~F4GØQ; l$¥QÐϨpoT_XˆÎ¨ æF2ŠÕ†¹m6É ª‚¹ú4ßÚ€‚EãΫWud ¥£Ô\õC<1粚Bˆf£vpÀ[wòïâè€ó9˜×Ԣᷬ´˜­™&êÿ5NNU€zX­ lùܹt#Ÿ…ø0±½'GòÜpÏÿÃcY-Xñftâo§^HSA ØÔ®óà Óè¨;nAœœQ© çˆp*¾XO¢É…훊›Ü¯ÎÐ6¸mG†„UòÅŽÃ<š…wŸNt‹@ÿ÷6Ò’èЕ±!zÚª¦Œ¯æK5ãÅJÁq§Ð¬ìØŸKñX?†»[™ +þ. -^Þeðáã(oü›Ä¶JPlâRÓy(5‹Ÿ/À¦zE‘¤Ra-Ë`ü ì8áöf³EÍÉí ˜Y¹Ï„Ó_z;Z¸"L˶í9'}}¥V«@Q8ÕýÔ ”k­¬§/3ZnŽØ™ÑÕÅ_¸zì'ÔÍ›™Þ‡X—êS¼Ù+Õ¡n“ª¾°Qlm[[ß(•ål.‚+‚Ü T›8tŠ3>Å9É\ù»žMWnÎeö¯YVzn«£7ïOèÁ¬SÌ_òlÁÆ10dEúqSåš[+ž?µ‘™[J¹³CŒÇÞù<<è­© Ú¤àÂ˽IOJcþê=ô[²…;ó\˜ÝÍ©þ0y^Sáгé I<<<ðððÀÕv€Ÿ?û™}%  Â£×HÂKw²zój6›:3&Êó„ÎlÄzT.D ¤hÛJþM4Ò­«'Æà~´¯ÜÇÊ•{±tBØÿEC«š0–”Æåé¿‹)ÎÎàÏJWîïÂH[.´¹ VÅjSÓ?<ˆ{‚´'½ØÀf£(((&ÏàB¤¦’ôR3é¥f²Õn¿&°-㺸àŒä¬rwOz×~HUì犧 @9ã¾8/ØÊø.®¼By)LÚ329)‡ùW·þÇÇ…mo2‘¢aFoÞ;!ø&Läýºs€ÛG°qŒ?-8å²UouV”žÂâÒ>¼1&ŒÒMYtpåÎaAøfdI¾• æ ¢£í 酪1zys­»Â‘ýfÌ€MQááîD˜ÑÂÁRkœ[yfôa—sià*¾}õ#œgŽ$ÔšÄÆó2•K]ªâŠÊ£#Ã>àÝÏþÀ±ÇýDº|lÌzÜ»ÄçÃoˆÑöå2*Ç0ú¶Ëã³­6;—óü¸Z£BÝø±t¨Þqi;ý^c1±8IáßW²÷%°¥ÞÔ\Î3‰Á|~Y†)|—QF.Z"ýxŸdufñÐ ŠÓbù§ôÄ%²“SøÞÚ“F†¢ÚžÇQG/žì‰:&Eõ”kk°/Ûg?®r¬ä‡í™¬Ï©sÊVeæ•”ö|ÛÁ¨õ¬OLæ×!=øtd(svæSàêËó‘zPª.+9þ¨«í¾_*Œ=Às]ú2ÿ’Þ|¦åÎ}ÅT UŽ\èÀ®äb’’YÔº•Bœ15]»µgv»:$í‹eèÚlÒµùäëÍ|ŸªÐáÙ¾óü³¹%µeN"µjøU,…Ü÷Ó .êÈ+Wák­`kÂA.XŸÆa|I[;óVT7VVa)/ᯘXnß[†Å¦áßCÜÓ¯'Ñλ þ3¯Áéç m(“ž~ÝGŸòÃ˫ȳºÒκœ€šS¹Ókd8ªý‰DŽéyêÚˆõ8øô¦×7¤¹EÑÞ¨=èé Izöp?o¦V×O!¯‰c©ÞqyZV¶ÇçQáÎ÷q&ŠÏÕæ5•­‚/ÿÞJNÏ<ѽKújÑÛ*IÉ+à³vðÒ¡Òª9¼Öbžýe¥ÃÂyüRÔöIâŠu©Ä×׊™ö™°ù;ó÷Þ|rNU…ò\fýÇ‹Ã;ðÉ„¸™ËXÇ•;J¨°R¹õõe‹4Ø™Òп«^%™¼“qÂ\ÅÌß»s1]áÅL ÿÍaæÏxkD{¾žJNF¯LÄp©&+gÞ5læ6ý~©XL<µl7ÚË{ðàð~LTÂú¬r 5:zù»¬6óá¯ÑÜÚ‚·>B´4{vìf¼s¿ts¬ ¾i6 ¢'–U]÷¨w%ËÖì⎠¾*Þ[-ï%õPæoí*œ×T ×´vÎ!a‘}Ù™Ï௳½-þŒ–h“´F7®l§°!©ˆÌê0ëÒ™¹â›Clµ—±¤ÖÒ¯Swtòd ‡£ÍÂá¬|¾MeÉÑŠfÿá!D+PëæÄþÃù=ñz½+Wû[X–XFK^/.¿ð&D3Ðèàɽ}Iس½öVD³Pé\™?&”¬-qÒ]ƒ°U”³éà~.Ù\ÄIS¦…Bœ ¿B4ƒòìº-Jhíjˆó–ä# \zDÆB´´ÿ뙄B!„h ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØ •¢(Ê©žˆŽŽfÀ€çº>B!„B´9ó+„B!솄_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØ ‡–.@±ä°çï_øcí6b“r(³jqó &$bc§\AT;=ª–®Äq̤­úˆ·¾YGBA%¸]ÌÓ o§ýÞg¹ñ…]XÎw~Ìs¹Ÿãzµ¦¶_7øjñîØNŽ'îbOjPÈÎÅϱ8ôMæôt:'gZ-Yq¤V‡]÷‹îåñkºã§ÅØŽP¿v”(Žø;kÎAMÚ5F¿ö´Ë-ƒF™ #šL¡ôð?|ÿK g`÷Ë%ü !„h“Zèèd#oÓg,M¬þSß•©=ÈÄ®.U“Œ•Râ—>ÁüQÈgÕ7›™Ü}$Þç"tÙlتÿëÖ‰ _w4]oáåwÏAùm’žs_å½Ö®†B!D k™ðkËcÛ{° £Ï­÷ ¾*#ÇßĈ¿Ÿ`U(‡7q¤l$ÞNUO[Mñ¬ùñWÖî>Ì‘”*Œ¾„´§÷ˆñL¸°#N5+ªLãÇûîæ›£€ëHž|º{>ÿ‚?w¥LëFP‹¹öæ) ðÓ¡²åòÏÃsX”p¬š‰ŸÎåšO«æ¸F8Ýœ_sF4?}½Œõ»âÉÖÑcЕ\;4•מXF6>÷C^áyê3×øà¶ù¬,¦òü\'þúô{6$¡÷ëL~£¹æš‹5¨N±M£xæµK8òùB¾‹V3ñµçEûÿá»_þcw|GMz|;„ÓmàåL¹2 _ ('î½Ûxbµ p⢋¸³»cÕú•B6,˜Í{­@Sß|ɦÓÌE´6\–5ƒeÜÁç)€Cúx>ýA1máÙY¯c\Fðìsé¢KÂçÜùà2r—‹ŸáƒÛ»Âþ÷¸õ±Õ˜MŸGYY¿³Ú·*ØòÌõLšÎ;¯Çÿ”_¤4¦6 ¶¼Î]¯l¦Àë žûF:ëLÛßàŽ6Rày O½1›NªÆ·]sôwS÷íÓ:Û1£`ÎÜÁoßÿÁæ}‡IÊ,ÆÁ3ˆð>c¸vÚhº¸µö>!„mK˄߲$¶'Wÿ_ד1Qî'ßV± 7¼ø:——) ÒãUͬ9ëyûá7ÙPPgÙ’,c³HŒÝÈÆ¸GxaN_ÜN\aI,‹[ERqõß–BRwþÂ+ðø;·iTcôòÅåh¦òêeœpõö¬w¾±5ë_^›÷>ÛËjI!fÅBbwø4©IÈßÀÛO¥QYõgiF<ѿųý@//˜H¨î„åmylxûIþÚS6 ¶~ÈC/­&·v¡J²bÈJˆaÓôØX‚´Žt¼¸.«Wc¢„=[R1wGPžÈ–ÃUKð¿€§ýjÚFÁÖQ–=£| %*“Ø“a¦¸Kf,)ÕÅ`:Ä¡+]Ú©1‰#ƒBÐn@ i¿=ÃýKöSYç1SV"Û—¿Çöu»™÷ê t¯g<–rVóÊ#Ô|EPœÌ毴+ì¸ÔÚ²-9ñ¬þxENoóÐ…ž¨Ýfõmc9‡¾ÏÃ?¥ÖyÌJY~±«–}ˆ‡Þ¼‡þnÕQ¶Iãó ë×È}Ë9%‹bKõ2Ž.øx;qê D­‡÷~3¹)rïÆ˜!÷/¾\%O^TÎ?_U_\¸pÎ4º;©šÜvµÎ¸¿ëhê¾}¶}R‡%õwž}p1qæ:[—JìªOxlÓ.nõA.ö­ê‰s¿O!DÛÓ"ïMÖ’Lrk‚¾]8eºTcô !44”Ð?œ5€RÀæE kߘõF3ãö{¸mÚpBª¢Y«ÞaÉžNºFÍšA’¥\u-×MNÇšƒMÑ:–í-FQy0ô¡…¼ÿÐÐÚ³Šíg¼ÂGïÞK§ÓlˆR@ô'ŸV A£fóèÓsÇU]Ðdg× `T–B†5€Áf0sêH:WWÄzð[>\›õÄå‹wT_;¾Aþ8Wìå‹…ÕI§>L÷,/?ÿ3‡zP»„…«²°Ž†Ó×¥j5y;wY]YsÚvöW%¿¡ƒ8]öUJ[–ÿ¾Ý©º9DûbÃFÑ‘ýäÕ®-½©å@i{ŽV=¤êÈàŽÆªÿ«õ4UmlÔ×3ߺ<žŸ~¨¾†Œ¿õAžx|7 ©ÈëXòG28»±d+ ÐwW^;qý¼kZ„ô¸T¬þwÍ$Fts¯©ÛÛNž­)mvzJÑN¾YVÞœ{3ñÖûxà®›YÝ™¦,ßSTUç&ŽÏ3®_£ö­wyõÆŽÕOè8o!ï?v ¾§èÎ&ÕCãÍ…·\O„ÀJÜÒŸÙ±i)¿T¸6ô¿…}\P5µíê:Ãþ>NS÷í3i‹S±f³æý%ÕÁWMÐEÓ˜{ïÝÌÕ¾êƒGév>ýb7% ­²O!D[Ô"g~sɱ³y:gô¼’Í–¿ßvVŸ¾ðË“OΤ³#ÀPuT¸ãÙµ˜(fÓïqÜÙŸã3«/ãŸy–éõ€Âð€,漇 +Ù©…Xº4yc•ü]ü¾£zKÚßÀ÷ŒÆOt Ç=ïvž]W\ïëOfdðƒÏq_ÿªƒõè¾nÜ7ï'2°q`ÅVrG\Žï ¯ž°€S»ãª’/ñ‰ @CÏÙ·3i`ÕÔŒŽÁRö<Áª"…ø¿6’yÉx åÌšµÅÍž¼Iû*ä쎩¥í2ØŸÓP*Ýÿ'›Y–È@"´kØn´˜Ê/u&mwUÈÕº;`)°¼?K¤–ø„Òê H„kÕÀÐwžÅÂ¥³l=¥4“´’ê?|{2hp?ÂÔôêæÙ_¢àh¬šÓ}vc)œYOÞÏ ”u"ÿÖ¬+TÌyò~Fy«alÌs°¾(Î¡Ä †&´YÀi2¾µ´îÝé^©#è²Û˜:¨êìYŸ#¬ŽY …¢œl¸¡nâølJŸ÷ÊæÝ·šT hüFqë5«¸÷ëDÈ[ÁKoU¯HÛ‹oˆ‡ºémw|óŸY{·ŽFìÛ§8ÕÐÔ¶8‘5w+TEUUÄ»½úÚ‰AaT¸‹/S l÷$Vô¡ké¹ß'ÎÉuBÑD-~U:'ô5Xʰ4òVbæô½TŸ$`ä(::Ö®§®cì¾–¿ À’r€,K:Ô ÕN]ˆ Ô×.oôÆ•8 ›Åvò™ŒF¨H!¥ú…!ÃûáSsðQ9Ñut\ÖUÍSm4—\ÖË¥v¾¦.d8£‚~âËT cæËñ­›FÕ=¹f\7\5rö'U¨°²wÑ}Ìú´zMŠ•Ò¢êפï!­|<N†Gá´ö?JHbã¾".óVØ·µúö¾CpºèÛÔ²ÂԶǃùH,™¥Þì?Rø0|L;V/ÝKÖ¾$ŠKôìͬ.>ª'^M¼©†ÊàK€*’¾áá~! {?úÀ€‰·r™¯¢ IDAT¡ö«Œò¦Ž¥ºyv&¬fž¤Æˆ«(¼"èXó}°Æˆ›#P U÷ÊkJ›]‰ÃÖE,ZyÜÙY}‡IÜuÃHîx|$ØÊÈNØÇú?V‘pˆ¸­ÛOkMŸMìÓÚ˜fÞ·š:¶´_1—‰kä§šNEMçëg3ÌçØ rðk|ÛçŒúûÙ·O|Ñ™´Å kÈÜGõ.Eð îµÐøsÙãoÒÇd•˜Ÿë}B!Ú¦ ¿§vxi!Ñä$Ó ~']Ád£ä莖تæü†c(7Q3×Ù×ùø³3Îø:@y!å68nî¸?UjõYß:ÍZZ@õyJŒNÇÍÑ8ûà M ¿N>¸Ô]‰ÚŸš“¨0UmÓqËûâ^{±‹²ÂÚ‰(¥Ež²Ò%U(à¤Â~1QNÿ±®Dáð†CGÁ–ĪÅ|!ð´ó›Z–]A|*äÄr8³=±™€¾}£"Ø¿t/)i{IJÖ“jp¡{ßÓŸu>-CWfÜ7‰‚÷~dw@Gc×ñkì:~ý \º\Á컦3ØW‹ÒÔ±t\¿8 9åL‡ÓÌa…¦µY%¥i{‰‰Í:þ¹ŠáX” R×~Ê›¯"±¼Îs§¨OÓÆgû´nømÖ}«éã}{FëÄO¬þ;Š ÃÚÿÖ„¶;Îõ÷ šºogÜuŸ*/ªçwC1 BïD¨ç±eËÎù>!„mSË\ðf¥ol? ”íæß}ÅôŠr>þTy”?_|ˆo„sÛ‡/0ÔÑGªN(gcÅýX+‹É®ùWï‚þ|¦ÖÐf 8Û„ —Ú7úJSfÓ‚/@I6¦ºA›éØ69ºVÏ{­C¥ªÓfjt†šÉ–ÞŒ{ùftl >Âåĺu%Xöo`¼–ƒ–ª×XOøljY¼{FáM*9¤½u[Õ½”"iïLG'H1dÇ5ùº…èëYßéËq¼–'>OF\46l`æ$W·¡iÿï¼þºï=w®ç|,5¥Í,$žî™äŸyùÝUUgè|ú0öÊ‘ ìÕ… âo¸û±UÕY¶i㳉}Úä íuãPJ÷ñów=P±¯ÿH&rJ(5kkJÛ5»¦îÛÀ™¶ÅqkÐ9¡£ê¢Ñ’¼ÒSLé8FÕÆÞ_…¢µ´Ì[œÚ“~—w¯~.aÃ{ï³*µ¢Î×£2þûœ_k¾ƒóëC':¿µs ®\ɑډà ÅqÕ^¨áÏ9¸¾Î§síÜÔבRs5µ­€Ë6ÓÔ¿˜¶ðçnSm;T$þËß5¦öÄÿ´W„8àÝɯºÃrÙŸPX{¿b ùGöG\üQJkÚ@øð>Jwòë²UÈkÕWXÓËÒô¥»@1n¦ð솫Á©¬ü»ê*%UÇÁÔ\ëÖx %ûᣅ Y¸h){Ü3iΣ¼þÙW|°`}ª×§$íæ¨™VKMi3-í¯[È?üpü¿‡¡ì®þjÚÀ¹÷1óòAt rÆ´?þ¤ðÖ´ñy&ãçÌ~gRrÿø>+ª¯ ¬¹&2åû…ü•Vse­•¼=o»fwFûöÙ÷‰Î7âØظ“œš+ãl9¬y~6×_=7Üùqå­±O!DÛÔBoqj<ßÈäe°4 (ÜÂ÷ÜÎ_‘Ý ÷u ()†èøš{í舜<’@-¨=¢¸¢·–7wY ç7žZ`aê˜n8åîä·¥ÿUÌ2¶Îçàçà4¾ýü%_§G¿gÁóÅŒàEQÌ_,ßÞøtSʦ—çóÆ„KˆÐ¦²î—UT}ñí@ÏËúâ©N{…´ —îcˆÔŲӬ¿ä]¾3L¡¯WqÿòÕ×›Èt}îaá£ÔdKC§‹éc\φÒöÇV=æ9ð‚ë ÚgP–>„µ¬ÝiÁj²„öðG§ÒÚÕæ`®n²à¸Ö鿊øOyà©dYU¸ |„wî‹<Å}~Uhl)løw-ÅÀê&НDG/5¦Ô,Šj2‹7ΚÖKgÖ?'m£¶æ¼];¿_ÊùÐgmáçoSNZºiã³9ê×@ ¨k²‚ìälÊ{£'›žz€Oâ+@߉_YÀ˜&ÖÜ´œ÷~ͨZµßDæß\ÈëÏ­¢@9Ì׋V3èÉÑøjšÖvͯûöI¶‰}bÍâïÚòRßþŒhÿ9KßòÌÛ¥LØŽ²=ËøbG•€!²/ÁzPëÚÖû«B´––û|¯kÏÄG ç©WY•P@b̆¾îÕ6îAîæ]u–XíÁà[ç²åá·ØTñ+X¿â¸Wø¾›™çè§qàÒ9W²æ±åL{ÿ䫽ÕÏ PVVß«O¦qÇh=ÊÆŸ–°±ÎÃú^3™=´á{bªÜpËÍ}yàýí”–íå‡7öòCÝ|†sÇœÁ¸×mc'Fô6°acM]=pA0õfß3)KåDøà°3¾ú"ƒ íºã°,§ú›t_úöô:þ«Y[Åf+VÀTvú9vžÌÔž›øx%u-_½·ö„%4t¾òÒê{ªžû±tFýs5‘#é¢ù˜ýV(‹ûO㪞ÑûµC›‘‰(/,Ç hš8>Ͼ~õQcô ĉÔG–ÜÇôUÓyçåÁ˜KJ±ZÒÌJëQy”ïGU|50àú+èÚ«‚)]Vóá~•qKøh}_¾È«imw&›XŸ3Ü·›Ö'ÊIm‰ÆÑ·OeÃÃßrÈ ¾eá†:¯w¿ˆ;gõÅE¨ÚØû«B´’Ù¥ñÄ­¯¿Ç£×¢wˆ{õ-Ï´¸¶kO·!¹çõxqFäq7T×x_È=¯?ÇœËÐ%ØG@åäCûîC™p÷«¼|K\ÏÙ|4Æ.Óyö™™Œè‚‡ÔÎþty/>z Mþ™‹v£y`Þd†ûbP©0¶ëÌÀñ÷ñÊCcðoÔÇ|G>Àëó¯cx¯öø:© NÞ8ñN^zy.C¼O<¬é4¢Ï±3©îý¹0´1óm›Z–·.ªùÓ­3<ªžw ìŽ_Íã.݉òoò¥nÕUògÌ£o³`öåDµ÷ŵúzƒ;]‡3ý¡7xbì±¹Ìç~,IÿOãw ÌŸÆ ªù»F¿†^û8ï>Ͼ~õ1tÎc»âÙ`÷6¶V²V/â«CÕ§Lƒ¯bZ”*/æ¦êZ® v~ò[ lMl»fvÆûöÙö‰ }‡I,xý~&íFˆ·àèB¯1·òâsà~l·­÷W!„h*E9õ=i¢££0`À¹®Ïy£<ö-æ<¹Ž ÛýŸ±`°Ë©Ï–÷¨×òÖë“”ùt¢…5z|Š3'û¶Bœ—ä­º¶¼Õ<9÷=öUžÃ™÷­ ôrÀVÏï_mªþyÕ z‡$XˆsNƧBÑt~ë¡öèÏ”KYð[ä­á•9k0¸»a+(¬ý»€+f1&@šQœ{2>…Bˆ¦“£b}TÎôœñ<¯„/ç—?Ö›œEAA!Zgo‚C{rñøIŒéí×èŸo¢YÉøB!šLæü !„B»!×õ !„B»!áW!„Bؙ󛟟߫B!„¢–‡‡G“_Ó"á÷L*"„B!DK“iB!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!ì†C«”ªØH/*'ߦTý­ÒèꈛDq!„BÑ‚Z%üš RýÍöÖylðÈ!¬Ð*ÚfaC\Æä°¥Ð‚Y«§»¿óµgº·CÕ²æ\F/Ž'bü@Þñý?NÏÙ [|˜Á“ð’wón§µ$A_¦0ñšþ<â®jÖu !„B´%­’uÁ,éƒwÇ*kÎײ±{g ý—OD8Ë&Dñï%í¹\É䆟bù¨èÄå…B!„¨_+M{°Ÿ]JN}ËXL¼SL‡~ýùªŸz\è„ù›¼¼¯„™«B!„¢açþ̯bæÏõ;¹tw è=yl€7~§\ÐF±@á¸s¼ZæéŇáú:É]¡¼(‹ÛÞŒËÂ5>á‘d3ÖêgÍ%y<ùÇVü­AýÑf®Jck`+ãµo׸ÞD€RÁG?¬AµhË*ª^[”‹ëÂí,*>áL³9—Ñoå…´,æþ°Ÿ?ó(lfïÿ»ƒö­Aõþzºýq„嵯µq þ ¹õÂ5èogÆÞbŠªç í÷Å/k1ü–]çÃm6¡úê{¬ ÕŠrŽ2óÇM8/\‹÷7{x*õX[ !„Bü?;Çá×FÌÖ.ßS z/>˜ØƒgúugËØ.<tÂ|_­37‡ë8´mËâyå`ûÊl(¨hçÉH/-šÚÕšùxm:.½º³erõ0ñâ¿Il¯,…<ðãn^*õà…+¢XIŽä‚?ÒH@ϨöŽd¦j,%ü‘XMü‘olL.¢ÄÇáÆSÌ…µ•ñá¿Gˆ÷ â…^Nm¥¼½|'óò]yê²(¢¯ ç²òÆý’Àf Tä&sÕÊLÔ:³bB$ŸvÕðóq¼šg«¿ž¶:eª´Œêê†5=“Í5Á¸²„¯WÐ¥K;"Tõס²8ƒ)?ųLëLJãzóUoGþZ{„’~…BaÎñ´5;155Ÿ‘#º0˽*ørÒ²ZF_ÔõíRy/>‡çþ9ʃ€›»ÓzµgA77|jÒ²=úvá™0Z\hß߇w~)!Ý…)|VêʸÑE¸éXƺŸRù¢ €y¡xÅä]LPI1Z¦;òßÑ ,¾jÖ§š õ$ôT¬6´]zð{ÿªieY‡x-×…÷® 㧪²úzªØúù!ÞÏnÏ»ÖbRTFìîË%Î*hg$À«G…éõ×óI§šBU´ öc°õŸgV26Äòü,~,uæîpÖœÃõÔ!”'²SX¡ñå·1¸BàJW¥˜Žk,ÍÙÑB!„mÒ¹ ¿63Ë6îçk·0>ééÏ7ý÷:µŽ¡Ý:2´[G›…}GsX²;…7ÿÛÉÊ¢(v qÅ@­¥_;Úê—©4ô*…ÌÜRÊœ}ZçÌ­“§'‘št¶˜¬ý}¸@ǯ¹†ïÌMíÊù)ÉDNW5¿:0j˜ÇSÖÏŽµóŽ òŠH­,b֗븭¦8E¡Ì¦ ”Ú0r£[ 7¾™Ã}âÅ„ÞtÕC|õÄ©N±Onö³qo¼ Sˆ‡e“éÌ$éõÕ¡’ÄÌ 4ž¡ ¨,­ÂÏß“pufãúD!„â<Ö2áW±°)©„àw‚¨à—ÿv2!®œ™Û¥3ô ¯¢,'™Y;îJ?P©µt òç¥ _&¬fðtvpe€J³¦i·èÒ `Q3S|æ%™ØRPNH¨+½}\qÚ›Kt¦šµ÷zjN½•w‡cåÚÁ_&u$ê„–Õé´hÍq`˜¿wOo"m…|—O¹/ýt«³»»3že&b¬Zü:ü:|l…¼°>™uféÉÉ<¸«ÿÐ@ž»¸'ÛnÈ;ž&>Œ+Å¥ÁzÏ/ÈŸæ<Îà‡27æ†êÑ4X5¡~ŽXórê\H§•‘ÇáY!„âÿP‹N{ÈLH࣋'tå†&ü„›ÎÝŸÇÛ§0ãÏ”E3ÅÏ€¤eðLŒ… ‡é˜ë_«03;¹wÅaŒƒ}éTYÄ;ÿ¥’å׉<ªêãàMèÚ#ü£ñâN75*­ c]+¸'ú]äŠW#O‹:ù2×#'þŠÇs¨?½lÅ|·ý0Òž;Õèm&mI%A݉;u”ææðMŠ]tx7TϦäªÜì{€™RqìÎ%ÆÆÕ!¤C0£7ícú ïõõÄ·8‡§6a9õÄ!„Bˆÿ+çdί«¯'C›x’Y­gúèþxï9ÂÓ±G¸a»… µÁžîÜxI…u_•Ö×'öÄ}mó–§’¥ÑÓ¿c'Ö_HXu•t.ž\ê|„ý/"u€JÇ…ÁŽ«fb žÓLz8™Æ™ÇÆ÷Æøß!žù+£6-=Û‡òû° :«NüØ?ž»wÄqñ&­£—Fvç½tjCƒõ<~Ãt\ÒÕuz1£{xûÁ†êàÜŽï'Z¹sM³~MBçîÉûà³6©±[)„BqÞR)ŠrÊŸJ‹ŽŽfÀ€g¶Vs.£?ÙÃ?uÖÖ§{;ËùE!„BÑjZæÌ¯Î“¯¯íKBEõT¨Txº9IðB!„­ª…¦=¨ðvw9öU¼B!„mÀ¹ÿyc!„B!Z‰„_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØ ¿B!„ÂnHøB!„vC¯B!„°~…B!„Ýð+„B!솄_!„Ba7$ü !„B»!áW!„BØó'üZRøîŽkylƒ ¥¡e+öñîÌ«yøß¼†—m9ÿ<ƃ?¤RÙÔ—–Åðòôé¼SVý€‚iÃc\3ë#V´ú–„ÅÌ™<›O™)‹y…ë&?ÀYÖæªœ8»öoëÊã2÷ºiL<™ÉüEöy64šg|Û(Úµ„GnžÆµ×]Ïÿ@²¥Eª+„¢…8´vZ„®=“³ªf]±…¬ýY˜ý›u¥Íèìê§vtàqÄÍ FmuÅQSˆ›áüù|ÔúÚúø8;ŽÝæ²ð«9dýñwÿÛÚµiºfß¶¶~ûÅc^âó)!h[¦ªB!ZP› ¿ÖÜm|»p +š@¥Â%b 7ͽšÞîšÚeÌGWòμ?ÙžZˆÍÿnzàV.Ð ëŸç¾…±”cÃl®$|0³6[ bøqÑV,Âb÷žWqÛœ±trªZÂV´‡Ÿ-fEl%*<ºâú9×2ÐW ÖLþZð ŸÄ• p?×ÿ¤A¥ñfÄc¯0+BN¶ßš·•/ß^Âú43*l8ø冻f0Ð[Ó,õS;ºáè`ÄÝ A]é‚Áѣñõ–ß@ýK¶<Å?Ò×°‡méLœèî¿ÖqÈa O>3•Žú†û§~ ©«ùäÝoÙ”V†bÓxÁõÜ;ë"ü´UÏ—'þÉ{¯/eW±À¾\Ñ?Ï× æµWÆá§i |K_ßûG.ûŽ-$e¥“I7®}èn. Ö5Kû×W¾bÚÅ¢ß"÷ê—yx„¥œCß<Â3»/äé§'ª«ûlu_ßó(±#&á·w)ùyä«»1õÛиˆwvý×ÀþÇÙ¯†Æw£(ÊÌjÜ=ÚÖ›§BˆÆSNcË–-§{ªeTf(­¬ËËWÖ?9E™2¥’mÚ¥¼:s®òE‚¹áþiˆ5[YùÈTåæww*E6E©ÌùOyöºiʳ›‹ªÆ@eº²|ÞTåÖOb•b›¢˜3Ö*oÌ™¤LºÿO%«Ri¸|s²²ôŽIÊ”yß)ñ¥6E±)Û^Ÿ©L~«RÜíßàöÛ”²ƒ_+÷Í|\ùý¨Y)‰ûT¹ãÆg••™•ÚþÛ¿fÿºÿåHyUÿîÿìVeÚc«NØ¿*•ÌßïW¦Ö´[£ëßÐö7°ÿíøR”Æwcû)]Y~ï4eþú"¥1›%„¢íi3ßiÛ ÷²6Áƒác{ã¡|pe´û×r¸fš,j†]Bww h<é3¦º#Ѥ4bάRË¿ݸx ÚiU¨t ›Ðeç’*@)ÜÍÊx7.¾2 o-ààÍ ¹o±è‰KðÕ4¸úFnd9[ž»‰iÓ¦1mÚuÌ~s?53Þ~5:£…{W³vW"yfG®¼‹ÛÇ4ßW¯NQ<ôÞCD9Æ÷Rž~}kOZÖ_~cúÏÁ§+í]q÷pÁ³c(®z¼ fòËl öOƒÔÞ òcÞš‰‹ 4Ý`#;Ý„  ,‰í©.ôŽ“ ´ísÕojº¶Qå+„Žº˜0ƒ TN„tõ¦2'‹’f˜ûÚpù*Ã'sÿÕðÓËoðê[ÑD̽ƒ‹kgCÛß@ûWÑtá‚õ€Ê@ûÝÑ%nm–ý«Á×7°ÿíøßa¥øÈf6g»ÖNßÌSª„Bœ+mæ›;[i%8áít,iª^­ÉU( ÐàìëRX4Žî8VfSÖˆ«‹ley”X²Xþø,þ©‰üŠ…rºRhQ°–æR¬ñ2+_¥uÆ­9'õ©ôô¹ûUævsLÑ/1ïûêú5´ýNZ:L}œ{œ~bÅç ø4ÅL»ÈK¸vÖ4†úëš©‚ô†êòU8ê>Wù ÖP98¢U©P©Uhô¨PP©”ûǪ©ß=2ŸSª®0Òw¾™WŸ]ýáÄBn̯,ù9šäZÁ”jÁeHuûVQ¢8âêX³r .þ®hvW?ßPù:§c¡G¥Vbk–‹*µýh ¸x }¾ŠÕnÓx«·[+Vëßþ†Ú¿Š£§±v*½3:Kf³ì_Uõ?½†ö¿Ê³_Uêß ±päË{™÷K>Ýf¼ÀuáÍµÏ !„8×ÚLøÕ½pR•Sb画§­8‡wÜõ5Nå…åØpCXË ¨ppÁ؈­P}pÑû3ôù×™|r¢U,žUå—Z©¹ †RžCZxz7tìn• ³;@ÁÁùX=³ý*½?'ßÎÀÉ`-Nfã/²ð­"ž]ó’U_ù^ê¿Ók¨Ð1î‰w¹ÄZvŒ¸Vg[ÞzÞ~ãoÜç¾Äë´C«dó׃wñWMÝuÎ8b¦Ø\„¬˜2MµgÞ,¿…¯èoÔö+¥Ä}û!;;Žç’‚å,ücO ª:óÞÀö7Žò‚²ÚýËVV@¹¶yö¯†hŒõïú³_gOK‡éoðaÏ¥<ûê[,ëó"“Ï`;…B´¾63íAåÖƒa¬ùm'yVÀ’ÅæåÛP"GÒÉX³”•ä5kI,SÀVÈÞ•1˜ÃV}MÛÐú]»1*¢•Ëvk”2’W.äµob)Q@åÖ“a¬^^]¾5Ÿ=ʃ ·QTó­°JΊR2(S@±–a*¶4Ë™¿·ßšÃÚ7ŸbQtV@ãìOX¨ê:s2Z°~ •߸þ«gûèŸ*]ÝñððÀÃÃw}íVÊ (¶¹Ò¾ƒZ• ÓþU¬IµPY^‰ P‚‰l—϶ÍI”)P™Ío³kÃoãÊoh#ÑþÖ þxâfnya#užh¸|Û>æ­Ma̹k7Ý5êŸ_ci|J#¶¿q¬$¯ù#e (EÄ®ÞCe‡Ͳ5¸ý ìg;¾š‡Ï#¹È;ƒ])åçªP!„ͬ͜ùEãËÈûî#{ábî¿ù}@ƒW¯ÿ±wïq2ÖÿÇ_×Ììîì¬=¯sNQä.ºÉ*t@âþuºcSBqKÄ:¤‰JÙ"6¥snÕ÷NE¡$m•r§”SØeíÚ]»;³3ŸßkQ7;£],ó~>û‡½æº>‡ës™÷~æs]Ó™±wµ ÊðQ„“†- oOÂOY¸Zs×ÈVÄámñ\94™ô9Ï3ªß g­+è6¨.ëpùÉ#90çFö›Ç Ñ:’œ|ìš_u¾‘ZÓ㎮{X’Æ1î–rxä‘¿öÛãiv]ÖÎÍól8,ƒ£JsúnCü‘öŸÊúù+¿ôúòw|çÇ_õª^MÏvŸ3gÜ=¬©O•‹¯§w÷FL[ô(3«MâÞkjÒiP›R&0`Yz' IDAT•ë$Ò©m=Ö~ Xe/¿Xýo¼ägesÀ]øÇPì§|oÆ*RŸù/— ŸÆeÑ6¬èŽ »m£RÐøñÁ4óÓþ»"©u›ûxgÒ0~Ú»Ÿü˜–ôÕš8ý¾„ c_ã7øÜnŠxŽ{ú¼ˆÍQ“›šJ÷ºö߉Úï÷ú+ãø*76ì`À€ÖýŠˆœ…,cÌqçµÒÒÒHLL<Ýõ)Þßù¿ä‘¤uNeÊU1zƒ’ãð²çÝQ$¯¹™ÙS®&&؉g‹†æÛžó˜Ü:R×̉x÷òíü “ÛD©ŸDDÎBfÙCYw9…>02¿[Ί=±4®¡7'9ÌËž÷dà}‹ÙZh0…;Yûé^âšÔ#ÀÇЊ€-œ¸h‹Ì_ÓqŸéºˆˆÈ_Rq–=”‘g×{<<ñM~É38"ëÐò¶dºÔÑ )RÂNÕ«zpÝÆÙL°Ëæ ¶IO†Ý\KßÒ%³"iÖ§ ?:žÛ>°ãªýO&MN¢¶‘ˆÈYãÜ\ö """"rç̲~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†Âïÿð°ýõ!tú&»ŠÎt]þÌǾeã½x'¥jž­/00é.üì&ããôNÉûéÞâ&›ÏÆu%))é?}R¾#ÿäJ©ÀýüÀ3ý’Hºk?Ÿöo)(ýü•z~DDD¤\œ3_rQ~Të0’)—GQÅ~¦ëògÒ7§ã®þ×ö¶9£ ·;‰·aóFá´g~øï+š+þ7Wrˆu“ú1+nsïiLØI—R‘ûý÷#¾æ|j¬eùÖÞ4htò-üëJ?¥ž) ¿GøØ÷ñdFÍÿ/7žê=™‘Ò…š‡{(ïˉÜóvMš‡ǺÝ5éܹ2–~ÆÏŽŽ<8¹çÛ¶ñê½÷³©]ª}¿Ž29`kL‘ÿ¢}â¯òî_Çë© Y¾%,‹È†é7¸+—ÆØCÎÚÉ ^Ô„ñ·ðZê;lÚï†yfjâÍ^–NÍüò0$Óç-;–=vãg@ÃÀœÍÓá"&ÜŽ­(’pg%\ŽÀ¿Û×wð;ÞžûnJ'¯Ð"¶ñµôØ“–UBüöžm¼:|"¿vú'1ë¿d[únöÒ˜žc†Ñ©V(`(øíf§¼Á†Üpbk6çú[yqåLü&ªÙ …;W0Öë|±+ã £f›> p5Õýv-“Ë}͇ҭàiæ-û‰Û]BxñF?åƒ7k#oÎ]ÈÇ[âñBÌ%7ó¯7pA„å¿}^ÿ篬çGDDDüÓ´Ò6Ú?Èó¯¾Â¼{ú§­–Í"oÛš}ˆÕÖóò§uø×C÷Ò$ã3Öüîl8¬Bþû…áÆû¦2íÉ'ÙäG<óû}€w/MOaUÜm¤<ÿÏÏŸF×¥Lz ™> g•ºTÚõf½²ŸkÆÏçÅ‹yã‘k‰·öªtš4‹áB©Ñc:/½ú*¯¾43àà `…Eâ sfasFárEðÄ¢w+¦Oã#W7¦>û¯¼”Bï¨U<9ý#öxý÷_qÿäðí§n®5…iOÏdhýxååoÉ£¸–§¾ÄÏ—ŽaÎü9LÒßßB¡-;€o?«SŸe}­Á¤¾ø gÞNÔçó˜¿>‡ã~Eáq˜œïXº.¾ò".¾ªžuËØœwxoå{3X‘2Coá¡gžeþ܇øGþb[ðŇðÓ¾Î_™ÎˆˆˆDo­'ÁQù"êF:‰‰$îü:D…E’îæ@¾ïð+ìœwe+j…V8uÿFèo_±£|Ùß³jk,×Üp)±vÀQ™Ä[²y¿^Tk "Ì[Díî}¹ê¼p,À²Êqæ/¢cf¡YØ«tâ¡”\`v6Ùß²ü§hÚÞØŒ„À‘Àåƒg0wB‡À—7u®mKýp ¬j_”@Ѿtò¼@þ6¾ÞI‹«aAHÕ+¸¹UGmKàšŸcÆ]M‰´ÀÛ˜Ä>2vçà+¥Èc '뛥|o]ÂÕõ]D\x¸×óѹÅáÙOùæà&>ÙMÛ[.§jˆ…Zƒ«niùf%Û h_ Êp~DDD$0Zöp,‡“˲YØÃX,Ë`ŽÌ=ÚpŹŽüEa…U"Ô³—ü"ðÊ$"Ž&E›+—w; DX`Ù°Bªrqíâà[þì„…ÛKƒ3<ð=½‡ö“k\Ä»ŽÖß ©Dt KŠ÷ 4"ìHÛ,›Ƈ|…É3N¢œ%½g'²zöoKöõ°ãXøvÛó v›!g§‡ÈVíÛÏ×þˆíâÑ\à‹F\Yßü¿çàeWé§|_~&yžt–ŒÀ²’—\D¶ÇPœ’OܾÀüõó#"""Qø-W> ²òñðågQ‰ËvW<Vûò¼Pœž|¹ûÈsÄvlÔµRo³»âŠëÈKɦ`»öABÍœeLëVh%œ¸Éu—DE/9{s(™4õe®fæ“3ø1RÚT%Äd°tôP–x|oÆ—|ø“B¥o×cö!³.çJ?åÛ\•‰ «Në©)t«uœÄï9Ù‹ˆˆÈ™ eåÊËö•Ÿòk¾sM+¾£¨^"µÂÀо˜võ³Xùî7dzO:k—¬Ã4mÏ®oÙuÂÁ{È7`¼ùääzNbfñ¯³¢/¡]ý,V,9\o&럿ŸÑ©ë8غƒÒ^‹¦U°ní6ò ¥§ñ#áÓd‘ë‹¢n½xB,9›?fåNEE,{(bïšeüÙ–‰/-fñââŸÏO¦¹ãG>\Ÿ‰ñS¾Õ˜kf³üõì÷&ŸíËS™þÚ&ò=gðü‰ˆˆH1ÍüæÛ¿‚‡G>ËæB07³™}ÞÄî(¾#¿W@G ¡nsïLÆO{÷“Ó’þ£Zg¨Bû#ÈH}äþÏvâ›tfì]-ˆ xÖÔÅEo¤ÖôǸ£«ÁG£¤qŒ»¥6'µúàxL6ŸÀŒÍ%Ql½WAx«™7âÂíUhŸ<’s^`d¿Ùx¼ݨ#ÉÉÅk~ýõ߀óý”ï¨I§AIlJ™À€eQT®“H§¶õXû%`½êÕôl÷9sÆÝÚjñT¹øzzwoÄ´E2³Ú$2'œ0÷üΧÿNµN#hxÌR+º¯‰bÂG_±ïšŽ¥–-ž+‡&“>çyFõ›ƒÁà¬uÝ5ÀUΟˆˆˆÄ2Æwâ)--ÄÄÄÓ]Ÿ³—g‹†æÛžó˜Ü:ò­Ù &^ö¼;Šä573{ÊÕÄœö=Ó勈ˆÈ© eRAxÙóþƒ ¼o1[ ¦p'k?ÝK\“zDœ–ày¦Ë‘ÓAˤ‚°Sõª\·q6“,Á²9ˆmÒ“a7×:MKÎtù"""r:hÙƒˆˆˆˆ -{‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†ãLWàìåeÏ’QŒøüFf?Ò–Xëd·Ÿ{<[_`Èè5´|t=óf0`ò^z§>Æÿ«b?æU^ö­|”a© Y0™+*þuþF¦™JZî±/õâîÀ”Ô4 oÖFÞ|f>K¾þ|+‚šÍþAßA]ù{ì±Ç?±R÷ üÀœ½í ìü‰ˆˆœÝ~¥Ü؜фÛD‡Û°y£pÚ³‰/ùpÁGaÖN¾ûäuü{#…¦áwoJòü7ŽþÛä°~Ö(^ˆnK0À—ÉêÓx/äv¦¼t-5‹¶òAÊD¦?S—Ô±—åï ûû+߯³¿}¥Ÿ?‘sƒÂï†Â+˜?ëu¾Ø•ñ…Q³M†¸šj!ÅÛó}Y)‹øöP%â«]Äåu<˜cö÷·=gíd/jÂøÛ x-õ6íwCƒ<3µñ¶Ã3wsòñ–ƒx¼sÉÍükà \Qœ|¼™_ñòÌ…¬ÞåÆÂ‡£zknz-ìm?ÕlÎhœ1ávlE‘„;+ár×ÝdAÊý¯‘ר·'Wcáô-¥É·éUžÛÔ”AÓ/À `|TjÞ-ÚQ;ÜÔ§Í5µyåß¿‘Ut9Q!~*wRû§|‡?ÚWÚù9W(ü–ðígu곬¯5†ÔG.Å•ù›Ãüf͸¿e$–w7>ý2¿µ˜ÈÜ>pændÁèUx¢ïïo;Î*u©´ë?Ìzå2ºŒŸÏ„óÂÁ, ðf°"eÆbê3m¨bv³üñ±<¶ 3†4!Â*dËÏòE{™ñ`c\äó˻ϲôë½4ëXƒüm/]áæ¹ {pû¼ÚR—Ó!©–¿#€‰+ÌET˜…Í…ËMÉġݚ±©­ðlK;g',ø‚ªÝ§sñáà=æ7Ü|ô5Þ ¾Z±W£žTö_µ“Ûÿxåûq.´¯´ó'""r®Pø-aKàšŸãr›‹ ˆmLb ïíÎÁG$¶Ü_X·;ŽVCëã²€ÈÆ´»"e?ïnül°…Gæ-â¼î}¹ê¼p, 8ù‚9¸‰O¶DÓö‘Ë©b5¸ê–¼þÄJ¶6¡±ÓF¨ËAö×+XµÁEËÆu¨ãPî>zt?ÛKÖh sÞX¶>ŒhƘÙMp„ƒÝÕ‰‡R ¡¯•-aÈû~1ä^ÁÈ+âG¦÷_/x˜ç÷¶bĽ#üd‹(uÿÊ/“ ܾr9"""›Âïöoü ßNc{žÁn3äìôÙªx«¯ ›C8‰v–ÄÎ(ç‘ðào;– +¤*×>|áËÏ$ϓΒñXV²“ñPÀEd{ 8C¨×c<÷F¼Å‡/NbÁ7U›v ç€^´® øÛ~:Ø ?¼ÄÂrà<éÔ˜lÖ¿³žðk&Óà8ë Láv–Ï|˜÷\Îð)·sYÌÉÅS¿ûû)¿Ì*tûÊáü‰ˆˆTp ¿‡ù2W3óɈü)mªb2X:z(Ko·…Eâ$Ÿ¬`ŠÈËÈÅàö£ì„g ®ÍU™È°ê´žšB·,1°ÂªÓ2énZ&7w;k^z”Ô5h8õ:lþ·—¦<–=”“ó+¶DpYŸÿ]ªa ¶òŸ©“x¿Ro¦Lí@í°“[Èþ¥•_Îõö‰ˆˆTtZÑw˜)È"×EÝzñ„X>r6ÌÊŠ ŠðV¥ú4«’Éš•?“g hßz–~EIVô·Ý+ª1×6Ìfù;ëÙïL>Û—§2ýµMäÀ»UOMdnZ&^À^©:õëDã°NÒþ¶ûQ¼ìa1‹ÿéçµ'N[ðpÿ¾m¦6—TýÓlµ/›¯æLá­[yhÄu'†Þ=¼?¡?w>²†,sòûŸ°|Ç?WÚ'""rŽÓÌïaöªWÓ³ÝçÌwkªÅSåâëéݽÓ=ÊÌj“¸÷ššüãîîü÷ÉÉô[F|˹¡}=Ö~åÁk‡Ÿíþ&ñlñ\94™ô9Ï3ªß g­+è6¨Añb{<Í®kÂÚy£¹sž ‡epTiNßÁmˆ·øÛ~†ûœYŸ¯éý»c·År帧ò·âÏà=öçªý?O7ðe­ã­ÕÙâY†õ~îè†J‰Ü?+™¦%Ñ/ùYÙpbþÂþ'*ÿˆÿœiŸˆˆÈ9Î2Æwþ*--ÄÄÄÓ]‘S¦"Ì Šˆˆˆˆœ ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4gºGþÄü1SX‘^ˆ¯ÒEt9Š.º°Ît½DDDDäœQqf~Ã.¤ÿS yù•çy ÙNÞ^ô‡ÎtDDDDäœRqÂo +”øš‘PàÆgÎteDDDDä\RñÂïJ¾""""R¾*`øµY»Î]«IÛ™¯,""""妆_‹ˆ&w2ª}s‡÷aÌ{{ðžé*‰ˆˆˆÈ9¡â<íá…[^cÆGNzNYÀM £°Ÿé ‰ˆˆˆÈ9¡ÎüzÉúiku¤Ý… ¾""""R~*`øcË^1+'""""g­Š™/KîrÓ7\ˆˆˆˆH9ªxá×°û×,Bâ# 9Óu‘sJŹá혯76±—Ñ÷F8ÏtDDDDäœbcŽû(Ý´´4Ow}DDDDDN™Š·ìADDDDäQø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ qö„_Ï éɸÏs0þ^[ø#³úvå¾O2ý¿ö¤øØ·l£ï¤èdwÍßÈ´^I$%ýé§×£|“ÿWêâeÏ’ôºoʵ‘¶¿>„nCßd×I7² ýx¶¾ÀÀ¤»Xð³›üÓ;i$ï§{ÿ‘‚UÙú¿¢+ø!•Á½{Ñ#)‰¤‘KÉ8ˆFùŒo7,dlÿ^ôì݇;î[ÌvÏ)©®ˆÈ9Ëq¦+pJ„Ö%iüTÜ•£±ÊõÀÒ7§ã®þw·9i9þYF5 /×Z•/Õ:ŒdÊåQT±Ÿì¾eë›3šp»“èp6oN{6ÑágÏßgg^Çgçl<˜ÔW’þþ†}r¦ksòÊe|û²øêõ¥äv|Œ»Õ&äÔTUDäœV¡Â¯wÿ:^O]Èò-9`YD6ìH¿Á]¹4æh sÿ¾œ§G}À×;³ñUoC¿‘ƒh[#0d­žÊˆÔMàÃí.¢Áày<Ò.îHöfmä͹ ùxËA<^ˆ¹äfþ5ð.ˆ(~…ïàw¼=÷>Ü”N^¡Elãké3°'-«„€w/K'fþy’éó–Ëž@»q3 aXÙïÙÆ«Ã'òk§³þK¶¥ïf/é9fj…†ü_ßcVÊ"¾=T‰øjqyÏÑ™mÏ6^½÷~6µëBµï×±ã@&lé1ò_´¯@ÿúØ÷ñdFÍÿ/7žê=™‘Ò…šŽëWýcsFãt¸ˆ ·c+Š$ÜY —ãèŸ/Þ̯xyæBVïrcáÃQ½5·½– v¿íËûr"÷¼]“æáß±nwM:w®Ì†¥Ÿñ³£#NîÁùaþÇGé …;W0Öë|±+ã £f›> p5ÕBŠ·üö³SÞ`Cn8±5›s}‹­¼¸ò ¦?~Õì~Ê? ý_Zù&gsGÏ`×iÜ×®2vSÀϯeò·WòÐC©Zzûýö¿Íÿø-KýQêõOÙÇ—¿ñã!ßm#ºflÅúÏ[DälbNàË/¿<ѦS£hylOsç¬4“YdŒñ¤›O§Ýnn}èS³ßkŒqo7oÜÝÅtºÀl8PdLÑ~³&¥¯é9þ³Ïû¿ÇZ2¼§óñ~ã;ò»t³l|/Ó/åS³Çí3¾Â]棇o3ýgn4¹>cLQ†Y>áVs׬µ&ÃmŒñd˜5Oõ3ÝG¿kv>†ï ùüžæžï0ž“mß¡ æ±Þ½Í´ ‡Ž¿Ý½Ý¼1¤‹é6j‘ùéÏßA³.¥¯¹uêW&×cŠv™·‡w7ƒþhò|Æxn0ÏêbºŒùÄdúŽéŸäÅæ×cŒïÙüü ÓkÜÇÅýã¯𙃫0=ïYlvzN¢~eícŒÉM3“î˜dÒr)ڳČ”j~,(ÙX`~L½Ó œ»ÉäùŠÛ÷ó;3̬¥»ŒÛøo_^ÚDÓ­ÇCæ³ÌfõƒÝL·–›Œœ 找ƒÍK[ÝþLJ?Þ ³|lÓÖ7æ Ï˜¢}Ÿš‡{÷2¯=X<‹v›%£z˜Aó7™\Ÿ1î=«Ì“»˜.ɘô"ã¿üSÝÿ~Ûï3ù[^5#úŽ7ïýî6y?,0CîxØ,ß[Pûýö¿¿ñ{´¢fï{ɦGI¿\í÷sý—u|ãg|zžv›%Ã{™V44KDDþW…ùLÙ—ý=«¶ÆrÍ —k•I¼±!›WñË‘5±6j\Õ¿ÅØÁÇß;þÐ_ÓØQèÿøæà&>ÙMÛ[.§jˆ…Zƒ«niùf%Û ÁdËòŸ¢i{c3BG—žÁÜ þÂÇÿ'jd_Nîó‡5¿RäHõƒ:×¶¥~¸Vµ/J h_:y^0¹¿°nw­®ªË[dcÚ]‘À«fç¼+[Q+ °Â©›ø7BûŠ…ö¯¿NÇŒ»ši=¶1‰5|dìÎÁ¿¯wFÒâªDXRõ nnuôüTþ)ìÿå[8$‘ÜÞšö$OÌH£áà!´-¹8üµßOÿ;ñø-{ýýìïçú/ëøüŒï@xÉýu-k3¢©_5¬œ—t‰ˆ óÉ™ïP&yDq4ÎÙ\ñ¸¼Û9Xh ÀN¥*‘GƒÝƒ³(ƒüîîñåg’çIgÉø,+‰üÆC‘í1xí'׸ˆw-ß ©Dty.ªó»æ×"4â蛚e³Àø0€¯ ›C8‰v–TÞ†3Êù§;m¸â\G~g…U"Ô³—ü¢ú7 †O\¿òa',üpý,Î?tSõzŒçÞˆ·øðÅI,Øá¦jÓôЋÖÕCý·°NB, Ëfas`a°,ƒÁø8‹—,ûoî(¾Ã(ìÂþ<1ñºÃyØ¿ñ?,|;íy»Í³ÓCd«âCù ’gœD9v"«GaÿöðvåÛáTö@í'„m»ñ÷OdEt/f\}Ìø+½ýþú¿Ø‰ÇoùÔÿÄü]ÿEe_ÅJßþxøõåáŒú¿4¾íz7=™EDä&üÚ]ñDXyìËóBBñ»—/wyŽbÂJÞ¸|dà#;à-ȢЉ+€VØ\•‰ «Në©)t«õ¿‰ÖxâŠË?ä¥ä!¦`»öABÍï§œ-,'ùdø(NBEäeä™U+æ£ +ÿHÿøò³()îŸÀú·b³ÂªÓ2énZ&7w;k^z”Ô5h8õ:âËØ>ã€ó¸iÂ,:xKÂŽ‹¨ÃYÆ—¹š™O~DÌàÇHiS•“ÁÒÑCYZR÷ÐJ8q“ë. B^röæP2ië·üS|G@í7‡øáõy|sþ?鵄Ô÷™xÓyÅ3ï~Ú˜ßr©)ì®Ò¯ÿ°3~ý„PïÖ'™wÉ<üÄ Þùû£$ý…vŠˆHzÔ™}1íêg±òÝoÈôžtÖ.Y‡iÚž \%¯ò²}å*~Ë7àËæûåq7hYü1©¿ãG5æÚ†Ù,g=û½€ÉgûòT¦¿¶‰<Vô%´«ŸÅŠ%‡Ë÷f²þùûºŽƒ% Ó²ꄃ;öoÀxóÉÉõ”óãÔNPÿJõiV%“5+&Ï@Ѿõ,ý:‹?~âíeûÊOù5߀9ȦßQT/‘ZaöoY+y ûÇ»UOMdnZ&^À^©:õëD㰧ϲ¶Ïßø(fÇCll,±±±ÄD†¹€LA¹¾(êÖ‹'Äò‘³ùcVîôPTP„°ÂkÑ´êÖ­ÝF¾¢ô4Þ]“qäüV¾¿FÐÿÞ=¼?¡?w>²†¬c6ø/ßGÖºç˜ñE}íE¿ä®ØÞžÎ?åch`N<~ý6=Ðþ;Qûý\ÿ§åúñ+„¸‹ÛsuÂ6ì(8]…Šˆœs*ÌÌ/ö*´1‚ŒÔHîÿ `'¾IgÆÞÕ‚( ÀGN¶4¼=a?edáNhÍ]#[H„·ÅsåÐdÒç<Ϩ~s0œµ® Û ¸¬Ãå'äÀœÙo6/D7êHrò±k~]\ÔùFjMŒ;ºìaq4JǸ[|äPÉšß?ü2šö§ò¯ú~öuÔäwwç¿ON¦ß²0âë\Î íë±ö+Þ#oâ!ÔmîãIÃøiï~òcZÒTëÃýSzÿúö¯àá‘ϲ¹ŒÇÇlfDŸ7±;?1àü@XÆþ)=žf×5aí¼ÑÜ9φÃ28ª4§ïà6ÄоCþŽïo|ø«^Õ«éÙîs挻‡5Õâ©rñõôîÞˆi‹efµIÜ{MM: JbSÊ,‹¢rD:µ­ÇÚ/«ìå  ÿ—ü¬l¸ ÿŠý”ïÍXEê3ÿå²áÓ¸,چݑa·m`TÊ?>˜f~ÚWD õ?ñø-ú} ƾÆoð¹Ýñ÷ôy›£&7?4•îuÆ©î‡ IDAT쿵ßïõ_ÆñUnlØ-À€­ûù ,cÌqç•ÒÒÒHLL<Ýõ)Þßù¿ä‘¤uNeÊU1ÁñáÙÁ¢á£ù¶ç<&·Ž Ž6ŸÕ¼ìywÉknfö”«‰ ö¦ñï^Þ5‚µŸar›(õ“ˆÈ_Pa–=”•qçSèã!ó»å¬ØKãÚzs ÂËž÷dà}‹ÙZh0…;Yûé^âšÔ ì^C[8qÑ™¿¦ã>Óu9KUœeeäÙõO|“_ò ŽÈ:´¼-™.utCˆTvª^Õƒë6ÎfÒ€%X6±Mz2ìæZú–. œI³>]øøÑñÜöWí2irµ5ˆDDvn.{9ŽsfÙƒˆˆˆˆˆ? ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚Æ9ó%evZ¾^ÕǾe˜–=ˆ©IçöÎ÷l}!£×ÐòÑYôÌ›Á€É{éúÿ¯Šý˜WyÙ·òQ†¥0dÁd®¨tø×ù™>d*i¹Ç¾Ô‹7ºSRÒ0 ¼Yyó™ù,ùúwò­j6û}uåï±ÇÿÄJÝ?€òsö¶/°ó'"""¥Qø=­<¤oNÇ]ýÌ”nsFnwnÃæÂiÏ&:¼dòßGaÖN¾ûäuü{#…¦áwoJòü7ŽþÛä°~Ö(^ˆnK0À—ÉêÓx/äv¦¼t-5‹¶òAÊD¦?S—Ô±—åï¯ ûû+߯³¿}¥Ÿ? „ÂïŸíYAê˜÷HÛ–IQ•Vô3„5‹¿;Ô»¯§.dù–°,"v¤ßà®\S<óæÍüŠ—g.dõ.7>Õ[sûÐÛh™`ï^–NÍüò0$Óç-;–=vãg@àÓ–ebsFãt¸ˆ ·c+Š$ÜY —£8µ™ì/H¹ÿ5òµãöäj,œ¾¥”#ò6½Ês›š2hú8ŒJÍ»1°E;j‡Û€ú´¹¦6¯üû7²Š.'ÊßׯžÔþÇ)ßßáÏö•vþDDD$0 ¿Ç²<üòY:]ÆÍfpL&Ÿ>–Ìs/}K«ûšáÝËGÓSXUs8)Ï· ÖdðÙ“£˜þtMf¿¼û,K¿ÞK³Ž5±W¥Ó¤YDÈë—N#å$—=nžË°—±Ïû§ !ué1í’jùK_`…Eâ sfaóDárES2qhE·fljk<Û_ãÅÒäÙÉ ¾ j÷é\q8|Ùh~ÃÍG_ãÍà«Ûq5êIeÿU;¹ýW¾çBûJ;"""…ßc;u®»‰f ,âiܼ*EËö’ç…ðìïYµ5–k^JñÏÊ$ÞØ‚ç'¯â—ü+‰‹°êrýõ VmpѲqêß8”»Ë©ja2çe;HD3ÆÌn‚#ì®N<”b=éIgCÞ÷‹ù ÷ F^ü;&½øzÁÃ<¿·#îýá'[D©ûP~™Tàö•Ëù nš7úÎèðÃbaÙl`|Àw(“<"Hˆ8zs‘ÍË›ÃÁB„P¯Çxî½ ¾zq{ßÊÉ/ðùn÷™iÊqÙ Ã`9p†‡œü0Ù¬g=á×t¤ÁqÖ˜Âí,KÃS›/eø”\sr%øÝßOùeV¡ÛWçODD$Èiæ7@vW<Vûò¼P9|¹ûÈsÄVüÑ´V–IwÓ2 ¼¹ÛYóÒ£¤Î¨Aéוìò—•Dz‡ò`r~`Å–.ëSƒ?—h ¶òŸ©“x¿Ro¦Lí@í°“[Èþ¥•_Îõö‰ˆˆ;…ßYÑÓ®þ|¿û %çKgí’u˜¦ƒ¹Àx÷±êéYln5”‰qØ+U§~h;Žy •e#Ô wì!ßœG%_>¹ù*U ñûhµrYöPÜ¿o`›©ÍõUCÿ¸Á—ÍWs¦ðVÈ­LÑj'YÞ=¼?éÞïÏã÷µ"Æ:¹ýOX¾¿ãŸ+í‘2Qø ”½ íGŒ #õ’û?؉oÒ™±wµ(~Ì•=žf×5aí¼ÑÜ9φÃ28ª4§ïà6Ä™õuqQç©5ý1îèj°‡ÅÑ(iãn©}ægùŽ}άϋ×ÀôþݱÛb¹rÜS ù[ñgðž{ÈsÕþŸ§ø²ÖñÖêlñ,Ãz?wtC¥DLÓ’…­ÆK~V6Ü…˜¿°ÿ‰Ê?âÇ?gÚ'"""ebcÌñ6¤¥¥‘˜˜xºë#""""rÊè~  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~QðC*ƒ{÷¢GRI#—’á=“µñ²gÉzÝ·‚ÇýêSÁǾeã½x'E'|‡í¯¡ÛÐ7ÙuâUH&w3ÿ÷ø½ÜÞ½+=nÄØÙËÙ^pÚ:WDDD*…ßc8&õ•—˜Ù¯.!gº2g„‡ôÍé¸K}ƒjF2eD[ªØOSµÊƒÉaý¼Çø÷F¦¼¸ˆWŸI‹] yôõ_(<Óu‘ÓÆq¦+p6ñî_Çë© Y¾%,‹È†é7¸+—ÆØCÁo0;å 6ä†[³9×·ØÊ‹+¯`úã7QÍoP4äÿú³Rñí¡JÄW»ˆËëx82/éÙÁ¢á£ù¶ç<&·ŽÄÂǾî㞥WñÔã7PÕnÈY;™Á‹š0þö^K}‡MûÝÐ` ÏLí@¼ÍP¸sóg½Î»ò1¾0j¶éÃðWS-ðîeé¤ÑÌÿ!C2}Þ²cÙh7îq4 |ìûx2£æÿ—OõžÌHéBÍcFP©ýãÙÆ«Ã'òk§³þK¶¥ïf/é9fj…ž‚³õ'y›YúM8m']Åya„5àÝ/åYó[Ï4 oæW¼ÀF¨ËAö×+XµÁEËÆu¨ãPîþË%ŠˆˆHE¤ð ß¡Lòˆ ᘔfsÅãònç`¡Ág’gœD9K–QÛ‰¬…=Àðë+ÈæN¢ìoÃå<¹EÙ– +¤*×>|ÿÀÃþÿaáÛilÏ3Øm†œ"[L'毰;R7Ëfñq:n9³…ºñPèsq~›öt­IXѸ %"ÔØ©×c<÷F¼Å‡/NbÁ7U›v ç€^´®~–eˆˆˆÈi¡ð »+ž+}y^H(ޤ¾Ü}ä9bˆ ³°|•pâ&×]å¼äìÍ!ÐFØÂ"q’OV°Eäeäâ+yeaYàó–Ñà9ä>Np´rœYT_æjf>ù1ƒ#¥MUBLKGeiÀ=P:ýSVe]öàˆ;ŸŽOø)3‚¾ÝþÅß¼õÿǨœQ\?+¬:-“î¦exs·³æ¥GIQƒ†S¯+i’ˆˆˆœåô– +úbÚÕÏbå»ßé<é¬]²Ó´=¸À ¯EÓªX·vùŠÒÓxwMFÀáתTŸfU2Y³ògò í[ÏÒ¯³Žîow‘ ™[÷áLá¾X³«”G’ý‘)È"×EÝzñ„X>r6ÌÊŠ ŠŽ Ø6BppÇò o>9¹ž€ffýõOY/{XÌâÅúyí ¿Á×Eü¿E¬|m; ޜͼûÚwĶmOPÀ»UOMdnZ&^À^©:õëDã°éf7‘s‰f~+ú} ƾÆoð¹Ýñ÷ôy›£&7?4•îu«Ð~Ä2R_ ¹ÿ3€ø&{W ¢,ÀQ“Nƒ’Ø”2Ë¢¨\'‘Nmë±öK8΄ÿå¨É?îîΟœL¿eaÄ×¹œÚ×cíW¼°Å’xëͬœ9•áßV!.®.-[]ˆóÓÀ– Ø«^MÏvŸ3gÜ=¬©O•‹¯§w÷FL[ô(3«MâÞk*cÇÅEo¤ÖôǸ£«ÁG£¤qŒ»¥6öý+xxä³l.ãqã1›ÑçM쎒'BøéŸ3ÍŠ I¿ûHš7—Ék£~ë»Óåðcíìñ4»® kçæÎy6–ÁQ¥9}·!^"Šˆˆœ3,cÌq³SZZ‰‰‰§»>ç/{ÞEòš›™=åjb*B ršù-7^ö¼ÿ~z c&u¡;Yûé^âšÕ#¢àgÞ~á=¶ŸèÛ#\ éÜ·|z/""""f~Ë‘Éý‘·žžÍ;?ä`ÙÄ6¹…»_OƒpMûŠˆˆˆT ¿""""4t+ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""A£â|Ã[áOÌ3…é…ø*]Dç‘£èr¡ }=„ˆˆˆˆ”—Š3óv!ýŸZÈ˯<ÏÍvòö¢8t¦ë$""""甊~KX¡Ä׌„7¾ã~÷œˆˆˆˆÈ_SñÂïJ¾""""R¾*`øµY»Î]«IÛ™¯,""""妆_‹ˆ&w2ª}s‡÷aÌ{{ðžé*‰ˆˆˆÈ9¡â<íá…[^cÆGNzNYÀM £°Ÿé ‰ˆˆˆÈ9¡ÎüzÉúiku¤Ý… ¾""""R~*`øcË^1+'""""g­Š™/KîrÓ7\ˆˆˆˆH9ªxá×°û×,Bâ# 9Óu‘sJŹá혯76±—Ñ÷F8ÏtDDDDäœbcŽû(Ý´´4Ow}DDDDDN™Š·ìADDDDäQø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ ¡ð+""""ACáWDDDD‚†Â¯ˆˆˆˆ …_  ¿""""4~EDDD$h(üŠˆˆˆHÐPø‘ qö„_Ï éɸÏs0þ^[ø#³úvå¾O2ý¿ö¤øØ·l£ï¤è$÷4™3¶kIIþÊâ'{´Sóõ&ÝÅ‚ŸÝäo|œÞI#y?Ý{¦«uùëããlPðC*ƒ{÷¢GRI#—’q– òß>nXÈØþ½èÙ»wÜ·˜ížSR]9Egº§Dh]’ÆOÅ]9«\ì!}s:îê'¿§מGþÝþè/|øâ©‘Ì-¸…««WŒÓ`sFnwnÃæÂiÏ&:üìùûèÌûëããlàl<˜ÔW’þþ†}r¦ksòÊe|û²øêõ¥äv|Œ»Õ&äÔTUDDN¡Š‘ºóî_Çë© Y¾%,‹È†é7¸+—ÆØ¼Æýûržõ_ïÌÆW½ ýF¢mÀµz*#R7Q€·»ˆƒçñH»¸#Ø›µ‘7ç.äã-ñx!æ’›ù×À¸ ¢ø¾ƒßñöÜøpS:y…±¯¥ÏÀž´¬Þ½,4šù?äaH¦Ï[v,{íÆ=΀†a'ÙÒ"ö~ü4s~lÊ'®¦²=€ö{¶ñêð‰üÚéŸÄ¬ÿ’mé»ÙKczŽF§Z¡µÏ›3§ÃEL¸[Q$áÎJ¸G÷õf~ÅË3²z— Žê­¹}èm´L°û­Þ—¹çíš4ÿŽu»kÒ¹se6,ýŒŸyprÎ+ký …;W0Öë|±+ã £f›> p5ÕBŠ·üö³SÞ`Cn8±5›s}‹­¼¸ò ¦?~Õì~Ê÷×ÿå0>J+ßäl`îèìï:ûÚUÆn øùµ±LþöJz¨3uBKo¿ßþ·mãÕ{ïgS».Tû~;drÀÖ˜#ÿEûE¼²Ž¿R¯?Ê>¾üï€ùnÑ5c+Öž""8s_~ùå‰6E{Ìûc{š;g¥™Ì"cŒ'Ý|:ívsëCŸšý^cŒ{»yãî.¦ËÐfÃ"cŠö›5)}MÏñŸ˜}Þÿ=Ö’á=͘÷ߑߥ›eã{™~)Ÿš=nŸñî2=|›é?s£ÉõcŠ2Ìò ·š»f­5ncŒ'ìyªŸé>ú]³»èð1|Íçô4÷ü{‡ñ”¡©…¿-6£zßmæoÊ=¦~´HÓmÔ"óÓ!Ÿ1¾ƒf]J_sëÔ¯Ln í Dnš™tÇ$“–kLÑž%fÔ TócAÉÆócêfàÜM&ÏgŒñ2?¿3ÃÌZºË¸¨^ÚDÓ­ÇCæ³ÌfõƒÝL·–›Œœ 找ƒÍK[Ýe¯¿7Ã,ÛÃôŸõ9è3¦hß§æáÞ½ÌÃk÷qÑn³dT3hþ&“ë3ƽg•yr`Ó%ù“^@ÿùëcÊ6>ü¶ßgò·¼jFôoÞûÝmò~X`†Üñ°Y¾·( öûíÿ’ë+y±ùµ øün~~é5îã?]_Efï{ɦGI¿\í÷sý•u|ãg|zžv›%Ã{™V4^V""R±T˜Ï´}Ùß³jk,×Üp)±vÀQ™Ä[²y¿ä—¼ÊF«:ð·;Øãø{Ç¿úk; ýßÜÄ'[¢i{ËåT ±°BkpÕ--0߬d[!˜ìoYþS4molFBàHàòÁ3˜;¡Uì~0sèG^}âm|7%Ó»qÄ‘Yé€ÚoÔ¹¶-õÃ-°"¨}QEûÒÉóúo_@"š1föšE€½J'JÀ…G&-m„ºd¿‚U~#Óí¤þC¹»c B¬¿£òEÔtIÜùuˆ ‹$!ÜÍ|_ÙëoKàšŸcÆ]M‰´ÀÛ˜Ä>2vçàÈ߯×;#iqU",©z7·J äÔT~)ý_VþË·p6H"¹+¼5íIž˜‘FÃÁCh[28ýµßOÿ³sÞ•­¨XáÔMü¡¿}U.×—ßýý\e_€Ÿñ/¹¿®emF4õ«†•ó’*9]*Ì'w¾C™äABÄѤisÅãònç`¡P;•ªD ,vg ΢ ò¸»È—ŸIž'%ã°¬$ò\D¶Çà=´Ÿ\ã"Þu´|+¤Ñ幨ϗÍ×óŸäãØÞLë\cßwk¿EhÄÑ7]ËfñahÎ@ު턅.ßrà ?v[õzŒçÞˆ·øðÅI,Øá¦jÓôЋÖÕCý×°NB, Ëfas`a°,ƒÁVÏ6}€7wßavaž˜xÝá?N<ìßø¾Æö<ƒÝfÈÙé!²Õáþ-Måé¯ës×ôëøó=nµÿ¯·¯ ²ò\_¾ü, BÊçúòÇî*ýú +ãø*»êÝú$ó.yƒ‡Ÿ˜Á;”¤St‰ˆÈ©Ua–=XÑÓ®~+ßý†L/àIgí’u˜¦í¹ÀUò*/ÛW®â·|¾l¾_¾wƒ–ÅÓú;~Tc®m˜ÍòwÖ³ß ˜|¶/Oeúk›È3`E_B»úY¬Xr¸|o&럿ŸÑ©ë8Xò©°e#Ô wì!߀ñæ““ë hæÏ³ó=Ržû•Ä¡ƒiÿ¿ë(kÿ_o_™y÷±ê©‰ÌMËÄ Ø+U§~h6ûi¬¿gT ±±±ÄÆÆvd›‚,r}QÔ­Oˆå#góǬÜ顨 `…×¢iÕ¬[»|Eéi¼»&ãHø-—þ d|x÷ðþ„þÜùȲŽÙà¿|YëžcÆõ8´ý’»b{{:oü”  ýñ²}å§üšoÀdÓŠï(ª—X.×—ßöû¹þÊ:¾ÊGq·çê„=lØQpº ‘rVaf~±W¡ýˆd¤¾@rÿg;ñM:3ö®DY>ŠpÒ°¥áí Cø)# wBkîÙŠ¸@"¼-ž+‡&“>çyFõ›ƒÁà¬uÝ5Àe.?y$æ¼ÀÈ~³ñx!ºQG’“]óëâ¢Î7RkúcÜÑÕ`‹£QÒ8ÆÝâï‘Gn¶-{—Ÿ 2ùiê¬øÓÖÚ·ÎäñÖðÓþ2¶¯¬ìñ4»® kçæÎy6–ÁQ¥9}·!ÞPúù;tŠëo¯z5=Û}Μq÷°¦ZH<;X4|4ßöœÇäÖ‘ºfNÄûÿÛ»óð(ª|ãßê%Ýéì$컨,3ƒ^Ѐ‚ Ê}FÇ‘D$h\X ƒ ² ²ƒ¢¢pAÅ™Q@Ô;¢ 3À€ˆˆpP\Fe @ ¡“tºÏý# Û…tc€úý¥KBgÅÐ*=…•Oâþ¿Ùñ4ø=cǧÒ@E$"rѸ4—=ˆˆˆˆˆœÆ%³ìADDDD$…_  ¿""""6~EDDD$l(üŠˆˆˆHØPø‘°¡ð+""""aCá÷¢àÀò‘ [¼‹âJ8ºïÇ×ÉH}˜y?áÝü,÷¦ai–ÿÔŸbÇ‚GéÖÿvŸÒHÎfMîOzj*©w?À€É øòЩ۟OçwüB©L ¿YÛ*ïcUmî8"ínâ"mØÜ±¸Kÿ}2µ:aâ Ô°Ÿðí@6k§MáCs;ÿ´ˆ…óFѹèžy¹§ý˜•óáüŽ_hã#"""•é’ùxã ómçÍÇŸ`kÇjýk#;esÈÖ‚îCþ@§:NÀP¸ksg,àÓÝ^LÀEÝöé ì}µœ†¼õãé·¨%£(à­™ï³õ`\žÁË“:“h+™ù|gö|V~Ÿ‹Ïñ¿¹“?dÜÎQVÉñŽá§.¿'þ‹ÏØžµ‡}´ møºÔÿ>–ÆÜ¯ó1 &ý];–=‰Ž#Ÿ¥wS×"›;·ÃC|¤[q ‘îh<«ôÕVŽgèÜo)ðá«Æ´©)Ô-«0 ºu72®íHƒHЄö77à/oÿLNq[ì_Œá±÷êÒ:ò+6î©K×®ÕÙ´ìc~pÜÆèñݹÌlüÁŸ½?OŸÏÚÝEXpÔnÇýï§M’=¤ñ+÷ü„p~Ë© ~±á° ùöSCŸ‰“háåÛùƒ÷òÇ\=¶#‰díÌ9|Q83'_'ûcž0‹¹­ZñD›,,Ü5½û¯ÌøË5¤ŒšËSõ"Á, ðïgÕÔ)ü=¡/“^nO ³‡ÏŽà™y ™öhK¢°á°òز¦ˆ c'r…û®n7O/IDATŸ¿ØŸÿ¼…F\C”½&]ÆÎ vT ®žÂÔÔzguò ·ÍfÀèå8õ]xg#ºO™Lj}gÐ}X®<.±. ›/'Žã›6’:æµN†¼OF‘±ð”íI´¾ýÎãÿ÷ïgêxš¥QÝ Æf‘¿}/WÍÇÕÓ2˜¾æa^ךù½Âºÿ¤pYÃÃAÆ¿ïÎáÓ:3mt ZÝVg°ñ v~¬ ç7èøˆˆˆHU ð{;õn¸žú.€H%ÿŠˆ•ØYØ‘ÄÈ$ný*mm¢, ¡Éu|¸'1Ø[d,.1õîyëEbeÉÈänåŸßÇÑar[j:- 7Þu- ž[Íö–´°ÆAÃ[:Ð$Ò¢hÐ<‰âåYäû!Ê~ú‡ÊÕ,ƒY 3*¶“¨V ©%ŽH°{º0nª!â—L:ûñù¼ ¼¶ïz=þ+"£€£zsŸ9œCµ˜†Äºl$EqÈ[°ñ·áqpøóU|´ÉC› irG ±IAÏ»üó{NÇGDDDÎ…ß“ØðTó[m¹¢‰ðíÃ[ àãàæ¿2ÿ½Lväì6CÞ.1ן°¹eÃrÖä× JƒÑ Þlò}Y,Õ›åe0> hÎaŸ;€ED”ëØ¶–Íà‚-‰ ÊŽ+²4…[Ü‘g¿S¸ƒÓ'ðÆÞ¶ œø×ÄŸµnœ–…e³°»X,Ë`0'»âñ¨wùûc™·³ˆšWu&­wÚÕŽÚ® çÇm•{~ÏÕøˆˆˆÈù¥ð{’9^ÄaÞ œ1xÈ^ËôþA|¿g˜Ú¾&N³ŸeÃú³ìÿíÃŽó4³´6Oub\µi7i*ÝN·ÄÀwî{s¢s±ì¡¢LÁüuÒX–FßËÄIià }=l(ão¹jÓ&õÚ¤‚ÿÈÖýéifN«CÓI·’dùAÐósÌéϯˆˆˆ\~OâgÇê5ütËÝ\îÎc몯(nœN}˜C9 ÄruãDœV€¼oV²z—â‚b”NܖÊmÁ-Móæû_Щom^v¬|·÷ßDßî¿"*”æY6"Ü»s/^S耗#^ÑÑÎ3ÌDwN–=TDà0fMä]ç}LÔ™ZgYy¦ ÈøûðÑÿÌ`Ûõýé\ {tmš4ŒÃ±ó„3SÞø;?ºoMDDä’ ð{'Zxì¾Ûwo|z mG5Pó&Ò:~¬‘±®V"5~ý[î½§S=ÍôZcyüæêåïÚ–È ý“5ë5†öœ…Áà®Ýú^Ž'ä`å¡y×;¨ÿü3̼Šðn~–{S‡°4ËÛ{©©êõQ1_Ϥ߽=èžšJêeì¿ÈJ£¢õ]¸mýH'ý¾4RSÓyá«‚óØZ‘ªËQÙ ³å Vç!LlK ûÙnë#k[EµÏG»Îˆ:i<;5…ºgY6w‘v7q‘6lþXÜöÃÄEêï»Ð]õñK¹[ôcæ_2ÈZ:œÿ¬ìÖœ½ŠÖ·«Y¦Ïï…ß2ë‘ÉxÏc[EDª2…ßøs6óÎìù¬ü>Ÿâs'ȸ+¢,ðmçÍcø©Ëï‰ÿâ3¶gía-H>€.õ#ƒ÷§™1u[ŽF“X«9mú86éëÛΛ?ÁÖŽ)Ôú×FvÊæ­݇üNuœ%Ç?¸‘3ç³âû<°,bšÞFÏ~wsu¼p`åx†Îý–_¾ÚiL;1 kŸËÆcî×ù“þ®ËžDÇ‘ÏÒ»©«äøÙøóôù¬Ý]„EGív<Ðÿ~Ú$uÊ®6wn‡‡øH;¶â"ÝÑxֱ׃õ¯¼ñÏÿl ½W—Ö‘_±qO]ºv­Î¦eóƒã6FïÎe® õ”¡p×*æÎXÀ§»½˜€‹ºíÓØû&j9K^/øùo¼4u!›ŽD’P·5¿½öGÞX}Ï?û;jÙ+X¿!ÔG0åßämbö°i¼{ ìX»)à‡·F0~Ë Œו†å÷?èøÛ‚__i(¹_ñÞì×ùûÖ,ò -ZÜBzFmj¿¾C©¯`õ-""!2gðÙgŸé¥KSq–Y>ª‡é9uÙ[0ÂÝæî7½¦o6GƘ¢fá£)¦ÛÐE滣c¹fãÔÍ}“6˜#ÆS¼Û¼7ðÓoþ7&?`Œ?w“™Ó7Ť ÿ§É.Ûþ‘“2x±ù©À8j¶½Ö×ô¹ÒðcŠ÷š¥#ÒLŸ™&»ØãË2k¦<`î·ÆôŸØÐ€É]û¤I{l±Ùå;áÛÁÚgŒ1\óÉ“iæ±·wš7-Q`¾™ÙÇdÌÞjò%íûáýifƲݦ(„á+øf–Éè–bRRNùê>ؼ½#”=”Ó·PÉ4ck2S¼w‰Úw¦ù¦ ÄþÿüÌ1¦[÷qæãìCfíèn¦Û“+Ìþ¼Mæ¹û™?ýX¼~‚ñï7+Ft7½f|irÆXc&ÜÛÃLXŸkÆS¼Ç,ÚÝô»Õ S´÷#óBFŠIü7“Ul*^¿Æ© ‚ö?`¼ß¿i=8Ê|øŸ"“ÿõ<óèCÌŠ}Å!õ?èø»¾Ž7Ôìûp°é^6n!·?Xÿ÷›OÝgž±Þì/2Æøö›u/ö4÷ ûÀì)6¯/c‚Ô÷Y(Øf^îõ€™ºÅû 6¹øé=áR&w+ÿü>Žwµ¥¦ÓЍÃw]‹ùr5Û Ë~ÈAÃ[:Ð$Ò+ŠÍ“(>E¾Ì‘³qO5®¿±  l1-èx]'ϙکwÃõÔwV$’EÄÏØYÃÿ⣸ùö«I°Žê$ßq-ÎmñïPߟ,§}ÁÙˆð88ü¯U|´ég²‹Ü4¹£?ÜV‡PæÍ\Í2˜µp1‹ŸòõÖs¤Ömæ­Â¢Z1ü¥á´Š{.Œ›Ú›+MZ–ß¿PÆßQ½9bÜÄ'ÄPí²†ÄºbHŠ,â7Zý”Ç–ÄÍ£_eÚÃWc=¡Éuìß“GÀ»ÏwÅpí—e³æuÜyýñúªhýVTðã[¸/OeðÝðî”xnZ&Mû=J‡²µ;ÁúdüKœùúªxûƒlx +¾‹£Ã­HrŽ$Úö›Æì§:SÃ^ñú‚Ô·ˆˆ„JËJ¼Ùäû²X2ª7ËËþ$0> hÎaŸ¡$eXDD¹({£Ñ²Y` Pp˜£¸‰s—mlÃë>åŽBžjžcß³\ÑDøöá-†ÀÑlò‰")êx\¶yñøw[h ¤·^Ïܾàœ4î>ŠÇ£ÞåïoŒeÞÎ"j^Õ™´Þ=hW;"¤=T>;®ÈÒñ³¸#O|­üþÀr¸qZ–ÍÂîr`a°,ƒÁ¯wÉÒƒE#žäÒ›ø\Wöâ¹1·–®Ýöqpó_™ÿ^&;ò v›!o—˜ëKv(Ì%߸‰=V_vbjÇbßRúzë·¢Bê?NêtèÆ½=†Uq=˜vuÜ ×Gùý6þ%Î|}›öŸ™ÿèAމžãõc9£‰+ý»¯¸‚õU¢¼ú‘P)ü–²yªãªM»ISévº™Ê °¹bpã%§ @IÒ(&ÿ‘c³V%äx ‡xs(pÆàq€Ý“H”•Ï|?$•üö 9@¾#žx×…Y×g¹jÓ&õÚ¤‚ÿÈÖýéifN«CÓI·–5éŒ ·ÍfÀèå8uÑÙˆîS&_¸Ùßr”×¿Ä ŽÐúpÖãwOÍ ³¿,ìxˆ-Í2ìµLáÄ÷{†©íkâ4ûY6¬?ËÊÚ›"Ž•!?yûò(îŠÖoE…Ôs”¯¼Â——ýžÎ9K˜¹4™1¿«W2ó¤ÿ¡9óõuNÚ_»§ZIýõSöSp€Ý ©n®*p}‹ˆH -{(eÅ¶à–¦‡YñþôÆËŽ3yþ­­ä‡05fE7¡UlÖ­þ|ž`Ùç9œœýìX½†Ÿ¼L.[W}Eqãdê»ÀŠû5›ä°úƒ/Éö¾,Ö/Ùˆ¹ªWxÎU'mD¸!wç^¼ŒßKÞ‘Ò›òüøèÅ1ÌÎÌÆØ£kÓ¤a[h7»U‰eå Ò¿ŠŽhõcÇOBB ÄǸŽ]€¦ ‡#X5NÄiÈÛ¶’Õ»|¬Èú\Uó×oÇk 8+“Öí?V_­ß’”SÇÆq/KŸêEŸÉëÈ9á…àdzñU¦}Ú„Œþ=è9ønlï=ÏÂ8úš3__A»êø©ÿq¿¡c“V-)­6_¼öÃfn$7p®o ‰f~ËØ¹¡ÿ`²f½ÆÐž³0Üõ¯£[ßËñ„21ã¨Ë?rß¾0žžË]$6lËí³~ƒÿ±_’NµðþØ|·ï Þø6ôÚŽj6€t4ˆý3_gp¯—;‰-»2âák‰µ pp†Ìa[!_>³Aéï`w”Þ‘Y(ôмëÔþºÛ`wU£YêHFÞÕ§=‘V·¶dý+ÃèóŠ ‡epÔh̓ýÚ“x)ü‰´åÿÑ`û¯`ýØkÞDZÇO˜5ò1ÖÕJ¤Æ¯˽÷4cÊ¢§™^k,ß\—.}SÙ:õ)z/¥zÃdºthÌúÏ«âÇ/QN}”ýˆñãÍ9Ì¡¢Â“Cqãû÷ÄÌ—¿åšS¸&ΆwîßÄЩóhñl?ZéÿÃQ¡´ÿÌ×Wñ–ðÔˆ·øÙ¢"Šy•ÇÒßÀæ¨Ëã&qO£ÇïLý·× Óà!šõ:Cz¾„ÏqÍncðàÎ¥ËZ*X_""rÎXƘÓÎ eff’œœ|¡ÛséòídÑÀalI{…ñíbЧcÈûd ÿë=ç7¼øÙûÁP¯»“—&ÞD|¸”®¯Ð•=çwÀ,þÆ]Ù­¹à.…9=‘0àgïÒÑdüq1?Lá.Ö¯ÙGµ–C»RDDD-{*¨è?o1ô¡ÿÅî¨Ç]ãÆÑµ*¬®tvjÞØ[7¿ÄØÞK°lZ¦1àÎú!=ŠN¤pÛ†N^Ã!1Þí*»A""•DËDDDD$lhÙƒˆˆˆˆ„ …_  ¿""""6~EDDD$l(üŠˆˆˆHØPø‘°¡ð+""""a£ê|ÈEáwÌ>‘UY…¢›ÓuÈPR®ôècJEDDD䜩:3¿®+éõâ|þü—×x²Õ.Þ[ô5G+»M""""rI©:á·ŒAbÝ(("pÚÏžùeª^ø=FÉWDDDDέ*~mÄ4hˆ{÷Z2wyEDDD䜩‚á×"ªe†vÚÏìé ÿp/þÊn’ˆˆˆˆ\ªÎÓNPøý[Lû‡›´‰óø]ÓXì•Ý ¹$TÁ™_?9ßm%·þmt¼RÁWDDDDÎ*~ÁÀ²WÍÆ‰ˆˆˆÈE«jæË²»Üô """"rU½ðk ØóSÎÄœ•ݹ¤TÞNøxc“p >Ù we·IDDDD.)–1æ´ÒÍÌÌ$99ùB·GDDDD伩zËDDDDDÎ…_  ¿""""6~EDDD$l(üŠˆˆˆHØPø‘°¡ð+""""aCáWDDDD†¯ˆˆˆˆ„ …_  ¿""""6~EDDD$l(üŠˆˆˆHØPø‘°¡ð+""""aCáWDDDD†¯ˆˆˆˆ„ …_  ¿""""6~EDDD$l(üŠˆˆˆHØPø‘°¡ð+""""aCáWDDDD†¯ˆˆˆˆ„ …_  ¿""""6~EDDD$l(üŠˆˆˆHØPø‘°¡ð+""""aCáWDDDD†¯ˆˆˆˆ„ …_  ¿""""6~EDDD$l(üŠˆˆˆHØPø‘°¡ð+""""aCáWDDDD†¯ˆˆˆˆ„ …_  ¿""""6þm8¾déßIEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/24-agents/2406_agent_based_service.png000066400000000000000000001211741516513262500323220ustar00rootroot00000000000000‰PNG  IHDRÂfVŸæ!bKGDÿÿÿ ½§“ pHYs  šœtIMEà :QáY{ IDATxÚìÝwxU߯ñïîfÓ;é =ôz©‚¢€Š¶×®ˆ –çQ°ƒ`EDAÞ{ % é½ïÎûGš àý¹.¯KvfÏÌž9»{ÏÙßLLLYf """"ò/cVˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ\FÎeec\/õØ92M]®N¹iFXDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD· ¶%[.1‹¾åÛyØ“œG¹³/µ›ucè-7г¾¦ó°ÉòÄY<ú?àõèt&v÷8/Ûøß°rãõÝù!øøGK‹ X½Ÿ7§³ßöÏoÕѧ;o®Gê¢5\±§ ã²<5t幑—°…ðUyU[dq fýá$ü¶–‘ùµ/ÿ¾øk£„[‡uãë š—®\¸šþ™agßwNþ¬Õu?oäétûI‹-nÁ¬¿­6³ØÌ¤lû%×[&g´¬Ã#kÑÅÇW{ûÓ²ù)úïìÉ'KKD.w†5w'2:}'dWÆÔ.cfl>y—v.åàœ‰¼ð]FÞÍ3-qÈK`Û‚oø`ÂAJß@ÿ@Ë?ŸiÜÓg𵸄:^F!¸š´}ô[™C>`¶XiÊä-ù;™›ò)þ§ÏeJr™™@^–ý_üκ/Ì.¹¼ôÇV:ý¶—?œÃ˜{]}º8”±xw–à@ºT37nièDLÌb«Ï0Ÿ®K ‹æM˜°º1Ȱx0ÈǘiTÇ·¬4–i×ëÛêÿÕHœjÕá×~Ø÷Ä1à—HîÞmãúžÍy«˜I?läÙ,;;ÖlÀí· r¬^LÞš§]³xvÞVz,JdH#V ¥¹¦c–ËÚØ ²üƒèçZ¹uGOî­gaíÎ _´Ã³†þ«©óN7ŽNø‰ÈÁ=ˆ‡5æÚ²FÏÝέۋxe}ÚZÎp|/²k‚-.ÜÔÄŽàõ¤rì§ø‚ص+žïJÜÜO}cŠÈå…K²™ðkäqaØ7,„áÕ>ôÆì¢Û²4ÏÓ/c¦4ÂäNĘ·yµÉï,X±‘Ÿß_ÈW€kHW º›ú7ÅÓ¥òÛpîûðzùšp†™Ø;öKƤq= ¼K¯§cE‰…‘Õ—&¶ÏY¾§ˆöm\)K\Íú¬:\Ó-Rªb0ùQ¿°¼ ->4‚®Þ& .æ$óiÂa²öï8ýv›;]”ÈÚ’ôû,7ù ×­Í>Z.ÅLYÌN®ÙT@ àÎãµòxà›}Ì(0€\¶dt¼#œ±þ¸+!…u–pîtà÷Cå8û0Ü5Ÿÿì-¢´b~¿Ó¶3ö`~trN ÑÍ—ˆ²,¾Î÷¢gˆÖT;=ÂI<˜ÉÁ‹ô'ßà–íÈmYÓ‡NxÄÑÕÚF!oíJeQ¾G 9œáIy±Ý0°†Ý Ü¯àÚÜåšË£¿ìcz^E¿E»pŰ0n÷Næåü“Ö~/‰`T˜•±¥xsµ9›1 ¥\¬¿˜[ë´$ㄱiOŒÂwnƱ±yãh}Ʊ`]·amØR¼p?óJrÙmr'¾—õŒÇáâ ÂÎtð€Cñy¤5ŸDøøxÐÜÙBB¸úÕb@H9±9ùì(P}¾ˆ\žaØ44‚güŽŸ19³‹îËÓH:_vî®ošö½¦}oÃ(Ï#)z#Ëÿø•ß?ŸÀŽÔI¼}G8E qd”îá£nãÓª¾0Ê)-·cd•bÔ,n4jx´žØäÝš¾Ë™¾rEmš’²f9õ‡ÒÅßBEŠ('=.‰òÀkhàQÕ°•°ÁOó YË~:ývqº8š¬v±†AnA!{ lÇ_e/gCRñÑ®ðöõ$ÌÁ“Ïo»‚ª¾QM&\Ì&L®fŒäL¾H1ó^c<åîO`z?çÕF‹éŒíJcµ­9CkYYëíOfÓŽ83¬®~»í ö*gñÊ¢ü‚¾JÖ¾X®Û^plf?¾zÒº©ILωà‹;ºpïÞ4~?”Á/ûÓÙ]bœð›‹‰ÀZ®¸ä§±¦ÚLxAf&‘¶`:{˜!ÿäcFY>3ÚXÐÔ‡€¸ Ú5÷Å!)†¥Eï[MË•—žpñܙǑéh6S7Ð [æA6탔äLöÚÏ|.®ÞÁ˜Oñ ”Y¼™<´]Ì¡üÐÏÌПâˆÔw¦ˆ\†Ìø9žü‰èáìÀù® ¼ A¸ôÀ>ú¥œÁãFÐÐ L„µîËm­{ÐiÚÃŒ_±„ƒ7…ão70{öæ©I·ÐÀñø/L7wLå€É ·êeò¦UŸpJ¾ZÍ<¶¬Ë¥áˆŽÔ:á&†Ý³¹ÆZãLÛ½hÏ¢Ž¿X®æïTÙåÇ‚€ÙdÂV”Âu?dzõ„èÒÒ2 ïÎí[mœË¸¦¡•Í[ÒOúIâŒí”çócš‰·ëzÐÙÛ™CsÙž–KAËZt ´aÏá½LÛEû¦,*ÌgÓ‘oŸæVãÅ_ö’,úa-Óëø3¬ž/úFðZ¯<^ŸɄԳ۞ °šj>f`ckLùƒƒèåmcdmXøg6óåf§¿XîÆQµ÷±ÝàäÙPÃ8úØiCJùÅ3“Z^Ìú\¸&Ì›Ps{k˜éÈO?ÄyN¬Jxi£ÝÃÜBÍ‹ÈåÇÁÕ®oɽ5Ô€ùÖkÂÚÐmaòñå™ÿd¿ IßRÊÞ5óø}gÞI_Ff3`±b1™p ­‹{Þ–yàãマöX~™þ » Nõ%`§u_ ·±lý2Öç5f@;ß^˜¾ 0¥D±ÿh;6Ž,šÄã¯/"/è¯l÷Ò”O¦‹–r’ KI.,%Íìų=êpEå FJb2}Õ0ˆ.¹L=X‚í„«3·Sƺ½…øÕ æn¿rV&—™N¤Ù‹ûšûàœ–ÊæËâ¶P&‚ëÔá­6î$Lâ¹eQt˜±‡2=ÝÜ ×úíHF!Åî>ts=vzåæãCK óNýÛO~Z ”{òxû:ôµgðñÅìþ2ã¬ÆceÌå`J1_¿cb" È—†æs=ÿë3Ø"~ŒÎ‡Zuy³¡Ó)g#ÒöÒwA<÷ÿÍç9ºm„ˆ\ž!xÊ !øàž|T½f¸^Ö¦‰åüìà Â!}ѾœUoŒgò·²fËvlY™oñÆï¹4»v uÁ©á †&òýäÏøs{±[1óX”æG˜Ç©wÕäÓš¾ sY:}>ÙÍáe:)¬xµJ7ë&>þàg6ÄÄ·q6Ï܆Þ”Æm»—¢‚Ô$¦f¹ñÊÀFÜ_Ç“nõB˜< )£=Jˆ®¬¥´fñEª•»»‡xø0‹ ÿJ;)‡Ó9èéO§þ̱c”æñ{®×Ôs"vo.—É9F‰Ùƒ1›òA„?½¼Ô$„›½ ö§—R Ø >Þn4tµŸœÀ—…ž¼7 !w„zÒµnŸ]F@J"3²NvÊòøò A‡ÆžíOfCé¿gI³©.XD.Cfš5¯Çèjw‡8¸{Ý—àÁ_·óZZõ0\Ÿ'ƒÎË/ô¦FØR‹ž¿ƒçüï˜õçw|8;2‹~µ›Óû‘I\×#´âËÌZ—᯼‚ãgÓøé­%dÚ<¨Óq8ãïDˆœòÛÌäMë¾á˜b1 5ô”É£c'=Ê×}ÇÔç¿§Ð9ˆÖW=Î3××ÁjåôÛ½œØòyuÎv {†óüÀ`BÌeDí?È5«‰«ÊaF)‹vçavçÏY¤ÿÅvJó2Y_Ÿ¦ED–V´»*¡jÙ™TŠí²èPƒÌC{¾©1ÿiלe]M”° rì,¢ÌnaéÞlþ¯C+6ºï ö™<6;Šì+ðö0l%lŠßCÕIì;í¤Ÿ-q™ä6ñfVtÞ µ¶—ùx<ºên˜máƒ^uù|h]J³3ùpy iWÖ8ýq¸ØFMY/ÍÝuPKžêÕÛº°:µ˜‹#­ƒ=¨m.åÓ_7rR¹B°ˆ\¦ìDmÝÁuîí˜Óܹ"¯¨¼0®$‡æV\@7Þ¯œ¹Ë·ó`âùù<41eÙY·kŒë¥ãv® ݈ٗÅá¯Gròä†à2æ(â|]î # rq³8¹Ñ=Ä—GÛ»µ› Á—{›c÷3*v¿úBDþ¥Ÿƒ¥,ÝSóOþö’\~8p~7¯ ,r‘³zòñU¡˜â¹kGf EDD„EþŠÓâiþI¼:BDDäfVˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆÈÅÄd†q6+nܸ‘N:©ÇDDDDä² aQQQQQQQQQQQQQQQQQQQ‘;‡ÿÉV,V¼8†¢íÿÁ»ï¤Žõ2êÙÒ}LðiæeÃxç?·P÷~}%qŸ0nü"r€‘ïóÓ£(‘õsg1ÓSÉ+³âáDHà >”îõÝÿÇgalxáNÞŽhÆã_N¤«»>DDD„ÏwÎÞÁ’û±RÖ°>euj;\Ä]eP¸o1¿­;B™Ù…ú}†Ò=ÈA#¨¦s€Äù¼9~‘…Õ-#/-Ø´b×ÿμ^æ…ãjR‰ˆˆÈÿÆÿ`RÎ {Ǫç`Hfõ†Ê/ê®2(Ü·ˆYsæ0gölÖ)Ó詉-•å}y4[Ã:2pÄ-ÜzãPúFT¸2öÎzŸŸö—þO‡¾kP= ¬„«Š„DDDþu.ü”¦‘MÔ’ì'<|xõ&R¯#Ä¢ƒr)3òv³2¶òèãµ7o¡SÕÒ‘ ™û"ÏŒÃF*kW'rsƒüo*F\h5n2StÈDDD„/XPʉ:VÑàFF:Ìâû8W²)õZ†Ÿ˜„ JS62ûÛ¹¬ÞGš5Œ–]†ps÷DÞya.i@ø¸O™ÔÇ—Š_ÙmäÆ,âÇ9+ÙÏá<'ê‡Ó¼ó nÒŽÇÊßâË“øù±Gøî0àÙ—_é@Ô̯øcëaЬ^„µìÍÍ÷ÜH§ GLö =3†Oâ«ö©„ ogDØm|ðÎuŸ1¼ÛÈŽšÍ/³—±-6™B×0Úö¿‰»nìB°cµÚ{ÖþÊsW³;!•¼2 .>A4h×a#ÒÚßÊѵR¶Îã‡Ùˈ:Lv‰€Pw¾††õ$ÜÃrÜöϪO*•¥nàÇ¿°fÇ>2¬¡4ëp#:ÛÏêøÚ 3ɯü“_=ü«/µÚû&ÇþΡRnžfŒsÝÇãŽ[?&¾ÓŸý3§òãÆRš5ÈaÓîBÀ+_þ„‡Z8W :Ö¼<š÷vÚ€F¾ÿ.#BóXöì}LÙ 8´ã¹éãiëR9ÞŽlå÷YóY¿{äãàFxÛÜ|ËU4õúëý*"""ÿê lu¬,¢~¯ž\aÝÊ÷q{VlNcð Ž‹©KyçÉØRTõH‘ §²k«M1ŒìMóô›ËÈ8úX9©ñ‘¤ÆG²nÇ(Þœ0˜°§ vñå„%¬Jpe9$n›ÃÛã³yþƒˆp5ãZ+÷„Tò«*"œ=ð÷sã¬&°Ó–òÎëy-™-HdëœwˆÞ?†ÉÏö§¢Ô¸˜½ß?Ç3³ ZEYIìZ2ƒ]÷òôûÿGG/PFÒïy|FLµr’2òR°å·)lYµƒ''?Dgoó9÷IÉÁ¹¼þÜLvW®Z”ÈÎ¥ÓØµÉ­Zh=5³«&Àc×g¼;#—Á}ºQÇÀäÁíOFü3Ç͞ɚÿ¾È‚¨b 6õ{µ'f÷*ò( jC"¥-Âq(>À†}¶Šç÷ óij»ËçñêS_]­j֙Ȯ%_0aÝv˜ü½,}ŸEDDä¢qa+#¢–ÄPIjÓ£­?~=©W¹øÐŠ-¤Ûª¯ŸÍÆ/¦U†`aýF3þ•çyphS,ii'Õ…;ùjje0qkËÈ'_å­×ŸeTw¿Š·kS—¤b;q¿l),«O¡7sëð^4¨šÅÌ]ÅÜù&º?ý!“ïjP¹À‰ÎONå£ ý 8›$läQˆ?¯½Q7õ!¼²T 8r:Ÿ¯ËÂ¹Ûønnevoðû㉇ïæÚŠÇòÖò[TnE-ŽcöO•!Ø¥%×Ýÿ/<ÿ$÷ô«Sq@³W1cþ!ÊεOlÉ,œr,{¶È-£nåš6>yguˆM^­Üŵò_yDýþ9“»›[îz˜ñ¯ÿ—i?-aû¡\Êà¸åo­ÁŽÞ„ãߨ7í+»+sÛVŽTÒ¤-ÄTžHuïÂ)s°-åͨ Áf®¼…q>¨~õ*Nx ·0í«cŸEDDä¢qAg„œ(–쮌!ÝiïoÁbjC08XÁ¶Œ ¬L—FÖvæm-©X¿ÞÀ««òk¿0æÖçXh5ú†wöÆ4¨íBBÔ ,É5ˆ[°–#ý¯#ä¸gpÝÄW¹­`Ð+$•1DcÇFZb¶Î³£ióÈk7˜àêî„¾ð ŸÆžEy„É‹N¾Áã~óÙoÑäV>lÏ;LÜÖÃÄm]Éüï?½Å0yä&ÚúZþÆqƒÚ׿ÌË#[ài(¿;ËWäCòF¢2‡S;À }G$™Ò­kð)k’m›Y[‘ÐMMÆ0á¾ø™. )}˜¯ hÇJ”´¥Þ¹ì³êÞEDDþíAØ 'j)U98°kG*BhûnÁ|ýc2ϲm™\5À3P’IBåÌa^ð¯ &7š]ÕUËÈ;Ú~é1©ˆÍ6v~ò÷N«¬Ñ4lV%²ä(’Н#ĩڮ¹5¥]hÕ&\ƒkãI4Ù€½Ì~š’©Ë?á“eGŽ›vª?œ‡ov;ö€s;·÷=:ýîT¿ëÌaæ! a;I%ýñ ê˃Ï÷{iñ»Y= ññ{‰Þ´¥Úk¬ÜC—BÜ`opð;ž¹s!-:бS': »Ÿ«\ŽÞ!å¬ûd(î ;I©|¨éàW‹?]·àóØ(ΦRØäB×;_¡ËÍ™ìß±•í»bÙ³'†¨˜dª*.òwÍæõÉ>|8±Åõ¸™[qÓµÍ+C0€ {µÃmÅJ 8ÈÚݹ\íg°{SRåIC7º…œºV¡ìÈnŽTì.-ð©:`–`®~þ}ÚæÙÀä‚¿ciç²Ïnú ùwa#‡K£ýTœ´„ïfVl¾<íØjû–G’Ù¿~f°f­«uõq;®ŽÃâî;T ‰vŠrŠŽm®0—œ³k¹%TTÇãj}Mf3gw™“¤DîJ=þá’^”Q-ý¸âU=Y<öª,¤-É!¯ÌçRWLãýÏ—p ¸úÎÔ°Y—fÜñØp²§üÌŽL€"ïZů»Vñëtðhz £¾®çÒ'6Š®ëB-çj›6áèí‡Ûqý}ØÑ—úÑ C¿ŠÞ*skZqïRvdõ¡O-3fG¬@)Ÿ–‡£µ<ïÈ ¡ÌŒ£KUq¯×¾õw48Mê¹7-.ʦÈG“·—[X9ÏlqÆÅÁDÙ¡_xëÃ%ðoËà!}éܺ)aùßñÈ„%GK *Ÿ„wÄͼðñu¤DodÍš5¬Y·•C••"y1óx÷Ý ¦¼ÖïúÄ Ç£ò. “™]‚AU6(Ëͤð,^jAä^ü,š"ÃJëžå‰þG™Ù5„ˆ£¸mÃJ&GÙ"rŠ á_=n&ÓÉç .áôiçÆªU”Ŭ!&ÎÊž²Š¶»t=í­ÚÌŽn8%@Af!v¼Nq1ä9Ž5ù7aƒœ]‹‰>›+‡Œ=,Ý‘MïÞ¾8ú7&€$‰KW‘0è&ê9öl¶Î]Oþ /ůQf2°“AL|ö~³zFYö’\d€ƒ7õ…àú·_€•z·Nå§[kX¡t_µt¸åûŠhÞÂ[úFWÕâ5'ØÉFfÔÆŠŒ ÝÆ=ƨV.@9‡çÄ‚ b~åÛ¥‡)3¹ÒhÈ- s%ÃG—½OޜɶB0îàpé@œKŸÔnF1¤b3o Gºª¸°Ì–Á†y;ÏêÂ/+Ù)GÈŽü2ÝÝî¢eµQ£8…½©•&o‚ÜþáãæBx¯¶¸®ZMaá6~ëPqÂT« =ÂOûLÇ€&° qí6Òhìé,c<_ì.ÂìݧßCعì³&„EDDþÅAØÈe×’ª²/ú¿:•1MŽ[¥$æÆMXDqË¢Èîu%>éYûk¾MÏâå×ó¹¶S-r#ðÛ–’6b£Å"w±­Ô nƇüèr#ík•½”o¾]G:àØöÿ˜:þ¯a“¹*Ñ”v(â–µq²˜Î¢Œ"—¥“ßÅÿ¾¡´tNbùÌ/ØS9!ÜàªnZLdY«æ‹Ø6ëæg5Â)u¿|ŸpÒë´ØX³tùÀ²Ø<ò‡v¡A-3y‰©äVÝÞÍÃwË9öIèôý…’ÀØ;ç^Oap{_r"çó{ôÙÝÿÀ©Ôz+õ IDAT^?zþÉœ#@ê|^K·+ÛRßß{nÑk–YYIâØ¦?-<ÍÿøqsiÔ›¶®«YSX@Ì®ŠÇ|;÷ öés0–€Žô©7“€}Ó˜øßB†u¤(j._mͤp‰hOm'îçy¬‰ˆˆÈe„ÜÇÊ"<ÚqE=§“TÝ´q_ÄŠ|°Ç.cgNO®ðaà˜!,Ÿð‡¼ðÍΪ´ãEEÇGDïNÜwO{žøh …E;ùé½üT}ÿ^<8¦+Þi†ÎŒkP(nì£Ø?ã1n[r¶PÈÛÆïnã‡ê¯¹ùí<Яâ¾É>}ijùœEÿδèÊu‚±¦¡ (Î)Æ87ÁÈVëø<ª#qßLYqb¤£ñÔu“ã9ô‰µ6ƒÇ]Çšçæäì˜Ï7;ªš´€í,°c}Fíš8’ºÿÉ9¥¸5¡Óq<;*œ=ó7f@áÁl¯êN¨‹ »_IËZvr3r((*¤Äo‚uaè=rO¯PœLþ¬ûV¿–toãE~Ò!’Ò ±»‡Ð´óPî»±QköSx´Ȁ枧¸ µ ï&ôÔ“F®Eää—RV\@Q¹Õßz-èyÃ8ž{ ÝÍGO2þ‰ãVm0áér€+*Jн{r×-OX¯˜K~cS&`¦çuWl5áàÓŒ+ºÕÁœ—C~Q>¹…å8ûÖ¡yÏ›yô‰iuô/ËK¿ŠˆˆÈÅÈdÆÙüÁ06nÜH§N.š/ÞõƼ¸Š ùãÓy¹«š|‘³åp1ïœ=s/Ž›ÂîrÀ·ONºŸÎµ°çÇ1ï›uTüM‰0ÚÔqQ‘Ë'›}:rãÀP^þ= 2—óö˜å¸x{aÏΡêR¹kîe@ˆƒŽ¤ˆˆˆˆœ“‹¿4Â^Àþµ¿1gþjvJ%»ØŽÕÝ º­è}Ýp´ ª¬…¹œ‚°ˆˆˆˆÈy`Vˆˆˆˆˆ‚°ˆˆˆˆÈ¿Ä¹Ê,++K=-""""ç•ÏÅ„Ïu§DDDDDÎ7•Fˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆÈ…áp!6RVRDl¾ û鹃¼¬8阈ˆˆˆÈe„˲¸uf$³ÊÀìhÅÏb:~¹a#µØ82vxg¦ZtTDDDDä2†´2W^ÜšQî'a[!“ä¿ù62ËÏÜœ­8—O7ìç?{³‰-1pss£w㺼Ù!€æV $ž_î£ëðN¼é§Êù_ᣠyaöz^ø-Ø ÓóÓN¾°ûòX‡¦¼íc!3=÷7EÓ%ËÎÎAÔÑ1‘‹+Ÿ1æ²~O6)Áµªq"·œÅkcùÂæ÷skåÌr?® 0Ñlî>^Lñgz-T¹¨ƒ°+¯ßÒ‘g½M`/fÊOx8v},-YÑÃÿK‰‹²xg_9=®¬Ç@×ãú„ÔáýŽV’ ¶¶RZÉk+öñIB©fg:6¨Í‡=Béè”fpÕŒ}t½ªY‘‡ø:±bwþ¯W3&ÖqÄØKóødõÞÜ—ËÁršÕ åÍžõrb‰‡ˆˆˆˆ\R.ž"Z“•ëû4£_b4ýÖe“a¿¸('‹H› +êñ¯Â…‘ðxè ËÊrxâç¼YèäkÚ±ºõï¡Çü$â«naa/dÊŠdœ›7cýÍm˜ä—ǤÅûYWV±ì¿¿mãÉ,O^ºº‡„suq×Ήg}™ˆˆˆˆ‚ð?İzñÊÕh¾'Š›rÉ«¶¬¼´„s:û™Øœä¦zòÞ€†ÜæI·za|Ñ?¿äD¾Ê®LÚvlÕ„×Â=hìãÍ}í(-$ÅEé‡y'Ã)2*Ì“ŽaA¼=° Wä§ðQšM£GDDDävqÔ›-Ôö°3{þZfW=¶%ž¹-Ûp«kÅ?-¸PLz™œ†KJJÉ2,ÕJ* ŽdRäîO÷j¥n¾¾DX’ÙgwÀl¥SÖÊå&‹ÇÊÕ³3sI,ÏåÞ¯W1¶ª àÈn`Ú1°  á¿Áʵ{p´–Ïs³÷ãQmïœ=½iD* RËxÔËñø©l{!ïÍÞÈ‹­8ÒÿÌ[³`PVµ1“wKÍqÖnX\‚˜3¼íNè)GG«B°ˆˆˆÈ%ìâ½Ñ®a§ ZõÅÍ—ÃL,ÞpˆeÅǯšŸ–ÌgY&º4rÇãè£&k¹âœŸÅÚÂcÇYYl·9ÓÉãÌ/ÝÛÛߢ<"mV‚] vuÄߞäՇXUjhôˆˆˆˆ\Â.Ú=3ìäÚª•A˜œye8ßÏŠ£ß÷…<Ú6+}(ÌÊà¿ïS‡ï8a©öwœ=ƒk3Êu.܇kוçòÁÊDRƒq§Îð<ÜBç“Ì âðíLk{>?nÙǧÔãAgÍ‹ˆˆˆ(ŸŽÉ‚Ÿ8×»,vrO¸ÍÑ+„Ù79óþ¦D~ŠÚÃû¹å¸¹ºÑµYS¶u ¢(©¶i«ïk…÷Šxžü-‘T‹4buPžÍ\¸Å ×µÁuå^&.Hæ°ÝJ«zu™×3ŒÆú£u""""—4“agõÿÆéÔ©Ó_ÚHQa!{‹ìÇj€Ëóxz^"=‡u¨¸ð‰lù<÷ãnÌWµgb-%Nùç]ÒWWZ¹VºáTÀøoW0þ”݃÷T~ """"çÇ™®‰a·‘[f`?År‹Å‚§‚°ˆˆˆˆœ'ÿ³‹åLf ^N:""""ò¿¡\QQQQQQQQQQQQQQQQQQQaaaaaáóËÈ^γ#F0bÄFŒ¸•··]V?ƒû.Ë×ÊÎÜ`á&^1‚#žg]¾€úDDDD„/ %ìßu„Џk'7>štÃsSžÄÏ`Ĉ{ø$®Dý!"""ÿZç} ¶tÖÍüœ?a¯i¹Éßv73zH8.¦37—ºs?yF=|M%$F&ûþ¸¶ç¹¯¿ÆŽ«“€úDDDD„Ï{ñÛ6uøÔ«¸¸öçÎ!Ḝ¶!šf›¸ÄâÞø:¤±{1ø6Å?3†´cÉ›Œ-?óÅ7²ýP6¥&güuáÚ»ïâêp7È]ÃËwÿ‡XsÏ~ù4’v>–“ö¤ìÀ×<üÄÒ|®äîþÅ,^°™„ršõ¼‰±wô ØÑ„-µªÝn<:ÖŸ?>[ŒÓØx¾£+Fá~–}3ƒ_7Ä’”màN‡kî䎫án>»öÁ $y-ß}6‹UщäZý¨ßæ*n¿g(­¼-5oÿ¾ 4ÿîY¾; âñ·’ôÄ ^n¾õ¸>iïzú¶ÁNÎÎߘ>s›â3)±¸Üü †Ýy ½ê¹`ÒûJDDD.ç¿4ÂZŸ‘/>No¿š;6»•—êŒ÷Ó“ uÛ„BQ<ÑieÙy<5Å·Ú«°¥,`ò›?²ñPž šÓ4ÔBzÜr¦½ö%ÑE§i¾p=S¦®$ÓÉWJHÝñ ïMÛN¾qšçd­`Ú‘”øâ^˜Bô‚ÿðì”ÍäVNa$Ÿ¿û+1¹…3⥘5áI¦.ÜIRYÍš…`$ǰôógyöÛ½”œeûöÌU¼ûä{ü¾ã.;Ð:°„øußòòÓÓˆ.4jÞ¾Å‡Ž·ÞJG+M‡cxøÉSÀgjÛ–¾Œ÷_ûŠÕñùÔjÑžˆ:$GýÁ”—>aKž¡w•ˆˆˆ(W±ÔêÊý¯?Aoÿ“Cð«ã¯£ÁÙÔD`Á§qS¼I!jŇ#I4LÔi‚ãÑu ŠÓÒpmÜœŽ#_ã?o½Â«¯?BGG o?ól§i?€ë&}Æ”÷?`ÊSqŠöî&­ütûäAÏg§òá;ÿá£7† ä¯ý…ÍYÕ‹@J¾áy>˜ö%O·s¡h÷Ïüvð¸’ñ¾Ëĉïðá ýñ’çÏ"ªÀ8‹öKIY>›-ÅàÓÿi^|bLx‰»ÃM±˜YÛójÞ~ûZÔi߉pWjwèN„߉? ”Ÿ±íÒÄÍÄ–~½¹ó¡'˜ðædžÒ‰¶MHË)×»JDDD. jCß.ÜÿÚ“˜&¼ÍÒÔs Á•Á9¸5u-KØ»ý Éu÷’O0­ëº}t n­îä Ÿ­¬Z³Œ©?'~ß^’K+Bòiç*]QÛàXo6qÄV†ýtOr O ÏŠçÔíA÷ Ùü”’LljWúV®cmÍðÁ»V„̤½)ÜÚö¥¹GÅkwkÒ›^‹X”“@\z9gl?¯èd²½ÊØEÕwÊÆá¸4JÃkÚ>pÆœZJòÚf`+ê[6›¾I÷/Ľv:våú1½hîë w•ˆˆˆ(Ÿ†;3æõi°"›æzPÇùܪIM®u‰…È=[Øš‘ nÝiæçP-ížÎÏÏçž4ìÜ…î×µbç¿s¦;«™ÌǦÇMg»_¦Óü«*ˆºál>ó³«6y|ð>uûv[ŬsÐàG¸'½Ú3NþÁX‰9ãökfœ±mç ¼ðAmV.Zʪu‰NˆdyB$Ë]ȈI¯2²®¸‘‹ß¿}šÅ»‡^qÎ!¸"¶ûÒ´‰¤,æX¦ÚmqªÞN) «×rºá%^}r4Ã;¸RPvž^Láv–íÊÅÀ èàjV§¦Pš8žò¼Ã§a]œ‚íKÙ•gqËØœ XÃh\Ëá,ÚwÇ?¼¢Î¤ À›¦mÚÒ¶mk껓—›G™ƒå,.X30jœívMDDD.diÆYÝïjãÆtêÔI=Fµûüú^ÛÞECÇK«}¹äf„EDDDD„EDDDDþ2•FˆˆˆˆÈ¿’f„EDDDDAXDDDDDAXDDDDDAXDDDDäòrAþ²ÜÆÕÓ""""r^ë.Æ9ßT!"""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""¢ ,""""¢ ,""""¢ ,""""¢ |þ”rhî[¼4e 6‘‹Zþ:ž¿y,_(£þPBŸÞ.ìXI|†OÝú^ÛŸ¾/Ï–»‡•¿/bK|*ù/B›vgÐÕ u6Uno1õFö$wñìr½‚¶Y X“üñ>coæé;¿c¿/‹ä@V ÷`Z^y×t ÄQcH.Cåé[øñ“™,Ú‘D¾c­ÜÁØ‘ð«¾Rá&Þû !¯|È=Ꭷ|Ž×q-ÛÉÞòϽµ™FMâ¡~XŽn4‰Ÿ{„ïÓÆ1rÓ3Ìx±Ž™Ûøù“¯X´ã9~4ìt÷Þ=€p·šæ¡ Š-fúÇ?±:.ƒ“3ÍúpË·Ó#Ð í_ÄŸÎfÝž,Ã"p}Ój¿üœiù ·0qÌLÂ@êìÙ¬ß_„Oë¡<8¦ ûf|ÄìÍ ä»†sõا¸³“/ üt¯§p Ç|C‹§‡“ñõ¬õ}˜©OµÁ¹0ž?§Μõq¤»Ön·Ýw#ü4—!"ò·&u.ÒoaÖ.J lÀÜ?ª> Ëùò¿ßs ö@F»›¡élX°žÔÊ’=#7’_!ôʹëÖ«/Ý̬/æ_ ”&ðçß°¦ >}o¹—{†uÁçà|¦}»‰¬ªß^íYlùu)!]è×­}î€~þ>Ìs·7ÁáÈj¾Ÿ‰©Õ n¿û†¶sb÷¼Y¬MUÍ \~ŒÂ]L?‰…öŒ~é ^݉‚yï2yAò)ËN÷œòj!8oç×¼·†9PwÔ‡|û|{\‹c™9þ5æä´äÖg'ñê#ƒ Œþœ “r¤¦)ÛϬ7>a½koF?ÿ:¯>sm òÁ”ud`ËXÉ;>e“s/îñeĶO¿eYÅÓÏ´¼F¥IÌK“Q/1ù囊ù‘x‹è&wñÊ{¯2*<‰ùÓç“PœÍë±¥°xêwn8˜Û®®ƒcùaæ½ú3“sã“oðÆ wÑ6o¼ð qņ¬ˆÈßpqN'fÂú\MÇzn˜ð KÝ¥Äõep×x˜À«K–ýA jŽ42‚ÞÍÜ0QŸÚþòßù¬ÝߟëZ¶å…1à®´õ6aºfqð‹ Df´§—'P^†¥ÍHnéPÑ!¶RL˜0™Ì˜MP–„SÝ;´¦¡§ BýðLÀì¢k¹ìb0ùQ¿°¼ ->4‚®Þ& .æ$óiÂa ¿ðœæëíù™×&ÏÃzÛ<Ú7k -™Ì–Š÷žÙŒÙl¢p÷\–f5bÔ+wÒ;À4¢žçvŸÇŠÃý¸±ö avÂúâÿz]M[_ Ðß#²dA6Åke»Cwž}ü&Ú»›€F„ñŒû8°‘vÚå§b¡ñ-w3 ¹&|¹¦ÅwDåßÊ}CZãk¿Á­ùþíÃä”CaÌ^O- ¼K¯§c¬@éÞéüv œû>¼ƒ^¾f œ†a&öŽý’…ñ#iÜÜIÃVDä² ÂWjyW]€cÂÁꀫ«N•¿„š,V̦Òcë›ýiæzô‚“{ùØØz8›§tʼšRÇýXhuô'Èa+IÙåà X\­ç}ÊÎp éD[ß™üúî{lmÑŒÆáiÚ´þ Âr‰)ØôcßÜF!€SF¿÷ WTŸ—-'=.‰òÀkhàQõ޲6øi^È_WC«§NÙÝPÇô7öb6ì8%çPœ9¾ÙÈ>˜Di­N4õ9¶Nam¨k]ÌžÔ281;Õ¡÷µÞ$Æmféê}ì‰ÝɶM(ê ”‘¶7 sía4:ZVaÁ»i[‚,+Ïbù©>¯<ñw>úyeu´âHU&«SñÙ½žZ€ÅF-+O âÈ(ÝÃGÜÆ§U»e”SZnÇÈ*ÅÀ鸋Ï|ŒEDäâÂ5:Íué&fÓñëšM`Æ)×7a`¯ºé“Égë©Û7¹4`ÐØ'h³7šÝqûؽø+–üÌ£FÑ·¶fcäÒáÚú&O)©ù&+žµNH†Ý³ùœê¦ÎüGÝþãügñä;Ÿ2{À»Üþß;&f l5Ü´ÍÈßÅ7_g~^C:wé@DŸ;èÑès&.­À¡}ÛXøÃ<8µ¤[7œët¥{" f-"r qëùí§õÔîLÄ)¯¸6a2Ù(ÊH%3¿‹ý0[–üÊüuÑHJ`Oä&¢ÒÍø¹£ï¹Ì¢2^m†Òͺ‰?ø™ 1ñÄmœÍÇ3·a„7¥–Ãß|Ž%>÷ #$þ¦­Î¨áâ;f“üäŽd—àÜt½½ã˜þÎW¬ˆÚKÜ–y|ôÞà­Ù)Øsö“XŒOç!D”¯á?ïþÀê¨X¢V|Í{3ã°a,øvùßçrN¯çÿÙ»ïè(ªÿãïÙÝôB J -ÔPD‘* HTDEQT@ýbï‚v,  ¢‚…& Jï-ô¡H¡%„ô-¿?(RB  ?çuŽçH2;÷ÎgîÌ<;{wršK•´ Ià§¾aÎÆ8v­›Ë¸¿`î±Êyiz–ˆÈÕøo<{Ç)”­üÙ6g" N€oh=º=Öš07€PÚ>Ö×?æ2gÂJ2Í>„DvàÑö ñ7}ÜìI¥š•Xµh"ߤ?Èÿ{[üÎ_Ë&óý\;f÷Ò„5¹— ü„å¿…½êÑwèsLøj#ßø‰,× j·ÈË]+à”›Xò×\ô§ x²Ý<Þøaë÷§¾×y!ÓìGÍ[jðǯCy)åuF¿X‡GÞ{Ñã÷Þœ´Öè1Þ}´A|n5¡ÇOùfü0–àOåxbh]æ:†ISvÒèÍø^ß~=™¯Þ™‚%8Šö}žÂgô”ÓwJþû«®­[d‰¶çìù­Û A83–ÉÌ'ÕæE…†Ýxµw‚õô4‘«;/;.;‘öB±±±DGG_wŸ8‹Ï¿O¡ÓÀ‡wÕ‘âÑçj""""¢ ,""""r³¸á§Fˆˆˆˆˆ\ Ýaaaaaa‘„þR½È &--ME‘kÊÏÏOAXDt²¹Yhj„ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ‚ðÿ·¼LÿmÞþl yý.w7?¾;˜ q9ÿOËbÛøÑ,>fÓH‘ZÞ¾ïéCLïQìʽþú—7ŠÞaCöõÑ{ê|^ºS“¬/`Kgç__óæ3½¸?&†{|‚ÿ½÷=‹÷gâø‡údMø•gbbx}yÆ?Ö†ˆˆ‚ðÿ—´ÌXyëõraŽÿ“ñ?Íekj:û—Ocüϱ¤(˃9¸xÇNIJhÿ¿œ„mÉLö~žŸuÛ¤ž¦æÍ1›ñ¾íQ^~wo¸zö%|ñúGÌ;òÏl¥É3œÛ;v¦YØØp IDATˆ3†µˆÈ+{U,MÊ’?X—z}\*]*´ ]mÉi§HH ¢yûºø›5`äFÌmY²2ï[zp‹×Ibï'WU¹ŠwÉû˜ùÇ~c^f@Ì­DE„S£a+|ñ:zmaú‚òÿ‰“µo]éI»Š.Ú""׈åzÉã~uî$:çæÏÚJd(¼ ˆèyGÖñ׋Ùr(|œñ­X—Vwµ¦–ŸrâÿéBîjȉ¥KÙžœ‡W•¦ÜÕ1Œä93Xºë(Ù®!DwîNÛ/L€#'™µÍdùŽNä¹QºjÕ|Ì`r¶óíbˆÜ¸‚ýÙ õÖ€‘0·XÄÊT/ê·iA3¦³y¯*?ôEð /y,Ìëñuü2js7'rÊ9ˆÚm{Ò·{4–¢¶WDDÎ2¿ýöÛogÁÄÄDBBB®}l'Ù¹jÙwСŽÁæ¹K9Z¶.‘ζT¶¬Ø 5n¡¶Ï1|7‘-^épç4­„5n1 ÷–¢~Tœm)l^¶š­‰®Ô½ó.Z×ñ&aù|®ŒÃR·w·«O©£«Y¼ÙNdƒ*x:RX=n4ó³"iÝ©=·F•ź{!ÆæV/ o³~•jZŽ*5#(ïãŠYŸGʃÙ7u43×áá‡n£ŠÛnþœ¿{½v4<Ч60ò…X]º}ûÝO³ $~õûsýˆîÜŠŠ–df¾ó?f4â¡'¥[‹*ä¯ÿ‰±fQ§U¥É,™þ'k¶ev÷“<Þ½9¥üÁ¤YiDÝÙŠ[Û5Åyõ<Òïþœ¯zWÅÕ¸ô@²¥¬cÖœ¬ØíI«^}x°u8¶“™ð[UîhL°i?“^Æÿ;éýøƒtnJÞú_ùicYZ·Å|h2ožƒG»Þ<ñ@{¢ÜvóÛ„Ðäjx)´ÿ¾'—ðÁ _±¥Lžè{?ÍË¥1wÌTöåyS«}["½.zWnöÀýðbfÍœÁâ'±Y\ñôõÃËÅ ÷RA”ñ=3uÁšTtÝ~›Ëæ-{qToKÇ–¨Wv3ÿJ"¢Ý-;w€ßüNæOSíËf¬Ã«eêºîä۳лOö{ˆv‘vÖNÇ ÷[hY9ƒY…µkщLDä¬ëèö€sp3:7ØÄ÷3P¿b'*¾¶›)]¯Ý¢¢ ó6!x§­eýšäØÁÀa¢ÜííiXÑ/‡.`_v+:6©Œ—>+³ðç2m| +Ž„Ð¡êx@Á¥ ’†ÏfMrKÊ…:crõÀÀÍC#EnÐÏÂÕ'p¯Û‚07×ðæD˜×°fá~ˆÀ'7Lcy^#öïFC/"+2 e3Ïýrzyñ³ù=>ŒÇ¿ìI F•r{ú~Ïì}Ý ¯Øø´ëK¦Á˜Rw7eê› ¤åƒáfÆÀÀ0™0™.¸ӸÏ3t­ç‰A8•ž·±ï©QÌØ”Ný†ÊÝñ϶hO]3Pÿ#s˜ÿ×12mà’v€£<]ÚÜJT)T Á/tf/Sýáž½¿±Ñr ¯ ¼úžP•rŽ}ôû:ã2§*O¢žüw«ýÁ_‹c™2|6ã÷à(níp÷µŽÀÛ\̺Yó0·x‘Wï­€àHkE5ÛíΦ~wò–±*­w6 ÂÂás•:µe‹2ëòô314ñ5€Pž>™ÌèCI¤íß\x»Õ5µBDä: ®„¶ìH­m“ø}i=úÜzÞ¯œ©ÓÔƒc »Ø°5‰„CñìÙy[©êçÝ©q§ÔÙ»1Xœ,¸»ûáræÚk˜0y€ƒœc ¤ç'0ã³!Ì<{mvXÉ·9pdXát¹±sðþ…Äžp#ªEn^Õ¸µªÁ¦5 Ù×+‚H×|ŽíJÆÜœÊg'J׬ŠÇ¯É€ÌCq¤äíæ«§dôyÇJžÕŽ#-GEÀìEÕjO 0œ\°\æ™kÞ£ïûÈp©ÆŸâ6s9Tö8÷E0“_õÊ:˜Ÿ†µYEZvö%!n- –íe÷®­lX5¨Éé3G•v´ ÄÈ>}˜×¤1 êÖ'::šr&Ò6ÖÿLŽí9†©üÝT=·ýf|#êd^rùš}‰hõ ­ÄaÍ q{,‹þü?Æ¼Îæ£Cù°gÙŪ›Uk–ÁélÝ|kÓ*ÜÊwKö’]'‚ÃËWr²Ò]4.mæï‰ÝVŽÇ%b-s'•½þÞgå:¾Ä ¤-œ\x»¸èËv""×gÃ#œÖí«òå´¬Žhñ÷Ý¢ìxæŸÈêì²DDV£JÝÖÔ*7‹ñŠ\cÁwŸì :tïÝŠ²– —7»ºidÈ@ûÆr’lV¾Û“˜ ~ËÂý½ˆŒ4pØ5gg08ìLÞ-yqh*;_¸”ÅÃà N¸:/^¹×~ŠFäž~˜á„w)3œ8Óêù«p8°;Àd1á8µ ƒ‡0+£ 7 êöž4«:†Á Îôij6}<†Û7¬dÕºM¬?˜‰_WæîÁoѶÐþ»pp­qéYÂd\6,æÅOç«iV:ö‹¡Š /ÊÕnѵ›=¶?¯.žÏûÂ(]¬º¹àá|^K†/µn#wü2â3¼X·2*1 )e¾ôü…ÉTà·‹Ü_:0DDþ>Ý_]2ð®Ñž;ÊgñëI;ó‰ìý‹X™Z•ûžìE·6M©Œ[^Þå¿ÐRD®epÏLäˆÕ///¼¼¼ðpbÙ_Ë8˜£!ÿ…¼…±é8ÕêÍ»}ÌÇŸþzPÙÈ`ÍÂ}äàD@X FÒ&â³Îb+Çwîå”ýô)Â#$ÏŒÝÈ÷ÂÏÏ???¼í»˜öÝ4vd–ü‰¶†‹/eÊP¦LÊúãv6äÙ±fÏßÏáµ¥neía'ÊWõ'wË/üž\Ÿ?Ä€žiQ¿ ^99gŽi¦2þ÷ýøÖoO¾/óÁ7#x¬Â~æÎ=„¥Ðþ[(]5û¡5ì9·-vNîÚÄáË<ÀÆdÎcÏò™ü±õÒçùšL€Ù ³a\aÝ üj·",k W-dUF8mëù_t¢¶à_9ãðöŸ[#s‡2pÈ\2‚®íþù/»>¿Blö§^ÇÛX7rG0á ˜]<°ä$°yÓ.œC\Ȉ_Ãü%©8\’8x,ß’5á܈†¥×³à—™¸µ­Gûa¶-™Ã:Zí®{&ò_ÈÁ Y“áAã®Í‰¨xÞs>ÜUûW>]³}9Õ‰lp Ç}Ȉ/¦ñd×ÚxYÊÄ™)`”Ç\ªt ]È|~úè<iE¨í+¦|Ï\GwÚy™ ¯è7ž&ÃÆ©äC9áCYß‚?š7ÈbõWÃùõÑ®ÔvKbÉc‰ókË»Õ=°ÄùàœÇ’Ekq s#mÛl~œz»Ûv&dÓÀ¾—¹gqÄôjú“{`5Ë’L”ié‹g¡ýw" Q'¢~ü‚Ï>)Ëã]ë⓺šŸÇÅa£LÁ'ÍàVÄÔÿ/†½J^×N4­„$m[Àä?Ò‰|¤¡Îàt…u3üjÓªÊ×|ùÝ,\k$ÊǸ¤R>uÓP¾þb t«‡_ú:&Û€£Ó‡W+¼]¹Îƒ0` lLç[6ðÍò“¸TjK×&S˜5w›ñ¢lµFt|¼*ë'ÏdÁ’CDv.iehþH/œfþÉâŸ×“aw§Lµ[éÑ¡Ñ%CŠÜx²Ù3 þÍéPí¢‡•>Ô¹³>nCÖ²p_Õ«Góô»ý;â'†¿þ+Þá-èÞ?†¼6àæd€S(Ý Âù›±Lþ`>©6/*4ìÆ«½;l¡è lö£æ-5øãס¼”ò:£_¬ƒ[Ç|ž½Ç`æ„¡ürÜLp­Î¼òJw"Ü ¨ùý;~Ê7ㇱ*7èÀCë2ÿÓ1Lš²‹FÏ>Îó÷Žâ»éÃyk‚ ³W9êv|žÞm‚0[(¼ÿ¥š3ð½<¾ýz2_½3Kpíû<…Ïè)—ÙžR4ø1Þ³&ñëœI|95ƒ|³å«ÓrÀPº4 9=ç÷JëføR»UÆÎx¢ÚÖ«€w †W=ú}Ž _Mbä?‘åDí6y¹kœœŠØ^ùû|êp8ŠõYYll,ÑÑѪ˜ÈŒ-mkw›©V?_3€ƒÌ Ãyf´¯~ö(aúÞ¨ˆˆüGés2‘›œ#{7S>~¿oà@ÊIŽíYÄ÷߬©a3Ê+‹ˆÈ˜î‹Üô¬ý‰¯ÇÍaÓá, @Âo½Ÿ¾5#ÄEóåEDDAXAXDDDDþS45BDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDDnúËó"7»ÝN^^yyyØl6DDD®Š»»;... Â"rý3™L¸ººâêêªbˆˆˆ\Í5U%aaaaaaaaaaaaaaaaaaaQQQQQQQQQQQQQQ¹y‚°íèLÆÄóóSíE¿ k oÅÄó+O]Û`?>——cbˆ‰‰¡ûà•¤;n®A–?¾11ÄôÇþ|t×ûxQ–kåIY?Ÿ=gþeÝ>ŸmÿIؚȔþ1ÄÄ<ƨ¸\í–ÿzkˆˆˆ\W,ÿ|<ÎÊqc˜ŸM÷s þõîç‰Na¸× =÷ú¼6avL8¹\98…uóöüýïüm,Ø~ŠÆ½04þäz¯""" Â×=ƒ}Ö²%éò‹¸¹·æáNa¸7[žØÆßã¯õû8–ãJéð¦téÕ“6a¾œwýŒ]¦(^ùþ ꜚɋý¾ã€{cžzćù¿.bç1¬ÝÞÏt§žŸùt7Ó·1í«o™¹þÖ tîÂ’ÓI ¾ŸÏ>éFˆÅFʺ)|ûã6þ©gðcú¼÷Æë²àè•…`°’º7<À·V=Ê:xRgÀ·LzÚ& ¦Ì]¿Ô­*Qå]1×2åñe GlùØVRâö“ xG5&ÔÕ\(ß´ S¦rZó¼ßz–._ÈÈÁcØ·wÉy§äåî¯ÙŽ­aA<@UZÔôÁpò i´?3f¥²eþNN5¬ËÉ"ÛÎ#y{2isߥïÜ Z )îyaEm#ýYx ¶ñ²íäsdÛòÒM[PÅݼ¨Þ².ž qªˆ}{dÁp†Í: ¦*ÜÿZoêûØIÚs€lÀ£n+ªŸ™KâQ­% |æ2÷ä!âŽ[©ëVT¿Š®a~SoœÏ“T‹Jæ5ì:>›¡}fãY>Š ›ÐõÉT÷ÏcÝ÷E¬/Úõꘫ¯Eõߢ3ŸˆˆÈ¿„O‡áF<9ä-*/>Aõ¶Í¨àZÒ™Šgnù:ÎKf†É‚“éì—Ëy¦¿oÆë´[m—¾ö¢dïøŽçߘż©Ò¨1·t©ÅÖŸ§±ó²³q4v!§g¾ÆñÕ“÷òÕy¿ÍÛ:Ÿ™u(SŒ¶í¶ÓÔqEyž÷;.¥ËâÄÎ"¶±xµ-ö6RKÇ™sÁM¦"r¸ƒ¬“òÕrð¤É€—èRÑëEQý¼ÿ?;¿ÚQÌ}\d /«Aíyó‹ò,™»€¥+cÙ~h‹mbÑo³‰ú UŠ\_ÚÕ,W5^‹êÿ»t¯¬o扈ˆüëO3ûÖ¢Ý]·^A>Ûý*aNnŽ%!pd±ý‡—éóÄÓ¼¿¸°©…¬3´ f cýbâ2àÈb÷¢¥çî®A‡–­àtÏÛ¼ûÂtkàNfaÏĵ!váélx•" àÌ~¸änaÁÎ|‹lÛ™Òa§ç”dfúQ§.uëÖ¦’[éä[Ì%üâ“ã‚7\Í6^™ÀjÁÀÑKØ—íÇ)v.\OFa¥:¶„/†üF"P¾ë«ôkêù쾩Š+¹qÁ™ÇÎ9ÈŒ[ÈÚ€S9ÂKYŠÕ¯¢jx!+‡ÇWãT±o}9žñ#^'¦’¶ý¬Ü˜_±×WP½/·®Õx-ªÿ)hr„ˆˆÈ¿|GøêxÖêBKÿÌ=2WžÝF5£ìˆ? nõ¹¿†ï${ÏÚiæµ™Åisy§ß6*zŸ$>9óüøŽ›;p‚Óßã¥ÉŒÛIò™Pc·”ƒcYx Œ'>B뀳=Ëaûˆ¾¼¹0ƒÍ â0õ+ªm'Ê·êHÄŒ±ì\8Œ×O5¦‚ã×î#é}?oRÈmðó7Óg€tÖOû•ÅÝÇm!N%ÛFSѵô©w7-|¶³ðÈ ^ë»–Š^'ˆOÎ*$—ŸbÝè¯Y“à…ÛÁßøò£3[^¾½»ÜMÇò+™|hCžÙGõ &m'¾ó^j{]T¿Š®á…o&Ìxze°iåR2VnbË‚HʘRÙï<¨T9€ŠAE¬¯ z]ú³æ^ÿÌx-¼ÿ>˜uî¹ñþ †á^“dž¾N÷FñMßÍŽyF¶¡ï 4¸²Ë»áÅ“Cž¥]Di\3“H¶U¦c϶”9ïýB¹ŽÏð`ƒ2¸8R8tØAÍGŸçî`€DVm<Î…_—³rxÕB*· Žßùev¥Róºx¹›°Ë(ªíÓs¿:¬/wDør|íb–®?‚gTžö"·—.æ6›ýiе%å\ uítæÊ»ä=Qɶñ2µô¬ÃCÒ¡fî™I$Û*Ѿû­ø_ö6rÏÝvÎ nÝjV¯>ýß²õ‡Éu®Ä½ï~@ŸÖÕ 6%³}{EÒê‰a éFqgâ–¬†žuŸäg:R·œAÒ¦Õ¬Þ°œÀê´~â-žˆòÀRÔú ªw‘ûàZ×¢û¯Ç§‰ˆˆ€ápïCÚØØX¢££ÿ“E°J`oÂ)p ¤R¨?NäîÍS¯ÍáDÅÇù~{Íÿ½¶EãUDDäf¦¯öãKùòõ)$áOý.]ˆHgýos8…ÈVu)eþo¶-¯"""73ÝÀJÊúéüðÓÖïO%Çá„WP8;>@6áx™þ«m‹Æ«ˆˆˆ‚ðM„EDDDäf£{G""""¢ ,""""¢ ,""""¢ ,""""òßò¯<>-66V•‘TIì`¹;%""""òOÓÔQQQQQQ¹Aü+ÏNÊS¡E ì¬cFDDnŒkԉˆˆÈMIAXDDDD„EDDDDn•@äÆ2f‘Š ""×Tbï Â"rcqôk¡"ˆˆÈU1F.ºi·]S#DDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDäÿÛuð'–s80ñ}fÇ;.ú¹îe©Ѫ=Q=•ØE®Z&±/Ô¦ÑG®¼³yoÖr=ïwV}ߎª½vÐkÑvFÞæƒ¡‚‰ˆˆ‚ð¿¤ÌÜÙ®"NرfåÀªÙ¬ù%÷>RÍ[Q¸Pö6ùŠ=õž¦k_½qxÐðÕQ<6¾5ïõŸÀÃs{zæ àH[È›/ÎǵÛTÞ¹U!XDDn×O^r-Eér†”#0¤Áá hÔñ6ü¬ûÙœ«=%r ~·óÞÈn¸-z‘Wþ:Ž€6ú ߟ¼>êD ÞE‰ˆÈMÂr}÷Î3f,{Æz~ûjëKÝRfòLeÒ­žº‡G³FÌ!ð®fäÅ.cwüqlÞ•©ÕánêW.xj…=c7ëÿœËÎø£d™} ¿…¦­èj@NÉ×—t+ÿZÌž„t¬8ãZ—†w¶&Ì÷t™mi[Y5k>»¦c Œ$ªy{~ÛF¾îaàÈIfǼ™lÚ•@Fž~UÝ®¡ÞæÂûšÃ¦1_²&˜3œoãîçáÕpÖø–Þû–éü Ÿ´ªÆcO¥‹i2g?ˆ£Ö“éYñôXµŸ\ϨgŸâý)«8éGd‡¾¼?â-:Up²Ù5áEú¼ù‹÷gàT¦÷½õ#ûÔÆS·’ED䆺*^/ìvû™ÿ¬äJfﲤzÖ¢f°KñÖa;Îö¿6`®Û•.O>BÃÀ$6̘ÏѼ–Í;Ī~dSV%ÞÛ›»:7Æëà,füº†tû¬ÏšÌúÉ¿³ß¹.ÍîŒÎ÷¶¡|öÍÜN–Ù{XòÃdöZêÒü^´¬ïFÜŒy;».[ [þ–Õ)å©ßíqºÜß–r9«˜=aÞßí]®?¶ê<öÑfü[÷çÑî ÁRØÌ <8b0 †óÔÈ•Ì|ã>Ã×jà Ççíná…Mx{êjbç|JûÔátnñ «N9ÈÝ2Œ»zŽÃÔc³—Ícloo¦õ»—¶é“¹Á.‰×MOþ¸aýÌ(Kƒ^í)çf`Ï(N·iY Ù´‘óG–GEj•ï*”:oÌÙmvÌ¥aúª!Ôs»p,:ûúcv»ƒ/6'ÓëÏÉLýcS_jÃkOÖãÕÅ y·‰·ž8!""7ŒëúCt“›7Îä‘k?}quذÚÎJ+§%Ï~%k6ãX Kú~Ždþ½‚üã{I±úPÚ»äïr,bsZUZ?Ú‹Û[5%<,—¼¼3‘Ú‚g/Fê^RÎM£´‘™D®ãLÀ(U×ÌDR¬î¸{záîé…«ãç.ã°¦^Ê¿xJð¨ÿñX6å–¢lÙ²”-[–Ò¶ }vKOä“ü×P^üxe;>Í{cf°6q/_ÔÜÈèo6“¥ŠˆÈ äºþ,Ó0™19rÉγcxûâí”Æ®•› ½5ãð–¯ÏSÙ+Z·s¹&„{|ÇŠis±´¬‰wþ!¶Í^Ev¹ö„X ¯„ñÁÅKN{¶î©¬ Y×»<‡K‡ç~ üÌâß—Ò¬Ie\Nl!66ŒÒ8•mDõ€õ¬:×;êáo?̾åsØAKj¸_dµ0 ¹)GIÏôÀÇÃIwæäŠxÔïO¿Èoy3¦þŸô¦vþ&~yo £ƒxº”3.ÖµŒzísöY¾à™Ádm™Ê¤]f*=RV_Ò‘Êõ}GØ=/Ë)ö­'Ç9”Æw6ÆûÀL¦ý ó×çS­]4¾Wúý—Pš<܃Ún{XõÓ7ü6}%é:ÐùÞh®äow8‡¶¥E´/I &1ãÇ)l<\–[éB·½¬]~ˆ|÷Hn{è.*dŲ`üw,ÜOõ»šSÊÙ g“–2Ô} ÑI¬›2†ß¦, ÑëVÚÅ4§8Ûhò$¸z%&2ýÏEçf‘Ëq­Íë‹3¤ú:wmÂ-w¿Î‚טù[ üÛdÊÛÑìxÿ~Z6º…./ýI©ç&3¥O•ssüEDDn†£ÀÉ«—Š%::úŠIÊS¡í§p ÉD™°ò¸Ÿ Ú¹{'óË_´}¢=J7µ`çâ3!cûG¿*žˆˆ\]¹ˆÄÞ-Š}ú/у¶þ-y‰l˜ö#‹cw“š‘IFÒVÎÞŽ©j-ü‚EDDDþuzÞÑ¿õŽÃ¿mºf±tþ&/ÈÁpõ¥L.ÜÙ¢œv‚ˆˆˆˆ‚ð™Ïð;h~‡J!"""rÐÔQQQQQ¹éñi"70cä"ADDDAXäæPØŸÁ‘âÓÔQQQùoùW¾,ì¬B‹ˆˆˆÈõEw„EDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDŠ–Ë¾Ñ½èßû3vçüýSGú ¾|(†ƒ“îøûçy»GñZ‡ønK6d­cä#O0yoÞµéʵ^ßõÖæ?Ø–õÀÞ~ø5Öž¿³äŠØÓæóÑØ“l-à·NmþŽ{ÇðÜà%ü#å.bœØep†¯ÌàzÝÛÿ/}ü§åS+ùìá¾Ì8_âq“·{¯?:„íÙ:¾„Eä:ãLPÝ0ÌY{ØsüïxîÕ´cÿ*e»¼‘¾gFEjUp½WËdæ½p?ïÏ>Ší_»Bÿ?´)ÿŽtvMû‹ã5žâùþñ2þý1ix†Ó¸}gê;c\§eºú(¢ ,"€k¥s˜]ñ§ÎܽÉãÈúäÕ¡´u›rÏ„€l’6'Ap}*xêò&7c¶’“g«bU‚|þBžÉ'ŠÖõäÖP—ë7@Ü})ŠE%¹IÞõúDYÚÁÒ͉ä5óÅÅzŒ][NزÑˇ°lC2Öj±ä&î€ïèø™Ï%ò.ç— ¿°f×1l¥jѲ÷îŒòÅ8²ö±|üæÅÆ‘šãAP¶t~ô^júaÎKø#ø¡ÿ[û2ï?g\ùúJYN4úÌ„ ìÆ‰Iß²Á¯?oý¯çî][¯}›°¥¬ãÏ1ãX¾5‘,ç ªÝÑ“ûï‰Æïjêu¦­Ë­Ûë‚ØIßð Ã?YKhß¡<Ô4à’;—í£li˜=f<+¶$Ã@…]ˆéÙ–PãLÇQáɶ¤þ6•ñÙøÔ¼‹z×áЄ¯˜³þYîa4üEº4ðÇüO/ƒÜCó˜:f2ëv§g¸R*âv:>ùõÎõ·âÓ]Éž5•ØíIXýkÑòñt¨í‹ 9ñs™yvµ‡}L›²§ÛÎÝþ9ošO¯Ï~á;¢â›s/±qrý8¾œ<ÝGø‡ßJ‡ÞÓ Äã Î3ò/\U‘›„S"ªy½wiV°§ïd˱RÔ¨]•Ⱥ¥8±a+'l`;ÇÞ΄Fãt.Q¥±rì|\Û dààh¼‡¹£¦X“XôþkLO §ýsÃøj/"3g2zÐÄ[ƒi=l8B,?ô%¿Rÿt8¸Òõ圙‰h;ÌÊQ“8Z¥#ÛVø»Ÿ–¦Íó¯uYÛ˜üæP–Ú›qßkÃxæÑh²ÿú„±s“O_$¯¢­ÂÖm=/gnŸÀˆá+ ê5ˆ Á…ö1gÓß|yé5éôÂPž}ª#¥vŒaøG³9~ösû¼Dü¸‹J¼ÍK¯ÝG@Ü/|þìì ïEÿÞ¥kåD›ÅáüaùüýüõÑ(6ºµäÞW†ðìó=‰ÌœÍøQ+ÿž¿kMbéØùXZõgà‡ƒèTasFL$>l©KøîÑlqiA÷×Þ¡g‡ vŒHBAÓ@M¥húÎHî­d¡t·Oøèxç£^×zLžÇzh£¿Z„é–Þô}ë-h鯦ï>fAPè²%=¶ÚÕ¦f‹jØw.">ëÌïóX›J™·h)æx+áñUäöV·âŒíb*Ѹ9+w?OL$ü×øZojY2þí‘lËp”ø<#º#,"×” Aõ+cZ±‰„Ì»ñÚ·Šd×Hî*ãN@Z¸Ï\žŒÔJØÄ#”æÝο1Bp—§èب,&Âðï¶Åïä¤ò“g³ð@÷~Ú“h?F…ƒƒý¿géþîT 7c``˜L&ãê× Xó05‘>Ý*x3L׸ÍH— îem›FlV]ìCåôd~IH"Ûq5mÝGéS—_wNÄéös÷Náëá3±Üý>´,[@ ïcêά:Q•»ß|˜F¥Í@UB¼Ž°÷­™¬I¾ƒöþf*Þ÷(ͪû`àO‹ÈIÄe>À½jãc€_‡ÚÌú4‰Œséü\Þd!èöGx¸y{ªû™*øÃÊ9Çȶ7€ÍW›¾tjŒ ð½«)s'žo#mÕoì°Ü“§5ªäØÇ;c2 ”uçr¨äô ›öŸ hk<¶ÀVT<ÿ"kö¢|ÿsw 'W,ÆéÓ~vB'òv3éÙùùìÇ´+ùV;Žy›üjÖ ˜=¨Y¦d'°«Ú—óæ‰ZIÛˆ-ðNÊŸ›CíDPû—èµî*ÚÊ$uÿå×m=°òã˜òÑL;·O^æ‹W…õÑÆÑßÇ“ïMeßss_p©CˆÓ<ËÿÓõ*àzf» ,ÎN¸{•ÁíÌê ³ &#ç‚úþcË»T Ñ¾Þ½–U+ör n+Û×Åc+Óä‚õ…V-u^Í]0›òIÝ{ S¹»OOc8½«Õ%À¼¤8÷I?˜XŒz]Ë1yÑ[ØJíhTfŸéÊF©UŸÚ ¢ ò0—`Yé›J~l>µiRÕÊ”e{É©Áñ•+ɨxQfÈ-Îxs¾xr ޝ"¶7«°ºc_• _Ѹ1—£f%sÛcò zƒeRÈÈ+QDAXD®1³o$¥²Øºu î;²)Û%ìtðp¯LŠ6¦¬ÚÆž„TÜ#jqÁ”5à §‚OÑ»“wKzêAyç ƒ·Ù݃Sdò«XŸ0\ps)á%㪶áÒå1™.Ѻâ¶ÜHÝ[ĺq¦b÷èð+|6š9w|Â]U\ l§ðõ\Ügöóߺ”ôªü-ï8µß‡ aqF¢¢Ñ¢'õÃÆ0bQñjn2—6UÐÏJÔ÷‹êuÇä‹yÖ&fØoZɦ ›Ø4i0Œ©L›7ßáΪnlÇå—}‹fWrl¾„ßFÞÄe$fx±mu:º6Ä×\üñVÒã«Ðí )~Ý Ûç÷Ï–ƒÍa¾FãÆÀ8‡»LS‰ë ÿ͹™8•%2Ü£‹ÿ`}j 5«ùœ> ^TŠ!gýo,=h¡|½rÎq,ì.sp(î»IÌ÷ÂÛ×o_?<컘;n{³J:ïíZ¯ïŸhÓ‚O¥@8²…„Lǹ»†ÇçeØsŠ˜‡XT[…¯û˜pªDÓ[+Ðàa:WKaáØÙ±R‚>Î'78KêVöŸü»³y‰›HÌ B€Óu6hdmû…‡ëÓ{è z>ЙèºUðÈÉ)æ³kð Äž°†ƒçja'#nÇŠ5gÔŒw…ÿÏzÙHß4•ßfíÇ»n{:>þ2/ŒALùý,_p€üb/{ó[ÞµZš½Õ± Ùx*œfuý/ …·¹d•¤Ý’loÉ÷Õéf¬äåŸm7Ÿ´ɱ_£qc;Ä–½™çƦ-m+[8VïýÜ& Â"rWÊÖ«ˆ‘¶— ¯ZT °œ»€øTo€_f<)¶jVt/öÝ çʸ58Yÿaùæ8öo˜ËoŸ}Áòãyš“a#+ù)'s‹ /E¯¯xáöŸkÓÀ«ö]ÔsZÃO_MaÓ®}įÊO7@•ˆK¬-s¡ëö;ÿ.½¹ {ÝMàþŸ™²"å¢)…÷±lõN4ò‰cÊgãY³mñf2é‹™d„w Qðõ„ Ìî>8gűvéZöíÞÆÆ_ðÍo‡±§ïa_bfÏå5ã×°ÖåüðùϬ۶‹¸¥ø~böbŽr—ðkQ¯’Éó/Óû^Vü<‚ɳV²gï.¶/™Íºd}/úX·ðe=®ðØ2|kÓ¤r:«ÆÏ"£Z["¼a%i·$Û[ò}e¸à|„U3–8™ƒ+dâ¼ÔÒЕƒ,6Î_«¶±oÓ\&2–xßVÜá~Îmr­ij„ÈMÅÀ3¬Al'µZC‚ÎûDÝX—jÞ“9î\ç‚ùuEßp ¥Íƒpún,}2Ÿ“6/ÊÖïFŸ^Î|«ÜªMj°pêP>J}A}®r}ÅùƒRækÜæÅUôªÇýƒžcÆ7“˜8è'r\ƒ¨Öj w®€%ÿØÕµUغ“.:—ïÄ}­çñÙØY·?5ÎûË…öÑ î~çܾÏô÷ÿ Ã@hÃÇx¶g;Ì×ߨu­þµÿ”_&c þ”¯×ûÕeåc˜9}'Q½‹ˆ’þÍéõv“ÇLfÒ{S0—¢yï§ðúvJñŽ·È«¯WIÇäyǬ{íÇy´Û(¦þ>œÏ'Ù0y•£zûç¹§UÐEù­ˆe-\Ù±eøR­EÆ®x"Z×ÂÃ(á1áD ޝ"¶!/ñêö•[uºò“÷^«?˜Ë¾ozÑÿ…é³¾¤-ñW÷ˆaøÊ "" Â"rƒ±%3ï…ûyöQlêo‰žá4nß™úÁÎ7""%fQ DDnL&Ÿ(Z?¥Bˆˆ(‹HQYûX>~ óbãHÍñ ¨N[:?z/5K™ÉXû)C¾L¥ýûïмŒÇ©L|áCŽÜõ!ÚcºìkOŸFl)ëøsÌ8–oM$Ë9ˆjwôäþ{¢ñɘÏ'ÏΠö°iSöô²¹Û?çíOóéõIwâßÀÉÀýøßÚ—yÿµ¸Ú–ƒœø¹L;•{Òp ‰¢Yçì…l·-m³ÇŒgÅÖƒdX¨Ð  1=ÛêaœžÚðÌ8*>Ý•ìYS‰Ýž„Õ¿-@‡Ú¾~lfMdÎKõ÷9pt9¿Lø…5»Ža+U‹–½pgÔé×;Ѝ]Q.W[¿¼uŒì7ŠÀ7¾$¦ì–"·Ãzd9ÓGÿHìÎTœ+4¢Õ=UYûÅrn>„hÈ=4©c&³nw y†+¥"n§ã“Q?Щ ÑTäò…·g^—ÂöKõLæ½té¸qÕ!."%½¡ ˆÜ$¬I,zÿ5¦'…Óþ¹a |µ‘™3=èGâsÀ«^/î©}ˆß¿]Lª5›½¿ŽbCéî<Ø*s¡¯uàÈÚÆä7‡²ÔÞŒû^Æ3F“ý×'Œ›\h@ÅBëaÃéb!ø¡/ùø•ú¸Ñ–-u ß½3š-.-èþÚ;ôìÄŽ±IÈ¿L9»˜þæ{ÌK¯I§†òìS)µc Ã?šÍqÛßµY:v>–Výøá :UØÇœ‰Ï-FO'mVŽk» ümƒ÷0wÔòŠª{Ñ3{KTÛB¶Ãqj“Þú”uηÓãÁ<ÔÆ“Ø8tvjsþ~þúhÝZrï+CxöùžDfÎfü¨•¤ÔÍ"–/²½âÔårÛc»Ì~)!ݹIä˜ÍÂaÜûiO¢ýL@B öÿž¥û»S1Ò¨G%öűLüy©K}h?¸N¿·°×ÞGéSӈͪ˃ýb¨ãc¡<žÌ/ IdÙ ï—a2c``˜L&ƒüý…µCûý¿±Ãr O¸žÔ¨JcïŒÉ¸LžÁªU¹û͇iTÚ T%Äë{ߚɚä;hïØxµéK§ÆÁ˜ß»š2wpéù€Káý=V!¸ËStlTaøwÛÀâwrÒ ùÉEÕÝ¥°LÖ¶Ë×6ûâ€zÙíp±iëóñh¿nÔò2 ¢"=S73tÊ™×Ú-Ýþ7oOu?3PŸ£sX9çÙ6ð¾øjQèò(¢½"ÇcháûÅp+`?ˆˆ(‹HA*;!Žy»™ôìƒü|678¬ä[í8NäáÀ³3îé±÷Æ,¦ô}Ÿr[ˆS1^›IêþDlwRÞóì/jÿý9ýD‡k×ÏLR÷ÃTîîÓÓ0ã]­.æ%¬ÏFúÁDòý£©ìk>÷Sç:„8ÍãÀ±|ðÌ^„V-uî#2ÃÉsI>/3{Q¾Šÿy¯wÅb¿î—qVÒv_¾¶d­»¤oG>iqÉ8Ê6§¼Çßëñ¬Š›‘|úŸ.ht§/‡w¯eÕŠ½ˆÛÊöuñØÊ4)¸k…._T{ö¢ëz ö‹ˆˆ‚°ˆ8ìLÞ-é=¨åÏÿÙÝóL³‘“v+žp”\Gy,FQ¯u#u¯L¦b?¹ÀaËÁæ0_A?]H^o\ÚŽÉ(ÙS ö³3œpqºŠ»Š…¼¾xu/|¿»¶—í‡ãôz.)ƒqö¦ö©mü>l‹3ªÝ€ˆ=©6†‹.Ó¯B—/F{EÕÅz ö‹ˆHôÞZä¦`àŠ{Ænó½ðöõÃÛ×û.掛ÆÞ¬Ó¡Åzh~ϧùã]ðY5Šß·gâ(òµ|*‘-$dž ?6ŽÏʰæbVòòÏþ.Ÿ´ɱ_I?-ø…ý_{÷U•¸üs§dR&! ¤$t=tÁ‚]± vEWÝßZvíŠý«®ÛÚEÅ•&½·@Š´ÐI#$$™”i¿?H3 •ò¼_/ÿ0÷Ì=çž{îðÜ3gî„ãÉ\ÍÞÃuy(M_÷+ÏÜ5Ô,ËþŸÙUòKê¬ud9›Ð¬‰õ”è÷Úæ*jëÛ‚z?7ÌJHËpŒœud®ÓEQúŽƒKW¼86~Ãü}ݹõ…g}Ý%$u' ²òWžO\Wùºê3ýÎ~Q‘“àÓr¢3™ñú,[ŸÎ®´9üðÆ[,+hB¤ÝÎL¾÷Žc>ð*®êê÷ÿÇ® o¯5˜x)ݬ«ùúÝïX·u'»×Læë¯Ò ¾-!öpšøä²òÇÅìÞ—ÃÞ_òÕÜýG¼û˜ 7Žœ Kª°ÖZ—•ž#hëZÆgoþ”[I_òŸ~•ŽçWæLm­GЫQ:ß½1Õ·³;m:ßšNiëaôŠþ-Aøèözo¿×QWm}l®ÿ[}P÷KédZÁ—ïNaÝÖíl[2/gR3Ek`öo„#5KÖ°sÛFÖþøü°ÏíìÌ*?æY½u•¯À^k}¿·_Nþ<ˆˆœpºä©§žzª>³²²ˆ‰‰Q‰ü Jÿˆ_0Ó²wG|vÎgÞ”ïX¸<ª–—1zìšù»Éýé%>]בÑ÷ #Êf!(>Ž’Y±¨¢;½;· Õ¯¾Ö„a‹¢}R,¥«§ñÓwSXº¶°Áw2úŠØmMhUAúœo˜ñÃÒDsÎÕÈ_WN‡‹úÒØÇŠ¥,53¾cIN{Îéß–ÖµÕåG§®¡&Ï`îÓY›åG·ÑWcß´™F/ >ðèeXÃhÛ+÷ÆÙÌ2™Ek2ñé<Š›Ç%Úf€3‡ÕÓS8wíCk’¥§x-‹Ñîâóˆô96SÓÞ^ÒNøúb: D„omý~¢Àç¦(u+ Ûrî¶øÖÒ·ž#Ú˜WëqDÆÐ¾[…Ë¿g攟ØRÒ”Ác’Ø¿&Ÿv"&ª ‘•ëYüÃ÷,Z¼ž¿$®¼sîµ3Yµ¯}{Esä*K“:ʟӃεÔWg¿Ôu^|9}"µÖOäh>sÍðz½õº‘NNN&))I£AäO]­>†å)Þ̆ífZtmMÀKź×÷Q#îxåfâ|NïúDä}_¯Z!"rðVlcöÏñÕŒ4²÷—°ÇB&¼K÷þDùœþõ‰ˆüš9iFXž‹¢5_óõ—³Ù’ëÀ§yßQŒº¶?6ã ¨ODþ(gòŒ°‚°ˆ‚°ˆˆÈY„µ4BDDDDÎJ Â""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""r‹º@äÔí£>ù£iFXDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD~'˩ү#“5óç³jãn *<øFмóÎ?§#a>@Å&>yu6±·ÞÃù‘–SªÙ³xë¿+8ð+Ûc/€[:Û14ÞäLP¶‚Çoûœ6/¼ÉõÍ­§G›)Œ»õ}¢ŸÏ- >:‡""rêaoÙV¦~0‘TO}νŒóûP‘»…• ¿åÃ<7cÿÖ™F U™»eï½Ë†÷p{¯à™·†õæºÛ:àôù×j²ÃÌôš‡Ù‚EDDD„UÁŽÙß“êíÆµwŒ µý`dlÕ†6Ñ&Þþ| 2ÚrYÄ)Ü‹ÖFDÄÕ½8vLã›ô*¢ßĹÑV4ác”ïbŦ*š]î&~Ç}ŒêZóÉkß½?9ë÷RbiB|ÒeÜzó…$Ô¼/Õ¾½aCDDþæ§žzê©úÌÊÊ"&&¦ÁàÌ]ÅÜ”*ÏïKsÿc*˜üoOÓ W>kWì ¨[-­¹¤®Ê ¬GOâ¾Æ]¼™•?{iß§…‹ùtB ¶¤aŒœDK[Ëç®…Žý9g@'¬›S)?çïÜ?¬)>žBV}þ_æ9Úqþˆ¡ è…kÛf&W’Ð- o!ë—§°cg64ïIï® Ä„Ô²ÔÁ]DÊ7XVÚ†+F!Îï`Éê f½ÿ«ŒŽ\xéPú· ¢pÍOÌI 11?O!ë—­bëî b çâói”»‚ù«J‰ïÙ–FÔÑNeai îýiLŸ:—¥[|é{Ý-\;¸δIL˜VHÛ!=ˆ “S×ÑdÈPí¹Lúa¾,íÅ wÜÌ•ãq¦~ÍÇ3tÜ™ÆÞ]L|ìE‡^Ì­·]Ï%}ã¨NÄ×k£8`æŒoybÜl.º•Û¯Jg¿müðÅ|è3„uìÛbÈ7òуãX4Œ;ÆÞÀEí<¬ùês–û÷cP‹R–L™ÃŠu¥tºv,·^Ú• =?ñíÜ º_ÔPçV>}ð)fý¸iìÍ\Ú³19³?fBJ#œ›€½ºöí¶Ì†;ùóüåÓžªTáK­á`á.˥ħ_D⃠ˆiB`D&?†aÂÀÀ0L˜ pî[Íò܆Ý{] †è0ƒì×g±:g±€Ë‰¹Ë5\;0¼Žs’»|ÓwúÒíútúå˜*÷.'­4– oº®Á& –ÿ"ö|´Šu…ݸ! éÎëÐ34 K>- Ì Îü:Ú§/IÃñb£Ûÿàš^A@린ëîùñçèÔá—rÕ»g1uw·ÍÀP@|¬Áö»>eÖÎkho!vÈî8”®¡f žÐÜÙÌû)Ÿr7ØŠöPh4å² й± ZÅ·s ©î}··Õâ² SXXÞ•{þ>’>ÁÇ=%9ü7#‡ðB³+ïfTŸ(Ì$0âê4f<¹—"8¶þÈü¢VŒyæF…›V4Êeó#ÓY”=„áµoÑ`Ç!""gU6,¾X(ÆáôÇOkº*ʨôÚ8‰IŸè$º†~ίý‡ÔíhК¶mÛæg÷ÑÿÜWægrÀ™Éo<ÏôCux]8Ý^¼¥.ˆÌ~Ä4®³³ª2ðͼl÷»… ü˜5vS¾¯g£¶4³ÿŽ}ˆ´¤’Uì‚ ÀìOLlà/½`öÁlÔ³(KÝÊW?Ç]/¥á°µáöÿ<Ãá'ø8ÁÜ”ž­aSH;ºEº™·c?®ÃAØCyF:…ÕÛx÷îëùïã²ÚåÁ[T×ÖŒA—“™¾†ùKw°mëϤ­Þ+²¾ñ1(òÞ¹óNæöéM®ÝIJJ"6ÀDÑÚ:öÍ‘ŸÌ¸(HÏÂq1-ýÕJìð‡yÀ‘æ@â[…¾¾ «/V£æú,Þ“Euã$Ú†üÒ¶Ø.ÄYç²-¯‚âŒÚ¶;ñmÓPÇqçHDDNÿ l ‰£1Ùž]AŸÐc1æ.`åÇãY<Н¨cË]ûà?q†_K†Ýõ]¶obsú6ÏÀ¼iQ 3†ÁÑǼÎãÅèÂ5·&ê¨Þ00ûúÕg¯µö$îulgÖ7ËÙ=„»6¥^s<†Ï¡ІŸ_ù˜´ÎvŠÔƒâݼòvU͈3¬5þµ€eÂl:zœ™Œšqxì¸4 â¡®¥¥ÏÑå-v(ÛÈãžgFi<½z÷ óy£éßêCÆÍ?XÊžÈ-¯~Èyi+X™²Ž•ÆñÕ{-¹bÜ“\XǾ\#˜L¿þ$ÃZçu|ìõiÂ{ô½ó ·{ô8êŽDDä÷úËPÃjERKƒó–°Ëqô?²Õ9©¤ä›ˆí}|°ôºqº½‡gƒŠ÷æQå©™¥*ݾ„Ù+rlÄàKFqûÿ»aáûHIÍ¥úèÚñmy¹. $À›ÁÒŸ–²·²žá9ÀÏS¿%µ²%ïêCøqß'2ÑkÉ.2Ê<¿_þö¹Ó¨®û‘j§œõ [0áDDDŠß¯e,w©»‡¿¤ê)ÞBê>-C¸{6‡½t{œ„„„Bg+S>™Âære¾ajNwzåî} »ÇXYIÍUà¦(m2¦î"¸ûP®½ë_¼üÁÛÜÒlsæd`©ußÞãîéC[†cìÛÀ®ÃÛÜäÎy>?›}îÚzÅLp\4ÖŸÙZüKÁªÌuìv6!!Ì·Žíæ<Ž“8G""ò»ýõ_Y6‚è8|(?¿?•Ïß) O¿DâÂüplcÕ‚Õ…õgdû@ ÷ÑÿP„Z‹H]ºžÖã0rV3cu)˜¢O6)óVQdF¯æ8s7³¡ÀDH;fÀ0ÜT汿,€ÆÑ½è–Êüo¦ãwa7"<ûظx6) "Éßg)˜â´)ü°¹’ð¾=h\šÅÞÒ£ï5l¡QD4ëCû'ü4iÖ! ufšNI››cÅ/¬¶í>Xóê8DDäÏô—?5ÀäMûN1øÈdû¦TV$§±#×Ihâ…üíŠ>DÛ 8â©ñÁÁÄ6®f×ê…,X²–Ýåéu^û·WÒªWÂÚmä°~ÅR–¯JeSF%½FpYߦø™ÍX*²Ø°|1É…q$%6£e‡ød¥±lñbVþœ‰3¦—_Þ§æ±f®BÖ¯HÇ¿K/ZðÑ Nr–Ï&-ÏMyÆFÖ¦¥‘vÔ©d…v§{³âÛGãÙµ†¥‹–°jK>Ö„Á\}E>'®ÇSºƒä´Rúv%Ìf§Ymíi îýiÌ\ìõcš²fâçüof%çqÛÃ·ÔØ‚Q}ÄS#‡Ò¶oGlÛçó÷ß1}i:U —qï½#Hð7a kCÓÊõü4ù{¦/\O®_7Ý3WêLæç´fØeChgÚÅâ©SøqÆ\–o-'nèÜsIìÖàZ÷}Ü=µ-Šn½c)Y5o¿™Â¬ÔB"/¸“û¯ê@'‡Å?¦8hÝBk®/wÑZfÎ/¦Û¥ƒˆñ#±O<îŸg3åÛÉÌHÎħË(¸w(Íl†µöí>ˆo ã‘?áõz½õ)˜œœLRR’zLä W½ý#îy"›;>|œîþê9si:BDDDD„EDDDDÎZ!""""g%Í‹ˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆÈi¢.9½x<ª««©®®Æív«CDDäwñ÷÷Çf³)‹È©Ïd2áë닯¯¯:CDDä÷ü›ª.aaaaaaaaaaaaaaaaaaaQQQQQQQQQQQQQQ9‚°;Eï¿Ä»s3¨òþÖx©ÎKaò[ÏðàØ¹jäUÜpûÿã¹Oæ³½Ô]SâÀ9’‘W#ÅñÇŠsïDî9’‘·ÂŽê3xT8VóäÈ‘Œù8+ÊþðBÁü§5ò>¾Ít}Ö÷/౫Frÿ÷Ù¸<y+ùì黹~äHFþí&þùê÷l*õ.2¿»Ÿ‘£žd^¾[W·ˆˆˆüÅA¸jóç¬fÞ{ðò̽¿) ;3gòÂ?^à«EëÙ•WŽ×j¦bÿ^Ò¦¿Ã¿þ” e^ÉßÊ•Åw÷ŽdäÈ[x?½êO¯Þ[ºž/'l€.W1$ÆzäY'sát¶{j«w1éÙW˜º!s³v´ s°gÅŒ{m!n 1ƒ¯¢+ùü˵”jXˆˆˆÈ_„«`ÝÇž|vç³àÝOØPDŸÏ?Çɤ‰™øîƒ òf2þÛTë\6ÿî<úÅ|ñÅã$ü‘¹É[2‘%¥ô¹´;Áà­¦(s Ëÿ÷2Oµûøûªí3˜“ D_ó/ãÙ—þEÿpn˜Ê²<7Fp7.ék§|é×,ÊÕ¬°ˆˆˆü:ËŸ[ÝÁ0Ìs<4´6£Q©`³¶zP†ý} }"mXÃ’¸î¶ Èü*OiåžC¯p±?eOÿo6öy‰ì~9c﹂öà¥*g9?˜Ä’M™°6¡E— ¸á–Kél®©¯x#Ó>ùœŸRw’_éKXë¾\vÓh.H8AÛóÚ?ßdUy(ç>øc{…`>ªDmõyÙ7ãIîûx+n¿Þ<ôö?éQ½q÷¼Í—n÷¾É¿Î Åù;ÚëÚý÷>ð=ù¡óÒø›ˆ÷ªô÷ûÈJ¢GñÆË½YùÐ}LÌ(aÎ#בõÀg<Ý>•§o~ƒ­¦ÎüûÓÇéî^Ç.|ù?¬ÚJV±— ¨z\|#£/h…Ýî¼é<4ööø÷æî1˜7i![ò!³’K£h5¤A‹æ1c^^׫®s9¿àËr¬ûø¦f¹êUºzß&ru§_3Û[ »Ýγ¯¼ÂóïKÈ¡#ñläý7f‘ƒƒJö¥L䵯¶Rxö/áµÿôõ¹øµîAbD;W|ÅÓÌ&‡*Ó™ðÈ“LX¶ƒ¢ÀxÚ6µ¿u<õ&‹ Žž]ôVlcÒ o±ªÜF§›ŸàŽãBp]õ™‰<,×ÅP±’ Ó¶°aÊWlp5ñfnë×°½'d¥çu×Ñ3ÀJÛ+Ære‚í'a7“{wfýL–3’ví¢ñælaþ‡ÿæß_m税•¼ýÎböÛB𧊼õSøÏÇk9Ñê÷þõ¬ÞÖV½ˆó=øG¿vŒyâQ}ô!®ïpl„uQšW³hÙ/دfðVìA>€›’BnÀ·Y­¬·f=š‘S'ƒ×aô‰¨ßd´§¢¬fÙƒ_þæú¼"˜Á¿Ç»ã?ä½±m1€â-éìw»Ø·p2)•rþÃ<ùÀXî{ì)nN0 p.“Ö–R¶q2³ó€¨‘¼øú‹<ûê[<Ú/*S˜š\ÈáIgO!ËÞyžo÷x‰½äQ‹Ïqí¨»>¯5†¡w¢93ùY^˜U–öŒ¹c aæßßÞ:3 áG³îI$øÓ´G?:79þ¼TlþŽ©{ÀsydükŒ÷*ãŸ8Ÿ gÆ$6”™rùì…xûõ·xû¡žØ€Ší›É?Á}Ouö²ˆvQøçÁÄ'v¥k×δnr|¯º«kvd±Y^VßšÀì®:X‰o4í"€ìudUê"‘³üÙúw½•縘z~^mò À¨®,¡Ò]Mé‘`Çì1±±…··š}›r(šó,wÍ9*^‘žC®&Õ@p§nDùØérßGL¼Ç & d,^¼’©)6ÂZDâwÂ%ÕäÔZ_>ξAø4Î=W-æI™¸0Ñúú;au¼¾íÍhˆ3æbÿö=T]\bmÑ£Ñæ”d^à¢ëÁ• øµ¢sS_ À7¢)Á¬&×íÄsÜŒ°—Ê✀ˆ½ïÈÌ>5ÀUé˜ñપyÚ„Õ׊`ò#Ôp—RTá=%PDDDþâ p0ÇÖgqðA>‘ˆd5{‹ÓXã¤Usëá U¾î}žþ`Õ1—ððþƒ° Ó¡ÝÆQÁËã®™Ó~·t¶·±…Eb^z°ä¡Í0Y°ÌQG>ÜË7: gv>iŸýÝ邏¿q\Ы½¾¨šµ«^ÕU‡ö졺څ÷hïá"¿ça Gå¡î=*ä¦_B­aœÄÞê7\íáv G‘£f†Þ뤴¤°Üäàr Œ“Þ³ˆˆˆœ}þø©2s ÀÞý6ž{ðäB0€9,‰ [@?¼ó ë‹k>ðwÿÌ÷ŸÏcç¾\Š¢iTg¤÷!,! €òò`ÚvéJ×®‰´ð«¤ô@)N‹/[DbJÖ'“Yxlúì_Üyû=¼´èˆ¥ösxhÜ#\Ý (žÇGÓöâ<éújÖyTíšÌøsÁ°ãìžø63³œ Ó^“¥fÝri&¹/x«ÈY¿•'ìïQúÈð‡/P¾v>K½57!é XS XciÝø·ÜOøa…_BmÝ£ÐÖñØ?§’UÞ›Y¾Û ÄÒ9öà ƒý5c/ÄO³Á"""rbüŒ°­-wýw"w˜¬˜Ë49œóÆŽfÙCŸ±içž¹u 6»Î²ŠšðäוÑ×´ÇåuìÈJÓÁÃiûãÇlYð"•õ¦™7ƒµkvRjíÄ]oö!±Óe ]ËœÜïù÷ýiÇæÝ%à×Q‚1ú¡Ÿ@üb¹hô¹L{v™“?fÑ 'f>©úŒêÝü0~2Ù@³Qs{Ù«<öã¾|g=Ÿö»Ûëã׎V°¯|ÿ¹íV¾w‘“[~Lõ!Àà©S&±è†¿qNàÑEüÛ]Áð¦+ø6c!Ïÿ}'í›™ÈØ´›R úâ«I 4 âäO­OLg¢I!{S6•—ESŸ'µù&\ÌQ‹˜œ3™ݽœÆUûȯ[×Kès¨ÿ«rØ’ Dw&ÆW¹ˆˆˆœØŸ2]f˜c>)c‡óèkrõ€ŽÄ5ñ¥ª¬Ÿ: ¾™§ßxˆÁáõúæÈ¡<òâ] iLÁšE,IÍÅÞyw¿øç…™1ü;rË qM¯æØÆæ=Õ„·»€»ž¹sš[‡A@§«ù[k\ùâ«uÇý€CíõyȘ6žoö¹ñ–´¹äzø‚{ëç¼» ~g{€NÜøÿFÒ9Ü^UöŒ¹cAG52”—"Öû×|ϼŒ<‘ÙÖ‚«Ÿ}™;ÏoO´)‡M›2!²ƒo‘ç¯Mà·fMsHG’"Á¹m{ê¤}ZrÕcÿdx§p¬ÅûÈ÷„Ò¢ÏõØÁr*6JDDDD䦥""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""Ò,ê‘Sß´Ý…üßÚ Ö”q ÚuV{°ÍB°@žêÙœ~Q4DDDAXälñ¿íy\3{ÓY{üÅU.æf1?«˜E—u¡ÿ Âpqq19998Ün÷YÛWf³™€€bcc±ÛíºxDD„ENoO¯Þ Às½ZpçXü-æ³êøËnþ¹|ïoÌæÉäÝÌ»´óQÛ÷ïßÏÞ½{±X,x½Þ³~¼x<ÒÓÓiÕªº€DDj¡5Â"§¸m%<صÙY‚¬fžïÝ€”üÒã¶geea±Xp8x<ž³z¬¸ÝnÊÊÊðõõ%++KˆH4#,rŠsyjf9­&ã¬íƒP›€’¬®¬¬Ô 9FEE…:ADDAXDÎtZq¼³y´ˆÈÉÐÒQQQQQQQQ9¥è—åDÎ'Ë6íä‘u¬*qRmµÑ!*Œ{7çú&–³øŽØJX‡®´8òonªÊK)ÎË"3¿œzýF›%”v]›R¶qÆ›ˆÈiB3Â"g~ f}Ú:Î]\DX›~¼¼óÏoÎ0o.7NÞÈþD±§‚—'.¦Ë†J\gYyËö²eÓ&6mÚÄ–m{ÉsøÞ¢=m£ýþMÒð%ªSO:FØ048EDþRš9Ó9Kyc]-zôäËØb`LÕSyys9czÙþýìäuVP^Vvpö·ŒE…”Tµ§cL ¶_íÕ8Q‘Ó‡27€—£âœ5/Ld¸Å†Åã๯“y¬X²Û®N쿤1~åûynÑÞÏ('ÏäKÏ–Mß?†ž6 º >ßÉ ¡qd¬ØÆ¤€vìнº”÷—nã¥Øã²Ð..†—ÎiλqZõ™#/›’˜‚,ä8Á@x\Q!vlfÅydì΢øD!ù×Ê:mDwJ$ÖˆëLÏtR¶ã>™}‹ˆHƒÑÒ‘3ÕÎ- >l_³†6?¦óÛŠÙ\áÁ‹AtD(ƒ[1›üù÷ß’x!Ä ±_/ÊG4¦‘³„¾[ÏKŽ^¸¸KÏ¥Eö6úÏÈbç¡e°ž þ;éá±¼€¿ÇÁ›SÓx°(ˆ§†v#yDC+3¸äû¬tžfýæ® ¬ lv&×È6íhæ[FÖ¶lܲ—K$­Û5Ån>æuµ•5U’ýó2*¼8ö®gÍÖbÜ'³oiPš9ó“0œÛƒ¥™¼^Àss²yhµ‰Íyº}#ÂL`2 L&‹%9|ââ?—ÇsS ÑÙ·‚%“3™PÍ“vÀíÁÚ¶#Ó{Ö,¹¨ÈÛΫ…¼}]<7Ô¼¦{¨ÁêÏ·ón~szGŸNÉ΃Ë&³ “‘þåì^ŸAAµ(§|tiF¸&eGÌ.ÔU¶ìà,¯×‹× ¦€:Ê—êËw"" Â"òÛ™|è×¾%ýÚ·Äëq²9»€ÏÖgðúâ4æèFjß ìG½ÀKn¡ƒ {ýüYÒJgs«JÝ`LzÅø^_\¼ÿ™®ÜúÅî:ô2¯— ¯Ãƒóiô1xÜÌ~ø˜ì´HìNóÃÛ L†V„ë,{ŒºË+‹ˆ(‹ÈoRQ°—[S½üã¼8zXÀ0YiÅK±á\¾4™>[sXŸDßz.”2ãÅyhéªa&ØòK´õx½˜ý"ùþÊ–t;æÝÅÇÇzz=%Áì‡ÝUeÕx ¯«€m3(?&—zÝ®£™u•=æm·îò""òÇMyˆÈÍlò°z{&¯g:›[4€Ét‚;bƒˆÆþø–±Üñ˶ʋŠXëö%)ðÄoÁÁvB+JYç¶åïC”¿až^Xº—%§Õ¿Lø‡GÓˆRò8qU8p[ð7¹p:8N\F ÑqÑšŽ÷'Sö·”‘†£a‘3œOp7Ï`ôÌT*º5åêH?ãdkÖ>Æ­s2 _ -€L†—¢ârv8¬$D5eŒÿ˜µÿ>á´rà­Å™äE¶âÆ'zØp@x cCrxâ§tBûE‘è)ã›”ü—æÜã{ê†:Ãê‡ÝîÆÙêK@H1Mü(ÏÜHaµ+—ÜŠ0bšãÚ›Ãð§qt3ÂÉ$×å…#–>{u”=ôæëë‡ÍꤲžåEDDAXDN–ÉÆõô¤É†]<³q7¦8©2YhÌMçwãáÿš5¾&ÎKæõ5H*K$ch(¯]щàE;ypj&yf=[¶biÿâí³$³Ç.ë‚ÿâíŒû)‡l•NÍã˜~N,­OáÏŸ {3Ú´?ônªÊËÈß½‹ÌIEND®B`‚2407_create_agent_based_load_check.png000066400000000000000000001341331516513262500342020ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/24-agents‰PNG  IHDRµwŠ€©þbKGDÿÿÿ ½§“ pHYs  šœtIMEà ./VÔõ. IDATxÚìÝy\UãÇñÏÜ˾ Š€‚ˆ . â¾…¢¹k •š•m®™Ï¯=³UÛ×ç)ËÊÇLÛ-5SsIq_pDÙ¹Üß ’;=fZß÷ëåë%wæž9sÎÌå;çž &ÆZ¹™Ô""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""r#²ù#o²ŽŒRËÝ Œ—©DDDäoO#µ""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µUWœ4•á11Ä<ô){Š.¿~Ù‰%<=p 3ÓJÿÐr,9$,˜Ä £ïg`L w Êc¯NeyrÖ?iKSg0:&†q«sÿ´mü• z4kÀ¯w¶%kØM=ÜŽ„[1¡ †N.‘$³#·5õ¦žùüE6NŒjè‚ëß'ÔshùŽœŒcYrÑŸ¾½ƒ³ÇóÂäí¸ÝôÏLx—ÆÜEó²|8î~;bùs®\Ð¥O?:øÙñwËxv®5øü®6üÚΗæÖSü’ÆäýÙsõæ¹®-Øß§­ìt^‹ˆˆüÓí½]#ø©ccÖÝ\‹úæÊ¶:ÝÎGÑÍ™ázÕƒ­Í_“i±bí ÜÚ¢éöoˆ[žÌìÿ¬í%1on25bÞcLLlh@ã°:”Žy–ÙKS‰PñúU µîáÜ:$üow¼öî¼Ó¿:çðê/;y%¥ˆâ3 mhÑ$„yƒXzs Mæ§s L縈ˆÈߟ‰°È¦|Y¯|TË«nCÖÞ í¥“d_nmʰjåëujÆGÇÖ3$¥ôª}›ý—„Ú¢ƒËX{•ț£èÀlVÇ-#yH!gR­•‚äÅü÷³™¬Ý›…8Ýo ál6ºÜòsXK(,ŒsšÍ¾.ýG¤}uN_HXó“XôÅdf¯K$³ÐÿæÝüð´ð²üMŒö5Ÿ¾ã_ý—5÷pWÞ$¾´ŒÏƶÆÕ(fÿÔÑ<½±3ï½ZŸ/G|Šï+ñ`°¥Ç6ñçÓX¼ý0§ì|ë~/#´ÂËæ2Û½ÎØFM0Ú­ˆIs¶óBjéïÛÝZÊÆø]t±‰`{Ûz¼Yû–ü-§_ˆˆˆHeeìØ–Èëá<ëUþuõº YÛÛ•X7_nw;»æ¡=‰lùì’K®lùyìëÝÖƒŒO0úåÏùyÕNRsJ°bƒgƒf4 p)oˆÒ4æMxŽi‡pç“oðÆ ÷qjo¼ð5‰…ÍnÉà·¿%­^÷ £EtCÊv-#1¿byq*+×À¯KG|+ ýZów2eìë,,ëÀЗÞàå¡­È›÷ï,HÇr%Û½^˜¹«¡9Àk‡K/r!QÆÎI|[dCŸF®¸é,ùgÄÚ¢“Œûy¯;›_<ýh&ì¤]l&©Wù›Ük? Xt€Øõ'qŠˆ"ØÑÀ¡A'BÌØ›Ì!!Øc!sÍÏlµiϳßE¤‹ÔÇßšÄÈI¹pÙå`¸>ìm&4œË‚åqüôÁB¦N¾átìuwu ÁÍ ÅòË`þè^¢KI#+yû¥·ÛÈþú9ZÍ´p…CI¹d^0oxx¸ÒÈÁLJ8yU§»o){²O±=¯L#¶"""ÿ`kôç¯ßßUt0a'í—erøO˜šxÍCmQr,q' ÆÀµ!ëlÛKÒý!„:”¹/SíÛ¨ï|º!̸‡Dàc^\nùŘ;!у ‰Œµ4—ûâXöëÏÌ<ŽíG_çí{ƒ)HIäxñ^>5˜ÏNm-¥¸´ kV1Ö@ÀìLý&5ÏÌ¿5ÜÈnPÊ+öSÐ,„ŒÕkɮ۟6Þf83ø\ʱÄÔÖìMëé‚mñïó4¯`%+öÇKoûëèF3+e€Éd\¤NVJÌî¼Ó?ˆ6&?¾ïj¢ÿ‰lÓy.""ò`²±ÁËîü¤àê`ƒËŸj®q¨-$)6Žl X;á^b~·,ŽØäû ½H`ªôÚå–Ÿ«øÀl>™UJŸ‘1Ô³ÃÆÿ°h‡u Õ”G»| ï Æ»ÌŠÉ­3O½>ˆ ßݹo`ãì‚Q ö8Wî$æ]‚)š¾Š¹®lZ›C½˜–T?ç1Ö2+˜Lœïa½Üv¯§£´´u9ÐÛß?S.û.p¥uêØ!úγgm_?‚‹3ôç½ÌÉ×­ˆˆÈ?“ŸÜÚ„‡.0ÿÐ3°!kºC»…éì¹ÊŸº¶sj “ˆËÁ¶éCLxç]Þ}·üß;/"ÈÈeCl…Øâ]¿e)Ø—w:•‘½gà²Ë/°“æbö­žÇÜç?/Öd̶˜ g¿\r÷r°Ä<<ï¶]ì÷-åçbÞªDŠ‚oáÑGûìd‚’tVÌÙ„kç^4÷4ÿ®þnÆ6æ®;Eäéì[ñÇ*¯_ËŸæmüÉ^?—˜ÅÂÍÇñ¹y8ÿº£1n¶—Ùîÿàå ®þ1[VÌŠ¤|}ÑØgšzÓÕ¯:·‡Öæ›êñhC/<ÓÒ™—«Z‘+G3ޱÕÉ›Þ6åvyùMaVKËögc[§&J™³l+ì/¢ô*nÝ`bl•Ò¬#£Ôo7ããeâ™--êûóH}OZ{ØáTVÂþ£Y|·3•/ÓŠ(R󋈈üó˜ìèRÏ™„ýY¤3¾e²wãŽZ%Ì9P@ÁÕÎ< µ µ""""7|–VˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆÈgX­VkUÞG«V­Ôr""""rÝÐH­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆÈ?•Í_ºukË_Ƈ»ÊÊö‰á½÷PÇöÊ‹(Jü”‘c“ øø€÷bü/¹SU]ÿ†Pz˜Ÿ÷iÜÿñ[ô®a®By¬á>ÞÞÊãSÇÓÖ寨ukA*ëæÌ`þú½¤¦%·ÄWo|ëµ Çíýi_×å/¾r»qÛVDDD¡öJÉÉí,I(;ûBÆjÖeÄP§¶zF.«8u>oŽÂ¶üʯ–›™ÂžÌö¬›Ë¼;^æ…;àd¨½DDDþÎþÂA,+'·/¡r¦…tV­Ï TýrÍ'Ÿ@jÖ¬IÍ@œn„I)–£,ûdê™@këß’1ƒ¸ûÎþD‡×¨8°KØ7ã~L.VÛŠˆˆüÍýuC¢Ö“Ä/I ìœ—ÓVmàè­þøšÕ9׎#MG¾ÃĨÆÖÜݬØSqôÔ¼WßDýé¥è;çEŸ–ˆ…£¬Y•ÊÀ  lÕ¶""" µW=”dÇŸzt'lfð]¢RW°áh?ú×:?Õ–]Ï_Îbõöý·õ#´ÅÍÄ´.»è6ªºþïTž§êÍ‹¯´ ~Út~ÝœFm5ü›tfàƒwÒÊÇŽ³ßl[ÈIX̳W°=1‰´\{jÔ ¦Që^ÜÙ·95ì °d0ç‰G˜–ØDðôäçhéÖÜõLxèm¶Y×.L˜4’{(IšÆè§æp pí<žI£B±¿òV¦øÈfæÎ˜ÏºÝû9xä6žþGtgà › ©VÑÆÖ,bŸ}˜‰û›æ<÷ÅX"lÿÈþ[)Έcæ7sXµ5‘L[š´éËÀö©¼ûÂ2à‘ŸñzÏò÷”åq`ÍÏü0g»SŽ’[bÆÑÇ æ]¹-¦aÞ¶\lÖ@Yþ NUüßð ÄÛ®òR[ü:ßEŸ=s9TlàìfÂZ•>:¯ÿ»2þÝn$Oû˜⊠ÊfÃî|À™›^þ”ÑNÔ¬~y(ïï°¾ øà=bürÏo[Ç*ôMUê,""¢P{Í#-Ùñg§ÔêDGÛÍ|—¸HaùÆLúôõ¡ò¯õ¢ƒsxí¹iì,¬x¡ •K§°sƒs¥ÀòÇ׿¤¼L·„ƒ§STI6©[fóöØ“<ÿá(  Œ“&ñô›±?›Œ9š´£IÛX»}oŽëƒ¿muš6÷†”L(=H|F1-ƒí(9²“KÅÛr÷±ï¤…š&r“wq ;¶©S…@ %©ó˜ðÔTvUúöÝr"•Kþ˸µ[õÎSt¾’Ê®hÿÁrt)ï>ù › N¿1…m ?fçfï ZȾïžã™™©¿ oY‡Ù¹äKvÆíãéþEËjl&'/\ À ÖŸóÞ—9ôéÒŽð:n؆k8÷<~n¾Â>:÷m'XýŸY_Ô¦nT$ »W’KñëS)nŒ@áÖï¯èÄZhícsúæÖYDDä毙ágÍ&~Iå¿þkÓ!¯ðNV,>´|Ç,•³N: 'ž ¨nM{0hÈÝônæ57ïüò«ºþåX28XR—ýr÷íQÌYÉœ§°ÖüLÿ¸"x8G0àÉ ¼õÚ³ iïU²w~ÉÇKŽbÁ–Z‘)¿þ»÷eSF9É œ8³Átv¤EŽO+É¢mSêœÉ²O¾¬M&üoÄÈÿîå ù›˜2};yÖ«³ÿXO÷ß)ÖÀ¿ëPƾò<ôÁœ™yÞ:Ç©ÍåÖÎþµð®ß™ÈŠjžØ²™#;W|x Þ§}.ši«Ð7¸Î"""ÿ0ÉH­5;ž%»+~ û¶'ÒÛŒÙhF8 XΖã=èQ1ŠXrx‹’*Þ4„ ÏõÁ×èÙ¿á³=¿ŸRPÕõ/¯·ŒŸÀà {ÀJ”ïQ†}¸‹2,d¦fciíJQ¯¬Ë0Ótè(noíŽÕv$%þ–äXI\°†#Ýn¡VÖ4´]Ʀ8¼-…Â.Þ^^mÝm(9Y¡„LJÂmILª¸ªvkº]ù×Ì–ãY¸§<Ñ ‡1nT4^& M=J÷<ÊW)P°}Š"hlÿ¿ï¿9k+ó6•¯xÏ<|3>f 4÷£˜°òÔïë—ŸGãÆ4.µÃ¿ç´ñÄDx'»-–\¬äË£Œj˜/œjiõÈ<î5‰ÏÙENÅËe¹i$nN#qó æ÷ .oc̘»ˆð4“_…>ò=gsµo}™—4ÆÍ P€ws–-?éqÄŸ¸Ú5¬Û¾­â¤&íÚÖºèÞªôM`Uê¬yè""¢P{M#-ÙñK9ik¶mIM›òàÙ®_ý$»å7w÷Æ„•‚”dT¼;¤Oj®µÙ›¶}3yO|¥Ϊºþp¡¹ßéägàT«6nìâ$PVR†•Ž%¤<ÒYØñéc<4¥"€Z-äŸN\éñ.¼_çz´© ›¡8y'Gò½HH.¼‰ê^“Øïwpt÷ANåÙ³ãHE¬lÞ”êU-%Gvsät kÓÓcòæZô|þ"r-`8ž3õî?¥o#¥bT´NT ¼O×Õp&ôæ–¸®Œ%·òçÍ#ÏGCY™I»Y5 IIûصaÓïÖ»ÃÞ—¶÷½B›'HÞ¾™­;÷°woñ 霞urjçL^{ǃÆw¥°*}T9蛚rW¿FÀ‘zQÍq^¾‚<²fw=½¬ìÞp¸¢³ÚÑÎ×ö*ôM ™U:®ô&"" µ×0Óf³c鮳_—^·ÓÊ«Qšyvµý˶q¢[W¼Lefœ Õ=*ݪ< Ø0ÎÏÚŽÁtiîÌÊ•y”$¬&!Ñ–½%åe·iïwÉ +W"""ÿ\×øF1+Ù;cוÜÕbÝËÒí'±bàT;”ïO˜·úÌ9X޳~ÞŽsn’©êúWçÚÀ«¾OEc'!)ûìôk Yɻٵk»Óȯµõ¤±3@Û~]GàÙ¨nŽ>4ñHå·E‡Ê÷(¨-U¹G À®FÊ6€Ô5[ÎÞxWvŒe¯ åž{îá¾Ñ“ØUxuZÀλÁÙí-]IÊé»úËN²yÎ:ΙQˉø¸ò@‹#íF>Æ^mõw!7!ñ²ÀÆÑ–“G8r$• ³æ±ûœ;Þ¬…ì;ZÑ †;>.öUî£Ks$8*'€ü-ü·µ®IAü¦o>A)àImû«Óæ-éTû+¾IÒfðòk§èת:9Ûð˦¢óÚËl{zl²€-3¾g~V}ì®gÖw)W´=ûÀ®DÕ\Äì#ÀÑù¼4rínŠ ®·e9‡Ùµz)ÛŽV„ÈfÝhìfªz].ÖÖïL„Ó*Vçç‘°³ü5ÏÖ¨mwµúÆÀå*×YDDD¡öªdÚg§¸6§càù‰Ê> Í\³ü”í‰eGv':º×¦ÏÈ[XýÜlRìíóùzûé„`Ë9AÕ¶Šë_XëÞŠ‡Œä‰O6‘_°ƒßßÁ•WðŽâ‘amq?N g‚ÛÖ…-‰/ø^Û0S3´66sŽU|^ƒÈ¦Õ«>uÀìÃÍ£°ú™ïØgŒÕßññêJËÝobôC‘gžõú¿I¾ôÖ—eã~! ÈÝñ+_ï8þ¡  ÒÊ&<£ 1O&Á»æ2eWEÿûÔÄ6ã%@av!¸ð¾ÛÕ%æÉ{I~qÛò€¼ý¬™¿Ÿ5ç®Wã&F kW~3VUûèrœêÓ¥™#«×œÞ7Zu¨ÝÕ웫]g‘¿©k8ýÀJÎΥ쪘 àܬu.°šc]:6u,ÿ¿e7±;s°bàØpã_{ˆè/ìÃÅ—Žƒyöñ›¨v~ĬâúWçú Fô¼÷ÜÝD…RÃÙÌ8{Ñú¶Ñ¼ùÖHÚy™×ôÕBZáúÇj ¨ïQ¾ÜÁ¯1>§_wmLóZd¥}ÝÛyù½Ç‰i߈:^Ž€ƒgºç÷GÒÊýjv¿SÈ`&ŒB—¦uð°“K-B£GðÆØnxŸ—ëºñÄsƒhS§|î­“OCÚ|ž_º‹úÕ:¶hÛr/ú¤Zû1î³;¸3aA¾x:–¿ÑÖÕÿ-é3|Ÿÿg4íÏ´{Uû販–ú]"p<F[Ò1Àþ*÷ÍÕ®³ˆˆÈß“aµZ«4NG«V­ÔrrÅ wþ›a/®$hôø¼ÜÖ ,ŠˆˆÈÕd£&«¡ìD,/ŽœÈîRÀ3Š'_Nëê6”JdÞ×k)ÿ;nþ4«ã¨@+""" µr}2y´äÎ~¼<÷0œXÆÛÖáè^²“Ùœ¾MÌ·÷Ct÷Õ!'"""WŸ¦ÈÕS–Gòš_˜=;åda¶.^ø4¥ó-·Ó½™ö¦…Z‘ó™Ô""""¢P+""""ò»¦wídee©ÅEDDDäŠxxx\Ÿ¡¶*¹Rš~ """" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ×-ëÉe<CLL 11wóöÖ‚3ËJ’¾dø™e#øê@Éå ÌßÀ‹11ÄÄ<ÏÚS:Ô&"""¢P{Í‘¼óåѵŒœ¤]S_VMéa~z4†˜˜ù4±Hí!"""74›k¶%Ë1ÖN›Ì¢”]h¹aƒgó 팣qùâŽîH&׈§QDê¶ÃU¯S$Ï}õe˜°µ× 6…Ú+Q–KҖħ]|G§nÜ×7ÇKäAÚYìIÝBjagáù–NXó“‰ýúK~^¿‡Ã'­¸Õ ¦Eïû¸÷æú¸˜®¬|°R”¾†o?ŸÁÊ]©äØzQ·ÙÍÜó`šº›/¼ý‡ÇÑèÛgù6 ›Åcïæð_òr£Í¿k“H§K— edïø…/¦ÍcCÒ ŠÌ.ÔjÔ‘ÛîDT #†Î/¹F®ÝôÛº xñq:{]x±]èݼ<º5î—MBŽ4óƒ‚$ve–`Í;ÈŽ#àZ?ÏJ{cÉXÀ;oþ@Ü¡\Ü‚âgæXâ2¦¼:•]—(>?^Á {œ(âèöY¼?e+§¬—xOÖr¦ü°"š¸äg°kÁ¿yvâFr*¿'“ßû™„œüò‘êâÌ÷$/ÜÁáBC}±¦'°tò³<ûÍ>Š®°ü²+yïÉ÷™»ýŽ ZV³ˆ¤µßðòÓSØ•o½ðöÍ´¼ûnZºØrÛHn>höre[ŽÅòÁ«ÓY•tŠê# ¯cCzü¯L|éS6åZuv‰ˆˆÈß0ÔæêmþÚtö>?ÐN{ AW2ï3 ¾ª h IDATBp'ƒøä< Ó¶‘j5¨ÓÌ»3ëX)ÌÌÄ©A#Zx•¿õ ^CK; 7™ƒ¹–K”_ƒ[^ÿœ‰|ÈħZbìÛMfé¥êäJ§g?æ£wÿÍ'oÜF-àÔšYl̪<Ñ¢ˆZw<χS¦òtsG vÿÄ/‡×›ûÑ{Œÿ.½Ð  }þ âó¬WP~1Ëf²©<º=Í‹OŒd̸—x Ø€ã¿1ckî…·Y:‘­vp¢v‹ö„{;h_zÙ²‹S7²§ðêÌ}£Ÿ`Ü›ïðlßVD4´!3»Tg—ˆˆˆ\36×zƒfÏ6 õIŒqo³ôhUmE®F€y û¶$=`§¨EX€»Î¬aàÜô>žðØÌÊÕ±|<~2Iû÷‘^\x/9†èXŸðÚ€CÍÚ¸³#–Ê.õ&§pº4v+O@ÚûÌäÇŒtö-á&ÏŠulø½O8µœÊãá})œ#¢iäZ¾ïÎ ;Ó¢Úbg§x¬”ðË–Šj»ÒÈZ<‹+WÊBZb&ÅÁÚ>pÙÌYLúeʦGSêš7°çØB^¾—Úá´hÙ–[‡EÑÈÓFg—ˆˆˆü}Cmy°mͰ×^$hùIuï@‡ªÍ¾4œ÷ƒm{7±ùx:8·'Ô˦R¨µR°û žx~>Gp£^ë6´¿¥);¾ŸEÂåžöe˜Î_WZ/ã?•Î8˜.ÿîÓ›ü}ˆ¾xùe–òÑ`Ÿ>cx0Ü¥ÒöÞµ°%á²Û¿0ëeËvð â…k³bñRV®cWÊ6–¥lcÙÏ ‰y}‚t·™ˆˆˆ\Ù#½ÌîMéÑ¿c•my÷$¤a5Èø_÷X0j7Ã×¾r9Ť¬ZÃÀ玗˜ðäPnoáD^ÉŸ´3ù[‰Ý™ƒ+W±*0ü­awÑk z8y[—²3× XÉKŒeãIÀÖŸÕm® |¼ƒËçräå¹Ò,‚ˆˆ0ê:’›“K‰ù nÖ²b½à(´Ýeʶrdù|2})iƒxñ£éLŸ8Ž˜ºX’Y»õ8š€ """×Ê ú±µÂ0/ÞN¶|šâldVŽÌ8VsN’ñã«<¿Û›¼ÄÒ+B\YÙÕ®O.Ë_Åž@Oò&¨vÓí´ð0 óÂïp ½>µ×òcÊ2^D£:&Rv ðí}'a®¿\ùv8F÷!dÎbß`Ü©6Ô±¦°uc¹¶MñŸ¶\t®…a‡³@›gÍ`ù=wÑɵò ¶Ô¾LÙõ\sÙ¶v%¹k·¿4”š¦ì;`œ©T ³Î/¹FnÐ?¾`àÐ _©×ÈÛs²ºŸÑ nQ{ëqR2¬4yà nó8̺­Ç°\Í긷ãŽîu)Ë8L®cM÷yœ×‡Eàr©aRûºÜ9á-†wk„¯)]»RÁ'”è¡oðÚ `®°|³OOƾ1‚®!îÛ¸œ•›àÞ‹QoDø¤m[Ïú-IÖhD·¡/24ÜYô‘k—­Vk•ž½G«V­ÔrTzެgoÞüè~êÙÝX勈ˆˆü]˜Ô""""¢P+""""òÓô¹ái¤VDDDDjEDDDDjEDDDDjEDDDD¡VDDDDäwMÿLn\\œZ\DDDD®Ø•>uËæz¬”ˆˆˆˆHUhúˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆÈj‹94ç-^š¸šãuŒÈÿt6%MexL 1}Êž¢ë¯~E‰ŸòÐàרRp}Ô§ìÄž8†™i¥^Á’C‚I¼0ú~ÆÄpÇà¡<öêT–'çaý“êTš:ƒÑ11Œ[û§mCDD¡öŸÂrœÕ'0iýIÊÔrãDZ-_Ã1€“q,K¾Æ©Ö’Îì ä‰ùG±üMÚóàìñ¼0y;n7=À3^ã¥1wѼlŽ{‡ßŽü9{iri@—>ýèàg‡¡ƒZDä²lÔ"·L{ˆkOàÖ~M·CÜòd†„„`¯–ùcŠ’˜77™1ï1&¦¶4 qXJÇ<Ë쥩D ¨xý*†Z÷pn®ö¹áCma"Óß_„_ÿ–œ\¹’]éŸÖkGÿ>Á¤/šÃÊ=G)pð£U¿tqÅrx>}_D—ÎŽl_½¤ãV<‰îׯžå»iÉÙËŠ¹‹Ù”t”Sæjø…´§WÏ–ø9ÛûÀÈùíWv:u$"k«¿~Àø=yúÞ Nm_ÌÜØmÈ*ÂìR‹&7ÝBï–5±Ó±$×K;¸Œµ'\‰¼9ŠÌfuÜ2’‡„R)Õ–d¬fÚÇ_³l÷ ìZsË€ú¬x5½&¾F”»5?‰E_LföºD2 ñoÞÁßI /ÈßÄøaÓhð¯[É›;“å;Ò(©Þ”>ÃÇ0 I³÷iÀ”‘ Øð _¾Ø§ UÔjáÄÆi¼üýoì8bÅ»aGî~üí1°Rxè7¾˜ô#«Sd8P#´ ƒFÝC‡š¶@1i+¦óéwËØu´³{íïÅÃ7à`péúc¥ y1ÿýl&k÷façN÷[C.þmŒµ„ÂRÀ8g€}]ú=6ŽHûê˜O¯zÙvûšÆOßÎñ¯þË{¸+o_Ú?Ægc[ãj³êhžÞØ™÷^­Ï—#>Å÷•x0ØŽÒc›øáÓi,Þ~˜Sv>„u¿—Záes¹ýùg0¿ôÒK/Uå ‡ÆÏÏïO¨Š…ì=ëØ’S‡Ö-êàTvœí«Ö³ã°½ûÓ­™©«—»6›ˆ¾ÜÖ#’êG׳|{¡-êá”·—õk7ŸbK“®½ˆnîGé¾å,^›CÈ<ÊRXøé—¬7šÐ½O:4tãøÆ,Nt&,ÌDzãl_³‰ýIiØ’6ÍÃhݻݛÉë4šõªéè ¦Nß„}«^ônEýaÖü¶5'ÐY39予´$ÍüŒy͸¨ç¸—_—l§¬yZVë©-|üä[¬÷îˈ‘éà“ÆÏŸþLr‘­úEh“μ—ŸæëÜÖÜ3ìnªGÉæï˜òk>͢énMgÅì_Ù°3—àÛ†ñð€NxœË·ó³ïMÇí°[ÿ9·ý‡Oªƒqþ—ç–㛘¿h köº}ÿpwk€eë|õsõº¶Áה̷ãÞ`…gozx0ýÚP¼yßm­E·¨Ì)?òÂøE8÷xˆ¡w÷$Üq/?µÚv¥±ó‘KÖß={o=ù ñ5{1tÄ@:ùg±xòL’ŠÝhÚ³;¡®çœËfgœ2–3Þ–ïÎÆb》»®ö¶8U÷¡¦{Åô€Ò´Ë·Ûϋٿk£îôéÜšæµö1oA!=Úãkg@ñAæ|þ y]‡Óð«ælµs/"øï“ã‰uëŰ‘÷Ð#´ŒßLcS{:å2ÿRÛµÑäùg¸¾/ã­&ü»ô¤e 3®´ XJRA4}Úáj@µ6AÄ~œ< T¬ØQ¿o C1¨KmoÈøÏ|Ö$wÃ×v [rýé~w"ÜM€?5²8øßõl;I”PZ‚¹ÙEÕ(oK1†aÂd@É©#d5hß"ŒznøyáZ3“£­\/™ö±ëOâE°£CƒN„˜7°!6™BB°ÇJö–Y¬.nÍãÞNKWBs|;ÿ÷CyÅòË`þè^¢š[›»`ЀºOXHõ)s¶åÙÒÿ®CøWTO"<Í@=<,bÉ‚Lò,`ŸuãFmn¹¹#áÕMP߀=˜]M—© wìÿ™­6íyöñ»ˆt1€úø[“9)÷Â5\ö6ÎeÁò8~ú`!Ó'ßp:öºƒ»º…àf¾Âv+-Æõcï,ŸÆ`ÍŠ¦¡e2ËöÙ̉’ÔU¬ËªCïv>Øq¦¥NÅÏbY^ŒŽ¡­»ðHv:Ÿ¥¤‘•¼ýÒÛm¤‰'"¢Pû×3;Qýô(6¶689y`_ñ{Ò0Ûb2ŠÏ®oò&ÄßéÌM†Kê{XØœv’lûc”T ¡ŽËÙjçŒÍfŸ,7Àìˆ_ ûEÅηžÓøù½÷ÙÜ8”Á  Å[¡V®—L›KÜIG£‚qpmHÇúÛ6Ä’t¡%dîI§Ì·AΧÏ[¼›ÔÇyF:PF^J"Ç‹÷òɨÁ|vzk)Å¥eX³Š±fWê7<ûµ»akÍENƒ¼ ¯2âÍ-äØ7dèû¯p€ÙŸAÎgÎW“GÍkYYx ‹ÒtîçNjâF–®ÚÏÞ=;زá¥>mp¨×ƒÎ>¯ðñðáüÖ¶ -""iÕªþÎ&²¶^ªþydîËÄTû6êŸÙ3î!ø˜W\â³ÈèÁ„DÆZšËá]q,ûõgæNÇö£¯óö½Á\Q»9S¿IÍ3óo ÷0¢”òÅŠý4 !cõZ²ëö§·ÎÜßWʱÄÔÖìMëÙ>óïó4¯`%+öÇKo{Ýh&" µ×§K|<¿*ÿÙjµ^t}+e§˜cØà`{ñò Ç zx‚fûv±;q?»›Î’¹µè8dѵ5"µB’bãȦ€µî%æwËâˆM¾ŸÐP«Åz³Êàô,k™“[gžz}Av¿_ËÆÙ£0l/y®Tæ6Šw&•Ÿe†-nÕÍp²b«•‹°Z)³‚ÉÆ„õÔN¾ÿósëѺM »ÜK‡ú“¿ôôk¾;™.[Ö²nÓ6ÖMÏ7“‚¸mü‹t¿dýí9´Ñ8ÿSÄd\ô“¥øÀl>™UJŸ‘1Ô³ÃÆÿ°h‡u Õ”G»| ï ÆûŠÚÍg»J[2ÜiÚ%˜¢é«8ëʦµ9Ô‹iIuóïë`-³‚ÉtÁÇÕ\¶¿tbˆÈ?ÄßkˆÑrŒ½…g?ìó±÷„ ÏZîT«YÛìdRN½¤8s?¥Õð«v%Ù¾ŒÜ}+Y´6×­ˆî7¡¡W 6m>B±Ž%ùË3m±q9Ø6}ˆ ï¼Ë»ï–ÿ{çÅA¹lˆM¢[¼‚k`¤mã@þép[ʱ„ý”Ÿ&œýpÉÝËÁW<<<ðððÀ­l³¾˜Å?1Õ°w§FÍšÔ¬Y“š5‘ë$³xq 6—¬¿ ÞõkP–²}gö¥Œì=Ûȸȓ¹Læbö­žÇÜç?/Öd̶˜ ã¶›GX4Áù[ˆ]˺Ütoîyγ žA502âI>SŽ…#‹_çñדësuûKDäFõ7»5¶³gQ£W;í³Øµtì›08ÈS[š¹|Á‚‹±íÚÏ’âæ¯#¯vO½l ä¿p ÃBÁñ£œ8å„SY›–¬'ËÔ‹Ö®”ÙMü1Í\0ëX’¿<ÓÆ²!×™6·v"$°Òó¬Õè6ƒ÷7Ä’T؈Ðýi9ím&~8‹a·†á|d%ßÌ;Fm À¾^/zø-á»w>ÇeH4–ƒ¬ùi*‹­èájâòWp&éôŽœ¬F-÷ ýmÏúO>`Æ·æ˜ÆŠ¯§èÑ œ±I¬†]~"+–mÄ!Ø‘¬ ùzfeŽûHH- EÙ~3Ÿ#¦éÕÄ“¢ƒëY•f¢fgw\.Y[¼Z÷%üëù÷{µxøÖªXÏ÷Ó±PóÂ’¾ÑÄDþ‡oŒ¥øÖ¾´kèƒ+¹¤í\ÊssÒƒ;°ýƒífx„]o}1‡&^Í8¯¥ª5ëO;Û×™ôáOp{sÔš=hÒ¾1sg¼ÎÓÇÇñÙSÍÊç÷žûáSãfþu‡Á¼¯^ç‡cf|›öãÙgâh@“!<Úç}>Ÿþ+ð$¨E/†¾Á’÷'óíO{hý¯‡yâÎOùbö¼ø•³«?}žà¡›}0ÛpéúWïÄã¯óßI?òÉË?aãNÏᣨöÙOÙŸêtzü]ÜæËŒEßòÑÌ\JÌÎxÕnDç1¯sK¿ò9²´Ý w¢ƒ1Þ½)®¸0\›3âõÿã«O¾åãç¿#ßÁ‡°›ç™[ë`k{™ýù‡0¬pzaqqq´jÕêºÛ‘’ÃóùÏÔãô}ü8¨cE.Æ’µ›{Í4Œl€»ÀJÞ–ýY5Æþû‚õÐe¹é»)‘kÁ^~z÷U&þ²…ƒÇ³ÉÜ·Œ©Ÿ¯Ã¶ej+ЊˆÈ J_N‰üÓNzß^<õx“¦½Ï_åc8× AÇGxáîúúSº""rÃúÛL?‘.M?…Z…Z…ZQ¨Q¨Q¨ùŸè/ˆÜ ²²²Ô""R% µ"¢&‘…¦ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔþÕŠ2ûÍ—xéß‹H->gYÑ^¾ž0ž¯ ÿ¢Êå³súg,ϴ舑ƒ%‡„“xaôý Œ‰áŽÁCyìÕ©,OÎÃz£íË©µ~]Ú׉¢G˜‰ô¬S¤žð¡SÏ<Í:pä:V”ļ¹ÉÔˆy†11 i@ã–Ñ ~êYú¸Æ3{i*%j%ù›±¹Þ2¶G³Þ´*ü’%ów:(· Äîâ#›X0w9ñ)9”`‡{`Ñý»ÑÔà ™þþ"üú·ääÊ•ìJ/Ƶ^;ú÷ &}ÑVî9Jƒ­ú  {ˆ+&ÀZ˜ÎÆóX½;•“ÅŽx×oA×ÞQ4¬f“•¬„ƒxõˆ!të’ Úà¦G®cÖ K㜉öué÷Ø8"í«c¦ˆ„OGñâL|µ+^&€v|8’ ƒ™8¾#E«¦óéwËØu´³{íïÅÃ]l˜÷ø¾M¦ŒdÀ†gøòÅ8æ'±è‹ÉÌ^—Hf¡3þÍ»3øá;iáeù›?lÁ£ºstæLÖ%àÖŸG†5cÿ—Ÿ0sc §œ‚é9â)îkåÉå®KOlá§O§³xû!²m¼¨×êz ;ÁÎ`¥ðÐo|1éGV%§Èp Fhº‡5m+É‹ùïg3Y»7 ;ÿpºßB™Ž‘žù¥—^z©*o8|ø0~~~W¿&–lÖm£ ¤+½šl_¼’£µ"õ²Ã°œ ~ÍhÜž°j™,ýââ]ÛЫwWÚ5ñ¡4q9±û«^;Ëq¶¯ZÏŽÃDôîO·fn¤®^BìÚDl"úr[Hª]Ïòíe„¶¨‡‹õ8ë§}Æ’üPºõíIÇðZ”îå׸B‚›ãf¶Å£ncBü©×$„ÚÕ0:päz>«qÊXÎüysX¾;‹.î¸ÚÛâT݇šîvØàêr˜Å³·ãÝ™ºŽìæÛÏ—á|ÇCt5Íã…ñ‹pîñCïîI¸ã^~þj)´¿˜Û;b·þ7rnûŸC^¹Î5Ì@}ÝŽ°{ì<–§uåÎ6øw¿¢záiêáydKd’g±P¸æg¶Ú´çÙÇï"ÒÅêãoMbä¤\7"" µ:÷¡éÎoùees†w¬´È®ÍÚ9“™º‡-;ÒHM9À¾„ ,ÕU©r¢º»FEH¶ùöî;:вaãðov³é„’ÐKh¡cBŒ ¨ˆtDÅ÷v°—ÏJQP”ªR¤÷^©Bè$„–¾Éî~Ð[ˆ ¾÷uNÎÑLvæi³sÏ3‹îî~¸œ džقɰr¦p:?…_?ÆÌsáÙQ@¾Í#£ÎÄY‘;‹Ù— Í¡B³GpdppÛZÿö 3F¿Â¦#Ãy¯k®®eˆ­éÆ[‹¶pªqMöÌKÄ^õ)ªx¸FÜM\‰Á|Ñ·/óë×£vZÄÄÄæaæÒ§Ãd%'‘nÝÉ—ýaäEûµÀŽã„GiÀìEH ëù}ÒâlÁ38sû¤Å³QÔÛM 8¹ÿ Öb1Tð»0ëM¸e>;äCÉRÄÝëKJÒz.ßÍÎ[H\·‚õ|Žî:Š©dG¢Îm3¾jP¼TcFDD¡ö/šlò(G‹ÖQ|6íWÖTˆ½pÍÙÇ‚q?°&'˜ ËQ£UÃf1.±È5^õ·»Ã#šN=›ìtéß›]Ý4BäŽcÝ÷3_N+ íñD¸€áäEXµfdòŽãùá](ë|é>ääá‰QPè.x ¾, L8°áÀ‘¹•ï‡ cVFuëÕ¦zÓ®4ŠÍ…gþÔd2®,ÆÕ~'""wœÛø2ïÊ­i^òKf$pâììPÎÞŬ:ÅC}çþ– ˆ.‚›Õz“z¸ážu´w¼¼¼ðòòÂÑÌòÙË9«"wàNm¶²kÅLflɸâ´&`¶œ¿/ܵL,5œwðëä©lvªIË Ø8‘8•qÓ÷â[«5]ú½È»£>§G©½Ì›·ëeûGh8ž;ÙŸï…ŸŸ~~~xÛw0mÌ4þȺ•oÅuÂ7<Kúvœ¼0]œ—²‘}ùDZÈÜ<‘é‡jñüûƒÐõ^bkEà•›{öûÁB`TqìÉëØu¾\vNíØÈa½›LDäŽçt[—ÎìOͶw±á‹…¤aÂ0»xà”›Â¦;pu!cß:,=ŽÃ%•Gsð÷½±M8‡Ô¥N` 'ÎÄ­UM‚ì‡Ùºt.ˆ#Æ]ó7rîÔ!͈¯5Oß„µC;”/¤n]Èä§©ØínÂÏͨº•%®¦o,Ù‰w³G‰r;s®k±ïfÞ³H3õ Mòö¯ayª‰ 8_œ“a#óP2i'}ŽhÃÝ¡ øñýQxvkF¸m?+§|ËšûÆyÔ7L~wÇm^”ªs?ƒz¶!ĉ[j ·Štú#Ç1vè N9Y·ou¿›f J7žnû£Æ½ÍRü)[» ½‡×`ÁG£™0e;uÿÛ„g‡Zùú«É|ùæœBªÓºo|FNѸ¹Ã‡ã†®®]»–˜˜µœÈ¿‚Ã3^`ÀŒª ÿ¿Ç.»'VDDäÎá¤&ùßdÏJaû¶DfLÙOPë§)©@+"" µ"r§±¥-a䇳±GwæÉ{JözX‘Ûžn?‘;žþMHQ¨Q¨Q¨…Z…Z‘–ÞS+r‡°ÛíX­V¬V+6›M """…rwwÇÅÅE¡VDn/&“ WWW\]]Õ"""—'Õ""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P{u¶#3y6>žøøXpÜ^ô²×ñz|<ññ¯²*óö¨ƒýØ<^Œ'>>žNCVqÚñ¿5Øò÷§_|<ñ}Dz7_;ßí>^EDDjåj±œô„ì:ûÛ°5ãHµ™òt<ññ=‘”§nù'Ú[} ""rË9ý}™î«ÆŽfî¾®:Ïj8á_³3½ÛEâfÜ‚í¹×âåñã±cÂâr;dÚt6Ìßuáÿó·²p[&õêyahÊí6^EDDj¯ÁžÁžÄõlN½öŸ¸¹·à±v‘¸]oN<¹•cÆ2;aGs] ,×€öw¥e¤œ^Á›Ý?a‡©:/}û*Ñ™3yþ‰1ìw¯Gÿn>,˜´˜íG¡xµ6ô|ª5ýÌgŠyz+Ó¾üš™ É”¨Í½íCYúùϤ†tæ“ï'ÔÉFú†)|ýý\~?p«áJ@T=îíþ8­#=®PméX¸pªÌC-ÓùiÖa¶,ØFfݺxýPÑÛvwh%FMbÙ¶N[(Ý’G{ÜGU_3¶#EÔÑë0Sþ;€ ©§˜7èaüŽÁõ<./m¡u´¹¾¶´Oà§/¿cîÆTlÅ£iÝÆŸkÏMÛ8<ý9žüîÀK\ê½ÆèÕpÍÞË¢ï¿ã—5;8xÒwp$µïyŒ®-£ð4QtýýÌ@ámx•Ë©-Ó3v&ëö'ÏìIp¥Æt|¬ ±¥Ý0 [ŸçUÚû™aTŸ8èŠ>x³RÂ_4^‹*¿ˆˆÈ¿Ãßwû¥ ^–¸€«/v®ø0o>Ußë=Êæ&1nÐëŒ[±›^T(éÄÑ õÆÿ±ô˜íÚŸË^Íç_,帋îäqdÓ4>úæw2€u_{ ëT…Êþ™òùÏ\œÃm‡góþ;Y{ ﲕ¨jæXÒb¾ú-Ûr®ØŽ­_ÈÀ\±qMäoYÀ¶Ì³1ï:¶m?¾ŒŸûˆ›Òp+W›jAyìYõo¾ð Û²E×ÑäO‡¦Ž€… ŸàþÈ+§¯»Ž…µeÞ.~xuS’éLq¶3õ›»fǸ†DS¿vmj×®M­êeΟÜ8{8c²îcÒ+ÏñÅœ-Ì/AÅŠ!8mgáè—xé‡]ä]g_wžk‹c‹øxè8–ïɤXåZT/åġͿñù#Øá(|}y~W¶w¹àëêƒ[6^‹(¿ˆˆˆBíM0«Oßa‰ ¼2о5¨=eoྃ¬­S™{Žçíßæ­>å冻ékÓ¹ö£dÅi?|Ÿü)Ÿ?_ g×-€œíÓ˜™´eð»¯ñÂëï1ôþà‹>ë ÷èQÜËU¢N§¡|òî`Þ6€:Î@Æ^ög\#LÛŽ²ná^À \leŠ…Ö£n¿……dâàz¶]ÀáÅSÙ ~-^àõO0à•7èi@ú|&ýžQtmn”ªC¤€;%k7¤zÀå“õ7RÇkµ¥ƒÓ ?2+ (Þ–·¾ü„>ý‚—ã| оµºòì‹/òâ OÑ.4‡¿8úw)‡ý)L?xÝÅ Ï>dÈøìµø‡fMbs–ã:ÊUt^ó¬)ëÙ‘ÄñØSyå÷y©] 5Ê;qôTnáëÛX@ÉËÛ»¸×uôÁ­¯E•¿@߀""ò¯áôwoÐì_¾CŸÃxå=¹¹@ ß‚ð­Z“`gO¢|Í„'`r”µãêu‹¢zIW À5¨$¾¬#Í–ÝQ@zÒ^rïêõw5J6¨Oñ)S9€GÕÇè—À²‹øbÈhöìÞÅ!ë™0x­y/ÛÑu,ÜEl ‹ büùuÖq6/ØNfœ*rÛVm;À‰yoÑoÞ%[ 5é(ÖÈ¢êE_o¾:^s;ù¤mÝO>Ø –wð¢R\ <-&³ˆ¾M[ø1oÏ: ¦:¿Ü“Z>vRwí'ð¨ÑŒJgï×ð(GmŸyÌ;•LÒ±j¸U®¢Û0¿7Οp•¨Jó:v›Ãð¾sð,YÚuêÓ¡O,•ü­lø¶ˆõŸþ¹æO×¢Êï¤o@Q¨ýsÁ¶.}†½NÙ%'©Ôª¥\oôÎ>޳S±Ž‹R–arÂb:÷×Êl¦ ÓÓ†qÉ:í¶+?{Ùÿäü1†¯Î" o"êÖ£aûªlùiÛ¯ùŠ*GÖ.âÌ¢I|ÙçA¾¼h©u˶gEtÛ¶ÛÎTºDÛô¨îyÑ2.ÁXØ^D¯¯m¯»Ž…´¥ãlÇ\òk“©ˆLí {û†}™H.žÔðíK»`PpYì¾è¿ÏÝì¸Î>.² /«%ZóÚ§%Y:o!ËV­e[òF'odñ/sˆþE®ïÄŸÛYþÔx-ªüoÑ©¬žJ‘‡ì•^fߪÜ}_ã›´g²¸_™8§6­%%pd³í»éÛûIÞYRØí…¬3<3‘°„¤,8²Ù¹xÙùY/°’¼|%i@‰Þà­çzsmw² {çª-µ‹ÎDZëgüpÈÛÌÂí¹ø¹mg#ÏÜ·‘•åK…èÔ¨Q2n¹dœÎ ßÉ|ƒý8.9!àÏÔñ Î/‚Y¹”=9pd²}Q…5ÕÑ¥|:ì%; â‰þ˜ÏõMD8®@Öï Ͼ ÍAVÒ"ÖŸ,a”+æt]å*ª /UÀá%cørÜBRKwáõÏÆ1îóWˆ/c€m/«~ÏÀïº×wµö¾VܪñZTùÓÑ ""òoq‡^4ð¬Úž8ÿß™—ö3/=³•òGøcß)p«Eçʾ7‘Ö <«ÝK#¯M,917ŸØJiïSì;”uqÇÍÇ8ÉáÉCyõ@²’¶sèl@±Û¯–iײ( ’Þï £EÀ¹’å²íó~¼¶(ƒM “0=QÔ¶-”lÖ– ¿~ÃöEoóJf=J9’ù}ý2,Ué÷õ ™ž¾¸šÎx8œ&aÚ$–<úw…Zn¬Ž¦¢ÛÒ§fGb}¶±(íW^î·žÒ^'Ùw(»ŒÉ†‘_±.À ·¿ðÙûgk^ònz¶ïHÛ’«˜œ¼˜aOí¡R)ÉÛö‘„Üó Õ¼ È)ª\E·á¥'f<½2ظj«6²yaE‚LÇÙµÏxP¦l¥K±¾«µw‰+×Ä믯…—ß³¾EDä_âŽýÇ ÷*ôþ ê–Æ÷ôNþØo¥xÅ–ô<€&7w¨6<ªÓgØ3Ü]!׬TÙÊÒ¶k+‚.:kûÔÂÅ‘NòaUº¤cÀAVÿ~ŒK+àðêE¤”%Úïâæv¥L“xy²Ã(jÛg.%z»Í+ørlý–%¤áY½ ýß~ž¦×Yg³?µ;ÄæÇ×ÿÌ‚dëç97VÇk´¥g4½‡?K›*%pÏJå­ ­;5ÆÿšŸ°‘w~:8ƒ¤ kX³æÌÏò„Ãä9—áÁ·Þ¥o‹J„˜±m[ ”¨H³Þo3¬K$×{ç굡g>¼ùT[j„¤n\ÚÄ=ä¯D‹Þ¯Ó»ºNE­ïjí]dܪñZtùõJ/ù·0Ž»ºvíZbbbþ•aËLawJ&¸§L¸?òvŒ¤ÿËs9Yº_¼Óšâæß¶EãUDDäN§ÇŸ/b?¶ŒÏ^™B*þÔjßž˜€Ó$ü2—“8Q±Y Š™ÿÛW‘;fj/Q@zÂÏ|÷ã\ö'×aÁ«D9êµ}˜.-Ëáeú·n[4^EDDjEDDDDþQšË…Z…Z…ZQ¨¹Ãý­ï©]»v­Z\DDDD®Ûõ¾uËév,”ˆˆˆˆÈÐí""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ"""""wz¨ÍeÇØ7yã7.ûÊû_MbÙžLìê/‘›Ç®±ý‰†Iò/[fãØ¢7éß›‘Û²qÜâ-;²63êå/ø=ËAAÊ$žŠç•Eo'{Cºôæë]Ö[V–Úþu°_À 05µàj5çôïcx¾k<^[ÊIÇßßë¹ÛþÇâŸeæ¾ ¼Û%ž¿¤ÞÖ=ßÒ7>žøž#Ø‘wŽÚ¤ô|d‰9·Gy ïoÀvší³¿âµ§§s|<<Ò›ÿý–%{³ø«ºÿVé«•œ¤ïôáJNèÀ+ µB‰ætíÙ“ž={Ò³gwëÔŠ*–$ü0•§´wɖΊÏßâ«5'u g¹qšù¦0å륵]:·ðÓ¸ÍXêõࡊî·8Lï™ú{ëu ª‡É³MÛÞK£Pç[¼ëü²»xû¶CüüLgÎ:‚í¯Ø˜ã4›&Ï&­jÞþo=|þ †Ã00›L˜ Ãtñ×½•KVr àäZïý›Sí_Ýþ;+ûÂk£7á}Ww^|ko xˆšö¥|úÊûÌO³ýõcú×ȶ´ÈšÈ[ÿºP.r«9Ýv%r-FHX®çQŠR¹ìþt›Ró¨áã¦^¹Ñƒ–GU:÷ªÇª÷Æòýï1 ¨å…A>û§Í¢ìJôéZû–/GÆ&¦®p§ùР̾ÕéЭú?wñöÿê$å( Çj§La¾ÿLˆw ˆ È/Ÿ0ÿ rƒñ v»Pë–®:ŽwÃ.TÝôk—ì¥[… ¸hW¹Éó·=Ìœ±—âñ2 ¾ÊQ¹Z) ¼ÄÏ Sˆí~ö÷ј¾ÕcÅäLí–%øqê:NTŽÅ_7+ŠBí-Úq\pÂŒÅÉÀq:Qÿ·’Š}ûÑ8À|æûyßT>þÑFü ¬#‰qÍ%ìþFä®^Φ=Ç(ð)K½viéyÕƒ‹íôN–Θdž=GÈ4ûZ¡!mZ×!ÔÕ€Ü_Ÿ5m³g,asòiòqÆ·t šÝׂª~gš»àøæþº€ûOc ªH£¸P6MÙJÌÓ=ˆö4päbý왬ø#…“V7£jÓüžXÊû˜ /O™\–}ù ¿}Ìy¡kù‹Nä8Öâ[»ݪ>Å£§Ò¦òcDd,eÌ/‡(?Øâgö%GöæŽÍÏ«“8šëAXÍV<ÒëAj8VR—ŽcÄ‹Ùv$³oY>П^-Ãq½bGppjãL¶úÇÒãÜÑ0{CzŽ dðgôÙÌ>c)÷L²fLeÉ–Tò‹U¥mßtŠö={ É5m£¾È’íG±T¥mŸt®qfy¡eÍÞÀ>ßSù…ûIÿ5+ýŸæ‹'m¼ßs!¯½„ïÏ1!øæ :­{‘ï^¯[¡uw³w_œÊª'p«N«®~5Ğμû0b°ç:­ïϨW½ù¬ïeåy>ËñD¦ŒǼM8å@DL{zvoE¤‡q¶c‰ìߊ#S§²zo~ÕîãÉ>ÑìþîK¦®O&Ó=’Öýžç±ÿ3'1ûVåî{C(å€w«6d…9_È`û³ê¸µZÆÒˆŸY±v1{»U ÂE©6ÿð Æ~ñ=‹ÿ8ŽKx]ÚwŠbéG+hóù0b}ëhÿkôo•,¦ýwÀíï~Õ“Ç×åÍŸæ³%ÍA`ùÆ<Ô÷1š„¹`à ÷À|Æ|5™åIé䮯ؔ.ý¥Q¥Èñê¸Uý àÈ'·0.›Ót)ýÿ}…Z.ÅÎ÷Ï [¿Gy(ë+¾sù/#ÕÅ˰²ûÛ§xa}â»~g÷©Hg Žm`∱ÌÛtLçTkÕ•~bp*|»W+ž•â(õÕVkL›âf}ÊíŸo»9Øíö³?äeb󒕤yU¥nØuÎ#ØŽ±nf"Nµ:ÐóÉn4 JeÙÔ$_íöu>©çÖeKgÍø¯™w¬$±õ¢×£­ˆÌYÍ„oç“b-¢<¶÷íOó@3Aw?ÍË*ÐÊÅ)'€&½:‘>ƒÑ³“Høq<[}ZÓçž’gf R™ùÖËŒ=XŽŸ{›·_{œ™3yûµïIÊu`oºSãž¼òÖëôoæÆšQðkrþU6–þÕûñ¬qö@|µ}%•Ù£`iñ4Ã?ÌÃá{˜úÉ$»n;Á‚‘ p»çYÞ~û9îÝÅ´/¦°ÇZtYÏ|þ0ó¿˜@jD[i]Šó‘Î)”Ž|ÌÃaN„wûŒ^­…{ë³¥/åƒWF²Î5–¾¯¿É€v%Hù{¯VuS1šû‚^e~ðC¾‹Ÿq•òäî`ì ¡ü|ª ¿4œ·´%hÛh^>‡óW«­ùuìÊw{ƒ÷ß|ˆÛ'òZÿwÙVþqôÝ"2kÌ,®Ú–PâÚVÃÛäL©m©èq®#òØ¿x5'œð/MÕpÏ3Û·mªQ»YyìÛ“”}v¹5…e«Ú´1!Mý:²·òÍ á̱7¢÷oófï²f~Èû³a+j»×+†{iªûfíÎLÝ‚ š©½)û'òîàË'™‚‰ëÝš7Gþõ„Zðˆ¹—¦•Ïœ{7®Ì²o‘y•K޹V’˜F«Ç[QÃׄä~‚ý_¯acz-b½ol}ØÍÖ¼›û«ÇémBñ>±ž„u'ɵ;`çr¶TäÁM(ï„— ãé=|±øÜìÈ:V¦…Òæé–D{@(!©ÏaÝ¡8‚ /a6a``&L†¸\¶Ã‡´¢O‡ùD-Oˆ"̱‡'¾Ê¸ú¼¸ÉŒéìúÍçvÄËÊ“ø5 ODÑmðcÄ7Q”öNãA3Y’Úœ‹˜)×¥;­*ù`àÏ=•'°9óazµ«†¿m«ñã{©œ*€ë¾¶·EkNâ^#–H7×rM¨`^ǺE{é^¡.88•8Öº<ûôýÔñ2 bi¤oâ?¹®±R®táýk¸]ÚþלãÀz}Ÿ¢CMO ÊQf =ýGðëÆÓÔªãDXón<Ûšþf ÿ´¹,˜}”,¸œ¸öx-¼ü7ÞßžTïóo•ŸÁì%k™òñÆî!ÕiÜæjQoóu¶ÛeãÄq¢åm£Y¼3‡ZÑîä§,gõ‰RÜÓ N>ßR™›§±8«O>O}_çÉS‡™œÊ‰½› ßn¥kL™}3óëÖ4¬ }t{Š(ÔÞ°ÍéÚ¶ôùY[v[ÎbÑÔ•TìKàuÍH¹æuárœÙ³qõô›uøù>(åyáÀìI §ž,ïYà\œèMÙAâ–TR’÷±kûalÅ*œLIÇ^,–`· ]à[:Wã8à ÷h §óSøõ“aÌ<· Gù6ŽŒºÁòˆ\:¥D™ûzÑtþ›,~˜G¢½ÎÞBã +9‰tëN¾ìÿ#/{Ö;ŽV\ªßM\‰Á|Ñ·/óë×£vZÄÄÄæq•Ë’öLŽf;ãëQÈ%K³Qå/\–5,.8™.]åÑrW,Æõ•ÕQ0{U%è:²^QëËâ讣˜Jv$êül§ß 5(a^z3å—ÇÆÉý±‹¡‚ß…6r ‹&Ü2ŸGò¡Ø™6 t=ÛGg žÁAœ+†aqÁläÞÐÈÛ»ˆµ'ݨ‰€WyGl\·ˆ=W ¢k>GwÂÒ„²çëk!°J“öëlÿ"ú÷"Yë†ÒïD²\ÊÓû£ÁÜ`£vYó·y™ü*P3ØÁœ}'(hTš¸{}IIZÏÂå»Ù¹c ‰ëöQP¢>®×¯&Nüþô·Ù— Í¡B³GpdppÛZÿö 3F¿Â¦#Ãy¯k$971n ßj4+WÀ˜¥»É‰®Àá«8Uæ>êšáüäzÇ’Rte½.ôYXÛŒƒ‹&¾]\®qß· w?²füKè…Ú¿ÛŠ…ì’–ow°?ë.¯²ç9lVlßQf˜qvú)Ï00p`?wÁåÖçÈÙÇ‚q?°&'˜ ËQ£UÃf1.ñìr»ãÛ»°Üðˆ¦SÏf_Ò;fW·3¸üÙúÉÿ4Ã¥8¥|À-(¯‹v‡ÝÉ;Žç‡w¡¬ó¥cÏÉÓs5z|0𦉫X½a#«Ç ᇯÊÒqÈ›t.çvÅAÑ(jˆ\-ÆM-/ª¬F`¸àá|ûm¡ësáÀzãʃ¾É¸±À®§<† ¶‹/öÞÒ]=—=‹ÖrŠV½Õ•øK–­eÑÞÇ©XÑÀa»ò{êÌ iÿ"ú÷"îÕúóþçygjmXð.f†“g·zñ*ì09™pdneüaÌʈ n½ÚToÚ•FQ£²ðÜä鵯ëë´ºÅýmÝ÷3_N+ íñD¸€áäEXµføàÌÏû¯w¡¬‘ÁºE{ÈÅB@dqŒÔì˾ð={lûnÎ|MšnqûƒáâKñ  ‚‚‚*îÛ¹ÀfKfÝ® ¯”²ßÂúÃJFù“·y"ÓÕâù÷3 ë½ÄÖŠÀ+7÷ìw­­ñšŒÓ-îo“ÙÊ®3™±åÊ÷ÅšL€Ù‚Ù¸ÙqkàW­‘Ù‰,Z½ˆÕåhUÓÿ²ƒ·þe‹cÞÌÞó뱑6o8Ï›GF‰›í/;Y'òpðB‰ÉàŽxûa2crä‘eµcøøâo9AÂòM”‹ Ç8´ŽYë2À|Sëv-UŸhÏ1Ìž4Kó*øç'³vÖj²J¶¦z€äߨúÌ.8妰iãœC]ÈØ·ŽKãpIåÀÑ\ª—oH…¹?ñË´e´mT×›Y°ú4€sH]ê&°pâLÜZÕ$È~˜­Kç²8bÜë(aØÈI?ÂñLŠyZt¦-×Å%¢ w‡.àÇ÷GáÙ­á¶ý¬œò-ó¸ÛË ‹}7ó~˜Eš©mªø“· ËSMÅù^ù§-sÇ IDATEb  |ig–í:J~ŒÇ-•Qáe5µèýÄdØÈ<”LÚI‚ ]Ÿ…€ºí¨þý§|òa0½:ÔÀçø~›„ ›®ƒ[…vÄù¾Ê˜Æáòp#‚­;˜õõLN•ïNl¨å¢KË·2Ó.b]†õ:4¡Bé‹Ïrøp_µI|´n{r+Q±ö}ÔûŸ:>ªá‘¶Œf¦ƒQã¯hß«_þ6ÈfÍ—3©{ª¹¥²ôûoHòkÅ[•3 ×*ÏRýŠ÷ïøDßGËp¾út Ü_¿Ó˜06G»‡ )W¾ðí^‹íûÜ>g}EŠBí­aö(ŽŸS&[×í#®}YZÞWɳf2úS þá•iØ6†¼™'oòèN«]p1¹ãW‘eö!´bº·®ƒ¿™µ.eZÑ¡þfÍ›À&¼._—¶½¢H˜<“…K“©ø`EÚw¿ß~YÈ”o–à^²:M;6¡`â.\Ì8ѤÛãXfþÆ’ŸȰ»T¾1]ÚÔ=s¹©¨ò˜=)S¥ «ÿÀ¨ÓðßN‘º¹_®%œûÆyÔ7L~wÇm^”ªs?ƒz¶!ÄÉ€è^ |pc~þ˜×ÇÛ0{…Q£í@z¶,q•Y7J× 'sÖn2ì¥oý;. -+E‡*³UVfƤá¼þ #Ÿ.|}ÅšðìP+_5™/ßœ‚SHuZ÷íÏÈ)7²îV‘nC_Âcä8ÆÁ)§"ëöà­îwSâ/™Ëaׂudø7¡MùËÞ7`ø}O-܆­gÑž\*UŠáÉ·žà›ÏäãW&á].–NOÇc}?7‹ñ—´ÿÕÞ@îT¼%Ï<`0süp&3Rõ^^z©Ü ¨Ò§Û~Ĩqo³ÊÖnCïá5XðÑh&LÙAÝg ¯NÜÚþ6£É³à=k“æN೩ä›=(Y‰¸Ãiß(ổÝͶ›áKµf‘Û÷Q½UÕ«¾QÄðªI¿áÿaü—øâÕÉv-Aµ–Ïòb‡RX,EÔ÷ÙûÙ˜LÝržš‘;‚áp8nèZÑÚµk‰‰‰QËÝ$[Æ~’š(Y®$çžMËÙ9™ÏfzÐ¥kB-j#ùwpd¬ãýç¦Skè4-¦7·ßQßS'þ`ýN3åk•Ã× à +ñcžéàOº©i»ÿ…=˜Œ5ï0ð·º {-íÂr'Ð0ý»Y²tÒ÷ü¼j'i§³8y0‘9³¶a._•â ´òo:cöªF‡YÌ_‘¦'§ï´8“³“) åóé‰ìO?ÅÑ]‹ùvÔj,uQRöƒý8ëç¦zÇýkbrçw4Sûw³qjû"¦Ï]Ϯ㹮¾”¬Ö”{›W#@ ù·…£¬MŒºœ˜—ûí¡ ˜wŽŽ­ý‘¯ÆÎeãál â”kÜ™~6"ÔEýø¿ /é;ÞœÉsÿiˆŸB­(ÔŠˆˆˆˆü=tþ%"""" µ""""" µ""""" µ""""¢P+""""¢P+""""òÏrRˆÜìv;V««ÕŠÍ¦Î@DD çî‹‹B­ˆÜ^L&®®®¸ººª1DDD.?Nª DDDDD¡VDDDDD¡VDDDDD¡VDDDDjEDDDDjEDDDDjEDDDDjEDDDD¡VDDDDD¡VDDDDD¡VDDDDD¡VDDDDjEDDDDjEDDDDjEDDDDjEDDDD¡VDDDDD¡VDDDDD¡VDDDDD¡VDDDDþG9Ýnrd§°~áBÖlÝDZ;Î^A”®Þ˜Mªè älcÌs ëù$-JÜ^ÅÏOç#WqúËÃ: ¤GuO ;¹e®âÕ^c)?üÿx¤´åÎ(sö†ôAÈàÏèé¬>Q¨ý›m榚@‚=’úwµ§E1grÒ¶³zñdF±ñÄCÕñ¹U³¥³â«/Ù\ûIz×õ½%SÖ–Àz<Ü«2ùŽ‹kåàÒ‰ü–äAé@Z‘w¨Ía÷ÜŸIpÔ¤KŸv”ó<ÿ¢ÊS>ÄÄçcç°(¹íƒnãÖ´øzqìv½{“òiö8w…X4âDDDDþÕ¡6k/«¶åQêžX¢NÁùPk'+9‰tëN¾ìÿ#/‡Ö;ŽV.¥ˆ»×—”¤õ,\¾›;¶¸n%êàq7q%óE߾̯_Ú5jC˜‡‰¿±n.¾BRÀ±¤ƒÝCY¯s¿µÖödo³Qþç÷'ÃâŠÅ8³?žÜk±*ø]h —°hÂ-óÙy$‡“É…-Ïǵü­ªÇ ô‘ˆˆÜÞ¡ÖâN1¶²+5‡úþ—½öÊvŒÕß|Æ"ßÎ<×±ˆ™&›ÛÙ×áV–6ý½k$íæùãX0#˜ÆÝºÑ,ä²ÏÙÑtêÙŒàKZÅÀìêv&N¸Z OÕŽì]Ì™¸’ã!Íé[’ëš‹1 ØÏÝ1l˜q¾Æ¥É"Ë)rîÕúóþçygF˜aÁ»ØµÂ’ ³éÒqe2ÎŒ»ËÇ¡É;Žç‡w¡¬ó¥ïäá ™[?d³2"¨[¯6Õ›v¥QÔh†,<ûWžÕèñÁhš&®bõ†¬7„¾*KÇ!¯ÓªˆuWÙ'0™®ýÃRä~{ùþhÂqéyïU—;ni=®¿DDäêG°Û„áELYƒ= –±7ûÒ¨õPŽš«reHtØÈ·9ÎÏÚœPŸâW<[cÆ#¨–S{Iδ_¨ßÑÝ.ð!Ô§¨sŒ[TNùŸc¸øR<(ˆ   ‚Šûãv­¼d;HÂÞìódÚOn'á°‰ ²þ›ð Ç3c'ûó½ðóóÃÏÏoû¦™ÆYv27Odú¡Z<ÿþ`t½—ØZxåærfÔÛ8‘8•qÓ÷â[«5]ú½È»£>§G©½Ì›—ŒS¡ëv\q^î_¶8ÆáÍì=¿ÌFÚ¼á<;l.‡m…µŠßð,é[ØqòÂæ¥ld_~‘®E,7ßÂzÜ@‰ˆÈUÝ>àÞTiÛš-#¦3ö‹cÔoXð@7òídÍ¢uœlD|%/ Û¥Ë –o¢\l8Æ¡uÌZ—¦`À„“=• ÖpÂÔ†º¥½ÈOûƒÍÇLøE{b ÃFNúŽgzP,¤.uX8q&n­jd?ÌÖ¥sÙ@1îä™h9™8_þÈ¥xƒÚË8ÈŒKÏ\üƒ *UŸhÏ1Ìž4Kó*øç'³vÖj²J¶¦z€S‘Ûq.ªœ"J+>ÿ?Jõ¸Êî‡Y5aÛÜòr5¯Kf]"Úpwè~|žÝšnÛÏÊ)ß2Ïщ»½Ì8¹ûàœÄÒÅëqtãÄÖ9|?õ0v·]lOÉ¡¶}7ó~˜Eš©mªø“· ËSMÅùâYèºMWœèùDßGËp¾út Ü_¿Ó˜06G»‡)f>ZhmÝ*´#Î÷UÆ|0—‡lÝÁ¬¯grª|wbC-¸¶ÜËÑ[Uù³n›·˜ÜB¨T5çÓ)ìÚ–Àªµ‰ìNËÇ¿Z+êXŸ.zûA„¯/aŬì]·˜EË~g_V1ê6 çø®\¢êV¦x`iBŒClZµœ•kØ–œKPÝv´oP7³§œƒl^¹”µéáÄT+EÙÊep>˜ÈŠ¥KY½%…üІtèPÿÌ«¶ ÒÙ´* ÷èºD]õùZ9—Ä#6²’·ò{b"‰—ü$pпµJQ)ûÞõ,_²Œ5Ûb‰lƃcr¾úvì»Y›˜AdƒºxRª°rŠÜ$ÛñD~[êL—n%Y?a,?ý–È© ¦ôz¡1Åœ0¬½ý ˜?TÁe×B~™<…™Ë“È‹lÏÓO·#ÒÝ„%°<%s71{êÏÌ\¼‰4·²1 ¿±ðP9Ú´oNEÓ^–NŸÆ¯³æ³rGá­ûòä½åñ´øºî+·]‚©Y/ŒSkf0yâ4æ$¤S¢e_žy 2ÞöC,ýu^qm¨éf²øßž¤æ}q„ºR­~¶-s™6y*³Ö¦àÝ™O·¦”‹a)|¹sPe"nQ=DDäÏ1‡ãF>°víZbbbÔr"ÿ2Ö]_óäk©ôý*µÜÕ""rgÑtˆˆˆˆ(ÔŠˆˆˆˆüÓtûˆˆˆˆÜñ4S+"""" µ""""" µ""""" µ""""¢P+""""¢P+""""òÏrRˆÜìv;V««ÕŠÍfSƒˆˆH¡ÜÝÝqqqQ¨‘Û‹ÉdÂÕÕWWW5†ˆˆÈåÇI5ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆükC­íKF¼Ã—ó“ÉsÜìJXl`꧃yî‰Çx þíý_†ŽYÈ® ÛÿL§åïO¿øxâûŽeoþm\Ðìu¼O|ü«¬Ê<Ó9»§2¸÷CÄÇÇ3pÆa²¶ÎãññÄ?ó3‡lÚ!oo6Ž-|“Îñ˜œ’8ÈK]ÁwƒŸæñ‡â‰¸7ß›Lâ±| €”)ÏßùuUÇŠˆÈ¿)Ôæígá¼u,øjïþvংm~Êo ÿÏp~X²‰½G²pXÌä?@âÌ/xñ…oÙœéPÞÖrØ>i›ŽÛ°”iLƒp÷;ãRAÁA¦<O||F$åýÏöž#cßÛ ÑÐ<Ô‚#k##_þˆé›R±•§œ_ûÖüÈÐ7~bW®™ÐfPƒ­Œýþw2´kŠˆÈ¿&Ô^l6~óò[ÛQ}9†Íy@H žýì{&M˜À„/Ÿ£y pä7>›¼«úôöá^‹—ÇgüøW‰ñùdžÎLTz¨«zãV®7_ÏøwÚQ¬&»}Ù8²lË2<¨_-| ÈÞ6“•@Ùn|ðÑP†}ô†‡g1yk6†oMîmàIÖòY’¦ÙZùk9ý3›=lÊó­Káb\Ç!õØæìpþ´yªõK¸` Œáá^-Iù! {Æ2í‘øåîeÑ÷ßñËš<éÀ;8’Ú÷,˜´˜íG¡xµ6ô|ª5ýΤ<Ûñ~úò;ænLÅV<šÖmü)ú|ÀΩ-Ó3v&ëö'ÏìIp¥Æt|¬ ±¥Ý(Ø7ž§þÌQ¿»èÞ"—ù³×“\HÅ&ѯk#‚ ÀAÞ¡•L5‰eÛR8m  LtKíqU}Ï–íäVfŒËì„=Íu%°\Ú?Þ•–‘pzovÿ„¦ê¼4º;û^À„Ô3eÛøvWúÞû.ïÅüÆÓ¯,"#ì>ý =ÁæÂ×yµ¡RØßŸ¯§ÿ=¼óÙãD8C^Òž4S!ùäÃû u*¤­ÂŽ3õ¿çÊ}ŠyƒæàÀï\ÏGö­g—pd±á½Þ _›GðCóÑa8‘GÒ¨þ šsßCù¼O$™×5ÆðŸ~ü6j>.ý¾äÕ:®…Ž+Ú9ÿ ‹fíï¦4úöî;ºŠâaãøwïMï i$¡'ôJ( ‚‚ÒDD_;výÙlˆ @Šô*½:©@ žÜòþJ€D}>çxް{gggv÷>;;wq¬d§e&ÊׯM93` "ÄóIOÏÅF9"nk†×Š%Ì_GǾ•qÔ5WDD®‘¿ñéoÛ'¿Ã¯ –2­ŸM€wcnªè\d‰g£‡ýÎ;Œy¼%~–ÃÌ|ùY&.ÜEBA0µj…`OÚËÒI#1m?<<>¹‚É?îÇæâ€-+­³FóäëÓÙ[à†VNîÿ‰Ÿ¬!Íöç>cM^À;oÍ`ÃÑ ¼ªÖ¦f¨™”ØåL~ók¢sŠ”™½ž W’æì‹yß1‡÷'o#ÓäígÚ+c˜½5L×ò²—Ù“—RêMÀ2>xs*«fR®NcTt içoLxý36}œ¾‚É3¶“ç„Gv2Ñ >dÄ„Mœ¶ƒ-mï=û>swõzêåqpÝ4Þx~2ÑÙvÈeꋯ1uÍÒ=«Q³‚'b–ðÅë±2墑9³Mxˆv… éü0Þxé]Õ•”ùgÖ¿Ò¶Êò¡iß¾4õp¤fGéî ù×ø80ܨy[C\€¤õÛHµ–ãlÛ~ð¡i›Ê8”ùÛΤ÷~fïéllWr|œm£´lLLjfTr0Ðq ÓgÍàãû«†Õ¼v.Ü(T8µÄ¥bŽp|ÓR4X+""ÿÎP n‘iT¶Áb[NfáÔW_ÜJxL³çG~= xÞ‹ãßcÔ¨wÿj{|¤ù3Ù™Uô »*?ü„ñŸN`hxáßxµ}‰&òùèöøÖ¤¤]»Ëú;¹'NàV½6Mû¼É‡odô˜á4u2qä‚¶ÒmìLøàc&<×g gÿNXìœÞò=ó]ýɇ¼ûñD^jë]úM@ü&b ÿ¶ôü^~ëFt"²†'NÝ!OZ˜Èøw?ä“q=(d®Ã¦ô|’—Ïfs.ø¶ž×žy”á/¿ÎÀpRgæ¶ 2wÏfÑq |/Æ}0ŽÑï~ÌK7¹Cîf~ÝÊÍp¥b“–Ôõ- D n¦YUKÀ¬RÊ´^åúWÜVNTlE¸'€šÜD‡ëpœÞ°¹Õ¸HWàÈZvŸ²aMÛÍÆdÀ§)m*;]Á1–Gù»_áãÉ_ó|#×+8>δQâN Zåq)¦ í9øåí‘üš¦jÝèQÓµpKµ‚€Äí$äê‚+""׎Ãßµa·ÈA¼ùLGBËø<Òä⎟{Š\ëåjn!mÿr÷ÈvÔö,|ˆê^£-M¼³øT±)ž Å>á„û:€É_O3`%¨NnX=üpNÚlØ‹æ“2ÆÀ½^žñݪ5˘8jì')À~áô×TpÁ\‚*àÃFŽY °Ù 8¶û@@Ë6Ts3Oj·ÄcÙr2 c<ÛߨõÙg £Ù+ŸóTp=ª˜7“²±,Ä£Bš4mA÷!m¨íç@Áá³Ñ€[ëxn»ÒÍÜ<›YÉIÄÏÄ;:©p0wñh†.¾`ÜŽÄØ$޹œøÔkDy'ÿ’éÙÁä€)+æ iJ.Ó|…ëWúVJi+,Ãqv6ֺנ]¤+ëÖ`uÌiY×qðiÚ†ÊÎÎe=ÆëÓ³KÊ»éÁÒöùÂÈJîÉSn¾—þ¸Ïš¶‘oF½Íü8;æÊ]yaÄ]T<{^›\ñs¬¤çØÀ]o‘Q¨u?hÃÊ2™ö\ð¨C09zr+“ ˆ¨ìxî 7kûg¼ñÅNòC;ó@µ¢ã\EþÿÌlö GÂ.®a”V§²~ÆNΞ¯xæ•ùËjÍšsS·zìúa{/~ —a:.(ËŽýLÒ¹à¯M¦ ê`·\¸,60wâÕ+°rñRV­Û@tÜv–ÇmgùÏ é5v4=Mŵ҅²Y ÇZƒ» ç¡E+€s@0æÕg¶o/º+8šÎÖþJÙ±ÛJ.óJ×/¸`í³;f» n¥µUŸŠ¥×â8;wûGõvp[»†˜U;ÙeìdžQm*ã|%ǘ£;.¦+ØçªÎ%ìåùÍ;2Ÿw^ûŠ­™à×b/»Š.F‰û.""r-\¿a³'AÞàÑx0o>{eÀEÇêpœŸ'Î`ÇÉÂG«Ö“»øiÊ&#ݽ"•ªWÂÈÚ¶”ÝöÂлŒM'Ç0ª—»^9>Ÿ¸Õk9ßý:£Ÿ}˜žMÜȺ¢÷Ê:X#8¾v%sì`Ïdï²-dœ[Ç•†ÏOgÖ¬Ygþ›ÎˆHG’W|Å'S—’Xù>^?•©^¦W¬‡X·-õüàcö6–í>;9GV³:0B©èA@xáج,j6Œ$2²>U\sÉ8Aƒ åªãœÚ±ø<ÀžMô7/ðÈÃñÖŠ‹¦”ñË÷ŠÊ,ÃúgGw3â9–m{I;b8]ä& Ìm…ýLxvÀ·Úõ;Îܪ·£±;ämÁŒmyàÅ-•¯â»’}. ¦.>^8ÙéÙçúÀžÍ7oÚÀŽ/ñ¿ÿkQ lÙ¤åžÿ¾®¥‘kçúÔ:×dèçÓbrÄüg†nÌÜúh?Ö<÷ Ñç0rМ=\)ÈÌ)ü’u¤_ŸÚø{{Ð¥Â:fÅ-gÌã©]ÑD\ôa2€;zSßÓ€S×%Åãêíœ$yÖ›¼²'€¬Ø½…?vÃŽÍV–[ ïF=hãͲc¿ðÒÐMTö<Éá¤ìRßZ³D IDAT·íá™Áöu«ÈX·KkdJcÿa;àN•ªÞEãg°bì0b*û‘u8 Àû–ž4ñuµ]jþ2™½ËÆñrfs*ÚãØ¶é ŽõúQ ê×ëF[¿m,>ö#žÜM ÷ãì9| \soŸ?qÇdàqEe–¾¾“k-"Ü!9k;ïÄ÷’Že]Y[Ù¸;œfËœ™¬xàn©Õãúg®ÜÚÈU«’H|niCeç«9Æ®äø8s{Ú€6“Hn·ܱ“¹ó'–¥.?õÇg<¿ùìÚ.ÔzhO4õÄÈKbï1 ¤¡.ºàŠˆÈµs]‡N óŸ ´g8†uá¥÷ž¥w«ºTòw!/3'ßPê´È>G»@38W¡÷è·y¤}mBLIDGÇCp-Ú=<Ž1÷…sý¾Wëò8÷7 ÂÙžJ\²ºŸ¡G@ë·¥”éGL†GCû4ëã–•H’µ ú´Â¯´p9„7ïBd˜Aâö?øcëArkÓþá×x¸A‘Wcù´äîŽU°%'áD.O3vH$Fá#êÇ å¶š>¤lZÁª-ÇðhЙaãžãÖ3†[]û2}šUÆçô>öÉ'°V†ŽNkÿ?÷ÒÙ+-³´õ ÷zôª ÁžMžG i…ו´•Ù&ÝÛæ i›~bI\þu>Î\ oׄ >Dµ©„óUcWp|œÁ¾u‰ †‚}p$ÀB꾄sÓ;òN¦’rö¿xŽen9ïèbó!°i}üõb¹–9Ón·_ÑÔÇ 6¥–û‡+(æý­"—gåøo/òè—É´zõS†×w-ÃgrØ=þQ^[îÏ€ñãè¢]CDD®!Mr‘20Ъ­=³Xÿó&ÒËp+l?¹…ŸÖfà~sn R …Z¹õ¹ïz°}KJû5š…„%3Ùj¯C¿¾ ñÔ+DDäZOiúˆˆˆˆüÓi¤VDDDDjEDDDDjEDDDDjEDDDD¡VDDDDäÎáznlÆ jq)³²¾uËáF¬”ˆˆˆˆÈ•ÐôQ¨Q¨Q¨…Z…Z…Z…ZQ¨Q¨Q¨¹ ÿ¬êÚÉ?¾…¹?ÌcÝž>ž‹_j¶èÂ=½n!ÜÓŒýô*^ø!1¦Œøú»ýõµ(8:'Ÿú‘c~wðÖø©æô/=:²7òZ¿·ØM-žþz-€Á…)Ë1 оƒ;?-[Æq²Î%f i›§òƋؙl'¸qw}¬µ= ÀN^ÒZ¦1“UÑñœvô§JÃ<ðÐ]Ôó1nïänæ~5…[r"×…€ê-éö`?:„»S·•¼÷ôGü‘åÇ-ϾţÍ|1_°FIÛ³“<ÿ5†OŽÁêÚœç&IJï¾áç?bH8iÇ«|8MîèO¿x˜Àz|Ï=úGÜš3l€7Kf.gï ¬ß™A÷¡‘¯Ygˆˆˆüå®ßôÇ*ôyíiÚú¿Ø©V_Þx¼>FñËó“£IðnÌM‹x6z˜Ñï¼Ã˜Ç[â{vl»ùìÃ…$áˆA.É›§óÞ´ò[Ú*Þ{ö}æî8†kõ&ÔÊãàºi¼ñüd¢³íËÔ_cꚤ{V£fNÄ,á‹×?beŠõ¸š³™c?æ,gê |•!—ÚÒ¶g&¸ý£ô­f@Îz¦ÎÝËÎ9ÓØiÇú|S9ø ë[,³Mûö¥©'€#5{€«/neìó¡Ý+ŸòÉøI|úhM àäÞXÒ¬’—Ïfs.ø¶ž×žy”á/¿ÎÀpRgæ¶ 2wÏfÑq |/Æ}0ŽÑï~ÌK7¹Cîf~Ýz~ú„-•5Ç0눰;_â™Na\ú›±Ò·gw ¥Ó°{© $ÍÍØ…éàP›CÚ`¾úú–k W*6Ž"ÜÀ Mn¢ÿ¥ƒø9{~ä×£€ç-¼8þ=Fz—ñ¯¶ÇHš?“YEk ÝÆ~Á„>fÂsMqröïá„E'ˆˆˆüõ®ûÛÌ~ÍyäÍg1^þK—-И\ÜqòsO‘k-CÍ 4 ÷ÀFº{Þ¥Æt' ç?deùP³a$‘‘õ©âšKÆé \(W%àÔŽ Äçöl¢¿yG~Œ·V™~àÑšçF½HïŠÀÉ%|9÷è²lÛ+œK‘wh6ã9†®Àáéø-¡à¯©¯É¡pžoF<Dzí`Ï#iG §‹mûá¸èýoµJ¸YÛ–²;Ã^xC»ŒM'Ç0ª—sÐ%"""‹N 1rë£ýXóÜ7DœÃÈAspöp¥ óÌ+Â\#é×§6®¬-¥ G*´ëBÍ_&³wÙ8^ÎlNE{Û6$ñC?jAýzÝhë·ÅÇ~bÄ“»©á~œ=‡Okcî­ãƒ)ûl^õÄÝ5ŒÛûÝÂÜÑ+ˆŸ=™m_å¶ómÏÈ?ÌÏãg“T¼÷Î|——9ÀwÓôÎW]_'×ZD¸CrÖvÞ<ˆï-$˺°Y 'ÜN³eÎLVLrGoê{£“JDDD®¿Ô?¾àÖ…—Þ{–Þ­êRÉß…¼Ì\œ|C©Ón o|øíËöº(sp'^7”Ûjú²i«¶ãAg†{Ž[ÌnuyhìËôiVŸÓûØs$ŸÀZ:r8­ý/Þ†{½ÞÜSÝËn¾¶ û•lÏFÜÜñÌ8 x¶¡ǪԸ󚸀5f Ÿ,;WY_ýýŸêEƒ@g°g“çÑ„CZáuA%ýhÒ½-aζé'–Äå_ÚpÎUè=úmi_›SÑÑñ\‹vcÌ}á¸è|‘¿‰a·Û¯hjå† ˆŠŠRˉˆˆˆÈ ä&…Z…Z…ZQ¨Q¨Q¨¹×õ_Û°aƒZ\DDDDʬ¬ÿ>‚ÃX)‘+¡é""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ"""""W庾§61_ .RTˆ“ι1¾ƒþé4R+"""" µ""""" µ"""""WÉAM òÏ:i¹ADD®H 6 µ"rã²?ÚF ""%2&.ÿOí¯¦ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆBm¶ìx¢LaÆû#ù|Ìë|õÑ',X¶‹ôü3+äÆ2ÿï²&±à/ß¶õØb¦¿ý%û³t`\Ò/[˜óöx¶¦ZÕÿDi³híR™ç·å^“â­ “hêR‹±1ùjkù[8ÜPÁ)+†Õ_Mg¯-œz7w£™ŸyÇ÷²sÕ,~>a¥W¯x¨ÏDDDDäÆ µ9$,ù‰½öFÜþPW*º…]­•Ê›˜9m!›âjÒ&H&""""7j¨Í:ÄνywlCØÙ@ €s…V´håJlgþÖzr7«—,g_ÜIl^U¨×¹'Mªz`ì¹Iìù}ÛcâÉÈwÅ·Z¢noC%/3¶Ó±lž¿ˆ=‡SÈuô#¬QZ·®‰ë²“½.¿üK`—A´©ã}É\Ë•ãa[Æ>¶ü¶˜½‡“mö&°úM´lß”@£p Å„EÜє̵«8˜œ{•–´îNê’_غï8y.¡Ôé܇æÕ=1]éú@Áñͬ[°‚ýñ§±à„g¥HšÞÑžp‡sÛ¼ëfò7¬fßá¬^U©×¹«z`ÂN~òfÖ.\Å¡„ ÌþÕ¨Õ¢"v/ÿù ¿ñæ#ÏñÙâ]wªHÓnÏ1þ£¡4õ1v2w~Á“CF1}]<Ù†•[?ȘÉÿãު΀Ó[?牡c˜õG.µ:0ô…›ÐÄù;Ý0sj-éIµøQ!ÌýÒJ™}©Öª=õ+YfË`ïÂ-85½›nî!²\"Ûæ®$µ°¦²ë‡/ù#µ{¦Û½ Ë]ÏÂoçx>{˜5ßL#Ú^V÷ ¦ëí5Éß8“ß·¤ùR¶‘{d1ógGãÛa·hK*Ç–Çúo¾c{všöÄ]w6Çóè|~™¹‘ÓgS¹%…Kãlןž}Ûà™°œ¹Ÿ|ObØít<æåSصx=é–?±¾%‰-³~åS$7ßûwöî@…œ,ŸMöÙdjM!zÁVÌ‘Ýé6dMÙúËŽçƒ-cK¦ÎåˆcZÝ7€¶Q~Ä/XBŠE'Ì¿BæZžiÙ™·ŽÝÊØ¹ëYýÝ“TYù7wù„ƒ@îVFÞ5„Ù^ò鵬úåtNÿ„þg’lKü·ô¾y(¿xôçóß—ñÝÓÕX0ô%¶æ©iEDäïsÃŒÔÚòO“ îÎeÈÙ6ðkyMj–ÃD(ž­ö³û»ãdYÁ÷ÄFv妡¨îa¡ø¤LXÈîä¶xå¬f_nmîlMwâ–¬4VŸH¥ €‚¤•,˜ýæ›skd9ÌÅT!÷ÈåËÉŒÛJLf-èH o†Ÿk:ISþ`_jc{v·t¢v%w <©Wa) ¹íhU7<¢ª²ùÇTrÎ&í+Yß0ãÛðvn­EOŠûÉMìÝ|’|¸XÁµÉ4­UP«e¶}—BŽÕJ枵ęër{÷[©è †¯=‰é¿eëŒù8µú¾JlÆû+ÞåÁÊ@3ødUË™;˜×*;Q{ðûLë÷·‡:M ;ô)“&ᤥ€¬ï°ÐéæÎÉ~МZ¶-T}8U+"" µ†Ù3'É-°A11Òš“IžÝ`vÿ¼çùÑS³&£0æ§Ä“UÏʉcX}vƒÝ‚Åj'83—Ì䬾Íðw5Î5oTºÖcGÀÏÚ™ v;ŽiYç¦;\ÈBfÂåʱrjÝb,^5 v?ÐýÃñwØÂ‰Sð,Üo' ?m`vtÀÅÍÇ3Å&G £È/ɯd}§@ª7s'=!†˜èDŽÇ&.6›_í Ê )® ­d&žÄ¸™€só1L¸UÇÛ´CgÌ?^Ƕï%§Bwn*þôw¯}; œ¿àùP§.ž"zý¯Lž¾‘?Ö.gÁ/ÛÉ¿ÈãȆ#˜ëŽ Ê÷ü±|s'¾U󊈈B­Ù·>ì&.)‡z¾U‹-…SdzÉû^úÝe€aÆÑÁ(¶»ÍŽáÞýÛáÁÞ˜œÉH´ƒa¸lM ºu ­½V0{Î\¶5J³§b·Sr9§v°c/qfªq…­v™6È9ÌÆï§±+§<•kÔ ¬A{ÂCç3oûw—mCÃ0.-Ù0t¶ü›fÃNÝŽ-m9/vìÂG©éÞ³+¾Í½Í£ãä3·8æbŽ“ !""òwºaæÔš<"¨SÙ aù*³/ ~I[Ø›b"¨VH))ÜÀ©\.Y ¤ZÜpóðÄÍÃ{Û¯&9Ï„{°FúARrÎM.åô–iÌúa§¬€C05ë–Ç«FG¢*œfÇ‚Mœ¼ä0æÊÙJ9NâXÖùqÞ‚”¤Z¼ ðºö÷yG–³#=‚öäÖv-©‚s~~èå€{¨¶1¤äœ‹Éä$8?XþÁ ª_—¸¥¬M>?I:kÏ"¶åV ª’3éKßà½}w0gë ¾ûß3ôïÒ”r™Yg朻P©y¬»~fcúùcÿøºEМkùÝ8o?0yQ­S'Lþ•y_¤P¯E}Êû»bIÝÇ®•9í3íjzb²%•ü•]¾µý·°iö<\nk„Ÿ-™ƒk±‡¶Ôq5ãZõ&ª:LcÕÜUÐ2÷œX6.ÛQíð0§©/5:¶b÷¤e¬Ý]—Ûë{¹0J,Ç·bÕÝ¿bíœÅ8´­‹WA»®''¬Õý࿟ÞäìŽCn<ûwÅàXÞ™ì£Ù°& »s"É)9xy—|ŸãQ£–ÍaéœrÜtS8®§÷°yi<6|uÆü xÝü‚[ó½ŸÃml"rÖññcr¼åGô¯é‚cr ®§Öóí”_qoêIÒòO1f?VϬٓÁýÝŸ¢Ã ý¸ÿžêLq; sxý™uPU+"" µ…9²1íy±sÕzmú'sqô ¨~wz¶ªO9' ´É!ˆÈ¾â°ð76ÿ¸…l›~­¸½c3¼Í€[uZ÷ïņùKY1u)ùÎ~„Eö¦c‹ ÌýÎÅØ‚›oá×¥¿ÞŠnç°%•ã-ú߇Óo‹Yÿý:rÌÞÖèÌí›âuÆÆ*u¤MÔ¬Y:}xâÑŒV"ØûÓ<6­‰£JçRúÁ³íú°ö·•¬ün%&¿jÔét®¿­Òó/`x¶â½µsñyä9žíô>Ç*дûǬþèQª9mßcÊÿÝ˰gïä[#„F]ŸàÓõø²Ï0^½†î3îgæšl2šAíÞÄ©z{ûâ+yS+""ß÷›Ýn¿¢×nذ¨¨¨?µ±Dý š"¸xºvIçHè¤åçþßþh5žˆˆ”ò&.'aP›2ýÓ™Ôå""""¢P+""""¢P+""""¢P+"""" µ""""" µ""""" µ""""" µ""""¢P+""""¢P+""""ò7rPˆüó—«DDDjEþyJú÷»EDDþë4ý@DDDDjEDDDDjEDDDD®ÒuS⤑¿žFjEDDDD¡VDDDDD¡VDDDDD¡VDDDDjEDDDDjEDDDDjEDDDDjEDDDD¡VDDDDD¡VDDDDD¡VDDDDD¡VDDDDjEDDDDjEDDDDjEDDDDjE¤d¶ŒXVOÉèÁ÷ðÄ}½xfØS|6} ɹö²73qÀÃÌ:ÿ—oÛrä[^ïÿ›NÛÕ÷KúÞé?œEI–k°¾Ì_ñ¿A½þê2RLgä}½øhCV©Ÿ´&ÌdÔ}½ø`]ö+X&"òwqPˆü‚Ó©üðò[¬³FÒ¶Ç0º…¸}dË~|Ÿ÷â-Œxê|ÕLÿ>öÓÄÌY@Ja<7ð&|ì»i~û¸–/ýÒoxT§y§;q q°&ñû O±ù¶y¦cà…ËÔÊ"¢P+"×'ØdóÝÖÙÚ1dìêxŸy@Ó )õªšysÌ×̉¢oe5Õ¿¯ï-äæ›ð¬A°·f"éÐ/²L5y7 ý ÿ`-a™ˆˆB­ˆ\—\“±ƒeäPuà=Ôò.:ãÈÀµfzôôä¤=[áÚ_ÃŒog°1æÖrõh;h8w4ðÁس²fê$~ßKZ®;Á ;rçÀÞÔ-Wx)±¦næ·ISX³+l§`jÜÖ{ïŽÂó‚Ù8½õ >xo•†Žå–þ—̃º\9¾`MßÊÂISY»ë(þTlÒ^ý:RÉÝ(œBñø*éHÚϳÙv8ïºwÑwPCâ¾ý„E[âÈv §õàçèÖÄó•®¼¸ß™=i›÷¥’o¸P®æ­tòÏm¿òcÝÉ™?› щXüêÑvðp:×÷Á„ÜË™5y6Ûö§ãÚ€›ï¬y¦í‹í½R׿lŸøžbÍ+CøápèIþoË0F=ëÂ×M…×?¦GÐÎ’ëš½™‰~Fàˆx}þ,s“€oå©M/ðÖÿL~ô3_O¯jNeê“Ë·‰ˆÈ_Cב¹‚c;H(¢v„×¥'¼CzÞÏ­u¼ —YÓY7y .·?ÍÓ£ž¥cÈ~ö#ñù€%‘åo½ÄO‰ÕéôãxúÅ©•5ÏG~Çá\;öìÝÌzu,«l7sÏKãx|`9 Þcòâ$,EmVô·Lø`Áޤo1¶¤rl¹1üôê›ü~º.]Ÿ˓úPnÏ$>xg!)gGóXú] Uú¾Îó/݃ì >zòmöW'ÞM÷ª ¬˜2Ÿä‚?±~Á!¼óÛ\ÛÒ{Äž|¦µ²2õ³uœ›.lIdÕä%8´{‚§ÿ7’®²hÂ4ç5m%_½ñ9;ÛÐç¥7è×9˜=“§_P|ß•º~I}’ïGË7&Ò»Š=ßã7Úàuñ\êzþ ¥ý¸èê@ÈãywDc\Š–Q–>)ËvDD®’FjEþålÙiäàŽ›¹ô•íÒm]š•ÇD8~=·²bôQNY  i!ËŽ„Óûý~Dùš€p*†}âkVº‡€Ì9lÈŽäþG{ÑÐÛ*Ñ÷t3âÉ­YXxÞùôƒy8ôx‹mËs²“½ûòå¤í]Êú“ôxµ?ÍÌ@¡žÇ8ðÚ<6&ÝF'?3•ïÈ͵½1ð£M­éÄfõ¥wçúxàÛ¹>óßO$ã\Ò¾‚õMß:€þ­;QÛ× TÃûø"Ö-:A޼¬v<; ¥kóL€Ï]-Y<*žÓVÒ×ÿ̇›2üêxP'‚`ûAÞ˜”Q\¤-uý‚#%õI*×0c``˜L˜MÆÅ¡ö²u½pÈÃ0/Ç0]XHnÌ/¥÷IIÛqÖ9*" µ"R&Gw9Afž 0_"-Y§È¶¹âaÌžT¨æw.ÏŽ.8…ëåÄÇr2ÓŸ¼ŸÎæ»…‹ ûÉ,Ò%` ¼ƒ g:Üéyž,Gö@A,?¾³“݆Sò©‹§iža!}ßåʱrüשøEQÕçü~8…6$ÔñwŽœ(¿Â}òw9ó&'GÜ<ƒp=SœavÆdäžß䕬ï\‘fwø¼oë×àHì.¢7ÆÔâ‚ò*E”+҆ΘM¤8)¬Gácù3Ú«F$þæ•Å´Eië—Ö'ù¥¿™à²u-++§&”©O®n;"" µ":ɃjÈZöÌ mÏ…¿V·&±ìõ'˜ïÿc7ÀpÄÙ±øß³ÛmvL^m4ò>*8]b`vs%í€L¦~ ïDåûÞä>ÿ™¼ýáç,ºí=îªæ\ìvJ.ç"†[Ñw¥?É/ãúöÌÝü:n +2ªÑ ª 5Ûô£qø$&,/ZÖåÛÐd2.ÝTqWÆõKî ÒJÙïË×õª\Ü'×j;""E/j‘ùIîÛˆÖu b~˜Í¾Œ¢cwvòýκ3UZT-å)°kH%Ü2ö‘Pà‰—/^>¾¸ÛbXÔ%•ã=Þë—Sùé­¹d8øS©éC<ÙïvüÍ×¾]jàNï3cÚ86âG…F¹gd$ë>žÄ¼ŸöÒ`Pi÷­yðõ|fMšÅô7Ä\¾­ ÃóËÿÜú¥õ‰í¯:€|‰hQ‡e³ÇòNÚËŒ|¤HÜu­õ·ö‰ˆÈ¹ë‘Ýn¿¢gT6l **J-'r $æ« DDäúqúwí¦ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆˆB­ˆˆˆˆ(ÔŠˆˆˆˆ(ÔŠˆˆˆˆü=Ô"7Ž'µˆˆÈŸ¡‘ZQ¨Q¨Q¨…Z…Z…Z…ZQ¨Q¨Q¨Q¨…Z…Z…Z…ZQ¨½aسãÙ8w ãßÉ믿Θw?aÚï»8‘f…ÜX¦¾ù.ó þòm[’óÁè/Ù™UúºÖ+øøõ×™¼+ûÆïåœh¾ý‹“-:âÿ+lìýåc^y¼w÷ºŸa£§±9Ízþ<Ë=ÂÊãýïæžŸdääU$—rJÙ³vòÅKÙ–eÇ?“Ç{õâå5ØK«KöfFÝ÷0_îÏÿëÎÕ+Ù~Yš+m Ïß;œÙ‰Å#vNoûŠçúõ¢Ï«+9i¿þÝ™ýý{=ͼÛyû¾^¼°4 û xØýÕýr£×³¸~ɉý†ß[KºM—!‘ÿt¨µgÆðëg“˜c"â–nÜÛ·›•çôúYLšµSÖ¨á\ÈlÞ’ºþeHÀ©¬™0šOÿ8‰®sríYI^ô?F~w°;ŸdÔkÑ0ígÞyo1Ǭ€=›è¯Gñé7y•4$sч¼9ã —yœý ‡šw§ž»É£:·v¹“›C0þŽó¯èö­Iüôä½<3ÿ8×äa?ÍŽY 8VoãžjŽ÷߰ÆaÆ0 Ì&&ÃÀ0ݘÙþîãâz׳¸~q ïBû¬|¿;ë†ö"ÿF7NUr8°è'¶Øqß®T÷8s©‰¨A¦,dY\Mºßµ5<ªqóíÕtÉ'ïsgï£òÀÔ>3Pmø)R¾ò®7dh4ýÍÇÅõ®g±ýbr¢I‡`¾Ÿ½‘ô:mðÓ$?‘ÿ`¨Í:ĺè<*Þц¢—k×J­¸½+§í–sw¾–ôÝÌ[¸œíGObó®Bó®=iîØs“Ø´`köÄs2ß•€ˆ&ÜvGjx› ¿OŲü×El>˜B¶£Õšvàζ5q¿ð›ŒÌع|ùC,aÝÑ­žwá—ùY¹±L}÷WÊ x‚Îå1õýE„õ¼™Üõ«Ùq0‹wUšwíÁ­UrYõÉx–¦¿}À¨˜{y¾_ œKªcn,SßÿÊ}Zsú÷ߨíÑž6¹¿²È±OÝ_ 7 H\ð1ŸÇ6d裷⛺™sW°3î48áS9’vwµ§ž¯ƒŽòÿ˜‚c[Øv*„ΑåÎ³Ž•º1bä™Ì³C–0z×ô:ŒÌ”«ÛˆÀ¯×b¡vØÅÇŒSÛç±Û¯ ý†ÎÞ̨AŸ2r<…ìdÔ)T²;Ysg³bW"åêÑå‘áôièsæqückøâë¬Ø{«=º ν‘…ËíÙYôÕ$~Zˉ\wÂuäþÁ½iâïP¸­!ßQçùž¤~û%kýž`âcVÞô!¯ŽÀgâ³LO&?JŸ/ðÍkMp-©<ìäZÌ—ŸÏfݾtœÂб{Í⟢ØRYüÂ>;|’>›†ñÅ+^Œä¢ú<×Ç´­üøÙTï8Ê)ªEucÐÀŽ„»göa áÃ:r|ölÖÊÁ·þ]<6¤!¾ù„Ù›âÈt §ÓÐçèåwáµ0ûÔãö;C¨èæWÇÎd…9öuò¦LüŽå{Òp®ÔŒn}"Xùþ:OC£ íZr¿ýé~9ž‡Â°¤lfÆgSX¼#L§`êwìÇÐ>Qÿ€+ŸÄ•SùìûåDÏÁìS•›îÆà•p1®°.¾pOÖ§|ãüŸ¿Ø O£°ü_?Îó›ÚòÞ›|3´lõ,i»Å÷‹Gí¶TüôGÖ§´¢s Y%‘ëuÃzÃ|§$ÙâGx÷KG ̾ÔmÓž–UÎ,³e°eÞœ›ßÍàÁ÷ÐÊ?‘Õ?¯$±°¦òÇ·_²8¥mîÌà:ž³žé_ÿN|>{˜ß¾œÆ&{=ºỗ]j’»~&36¦ð±‘}h1SfDØyw]h‹cMaã¼­84îΠÇÐ.(‘U³—gõ§Õ#ø-ÀLÐíOðÒ5p)­Ž¶t6ÿ¼”ÔæÜÖ¼*5…a?ºøœ³ v‚{2ð¬?I¬øþWö8GÒå‡x_"r6òÓÏÑdêù׎%õ©¸aÛ:™WëÏ=}døèoÙp¼pÒ¬åT2§ /ʹ?ýÍþ¸sŠÄÓÅ {æpxý<êV;ŠÛh" ¾X‚cû'ûÁHúV:Èì§›wöüHgÉçKp½ãiÆ{–ž¡û™3ñGæ~vÞè—˜’PÞÏŽcÜ«™9q¯~Glî™ØšÌï§“X­ ÷wªˆÓ¹ÛòPz¼û}è4`<Ó^iŒ[)åYSWòîËŸ³Ñ¥ ¼öû³õói*nN±©·™Èઔïýßiƒ¯QL}rc˜òâ›ütª.}GŒeôð.EOâå± §|ä'ðË”j xwÞ¸‡à½3xuØÛD×x‘ïf@xó¿šO\qõp ¥m—úx™œ¨Ø¾ µÜ ì™[ùô¥÷Yí|+ÃFŽâ‰N,ÿðÛÂ6¥ŒíZR¿]M¿öìÝL~q, m7óðëãxãá(²æ½Ç; ’Š\/8:‡q/ÇÔj/~aí\ùã‹wù%®àÊëÒ¹>MÚÕÀ½œØì3ËóãYµ>Ð[[âXÆz–¶ÝbúÀp«L¿d6ìËÔ‘ÿâH­-ï4y¸àå\†œmƒÀVwѶv9̄ҲÍ~6|}œ +ßÈÚc¡t~¢ = ”ƒÄ²1©-~Ù«ÙžA·î­©íaAtËLcîñTò*Ž(å%¬ä»àpË`z6.W¶F²‚{ÔÜZ§ptÌ«UV}B¦ ³ Ã0a2  ¹ä:†–Ì ûp_›@{F#¬óÙžKõp,)»ˆÎ¤y_̶TÝNÏQ„{™€P¼Ò7±eãIrmà¡ãü?ÄŽ%;‹ë^¾ùÉ›ûú=C—ã¬ÿ~o„qïö% ¯œî%<¯0{QãütÃÑÓ…Ë«EøYî‚ã™s6+.–Ôü}|2ì~>/r>ä[lØÓó±WÌîDÔ *=ë•Z^'öŸÀT¡îgšñ©I°yeÙ›ù‚úX9y$ürQÔô=ßFÎa ©äø;ûŽ@¹Â6 p9ó$ÊÀÑÉòAœ­†áèŒÙÈ-c 8“„-¤5UÏí‡#u#pŸ™ØÊØ®—ë·«í )± X‚î ªçùú…uyž‘@ÖÆ7é÷ÖV²œkððû#i_ívÚdâ#ð{‹æ4‰lLTTaî&Ò·]y] Ÿú´«ná«•ÈiX“ä5ë8Uå.š˜!¯,õ´“¾lVÉÛÅù2s›M¸ù:“U%‘ÿ^¨uô­D9v³?1‡~^(¬)¬Ÿ<že>÷òlO 3NÅ_Jì6;†{Cú jGy‡ ¿ìÍ.ΜL°ƒa*aÞ…#aír§÷ >›9—ÕM‡Ò>Ô© Yâòuº²:ºþðÅpÀűHy†U#C)X¼“älWöEgÒºÞ&°çfÉÔiü‘SžšµjP-²=õÂæ3u«ðÿäIíY7“êANEŽ*QÞ9ÔÓù8–ÇËv€ôlœ™‚`ÍJ! oÊ{I0J;´ Ç ×+Xn·Ù1yµå¹±÷QÕéÂóÁÁÝÃθ;•ýüº|yÎÝd\DLÆ•ýðª,õ1 Lر}ý—ýºËŽÝj/î–æ\_•­]¯]¿Ømv0­u«?Œw&ä¶ŒáˆW93†¹>½;‰[·®cýæí¬Ÿ:ŠiŸV¥Ç¨×èøgêbøPïÖpò¦®æp†'›×¦Z¯¦”3—½ž¥¶A‰·—"r½Ý0sj ¯¢ª\²ŠCÙ^¬ó“¶°ù„‰°:!¥<Æ1pñÂ-+c7<==ñôôÄÝÇê«9šk«¼¦´ƒ$åœÝ†•ôMÓøä»M¤Y‡`7(_ÍŽÜVñ4kçn"å/½Õ.­Ž—ÿœGµHBóö±-zÑÙa4ðÄr-g]Z÷ yžZÒ°z®ùùz}Ø”SH}ÂLÉìŠ?0YÒŸçA¨¿ N! ¨â˜À¦g_9dãTÌvNxT§N@1¡ÖäA€k>'³®Å˜“{h%<2öq¤À___|}}ñ²Å0ç«9ìɲÿÅå9ˆ-n#ûÏ•]¸ÿÉz÷ÌøT Á1u1'Ï’¿Ãþ„8^ƒvsÄ?<#q;‡Ï]/-¤ì=@¦­ðÒ~uízµýâ€_Õ@ŒäÊ:­=¶x,OYÄ1ƒ‚ "(ÐW³•ô­³™úë!|w⾡/ðöx¨â!/ŽÃáOÕÅÀ·~;³·²lý2ÖgT§c#¿‹¾ôJªçb2‚ÿlØÈJÏÃÍßýLLä?j1¼¨Û¥Ù0eâ·,\·½ûcÙ¹~S¦®%= %j{–z÷ëÒŒ¦'X:c›öÇ»‰E3~bó)oÜ̸‡ßDm‡~ýi{Ž&¿w5¿.Þ‡=´^E¯>f_"ïh…Ò2~Ûyú*¢aXÉI=NZfŽ%Öñò{hxT#2$›­ דY±)Uϼ%ÂììŽCn<;¶Çp4þ0»WÏᇕiØ39z"Gáö¿vRû6¡{Ó¿ÿ1sþˆ&fëb&½óÉÕºÓ=Âã>Ý[»±ù³OY}”Ã[bÂ7û îØ•—âò“?5*;qbÿ ®A}«uæöÐx¾ç m‹%fób¦¼û1‹Oøæi*Óùe2¬d&ÅqìdN%–爳®4°¬áÃ÷~`õÎv®ø–÷§Äb½Š±5ך]iëËWïNeÅÎýÄnžÇ'ïÏãTδ u¼&—nß&wÑÔ´Ž Ïá½ûÙµb*楂Q8ê|µízuŸ7ðnx-7òéÇ?òÇÞƒÄn˜Í§S¶b¯yÉh)˜p´`ñ´ |ùë:vïaËò…¬N4TÅ?Y÷>íªféWó9Y«# .yÉpÉõ ©þ'ÛÀzŠ# –ÿoïþc¢®ã8Ž¿Ž»ãŽ“Ò?Lå3ä.ËœåÒ"ÖvafÚ"NLkdéðGæe5]ô‡ZPG+K°(6%Fm­‹ÌÚÔMÜrý‘­Ðaömw×nýáãùøÿ¾÷Ù{÷ù~^÷¹Ï½¿J•¬XnIÀˆ‰ª~Oæ‰ùzt}‚‚AêlÕ×—®*Ö9YSçúT¾(G)±’†:rfIÖÂ’Õ²mÕw©/ìPrÖÝZYè½v#u¸õPÙ2µ}Ö®Oíºj›¨Œy˵rA²,¿^©ù*òt©îX›zÜ>¹Ã\ôÌñre»ìøHµ¿=®çVd>Æ¿LµÊÈ›"SÓe¸þiAfs-•o~£ZŽÒwr*5Ë«¢µ3ÔÕpTí_þ¨™E|ÐÇS‚æ•oUi N-û·ëC#I®‚UÚQö Ò,’äÐí%U*¼£¦W+0OÑìÅÏhsqú pœÒß[Ω/œþß÷Ý´NWñΊ­ ¨áõÏu1äÔ´‚bm)+¼6Þ¡Df¾EÙwÍRsýn½Ð[¥šMs¿Þ¤…ªðz÷­x©Q–´\=P¾A‰5Ã/yÜL•ø7kBÍzß߬˖[•é]£]¥÷+åÚª3%z´qד ì;¬êªz%¸iÅÓËdìéVœÕtóu½É×›œyZ¿ûYXÒ µ©â>EÚÞPåº5Úðr½~ÊÛ¨m«fÐuýÙÓ¬ãŽGôXöŽ#ŒãóØ©¡ Ô„ZjB-0º,”Âá° Ãa …x`p‡C6Ûøé\M¨ƈ˜˜ÙívÙívŠÀõë$%¡ Ô„Zj€±íoñøgŒóøb•IEND®B`‚2409_agent_based_service_rendered_for_host.png000066400000000000000000000540601516513262500360200ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/24-agents‰PNG  IHDR5˜à:FsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwxSåßÇñ÷Éh’îE[ÚR -Pöž*KÔGÅ'‚T@TPÄ­à@püœ8EÙPö.{•–îÝ´Y÷óG ¤i–"ù¾®ËKÈɹ׹“|¸Ï9‰Æô¿B!„£èêºB!„âÜ“(„Bá$ !„Bx B!„HB B!„’(„Bá$ !„Bx B!„HB B!„’(„Bá$ !„Bx B!„HB B!„’(„Bá$ !„Bx B!„HB B!„’(„Bá$ !„Bx B!„HB B!„2ÔuÄùI=Ò»®›p^ÑÞý§®› „BÔ(Y B!„ð@…B!<„@!„B$!P!„ÂIÕvôæˆ ýÿB!„'Иþ·ªëFˆó§Þ¬½ûÏ)û.Q!Ä…FVEµyBòÔð+„ÂóHÕæ É‚®BÅið„€ä AW!„ â4xB@ò„ +Ä›‹‰“}]7Eˆÿ¸š^¡ü=¸3#´ŽlÞ‘¢›#‰Ö*Ù¯ÊrC˜?¨LgßijáÁ;×u%÷áÞ¨‡.f×µñ Òs¦Ý:™_ƒV iÍ•^5T` rJ·óν0àø·Ü÷Sæî¦¸†n=²nœÄÀ;&°ÞZ3åJ­Ýj¼>ª5Γ×CÑû1éîÞ¨Zpy Ì}K½xvÞKËó4%xòûÈÓ™¸¢SK¶<Г¼ûº“:¨'Ö»Û1-Á¿š8!Î :Æ7ᫎUœÛz ÷ônΈ0C½WÈoŸc“ú7¡Ûž$.YC²fæòö |ru#vÍÙÍ*ÇÙWaÍJfðß°±ʪiU$C0—Žy•»ãL(G©ë¾á÷ÞàÛosOã³ÿ4òйš‡qѰ?Ø*»;ø\:Ÿç@m±„„3ÀXÄ:WD˜ð¿œ…þ¯5(eÆÊ-R6òçÍû°ÁL7«—Pzò6øduàÆm±41ÖE#…¨IeAðâùédðpÏýXsjëš@‡•×~Ý̇Ç›ߊ¿â4}õää–rtAÏYbå ÓH”—Fú¾ÜêËK×\Ä UÀìûyqSyµÒÐÓ£étKòøpe.®ƒÉ‡«ZÆòvÿöD¿–¯üŒE7cç ¦åHÃ[WÌ<¯²%G‰•”òÏGa³‹b¸#ÌÈZ¿pê9À’R8~ŽJ#ØOONºíØ_~feêhÛÍM=ŵ÷F]e@ÒÒsäKÜkM% Sù‡5 ÷‹ ØK¦çS´y:ßûAùÎ.lŽHÚYèÃ;pqð,Ù]HãÌ¥ä6»‰>d­ÈévslW¢sþaw²}¦ö ºh7+æí"Ù˜„³Ù½Ôwó!qN® tûú8QÕ¯÷¯'8qÞ¹¬¹ÌÊçŽ+ý똲‡5öÚêhuèéÜ<”AVŠA&ƒŽÒ–ï/»$ ´¨ˆä£™ÍQÂæ=­Me}«t›íx ç[ŸÏÿ÷7ïÃu‘•¢DiøèO±~ïrâ ‹áf& œçgðãsÞB!jžÞÌåñA„T|LóåÆF¾¼—™GN ¥ÀÚ ÊEf¡•½ùÇ[Ybu•¿Ñ(r‹œ…zaJ½ÉL½ƒ#vðó5’ºkÝÖï$¢^=F÷kÁ׎ÕtKª•–ž–°ø¶ìn—N«os@£´ˆŸ×ï"¨QWžŒ0òQ‘Œ};iò{vÙ‡´¦'ÂGO~‘ ‚A)űӸ®R~ÙmghÓ`®ó3±|m¹Àñ{ùÅ.ŒxQ¢,Aá -dž»zjQÕÉ€OHáá•ܹ¡éÐ4ÞA¾øwÌ;£Ú—­€©Rr³¬XB  Õ£S~[²ÕÙ4»1o Ž_ãî~ÍÕ”.!_²ti Å1wÐ ÞŸ™ËY¶2ŸØëâî¾’s²èöõq¢ª_î^O 'Í;ecáîÆ7 å6#‹WPP«­‚—?4pòî/kŸU6Í!±,º"’ÞæLF‹…0d¹ƒ‰æ&‡m Ìn¶Utžõù¿ð>âç_ɼÛTÂ9¿×ÄQ̼¯4ó'ø`öñ àdíÚ-\çÛžþÉô[”ɹ9Dü×é+Ü€ƒ ˜^#HùÍ"50×ëà"{ö¤‘ݘÑ1f‚Ì>ÜÙ­!qGRXhÕˆŒK`é• èå§ÃVj#Ë¡8þé¨'ÈXw—þf¥¤²Ø¯³º…Ñ#ÐD}_oz&4â™¦ÙØ •õólŒ™@“…K;´fÓUÄœ²É.öíË  ¶1/äñÑ‘“ïòq±eG¥qZßDˆOôŠç~ÅÁÓª§æÔ\@ÒÒéR"“¾âûõ馱ù‡WxêÕ…d: „ué†eÍ|s¤ýšùœt _ûëƒhÑÆÀšßöÜ.K@SZê×ñëÞPº5öv{ñøùuM ®¯åæõtª2ɇ2ÉlИç|ó˜™^··FDr¹+‹ÏRKH-¶‘Zlc_ê~±08ʈðlÀÄæ~„›,\Ù1ŽëíéÌÊ) Œî¶w~õùü©jÞcª„oÓp6iÎ N¼êEÈß­¡É¯‡IªÛ+„¨zºvk{<ÚsñÍJšV¼F°S¾ˆ÷ª‘ïɬ“¯ˆ±åææÅf>ëÓ…‘>Š=‡’¹ca:)J¡Ûº‹I‘ üzW,Þ.;ëví垤N¿¦›xÿö6乑¯ëàæGawÍÕózÆüÞÎŒ¿æ$-+‡OþÚÄËéNáο-|Ö«39~:ÒÒR>?™$œêëÜJó2ù±$–‡ÓRYiû÷öâôýÜ´²)3¯ìƳ“Í»ö2pS1Åö’Jë©M5yªTÖ—'NcÚ‡OrO†ƒÀ&}¹ç©kˆ*Ÿ‘ƈ.tñý†yÍ.¥é).–s¿¿‘úí›ãûC­ù¢M´‰3óã¡.$¸OÊçÃÝÁǹØU×ì-•¼žN=ïlùYüTÔˆÇÒxŠywE¶›ØR1—9Š˜}ÐÉ-ƒ¨·ò2SØÑ¨%{{™°f¥3ü¬w@ •o;ùòØó§Ïÿ…÷Wåïõ>:§–up7W¯4³°oW’š¦òå¡b ½,\Nû´m´_˜E†@qAp²fý.ÞmÍ#ÞnÉÜÁEó`ÙØÃÈ}6jbÊkLÿ[ÏÅ¿œ_aèÜ©,èž_+„gIgaø€öt]™È-çù÷ñŵcwËC4þùß×»Ûö/ÿ¡>‹Êh„ׯϨ¶á\jÆÏeckJÓ×%ó[þ©/§â¿Joöã"s1Kr+Þ¢æ%;}5ô6&_-ªí|ø"åÚv¡÷Og0Ò(2Ї¼syôˆg„!Oìó…I‘–šÂS©)uÝ!j³¤€Å%'?ª8’^³·ÉÊo‹j»Ð\`+~§Ø ÕW³6q‹êø´è¹â‰}BˆêÓÁâ”*;%ê AðT.ôp(„ÂóÈJ ¨6O€ö„Bx ¢Úޤ ùÿžt…BÓÁ¢†N$+„B!.4²(„Bá$ !„Bx B!„HB B!„Ò”R•Þ’˜˜H—.]Îe{„B!Ä9 +B!„HB B!„’(„Bá$ !„Bx B!„HB B!„’(„Bá$ !„Bx B!„HB B!„’(„Bá$ !„Bx B!„HB B!„’(„Bá$ !„Bx B!„HB B!„2ÔZÉŽl¶Îÿž_WlcϾƒdÙ¼ ާýe¸ù²×^Í8³Wñéëï3wʯãÞŒëÝÁ¼´Ìоýhf>×KíUn”îàý‡ŸãÏ|h1â3Æuó©›v¨þ~v0Ów O1ãåøiuÑ;{?œ§΄øGùhb‚Τ%[y{È‹,)ÖÓîÙ<ßÑ»Æ[Z‘+û/žò{¡ÿëÓ¸·±W­Ö'„BU;QÌv¹¯>ÇÌMÖ “yp >ÙÄÂE·2á¥Ä™k#-ØIùó æí.,DÅ×Ç¢AQ-Ô$„Bñ_U !ÐÎß<;Þʽý;ë_ʾ%³ùàÇm”ìþšis»3y@t-4ÀEQVyäk:„q£/!@sQpÝSŒºÈŽ>8Ž b­ÅÍ•ÃFÑ¡TG`s]·F!„ÿ15ŸÁJvñËoÉ[?«O÷%T_¶):f$¦ÃñúêR’—$’~C4‘z@Y9¸x6ŸÿœÈŽƒ™”XBiØ´ ×Ü};=c,hÅkyùÞ‰ltùpѰ©¿ü{nØOŽ1‚6—ßÃ÷u&TKåÇáóery[v¾Í ›ç3|æhü~z“×N>ìÌcóòÙ¼u°ѼÏm\ïó¾KAký Ÿ½Ø‰“Oº2ç1ê¡ØG(W>yŽy?±t{&ƨ–\ró`^ñ¤ö^òìhš-~¯¶Å1jÚã´ÐRX>gß/ßÎ,EpL]®»—=`¦ˆõo>Ä++¬7„÷'^N¨°næ­Dz´z—‰}2øñ×N8m©JÝ”ëJá‡áC™• ¡×¾Î´»cÈ_ÎØÞd‹ bîΤþá¸öɰ?’N4§N¤ÕÃxæ·l¼‚‰ÓÓÄts£:Ç…íH"ßñ- 7 Ûªðò¤ùÅ7pÏí½‰±”¯;²Xû͇ÌZ¸‘CÖ@â»^E?/WÕmpæ±ý×™|¹`#{RóÑ¢iÙk÷Ü| ,'®L;ó·òýß1oí²‘tºf0ÝØš€ò+iÝŽ·vúõ•±“òÇF|¼›®1·LËÍñGÇF!„¨95íéÙ^`¢]ÿ®Ç š›ÂÛ96”Þ·,ܨ"¶ÍŘ_”=Gç…®8“ý~cÚ†uìû÷µô©ð!XÄòio¢Ž~ÞÛ°ñÇÉLx‡/õ¥Ùå×Òã_Xž¢À¿=W\Ö(£FþÉ UEl™ñ,cÿHÀ`eÇïS™ ?ù‰•ÉdÁ[àPe³&oä×)#9â˜ÂÓ½B9^L ;¿šÀ’EàÝìÉü*—•ÓF0yYÁ±c±kñç쪪 ®ÀÉöÅ»(ÆæWÝÊUÍ}ËžÙ‡Ûn»”˜S¬^93óÅé€mœÆÌO>åóÉwÓô4úꈸšç>œÍן½ÊÀ#`eíìß8`?¡&ÒRêsÙÝ2|ØÕ%Íá»N°tæ‰>äw>⃧ºáƒbÿ÷_˜£ðiv)í-€kKw¡p’¹qÙzÓ)ä䤪(Ú\U¹";¶Äàð•8Éݽ“¼òì¶‘n/%eãaüZu¢¾Ñ@ØÅwñàðà== 3žÆàœ¤ºÇ¹d÷oü˜Ú3ô½9Ì™ý5ïÜ @þæõ¤ÙÁ~ð7>_VxÑâîWùìëÙ¼ÿìÿ^E©1kq.àM—Çßeά/ùlüµ„ÖÕ_ñûÁZÔõ¼ðálæ|ô,—XÙ°ä¥ÕouÚõ9Ò1mâ\ŽàE«ûÇ0¤K Ü¾/„¢ÖÔâ=ºº*—0Å{Ù`êÊÀëZà«|¸îÎÎü:q5¥ûÙ[|áÇr‘v7]IB ˆ§G‡~LÉB•aSP½eEñî•ìðéÊ×/;…{·uÿŽqK‹«Q†¶w ]°x®Ø‹_žÿ“¼ÌlÏvÒØïø3ãîÁàËBÑQÊ®’°lŸ;«¬ 6{YýάJ:F±}uY8kÔ§!zà„ü`#emÕå^ßã"Ö–îekZ®M) kD¯Æ‡X´{ûs2ÉÙ[xѬ[CLè07½„ËN'ŸRõs·òþg«”¼´­¬Ü¸‡‹ÊúŽÓŽS9ÉÞ²¶lµ2¸wÿ_<>zðép3w´ZÀ”-•­]* ÷®#À¯×v Ú^Ïㇱ·HO¸Ï‰“§Ù×Ò&؈FK.N0ó׊J KqUk¼­´.8ú²ø{ꇔڀè[rEô…qíªBˆóV‡@½þ€•dÙ!úÄ*œ)Ê(Á¥÷¥~LÖÜ"@@ÁÇ>õ4¼‚#ñ2T9VøÝæ…Ť{žÎXíó·¸(Ê*(«×¯>ÇV¸ŒGÕ ~D†šŽeNCP<¬eí=½‰¬ï[¾¢ã¢(»ü¦•üõÌûyýIe–’•S‚"ˆ&}Ûã½lE›Wr(»-+÷ÄÒ§cÿîqõÊÅ'žîqk“2Ø’´Ç;Dv¥GW'‹v§°qÏ.òŽZcºÇy×àiHWµ³f)`ó·oóñÜ$ÊO¢¢7XÖ±¾6 èèôÒÌÔ‹ôƒ-¹œš‹’ÜòãêWߣƒ¨ó'¡×ÿ‘pôi%Gÿ Çl6”†Þ«â¨Wg¼‹±V]Ÿ+»Â^¶ò?$ÿÊ/;®`H 9,„¢öÔx4†·!Á÷¤ZÙðÇrÛt'ðØ'™•¤ÏŸãÅ¿ ôZ^ŸvõˆÊ;L¶ b [vJÙieÍB€¹¦OŠé0ù–'‹ürìÐÀ`#+9§šešUŠŠ÷B¹Éå§V½ ö®Ø^ íØ_u˜}Í€]ë‘|úb×ãÙö$ÞM/¥ƒÏ2–æ®géª|vÚØ>t =UèÕªY®“„® é ‡–,Áš ~}Z—†IZ´ˆ'а þ5?tXªuœ!{ù»¼57 ‡± ý¸ƒK;6ÅoóË<ðvÒ±²¼Ëo×É;L®B¼e#ëHÁ)ê>Þ“_ù1/H§ÀIÙìWvrSSɳƒ%,š°ju»:ÇQ‘óOÕõ…VØÃ§ãí\Sòs¶æ°àã߸굛hp§à…Bwjþ’#sS®ù¿H¬«ß`Ì;¿³nO*é©{XýÃT¦ü]öAÜ¹ì† ïÆ]ˆ(Mä«_’(Rà*ÜÎO³VS а+q>5½¢áÛ¸uÙ5dÅ+˜óûnŠ]Nò¶üÈçË­Uí\ÎÁ†¯¾gS®Wñ^æÍú§lå*¬-‚*[ô"¢]# €k÷?lÌ.;uéÌ^ì·&1iÊç¬Ê*?iiBß>@:¿ÏYIÛ§§Ì€˜ªY®ž6Jw.ã0 ÚFâ_¿ Qd®ÙB!Þ© Ázù;—°à?X°dyUÝ|ë²QRRrÒ¥Ø]Õ=ÎN²wÆÞ™~=[mIcÉoùÐܲMÙ Y ˜õç~¬.'¹›þÇìMîncÑðmÜ–€‚|¿ôvå¢pÇ·¼8ô)†ÏÜÃ7ûWTãè:ÍúBèsË5\{ï5eûüŽK³¨ÆýÎB!Ä©…kÄÞ0œ»·æó­¥¤,ú„ ‹NzJýÿãÑ[š`ïÃ=WþÁK¿aÿwÏsÏ&ôÎÒò»R#¸ú¾>®¬ÁVF_ÎÍíåõ¥ìüêîþê 9ü /?ðK…|é~וÄ9éš½£4:ÞNÿÈMü˜²š)?Èœp=Ù)Y”–roàÑÎZhÒ·>K–PdU@,½;…žâTðé•kŒè@kÿïù+ >mb}ÐùÄÐ2 ’ÒhÓ!¼ìÚ6¤/ý‚Ê¿"&¶K3Ü}EÌÎwxø®wNzÐÂE/~Ä“­ªsœ ˜šDc GòWÁ]ŸºiSÆè˹½ëïLYUÄú÷ãöu`/‹YÞïäÚF^•·“Uo¼AÕ¨/ï„bñнš»ºüΤD+›¾˜Ãæ.жÆÿ$„BÔÖo›ríóoóÂ=—Ñ©Y4A^€Î›èôøÓ'¢íÑßÓ|huÿ$&?z%mcB°8KqYBhØî*s÷žðõ05HJ¯“zE "|40Ò¸ç½ ½6¢š„Òoð­t‹ ˆ¿èö\÷ôd†ur;¨š¹ wN|/mA¤O!©)ÙhÁqô¸e$“Fô¦^…”g‰ïKÇ£¿Û›N§^<½rM èÖ¼<ÉùÄ‘jc ±å™›Ó¥ÁÙ|`e ¬ÎqÖÔãžìß‚#àåGl¯÷üe_¥R°šIE¨òc÷äUmˆöÓƒW0/¹‹‡. vß]0=9…nëFã0tvÆÀt¼~8ŸèYÉ*k%Ý©ÎxŸI}ZùóÉ/އ`!„¢iJ)UÙÆÄÄDºtér.ÛSÇììŸ5Œ?¤£oû,3^èèæË¢ëqýä© Œ•‹¶„BñßS‹_s~s¤¯à§y»(ÒiÛÿjÚêÁ‘ÁÆõe_“ A" IDATใ#„Bˆ žÇæ½ÙHòß?³$~^º†K:Fãܽ„åû}Sú_ÑP¾§M!„, š'™8ŠÈÙßó÷ú,™· ½O(±]®ä†Ûn G”œæB!Ä…K® B!„ð@5¾˜“SÝ/[B!„5-((¨ZÏ«ñXÝŠ…B!DÝ©ï B!„ç5 B!„HB B!„’(„Bá$ !„Bx B!„HB B!„’(„Bá$ !„Bx B!„HB B!„ªñßvÇi/e‘' é Dùyá­Ë!„B8§+.¶oÜDüW‰4û*‘¦_®æ‰4ç Ï(Ì>Âc?­"ð½ÐÞ_J“ŸwóeŽ”fí£åW{XïÚ~w€ÏW¬'ú«Ý¬q(Ò’÷sõWKѽ»ˆ?íá§Âòö8­|þÏZÂßÿíƒô]™C†rÓžŠT)ÿo)]·––÷A±cÝj‚çf›:•ƒ¶Ðâ“вšÛ¶QTS‡H!„ã…@'×o¦Wb>~š±éÎ.üÜ1œK¼Woô à¯MŒ&®éÏ}Çï Ѽyg@[ž *á³Eëÿh9í~ÝÅ´Ã6Žf9„±m7zÑ­Q0 œv •bÏž4G7æ…X !_îìC£”þ.Ñ‘ëGñá3Ál!R È.°““œDÓOv–×§(vys… Â5ãë‚ý¼ôË2îÓü¸½m,cÛºmÏ õø†p»ÏA¾J·Ó± Ôˆ†\bR¬´NþE.¢M˜ÊË0ùøP_ŸwºF!„®æC ³ˆi‰¹tíŽ~Ûfz­Èëaù ê¹ù:˜ôÝ‰ßÆ–›£h¨Áäõ훳o%SŽØ ðï"túèÉÉ´aL€³´„CNF ÉŸë}÷2{·“¼F´ 3Ò /9{m´mï‹÷)Ú¢i: @#ÀÇH½FMÙue0ÊÉ‘"'þ>ùvê7iÂÊöM9’‘Á„?·q«¡#3Ü´[Ŧ›¹&ÞÈÔÙüTPJŽ¢‘WizVûêÉȶQJYÈ´“ö¿cZ!„ç^ÍŸHtZù~ý.ºÍN¤ÛŠ< š°ìŠH⪨)$²>= öqçÊt–ç–’ZXÌâ¤}¼še¢_¸ÑMZÕˆ‹ §~ò^&,!§¤ˆY+°'"’¾@çE¯h_6ÕÀ?‹?½uY¼aæ¦z†S„ÊËŽnXŸf©{™x°„ÜR+­ÛL›ßŽpP)Rö$qñï‡XTàÂËäEˆAMç¾='•ߨQ=üöïel^ƒ# hnëÔÓ¾E(öí»y3¥”œ¢<ÞZq„שÚ.„BQ¹Z;¬Šm8tLíIËjÔbð ç‹þNž^¾—+7”¯t„‡3¨_^ÓCVåûzEñmÏîù;‘IEq ¢ùªo‘€Žø˜‚×åÑ·ž^O¿0=¯e‡rÑ¿BÙ)ÚåÁ¬>VîY´š ááõyãòht®–M™’ÄÕ_ì§Xg¤C“Æ|–`ÆÛXy{¬'•o åzó~Þ ¯O7¯ªêê7æ»NIÜ÷û ^PÞ èØˆÿ+.¨º#B!„hJ)UÙÆÄÄDºtérz%Ú²¸ì“ÍüY^ª9º;ú×'Fn^B!„8oÔüJ W0ßìBŠCF/Ñ…B!Î+µp:X#ÐÏ›Àš/X!„BÔY£B!„ð@…B!<„@!„B$!P!„ÂIB!„ð@…B!<„@!„B$!P!„ÂIB!„ð@…B!<„@!„B$!P!„ÂIB!„ð@…B!<„@!„B$!P!„ÂIB!„ð@…B!<„@!„B$!P!„ÂIB!„ð@…B!<Ðù‹W3vðël´º{R)Û¦ a蜃ØÏU»Î®ÌyŒ¼ëEV×vMvÎyŒ/¯¡0ëOFÝù4ó2]µ]i9EÁ²1 ™¼ ·Ó *Å«;hëϪ“¸²X0ú¦'•žbãÙ™+oŸŒz˜GŸÎsl¤HÕ\³…Bˆ£ uÝ€³c¢ùCÓ˜¤óÂXÅ•lãƒqËèýâ`š™ª¹3›Õ³¦1km:­„bW}ÊÍ-üÐj¢M•Ð…ôã•û`¨n;ϼ&ÌþÞxû™1˜ý0ÌšËÿíàÊbÁ謹õ]žmo©í†ü‡¸³j(Ý÷'«¼ïæW»ãW›“H!„G«ãhçÈ¢™öÃ.lvsKnv=ê•7Ë•ÃÚÏ'òõ®dÒKb¸qÔ“\ÕÀ (!éÓq|°¹[v*º+'ñæm1åAÐAú²™Lÿi76͆Uß”‡¢g„p¹òK¦·…B— «)›€>‘^PšÄ§c&³`o)ëGmÃb£Ï#¸6Ú}¼´ú/VDðЛ/Ò¢È[û ï,ÚFnBW‚tîÚbeÓ”áüØò.þšÄ\…O»Çxù&äüò,Ïo»™)OwÆOWÖ_¼øôR.›<†žA%lûhmÉ"åH$#f¼DgqÓ?·ãâŽK€Þþft:'þþXôgylU!Û¾™Â‡+ò0êl8êõå±'®#΢*fçÿ&3õŸB‚ÃëœKõÖÐÜõ  _NäÛ¤C¤Y£¹á™ô©j\ª*³œ3ƒEo½Ì‚˜¡<7 ‹v¦cVN¹ÐŒ& …BÔ&åÆªU«Üm>kά…jÌà±ja†C)åP©¿ŒRƒ&®Rù.¥TQ¢së=jÊš|åR•:w”ºüʲmÇØÕ¡o‡«'gP¶òG\9‹ÕøaSÕš|—RÊ©r–NP_ªr]J9³þQãw¬¾ŒÅo«q36«Âò2¨Q¿§’JN£™ Õ¸Á#ÕgË÷©Û sÛ¥ì*ùÃÔmƒÆª_”(× eþ¥^ô²Zšã*—‘jð¤5ª â“Š×©WîI%UÏÊûç¾-îÙR—«…[ó”Ó‘¡Ö.\§2ǪæºWMXWüïqqwlm)jÉóÕîb—R®\µxÌ 5~uaÙ~óÕèÁ¯ª•y.¥\ù*qòÝê®IÕ¿k8¹>7Ƕ(Q¹í^õÖê\åT6uàëajÈ;ÛTIÇÈm™ÎL5ÿÙ‡Õ;[3Ô¦#ÕÈOÖ«èBz3òE_æÏûS~H¦ÐOŸÛïæª?ìnÚ`Ô0š˜ã¯¦OŒé„SǺàN\7‡ßÖçÐýâ"ÿU@‡!-ñ­beÈæ¦¥nÛâ¾\cDwúD”ý¹CŸÐj‹Ûckô£ža'³^YŒË¨£p_^Ev`ÏØIV`kùh ùß! ÓÚêÔçþØê|šÒ³e: 8Æû.+.Îb¾(@ÙHþuSÒ{0~b;ü+œñ=“1ÙÉßžâ½#ñì«Í¨õ3ýB!Á~ÿ>šm®jÉÌ9«H‰Jc±óbFÄ›«ÙžJúWe[jZåÇÖ¶çÞž ƒ_K{ÿRÖO|”ïŽ=IËQ~ Xár¸N㈹y¦¦?vÔ sèlæ‹«˜\}OZ•,dî¶~ nã{v×êCéóÜt‚?Í̹iu{Ú¹ÖU!„8…:½;Ø+²‘¹kØšãìdlÚ„5¶5áå©HY°î€…“œí[( '¸ŠØêU¿1¹ËXyØ( 6}ÃŒ‡±^‘í‰Ê][^Ÿ“¬Å“yfúz ~Îë èE”TûFN'é ÆðÐ+“î({Ä`òBç²ãPîÛ➆w•t,ú›_~^‹o¿¾4¨Fp׿3oË™qwlÅ9Øüb‰òÑ¡ò¶°d¯—«lÐ ¡MÊÝʾB®\¶®JæT÷ßžNßÝîw6óEH««ná‘aÝØñþÇ$æÖÀ]Ó:?švŠ¢x޳/M!„¨T®ê‚/â¡ILÿ4ó¼¥>í2´->àr ùÔƒ¦1EsóÈöUÞ-©våÁÁÛykòÓ¬0i”êã¹ahXÙŠJpº+‰iãGð«Aa75ç¦Ç[;ͪ hÅ¥MþÇ›?B€Ÿ®ÁÐÞõ¨|áLO½Kà¦¤é¼øÈ7h…SJÇû£h¸iKUL¸¼»•á?òÈ}áÇÚ`?ð=“¦/'ÛQÈ¡¼l>?‚¯-M¸ó™!´w×?wãr6\…¬ò8CÊï~Õ…ôbäØ;‰sslUüÕôõšÊ«ã6‘@÷ëZ2ã»OYÐì .¯1w÷[ÆÔQOñsX$ ñQ˜Óª^ ÔUql+sÆóåX“4ÌñÖo ¯¼·ˆ¸§ûZ+­òµ0B!j™¦”ªôã&11‘.]ºœËöœg6K^Å]^ååKCÎã/=¢úJ6Oá‰o;òêØžÊÂB!jÉð{…ë?`üŒ-ä—”bˆ»†a=‚%Š †)þjúò6ÏŸKpó;õ@ùê¸BQƒþÛ+B!„âŒÈšB!„’(„Bá$ !„Bx B!„HB B!„òÈèÊœÇÈ»^duq]·äLØ98ç1¾¼†Â¬?uçÓÌˬ_ª¨EÁ²1 ™¼ ëÙS¼š±ƒ&°þ¬ 9‰+‹£azÒ©~_¤.ÇL!„8?ydÔ…ô㕟££w7¤dŒþˆÕù]´ct˜ý½ñö3c0ûa6˜ ,ÿµ\Y,xæ>&Öhºº¸3!„ÂCý¿,úlXÙöÑ8>Ú’EÊ‘HFÌx‰ÎÞNR~Íë{¢ ?²G›îXÍV­?cŸ¹”zÖ¼øÄ\t '/'‡#izÆÕ1&ÀΑE3í‡]Ø .ìæ–Ü2ì>zÔ3V6MÎ-ï áâ¯IÌUø´{Œ—HÀTšÄ§c&³`o)ëGmÃb£Ï#¸6ºªrÓa ðÁÛߌNçÄß?Kµ~¦ÌM;U!Û¾™Â‡+ò0êl8êõå±'®#΢*fçÿ&3õŸB‚ÃëœKõÖÐd®ü’éßm¡ÐeÃjJà¦Ç O¤WùöB6|9‘o“‘fæ†gFÐ?Æ p¾l&ÓÚM³aÕ7寡ƒèa¬F™åœ,zëeÄ å¹ñX´33!„âÂåa!ÐB‹Á™b]Ï„Ç~>a‹N爛¼ô £ß´rû«ƒQ£`É¥ÔÓ 0 çEÏóT 3yKÇ3ê‹uôÝŸœ¥¼7+ƒ~&Ñ'ŽÌ}Žç?YGëQ]ðÓŒ„4ôbû7 é0f2ïĘ8öæî}úVvŽÙÇ}¯=D3Suû aŽ»œë‚Â0xÙèsc¢¼ªÞË•í¦Ž²MÝx|b?âÌù,yi8s¶^Æs|pe-ã³ù&îšü]ý Yýæc,¯F+]ÙËxoæ!zŽ>¡¹d:ïÍßI—{ZḊSÉo?Šñƒ½Iþf$¯ü²‡ËmŽWî >úÖʵ/O¤£Ÿ"wÙk<ûI"mG_„_Žû2Ë*.`ó“ø5è~ž¿)‹væc&„B\È<,ºc 0:“ÙŸ@ü&| vJ  ™Ю¡ ð‰n„9}/YŽîS6Ø™–AeKK!­ÛàûÇ6Òí]ðóÒ0š˜ã¯¦OÅx–ŒÝéQöç}B«µÍ];~Ô3ìdÖ+‹quî+«Ȏì;É lM# 4_â;DaZ[úÖsÈ¿ã±úB/Ê —ß®óiJÏ–è€à컬¸ÊÛ¹;u3³^Å×Îb”)•<˜Ü•©e#ù×ILIïÁø‰íð¯pÆ÷LÆL!„¸I¬@ÓM ºc­âoê q.'.Œ=é—÷4 íØ“õøû]y;m{¾áí¹0øõ±´÷/eýÄGùîØ“¸å§€.‡ëäRÜpóLMì‚Ô±¦áu%#&Þ@äI§lKª*ÓUL®¾'­J2w[?·ñ­±à-„B\häêøjR%Y»¯…“ÜÝ;°†Çb¯ÈvDæ®akް“±iÖØÖ„W'õé èE”œƒUݵÓYœƒÍ/–(*o KöZq¹ÊemBPîVö*på²uU2Õ¹Å+²=Q¹kËës’µx2ÏL_Oa Ò«~br—±ò° Plú† c¯N™ú@Z]u ëÆŽ÷?&1WîB!*S÷ TçýÀ÷Lš¾œlG!‡ò²9øü¾¶4áÎgQ¿Š}u–`X<±³ÓH/çÆ‘íñÓ€à‹xh`ÓÆ?ÍOŒàÚh£ûf¬`ìÈ?iØ9€¬Œt¶péˆ\ÛЪmßLáÃyu6õúòØ×gq‘òãh^ßMø‘8Út'øÀj¶jýûÌ¥ÔÓ;H_6“é?íÆ¦Ù°ê›rãÐAôŒp×EÁÚwxéÓ$J*<ªùvà±qƒª:,>xû›ÑéœøûbÑÝæfÌ*k­ú‡›ñÔ@YÙóÓ›¼5? ¿Ðú4kšÃÒC˜úl,¸©ÏÝñ;Ó9á¦>gú_¼6.‘î/=MŸP'û¿}7Òná•G;âÏÎë ^|b. º†“—“Ñ4 ½‡ ãꘪRßd®ü’éßm¡ÐeÃjJà¦Ç O¤»×_UsÂÝBá–rcÕªUî6ÿ÷%ª1·Ý«ÞZ«œÊ¦|=L yg›*QJ9³ª1ƒÇª…¥”C¥þ2J š¸Jå»”R¶}ê‹'F©_RJ)—*ܵPýµ=_9Ë‹ufü¡F=üžJ*9ݶ Vn-V.åP)?WC¦nU%J)eKQK~˜¯v»”råªÅc©ñ« ËÚõóp5hò•³ëõðë]y[Õ´GÇ«ÄB¥\9‹ÕøaSÕš|—RÊ©r–NP_ªr]59ˆ'²¥.W ·æ)§#C­]¸Ne:Žn¨|Ì*ëZê_¥ã©”+ëoõ qjq¶S)G†Z8îuÇ«ëU±ª¢>wÇOÙœpß?§Ê^þ¦6~¾:°c¶5|†ÚZ䪢îÇS%ª1·Rïo-V.åR9KÆ©!ã——Íù£ –«½¦6W·•sfý£Æ=8îØqÏXü¶7c³*tùœPÊÍBá–Ç­ê|šÒ³e: 8Æû.+.À–²ÔÀδ *[FiÝß?¶‘n1”¶­Kyó•W8н3»_D¯x¿³>—®óiD§F4À?Üû–\?êv2땟Œ: ÷áUdGa Fa2ûá胿фÁN©SaKÙÀîÔÍÌzy_8‹Q¦TòPÕ"Í2Ft§ODÙŸ;ô =¾ÁPù˜•T:Öñ©þU:ž`ÏÚM–sùé@Bûž±˜W–íæ¶>Ü¿3ä¾:‚º=À}›žåùW|¸fì8ZxkUôÏý|Áš¹í–õÁ'ºæô½d9ºãçf<Ïô8ØRÖsÈ¿ã±ãzÉP^¸¤lۙΠÐ*ŸƒB!Üò¸ˆ¦?Þ´7ê¤çjh ùÒúþ7x7}›Ö®fñÔ§ø¹Ï8^º6òì°B[*²íù†·çÂà×ÇÒÞ¿”õå»v;º—îXTy{½¢®dÄĈ¬ö)1EÁºwyy掓N·ç‘ï£Ù™^æfÌÜŽ55Ý?÷ã©”BU˜ š®Â¬pWŸJß«ª®²s\øš­dfÛP±&´*únÆóèöcå;qQ-œáqøwÍ'úïmÕ™B!Θ\A]Î+²‘¹kØšãìdlÚ„5¶5á ô ý°œ¼ ft½r ßՌ쭩؎î¬3 sQRC7%:‹s°ùÅå£CåmaÉ^+.WÕ…{Õï@Lî2V¶Š‚Mß0cÁaìn÷Òðëð(¯OÊÔ ÿ½=á, ¸3·c}–ý³íû‘÷>ZÀá ºOcp# v’\¬À™Ã¦¥(=ú*UÅœ8U;Ý×g'å÷éüä7ˆñ/õ'sæ‡,ËvVÙ¿ª¨’ƒ¬ÝWŒÂIîîXÃã©¥ãàÙž¨ÜµåÇÝIÖâÉ<3}=…ÿßÞ‡GQåûW§;é,B$&Ê"( ¢$pÔ¸àÆ•Ÿz¯sGaî  :‚€ÊAˆ8qßfFD”kDâYDà  ìa $d#éNŸß€ƒh:¹ Y°>¯çÉóäéêSç[U§;Ÿœªî2Õ""R}z‹=É݃A}63sâ2‚ ¥á8ôrÂ- ¸1q¥cÚ¨ù¸\àå`úiäñЪ÷p†^Û”ê^Ÿîns×§3%õâÚ‘Ü»o¼ÿ:‹Úá²í¬¨nüqÀ¿øKÚ¾±( jÃC›Uençì °Ï¬ûº À*«²}¾Ã_³lyW÷½‘„“ *ÞŸÐó¼dú¤,#}Ôc,ˆKà’ ÏÃcU¹¿ŠT6&~©Î@ý•nŸKúâxúOL$:ÜÏw¬eü¬Å´y¼'±Õ/ŽÐhȜɄà`A,w>Ö¥ÛÞaÊKë(ð°+/ŸŸNxX{úîOûjGtwõÝÌ̉ÃùØið†´ç®!—aÕ""R}–1¦Â³*YYY$%%Õe=¿¥;Èxo)9?›6²½°'w]_?áL~Ê”°wÃ×ä·èÊ%Ñ~vÍų¾¡L½§Å¯Ø¯‚+ªIDATÿø¯aÂEÜþÜt­üé""ò뢙ÀÚÒ’›úô«ï*¤2–‹ ü¯xsÌ;øBÀÞ…? »à×EDÄö4("""bCú`ˆˆˆˆˆ )ŠˆˆˆØB ˆˆˆˆ )ŠˆˆˆØB ˆˆˆˆ )ŠˆˆˆØB`ƒg(X9–i)9ûóÎà±¾ãXS|VV+¼ìš=˜>O}EaîgŒ¼w‡ÏÒýÿ¤žyÙùω :€»ûNåëºyUƒÆ ˆÔ…@©UŽ&70éÕ'éöht|/=ñ ß•VþÔšsàŽ #ÌãÆéöàvº‰rëeÔñq¨ .ZÜ9š´§ï£]Mîƒ]ë4E¤~ØìŽ!>ù³Þÿ–B%!í¸kÈý¤Ä^öþ*3çn¥ÌéÇëîÀÝ÷£{S‹œyO0õûó‰Ý¿ßeÉDï\C¶Õ‹ £®Å» ¢e×ÓÔQȦ9Ïòòù¸eøš^ÇàGzÓ:Ô‚‚/˜ðØg´èÚˆÜCÙµ7”ë‡çö!`ŠÙòAéË ‰ŽmJ|tU›ðqpå›ÌúpeV%AsçÐþ\çª~…_0 [,ùG²ÿ@(×>ü0·5 °Ïœ@ ›^Iå•osÉÙÏð7ÆÓõT TKéf^›Æ¢JY?r¡Îf¤<2œÛÏtCÁÚçÿúfŽŸö¨‘ÈàÔþ•¡Â ‹tãp”Eè7}öq0ófÌßNy°…æô:kã\Õ/×Ó4(À1 ÄK¦„ï?œÎ_>ÍÅsm/>ÊŠÝÿIú㉄VwLTë8œÜgôW~p1NÍ"yüRbÊÙñÞž9p7“êB$mŸ?ðþ, 4>«WgeíÎî{Èõ4 4EDj‘ `õêÕŸsÊs—™Ô?¦š%‡|ÆŸ9”9ä¾ñ)ôSž»ÄŒ0áÇeûŒ4ý'¯6Çü>³oþ0Ó?mƒ9ºõ5óÀ¯š­ùÙfæCMVa eƘ²³|î§f[±ßžÉÛßL\Sx¢˜¢,3ö¿˜—³‹ßøLμaf`z¶9nŒ)?ô©ybÀóe¾ßÿ1“•ö{ÓwÚצ¸’íóÍ4N7_ócÊÍÑO›AW˜< ú+Ê2cÛß¼˜]lüÆoŽ.O5'®2Çî³ÓŠ*^g&Ý7ÞdöX€ZŒ1¦üÐ'fä/˜ÍÇM(Û·Ê,ÉÎ7å¾Cfí’uæ°ïÔ‚íæïŒ4 öùŒ1~S¸u‰Yü¯c¦ÜTw¼TrŒYñXòç.5cú§šÌ#寸™%©÷˜{¦¬7Ŧúc˜ê‡ÀÛWnެšnžø©ÙùÝ?ÌÈao˜ì"%ÛWÉk,ÀøüQÁ*3¦ÿŸÍ†âªÖY±³ÿrró+ƒ""µÈV3e9ëÙÙ…Oü›ó›¡Œù͉eÇs6°/ªëËšt¼ŒˆO6qÐÛ…pœDߘ·‡ð¨p"]!„;½”–´Ìé¡©s oOÊÄïrP¸½ˆà"/°Gx+®hŠDƆáýö8~À{h ¹QinA›ÄBÖVeû6°mß7¼ýÔHÞ(/Æ„ì#ßjП往N-N´ ?¿îƒ?ëKÆUá>K¸֊j©®¸dRâNüž˜óïÎ.ïXÊôI“ؙܕ®É=¸¦Õ/Q I¨cÉ›»ÜÈö´ò8 ¨ ¯n‰ûËͪ;&ª+ðö9h|åýôÛø8£'…óR¹$̪dûÜ~U<>=öguCí¼‡XA‘Zd«xBE·J¶~¾Ì²°Nþ²‚N]£ãÀ:cM-+û~3>‚S'Ð9²”õ“âýŸ¬?¨‚‹2 ø}'ÿü>…UŸYopÂ- Ÿ|ñgžNòÖ¬¿SÛ…¿?®Ó­xŸ®µ¢ZªÃP°îyžzó»3NwæÁqýh[ÝëÁ¬:Þ÷ ÏÜÊÆµkÈL”ù)©Œ¿=žj—@Ç(€@cɃù÷Ârœvª=&ª©²íóçÈQ?î)ô Áªdû ðë*Ÿ5¨3 ³ÿ""Rluõqp|gòÖ’}´('73Q³ÖSh 8¾ñy_\æåÐÆ”´ìHl bryñQÊ<-Iw`ò¿eù%øý•ϳ8c.¢q^6Û øóÈ^½‡ª\›|^"ÍóVòåÞ2ÀP°qo,Ú‹·†ý™ã»X»½C9yÛ¾£$¶5Mœµ³Ïp8qøŠ8^å)) OâCLMO'ý´ŸO× ”îbñÜUä7nK·[úð@ß¶ÉÞGÕßöª£²íóxá•Eì=íÁ@cÉÝŠ¨‚-ì)6P~”+vþxüª;&€JÃ/Õ¸?/9ÿ;‹=ý™8¾‡ß|™•GÊ+ݾÊT4>©îq¨ë÷‘Úd«·'GtwõÝÌ̉ÃùØið†´ç®!—aÑ=Ôg33'Ž #ØPÞ‰C/'Ü‚‚jöçns×§3%õâÚ‘Ü»o¼ÿ:‹Ú>BϨŠÛÅ\ÅïoXIúÈG™ß,žvmp¨|ÎÀŠêÆü‹¿¤à‹‹Ò 6Ü1´Y¥ó"•õç†Ì™LøÇÄrçcñT²Ï¼;ÿÉ´Y«8â+dwþvλ¡qï¨t®dæÅÑèR®¿è¦yF­zgèµM©ókåƒWú7¦šË^Σנ„V5ÇKUŽ‘ïð×,[ÅÕ}o$áä‚€cé¼dú¤,#}Ôc,ˆKà’ ÏÃcU¹¿ŠTv~©Î@ý•nŸKúâxúOL$:ÜÏw¬eü¬Å´y¼'±nß.«¬Î Ægé¶w˜òÒ: |ìÊËçÅ'‡Öžþ£ûÓ¾šÇ¡®ßCDDj“eŒ©0]dee‘””T—õH ¥;Èxo)9?›Æ±½°'w]_¥?îÿ'Åk˜0d·?÷CÏöÊå¬0%ìÝð5ù-ºrI´Ÿ]sFñ¬o(SïiqöÇCC£ñ)"Rm¶š <ç…´ä¦>ýê» ih,Aù_ñæ˜wð…€/¼ vÁ¯?ŠˆHh&PDDDĆlõÁ9A!PDDDĆEDDDlH!PDDDĆEDDDlH!°ÞxÙùω :€»ûNåë’³½~CÁʱ LÛHÍV}®ÔY]^vÍLŸ§¾¢0÷3FÞ;‚ŒÃU¹SEuÛ‰ˆˆ4 õÆE‹;G“öô}´«É­Íj]]×é§4o7ÎâO÷>Ä[;ªtƒ³pàŽ #ÌãÆéöàvº‰rŸ|Y˜Rv}šÎÈÁƒ:xƒ†=Ë'»JOÞï5@;‘s€¾,ºœý gô¦ÿâÙ]ñXàÏ]̸+¸1m,WG±iγ¼üE>.G¾¦×1ø‘Þ´µ€6>;Œyî¡Eæ»dåÂ; æ©ûÛ‚ƒ™¯0cþvʃ-|4§×Ð\W“¯êõ²ÿóW™9w+eN?^wî~¸Ý›:ÁV\§)fËi¤/+$:¶)ñÑyTmnÊÇá/ßbÖûßRè/£$¤w ¹Ÿ”øà:¯Ó»g!Ͻ±•¦I‰tŠÝZÅýe(Xûã_ßÌñÓµ"œÚ¿’ðê ´Q8a‘nŽr"#£=y_4ÿÑ/ùûB/½SgÐ=öü8¿³‰kFu&4@;‘sB`ͺßLü‡lÌ¿‚Q~~‘Áö¿%1Ê_GB®dÈähí>ÆòñØ}#O^¸hÒ"˜ÍYBâØ4žk‚ujµÞ=|:w'É#'Ó+ÎAѶe¬Î;Ž?ÎUíiVÿ‘¼ðö!nxz)1°ÿ£'ýÚ::ŽL NîJþúi}ÓÆÐÍSÈšéƒYU¥þVò›»¹zâŸI‰ÃËgñ§[HúŸK ·µ;ûuºÎïŰ1€o/,¢Š§ˆ-<]†ðL—*=ùgmÝ­{Ò»q3œÁe¤Ü™BÂÉì눾†'ÿr Æ{˜=9ÇiܼñÉMÅíDDDÎ6 àˆ¾‚[[Ïfáú£$_UDæâv8qów§‡¦Î-¼=)¿ËAáö"‚‹¼ÀÂÂåváns)§@g —w,eú¤IìLîJ×ä\ÓÆS£óìe9ØÕ•OL-5éxŸlâ 7 «â:½‡¶Õ‘VáX´IL dmUú[ÏîÈ.?öó›¡ŒùMë³¶¸â’I‰;ñ{bJÌK}ìŸÊ˜¿o¢¬ÍŒzâß÷ã ÜNDD¤a³UÄòpÙ­xsöjrY~ÃÛ¸(û~3>‚S'Ð9²”õ“âýŸ4"<ÚóófEÐñ¾gxþàV6®]Cfú£ÌOIeüíñ5عpÆÝü, ˪¬N~ßÉS«¿ÏæZ¨ú3ë·Î_b(X÷ÿü{štK"ÁàÅZÙ’„âÏyí…·™¿p 7sÝ€ßÓ=þŒKDDDÎA–1¦Âùž¬¬,’’’격 ¥;Èxo)9?›‰´½°'w]0$ŠˆˆÈ¯½® ´«–ÜÔ§_}W!""" ˆÍ® P±%…@R±!…@R±!…@R¬7^vþs"Çàî¾Sùºäl¯ßP°r,Ó6R³UŸ+uV——]³Ó穯(ÌýŒ‘÷Ž ãpUî WÝv""" ƒB`½qÑâÎѤ=}íjpÛÚW×uú)ÍÛ͆…³øÓ½ñÖŽ*Þp¹Ú¸#Ãó¸qº=¸n¢Ü§^j ÔNDD¤á³ÑCÊÙ¿àqFoú/žÑþÜÅŒ±‚ÓÆruT›æ<ËË_äãr”ákzƒéMëP (aã³Ã˜×áZd¾KVž!¼Ó`žº¿!ø8˜ù 3æo§<ØÂGsz ȵq5¹›—ýŸ¿Ê̹[)súñº;p÷ÃýèÞÔ ¦°â:M1[>H#}Y!ѱM‰Î£Ò¹)ßn挜ãOSøÏóO ‡2¶½6œ7šã©›øOáì×éݳçÞØJÓ¤D:Ån­âþ2¬}Žñ¯oæøiZ‰ Ní_IxuÚ(œ°H7G9‘‘Q„U¥–ŠÛ‰ˆˆœ lƒhÖýfâ?Ì`cþôˆòsð‹ ´ÿ-‰Qø 8r%C&ß@k÷1–ÆììyòŠpÀE“ÁükÎǦñ\ó¬S«õîáÓ¹;I9™^qж-cuÞqüq®jO³ú¬à…·qÃÓÓH‰ý=Éè×ÖÑqdžuúsWò×OCè›6†nžBÖL̪Ê:sFÓ:¦˜¥¹^Ê#¶’õ]0—^þ]~Îïpj£N×ù½6ðíåƒETñ±…§ËžéR¥'ÿ¬­»uOz7n†3¸Œ”;SH®J-·9Ø(‚#ú nm=›…ë’|U™‹ HØ pzhêÜÂÛ“2ñ»n/"¸È‹,,\nî6·‘rzpÆpyÇR¦OšÄÎä®tMîÁ5m<5:Ï^–³}Q]éÐøÄÔR“Ž—ñÉ&z“ð¸*®Ó{h ¹QinA›ÄBÖVÖ[0M/ ãðî\voý;o/ áÿ]ð;öäGqq³À³™u[gíqÅ%“wâ÷Ä”˜Zo'""ÒØ*by¸ìÖ¼9{59 È,¿ŠámÜ”}?‡Á€©èYÊúÉñþOíùù³"èxß3<p+×®!3ýQ槤2þöøì\ 0gJ™§ áLþ·,ÿ¡ÿ•Uø´gé./ÜE‡^WÑí–¶\»Ç2öQvZ,Û>×> çö?ÜHB. ŽïD|^&ÙGo¢YŒŸC7RÒònbëtÆ\Dã¼ul/üâ IDATxœìÝwtÕßÇñ÷lßôž„H€Ò;H±!ö6Š•ò‚"‚(‚ Š‚ØPÁ‚`ùY(*¢(‚ô ôÞÛ&Ûæù#’M„@ý¾Îñ;;·Íìî‡;swfÿ©"„B!Ü‚¦¶ „B!. B!„nDŸB!„‘ð'„BáF$ü !„B¸ B!„nDŸB!„‘ð'„BáF$ü !„B¸ B!„nDŸB!„‘ð'„BáF$ü !„B¸ B!„nDŸB!„‘ð'„BáF$ü !„B¸ B!„nDŸB!„‘ð'„BáFtµÝqyQŸìYÛM¸¬(ïýUÛMB!j”Ìü !„B¸ B!„nDŸB!„‘ð'„BáF$ü‰*\ôp¥ÿ_!„p ³ÿTk»âò᮫}•÷þ:gß% !„¸ÒÈÌŸ¨’; w ½B!Ü„?Q%wFîp…Bð'ªÁ‚‘;\!„$ü‰jp‡`äWˆÿ6 >f#aF ÚÚnŠÿq5þ Aü9¤=£}•3oÒ–¢»Â‰T*Ù¯ÊrùmP+î4^x/„W@ïÞÒ‘Ü'z¢>~5úÇ2À_ËùvëlÞu¯¢`hsn0ÔP5Èe0*ÝË»ßÉwžþïîGžaÆ’DŠkh)‘eû4Ü?…­–š)ï\.zÀ­Æë£ZçÀeòz¨1Zo¦=ØupSúÖÀ¹oŽeÿ½Ñ4»LÓ;¿œ7‘ëÚ5c×àîä=Ò™”Aݱ<ØŠYq^x×ÔÀ qYÐP/¶!_µõſ⹭5óPÏ&ŒÑÕØ{…ü¶ouè}™Ö¯!&ÐmyIЉ¾­ãøä¦úX˜ÈFû…WaÉJbÈŸ°½ʪiU#]×LxcŒ¨ö"R¶|Ûï¿É·Mßá¡þ)dˆº‰'žtRï"~ U¶Ú÷RºœÏ‹ÅÊú"¶8ý¦ã·cWpçÝü}ä¼hÌ ¾¾ sê–2wÃ.+"Gk¢KúLéÝ–žÛé±>—lùÎ ñŸ§¡^ÃÆ¬»6”pÂi¤ÝƵ›òÈјyôÚ6|Ò@MèØÉkév.ô”¿Ä—}54lصuG}òjö÷‹¦¯GyŽÕšy°g[Òï‰úXgVtò'XçÁ³ýšp­Ñ/j;Í—¶µ'¼üèi,`òßì,¶“STÈ×÷ófº†(“(„FF³ôþ«q>Ùã·Äp‹WY¿ŒõÙ~g=ìÜš¤šñÁÝW³±™±ü²…Bã6íÉîL˜ÙŸÛªhiܸ.§}Âi¦Ãe=SÕ—D5<¼ðôôÄË7„†WßBï\ö-Âzl£žûŽ•_¾ÈÐáó8hu»ã¦ »î¼—Ç&~ΦL8³øcÜ@ž[ž‰Éßÿ½ºžÜüí|ûÍòœeŸsû ¾ùol-.Û÷‡‘ÜyÏ$Ö¨àÌdÙ˜Œ_™Sé ¦¶ƒ€¶â9P׃‡¶Ò×ÓçÝýqŒ¿© »ÚxP–Ÿ5´êÜ‘¤Þ~xÕbAK˸ ”‰üß>½šúâ_¾Å?¦%G®`ìuíÉ~¢w7ah`Ù ™«m§é¸þºË«Ïÿ‰÷‘swµ6»¦Ó¬ ³ë3êÛ­ ڞɆ û2s˜»~'-NÅ¿US^¯¹Ù!jŠÝ©b@¡m»V,ïÆ3}˃€SÅ꬙é\Òðgð‹ä›~lX¹‰ ¹Û˜\Z‡…½‚ S ¤~#fEä1xá:"<ަYCžð.aÚ’½,/ÍeÀÂ]|w/û¹b+ÊcµÕ‡i½ë3 Ž  `Ëgâoûù¶PEëÂç}CIŽßJè§›Ä}ÃiP>ºæÀHFydðÄòƒ¼½ÇB£†~eo¨ýb ¬Û“Kf…úŒuùßÕž,þm#a öòs@>mbÆXE=Ë¿ Fò¬ec†Q¡fÀzt)‹r;1tx?" Ö0kÆJüï™Â's§ó`ØFf¾µœ4Õ="HY½‡|pdð÷º\âú\…O…wvgv%û+Á´hnæèö¬jGvf¡qgÛ +X޲%#„Ž}*ý¸Üîù«Îëa‘!¢Ò×T8ï~?¼½…„Æø®´fn‹Öðû¾ k³“z/‰VùvoñûÒɯC×S—³"Ô§wÚ~Z}¶‰Á'¼xëº(šk«Úv’M.¯>ÿÞGÎyÞùÕÒ­á´ðáøÖýÌÎvœõ7•ô£‡y昖{[øâ[;-¢©œ8¸®ËR9 €BÛÖq¼Y¿<øÙrýÃNÞÊ<ûµp~jöU­÷dÚ=PŸìy꿽¼ñ(¯*&&”ˆ¤C¼rÄB–¥ùŽq8<œ^¦²Ý­½JzÚ úÍßÊ;eS=µNµæòôw;x-ÇÄC=Ú6¤ ÛnjȰz£#iŸy˜q‰Ed”ñ͆CÄû‡Ò½¼_Øó¿&‰Åé%$Kãp@(]Œ ó à><>:a«p054‹ ÅïðaÞN.%-'‹)+ðq¾JDUõ\$U#G&¿ø[ìx…†po´ õµÑH!jRY¼ú·t²Îx¸€~¬¹à5}ÏŸÝÂëKwòQÁéæ…Æ^Å1 ~^ZrrK99ç(±pÌ¡' ~x÷xGóÒÍ]™«°`û&îÈ"¯Fx~}ImÈå£  3zrc³hÞéךÈï7ó•·ÿÈÆìÔ¨üÀ(xhŠYf(û0²—XH.ÿ̱f± (ŠûCôlö¥NêQV—ÂékQ ÞZrÒ­§Þðò3Ó˜“©¡e'õ_¼7è*ƒ‘ÖîϾÄ=ÑzP´˜}ð1–HZï0 `§0=Ÿ¢³öð‡å;;±ÚÃieq  mÃÕ?°:±™kÈm|M=È>Y‘Ãåþ¦èŽDæüEb’•ÃÆÖ êšÈúeHÒ'àhü0u\|8\’{þ\¾>ÎTõëÁõë Î<\æçÆr˜‘ >Áø%äoÛÅêhuhiß$ˆºþ:6 ŠBŒ: ¥Í| 8Rvé¿´¨ˆ¤“YÍ^ÂÎ-Íe}«t›õt —[Ÿ/ÿ÷ïõ‘ÿT•UÁS{Žùz§gHï66¡ŒoÁG/y …¨yZ}cý ¬ø˜âÅíõ½x?3œJ5þT'™…åŸn]‰ÅYþ£’[äÀ?È€(´FuµvRmàí¥'åÀ:mÝOXp0ãú4åkû&:%Ôh ÏKHlK[¥sÕ·'8ª‚½´ˆE[à_¿#ÿ¦gN‘ŒÃûiøKvÙ‡³¢%ÌSK~‘@UUN]¦w–²8ÑÆðFÜâmdÝæÊ„ŸÑÌ5mš³ãÆ0¢ÎÙd'‡gPÝ€‰¾yÌI={ÕŽ“]û2(iÀð:F}üÙ#–G}TŽý«zjNÍ#-í®!<á+¾ßšNQa;x•g^[A¦@GH‡N˜ÿþ‚oRÓ§±çY÷èU±¿ÖŸ¦-tüýóaZ…cömD3í– ¢S—7…_^÷üiªñzP]¼žÎU¦JÒñL2ë6à¯<æ¥×îrP¿°pú:³ø,¥„”b+)ÅV§¤²ØæË=Àï.S›xj4sCÛnµ¥3?§,(ºÚvÚåÕçËÿ}¤ªóîSKø6> GÃ&|gæÌ»[ôXùyåß4\z‚„Ú½ƒAˆ ¥c§–§ƒŸ-—Ñßl QÅ{Ûµà‹XC|Ïå%ýªkÎ îZeâ³^xÖSåàñ$î_‘N²ª¢Ù}€iáq,‡ÓÆ–‡x(¡»CÃÒt#Üׂü/·óu-,ú°¦1p‰–7º4à—V&|iY9|òÇ^Iw`'•þ4óYöäxkHKKaÔoI$8á\_ÇVš—É%Ñ<‘–Âë?·§Ꭰ˜wC'¦˜ìú?ʰã×°7=s3åg¢>¬¼¾aYãkhtŽ›á\ﯧNë&xý@óú^(z#-bLüx¼q¾®òå°Ú÷4'ªóz˜¿«’×Ó¹Ï;k~?ÕçéôTâÏqÞ]::º6õÇzt»*æ1{ Ž9øµ™?Á»!/3™}õ›q¨‡KV:£~=ÊV;øQù¶³o½|úü_xqVþ>|ÑGçܲŽ%rÓ+zw$¡Q _/¦Ð`¦kL(­ÓöÐzEüÄÁÁß[ð^tsžô¨°¸#s]—ÁÚëÂð=zg[©‰S^aöŸ2Y.N¹¼BÐ¥SYÀ½¼f/ÆÌ¨;[ÓqC‹Ê(„Ö©ÃØ–¡ô 2áí´²;9ƒÙ[’ø9ÿÜ·Mñ_¥5yÓÕTÌêÜŠ‹;ÂB|0gçq¸†ÞÆäKžE•.‡/@¾Ø®ôþitzê‡Gð¸G.O¥ºGrÇ>_™TÒR’y&%¹¶"ÄEç()`UÉÙª¤¦×ìòWùm_Q¥+=Á6Ãw~uãØt]›ã³²–/^*îØg!„¨¹ì+ÎPÙ¥Ow€çr¥‡B!„îGfþD•Ü!øIÈBá.$ü‰* FWòÿÝ!à !„ —}ÅY$If…B\idæO!„ÂHøB!„p#þ„B!܈„?!„B7¢¨ªúñññtèС6Ú#„B!."™ùB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈®ÆK´g³û·ïYº~#ËêAPd,­¯½“»®mJ@Í×xŠ#{#Ÿ¾ñ¿% z÷àå†à|o/­µ m=Žy/´Á|ñª¿4J÷ñÁ/ð{>4ý/wò¬v¨9üùüf'qÏ0÷•.x+µÑ‡>ƘE™ûs¦öÂÿ|ÚQ²›w†Ndu±–VÏÏe|[oiEÎì?x~èû$~oÌâᆋZŸBqRÍF1ë1–¼öóvX*¥^½€ÜCIâ×ÌZÒ™éwF^„)G'EYåQ¯ÑP^× _ÅIÁ-Ï0¶« m@ WÄÜŠ>’FŒ¥M©¿†¦ÚnB!þcj.ƒ•`ñÏIè›?Ékcz¤-Ûõ,ÆóƦR’VÇ“~[$áZ@µplÕ>_Ͼc™”˜ƒ¨×¨7?xÝ£Ì(Å›yåá©lwzÒuÄcÔY÷=+¶!GF‹¾ñĽí RRøqÔ0¾L*oËþwt×oŒš7ïŸÞâõ³/û:òØùÃG|¶l G-þ4éu/·z~Ç”ï’Qš?ÇgÛqöE?gæ2Æ>>‡ÃqÃÿÝ}ÙO¬Ù›‰>¢ÝaèÏjo·çÇÑxÕû|µ'†±³†ÑTIfݹ|¿n/G³T¢âèpËà è^El}ëq^]o˜¡|0µ/AÀ²“·›Äšbh0è=¦öÊàÇ7_?ãò¤Zê¢\g2?ŒÎü$êÿ³l€.“¿Å.'D=<›iýBqù’£$HÌœÊU¿Žà¹Ÿ³Áï:¦ÎBCãœÕ9ΨXSãùþ‹oY±ã(ÙƒO8M®¾‡îëI”¹|¶ØžÅæo>bþŠí·øÛñFúœU·Á‘ÇÞ¥óørùv¦ä£øFÒ¬Çù”ϧ?H£ÑW{ØM¼ðѾþì5Äé ›üÌQÛ5‘–\‡k|ŠQ#nÂ?a!ßíw€¹=#?üˆwßÇÏt•#ßA|ŽŠgãkhmœXs ™Û·‘ P¿'íÏN¨*E;«*WGxÛfxœØÆñ¹‰ûÉ+/Ávté¶R’·ŸÀûªvÔÑë¹z Ìcu'Dÿ/ç,Õ=Î%‰?óg`lÍð÷²pÁ×¼ûh4ù;·’fÛ±Ÿù|m` éƒ¯ñÙ× øàùë ­¢ ö”?˜¿*ð Ã°÷X8ÿK>›ÜŸPÀ²é+~9vÆC‰¸•?ZÀÂ9Ïs?€…m«RZ­ñVÿu}öô•Ìšº„T \õè†vð“eøB!.š‹°öVASå”…JñÁx;2à–¦xi¯8ny =K§n¢ôp<‡Šo$ôTÞÑÓꎈóÓ±tiÈÉY¨%EXU¨Þ4‰Jqâxväö«ë”]ª¾–{;ÇËkŠ«Q†Ž–ÜI«= ±Ü0 ‹ÇÿN^ævöf;hà}ú™1ŽfȵAh(åÀœ,z;{—Ì/kƒÕVV¿c?Ž–Ð­U#®iãÁºµÅ$¬;LIÛön* eõ{µ#P œ‘¬$o®ºÜ«c;§_ÉæÒCìN+À¹#4õéÑà8+÷p$'“œCE€ÆêaDƒ©Q7®ý7‰øœªœ;5}Š>{œ¥ä¥ífÃöƒl_YÖw6ªƒì]›Ëf'úðàõ±xjÁ³Í]ÜÕrfìªl®R¥ðÐ’¼;Ñ¿S:@×èV† áP‘–PÏ3OžÆ·÷§E€…f\gâõ%”–â¬Öx[h^ðoêËâÏ™Qj"ïfèu‘Wƽ©B!.[5þ´>aør8šeƒÈ3‹v$s<£§Ö‹:QXr‹P|#8õi§`ÇÈP‹È±8Áëä6f£rêy}µ¯ÓVà¤(« ¬^ï:øžšÑÒáT'üyd<•5uþuñò°”µ÷Tøó ¼ŽWù Ž“¢ìòÅ(ù[Y¶hëYe–’•S‚Š? {·ÆcíZŠvnàxvK6ˆ¦WÛ@þÙãê•‹g,c6'd°+!ûQ„w¤KG+“Ù~ðy©€Ò€Î15x¹ÑYí㬘 Øùí;|¼$ò‹¥hg–uª¯~uñ?yz)&‚ýaW.çæ¤$·ü¸zãur5>Äõ¸ž¸“O+9ù-&“®| ´†Š£^ñ.ÆRXu}Îì {YËÿ´”Åû®chS¹ä+„â⩱ð§mAœ×ÿH+´°í×mä¶èŒß©O0 Ÿ¿ÀÄ? ¨?oÌH°_YÈPóNm…h=€Š5;¹ìò±bÆ×TÓ¿4½ÊE~296¨«°’•”SÍ2 HÉ*E5 öܤòK¨xTl¯‚rê¯L^&À†¦ù³|:±ãéL{F×ÐÆs-kr·²fc>ûm@t/Ú+ì*Õ,×A\ǺpŒã«WcÉï^͈‰KÛc$¬\I‰¨×‰8ŸšŒÌÕ:νî=Þ^’€]ß~ƒïçš¶ðÞù ƒßI8U–‡_ù2œ¼äÚ!ШV²R ÎQ÷é6½ËyA:ÊÎzÕFnJ y60‡DR­nWç8ªäüUu}Aöðl{7—|ÇÂÝ9,ÿøgn|ýê^À¥v!„•šKW¦FÜ|}8–Mo2áÝ_Ør0…ô”ƒlúa&3þ,û€h_¶ãA¢JãùjqE*8 ÷òÓüM”ÔëHŒgMÏ(x5h^vXñzþ’H±ÓAÞ®ù|¥ªËÙÙöÕ÷ìÈuà,>IJù•ÍT…´¡©e³‘ÂZÕG8ÿb{vÙ%JGößÌ{Óf|ÎÆ¬òË–æ†ônã ¤óË ѽÚqÎ쇱šåj lÑŽ tÿZN P·e8>uZ¡@æß»(BÛµ @ à$ÿj–ÿú+ËWï#¯ªÅ´N+%%%gýWŠÍYÝãì ;ñv€ÐöôéÞœHs«­¸”CK@³e 3²–3ÿ÷#Xœrwü;\-OQðjÐ’0€‚õ|¿&›ê¤pß·Lþ £FMfÉ »‹ý+ªÎqtþËúéu÷Íôøæ²}Ž}ÇÜ5YTcý²Bq^jðž?=Ñ·âÁ½ãø|w)É+?aÊʳžRçzžº»!F€Ð^ú…ïàÇäMÌxâ1†jÉN΢0·yЇýNvÖLÃÞmð\½š"‹ DÓ³]Ð9.ùþ»rõamhîó=äÔ¡E´'Ï(š…@B€/-Ú„–Ý»†ô5_ðaùW½DwhŒ¯«¯zÙÿ.O |÷¬Ít8‡ÿ»ª:ÇY‡±a$:²±'}ÅÈûÿ‡A-åäÕP6€!º÷·ýƒY›-ìøt4?uѦ ô‘}¹¯ã/ÌØXÄÖ÷Ÿæ¾5`+‹Wí }C%ÇílÕo½5êË;£X Ñ71°Ã/L‹·°ã‹…ììð$-kü?B!DMÿ¶¯±ýǿË]K»Æ‘ø‘Mé1àfODË“¿¦xrÕ£Ó˜þÔ ´Œ Äì(Åi¤^«öÖ4>ãk^j6ˆ£§1üº¦„y* ÷£A÷‡Þ?¬šÑgÈ=tŠöGïÈÖÜ2f:#:û»LÅÔ¦¾Ác×4%ܳ”äl”€ºÜý,ÓF÷$¸Bº3Çö¦íÉ_m‹îI»sOûý»ruéÔ¤<ÁyƤ}qÑ噚Сî…|™_e ¬ÎqÖàßåIþ¯_Sõ€Á›èƒyyüue_‰R°‰å E¨åÇîÿnlA¤· 4è6ǯ pÝM]ÿo/ÞÛ‰!žhlNô~ui{ë(¦Žì^ɬj%Ý©ÎxŸO}Š/mî¿•ºùòÉ⣧ïBQƒUUÕ³Œ§C‡µÑžZbãÈüŒþ!mËç™ûb[_òÌ­Óg2 ZnÊB!ÄÏEøª—Ë›=}=?-;@‘âGË~7ÑÒO ö ¶o-ûÒgß_÷!„B¸ ·Ë9Z“ž¤? ‹Þò IDAT±:­ù›nm#q$®fÝ@Ûˆ~×Õ“ïYB!ÄËíŸâÓŽ'§Ž%|Á÷ü¹u?«—íAëDt‡¸íÞÛè!—s…Bqå’{þ„B!ÜHÍüåäT÷K’…B!DMó÷÷¯Öój,üU·B!„BQ{jú÷Ó„B!ÄeLŸB!„‘ð'„BáF$ü !„B¸ B!„nDŸB!„‘ð'„BáF$ü !„B¸ B!„nDŸB!„‘ð'„BáFjì·}]qØJ9RäÀ(Þ<”KQ³B!„¨èÌü9Ù»}±_ÅÓø«x}¹‰‘iŽ3žQ˜ÊÓ?mÄïý¿P>XCÃE‰|™ã@J³Ó쫃luœ»ôÿ KF"aw õÃQ”B§y»ùÃV3å !„Â=\‚ð§áª6Íx#èô#vµÂf[Ï.ÙÏÚ ¬~èj²¶br@./=L¼ýâ·N!„Â\‚ðg'~Kã3Áä¡ýÇVka.•ú0¾]0Í=tø{zqOÇFŒ qr¬¤<%ª6VlÜNôœ¿Ð~º…QǬ”M 99pà]?[…òÞ-9ÂoÅ*8‹™²`-·³*û¶Ä£|°oKµ„÷¿]C·}VœÚQšu˜–ßåóõ[‰ü*‘¿í*iIG¸é«5hÞ[IÝŸòSay{>ÿk3¡ü…òázzoÈ!CuÑžŠÔR>þß:î.-ïƒÊ¾-›X’A.êTí¬ß¶‹¦Ÿü…ö“MÜ»«ˆ¢š:DB!„p9ü9ؾu'=âóñ®ß˜t`QÛPºyœ®VïéK7CÏ®8Ì—)%ä;½“ú6â.¯²KóÒøZÍÆ‡»°¢¹“6¤sÔ ÖÜ$î^™K§íÉ|¤ã)Üûg©Š‰>‘Zv·`ÁÎö¤R´Î"–å8ÀZÄÏ&n Óÿ£ó–¬$Þ,æý>u‰+IçÁßÒïК´GÛ1Ý7“¿%sÈ é‡÷3ì„/ßÛ…¤[ëâÜ}€÷sÕÊÛS1ÿ)®mlfÿܲÀè,aI¢•.Mýð/ª¼Î¼äƒÜ±ÉÊÝ};’|W,M“N°K.ù !„â_ºÈáOƒ¯—™ ³®oêÜÜ1–G|O¯öP ~¼{gKžó/᳕[³ŽVK0ë„•“ÙFc dRK_Bõ:Õ ®ÃF¡ªrð`'"ðb´™@³tŠ¢~r2–hˆ‹ö¦øD)Öb~+ôâé §”’——ÍS½½Î±âDçÃä«#¹9Ä@ÎÑ$6ÕgJ¬'Á&OîîÔ€9i¬*ŸTvrl !¡,y 5#|]µ§b% Q¡ÔÏNc])Ø ³YPìËÐ)G*«ÓΖ=™šÄ2¶®™PÆt #LÖj !„â_ºH«}ílÚº—ç-,èÇʆ•?Su:±™|ÚÉ¡À^ZÄÏ»0bÉV’noÏËЙ̄ž¼b¬(”Å6'¹…üýŒ˜Ë7iMf¢´6NXU¼‚‚iRœJ|¶“mºf6ÌçÛìÕæc‹¡á?¯@£3™ רdØÈIJ Ñ'ûËëS)vzpBê7æë‚#¼´x-(ÞÜ×2šI-ü\¶çŒz¼¹Ïó_¥Ûh[FJX=ºUŽUZ§Ÿ"'!‘FŒåe==©£Íû·F!„n®æÂŸ£ˆYñ¹tlŠvÏNz¬ÏÃP/|‚]|­Kzâvb·…°ë®ê) 3zÒ¿uCro`Fª• á ÿ,BƒŸ§–œL+À8JK8îЦWÐ}¸Õë äÖ§Yˆžºyé,-x1D Y•ïkðàÛî%<ôg<ÓŠbêFòUï ±Q¾lÉ£w°VKŸ-¯gÑõaìíò c~/ ­Ü„“ÐÐ:¼Ù7’8‚³YCžMNà¦/ŽP¬ÑÓ¦a>‹3ᡯ¼=–³Ê7úq«éï‡Ö¡“¡ª:: ø®]ü²žUîl[Ÿë‹ ªîˆB!DŠªªêÙÆÇÇÓ¡C‡W’5‹k?ÙÉï奙"³¯_¢dQ‚B!Äe£æfþ |; ÉvPÐŒDJðB!„¸¬Ôàe_?oüj®@!„BQÃdnN!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#WPø³qôûÉŒ>„»¾ÁvKm·çü93—ñìÀ‰l*¾Ø5Ù8¶ði¼ò7…Y¿3ö1,Ët^ìJË©¬ÀÐé;¸ CU¼‰Iƒ¦°µ&·3‹åãždvBé96^ؘ9ó¶ðÉØ'xjä(^øp;EjÍ5[!„¨]m7 æè©wûx¦÷]Ï„‘«k¦HG6›æÏbþæ<4J ÅÎz?>œ»šz£ÔL ç¤ ìë÷Bg¼ˆ•”Õ„ÉÇo:“7& ?Sù¿œY,7š¿ïyç[›/vCþC\ŒY5”þòækñ¾˜'‘BQ‰Ú j!{¾™ÁGëóÐk¬Øƒ{óôÈ[ˆ1+P¸ž‰#—P·c(y99¤¦™é9b7E]o«”ƒÔ¥ãyùà½LÖÔ‚¼1æ7:¿úÝ*ÿà¶ÿ…/Ö‡ñø[ijVÉÛü ï®ÜCn\Gü5vÒ×ÎcöO‰X+m#n>ˆîazÀÂŽ£ø±ÙýÔ[õ5ñ¹*ž­žæ•Á ÉYü<ã÷ÜÅŒ1íñVÀ™õǬáÚéèî_ž9/3gWɩጞûí=N¶ÆNæ†/™ýÝ. V,Æ8î6˜^áÀU[\Ñ`öõÄÃÇ„FãÀÇdz¶:ÐFêÊ™õì:'6S3îñ]‚u®­ZÌþÿMgæ_…„KõæÌ\õ m_NåÛ„ã¤Y"¹í¹Ñô‹ªj\ª*³œ#ƒ•o¿Âò¨á¼pg,få|ǬœêDÑÑIðBQKj粯½€lc'†MÆ´7_áö’%,Ü]~S£ƒÂ4]‡ð̘ ¼p[)‹¾ØBZŶJi ív+Ñ KØ’§N²â—r¼é-´ówÝ}­w8ÁŽƒü½í¹6ðm;˜žèˆ¿ÔÜõÌùÖBÿ§2õõé¼tS >‰'OÐXÏÀÞoV8t:ï¾û.o ŽÃˆ–.×~`;òTÀAúúe¤5éG?0ÓtÈTf¼ö-½ÎLÎìµ¼?ï8ÝŸ{ioÍà¥í¬ùm?EjUmqEÁÓ—[:… 3DÐëö^DªÚœÙkx~}ÆOcÚô7y®ÓA>ý¤ü8¸8¶Î¬µ|ö›‘S^çåñÓ¶$kÕÕ¹ì;€³8…üÖO2ùÍw˜Ø3Å‹RŠëq©ªÌ²‚ ØùÅ4–ú?ʘ;b1+ç?f¨NìKGëïq%Ýo!„â?¦vfþtÞëö3ÿÕU8õ a(²¡  ˜êÒªžðŒ¬)ýYöÎx»Úæb’KñiÅ­í0oM¯w²zY!žh‚G³/šÀž<;ыߖý?$QhŽ¥×}rcœ7¶äm$¦ìdþ+cùÀQŒjL!Ͼz½I)ö&zEϸD¬ hÇ1 ùyk¯.bÕ´Ú ¯*ÚbMÞÊqŸ¶4ó/›f ê6œ»•m+uÙ×åêÃ:Ó+¬ìÏmz¹~ò©¶l#ůý©¶6oׯ{H·uÀ[_ù±µeì'˯9õ=P¼ˆmqsu꫼ïÏFto拈òÁvÀ‚³¼•‹ÑU™* ZIZ:é]˜<µ>ÒÚùŒŽLþœò ï§våù×sѯè !„•¨•ðg=ø ï,!oL¢µO)[§>Åwg=çTr:p¢¯ö¶s3sc˜¾‚ƒ±vVúò\TuöS0E´§ÿ£íéJѾŒ{ãC"f¦©¢`ˆ¸ÑSo#üœ—ý´xxÿs€oZÜØŒy 7’‘Æ*ÇÕŒŽ5U£-P–JÎÕ̪ÚRÓ”¶EQP”ªŽ­ N{ù¥^§ÝYYÎÁÅ3í©™´32´‹q)©ªLg1¹Úî\U²‚%{ú0¤…×…Ýç© ¢× ³ ødó–ãªûêUëÌB!jZ­\}rç`õŽ&ÂSƒš·‹Õ‡,8§ïþRKޱùp1*r÷a !PWõ6W´¡Ý麎÷?ˆ§ÎÍ]®2$9H_>Ç_ý“t{Ù#:£Ó†]C6Då®eà + R°ãæ.?­Ê–(xÄÝ@Û¢?Y¼h3^}zS·)ÀÞšˆÜÍìÎq²VMç¹Ù[)¼ ¶œCx+Âsÿ.o‹Œ;°D7'TçúØê‚⟻›Ã…*8sÙ½1‰s­§ý7}w¹Ÿ‹q©²L­WÝx7OŽèľ>&>·VAk¼iÔ.‚â#YØ/¼4!„â¼ÔÊÌŸ)ö&zfòÚË;‰‹£ó-͘ûݧ,o<’¾~ 1ÀªYLZFzA(·?ÛúÔÊÈʶ•&~Åkn¡À^À±Ü<>xa4žM4~ML€âCËóñL#7·ô©Æ,Ž–ànƒ¹#a6ŸüE§âÐÑöѧiå ylÈ^Þž>†õF…Rm,· ©Þlޱ>};[õ£O>ÊÉj;ú=Óf¯#Û^Èñ¼lŽÍ׿†<ðÜPZtáñ Ìš<š¥:›± w »ªìr±ß´Åg!›g chùjVM`žô1]y|@³&a™A¥Ô³C‡·ÄSÕÕ±­s5öYË̱ϰ($œ¸ØLiUÏýi\õÝÅÕ¸¸*óT“L±w2¢Ï^}%1czT3«òõ.B!j‘¢ªê?>ŠâããéСCm´§ì{Û†-§ÿ»ãøÇ7Œ¸ÚVÕ¾/Æ3Ïç^¹5âJúŽñR²s#¿mËk“ºã'+~…BÔ·XtèÌÝÈì±£˜z OÜ ÁOÔcìMôækÆÄ9ò%ÏB!.½ËoæO!„B\4n1ó'„B!ÊHøB!„p#þ„B!܈„?!„B7"áO!„¸Uøsf.ãÙÙT\Û-96Ž-|š¯üMaÖïŒ}` Ë2kàW'ªE¥`í†NßåBŠ)ÞĤASØzA…œÅ™ÅòqO2;á\¿R›c&„B\žÜ*üiûðêÇ/ÐÖ£–R²‡ÇÍa_u~Ûì &<¼MèLÞ˜t&üÊygËŸ{„©5šª®.ÆL!„pSnò}ÇöÌy™9»²HN gôÜ—hïà ùÇq¼q0’ÐÔýØ[t&àè&v+ý˜ôÜ5[Ö3qäêv %/'‡Ô43=GŒà¦(#`#uåÇÌúáV›©wx„.Á:ÀÂŽ£ø±ÙýÔ[õ5ñ¹*ž­žæ•ÁqKøtÂt–*eëØ=˜u!ô9šþ‘Uý›³¯'>&4>>~˜«õSc.Ú©²ç›|´>½ÆŠ=¸7O¼…³j1ûÿ7™Lx@.Õ›3³“¹áKf·‹B§‹1Ž;† ¦W¸¡|{!Û¾œÊ· ÇI³DrÛs£ée줯Ç쟱*V,ÚFÜ>|ÝÃôÕ(³œ#ƒ•o¿Âò¨á¼pg,få|ÇL!„¸r¹Iø3ÓtÈTfX¶2åéEglÑhÒ—ódÜ[î{mê¸8Rr Á¦áè:žgššÈ[3™±_l¡û¸Îxæ¬áýùô™2^AºäƲ…æc;à­è ¬g`ï7+h3a:ïFOÿ–°1އÇÜÃþ ‡yäõÇil¬nL1}¹Å?ÁJ¯Û{a¨z/g¶‹vÚ È6vbØÔ>ĘòYýÒ(î¾–ÚyâÌZËg¿8ýE:z²é­§YWV:³×òþ¼ãtŸü:½‚ sõlÞÿm?º OÀYœB~ë±LâAÒ7Ïòêâƒ\ûT ¹ë™ó­…þ¯L¥­·JîÚ×yþ“xZŽëŠwŽë2Ë*.`çÓXêÿ(ãïˆÅ¬œÿ˜ !„W27 ®èð‹ôÇhòÆÓϽOR‡ :PLuiUÏŒxFÖÇ”~ˆ,{gôÉÛHñkO3ÿ²©¤Àæ-ðúué¶xô&=¦Ø›èU1ø] }Xgz…•ý¹M¯ jícuÕN½7ÁºýÌuN½†ÂÃEŠl¨€-c?Y~ͩ懲âEl›Œ›«SßVŽû´=U_P·á¼Øíôvg#º7óEDù`;`ÁYÞÎÄ”Ìe,_8ŠQ)äÙÁèªLP­$-ÆŒô.LžÚ Ÿ WvÏgÌ„Bˆ+™„?@ÑžL šSA­âoÞ oNNô=ë—ñåÔ“µxx_\y;­¿á%0äI´ö)eëÔ§øîÔ“TpÚË/õª8íγKqÁÅ3í©MÏÅŠ‚!âFO½ð³.Í–TU¦³˜\mw®*YÁ’=}Ò«Æ·Bq¥‘»ß« –cóábTä&îÃC  á­Ïý›Ý9ÀFÆŽX¢›Z´§Ñ¡±Qr žºj§£8«w4žÔ¼]¬>dÁé,k”.¨!þ¹»9\¨‚3—Ý“¨ÎúCxk"r7—×ç kÕtž›½•Â*’£¡N¢rײá„P)Øñ s—ŸÀV2µ~\uãÝ<9¢û>ø˜ø\YÑ+„BT¦ö'¦.ÛÑï™6{ÙöBŽçeslüh¾67äçQ§Š}5æX5‹I ÒH/åög[ã­]y|@³&a™A¥Ô³C‡·Ä³SNß«¸¦áÿxkØ“øz{Sÿ–Ñ ïÌ­Ep²yÆ0†–¯fÕöàÙIã¢jìMô6Ìäµ—wGç[š1÷»OYÞx$}ë\̓}Ö2sì3, '.6SZÕsš€.<>0Y“G³T§b36áŽaWáUŸ(~ylÈ^Þž>†õF…Rm,· )›guUæ©&)˜bïdDŸ ¼úþJbÆô"Hw!„ÿ ¨ªúOôøøx:tèPí¹¼obÒ°åôw­ÍµÝ!„Bˆ '—}…B!܈Ìü !„B¸™ùB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„?!„B7"áO!„ÂHøB!„p#þ„B!܈„¿Ë–JÁÚ ¾Ë°>gæ2ž8‘MÅ5PØÅP¼‰Iƒ¦°õÒ ®BqÙð'. M`^ýøÚzü‹Jöðá¸9ì+½hͺø®„>!„¸¢éj»—†Ì _2û»]:­XŒqÜ1l0½Â €Ô•3ë‡XuNl¦fÜ=âº+$ÿ8Ž7Fšº{‹ÎÝÄn¥“žë‰mqeÛ®!XSÈžofðÑú<ô+öàÞ<=òbÌ ¬gÒ³¿S¯½/Yé;aæšÑ£é_Ïj1ûÿ7™Lx@.Îjö/}íT1.jeç’ÓÅùy ÁZç„B÷¦žÃÆÏõð–#ë/õåÇ^VWdØUUµ««ÞQ_ž»S-tªª#k…:aȤSÛRUMݨæ;íjÊ¢Qê éÛÔœŸ¨O<ñ±z o·:ë©Éj|¡«mªªZ“ÕÕ?ü¦&;UÕ™«®š0H¼©°¬1Eñê„{‡¨í.Vª]Mþq”:tænµDUUGÆoê¸!¯©òœªêÌWã§?¨œ¶]-®¢ΜUêä3Õ¿óªª:Ôœ5SÔÇ'¯QsP_Q¼:ážA껋U§êTsV¿¬¼NÍw9fU¼E}õÑ—Ôø¢ ¹h‹ªªª#ãWuìï« %êÅW¯N¸÷aõíM¹ªCµªG¿¡}wOÙ¸¸êŸõ°úÅȱê⻪ªNµðÀ õ½ùªãBúàj\*=—\Ÿƒ.Ï !„nÍ-fþ¬É[9îÓ–fþZ‚º çÅneÛJ’·‘â×þÔ¶Àæ-ðúué¶¶x¢Ã/Ò£ÉO?O|ôF¡Øv•àlûÉòkN}O/bÛD`Ü\þm#1e'ó_Ë׎bTc yvð½€úS]ZÕ+ÛÏ3²>¦ôCdÙ;£¯tÌ:àmpÝÖÊÚR4žèÞÌ åƒí€'eãYiÿôA´l^Ê[¯¾ÊÑÎíiß¹+=b½/øþ‰JÇ¥ÒsÉ„«sÐå9!“BáÖÜ"ü•Q+y\ùç6EAQÊÿ¨=ù±®A9«¤Ê¶Y~Ã;K`È“híSÊÖ©OñÝåk+ *8íåaHÅiwVÚê³Ûkˆ¸ÑSo#\{Ö6Û…Õw²_88ÑWx´ò1sÝÖÊÚr>T ¶¼Ç+óöuÙ·5ON|„ÆU]ö­Ð–3›î¢ŠÍ}“÷Ò°có&VÍ|†E½^æ¥þáöbªd\ª:—*=?]B!Üš[,ø0„·&"w3»s€ƒ¬UÓynöV U0„·"<÷ïòm62vìÀݜРø$wç`õŽ&ÂSƒš·‹Õ‡,8UÏoé‚⟻›Ã…*8sÙ½1‰ê¬0ÔiCTîZ6œ°*;¾aîòØ.°>µä›£â 7q–ÐugÌÐèÐØ‹(©öT ‚w›§xcæLfVøï)Õ~.¸ì_é1þøayþéxÞؘìÝ)X«ÙëáyÎrNTupÊï¹t¾ç„Bˆ+Ÿ[ÌüiºðøÀfMÍRŠÍØ„;†]…—tåñ Ìš<†e•RÏV ÞO γ>SìMô6Ìäµ—wGç[š1÷»OYÞx$}ý*ßOt5öYË̱ϰ($œ¸ØLiUÏý)~ylÈ^Þž>†õÆÿoïÎã¨ò5Ž»ÓtB$&È"(8… QÀQãàÎ…+:8*ÌD¸¨,*(ûî@„EÜuÜpCP®ˆ,†E «( Ù×@B6’îô¹‚©Ž $`½ŸçáyòtåTýêœÓÉË©®”ƒÂ†ÜÕ»Á®î;ž3<ÒžcÄ¿ös '–O6äÏ|Û?bÂÔåöç²3û0;÷cFø¥<0°;Í‚¬@9«]ÁŸ.ý‰½¡š×Kýöýè}cM*záÊiq~„V'®ð-& œÛ >.¢mDÂKyþCß²xI×w¾™„R\~-y.õâJ‹ve""òûç0Æœ‘.ÒÓÓINN®Œzä×þļ÷±çŒeá—ÜÂÝ7ÄŸý_êù+Ñk>ížšfáÁ¿]DDD. ¶Xù»à…ÕãÖN]*» ùÐÊŸˆˆˆˆØâ†9NáODDDÄFþDDDDlDáODDDÄFþDDDDlDáODDDÄFþ*œí¦_ïntì<žo Îöþ 9ˆÒ=u=åÛõ…RgYùØ1½'F­"7óK<Пy‡Jó\¹²¶9?(üU87u; &uìƒ4.ÇógÏ½Š®3@aÖNÖÍÊã<Ê;?ë§Ð:ñDV¡Š×ƒËãÅãòå9ñv0…ìøb zö¤wÏôè;‰Ïwb‚µ¹Øà Åì›óƒ7þ™Iý[àu@ sÃú/åæÔ¡\•ÇÆ™“xùëlÜÎ"ü5o¢çcíiî X?©×/t"IDAT/³ï§nÚ Ò³ M{2ê¡Æ„áç@Ú+Lž½âP~êжwwnŒ+σÖ|ìûêUžû8ƒ"WŸ'‘Ž}ºÐª¦ LnÉuš|6˜Ê”ŹDÇÖ$>:‹Ò­Eù9ôÍ;Lýà{rE„5æî^‘ZáuúvÍåù72¨™œDÓØŒRö—!gõó }ÇNyÕQ5‰ž#» ­N«EP%ÒƒÓYLddá'À8ò oÏõÑ~ädZEþϞâ©÷6rÃÀf„[´¹Ø ü…P«ÕmÄ2õÙWÓ:*À¯ç±ÿò{IŠr€?‡Ãa×Òk\x޲dx_¦o¸™AWGnbê†òï™ IšÊóuÂpœÜ­o_|¼–ÆÑ6ÎIޖŬÈ:F Î]æåÔÀá¥L{÷ mÆN ¥ìûtƒ_[C“Éx-ê d.ãŸ_„Ñ9u×xsY9±'ËKu¼eL{s'×þ;)5àÐ’©Lûb3Éÿs«vg¿Nwí¶ôøwóá|Jy)Ø·y/žm^ªo>£­§Á-´¯^ Wh)RH8‘yÑ70è7`|‡ØµçÕëT?ñf)¹ˆˆÈ…ÀáœÑWsGƒéÌ]{„–×å‘¶ ‡¤î‰Tu./5]›ywL·“Ümy„æù0€nOÃ;I95ø¸jpU“B&ŽÃö–-hѲ574ô–ë:zÑžuìjAbõãKI1M®¤êç9àKÆë.¹NßÁÍdF5¡~„Ui˜”@ØêÒo-;#›ÿ|¼ìÍ?žuž+¤Äÿ:)¥Æi[ýìž=’!oo¤¨a>]w©Ú‰ˆˆœßlþpx¹òŽDÞœ¾‚= ûI+¾Ž~ =mÉäO¡Ûø4‹,dí¸GùàCˆˆöžÙQŽª4yðY^8ÁúÕ+I›ò³SF2¼]|9:Õœö¨e‡‡#Xþ—P àô½X(ýwVn¿Æ³æF½ùÃi—}›ñȰ.4*×g]$´ÉëwæñÓüÉü}Â<†»X]â‘ œM>©î JãÛiž·ˆ9³WSµÍM\|b§8ÿEÞz$D81Ùß³äÇR|b®p >^NvõF\s{'î܈ÃöRtÊ·m›Å´Wæ³»”÷.„Æ7%>kŽ>®_OA½&ĺ¬ëtÕ¸”êYØ–k ņ»(,Õñš‘µúÄñŠÉLKeàÔµäId]gÉx“eü”)L9åßä±å ~¾ŸÞ㉞/±>Ï@Hbb«a²sL7õŠˆÈï@ÈðáÇŸþâîÝ»IHH¨„rÎ!W$5²>ãÅ…Qüåá¶4¨rü"®ËMÞòw˜¹ä;6l ãšdX>û;<Í’iàu—±¯Ž6ãÖæ1¿\Ñ qRðí ¦¾õ)‹ÍgÁ†jÜÖå.rý|y¸pË &¿ŸÃ5m¯¥–ëäkï1fÜ?ùtA:[üÄÆÕß°xÉN.n•D-o«mfúK3˜¿p>i™MèÒãfê†;-ë¼46„‚żüê–­Ü‚«¾‹=¹M¸½uV·Ÿ8¸<*ƒé/½ÇÜ/ç±è§ÚÿíV.õ†TxÎ}ó˜0l 3ç.fÝ®}d¬YÎW_m%æšd<@<B"ë‘ÿ¯M{—Ùsç0w](7uû+­âO»ô/""rrcÎXçIOO'99¹2ꑳ©ð'潿ˆ=g¬<:¿äî¾!Þ2ŠˆˆÈï=>ógWaõ¸µS—Ê®BDDDÎ#6ùÌŸˆˆˆˆ€ÂŸˆˆˆˆ­(ü‰ˆˆˆØˆÂŸˆˆˆˆ(ü‰ˆˆˆØˆÂŸˆˆˆˆ(üU8Û?M¿ÞÝèØy<ßœíýr– ¥{êzÊ·ë ¥Î²ò±czO:ZEnæ— x ?ó•æem'""r~Pø«pnêvLêØi\®gÏžk]g€Â¬¬›;•Çx”w~*å3ñỂ'² U¼\/—‡(ÏÉ·ƒU-VíDDDÎ6ø#ÏÅì›óƒ7þ™Iý[àu@ sÃú/åæÔ¡\•ÇÆ™“xùëlÜÎ"ü5o¢çcíiî X?©/³ï§nÚ Ò³ M{2ê¡Æ„áç@Ú+Lž½âP~êжwwnŒ+Ï33|ìûêUžû8ƒ"WŸ'‘Ž}ºÐª¦ LnÉuš|6˜Ê”ŹDÇÖ$>:‹ kQþÌ0çãÏpOí“Ó ˆ-¯õã:ÃusŒÅÿ Î~¾]syþ j&'Ñ46£”ýeÈYý<Ã_ßıS^uTM¢çÈ®AB«“ðjT‰ôàtExHij)¹ˆˆÈ…Àá/„Z­n#þ“y¬Ï¾šÖQ|=ý—ßKR”ü9»–^ãÚÐÀs”%Ãû2}ÃÍ º:pS7”Ï\HÒÐTž¯sʳ]}»øâãí´0޶qNò¶,fEÖ1qî2/§/eÚ»i3v)5`ß§ƒüÚš HÆkQg sÿü"ŒÎ©C¸Æ›Ëʉ=Yì`®hÔÈgQ¦âª¤ÿÊW×`[Wµ<‡sQ§»v[úü»ùp>¥¼ìÀÛ¼Ï6/Õ7ŸÑÖÓàÚW¯…+´ˆ”)$„–¦–’Û‰ˆˆ\lþÀ}5w4˜ÎܵGhy]i rHêžHUàòRÓµ™wǤp;ÉÝ–Ghž8pàö¸ñ4¼“”Sƒ€«W5)dâ˜1loÙ‚-[sCCo¹®£íYÇÞ¨$V?¾”ÓäJª~¾‘¾d¼î’ëôÜLfTêG8ÀQ•†I „­v´Pj^R…C;3Ù™ñ6ï. ã¿/¾]ÙQ\VËzõ²bë.¢mDÂOùÿ¡oY¼$Šë;ÿ'ünyg^ZCŽ?‡YÙ¼8¨U.§ëà®\Ýš6ñÜèþÌ 5F4¥{靖p€±ªó¢ëøk›eLð³kÅÓ¸ažý¥Xû‹i@Tæ'˜û.#2º€¦æ%¶'$á¨ø:‹÷Í#uÂgì.òqdïAÏ+vV[;u©ì*DDDä<¢¿N+"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# å84';ce~%‘¿’]Dz¶ kø™Ó{ÒiÔ*r3¿dÀý™w(pVö|^ôõy¥|}}Vû󼚃ÍÇöFÓ¯w7:vÏ·¶ì¹(ü•“3¦ c^Dó*•]Éù‰'² U¼\/—‡(ωiV¸…·ôà¡ÿù3÷Üóºt{„svã/ížÏ›¾ö³ë£'èØñI>ÝW|îwl#/=ý ?ž¾Á¢¯KáüéO %žû9jW&nêvLêØiö›Vh""ǹ*»€ arÙ8s/ÛY„¿æMô|¬= €Ÿi¯0yö6ŠCø©CÛÞݹ1Îd[_É+ßg²g_<ýÞN‹“¿DM[?™È?¾ÈÄ[ã"]v„¥;ïaÊSI„ç|͈'¿¤n‹jd<ÀŽÝáü©_?ÚÕµø­áßÉÌ“q>þ ÷Ô>9dEly­oÔƨֹ¬{gïoÚÉþ‚ÚÜ5°më„?‡eo2õ“-9Š(¹Œ½»rý‰sX?©/³ï§nÚ Ò³ M{2ê¡Æ„Y¶³â$¼ZU"=8ÅDFFrbSXCþú÷¹wóK<öBužžÐ‘‹ÞŸCß¼ÃÔ¾'7PDAXcîîõ)ñ¡Ö}mÕŸVã`9'‚(ÚÁÂeUéÐÎOÚW»¹õÞ:¸ƒ»UZCá&^šÊü Y;`#á®Z¤<ÖvµÝÖ}m©ŒýTIsÐǾ¯^å¹3(rðy騧 ­jº°|Yž»Ëv%ƒ“=³žfüÖÚÄîÛŒÿÊ–Do_ÉG[F ü5 ¾fØcŸrñ5±d9¾ýáÜØ§wÖ Ò/Vó¬Luû¹$"R æW¬X±â×^¾pí1K>þÂlÉÈ2iC»šÑ+sOlÛfÞ~l€™³×oŒ ˜ÜŒ…fÁ¿šâ`ÛNÊ_cÆ<8ܤçýç¥@æ"3¤ëH“v¸ØÿA³päýæþgÖš|cŒÉK7CÿÒͼ¼!ߌßì™Õ×tŸ²Á³<\³jìÃfº|ã?²Ñ,ÿf‹9êÏ2iC5/üû؉}þÍüce–)6EfûŒ>¦ûóÍ1cLàHšÝgŠYu4`Œ)6G–Ž5=F/5YcŒñ™]ö1é:ÂÌÙ~ÌN9¢u» ݽw¹Y¸!ÛûšÕ טCþ_n?ö˦GŸfGÑ^+Î\lFþïH³ð ßã7Ó&›‘o|grO=Þ¯ôµUZŽƒÕœ"ÿûLŸ1KMæÁføã¯›Œƒgu<Ëþ 2'Š~n<<Ílú•I¬¯­Oä·õ§%‹9Xœ¹Ð í6âç±Ý;g€é:n…90AßcVçn¥¤v%ƒßìÝ×tM]gŽd¼f~øU“‘½Á<÷èh“ž{âüîíj^Üo&`Ž,iº^~üNÊYn†tý»Y—ÊkAæÙo¯3xŸ‰ˆc•?——š®Í¼;&€ÛIî¶W×ÇDÆVÁ÷ý1¬?©JÍKªphg&;3ÞæÝ…aü÷Å÷±+;ŠËj¹Oìó2®O¬†ˆ®‰/£€P´g[ö~Ç»£0 8¶—l?Ts;p{ÜxÞIJ0N]ó²ng}þ¤Äÿ:)¥FÞ:y¼µìŒlNbõãKW5þØ›!,UÓûÓr¬æ„ÕÁL>ßD[;S=ÆO›˜O˜—Q@Ã+Â-gÙŸçLYú:˜²Öb5÷Fµøylcš\IÕÏ7rÀ—Œ×]¶÷XYYC(.¢jW'Ìã%"*‚Hw.…Å\àð\LÓºÇû%¢v}<~$Ó߯Õû¡ŒóÌr¾”ñç’ˆÈI¶E[g2ùSè6~Í" Y;îQ>8¹ÑQ•&>Ë 2X¿z%iSž`vÊH†·‹ÇeµÍâxÆÌ)?ÚÎÓ~Ì;B~ãj71—Ä¿|éGc¹»}ék¶p,P›k#œPüË}þâh¡ ·ÓoÜ]Äÿê%Á"¢½gžOÐvç‚)[³úÓj,ç„U…YkùlÍvl@O'ç¢àÿ6ð×Ä« µw«þô•|•¢¬µ”4qpÆØ:8X¿ÿÊRCÐK‡böŽ“gàüùN­üçó  øeÖ²Î3ë÷_÷™ˆüîœ7¿oÎ¥âü#yë‘áÄdÏ’ N¬eî`ÁÇËɮވknïÄÃqxÃ^Š‚m³àŽ®OTÎfvå(>Âú¥Û)ïç¹CcëãÎX̪ˆV$%%Q´h1û£.£Vhv%Q'kßì. 9ëgòÆüÝø‚¯ŒíÊ*4¾ Y«Ùp¤(&3-•S×’[Æ<Öã`9'JTÌÁo>ç@ë!L6•©S§2mJ_þ°õÿX—m,W®þtºpúó8vvnš®p¡ñM‰ÏZubl}\¿ž‚zMˆuü=äÜ‹¶ÍbÚ+óÙ}zG–Ю<ã`Ží`õ¶| Ådmù‚ØÄI[AçYYê,ãÏ%‘“lñEOÃ;¹)t ÏŒüŽ„¸Æ´lŸÈ¼ÎüFqËEÕ‰+|‹ gãvƒ‹hÛ#‘p€Ð’·ù¶Ä„©Ë9ìÏegöav îÇŒðKy``wšÅ´¤SÊb¦ |’9q üá’‹ðì)ÅÜ1 ˆÊüsßeDFÐÔ¼Äö„"‚ìÖu ÿÛíßü#µ?_‡9( iÈ]½k]³(k;K…[xkh*iû2ÉÊ aè#‹©×nƒþ+Wt+ztÞÄs£ûñ™Ëà »œ»{]AUG¾¶X•tZŒƒåœˆ/ámáßÃW󳸲{<'û©j"m¼Ê‡+Ñê–’WžþtV»‚?]ú!{=B5¯—úíûÑûÆš”uA¶¬ýYVÎèÖôè´‰çF÷g^¨¡0¢)Ý{_u|îZ¼Ç ø¹û}Ëâ%Q\ßùfNéÌÛ•g£!í9Fük?rbéðd3¼(Üòϼ´†;²²yqP?"ª\N×Á]idž•©Î }&"ŒÃsÆÚJzz:ÉÉÉ•QÏïƒ)`÷ºoɮۂ?DØ1s “ü½Ýò…'ùm*z4î¿_ù+Ñk>ížšfJY"r³ÅÊ_…s¸ É^Å›CÞÃþˆæü­ïÅ ­¢ÇAã.""­ü‰ˆˆˆØˆ-nø‘ãþDDDDlDáODDDÄFþDDDDlDáODDDÄFþDDDDl¤RþÎ_qæR¦¦~ÌÙùT½®OÝ×8è“*DDDD¤ü*eå/$æ:z{–‰#ï¢xé"vê¡”""""¢R/û:BÃqSÌeZDDDDÎ‰Ê ./Õ{Øz°HPDDD¤Tî UšÐ¥s f=Þƒ‰«sEDDDαJ¹áãg…[ùð_{h3v*÷^Žîù9·*uåÏ`g WÖQð©•üwþŽ_èUð©•þÇŽRŽ[éODDD¤BTÊgþ‡—1mâ,¶) Æmý©ZUˆˆˆˆØÃsÆM¶ééé$''WF=""""réÙ¾""""6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b# """"6¢ð'"""b#ÿ[pÇŒ¦¸IEND®B`‚2411_assign_agent_based_service.png000066400000000000000000001361501516513262500336030ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/24-agents‰PNG  IHDRÂ`[¢BbKGDÿÿÿ ½§“ pHYs  šœtIMEà /7\£\9 IDATxÚìÝwxÕâÆñïîfÓ{oH„„ºR¥ˆˆˆŠˆŠX(êõ^Ëõ‚]TìzU,ׂØ+¢éMz%¡$!!!½—Ýùý‘"àOAÊûyŸÇìΞ3sf†}çÌ™³¦/¿üÒ@DDDDäã0"/D­ """"—³š@DDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDäÂæðG6Æ÷P‹ýA¦w–ªDDDDÎCêaaaaaaaaaaaa‘³ÆáœÕd+dׂ/ùröZvgQíìKƒæ]¸fÄõ\ÞØ ÓY¨²:í;þõÏoðú×T&uõ8+uü=¬ÜpmW¾ 9þÕʲ&îãÞ GØgûëkuôiÄö›‘µ`%ÝwWa\”—†®<:<žñ©‰þµˆ²zoYÜBXs[4©3W1¼¸ÁÅß‚ÉÁ™~-rS?:ù8âj¯b_v>ß'äÕÝÅä©ÁDDÀâÂÐXw³Ù{BvqpõaLƒ*>M*¦è•˜1‰'¾*!~øhþÓ"‡¢T6Ïý‚·;@åkÑ7Èò×g÷¦ô4—0Ç‹(ד½—>Ë (Ì+MÃÃx¥} fÚ7Ð~}1åõµLE!'¤R”g¿äƒß·…Ù…ߨÛ×Ñ~[9Õ—@Û8zòÎàXîð‚¬ìfî*§ÈâH\Xö d|³úÏ;ȺJýû/"r©‡à[û´aZ”#G“è2?ƒÝ¶ºìÇÛ×¶dŒ—\73hsÑY Ãç&W¤0{Ö>‡½ÆýÃb )—µjHõý˜±87EÔ¾þaï8®wÑ?öŠR6.¤ öïÕ‡ ÉèÌŒf4ÙT̶¿¸WØVšË +suâª-~—ÉÉ›W®‰å·Bž›¹ƒgR+8šwM´oÃìî‘,¾²Šs2ØoW›‰ˆ\šÌ´j×’iQŽø7nÆê+¡Ëü RœêBpÍr—wnÅÛGÖ2*µú/ïˆ;7c„*Ê«Ó «ïÔ˜Á<ÆØ.~Ôõ¥)Ì›2‘q· cØõ·ñÏÉ_²áHm?ZéF&ÝòÓ·¯äƒÿŒæö—0÷‰¹é¹µ-º’½ŸŒaؽ_s°`#“FÜÍG{j¾Š«läËçîçö‡qý-÷2éóuÔ}Êz/œhLQ¥ÌM€£óïìÀ„°@ÞÖ•ì¾xfGÆõjËþ»z`ŒëFâÀÆ\ín“#· ¹‚²Aø×;DÚwíŒqscZºø1ÿîμXsØün9fÞƒôn¸Ô¤#îÖcLK;Õ”êÙà2 Ç·cŒûÚWïX¿-Ì4kÚ„%#»c߃ŠQíø´…;îWÞ‘}ÌÄuïDÅ`?¼G7_žØÌ1=°ßÕ‰µ½ÃèàT¯ÜãöYzt¡òºm* ={w¥bhá¦óëµØ–M¹Ï³‚÷foå‰ú!À¨föDz­.Â¥a/6°^œwjDDäŒ2Ëö„d&9– ý7cõUMùzh]®q0)™GÓ«ÏÊÝès„Ó»³™ß=Ä}OÀO+vVX…¾M[Ó2½fEª1ûÙGù4½)7<ü/déî2Úµv¥*mkòrU—`Ȭ‹Áoû‘¥%m¸÷¾atö6Ü[ÁÿR‘·oë©ëu:/ sX ŽŒ=þµÂŒ Y•t¸3U»¶sÕú*—Àhô+âž/ö2­Ä Ù˜kÐáÖhÆìçöÔLV[¢¹5ÈY«qö ä:×bþ»§ŒÊšþ]\üCOYθyäÄùïœJš›/qUy|^ìÅå¡NX³ìt w$í@.ÎÓ[ã!-ÚRØâdïØ8xÂ+Ž®î40JyiG Š 8\Ê¡OªË ì†0ìÕx…4àv×Bþõã^¦Õ´[B¹ ݇†s‹wOÿvŸaÍdVE£Â­LKªÄ#(„æ|ƤVr^5ŸÅ™öp0¥ˆì“t>>Ä:[H-W?ú…V“TPÌÖ;¹”ðéš8þã|wÓ];èº4›ô³øewîf°xÓ{$1½GbT‘ž¸Ž¥¿üĬckÖd^¾5š²Ôdr*wóî=#ù_][ÕTVÛ1ò*17š´::žØäÝŠÞM«™º|/e­cÈ\¹š‚Æ×Ð)ÀBMЍæHr:ÕAWéQW°•ðAð yK¾?u½8Ÿ·pë=,‡aPXRÊîÛñdÙ«Y›^~´)¼}= wðäÑÝy·.y˜L¸˜M˜\͹|”iæõ¦x, ::€ #©üPdÔ;ZL§-§ì`6+l±\ãge•·7>¹©||Ø™¡øï´3È«š…ËËþòúþ*y{“²¥äØ!˜]üùd`Øo–-ÉJgjAÝÚ‰;÷d3ë`?î;ÂÎ ã„{.&‚ü\q)Îfe½žð’Ü\l!tô0Cño÷UÅL;`cnŒÉ9´õÅ!}‹ËηV« ýæßé9ƒ*‹7¯\I'3@ßô1sÍ÷É$è»@Dä’evpÀßñ·ßΜí”ç$WîŸÁ»?V3hü0¢œÀäàAx«ÞŒlÕøÿÁÄe‹8pc4v³gOþ=y‘ŽÇ7wLÕ€É ·úeò¦e¯h*>[Áþ"6®.$jXüN˜„°`6Ÿt,ˆqºzÏÛ«¨ã–;yö°‘_},t™M&le™ ù!…M' ®¬¬Â0`áÎ"ܺÒÚ¹Š«¢¬lØxä7·$N[Nu1ßf›x9ƒŽÞÎ>´¶T°®è÷ïýggòKµ'¶kHo{ïeVŸC ìe|›X ~¼åô»WÙGR÷Ð{n cJäÃM!"r)‡à)'„à»÷óný1Ú±ª_Í,ggÎIvíͰvÕüúÂD^ùr>+7neëÆ•Ìýô%^˜UHóÁý‰p§¨ôKãëW>`þ–d’6.àÓWßbA¶?á¿¿ª&ŸVôŽ*dñÔ9ä7ïGœ—é7aÅ«õ5t±®ç½·~`í®’×Mç½O7cDÇÚôÿWï…¨$+wòÜx¦Æ6ô¤K£P^éÃÝ$Ö>h/Íã£,+£»†tè Jÿ?åd:ÂÏú:•0¿ÀŽQYĬB'®jäDÒžBr.’kŒ ³c:ÆðV\=½Ø,”›¼ ö©¤°&|¼ÝˆrµPœ‘Ê'¥ž¼Þ/Š[Ã<éÎW†˜™Æ´¼S„ª">9`о©'eû2X{^^DìÞ‘Äs¹ íÛš©±îx׿yãàLw¼MSò~¶Mã‚ED.YfšÇ6âîz³Cعƒ®‹ösïO[x.»~nÌÃ!gåý¹#lñãò_ÅsÎW|7ÿ+Þž^D•Å ÿ±ô¼2Cº…ÕŒùµFpÝ3ÏàøÁÇ|ÿÒ"rm4ìpïH¨ð{_þ&oZõŽÆ´k?qýZâq’–2y´eÜäñù»_ñÎã_SêL«+ä?×6ÄjåÔõ^LlÅ<;c ¥—GóxÿBÍUlÛw€«~M#¹.‡•,ØY„=ÄùÛó8òÿ,§²(—¹Å‰)Ë!¡²¦Ü_SËÁÏÎôôJlEƒäÜÍuë›òß¶±,él¢ª¼„¹ ;¸g{Uv ‹÷äóÏö-Y羕¿äòÀômä_ÉËW‡h«`}Ênº­Hgï);GmlLÎ¥°™7ß%ÕŒ ?[£ªˆ§~ÞŠu` þÝ£=#;•°"«œ‹#­BKѳh'Ë“ì5 å¹GéT÷îp®þùIü4Y¬Z‘ÆM‘‘XµoDDDDäBÂöÒ\Škÿßä߈€ã:|­„õ¼‘AI³8XiÂÍÓŒa²æù1¼²¹ p¡Ëãïó@œkíòå$¾5–'– }õ¿Œˆ°‚QAæ¦Ù|3} Ûög_aÅ#0Œ¦¯âú¡—ía{ þ3†÷Sêê®`í¤[>’·^BˆÅFá®|;c9[“S8TäD`ãhb;䆫ÛèX;f£jŸÞ÷0?¯å¹ƒX8ukweRæÞŽƒGs×àHr–|Îsדx ÿ&tr;·]Ù÷ÿÇ@h[Q2Kø‰e[÷²/õ®4lMë^C¸¶{$nõË´—°ÕO|ûó v¦fQTeÁÅ'˜È¶}:¬?­¬Ô}R•µ–o§ýÈÊ­{ɱ†Ñ¼ý• ëh×Ù!""" –ÙÕ`€±ã^›VÈ ^]ˆkè‰`òˆã–‡ãê}Âಾ­pܼ‘JÊØ¶b?åq±8TbÝöÚXÔn¡V ŠôY“xpÚ.ªÅ;вö³qæ6þº•‡_¹Ž^f\ýqOÍ¢¸ªv1güݰ`'ý{<òârŽ–QMVJY) ¬Þ:ŠDø‰]ÕG–ðò„|òërcñAÖ|ù4¶„‘˜vt}ªŽ$³äç)t{“Gºûþ¡‡mGVðæÞ`e~½K²Ø¿#‹ý;V±*q“Ç´ÃË\s¡°çëGùÏô´ú%P–—ÎŽEÓØ±n¼ñO:xÕDáŠ?óü£Ÿ²£¼vѲ4¶/þ˜ëÝ0t~ˆˆˆÈEìœLÒ`òjÅ Nu=ºEl›õ!“͈ÛÿÁÄçßäãï±å`!ÕG“— ÷Ë®¤Míð‰¢„5¤UÖFÓ¬ÍlªMªÁÝ»bÊ“™þ}mviÁ±ÿæ‰ÇæŽ> k60ÿW¦Í9H•ɇ®¼Í+·GÖÖãDLJßáÝÇúP±ÏÞ© Ánmþð³¼ôüFuõ¯ Œ;¦ñ΢,l'nœ=Ÿ‚Àx®¾iƒÛû ò‰iØB:2øÆëèë]ûz9gm$÷t¶ù¬yÿ£!ةɕÜzÏ?7¢ -5¯e-z‹iÛJ0£p3_ý\‚Ý[3tì<ôÑ Žó¨mÌUÌÜVXrmÌ›r,{¶ìψQ7sUkŒ¢"""rQ;7O‰™¼ˆ¿÷ôf&RX—!‹‘¼éÉ›–3çëwq¿l(÷ß#m|-˜\cèÓÖ…µ«Ë wë2n!:ÂBÞöµª‰Átï‚0J“^—Û[Ò©s{¢ÝÌ´Š ÁÎì*1pvµsªüYºëÖXhy÷=\×ÑÙÀ…ÔmO°¨Ð yî*÷BèqŸŒæÎ'¤_€Êš7öi~-LÍóäƒôñ7àTŽyš¥@ñJlà†— ö¼ÌÚ\{à?ˆ'ŸESg€®tŠ4¸÷ÙeQÌêÙ‰Ü×§ÒR|.»ŒËª 0ŽájzŸÛìcIŠ0(:ˆP`@Wž¸—ÿ%ix„ˆˆˆ(ÿù,ìJçÛž¡ÓM¹ìÛº‰-;’ؽ{ÛvePwW¾xÇtžŇ·' ÈâF³>íp]½‚R²X»1‹º“´zÍÂ!—Ó%´fœ‚É%P7ØSøŠÿÜ6ƒÐËÚÓ!>žø¡cèrš®ï*Žì:@6¶¿ÿw~\;ŠÖ°QZ—Ü3¶‘^>„Ðúcœ}›åUÛ5kqÅÓ (üšée>úº—3P lÀAeÆöÚࡽûé|´EqkÞÎÞ˘ŸU©IdUu qpoî}¼7ØËÈNÙÉŠ9‹HIÙCâúW²AYêv2kÿŠÔº£Á@çA—ñaÒ6…EDDDAø¯ ÄŽ¾D¶ïCdû>ØK±mùt>øp)™€‘¼”­ùýèëgƵioÚ»­`y ¤¯J §O0«vÛksp—cÁÍ¥9·>pùS~`k.@‡vüÊO;~å§©àswÿc$o. ;eeÇ"bi!'[ÌVBa…õƒ°ÙËÉæ=6;`ù ÚË(/:z¡àè~|™îºù@yåvÀ¨ mÙǼñá"ö—×oøßnsùÑmvÁÏǹÞ"&½ýqƒ³ˆˆˆˆ‚ðR’0…'?H¤Ì°ÒpÈêt4Й]C‰ë?Š‘k—óÊ6;PFA™0ƒKúÄ{°|Iì_Á†­!ì¬åŠÎÁõVÞ‚wÜM<ñÞ2×±råJV®ÞÄÁÚgêŠvÍæµ×‚™òÜOšNÍ8ºÔ¥[¿ô·Fžb·ªsxáàì35ÌÅÙÅØð>¶ÝÕÅd×MÇá䓪þÈKo/ªéEhà«{Ó±U áÅ_qÿc‹ŽK3NuÝËåäæW`P† ª s)Õù!"""±sò°œƒ‹•üÌÃ>œÆúg³³äøáFy&{²jo›¼ v¯K«ÎDõîˆÉ|ÿåššÊÐ+è|ôG0 JvÍàƒwÞá÷¿a›wg®3‘צ~Á{OßJ›ÚgôŒ[9TùÛu3j¯ü›×6F»R Ž 0ªÈÛ·“ÄÄD“QzާRp nqtLò¡… ÙWqlÍ‹ç}ˆÎ¡A3län[W;”Â….ã`ÔÀN4w§hWr½ `µAskËÚ5{%‡ë¦¸°å°vööß>("""r9'=ÂNúÐ#h>3Ysxj|]®hCãWì…é$®\LBVmðkÝ—Ë<ݤwjÜ‹NÞ ™—EY5)0¬G'‚Ž:‹=••‹—Q ,I*¢øšNDú™)JË¢°®÷Öߺ|m2ו_AöÁlÊ[4Àý²~Ä9î`s¥Aò´·ùÖåÚùU™¸˜/¾\ÍÀ±Í?ygb(®çòJŧ-Wµ¶òÆ–*82‹§ž®bx¿XÜr63ë›åµó3»ÓeP ÜM&*¬uelþîæä5Á)k-?~ú›²­aÝéö#ߤƒ±çc}>“Aí|)H˜Ã¬DÅ`Qþó3ìá[Ù÷ä§$”%{Y5g/«N\.ð îÓóq)šž]|™7'·ö…pzt >nÅ›cxËÕ|¸­#m_LYvBÁš^ÝŸG3®Áa¸±—`ß´¹h$o½:ˆ»îhÇCïn¤´l;ß¿¾ïëЃ{ÇtÆÛtŽ÷Ù‡Îcdzö?ÿeu>T$ÏcZò¼ã ¾ò~FµtÃøÄõ&Æò!»lP–8‹k›18kæaª€ò‚rl€ÅÚ€AㇰòѤ[çðÅÖº&³€MaXDDD.^æsS çFƒyìo3qdOZE†âëRSµÕ#€ð¦4öY>xó>ºúŸ8ˆ×‘ˆݨ›¡—ðt :a‡úM|“§ïHÛFx:Õ¤U‹‹7¡Í{0ò‘×ybPØÑŸmvi>’{5Ç×zü5A`ï‡xíÑ›éѪn&À‚›$‡ÞÇ‹/§‹¿åoÙIÿîüóµç30ž˜¾8&·]Ö•kï…—îjƒgÝÁ}yèÑtjèp nFכ筧n¤Ií2GæGB‘˜pi6‚IÏßIï“{(1ÝG2áÁ+j‡¤ˆˆˆˆ\œL†qfóy­[·Žøøø¿e%üe>>ç_þ£+%""""r¶ih„ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆœ碒ªŠ2’ŠmØO•ÈœhâeÅIûDDDDD.Š \•ÇÍŸ&ð]˜­ø[LÇ¿oØÈ*·ŽŒ»®#ïY´WNÂ^]Ir~%fW¢\-¨•DDDDÎ÷ lØÈ®på©A­å~B¶•òÊO ¼Yl#·úôÅÙÊ ùßÚ}üwO>InnnôlÁ‹í‰µÙ\þÉ^:_Ï‹þÁÈ£Š›wqÓšÒ0Ñ¥k–Ä¹âø›e+™úÃ*Fg¿‹z1(¶“š{àmú ÖébkcQ>»Jybúžø%ØJ0æûí|d÷åö1¼ìc!÷ÈÞXŸH§<;ÛûÓð¢Ú=ûw&ÒwMå.Þ<Э OFŸ$×c Žf~WOÜ€ÒÒRÖîOãÉ¥›X]ÚŽåíÝqÕq/"""r.ƒðic.kvç“âGðI;«Y¸*‰ŒfÝД«\k»6ú38ÐDóŸ÷òdfSý.¢½c/ã‹-µ!g&\ÝŠçÏ ÖêìJû O<ð¤gãxn¦ÍúÝ|ÓšÑî&ù"""rÉûïk»òüˆ+0Æ÷ÀÛ‰·ýM¤&í ×Ê\²ß.m”åñêÞjºulD×ボOhCÞèB Æí„ϰ°ûQ IDATU–äòäœõ¿¿ókè¸(õuoæpåëxò@&ÿøy¾ï,ÅõÓ&¬J¯Â~ší*ËÚMÄ´|¶kW~µ‡wWýÓ¾-8ùãŽ¿ßÆ6V.]…ã¤ÇÖ}É¢•8MÏ ÍÐ ("""—d>Éʵ½šÓ'-‘>«óÉ9!$•ä‘`s¡ão3»0¼C$†ð^Uý°•K}˜|U[Vô §ñ¡Ýt›“NJ]¦³—2eYαÍYsSk&û1yá>VWÕ¼÷æÌÍ<œçÉSÚ²îêh”§2xF kªÎA›XœèàY÷G9“gnå_ÛÒyè§5ÄÌ9Ä>ûh^'WºyBÊárÊÏ`»l%‡½ª„øö±,½*Š•éÜ8}7 +N(ø”ml¡u3?|²3YXZ»C+ ùp¿.-üUÇ´ˆˆˆ(×0¬^<3  ±»·Ño}!EõÞ«®¬ ÂÎ<=d¤2µÔ“×ûEq{¸']…óQß0ü3Òø,¿6˜Ù!¨e3ž‹ö ©7wµ $°²”L;”9Ä«9LéŨpO:„órÿft/ÎäÝlÛÙm‹ªb^ÿ%‘-‘ÁD½Èç_wójz [D2Òã$I“?(­°SrÛeÇÂÀ±<Óćn Cxc@SºUæ•ô*Œ?ÐÆnþÁ r*â“´šžè‚Ãüb÷f|GMb-"""«ócŒ°ÙB;Óç¬bzÝkSø¹Ekn®}²Ëâà€ å©2€ßÀŠŠJò Gß28œSJ™{]ë ¥póõ%Î’ÁÚ"¸f+ñÁNXæE3޵‹çç’V]ÈŸÿʸº" ƒ2»QjÇÀÂÙèÔ4ªJxó—Í<17ß®!´²óíÆ½üFÜëüG¹êRÞ›·‰{Ž Á¡Ì¼6š.¬®ªòÖdXpà´¬ŒµûÒy&©„¶ñíînÂÕå4ÛU PÍ׋wÒ¢{z8–ñÝÚÝ,s ä—Ç÷„Ÿ¶¬ŒŠ0Ó+©€æ‘ttÔ‰'"""—B6Yð·t–ÃNá Ï£9z…2ýFgÞXŸÆ÷ÛvóFa5n®ntnÃæø`Z[z³˜¬^¼6´%ÞËRxxfY':D6aE·0¢Î¤/ÜâÎcCZãº|“æfpÈn¥e£f_NÓ¿´/½Šy˶0î€÷÷`Õ‚½¬÷ aƵMäúÇ·-s/ý~<ºDxqWf<Û¼öÇ4N³]e€ÉÁ›·:¹ðݪmÖww"""r0†qF÷ø×­[G||üÿ«’²ÒRö”Ù-­.â‘Ùi\>´=Nö›¿¶býv'æ+Û1Éï˜[À¨à‹Yk™ZÛíÂô¡M¹Öíï@P–µ›è¥¼?*ŽAIï­ÁÞ„4Oðaõˆ(Ú9èÄ‘¿ß9‰$.®®´¬ÿ»¾6ˆs*aâ—˘ø»݃×.‘‘¤&'†÷mI¬¼WÈ'W7ùÛBð_ÍVQÂÊC¹¼¾±˜È–Íi¡,"""—Rþ ‹;“oê΄*ƒßûM‹Å‚§Ã¥óH•ÅÙ‡—†u㥋l»ª 3v~:ö‘LmåVïA;‘¿×9!""""r¾Ñ{‰ˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(Ÿ]FþR& ưaÃ6ìf^ÞRvô½ª”iŒ=úÞ8>ß_uúK×óä°a ö8«‹u¨MDDDDAø‚PÁ¾‡©‰»v S9¢}øÇT§óÃ?†1lؼŸ\¡ö‘K–ÃY¯Áv„ÕŸ~ÈüýeØOö¾Éß¶7q÷ÕѸ˜N_\Öö}ð5U–þÇ×ǵ~þ9vÌXt¨MDDDDAøl±‘²yÛýþ".®}¹íêh\NYÍ‚òHJÛLZyO|²Ù¹¯|cÈÝEö±äMÎÆøè‹ùl9˜O¥Éÿ&<úvD»AáJžý_’ÌqLøäqZÏæßã§rÀµ÷ŒòbÑwKÙ• ­rç}ÃiëcùÍšTíÿœ<4ƒlŸ+Ý·œ…s7Z@óËodÜ­Ýq4a˪+· ÿÀ/,ÄiÜ»<ÞÁ£tK¾˜ÆOk“HÏ7𠉦ýU·që•Mp7ŸYù`P‘±Š¯>øŽ_Ó(´úÓ¸õ•ÜrÇ5´ô¶œ¼þ»#ö« |u €o&ý¡i<»é¸6içzê²ÁNÁö™Lýt6ëSr©°¸Û¡· G#L:¯DDDäpö‡FX3üÉééò·›ßÌÓ÷uÄû´éÉ…ˆÖaP–BbvFɶ&1øÖÛ [æ\^yñ[Ö,Â32–˜0 G’—òñsŸXvŠâK×0ååä:ùàJY[äõ·Plœâ3yËøøÛ*|‚p/Í$qî™0e…õ?SšÀ‡¯ýÄ®ÂÒšñÊý|÷ØÃ¼3o;éUÁ4oŠ‘±‹ÅN`—{¨8Ãòí¹¿òÚï3këa\š¶§UP)«¿äéG>&±Ô8yý:Ü|3<¬Ä ÏuÑ¿í>]Ù¶#Kxã¹ÏX‘RŒßeíˆkè@ƶ_˜òÔûl,2tV‰ˆˆˆ‚p‹_gÆ>ÿ=~‚Ÿ8„È3Ÿ¦1x“ɶ}%”J Í0Ѱu(ŽG—1(ÏÎÆµi,†?Ç_z†gŸ¿ŸŽ@Ñ>ÙNQ~ C&À”7ÞbÊ¿;à”íÙIvõ©ÖɃË'¼ÃÛ¯þ—w_JP¼êG6äÕRAÈõóÖÇŸðH[ÊvþÀ̃€ÇL|û5&Mz•·Ÿè‹1ç;¶•gP~%™K§³±|ú>“çþÇžbt´ ròÝ–¢“×ßΆíâ‰öp¥Aû®ÄùŸxS ú´eW¦m © ðïÉm÷=Äc/¾Â„«ãiÓÌì‚jU"""rAp8WY|;1ö¹‡1=ö2‹³þh® Î!­ˆ°,bÏ–dD졘ZE¸’xt n-oã!ŸMüºr ïLú”½{Ȩ¬ ɧì«tiB\gL€sP¼YÏa[öS}È5Ž^—yÖ|&¢]ƒ§ó}fIYU\á[»Œµ× Š#ĵ&d¦ï9@àÖ¦7±5ÛîÖ¬'í½°  •ä#ÕĶüb¼3È[ð,ãÔ_)‡’³©Œ>YýÀisj%§)›þ-ilYOÒ‘yL;÷q´ïЙkÇô Ö×Ag•ˆˆˆ(ÿ6 wdÌóO¹,ŸØ~ÝhèüÇF“š\#ˆ ƒ„ÝÙ”“n]iîïP/”íœÊCÏá0žDuìD×!-ÙþÍì:ÝÌj&ó±îqÓ™®—éÕQ7œÍ§ÿt]•Çïß/ßn«éut?wĹ×{ÇŒS@Vv¶þ“3N[¶sp$O¼Õ€å óëêu$¦&°45¥?ÍcØäg©'îDDDäüwΧO³x·¤ÿ5Ýÿp®‰í¾Ä4ó‚Ì…ü’dÃÔ 5¡NõË©$uÅ*Á×?ųßÍuí])©:KSº…%; 10(;°‚™€)ŒæŽ¿{Ýá3P²e1;Š À $y òk8MýΠ|w¢kÆ™””xÓº mÚ´¢±K9E…ET9XÎà5㤽ݎ§)Ûà𲩼ûÙb5Á“oÆgScXcØö±zK!"""‚ ì>¶#!qXl¥ÀÁ-áfÊ®³qñròÉüþ9ß@Iò.2jƒŸÝþW¯OË&ßCR#_Jö§Sx]qí}L}òO¸6Ê «ù>u)Ïß—BlC3©‰û)B¯ºV&È9]ùޏôDÌϳkÉ '#‡ÔLƒ£bh(@:k¶ÁöW®Žw®ï×{f:E.A\6èA&iƒû©ºcsó/1¶o,¡æ Ó ¸9½ï~çGDã|†å[‚0ñ…qô‰ñæÈ†eüºé0îq¹ç…Ó+àQÔâKûk{î¹f°(µò·‹œ¦l÷6cxú¾A´ 7q(a-k7§PKß»Ÿäî87MŸ&"""F²4 ãŒæ»Z·nñññj1êÍóë{/¾};QŽVù""""rÁõ‹ˆˆˆˆ(‹ˆˆˆˆü¿ih„ˆˆˆˆ\’Ô#,"""" Â""""" Â""""" Â"""""—sòËrëÖ­SK‹ˆˆˆÈYõG'vp8WJDDDDälÓÐQQQQQQQQQQQQQQQQQQQaaaá³§’ƒ?¿ÄSSV’c»P›±”ŸýeÙ6Qr~°²kî{ÏS÷ßH[ûrÞzìþ“¨-ƒÿ¼‰‡æd¡C]DD.dj‚?Ç©aú—.ä‹o‹)öæ–amðµ¨]äoT‘ÂìYûö÷kˆ€¦\Öª!Õ÷O`Æâ4zÜQûºˆˆˆ‚ðù£<™Ï^ŸOØ5ÈÿõW3*ñˆêÂ5ƒ¢É˜ÿ3¿&eQæFüàáô‹ñÀ–>‡·¿© WO¶®L %ÇÀ'"ŽÞƒûr™oÍæÙ w³|Ö6¦dQlñ",¦+t ÌÙT[ßB ¿œÂ…¿°Ãµ;mòæ²òðËLJº‰Gn¤xëf-I`^÷Z\1„«:áh6ÈÛuÿþÃh¾eûÊ:á©KþFFåÕ€é„ANüÀc´sòÃB»Þ¿‡'÷gÊs}ð7”±ý­ñ<›9’)“ºS±â3Þÿz)‰YeX¼#ézý=ÜÕËÙÞÏW‡€Ç3|ý˜öd{\JS˜?õCf¬I&»Üð¶ýy× ´÷w€ÒLó)Ñ÷ô#kútÖì+çÕ5Ü;¦5{§½Ëô ©»F3`Ü¿¹-Þ—Ó]GVçnæ‡÷?cÁÖƒ8ø?„;G÷#ÚÍ”\ÈÔ÷¾gEr&g›÷bÄ=·Ð-È ”í[ÀGÿ›ÎêÝy8†ÇÑïÚ˜ÓÞù‘‹“å©§žzêLLOO',,ì,¬‚‚¤5l.lHÇö qµç°uÅZ¶§;ÓæªkèÛÚ“´•‹X²:‡6W3´;ü²Ö²l«æí£p-ÙÍÚ՛ؖj¥EŸônFõže,X]HÃv1øØS™÷þ4ÖšZÐïštkæIΆ¹,Hv£U«0\ì9l]µ‘½)‡ Q:µmEçÞmqܹ‰’ËïãŸ`ÎZÎ'ŸmÄ)~ W÷Ž'Ò)U ·@l[¹9áÓø2šG„Õ"†^ÎXL:°äï<«ÝpÍ\ÆœÙ?³lg6gܽ}ðp²âêL·#&ðpOgÁŒ­÷îIc”íä«–âvýô1Ïæ‰Ióqë'wß<€8—Ýüôùbè:”a×uÇqíB ‡¾É»w6ÁÙ–Áì§á‹¢ŽÜ2f4×õˆ¢jÓ×|üK)­{Çágd°|úVìv¥÷Ý÷pKO?vÿø%_Ï܈c¯±üct_BÎæ»åúµÂûÄ$\™Æ’™ ø÷@+ç=|òðSÌ1uåöñ£¹¦ƒó?æ³^t¿"wÛ>¾zì–û^Åwdp—*7}Ç×[BèÛ#kîr^zø]¶ äîq7qyx >œNJ¥'-ô£¹‡F‹‰ˆ\JÎÏ¡†™ð^èÐÈ tŠXLJYouŽÄÃ^"YòM%6ð irõ0z6wÃDc@æ›sXµ¯/¡ÖUl. §ßíýhãm rÍãÀGkIÈiGO º KëáŒèXÓ ¶JL˜0™Ì˜MPU|˜S ]Û·"ÊÓaþx¥bv©ùÒ4;»áàâ¦#Jþ~&wâÆ¼Ì³Íf1wÙ:~xcŸ®¡qtx=7öÁÓNzÐÎí–l+ Ç>”%/bSÕeŒóƶÿ9¦ ¹²;q~fh†OD3&³¥æü0›1›MT¦ÌcæþhîzûVzøšh¢ÂMì÷ óR†Ó´€…¦#FÓ/Ö ¾\uÙWl+¾™»®n…¯ üµâë—QP §³Qºógç5aÔ3·Ñ3Ð4¡‘çavNœÍ²C}¸!Ðð>£øg´ñµQøžÏ¢¹Ù”Øl”¯ú‰-]™ðà´s7M7Rÿ^‘Žáó¥GË?oGj:VM8XpuõÁ©¶§Õd±b6U[Þ@L¸+¦£9 !M|ll:”OÓª¼bhè~¬§Ç1 š`‡M¤çWƒ'`q!¬‘÷ï6†chzN[­¸‡áVwN[°˜ÊO³QÕäH§Ò/žŸcÝÆNá­‰°.dwV4hHÏÁÞ¤%o`ñнìNÚÎæõû©î T‘½'sƒ¡4©« Þ1m¶,×1#"¢ |>;Åx“ ³éøeÍ&0 ãw—7a`¯›HÊ䀳õ÷Ë7¹D2pÜC´Þ“ÈÎä½ì\ø‹f…Ð}Ô(z7pÒQ$ç•Êý3x÷ÇjF”˜<oÕ›‘­ºÿñ?˜¸lnlB3'g"{¶Ãù¹%ìÈpfE‚‰ÖÄân“{+îxõCzm^Íš ¬ùl_¾ÉÐIOsSÔñõv³gOþ=y‘ŽÇŸ‡nO ÿ¹L˜1°a`ïà‹IÏ3§(ŠŽÚ×ëVº5ùI‹k¯™Í¦ß®ÆÉ^‘KÂÅÑ¥i;ÂîÌc½IFÉAvçšñ ñÆ+ÈkÁ>R‹=S™½—Ìj/¼Îä:ÀNÑž_™¿:¦ñô|w?p?3Ù¸é0•:†ä|;©-•ìY9›YÛ‹~3g°Ù X¬GDZ;7îAÇ$~þ~:ÛÚreŒ&lämžÎg3÷áÝn#Æý‡—>˜Â ÷±`ÁŽyna¸íæ@•>>>øøøàiOâÇ©?²³ä¯œµØïˆP¬9ÛIÊ?Ö-]‘–Àþ*¢¬oû–™íø÷+Ïpÿ­ƒéÑ. òòÚ‡á¬4 Äžºž=G×ËNAR™šNDä’t‘LŸVÎö?8° œòH\<›ýN-醳¹3­Ý§2÷»Xû´À·*•usÖPÒ`qþpÒ9úM˜L6Êr²È-vÅÕ~ˆ‹Ö’gHÇFTÞɶ#f|Z»£™Òä¼;©C{3¬ÝLÞza"•×^M—fÁxPÄ¡‹ù~V!ÍGõ'¢®çÖ%’žmxjÙn<{ßB—šëc«}/ ¾œÃaó láKŵ¬8d&¨gÍ"³ÉFqF*‡ó½‰Hÿ°E|ýʸêM„í«~ø„Æpú{˜ù+¯]b®¦§÷ãL}õ3œnîFHes>šMA³Ñô³âç…ci2Ë—nÀ9Ú…¼óøbz&v—=ìJ+çòŽW÷Å[ü÷µ ^¹kùæÓdléÀQ¾@Y#ØÛ—ó¿dq>xG´åº;úíA¿;FàSg¼Á“ŸÛ°x„ÓfÐCÜye0KÅÿ±wßÑQǿ۲›i„š„&B EPŠÒ, *"UDÁ×.vŠðªˆþ¤ ¾Q‘"MZè‚té„^BB€$@*›ìîAMàùœ“s ³÷îܹsgŸ½¡ÊÝw1oúP^Kz‹±¯V§ÝÀ¸›ÀÆìð¦Tív èÑŠ`3·4Ü+ÑuÈxŽÌ¤!ó8g ¼NwwkA ¨Ò•~­G0nò0VáG¹Z­è54Š˜ã™6c/u^¼‡—†Øùjô|ùþ ÌÁ‘´|¦/EÇÎP¿¹\×]H{µ 6]à ûÄþïë$Ú¼ô$åm:¡"ùãàä¼×è?¯*Cÿï©?¬ñ¹½é/ˉܡœéqìݽ•y3Žز%‚EDDAXDîŽÄ•Œýd!Îêxî’ú“Ë""rÇ)ôK#DDDDDþ ýEQQQQQQ)$ô5D ™””5‚ˆˆÜR¾¾¾ Â"¢ÁJDDäN¡¥""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,"""" Âÿ6ûQfÿ÷=Þûl1qö?”]ØÏÔÁƒ˜²/ë_ª\»&eåi‡zŠNŽóì]8šwžšNíÛóè½xqÈ׬<œŽ«°KÚ:ÞîÔ‡)G²ÿ–Ý;“cx­SfÆç¨ßˆˆ(ÿÃRÖ2g]"å%葟˜üív&Ÿçðϳ˜üÝ’”‡¥P±stö Þ¿"÷vãõÁð^ÿǨá\Åço}ÌÒÄ›ìÐŽf¿Ð‰—œB—†ˆˆ(ßï2ÅHZ5ÍÉã%ÕZª-ªIHI#.9ˆ{ZFágR‡‘BäÂ!æÏ;Lñö¯Ó¿}C"+–ç®ÚMyâÕ7hí½ƒÙËâÈV+‰ˆÈÌ\Pò¸oõˆÎú1 vR©s$E®Ñ퉛Y8o%;ŽŸ'7|ÊDÑôÁû©êk†¬}L±˜ksvõjv'Øñ«Ïƒ­ÃIX<‡Õ±§È´…ݶ#Í+zc\Y lZ8ŸŸ÷ÄqÖîN±ˆZÜ÷@#*5ÑEÊÞ£´hO¥_×r8³.¥‹¨ÃH!âÊ&+0üa„µ,m_|‹šVL\`¼{¤##‡ÜG€ “Ÿ?Ëà“O0rPC.¬™Ì˜oW°ûT&&ŸrÜýh_z613ÿ¥þL‹&³‘µ‰!´ê׌êÞ „àbâ?]ÄÆ„Æ„–vÃhóÄ ÀÝS=E ƒ‘½?bp…y,\¹Ÿ.b2àIÃVòØý)bk™FÔôÈòçht¯/™ûbØ’}ÏDúà8r”$CIjÖH#D„à[:“·ƒÑ„££Ñ€ýÐ"æ §ç]häg 5p Ï×,:Ô‘òeL”ïÜæ•‹bÀîšÆŽ´ÇéÙ¦~h]o?Šç\`¹þ¡eì™Ã²”º|ŠÆÅM@eŠ$²gÀ|VÆßG‡âfBïëÊ ZågÂðK\LÌÂÓ¤;d­ý‘_ÍwóÆKQÓËDê:ij£SÕoDD„ÿ-6J7nMÕ]Ó˜»ºÏ4¼¢È­8Õë{r:.–­;ã‰;~„{Oâð¯|Å ˜þ>n~ Öf‹_¬¿jƒÉ‚Ñ`\dŽã|vs>û€ù¿nWÙ®Ô¸E 7“›>AŦOàÊIåÄî ¬øéGæ‹í§†òQ—l¶²4ªáÎàå;9×°‡–lÅYõyª1` kAã Œzæ–Ö«K­¨šDGGêiâêoȹH?¾$û~¾ìûc¯¸¦ì9N\)v\e“7ÁÅl—®Q‹›¯xþ~Z¬˜ yÝ%&‡³GO`÷¦¢ïåickhuJ[–²ÿT6”,Eã¶>ÄíÛIJ5Ù»“­TÈæôÓK>BÄïOŒ ŸŠQ™V©Ïˆˆ(ÿ{ žå¹¿e_ÌšÃúŠ.¿Ìf!fò7¬Ï,AÅJ‹ºŸª¡ ˜¼5Ï=^ó·.§ ƒgu:öhJ óÕ7ÙÜÕ3¤Ð³™Í—³rhýl{¬`0{Z­)OTk@ô„~ XÃÑÇ"¨`µQ®qMlC–³+ÁÆšmª¿X/¼ªÑ}øxšl]Ç/›·ñËäA|3º zŸNa¾¦ŒEóêÐΔs»úš2{zaÈÉõ’¼ƒ‡#.¸p¥íbê XFºµˆlÒ…ã´ìâCFß«q­ß‰ˆÈm­.„3Pä®–ÜWò +çm!å·Y§ÌÃ+X—Ác½Ÿ¦]³úT/Œ»Ýþ¿ÜbÀˆGú s<ðööÆÛÛO×qÖ,\ñ,u ¹ .n“?ÏgÞÎÔ?Ý3ØhL–KëÞmeåËœf²Ã\ƒf=1à eëL&Ï=ŒOÍ–tîó:ŽI÷R‡Y²ä(ö?\Sž!¥ñJÝÏÑlo|}}ñõõ¥ˆ3–Yg±'ýV޵،Oé`,I;‰={yZúBÜ6Žd^ÌBÚŽï™›P“W?Hÿ.miT3 ï¬¬ßÆ Å"Šã<¾‘—êåä\ì6Nê>p""ws¬•É­ïeó¨e$bÄ0Y=1gű}[,n!VRl$fU2.k<ÇNgâç“¿§p ®Cíb[Xöý|Ü›× Ðy’]«³™ÆD{h^Hnƒ‹;¸)íkÎåóa°?܆ú‚ð&•ø]ËøaÞy*umAéßgnÝËѸ†™÷Vî§HÓ'‰p¿ø>Ùâ<È’ohìN«*~\8ºž5ñFû`Œi ÇI<[”a­h÷ëkSJ;޲vÆ×,qu¤…·ì·îØÜ+¶¡±ÏÛL>ëã (aeÁWó9W¡B,˜SŠâ–±U+6a w'e×"¦Î<‰Óý{㲸§N"§~ÎgŸ” çÃQM^Ïw“öá PGDDA¸T¬x]ÚÞ½•q?ŸÀZ¶9×›Á‚%ÓØŽ7%*Ô¡u϶ü0Ÿe«ŽS©m~Ÿ {º>eþO¬ün ©N+4¤s«:øë~Ár;0ùsÏKÃ)²`ÓOã‹™©d›< (Y™Æý‡òPƒ+¾æNØ=‘¸¯ÜC½¦aØ0àU½'/wÃÄÙŸòî&ïP¢Z¿LfA˜L¨r÷]Ì›>”×’Þbì«Õi7p nã&ðÇ1$;¼)U»z´"ØÌ- Â÷Jtòžc'3iÈ<Ι¯ÓÁÝZdªt¥_댛<ŒUøQ®V+z "fÄx¦ÍØKïá¥!v¾ý_¾?sp$-ŸéKѱ3ÔoDDî —ËuCŸYnذèèhµ˜ÈmÉÁÉy¯Ñ^U†þßSXã+""r{2« DîlÎô8öîÞʼG lÙ’ Á""¢ ,"wGâJÆ~²gõN<÷@ÉÜnß+""r[ÑÒ¹#éˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆH!¡?¨!RÈ8Nìv;v»‡Ã¡‘›âááÕjU‘‚Ïh4b³Ù°Ùlj ‘›yMUˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆÜáÌÿz \©l?œO\ùK+>Á¥)_«M¢‚±Àqz%£F.dzý«t«âñ—Ÿ.ûø\>›|ž_zœë5¹›‰ÃÚã9îÊó¸ÎoaÜÿ­¥Ò3}h`R“‚å¾èý6+<ÚòÁ'ORÞf¸¢ïoåƒnÿÅùòު顶ኡd º4Å‚‹ì´3œˆ]Ïò9ãˆKëÍÓ÷av%ªn}ÜÌ:k"7ëÔFÏkÄۗ¢Ö‘;TYaò 84”ÐÐ’”­Eƒ»Ó³i ñ+bçy¯0´hFt›ÎšÈMò«Jü£YrÒ¡Æ‘;Vž^µT£!a+~`Ë¡4ªWL`Êð¹øwíG«8³} ó–oãHÊL^%¨rïC.RNœ#çÊèÄ5|;s†ª­x²[¬aeÏüé¬=•9 ¬üv.{¬Q´~²;Ý:7#"s#³ÜMÚï Õ~¹‹ÏP¶Ùãôzª•¿2kÂb3þaI¬ŸòKΔ¤Ñc=éùdsÂ3aÚ×K‰³ƒóüv¦O˜G¬[$mºtå‘z~˜CBŽ:–pn¡´êó ¾¿N`Ò–ó~ó–ˤC˜}® ¿1”Áý[¸{ÂéIœˆ]ÏÊ_Oܤ7UŠ ëò ·ÙÏæ˜õ¤[Q§Œ7Ù‰{Øqƈouo,VOÌYqlß‹[ˆ•Ô#‰Y•ŒËϱәÜÈbÏœ¬hÙ€rnIlYHœw-º•vçÊÄì\‡ÚŶ°ìûù¸7¯A ó$»V-f3‰ö0ãS©áKg1sº?­†ãy~+ÇáÀW=K SM{=Ê’§qÅ÷Šmhìó6‡OÆúxJØcYðÕ|ÎUèF£aQ¾¥\Ç3yÂ¥ŠO‰ÒÔhó Mjýé†ÿîáСÑ\®ù¯—81y#¼^ZÕòÃÃМ‡ëÍ`Á’ilÇ›êкg[~˜Ï²UÇ ¯&ŸZ´kd`ý’oXqÎD@¹ztîܘRV óÊÖ äž®Oc™ÿ+¿ÛBªÓƒÀ éܪÎÅÛM‰äÑîÙü4wsþ· “ÑmÄsÞjõ,)T,¥ZÓçÁe¼þã î•è:ä <ÇNfÒyœ3^§;ƒ»µ H0QDDn—ËuC þ6lØ@tt´ZLDDDDn F5ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ$f5Háât:±ÛíØív‡DDDnЇ‡V«UAXD >£ÑˆÍfÃf³©1DDDnæ5UM """" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""rgaç™%¼Þ¾=íÛ·§ã uœwÝÂgläÝöíißþmÖ¥©cäÅu~5o¶oOûƒØœ¡öá¿‘ƒ¤-1øí9»cØ•êÒ¼žœÌèמöí»3fßµ‡ˆˆˆÈ˜ÿþüz†u“ƳøH&Îk•ÌøÕèD¯6á¸rÛO›—¸üÿì],ÛFݺÞnE==jòæ”)81b±ªcˆˆˆˆ(ß,g*‡¶nbGüõâîq?Oµ Ç=×¼™e‡ó]<Ö,‰ïœdgÌnÒêÔÁÛàäÜιLœ4Ÿ‡’¹`ò¢Då†<òTg•qÇG9çæýnŸkŒä¯ß¦¦8ÏïbÖ—_1Ëqr‚jÑö¡VœM|p'>û¤AÉóyõÙ‰õ¨Kß®E‰™¾‚½§¡xµVôx¾#5|MäÄMç?/|G‚Ͻtk–ÁÂy›8i&²åÓ&§òx^ï“Ìx±?ÓâαdÀãœxù ¬ëyu›^ÚO}þÓ§?[ŠµÏ—¼^l&ý^žÍi¿øïOæöáÙK8÷Û±ÿé å^ç¼ÏˆˆˆÈ?ëï_a)KÇw_¢qÀµ‹Ý*=ÎûÏ×Á'×$äà̦eL•î§q“» ²wư;íâòÇ™å|:d2k¥áWM"K™IØñ#ßÃæTWžåb?Â÷ï¼Ë´ÇȬÂ]~'˜1r6×Ìó¿0rÔ*’­¾xpSÛg1b¯¤]¹Û³+™0ãN›gú ¶þ0˜Þ›ÆÞl—ƒýLîå¹ú)3÷Îb~К>Ey›CÓ^æÕ ר`qú GXIÛð!Ï|¸‘Ì{8S“’—SŽnŸ}@«âç‰Ћ/@‘Æïòù³U1ÇŽ¡ï[K8›päœd­˜Éæ,ð½ÿ5ÞíT«3…5Ã^fÂ¥Lÿõ1Þ Ïãy5)[3špï©lLõ d­»‰ ÈíT_ Ä£oóA‹p|=Ýáx~Ïp'ó¨ó«y´¿·EW£ˆˆˆÜ~AÀäW—g†¼‚á­Xv*!pœÞȲ#4ªRƒÅ“úÑ~ÌYÌŽ˜½¤Õ®GPUÊš6{fCŸY„WÉHjÕ®ÇýQÙόÜ{¹ëüÕÁ.ißa2"‘u)m3VJÖ¯Gñ39õÇ ºGYÒ†°–ć$:²q^9ÑéN¸¯Œîøz›w…âa‡—îÀY§—ËNÂî‹a;eÉ`ú,¹ª%ˆßw{ø /ɪ%ËX½n»ocÅñm¬øq퇦c¹ÜË»jé† gŽã·]õëk3/¯11\ï˜ ʦ†k>Ö…ÓqqBPëþtôº¢ÌˆµX ,ìÍÇóÞHöÄvE2—Ùéäú ò®³-¨\çGßP‘Ö?~û4“OUZ<ØðC0àHdÃò‹1ØàíO@@Ào?¾Ø.ì`ÙÞsœ\9‘/'/#¾LgÞýb2“G¾Eû²pfݯ‰ÄåZžDÎÞø–ĤnYɾt¸2Ø¿bõŸgƒo97Š… =݇ŠÕ£ˆŠªFY÷,Rϧ’m6åó‹e.\ù]‚k4cH#1î $låü_®³‹Ä|µ¿ˆˆˆÈ߯À&íHÜÀòãáôúèîø=»g±{dÞYžÊöe i*ÛÖ­&uÝ6v,«D 1™G\€'eËùQÔ™[yÑ?4„¯jmiཕ)KxÿÙ]”)rŽ# éÿÀ[(Ù´5çL`ïòa¼•V—R®ãüºé©–ªôù¿zp#ÁÖà†§Ày¶ÌšÎÊ'ãÞ[‡kö¯D„'œL߯ˆž=ø¶x ‰é7Uç0ïÜÛߤkQDDDþaüjäpò—åÄ”kDuß+«k£ì=Qx¶-çD…^¼ÿ|k¢B Äo[Ïú­‡È*^™û{½K¯H/¼£zçRîùçéIï^ EÅbØÒãIp”£u—æþGm jÉ€a}¸¯¢g6­dõ–D¼"[ÑwØ«4)vƒ‘ÑäG­‡j…äM³‰9n¿áç7xVå©ÛYÜ ® .xÕ¢kï†ü>a¾êì•Gûëöi"""òO3¸\7öÁù† ˆŽŽ¾cÆ‘ÇÁ¸4°§li?,¸;–¾o.æl™îŒúoKŠkSDDD¤ÐÒ×õ¯Ãyf5_¼5ƒxü¨ùÐCDœgË‹9‹™JM£ðW)Ô4#|]9$m™Íÿ¾]Ì–ÃÉd¹,x•§nëÇéܬ<ÞFua‘BFóš""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""Rèý#÷Þ°aƒZZDDDDþVù½Ã™¹ VJDDDDä殮""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ü9qÓy¾}{Þú9׿U‰ŒÍ êÜ‹¯ØïÈs}d }:½Éêó®‚Q¡´u¼Ý©SŽdkdÛð‚;̤gÚóìÔ#dÔ1QDäf¾cßx•§I붸‡¸aP?‘;œÆDQ¾“}ŸHî© "¢1QD„ *YÇ–2qô¬Ù—ă╚йï“4´vâWMfÌ·+Ø}*“O9î~´/=›•ÆfÈ¥,s3ƒzŒ!xàtw#ûäÏL5•{’±–®ÃC#X5âgZü€Fn[Ô{å_x˜ôy3Y¹3žlÿª´~¦?«û\½¾Äq’9¯<ϼ*Cù¢[8nÎ$–èÍè£5xmÜÔö2¹m8½Ÿ¢Ëðö€ {âÏŒûú{Vî=# *­{÷§SÔÅýº2±xâxfÿ²ÓYž„ÖhÎ=;P+À|qiEï©ÜõZ;’¦|ÅZ¿~Œzµ:¶Ü¶)°œœÝ<Ž7?ÜDÄóCy¾AÆüûs>Îã<¹ eÛˆü2®ƒwä:æ‘Ã}çPgøp ¾xídíþ?úü7›G¿H©#xáÓd:|ò>-ƒL¸Ò~eÔ qâáø@0ºÚD¤ÀLøffú°1üâј^oÀà×»•¾ˆÏG®ã¬ ²ÍbØç+06ìÁ[ƒß¥oSwÖΜãÙ¹–]µÓ¶2úͬ±6¡ïÀAôkéŊϦpèÊ¥»9ñ,ƒåþ~ ýt —>ÄÌϾaß…?Ô×äOµZÅ8»cI ë[ŽÙ‡Øo²Iøu?Y!u¹Ë׎bÆÆàþÀK ö íB0kÔŒ‹ÏÏüÁo2éDy:¼2ŒaïžåÑÿòŸ¦%.Ç‘ü;‡s=Oöãyì³”ɧ´u¼Ýu8{®QTê©/ø¨M¦Âzl¹yyN±øR·{7Vüg£¾ÙÅéEé0¬ÁuQÎk)·õ!nß&–­9ÈþØlÝx„œ zØÂZÐ8h £žy†¥õêR+ª&ÑÑÑ„zšpY®_FÆïOÍéØœÁ÷PÎÓp)Ì«çô„Ëõ0yQÁÿÒ‹šÁbÅl¼^•ëPÑò)ަSáÄ.ÒKµ¥Ix"ë·ä|3›¼¨Ö# É`ò&,ÂïŠýÚ°.ÄôãûH²ïç˾O0ö÷ª¹r°ç8q¥Øq•LžDT ¼od¬ë‹0Ùû˜8ìF—kÂ9rë_:ö¼ÎÓ ìSAXòË«ƒ~øáö<¶|Œy×ÜÜ¿=»,§ÿè•”è<‚V¡JÁ"¢ œo®´]Lô RèS·‘MºÐ b<ƒ–ý68{U£ûØÑúë IDATðñ4ÙºŽ_6oã—Ƀøft9ô>ÊçRzép9þü±¸†+£Á‚ÍrƒÒ½õÃr˜¼å ûãOAÙ° XoâÀ GÌ•h]Êšç~]NÆ"yuhgʹ]];³§†À`ÅÓÍpãÛ¸3ìFÄ“Cx¶Øt^>–™Í?áÉp·¿tì7Ýžv "iÌ\ÙY丮œÿv‘|Žl åø)²\%±èv"RÀð5Â.Òv|ÏÜ„š¼úñ@úwiK£šaxgeáüm MÙ:“ÉsãS³%û¼Î‡ãFÒ½Ôa–,9DâuËŽr9óX/Ž!~G2~Ä9œÙ{4ç_}ñ¦B½ÎoZʲ#T®ä‡GÉZ”ÉÙÃÒ¥;É.WŸ0#lÀìQ·Œ}¬Z± [¸;)»1uæIœîØ—I-çA–|³€DcwZUñãÂÑõ¬‰7ØØÛuË|0“~é½€o­©=é#F~>‹ÞWÃ3q5ßÌOCÉ¿8ƒjÄç®:;m–š´,á†ÁFÍÀd&n„°^ð¾[ÃZÑ"$†o?‡Wצ”ve팯YâêH o#ØÿÂ6•)&=á§—¾cš»pwþý¦Û3K‚äS!\qáÌab÷f]5ø½Jî—‘Ù½8An‰ÄÌZEÍÇ*c<´ˆñ‹’ÁXö·Çü/fÖøm:5 #>þÞõ>yšŠîšáæ^¥+ýZ`Üäa¬ÂrµZÑkh1#Æ3mF,u^èÉËÆ0qö§¼;ÅÉ;”¨Ö/Ó£Y>†ë—™ì'.êE£ynð³Lù-Ÿ¾5"åѱ_{ìoÅý/~–g.V(ÿiœ(Zƒ2î€Ñ—J‘pÔJ*>76o)M»q7>Œ!ÙáM©ÚíУÁf®óÚ¦³”jCïKyûSøµf¿üûͶ§ÈàÜꑼ·ú¿¬ü ÿ{={eºô}€ãÇ1ày7‚*Ý̓½[‘16ÈæÄO_ð]òݼڱaíúÐtõûŒšy/=†U§AD ƒË庡O«6lØ@ttômÙŽ”=lÚo¢BÍòø˜\¤oý”çÇeÀgÝwSG¹ÝÕàÊÜÏŒáC9w+G“ÎqúÀ ¾÷ –Ú (©,"""r[ÒŒ09œÙð-£'-fÛÉ žÅ)ß°}žl@ˆUëÙDDDD„oÛ ,""""w-aaaaa‘ÂèùòN§»ÝŽÝnÇáp¨Õ )¬V«Î­¨«î"·¤‹ÜAØh4b³Ù°Ùljñیέ¨«î""…ö5@M """" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" Â""""" §œ¸é<ß¾=oýœŠëߪDÆfuîÅWìê‰UÚ:ÞîÔ‡)G² OuÞåßà:ÇêíißþÚ?O}¾› ÃEäc¾cßx•§I붸‡¸aP?‘;„!¼ ït¯„íêßb)‚›ÆpQ¾C‚°O$wT‘;kìó%<"wá""…!»È:¶”‰£`;$.l¯Ô„Î}Ÿ¤A °¿j2c¾]ÁîS™˜|Êq÷£}éÙ¬46C.e™›Ôc Á¿ {¸Ù'fÒ¨©¬Ø“ŒµtêÁª?Ójä4rÛ ޓ(ÿÂäϛÉÊñdûW¥õ3ýéXÝçêõ%Ž“ÌyåyæUÊÝÂqs&±t@oF­ÁkãÞ ¶—ÌmÃé5ø]†·\ØfÜ×ß³rïiUiÝ»?¢.îוqˆÅÇ3û—}œÎò$´FsžèÙZ拱÷žÊ]¯µ#iÊW¬õëǨW«cËm›BÆ~à+ú}˜A§N^¬š½’ NŠWjDç>OR?ÈòçÞ’ë±ßL_Êkß–sf3ߙĒí'Hs ¢Zó.ôéMÀoý:·óž“¼•c&³dû1Ι‹~ˆÝšîyqî+÷ò[{r'qqnÃ^ø4™Ÿ¼OË ®´_õÂGœxø#Þªð/æv=þ¥1éÖŒá¹^›o| ‘;kr À×0û0Ó‡áÆôzû¿Þ…¨ôE|>rg]}lÃ>_±aÞü.}›º³~ÜpæÏε쪡?m+£ßÁkúD¿–^¬øl ‡®\™ÏÂq1XîïÇÐOòxéCÌüìöýqQÉŸjµŠqvÇ.’@Ö1¶²±%Þd“ðë~²Bêr—¯)ÄŒÁý—6ìÚ…`Ö¨Ÿ;'žùƒßdÒ‰òtxeÃÞyš¨´ù {g*û²\—‚÷ÒQÓˆkÍ-Káv#Û2Î䕌štŒðö/1ð§ˆÊ\Ì'oŽc{úŽ'¯c¿‰¾D>ÛÕ•±‹ †²ÈÙ€^ï ãý^ѤÏÿ„&à€ÜÏ{V,“ aö¹*<þÆP÷oMàîñ¼5t‰Ž¼ËoåqÈí˜u8þqº ­õ4=ªgêØ•œÎÉdÏ·cX[¬#Ï5 Æ|#×c>Ǥ[1†çyÍäg ͬd&ô¾®¼Ð¨%Q~& ¿ÄÅÄ,’ìûù²ïŒý½j®ì9N\)v\e“'U±pƒÛ`-0_,Iß8„>ÿÝzñTX+ÐkÄ@š¿Fl0•¤v„÷¥z}+Q#ÈAÌÁdr.agÞÇþ—û’‘”_óÓ®9œÙw‚œÀ(ç}¹O…¶~›s9ïÎ=Ý?šŠ¾—ÛÂZÒ–¥ì?•ÉÙ㹕gc«p«Ž#çèNåUA?üP¨ª|í/Ëñ(áqéÜ›üгËrú^I‰Î#hj¹±ë±jþÇ$käÍŽáy]3ÙàŸ¿1\D„ Îl`Ú.¦ú€©aÔ©[‹È&]h1žAË~̼ªÑ}øxšl]Ç/›·ñËäA|3º zŸNås) ½<{çrüù#a W&ƒ›å#¤{9ê‡å0yËAöÇŸ" *‚²a°.ÞÄŽ˜+Ѻ”5Ïýºœ.ŒEóêÐΔs»ºvfO/ 9€ÁЧ›áÆ·)@çÖ£Z_>yáâ­ Šø_/`1¯>£áâ±æ§½HÛÅ”¿Ô—Þ¥y>ÛÕåtÑxýµGùéOF\8ò,wÝÒã¸ñs$…Å}YÎAFò9²”ã§Èr•ärwÍãzÌç˜dt»Ù1<ïkâ/]s"rgŒ‰<“¶ã{æ&ÔäÕÒ¿K[Õ Ã;+ çoƒuÊÖ™Lž{Ÿš-éÜçu>7’dÉ!¯[v”ËË-„Ç¿#®Ë3z{’æü«S.ÞT¨ÂùMKYvăʕüð(Y‹29{Xºt'Ùåêæ‘çNð )Wê~Žf{ãë닯¯/Eœ±Ìš8‹=é®[´Í¿83eõ¡x` ÷ÃýzËq‚-‡3.Ý+Ôyv/[N ,çwÅ;9cÇ¾ts¾ÚÕŒ_¹âNîàð¥2‰K†òÒ‹9éÈ­ULø”Æ’´“س—x!nG²/fË£Üt #çèN•¶Ž·¯s_ÞçžÄQH+ûؾ˜MË>á»v Sw¦_¾Wï ]7:&åÜ‚1<¯kÆ¢~*"×UÀg„ ˜=Šâ–±U+6a w'e×"¦Î<‰Óý{ã2©å<È’ohìN«*~\8ºž5ñFûc»n™fÒ/(ßZR{ÒGŒü|½®†gâj¾™Ÿ†’qÕˆÏ]u(6vÛ,5iY ƒ-ŒšÉLÜa½*à};¶†µ¢EH ß~<¯®M)í8ÊÚ_³ÄÕ‘ÞF°ÿ…m ¥t~ù”êþ wyœdÝ´qìv¿›7«y_u~r?vÓMô%¼òÕ®ŠVú–¡Œþ|´«ïùÍL›´W›Çñ7ÎõhÝ+¶¡±ÏÛL>ëã (aeÁWó9W¡B,¸Ë­Ü Ëé[u’§B¸4‘zŒØ½XFk¥Ë`͉cþ3Hkü6š„ÿ oŽúŽFŸ}k:EÊ7¢c¿öØ?ÞŠû_ü(Í\¬:QþÓ8Q´eÜ£/•"ਕ:Unðv=–Ò´8·qøáÃ’Þ”ªÝŽ=Z|ñ®Cùߦ2¸U¦ûãA¬›üÓNAñJMyaHª{ -Ç~}Éd&_íjð®AŸ¡ÿaÊ—Óõö·dØ‚¨Öì%^¸–ì܃°Á½]‡¼çØÉL2sæÂëtgp·™€\Ë Pýև܆Lað[×ø}ñGþÙ£˜ú‚ï’ïæÕŽ•ð0kׇ¦«ßgÔÌ{R'ë1#¿cRîýõ†Çð¼®‘ë½æº\®ú¼|Æ DGGß–àHÙæý&*Ô, ÀEúÖOy~lQ|Öp7u”‹ýÀW<÷N<½Ç¿MMµ‡ˆ®G‘[GŸ…®ÌýÌ>„‘s·r4駬àëq¿`©Ý€’ Á""""·%} ˜ƒ[ñêKç=i/OÉÀàYœò ŸãÇ#t{I‘Û”–FˆˆˆˆÈIK#DDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDDDAXDDDD¤0úGî#ìt:±ÛíØív‡Z½òððÀjµêÜŠú°ê.rKú°È„F#6› ›Í¦¿ÍèÜŠú°ê."Rh_Ô""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""¢ ,""""r{áͧS1ŒZAÐ×kIÏväùøé°YEìÙŒ¿T.""""R ‚ðäØD3ìüz&Mg@DDDDnÿ œ™ãdúÁÓtŒ(N€Í¤ßB±ˆˆˆˆÈm„·'¥Ÿ~Þ•ƒ¹¯¤/³ŸùÓòˆ­gÒ¨;c †Q+¨si›éh³`¶1«(2n5]böpöBÎ¥ý¿†å'ÎýÃfþiç¥ß?½l/EÆ­ÆôåJÚ,ØÁ±´,õ.á‹þ{_«™šÅ½éÈ©L;[¯X—v3·âe1±´m$/U/IŸ•û¹àpÞPùµd9œ¼²î ŸÜÆò‡ª³öäy§®§~Pvv¬MíâÞ¼°æY'iÙêÏØJb†yTeêý•YŽÖ vítítÒmÙ^j/ÂóÕB°;´˜»½)ÌlY…Åmª‘œ•C£Ù¿’vk EDDDäßaþ§ž(=ÛÁÌCghQÊo‹‰ºE° ü/ö$ Jàûƒ§p3ø¾yeü¬œ.èµ"ö†Ê¯Å ©SŽ{ƒ}¸7؇ä¬lþY£^ˆ ¥ÝÂ]d;]üœpŽøŒ ¬|¸:e¼mØ,ÔŸ¹…}g3õ²bw¸xªbïÕ.ÀÆS©lKJãÀãuö´PÙÏ“2“~aËéTîùíyEDDDä Â[Ϥ‘˜aç© AøÛ,Ô ,‡Ï0âîp¼,&6$¦RÅÏßßB.@ƒE1 y–_‹Åh ´·õÒÿÝMF"|Üù}«ÉÈï[oKJ£¤—•n—_ÙÏ«ÉÈ‘Ô,B½¬˜‡\·»’ÓÉÌq6e=†ßvärÝé$!î&"""r§á¯÷ž Å¼í× É KÅdøs ½2ãæU~= ¹þ?÷m/þ¸\—ŸÏÝ|yE‰Ã墘»…_ÚÕÀÝlºj[7³z˜ˆˆˆHõ¬NËvðãá34 ñå×µØöØÅŸ˜#1\’ëagr:)²/m»îäyr~[Ÿ›WùͪæïÅñ´ œ¼b&wOJY'¥[*ñG}<8“™Í‡‹n”ðpÃátñšœµç¨‡‰ˆˆˆÜÉAxóéTÎdeóFÍRDxQÍÿâO£`_î/éÇœÃgHËvðpÙì-ÚͲ)LŽMäåµ/í'¯ò›Õ DQ‚<ÜèðÛþçM¢ãâÝÔ*JE_knS³¸7•|=i¿p‹Ž%3ïH.ÚÅÑÔ,ümš¹£ƒð„=' ö´R?¨ÈÕOn€þÕB8“•ÍæÓ©„zYùù‘(ÎÛ4ýqƒ7e\£ w¿¸f7¯ò›åm1±ö‘¸[h9wï¦apQæ?PËuÖ`ØLFVèIe³žŒ"""re]3ÂEIðοßaüÂìIËÁád&/}?ëfŒâžeS¶Cgòª–Çö‰Ù˜néF[ZUs¿6.ћ޽ñåŽF‘ëÌ埶aù÷£™µ7{i?7,ø7þCnÄÍ(mÿÃÌÿâ6¡yæå´qÆz8ž1ÿy9iðù¤ö|6 gÏ«ƒ{^ùáì˜prEdg&êÜû ½ê»ƒ}ÿûaà Í‹ˆˆÈu„íYì^·šM)çßÄͽ3÷߉[©9z%%8º=>€–!.8Æq߃·4~ö¬4²í‘øåïaþß1ueɼ+GÒô¶ûéKž&°&MäßOýLªo{Þ’ËŸÓWsÐ%¶ëÜ_/‘q_Ocmr>‘é÷Ô Ú‡8]Ô>`ãèš_óã,ÖïÏ Ðp% ªw |€®‘ØÓfðü£ß°Ï½ ðaîÄl? A º1øñ>4ö+N†¶ôµüüÅwÌÚ‚-¨!]»ùSþÜ·ã›§ñÍ÷3Xµ;³'•ë´¥×ý}éPÝ ëÉå~íØ9Ÿ9®æ€5˜v÷òHÿ6Tv6©Ë˜ðõDoM"Ó)€ o¡ß Ô÷=1¶Œ-Lÿæ{þ\»›Ãù®ÖjEÏúsK¤d.eèÀOH0ÅòÒèì}õI&¤mÈþ<|Çy/îž8kiDYm–ú©ŒíO§ÿm¼ûùÔt†‚_òè˳9ú>ùð.Â,eÔªJ:“Ÿ>9îãÌ~ù>’ŸýŽ7[xàȽô×Ù9¬yoïÄPùÞùèî*X(`Ç×ñò_øv~‹‘E’]¡k¬ÿ~$?¾žƒË#_ðZ3×2¯C¯‰""r¹üŸP;Õ ÏëÏÐ1 ô;ÇÜÇÐÇ›ã{žßÀ…·’ àÓ„Öá.%~bàÕxÃߟ·o…¿u/_}ŽQm&¹(„˜˜P©Û™7ú%^¿‹3>ØÎXÈØ_wawµ`ÏIfݤá<õƶ¹ãŽŒ]sõÅRÒí·íàŸ¼ÿî/ÄïÏÂ;¢ÑafŽìXÀØ·¾ek^‰6sW0rÔ"Ò]üp§€´Søhìz²@Á.Æ¿ö6“×%“íV™ ¶3yì\Ž”SnÛ‘ù|üÖ8–ìΦRÝ&Ć[HÝô#ßø’5Y%bô±…Œýe~Áxæd럟ðÒÈÕd:Àž¾˜ŸûˆéáV«) ‚ ؽ|ùï› ûIš9Y{Ø—U2¤Ñó¯ùñgŒ|¾.@Þ®m¶:È\û3AÝþÅ'|ðÙ(^éèSn­ “V“PtäþÇŸåÕwßç¥ÛãhTÛÂáã%È‹v/âó>ዽ¨ d/›Âêc…\0™5ùà×ù^öQž|õ Fpt×g‘½e2³Ò€Ê½ññ†ð¯´ö€ü5L‹?zæÃ𦭨ç`&(¶ Í#<ϹðrÊiÓö7·¿àZe9Þ$ŽH/wª6mMl€å \gÅoòÜkßL#7`ß2¶·cKߪƒ€o3:Tw¾€k¬€Êw¿Ægc¿å…Ænp}ˆˆˆ\ÿ®Ø]#Ìþ-xø­ç0^}yi Á&WœÂüãäÛÎ7b+é»ö‘x4êD¯â6=jw¤©Ïlf?ÀŽ#Vž Ò¾‘DúYÀ䆟—°\· îØ<ýq2ìv%3M…÷1ð¨?Ïú­eñÒùŒ6šÝ‰»H-pœ¹´Á-ŠØª®€kpU|YÅ![vG‡¶ì£lÕšîàEŽðœ¿€ìâèφ÷bØŠÜ“Ñüµ¯x:¤>5Ì«H8òï<üžUciÚ¬%w>Ô:þŠöžØÜ=–›êz÷]­ ­C&3é`* iÙølMàØìá<2»ä€m¤ìHå{…€oýÆTvð¤á“c˜ð/˜,˜r.ðê°’žXv›æ Üžå÷ê\N­°þ?\g'£°Gm:5rcù²D–$dÒØ¶œ}€o³Tw1p©è5æÔ€»ºÇRÙýÄ,ï˜EDD„/WnÎCo¿NÄ êtiC¸kù+CêÂ*ög¬cUjQÕO®§t³áK†~½‰Â°nô«Y"D” 'þa?#笅4ŒòÆRÑ}ämû†g_›É!¼©Ù¼­{ÖgóÏSØ^tv¦Ó3£g´åÀq"ñ°Étƶ¢3BšÕæ®ü糪,š=ÅËãÙz` l`ÁÔ¿èýÎpî2•V¥3ÿe·Ïé†t’A±ž%€K`æ%'úw”< N¦“£¿Pö²Û¼Ðí‹ÎØúäÙÏ[yµê^Þq9®³“ܩթ1îË–’°x›]Øñ%®Cu\ùÞ¤” IDAT.äsòÀÕtÇá¢WE¹a\ñ»X™}ësk¶ ÁæÀ8ºÔ2€4¦Žú…ÅûÚ26óÛ÷sÙ}ðÇ<©V«®@ÎúylÉråóY8U¡V¥+•ù 9°d‡€»ß`øsC¸«©;9EÒ†3AµC1€´e‹ØçG6Ûç¯%ëÔ6n4|a“&M:ñß^jäÄÁ…ßðŸy¤TïËëŸcÜÈWé]ÃÛ–¯?zz’3w=ó·dâÀAÞ¾%,9aÄyY¼†%'Ç—è†hÔ¨5ÜòÉÊÌ¢ÈâJ¥!X€ããI*¹lýîEò/Þ]x´ô»ƒ”ó~Ìï‚Ú¬Àö'g‘³’8”ëG©È,ñơµÂq"p[ð«yå®3÷Zhâë~á—õàGûê.ã»c¹þ]ýŸ…šƒ¸éÑþ,}þ;¶îžÂ›ƒ§àâéFQö‰Û±¹5¢Ÿ:øxÒ½êr&XÀÛï¦N¸‰[÷’„Þv ¼ 8~EŒ›;ÁÁIoñÚ¶@rvl/þÂìöмý0ðiÜ‹>[™èw^yd5Õ½2Ø›š[nßž^YlX¾˜¬åØ4/†`S:»ö:jDø”XbÅÂw#¡º?9{“É|ÚßES?gÜ:u'ú÷±lŸ?‚W³[î8ÀúÕ»ÉrªÏ#Ÿ¶¤Aýžtô_ÏìC¿ñÒS[¨í‘ƶ½ÇÁ­ ÿ¨ë{ï® ¦×•»ÎÜ¢¸©±‹§’ø¶ï@u—¿s]Èõ!""rý»&þ®S•î¼òásÜÓ¶Õ\)ÈÎÇÙ/Œº2ô“çéd—Ü3ü¿<ܹ¡¦T¶nM‚: ÁÛ}#q½‚ï-ªtœ6 ÆÅq”Ôø,½B’Y±þH…¾Èex6dÈ;ÏЭ^î9)¤ÚjеO[üË ”bèãÝiTÅ eÃJV®ÛM~P:y!±%nCæÛŠ»»ÔÀ~0™,·`êv†wj„§QüñùË#áæh_ެ^ÈⵇðŒíÆc#žç¦@3†{=½ó*}šWÇ7s'Ûös ¼ù$í..J]h›åmoxÔçþ§{äŽ\ <›2à¡¶x_H­Ìþ4½³#U\ }õoÌ=Px…¯37";5¥xqŠ/qªáò·®± ¸>DDDn†Ãá¨Ð’ÎøøxâââT±k\Q)÷×¹™TQ¹Ahi„ˆˆˆˆÜ4#,"""" Â""""" Â""""" Â""""" Â"""""×¼+ò'–ãããUi¹¬.ôg–«qP"""""—›–Fˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆˆ‚°ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(_ÖTf}ôÏ9ˆõ uéÈ\ËWÃ?gñ[ÙÛålæû÷¾c{~ÍÛÍŒ1SÙ•wáã±^Ègo¼ÁØÍ¹ô³ ’·•o†ÌìƒV “þbôÄ-d9ô¸qØÉXù!þ1Œ5¹ª†ˆˆÈÕ„¯RŽÂ#l™;‡Ý9I‹E¤,™ÅÁ:m¨áv'Á­ Z´¢^€lGY:r8ÿ[™ýìŸ]"Îa-i’¿€ù{òu¢o”œ¾œ¯G.#Û¦ZˆˆˆœdQ ÎfåÐÂ1|=?õÄ µoù»äîfñfòÇ|=ž5iskÍâØÊøÙ¥bxS»©?óo'³FC¼ õëší(K¾ÃVo/(P9DDD®© lËÜÉ¢é³Y³;l³aÑ­éÖµa®Å ®ðÐþœ¾M2)ÂßêèÔ£3õý,€ƒ‚Ô5ü1c1[“²°Ö¤i›pe”¤R“»y¨ŽÂòÍ´ò¦Ðd'®`¯wCºzN”¶ã;X0mkv!×ÉŸšÍnáŽŽÑøí`ÜGs¨Þ§™sþ`‹×<ÙÓÎ/L£R¿¾xþþ%óŽ|̰„ðÂ=?˜F¥OÐ-ÌéüíšË«Ã™Ü«5$xÚb¶e4 ¹Ÿ>¸ŽS0Gýoö·âѾi|ø™¦„EDDNºúPáfù‘¥95èÔw0ƒzµÀoßLÆŽ_Å1`MeáOÓØæÒˆîý1°ï-Då­â·©[Év€=s#ÇN'Á9–Ûû WKvMŸKj ’-žþè熹ÜÙÒn;„[õPÜOn›¿—?ÆŒgµ£>ÝïºG“¿b"¿¬:Z<ák?Æš©ó8Ú‚››ãt²)sm~Œ›Íßú¯ô«kÉ®Êj·œ:œÃ5„š^élOÎÓ³àzŽÁióõ] mÿÕ—ºšú9#ó]íÌß¿ŒuYUèò@ùš€*»cߘ•l8Ú„¾fßÊ]±qDz›€0¼­fíª òí6 ·,c—¹}ノZnUt¤òñ´Kô!k&Zñià}ª˜¹{–°!/Šžw¶£Ž§Ó3;éiG)pÖ"Ì ûзCPñ>ù©§š3 †aÂtVn)³]›ouÏsÞyhbéÞcÕó8Æå:JÁ‡˜3ri^â¹wX¯’ˆˆˆ\CAØFÎÁ#ùDîyzòÚ90’ËZ’3¬DÃVNJ`Ýæ’ìe×öƒØ*ÕlOÎÀjCØ©/±™ð ¤’i㥢=Œ ž®'W[9žt«s*Ÿš"¶زäï³aÕ}/°øå´ eÔ¡4.žNÍÅ Â×_ &mÎHƽ‰—_¬›šû¹¦‚ðù2œ;y{™;n<+ó*S›š:S¿ÊLÆ­;¹©QÊþ—t8gýÛaw€a:ÿº«Ӆ¡¬vË«Ãy®[¨]§ŠHÛº‡œƒ[y¥ß´3~òNÿÞ„ôþú„ë ˆˆ(_½ÌxWÂéødÛ ö-Ž€…‡9hõ¡‘…¼= XžÅ?žº›HW+‡’ ±Ÿ8<Ÿ*¾Øw&’WŸ(79I‰³_¢!šÜðq±²?ßvjÌÞ•}1­ÙMj^¾`ãØêŸù)¡÷Þé}ѵ8»QÜÑ`Ku(5VSU„‹¯ÛEÝéB®v.Dþó-þÛãôbøüícxãý‡>DÃÐʺeŒˆˆ(_-):~û Ïe&·@BÃ[ÒÐóþœ8§›ëá_t€ø™+È©Ú•Ø æl,ùIlÜ€s˜ Y{W1wQ:—ö. ALK"çLaòÄJtk‰Gæ6ÌJ†ß%ª 7UC,lJ>Ž5Ú ‘­©cÏ´ßCÛ(¼rw0oöN-;ám:^Nƒ†a#ïhéÙT²œ~¼¬v}Ý÷–Q‡<ü}ÎêÆžÃ¡#6*µö׬àuÉÀ50œˆÀÓä÷Äl²R¹z ª¸«B"""WMÎÙôßm:ëÁê÷ò› ê‹ëôÙÌúa99fÂbº1°k3üÍ@.ÜÙòWfΞÀF¼¨\»9ÝŒbí¤Ì[t€˜{b¹{PL[Äïß-Â\©&q·÷ÀcúâK4rBb‚É[™B®#o ÷ZÜ1¸7s~ŸÇÔ±óÈwñ§fÓ{èÛ&‹µœ lö¤F½¬X0ž¯3ÿÉÓ=KD›2Úõ0•S‡îgõ“ˆÄLbª¸éY """7$ÃápTh•h||˃÷õ¦wŸA<ýî/¬=R¤Âˆˆˆ áó‡àÂ#ì^0‡äGE"#‡—ÏâhtÂÜþŸîV…ÚÍZQ³’åo7åT¹%1ù X½?_Ä5™‚ò×»C·«*½ž}›/÷¥Î‘ɼýæD T‹Jp6+éKÆ0eQê‰jßòwÉÝÍú­.DßïÿÿþÎÂäQ“†k^¢Æ¼©ÖØŸÕK·“Þ½mº¶rpÚJfïp§ýëCèZß ¨E§sØòøD~ßÑKákaö¬¬ýc6Û÷¦‘kö!¨VkZunF«@QÚ–ÿ¹]I™XqÆ«Z#šÝÖ™H_ à ðà–ýµ˜=ÉY˜jÓ2G%ñit7½¢m%ýÉ´?Ê[°á wÏ R¼ÒÊÓ{:Ç|ÆÆjƒésK{&Û¾ÿÅiQtyü>ª¹Aáž_?!ƒæÿLdþºó=3GΡrïväÌÿƒÝžwÒ§»9#gÔ£ …ñKع÷6ïêwëE“OLù;˜ùÙ4|î{‚Öþ{˜YÖ¶€íØfVÌœËÎý™X‚bˆmÆ®©[¨ûÈ jy¸VmH¥?³'³õ|•„¯© œ—‡wdZUw=õ˜Ù»2þæB² l*ˆˆÜð®þdSx€ßýȆÜ4»g0=îh×þ™ü>q™vÀšÊÚIÓØã܈6ÿÄ÷ÜBÕ¼U,˜±•\س62wÜtö9ÅÒ¶ï:Æù“ôç\ŽXÏߥÙÿ€@üüÜ0å °€£ ‡p ÅÕLÞ„Eù’·o/9v ðŽóÀÑ"ÀÊñÄdŠêPÙåP™c/~pŒíÓçq¼r âš¿s±aëŸë07º“ž  YP ë~ŸKZaiièüÛ:òv±è»I$ZÑî¾èØÄ¿ÏápÉv\CóLgoJžž-×çˆ> ñ/šx¸ˆìŸ;•­öj4ªâª‰ˆÈ 犯.LZFBvZöëBmP·c¤~¿’G›ÐÄÇŒ_Ã[¹©~U½L@«Ù¾&ƒB» ë¶e0×ãÖ;o"Ü   ~ŽT&ü‘{ihÍäÐ!+žõ¼1Ÿ(©OÍ\ãw–× Ìݤ;Õ$Êk©Žc5spo&5kâe”5vp°ajЇ[Û·ŸŸ 6pkzÍb*abZÕeýGȳg÷ónë /q ‰¶:ßÞŽjî@x³v3iqÉ·JT 0±aÿ1¬u<´–æå(8Hü/ŸòÉÔ„õ~›NÁf¾UYDDDAøjf#ïЬÞÑ„”X êI€e-‡[!0ˆZÍ=8–œ@ÂÖÒ’ör`ÇAìþuÙ)m<õ%6îU#ñ1m¼4C´ç‘UhÁÝÕ|º¨1„X&±/-Ÿà£{ÉlIíÐcìIL!?ÖÂþcî„ÝR ³³sc?ÁìFP¸/æ’}šÝ õ:=ovÆt¾™ëónk%;ù(ÿ¸ž¾¼ÂÃp6ÒK4`àäáDQz.ºyĵÈNöŽŒúà;â3ªÒá‘÷tSuÜ UFDDäÚœà3 ÀQü¿¼½¬úi<›ó*S½vmªÄv&2l&36œÜÔ8g’´xÿK8g®9v­LD°•»R8|4ÏÈ*T ®ŠÓº¤¥XH7‡Ó ȹܱ7nÁÙé¬ñfœ,<†2¶u8¥ÖöÜz=Y®Åœ±ú¼8b¶f÷3üánDû˜U‘k#›q ª„%s‡rìøûÏkIä¨Õ‡ÚÞ ö-`ã±(ºUÝä%'¯/¾LnxºX9˜_òËGîÇ¿b V*·óÂÅ·6þ¶?ؾ΄-¸3.PPÖØ/ÿ©÷ ñÅØ’ÈÑ‚&x¸ØÈIJ¡ÀáR2.S”]„“¯›îµwqd¯ç píñ:Ãî«—N ˆˆÈÕ„­™9t ðŒ°er $ JKjy|ò)³±t¬‡wѶüµ‚¼*]©`Á”ã%?‰]›pªìBîþUÄ/MÇá’ÂÁ#DÕnIÕùS˜7¥­[Gâ–¹5ó’°ãw‰*èMp°…])DZÕr;±„ÁÀ½Z4žÎ#ÉR‹º~NàR™pß,–ï„À[«âb€Õ¥¬±çáís9+nà^«5ÕçýÌÂi‹iÓ2—ŒMÄÇg‚xz3{GÚðiá¯õÁט܄Y¬Î ¡K•\¶­Ž?ãi韛ˆˆ‚ðÕ2¼-¿1}ËYV»—÷ÅÐòþ¾8ÿ1›?-'ÏìCPínÜѹÞ& Z:ÄýÊÒy؉QÍi; Ší¿Í`õÒÔèK§þE,ûc‹~\„É¿&u»öÀíÅ—hä.TªLÁêòí!§îµkòޤª×<2<¢¨ä˜¼¨\ÃÒœ¨^­øÖeÎå½Ûå­¹áCû~=X6cóÆ-ĵJ,Íz´Ã6yÎ'ç"9ËŸÿï)D.ŒãQD ÓG¾Çô3~æD“WƪD""rÃ3¥.=W||{÷î À¤I“tDDnä08jɃ;TøwÔõDÑæRp 6&Ÿm[Ó¯­;+&³nÊ,ŒßIzVY)ëXþ×VLQõñwì™ì[›N•Ö1 Á"""rÝѲÏK‰ V]¨4q É zœøRÞ5ð.È¿9·Ü™Ë⹿2i^>†«/Áu{r[‡*X€¢ÔålsmÏ-áúã """¢ ,çãAÛþר ÍxÖº™®µn.=Þ‡u¡ç:µ"""r}ÒÞ""""rCÒŒ°È J_’‘f„EDDDDAXDDDDDAXDDDDDAXDDDDäú¢/ˉ\ÃŒQ Ta‘CYSDDD*NK#DDDDDAXDDDDDAXDDDDä:vEÖ‡:«Ð""""ruÑŒ°ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹ˆˆˆˆ(‹H…8޳úõÞ<Ñ·ôÿ^øb+…å4aKžÈ°¾½ùxyŽK4¬2ÛÌ]èC˜”XX– ØýÕ<1øvæ—8ìÌe|Þ¯7O¾¹Ìîü’Wúöã›My§+Úó-¯÷íÍ|Éž‚sÃæ·î.¥v}yõ¥˜µ9@Á6~Ò›'žüž½ùgQÞ:þw¾X—[<Þ¯à‰ç~ã°íBö;q\yûX=ῼ÷h_žèÛ›§|˜w?øÕûr°_ã—ê™×„ƒìßðÞàÞü{Ø¢3Îá9—xæRF><”M¹—k,ÿϲ—óÉýðû¾¢ËÒ¼ýØ\Þ¿ÿIf¥Zõz)7 ‹J rc1jöç±ûcp9óQ,>a8•·¯g-Zt½×Pg [*s^|š57³]‚0_ìx.Y›Î„4ŠÄ¼`»ŽX‰ªRüòV°o%ûmàØ³‚¹í©ë`#sWYFuꇻžŒÆ¤,^Æ1€ãñÄï@Ú.çvSí>TW‡‚ãØ<í[¦¿—χ¯ÒÜóÄv‡ç§?:ðìáöB[ýì™ë™™ƒ°î˜uoî@~cíª$ý3š— ”ÍÙ ',8;‘™Jí†Ð6÷ ¦}³„ØçÚã[¡,\þ~Žãk˜³"ŸÈ!htVÒµ„ÐâÑWðÜeàVêôe!iKÆñÓÄ$ÎÃäA“^qw _|ò¬óÙãÀ&žÄšG)4\©}ÝêGÿ4f½pæöïÖÏ]èǿ'ü¡.¤OÌú½yøÔëÁ}ƒrà‡/˜µö¹î‘´{ðyz6õÇ|r,¯}NïÊ›õø÷Tÿ×äÍœLüÖ¬þõéøà“tkà Çæòáùjðaö¾ñä9Ï—ÜÝ,7š9ñ;HÏ÷ ¤aîxõ*•ÿëÙvlDzÍûɲÞ´'½ûw¡šGñó¦à|ç/È p¿w6“ÆNfý®c8…ÅÒæŽè2–Õ”Ñ^`6ñÃæ'ç§ö|s<Œâkmÿ¸ÇymG^úoBŠÊ8ÎÜ5ŒzüG"Ÿ¹‹Œ cXç÷¯?{þëïÄuo=´”ß¾ú‘øíé8‡7§ÓÝQ¬þl)í?~›8Çߨ­Ü8´FXä†Ëº6ì6¶³þ³; ¼?ÀÝ 0mÌBÒ­y$Nü’u}øg§ÐÓåZÂè<âcn³Úïs>x©É™3ÌæJÔnHÖ–-dØ€üýlMŠv³5µ(âð†„¶ Ò×Tv›¶c,;×[Ÿá™aÏÑ%t³¿ü•¤Ò– ;]Ûƒ¼Äm³‚=s;›W¢nƒ(bU"cÝf2l`;¾ƒÄ gªÅ†žXR@Êâdz4¢Yu?ªµ®‹sf<+÷”ì%êWDþ±=¬™<•¿¶´t+Ž«ÐþÁxoËoë3+¾¾´œý SÖ’d §qoŽSc2|c¨ß4ŸR‚·õÀ¾úb¦Öƒyäõ×¹¯£¾ù€yƒÎ­}Ñþ|ÿKÖ»uäž—Þæ©gû“óã¾\N¦¹œóÏôTÆzWS%Z Å=5,Þõ!ïípV.¾f->!„„U!$ÈKEÖ/&3ïÇjÜ÷/¼r/;~áÓ§þË®ZðćsgD2 ¿ŸÉÁÒ†fMañعX:=Á3ï½Éíá»™5r<¥\*g½I)¥fÖ¼û ¿¥Ô¢ë¿GðÌË“3ƒ¯ÞüñÜuâgËOà·ÿ¼ÅœÌzÜþÜ;<õXw*mÍÇïÿÅPÖùs€-}ß ýŠM.èóÊPúw aÛØñœ÷t”Õ¾Dw¨}ûöæžwa«ãÓ îЖ £Çi;Èò/'V³;wt Ç©œñ;²×1áõXã|}_F¿[<‰ù OŸ§‹®­hFXD®_öïòb¿sxüžlé…aò#vÀ@âŸËøŸ·¾Ø‡®Ãn%È (ñKÒ0™100L& ÓÙéÉÀ† 𘹚}Ùwà›¾d×XšUÚJâ¶£Ø#,$nNÇ·aCüÍée·é€ÐžÑ½yeLDâ×:ßÏq+œ³nBšD`Z¶¤œ^xí^Aªk =‚Ý hX÷+ØÕúI8dT£]õÁµ`/+ã3pí@¸›Kd;"̫شhw½ˆÚžœhÎ5î¤ïÍ ùtÌZG!ªBSeïgÏ>FÉ_·ÓZ÷ÿÈð—~ãt%}h=t÷F9mÍØG†Q•›onK´¿ "Ãð OÀäe:·öEBnÀýíºMO> ¹IDATRÇÏ ÔÄ'mËg&ÏÞežÿRòc}—Yý˜MÆ%z˜©~ï@ÚÔñÁÀŸ1Ø‘s÷tk€~Ý0ó£²J›\¶9ðºånoŠ ðíÑŠÙÒȬÀ÷×ήqÑž¿˜¿/’{>êOœŸ ˆ$<Ì`ÿß²xOªÇ¸”‘ƒgEF½þs?ÍÍ@a^‡H|}«Ro¦k`YçÏFኩl³´æ¡'葉§u£qìfèè¬ó¼p”ÕžAPýNDØF³21º ܱ&/aCF8Z„`ß÷}ÙÇY °bj÷<ßubm|Avý9`ÃÖ5gà£wQßË€èêôOßÈ;¿žÈíû.¾¶¢ ,"×±Ò¿,gÂ5ÄýÔúK³îî;Ÿ·F/$ðÞhvá‹M«6'Âéc6îÏ¡FÊr«ÞA‹š‡Ø°>‘ì¶ô¤ö€P,%â[é™Å‹ª5ýOÍ~N®eÌú¸E4%Äþ Û’3ñ]µ "¦² 8WiN §Ù°'ƒÍ{±u¢ú‰V¸w>»Ý.²xfÓ«6M# ¶¯™Ï~ÑÔ,9ÝYòËr8(ÊÚϺ_F3cÔTê¿}¡g Çš½‡ÐdÅ&LíÄ‹=+z’οŸáêÅ~Œ¬¸ÂÒ•‡†5§ÐlcâˆßKm֥ƭ4~“ñ?̲æ-¨Û„Mãñ0Ÿ»>Û%œæ·ùrpçjV,KdߎÍl]³[pË‹ºîÊìûJ3{àzâz7°8;áî|j9‰avÁdäŸwßjQ•J\.˜/ê³UyI;È(ÜÉ„§þÉÏ'¯i‡•"«GF!\Îó=+™û“)ò#¢ÄÚç°†„9Íaßá"¨RÖù+"=ñ0¦*½N,£(~sà]»æEç9e_†OZFYùuI"ù ¢9²|9YÕ{`"o{9ÇY 0{P=&øt(q){üÇv¤â¨ÜŽª§Æï„LnF*`ÿµa¹¾ƒp…¾,g#ÿØq¬@fRŽªûȹ$·Õ°2u]"ûRÓðkE•êµqž»š}‰N$[bèXµ³2†.NïÜìCt¥\6oÞ„û¶<*÷Œ,8î4¬nã×[Ø•”Ž{t}Š— æs`Q87+Wgb©;˜§Þù€Gÿ÷Â+}©jd±iÑnÊ[þiòÀ|²ò쥾Ìú´Äµ’ùsÌ\ŽTø­¥ïg®ÔœŽuaë¸ñl>vÖ4®í(ë'LáÐyÞÜdn˜ÌÔ™{ðnÔ•î¾Ès#GÒ»ê–ÎÛÇ™Ÿì;ÈÝò ó6að;oÒÿ¾;ˆkTüüó^Ɖ·Â¢“[qlû~òíÚ÷5ü&³Ìœ»µ[h5ܳv’\ä…·¯Þ¾~xؘýýseÎay‡‡bIß̞㧯Âä $àTÎùsÂ/2{Ò*öçœìÇNÖŽ Å÷´>7Wàz0ð®ß‰jyëX?ŸõÙµhÓÈÓE§£üñGa¤n ùÔþVŽíH$×^üܹøÚÊF3Â"7{ö~ö$¸sö\¬É%€Ðj8[“Xð¿_ÉíðÝ;Ô$-u}ù3qï>@ÄY¿ÈM†ÜÔ=îC ÏÙ5šð®Óÿ±ØîÔ„v!ή5©”Îä5>°6¥|ñéŒ6/êö_®Tn\cùV²|ºP;àäËœŸ:Mñ˙ĪӱzñR‚ÝóÙ”åAÃ툨V"™;|èTo"ß®™Ïü:D–1…n˜-˜ydåçþoæZ¼›¥/L 3•*z(¥ígªDÓ!CØøêH¾~zÍ»w :"Kæ>¶Ï›ÂªÜš„¸$—¬-öD–ý<“£¦A´¯ãOáþ•¬I5ÐÞ œQ{/wœsw°zñj\"ÜÈÜö¿O=ˆÝm»“s¨rÖ¹r "Àù+~_D½Þu0íù‹‰sÒÁT£B}_A¸Ì”r}Gt£mè\f~ü5ý:jÛǺ߾e©£m=Ëž§r©u;Í}^ã×OÆáܧ … ,üvYµÒ<Ô sFYç/ŸfÍn'ú§ÏøîÓÊÜÓ£^é+™9~v‚K íæò®‡j˜}Ð2âü0n&.už!úÄ7Ë;Πí/¸&=¨?þ=~üb ÷ÞÑ÷´ÅLûã(U+Ö§È©WF¹±$þÀC_åã³þûð£Y±qhÖçÌLoͽwÅàj¸Pµç#´°ýÉø©»Ïü}eö#ªe]ìsßáý1ÛJ554¤Ž?P¥1anÅûÔ¬„Ñ î¹·?«H›™—óŒlJàR»!%¿%¨µ½€†'ÖVæ±á*rüÚÑ>ê¬éiǘ®MpÍZÍÊÝùe¿z‡à”Áº9[É9Ïý§,U»Ó·{ð…ÏV”²Ÿ)°#Œx^­¼HY4ïßû/g¬%·ÎžúíÃ]J­‹{ƒxW‡¦}̧¯½ÂW?­Å£ë³ ì‚é¬ÚuЯk ;ÆàãáŸ0{O÷¾ù=72ã·í˜Î:WnuèùÐmlýšŸ~ogÐbP7‚,èûzyn•YƒR®o§jÜòÚ›t¯’ÈŸ¾ÌGŽ'Áï.~¦Ä>ç»ÊÝbè5ô%nòZÏoï¾È‡ŸMãHô žz®+fp-çüúµã7¢~Þ|&¼õ*c~ÛOÔàLjõ.}Ñ@yí8×Ú"1 ]ˆî\ÿôÝ‹8ÎrûóŠã¾×¥^æŸ|7ô5ÆÍ)¤õc½ suÆÕb\TŸrc2G…>#ˆ'..N¹R U‘ó±glcÓ.35ÕÂÛ à oÃÇ ãÃC駱³jt)…^ÇõÔŒ°ˆˆˆ\Sy;™õÉ[ŒŸ¹Ž”ôã¤'.`òØXš´¡²B°\}@ """×sån ~2“Ÿ~üˆw'äbxQ½Õ¿x¬OÊÁr!´4Bä*¤¥""rµÐÒaaaaaaa‘³ÙÍåýûŸdVªõï5”»†Q†0)±ô3Û’'2¬oo>^ž…ã2ösÉýÝþ²—óÉýðû¾¢Ë[a‘+Ä–ÊœçþÁ»¥a«Àæ†g-Zt½ƒ&¡Î—±¹:éO,‹È;àKç~±*„ˆˆ‚°ˆ\ï¹»Y:n4sâwžïAHÃ.Ü1ðêU2“µú#Þþ<®ï¥]°GözÆ?÷‡z¼Ç“·†ÂÑ5ü1ú{–nN&×9„Ú7÷çwÇág)«]K9ýZù{g3iìdÖï:†SX,mîˆÆ~jÔ…¤-ÇOx8“OMz=ÆÝ7WÃ¥ä4®5™Y/<ÉôTà»Gyzõ‹¼ûopP”¶”_~ø…U ‡±UªOÇÁOr[¬/¦Ü5ŒzôK‚^ûœÞ5¹¼ý<þ#‘ÏÜEÆ„1¬ó{‚ןnˆK™u)㸋«zþþÛ±uü5zË6ï'Ë@xÓžôîß…jgÏ}—W‘ë—ù7Þx£"&''¦Š‰\Y—ãóvk Þ~iYÍé1h ·´«‰uýOüúW.1c ®ƒÿž_øu•/M[†2ám¦ÞÉ#šâY°…‰/c¥W7ú éGÛh;›þžuî­iQ#‹…e´ëKj™ýze.bÌË_°#¨÷ùÍB±ìÛÉ(ô¦V—.T˘Ì'#fáÖy0÷ÞÛ•h·Ìýi4¿™(óéã3yqS+œVÍ!»ç§ …³5•U¿Ïfý¦,jÝó(wwo„çþ?ùs^õ:7ÆÇžÊªkðhßZ9S.o?Óg“°9G.tlK¸ÿ±2ëæ™úëùÇã~¨ìþŠ˜òò,4ZÓkÈ@:5©DÚœ±L]ïCÓ¶‘¸[“X9s~»i_RfýkziÈÎË|ý›f„EnEûþbþ¾Hîù¨?q~& ’ð0ƒýO|Ëâ=}¨ãGì€Ä??–ñ?o!}±]‡ÝJ“ƒœõSˆÏmÄ?íMC¨Æ}™©ü’”Âñ½Ël7̹¬~{ÓuÏT¶YZóГ÷R×Ó€ºQ„8v3ttVq~ÏØG†Q•›onK´¿ "Ãð OÀTJ@3Lf “ ÃtbæÓ¡=£{óʘˆÄÿ®u,¾Ÿãg}ì²÷c-ÄÔîy¾+ P”øM™u»ÛZÎxÊè/çï¬Èˆ¢×î§y ˆ"Ì뉯Ï`UêÍtõ=uÔ[QvýED®g Â"7yI;È(ÜÉ„§þÉÏ'?wX)²ÚqdâÀ³îî;Ÿ·F/$ðÞhæqlg2¶ Û¨êyrG'Bº¾À8È\8©ŒvóÉ-,«ßÒcªÒ«ÄGöf¼k7"À¼—·Ò<øMÆ?þ0Ëš· ^l4#Ä£‚Sf/ªÖô?õÍ`ÃÉK)ߌ»ìý˜=¨|âE·üóá\¿Œñä–ÕŸÌýÉùÇá{zìÎa sšÃ¾ÃEP"—Wa¹ö£°ÝÉ»#ƒßìKUç’?10»{ž¸k‚ücDZ™Ii8ªb1Š÷Åd*õÎ åµk]ZÖÏ]H]kœÛ®éôc†gzM‹ ËÙ°n& cúènùÏPn‹r+ÿn†.Nåßâ²÷c¸àVb±qyu39—1ž°Š×éf ØÏºQœÉTvýED®gZü%rC0p ­†{ÖN’‹¼ðöõÃÛ×{³¿ŸBbnq8²ø¦ÑîÁžø¬ø’i[sp`Á§FÚDRÎÉeãÈÜwñßÙä„”ÕnyýZð‹ ž´Šý§Ú¶“µc‡mÅýdn˜ÌÔ™{ðnÔ•î¾Ès#GÒ»ê–ÎÛGÑ%«Ï•ê§¢çÃú7ÆcÆ;<Kúfö?½Ø¼0yÉE„8•ØÖ©œú‹ˆ\ß4#,rƒpŽèFÛйÌüøk<úu"Ô¶u¿}ËRGÚzš (‰ÿû•ܯѽCMÒRWðÑ—?÷îÔhЃÆNïðÓ¿BÏÆød­aúøuÐí>‚"k—Ù®³GYý:á×ìv¢úŒï>­Ì==ᕾ’™ãw`'0a±'²ìç™5 ¢} ÷¯dMª‰€ö¾¥¼€˜ ¹©8z܇@§ŠÏ \™~*z>,åŒ'§Ì¶]jÝNsŸ×øõ“q8÷iC`a ¿AV­4u‚¼Ó¡¹ìú‹ˆ(‹ÈõÀ©·¼ö&NߌåÏçrÜæEå&wñðݲqhÆçÌLoÍà»bp5 ªö|„K‡2~j{žïÓ˜¼ùo~ÿzãßü‰|×jwz†ïÇâDíT+ûçþíxàB&žÄ„·~Å\9–vƒÃk̯€{ƒx×—Lžö1ŸN°aòªB®Ïrw§s?Ò2ûÕ².ó'¿Ãûé¯òæÃ-ΕꧢçÀ²ÆS˜\öѸÅÐkèK¸ÇoïN'Ë@µfƒxªÿ­œµäÙTfýED®o†Ãá¨Ð_'..N¹R U¹:„:_¿Ç¦5Â""""rCRaaaaaaaaaaaaaaaaaaaQ¹YT‘«O¨³j ""r¹iFXDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDD„EDDDäÿÚ»ûبë;€ãï{h ×Ò–ÖB 8,˜V(h2æCði*Ëf63|Z–™-™Ù˜ÑlCeJÔls3jÄ-º¹E·Lç|@Ý„ òŒCÇ3By(¥¥íÑ^{¿ý Ì"9Ó»{¿þ$w|?üîúþþî{­ aI’$Â’$I’!,I’$Â’$I’!,I’$Â’$I’!,I’$Â’$I’!,I’$Â’$I’!,I’$Â’$I’!,I’$}¢Ž@êþ^ÙZÏC«¶³j_3MíYµöâ¼(£Ëzq÷˜85E^ ’$CXÊÞ¸‡ëÿñnÖ®ÿ@[oÖ50wÇÞºf㻈álÞ(¸i$CXÊX÷,Ý À}cñƒ‘ˆE#Yµþ–d'?\´‰'ÖîdzíVæ|eäÇ6 w.ÞÌÓ“†r~Y/òs"Y{­4µÞ4\=û_üýòsºÜ4H’ŽòŒ°ÔÍmhL0í¼Ïe]äçD¸Ü –ï=ØåFáéIC™Ð¯8«# 07ÊuƒËxdB%Ók·úâ‘$CXJo©€œp(kgP’—@cÇ64&¸°Ü;ŸÇºb`i—›I’!,)Ã6 Ñ,Þ$t¥(7Úå¦A’dK’$I†°$I’ aI’$É–$I’ aI’$É–$I’ aI’$É–$I’ aI’$©‹:) ¤’¼ýîfîZ½%IÚsòøBEӯŹáŒhövžz~7ï9þm1Þ§ˆ+‡Ç™1¬ŧòGëÚö2áéM\0¥šÎðþ‚$¥ ß±¥Ì¯`Ö¬\ÍEó(;»’—®­bî%q.v3õ…µ<ÙyX‚ŸÏ¨w‘mœ7R^Éœ)U,žRÅÜÉ•|§´YóVpñòfZ?õÿŽì³$u7Þ–2]ò ¿^ÝÌ ÑcøÓè|ò(dbÿ|ÚŸ]ÁƒïµpãØ‚#ÿžrzÄÝ·Â#³ùÒ 2&®ä¼¥xnè(n.yIRòް”ñR4wÇÕ_/¦]6‚Y•yDS­Ü÷ÜîhH±zÁbò^ª§hoÙÏôÙK)bá'3vΖ¶y~{=—þv)3wìá¶¿¾MÙkûiRíy|î âOÎ#ôøB†ÏÞÂËÍAšÍ,ˆá¹˜F~·#Iê4×uÂÇž`Ι13I2„%u79ÜR™ËÆeË8û¥õ<´áï%R„è×·„/—æ ǸóëÕÌìbDÍXZ®*¥(ÙÈž_í½™yE /À ?{›S_‚Ys·°¾ÏfŽÈ'–jå7/¯dZC!wO®¢öªJ&ÚÎÕ/nfq2½ÆÊ‹1¾6ï>Ä¡ÓY×'=¶³‹9gÐÌ$)Ýx4BÊüæÒ‹F³°o®ßÇ}ÿÜÉ¢âÞ|cDœ{†Q†p(D˜¡pˆhwmç©ÖB~uíYÜÔ+2²G‚/ÔñÌ~L/:Sä =‡WÇ>r‘س‘_Ô÷âÑožÅÔüÃÏ9¿$ÄÒ?läñ½qÆõ‹¤Q G(Bk[Š–};?y]¥GŸ–8ÙcËŸsbïÎÌ™™$Â’ºp.5ÃS3|0A*É{;÷ñû5ÛyxþJÞlªbÅ……÷„€Ýõ­$ ʨ‰=›_RÂÈÈ.–ì„ elÿ/>°¿‰ºŽ&nýã¾ûáÓ‚€D* hM!mNÛÔw@,/LÓÉÖUztn'ŸÁñ2jf’dKêNû¶q늀Û' dtBᆨà}¸va-¬ÛÅšêB.<ŃR’Ö\(Bqôh¦¥‚€HÏr^œ2˜ªÿzwÉÍÍI«  ÚZY؃ûæ‘›:ɺ:9ÿ»"2if’”n<#,e¸H8ÅÒu<\wøK_ǽ„€p¸‹qˆ¾¥1z47°¨õè=Ì–†Vuö ºW×oÅÅ”$²º3‡ŠX.±\ÊRÌ\¸íéôå¯NV­}Ÿ7)â–þ¹”œòºB§=ƒÌ™™$¥ïK.·¸‚ŸÆ·ó­×V¨:“¯•÷¤”$ëv|ÀŒÕI¾XÓŸ‘Q áP@Ã6µæPYq&7ÆVrû›ˆ]Ї!M<2¿Ž=åC˜Ú;LW¿7¿On뽋Ÿ½¾ž’š F¤šùËòMÌ"Î÷ztß{›ÉC-,Þ!Ÿ€ÖD‚%[vpﺪªÏçú‚±ž'YWòôfp윇¤éÌ$É–Ôý…ó¸áÒ1œñÎî]»…©Ë“´…£œYRÌM—TqGeìðßp.“*‹yxÙ;T7`ûä~yݹ¿µ™i/×±'’ǘÁCX8¾?g賤H?¹f±ù™ñú.v¦r87>W' àóÝøó§Î6qÙß>ZËŠøöijùù°b§»®“>öãsNÇ™IR&ApJŸ½ÕÖÖR]]íĤÏúEúØ<‚Û&:‡.æzl^ÖÏæDór.’ôÉ¼ß I’$CX’$I2„%I’$CX’$I2„%I’$CX’$I2„%I’$CX’$I2„%I’$CX’>-ÑpˆŽTà ŽÑØÞAQnÔAH’!,¥è$³8öö·%ºŒ»a½c,ú Ñ 対_ϸòB!I†°”Þ†õŽðÐÊmYyç³=•â®Å[ºŒ»é£ãLóo^Û¶ŸöT*«¯•ÖŽNžY·›ïÏßÈÝcâ¾x$é$BAœÒOÖÚÚZª««˜ô{~Ó^¾úÆZwí¡o_wãú~<†_ÙZÏý+ÞgÙžƒY}ç¼g4̸¾…̨DME‘/I2„¥ô—Í¡gÜI’þ_ü6…”®Œ—re¼ÔAH’ô)òŒ°$I’ aI’$É–$I’ aI’$É–$I’ aI’$É–$I’ aI’$É–$I’ aI’$É–$I’ aI’$É–$I’ aI’$É–$I’þGÿô ®[¼%æIEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/74_self-service-api/000077500000000000000000000000001516513262500271235ustar00rootroot000000000000007401-director_self-service-dashboard.png000066400000000000000000001536261516513262500363670ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/74_self-service-api‰PNG  IHDR›¹vÚbKGDÿÿÿ ½§“ pHYs  šœtIMEá m(; IDATxÚìÝh[{Ÿà÷÷3sÏy:>KGêŽ4‹5ÝÊËZ,{þX«`ítŠE±ÚÅYˆ·Á4×&‰©e›8¦ŽCƒë’ø®} Žl?% ˜§‹)8¥6;«@í‚;2ÔÚÁ¬\Öb:2O¥N¥戙£™IÿÿÒo;7?îç—{¯­ó=ßóù~¾ßóÑ9GòOXÚz‡B!„Á¯H„B!„›B!„BŠM!„B!¤ØB!„ÝOÞ½{'úœhy[‚ „Bˆ/–\ÙB!„Rl !„B)6…B!„bS!„BH±)„B!¤ØB!„BŠM!„B!ŦB!„bS!„B)6…B!„›B!„BŠM!„B!jñ„àÇé§¿fáfûßæ¦ãoàüé_“ýÓ?ãwcÈÿøïÿ”?‘ð!„ₜãʦAäáUŸ`ÖðÚXð!ƒ×®11.®÷fœÅÁAž˜•Õîgâ7ÿSÑ6þE«Ê/“)^ýÁÿË¿5›øgÿÕÎ/ÿéßáª21„Bq1~˜+›fŠH$IëøK¸5‰ú§dù-~÷Ÿ4ó·þÃð÷Þþ’ÿWG¿úgó·øÝÿöï²ýs8ÿ×_òÿH´„BqN÷Ìf&ÄØà ;;ÏyxûW¯^ãîüI3ÃÖÓI6Ó9vgG˜‰Å×γ³µÈØõÛ\ L±q÷“{…dbë<¹{«W¯ríî ëq£t»É×åÛ)q,fr‹Å‡ƒ\»z•«ƒc,n%ù<®‘~ÃýÛ‡¶?ý#:OšñÇÄ•âÏ—þ›ò8¯B!>§b »ËjØ…n…•ï°FcÞÇStÛ,tN-óÀS¼²™ ój[ãʃqzµKKa,}Ó¼XYaaÜCêÍs¶R`î˜AÏÔ V^LÓ«n³ŒabçòÔ ]ÓËŒêêÙvóWË÷5böÉ&Zï/V÷fY› 7Ë´[ñ¸íÓ²ÏÒd€¤g”…•–‡tâK ÄŒO?Ú¿ÚÄMǯð±CþÝ_•~ÉŸþ!ÿ*÷ -ÿ‘Ì!„BœÛßFoÆ×ï¥EZÚérÙ4òe^k£Û?À%€¡¹9,;* ZlhJŽ´Q¸˜ÏF\.|_Ò‘W(_k7.ûªdx„³ñK-Xk÷(£Z%(õ÷Ñ>È$¥›¹;€»áÎ-žl$0uõ÷ßú)d³¥¯³þôoþ¯þ ;¿ÝNýïó¯›þˆ{ÿÇÙ+ B!„Ÿ¦ØT4–÷ÿS¥¬R,Ç^ FlÀ|œ¤ «F:.@u3å_c-0ÂjZÁÙîãJo—ZÔšÚ-ÍÄH(vž Uíx|ö÷¿®ó¸öi¤2äÓo¹¶ù¡fÍçó(ºA¾zT>²¿$ñÐiQ¿<óÛ¿øã_ò*÷[üw?…è¿KI¡)„BˆÏ¨ØDEQê­™çÑšÆÐÔw\rh`Ƙœ/Ô}©ŠÞËÄ/03Dß,1?™ÆþrW½}0³$²…×h6|,EW±Ì°ÚEm÷¡Wû Ó‡vÎîS±h(Í~~îÃþ¡’ÎÁÊ'ÿhÔ_åøWÉ¿ææ?ø-þáïÇù½¿:[Œþ›ÿ=ÊMõïóÛ±ßçáÿµÌ!„BœËgñ)Ó4È£ *`¤âlƒìæL²ÙÆjº‹þÖ¦Âï=ŒzHǸñíϘ\‡žøµíVjç4ÍÃðÄÔÍIn|û-?{²W&õ|&_ù”ý#þ›ÿíøåßvýï=lu¹˜ÿ/ÿëÿô‘ðð/šå{þ…Bqq~òîÝ»w†Ïx€–·?NÿfáVûoÿ‚d3Ê›ØòÏÿ¯?“¿ $„B)6¥ØB!„øüÉ7w !„B)6…B!„›B!„BH±)„B!¤ØB!„Rl !„B!ŦB!„bS!„BH±)„B!Dò„„B!ÄG#W6…B!„›B!„BŠM!„B!¤ØB!„Rl !„B)6…B!„bS!„BH±)„B!¤ØB!„BŠM!„B!ŦB!„bS!„B)6…B!„›B!„BŠM!„B!¤ØB!„Rl !„B)6…B!„bS!„BH±)„B!¤ØB!„BŠM!„B!ŦB!„bS!„B)6…B!„›B!„BŠM!„B!¤ØB!„Rl !„BÁ7 oi¼sŸÍìûXèþ~™õý 8ÞáþÑ hêšæå-ªÄýócÆ™|D88‡x1çÅZóÆIÖo°šÚó;îÏsŒÏuŒïÛHšŸ!¸{Hh½·Âw—´ô02{lFÓ`k£û²»þcøÊú!„âk-6ÏÈKð¡Ø4HIJañU1¢»‡ïß>¡ýàUµI:²Æ›·9h2ðøÜX?Ieÿ¹ôC!Ĩ؄d$éµ®j™‡D’à ®înº’&ªËþu›ÙLñ¿œ ½˜Ã+—ó„Bˆ ØT,(ù,ùý(IÓ]¸¸™Þ#‘?ö»ÓÛ˜IvVƒ¬…cfó@6§__=îbÁrì¶gSçc¸Â¼Þˆ°˜£©¹ž[~ztk}meö^XÝ&š0Мzý>f'y›…æ›Ëüüòû×›$w‚ßìKdÁÒŒS÷1࿌«ìÝSƒÉ<‹´1¾2§øZ36ÏÉ0yšèœ~ɰK-v}‡Õà"ñ霂¥ÙI«·÷±+Fæ“ß>%Æ©>–úùñØuMó{‹ÅÅmŒÞ…cÇVcß  K’Í7akuÓÝ“ËbŸeos“·iP²—èó:ê»zƤŽq®ªæ~fýŒ@âý† –~v•µ¾~ÑmTŽu­ý5SìmYÝŒ‘Èæ@±Ðìjãr_>W‰>ä¶yôm„Žé—Œ:åûàKÖž75y¥~Ä.0G™{B!>7ó!‹ŽÞdc$Œbᑚ\:–3dØ™ãÙf´xòÈ‘N„Y}:I0nžÙ"™g2°Íþa®ðÿ‡»¬NÎJÕßf&2ÏÈÓ7ì&²äÉ“M„ <š!œ=[4ƃcŒ<{K4Q(˜óÙCöïx42ÃN¦\@4ÜÝzñ¿cl%Ìc…k¬Px7yð9Õb‘µÈ‘glF¤sy²‡ûì®>åg^S"uÉ'Öx2û–ý\¾îmS[O¸ýèáýC aÍ‘Þójò>‹1£¦6ª]=cRîÔªr?Ul­:NÛÑëm­:º­©J¬kí¯ÁÞÒOWw …&@>Ëal›À£GãÆ‡>4ØeͺN«vqã]Û˜×Öóåh£sO!Ä×Yl*6ÚZ IäÐL£…ËŽv'gÎAÉmV£…“г{œé…e¦úh Mx+Á™’!ú•{LMOq¯«¹øÃ}6"©úÚ4ã¬.†ÉØ:_^áw^Lq¥5GîL?C,nžÏkîžâÅïü/¬|ïGW€ì.W1Ê•[šÞM¡ÜÌûp•(nfÃ}üŒiÓq5Q¼]8CgïïáFyzãj‰Æ’dA/YjèÝm‹B6B4݇=¹M É·x =ŸMûÓL»ëøU2nWoÒ9ÈÆÉš›ŠîÁÙÀI9ŸJûfGo>j@s3÷‹ÚÛ©6vµIc¹sQýl(Öµö×Ö†§y•7‡m²4¹Éœmítú.ãÕí5T£ã}‘c~¾=ïÜBñU›Š£ §²I4a?¡n¯¶x°)%¾þ(afd–ÝâÕ,[k;]ºth“h®ÁÔØ¦I•ɇ—Zpꎳ(ÍX*\nÒtmJ”h>M8–ƹ/5n­55_ÉÊW>&¥Ii(¤uÅêêÚÏÇÈ‹,šNǺÖþª-ôÏ-à ­³ ;ÌYÑ·¼Š¾åMÇcFÝhô¡Ž¼ùhc^oŽžsî !„ø ‹M'ˆ&ö …r@s»M‰žyi*üºxòuâ_žÃgÌó›› ï¾Ö65« …yÒD>{á4f¦#ÄO+*šSƒp”V?¨ÿ–¦ãÓ¢Ñ<‰Ð¡Tá“Èn_뇫TŠÅAûä8d7žá²ýýÕÍ4‘÷²8±¨œ¸šK»µ›Mò1>/q«±CŸõý'ç·X %È+:{}G_­zîýT““;S­ý53$Òy,®Æ/£dâDÃ[¬¯½e?Ùð{~7çýþøjys‘cÞxŽ^ÀÜBñÙ¸¸?W©j8u %º›šp¹,%oýå³GŸ8=H$ÉdˆŸ>ÇE•ZÛTÞ‡ È]œgcXˆ¥'oN>ØÚ<…OÒçwy½y€˜Æ[3ƒ\»z•kcë$+>§¡ûôÂÊÄÛBÑÑäÆw첦êôâ)~Î"xÆú^’Lê€ç3¼)v¨Ùë.ÞB×xÿáçlh•ͽ8±-žÏ¯rø’ã(V9‹vR¤â;g–x³¹Éævò‚÷S}L>Fî|Lµö׈xôè=dq뀬꤭ã2=n˱ìÔå¯CÖž7õy©~\LŽžî !„ø\\à—º«8<­(›»ÅO ‡Zòà 6ŽåÍ6YÒ¼á- ÅÏL€QÿY¤æ6µ6zŒ¬& åÕÓhù#jéÅßf6œeõ>7VÿÖBg_'Õ>€«éÝèJ”â’ÏÞBWuú†;ˆÎ†Éæb¬>áÄnœWîv¼¯èöÚØÞLC>ÊêÓhñµ <\XSâa`@g,#ŸÞæÙýí“Ç?Ô{õŽÉÇÈ©ÖþZ=ýt­Mò6cwé>»K'ÛiêèE× óÌâh²ßeòÆÝÓÓ 8*VóµçMÍc^¦-“£1÷„B|~å"S›=|8ç5·ã,sËOuùyìïÀÙT8ñÚZ;ðO/0TüjÊ|ô á:ï ×Þ¦Š£gš…¡NZ‹—`ššÛè{ü¸ø53'¯yFøÞßIëû(M4·u14½À°»†?£¹èÖß?\¦œ¸…þžÕ3ÊòÂ]mÎâU!Ks+í}y1×ìSä*-}ÜëjŦNàÍzãߣ¤qø¦Xžê£½ÕF1ZØZ;ñOϰû¢>’\û˜|ŒÜù˜jskz —N³å(_šl­tô=fnèèyM»w˜+z10ùT ª/ojóÒý¸¨½€¹'„â³ð“wïÞ½“0PxŽîÆ$á<8ý/˜ó]ÜÉ,³5ÆÏ– ´3µ"ÏŸ}c"„BˆÆ7?º#N…˜™Ý iªØ/2îs ™è{Åït\ä—šIv‹Ï¹)m—kúºŒÉG!„BH±ùÑØÛp+Avy# n´Ò¢f‰%ŠEií§ï‚.=&×Ç[MŸaµàëmEjÍO;&B!„øaý8o£›I"›k¬…öH¦säQ°Øœ´u÷ÓëÓ±_P]“|}—‘7‡ 4Ó>0ʨ¯EŠÍO<&B!„bS!„B|%~EB „B!>–†ŸÙÌd2=!„¸Š¢Ïç%Bˆ¯’ÜFB!„ÜFB!„Rl !„B)6…B!„bS!„BH±)„B!¤ØB!„BŠM!„B!ŦB!„bS!„B)6…B!„›B!„BŠM!„B!>b±™akì*W¯–ùçî©Lˆ±k“ì™g·6ã‹\¿z›õd}{mt»Ú©|Å•AäáUŸ`~ÊÜ,×»ø3w¯æÜõ»Ì¬Ç0ÎÕ7ƒXð!ƒ×®11.®£fœÅÁAž\ðäúXíVÞ)±ùë…5îôÏ®>d's,š‘ÉÂÏ’ŸÛÚb›¹Îí×ÉŠ¿û9-s½T×"<¼z•«ƒAΤºgñúU®^}r¾üú$s©Ü¹8Æúüƒ× õĵÁ1fÖ÷È\ôq¤6¸û~^ûïãû±âr|ß?ß4¶™ïô ž|aqŠ/Ž0›fy\GP44#TvkÕÑÍð½¶úöÚèvB|l?xn{,>Y%í›àEo+ì‡xöä ³–e¦¼ÖÆúf¦ˆD’´Ž¿ä[“A-=Ò8;](á0qã2v 0ìÄr@‚í}ƒK 0IFÀÙ«IrZæúȆ %ú¸åR¦ìþ&‘ |-ÑM²þt’uËM,xiµ@v?Lp~–Ic޹~ªäý©ØT ­PYþWÐ4í(ŒB!šÜ^du-L" Í~ yq˜û¬-…éó¸qaïõÍ(韲ۙ½ Ï!bigG/>cg9Ÿµ|\ˆX9·ÏŒÝ­µÊ›îu–ž¯=Ì¡4·Ó;ôÛD—~Y6ŸKÇÜ8Û®e­®±®mžž¥9;q²D8arIW!!j¶Ñב`}+Žáq£‘&Ëaëб;ÇÚR>άtesÇ$µó~ÜšÛ}xsGs«ìï.(§kï'%Ö®òû,7…P-ëýòÏé±óEÌu ím »¡.W1GMö7bhím¨ÑZâ[ÇÕÕºÎy§×Ͳëqµm3„:¾÷¡Û ?·ë>†‡XŒ¤0(ÌÏÒÇhc«žã(û¦ûýø:Ø;G{fl†;A}z”µPŒ´ÒL[Ï-F{J¬çÚ¬<«·ù)|Üg6óû¬íéŒ.¬°òýÖH€×û'¯›{æCÐ3õ‚•ÓôªÛ,cÕoeÔ¼·ÇB2¼ñià0'‰0I›ϯWè¯ci2@Ò3ÊÂÊ ËC:ñ¥‡bƇwœ¯¶5®<§×²_ùµÇ¯xuˆm‘(v: ‘vtÓn2[Ì>Y'ï›àÅÊ sN¢Ï&Ymär~6Êz²“©—+|ß§^zD0ÛÃôÊ Ó½ÑÕ5â&Ùai)Œ¥oš++,Œ{H½yÎÖûû…Ù]VÃ.üsGñ ÆÌÊÛ¥6x:ÆÖ7ÇÊÊÎ0ÁhîýŠôécu|ìU¦a*Äì“M´Þ)^¬,0îͲ6,ÄîL»ebU)Õâ<"­~–üÅ¢ 0ÓÄö ,­vª^“,Ù7 ïã)ºm:§–yàÑÎÆG‹”í_ùùhçòÔ ]Ó…ÅúL»¿ù« ļL»µŽuÍó´ÔÍyö#IL ‰`´øèènCmr4'’nB÷Ø*¯…U×–2yt¦2*Ÿ;æÁ“Ïv±÷MóbeŽ[®}Öb…œ«ô» Éé:úY×>ËÆM«m½·ðÅÌõbµ‰ÃÛASt“§P#ÆÆ¾…n¯­¶<¨gŽÖsÎ;½nV[+mkm¡Ã™e{i‰õ8©âî4÷-Ürc­xŒ GEçoÏH¬²–íb|y…匵'Ìïœz  R› 'ç<î/±Ø¤™ž/MEki§ÓÙLþlMš70Œ†;!²‘(·6ºý\Ò[P÷«½öxÁàÃmF %L E$”ÆÙ݆Hí®³õâ¿ìªi8<ýøÛ²„7Ô]n*Nz{ÝXUOÍJ+½½:VUÃåiÃbä¬n†ææõ¶`Õ4,š’#m˜ÆÓ×便Ÿ.'Åø—ß.Ú$éºÉÀ%šfGïöÓiy?Ç>‡XµJÒ%Ãë$œ}ܼԂUsàîe´· %_:÷KŪR<ªÇÿx@¬X­ZñìÁGc¼2} ÷8jš—%DZZ|ì•ûWß<>Ö®rQ1¯}¬ë™§”|k#Û'k¦ˆ†Ó8:[±;½´c'abFH(:^§Zq-¬>j«²¹óg$6·Éê~üÞ¬š½ÇOo3@¾Âï.(§kî§Y×>+Åí×kY¦¹þþŠºÍ‹Ï²ÇF±`0b›ìÛºñ?ëÅÌÑzÎy§×Íêëq¥5×AÏÜ ¦º-$Þ.òhð*×o?d&¸Eܨ?võœcjzz©Þöÿ%Z¬v½Ÿán Ñ7ÑÏŸVl³Áñ¼èãþ´·Ñk*r4U.³¨îa¦ük¬FXM+8Û}\éíáR•Û™õl§:/¡³H$‘€D½^R‘ùÂÿÇUôa'*‰²ý5Ròé7Œ\ÛüðhL>ŸGÑ‹EšbÁa©íµêÉ ŸÛd~+a‰ʺèõX#™C±;°{gkqX0¼3)>êpìJ¡öᯙLù8I,Vt\ÇÇÓrÔFõíL²I­Ù~ôH‘jÁeQØÿ\bulìª\KÇH(vÇQÄT;ßû{%rÿL¬*Ç£jüÏt)ÉNp‘À¶Þ;Îr·»Zã¼,3ŽÕâS®uÏãšâ^gÌëëºr¯äX¦Í0‰´ÂVÒW·‚ªâs™ ìƒËS->RÔðÚRûX•#k 9mÇë³á,Vø•~W[ÞTÏéZûYO®VŠÛOjZï¿°¹ Úðøì¬mÆ0Ü:±Í6ß5Å·ž9ZÏ9ïL쪭Ç羉iZqypy“L<Ì›Õ Æ’|¿ÐO‹Z{ìªG½Åfë†bq/dX\v”p’ܱèTk³‘ñ<ïúö囨(U\6S)½—‰_ `fˆ¾Yb~2ýå(.õ‚¶St¸ ^omAÞŰÉÓiÜÚÃÉ€S-. ¥û«X4”f? ?÷ñá1#C+š:±]Å×–ˆO«OÇœßbO‹‘uõSø\†Šæh"¿—$‹»ØNžlÊ@±•8c™YÙó–™çÑšÆÐÔw\rh`Ƙœ¯:ž•¶k²«‰ìQ‚›YÙüg«ê9ú¡@·iäc)ò¼f*Ã^hµÝ‡^cîWŠGõøŸ|9ôô!¯éáÁËtíbçe©×Vê_ÅùXo>ŒQ•˜W;æ c]_î•è½Ó‹®ÌÚ0IÚ:Ðí…7n._ Ùà&!ÅÀq¹õX[ç_[»šMÃH¤ÉÓRŒa–dñS¥ßq9]ÿSÛ>+ÆM5ª¯÷_Ô\?Ú½½ÇëMöLÞ&t·Y![[|뙣çeµõ8]1§½Yç-L¼.>"¤buyð'‰ŒDØÏöcOÔ»ŠÇalÔÙ¦Îu#ŸM’=VÝe“)òZMÇÞ±Tj“È“†ÆÓvÎõí ¼^Ã"]âþ£;IT ‹MûÛi´v:8|û–´ÃƒCUqvÿ¿¥W•]ZÝ=Í8’‚ IDAT´e×n`˜&™ø3##,•xþ¡ž×NZ>tó-Ko²èÝGÛÛ{hM¯`˜©Èk»Þn'ªbGËí³Mab­ÉåÏ=¦iGAUÀHÅÙ ÙÍ™d³ù·û _7¶x`$…afˆ‡^±•ý2cåðúp$V F’ÅcYbþõfÍoÕŠñ¨'þÆ^×:~6#E*Uø'c|¼›$•úW}>šäråVðòcT=æÇÚ­c¬+çžÁÁÞ{I£Rµ‰·%Gôí>š»÷OÍi­8Óa¶-tèÖª1­w42¾N,± 3ÃA(ÀÚaáŠSùß]LN_ÔS_ÜηÞnsýä·ÑÝrÀj`•g7nëÇ™£çÉËŠëq•m5W7ê6óóì¤Èd2¤öX†HÛ<´Zj‰ÝÅÇ…Ä%%ð:BÒ0ÈÄÖ ¬eѻ۱֘ˎçE­+_ЕÍÎQü±#7x45·Ó;á¯xU³‘í¬./Nö¡Ã‰h®šÙGíÔ«Wúš‡á‰À$7–rÐÔL{ï£3_þUéµ¥g>]a7ææòñK5V/ãY–žOr#C±´Òyo‚¾èÀ%Ììì¾m²¡{ûèo= |Þ±ðø¹¹=Ëü䛚iïéç^×k–æ‰Í¹ÚÎ÷r”‰¡ó;Ü0,´vöѯ°ÕôÆÊÑÃøh–¥à7Òy[½† WXk¬ñTGwÙxTŒÿ‡OXß!Çärižìž¬ÛÚ¦X™Ð?Êm’Šã¼\i>Úðèó“ƒÌ<~Éçé³S…1ªóÓíºëëJ¹gZzF´s…~­L,5Z;œK¡wû„§UÇë„ýlmµ|uJ=kK£cór”©{ó¯qãØÚºèJ±¨-½eWsYU!§ëZcNåxÃq;ïzÿ™ÍõSÄÝݳÙ8m Çb~Œ9ê>G^VZ«m«¹ñO³\céÑ«ÂUÁ&­îO÷Тcç¯ý8Rµ bq)y%´ƒŽü:“ƒ³d±ÑÖ=Á×zrßrY3OµÎsëà'ïÞ½{‡ø„ _ë3Ë8ËîOöµMæ€XÚB«ËZ<¶ccÄ^ò@W|±ºÐx!9-qŸå™=6Ãࢃï~ÑCÂ!®òÓf£Aæ`›Õ´×p‹á‹<Äì6‹“³„â`’Ьò&é:ö)ÝW¬.,BHNK\„øBÈ•ÍOúÎgž;“{غFÿb_ßQrZbþu˜ÃœB“MÇç¢ßmý‘Æêbâ!„ä´ÄE|Îçw¹²)ŦB!„øAÈmt!„B!ŦB!„bS!„B)6…B!„›B!„BŠM!„B!¤ØB!„Rl6ÈŒ³88Èóƒâ_‹Í„»6ÉžyÞv÷xrí:óñã Ä‚w¹vý ¡¤‰_äúÕÛ¬'«uq‘ÁÛAÌsÛEnkÆ™¿~'g•bãîUînTù#²© î^Dœ…BñÕùFBЈ {Ï1»ëÄ?7Š×®‚ÑÍð½6‰ŽB!Äù‹ÍLˆ±û1®ô)¼ ÆhZ`@ X\%¼Ÿ%oqÒÙ7Šßë8ûw¬Oo;ôÛD—~ÉðËè*®¨°;°Â”s›±û{\¹iasu›ý44wøy0äÅq¢á“OØÎæàÑrËŒ6˜$·Y] “ÈžÜÖLnÕÖßS…fdñó1Ñï‡ñ¼ÿËcæ>kKaúVPå÷YÛÓ]8Úöõ¾ F¬¾þäÓìÌÜg6âdtúX¡yZ*Äì“M´Þ)^¬,0îͲ6äÄ]ø|’ÐÓ‡¬)Lz±æ^€ùôL½`åÅ4½ê6‹Áf©cËì°´ÆÒ7Í‹•Æ=¤Þ{ñ·`f£D[»hSÞ²º•Ä}¹P]©îa¦ük¬FXM+8Û}\éíáRKéc6bkæã$M°X5Òyp•›…>4Ç®ûYšÍÉIöjˆ×É´pb;ÖŒÅeG 'ùãjm”í³‰‘Ì¡ØXŽõ×â°`$Œ 9Ry,Rõæ€B!~àbEy_`h(Í~~îãCýedÈ`ŪyøŸ/Û,:±íÙÚ"K"[z?çéãÉ‚¨|µ’µXz·§ðZï=†"#,Ínàš¾|êÙQͦ‘¥Èã*,öB»¨í>ZÕÒÅøè-Ñ,·çly E«™J¡è½Lüb3s@ôÍó“iì/GŠÈ÷]ÌóhMchê;.940cÌ ÎŸ+fŠÅ†Ý~²Ä²Õ0¾š±q².Ï&ɫֲÉy­ƒÿ¸Rf¥œPÑMä÷’dq·Í“M(6 H—Ù¶òX4×›B!„¨Û…}õ‘ÕÝC[vàÖ†i’‰o132ÂR-Ï¿)v´Ü>[Ñ&ñÐ*‘\¾Áž˜är¹¿X¹4VìLb3×¹ý:Ùx ñE®_½Ízò¼]9uÌ_‹ãã\iÌ?µsÄߌÍpíêU®–øçÚLŒÏD“¼¾]ºÿWo¯“üœçÕyÆmï ×ï–>¾ ™×kNÎó¨žxTX×k¿_dðvšBüöc~açzçøõÛ<œß n|.}üÄçàì›Æ6SqvºPÂaâÆeì`&؉å€Ûû—<`’Œ€³WÓWR<˜)"‘$­ã/yàÖ~ôïVTG7Ã÷:pØäÛ6ôQVVòäý,»·ÈÃgû¸½Í¨_Èq8ý LuXNþPQÐ~„óJæõ{]ý!÷ÿCîëhŽ›d“1BÁ%%™š»…®}™óáK™«ß4º¡æìÄÉá„É%]…t„¨ÙF_G‚õ­8†ÇFšX,‡­CÇN¬P|n/²º&‘…æ?†¼8T0“[W ïgÉ[œtöâ÷:P3!Æîïq妅ÍÕmöÓ'·;~5!¾x‡'ùQ^Žê…\jƒ»#Û\^˜Ãg#¶Îâóuvs(¶V:ûF¸dGM¾æöÃ$Ã/ 6dãî»+L¹ï$ÃÖÓI6Ó9˜aft­|ß¡âïʼmgcò ÛÙ<ºCnb™Ñf‹]‰+.© ó¯¶ÙÏ*4·ûðæŽý¶l;ö^/ØŒ’΃¥µ ÿè-ÿ54V?¼ÆŸÙ´ºèhγIb©H£ÅGGwjl›„ dâDÒMèžâ”Èï³¶§3º°ÂÊ÷X#^ï›`ÄXš ôŒ²°²ÂòN|é!Xñúvv—Õ° ÿÜÑvÁ˜yöj«W‡ØVaß@*"íè¦Ýd¶˜}²NÞ7Á‹•æœDŸM²Z×-+ÞÇStÛ,tN-óÀ£Uî{µã*ÉÎå© :-º¦<Ýñœ³Ë¶cî˜AÏÔ V^LÓ«n³,s{4æÕ¶Æ•ãôZökì[‰c®w¼²QÖ“L½\áû>ðÒ#‚Ù¦WV˜îÕˆ®®7ÌKKa,}Ó¼XYaaÜCêÍs¶Þ?RS®^3ª´YêÎ@¥\=³†‡˜}²‰Ö;Å‹•ƽYÖfƒ…ã©'æeûY"þ å.Ù#0ùŠ´g”Ç=Å“@µ±,ózúPuÇbähðZk™~VœW€‘Xe-ÛÅøò Ë<kO˜ßÉÔ—ã%÷m)½VÔ—\ú-›t3ýòwx1áÃØœev+sºZ-?esólNÕµŽTŠ[­}«0/+ö¥Þܯiþiõ­ë5æÞù$¡§YS˜=]h6p^9~Þ¨yÜNïÃÛc!ÞÇŒx„4pŽ“ŒD˜¤Íƒç×k\ë]“*^5Óév7‘Œ$0Î=MHmðt6Œ­oŽ••9œa‚Ñ\éK•âÚ`½Rïû2ŠMì¸=6²±}²fŠh8£³»ÓK+1v&æa„„¢ãu¾_›éðâÐT´–v:Íä1bkD”n†{t욆ÝÝÇp'D6Å 5ãë÷ÒRÜ®Ë †‘?{ oõá6£„&"Jãìnà ¤v׉Ùzñ_vaÕ4ž~ümY›‰s D¥¾gªW=ÝÑÕ´Äæ6YÝßÛ‚U³£÷øém®~&Ï…˜[]ø¿äíeÞMÚèöpIoAÝoüøë/ÅIo¯«ªÑâé Yi¥·WǪj¸–¥c^Oªïã(FÖ2µfbéggžÙ\ŒÛW©~çU!7uü—h±jØõ~†»-DßDÙ¯+ÇÈËâ¢(møû=Ø5«ÞÃp¯…ýÍ]25æB¢jnžTû:R>nµö­Z¾—ëKý¹ž5¯ôºN=ãŸO²9û@\gtÔ‹]=ÿyå\ãv<2ž6´ƒ0 Ó$Nãèî¢9æÐ4I„ÐÚ<Ø”ÚÖ:ãBϧÇêM›F>›åðæc2´IÒu“K4ÍŽÞí§ÓR~ßåâzžz¥Ñ±úlo£I§i3L"­°•tàÕ­ ªø\&p‚ûàòãTP4%îR© ùôF®m¢|XE/ІÃrtU¨ÂŸÛd~+a‰ʺèõX#™C±;8w‹Ã‚‘0ÎÀJ}ÿ“jÇUcwŒU=};}›¹þñRÐÔ“Wµª)¤óq’&X¬é<¸ŽÇ¹–\+Qœ•m³®\-‹„bw…jÇóþ^»Y_Ìkígýc—!²4É«´‡ñï{Ž=âRÃX–‰yí}¨e–cû(sÚí›fâÔ3›Šf9ÚO¹~V˜W…];OœP-.;JøùÿêÉñ†ò²†¸Xœ…gîß÷ÍaG1RäŽ]+?ŸTËÍã)_Ï:R6nIrÇŽ¦Ñ|¯Ô—ºs¿æùg©y]¯güÍl”hkmÊ[V·’¸/;Î}^9ϸØÖy E"‰$šèèõ’ŠÌþ?®¢;QIÔ´Ö¥>ŸTY»ÓŠåo?÷|4É& ´fûÑZ ZpYöëŠ+ ×+ç«ÏºØT^te†Ð†IÒÖn/œØ]¾²ÁMBŠãrë±S½Š¢”ZT4”f? ?÷-qF† V43Tv»R·'[}:æü{ZŒ¬«ŸÂgxT4Gù½$YÜÅ}äɦ [‰™ffIdkœ«úÎÞzùã26êvý±+ñÎH¤ÉÓRœY’Åw±•ÚQR(z/¿ÀÌ}³ÄüdûËÑ…ÊQ?ëéÛé6ê¯z–È<Ö4†¦¾ã’C3ÆÌà|Õ8WÊ‘êmÖ“«%baÓÈÇRäqÇ-Ã^hµÝ‡^G̉<©¹ŸõIrý)³a } Cœ¬™«eúr»ñ}œhÅbÃn·Ö=+Í+€|6IöØÙ0›L‘×:øOªö™úó²Þy”M2øPpdã)°tÒtìíp¥qÈ­ÿËò¹y*QÌTªü:Râ\X.nMǪØFó½R_lu¯[µ®yñšsªž×©–.ÆGoáˆf¹=`Ë3…×~¾óÊyÆíT‘@‡ËàõÖä] ;œ8Á­-0œ 8ÕcoJ*¯uÍ ŸO*^%`s/‡£ÿ?ã78ÿ|l²«‰ìQñkfIdóuÇÕÒàùï\cõùÞF/$’·%Gôí>š»íÃÃÊZk'Ît˜íC ºµj3VwmÙ5‚[¦I&¾ÅÌÈK <‹¡:}èæ[–ÞdÑ»&··÷К^#:À0 R‘×v5¼ÝNTÅŽ–Ûg+šÂÄ Z%’«íÚc¥¾Ÿï¸Lr9.0v*N_'–X€ÀΆ™á `í°z;Ft‰ûì$ P5,5|õÿÑ1W¯s¤¬iäQP0Rq¶‚Avs&Ùl•ñ®#¶Y.WOsx}8«#I 3C<´Äüë=Lµ¾˜WïçQüë»Ld‰ÉÕmC£ø,y Ãøði6>–õôáBò%Ÿ;Ñ÷Â?fÕ“u¥yUh7Jàu„¤a‰­XË¢w·Óza9^~­¨—c}KÅ^³¸iÐÖã9ñ8G¥q¨ž›G}«{)7ëä{¥¾œgÝ®¾mmëz}w½T@óøpÅ vÈœó¼r¢«{ý?¾ÖN‡oß’vxp¨*ÎŽâÿ·tâÒj_ë*ÇÖà`o‡½¤QãÏŒï|2KXíb Ã~kˆŠÃ×-$IûÿŠ­lýqm´/ž«?û+› ÑÚá„X ½ãØ'¬:^'ìgÛh«åãøš‡á‰À$7–rÐÔL{ï£ ³¦L[.|ºÂnÌÍåão­­^Æ'²,=ŸäF ‡bi¥óÞ}-*ÐÿJ˜ÙÙ;|ÛdC÷öÑßz@˜sö ¿KUÊY]c~r™Ç/yàltÿ§šméeêžÁü«GÜx¶¶nºR¬WiG3GñÇfŒÜàÐÔÜNï„¿ðNɸ˜¾9fw¥ñjœÕãçæö,ównoj¦½§Ÿ{]¯Yš_$6ç.¿¡½|ŽTló;½þ\=Smö0>še)8ÆtÅÖFïƒá•P³ö˜kf…~¾ôŸŠ­cg’…ÉÑ¥n,úuÛc~g¢ÂXf.(¬ îã˜D`„Ó?måÞÊw\ª4]+Í+@±tБ_grp¶ø‰ï †¼Vàü}>;oÔÚ㲊ó&=û¦4ÓÞ7Áðéu·â8TÈMNõ­³Â:Ròêz™¸¥ÎŸï¾å }QëÈ»ºr¶Žu½±Õ ïP›w¼Ús3zúV‰ÚØþ­õŒ[‰|´º¼8Ù‡' ¹:hfµ³ÄìJk]¥ó©y@héÑÎúµ²Ù‰9Þd£ÕÝÇôÄåBÑ«>ªŽn&†RÌîpðÐÚÙG¿~ÀVSqU;ÿYëœc?¤Ÿ¼{÷î_•Â×ÊÌ2Îò°ë‹ùŽ?ñc$¹úÕpl†ÁEßý¢Ç—ÔñLˆ±;aúV¦p«7!j›7ÄÒZ]ÖâzžbclŒØÀKè?îþëús•¦Aæ`›Õ´Ÿóv«’«âG›žé$Y ƒõÍ›ì6‹“³„â`’Ьò&é:ö„GþØà×x]!„B|.~EB „B!¤ØB!„Rl !„B!ŦB!„bS!„BH±)„B!ÄVlšqy~Pü›|© î^›dÏ .…ù²;°Â”óXNžÞßÿðOØ_ú½c¿;ï<-Žã¹úé(9j[¿€²k/•×ì:×þÚûSîµM„ŸN²™ÎÁìm®+ÏåÈ3ÏÈ“!¾Ÿ¸„Z±¯ïÇñ÷Qãω—]3Î?‡3±u–ž¯=Ì¡4·Ó;¯Èææùc|ý°œSœreãírãŸ\çÌÉnÔ·êiëìä‹w7ã=Û@WpŠ©ï/Ñ|ÊÛèl;…+ë;Î}ícŠìl¬çuëøÕ©…N!‹ÍoÚÀw;s;ì·®rÓÛ8uZŠrÔpoãÐï;éüü]ÖߺÄ~˜‚Iç.qwë!~ßÙÉ…÷løÏÿ#—|“‹Ê}më:îÞüI`Ò‹ûÀ_oúyLÞ¹ÉÝ [ÙjÞ¤ã»l~}äC\Ù7SêbF§CtÝ´²ï‹'r}훂{ßòé™›l¨ø‚ÎÎ/xwóM¾ö&‹ÔË”‹¿pþüMÖUœ¢­³“߸•{¼Èõ{™èvcbÁ¶GÚ¶%í«uiÆGÒõëƒTº€© ›†³Cl¬8E[çì·þ€Û—\ï‹äI3îG©Ô2, TédzæídiI1†3ª#éØšgGë~H-ÃÝ?qòÌMÖ¹fë±ýÀ×þ+jÆþm^}ÿnÁ¼|ÕvÊÈ™dÌ-Û‘Æ÷²ôØ]®g Oêk³xó£FÞÞ°Ž7Ûù§ú'¾¨x½ž õ¿dý’²Îõã?rø“t>c•6|ï*gNþ‰lW#m¿çÃ7â>óõb·BM;î2dòNâà \8²•I÷IšÿòàÅ‹©êZn¿d2þÖh\§³«´6'Éf”͸\¯±>+›ü­¯óŠò*.—õYÙX·ÚY75‰ ÜêÆ·ÁžVÖgg³iëoØgÈÍ?Ýa PÕI&'UXoå­Úi}ÿU–ú$oÖ«oñÚ”—«w¦€{ܺzŸÍoÛY¿lá_¡üÝ7Ù”Ev¾ƒ76ÁÃ*“>7·”·y¿ÜÆÆìl6¾VÁûoÀ­oï,¶ÚÉÞäÎÔwnÞgÓÛ¿â•»7ùëÔwnɶoeƒ°·÷½Ë/mù¨Þôº€Wxë7o’?+ׯ6Ãä¤ÊÝ«⮵Šw¹‰ììØÞÞÇë’·lYrm|÷¾ø‚Coæ³>;›uë6­Ä¹?9µ:Ý.sL<s—l[ò¾Êȹ¦ë×õ©tñ_¸ó§ïxhÛǾ7óYŸ½[ù>\¯,¯Î¥ÆýS¬OÝ WÃÒÉô<Ú¹´$Ó«ÒåìÈ~lGY?¤’áüßþ‰û«ªgq}ë•Åþcuv:EpÍä̤ož&•ï]rì.ÓÎ3‘'SÙ—ogóú1Ão½gbÃwovsgsU¿Ìg}ö&^{û‡\vu-|ÑTÚq—yì¶ñî¾_’¿>›¶ßðþÛëðþÑ»Ìó¯Ï3v&¯k¹ý’ñ˜Z£q.§YI¾óóÞFŸé²ŸÒRÙröc§:y7޲qëæÝ·nÓ:&ïL’õÚû4îsã¾ô;ºî+lv¼Å¯]åü2?k©l“·^›¢ùú&×ù¸úЊkëú DÏfS’Ã>“÷ Þÿ#¿û»?¡<*Šmf=µ¾ºù—Ø8Ç­;wàŽŽ×]orïVóÌÏþ,lïo&‹; ¬cÓº¥uñX®uOô9§Ã‡w'É~eãc™ÈZ‡uÂÉT³,¹fœÃ¥f?w§`Ýúlî«`]µn—3&žºK¶-E_e„—è×Tº˜|8Iöæ Odc›gIÛµd_' ¶Iûcáuidzí\ªŽäcx5ºœSߺÇ妖!ND]e=IêKê?Vi§﯑œ+õ_)}/˻˳óLäI­nåv–®×̆§˜¼3‰²qÓ“Ögmdëܹ£ÉÕû"ÒØVæC{ól27Ã:ëF”›w‰ÃÒ‹ Ï5v&«kùý’‰Lk5®‘&§Yq¾#ÉærÈ"{“õû»<ä5fLOåá½I” ÙLÝ»‡bsQßú.S‚xÿxžæ†ûll?”4ÐÎ/÷Õ·lL5_çûl­¿áµìÌäR”dF˜òÊ>~ßòw'ð€õ‹S¥¬Í¼näׯƒjåýM›Ù¼y’¯¯_‡Éͼ»9‹™éÓ\]éu÷SÊ¥Û˜Åä‡O dê!w¦˜Ñ.C®É[g8æÎæ½ÆÿÈ/7eÔϪ›×H·™±tÛ’ë$3皺_¹u2¥.²7d3yç>*ù³Žé!w—µªºT_/pÔ·šÓôÇÓ¤“éy´3­L]MÙ_+×åâqZ†lî­,¿ž©‡Üy˜™H÷·Lì4{ÝZɹ2ÿ•Î÷®[ÒO­Þî²3º6¸B;»¿ ÿ‘‰ g‘½!Õwël>àû«Cd9Þ¶¾hU¾pÁøQÞåá¼lëáÝ{¨Ù¯§Léüع²~ÉH¦5Š'ʽ`J»Úü0M¾óÏ7ŸË«6:Êyõ¾›KWƒLNMrïÖ¸4”Í›ooFõžçð±Küåî$de³n‘O§Ê©ÞÂ6õgÎÿñ!¶·mK žÔå<½›YŽý¡›¯¯™œšâÿ:ŸýîwœOzÆ#›WߨÄ_ÿügîoÚʦ¬,6¿>ûsþ$9žVYiŒ{Ó[o³Áÿ5_ߺÇäÔüW;¸ž2ø,-×ÔÔ$* Y LÞósý믊Oñp60&×í$ÁïÿÂ÷ÁÉ5ŒdÖ¶µï×Ôºø›ßzƒu¾K\úKÉ©¯^Âý×åÉ“I_/Õóõ•N¦çÑÎÌldyrg:¶RË ²ù­×ÉNU²‘ìø\÷ÞcŠIüW»¸W„±œµ†r>s™ôÍdß»2?µº±²²qµY—ò+³áMo¾Å¦;]|}ëîlߟ§ùß3•µ¾(Ã1ºÔøQ½\úÃ-îNNòÀ×Í%÷Clo;R¬j¾±s%}¾Ò1µš¶¦³«É%óYÙ\ëßäÃú‡œ¿Ø@å¥8ʺWyã`=ùYdm:Ä>ßg\ú]%gÝ+\õûf³ü lµeÓÜPÍgµsdÓÂñjå-›Âï5vÚÒtZÖ‚r6§‘5{+ï×ßãÒ¥*ÏÇA÷ W=‡¶&/½õM6ó¼¾™l Ûú:¯ðYo¤H~Óè"Ý™¬MoSÿÞ=š/ rr¯¾QÁolA®§˜Š.%WöÖ}T}w†æ•¨ºWp”ÿ†ƒ¿úç›Ïák?‚-™n§îqõüY†^ÿœ ùùkvÎ$Ó¶¥ì×ײVÔ¯ÙS©uñVû!NÒÜqŒÊ³°Áþ6ïþêÝË’'M_/쯥úcÞ-Yù®Ô2=v¦³‘tc8ܙޭ42dñ.ï©4w¦ò¬Ž ö·(·ù¹ °ñuöýú&gÎ`n¶7+øÍ«Anþc9˺r.sË÷_ëßHã{³Væ§VåOÓ];µ²ø²HÖ¥|Æ*l˜Må|xè!ç¿þ*ï«(츎¼?³+4¹z_äûâµ VxÒeÝë¼®vÓP}†‡lÀþv=ï½¹þÅŽËíó{+—i-ÆuöT»Jgs?u½Ôüë£Ñ¯þý£ÿÕè£}ôçŸnþó¼vŽ?ê©ûûG§oÿëóÕíxߣ¯zÆ^ò¶ /$ÏblÍŽåÛ§ÿþÑøOc/¸>G9…Ÿ-ÿzûô£¿ÿÿ鑌2áyòò~®rj’Áï躎 ·v^Êæ>üŽs g¸êŸdîý|¼kåÍÍYÏQ·øþæ$¯¿¾éåm›ð‚òlÆÖOÚNAdý;õ.q¸á{6üꮟÁ“\Yù|øîyšOVÒWÐm°ñÖ‡ï±5ûyêv=¯•—¿Ôm^TžÍØú)Û© ÂËÂ/=zôHÔ ‚ ‚ < þ¨@AAdSAAdSAA$ÙAA$ÙAA$ÙAAI6AA„—>ÙœÄ÷õ?RýwGíI˜òs®ºš‹Á©PSø>û_©ùÃ] ‚ ‚ k̳ù‚ÐÔ=nݺ˫¶säµl˜E ‚ ‚ H²™!÷þr‘æŽïøá¡ Êìo¿Ï¡ß¼Â­OøÓý8œùŸªÇÖ}’ïÆáØâõ8dËbêîu.ëâæQ×mæŠCì{sY®ò‡}üºBá_ÿg²²ÿ…©ò |ñÖz¸×Mí.¨º@ËÎpï*ÿpà[^¿ÐÂëþd²ØÈ~ª<¯6~NùÝ®Ùk^q¼Å›ñ¹=àû?œçÒŸ¼ÜWaÝ«¿bß¡ýlÝ(EAa%¬|ýÁ_8þ&ë*NÑÖÙÉï?Üʽ?^äú½õ¼ùQ#ooXÇ8²u3;ëycÝ:~uj&ÑdÒÇù†KÜÝzˆßwvrá=þóÿÈ%ßäLÙoÒñ]6¿>òüæ\ÇÝ›?0 LúoqøëM?€É;7¹»a+[I% Êûrõ4œbcÅ)Ú:¿`¿õܾ™lsêûK4_…òÆ6:ÛNáÊúŽs_ûdaVAa…¬|esýk¼÷Ŭ۴‘, kݲ•8÷'§`]ú['}nn)oóE¹¯Uðþ×9ùí¦ölàí}ïòËM0¥ØÉöÜäΔnÞgÓÛ¿bêúMþ:µnɶW°aã¦%d™+o ÿ¹ïxhÛǾ7óÉÖ—ïÃuýw\•MU'™œTÁjå­Úy]UÈ’q"‚ ‚ðœ“ÍÙ¤ñR³Ÿ»S°n}6÷U°.ç¾{Pïÿ‘ßýÝŸP'y*Šm@YǦل5kó/±qŽ[wîÀ¯»Þäޭ晟ýYØÞßLjzYæ•7ùp’ìÍ× ؼ~槬×Þ§qŸ÷¥ßÑu_a³ã-~í*ç—ù’n ‚ ‚ <×dsòV3ÇÜÙ¼×øùå¦l˜òñYuó²îUÖe£¼²ß·¼Åãã“xÀz²§®Y(sÙ`Öf^·Nò‡ë×Aµòþ¦ÍlÞ<É×ׯÃäfÞÝœÅä­3KÈò¤¼ì ÙLÞ¹JþìŠåCî>P˜ºwÅæ¢¾õ]¦ñþñ<Í ÷ÙØ~«ä›‚ ‚ ³â3›SS“¨(d)0yÏÏõ¯¿f(>ÅÇjª;ˆÏ>ˆ³þµrìÝ|}=ÈäÔü×ùìw¿ãüÜ™Í§ÈæÕ76ñ×?ÿ™û›¶²)+‹Í¯ÏþœÿÖìLdÉbó[o°Îw‰K 29õ€àÕK¸ÿ:›ïzÏsøØ%þrw²²Y·!{~zMðû¿ðýÝI5‚ ‚ Ï:Ù\¿uU›}4¨¤òÎqk£‹ƒ¿ZÇ­æsø>Q“µ­¶ln5TóÙ÷S½•÷ëMÖŸ¨Ü³‡½'»á×õÚš¼.ë›l6½¾y朥õu^6½a›ù9, òͬ|Üë8Fåžœ¹µ™wõ °þCì³¹ô»JöTàäU®ú}3«šS÷¸zþ,—®?”†AA–É/=zôHÔ ‚ ‚ < äs•‚ ‚ ‚$›‚ ‚ ‚$›‚ ‚ ‚ ɦ ‚ ‚ ɦ ‚ ‚ ɦ ‚ ‚ H²)‚ ‚ H²)‚ ‚ H²)‚ ‚ ’l ‚ ‚ ’l ‚ ‚ ’l ‚ ‚ ‚$›‚ ‚ ‚$›‚ ‚ ‚$›‚ ‚ ‚ ɦ ‚ ‚ðb ÂÃþýûE ‚° .^¼(J„—YÙAA$ÙAA$ÙAAI6AAI6AAI6AAA’MAAA’MAAA’MAAAdSAAdSAAdSAA–ƒFT ‚  P'Œ Gâ 3bÊ/À’£ˆ^A’MAAX QF¯tÒÞç#¶à/zë*«w³Å Z„LmtAA`‚ |™$шùûøêXž°*ª„ •MAAžV:G3?hó)-ßIqAJ4ÀP_7}¾Lûq7¹É?UEvÕá%K6£!n{‡ñLjDbL£Ao4¢7Y°á°oÁ,Û‚0Ï‚õäÛ‹(vرä™1åèPÔ8ÑH˜PÀÏÈðC¾q¢-AH:JOÏØ¬]Ù¨n¬Å1oL&Ìv¬ |5ƒX?ÝÞÔ9$ ÂK‘lªÑÛxºÜôŒŒ3=ÿz#F"D"ãÄ"ãŒù黬!·p® '[ 2¥~Îè±nwQ±Û)™)(: & “…-%eTDÜpwà^`g‚ ÌÄ¢ð0þÙ™q—‹Åy¤Ž-ååävCaT‡‰D‚ðB'›*á¡.ZÚ‰,ÊVÍ©Z¢x/4Ð:·­Á4ã#Ý|5ÒOqõT8rVnèñ!Nj'¨)䃳(P5À•ÓŸÑ7y;ŽPWâôG—Ï«äÌñÒÍaÕ@‡?D-ü€³ 2+Š×ã! Z(-³““qCÒÝg¨éí~ȯnæ¨Cj€ŽÃŸ1˜ÐPøÁY(¿MË¡¯ð‘GåÑRzO/¯Í«'ÎÐéC´”7ž¢Ì$¹,´ù쨭cw&{x Ûö~‚ÝÞÆgÃDÖ(ãÔZ·ã*wb·ä âÑþÁÜ=#K×aÜAã©Ý˜mül˜òvÔ°·l &]€¶ƒŸ1œXÃú2ÅXJã© L¡ŸLz†oµäîhä“Ý& D×±“ôG;A>8_KÁB‹ {éíê¢ÏC“çâÔq'†ð7k¸¶È ™º£ñÙÿ5å“_£3“¯‡` ¦ TXu²©†¾áØÉkÄr]|ú‰3} ˜¸ÁÇ=/ÿœšpïÇ4tyìùô8Û–¸^ù…çÏô€JÈÓĉ$‰&€e»mv°•Z’\a°½Oˆ5;¦­†ñ´4Ñ7¹Û? n·bÀœ—KžI÷ìf¯j„¡ž>úz†ˆ¨k}¿kqþŒsð†gt HÌ$îc¾Èl#„rK°þísh³°šô„ÒÚ£™%šósNÇ^ŽTØÐ®I2¶ººw(±ˆzòŽSÌØËp¤Âº‚:Œ8J·`ÒEêú–`âY×·”mE …„ÂqžÉã š»6ޱôê+,DntÐñ­—±Ø4hs±•º¨Üƒ§anõf˜/ª|p¶ ¥¿‹®ÞÙkçêxÇŽanœ¿‡Jó ß^¡ ~sÁý³«´sÉ…µ˜<‚ŒýD° ó2Žž|}Œ /@t· b€±ÄFŽê}ªÍá+Çhè[8%ȧ¦ù(v]œ€g¹²Z©9ºc —ö®^|ã*F[)¶¸af‹mUTXVW†¡¤×àa:ý«[ Ôæ;0ÑMœ¸œ ÔZÕG+±šm5~Ʀ5 w±gw)[L:⣠uwâŽ,ì¹”ú e93“LG… ¿¯áÉJßÔÇÜJ` ‹ŽP1;-®þË6öü÷àm:H«ôÅÔ^…9êáÄQÌf&U™'Ãv**ʰ› (ê£ýn:¯ŒYv;ç9_s)Å9 ¼D,vL¥%äöu3þ”oòómG;3]e¤´þf v“¯ØÎ‚ÁR‚ÓòlëHgrĤǫ¢ù希Cô ‘ÐæQ\QC•#çqY=ŒŒCna%‘nºÇòØsæ8Û ©}xNÊ\³ŸÁhò 1Gï \¶óvølå8éÇ㋠䲫ª §E—4¦>UöÜýEpvo QnœøËåU %¥[0 2áíáò•~|ã ´F+ŽòJ\ŽHvÁ@ª²„—e3:D{Û ×õv;qî>À{žÌê#í|ôÞaüpÞz²ëŒ´u2]…<ÓÛOÒéK`,ýí“D3©ì´~æfxL‹­t;Eæ8þk­|Ù3…U%<ÐNÓµq´…Õ©(@ ¸i¹<Ìlß±ƒbS_ßW´Üx„³¦›ÐX©<êÂrÓâfL) tûvŠŒü×ZéœY‚—鈠1äQràéû-xåØ(É"^Bq•°7z;Îb#„½„U•/ è)´-Þ:ÒÛwâ*/§¼¼œÒüÙ¹‰Ö„^5‰¬F”è Z¾ìÆ7®`-.!/ÚOÿ¸a&+Ekåt8v ECþžß²§Ð¸¢Y§  %Uìum§Ðš‡‘QÚ>äÓ݌Mƒ&o(c‹ÖOï~ ض·ž*ÛÂuÈž– DÂ\iºÀPäÕg© ªÄÈttœ;ÿ‡k±  Í/Æ L Þ`ì¿.4†bj޾ƒÃœÀwÃÃPHGóìÊã¿Yv;ŸÌó-Nâ u»érŠÙ–§Iy½>ÏÊŒ‰Æ‰I¢ùÓeYqfÁnzÂl¶\4‰1Û/ÏLF¢C´7¹×S´£ Û´‡î±ùÉÝ2|ø‚å߀gˆZå.vYÈ 7BOK6íë¦_ͧ¤(ÆGp7µã®^5jÊX:êáËÖ>| +;Ê·cÅOûI:n'G„R—%¼ô+›qFÝ]Ì-¨èôOÒ:ÁóçôÓ1bÓWº‡’xîáHòë§}t¹G±í-Xá–Æƒ¾YĈCÊr&†{ñ¹®Z8s@u`îè%¤F;é`7-#cLwpt¯…gÎ{)Z fÛJ…ÁhÀ`2¡UUÑ”ƒ±ãÚcEo³cžã‹ 3<#‰Ã\.¨/åƒÆ t€à»ù÷/’:›Ý}a¼¡0–@¹«]EÛçà ÁØ4hm8L ,pºÙY¼êåt÷4GyÝÌ+?T]f²†¯#于Pç̵ˆ¶Ã_.:—'¤²VÖ5:ת˜¬èñ˜Øv cW_õgvêo:覩mWYvç;ØsÁ2Àî܃,eNrPjo£Û? ^•O?)ñÃFWçS¥SgüD8´øéùÕÖ÷{îú45\žyDÆ«ÚqØŠ1iBJ,ÀËgAÆ¢2 €ð7-´^‹€fˆPUfåoy5];}Ëß -Ài×Aôž@„ˆç6jÁŠf®tŸ¬†*vêÎ_|:àÞî¦wlòÄ$Ö•hbÞ’A"B4ºôÁ Eg@·ÆûÁˉ3‹ÈÝCýñmäeàćtŽ… Ä o´ß4˰·Ìª NrmÎÔÓùðd‘0>ŠÇ›})NKF§ ßÇ 'Äîªyac9GëÊ0¡Rª;ÆÉ~=¾(vë*{)e,Uôzˆ ¡¨z/» °+kèc¸Ï‡Ëµ8ŽM)ÊÒ‰9¼ôÉæÄîy™E°«•+ìĆo»üI¤³Q^¾‚°ŸžáHÊëÃÝ ¹Ž²Í°2äï¨ÂìÀíë¤åÇß±$IÚTbá™Grrg+R,”í=0;ãžù]llfG|ø#»1›@gsQYÚ…»˜îöaºm~)®*ûbç¥×¹B×åN¦m2g²aÎÀŒŽBô}×z}DÆÁä4c0Mcf¿×ÐcVR¯F·5u3†–¢šZÊf/ÌLV•h8 h1çÍéÏ„ÍÃcbˆË ˆÓkñDÂìÄoÞ¨cKE-åte²µ>Íø°›¯†Ý€}ž›­˜²Ý¶U 8MÄ8#¬£î<Ž§Æ…ãßdºÔ±ºúþöofÿ?ì#ôø™ÃýÞ8‡ó0Z«ý ŒódÂ4·²hš9(91Ë~éko´IÓNÍ0 ÕªµíÀ®˜(«ªÅ0ûXºÚñÏŸ ͼ`\Uc„ýC ‰!/I^ÃÀ„çôG¸ƒO~ãooàÃeÝ›Ëöúã¼cVÖÌÆÓÅ&R8KƒqvëW™—üªÄÆfºqî'ňÍÈãdsY>|¾×ðõ12 ¦·£ Ô[HxgRµ<žçÍš‚Ñf„þ‰pV™l¦Ž¥V”Ù'‡¿|Ÿáù7…üóôâØ™I\^²dsbÄÃS¦’ðÓ×þ%}©n0aÖAÄœYHy}ÏðÛœ9+Ѐò] T-¡†¯¼ÖD«åµ‹Þ{¡ 3êÄL°Ù’3sPºgˆ°ÑÓ<—Ùm§fÇm—ý\é ¨®%E_XNÝN#jÐÇP×|ýt¶åa;j~ÊÑ„ºÛéöÅÈwÕSë4ïý˜ºÇu[&®M19°ë¯ÑßßK=Û-:ÐåaÏ·§Ð`+6'/S p¥©‘ä•×Qõø|læ²êŒ Bh, 9 †ñË#´äZa¼!°¯ÁNz<è'‚–ëã â,·ÑûÕÈ2ßÇ©!¯ü8ÇËŒ„®œàtß8±1ƒcâ6 ô˜uÆT@ÅÛÖBÏìWWE5Fø¿eäªV[ß8ÎÇI«:/ x¼Ä%•í„{†O’èÆ#1@7“ø" É£x—SäÿäÿI×ÎEù»»sö9sCŽùÙ©ÎŽ³@‹tÎÌæŸÙžÍ.Œ7¸Ò›Çñù£`ÎY#aÒÇ™2[¦eÍx߈?[L Fð…37Wðzf§A1?Ãó3º„Ïh‹nÎUa &T"³¢jMË„o:¡Î<靯Ï{ DÞÍWî14ùÅ8f½ 0­›±LÀt¯oŒÿA}0ÇÛOïDïµ¥uöäþf»yñæ‡b¦Øª¥8 6£È/ÐB°RjÑ%ev´Ð7h­3g`<~@µØ>cÈË–UÁìt’wÍ͘û3šBvô¡ÙBψÞo‡ˆ×:Vùl˜Þž ÓZ¥óž&S,Lš‚ËJl¦ Í<`Þý §£øÃ1´&+[Ì@ÔKøÿ%Ð;@Ô¾ û.'á(pRfÏaÂs‚Of«š«­ïÄ@Š’Cý EKØfß2£›‘äþf|ØC`w–w> Æ4BÜ\J‰E!Ü;@Oºvºd,šyÀd¢—?zò@ÖVÃçµvlÛ­hG%»ü¹’.Îì^AYyÝnÆúšhŠÙч‡ž—¼eäÃ'†ñyòʲ¹¤íö5‚øÎÙ_Fºij cׇަ]vÃÓ*É¢„1#ƒŒùÚiº`Ãö⛟lúSÅÒËWV‚~¤Ÿ‘¦mõÐ7Á¸½žú’$nú¸,¬-Ïï¡y3*­µ—kIßô1oöo³ $iŽš[D¹ËE©uv¶ö¯ìÕAOåd»©­´¡aœ¾–6†þeÁ9Û¨ù œÂ\_ÿ5Cl;j¨Û½ð ‰ÒŠb´$îì&VZKÍÆð}n7}ƒŒ¶ü¶ÚA1S\š‡†q®µýïüMYŹþ~úý:¶¹¬h€q¯Ÿhr¡çÝßCHM‘è•Δƒ©“næw&ÛìY~1ùIí+N$œx¼ }­ÛÛíÆíîÁW°ìÌPÖ'µ¿ÝÕÇ?8@PWB±QŒ0¾.ZWu€]%ðÍ<ãòÊ\³[¹s³mFIìôX§OwqctÅT€Ãá`‹BCWhù¬ bîœå ;eï¼C™ušÛ½-|æËøåòϬ¾éýó#6äa$ÕÜ6ÒOkÓ¼aÛ6'%æ(·{/ÐÔ=žQ½¹EΙ§êG†žzõ["ÐϨ Ê'6yµÑÏ—eÇ™å”夶fû<Ÿ[Li‰ÏìLê O0ÑYJ)ÐÀ´ÏÃÿõ_f]¬Û±«>ú‡ƒ[ˆëhöå8C U®BŒšc#~¢æ]”ç7'u,ͱ¸¨«.%Ú;ó7¿ÛŽßrää»véÊ’U͵ç=zô|’ÍÛ´¼ÿ>ãêwÏœŒ{i9ÜŠ/YÐñÁç{1¶pø+߇m¥º¹‡PC|Óp’k¿=WËyy—ð’°ÿþÞ©Çæª¥ÆiÎðøf”Û]-´ö¡X]Ô×-xô„‡ nÆdQMxI¸xñâšÄ¦¦÷¿Â¿ÂÛs]Ÿò‰3ç%ÑX”¡ÓÒÌ£òÌqJÖ8«Züê"A˜€<ÏÊTEyR}2r‹+©*w`Q`"¦.^‘ÐhÑÏ•¡hÉÑ<.]~Äð¹›h5~N­}yî|âv/nw#ãÓh­åÔÕ-þRÉÄð I4á'„:ÚÆá/‡QsK©ª(FöÌ<•ëÀ"ËwÂO3ÙÔ¡×ãÝ´ué)/Ò3îéœ}²mÖjꪞ,cç”TSÙÿ!ópOÐÞæ¡Â™K|¸÷8 Õ#'-„Ÿáæ•᚟hFGòE@oD¯S@‹Œðûð{}Œ%‘ÂòJªÊ’¼&lâ½òÒSAø)¡TPë‚®ÞÚ¿ì–ÜÂTV”!_~šÉ¦¢Çª‡áŒõwòUòËríù ÎK°:r!øt Œ¸i™÷ £õÉj§ ü”ÑQS7,â!†zºéî÷¥ü6¸6×Jq™“2§S2‰ziûrö½“‚ ü„Ðaqîå¸ó9…yKg/V‰Ú…1ÙÄ€Åf„ñôO–ÇTçü—“Ç .ý4ºÑV@Žô§ðs@0ÜÝÁµ€Ñ±ØSÇL4F¥Î",F=z}&‹)ýa÷ÀN·ô-þ¹ ‚ ¬Ïñs• æmE,õðqb¸Ž¡‰Ù˜*á¡.:G–:Hf¤¨D6„Ÿ ‰ ƒýƒø$šÓ×z=x1TeO—rÜYøy£˜°¯økLz òåð£ ,Åó{€(MÒ¹œÇþ4Z´$H,çk%gêJäuÂKÅÊŸFÏ ­ÔhŒÄ´cá.öT”±eÖ`âÞ6Z‡‰I—/kò4úŒ0Žeü:.ÞHŽNÎo ÂÒ‘è¹bÀQá¢ÿ´{ém»éÄò¾d¢ÍÇU!ïÅ„†Ät"F,ñäçÈH7_ô’ks°­¸«¹”¢Üa®ÉóAÂÏ9&yÄTžÏyeS„9žÏʦ ütY»•MAž%ÿFT ‚ ‚ H²)‚ ‚ H²)‚ ‚ ?ód3ÊÀ‰ýìߟâßÇ&¢78ñ^·“¼F tppÿ1zÃ/z3S·a­xþºˆã=½ŸÃ]¡%ߨóÒôÓK‹–Â#9³'oÉ' 5ù•4_ü”¹ÏK¶\Ê?½ÈÅ‹óþ5Ê‘êíäkŸ¡Lš|*ÏœaOžæ™ëÞê:™sçø P‹&¯œΜãÜ‘bô20_Jât4}Ìá÷ö³ÿAŽhᛡð‹óf25@ÇáÃt…ž£D>^A So·pðã^ÂÏ*.,¥‹ç{_64?Ïf(9ÚŒ]P t4К¨âTuæeòŠ]üFÊ»““ªê"LF@/².¤Ÿ^¦Ã:Ú† Gžo½¡®iŠ z“•m®*ŽÖ›h:yÿ$ÓÚxn#öBÁÖôúäî°c ·qøËäýü/*á-œ¸²£‚jW>&%AhÔCwGǼ5ÔïµËW$.H²ùrŽ83¯GSgþ;­A§Ó¡,pãt;ÄX r‹*8PU‚I ÐÓ1LùÙ-˜ˆrûJ'—=3Ÿ Ôç—RQ]=éçŒR]«è8F‹ZÍç{ fd˜ððqÃÎÆãlSnpâ¤2—O÷ÁÈÆõ¥Ô×ÛèuGq–—`ÉðP:Ÿ½ÍEõžR rTBC=ôkwQ:ÒÀÉþÆ¢=T»J°P'¸í餽۟:ÁR$ A"8Œ»%þT-.Ç·œô.”ÉJo·J™ËJ ©·ê ¢ª‡Å€ 1ÐÝF×à8Ó)Û©c{]-%=…®åíþi´ÖTU”a7éP' t·ãŽ0¤ÎËcO¿é1ù½*ŽÚ:œ9:¨9E³ ŠN‡Â^ÛÁɯ†‰ç'—}Q_0âø {œ[ÈQ ¸AWûeFR$àë_X†¢ãrKå)êJž¤”S= ';p—~Î^Ó@Z–Ú¿&1‹ׯ½hèÒQÝXÅ„='8=ààèÑ"|M- ÆpúñÚSì-PR×]_öÿOþ·ÿ;¥ì+õ±ñÑÞ¤1kf†Á×ÕDÓ€ŸFlÎ=TîÞ‚á©ø^oÉcKO]$›D$½iÛ»ºXø"#g6Ó.ÇéñYÙÛx–æzoWO¯‹«·»hï‡ugh>s„ÊîѤ[©¯U0[Á?ÈܪüÄÈ "&ç“A¡{(ŸŠú'²¸GU˜¸Ak‹í®:Î47RS£§ÕÍc1Óµ!6Œ{PKYM ;uC´¶ô2½­–3ÍÍw™ñµÉ•9RÕ??/8ÀÙ¹-Ë35éµXwÍ~Ã{”ަ.Âöj››ù´ÒJ ó4]£ñŒt¸ˆ¥Ú?Ÿ”:ôÐÒ:Œ±ü8ÍÍõ¸ÌC¸}‰Ç ³c}ùQÎ47ÓXSÈD_ƒb‹3‘Rjj$zš8|ðcZôìªq‘ŸlJk°SîÒuò O¸‰Ú+phÀ¸Úš""Ý'8xð$î×–Ù£/¢²ÊA¬û4‡äãÖrÊ*(Îd…"1ŠÇÇThF»H&®â½­­|µPUWÉÛNÃÁƒëôc©:J…U›¦®5µ0rãôL¢‰¾˜šÚ247Z8|ð 'Ü!l{?`÷Ü6ûü:à ^)žòÞ8ƒ-Mx&¢ 4æÐ¡Cœ¸&~»…c_ ÓZS˾ ÎÞõÿ Õ¥Ð×t˜ƒ‡Oó­ZB•Ëš|b-ô/,Î5ýýõ%”;¯]*æ2\V_ÿ챡T>,M’¡¥¼Ö`¯ *ßK§{”hØCGìÚëĤäଫ¥X¯§ôèlrµTóãËÆ¿I-ûJ}lt mÌJDúñàäÈçç8S[JÜÓJë@tÙºH[’è"“ü!M{W %Ù|™É¥ÌU‚I§ 3Û)6A,¶¸ÛU5N"®‚Á¶ÚÏ9Ue!Õ7%R]«XJ±©>úC*0ÁÈf§mÞÖI.¥»K0ÏÊRj†xB%<ÜGÈ\ŽËaÆ 3±ÅYÍÞ6u9m0â¬xGõv/~ã.ö8-t:LöröØ¢ {æÎF&¯?y#ÃxZÛÚj¨)™É–ãþoñ*NªÊ ÈÑéÈÙ²›ªbðΖŸ‰ç³tûŸîϤ:ì÷¶¸p9Lèt98+(™;øf°Qy¼ž½%f :zC:M‚‰„ÆY¤Ý¢˜Cݸ‡Çˆ%ÆñyÚiûÖ‡š´#Ãô_d,1MbÌKtZ…ÜR'¦€÷ð8‰D¿§‹Çñ!æ£óÄIÚLj%Ä¢ÄU-9ÚÌ6hâ‘8ŠAŸd|Màér3ìCµìÄ®zèèóI$ˆø®Ð1v§™M´Óh/£ ÒÃåkAb‰ã#Ý\¾m ÈižMèžÔ›ÎôÞäh­©e_TçÿŠ¢C«S ¤¿å0Ç:É¿¤³FúÌB1ÐçaLj' Æ<‰H$­^Ê¿>5þÓ^kÀ^QE¾·•Ïšz`×^œ¦äžxé:ŸÄƒ&M Y¡ð¦Y=åvrt †‚2ªvz¼D—Ù†PF±%ƒüa‰ö®4¾èˆ—H«K}TBÙRE]Eß^n ;¢WXJÙ®2I>a–öZÅB©M¥}0D\ïçFÌÂ.»áiYôOÐÜ2}<G1šžl7(9Ø·Í.‡F—hƒF?[¦J"œ@““;/¹U0äˆÅÓÔŸÔ1ÚÕÂvs¼âÉ6H<e:ÒGÃ{žÇƒnzz5èpá6Å’í_ØŸIt ÇÑ™ŒOZ¥èÉ×k<^ û–ËmÂ*è :"Ó/ֱȕèÌ:ÔH˜Çk)ÓFú#ɇŒ'{ÒseL:âáÈ“9#S±Ì%R;ٳׂIX4ŽQ`†’êŒ:Ôh •Krjì±L:£%§ŒOÎ9Ë¢( êèË¿M×NÍÓ:Ñš´¨ãó†¢Jt<Š.O·¨Î…úLo4MûRÉ®é†yuNû:hêÚÅÎ=ìÎQ yûéíéex,ù‡×Bÿš´0&¦‚AYì㢑8½…xJ?œÎ¿ª ÌoÉk 6v9Nö›p›ÒLÚÒ—ó$¾°d ÉÜÇ.#fòÈ™ûô&#šD„Ä<»O݆á_ÒÅ–å$œiboªö*+Ž…’l¾ä(h–ècu"‚bÝEí©wP£!|½´5E0~¾‹’ɵ –R+jû >í(1Ënlº¥dQf§?‚ÊÜì'Êí^û6 –lÃÜß´&-Ó¾q¢l!gž“SŒ: ²,]L ´ÒêÍco£“ùbE¯C“»‡ÆO¶ñøøIÓ`+Ãû÷@ˆ¸ª p¡¡N<#®}ûLÛœnÜÞ‰™2úÝ Î®ü¨jœi Ä' ¸ÝŒ$TbQÙF_Èø@?as9®Â\´=ù¥•T—g²í4Mø†‡ˆÅ…«Ð8[†‹bÃÜêœu´Æ|Š].ì:½!Mg+Z´Z-Z­žÜü"\µ58Ô¸‡Ò?‚óõâÓïÄUœ‡V£AŸ_LMc#•Ví2Ú© ›Âo/ã.ö”æ¡Õh1–³ÇgÐJ¾U=•Þ›NöE-[ÇTP”«5Al"u"»"ý Ëp¾¥T•›i=IK¯—@x‚èDˆÑo8}ÚMÄVÁ{zŸ˜Î¿fvmOkê®Zjk+0y;é~ê¼J<žyiãÆ }ì’1kÚÇån/áxœ‰Ñ+txâØÊž~ª?]–Ž-Ot±Ví]M,”•ÍŸú¬´d/{üèj8D; Í-dWmEÒYÈ’×ê,”Z5Œøm8 –9ÈLeÔìÒé>Á¡È4£]53O¦ÙiK&5µ1:»š8t9FŸOIu-»ÍÊ2ËQ xúŸžfü³÷¹öx„ÙøíÙZ¶èìTÕFèêjâPg´¹ڮC§._‡Ï¢ýŠÉImU„ö®8ד_RN¹5Ä  ö \ƒ­´}tˆim.…e»©.½BG{£Ÿ @âì¼l³Ö6•®ãœÍQP'nÓÓÚ/˱L{hé0R]qгº(nºGÍÇ!æíâ›âöž:‹ãí½BÛÝTUWa=ÜŠ?If®ø„³s³½ ¾+œn¹Fp)™#t´©¨¨ãl•âa¼=-´$€4í$‚×goÝçÔ´¦Õ7Hk‹žÊŠ:ÎVèP£ÚZ¸26Í’/ÄŒ¥¹W³BÙÔh£Ëz€ŠOβˆ‡½ô´t-ZÕ„•é_XÞ„×\vœ3ùÜÝWhí'6­Å˜gÆæª§¶Ä¼ôÂCÿºük½mô¨e-5¡(&*Ëûih¿Bqã;X#v«Ž¶/sá·Ÿs`Kš:3ˆ=i}ìÑ‚Ç,%ÏÅzi:ÜJLÉ¥pw-U eK«·4±……ºPÖ¤½¥§V _p~ñèÑ£Gbì/ 3¯@j¥æ's(ø¥ b4¢Çb1Ìê|ω“Œº>çÀ3Ì&÷ïß/º_ˆ>«1F ›]½3²½¾ž÷aZ%›pñâEQ‚¡¿¿Á‰cÔŸ­c‹Ùç†l£¿0yfœhh€nïÌS£bÏQõ±:›ZéÄ• o7½a %fé…çF_Be] ¥ùZ@ƒ±°œ2S€$š‚ ¬¿„‰‰ž¿o¼ èâä—>Œ¥Õì”$ç¹¢˜wSãê ­åî„­±€ÒšJìòÖöçÎôØZÝUì­=Ë;:•øÄ(ý­ŒÈ[ÃAXƒ8ÛÐâÃTºç'±5ý2!Ûè‚ð#!Ûè‚°:d]^d]AAdSAAdSAA$ÙAA$ÙAA$ÙAAI6çæÊ±ýìß?ïßÁcœnó˜ýÞ©èààþcô†×°Z5@ÇáÃt…Ô«¬çBïéýî ¡.Ù´g û¥¤ x¸ðñÁÙ±ð1zG‰‹HÞÊŽêzΜ»ÈÅ‹9w¦žš¶%¿Ä€q;ç>À¦Ðbuá̹s|P¨]ûº2@“_IóÅOÙ‘û,¦!¿²™‹/r¤x¡ä¹”:Ó¶'ÿÎqæH%Źs¯DÖRxä"göäÉK’"¨·[8øq/áG"F/䨕¥$Š3úÍiïÓCŒ¶½Çþ=Lü(²,ˆkŸ*oÂÃÇï5q[]ðÿ/b^ð‚ò³÷Wy{©sè•XØÏ wŸ óA}&'UÕE˜ŒâŸ7ÊóÖ}ü6-Wˆ”Örf—ý´·´Ðª?E]‰A:$)¹ì¨­£,ú ­ ƒ¢`°8pU×P§;Á‰îq–ýÝ{¡‰`ëaZ}‰g[×L‡=t´ Ž<•i (³+„q,eE¯±°šð7sz0(èLVJË«¨ªMjp3&R^˜œ4‚w$Lþo?çÀqã^ªãyüXÞr­cÆSåE¥»%Ù\õˆÒ¢ÓÍ|*FgqðN­–ر¯píä¸=@OÇ0åg·`ŠÞàÄI?eå ½n?–ºF\Ê]Ý cLëó(.ßKE‰ ˆŽöÒÙÕ‹o<&·]UU”YâxšZŒ%àô1âµ§Ø[ í¥£«—‘ñc>%åÕ¸9(Iê¬xüu¡‰ÌÊZ0[ t£E­æó½3›ððqÃÎÆãlË!u9á+;¦òóÌ|6|ÏÇ x]g©3¤‘79Éõ¤u¡î}”¹ xºF ·¨‚U%˜ˆÞþ†öËýø# yE»(MôÐ_ØÈñm&†ºhwŒMƒÆˆÍYIõî~H õãÃNí® PPŠ«¤—Óƒ!â%äcBIЛq˜£ uôãÌdA?yTæ cœ É-¦¢ª‡Å€ 1ÐÝF×àüäPOqmÎÔ4RÓÖ@ëÂO­¶.})õõVz»UÊ\Lþ³ž7zšcî±9ôÅ9µ“àéÜ1 »ªŠè>ècÐ[wPYQÆ“5쥧£ƒ¾àŒ|K·mA®iÝŽM ©+LÕq'E¹×è_0§$ A"8LO·Ò£VÌ:“ïìý4™Žàëj¢iÀO #6ç*woÁ¨á”q&åß–ð™ W'†Ü³~R!·°”’yæ—¼-C-M\‹$ µ {ëÙ¾B—¿û–œ™ï§©?u›Ò˲ÔêàLÌ0áKŸ0³œ§8¾Í½|üQ7¸>ågLÜàÄGG ÍÅ åöãíNW¡?­¼? äÌæBt8mZÂ#¡Å[¨±a܃ZÊjjØ©ÐÑÔEØ^Mcs3ŸVZ tž¦k47hmñ ÝUÇ™æFjJbô´º ¨98ëj)Öë)=:; ¢´¶ô2½­–3ÍÍw™ñµÉ•¹åôùu>å%VPÖ“ s±üƒÌýibä“{”“„”ò&!¥ž’•;B÷P>õgi®waðváUaÂCKë0Æòã47×ã2áž[‹ÑÙ1„¾ü(gš›i¬)d¢¯‹Á$û<Š¥‚S<¶q5‚?ÇŸ#‰fʾ12PRUÅŽ¢|Œ³»ß ßeZ/ûf¾?¬µRUWÉÛNÃÁƒëôc©:J…uþVyŒÁ–&<QšŽ-N4ת.ƒWq‚ÞÖ ¸¯†Ð–`šnëm¥˜#ýÜX¸th,¥¦ÖI¢§‰Ã?¦u@Ï®ùšå¶í©Œ{Y‡àØ0žP¥ÛÒo‡kôù8œVtña9Óñ“%éǃ“#ŸŸãLm)qO+­Qˆ¦Ž3éþ–Îg.šh÷ðe»cùQÎ4×Sa Ò㟵Á”u(”Ôֱݨ§¸îì†åûì4r§•eÙ$‰ þn³‰ñ —0>$ Ädž íØWz>'U»SÆUÃòJ²ùÓÍ7:¦£±$ç 8+ÞÁQ`F ~‹WqRUV@ŽNGΖÝTƒ×"4ÜGÈ\ŽËaÆ 3±ÅYÍÞ6”$IÔ„·¿q{œ :&{9{lQ†=sçŸÔiX*w[²¬ùÉU)6ÕGH&¹Áì´aȰÒèh)yÃè r)Ý]‚Y§ 3Û)5C<¡î÷¶¸p9Lèt98+(™s•ÇëÙ[bÆ Ó¡7ä Ó$˜H$©@1`0èfgòC|súnµ”Ê2“DJÆé;y˜&O siG>¿Hó§G¨q“¯[ÉÛ‰]õÐÑç'’Hñ]¡cìNs†Û*kQמ.7Ãþ1îþgC!ãLhsš ßf|á¨+Úñÿ³w?¡m¤ë£ç¿g®j¡šû“`J\ ®×ZÈ ,.öÂ^(]ˆñÂ^¨!ZX ›ÆésLÒ&¿é¤;éŒO‚“às&¦±ä… ­E¼pÎBk!-l"k!]òEÅé@iQ2 ;Ž[’í$Ýäù@C;’ßUõ>O½oIÆ]^%¹µK½±G>céyS9Gß4?Aw…ÔÖP'·^ÄÞÀýޛݑ‡‡Ïlþ_oõé¬/&)ÉúËbñqeÄCU°÷„ˆÛ)¥rT ­ãL­Íkf›9óýUÍr*KÍ!2䯮:è E>x^ÙèXG;'×ߺÌ¥6mù˜4¿µ¼IÙ4)oê8/èªlR1MÊ›eTŸíÜû¾'÷ûÃâêwSª~ IDATpŽËe~œ¡Xì6”÷Ÿ¦²ØpÚÞ¼§FSÁÌw©ÃAl6›X¼ÿâ_eEs¾]Sø/8Þ\Ûï\èJ‹£ëÈs. ö.;Æ®q¬Î{Ëz7Û$à3‰e˶uÃ~ûÙË9¾sêöíÆéýgd,ê‘r—©U T§öö1ÅF·ÍBñÍŠÁÎsV–ŠTL°ÙUô&t·lR…ÍdœDÆÀ;<É/Á^Š\í¦‹¥N)›$–ÝÿÙÖ=@h$ÌÍÛNîάÒÐì(Ž?ÿ3xxê+Š‚¹cEù½ë2ëTÞlC7ò¤ŠQÂC]¬¥zjeR[ú±:U·Š©WÞîr4u¶ÓûïÓ:Ô×<–¸q+N"³ÿ$¼ÿfœ=Ib…·ï®<›cak¿¡¦Y£^—,ó‹gwá8²…bsjX:ÿÑ2Î4øW›×Ì–sæ ñ®n ºŽÌ¡h¸ì–q®ÙiϧEýíÊüW³u[>&ÅÝ—erå2ìZDߎíÿ\Rð޹Q(ŸsZ<9Vµ«_þþ™$›Ç®¼RùÎ'ê±G÷,Ê›œFÅÒu…ÙŸ/à8üÝ5ì4ÖŸatL<§ZW9ÿzÔw˳:­4ó{Ôè=(Ǥ¦(š èïÔÙáòéPÖñ÷{^ÌX–¼u‡ºgŸzŽrÌ:åúÉcÔ©½ª¦¶§ÞR¹ª¦`ìî¯B+‡íÙÎF.ÆÜs+Ñé› 8U0wxz#Öj]˜…9V 1ù0ôÞq'±ú&y8^gáÆ2û¹R“z)K2á¤ïg?û*¹ºYI03“~{5YmبÓP/þ~u)À¤yx³× ÚA ÑSó¡•×É{²‰¡(^ …ÒAòhÃðcæÒTÚÕwl¦uq! Qþíîa" V|ãwˆ{°ò‡¿c6tt]ÎüªÔv©à<˜wêElƒü[›8C~½åkª¹qê¹XÕTŒ]÷á<¼WkvŒsjÇdìäú[—©¢¯¶nËGÎ6ð<ËfÁôuº1\Él 7a·Âù—Oê÷Yãó—G¶Ñ͆a`5*ÅM~[XdK p´¿õ…ðÕŸ“Ì”1L“Z1ÃÓ™– ΡÎò*É\ìQÜX&¶º¿õv¸ªw°Tâð‡èÖ×XÙ(c˜ÕÜ*+Û*ƒA÷)W~Î_–âà5ÓÄ_Ôñ^ôÞ[µ-Ç¢am”Èæ«˜Ó«äç› :Sç‹Úy!ˆVL’ÌU÷ËH'ÉÄiÓ4h¢ XÀ¨É$“l7Lêµã³ˆñ*ÉjÙK$ÒfT©V÷ÿ«&âdâK6Í!Æ'.âsiØl64—KáŽjŽb êùuò¶Ë„]X-l݃LÎÎ2Öò¹Æß¯®Fá%E5È•a‹<'=¶—ISqîëÂj±Ñc|dÿQ³Ôgqè·—ImíR¯×þÛ#—ÚßEÎ8GÓp\¾~|.«œŸ³fž•ÕàºóŒxÊÀòãjgÚÅ ³$FîÀ öB‚ÄfìQÞXam¯sœ;÷"nË2Ͷmƒò«M^•O[÷ÛØxBŠM÷ “½tÝéÇ©(¸~vâùù_çøÜ®½²²ùÙÛ]™áúÊ›y[£Û7ÊSÁý“­Ýר~¢S:‰Ä<×—`í¢oxŠq¿ „˜œ¨±œ¼Ëu½‰Eó1<¥WÐð{U–ÝàéßrµwˆÉ©:ˉy®¯4°ØºŸbÔ­tþºå eد…í‚àÑ¥<{»rˆ\ÚbqñGþjÕðŽ0Ò]fë\Ùf›q:åWM(Î SQXâG®6º‡Fñ–ɪ`÷GgYúñ:Mk}¡QÆψÇâì~šþ`%¡°K£¡›Ù~÷ñ}Ï“©d7ý¤l-OâïO3vó›ýgt*Åü: ±ÿ5=Ímâ ‘È4O¢*rk Ķ ýŽuÙNÌ`yY€)ožåBØ{Áâ’±ðž8Ìê+Öãì­M}ïM³žàj9A¾þ~›f‡«„|6¶ÏsY4cø·î¾ýd½øì(®0—XgþÆ"u¥‹¾Ñ)¢~hgÚ¼v†¯êQÜÃ|?Þ –œãz 4_p Êz§8gžó»ÁÚ”©Ð¦-¦Nz9F®ÿ6÷¿QÛÏÉÇbãñwÛ»qQ‚~×þBK÷]”P½ŸfS»m\íÜÞÏÝ_^¿~ýZ.õ¯vY—bü‹Lr?êù<ªZ™݆Çc?h•ÔÝ{ì„rõOþ©¾o¿ýVNAñá´c};,¿Üûêºþ믿ÊñÿšT7ˆo÷ Ê7?7²þÕæ™µr†ÕÜþ§g?×û(³žay~‘tÑLª¹UÖ+†Ü²)¾6|ýV¶¶öd(Įƫ­ýý’h~ŽäB_k®YLpïQ-0ÎåÏ81SÜ£L†ã,-\'Ù°`ÕzLŽá—øˆ¯Bü‹2 â+`§7’aøLÉ6ºÙFâÃÈ6ºŸÙFB!„’l !„BI6…B!„dS!„BH²)„B!$ÙB!„B’M!„B!Éæ§gã\ûöë•Nï4ØùmŽß}Ç|Îø˜ ~㉲ù±;öiÊ=}(Ưñí·ß2—©ÉöµÒ.2ûÏïñYÞûÿdéãñ¯¿p©ës+}?üʃ+®ŽQãóï«8ÕŒùjk?­Sùø%³óô·ž}@ÉÕ?}7Ï«ß-œœ¯ÍÕ9n%Š´lfmƒ»¿k?ıùìkí¸â ïÇ©u:÷urÛº'rµWþ,MGÆë9“®n+¥õ-ªCA2*â#iVRÄ—¶¨èÒW!¾úpSÜ$»¹ÉÆËF@ÆC’Í?åíd‘µø#OzqÖ6¸{/O(l'µš¡¤CW„«QÅ…y^ê XœáéÄ,W»7¹{¯@hDa=YÀ3=Ë¥J’X2C©Þ‹†/8Æøh*5^=[f%•Go‚­;@d<‚ßQ%5¿@¶Þ€¹[S÷™pfÞ-wì¿“_þ_Œ=¼JP%õÓ ¹ð¦{j;ë,'ÖÉï5°tõ1òÇ˵¯qk®rr9î̱¾„•MñU6Kuš6ƒ#D†œ§þÛéFá%yeˆéˆ“ø½[• !g›»ÍÇ}§f%sB[,¤š!¼Ï v¨®óÓ«þ…Ÿƒ¨np÷Ç¿üLÈñ~]§_w¦m»Ä[ZÿÆÃCxì ˜U^¥–‰­h´ù«÷ÑH¿SŬɬÆHnA`v–¡Ô-î¥ë ]böþ(üv‹™—:hnß²y?Å@´ŸÕkyölnßö±ž¬Âã€Êf‚§ñ,{M°ùÂŒ_ Ðã0)o®‘¶ØžÙ/ÿ¨åXº‰DGðØQje2«K$²ÍÓµ÷Ö /:$‹6ï%Æ"!z*f%ÇZ<΋Rá¯ç9Fâ÷¾³ÐÉ'æ™Ï¨£á ^al´;­æÁ“æd“êæ›X¤ÐÕ`èÈAnU;O¹•ô0âÍó<]@Wºð…"Œ‡zP­%¬O¬³½×À¢u342NxÀN9~‹sœ‡=ûíª¦øi&CpöíúоÍ‚8z)O±®`·qŠóÙd/gõù&»õwçôêfâ„î$7w‹Õî›Üÿƽ߯Z†¹[Ïé¾9Ë7nå ÇFÈ3›oÔ·YÝì&rû o‡±ç$wT†¦¦¹¨Ùœ¾ÏÕ7p»¾E2k%49Ée5Çr|ÛÈM<~ÌìdÕ ²U0_%ˆ¥áÒô?øËJ†xrÁé)m67ï3Ñ£/×ÑæÐT7X\HažæÁãY&‡ê¬-&)š-ÊmÛï#uÚŠÄçTüãÌ>~Ì/c^ŠËs$vNûø@ÜúZ0ˆÇÝOÐ¥“Þ(cžyÜM0vZ´EÅç·SÙ*aF)‡ìm–¨ÆîÍßÞ¡¯ŽÿíçƒìÁ¼›%õ3 ¾:Çk×øiqG(Â`»ÝÛ “S!, ܸv»É2¾‰ïuÕÈçj8û»±Ön?àèÆX]ý8«9rï剨ýŒ ”HܻƵ»Ijþá h™šìG_½Ëµk÷H–·Û™hUŽÕKt:‚3cæÚ5n-ðDoñ§ko§'I´“SAkóܸö‹Óaº-ghc»¾žç‰ß]CO“"ÈÿɃ©Fj‘ÅL­Í”såBoëTJÏÉ)A¢¡ªŠ£w”è äRÆÃ$8Gªì$ØïìøCÝÔ¶Ò´|ôäq7 ­ÛbóûPË›”M“ò¦Žób€®Ê&Ó¤¼YFõùÑ”óïÙχ¯õ-ÏòÝ{,ew©7ÔkU ÓŠÃÚzÃDó‡èÑ×XyY¢Þh°·½ÊÊ+;ýA7µ\Ã=€ÛbÁ= QImPqà´Xp¸1ò9ôÿïØÕ@úY–ÝF“ÆnŽtT«BW ˆ³˜$¹µG£¡SH%hÿñÉåX½—ñ›)â/ èzþñ øOÛÞf‡³¬ÿîò*É­]ê=ò©KÏó˜ÊéÛØ¶¯ç8Fâ÷g±ø¸2âÇ¡*Ø{BD‡í”R9*…ÓÎÉ&åT–š7BdÈ]uЊ0ÜõfÇ©C9/áÈn»Š£g”hÐN~=Oíé}‚6Ì• »ªâôpÅWc+UOŸ™']6*Û:î {ÛºK”Ú´ùSÄøPxçÁœ>è„zÝ{ën÷ñÔ¶ÙÔ÷Sò©2Î ý8O3¦âÝs\†àÍH¨8moï˜Ú¿×vä½ÐØyÎÊR‘Š 6»ŠÞ„n@é2YãùÊ «º‚«/@h8Ä€ªœªÜV[FÙ@Ñœo·8þ Ž7/Ÿ±ßoë4ôMý3ߥOŒf³‰ÅÛÀì<*T¶Rì6÷X™ùŽäþ/Ó¤BªÆÓj•µÅ¸·k î~¼,“+—a×ÊÀð úvlÿç’‚wÌ}r[O5¾ç8¾bÖžË\™ðàT ^3Ð(µ™n¬N+fuïH3©íÕP]*ÍòÆð»Ýàj°¹–Eëßÿ¹Û¤°\¦‰û½ËÁ R[Ö›zìN£¢¿½šuJuOËËê¤r@Õì(Ž?ÿ3xø¯Š¢`îXùË©ÚÛ~úUÝ*¦^áp-¤©³ÖO>íÎÙ׳#ñ‡°»pYx·95, ÿ8ÜlÔ T—väß4\vËéæv»ët›GòU¡ýð|kTX]ج,Ú»ì»(=|&±lÃV`£îaø`{©]Ýÿj¶nó'‰ñ-67ZÅpTAOœd¦Âpp‡”î&Øïø(ñR’ͯ–‚E9û{\Œ¹çV¢Ó7pª`îðôFlÿò¬ê(Þa¦îƒY+“_³4¯£=œhôÚ´Á¬S®ï¿GÕTÌ‚ŽÉ›UÒ¯6r(þ ôtú Óa9ÇëTl*–®+Ìþ|áí‡zŒ5ìtüh”Yf#­ã ßfªÿM–Ö »K"µƒÑÓÛ¢Œ“ûܶ-ŠÁ€ÇàY6 ¦‡¨Óá2Hf³`¸ »•³ã6ã"Z$š}ãÜ¼Ü >?ÇÖ^,^&Ž·ù&JÅ×…<ú›€¥©˜ºÍ ›E•ÑÁAPŠÄ+eÔ]•ðà ¨e’åæ 3¸Ió„,C7Q]6ØOø,6Ü6¥íMÜIå˜u³’`f&ÍᣗV6ê4šÖÎím«‰¡(^ …ÒAbjÃðcæÒøð¾žý‰?Dm—ªÁa2T/ê`äßÎ0'«šŠ±«câ>Œ {µfçù´œÁ¬íQ3áÍÔY¯è4­ýXo—¬N+Íü5zÊ0©éЦ ž€3–%oÝ¡îŧvšËUôÕÖmþ½b|»*Þ`F2ÃŽ=î>¢õAñò+$ÛèÈ4 š((0ªE2É$Û “zÍÄÈǹ÷÷›+6‡z|•²Õã k£D6_ÅÄ ˜^%ר¿CœåU’¹ †Y£¸±LlõèÖÛ‘rÛ”sìæÚÂWN2SÆ0MjÅ OgfX.€AùÕ&¯*F‹\3ÍVÍM°ßÝn?øÏ‰?Øù—ÎøKû¶¨t:ÙK§Ñ~œŠ‚{ààg÷ žÓ\égÑbêVTLÌ&XµnÃaüª‚­Í3 zn¢6Ì•€ «ÅŠÖ7¿A6U¦IƒR¶‚ó´JŽJ³Iyóàçr–â©?8Ф²‘B÷„ ÷iX-6ºaígïc=¿NÞv™ð  «Å‚­{ÉÙYƼVøíÝˤ©¸G÷u´sŒñ‘³<Ó¾¯ç9FâÐ̳²š£bTwžOøB~\mçÁw)w`{!Ab³ŒaÖ(o¬°¶wšùôÝúk;ë$Öjxƒ~Ž^2ˆn}•2†iPÍ­²²­2ÜOw¯™&þ¢Ž÷¢÷0áj]·Ù¶Í‡1§üiŸlÃTïEOÔÅÌ*«;nÏÛÄ4"‘ižDU0*äÖˆm7>N{÷^°¸dg,|‡'³úеÅ8ù§Þ‡k××¶ÇèÆ"¹¿úsܸ¹Â\bù‹Ô•.úF§ˆúU ý<øNîa¾oKÎq=š/H8Pe½Ó|ºŠ­Ÿ~ó ~4|Á)ƆìP=솘œª³œ˜çúJ‹­›¡ñ)Fß,‡ª^ ÛÁ£[lmêVhÓfS'½#×›ûߨŸl[º] ßyx•ÕÃE/ü£àcì”ýÇýåõëׯe„øý}ûí·2ŸŠÍ…W«S,Õ65.Þ¾MOò‹_Z†õ5õõ=¿þú«œëº²·ó”ËNnÞÅùa%QŒßb‘É„=ƒêñí¢A§¨Ïœl£ !¾8ÛcÓ“º­€­o„³H¦Ü”¾ ñÑ3VƒZ9Ãjnÿ›>Î*dW[ úû%Ñü"æ)!Ä—¦¹ûŒÅd”‰©'|£šÕÒ‹Ël7¤¯B|ô\³˜àÞ£ßd·]ý®F‡p*`ì¬O¬³½×À¢u342NxÀRyÆ­¹ c¯Ò£TIý4C.ü„iç»w/ÕÍ$±d†R]¡«/ÀP»¿öÑÔÉ'æ™Ï¨£á ^al´;`V2$â«l–ê4m.G&ˆ 9ßûsaURó dë ˜»…1uŸ g†»÷ „FÖ“<ßþŠñÿ‡‘'½8ګ߈­¤)è ®þa5Ò}³Ü¹`oûZËöÔ6Þ­oz–°²Ù¢ígŸ–Ç£¶ÁÝ{yBa;©Õ %ýÝã(>-ÀíÛ>Ö“5‚#CxPÙLð4že¯ Vï%¢‘~§ŠY-’Y‘ÜÒibAë3Âc7©äÒd¬G&¥®A"Ѫ/d[îW+¸½PÈòfÚ¯no ;ƒGN[öAahjš‹šÁéû\õŸ°žÙª?mÆå¬¹€$›ŸkÂi4 ì.L=ä~ÔsdE°‹Px§ª ºý :¡^7©æÖ)hÃ\ z°«*NÿW|5¶ReN—˜”SYjÞ‘!7vÕAO(Âp›çº,WFü8T{Oˆè°R*G¥ðœœ$êÁ¡ª8zG‰BîÔmÑF¾a ÇýHÌ­¤STÆîÜfbÈ]U±Ù¨–Õ6ó¶â à3ó¤Ë&Pe{CÇô°ÅÝ>þSOîOë2Ïë>ûsük½¸•Þ(Ó‘5ž¯Ì°ª+¸ú„†C ¨’EÅ©?Q•Gב“XÁÞeÇØ5N]·Q7P]Ú‘ÄVÃeos(ì.GÚbsjX:ÿ¡×hê/˜ù.ux ›Í&oè¸Sl±á´ïc­b :´O±Ñm³PlûÚs´¾vïýWó´ãsŠãaQôQöÎ?þ›A¥þöx¼™V¬N+fuÚÑój¯†êR±š*Æ®~dòÖÙ­íÿ¤jvGˆŸÿ<|]QÌ+ÉÇ™O sùÊ,£“r.ÍúÚ:[·‘Û·çä~ÕûÕºMÿ™ÿébTŽô¥Y§T7ñ¼W\ó mo7Ê{m_ÊÁÙçøuœoO7÷uš·»á…{i'áAç¹Ë9oÚ´¯±óœ•¥"lv½ Ýmº‡€Ï$–-cØ lÔ= ûígŽ¿íû v˜fNîÏlju’l~¾1²ª£x‡™ºÿ f­L~=ÎÒ¼Žöpâ P(X”ãËõV§•f~½8Þ-Ý@ÑÔVù„  jo‚­ûà$«±Wk0k»T “ßzQÛ ÿfS±t]aöç î5jØ;]‡ý±('µOÁØ­¿MXÍ:åƒ%”v¯)íÚcn¼S_ë÷ªè«§ŸNÇCoÙGñÑ®$šÇnù›4* _vòèon4S7h˜o&ØÝƒ•=;]våà’10+ ffÒ>Šiµa£Ž©¹0 küãÇ$› _(ÊÄ´†~#F©m¾Ù¾=úÕºM¶aÕeCý¾Xl¸mÇO8‹¦µnû±i£õ4”@‹1ŸµsÌñä×O=ß¶âH5MbSÁÛU$‘ÜÁ=ùÙɳÌÿíâ‘‹1÷ÜJtú&NÌžÞˆuŒež€3–%oÝ¡îÅד4 IDAT"¶‹¿íÇ¢|®xúqbÝçï«ÝF7òqîý=ÁfÅÅŠÍqºôÌáÑ­¯±²QÆ0 ª¹UV¶Uƒn‹†µQ"›¯bbPL¯’k4îÀ öB‚ÄfìQÞXam¯]¬Ì³²š£bTwžOøB~\¾¾ús’™2†iR+fx:3Ãr¡u5:.À*8/ÑŠI’¹*†Y£˜N’­wz ìghOë÷šgŸ¶ÇCBØFÏ­SÔ†¹paµXÑúF¸â7Ȧþ'ÿ3¥Ö!ÒïÂj±á \aø`Á¤ž_'o»LxÐ…ÕbÁÖ=Èäì,c^+ª/Ê"ôwYÁlP¯ÏeUíÔžrÇmøÖmR¨l¤Ð=aÂ}V‹î@˜ÁT:·ým[ÛøBcŽ·Ÿyþo±¨Ú¶œ ©Å5Ìá)¦¦"8sˬÍcÊÇji4QP,`T‹d’I¶&õZû;,ÅÀk¦‰¿¨ã½èm±àÒ>þ~¬>|ŠX'+›Ÿ)ûÐW OIÌ\'X»úžŠàQ:þ"“Su–ó\_i`±u34>Ũ[ˆ\ÚbqñGþjÕðŽ0Ò]fëØE1Ì÷ã bÉ9®Ç@ó ª¬·ºˆ\a.±ÎüEêJ}£SDý*à':¥“HÌs}¹Ö.ú†§÷Ÿp™)~¯ÊÒ£<ýÛC®ºÛ\´Î SQXâG®6º‡Fñ–ɪí_CmÓž÷Ÿckó^…3ŒO»ãQ“ö‡©gY\°1™æIDŬÉ,-ðl·I“5-YßäÉT_¥Hn84¶‰/hD"Ó<‰ª`TÈ­-Ûnа,‘ð^%òó&£’cm!qòªfS'W0˜˜~Èä ó­ÛÓQ›65I±×Üç‰Z£˜YeuÇÍà{±©ži×ö÷ÛÚº>lrj}‰Î7ÇŸa¾m§å\¬PY_bÍ q3àDQœŒ¤™‰=cpö<ïÇ”ÞÓ»?B8»ÈÒ×iZ»è 2xF<gçfO›~xx-l|{Ô6Ii›øÒ.†™çü³ë>syýúõk¹ÔÅ;jevtý`u°Jêî=v¹ꬴ~­GÖÏâÛo¿•AøÜÙ\xµ:ÅRý`…TãâíÛô$o°XOï|j¿þú« ‚8°ÿH‹L¾÷a_ñg AH¿dë–çI À¤š[e½âaÈ­´}Mˆ¯Å6ÄØô$n+`Aë!ä,’)K¢)Äï´ jå «¹ýomhôç#+›âÄ;ÄòFœ¥Õ-ö¬Z+cŒöÚ;¼&ÎBV6¿ˆtW ÊÄÈNÕĨî^Yf5/ÿ=Èʦ0w–¸õ(g2Ò+ÕG’M!„$›BH²)Ä×D¶Ñ…B!„$›B!„B’M!„B!$ÙB!„’l !„BI6…B!„dS!„BH²ùé™Å8×¾½Åz¥Ó; v~›ãÆwß1Ÿ3>fˆß¸A¢l~ìŽ}šrÏ¢¶ÁÝïæyeÊöE³t3öàW\–ýŸmnÿó{|–?a[µ‹ÌþYÛ&ÄÇ™üÙyz[Ï*çûí£1±šâ§7søÑÿÿâ”ùjk?­Sù“|¢ñøÔmþ3„‹¯õ²TœA¢ãý8µNÇY'·]¡{ò!W{U™Ï„B|Ù1±&ã!$ÙühwVkñ-Fžôâ¬mp÷^žPØNj5CI‡®þW£>Š ó¼Ô°8ÃÓ‰Y®vor÷^ЈÂz²€gz–K•$±d†R½  _pŒñÑTj¼z¶ÌJ*Þ[w€Èx¿£Jj~l½s·0¦î3á̼[îØ'¿ü¿{x• Jê§rá'L÷*ÔvÖYN¬“ßk`éêc8%ä1Ž—k_ãÖ\åärÜ™c} +›$â«l–ê4m.G&ˆ 9Oü[³'·A=¼ÛËÄY}¾ÉnýÍxáT º™8y¼Z‡ýß«½úØJš‚®àê&ÐX#Ý7Ë vÌJ¦E»[¹ø?ŒÆÅé)†ì*ܼºp‹X@¡khŒ‘˸íPÙLð4že¯ –®A"ÑÚ)Ço±`Žóp¢g¿]Õ?ÍdÎÞá‚£]N{\?/òÌæõmV7»‰Ü~ÂãÛaì¹É•¡©i.j6§ïsÕpšÕ·Hf­„&'¹¬æXŽob¹ÉƒÇ™ì£ú"A¶ 櫱4\š~Àã?pYÉOî`â 8=Å ÍFàæ‘ íh¹Ž6‡¦ºÁâB ëð4Ï29Tgm1IÑlQnÛ~©ÓV$>Ÿ âgöñc~óR\ž#±cœ¡ o&Šky/³oÇóYÑ„ÚfËñj}L¨¦XXÜB¹ÃãÇ· »7Iæo®ö–ín} ćÑy9¿@¦Vccî±ÂA:§xöX𹯵»Ijþ£ X½D§#8s1f®]ãÖrOô&¯uÿ÷ì½\rf™¿q»Ï ¢7 Û_ð÷kט[kà¹L·,¾ãx1ƒk7æxn {÷ïš;Õ±‚‘O•Qû†p¾Ùý÷pëi6v›mËh[·çuÎ9Ñ,¯ñ(–C¹ÉƒÇ·‰xJ¬NÊJøüv*[% À(åнÍ5ÀØÝ¢¢ùñÛ>fì4¡–aqaæ…)<~̰›|ìÏÊöSÅ©†ž&Eþ“SŒÔ"‹™ZÛùþXªÙnŒ:”cì®ò¼`òþc~™ôc¬-Û|oÉ·eÁ=è…B–7O T·7ÐÁý…Žv1ëÔÇU’ÍÏTÑ!ܪ‚êöpƒÑ0[®ê#ß0ÐãÆ®ù»s›‰!7vUÅfw ZT~×4 † v¦r?êAi³ZtXn›<±²õ‚²{„ð€»ê¤78ÎÄeʹ2¨·u*¥çä” ÑPUÅÑ;Jtr©ò±ä¬sº…‡pŒç êuìíÇ«Õq¨¤STŒiP9a!\Õì(Ž?ÿ3xxŠ*Š‚¹c=8¦&†ùîyþö^ïmÍ|œùÄ0—¯Ì2ê0)çÒ¬¯­³µÛ^í&3ç… Z1I2Wݯ/$[ïÜîÎÇ@|èMšzŠ!­ç×ÉÛ.taµX°u29;ËØ;ÏSv¦ú¢Üù!B—Ìõªq®:…—Õ W†5 /ò4NQF»º…ø1¤Ýuç b/$Hl–1ÌåÖöZ^9t:ÙK§Ñ~œŠ‚{ààg÷ žO0-:ü!ºõ5V6ʦA5·ÊʶÊ`Ðýv7£Ý%Ô̳²š£bTwžOøB~\§ŽSíǨc¼;RmgÄZ oÐd³sw¯™&þ¢Ž÷¢÷0n]·yÆã*+›_ »?B8»ÈÒ×iZ»è 2xF<'p‚+…§$f®¬]} OEVÔ4ü^•¥G7xú·‡\u¿¥¹´ÅââüÕªáa¤»Ì€3ÄäDåä]®ëM,šáÉ(ûßÌô^¹½mÊ96ù‰Né$ó\_n€µ‹¾á)Æý'ÌDíÚP;ßxíÜñµžZA¦¢:±Ä\7lt0â-“UÛ·[5ÛñAš:¹‚ÁÄôC&n°Øn®±M|A#™æIT£BnmØvÎðÁ„zf‰„÷*‘ŸŸ0•k ‰ý•Åf›:ÞÿгF‘—˜òæYÞiœª K›º…ø1¤íœèæûñ±ä×c ù‚„UÖ[ÕÓ=ˆ‹ô»ö“žîº(¡ zù$·àö!&§ê,'æ¹¾ÒÀbëfh|ŠQ·rBœ:>!+®0—XgþÆ"u¥‹¾Ñ)¢~8}œj;FíâÝ(¶~ú̓úÑð§²Cõ´}T¯…í‚àÑmÇ6u+œí¸~.þòúõë×r¹‹?½Z™݆Çc?¸+®’º{ðC®ö|ž™ã·ß~+ÇUˆðë¯¿Ê ˆÎÜyÊe'7ïžþk N.‰bü‹L~õL•mtñy\üõ Ë󋤋`RÍ­²^ñ0ä–%J!„¶ eP+gXÍí›Åשd]|÷(“á8K ×I6,Xµ“cøåL!„¶\³˜àÞ£Ga§DQ¯Óh€ÕfCs{ñùüôºU#!„¿»¿¼~ýúõÛ„¹ß‰¿,Ñ8ée›‘ÉqB ”B´¸S#·¶BòE½ÝeWÃá0Á^ŠŒšBˆ¯"Ù4+l,α’otx£ÁÉÛDý²Æ)Ä»yæ&ñG1¶²L‹ÍJ³Þ~7•­¦ï]^ZÿSÑ!œ’q !„ø²“M“òo3Ü{©Ÿîí/c³Ó ÙkTÊ ʼnÛm—ñõ&š• î®PhZp¢D/ucSU0 PìPH²¼–!¿Û<~9u‡¹3”„S!ÄœlÖ2Ìýû2¥3üŠÅåEÛ-°÷æ´~Æ¿2à8GÄ4_±ð×?±¢>¾r•ž3k°9wXIcdö>!çŽQuƒŸ~\aÏ5ƃ;C§xvµF.•¢hz„ü8äüþr¯ˆÏüƒlÝFÿøL 8Þ»¼æø÷åý«K»8ÆåfŠDz—£i§µÿoÜŸèå|¨˜ì<½Æ£í扯ZàaÔ#7ƒB!þ¸Õ é3%šÍ£‰&€¾Eì‘ çì7¸ÏÕ¬t÷ûÐŽü‹¢ú°ÿ¢¤bÇíêBqª§ Ú¦ÎæÚ ¶Ì~|A?‰ô_j¦É«DŒl\ái¢Ço+TOˆp M*“Çêð2À?¢“]˜#YÚßWolÅHî3ÑsžtSÁîbP10ÿ­Ni«€¨6yÆZ!ÄšlšÔ úÇ)Jß"]%rîlÓÍåè½'üºYþ[÷^Rï!¬m²¶µKÃêb02yàub‰uò{&š/€Ï8òûÅ87þžÅô$M*¯£tõ1<øÀ“YÎL±=ÁÉ1|öŸo½Æ]N²°²Å.=\¼t‰A§NþÅ?Xبʙÿù¦š”SéƒO7)­.‘®´~·âÀï`ÿk‘Ò üûÌ›DóÀ^ªíïŸVms‰ù{`íc|jt§á´çw‹ëË,¯ñhñù†—K#ñR »Gü•Y”s[!>¿ÿʦY&µ8O2ßüH=ðàÿ O94(mm½³¥oUŒÝšìºÂí;pP#s÷ßYÞ­P¬ƒ3ó‚Ðþé Ì~–n<:X]±= ~§«˜64§òꊻÛÇ…Àý»Ðd‹óó¥“+=Á¸´Î j5—`1¹{byù£Îó¯šÅgÌǶiàbdz‚ƒ¢ª¹öç÷”Öî|6±®§Ð±Ð?>Áh~…[3/Øz‘g4(ç¶BH²y¢* s$ ÍWd³@r1Žsá\ßÅéåoÿœ>yýÍÿصƒ­9Uyûj­R¬¸]ÑUqâÓ`뽘nqºž UÐ|¤ë4*ußIãìѶAUœÞýjº­’ÍÛsœê 3HLo±Ûb°vGýræ®Ì*»µ£ÿPf«lÒëi}"Ôr‹ÌÄò´ºêô’ŽyáœßìPͰ8ÿ‚=¬ôMN:|œÅ¤±ÛáüÖÚ__u}¿Å[þÊÖÑ:+E ¯œÛB!ÉæIAosùã&šê¥,+ÏS˜¼ÍÄïø]œªftÊ»5èq€Yá¤GQ›•]tzqb¢ç÷ß`uÚ°šV NeGÇô«(T °„£RÃÖ7Âôe ³”g3ý‚—ù4ËK.|w.ȳmŸk¾ùÎ%T';¿€ûæ$Á“þBPíëk­MÓ0Ïy‚ùma™|\#Óï]{ Vׇœß 6›PèŸbø`÷Â4MPlØôŠœÛB!Éæ±%r뚟¬ü:[‹1|¿L3t¦O;ì?³™}'Îi ŒŒâë ÝÁ ®—Iv“g¾ìÇVÎßBÐW™Ÿ¯à·UØÜªƒ¥a¿‡9Œ/#ÿrž…Æ .³@z«¶—½*œãYT Y&—/ó¿ë«ü#¹‹¥{à€ÅfÅ4UÙjü|)Ø,ðÎ…Ô,\Jbˆ0äVÀ(²žXe³làô¹)ív(Q9Ïš¦Iqu‘—{jyøÒ‘6ú/ó¿Ãù­·ï§'4„m;ÍöZ çì¤x±­£]¼Í”CÎm!„dóXlÒÉW>u%ž§+ žå .?³ 6lÁáÉ&à2õ·±•…lÍ;Ä –&û^µx/â7·HoÕ±võžˆâW¿i’L<'—}I+]¾‹Œ^¥Gåìɦâf0à"ób——KkøŸL1Y[æYz“É,`¥Ëw‰ðØ€¬ü|¶¹¦†Gƒ­÷?ˆ¶—%±` Ü¾Š¿‘#}ðD»{»‹´ylçÚB7?ä§SØz÷¤ßî¹ýùmvøB Åfzâ«^$·ö?q~éoŒýÿíÝ?lSiþïñ÷ÞëSäHk¶n\ÄE\8…#á‚Ia¤ñ•p1)’"#ႉPàN‹²e€ˆAYPȈÝÑODWNa¤uAФ…WJ §0…#aé:…S˜ÂH¶VÇ#Ç· 2;–™|^ÁæùóÅ_?_žçøx8€½¶ED~/>ßMÝçÌÿŸ¿³ó©û M°p5—°¿±ë£Óá§ñÝàZ>Æ«Šrj†Û›õà Çè·\ûÚ`}9ƒÑYáé¿^Ñ^Ñïî‘êÕ)""ŸÆg¼õ‘¿[ùm üÑÓ´J¥úæßùëí/:z†‡ê>¢9wÑ€ Mù#›†ŸþpÇ'ïÆÛíGWmÉºÜ ÄÛ‘õ—ì%ÔŹ¯sF_ .pNe¹Ù޾"ÓEhìWûöþ fIݾÏf èáÇëöíA"""Çõy¿AÈÓÇØÕ³t’%u>?¡BSNÃgrìGŸx ÿ²uéTȦ—_šîÓLLªÐ‘OïóîlþÂzÎzz…õg/h|„æ\§L$ˆ÷ès¨r²TsIî/mµ¾‹PG?ßNGiæ7Y]ßâEèŒ2q5ADé"""ØbsŸƒU­Ñøàcun]¤)'˜SͳºœâéNýˆgz Ÿ=ǹÁ^|ºNSDDNF±)"‹]yN.ûŒí•ZÛÃtãí Šô3Ð׃_E¦ˆˆ¨Ø‘?Šÿ¡ˆˆˆˆˆŠMQ±)""""¢b°òÿd~æ.\àÒÔ©\ç=Ûpž?àòu*‡=VJrù ë•ß0H§DrjŠTÙù€ npëÒ<ÏÿL|ÛÅFþž?|?o~M‘,9Ê!åˆÈ>׉¹•eñÑîÄuúÜÔó)æ—àïþØGºÓµá1:v¿W/4ùC&/+Ð}î;F{Ìý·”ïÇûÈ»rHDDÅæï–½»EÙÓÏtŸÓ3'âž#_qˆrB»¸N2µÎöË.o7CcŒôíU¥Í…Ô<óÙêx ÇÎq~¸Sb5ùŒ¡ŸzñN%K*¹Bn·NÓÝEÿÐ8‰?`×YN­SxÙx}“úÑQâA›Ìü¶ê ˜›Áž¼ÃxÍó'Ë<Ψ5ÁÝ%1– Ò²@vx™M²²–ãE:O'¸8:€ß€j.ÅR:Ën½ ./áØyƆýäçfXéžæÎ7Œ½Â|nfîé›|0ÚÎã­bsDfmpëvøˆ‡ÌJ–ÝÚ¯ç$Ÿ‘S§ÔðÐ à?Fð•CÊ!9™Nì1º¹ÊÝù†€ŽU¡”ߤhû‰önkeY|°NóÌ$w¸> °tŸ'{ÇrÚ&b|wïÜŒbgYÌZo¯´$çST"cÜ\XàÇó!JËs¤Š6T7X|¡cð*wn21Pgu1MÉñ»:I¿ÛMtúã=ÎóK›pöê]î~Ç×F–dºØúø¿¹Ëj!ÄøÍŸX¸6‚'ŸâIÉ+Çr2‡{hš» Üœ8EõiŠ­ª‡p,€½¥²×¨Uؤìr&`´ŸÇ!ZƦ];GõQßf%×MâÚ›9¥‹Ž²ù³ÿ­B¥nóbeŽ™Ë—™º1O*[9üµ¨R‰ˆŠÍ«šáÖ_gùÛÒ&æð8ÑCv7ªùuv¼ƒœ‹ñ˜&þÈçÂÏ2eÀå sn(‚Ï4ðôÄô°D²­>ÛIDAT›Ésp©´wÖÈ1Fã=øL_ï0£ýÏ”)?{J90ÄH_é§76Æø×aŒïýŽcÓ°ð93y;£AZoHtÀo˜ý~¨×ð„9ýã<¦‰ÛãÃt5¨6<áAk›\ À¢)ã?sÿó8l¸­bSiÓŽudD‡ìÍ)»¡…ò³ol6êàvã>5Âäµi&â^ Ës<ÊÛÊ!åˆÈ›÷±_Œþ»ŸJ1Ç“Å[Ì»n2}æ`ÅéШ4pù:yóUÒžNö‹½EÕÓ…ïÀWfºý^\ Þ\hf×,šµ§Ì^Êì½Ùlâ ýÌÏeÃëg¿ ÃGä—1¼õþoôŽr5±ÊÚãYVj]§¢Äãô™-–J—‰¿Å×y6Šk<~T¢â€ÛcRkB7€&L’ÎVŒÉÔÄNûŽ˜GÞ]°[ÄæßmÚùùˆ>p™øÝoþ-ä?Ãðǹ~/~ —œ/也ÙÁŽDÞ¼ž•CÊ!Q±y"747ñ¸cb8ˆ‰¿g€Xh…ÅB çŒïÀÛ¯A‡¿ƒfá%½øöV/«fcx÷VëU›ý©^ª»ŸŽ«œá6qužãægØ/em õ'8;5~Ù]±x¾‘Ljœ¡ç­EΩÖ0BƒLÞùÇ*SXOòh¾†÷Þ8ÁC× ×!nç—˜[ë`ôê4}~œ"§–ö5 Åz°ÓYŠžµ@œˆçèyº·ˆÍŸÛ´Ca½uÎFË9Éçe—säjÝ DÞä‹a¸ê®w^ƒÊ!刜\'÷šM?”2i2Å*Žã`•6Y+8ûÞ½H߉Ó][åñFÛ±©æWx¼mÒÛ»ø¿YàñJžŠmS->!™± Ç#vqÀŽ®¯‘Ζ±«”åáì,Ë;6þ(þò é|Û±(m,³´RÀ1Þì Ù{@v!Éí¿¥ÈUl0:pûÌš¿ãØ410\`WKdÓi¶uëõân†¾"hgx¼Z#t6¼¿¶›Ç¡ZĦ«M;ï݇ügv6)ñôÑÒ¹2–mS-fHg"gƒïMÊ!åˆhgóä›= &‡“$¿g¥.w‘á«$ú<ï>Ù3ÀÄdåÔ!¹”¤xï"=f¯Bð÷0çn µÇ!I«ØÐ®6YJÚ/¦Ø 3™hLßæ¯up¹»éKL“è5•CÊ!‘}zõêÕ+…á±6¸5󌡟®Ò«#+åˆÈ ¤O£BN­B]aQ‰ˆ¨Ø”¾H–RÌ>ØÆ=ûÞÇs"¢ù£Ð1ºˆˆˆˆ|2ÚÙ›""""¢bSDDDDDŦˆˆˆˆ¨Ø›"""""*6Ûp(>¼ÌÌ“Êϳ)þsŽ© —˜ËU)>ºÄ…ªÿ‘±¼fåÿÉüÌ%.\¸À¥©9R¹*ΡOÜàÖ¥yž;ÿ¡?ÀåëTôbS}Q9äðüáëüyókŠdÉQ‰ˆ|.…à}ßíkä·+t{‹½&¶wœ1» Ïjýs‰rèIÄË tŸûŽÑýï0wÑáÕäEDTlþ¶j.ÍR:ËnÝ óT”ÆG+YRÉr»ušî.ú‡ÆI t{0Ï¿j Xœåáø5†+OHí$ˆôú^ïzÜ.ñYɲ[ƒÎÓ .Žà7ZµéÇ8b,íØ»[”=ýL÷ù1 0#q"î9ò‡˜Ï8tÞ/³IVÖr¼¨ÿz|Õ\jo Mpy ÇÎ36ì'?7ÃJ÷4w¾ `ì¸s3ktOß䛀Ñf^‡hÖ(¤æ™ÏîPÇK8vŽóýx m;-;"æ¢:zuJ ÝÁþc½h”C""ïãÄ£;åUî/åñMswá‰à.«;{«“]$9Ÿ¢ãæÂ?žQZž#U4˜¼ÊW^7ýWïp1rÈ^L}›•\7‰k?±pmO>Eºè´iÓn?–#˜‘«ü×oàXJùMжŸH«U¢¹Ëj!ÄøÍ7ã{RrÀʱœÌášæîÂ7'NQ}šb«ê! `og©ìZ…MÊÞ(gFÛy¦QÛ$CŒïîýƒ»“QìÌ"‹Y«};GõÑ*æ¢:ÖÿØ*Tê6/V昹|™©ó¤²Z¾‚”C""*6³3QÎla…$xL=ñƒ{kÏÎy#Æh¼Ÿiâëf´ò™2G¿ýv `˜ÑØ §M›»ì¶˱U3Üúë,[ÚÄ'êk=¾øÈþ½ñõû¡^wÀæüõkŒð˜&nÓÕ Úpð„c­mr5‹B¦ŒÿÌiü+—+̹¡>ÓÀÓgtÐÃn&O¥M;Ö‘}sQk&:¸Ý¸O0ymš‰¸—Âòò¶rHDä#8±ÇèvÝÆìò8¦òÒåy»fѬ=eöRf?@ÍfW¨ƒyDDMüî_~xÓz»6n¶˱ùbüðßýTŠ9ž,ÞbÞu“é3¾ÃÇ×b ╨8àö˜ÔšÐ `†‰“¤³cE2µ±Ó¾cÄŠw=]øôïö{q5jü»]|Žè£UÌE9t†?Îõ{ñ¹”à|!ÏýÌv$òîh•C""*6ÃôšØ/j8ì]C…ÅK«ùú­Ömâê<ÇÍΰ_®ÙLÊG-]¸y¯nݦIm¥õXŽÜÐÜxÄãZŒ‰á &þžb¡ 5œ3¾C–ÃÇgç—˜[ë`ôê4}~œ"§–~‰¡Xv:KÑS ˆóËégûXÂzAÕf±®—jàîçÏmÚ¡°Þºg£åœD9t¬¢¹œ#Wëf ò&_ ÓÀUw½×ø”C""‡;¡Çèh?ž©\Û±(oz@:WƲmªÅ é¬Cälð¨=XåˆÈ1œØM#0È_Æ,¥ç¸²ÞpŒ‘h•u3ÂèdTjž+Ë èèäÔà$cœÚnµnÓ ÍXœ›ËKäO_ãÎ7æ;¤Ù“`r8Irñ{Vàrw¾J¢ïýn$ã‰$ÙZäÑ÷Whvtr*>ÌXô É¥$Å{é1ƒ|‚¿ï„9ßck^‡Æ½k„³¬3?µHÝèäÔð$£h×N›Ç,%±rè·åf2Ñ ™¾Í_ëàrwÓ—˜&Ñk*‡DD>‚?½zõê•Âð…«nÜîa4æW,D”C""¿+ú¡/žÅóg NŸÖ")¢ùýÑΦˆˆˆˆ|2ÚÙ›""""¢bSDDDDDŦˆˆˆˆ¨Ø›"""""*6EDDDDŦˆˆˆˆ¨Ø<‰œÉ©)ReçóõYÍpãÒ<Ï·~ÿÛ&BñáefžTŽxžMñŸsL]¸Ä\®JñÑ%.ÜÈPý¸A=æX¾ô>D9¤y›K!öëKüv…îoïq±×ÄöŽ3fwáQdD”C""*6X*YRÉr»ušî.ú‡ÆI ø±ó™M™ŒÝ¥×„JæsÙ>¦§OS˜ÀV½s3Ø“wï1Z¶cXܺ½C|È`=½CðÂÿ¦ôÿñ™•,»5è<àâè~ª¹Ké,»õ&¸¼„cçîÁl±ËPJÎðÀãÞx¼Þ±™Í»y3¾wŸ_Í¥÷Ú7è<e qT,:È=˜ç_µ,ÎòpüÕ'¤vDz}`mpëv¡å|ZÆåˆ±¼­e\Úöÿ~}ˆrH9¤‘Oãä£ÛE’ó)*‘1n.,ðãù¥å9REO$Áhwžåt«’!¹ ƒã1ü†ØÕIúÝn¢Ó¯ÉvíPFz«ƒøÄ_ÿ¯ÿ õmVrÝ$®ýĵ<ùé¢VŽåd÷Ð4w¸9qŠêÓ[-ÏÚ ý!ØÙâ—ÓÈêö5Œˆïeµ¼Êý¥<Þ¡iî.\#Üeu§qD, &¯ò•×MÿÕ;\Œ²Ój>mâÒv,o;*.-ú¯>D9¤R‰ˆŠÍ¾N7bŒÆ{ð™&¾ÞaFû!Ÿ)ãà!’¥;¿ÈßæWapœ˜ßø€v¼ÄßÐ×Àãè$:<@À40¢°xœ¿~ñÓÄíñaºT­/,3‚QÂNͲTÙÞ¨ˆ…9žs(g¶°B <¦žx‚ÁÎãΡÃçÓºÍ]vÛŒåGÆå°þí¶óårH9$"ŸÏ‰=F·kÍÚSf/eöƒÐl6q…8€á 3Øgp{ÓÏH¿ÿƒÛÁåÆï>qóÀÏ¿^|Å5?*QqÀí1©5¡»Ý$Œ ѰÃÒVÛ½ÃF=È`äð+ÁìºÙå=У—®×+÷s0x>ŸvmþÜl=–ôK«þëïׇ(‡”CÊ!Q±ùQnWç9nþp†ý3ÛÂÂózi¨n’Ê„:K¤ÒEB£‡_÷Õ¶g0pýj=|û罿’_bn­ƒÑ«ÓôùMpŠ<œZ:j£!œ¥- EêÁaÂ-Ö5Ókb¿¨áØ[<,^ZÍcÄ¢|ä›Oë6Mj+­Çòþq9¼ÿvóårH9$"ŸÏ‰=F÷„ã„ëk¤³elÇÁ*ey8;ËòŽ TÈ,®â N29™ÀŸ_f¥tð0ÌÁ¶ÓÎñ9ŽMÃvµD6f»áP·ÚÂ(!g“äÓ:¡¯B-öP Ñ~<;)R¹2¶cQÞxÌêË;‡ãÅ×i;–ã½úårH9$"ŸÎÉ=1#ŒNÖH¥æ¹²Ü€ŽNN N21¨¬?bÕ‰3õc~Îm2»ô„þ›ß4¼DB&îOñðÛ{\ìmÕŽ Ö{,,‘#[‹<úþ ÍŽNNŇ‹>!¹”¤8ÝÓfA¢!Û;ab=f›u¿Œ5XJÏqe ¼á#Ñ*ëmca‚SûÈñ51h3–÷‰Ëõð‡ÍW”CÊ!åˆ|6zõêÕ+…á÷ìõí[™àÎhCQ‰ˆ|Aô B¿ë5ÒÆ*gYÉC$Ð")¢ùâ装¿çu²”âöýÞè_´LŠ(‡DD¾<:F‘OFÇè""""¢bSDDDDTlŠˆˆˆˆ¨Ø›""""¢bSDDDDDŦˆˆˆˆ¨Øü28¥$—/̰^ªn\šç¹óÖï?^g$§¦H•oÔyþ€Ë7Ö©|üYR|x™™'¿¡åOO=fQ)‡”C"òYè„Ú0ü1FÇNã÷–â!¢›ÇR%sc–lì×Ïx ºÎïW`äG~ˆù ºÁ­ï3ôMÇÈ%Ÿ1ôS/þã6mmpëvøˆ‡ÌJ–ÝtžNpqt¿vqdjí— \Þn†ÆéƒÍùlÕ07ƒ=y‡ñžC¾:¯Y£šg>»C/áØ9Î÷âœJ–Tr…Ün¦»‹þ¡qþC¾ëÙ¡šK³”β[7è<e qàÑíP|ÈL:ÈP¨ÀÚæ5£“p<ÁX¼ó­Ÿ£‡rr†Î÷Æ{^«šáÆl–ØÍëœñµ›Cû1‹rH9¤‘/× =F÷Žx¨<ÛÅìÝ<5àen °_<£âq`óõmVrÝ$®ýĵ<ùé¢V–Åë4ÏLrwaë# K÷yRö»:I¿ÛMtºÅ" 4j›dˆñݽpw2ŠYd1k]$9Ÿ¢ãæÂ?žQZž#U´ß]&Ë«Ü_ÊãšæîÂ5Á]Vw¿¬pmÛ±_¬°V2qg'"Ø«Xʽµ]ÕrŽèÁοœrV·7¨ùcD|íûn;fQ)‡”C"¢bóKä„1Ë9ÊŽC9WÃÿU”ÎJŽŠãPΕ1ü¼ïÛItx€€i`"D`7ªùuv¼ƒœ‹ñ˜&þÈçÂÏ2eŽs©–ËæÜPŸiàé‰3:èa7“§²³FÞˆ1ïÁgšøz‡í‡ü;í:”3[X¡‰ÓGO<Á`çÞ:yT;®#‰>_Ï0£1…õ¯NGÛÍ‘`”°S`³ìU¶7jbaªOÞ¹ƒ^\Ï*4ögtÄ¢a‡¥­2¶{‡zÁˆçȾn¶³(‡”CÊ!Q±ù¥®”ômžlmdÔÀî²Iom`$`À2ÔÀe¼ûgþš…—XôâÛ[X¬šá5׬õ‚ª þ½§×K5p÷óg·‰«ó78³×.`[XxÞY~M¯‰ý¢†C`oá±xi5_°];å,ŽõËÀÞÜê•ÍŽÓtÐ<æ ‚ÑÎÒ…Ž"õà0á½¶îÛ¤¶ÒzÌ¢R)‡DäËv‚o}dÒÝïçåæ&5¿aèÛû9ÐOÐüø=ú"qºk«<Þ(c;6Õü ·Múc¿,¶Ý¦fÇ+y*¶Mµø„dÆ&ÐŽ®¯‘Ζ±«”åáì,Ë;ö;‹u Úg'E*WÆv,ÊY}¹·ésT;ú·Šë¤V-B±È˜£çh¢„œM’O넾 í/ä­ûvÚŽY”CÊ!åˆ|ÙNô9Ч»Ÿ.vát×ë7ìî>:ÙÅèa~’˜˜¬³œšçÊã.w7c“  ÀK$dòèþ¿½ÇÅÞw?à`tp–uæ§©œžd4bF'k¤Ró\Yn@G'§'‹˜‡lF ò—±Ké9®,7c$ZeÀlÓN ÷iN;{ýã%›äü€ªÇ#`‰†\lõ_›¾ ÚŒY”CÊ!åˆ|ÑþôêÕ«W ƒÅ)>djÙÏôáãßÂæð–(%gXd‚;£A …V”CÊ!ùCÓ7Ég\mm¬r–•µ –IEND®B`‚7402-director_self-service-choose-source.png000066400000000000000000001152221516513262500372050ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/74_self-service-api‰PNG  IHDR™ñ&à§øsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝL[i¾çùwwÇî\N4c%\+™Qá©÷Þ‹[…§w‰v`·ãé+˜˜AìMÁV‚6MºT +*éü¸H©T'…DÒ‚ô-‰°fK¨V°ZÐÔuZ+ÅÚZÓZwÿäu>þ£u‰æwqþŸ~ŸƒßgöÅ'šŠ$ÁÄ»½L8Žsþf=UÈ,†¸N¯ÙO»›‚s+I$’ êÜÎû½-kvw]gkq»J´Ãýâx…ÿq/ÿÛOyíþoù¿ÿôO?ù;¯ðñ?•Ù?YÆó?ÿ–¿QŠˆˆÈ áÛüqÍkœu®ü\wøu>þý¯øÑ§ßæì?ý>?{ye>²úû¯ñ“O#\˳çb¥—ÇÔ¶ñ•Øíå¾ ]§ëp›IÖæ#­Ä ƒNp´¥…–= Î$°žÝ3ïö2Zfîú®m5“¹Û²Ò!zN ð`fž7OÒûßåÄÈÒÓ8Ò3\8ú#KX‹ŒM’\ûSl‚+o¿¹2{úö5&žÆ·}ÝöËþÑþ.Õýê6$˜¿û¿¡é_&yä~•Ÿý¡®”‘¿á_åø¿}¼úû·©û‡âÿÍëOL°ø0-*Á\ÙS±œ•Ôz2Ì 1ñ`äjîeøOrþ¤'€c¨w˜D ››££Ü:ícaèñõ‰¤“úK}4¸ÔõÝâ|`‹™ÌR”• swÖ éüOéø'ÌÈ,‰ÕŒ0 w Vn˜M†¸~e£µÛ£79WŸaüú V¡uÛ'ß)ã¸ûÛ|{È¿þýÖ›üÕÃLJ˨«<ø|c‘Óï1zÿWëMx¹lí'‹C¿âègÅO§í`:ËMsÿmúÄïrñD o¾uk#3¬Mö™±q"¶ºš}”åþ6ºê 2/rƯe¹hèìà°¯OMÞL„p Mt:Ž;X‹{C©‰ðqOÇWâ4Üøºén­Æ–-eÝöÂ^þ.d2[GòÝ¿ó ÿãŸxùQx|Ÿù_¾ÌßûÎsQDDD^<¿Äè¿ú”ÉÇϾœYü7üd &ìèšL Ërâ­ïÀ[ßX¤ÂLŽp±'Áû7Û1’i²©IÎƶú®l6‹Íg’}ÞeÙ¸«0ü4x‡™IÐÚc:é¡¡¶|S™fÜÄVîæÉܪ½œ@pe»ä6åíï=5‰ÿêvàñ¦¿þî?ü–»Ë¯ð§ß…è¿NnZR‘o ïâ|ãß§iCfè¨ú#&þŠÅ–ù]‘»,:É4ç¯sbÀÁå;]øìvœÞz::DÎDXÌ´Sã0°UtróçAž¤pfš4N sêù•e…;¶µl_ƒsd†˜#J²²‰€sc©v —A6–$‹w5iL3šÃ^¤"_yEµäøý2&þ†ãü ÿà/øß7%ù‹å¸ýïóƒØ_rá?üÍ~D)"""/’ջȟ^ƒù˜èçߦú¥o³ræë|ü_ñ£¿,.Ñ,z¹Üð6PkŸe``Šù¥$étšäÒ<#!R®Upú›©ÎŒ32³„iY¤f¸væ CE^·¸e¾¼æ4ÃãI|Mþ-Cw}w|Œ‘HÓJ³bàÞ<–½tuÛù‹Oþ-Ѳ >þ“ þxÃRøßþƒ|—GŒ~üðÖÿ»y¦SDDD¾i¾Íÿà6ÜäÁÿ?Ež½èð÷8ëȵ­¿\nøé¼zŽñ‘q†.Þ%“Ê\Tù›¹tµ™J;`Ðu9Éðp/dž–¡¬‚šÖËt žÜ¾ý<ÊÚêaš†—¼óÓåË1÷ènæ\w†¡‘Ž¥²Ø\Õ´žïbå)KyÊ{d~Ãþ—ƒÌþc/Ñÿöf—2D÷m„ç»Iÿ5“±ÇÏ>û‚¿Ú›EDDä«ê;eü£—óÿ~ÃM>ß9È?üCøäᣢ¯ÉT’¹Ïö,ÉÙGz"·ˆˆˆˆ”œ’L)9%™""""RrJ2EDDD¤ä”dŠˆˆˆHÉ)É‘’S’)""""%§$SDDDDJNI¦ˆˆˆˆ”œ¾ñGDDDDJN3™""""RrJ2EDDD¤ä”dŠˆˆˆHÉ)É‘’S’)""""%§$SDDDDJNI¦ˆˆˆˆ”œ’L)9%™""""RrJ2EDDD¤ä”dŠˆˆˆHÉ)É‘’S’)""""%§$SDDDDJNI¦ˆˆˆˆ”œ’L)9%™""""RrJ2EDDD¤ä”dŠˆˆˆHÉØéÓ !ÆÇCD¤–³`sàrWQÛÔJóáJŒ¢÷˜àÞ[g˜L­¦Ñó>ìV‚ÐÀ5F撪ΎòÞáÜ{/}\¥`â­3Œ¥€êKü‹Ëþ•º=gÖœºxŸ Uœ¾ýõÎ[™D.ãúâV{(Ãåñlë Á_¾z|8q‘ð2à9Ííþz6ír‡öâX¦ç§˜Ž¦ÀUMC£ÿI¬[¿þb7‘¯¢$™‰©^ÎÜÝ…d3¤âsLÞ˜czö47/×S^‚Íè0ÃsW+ÃÈù)ÿ|ãú걈‡Â« &À"¡hšúÍYfˤâsŒ½%vö——*Üh¯Ž¥E*2Îäýe(3 ý8íù^‘*>É4£ŒŒ­~ø—ùhèh"à¶c%—˜¿Kø!d£ÃŒÌ8ïßý¼¡™I¯þäáôíþ-fÞö'®â8ð64p$aa÷îSŠkÅ E–Ÿyi1%]Ÿo汊¶s­xl@Ö$1?ÍØýE²d‰ŽM“8ÜŽ{/b}aŽå pÜDDD¾¢ŠN2­dŒxvåçªÎst¬-]{}øýå˜'®ÍfYŒ$±ü•«Ë‹‰#ŒL΋gÀQǤ£³oÎ!M¨çÇ Ç×~3ôãÆÛnò‹æÍ©ÍžÅµn9¸ìÈUÞóÏ088‹ÙÚÏÉÅ ô†—ÁVÍ¥;—YËwÒ.ðã‹€ƒ#ïßâde†ùéiî§À–9L[ýÓøÍ…)†GBÄâÉdËpUùih?N£o}ê·“öÛÐ>‹Ó¬ä˜eTUÛYŒf`qšhº>wânsà­öã[Õóü8âǸ±¤b$LpÛ +¿{s,7ô§åY.¾¡öj?¾áS[¼~‡nïÇm}¨»Äyo˜{S.SVQCóÉNš}Ï6hzþÃc³Dã&†'@kg¥ë½ÜÏ@Åñ[ü¼±|­âÌO06#žY›ƒ o5mm½{5k,""²7ŠN2ívkyEbnžDà0îµ¥E#À¹[·1ìÎÕ“…‘ \œ~øt'™‡,†ïr1ãìûçÙzÕÕŽ«Ê‡ÇŒO­¼âªòás•í[\Ùø8WîGIب ú) ‡YÎ.0·ðûì€I<_yƒ£† ;÷ºkræ =CQžÎ/.“Z s·7F¼ï&]>cí·žÅbh~¥œ²ZÚÛÊŒŽ‘"ÎtQKæ6œ† ȸýÎìͱ\éOÉW“í Ÿ*Öãõíã\Ž Ð;»îè=œc¬7ƒqë=‚«yc:2À™ëá'Ç83|qžÍ½Ød~¨‡wÃëf›³Æf¾#qµŸŽBÿE!""ò(þîrw= ž•—Ã78óÆQÞºpîM1Y cwât:q®}&B ®~øW4ôqû_|Äèûøl@fŽá»±•„aÿÉ>Î5W¬þ^EÇå>ºreTÏ!®ìb””£Ššº#ÔWØ«‚øË–‰=H`X ±•$ÌQSOÎÓœgdx5Á¬8ÂÙ÷oqëæ9ޏ2ÌNØUû­/k‘©Õ¥ò²@=U•‚®•?ŧçHçy뺌s/ºš`º|¸÷*çÙ“cià?y‰®ÚÕô®,@×¥ó4º9^/à¢Ìeð5¥ïjg¬õÓE¦"É•­ÆWLWçnò/n÷ÑTµÌòÆ}¥#Œ­&˜®†KÜåÖÕ³Ô9RLÌoœEDD^ ;¸ñÇMcßUì##ŒÏ.’!KjqŽû‹sÜ_ÝÂUsœî®•eÊäü +ÿÕt´úVn¨¨¬ãxpœw¦3,G¦ˆ[¾'K²;·Gq­/ÂÑÀÕ[xŸÄZEÐo#Î’‰FIQ‰;#¶:#V]ïÉy7²•˜e%-£öd‡+í@9íu,Ç0Il%h?saŠèjY ;vAcc)ˆ‡˜K n•»gçè}£eË}z‚E]™Ž…˜]XŸ&xë‚ø¶ü7ËÚÇ6ðuq®=°r—»»ƒÙûï–æÊ?8â3«—(بéì Pn>Ú»ÚŸ#µ~_Ë™•÷™x”X¼œ€ï0—œÔ¦L0<ìÁ• """{fg02¼»Þ#Øe‘\б°'6fn.NHÍÝ¥wÀÁ­Ë2ñµû™£¼{l‹„%›`)¾RÜW±q9ž¾dóð<“¨Ø© °…ÃdS3Ä’Í”-„W’‡²AOî¬&›L®Îf•ã«xºáï¢ÿk¿Y,ìºýL¦£+ Üëbr‚¸ÆV–ÌCsI‚ÁB@¾¦óœm,æ€Y¤Ücìþúù;GªëðåºûEícë”U8ž&~6£ ÖOQf“ñÕ_]ø×Oûº|xË µ¾9\Õ*Ƙ|ÙØ4C½Ó áÀS]C]°‘z_¹Ÿ$""_)Å'™é )0pyÜ”Wú)¯ôs8ØÌI+ÁTïî.B6zŸE3€ãÉå{<>÷ægÚ*p”bŠæ9Äe+Û¨½*Hµ-Ì\ö!3 ³qÊAòä˜X…^׸Ûö3cL¯.߯ÜÔ2»i“x(J2Üâq@ëî.ìF9÷Þ?ÞçEícE*øØ+i￉74Át(LìaÈÞçnô>“µ—¸Ùíߧ缊ˆˆ¯è$ÓŒ rñÆ"`£æÒg!cwáu—ÁâÚÃc@xlUt\:_ú%˽ŽËÊñú“}WÑXmcn.K|zŠP  }î¥rÃéÂFœ,Ib-‚«™›•˜a<'ksS×Üuû™±i¢Ûå:ñÑdM“™î.ß9;Þ“ÿ=,lëµëé1N‰›ËWêa¥",l¸(ÓJ/Oeqx›9ר…-½@4<ÃÄø}—!g¾ÓOžï!y¡}ãá­Ç@–¹w/00ñ€ùØ ±yfî p}ínÛŠ<¸ª8²sÜ›^Â,s‰™k'8ÚÒÂÑž Û%r/t\v<Ájl@vñ>Ñe ÌO°*¦c÷ԯܘÂ2áÁa,%I.<`äÚ“ÓÓLÏ&€ÝÆ™f~:¶ò£­šãç.qéÒÓÿÎuÖ®Þå'MRÙçboåêqÉšæs½¾sOq–èàSóK,ÅB ]™|özLV¾tàâÅ‹\¼xÁ™%2vÕµ4ûŸ^¯ñ‚äÎ""")~¹¼¼ŽÓm3\[$ËCÂc7oÚÈCS÷êòke+µa®‡3,Ž½Ã±±õÛ9¨k«Ë}ö‹W‰¦á Rm›cn5;±ùƒl“c‚ £ÃGÏpŒlj–ïÌ>[þéV*íEĹ•tŒ'9f ™`À÷l¢bÔÞ sâS’ÁÆãÛö¬Ùq¸Ë€ÌÊMMÇzh¸z•ŽÊ\¯ï²F5­ÎŒÅa9ÊÝw£97uÚ92ÞËýÔ2sCï07ôìßËj[ñiSDD¾BŠ„v*›ßãÎûgiªñàr¬=ñφÃ塺á4Wo÷Ó^ùäÁ†ºoò~gUk7JØÊ¨¨>Âé«7éò—ê!Óû—á%X½vÑŸê`UA³Nî`·úÚ¨©r­Î(–᪪£óêût=Y"Þyœéè4‹k1Õm±|o÷Pï_m§‡!"/ÌdæÞËòú.šÖîæÊ&Édó¿¾Ûz¸›¯rótU«Ïw-«¨¦íÒ¥ÕG­cø8yµÎ#>*OûR™«ŠÚ¶KôŸÖõ˜""òÕò­/¿üòËýBäÅŠ1p¬—p<·éßòùQ"""_m;{„‘ˆl/âÚõ)–òÆnÎÝØttŠùÕç–º÷ì‰ö"""ûK3™"{&Iè†WÖÞË*ª¨´gˆ­}OjU'·ÞÛêÑQ"""_}J2Eö’• 2=ÎxhžDj™ì“ëJÛi ú(×-ã""ò5¥$SDDDDJnw—‹ˆˆˆˆä§$SDDDDJ®è»ËÓéô^Ä!"ò•`³ÙÈfKõ½P""_=NgaÞÓ5™""""RrZ.‘’S’)""""%§$SDDDDJNI¦ˆˆˆˆ”œ’L)9%™""""RrJ2EDDD¤ä”dŠˆˆˆHÉ)É‘’S’)""""%§$SDDDDJNI¦ˆˆˆˆ”œ’L)9%™""""RrJ2EDDD¤ä”dŠˆˆˆHÉ)É‘’S’)""""%§$SDDDDJNI¦ˆˆˆˆ”œ’L)9%™""""RrJ2EDDD¤ä”dŠˆˆˆHÉ™d¦™éi¡¥%ÇoO‘L‡è9Ú˼µÛÐL"Z8ñÁÛíÊZäÍ–·˜Hì¶ÌB%¸÷Ö†º¿ù¦X0÷0&kÁ'ø`i×»"cb ‡GWêpôD×&æIòÞäo?9Î&±‘ œ8z”ÞˆYú²Š°·}ÁbaðMZZZ¸0³1ò-úDËQN\d&±v¼ ïÓ›¬oïgÚþkÎZ`àÍ£\ÙTÙ$So·ðöTrWûÞñùTêsq î륌uã¾J6Þï}=Ov÷Y¹'ãØ‹0†¼ýg?ÎÝíÊ,Q»<ÿ\h{ŠÛÜIýÕQYXùÀ=Ãõå.nóa°f¨ôQnÃîn ël-n×ó-×Óy“¾Z`‘IÄ q±'A_ÿI|ûSáL¼ÛË„ã8çoÖSå€Ìb˜‘ëôšýô·»WŽi!¬$‘H‚ªsw8ï7ö¶¬mìi_0cLD²TT•±8&YßHù†M*Žßä½ú•>a&b„Ɔºbà¹ÙAe©*)Âþ{RˆÝ}VêØÊN¼ˆý¦È$°+gÉÊÿ³6 Ãxš$˜‰ÙAÆÆÃÄ3PQÛÉùÓõ¸í`%f#¼˜!ëðP×ÖMg}aIF:6ÁÐD.c«¨¡µ«‹f¯Ö"ãCaÚ~Üé=ïÌÓtÜÁôØ,‹©gËOÏpc8D,eÃSÛJÐ'¸IÐIòÁ Üe1“›‹ê†.ºÛ}l•6`+Ã0 ÀÀð¦ã²Aæ­w ·Ò_³1¦Mm6&GbTõݤÃÎÙ[×Ódª÷ ³™e¸xŠåË·èöÙ1c ~0ÁÜÃel®*êÚºé8\Ž}‹2O®ÏrÒK„ãjßâ+_y½Ü¤ëôƒ‘$&+±l¼Ò̼ÛËtj®ŸáZ÷MÎ6´ØnËz¦.ÿ'ÆKMâ?½Ê­ŽÊ•8Ò3\85Ž÷êM:ëÚ=_Ÿ)¨nÏ2cÓDíuôuº|gšp¢‘f÷³ÛØíÏö‰Ö¶9BcÄM J2‹îƒ£@èí3Ì6Þ¢?è„äoŸƒã·øyc9$Côœš¢öVžÐÃÓQRYpT¡³û$Ù3 ƒ§¸’íæN÷êerŠ·ÏÌÒx³Ÿ`y®8ʱ'îñÖ…]wÎã[y#SoŸa®c”>Ïlþ~Z œe“fþÞVõKnq>™9¶Ýt”Š;7¾½Øñ טµ~Œ)ªžöϵÇc‹}U¬ô¢Çûtˆžw"› ¦ÆÃ<ÌVPÛÙE]fœáñ()\Ôtöq¾¾rÖmµg2F]8Ř7ǘQ™§=¶);¯Ý|VZ…Û­‹}qÇýê?ÛÄP̹Kþbëxm„¶(sOÚeS.´û±u·öæšÌì"ãó>ºoŽ2ú~ÎÈ0÷-0c õ“tsst”[§}, ]`8–c‰u½dˆëW¦1Zû¸=z“sõƯ°°Õtrfޱ°—Îþ§åÄ,HNñîõ0®¶~FGûéð„‰.¯¼'ý€¡¡0޶«Üåæ¹Éɘ)f5ÎðÑà/#‰³©F™0wg šÎŸ£Õ±˜»rÖ³œÆ¾ËÔ9¹ºÚIÓ3\¿2A6x™Û££ôwxˆÞèelmÊ}}™î ËYI­'ÃìÐH®løOrþ¤'x¼œÔ_ê£Áå ®ïÖæ³Te=©ËOéø'ÌÈ,k«Ðéhˆ¸+Hpã ”¯ÏÝÓD&b¸ñVÖÒèI å_ö¶Ò „§c,—ypç៱ƒ>˜³8ð$‹˜€¹!< /Ìx˜„+€ÿÿf Í}·½}•Vû,ƒ#±-êeÇSïƒØ ñÕ?&#!RîjÊóÅQÀzO¾~ZˆÞg¢L$êè»3Êûmá¡‹Œdš¹::ÊÕVƒèØ8 V¾ºQðUÝgÌȳÂûÄåj»‚Ží^è1dú϶1sîæ;sÆkl]ï½j—õv;¶–ÀÝøSAsG=nÃŽQYC2é,flœˆ­®få†A¹¿®:ˆLÅ·=iá âž6Ž®Äi¸ñ7tÓÝZ-»uùÁöz*WË?âÓÌ’M“ð§ã°Ã(Ç×ÐIcõ-N?§ûû鮯Äi8. Û2)³¸áÄpd3™-ê㢡³ƒÃ¾J싹Û!^D=“sÄ\­t6zqî@;ÕÂÓkíù´Lç¦þ妹ÿ6} â÷¹x¢…7ߺÀµ‘™'וîæx•¾¬§uñÔ4àÍD§ÒD§ã¸ƒµl˜TÌÛgŠ®[rŽé¸›ÆZ7द©ŠL8ô$áZþñ“ë®ÞøñE†æ]4ïÀ[Èù½ƒ>˜¯üí@5ÆR˜¸e§p7¡"æ¡e/aTxéd³&¦™§—à¥;ü¢«jËÁÛ«‚ø­(¡¸$‰„RxªqnÇö}%_?È}÷ ×µâîÃíÛÀ¢ðúQä¶…‡­ë_àxoÌÚaìÅœk[v8ÞÛ<´¶úqÚ *µTتhmõá´xÕ8,“µa/WÝ =þÜcÆvûØiŸ(ÌÖm·QÁ1¼àcH1mPÊþ“O1çn¾¢tŸ—»l—g{.—^ñËå…°[ÎܘÉ4ÙÔ$gŽNc[}-›Íbó­t†Üm`aÆMlåî§SþörÁµõ’-Ê2¯íÕ"“01*ÊŸ”Ý×acq-¾Ø8à $,p8 RYðZçµ}¤LlvRbr<‰)w;üUp=-ÌÄ2¶r7O?sl8Ü̸¹©ÌÍ,,ˉ·¾o}`‘^396ÂÅžïßlÇØæx®e­¯‹á§Á;ÄÈL‚Ö†ÓI µ—Eò÷™d‘}1ž"ž}È𙣌¬lL–Ó‹x×ýË´¢í*—kWµÙ8‹<³‹ëƒùû€ÝsƒDâqˆ—QÛZO22°òû‚_—‡C¾.ú:Ç>ÃXʆ§&HSk3‡·ZV±Wô[ ÌÄ11B/­ç¶ql+o?]Ù—ït?§}¶u¯¥˜îíežlþ6ð^¿b¶}Öê_àxðù6cÖNbßnÞþxl¬ËÎÆû'ËÈOkñ¤¢Ow˜¯nÛ—±¶»ÜcF¾}|kÇ}¢@9Ún½bûå =†Ñ¥ê?ùsîæÏ!òÇ[Ì µÆNÛeý>Š<—÷ÀÞ$™Ø±Ù6¿jsØ*:¹ùóàÓ&Ì4iœÛt ûÊ a,Iïjf>4‡½&ˆ¯ÀòËÊí˜ñÌÓ$ÂÊϬ32ÀÅqƒÓ}ïqØm€ãÚ‰‚k¼²“Óó˸ÛÝ“Ìu1åk‡å‰ÿ!w=g÷g¸ËÈÎ'Èà_ÝO–LÒÄæ2€TÎv0ç¯sbÀÁå;]«×ÉÙqzëéèL9a1ÓNM¾ãeNÞ,»-Ë m¨‹¯Á‡92CÌ%YÙDÀ¹±Ôü}¦¢˜¾h- ¥ðŸKµkgì2Ñ= OÅ0}þ'ï±.ÊË7SX;Ý·év7µ^“{33õÒåöàñ˜ŒÌÌ€é¡ÃcÇJ&°ùZ¹ü‹¬ôÑÉ!zS”ßéÞböÕNUЇ50ü#ãmgå>¯íúâÆöÌÏ<»ß\ýtÍᢼüÙ€\6[Þ²­d2wý6†•oÛ¼Ÿ—EÖCs™ñÜcVÁ±ojËbεBì`¼· ¿A4_Ý\Œ ê– IDATQ¹ÇŒ|qÚ’K;ì…Ú¾­‹é—/þRx”ªÿlWv1çn¾"~³°£Øvß.Ş˥÷\Ÿ“éô7Sgdf Ó²H/Ìpí̆ ¸&Ó]Äc$’À´Ò,„†¸7Uð‰nÇlÀµ0ÂH$¹º»Ì¬~ØY–Iv˜ÉfFF˜[¶Èl1 ?‘]Æ4ML3Mbá#W®¶¡cÓ¬Záí°}=-–W/)¯i¦*5Îph Ó2IFî1ƒÞ\»t‡óþzÎ]Î0ôA/dž—±9ª¨;{™¶J;Û>€ÒðÓyõã#ã ]¼K&»V‡f.]m^¹Úž'΢nˆÚeY[ÕÅðÒàƒwc~º|9úO¾>C¡}Ñbq:Œéé¤zÃ¥á âã:ói‡‹hòöÁ÷6Ïׯ¼)OœÞz<,B­0¼µT°ˆ½n%A4êºéŒ]cøÌ1ne5´^îÌ=ax úlÌÅü4®o÷¼qÔÒÙæúõS¼QæÂWßF{ÕáÝ7Ù¶eÛÝùê·á|*¦-ìEœ‹ÛÉ3ØÉ=f=Óycßk‘çZ¾z{vV¯b›·nÅŒQ¹ÆŒíõµ’Vf–ÁÞë„LÀ"c2á¥Þ£Î!²-Ë$½4ËXj X–ÝÓ˜%òâÐùX¼oÖL&K¡!î…y¸l£Ìå#ØyšvÿÎnÔù&±bœêÇu¤›skÏ7•=¦1KäÅ¡ó±Xß°$SDDDDž‡oÔr¹ˆˆˆˆ<J2EDDD¤ä”dŠˆˆˆHÉ)É‘’S’)""""%§$SDDDDJNI¦ˆˆˆˆ”Ü’L“È…N|°´íW†[ ƒ¼Ùò‰Ŷ  ƒoÒÒÒÂ…™çðežÖƒ'NðÁR_¢^&±‘ œh9Ê…IbGiy{ª¨¯/-‹Øµ7yëÞö»$ý¢˜6ONñöÑ^æ­ ?W`ÁõÛ¹çQF©ì4ÖÜïÛ¿ñb—öãüßU™_¥~&"_eörçvw]gkq»ö²”-˜1&"Y*ªÊXœ“¬o¤ü9‡°ç¬$‘H‚ªKw8ï70Ë»9kzpìw\Ø·~!/4õ ‘¯—’$™éØCL}¸Œ­¢†Ö®.š½X‹Œ…i øq§Cô¼3OÓqÓc³,¦ ¢¶“ó§ëqÛ!=?Âá±” Om+AsœPà&ýA'É0pw–ÅLl.ªºèn÷aäˆÇŒMµ×Ñ×éfði‰FšÝëâÍS–•˜axpŒðb†¬ÃC][7õnì9ã÷1ß{…ÙÌ2\<Åòå[tû6iÎ6ÌØƒL0÷p›«Šº¶n:—ç)³š…w{™N-Ãõ3\ë~ŸöÄ=†c' øËó×Ñ7Í[tÝ9ÏJ˜I¦Þ>Ã\Ç(}žYzÞ‰ÑÔfcr$FUßM:ìá­Û‹äƒ‘Õãb£¢&Hýr¦à~‘fþÞÃÓQRYpT¡³û$ò$S[´y±ýÈ}¼‹¬_βóÖ¯ˆ2÷r·KöNxióEÅHÙ*¨n>IwóJÝsö…š¹MÇ»91’£ óÇZ’v,b¼(Mû±ŸœíßOÍøæ¾˜ÿœŽl2˜ó0[Amgu™q†Ç£¤pQÓÙÇùúò<ñ¸˜Ù¢ÿïþ¬Ôi¶ñýA'$'xûÔ¿ÅÏË!¢çÔµ·~NíÂVqU‘<Å•l7wº}+ßmŸœâí3³4Þì'øµû—¾ˆlg÷×d&C\¿2ÑÚÇíÑ›œ«Ï0~}„…­Vq2sŒ…½tö2ú~ÎÈ0#1 ’S¼{=Œ«­ŸÑÑ~:†.03óÄï ±ï2uG®n`æm£ô ׯL ^æöè(ý¢7z[[Û²LƒúK}4¸ÔõÝâ|`Ã÷¦æ«ãv2aîÎ4?G«c1g{XKãôÞ˜£¼í*·Gû9é]ds”€l–, ¦;ðúÈ[–™L“MMræèô“¿g³Yl¾ÕAËøwÓFK‰elåîu×RÚp¸˜q3O›å/o»öÌËæxR^îöX毳&†Çõ´ \xœ¶Íû+¨Ì­ëh÷wÑ×9ÎøðÆR6<5AšZ›9\¹u;ÓOJ]¿¼e稟™)]Ú\ëÞêð–c ÿ;’Ûõ…uÇ;_=òźgý¤ˆ¾¿“ö/z?±0·;§±a<†ãI“<{qG¡ñ”êØ=‡ñ1H$‡xµ­õ$#+¿/Øñuy°“Í—½Š ßb`&ŽéˆÊxiݸÒ""ß»L2í.ƒl,Iïêðf>4‡½&ˆo‹ím[ŒmeåvÌx†,«V†xfe¦ÁŒ pqÜàtß{v`Ÿvb`ëp¬%B¡žãïs©vmˆ_&z£‡á©¦Ï—·,›ÃÀVÑÉÍŸŸÞ(d¦IãİB9ãßM¹Üedçd𯖙%“4±¹ µ£2óÕq+C<ól¼kåånƒÔ=3ž"Kåj2$ÒÛÏênmë:ZÉ$6_+—Ñ•^":9Ä@oŠò;Ý›>h‹ê'”¶~Û—½uý ×.ÚpÃqËfdžpÈ$’d€sÛ¾ð4¶|õÈëÞõ“ÂúþNÛ¿øý¬³é¼yZ–±í9]˜bâ)Ù1°{¨õšÜ›™¬—.·ÇddfL;fäzž¸ìT}X3Ì12Þvüù.Š‘¯µ]/—»ëƒ¸ãcŒD˜Vš…Ð÷æ± èÃŽ;Ø€ka„‘Hruw™YÀ-Ë$‹ » Ìä3##Ì-[d¶Hš¬xˆpÆCCm%N§sõ?7D§‰™ùËrú›©ÎŒ32³„iY¤f¸væ Ck×dæe±œãR³|mT^ÓLUjœáЦe’ŒÜcxΠ¾ÁSð\i1퉭cy‘™h “…Бå­?pr·GO°Gl˜áK˜Vš¥Ð0ã×Þi²4ÿ€ù¥BÚ-73:Ä;‡y0Ánàpmü´zÚæÅô“Ý×oC;(ìE•±íqËF¾!aš¤c gð5ügü'ùúBÁõøVÞXKÕŽ;µ³ö/r?Ûž7Oûb©Îéíëõ´ÌÒƒª:7ïß'åà¶ÛñÔ®þ^Y‡×Ø>.»'ˆÏºÏÐd_ÃÚw«cBbwc‚ˆ|µìþÆw3纤Fz8öÆé€æó]EýëÕînàòéjç8vìFu´ûʰ•3ÐÉqOŒSÇ8Ö3H¤¼•³GDyöÚ}‹Åé0¦§ê «3†/ˆ(óé¼eaèºÜ„}º—co¼Á¯L@ÓeºÛTÆî"à3ˆôžàÚV`Ì×FÎzÎ]n†©^޽qŒ3ÃqªÏ^¦-Ç’ðnÛ“òZ:›ÜD¯Ÿâ7{K¡½ªlëåi{e+}gkH޽ȱ7Nq=â¡ãHÅÊ’œ•$4tƒ¡Ùä¶ÏRÍÇY×M§o‰á3ÇxãØ)®„Êh½Ü‰×Φ6ÏÛOrå;­ßÆ8wR6UÆvÇÍæ¨¥6;Aï‰cüøJ[ÃeÎÖ;ó÷…"ê±èÎk‰Úq§vÚþEíÇ‘§ý7žÿ%:§óÆÃ†2Kx œÞz<€»Öƒ8½µT„qÛ1ÙðôÙÈ–ùiô­Ž«cÂðLfWc‚ˆ|µ|ëË/¿ür¿ƒ ½D,å Êë\ý—~’©žbw8¿ÕÝÚ_•²öË‹PÇdˆÁˆ®F÷öÛÊ®X±kœtóÞ/ÚÙÔÚ/B_o‹…ÁS\ç·º¼;\‘‘¯ƒâk%­Ì,ƒ½× -˜€E22ÆdÂK½§ôÃÓó,k¿ìÓ̇Mjk•`î·ýï òb™¤—f‹@ÍŽ/ù‘¯‹c&‹¥Ð÷Â<\¶QæòìúÙî}öxÃ2|2øg ~’ÙÕ¾'ûû™úíÆ}¯ýý3îþÙŸqåÃ_óÅ3xħw®ì®l‘ç.Á½·ZhiÙüß› XùÞšœâí£½Ì[~Þoëb±y³å-&&±‘ œh9Ê…IbGiy{ŠdÑXÄ®½É[÷%Þv÷ž­ïWŸû€Þ‘¬û©¹b°÷mNm¡¥åMÞê¹Âȃĺ~¼Å~Þ|‹ S,˜«›Xóô¶´pôÚÒÏFCäÂQÞžJb-¬Å%"/Šû@)=þt’É_{hÿÞ¡ýEd×<7é«u<óšÍf`ß§xJÅîn ël-n`%‰DT]ºÃy¿YÞÍYÓƒcÛ½|uýü¯PýÃ~ô=ø‚Ï~9ÉÔ'Ÿ‘y ‡^yÆ–F^sdøäî=¢_<‚;7xÔ~–ÏapPýƒ—øtr’_{ÚÙ*ÏÌüzŠ>Žò›/ïþ ‰–z8øÅ¯øó?ÿ”×ä“Ù_óùã—ø^cÕ_Ì25û¼Öxœ?­^Hejò—üú7_ðøÐËTÿ°…Æê—¾^»ì?[†al~=q·.$èºsŸ ÉÔÛg˜ë¥Ï½ÕŽ,Oq%ÛÍnßJ’šœâí3³4Þì'X¾yûddŒ¡‘±”Šê ®SÆy~^?“»l¿äƒ¸;Ëb& 6Õ ]t·ûx¦Ö"ãCaÚÞíe:µ ×Ïp­û}Ú÷Ž$à_ ÊJÌ0<8Fx1CÖá¡®­›Îz7v,’FV˲QQ¤~9WCæßÖŒM0øÁs—±¹ª¨kë¦ãp9ötˆžw"› ¦ÆÃ<ÌVPÛÙE]fœáñ()\Ôtöq¾~%ÖœuR_?îtˆžwæi:î`zl–ÅTÔvrþt=îyÑ6Ûæ,¯È¸s·ñfftœˆ«Öõ9^®~š38¼€÷ôMúêŸv2g° _•ƒžw†®ósÞ¿q?†÷0— 2o½ËH¸•þ:À梮ÁMdhˆ¾ËlÎ3ôLÆhîö³ED"òœ=ßk2¿ˆòá½<~½žŸþ”Ÿüèe>ûè.¿üíc6ÅG¿‚ÃÇ{øiÏ êD™ü8Îcüàx;Õ‡ñú‰ 檗ªizõ7L~ݰl|ñk&'Í¡ž ç§?¥ëO_#ó`ŠèÚJúŸñàójŽ÷ü”Ÿüð ¿ž¼ÃÇ_æÄOʉºƒ|öËY~óxgòÖB×OÊÙ&¿™¼ÃTüÑ5šÈnÙñÔû 6C|u-1 ‘r7P³)ÁÓ\¹ÆÑz•Û£ýœô-2rÿ!ÙíŠI?`h(Œ£í*·GG¹y.@ròfr®};©¿ÔGƒËA]ß-Î6d fŒ¡ÞannŽŽrë´…¡ ÇL¬¥qzoÌQÞ¶£w‘ñØÖYfÞmÓ3\¿2A6x™Û££ôwxˆÞèeliµ¡2Q&uôÝåý6ƒðÐEF2Í\åj«Atlœ«Èºgæ {éìeôýœ‘aFb9ysm»]y…Ƨ73Y-R^ë-(KÇB,:êh«ÝÜÉì•Í´û²DCñÜËÛ†‰HœµhÜõtU/0tcfòùê[ªêpÄB+u‘}WâÉ·Ç|vï ¶Å_^2Ÿ> î¨ãì^ápèµÒøj”ÉO~KÝ÷àñãGýÓ¡WiúÉO8ô’ƒÀCxDæÑc8x™ººW9t½ö=^ú%ÔÕyV•C>g%ÇœåÓ?à'‡W—ô^ý!MÕQî}ò[{<šÍ”’‰ý˜–¡u/8jé»Õoû²Wñ[„â^o†H(…§¹šÍ‹ŽKSÓ¤|¼W_‰8›;i9Ch»Bœ~N÷÷ãp—cì†m™”i±“i%36NÄÖ@³r]u3\™Z¤Þ˜%ãë¤sÛ-âÓ¹·MÎMsµr«Ñ‹pÚ鬞eh:N[`óÐÚêÇig –Š1hmõ­þ^c"±’|ç«û¦µÿ ‚íõT@e G<#L›YØrî0ǶەW`ܹÛ8Žåó=‘• /£ªòÙƒ™«Ÿ:âpTâÚråÚ†Ëc]H“Ísq„á2È&2XO¶)'ÐÙEõ™nÌøè«ßб 7^[œH¯%s‘}Wâœèž¦ŸÐôÌlc†OîÞå3óèóGp¼Ä¡uÛzé~ûˆ¯6q¼q–Ù©A~™9À˯½ÎáºÃ|ïå"C<ôMM¯rã£I~åiaýªù£ø,Sý†ÏáCÉ<†WÖÅrð™¢Öÿþ4Y}”ù‚Ç™ ^ùäIã=~ü˜žG<ækv‘«ì«Š¶«\^­›ÍÀ±ÓÏM{A¿ÅÀLÓ#”ñÒºqæpU&ebx\Øž¼âÂã´m¹íFflœá8œ©,xw²™L“MMræèô“X²Ù,6ß2-ìÿhõ;È—éêzýéàöè ¾àкTTd÷ìåå['‚ϰ2Ä·ýPµSôa Ì0oÄÈxÛñç˜]46ÌxŠ,•«îé‹åëÊ6#\78Ý÷‡ÝX1®Ø>þl[E'7äÉ‚«™&AêžQpŒ†+×¶6 wÙùü«edÉ$Ml.Hkqu·c+,gϹm©Ú:w; ž|ÎÕOí¾:<™qÆ£MO/…0cLL¤©¤‹Úð÷y°“£óš1¦ç—q·»1xöÖ|#ÐEwà-®LÓºíu"²_žë5™Ž×óJf–©_ý–G‘ùô—L}zê¼ÌãÏ&ùó;SüúóGpà ‡S¶Ç<*ø²Çƒ¼ÚØÂkŸ?à—«=züø9Àð(ó¢̧óÅ9‹”áWóê³|ý-?æ‹ßDùppI]“)Ï‹­cy‘™h “…Бåí?iíž >ë>C“| ¾I„O°#6Ìðƒ%L+ÍRh˜ñ‡Û—mY&YlØm`&˜anÙ"“ÙYàô7Sgdf Ó²H/Ìpí̆bY<Á:¹bÜTŸÜÛ–×4S•g8´„i™$#÷ž3¨oðu©ëþ¼ÊËÝÆ[\“isà2,9o°Ú <Èé¶r殿õ‰ ‰$éŒI2rƒw.Ž‘¨éâ¸o]/Ì.cš&¦™&±ð€‘+× ÛбÅ5`àïì&˜d,¾®ÎV†„iàú:=ž@ä+ìù®îªæOÛ¿`rê.?›zÄC¯PÝÒÎ_>À—ZhŒÈÔàÏø8øÒkÔµ7òʯyòÑÝ~>lïáO_- ìƒ¯ÒØò=>»÷ë•¢_käGÑùèÆÏx|ð%^;üCZ^ÿ%“MÿÉ«…×áàk4µg˜šºËÏ&ÁÁ—x­®–×4)ÏIy-Ma®_?Åe.|õm´W-Þî}†— ÏÆ\ÌO£/÷<•ÝÛAßé,wßáØ2\ÕAš} +×;æ)ÛèäøìuN#[VAMs;gÜch`Ø{;¸’ÔÐu9Éðp/dž–¡¬‚šÖËt ì´ÒwÖdàîEŽÝWuG’LlUŸÊ<Û:ë9w9Ãн^Ææ¨¢îìeÚ*ílygIyëÞïß~E*YyyÚx»›ZÏ2“K&¸ ™ç´SÙÜÏmïwïÝãúøC2Y(«¨æH“Ábh„±y]«áƇÏplxõ­e.ªüm\½Üˆ×€-ï2ütv×2ÿo&XÈzhÝt«¾ˆì‡o}ùå—_îw"ò<¬<Êè:ç¸Õå-b¦Î"víƒî÷øEû–ÏH’o3rž™ ýçwÿˆ +¹@ÂðRYÂg ™‘+ô„è×#ŒD^úZI‘oË$½4ËXjŠ\ YcT·HM3_Ä,o.öòÒ&˜&2¡¶)×¥ "ò¼)Éù°‡yç{Xµ§iÕ£]d§ì•´v¸¸?ùâ}}£µ0ά§Sý[ä¢år)9ÍdŠˆˆˆHÉ)É‘’S’)""""%§$SDDDDJNI¦ˆˆˆˆ”ÜóýÆ‘o¿ù›¿!›Íò»ßýŽßÿþ÷ûŽˆˆ¼ìv;†ñÍxš«a$""""%§år)9%™""""RrJ2EDDD¤ä”dŠˆˆüÿìÝTT×½ÿÿgtF˜è¨HQFC á’` Z¤˜Ð?%Æû•6x/åÚJÓX›ÖU{mbÓ¬¥®•1¹~®¦_´‰¡íÇk½•¤¸.[iŠ‘¯RC¼P$f¢hqÀa8à÷Pù1àA4¾keE˜sö~ï½Ï9óž}öDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtsŠñPòÚZr«»y9dK2p˜SY7¼¸mï™â IDATò·²³¸š´e̶ hm—Uì\›ƒ7m9‘»ÓMQÖzŠã–™ÐÏ–Uä®ßŽ%c )a] •QI΋[©ŠNcÉÜIØ/¿à¥<{-û&eö¿n$gÙ¿ìGlpuóò¸ùlüe ¡Ce›_dÝ^áK³Y< µ]æ« kÑ+üb#?¾ÛÚ·}kòø×ŇyrË*¦ôqW&%™vb,'Ú0¨ÊÍb»7•%s#Ú*°Øð”ÏpS^^‡sî2æFÞ ó&a”ç’[AÆ${ïËMn$3Vo!¾ÀGEÖb^iÌdã³1X‚ð”ÏWáC§¸÷Ùlž›rƒLùÒ1)ɤ-‘´mÿ·X°ÙlmxŠyí5‰É ó]8çg’X—ÏÎüª<XD&¤’–ÍSÌk¯U’8ËNѾªÜ2)…¹©±„X˜†²]d½¾‹Ã§ s/Ió–òdb(Ö³{Yö³ñüÛ·9öÿafj0y;pºy-Ì$ɽƒM;J¨e Ó®â¹çbkÈ[ñ"îFx~/ldiŒµûz{é®÷ƒ½ÿº˜‚”¬9jvñ¯‹¶Áüü2%jö²lQmü%³›÷³)k޹ivD4o) g„_ÛÞU¯’Þ¸› ¯ï¢ät#㦑ž™Éœ¨¶ä¼¦ðõ®Ç†îú¿-~ß©nê7ó8`7nM¦§”ü‰sç’d+'7·{ò–-_NæÜhÜ…y”¸/m[ξR')O/gùÓ³°—ç‘ï20*óØY ‰ó—±|Ù’,%äæ»0°›1Ÿ‡ØùK˜mO Û·bÄe°lùržžFåÎöUׯ3j(x*)¬‹eþ²å÷,éÁ‡Ø°áŽy«ycË^}6žšÜ×Ù_siÛÃl;ŵ[ØòïO2òÐ&6—ù𽿉u{aΪ7ØòÆjÒ­dm.ÃÇHfüb³Ç8HZµ‘çâƒáì~^yqÍ3_à-[Xûd%ëW°íßµñŒµ€»„]§’X•½…ŸÌ ϳÙ=‡Õ[¶°:=˜’m;¨ðunT()«^ Éáà‘Õm f¯õv§ÛýL‰wpêÀ1€†ŠCÔ§TphpàÔ˜xâÊØ°b§â—òê–-l|&†Š ?gSYõíµðÊ‹» N_Å[^åÙnv¼²¹­}g »›îûhè¥~‘[Ä œ„r2‹I!mÿN}úiì!,€ÅîÀfñâö´-, !.9–0M\X>E^l`^¼^ìNâ2–1ɰtÙwy!.GKœØ{t2)‘%äU“œÜ)OXÂHJŠÄn{ô$BöARRDûÏ‘Ø ëè>Ç4¨Üú"+»x%¤—X’&ùߦžú6:%•Ȭì,‰`~l‡åöÈžûÚÏv{]”[x:1¢mmmd2©±%l-ªÆˆˆÐlæ 5†Ù Ÿ$1 ”gÖ®ÅÞ6»guŒ!8 ‘Úm5Ž™3¸;¸{DlfwC3Css ÍÅÌ_dóPs@—3e5‡wQ6&)QŒFÆg°0¶€ »]Ì›×)ž³Ç ‚ôô)Œ´ÂÈø‡· ÒÓcڎűëÍ~´²Çz3£ºÕëi¿ïÎŒ%xï\¾X8PKøìGðí?Ài_<ø„àØyÛÆ¡€Ù¬Ó¶öuÊ<2“öóbž ß«Û{j×+¸"æñlâÝmuÍ^ÊÒà š‘Sººïÿ†²Ý×£ÙL¹eܸÜÀb'¤Ã­\¯«€¼UÔ`·Ûp༼­­Ã¶WB´D¦2?¥€‚¼,ö¹-„EÇ‘˜”ȤkŠ1ðÖy±8B:< cÁbÇ[íí2°´ßîïêçÞÖxZˆH}šÔˆNþääPÙK,þ·©öhRS#Y¿3—âˆ4:6­Ç¾ö³Ý^·Ã]HÖ‹E—GÄ0 ,^ nè§ pÞaåFCÙ6­«à”#ƒ©m†¨ËÛwØöJzb’ɪ…;رi1Ûjˆ˜6“Ôô9$^óÀ†S„†wxp/G¸ƒWC—ñ\¾Í¥6‚.ýÛß5ž~ÔÛý¬‰ÄÅ!— \A<”>ƒšCëÚ~®°“Aó'gi®Íeñ÷vs)ìææfbÚ’ãËíõÑàj 4üJ«¬¡Äϼ² »±é©ÿjz®_I¦ˆÜ*n`n`ÁÒ^›·|'Ù6Rç/`Rˆ Û×îìrÛŽ ·KDKfaxª©,ÌegŽDz´ISÛþ¶Fe"Ûßl ÎVìçåÅ‹ÙÐÅšÈð3 wmcó¡S4øÎR±wë¶¾ÏÚóØôÔÿ}©_Däf6(w9íÑ)Ì*ÙÎÎõk0l!D'&“·Ü¹¸žŽì~¿Ø4R\ÛÉËZÃNÀMRF N \³`ÒËÜ ¹y9¬Éób±;‰MË 9̵OÇ °b±„ôÐ&DGØØ™³–í˘éÇpÙ"II›DåÖÒ¶ªûÙ××–Mj†›¼¼ÖäzÁBtRi7êûH¥K#ã2¿àÖ-z‚æ qL›“Á’G¶²a]ek§t¿_ÒR–½Ì¦ÅO°7ôe:?W3rϾàfÃë+xbS#Ž{IZòóî¶ÂYcC|L0ëV,àå_dóÜ”êíIOñ#£fÁ1x(‚` 8ê!Æq kRLÛLap<™/Ô°iÓ žØÐA㘖þKワmoøž]êfÃæet’øÔržxjAy¼÷©ñq:±Ëxâ_ð5K û\8øjFQÁvî›ß–`â)¥à¥ ›±€ŒŸ.'=-šóó¨p÷Po·ûtQþUû•°w{!-S2Èøérþ99Œ“¹9ºtë¾›ö\ÃÆ=¡*þ˜KɇUœ÷¶ý:ðžýÇH‚ü©«Ç~-åàQ¤Íåk–ön/"ðóÉøi&3¿êáo;óùܼ.þ²-wTé?]Î÷R"øOMîëì¯é©â1¤¬z$‡ƒGV·%X½Öé.aש$Veoáßçs`ÃólvÏaõ–-¬N¦dÛ*|=ÅzmÕìå•wœ¾Š7¶¼Ê³3Üìxes[™ýìGßû›X·æ¬zƒ-o¬&ÝZ@Öæ2|tKú±¿míµ¯»9.DDÁ?øÂýI±„Ø,~%šû¾¾¦¶$ªÅðâó`wrÿÜe|/ÅÙõìš=’¤§žæ[“òÙfw8ÔËù¦’±þ윯(ä3G߈wd³áø‡d¾1ÑÃLJ.­3í¾=Û»`)ñv¾8’Kî«+ÉÙÍžwJøÜëo]=qðÕY³ˆ¼+ ßß ùâ+ÉL¿?Œ [ããÓøÖ7"j@Ó§¸, $=Á6wÞ“LÒWÁuø:×ÍÊM`33fpw°•à»§ñH444SsxecÒY˜ÅÈà`Âã3XëæÀnפ#§ðÌÚµ,q7#ƒƒq8ÆÐHmCß’’^ë ˆ =} #­ÁÜÿãî%==†‘Ö`¢âcqøh¾ŽxNØ…+bóïfdp8Sf/eiz,ÍýïG€ææ†¶Œbæ/²ùUæ½]Î÷+î~¶µ÷ñí¾=""7ÚÀÞ5jÃa¿¶*Ë=©¤ücËÏâÐ9 ££âxà‰DÚº§éDÍ­ÂÝAÁ6η@h/U÷}ƒ¦/¼ °+‘2l´ߥ̰›ötU–aØùÊäY|erÛϧJ)ÙŸÏ[¿®ãŸ~œ½ÕÕ“¡öö8 š>o+çò›ŸÅAÄÔ¶¦çÏyh9WÈŽ—‹ÚþrK‹ÁÐ ^Zzi ž³…+X´¾Œf f W%2²óFÁ„_^G|iô}4œj$ 4œ+KŒp„;hp5tYWCÙ6­«à”#ƒ©m†¨>EëO_•Y ¸ôï«o(÷= ®Bï”d %~foWˆK¡uÕ`’ɪ…;رi1Ûjˆ˜6“Ôô9$ÞÝõ}çþôc¿ÚÚ[_wÓžÎü:ÆDD®Óç†vQƒáv3tBÿÏ3³0<ÕTÌåO[Ýܹ8¯tÚ¶éï;yë¯6¾9o‘!60\ìyugµög°8ÚFËñ:.Ém‘r᜗¡#l=¶çšú?ÞÎÖ\;ÿ¸8µ}M¥… ðXœU‡kS95ždÆ÷ZW†‡/¾ëxØ¥¡d?{~…§ÀŒãš$ýJ,½Çm^[Íêk‘aP’Ì Éi$N¨¦pÓ~óëùï÷m|mn _±Ðv»w‚ ×¶µìùØ (*…é_qñ§kØòë\\#’ø_Sì¸rs9ÝÒMù=íÃÕå_ÅË̹‰p8‡-¯¬aG~5ãS3ˆÿJ'|m‘$>1—(J(ÈYÏÖ_®åÿnÍØÈ?>‘Lˆ¥—º“HœÂÉÿZÏoþÏk:Gü¸.f8B™™Íù}¯±å•µä„Ø´TÆÛ[4Is±ÊaË+/²u{!LÏà[ÿÐMYrë9ƒg_˜y+xâûO°x“‹Ø%/0¯‹Û¼#ã2?¢Œu‹žà‰eY MgÉ#­Ë¢Ìñ SÃ)yeßÿÁ2¶Õ>BƽAm;ZÇÌ¡ xù}_Ÿêì1ôžâ¡S…ÏáÙ¥ñÔn^Æßÿ+vÁœç2™ÒӣݽŒ´”…1Ÿ°iñ|ÿ‰E¼¸7ˆôe½¶ý=ÆÝMžÙï¶šÔ×""7Â/^¼Ø—NëAE¹Íëô~ÞÝ9Ñy;è9—ú2½wèÏJŠˆˆˆˆé”dŠˆˆˆˆé”dŠˆˆˆˆé”dŠˆˆˆˆé”dŠˆˆˆˆé”dŠˆˆˆˆé”dŠˆˆˆˆéôç«EHkk+ÍÍÍ455ÑÒÒÍ_‘ÛŠÕj…€ëøk·%™"¤Úw‚M)^DDÚ\ìn Ý.Ó)ÉÓ)ÉÓÝqñâÅ‹ƒ„ˆˆˆˆ|¹h&SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDLg1¯¨:ö­Ï¢Ð}í+¶I X–\ÅkYåÌZ>ŸÈþÖê)æµõ¥$÷© ƒªÜµd—xq¦.cA¬½—˜-Ø“HNM!6Äx)Ï^C^ØÓ,I ó£Ã \Û×’²€ÌèBÖf»HÌ\Bbˆß­ì¥ø*r×oÇ’±„”0‡ïRÙ9¥$ÌŸ…ÙE‹¿||²u1?ÛÎ’/8²ÃK§v±lñK6òÂU/ˆˆˆÜ|LO%ÂR2™?É~Õï,O•ÙUùÇë¢°Ü Äi£ª°wlŽN›„ÌÊlO> ¼u.Š÷å’»ÕFXæõ%[–RÓ&ҹ›·2—­ûªq×y©Îv–<ŸÔHÛ`‡u²rwú³¤ø›6"æ¹xÚÒÉöfíàTì3üB ¦ˆˆÜÌŸ¯²Ø°ÙzINêö±>»ŽÔes‰°¸)ÊÊ¢|ÖræGz©Ü—K^Q%nìÎ8RÒRˆ¾œ¨ԕ䲯 ”j„LJanj,!Ý´Äë*¢ÒËü”r_+¢´.ášYEK‡˜mÎI$%—Sœí¢Ú aö. ½Š»4Ÿù%Ty,„DÇë½ôR¹¥$/$ÄSÌk¯¹HL¶P˜ïÂ9?“Y–Ròr÷QZåÁ°‡›œFJlÀã*$7¯Ê:/–h’RSItz)ÊÙJ‰Ç Ùëñf,!-‚·}Ûò:/‡“Øä4fMr`¹ªÎOpÜeà ø.ËÒ"ÚÞ]DVV ™O™Jš;‡œB/¶Ø4%˜ƒÉz7éϦrègYä¼ÿ+–N æìþ lvÅðÌÆDF¾SûÙ”µÇÜ4;"Hš·”…3±r–÷·n`Óîj›Áqï#,\úcâC»Q""r»¹éÖd•yì,†ÄùËX¾lI–ró]—7¨¢ 2‚´Ìå,zöò<öUݔ桼Ѕ#!gØ$ÂÜWÓÝÖ†§ŠÒ"^[!~äYFu9;Ëq$/`Ùò§IqVQàòv½±§”ü‰sç’d¯"7'ºè42—/gIjU¹Ùä¹¼à.fûÖ"lIóY¶<“¹± ¶çSe8H˜ŸA¬ÝNÜ‚¶O Û·bÄe°lùržžFåÎöUêü³âïW —^r—ãIhOà=Ô“˜»`.±FžÞ›.Èzw:KSX·™÷ObÓæ ¢>Óvû¼¡Œ +6q*~)¯nÙÂÆgb¨Øðs6•5à{ëöœUo°åÕ¤[ ÈÚ\†o°$""·Óg2«sײ2·Ã/쓘¿$ˆ>”a^¼^ìNâ2–1ɰt4„ÄY±m `X4±!ù{ ºlŠ»œ¢êÒÚ¦.£äçSœ‚³ÃæÕykY™×a?›“Ĺ³®Ú¦›H©.*Á‘BJl6Àž˜BRIÅ]nï !e“BÀ[žC¹%§#ÚnßG&“[ÂÖ¢jª…T‡%3wRv 2!4[–.šé./ÄåHbI‚;`N&%²„Ü¢j’“¯®#ŽHc'ÅÕN§‡òb7a‰‘´MÖÚ‰Lˆ ,1¬·†Ë€³rwúRRýŒÿ½¬€€¨gxuFÛmò†² ˜ÍÚ91„L™GfÒ~^Ìs1&477ÐÐÐ QQÌüE65`Ô¶ˆˆÈíÈô$3$y×dZlØûP‹%2•ù)äe±Ïm!,:ŽÄ¤D&]Zi±ù5ÃPWZDµQG^Ö‹äuUÍj›ì"f‹Å޽{=^laŽé ¬»ý-vBÚ»Æëö`¸ Éz±èò¾†a`‰h ¡Ú‹ÅÂåfZDǵ¯¸jÖÀ[×¶í•·`±ã­ö^S''q‘;KªñÚ]{œ$E÷º@‹õnÒ3“Øû|sÎàÒ³4׿²ø{» hÿ]ss31 Ü1%“U w°cÓb¶Õ1m&©ésH¼[i¦ˆˆÜX¦'™»‡£‰‹á¡ºýþ¬ávc‰H"cÉ, O5•…¹ìÌqãX–†³­,þDmTS\ì&lÖÓ’^/•;_#¯È…7"òrg±õ#æv6‡ oµƒKOž{¨ótwCþJì» KH ™™qWDòzð`Ç[ø†Ëór™•ÅåX¢ãˆ°]]ž-ĆQY‡‡Èör ʽm‰™·2—ײó(­ó¶Í‚:ú—ÕÅ”zÂH˜†Ýnoÿ/„脨,¢»e“}laq±Ø]yä•Vã5òÊmÄ&týuK–°8"Œbr =D$D óÖ3rÊbÝ;ؼÿ|>ÎVìçåÅ‹ÙPÖ@CÉ~öü& O5€5ǘàÁWDDnSƒómˆŽI¤$–²}ûz^´9ˆˆM&ÙYM)`M#ŵ¼¬5ìl!Ñ$e¤ø±>²#ƒª¢R¼a)Dvš ´EÄÁv +=DOºþ¦XÂ’˜Ÿæeg~6kv‚#2Yqn {ÛÑMj†›¼¼ÖäzÁBtRiÑ6 ‘¹iró_cÛÀâˆ$injû¬£ƒè;sÖ²=cs#c™›á!7/‡5y^,v'±i$‡Yèò雓¸ å®H"”bÞ’‚ãÉ|¡†M›VðĆFÇ´ôXL°o) Ë^fÓâ'X›Fú 5‹)""7Ü/^¼8ØAÈdP•»žíÌeIªs>eˆˆˆÈ—ÝM÷F2€ /žêö•Ct7·ÓEDDDÌ <ã6bTåñZN%ޏ4’ôw#EDDdév¹ˆˆˆˆ˜N·ËEDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtJ2EDDDÄtú‘ÒÚÚJss3MMM´´´ v8""r°Z­ßòW_a$""""¦Óír1’L1’L1’L1’L1’L1’L1’L1’L1’L1’L1’L1’L1e°ù2yõh9åÕ”Ôy;”Abg~t‹';;w\¼xñâ`!òe°þƒ*–¨ì0n:ëŠdÉJ4EDn7šÉ1É–¿W°ë'‘zwÈ G3ør?©cΗ²åïÕJ2EDnCZ“)b’K·È•`¶¹ÔZ: "r{R’)""""¦S’)""""¦S’)""""¦S’)""""¦S’)""""¦S’)""""¦S’)""""¦S’)""""¦S’)""""¦S’)""""¦S’)""""¦S’)""""¦S’)r³ht³fo1a¯pÇÆl›‹I=r†j?võž8Šãw'(¿Î¼Õå86±æ,`Ô3ó{<]×z¥ŠˆÈíÈ2؈@#kþXš Hr¿FBT^Ã’½¥$5ÅQ2=Û ˆÂ6ÒIÎ#¡Dßy*‘/5ÍdŠÜ =lÿÂÊÜéãHnÁf±>Žœo…íóâ8{œˆìR ŒK;yYÿ»wI:Ñ>ÓØâ%ÿ/%m3¡¯1ë`û,hãib7åµ>$:»€;^?ÄÜòzò%¢}ÛÔro{õ¬üó \xYÿÖQ¶\ðñú1÷”f3ED¤o”dŠÜ ‚ìÌí#çOå¬9V«©í׎ Qä~sa~qîüiÖã¤hþÃ|–2÷ÑRRË}m/^8Ãwóy?ÁÂþùK'PôT"§YÈ?è¢ÈèXš%Mæ‰aV~üÏ l×¥BDDúFï"7… –ÿ˃<`¥¤¬œ„œo!µ°š¢&ÿJ:Š×BˆBXør¦Yùÿ>¨k›Íjgå´Q„Y,ÄÞÊ? ÎÊiÂ,îEX‹w ›'""·­É¹)´â5¬$DG²=ºíçêêÖU2}G#ïo"±½d'"ðÊa>/nlÀC;nÜñg]DDÄ|šÉ¹ ¸O”âÈ)ï°Þraaa¬ÿæ8î:_GQc;>J:þ¾Ñsù6;@õç^ Â1pa‹ˆˆtKI¦ÈMÀñ's‡V3÷*òë¼T7úpÕaMái>½3„„ `¨ ‡¯žœ^¼•'××᜖3<]TGy“ëÔqæ5˜5%įõœÝkÅíçíz‘ŽtŸLäf8Š×þy+¸˜ÿ_•|ÞXm|}ÂþûŸ'k†‡òÚ”Ró‹fµñÍ艬ùЇííEØFG²œ$å”òùÐ K˜LÎD t5 ê‹Ôp sßzÔ”ɠϤ""â¿;.^¼xq°ƒù2¸cc% j7õ‰ˆÈíKS""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™"&y`t0¹ŸÔ r$7‡œòjàJ¿ˆˆÈíEVRÄ$ó£Ç²ô@%sþ»t°C¹©Ì;Ø!ˆˆÈ P’)b’%8È)ÿŒ¾hähߣƒ™=ör¿ˆˆÈíE»\DDDDL§5™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:%™""""b:Ë`°ï”›ÍUó×ÓnNz¼ƒŽˆˆˆÈ—Òx»oŒsðä}a$‡;¼¾;.^¼xqÀkéÂÙ&ƒŒ}å­;Ͼ:žG#Bo· F(""""_z'=^ö¸êxãN29äN¶&G32pàæ%É<Ûdðpn ÷´³>)úFW/"""r[[RPÎGg=¼›;`‰æ $™³w—`Q‚)"""2H–”ÓÐl°{ö¤)ÿ†?ø³ï”›£uç•`Šˆˆˆ ¢õIÑ­;ϾSî)ÿ†'™¿ù°š}uü®VDDDD:ùÑWÇ󛫤ìžd~ææÑˆ]­ˆˆˆˆt2}¬ƒÿ9ã²ox’yÒãÕSä""""7˜ÑvJ¿ø’$™""""òå§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDL§$SDDDDLgì®—·ÑÑ•õ-hµ9ÚÎÔÐ F vp""""·©[4ÉlåäÉ*V>Áž3F7ÛX™~o?6Žƒnhp""""·½[ïvyS=oä‘°çx &€ƒÇ*øîïŠøIE#Þ ˆˆˆˆÜZIfÓ–¿}„•U¾>ìäåíw1ó ›s˜ˆˆˆˆttëÜ.7Ê›]dŠ÷?ü ïDYÛjdõöClð\½ÍÇe%d8âùã}ºw."""2Ðn‘™ÌVÊ—òÒ™ë+åÈyÃmND""""Ò½[#É<š%eݯªlji½òƒÑJSKw[zxépÝuÜ6o¥ìPáÙïòCWWëA òßy—ðìbÞ8ßïJÌÕXÍ#ÙÜ÷çzÿÖ¥õüä·<òQOKZ©¬8AÖÇ7ÓJ×Þb2!fÃÍ7ðí{Z |1ùÕ÷·3³Ž»VÊ ß#ü÷Uœìæõ¿ý¹ðì‚Nÿ½Kì>äÇÿ&aÖqÕñøïó¹púzëíXésy×Y_WüîÏw8ùÑ!³ðV“›Þ‡×ÃÇþŽòð¶w Ï.à¾í%,ÿØßg1Y½½íÜkïÍø¾zýn$³•²Ò|ØÓ&W%•=%™Ðôé ö4ö7–!ÄLæ»ÃZÙsà8ët=ðÖgù§­8'Góøý­ÃdC­|mìp¦‡š¹2¢•ÊŽóÒ±›éªÞbŒ˜oƘne7º¿†³à¡hÖ=ͺ‡£X99”ñžV¾]ró|ˆ¼]ôù:Ö˱búuq Í›ô:1 ï-ýÑÊß ‹É8\OèÄH6ΈâñÑ^ÞÜ_LFEïI£÷‹jÞj_^÷áGuÔ p´Ý»IÇù: öÑáû{yЧ©±õªŸ{ž©¬ç­/ ÒƒúÙt‹ƒU‡°gÏi––9y÷Kk<½¼YxšZk¿ÀŽ­¥›/pkfì(Dn=Ö ¾so_»|©Ç¢‚xxçq6|àáñÄ›è<ÿ²3û:¦ëâõ»Yú°ÉÍó1&z*[§Çmé/}‰©«×{£^”}ô!ßÞÞvkõ¾ßeõÉKÇV?bj¹òZ×}ïO½Ý…êϸ÷Rn¯ãзræl$¿ð÷m>Â[ôrtן~ôEÇr{ˆyÏts›ÜöQ<8 jÏyij«ûc¨çB?ûîܧYòVÛù¾ù=y§Š¿]sËsŽ«nôá%ÿ` ÿ¶mÂ×wWð–»ã5«SÏw¸Ž¹Oðõìb~ûY +òq_v·á']êÓÞÎ=®¾.úy\wߦnêëíºæ—|è¬×qê[úuêk¿]pSÙ2„©÷tüÐgeê]6¸ÐÈÉžò£‘Ç}:¤ß7Ž{ððæ§¾k·ðk§Çì-êæO2i¥¾—¤±/·Ëê/×9m%ýá‰Ü›Eg8gÔóÒ34‰dM„ð‘ÿÎ!ž*ó0~âDÖ=<‘YCÏðÒîC,éSÓ•Vø7‡9Y“ÍãöFÞ~÷SÞ>QQüzÆD¦ûΰòϧ»x#õ²cO1KLͺ©š>8ÊSǯ½ð|xø(+.Œâù“YÄÇÇËùa¹°‘>;Ž—Fc¢Ùû/÷3ýªO‰VtZ¡¦®ýäi¥òÓ¶O µŸÕS€#./Œ cj üý%¬<ÞÊÔèHÖ=Éã¡o•°¢¦cÞJÙᣬð8ø·‡'³q²•óòF?bêêõë£Vþv°˜™êÀÁº‡#yÌZφ=Å,ÿ¬µ1 í­ïý©·+þŒ»¿åö4},çÈQ–~:„¤{È´övtÕŸ~ÔexXýöV7˜ź©£àx)O•÷óƒf‹—Ê hµØëyÞ×s¡Ÿ}GKß®à÷> Šæ¥˜á4}ZIÆ3W½1›\u£©·x|¼µïO•ùˆy Šu;‰9šE»+;,Aê||t®ÄÃKù’?4„Ÿ?Éã/o(滥þ\£ºÒËqÝc›º¹¾øu]ëͼNtæÏ8õ¡ýºõ£ßìØù/ñ¬Û11¨üÌ Ã‚?´ûzÏUóÖ Nr0âÎÑvËüÊ{çºvö瘽5ÜÍÂð¡tJ$¯vÕƒ?-­ô¶f9p¨ ¹õãX?ù43–³ {.ñÌì0Ƹ«Yñi+÷?4•m÷µ}¶JŸè`øÎb6ªãùÇÂ½ŽªùõôPB¤ zÞÚuš1S'ó«ImuE^¨&áp=' Úâiçýâ«?ƒGʯƷ }úXï¬lÃë`ض=2H€ñAx«ŠXù™ï$#‚l„­Üs§µÓ-Ã!ÜsƒáenzàkG>ó1f¬Úš:ÊšÆ:´‘ü3pÏ4¡†#-A<:c2¿¹§ýd¢š7K(szåÝ¥'¼“sUïñóϼxê%&®}Ý}âúƨ±Ž•e^œ“ãø}|Û'èô¨Q8ˆ—ÕðÓÇÂíkL†·×¾·ùSo§zü÷>”ÛÓ8ô%¾Ú !¼ý/‘m·£ oõr\Ó_5½Öø™‹ìsCxôÑ8~s©íí¤ý®œƒ=/­Ô_ðQÓþ&Õt¡ž·—s ßdÇæ>Ýë1Ô§s¡±Ž§úÑwÞšr¶ØXð¿¢y~ô ŒŽrV×ÔÕ?¯kòqÕﹺã üâ+ª )y*¿Šh“P ït±¡6’ߌéêø¸æ ESèýüñ‘¶ë Q¡LÍ/bÑ‹Žæk½œ{]é鸦—6¿æ\öø}]ëͺNtæõsœüîC®C}x?¸ÌbaüSƒ¿}p”§>måþ„ =ß*ÿ¨†Zk Æ l̺/ˆ•E§Ù~?¸óÆ^;{{»UÝü3™+S‡õ¼Iýn NžaÿÉ3ì¯êýVؘÑf `ÛC@ó±çx#c¢£ù©£­;Ï}QGv~tW‡Z,vÒ'ÚàL]§[}ç¼køåƒÖfµ1+_{åä>Ì\û©¯ö37µCG±`l‡³ÎÑöéíÚ:BÚN„¶àÛÎíÞf”/Å4"Œ©C½ìùÂMöx¬ÌŠqrO‹‡=žV¼çê8ÒbeÆX+Xìþ×ÕJUU=MÖPžéØö ŒíºÌ«øjÈøÏ÷˜ò»¶ÿv•òRU+S'ObÕX‹_ÇP_Î…þömØp"ñòæ_*x㤇ÆGEó«ÄЫ>dš}\u§·xjkÎPËðNÇ£“?~?ž5c®¼%]u|taúäQ%+>0Š@_={Y^ÕžŽkûøÊî}?ž¯7^³ÇÓßqê)¦Ž}è×ûÏuö›÷|+vñÃõÜ=™m“zx§7yóSÃaDÒŠ×heøØœxx³ÊëwÌf];¿¬n™LÓÇZàXgÅ™ã<µÇßò¬j‡º©µ:xtDÛ…ªæä V©æà™Fj±rh׆늩¿Æ¨‡êš}4á奼tÍ«j{Ù¿'=µ³ïõú7î~•;Ô¤ø.•ã¸úÞ¿ÇA_ê ¼Ð Ö F\òÆØ-ÐÛ·L u°rÆ"/o ãGÙ‰ l;nOús õá\hú´Ÿ}wç8~=Û`ùÁ¬ÜSÍJÀ9&Œg¦Gòƒ×:³Æ­W=Æ3„¦ó­`µµÝ¡ºl#‚Ú[dtÑÆkXÔ)ѱÚN=U-}¼½ß®Ç닟}ÜQ_g3ã½þëS«ßãä_Lþ¿ÿô¯ßZ©¬(gÞ»5TÙCX9;Šíy¶Ø{î4ù þx ÷ïôâGg8y_Ø ½v~YÝ-BÌ}! ?V}í-ÝvwM¦h†ƒájøö–wÿ•GÃBIaÞnàж;œˆÃ­ÀG­«z¸ÞmÀÐÎ'mG•ö5]C¼sø¼Pœôþß½ñƒ•é÷ÑôA ?«§~„“˜  Bö§nm$0tbÛ,Åù*æí9Ný½Q¬ûf(3–¶œ~w„23Cê¤ÿcÔ&Ðj‚øùìû™qMßYpÐ'Ô¾×ë߸ûU®³ý.§Ç?uU ¾FÎtçVê=~4f¨©ÎQž.¿šÇÿçÂõŒAèØ üæŸ&àmjäHUo9ÎÏwûýþdfù‘š5þþÄ4|¾N×óVjÎ{i²ö¼†î ƒ“Àè¿òù¨gΡCèêNÎõê±;Ÿwƒt]»äú¯OC4eœ:”çÏûO?ûídE)3ß=ƒ3zï'†ø±´£•²ê¨ê`eòD¦^ù}ÕG²èXÛ-óoàµóËêæ¿]ØB'ðÓ.né^hµ0Ü2›e¶aVzØ”©Óœ=Þ‚1ÈÑíSîŸvx¼Èð°ã¸F…Ù¡þsßìÜuä÷óV?œc oqófÇ[ΟaÇüQ÷1cG1æBÙ52|ìp†3„˜»‚ æYŸµ3ÑÎÀë®ãCì<3m\Ûðzê92À߉ۗ1êŠmt÷ãå`£•˜Ñööÿ‚೬þ¨ß_ÄÚ«þÔëϸ›Õžþ–ÓŸã ÷º†àt'ÐWdžŽmo»Y×µ.ʰëÄ5­6aœ:òã:Ô÷ƒz·—&Z9R~œ—wþ¯š“׌}Û­òz<ÞÕzZKéwYáÌiöŸ¿±×N3Ù›Å/^¼xC+ÜXÀ©IýÜ»•²JI;p¦Ûõ™]²‡±qv4Ý,êqдâ5Àf¹úûÄöç¿Ç¢a±¼ÿÍá&ªaOM=•õ-hµâ=œï ãñ‰!Äèo^f1Ž#ªxéÏÜÿÐ8bhäí#0Š_;M}¼\n"wl·âuèVŒùfsK&™m†Jfh(™ƒÊ­ÂDæìÉÔ¿[ÉK{ª©Ç‚sTÛwŠÍR2þå¥q‘Áv+^‡nŘo2·ØšL1“ÖdŠˆˆˆÈ-CI¦ˆˆˆˆ˜NI¦ˆˆˆˆ˜NI¦ˆˆˆˆ˜NI¦ˆˆˆˆ˜NI¦ˆˆˆˆ˜NIf_5VóHv÷ý¹ï`Ç2 Z©¬8AÖÇ7CëÌŠåÿoï~ƒš¾óE¿7d’˜ ! ÐAd¼´—j[ì.Ê]œq*sw¶v¦=vεîƒÚ}P÷-÷ÁÑ>(mÏ”µÓ£Î¹£Î@·S¨×ŠWmŽzŒ0Œ@˜ð焘“Lˆ÷A@c€ä öóšq¦…_~ßÏ÷ïï“ß?"8¯\eÝyƒi‰ki v^g]“ƒ‹Áèÿ<.Þýªý™Ÿ=wÂ~ÞΛ½«ü|ðE;»;C+ÉÒû9Õ5%ÓëEÓu¾xøìozn_g]S;ovǵ™§×šÚyí¶?MLjյf-ÎsP×åœ I×Êç =ÒH’ÌTeèx%ßL•m¿Ç>¡=}4Ü÷?IôóËJ‰àt< =”C}m ;õ+/: ×›Ñã§Õ›„pôúpôy™Œù{܃ -Uù†ŸÁ1Bu2 R¥·rj¯u¥£?#ÁP²òØ_`"k¥ƒâgÀC9c8û LÑ¿Qôrqr³´ŒºÝ8Ã9l×Dèé÷födS¨®EôIDATiä!D I2SöòÁ—z¶mço›|ðå-F«+94ÜÇɾ zi)ÛTÌÇoäQ<_ë½|òc7§û}ŒN~‰Ú—J9µe:‰{—h¿üþ_ï@m5 fNb‡8÷ïW9‘]ÉìÐÑ|þõ“wØØdá¯ÿô25Ú-ÝœìóÐûr­VU•òÇ|í“6ùèË[¸ª_f_7'û}xu&j·•qÊæåè÷}´N„ÀdåØî-ü![£o€OæŒ%Œ³³›£·'pøÂ˜³¬x½”㺹Û!ÃÈÎME˜·C§ËÉܽ=9d“ƒw(k ·|+ת¢˜žÛרqÃÀ§^f‰âŽà¼rßöçðíÛ%”Ïô•ˆÝ_v“µë×\Ø :í¢}sdà.eM&쳕º¸?g69>ĉ+¸4"˜¡£Ì^È©j;¯<9뙤ÿ’ñ ðÚ7î-¤÷öιüMfj_*¡qóôx–ûi®ñªT7…rf… åF'ï{è i°ççqübê,±v´\¹Ç‰>®–²¢b>®Ž{*mš|›ôÖ/űüN‘b]“Ä0½^yk¶r ¿‹#÷áÔÛ•ÔS‰]uÞ$[‹’­qf óÆŽÑL­ †½Œb¢LºqLùÓ6 §¿£u2Âöl ÀᎀÕF¥ž…#”Ö¬DuO}«ò%{1”I óB©®ÉÇNò¹ó,µí9ïUÆ_|`)¯V¹\¾hœ7îpÂg៫+8Sa¢÷~þy¶ÑÒv‹ú¾•¥Å4VsÀæÒµ[œpG–a¿‰Ø¿w+ V ·”oß.£J¢åo×yß飠¨ˆÆê"ödLÐðÍu>޽”¡ãÇ{4¯±sjW)L~.]¾Î¿4%%|ZSDUh‚úï3Iï\±Dø©ã&¿ýq ìh¬.¦NçåtëMŽO×1ìãä%õ}a*ËKh¬´Bß]Þïšï^Ûí:pÑŽÖ#zVF‡½x§cu<€5J}²¸5l,±b~4ÁEßÓRÜ®îaájb7Û¾=[i̬Å|ûvµñ/78Æ‘KÝœY8ôF) åf‚ý=üãÓ—óTû/ -÷hÉÈáXu1,.ýx“·îÎu#ƒB?©Œ×¤uS)'^ˆ‹ß]ç}gˆò—Jh¬¶SþpˆÃßôðSLsÜ»q‡¬¯© ±ÜHo_»Oö‘¼M¶I{ýRË:•ºªÆÁé¸Ã‘~ ;7åQ¬K5v•y“®±Z}›oÆ<_Y‰Ör¥5+YÝSì{’½ÔC¥”êª0v’Î8ŠÛ/~Þ§(åãÕê#g2ÓÀ‹¯wR P`bÒu•cÃ/gk ‡pL©­©à³Ó+[‘ wó-œž0ØtK¾ßD²Œl€^ÇÆLÏ'ú#”½QÉÙÍÑR÷Y0_¸Ééëc¯ËÃ6ýY½¥ˆO«lØ€F/ÿ÷¹•|¼%ú¹âG#¼~ÃË` Hï¬Xünêì[9ÿjô›ùþ+öó×i¸îæOuyè‡Ð4©¡¶v+Ÿh§ã5ñû/»è˜³Æ6n´`vzèðÁ+–Žá¹ùFÝc8ƒk±eøi™€Û,ØÚÙ`Í£*c„W€ã¢£Ó ùeT¥xO¥ÁhÄž¡ öLݬ~LŽÑ1eàÐ?”r<[äQcéâ¤;ŒÈòŒ(÷_2A[_ïŽö/%6*[®qØñ€ŸJKy%vCÿXÒ~RiǤuS)'¾½Æ8á‚»*ùxúŒò~›–ê 8=ZÌg¹Ó®)ä쓹g$àºFýp€À•6UØÆœöú¥8– %¯k 1Œ>ÊáÒÛż¢ünÞL±o’Λ4ŽåYñ΢¡¸È ÷}´ú"ÔèC\u…0çç`×Ùoƒ÷{=¸·äažœ  ;7̱.OK´–‡Ö,…º§Ò÷æÉ‰ÇÞê¡2/ô*uUsIçN\ÜI×’™ ;ïçi·ùLª´Ç*'g2ÓÀ¾>':(ÐR(‘К8¾wë“kÀï£íþSÀÔòì7“ãc¸0ñ‡õ1˧ÖÄþ"LÌ|kž‰×üd’tÌèx%ÿirk^£" Ž70鯉%±—hÔm1„›žp—ËKPgãÃØ3†ÆåÏ_GCV•ZÇCÓg%tì)·³q*z€ LŽá˜ÒQ“¯S‹[kâ@¾†Þî Ü~Í£PUjMû=•†5fŠ ÐüC7Ÿ úp‡¡ ¤”m£€Ôú/™ª kÌ"ª£ö%+ú—ß³Û%ï'”Ú1Yݔʉ3êž`ó³g”-v¾~çUNå>]ãçžM÷4.•6UÙf)ê—ÒXV¨k*1Ø×ç=¹Ì½Ø“Í›tŽåøxç’•m£Œ?¹Ãà÷riRCe‘Z*7™`Â38s¦ÐÄëü‡Óù×rµ5Ki<¥Ð÷ÉÆ^êõP‰Q­®*c'ÕøU·_ì¼OÍÂŽW«œÉLsfjÍèà„c„Ž ?£è(³Íýýw©ö› o( È;j¶ha*Œw Șþa³$Ê‹S7è$@Ã…vfýV½¯ïQtF²ži: ¹&-Ìw§ÞDŽöùqgŽÑƒ‰môkzh1šáaTg¡6K£·–ÊR3|7B‡-;ÝCt`áLJ—Êe®åÓ½aŽv Pß:B=`ÏÍãêbÞ³iÕúO),Ƹƒ¨Î€/®©g/ªôZ…vLR7ÕržŠ|‰ÆýÌXÕeœ.{ú@‘hî©´©R»§½~¤<–“ÕU)†Œ™º==Ó¾ Ø“Ì›”Ö"±ñÎÉh¦ÆMý>Mnœ9•Åf³aŸàÜD€:—²Š£÷cÎWV‚6(¬YJuO¥ïµ‰ÇÞBê¡£Êú¬4v’ÌY·_lýR Ö÷«$™Ëí¡‹w[ûðn*¡q‡‹vúÁÎÙo˜ž·˜uÑ{¡FC<3Z¼ž0dĬ—6^½N 9¶·ŒšYWÿµØõàZ£ŸÉpl¼¼¾D_3uTm4¼í¦cØ‹7ËN¹Ñ6 Mý:2üèmEѳŠqgÙÖRIçÜ~ô]^È/¥*þ~Ê4±åòÙï ý8\c4;ú8öMÛ;T¥­ÿ ú옅BxÑD/çÇPé'ÕvLT·*åDûí1‚:3•¦g·LÞOj혬n*åÄ˵™1ã¡ù™ñáæý»Îa—Ú$TiS•m–¢~ >–U,4†…~.ѼIe,§²ÆÍOCq‘ ð—þ0¹v+ö™_iìË×0zÿ­! åë ‰ÏŠ&(CeÍR­»jß'{ ‘Ü@]v„Ž»höéxkG΂'µxãc±ñçMx«ÍÁÁñBê²Áé¡é¾ªšâè3‡²nrºÕÁvj2´ÜvÑ‘ä¹'CVU:—|vÚ£7ðlVìSôb¤~ú6µ¸5€Žš#Ç® áÀÌ™'÷ÀEp^¿ÃÑQõµó=t ÎœmBïàHK7=›-ØB^Z:‡ð®É›¾,¦Òj1ûïòæ÷ø£]KOÿ§]ʶm 2þ¬˜Q¡ŸÚ±*iÝʉïgÛŽåŽp¬ÕÁGÛ ©1…i»ÝƒCgã¯v¨¼öߢЦ Û– ~ >–•¨ôe:?7ï¼Qlw­Ú§*+ÛÆF<ôNi¨Ýû`†ò"3ôyb¢.{á9KeÍR©;ê}ŸtÝX•Uêª0v’Î8i©ïŒ?¥¾_åäLær³làì6rÝ.ê/wq²7̾ÝÛùöu+f·‹æñ…}‹TÛ¯‘C»KÙ—åãtÛߘÀ\YÁ){ì©¥¼<²‹Ã-}8Ã:êv½Ê§åFzºº9ÜÖGË”…c{_å-æC¥xãcѲ}ÇVÎo31x¿‡ÃmÝ4kØ_½•OgžPÖš8¾¯’ú" ÎnŽÜpã]_Æ×•¦„÷‡¢5Qg0R7óO“5úš—5V¶Ï$þ)ô_=/zæ#×þÌ¥r÷„ǰ/î’íÂ,8[c§ü‘›†Ë÷8rm„žL;gö–L¿(Z­ÿ¢1y£÷;ÍIÇ]¥l4ÄÑËÝ4¹µì{c+æzÓ ý¤ÐŽÉë¦PÎìã½½¯Ò¸IKÇí.·õÑ¡_Ë™}¥Ô(_"TiÓäÛ,MýPËJÂ?7ÿ¼Qkw•5.kÌÓ_úMÔÅ=Ø“eË£ Àd{z}!”Ö,ÅuX±ï“½…PˆQ©®ÉÇNªñ§§¾K0þz¼ZE~ñøñãÇËZà™vþ~hçr)ÄÊŽñûæ»k¶óu’ëÊ s±åúš9îgò ðÚ{þÇëü9[¾—Š%¶ªæ/†uMí<>¼3íû•#†KdrØ…3R¹<¹RÂ!Q{ðEˆ¥´ªæ"!¹'Sˆt z¹xßÍ9‡ì[fÿ•žçN§s€ÑÒ¢„ï bI­ºy#„HF)B¤[ÈKÓ NSÕ9i{úi(©”?¯tâçmÕÍ!D2’d ‘n™v¾þŸöäÛ­–Bþï¡Â•ŽB¼è^´y#„{2…B!DúI’)„B!ÒN’L!„B‘v’d !„Bˆ´“$S!„B¤$™B!„"í$ÉB!„i'Iæ<.ÞýªuM.U>¡§{€é ¨öòÁíìî ¥U\ ÚGªüœüªuMK]N2IÚ×?Âî¦v6ïE±WÞ\Â~ÞΛ½ágÿ[!„xAI’™²NÇÚC9Ô×–°S¯ö™žÎ>îûÓ”ä¬TÏ ŒpÑýï{c¸—©ÜÙ’Ô=CÇ+ùfªléúÛËßÖB!Äj#IæCÈÊcégü§Ï"ôvàʰR_a„‰!Zü+Ó<ôVNí­ä³-F +‹Bñ3!IfJBœû÷˼åŠÀè]ÊšnrÑÆÙy7¿ºÂº¦v6Ÿ¿ÃÉÁ™ËÇ>9…÷G×66Ý¢- „´tÜ¢ú‹vÖ5]æµoº¹è‰Ä• åÊ-^û¢uMWØýý=s^a£Œ)Õ}$Š=°Ÿs}!ôv;û7¯e#>šûC³·ùÁÁkŸ·³îìMÞõpõÊUÖ]cRµü°—¾¸Ìïøhé¸CõÙézü0SyÚ÷™8bnHº¿¨Éñ!>ºx•¢¦vÖ}~•ÝsñS0AyA/Ÿ|“—?Þ>Ptö&ÜõÅÔ3ac*µÁ»ƒ~Z®8Øü¹czÜ !„Ï/I2S¢cßž­4æÖb¾}»‚Zc„Ÿ:nòÛÇÀ¾Æêbêt^N·Þäèp0°ïV¬@n)ß¾]F•6ÄÅï®ó¾3DùK%4VÛ)8Äáozø)&ѹwã'Y9^SAc¹‘Þ¾.vÍuvŽ22Tö‘,öù&G¸øHKí Y™9ÈŠ^2|ºçZorä~˜ÊÊR+-oßáý¾ØDTµüÎw8á³ðÏÕœ©0Ñ{¿‹ƒNÿ<훬íŽqäR7çC½QJC¹™`ÿøã“óôgKÛ-êû"T–ÓX]Ì[˜K×nq¸SjÇŽôkع)b]²: !„++]7©ýlŒFìÈ0`ÏÔað»©w°Wlåü«& Àþ+öó×i¸îæOuyØŒl€^ÇÆLŒ÷pÂ;wUòñ†hì·i©¾ð€Ó£Å|–;]ØšBÎî.¤ ÀHÀuúá-†Y—}³âÊ0„É÷áKûœ­¡·Óͨ.‡C¹ÀÀžÍFê¯ Ñöp-ïeB`|€“ÃP[[ÉÇÓuÌ7P}¡ïÌnR(ß‹¯ŸÔÃĤë*dž^2ή»B?&Ú“ctL8ô¥ÏÖyÔXº8éã fµµÇ”‘Úš >Û8ý™p7ßÂé ƒ-AF˜BŒ>ÊáÒÛż"³V!Ä* g2)0鯉%¦˜äÆHÝ#L¸ç¼¼=êž`3‡òc²‹¯ßy•S¹O»Ä¾>'š æ*S¤$Ñ>;a?Íý!Ìö<ЉG0çç`ÇG³+šÜŽ{ͰÆÕ1zÆsF*åÇ×£@é«ù%ÚŸa™b4ÿÐÍ'ƒ>Üa(()åã_Û(˜kgZÇ÷n}’`ü>ÚîÑ1EÒþJ­ ò(—S!Ä*!‡¬E úC Ðp¡†Y¿Õ2:E\+G>Œ€Î€9#ö粌ÓiÆtbaÎ\|÷$ÚGê±G&‡hyÞ¾[”õÅý²s‚ÁÍyx=aÐâŒÒRsRO©üŒäõXˆ„ûË\˧{Ãí ¾u„zÀž›Ç‡Uż7ÏêîÁN8Fè˜ð3ŠŽ2›Ú#F)µEí,­Bñ<$s‘ô:-`äØÞ2jf]ÕbŸuÆMƒÞ¨Pèéec"¸êŒdÄfi¤;@gç£êwQ©úsWç=ß^2ßž©P îÁ—0ƒ!@—Bù+ô*I[~!Ÿý®@ÐÃ5F³£cß„°½SÁžøvyèâÝÖ>¼›JhÜa£Æ¢…°—¾tàLRÎóÜB!ÄbÈåòE2dçPF€¿ŽòlÓô?# p²sîG€smfÌxhŽÉünÞÿ·ëv-ßKÍ;aÍ}!ôöBö˜yÅ6óÏBÝKyO.™Ûó-˜§âêøp‚s1Yç‚Ê_îÞ;¼öÕ]Z‚`ÐÙ¾±Æk1OùèðÍ~'àã&>ܶ6š`Ÿ‡BW>¯m „B,–œÉ\,£?ozÀ[mŽR— N×M÷}TÕ?¹\¬×ž ZÝvÚ6p,w„c­>ÚVH)LÛí:µë`¯ø~¦ kúb˜¢5¤¡ªÔ<û÷&{Ö ÐÔ9Áèï ù“u„úïn¡ßf§&ÃÏÅÛCŒÆž­[@ùJu·õþRs¶ ½o€#-Ýôl¶` yié»&Ú, y¶¼L3vøËå‚Ef²MÐ|{„^@ß7B›ÝNÍšy Kc!„Ï9“¹hZ¶ïØÊùm&ï÷p¸­›æa û«·òéÌ“Æh)/Ï£,äâpKΰ÷ö¾Jã&-·»8ÜÖG‡~-gö•R³àZâÊPz@H%öXÑKå^,˜ëÞD­‘ýëu01DÛC#Ø·•†õÐ~£‹#æÊ—9³^‡^¯A¿ òë¾ÈËËËÎÖØ)ä¦áò=Ž\¡'ÓΙ½%l×ÎQžigß°‘ëvQ¹‹“½aöíÞη¯[1»]4'zQºÚ@!„x¾üâñãÇ—µÀ3íüýÐÎå,R¬ˆ0´±ßc´µ\åðš—ùfyˆE!„x¬kjçñái߯œÉK"0ÞÇëÿz£±/#ziŽPœ?û=ŸB!„x±È=™bI²Ör(ËEÃ÷Ý”½±–rü\rtÓŽ•OírX!„xÑI’)–†ÖÈ÷Và½ÜCCë^´Ø­9Ôï-aq¥ƒB!ÄR“$S,£•ã{^åøJÇ!„Bˆe'÷d !„Bˆ´“$S!„B¤$™B!„"í$ÉB!„i'I¦B!„H;I2…B!DÚI’)„B!ÒN’L!„B‘v’d !„Bˆ´[ö$ÓþK=ƒ¾Àr+„B!â8Ç}Ø©_’}/{’ù›µ¿¢õÁØr+„B!ât {øÍÚ_-ɾ—=É IDATxœìÝl[çšà÷oî5y=:ÆÙ 9˜Ô âºÃtF¼ˆ8i%t¥öš{ÔîJ»‚:ŽÔØB}åØ"«Pìø à8׊PÙ’ï˜6@«•¦BZ¬„ÍÐ+ma¢)uQq¦á6¥‚; Õ,™ Ï |TßCݹýC”­$Eê‡å˜Ï0,R‡ç}Þ÷¼çå£÷¼<|‰á™ß „B!Ä ì¿ÿÕ<ß;è „B!„x$ñB!„%A_!„BQüæl݇!^º={Ð!!„B¼ÐdÆW!„B”I|…B!DIÄW!„B¼ðæçåvfB!„¢ÔÖÖJâ+„B!Jƒ$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ[~ð[&Nÿ¿Ïÿzü?çÿ=ù&ÿç¿xÁôøíƒL!„Àø8QQÆ6?ÿý#üׯí]β»Ä7ab°‡SÇ›innæø©nLÌ“*䵉)Þ=Þ˼ ñ_âÔñãô†´½/«ztˆ·›Ï0ßãßù„Û«øÓJ#_ÇÜÿâ>ÓËxç¿ú!_ÿ‹ßå¡B!JšÑÄà¿ü!÷ÿè >ýýuÉï÷pñŸÿ=?döͽI~íü¥q&>èeÂt’‹·ê©4ºÄ?ØO¯6À@›‚s*=A(§òÂ=.º”ý-kF›—Îó5Ø,{´Ãƒdz•Oÿi9¯üÕ}ð5ÿׯŸþêø*ŸþËטý£eìÿêkþÃÁE)„Bˆ’õ=þ ú(çÍ«?×Õ¾Á§¿þ%?þâ{œÿç?䧯¬ÎÑVýð(ï|↺ÛÒv*µH0f¢¦ÕƒÓª`4*X:ÏÕaÓ¬ÍÛêñ†.âxs3ͧzš‰£oÜ3ô2\f®¿‹Ùf|w[V*@Ï©AÎ Ñóöizÿ»ãœò/>#5Ã¥ãgð/ê /0>oûº¤Cü“7—ª¿ûŠºMI/À¯þæ+ÿM‚Ç¶×øéïÈŠ!„B„¿ç/> sò¯V2¿GÝ?vûoÞx’ô‚ÎÇð®“Þս‚»Êìð0£$2ù â:ÍÅÓ.ÌZ„á^qw7·FF¸}ÎItø¾ÈúäÖLý•>¼u}·¹èÎ2ã»e©AîÏ*4^|ŸöfG ÍÏd©©p€˜Åƒ§bÓ¼q"@ÿµi”–>îŽÜâB½Êx¿Ÿ¨^hÝÐ÷Ë8iû_D–ø‹_gßäo—þš—QWqøÙÆ&„B±æ×yðËuÉ/¼R¶ö“ÎÇ_rü˽™ZÜÅTŸ¦»ôyMÄ qùT3oŸ¹Ä ÿ k“¢ZdœÁKg“«¢`uµÒY¡©X‘3£{Q–oG;µÎ ìÕ^jˆ` Ex:†ÍSƒmS©ñà1{+'k+0+6\Þnº[ª0¤÷²nûå¯üT5{4?ø‡¯ò?ý‘ƒ—Ýù{ü›ÿòþÑ÷ŸqˆB!„°šüþÛ/˜\Ùø´ºðïyg’^ØÕ_]7ã¨oÇQß褢A&Çü\î‰óÑ­6”DŠtr’®ãÓ2¯J§Óœég]–Á„Í”ù…âÂëÆ?§Åa:aÇ[cÝR¦Ó0Xm<™ƒ6Zq{V·KlSÞÁfl…د ÎdV¶üöWó5÷—_å~á¿HlY!„BñL|ÿ~ÆM™©©ò÷™\ú%?Ž,ó«=(flj¯6ßÏ©AWïuâ41;êiïˆê ± ¶QmR0”wpëgž¤•ZŠfmêÙ•¥#†µ §×‰æŸ!b “¨hÄmÞ\ªÅ¢Ž$HãÈ$²)æs«=”ç+¯¨–Ü'¿^æãøßsò^åÿ2Êÿ¶%©]áÏÿm˜“ÆßãÍÈ_réoþþ ¢B!D©ËܽáéšÞÂß|ª—¿Çêšß7øôû¿äǹûäwÇK‡—ã,ƒƒSÌ/&H¥R$ç™ðHZÜTšÀìj¢JÇ?³ˆ¦ë¤¢3Üèêb¸Èu°ûQ–âôâЦñ'p6º²&«¶z¶ØþPMO 38:nÜ»ºíŸþü³¿"\VΧTÎlZÆðÛ¿uˆð˜‘OÿwÎü?[g„…B!öß÷øƒ7ÓÙB¸þçÐÆ¼Õ¾ÎyS®}nçK×/0îgøò}Ô4Pf¡ÒÕÄ•ëMT£›Î« |¾^N /CY9Õ-Wév+<¹m³(+ÛÍ~^'|qÑéÌ1GkkâB·Ê°¿‡É4K-;Y½ãZžòžêWüø_föŸ:ÿ·¯2»¨þÕ÷°¿üÑø ÜŸ Ѿ$I¯B!ÊßóŸý%çç‡Ü|eeÃÙFü޽Áýßý³ÿîsnîÁ]^bxæ7¿9[·û=‰]yéöìþíü·Lœ®~•“¶#Øjêü5?ýò»¥ !„Bæûeü“—Wøóÿ°éƒlß?Ì?þøléñ®—9Ü9Ý͇ÛÄwÆÿ§rçQ¹sÐq!„Bdóëeþ<Û·iýú1ÿnio.B!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%á¥o¿ýö7f³ù ãB!„bßø|>™ñB!„¥A_!„BQ$ñB!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%A_!„BQ$ñB!„%áÐnwŠŽÆI.§Á`Âb«¤¦±…¦Ú ”¢÷gôL“I0T÷1rщ@¼n‰4Py~„ksï}ïãÚ q&Ît1–ª®ðgW]«u{ÆôèÎ^~€ @%çî~H½yóV¡K'è_ȶ‡2,v'žÖv¼.kæøDÕK×ýM™QZ%›còæÓ³ç¸uµëîb@ ûðÍ-e•¡äÌ<žm\ß=:±@0“ô,§¨ßšùæ±L26ÇØa"çosµv¯RÜÍöëXê$CãL>X†2 ·Ç…Ù˜ïy!„B¼vžøjaüc™„¤Ì‰·½·ÍˆžXdvü>Á%H‡}øçÝ\tí~~USS™Ÿìœ»;e†ò`â*Ž ‡×˱¸ŽÑq@i·#ZÞðÔB Lª>ß m%­Z°€´F|~š± ¤I›&^Û†m?b}nŽåspÜ„B±k;N|õD„XzõçÊŽ ´¯-;p8q¹¬h§ú §Ó,„變̥aøC?þÉ9"1LåØÚ;päÌ[Rz~‚/¶ö8ÆðOšo½ÅÏ›¶¦[û׺KùeÇ®ó¡k†¡¡Y´–N/\¢7¸ †*®Ü»ÊZ–zx‰ŸÜ\Lûè6§+Tæ§§yƒZKkýÓøµè>€Hl 5]†¥Ò…·í$ ÎõéèNÚoSû,L³š÷–QYed!¬ÂÂ4áT}î?& &U.œ™ÙO—Û…)v‚› @2B\›¡°ò‹±?ÇrSZžåò[!j®àôÍòü=ºYŽÛúþPw…‹Ž £S!––)+¯¦étMÎ ššÅ76K8¦¡ØÝ´txXìïå å'oó³ëZÅ™Ÿö36!¦.ƒÁD¹£Š†ÖV<Žýš]B!^|;N|Fk¹N|nž¸»ÛÚeaÅÍ…ÛwÑŒæLB¢õ_âòôÒÓ¨K,ïs9áüGÉ~Å܈¥Ò‰]‹K®>c©tâ´”X\éØ8ׄIå¨ô¸( YNG™é¸œF@#Œ­¾ÀTÇ–ûšybæ=ÃažÎÃ.“\r¿7B¬ïNeí·žÎB`~µœ²ÚZ­ …ÇHcº¨åÌŠH¸ýÎìϱ\íOå‰K™?ÊN*CŽç·s94Hï캣·4ÇX¯ŠrûC<™\6¤«?øä«± ¾ËólíÅóÃ=|\7+ŸVYŠÌâ»!~}€öBÿÊB!Ä;¿«ƒ­¯}õÇåàMºÞ:ΙK7¸3:ÅL(Šj4c6›1¯½GÇ e’rowÿìF>êÀiÔ9|÷#«IÌ ®Ó}\h*Ï<®¤ýj¹²¼gWz!LÒTIuÝ1ê+Œ•\eËDÆÑô8ÁÈjbhª®'gÞ«Íã÷e’Þòcœÿè6·o]à˜@evh‚ø®Úo}Y Le–9”¹ë©¬p㱬þ*6=G*ÏK×í„DdœÑp&éµ8±íW¶/ÇRÁuú 5™”³ÌMç•‹4ØÌ9ž/`‘ï28ÏÓw½óÇÖúéS¡Äêz”±¡LÒk©ãÂíþìn•Ë,oÞW*ÄX&éµx¯p{d„Û×ÏSgH2íŸßþ8 !„"«]|¸ÍFCßuŒ~?ã³ ¨¤I.Ìñ`aŽ™-,Õ'éî\½Äœ˜Ÿa5%©¢½Å¹ú¡¡Š:NzÆyoZe94ELw>¹œþÜŵ¾“—ë·Ûq<‰µË@0˜F ‡IR-!’™9¬ª·ç¼ €Ÿe5?.£æt;µFÀJ[G ¾š’$¡aÚO‹NΔåöØ1bÄí±06–„X€¹”O¶¿'Òsô¾ÕœuŸv¯§¨õ½©H€ÙèúÔMÁQçÁ™õï˜çµmâìäB›{õî¶vf|@XŽk«Åf2ËK Tw´ã¶*€“¶ÎV‚]c$×ïkY]}  ÆÂDbVÜÎZÚ¯˜©Ij ØÙ‡U%B!DIØÝíÌžÎñtê$#DbDæƒÌÍÅPäÜ}zMܾêF­ÝG Ì'²$Qé8‹*8÷â³Cû—ééS§û†äÉH¥Ç!$œ!’h¢,\MhÊÜxì¹3­t"‘™õ³â,ºâêdàçkt¢»n?ètxuqº˜ln–±Õå¹O¡  gãEÎ7sÀt’G{°~žÓıª:œ¹nŸð¼ö±uÊÊMO“Qƒ‚Rë§rÓ‰Xæ¡×úéq‹G$×7‡¥ wù“KŽL3Ü;Í0&ìUÕÔy¨wZåVjB!Äí<ñMʼn&5@Áb·a­pa­pQëiâ´gª·‹û ?`Ascz²Ô„ÝiÛzïUC9¦½˜Êzqʶj¬ôPe2—^b&Ç4 Ìí!OÞ‹^è:ÙݶŸa:³ôbõƒ[³[6‰Â$<ž,·[wWÀ¨X)·ÛöÿV_Ïk+RÁÇÀXAÛÀ- ¦A"Ki@%~Àýð&k®p«Ûu@÷¡B!¾Ûvœøj‘!.ß\ T_¹·ñvRF [,¬MeQì —ÁPIû•‹{¹y¿ãÒs<ÿdß•4T˜›K›ž"(ÃUŸ{™€b¶` Fš‘%O&›Ôã3Œb¤ 6êZ<»n?-2Mx»ü+ œð°eÒwÓ]vΈãôÿÀ'§ ÛúyícÅzzŒ“„bëj=ôdˆè¦E¾zj‘X2ÉÑÄ…†N ©(áà ãXX58Î|‡‹<ßÝ"„Bˆvüá6ÅQ€4s\bpâ!ó‘(ÑÈ<3£ƒô¯}ʽ¼»–*7&€ô£Ó‹h€®-2sãÇ››9Þ3A|»äò¹ŽËˆÝS…H/< ¼ ”¹ðTæÏ¾ŒöúÕ_±LpÈÇÃʼnèCü7†™œžfz6ì6ÎóÓ‘Õ Uœ¼p…+Wžþ»ÐQ“¹»@Œ@8QHeŸ‰ý=–™ã’Ö6ÍÇæz~çžã4á¡A¦æYŒ¾6¹q}/«_Ôrùòe._¾ÄÐÌ"ªÑNUMM®§kmž“|^!„øÎÙùRkçZg¸<¶@š%‚c7 nÙÈNcwæÒyE 5Aúƒ* cïqblýv&êZërßùàyˆ«€äWqx¨2Ì1—ɘ .Ûä½ ¸iowÒã‹NÎró½ÙåŸk¡ÂXDœÙ¤"<É{ÝMxÜÎÉ“®P3äÁ2ĦB$< ÏÇ·Úí[3b²•êê÷Nôà½~öŠ\Ïï²Jí-vºÆb°æþ᜛šÝmïåAr™¹á÷˜Þøû²šœ2Û+„BìÈÎog†‘Ц¹÷Ñy«íXLkw$5`²Ø©òžãúÝÚ*žÜxw÷->ꨣríÃ@†2Ê«Žqîú-:]{ucþŒKqà©Z[Dj ÊSYÐìœÍÓÇí¾Vª+-™™×2,•ut\ÿˆÎ'—÷wg*<ÍÂZLuY–^íÔ»2í´ ôÜLúîß±´ÖwÒ¸ö‰Åt5ÿùÝÖÃÖt[çê¨Ìܺ¬¼ŠÖ+W2·)[GqrúzÇœ”›žö¥2K%5­W8'ë{…BˆzéÛo¿ýÙ,ß%Ä3§G<ÑK0 öŽ» d½—œB!ö‚ÏçÛåíÌ„ÛK¸Ñ?E\7bmèæ‚Ç†H…§˜ÏÜWÙ¶oß"„Bˆ5’ø ±ß¬U¸ ~æbi–|]œšª¤Â¨YûîÊ6ZŸ—[P!„/0I|…ØwV<}˜¦ÇÌ_Z ‚“¥’*o-çóñaB!„â'k|…B!Ä Ïçóíæ®B!„B|wHâ+„B!JÂŽ×ø¦R©½ŒC!J†Á` Þ«ïBˆÒ²›%º;N|e]°B!„ø.‘¥B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!JÂß3=Í47çø÷î‰T€žã½Ìë» Q#t©™SwÙnWztˆ·›Ï0ßm™…Š3zfSÝß>Ã¥Á)¢Ú>ƤG:uŠ;‹»nÜU©ƒ=œ:¾Z‡ã§z¸11Oª×&¦x÷ÉqÖˆø/qêøqzCÚÞ—U„ýí :Ñ¡·innæÒÌæÈ³ô‰æãœº4ÄL|íxÞ§·XßÞÚþ§G|û8×¶T6ÁԻͼ;•ØÕ¾w|>íõ¹¸÷õ½Œuó¾öl¼ßzžìî½r_Ʊça yúÏAœ»Û•¹Gíòìs¡ï–C;{™™úë#¸Ó°štÑ¿ÜÉí NŒE ì]”2Ú¼tž¯Áfy¶åÚ;nÑWctÔx„€˜Ë=qúNã< ˜ gâƒ^&L'¹x«žJ¨ Aüƒýôj ´ÙVi!ô¡PœÊ ÷¸èRö·¬mìk_Ð"L„Ò”W–±0$Q߀uÓ&å'oñaýjŸÐâcà _S°ßj§b¯*)7î‰Bìî½RŽ­Ø é7ùí0ñŒ Êê™»úÚ€¢(O @'>;ÄØx˜ å5\©ÈÃw&/-c(¯¦¥³“&‡úãÃAZÝ.l©=ïÍÓxÒÄôØ, Éå§æýÜôˆ$ ØkZðhãÜ·ð˜I<¼ÃàýYÔ4,Ty;éns’-•ÀP†¢(€‚⨥ýª‚zæüÁª7Ç¡±ÕÀ¤?Beß-ÚÁœí½žS½×˜U—áòY–¯Þ¦ÛiD‹L0tg‚¹¥e –JêZ»i¯µbÌRæéõ™Wj‘`ÌDÍGœÖÕç­Nç %ÐXeûã•bæƒ^¦“ËÐßÅî[\toj±Ý–µ¡.ÿÊËGü?½ÎíöŠÕ8R3\:;Žãú-ÚMëÚ=_Ÿ)¨ni‘iÂÆ:ú:l ½7M0Þ@“mã6FãÆ>ÑÒ:Gàr„˜FA‰oÑ}rô¼ÛÅlÃm ç½žF…©ñ Kérj::©SÇñ‡Ib¡º£‹õVÈY·LÏ,dŒºt–1GŽ1£"O{lSv^»y¯Ô 9¶Ù‹}~ǃê?ÛÄP̹Kþ"{¼YÊÜ—vÙ’ í~l}‘ìïßôãóNºo0òQ;æÑ´ý>âînnŒpûœ“èð%|‘—Ç×Kè¿6ÒÒÇÝ‘[\¨Wï÷Ív)@c,è càiùþˆ‰)>èbi`dd€v{xyõ5©‡ 1µ^çîÈ·.¸ILÞa¦˜+©Š¯«Œx(Æ–©AîÏ*4^¼@‹i!w;䬧•†¾«Ô™L»ž9qR3ô_› í¹ÊÝ‘Úí„oö2¶v¹d}™¶MÞ\A]evx˜‰‡Q™€×i.žva†—™ú+}x-&êúnoMz÷ª¬'uyŸöfG Ͳ¶‚ ³xðl>©óõ™¢ûbŠÐD‹·GE ö$@þ% z*Jp:Âr™[¾w'Eì æì&\nñà EC$¥`” Å‚Ä-n\ÿ·Á4õÝeäîuZŒ³ ù#YêeÄ^ï„È ±Ì/¡I›—jk¾8 ¸V—¯Ÿ"OÙú|®úm=Ÿro»ÙÎÅ|uÎ;ä³Ö)¦ž…Ÿk›G–}ÁÎÇ{5ÌD¼Ž¾{#|Ôª¾Œ_mâúÈ×[ÂcãDõ|u£à1ªÊ›gÌȳÂûÄåj»‚ŽmÏõr0ýgÛŠ9wó9ãU²×{¿Úe½ÝŽ­/˜}þp[9MíõØ#JE5u6PSi´È8!ƒ—Î&'VEÁêj¥³BS±m’xp‚˜½•“µ˜.o7Ý-UÒÙË÷´ÕS‘)ÿ˜4-M<0MÜq’öZŠbÅéí Î”y‰ÙŹºë+0+ &“ŰLR+nˆS, iUÍR ÞŽvjr·C¬ˆz&æ&ˆXZèhp`Vlî6:ªT‚Ókíù´Ló–>o£ià.}^±C\>ÕÌÛg.qÃ?ódònŽ×Þ—õ´.öj/5D0 "<Ãæ©aÓäkÞ>StÝsLÇl4ÔØ3Õ•¨ÁÀ“$pMÌ÷“'ëøÞúÉe†ç-4^lÇQȘ³ƒ>˜¯ü¶» e1HL׉“ؼÇ(YÒubÁE”*7/‚tZCÓÒ`và¹rŸwVfé0Vzpéa1H $±{«0oÇö}%_?Hþà­Më$Ïriû6Ð)¼~¹m¡Ç!{ý òY;Œ½˜s-ûñØl‡ã½ÁNK‹ ³Q¡Â]C¹¡’–'f£‚Ã]…I×XörÕ­ÐóØìÊ=fl·ö‰Âdo»Í Žá9CŠiƒ½ì?ùsîæË!öîýr—í²A±çò‹mçK aP²Îpi‰éä$]ǧ1džK§Óœ«4÷qÑÑb«íé壷gíZW–òŸ¼9¬íUGk(åÖ'ec4á0XX‹/2Žo0J\“Y!™G¡u^ÛGRÃ`2a$¹)&Ó“˜r·Ãßò·×SG‹/c°Úxú>hÀd3¡Å´-en¥£ëfõí8êÛT4È䘟Ë=q>ºÕ†²Íñ*Ü”µ¾.Š ¯cÿLœo„é„oÍæKZùûL¢È¾NK/áë:ŽucÒÄ™^hDZî/øòÖë\­Y Ô`0a.r´)®æïF{-N†Åb+£¦¥žDhpõqÔˆ³ÓÎg'}ãŒûºK°W{hli¢6Û%1c%—ÎàL Í! :hq›·c[yûé꾜ç8ç4¬{.Éto/ó¤ó·«ðú³íF;¨ãÁ7ÛŒY;‰}»qxûã±¹.;ïŸ,xZ ”'}ºÃ|uÛ¾ŒµÝå3òíã¥÷‰åh»õŠí—ÏõRDìUÿɯ˜s7‘?ÞbN¨µ0vÚ.ë÷Qä¹ü‚ÛßÄ#ÃÖg &Cy·~æyú¡ -E ó6ÝÔ¸:“IÆ‘IJRÌæ0V{pX~™ÕˆSŸ&6ºJL]í*ZhËã çú>¤Ö¦€áÆ©Á‚k¼º“ÓóËØÚl(›ßu1åk‡å‰ÿ1w=•ûSle¤ç㨸2ûI£&4 Hælm¾ŸSƒ&®Þë̬»4bvÔÓÞ'ÔbAm£:ßñÒ¦ o–Ý–¥6ÕEÁéu¢ùgˆ˜Â$*q›7—š¿Ï”ÓõE$ö“q¥fmY&|³ßTÍézò£bÁjÝLaíTtܦmÔ84Fgf í ÞNš IDATÓfÇn×ðÏÌ€f§ÝnDOÄ18[¸úóvôÔ"áÉa{“Xïug™¥6Réq¢Î0¯DPm¬~–q»¾¸¹=UbêÆýæê§k & VëÆ€,CÞ²õD"wý6‡•oÛ¼ïáEÖSs êxî1«àØ·´e1çZ!v0Þë…:_Ý,Q¹ÇŒ|q‹;ì…Ú¾­‹é—ÏÿRxìUÿÙ®ìbÎÝ|9Dþü&º£Øvß.ÅžË/¶¹¯ÙÕD•:ŽfM×IEg¸ÑÕÅpk|mõl±1ü¡8šž"fpt½àÁLjÍãÅõã%2û¸ÏLæ X×5Ò0@KD™ñû™[ÖQ³¼É<‘^FÓ44-E<úÿµ~‚Æc´o™},¼¶¯§ÎrfI‘µº‰Êä8¾À"š®‘â›S¨÷Ú·½Ì¤8¼Ôgœb~1A*•"±8Ï„?@Òâ¦Ò´»ãµße)N/mßxg£+ëNùÚ²˜òôX€ jÇ[SÙlÎü³áö:! PYgcéÁ’676£{MæqE´ð0ï]öñ0®QÁ”3Q[e´{pêžTqzŸ~`&o+Êò3á:ÑÀ¡åâ®䓯ìô¶õ{z>Û{u.æî‹é¼cÖzÛÇþ4ÖÝŸ×O÷µ³zwÂä«[1eä3òí#»j,Î?d>¾GÀê¿Ùwa yÖýg» ?wóçÛÇ»]½Ÿ‡vy±íóŒoŠ›Î« |¾^N /CY9Õ-WéÎö¨ÍlM\èVö÷p"™Æ`©¢åbçêŒS hŒ6/WÏ%ôå„f¢²®•6ç"3e`vwpr¶ŸÁ³'H—•SÝÔÆùc£ yòiôb¾.Nø2Ê,TºZ¹~µÇv1åm‡<õĂ۩0Ø{ŠWîqÑUÏ…«*Ãwz9á[Æ`ª¤îüUZ+Œl{ƒ\ÅEÇõ ŒûǾ|5½V‡&®\oZ½1OœE}èo—ee«‹âÀë„".:9úO¾>C¡}Qga:ˆfï jÓD®âôट‰ùîÚ"Ú#‡¼}ðí×5V_”§fG=v ÆŽ(ŽÊYÀX·š´*uÝtDnàë:ÁM ¬¼š–«¹gj§¹ˆ‹†õíž7Ž:ƒô÷Ÿå­2 ÎúVÚ* î¾É¶-ÛhËW¿MçS1ma,â\ÜNžñÀHî1kCä}s¬EžkùêmßY½Š¹wÞº3Få3òÄ©èyÊÖ†o®»Å­6eÛ?pv*ÿ±Ý´íó>†@ÿÙ6†"ÎÝ|9Dþ÷õÍeóÇtíR^úöÛoc6ïì’ìwVj‘HÒD¥Ãœ¤Lõôi¿ÇÅl™­b“ÕÛšõsÛŽ}{³2f ñüóñ;Ëçó•æWëê,C½ý¢ “1wPo—+ĶtÔâ,c!¨.à¾Ø=³„x~ÈùøÝVš3¾è,† ²´l ÌâÄÓqŽ6W©µƒÅÓ#ƒœíÇr¬› k÷_ûLÆ,!žr>~Wù|¾RM|…B!D))Ù¥B!„¢ôHâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$Hâ+„B!J‚$¾B!„¢$ì"ñÕ]jæÔEôm¶Ô£C¼Ý|†‰øÎKÛèÐÛ477siæ|yµeèÔ)î,n×"{I#â¿Ä©æã\z˜ 2xœæw§¶|=ý³£¹ñ6gF·?Ø{Ò/ŠióÄïïe^ßôsq\¿{eì•Æšûu7^ìÒAœÿ»*ó»ÔÏ„boz…m^:Ï×`³<‹ÒÖÑ"L„Ò”W–±0$Q߀õ‡°ïô¡PœÊ+÷¸èRЬݜ×ì˜:®X¿Ï5éB!öËž&¾©ÈÃw&/-c(¯¦¥³“&‡úãÃAZÝ.l©=ïÍÓxÒÄôØ, I(¯éàâ¹zlFHÍû¹é I°×´àÑÆ ¸o1à1“xx‡Áû³,¨i0X¨òvÒÝæDÉ™&l¬£¯ÃÆÐ{Óã 4ÙÖÅ›§,=>ƒohŒà‚JÚd§®µ›ŽzÆœñ;™ï½Æ¬º —ϲ|õ6ÝέßÛ³-2ÁÐ æ––1X*©kí¦½Öš§Ì*¢ô2\†þ.ntD[|_ä4n—5Óœ¹§óÞEVÃL0õnsí#ôÙgéy/Bc«I„ʾ[´ƒÙÛÄCæ¸(¯öP¿\`‡)¸_¤˜Æ7&™Så1:ºOã¶&˜ÊÒæÅö ÷ñ.²~9ËÎ[¿"ʈæt–kénîu;Ym¦)Þ횥áÖžnöAñ]²wk|ú¯M£´ôqwäêUÆûýD³]Sç :èaä£vÌ!þˆ‰)>èbi`dd€v{832§2<ÄÔz»##ܺà&1y‡™œ×ôS„&"X¼ 8*jh°' Ö-ËÈW–a¸×GÜÝÍ­‘nŸs¾„/¢å‰ßDCßUêL&Ž]Ïžôæm£Ô ý×&H{®rwd„v;᛽Œ­]ÂÌZ¦Bý•>¼u}·¹èÞôÕÓùê¸5ÈýY…Æ‹h1-äl}qœÞ›sX[¯swd€ÓŽÆ#…f¾›ËÌÞ/ôyƒhê»ËÈÝë´gòGбnmó¢û ywQõÛ®ì\õÛÃ6ÔbcŒ«Ç¸p{„ÛÝhã×|˜Ú¾/¬?ÞJ(g=òƺWí¸Y®ñbÚ¿èýdeÉÒ·;§ÃLÄëè»7ÂG­ ÁáËøÕ&®Œp½E!<6žrÅ“¥ÿïÉ1°âr›ˆÐ-" ,£¤-$nqã&W\FìõNˆÌËT5 ´y©–¤WqÀö,ñ'ˆÙ[9Y[Y±áòvÓÝR…!mërŽqvÚ1’Η±Kgp&†fŠP´l¾"%„`_#ŠE!IÆ‘yKI1˜ÃXíÁ™e{C–ñ¶ÌjD‹©¤É¼-é*1uuFF ry\á\߇ÔÚÐ#Ü85˜=}‘@ ‰ýäG\©Y{ÛY&|³ßTÍéÌ[–Á¤`(ïàÖÏÆ—Ö^©±8ÿùÅBÚ-7-<Ì{—}<Œk`T0Y6¿ƒ>móbúÉîë·)Š” Æ¢ÊØö¸¥ÃøFCÄ5Td߸ŠÓûŸñŸäë ×㥼±îU;îÔÎÚ¿Èýl{Þ<í‹{uNo_¯§eîÝ1P¨¬³±ôàI››Ñˆ½&󸢇²}\F»§þ€áI§wíÃ¥™1!¾»1A!vjï>ÜfkâB·›¤¿‡oý„Þ hºØYÔ_ùF›—«çªˆûÎrâÄ{øãu´9Ë0”ÙÝÁI{„Á³'8Ñ3DÈÚÂùc&BƒClü|ŠÎÂtÍî¥jÓ•5ÅéÁI˜‰ùTÞ²PÜt^mÄ8Ýˉ·Þâ'×& ñ*Ýîm*c´àv*„zOq#Û b󵑹ž W›`ª—o Ë£êüUZs\Îßm{b­¡£ÑF¸ÿ,o½ÝÃXòm•eÙw”§=Œ-ô¯&qÿ2'Þ:KÈNû±òÕË©z‚ÀðM†gÛÞë9s]7ÎE|]'xëÄY®Êh¹ÚÃÈ–6ÏÛOrå?;­ßæ8wR6UÆvÇÍ`ª¡&=Aï©üäZƒ÷*çëÍùûBõX°å‰uÚq§vÚþEíÇ”§ý7Ÿÿ{tNç‡Meîá10;ê±¶; `vÔPØêV“ØmÇdÅÇi ]æ¢Á™;3c‚oFÝÕ˜ „;õÒ·ß~û³ù9Y{•Z$’4Qé0gfDLõôi¿ÇÅlwIø®”uPž‡:& …œt6ضßV승Á©!þ¼-­ý<ôQbt¢Cgéç·;;¼r%„{Ççó=__Y¬«³ õöˆj€N"4ÆdÜA½}ï‡ÌgYÖA9ø:¦˜jÔÔHÒ{о/ˆ’¢k¤g AõŽ—k !ÄÞ{¾f|ÑY 38diÙ@™Å‰§ãm®ýˆïY–uPJ¡ŽbMÞ_é âÒ#ƒœíÇr¬› §]r3!ÄsÁçó=o‰¯B!„{ï¹[ê „B!Ä~‘ÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIÄW!„B”I|…B!DIØŸÄwå+>ùé5F¿\Ùô •φþ„¡ÏÔ]í{r`€©¯7ï{í÷_rÿOþ„kΣ ¿xÌ÷®í®l!žKqFÏ4ÓܼõßÛƒQô|/MLñîñ^æõM?´u±èÑ!Þn>ÃD@#â¿Ä©æã\z˜ 2xœæw§H]€NäÆÛœïñ¶»·±¾ß}Zä½þ(zýT‹ê}—SÇ›in~›3=×ð?Œ¯ëÇYöóö. NÕ2›èóô67süÆCR£!té8ïN%Уkq !JÉ¡ƒ`¿¬|1ÉäçvÚ^?rСñLØ;nÑWcÚðœÁ `< xöŠÑæ¥ó| 6  '…âT^¹ÇE—‚fíæ¼fÇ´í^¾;6Ô÷»N_dÜŸäØFV3ùÜýT'ø€ß"ŽÆºO:(W4báiƆ»8;wžºk1g^ót?:jŽ=drê!_|ó˜C¦W©úQ3?~ÝÄ!ñå/&™úìKÔ8òê447pÔ¤òÙýQÂý›ù4ÌWVà‰×Þl¤ùGv?ú%ú§_ðFía>›ýœoV^æõ†FªÍ25û%*&Ž6œä«Vî•oÂLMþ‚Ï¿zÄÊ‘W¨úQ3 U/¿¸Qˆç—¡ EQ¶>åÌ¥8÷.â4$˜z·‹¹öúlÙv¤:˵t7÷º«‰sbŠw»fi¸5€ÇºuûDhŒa€HÒ@y•‡Kˆ)å"?«ŸÉ]¶ËHâáïϲ ¦Á`¡ÊÛIw›“ µÐÒê¶ý —éä2ôwq£û#Úâ£ø"§q»VƒÒã3ø†Æ.¨¤MvêZ»é¨·aD'ñП)Ë@yµ‡úå\ ™[-2ÁÐ æ––1X*©kí¦½ÖŠ1 ç½žF…©ñ Kérj::©SÇñ‡Ib¡º£‹õ«±æ¬û“úº°¥ô¼7OãIÓc³,$¡¼¦ƒ‹çê±mÎÕ¶Ù6gyEÆ»·ÒÂã„,^ZÖç¹úi*È/ŠãÜ-úêŸv2³§g¥‰ž÷|øê\\tmނ⨥ýª‚zæüÁꃅ:¯Ðð0WÙšûšq{MôLFhêv‘%"!Ä èàÖø> óñèCVÞh£çý÷yçǯðå'÷ùÅ×+¬|9Å'¿„Ú“=¼ßsŠºCa&?±‚‰7O¶QuäoœÊ‘ôf¼\Õ@ãk_1ùIxÓ’àÑçLN~Α¢çý÷éü㣨§¯­‚xô%¿©âdÏû¼ó£Ã|>yOÕrêý÷9Uw˜/1ËW+Àã“÷§øæh3ï¿ÏùF;_MÞc*öxŸMˆgÁˆ½Þ ‘b™ëÀ‰P€¤ÍKõ–¤ˆOs­?ˆ©å:wG8í\Àÿ`‰ôvŤ2<ÄÔz»##ܺà&1y‡™œëÌÔ_éÃk1Q×w›‹îM™Œa¸×GÜÝÍ­‘nŸs¾„/¢¡/ŽÓ{skk&FÇã‘ì™oÞmS3ô_› í¹ÊÝ‘Úí„oö2¶˜i(5ÌD¼Ž¾{#|Ôª¾Œ_mâúÈ×[ÂcãDõ"ë®Î1tÐ10ÂÈGí˜C>ü‘èsm»]y…Ƨ·Òˆ°Ö8 J*S‘ ¦:Zk¶v2cEmÎ4á@,÷Òʼn×UF<c-[}UQ†oÎlZòyIe¦H`µnBˆ’°“+|9z?Éò›—õ‹‡ÄLuœóUŽGŽþˆ†×ÂL~ö5u¯ÃÊÊc?^#¯òF[¯¯*2XGymè> Û9Yuøé¯Ž¼Fã;ïpäe‡€CGL>ôõñ ½B]Ýk9G޾ÎË¿€º:{æñkyø «yï,_z“wj3—Z_ûUaF?ûš»]f}Å3þ ÍÃëž0ÕÐw»çöe¬ôàÒ Ät•P ‰½©Š­Œu§¦I:;ø°¾07uÐ2ÓE`»BÌ.Î `²Y1F“ŰLRÓÙÉô›'dð2ÐäÄ àj¥³n†kS Ô+³¨Î:¶Q'6{ÛÄÜK ·˜³»ŽªY†§c´¶;--.ÌF0»k(ƒ–gæq¦‰øêùê¾eÝF9ž¶z* ¢šcv?ÓZ²Î±æØv»ò Œ;wÇÐÎéq‚±2*+6Ì\ýÔSÁT%못B:š"ga‹bQHÇUô'ÛXqwtRÕ5ÈÍ'}õ›:–bÃaˆŠë¸d¹ƒ%as³CØß¡qì¬Êg÷ïó%+<þæ1‡L/sdÝöG^>Âã¯sèµFN6Ì2;5Ä/ÔC¼rô jëjyý•"Ã=r”ÆÆ×¸ùÉ$¿´7³~ÅÃãØ,SŸ|Å7+päÈaÔxu],‡7µþñÓú±úˆõ!C×>{Ò+++²?f…xµx.•·^çêúµ“ÓNßË•x\:ƒ314S„€ê eó k†šÔPì Ož±`7²n»™Ç7%®ƒÉ¬Lƒc‡!k‰éä$]ǧŸÄ’N§18—ù»tá1jj®mÓhñe VÛºÔË€ÉfB‹iO+Ú܈òdG“®‚ënP°=)p›šgÛüåwî6ÖØ’ЧU’šgÙÆsõSͦÀlUó–j¦QãeV3ùz––Ô0˜Lã0»éì¬âÌà0çùi³Ñ„MÑÉgž…(ûš›:bÂdÚXÄêÃC~ù0+_~Ã#^Ë D+8üAu´áÊ1 «˜ h±$i*2 ‡J<•c¡Ãº²µÐ —ÇÎõ}H­M=ÂSƒÛÇŸƒÁ¤`(ïàÖÏ<<¹X®¥H¡U ŽQ±äÚÖ€b+#=GÅ•)#šÐ0X Yp¬ÅÕ݈¡°¿#rn»Wm»ÍOÒçê§FgvuœñpãÓe,Z„‰‰Uî$ca®>;Frt^-Âôü2¶6 o‰¡¸;évŸ¡pš–m×à!^d¶Æ×t´–WÕY¦~ù5W£~ñ ¦¾8LÕ›¯°òå$zoŠÏ¿y ‡sÄ´9\áqÁËhóZC3G¿yÈ/2·@[YyÌ ‡8t«_þôS¾x¼Â£G9n‘–Ñ×jyíÑ,Ÿ†¿æñÊ ¾ óñГ²ÆW¹·µV7Q™ÇXDÓ5¡Q|s õ^{QwÏØëº?«òr·q–5¾E'žóC„›X=œkµ2×ÿ7&BDã RªF"t“÷.¯îä¤s]/L/£iš–"}ˆÿZ?Aã1Ú³¬WG7îø$c±uuÖUâš‚åEº-ˆ"¯ƒ»¤Š?n{ÄäÔ}~:õ˜CG^¥ª¹½rˆC/7Óû˜©¡Ÿò pøå£Ôµ5ðê!Gí‡ùäþ·õðǯP…ïÑÐü:_Ž~¾ZôÑ~þ˜Onþ”•Ã/s´öG4¿ñ &?™$öÎk…×áðQÛT¦¦îóÓÉÇpøeŽÖµÑ|Tæ{ÅsÄZCGcþþ³¼UfÁYßJ[å"Áí^§8ð8 ÌE\48sÏçíôK3xÿ=NÜ,ÃRå¡É]]?›§l³»ƒ“³ý ž=Aº¬œê¦6ÎexpˆÈ‡;X™¬¸é¼šÀçëåÄð2”•SÝr•n·‚‘úÎk ޿̉›`©òÒ~,ÁD¶úTäÙÖ\Ï…«*Ãwz9á[Æ`ª¤îüUZ+ŒdýôTyë>àÚ~EÚ³òò´ñF5öe&5°2l¤¢i€»Ž)îŽÒ?¾„š†²ò*Ž5*,üŒÍ;éÌ„óuq—yi™…JW+ׯ6àP ë'àÝ5̰®çkq¢i;-[n‘!„xQ½ôí·ßþÆl.àò¨¢Ä¬ÞÖ¬Ÿ Üît1£©¹qŠ!Û‡ü¼-ëýÒD‰ÐB7è™ñ0pq÷· ÓQ⊃Š=¼ï˜ºFOÐË€ÜÎLˆ’àóùä+‹…Yè©ÅYÆBP]äe|!Ö(U-¸“ÓÌ1ž‹Ñº·I/¤M«Ô4æZÆ#„xIâ+„ØB_ðñÞ{£è5çh‘Û<‰2VÐÒnáÁäó÷ÕÀztœY{‡ôo!JŒ,uB!„/û8~ÿ(Î’}49B}uÆP€ qßq®ŽfR¾ÿGö—áÐ21'ôÞ€¢=i܇ÏÄßÂĉ·v….'Þ=©Î±C8È¥î!ÌüZaY:“½\1Ÿ®ç×¾ áI†æ½ìi<Âþ;£þvúÂEì;r„}>;“W™2_´÷•kY¹'…{jñ:äï[!ô.q{˩ȚÂß$¼Ì¼'žëUö áï 0ŸSIý‘#¬ð0åo'оà¤Èš2†étPqøUŽk´¶ãª9Ég]]œ;TÀ¬ÿSfïï{‹ÃÙÔ5uÑõG{I¹ÖFÇXŒØÍ6šûa÷ñÏèúì$U¶AZ:ƈ‘Bñ³+Õ…ïøy8`a€3'./=Êg]]4íõ<{Œ‹·cO×óÏ-`¹<íãx{Tã`¸õc:ŒÝœìêâd•ƒàÅ&bO6•Fùñ£ø\.Þ>¹zŸ9îJV<ÎÅöÓ÷ˆ‘‰kÌw†'X"¡a¦S (°ŽÑz¬é‚Îuuqþƒ\&Z?¢m,òt¿¶AΜ¸‚£ê8ŸuãP±AÏ™ŽÅþ†V¼6+Ï?yÆø""òÀ:Ý sQX^Fž{ñ×û÷ãt»°§ »%Š5Y\¨ê&¿ÄKºHÏ!?½‘¨ v0Í(Ѩ ÎLòkÉ3-Ë6dŒrù8X˜‰pæ”PžÄ?2CIÉõ„§À’ŽÏ—…ÓΜ<ÜWÁçó,mgášgåÜk2Ù}‚O–yÅýŒZ|y«ï)ÑÜæ”WÕÒKoÐÃï#K=œY‰çz•}GCƒŒ[ Ù_äY\«UB…7H÷È ¦Ç£»¾¯TvÕí¥( ššpe,Þµ¹RqXï2‰±x1·PZ[ÌV°uo{:¸‰ƒâñ‘H²³)ýa;;ãÖeï(Î^¿ÌXjç˳IR j©óÒz%DMÍõ,Ü«‡ªªí¤Ø ¥`'[.BUUîÒ¶×åiâ«è2á¸õÙ+ÞýLtÜ¿+õâè&óÂð»Þ&60ÌX ߯á­aó­‹\³î¢iwîâZêí5Ôû8«{¼ßéËgyj8T´uq¬] 48&°Æ”í+_VžÿÈXÏÊãçæê®¯ˆÈ#Ö'£Xœ¸ù>$Ð;ż N§ÄÌûÚÙ÷a¹–¬ ö”2háªa!='Ÿ"_yO}ñË$:Åâr?ò…/ N·“èLtÙzÀ²´Tc¹íg­¶à©ØO…ç‰/·uv2ùŒZVßÓ38s¨¨Èâl¯ŸžJm-á\¯²ï¨Æ4†h91òàŠ˜¦‰ÅÅdÝþ4%+±ºÈxdeNd¬‡¶æ ¦càJq0‡ìû:Ù÷ad²m¯çx]=m¸8gų£”ŠªÝ=õ¥²‘é»XÓ2ù«W†‹H(²l=–h< ‡õþ¯W»fxã¾Àq6O¹´p-‚ÐfvV3{­yq{ÂFn½‡øíâs~|ï ÷ËŽÇãXs#‹ýA¿1"¡Ö´Œ‡]ÙÒ((}¸Œc¥k“hþ#³‰ÇWðyh2ŠËÒÈÑñ^ÚíTìÙGžÛfˆKM½Ëîû(Ó0°x|Ô,à Ï09ä§·ÓÀÕXùH[<Þî¶cNÎ&k釛I؈bqÙì³Ü/ÜÓ…Ëõø 7ײúžžÍžSAeÎY.õŽà[º=ýì¹^mv,îrêëó†…h˜0εÿ⢼Ö¥D¹ÖÌÇ=>8þcŠ2ãô¾æe÷}TlvknGº—ØÂm‚þVšÍ‘ÖÞð04/ïÈØLüæ4Û—ž&ǘ`Mus+Žñu{L<î gË`gv„îˆgSŸáÁã‰Ð10{=6¬ ¬[ê8÷“Ò‡Oψ,°@ ŽXÿ#ýÚp¤:ˆÍçþènö_Ƕ£Ï­•¯M¢ùOu%ÿåN²ˆÈoÝŸãkšQÌ¥à5¦öõ15 ‡/¢Nú¹Ð`t> ;N×ʑ˕SD¦1HàÆ Q3Š1~•À¸oaú+Oþ‰j1ŸÙ“ItÕËhíd•W’3?ô`-ó‹Îõ“œYEd…é Î5MÂSA.µ´à×ß×^,!Ž›"³ ttpýn ÃH¼˜ låÃÛšŽ€Í+A˜LÛ±›ms=´õß&‹0{­›¶ëŠwyÖàîcŒ»w¿Þ¸‰s°Í—ÁÏ?g.£€ › ÏÎ¥í­>²²}7^£‡ŽÛDb1&8}à­Ë¬±Í(.%#t‘ŽkÓDb Lô·ÒÜ}“˜-ñµI4ÿÏ3¾ˆH²[÷O¥9å”/Ñ{ö¦ÝMNQ •ùWñ÷ú íÏZù8o%å¡KZNÑ ØÝ9øjËÉ´ÀS p^ªkÃøœ D±83ñVÖR’náéo€­±µXÜ zÂEŽÇNog—j©ÎZÅ¥³gQ^™Çd÷èâÐ/8×OŸ7‡ŠZƒ@ “Sþ(ØÝäøj©|UÏK––RPÇžÁ34¿ÿñÍ[ر»–ƒowÓÚÜÂXÓö•ó5P7vš¶ïpؼeUGëȶO~w,¥˜CG Z?=Æ;mw±º¶á;x”š­6Xx‰ÍØR)ÈuÐ|l§ØÎáí ÆM$Q½@Jv1nÁNÀ‘½“-ÜÂæË]¼£ê( þè,mmÇx§õ.lÞÂŽª£48žî7c7‡ Z;yg.Ž5ÕKÕáz¶;€צô|‚ù·%_DDó/¾øâW)))ë]‡ˆˆˆˆÈšikk[ÿ¥"""""¯‚‚¯ˆˆˆˆ$_I ¾""""’|EDDD$)(øŠˆˆˆHRP𑤠à+""""IaÝÿæ6YôÕW_ǹwï_~ùåz—#""ŒÍfÃáHî¿ÕQÁWä5ñÖ[o±iÓ&6mÚ´Þ¥ˆˆˆlHZê """"IAÁWDDDD’‚‚¯ˆˆˆˆ$_I ¾""""’|EDDD$)(øŠˆˆˆHRP𑤠à+""""IAÁWDDDD’‚‚¯ˆˆˆˆ$_I ¾""""’|EDDD$)(øŠˆˆˆHRP𑤠à+""""IAÁWDDDD’‚‚¯ˆˆˆˆ$_I k|£Œ·BS`óëœÆœÂßÔD`fg1Fh9ÑɤùįŸãü攟SŸœehþ뽌pˆ¡Þ 4ø„O>ù„M¸44Iø%#Éjšî÷*©¬|äŸï¿ÇGÍ&"¯`øÙ?øÞ1nÆ^æIcŒþ>ïuO/óZ„±ŽØ÷½ïqìÚ«hpíÄ&ZØ÷^·_êܽ±‰¾_ù——»/°ŸˆÈëÀ²Þ¼N,îB**óp»^æYçêîdÈYFu½—L'„§Féë½Dgt?ûKܺòRxêÎq|§ ˆaLÑßÑÊÇÓoz—\ÇzW÷Åf¹vmšm‡Ú9¼}#5öz±eì¢þàN2R_Î~""¯ƒW“¹Â7¸pa’¢2'#WƒLàÎ+§ºÂ‹ÛfòªŸÀÈ$† ÎÌ|Ê+ËÉqŒtv G¡ý,ÑÚƒTz,£zû‚L…M°¸È*¬ ²Äƒ=ÁðËã"øäùÝS úG)9’…ˆ††ð†Ÿbqeâ-©¤,Ï…%a?Oö>Ã茓¼ýùx\‹/º<ùTTÌà7ˆâÆ™h¬ù«œmŸ§¢±À`¤¥…ñ²#ìIráBˆ¢ C}!2÷Ô㋎à 19ÅâÎÁWQAQæâì˜óAþ«ŒN…1éxK*)÷*xoÖÍ8À#»ˆ½GïýˆŽá*šJSˆŒ]¦åÓË\¿skê6|5 ì-‚þ`°ü¡¾:c(@ÐH4îJÇ,sþÇŽ r©{3¿–Æ#GØ_–Îdo'Wï/»X¡Ÿ§8ÓÉKôûˆ.þ¶=«œêò,œ«+ἎÒ´ST]ÏäR÷vßÔSí 3x©)ˆ†ðw˜Ï©¤þÈVx˜ò·EŸ=†¼™¹ìÚ¾™ék!" œ9q™xéQ>ëê¢i¯‡àÙc\¼íb{‹éá[D€ÈÄ5æ€;Ã,‘Ð0Ó©|0®sq8›º¦.ºþh/)×Úè{â3úljÁ­­Ã¸jNòYWç0ëÿ”YˆÝîáØÙë¤Õœä³®&Þ;EÏØrÉ7…âgWª ßñó.XŠEÆ0ƒ*¢Ê1¼r FËÓ>Ž·wñG5†[?¦ÃØÍÉ®.NV9^ìab…¥‘ÐEzŒ·9t¾‹ó‡ ˆôœ yh!aoÌösæÄUÇù¬ë‡Š zÎt<>F|šþ}Du/'CoâsøÑ™aRkšèêjb¯g˜ŽàÒ|EÆh=ÖÆtA纺8ÿA.­Ñ6!v³æ~Ø}ü3º>;I•m–Ž1ž¹Òb5=Ü·Òû$Q͉z}žZ½ÿ¾æµ‘á~¹ÍM~‰—t»{zùé.­­5£‹¿vf’_ÛÈÁŠÌåïB:³¨Ø¿ŸJo:N»§Ó…Ýň&ˆ/r `Œrù(/ÌÄi·ãÎ)¡<+ÌèÈýuË+÷ódßEûÙSèd憟ö¦O8u¶K}A¦¢«+…åeäyÒ‰Ž1“^BY^:N»›¬ÂJ*}YXLˆ†·RQäÁe·ãÊ*¡Â ã«CÞTŽTqÃàÎõËŒ¥VQWžMŠÃAFA-u^ƒá+!¾]àÅq{˜P,FhxŽŒ]o³ez˜;±¡áÛ8¼¤Z¶PZ[ÌV‡ ÇÖ¼íH$þØx³ Ɖ¥l烦&Š·’âpàr¥â°Þe.&te#·Žºâ­¤8ÒÈÝ]GÕ–çé4•]u{)ÊÝJ<˜ «‡ªªí¤Øl-ØÉë6ªªrI±9È.ðâŠEˆ¯4Œ5—½uElMq–[Ký.A…{‹1=|™§†=E[Iqd°}W U^¬÷‰OsåÌG´MäÒÐPLšmé÷³ÿ ÓÙ{Ø[”ÑFî®:|KK´"c=\³î¢~w.iiÛk¨÷ÁµÀbÿñxdñº¥dSúÃv~Z¿ ÛÓ>æ™=ççÀ÷®N£ã½´کس<·Ì—šzŽú"Ç€»ÛŽ99O˜¬¥ÿ‰š„(—ýÁ>ËõóÔø“—hêuRÛX±´Fׂ3ÓKYù<ã-ãL…KÈzæX0ÃÌ<ö8ˆûuX°»ì˜!“ûwÌÃLÞÇ’“ÛiÇâ.§¾>ÿá…h˜0΄ë£å ãÊÍ»dÔþ6n6¿9ÁöÅщcÌF°¦:À–ÁÎìÝϦ>ÃÇ¡c`"özlKáÆ†5aµáÈXyœÈµf>îqðÁñS”á€Ø§÷5‹w¦#¡9âl]ŠJÓ Ïsïí~m‰k€¹ç8çÓâÆ4FœyΘž%îØ +öf[¼ë>6Kœì¥Ã¸ÙÛŽR¶6×Ûjx—Œ Á{Ím §8„óµ9ÍF$d𠔘AÈXœ/«ËuKç~Rʃժ‘HÁ:{knGº—ØÂm‚þVšÍ‘ÖÞ@öŠÙ7q¹Ëì¿Üû$Q͉z}žZR×ðÚ‹ÈÆ°îÏñNú¹Ð`t> ;מIt鯧iF1—‚^Ô˜"Ø×ÇxÔ$^ùÃúgóðürå‘i ¸1CÔŒbŒ_%0nÇ[˜þ\Z°g’g ÒÛ;ÂäŒA8Ƙ™d¨ï†+‡Lç3Ʋ¸°G§N˜D™ºq•ñ–i¸½ù¸g®Ò7>OÔ 3uÃOïÕIL 8³ŠÈ Òœ!jš„§‚\jiÁ¯5¾Gü.‘H„Hdé‰!:NœaØö6{w¦‘¶c7Ûæzhë¿M$aöZ7m×ïò`ÃÁ6_w>ÿœ¹Œ2l6<;—¶·úxò;X‰$‡X„8VlVˆÌN0ÐÑÁõ»1 ãxJ}¸ÆÚhºM$¶Àíþ6zî¼Ø4$îõkŠië¾Æt$ÂÂØeÚz rwí`óнÅÉ(.%#t‘ŽkÓDb Lô·ÒÜ}“Øýb¬6¬€£ Ž½Ù´µ ±ÄÌWFé.R':è¸6»tÎN–¾ë²}7^£‡ŽÛDb1&8}à­c"ÁV>ü¸¡éظR½¸nßâæôÓˆ{fÏdKXóʽƟª+Q-kzíEdCX÷O¸ÞJÊC—´œ¢°»sðÕ–“ip‘ã±ÓÛÙÄ¥ÚFªsÊ) ^¢÷ì)L»›œ¢*ó¯âïõÚçYþü‰Ži,üüéFum “S(g&ÞÊZJÒ-<×xíY”ï«f°o{a°»ÈÌ*¢v_é–gŒEåE£\ºt–vo %™3Œ.7–»ˆêÊ0þ¾ œ2L,®,|ÕdÙr¨¨5:9å‚ÝMޝ–ÊÝïÝ(Bmx§mics*Û¶×pòhùbpusè¨Aë§Çx§í.V×6|R³ôwJv1nÁNÀ‘½“-ÜÂæ[þ[õ+JYy[F{ÏÐüþ;Ä7oaÇîZ¾ÝMks ¥í ?¡¹ócÞ9 ©Þ]ì}{–Ë/2 j`áENøÕµ“ñËÛwƒT¼»ŽòAq )±•{k?Ì¡ƒÖŽFÞ™‹cMõRu¸žíŽ'W ¤PüA WÞo£óæv Ï×Ñfin{Ÿw".¶ùj¨Í½ÍÀfÀQ@ýÑYÚÚŽñNë]ؼ…UGi(pàˆ5P7vš¶ïpؼeUGëïöÆféo=KÐwŽsµŽÇƒbÆî{xö7ãÙ2v­XsJ‚^ÇÎW1ôh]‰jIô>ÿš×^D6†o|ñÅ¿JIIYï:DD^k±±ÓìkÉàÇ?­}ên¯ÜÂmÆæ\lËNY ¨³ÛÛÎáÜ×ôÞæ›X³ˆl(mmmë¿ÔADDžO̤åØú'"@ŒÙkñOgSìy}ä›X³ˆl<ë¾ÔADDžmk ‡ö¶Ò|â:ïZÙœšKé¡(xLð&Ö,"–:ˆˆˆˆÈ†§¥""""’4|EDDD$)(øŠˆˆˆHRP𑤠§:ˆ¼&¾úê+âñ8÷îÝãË/¿\ïrDDdƒ±Ùl8Éý(_‘×Ä[o½Å¦M›Ø´iÓz—"""²!i©ƒˆˆˆˆ$_I ¾""""’|EDDD$)(øŠˆˆˆHRP𑤠à+""""IAÁWDDDD’‚‚¯ˆˆˆˆ$_I ¾""""’|EDDD$)(øŠˆˆˆHRP𑤠à+""""IAÁWDDDD’‚‚¯ˆˆˆˆ$_I ¾""""’|EDDD$)¬]ð ‡ê½@Ó‰Oøä“O8ÑtKC“„×lÀ¯kž«gk}øÏ šÚýçÍgnNáoj"0³´oøNt2¹ŠCEVm¡ŸÆïãfl™×b´ìÛǧ·cËo¿d±ÛÝë˜ ¶ÂöKk¢…}ïu°F­|-±‰¾_ù—§_Î~o¢ç¹ö/>1ÆNŸ÷º_Í®åûYDÖemN;ÏPw'CÎ2ªë½d:!<5J_ï%:£ûÙ_â^«¿6wY=û¼NÀ$:âÆU?þn;éõe¤¿®E‹¼r1¦‡oáñUa[v;yØ2vQp'©/g¿7Ïó]û7c’÷ý,²Ñ­M” Ï0:ã$o>×â.O>3øÇ ¢¸qÑÐþÀãóQ,®L¼%•”å¹°Ì_ålû<Õx,#--Œ—aOz B•Xê ‘¹§_t`ˆÉù(w¾Š Š2í˜óAþ«ŒN…1éxK*)÷®¼-;vûâ±öÌ<|%ãÜh1…t'£zû‚L…M°¸È*¬ ²ÄE°³›`8 íg‰Ö¤Ò `2ôsup”™0¸óÊ©®ðâV€–¯%Æô` {† °eg‡?Èåæ± wáã÷¹{ô8ÛºÝ>Ï4ó~G65¹Azúǘ³nÁ»û]vçâ`›Ý­´] 2×¶·©kx—‚4 v›Oßÿ ïçj3ƒ@lšÁ[|UK±à‘íØØéãÀìЧ4wrˈƒ5ï®zj_[»Lë§— Þ¹‹u˪êëÙíx¢ýi?úÿ潜<\LÚ³Îy³ƒ³mýŒÍYñ쬢4ÒCÁ9šJSˆMÐÖr‘á[q—_MuÅØÍÇS—ã=­ÃÔl'#Qî·ÐOã‡7©ØãâÊÅAnÍÝ¿ŽÅdØל¨×'%šÏÈØeZ>½Ìõ;w±¦nÃWÓÀÞ¢4l ý4~xÒ žaîÄ·°³®ŸÑC[O9RÙQwú à IDATœÃÅiO\{ƒÀ0X~ž¦Ò˜½ÌÞ¿{Îó“ò4˜í§ñý;\Îðªæ!ÆìPÇR¯V¶ì(¥øîÃÞ–¯úWSÃùãxú\ß'ßß"²a¬ÍRg:yéa‚~?C£SÑÅß¶g•S]ž… äR÷f~-Gް¿,ÉÞN®Î¬bm@x”¾ ¢êj|– —ºG°ûöÐx¤žjo˜ÁK}L™@4„¿3À|N%õGŽp°ÂÔ¿@(ºª6Ìð£#!¢ötÜöÅqýþQœ%ûhë:Ç¡bƒž3L<úYs|šþ}Du/'CoâsøÑ™aRkšèêjb¯g˜ŽàRzŠŒÑz¬é‚Îuuqþƒ\&Z?¢m,’x>YM÷×¹8œM]ÓÃëØ1K\s¢^Ÿ§–…Μ¸L¼ô(ŸuuÑ´×Cðì1.Þ_Kb¹<íãx{Tã`¸õc:ŒÝœìêâd•ƒàÅž==¼öil/p1=|‹™¸Æpgx‚ f:µ€‚o¯nb·{8vö:i5'ù¬«‰w³oÑ3vVªßµª¶ÿmâëûäûYD6Ž5º÷è¦h#žà#7üŒøç1™xrò)òyÉ´ƒ1>DÈåã`a&NÀ™SByVÿÈ %EÏ:¿‹Âò2òÜ0?t‰™ôªóÒqY…•TÚ§°˜ 2n)d‘@V Þ Ý#3˜ϲÍÏšø$ðÈoØ3)ª.#Ó8³¨Ø¿§Û…°8]Ø-QŒ¨Ébš_fʼ‹¡9=¯»a“5›vI[ؽ·˜ °u¾Œúâ«;ÔšËÞº"¶:€”Zêw sÀĨx¾W44H wŠyœN;† ™+Öi_ ½"/“Õ±z_äP—‡TëÃmWvÖáiâÛë9^×COÛ.ÎYñì(¥¢j7E[—ùÑ 1pÇKùÃÛ½o'ç.ë¡­y‚é¸RÌÅ!›‘PkZÆÃìmi”.~öbFà¶·ñZ?çâÀ4ÛË3œ?²Â9éŽ-i<(Åæ"Ûe] ¾³ ÄçüøÞ•¯Çãq¬¹¾ñ<óñpböðÔíb«ƒ ׃œ#QÍ+÷ú<µÄ¸=}kZ†ÇŠ+ÃE$y°íx¬UŽ=òæ{âÚÛO-©›‰ßœÆ`ûRïqŒÙÖT0·RƒOyêÚÛ<ìÌŽÐ=0ñlê3p€Ö±‘UÏÇãžÙÃ3ÙÖ¼r¯ñ§êJTKÚŽÝl›ë¡­ÿ6‘X„ÙkÝ´]wP¼Ëóï/wílóepçóÏ™Ë( Ãfósi{«'¿§˜h<¥>\cm´ Ý&[àv=w_M\ÿ³kXùú®ð~‘ cmîGÚ³(ßWÍ`ß þö>Â&`w‘™UDí¾¢ÅÇ‚9½T׆ñ:9ˆbqfâ­¬¥$ÝäQ^4Ê¥Kg9awáñ–P’9Ãèrc¹‹¨® ãï»À)ÃÄâÊÂW]A– ‡ŠZƒ@ “Sþ(ØÝäøj©Ìy±õΜrÊ‚—è={ Óî&§¨„Êü«ø{ý„ËÉñØéílâRm#Õé/:y"/È–JA®ƒæcû8ýÃvo|»ÁV×NvÆ/slß Rñî:ÊÅ)¤Ä¨;MÛw8 lÞ²ƒª£u‹w7c³ô·ž]|ªC•Á€±ƒª‡·{ß^²ò8uìïD\lóÕP›{›Í€£€ú£³´µãÖ»°y ;ªŽÒPàÀ±Úù¨u<3v¯ØÃjkËØµbÍ) z;_ÅУu%ªÅQÌ¡£­Ÿã¶»X]Ûðù„ö`xm‡0§ð75˜1—}Ù¸qOšüL=ùrx”Χè -Üó—áçÔ'gšÿÚ'ÂßÞÇ íH’ŠL8ýƒïSYYIå÷ÀéËcDVÚ9v›þæFö}¯’Êï½Ç‰î•÷]¸ÖÁ±÷¾Gee%ßÛ÷ŸÍ[£DDDÖÃÚßhˆ¡qw¦©¡QŒ5ìÙ\9…d†Çy"ù†C#LYr(Ì´¼”q,îB**ËÉq½ø9¢“~ÚÛLÎŒão¿€2úRj“7\ä&-'.2Wp˜Ïþøùìp)w{Npf`a™øÑ1zØÅÏÆù£»ˆ÷Ÿ¦åæ2Ñwa€3Íl®j¢ë»hÚ“Æõ³'èŸ]óŽDDD^™—“ôV 0iñ²§Üÿ£󅹾žì£7pƒa!=ÏG~t9õìÏwbÎ ø¯2:Æt¦ã-©¤ÜëÆ¾Á… “•9¹dÊw^9Õ&;» †£Ð~–híA*=O´çÌ¡(+@ïHˆ¨' ûbLŽÌ`Ï+'ÝÂ3Æ QTba¨/Dæž=䌌Lb˜àÌ̧ü~Ø5§ôRr$ 7 á 1>ÅâÊÄ[RIYž+A/^ÜYTtE±{+©È²¯å¥’7D,ÔOŽVå’brKÙãóóñ`ˆHq ŽGwžäòílê~ZÌVRÎϱ9ž:oäÖ !W1'wfà°£ ‚®¹>£<ÍöŠºY[kxÇ7ÌøPWa!™éy¦ܸ1Ã{­ÆÝ—Fq•ìçÈ‘ý”¥Òwÿ®f4„¿3À|N%õGŽp°ÂÔ¿@héõð8WG3)ß„#ûËpŽè 9)ÜS‹×é$ß2¡;žÂ,,“#Ü?áqFfœx Ó±zo@ÑžFŽ4îÃg âï ñÔª„pKÝC˜ùµ49Âþ²t&{;¹zý²½˜@˜y3ê}ÕxÍy^ÁByضÕqþ\¹÷³hlޱ[\ÛÒx2ÎF¦ƒÌÙL´--uøþ838Ç2¹GÁqþןîe« b ÓL\ëg,’ÁŽ …^Ù8Ö.øãŒÌ¸)ÌsNrŠ2 Þx°^uþÆó™e”å¹±Û]x Ëñ:_‹†·RQäÁe·ãÊ*¡Â ã#÷ƒ³›ü/év öôòÓ!]ÝBX»§ˆ{ˆ‘ÉðR™7˜wåãu¯f\…åeäyÒq~L3º8®3“üÚFVd>u Ý"äòQ^˜‰ÓnÇSByV˜Ñgöâ$«0Ÿtg:Þ¢œ_çZÈÆaK!%e1¹Æ¦‡èø¸‘ÎX)õ»3žÚ5b,7† ¦Öp²ýùìh)ñžœZnYÄ’ÙÿþŸýGM¥ikÕˆˆˆÈ«·fKæGG˜1ç ´œ À41™gdªŒJ„ç£ØÝ®‡Xœd:-LQ#Œi ÑrbäÁë¦ibñDâŎûA|Î,éæÙi™$œãaüÆ<îÂ<Ü€ñÌqƵdU°§|Á@ W é9ùùŠÈK´“è|‹ËýHpµàt;‰Î,ÝEþ:½HrŠM3ÔÑBÛ`„ܪCœßµåV#X­6Øì£®jéõìRjvöðñç·ˆ2–ÝmÇœœ'LÖÒ9MÂF‹Ëþ`ŸïE’Ï,ý?úˆnvs¸}7¹Ë¦×EŽ´ 6'þÄï[±>}ÖþfÚfwq¨62r}”çvsúæ±Ò4´àADD6‚5Yê`ÎÜ`4œNa^:N§sé79…˜!µàÎ/Ä5ÕG߸AÔ 3u£ûO»'—š ““WHm…Aoà,§¢N2½%”xfÚ{µ@'§üQ°»ÉñÕR™c'á·¼,.r²¯#·Ž£5-´œ~Ÿ‹wÁêòPPsœº¢”uêTDDäåûÆ_|ñ«””uøáž!d8ÉÌt.¥oƒ‘ •5R½ìDDDDD^L[[Ûúý•Åf8ˆ¿ó7¦¢€‰1~•¡ùL¼é ½""""òò­[Ê´¤—P]æ§·û}Q v—‡üê rô÷4ˆˆˆˆÈXÇÛ«Òó+©Ï¯\¿DDDD$i¬ÛR‘WIÁWDDDD’‚‚¯ˆˆˆˆ$_I ¾""""’ôÐ\‘×ÄW_}E<çÞ½{|ùå—ë]Žˆˆl06› ‡Ã±Þe¬+_‘×Ä[o½Å¦M›Ø´iÓz—"""²!i©ƒˆˆˆˆ$_I ¾""""’^xïØË,CdcÚb{|[ÿ݈ˆÈëêÉŸY‘îøŠˆˆˆHRP𑤠à+""""IAÏñyMd´®w ""²ÁMïó­w ëJÁWä5ò«÷}ë]‚ˆˆlPß8?¸Þ%¬;-u‘¤ à+""""IAKDDDDÖÁÙŸMÑõ_f·_êy½n'{rÒ9ðû™/õ¼‚¯ˆˆˆÈ+vögStŽÿ=ð¼nçK=wp>Ìž?ûk~õ+8ø]…ßGi©ƒˆˆˆÈ+¶V¡ïøvþÁwèÿû—~î7‚¯ˆˆˆÈ+ö³_DÖ$ôÞçu;ùÙ/"kvþ7•‚¯ˆˆˆˆ$_I úr›ˆˆˆÈk,ºp‡ƒñK¢€ë·<œÝf_ï’ÞX ¾""""¯³šåÓÿbðm¶pj›Eߣ¥""""’Ö(øF u~ÂÿòŸf0¿ÎiÌ)Ï5ñçÿ°Š³#üÉéNþÎ|â×_sü?ûŸNðÿæÉüçO?áO®/~îð þôeÔ(""""«¢¥"oœ¯ÿü&5ÿ%Ž­^rSm ÷ýåÄM~þ­ßÅû›ßzŽ×DDd½ ¿düÞÃíèüûdÑ»aFfx¸ÔÁbÃëÖÒ‡Õz5Á7|ƒ?ý“|÷m'£Afÿ¾ýrþõ¿õⲄù»?~m’ð—ð­-ùü«Šr<.ƒÿÜÝÍD$ g‰Uä~ÛÂ?ýU€?û<ÈlÄ„oºÈ,¨àŠ=lJ0¼9d(p•¿¹æKG:ÙÅ•ý¾KøúB|·ØÂÏ>‘V[Ï¿ú矒•kZ©·•aü¥Ÿk>Ê/"ÎI‚šŸyNÙðÌ_rgá+ìŽoùû/¸—šžðý/""o“Áÿó/ØýË¿zïï&(þ»G~ã›i üáïâÓ­ÌUyuÓçÚ_UPú‡eü³ ÒßàÿþÛÅÑ#>‚)Sqww®] qòÜC<œõ ÍAŽöq¢q,_s„©«ñÑü'_cê×!|Š?9Œ/aãÇ çä¹KX)6Ÿ§¸z.LÄ@\Ó9.ÛÆ0fx׸Îrôgˆ›ø5²]vZ.žäG¿ä¤}*XiI:{Dän‡{‚‹¹¶Öë÷˜Cük¨ý¶ÍÁSb»±µ!Á‰ûŽÇxïºs3~¼çõ7ØÕ“0ÿ¿”ðûâ¸`06#‡iÿi&éöîCk>Q¿ú µ@âH;[ ¥—j#´\(eçß•ß~_K‹Eü$“€xG‡¸ºc0~þKäMêOˆÿø`×¾iè)¦>ÛooKzûó°~ö—ÜgšCü±iîô¶%^çø‘?QOÓćpĵÒôÇ WF¥’:n$`›ÊÁÿ žÞë†m4iYY ‘@` O ~X ÍV+$t·Fj'eâ8F€á$%ñ8–V¬‹§8?ÌMÖ„¤¶Ï¦Î‰¤¹‚ü!ÐĤ £1êÏÑÔ:ÎEñ'ãh žÃlçš0FO¼©ªæÐ.&<À4·À˜‰¤ŽòÕ›˜èX­IIZõ‘»H¹3²(îpy¢’Eí—3{(ƒâÿœ¤=½t³%ƒønj³B!â'åñ__™‡àß_È¿¼bÔ«ùüI—ç6ÿ¡€þÍÎSß[FºË–Ý?/èµÖx‡ø±óYø79m«§f˜&$Xå=ÆÕ©Œ‘NF9;?i”ÑwL}·­ûº{‹9>è¹Lå¾÷½Ëç4]5ñúœãW¯r“@øAÒ“Àºba$Ú:$r $ôþXw¬‹§ð s¹†'rµ—À†Å3âúêìZš¯p5r†ÿø<Àµš®^½Ê°Q-8–QÔq¾© šâI~`ÍçkÛn‡ã•–Ø%!mźÜ°;7‚ãnŽÕd 8ŽVt]G‘X1ä©R¤®ü7ö½ù¤:ìŒÝõ3ŒEÄlû_K‹I  šC~|û‹9Þl19ÜóV‡Ä´™xþ¹ˆÏyÈ›â¢åUü[A1-óVð_¸õø{‹)rª¯¶õ?æ¼K+Sî­—¨¯o&qR&Éײ».«ÂhÄJJ°XMZÙžÌ]Á¼Ò–±ööXWÖùc>Ošw cGÐÚÈ‘/Žõ\úɇ g˜=•©SSnœ¢V„6Œ8‹±ŽNž= W¤HÄJláÄٳВȤĮÆaŒˆçê“+\;å[¹ÒÜB\‚DG/­‘ûËÏù‰Só™y|¥[Öñ)`ëå±EóÛW/¤N²ó/¼Åîï¬bnÆ|fÚÁ¿l^GK‚‹gÌáÏÝÿrzij÷ؽä- QúÏÛøU‘ .üO‹ùÏ_³Cø6ÄßKL¼Ò[ÛzÑKÌ ÖË”{^kS= Wñ$ÄÖá fcÜIøjÿÈEËÉèë}øÎÙH3œæ S&ÄGbuSW«ÅU†Vs˜ó§Oji%ùJÿÖGm£'0ÚçãøÙ‘¤AkÓ9|GOp5u_c0ÒeÇ3¡Ë%v{;oØZÂÕ—ózx´•ÆÚ/øCs*Ó2ÇÒ©Xë<øâ(VZ6™cWnÛh7ØÎsÆx˜©zy¬Ëu|[/8z”“"\·ã?‘±Í'®t” IDAT©k°óµG3Hê˜ûFê©:xÏcàŒ°8Wý÷£dŽ5°Â|¾S44µ´ík 4·£íSws=U}:¬”hpèà âÊ&«‡ëGOó•ï ̆ ‰kRŽÑvU‡ÄÑz‰¯VsÁõ§L8‚¸¾n÷|ED¢6lsos~W­˜×.åkÄE½¿·kÃ6—pjYÏuv}ϺßlÙ²E‰¯È`º}‰¯ˆˆÜOú—øÞž:”ønÑâ…ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+"""r‡M;’Êàm¸¼T*ƒa¦9håß«”øŠˆˆˆÜaK½ãùëOk%ù­ †ùëOkXêÛ˾×颔""""wØŠi–þË—\ÉŽ÷K±r³jõj^šç¦¶`{Ò½‚U~LÀôׂU~€¨"èôâu ,Z3°‡’p‹V¬fÅ"/fÉûT…±%l+¨Á9g«V¿Ä|Ÿ_{殢°° Çœe¬Z½šå‹¼„J‹¨ 9É]º˜l‡ƒœemI/¦ÂmE½ù,_½š Rñn¥ÈgbÕQP3—®bõªeä•ûÚû*LÐÊbѲEd[A½´Ab—í¡…¬\àdßú÷øâÔ¶¼w„Œ_aæàR5›ÖláÔ+ùù¯~ÅæW29²é5¶T_"òÅÖÏÿô]~õî,´•°ñ½j"CÝ ‘A0x‰o¨†²€‹Ü,àÀ;ÓC¸ª¼Ï}ª¡šR|Î<æçzpØí¸¼s˜Ÿ¦ª,€Ã›Ž=PEÀ²T…påæà V´,Uìé^œ]Ã6R™7? ·ÃŽ3u rÔ–þº²J©ó™ŸíÆaw’:s>y×V­é,xé%ò³Ý8ìv'vÃ$dÞÜHÓWB‘Ë‚™©8ívœésX 5em,ËÄ4-pxÈY¼Š <íËñÒssp;ÜdÏô2À¼^î{6Z¸’Îþçªÿ‡Ê‡^ä•Ùm[.UïäÀðgYþ|&)#G’òè÷XžŠ|D€+W.qéÒ“Á3ÿc+o/Û¶EDDdp ÚV‡`U+HÑÆŸQ `YX)óÏk[í–…41œ® žÃåÀ ˜î,R)¤&€€¬¼lB5m·ý© ÜnápwJš'FÕ9.†Mìng‡r¸7n™¾Š ü-p8ì„,ðtS¾ c…JÙø³²ëeY–…‘jBú–Î/¡¤h#{Bno3óf’åÔ(r¿±=ÄÂåy|òz5Ï¿8›k».ÕŸçÊÙB^ýîÇ o¿ïÊ•+ ϼİG—óÓw²sË«|pv8©?Â…Ï3ó!¥¾""rÿœÌÊ P^Â=ï%g]KaMj Þ¡¨Ì‡™šN÷;U ì.;Vm0é´mÕµ‡L § Y“=••`yXàrcºMŠ++Át3¯ÛDÑÀn€2¡ãz©&h‚aí7ƒ„-®÷H8²?Â(§3ÂâZR&n[Ñ5k ØZbgÁÒed¹ì`ùØñVA÷-sØ1\óY¾<‡ë[Í0a¡Fj‹WÌà ¨--¤`[çª|<Ê}¥l#Œd$ÎÄ÷ wŽdø„ùùÿ~æz2Ì¥óœg Ãë¿bxæB~òö_9ÿ•…›X¿æ,)[W’¡ÜWDDî3ƒ²ÕÁ ”Sv“›åÆáp´ÿsáÍM…Ú2|½\˜Àé‰'TBQyÓ2 Õ졨ÆNv®;žlÁòrB./.ÃÀÕ~Û§»lÚp‘í"P¼ƒâ*?¡p˜PÐGyaåf:¹×6[µí©!hš„}¥•„IÍÍ$-'‡¯ˆ¢ª¦&P^DIû•Ì,ËÄÂÀ0À ù©,.¦Æ´‡¯mu°0ÛÛêHŸIz¸„âʦeöW²cãF }&fm!ïl-¢*h‚aÇáÔØäöóèód‡vòÞÞ¯¸‰pþÈ^þîÕWÙT}‰K•›øñë[(=u l#qŽ9Ôኈˆ šAXO´ð—Uaºç“ÞeCª=5‡TvPZÆÛÝ~G6‹‡),ÚÆº"Ãá!;1sÚWsžlÜø!ËݶjìÉÂ…#;µÇUd÷œ¥,u³gÏûlµ%—®Ôlò_šC–¬ Ž,²¬R¶½µƒ0NÒs³ ÛAKóM Š·²®œé¹ÌË Q 8¼ó™W¹ƒ‚ ë°ì.¼3石‡Â‚B|«æãMµS°í-v,^Å¢t/ ‡(*ÚÆºBì.¼y‹É÷Ú±[ùÌ÷í hã: »ËKÞâùZí•Ûcä,ÿI=[¶¬á¯65Aâ_øV>1’‘‘•¼Xýwlyõ¯Ø$Nxœ…?yQ«½""r_ÖÐÐpu̘ؾΧåÛÁ[….–­˜CW[‘{Ì–-[ô'‹EDDD$6(ñ‘˜ ]¤€‘ºˆÕ+†: LZñ‘˜ ÄWDDDDb‚_‰ J|EDDD$&(ñ‘˜ «:ˆÜ%Z[[¹rå ÍÍÍ´´´ u8""rŸ±ÙlŒÛš^‰¯È]"..Ž„„†:‘û’¶:ˆˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄcpŠ ²gÃFJC7?bÏZƪ9~ÞÙXüÕKIhárÞÙPÅœ~•aá/|‹­•&ž«X–íè#f‡'‹9 æ“í2“š­ë(r¿ÄŠùî(:Ï·ã- ]ËXî-å­­>f._ÁLWÔ­ì£x?…v`,^Á|÷m>”–ŸÂmUä.Çí.Zn§_½ÿ*?þøVlþ 3ÇtxèÔ?±êÕ8Wlæ'‰MƒšÒ¸ç/gi–£Ó}†aÇû³Úž™>Jk,\;þÒ*BÙ¹8»<Å5oy{Bla}”ï)¤ð};îå·–®\ägáêZá]Ȭ-äý=BA“ÀVî9KYnê°¤[6Zø·,Ø÷c¶l9@æÿým)n=ŸlÜÉ©ìWøJzEDD€AN|1ìØí}$LÁ=lØdÁªE¤!Ê6n¤fÞj–¦›Ôî)¤¨¬–Oóóç㽞œ¹¹xÜYäºC”—èéÙVØOU™ÓîÆEîgJØVPƒsÎ2V­~‰ù?%>³û'‡«(®´3sÑ"ò~ ·ôæ³|õjV,HÅ_¸•"Ÿ ¡rv¼_†=o)«V/gQv˜’Åø-'¹K“íp³¬-é%\ÉŽ÷K±r³jõj^šç¦¶`{V—:¿Ë¼'_%× Õ”r嶨´²X´lÙVpßM—!f{h!+8Ù·þ=¾8u€-ï!ãÅWÚ¶>\ªfÓš-œzb%?ÿÕ¯ØüJ&G6½Æ–êKD¾ØÂúOàùŸ¾Ë¯Þ}ƒ…¶6¾WMd¨$""2uÅ7Pøk ;ÜáÈbéŠ|RûQ†e™˜¦9‹W‘e‚v1s^v[Rêö’í*¦žO½ÅÚ¢¯³{˜¹h^§çô)²J©ó™ŸíÆ8fÎ'¯r#åÝ>ßIîüyd¹À¬ÙF‘ËK3SÛ¶^¤ÏaAv%ï—xJ ¸ç°(ËHÏÍ'ßîÇ覙¡šR|Γ€G¿Çò¼½ü¬ÈÇÒgàÊ•K\ºt22xælåW†cÒ¶ˆˆˆ ŽAM|]s–±¸ã_ÃŽ£5é X:¿„’¢ì ¸½9ÌÌ›IֵͶ†=ª•X€`U+HÑÆŸQ `YX)óÏk[-í&fÃpàèGÀfØÄîvvèT'îž^o8pµw c…JÙø³²ë¯µ, #õ—&†ÓÅõfN¼9í{=:-W[˜Á¶çÞèq‡Ë0oªÃCNºEAeÓá£<ì!ÏÛç^¹›Ùbáò<>y½šç_œÍµÝ —êÏsål!¯~÷c†·ßwåʆg^bØ£Ëùé‹;Ù¹åU>8;œÔÇŸaÁÂç™ùR_¹ÿ jâk8œ8ýL¦¬0öïÖ­P#5Å+æa…Ô–R°-„sU>ž¶0¢i ¼<„{ÞKq“Ú‚w(*óa¦¦_O, ûbngwÚ1!,®]ñ!L0ÜÓfб;†k>Ë—çÜø±&Œ³ô·X¾žëeÖ–×`xsHµw.Ïî²cÕ “Þ^ŽE8db8í7Õ žœT¬‚Jjí>ž9h+ï½Ï6ÒÉHFâL¼qßpçH†Ox‘Ÿÿïg®'Ã\:ÏyÆ0¼þ+†g.ä'oÿ5‘ó_QY¸‰õkÎ’²u%Ê}EDä>3ô{| 'vÓOem ùj̶dѬ-ä­ETͶÕbçÀ23+PNUØMn–‡ÃÑþÏ…77jËèin?‚;'‡¯ˆ¢ª¦&P^DI°ïW:Òg’.¡¸2€iY„ý•ìØ¸‘BŸ‰+;W`Å5AL+Œ¿¼‚=µX×X ³=~§w&žP EåLË$T³‡¢;Ù¹Ý_zÍpçj•SX&57å½÷§1>Ovh'ïíýŠK‘çìåï^}•MÕ—¸T¹‰¿¾…ÒS—À6縑C®ˆˆÈ ú+´:³˜?³Š;6ð3»“Ôì9Ìñ¨ÙùÌ÷í hã: »ËKÞâùQì·íÈÂ_V…éžOz—…\{j©ì ´6Œ7ëÖ›b¸óXšoRP¼•uàLÏe^NˆÒ¾^h÷²`qˆ¢¢m¬+4Áî›·˜|¯˜É¢ü0…Åï°.da8ÓÉ[´ }uÖ‰7ÕNÁ¶·Ø±x‹Ò³Y´8LaÑ6Ö™Ùù‹™ã6èöjv9©5¾trS•öÞ·F>ÁòŸÔ³eËþjS$Nàñ…?aå#YÉ‹ÕÇ–WÿŠ @â„ÇYø“µÚ+""÷¥a WÇŒÑu>c“…¿p;XÄŠž»àSˆˆˆÈàØ²eË]°ÕA††eT²§¼=l…¹Ÿ(߉Q–¿ˆw¶ÕâÌÉ'O“XDDDb€2že¤æ³jíPG!"""rçh«ƒˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ]ÕAä.ÑÚÚÊ•+Whnn¦¥¥e¨Ã‘ûŒÍfcäÈØþÓôJ|Eîqqq$$$0Ô¡ˆˆˆÜ—´ÕADDDDb‚_‰ J|EDDD$&(ñ‘˜ ÄWDDDDb‚_‰ J|EDDD$&(ñ‘˜ ÄWDDDDb‚_‰ J|EDDD$&(ñ‘˜ ÄWDDDDb‚1ԈIJŸò³­&@e0<Ô¡ ¹l—ƒ¥^7¯Nõ u(""rŸRâ+2D6ô³r_íP‡qר †YQZËÕ«°bš’_¹ý”øŠ ‘_ý!À?ý—,<äâh†^áWAžÿç*~õ‡€_Úã+2D®moPÒÛæZ?hÛ‡ˆˆ %¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾"÷ª¦ë>)Çý÷% Û\‚ý½rT4ˆâ¥æ‰C8?­`EÓ$Ê^˜ÉþÇ Š÷û(³:–fgÅsSù«6þæÏsÙñ€¦¹ûèÝIäž”Èêï™wr]¤&Äá~`Û·ñïƒm«¾ñÖ>žŒÛ0È~(…¯Å'±öq'nà ÷¡dÜ-æ`6ODDdh¯È=©Ó²‘ëMg‡·ív PϺ²Zfìlâ‹ï¦‘ÝW‰RnÜt;í$DLBØ8œñŸÜñ¶¦ ¹7iÅWä:Q…s[M‡ý»q¸Ýn6<5/)kêæEV„ÊŽ÷7…¯o‘üÑ„ÄDœƒ¶ˆˆÈRâ+rrþ‰‡EñýÖOqÐ$ÐÁl`]éiŽr‘›ÄÛqFÙvÂÄÄ¢¬ºŽÂH‡µ4ðRYšf ß©:–²˜÷¨+ªýÁ=k%åV ‘;MßYŠÜ‹’yçϳX»ÏÇÒÿSË[›¯OšÄ?ÿù$² )…w­gAq#lvžò¦±îOÂìh/Â>6Õœ o[ŒOä¹Ü©lK3 »Õâhv<`°è£ÏX0ÿI 'ésµˆˆÜ]†544\3fÌPÇ!s†m.àêËyCÇÝD}"""ƒeË–-Úê """"±A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+2D¦ @áWÁ!Žäî°­&Üè‘ÛM²Xdˆ,õŽgå¾Zžÿ窡宲Ô;~¨C‘û”_‘!²bš€m5g8xîÒG3ô¦ÉRïøëý"""r»)ñB+¦y”艈ˆÜ!Úã+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾""""Œ¡ ;{N…xïËÿv:Äɰ9ÔለˆˆÈm0Ñaç?Mpò׸™ó€óŽ×W%¾ç›-ï©áPð"?øÓ‰ü_ÓS™è°uX""""rœ ›ìöùë=_2Õ5Š÷çx“pçÒÑ»f«Ãùf‹Y…•ŒnðïßÁ²,’^‘ûÈD‡eYþý»39Ü`Va%ç›­;Vÿ]“ø.ÞSÃ#clÈóu(""""2È6äyydŒƒÅ{jîXwEâ»çTˆCÁ‹JzEDDDbȆ'ïhp""""2Äî­ͼ[\Fîîº^’^€ûáÛ–ñÃ#M˜w,@j÷~âÛÜÀê]¬õGúñ"“]¿;À3ûC\´ÀDDDDänroou°ÂlüøÛ»É^§Ìz’ßfØÚo5ñÆŽl w~αêJ;Ÿà7h߃ˆˆˆÈýî^ñm¥úó*Þl¸µR*öæÝÐí‰HDDDDî^÷îŠïÅÓ¬¨îy—nsKëV+Í-==3Ì›ŸYø´k€W|°(þ¨”Îöþ¬sgQ0ñþœ1¨Z©.-ã™3“(û¶‡‰C‚âûÛ+9;k&¿™<˜§Åíjë]ÐgO3ëê˜þ­'Ù¢ñÝ£P_/¨ç¹ü\^wÞB9Mžþ°Út¾˜ÕÊ˽ŽÙ>ÆÈ튩KµGüǧ°|²¬F~øaµ?Éo±õýò~8ùår÷l^2çúxrÇ~û³$ì·5’hé½¢³;5‡u“óîÑÄ·•êªîí)ÝÞ_h>~‚ÝM.hǃÁôé^Ö_¾Vo˜w÷ù9<ÎÛ8Ú'Ø8ê÷±êØŽHá`î4/ë²7¶ÍDÕÖ(ú0ªr:àëõ¼òì$Žô±ÓßD³#‰¹Ó2X}u)Ê6X&ÅŸ×ðÆÑÇ"qxÆ»yýé<çìfeÊjâÝËYNáýç½ÌNŒ¶Ž&vî«áÿ­kÄos0wZ:ËB‡ùö¹ ?wmRßýÔë8ïN_±ÝÎq4_ ²f_;Ï4Ñ<ÂÁÜi¬ËJj¯+Úó°}ëÀÃöm-ª IDAT½´%š1ÒgLí_EwñÉw2ȼ6ô›Nóô‡G=g&©OžöóòÀ!&ouòþ’´ë—fM]Ä`JZ:oÏêxî ¬?;émœvê73ª93ª1ÍØ~Î =ŒÝV⟕ͺ#¼q^Ëâ} ý¼œ[+Õ‡Xy<޼‡Ý¤Û¢¯+Ì»*X[g1=3ƒõÓ“¡®Šj:®^õÕW6žôØ >H­ÕWíñ¶OBgÏ4ÒØ^F…Ï„d7ÓmQôQ'Ñ«Å{+Y[×Êto:ëg¥³$ÅbWY%kê[ûÑÖ(ú0ªrºæÍâÃÇ»xmV:Kœ&»ö•óíªk#=Š6á£=x¡:Bæ´ ÖÏòyñ4/\Ëïo¶&;÷V°öB2ë¿ÕžôFU‡ÉÎÝå¬à1Ò[LqLÎH&éruXh¨÷8Œ“e7}`·³ðÙÞLÆyùä;S˜ßöÈáϱær2¯ÏžÊúÌDŽÕÕðýšk­hvÔŸqÚVgïóA4c2ÚñÓ_ÑôGôcwÿ¾ÃláaÝ/KMìúÝÝu22øÅì4fDXûéiNöЯQŸ#½õç€Çg_Ç©¯¹º›1©¤7æÝ£C ޤxº$·uúq[K+Í}”˜?ÈŸBÖoeÊ7¦óÁ#mëm Óœ$”³é@ןs“Òõ5MAÖV›x¦æðë'ÚVéf$ãùõÞ6Mç—Žk5EØû¯¬ô'²öù),Õ~wýdž;Ág`îÜé¼}­}ãíÌ*¨mÿ]?%õwœGÛ5·:î¯óLá7Oµ¯Nv‘^ü/Tø¨ÈœÂ“}ËÞD5ÖS²›ñŠý&¯;í@„ý_6Âø)Ìèf}t¢”x ÁÆäQ6ìV{r;b\?÷1ýe¬=cbfÙ±÷cžëIŸãtÜͯéuÎŒfLöcüôK4ýѺœiübFÛ—ØÈGÿtšqÓ§òvVÛÜ–~9@î眴ºùÒ³õôÖŸÍg>>{·£™«»ŽÉ~¹ßÜ›+¾†é#zJã¹%'Ø{²½þ†>ÍÞ0nìàžÎñãàv¨Åp°0Í ×V.;3/ÔS%¾š&‘粡¡¾Ók<ºÚ&†¶‚™ØáMÉ>"‰tL¶ÿëÞ=¦Þ‚‰^Þž™Òï_Òzt_ÿʳ?ñµiÅïo¤Ù–Â+W‹],ãf4}eífz¼Éîsh³;lc^¦‡É-av‡[1/©h±1{ü‰¹·>ê(ªce8xýÙœëofS˜½GO³¿…ödѵµï>Œ®œžÌ˜šÜ!i°1wZ2 ‘Fö‡£iœ­oà,IW÷œ~óO°nܵ飕ŠÏ+Y|4£S˜×q D4uœ q6>¹K.–tÈT£kýçQÄvÍ­ûkâÈËJî€äe:Ihi¤¤­[½»•1ÒGL†ƒ%ãã8v¤z€¦ÛÏ or¿>0w=÷Rl\ïã÷ç ÑÓÞcê8D3&û3~ú#ªþèרMº>Ømv’°ñX‡y1i„ô°BݯzzêÏ[›Ãz;Ny_¹GW|íÌoÀÑ^FuC/쎶<Oò¯}#m_»Œë²ä4 ÅjÛºÑ%„æ¦͘¼YP›7•hp¶hÿ*1iT/ñšÀ/žµX½ÿkwX xƹyeF:ÙÏv'9o|@ˆ*¾.Å›—[Á–ÈèN÷Ç1Îa@û·WQõU‚ƒç’au]õ£‚Ôâà•' #jÙ{&ÂÙøgmN掾ñ¦×kuí±ª?y‚5ö74qSR:tЦ­ÑôaBåtÏÆÄÄ.oú6;I4âoiâúhC+Í[Û^ß¹îщŸwìŒÁ’©NvªcÏÍ/;ìý쫎Æ6{—DÊ ÓvÆhÆÚÆy_Çðš[÷ݵ €ÄD’ÓØr+_G7Öº×WLÓ½I°'Àþ¦ äÕŸf?N6÷ú»„›õvî ¼?¯‰bœvóVÑsLÑIˆ~üôG´ýuÝñ7ßÕ×Õß:Šúéå||ö^î@ÞWEîÑ!Gæ#.’Žn|íÔEƒS)›í$ àr=ßü‡šž/6"……£wñ;ÉÖvù¡³:õzcÈ‚ø®v››$òÚ³S˜}Ó·fžºÐ»“2~¿üo“0››¨ðÙ^QÇkGHù‹©Ìë¦n°¨ícûUTñua‘&.Xtè‡VÃ7]_Ù˜19‘æƒõì?ÓHãh™‰‰ÇÖã!öÇ7‘’Ö¶J×ÏOýQÕÑÏ÷v×ÑøpëŸJa¶Óhÿ1IÕýhk4}袜îYœlÆv¸+¡‘8<ñqQ´!ބďö×tÔJýE“f[bûJjy³§²nr+SΔñÚ¾:~ïÉhÛM£â bvÙ‡kq2Ø¢ï'ècœwQÃî dÜwjSG“F &Ûzšú>!º±6ИF§L`:5ì¬o"¡¦Æ{™qÿØåÀûóš(Æi·s\/åE1&:~úU RÝ7¹Mõ ||ön ï«"÷æVÀž2‰õò][‚Í ÉˆÃnÄaaëõk¹é{nübyŒëÂC˜íÇ;üŒÅ ³³Î„dW·W°u1“ýM62Ç:Úÿ%™¼ñe“;¨?vˆ¯ï¨¢¸ì ‰<9y럚@RK˜ýá+M:NB¡ Å}|ýÚÿøâðx’HˆÙÔñ}M l­¿q3Ú¾7>™q—ƒlý²‰¤ñI$G惉P‚gZÉLØ/«£©ß 9ŒƒWŸÐöf˜áF*®'ѵµï>Œ®œîµ²¿&ÔáÍ;BÉÁ Ͷ$¦;¢iŒKI"‰Û;Õ]Ï ÿp€—¯_R0Žq£ ÀΙ“ð\>ÍÊöŸDS‡g¼“¤–.u\l`g‡¬#š±í8¿&šØº3ð󲕒ƒ ŽÇG8y²ÃÖ­þž‡·:FúŒ)ÑÉ·“[Ù_ígÓ™V¦{}î¹íÛ1ÏE7N£͘èøéK4ý1Xuwu{깕ñÙ»¼¯ŠÜÃÃ"‘%OyغËÿVŠINg}ÆØîîtóºÇÇËû*øþÅTžÛÊþ*ÛÃ6¾ý”«û7’Ä~ú°oï­àûç&ñÜX¨öØz4ÌŒÙéQ'uIc$„O°²øµ8I‰4RüåiG¸Û¶vòFÛe‡yÃ6‰„Ùþù ûú´<€øFOeÙèr6í®à‡S=ÌeR|ÐÏþŽ+Qö•}´‹6?»ÂqäyÚ~ fOIÆÓr‚c$²vüMË%щ¦þQIx8Áÿú]-ÍiIŒ¾ÜÀöƒŽ uöz<ÌŽ¦­Ñôa4åô ùxßü4•åƒÚã'ØäoeÊã©L7ÀMRRym\€×vW°âñIÌvXì=XK…-…÷=¶›þ†‚}ì$Ö§æÛŸaçÃÙ,ŒªŽIü(9ÀÚ=•$<îav|<ÍÙ~ö“Ù×8ï"ªöw÷[‚[9/ýU|óÓ4–y üu>6³&µðàyH”çÕ€b°1;#‘×ÊNSA›û8¯ ÔÀîz;yÑ\:÷6Ìsö¾Æi?¯›abLF5~F `m)šþèØí§Ÿ#]ÜÒøìM”ïÆdJâ-^jNîu÷ìŠ/€=%r“ºÝ¯Ôè?Á›N°ñà Þ(;Ñý×26›çy:lœL6ž›ó¿ÈL¤¶æ/ï­£¸ÅÉkÏ>Á†÷Ë<ùT¿~ÜÁÉ£µ¼¼÷ÛÏıpV¿˜ýŒaw¦òÁl™—ëyów‡YY v”‡ÍÏfð¤Ȳ§½|kt˜M{ñòç $MŸÊ:O_Ÿ‹ŸáàõoMgmZû«°òózœÂo¦;:Ç(ûÊpð\J[üÏ]»¥#¹íòe#’;­¢õOõ;Sùà)Œ«÷³öw5¼qÌâ[O?É'¹É$ÕûÙ~®5ʶFчQ•Ó};–ÌñòäåÓ¬þݶÖ|ë9\»ŠE4mÀÎ_>ûë6ذ†—÷Ö±?a›¿åev·•<™›ÎŒøkʸU‰üà[9¼ù ”|^ÃÊŠIÓ³Ùü „„¸ö6öÝO}ó.¢Š­‡6è¼Lbí³L¿xšµ¿;Âö%³sxÿúÜÂé+¦6=n<ã<}ls0ÈÌt3%âçåâ:ª£ú‘×í˜çú;NûŘðøéKý1huwq»êðøìK4ï]Ƥ~ðó†544\3fÌб¹„SËòøêVª¿¬"_Cû}»åp³ùY/Ïêû©"÷œÐ ¾^àgÞó¹üô®ÿ¨­˜ØŽqZì-þŒ—Gd·ýá†!‹Mh’¿½ŠæÙOò›~|è¾wiLŠÜil-áêËyƒZÇ–-[îíß6qd>2•²ç3øvr4Í1˜ž9…ÍWÒ+r70ÏÕ‘»­ŒÕ/ˆßÜÈÖ3­¤·+Á¸ \8ã§‚$– tûÐ=FcRäþuïñílôØ løon^¯²óËzv×7RŽÐØ 6ž±I<ù ›%i.2oã/’EäÖØGO`Ùh?o~z„)ߘ@&Mìª8B Éü‰Ö]«¹‘ŽÖ³³"ž,æÆÈÜ©1)rÿºoß6q¤¤¤°<%…åCŠˆDÇHdù³Siü]-oîЈ'ÙÅÚg3˜#‰Ö]+ÒÈÖÏýT;ܬŸåŠiLŠÜ·îƒ=¾""""r/Ó_‘ÛH‰¯ˆˆˆˆÄ%¾""""”øŠˆˆˆHLPâ+""""1A‰¯ˆˆˆˆÄ%¾rû4xzk |Úˆ9h•´R]úüÚÏÉîÕñõ­e¼º½uÖ9ÁÆcí­²ùáÿWÂÓ_Fz~É€ú¢¶ ª.m¼#ÇòÓ±O¬ß¯„o³ ãÿ»”ñ¥hêî-ö¨t7÷š>ÇùPž“±Á ùùÞŽØZÁGÍÝ?§¾þ4+>>@ö{%<°õw<²£‚làäõakñÑG%=§ ¾ Øz€w/v}¤‰7v”ðÀÖ>æs,ö—2«ªqÍ{Ãíp§ê¹O)ñ•Û'ÞÆc㓘‘rŸý]Z©ý²Ž76EŸÞs}Ñ¥÷\üw€ú¤87î&:¦C¬•ê %kçf—pó3.œ9Â3»Ž°«ÙÁÂ\/›g¥óÊø8ö~ˆ§öÖS µ›ç|nûÿá/ƒ=–u¡þoøúáPî6:ÛåöIHfݳÉCÅÝá^ï‹{=þÁбO,­´Ü4·\s¤F»Y8ÑÑÍ_4ÙYzš³ŽI|ò­42¯e,Xè9DîÞZþ×9ëÆ¤æVŽ àOfm¦ÉÚC§)nšÀ_vøË|ÎÔòBi=û/´ï“RÜu”øÞ.–Iñç5¼q4ıHžñn^ÿF:Ï9¯-ª›ï?Âu!Ž]†qÉÉ,›áeùøöC`5²âÃJü³²YXw„7އi´9˜ûøÖ¥4²úÓ:v7DÀ‘ÌkOgñƒ±q:Á× êyåÙI;èc§¿‰fGs§e°þöörøa%³sXr¼†•GaÝw¦ó\â Äc5òÃ+¨}üI~ûˆ çN³¦ÔÇ®³šãmLñLbÝ,]ÿToQýåVl "l‘4:™%¹^^Ÿh»Ñ¯Í¼»ï›Ž‡9ŸHÞÃi,‰âp4_ ²f_;Ï4Ñ<ÂÁÜi¬ËJb4­T—–ñÌqŸ|'ãÆDÚtš§?<Âè93)HíxZ˜¼ûë2Ö^8Ää­NÞ_’v㘖fM]Ä`JZ:oÏr“nй/6»?ñýl[4Ç»kŸµ@Âs§yY—ÕþÆrÓ˜h噑a ;·qç?Ü8–Ñ«¾wO¢=&}Ùò·‚¹³(˜xí¼‹°ó?cÍØé|ñTÒ>êxlGeqx^ÛŸã½pòSv70.3‡²m}Z{°Œ§>·ó‹¿H㣂kÇ´¯6uÖóx¼&Šsá¦Bû8ÎQ×ÝQâèæÜXšÍl£ãÔÕ Íc>úø3^nJ£ìÛ“˜x½C‚äo¯¢þñ\~—é4gE7ß Â±joßÙYÓYv¦Ž7ê8vÙ`ÊÃé¼ýö9åÊíÔoùéÿSóÑMeõwÞ¼1Fz;>;ÿñ3V6T1e«ƒÍ‘Ãsÿ$´eq, )ÉLîR|ʃ©¼öp ç>ï‹ÕÄκ  ibû¡Z¶ð—Ü8Ž #’˜›a#¯9ÌöCýY[îå½¢:w£›Oû¨gPçí{—¶:Ü>Ús€ª#dNË`ý,™OóòǵüÞj{¼ø·x¡:ÌÄ´4ÖÏJc^|o~|€g:~}ÒÊþ}‡Ù>Âú9^–8šØõ»<ºëddð‹Ùï4°öÓÓö1…y³ø0Åñ.^›•Χɮ}å|»Ó^¤Vª+±òxy»I· f<횃¬Üu„_Gœ,û†—73“h>^Ëâ} \h/û÷ûËyf_<©¬Ÿ•Îs¶F6í.gõ™Ö¶2¬0oìª`mÅôÌ ÖOO†º*^¨ékµÍdûžÃìuLà§³½ü(ÅbWYß<Ø„I“3’IºÜpý+.€z€Ã8YvÓ›³…Ïæðf20ÎË'ߙŒø¶G~ˆ5—“y}öTÖg&r¬®†ï×ôô…o—c?жõu¼#ï­dm]+ӽ鬟•Î’‹]e•¬©oí!ž üÅé¾×žÛç±êóx÷&šcí˜íOzlP¤Öjkgíñ¶Îži¤±½?+|&$»™ÞK^Ó»ÞÆc[½}öïM¢=Î}ÕÝQãèæÜ0zœc³1Ûìí°·ó™Óì'‘%i?E7ß æ±j¥úóC¬ ;ùﳦ²yªƒcGkø~uÓ­—Û©ßzèË^Ëêï¼Ù_Çç[órX?HNç“ïLenb—" 3ÆÆÑ|¼†•U÷ôF?x*£mÑ¥C[›,.4wþ×ØÍ´j^ðÑeƒ¹YNFr±dtÛv‡Žïevg ?˜6‰åÓ's=éý½!Šãå|Ú{=ƒ=oß»´â{˜çN°Æys¦óvû§Þ…)³ |l:›Î/GXs¼•)ߘδM¶ Óœ$”³é@ןs“Ò^V‚3_ÌH!ÈKlä£:͸éSy;«íué—ä~ÞÈI‹ë+Í)SøÍÓm¯!#…éÅe¼\áã÷^/µ?çìe»¾“Îc:Á÷1óBý-v–ý™—×ÇÆnf;kx£Þ¢Ýdmµ‰gj¿~¢mUgaF2ž_àÍõüè97 g|l½Çܹ9ürb{¿¦9Èÿ°†ý}Ï~óTÛ*“]¤Æ >*2§ðd²›ñŠý&¯;í@„ý_6Âø)ÌèæSîèD;)ñ@‚É£lØ­ö‰eÄ$>xzé1ýe¬=cbfÙ»¬,Þ| .œ¬pÛz?Þ*Z™;{*¿œÜž©¥9¨ß^IuÈ‚”Ù[§1ÅùîÚűJêëx÷Ñ&{_Ç$ý9½8&Ov’TbsF¨8aÜx;gëƒT7O %¾‰â˜ü¸“na{Coã1ÒwÿÞÔ6+úãÜkÝËŒâ8wã¦s#tbÀÇiPæ±ñ˜N ÛÏDøËQmß\TÔ„ 9y£€‰Ô…3QÌ7è£þ«F<üæúœâà‚ÿ3^;cbNK¼yNéG¹úÍjìæ¾0õQVŸçhWÑœ³‰‰xâã ÞŽg”­›yÓÆs³²¨øía¶–bWYžqÉÌNuñ­]<éì’Â\¨ã™ëº  cVÝʱ/ëÿÿöÞ/¦Í+OøÿŒ±lÇkŒë€ÔˆD "]šdB2K`í)š M©ÔYªý¥éEé\4³7InBo’ܼ“½˜¤Ò”tWK[u’hWIÕWÐ&oSx“ÖÛD!APB¼€ ±Àñϱ-ãù]cÀ>6Æ$áû‘ûyÎùþÎsÎy3¡ËåPž0°o‹‘ÖÞQºòvöM¨ïÚ à·„×O•~2P·ŸWdÆ7 L¸ÜL`ž×k±óå[;9•§aúá$NL¼»!*­µ&šJ àž›mŠ`ß`~R8 :ft¼Zð´€™×iù3 5UÖ¨b«£a›}ÐCOÔ¹}Cþ“å©•–À°ÎL)~Úÿ:ÀǼ¸BPTVÎG?³Qø§]ôa ¹,j‰#[àv1 ãtzèl¼mWc.‡ tƒ†º­Ö¨¤ÕRWiA?ã¡Ûѵ¹@ÃЀ;ò0ƒoŠö ¨)·&•èö ¹‘‚3Û‡MÌÄ;~ÎËÑ-¿µ&Žíßþ¤ ú}^ºîŽÒ3³P¶è˜ˆGb_%öwBø$™˜MCN>ÕY~:!à¥Ó«c_¥M3^:½aüÓ“8ftÔ¤<ÝK¢xT±ï”ýœ ¢HIŽ–ã§©cF+ÍypûÎT$®ÚÇÂTlɉKµœ\Y_-¬)Eñ–›—™ëó>Si+ɺ™¶œ5Zù°ñg ½Y͹=vjô‘m…o\ü–W:Fé‹ng]>§ªø4æï\UÌTrÈGûý f{>¥„ñ‡Â˜ r±ã¥Ý¹üÇ4ã^l­ZOãõ“‘ºýœ"3¾Ë&LàQtÌó–B4ä#áö  äÅ\;Í-Ì„ðÌsç.²œ«Ž"cÌý‹Î€Ι§R³åéÝ´gEå™%»sûC页sœVÀž—Ïû5¥¼mÓð àçäÅnN.8YÙ÷ô8 :#9ó¢TCžI K­þÍž¿`»Ñˆ/ž™0 ¥ºÜ §ÇWHk”,œ]j☳“<>Êþ”uKäo ®#wŒÓãö1Ž ÛbóÏó則Нù;1ñ}’TÌ&ƒÞD£Ž ûpeO2ˆ‰÷môëé 2‘5Å„ÎBCÎræâÇ£’}1¡šŸåÂSR•#%?-ÚÆ Õ1­Žº2\ǰQã¥{ÆÌ© odTrre}•|MYN®Ç~–¸­äêfê±C(rœ!Û̾-föm)Ÿ®¾Z®pÐaáÿîœíDg¢¦Èº`Ð6=£%zzß?=JÇcð ÿHEìñ7¶.kà—È m­XOãõ“™ºý|òâj–14èg÷ÎÆõÈO@gĬ‹ìQœ2Ïâž©dŘ“%ÄýTk0ˆMd iVVž§Ø ŠùäWÅø>ÎIÚÃý*ˆí­*êtZÀÈÑýÔ/¸i±ëÁ¹NAÓ¡h9Ãx¼‰¦ B<ˆ]•úñ e“.b“[d ô¼Ë‡¾ßåÔÄî/[A ËÑ-ž¿9ùMç0žÍeœÞk£Þ¢}PÑA_вê|ñý½Oán)žORÙƒqw(è¨Ùd$pÃEϘOŽJ£lÚîOÑ“åCo›}š<å·ÅGUûÎCÙωsaŽ”äˆa9~Z©:f³RÁ ç]AÌw§ä•Q·H®«ääÊú*IÒÙ®b[ÉÔÍt\güØõ_“ìûå.NEïåÕ¨ßVÆïziuzqíLæÍaúîL2‘e¡õµªõO?wÞ¹MËÝ4mwX E[Ç­§ ¶ËTÝ~‘­i ÏfÆÌíÑoø\¼ó§k´8ƒä¬Ÿ]B¹µ„òr~ØÖÜ¥ŸØU"LOÿTÔFô Ý7& èÌT›?ceå‰àºÉO¿¸EG z#»7szo!æ/=Þ0†õ¹Tà§Ç§£r½iöÏc#œ¸ã4ØífôÁIÎ̳«›¶„׆é¾ážg“N‡›À: »×Í~d´ð†5LOŸ“3caªË-)ìM•åéÏßþ©Incâý…‘‚ ø½ËØžšØW‰ý­DŸ$³ÓÑ7S“tÄ,éÇ’W`%ïñ$mw|˜ ̘ÑP¹Á®þ0¦²d±×,%CüxT±o,ê~VÈ…YR‘#–ÔkË Ö±l+Í9³qå S³ÕºH®«åäÊú*9ÒÙ®r[IÔÍt\g &+•9ïXä»/=^Ðgë0+ê9'Cûp½½˜¦"3¯Úæþ,4nËOÛv‡¥P±u:êiÆêösˆÌø¦ƒm#GóÆ9ÚéàƒÅÔ›BtÝÄ¡³ñ©]ú|ŽÙïÑrÕÁÁGi\¦çÖ=Ú½:ÞØ›»ìWàþ-~ñÍF~k×2x„3Î0S9»‰ IDAT;6R½Ô,•eeå0¯7¡÷Žp¸c€Á-lAwFñ¬Ë,km|¸ùot98ø°˜ÆõÐç§í®—šúÒÈ@£`#‡r¾çL§ƒ÷ªìÔgûé¸á¤Ge»¥ó¿ø¦„Cv-Îá{œƒšÚâ¨}n:êËŒíÅ™³ öpêµÀ”›N—º4¼ö3gºÅó·!ÛŒ~e@‰™œÇnÚoŒ3è‡Çé²Û©_·x»KêhLì+"¦ïÚMŽL˜hm˜{ .–8>Q‰Y­º8Ù{›ºbjðÒ~}O‚ÙCN.5:'—½ê쑇ˆ 6+ö™†0Òº¬ý½³Ä‹G•\ˆ•YÅÏ*}G×?/Ƽ¸±¥^[V®Ž¨ßbähïÝYÎÙ¿ì)åd 6ZNNÆ#í*µ•­!©º™ŽëŒÞʇ;Lì½~›]\4m°P‘­ÁóhŠÎ».X8¹Ë‚!‰å¿{”Π†šòE^ég²±oÝmiØî°*¶®IXOHKÝ~1yq5Ë(ÞÞ¿“Ó›µôÜè§¥k˜}!g”S¯ÐÑøÚNÎUì ¥k˜Ž G÷ïä_“ÜWºͯ•³ûñ(G® ÐæÒr`Ïv..öpÔ9+'Oƒe#ŸÕÛ©|ìâä•Ûîg0ÛÎÙýeìÖhÙ½w;v˜xpw–®ÚÇ44ÕnçÜÜ“®ZÇTÓZ¢¡§o€Ã×]x6Tðeµ)Á>c3­û˨~4Jë•Ú§ 4×oçÓ²ù)²çcȳ'Øæ ¥²2ŸŠ “–Žaúâ<À¦Lʺ%ð·e#Ÿí±‘çrÒz¥ŸC!¼¾›¯wY1»œ´?\ê.>žŽ‰}•ØßàrOáóDö–-ÁÒ>Q‰Y#‡^/ç@Ž—3]7i¹îÆ\]Å©%:OÕ3Ñh‹œß8·œj²F^_¶Îº`f4yÅ£B.Ä¢ìgµ\HYŽØ¸ ¥Z[V¶Žm(d /°/þPÌÉ•ôU’¤³Ý$ÚR¯›é¸Îh(ÝVMoC :/—ú9zu€ßßõ@A Ÿþº*É- ‘m,4/¶‡Uk¤iƒÜ£ó^—Vl­RO“žºý"ò·Ûý·—^ziu…8ÛÍÿª[UžK¦FøéE'û~¹‹×Ë=LÒ̾È>P¿›/—¼°?C<÷þq©ã6úú8{Çž7ŸËç¹ë5†ä¨°B¼ÜÖÍßZêV´?þñ2ã+¬]¦Çœ80ÓœŽ¥l!1¡ 0RgëøDžm$G…çx2[– àáÒ]çS`ߺðׂ„ L_ßå%‹¿;X|"Ï6’£Â ‚ |…µGÐCÛu'}¦|N׿¾°¿Nól¡¡r[9.õµøDžm$G…Ùã+‚ ‚ ¬*²ÇWAAÒˆ |AA„5 |AA„5 |AA„5 |AA„5 |AA„5 |AA„5 |ÓAÈÃ{ÿÑÍëw‚«-É’<¸s—Û\ ¬¶$/ÏÏç¦ïÛïxù‚“IœåŸrò›/ºy¹í{.ù‚œÿÏn^þÛüZ1AgIMÞ'S~nâ+ÌàÀòGþûÜÈb/4ÅÁëæC+žàçõ¶n¶|ãÁÝoFdˆñ÷ª#G´MVW0uæÉü"æÑ³‹ |AX‚0}Ž{tsim(§Î¨Án³P]`–_mf 3xg˜“w}ÏÏ€ãy'KÇ«fjl«ñëϊ¿cäXU›¤È<™Ÿ»® ž£(!Ó‚aÈɧ©ÈD°ûg¯ðåj %k½•Sû­‘‡dF˜o“ç…y2g`¥@x‚ |ÓŠŸŽoos|x gPKEI)ÕæSúÄÊ!úî p䆇7„9ÇJó®rŽéf¿öðÞç?â©ßNóý~ß…SoVÓhLp^²Ìö3Q[Í¡±aN »z¬¥bs)퉖7öÇö”Òh™]8xøøêgî{™˜ý: ÛÊ9µÕôd†púá(Ç¿½Çå‰ ,öbNÕÚyU¯h£y„éû¶—ŸßÏåë7˨œ“Û7ÊëŸóÚϸ¸QñKÏ'†§z yV+‡jÊùmÁì !7¿þ÷›ÐPËÅ¢¹E çÿó;ޝ¯æ¿÷š1,iÌ>k“ —¾úŽ_ ½oS4×d`’_·ßµcW¶’´É"ýf©Û\BóB‡Æi7¢ÿa7À-*ÚLœ}«ûõï8ð°”ÿþU>6å8R_IÞ8:.o åSŸtû=Bâ\HÜO:òIMŽÅmðñ…^Z§n²©Í§Í%jöI6¦C>øüGœµ¯Ð4<À‰û^<: ;*8eópä›a:ÝA0Y9úúVÞ]¯y*G¼ÜõÕb±—R}HF¿Y;foåö¾\r€é7©èt“W¹Þ`ðF/{¯8÷V —.:ܱ›?oN䣧öSËÕxöZÄßÿü õ±)’è:‘°'’uñ¸;ÿ§9›øëªìÓLø±š¦[ŽóHHÙêFn_¿ÉñÇVŽÕWqºÒÈÐp?ûç.ÂüÐó=?¿: öœ®-¥QçáLç÷ Gµ¦Ïq“Ã÷5ÔmΧT§z^²„é»~“ã^ ÿR[ÅÙ*Cwû9Øç[âø —þrwú‚Tn+ãt­ÊG£´|58»ß3HG×´‡©./åtm)Ͷ—{ä¸kVÎÀ$‡/p!háОrNVš Ü䟮º™NÊFshØTfÅüØÍ%ïÓO]ÎqncáP6"ן¯ñNŸ—¢’N×–°/ËÍɯ®ñÁØòï²ãû<‘MtÔ”›azœ®GOÛœ¥#Í%†l„¼œ¸ì u8Due§«­0|‹wú£g‡µ«ãÀ¾íœ.¬¥|ýf ÆÅ:KG ò+É‹B¼%”O%~gy~G!úIG>)ʱ8šöoç¤È+çë7+¨ÉR±Oª5-LÏÕÛ´¯³sêµršM>._¹Æß_²2ÎÕ—PtÓúÍèìÞ\…ÜO)ö‘¬~:vÛuàšd09ð~$ 'Æšk²i©½x3¥|’Ä1c¤¡¾ŠO6Íft‰ WûôM…À¦Ã?=IÏŒCÿXαõ ŸzK?'\!<@N6šÃ`ͧ&kœ§Ÿc¤çŽ *¨ÑS㿦bO5Ÿm‰hÕTbÁ|ñ{Î\›äØ2ìÄ÷y(±Ml…TÓOûX·³u@GÿXKÙ— ¤`“é±{´MkhhØÎ'E³¾*1ñëÏûé™;H¥]£{–² سuX|P7Žúѫȋ‚m•äK?+ä÷„¹ ÐiÈ'³ªKc4`Ëô:6eë0„ü‰í“BLÏ¡·”p®Æ† ¨3z¸ô_£äUWñÑÖHn—>g×uBPäMœûú±b/Ië§aÓ& æ¾)z¼ðª%ˆc,H^ ×$}BlY>:ܰi‡©Êãæ‚J­ŒõwLû ¯ëÔëq)Ê‘,Ë®…K¾H®.5žQÉýTc/)é§7Ñh…#Ã>\Ù“ bâ}›ýºAºÆ‚LdM1¡³Ð³¼¹ªx~Qª•qC"ñuâAõXýú´8Ë=ÿYðãruG¬š!ô:-`äèþ êÜìi±ëYôÁN¥óV z£‚ÁÙ}Js„q=òÐ) :ùMç0žÍeœÞk£Þ¢} ÅA_Ô¶‚b>ùU1þ€‡s’vÇ0G¿ b{«ŠºuͱE¶ œwùÐ÷{  œšÙý¨f]dŸïDyÑî™ AVlŽ&Äàr˜~¤h{! rÞÄ|wŠ@^u³ò§âÃ: }L‡ˆÒ9ŒÇû4À2W*ý8ä]€¢mUˆ?)¡ê÷8¹°Oñf,ùWލ/™Š=•ÜWÉ•ÅYº>¤¦ŸŽšMF7\ôŒyð䨩4Á¦¡íþ=Y>ô¶’ÈJà ½ õZ9GâëÄòûXIæûôyõ£Ùê! ës©ÀOOGåzÓìŸÆF8qgé©…TÏK7y63f¦h~Áçâ?]£ÅÄ?5ÉmL¼¿£0r¡ü^ލBâºÉO¿¸EG z#»7szo!æ/=Þpêº-¼a ÓÓçäÌX˜êrË“åМõ¹ØñÒ~?jXÈËùa?Xsç=;}±›š¤#ê§TP± ÙVšsfåw†©Ùj}ºœ›´M4ØífôÁIÎÌó•›6×Óÿf*®÷£&o,ʶU!Nü¤B:rA…täS:äH–LÅ^âÜO.öTëCªúåXÉ{ÒI<Ÿ>¯~#3¾™ÂhãÃÍ÷x£ËÁÁ‡Å4®‡>ç8mw½ÔÔ—.Jç…é»v“#&ZfŠK3ÛFŽæs´ÓÁ;Š©7…èº1ˆCgãS»Ãc3vFøý•A%fr»i¿1Π§Ën§f½ ½w„à n±` zè¸3Šg]~déG›¢ÐQ_fähï(ÌœÞ?eÉç˜ý-W|´‘Æõaznݣݫ㽹‘ŽÖ@]œì½Í ]15xi¿>‚g™³†ìÄ6©ÏÖê·9Ú;Bw–…söèý†ÉÛ$§`#‡r¾çL§ƒ÷ªìÔgûé¸á¤'zÖ"ÕxL•~TäAɶëT…Œ?) "[Â\PÀœ†|ò'”#qmÑk)7.u*¯RÍTì©ä¾Jì%[RÔÏ“KÎÉe¯†:{ä,ƒÍŠ}f„!Œ´.3.¢b/büm3ÎÓ'Ñu½Z*$wѨø4Ã~\–>BRÈŒoÆÐ²{ïv.ì0ñàî -]´ihªÝιMñ šÚy.÷Ž1oÌS:1ðöþœÞ¬¥çF?-]Ãôè 9{ œz=`ÙÈg{l乜´^éçÄPˆ¯ïæë]VÌ.'íÃ,ù¬ÞNåc'¯Üæpï8ƒÙvÎî/c·v96‚"{>v€<{Ì2µŽÆ×vr®ÒÈ`ÿ-]ÃtÌX8º'ÿúd§‘C¯—s ÇË™®›´\wc®®â”}™w 6y"ÿ†B6ú{ÌÛR°‰ÖıÕ´–hèéàðuž |YmŠÚ™º­“C¡%ycH¶*,?)–\HL:òIEŽHmñDö4.@Kee>A'-Ãô)=x“©ØSÈ}¥ØK¶>¤¨ŸÖD£-Ò_ãÜ{ˆMÖÈk¯ÖYÙ­|#—**µ2Æß –ë\'”úP!•¸‹Fŧ™ôãrõ’á'n·ûo/½ôÒê q¶›ÿ9T·ª2Ï9³?ú¨ßÍ—i½x k‰Ÿ8„¸Ôq}ýÊìùAx¹­›¿µÔ­hüãeÆWx1˜sâÀLóJ/ /$?qy€‘¢U}ðH!=È_áù&àáÒ]çS`ߺį‹ ÂHü$ L_ßå%OÒYá9FJ™ð|ôÐvÝIŸ)ŸÓµ¹ò´¬? ÐP¹­œW[ A„4!_áù&ÛΗÿ¯}µ¥žW$~AÖ²ÇWAAXÈÀWAAXÈÀWAAXÈÀWAAXÈÀWAAXÈÀWAAXÈÀ÷™'Lß·ßñò'’8gp`„? ù#ÿõóz[7[¾ñà_!)£ûþá¯×8ø æGÜÓ.CŒŽ*„¦8øoÝüb(4ÿß±OŒ¼!ïýG7¯ß ®XàãÄݼܶÒý$"¯2Ÿ™$³>w¹Fùà«k¼òoݼÜv…-_8x§©âÒ¥î%kÉô=/·]ããG±ß¨ÆQˆ®Žo©½•À‹‰ý•íÇ?åä7_tór›ƒKØoW#ןöüõ"ÍD×Ö%]º&jçiüÿbhqú]ýliëæå»ÅwQj'ÎIxpçÚq$¬2ð}! 3xg˜“w}‘D–ŽW ÌÔØ2ðÚæ  4Åö•vbt\±OåUÄÿpœKÞÈ¿oߙĕ¡~’@÷LÆgFɜϧÇøùå.L4í*çlm)ïhè¹~“½]®eù^5ަ]#œp®ô`çY LŸãÝÁ\ZʨÓ/ü>Ó¹.dGÿÔ"ñ¦ïÎ$ž˜OW2'…åñ¢]i„ÅÐ[9µßš‘®üÓãü`ÌçhìÅ ƒ2$ͳ,[ʄǙe¥µÒOëÍQ:|…¼ý,þ$ï iÿLâçü·£L˜Šùú@ÔO —Òd¿É®®A~ÿ0—SëSi;qM òη.z¦#³a›–«Îs@ †œ|šŠLòkk“\£ôl4F_ßB^.8C˜s´x¼sªæ¤Ì=®2ðM!7¿þ÷›ÐPËÅ¢¹@rþ?¿ãøújþ{¯ÃÔ?½èâýýŠݸÇy§€ÉLö2No1a˜k+àá㫜¹ïe"ËHÝæšcû‹>fôëL4l+çÔV9øùøB/­Ó7ÙÔfáÓæÎÿÉÁàŽÝüy³Ÿ÷>ÿ‘‰Új sbØÍÐc-›KùhO>¥sòqþj?ÿk؃Sg¢a[)‡¦nóÆÃ2n7.ýӮΡ)r6/ü>äá½Ï““aúá(Ç¿½Çå‰ ,öbNÕÚyU¿ˆŽÿü õ3ñìÏÉË–œ}÷ÉÜwßÞæøðΠ–Š’R>ªê‡}w8rÃÜc¥yW9ÇŠtñ4ŠÈ7Do·Ó´ÅGûÍAÚïy{‹nþ1 uHÐÈ“À^Kø*ºò¤bÿúúé¸Þω»S 5Ø ò9¶§”FËl>ÆÍ™KÇ[*¾È ÏC!†‚ ·YÙcÛ†Ý<¾„ÑPˆ#ý:3 e:ê^Úo&3•Àiñ™B?‹ÉÕ3À‰á)†CžÕÊ¡šr~[ e®®vÜ¢¢ÍÄÙ·¶Óh|znFs]åzWŸYy³·r{_$ç§ܤ¢ÓM^åvzk"צÁ½ì½nàÜ[%\º˜l~Æë_Ý×jº*ØP©…˜×çS=æ¤},DãÆ§²û§Çéxl¢iC˜¶»sb¬`N ËFn72Š—“·éÈÊåhm)Í?—¯~Ïs{âB^N\vÐ:¢º²ŒÓÕV¾Å;ýÑûŠ‚ttýHëp˜êòRN×–Òl q¹÷GŽ»Â€¦ýÛ9iòÊùúÍ j²båÓwý&ǽþ¥¶Š³U&†îös°Ï7û½ŸóßsønˆêêrNW[ܸÉ;Éö¨ùèpji*H0(S‘!0ÉáË\Z8´§œ“•f÷ù§«n¦ÓQ›È.Énû,í“Û×orü±•cõUœ®424ÜÏÁþ¹Ò0?ô|ÏϯN‚}#§kKiÔy8Óù=GÆâëäŸçÒc- [-ädçÒœY¦~º‡MEÕþãÙk1_-×þ±¹ô—k¼Ó¤r[§kíT>¥å«A~E¾Oqã-_dÐçZ5ë5î÷søÖüýƒhͼ»·ŒwçÍ,…ñøBLæÿy ßÄq‹w·óÛêB*Ôš¥‰o‡tøL¥ŸX‚tüùïôy)*)átm û²Üœüꌅömçt`-åë7«h˜·Š’A¿«^/è³Û®×$ƒ¡ˆƒ÷#Ó–cžÙåû Ž{~°æS­‹£žŸ‰úWôµ’® 6Tjg tš ÀÑ7_a†&™°æÓ`‰:6éœ2‰Ìøf˜€­‚/_·a(³QÝÑK‹ã?”—S:v¶i Ûù¤(⚦¿þ¼Ÿž¹BA3Fê«ødÓì³Ä„«ýGú¦B`Ó‘c4`Ëô:6eë0„yv¾|½˜R€"ÓÎï8:æÇ¿ÍG81 Õ|4'GÚ‹ƒ ö1Íã‘›KY6>Q\N+Ãô$=3ýc9ÇÖk€|ê-ýœp…ðE tô&´K2¤Û>Kúd]1Ÿ=éLjßÙKë˜ÿVß$­}~ìUÛ¹°32óÒTfÅ~á'¯¹ø]c~$Žf莋 ].‡ò4€}[Œ´öŽÒõ¨·³Á¯¢Cýdz×Ý—iÿØóýG8תùhv&¦É¦¥öâ=ÎL”òI^âœñ'ˆ·œ|‘9Ÿëh¬ÝŠãÏ·ië½Éå^ ö<+õs9°!—Ý–˜2?=ÌÏ?^ÂòÑÉ›8Ž–E<;(Ô¹„>Sé'V¦©qŽßS±§šÏ¶D¾m*±`¾ø=g®Mr¬1›Ñˆ=KYì‹Äs¦ü>=¦p½PÐgÓ& æ¾)z¼ðª%ˆc,H^ ×$}BlY>:ܰi‡‘¢r~ªØSÁ×Jº*ØP¯ÒÎ’h©.·Â_Fé ä²OàçÒý Ûr±ÍŒF›dN En92LM•5ª€éhØfEôÐã ãtzèl¼½dÌåPATZÇöoR ü>/]wGé™fÔå°oÈ­H£E- NŒM1‘eåP´–ÈlO<8]6Y)Jƒ †ufJñÓþ×>~àÅ‚¢²r>ú™mñöÓdÙRµJ?6ÝSyýÓ.ú0Ð\µ#[àvÍÎÐ,BÈGûý f{>¥„ñ‡Â˜ r±ã¥ÝéWÖ!™þãÙ+’ioÂåfsŒ.v¾|k'§ò4J±‘(ÞRö…‚niñ¹Ñʇ?cèÍjÎí±S£lýxãâ·¼Ò1J_ôyëò9ÝPŧ1çªbîXâh9ijC:|¦ÔO Ó'qbâÝ QÃ7­‰¦¸'“òs2ú&ïwµë…Š>†œ|ª³üt> BÀK§WǾJ;›f¼tzÃø§'qÌè¨ZÉSÍO%{&ôµš®‰m¨xƒÙVH S´ÏÍVOsÉk¤É®c ’ÉI!£ÈmGFÑQdŒ¹×Ð0ãÁ9Æÿ8 :#9ó¼¢!Ϥ…¨U$׃Ž;Æéqû˜@G…Mem>æì¥\Æ3!fŸª–øÛJƒô „iØ«.ËÒ2Ù…œÛâHÏ­ã´ö¼|Þ¯)åí%žþO‡]Ë–ª}’í¾ üœ¼ØÍÉßj™˜aÑ öOÒñ<Ã?R;±wÇ̓-ùJ:(õŸ•XTPo/LàQ8’Gó–Ù5äŸú?al$ˆ·T}‘¬n)÷Š|nÈ6³o‹™}[J ä§«o€–ëtXø¿;g«3QS´ðuzF;ÛP„ÄqT¨|“»‰|¼\Ÿ©ö' äÅä²Ù¢…™ž$üKºý®r½PÒGo¢Ñ G†}¸²'ÄÄû6 úuƒt™ÈšbBg¡!çéµKÕ¦ªöLäk]Ul¨W¼Æ.‰ÞÌ¡x§ßÃôF+÷]8sììË^dQ)'ŸÅ§_|dà»b„\°m(Äýtu0ˆ ö, †uú˜žM˜a<Þ¨[ÃGN~Ó9Œgs§÷Ú¨·h!äáƒÏô¥En úl ýóöÉAˆA`©ÁÏÍù+§,K|Ÿ¶‚b>ùU1þ€‡s’vÇ0G¿ b{«jv™)Š·Ë)Ú'ô:-`äèþ 괫žè,KäÕ:YZ_+¡ZÿôsçÛ´Ü,SïVÐA©ÿUŸµÐ 7jfó(š0®G~:#EAµØˆou)ù"yRñ¹ÿá»þk’}¿Ü5ÿ)q­úmeün —V§×ÎdÞœ¡GËÞî°Šù·F$±ßx³.òÛDyWGÏT²bo®ÒG*~W¹^¨é££f“‘À =c<9v*F°ih»?EO–½möÍIæ»Rÿ ¾VÑUņN•kl\´T—[ kGÀ@߀{Yä&2zß»zNÊÀw5­id::y¦&éðÆ¦§?zc|î“c6IDATtfªMìv3úà$gÆ¢Úñ¹i‹zPÚ?5ÉmL¼¿£0R ¿×ƒ#ïF·X0ÏD-çDo/¦©ÈÌ«¶¹? ÛòŸ,S«èRÿ«@žÍŒ™]|.ÞùÓ5ZœA¥ØHo™²E*ýLV* rÞ±È;v^z¼ ÏÖaNFÅ8Z)Òá³TÈY?»•ã~”n!/ç‡ý`Íó&ˆå‘¼ßÕ®ªúäXÉ{ÛOÇ '=Qw¯†l3vFøý•A%fr»i¿1Π§Ën§>ôZ`ÊM§Ë@]’¯H5ØŠùuœÖ¿üˆ~‡ú,—nŒ2±älfˆž»A^ݱðÁ£T1¯7¡÷Žp¸c€Á-lAwFñ¬ËŸ]r Ï×QÅ.ëÒ#[òö‰´OŒ6>Ü|7º|XLãzèsŽÓv×KM}é¢"¿{”Π†šróÂïM6ö­¡íŽ›‰_)èBÿJºÛŒi}÷©Á¶‘£yãítðÁŽbêM!ºn âÐÙøÔ®Ãð8qlÔ$Š7mj¶È„ÏÑ[ùp‡‰½×o³ë‚‹¦ *²5xMÑy×… 'wY0$1]§GËÝî°*u.¡ÏRÁ’Ï1û=Z®:8øh#ëÃôܺG»WÇ{s—x˜t!™ð{ŽÂõBUCN.5:'—½êì‘:n°Y±ÏŒ0„‘V¥7õ,‚Jÿ*µ[EWª´“½…C6xçꘊiZl•S9'…Õ@f|Ó‚‘C¯—s ÇË™®›´\wc®®â”=ö¾BGókåì~<Ê‘+´¹´س‹sOÂjM;PMk‰†ž¾_wáÙPÁ—Õ¦§ç-ùl<—“Ö+ýœ qàõÝ|½ËŠÙå¤ýaÐRY™OEÐIKÇ0}I?ÜeäÝÛ9¹º¯÷sØ1…¹úÎnС×knâx8ÿÈÌ©^lÁ`ÙÈgõv*»8yå6‡{Ç̶sv»µ°@G“Š]ÒE’öay•|¢e÷Þí\ØaâÁÝAZºhÓÐT»s›«Ôs¿ d¡y±}ÐZ#Mtà¥ë‘ŠÉö¿´ótOûöoïßÉéÍZznôÓÒ5L¾³ʩף”3*ñ–¼-2ás ¥Ûªém(¡AçåRß G¯ðû»((áÓ_W%¹%!™8J¦Ý$H‹ÏRAGãk;9Wid°€–®a:f,Ý¿“-Pm4C~W¹^¨ê£5Ñh0Ò8·4o²F^_¶ÎÊî”' úW¹¦)éª`C¥v¡¥¦<2W›·a©UÎtç¤N~âv»ÿöÒK/­®g»ùŸCu«*Ê35ÂO/:Ù÷Ë]|øÌ¿¿/Œ?m´œ!º:¾£eÝ+‘äX5Ùž^û¼:‚ / /·uó·–ºíãü£Ìø ñ?f׿÷r$ú‡ÚÆÂ”,òîË5Æ‹`ŸAAAHÙã+,ÀSÈ¡''¿ bO!•ø¸ì +çìi|mÁsÊ‹`ŸAAAHø Ñùíþ*J~%žM“ñM’ñ’°ï çÿó;»nQÑfâì[Ûi4>=wÝ›KÛ5YUò{ÖNžúí4ßïçð]8õf5Æø:^úê;Z|%ô¾QLÑ\I~Ý~ ׎]\© ÎË«y±˜e¤ns Í VÐO©%|϶ õG­6,߇IÕ ¹>3Ë©›J:ƳS¬Ìfþ)Çç1:œÿS&ê dÙê6¼œì¸MGV.GkKi¶ø¹|õ{Þ¸5·è¤£ëGZ‡ÃT——rº¶”f[ˆË½?rüÉžÝ —þrwú‚Tn+ãt­ÊG£´|5È¡ØþüœïrÐ:måôÙA¯R~Îw~Ïá»!ª«Ë9]m!pã&ï GïC óCÏ÷üüê$Ø7rº¶”F‡3ßsdLaq`’׸´phO9'+ÍîòOWÝL/yR˜¾ë79îµð/µUœ­21t·Ÿƒ}¾§öûó5ÞéóRTRÂéÚöe¹9ùÕ5> šöoç¤È+çë7+¨Yô¶.LÏÕÛ´¯³sêµršM>._¹Æß_²2ÎÕ—PtÓúÍèì^ÇD6]¬_5?Þ¾~“ã­«¯ât¥‘¡á~ö/µHšÈ>*~%‘MUûN%^õ­ãÀ¾íœ.¬¥|ýf Æèó±{–Š]SíDù=k'ÇMß×P·9ŸR]bkÊÍ0=N×£§­LÒƒ‘æÃ|B^N\vÐ:¢º²ŒÓÕV¾Å;ýIæ®R;‹ß¶ õG±6,Û‡I× ÕŠÇ(’•9áñ‰ì+óVþe ž²uH2‹Ìø¦‘€­‚/_·a(³QÝÑK‹ã?”—ó*A3Fê«ødÓì¬D‰ WûôM…À¦Ãÿp„ãN¨{­š6F\ÓdÓR{ñg&JùÄ4×S®¿:8ì4ÒúË š²g?©õqb ªù¨h¶µñÌ5µÏ½j;vFf´šÊ¬Ø/\ãä5¿kÌè¸þéIzf úÇrŽ­×ùÔ[ú9á á%ïø=ØùòõbJŠLL;¿ãè˜ÿ6#†©qŽßS±§šÏ¶DM%Ì¿ç̵IŽ5æc3°ez›²u–èGo)á\MÄOuF—þk”¼ê*>Ú9£ôñ8»®{x‚"¿åÄôËÃÁø~Ì›d]1Ÿ=Ñ׈ßÙKë˜ÿVâ²Ç³*~EŦ*¾I%^”üiÄž¥,öEükwCȟخˈíøùaâq.—ß,åU-05ÂÁD:RM?ícAÞÎÖ!ýS`-e_6uÿ1=v¶i ÛùdÎÇ%&~ýy?=s)è§Wig)âÙV¥þ¨Ö†eúМl Z­xŒ:?Ùº™ðx•X_P35‹ëEÚë d™ñM#5UÖ¨‹¦Ž†mVôA=^@kâØþíO.~Ÿ—®»£ôÌ3‘3&\n&0s¨ ê~ÄbçË·vr*oÎUa×äŸî!ÇÆ¾è¥s•>Ʀ˜È²Æô‘KsTUõO»èÃ@sYÔ6 Œ4n5‚ÛÅà‚ÙçùÖ™)ÅOû_øøWŠÊÊùèg¶§Ë¹‹`ß)¦e(ŠZÞ›~8‰ïnˆºThM4•À=™P¦ùý˜ŸøÉ 3`FÇ«O—HÍë´@øI‰l‹šêkÓ-ÝæbÇGÛGů±$cÓx}§/éôg,ñ캜؎›ßOúΧR›„ŽF+ÍypûÎ.€€‡ö±0[rcr%ŒÓé! ³ñ~´¹*xúßÄú©µ³qcV!WTkÃr}˜l Z­xŒ&Y™¿Ü:®ªÏrë d™ñM:ŠŒ1÷:f<8g€׃Ž;Æéqû˜@G…-ú~?LàQ8rμå% 9ÆùÇ ii®²pþæ0ÇïåóÉÆ§nLÔ‡g*:CÌì–yÛÿ|Aø9y±›“ ôÔ21CüÈÉ.äÜþGzFhí§°çåó~M)oÇy:Øœ½ôwž`d;C^Ì6L³E 3!<‰dŠfÁò,¹íD6EÁ³œxú.ÆÒÇ«ù5%›f%–5•xI«?cH·¬å÷lß–§3j:ê¨+3ÁÕq5®Qºg̜ڰÐqþÇaÐÉ™'Ÿ†<“|êúéÚYŠD1›0Wkò}˜d Z­xœG²u3ÁñË®ãIë“Z„L#ß´âXõQ0ˆMdyì‘“ßtãÙ\Æé½6ê-ÚÙ‡­ô AoÔÌžM×#?qö®_C]}§6…©ëåèÕa~°—E–VUúÈÖ@гg,ă 0[œô:-`äèþ ê,-öx£ÄYlÅ|ò«büç$íŽaŽ~ÄöVûÎŬ‹<`2d^Ôz¦B;ÈL# m‹‚Ó.«š_cI—MS‰—Õògê± ¿AUG›½ 9ï b¾;E ¯Œ:ãÂö ë4ô1Šn/ŒÇûtêNE?§B;)¡˜+qkƒ‚ßU}˜L ZµúC²u3Þñui¨ãÉ‘Z„L#[ÒF˜žþ©¨„Ò}c’€ÎLµ üS“ÜÆÄû; #ÀïõàˆÚóŸg3cfŠöè‹|.ÞùÓ5ZœsjÈËÖš~VŒýñ(‡g,PéÃ^`Á<ÓÇ#7ç£*•a}.øéñé¨\ošý3ÂØ'î$˜\C7ùé·è€Aod÷¦bNï-Ä<ã¥Ç›Úoä¬ÏÅŽ—öûQ{ÎB^ÎûÁšõ´wzQ±i,j~L/*~%]6M%^VËŸ©Çvüü^ e³­4ç„éésrƦf«u‘}Æìv3úà$gæÅ•›6W2ú©µ“ *¹’ŽÚ âÃdûY­xŒ&Y™¿Ü:ž ©Ô!AÈ42ã›F÷oñ‹o6ò[»–Áû#œq†©Ø±‘j-²ÍØá÷W ”˜Éyì¦ýÆ8C€~xœ.»zÛFŽæs´ÓÁ;Š©7…èº1ˆCgãS»bÆL†õÅœ.åëœßü MJ}ó;ë8­ùý;õY>.Ýe"únÜhãÃÍ÷x£ËÁÁ‡Å4®‡>ç8mw½ÔÔ—&|y½ ½w„à n±` zè¸3Šg]> 9)ÞkYò9f¿GËUm¤q}˜ž[÷h÷êxcoî“‚^ L¹ét¨³—ýê%¿eÇö›À+ðs ¿Æ¢hÓ„¤/iê{žÝU^7ºŒØŽ—ß,6Yª¬£ú-FŽöŽÐeáœ}ñ²œS°‘C9ßs¦ÓÁ{Uvê³ýtÜpÒ“l“*¹R“ŽÚ  £?Ù~V+£H¶n&<^«ëók—nY:¤T‡!ÃÈŒoÚÐÑüZ9»räÊm.-ölçâ6cdÏŸe#Ÿí±‘çrÒz¥ŸC!¼¾›¯wY1»œ´?Œ¼^æíý;9½YKÏ~Zº†éÑrö@9õ‹.KiÙ½«”š¬)Ž÷º™VêÃÈ»¶srt_ïç°c sõ+œÝ C¯×ÌîuÕ²{ïv.ì0ñàî -]´ihªÝιM‰+˜Á²‘ÏêíT>vqòÊm÷Ž3˜mçìþ2v§|«¥£ñµœ«42Ø?@K×03ŽîßÉ¿>yBKee>A'-Ãô-såPô[l¿Éú1¨ø5›ªJ¼¤£ï»Çy0py²Fä›ßËÔ±hC!›}š¥bDkâØjZK4ôô pøº φ ¾¬6EùWA?¥vR@!WÒSë˜|?«OIVæÄÇ«ÄzlíZž©Õ!AÈ,?q»Ý{饗VWˆ³ÝüÏ¡ºU•aYLðÓ‹Nöýr®Öï%ÂøC`ÐFË¢«ã;ZÖ½Âï5ǹ Ï.â×ã¹ÊoAXM¤ ©ór[7k©[Ñ>>þøc™ñ]kø³ëß{9âŠÚ3ðÐ6¦´`ñ÷Ç Ï>âWAV©CÂó€ìñ]cr 9”ãää7Tì)¤—tcåœ]6b=¯ˆ_AXm¤ Ï2ð]khüvž+ƒœìǃ»5—Öýeì[äJÂs‚øU„ÕFêð {|AA„UEöø ‚ ‚ B‘¯ ‚ ‚°&¯ ‚ ‚°&¯ ‚ ‚°&¯ ‚ ‚°&¯ ‚ ‚°&¯ ‚ ‚°&¯ ‚ ‚°&¯ ‚ ‚°&x&¾ö¿ÓóÀë_m1AA„ Ó÷Ћýïôéë™øþCáKtÞ›\m1AA„ Ó36Å?¾”‘¾ž‰ïÁŠ|Ún9W[ AA!ôÝrr°"?#}=ß×^¶°u½‰Ãí_mQAA„ qø¯ýü¬ÀÂk/[2Òß31ðøìµrú>’Á¯ ‚ Âàð_ûé{øˆ3µ¥ëó™ø¾¤×ò~ù÷< †ØõE/çúœô=ô®¶X‚ ‚ Bšè{èå\Ÿ“]_ô’üŸ_þ=/éµë?s=)ð’^ËÿÞ¿•¿üÏŸÜç7àüÿ«-– ‚ ‚ì§ç _â“ÿ§|-Nœ:Îùãßþ•;fȼ3î•WBžûý†7/òúòµë¹°ð_ÿçÿV3Úsóöíð›ék>¬xvðS=ö?Ê⑳[í?ãfØ¿sÿÁÜ9B!„x:ð"•v™—…‹eƒÉ­µX°pa6tèÐd!+óÒv0&¿ßh†yṞ»p1˜–÷÷ïÏFŽ™íyÿýlÉÛogó,ȅϾbª#.Œ¼Œ}e|«ý“§¾™ ><ûæ·æÎB!ÄÓש´Ë¼Ì7/{yìØÜþÛwïe7oÉþõ_ÿ¶ÿóŸÙÛË–eÏ 80[¾reöÏoI4ûÓF-`æå½Ý»ƒabªÔ[sæfûý÷VáŽ;ÒÄq¦3!ªcõç¿þ=[½vmˆ£ÿóÏgÓ¦ÏȾøú›Vq<üêëìÍiÓCÆ qÄǹŒëL˜.·}ç{ášµÒ¿üö{¶hñâp¿œ7û­9Ù£~¬ÿöûZz¡+ég$‹)xÃ+îØ‰“¹¸àÖgŸµÊ7`#^üþû?þÂÅæ…ç‡'~‹¯Þ3òkåêÕÙŒ™³BÚ>½s'Ûà@6éµ×B\œÃе7riϾb*ãðÙ–òzüâå°}ñ“Ûa{ï‘ãÕ0ßþã_Ùú-Û³ÁC†VÊ^ß`n>~ðU«x¶ìÞ¦¡ñÎŽ;.;tú|îZB!„è>x ‘J»ÌË©3gƒÐØðîÆ` üq`T†©M£FÊÎ]¼FY¾ðBUè?úñ§lמ=!š{3b`^zôèQöof/_É>8t(mL†…9xäHÖû¬ù»ÙácÇÂ6† ŽÃqúì¹°Fñ=èŃxçø·CÑ¿ÿlæ¬Ù­!ٮ˽Z# â´ èë/Õ=:äñ0j1~„3f^ˆ÷‡—ƒ±YÿΆpí¯¾}T'ç`V­Y~³¯žyÁ@}üé§á8yckcÊž`^H ñ‘/fl09/½ôR8—ëûtŠg _1¥ðÊÄW³ñ¯N ¿§LŸ‘=&;¾hÙŠ`J¶îÙLɸñ‚Q±0» esÓÎÝÙ‰KW²y‹ßÛg¯’»–B!º^C¤Ò.ó{÷í ˜2ôáÕk­ÖC=~"'Àð¬•1:mŒ©hñhÀ™sçÃy6ròå7ßf¾üªÕyŒÎÌ™;·ºQÙ´ekuû‡_þF_î~þ zÄx<Ž…WÆ¿‰Ÿkb~ìøþïÿÒV˼°˜ž<ˆÒc–a„ŠíxäÅÂ`ØWkôü´±zæЦ¥<#Ì #3ñµyÖ˜­Ÿþþk6ùõ׳5ëÖµ:.ž=|Ŕ©Ë×C™|wû{áo8TÝwó‹oByeÔ†íYóædÇ™Ž6sî¼`jüµ„BÑ=ð"•v›@à²öÐ`TAË1 SªøÆ÷?ÿÂ1 @˜Tóâ×¼`d¼‘àKgŒÎ 24˜ƒž={foL™R=Ît/ Ì¡£G«iŒaÄaíúõ­Ò‹G,ýÇÿüï`$¸æ?ÿã?[WoÍ æ qï÷³6ÈîÉÌ‹Ÿv…)ܽwoî\£#ÌKÊ3¼˜Ñ2H«+ ä;ÞÍ¥O<[øŠ)•×Þ˜Êë_â¯mÿƒ°ÿîw?eßþþoUX³fãæcÃûÉöÕÏ>ÏÅ-„Bˆî‡×©tˆy‰á d‡)S§†mŒâ£›ŠÕVóˆ{Œ¿1$Œ0‹u+u>ã›F3X7Ã"s®Iœö™_D»Oc £4|ŠSäÓQϼ¼þÆ… ÙûŒòð»žyaZ?×èó’òŒŠÌ‹_1¥râÒÕPÞœ<ÓjÿÚM[reÒ˜¿di5ܾc'Ãè &fȰaÙÖÝï~‚Y!„ݯ!Ri³yaäµ.¬-ñÇ0ˆFFX‚AàÿÁxlI[Í‹yaÝÆ’¥K[…at#6/1¡3:cÓÍ0 ,è÷i¦’ÙÈ‹_ßQϼ0u ã÷§Ž¼4Û¼¤<#™‘‚¯˜R±…ú˜˜x?ëXzöê•]ºy'»|ën+>ýòQ.FhXÃ;½mïþÜq!„Bt¼†H¥Íæ…/x1ýŠ/Xùcˆ\ÄæáͺÓF¼0ÿäé3Iæ…øÃ&Ôm­Ÿî%œÇl°ÏÌ ‹ñYXΗ²,Œ_W2múŒð6ã/”±†ç·?þ ¿Ñ!<‹îí8ÓÉê­yáãä#7¶ïÿü·/~ÍK³Í‹Mc½ŠíKyF2/"_1¥R˼\¸Ñò û™ñÙ£«¿ÇM˜LN|œQ˜·,Ê]G!„ݯ!Ri³y<#,LÍbôA¼qÓæ0u‹¯PCÂÔ(ÖTðO,1|E‹Ï[¯¾}këöÕ…óL ñ2‚Á׸XÏׯøÒ—…A\1NzXgBúXƒÃqL_ãË_ˆ|®K:{÷î}óÝ÷! ×'LFâúÇgÓgÌl5rÂý’~L _›V1<\§–ya” Ó4¦b¤È3Îa¤Sa¡³Ì Ÿ¯ÆHÍ›??|5Œ})ÏHæE¤à+¦Tj™xsæìð®³þ…/ˆmÛ³/|}Œ…þ_±~Cõkdg®ÞÈ6½·'ŒÖì9t4—B!º^C¤Ò.óLCÌóÉ^Ö‚°hcÁú óãßþÊ#† Âúؤ`*8ŽaÊ–¿`^˜~ÿŸ FrT08>!„Bt¼†H¥ÝæE! _1 !„Bá5D*2/BˆÃWLB!„Ex ‘ŠÌ‹¢Ãð“B!D^C¤"ó"„è0|Å$„BQ„שȼ!: _1 !„Bá5D*2/BˆÃWLB!„Ex ‘ŠÌ‹¢Ãð“B!D^C¤"ó"„è0|Å$„BQ„שȼ!: _1 !„Bá5D*2/BˆÃWLB!„Ex ‘ŠÌ‹¢Ãð“B!D^C¤"ó"„è0|Å$„BQ„שȼ!:Œ*•ÑÏþ+û{…ß„B! @+x ‘ŠÌ‹B!„â‰@æE!„BñD ó"„B!„x"yB!„B<ȼ!„B!žjš—/~ù§âGõ‚B!º¯Ad^„¥¨^B!DWà5ˆÌ‹¢Õ B!„è ¼‘yB”¢zA!„]× 2/BˆRT/!„¢+ðDæEQJ£õ›;® !„B”â5„Çk™!D)Ö q¥ôÝŸÿ!„B‘CæEÑ­d^„BQ†Ì‹¢)4Z/ȼ!„¢ ™!DSh´^yB!D2/Bˆ¦Ðh½ ó"„Bˆ2d^„M¡ÑzAæE!„eȼ!šB£õ‚Ì‹B!ÊyB4…Fë™!„B”!ó"„h Ö 2/B!„(CæEÑ­d^„BQ†Ì‹¢)4Z/ȼ!„xÖøöÿÊí«µ¿h_½ýO+2/Bˆ¦Ðh½ ó"„âYáÊí{ÙËã^Ézôè‘­Ù¸9ì{ôÇ¿gË×½“õëß?ëÙ«WöåßÿûïÿðKöæÌÙY¯Þ½³ “^«Æ±ÿø©lð¡!Ž—®æ®ñ´Òeæe㎽ÙsÏ=WÈ‚·—‡0S+jÞâ–ß÷ø-Û²k.®fпÿó¹tç®ßÎ…Òˆó¶£Ù}ðD6n«¹ýâÙ¢Ñz¡+ÌËç?ü-¼Ó{Ïk$LwãÁO¿f;÷ÌÆŒ—]ýìóÜñC§Ïg£Æ¼œõîÝ'ü=pêl.Ìû•ûµ0ÆÏV®·ÚÖâÖWße3Þš›õíÛ74¾³æÍÏ>{ôc.\ÌoÈÞZ°0{~À€pÎÄɯgç>ú$Îóíïÿ–9{1›2}F¶ýýrÇSâýâ—ß³ekÖeƒ‡Íúö뜽^ûÚäÁôÙsªÛ)y´`éò\vÊÕøW'å®Õ^F½<6›¿din£aº )Ïóëßþ Ïó…A/†g2áµÉÙÅOn7ÊÊW¾ÞxïÀá°ýåßþ‘ óñƒ¯B0p`6à…Â;ôé—ráR @ìZ@ÎY¸8ôâà¬ÿóÏg“§¾™}øég­ÎIÉç¡/½ÔáB™:‰ü©w¯)až0)/™?!äå'¿û÷;îqÓ{»³S—·…óß^Êuµ=³›_| μÅog§¯|Êœ¿ŽA'ž¿?FZÞÙº=˜ êîW'¿‘]®«8Ì7¿ý3[õÎÆÆÚÝ‡ŽæâòPv^™øj8‡rG¼[>\ÌÅoe“^Ÿ’õéÓ7¼§¼´-q˜.7/{Ÿ¬È‹­¸ôɽæÝ»³ûŽ„ßEæeÖ¼EÙ˜±ãrqw˜—)ÓgåÒw¾ý%þI#ÎÛŽâÁÿ÷9Ÿ49w\<[4Z/ȼ´Ä b”J¿gÏž!ÝÞ¼ÐðÑK7wÑ’ìȹ‹¡1kéµ»R ƒH`ßòµëCúe÷ÞÐø,¨4~þš¢pøÈQ¡A>pòlöÁ‰ÓAä` h}x`ª=œGâ± f¯½1%\ëÆç_æÂë·l ¡ÝãÖ=ûÚïŒ9sƒHÛuðH¸„*a>ºÿEîšÜ ÷á3ÂvjM13À=•†>ÆLÌK9©Ï‡øÂl=)ˆs¶cᓦ¬|¥àëóÂ1Þ™Ñ]ƒqâ=â}1jtx¿|ø2ÞûàPˆ+Ä]1ÕÄÃûxðÔ¹ìøÅË¡¼cbný}“šÏ2/í‡<ç^Ÿm©O Ïȇ§sÓï3£C½ïÃäe€p”ç¸óÅ îâØ†m;Cý†ÙÀ(ad-ÌÛ«Ö3»u÷ûáÙ/Y±*Äùþѹø Ê e‡:²Ä¹l—kðò>rï'íÈaò‘£Ç´zºÜ¼Üúê§Ü±"še^>ÿKp{0/‹–­Êío&µÒò¤0jÌØlæœÙ²Õïd/¿2!{wûîløˆQÙÙ«·raÅÓO£õ“j^Êz‘:“î= =V4jTüEæÁ>nü„Vû×±€FÀ.³úÝM¡·Öý]Þ>ö¹öq.||Îõ»ªûhˆ1_4¤>¼Aoù¦÷ödw¾ù!œïÅeJ¼_ýúGh°7ïÚS ƒÀ£áܸcWîšô‚bt¬MÍ#„û}|Fw5/µžsWò^xqp6{þâìæ—?VÇykìÜ41rtÖ«rĉùˆÏÒUë²·, ñ>?ð…GfºHÓü%+²~ýú‡û;~b¶nˎ쓇߷ŠG<4Z/´×¼0„>sî¼PSñ¾1mz«F®Ü¹„"•'½‹ôLRVccRÆDÈŽ}BCÚì§×’[zçiì©Ô™bñ"hHèÑ%}÷Æ‚0zZÐô–ÑXÛ1f•"Šk2€túk ãAü!ã}4Œä÷åÃ× §ÑïiøˆlÅú ¹ýò„4yq™/ùƹ~ê=Žë6oÍËÏ϶Sóˆ©?”!ò¢¨ÁN1/œÏ4 ò’X@<š…P¦Rn ¤Ÿð±1) C/)iG¤RöcçÒSÑáà˜¿oF­˜þBܤ÷ ’ÄMO*ŒòÏèsøí8ùåË4X~¥ccR†émäù’•«CÝCÌ~ž#Ë”7ö3¿“Qûçoc ¸ ‚ßÇ4TòÙïç9qßñ>Þ?ø~ È¼—œOQò–~ßüòÛPÿQ¦â0mÚ¹;ˆAÛÖ3Ç/k¨<¾á…Z楨ë6MD £ ~¿€ ¯ü~Ö“¬ÞP{äÁCcÊ}s¿þ˜§–¸,¢(^Ä<Ï“‹ð@ñ cÓ ô–³ÿÂOsñÆø<"}\“}0ÒÊoêZ˜2óBo'ç2å‚ùã¬ebqla˜þC½KÃOÙøs­Ø¼”…1ó‚Øãš&N)ãÜSV(·”c¯•òÎæÝSŽ0Vˆæw¶îÇ™+Ï{Hyç|îÑ8yÊÔjÚÈ_¦Á ­ÿ<1XœOuD¬‰°”01µÊ¦ Ák&®‘zaÉ´AöS‡ß&¬‰cÀˆidägêŒY!^£¬E`M‚Mõ".Ö™ù©™t&Ôê'.â§¼RÝýî§\Ãç3Ô3/¤òÀ´"Ì"yÎ=Ïž¿ †5 Äɽ15±JÙ$̘¤„A`³Íý3ý qM}O¾¶L_=ò£¿ QûçocÜ-: F€ßf^®Ýù2—¦˜Z ö×nÚ^ ÈáÖmÞF#0 ÷¾kI¿FPâx1[vOƯ=)¿‡á<»`(l¤èò§-ñblìø'Îe¯My³š¿qÞbvxq¹‡øšË×n#?f01/>]c'LÌfÍ]X‡Ñ %+×#FES–Ïâé¥Ñz¡=æq‰X{÷ˆ¼¶ðñG÷ì1…‚0&0R˜‰{¡LøÅ‚’ãÄesšyÇhì8× ¡²žW„t, h|I²Þ]zMi`Š(šŠR˼p „k¼kÖ‹v! ­g(.[z”ý~„N½.†{F¬`üŠ_O-qé©/"À惃i"æ÷ÇåÏ ¡>mÖ[A$‘Ïl# 0Ü„)3/ô°Çf% N~S¾I{<÷œ|á&ØRÂXFüX[çc£‹¶/žo# ñ¨#/˜Y~Ûû¯©"è\°< Ö—ið#§qüódDƒëx!Îý™¡L “Z¾©7âg‰àä¼m{÷?>ïÞÃ`”­LbnjM“ª£%ˆ>¿Ÿ¼¶¸¹N½éhEù õÌ ¦Š‘—8<†ñmÛ”]Ì]<:`åÈî5% æ…´Ä#Ï6Š—Ì$†Êž{g×ÅEÔ2 =m,¦È¼`œÉ?Uö­‹Âô-‡Á´J4ž™è"07ñh5ØHOQ=[†’:È·!]n^<ô0X˜FÍ #„aÁ8S¨Œ9 ÞS·cæ£äÓƒ)™6kNvêòÇ­ÀlÅá0Œ¸ð²bªL<ÑÓNcå÷#êmág=˜žF.ΦõÈAЏ¬¯­%ˆÅ:›„yUkJ]#yd ÌÔ–™φÞkÖU`¬ì fGh 0ýy±1I Sd^¬ Áûfáuâ½a:"‹é-9;Ž@¤Ì1}‡{¡W=þzU#ÓÆj=O¶^ˆ3Wßò7%LLJù‚¶ÖÀt>ž'¿mŠ`¼6…¼£ü1Í_·LÕ)ú$®‡´Äe1¦V>C=ó‚qÁ¬0%rAyEtsïä'u ÷ã×ÁÅÆ$% ÛEæ…÷—#ÞEg×ÅEt'óB'V¼††òÌ4¿¢i‡Œ(’?R¦ƒ÷>Þ×È´1Ê1Ó1}gt¹yiËš;îÍËé+7CÖoð¿XbXsB˜Ž6/˜¨cLäC‘1â¬7ò’r1LÛül˜jÆH‘?þðç?²SW>£6˜ò‘ýE#/˜˜øÜÔ‘™QD£õB{Ì ,e5˜Ök\y™ÿx¢áFJ˜"ÂÜhD‹éÕŒ)šòp£RGøïé=Ã4L·)%NU¨e^ Fªð "ÃBAÆÔ ¿Ð·Ä#8±â·­×ðácøŠ ‚'ž>“B™¸¬/óá9×ÿzÑã^x¦GÄÿ.¦,(ƒ~q;0º“j^èýôB”^íÜÈ‹ë™,y©¦È¼Ø×â8ß—k¿èˆŸQ"zÍ™wï“_Œ ŸLŸ3³—:m¬Þód=iõSìè¹µ)v)abÊÊ—ÑÖz0¾6òB/uÑè%ù™"<ÅЉï§ž±´Äpýx= ÔËg¨g^ÂÿM2´U=€çÞmäÅþßG|ž7&)aŠÌ f}¾¼BÑ;ÚuqÝÉ¼Ï “`S‡©锋ÃŒ¦1ºå;ºŠ`]›7õ6ò\”×1Ի̞¨5­ñ‰6/¬Ñ=flu›õ˜/°‘`*¿;Ò¼°€ž†yãν•ö0Êa_ô2cÂ?l´ðLïbô„øq˜Ø¼¤ÜéòF…õ)~ï:p<>bd«{´¯£±Ðžm¿æ…/‡Í]´´Uœ,Ú÷k^|ºd^D-­Úc^øÇ]”ïxÍ 5û̼ðE xš€kÔS‰«½P5aLº•ˆ?ŒÐã›G=nÂÄ`‚âóDˆéx_*eæÅ mŒûùñˆ¦Võza#]ô¶Ú>‹ñ'.=NÄ|Ê×Å<õÄeY¼ö婸+;4È4Ú Û‡À×2Å”åÓ­(Oñ4¥êT¬J™e»Ì¼ fǶ8eŸ™Fcˆžr Ã"ùx=KJ˜"óš ©Ÿ¾Ã—‘Ìx0Êâ h°ùò”+Ò¿/VVj­±*¢ìy2å ÁÏÝ皤ß>ó›&¦^ùŠi¤Þˆ?ƒlk^ì+YLMd„,žZG¯8qûº¡|òÞO_2—Uê ŒNü|Ëòê™ ˜7/”1®mæM™ˆÓhÇŒIJ˜"óÂs¤>óS»²..¢»™—˜0êÖ«W«²B]@0»!u„™wÊWÜiB'e¼^”a®_o]Ìm^×83F<ìK\üóE¾¼…™`=Ȟç²¡ÃøÌ߯p¼óÂT+D¿ÇÒÌZþ âŸuˆ{¾Æ13&˜‚û‡Ñ ¦yQQ¹úi«0~t¦ìˆ‹ó–¬\FK0HF¢8κÒ?yÊ´–¯‡1ò‚q²Ï)û¯Y¾ð)dú¯Ú°%¤aÕ†ÍÕ02/¢­Úc^h˜h°èÑe^;_²5/V"RøÂ bAÁ4 1ÂT§$„)2/@“}©‰ AC%8¦¦â·þÆ>z[Rö „§Abî1=OTàñêF¨g^˜6CÅwøi}Oš­áaÄcc£[ô°³ðÌ6„Q¦X·ýs1Ä…ÅMcHj÷Ìò—ó08þZ4p䋆cámÔ—IñFéåÙ"Æì«B6Û¦À ÖýµSòˆFƳ§bfØfºŠ ¹2ó‚°¤ ÊXpO'ñèÓŽÂ?ÛÓò¥;¦{ÆŒIJ˜"óöìHå’+Òo#G|¾”ó0r”kÌ âÙF‹ô”1Ê aÉ[î!,´þ+ÊHyž„ã W6ÒÇuèùåžãib)aŒZå‹çJþ™€o¤Þà¾y§y–„Ç(Ø×Æx?¨øšå…}P6È?K£F·/¦#q–6F¼Ù¦ññ\ÈÃøŸTr=+¯©ù\ϼ/÷É»Ä;Ë—ÜlŠªM%¤7}¤•´ð¿hü—ÄR™®Á;Í”%:0)¬…äsUûçâ·›e^üubê™:8XÃÂ{2õ7myÈ;ãËëdG—=Ö‘¼cœÇ;Ç»¯ôí³Cùñ×aôÌÎ{¢Í "Ýþ× £ ¶Ÿ)W˜ ¦r!ê19¶¨½óB¸"00†–߿腉bëV̘`0¤óðÞcÕðµÌKÙ= ñ™2ǽs|áÒ•Õ…òÀT0LbŠ!ŒØ•۫ǽy¾zf×d φm»Z­ã‘yÐh½Ðó42öIZ¾ŽÃ6°ÿ_ 4\4T4^4ŠTÔñtв0µÌ =S4zÒ@ã݉ ž Ù]sX ”Â<ì-ÿ×€kÛÿ_h õÌ “õˆHû$ñq¯÷ »ˆwDBüÿT4œˆ :‚Æ= ô:3„¶MèÔ‘‚`bª‚ý³½˜Zâ2%^ÂÑ«˜åsÎf~ãgÂT?ª`¤äлŽÈbî6ÏOo,3/ez³9ßzÉ9àúÖ+(#¯1ìˆhÌ;óÖãt”…©e^€wÓ…€£W‘bb0C¼{ÜÇYÿ— Þ)Ä>é§Ü!HuI}ž¤‰üáþìƒÄ#©aŒZå‹w™ûŒ,§Ôä¦ÄþÏ õb-Ž›éxt„`j±ÿcIÊ'ï_%c›Ñš°@½R˜ÎÄ3*z粈8å|že1žþ—šÏõÌ P7†²Fú15òȘ &x|H$¾FJ˜"óÜ'e:ˆ<Ç ÄÓ:£.ŽŸKÑv³Ì‹¿NL=óÂÔ9ÊeÏO9¤­óe!ÆÊ8y‘ïÔ«!„xVðÄyB$ã+ñtqôÜåløˆ‘ÙsÏ=—õéÛ7[¸tE.Lg²ûà‰lÐà!Y=²Ãg>ÌZÙ¸soöüÀÂsxáÅÁÙŽ}‡sa„âiÇkCæE‘Œ¯XeØðAÕ¡F¸™sd/Ÿ;?fêÌÙÙ¼ÅËsû;Šû?üÒ´e×þÂí§›_þ˜õë×?›ßŠ >Y¶úÜ~ƒ‘­ÁC†…²îµ‡Ë·„gxèôÅܱf“’/B<)x bȼ!’ñK£»x-4èðîŽÝ¡_·yGu"•p)æ…ówì;’ÛßQx³â·» ôÊ“®Û_ÿœ;Öâ¹v÷ëÜ1Û—YóecÆŽË…ëui¹¯_rÇž&|9^²rM6dèK¹pÝFÇ–¬\›ÛßL|¾•Å2óÂtÄùKVd§¯ÞÌkÿ]i^|¾ñ$ã5ˆ!ó"„HÆW,íáô•›¡7Ób^š7+~»»ÐQæeëîB<ܧ?f4ü|þã?rû`㎽!=~£ÔŠ¿»2cμÏ~w#ÎW/Þ»‚¢²Xf^: ÿ]i^žUž´÷\¤á5ˆ!ó"„HÆW,í!ż ¨™ÖÑ·_¿ìi3³|W ã…ôoɼ½<¦?MzcjváÆÝ\Ü1ÛöÈFŒõéÓ7:lx¶nËŽêBuoVü6žéoÍÏú÷>¬!Wn?¬;ab¸Û&½»}wui$ÞS—?ÛŸ7¦Íqr/³ç/Sº|Ú0œkÌYðvõØÎýG³#G‡©WÜ[|MÏÄ×^oÛìgšyjá,Ï-Í1;?8Z ·ïè™läè1YïÞ½³QcƶqÛö¬æ## ˆuŸ®ÇÙ²¹×êº1\wéªuá:ᜃØ~ ¾»þÂØ½bœ|<]ÍùÚMÛÂ}4¨j0cl䮑r¼|í†`â}“^ŸšM™>«ºÍ{Iº×nÚ¶SÊ"×]¼|u¶h٪ʹ½óÛ„®§í©^<¥òLû„2´ýýC¹4C­ûã¡|’ŸEñPÈòèùJúæ.\Ê¥¿ŽÁHyÅ}P'Κ»0lÇ#uqy¢\SA©ì:õÒÐh~)Ͼ¬~âÜ•ïljµrþúÔéÕk¶¸iøäá÷! o,ÊXtNÛÇõ¸7„$¢ ñHÚ¹â¥ñGÈùôÃÕÛ_1Gœg¯Þª kÄûj+ñ¬\¿)l#†}ðÑýo³U6‡0+"˜mö×2/÷ø=ˆÄ<„ßÖøï9t2,°k6*×¶gIZ9næÁAس×nåÒsýÞ7Õ47ÛìOÉó”ø¡¬¼pœxè¹Ç±î„ð(‹£ì^I/ÏóµÿøÙ0Q5á/sq9æ^'O™î‰ß¤¥È¼¼9svH Ï™´“&­å‡2DYG0r/”ý=zága¦Íš„)÷ÄôNî©gå^(–6Ò à|Ê2SúØo•ß”áFË1uq_ù+ß0gä#¢Ÿ/ß±ïÛŸ‡0g®~¶SÊ"×$D>¡OˆqŽûwÚîc€)%¯0?ì+2‡µîßâ!Ïyç¸6F,އtSF)Ë{Ÿ #¨˜³¸ÂÃ[âàÙPžx7yŽµÌ Ïq›TÊ ëbRÒÐh~@ʳO©ŸRÍK\Ù¡$OÖlÜZÙw)\ƒwôèù+I÷,º^ƒ2/Bˆd|ÅÒÊÌ â,64š±ðæá‰8±mz@i츎eç?ºÓjÄo/lü6=˜l³°ÜÎ'½ô°Ó[Ï6¦ˆ0&fiH²ˆBXÜ«‰‰ËŸ¶4È4º'Âçµ)oVEœÇOC<,tÑ7˜³ZfŽû"žxÚX-óbÛESuxF±É;‚‹ßf.â|+¢hÚXJž§Æ_V^x.ŒÊÅç` báVv¯Ü6îu>uå㇕=Ÿ§üާyób# ñ& ‘ŠÓb .]ÙjÏ•<°mÊêµ»_µ ƒ€´8M,­§ÈM›j°#(1*Ö£P&¹'‹ƒçŠPµs|¾•Eî›kÆŸýF¸bfZ®[l^ÌÜy˾z£ ¹ûÿ+žØRNãx¸Dul0—˜­"ŠÁ ú‘3¶ç fkZk¦ÓŸ’†¶äGÙ³O­ŸRÍK\CÜ•vÃOäÚV¯—Ýs|žèz¼1d^„ÉøŠ¥=”™¿æeýÖAôÛ¶/ˆHE„ˆ”Aï%S¤`zìÆ¿:9óÂÆoÓ¾2qR.NÒdi§1¥¶OÝ"Èhȹ}ü~<Úó{"ˆ0ާLeðæQÌ6_­ŠÃÑX³¿Ö—«:¼Ø5Úˆ-ƒ^MË+3LSòiˆ)2/)yžYy)*ƒä1q3:‘r¯LY£ÚÇø<-3/”Ä—ÿ0˜¯Zâ ï} ÁFëxîLÝážɼ7ibÑO‹/ÞÛRŽ¥”'~3È3Àð³cñ@Ÿo¾,BÑ}sÄ,¿ý;]ëÕŒzÄûbüý§ÄƒéÀÇeóÈy|²Ü_3Î1?ŠëÖ2/@žXò,0Óö<ÊÒrž²gŸZ?¥š—8m6:ç?«~ó‹«ÓËî9>Ot=^ƒ2/Bˆd|ÅÒÚb^0¶íiÄ=C‡ñr¾oÄb,˜! *â€yÚ©æJCèãEt1m¶ÜaJɧªsÍY¯€@£A%N™„4Ÿ:e*á9Ÿ†Ú_Çðæ…˜m?­ƒ).ì§—ÑÇa^lúO&°RÍE‘yIÉóÔøËÊKQÊ £)÷JY*JoŒÏÓ2ó‚ cDÂÇS"ò¯QA⺈pz弌t´Å¼@£å˜<}qèÐ0JBz·¤ÃÏqžoÜÛïóÍ—E(ºoįMýóït­{D¬ÛZ›"üý§ÄCÙðåÆˆ×|c~$¹Ì¼Po’¯ü&âòX–†”û(¢Þ³O­ŸÚb^쬷ֱìž}xѵx bȼ!’ñK{èhóCÃ6oñ²ÞO 3Z¦´ôôÄ—j^˜bV6 ÌÇF\°ˆÔD½‹+Ö[ÄÂ#†Å¹L1â„MEŒ7/Ö³é{}Ϧ§#Ì‹=SDæ¹ë·[ak'RÍE‘yIÉóÔøcŠÊKQ¤—¸yI¹×Z#/1>OËÌK­‘—z‰xzʼn—‘¦ê§Ÿ ÄL[Í‹‘ZŽã‘,F}èÁGÐÒÁ`ÿû&þŒ·Ï7_¡è¾»‹y!”/_v hj§¼ø÷·Ì¼X k…06â›’†”û¨GѳO­Ÿ0Î+Öol¦Ì¼Ôy‰)»g^t-^ƒ2/Bˆd|ÅÒ:Ò¼0·¡ÍBc;^67{øˆQá:¶MÃʾTóBO1鉂ŭ±`b‘+ç‘>[?ÀÜoæøsŒÂXØ]އÿp o[äo‹™=ôTrÜþ SÕs-mŽE±½æ…yë|ÍǶ¹/zL½`$_£üN5Eæ%%ÏSâO)/” ÂÄë%,nDRʽ’^žsœçœ‹këšñš¦¾`Æ1ÊqZ ®‡9‹÷qìç7Óͽï}ü®0H¯yŠyA<Û:hK9Lynë€i¼'|¨!ëóÍ—Eè,óâï?%þRnýT?ÿ5;ƒgÌ4Gÿ™þXϼ_=$1…±é-KCÊ}xÊž}jýÄǶ㼇”ñzæÅÖÓÄkÙ€kY]_vÏ¢{á5ˆ!ó"„HÆW,í¡#Í =|4оèD¯ â‹éZ>~@ÔЫËÔ!F@è¤÷Ùzo½°ñÛ4Î-jzâéÑ´õ¾!D\´4Þ?ék_Š{Bùª‚˜/NÑÉ—xHç#^ü=_Ñ!z)íŸí™ÈæÓ·ˆÜU¶„¼ã‹bþ|£-æÁ8Ç@ÙÔ7þI×bý± ×Â}˜še½¨)æŠÌKJž§ÄŸR^(ƒÄƒ8¤çŸü±O3[ÿñ¹}µ@èM|íõÜþFxÐÀõb¼HëÎϱd^ºÊtgŒw$þ½xðÄyB$ã+–¶ÀHÁš[ƒ8ëÓ§o6é©Ù•ÛñO~Ÿõïÿ|«) 'ÿšú´u÷aû…‡Ñ UMÿƒÈ‹…aæ-^–Mž2-ëÝ»wµ²?ÿÑ0Áu‘X·eG«´]¾õ {cÚŒâ˜=qvóË«Çï|ûK¶àíåákHû…w«Ç‹DÖé«7³ñ¯N®¤£O8¶péŠì³G«Ÿ9gAHÓÚMÛBžôíׯ’†™ÙǾkO=qA½üÊ„ê¾ÉS§gÆh•/Ä9ý­ùáþúôí®cyL/#¯ãsN]n1A§¯ÜÌ]ר¶ç@6bÔè¯C‡ ùµõyx®Ýù2<÷/ ùO|qCîóßoÓìFŒõêÕ+¤5ž.røÌ¥p¯qžð\ȯ8O¦Íšž½m—ÝbsÆœy!Ï”­Ú°%äW‘y±gsíî×áæƒ{¢œ/à÷0jÌØpm;†áEÈÇè}fÿý~Ë]Ùêw±zï.P–¼‹–­ª¼—²-»öçÒeÏÑ‹´¢çãE6a/_ʺ]cîÂ¥Ùí¯þ+m³ç+é#½·¿þ¥z^JÝõÊÅ—÷}ÇZ:bbãQëY”/î‘ã/êB‡Çê2Ê顬Qã0e÷ç+õ×8F¦7Qæ)„)2/ˆiÄœ™g~ۈɬ¹‹ByBdRž–”}/( …”9ž“ÄÏcñŠ5!(ƒÜ÷ÕʽP.9‘3vÂÄðÛ |Ù»K<\²Lú0)>M)ÏÑ‹4ÿ=Eæ…trŸÜ÷nù€ð䞈½…KWVÏK©[ÊÊÅ—÷O+õל:cv0 ü6YïYpœpÜç‘.à=öe,†rLó|xi*†¢‘ûh«y^IßñK×Ã}"¦ÙG=Ó’¯<÷Ã>[§gå”w„}ä=æ3.ü%_x'xvë·ìÌ=›2̼`@b0ì†zãD9¥³‡rdæ(Ûç¹»x-<7̵W˜Òͳ&ÏÎ^½:•ˆ‡w…õcÞü<Üõäõ{ß„ó0/œ‡áŬbZ^™8)”Qëìòïï f—x÷>•íØw8î¸^)k³˜nÉ=ù)ÇݯA ™!D2¾bi”¸‡Íö!ph¼­ŠJ”JACcG÷! bÁô,Q!Çahâ0Tâ4:qCE›×ùÓ–´Ñ0ÚñNœ é !c›k Hì8=âˆ<ö^dÑ(аÄÓu¬²ÞUÒÕ"ܧËz×m;ò èá¤Q‹™`ˆ% Xhœ×´4Îm1/4Ú4¶ñ¾)Óg…ÆÛ¶Ûò<<ˆ „SÜSÎuI›]ßç¼Í3àù½µ`I«x ƒˆ°Æc‰Ià7¢øöÜ­ Û5ËîÃÒˆx°ã¤…ç[d^ ?mÌÄ#ï„í³w%q‹±´úõ ÄíÍ1â!fÛ~ÚXÊ»kyQïÓÊ)ÏÑ‹4ÿ\=Eæñ‡yl´‹4Ì#`¶]V·¤–¡¢òEÓÆÊžá½ýkô ¬®ªe^x1añ¨±M#%Sæ%QÀ|±‘¨ø< ˜åuQÙ€±Ï:8ÆvüÕ;F^0_q¼õ¨µ`?EµÑÿu›w„ü¡nޝI'†_Cxž¿Í¼Ä£\O]û0‘¶cÄ>3pf^âgFò×F0ý{Á9¼ñH õ&Ï:¤ÊÚ¬îŽ× †Ì‹"_±4Šõ€R±" ëë7VÃ!ˆéÍBXûðƒ¸' 0ÄkS­ŠÂÐ#EC_·Åõ9½X/Ä J<ônØ4“î›;îEÚŠuïË ŒÝ‚aG pÿþ¼2èí´9žÊ˜ „®?qb×o‹yÄ B7L'ª<3\¦ÊÙñ¶< àù"JœL`‚´™ òùo›@¦§?ŽÓƒmòÞŒ#†²}ï¡êtz7éÉ4\vÖÃh¯ÛèšÄqš‘6L,ÅS …ñ4$»ß½GN·J3i‰Ë‡7/)ïnQY.¢ì9z‘柫§È¼Ä‚ ý‚xŸ·¨œÆuKj*мyIy³æ.ÌåiÙš¦(Æ£Õ†ø¤ÞG[Í‹ŸÊˆ!²0q“NK—/§v&®('=ŒNת#êA™¦¼R§ÅÄâ0J-õXj^tR0òÉ3±>ÒÎô+ŽÛûwfPw²/®Cmz¦P›yñõåŦQû÷‚Î1Þ¡¸ì`¬c_,k³º;^ƒ2/Bˆd|ÅÒ(TðT¬Ex!GïûãG(¶.Æzn}:½»•; ‚”†ÁOÃjñÐÇ4…¡ÃF„óüšßÓOD_œV@[Ïl‘࣡GøóR@´0mÃïG ÑØùýôðÒ»ÈﶘEŒ :ùOo<#?õÌKêóˆ!ï1—Ü¢‹©%Ö˜§˜sÂz¡ÂûmDÄ]X—Qiø1Ÿ-= =ž›Ì¤Ü½Ã?š åÒ‡Ã8Öʳ"QH^ùt䯅óæ%åÝ-*Ëž”çèEš®žfš—¸nI-CEñ€7/)Ï‚éuŒdÆñ”™Þ½¢wÝH½f›‹»¨œÚyk7m¯n3•м`?Ct°Ž)>§ek^ ŒSØ0:~:iæÝdÚ-Ó¿¨'˜ŽØVób£*µÌ í bû÷‚çìËae£¬Íêîx bȼ!’ñK£Øˆk2Î]¿ÝŠX|14XDXø© EÂÀ¾¶Uoä…i"þºà?%Ì´¦Y °ˆ+nˆ \¦BÐxך¶D()#/m5/4„ßO£_6ò²å½–Þõ¸W³Ì¼0=ÍÄ|g=ó<°p[ &–RÌ‹™ÿ?K|o3b…žJF[HÜ?ûÉ#zd4±h,»â!~ÿO5/¬—!Ÿ7&–ŠF ‹D¡ )F„|zmÞ>xó’òî•eOÊsô"Í?WO3ÍK\·¤–¡¢xÀ›—”gAž²ö(Ž§Ì¼Ôy1Rï#ÎWÒStNgšƒw ÓÎ;RϤyRÍ bŸA:°âišä;í’ÿe¨Yæ…ôÖy¡<ó¾ù²þã PÔfuw¼1d^„ÉøŠ¥QLûF*þ²™ ›Þ&[„Î4;Ž0ðó§iàÙ‡ñâ,ÖÄ=i˜›c¼ëÀñ0b7ÖX°È˜3Ï"M;îçe{1Ä?Ï#Îx$ƒ¯ÎÄyP$øša^Z¦õleéµÄ`Y^1}…´Ù"R0ñV˼ðÕîÁ¶i”ÙWf^Êž‡ÇÒÝ ñÊG‚y¡\ñ›ÿ_ÇËBåxž?p?7‹ á§2¶¯?Y/˜r¦‚Íl1E,Ìg1¾F Ø|í…žG¾ÀÃ1D$æAJ(iaá%éåK:ÄÉZâðbˆ©4„ÜkPh08‹Â"ÁçÍ £7þ~jQ˼`ÊhÈ0SiûZ鱯ކ“ô’ôlòlxV¾á!]ôÈóÜ6ä‚&îanËóðFjŽ“ÿ|jÕÖJЛOŸÿ~Û£^\2ÔR–6·º½­„‹M™™/~RîƒçOO®}¥ ÃCÕ3/œÏµøŠªÞ>¾ÀµXAšxüùPK2ŠÃ}#ÎèàL+‰G ½y²w·¨,{Rž£iþ9z:Ò¼”Õ-)e¨¨¼æ€{¥|ÙÈSÙ³à½ee³Â¹¼Ç¤¡–yA ’ò˜zÌ>Å̶u¤¤Ü‡Ï×Ç_¶:ÒÁ6qt†y±EïKV® 岃qa4‹ãÔÏ|ú=þ¢‡2M}Nú<}ÂðîÒù‚Ácù|òÍu©ËyøÍ»l£¤í5/ÄOÝK9 ŒÛ¨­/˜æÇý°î…Nðõ³å«C]ƒMi³ø˜GüŒ»^ƒ2/Bˆd|ÅÒèm¤Á¤Ò§q¢âµÞ< â9ôÐRÙZ£JcB&. 1…Pˆ¿pTK<0œkpb+î9F ",ù<%=nŒþÄ=Ä7¿ø14d¶0©qCíÅ0ý,þ?/L1Чø >o^X{áç½×¢–yÌ q…EÒ}ù?/3Z­éNMòbÓ•j™V¾ÈĽٳà3¦Ü“=“¶>âÎþOñ³€ª5òå·ÆÚî)`S?¯4pÏñ(axîþPv‰ð^úØÿyÙÖ2Ô3/ŒBð?c0ÔfäéGä’ÒOxÁSKyfù@|ëxº`‘y©÷îBQY.¢ì9z‘Vôc¼Èny)«[ ¬ Õ*ïtp¿Ä—­²gA½D]Ãq„(f„ú¡–yÄ)\‹2ÇÔ#?•¨ì>|¾ò<ÆOšÊ1ëä˜fJùì óÜ7å†{"ŸøZ™}¨3`÷ÇSëkc@Y@à·¤ÿñ'­#ÃF¹¦aÀ1§Nµ©]í5/,àÇ Úûͧ–íÿ^eŠºÅêtÞÙø:em¦cëËxwÁkCæE‘Œ¯Xº‚ZÂ@!ÚƒêÑUÔZóò¬ã5ˆ!ó"„HÆW,]†¢¨n]…ÌK1^ƒ2/Bˆd|ÅÒH`!šêÑUȼã5ˆ!ó"„HÆW,B!„ÍÀkCæE‘Œ¯X„B!š× †Ì‹"_±!„B4¯A ™!D2¾bB!„h^ƒ2/Bˆd|Å"„BÑ ¼1d^„ÉøŠE!„¢x bȼ!’ñ‹B!D3ðÄyB$ã+!„xÒxøó¹}Bˆî‡× †Ì‹"_±!Ä“ÂùîdcÆŽ ÿ påúM¹ãBˆî…× †Ì‹"_±4Êå[‚p8túbÍîƒ'²q^Ííï>óax¦—>¹—;fÜúê§fçGsǺš”ÿl}êÊÇÙ ÁC²ËŸ>ÈÃý~ ÏiË®ý¹c)<üùÏlØðÙËãÆ‡2{õö¹0O#÷¾û5ºÿm8ÿñ³¹cO3L‘›¿dEvúêÍܱîKV®Íío”Ž6/ïîØ]yŽT·‹Þ‰§Í¼Ìš·(ŒRúý× †Ì‹"_±4ŠÌKcŒ364ŠËV¿“½üÊ„ìÝí»³á#Feg¯ÞÊ…í*žóÒ|þ—qí*Ì8w—÷¨½æå»áüã—®çŽ5BW?—§8?»«yñ½2/ÍÁkCæE‘Œ¯XÅÌ˶=²7¦ÍÌúôé™íïjîãßeÓßšŸõïÿ|Ö§oßöÊ퇹¸Þ˜6#„yáÅÁÙìù‹³›_¶ôŒ³ës¼ößùö—Ðàx˜ZÁñ±&†FÈ®`âú˜Ûg"èÔå›þð™K¡×´_¿þaߨñ³u[vdŸ<ü¾Þh4n¶Ë×n¢¡wïÞÕ)5>ü±óW[]«GžÙú­;Ãï"óÂÚ¦¹çK#Ff[wÂÔ3/Ü+×'ÍC‡ ÏÖlÜZÐ@2ûH+åfÒS«eâÍ™³[=ï"áR+Œ  5uïÞ}Â_¦Š=N[þÉW¦!‘^Læ¾£gr×4¸Fß~ý²ûf#G ×à^ãÞpK✴͘3/ì/{FöNmÞ¹/{eâ¤jþÅ=ÅP/ÿ€²Ã3Cøõ0 ¤£è=Ú¾÷PøO¡£<öèÑ£’†÷s÷ÞÈ=P/¼:yJÈ_/Äæ…tó›r_c?mÖœÜõ¹v|`05mk7m Ïyà A¹ø:hÞâeÙä)ÓB{ô·pŒ¿={õ yjñœøðF¸Þ¹ë·«ûÈWžëý~ÛeïJŒ7}üíU¹&SQ­,ò÷èù+áÚö—ñ(UJ†²º»(?7îØ›{>×î~—•[X±ncÈ[®G9ž5wQaö¬ã}“^ŸšM™>«ºÍÃþVÒ¸=ló^LŸ=7ü.z'Øoæ…2É4=òŠ{'?| ÊàÒUëBxî¼?pòB.œ‘RWAÙ3€ZeÈêü˜zõv³ñÄyB$ã+–F±†‹Jwõ»[C8û¬±ÇH x†Tš{Ÿ 4œ‰v>bžÊžpˆ!Ž3Ÿ†‡x¥°Äëz¶_ùΦV ›‰V•í£q¢Q ¢ovx¶É3B΋Eާ-qÓÈÓh"Ä*4Ð3+m1/D„Ĉ‘£ƒÐžg½FsTPÕõ[v†k p, &ކ¡ƒQ á¥Œ nx¾ˆ/®Á=2Ââ¯Q+Œ ‚‡ ¿÷>„yi½ÂþMÀ“¤—t#ÞkõêÛ5¶;FãùŠI0!kat{ÌÎ^»ö—=#{§ GÏ]Î.VÒH^±ïdEŒZêåÇ_œƒøç:äOÑ{tûë_Â³ŠŸ &ƒ0µ„Zê=PÎIBkñòÕ­òÜ‹pF"í}ÒÊq¦XúëÓ©A]ÃqD;×C 6’6 1661Ô?”Ä1uÏ•gAÜ“§Nq‡÷¯é¶ëclfÍ]XÇŒbÒöadé¨áwÊ»ãó¿lO1;¼ß¨ÃùMîÓÒYx bȼ!’ñK£Ä½n¶Ï¦Y/+½ŒlÇ”04`ËÖ¼Óϧ-ñPñZÄÉkSÞ¬6@ECûôf"0=&¬×ÓóÒÒXÒ XN#ÅÎÎOƒÄq¦RÐÈ#y[â6c‚¹°8Tà8L#æeãΖ^Të9{^µÌ =î·0@¼qáü¨gÞŽ“ˆë.šæ) c‚ úÄÉ>8þ$ŒtYxò qSË\Ú5ld=䣉J ?ß”gdyãG~&¸Rò²òŸ.z]˜,Û¦bâk¯·:ÏhäâôQØgõ‚áÔ䟭CÂ|PGÄe¨(±Ál$m~$ËcÂ;ÞG>!"ã©QV–lê,uaÜéÀ¨ïm\¾ˆ›÷ŠßeïŠÇç›™êT sðÔ…°cgû(Ÿq¹J)ÃIuwü$âicEå".·ä+%¬G‹ãáý¬e^ç+WÜÆfí ÷й²sbóEïï!ÎW ¸剡Îf=]¼ÃcÏÚ“RW¥<ƒ”2¤icBˆ§_±4Š5F~Í =|ë6ï¿éñA<øsi2¥É‡Ep3]ˆßVÖ(›Œrð›i¤ cfe–Ñ—½+Ÿovoì·0–þúó칕OˆËpJÝ]/?½y)+·ö¢¸ÊÖ¼¼>uzçüÆøP¯RþM¼șmBªyñïu$GþúyŒéæ<›öF¼Œ¢û°Pô |]•ò RÊÌ‹â©ÁW,R«áB¤Øüb*Þ¢yë40L³m¾D£ÉÜd*b*mâ·ãE LÙ´1 ž0uáÓ!^ ShäM |ü™Õf‡o„Fâ¦ñ'ï|Ö“Gø¶˜¦©Åóǡ̼ÓP8²€èCHس£1÷Ḭ̈9çEÆÄS¦® økm¿GØuàxè·)*a› ä)º0ŸgV+LÊ3ªõNÑ£O>ò;%ÿŠÄ½Gt7ï,iA Å=ò1í¹‡¸^ð"¡ä!å‹2i£HE™—ö¤ÍãÍ ‚óà>ìè1c«£4ŒtÑëÏH¦Ø„'Sø¼1£B¾÷¾Þ»âñùÖ¨yñ#ƒõÊpJÝ]/?½y)+·E냠̼ð®2õŠ÷•çväÜå0½ SÄqÒ¯·jy¡\úëÄÉ=smÌ)õ#>m2/ÕU)Ï œWR†d^„O ¾bi”Z W,R¨PËzŽbhüéuâ"k”‹˜²ic€Ø áÛ°mWh˜ÙÇ´ âFLøF±Ùá¡‘¸ùü'ùc‹€ 7æ^ó›yðq˜zæ…F<žò)æÅ 'ñH£n°õ`2gcÓÓŠŒ‰§(LŠ ð÷C¯0óñÉ“Z Ö‹®Lª7ò’òŒj½SˆyIÉ¿"ñEï°8Žˆd„?ÏhÏ=”™¦9‘ï”w>j rO‘yiOÚ<Þ¼Óß:Ú¼Äe8¥î®—ŸÞ¼”•[ûpC<}ÊÌ ï1ç±6Å>„Àº®…‘áX<íµæ¥Åp÷È}¬†²Ñó’ò bj•!™!ÄSƒ¯X¥VË”–©=[54ôz1²U%nÓæþÒcÙÒÀä§”ÕÃD„ŸÍ=fZ ó¤©üÉèÌðÐHÜL?#,yÇæûÿÕÈ!Ì ÿƒ;û²T-óbÏ‘1;ÇÄB-ó‚Øðâ+þ* sQ¹‰ˆ3wœ0õzߋ¤¬‡°û7øxD¼ð:Æ®qãþ£ê>{lÚSQ:Rž‘ůW ×ñ† b;%ÿŠÄÔzX`Ì~Ä_¼fÄÓÈ=øô•™„×Ä¿¿vL‘yiOÚßÚk^ê•ᔺ»^~Rf!°í²rkk^ü?D¨×3/@~QOÚ¨°n‹çΨWÖ›—¢w¢èý©g^¬n×É1*Έy{ÌKÊ3H)C¼OtNø4t6^ƒ2/Bˆd|ÅÒ(µ®X¤P1Ó¨Ðèóû ”5ZÌ §a§Ç—‘…ƒ'/ÁAƒeBÁD=ŸþsžeçÆŸ—´¯¢ù…Ѿ‰›áLjÏñM8òΰ0›ç€¢Ñf›0µÌ Ï…«ôÈbV8‡ó S˼؂á%+ׄQ„8 ©ÍK·{°/!ìh¤I» aÒh´i”k}n´(LŠ ð÷H¯¸}‰9ãôüÓkkëßÚk^ê•ᔺ»^~R‡So·­c,+·¼{äï$#ªsâ/3/LÛ#\ll$ÎüÀ›—¢w¢èý©g^€ð<;Ê÷Çoî¥Öÿº)ª#|]•ò RÊëù0ÓÔßmÆÜx bȼ!’ñK£Ôj¸b‘ôî1e‚© 4T4þœŸC%S£hà™·NZ,Ø™NÆ¢K*`½û´Ôƒž+œ6vC“Ì™ÞòÞ¾`k™àÙ0AœôbÒ€Òˆ×2/@¦)ð¼IÏÂ¥+«*Œ…c”—£F·›>Ä1­0)‚Àß#=¾¬)A$ N¹Gé*®Áâgα¼ŽÿÙhQ: ìÙ;µjÖ þƒpóyS–Eâ ê½Gœ÷\×"õ|ÙK1/ˆOÞÿ¢EÇ1µÌK[Óæ)2/À”Öøÿ¼0úYôÊSÄâ}E¿€²w%Æç[{ÍK½2 euw½üdmkQ¨_ìkYeåÚñÿy!|™yAØ“û4Øè ‹ÃzóRôN½?eæÓʺ-FEH/F¼ó#IFQáë*({PV†Èî‡ã~d²3ñÄyB$ã+!D9E¢££¨'› ½íôˆÇSšºþ‡J{¦ZŠ4šY†…¨…× †Ì‹"_±!Êi¦ðëlóB< 1 ô’ûÅî£aL{¡g»èC ¢cif¢^ƒ2/Bˆd|Å"„(§™Â¯³Í ë/˜JÂ?ÁôS†:>šÀT¡z G3˰µðÄyB$ã+!„Bˆfà5ˆ!ó"„HÆW,B!„ÍÀkCæE‘Œ¯X„B!š× †Ì‹"_±!„B4¯A ™!D2¾bB!„h^ƒ2/Bˆd|Å"„BÑ ¼1d^„ÉøŠE!„¢x bȼ!’ñ‹B!D3ðÄyB$ã+!„Bˆfà5ˆ!ó"„HÆW,âÉãÝ»³‘£Çäöw%÷¾û5Lˆm»²¡ÃFdë¶ìÈfÍ]ÌÇO|x#ÜãÙk·Â¶Ý3ï_ÏçèãíÃkCæE‘Œ¯Xåò­¡âß¼s_öÊÄIAd1T¿cß‘\˜µ›¶…!úƒUíÜ41rtèEç¼w·ïn?6½Ñ4$Lê?``¶dåÚÜt¡}GÏ¡ÈT®qèôÅê±m{VÅÖ¡/e3æÌËÞœ9;ì3ØÈä7Óvâ¸i­áó P¼½<¤“Þ»IoL ›cE×°óè ?ir¹œ;wÑÒV=ë3ç, ç¢e«ÂÔ!ÒNØ8¾9 Þa—¯ÝòÆÎµ<{kÁ’pLj'6ôNÚy}ûõ ;ÛqcÆN˜ÒdÛXžuü¼¸oÒuêòÇ­®íÙùÁÑjZ/_]½Ï¢´Æ=¦˜ž3ûH7#q¸I¯O Ó>l›^WÊÎÚMÛ›ží/´”qÊdªÑ\¼bMxwý=w ãÇ5mC3ý­ùáùòÞ˜6³•IbÊù¼qÇÞlÂk¯‡x¹Ýû*ág„óØ·jÃæj¯tÊû\d^xô`‡òVyŽs.­öd3m‡ð{¬†§.èYyçí])¢Ö;ýÉÃïÃuæ-^^ {ò/A¿»ÛöÈFŒõéÓrˆX»O ¬QöÈGžï/éæyµ”Çá^(÷ñ»™R'yóÂû¶fãÖߤ‡z"~^+ßÙÒèëµøš)ïIY}Ú–úŠk'Ep_‡Ï\ áãûáùòŒâû¡åzÍÏ»ÁTÚ±ã'†óx†”M+?—?m)ãäÛ«6l yêG^(¼ñ>Ñ~¼1d^„ÉøŠ¥QLìÐP=w9»XMLb‚"C(²9ÈÛß?öÓ}QyŸÞû(ƒœ—ò>{ó½òn‘ž=‡O…ÑA½™k lS¶È¯êHR‘„²wš²FHÛ¬Màݳó©'¨76îÜzÚ ŠÍ ï éàZÄË9ÄI=…9!/Έ߅KWVÏK©“¼y!¹f’¼&½ä—MqÂò®Çæ*&å=I©OÛR_q=öñ¡<’6®o×1ã@ÞÛ>®ƒynvxÛ¦¼SæÈgâ°ý@yJ~`âxGâã0kî¢`üý~Ñ>¼1d^„ÉøŠ¥QLì˜ø1©Öx[˜¸÷QGcÃè@|2"ƒÆ”m˜X8BÛz¶Q @|!|ømæÅ/z.š"˜CˆÜüâǰMÏ%¢Ã7~é ÍÕ8ï~zÿN_iYëQtë÷¾ #/±P¡§FÔ¶iTixãùÛP4m¬È¼øü`äáÃoÌáéŒÃ žj™›jaâ„£÷ÜŒiž:svøí.Ôš6öÚ”7[åBØÒšâ#aâÆÌ ¢ñÉ>Ê¢´3·òƒç÷{ÌpÄå™÷%žZfæcjaxNì›·xY«ø0BöŽ¥¼ÏþÙrï ®iáöN3S6Z‚iæçcµÞ)({§)/ôŠSvZÌyÏV£8˜: âó)‹ó×F^â0MÅãòˆñ`ǶSê¤Ø¼XžÆFƒgGžÅϧeïIj}Ú–úŠs÷EØ(!>ˆ}~ßüòÇyiײ<°gÒìð¤ŸÑÆîÊ Ev?ÀZÂSFéxˆä% ~¿h^ƒ2/Bˆd|ÅÒ(ÖhÄÓ´€iˆ€ZahdØG#Ÿg¢ëà© a›FÛ÷ÐZO =…ž‘D¹A¯¯ ù›yñÓqŠjDBˆsØfj—Q16å!GCé]¸Ä ‚ŒF–F”p6 #Pô¥›Tóâóìõ©Óƒø©—&žY-ó‚8B|r}¶I7ç#2MèòÛz¶½À…Zæ¥^ZSáâç7=®ˆ\ò“Å>ŽÑÛÚYáÛy“b^S4…òdeÆÞ ÿ¥%„¬_SƒÐ¶´½«¿ÏþÙbz÷ñûwíîW! £7⃅h·÷»ˆ”w0(˜gâ,ú`Æñ¦j…ëöÌÆ¿:¹zœw&òÀs†x_Êû×IlÇæÅFt¨[âûáZ±~c«xjQtÍø=I­OÛR_•M# eÊFfÕ]1V|l¾‚H½Áˆ™¯f‡§ürœß˜Z>€a÷ÃH*äåsÊ~î‡÷Øž!ï9ÆÎÎƒ× †Ì‹"_±4J-±cs’k…AÔ°/î­æ–³ßæ#5Ú6¿Û¦ôaB¼óˆ-z<õzGé=æ^YJ\ˆÇX0]æ±Î…¯q†©„k¦y±†˜k‡õ¶õÌ š­aÎ8é§'Ÿ†ŸFž\â´‘/p¡óÒ¨h`z_!C¼'"ŽéTDŽÓÓO;ivø¶€Ðާ>Õ_´ CE:øÝ¨yñ£õÞgÿl1þÝ3lm“‡Q'ÏjM‚”wÚ œ°Ÿòï'mFNyßxÇXçÓ,ó×IlÇyÊ”KF<µ®E׌ߓÔú´-õUÙ´1˜yâ|LÁŠuƒ À¨2ÒL½a#'¾”ALŽuDÐñB¼´Ô‡ü¶‘dF(Y_çãíÃkCæE‘Œ¯X¥–Ø¡G:eä%î™ßSXÔh[ƒCãe ÂñÜõÛ­°ùðš—ÝOÓÂüi¦rÑàÅÇkÁ}Òàq®‰˜¢kÐ H/b,à[„ë óbiò½ßeæ…dŽ“/qp=zCãs½À…fš—¸·žÞT¦z!ܰ6E$¸Íߘ„¸/šNÅâtåó›éO=òRf^â÷Ù?[ž×õïØt%@4ó>a|ML‘òNS¯”}?]ªeJUk1Ë=6˼ÄuÛqž’ß”ÖCùûI-3E׌ߓÔú4&µ¾J™6F]ƈ£˜\>ÚÁ~Ê#nÖØÈ6;|-,?â*ž/e’üdz¤í§Óª^9mÃkCæE‘Œ¯XÅÄ‚ßö1Í!k_§*D„A0úÇÇ"S¿æÅÏÑ'^öó›À4f¾aGÜÛ¢éšæå¯©-~dñˆ@/ŠbXðŒ cÑ}|® ¯Z×`~¼ÿz=°„+3/4¦„‹¿~”"®b¡Ã5>_mQµ¿¦a_c㞉`ùÏ ÒjÓ/À \ /™îÇY–ÖF OI[<õ*,‚¯¤u¾QL´cãý¶^Ä„6yàŒ…/åãcyÙ^óRï}öÏ–Hpm[ßb˜Fäl=ërXÐÏÚ…8¼‘òN“&¦ ñ,¨WHOüùB ¥H3û:ʼøw'®“ ÎS„¶¯ÿ Ο2ÊÞ“”ú´­õU*äñ³ö˦“1¢ÌûAœþ~›¾Êa­þââ=f¿ÿÒ¤èx¼1d^„ÉøŠ¥QLìÐp2*@=ÃôˆÚ——ŠÌ ˜©`¾: Ÿùd%¢ŒO·Zí–}[—phÀ9'þª ‹Ý ƒ(BÀðÅ#¦EØ|òZæ‘ÄyLÁáË;ñ1zm9ÇdA£ÇBx„+b^O¦PÑ‹ÇÔªZ×0±ÅT¦ñ—übŸ¨Ô2/ö5 îÍþd‘¸ª't€üãšä=½¬ô¬³]ϼǹ~üÙRž7ûâEÞ^àB £ƒ³ée)iM…|äš6×(ì³µ)ÞÃ3ó÷êaô…òC^Q^(»ôcœ¬lPŽq|IŒ/eÙ׫(&àÚk^ê½ÏþÙb¤)¬{ad qÌ}0Êb¬ÍÀ< ²ùZÏÝ0"¦ìf‡|b¤€m¦„ñÚ()ùÌhád¤Š{ˆGþÚc^Êê$ÿµ1òо¶Èˆâ™Î)ác&qxOÊ{RVŸ¶µ¾JÅ:VbÓh#B¶6¥3ÃׂŽ"Ì1Ï€¾Êȳ žøë‰”ÞC¾h^ƒ2/Bˆd|ÅÒ(&vh(4„*~Æ› ÑFÔpCÿ€x:6=ö4ì40qÿ.z-„Ž}¦¶–y›M(ÄÇô„K?uËWÉa¶(˜5 ^0]cË{-S°óüD °Mߨe^¸oWs#8ì+WeBÇÎãI7£.6òÐ_3†éKˆÈxŸ}¢5 ò˜›Î=q½]އ}©iM!Ï5¹ÎÿßÞ™÷IQd]øCÈ&ˆ ‚¢( ¢ È&û&‚¬ ‚ . ²(Šâ .ã2Ž3ã,~‡|ë‰ö–·neVF•]M çç×]™Q‘™‘‘çDÜȲmŒ6³WÇuúeì¦ ê>uÃê2÷•ºÀˆ¸OÇoµõŠòD¼óœÙþ?j^:=ÏU÷–ziçÃH¶­©B(œËï&DYßâÏÅSõLcX˜ÅñÆ3M:êÌ(ð|P~ÖflÛµ?Õ?k;þˆy©k“¢yÁ`*¸îm/SÊ›ç?¶kþ˜9ÏI]{Úk{•Æ™{jÏ6plŽUöB…~§¯‚úKy3@9ñ3†8²ùjiÊ[o|¢1d^„ÙĆ¥[:“Á ¬Ó X¨éàn7wјÑQÛ«ŽÅI¿ŸçÛ[Õ& q;5ˆ!ó"„È&6,ÝÒo±3ÔBQHÔ3ßÜs;ÁïT0²NÈ׌Q#¬¦ìÇÚÄC¿ŸçÛ¡n“„¸ˆÄyBd–né·Øj¡À/œ"r»¿e†õ„ZðjÝßÃGª×÷ˆ;ƒ~?Ï·CÝ& q;5ˆ!ó"„È&6,B!„ý jCæE‘MlX„B!úAÔ †Ì‹"›Ø°!„Bôƒ¨A ™!D6±aB!„èQƒ2/BˆlbÃ"„BÑ¢1d^„ÙĆE!„¢D bȼ!²‰ ‹B!D?ˆÄyBd–?ÊÅ/¾nÛ&„àóoþ^|ñÝ?Ú¶ !Ä@Ô †Ì‹"›Ø°ü^Üw ˜ùÄ“mÛ…ðãSš–~$4îBˆÛ¨A ™!D6±aé•“g.ãÆÝ]\¼úMÛ¾nX¹vcqÿ¤Ú¶w›f¸ñö…ËÅÒ•kŠEKW¶íûäÆÅ3K–ãÆOe8ãñ9Å[^jî_´leúÕó*®ÿí?my_ÿî·4ÿnÙ¾dùóź-ÛÛÒw³ä½ÿµmûºI3”Üüù×b﫯Î|¼3vlqðõSmiƒ‹W¿-ÖoÛQ<8íá¶}ËV­-žš¿°m{O?³¸íÞO¼ïþbùóëfè÷Ù®mÁâ¥mß½³çà±TÞW¿ÿWÛ¾~@=Ý}àµâ¡‡§£FJm÷4ÎlS¿¨ö9ÖêÇs«×§6Æï쥫-éFŒYLš<%µQ1íp‡A³²çl°¹çÞûе›^hÛ>níl'¢1d^„ÙĆ¥nþü¿bò”©Å‹{´íë–c’“f¸pøÄ;I€˜@ðB(»‡§?Z<0õÁâÀ±·Šc§ÏÏ™Û,£‹sŸßHi>¼üeñæµAºª™®?ý7ýýôæéØgàx¿¦¿wªy¡îÜu×]I¤QÞƒ-Ô…sæÎoÜëé~cFcf]ÆŽWyóݶ} îÜwÿä4{|ËÎ=é<:£yï4ó‚@_½aKÛö?BÌs°Ì˾ÃÇS>u3ok6nMõgõ†ÍÅko½Wì=ôz1¥ÑFp^Þ¨–™«#ÇN-^ÚÿjúÂûü•›Ítf^ÖoÝ‘Òm¤¥ý&Çø¿ïÿÙvNƒ &Œãsmq_'ÊÊï÷Î¥òŠi™—Á!jCæE‘MlXzŽ€ºöÃ/mûº%ǘä¤.0*ŽúàÓkiF%šDûmóèÑc’0ùtVÊ>îF[g5ŒÍKû'!Í fÇ æp1/_þf²†Dç‚Ø‰û ÄÕ‚gŸ+Nœ9_lض³Ô¼u“·w‚ºS6ÂLຫ|–yùãÄ<‡Ò¼¼{áó”fÛîý-Û1ڣnj)Önþ]@—™—XGXc5õÁiÅô™³šÛ̼Äöƒb¶sž~û`3˜æe¨y¢1d^„ÙĆ¥J„=Åí{MñýqB¶îÚ×ù7ù»{Â=©S&ª¢1©KC§B(#Þ„X˜8óñÅì'ç¥ãß;iR:¾Ï÷ø;¤kòåü6ïØÝœ±f>ïA€rŒÅÏ­*.ýSs?¢€N4ReâÊÌ ‚šY€˜vÒä©G·¾´/ ,¾®ñÌuÑ©ñ—ü-ìæ1Á}œpÏÄ4+@YzCey"Œ)cfŠk‰f]»^9’îáÂ%ËÒvf (®‰û5û©y-#Å€ñb†ûÅlV^u÷óÉy JÃö êf¼—†…æa|¨ïÿV6^(ã²ûÀ¾*órúÜ'©/‹ûª(¦@=$¯í{^IŸ£yÉ)Ûºg•c`Äy¨äauɨ{Þ<<[œ3ǵ™Fê!}>‚3H9r_ŸšÿLóÜwì;”òðXyæ\sUyZ½åye¦”óåïéóŸ´|ÿäÙ‹ÅŒÙsšm϶͔°ÍçË3«ÖoN!eF‰RÊØ>ç˜8ôÆÛé˜ï\ø,}®2/Üsf& yŒyí/Çg`…²å<¹'qsÿ‘É0‘õÉÏÊÇÐ6ß–÷R~´côþø˜0Ú[îûV¬Yß2›”{·A!ÚÒ?!Ý+ÿìsÏhg™ý¢ÞQG òùÔõ+À}á>ÒŽÒÖQïüþºvv85ˆ!ó"„È&6,ÝBgGç°cÿ¡–íŒøÓq°õ4®4´üµ4Œ,ÒàÒÃŒ ³¾3ËICÀ6:1: :©óW¾J ‚•m›^ÜÝÒ¸#ÌéXé8½ÛvíOa6ÛÁŒÐô³Ò÷ùÇñÂŽÉw¦F4(F™y)±D>U£’œn§™`  eÍ¥7/×~ü%凈¤“D ?1÷étý&Ú¯Üg Âè4}™æ¤1H‡Ìlл?OÛˆSÄ#7&£b¡P„Íð=ê÷‹ûÆ='|Žýu÷“|ÈÕºM)o¾ËýÄDY™`Râ½48/Ò Õc-Ÿ÷~£˜¿hI›)‡Næ…{3²q¾|?î«¢J˜š¥¼ùÍK]Ùæ<«ÔŸ '/=™žž Œ.#¾ì¯{Þ"f^ø焱àÞ°ÍL3ƒÔΕ|?•ž9΃pHD-ù˜ä›É«»æ*ªò´z‹)ãÿƒÇOS¦>”ž;&uƒ:ˆP>ùþÅt\„;æ‹ýe´eçÞ”³+UB™ÓG›Ù¶½Œ\ó±8î®—§ÏUæÅfD0•1 ðìPç¹O˜ ÊÊ®0 äA[Íl ƒ(|¦Nع03É6꘭ãéµü¢ya`ã0§Qé38k†h»í9Í¹Žˆõ3Ô-òe†sñí0ùÑÞÒ¶q ô[<ç6ؑӯð]ŽÃw)?ΕráúÙŸÓÎg¢1d^„ÙĆ¥[1¢ÑŒñû4ÖtF~ÛÜ‹Šy :Zqà¥+Zgè<̘ä¤> >iüBuÒLkˆfþ§sæ¼ý, #µt¸üî³q…¶ý˜ D=bŸÏï}t¥m Ä #Ǽй2ˆØŠû :7:3\Üç1¡N'ˆfôÕöyóÂh!/\ð±ôÜ;®ßî!–Ï~¦ÀÊÈ:Ìœ4&ýÂc? oÛØOnõŠ{îÃ^(':¦f ßÎ÷Ó !冨8Ñ0hÌÖùºËj¼—Æ¥ëß7óÍ¥“yÄ´ªÃ„)÷ 0[Œ¤S.çòW£·Þ¼ä”mݳ •–™ºFy2›ñöùËésÝó);/îÛlö…õ±®`–bèT ñ*Ë;^s1O«·§Ü‹4È‹m7>tí¯I{#ËbrfªìsNØϬ/ûNäš›QÙ¸ý¥ôÙÌ ë¾¨K ø0€¨fFÁLi„û<0¨ñû}¦^P^üO›M]yvùê–ï‘Clù–…õZ~Ѽ` x¶|Hêñw>Lß³Œºë(ƒ~†çÂocfˆc›)ÆüÇ—ÖðlÚà^N¿Â9D…‰ÃÌðN;;œ‰ÄyBd–n1¡@§÷ѹ3Š˜B7‚ƒ‘p<ûèð}gbøõ,9i€N%Æ"Ó“Aj0B…€¡S£ó¦3Gäqîqí3ƒ‘^FË~›c0ÂÆ"ŒNRVU«‹–®hÛa”Òf6„ÛÃÆ08˜B‡ Œ\¦ûÚ05ìçxÑPÅ8ëœ4ekùgfÌß/:l _1sÂ(n W‚ºûif,Îr¾ˆpþÏ ë†:ó±ËB«ˆá6³X>|É›—œ²…NÏ* ¦¥ÌTÙ¬“§îy‹é­ÝˆÏ6—HþGÀ?6kvÛw¹6_Ï¢ÑȽæNÄ<Ëê-Æm¾ì©gœÇbV‰:IŽÏþ2ñ¡Íé—y¡Nò9¾mÌà»ÑÈzýñg6”Ùþ·ç,®+£=c;/$ás™y±ïw[~ѼðÌjìóÒX(nÝu”QÖÏØšEŒŸ1C„È‘·…:³ßʽ®_±rb É×]Úk{rÚÙáLÔ †Ì‹"›Ø°t‹5¶þÕ¾€È¡# !§C¢³"Î×éù³þ{Þ˜ä¤Ø© –b§ì±+â¢IK¯"mtxäë;EDÚ²Uë’0£EPØÀ`°ÃÆÂF¶uè[PË߸¯ZÂÆf‹ò¤sDtÂc#•f^)‹£Ž±ÃÌIS&éØc~]À+GßLÆÍÂ1"~”¶Óý¤‘Ÿ…™”aHüOÚx|ÃÂÆº¡Î¼`2:­Á‰Pwu¬—f]ÊB¼yÉ)Ûºg¨#ÌX±‹ï"ž¨#ìË}Þ<Ì ¦›ÿ©Œ¢Çï2ͨ¹}ŽF#çšëˆy–ÕÛ¦y97`^,ì CJ]¤-|®“øŽ`"™‰ÛËÈ5/6ÆlŸÍ¼PÖVŸ˜­ˆÏo¤JôÓnñ?3šä_˜Õe»…6–™—^ËÏ›«‹X|`Ðfè뮣ŒØÏ€Õ$â¹£îâÈ["¹BÖ̼@§~…öÖ×Wõy9íìp&jCæE‘MlXº…'M2£ÁQ˜Ñ°ÿ>óró·ïý>}­3/õi ¬SA›ŒhÄQt„#Ït:eb‰FWSËB 3lŒp:2U0;Ý^ðæA9[L5˜)5óBgïö v˜9iÊD x"Æã½*¾Œ¨c&eåUv?M¼a€|ZÊCÀÿ¤x/û6Æ3ÂlWÜ^E•0xó’S¶uÏj¡EÈåo£ôÝçšê=ǵ0¿²5/Ì̦4FêD¿Í¼`b|šœ™—^Ë/μPve3l93/ÝšÖ¤p>ôƒ´u ¬Ä—Np\o^Œ²~ÅêyĺkëfrÚÙáLÔ †Ì‹"›Ø°t . ¾¨,f¥‘õéØf‚ÈÖ³Ðûï!Lâš—Ni ¬S!ˆE¯¾#¤³°·º`€¢Qñ1Ïtöü>‚+6a1îÝRe^0 ¾c­‚Q˺¼y±7ù·1Ñ ²ÍÌ ³Üg2d‚įy©KS&íÍ[QÈúYîe|u,£Ó>Ww?‘`B°©3/Üs^,·WQ%L#Þ¼ä”mݳJ}gTžÈ–&®O©{Þ"9æÅê“7ˆVÄ©Þi l=ä\s1ϲzÍ ocóõ xÎHcâ›g—Ï~}YÄò³˜vê“÷Ì1/„&qÿ¼X/3/@Ø(3?~›§Nô7×)†pHÂ=[Ö¼\ý&߯Aêµü¢y™×(ÚnûØ üš—N×QýŒ7Ž€‰gæ–ºn¿©eëð€¶Ý‡ëÕõ+¬{áÇþ̇®æ´³Ã™¨A ™!D6±aé`Þ4¾mBMxC£KŒJjeixµ+Ûø.#pP`oLrÒ”™FÓ”|£#£Ãbö†E‘6’Ë ù0ÚÇ(!£Žtœ¼Š”ý:^LZFØø.Çõb7”™:s„šÙ á0ü¨54¡¶°ÓCçIÇJ¸BÜW†7/ˆ:!×G9°¨×Ö¼ØÈ(-4ˆÁyû3'M™FÙ ¯@°1ÓAM¼¸àrÿííQ¬i¡^ ¼­ëxÚ_w?- u aE¬:eÀg{}lŒ,ó¶1¼-¬Êüt2/&t,Ü2çþ• Ó2âÛÆêʶîYåÜxÆí‡Tù/Ñàùb¡0iêž·HŽy¡ŽP{„TÚ[êވp Ê…7€Ù‚ºkF {Éy–ÕÛh^¸>šÄ}´7â±Íf LD33Ði†ƒÙ—$z¢ŸºÊñy»uÚÏ:”™Ú(1çÃóBò\ÆdéªÌ‹½„€óŒç9¢ßÊŠg–z°qû®´ß^´alcÀÁ^%ÜkùEóµñö<*ȃÍ~oÊr®#B?ÃsBݧ]䥜Ÿ%8yr8&uÿIc³x9ý /)à<ÈŸ¶Ž:H¸¦Í&崳Ù¨A ™!D6±aé:§(ª™e$N@b”™ÆÝ¿®”ÎÙ6Ò¡Ðáyc’“¦Ì¼ÂŽŽŒsà»^ôÐq#ÐÈ—NfÅš -¿€PeDùîÆw1 Ä&çüVDeæÅ:ì*lÔ™òäü¨«‡ÑrŸì·>êˆ öé$í÷+¸G|ÆPùʃÙDB–òK³n®Ã¬KS&1Ã}å> `FHÛ~Ft×tÒœ#yÇÅ÷u÷˜e¢®r~ˆÁ(Þê@RßLZÝ/{o'óÂ,÷Ó³çÜ¿^ÍK]Ùæ<«¼É 1I”/÷8†ŠÖ=ožó„ë*™^"1†ßyYØ²î ˜äÆ”µ½™¬îš1cqv Sžeõ6šàUÄ´M˜î—Õ7-Š"åIDAT ¯£<ùm#öSæñ¸3XäÅ u•{CyÆ7Y•™k;xî8^=ïC•yá¸Ü÷ªW5çŠ~L½»Õëø:q¶q_¹7¶­—ò‹æÇ¢½µßy!¤Ñ/ŽÏ½Ï=Œ‘ßyŸê˜öi¯y]8û¹Œõ×Gäô+´»V~Ôaú@ÿ⋺vv85ˆ!ó"„È&6,½@ÇH#ê;q1¼‰æE -üŸÊÿÖ€ˆÅuó;BˆÁ!jCæE‘MlXz!ÆHW]Ù—[³ ŒWý–†è/„ü0Ú_ö"!D‰ÄyBd–^!LƒixÂhâ>!Ä„•bo]·ÿã„Bˆ¡#jCæE‘MlXþŒ$ûxu!D+ÄâÇuBq§5ˆ!ó"„È&6,B!„ý jCæE‘MlX„B!úAÔ †Ì‹"›Ø°!„Bôƒ¨A ™!D6±aB!„èQƒ2/BˆlbÃ"„BÑ¢1d^„ÙĆE!„¢D bȼ!²‰ ‹B!D?ˆÄyBd–Û{X»é…¶íw Çßù°øË_þR|ðéµ¶}¢ðû-”;?D÷ &N{¸X²üù¶íݦNÜøé¿é—· xiÿá¶ýW¾ýG±ø¹UŸqwãÆ/-]Q\þú§–4ŸÜø¡xfÉò´Ÿt3ŸS¼õ᥶¼"{+&O™ZÜu×]Å”©û_;Ñ–&²ÿȉTÆ£F*&Mž’Ú›k?üÒ–.BÝX¿mGúnÜ—›ï‰3ç‹Gg>^Œ3¦¸Ò¥i Êë:{éjúœSF]ûkªÇ‘YO<ÙLÃqigâñ„¨#jCæE‘MlX†üùê [Ú¶wBæEæ¥-[Y<<ýѶíÝ"óÒ›wìNÏìˆ#SùíØw¨-Í܋Р'&qî™X<6kvqóç_Óþ›?ÿ/ÝÃæãÀ±·Šc§ÏÏ™Û0£‹sŸßhËÏ /ŽIsüŠ•k7¦Ï~H”}#FŒøí;/î=޳tÅš¶´æaÎÜùé{\'Æ!¦ÉÉ÷ÌÇ_$32Ñ’”£7fìØdìb~°ûÀkÅCOOÿç–Ñ;>Ke°}Ï+žÃÇ›¼þöûÍ42/¢W¢1d^„ÙĆe¸q;›F›ã¶Á@楞/]ÙßiæÅ_ûp‚P¾týûRóB=fû±Sg›ÛNž½˜¶™€>ÚØëü•o.FSlÙ¹§í˜Æ#Î(ž~fqË6L†ŸeˆPW0~Ûú­;’©¨z¦ÿ ž}.Íšlض³Ô¼ä䛾;~|Ë=Üôâît˜“˜§•-ÿç–Ñ‘7ßMé®ÿíßmù2/¢W¢1d^„ÙĆ¥[LX 8f6:|F1&Fžš¿0…7°mãö—š#¥pñ‹¯‹‹—¦QÔ±cÇ%Ñ`+ù‘¯ÇDáÿ}ÿÏâ¹Õë‹»'Ü“DÀì§æµtȘ—Uë6¥QT:zÒñ¿ïðéèñå¼è¼Éãü•›-ׯÈ'á$œ?£—FcA5cöœtNœÃÒ•kR؆í'\ƒp;¯]¯IÛ?ÿæï͘»Ûiýâ»ß¿éTnPf^UF¨q-„£pí^hQ6ë¶lOåAÈ iëÄ £µÜ_»^®Á‡ò°}à ;[¾C9dßç<=FdÙ¹í;üFË1êÒ@Ýù[>ˆ4î%£øŒ†Ç:f!C9õãàñS©~p<Îmãö]-õ”kç\«-ì9x´˜úдt Ònݵ¯å¡n,\²,]7çÌ1HïI]š²k·ïR§-L‰}~têêM] ##eaNäkm‰ßÎ=aFâúßþÓ²ãqÏùŸóæy‹yNš<µX³qkÛv ÎŒlƒ]/·†©Ñvq½1½Áqb9½rôÍtî´M1}„zQf^ròåZ¨“> çÏlN4¥´l'TŒÏ¹eÄl m ÿsŸÊL‘̋蕨A ™!D6±aé3/ÄŠ¿ùÁGIÌ ¾Ùfaç¯|ÕŸ¯¦mf®ýøKê„ [ S}ã½sÅsŸ.î»r)ˆ~ò2AÄÿÖ93RJÞ{_}=&",1(ŸÞü1íç;ŒVO=‡c#í¼1?„ç„@CˆZG½÷Ðëé;ÛvïOŽs@@q± ÀÂ9V¬Y_œ|ÿbʱÇh«¥Á¼'£«Œn".¸VD#Ç>xüt¡7~Bå¨y]¹‘&šþrn\ײm×þ$jüh뢥+“€Æ°qn˜#Òœ8-ýo¦±®~¼}árªOͦ8ôÆÛIðbÜ9†™ ÷Ú›çAÈÎŽý‡ÒºD#&‚¿–†²"ß÷Hç1§ñ™cøúQ—¦ìÚÙ~ðõSéV­ßœf5¨ŸÔ“ ç•ýuõ&§0›À±#q¶ªÌ Ÿ9nÑÓgÎJ÷=æcpÈ6 îƒË_ý”öcBývîÛyÖâwªÀäÎÞU™—2b¾ÖÎ`r1|Æ|,[µ¶í»˜Xž·¸ÝSVF¬ÉaeÊÔ‡Ò>žƒ8“-ó"z%jCæE‘MlXºÅÌ ‚Ѷ!Ù;Tb­W¬Ùþ¿úý¿’°ô3tÄ|¿¶-†Ùh¹¡dtÎÈg‚Þ‹F f†ÿMÌy330J9¢y˜Ä‘í'/1¦Æ¶yXäÊÌ‹?&b’™ûŒ8¤Ó÷"ŒÅÂ×Ï’`ø(fÆ<9åÍ ×™Ä˜íf þ·2帶Ÿë`6á‘Çf¶œûl  µ¶ D¹›èË5/qF #AYç¦É9Ë'ÎØ@ Ë©곟…°rÎ Èùº¬í oþ·ûúòÑ“Íýž 3&9iª®4Þ\&3Ãÿuõ&§¼÷Ñ•dø#e!UæÅê3†Ñ¶q#çäåGû£yaTÃNŒ~æ%Ž"˜UüÏè3Ç!=‚É@¸1êHnĘۛzê@H"¨É‡‘p y˜ÀżD¡ÀÈ<×ïÏãâÕoÒ÷˜iˆÇ€ºr‹æ…óç\87 V:˜¾T¦a¤™°6ò) …aÖƒèÇX”…¹åš—*Ãýf–#7MÎùWåѼäÔêe¬c½¬yÁ ±¾"…§“Ä*o€b3‹ä‡aõßñëYrÒ”]»=·w|ÓGšºz“S#lŒãÜ;iRzv¸žžÒòÄ| ­i”g™I2êÌKÙõDx¹wU æËÈ1/Uùbxù.32Ü›©ëOŸû$]¬žNeg i;©ÿöYæEôJÔ †Ì‹"›Ø°tK·æÅFË/t€%BŸXO`¢»“y¡ãg–%ž‡§Ê¼Xypœ2|8ñæÌ¾ Œ9WDrìÔ ç@T0bÊH=â€<;™„j<£ì•­9åÍ pNŒês_?ŒžÛÈ2‚e w«ÄøÇ׿+–­Z—¾Ëµ3c€¸´ý½šÂ’LÜå¤É9ÿª| š—ºúAàBÔ|>ÝšÌk.ȇúCaýˆ™f9ÊÖ^xc’“¦ìÚ©+ñÚ ê—¥ëTo ® FØX:ó—S[À~ u#TuËνmiÂáÚg,"¬Í!¿8;!`{§ëÀ³Èó̳X—ÖSg^:åKûÛΟ2¡þØ6©×1o#·ŒŒu5¬;8™Ñ+Qƒ2/BˆlbÃÒ-½š:M¾gñõ>¯Næ¥jæÅSg^8/D#¯%¬ÅS&<·¸{ÖîÄý°zÃæt®ÞÜØÈ'óÂy±-ž°;'§ÜÊÌ‹A¹!ê9W{³ámb­uA´Ý4ap§Ï’Äeo‡56Saä˜rÝÌ‹O“sþUù@4/9õÃ/7º5/¡Œ­“ç£9óòÛº«X×[f^2Ò”];f€mÌÜÄkdtßçeõÆSUÈ/†Œu6f0óÃ÷˜•àÙ([“Å:(LTÕsGZêß¾õ¥}Íp½˜:BËžÓNt2/uùbØ0&~k )73"< ð0¸¿ʈö‹™¨X‡íY²gLæEôJÔ †Ì‹"›Ø°tK¯æ…’ïù78Y¸†$t’ƒãïãì!Aûq»:óBHEs`oåÖJÄógarUŒýòç×%aç·!9N'óÂÈ1!fq}‹?ON¹Eó‚ЂÓÞÌÅÿV¦Ì4ù4iÍHÅšÒ"¤|XŠ1ÅgÖ¥øß¨@qŸ¢yñ#ß¶–²ÊM“sþeÞxvùêbÚo¿…9õcÞ3‹Ó‚f¿~É^~Uð}»@ð³ÍÌ‹]£ä–&®gÉISví„Ø! ãsÂ¬Š Ôºz“Sº¡Î¼xðf^ =k5ªÞ.Vm/8ðÛxá@ÝBw+x#—ŸíÈ¥“y©Ë—C ë3l@CÊgLôÀ@Jû[Ârʈç6†ãQ¨›öYæEôJÔ †Ì‹"›Ø°tK¯æ!ˆh§#F˜òe[»áCØÏ(2oâ²F&éœY¸Êq U!l…ö×™ËÃÞ¾ÄH0!a„ߨ::w{Û±å¼MŠÑxBJ|¾Âs'F·ÙÛÉØfa6eæ……÷Ö¯`LxSµ,e#¯9åÍ ?FÇg„×Ç÷(?V¹q½ŒÆr-˜4¾ÃïRÄs^P€ã5ÍäÏÛª8'®ÅÌ×Á¹QÆ*îyF󂘢\ɇûB¹1ë‘›&çü˼Áº&Γÿ6£UW?Šœ×ĵU½mÌê{ÔQê!pÔeÊ<ý,adÔ{ëu˜4>¼±.MÕµ3ãÀìÅÚÍ/¤:Î3Æ"o›-««79u êÌ 3 ̼òJvî…_Àϳ‚™Á3³€õ`Èó,P÷o³ÁŒšÿ‘JÞžfi(ßžB•γQ'âq¬þÄïxªÌKN¾v¾˜7žsê÷Ä¿\„:Yvìœ2"³qÔKf (sÚBŽé_ˆ!ó"z%jCæE‘MlXº¥Wó&„¯‹EÔ󙎕γ™æÌ…´X—ÎÞF#1¼É ÃÂvİCÉ1/Œ<Ûo&p®˜‡øÆ&DåÀïxŒNaö6³*têabú/{£T™yD /2H‹ï¢ŒÑUE-£®Ü¢yD-ß!®™·¾ù…øD,û)!ß(v#\WzMuCäs/M~Fˆû„‰àa˜â>DóÂ+]½—òó÷!'MÎùW x üIOÙØìM]ýûsCX{óÂ9sÿËFÀÓ1~ø%•Iú½¢FùPgy1çbßiþ†Ëhû ——Òk²½y©KÓéÚ©3Œ¨s \+FÎ/̯«7uu êÌ 3Ü{fó¸&¿Ïªàž0³Å¢sûÑFQÎsN0“×ÀðF6̬}æþÄü +óøO•yÉɤ`˜{’f¦×mj¾}ºÀu”½d$§Œ,-¦È~ÿ‡2‹ë»d^D¯D bȼ!²‰ ‹CE'QÝM!ÄÌ2·62/¢W¢1d^„ÙĆEˆ¡"ǘä¤B -2/¢W¢1d^„ÙĆEˆ¡"ǘä¤Bñç jCæE‘MlX„B!úAÔ †Ì‹"›Ø°!„Bôƒ¨A ™!D6±aB!„èQƒ2/BˆlbÃ"„BÑ¢1d^„ÙĆE!„¢D bȼ!²‰ ‹B!D?ˆÄyBd!„Bˆ~5ˆ!ó"„È&6,B¹ùóÿ²¶Um/Û&„¸óˆÄyBd!„€›?ÿZ¬Ù¸µ;v\1ò®»Šk?ü’¶_þú§bî‚EÅ]mÍšÝLàØ[ÅÄûî/FŒÑüõõª´Bˆ;“¨A ™!D6±a*>ÿæïé—Ó÷¿v¢m_7i†o_¸\ÌzâÉbôè1Å„‰‹…K–]ûkK>Ï_´¤=fL…¤ùäÆ-iÞúðR1}ƬbÔ¨QÅ=÷ÞW¬Û²½øò§ÿ¶ïâÕo‹õÛvN{¸m_‡O¼“Ê—|øüÌ’åÅ#ÎhKyiÿ«Å”©¥kàØ{½Þ–&—µ›_(ž~fqóóÛç/Ï™›Ê†k_üܪ¶òÙäD:.å3iò”bí¦šÂ:íoÔ—Gg>Þv¬?Êʵ‹û'=ж½Û40#Ôí{^)N¼w®¹}éÊ5ŸñŠCo¼]¼{áó´íâ_'ƒòìòÕÅÉ3Ò³[•¶ŒúýÚ[ïOÎ[Ш_‡Ûö_ùö©.Œww#¿ñÅ¢¥+’1òirž¿Èõ¿ý»Xµ~sJO}Â`Qc:Ï"Ï$FmÔ¨ÑÅÔ‡¦{_­rŸkàz)ϳ—®6?×]?`89êÿ˜±c‹ƒ¯ŸjK#Ä­$jCæE‘MlX†Šc’“f¸€HBÌ?5aqôÔÙ$î»r1õÁi ôŸ”†¿L}°˜Ÿ­»ö%¡c³ û/<û\qâÌùböCj^LOͦe£Ý˜©˜¶Îÿîñã›×jeÈ(¼¥±2;å«ôùáé&sãóY¿uGlö=™—Á1îmÜN}Ûôâî–mîSNÚuŠÙK׿/5/|z-m§.ض“g/¦mž–óüE®|ûs ‡óÇã£Nnܾ«-½}‡<ãì×€ñ‰éœç:æG™ðÎõÃëo¿Ÿ¶qÝ1?!† Qƒ2/BˆlbÃÒ „Œ,X¼4ÃõiÎ|üE”Œ>2šÎÈb4&uiö<–>ïzåHˆ„…°ÅÀŒÞ"^¹GDœ¿r³åøŒÐ3ãÁ¨*#šw¿ÿø;$áÎ~F‹ÉÏÄ0£›ˆ–2LŒ¿‰ ƒÑÛ$:Nˆ!> ysÎ|ŸÏˆEÊÒ§yçÂg)Ÿ÷>ºÒ²˜)3/lç:¼`¦‡2°ðΧ̼lÙ¹'„s^ŒøúÑ[Ìâ¥+[ŽÅùΘ=§ù™ÿ}šøÙX´leñÜêõÍÏ_|÷„Oc"ºÁgF”i>Í+GßLiþïû¦Ï9æeÏÁ£)܇k¤œ’qSt÷„{R l¸†hLêÒPŽËV­MÏånÏ×3ûÉyéø÷Nš”ŽïóíT‘|Fñ¹÷^çÈ(ÇXWÁ e_( ¼‹@B©(O¡yå¸{AYûmœwUZ½Àõ‘.šî'³mqÅB¯ø?çù‹0`Àþ÷C[E¹Rïcz¸xõ›Toióüvêe'ãßÍsMÞÌBÙs—sý@È]Ùs&Äp"jCæE‘MlXºåÚ¿$ÓÀ:Ä £~OÌ}:…lXg‹BàÂaa˜:n3&9i̼`> y÷âçi;‘‡èÁ” "éö†#„ßÛ¶{…=ÄÀ›|”ö#(¹g;û·íÚŸÄ"žý6ÚZFZÂ6È÷Ó›?¦ÏŒÊsM1âÕDk9¼ Ä Çò£¬F•yÙwø4Ca‚œ®™YBÖzÄÄ“¯7/¤AhQŽ\y#²-_D?‚›rÂ,òÅ5b , ×ieWö®~ÿ¯tÏNŸû¤íÜ9gfÕ¸/¬(ý÷ 1Uö¹Î¼0jΈ7¡;¬CÀ$c,øki¨+” !O\#×@Ùxc’“f jDº¿„3QfÌ"QöˆM¶13áëy]}¤lx¾(¾Ï÷8Ž¿O”G¬«à×ùû‚©Áôó Sþ˜#>OŸ9+ý1" ÿS'ø.ÿ³ “À ù³ÏUiýqü=*óÂg®?¾±Œsë$Öãó±™ÇZE¹S¶1}œí ¡ŒqŸÑÍsÍ ‚ŸÅɹ~öñ<­Z·)µÔ9ê=ñ\„¸•D bȼ!²‰ K· BY ëcÝU¦S¶ÑrD¢Épî³-‚-'™?ê‰(b¢Ú¶ Œ\Žh®¥ ÄŠŽÞö#εÑ_¾K~Tš‘n‹GGTatÊ Ôžãa„Sç #ð,ti»–´üùu-û)ÎÍñ»Uæ%2oáâdœüè½]·7/œ³Ÿý°Y êÆú¶„ÄÄãÕÁúfâv`ÝòžÒ8g[ü]Æ€)ÙR6uæ…‘v«›#í”ÿc0Ò~ P̘䤛ñi(gÒ0ÃaÛHcëKêê£=ÛÏõ3hÀ`ŸÍuâŒh'†*l̨2/6‹Ã½¶m”?eÈÂõ˜”=[§ÍÍ’åÏ·˜á:l  Ó:™nžëI“§¦s³Ï9×oyaÖ0¤¼`ö†mÖ 1ˆÄyBd–^`ä’?ÂpcdžNSÃ~:ØR׳ä¤1ó‚a²4¶€‚ø1Ƽ‰kà{bÑa/ ¶ÑéchSŠkirÂÆ<!IyxÚɼ˜è$reßÍ5/9Bü¶œ5/ÌÆ#3#Æ,aNˆaF‰)»(Àê`d¹j]÷’38„7ÅQg Þq]ÑÔ™@Ð!ÌS¨á˜1ÉÍx| ô™®9Îøõ,9ió˰)ÒùúJ¹b¸©{uõ‘:Ç1ØÜÃj9acu óÂõ2;IÝd°‚Ð-fIK»S–OÙó óBGÝ©{aEîsÍL$õÑ·q9×oF ùcðNkq„j¢1d^„ÙĆ¥[)ÖP2ÆZ)4óBHYŒ!Æ$'M™yA¼³­ Dˆ¥cÙ ë¡“÷kÕäøs uA챯۰1ÂC•qñ+ÖlH"&¦G@[Ø‚ “ã÷W…—@Žyá:ù¾­«1rÌ P&¶ž€ëŠbœókA:a ³/ü¶¿§Ï’ÒúWõõŽs¥Þù ¨3/„Ò°P›ò@ôQ¾¬s0óB(ÇŒk¼1ÉIѼ`DbòؽèTáãëß5Ê}]2Bf¶¶?'l¬Žáb^€×󜰟g˜P=få¶ìÜÛ–¶êù‹Xý³§¬iéT fÀ¸¾N³;Fîs͹süøýºë§²ÏBa Ú^óâV5ˆ!ó"„È&6,݈;¦¢öv3/ˆb¶јä¤)3/¬;@ˆ2ROîñ!h£¬CÎï•ÄýˆbFå öV«nÂÆùÌ<ùƒpÄN\Ž@µSÖ-Dg>†:AŽy¸¸rÌ‹Ÿya¦ƒÿy…±OÃïJ°Ý‹ëNPFe?Xhk¦ü6;¾_Â, eD\YHYyaÍT\+‘^:Мy¹ù›¨ü=, Zg^êÓ@4/ÀýF¤Æú q&¯¬>z( êåɱÌÈÝNac†­ƒ¢rßy†­1:=3 ñ¹bÖÆB« aV°ìž”‘ó\sïyÓY|ŒN×oϦ_{<óUá™BÜ ¢1d^„ÙĆ¥[XüM§éßî…xd›u¬s:ZF‹-¿æ¥.M™y!Ì‚m1|Ç/Â}ä±™Éäøý,ȵxqg!ö#t~[˜ŒTUUYìº ({+Çåd>ÜÓC(Iœa€\ó2¯!D YóáWÌ@pìNk^,´†{Áñå·p²0Üî i©'|—ãzãW‡¿/ö0ÂÔóRv£Î¼0#éÙ8'ž?óüavY?E¸—}2°™Ïô#•çŽs¶UŒoè£.|þ5KÖö±V%ëòWƒïï{Îsͳ늧ÓõuúÈÛ÷87ÂfùLÙUD bȼ!²‰ K/`~ˆ„8Ÿé„YD+£•ˆ6éÀ/¥l“œ4Uæ…‘Pû‘:b×ÿÚ5¡:ð'£SÞqa+ÇâäÃúûÝœ[^ÌböçDo§Š †%ˆQÊÁ½ªDi•ya10³á¿„úË×°5NuæÍâifN0½Ü;D)tEXtCreation TimeMo 05 Dez 2022 19:53:53 CETª_l IDATxœìÝwtTÕÞÆñïd2é=$ôЪôÞ‹‚Hï ( "6ìW¯åªWéED@éÅFé]Bï:$¤÷:™÷„y $@B¸>Ÿµ\+™sfŸßÙIp?gïsƘšfA¨°øä]‚ˆˆˆˆ6ºy8(ˆˆˆˆˆ p """""ÙDDDDDP8‘l """""(ˆˆˆˆˆH6…DDDDD$›Â,úœplt·1_`Ù{ÿb•×óL|«.†]ÜÆË™Õ?ð릣\O6áV¼:m† ¢®Ï£”5Ó?¸Ž ëwpâüu’2mqö-O¥OкÕcxÛ=èúDDDDîÆBÂñÕìLªGëÚEr\õÏÛÁÆÃ>4i€c>ÆÓ –„ÍŒñ5ÓÁ`0bçêC™jMyªWGjø˜ Òä#+óÚŸ¬ÞJÉ&ORÃ÷á[’αkùR¶á퓨ÞÀ‘‹Á!Ä™ŠQ½Ã`?ˆómÇI'lÏb~X²…a)ØûѸÇsô¬oÇ–Ï_ç‡Ð¼=n •L™\ûåß¼·$ŽŸ~HñeÃùæbeê—ˆäÈñPRý¨×õIJZÅš}—H´+AíîÃÔ¶ ö@Ú•í,þn)ÛOEbv+CíNƒx¶M9L§çñÎþÀ³q#8±‹³ÑŠTïÌŸÄõx÷ÇÓdÿûg»ÎÇÝý0¼S EêáUl 18`$ÝydjÞÄžÃîÍ[»5–hN­šÏÊ­GK0âQ®­úô¡n),gñåW›q¯WÃé½\ˆ1àU¥½µ&mÙÛÌ܃…+,{sû~NÛð/™±©,ý'¾HuÛLâŽþÌ’Ep&¼‚êP4jÇ}óñð<ðÕ:§Ø¶æŽÍFÑãæ`ÍT´ =Ÿ>˸©+Ù~®O•Ð?M‘\|¨7ä5§ŽgÍ©,áøî3Î8&‘`Æ‚·ªt|yð=(Ä’mŠÔ¡Ny#qÇqÉ é!Ë?á®”x’¡¯£¥ûi–OšË¾„ì;?3#IðêÀÈ>äùú6Z4™%GRok7íôR&L]KD¹.¼0ê%:•dô±,=éL­AØF`ˆ,Q>xJÖ§N©¬]fl ŽM†òöû#hâv‘mßÍ!ا;¯}ø.=âØ=1{â,X’1ÿËélŽ ¤ûÈWy¶¾ Ás'²üdZV–.GzÐîåóf¿J¤ì_ÌÒmÑx·|OŸ¯‹£ ^ø’מ(ñÀƒ˜ 9OŠÑŠ7͘*Òéãi|<²9î3a¾æûUçðl1ˆç†ö¢bú–MžÇ±?K*¡Ñî4úCº‘zxkvÇS¦ó;<ÓÔÛ@žü×§ôià–c»‹å³VrξžL›ò±\Ëü›û o™¡'8ãEÕºþyûŠ ¨ìMÈépžÊEDDDr28”£åˆ×hè‚°˜ã‰¿ Ü«Ñé•4)•¿K³…·Æà„³3XH²˜9³y—ÑuPGêÕlH§ÍðMfïñì·±uÚÔ¡\é ÔïÕ‘jvÑÜwsŽFÓ9±i3×êÑc`{êž°ÁÑÓo—‡áþn é)©X°ÇÞáæ× ØØÚagg‹Á|‘}ÛB°v¤[»º=֌νšãÿ'»%’l)׸UÊ”¢|£Ú”²1…­‹7ÎFÀoÜŒ7… ÉÇÿäT²'uzö£aÍÔl×Ǽ¢µ9ɉ$㆛[n¿úŽ,㻉‹9–”AئÌš·ƒs.»Šˆˆˆ< åhÒ½ÅmooL”nÝ‹ù P˜O+²$‘˜hÁà䌓!ð¨x,©˜=òYæX2ÉÈ´Á3&‰[Ÿi°÷ÀÃâȼya‘%…˜¨$ Åð½qnö¾ó2°'*š·ÚÔ¯ôsìçL‰ œ2—¦CÝ’Øv[y6`À`¸ùûL2-⣢ɰIJcüv,˜321ÅÆÝ~娯 ó¡}ö¥“ƒ=RIM…\Öi%†¸X N¾Ü¸ØÆ§^3ñ1±XŠÞ²¿MV½‡sNŽÇlã·÷Ôráê+‘DDd@‘[ož7àR¥- íçûÓiçIõ¶õ(òৃDDDDr•º…ù_¯æZÆMã4K™Äbï7è]§H¾f m—¾›=g3q­_‰RFÉnNœ*Ð÷½þTµ¿±—;w72·æ|¯%é:á‰àâê’³xƒžŽXB®‘~F =œëQìJ{âhãN•1ÍÜÉâu1døu nÉüO†8»¹b4xRgØ;t*wÓHÐÑÛðÓùnïÁ2â[Ö{óQBÎ$иžkÖ•ýŒ“üôáv{õåíWÊãæf 92œ$K%\ `‰¸NŒÅˆ·»Û}ܬ Ž®®Øf^&**¼¾'WÙøT#°èOìÜ´6 ¸í~jƒA½_¦{ꢛ¦^ч4䈈ˆÈ?^Fè~œøCöÍÇlÜü ,ʉx,×Ù?g,¿€pËŠ,¤EœáðÁ`ölXĤÿ.à¤} zt©¶TlÖŒbiGXÿ[0—£¢;½•EsVr.-ûæólY¾žýG‚Y?÷ŽexQ£n…[Öì›lÚ„¢É{Xúýz æï²'чÆÍ+c‡ך ©lw•3gS(U¯Åò}FkI=ÏXö­Z˱kQD_=ʆ¾gkèÝWœì°'‰‹öpìrÂm³"‚ãcíiZ:ƒ£K¦ñë¦= ÞÁÆïç±7Ê•ÊÍjãnëG­†~p|%+~ßÇé#;ømÉf"kR·ºË}„Ž•êPÑ1нK²ëÀAö¯ù‘C¯d3–¢i—†ØšÇÜŸŽ›cÉP:qÑñd}©3pmË;ÜWPùËX®³sÞü›‚AUžze_yöAÙ÷ d\gÿ?sïc±û¸,j!>xã÷ßøœƒN¼Ü£µŠfÎí{òúK6Ì[º’oFǃk)ª?þ4þîÒl<ñLÛÍNm,FÞ/г²=·®ã±¯Ô‡×†[˜»t S¶¥`çH³aÏѳrÖ‚zƒËcÔ¯êÈþàâÔ«[¼@iÇàR‹o Å~îO,›¼‰d£åê>E?' Wîü^Û€–t¨y„å¿Ã§ù¨”˃¿)Ù¶,m^~ ûeËÙñË,¶§q)êO½g†Ò®NÖÓ‹Š=>‚gÒdÕº™ÌJ2âV¦6Gô¡š«Ëõ‚ÚàÞ€.ƒBY²è~ž¹ïJAx9H0<,ÃlNÕû3°o2ß-ǘ}Tª\O»¢ÎæøZ¼ý/Ú–ÖŒˆˆˆ<Ä ¾4~n —'Ìæ@jO½2‚¦¥ì€²´þLÏšsnÔ{nµòñ´"CbjÚß|Y×BøšOx{¾…^_}H;Ÿû4¦rhækL¼ØŽÏ>îT€™ƒ/,>ùA—P¨ÒÁÙ@Ú~¼;…ãUGòï5¢ä¶z-˜wrâ\‰f®Å¨Ô¨ ª}ð\¹™'9“VŽŠ%rŽ^,)—8uÙ…ÏsÏÁƒ}–}nà—ITèÝ¢`0øŸ“qž?ÆMåBµ®4r$|çrŽ$¹Q¹ºÿƒŸQÉÁ€}ñÚ´ìW›–º‘²)HÅ\^78”&Ð?ÿí=Òá íÔJ¾w¯ºx¶•Ö‡? l‹S½MM.­[ÂÜuI=ËQ£Ï žªu?÷2ˆˆˆˆÈßá,+’[ý¯-+‘G“∈ˆˆˆ p """""ÙDDDDDP8‘l """""(ˆˆˆˆˆH6…DDDDD$›>MDDDDD͈ˆˆˆˆH6…DDDDD$›Âˆˆˆˆˆ """""’Má@DDDDD…ɦp """""€ÂˆˆˆˆˆdS8@á@DDDDD²)ˆˆˆˆˆ p """""ÙDDDDDxDÃÁÈáÃЯ/sçÌyÐ¥<´ìf@¿¾ è×—‹.ümÇ€ƒŸçÐÁ=r;;{4lHï~ý0™L¼8l( ññ$'%1 __:uéJ^½r=ÿÛ·³bù2"ÂÃñ+S†šµjåº_dd$‹.àð¡C¤¦¤P¼D :<Õ‘†sùÒ%Þ{û-ë¾Áûö1 __Þ~ï=ªT­Æµ«WY¶d1§O"99™bÅ‹ÓþÉ4lÜØúž‘ÇC›¶3`àÀ<^[6mbÝÚ5„…†âääD@ÅŠtïÙ‹â%JäùùkÚ²¢Ú>þÖ¯`ð>üÊ”Áb±0~ìXŽ9lÝ/<<œŸW,'""œaÃ_ÌÑÆÒÅ‹­A %%…¥‹cïàÀíÚçyÜçÎeÝÚ5ÖïÓÓÓÙµs'Çç“Ï?§Zõê888’’ÂáC­áàÈᬚJ•.M±bŬïß²iµTÆl6súÔ)þóñG$ÄÇckkKFF—.^dÂW_1ú«qøøøäû<¿›=ËúuJJ ëÖ®ÁÞÁž½{ãææFzZ©©© ÜÜÜqttÈõÜ9Ì×Ó¦b±X¬Ë»nÃ'ÿþ ǽ"/\`úÔ)dddP±"îî$$Äc6›1™L899ckkâò¥K|üï¬õØØØpþÜ9¦OB|B @Ýzõr´éææÎ磿äÛï¾§^ýú$ÄÇÓµ{wf}?—·ß{€ŒŒ 8P ó¬T¹ Ó¿™É×3¿¥TéÒ@V øbÌXZµi €ƒ£#“§O§CÇN¹žÿÏ+~Âb±àèäÄko¼Éû~dí·›-Y´ˆèèhxuÔ|1f¬u†añÂ…øøú2yútJûùP­zu&OŸN`Pk׬&55WW&OŸÎ×ß΢‚¿?¿¯]›k]yÙ°n?ÑŽÉÓ§óå¸ñ˜L&R’“­¡LDDDDþ~…ŒF#ŽŽ¤¦¤°{×.üÊ”á©N)V¼8]ºuÃÉÙ€#7]i¨]·..®®89;Ó¾ÃSDEE–6nu£ý7Ä–öó£aãÆ4nÚÀú:õ²ùÑÑÑ\¾t‰cÇŽYG½ú r´éàO©Ò¥1T­VÝúzó–­0 T®RÕúD¦˜˜˜gÃFprvÆÑɉÀ  mÝ«ŒŒ Nž8@«Öm¨Y«éܵ[Žý,‹õQ¢-Z¶¢VíÚ”(Y’î=³–)ÅÆÆÜ^nÖ³wo¾š8‰ÏGÆÍÍ{{{*U®@DDD¾j¾1ÃqåÊÂÃÃ)R¤£¿ǘñh÷dÞ³C""""ò×*ôeE¤$'`ïµ &4ôu…@¿¾·½':*ú¶×n(^¼¸õëÈÈJ”,yÛ>á×ÃðööÆÙÅÅúz¹råÙĤ$'Ëc5j`ooOjj*‡äúõë+^œ’¥JåYCne½±´Æl6“‘‘qßçikÌúQä5;’—ÈÈHë`»töìCV}9÷‹‹‹µþ\Ö¬^ÅšÕ«n¯/:Š2eËæz77wvnßΆß×sñâERSR¬ÇÍÌÌÌWÍ»vãÛofpôÈaF½ò2ÅŠ£f­Ú<Þ¾=nnîùjKDDDD O¡‡ƒkW¯Z7ÖŽ[²NÎÎøúúÞöO<ÛKOO·~× É7Žgc“s"äÖA«½½=ÕªWçϽ{9tðáYáàÖYƒ‚ºŸó, ›¼'‚23-Ö¯½½½qus»mÇ<ß¿aýz¾Ÿ3€ªÕªSÚÏ3§OqúÔ©|×Ù´ysJûù±níìßOhh(«W­dÓ¦|øñ'¹@ùëz8X½j¥õëšµjàã[”°°0Ü\]ùøÓÏr òÓÒÒ°³³#%{ Ò­nþtß"E|rÝÇÇ·(µ¼%)1ѺŒçÂ…ó@ÖšýW¤ëÖ«ÏŸ{÷rüØQkx¸õ~ƒ‚º—óŒÍß²¡»ñööÆ`0`±Xr, ²Xrîçææf5©R­ÏfÝ–žžŽÉdºãq6üžu“ùc5j2ê­¬'-]¼8ßá )1‘sçB€¬§5ÙÚÚrôÈa&M˜@rR›7m¢oÿþùjSDDDD Ç}ßs””ȹŽ=¬™ß°mË kÀ}ã1¦ 5²nPž9ãk.^¸À¹fLŸÆÄqãn»Â¿~ÍŽ=ÂÉ'øí—Ÿðõõ¥hO±¹qÃpFFsf}Ë…óçÙ¹};Û·n NݺÖzÍZµ0™LÖcúúúæ¹”&¿ò{žwãä”u%?%9™ûƒ ¿m[[[ëÚÿ ¿¯gp0'ŽgŲ¥9ö3ÔÉA[7ofõÊ߸zå Gæ³O>æçËo:nV¸ºrù2§Nž$>.Î:;“OB|ýúqâØ1"##Yðã,øñGë¶ŒŒ :vî‚ åÊ—çØÑ#„……ñéÇñ‹#hа!Ë–,áì™3¼8,g ™™™÷4ûàããCËÖ­Ù¸aó¾ÿžŸ–/·>²Õd2ѼEË{î)\…ö´"{{{Ê•/Oÿxïƒ[—ö@Ö½¯ŽE÷ž=)^¼8¶¶¶¸º¹Ñ aC>ùìóÛÖç?Ñ®=U«UÇd2áééIï¾}ïú©»žHß§Ÿ¦DÉ’ØÚÚâìâBƒ† ùàãñôô̱[¿¾_ù=Ï»©þX :w톻»NÎÎ)R$×ý*W©Ê #^²³‚¿?¯¼þúmû¹»{ðáþC‹V­ðððÄh4âííMûOñþ‡YïÙèÔ¹3õ4ÀÁÑOOO\Ý\騹 Ý{ö¤H‘"Ö€uóòŸ+—/ßóy=;p½úô¡X±b$'%áààH­Úµù࣭HDDDDþ~†ÄÔ4ËÝwûëÝü Éýžy†víŸüËŽµeÓ&¾ýfÞÞÞŒ›4ùŽŸ¼,""""òOQè7$?Ìâã¹|ù’u}}½  DDDDD²ý£ÂÁ†ß׳lÉìììhûĸ"‘‡Ç?*8»¸`gg‡——ýžy&Ï5ü"""""ÿDÍ="""""ò`ÚÓŠDDDDDäѦp """""@ï9ˆO,ì:DDDDDä/äêê|×}tψˆˆˆˆZV$"""""ÙDDDDDP8‘l """""(ˆˆˆˆˆH6…DDDDD$›Âˆˆˆˆˆ """""’Má@DDDDD…ɦp """""€ÂˆˆˆˆˆdS8@á@DDDDD²)ˆˆˆˆˆ p """""ÙDDDDDP8‘l """""(ˆˆˆˆˆH6…DDDDD$›Âˆˆˆˆˆ """""’Má@DDDDD…ÉöP†ƒçÎe×κ ‘Û‚¾qÒøq$$$àääH¹òåiÙº5nnî…VÜ£àÄñc888R¶\¹Û¶%%&²ïÏ?iÜ´)666„^»Æ²%‹yqäË †Pí?ׯ X½ò7¢££ñ-Z”Þ}ûRý±„^»Æw³gr7WW:tìDËÖ­HKKcñ‚ìݳ›ä”üý0p ÅŠàÄñã,œÿ#W¯\ÁÙÙ™ÇÛµ£}‡§r­Áb±pìè¶mÝŠ9#ƒG¾lÝv·ãÜÚΪß~å÷uëHNI!00áíí}×ãÜ*&&šÛ·³}Û6ž:,ÇïñúåVÖ¯gÕo¿GÉR¥èÿÌ*VÌwÝ­ÏÿóIŽý›4kÆÐ†çy~"""’?÷5sЭGwÞ~ï= „½=ßÍšEB||aÕöH8vôçBBrÝ–˜”ÄÖ-[ÈÌÌ ˆ»vS0ø›<°Ÿ%‹1ü¥‘|ýí,ZµnäñãILHÀb±0nÌ—øùù1õë i$óçýÀ±£GX¾t)!!gùèÓϘ.®Ðj”; 㩎)W¾<­Ú´áÇæŽC|<¡¡¡téÖ “ÉDjÔ¬ÉàýT®R•„„xºõè§§gÖ{[·aìè/½JÍZµhÜ´)þøTäÊåËÖY‰›½ùÎ;¸»{°bÙ²ÛåŽs«ýÁûhب¥J— c§Î¼óæ$'%áèätÇãܬråÊLœ:£ÑÈÆ röYhèûå—ŸVp.$„W^…½½ƒžBi??5j̼ï¿'**ЍÈÈ;öѽ¶ãããCTT$>¾¾¸»{äyN"""rî+ܪB@‡ **Š%‹ѹkW*øû³sûvV,[Êà!Cˆ‹ã©Ž(Yª!gϲdÑ"J”,yÛ²¤#‡±kÇvz†˜¥p IDATöé‹——Û·neáüù ö•ªTáø±ãÖppæÔ)ÚfOO† {¸¸X¾™þ5ÑQÑ<;p666,š?ŸÝ»vÑ¢U«»ÖE‹–­x¢]{NŸ:ÅOË—S©r^xqË—.ÅÓÓó¶å5jÖ¢d©ÒÌüúk^ù2¶¶¶\¼pá¶>+¬%oßô;pòÄ œ](YªgÏœÆÁÁ'ggëv/ï"DGEðüÐa9Þ{ìè*W©@`PAAÖmI‰‰\¸pžÞ}ûæZǵw:έbbb¬A'«Þ¬åD±±±8:9ÝóàÙÙÅ%Ïm11Ñwì—ú Q¥j5€}––Æúukñ+S†"EŠàããsÇ>º×v¢£¢¹pþÊO;¨[¯>¯¼>вkÇv~ýùçB;g)䙃øøì²¿Žãü¹sŒ3ƺÝ`0äyO‚«›k®Ûââb­K-n´áááIll,5kÕÂÙÙ‰3§ONÅÀŠØÚæ~Jƒ›[;7:ù©õÆ@%3ÓrÛ¶ûUÐoîÉ[B|<£?ÿœÇÛ··.û1mɼ%dšÍ·ý=s†i“§ðòk¯Yoü½Áb±0cÚTììLôèÕ €_þ‰_~ú €Ýó OnÇ2ð9ëöÏF‰1GÍæìP`Ìãw¿ îµ_nöÆÛo“žžÎ¶-[ûåhÆŽ‹«+{å·†Y÷)Q²$ºteÓÆ?èÖ£Ç}œ©ˆˆˆÜ¬PÃÁé“'ñ+SWƒéÒ­ûmûåvSctt4¥ýÊÜöº››{Ž«ã‹…˜˜hÜÝÝ1 Tª\…S'OI³æ- Tw~k}îT£Ü]Rb"£ÿû97æ‰ví­¯{xz’ššJB|¼u —×ÿ€ çÏ3iü8†¿4Âúäœ, ß~3ƒ””T^yýukxìØ¹ ;wÉWygæœïrìçéåIdD¤õû¨¨¨¬×= o-þ½ôË 'Ž ¨R%L&-[·fá‚ù\¸pž*U«åÙGùmgÍêU4lÔȺlÊÁÁÁz³¿ˆˆˆŽû^Vd±XˆŽŽfÕo¿I£F¨Z½:§OæÌéÓX,ÂÃÃYõÛ¯Ö+áq±qœ8~³Ù̑Ç¿žuåÿV5jÕdïî]\¿~ôôt¶nÞŒÉÎκ,¡Jµjœ:yŠØ[ÖaçÇÝj½;; ñ¹.é°³ËZ w߃˜û©ñŸ.%9™1£¿ Nݺ· Ø‹+F‰’%ùyÅ ÒÓÓ9sú4 F­š\¹|™ñcÇ0ä…¬÷¶Ülîwsˆ‰e䫯Z—÷ÄÝŽs³Zµë°k×N.]¼Hjj*?ÿ´‚ J•ppt,ðñou·~ #äìY ë‘§3¿žÎµk×°X,ìÞµ‹L³Ùzcñú(?íœ8vŒ¥‹“ššJLL4ëÖ®¡FÍZ…vÎ"""rŸ3+–-Ã`0X?çà¹Áƒ­W}||èÞ³'›6þÁOË—ãìâL“¦M­ƒ''GΜ>Åê•¿áàèH§.]rýŒ„ªÕª“œœÂ²%‹INJ¦x‰ôíÿ´µ___<<=(Y²dgw«õNª?VƒŸ–/cîwsôüÛÜÜÜ©T¹2³¾ù†N]ºàxƒ·û©ñŸî ¿söÌ.^¸`]êP³V-^zåU^{ãM¾Ÿ=›/ ÃÍÕ•~O?c /œ?ŸèèhÆ›£Í>ýûS¡‚?Ö¯ÇÖÖ–žlÝæääÌäéÓóUãŽÓöñ'r¼V¿A¢¢"?v ‰II1ìÅù:Þ½¸S¿ìÚ± çÏóòk¯Ó¼eKbccóßω§d©R¼þ書¹¹röìûè^Û>#""""òO÷H‡ƒß~ù™Ë—.Ñ©K×Ûžò#"""""ùó@–‰ˆˆˆˆÈÃG—ÛEDDDDP8‘l """""(ˆˆˆˆˆH6…DDDDD$›Âˆˆˆˆˆ """""’Má@DDDDD…ɦp """""€ÂˆˆˆˆˆdS8@á@DDDDD²)ˆˆˆˆˆ p """""Ùl úƈˆþøýw®\¾@©Ò~´nÛ//¯û*èÚÕ«„……R£f­\·ïÚ¹“À  <==ïë8òÏ’ššJðŸ²mëVª=VvíŸàçËùå§Ÿrì›™™IÉR¥øô¿_––Æâ Ø»g7É))øû0`à@Š+vÛ1ÒÓÓY0o{÷ì!=#   ž4Øú»šW ù©Àb±0hÀ3˜ÍfëkEŠaܤɷµc±X8vôÛ¶nÅœ‘Á‹#_αý—ŸV°aýz’SR ªÄ³ƒáíí @èµk|7{6!!gqsu¥CÇN´lÝún]-"""°…³ÙÌ‚y?P¹JU:vêÀžÝ»Y0ÉTà‚®\¹ÂÑ#‡ó;¶ãëë«p ÷,**Š÷ß}‡ÀÀ@ÂB¯QµZUë¶Î]»Ñ¹k·ûO?Ž€À@–/]JHÈY>úô3œœœ˜3ë[fL›Ê‡Ÿüç¶ã,[²„Ë—/ñÙè/°·w`öÌo˜;g6¯¼>êŽ5ä§^€˜˜233™0e*FcÖäŸ!÷IÀÞ{{{{ŒF#Ž9¶íÙ½›µkÖð¯þMfÍü†ogÌàí÷ÞÃb±0nÌ—Ô¨Y‹Qo½ÅÅ øâ³O)Z¬(•«ä]»ˆˆˆ<Ú â‰O N½º8:9ЬE ¢££ˆ‹‹ÃÛÛ›ØØV¯\Å¥‹q÷p§Uë6ø˜ÀÄñãiѲ%'N'>.ŽJUªðøíXùë/œ8~‚ŒŒ &ÇІãà˜5  gÁ¼HNNáçË©U»Í[¶$..–Õ+Wqåòe©]§.õê×/¼’Gž««+_Ÿ€£“Ÿÿç“;î{õÊŽ?ÎÐá/Y¿ëÝzô°†ÑV­Û0vô¹¾·L™24hØ77wêÔ«Ï‚y?仆»í…‡‡Ç=ÍÒ½ùÎ;¸»{°bÙ2Î…„äØváüy)Q²$Í[´`òĉ„…†J—nÝ0™LTð÷§FÍšÞ¯p ""ò?¬@áÀÍÍ???~ýégšµhAi?? ]ºu²–e,œ?ŸÀÀ zöîÍ¥‹Y²hÃGŒÀ`0’’ÂÀÁÏ“˜ÀŒéÓ©\¹ :v¢h±â=r˜gÊqL^~íu&|5–N]ºR¾B233YðãT¤[DGG³dáì©þXûìù_a2™îy6ëçŸVкM[x~è°Û=Bå*Ur}oÃÆ­_ÇÇűuófjÕ®“ïî¶oTTé|ôÁûDGEP±"ý<›ëlš»»GžíT©Z…-›6zíÞEа}Û6jÔ¬ @LL489;[÷÷ò.BtTä=ƒˆˆˆ<š tC²Á` ïÓOS1(ˆµkV3yÂxÖ¯[KRb"uE2>.žf-Z`4)[®Å‹çÌ™ÓÖ6êÖ«‡Á`ÀÅÕO/O¢ 0è¸tñ"I‰‰4oÙ“É„¯¯/õ6"xß¾‚œ–üÃ………±ß>o÷D®Û;Êæyæ¹wlgÈÀçñÂ0ÂÂBéܵk¡×Y¤Hê7hÀ³ñê¨7ˆ‹‹cú”Ûï7¸›ÊUªRµz5Þõ:C>ÇÑÇé×ÿi ké Á&ç?6669îs‘ÿ=¾!Ùh4R¯~}êÕ¯OTT;¶meάoy~Ø ÄÅÅ’‘‘Á„¯¾²îo6›)W¾|®m 233ó]Cll îFëkÞÞÞÄÆÄäÿ„äï·_~¦qÓ¦ÖeA7;{æ Ó&Oáå×^³Þ°›—™s¾#1!… æ3qü8Þÿð£B­³l¹r”-WÎúýsƒóΛo’œl]†w/Ö®YÍ¥‹?y nnnüöË/|ùÅùøÓÏ0mɼ%dšÍØÚøŸ yèÿôgÏœ!$ä,mϺÂêååE‡Ž;z4W._ÆÕÕ ''GF¾úšuÑ ‰ ÷_u677wâbcÉÌÌÄ&û*gdd$îy/¥ÉMdd$;·oçó/ÇܶíÂùóL?Žá/  bÅ<ÛØµs'åÊ—§hÑ¢8»¸Ðöñ'øà½w1›Í9ìýúsï^¼¼¼(_¡öÙK ò°÷ï ¦a£FÖ°ÓþÉ'Y±l)áááxxz’ššJB|<.®®DFFàåuç`$"""¶-+òôòâ@ð~öìÞMJr2ééé<°ŸÌÌL¼‹xSÚÏ“ÉÄÖÍ›1›Í$%&²ní¢¢¢îÚ¶‰¤¤$RSS±X,¹l·#..³ÙLi??œØ²iéé鄇‡³g×NjÕ®]Ó’°U¿þJí:uðõõÍñú•Ë—?v C^x!×qØOrRûƒ÷ñãܹ$&$žžÎÖÍ›)[®Ü=ƒ³g »§Z#"Âùnö,¢££IMMåçËñÀÉÙ™ÈÈHNž8qOí”)[–?÷î%&&³ÙÌÆ?6àâꊷ·7ÅŠ£DÉ’ü¼béééœ9}šƒP£VÍ{j[DDDMš9ðòòâ™gŸeó¦MlݼȺa¸WŸ>Ö {÷ëÏúµk™4~666T¬ÖT^üýؽk“'L`øˆ8»¸äØ^§^}Ö¯]GDDmÚ>Nï¾}Y»z “'LÀÑÑÚuëQ­úc9-ù‡Šaó¦üûãÛŸ ´pþ|¢££?vlŽ×ûôïO«ÖmønÖ,ž6Œ*U«ñìs™÷Ã\Þõ:™™™òÒ+¯ÞS «~û•’¥JÓµ{÷»îûD»öÄÇÅóá¿þEZzþþ i$ûþÜ˾½òîûïßµ½z±`Þ<>x÷=RÓR)[¶,o¼õ¶uéÐko¼É÷³g3â…a¸¹ºÒïégô¤"‘ÿq†ÄÔ´Û/Ï‹ˆˆˆˆÈ?N–‰ˆˆˆˆÈÿ…DDDDD$›Âˆˆˆˆˆ """""’Má@DDDDD…ɦp """""€ÂˆˆˆˆˆdS8@á@DDDDD²)ˆˆˆˆˆ p """""ÙDDDDDP8‘l """""(ˆˆˆˆˆH¶‡6„œ=ËœYß2iü8æÿð)Éɺ$ΦfÒåd2ö'Òøh;âÍÖmÎ{â N4ßáÝ®ØØôëKTTÔƒ.åÞ€~}9ò Ëx(üÕ}±bÙ2Æó—µ/"ò(²½Ÿ7ïÙ½›}î%.67w7jÔ¬Eƒ† 1 ÷UTzz:Ë—.¥yË–Tð÷'*2{‡ûj³ N?†ƒƒ#eË•`Ù’%”)[–:uëþíµÈýù&,‰¡©„g@%GF—¶§«€Ó)™¼z>•}‰fŠØÂëÅíäkʵ‘çR)ag`U#üìÿž|}õʾŸ3‡s!gquuåɧ:Òºm[ÒÒÒX¼`{÷ì&9%ÿ H±bÅr´Í»o½IÓ¦Íè?`@¡Ö·hÁÒRSyæ¹ç ÜF\\,ÖÿN§.]0nÇl6³nÍj¶lÞLB|“§O·n»S?Þj寿P§^}Š-ZàZþJ…Õ_y±X,¬úíW~_·Žä”0pÞÞÞ…~¬ÿEwû» ½vïfÏ&$ä,n®®tèØ‰–­[[ßùÒ%¶mÝJð¾?ùò«qy'9)‰y?Ìep0F#õ4 w¿~˜L¦{þ·`ÚäI¸¸¸2`à@ ëïhâ¸q¤¤$óæ;ï²ñ œ:q‚—^y•kW¯òö£¬ïurv&00þžÅ××·°ºPDlþÜ»—Ý;wðD»ö¼:j]ºvã@ð>víØqßEÅÄÄ––FºuñòòÂ? à¾Ç­,Ë]÷9vôXŽ«VM›7§R¥J…Z‡üõÖÅfðÙÕT8q­– }¼méu&™ X€§’©ædÃùšÎÌ©àÈ;—RÙ—‘k[‡“Ì<]Ä–@G»)eW¸¿—y™ý /¿ö:Õ«‘ãááá¬üõ7Zµiˈ—_ÁÛ»±±q÷\{dD8;w¡ÿ€\»v5«VÓµ{^{ã |‹e寿ð‹#¨X‘:uëæºãÈáCìÚ±n=z2òÕW)Z´( çÏÇlþÿ5ç))) ü<ƒ‡ åðÁC\¾téžë”ÂÓØÕHGϬ~r¦…¯ÃÒ¨ædCi{¡é™¸ ¸ß4º/igChzΫ±N6ÎÕrÆÕÖÀ¦–½ó2·×/¤r&ÙÂÑêά­äÌìëéü5ñ¹ê9¹ZË…ïýyûb*‡“ò¾úkkkK`PÛ¶nÅl6s.$„k×®Q¹rž:ŒªÕª[÷?vô•«T±~õ·8xè°;ÎÀíØ¶ß~þ™‘¯¾ÆÄ)S)S¶,cþû9ÿ?‹’””È¿Ão¿ÍÖ͛ٱmÛm턆†2~ìXºõèÉ´ßPµZ5¦LœdýÍ3}ÏÄŒY³iÖ¼_}ù%›6å½÷?`ܤIÔ¨Y‹”äd¦Lœ@ßþý™1k6Mš5câøqw¼"|ðÀ~J”(ÁÔÉ“öü`Þ÷NŸ:uOýxCÉR¥˜<}:Î..¼øÒKôìݳÙ̘/þK™²e™öÍLžyöY¦NšDLL´õ}E|}øï—cøàãÙµcë×®åÃOþÄ)SÈÈÈ`õªU7õÑ5F¾ú*¦L¥JÕjLš0>×óš=s&öLž6ýûßü¾~ÁûöÑ¢U«ÛúëNý~øÐAÖ®YÇÿùS¦““#ó¾ÿ.Ï~„¬\/ïÿüze/'ŠÍ±_FFc¿Mó-™ñí,ºõèÉŒiSIˆ·î“”˜ÈGÿù”q“&‘˜˜ÄÂó­Û"#"x¼]{¾š8‰2cÚT"""r£a£F„……Yÿ Ý¿/˜R¥KçÖö"#iÚ¼Óg~‹É”wè¾Ua÷ßþ.cb¢qppÀÉÙÙºÝË»ˆõ÷ÉÝÝãžj¶X,ÄÅÅæXêå]Ä›˜è˜»Ö—…óçsèÀÞ~ï_¸º¹ÝSñqqlÞ¸‘ªU«ÞÓþ"òp+P8HJL°^QÈÍჇ([®A•*a4 ¢‚¿?‚ƒ­ûÔ¨U“É„Ñh¤d©RDEEÞõØ'§l¹ra2™¨U»6ööö÷\{ù ðõõÅh4âéáÁà¡C)Z´(666T®\åÿØ»ËÀ¦®¿ãß$MݶX‘¶§¸Ûáƒáî 0¶ÁÆÜRdÀ†ë°áîînÅ ¥´ÐRK½MÓ$Ï‹BFWÆþ“ç÷y¹Çó»çœ[bc ndÝ­©Q«6… B­VÓ°qc2´Z†„˜ÒT¯Q…B­NÎN/u~â¯óÎ4Ü.$3+RÇ,oK”@¦”/›)@÷'V$¤è¬‰ÑñysœÌx[(èéjΖ8æJxª3©3RÃVÅõJ6”²ÌyRŸ~ý9t`?ûöáóO?¡åÛoçz§ùVÐMŽ>Lï~ýM¯-]´ˆ·[·ÂÓÓ3ß::HËÖ­)V¼8têÜ™´´tÓR€¶í;`i•µ§~Æœ?w6G9ÇůŒ?U«bffF«6myÎÓ§O9qü8+U¢|…Š(•J7mJ«6­sà€BJ¥âéÓ§hÓÓiÖ¼_~óm¾çMdd$í:t`μùT«^ÙètºWêÇ?ºt“x†N;£V«)W¾Þ%JpõòïwukÔ¬‰B¡ÀÍÍ 7wwêÔ­‹¹¹9*• _ßlK”üÊ”ÁÁÁ…BA»ˆŽŠâqxxŽz»õèIï>}133ÃÓË ooo"ž<εùõ»™™z½žˆ'Q*• 24Û{$7ƒ…ò÷Ÿˆçû^ Ÿ›øÉ§4hÔ…BA­:u0 DEE™ŽT­†Z­ÆÜÜœ6íÚráüyÓ1'''||}¨P±Þ%JpùÒÅlå;88RÆ¿,çϲf5žÏLü‘››U«U{¥ßxóý÷¢?~.õz}¶¾P*•Ùn.½ ƒÁ€ÑhDùBYJ¥½!g9¹}7üѹ³gÙ¿wƒµºà…cFŽ``ß>Œ|oÁÁ÷x·K×Wj¿âŸéµ–=ŸRNOKËvçãE ñ9¦\]\\ò ¿ÌÚÙ¤¤D^¡µy³´²âÚµkݼV«%S§{éõ»‰‰ ¦©Z…B££ ¹nöR(ÙÚ`ñr6ûY‘n0òkL&ïÜMãz2ŒúL IDATÌPù‡Ë’i„?³•àifVpÑöNÏoÔŒPÃ&kpµ¢”%?>ÖÑ$(;•‚á…ÌóÜ  Õj™þãº÷ìEÃÆyÉŒ©?âéU8ÛæøûÁÁÌ›ó£ÇŽ5ÝI<~ô(II‰´lÕºÀvÇÆÄP¨Ðïï]¥R‰›»ÑQÑ÷öΑÞÕÕ•[A7s–CÐÍ 40[Yš¸8bccps˾añíÖm€œw¤---ùä³ÏÙ±m+[6m¢H‘¢t|÷ÝlËœþH§ÓQ³V-Ê<ÛÔ¶}vnßÎÊ/þRý˜{ßÄ¢Õj>tˆé5ƒ^Où rM¯T*³ Ø E®ƒj lll‰×äT ‹. ,, ƒÁ€&.ŽŠ•*åÞÆ|úÝ¿l9¶-[™;g*T s·îùž³R©ÂðÂ`Uÿ¬ý*³ì?fffÄÆÆ°jÅ âã5¦k^ßwÎÎ.$'%å9vqùýÎ÷‹êÔ­Ëî];iݶ-A7oÒ£÷›ÝTÿ¦ûï¹Ü>—*•Y¶¾…¬÷“™Ù«ý$+•Êï-½Þ€™*{9¹µ!7*•’o˜Âª+øiÖ,>šôI¾›Ýgý4[;;t:ûöìæ‡o¿ej`à+fBˆ–× ±°° 44Ô´¶àæëœ=s†ƒcoïÀÓ§O³å‹ÅÑñå¦KóbggÏãǹß9ƒ¬»[FãË Âo\¿ÆåKéÕ»6¶¶„‡…±zåÊ—Êkoï€Fóû’£ÑH|¼‡7¸ˆ7çDbÖp={–JÜÕ|®åZšž¢æJR Fâ28?[Zža °ùë?…ÈC5%w¬œ5¾–ÙËÉ0B¨ÖÈÅ-˜îmÁå=­ï¤ám© ‰}îÇЇIJJ¢É[oàU¸0U«UçÂùs¦AmèÇÌœÁ{#G˜îÂlÛ²™ØØXõë dÝõU(\»zÅ´~û9g¢¢~ÿÌ ¢£¢qsÏ}0“-@~ÎÉÉ™jÕ«3|ÔèÇ®_»FdÄ“l¯Ý¾„·w‰i““’P*•Œó>ƒS'N0õ‡ï™ûó/yÎZºººúð¡éÿÏèæææ/ÕyqrvÂÞÞÙóæåXšõgïšš’BRR"ŽŽ9ûrúShѪÃGF¡Pð÷yÏœä×ïQQQ”(Y’I“'£ÕjY³z?Ïý‰É_|™wyÎNÙfRŸŸ§Ó¾Ã£¢¢˜ȧŸA‰’%è׫gžå>}ú[;»<OŸ>Å7—}%ÕkÔ`ùÒ%Ø·O/¯—~Š”ÊÌì¥n̼éþƒ¼?—ŽNNhµZ’“’L{bccpv~µ'AeÝ”r$66Ö´ÿ/.66Û ´¼Ú›ªÕªãáéÉð‘#ùì“I¬ûõWzôî]`;Ôj5›4eÝš5<Œ¤Xñâ¯tBˆ–×) ê5hÀ¡û  C§Óɱ£G)[.kÍa…J•xÂÛ·ÑëõÜ»{—ûÁÁTªRåO5¸LÙ²< áî;hµZ.œ?Ozzºé¸‹‹+÷îÞE«Õò8<œ;·nåYVrr zƒž¤ÄD._º˜mݯ¹¹šää¤\ïøU¨Âù³gˆŠŠB§ÓqüèQÔææ¦ ×âŸã^º!!iÜK7`6Æe¢7Byk%¥-•”±RòÃã Ò FÎ%ëÙ¯çmÇ×4¤µRA'3>Õ«3’¬72;2ƒmšL”@—»é,ŒÊ Ó.j%æ(Ð糌ÉÓÓ¥RɉcDzìÑÑ\¹rÙt7ÿqx8Ó¦2xØ0Óç﹩3Y²b%‹—¯`ñòÔ­_ŸfÍ[ä 7iÊÞ]»{ôˆŒŒ 6o܈¥¥E¶2·oÝBzZCB8vô5jå\ÚQ·^=._ºÄ•Ë—0 „‡…±xát:uëÕãÊåËܾ„ÑhäôÉ“Ì D¡TšWƒ^¯'..ޝ¿øœ{wï¢P(°w°/pW·^=n޸΅óçÉÌÌdçöm8::f­O/ ÿÈÒ‚¸Ø8ôz=eüËbn®fóÆèt:âY¹l‘‘‘ù¶'/7®]#ìÑ#´Z-ë×­ÅÓË‹ÂEŠdKc4IJJÂh4’ž–Ƶ«W }hºãþÇþʯ߯\¾Äô§‹Z­ÆÆÆ¶À¾ ¨Z3gN›Ú¹uËfÊøûçÌ’“’0 èõzR’“Ù»g7ƒ![ù'Ž'!!ž„„x¶nÞDõ5LÇbcc9î:Ž“ÇöèUsnœ·²¶¦RåÊlÞ¸1Ï%E¹ñôôäò¥‹¤§¥qïî]ÓÒ¤?zÓý—ßçÒÃï…ٺy3:Žà{÷¸zå • þ}Ôjµ\ºøû²«€jÕØ»{ÉIIh4ìßG•€ª¶!?Ö66Œ7žÃ‡rú%ž@˜žžÎžÝ»±¶±¡P.3çBˆ—×þ;5jÖÄh4²mËf’’’qpt J@UÓS&œœœèܵ+‡`ûÖ­89;ñn—.úÙ®®®´i×–ƒû÷¡Õj)[¾<æææ¦ã 7fûÖ-Ì ¤P¡Bxz㬀ªUy΂ù?ckgKå*ØÛ?2ÝÍ©X©2[6mdŲ¥ 48[Þò*’––ÎÆ ëIKMÃÓË‹î={ý%ÏN?w5Q™ÚÝN%Ve,•üæk‰›YVl¼Þ׊±!Z¼/§àj?³Èö¤¢×1ÇÛ’IaZªßH%Õ`¤‰½Šn®f˜)à7_K&<ÒòexvJRHM3‡¬ú†ÂûãÆg{z޽=c?ø€õkײ|élll¨[¿-Zf=:tí¯¿¢Ñhœ6-[ºõìI³æ-^ºÍuë×'9%™Ù3HLJ¢T©Ò|ðñÄlKÜÝÝ™øá2t:5n’ë ­HÑ¢Œ;–õk×2oÎhÿNÖSY¼ fÄè1¬X¶Œ˜èhŠ-Ê„>ÆÂÂWWWjÔ¬Éä‰3lÄHªU¯N¿Yøó|4 .®®Œ=K++öïÛË¥ ùhÒ¤lu{xz2bôÖýºš_æemª3n<*•ªÀ~ü£f-[²zå ž<~LÞ½™0q«–/gÔð÷P©TÔoÐ77·Ë¡^F!OV._ÎÇ!xyy1jÌû9f$ CÞÎÚիظa+V¤J@ééZ€\û+¯~«YsâbãøròdÒÓÓ(îíÍÀÁYK¤æÌ ¤¸·7í:¼“­þšµjKà´©¤¤¦âçW†¡ÃGä8—’¥JѦ]{fL›jz¢RiP„ƒ£ßó qqqT¨PnÝ{˜ŽÙÙÙqùÒE/\€­-ï•çïD­:u¹pþ|®Ai^:wíÆÏóæ2jø{-VŒR¥Kåš.¿÷íëô_AŸË±L`ù’%Œ6{;;zôêýRøˆ'OXºhþþþXY[Óµ{~]µ’&|€R¡¤f­Z´mßþ¥ÚŸ¢ÅŠ1`ð–,\@Ñ<öå<_fgiiIqoo>øð#YR$Ä€"E›ñ÷> ú5FÓ©N§cÚ”) <øûÇŠ„x:Ž!úóôéÿº÷òê+HJNbX.ƒÇ¿ÂÆ ˆŽŽúŸÕ÷&-]œõ÷&ž.ÿnß|ùõ4¤aãÆIùŽG‡w:R§^½Çž?ÖvjàÌ—*ëÆõklúí7>ûò«7ÝÌ×öW÷ŸBü¯ýoþ¼ë”’œÌÊeˈנ×ë9qìö¸ººþÝMâO9ö,þeËýë­VËãDZ³µûŸÔg49{æ4›4-8±ÈWLL ÑQQÙ–ùüFâÙ¶e õ4ü»›còoé?!„xníÄßÀÆÖ??~]¹’´´t<<j4 …â×'þ["ž<á£Æ›þomcCñâÞtîÚ•Ò>>cËÞ¼˜8ƒé³f£T¾|ìo4Ùµc;öí#-=???úô€‹‹KŽ´±±±¬\¶”;wî T*©@ï¾ý°°°àÒÅ‹lX·–˜èh<½¼èÑ«7eüýߨ9þ×Ìœ¹r4kÞâ•òEFD°lÉ<¸½­Û¶£qÓ¦¯œÖh42 Ooôz½)½««+3fÏyý“Bñ¯õÚÁ@Çw;áãëGBBgÏœfÙâÅ 4[;»W*Çh4æ;ÈOIMåø±cÔ®[¥R‰«›íßé(x%sæÏÇÖÖŽ´ÔTvïÚÅ´§0ë§¹¦Aíߥ ÷ÿ«(R´(ïõJÀ™S§Ø½sò nîî,[²˜ŸçþÄ'Ÿ}ž#휙x—(ÁÌ9?‘ššÊÔ¾g˦MtíÞFÃÜÙ³6b$U«røÐA§OcöÜy{?ÿSu|·3vö¯þ9cêT®Àø?äQh(?|û …< Q¶\ùWJÁ``æOsQ©²Þ7J…L* !ÄÿW*80A¥RáììÌÛ­Z£‰ãÔ©“4oÑ’ׯqúÔ)@Zj*Ó§3bô(ÌTfÌ ¤J@nÝ¢CÇŽxxx°wφ<@©TR©r5i•˗8rèóæÌ¦U›¶˜››³nÍ&|ü1‰‰ ìÞ¹‹ÇááXY[QµZujÔ¬ Àî];IKMC¯×…™ZMÛöðððø3§.þ…TJ*• [;;Ú¶kÇö­[xI±âÅ ºyƒ_W­"**ŠâÅ‹3pÈP<<<8sú4[6mÄ¿lYn‘–šJ—nÝ©[¿>CBXºxøúú‘šš’­Î}{÷°kûv2t:*T¬Hÿƒ°´´déâED="))sss>ûò+¢££Y¶x1wïÜÆÅÕ•n=zP¹JÀKÕóÜýà{LÿñG.]V`Û_tùÒEjשC‘¢EhÛ®=Oø€´ÔT¬¬­MéÒÓÒ077§Ó»±°°À‚Zµk|/€Çáa¨ÍÍ©^£›4eå²eDGEQ¤hQž<~̲%‹y‚­­-mÚµ§É[oå{ÝN8ÁÆ ëIKO§Nº Ó±ŒŒ Ö¬^ÅéS§°²´¤qÓ¦´ëðŽG€_?‚µMŽ:bbbX¾d ÷îÝÅÎÖ–¦Í›ÓòíVìÙ½‹Ã0eú â=|8?L†§—Wž××`0°nÍN?†¹ZMÕjÕó<¿Ë–R% €·[·aéâE$'%¡Óeò8< KK† {ï%²åyIdd$:vD­VSªti*W©Â•K—s¥ÕÄÅáè舳³s®íÛºy÷ ]›Ž¯¯Î3­Bˆ¿7z{¨”BC_:½µµ #F¦DÉ’ìܱ sFG¯¾ý¸xá÷îÞ¥r•zöé ÀðQ£s,1 ¬Y½777F½ÿ>:wáüÙ3\»zÅ”&<ìo5oÎ{#GQ¢DI<øfNXü+¥§¥±}Û6)äáAdd$Ó¦ÑñÝÎÌûeå+Tà§Y3Mé#ž<¡|…Šü0uýbéâEèõzt:3§O£\ù Ìœ=‡VmZóäÉS¾“dzsÛ6>œ8‰³f“š’ÊoëÖ½Pîc† ÁÄO'£×ë™úÃ÷÷öfÞ‚…ôîÛ—¹³g¯)°žüäÕö?ŠÇÙå÷Ÿó³åD ÙÒYZY1iògØÙÛ›^ ºDÙòåðöÎÄ^¼pƒÁÀ±#Gpww§Ð³`|Ñ‚_(UÚ‡Ÿ-fø¨Ñ¬^¹"ßïŒð°0þò3Ý{õfzàL yz ÕjMÇW,[JdD$Óg2é³Ï9|ð Ο7OMIዯ¿aÆìÙ¤¤¤²vͯ9êxÞ÷EŠeÖOs3n<{wíâøÑ£Ô®S‡§OŸÀå‹—(R´(ž^^ù^߃ösöô)>š8‰/¿ý–´ô´<ÏñîÞ¹KÏ>}˜>k6*TdÝš59ÒÄÇk°´´Ìè8»¸¯yå´qqqè23ùbò§Œ1œŸfÍD£É:výÚUöîÙÃç_ÍOóÆÚÚŠUË—½ô¹!„ø÷y£Á-Úôô—NPµ*( š6kFÓfÍQ©T¸¸¸àááAllle„=zDjJ 7F­VãîîNÍÚu¸tñ¢)Miœœœ(îí&®àrÅϘ‘#Ø·C äúµ«LüôS,,,8~ô(~eü ¨Z333ZµiËãðpž>} €»»;U«UÀßߟŒŒ âââ¸w÷©iitêÜkÊ–+O™2eLõ:x€æ-[âU¸0–––¼ÝºçÏ5¯P©EŠE­Vs+è&ñ :wF­VS®|¼K”àêå+Ö“Ÿ¼ÚþGƒÅ K‘T*™™™ù–¿mËf ½i½¼­Ý{ôdÖŒé èӛ˖2hè0Ôj5fff$$ÄOi¦Íœe rsöÌÊ•¯@µêÕ±²¶¦YóXZY Õj9yü8ïvé‚­-nnnÔkÐ0[T­†Z­ÆÜÜœ6íÚf ž»sû‰‰‰¼Û¥ )Z”VmÛrðÀ~)ã_–óçÎY3,µj×ò¿¾gOŸ¦Y‹+^{{Z´|;ß~|Qå€**T?žFFäH£×ë³]/¥R™kàWPZWWWjÖªEßþxü$&&2ÿ§¬ýfffèõz"ž>×ô …à ËÄÿ³~š‹­»vlçØÑ£xzyCÐÍ 4ДV©T¢Éeͳ½ƒMœggçlï½ůİeÓ&¶mÝ d­ý6èõÆ\ÒÆ¢Õj>tˆé5ƒ^Où 033Ë·ž—öBÛÿH©Taxa`©¨ÌòþŠ8¸?'çÓÏ¿0µ-äÁÖ®ù•ϾüŠ’¥JqíêfÎà«o¿ÃÕÕ•£G³mó¾þü3,­¬hÞ¢ež›h4š8ÜÜÝr=^¯gÊ÷ß™öl JûøæšÞÙم䤤èØ˜X\]]³õ¯§§'1Ñ1Ô©[—Ý»vÒºm[‚nÞ¤Gï>Ïòå}}ã5ÜÜ åy^/K©Tä:àW©Ì²]/Èz¿˜år½ Jë]¢D¶eKý äã ž–†Ùr <„m[¶2wÎ*T¨@çnòÔ%!„ø/{£ÁÁ½;w(V¼xVÁff¯4ß°v ÕkÖ¢CÇN( Ö¬ZõRùìíHLHÀ`0˜6aÆÆÆâàèøê' þ_hÚ¬9»wîâÔ‰Ô­_''gªU¯ÎðQ£s¤=sútžå89;¡ÑhÐëõ¹Üœi×á×Ô?/ËÞÞÙóæåØœtóF¾õ¼ NÎNÄÆü>£ö|vÁ)ÏÑñ£GÙ³k'“>û<Û£kW¯PªTiÓò¿ÊUpuuåæõëÔ­_Ÿè¨hzôîMï~ýxÂß}‹›»å+T̽]NÎ< Éõ˜££# …‚/¿þÆèåçéÓ§ØÚÙåèCWbcc³õoDD®n®T¯QƒåK—p`ß^<½¼Lwõó»¾NÎÎÄDGئ×åèä„V«%9)ÉôˆØØœs>]ª ´ΟÇÙÙÙt3æù ƒÁ@TT%J–dÒäÉhµZÖ¬^ÅÏsbò_þeç&„âïõ§—F4 »vl'..–:uêàäìB¼&žÈˆRSR8yòD¾e¤¤¤b4ÉÈÈà~p0‘‘¦àÂܾ~X[Y±yãFÒRS¹yã:·nÝ2oа;·oãqx8z½ž+—/åù· Êø—ÅÜ\ÍæÑét$$ijrÙ2"## ¬çM¨Z3gNöèZ­–­[6SÆßK++´Zm¶ez§ObÛ–Í|üédÓr½ç¼K” 8øCB0ܾDÄ“'+^…BÁÌéÓ9x`?z½[;;ÌTùßD¨U»67o\çâ… ¤¥¦²oïÒÓ²Öï[XXP³V-~]µŠä¤$ÒÓÓÙ½sG¶¥C'Ž'!!ž„„x¶nÞdÚ(ý"¿2þØÚÚ²qôZ-ÃÃÙ½cMšf ú­¬­©T¹2›7n4-)‚ü¯o­ÚuØ¿w/áaaYLصó5®JÞ<<<ð*\˜­›7£Óé¾w«W®P9  uƒäÎíÛ/•6&&šeK£Ñh²®ýæM”öñÁÚÆ†+—/1ýÇ)ÄÆÆ¢V«±±±•™W!„øûS3›7nD¡P˜þÎA¿Mw¦ *Dí:uX³z*•*Ï;ƒµÔ§mûö:°ŸcGŽP²TI||}Mííð/[–Å ЮC¬ž­9†¬µÑ]»wgïî=Ì™9++KªV¯A…Š•þÌ©‰ÿ¸¦o5c÷Ž?z”FMš0zìXÖ¯]˼9sppp ý;Mëäó¢V«ûÁ-ø…}{÷àëëG©R¥MÇ5iBº6ÀiSIHH HÑ¢ôîÛ/ײÌÍÍ™0q«–/gÔð÷P©TÔoÐ777T*U¾õ¼ 5kÕ"..–ÀiSIIMÅϯ C‡²65/]´¬¬­Y²p™™™|8nl¶2¾øú*U®B§Î™;{ñññ¸¸º2`Ð`J”, À¸ Xµb9¿­[‡••M›½EÅJ•  cò¤‰,]™}ưp‘" :Œ_W® -=ÚµëàøÂlÆ€AƒYóëj&~ø!Ú -åË—§N½z¦ãŽ|ÿÍ7ÄÅÅQ¡Bºuï‘ãÜU*>žÈò%K3r¶664kÑ‚ú šÒÔªS— çÏS£ÖïÁA~×·qÓ¦ÄÄÄðÝ7_canNz9Ÿõgý`Ë—,aİ¡ØÛÙÑ£WoÓ“Š.^8ÏÅó˜øé§¦mÑòm’“øü“OÈÐePº´ïÀ[͚Ǘ“'“žžFqoo’{ƒ„Bü'(R´9@ !ÄÿPÐÍ,˜?Ÿ™?Í}ce~8~Þé˜-Xx]7®_cÓo¿ñÙ—_½– !„ÿ\otÏB¼ŽÓ§NÑ´Y³¿»9Fضe õ4,8ƒBñ/'Áâo×½GÏllíŸ"ìÑ#¾ül2U«U£A£Fws„Bˆ¿œ,+B!„Boø  !„B!þ½$8B!„B!„B!ž‘à@!„BHp „B!„xF‚!„B! ÁB!„â „B!„€B!„Bˆg$8B!„B!„B!ž‘à@!„BHp „B!„xF‚!„B! Áâ3§OcóÆw3LΜ>Í„±ïÿOêzpÿ>ß|ùãÇŒ&5%åRçŸñ&ûfÏî]|÷õWo¤,!„ÿnf¯›1&&†Cð8< €"E‹Ñ´Y3œ¸}+KK+¼K”x3-âOºxá»wîàñãÇ|4qRŽ÷¦Ñhäë/>'##ƒo¾ÿÁôú÷ß|í ›ÙÒNŸ5777ܿϊeKyŽ›»;½úô¡l¹òÄÆÆ²rÙRîܹƒR©¤J@½ûöÀò{ç4 î… Ñµ{w*Vªœ£Ýký•];¶óóÂEXÛØ`4Ùµc;öí#-=???úô€‹‹K޼?~ÿ=wnßÊöZff&Í[´¤gŸ>öY~ç~ûV¿®ZEÄ“'8::Ò¶}4j”oyyõ±^¯gßžÝ;z”ä¤dæÌŸ_`ÛnߺÅÔ¾ÏQ¾^¯gÞ/ °±µ-°Œ-øy>U«U§É[oaem À£ÐP¶lÚHð½`ZµmCË·[™Ú»~íZNŸøøúþ¥uæ%2"‚eK–ðàÁ}ìíìhݶ›6ý[Ú"„ÿ¼Vp ×ëY³j%eË•§m»vœ;{–5«V2ä½á¨Õj‚náää$ÁøG8~ô(ë×®¥w¿~T¬XK+«iöìÚIxx8îîîÙ^×ÄÅ2êý±øúý>8²³³'=-S§Ò÷‡´` IDATî4lÔ˜3§N8mÓfÎÄÁÁ‘93ñ.Q‚™s~"55•©?|Ï–M›èÚ½;W¯\fÃúuLøècŠ/ΑC‡˜ȬŸæfÔÞæÈáCÙÚsæÔ)vïÜÅÇŸ|‚›»;Ë–,æç¹?ñÉgŸç8§'NÌöNÇï¡nýú/Õoy{bb3¦Mcàà!T¯Qƒ÷ïó÷ßà]¢ÅŠϳ¼¼úxñÂA©Tò0$„ƒö¯‰§P¡B´jÛÖ4Cñ\Jr2³iÔ¸1·oß")1ÿråhÞ¢¥©Ž#‡qãú5tºLŠ{{ÓºM,­¬Øµc;IIÉè22HHˆÇÂÒ’F›tóáaa 4jdº««Óé8tð7¯ßÀœ*U©S¯Þk_ñ×ÊÌÌdíš_9z4þeËåš&2"‚=»vÑ®}{Μ>í˜F£¡h±b888f{ýÞ½»¨TJÓ{¬aãÆ>t‹ç/P§n]ÌÍÍéông,,,°°° VíÚß àéÓ§´iÛ–%KÐä­·X½rÑÑѦ­N§cá/?Óµ[w–.^dª÷ò¥‹Ô®S‡"E‹ж]{>žði©©¦Ïc^Ž9‚Wá"¦ ýaHK/"""__?RS³/§ÉëÜ32t¼Û¥ 5kÕ ´î… úðažÁA^}ü(4”K/2=pf®ƒúÌÌL–.^Ĺ³g±±¶¦S—®Ô®S'×t»¶ogø¨Ñ¹ÖŸ˜˜ÀŠ¥K¹yó&*¥ŠÑ¥[7âã5Lž8 £ÑȔ ̄jµj <„ÖÓ¬y Z·m—£¬‹.ТåÛ¸¹¹Щsgý² ×A{AiãâbqswÏÑÇ/“7¿¾IINféâE\»z KêÖ¯O×îÝQ($'%±hÁ/áîîNáÂ…MuZXX2`Ð`Š+@:uYµ|9qqq¸¹¹ñ(4”eKó(4''':¾Û™ÚuëͲŋ¹{ç6.®®tëуÊUL×9¯|!°rù2ÂÃÃq°·§S—®Ôª]›§‘‘DFFÒ¡cGÔj5¥J—¦r•*\¹tY‚!„ø‹¼Vp`oï@±bÅØ¾e+ 5¢h±b( :tìÀ°á#ØôÛo899™¦wîØ5£ÇŽ#>>že‹S¸H||}¹tñ"A7oнWo9°o¯©®¸¸86¬[GûwÞ¡TéÒœ>y’Ícàà!¹¶-==þ‘’œÌ/óçS¶l9Š-Êùsçxðà>A©R±fõ*Nž8AÓf͈×лO_¬¬­Ù»g7ë×®¥[´ëð!°~íZÊø—ÅÜÜœ}{v“˜˜Äð‘#Iצ³zÅ \\]ñ+SæuºSüņ„ ×ë9uò$?Íž¹ZMûw:f Nü<Ÿ®Ý{ ×ë³åMINF«Õ²tÑ""ž<Á½;Ýzô¤´:]fŽºÜÝÝ‰ŽŽÆÒÊŠI“?Ëv,èf•ª˜Šçîܾ-…‹1½¶qÃ||})_±b¶´ñññ¦ ÀùÙî„„„|ƒ½^Ï®Û0x0|Ìœ>:õêóÑÄI<|Âì™3©P±Rçîêêj:ƒÁÀõkWÑh4”)[6׺óëã«W.ãååÅÜ9s¸?777úö`ZƇ/=zõæò¥Kü2o.¥J—Î1ûpâØ1\ÝÜðõó˵ K.ÄÆÖ–9óæÅç“?¥´U«2gþ|úôèÎÇ“>¡Xñâ nÞ¸£“ãÇŒ&%5•ºuëÑ£woT*FSÙîî…HHˆG§ÓåXòSPZMœ†Ð‡ùhü8ôz=U«×àÝ.]P«Õùæ-¨oV,_†V›Áì¹óHצ3mÊiùv+–.^„V›ÁÔ3HMMcîìYX?{ï¼ø=–‘‘Áþ}{)V¼8®®®dff2kÆtê5hÀ'Ÿ}NèÇLùþ;<½¼(Z¬SøžjÕkðþøñܽs›™Ó§350[[»<ó)Z”i?N¡K×n4hÔˆ3§Nñ˼¹”/_žøx –––XÛØ˜ÚäìâŠ&.6×k,„âÏ{­ É …‚î½zá[¦ {÷ìfÎÌ@öïÛ›ï&¾¦ÍšÑ´YsT*...xxx›õçÖ-ªÕ¨I¡B…°°° Zš¦|×®\¡Xñâøúù¡R©¨]·.1Ñ1h4š\ë©^£ …[;;œœˆ{ö#âïïO·î=°¶±ÁÒÒ’Ò¥}ˆ‰‰1å+V¼8Ö66( J”(‰½½%K•2Óëõ$$$ Óé¸qý 5ÂÒÊ GG'*Vªœc]·øçˆŽŠ"-5•’%K1sÎOô4ˆåK—úð!»wîÀÖÖ.ÏÙŸÆM›Òºm>š4‰âŽ™öãR’“ñóó#-=ýûö¢Óé¸rùW._ÆÜ܃‡ 5 ,ƒïÝãìéSôèÙ+GzƒÁ€BùûG÷ùRÌÌœÁÊ‹N8­-åÊWàÞÝ;¤¦¥Ñ©sg¬ml([®Ù¹}mÚå¼Ëÿ\·=éݧ/fffxzyáííMēǹ¦MHH@«Õ¢×ëùú»ïùü«¯¹|é"öï Rå*ìÛ»‡ØØX’ùmý: ff9ï·”¶”ÕkÔd̸ñôéߟ3§N²}ëÖ—Ê›Wßèt:Μ:Eç®]MßSý ÄÕÕÌÌL.œ?Oç®]qppÄÓÓ“z äh÷´)SÜ¿»wî¤ß€( nß "%5•;¡R©(Yªe›·‚n¯ÑЩsgÔj5åÊWÀ»D ®^¾’o>€‰Ÿ|JƒFP(ÔªSƒÁ@TTz½>Û{@©Tæ0…B¼9¯½!Y¥RQ£fMjÔ¬I\\§NgéâE :Ì´áòEƒ];¶Ñh$1!Ñ4øNLJÄÑÑ!G€¤¤D†„0cêTÓkϧŜœòm£B¡À`0`naÁÑ#‡yŠ^¯'-5O¯<ó)_øAR(¦sHIIÉÚs±zu¶×_¼ã+þY233ñôò2ÍbU¬Tÿ²åLËØvïÜÅWß}—k^[[údú¯¾}9îwîÜ! jUFŽͪ+ذv-UªVÅÃÓ‡ìïåƒû÷sòøq>ýü‹k¶““’˜òÝw4ûílËÖþò3} ÀÊÚšä?ÝJ¥ à ƒ#ý³ @efÆ´)SLjßþLƒ>£ÑÈöm[y·KWS>Mœggç<בtîmÚµ§U›¶ß»ÇÌÓñòòB­6gÚ”¬ÍÆÎÎμ?þƒ|ûX§ÓQ³V-Êøûж}vnßÎÃ\Ó»ºº’Ÿíµ3§Na¦VS©rÓkƒû÷3ýûÛ)?b0X¼paÏ– jââ¨X©R®u<´ºt통 Ö664nÚ”«—¯Ð¢åÛ´çââb™ôчØÙÚRµz ìíP(9®A~ilK¤¼ ¦]‡w8røß}·À¼yõM\\F£WWWÓ±Ò>>@ÖFy£Ñ˜g ÷Ü}„N§ãıcLûq Óf‹««k¶úŸ/-;zø0Z­–áCŸÕ5èõ”¯PÁÔ¶Üòeµ)†U+V¯Á`0`41 ¨TfÙÞëÏËÌ-Bñf¼Ö7ìýà`<¸oº êììLë¶í˜6e ÃÃMƒþmX»†ê5kÑ¡c' kV­2³·³'þ?öÏÙÚÚáWÆÏ´déuÜ¿NGßþP«Õœ<~œ°°°W.ÇÆÆ¥RI¿s}:Œøçqqu!>>½^o+•JÔææìܱää$>x è öíÔé3HJL$&&†ê5jY¢¹¹ÚtV¬T™§g êSSRxÔÈlË2Ž=Êž];™ôÙçØÙÛgkWjJ S¾ÿŽ:uëÒ¢åÛ¦×Ï9CÔÓ§Ì™9À´¬dÔð÷0h0NÎNÄÆü¾¬"..'GG>øè£\ûàì™3 Óy89;¡Ñh²õË‹B<ÈóÜŸ>}JȃÔª]¥R‰¯Ÿ¾¾¾Ü¾u›w»taáÒe¦r-ø%ß>vuu3Íâ<¿6@®30õ¤´Ò/<9Çh4²mëÚ¶kŸmðùbÆM‹V­>j4 …‚¾ý6×ò033#&&ÆtÝ”J%ææjSÛ†¾7Ü”þ·õëñ+“µœ)·kWZÈzŒhí:uL{,--¿©‘O=¹yÞ7NNN( âââLKrbccIINÆ«pa”J%ÑÑÑ9Þ“õô$ÈÚð­V«iÜ´)k×üJhèC\\]LÇó¾~Š­-NÎNØÛ;0{Þ¼ÁËë×ò̧×ë™ȧŸaZ.ׯWÖž G''´Z-ÉIIØÚÙ=;œå»W!þ*¯µ¬ÈÉÙ™+—.sîìYÒÓÒÐét\½rƒÁ€‹kÖ—¶¹¹šää$2331¤¤¤b4ÉÈÈà~p0‘‘¦À2eËrñü9¢¢¢HMIáÜ™ß7+–¯X‘{wï|ïF£‘èèhvíØþÊÓÊIIYK!ô™™DEEqçÎmŒÏêjµÿ²þY‘LM%##ƒ³gÎpçöíW.Küoø•ñÇÎÖ–ßÖ¯G§Ótównߢrå* 2”¥+W±xù /_aÚˆ¹xù ÓÎÅ ðàþ}ôz=Ç%1) ¿ÖµkµZî3sÆtªU3Í">uŠm[6óñ§“sÌr¥§¥1uÊT«^¶í;d;V·~ýlmš2}sæÍ§nýúT­Æ™3§ {ô­VËÖ-›)ãïŸë˜àÙ¬ÁÖ-´jÓ6Û ÍÇ×k++6oÜHZj*7o\çÖ­ß—ÇåwîúÌLþ<ŸkW¯`4  ãîÝ»”ö)£þ‚ú¸n½zܼq çÏ“™™ÉÎíÛptt4m¸ŽŠŠâıchµZNŸÄ–M›°±µ¡^ýú¯üH½&o½ÅÎíÛ˜3k… ¢T©Ò„=zô:§OËV­9t`? ù.ï%¨ðlê\üó¨T*ÆMøÅ 0|È`œœ:|žžæõ.Q‚¾ýúóó¼¹hââððôdìøñ¦;®:Ž‘Ã†âêæFÝzõx»uSÞ% ™™É‡ãÆf+󋯿áúµ«ÜæQh(Û¶l1«ÀÈ1ùÿa«šµjKà´©¤¤¦âçW†¡ÃGä™þò¥K$&$æXW®V«ûÁ-ø…}{÷àëëG©R¿îó;w;{{Þ9ŠukÖ0gæLéøî»Ùµ/ËÃÓ“£Ç°î×Õü2o.޽3n¼é3^´X1îÝ»ËêU+±µ±a؈‘Ù–Ëlߺ…–­[çû P(òÞpÖ®^ÅÆ ¨X±"UHO׿™§oÿ,]¼ˆqïÁÊÒ’†›P¿aCÓñßÖ¯çÈáCøúú2éÓɦ§ûä&¿´aùÒ%Œ9µ™šªÕ«Ñ®C‡—Ê›_ßô8ˆåË–òÁûYï§ú ÒªM[Ó¹-^¸€ ãÆáîîN©Ò¥‰xòÈzêVBB}HMIaïž=< y€R©¤Rå*4jҀݻv¯‰'55µ™WnߺMff&³g0dØ{:x•™-Z¾ À­  <ÀðQ£ ºyƒãÇŽáîîNÄ“'(”J7iBÿ²o¨›Ä¿ÙÕÈ+²)Dç²]°5·ãÇ·¦ñ݉¯1 ŒÜý–*Kf´˜ÀæÛ›˜tðCnÈoZÏWG?#2%’rnå l1›*;zˆ|HH|• Ub^ë”v*]à±µ7~åëc_˜‘DײÝ0õ¦s Meôîœ?Iû¢|Ûä{Þ.Ý€+‘—µg8wcïR§H]´ñ¯ÜW™†Lúnéɶ»[h¹ª)ç]ÂÙÊå•ËB!Ä¿ÏkÍØÛ;P¬X1¶oÙÊ£ÐPŒF# …‚;™f||}©V½:=ûô`çŽXX˜3zì8zõíÇÅ ¸w÷®©ÌؘhÚ¶ï@Ï>}hݶ 7ÆÃÓƒÑcÇaieU`›©Q³ÃG¦EË·Ùºy ‰‰ ¯szâ?¦iÉf¤gj¹û=îÄÞÀ×ÅeíW¡Täÿ¸{‡!;0ë퟈KŸŠý踮=é™éù ÖÓeC'>mð9aïGФDSzmêï±›Ñ7¶s0ß5ý‘›ïݦ´‹))@ÖÀ½ýÚÖTò¨LØØH¦7¤Ï–žD¦D Õkéò[G{7åîˆû¼_k,·Ÿk^îkîgû¦!“>[z°õÎÓk}*õ—À@!„ø䵂…BA÷^½ð-S†½{v3gf û÷í%5%%ÏH†>£À¼¿ÞXMó’-hâý*…ŠU1¶ö8’3’ò=¶êÚ ê­GŸ¶˜«Ì[ënÇÜâ¾æ~¾Ç6ÞúÆÞMiï×{ †UnÚqìÑ"’ŸðYƒ/°PYÐØ»)U<Øso7§ÃO’˜‘ÄäŸã`éHÃâ©_´~žçµãÞvª.¨È̳Óßg ^ >ª;‰Ï|ñç:_!„ÿ*¯½!Y¥RQ£fMjÔ¬I\\§NgéâE : ‹é »vl'::£ÑHbB"%K•úSϽÉIIYùâßÅݺß7ý‘o›üÀ©°“|zx"'`Ý»óÍ–øˆâÞÙ^]cìK;zÏn¦c*¥Šˆ¤'ù‹H~‚·Sö2MmI#U—JÑ™ž¦×2 :š–x 3 ÛF­TÔœ ;I¯MÝÐt|rh":½Ž«O¯°åÎfS „BˆÿŸ^+8¸̃÷iÖ¼ÎÎδnÛŽiS¦ð8<<×Aÿ†µk¨^³:vB¡P°fÕªWªSef†Á`xéô†¢ÅŠ¿Râ¿iÖÙØ[8пò@” %õŠÕgj³4^^ŸT]*æ*s2™¹æ-bW”à¸ì3PÇ¥ŠG@¾Ç¼l Óη=Ë;¬ÎQæÞû{ò1!‘Û·n¡×ë¹qýÑQÑøúù¾Îé‰ÿw›B|väSöÜßEª.•˜Ôh–]]BiçÒX«­ñqñåø£cD¥>åAü~¾8×”·{ù칿›ãŽb0Xws Ý7uE¡PxlWðNvïDoÔ}“Ệ¢Õkó=önÙÎ~xíw·ý{÷XÇqzÿ¿{zÁA=À°,b‹(‘ª¶d[ޥĽ%±“Ü8nr\b'¾vœØqìøý:–­÷^«S¢D ,`C! h¢÷ÞOÛ}? ˆ ˆ”DI~~$âìîììÌ–yvfwé÷öñ‹ÂŸ3àí`sÊVlF+ß?þ=¼A/íÃmüÝ«_¦º§š Iq™ÃøÁñ¢ßÛGníaŽÕ»nyXVþøÀSÜž~Ç›¦I` „BüiS†¼>}. ¶¶´pôÈƾsàv»Ù²miééÔ×ÕñÜ3Oã ãŸú4•¼~è5†‡GHŸŸŽÉdÂnw°c×.¼üº¦±÷®»'Óâñ?üž¾Þ>>ÿÅ/b¶XØÿì³\©©!ÌƼÔT®\¾<ù¶¢Ã¯½FZz:U—.aµÙØž³ƒÌ%ò¶"1æÉ²'øé™ŸPÖQŠÃìdsòfþiÇ¿0?r>Cþ!>±ÿrk_'Þ϶Ô^»|pòmE/V½ÀwŽ~‹ú¾:–¸—òãÝÿÆšøì§ºò*ßÊý&—{ª‰uÄò›¾ÎŸ-xÆiO”þ_¾sô[ôûøÐ’³¿òY~{ïclIÙFuO5ÿëÕ¿¡ 9£jäcËá;Û¿‡Q5RÒVÌ^þ,UÝUlLÚDP²>qߨòèuËÄôò‘§äÕšW „BqÁÁ»IYéEŽ9Âç¿ø—·:+B¼§xƒ^zúC¬Œ[%B!æþ@²â½Ïb°ðÄOcTåT „Bˆ9>s „xÿÀ@!„ÞÊ„B!„7Oz„B!„€B!„Bˆq!„B! „B!„ã$8B!„B!„B!ÆIp „B!„$8B!„BŒ“à@!„BHp „B!„'ÁB!„à@!„B1N‚!„B! ÁB!„bœB!„B@‚!„B!Ä8 „B!„€B!„Bˆq!„B! „B!„ã$8B!„B!„B!ÆIp „B!„Àx3 ·´´ðâóû©ª¬¤«« ‹ÕÊâÅ‹¹ûÞûHŸ?r¾‹J¨ºT…Édä®{î½éL_½þÓ'O°c×NÂÃ#Þ²´CùåþœS'N`±XøïßþÏ;²N!„B!Þns.^(áß~ücü~ÿäo~¿Ÿ¢ÂBΟ;Ç—þöoY¹j5J.pॱÙíoipÐÖÚ³O?Àšììw,8B!„âýhÎÊþðØcøý~, ŸüôgøÎ?}ŸÏ~þ Ø‚Á ÿó›ß ëú[™×IÁ`ðmIW!„Bˆ?esî9hin`Pi˜´ IDAT݆ lËÉ -=žžnö?û,CCCtttðíG¿ÉàÀ#ÃÃ<òч¸ç¾ûyàCbhpýÏ>˹³EôôôÍm›6±÷®»1›Í|ë_§öʶnߎÏ륨°>ø —««)ÈÏŸÌÏ7¿öU-^Ì_}ùËüÕç?À'?ý™É¼=þØc|å6»_ýú7ŒŽŽò™O|€>ô!ÊJ˨¹\ÝngÇ®]Ü}ï}(Š2×â@×u^{õ ¹‡ÓÞÖ†ÅjeÙ²e<ø‘‡p»Ý“óŽŒðþ¿ÇÉ?s†€ßÏŠ¬,bãâyñùýÄÅÇó¿ÿõ'7•!„B!fcÎÁA\\---\(.¡öÊRÓÒ¸ëž{§ r¹\ø}>¼^/Š¢àr…c³Yñz½|ï;ߦ¹©i,#F#---<óÔSÔ×Õñ×ó·SÖ—w욦 ¨*v‡»ÃÁðÐΰ0œN眶å©'ž˜ FGGyê‰'°X­ì¹ãÎ9¥7áñÇãÕƒ¯Lþí÷û9}êåeå|÷? 22€_ýòNÎWŸÓ‰B!„7jÎÊ>üÑ?Ã`0ÐÛÛÃ?~óüà{ßåøÑ£x½Þ)óýË~ÌŽ]»°ÚlüÇ/ɾ»ïálaád`ðµo~“ßüî1nßs…ôôôLIGÓ4¶lÛÆÇ?ù)–,YÊ'?ý>÷…/LNÿê׿Á—ÿîÍi[gdðŸÿõ+~ùÿü÷äƒÔ^|ñ¦†/Õ×ÕMë7làûÿòC>ÿÅ¿Äd2Ñ××Ë“ü¿Ô^¹2¬\µšï~ÿüå—¾ŒÍnŸóº…B!„˜‹9«×¬á;ÿô}22— ë:ååü÷¯þ‹/ýåÉ=|xÆåW­^Í¿þôgüëOFFæE!kÕÊÉé]Sæ_²tŸþìçÈÙ¹“y©©sÍöu­Y»gXv‡ƒ;÷Ý@ww7m­­sNóÌéÓ þâŸ$9%…Û6mbÓ–-ÀX¤ë:JŠPU•O~æÓ¤¦¥±nýz²V®œ6m!„B!Þ7õ*Ó”yóøú£ÒP_ϱ#G8q"Á~û›_ÓÞÞ·zhÚe­6ÍÍÍ<ÿܳTWU30Ð?忉!D“ó[-7“ÕY‹ŸüwWW' ‰‰sJ§£½ €èèhW wJKKç¯3:2B“óÉÛ–„B!Ä­4§žƒþ~ª«ª¨®ªÂëõ’œ’Ÿ=ò?ùéÏÈÈÌà•—_š|àzêjkùþw¿ÃÙ¢"\á.öÜq'n»mn[ñºúÕ¬73î"ÐQÕ©E|mÐóv½ÑI!„Bˆ5§à ªªŠïþã·øî?~‹âóç'·Z­¬ÎÎÆ^7ÚÝÝ=mÇÅï÷ã ãÛßû'>úðÓoºªòÆ&^¾¾®nòß11îs†æöÄÐÙÙ9%Hª««ÆzN\®p<06Œi ¿ÎëB!„âfÍiXQFF6»‘áaþÏ~ßç#1)‰îîn<ŒµŠŠÀn·c¯ì<î,‰IÉ“wÐÝ]]Øì6Ž=zCù°ÙÞxh÷lQ!ªªŸ€ÉdÂï÷sêä ,\Hkk+Ç›6×^y…”” #/>¿ÇCl\\ÈõëºÎ•šš7ýúõëyñùý~û›_s×=÷ÒÜÔĉãÇÈ^»EQX‘µ’'ÿøG‚Á ÿý«_qß>@[[çΞ½¡²B!„âfÍ)8°;|ê3Ÿåÿñ3ºººøÕ/ñ¦yîºç^ì0öýkLÿäG?b[N›6oáð¡×á+÷·oZÞë1‰‰‰X,¼^/Ï<õ'ŽçGÿöï¬Z½šü3g¸TYÉ£_ÿ0¬L§££ƒùþ÷§ü¶ïî{fVäóùøÇo~ãM¿?üÁîÛ÷°s÷n¿ögNŸž|@ <<‚?ü楦²vÝ: òó9î,çÏIP „B!n9¿­híºuüà‡ÿ›m99¸ÝnŒF#‘,[¾‚¿ýû¿çƒ>89•Ü{ÿÀîpCFf&õå¿!)9‹ÅBʼy|î _œlÄ766ΘgXŸý‰‹‹Ãb±Ÿ0öðð'>õi¶nßN˜Ë…ÕfcãæÍÜsß}Ó¦³çŽ;Y¶|&“‰ÈÈH>üÐCäìÜ9×¢™ôÈ_|œ‡>ö118œN6Üv~ç;“ß8øôç>ÏŽ]»p8X,6mÙÂÊU«›{îA!„Bˆ¡ y}’OÄ^ý…ä>ü0wܹ÷–åÅï÷ °Úl“¿=úõ¯QW[ËÂE‹xôÛß¹eyB!„:nêU¦â­ñâóÏSzñüÅljŒŒäè‘\êjk±ï;!„BñNààÓu¼cGéèèà›_ûê”iqqqܹ÷Öõh!„Bˆ?-ÜbŠ¢ðõoý#ûŸ}†âsçèïï'""‚5Ùk¹ÿƒœ|¨[!„Bˆ·ÛŸì3B!„Bˆ©æü¶"!„B!Äû‹B!„B@‚!„B!Ä8 „B!„€B!„Bˆq!„B! „B!„ã$8B!„B7ñ…äÑQ/@]>¡&„B!Ä»’¢€ÑhÄjµÌjþ9££^üþÀ\B!„B¼CtÉvûl„9 + $0B!„â½b¶í÷92”H!„Bˆ÷ŽÙ¶ßåd!„B! ÁB!„bœB!„B@‚!„B!Ä8 „B!„€B!„Bˆq!„B! „B!„ã$8B!„B!„B!ÆIp „B!„ÀðGýö.äóùo|MÁVŽí“õÍÔÔuaˆM Ú¬Üx:BÜr:W 9XTAYi1},O c¶{óHÏÓ|¦ò(ÎÕd™gŸëƒœk~†­;Àã-'y±³“˜¨Å¤¨ï²cHoቊ_ò£~9QqXßʤGê8t¨%%™HcÈ)Ë}ŽgN_¤èb9uj2™Ë”úñ׿ñÛWJ‰]@ŠãV–¡ÎPÕþPª°d^¡6ë½E§ïò^¤ðl Ätâ­×”s°¼ŽÑìžO’ýí¯­÷"O¨Å¹(‘ð·ó¶X°ü×Os¦´˜Sad¥¸f}n˜­“S/¢;!¸·õ¤»â/טIK Ãô6®)´÷ë1òâmæØ¡Bzcæwíq,Þs,óŒó(C^Ÿ~£  Ýxn‚­{±’˜Û·±ÄvÕïþnJ Ïr±Û¢ë#°yÝ"<& ØKyA!{4 ˜Ý™l]•ŒKa¹PÓBЂ£ t5Svá—œëxx}üd×J°¿Ž“e4{Ð"RW²uY,¶)ê ·\àèù&†U#¨¬\K–Ûè½Ct¶Ör¶¤eÙÝÜ‘6s…ÖòN^ƒ–xÖnXF²UFiºXÈéºtEG ŸÏ测‰)Y}”†‹…4¡£¡™Ýde¯fQ¸:ç²Ä×EIá9*û‚(º†1b×.Äc‚`ã)ËïÆå˜È˜•ë6‘9›+vž¦&îÜWm—6TÏÉÓå´ø ¨(D-ÌfËüpŒ3ÔÁܦ½a¸ú(Ït/â£ëâgÝ §kÃt4l&'³m—ê¾|¾W~„èøZ|"]Ãh°ayÇÏÓÊÍýÛøeZ&oÞµ‚ ùQìDMoa£ÈOCÁë”DlbïBçŒéjZÀÀ%^>x‘àÒ=|`é5 ´€—A¯†ÉfÃr“ E}ø ‡sËèð2à7à´™ _¸‰;3Âg·OhÀ¨¾;rµnòa¼m«#®­5-¨jà-‰qGk8xÊÏmÛãº^zºFPÓQ †·¶±> m7¥òȦ¤·¶‹^ëäÔËÅØ·ï Ëùöm‰Ö[Î §†Y³k I·.2ÏÌ»û™kû`ú6€F}1ÇËÚÕ!€y˳Y—ä½/…º–‡\.ˆo¸Ÿ¦ú òË†ÈØ³óMû–¯­ˆý%6vì\Bô»³Ä,……9fœçá:½—ÏsQÉàž½IØ¡òØAòk“Ù·ÐJ_UÅJ&÷Ý™ˆU¢âx.§êÜìI³„^nÚi¶é/ Z7N^¤;,‘ôøª®ž8Êåâ ¦æðà|ª·‰Üƒç)MÚMvDˆ£ÄßJ~AñÛnge¸Çyö”¿gîáŽmÇŸJJ”†Y–˜ÖUÁ±Z'[wo"Τ§ì¯”´òÀºxÔ–‹ip±óöÍÄ™|4æHY ®Œ?¡èôWæ‰j7wïÍ"v<ëZg§Û£Øqûf¢ }¹,ÉÙÜ¿6vMŽ+ÕŒ„'ãž¼k6JuQ ƒ©;x`¾ÅÛDî«…”zve¾<Ú§n8Ócô ~Vüù: „³gÁgxØi4ZÚÿÀךMÜ‘Ni{9º‹µ ä³Ñá”7ü‚v¡t<Á_w€bZÅ×–ì!3XÇ ¹êë¤+IáÙ|,i=Fÿ¾Ts™UI›Ñ:sztGô‡ù÷¸n~Xv[¸‘Ú «Ü)4v–Ðvßž—‰ËWÅr96ÐLjÆ¢è|.a!Q´ñtåïxvDöó‰sû1Ø6ñÝÅ[˜§hÔ·ü¶¶Œ®;øéü•„ïÃÃçø}ãІ "ÉŒÞÎ'âàÎåªÎ‘·µ÷4çG!!æþ.q‘W¬Zw=‰l]3è µ”’wþ2~Œ7«Ö²6ÁŽ ¨ª“Á€ §ì> ¼öäIj4@q°lç^6¹¯Þ ¯Œ„¢ØÓص/ ­á¿«rso΂7‚>m€ª³ç(ë @À±€kæc}¤žã'.Ñ5:H·k%ÛšŠe<}å‡9ÔK²ÁËÐh/Ýx6m^Jœ ð¶QpòµA+N[41ÔÓîÙÁÞ…6|e9×ĨªH\±žõ !Î{ã¼Ó-§5“û\ÖÅVzÛϲ l™çD 5-äÚ4ÚËŽs²q”Á~9{Ø0ÙÚðÓYu–ÓuChº¿!†¬ì•,pÆÊ²°€’^0*tG:›×/ ÆúÀe^Ï»HÃÁ×PU; ³7°,B}€ÒSg¸4à¥wÈÍÎ{ב2q z)+:KyõJäB¶d§©ÎPs¤ Ös2¿’vÍ€Ðp¥­bËâhÌ¡êðwUðz~-#6'§ Mûø¾2ÜZƉÒ6¼ŠŽ/`&yùZ²ã­(htœ•“æ,”QÚ@3'³}ûÜ3î×*/£¦ç8¹½>jN 8b÷-ï)½Â+êIÙ³•%öí•EœiE%€×ÅÊu+Iw¨ Rr8áÅKVUÐêÕ n%÷¯ŠCÅO[Eg½ :\,[»šùN5Ä1r³uw½ëVhÁæþXÉO;…W â`É–,qzçÔ>ÐB´|Í]"mûí,q¨ºJxîd%) «I‘Ùé¯åÉ!{~FŠÉ­×H˜G‚¥æºó˜=d¨¹”´,"'QúoÞïnq +DdìàÃê:A݈ÍjDÁG[ë ±‹â0û½x©I.ò[»¦%†X.Tš!¨QdmÙ ÀèåF˜XY´å.Mþ­¡cÅ>C—®ÖÛF›=‘Uaàõú1F'“¨Ÿ£yHÇãšOζù@Ú®Ù•èô··£Ç­Âcðãõ©„'%`;ÞF—‡³=:sü®¾™„dÁâúõhÆnÚ)˜ÂX”äÄvUÖU÷JÜ9þGp„îþÎ0†Y•¥Š+6•Æ«ï‘(D-ÙÉ&ÊÁÛO׌Ë9vGÞëõ£õTòÊ¡b†| a ܶ"yî]ýZ7M]᤯·ðzÁGzL!eí>–»¦¯ƒïܦy®{[r”Å|!ëïùx÷³üuCÇ”ò2a@×)ñoà+™kÈ­~ŒgÛŠÙ•ÃÒ¤Ïóë˜|¾WysÂ'ùª;ƒ2BAÝ~žŒå# ?ǽ„ÿ¬>ÆÏU7?J™Å‰›!òšòY'ßsb4D Ò‹ª÷ ‡=½ßñûÁ,~˜Ê·k¨Õ3HnÃk^Ê'3בÚÿ4_iÊå`D:9<Ü·èAÊŸä¨}?OÍÀ¢+•ä¸?ç7±­Í®ÖßóÃÎÓœp/உ[úú eÅM¸—ï$fâ§‘+;QFgìjîÝê¡çBÇNŸ'jßFZ˜žšÄÎdKí þßw½Jºî127:½•g( frß®D¬x©?wšòæ6ϳ¡ØRغ+­ñ¿¿æz¬(ÐÛg gw6Qª—KGPÒ¼ˆ¸yFzªJ¨rdñÀºxL£ ¼þJ%Ä*(h (Ì[½ŒZÇ9ž<{…EñKˆ ¹-!–ÓºéµÞΞè-å¹£4%g“jZÈcYųd÷eösîµx¯ÎIG)‡«­lÛµž8“ÎPm!Gk:HY‡É7‚ϵ˜ÝÙ‰¸ÔQʼÂùæ4v%PÂæ““ÝGG±ƒÝ;¯é9PÂXºqK½58Ð9¥~º* (f ÷ïNÄÊ—ò^#¯ÚÃ]‹ì!ê`ŽÑ>LEáyçíâ¾ùvTo G_-¤Ø³›µ‘L_ s©ø†¥{¸/Å‚Ö[ʳ5ãþþfÎõ0/'‡Evmà/¹@ãkI6ª¸\vzΗһq3Xo}I°‹†6+É™ö«–13o~gÎ^¡3cnU§¿ö ± ÙaWÐ:J9ÚÁîœ " :Cµ'yþl= [R±*6Â#]ì`ëÖ]lr\µƒø[(©2±rßFRTðvÖR7â§%Ä1r³uw½ëVhj˜{g¢6±ïÎè«zMçÖ>PÂB´ÌIäìKßÔƒ½ƒnfê(šþZš-e5{Së•*ž.ÃvR¬\héFKôÈ«ïsïžðO¤æì.9V±;Éú Þ€ ‹)@õ©8iÙÄGLh~?xcg¿v¹Pi¾Ùi¥èTÚ²õdÌ4NÖïÇotaì.å¹×Ûɸ#‹ÑϨ_‡9ulëø½Ì#—Žòdµ›»w80ùðé ö¨ŒÕM4ycI6yijêdÔoâêÕÙâ—°5þº[FKñ!WõCT&;³¢¦üÓ–¥¸ÅÙÄ]7É^Šæq®#€kÁ:öxŒ€Ž9&,G S¢°û¸˜w”Ãå.î_>}©Œ6—WI‡¦3:8€vü05p¥¯cÇ<>Ý„YmãÄ ']u+ÌFü~?z¨:˜ë´9JP0*ŒÓ¡P¢ÉŽšG„A'ÝfFïbP#&EE ˜”ñaZ+GPí‹Ùdw®g°Úv‚'hÑ瓦˜0+`umáSž8ÇW£ûìx¬.œ°"ˆ4´bÒ|ø»ÉÊèh1¬)Ǩ@§?8¶ÝÅ0¾_¨˜Æ«6EQ Qǃ…7Gj)ó)$Æ-c±Ù‰±˜ù—©jC³¥•µ‚t£a{*]ôt&nŽÔ_ ÌœÉ]ñoìwZg-~)©iÄ8 ÄlØËÂYÖª*BŒc™þ¹Q>ZÛˆNŸxöÂBʪm¤Ì2Ÿö7c7MØl*>_=ýƒDÄFŽ5N¬‰Ì5Q €ŠÝn¢³ì$/ë ÁF|ñøfÜeC, „“7Ö#CX41”Ò3¢“l 1mNÏqèôwtˆY>~ƒCÁ‘º–½“Ívìþ œ8ZjPî `õM¹Ü ƒÄ¤Ç16ŒÚFR¼‹“í=h‹ìL_s.§÷ÐÚí"e½m¬¼,’£‡©èöA¤uú:Ðûépà‰kŽªan<¶´¾NÚFzé9•KÅØ/øT ý£:8 #º+že±7†è÷Ù‰¿¦ îtr’ÊÎe¸cú¹te”´5‰˜Ñéëìd` ȱ#ÍãÛ@eˆ ¬êX^œ‰é¤9®iV#IޏÈÉ×OÑ”GRB" Âg {³uâº5ƒƒÍ¢EÑ×N9æ†Ú³àk,䙂Z†q¬ÛœvýároÎEèkùœ)8|íÃ`Ú2ïïŠà@jâÌ™r†“W³waÔøNgÂjòÓå7´b+{”pUÌæÉî±ë/7Ã4½â£'(Ðiëv±a6cÐi+çHI7qY[Øéyãd;9æXTëo_Kº 0›1¼\ilß–„Ãæ§ÄoÂ1ç‡ÈÌ#¾Ñ¶E«Ùm"Â߈ÏdÁ¢€ê^ÆŽ…çÈ?z˜óf±1á8l6fwŽR‰Ïº-÷Òy¹€Cy—¸cÇ""”Ðå:ɲrîb…€š³y¸hå+¢°{ÒY>11œÉá´ô$|úÒšÌæ]É€ŸKyÇY™óƘHm³êçõþhNý-L‘&”Pu ÏqÚÛÆ€i.zʲ*1Ö˜ñ!WS™y­\½"½›C¹œÒ²ùÆâRû÷ó…Ú+sÍÉLü¿I9”k¶ÚßÆÙ²Q26¥LÙ]}¢«ñu F㛂“[K‡~ªkŒrmYL¦75Áɹ´ O]B[³ƒ;¬Ð[Ê3y³xyÄLË)ê”gt]AÑg1í-¥3TSÄñŽ8îÞ¶˜HCšÏSù–¯®Ž¤®_où g¨ýš*×@›Ì Š-…Í9+ðLsSl–¹õ‚)׉)Õ¥ÛxáJ+kôVªÕTnw«c¢€)~wM;LGÁf»N¢„‘±e©ý]4·´PyªŒói[Ø·ØuCÚw¤îÌl×E§oÜÔê’²ùHÒ*†;*9œ—e÷FÎø–‡é¯å¦"ž9ÛJP#3Ø»i>aïªó¥x·¸å=CÚÀ¯Æºb+;§4<ÍÄŹh«kpñN5õýÄ%ŒŸŸ~¹ÐÓPÂÉÚ¾—‡îÞÇCwß>ëÀ`¨©ˆ|,Û¼‰U×øccŽ÷¥¹o<0ÔˆXF›¸íª´¯wŒÌ;ŒÎ–VFðQWtˆC—‡æ/ .—ƒÞî^ÞVj;Ç‘º—¿è Aºš[éŸ(ƒPfZN룥Ó7öÏnºT‘'•PÓæ²mîhŒ-´ût†jOólA^À;êÃA¸ôÑfêº5¦n ÿXO鬘ñÄ8éliÚ¤ÐÔ2€Çùö\•Hâ¢hh˵¯†n'qÑ–Ðu ºˆ ¤m¼œÝm´ŒÅR]nbM\î  7Pp¾ž›Ýw\¦aú‡®MHÁ•šŽ»­Ž¢šV\óSÇŸ Rs{°´×S7ž7ok9'/÷M9¶®Gj¡¸ªÕå!}qÛW¸èê›á¼x³uw½ëÖ\…nèC œÉ/£at–)öW°ÿ…S\Ñ6§Kp„áÀõq½4C]ËŒ‰køÐÝcm•o¾ÑÀ@gpp³Ãþ,ÞV·¸ŽƒÔ]/_*F¬±KÙ¶àêWlêøûš¹ÔèfñŠ”É.J{ê ÖuñêË(ŠF@u±({5È•ËR£¿­–jK"çGLl8ÉKWÑZ˜ÏÓ/ƒªÁ‘Èæµ±PIX¼ŒÆ‚3<}@AÕu,îåä,žíëþL,Ú¼ãšß,Ì_¹ŠÎ‚“y›ôb~Tú ¥+õ¾Ê—οŠÑµ—ÿ˜¿œçí`¤ñ ?)ÏG3D³"îþ<æÀ:N IDATÂŽ22}VôÁòëÃÉÞý¦ÀQq¤³õ¶!Ž_äÙçÏarzX¾1› »‚Öpšÿ7¯þÆÅÅWùÍEÏÊÛY7|Œ—. O–MiîÓ”*NVì¼“ÛÆï€^ï E©åõ#åtz‡ñûÚyþå*Âço䎌p¢¯eÕÙ³¼üj%F‚(óÙ8ÏBÆâcuhàÀçíáÀ¡Ë¨Ž4¶mH q,¨D/XƼ¼³#C4ɱ£”´ “årLÝ-IdÄ–p°ÙÍÎ5o<“ Fg’³¸ˆ“¹‡¸`Ôñ«Qd­éátP¬Nì=E¼|HǨêq°ru¦ÇH:Q7Uw×»nÍ‘Ö9cû@í¡¶¶ë’L’'^©² 0Ÿg9™{€³ŠB0h³dÕø5iÓœþZz-żt¡ ?ƒÃèÇSc gÙÆlNûú0 -£Ä/~«†)‰w³[ÿ*S!ÞÃæò*S!nŠ·—ºN OB6†(ÍÍ¥+s/[ã߆=0ØÂ‘.wç62®}Ð;Ô4ñž7ñ*Óì]k®zc‘øSåk;Ëþ;wf%»÷´wß«Lµn.ä½Nµ!œ%ëW³à–~|Hˆ¹Ò¨-âèå~#ýhž[ñ'ÅCõgy颂‰ Jô rf5P‹sQ"áïÚ[XïlèÃMœ:šÇñ²j*.×ÑaŠg^„il¿¶‘÷Â1šÝóIšø¢-:}—Ïp°ð"…gk$¦o½‘}=HwÅ1^®1“–Ƭ¾ƒæmæØ¡BzcæwCëB¼S,óŒóÜú/$û»)-<ËÅn?Š®cŒ\Àæu‹ð˜€`/å…\ìÑ0(`vg²uU2.u†åBM A Ž2ÐÕLÙ… \r®ãáõo|õ6Ø_ÇÉ‚2š½ h ©+Ùº,v†Ãè ·\àèù&†U#¨¬\K–Ûè½Ct¶Ör¶¤eÙÝÜ‘6s…ÖòN^ƒ–xÖnXF²UFiºXÈéºtEG ŸÏ测‰)Y}”†‹…4¡£¡™Ýde¯fQ¸:ç²Ä×EIá9*û‚(º†1b×.Äc‚`ã)ËïÆå˜È˜•ë6‘9›V@ž¦&îÜWm—6TÏÉÓå´ø ¨(D-ÌfËüpŒ3ÔÁܦ½a._HÖµaº6““Ù¶Ku_>ß+?Â@ô|->‹®a4ذ¼ã×ßå¿æÇþmü2-“7ïZA†üƒŒ(v¢¦YL3óÓPð:%›Ø»Ð9cºš$0p‰—^$¸tXꚺLÀË WÃd³a¹ÙƧÖÁ‰ÏcÛº‹ÕoG…©=õq{§ž#4`Tßµ­ç|\:ú2—“îàÎù× !u ¦£ oá>tãüMùè\À]YQ×?¾ß±:Ðé«8Ì ½™|hCâuŽ;-¨jàM÷ ´nòa¼íÆöω/$¯Ùµ†¤øB²¯­ˆý%6vì\Bô{q×â}îÝ÷…ä7Ñé½|ž‹J÷ìMÂÆ•Ç’_›Ì¾…VúªŠ(V2¹ïÎD¬ÚÇs9UçfOš%ôrÓN³M¡Ñº¹pò"Ýa‰¤ÇGP=põÄQ._`05‡ç;P½M䪪uVpº=Š·o&Ú ÑW‘Ës¥M¤mLbhƲôséØ~NZ6ñÈd0¥Ó]}žjÛ îÙèÁ¢réøA ê’Ø·À†ÏëÃ’œÍýkcç0®M£ãJ5#áɸ'{žF©.*a0uÌ·£x›È}µRϲ¬Ó×G›ã4CÈ NO¯àgÅÏ‘¯J8{|†‡@£¥ý|­ÙÄ á”¶—Ó¨»X›ðA>NyÃ/øaç:@Çüu(¦U|mÉ2ƒu¼Ð˜Ë¡¾Nú±’žÍÇ’Ö“aTð÷àK5—Y•´­ó8§G‡qD˜ëæ‡eç±…©²ÊBcg ]awðíy™¸|Uü±!—c}Œ¨a,ŠÞÉçEOWþŽgG4`?Ÿ8·ƒmß]¼…yŠF}Ëÿðhk;AÀ躃ŸÎ_Iøøþ0<|Žß7ž¡hx !’Ìèí|"~®á\þ¡êÉq›Q{Os~bîàïyÕÁªuWPГÈÖ5ÎPK)yç/Ó8àÇèp“±j-k쨀ª0 ¨@pÊîÓÀkOž¤FËvîe“ûê½ðúÇÈœz)+:KyõJäB¶d§©‚>Ò̙ӥ4 A,É+Ù±Ô=Öðó¶’â<õš —=ëèU9©çø‰KtÒíZÉǶ¦bÀKåÑרOÃæbd —áÈeì^•€]w%¹gj²ØqFÄ`no¹akBÀÑörŽ—41 øƒf’—¯e]‚ ¡– +iÃgP-ÌËZKvœ´&r÷_Æš†`”ž!ì‹7°=Õ‰Þ[Åá‚+tô æñìe@u³f{)†JOáÒ€—Þ!7;ï]GÊdgÉ05gOQØ®à´;H÷r~(‡7%£t•ðT‘‰Ûwg¡Œõ =Þ”ÂÛR0胔Îcxñ‚U´z5ˆ[Éý«âPBÔÁH}!/Ÿk Wïf›ÅÏúíK‰WCÕA¨:]?ÓÒ:)<ñ§®ÔجF|´µ»(³ß‹W±‘šä"¿µ‹`ZbˆåB¥‚EÖ–­Œ^n„)Á•E[îbÑäß:Vì3 ‹ÒzÛh³'²* ¼^?Æèdõs4éx\óÉÙ6RÛ5»Òþövô¸Ux ~¼>•ð¤lÇÛèÒâpö GgŽßÕ7“ì!XÜA¿ÍØ #Sx‹’œØ®Êºê^Ƀ;ÇÿŽÐÝÀæÀ0«²TqŦ²ÀxuŠBÔ’|`¢¼ýôx͸œcwä½^?ZO%¯*fȧ–Ám+’ç>|@릩+œôõV^/˜âH)¤¬ÝÇr×ôuãÛ4kŽ÷2•Å|!ëïùx÷³üuCÇ”ò2a@×)ñoà+™kÈ­~ŒgÛŠÙ•ÃÒ¤Ïóë˜|¾WysÂ'ùª;ƒ2BAÝ~žŒå# ?ǽ„ÿ¬>ÆÏU7?J™Å‰›!òšòY'ßsb4D Ò‹ª÷ ‡=½ßñûÁ,~˜Ê·k¨Õ3HnÃk^Ê'3בÚÿ4_iÊå`D:9<Ü·èAÊŸä¨}?OÍÀ¢+•ä¸?ç7±­Í®ÖßóÃÎÓœp/உ[úú eÅM¸—ï$fâ§‘+;QFgìjîÝê¡çBÇNŸ'jßFZ˜žšÄÎdKí þßw½Jºî127:]³„ûw'be„Ky¯‘Wíá®Eü#^¬ó×q_J8ª¿‘×_*£:}Kl]—Š©q­âìXŒvN¨z#‡¶¶îJAk<Åïk¦lŠ2J—æáunŒfr_ªàòâx–ÛG©*©@[¼‡ûÓ­øÚÎòL5,šé¾¼¿‰SgZðlÍ!+Ü€ÖWÅëÅutÄfà 6r*¿ƒøí;Y®è*湓¥Äí]C*ŠÞðs=;3-hÅðÃXºqK½58Ð9%+ZggÚÝìØ³‚X†(;vÍ”>sÏ‚b#Ü9BÑŶnÝÅ&ÇëóM[`KYÃŽÖpï5=Ó×A¨:7O_?¡ºÕ²wì íÂ!rY˽Ë#§äųd÷eösîµxg*‹ þfÎõ0/'‡Evmà/¹@ãkI6Á.Ú¬$gÚ§–¯¿…’*+÷m$Eog-u#~p^uÐ)vR¬\héFKôȃB¼½{Âzmš³g¸äXÅî$èƒx&,¦Õ§^à¤eM0¡ùýÃtË…Jó­ÈæH+E§*Ж­'#äíÀïÇotaì.å¹×Ûɸ#‹ÑϨ_‡9u–ëø½Ì#—Žòdµ›»w80ùðé ö¨ŒÕM4ycI6yijêdÔoâêÕÙâ—°5þº[FKñ!WõCT&;¯íFŸ¶, Ä-Î&îºIöR|4s\ Ö±ÇctÌ1éd9"X˜…5ØÇż£.wqÿÒðéKe´¼¼J:4ÑÁ´ã‡©1€+};æùðé&Ìj'^8Á誻Xa6â÷ûÑCÕÁ\§Íy ƒ‚Q1`œî9%šì¨yDtÒmfôÞ!E1bRTT@Á€Ij¡µrapÕ¾˜Mv'áz«m'xb°}>iŠ ³V×>åY€s|5ºÀŽÇêÂi«!‚HC+&͇°›¬ŒŽóÇšrŒútúƒcÛmP ãû…ŠI1`¼jSÅ€u¿ú Ýýv<Ñc…jv§0Ï>ó] ­·ƒv£‡acg\5|!»¶ŽOëî¤ÓǪ°±=ÂOÅ´ê$95‚x÷Øú« [ ï b}Ãh_?Þð㢃ôähδÎfIƒÁˆ314ÇÔ¦êôu0×cL®3Jñn÷®´¡&Μ)g8y5{FŸLLXM~ºü’VleN ³ ƒÙ<ù`Ôõ—›ašÞGñÑ” 耉´u»Ø0«±:#må)é&.k ;=ÖÉÓ¹>|…ùeth€êaýíkI7f3¦€—€+íÛ’pØü”øM8æü ¶‚ÙbÄ7À¶h5{£MDøñ™,XPÝËØ±ðùGsÞì 6&‡ÍºËz’J|Öí|l¹—ÎËÊ»Ä;¡„.çÐIF•s+üÔœÍãÀE+X…Ý“Îò‰yŒá,H§ ¥ áÓïÖd6ïJü\Ê;ÎÈʲœã¦ bV}ø´±ÞÍi ¿%€)Ò„ªô9N{Û0'¯(ÊÜ› S–U‰±Æ`ÓL*£¹•«W¤ws¨1—SZ6ßXœCjÿ~¾P{e®9™)£“ÿ7)ã!‡rÍVûÛ8[6JƦ”)Û ë ££O46µ ¾ ŽÁh|Spòn2–]ðsåÜi.;6s÷úhÌZ;y/•¼1Ÿ>u)]Ÿ}«úÚÍ×'þ«(WÕµ2Ëö¨Ž>™Æ,×u¯ä[X:³?.ôñ|_•+l6ë5ˆ®ƒ·ÊuÎ5ÿºzú;LQPl)lÎYgºËßõv%ŒŒ-{Hí¥…ÊSeœOÛ¾Å.é!â}ä–ÏÚÀ¯Æºb+;§4<ÍÄŹh«kpñN5õýÄ%ŒŸŸ~¹ÐÓPÂÉÚ¾—‡îÞÇCwß>ëÀ`¨©ˆ|,Û¼‰Už©ŞƮ}ûÆÒÜ7jD, £M\¶…¹«žFc‰s~;ŠBXl,†Ö::MQ$¸í Ô7âõÄ=øåí£Ç0œÝ»¸{Û*b‡{±'ÆM FZÊ8v¾žþ«®HÃ5y<~¤Š> P-„9­è££øôÊ€ ­•…ä]îE›ü-@]þ‹DgWMÃ3o îÆão£q`¬þµ¾KÔBqU7ªËCúâ,¶¯p3ÐÕwÍ9Lgpp³Ãþ¦›=oݱ%„x;Ý➃ uÏQ;l¥¿è(C7­‰«¹sY4®…Ù¬.,àåW*P°Æýÿì½wl\I~àÿyïuf³»º™)f‘£DR%‘Ê3Ò„±}Æîíϻ΀Ï>Ø‹ÃÚ8Üá†á³±¸;làî¼3ž  J#Š¢D%RI1Š")æ»ÉÎýÞïRq†a8š‘fï}«®zUõ­ªWßo}«j'û“ôëij­™æª´²²nd¯o°™ÓÚÑÅq|›LË,(Vê¯\¤„üƒìŽ[cJ«‰¥¤d–Ú[ŸñHrwýä†6ü‹ÜÓµ|p_"6¯‚=q«‹EŒÌazתϤ°d”Ä, Rk@3[Ï™îDÀ³ýO±©X¥{ØÎÖüdηL)ù”Î6rál/‚ -dçâCóLOzaÓ ×y¿G@´8 v’c€Õe€¸É°M¢kä/ù£)×£IËÅžŸpQˆàDæ9²©4M”&žbtègïÿ9ï&RlUüVüôlÒ")8س¦‘zþ°s€ŠÄÜ œãôàû|ö ÖŰ?&‡ÖÑküþÝ+š,~%çuÊ”þ¤ýí_ê»Ào7_@c9ÁŸ¥çñö–J<÷øIg=²E~ì)¾o3!xVÏŠ²ØGý •⪨Ï)ŽBX{–¸ÒÒÆ5¡5;ÈÛ[L¶I@ºÉßÔ >ž°´]à¯ÛD…G(u_áÓn÷£ºi¯yvÁL~ÕqöØEVë#ë³@ëÕst¯´A—@EU>qÙ%6ÞáÓ‹÷ÐBYHyš …”¬-Ü»[Ëù‘pÂ"“(H£éNñûrˆÉ,`˵F>øÌ„ÙET”aYi#Äp˧dð¹ðûæ8{±1,•ý»“ÖkYyéôß®áô3f[ÑfqýÕ]»Kæ¸rë§E¬')¯˜X Ø]:ÇÕ[—DB²‘¬=;‰ûÜ.ðãl¤º{Yö1ë઩¦Iˆ ¯|iŽ,Jm7¨þl«9œ¸ðHD÷Jñ,IäFßàÆÕD˜ôØ´áh•õú€~MÄjÂãS‰ª«ç§g ´&2Š÷gSÖA‘«Ê|G€¯ƒâ쥦¾!–Pê/1¡•ˆÏ«`§®‡‹ÃxâZ\D¸y‰!†¤‚}ì°Ç±{÷Wš.qZ’µ$æ•ðH¯“¢HŠñrwÌM%ìñŸÁŒi®‘34¢Bˆ0 wÄ?}Ì©âfhÌKÜÖgOxÚlßRQQù¦yñG™ª¨|‹ÙÌQ¦**/‚€sœ!Ÿ…» Ñ7Èg†H9R¶öî— ÅËäð<šØX"µ2ÓmÕ\–wòfþ*ÇŒª|%eZ|hç3'­â§ï©ªÊ!RŒŠÊKÇËw”©úô.ž´}œÌB£(H:t° EŸŒÖhD¿®Àe†ê?âl¯Çƒ¬€5»ŠŸ+ŠB|ƒ7x§IKå«Å$¼ÀɬìãvÃ]zB(Dl) "/ž°¯u¾¨ ‡d%Ä'Š·ó7ì9°˳ h­0E&$+ˆ’ôÛÞ7…ÂBW5Ïçðs»¾ o"‡‘ž›\V‘⤹º°ý{É|nr…ÅÞ«|2‘©½É˜6/Ät[ 5þÞØaÿ-š**?›lä´ÜÏæ{›i²9u"#î]9O}¯dX¸ßH‹ÃëÇ0ÈKt]­áÆ€£©úµã­f\ýƒ!ÏÒz½ÙðÒâlô¸ž ôÒÛÒÊbÊAÞNCôPs¾™öÄÃÛÖ¥ãÔ7L·ÿ…V‰ÀT3§:‰;šÝÝÇ•;“èãRHŽ”Ú`É3]\é7Sq¸ŒXmˆ¹ŽËœ»;Î[¥qˆcm\²Pu¤œX­ŸáÛÕ\îˆæí¨•‰«‚³«šwzìœ} oÑ©Ý õ YËxs4úÀ-×êiœ°S§ai¬•+w'ðKÁž-%ÇêYº…scáD)3Ì›âIRæœÑQPYBÌàja¥¤ée&;®r}ØË¢S&ãàÑGVkÅÕË¥º6†–$?BMdï&×&®†â¢ýÆ-º]>æ—ìT½öxå@žjæÝ– ™Q°èõ0ãÉܵg9žo‚†ëMô‡ ˜QD3Ȥ£’k}+d÷ï4Ñ1„`Á–ÁÞéDkà<wè\DˆÈd_q*¢{µŸ1hMÅè_ÂãšÇ‘Ëá¢xLÊ4·/7óÀ5OiåÓ èH)*§(Z$8Ö§­Sø–ÐçåÔ£•™ù¾.u- 5™°ÙMÌõ)ì<±sesu ÏÒråÍ3^ —.Ò&DdíaŠ “÷¹5äE$ˆOФ°´´0è»vž.­íšØ4Î1ÆC[8º/cY‘ ÍÒÖå!}oâ3ŠA€‰®n û$… rKvn~øuˆÎÌÂv®‹Þmv¶ÖoÒ***_¼..`Ë®äçw'bBŠ£Aƒ€Ÿ‰ñEb’bÑ|ød#)‰&Æg­o­°5#)ØWÁÁÂtb>ç²` kß«O¸ *£`À¤[Û6%ÏO0aJ 5|¾bT Ê$£K Bx:÷ïao–ãKX眓“(±‰8¤>?Xã1NM0#+xœ.”(ÇŠU_G|’ƒÐäÎGfK­5ž¬Äˆ•ºY)º½·«¶%!³Î æð0¤ Õ¥ˆ%&…Œè'×P"·Uñf‘= ûœÌùtXÌËyŸ/€ú…Y÷>Ýv~˜ó;üiœž©λC 8x=ëméD´¶“üïÂñ×Ye$ "I±ßç¯ ¾Ç+ÏšÔ•AÞí¿ÈMeÿ~ÛoðŸâlôN~ÌßÎ. ¢!@»3È+¿ÂïEš¾É5ÿ BY¤£e{ÞV¢EçØ0Ó²ŒüBr“((­àµªrò#$äù.ªëûXŒ)åí“GÙ½HûÍ[´9$QyŠaO2ÇN¢È¼Ho{S²HÂÎWùÁñ<¢E‘Ø¢üðçßæ—Oí ^ÄDªÞ~›ïïŠçÙ9W`¬«½ ˜²Ê9UÁü„ ÐY¢ˆ³Gb–К°;ì8ÌZ@$aç ª’%c:Çßz›_~k?ÛL`°¹Žë“a”}_:Y‚}®…ê¶)dA@](1%ìˆpÑ5i¦¢0ïØ8Ó«L0›œBÂF]Ö‚S N™ÉʈB  àÀQ*â´àæFýq»«xíÐ!^+¶ÐßÐÎpH@À%F³gw:ºi öP```F^#,ˆ8¶íçõÃ{Øny¦‹„§s°8 ³-“ÇñÆ¡½Ë“øuÂÂÙ¾÷oÈ!öÙñTQ–0dí¤bO9•Éš»'‘Q˜»—ûa¼vèÇvÚpNy@ÖYuP˜¿w‹ÆP:GUòÚ±ê‡éõ  0ÓÕ@ [yåp%¯ÙG¶¯•ºž%DÁËŒì`wi)‡÷çbê¢×­€Mqe%•i¬é»xíÈ!Þ8\AÑrƒGWÀkG*Ù·å¥%0JcË"éûqòÀr”Y¦áéU€/du FRP‘G’ÖÎÎÊC¼q¤Š)&@žj§vØÆ¾ƒxåPGS=ܺ3ȲŠë!hÍáà6 ƒc"ù»ó‰wŽ1î_NVv1¢Äd}F@1îÞ×RXyWVr,/š'ðôoô1l±Í08\¯`***Ï—g…N^¤ïÎ-ºÃŠ8œ¨e_P‹^¤çÆÇ\×—ñ‹ñZä@€ <þ@?o­4ŸG6=ã4ÞèBÎÝE¶i8  ± ™mçÃK“d+F¯ à (°©Eo…€/ˆN¯ÁÕ]Ë»=vNV†¡ ¸ð+¦HšžF|1$i}ŒŒLã hyòuƸmTÄ}aÉk¹Hõ}'DæPUù´æ¸j]JÄn-&ö “œ§¥¶Ž¦© –ŒRŽ:4€‚.:‚0™É‘B ´ÕÕRÝiáíÖÕkÅ;D]Ý=¦dï¢ ùj5}XÒJ©Üâǯhщ\ûøÞ¢WÉ×i(kÉ`³a›vXКվÜBÅ‘[°I iFÊü‹€ hÐ "" ¡V\&äqZ=ˆ¦­”™ÌX•lv¯ñÎâcJ:©‚Ë>~Ù‘yå5JÀ„Ã`Á,A²!£•ýø“Ö€×ÛÂOû:Ñ(KQp†–Ë- ÒJ»Ñ Ony "Ò3Å yúéð $Äæ²UgF°m%}¸—ž¥ dãrZ©‘ù¤iŒ¸M‘ˆÌà *°¢¤{[éÐåðê#‡c¿/‚0ãJ+Õ†ãˆZsML0+Ùž‡Õ(žlG×?ÈØl4ÑBjª“6- {ñ‚(!‰ârÝ âãÿ¯ÈN¤ÏÉNfav¿`%--«E!;¾Ök <‘¾$Š]Eä†'¼Èî!jÏŒP (²3Ó¸,á& :ÐjÂÓj‘‚Ëãâ²hld¯Ÿ‡µðáEá |Ôä…i¦õ±…¯LR#∥…ÉE…HŒa&´ZZ­ “F@Ð@0°\_«‡}óˆf;q+ãµÉh 8@Aaιˆ-&bÙ…Ç@zŒ–öuSó3>á"*-–e#¶žä¢ý$àcjz‘è´X €‘Ä8 ×'ç³b ÑŽÈå¯h LÄÿÆeÉɼ&’í+¦¨ä"û<›JkoÃ5=ËâÊåÑ•GAD–pÉf³Q£Ag4b$´RˆÀÊØÁÒ‹¦HŸ-ª&‚$[×/Ý`$!–Äø2¬Ï®xi 7kq/yPÿºŒ©¨|»x)”yi„[·:q'íàDf䊯¥ƒ6ÀL@"1¿‚£‚•àô}$î‘Õõ‹ã­¦,ÐR{—hI-=Äî<\¾;KlÁ>ª†G”â~@uMS2 :Øu¤„4- Ó¡ úZR9°?‘0c€»-aë¬8¬Ž€N¯Áï bÌÚÁ‰(-¶À0~­½¢=—ÊÌ&êk«iÖ…m%Ìhd=f‘¸‚#|7ÏÇtoëº9V™…MX»ž×NÒFÁÁWɸè»SÇÙ6oæGbr¤‘÷ð7+IVÆa]½A’(?”è®»Š§ð æ•‚É‹èD?~yyõG6K8Ç‚h#´kÉ@ÙdØ×†„v%ya]ëå<W$Úýþ½"½²…§|g¹8\à ¹˜?Øzçi~³3ÝÍeôÑ_­°¢rÏ”:0Á/ÙeOú(  zP\¸Ü2X%] ;‘"” 'QxºN–'ùÊr¾ÂbÐrâË“ŸçÙ2Ĉ\Þ<œõÉ„=½O½Kؼ®ú0 ­£àÅíSxÔ>¼’~Õ¾þPL£6ôùò¯öó¹<(Ëÿ”§…¿ñ|*n7Ê3)?ûޝÖü–Ûð“i<Û…ž+hãòyu׳{¬B¸¿{U™ÁS!œì}GIqÎ0:6ƽ4§îã•­–íÚ ¢òÿ,/¼ïÉ®T_íÁ_AÕSO±±&ÆÀê Îì§oÐIlü²ÿüêñÖC°Rpàÿæä+ü›“G6¬,4r¶ÕOnyEO(‚)•C¯¼²œæ++Š Úbˆ÷ŽÐë6‰nfaM, ›>¥I <&i|€im$ñv®Áa|ŽX¢DÀ·Àœ´…ƒ‡qr1îyL ±O)ž±®4>ájî¾:þùòýe×QO¸Ù€âõâWÖ©KBŒß»M]ï<A‚ Ô‡­sAk"Ü âñøP1|ç<Ÿ´ÏÝ Ž9±EÚ>ç®±aÄ(’ìNz†Xí"£gÚJ²C·¦ 6¶Y%DP ”—'&!%D@ -׿ÊCn¸y©‹:÷³î= æ-Ä?eÑÿ2Ý<€WV–-çò Wç†*!¼¡‡¹Ô @Ì3 à.áV‚Jˆ€"RE^.«¢ RÈÑ)Œ,´qÏ¿ÄÐ\'=É _oωÌ̽VÆãòÙþÔîSsB1’Þ–&:†‡i¿}ó×ïpÏ a1"Dƒýc8½.z& JQ$F[ˆ,#ËË›]AA É„d‘p› 2σiœót=Þ€ì[œa|zž¥Á%f¦§™^|hãÐj5ôàôø¹èºUÍ…n‚ÕŽÝ7Áðâò›CscŒE¬ù뜊 ,¯x~©°/‹€ÅÆüìüòª‹oœþé,mèpØÃ™Ç €ŸÆ‹\ì]BA‡#ÚÌôØ>ÅÃȘ ‡#âkùØ ¦p,þ9¦Ý batŒ¹çR7""AÁ§ÔÂíô“ƒ ø–ŸøÆ;¹Þ»°±v†Ù½ˆë™ü)Kc´ÜŸE´8HÛZÀ|;®™…gÆÅ®Å ¦°g÷‚|Ñ÷GEEå«ò‚WB ´5Ñï6àl¬¥oå©!aÇs£°d³ãvgÎu! `ˆÝÉþ$ý:ñlk¦¹êýpCÛ"È^'Þ`3§/´£‹/âø6™–;XP¬Ô_¹H= ùÙ·Æ”VKIÉ,µ·>ã=$,äî* ZÅ3ÈÕkÝÌÈà_ àž®åƒû±yì‰[],bdûÓ¸V}ž( …%s $fYZšÙzÎt· †˜íìÏxr V!°0J÷°­ùÉNû0¥äS:ÛÈ…³½‚LP´Uœ‹C ñ`ݺ”qNôÓ£O`oºíaÁIÚ^ÄøízÞ;¢‚°ÊKb‰ßšËpÃ-Þ;+ * z{·Z6hµÓ’U^ùÌ3=é…EL7\çýAÐâ(ØIŽYV—â&Ã6Eˆ®‘¿ä¦\>b{~ÂE!‚™?äȦÒ4QšxŠÑ¡Kœ½ÿç¼#˜H±Uñ[ñ[гI‹¤à`Ì6šFêùÃÎ*s*pŽÓƒïóYØ/pXÃþ˜ZG¯ñûw¯ h²ø•œ×)SZø“ös´?š_à·›/ ±œàÏÒóx{K%žá[ü¤³YŠ"?öß·™Öð€Pû¨´R\õ9ÅQ0§SU¹›×€>‚ôârÊⵈäPUâãjk=?í ¡3;ÈÛ³Ü6qÎ 3Úô)Ÿt»Õi{Í{´ fò«Ž³'a;{’ç¹ÑQËG)¤EêÆnú||ZQ//ö=qZ‘H\F[¦:¨ûä}® ²÷¤"^CRa{CM´\û”vEGd|{’mˆÊìúÙU<ŒöãÊ'Ͼ•Û@zñ^o7óÁ',ITf…#ˆfv—ÎqõÖ%$‘l$kÏNâDpoª.AqöRSß‹‹ K(õ—˜ÐJÄçUP#!F$±Uw‹sgF0ê´Dfîbj¬æl¤º{Yö1ë઩¦Iˆ ¯|)«æD$*#—-uwø°ÚŒÅMD¤÷º‘@äÖŠîÜáÌ…{h!ØÒÙ»e9‘Ù%6ÞáÓ‹÷ÐBYHyÚòfÞM!ÏÒR×L¿_Æ¿èfQºÁGÆÄBg'P´}šÚjÃðEÙˆ×_©YOˆQ¤§©ûìz-Zû6ŽíˆG•ÃÁ­\¯¹H«F! FRPbÞâ#ZâHo3¼ ûÄÉt‚ÁŒi®‘34¢Bˆ0 wÄ?½/Ë7ÁÀ|$ÉŽg¿_ôýQQQùª¼ø£LUT¾Ålæ(S•Ÿ-ï÷L²¥°5ÊKsm5M¡í|çè6"_¸?Êšøæ˜–qÄGbd‰öšfrNP÷méÍ!\“£8 $„‹Æy¯=œW*³>ïÛÿÂY>ÊôÓ•£L7> 1ÝZCM°€7ŠÔ£LUT¾*/ßQ¦ò,­u—葬lÛµƒ õ4•o% ®þFj{=NdÇ‹ÎÊ‹DÐк'hêèàZPÀ‘ÄÞÒ,U1ø6 ¥Á;|Ú& %„•ÏÁ ¹š¾,ˆH¡9š¯uР‘…ŒäìÌ sÚNŠÆê¨ë‹ú— µS7f§ü ª¨¨|S|s+***********/Œ¬|›L$***********_#ªr ¢¢¢¢¢¢¢¢¢¢¨ÊŠŠŠŠŠŠŠŠŠŠÊ ªr ¢¢¢¢¢¢¢¢¢¢¨ÊŠŠŠŠŠŠŠŠŠŠÊ ªr ¢¢¢¢¢¢¢¢¢¢|“ÊAhœ+|Àÿ=_Íéêî/=—;ÞUT^ ® |t±š>þ€¨{tëñFð̽Ç/5ÿÿ¸ú¯\¤iä_ø½Ö?áûÍÂÛNs-øö!eŒw:ÿÿ_o3 Ï;iÏŸ½AŸï«§è¯ã¯þå®M}Ém>žÊ‹Gžoã_?¨gpÕn¢ÿƇœ{àÿšs¢ïÚ{|ص¸¹[ÌŸkV&¨;}†›3j{VQQyÌ‹¿!90Kûí;´ÍMDå¥Y8´@hžÎ†Û´ÍÉHèì9T%a׉·VØÈ!/®™Q:Z[é6—ò½]o½ 9¸ÞÐÁ¨OYÀ–RHEnÌ:·<*¸ÇZ©mÁ-j@ #£°„»Pù–˜ïçÎÝ{¹'9–ªÛ@EúïlàúƒEÐÇQ²;—$ƒxi»ÍÍŠ  XÓ)/ÙJÌzÉ*^†ÚnÓ0¼„‚Œ¬³SP¼ƒ,«¸éºÄ?ÃÝÛMÜ[!(2[{K2qh!4|ƒ¨ŸÅö0c2JË(ˆØˆ®bnd„ =ûå’—¹~³“±€„ˆ@df1ûÒ­hÖ‘ÁæÂ³™’ÙÍLPƨ5³Ñ{=ÿµó2®¨·øq\zEF#Ñã—éþ+þ4°Ÿ¿HÍáóM+ÄR``"J£åùe/ÀPÃ%îÚÊ8‘i^I×OOݧ\ aH-çJc7~IRÐÇ¢OFk4¢(8_g>¼ÍTê>¾·š<¿(Þ:øoðN“–ÊW‹I6šÁ—yü6ÿ\;JJÅ+ì‹“Œ6ðÓ«Sd:Æî¨¯f[ò Þà£f'öâ*Ä/K.8p¿«ŸÂlÒ"£HfRswRšdFp? º¦ƒ)¿W@ÂlÔaÍ,ãx¶uc}O‘ É ¢$­Ò.Côßø˜®Ø‹W'0RÏÙé ^-ˆü¼)r é©@™ñ¦KtÇV~ƒ74+È!D Qxülq¤•+w‡q!F’sKØ•´±K˾ø5!ün'#ƒ]Ôw,‘}´ŠóKyS›ŠÊÏ.…äH‰¡ Ö˜<ÓÅ•~3‡ËˆÕ†˜ë¸Ì¹»ã¼U‡8ÖÆå! UGʉÕú¾]ÍåŽhÞ.ŒZÔœ]Õ¼Ócçä‰^*Owqs2’Ê#åDI2 ]5|Ø>BêÞD–Ö­ËÝWNs]_Æ¿}¤L)Ìö4ÓcÌçÔ^zÅK÷Õó4 $òJ†¿Ï>©˜7Jb6ñ±‘™zЃǚ„]÷Pš^zﲘRÉ[é&ß5nÓÀ°º ò&Ã6;ÁSºøŸ-R¯‚•£¿Ê÷Ì 36ùOüxT˱x+í“ +Jâ¿Ã¯EYéúsþxziÙÊ8õÿn m?Þv”œÐ×pqa'­Å|7qÙ€ó,¿Ý×KQb9òôUnzÝ„Eý<ÿ=v–?îhÆhÕÐï QdOfxú.3áÇøÏ[r°øïóÓ¡®¸ðˆádEUñëñ™D2Á{÷þž<2pš4F2–ñ_¶îc‹ 38öwüÇñIB€ÆrŒÿ‘^ˆu¥=¸ÝMüãð-Ý‹„¤r¢ðƒ¸ ,îþÃý&’bËçoÒì…øècünBOtVy¶‹†¹*vš÷aß(=ãii‡.Š%E òì]þõ³nLYÛÑu1àÖ‘°m7UÛ¢ÐÉC|öîuúd@#·êeö ´Âµâ…\ô6ߦa`W@Âd‹§ d'¹‘à s¦Ç‹|òN/HÊ_=Àv“þYÚ›šig)¤!">‡òâL:?Ý—?¢Ö›J©c¶Þ|úXŠ÷í%?BZ#žÌTË9>ì¶RZl¢¿¥— BêÞ79¼e¥Ñ†Æ¸|úÞ¢Sœ h-z&Œàa¸}¸(,õÖrz<ï”%¡PºÚJLÜRM©z%yèßÎk36¦\+.ÚoÜ¢Ûåc~ÉNÕk¥$?ìþqê¯53(±˜l¼OÄ -p¯±™®E1@±¦S¾3HIa¡³š‹ 1$I>–¼óÌã(+ßN¬<ƒ·9Ó4ļ2Ëé ‚&Ž]¶'Bp¬…O[§ð-- Ï9Ê©ì‡í9ÄHK Wúæð^bF ¢}Ç‹âÑ.tòáU»Žï ^P˜k¿Èy_!oï°#òÌ]Þ­ž$ûÄF'Ý2“W¹>ìeÑ)“qðèce/8Ncã±G9a“NµðÁN’ã×Rneú®§KkG»0‡&6sŒñÐŽîË@;ÔBÍ Lü–Xâõ}ÈŸŠŠÊ‹äï9°eWòó»1 !EƒÑ AÀÏÄø"1I±è>|²‘”D ã3„ÖŒ·V؈‘ì«à`a:1úg dí{•ãé-'2 Lºµay~‚ S©áàó£’HP&]RÂÓ9¸{³„mX ÎÉI”ØDRŸ¬‰ñ§&˜‘ÉAhr 磵!­5ž¬Äˆ•ºY)º½·«¶%!³Î æð0¤ Õ¥ˆ%&…Œè'×P"·Uñf‘= ûœÌùtXÌËyŸ/€]ð=^yÖ¤® ònÿEn*Ûø÷Û~ƒÿg£wòcþvv  ÚA^Éø~/ÚÀÐôM®ùŸhÊ"-#Øó¶ýDÒîáFÅRsˆ Ñ;XEBŒOúÙ¾¿ŠŠøCmMt:©zûm¾¿+ž/¥ã­Ožì¢®g‰„=§ø¥7³;Fajr?" ;OP•,!Ó9þÖÛüò[ûÙf€ƒÍu\Ÿ £ôèëüÒÉìs-T·MBD”ä…qf£vñö‰"b}cܹ7Ahx–p3Gi¸»@ü޼y¬’’Ø'*M0›œB‚yã¥lÉ$-õÓ3=Èý@©&Û²•¤ù^zVú„âê§Û“DnÂúJ‡âìç¾’@z|2ɾþGiK¯ÚÏ‘Òór Y IDAT8¤¥àÃ2¯6].'*pòð~ é¢î¾ ˜_ÈØYÌÁ}ûÈïswt¹ý“wR™aÁ’ZÊkGñzå²b ‰+àµ#•ìÛò¬¡J"¡ œÂ(=[vTòÆ‘C¼V¬iäEŒÓ1¼âO'ÏÐ5 ’“ý¨- †RRâ‰ÔlÔ/âØ¶Ÿ×ïa»å™ MûOU±Ã¶’º"£èM×”xZs8¸ÍÂà˜Hþî|âcŒûÁ˜¼ƒåÅ&„¿h‹¤ŠŠÊxyú©¼Hß[t‡q8Q Ê"¾ ½6HϹ®/ããµÈAxü~6ÞZi>lzÆi¼Ñ…œ»‹lÓ:q @@cA3Û·—&É>VŒ^ÀP`S _^ƒ«»–w{윬 CpáWL‘64=#ŒøbHÒú™ÆÐòäëŒqÛ¨ˆûÂ’1Ör‘êûNˆÌ¡êÙåðUëR"vk1±_˜ä<-µu4M±d”rÔ¡tÑi„ÙÈLŽÄZ ­®–êN ol·®^+Þ!êêî1%+x]ÈW«é“À’VJå?~E‹NœàÚÇ×ð½J¾NC @YK› Û´³Œ€FЈ«Ä¢(ŽÜ‚MRH3êPæ—XAƒV ­°â!ÓºèA4m¥Ìdƪd³Ãxw‡SÒI´è0XöñËŽ Ì+¯Q& f ’i­ìǘ´¼Þ~Ú׉FY"ˆ‚3´\nIVÚ…ˆVxr."D¤gŠòôÓáHˆÍe«ÎŒ`ÛJúp/=KÈÆå´R#óIÓq›"™ÁT`EI÷ ¶Ò¡ËáÕ¸'Úâ¦` ÁQJB˜Otú1|IÉ+Š—ˆ=%ƒ¸°0ä-® 39/ƒEB¤Õd°†ìV‹'˜#ˆÒ<àÞ­Ë8vbcR)J¶/»\‰â£Ö"‰âc7yá /²{ˆÚ3#ÔЬÀÌ4.%b9]},Y‰aè„¢L#^Á5ãÙ1KËGv ÅÉaŸo©¢ìââ/WtÑJÖ–Iªo`ÍÙ…y`ˆyM yiíT÷Í““ga²wMz9Žu'ò!Æû†Ð%ïÇ,êIK„ÏúØžg[êàã³=ˆ(†hòÊòˆÿZÌX2sóKD$E.5QÄEJ,/˜œšgi©…³3Ë¿V‚~Í f@ÀmgyáX‹Ñ(â÷Qxž®tÑ“¶5滃¸’3Ñõ1dÍä”åñ›„°$v•>÷㛹Çå&Ù%ùD®[0 ³Ù€¨Ñ 31 Z)D ôUÆL•ÁK¡ÈK#ܺՉ;i'2#Wü˜µ´f‰ù¬§ï#ét¬®_o0e–Úkt¸@Kjé!vÇläË£à™èäòÝYb öQå0<¾°2 :Øu¤„4- Ó¡ úZR9°?‘0c€»-aë¬8¬Ž€N¯Áï bÌÚÁ‰(-¶À0~­½¢=—ÊÌ&êk«iÖ…m%Ìhd=f‘¸‚#|7ÏÇtoëº9V™…MX»ž×NÒFÁÁWɸè»SÇÙ6oæGbr¤‘÷ð7+IVÆa]½A’(?”è®»Š§ðàãåsyèÇ//¯þÈf çXm„a-(› ûÚЮ$/Âæ?§Oʼn6DcúÜDz^ O¾H™åâp 7äbþ`ëARœ§ùÍþ›ÍÉz}ôW+¬¨Â3¥Lp§ÃKvYòSeP–†¹?Â/ßàoÿeå¡v_2S§ÿuJMÏàÄ+Q 1:5Éý¦Zú ùNeÖ5^,( Fäòæáìg~d@’V­•ü ʲÕzÕxôDF¬áBùåKHø–,’¦æIJÔáxüÜ––‰íR#™qôÛØ^õ ɳÆép3««å_»Ù‡+ÔÇø¶8ɾ“+nE_7ÊS  ÊSD9å_à~µüáÙ¶ú5"Fe°M¼A×\Ö¾y’²‹1|­o 0Õ}›k#a•—³å‰åíàH#ïß'ˆÙœ(K'üa;}Ôå¾Þ>§¢¢òõò•Ùõ€êkƒDW°'úÉAXGl¬…;c°;‰8ÙEÛ'±éËþó«Ç[; ÁJÁ|©\*,4r¾SCIyIƧ‡=aÅöYD[ ñÞ6zÝY숑ð72¬‰¥r£»P?‡@xL Ò­¦·ï ÞbºuŸ#Ÿ(ð-0'máàáÂð2Ðp™‰„íO)ž±&Ì$óÐðäî«ãƒÁ^­ÈÄ*ê 7P¼^ü È‹kÔ%!Æï5Ñ£É`oºmŪd þMÆ2^Í‹@£5nñx|(„¾s‘fý.Žo·!ÉnÇœØ"m_ÎÍãIÄ(’ìwè ‘á@ð rgÚJr¾Ѱº DãæÂ6‹¢„AYaÙE+D@QؤYTŒ!7ÜH­³‹:w&{”= ‘[ˆÊ¢ÿeÒà•D$y†«sC•ÞPˆåáBƒN90Ïd(@¤â) “ TdE&¤ŠLP DDcH!Gw‹Ú…6îE¶ÐIF¶…Ç 2¸F^dfîµ2WÄnËS CƒL Qì8¸“TƒK¨©ë¥gØKFÔrÜéÁ~¦’’X˜À/ÙpØDed ´"%$’AÅG+e²ÇÉøÔC °k¤“°z<ÿX;u}!Ò ¶±;5•¸Æ‹\_Ä­€UÐj5ôàôphƒ%#FÄX­ý´'SluÒÒØ…3¦€ƒYákÈ|­x%ΪóVyž®;=¶‘gÿ®Eú8JËâÎ'ô äÅws릓`|û6`9pö2æ(æ­½÷*tÖVÓ5–‡cÃ9zˆDØLÌMÏH‰Aë›`pF†-Ž+õƒÃ,¦¤a‚LÞke<2ü Ô›( /™™@@æs¿B[­|r÷6£òD?®, Qßî">I_Ykð3ÚRÇ-_Uû“—yMÂN~.᫾CEEåeæ+!Úšèwp6Öòp›’!aÇs£°d³ãvgÎu! `ˆÝÉþ$ý:ñlk¦¹ê4éᦵE½N¼ÁfN_hG_Äñm2-w° X©¿r‘zò²;n…&–’’Yjo}Æ{H YÈÝU@´Šg«×º™‘Á¿À=]Ë÷%bó*Ø·ºXÄÈö§7p­ú¥³\8Û‹ ÈE YŹ8ÄÖ­KçD?=úö¦Ûœ¤íEŒß®ç½3 *!K ¼$ ‘ø­¹ 7Üâ½³¢¢ ·çqp«eƒ–&-Yå•Ï<Ó“^XÄtÃuÞï-Ž‚ä˜`u n2lS„èùKþhÊõèØÓ‹=?á¢Á‰ÌrdSiš(M<ÅèÐ%ÎÞÿsÞL¤Øªø­ø-èyhßü’öÇl£i¤ž?ì "ñ0§ç8=ø>Ÿ…ý‡u1ìÉ¡uô¿÷ ‚&‹_Éy2¥…?i?Gû×ú.ðÛÍÐXNðgéy¼½¥Ïð-~ÒY,E‘{ŠïÛLžÕ³¢,öQ?h¥¸*êiÅQqÑ70¶\²b"–­ç–d’ÂzhÁ aöqûâF|’r‹È±(Œ6~Ê'ÝîGuÓ^óí‚™üªãì±(øG›ùxtåb ûNU`ëX#^¤ƒèÞ;\?{‹²€ÑCAñCÿv‘¸Œ¶LuP÷Éû\ dï;IE¼†¤Â2ö†šh¹ö)íŠŽÈø,ö$ÛYëˆÛµâ±þ‘ºŠ‡ñÁ~¼Qù_J9X {zÊù1¶–D¬¿‰Mqq¿o¸íq<ÚÚ%IM‰ ±wwÊZYïçÒåN¦}nþI>:skú^Ž­sZ‘{°‘êîydÙǬ?€«¦š&!‚¼ò¤f°åZ#|fÂlŠ"*ʰ¬#`Ë*¥Ôu›óúÑ A°¤³7mÙ5rmÂãS‰ª«ç§g ´&2Š÷g™§¥®™~¿ŒÑÍ¢tƒ†% ‰…ÎŽDDGBZ<­Íçx§Ã€NÇîýÛí“ÐŤ“Øtgî®Ï­)Þ9úû'1lË!i#©â쥦¾!–Pê/1¡•ˆÏ« ØØË{sxÃïñÙg÷–#ˆ6 Ê‹É0nÎ8òp#¶L€E·ñj5}Z+¹{‹ÉÜØÒ¶ŠŠÊ7È‹?ÊTEå[ÌfŽ2Uùz‘çÛxï|'†¯òêZ'”©<dœ=u\˜ÍâTiìÆ]U¾4¡ù>¹dÏ¡¯pbšŠŠÊÿó¼|G™Ê³´Ö]¢G²²m×2¾‚‹†ŠÊ‹CÁÕßHm¯“ Ç‰üÍúB¨¨¼ƸUÛ ”HÙ^U1øÚP<ôÞ¾Fã´œ]»UÅ@EEåkç›[9PQQQQQQQQQQyaldå@õ„PQQQQQQQQQQTå@EEEEEEEEEEeU9PQQQQQQQQQQTå@EEEEEEEEEEeU9PQQQQQQQQQQTå@EEEEEEEEEEe…oÐ8W>ºÁˆÉ‚IcaÛîb2Õ{T¾•(¸ܦ¦×IÈãij›ï¾´— ÑuýyÌWü¾çÙå­5×qn¯¢,ækJ5ŸpuBD¢óòæöÞ¤½ ä!>{÷:}2 „‘[u‚2ûË)ÕÕg»¸Ð8Ì‚ksþ«¼’axA9QXè½ÅåÞy\ "Ûf‡íùHÎÛ[Ëÿéqðæ‘žS’/º¯|ÊPÚIª×¹È@žæÆ™L*)0ÿÌTÀ·„}×>änÔQ^Ë6ÿÌ]°ø³Ù·T6Ã7{ šIAÅ37$fi¿}‡¶Ù‚¢ ‰È ¼4 ‡ÍÓÙp›¶9I=‡Š¢$,â:ñÖ [9äÅ53JGk+ÝæR¾·ëñ„/äàzC£>d[J!¹1¬}Ù³‚{¬•򾆢Ä02 K(°k…o‰éñ~îܽ‡{’c©¹FÈÏxg×,‚$€>Ž’Ý¹$ÀËHÛmn¸PÁšNyÉVbÖKVñ2Ôv›†á%dd‚âdYÅM×%þîÞnâÞBA‘ÑØ2Ø[’‰C ¡áüCý,–°‡3QZFAÄF&b!æFFÚ“±?Q.yië7; HˆDf³/ÝŠfl.L <µ„S©oHÞ@¶_éÿé-òsìÝ­trxõ‘b °Ø]ÿ4Í ˜³8u¼€¯4·Œdx“ W7gηÚ`4yêÿ·ú>‹ ˆhtaس)Û‘FÔZ#ž˜Håw¾CÙÿÏÞyÇÇq]‡ú›™í ,eÑ{#QˆB‚½w‘©n[V³ÇÏŽ?DZc'/n/‰Enq[q·$uR”H±$Ø Dï½î.°}æý± BÄ¢èH~Þïü°wî̽÷ÜrÎ=gî´æ·¬ï¡àïy”Šce\2Ù¾~þ{^ňùܳ9›Žóoråî”ðËXÆ}iÜ?PqWï¬Öh547ÚJfðÊ^¯7±þÞ•djeª°»)’­÷-!Y¦¦¢’ºQIðâTB˜·h Å–@£Lç…½è0j%ðùŒ±/*&Û<ûWÈ<]çÙ?˜É½…ÐMƒ»Œb£æd—Çdð:±y$BôjAGö²õŽŸå×ç0èU7j!4‹{ÖfcöÎ S/Ç_¡WŸk‡¨#D-‚Ǫ­ Iz_>'‘¶ü~Rþ4 g3ÎxX¾n¦ÛTàc+ÈŸ+ÿ³ÆÁ;Pmª¤Z˜Ï®í‰èqpíÄη&±#KÇXCUB÷oK@'SwògÚ,lMÓÎ7cš~æ-såt5á ¤Ç™i´MMtÒTu{êzÉ0"ºº8v ’šÄÍ”˜Lýž^Î_ níŠÂ$<•ì¹PKÜÖ,Íœ¸Ø6.•䉎9¶˜ÂÏÃ]ò4ã!×k=оò³B¿ÉPº]ý³„ô7"ùtxÃw`Ë}·ZÏI̧þ )ñ/q8öbêF4<ÄÐâ¨/ “köðvô݈êì ¾ÈD¨aäçDU@TiåÏ}ÕÌùpWRý,«Ÿe+ÇntâS ߃ïz“{z¹Xë&guÒMY±ÓÔ>LXZ:º¶.š†`±ˆ~¯áž4YæS wp¹Ï!¡€ÍË30^æ•Cõ²óÐöÔÑ6¡!!ws#Ñ¢(¡–$D˜bÈô\z›7 ¬¼w-¹ÅVÇîýWs·p_ €HdöR–'¨ï©áÔµ N›cXé9Å«5jVÜ»Ž<½ƒê#oqÆ—Ï#[r0 ’J…Zß9O(Nºk/q®±§Œ."™’ÅÅd‡]ï ·[³ál¡#´€_õ#Ù,‰…±Ú#‹!Ñ3ÌÀÄ8N]«Wä§”6ós”±ZvŸt°tÛBâ%yGjsÀUÄ# -ÌÜ¥e*rZSÈ<ÛUjF¼Èš$Ö­ËÅ¢ôp|o=±ÛÖ2_ нž½Ç¬,Ú^BBÀ1¢0Ñ{•S5}¸·WCÒ‚Å”Ä鿤p 5ZzÚ™Ĕ ®µ“‘nãÚ€@˜Ú7gG5œÉ<²5£ àì®âhk/ÙQÉv^‹„Ï[Ãy&|ŒÖ–òze+‰ë2Ð;º9w¶†nŸ„äõ¡M*bCž àh/gߥF•aöô©Tq,]—Gœòx7*jéuƒÏ£šRÈê\ ~ÿŽ€{ –à ýŒ;Q'³¹8=àªãèùVúŒ!zd øl8Ï©æq <„Q°tY¡ãM'ØÓ›ÎC+“ЂßWz„žŒ-lLºËß³BÉ[³<@î8Ão,Ü·>óFûzÇAŠÎçuïØP›Q>%ɬߑ ÈtWìãŒf,0ÏmÍðq­¢’:»‚èó „e°jQ:’ü‹!Ir1îeØÇÊUyÄŒ_åµã6íXJª@¦¯òÇäYhAé©â­+¸ÆÇÐæle×ϯû/6†³:ºŸò;>Œä®^AnŒ÷\áÄå>Ü’€×§%¥p1%±:»8¶§ ÝüP<6'¶‘q ó–±.ÕÈDà Þî %RbÔO’2Bû†Â KH×Î<~”J^®ò’ v§ƒ!«HÖÒåä›E[G˪é—°ê@ d•,#Šsû±äÏ‘÷ySCÀ<^–ˆ^Pð)*ô:núzíÄ$Å¢ñ¸pÉzRMôõá ˜/PZÄ W¯a}Q1Úé‰:²Wß˶ ãdƒÉ(è0Ìb^Ë£}ôH —˃™D‚ÒO÷¸‚šÁúµËY‘qÎRP°ö÷£Ä&-yp¹!,1ý@C²‚ÃjC‰ŒžÜÕן¯ëo` ¨ÃâÉN Ÿl›Éª[Šxdc.‘às0lõjDšS[Š˜bRÉŒš:å DänäÁâh´€ì²2âÒ` ñïÈ»\ä‘k¼}ø /ï;ÄÛ•ŒÉsmƒÛ Ó5Fz¢¯Ë…GKz”î~w@ÜiÚ¡IħDåô!Xc켂¨ô¡rHøB`¢5)Läý˜þ’{PF^!¤§×ŸWŠÁ§UPu<‡^ÚÆØÂ§ÎÝ€OP¡ˆÀD%’és -} ç"ÆÎ+€bþ8ƒëžc4Î4­0òyQ·ÿã˜gî·³Œ¢±û@¸YsƒuÕô';%¬A±uÒ4¤'1-‹dó8ÍíCøÅ* ŠàéFµ`; "ptTr®Õ ¢ˆ€Þ~7yk7²&ÞGGõ%j­ÚY$63ƒheÆöqÆÚ;,ÌO3ݘÔÔÆpb,‘Ę ïyd¢µœWƈ]¶=¼•ÅúnNœ½Æð,c+0ÚšˆLI -ÅDGS?ÞëwÀ:ä#uÙZvmÝH‰º Ív”YÒfBKgAx/W;]þä!êÚDr2£"&“‘ºFSVòà=[ydCî{óyº9W1BÊòõÜ»a#÷/¡·ü ÞÙ³¦$¦…O+·@hRB[ =]-ŒX’‰œlUH(úñZí¸d]|ÛÏfLCñátûPi4¨Ã….c ÷oÚÀ}sÐ4\¥Ñá¿TŸ¼ˆ ™&LiK¸oË&îßà7 P4”_d4a9;7mäÁÍED 6Ò|£¯{v™Y¹nmÎGßZKã¸ÊõUõHyë¹Ý*6fê°;&ó(N&|JÖndצlˆ¥¼~cÊ<’F›ü÷[+õŽ$ò>Xªß]‘Ï-(Œ^»@µ&ŸíÖ±sóZЍ£¬ÁvcüŒŽId.*aýêÕ,¸ÜíAK!ÇÔK}×äñös­CEVºŒ¨â ¹oËV§¼s“Q Á0x•+ÞyìØ¶…‡·­ôÏîNΜ nÙFîÛ´‰ûJL´^¨¡Ó("‚2ÂDH.k–,gÛ" ýµ- É‚61ŠåË2д b,\NaXmC¾ÀãGQÆÆÑe/bÍòUlHvPYß ~£$‰s›7oâM+n1 `¦±äÏ‘÷Ùs0ÙNóÅsÔ‹Ùœ¨ÅŽË«F«öÒxf/§µ+ùh¼ÙãÁ 7;ïô|îy7Šéè¥âLrþRæf™½<<*ªávígþ=%hUœîÈ)©àqyÑhUØêKy¹ÑÂÎ FÔnEÀaFÕØE—+†$µ‹®®Aœ5S§ËeMÜmkFOÕaŽ4X!"‡ÓÝá3¶¥Dì¼bo{ËQªJ˸4àÅ”¹„­Ñ*@A•N¡ÑLVr:ßÕe¥©5ñ@^ØÌ­â젬첂ÓnC>y„f LéKØâÆ­¨Ñˆ}œÚ{ gñ½hTx<”@2¸Ó´;‘€×àE;Ѷï9BRQÌkܼF-¨Ã=Íèë¿^t#)2²Û>™Wƒ"  Y…mþVÜ7ãôÿQá´D£éx´"j·Õo j”™Š{»|Êjë è¶àŒJÂ+lÆ©?6¹KéG±·p®3œ’MSûˆÂp[;CÚ–D†`ˆ ã|SÝE'¯£Óɉ0¢1&]ÕÇÐÐr€ˆ%5“8£9%šSmôÊ`šy‰BSÉO¼ÊѶF³ãinE¿ŒL£2½—öñ‹K€ Å’¾ˆé„kïJj“øèïíÇ-û¸zâ-ê„AÜ1¹™0óغ=Š£k£ÑGI¨I"ºª…6W,Z­%–˜ICß‚uÌŽ‚1@Z h-éó¨¼ÜŽ-9 mO3aYìº]lÁ4$I…bŠ#?fn;û³! ÒçeäÌ1["ãµX Ì!†^ÐÇ0ï6ñœ‚!‰y†³œªÕ³"Œ¶qTÑ…ìZÞI]ëWÚñj"ÈÌÍ'×¢¥>2£ e¼Úîï‡s2&¢½ªØß, = {}DxZ†Ê0]CFëýãFÅ¢5QS.ˆNˆóßBB˜Î‹Û£€leÈf$:Ò¯Ô‹¡¢õ=“•ÖbÔÚ¹xö—E ebW˜ÛŸ¦ŠaAz GšGÉY`¢¿©UÆ*¢ß§-AßÀUöîoœœ3D²–±)3ô=Èg&<ôŒ2>^Åþ!ÿ/ŠWÀ­G!0DYðëÅjôz·Û‹"ÉÈ´p±©“ñ” TÝÍ´‡¦ñ@ØJ!©”H²³#oÙu—ÇÔÆR꯵*<ŽXªè·+$†¢™8‹tzô^+. èÔjjµƒJ@P×xü$bˆ…¸IÝÄ ×áöÜ8˜ÊLc+ÈŸã@ïâܹZ&’²=+brp©Ñ©= y$ Ö°UÃ;Ø€¤Ñ ˜o–4eŒªÒS\µ)€š´%›X6§G_-Ç/[¸šÑ7Je¢…#Ç®2 b4K·,&] h4¨½.¼¦4Ö­MĨ÷pÙ£ÆxÇ}­ ·Ó‹>{!Û#Õ˜=¸ÕZ´ˆ–|6d]â|é*5Fb¢Â0êõÌfÃø‰+ÜÂã \ 6]àpY=÷lÈÆ,nçÀ·4S¸þ^ <6š/–±¿Zǃ¢ÓYpýU™Ia\èÃGØÌR—ĪMI€‡ú²“8ŠÖß|O¶£ݸe¿÷G‘°öxQ‡«É@¹Ã´;AÃk4b?†Öš‰3ªmW¢˜„S¯ nù)!ƒfìK¾Ë¸tŒðÓ?Gš6¥+†T¼·ëª¢zòJqÒn™ãRpÛ|“.eúÓ¯ã¤åršœu$Mµåš:¬ÈŽQÞz±i²ÎšúŠIŒ™üW˜Ù¬„‘ÈsT´¤f§r´Æ…«žŒEñ~OÕd¢æ/§DUÏ‘¡ÑqD¨`Ôo6!Ë>|ïÆ$ưzç²ßáY¼ÆZZèuº);Ø(x¬¤gúWgQ¦^ÎTƒ8 IDAT¹J›±ø‘™äŠg¨I ¬y”¤ù%ÌõueA¯½Þ;ýen]OôɬZ_pwUAKJv"­]ad†ÀÀ}D2ÅÉ£àªæ­“ÑïXgDÄœµj2¬h*Z.¥É¸ŠK#ÑÈý”½uùnTqZ“Nîù£ÜÒ®òÍa:ZÏñËã,Ø´šl£Èxãq^¹Qqszæ£ÍteÅÑÜk&o£qNãkÆ5í= YrÙy›°¢;—O D¢sVÝæ=>C Âí[AŸNrU5¶XÔMÃÄe–Ì݃¡Ñ¢Ÿã–ûÔÇO—ùk&%%ÓæÄãGvM¦ßòëz»ƒüYó¾¿+%ÛZ8r²]Á6Þ¢xjˆ5Ñ×ÖaÑÄ…¸in·9_à4„0 ×mçÑ;xtç–9ã]ì¿â&ÕJŠ£oÝA ilÚ±ÃÏ7'QÑC¼³‹¦ 11h†ÚéTÅ’pÇþRИ¤Þ6ÕÄ[ ØÚ;qEÇ)®1F¤ÖoÞÄεÅÄLŒbHˆ½Å8pô\åDe;S£6&šËøíñh¨%4D‡âtâVfiK|ô^+§¬i”›‘A^ÚοÉî+#xAm T'âp¸PðÑyñoÖŒúcÈå Ú{¬˜#ÌwîÊ#I²Xiìðf‰&‚ÃHŽÖ”Á¦ÝÞxÄR4!«°Çæ õŸEÒ¥àAðº Ep¢î=JÁ똶(¼›ç) {d¤ò(ø<Ê,±‚oH¸*Ðw£:ŒÖqS²žþ«\œHcqò­®uy¸ƒf›HRñ&Ú¶•‡¶.%[例­Ïä5¾þ6êG ·vÒ§HDF†ÝÓloeÀa£¹­·d&Ú,‚"#Ë2>Yö/o²ŸìCžì»RT&¹6꫚6¥‘ukRÂIÎ+¦Ðì¡¥²ŠV—€V§A­ôLàj§etJ<›|ýy   øüÏ–‘ˆ‰‹A« RÛ0„Ãe£éb)ûηÞ2Žn7¶fD¦®E¡`ý6Þ¶•‡·ÝÇW§bknetR^Ž¡AF|n†Æ 3_WR¥@0’9/ŒŽËåÔzRÈzÓ¿ ¡‘ÜL8ývO–=0¢ÉBŒ·‹¦!_T&:¸PÙŽí.è0*K‹â§=^:οÅkUCø÷ÓT’ Qöá»ãPFN—ŒÉlB¸ºéqÉ7ú%€( x=ž[³ ÄEØéèqøû³wò£¥TÎRÑDD¨¾A ¼Ã}ôLF¾(n'n‰½²Žî1dE¹©jX?BåÙk Çg‘2Ǚִ»ÏC>j¢cÂlïôJ€—þk—¸<0‡¸5U49É^š¯ÕÑ8Oî{ ÁÃ,X\}tÚý•ñôÐK$±ïᔩ÷6~DðzüÑA‚à}öøh«¾Dë„kE)Í“¿ê²-?SV Ë/°ïí:Dt±‹X›¤%Ÿ9à=g\5gÎQoÙiÅé­dÏÁ4ñÅlË•©ºØÂ˜Æù‡9€@BÁz–ÅPiU±,^¾2ù‘=еŽ×ߨAȼ39Í]> ´ÚÙ?‰ø?û…ä;ÂEË¥JlikXmž>PŒky2ãîV$táGùÂGæ1çˆÊ½üîë˜?÷–èïbAn‡` à‘/S€‡ÊŸ}‰s3]çmãÈÞŠ”È?ÎúîP+ßÍÓv>Ÿ­ò»š¢O|ÂTåWf¤êu~÷Æ%†…pòv>ÉýÅQs—ï;ñŽÑqõ4ûwD¸÷>½ÜðÎIêOUªv})‡-çÄתÞïÂÜ}ëI~ú+'}~3Q·‘‹”°ƒ/ý‹‚ô'0;NGJÞʧ¿²‘«Ïÿ=GßïÂB™àÊÁ£›¿Å7V†Ý…ÞEwÍδZ‘5ŠJ2Ï,³‰·öVc 5 Â3—±>#$ðse/ãÖAZë¯PÞÍ=Û ‰™‹®è¦¦ü"ÕÃEAžÉª%ÙD«ez.îãí.5&ÿF‚˲õ ˆŸm2’m4UVp©×… èã°¶0Ž©v·£»‚7Ê:ˆY½‹uq“d—äÐ~¤‚º˜5äÌYsqÓVÛ€0ÿÍÐÍ1Ï{ÀÙÌ3–¯›‡éýž+ Z­ŸzÚFd×eNT÷áEd·Utë&öúÚ¸–ô’¤ÙëÙ{Ì~Wîèm;Í¯Ï `Ы5á‰Ù,ÍO%B}Wn[<]çÙ?˜É½…·Ûœ•H[~?)HwÍp4*´¢Í±Nj|à—?ÅÖÂåþ.¾u"WíœþôÇÉSx¹ô³ÿËi]šî6´9Åhú®Ðä^Χ>³‹0Aë‘ß²ç’QpâP§³ù±QXkPF/³û7oPïV£r{1?ÂǶe£dúü?ëÎe¾³…ö‘!ÆCWðè'·‘¡W¤Í,9¹gßýÉ(÷}í£d«dzöý+?µ=Â?|8›™‡¥‚½~?x£ «"ãò„»óIv.GœI>9&o%Ïýýíe táW/œ¦½Ç…{ðG|ç¤RÛÿ÷#äiüÏ´Öá¥F ;ç¨ËCuœj7²jË*âÔ2£µGÙ]ÓEÚÊdÔn7îÐ 6oÉ'ò¶÷òPb§µ+yréu/™ÎêST;£Èˆ‰Á4¨Ì^ˆÉömª¤Z˜Ï®í‰èqpíÄη&±#KƒËå#±p›“g辎ï9…³x÷¤inÞóÚ*Écç¶´Ê8m£¸¼`œœw¤–²-I‘îé÷Ô%R”\Ë‘†aæGÎê”G8r¡…1/^{¯7¢…Eë IV¹è­­àlÛ‚JÁ+YX¸¸€´;—”11/_C½.b‹x 86à3[G˪é—°ê@ d•,#ß4Ì™ý—ЬÜÈ¢ÉAßÀ%^¾¨eËæ¤kG88C¢g˜‰qœº4V¯È!N øÆ¸VQI]AôyPÂ2Xµ(ˆ9)òj´-òÔÍUy˜+—º1-Ù¶h ä1ªÏ^¦e4¢H y¼› µôºÁçQM)du®¿Y%3ØpŽý}6¬ 1+X›bD@a¢÷*§júp n¯†¤‹)‰Ó!àc¤éÇ®ÙІ ð*Y|=ß[Oì¶µÌׂb¯gï1+‹¶—°~ú¯Up®Ã‰ˆ—AÑ’"Ò"(ã4—Ÿ¡|H"Ôh \ãaj—¢óy`]z•úò2ö_ÔðÈÒx4ÞQ®V\¤v TŠ!<‹Õ%i˜úÎóû†h¹¡—Ê8WŽžÀ^°…ÜÁc3êhŽörö]ê`TfOŸ AÇÒuyĉàí©â­+¸ÆÇÐæle×|¿^(Ö°»ÜJ¼ÑE—ÓLZ„›Þî1®gyŒ ÙÞɹŠzdÅíÃRÌÚù‘ܱZƒF£F;×aH>(Œ÷\áÄå>Ü’€×§%¥p1%±ºÀ2ÀC_ÝÎuº$/&ò/$#äýq_À…‰Þ^¬–,â¦uzAŸÌšMÉÈgx¾yZš£cë7—!º¨/ÝÏåîlbSîÔ:ðÑ]¶î¼Ïò…MQ¾^®”õb“Á ¥²é3Òñ•ÓäýÍçnõÈVÆÀ¢/ý›bd:ßz†ïÊiHà¬b÷‹í,øß_bY¸ˆ¯ÿ?úánj¿þ¹³{ƒP¬ì=idóßäp}ÏGŒ[ÇÇ¿´Îߦ ¯ñã—Rض% ð6ìåùs‘<ñwŸ&Cç¥ïÐ÷øá«d}j1‚(Ðߣ⩯Q¤óÍá'G¯±ò‰f”A$]Ç^áRìGøûGsиêxùŸŽ®ôl(£œûÃn&Öþ_X‚àneï3¿â`Ö×¹/el²»Í-'*ys¯_ùVG( —þ€¹1™VÁk/Ô“ùù¿gs¼ wË«|÷ç{HÿæGˆqpªßƒÛÏÕêQ¢‹æ!öô¡_…^G;°Y>ÉS[C›_áÛ/œ¢«ä’¢×ðÄ£]´îŽä/¿´åVÏËšOþ=«m'ùÉ?5N-%£¸¶ó—»ùÚ>‘¿ýÒƒHÿ÷MŽ5Dô¾Åo+“ùäßl%F¥0zî'üàåód}zy³‚sÔ†qåÇùÛ’T΋üúoQ¾"‹ÕfAlsQøÕ/ðvœ‹¿øoœZìŸfL³Ìh؉±«YŸøo”UÚÉZ‚àmæôy‰•ŸÉ `Ž*^ûÍR>÷%6Ç©ñvå¹×ÏÒž³÷Lòy‚AšY ùäß-âä|›Î-_áÑÜéË€:,žìÄØ;·Ö/²G¶Mi]èôzT€ârárS^z»Ó‹dJbaqɆ듀ˆ)&•LÕÔÉ["±`-‰øCjpÍ­ ˜çoàÃ7 ¢àSTèu*¼8Ý cÍgx£ÖŽSÑŸUÀÒŒð›2ôÄ&§â ™²à)vÚºÜDÄör¢´†qDdú–NfRÆÛ9uÅCþÒlFÏ4Ó÷ÎÖ!".Ê{‘#g0¦\mÎbó¦D®?Ì`ÎÖÄÞÌàë¯áX«‘õ›V«–­;Λ•įJF+è qPQ=Àš5›Xiœ›R#„f°¾dŒ*#›7NõD’—©fã…%1¨ðÐÞØCxÖ"D° `ò‘ºe-ËÕ.šOàBs;ç»vjM1»6D¢ÆMûùÔ5XØ9a2‚–¸Œ,<†)åt„…ú¨ïîaÈG„.Œü«ýiŠƒ†ò‹Œ&n`g†Ñ;HÅéš­Qäy »~ [7‘û*xùb3CI ˆòus®b„”õëÉ6ȶzÞ:~…Îm‹I’»(¿âdþæMäÁÞXÊË݆Ûw®È5”všÙ¼~>fIa¼õ4o\l'~u*šþZÎDZus‘’‹æSoSw;íPm"« “ºmtzã«»@¹<°9êËQÖÍŽø0BÇmØdïP'ý’…Ô0#ã!ÄšD„¡™u4}ò"6ØF8ì]Ä}Ó<ª¸Bî‹“é¹ø6¦Š eBMâºîçÿ“g{‹ÉÉ) pEá³íBˆ¡„‡°ÿ×?à¨J<<ÌDü uÓ«Meu”HÄ/*"þô¾îZF;éýÅw8€‡Âà˜ –ÙZÂIý¾·°­ü4‹nãŸõõäùßw±ôýy! 3ØÔŒœù©:–Ü\BK›é•cB ,#› @)LÂ1áDQdZ;z…OgŠKÀ¡@&1!y}/óÃg›)ÌË%¿p%9³ù‹}=töE’’ê_@ŠÍ"ÕT}Ë%ò@{.%³ãË)ï²ó*L´äù—úXñăÄÏÚ¡B"#ÑêFÑéà ӋZp;ç²µ0ƒ ´©ä%îååïÿ”kyÌ_PÄâx#2ƒ x2 E ¾ä)>»ÄŸÍˆÑy,ˆ÷kQѸ»(Š#€ Lôt[œêßÑf™¬bð]´Ø;ðµÓØ•§u1:CQÄ#!Ž!ÆÈ;®‚mpÅR€¿;ˆ„ÅÆ¢obDN&V$! é¤ÍÑ0Œ€)=›èCM´ºbÈ”;¸6Cþbà'ZK,~çªKdÖ1; úF¯bÿÐdɽnÕ8 s‰¡‰HNV#9+×bli¡ú|=CN°¸,å&b†é2’¸Xï×STQ,ZåÏçD3Éñ~F0†`ðÚp) ÒçeäÌ1êq‹Z¬NÙ=ʨ&‚¢IëØeÁ$xßC[*رÙ|œ8Þ}½QÇ&+èF­øÂ'u 1ÑaH÷¿“ ×£—]8=n܃v¢Òcñ¿Š¢'1ÎÄéþ”Ì0ÌÞf¬ÞZ¯TÓ,fQcj9j¸û:ˆúBD5Vµƒ^Dí‘ðz½ ŒÐ3ä¤ß}Š7jý×úd³Ý“Š·Jrz蜟%Ûg–<6È 6–âÉHUx±TÑo— Q S…“d®æôÑ3t%Ä’Ÿ@fØvƒÿH|Àƒ;GîfࢀaþCüÝ×ÖÓÑPKí•×ùáÞhþòãäxÙRî:Äó»Yÿåϳ4Rd´ô{|»ézªâwqÜ,ðÍѼ˜ýÍC¤¾ËxF_ç!Þh*à‘‡ßéÊUì5¼ö‹2¢?òVÅý­+¸ Þn¢HÙú9>³ì6;a‹xìsh­£®ö/>½—yŸø*;3íS*(·<Ú‡2uóY±RµçÚ-_$w®[ŠŠƒöcÏñÒ•(îùôgɼYweä¿úÁ[´ûÕ<îûÊSOn Âd\° ø•Œ9>nFˆ1¬øÌ7(èi¦¾¶š³¿üg-û<ŸÛƒ¢L¯û­’4Mž J@8¹õ†2r ü@¿Y )–Ÿø2›,ÓÚß;‹ìf|îôÿefΦLªáñ±8O·RÓçbÉý¹ÔÖTÒ5h ~íõ]ñ®Æ.‹Ü”L@t¹ò×O-xª“˯ü‚ŠÈÏò…'ÓÑÉ×xñë¯Þr…$M‘ø4ùJ› UÚzV‰ÿÍé¶b,§;ÉÛüsyW|î6Õuù\çnË`|Vê+ËÆmÓ IDAT.P'd²~] æÉ¹S‰%?ûúE¢“meDãÇ‹ËôVåx» ÐŒlÏ5ߣòxçÎÕ2‘´íY“á j,©ó°\¿EH–‹\q¡XnóÎÒu5Ž˜¸H´ &%ÒMÕc¼‰»ž³Ç¨AÆ1æÆ]y‚rq5%1ÿÁðÓ{‡€^¯»{/±ªc)HºÊ™VQJ+®”¦ž¿!N]C•©å‰ÎY5%4ë.  %9«€ä,ü/zŸ9ÆÑºPÈ™-£pû¹CôɬZ_ðŽƒä銹"Oiéé­«Ìm  Ž+àÞ¥Ó˜P°M¿£¢ÌxKeb‚ IAÎw–Äÿ !”Ã#Ýô›ò(twÐÞ¯ÅM˜èÏwwu4@˜¡…yæ/_Oáëmá[äs{ÿžÏ 2eþê­¤Z‡èîéáÚ™«T¦­fÇ<Óûr(Îü,Ðöñw±@ý1pÓqj—ÆÂH^°’­yŒÆ6ZG®«1.\®[K©LØpãI0Kààju¾I M%ÊÑFûˆxè¿|…žÉÛIqÙ¤¹ª¸ØâzòH{_½ÀÐlÊ–2Èé×ʉßu)ÓµoÇù2c>Å®ì© ‘HTf:Rc5ínWk±§eÞ]t¤ÎK ³¼‚aÀIëÑ9ÚäŠÔ׺‰ÊXÈê{Ÿà¡b/mSåè¦ùÈs¼XÖïúOR,ñ–AZZì(€»õ*ö›9\ o±t%»›ç¾ø(4ìù!è,æ©Ï>t‹a „¯äßú6ßüçoóÍoÞ4 î˜2P†/sèx Rì<nxˆÇïËf¨µ /"QYhšªiu(Œžý9ϼp)ðNk@¨‰Mˆ §¹ Øk¹ÚvsçI«×á³âðöÒÚî˜}ŒI)d§ PUÞ}#ßÙWޠƦÌ*»™£ˆ¶·NŽ%/Wkœìb|)ãµÔöûËí騡IH'Ã""ÆÄÑгŽ ó Iê-åÒH,ñsQˆD ÁåÄ5ãeV"²²Ñן§Æ® ãW÷ñJY×Í~};v»—¨Äxt‚ÂDCv¾eR°µ4Òë”qÚ[†ˆN¸nlJ TÔ(oLäêÏsÚ¹”ÕéÓ:¨¯“Ó¿Ž£7£ÖÅø,R&j©í÷ŸPçë9Ì?óžÀòy¯8z®r¢²ëœ-òªNž£-¢„í‹oÎö³¼|²« 3ÖÝ‹=,|ÊiX>z¯•SÖ4À0ŽHlá&>²sîÜνS [ GN6¢+XÃÆ† Sqø0gúüm©¸úiÒ>E™–G©+/çÊÀ”Þ#„#ÑÕÞS<Ãth7iЧ.ãCÛ6±kãvm\EA„†¤¢5ï0 dû8v}Æ9×ïv˜,ˆ= xdÆzûpDFñžE.‚׃çò‰ÌÊDÓv‰3m:r2LSæ~ÇÐ #>7Cã„™M¨‰Ž c°½ÿä¥ÿÚ%.Üùλb»Æoœ¦~|²‡j¼>ŠA\„ŽžÉ9Ô;HùÑRªF÷&Ñd!ÆÛEÓ¿\ÊD*Û±) ͘]ÃôO(€Œµ·ïæX$4’›‰I/¶{x˜ÑYlj@¨%m;m“r®ÞZN7!#`0™†öŠ“®žÆ‚l§¹º Gb ’†è¨{úüAwŠƒ®ÑÑሂžp“‡ÎÆaL ¤Ä‰´6 1›æ´"Š^Ï]:S '!rœÖv«¿N²k—jhŸk¤àíÊ@>b˜‹«N»¿}#=ôIlˆ@ Œ÷PÕ0ŒhŠ&}^!ë ,؆Ư#D>àžCl,¦ºz| $Þ˜ï|tV b@— ·k„ý‡›i¬]–öG8zKMd´Âþ瞦T¥EôzÑeÝÏG®¿ý#e°hù[¼øï_çT¨mæ>ýp!ú´•¬ ÿ/ü¨—8³…Ü•›H|ù-^,OâÑ’B¶n;Çs?ú65ÑQĤ%’ Mî*èò¹ÿcmüîågø®ZÇ£'çÞ'g9ÚQÁ~i7ÇU[øëüé»P Ö³/óF““8÷/ùa™ÿWUÒ&žúÐBL™»xbù ¼þݧQi|xô¹<öØBôÌ|ÞHÌú±«ïy~úôi´‚%f5¬ÐK¶çÌ÷hQ+|aËØµ}ê Õ^êÎPRÄC«’ü? ‘,½W_xšgNFž˜JJ4þo_'G_o çá¯òýÏסg_âÊ„Œcp˜aÕóýJ Æ¢ó‰ü«¼z¨{Ì~ñôd,Œ*™MÿëIJÌwÖS”± üᧇèô)8&°6ɸ÷ólqÏ$LÑ„uþ–ÿúŽ‚F%ã%Š-ø_ØÊðËàµï}A-ãÑd²å£ 0˜Ë qÝCüôw<ótái$¦†b“e@ tÁ:ŠOïåÙŸUeŒ$4&AV@±SùÒO8ÚîC¶õâïå?ž9ˆ·ž?¶”’ K0±`ýRÎìù>ÿ]9µ„M%—9ðÒ²ÿêL˜ÌcœúåÒ?6ˆU¿žGWDN–c†4ooþçnê½ ývÆ®ý'ß?«Æ¼øq>¶.Ðå¬%ç•2¸ó/ˆz‡kq„¦ò3ØSf}¦ÿˆ@ÁPÌ·óûß<ÍeIÂë !ïÞ'ÈPƒ žY>¼—c™|´U_¢uB‡µ¢”ë¯Ãé²-?’¼‚N^:Ì˲ˆ¢HX²—±lª1¥8èmoÅYÀ‚ë¡FHÄä/%¿ü"oì¯B@ÄœVš9a2Ã=½Sòž-ù¬K«àì‘£H*Ÿ:†µ‹y¯ûóbxó4çx{_zšˆ¬¥¬M›<ŽZ—Ä|óeNIËH¿åà$ƒÁIíÙ“XãL¨3Y=™Çœ½„%¶rlE-xÁ”ÁŠéÆð»@Í`Ež•Ó'Þ¦ A–Q›3X=/Q€y%EŒ\8Åë-‚O!4¥Èºb ÍNDze#œ¸t”=’„׫&qÁbÿ{JÚæwr¬ôMFæ¨p¢„ÉÝ|1’ìl¥çË Ó£Ñ`ü~;kÓyŽ·ØQ|N†'¼”A#FQ¼ºäÈÖÏ«àô±Ã\Q)xÄ ‡øÚ˜ù, ?Ãáƒ}„Bˆ7E":oN¤¾jöü?öî;¾Šì>øÿgæö"éª\õÞ@¨ ‰ÞEYv—­Þ¸Ûq~¶ãtÇqâ$Ol'O^É?Ž?NâøåÄq¯Û`Y`aiQ%$$Ô{ïWº*·Îüþ¸Z,* ìÂÚçý/4íÌ9sfÎ÷œsg7¢*2Á±ÙìÍ‹F„­,&¿ò*‡O4¢Ã6,ŸÍ©f$Tl!†{ÌØ5½‘h+ú1­ZF´DPl áeWøåQ#F™ô¢ ¬vP]VE‡GÁ35Ôæ"¯õh0Æç³kÑ9FÒ ‹+¿Â«}´~sB[îg*ÿbå£cýÚqÎ]>E§FƯ˜ÈÜPHŒ ,VF+æñJŽœPÑÊ*~,䯉]ü7aï"iÚíyÇòNçô»‘–¸é¸t’º°­<ž¹Ä«çî[à;ß~𝼓W™Þ/£ÍÕŒ„ä³"R‹»þ'üÓ‘(þð »—ùÚ˹W™æ}ß]û¼jNî…:Më¹c\¿ÛÛ^d+Ûö³pKë}LÅQû&g›œw‰U$Âr÷²%}¡oqÜù6©å.[š·ç0ÿö#7ÏÿÅso]~=¹º8q²¸í[Ézßydx†¸pºëÆíäÞ|i¿ÊdÃ)ŽÌäñ[k"õ)‚ðH Zz ñ}ðx0\O×™ j"·’·ìŸ“ß»©k¿à[=f ÙÏò»¿óðòhѺ;yó»‡9dÐáõÙØôÁçYìe>¨3Ô¾üÞìð1=àÅž÷®$N ÉBÚÖçH{ØéxÏIØVíá©U;sT•?ý6GÚƒÙô‰ÏˆÀà7…2MSE=þ•›Xñ¾ TÆ[.qºqŠÐìu¬È„÷Ìû`ä@AA„ûµœ‘1'‚ ‚  ‚AAAæˆà@AA@‚ ‚ ‚ ÌÁ ‚ ‚ €AAA˜#‚ƒûåïçÌRîãSÜïe´†_¯_ÆgÖAA„ßT|pàí½ÂkÕcwùÊè»AaàÚ Îö¿7Gûõ§0põ0/×:Þ£òAAîÇ{òLe¸Š«}d„Ôk–ÑI™ŒuXe“ÁçàFåUê'@«úB3ØR”B¨ ³]¹ÖCãà Iúí9Ä,Òø);~o¤ç°Bt‚…©ÁœÑëØŸŠwøg®õâ’e|> q¹ëXkBÂOoõiζãé;Ũd{6û bÑÊtå•õ xÀïU JÊcK¶cà i¾ÌÑA'“3*Q¹Ù–dañï9úi¾Âù¶i$ x !w]!A2(½œ>ØŠqe^§ çø4æëÙž¬§ãâqnDìäñ s`ÿžNk%zK"]¥#äì/&áfþ(ŒÔ¼I™vû£uŠ–Šs 8¦púBÈݰž› xj¬är· nMùkóIµÈàéàØC¤™h½ÞÇŒ¢–½“IzðOÐXYEÔŠì÷¢†¤±¹0•°yŸ”–dY–—È AAáQðžÈ2êÄ4Æ [Yc‰ú“j"{mã åT“ͳ»ã02KSÙ›”µDòd¦Sb!;ãœðòt^Øò†9$ÉçÆšº•,ùg<+y¡PÏkåƒ8³BPf%’Ölge„eø/^m'3&›0IC\ÞfòÇ3¸b'ÛçG ê,ÍWqÄïdšÙ7Bå…fÚ&#ȶÊS¦µì-±  VòâÕ6FV±X‚U3~;EÛÖg„ñº¼Ñ4JZ¡Y•‘Ôqf¬ë(É2 ŒTóby;£‰«IZ™ÄÕËmŒ¦­"BV™înc(2ƒÍÁœú³*q Ó>i !ÚŒcÂCHš Pœ“hÖmçI›Ähí Ž6 ‘µ6†ë(í±±{ÇJl•éŽ ¼vµ‹Ø-ɵA„ÈUT¶¯bß®½Øn6üUåÔê xjg8:'î¥æöK,†)®^:K¬A™Áâ¹µ\¶c7V5š0ù&q« ÛÒYe.¥a(‹ÍQ34·»I/ŒF/û ³Î08壷«†Ê ÊŽŒOY–À rP4I!\ ²šñMxQQ™ÁéôsöLßÜùú™Æ©€ Z†¸´Ôy€—¡aÓÓÕ}k3 v•·‚ YÖ Á ‚ ÂûÂ{ Iw´¿ïÞzüõ>'¡HÒÍQiþ®”a*.6¡îd_¬u¼R潿cŽÂ­öïçywª£‰35Ó¬Þµ…L‹ÌtË^¾}ùn;’L¤­ˆ¤¶¥‡ií­ºT³n ÖÒâè¥s:Šâ” :zÇñyCˆ5‚$ùV¾Rqó?º˜\ž\óöÑÀ€Ùx·³‰ÌÚÌc)úÏS£‘Ä´"AA„÷‰‡Ü¥«'2ÂÊHÿ nu–Þ~'‘‘¡7&Ë>ïƒhÀª›Y¯‰p› ?£}L*ʼ0EBFÁë½ãç³R1aSt÷ÏÖõPqª”jǽÿÌVõ¸ðèƒ 3É LÑÝ7¢ª „L·ÓFfînálí öÌ$,€Lˆ-ˆ©î6áq$ÅÛqµ·3B袥,dÄ0ÔEçÜ—Üõ\hXâGÄ:"£Béêa*) 5^£fØw۾͉ù¬Õ-ã¬AA„‡í½9¸+‰°•ÅäW^åð‰FtøÑ†å³9Õ|sZJPl áeWøåQ#F™ô¢ ¬¶ÝcL£‰"'£™²sçè6ŸA–î:å5ìÎÆ„ž¸ÔX®W½Á¯nÑbX¿-‡hÙÄŠ¢|ÆËÏój»ɯ””Ï›˜VtäˆV™/SZê$Ôl!15“ð«õ”uÙØ·ÄÆR+S \keÔ­"ÔÁè6d‹–h 7Bó0-Ñm/‡g±cE%NŸàºVÅ+‡‘Wl]"r”°e®e­³‚cÇ;ÐI>NccêüKJaðÆ.·ðìjÛÃŽDAA„%HÓnÏ;~ó½Ó9ýn¤EX.ÕEÛ¥RZc¶±;ù®ó}AAá6AA–%×yÈ#Â;¥Œ4ðFy;ÞÈ\v%‰À@AAxpÄÈ ‚ ‚ üXÎȘ.‚ ‚  ‚AAAæˆà@AA@‚ ‚ ‚ ÌÁ ‚ ‚ €AAA˜óÞ}çÀ?ÀÙ×.ÒkƬ &{}–%>Ý+$g{§['ñÏNâŒZÏÇÖÆ<¢‘¶}Ãï:¸ÇÖÏã~UNurýô&sJØõ.ÜJÔYnœ~sƒ ‘»—çr‚y×îJ7o¾x6,¬*yœMöG³T¢Œ5p¼²‡ §kî“<‘þ°¾…¢2Ñz™3­œ2Ù»w³Æö`JÎÕZÊÏZ"ynOh—/MgÓºŸ’xÍâ«*#\á§íüjÂ÷òôJë»w/zH~=ë–p/ÞÛ ÉaämÝF¶iÞß¼cÔU\¥vÌ‹¤ªhCÓÙ¼6“HàwP_^Aí¸‚F½=‹­ ËKl·Ø²E(~ÎÑ>n\¿N“u-_w«ÁçŸìäBù úÜ(¶ä|¶®ŠÂ´èUfú¯SZÕËŒ¬ÙBz~1yv âwO32ÐÁÕšF¤Uûy,E¿ŒLô0P_Î…ö)ÐH`ˆ¡xý*Œࢷ¶‚KNTIE Icsñ ¢–ڭꢻ¶‚òžiT½¼¢5d†È÷œ—xF©©¸Fã„IUÐÚÒÙXœA¤ü=ùÑ•1‚-o%ÌHúÚMä….§!æg¼·Ÿ=û¼óR¦»¸p©ž~¯‰°Œ"¶¤… ]¢ îm™DPJ1O¥ÀLK)¯Œ-#ÙoÚÿe$Y‡ò€oö3×i0fñäÍÀ@eªé4¿¸6ŠdÍä©}yÜWÛZ2±rûs¤;›8r¬ÿ27S†¯òó“ÍL©€$£Õ[°Ç¯dÓšT»ãÉñì|þy6u^à§å“÷‘ðw@qPyºŒF)Çw¬¼ï²¶’ÇvgÒ}åu®?˜Þ#‰´õ<2Æ•c•tÏ:½Y¯G3¯F®ãÕ¦`v<¹‰tƒÂpõ1´†³÷éµ$*cÔUVÑàPÐH>\ª•…k)°/vcTè)?ın ƒü~$K4…dÚ–h¼ÞÞ+Içɼ°G´ÓàSÔ+£fBŸ §WƒÕ¤C’Œd®ßAÞô%~py³I{³A-eðضLl¾Ê'x€Ó'®3 €ß=ìlĪ“AÃæ½kHXºÞR6VE]ünŠl‹Üú½\)&fÛòC4x‡«8X^OÌÞ\ì3mœ½:„!&™Ä0 ÝËÌ1e´³V¶îÞD´ÎÏø3¼Q3ÀÖÆ ÷×r¦;˜’=›‰Öyè©8É™¼>÷€R™l8ɯZìì<¨¹¤+# \ cçžÍ„k&Ns ®—”ñL/™—^šÎä‚aŸ¸L©ŒµTÑbÊå©‘TMçŽQÞÏé&^A]äNòŒ —A¤rËîå¡ä:Bè¥ÓxŠ¾Æ´õ­³v`ªúÌAËhªcÓw°µ ññ…>3û9<: ¼ç°ÿ4ñŸavö–Ñ>dóóŒ?®æ³»w2Ú…©¯Y—ËÔê/0¤Gÿo"ªŽ!«€fÓ¼‘ƒ)LÕ o‡§ kíw0OzðÛ÷â=€Qþ$£á+˽\­÷µ%áV€¬NÑÚ5FHJ*ÆÎ^ZGWc·ËQÃgiµ¯$Wé¦fЃ9.—ÝÒ°9jxéÍ&Ì™9úèœÑ—½ž’ìpô€,kÐi4È0/8Pè¿ö¯7›Ùôä6²Íª³G¯£dïáé(™ðÌulˆÓ1Ý_ÇùÆJ.Ø¢Øä=ÏËu:6>¹Ó,µ'sÑ¿Šöda“$4Z-:üöû„ꢯþ—[w)Ã)*. 3ä­‹áîuk)þ‘vºƒr)ò7Ó4žÉÚ0P™¨?Éñ‰(â½c ÏLã2¦°ec1ºÅ–-|u¢žçfY·o ±š@zÇëNpÌÏ kì,|I+ Wç‚>ÎÔûPô lßž]íçÌ¡&¢÷mc¥Ô©&ž¤ðñ"â­#*378_7ˆ[Rñøô$¬.¦(Ƹ¬—¤×aÐ븽i/c3ÏÐØ9MZª“Æa‰]`o®îZÊ]‰¼°7‹¤âê«æTÇ™‰,>x-ºb+Ïæ#áÇQ_Ê«UÄoOÃ4ÛÇåKuôù5h|~ ùì̱£f»*8r­‡:ÆÁA-’6†uÛsˆ‘A™î£¼²žø½*AIylɶß‘ð ×s¢yˆ‰iº¸vÄ`¼£ œºÒÁ¬ÉŠÅjBQÁ €Ÿ‘æ+œo›FÒ€—r×’$1Ýz–ƒ©<¿)FâJOÒŸ¶‡’„åtD½R9[÷‘(Ýùa³§w¤ßÌ_ß4h"Wñìö´·u¨-X>E‰ìx"Pè«<ÂEýfž]m[Þ3Ã?Ace S*²ß‹’ÆæÂTÂ4úsb"Š›i—ƒ1_ ›6ç5}ƒWÎ8)|bÉ:…ÁªcœVŠxaµ¿šÃׇqOO`ÈÚËSóFü}åü²%”-‘CT´OáÇBö–d[aºÿ:gkñh$|~IyÅEAéåôÁVŒ+ƒð:]8ǧ1¯XÏöd 3Így£?ˆpu‡9–uœ®Q=y;×’jX¸þ¨ÃU¼Xí##¦\³ŒNÊd¬ÛÀ*›ŒêlåTY-ÝÓ¦ÞìF–Íd­gÕ¼6ÌÝë–ð›è!wjHØVîäƒëã1I*~U‹É¨EÂÃàÀQ Ñè½nÜŠ‰äø`Fñ/ºÝbË!‡‘·e+;òÓˆ2ܹÐHæ–'Ù—f™Ë0#æ%ÂkÅ1È 9Ž” p»½Èá Ä©CôM«HAiìØ¶™‘X–] *“CC¨ÑñDj¼¸=‹ixQEevÒ‰9׫¯'6!ÿÐ0“7¿-¡ ‰%3>t.oæNÝžÏ %Ù„kÿ,c“>¬A4ËÊK™à¨dÒ#æßò%²Kx®  ¸'wë ¶zäÝn/Êx#oœ8΋GÞäªn&”åæÁ](côކoÄçvãÕE“1EßgÑ2¸×e÷D_;‚ÖåGš<ƒ¥ç:²:ˆvVƒß3-èHb&çÛ =†:þÖþÀ¶š(üm÷0iö1±ækŒeïÄ/iQe`¦ Mð2ºî“x½W±ô\GTÛ§Ùþ#1Áw$f±í|躾‡eB+û;ÐOùA’¸uæ~FjŠÏ%{Þ´ÕÙC먉ø” mÓ´u(V YïÐÚÕÛÙŸÆlw—;\ ËHøò³­„­±~ºk¯Q?¹X>ËD§§©ŽÐÒ5ŠÊDW7#’•)Á7oj:K(Qöp¢‚Í÷Ý 2ÓQÁ±ëD¯ßÇo`/Ŧ>Î^jdl‰ºµ8/­Ã„'Å‘’Lwë¾·ö&Á䨟äõÛxjo EºfÊÛ¦P—X¶)$•Õ¡Üèqþ ŒÒÐ)“•±H` lf¼¡GÒ&ž{l//ì̾¿!o—+ÇIÚ°ƒ'w–ð̆(*®Óã[zS)85)¡w¤["(!©³þÞvÆí‰„ÏeˆÖ„iz˜Ž‘)ÜŠ„16ŸÇ‹— î úqyühõz´€wÖ1m-ÏìÚÉÓ%Yè›oÐ2XÕ”XÈÎô`‚SÖòôž]<³3 ÎÒ\qGÜöï*á¹Ýù„´ÐvóZ÷2æ¶±iûNžß½ SG=-Ó*¨34U7¡ÉÙÁ3Û7S’ndjvn—} IDATÕÅŒßNѶžÚUÂÎM£(HX’Vàh ìP4Í&°*îÑjú=ò¹Š£±œZý*ß¹ý»·‘OeÍΛõÇ1¡!½°ˆ[¶°Zn¦¦Ï‹’DVðM½suÄ7Dc·–ŒÔ@ÑÆäñôžlIz{'£dÅ«CñzñÁ­‹÷ÎíÛçƒHæì•PV­c¥y‰»—׋WŒv¬Ž§†XùX­—W…{”Tñº}è ZœM¥¼ØbgÿN :¯*a³¡mé¥×E‚ÎMoï.¯Žù‡3Åd³5æ®gFõ N6OBX%w‡/˜—¢W}×]:¨.-ãÚ°àôµìÔ*úˆTò,62Ã0ú'¨-+åd}0Ïæ„,œ+®nÊÊVT\SN”s'iÓ@pêZv&yð¨:ôò çÇUð$¹z-^¯u±2¸×e÷RvR>³ÃL†ÁaNFµmEã±ã³@‚âmÃÔôUL²ª x¦æ¶Õ£j$Ðoƹr/ž›ã ü£ËÇeD•RñdtžÉ@p iPÑ¡.”Ü»m§N ›ã\ ø¤Ý¸L§çz)Ô©v.÷„R´kþ5¢2ÖÙŨ!еáVÌ1!\ií¤/ßNüÜrd*Yaô–"«@ ±'§c± $Er¾³‡!‡Á ?¢¤ dVÅßàTg7ŽÌXÚºècדn‘`@aàÚ¾w ØS Ù˜jFj|G¥6ÇÏÐÀÅϳ‡iPFö@Ø\gÂÂuëîÔÙ.‘DhБ@du;îhÒ {4Qs¾=ÜÊäÄ*–E–-6Ú@êŠ8ªjºp&f`èo£;$ƒ§î6·à58†UQËëÙ_Š21Âଃñ‹§y‰‚G60éRasè%S+î2ŸS2'°Â|‰óõz²6†0Ü9 €62§6ôÐÐqUSøôa¤g¯"ÛnXâ|Íe¼Ü¸õ¶DJÖÄ£T“š«9Ú&¡•½Œùü„yU Õ1zG-Ä›õFAáÖˆy+hˆŒ‹ ìBg%ÄèÃãUA™dÔi!2<Ш—ƒìDšúçNÚ€Å0ÅÕKg©‘5¨33¸CTÉBZº«­=L'¥¡ík£+(…gC–‘ Nfføm½îÊÄ#†h ‚g­ !šj†¦Tâ­€l#ƸHF&ß$nÌH˜,ftºYt:3f­„¤ŸwñúÈV;1sm³ÉˆoÌ»hÇÁ| Õ-á7Ï#(Ó½\¾\ÏLÂÏ›«\:Œ:/£^ ñ¹[Ù+…àiF£×£[t»%–©T—žç†St¤¬ÝÅúeÍP™¬çLÍÑy[(‰¼õ TgÚ9yúà G²nO1©:@¯Gçsã Naû¶x,&/5^–{žÐ'¡7hñ¸|˜2×ðx¸›·΀AÙ¾Š׸Rz’*½…¨ˆ,&KÅ021y{øØj7#­åœ(kⱙؤÅóyñ]ÚÈÛñ$¹^'mWË8Zkä¹Ü0Ì‘©¬~kmé !”÷Oà'dá Ò˜Àæ] €—¦²sÌæï¸õc¨xgg™ìž!5=ðt–%iþêÌ/×Å–-˜üðt²å‹4ŒÇÒæ aeËý¹²d2Ü¥Ý{çÔå]z’„dJdóŽÜÛP• $eÆÓÑBº†o.1…%R–H*îÑZŸ»Šé‰ ûô‚dl›ç¦Íç¥ýÚ%Z-›Ù¿.½2DÙášqÈwdé\Ÿ?êmùªÜª¦Ž&ÎÔL³z×2-2Ó-gx鿉KØR3°j£7#†¶9%–eÕ¯Ÿi÷AcÏfÿ]¦Ý{ù,F&2kó]~ÇÈHIº{.bSI¬®¥Å®uŒ˜ô¢å`è ˜–Ùå>ÿðw–ùÍuæJJ’î¸'.R÷ÜòÛþz£ÝÂo´‡þ[)ÅÙÎÉs-s·Rr[ÃSOtt0ƒýIŒÕC[×$ѱùó o·ø2¤ò¶?·÷?Á‡÷ïYv`0Ý[ÉÑëVmÞDAäí=h’9…]O<Øç·n¢²-ŠXW/­3f¢¢ÂÐvÑ£&îžÇK%‚¢¢Ð t2¢ #ÖnÆÙÕƒ;2šppO0®IbÇî]ìßV@ÔŒs\ômÁÁlÿ ÎVu1ÖÆL[?=Ó˜Ú#²Q].<êy €ŸÆ ÊZÜšä£óÊë¸>Žtf‚Œ2³³nTüô\=ÆëuŽÀre†®þIla¶{Ê”ÃI°OÒÒí%ÄIý´Œ„©_´ îuÙ½Ñà³Æ"—¢·nf*: ÍÐ%4Æ$|2H>7 A•\è. •@òÍÞñPx'ÇSAñ")^¤¹Æ£ä÷"©KÌÝlø¬!à®Ä4Ö‡vô†Ù[%ëºÁÕ™ŠoZWƺisÊ$ìâù}{y~ï:2M::ðέãê¤Éáb¬£‡AUCxxÈÍiz#] Ï:iëÄ£±i“AUP¿¢oŠ¿âG™»v5éd‡9iªnc,8…¬ˆÛ¯ ­9”Äœòl^Ú«ªépKŒz$e’áfG»hw̛Ϧ¼u<PQýc+hˆŠ‰Â ŽPß<ʬÛIëÕRŽ\鸭Ý­n-H£¡]%wÇ>>°o/Ø÷Ü’Œ³­Ç\yÍŽŽ0îð0<:Mˆí­FêbË!YH_BwMõÞ$²#îóö/iÐk≮'ì›Kûâä`;Q¾^ZG×¢:ÓMyUÎІÑÚ³(Éôøè¾r˜WªG ô§Kh5ZdÅÿž§2úq¹‚mÁè÷pýnåæu Ë>¯÷öͤ0b¦èîŸ \Ͼ*N•RíX"!r0aAS ŽÎÀ76HÿÜÌÕã£&Ì$ƒ2EwߊªÞjâX;NÕ¥FÆb3HZfÏÎBÏ´ïÝ(‘Q!Œtõ^J€¡ÆkÔ /cÞš6’¬Dm ´ÌÄ’}ŸS°ä;v÷ =S“ñ÷3@8Ñ÷ñ–©û«?2ø¼Ù‚°ˆ‡šzì¬ÈM¼ù¶sr.kÇ*9~´IRðÉÁd­"RöÓ¾d^*LvÐbˆccší­'!§€Š+¼|dÕ–86G¡A&vÅ*zÊ/óòQ YU1ØW³cÅr_Q©#sóÎ;þf -¿€‘ò ¼Ò"!I:"ó ɲJÀÂe€|Ëb‰Cñ7á‹ÈÃo3âå,zK"~I‹?þ9Üã¿ÀzåÏñ&ü6θ ‚{¿IpØ¿3a¿‡Ã©ÝX*¾„uê­âBÎ^íV[>³È†:<‰¿ÍìÄc¬ý2ºÈíøL2IÕÁõêâóK¸}ªªŸÁ®n&¥ ’É0‘]EsoÝÞTd›‰‰Šc\UJÌg]²&dB­n*N§×m$aUYÁJ÷%þ§¬ëÖ‘kó½Z™Èü½<“Œ$‘™j§üÊ0ÑE)„ÝuT%”Ü‚TšÏ´p±:™ä­duû%j¯¼Éë Y$Ù5 Ï*øU…¾k‡y½iæfêîôËÔIVrKö±!©]S•\n9ÍOê$ÌañäÆÍ{ãÇÝëÖB¼­´xrÞ”9<‰Tÿ%G2ÉFÂlvQ铳ÓÌèÒÙ’b!ðË–ù‡¨(½N¯¢âvz˜,ã`‡Œ%©ˆ’Œ@ýÒG¥í“«Ö±œÙ‹’ÃÉÌ4Rz¥ Gˆ “UMšoäDe³øpNM!]:E·VKBÞÖØcX¿~œ³×NqP£ÁçÓ¿ºx93Šî–øÕ… V\åÕÃ~4²Š3ñ…sÓ·î…äÌ$kJ9Ö„%,¼Ä~®]m vKÑZ‰ ØÂË®ðË£FŒ:3éEXm3±¢(Ÿñòó¼Ú®Aò«%å³ÅvûÏíßF²™›AwùI^iµd ØÙ&G¤°Ê|™ÒR'¡f ‰©™„_­§¬ËÆÖD+ìi ¨ÇúYQúP{ýõ<Ütër8Å;×’úÀËG–¹–µÎ Žï@'ù 8©i­‹“‰HMF>Z‹7{7Ñoe˜2FuYÏÔ Sš‹¼Ö£ÁŸÏî•a ?»ôq¬_;ι˧èÔÈø™ ¿AYîë×î¤[¸þ,yv¡ ¬Ð_æ#½˜ô:Â2Ö±-ey£IÂoiÚíyÇ1¤Ó9ýÎäàìëDì¹ãU¦‚ð>x•i&yd¿sðN©HÎ ˜Fø#wâ¡[ÅÐD…ÑÌì{ öRv¨”ûz>µ)ñ¶"ÅQËËÇê1®y’'{›ØÛöéevv’æÊs\eÏãk—Ý+úèS™l8Å‘™<~kMÄ×ÕbË–æwÜàõË>6ìºÇ·n ï3 “-eË䩵Ñâ-4‚ dYr÷vä@ãzÙ)Z4!d¯[øñ  ¼ï¨8;*)mÄ7;‰ù°Óó I¨z3òÄ‹X:~Œ,á û “)YÔÌUe²××3i²“·>÷×(0x—¨³´Vœ§rÄHÖºõ"0øMàíçri5]šx6m Ë÷Þ‚ ‚ ‚ðÐ,gäà×c&„ ‚ ‚ ÷M‚ ‚ ‚ "8AAaŽAAADp ‚ ‚ ‚ ‚ ‚ˆà@AA„9šÿõå/ÿí;ÝÈãñ¾ IY„»³'+qD$mœÿá4•éæ3ü¤N";Éö¾è¦2zòëüÍwŽS[u™«Žh 3íJ¡æ¥oòÓ#gyó•ŸÓZBQÜÝÎ\e¶ö'üß_Œ“³6óûñ{sþ^þÛïÒ·j#©w~0OàÔ¿~ƒŠ° äD¼uþ^®~÷OøéXÒ…OÂ?˜2ðw¼Ì?~§ƒÌXïù¤¼ÔüÏyŵ•¢Ýâyã«çµù/y‰—[£()¼‡¯?/Vv‹PŽò®&fK6¡©âù{òµ¿¿HØÎ"©Ê¿4×1¾û_räÀ/¸nÚBq’á¨w£2ÓtˆïþÛ÷9ræ.Ô£¤’ôh¦ö}K™¦éüi*¼Ñ¤…éßѵàªãø™+T´´ÑØ6ˆjO ÒøP>Ê£ÙšIJð}Þüýœyí*®”d"N6pðd/¡iÑK<Ü´U”r¦ú—마ʈá^ª”«µ”Ÿ7XôÞ?ü´•Ò™DVD¼³kz!êd¯¾V‡”~oå´üòy4 Kñ½ýBò=qÓ~­ gÊV¶Øî¬¨–´m|"íÁžHКðù­`ÙU8þW±ýáï±Öôr7’™Üþœ\¼Tý×¹¼Ðz¾NNê&ÿc&ü}p±¾3*¸ü8œi˜÷wù¿ó/¬–æ7~Æ«_åg¯]cL•P %gÿ'x¦ bùåû6 ¾éQºo\àèãHO~Ïm0¿ý&õ~-mO}1‹=Wþ/W?ìĶ5™@3Qe¢þ$'&¢Hи™v9óŰisÑ÷Qðþ‘r^úéIúŸsîøÈžtÌJ'¾ýßœhŸÄü¯ÿH©,³ý³|t}ºÏü€_AÖ«¸‰gç'?ÆÚH àcðÂùÁñ> á¡D¥‡3Pæçñ¿û+´*“õ‡øåáf5 .·…ìýŸà‰œå>D†Ï¾LMÒ3|!!PÄJÿ~øÓKŒ«åÎ.Øô%þæ¹4ê­Ç«cÈz?}&}ôäGH û'¾×—MŽÞÉ„³‡^÷*^øì“¤™$ðöré¿â°ŠìAÙÆ?´…X=àëåüO~ÁåQ äÁº>¶¸EË@ÅÕ~Œþä"Î`;¶ÈPü „ܹšëo›aÓç oöŠxê^âß52=Ú‡yÏWùÂîÈ@^yê8ò«fÒ~ÿ«üAœOË‹|ý{oвúc¬XðêWq”~“ïÔE§´3–K¶¿‹Ú3»?ÿÛäÍ”ñ³_5`ÉÙ@N’žË,ÔYÚOüUShu bÙþÑSh×7gÆ«—‡ñ«.ÜútJ>ò[GÍe˜2LÅÏ¿E[Ï£îXJþ¿O³5N»h¨Suú¯_Qç%<4Ž É[ç7üæ×ø¶ãüÍ éhðqãÇɉ„ÿÅm]ôó\åà/Þ¤Ó§A™ñb+þ->²+ “´Ì²{/e?à‡'‡0Ûókðv«j_åç‡ê˜ÕiðxƒXýÌ'y|¥‹“ÿüL½ðžI¾õdößø_=™Â_~.ˆWþú –]Ñx†œŒv\òi>¶.†Îò£ïàÆ¨Ž±¯•£•C)þègÙ§e€³ÿó}.N28–ɧ¾ö)r´>®ý×ÿæ‚1}_'†¬ôƒ×iõl೿· »4CÇÉŸrðÚ$²äbV—Êîþ‹·TG ~øMZsÁ üö¾LL’Âбâ¿ú²Yéj§k|”é |øÓûH3©‹,[¸ä”þ#|ã?<ýå©Pè?òø®óþúƒ™,\-U¦šŽò‹×ª™TÜ^+Ùû?ÁþÕ¡È •OV0’¯ŠýÕÝË@í=É÷r®~7ž‘çŸÏI Éàñ?y}à˜“ 'ùU‹ýËl+# \ cçžÍ„k&Ns ®—” è¼}\¬"vóviðŒuÓáñ bš»Ö½4=ÈÃ&>±î­Q2?=µç©uEEðˆºt"æòk¬¥ŠS.OmŒÄ ºh:wŒòÎxžH7âh,§Šöï‹Â NÓÓéÀíË[àïçÌÁó¸ žâ±ýÍ}.¸)‘m»ßÚ˜Ñúsœ÷­ i~ãÉO¬çdó+ —TÍœ,ogx‡oªŒW[ÙNáö<µnê+¹Ô9ƒ¤Uñiì¬)Î%Å*ƒ:EÍÉ2fVdãon`À­@t>ÏD/zLÕÙÊ©²Zº§5L½Ù,›É(ZϪà1.½†~S …sƒþák¼xÕÀžÝYhOr|"ŠxïÃ3Ó¸Œ)lÙ˜EŒðOÐXYEÔŠì÷¢†¤±¹0•°e5äuô”ù«Êׯõ¼vû"5 LP{©†vGùá”é>Ê+ëð€ß«””Ç–l;°Ja¤ù2GLΨDånd[’ •™œ¯Ä-©x|zVScDÂÏxk9§¬¬V Ÿj¾uj"zß6V@jâÐéI /"nÑóó2ÔXÉån2>Üš0ò׿“j‘A¦­â"£‚,fBõ^æ_ñšÈU<»= “w’¦Š2Ž^ÕóºXô>7*¯R?ZÕ‡šÁ–¢‚¯ðóæH^¸Ù.Ôi®Ÿ:ËTî²GN/ØF›íªàȵnêµHÚÖmÏ!F_5‡¯ãžžÀµ—§VÚ…Š£Ž“ÄZÜôºl¤„yè› tÍ6DiQ¦z¸\Ùİ"¡zü˜“ ض2œ›E¬Ó£×ë0,·š/V>¨L÷_çlÍ „Ïo )¯˜¢hãâe€—Á†r.÷¸ÑhT|³ªx iÖ‡3|ýˆ*3LÚ3ˆ¹ã¢—L‰lÝ•ˆÒs‘·Ý±LÇ„†»‹“Ý4•¥¦/“è¤{üô•¡/çøü®$ÿ×Ëp*`Ö$³ë÷ž£ûKÈùÓ?¼}ä@™d›Á“ôV« ý?üç©V ?”‰ÆUÃÑW‡)üâ_³+J¡çð×ù†’‚F\Õøe«ÿ䋬•ñ½É¿ëõ_ù$ÙK¡NVr蜅ÝšÅ[}>rÌv>õÅíú«çÃd#h‰ú&Ë0&§ñÇŸHäûSíïŸ=¿üj:|¬ÞÊ'þh+०cùe€«†gLìù»Ï‘£U™i»DÍä ª=¥íß?ÄÇþüwH5*Œ_ù1?;ßĪgsÐþÁ~tŸø3þ8^¦çõà?O5²éãY /Xáôž~‰kÑâ¯>œ…ÞÝÀ‹zñ“^Šêàò/0³í/øüj+’§ƒC_ÿ>Ç3¾ÂÓIË(»»ìr¦Š×9Ùø¥¿fK˜ÊXé7ù‡ëasË*yå'M¤ÿñ_±;V‹§ýe¾ñßIýÛ5Ëù!/jô7jDæ¯@îÄ»“4¤tã´šOîµ¢´½Ä?þä<½EÏ’¹•¸—Žá|æ‹{n9£Ùúé¿b‹óÿù÷-óS‰„OÜã|&÷_>"óg_|Íÿ>FëìVÂóÓªD>ý§{‰Òª8.ÿ'ß|ñ ŸÛ°È³ŠËáIJéSüYQZ×U~ðÕÃTlÌ`‹MB’%F:ÝäýåçyÞ0ÍÕïý¯/Ü\f_0°“£·°#þŸ(«š"£ØŠäkã ›~/}‘À˜­æ•^'é¿Èî¾¾SüèÕKteí#ɳPù|œ,I³pÄ•ðé¿(äÜÿûGzö|‰gßù’Ð…Ä’oe‘xçöó³çóBÉÜü³ŒMú°YÐþázŒÁ„Ô_àõI7~cqóòJ&8*™tíü›·†øÜmĘ2P‡{y A",»„çæþ§¸'wë ¶ê@¢³×CXôgKë˜öjO]ͺù ™ˆNLÆk÷À[Îv€2ÞHYO8KÂïx°Ë„ÅDCÅãJ8áKÝûlìÞÏ3'ÉÚÉÖè[ø‡ê8ÝaaÇ®Dë gx½ª‡ØÍ‰$!ÖY*k‡Ùºu›,ËkÔHAiì(š`¸ÚÂî’ù#áä¤ë8Ú2L^QZ¼tµôš±“0&%˜õ“¼gtnÚ.£¼-ý+,L4–S«/à©áèðÐuåeÍvö¯\Æ4É@LZ^ó¼ôKFB‚ü4õõ3C˜1„U·–©³4W\Å¿“ýifdß•ši›Œ Û(L™Ö²·Ä‚2XÉ‹WÛMXM„¿Ë•ã$íØA¦YBq6qøÌuzö“ ôRqÝÅÊݻȶÀTK)/ö™ïšÜåR†ë(í±±{ÇJl•éŽ ¼vµ‹Ø-Éè‡ê¹4ÃÞÝ9„kÜ´ƒ†»µuÁdä¦Óp¬“_ ! åT“ͳ»ã02KSÙ›”µDòDlAÓNœŠŠo´‡!ä'ãÓV¢ƒe¤Ñ…Ûh¦ÄBv:Ç9á+äé;F´1y<£Ðõ Êçꌎøí9Of<â ¶[.ðzßë"Í4U··ÕðIDAT^DZ“§b à£üÍ+\‹Üú°¹½Ë¡¬È1ð¶É) ñ,R>ž.^&f{ ù!2¾Ñj\¨#úñBbÇ.£·ŸšfùOl$Q÷H³^°O˻䑜S3˜­–w8çYÂaŸ+h&“ŒÇãCe‰¹Ö ’ _¹ Ïÿï ••KÞÆ|B—ê…ƒ æè¾É)­elŒ™ØT@ícÀÌ–  !¶0ŸØ øûšiwô0ð½æ">f5VF&°/•.šŽƹésÞe|Ö?xŽÿ¼—u¿ûûäX%@a¤µ %ýy’ZìÙÙ•¶1 ŒDHZ&QÁ!fg\¨ªBGKŽÑ—øö\p¦º%fõÃ(D"Çå°bðE¾õ6òr²Y•·‰¬¥Æ‹ýýô †“”ø½€&:ƒäàÚÛVQ†Ë8x-‘'þ<é^¼*3íÇùñ¯Ùøñçˆ]ò‚’°†‡c0:0šB 1ÉHð¸–Óµ°@’ɉ?Ä‹ÿú]ssX¹:ŸâX  #ÍÍxÓž%É ºö“üÁÚÀf~@ŽÌaul 5†§oU]¤ ‚éï%º 9Ð;bH#=QËÈ;ȱ·ñwÑÒ6AÇô·ùæ±ÀŸ¼>?Ñ#³¨ñK—ÝÝ(#Ý š“Ø"!iéØO{ËúZé¶f³7*PÒúÄU¤ñ#2E±Œã¬9Ê¡##$?O~ß(Q™ÑhhM<éé´ÈÁ!X݃Ì,»Wèn´„†£10…†,ë1è=¸Ý £­ÍŒ{ùÙ7çæ`©.dFUÀºà=BÂ` E*}™ï\”Ðifèwûˆu©@ /Ìi«H1J€…¤;#}ƒ(D,²Ì¾ðT9)ˆü]ù¼yð2cE%XêÎq#®„/,ñ£ o#Æ•ìŒ \{ÚØüÎÌ-ëX¨|²ìÜW˜b²Ù³¼uoQè¯>ÁÉæIË¢d®aášÅ=áÅT´‘'ƒ`¼á‡+:xv[*4D¯("únѤ8¨.-ãÚ°àôµìÔ‚êfffŠ1_,OnËCïéç܉Ë\ ÞËú·î법EE·ïk9Û©34Vw’³ë®ÙjÁ:;Ê4~Ï'¥âCµç¦H!©y”q%‘hYB£ÑbK%e™Áâ$‚S3‰|³•wéJ7ãQ¬*6zb°G\Õc·291…Šž¡aÓÓÕK¹O£Fe9sèe“ïHŠ…¬MÛ°´·S{¥‰Q—DHL…Ùñؤ1zG-Ä›ím…[#ÛùÙFbl  #Y¬˜}NÜ*(# Î:¿xš<²I—ŠâqàЇ‘?›#ìK¾ûÈKçÈN§Ÿ³gúÞÊd¦q**FÇ$þÐø¹6ž¨È4cwß“d2aRܸ¼<#SD¤Fø)Љø˜`. £¦‡`óµ1é§ãz-mraE0¡ &K¾²ÉŠUÖ1©3b6Éè¼|>¨ãôºòœçµúÀº~EÅ6å…°¹†·Dbjв¥L-\>ÊÄÿßÞÇqÝÿvÏ 03À ×à&€H‚I¼Lݤ,™²#G—W©ÄI츒T9É»^o•KF޼‘³‰íµµ’[¢N*$ÅCà!¤H€ x¼pˆûœsuï D ÀSTüûüƒB÷t÷ë~}¼ß{¯_÷Й̢±Hcl ÉÔÒåÖ°M™`6Æ’á8MeùaÚÒ’IOMcNÌ jƒï’û<8¸uŠr';.*XçnæoþÛ:._¨§þÔ¼ö±“§øóÃtÕÚöðæ‡=¬ûá(W8ð*/7\«‡š8Æ<þ¯¢¢:–ò­¿ÚÌì›ìÏlÝö†B¾ùô›ru÷ÞÿuÎgþ’UIá²þú'¸¢ÞèF¯ ` óáïógËoP£³„gÿkÝÍg9[_ÃÛ[>&ÿ¥¿cSN¸zJýºMÑ'V>ëCÔ~´È‡þšy3­RÐGhÙ÷ïœJà‘?ý âÇ÷]ï?Äÿý_Ûi Æ|¾þ·/²h¬QQÔ±¿ *“ÊÔ¦Ì5‰•öß)loä|ýi޼þö,ÿßß„®OÞ÷ë)äüÔÑÃæÁ(ׯPC W‘nãã©@1$³ò¥²!qÒñL“wSnwòÿS/¦ bS“­læL§—eOΣþÌ Úz¬¤®¹ZË¢ ÞѾË*ã—2ᦠ( æyßà/^\x7ÔQN¾ûkªã¿Ç_¾Y;ÇÛ?zïº_ r|Rþ„›7cÖ:V©¿¤òÒ"+[™ÿàóÓ÷ugæçýxþ\u§ó`:*)EñÜB/= ÇØ[qžGÖçmŠÀ`w’a ÝLiID_`Hƒ[/ÃjtÔ–³¿Å‹Ž‚-g%ÍsŒ_£ªƒ¢u)ô»h<^ÁÎÓf¾±ÐDD„™¤”x" ÒIf¼3C>H Ó¯_™~9m°‘º‘4ÖÜNßÙ[2ùìP°XÌwî%VS2…unv‘ 7ãÍ,aâøêÄg¨>1=*΂UºfÝF³r ™•KèEïÃû(?kã©‚éTn|ïPË,V­+üÂÀÚ䂹®M8Ò“®>³‹TSJ!K'0¡ãš¼F]Ÿr•úð0à ÖýbJBRlÄY‡é¿ÒJ—}>E¾Ë´tEâ¶9‰QCËÝÙ2 Lq„ôPzæ®XGÑÝz[øºü¹1%Tç3Eؘ[ö0³‡z¹ÒÞιÃuœÈ*ãñ|û—2(Î}>‡‚-ÚʰÛs¨»ÁÇåC;¨ŒaÖÂxø™gYu‰æþ«Å¼x½×§Rv1•JšÃÁnêN·+¡)±É$Œ\¢¥_üt~ï½Ó¶ô*߯"õ‰GÈœ\J ´±ÿõ­ ®ÿžÈ›øò¬Jœl OÓâÒ]W;+7|íºbfv~­UÕôi£4—¿Myƒ—Ð(RŸ²·ÞGBÎbÊ6>ÏæE.µNÌGŸ¾ÁÛ— ^dH&5±‡¦&7:àk®ã¢{| ï…íìx€'–:fþðч¹ðÑkü®u/~oóu€û/ý—ùñO^æÇ? nY˜<ÐûN²g†ä|¯ßÌs_Ï£·¹* ¹9D4œ¦y@gàÈ¿ñÊ[5ákZÃæ‰ä´8ڛ𺻞ºKã5O‘3£ƒC4·ŒL2ÉËꦶêʵ厼»3.}Ú¼›Šš†ÓÝ<ÕOPLVlf•‘/ºMz’¶–.FuÀßÇ•þbí °Úg«ª8Õ=áì™v9Ö+ø“Óˆ›âÐknnKôXKÉ­R°'Æ¡v·ÓÐìèd$>aÊíΜ ?þ/ä·J|î".Õpø’™‚û„{¿ÎHoýAݽbvL8“bèii%t Ðu®†“Ý·^ó®»Î±m[%ç=cgˆbÀ¤B DWâH‰ss¹}ì衪üµáÏ&ÕžHR †ÞPºôáË;Ñ‚K5ÊÃÛG×°h utŽ_ Šƒá±Vl__Ó^' ¶D'‘]-\ë!çí¨§²a «ÝŽÒ×C_ÐGikŸâZÐÜ4žn`$=“4C΄hzÚ;CîôÚÚ]8±¨Š…X»ŸÖ‹}ØÓÒÈLQinì'ÂaŸQŠª*üwhTLC,iñš[†Bû¤¹8Ws†–™ö¼QúÂä“H¢·“VwèûÛé žäh5L€îi§öBªÝIv~k qõ†ŽÜE÷yË‚59ûÙvÚƒi¤_{îi­=Hu·^>o?;÷6 Fe±fyÖ]zËD¼Sgç[8`ŒD 0ç>É3Wßþ1ä°dÅvÞþ‡qÈf!rÎãüéÓEX²`Mì¯yëŸ;Hq$2ï ¤oÝÎÛU|»¤ˆ‡ýœ7þùeÎ8HÊJ'Í0V«`^À“߹Ŀo}…4™ðû-l|aš¡uÜ5²ßø±`òÈ9:CG¶²­a”ßë¼VšjÌØÀ‹ßZŒ}Î<¿â->øÇ-#‚ø-óxöÙÅX˜z¼•¤ußá‰Î7ùÕ–J"zRß\(Xp½ù/¼º+“î'³œ'›øBu€î³‡©Š.fóªŒÐ$%žÒ'×R÷Ö^ù,ØôÙd: Õx[)ÿàOÿ_(ÿ›Øó‹w85¬1ÒÓGŸñ—üìDQÅÀK êxoÏeÜI»øõ–±¾0ÆYløî ”8níLÑñ»_í¡5¨3Ò=ÌPã«üô€‰œ?à!ßTyŠÝILëoøß?Õ‰0jHà¡o†^ØÊ åÁû¯¾ŒbÒðGÌá¡?\ˆU!ÌÍ!|¤¯ÝLá¯þW¶Ä—Eúl.Ml ײ¨òc~ñN-)EÓAws⥼%ˆæêÀëéàŸ^Ùš²Žÿòl)%ϼÀ•·^ç§§#1ùÄ,yšoG+áó. %j1>~œ7^û ÇâHÎÎ ] µ(ÖE<ùl ¿}ã8e2ÆPúÒóäA‰I%q°™+K_"ÖÇüÔ!>u/ :0Í6 %,ú7þõÇ5أ̤®ý#ž]«ú7¼^ÞŠâŠÇKï«Ï.Ã,ÖýÉÓaï)†ÌÇyqÛlý§ÿIy„Ž×˜É×þÐ~4,ÅÎÂu¥þègü²Ö‰cv JN²ë]äýù#ØQ°;9ôúÏéìaȲŽo¯ŒKÇógùŸÈù€Îp—›Ás?çgGL8–>ÇwÖ¦¢æ‚5¼û=›þˆ„/4-öÓPu÷ì§Y7'4D b]ÄSϵðÛÿ·…“`4ó7>OŽ ÓÔùÃíô€@Ç?x…ó­‰äΚÑè5ÖÙ…,ë«f÷ÎE# ÚÉ+Yª‘µd²ªdˆƒ‡v…ºoD8Y^:›ñ¶6¡Îf.F¦±2ÇqmZWÝgT¶úу#ô»5ìí&2*“Õ+s‰2MF2æ/¢£ê(ïíUBT«–&a@%iA) ªŽ³mg- *ެVO ¦ô:Zš/daâÕ3È0Írƒb’£§5úÚ; ©ä¶‡V°6«š#Ÿ–c0jMI¬YšÎíÖÏ«±äG|Î';Ú°D˜ˆË-eMÖØpÔæ æ:NrȰœìëX¬ÖQê|ÆÐˆ‡aÓÊÆ–qä-c™«Š]»›1)°ç°rr0|[+çQyðN`@Ñ4LŽÊòãPÈ/)¦ÿØ!>h2 ul™Å¡ÑÕìL),_ÞÏÁšr>2L¤/\zO)2Å ZÙw` QV ±$(cµùjfæ,)¡ïØQ>¸bÀÔ°fQv;]ùÃåODË—õóÙçå\2¨5 y+–¢áòÀµ¿š{uŒªN(Ч†'ì.R<^ßMWÊ»\ž»‘–)xi>ò)gâVóX^ô](øOúÎÁkÝ_çG73”é-ñÓ{¡–ž˜bòF¼õoñ÷;’øþ_?8Ãa/dž2-ÚÂw—݃¡æ„¸º‡†ÏvqêF£½¨Ñä®yˆùS—´¾ÂtNïáày× b…¸Â‡)›3Õ·8&&5ÓyÓó·nççoxÙü7ßøbë¢øÏi´…½Ÿ6‘¶v57ñÍ‘û†¯‹Ê}gˆ^¹–Âkƒöë -gÇpßZœp¿wâ¾b³M߆øxŽ4á8xà6n0ôaN¿÷ ö4ðtøI,º+‰âÎP¢ÈYý r¾ìtÜs ŽñÄ‚/;côªó/ìh²óÀ ,Áï ÍÃùªz‚s ÿ+èô_<¾snb畲\>'Ä=óh9B!„BÜ®™´HkœB!„à@!„B1F‚!„B! ÁB!„bŒB!„B@‚!„B!Ä nW°ýàìm|Šû^ÐzOòÎîú|f]!„Bü¾ºïƒÛQ¶ÕöÝà+£wƒFGÍ^¶ß›­ýç§Ñq|;ï¸Gù'„B!nÇ=ùN¦Ö}‚­µrãÁ=:BïJné 8T PW}œúA0ê”Ø\ÊJ²ˆUa¤¥Š5—Ðûø¨ÓˆbL¡tí|RÂ…4ÁN*v×áwšquk$gDáîìÀ•\ʦy±ø»ëØ_ÓÆ¨ªH+,¥4Õ‚B¶Ú}lìÇw¥œ^¨‰óxtQ*€æ¹Â±êz:|ôëØ2‹(›—ˆ9´‡ô\øœ.††u’ W²&3Šðßs Òsá(‡=(ðCaérm*hmìû¨ó\~×(®~Öüå¬AóáÝÔ%¬ç±\khý¾VÊw5\6‹–=Ìß´”ŒkÇG£çä*Œ+Ø”èn.V}FÇ€W †ÂË™ïP?]çªùüò(*¼†8Š—“¥‚¯™]Ÿt‘Ub¡áÔ†5¸yëY—ÁAÎUŸà¬[G úÑcrXµ$›¸ Ÿ”VTUU§9B!„â~pO‚T}ЃyÅjGÁ`ý§||¾‹yË’è?{ŒZæñÔƒi˜á|Å*.:Ù˜…eÖÖ»úÙXÂ׋âfÖÌ¡¨(/ÑÙ«)Pw±ß7—o.‰`Û±N\1h# ™‹×27Á„Ö]ÃÖãMä¥Ì#N1V´ŠâþÝtæ¯gíÄDáBÕqÒ׳)ÇŠ衺òC Ì‹´AÜ–e<üµ(´Îj¶o¤7c! á¬2L¤dÍrÒÌÐf/Ÿœï%gI"ª®¢èý G—òµ‚H´žZ¶k¢wÖB2çfrüóFzs êx.7ÒåÌe•=WD3#:itÓ4IF²•A19Ñ(€æÂPº–…ÞÓ{Ùy¾‹‚eÉÐ}†­\7‡AÇÓ\ɶã-¤–ÍÆl´£ž ºinxǵ‚¿ÎÀ¹cœŽXÄëã1á£åè^*.$²i®íZ0` „B!ÄýïÞ€HŠ5Td´ZÌúüèøèîq“ŒY°žb§²«-/ CØ5†cÅfU0MXMfƒcÀ‹_W±YMôÔU²C7`ºñ¥àÓ!lÕ¶ÞG[oéK-¡Å˜À’Õ ¡yA@u0+5 P¢¢±\x§ëÛ¯Déæø‘ƒœT èÃÃxc|ãóU)‰‘¡Ÿš-XCxuPsX`=ÀÙ®V% s¡ÉËœ%ÉD¨A⢇éthk9IuOÚº|úÝQÄÛð‚jK&3&tTmÑVƒ~ttÜ==¸\Aî¿2¶¿T<¸40cÀh0–“=!0ðÓÕ=€ÇSËÎÞ«‹)øŒt® ªjÀ ÁB!ÄWÂ= P”Iåï—žCSo³Š¢\keP&®Jë¦êðy´%ëy4Õ gx¿Â{Û m…ñòïäý¼1}à<ûOzX¸¡Œ¼(ÏÅý¼Û}ýoÔ­H±“ïäôÅV<ÆALÙ<âmÜa7rq Kž$–f ÒÜÖOÀCª% ¨ãÇ%”Škÿ˜R ÙXšòÅÖ «ùF{¡â,XÅ#YSî§Á H·"!„Bˆ¯ˆ/¹J7gB4=íxôÚÚ]8±×¦ª ÿ(Àº—¿…xG$ Az¯t0¤i ¿Òë³J)qn.·„~衪üµ·þš­îÅa'΢‚ææò•A4]Ÿ"dºžÑ™ËïEžî$1/“(@%ÆaÃ}¹‘ø42ÓmjbÐClØ\V°%:‰ìjáÒØˆKÞŽz*§y‰Ø„3)†ž–VÜ¡ƒB×¹Nv®[·uV1ËRM3Ø+!„Bñe»w-7¤7w)ÅÕÇÙ¾÷&‚ãŠY•m½Ö-Å–šE|ÅQÞÞiÆl²2§d ·Ó’˜Ÿ{ŠÏ>£Ýn!6=—Ó)ŽìàÁâd,D–Ê©ŸðN™ˆÈ–¯™O²j!¿¤˜þc‡ø É€Ô±eSæPCÝŠnšÅëç8à"ÖŬì<â×SÑâ`uÚ4 +6æfGRs6–MIãYh´Û w„EÔ(#ÉÁ“ÔÅa™¦Ú^/`]~5•ûörʨãWã(Z=Mä¨àÈ[Æ2W»v7cR`ÏaeöÄSJ£³®’ÏÍe<µÐñeG¢B!„bŠÇë»é‘ï].ÏÝH‹˜)}”Æ#hHYóoØßG!„BˆëØlQÓþæKn97Kë9Ë'Çšð; Ù)B!„¸s¤å@!„Bˆß3i9nàB!„B@‚!„B!Ä „B!„€B!„Bˆ1!„B! „B!„cþ?Ò0´_¾ÇA®IEND®B`‚82-1.11.0-03-template_usage.png000066400000000000000000001366341516513262500334450ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/82_changelog/v1.11.0‰PNG  IHDR:‰s˜\Û€IDATx^ìç·÷¶Ÿÿ1ØôNB¡÷Þ“Zhß@èB'zï½÷Þ!@~oÎ3—l-²vÖ^Wìå~q}ìÕh$F³sn#íÿû÷¿ÿ3Q³Ü|þF!„Bñù±‘.ªOÜÉB!„BˆºEB§ˆ;Y!„BQ·HèÔq' !„B!ê Z îd!„B!DÝ"¡S Ä,„B!„¨[$tj¸“…B!„u‹„N-w²B!„¢n‘ЩâNB!„BÔ-:µ@ÜÉB!„BˆºEB§ˆ;Y!„BQ·HèÔq' !„B!ê Z îd!„¨¯\øÐN_»mç¼´)Ç…Bˆ†J Oöèì&›1¢·}Û²‰7iaí{³_ןµ‡ã¼5̇k¶¼kÙcž{“rü wróä¼ÍìQlß|óM)¬QQkÞ¾§õŸ¶Övß~}NM’Ô?¯okkÑm¶mrü+àò–1Ö8é÷–“÷ÚÕèØÕÝ“­E£o¬ñ˜v%ù|ãòFܾ¹};q—y–]–(ŸW×X߯~¬G4îg /¿²³;¦ZÇæímàškv=¥ŒlžÛ†±M“禣M=ô2åxIž¿&·²FÚÙĽ/RŽ7`ž>°}çÚ°ï;XÓF\_6jÔÄÚônS×·ÓORÎB!5 tþ³ç§æY÷&‰±]ÜÆzgÆ·ïÛ5v/Î´gŸâsj£»[+j?Íö½ü/ûø îäÇ F­­û°q6rÜx9f¤õéÜŠ£¥IϹö÷ý”ójŠÇ'ì×.IŸ·›lïÖ²¨ª§TFè\?·Ìz7md-†n´“y —¶{Vg+ú¦‰ Ûò,åø×…:šw³~cÇ—ŒwÏø?lóíWvjÃȤϛZ¯Å$t*àÆý³öLjŽVœ|W4nÛËMšiÓçγ©“GZöM’ë-¶6Û®Úž0B!j™ê O/lûèfÉ˱•ØòÐÞ•¦¿ºß&u(²FMÚê{U ÿÙÛŸRÒ³yÿþ=W•:j‡¸“k/tŠûÚ‚K¯>§?¾dÿëß<¹M­ÿÚÛ)a(¯íú“ 5¸ñø‰]|ôõB•:¤]ðØ.ç=K^SB§æî÷—Ä ¢ÎsmwÎ>|e—ï>ÉSäÀW*tžÝ´•£Ú'×ÔÂzLßiGFÇݰMsúYËDµ°Ò=N)C!„h Ԁйo«4¶oŠºØÜs‚cÿÚ…­ólÖìE¶óV©`ywÇv/m½Ú7·&MZY§~ÓlÕÙö¾´œU”Óx€ÍX<Áz¶ibÍ'ÿm;'ah´·_޾/-÷?{°y¸5iTlÝ^LÄЛÝ1TÍ'Û?ïKëþðÈ-™h}¾keM7³6݆ڌm×ìEàYzûð¨-™ØÇ:¶hbMZ|k?Œ_j‡~̾¾*wr“Kè$†í¹uÜÞzê»öìº-ü‰>íg“æµ®­›X³q—æ®Øº9#­[»fÖ¸qKû¶Ïd[pøA"ŽÛºq-q7~7²_ÛéµC¬qÒçæœJŒç£6õۤϛM°õÞzöÄö­ÿÍúumcM7µ–]Ú¤uçíŒ'gí·nÅÖ¨ÕdÛXjX]?9ߺ[çßO—§ÏmóäÖÖ¨¸«M?žËð¬?TFè\?³Øz'Ÿo( ]KîÓÑÕ6ö§ÎÖ²q±5nÑÁzŽ\`.?OÄêA›Ð¶$”ÈSÔs‘|Êy/íÔÞ%6²ÏwÖ¢qkÚº«õ™²Êþö3ïi÷{ìFûsHbÐ7jkãvûûùÒö/虩bë¾ _È—£b¡óÚάœÜbëùÇ¥Ìõ\¿ºßæŒýÁÚ7ob›'}<úÛ|Õ­¡óìý½t¼õhŸ<MÛY÷1‹lú°’g!#t_³ ÉsÓ=ÉS\ÜÔZu`ãWŸ²óyyê¾4ɸÛ6ÁZóÿrÐÎålóÛ=¯wòÛܬ½•2a"„B4 ª/tþûh÷raÍ{Nµ5'î—>=²íã:XQò’mÛ{´Mš<̺µh”¿Ãm/tˆ/jeû ´aKNÛã&XËFEÖé÷³öÆ•õÊvMh‘äéjsÏ'Â$Kè¼³S z%/é"kÕk”Mš:Ö~hW쌕±»;Qõþùa›Þ…кVÖ}ød›4ª—µ*jdÍú,³‹ÿ¦´½’Ä\ã”#tN®`ÅßY»_Øuoøº>mi{÷· Ž&é·Ü¬.÷¢uÏ‘6jÜ`ëÔ<¹-‡ØŸ—_%ulb¨Ù·3ŽÙ5Wî#[3¦yRF—Dp&Fa–Ðya‡– LÎid;ôµaÆÙ io#·ÝK ¥ç¶uZûDÄt³ßN`T¾²#þ˜Ú‰ñúý;„Ÿ\Ӭ䚵ýÙ¶4€YäêW7Ù VŒýÞ6jÖB›>±¯µNÆ_q—Ù¶óÁMÛºz©Mé—ˆ¾Äpï:a‰-Üt21¤_ÛÅý³­Kãä¼ݬÿø)6â§ïÜúЦ?,²½Þ|:eî÷;µa„Ë×6¿ÎÃôôŠÍûñó½Í9Sÿ=>U:7n﵉xÆ[Z—!lÔ°žÖ2é㦽Û>7¾b¡óÚŽ¯æ<Zv³~cÆÚÀž­“g$›¡óÌþžÕ-Ikbßžn3æÏ´A]‘-màºõ_<»kˇ&ím=ÖÖT–öà€MìPdÅ}–ÛQ'²…Bˆ†G „·7móÔÖ܉àùn€Múc»züÙÃóúôïö†F¿vÅ ’ÿìÁöщA˜s /Ù[/tu°‰{ž|{ùOŒÂâž‹í‡$íÝQû¹]#+ê2ßNó9:ïŸn·Í9>ÇŽ—nNðööëß$1Âû¯µ›Ÿ>Ù•¥½aVlÝæžµ®ž×và—¥ž£wÙ×WIâN®q҄γçvîôÓQׯFnd7¼á›ôéÈ­·33ÝWδɽhÒg‰tFßk;½adrÿðØœ¶kwwØð–Iv_`{1,í·qm“Ïæ”š‘йqw—l8Ü–^)iÏõ ˬwb”ÿ´ÂŽ%ÆýÅ-c­Yb þ´úvÒ®Ûöç@„PrNã¶èêëÄ0Ýh“üÍFm³ 9gšë%B'eq|@.¡Ã¹x$»Ì;[rOž=´¿õ·Þ}ÇØg0ºSBמ]KîeÒgEmÊþ'%Fub¸®ÛÎ…! Ùt7çý¾q{‹ á™øö7ÛÎýº²Úú$}™)×WŸÈ½Fg¢ÍÜ\w–ÐyeörB¾óÌcvÙ•óØþšÌ3î=•‘Ð)Úßw·_—öù“«¶°B¦Tè<9çž»FMÇØêÒ5p×O¯´a}ûÚ3÷ÚÅú>n´‰ÉsÜxØ_åxs<ÏlÃø–É3>ÎÖÅámB!D¡f„ŽãƒÝ?·Óþ˜6È:·HŒ`vkù£Í:ø8-íÒ’ï­81D~\|ÖnÝ`·n[b}1‡üe÷?~][}?Xoóé¥íä…›õ+n²·gçYç¢"ë<÷\‰‡':¯ÿìfeÛÍ8^ꢌW‰ArÌŸ¾mÏ>>¶õƒKBíf¼çÚWC¿ibõZrÝÞf][åˆ;¹ÆÉÚu- Çm³ã’ ”iáe?ƒûÒö/, [ê9ÿ˜»|ÃŽ';ò‡}ŸÜ‹âëìÔÓ‡¶ft‹¤Ï´y’¾;<Û:&}ÞqæñO$t®íŸníØaðJÛ_ZÞñK{mj—Ä(l6ÖJ7®­³ŸãºÅ„=vùöVÒ¬±õœ<ź7µAïÛÕ½?[›F­ÏІ*ã=:¿h#ÇO´Q#ûwJ„tn¡sýô֡ѶŸMZ²Í¶ž¾cWÊžÙBçÆ-6¨ ~žýx5®î¡ß’~¸×®¦Þï7NH­l rïºÖØz/½–-t!½Ø…Óv¶I»®•ŒÇ„C+†•†¼®WVèܸ½É í¢®aÿFktž=H„eëäs3ë2j¾ý¹ó„»[ÿÃ,3<Þm#›6²æ÷dy!?óÜ­l}úüh]Ú2ÑÒ:~ß×Í;Ô@Âó„BˆÏÔ ÐùÌû·÷íÈêqÖ‰0›Öãlç³íø¬‰ø‰ •ŠXfW?ä:ÿýgOÿgÍ~ð¦‰`êmÅElΙRoQ$tžïcMX{ðÇ•tÁòáº-îC$|“ósΤŸW âN®qÒv]?ÙÆÏüÃþÜs¥d] ùR ß¶ïUÖµ—PÔk±zúÚÎoSê¹aûô²¢ÄHžv¸tB$t®n›Ùe9±%7“ºŸ^°Ù=‹C}®mß>ÙZ÷´Y'NÙŒnÅÖbÜNÛý¿ï­(I›}ºaŽÕ ]Ø<¶k¡ íáC£Š¬Yça6}ǵҲR„Îå•öCbìÿ´ÒŽçõS ­ eÛlRï7¼¶ ÛÆ[KNÄÆ×U©tèÚ“ 6«gîg¼ýoG³…Îå)ý›½Á;§íÏ©ý­}"x†5ng½&®¶Ýw*«$Ïí”ä¹-°ÖN•'Z_±e#m¥¿YÓïçÙŽ¯twE!„ ›j ÷÷ÚïcFÛèÙ{ìv¸6çÓ Û:²Ibĵuá`çþ×ÍŠ5¶çüm{,þÓwìE.u<ßmcZ4²æ£–Øÿ’oÿë‘Ï}¼FçVéöãmí _Ïk»tz¿íÈìr•Ô»cbÉboB >äÊ»º÷kWTdEEI{Æþ]ÿÅRª.t^Ú®Ù=­Uën6e¯ßí…mÆZ›Ö6nõKÛ3§«:ƒ7=*Éã×è$Æû´ÃOKÓØú ¬;inƒ6ktÒ„Îó§‰Ñޮēר‰ý°ìzƒ„J Ä<ýÇïê,8[ºF'áÉ-Û¹ç\éZšhN©Ç‘5:¿-½//Û|ú¼Tèܸ¾É†¶omm†¬Íx}JÖ;}“Ç’µhÙm«_\>4Ë:'ãvÈš ·Ž¾qëŒí¾ð<+]!„h(T_èü÷ÑnncŠùÁжÖsÈ8›4y¬ èÜÜ­Ói>`µ]q›ܵ#Ú?F׺÷h›:cºÔÉš'ÆH¿5wì]yBç¿ÿìñÎ1%›$†ÉŒ“ÿ~>–µëÚ[;1¿‡Ûu­uï16í׉ÖßíÖÖFn{X²ëÚ“}6©#‹ö[Z×aSí×é“mh÷VV”9óÏeW‘¸“kœj Yÿ9”µÅÖ²ç;ígÞ¼šZï¥WJ×m¼¶s›FY3×çßÚ¤ýÁ“µëÚ3Û÷¿¾IÞFÖ¸ý6tÊ/6väÖŽ59Ã7ÛioÞÜh›4r!wcv•ëöؘ֤5±þkYXžrõª 7våØ÷»Emûب™ mæŒÑÖ…]ïÚŒ³5·¸O¯íäªÖ˜uOßõ·¡¿üå /ì›QÚ²‡ šô³عd×µïÚ?,Ïu¿}›À%Üj€ý‘r¼¾Ry¡“œsc—ú–g¼…u<É&L`ý»¶Lžñn6ý(c9{×µSGY«¤?‹’þ0vœ p¡…s¿Fç¶­ mn†þb¿-˜kã~b'É&Ö}á¹±Þ ¯Îö™=Ý÷c›þsmý¹Ò-¯íò¥½¶híQ­ÇBQÔ€ÐvÿôF›=¶¯unSúûúØè¹;ìÂË@´¼¹a;ç¶ï¿maMŠ[‹ïúÚÄÇíB¨\¡“ˆ“g;mÆ`‡™vÔ‡­A–Ð!í¡øs‚ýбeRO3kÓc¸ÍÞq½Ì¶×¯ï²EúZ§VM’ö6·‰(Z°ï®½Êº¶ÊwrS]¡.ØêY#­{‡æÖ8¹Í;þh#´S!yãöfÜ,éóö¿Ú¶pö7KèP×CÛ³æWëß­5å·aZu¶>SVÛîpÛÒm5c«}Ìbx­ˆââlî¹r®¥žQ¡Sò{8–þN±5mg]ϰå§?7î´£zZ«¦M¬yïÅ%»ß%çܳØFþXr^“Öí‡IËm'k 8¯¼û w·Ú¦‰°ÆN6 C¶*B‡ô«—÷ج1?Ú·-›$§™µë9ʦo¿Zú#®±ÐyãÆðîeƒßÑùÓMï™™`Îýó¶|úPëÒ¶iRf÷6òûídj»ê)OoÛ~´×ÔÚöøÉ~<Ä~ìù­5#­¸“MÚ÷$û¢Ì1î ž5ŽáÙ¹pùJÖùB!„B4d¾¨Ð¹ûð‘ý2}ºuèÐÁŠ‹‹­}û6õçŸíöýeò…^ˆë·nÛÄI“¬u›6Ö¤Iû¾woûgÿ{ûᣭXµÊå%½k×®¶xÉ—îË™>cF¦œí;w¹rZ¶jeÍš5sž§#Ç—©·<¡sëÞ}ûõ·ß¬[÷îÖ´iSW‚âØÉ“™ïOøôi&ýÌù ™ô~ü1“^S÷fמ2åàeÚ°é/ëÙ«—ËOyÓ~ùÅž½|eW®ßpž)ú»EË–6xÈP»xåª+ƒãô_¦=·ïdÊ÷ñ“;Ç;}î|VŸ!„BˆÂá‹ KW¯Y«Ö­3ùB0l¯Ý¼•ÉÓÍ[´ÈÊwbpbðÆé€AïË {ïшË9|ìX&.¡ƒ ÂÏ÷lÛ±ÓåËGèT¦ÆO˜9VQ`EBç䙳™ãmڶͬթŽÐ©Î½ …NZ9ðS¿~©Çš7ïÞsåp­>}í† ™ò6>±¨µIB!„…Í:Ìäw ä^ßo³fϱûôɤ 80“?4¦Ù5lý¦Mnƃ54xY‡‚§æ·™33iì4öòí;WN(t0Ž/Yj›·n+ÓÞ.]ºdŒà\B‡<>ºvþ½ÛæÎ_IC¸pˆ˜‡—i#Ÿ½ç¨²ý°|åÊL:m‹û5¤"¡óôÅË2ízüì¹K¯ŽÐ©Î½ …üüë¯.?‚.LGüqí›6o±N:eÒÿ·h±+ç¯-[3i#Gδ“{íÓcïœB!„(<¾ˆÐÙ³oæ8áM>„ íùУИCŽ0¨}:"!œ¥ïܹs悃´Pè,[±"“c;4ð}iB‡:ðØlݾÃý ëäZâ:Á§OƒÊö=q¢Lx\.*:Ô¶ëFiÕ:Õ¹7¡Ð:lx™v†m¢Ïü1„O'œ4›÷Ö’øæß.oÏ›Oÿ !„Bˆ†Í:á¬>ë1XÛáa­Š?†§„üñ:_ÎþCŸ½%áì}܆§Ï¸´Pè Âüa½>ä)Mèxî?~bK–-³á#F:ÿGϞΰŽëŸa•í‡Êð%„NuîM(tXçæEßùK—3éÇOʤ<$µ|ò°vÇ‹pµ°ŒÊ ÊöCe¨Hè„;ÂåÚ^úÁ“'™ô†$t ïO?¹tÿ[¶£ökv„B!DaóE„N¸ˆœß„ =,ÈÇ£rïÑãLZMÓ¡Ð CÑ={Vf}ÿÍ4¡® Á[àË`C®%®¼w^¼y›I¯l?@MlFÀÎh¾Mü Å¿qãÏ£.ŸîfÖ„ÎÊÕ«3Ç<¡ B!„…Í:̪‡[4³3Þ „ˆOçÇ"ýÖÃ5eL‡BØÝ‹íœÃmЩח‘&t#áoð° 2F5ç…e‡b$ô’ðä\+B¦²ýPÕí¥ùRŒ|~‡'2@È^x^ø[=„´ñ£¨ìhе† tøAWÌ׆y„B!DáòE„°­°)Jƒß¯©)c::i?øY\\ì~HÓ—‘&t üÍœP ìÞ»/“?Xðúý¿•þ`h.æÎ›Ÿõ٧ΞKý1ÕP¬5¡ávßxì^½{Ÿ•G!„B&_Lèk@æü>×y/-[µrçbô†ùjʘ^˜³f9¯?ÊúšpKhÈ%t£Ýˆ#ÂÎþXü§Û"Úç=%„«Ížó»ûM~$³{™ßÌ|ûBl†pöÂÅ2ÇbÒ„u󣞈¤s/eãáMYãâÛ‚7èÚÍ[™rŠÐa£œ, !„BˆÂ¥V„N}¥¼ÍDá±yë¶ÌýÞ¹{OÖq!„BQ¸H舂„mÀûôíëî5ž©¯ßdåB!„…‹„Ž(( äGAÃp·ÉS§fåB!„…„Ž((ØäÁßcïÍa}QœO!„B6:¢ `Ën6‡`ƒ B×Â]ô„B!Ä×ÃW%t„B!„_:B!„Bˆ‚CBG!„BQpHè!„B! Žj ÇÏ_ !„B!D½¢ÚBG!„B!ê:B!„Bˆ‚CBG!„BQpHè!„B!  !„B!DÁ!¡#„B!„(8$t„B!„‡„ŽB!„¢àÐB!„B:B!„Bˆ‚CBG!„BQpHèT‚wŸþËJB!„BÔ?jDè¼O¸ûü]}ø2'÷ž¿uùÈÿêß™ÿÏÞük w^´¡²™[Îf¯mž¾ý×V¼fKö\ʰòÀU;uóiV^!„B!D ço?Øo±aKÛèGs2rùQ»òॽýÔ†'y§o:mÏ>.o÷ù{6hÑAûãï‹YÇ<ï=wy&¯=‘u¬²œ¸ñÄ•õðå{÷y÷¹»6uýI{ÿésžû¯Ú¨¤ýÇ®=¶ë^e•QÛì<}ǵ1åû¯”ike¸ÿâ+cã‘YÇr1mÃ)[¾ïJVzeóÔŒ‘°/F,;âÆ"÷)Î[î&"òÏÜ–°B!„h(T[è¬?|Ãæm¿`¯?|Ê:s- §o=³q+;Ãqêºöúß²çy¡3dñ!çɈˀ¥{/ךÐ9ç™m8\ÖðŸ´æ¸»ÎøÜºbëÉÛ®›ŽÝ²‡¯ÞÛŒÍgÊŠ}U;ÛJË»òXÞayùˆ˜Šòpÿ~Ùx*+½² t&¬>î<[pô꣌øaœÅù«JM/*å…B!„¨ª-t~ßvÞ\|•ƒ'dÎÖsξ|ÿ…)“Öœpala>„Îð¥‡mÄÒ#ö÷Ù»Yå¼|ÿÑy„Ƭ8V+B'‘ËŽ8±§×^èxCÛ ½êŠ)Iÿ-ØqÁÀ‹§Q‘ˆÉ'OM ê Óèƒ «Ž9OWœ¿ªHè!„B4<ª-tæl;g/=ÌJ¹õäµÍÝ~Þ–%Æ/ÆöÍ$íÉ›l BgD"t›ºîdÖñý¸µ2¬Y‰…ÎÕ/mÖ–³™0ºÕ‡®Ù«÷e…aMœGòn9Q""¼ÐÁk¹ü.1þcAqæösŸÒî¹T¦ÜÕI{8/_ÏHeðB‡~AX^œÂVY±Ãº)ιtï…K÷f Âï¾ä„'Â’¾š¶þd“O÷ìŽò?ˆøzj‚’k‰B.ò;\„¼ÛOÝv×õ…yæ%÷þaÝÒñ¤¿è[_GeòxÞ|(éÏÿíºà ÿã¡ãØKÜy´‹°³¿Žßr‚®yÒˆ…ŽLñ:!/lsm,€Ða—ß¡É}¢Ÿƒóùðöà½Ã˽ÅóB¹›—ŒBêðèîÆŽ~¡X/d–üS²6 ¯LxÜ{Üž¾ù׉h!p¾ !„Bˆº¥Ö„ÎÌÍgáɺÖ=àyôê½3^ã¼!^èÒôäÍ{g´²ŽÃ{!ül=‹Í½Ðáç`pÆåaPã) ¼Œ¦xÝGU…ÎNDØÒ#NQG]ìÊÆú¢|ÅÛyÇç{ýãøËwœH¼'”MŸ“‚ >71ùäI#:.Ú ÂIEKH®5:KAÂzÿÃÚúPJDa^„aüV$î7Cú‡c^肈P¸°>ʉûßãûABG!„¢n©5¡ƒÊ.kˆþgãÖO`@ÆyC2B§ÔÈÄøœ½õ¬$„ù$ È2Dt„†«'ôè°2ëkÂãU:,B§=»Ï•´A×]ä#v8îÃêbØœ¡¼08ÖÚoÆ[SvÝN(bòÉ“F,t¼G'ô0A>4¡ÃÚÎCöÆ}b P˜‡{œ6^¸úÿ-'/tü´ò¸‰¢—>¿öð• c yP:®$t„B!ê–j Öà°ZœîÖì;é<;,Æ& ‘ÿFML,tXãÀgBÅØXÀç‹…NÉ÷²ëoüð2kt’6…yC"Oe… äðhà=ðÔå‰òDà!/ßYÄEïf©ø`¿?á€gÄ‹˜|ò¤‡-^£CŸ³Ó^˜ *Z£“&tÇl´Àÿ„“ÑFD™?~/xf¼Ða\Æ?P‹‡ ±ÃÿñfB%½ˆ¡ïÂãï:yüš!„BQ»T[è fn9댺p}B ðû&ýj},tÜBõÄh êXè°Î£˜ß…aÖœ|ŒgĈ_;Ã:f÷<쌵ëLù»®yr ¿SXì%ª ÒÄNE"‹ˆ½8ü¢|BF_bÐûÄÜÖÖ‹ÊOž ^%Ä¢ƒ4Ä2u#„Ùù ï×o,‚8a756§€“7ž:±D9ìœæó±6Ñš"ÂYçE}¸¡_³´.^èìü{·[¶m·!C‡¹~ؽw_Vþ†Êåk×Ë<\U˜†AŸW—TEè¤=/ÕÅ Ú³÷ÀAûgÿ[¹zµkÂ?Îÿ%øRB'­¿+ú~z÷ñ“MŸ1ÃΜ¿u¬Ð9|ì˜ý>w^Vzyä#tøîfŒ>{ù*ëØ—&mŒÄÔçö !DMRm¡3løë?`@Vz>B§>ö’¨È¨ }9ƒiÓæ-.mü„ ®®×ïÿ-“wÜøñÖ¡C‡JÍJ†¼ýð1+­.@è<õÚ ·ïd/tž<Q&ûмyó^õ ¼u¡'¯>Pß„N,tÿÚ²Õ¥ßyð0뜺¦! Q9$t„¢p¨s¡³aÓ_6bä(kÚ´©3¼‘‡Žuywòi„téÒÅš5kf={õÊ2~BÒÎ?xäˆ{iq~§Nlñ’%©†.[·ïpÇ0$fÍžãŒB«0ù?,‡YSÊFpmƒ‡ ÍiÜBçô¹ó®f¬}Þ°8ïÉ3g!óêÝû¼êâEÝ÷§ŸlƬY®½„È!6&OZ¦Ü5ë×[ãÆIë;D)/LŒòÎ;Û’eË*uÍmÚ¶u©ûé‹—eêöä:xñz¬XµÊ}ö÷'#¬iùʕëÙ¾s—«“vÓŸGŽ·§Ïd®¥k·ne«r×éÇsØòŒ;¶LZ¹„NE}Šè8h-øßnÓÀsÎ÷eßý·ï?pǽÐY¿i“+— ®ëâ8×Þ‡©?ÿœÕ^Þ; ¯ûÏ¥Kݹáuó]18y.ýg®…ïž7®sÙŠeúº¼1SÞ )¯ýYú‹±—)„õ•::¼\/YêŒ{Öb4jÔ(óbŠmDÇ1dyqðåÎç§Og•Ÿv>1–9óyi`ó‰ÏÅ |Ñó?€c¼\(gÒäÉ®Ýó,tõ„Fýæ^´¼Ä1¤xQb\a¸Æu/&^`þ/i¼”(wÎïs3u§QQ]¼¨)‡—(í%| ‘‚¾d'/XÄÿÇ}ÇZ!úŠ—F*/<ê\øÇ¢¼Ûá=Soþýu ž\Bº%¢aì¸qîÿ|…y¸‡ä?wñ’ u¢´ áÂ$Æã1Uóȃ±åÛrãÎ]W†_|-1¹„NE}ŠÁGœ{=1¢¸7­Z·v÷–¶\¼rյ߇úrý˜@è`|í?tØ­Y±QHßcÌVxüÔ)›=çw÷†WÞóB~žSò#Œ¨›óèŸøzÓð÷zçî=®Bú0€‘|·øçåÂå+®ÜßfÎtíC\aœadû²*ú¡|Ä}L}½ôghüq.íázº–”QžÐñÞ'òÒ<7œÃwŸÏÃ÷JIÚw/yþù‹gßÎ\ý]Ñ÷S,tx1àûôíëÚF½”Žå\0Þ(‹ ŸF½Üþç^uíÚÕõ'å2ÈŒµ‡OŸºàzÙ¬ÅÎ'ô æ½´‡~éýÃNˆ’æŸwDŸ™@@¼‡e0ˆpñŸó3ic$&n¾cV!u.tâ¾DýbüØØÆàãåÀÌ’‹(ø|ÎÁ`á%‰A”“ö’àåÇÀsüï_”FÔáÁ¸ = ùB9Ìòõúþ{W.íñ/ó|êÊcN9ÌÖñ?³ßô½щû〗\x>¡LÜGT>íȇÚ:á' 'ÒBÊ~̘Vç<®ú1–ùL[CoBy¤ |ú”±LXbxžÇaš¿ŸWoÜtŸÓÆFy¼ØB®áÀy>l‹üa»ãç…ñCDTx xHúõï_¦þ\ø{–þ„F"b-’†ô }Dˆ³èœëŸõоC˜L Ì°­ˆ;ÊÀ“ç'âï­òÖèÐ&Îa!|˜îûÍ犾WÒˆû;Ÿrb¡Ãg<:”ƒhO›õ/®£aÅ÷*eûÝ1Êê×/ëî‘U:U÷ñ˜þöÛoÇ<<‘Ç9qèZ\ïÿ9 ipâœÿÙñŽïs6!¾ U(Pñ¢Gÿò¼ñý¾O+º×6Fbâöç;f…¢¡Q/„Ž÷òÄÆ6OÍŒÆ /gf“ÃCHÚù¬ƒaVŒzðFð’.ïå”ö’Èõr\öƒáG½i¤ÅoW¿íó€ó®+íE ¼xyÑó?×éàì; þgv6.ÓO;ò¡<¡CŒ_ïRBÇ~U=ü8 ý´%_oVšÐɧO+kðùg!ט ÍÞC…~ „†#³ôÌÞ—'t¸?qÛ=¹„AL®5:^tøug¼-<ç´ÏyB#º¼ï¾«âvz¨¯ÿʶ¥<¡ƒ@âœð{¼° ×Ö”÷½’FÜßù”“6n™8a»n¿0à(|GÇõ¥áŸ ¾›ðÒaÀûcˆÙð{ÅC>úžÿëBèäòRr­þû“¯ÐáYñŸc¡†ŒK¼0¬/Â+Ì8dC ¼'ázîícr/çb—ÐŒ™´1·?ß1+„ z/t<Ìró‚äe“Ë/ï|f™-C4”·X<í%QÑËÅÏöñÛ/D!þåYxK˜i ã·=¼øx9â}ɧ®´5pœþá\ ¼:þXÜwi|Ú‘¹„e„"†°òñBó}i¡Chm`ûcB¦Â2Ê#MèäÓ§U5øÒÆ!wäIóèp?sÄí‡çp¼<¡ãû™ëø¸‡aY¹È%t'ôµ÷na<Ç»ú{Ñž´ïžcú%n+Ð~Ó‰0Ì Ê:ÞÀÇj<;^Ñ÷JqçSNÚ¸õàEdà…¡œ|Ç/kpè¿`Þ§3©”æ¹ =:Þsù%„=„¼…çÔ–Ða\ƳÀ$›ßbŸ²ñ4Òw¡€pá†ð®».„N¾cV!õZè°F$ž}‹ã‘Câó1FbQË/ŒµŽa–-œ¡„Š^.þ%_[Ú"Õ\ø—¢ß „ºyÉ"tò©+íEí¡ÿˆ×’Ä}G;µ ÀËÑÇ·çÓŽ|H:ô!`´Ñ/`æ/ùÂ=$ cüK úvBß^iB'Ÿ>­ªÁǘÀ8 E!wäñaG¡Qèû;\Ç"f„XØîøya‚/~^Øu/_#:—ÐñƘ_ÃÄoÃÄBÏy¼]Ñwß=„¼ùqæñ}N9ô Þð8÷!—Ðñç°\˜Ž@ã>…ktâ~ŠÖ˜¸¿ó)'·x¸ØèƒÉŸß¼fqi,úsI&”1\Çå…d8ÙÁ½§}ýÚ°p›pîuü¼…TuÜÇBo'„ëýZÎÊv'ãœò„Ž/‹çO¨¯¯#ås¾ßÉ hùýgî›ß€Ã§Ut¯!mŒÄÄíÏwÌ !DC£^ fÞüTÄ‚³nC ƒ;.?í|¿ œ™GfªxÁ#râY³¾ØÙÚ“ß%*Ÿ— 3™¼Ì˜­dG'ÚLÛã²òð»U®€AO}À5‡‹¡+ª+íEíÁ;DŸÄkIâ¾c7^ìÔK¹¬KaV2쇊ڑ^èà]¢ ô;‹x¹æx÷²ÌîXI?1ÊgÎý’BO¤Ç³þå‘&t ¢>­ªÁǘð÷8|®rÙ6ן…Œ!žÄíAT0>Ã5iÏ cŒ±ÃXá¹e73²÷Ä’Ãw„X1^èÐ?\ Ê}âYô[•ûÀ0ìlMûHó\Eß!ä£\Öé0ÞØ½…çˆ5oÜqåRÏ$›™ð9—Ð/"Ù ˜q0 OþXüg&O>ß+1iý]Q9ñ¸%lgyè°áî;’¶ðèp=^ ’߯=KÃï0O† žxFRÜ¿s ãÊ‹Ç{»ñJýô'¡„Œùøy ©ê¸Ç4åsïÕã;ÇybÆ9•:>Ô‹û‘«ÍàwÒ Œì~­Ž‡{ÈØä}È÷?÷„¶†Þ™Šî5¤‘˜´öç3fÙá0ôà !D}§^ ^ºlÍ‹“|¬ÙÀ`‰ËöÄç/Z^;j)áodÄ`ð’#?ˆ´|^.ÌdcaÒV §Ðû/„®!txñÓfæ³ Ã<*ª+íEíáúxy†¿#i}‡DßQ†*/ûp&´¢väƒ:@»0Jð&¾ç¥mŒ-^â§ßl_Zè L —ÊE.¡SQŸVÕàcLp/1üðÒ‡ôsøƒ¬±QˆáÇ8ÇÄÆhC(…Þ´çèf£1Üxî0¨ü6ãˆhž©´0MHÛuþàâ°HÆmó׃XÁ€ô;Yåó‚g5ˆ®gxßñÑ~ú†ã´c°<¡ˆ)ß„)!˜BïS>ß+1iý]Q9iã–þá8ß3Œ] ÿ›/x)ÉÞÏ4¨7Üσ û“ï³xý‡¾aãÒOÀä U÷ñ˜÷ƒºòœã½ziߟ±Ðá{kdÜáY ó†øþd ðL0†Â¼ô;eÑ^î ÷QA[ü÷nE÷ÒÆHL®öW4fœåÝBˆúL !¾6˜™æ÷oâôúDšñ&Dx¾˜t·ˆŽaóò jâcõ8ÜŒP²pKr!„…ƒ„ŽU„ÙcÂ"™é =aõ ‘/Œé\³ö<{xÈâßsiàáÇL˜;â©Á«Áï«Åy…B4|$t„¨",t'Ì„XøøX}CBGä aM¹Â0 g%äkÈÐa r:aX„;²¾Ï…2vëæÂïÂ\!„…ƒ„ŽB!„¢àÐB!„B:B!„Bˆ‚CBG!„BQpHè!„B!  !„B!DÁ!¡#„B!„(8$t„B!„‡„ŽB!„¢àÐB!„B:B!„Bˆ‚CBG!„BQpHè!„B!  !„B!DÁ!¡#„B!„(8$t„B!„‡„ŽB!„¢àÐB!„B:B!„Bˆ‚CBG!„BQpHè!„B!  !„B!DÁ!¡#„B!„(8$t„B!„‡„Ž¢Fy÷ñSVšB!D]#¡#„¨6ï?ýg¿ÏgÍ[´°ââb{ùö]V!„Bˆºä«:b6ýe={õ²&MšXËV­lÜøñvó¼¢v¸úð¥ÍÝ~ÞF,=b#–qÿ_}ð²LžýØ EíÕ¿³Î÷¿þÄÆ¯:fÏß~È:V›¬Z³Æº÷èáÆR|,íÚµ·¹ód¥W„DÇŽmÛŽYÇ*“§¦Ø¾s—}óÍ7¶bÕ*;rüxÖñúÂÆ¿6»v¾xó6똧*÷¹¾Ó÷§ŸÜ÷]œ.„B2_Ða¶¹¨¨ÈfÏùÝö8h›6o±nݺYûöìÙËWYùkšÍ[·9«.ꪜ¿ó̆þyÈfo=k/=tÌÙzÎ¥]¸û<“/¡sãñk[yઽùPs!R´‡z_¾Ë-ž;æÆQœ^µ%t›>c†9!“Ö¡C›óûÜróÔÓ~ùÅz}ÿ}Vú—„I ž9žwŸ–ЩÊ}މïÅ—¦*B§¾]ƒBQY¾ ¡sîâ%gÜ,_¹²LúýÇO¬Y³f9 Ñ·rÛ•åk:o?þgãV³9ÛÎÙ»`–œÿI›°ê˜ËCZ>B§6ÈGèT…Ú:¹Æå—4LGc ÊJ÷à©kIU…NMð%ïE:B!¾F¾ ¡ƒ§yóæ©ÆÍ¤)SlÐà!îo­Û¸Ñ…üŒŸ0Á¥33¾xÉ÷âoÚ´© 2ÔnܾS¦Ââwáx§NlÙŠîEË–®\ÏÔŸΜwñÊUW?ç}ûí·î¼¸!ÇNž´þ¸µÑ?ÿúk¹âiâ¤I®ü?—.uí§FŒåD^˜ïïöZž=]Xá}vé/^¿qk.ð€ù¼'NŸq×qþÒåLÚšõëh|ýþ߬6œ¹ýÔ‰ˆÐsãÁÓñsÉ_>{¡sôê#›ºî„óøüºét™7Ž‘çé›ÏuÝ|üÚæl=o×vam;O—½?¯Þ´U®ÙèG]ØÜïÛÎÛí§oܱ‘ÉgÊó,ßw%«0áÿ¬u›6™Ïùô-÷hÖì96sÖl.ÉùüЕЯõ`¨Î˜5Ë•Áø¤ŸýX]½n]™ñ·ï?(“‡r®ßºí>3Vìîõwß}WæÞ÷µOß¾Ö¸qcëÚµ«íÙ·ßåݺ}GVŸø:B¼°ãÚ™>݆îοrý†KÇÃÄ&þømæL7Î|™䈦ÿûÃ=K䣟oÝ»ïÚγÉX£ _f Â+l×IºÆßß÷îíÊæï©³ç2çÆ÷gëÒ¥‹«—çc÷Þ}YuB®{Á±'Ï_Øä©SÝ÷÷/XxÝÔÉX™0q¢µiÛÖ=ãäáùfÌ´jÝÚÇxŸyúýFäC „c,:|Î7ßõ%cŽ>ØwðP…×PÑXB!ê Jè Žž8a;ÿÞmŸ>Í:ž Œ¦ûôÉJñF† uà "ý×ß~sÎ?þ茿»ÔÚ œÁ´jíZ'ÖoÚä>c”qüÆ»¶dÙ2W6e>xRb_O ŒãaÃG8#cñ’¥Ö¨Q£Tƒ.\¾âD†áñS§œ8ÁÄ0Šóz0Š(sÌØ±Î(D(ay\+y„´ƒs¨‡vsƒrÒäÉ™ü‚\ O£¼á#FfÕÛNÝ.õÒd‡šáAá˜&^èL\sÜyY_~d?o8e#—ub…<±Ð¹ûü[÷3oÇ;uó©m=yÛ/>èÎõõüñ÷E³â˜¸øÀåAè z(ãÞ‹w¶½´×½²'oÞgµb8Ÿ¾å3}Iÿý³ÿ€Í[°ÐõPÑø¢ΡÊÀSŠŒ^D uM™6Íý‘›Kè0æ;¨Ö\ƒ ÞÊ„unÙ¶ÝEÚÂyiã’g’r'/âˆÿ?+´´‡²é7Æe_¾vÝȈÏ Æ;BÆO `Sßÿ-vÏ¢Äùäcr€çˆ~br!n 6Y+D9Ôá×âùgœIþß¹{uM®ÃÝ ƒø>#¹<Âq}Ìç§OgÕ[Þ½à{…¾¤N<¼\S8éAŒžGž=¾Wh+ס,êç3¢×ŸG]|ßp¿¸§œG˜.ß9>O,tÆŽçÄuñ]³Ï8åþäºΫh¬ !„õ‰#t0‚x9ûF^öþq¾4zÿðƒ=:+=ÆAáá,¸Oã8†F'Ÿ1â¶Œ5ºLi¡k°Ì¨†^ ‹\kî>|äŒé0ˆ™ff~ã¼åÕ±ÍÚ$þ§,Œ¼Ð8' …ñÃgï±ðÇñüЧ¶> £ã'®Ö¾á¼(qºgøÒöñH‰¡í…ëpüñ‡¯Þ;á²ç|É}‰…Î’=—\ø[¸fgÙ¾+öËÆSîÿ›O^»üx–üqDâéïs%eæºÀõ-Ð/C†+sÏ0x½pÌg|QFihLÆ"âP£8OZ]lX@š÷êp©Û‹\@å:ž´Ð5®F˜†XÃ0½ ‡Žuå{/"9}ž‡÷<<> #4/¬bÊ ];yæl& ÁE¢ŠÏñ}æÙÇ:÷’6Æž°ø^Po((þD\øIïÑ ËñB"?ˆPàÑÏ¡ðÖfáòçÅB‡ B}øûèÙ³ŒAyõÆÍ¬ú!¡³áHɹ¹Öèüºñ´-ß_"&c¡3*,k]sk~<‡.?´ÁIÖþì½pßýÿ:ò(=|ùÞž¾-)£ªB§¼¾ŒÐx<Äÿç3¾Òê‰E ĆiœÇª^Pxð,]¾Üý0áy 3f9¯*B'¾vŒiBÒâóéWÄ ÿ3¾1ÌÃãô+í ÓüwB®qWžÐ Ÿq?¾}øZ|Ÿ1ìëÜKW¯eÕ“F|/˜¤Aœ„÷¡A½~—:ê¤î°Æ „iqûÒú™k¦lF Æ“$Œ+ïI"?^4Ÿ'¾†|ƪBQŸh0BÇ …xÖ7`áŒl.ÒŒ ^üq½v‚!‰q‹á@X "¬<¡ƒ—âcâC9âöOŸ;ïê!Üü•:1þ'0®Ûã×5àIÀƒÆ5`ôýÔ¯ŸKgý[c‡Ÿ˜m'}èZv_¾ÿèŽíˆB×⼄¥-HàÿPè dø?ˆ™ÍÇo9ïM\wHM ß·f„b¸2ÔýŸÏøJ«'1¦qžò„Žs"¤,6¬kJèø1ÁŸo&ÿWVèäZ§SSBØ>›ï^<<åm®ß ¾ âûëñýZ“Be{Os,tøŸ6âC(ÒW<ãå |ƪBQŸh0B‡?ëèYôçç5"åA8Þ´1d±4 Èù?Íò3ôg/\t‹´C¼q¡HS¦”)C¢<¡n„˜ÄåBå!” ã#4°0b)·ªBÇy„áÄm $ÏŸÃŒ4†(}åbfà ëAx•gè”·i;mF 6$ÈåѶ䰭:xÍ­¯‰!œ-—G'äK |ÆWZ=±ˆØ0óä#tðèÄuՔОôÙÿêxtêBèxðfÞÇ=fŽø¸'¾Üsú5¾ÇÀ&ä©I¡Ã,®)Í£C}¶¿¶l-se–'tò«B!D}¢Á ®ñ@Ì:/û\á]1Þ‰g’1Z¥a]ŸÓŒ ŒŸ4ãÐo(,fÆõŸ10I … …c¡381vÙ$!.xOr­9@ÅBQ¡óêÝ{×±¡ôôÅË2b !DÝ,$÷³Ä,Æf©Î;»™á¸nOf{é­e·—~ÿéÿ܆r,Þ^úÚ£Ïýä×è Xø 6øí¯3ö>¨“zž•gG6'¦‚5:g“ƒJË$Ô6:Ç«ß4 \£SBLJ†…ëGÒžñŠ„Ï(õ‡eãÝ 7舉ïý‹È‹7Q ïsu„6aÆ éikth×®1bM"&:ñ5ä3V…BˆúDƒ:Õ¯a_Ì&³O·îÝñîÅGšl,@XF Æ=3ºx—|l=ÆFÆ ¡\„va,†k¼1GýþùËyì¨ÄÚ ¿6&†<”gaÁì;õ–k‹é4#96Æ ¹ã3×Áfì …x gÞ™±¥Ö yã c•~¡ ¹Ä™çüÝ´ =oCÊxs ³ëÚêÒ]×®<²i‰ a‡´\»®±õ4eÿo×ç=BÐ  fmù¼à|á΋NPQõ‘—µ=^•ì°Fû(“0·p+ëØÀ̧oÓŒýPè@Eã+­žXÄãŽu Ü¿ç¯^gåÉGè0öYÄΆ›Šv]óä+tXãB}„vòâU O97Üu­&„"ž{Á~ëä´g¼"¡ƒ§Éï4Æó±bÕ*÷Üâ¥ëôÄ÷‚çá@ëáØéÌyš[´¨׉‡›1CŸs=+W¯Îä‰C×O<ˈÆ߃<Ç¡'¾Ò*«B!D}â«:Q¼œñ´`¤`(`@†;¥A€Á„±ƒa€±ÅËAㇷ…2104ø=Œ ¿S óÂ#B^.^*„ åúßÈ(o†”k`í å`\b4a”²6(Î iFrlŒïŒDNì1Ãàåw{Â4fµÙ-®7«_:ÂVЀ'æòý²¢¡3béa·ô”u'€™¾é´]{øYÈÅB.Ýá„ al˜%ÿ\.³M4!i+\uÇØ5?þwtÏâÝ—Üïð¬>˜¾à<60óéÛ4c?:¯´zb¬·bÛd¼lñÔÏGè;ÿ;:ÜsÖeqc-vÌ…UEè¿õ{yDýABG!„HGBG!„BQpHè!„B!  !„B!DÁ!¡#„B!„(8$t„B!„‡„ŽB!„¢àÐB!„B:BˆzÍ»Ÿ²Ò„B!*BBGQ/¹pùŠ}ß»·5jÔÈþ±(ë¸B!Dy|5Bçý§ÿl濬g¯^Ö¤IkÙª•?ÞnÞ½—•WÔ_ÿkƒ,—%{.eW—¼ùðɵcï…ûYÇj›ÑcÆØ/Ó§g¥çbã_›í›o¾±oÞf«.«Ö¬±î=z¸g%>æ9uöœµoßÁ®Ý¼•u¬&¡ ]ºt±~üÑ=j7îÜÍÊS_h×®½Í¿ +=¤²÷Y!„Õç«:¿ÏgEEE6{Îï¶÷ÀAÛ´y‹uëÖÍmÏ^¾ÊÊ_Ól޺ͨuQW}qæöÓ Ë÷]q¢âô­g™´›_gW—TEèÜñÎsêæÓ¬c•qÁ؈ÓsQ›Bçð±cî9ñŸ™ .žŸvëÞ}›öË/öèÙ³¬ók’»¹ºÿÙ ëØ—$í9ÎGèTö> !„¢ú|BçÜÅKÎ8Y¾re™ôûŸX³fÍr)o?|ÌJ«*iÒ×ÈÎ3wœ@xWŽ× ®ù’B§²Ô†ÐÁ{’æÅI:uÅ¥«×\Ý'NŸÎ:æ©Éç3_Òžã|„ŽB!ꞯBèàÅiÞ¼yªq8iÊ4xˆûß‘ë6n´Ž;Úø \:‹¡/Yb:t°¦M›Úà!CíÆí;eÊ!,ްŽwêÔÉ–­X‘1[´léÊõLýùçÌy¯\uõsÞ·ß~ë΋ÛrìäIë?`€5oÑÂX?ÿúk¹âiâ¤I®ü?—.uí§FŒåD^˜ïïöZž=]Xá}vé/^¿±ââbçóyOœ>ã®ãü¥Ë™´5ë×;Ñøúý¿Ym)OèàÙ™³õ¼ _rØÆ¯:f;OîãÛO߸óvŸ¿g³·ž³Kظ•Çìï³w]xÜüløÒ’󶜸mïKÏ»ûü­;ïŸDÄÌÚr69ï°M\sÜ^z˜);Mè\¼÷<©'É¿ìˆ]qÌVì¿j/Þ}pÇþøûb™Ð»‰«gÎ{þöƒ-Ý{ÅF&ç\~Ô–ï¿b¯Þç6Èûþô“ ¡äÿë·n»~e, 4ØÝ‹ï¾û®Lßû1Êýaý yøKHYXî“ç/lòÔ©n즉†{é3v¥:l¸+ãÊõ6áÿ¬u›6î8¡Vᘥ¤FÆgòó9ŸñÅó3oÁBW6Ç'MžìêòeÆp,¬xvs=ŸoþýàÊÇ;˵øp·°Lêž5{ŽM˜8ÑÚ´mëžú„ggæ¬ÙÖªuk×O\O®ç)×sL_R6åPuñ(ÄÂû Üëá#Fº29Ê´iöøÙó¬:C¶lÛnݺw·Æ»ï¼DáqÊÁ#GY”›ÖÈõ¬ !„…Fƒ:‡£'NØÎ¿wÛçùϤ4È~ìÓ'+=ÆR¼ü©Oé¿þö›3âW¯[g»÷îs†ëünPk7lpFêµkX¿i“ûŒÁÊqÖ,Y¶Ì•M™ž”×±„á7løÛwðP"¦–º…×[·ïÈj°8ÑñÛÌ™vüÔ)g°`ð`¼Åy=n”9fìXgœ"”0ˆ¼‘\+y„´ƒs¨Ç¯‹@XaœúüÞEüù4ÊÃp‹ëÉ%tî>çÄ˼D°à%Ùzò¶ ^|Ð_~äŽ{¡3uÝ »tÿ…0ˆÒÆ$BäÐ凮Œ=‰"íøõ’>öBgR"n.Ü}n·ž¼±U¯¹´ËI9䉅ÎDp ýó­>t-©ë¹+‹óÿ,]K„°:÷Yæ¼;¾œŸ7œ²ÉkOØÑk˜…ØÙw%«ß¾L®‹g˜ó×<³”…0APÇÁ#GÜç³feµ r=Ç\/Ï Ïõ#ºÈãŸï3 ¡Ö§o_×÷<ï”á'\ÒøkËVW&Â…sØœ~ç;Ãçñ÷”ç’ïÊåsØŽŠžu!„¢h0BCgì¸q™ÙT  ÿ8_½øÁF•ã ©pƒ‚p–ݧqcÁ¯¸|ízV[FŽ]¦Î´Œ žÐ Âll¯ï¿/S–‡u ’a˜Æ³ÓqÞòêð³ßüOYÉ¡aJ cˆÏ~¶Þg6˜>ÅPóiYÁ¸þ˜\B‡ &¬:æÄ‚O[–„_6žrÿ{¡sâÆgOžÒV¸Z¦¬)‰ÐXsèºûß /|ÇÀ3êۑϳ.„B Fèx+$ÚS¡†¸ù™_ D ÆA¸å-Æ&ž# B¥øË¢to_½q3«þ˜\BÏÇšC×\º‘€pxûñ¿ŒÐ9w§ì"øaK»2ô›ÏdDŒ:lzæYø†ó¼ð,t¯eàÉÁÓ„X Û&tí¾hÓÖŸ,s ^–äÛÖïI:q(Æ,^þO£þþøð5DÆzx?ÙD€ˆI{ŽÓú’r.þsxŸ…ˆC¾—ð?Uþf<óÔÉfaºv÷*/µ#Ÿg]!„($ŒÐñF³¦q¾4 ¡÷!i†Ôÿ-Ϊ×ãC0ª0ìð®°æãVžÐÁÀˆË ¹}ÿAVû0x6¬-8}‡ÐòWVè ÄøŸðž¸n7D ÑÃÆ5àm`¶œô®]»Ú¶;8 =>å‘&t2¤åâáË÷5.t¶ŸºñÐÄBLJ®±.çʃ—NÔJW‘Ða PÜvÁ‹ÉWè2Åÿic4:Œ»ø^z|XdšQùi"%_¡ãÇã”ü´1ÌSSB‡É& âóñ¶’×?G_Bè 24ó9^£ƒw–5R´ï&b¸ÿq}àCCІŠîiØŽ|žu!„¢h0BÃOIør^ôçç5"åAÈ Þ€âc,žæÿ4CÊÏNŸ½pÑ-¾ñF” S™2¥L¹5å À€e½B\.¤-ê'¼A†Èø™ëª o$·<^Bgè+otÏ7ß…Á ¼Âõå‘&tÁÂÚ™ë^e©i¡ƒ÷(—GgÝ¡ënSƒ0tc ÖMßt:«ýÀ&aýžÚ:·Üóø~Bæű‘_BǗ὞š:L.àщŸÿ\xoI}:&¸oLPN|à=:ÞçÉ×£3¸´ù>ëB!D¡Ð`„°Ðñ@\=I®ð®ÿ‚' -L'õ-¬)àsš!…’f|ú…ÈÀbp >ÿc…´Pè°† 6'ëBá‚á“k÷%DQ,t”[U¡CÈ}HO_¼,ctaù]çüz$ŒPvwêܹ³[ä×F.¡óû¶óöÛ_gʈ ò<{SÒ†ê £W?{Tð ±ÈÿPi,tV'‚‹ÝÞú\¦ÿýßn’v2:ÎK´ôˆ=-m³çÉ›ìužÚ:äEØÇv„c6Í(Ž|îþ–Me…ã’õ%ñe²FM<¨¤±iAx>¡Xa»jJè¤=Çi}YžÐ¡­ü†Wx¾_ý:«ú6±Ãb˜Ž7+^£S^;ò}Ö…BˆB¡A ê€W‡°/ŒvÂhb«VŒwo´¤RÀÆ„n!”0¼XtwÉϰb8àõÁÀ$”‹ÙYf™‰Á÷eøðê÷a<üå<¶òŸeq2ñô¹âåÉCxV,ð¦žØð ©ÈfÅùÌu°Ù;u!^Â5Hx¯¨‡5H^ha€Ñ/´!—8‹É%t®>xéÂÅþ·ë‚ó¾œM˜»ý¼ sõWSèŒ^qÔí‚Æ•.ÜyÑ­ý¹ö°¤Ïb¡Cý|f3„c×»í¢ÉOÚËÒ-¦_'ç Y|Èm5í½:l?€bç±cÛÚC×]ˆ\]zt ¬aë1Ø¡Ïy5#·<£86ò1Œì¨Æ3CZe…¬XµÊ<€ˆ&vãsMßžG¶8§ïX|Où¡¤¦„NÚsœÖ—å ¼ÓL 6Üycè[¾3è\þÚÙ!Žï ¼Ùôñ‹ÿÌäɧù<ëB!D¡ðÕŒs„ žÄÆ ³Ö>O.C ƒ#ÍÿN$‚Æ'$o ebøcDð{8€~ jþæ…G„¼þ\¼TÊõ¿ãμÇp D”ƒ@Âe4f¶ã¼! xl|ß þ0|bž´xV£’Øâzs‘KèÛF#l/lN°äŸËoHu…ÎÖ·mææ³NLñ»7‡¯|öðÄBئš|ü¦bá2mÃ)÷[?>Ï®3%;±!l|ÚÃWï]ݤó»>s¶ž³«_–i_Hm`ÓÆâÀ:µpLšQœfä#R(ÃïDV¡Ã³GÙ¬G¡-´‹POÆ[x^He„Þ®…ç“É Æc܇5%tÒžã´¾ŒFºÆóÊqžyú…5:ñosÅ6çŸQ6#áÞ„ÞÝ|Úù<ëB!D!ðÕñu’kލ;˜ˆ=/„zœW!„¢¦Ð„Η‡-ÔñZò#¨x„ð„Zzk„B!j QÐHè|yX3ÄÚÖ ºÆVïáe !„BÔ:B!„Bˆ‚CBG!„BQpHè!„B!  !„B!DÁ!¡#„B!„(8$t„B!„‡„ŽB!„¢àÐB!„B:BˆÍ»Ÿ²Ò„B!$t„ ’ÇÏžÛÈQ£­qãÆöS¿~YÇ…BñuóÕ÷Ÿþ³ ›þ²ž½zY“&M¬e«V6nüx»y÷^V^Q{ÜñÎ-:hÜÈ:VS¼ùðÉÕ±÷Âý¬cù°ûü=w¾gØ’Ã6uýIÛvê¶½þP9ïÁŒÍglñîKYéù²jÍëÞ£‡¿ñ±\´k×ÞæÎ_•^]N=gíÛw°k7oeó¼|ûÎ:vìhÛvìÌ:VÓLûåkÕúÿ³wßQÇÿÈôhЉé¦÷b%jÔc¬IŒ]±ÄÞ{A±+"b‘*–Ï÷—ùòœenvï8Šz,¯ž¹ÙÙ½ã¸õæ½Sö ³gÿsáRïßã'mÓ–­æ¹çž3­m±mNoþÎ…î›o¿µÿdžå<-ƒ&è,X¸È¼ð fÞüæà‘£fóÖmfĈ¶áÖÐÔ«ßß¶nßa;Oã¹ ÙŽÓ•6Ùô5èôÆ“:ÙÎ…gÙ0úÚkféò±rG½#O»‡$)pätú*éyŸ5‚àYAGW}‡ ’ØÐ˜6}ºùiä(û³klØ´É¿ùeÊ[®«ÔK—/·_¯¼òŠ9j´¹VY•q ‹ÓÐmו敫WG,5Èt\gÆo¿Eû]*¿bŸ_û½óÎ;v¿ð5úJNŸ6ßÿðƒ2t¨mÐþöûï9ÃÓÔiÓìñ—­Xa_¿Þ‡qã¶!ϯ·÷ÀAóɧŸÚa}Þw¤¸Ø–7¶´š_|Ñö€¹º§Îž³¿ÇŲËQÙºÿþ³¡±¥ý~ì58Wn5Ù Pv³ÑÌÚtƬ8X«3iu‰ÙX|͆ƒ «O˜ŸW0ÿu<ö{º«ãöGÿg~)*1Ëög†µG+ì¾I½JÙ‚Nymçë/­¾k_yÜl=™9ŒkÁŽ‹fÑ®®ÞŒ0èèùÔ«5yM‰»¼ØÖ¿y7þ¹tþúg±yãÍ7£Çú›ëÊÿô™3íçJÛþœ;/#ˆ¨ÎÜyóm¹†h&Õéî3­ÏªsæÎµÇÐ9qìÄ ûw/¿zͬݰ!ã3-•5µöïïÎ!Gç”zR÷:lÏ}¾>ÿâ ; Îÿ=õYúú›oì|›>úÈÖWÝí;wÅÞ÷:|îóªß}ÖìÙfô˜±v½V•«‡IçÊô~üñçŸö³íŽ©ù?ýdþ^ü¯=UOçz±tnëÿ}¾u wÌЄ‰3^Ó{ï½gËÝÿ+zúݓރðï|·¹ÅöŒé÷ѹ>²ãïSv¥"öœ¹žWêï6š_g̰ŸýÕ#çÿÞzN}V¦LjÞ6Ì>—êèÿ}f44Pûéóàÿ?ã>‡zßt ÕS@ñ?caÐQÓc÷<ú¹÷2ÛçIÛºû¬Í€ : 'N2»÷î3·î܉mÏF ˜¯¾þ:Vr 5ôõnÜÿïüa9ú2Þwðùò«¯Ì‡~­ö´~ãFÛx)Z¿Þ†€ÿ6o¶Õ@ÒökUÕfùÊ•öØ:fm}gȸÚñe­à1fì8sèè1{uúùçŸOlÜIéår:ÔH;yæŒ 'j”©‘ÖuÔ@Ñ1'Nšd Jj¤¸'ú]UGP¯Cûèyôºµ]»i¿þÕW£L¿‹®LÇ;n|ìù}ë]5;BŠÂÇÎ3•fÜŠbÓ|?s΋BŒæÄ»|Ë€aeÔÒc¶~¾u ;Ósµ<~®v½ÞŽð£°¾FÉtŽ–Ý²åU Á¤7A§èH…}-zŽ“WëÍìÍgͯëO%. ÀúÛéo¥÷^Ÿ}VôØ}Ö\ýýô7;pøˆYô÷?öïå×éî3­Ï€öÑçFÇP#Õ:jô^½QiŸK¡K?«‘›tôX!çô¹óærÅUóÃ?ÚF«k«á­†²†’nÛ±ÓþNz-Ú/é\Ð< =ŸËjŒëg•ùïÞ7}–ul=§ÈjX+@éüTã]AÆ]ŒP\Ï·xÉRû¾*”¸F¾êé‚„Î]½Oú]Â×$ºxpüäI{=‡›ÿçÞ]ÈÐÏ»÷í7uü®þ{þõþö–ë¤ßC!PAÁ%ßçÕßBÿ—é½ÔsªWY¿“¡EÏ©ÏþÐù®ÿËtýÞ 2zo?n+ôºýô>ëÿ8ý½:´Ÿ­þŸsuü Ó|¯Ýþ¾?þ4Ò¾·ª7jô õ:³}ž´owŸU²0AG ’I“'GWûôÅ«†X/É_~i~ž0!Vr }á†DmWcJ @=VC*|-Z ÊΤ¡kj̸/zW¦/ùÏ>ÿ<ãXNõ­:Tüá8šÄ¬_X7×s¨á«¹IúYÇRÄ>*óç?¸Þ ·]=?zOÕørej ¨!>¿Óöð¶Å…‹êް Ðp¼¼.£žB̺Ž@ä—iŸ‰k:R>u s£¾Å>Ö\=¾Z×ÜÙ³To4Š :·šÛ;‚ØCxÎÞh°!mþö®«ð= :Õw;çCÞ: ƒÙQvúzrpÀaHýü ª:jDúŸ5x]|>ÓúܨgÀoLúAÇ•…C²5œU¦@¡ÇúÜè¹]°=G¶ ã$ ]Óï® ¿LaM c¿·Áý.®'H r½Gþ~ ýeëè¼se *ÓŠo~]'i™{ô\™—ÿ„g…§î±z7FŽuîS¶çÕûêÿ½ô~*» E®GÇ?– þçGaÃxzŸýà#êÒëvûùAG½éºHåÿÿ§ÿ3õšýÿ;ÃÏS>ŸU²0A'i¸Jw=ކ‰ô$èøCÜÜN5 ÔPrþùwITO õ)@è꣮nª'ÄmO :ººªÆ‚\w…¾õ~fo‚£Fz~õi¨Ž›m…¬j¸øe𫤯Ž~v J­\å¿]õýîûïm5®TG ŒªÚ[öõiØþÕÄt×ȺrízìùØ—h%³E;3nvXÚñÌãœéÚ÷vKgXë®Ntä·gÌòÇÃ×¶Òб“Qp …«®9ÿì¾”ÑËÓÓ £ž'çNë}ÛƒãL]w2v'l«οQ ‚M¾uòùL'}nútüsÊ}žÜÐ-£þséëÙGwïAøwV˜UhÐûè­l’žW†Nü¿±†â©žz€TGÏ©çö¥ÏŠøeáëKzŸõÜ:¶]SO¶B•^“þ&êeS} W'ü<åóY ›t\Pð…W`³Qñ{²Ijh(Kø¼Ž¢Æˆ‚ƒzW4ÄE…°\AG_Öáñ|n|ºO!GÁFcèÏ^¸hŸG =ÕïiÐQÓÏjd„Ïí¸±þºª¯4ýº²êîY¢¹Z£Æ¨ßã“DsdƯ:ašî=°½$²¹äºrVßÚÕK 1—km@¸v»%¯:IAg÷¹*3nÅq»<´æiNOøt´âÚåš&Òô:÷]èêqžÕ Ó³êPrïd> L5JGŽw|>ÓIŸ›'t4¤,lX÷WÐqç™Ìáþê9Uª~îiÐÉ6O')päó„g ÅSOê|`ëéo¡çŸ/×óêÿŸðïë¸÷µ?ƒŽz¬tl×Cãý>úÿDO4lMÃÝÜ{™+èäóY ›ttUS=%þÝ’e]sDrÑUDõ~¸qü>M\Öä|ýœÔ q½çK/Ù Ó>Fì° éÓ3Ž«/ø\AGÔˆÒpð¸’4©_CÉÔð‡”¨A©ãö6踗_ƒ†ä¹}tuXB½Wn¾®†ëʳ‚W®FGsûC;ñ>lÜ;~€H 1šË¢z¹ztü:IA§®£\CÄö]è 1Wj›b¯ÓI𣳿È;ôN¿‹+Ó"= : [ L·šíð9_mSWØóåÓÀìiÐÉç3ô¹Ijä‡ ÓÞõè„ÏÕ_AGtî']ýïKΓ:> ßÒÿS:gÃ!²¹žWs½¯áßXÜ\Ÿþ :š3¨×Ô££afÚ–4<1WÐÉç³ @6&èˆ&ú+õ®ü¾élTW!F¡Âß_CÎtߎN®:IAG4¿F LY{Ò.H¾N')èÔ5·Ûûèl?]•ÍØpÚ¬:ÜÕðÔ15D.[ÐÑï«ãª§È>¿G+”O³§A'ŸÏtÒç&©‘¯ù_þ½lztt^j¤?DKszT§?‚ŽV%ÓBþ9â&ïûstú#踡aþü‘|Þÿï¬y;ú?N ޏúºH£úþê‡Ý=¯.H(ä… ·øç¾…/¿Ž>3*O𣣡±z}þjiúÛªÌ:áç)ŸÏ*Ù ¨ ÓêÕѰ/]ÙÕ*Fj|ŒøøcÛxwá#©A"ZX@C·Ô Sã^“§Õ»äƹ«a¥«ŽjXh(—†v©áæÏ;p +=¿›P¬µŸbú"×$mÍ£pscBª£c¨gEÁBWÂõ<*˶ÄtRƒÕ:¢!wz¬ßC‹h…&…ÿ*¸®žêy4É5dÔpÔû¢×-œÉüíÍôŽP–‹&æ«ñ_y§sÉ[…õzl?Ui.V7Øžmß{>³×'WlAçHY­-×*láëð%ѪqãVÊõX=Uš{£%ÝLTûe :¢y>ê Ò>Z A=Lc;—?wÉ—ÔÀ ò= :ÒÝg:és“ÔÈ×g]s.ô™Ñ’Ƚ :Ú¦ù(ZäBßîV]sò :Z–YEÃIuîoٶݾ§Ò꯺ÖAGt.i=—Êòyü¿³.vh¨­††îÚ³×þMÔkªÿ¿üEº{^ýŸ à ¿‚†‚“íÝ:´_ztô|êU×ëÓ{®ßgÍÚµQ?è(˜(téó¢ßéߥˢ9:~/TøyRYwŸU²4AG }Qª§EáB_ÚjÌéJ¨«“Ô 5"4ÄE|5|ôE¬@ã¶ëj«z[tL}!ëK_÷ÃQCÑ­Z¥5ÌK_îªëöU/•‚ŽëîW‘ëj¥~u×qÔ€QQsƒÂº’Ô` ƒŽèJ±{oþrÂ35>uß¿L+yi¶ðy %¹43¨øškÓ|=VˆYy¨Ü†õ¾((È„÷ÑÉU'[ÐÑRÔ*ws}²Ét´ˆ€B‰6§ùF+\¶suô´ò›BN® £9B›Ž_³‹!h‰ì™ÿ6ÅÁÊs¾¤fØCL>uºûL'}n’ùº¯e“:4|ª7AGÔKèϙ悩Ž>ßþkðåtDÏåßGG«ˆ¹†´ôWБÕEE6L¸UÊòy¿³ùÐ ·¸‰Þ›\st’žW´xˆþßQ¹Ž£pç.´H_‚Ž^ŸÞ7×ý¿ç¯Ò.F ‹(î>Búl鱆ýú½TáçIeÝ}VÈfÐ IóoBùÔI²ël•™¾¾k˜ GØ#©+÷ Ù<ž­l€BBÐAAÉ'ÄäSÇwýv‹]ð@½1þ=lPnÖݶ=¥«ü®¦åƒýz¢°tA%Ÿ“OŸêjxœæÔäZ„ÏŽ–Ö°* ƒÒÐ%Ý_*ìåAá è‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!è _­Ý°Á<÷ÜsÖŸsçŶOC¿c'N˜Ÿ'L0ƽe^|ñEóæ°afì¸ñfßÁC±ºƒ•Þ òñ /ÄŽQ¨BÐYø×ß9_cýÝÆŒ÷¿±µ-V…­ß‚Nû£ÿ™9sçÆé¾_g̰õÂ}Ó`éòÑ著Ãí>‚N÷üß?ÜÖW€ôë· ³rõêŒÆáˆ?6cÆŽ3}ôQFùꢢؾiГ sáR™™6}zõ€¹ý¿ûþûŒmÓgÎŒ£PtPú%èÜn¸k^~ùå¨aX´n]Æöuÿým2t¨ij»;Fo©‡¨¥ý~¬Üi{ðÐ Ëû[O‚N’ú)Úמ½±íA… _‚Žß¸ýêë¯cÛeĈQ#ÅŶ쭷ގÊnݹÕ=w±4*ÿò«¯¢ò¼c”^.7ß~÷´lÅ »¿Ûöý?Øáa~ø¡yþùçÍ©³ç¢cœ9ÁŒÿy‚yý7l8SÓâ%K3³WoTFÇRݧNÙ òꫯڞ—©Ó¦™šÛõ¶îõê›QÝІM›bïC6ùê[ufÖìÙføðáöwûíáfÆo¿™ÊšÚŒzþ{¥ßG¯ù7ß´¿óç_|a>b zØT×½K—/φ³çÌ‰Ž³s÷{œ×^ݾêy:~òdÆóæ :7nÖ˜ßÿøÃöö½òÊ+ö8êõ+9}:ª£¬ð}½öÞ¼Iútô9ûãÏ?Í»ï¾kŸwèk¯uüíFšý‡ÇŽÓØÒj–¯\i¾øòKû»êwÖù±eÛöÄ!œeW*̸ñ?Û‹C† ±?—_½f?ÃzúŒøõuÁ@¡Zï§þ~îýô?ïƒU¿É¿ü5 :Âí¢Æû_ÿ,¶6TÖ— £ â~^±jUFÐQCQóZÜc÷|;víŽ!=Oó½v[Ï:jÈ&íóÁØž¤§tÔöoŸ‚@ÅõQ]ÿ½ÒûÖ×û3rÔèX¹(ܸãøAÇOý²â’’¨~¶ £@ä÷ú…ô·Q½|‚NOÞ‡$½ : · Vás:ÿ.]ãfÝm†Â:ÎÌY³2žóbÙeÃzþßÎ:w›[l€ ë‹>¯{öˆý^ƒI¿…×ÈÚ½w_l{6} :¢†áûï¿o‡ÆùAÇQ£÷½÷Þ³sb®UUg4´µœO𣮡êùiä(Û›¡yHº*ïÊ=f¯ª«‡jÚ¯¿FåúYeùô.8Ýõ²ø½bŸ}þ¹™;o¾í!pe?üøcT߯ôü·y³Ù¸yK¬¡®ªßM½®ì¥—^ІúAG¿»z¶nß‘ñzÕsæz(²Õqåz.}NüÀ¡à¢ßQ!FïÿõØõõô}HÒÛ ã¿êÙÒkÒgO=;*SÀP¯•ꪷÉÕÙ(õ­_oƒ³+W¯¤{Nõ²¹r}n„~™2%#\úAGÛ]¹Î#½§ZíЕ) 545Ç~7€Á¢_‚Žßð—æ1ø¯Qû;Ÿ~öY´MÓü £çôã¯.·èï¢ò'tü€¥†µÿúýÞ×£–í½:|¬«·Dó²½7ÏÃ:›¶lͨï?ïúmYRÐqôÞjΊzÓôwýäÓO3†kùsK\™øÇèéû¤·AG½8®LóÀºî46Åöw4Rï™zÍ’ô9Ó}¥Ü14JõÔÛæÊT×?†æ‡¹m.èhXš+9jtÆ{à#½ák,ú%è<‹¡k= :šÜí¶ç¢^…\AgÕš5Ñ65˜]ù“: %ákMâz ²½Wþ°°ÜA§³g"WÐQCÝm[²¬³Ñž-èèxIs…|î9Å/÷Ÿ³§ïC’Þ½þgV4´L¡GáÃï©R¨ó{:“¸Ï‰†Lº2ž$­j+ÉÄI“b¿À`Ñ/AgÒäÉQãÊÎå;zü¸œ/nˆÒÓ :¹&Âû4)¼ƒŽVÓ _k·´w¶÷ª?ƒŽ–pÛr{™wÞy'*W¯ŽÂ„¶)$„Ï)®LüçìéûÄÝZ.܃ô‡Hj…Α£UÒ\Øñ{&Lœhçki›VøsåIAǽNRÐñ?ƒ¹„_€Á¤_‚Ž…ÙŸ0íó¯n»¡ü £¹2®î“:þ¢—ʯĶû 1è覡n»ÂD¸=”í½êÏ ã\ÍýQYRÐñç h¸šŒžž¾IüÏëÈQ£cÛOŸ;mW/T¸ÝÑ:–ß[xòÌ»Í/Ó}¦Ü>IAǺ6eêÔŒçH :š÷ãÊ¢Â×€~ : )nr´h…)»æo¸mZÑËÍkðçö¨Açêë>#®¼¿‚Îo¿ÿmWß¿WŒ^æÛ¸²Þ-«Tž¯î‚ŽÞS·]¡ÍïÓëVO€–4veÙÞ«¾˜W]CCÆü·‚XRÐQãß•iw -hàP?èøKzû÷±ééûÄÒ÷Yêz^õÞh‘Û®$•k(šVLë¼oNf˜÷ºPQÏ{ýú×_ý̇.è(x»2­l§%Ë]}?¹çUï;¾Î;3ÿõhøhx#€Á¦_‚ŽøÃoD¯Õ` ‡øü½øßh-Ÿëʵ¤®†é µßÈí¯ £{«(d¹:êaR#þ×3¢{²( ©no‚Žz;\¹zÔó°{ßþØëȦ» £•ßü÷R¯YÏ¡ßÁ•ë=wËBg{¯útdô˜±¶a¯e½]™ž×#)èèoã/“¬÷yÍÚµ‹@ˆãP¿·O7&Õïª ÓÓ÷!ÝlÖCŸ7-I­9-þ;ñ¸?Mϧ•Õô·ò—ìÖRæªëÿnº¡¨Þ—p~‘?Ç_[ç‚~§ð\ð–>·®\aGJï·Þ+•é3xåÚõØï 0Xô[ÐÑ< XQ Ëñ{Rt#Ϥ›PúÜþ :¢Þ¿çɧ×á–ãíMÐÑ¿~Í _C6ÝÑܦaÃÞŠ½vGï¿›#’í½êKÐIšçö($ñðù ù}EõÀ%n®LOÞ‡lÔCóñ'ŸÄöuôy‡Æéyýûà„üUÎt¥¤Íúeþû£^¤†úï¹t4WÈ_î:¤ž37 `0ê· ã8|Ä÷ÑUi5‚Õ Õ$m-ÅÖ ±ùæÛomƒîµ×_7Ó¦O·½/®ÁÖŸAG4ÄJÅu½>ÕUÏ’»/½ :¢ ý.j°ª§!œÓ’K>AG4Lpþ‚…¶÷½gÚ×Í{r²½W} :ê…Ñ=ˆô·Õ+ͯñ—„–lAGÁCÛôºõ¾kØ™z4´D´«ïC W›7í-Q€T(ñCr¾ïC.ZþY7ñÔßL= îu©·Ä¿™§OÃÊt³Nõü¨¾^ßÈQ£íç> WêñQÑëw=OþÒÐz^¿¾‚”zAõZD¶íØÕWÏ__ÁOs„tŽè3'êIZ]T”±€À`ÔïAé’k1ô/õІeþ}qXx äDÐy:4÷H=RZhÀ/óç…÷Ø@väDÐy:4ÜLï±æiÈŸBæÙ¸÷^ÃäüÕØA9tžŽ•«WGïsH!gǮݱ}A9tž-1ù—_ìn¡-ÎÑÝ nGÐ:©CÐ:©CÐ:©CÐ:©CÐ:©CÐ:©CÐ:©CÐ:©CÐ:©CÐ:©CÐ:©CÐ0è¼ð æ¹çž³žþy3|øp3kölS}«.£Þœ¹sÍ!C̾ƒ‡bÇ«=ûDçO¸­'®WߌŽs³î¶ii¿o¾üê+óöÛÃ͵ªêX}ÿg&Lœ7ÙÌ_°0¶_ùþ‡ìs,]¾"¶­t :~Ðñ½ñ曦ìJETïÓÏ>³å ÿú;vŒþ¶vÃû\Ÿ|úilPHžTЩkh°ôøHqq¬~s Æ?ç΋m դɓíw˜¸óE\™,\ôWl¿Po¿s:Pà\ÐÙµg¯i{ðД^.7_ó-ûðÃm™ê]­¬2[·ï0-­±cȽ‡Lû£ÿÅÊ{£·_:ÀÓö¤‚ŽÊN=kö8˜õ¼rçf è` ÓùâΡ[wîĶçÒÛï‚8?踲ªÚ[Q¹Z* ÿCŸ6}º}<ã·ßì6Õ¯¬©µÛŽ8aÃÒË/¿l{†fΚešš£ãkXÜ/S¦˜×^Ý }í53jôs©üŠÝ6ù—_¢/+G_`áë ARÐÑg^7nÞb~üé'3dèPóш=3jˆMœ4ɼúê«ö‚ª5k¢ã(è(Ä„Ÿ +Õã—.3|ðyï½÷l¹‚PÑúõö8/¾ø¢-_¾reF@Êuι×ë O Ðå :û6ŸñEô4}æLÛkªm¹¾s4T[ße¶­óoöœ9¦þnctÜð{±Ðt :IAG4?@åš›£Çáè.èøÔ˜RÈqCÔˆs?;Îî§܈?¶eÚ¦/ý¬Æ ‚ÒŠU«¢íúrÑ~—+®Æ^7Pr}¾Õ¸Ò<=ÖgÝ5’FŽí÷Ê+¯dœGÝçý÷ß·åÿü»$*Óyä~VxÒöîι)S§šaÃÞ²eï¾ûnt®I¶ £‹u®Ü}öE½7š —í;G!Ç3_}ýutnì8wݱÃïÅBGÐ0èd :ãž`Ë5ZÃÿÐ]ÐÑþúB¸VYeTúòPù¼ù ìe…Ÿ×ßxÖ],»l¶ïÜe~ë­·MÍízÓ|¯=:ö’eËí±{;ŒxÚre+:Ïõfª§EeG·(·ÏÃGìyâ>óÒ]ÐQx:uöœ¹q³Æ6èܱu,ÕSÏ‘ëÜÔ‚òog=WIDATÒ|Î9†®a K ::·Ôé²ßÿøÃžú®RϦÊ6oÝfë%}ç,X¸Èžk+W¯Žßõ…ß‹…Ž `ÐékÐÑÐ5·¾\ÜöÓêmâ®hoÛ±Ó>ÖÏ:àöÓ¼ M[¶š“gÎØÇI_:@!Êtü 2T¶{ï>³c×nû³‚‹ÛÎÑÉt\Âç饗¢óÍc¢0”Ï9GÐÁ@—t4·Ô•U\¿ÕÕpj•©7S»ûÎÑÅÿÕù£òð{±Ðt :Ù‚ÎgŸnË»ºæò«×¢/‚$«‹ŠÌØqãíϹVoëîK(= ::Ïtèg uÛ{tÖoÜ;Ï|çK/åuÎt0Ð%sK£2!7ÜsäãahIß9ª¯ï¿¤9l :á÷b¡#èt’‚ÎÕ•ÑÜ5äTþ‡žt4LÍ}œ9!ö\â®.늚+Ó¼…$·ÚTÒ—PˆztÜP2͇qÛ{tvîÞcË4Nó Â×'ùœs tIAGC5]™?ª|zt´MeZŒ@çò¡£Ç¢ct`€ðƒŽÆ/«KÞõæh²sëý¶^øzRЭ.¥r­6u·¹Å–éKÂÝ´Í5ò4œM_Fjй+Î/þ×ÖÑjUz¬†{~ õ&èø=Ÿj<õtŽŽtT×ÍÑÑœKç¯G)ò9ç\£N+³e[Î(dIAG´B¡ÊÔ;£Ï¶àp稛£“ôãèpçÛ…KeÑñ :0@¸ £Æ’k0‰pã%ü=[Ð).)É8¦›ô©•¥tuÍ®õ8 ©žV¹ÑÏš8í®¸i¢µ{:†[â(4½ :zŸ|úilÒ«ún[ô%0ûÅØvŸæ¸a6ÊniƧíù¢yI=¥Žæ½EçᎠ±íº,ß_/e5±í>ÿ"¾‹7cÛ2‚ž¸SgÏFAçÖ¹R@ÐA¾nÔ·šE»J­½r ¨÷G«°é C½@áv]4÷MGç˯ëOŶ‡Ü<8."¹iá÷½ÕÐv?¶Ý·û\×Ðìײ÷ªDýì3³yë¶Œ÷éà÷þ,ÞSÛ K]Ëý®^šnzKE+ºú Iáv=ç÷þhÎ\¸} #èà‰ËtþùwI´MÅý¼jÍ»ÝQðøêë¯£Ç o¿=Ü|ùÕWQ™ 2.èˆÂÓˆ#¼prÎÖ ƒÎ›5Ñkøø“OÌðáÃíÏ /õwÍŠU«Ìˆ?î|­C†˜1cÇ™ËWm¸úþ‡l¹†éi›ûùÜÅΆ®™ÊtÒêôø¿Í›cï¶ Þ|ƒÓ× §(DZx 'ælíZùðNkî«ÔºWßÚBÐ…„pû@GÐÁ—-èèg×àw½GŠ‹;ƒDGàP€pAgèk¯Eûþöûï¶L!G=)*›8i’-ûuÆ ûØG=D£ÇŒµeš?¤:aÐÙ½wŸí‰qÛul|ö8hË’†®í;xÈ–)ˆ]¯îÖ¤Þ%•ÿy‚}n…2=.½\磎ð¥×鎃¯¢®9†£•Ù4Œ-¬ ‹¿âÚ¿{/Ŷ‡tÃCW?×¢ ò£ PÕÛ>ÐtðÄe :{ö°e ³fÏŽ¸ºêaqAG½2n?õö¨ì›o¿Êü`¡Ç.èÌøí·¨ÎŽ]»m™†Ééqt|mÚ^õì¨NѺu¶<)èÌž3'zîwÐëP™zpTÇõiž†¬UÖ¤k ,:¯ŠýRÔ¹2Û¸ǹa(‡«uÍàÙy¦k‚uÇ*bÛÓ€ ƒ'.[ÐY¿qcTžä|é¥~ :‡Ž³eê¥Ñ㤠£@óÁd¬'¹‚Žz€Â×îh>‘êhž?ìNÔÃT[_WSûCóû¦®å9u'ê°€8‚ðlèF×î\Ò÷WKJç¼tðÄe :;wï±ešœßÒž<Öº?ƒÎÆÍ[lÙG}d‡AÇmל=ïñ“'mïÊr™³fÙ²‘£FÇ^HguQ‘íéÑ>n˜®–û̼í]¯]g«bu$ëËеºf‚К?ê†Yë&בÖI ‚ž¸lAçfÝíhŽŽV$Ó\ž¿þYl‡µ©N_ƒŽ†ž545›æ{íQŠP0èL™:Õ>ž>s¦}¬ýÞy猠ãÂ*h½ßy¿7O½@û¶e·îš_¦L±+Ãi%7Í1ÒïÐÔÖ9œiÛŽvÍ r¿Ý3gÑήñÍë]Õ¿Áß»»:þbwÛ²ßs@²‹Õ ѽÞ&®)±+…†uÒ„ ƒ'.[Б—.‹¶©gç•W^É} :¢0¥!d.Œ¸•Р£ž·[ÆÚ=ÖŠk¿Ë¹Œãj‘-v c¸r-Jàܼù ìöï¾ÿ>ú=ôUG—._{¿00ÜëæKö]Š]ºó4‹=Sßê//ÝýM@g>¾¹¨èBC¸@v—kšÌØ+¬ý¼ê„¹QŸ®¥¤“tðÄå :¢^ Ó¢ºކ‚©GDÛútôX÷¿Ñ¼C ¸} £@¢Þ$ ]{ý7ì¢nYh×ËãžKÛu¯â’ÎBª§fᢿlBŽ‚Ò²+ì¢Ú®Þ!ÝgG¯AaN‹¨—ÈÝ/‹ÍÊCåQƒkÅÁòŽ¿e¼€ÜVÜÕå)E¹o°«ónÜãFÚÄÕ¹ëȤa¢þ w5?.¬“F¤RÒ ¿hˆš 9Ëö—ÙÞ°€üü¾¹k!Û-Éó5¥òNkToÁŽîo.  SuC›™°ú„=w´*hymS¬NZtJ<)[JnD-Ý€á3@ßl:q=:§r-æá×Û}.{=]j›ÚÍä5·>»¼Ø”ÝlŒÕI3‚R‰ ƒ'A+×Ðúk!è7ï¶™‘K;Ï+ M»’pµY3w÷v uËÕó “æÀM[wÒž7:´AX'í:‡C¥5QÈÑ$N݃ ¤âv^ÂcÈ´ådWO©‚ÌêÃWÌѲ[ÖªCåÑR¸¶7'G¯€NZ•p†·x‡æ•†ßMÙh˜hx¼Š y˜¾¡ë £§ÂcȤÅ<6¿nF&œ?Žz}¶v"V7º§ÀžCùÚ~º2v¼Š y èOžV†ÒRí¿®?eçh)\ý\t¤ÂܨOÏUfàI#èt"èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚dÑÔþÐ)«5ó¶_0EG*bÛs9_Õ`–ï/3SÖž4c–›q+ŠÍoϘǯ›Û-÷cõÁèDÅmóÓ’£‘¦{bu|­™Ã¥µæïÝ—Ìä5%ѹõëúSfÅÁ˦´únl`°¸ÛöÀ*­1K÷•™éN›ŸW0ãWÕËGE]³Y쪙°úÄ€þÎ"耧íáÿÌÙ fYGHQ#Ê5ÀÖ¹«›D 1íë7ÞBã:¾xha°kh»oQùõ-f꺓±ó)¤F^KÇy¾·vœ©ÌøÎоoVÇêgs«©Ýì:[eC’ ‚ pWëšÍ†ÇW¯Â/ É7èèªrôÓhtEL½Bû.Ü4n=Ÿñå£+fáþÀ`¡@žgÙ‚NmÓ={uÚÕ›ùßi³ýt¥).¯3G.Õšå.›QKEÛ—ì»;FÍ÷™…;/fœGêá\u¨Ü†Ÿƒ¥5±}|¹p´ì–™¿ý‚œA0u÷‡ÿ±kXÌ?»/Eó :«¢úSמ´WÇüííôÅãêÌÞ|6v `0(¹Z#—vwق΢¥QuÇ*Lû£xõ’Ž^ÖvÊjcu€4ÑwÊ¿{»¾§p.ÝìÙh]Œsû‹.(8M)*‰Ê:ÀStµ²ÊL6ͼñæ›æå—_6Ÿ~ö™Ù°iSÇßÿ¢:[·ï0Ï=÷œyï½÷bû;eW*̛Æ™~ü1c_ >.èŒ_uÂ}Q¨!¥†“û>Ÿ ó÷®®ÆX®¡iºÚì꫼Û¤YCk×µù;.˜™ÏDçCRЩ¾ÛmŸ±á´¹—ãÿëǯEuÿ+¾Û¤É±Ë·¢Ï»zdšÛÆêtÇ9[Ιýoš;m¡fî¶®à)¹XvÙ :Ô†˜Ð´éÓ£zùÝ{÷Ù:/½ô’ij»ÛÞ[&N´Çýsî¼Ø6¦–ûÌ™ëwì8g¿¼'AGûŽ}<>ZóÂí¾k·[ò>.6n›Î—šÆ{Ý->à¶«G4Üî+»ÙÕÕ•îp;º§ÅnôYŸ´¦ÄÎy ëäãrM£=Ãr‚ð”©×eÄÇÛñɧŸšÒË妮¡Á¬Z³Æ<ÿüó¶\áEuó :÷>²õÏ],më ‚Nzô$èh˜Z¾ , 7ÐJ8ª«¡áv ­N]ë²¶÷ÂM[Ö]Ð9q¥Î,ÚUjåê)•+·š¢ciÞN¸H ÿûiïùêØö¾"èOYÉéÓQïÍ…KeÛÆÿ<Á–÷ý÷ö± :ï¼óŽù{ñ¿fذ·Ìëo¼aæÎ›oÚtvíž8u*:ž;ŽÂTÑúõæÃ?4/¾ø¢ JËW®ÌÚvæüóý?˜W^yżýöp3ã·ßÌ­;Ã4œÎïerÇnlm3 .2ï¾û®yõÕWíp»Í[·Å~G–žꆮá5ºbni©iÕÕœŸp;6":quç¸-ÌáæÙttzÂïýqA H£­'oDŸuõæhލøÐüR}¯h(¶n Åpr ÷̆ ûüóض#ÅÅQ(¹ÓØ…õþ¨Gæ¯Û2%…¡0è¨WƇdW¡Gû¨÷FGŽmZï?0Õ·êÌk¯¿nËNž9c÷ ‡®é¹ÀT¦áv*[»aƒùhĈŒyE(<= :2mÝ)[W«HÕ+®ùlüe¬ÝäO ­N_¿}ÞuŸ[õà¸ãl.¹Û¤‰n_à‡Ñê„»ÏUÙ^-2 Û¸mKºR"èO™ :önóƒNýÝÆÄ9:7nÖDunÖÝŽ=ûØŸJfÍžqu´¿†´éçí;we<÷¦-[͵ÊÎ/ï0舛[ôõ7ߨ!k•5µ±ß…§§AgÓ‰ë]_*Yîã¡{h®ÿå¤û„õ€´P°ŸôxÈšz;Ãa4ýtÊjº––þ}ÓY{ãÞ°ú|ûß! =ºÖSÏ©ÿ©ž,=MО²«VÙ° y0á6…mSŒ?tÍ:-­QhQÏJtÖoÜ=Nr¾ôR4Ná&| NRÐ)¿zÍ|õõ×Ç=f¬©­¯íÂÑÓ £9þ—ŠÆK_¯o±_Jõ­÷í¤j-ëAIØðÒD‹ès® r£ã|·÷5èܨo÷пZŽ:¬¤‰‚‡ÿ’+À¾Ô5oMÃGÃíÙt€§Ì_Œ \)íç ‹|ûÝwöqRÐQ/ŠÛ?©Ggçî=ög-ÐÒž|R»ÕueUµ·lihê¼Ë}RÐqTouQ‘«£:“&OŽÕAáèiБ U v~€ÿ%RÃO7ÕÏšœH‹³7ºn¢»íTòÒÐ} :7ïE½E RêÙ ëiSå-~£@n÷éö caÓ…€p{6à)Ó\ÍkQ@øø“Oì=un7Ü5EëÖEËKïØµÛÖMš£³dÙr[¦¡¤9: ?nŽŽ†ÉiÍíѰ6Õ™>s¦Ý®Þ-> å­µòšÊŠK:¬Z@™2ÅãRù3ôµ×lèr÷ëÙ¶c§­óù_Ä~OŽÞ)¯mŠ&Eût¯ƒC¥+à¸0ôg7_RÀ@¥!k“×tz­2Þ§ÊémЩknî#¢»¹Ÿ¼J9?èh^N¸=¤U]ý|¿!èÏ@®†º`¡z.è¸ä¯ºöïÒe¶NtDÛ\™zvÜ~.\­¬ŠV]Óv·È€¶»^ ¥Ë;•¨nÍíz»ìµ+ìh)l·€ê†¿# GoƒŽ£ñѺoHIÅm~ܵ«uÍÑq5a4ÜHƒ•ÞJPš¿¦ó ‰Vrõt§wW®¡ á1-à1}ýãÅ?:—×Åêi¥Ï¿;gò¹XöÏîKQýÚ¦øÍA“t€gDaCË5«gFAB7Õ*fê¥qu\ÐÑRÎóæ/°áHábÎܹvµ4ÕI :²qó{L…­Ð6sÖ,Ûsä¶Ÿ:{ÎÞGGÏýÖ[oÛíî>:¢!l 3 B¢¦UàT¦çVÐQxÒâê‰òïσÂÓ× “ÍöÓ•Ñq5´'Ü tºÓºûŒ÷–nþWtEÚõ˜*ä¹Äâ.\´”º <Ãí!?´Ð£ º‡BŽn$näIæö‡v›Ž©ù9=½·0TÞi—žJ :Í÷f܃jÿEn ŠÁÉ_½óÚíø"ކŒº¥¨5”4Üž AÀÔÛ↵iÈ[¸þ:º¦e§Ý1÷œ«ŽÕ›|çèhõÂùÛ/rþŽ–ÝŠÎ…sÜ#§ør]Toõá+±íÙt€LÃÞ´@€V=ó‡¾þ :Z×ÝÉZ49›{}ù]•öçì8“¼‚0XèœðoW U Ûƒ:êYu7§Ö¬“–wφ )×— ³ïÂM³³£1¦+h 5î82céýÅô§î‚Žæ#¸{ñˆn:.hM®û‹Ýåš&3Ö»Áœ-çìwÏ‘²Z³öhEÆ­´ H¸.H¹¾?Ø8Z·¨ãËGótÂúÀ`Õ]йӚysÄž˜¿ãBìx@š(Ì»98Ù¬=Va/„ûæBЀ”ëKÐQ¨Ñ—Ïô §Íâ=¥fïùjS7€¿,€'… ôM}Ç9¢PzrtSê/›²šÆXý|t @t¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt¤A@êt Ô4Þ3cW›Ÿ–µÎ\¿« Vÿì¾ù÷OÒúà‘9u­Þ¬>|Åü¾ù¬™¸¦ÄŒ^vÌ\­kŽÕƒ»m̡ҳt_™™¾á´ùyÕ 3~åñX½$íþÏœ¨¸mï)5“ל´ç’öŸÝqnm=yÃÜi½Ûg è@µw˜¿ãBFC tù}ÓÙX˜É%Ü?tòj½mŒ…û AƒMÛÃÿ™g*͘å]Ûœq+ŠcõC 1n=Û×§ y%ç]¸o¡#è@(­‰})t€.VŸ°ç…þ]qðr·Âý}[Jndœk:æ’}—ìUç½ç«MCÛÀ¼ò ôFóýGfá΋çįëO™U‡Êmø9ØñýîãSHšµéL´ï/E%fûéJsâÊmÛ;ô×®ÒhÛÈ¥ÕwcÇ(dèƒÚ¦v{ÅÌ~ ,%è! 1sç…†°…Û{bß…›Ñ±Æ­8nŽ”ÕÚ†ZX 4šàß½]ÃBp.ÝìYÙw¡:ÚÎÖs¦¹ýa¬ŽÂ’ÿzÞ°N¡"è O®UU›çž{ÎÚ¾sWl{h{ð0zŽSgÏÆ¶çcä¨ÑÑ1äÅ_4~ø¡™=g޹u§g ÒÅK–ÚcüøÓO±m\ìµíWÒtUyùþ2‚Ðü5w^l8v5¶=_ÕwïÙy:Τ5%öqXLŽ]¾[ó·_H )Ý™ùßéèU m±íŽŽïê•Õô,L=KôÉÒå+¢ð0jô˜ØöþПAçùçŸ7/¼ð‚ý×óí·‡›Û ùŸ´8êÖwÿñ—TÜ6ë;q SÙÍÆè¼PL¸=_Ò¦chøŒŽn-0emç<5ÿÞ Ùlh½›ZÐ#Üî;ZÖª4´-Ü^¨:è“#FDAá¡§½#ùèÏ 3kölûøÞÃGæØ‰¶gGåËW®Œí“ ArËY;nÿÓ×*5*#èqëß×ó¢ùþÃh¢õß}þ¤æÊ¸óJsÓÂíùÐ07wŒ5G®Ä¶û®ßn‰êj¸\¸½PtÐkË.Û¿ÂÂÇŸ|b^»aCFáÇÛò¿þYl>ýì3óòË/›/¿úÊœ»ØÙ0¼^}3 I+W¯6ï¾û®yå•WÌÏ&˜ÚúÎÕ= ³ð¯¿íÏ Yîy>½–ú»ñ+}#ƒ ã¨JåS§M³'Lœhÿ9w^TGÛü}“‚NcK«™3w®yë­·ÍK/½d>ÿâ ûš¢í­mfÁÂEö÷{õÕWí{±yë¶ØëÄÀ !k vtY¿ê„©¼ì&AˆÛs®*:/Ž—×™uçÉoϘq+[úysÉõœË×ú:­¸V}·Í¬=Zaç Œí@ZJÇÙvªÒ4Ý{ÛH-¾áÎ õæ\¬n°ËJO~¼Ìº¾›æm¿`ç±Ý{”õòè±Þ'm×ëþhÄ3múôØkEa«kn·W¡õŸý¢AÖ!èqþªP¢{ê¬:\nÖ«° 0·À€èçk·[bÇÐðаñ6óqŽæè_7_A¦t4þ4Ü-<î{ȧï¤Ýçªl/Ž¾ÜŠ ²$a¸™¿âÚ¾‹¹ƒŽz…\Ý©çZ¸½PtÐ+%§OGáÃõª¸P£ \=Wæ×û¢ààÊšÚ¨Îûï¿oËvíÙ›t–,[nì0.•ÙŸÕ#t·9þ)ªçŽ=f¬}ÕëMÐÑÊmzüÞ{ïÙ:¢€£2õà¨Îˆ?¶¿þæ;dÍÿ]1°è‹DÿÑëêó­ŽÐão#èq "ê©ÆÑùª†Øvõ¾(´¸sGwbëh¨ŒÛ®Åöœ«¶“±ý:ZqjΖ®z ?áq€4ð{Wì÷QGèÑе°^uC›ùyUç=¬$\zZs{Ü6‚àQc^ wžÌïüaË´l³+K :nÈ›æád :_|ù¥-+Z¿>1è\½Qik˜;žBJø:‘YV]Óë×Ð3W¯7AgÒäÉÑë )|©NùÕkvXŸ¿MËÍCÂÀ «dî?zuù‡Û :@ïè¢[ÜC*êš3¶k.ŽÛ–+À¨açîg¥•¨Òý>€|ÝnéZ--)Àø_êúÞÒ-üm Aëýv˜Vب÷©—Eu“‚Î/S¦Ø2£lAÇÍåÙ½w_bÐMøW™¶{ßþØkuFC×ü)ýìêMœ4É–iaWÖ]Ðq=TzŽðyC <«‹ŠlOöQH ë 0Õu|±¸¡ów\Hl@t€ÞóÏõØøÛ&v„•knNÒ\Ÿ¿ëõɽüÀ@¦ûÝ¸ÏøÜmçcÛ}-÷ÙÅ:Tw|Çw˜¿­·Cצ­#è Å4·Å…õŽø\ùü m]t¦Ïœi‹‚Í¡CmÙ¦-[3‚Ž[…ÌÍy‘Šë7²W® šÚ²O>™°[ˆà›o¿ÊpTöíwßÙçU‹›”-èìÙÀ>V/ÑþC‡m™îË£@§ùJ—ʯ˜¡¯½f‡¶¹×¸mÇN»ÂZøZQ˜þÚÕ9dM+ý4 m o¿=Ü…:7)[Ð…¶…‹þ2ï¼óŽ 9 ZrÛ-rÐÐÔl{‹tôûiq‚¢uëbA…IËwºÿà{C«à„ÇÝX÷Ê­&«»!gZ¨À3aŽVgsÛ*ï´Æöõù÷¡Gi¤…8Ü t'¬>ÛÒð6wNø=:e7£ò•‡:W…ÍFóæ\ÝeÁ\ŸBFÐÁ•4GÇ—mŽN>N=g÷ÓP¸–öì7šúJ_$~pé)‚+}öÝyPr5÷â+»ÏvÕ ‡ÑøÇѼ‚p_ߢÇÃL¥únò0S` ó?çIK²;êuóK'¯Éœ[ÓÔþЮb¨mZð#Ü×wÐæ¶³››‹‚ž¨'t4‡Æí§{Ö„Ûg9:@&8šî§nw4ÑY7!tu¯ ·›÷¢ÕÔì=rÚ“ï‘£ùsîf¢ÓÖån¸™–mÏçÜ*¾\Õ[}øJlûÞ’ìåµM±íŽ¿t»zhÃí…Š ƒ'êI Óвi¿þšsài"è™´:áÌÿºLÒ²ì†ãŸ;ÙV‘R#ÍÕÑÕìð† º:í7Æt:<ê©ñç®iÙõp5P ót#t¡àFÂ*„~`Òñ4ÿ'¬ã÷¨ê|·2‚ô‚§^­–æÎyÛ/Ø¡/Ååuvéß7Ÿ¶iÞA¶98š íßOG=;;NWÚ4/gòã•ÙD“¥ÕKH[Z Ô}îô÷]¸iïù¶öhE4G6¸Û_tžèœtõŒ6—\·ç§.èf¿n›Â’ž3¨ÇU=¦ CÚ‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!èH‚€Ô!è@MíÍ‘²Z3oûSt¤"¶=›{þgJ®Ö›÷^2SŠJ̘åÅfl‡iëNšeûËÌ™ëwL{Â~@šœ¨¸m~Zr4ÒtïA¬ŽïŸÝ—2êw'ÜßÑy»ïÂM3ûE3qu‰½ì˜·ò¸™¹ñŒY{´Â\­kŽí $EŸcwÌÚt&¶=—»m̡ҳt_™™¾á´ùyÕ 3¾ãüëuçfã=³ãt¥ùkW©™ºö¤=Çï)Õ{Ö:ài{ø?söFƒ $ (îËdÍ‘+±ºIn5µ›?¶œ‹5ÊBs·7wÚîÇöÒ ¡ã³=aõ‰ŒÏ|wAç÷MgcçI.áþréæ]3iMI¬nH E]÷ >ãþg9ß £ï¶g*3¾×œq+Šcõ³Ñ¹½üÀåØ1D+ÂúÏA:è*ï†cWc3'Ÿ £+eº²åö™´ºÄl:qݹTk¯ m,¾f¯ž¹íú‚¢±…4ÒÕâðê.è¸sOÿ®8x¹[áþåµM8_ÛOWšc—o™½nvìSnF-=m_×q¾‡Ç Yóý‡f꺮ï÷9ë…šï?2 w^ÌØï×õ§ÌªCå6üìø~ ÷IR}÷^ÆwÜÈ¥Gí…½uÇ*Ìî³Uö"a¸Ï³FÐ0è) ø_2yMIÆPš|‚ŽN®¾z„Z:¾\Â:jìMïø‚qõŠËëbu€LÃ6ý†û9WÐi}ð(ª×۫š掱ïBuâðÐk·[¢0¤×VÛÔ«ªµÇ:‡¬ùçUwAGç†Q»ú 8ê ëuGß“~펳hg©©i¼«Wh:ˆÜºsÇÌ_°Ð|ôÑGæå—_6o½õ¶ùuÆ SU{+V·¯–¯\iž{î9ë§‘£bÛå›o¿ê­[ÛÞŸ®Wߌž«²¦6¶éæ‚ÎøU'l Ñ—@û£ÿ3¥Õ]Cò :®·FóqšÛƶ;þÜ…âW¦ª¡µkÈÚü2ÂG® £“«§žÕp{wnÔ·FûkXh¸ÝçÏoPok¸(De5wÍÈÇŸÛõÞEµî‚Žz4]ÝùÛ/äünÊeå¡òè8©t!¡t`)ä¼ýöð¨±ÿâ‹/F?+ðܬ»Û'› 'Úýþœ;/¶ÍñƒÎóÏ?oŸßß^}«Î–tð4¨çE h ³_Þ“ £+Ò [OÞˆm÷UÞéj”é‹'Ü TêÉÔçZa_á%ß Sv³1ª§…ÂíݹQß'®äî%Õ0÷\šLn †ž¹ÞSõ­÷£Ïp® £ vS5ÓÜ5ͯ ëäC ¸µ`ÇE{ܰN¡"èÀZ¶b…mä:Ô”^.·eeW*Ìo¾iË,\Û'›žùoóæŒí 6þötî=|Ôñs0ªžžðuºJn¢S׺†¬iNŒÊò :'®tõrê¢C¸½?)ܸçÒÕîp;Ph\Žæ˜i>©?Ü:WÐñ¿Ãöž¯ŽmÏ—.޹㠴U :°JÔÈÿìóÏ3Ê·lÛnfÍžmÖnØ•]­¬2?O˜`CÑ«¯¾jFkʯ^³Û\0ò…Ï%.è¼ÿþûößú)cû×ß|“±Ý:¹žß,»÷î3Ÿ~ö™†§ßëÂ¥2óïÒe¶‡JûNš<ÙÔ5tNœó÷[¹zµùðÃÍ+¯¼bÆÿÙÔÜ®ž»±¥ÕÌ™;×㥗^2Ÿñ…9pøH´}Úôéö3~ûÍ|ÿÃæ…^°Á©±µÍ†Åwß}×¾f½®Í[·ÅÞ–'t´øÀ¢]¥ÑqËjcu€F /-å¬ÏôŸ[ÏGW|ó :{ÎUEõŽ—×Ùùn¿uì«%kE?o.¹nî´ö£+Úš§çÑPÓ\¯ (º0æzS4dLeù? è³±ºÁ.¢s@Ë®k¸¶nŸ Û(äZGÃAuŒ™ÿ¶õ4äSË·k˜ªŽ£…w4Hß™á¾ÏAÖ¾ƒ‡¢†þ´_µ½9aQ£ß…ÑÏÆ½eCÀ”©SíÏ*S£~ÌØq±cˆ :'M²õ4LÍ mÓ\¡±ãÆgîžß,Ú¦À¤À¢Ç & ß}ÿ½ýÙþ®ÁDÇõ÷·¸¦Þ…•éõ2$úùÜÅεã]ÐñiÞÔiÓìÏú]õ;¹¡aO KenìhP]¨j°óÜ15W ¬ DËYÓDÿꆶ¨<ß ãÏ9ÈeÜŠãæ|eÏz|Ô0»Ýrß(7üG“¹Õ‹Ö ‰†Ukñ}fgl8e‡H«<ß £¡ÑªóKQ‰ÖžO>­ÊÖòøø> év xü½«ÔÌÞœ{øî†n?mDþúg±íp ô/¾üÒlÛ±3cè•ëùùö»ïl/Eó½vóÃ?Ú2Fz2tM½1 ÿúÛþ¼~ãF»muQ‘}¬Þ—ðØÝ=¿XŠKJì>;wï‰Ê.–uNü^÷ßöñ;ï¼cûûmØ´ÉþÎGÊÔcäÂàk¯¿nëk?÷ÚÇÿ<Á>vAG=Fª­²Ê´Þ+7,P=d-¦¾×ø é*˜æ! ”Éœ@.§¯ß‰>Û»ÎVelË7èø«B‰î©³êp¹]eJ 0]5vÛô³VO ÒUæðÜ“N›‹U…· .ú¯øšý̪GçrMSTžoÐQohøù×ji»ÏUÙ^]`Ð=tܶ%{ã+ê\ ¡sPî”ÖØ9oê%r½N²ÿbÏçÙ=)dPOÎô™3£žQi{йJ‡ç*SÐÐ6ùò«¯l™öSžõ(|¸ŸµÍOáÂýì‚NwÏŸ4×F½-®¬¥½sØÃ‘âbûX½2zœ´Ÿ¨Fe»öì5³ç̱?¿÷Þ{Ñs+à¨LõTߺæÿ¾#>þØ–«‡ICÖúsžœ't~ß|ÖÎgëz*] Ð•ÞpøK¾AçhÙ-;ÉY÷è8ŸBÂ… ô\aP¶ £»·ç”€gIÁÆ-#®D˜OÐñ—l… ] ë©Ö¿¿[¸ô´F"øÇÑðµÚ¦ø²Ò%·£°£!qzag ƒDw›[Ìšµk£!VúY寿ñFB’¥:= :ê5Òc͉ѰSgÏÙò?ùÄ–»€à‚NwÏŸXr eÓã¤ý$ Zë×Û9=ás: †ªŸ-è(´}õõ×û(@ÖÖÓØ-d} :Wj›ìþ¢+\Z‘Ê¿¡aoŽ w‡t]áÕÊgáö|ƒN>n5·Û¡kîxÝLŠÖ¢:÷4dM73Ôœ·¯&u_ν:ð¬h™»ßš†[jÕ5{>AGÃ5] Œïð¥Ú¨ž.ÐùÛü…Bˆ´„|¸¿ãþ?Ã¥…qA— K½) Z|À/ל5Ê^ôØ-  ÃéIÐ1b„}¼xÉRû8<¾ëQqA'ÜJ ,} :~ÎÌY³ìÏ#GŽ=¯“-è8 <šçŽ«ðÖAáèkÐI¢+Ók펫›+†u€@wAwŸãm§’—iîÏ #þ\ž=çz¾Š”z‹ÜP]t¨k憡(<Y“¤€’OЩjh‹êtwo)Íûø¼¿òxƶCÞrìÝÍ¿ñWÕpÔpû³@Ð¥Elðøøc;¯Dešø¯ð£r7—Ä ßÒªcWot~±]®¸jìš/£Ç.ý2eJÖ¥•]ÐÑñõXÀ ÑÊj*>¼óÞ>.èt÷üI¥§AÇÍÑ)9}:*ÓsìÙÀþ¬ž§ý‡Ûýn7ܵ¿§{½IAçRù3ôµ×ì·¦¶Îî^Í}R=­Ú¾7(O"舖çtÇ·=÷Pˆ4dmòšÎ‰ýZ-¼•ÓßAçôµ®ù@½]ÌCËìºcd hÀ³R^Û5d­èHòg¼§AGórÂí!­–èêëüvå~ÐQÏh¸ŸOÃåÜð5ý¿n:°Þ6,jØûst4|íÌùΛ*ü(d¸mþrÒn™å¥Ë—g'¼¨„AG>ùôS[憳Itº{þþ: 2þªkZì@u´êšV`såZ”À í›7­“t´ŸVzS¹ÂŽæõh_=Ö{¾7(O*èˆVÁÑq5„&œ×ºð.énˆfÈ}ÎE÷¬q彿¯y îx&nχzUÝ1´ b¸xV\¿¾´ŒsxN‰pŸaÍkså'½wÚº†®ýÙMŽü³»kAŽF¸ò-Ýôèˆë1RÔ¹ Ô³FÐAäfÝm;ÜLÃôJ˜B†zzÜJeΛ5¶×Fuõv¸í MͶ1¯¡!Zw»V q’‚Ž+ÓÐ.Wîž¿¯AG«¥©·EÏ«ckÞ–‡vÏ­™…‹þ²«µ)äè½ÒÍVÝb IAGôžèþ; : Qê9Óï”­Ç …¡'AGWÀT_t%-Üò—è¬oeø ?(ôÖ•[]ß ·šÚícIZÞÖ§¡gî~Žfîüëî|jnCÊp;ð¬hQŽð\é ÇtÇÒ½¬ÜœP­ô>WÈÝ+Güõ0¹r­®îçSÏîÿ·ww/Z”a€ÿö:¨Nê$ê óXP¤ „ê â¯%K–ÐtÁD 2Åάßȳûì¼3ïΈ¸ïÞ\׉3ózâãÌïù¸o+:çÄš Ó—à\²7¹Ÿén½à<8üëñÆÖZ}ÐI©Ûöç§YËÖ™voßéýëƒ{G~å”Ò¶}P[2Ó ¯KJ5ÇÊ}Љ¾9õ¶Jƒ (­u¶¤Î]K`Úö¾Ê¸nßÞK®¸¾j‚ÀŒ5A矧ώfÏr˜óÑ“«|Sî><þPœÛ_ ,9£ÓoGÛ6I-žï}zíèÞ;݇[?VOÛŽ– ˆíÞô)_‡]·äŒNô+DÛÆV*¶û.|wkãúÞÕã­ªÛ&ú¦¤©v8¾~€k‚Nô¥5Ó«#•lÆ÷äÕo[Û¥Æjðª- :iœ›Þí¾~Þ¸çß“ׯU¤2뜳 íúW¿NȬvz|äžø¾3QvÝÒ “q‘¹íÞß7ªÎ mVjÚ˜˜*ŸUÐÖ´7z×7Ï^çŒPÛ¶öÎÅý­+?¯“ 0cmÐyøøé‰-i9Œyyÿîóÿx0ÄÎìq{¡D*®ÍU«‚ –ȪNûz16†°’±“2Òi²Û®åC+gãßÈxíãƒËׇmq?ßz0ôôÈDDýóýÓVÃ.Zt"cë®Û‡ÿ‹+÷†‚—¾¿}¢·[ ‹ŒŸoúí¡ 49¯“þ;Ùn—‰½þÚT:+‚ÀŒµA'î?z2ìûoÏÍÉK"‡¢ÇÏC%KƒNd¼½}ñx¢`J¶…Nõ食l˜’jVs+>p¬ :‘1ÓÎÙ̹ôÃíaåtül/“­ôõ”„¦]kÄ+èÌx™ yY¤™âÇßܶÓä?ÿ̨½ûÉ/Ãæ›þ½ñ T´&èDÂf›?úâ`èžP’UÐôøøòÚᢲÔé"ÿíï÷‡Þ!o]Ø~#yïöÛ0cm8ãgàÊ{)ï§½«7ŸßXñNJ¸”—ϳY!}sï§aëiv,d¢o|ÿYt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(GÐÊt€r A(ç?}}Í÷ L]£IEND®B`‚82-1.11.0-04-upload_basket_snapshot.png000066400000000000000000001235221516513262500351730ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/82_changelog/v1.11.0‰PNG  IHDRw½¶ßí€IDATx^ìÝçÕÿ÷ñë„„л D ‘&|Aé "MAQ@zï½÷^w>×¾'|–“³%›d7eyÝx>’¶Óvæ¼çœ™ù—<5”ÖËÿþ­H¼ý€ÖàÿÅP|qx@Ëo? 5 Ü58< e‹·Ðîš@вÅÛh wM hÙâí´„»&‡´lñöZÂ]ˆÃZ¶xû­á® Äá-[¼ý€Ö€p×âð€–-Þ~@k@¸kqx@Ëo? 5 Ü58< e‹·Ðîš@вÅÛh wM hÙâí×$î?°S—¯ØáK·íܽ,ý€:!Ü=´ÍŸ÷´¶mÚX›D[k[ÙÞ:õb£¿XkÛ®<É2NÝ¿`ß}ÐÎÚTް…§göo¡âðÐ ¯Û©- mÒð¾Ö¥};kס‡ ý™-ßwËžÆÃ6»íè‚~VѦʦþùïž*ìW´_¾îþŸ=82ßT¦‚Ï Åv²‰‚Oawu9½g jŸú÷žh ÷\· µú?¶×ÚÄ~íSáý]›þçMjðZ)å¢é}¼•VJðîß´ß’`÷¦dEÏé¶®­Kî.Ý¿d‹F*ˆõ·ÙÕt»sÞÖ/˜bCút±ªÊ*ëÐû=›°p‡ºûfz.ì²ySß·ž«¬¢]gë=|º}»ójMá7#Ü=²ýë'[жÖnàW¶)Y Oìøžlê}­SU•µï>ØFÏÝj{ïèûwÙ'©T³âjT ^l»ŠU³˜Cêíñ6©*îºÍ´Ï‚îÿ^±­‹¾±¹ó7ÛÉÿgOöÌ´Îm+mà—kmÅÿFØ;ª¬ªK?«ž·Ã.§ƒÑv÷ÄÏ6{ì ëÑ©U¶ïfýÇ~e?ŸyRSû÷ꆭÕ.$ÇØÜŸÚðw:YUû.ÖoÌ\Û|1j/®Û_ßM²¡½:Z»ÊÖm@µÍÚxÊî½Rÿ7ánâª?lþ„Öµ}•uê;Êfo½lO‚e{rõoûnÊ0ë­yíØÓM˜g›Î=MÍËveÝhkl+ý>Ù¡p«eXo3G÷³.U•VÕ¹· ›²Ä¶_÷àÛ8ñö+º»'훡UÖ¶ËX[|âafÿ×.œÛdzVXEß¹¶õvf´l÷O“¬GeC’€·Ñ~¨ìÚXÛŠ6jÅ ;“1”&Üݽm{·Ì±©@’Loi¸»¶yV«h[e=G~f³æÏ³)#{%Ÿ~w¬&¼Ý=eß¾¯ÚŠž6ìÓoí«¹Sl š­µßæy…»GvjÏ·6¸½BÏx[z²¦|fníûÚˆ©3lü°©ï¨´>_î±Ó©À¹éÇåöéÈ®©ù­´þŸ,³ï6²÷ãe*®8<ÔÛ«ëöÓ˜Ö6µ®úN^i;.=¶çñ0ÿy¸ÓÎÒÉM]hËV|kû§ÖgêóG›kšn>¿¶ÞÆtJ­Ÿ.ClÊÜE¶ð›©6XŸ»b¿ßû/îtÕ ªï›³t…-œ9º¶mk•ý¾±ýOô]/ìð‚V©ù?×¾_2Ï&Ðüu± ¿ÞL}‡»Ôö¯ì’ ŸØôß³n•ª}üÐV_y•Ìï‹{;lÆ;•©¸› ýø3ûtêëÙNÛs‚­¿ú=<ó—­^>ÃV¦Bxñ6oõ:ûûê+{që7›Ø55\×÷mÆ‚¥¶`æH뮀?à[;†ßŠ·_±]Ø;ÏÞ©¨´߈jìbOlÿŠ­]Ûî6u[ÓÔ2 Roíd뼈‚Ýè• vRÄpÏ`ª`ßm¬}çmFïß±]nµ5›÷Ùþ;Oíâ½GvîÂzÝîMíÙÅs?ÚðÔçÊVÛÁ$p=±ë?µaï´©/ÛÅ ÜÍß¾ÑÆõ¬°¶íÛÌ·jBåý˶tL*ÌTô²É[^7e»sÈfHˆŽÛIÍ^+l–™òìÆN›;¢[*¨¶IÚêö>Õæm®x¸K-|ï>ª‘ê`ÃWœµóÞÿæV› ‡Œtf«N^´gäœý8MÁ¤—ÍØ©Ú½Öîÿ>´S­²/Rë¶K²S´µ>µß®ü“ô÷p×ó«ƒé'h>;¾ÀúU´±ª©&aIMo]g³ªZ7Õp¦wª*›°é¡½ðp×n”ýxã¿ôw?øcJ*PUXÿ…§ìY*ìý1½[ò SÛ†¿OØ¥Ga¨ÊvÏÝ+»øÃ«lÓÎF¯¿•úžë¶ZÍvÛ´Õ×Þ|Ï‹GؤÔ6¬è·ÐŽþ“=Ü=;·Ü†¶K Óc”}ùã6Û{î®=~f‹!Þ~ÅõØv?Ô**ß·oOæ¾oôâ•]öå¸6thŸ$ì¶ë1ȆŽüÌVœx1,Z‰û—mù¸NQÅX[k?òÛܪÖPE wñ=w·m}ª:Û„_SÝSŸþ¬w*Ôu¶!³ÖÙ†]mÛ®%6B5wîRã9ºÉ>ÛÏ:VÔ„—Š.ƒm¢]¯o8|î‚Ñmòf;üºYåÅ kíƒvq âkmÛÛÄ-*·âpxrç¸m˜9$yªN‡1ëìÒ«:ÂÝ”mI¸{~i}ر­UölËþ<`‡O·Í³jÖÇ„Mr†»§{fY—Ô´{Ì9LûÅÃÓ¶þËÑ5OìÔÕ†ªž6|æz;úPãäw«kÂݨu7íÅ?§máÀJkS5%]û—xyÀf÷P@Ÿe¿ÌîôôÐË»–Úä!ݬ2i†ZaûO´;¯×ºŸ¯¡âíW\OìÈšjk—¾Ø÷3܉ól`ûš‹ ª·î<µw­Õýë¶é«¡Ö>¸Ç.Ì*OÑl€Ò…»mÏ’÷“¦yƒŸ¶ wþ´IõtÀ9¶%]“·ÅÆEáλrÚ¶nZnÖÜ36fýÕ7Í2Û¶³w¦/³Ï‡ë>¯©ðx¥æ{¯m²±ºÏ¯ç$ûö·m¶~kà÷í¶ýbkl–ùŸ=ØŸ 2O²Ï~¾XÓ Ñ=ßcŸuÓ}l“mËãBÂÝ+»ÔžUÙØŸýõ ÿÚÉ%ƒ“n¹ÃÝvgóD«j«ûÄNÕš‡ÏîÚ™[lѤwS%þfíI}Oá.©¹«L¾gõõ7!òå£m6¹Žš»7þµû×NÚ_ëæØp݃W5Ò~x}?_cÄÛ¯Ø.Yd*+¬çÌ]v:Kÿ7Û¡_§[ïvmØ¢#®¦@3¹Í~ýjH­`×6Uv–Úo[£^éÂÝÝó¶dLÇäþ°ê7íâ­­6AÍ»f?ßÔ0OìäÎ9ÖWËxîÎüþ™õêÚ݆.|ý€•”Ó¿NNî¯êûÍ»Üs·àÔc;d™ Õ4{L³5 n÷ÎÛÂUÖ¶²¿}º3x-ÕCö˾ë¯??²?¿éŸê·³,OñÅ᡾žX˜´Ê_ÙîûoÂ˳+kìC-×™¶óy!áî_;½tH*`UÚk®×„»®Ûúñ]’íW+ÜUô³¯?«ù®W·mã„NÉ=wÓ·?±w~³É½ºY íÊëæ/nÖÜ?ÙîßìRúž»<á.5/Ç¿¯y(ËðU_Ïï+»öëÄdjBbªÛ£ßm¢ÂÝ€ïíxîþµC ‡X·îmîŸö?¶wNjlÛÍ>ßWÓDµ1âíWt÷/Ù²êÔúl7Ðþ÷×:^sðÀöî;Vò‡þ DRÁî—9Q°«èn.?dÛã{ðð>kxÀ+b¸«°ïO¶‰S§ÙÄ)“ìƒ]“ûê*ú̲_®¥‚×ý+¶rBçT¼Òº ›lS§Išô% ×s¶ý¦‡¬ø; Ú½c#þ÷­Í?Û>죰Ö×þ·ó^–W!<°í ß³*…)[íè}Ư¬Ÿž¸Ø¾ Ÿú¹MŸþ‘ ìZi=gÚÏ74¿OìÐêÑI-SUŸmܬŸ‹÷’õâðPo¯îÚ__ôO–³¢s5y†Íødœ ìR‘< dp* +ÕîRÜøÞè©•úÛ¸Ï>·Éï÷¨iÚ˜ ]c6ÞyîÚ¤†é2È&Ìœm3ÆôMíŒmSëõÓ(Só³ušÂT'0qŽ}·ô{û|t¯$¨ ]vΞRs—êöâÎv›Þ+µ •=lØÔ/lÖŒQöŽ^ùÐeœýtùõ=|/Ùœ^©ý$܆NœaË>µÇ'—$¡¾²Ç6cþR[4oŠ Lžø9Ý~¿Ô6P¼ýJáÂÉTV­kûöñªýv8¼·ôîuûkýjû‰ûëZ½‹7ØWïwLßg—»Ç_·ÊªyÈÊ›×$´µöƒ¿±ßšÿ=wac¥µïÚφM[b?ŸyS@½xi}óñ`ëZÕÎÚ÷j¯²iýæÆÚòK5 pîô6û£¡Ö£c;«h×Ñz ùØfo>kg5Œp—êvûˆ}9¸*¹'iâækvñÁc;ò÷ ›òA?ëÜ>êÚw·~Õ_ÙÊ#wßÔä]?d SóÑ¥}•u|o‰m/ÂÍ‹ùÄá¡A^=´ã›¿·OF °î©uSYÕÅz¿7Ѿ\Ìný[3L!áNO­<·õ+Ý·³U¥¦Ñoì<[¿ä#ëжÂúÎ;fÏÒOËf³–}i£^÷¶åÒ‹ôü¼xrÞ6}ý‘ êÑÁ*+«¬sß‘6}Å>»öºv­p§î¯ì°“ß³^ª¬]‡6pÜÜÔ>£§iú²ÿkW¶c£útJÍGO›ñWÍ“6oXiÓGöµÎU•VÙ¡§ ÿýš¼/˺«§xû•Ê™#ëmbßö©ßŽBû»6xäXûpôpëÛµ*éÖaôÛ_â (½‹WöÚìa£`çÞ¼¯ýà9öËë\ÔEw¨KZ´¬÷ܽ]âíWR·ÎÛ/+çÚ„Yïî]¬s·ÞÖïƒÉöÙŠí¶÷fÃØhY.^Ùg+7åzÝÁÛ³y£mnD°Â]ˆÃC‹F¸ËØ~@k@¸kqxhÑwÛh wM hÙâí´„»&‡´lñöZÂ]ˆÃZ¶xû­á® Äá-[¼ý€Ö€p×âð€–-Þ~@k@¸kqx@Ëo? 5 Ü58< e‹·Ðîš@вÅÛh wM hÙâí´„»&‡´lñöZÂ]ˆÃZ¶xû­á® Äá-[¼ý€ÖàÿÅ[@ëC¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸kzôèimÚ´Iܺw/£SùýÏ¿Òó1}ÆŒŒþ(¾ ?ÿ’^ç³çÌÉ踢„»°*ýû÷Ï&4z̘ZÃ/Y¶øÀVÿô“=yñ2cøÖˆp€B•$ÜÉésç3†…“¶mÛ%Ü¿t9 Eñw»ŠŠŠdÞâñvïÛg;vÌÞ 1Âî>xXkœb…»ûÛ#Gf|g¾y&Üeš¿`aƺ }lmØ5E¸ ×[Ü­GÉÂÝw‹g 'k7lȶ!áîÅ«ÿlà Aéi¨ökâÇ“’ÐѧOŸtwɧϤÇ;{áb2¬÷WmOõØqöÞ°aµæiä‡Úó_¥Ç+V¸Ó¸á¼©¦©:õýa€SÀ;rüDzÂ]má|ˆöÕzŽ7¾Ö…ƒI“'gŒÛÚîP¨’…»~ýúe '£Fζ!áNÍ}üvíÚ%¡Íû©IÞ˜ê±éþ³fÏN÷ ›„j^T“æýö:d:tH÷ÿeÓæt¿b„»»÷¤§Ñ¾}{;|ìxºŸæYÉûW§Ÿ÷#ÜÕ¦ïóñ¿Ï>K‚¾÷Û³­€wíÖíŒñ[ Uôp6“ŒïÓ}n^ð‡S¸SÈÒ}SÞí•«éñTƒ¦{Ó¼ŸjµÔ´Ò?g ’;ví¶Aƒ'ÔMÍ8}ÕŽ]½y+c¼e+V¤‡öþûY—±¡áN5I> 5+Œûkýx­§Ÿ$ÝÃp§ûÙçŸ'ëCQ!öø©ÓÓzôìy²^ ˜¾§Pó­ûÔâaå·­¿'µ•ªÉÔðC†µŸÖ¯¯œr…»¿÷ìIoWýýkçßé~üµ=¹·PÓU÷Ýwmî×ßd„T}—†Q“Ø0pg£a|>¶üþGF-§oû£'N&ÝÂà¬?ÿÛÉ>¨e\!kéòåÉz“›wï&ÝÂp§}¸Ü¢ÚFÍ·OC¡0nf.“Bø_3/c87uÚ´ôzÍîÂ;uîœîÖÂ.Y¶,czNÛ1¬U ×ͯ›ËX/!…uVA£Ú¹0Ü… BaMíÞj5ß…a0\/ºh+ a>¼.VT—1ŒS`÷ÀîwÙ¶½è·.«‚W<ŒS¸ÖE WW¸«Ï| ù=Ü-^º,ýÀ$ÃáT3¤î}ûöMžéãx øù×Ménjzçã©¿wÿjî×éî“§L©UØÔ½W«V¯ÎYØWm›¯‰[Ø4Ó ÓØp÷ðé³ZóêìB„áNµ[3gͲOgά>Tcäë¿w׸_~õ•}<éMSFMÃkÇT åÝUôÉôéöù_Ôš¶‡Á8Ü)ø†÷=N™:5¯ß¾“:]ºvMÂj“Âf±ªôyö`¯qâߘú‡µ¼šWM?WØö¯jhU[6ßU öáUÓåݵþ¶þ±­ÖC\´Lþ]ñ=€Zÿšv¸4¿À·nû3Ý]áTÍu5°6{Óo[’aã&ϺGS¿0¼k»ùEˆc'OÕj–:ᣉIí£ÂtØMÃjßV­k8}}V°­ï| ù=Ü©ÖÐùÃLTØ÷B§‚Èê5kÒÃx¸»sÿA:¨î;§K†MâÔôPÁû9}š@†÷á‰î½óa¾]ø]Ær¸ž=ß„9’±Œ wª… ç±®¦‡¡0Ü…÷é©vÓ»« žº©¹£­Ã°éé¼ùߦ‡ßøË¯I·°©¨¶›»mûŽtw½n@Ýâp§0çŸÕ´QÖÇ›Í*ˆzwÕô)àIî?‘4猷Y. a`qêöãÚµ!/ wz¨w×úòîZoꦀª0ªà¢¿a°BŽïÁ?\/¾\ªÕ¼QÝT+ëÝÂZJ5aõu£eP·p¿Ó´}^tf¸ŸzóSm+ï¦W}ø´õû kXÃõìÝ$œ÷úÌ'š_ÑÚˆ)Èxó¥wù0*‡Mö¦|aÍÎÇ“äOÍÅÂ'XºCG%µñ+TX÷# w5Í'îÂû餡á.¼WMAÏ»ë>4u ƒFõØqváò•4­ ïç™ üam¢‚³‚º¨ÉkÐ'œ‡pøúÌ'š_ÑÃ7á k‰ÔÄÏ ÝäTÀ÷þa¸ Ÿ¨©&p*Ðúp^;! ^#å÷9…—âîð>¿\TQ@ôaTóW̪„µ*aóÊî;T³AQ3Uu«O¸S¡Û»å£{ÃpçMóÉîDµBñð¢f´ú®øá$ ÐŽêCóìÛ=®-”ðÉ¢áÔ½>áN¡(|x‰jï<¼j¿ñî…„»°yª‡;Ñwè.ºè×8낈oçú„;…1ÿ¬í‡u5 õþ…„»úÌ'š_ÑÃÝG?Nº©0ì÷~uëÞ=ÝßkÂÂ&bñ{î¼–O…ÉîÝ{$ÿ«ù`øèõð~/ÕHÄó> ƒO!¯BÃQX/F¸ ßϦÏÄýãûò¼à\Ÿp§ûļ[!/ñ›e†ÓV¡^áEü'q¸SÍjífŠ¹ÃšB™?žß‡×o¡t¯˜¯ïŽŒ 0 =Œ¢nõ wá;Õ3¶¾á.¬‰ÖÃjây5UóÍð!.¾Ô'Ü©[x!¿õm–Ë7Ÿh~Ewa𠟢÷sy¿ðA(q¸Ëö(w= 1&| ó÷>ªÕ?¬ñ;n|º{X8_b®°6ÅÓ½_®e¬ð!%zÿ™óÒýâ—˜‡ïØ«O¸SÍ£×°(\ë~Äp´Lþ4D ø>P%|Ц?¹4 1ÞmùÊ•énÚZu×»ì%¬qUè÷áu—w/ô*.ÜFáÃQD& k^CZŸp§{=ý³j}8ÔðI‘ÙžbésQðô ¢&³ê®ij½(ˆù» %l‚웩o¸ ¨¢èø°ª_î{a\ØÔ²>ó €æWÒpÖ"‰?-Pò…»ð]s.|1¶(Ì…µ;vLjª4]p\5Çôñô0—ð ªMÒ½Ea!WÁ/¬ —QðPØÌ&Û Å¦>0FáKa³zì¸t ¥h>Â@TŸp'á{àôªåT3X…–ùÜÅKɰ zá°z¯jx´>½»?î>[ •jSû÷ïŸîî59ª1ónj¾§§-îÙ¿?y,¿w÷Z^©Ï«â÷ç)„è^OÍ{8ߺ÷ÒƒV}ÂÖqø¾:½BôDÐð{ýÉ­q¦†S¸ ïWÓwø}–ὟÚ´oëžAísÞ]ß§aëî´O„û±.lhþÃûPµ¿‡Ó ÷/í#Z—Zoõ™O4¿’†;]í Îzñ¸÷Ëî$|会ߩÆ&æÔÙsY‡R?~°Ä®½{k5'Œ©°?Í2\Æ|T;ÏgHMÛÂe‹©`?^¾¾áNë]OÏŒ§íôýáPÂûczðJ¾—˜‹B›wWpÎÖô6¦Z¤°–®>/1×ü詬ñ4C °á‹âëîÔ-|§]( N¾­Ãõß[è¦ú3ß> ~þÔÎú†; kScª-fÖr;ÕÀÖg>ÐüJîÄߣ¦GÓ‡Ýë wa³K´¸¿SáR¯YPÍ‚‚jŸtŸ_¯÷qÅÃ;½÷KïS­“ äªñ î &á=~Å w¢‚³œ˜Bˆ‘ ݪ1ÉVkUßpçß¡f€ê® +ªQRÈð¦“Îß릚&­­ÜÕä1¬½Ìî$¼Òk=ÅÆ¡éjôÒs5Ôý…áøº7MëBë$nb›‹^Ø­íôî»ï&󬇴øôµ}Ãaëî4ïÚFº¿Lû”šc.Z²Ô¾[´8=¬î9Ô°ñzÑþ¨ÚJmW=Y2|‡Spú~ñ’¤¿¾_µÐúè;à  w¢ÏªµSˆÖ|hi½d{ª©–YO6Õ… «uè5ž…Î'š_QÂ])(xÁUG‰û—‚‚Yø…”0àÙÄá.î4…îԌқª¶ ~ÕA)éž9Õ”©O¯%ˆû1ÂZ‚îÔL/*ˆ¢‡ƒÄÕšîIòGèu!Ü %hQáN÷‚y!Ùkíüá@KE¸@KТÂîoÓƒ+tß›šeÆïhZ"ÂZ‚î C¸€2@¸€2@¸€2ÐèpwçÁc@‘ÅÙ«.w€æG¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2@¸€2PÒp·~ÏEûòç£öàÙ?ýÅS²p÷Óî 6fñ®ÄŽØÃç…¼ež¶™ëgt—‰+öÚºT`Œ»çòôŸWÉ÷o?y#£_±¼x7ù®[^dô€R+I¸ ƒ]:àm,,àî þŠî²»ú<ÂÔ_QÃÝ‘Ë÷3]lõßç3Æ î®=x–Lï¯Tp›ûë1ûhù›¾æ€í:}+=|¶pwçÉK[šúMKã,ÜzÊ®§¦~Ï©ëìëM©i¦†™²j¿­Úy.#”î?Çþ÷ÓA¿lOòý¿¼B¸ÐlŠî^¼ú?»õøEpâ<ÐMÿñ@ÒM¿|•1^¨¾ánF*мöÀ.ß}j«wÕ|癓aâp§ïþ4ÈÊöœ¹´YÛäT€»÷ìe2ÌÅ;OlÜÒÝöãîóvúÆ;pánò „>go>²êÔt ÷§úÿqìZ*(î%Üh6E w¡õ{/¥ÃÂTÜ?—ú†;…¯p˜ÏÖ²%Ûj‚XîþgÍÝw[O%/žvXs·v÷›¶z­f™?¬¹›òÃþt3NG¸Мî.Ý}’®¡s“VíKBוTÈ“ó·ÛüßNd ·bÇÙŒééé—ê§´°»¡ººTæ<Üí;w;=Œà'©`¦Ú?}ŽÃݶãד€x3`z ¦š^z3ËwO…ËýÉÃa|˜•©ù Ã]rÏÝÚCµî¹óH¸ÐîNßx˜Ú å> =~ñoRó¦W¨é£ÂÜæC5M-¿Þt<¨<Ü)Hêõª TÍœžbyþÖãd˜8Ü=~Y3íÏÖL…Â;Im›jì4»OkB™B©ÆQðÔÓ4—o?›LSݽ~¹[5OËTÈÓ]~?ÊÓ24¯& wj¾©¿Ç¯ÞOš_f w¢Ú´ {kŒ2aùžä¼ß^MšãánÓÁ+ÉCRtŸœ^¹°ç웚¼8܉¿çNaQÓ^°åd2­ðûõTMMk²=I³R…<ÍÃ¥ 6q_ªÛŒ5“ïUSOjî4§F‡;5»ŒC\.zá·þ*T©æK屢§W¨\÷ÜÀÛ¨ÑáNtß^$^ªÅ‹_h‡Á|Âp÷knñú€R+J¸kÔÜÀ­6ÜÞ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Ü@ Üh?í¾`Õ‹wÙ ˆ´Oiߊ÷7ÞF„;%§Â· âã—íÉ(œáû€& Ú¯?x–Ñh íSÚ·´ÅýxÛײÄÝb`ÿ á@ÉQøF)±Pƒp ä(|£”Ø¿¨A¸Pr¾QJì_Ô Ü(9 ß(%ö/jî”…o”û5wJŽÂ7J‰ý €„;%Gá¥Äþ@ €’£ðRbÿ á@É»ð}óÑs[ö×›´jŸ[ºÛ>[wȶŸ¼‘1\Kwáöc[¸å¤M^µßÆ/Ûc_þ|Ô^¼›1\K°óäÍd>~ùoF¿æVìý €ÖŠp äŠYø¾ñðyêf¦Ýß§o&ahÍî V½d—ý~ôjÆð¥0mõ~[·çbF÷ú8{óQL¿ÙtÜö»mû/ܵ;Î&ëIŸãá›[±Â¶Ÿ¦søÒ½Œ~ UÌý €ÖŒp äŠYøþnë)›²j¿=zþO­îë÷^Lj¿FÝÝóWÿetk¨b„»¥ž¶)?ì·§ÿ¼ªÕ}ɶÓ65ÕýE–qšá€–p äŠUø~ðì«NMgó¡+ý.ß}šÔè¿z?ù¼,žæürÔÖì>o¯Ü—n¶©i,ß~Ö&®ØkSÝWîs+™?MÿQ.Cî>Z¾7™¦ÂâO¯› ^¹÷4æâ'IóN…(ͯ†›±æ@R3¯ …FMãÈåûÉ}~ |>ÌÎT`Ôt·½jÇRëW˧ ­užôîTk©ÿµþ>]{(ùìë@ëHÁqþo'’æ² ÔZ¿ßl:‘ÔDÞyòÒN\»ŸLGý´Mâenˆbí_´v„;%W¬Â·B‰¦£@÷‹)Ð(¤…áJ¡DŃ‘(d)Ý{ö2ù|úúÃä-á´T#öÇñëéÏq³Ì°†Í»)¸è»,Ãi…¤TÃ%‹B/Þ«5¿Ù¦ûøå«¤›×ÞÝN&ÕÜ…Í8·¿–̳ÖºÐ=ŠáwïO…3MÇׅ èâý5=5UèÓgwªYôaàÔíÚƒšõ¥ ­@ëaOŽ]­ÙfÈi– @éî”\± ß õ wª= »©VN!GÊ)Èiš'¯=H†Qížš'j\5+Tmœúÿràrz:q¸û+¾4̽§/kM{úšµÆËFãèA0³6N¦¡¦Ž·×4—ôp×T* n9òæá1Z bª±S-ŸÂªÆó ˜m]èžE £J}V€TÍÝÏ©ù½t7sýf»çîÜ­GI7oš©@ùóþÌåÕzTSWýO¸ twJ®X…oo–©Ú ¸_,[ Ñ½`>/±=gjžPé4QÍÖÕ{O“0¢¦…ùÂúÅÓsa“Ϻ($Mýá€}½éxò9_¸ûípÍ}‡Þ,S÷Ùi|Íï¦CW’ñò…;QsÓ°FrïÙÛIíj?I-£úy`¾pwæÆ£¤¶Nÿ+èÆß£àªfžúŸp@éî”\± ß骼6!15Ãô¸læÛ-'“nz¿\LÓöéë áxªyÊîÔ¼RAéü­ÌéÞ|ýÀ•’Æ÷ûÙBjR©yÐCH wkw_Hæ'l–©ûÙê w÷Ÿ½L†ñš»š¨êÞA-ÓŸ'jÂ_]áNŸUk˜­¦’š;šá@ɳð½ ÐT«¤{ÏÂîzdø*„lFHDM!ÃîþÔHu×|ú}fr=FT3†}în²…°øi”NAlòû“{Ôâ~zè‰BU¡áîÇ]çk^ðêMÕÆáN÷Â…ÐÃÚµû5OôTBjø=sRÝ–ÿu¦ÖðùÂ]òеµ"ãPñeðf°ùîE¬¯bî_´f„;%WÌ·–šI*Œ¨¡ž©'H&M ]K—-Ü)ø)˜é¾;5»ÔÓ%5®îS­†Ñ8j©–¨‰¡jÅT“†¹¯~=–¼Æ@OŒô']êý{š/£¹mǯ'¯ðšÄ˜jÌt›ÂêžÔrèa*ªÝÒrèõ ¦p§~F͵Lz̓æWÝü]€þ´L=4åÄÕûIÍžî%\¸õM¸ÔwûÓ>õ€Ý¨yÑEÕ¿p§{õ4o Sˤš9Õ€ªÖN¯qðð©W¥}KûXÜ€· á@Éý´ûBR³¢B¸×²Åàû”ö±x¿àmC¸Ð$TøVíJ\8CûÁ€„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;(„;”­×®µ6mÚä5ô½÷2ÆkJ3>ý4™Y³ggô+¶e+V¤—{LõØŒþ2âƒÒì^³&£1>w>ý]w<ÌèŸÍ‚ï¾Ï؆¡%Ë–gŒ“ͳþµEK–ZŸ>}¬ªªÊú÷ïoß-Zlž=¯5ÜácÇíÃQ£’aºvëf3gÍʘ×ã§NÛØqã­C‡Ö¥k×dÝ9~¢Ö0û²ÑcÆX§Î­{÷6ñãIÉxñ|5áeë§õë­¢¢"Í@Û¶mÓ݆½ÿ~ÆxM©¹ÂÖÁ­{÷jõ¿vëvÒ½%‡»å+WZ=3ø|oüå׌q²™>cFú»ÊüÿOgÎLsêì9k×®]zÿí3 ‡FË à§î¶²²2ù_ÝÎ_ºœ ³ýï]éqÕ݇Ñð'NŸÉ˜·†"Üà­áøßÿü+£_si®p'ë6n¬Õ_a.ìߘpçá'Ÿ†„»l.]»ž„'°‡Ožfôž4)ù³yó¿µwÞy'é¯|\“´é·-Ö·oßdÓ>ùÄ>šøqò=a¸Û¶}‡ 1Â:vìh½zõJ€‡ÕÅ¡àëoæ%ÝêjbêáN߯¿j&ö×w†ýÃp—ož®|ÝjœÎ]º¤kÀT¨åT75ITóEÕˆ©_î´^Ô4Ò×ë•73æ?_þBƒÒo[O–ბ#ÓÝ4Ÿ>/ qêÖ»wïäó–ßÿH§æ”êæÁMë\ÓÒúña>ÿâ‹dw}Ör=q²VM霹s“a´nâùk(ÂÞ^xoH¸»qçnrÏ•º©i7ÅÓýS^[ä5= w>š˜n~ç5d‡ŽK7ÏS“¼° ¤‡;…}V¿÷‡OB >W—ô÷Ú5 Ÿ×wß}7é¶ò‡2–9äánò”)É<ê;´\ê§0¥~ Xšwýïá®®y ÃÓ½iª½0p`z\_g_߆;õWpôϺÏ-žÿl´î}~4½¸¡ÔtÒçMµtêæÛO÷ËùpÚNê6ߌ)ði˜«Veô5×Ôú×0¿nþ-£CîðÖðàÐp÷Õܯ“ϪíQ Ýãç/ÒÍí‚^¼ú/}–šýùtû®Á™2ujzj§š…)uóp§š?…IÏ÷íû÷íúí;éP¨0£ àýëªíòp§š±ù &ÿë¾Dõ[µzuòY —«y ÃÝŒÿý/Yþ›wï&µqê¦{â"µÎÚÔmñÒeµÂ×|­ßøsò9l™o»°®¾½)åÂ糧û¼iy½›jÕMA>žŽøü+$jÝ„ýÖnØž¦hÄã7áo /T7$Ü)¤yˆPo"éµ8^K¥æ‹jއ-oî6ÕÌwÏÂPœ<4ª9¥>+¬ýðãÉÿzÊe<~ÌÖäáÿ«Ÿ/‹š™úÿÙî¹Ë6Oáçp™³Õrix­Û‡g½ç. «^«˜‹µ×Zª©eÜ¿ª]ôšJ5£Õ=qÞÏç£Ðp§>ø[ÿØ–Ñ_Í;5¿þ}ŸÂz<\CîðÖðÂzCÂqïãÇ4Œ‚‘š-†ýTK¦Z,õ÷‡qøC<$wªEÒýXÞ4äOVôÚ!MzZ†xycîÞ6,ù¬eS ÙÁ#G“î Jº{HõpW×<å wšrÕPe w._Iw«+øè¡&Nó†²úøìóÏ“i¨ymÆ=¨í;x0ÝÍ«Æ ‡Õ²xóP½®!þž²¯ÕtÆýŠp€·†‡†8Üù“=ÜHî¼ÖM)žnL!OÍý¾*5ÇTw½SMŸÃû¬âp÷ÉôéÉgÕþ©©¢ñp§ ¤ûÁÌüo]µ\âánÀ€Éçï/I>ÇËæóíá®®yÊî<éþ;ï¦y×úQpkl¸Óûä4\®ðXgžB™×І|=„µ‚þ@•0Ài™{öì•tW-¥jÃélÝögRkn#݇©á¤ãïm(ÂÞâp÷Ç_Ûk ù;&÷Á©HO1T7wÞO÷)€¨Û™ó’চ=ROƒT€ó{Åâ4Ž?ÅÒï¹SSH“íž;Õ é³îWÓg½èÚç;|'š×üHüÔË\<Üù2)dù4DOUw=¬EŸ=ÜÕ5O¹Âßs§à£e ›@êÞ¶Æ„;­{ £`«ïû×E÷j|=ä%lvòà=zLuúUÞ¤Òk_5ß Ëê¦à—ížý!3Úöã'|”t«~ýPšb Üà­á¡!wªQÉö"j Ÿ–©`çÝÃ&ŠíüÛžÿûÊF~øaòYO}=þ_Ÿ—,[–Lãð±ãµ^f­ÿý³‡;?zÁº7›ôïÑø>ϪMòîj¦©n^Û¸tùòŒe—8Ü‰š¢ª›7Õ”8ÜÕ5O¹Â]ò´Ì×ÁGãúÓ0US¦ Ô˜pç¯P³×¸Ÿø“KÕä4î§ûú|´½ã¢ûú _Pžë%æáËÐÕt7ž–‚¾7£õéø4µNvïÛ—1 E¸À[à Øq¸45‘SÁ[÷²éÉ6 B—¯ßHš(*´i8¢pZ÷=NîMS¸Óýušž?IÓ‡Ù¼ekR“£ñõÎ<j¥‡;Õp©ÖPµ€j¸ú§ŸÒ ›s*lz@¸sÿAÒÍÃ]®Gðg wÞMÍH½[îêš§\áNü=wW¡NaÌ›@64ÜiXHz…AÜ_£}=yñÒ–¯\i´ªª*ëÑ£§Íš=;ë>Ql“&ON¾+îÞX¯\µiŸ|b]»uKN~ú­h]=ÿ÷Uư-Y1·µŽáoJë僑#“ß_Ö®];ëׯ_ò»*õ>÷èÙs{çwló–­ý£¹–GнmÊåwýöŒsclúŒã5%­kÍÇÚ 2ú5µÏ¿ø"cýÈÁ#G2†-„¶¥O£mÛ¶Ö«W/ûâË/“ßJûüskß¾½UTT$¦® X—æw¿lÚœLWË£Ï:0ê;ܰ÷ßOv°Ûµ[·3¦Ó” 9Æâå,†%Ë–%?0ßþÚ~ñ0õõÑÄ­cÇŽ¶tùò¤@¥ÂTïÞ½mð!ɉ:¾˜T×zŠ»7†‚]ç.]’ù×´ÿܱӿ»À*++mî×ßd ßR{[{¸[øý¢ä7õûŸ%…NMÿ›yó3†¯‹ÈCß{/£{]ê w{öï·yó¿ÍèžNõY†b¯[ýÆõ›éÛ·¯­ßøsò;ú~ñ’äX]¬‚}. [³çÌIN”q¿†*æò4÷¶‘r9Æi^Ãó¢ÊZG*¨y·SgÏeŒ×”î.]»žŒ£°÷kŒ M´GJÖèæÝ†…1…;]HÑzÖ:W¨R šöWwâáóiè2kÿÕx ]…”gw­G}³.ꢆËî.\¾’„:ýŽvîÞc«ú)ùž¿õ=ºÐ ‹únßãéÄ´o騫ï×8ú]ÅÃ踩~ËV¬HÊp ˜]ºvmÒ )®äáîÜÅK6zÌûmëïéÔo¢%„»˜®Öê€woN… cu-gCŒüðC[µzuú nc >ç/]N¦_×rªûÆ_~ͧٮì4äzöìeŸ<­Õ]ëMˤ“j<Ž4ç93iJ ~ê¦i:]mˆ¿7_¸ûã¯íÉÁUß­äΛN&j>¤܇ѺÐN§ªeDÕ­ÿ€É•OM>uU÷×Í¿%Ãûr…W³ UÒðºZ¢+ÜÚé½)Y¾åÔ•Õ1Õc“ñtõXãÅËYm_M7.øhÇ×:¸|ýFº[õØqÉUÿ1†4/šŽÖkÜoÑ’¥É"6×|k›k:ºÊ¢í¢‚ŸÂ0¥Z†ð€2âƒlê´iéþ:Qª™‹†Ñ¹:5ïñ (ß|Ò+øÅÚÖ¹ÂöYíÇúÍz·‡OŸ%µZ/ZÏúíø¾7ï”M¿m©sû,9f¨5†špÅíòÑ:ÖyZóï·îÝK¦ÖD:z,™¨xZ’-܉ZAh¼c'O¥»í?t()ÇhyURQ¿Ð›o™ó§|8ž>«»Ž*0‡ó”ëw)ÙÊ3[ÿØ–LGÃkÛj»k˜úüfÑü²eƒ.véøyàðádÿ Ã’Zgè÷ìÇí_S¦N­5¾öqM_ù ž¶ÆÏîâ醲…;ísú•ÝÃîjr^ß‹(ÅÐìáNôcUó3?8©0«ƒD®ªL?_½y+)˜…ü@tµ^' ¶Ô<@lj½ «‚±N|Ú:iªÐ§H'õ¿xõZ4]²³5ÈîtðQÁýëoæ%ÓÖ†Ö²jšêïW•?ž4)Y/šþûÇ'' ´´£hÇVØÔÌ›zúI['µé=rüDrpÓÉÄO$ñÁP'7MCÕÔ ŽZßú¬I¾å¼påjr"Õ2jÔ¦XËä…ãBå*øè¦‘]Œ·a<­“ï>„ºæÛOúZgZ7Z_z’—ÆÑ¾âÓ9|ìx2œ7Š >ú‘+êjº¾§:UðÑ Z'âBæCÛNÓ×¾/CÌ·»N|Ú·<ôÕµ×'Üi½j¿S ˆN¾ê¦ßUkU¡Gßï‘ô¶H.ÅZ·:®è÷_Ú_sÕ K]ǰlû¤‡Ã“©Ž-ZGšÿl…éº~GuÍG1–§¥l›bã²m›æ8Æ…r…»º¦ááNM µN´mœÔMó¦ š†š†ÇŒBŽkñþ¨u¤8zLu²Ôìzì¸ñI9Aêl¢iiG}S?­km»­ÛþL¤šee» œÖ‰–Ù/êjúú?¼oGçk £åPÔ…<•]rÝï›+Üéü®é{í°¾C¿=èDÇA-­3Õp¨®e®k<•Y¾×*Dé³ &l⥓¯æ:Èës]ͳ…;}6jX©n:ðé¦ÏîÂZHµV·ð¡:°ª›Ÿ°ü¤íµ‹>Œ ë¾î⃡¬ñÍ?ž”xýs¶åÔAÖOjÞM5 §U—\ñyÕ@ôÂE6:‰ë„¦qú÷<öÃaêšo?éÇ5S:ˆ„ÛRû¦¾Ã?‡ß¿ÂBš r  х̇/» XÞ_Æ-¼ äÛ=,¼²×'ÜÅAJa¨®í+Ö¶ÎîtU_ý|Ýè‚EX3"ºHäÛA²5Ë,d¼ú†;ýæÃ«uÚZΰ9]}›þ¹b­[Ñ~«ùP!Iû¼ ma-C!ǰlû¤§§wÓúð“n\˜®ëwTÈ|H1–GZ¶)Æ1.Û¶‘¦>Æ…r…»º¦áá.lÁ¢m«nñ=•ZÕëÿBŽkñþ¨c®Ž•áyPçN ãçÐlMµ¾µï…µK §*ÓxÎGå^uNVÀÑñBŸµ?zYÄí*Ÿè˜¯cx¶2•Ëî4Õ†x‹….í›aaVt,ôÏÙ–¹ñ¼œnÛ0Üò»ŒË3ZGÚÎá~äM³ w­K¾l VmÚ—¼²!w±ø¢x­Z¶æÄ¹Â]>ÙÂŽEúÇ-t¬U‹ªx¥ÖbÂ_ÙTU¾«PâáN'ˆCNüD¤“¶~`t~°ÑÑG'útð+ú¡l¡'”-ÜùÉHW•trºŠ§Z¶p>ƒžšVª[ØÄÒO>^»é'm„ÂïÔ2ø‰.>ŠNŒº ¢MëZ'†p¾³-§®<êD.ƒNXZ¯ªõ ¿?Ÿ|Ñ]ó”¯Ö6¤}DWU`×;¨Â«ÑuÍ·Ÿôã«ç:©joÞ¥+Aa!5,øh{hظùŒ&~2¯k>²…;M_Ýœ/W¶í^È>^Ÿp¯ruÀ »Õ¥XÛº>áN¿­']ÉVÐÒôÕ?ÜvÙÂ]!ãÕ7ÜùÕuµçÏv¼“R)tÝ:í7:ª°¨ýAÍÐ|?)ä–mŸÝ{à…Jý´>|ºqaº®ßQ!óQ¬å‘–²m{ŒËµmšúŽ—+ÜÕ5 ßvñÕwÕpù1Ìiþ=(r\‹÷GQaR³ÒºÑöRË ãûR¶ £V~‹‰Ó…# 7×*”תjŸönºP«‚¤ö%5)Ç ÕîÂí®àªí®²˜ïoá¶Ê¶Ì…Œ—­œ ù]Æå•aÔÜ:œî¹kre•CU+OîtÜ‹‡/V¸stÑK;tlÕƒ¶ô½ªÍ‡-µîÄ›fkÊòpWÈ=w*\é¤?½IWŸŠ4¬šº*¤“‚Ÿ-ô„²…;_Þl¼½z¶ƒ^¾pç'Ÿ\'íê±ãÒ5qñÁPãjÙT8Pó¨ýÉ\>~¼œ:ÀÆóªÏAÔ§•«àã'±B›°„`TøÖøúa2ß¹NúZ×ú±k]øÉ, ÈaÁG†°i`¬ùðí­›§yÓúðf0ùÂ]!ûxcÂ~—áUØBk[ç wª ×½¶‰ åjÞ£›µµíÔ¿®pWÈxõ w¢Â˜.T©pª‹G^åýK ]·Ù¨fH÷3iùu|-ä–mŸ߯µ>õ[RÈòWÄdzº~G…ÌG6 Yi‰Û¦!Ǹ\Û¦©qáðÙÂ]!Ó¨o¸óù/ä¸ï ²Ú,Ô$Sãñói¾p§si<ï®®rM>Zÿ:·ݪSçz_7ñð¡\áÎ[ù+ ÐÊÔÔUMµ|j«aò…»BÆËVÎ á…ü.ÃòŒŽ£:®†:„p×:åÊjê«}Wû~wáñ#¤‹+qM¾ï·ñ±CŠîÔ’NÇßwÕ¬[Í“«S¿ÕxØRk1áîÞÃGÉÉ_$Uµ‡X}Â~ü:ÄÓóƒM\K§Â‡NÀjö ÈÇ‹CO,[¸óšVh¾B~?O¶ƒ^cÂ]¸cÇáNWâwsè˜/܉Nž:ÇË ñzͧ®‚Oõëû8t¢ƒuLðøD':àëdíW2ëšï\'}Qs 5YÕ¼Æï@)äªv¨®ùÐ6Tè›…9õÓ<æ w…ìãÚßô|õ¸p§«éÅ®¹«.p[ç wúê8¡ß>ëX uðó¯›j §ïÈî ¯!áΩvCëAë:|·S©DuëVÛ=lÊë¼ù™š‡r ˶O:Ì´êDèÍä$>žÕõ;*d>е<ÒÜÛ¦XǸ|Û¦)qá°ÙÂ]!Ó(v¸ kñþèÆü~/ñïÏîtÓýL>=!ܵNٲʠÚÇÕ==H)ž–ž•¡ãZØÍ/ªÅ·%I1Ãèw ß‰šÕë³ÊaY¢©´˜p§§+©š]+E'¯lOtõ wþÔ±°IƒèŠœÂú_ýt“vxô‰o ô¹>á.¹q]'â¨é€‚¬ä²ôêîÂÛObê§ÏñÁPOÜ _«iª[8ßÙ–³:U ѽ[áÁ[…ëð~¿Bä+øh臬{.UÛ¡¦£¹šæú:‹ß¤õªäüê:æ;×I_tÿ¥ š]… û…ß¿Âû5µœ Ò~£z]ó! jbŸ”üž’|á®}\CÄ/ö¦rq¸ ïõÔ²¨Ö©¾/.Ö¶ÎîüÞ ØõÙ—/¼§M3íá5¾¨Ðñê㧖Õo ­×l¾.ÅZ·Ú‡5ñ“üô{ð}ºcX¶}Òé·¨}Pûvx£y|<«ëwTÈ|ky¤¹·M±Žqù¶MSã\®pW×4îò×âýÑŸ$¾>C5oêæáΛ[†ÂJj;v̸¿.ÛCزÑ÷ê"P8~ØdQŸÕDUa\-t|ßVMn<-—-Ü邟•ŸDA+iþNBßVÙ–¹ñ²•sÂpWÈï2.Ïh¹T~ñÖá÷ÄçQ´lÙ²ö8è‹Î³Ú¿ô| ‹UÓ^ŒÒ»BuŠ/4I±Ã]H­t¼V®‰û•Z‹wzb•Nz^8Õû‚teóü¥ËÓú„;Ñ\VWÍÕ],}Ÿ×b¨I¦6®ž<©Â¢ÚåªæNW}çñæqºz†.—-܉ å:Xë ¥°ž õî»ï¦¯Âe;èÕ'ܽ7lXr Õtu Sí§ïÔñÁPó M' òµŒZaMF¶åÔ_§YëO'yÝÏâmáUhÓ8ù®DK®‚×ÚªY‡>ë±µš¯øA'N˧åÖ\mšµüªyQ¡]ÛÙ÷›ºæ;_¸Ó¼ª©£úÇûaü$9]%ÒÉMëTë\']ëO«k>D'sݯ  j¾§ýP˯m¤ß‚®Ôj¸\…µºöqI?Å-uÀQAEŸ5­8Üi½ê»5Z6MÇ—ÝÔÛÚÃÀZ·*àh\¿Ü]­?5:µM4\X£ýZ÷Îè"†_•/d<´]5!/èÅáN5+ÚZ~ýîuLÓ>.§¿F¿]¶TÀÖÕèp™²)ÖºÕ~­“  ~Zn÷4Ÿš†6áǤºŽa¹öIñZ3-WXø‹gR×郞ù(ÖòH¼mšz¿/Ö1.ß¶iêcœËîêšFcÃ]¾ãZ¼?*Œ)¤i?P(ÔÅf¿çÎk­H´é‰z~/.Š*4jßѱJOÔqJÁÅË+š†_€i»ëB³·¾GÓÐg퟾¾tþÖ9Á Œºµ"_k'­O•e´Þ´^µoê< {™ÂíîAQÀtŽÐë´ŽÔÍ/öf[æBÆËVΉïªëw—g´¿è{´/ê ú­ó´ÌÖ)W6È&¾çN¿éðX¥ :FªOû¨¿Ä<|ÿ\(W¸‹§Êît1Lå+]°[ë4¥fw~Jc?ù«›~øºW"Û•Íú†;PtÀPNE4ã½6HõØqIá@'-0«vº:¤›%u€oÖ”\áNThTðÒ‰K'H¬ü&ól½ú„;Õ`h]i¹THõGãK|0Ô‰Có®“œ–SëD¥Ðx~õ+×r*\è$«‰ÆU˜ð«‘: ë{üDŸK®‚š‘êä^­Ô‰BÛ!Û•_ÑÕypuâÓ_Ùn„ >:ùýšZí õ™§eUí–E §·öi&Wa­}\ó¤}TÛV€uP‹ÃÝâ¥ËÒ¡R…‚°¶¯©·µ‡;§“·–A…ˆxXеî5Œæ[XµwÛßk¾½&É/&2žÖS8NÓQÿ8ÜiùuµP¿Mms¾âu¡ã¡Þå¥i« ¦Úüx¹bÅZ·¢eWàÐ>§ùÔüê$[óÃrí“NÓŒƒx|<“B~GùæCб<o›¦Þï¥Ǹº¶MSã$W¸«k wùŽkÙöG %Žú¬uÖò'"µ>Âf­ºÏSÛIÝu|P ­ŸËuÖ÷Ä­,B_Ë­ã‰Æ×9À/Di_Ôü„ÍUNÑ~œ«µ“ ¡~¼ÒyEÇ~ÝË”í>:'hÝè¡ñ.u±$¬AζÌu—­œ‡;É÷»ŒË3âPÛTû¿,p׺d˹ÄáN¿kí‹a ®~oþ[¯ë½\á.Ût]¾p§ã¤¾St¿nÜ¿©4i¸CñÔuÒnJ:©è„‘-ˆ£õ¨+ì ÛºttÂÐUï¸;šû}ëUÈq­©( ª¶©9šix{îZ©–îÔT(ß•H´…‚ØÖ¥¡«èºR_W³?4öûÖ«ãZSÑ}œñ“ü Øw­TK w¹Úú£u)¤Ķ.ÖmËŶi½ 9®55ñÊÕ< Š…pe€pe€pe€pe€pe€pe€pe háî΃ǀ"‰3W]Šî͇pe€pe€pe€pe€pe€pe€pe€pe€pe€pe€pe€pe€p€·Æ²+¬M›6‰1Õc3úˈ>H³zÍšŒþÅ6ãÓO“ïš5{vF¿bkiËúÜùôwÝ}ð0£]N=g3þ÷?ëÕ«—õéÓ'£>Ïþù×-YšŒWUUeýû÷·ï-¶GÏž×îð±ãöá¨QÉ0]»u³™³feÌëñS§mì¸ñÖ¡CëÒµk²n?Qk˜ý‡Ùè1c¬SçÎÖ½{›øñ¤d¼x¾ƒp€·FnÚ¶mk·îÝ«ÕÿÚ­ÛI÷¦ 7Ò\á®%,cÂݦ߶XEEEzüwÞy'c˜|¦Ï˜‘W¡ÌÿÿtæÌô0 íÚµKãëfØûï'áPÃhüÔ]ÃVVV&ÿ«ÛùK—“a¶ÿ½+=®ºû0þÄé3óÖP„;¼5Âp#ë6n¬Õ_a&ì_êp#ÍîJ½ü~òih¸Óx¾øòK»påª=ÿ÷UÆp¹œ92ÝMóéó¢§n½{÷N>oùýôpjN©nÜ´Î5-­æó/¾¨™¿Ô~ ÏZΣ'NÖª)3wn2ŒÖM< E¸À[ÃÃÍä)S’f|ª¥¹qçnÒOaBý0&|4±V¸QxQS7Õy­‘‚È…ËW’a<܉ÂÑÀAƒÒŸÿÞSS;tèè±tó<5É ›@z¸SHÐgõ{øðô÷V—ô÷Ú5 _®wß}7é¶ò‡2–¹Ë_×<…áÎéÞ4ÕÞ 80=®7_Ôøú¾0Ü©¿‚£Ö}nñü‹jмölþ‚…I ˜¦«à†íúRÓIŸ7}‡ºùvÖýr>œ¶“º…Í7c |fŪUýDÍ5µþ5̯›ËèßP„;¼5<ܨfHÁ@ÿÿ´~}ÒoÕêÕÉg=dÛÑy¸QA^ŸUhðøIÒ¬Îk¹¼öÈÃ]u*ð¼xõ_ÒÍkÙ¼–ÇkœTc¤&|ªÉQ˜R7wªùÓ÷x08xäHÒ_nß¿o×oßI‡B…#¶«1Ë_×<…áNëC!ëæÝ»ImœºõèÑ3 ‘Ÿ¿HB›º-^º¬V¸óš¯õN>‡Í#C¯\M#a TM©š=ÆãÔEÛÓ›R.ü~Qº»OWËëÝTc©nj²OG|þµnÂ~k7l¨5ïÚñøA¸À[ÃÆdáÿ«Ÿ±³.¦ÿ÷p£Ð Ï*¸û´6oÙštÓ“õÙÃÝWs¿Nã÷lypóæŽù5=L¾{î†ÂàôÿÛ;«îH’¤ÛþÈÆéjf¨fU333C5333333 |OqkÇ£eeé)E¦¤œó°—”žŽfvÜ="µ2ÅvJ>Sž›n¹¥þŸ·\æû3 -Wžâç(0K«\\×=÷V/¿öZñ™»(Vµªá “:¯üqL/>aËe¾§ VµRÉ*`‡úž¾âŽ>åãáG9ÏöNVYõ¾±ž¯[(wÆcŒ1扛}öÝ·þÌj +D¯¼þF}œ­”×VB‰m'ÔË7à…—_®ñÆF>÷wÚNÓÉâŽU$žÇâµûBoVÔê+€z·Ü~ûze-±Ðòwå©IÜI45­P•ÄÛ\u¬$|$J|åïÒ*i_N?óÌú>Dz^ù”P{ñ•WæI°r_¼–²h»êeW\9ò=²ò»ÐçKXÜcŒ1Ƙÿ$nV¯^]¾òêkêÏZQã<Çõ<”ĶìÝsßýói-dåŽßTãs|Î*‹»“N>¹þ̶O¶*òVF>ƒÄBˆçÁfú[ZåÊ,´ü]yjwB<§cäÕA„ÛBÄÛ=už·dê¸ÄÒE_2rOˆ0îA”•ž×S=ÄÕ@½P% 8ʬÕ]V)µ-W<üØãõª]l#ÞTÊõéü½ ÅâÎcŒ1ÆüÏ qƒXã3"CB!Š^VÂg‰½ý—‰üòÇŸë=;¦íy}Äž¹ã^Ò(=s‡Xä3Ï«ñ9nCŒ¿‰&1ù­—M,´ü]yjwzæáCYãHžm[ˆ¸½°„:ã'ȃVÙ}âÉ‘ëKð¬!׳*·]F$¼=lnþ§´¥R«¯ä±Ì1„_é' $žõ’Úž7¯rlî¿/¥‹;cŒ1Æó?C7°Çž{ÖÇ´U²¸á5ùzq"BÛ4 ôõCÕ}ÄÝko¾µÞYó¿>뉶{jÛ$Ÿû•6«I:®gy–Ï×®]»^¹ÅBËß•§&qW¿-ó¿Â‡{U‡¬”!”*îØ&©7Yj«+°²(q¥ºgËi¾Ÿ6ShO^øQýÅ(oúóøcè[nµÕHZ¼FÛh•ŽÒ¤Nž{ñÅ‘ü-‹;cŒ1Æó?CIÜèo‹Ô±,n€m{¼e’àæÖ^¯`é|qlçd%‡ŸÀÖ[+u +\üö¿ ǶÀ›o»mþ§âvN¶øI |ÿÓÏõ1‰»¦Wð/´ü]yjw ß¹ã^Du¨- wÀ3¼D†zäY@VWúõ·ùóªû×ßz{ä^~sNßQ">#Èý¬´ò=úý¾øƒëZk‚•^®{äñ'êü"FY å÷ ÉGÎÛb°¸3ÆcŒ1f"Q†XÒ1Vœ8tû•ÃæÖÔuÑ&g ‹;cŒ1ÆcV?þòëü[A?<‹Æ¹¸‚õ¿+¬´ñ{}ùÜ,cqgŒ1ÆcÌ áÆö@¶"®½á†ùãü¸:/V¹÷þFîù_ƒmŸ{í½w½í3Ÿ›e,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf€ÁÄÝl`Œ1ÆcŒ1f ²æêb0qgŒ1ÆcŒ1fé°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1Æ3q~ûëïêïÿüßÈqcÌpXÜcŒ1Ƙ‰ñÂË/W«W¯®y³Í6«Î=ÿü‘kŒ1Ã05q÷Ó¯¿UwÜ}wµ×Þ{Wï}øÑÈùq¸åöÛkñÃÏ¿Œœ{û½÷ësÏ<ÿüȹ!yè‘GG~A>s×=÷ŽÜ7Mž{ñÅ:|üÉȹióç¿þ]=ñô3ÕGUÝvç#çÇå÷¿ÿY­½á†jõî»W›nºiµí¶ÛUgsN±O ͱÇWW>¾X>ùü‹êÄ“Nª¶ÚzëÚù1V¨«¿þýŸ‘k—3C¶5¶"Ž)êåÀƒªÇ_¾v’l¾ÅÕù\8r\Ü|ë­Õî{ì1ñé!ë¾þþ‡º/ï´ÓNÕ&›lRíºë®õ¸štŸûõÏ¿ªwܱzࡇGÎ-†¥* Ý6³bã¾úîûߘ9ù”SFî›&Ô5ù¸ý®»FÎM›3Ï>{¤~à•×_¹¶´¥ÒØpà «í·ß¾:ûÜsë±’¯ßÿôsµjóÍ«Ã8²zò™gëqëwŒ\×FŸxæ±'Ÿª¯ùüëoFΙåI—6xðáGFÆ\sÝÚ‘kÅý>TûcìæÎ;ï\]rÙåµÏáܧ_~5’V䊫®Iþøç¿ªK/¿¢?¤Kú÷Üwÿüù{ï`$­“9ÍI2qqGÃ~æ™Õ?þñj£6ª YjÀqX q§†£<|Æ0òbßýö«;ûòÛïFÒ™&}Œa&—s®¹îº:0QûÓ~ùšq9êècªU«VU×®][TS;ì°Cµç^{ÕŽ:_?$òÔS>¾v[l¹eÒ~ü©§«K.½¬Úxã« .¼häúåÊÐm-qwù•WÕcê‘ÇŸ¨ƒNÒ¿èâKF®ïâ”ÓN«öÞgŸ‘ã]t‰»ç_z©ºø’KGŽ·“§ C×-cœ1ƒó»óî{êqtåÕ×Ô¶z¨À¾ ÄÖ9çW½ñö;#çÊåYê¶Y±qä5úEâêè©gŸ›?öîŽÜ7M"î$"Vò¹ÅpäQGWrH]ÿ‘o~X˜CÜ1‘B=Sçˆ*VÐè¯ø|} -3ý—û#ºúÄ3w+‡¾ÚàÆ›o®'¼óxxçýF®ú“Øoú ¶ 1vÆYgÕçÙÌDI† òðÒ«¯Ž¤ ø&(n¾í¶:]Vž¹^”ŒÏœ&`Çùý‘4'ÉÄÅ݇Ÿ|ZzØaµúư45à8,q—a¶ƒœ/%}Œa¦«œ á ƒ®¨fpø|ôégu:yvœrrüî{ï¹§̼çcÓ‚@n»í¶1Ôe©æ{`)ó\bè¶–¸Ã`Çãê§Ï¾ðÂÈ=mLJÜ-„qÄÐu‹"÷?úx½ã¸7ðKÕ'‡,ÏR·Í,Ú8qÃM7ÕeXyËIܱ‚ÁdV>¾Pw{ì¹çzÇð3¬ïÀ#×·±Ð2³2Ã}‹™”èÏXÜ­újƒ /º¸Þ­“7?þ„Ö;Æxb'G›Íauš|~üå×Z0f{L¾æÖ>r}d¿ý÷¯Î»à‚‘ã“fââ.òâ+¯Œ4 Û˜¨ *U°@©³E-§ãŠ;-§<£àYeÃPÄû>þìózÆŒ Ž­ÓÎ8£ÞJÀ9Ž‘¦`¶!o›¸{ô‰'kãÊw3ëó†3¡ÓÑÁu uÁî+¯¿QwTŽí¶zu½š£ûØòÉlÀ}<8¿üL¹âLxÉq=³%Ìp_ãó[ÉÚÊÉÌêaskêû˜=æ¾\Î.h_ÒÍÏeW\Y×Ág_}=lnÝ€ak•–Ò#ä…t¨×|îªk®­ E¼¶)ß´9é\wýõu»l³Í¶óÎ!Š)Vèä“Ïx`u‰'ΟÇQ²Í…k˜Ù™[—÷ì€Úòñóo¿×†ƒ¼Ç{€>NùÖ»ïÕŸiwòG¿a6Vc¤«K$1cú̘lñ¿êF°ÊHúÈBfð‡jë&qGŸ¥3fuì—?þ¬W;©ê™±£¾·w[7ºî]âŽrÑþñ3†l ¤é_*ƒìWdœ`d¨ºU>¾ûé§õ޳+Gûp› +õIœÿÇtÕôËR0Ýgµåcˆò,—¶ÊÆ•Úf)l\¤Mܵ¥!aKÝr衵ÿC„ßtË-µ¨Æ0Ö8Fɯõ±k¥þHýP[o³Íü–B•9nuÚQ÷a³O=ýôÚf°ƒƒÏî Æ³ì }//îhkgÓ8dœ1Vw¥t±ÛL çIv¾‹X+§'^{ó­ú{™¬Ëç&Í’‹;`°²ýLƉ`#Ñ´'\ø‹o¾­;"C—FÁYl±=ƒMP«@—ÀÇÇ,N“ …“áü'_|Y Ò%È.mhwwfH›g (+ir^³ÊÇ{l]/¤ÒÇa´yt Ä&L[=å´q8,O¿þÖÛµq£ƒªgcˆs# –•ŽÔ7ŸÕ¡›Êùñç_ÔŽ”2Rö:S&Ç}i |X " `fsæt¨îi{¡+ßrúÔuC}±dÏ=ô¥£ª­C9ðÁé! ™Mç{æÖ>8hqŸ|Ðv¤OßÌeȨÝq|ô-‰¾®>>ޏ£^éw¬€à|9ƸÊyic¨¶nw@Þh;}f¶Ž€ƒzyùµ×ê1ÇX£o”qÆŒ5ÿ#ª»îSÚãŠ;úmLݲºÈøå3ý• ‡ï×$ÿ—Ý&†ª[ì ãn]ÍN+ÒeÃJ}Rv˜É6¥ƒm¡ŽÈ)˜îG]ù¢<Ë¥m†²q¥¶Y iw]iHܱ¥:¡mN#oLt’Û£Íèc×r¤Ž‰‡6W·Û®×~D'p-± iq~TýsÔ5m÷ðc×rË­¶*N— N(³&uIŸÿã4ü5×P Á%±KÓó¾MâÿNúZà;l7Ã"´¨³“N>¹>ßTæ®ûˆY$ºÈ³b˜,îÚÆ%çs<ƒßäzv½ Tùô®±¸[Y4i ®¥¯`o¸ÛŸ¹gŒwüñý°m;vèÏhŽ(»ÒeBŒ|µíðÀÞKGL›e!î@Á·ݶ=¢4»š‘ÓTpˆá×ýZ-DDñ™ €kâ/œ/Æ#Ïç®íŠ%qÇ÷à â $Ç0|0>KÜÅUȧŸ{¾>;0†•crXrÚZ]Ô5못l 1¬yŸòÑÇ[¼ú\*'FVNMÇ|Ø>Óê¢)ðå•@L ,JàÄqhܳÛn»Õα¯éÊ·œ~^™:åÔS×kKú&ß¡Ï1ðQÿŠAšfÑ}ò¡²`é<ׯI Bj÷¼öéã㈻,¤C]푪­ÛijúœSÝ0aWF@{äõ¹´-³Ï}ãŠ;Æ|ÜòD{PθnÜ­b¨ºú-ù H¢ÏãäâìfVꓺÙO£>XýáÿLw£>ù€!ÊË¡m†°q¥¶iÛ¸H“¸ëJCâ.î`¡m9–Ÿ©¤,Ú ÕÇ®åþˆÍÅVF?ˆïäùÐÒE꛾W—§Ä4Âm¼â“8Ø >ӋȶŸ`ó±á¥˜J4‰;Òa5Y;F]ôÍÌ2€-ÔçR™ûܧ8'¶mw}ÆeŽg¨#Ú9ö#mͶ¸[Y´iƒ¹5‡×»tÿˆxlc¬tm &#M[‰ég쌋ö¿lÃg2¡éÝç{ûLÚO‚e#î4³ÉŠUÛ,HÜálˆ#'rD8:‚ £±Á9`pp*}8ÍèGJ¢'RwrFtH `Ùˆ˜hôØZɱ¸ÅRÎG«›rÚy™š2ÈÑec8F¶E°}º¦óÅ|—ÊÉÌ#Ž2–‡E½²ê¿¿¶À0ìä©mÕ6Ba&‘€A†£Š³Ñ]ù–Óϳç8U®Ñö. K RcàC{pmÞ>ƒs‘3ïÊGIÜ‘>Ç„ÊUj÷>}|q—ëƒ Gu1T[#î#Ô3Ù-Òç|l»’¸ës߸âN³ë¼y«dï`úÖ­ ß°m…`‘þÀ64õ“>6¬Ô'ÉT2¨¥›ƒé®qÔ'C•–KÛ,ÖÆ5µÍ´m\¼¯IÜu¥¡¶‹ÛÍ.Ù0Aþ%úصÜ•-^fEÝÐ^ìŒàõ¥’Ða€1LqÝBß–§UUú´Ž1Q‹`¤/±¥<ßéw±Ý®´;±˜ú[l«R™ûÜWŠs¢¸ë3.sKˆ,9ºlϺÆQŸ|”XHy`9¶ÍBl\SÛLÛÆÅëKâ®OãŠ;å¿]Ëý!K@X°%“ÀOþ´MÜáKsÞEW\ÓõŸ_Ñ>·Î׫nòõ‘&q§Ý@úI¢Œ ™ÕÊÇÖX®iw}î+Å9QÜõ—1žÁŽbWãDXÜ­Lº´A†I”®—¬0†÷ÙwßúºØï2<ÚùxìôÃv¶ùílhzîx,qÇÛhpþH,µ·5Æ8âŽÁÈéÉØäU:‚0‚íº/‹žLIÜ)¸akùŠèyž’Ñ[Œ¸cÖ°iåŽgnãõ8À6q8OŒp.äzm£+ð™[óÿŸãÀQDaÁ€gG|œµf2»òÝäô™¶¬’×ü¥>³Ú‘®|ІˆîҶΑÇ6q×§Óßø?Ï÷w̦½r7׳­›Äã;Á¸ã3¶€:ˆ¿;|G›¸ë{ßBÄ`uƒz ®ão;MJ@Ìõ¬[Ú=nåÚ~Æöð>6¬Ô'ý“3¾1,Û³®qÔ'C•–ºm†²qmm3M¯-‰»>i -î¢]ËýQczÞ ôýmâ{Ä€œ(Å+¾#çè3±?°•œ6áxÛª4‰;½dBqþ‡~' äCÚÄ]ŸûJqNw}ÆeŽgˆÏXQz`q·2iÒì,`Ò;ÛÆvÞ±!>À¶#´;„ßËN†|®¾œÕiÄeÛîBvî`—âcSÓfÙˆ;Þ:Ã2;ÆçUzs GÜé­cqKÐ1ô–Îñvt€2$<÷Àg‚>#îê×qÄiëBVF®dôÆw¼%L×ȉqŽÏÙ²¯8þX,ir,æ»Tιu ÏnÅÎÌà·ã¶>´Ίg.Yí`ëhÓàQåßF¢^I2øsùnrúÀR=ƒ“¼äËŒƒúW|^“r"¤õ zW>ÑÁ›ì”ôLI›¸ëÓÇ1J\4Z[岸‹ÏzRVÆý‘á¡ÚºIÜéÙ v>«|ñ™63úCiù9 ¾÷+îhïpRVžuÒgêµ$軪néÃä!¿AŒñ >Ýdž•ú¤`,ÒéÛñÅ Ùžu£>ùª<°Ôm3”kk›iÛ8Ñ$îºÒX¬¸k³k¹?êM’q«+o“¸ÓvËøLM½¸jÕÈóu¥—°•à{™Š÷Ç-‹|f‹*bœ:êÛM¿Í%qÇ„â*¾é¡•Eš~“PmU*sŸûJqNw}ÆeŽg(ñKÜö¦ïÉ~Ô,oš´üs|Ζþ€Vˆ/ãÉ`»Y,BOäsÒ@¬5Ùá}[I\•'¬"¤Åó¼]“.“fYˆ;ÞX…ÓSpʃŠÌl¢ªs0ޏ 8Á³æ'Àâû´ŠÁ–L‚7–f Qñ¬Ü1ë,ã¤íqÌžEÑ%JâÊ1Ö- 0oÐÚe—]ægáJFoqDz3†–t1tthÍrdcH p@ù”‘zˆ+¥rò—û0¦ÔNžçY4sBÐÆ=m3ÑÐøhÕV{¨y53ùÊ/:Zn'˜æÇƒ)?+/í´³úMW¾ÛÄye«#çs?Ìo’c†çFRç8]îÕƒ¶]ùÍa´Ø¾G?¤ü´c™Z®k Öºú8Ì¿ÅíÑÇê@…Ϥ•ÅõÊw“ÊF:z]ö´ÛZâ¡EÝàp/÷äw'P¡þj´ ×Åú5ÏÎ0‰¡Yù>÷ahWòQ —Å++´ågÜcÓ豜ú Æ.Á6³Ñ±L%†ª[ú5[Gü(7v|’ÎI6©Ë†5õIЪåŠ4Û3èG]ùª<ÛfÚý~(×Ö6Ó¶q¢IÜu¥±Xq×f×rDŒ!ÒèˆB&›õÌV­öèG¼QO3ÿLŠ"é;Ø*Þ‰B¸(^! MÀfhw&š "ùÒà3ýSõ…ÿÆ'(påÑŠ¶ÝNÔ'± õF½Ò7ñ¼a4¶»„"A)>‚Ÿs Ž8¦ÉÞR™ûÜWŠs¢¸ƒ®q™ãú ßC_ä zÁ×XÜ­,š´0ñÿÀgÓ×x;*vB/Œéh«°ý¤E•ßÉWâ±ÉØRúMþΜ.¾‹Õ:Æ1ý>§~GýTo2_*–\Üi c,çÏ1>ÏJ”õ¸âƒ‚Á €Ã(â4s@ÏìäÜšÃëà§…Áˆ³vÌñ€6¾4cÐ$áE‡ÄAb¬ôyÉè#îXÁ ®(AjìPÙâ8È;NŽrR'ì æ>Í~5•q“Å‘r/bB³‘8a¾§é­A¢)ða)ƒ&ÎVâ(h‡ÒÌ/0;ÃÅñ‘'ê•|ÇçF -ßmâNùBåã9ðÁéyMÊA_'‚²²:DYpr\‡ã¦O뚦`­O'OôQÚ–#ˆhÉâîêk¯›•qµoÚm-q'pÞ” "_‹C§î¹†|#`yw|“ùÖJ’&“úÜ—R糸£ü×®][MÚœà+×ößò"m5Vcø¹\™¡ê(;‚ƒ>G>É//BɶµÍ†5õIAšYˆg{}ÆQ[>`ˆò@n›i÷{ÂÆuµÍ´m4‰»®4+îÚìZ©?"0ô“Ø >SWq•¿ëê#nkå9OÚ‰ãØVhåËñÁ|OÞeá~Ê=á~|€‚Rú"ù‰Û‰SèÇM»w²Wølÿ¹çŸ_|¡>ºÁGpâ’É’¸‚\*s×}¥8'‹;h—9ž @Ú”~£K·¸[Y”´`Ìà_é·Šm¢ `\ÓÃ2VÕß3ñYglc)û†Rºz<¦‰ø<-¶1¾){©˜ª¸3ÃÑå´§ N…WâfåÐ%vÁm=9­Ìzçãféq¿_¹ô±kÓÈjS×v1cŒY w+”å$îØ*Ô6iV}‚ ·õd`™ú®mfip¿_¹ô±kÓ‚gòoòcÌÐXÜ­P–“¸kÚëoV}‚ ·õäpÝ._Ü6+—>vmZ°Å«´Õc†ÄâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1fLÜ}ÿóoÆcŒ1Æc"k®.wÆcŒ1Æc–‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcÌÄùí¯¿«¿ÿó#Ç1ÃaqgŒ1Æc&Æ /¿\­^½ºÚ`ƒ ªÍ6Û¬:÷üóG®1Æ ÃÔÄÝO¿þVÝq÷ÝÕ^{ï]½÷áG#çÇá–Ûo¯ Ä?ÿ2rîí÷Þ¯Ï=óüó#ç†ä¡G­¿§»î¹wä¾iòÜ‹/ÖùøàãOFÎM›?ÿõïꉧŸ©Ž8ò¨ê¶;ï9?.¿ÿýÏjí 7T«wß½ÚtÓM«m·Ý®:ëœsŠ}bhŽ=î¸ú»òñÅòÉç_T'žtRµÕÖ[×αB]ýõïÿŒ\»œ²­±qLQ/tP=þòµ“dó-¶¨Î¿à‘ãâæ[o­vßc‰ÏHY·ðõ÷?Ô}y§vª6Ùd“j×]w­ÇÕ¤ûܯþUí¸ãŽÕ=TûcìæÎ;ï\]rÙåµÏáܧ_~52¶"W\uõHz‚˜Ÿ‚oa¢‚ï‰ç±#W^}MµË.»Ô±ÊÞûì3õXEL\ÜÑp§Ÿyfõü£Úh£êÊëjÀ.–BÜÝ{ÿuº”‡ÏF¾Cì»ß~ugŠÇ¾üö»‘t¦Ic˜Éå‚k®»®LÔþ´_¾f\Ž:ú˜jÕªUÕµk×ÖÁÔ;ìPí¹×^õË× <õ”/„Ý[nY矴êéê’K/«6Þxãê‚ /¹~¹2t[KÜ]~åUõ˜zäñ'ê “ô/ºø’‘ë»8å´Ójƒ›wÑ%îžé¥êâK.9ÞAÖ8eºn㌜ßwßS#¶z¨À¾ ÄÖ9çW½ñö;#çÊåYê¶Y±qä5úEâêˆ@MÇÞýàÑû¦ÉBÄ‚DÄJ>·Ž<êèêàC©ë?òÍ cˆ;&R¨gêQE`JÅïäëÛXh™é¿Ü·ÑÕ'ž±¸[9Œ« gLÚq]›¸£0‰ý¦Ï`ËygœuV}žmÁL”d˜p í—^}u$M@ÈqžtŸ}á…:à3ß§kN=ýôjË­¶ªý+ÕIJu9½I3qq÷á'ŸV‡vXõàÃÌ«î¶ìÃrwfk1ÈùøRÒÇfºÊ¹:øàêÆ›ožŸÁ]làóѧŸÕéäÙqÊÉñ»ï½oäž>0óžM ¹í¶Û¾úå÷?Ö;N½Q&œj¾–2Ï%†nk‰»h@Aý#›ïicRân!Œ+ †®[é¼ÿÑÇë'Àåø¸ŸXª>9dy–ºmfÑÆ‰nº©.ÃrÈ‹XN⎠&³òñ…‚¸ÛcÏ=×;†ŸaExÿ¹¾…–™•î[̤DŸxÆânå0®6@б€ÂΦ6q‡?þ„Ö;Æxbµ­Íæ°ºGúù¸Øgß}ë±±Møÿçß~¯E%~(ßwÊ©§Ž¤7i&.î"/¾òÊH²‰mVTª*aA²E-§㊻?þù¯êÒ˯¨ƒg<«lŠxßÇŸ}^ϘÄ1£uÚgÔ[ 8Ç1ÒÌ6äïmw>ñdm\ùnf]cÞp&t::¸®¡.Pý¯¼þFÝQ9¶ÛêÕõjŽîcy˜YÝûxp~ù™rÅ™ð’1¤ãq=³%Ìp_ãó[ÉÚÊÉÌêaskêû˜=æ¾\Î.h_ÒÍ•:øì«¯çÍ­9¼ž¥ÑRz„¼õšÏ]u͵ëÍ’´å›6'뮿¾n—m¶ÙvÞ9D1Å*C4(x`u‰'ΟÇQ²Í…kØz2·.ïÙµåCF¼Ç{€>NùÖ»ïÕŸiwòG¿a6Vc¤«K$1cú̘lñ¿êƒ€’`•mô‘…ÌàÕÖMâŽ>K?fÌêØ/üY¯vR/Ô3cG}!oïm©h»Ot‰;ÊEûÇc̲…ƒz¤© ²_‘q‚‘¡êVùøî§ŸÖ;ή]ìÃm6¬Ô'Ï»à‚úÿ˜®Ú€~Y ¦ûŒ£¶| QžåÒ6CÙ¸RÛ,…‹´‰»¶4$l©ÛC=´öˆð›n¹¥ÕØÆǨ#ùµ>v­Ô©ê`ëm¶™ßR¨2Ç­Ž@;ê>l63øØ vc°b'íÚ ŽñÓä?÷oü±N7®D¿úÆ›uP9-(‰;`÷½ùλóÇXµ Ž¡¼ÄAlÕDo[™Ûî#ø÷)Æ6²zóÔ4.¡Ï<üècu:\OÛÒî\3Θ5KOID˜ìÂ~¾üÚkuÿŠâŽÝŒgÙú^^Ü!¾&ý¦qÈ8c¬FaÓvQåÉ6&ô°'ü eìg»Æ¸È¢p,¹¸+'ãD0‹‘hÚ.üÅ7ßÖYD†.6.³õ8 ‚-¶`° jèãø˜ÅÂiôÑp2œÿä‹/k@ºÙ¥íMâãCà~áE×ióle%MÎkVù˜c­ë…ô÷ÛÿºÃ`´ytlÄ&L[=å´q8ï¼ÿAõú[oׯªœ!“4n¾í¶Z8Rß|V‡n*çÇŸQ;RÊH®¹nm]¦¼ß¸‹¦À‡Å ’PaV0·aN‡ºáž¶çºò-§OQ7ÔKöÜC_Q:¯½ùV}¶åÀ‡‹0d6ï™[øà qÄ}òAÛ‘>}3—!£vÇñÑ·$úºúø8âŽz¥ß±‚óåã*祡ںIÜy£íô™Ù:ê'À˜c¬Q‚7ÊÇ8cÆšÿÕ]÷)íqÅ}6¦nY]düò™þJÐÃ÷k‰ÿ³Chc¨ºÅ®0þçÖõצ•aè²a¥>);Ìd›ÒÁ¶PGä¿Lw£®| QžåÒ6CÙ¸RÛ,…‹4‰»®4$îØRHÐ6'Ž‘7&:Iƒm‡Ñfô±k¹?RGˆÄC›ß›ˆ ' IDAT«Ûˆm×k?¢Ž¸–Ø„´¸?ªþÆ9êš¶{ø±ÇkÉ6­Ò„p ê„2kR—ôù¯kð×\C9€Lä»4=ïÛ$îð勞€•ï`ð¢ì B‹:;éä“ëóMeE¢‹<+†Éâ®m\r>Ç3øM®g× B‘Oÿá‹»•E“6Lhõ+‹;ÆØqÇߨÿ;Ѷc‡þŒæ@C”ÒeÂüÑGã}ÚA„½ˆÇzøÆ*1ã&ç¤Yâá|ÐmÛ#J³«9M‡~ݯÕBDŸ ¸&nñÂùbÌÕh]ÛKâŽïÁAÄHŽaø0`|–¸‹«O?÷|},>ˆ‰a嘖œ¶Vu Iu—!†5: 8ú˜cë€WŸKåÄÈÊ©éÛGbZ]4> ¼2ˆÑE œ8{vÛm·Úy öã5]ù–ÓÏ+S‘Ø–ôM¾CŸcà£þƒ4Í!¢ûäCe'ÀÒy®“ „Ôî1xíÓÇÇwYH!†ºÚ#3T[·‰;fõ9§ºaÂ"®Œ[í¥m™}îWÜ1æã–'ÚƒrÆítãnýCÕ-ÐoÉA}'g7ûذRŸÔ}Ì~êõÁêÿç`ºkõÉ QXm3„+µ LÛÆEšÄ]Wwq m˱üL%eaõ˜ÿûصܱ¹ØÊèñ\#ZÚ¢H}Ó÷âê┘FB¸ â‚W|2{Ágú£bÙvâl>6¼S‰&qG:¬†hÇ¢‹¾ƒd&°…ú\*sŸûçĶâ®Ï¸Ìñ uD;Ç~¤­Ùw+‹6mÀª}I‹ YÜuÁ$c¤i+1ýŒqÑþg´ÝžI„x\Ïáe]Àâ Ç!¯öM‹e#î4³I¥´ÍBÄΆ€8"q"G„óÁØfe-cƒsÀààTúpšÑ”DO¤$îäŒè Á,«l1Ñè±µ’cq‹¥œV7å´ãLP9ºl ÇÈ,Û÷¨k:}Ìw©œÌ<â(cèÔÔ+«žñûÛh |ÃNžÚVm#ôfDØ™±ÃQÅÙè®|ËéçÙsœ*×h{ÛÿbÚƒkóöœ‹œyW>JâŽô9&T®R»÷éã㈻\¹8âx¬‹¡ÚzqÇ¡ž˜ÉFhÉÀƶ+‰»>÷+î4»Î›·Jö&!  oÝ ú ”`‘þÀ64õ“>6¬Ô'‡ÉT2¨¥›ƒé®qÔ'C•–KÛ,ÖÆ5µÍ´m\¼¯IÜu¥¡¶‹ÛÍ.Ù0Aþ%úصÜ`’—YQ7´;#¸F}©$tØ GLG\·ÐÙ{­ªÒ§uŒ‰Z#}‰-åùžH—¸‹íŽp¥Ý‰ÅÔßb[•ÊÜç¾RœÅ]Ÿq™ãb¶[Ç|ø™»•I“6 eU>ÚÓqÄ6[Î$Q>'XÔÁÆ´=“Ý%î²f`ôoÒÎ6k,qÚXÚÊ‘¸ëóÌÁN#_—ßÞÄ좈k1šÌ át}IôDJâNå-¡ýê%£×&îä|šœöÜšÃçWâ²1ä^ÊFp@çÃPëÍ\º?—›óLj*­¦ÀGN¬ï–Fo/bPõÉw“Ó§® æ© 9³(càƒcŒ[3}ò¡öކƒ¼QÚÓ&îúôñň;Æeœ…íÃPmÝ&îXŠuO›`ÈÙ:ÁÃÚ´ç»Ä]ŸûÆw@0ÆDÆÉ#­@éü¤Dߺ-ÁÊÏ3Q~ìkVê“ ~M}2–YúI‚lϺÆQŸ|”XHy`9¶ÍBl\SÛLÛÆÅëKâ®OãŠ;å¿]Ëý!K@X°%“ÀOþ´MÜáKsÞEW\ÓõŸ_Ñ>·Î׫nòõ‘&q§Ý@úI¢Œ-l¬vP>¶ÆrM›¸ës_)Ήâ®Ï¸Œñ v»':ÀâneÒ¤ ØêKߥßHðKÜEûQ‚1ÌËLXåŽý.ãMGØ!GþòÏ(^nKŸIÆ<9 –¸ûñ—_kçO€ÄR{[e#îüœžŒMVÜ8`:H÷eÑ“)‰;7l­ _=ÏS2z‹wÌ6­Üñ,Ám¼Ø&îç‰Îe€\¯mt>sÿ}ŽG…už`ðqÖšÉìÊw“ÓfzزJ^ó”úÌjGºòA"ºKÛ8GÛÄ]Ÿ>Nãÿ<{ÜGÜ1›>ôÊÝ\϶nwŒSìãŽÏØêàžûî_ï:¾£MÜõ½o!âN°ºA=P×ñ·&% æzÖ-í·ò m?c{xVê“‚ÀŒþI€©mríY×8ê“¡ÊKÝ6CÙ¸¶¶™¦‹×–Ä]Ÿ4†wÑ®åþ¨‰1=ïúþ6q‡=b@Î?”â• ß‘ó ô™ØØJN›p¼mUšÄ^2¡8ÿC¿Pò!mâ®Ï}¥8'Š»>ã2Ç3Äg¼DLéÅÝʤ¤ ˆAéão‚µœ`ÛˆÚÆÉb'C>¡ka$çwH5AÄJ?ñs|T ØÁÂêcNsÒ,qÇnXfÇxPY¥7ŠqÄÞ:·4J#Ìÿœã!íèeHxîÏ |GÜÕ®ãˆÓÖ„¬Œ\Éè#îbç–㟳1d_qü±XÒäXÌw©œsëžÝŠÆ›Á“;qmmÀ@æ™KV;Ø:Ú´5Wu–‰zeÊàÏuä»ÉéKõ ä…YÈx.ê_ñyMʉÖ^ë®|¢ƒ-6Ù)é™’6q×§#0¸&þh´¶Êeqg§( «NãþÈðPmÝ$îôl;ŸU¾øLý!Š´üPßûÆw´w8)k|%2õZô] U·ôaòß ÆxPŸîcÃJ}R0éƒôíøblϺÆQŸ| UXê¶ÊƵµÍ´mœhw]i,VܵٵÜõ&ɸUK[°$î´Ý2¾«^ \µjäùºÒKØJð½LÅûã–E>³E1Îõí¦ßæ‚’¸cÂq%ÿ­,Òô›„j«R™ûÜWŠs¢¸ë3.s¡ÿ±•¸ÉG°)y…—.έ³[üV  ùÜ£wL“e!îxcNOÁ)¯efUÓ€qÄ`À .˜5ç8ß§U ¶d¼Ñ‹¨xVî˜uVçÑö8fÏ¢è%qåkŒ˜7hñëõš…+½qÄËÎZÒÅÐÑ¡5Ú!y 0ÀäSFê!®d”ÊÉ_îØR8ù¸ÔLÐÆ=m3ÑÐøhÕV?2É«™ÉW$BËí r~<˜ò³òBÐN;«ßtå»MÜ‘W¶:r>÷Ãü&9fˆpnÔ)uŽÓå^½¬+€3ÇÈ0ÁÁö=ú!å§ ÌÔr]S°ÖÕÇaþ-n>V*|&­,î¨W¾›÷•âœ(î k\æx†þÂ÷ÐyC'cÝoË\™4iƒù™;Æt´UØ~Ò"ŽÊïäˆ+ñØdl)ý&G)]Mø°âmâ/Ÿãª:»Èä3±—~Ä<¿es,¹¸Ó,ÆXΟc |ž•()êqŃA‡QÄi怞Ùɹu œà€ÆÁ`ÄY;f‡x@ ’hw@ЈðÂqá 1VzȼdôÆwt"êŠr¤êÕø!Žƒ¼ãä('uÂK)¸O³_MåD\àdq¤Ü‹˜Ðl$ï‘£o¢)ða)Î/ÎVâ(h‡ÒÌ/0;ÃÅñ‘'ê•|ÇçF -ßmâNùBåã9ðÁéyMÊA_'‚²²:DYpr\‡ã¦O뚦`­O'OôQÚ–#ˆhÉâîêk¯›•qµoÚm-q'pÞ”¡d,qèÔ=×o,¯ãŽoÒ#ßZIÒdRŸûòo@ Òá|w”ÿÚµkë±I›|åºÀò[^¤M Æj ?—+3TÝeGpÐçÈ'ùÅ!eÛÚfÚú¤ Í,ij=ƒ>ã¨-0Dy ·Í´û= aãºÚfÚ6šÄ]W‹wmv­ÔúIlŸ©«¸Ê_ Šuõ·µòœ'íÄqì+´òåø`¾'ﲈp?åÆžp?>@A)}‘üÄíˆÄ)ôã¦ÝNˆ;Ù+ü ¶Ÿg™J/ôÁ'P7øî# e²$® —ÊÜu_)ÎÉâÚÆeŽg@6¥ßèÇÒ-îV%mÐDwŒkú¢bXƪú{&>ëŒÍ`,eßД.0)L¿¥b—ó8f|ÓgõrHòÒç'®&ÁTÅŽ.§=Mp*8Œ’7+‡.± nëÉheÖ;7KûýÊ¥]›DV›º¶‹cÌb°¸[¡,'qÇV¡<ƒaV}‚ ·õd`™ú®mfip¿_¹ô±kÓ‚gòoòcÌÐXÜ­P–“¸kÚëoV}‚ ·õäpÝ._Ü6+—>vmZ°Å«´Õc†ÄâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1fLÜ}ÿóoÆcŒ1Æc"k®.wÆcŒ1Æc–‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ç·¿þ®þþÏÿ7Æ ‡Å1ÆcŒ™/¼ürµzõêjƒ 6¨6Ûl³êÜóϹÆ3 Sw?ýú[uÇÝwW{í½wõÞ‡œ‡[n¿½6?üüËȹ·ß{¿>÷ÌóÏœ’‡y´þž6îºçÞ‘û¦És/¾Xçãƒ?97mþü׿«'ž~¦:âÈ£ªÛî¼säü¸üþ÷?«µ7ÜP­Þ}÷jÓM7­¶Ýv»ê¬sÎ)ö‰¡9ö¸ãêïÊÇË'ŸQxÒIÕV[o];?Æ uõ׿ÿ3rírfȶÆVÄ1E½xÐAõøË×N’Í·Ø¢:ÿ‚ GŽ‹›o½µÚ}=&>#=dÝÂ×ßÿP÷åvÚ©Úd“Mª]wݵW“îs¿þùWµãŽ;V<ôðȹŰTå¡ÛfVlÜWß}?â3'ŸrÊÈ}Ó„º&·ßu×ȹisæÙgÔ¼òúë#×ö¶Tn¸aµýöÛWgŸ{n=Vòµ“âûŸ~®Vm¾yuøGVO>ól=îo½ãŽ‘ëÚèÏ<öäSõ5ŸýÍÈ9³<G<õìsuû^vÅ•#ç"¯¼þFµÿÌÛÍK/¿¢¶Ïñú >›køûÈãOŒ¤“Ùe—]FÆ%Äkè×»­^]Ç*¤{÷½÷¤3 &.îh¸ÓÏ<³úÇ?þQm´ÑFuEt5`K!îî½ÿ:]ÊÃg #ß!öÝo¿º!ã±/¿ýn$iÒÇfr9‡àšë®«˜ÚŸöË׌ËQGS­ZµªºvíÚ: "˜Úa‡ª=÷Ú«vÔùú!!§žòñÅ€°ÛbË-ëü“öãO=]]réeÕÆo\]páE#×/W†nk‰»Ë¯¼ªS`‚NÒ¿èâKF®ïâ”ÓN«öÞgŸ‘ã]t‰»ç_z©ºø’KGŽ·A5N†®[Æ8cfçw®î¼ûžz]yõ5µ­*°o±uÎyçUo¼ýÎȹ…2dy–ºm`Vly~‘x€:"PÓ±w?øpä¾i²q÷é—_Õ÷ Vò¹ÅpäQGWrH]ÿ‘o~X˜CÜ1‘B=S矬 Ñ_ñ;ùú6Zfú/÷-Ftõ‰g,îVãj&™´ãº6q÷ñgŸ×‚qôôsÏW7ßv[ý9úï·Þ}¯žè8õôÓë¾L\Àçg_xa$½yeò%MÇF“?üŽb>ßÿàC#iMš‰‹»?ù´:ô°Ãª~d^u·5`–ƒ¸Ë0[‹AÎÇ—’>Æ0ÓUÎ…pÐÁW7Þ|óü îbŸ>ý¬N'ÏŽSNŽ/t¦$ÏìL¹í¶Û¾úå÷?Ö;N½Q&œj¾–2Ï%†nk‰;œv<®~ÚeŒ3“w a\1tÝ"€Hçý>^ï8.ÇÇ üÄRõÉ!˳Ôm3‹6NÜpÓMu–C^Ärw¬`0™•/ÄÝ{î¹Þ1ü +¬näëÛXh™Y™á¾ÅLJô‰g,îVãj (ìljwªm¶Ùv½¾vý7ÖÈçãO8¡^‰÷¿pà#é bbòˆhË绊ˆåâ1ÊÈŠu¾vÒL\ÜE^|å•‘dB£ÉØS‰4 [Ôr0®¸ûãŸÿª—e ži`CïCí£ô â˜Ñ:íŒ3ê­œãi fò÷¶‰»GŸx²6®|7³®1o8¶ÑÁu uÁþt–– D9Æ2/«9º-ŸÌêÞ÷ÀƒóKË”+΄—Œ!×3Á 7^[ÉÚÊÉÌêaskêû˜=æ¾\Î.h_ÒÍ•:øì«¯çÍ­9¼ž¥Ñ`ŒÒ¡^󹫮¹¶6ñÚ¦|Óæ¤sÝõ××í‚AsˆbŠU†hP0'œxâüy%Û\¸†­'sëòžP[>~þí÷zÖˆ¼Ç{€>NÉLŸiwòG¿a6Vc¤«K$1cú̘lñ¿êƒ€’`•mô‘…ÌàÕÖMâŽ>K?fÌêØ/üY¯vR/Ô3cG}!oïͦµÝ'ºÄå¢ýã1V?ØH=Ò¿TÙ¯È8ÁÈPu«||÷ÓOëgWÂ%—]¾^n³a¥>yÞÔÿÇtÕôËR0Ýgµåcˆò,—¶ÊÆ•Úf)l\¤Mܵ¥!aKÝr衵ÿC„ßtË-µ¨Æ0Ö8Fɯõ±k¥þHýP[o³Íü–B•9nuÚQ÷a³YÀf°㌳Ι´kƒ:ÆO“ÿÜ7¾ýñÇ:ݸýêoÖy@@å´ $î€]Ü÷æ;ïÎ{éÕWë8†ò±J¡‰Þ¶2·ÝGpïã3DZ¬ÞÇ<5K(Å3?úX×Ó¶´;׌3fÍÒSÒ&»°Ÿ/¿öZÝ¿¢¸c•Œñ,{BÿB¼Åûéã¤>à3}÷Š«®^ïl%q˜ÆjN1Jä…x«4QAìÀr†(Ïri›¡l\©m–ÂÆEšÄ]Wwl)¤Nh„ÇȤÁ¶Ãh3úصÜ©#D⡇ÍÕmÄlýšÃ¨ã®%6!-îÁª¿qŽº¦í~ìñZ@n¹ÕVÅ áÔ eÖ¤.éó?>^×௹†r ™È#vizÞ·IÜáßI_«Ã|ã€`ZÔÙI'Ÿ\Ÿo*s×}Ä,]äY1Lwmã’ó9žÁor=+%UD>ý‡k,îVMÚ@ ØN9õÔúÿ,îcÇü|ÿgÒ—‰¨x¿Vœ5á?ǾÄkðÓ\£þ–ÓUßg¬Ñ'â"c“8Œ´ˆÃ‰Å´x¿k, q Žp> è¶í¥ÙÕŒœ¦‚C ¿î×j!"ŠÏ\·xá|1æy>wmW,‰;¾W 9†áÀñYâ.vö s,¾4ÃÊ19,9m­.ê:œê.C ktpô1ÇÖTŸKåÄÈÊ©éÛGbZ]4> ¼2ˆÑE œ8ƒŒ{vÛm·Úy öã5]ù–ÓÏ+S‘Ø–ôM¾CŸcà£þƒ49D"ºO>Tv,çÚ8i¡@Híƒ×>}|q—…b¨«=2Cµu›¸cVŸsª&,âÊ0I¤v€Ò¶Ì>÷+îóqËíA9ãvºq·þ‰¡êè·ägEŸ'h‹« }lX©Oê>f?uŒúÓÍÁt×8ê“¢<°ÚfWj˜¶‹4‰»®4$îâÚ–cù™JÊÂê1ÿ÷±k¹?bs±•Ñâ;¹F>´´EQ³ÿqu qJL#!ÜqÁ+>ƒ½à3ýQ±ˆl;ñ 6^Š©D“¸#OíAtÑ7ÌØB}.•¹Ï}ŠsbÛFq×g\æx†:¢c?ÒÖl‹»•E›6@Ñ—´ØÅ]&Oý!ö[ìjÞ*ÉXãìnNèäƒ] ØBÄ!ã:¯jÂIŒû,þP,q§™MV¬Úf¡@⎠& ŽHœÈá|0¶2ŒBÆç€ÁÁ©ôá4£)‰žHIÜÉ1«„Ìâ±Êó[+9·XÊùhuSN'¿“2ÈÑec8FfAؾG]ãb¾KådæGˀâ^YõŒßßF[àvòÔ¶j¡0›BÀÎŒŽ*ÎFwå[N?ÏžãT¹FÛ»˜ ŠAj |h®ÍÛg0&ræ]ù(‰;Òç˜P¹JíÞ§#îr}äb0ã±.†jëqÄc„zb&¡EúœmWw}îWÜiv­%{“зnýJ°H`šúIVê“€SSPÉX >”n¦»ÆQŸ| UX.m³X×Ô6Ó¶qñ¾&qו†ÚN³ï‚.Ù0Aþ%úصÜ`’—YQ7´3ò\£¾T:zzÄD0qÄu´cüþ¾hU5Îþ3QK`I_bKy¾'Ò%îb»#\iwb1õ·ØV¥2÷¹¯çÄ ¼Ï¸Ìñ 1 v̇Ÿ¹[™4iâPVå£=]Œ¸ÃîñY6 ?Í ý†1Î5¥Ç½DÖ%¼Í˜{4醽›°»€‰ÆiŸ]YC³lÄhK`i+GDâ®Ôù™;‚+œF¾.¿½‰Ù'D×ÒÌ át}IôDJâNå-¡ýê%£×&îä|šœöÜšÃçWâ²1ä^ÊFpÀö µÞÌ¥ûs91°9ï‘qŒ¨Òj |äÄúna‰ `¾¹ŸYÄ>ùnrúÔ5ÁÔÞñU¼äúÐV€6q×§/FÜ1.ã,l†jë6qÇ*P¬{Ú„ œí=ì§í8ß%îúÜ7®¸‚1má`òH+P:?)Ñ·nKà¤xž‰òc_ûذRŸõkꓱ„ÈÒOd{Ö5Žúä£ÄBÊ˱mbãšÚfÚ6.^_w}ÒWÜ)ÿ}ìZîYú‚-™¼ŒGþ´MÜáKsÞEW\ÓõŸŸš[çëU7ùúH“¸Ón ý$ QÆÊ[)«\Ó&îúÜWŠsbÞg\Æx;Š]`q·2iÒlõ¥ïÒo$ø%î¢ýˆ0¹’WòÕoe;è?\Câ8þ™—gד,ÜOœÆ}ÄyÂïÉÏŸOƒe#î~üå×ÚùS9,µG#GÜ1øiÀœžŒM^¥#øÀ³íN¤û²èɔĂ–{ÉWDÏó”ŒÞbÄ]ìØYÜñ,@~ØØ&îç‰Îe€\¯mt>sÿ}ŽG…už0¸êeóÿÎdvå»ÉéÛØ²J^©Óx®Ï¬v¤+´!F%n œ#mâ®OF(^ÓGÜ1›>ôÊÝ\϶nwŒSìãŽÏØêàžûî_ï:¾£MÜõ½o!âN°ºA=P×ñ·&% æzÖ-í·ò m?c{xVê“‚ÀŒþI€©mríY×8ê“¡ÊKÝ6CÙ¸¶¶™¦‹×–Ä]Ÿ4†wÑ®åþ¨‰1=úþ6q‡=b@Î?”â• ß‘ó ô™ØØJN›pœvÌ×GšÄ“Oä_qþ‡~ƒ[ù6q×ç¾RœÅ]Ÿq™ãâ3^"¦ôÀâneRÒÄ _Mð"¥œïÊÀ®ÅcšTË%±:Oÿ¢Ÿbïs aBMï8² ÄUz†•gmã5ÚîÙ¤&Ųw¼]‰evŒΫôæ@1ޏÓ[ÇòÌÈéU¨œã!íèeH´ÿ– ¡­Jâ®~pý¿{tãq„¬Œ\Éè#îbç–㟳1ä›ñÇbI“c1ߥrέ Hxv+o‚ëø¼_ÚÚ€Ìàaµƒ­£M3(ª³üÛHÔ+"I®#ßMNxþ’ ¼äocà þŸ×¤œi=¨Þ•@t°Å&;%=SÒ&îúôq×ÄÖV¹,îⳞ”…Y§qdx¨¶nwz¶‚€Ï*_|¦ÀŒþEZ~¨ï}ãŠ;Ú;œ”U…õZô] U·ôaòßäÇxPŸîcÃJ}R0éƒôíøblϺÆQŸ| UXê¶ÊƵµÍ´mœhw]i,VܵٵÜõ&Éøó¬¼qLâNÛ-ã–«z5pÕª‘çëJ/a+Á÷2 ï[ùÌUÄ8;tÔ· Ë©Ÿ€aìl`3ËTb¨º¥_ã ü(7v|’/›Mê²aM}´jF¹¢SÌö ºÆQW>†*ä¶™v¿ÊƵµÍ´mœhw]i,VܵٵÜc{ôD!“ÍzæN«VúoÔÓ³‰e¨7ꕾ‰àY¦ØîŠL€á#ø9êˆcšì-•¹Ï}¥8'?Õ5.sž˜ž×¤ô…qò!(+«C”'Çu8nú´®i ÖúôqòD¥m @0Nµ,öºyQIPWû¦ÝÖwcJ0ÊùZ:uÏ5äËë¸ãþ{ò­•$M&õ¹zŠù¤Ãù,î(?³…ŒMÚœà+×ößò"m5Vcø¹\™¡ê(;‚ƒ>G>É/Î.ÛÖ6ÖÔ'if!žíôGmù€!ʹm¦Ýïa×Õ6Ó¶qÐ$îºÒX¬¸k³k¥þˆÀÐO`3øL]ÅUþZP¬«¸­•çÄ%“%q¹Tæ®ûJqNwÐ6.s<€´)ýF?–nq·²(iƒ&²¸c\ÓãÊãMc½é=Æ öŒëô»’ñ|)]¶w2ž—ŒOžû¶•ï`|Ї L*â ¦½jSwf8ºœö4Á©à0òà0+‹.± nëÉheÖ;7KûýÊ¥]›DV›´êfŒ1“Àân…²œÄ[…Úf"ÍÊ Oä¶ž Ì¢3صíÏ, î÷+—>vmZðüM~“Ÿ1Æ ÅÝ e9‰»¦½þfeÑ'r[O×íòÅm³récצÛ³òö0cŒ‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1fLÜ}ÿóoÆcŒ1Æc"k®.wÆcŒ1Æc–‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1f°¸3ÆcŒ1ƘÀâÎcŒ1Æcf‹;cŒ1ÆcŒ™,îŒ1ÆcŒ1fø}]ñ`8Ü{RIEND®B`‚82-1.11.0-05-notification_user-var.png000066400000000000000000001646061516513262500347620ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/82_changelog/v1.11.0‰PNG  IHDR—ÅfL 0sBIT|dˆtEXtSoftwaregnome-screenshotï¿>)tEXtCreation TimeDo 01 Dez 2022 11:23:07 CET}»ˆË IDATxœìÝw|eâÇñÏÌnzOH @轆"ÕŽ("6D±bÅ®g9õ<{9ýzxöÞQADÞ; „RIÙd³ev~$`€ DÏïûõÊÉÌ>ef6¯ùÎóÌŒQæñÚÈ“Sê®ï&ˆˆˆˆˆˆsf}7@DDDDDDþü.EDDDDD$h —""""""4…K šÂ¥ˆˆˆˆˆˆMáRDDDDDD‚¦p)""""""AS¸‘ )\ŠˆˆˆˆˆHÐþáÒÊË‡ßÆè+¯äÆÛâ“¥.ìún”È_Ž—eoŒæþ¦S¼ïÐZÇ׿}•E ^Úvl «˜ÒrŸþˆˆˆˆCκ­æcéëcxaN#F<þg§9*ÿ:ÿ%n›ÇyÏ>ưÆΩvÉfü´„CIO1(œñ<ÿǵÿºôðæ}ø&?ïlËÐ+. Å[HhbÆav¨Öº"³Ðú`m`Ê#O3#7Ž"“ÛÐc襜ٷ1¡A—ŸÁäÇ^fóñ÷qÓàÆŒ« ‡ÄÆ=ç?<öQÿ—‰•GŒ]4ƒ7üç%ÏsMÿL©C½[~ã×Nº éC#DZëÁ‘çcÍûwñîoe{…*G›‘üí‹Ï^øVcehë?u'ÌÚEæOã™úÓB¶{±qÕ¨3½ÏÁé½›z¸ÿTDDDDþ,Š–|É´ÜÞœ}zkÂwŸ;Yy,ýr ®—r|Zí)¤Žá²Šw“?šN¿ûO#ùNÔìâ5üüÕ4ZµBzŠ“¨f=é?0‚F¡@ ‡ÍÛ¼$õÎðÓÚìio­uýéDvÁÅ'§aØnræOâû÷ÇâHzŒamB~_Ͷ± ãй™D«Þýˆm{ØAþ¯N}´ñlþŸ¾ §ÁàC —6¶m`ü7žÑ ç_ÜŸ„ª¶™Q‰Ï§k_?)‰¾Ëubå±èç¿.žÞÃn⼎‰ô²eÉLûài²²oçú³ÛþþORDDDDª±(Zò!o¾5“\k6ùÖí\}fkÂy,yïyÆ-ÈÇ^P€}û­œPKÀ<´pJ`õx¾˜Û››úÇï³0@Ñò ¼óá¬ÊõÛ²ï½’Þ <ðÈ$²-Øüô5\?–«ýsøqj4mÎkÄÌ<ÊÔ ¾ý'×o¸œ'ÎÙÆ/leè31¬±Mî¼yû³_É,„ă¸lôHÒ Ê3¦òÞ;ß°d{9a{pÖµ×3؜ăªë‚42ËÈœú6ïO^Ìw$MzcÔ5gÒ&2©ýoÌ>t­XÅâm>ÒGpó˜!4;Œ}s9ZЮK'@ûÖ>6,~™ùø¼?ðôבÚ9ŒíëbúäítÞù=ã?ù޵9±mOæÜ«†Ó¾h<Ï?7v·?Ãyíœx–¼Î“oå3è¡ó(˜5ÍœÀñm£1ü;YúåûL³WXc:Ÿu #º˜üà‹ì8í nœDîÔÇyqNgÆüsMݳy÷ïŸvÕó\Ö+¼~7ÒX9¬ÝÓÇŠ—gÜ¿²iW€èf}8}Ô¥´ZùÏ}¹ øøŽÇÙõðƒœ’¸ƒùŸ½Ï´E[(s&Óö”KqVgb|óyÿÎ7)èÐÀÆõ4ԃ߮¢ËÏp^;®Ù/ñô'n†aì‹)³+——çzisù—1´GÆzÀј>Ç3°©kÖ‹¬­hË9¦s4-˜Ë¢¯–²1p »ÆòÛÚÕú!s½‹”^ÝI6K¯ÆÚÄ’ÙD÷¹›¡ý:àô‡²~æ ¬ZQ̨6ͱ¦g‘íò“±¥Rv’±~]½›q7ìB‹˜zRþõLþç&ïõÇ:컞À ؼn±½9ýæ‡éíŽ &2žÐØ ˆMN Â^Ã’…ù$=gôn‰i· |ÕbÆÏ_FÉqQ€ƒƒ.å´0¨ ¼cKÖ¬¢à,7™™>ßu¯ $õÁΞÊËwN­üňæ¸[þ͈=£’6e+æÔ|¬øÒ/ÄÚÈš•.’ŽΠãZbZadýº‚upÀmU_‡B`';ó¢HkÝpÿ«eV;ÖoÅ‹gÖ¯Œ¢eÛÖ$…i~¬ˆˆˆÈÞªæ5^^yc6…UFd{†Þvð` ‡.3a #ÏŸÁÃã>à‡³wŸ±(ÙUŒÝœ‘•'mfr ‰¦‹â bµ–Ê2]E%Ø‘ÍI0ˆî8„‘9±ò¢‚Abr4öº"\(ÀÀ0wG˜pZwïD軫Y·ÆÍ†’dºtM­÷‡# Žç¢«N rf®ƒ˜Æ~¿ÊRÛ±{žye•á®0‰o°ÿÅ•Z¶eýpà0ýø}5 :"aÛT&ÏÞŸ<¦/ëI‡Î –""""5² ظxý^o°ÝÛX½|+}›´>èó+9\‚I£A—sæ¯ðí”­øh˜Ä&Äa”åQXaC”A ?B;šN±‡›>L¢ãc1Ê )ò‘àÙ¾”…Û¢éÜ2ƒ÷ÞžEø¥òÒi)ýá1îûü ÅQÄÆ†à/ȣȆdÃfW^VH"ñ‘‡ÙÊ£Í×”mÚäAGáÑQ˜!r÷etÜ} ¤FL´³u:í#^eÉ” ²»sN{Í5¢ˆŠvØù®>­qU˜0pD&âŒôÓ"òGæNË!,ýÚw6HøþGf…B³ Zý¦ $6oK‹=O‹Ý^ãAo»r( íÉùœKDI³?ú/ß~ô=mþ1|ïkŽX¢£mr󋰉ðÝì*paÄÄ]Cj ëNÇ{,ø¦ˆ‚ÄîtlRï[ÂhܪíÞ÷\î —µ+°~÷jŽ(""äaÁï‡Ì·åÔK÷i4oæå§¥kñtíÊÞµCi|Ú.ÛõãóqÕÈnD+[ŠˆˆˆìÏÚý𞪩°ÑñDWQ²ûLªòS˹Ôá ²„´äÌ+N%Þë©:á4Hè9Žær¾þð'–®˜ÃWŸM'/¹?ýÚ:1£œ-Kç³>¯®w=$¥÷¡µ½‚リÉòe¿ðÙ+ÿáÃ_·cy=x~Js¶¹lßÎÞ‚eÛØPK]átØ›è SùôÛ…¬\8™O§n ¦÷@:ÿAŸGSw±]ûÒÆ™ÁÜ–°³°ìeß0é‡,¼Òž.CÙ´:‹è®éûGKº÷j@Ñ’˜Ÿ™Kq^ó¾ü‚åE8[Òº¥Ma´éÔ g£Î´‰ØInI­ZÕ÷ý–ug—¯dêÿϦ,e‡ËÆa:0NL œ!aöN2æ¯!Ïך½“ÈŸõ9Ó®bͯŸ1}•“6Çu'¶†/’Ù™Žm!{ËNb»v§é [Öî ÇÊnÎÖtêMþì ü´`)K§~ËÊ¢Êoû·e=1âIÜÇÜ+ï ¨¾Ì¶ØÑ´ñ wßp"ɇq9MDDD䟭“Çòyõ{,ïz’ÛFW»sÒËŒ_\Zë{Äû|0¼ÃpFˆßS€‘t2×Þ:Œ” Ÿ3ö¹7˜åéÁ¨Û.¢}(É}4 !;z‡)«Ëëübs£á`®}2aKÞç¥?e]âYÜrÝ $5Ä%çv lÆ«Œ}o6vZs»(,²k©Ë ª×(nÙ†ÜÉcù÷Ëߒ׿bn¾¢WýÝ+v‰'pÑèa4Ú9q/ÿ‡ ³ËIëÑŠÊÙ¢¡´êÞ‰HG<ºÕ4ÚJËsnfDƒ•_þ—·Þøš¬˜î´oDЬm3‘íiÛ2Íhß1³a;ZÆýy6œ™r ]Ñÿ¼·xõ™ù¥¨=g]6˜Fï|ýÒÊXòùW¬,rÒòÜ›ÞÍËÂ^âƒIY$œq##$Ö|ï­Mûô¶„˜q´ïÚ²þGrë öce·: ¿†“Rw0ã½7ù>+f)•ßöÚ¶eý0ï4’ËÏoȆ÷åÅW>áÇŸæ×)ãøè©{xþ“”¡„*XŠˆˆˆ@MOÉ€´°jï ¯öñ=†sz÷˜ZŸGc”y¼õõŒÇÿI9¥õÿ„Y9–lÜ _ã™qá\òäÕtЛ.ê‘…+k3§Ï#sû.¿NÇú7sï]Q¶‘¿ªú~°¥ÈŸW ›…_Œc•ÑŸsÏê¢`)""""i¹<Â4r)"""""E¹‘ )\ŠˆˆˆˆˆHÐ.EDDDDD$h —""""""4…K šÂ¥ˆˆˆˆˆˆM¯"‘ iäRDDDDDD‚¦p)""""""AS¸‘ )\ŠˆˆˆˆˆHÐ.EDDDDD$h —""""""4…K šÂ¥ˆˆˆˆˆˆMáRDDDDDD‚¦p)""""""AS¸‘ )\ŠˆˆˆˆˆHÐ.EDDDDD$hκ¬dmþ’<4žmV-+…táªàÔã5íÙ»øé©Ûx•M“óç‰ [⨟–ìaíZÉ´ “™µ4“ì"ŽèdZt=¡#†‘žrt+·KYúÞã¼6ËK÷«âÆãp´÷ÌÁû`Çćxðó,, B:ŽâÙ‡†Ð zÃì~zê.>XåÅÆA‹‹žå‘óš`Ö©|©/u¹4À4ÍߌÊ4`æ^7ê)W>/ó^ŨK/ãÎ÷VS[v>Tö®9¼ñð3|úÓ2¶ºÁiâ+ÙÉÚY_ðâ#/13/pk«©ElÎØA¹;õò8ʵFmü™óYœoïý×ÂEÌ_ïÃÞwíúÞž"""""R«:\:šà‰÷GTþb1ý™Ûxw…Ÿè“ïå¥ë»×­¿”ÛgLb~1ݹäþ[9£e$¾ì_yë©7˜W°„ SÖÒÿªN‡µílÛÆ8X’7ÓrÛ=$­óÓ¢w‡£<Š[×þvØëS¶?“…‹ò<$¹jTÕ¦pÑ<2ýûFË£»=EDDDD$xGü\ÜvofÖ¸O˜2o=yåÑ;Òÿ¼ËÞ7•P+ƒÏîy„os"èyÞyD­þE‹Ä4ç¸×24jŸ}ñ+kwº KíÆW]ϰŽ1{>E·ÓO„•¿²6×GTÓœ1êjÎls€)ŸlŸ=žÏ§Ìaíö"üaI´ìq\z£VóþíOñÓ®Ê SðÃã\=ý8ƼqýÂÀ›=‰Ÿ|Åo«wPjG‘Üö8μäNlÈá——žä“µ1œzûC\Ô)bŸúm\ť؀™Ò‰Í£0°Ôã9÷Â-„¯sc64ðÛà4j¯ËΙÌû˜L³ gaÅ· Éïz •¾Ç‡+¼Äú;Ï_Û•,6»G¿Þ­Fòä£'±æíç+§ çîž&lS²n*ã>ÿ‘¥ó¨pÄ‘Öõ†_~Ý’ßÞëuîo%GRâvå³aþòÏJ²Ø,š—ßH 9ÑE~AàËwþéFÏEDDDDþ7ÙúX;˜ö¼õÃr²K8œ~ж,fêØ'yQéïSí2–LÏêŠXâ#l<…™Ìzûa;Î"ü”n]ÀøW>gµ·Zùv)+~ø‘mΆ4ŒP”5‡qÿ~Y…ûŽtØìšýϼ2™¥[+ˆMkN¢OÆÌOù÷ÿMf[ †Ôik!I-éÔ©q&Ø»~ãÍ'þÔE[Øåwâ´KÉ^1wžy™Yù6ø·±zu>îÒͬÎ(Üo '˜4íØŽH¬_3öÕI,Ú\ŒMO¼‚k¯¿«ÏìH¸Q‡ºvó­dê¸9l+õc:bèÖ»-NædíêÊ{aíBÖ®ÍÁÂAÓ^½hTÞõmþšŸýˆ™kvRN¦§óÆóÒ3Ÿ±Îsû/ˆþîÞ7fÓtohâß0ŸEy•%Ûù X˜éÇHîIz3ªÕw¨å‹ˆˆˆˆÈ±vDÃ¥{ÉWLZ储ž\ùÜ›¼ñÖë<2¼5N»¹ßΦ`OZpÐôœ‡xæé'xú©Qt 1°6iç?Ê3O=ÅÓÿNsŠÖ³>»úšžó0ÿzúqžø×œœlb—.ã§Ù;k¸§ÐMVF>qÍZÐeÄßyê‰'yêoCH1m‰Ž«b£Ý“ž­>fÝú-¬^[Ê©±+ÉðÚ8÷¢gÓî°´¶°n]6NZ÷éC²Œý¸`´NyÐÈbóÛ~r>¾—׿þ¾Sœm/âá;O!¡.ýü½9¶×OjŸ>4üv", ÷ŒãX<#~3…ž}š`mÜgÿÔ©| ]ŠˆˆˆˆÔ—#.”–¸°»` ³§¯Ù{±§ïçUîcwH°±k-‹ˆŠÄdŠò˶]üôé§ü0?ƒœrÿïeÕ6^k—Râ²Å™sù5sŸÅ^ ²¦ÏîÇ$ªÅ†ß<€óÝ;Y9ã >þ|;ÖNàÉ=xòwꪑрô^-ù|}&™«Ö»ŽrÛAÞ½HsÀ~sXå¸Êm0B‰‰ ¯ÚÂ!¤v?•T|,8èþ³¡¢”’bמâežj£ÆéïEÍ÷꛿Y_ú4žÄ׿³p¥Åâ ~ÌF}éÛÂÏ OM;þ`å×ÿëgDDDDDþªŽ`¸4ˆˆ ¼„v½Žÿ»ÿTâöH²2ØxÄê³(ÞUBƒÈ(B÷­Ë.bî›Ïñá‘íÎàÊ¡ÝI1V3~ì7l¨õ­„‡€ƒ#Ÿå‘s›úÜa+ƒ ¿Âœb“æç<Àͧ$aD4¢ë™£¹i/Î,%7#“»ÍAë äL>@%&)=z’6.ƒÍ«~bjL>³2pÖ°ÌH¢# ¨ðRVæÅ&wÁ ÊmÂ’¾ÿF¿Éû£·¿¿‡K¼^¼fÇõiÊ76ðã»Y&©}ú’fzYä=œò[R_¯Yù«;‚÷\:hѹ‘†oõd>Ÿ—‹°J2øî•ÿòÃ6ߨÃ"'3“ ¬‚yüºÌ…m8HkÝ|ÿ'™Z[Y—áÂ6Bh{ÊpNé“NÛ”0{ ˆ•ïçÄÆ]ZZ9JèhBçNñ˜Xlùa¿l­ÀÆÆ½uoO¦Û,v­þ‰ÉSæ²Å]Û™LrT1¹9Ù,ùîkîtcVñZVorΨhÂu©ëÀÌÔÊ)°]+X±ÅÂLêAV»3›Ñ¾]†í'sÞ|ò-/áÓ'îåûfÜJëð÷_]û[-øÙLšôíCSÓ¢ ·ËlÂq}Òp`⦅£|9¶ŽèÈeôqr^§U|²*›™cïdÞÛ‘˜eT DœÀI£"‚¬#@ÎŒç¹k^4NŸ‹ Ÿ׋ÁS0(Ú{UGcš7 ÇXîfÙ;÷rÿ”0Jwæâ²Ã‡Ï`Ò°Q &[)Ÿûn]Ú‰‘Ï<Ààs.¡÷ÂWX°kïÝŸF9±Ê*ð»÷`nî•Ág/¼Íœ2“þfüóÜ} cÄÓïâ ùmǬÞ:±wÿDHXx¼øl#$•OëN8¡tw€È¦ÝrãC\×/ÃÙ„Ž“nFÇ6ñ5¾c3$íLîzü~.Ü“VÉQ˜~?D&Ò¬û .½ÿ\Ò%ƒ:ÔUëöpФW/:#Žn½ÛU>éBšŸÇ÷\Æ pãI¤eÿÜñÀåtŠ ¨ýW×þîÇLå¸~-pÒúö¥ñŽÈÃ._DDDDDŽ £ÌS÷ÇìÔ+ƒÏîy„ow:èvýËÜ}ÊÁB—ˆˆˆˆˆˆKGväRDDDDDDþ’.EDDDDD$hŽi±""""""ò‡¦‘K šÂ¥ˆˆˆˆˆˆMáRDDDDDD‚æ¬ëŠ¥¥eG³""""""ò'Uãßõ@ š¦ÅŠˆˆˆˆˆHÐ.EDDDDD$h —""""""4…K šÂ¥ˆˆˆˆˆˆMáRDDDDDD‚¦p)""""""AS¸‘ 9ë»G’§ÐM‹\'‹:„иžÚPTn1¥,€Ï®yyX˜ƒ³âLbm³DDDDDDŽªú¹´ü\º°”¨ù¥D/pÑj…›{ó¸ê­AGB€/·”3z³—_ý6VõŸÓs*¸.ÃÃTëðJŸ¹ÉÅ€íüG¶ÑG”íðc¡Ÿ/ ý|]jSQß :ÊrËüŒ/ôóEŸ/ ý,öÚàºBlÆgº–Ø¿lÛÏKËyÖ}Ä+="¶çºi”éçÚ<9‚ŽH¸ôúäøm‡úAÃÁSÝcpõŽbF ÙÛ˹*ï0ÊùÃ0*ÛnÛl,³X¼ÏÏÆªTh×’>rJ<\¹ÊEÃ…¥¤.-纋¢cÑô#dc~#2Ý\•éæ² 3Ø×ÊÀtzÎÞûû»¬2úÿÁô?®s3*Ó͵Ü\™éæÄåå\W`ã­cî’ Ú/róz]?Pg6óò¼|sˆé~é¶2âæW^ô‰Yà¢í*7ÿWr4ó^»EDDD¤\±N IDATþ.­ïl,£Å’2Z-.cÈξÃ)Ç0hÊ«-œ¬Úáež `³:¯‚S–ºH^ì⬭~vBÕHM#6º¸ÜEë¥åŒÉÔp2o³<·‚“–¸H^äâ„>–Xàsy辤bÏè¡§¤‚öË=Ì?‚g϶m³`—Ÿ‰…Õ,û;ÀZOÍ•ùÝ^.Ûà'¾Q$k{F³²]Ùnî*<–'÷Á صÿþ¿¦"`pJóhvt £¯v À¸eŒÎ¯KÀ´ùµÀO©añeá‘¿¨2/ßǤÃiñ "È;.†]½"—c³¼Ì=†ûñpÛ-""""õ+ˆpi3s››;ó¸Bœü£]™„јèh'=,‹…^(/õrùv›ËÚG±½k8]Š+øgÑî3\t?v‹fY'+¶zøhŸ3ùò/£vØ\Ó1ŠœôH® x¸b›O”“!¦ŸïË*×[Qlç$Ý¢áµ2¸º}49½¢ÉéÉ‘6¯fVð~ 'Ïss½lOãé$“Ó )2„‡šÌÜeQ¶Ïº–ÏÏ#ëÊH[è¢ér7ÿ(²+GûªÂ÷›ÜœºÂEË%e\•À0°A‘cÏ1`š1Al×¼,w‘¼ÐEÇ5¾ªì¶ßâ¿Êh³ØEê’rnÌ ì™~»©°‚S—¸h°¸Œ 7»¸´‚_j»X4› Å^>ʳȪ:â›F²£W$c#üܱÍO 0oG¯aÌèÍÊÖl­`‚>wo²èÖ2Šm鑌1m2«ºw´úi–"/wgûÉ­Þ|ÛæË¬r®¯%`î*òñs¸“ œœêóóEµì¨à…@SÓ£YÜÒ½ûX±¼–å!3.œ5=#ù$Ñ wßáaÃɳݢx0ÚäüVÑ|ÓÐÄs€‹-µÝãlÌÉó“é —£rûÞ¹Éâ”6Qd÷ˆä&¼Ü™máÇfÚv?F†³ªW³šÀ§Y>fUk–¯ÂÇ5ýôlÆm‘FÍû£Ø±_»uß""""RÏ‚¹4ˆ®:óó¸|¼Y`e¡‡³WV0ùp‡P‚A¬Ã&×›rܤ-v‘ºØÅ©ÙŠýÔ8u°a첪/³ÉóAj¨±çäÔjÐ$`“€ãœøJ,Vx-¦{ >jÖ5jšÎk ·dxXº»Ñ¶Û†óàm x}|Qnr[ª“RbB¹#ÖâË]Êm`˜œ™ä ˆ‰4i°ÙqÐÀ~øÊJ=œ³²ŒËËH_^ÆÉ}d–x8ceåïéËË89ËÏæC,7Ì0(ðØdL5‹d^3Q@ÇF|ÛÌIS’bô5`«ÊJü̉áŽxƒpÓà„$'-«6çQé»é`T“°,¶m›ñYå\—¿{为S ,ZÅ;iáppnœÍø«òÂŒà»b›³SCéæ„Ø'çW]]øü|Wáà¦F˜­œœä<ø1sÀ‹-5|¡Šòݤ.,%qQgdÛ MuÒÎÓáà_¹5ÊÀ4MΈ3ÉõÚX@˜aSá³Ùè‡æIáÌêJïªfÙ~?exð¦Fð|¼‰ÁÑ;EDDD¤þæ«Hlæíôáu’Pîg—ÇÏ}k*çÇuhÉàÃn()õ³Èáà¶PƒR§A÷&üœºÏè…½ÿ£^¶ú ÁQ=)$‡@¶×ÆÂÀ |²Mƒ£ ò{ù"× +6„Çꙹ†Aç›V•a!–ŸÏÊÂH©\n€;`µ‡…€ &M÷lƒ¦aU'úûTŠ ØFU`Ïw“–WµÈ#¾æÀ~(v¸,ÌäHæ§€¿ÌË©;M~hí$*§i®ö³*à¤y]·µáàomÂx~»‡3—ÛDG9¹¿Y(ç‡@¤àåM|]nãÅ&×2¸(¶À1i´_aG«ïÓ"yÝ_ÎèdeÀœ°ÉÃÉq\Smθí³ç29»Yåñ=0ÁIéf?óš88ÞPà7iZÃó€Š&é;Vu±%ªæ‹-û^bŠoÁú–N€œRfVðI—H.1(.öpwžÅ& ,¿?®r;œÒ4‚{wx¹m•‡¼×6 çî¸Êò¼%>Æ9 ÒíÝU½cQDDDDêÏaÄ*›;Ü\°ÕË«%pUjC£M:G9¹ºYߤ9ö™ÂY‡m›¬R/£7ûéÞ8”¾ôKt—ëáó Û¶YšëáÙÝO­´L+´È·!»ÈÃ{ngÄîÈú&†àÎ÷ðY…M `ÜvʼnNš€éàì8›·rô‰?ôö>ƒ¡-"YÚ=šÝ£y-±úbƒÎ‘°ÒeQ^í;ÝtÍÚ{ú¢IV€í{’¤Í/$U©­©îD§A÷&‘lëMvÏh²{E³cwhºûÞEƒ ¢M“¡±ÇvJlmú§„Ò¸ÐËcEJm((÷ñxŽEŸøÊé »™¡!Œˆ06Û"φü/•˜ŒH0kÝ¡µöÃb3e{/•Ødìòp÷Îk ½ü=×"»ÜÏ£[|Ì,÷ó­>æù|¶­‚w«%çãâLrò=¼ã²)³m6yyÙe2$ÎÀ°,_ëæé’£2Œ8ŒÊ E–/`Sî·Y’ïg–eã³!:ÖÉÀ /Ù”[6Óóý{²säû^a0â³URß´rÒl¯Ã,ÀÄ‹ÞÍ£)íCYŸÊúD39¦X¸ gÆLÊö²Üo³«ÌÏ¥•Ÿ4Cœ ‰°x-Ç"/`“Qèg†¿æ^„6¹›2û [ÈfS±Ÿ)>ƒÎá`Y6Åvåèz¡Çχ…üvåhã7[Ü\—cQhD9M¢ø}Ò 1iÊØT»ÉÊ@íû£z»EDDDäÏã¦ÅÚ,ÝYÁð­~ Ã0Ö<’w“°&×Ͱl814Àx—Í™Í#y?Å<öÓØl?w,ó’Ú>’û"¯ˆ _€÷³ÜLOŒàÓæ‘ 5øqSS“¢ø¿rtmËþl¦n*ãš°€f)á|écÐ&‹" ""„/[›<¿ÚÃŒ`8x°c·æ~«‹ê·úJ<¤o‚w»†ÑçX PÛ6“¶ºùÀåÿš9iþÇ9ªê8ng3½Ð"׋mÒ<’÷ê#X ?·¬¨`~lŸ'Ý` Ð<Òä·¬2ÒkXf:LîJ=Ê 8ª ÎlMv‹ês²>iïµÆõæí§‡ `ñP†nÍøÀióAŽL8ŽeÀ3 ÎiÉ9ǰJ‘?‚:\z=~îËòRšÎØ”ÊwLŠü±Ø¬Êóp÷? }Ð2.”[†2ðO}‘ýÕ9\Šˆˆˆˆˆˆȱz㈈ˆˆˆˆüS¸‘ )\ŠˆˆˆˆˆHÐ.EDDDDD$h —""""""4…K šÂ¥ˆˆˆˆˆˆMáRDDDDDD‚¦p)""""""AS¸‘ )\ŠˆˆˆˆˆHÐ.EDDDDD$h —""""""4…K šÂ¥ˆˆˆˆˆˆMáRDDDDDD‚¦p)""""""AS¸‘ )\ŠˆˆˆˆˆHÐ.EDDDDD$h —""""""4…K šÂ¥ˆˆˆˆˆˆMáRDDDDDD‚¦p)""""""AS¸‘ ýqÃ¥]Äܱ·pÓƒãÙhÕwcŽ kÃx¾áf^ùmv}7FDDDDDä::áÒ.búÓ£ué¥\ÿìtŠ«%)ÿºùÛå—0êò[ùhMm©ÑAXt,q1„•FÖVæ~5ž¯çlÅAl\QaÎún™ˆˆˆˆˆÈu”SŽwí–•œÌ‰q`‘µpùkz\ý=ŽR»lÛÀ0ŽJá•5Ø6†ó'~ɲî8£áiCùÛsC^¥""""""õ¤náÒ_JnN1ÞÀ>“9 'ÑɈ«9¥‘ÑDxÖ°pi 'œ‡amdá¢|Âc¢p—U­d³fÒÛ|üÝrv¸CIé4˜K¯A·ø"~zê6>Øv"÷Œ½ ÿÛcxaN*ý˜¬Ÿ·‘²˜Îœ{óm mÁîÚí‚ïyúÎÈiNrþj²Ü±´?óÆ ïLÈÜóò*ZôjOÉêíô¸çÿ¸ r¿ó%ó6c$¶ãø‹®edÿTs^`ÌË+iÚ½-îõ«) oÅIWÝÊ%½“0íRÖO~›¾]J¶'’´>pÍÕƒHsUÖ×¾ÉÙ+ñº‚´Þd¡Xø2c/å™á;xò©é¤\ño’Œçƽù³2wa4èÌ©£nà‚î Å+™øæ{L[±oD#:z9WH'á;‰YDDDDDþâêWlvýú_¼÷¸ïÞ}~îá¹o¶p É­FD'º·µY»`.¬M Y’O—®Íö¤ÚŠ%ŸðÊçKðwÎ¥g¶Æ½ü+Þüržš ôm#ÛèÍÙçô$¾`'ÎǵßÍ‹6Åyíι„Ó[yYýÕëL\ë«ZTFæªl:w#-<ƒ /¾É/;âè9ä º…g1íµ—˜¼©ª7¶›—.ÎL~xëºÏy›ÿ|¶Ò&ÇsÚ€FÎz—W'n¬œöJ€Âµkq5éFÇ&­8yÔ´r€£õ®žNTõ îÏbÒ‹¯2mS]NLGs Sþû.s‹½¬ÿ _¯prܨ›ÙV~ý Ÿ-*?ø®©'u¹4H8ézFoxŠWgìÀ·;Ì& =®dÌ9Íqà“¶/’Î}Û³øóù,w uÁBòzqNóÍ,ž[Õ€¶Ã¹÷©sˆnؘgs6O_Æìì”ØÍkhm;<‹“¢6û˾/Ì£(1û4 ¶çY Ü£U!‹™ÌŠå[¹ @]¯x”»OŽÁZõwï„´ Fsýð4ì>&›™Âœ¹›Ò¼rÓt<ýbÎèJOß –~´’™%xf-¡4´׌Å€¨¢6ÿ¯/bû)±€AÔ€Ñüó¦^„xÚ‘h~ÇÖ„6ôêÜçêßÛheýÆÜm¹šëF¶!С˜»_\Ä¢Õn¸½Ø˜¡‰tq7m—ÒàO{穈ˆˆˆˆüÔmZ¬#‰Þ×<ÀMTLLz\Ž· ¦Ih-Ÿóz‰ìÙ—vŸ}ĢūH]”Gbᄂù3ö<-Õêc믟òÝ¢,òËÜT”¶}§©š8j_ÏŒ'ÎíríY/,,°JŠpÙ&-““0»A Ì‹Š ì•k bãb1씕ïbW±…íYÂÛ·\Éۻ׈+¦ÔŽ­ìOXèÃvu¢BŠm‹Šoã†owÿÕIi‰Ÿn#®å´ü™ñÚ#ülÆÖw8×\Ûª¥ŠˆˆˆˆˆÔº?ÐgwÀt¾ÄÄÒ“¸éÆAµKÀ¶¼ø¢zҷÇ|4éC6å%r\ßÖ–x«Öýýk¼õ}!é£î`L×<&>ö_æ~*ëµ+£¤•—KAÀ$*:†}ï uÄÆm(È/ @$v~.ù“Øø¸=s…+Ë P›OÀˆ"::–¸#¬-çÝy)]#€€E $‰¦ŽÅ‡ÔF36žÃ$æø}ZcLÀ²D7r³5”.—>Êð$«¿{Ÿ·¦|ÂçíûpßàÄýú!"""""òGphO‹u$ÑûêÇè]çØØÄ‘Þ¯½±˜]ΦOk'öâÀžån7¶íÇ•½ž%y«Xïâ #’«³dîg¼±VüB> 8#½)fáÞk9Ûô§oÊÏ|ÿÝë¼UÑkÅOä˜M9¯_ Ìl?+&ü—O¶Ä°qÆ&±ÇÓ½umNìIÌŠü<~ž.q­œOn·Û¸ÿäšb†j`eüħSc9·Ùï‹­2 m“æÍ䈾¤Ù›Y´2‚ó¼ ßw¯ðöú4_|:M-p®×—ˆˆˆˆˆÈ×1xþ¨AL~t wr\_Zì5gÔA‹Ó¯`h—(¶LŸÀch–j(*¤(p ò^_D£JüÈÂÜhº ͹íj¸_1¬#Üy-'¦³ð»©,-kÆ Ñ·3lOM’“aÅϳØìhÇ×]LÏ(“¸þ×sÇåýI*\È´É?“at℞kNé!8uXW<X°d;åÕsH+νㆴ7Èœ1™æå‘Òw mãxÍ͜ٺ„Y¼Â3Kh9d4—ôÕ¨¥ˆˆˆˆˆüaeïáþÁT¾Šä}vžüwþ}M×Ã~‰§gÎ Œ»„ô[ßäÖþaG´""""""ÿ‹ôæD šÂ¥ˆˆˆˆˆˆíjZ¬ˆˆˆˆˆˆÔ\ŠˆˆˆˆˆHÐ.EDDDDD$h —""""""´:¿­#cý¦£Ø ‘#§m»õÝ„¿=ÐGDDDDDD‚¦i±""""""4…K šÂ¥ˆˆˆˆˆˆMáRDDDDDD‚¦p)""""""AS¸‘ )\ŠˆˆˆˆˆHÐ.EDDDDD$h —""""""4g}7@Dþ˜rJÝõÝ‘CÖ0&¢¾› ò—¥‘K šÂ¥ˆˆˆˆˆˆMáRDDDDDD‚¦p)""""""AS¸‘ )\ŠˆˆˆˆˆHÐ.EDDDDD$h —""""""4g}7àÀlJ×|ÍûO'£ØIr÷ጾv ÉF}·ëÃ7ÿ%n™Ö‰gL‚¶‹ˆˆˆˆˆÔ£ åŦ/îçñÙí¹ãÉkéU™pì’é<çú½t'D×’zì22ù™âögÑ+ÕÄ=ÿeœÖ–û8ƒk-_¿þÖYwñ÷n¡9‰9ìvÚìZù# í^œÖ5ÃÚÂ×ü›¢‘Ïqe—Ã.ÀÚð)<2‰lkß%!t»þeî>%–úÍ}ûôý kûæý‡G³ÎâÑ‹[ã8&í“?;+1ß}:ërð„$дç0οð‡äW,~ƒÿÒšÑw ")Øâìr6ÿü ßü¸„í% ;Ówøå î’€½ú}ž;´QÏpUÿêßY›â™ÿæ_Ÿì¤Ï]Ïpn[ÇQí¯ˆˆˆÈŸÙ¹ äÍà㯎çÑË;vHŸ,#ã—)l‰B¯T“ðÎç3:%Š$l÷Nv–¶¤ß€Ö4Š2hÔ0¨²kå÷L³Zpj×DŽTŽ¿j ¾&ÁwßÑúžýð ÀÎoæ±­çóÒ˜^Y¤}ú~€µìÒ,Ë £¥á$,ÄĵuyiÓ@3§¥lf¾ýÚÜÀí£;S±•ù¿Ìp×¥­C¶mc5³°ø$9ꈌÌ{V~Ƈ?z8íæg¹1ÕIñê‰|øÞ[DÝ÷7ú>6Ì[LI¿“‰Û]ŸÏ²¹øÍ˜#Ö_‘ÿUG \„µéDä̘2ðQ†·Ü7VÙ¸Ö}ûïLeE®è–¸ðº+蟲ŽOîËŒÜR¯ÜNñðp{Ò—ü?{÷Eµÿqü=[R7 ’HB jè Hµ€* ¨ØõÚ¯¨÷Ú{Aì+(¨(MPA@Aé¡B’Mo›ÝßD¡]‘Ïëy| ;³ç|ÏÉÌd¾sÎ̼2«ÏÞÄg~†Š*2î»›­7?KëŸïaZƒÇxä‚z•;øáƒw™²tåþq´ë3C{Åão²~òhÆ~·§ÇAb·k>°ÛFßÏGK (çîË·%0ÿƒ7(ô CšY_};ž_òè+ÛHN«`˦½Òˆóo»óSkÝ;fáj¦Œˬ N¬1m¹ô¦áôJ0YôÊ­|mt$4w3{r+ˆèП¾qëùî‡ rŠ âûÜÌ­7Åç—<:2ƒ¸†¥ìØå¤Ü¿1Ü|3ç6 8´¢ÚµýŽ®8Š©GÀ~ÖÍ˜ÂØ-Ù›kxì—$º_“DrdðIy•¿5ï>öî mP~VðK¤s¿‹Ø» b/Ôõæ²vʇLÿi+¥ñ´¹ü.iEñÜyiaÉ•›Ù–p —™Ÿ1¿áƒÜzn=,T°úÝ,L~„ëçòÁ¼¦ÜwWOÂ(cû¬™øÝòÜâ:]Å€+;P×jRž9‹Iã¾eý~i}è?´/‰A5·\/E{öàjÔ—¶ Ø€º-.¤O÷OÙ[P€5®) ³fUnwºUÏ¿÷î[ÂÊ‚Rbrk×^]‹‘ÓØq9²ÆžÃà>fù–=‡L5‹áã×$¸ÿ“¼ùþ(îl³—ñ¯Oa;-øâ“\šJ‡[Gñ@ߨ߂1gr˳ƒiЊ!/¿ÊÖ5s`Û¦¾ÅWeݹÿxíÁî”Nz‡»¼T,Ïè_bòÂ{¼ýüÕD,ù€©k¬t¼e÷CÔÙðÒ] 1jŸ»zyQ6–.wðäÈQ<е€¯¦.¥Ô¬eǘ¹Ì{çVÄ^Ë3£ßá¡^åLý`&{½^JýÛ0ü‰WùÜ "—}ÀgÛ;qçs£ùÄùx¿È¢³:Ærb.y˜g_Ń=˘úÞ·ìö\U­ÛΑcÊŽêÌ ;†Ð!:„ˆf q—4Wb)¿ÃšLË¥üüÙ—,ÛêÄe‚%®;—_Õ…ºûf½Ã¤íi |ê ¹¥%{?ÿ”å…¶kO±æ7½À†v¤iÛ4ò׬¡Ð\lÌŒ¡y«ƒ§q»6|Á§ó8ûÁ×xò©›IÝ=žI?9ñ–¬`ê»s±Ÿÿ0|œsçòÅ·™|(²P·E[¢6Mf¬Ud—zÀpÐô¢áôL­o´¥Ò&½ˆ•¿dq`÷ò°÷—%TµéHƒ_9f{OlW‹ˆˆˆüÝŸÓ!ÃJÃó‡Ð£ük>ù>›šyOÅÚŸX]ï.n‰ÝLbŸKèPö3‹·v“bíxv°ti%í/èIƒ@+ñg3pXwZ¼Ø÷çÁ® i¨ktZ'VâÌ+ãX¹àïÅg„µ¤S‹p,Ø©ŸÜ{“¢Z&—¦s) 3qîÅ- ·ù{Všf¯a] XˆiÒ„p+XÂSH®DãŽé„YÀZ· ä9ô¤’LZb vb»÷$-g ëò¢¶m?zLUlŸ>ŽŒvwsŸ ¦NXIym“h9}¡´¸öa¶­dÙ˜Gyòágù|æ: Ü€g7«~É£Éyçlÿa7Ú5ØÂ† ¶¤N´©„Íbàß´Iû×°¹ØÄ³}5™uÚÐì ›,Ýl[x?ý¢ IDAT¶š .}ié‡Õ‘L÷ié¥bÃBÖ‡w£wÛHì¶ZtMdz~-Ù‡b, ÎçÆ{.&jûTÞ}èn^~cËv—ÿ¶˜UP¿sG<˸‡Ú½Ëí´é‡é6¿½""""§¹ã÷´XÿTú]Û…Gßø˜…)mª?4))(ÂEèoWþ#‰ /ag‘÷h%›YDQi(1a¿æÅVbÚG @¥‹m_½ÉèU{(ñ@e›úéÇ,ìØñÕ=duÃÀÀ®®ÏkÖ'®Ô$øà‚Á°`©‘êÆQêñ %4 Œ’²ƒûÏæW»¶=&+ }îå_„Yoà®VÁjØRjÃAr¯kIîu5ÅÛ—1÷‹÷x'o8w_顨°„•ïÝÍÚêmÉô˜4j{„ >Íh™ú)+Ö›µ‰Ðôs¨cPcôÑMYqŽä_¶càß°1qÎ.Ƶc ¯Þ=­º/^ÇYìšö_Þœ•;-oÉÀ6vüã:rÞðŽœS‘Í–™<ò *þ}/»R‡rNZ–€z4î}5g­z˜õ›KéT0Á4¢Iï\‡ÿ-^M‚{=ÑûnìÇ4kÑ^O3õˆe9ß»„ŒÒ $u×jvT_éhÙ•Vû¾cêò<ª¼eì˜5•_;Ó)Ñ Øñ³UQ”[H¥§–ãÖ†´këÇÒoç‘Uá¡"ëGƾü¿8MÊJÊpW¹¨ª,#oÓ÷,Îôàõá³ÙmT8)qy59v|>vGT;ÚŮ㛯6Pä1©Ê]ÁÔq?õg›…ëXºÚI•§˜Œof²1¦-êÔ<‹®}Û9N1‰áx×}Å7s6’W^…§,‹5K6PK¸½-Òí¬þö{ö”y1+ö²rêDVåi_7hÖŽ3XlI§ùaO)¶‘Ц%¥‹¾c}^ÞÒ,óßm¨ 0­=É»góÝZ'nÓMqÆL¦ÏÎÄuPñD8Y4y«vâò¸(Üòk²BˆªP#‘5ms±ëÇ3ms#Ú§‡”ä³½ºçRDDDNsÇuäÀëÌ€+ç³nLõ¿C:pÍí{ùàǹõõ*ºpå—h£E×–Ì{?Ï–=ɈØÚ…œtñ­\øÁhž¿m,•ŽFtî6òÃ/l _ÿÇoOHj:5oȶòb¼Ô!¶]Wâ^z›ûGáùûRþ?ÞcÄçs¾e‰åÜ[¯§ðÝÑ<8<Op]®º‰(+ìøÅŠæ½À=¯íÅÕ†ËoíK} Tý¶†•ä¾µlû=“Èeµæ²;]|7qÇ¿yœñŸ¹ƒO©Câ¹¢{k$—Ëcâ„'xt´ ÿzéœ}m÷C^d¡Þ9·sñß¼óŸ9]øÕiD‹‹oá¼;l¨‡#v©Øi;“Æt 8v{C‡ŠˆˆˆœÂŒÒJ—Ûò7æÙñ%Ž,eðËChªPþBÙÅå';‘?¬^Hí_'"Ç—&r‰ˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ4-VDŽHÓbEDäT¤i±"'F.EDDDDDÄgJ.EDDDDDÄgJ.EDDDDDÄgJ.EDDDDDÄgJ.EDDDDDÄg¶“€ˆü=Y+^¬è*”ˆˆœªNv"§9½ŠDDDDDDD|¦ ñ™’Kñ™’Kñ™’Kñ™’Kñ™’Kñ™Þs)"G”±yûÉADDäKmœx²C9m)¹‘£ ­w²C©µ¢½Ù';‘Óš¦ÅŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠÈ g®gþÌ•äyÿØ29uø˜\š8g=Å/ͧìøÄó‡ëÏ_;‹Ykœ˜'¥~‘ÓIцïøvÎ:Š´ŠˆˆˆœÖNÙ‘KÓ4/ùkg2kuô9 ¼ùdí.ÇV¶‹¬|í…""""§3Ûñ+Ê$gÆ“<ús-­{ÉÜëÄÛË{û³ìÛEìÈ-ïéeÜrË9Ä[Ö2æî1ä5‹¤`ë *Ch}åí 9+&%›¦ñáß²fŽFgpÅ ×Ð¥¾ 笧1ÏŸ´ŠMlJºžkq|¼¤€r^ྼ!~ýG‚û?É›ïâÎ6{ÿú¶»|ÍSèGÛ»FñÚÍérË(î;/†¨³à¥;»âÝÂ×Ì#èÊçyçý—¿–1Ÿ-¥üø6RDðàÜ•…Û†q±X²vï9°Ä¬ØÁºÙ„´éÃy}{àÂeþþ²šªö­få-ι˜s{·$`Ï 2²=Gˆ£”r¿TÚŸÝ—î#)\—Až¼¹kY¾¡‚¸3/àÜsÚ²o9›öUaŠ"¤0—"/˜eÙä–V‘ŸíÄ‹IE^>޺фÔLÍRv-[JNX{z\t =ÚD»üv”T]Q »Ðõ¼óé_Iæ¦,\æÑêwÏ_€ˆˆˆÈßÊqŸkO#9Ø{)Iu‰lÙ‘Ô`üãhÔÀ‚ÓYràþH#’Ô´ü€€¤^tm°…5+¨Xû«ëÃÅí#±[‚Iìs Ê~fñö'•¶ÆgÐ¥A0vË‘.ÿÛ°Û<”ìßG~U-=ÆÓCZã¼)"àÞOÖ> õê‡c ‹#Úº=9®¹s³(K"¹^ kuÖ'¨z—=Ö²š¬u›ÑéÌÔñ3°Ö#*ÜCEyÕî¯!ºAì†=¼ÁÞr*Üœ»vCƒ4âCìXü#‰oèG^v!f`uüœä{qådã‰O!Ä™M×MQ~ ÑÍò,² "Ij…ŸÅ‚_TS’£ ÉÚ[z –€b£ü1°âˆǨ¨  ïQë×äaù§:ŽÓbÀÃRã4Í00½G8µ2B 5))-¥ØS„%2ŠÐ_O6­‘D…—°³¨§dÖF\tç¦Mü”gïÊ% õ,.ÔŸŽG˜q'"¾©ÊÞÅ~k,íÂ-` '&ÖÊÒ]ûpÇÄá®taa ¨yŒe³XÝnZŪ}ETaâ.÷ó;A LLÜTVTP¶óGfmûµj/Fl%u©éf«³Gn9u“ÚT²ˆÜÂ<…aÔmuÈaÑUI•_¿Í®·䇫¢òðD×8PÏ1ëù‡:±Éem™Nòò Ž`BÁ›—K± u Àë$¯ÐAx¨ò~§œJ'9î$.¼ã ú{ Ù4é%F¾û=IœG¤îs9~L9»÷â*©bÑ”ŒÿÿÜoû]qDùûa”WPirð=’ØŽºì  (ÎXʦ²d:öêB°ÕCÖÏÓÙ]ë­øùùšÖƒ3‡ph5á‘‘”îÌ`_i$ #‚ªgcõöàE¡Y¯Ÿ?vW^ªçzx¨(«Â/Âÿ°rk[¿ˆˆˆÈ?ÑÉ{Z¬w?k–dPìq“¿r:ó²Ri@@Ë®´Ú÷S—çQå-cǬ©üØ™N‰G~(Ín£²ÀI‰Ëƒ·r=Ÿ{•)ëó©²úãp`Á«×”ˆg¦+‹¬œ’{]Æù—õ?ðߥg“°Ÿ={]X#ë^œIfv^w¹;³(­ž|`;Ʋ5à©ráñxðº«(ÏÝFV¾¯YÛ½ÙJDƒú¸¶­gO‰ÓtQ¸m5[²Œ6Z"£ÉÙA^h4áVƒ è(Ü;wRU7간׌#6<‡mspyM\¹›ÈÌ ¥~lð1“Ë£Öo–ãÜ“K™ÀCiÎ *ÍC~9õœ¼‘K‹ƒ€ì)Sr)"""""">;9ÓbEäoOÓbEDäT£i±"'—F.EDDDDDÄgJ.EDDDDDÄgJ.EDDDDDÄgJ.EDDDDDÄgJ.EDDDDDÄg¶“€ˆü}íÍ>Ù!ˆˆˆˆÈ)BÉ¥ˆQLlÔÉADDDDN!zÏ¥ˆˆˆˆˆˆøL÷\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏôžK9¢ìâò“‚ˆˆÈV/$ðd‡ rÚÒÈ¥ˆˆˆˆˆˆøLÉ¥ˆˆˆˆˆˆøLÉ¥ˆˆˆˆˆˆøLÉ¥ˆˆˆˆˆˆøLÉ¥ˆˆˆˆˆˆøLÉ¥ˆˆˆˆˆˆøLÉ¥ˆˆˆˆˆˆøLÉ¥ˆˆˆˆˆˆøLÉ¥ˆœTÞÝSùðx2=l™ˆˆˆˆü½ø˜\ºX<ê:žž‘ƒùÛgU¬üßÍ<2q':9=ü­G.MÓüý•DD|ešèh#"""âÛ‰-Þ¤hÝDÞûà;6äyIêÆ€[Ó1Ê î–~6šÏçePÀoep—h g=͈yþ¤UlbSÒ-¼vK3vÍÍûSW²ÏHƒWpãu=‰ó;±‘‹ˆoÌòm,øä#æ­ÛO¥}Z\|—Ÿ‡ ù+>güg?²ÛU‡”‘TSý­c-û­dœs^`Ô²PšXö±s>Þ讜×ÝŸu³—°ÇY†=µ‡õ¤¾¼«™ùñg,ÞìÄ O¥ÓÃèÓªìžÂ¨×7“Ï–¼¶ÜðøUÔÛ1‹Iã¾eý~i}è?´/‰AÆ_Ýu""""§¤;réÙÂ×Ì#èÊçyçý—¿–1Ÿ-¥»¿~1ÛšqóÈ÷uOkvË‚cžB?ÚÞ5Š×nn‹ußl>™RIïÇF3zÔݤïý”Oæ95Ê ò·æfç×ïò“í"néMF Kfׄ‰¬*11 1å“ Ôü,O¾x?Ý"J)©Þ¡µì`&î²p:Ýú>ó0ݬ?0á›rºþë)F<}7­s'óÃê 0óX2öC2â®áÞWßä¾Áñlû s¼J)-!¤çü÷ñ+‰/_ÁÔwçb?ÿaù8çÎå‹o35½_DDD¤–Nð´Xv›‡’ýûȯ £Å ÇxzHkü=;Y¼0—V^@²ÃF@b/ÎŒß̪•¾Õø º4Æn10lvlf)¹ûòp¦rÑ¿_àæ®ah,AäïÌJt¯Û¹y@;Âm‚RZ’à—O~‘‰kóJ¶Åv§g‹l¶’;¶¤nõ}¬e‡Õׄ„ l‘$$Ô%¢Y»£Œ~±4¨o¡ ¿oþ VìH¥[Ÿ4B¬VBš\H&»Y¹20šӦe$~V ® YÞÞm#±Û"hÑ5Ïúµd+»©•;-ÖÚˆ‹î´‰Ÿòì]¹¤žÅŃúÓ1¨‚Âb~~ã–VŸ8š“ÆË‘4¢Îfø­Lþêîâ;÷cÀUÝ ;¡‹Hmìù꿼53/vZÞ0’mìÕK ü½9,7†Õ;‹ñࢤÔA7Ó¤¼¤#<ÇaIã±–ý,Fke†iz1K ) Ž$Âÿ×~„Õ ¡¬°ècIYa1®SxõîiÕyñ:ºQñÛ:ö|õøQÚ+"""">&—üü(/-Ç X¨¢¼´Š€†X*专¸ðŽ'èï)dÓ¤—ùî÷$HÁEï^b`kòLœ³®Á]˜MIÌ9 ÿÏ%˜¥;˜ùÚ3üoz#ž¸"+"r2Åõ{‚§ûa™ÏÒO?"³é½Ü~}ü=ëøòá/ƒ@G0fa%&„”DkÙŸc8Â*ÝL ª(r–”zØì‡G0~iù÷íÝ>bÝÖ£·WDDDD|k%¥u3 œÈÜŒ|*Ýåd¯˜ÌÌM±´n •ë™øÜ«LYŸO•Õ‡# ^Lk<íÛÛY<õ;v”z1˳øyÂç,Î=üæ*ÏŽoxí…q,Í©Äð "4Ȇiz} [DN,ÓEY™ ·Ë…«<Ÿ=K‘YæÁkšø5N§ÑÞyÌ]ëÄår²ùçUäVïÒÇZögé¤ÇoáÇ™›(ñx(Íø†y›ë“žyHri˜Öžäݳùn­·é¦8c&Óggâò¡DDDDN'>Ž\8:]Ç¿ ?æÓ7îc|¡…ðøÖô¼ãú6´`Ð…A×mç½÷îçf§‡àí¸ì†žDv¢.ýW~ü.¯Ýõ9ÅF8É=®å†ˆÃ‡ ü[^Éð3G3ö‘›xÛåO½}Ò7Q£–"g–h:^r.[ƾÄÓ3ˆëpɉY¸J½ ºpñÕÛÿÉC<êªCjûÔ­¾Ìe„}ÙŸbDÒéÚ!ä<†ïrb†¥Òið œe݇¬օˇå1qÂ<:Ú…½tξ¶;šø*"""R;Fi¥K^‘Ãd—ŸìDDDþ°z!';‘ÓÖ ~Z¬ˆˆˆˆˆˆœ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏl';ù{ Â{²C‘SˆQZé2Ov""""""rjÓ´Xñ™’KñY­ï¹œ_ì>‘qˆÈ_è¬ÿßõµo‹ˆˆœ¾jžˆøJ#—""""""â3%—""""""â3%—""""""â3M²‘#곡üd‡ ""ò‡ÍH <Ù!ˆœ¶”\ŠÈïÊLÓ¡BDDþþ’6è!u"'“¦ÅŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏ”\žÜëøiÄX±Ç{Ø"³à{¾¾ëu2õZ(ñÉ¥‹ÌÑ72mNNϪØ9æ6&MÛÅá©Ì äÚÖϟg½×óÁ·ñå럱=ׇŒÉ½‹­3’WuüBüålÿ6&|™qp¹7±èáÛùaUy­Kr-›OG΢È<îAŠü…L 7üÀOëóѦ,"""rjú[\šf-O3Ív~ú2‹÷·à¬‡ßbèKÓ¹þ枎Óó'+¯Úy ¹tˆSÝ@âÚ·¢jõRrkÄçݾ”îÖ$7 ¬U)¦iboÚžý;â0N@˜"/EçðÓzç?>¹¬íaMDDDäTc;±Å›”oœÌãg‘åôp† $)Ò î¶OyŸÅ?m¡" ž”Ëo¢KûhÊç>Ç— ý‰­Üľ„›4, ç÷ïóãŒUº©Óæ2ºêA„½F5…¿°ne]Z?r>±u ÀŸ^Lü²¯Ø±÷"ÂÝ_2é}7]DŒö_ŠnyŒöñ9d~ù>KgRn¦Aï!tëÓ£‚-oßÉj£y8§_F«Ø ¬ýi ÅÅu{ §gß&ø×HíiiX9ží;¯$º‘p“³bÞC¨ïž½óùiìD¶í)ÃÕ’Vƒo E£ÊéŸé ™9/+îêMEìùú]ÍÝD‰ÇAÝ3Òã²ö„PIÎ÷£øbåZJ,q$_~ ];ÇrpNjR™9“㦳k¿GÚùtz!1AÊ\åhLJ6~Å„ñsØêôœp&»ŠEyñíú=}i~àÞ0–ç? dð£ý©›qèúôG™´¼r^åÙüÜuC‚Š×1kì§ü´Ù‰5:s†¥K;Î9/0jY(M,ûع?otWÎëîϺÙKØã,ÞÚÃzRß~”ÝÙ¬üò#¾]¼k4{âŠ>MÌÁ[/fÑëéëH³»ÙúéCL0®çM°V­bÂ#3¨ÿÀÝ„L¼‹yö®„î[Çž¼ BÒ¯æší‰°˜”gÎbÒ¸oY¿ßCDZúíKbP«FßÅìÊfX¶¯'ôÒçš–Á×}ÆÒmEM8ãêë8·YÚÓDDDäTvbG.=[Y=~>~?ËQ/rVÃuü4y.<8g½É‚íiô|êÞÒ ç矰¥ðÀ%}O± 7dÐÐ6XöÏÂo+höÀ[ }æNâ³?gÑBçAÕx÷í  4…zá5NÍüÛÒý™ÇhÓÀzŒ]ìžþ!»ÞÀU¯½Ã¥9Ø2n*9±—Ðïñ!4hF—Çž }8g¾Å¢½­éýô»\;âr~~‹ùK «GY¼Túµ¦Ûƒ/0ð?p¬þˆÅ»:pÎ^æêû`ΙÌÖÂC†+üÒHjYÉŽ•;Lug²mµ—øM±y÷°vì—Ttù7ƒGâ¼6N–ñÅÕEÔ쟚­«ZýóVÄpÆcïpí¯Ä±ü#VlpUw’“¿žô}>Ü/>f“óà˜Ì’å,z÷{lç?Ê5#Ÿ¦]àÌÿvë_;½YN-žLæŽ_@àÅOðä¨g¸¼á&M^+¾ Íü׳!³ ð°wÃf¬-ZÓ€#­¿ÆÃžçú^õ¨Ûý.F ïB0y,ó>b®æÞW^å–nåÌ7›ý^wY8n}ŒŸy˜nÖ˜ðM9]ÿõ#ž¾›Ö¹“ùauÅÑfïÌÿ1moK®yú-q1Á?fâÒB¨“F’cÛöxÀ³‹ÍEoZË^x÷newH’¼8‹£èsïÓ<ôèꮞ¢Ì’L}w.öó汑snà\¾ø6““¼{“éÿø(†éÏæé³¹áu<øÚëüë¢`–›Î6Ý÷,"""§¸<-Ö†Õæ¦2weîPâúÿ—˯n…ݳ‹Ì_rix^_¢ƒmØö$¥A;3*|+©3)õƒ°Z «‹YFIvî€Òï|ŽÂªÅ¬rá¶ûaû×ý ,V+ž¢lŠŠM®ã’û/#êÐ|Ô³›ÌåÅ$ö=¨ ÖºíhÛ«>Y‹WSiXKmBŒ°d¢£‰iÛš@ X"©\@iÁ¡)š±íÛàY³ §¼;–²ÓlCrŠŒº¤}„ngÆb5©Ó" Â¤5ØÊî-Ÿ€WmXÀŽð´i…ÕV‡„®mð®_CþŸZ,§6›‡²Ül Ý¡4î?‚{®n‰Ÿ-‘æ-­d¬Ý×›MÆ&[5Âz´õ)ÕÌ_Áò­ œÙ§¡6?¢:ŸE£ýë~»ekBB¶HêѬ‰AøÅÒ ¾…‚ü’#O¯õìaõòbš÷=‡AluÛrN¯2¯¥ÌRŸÔ”JvfâÝ¿ž­Žît ÚDF®‡âmÛp¥¦QÏ `¥~›ŽÔóÑ@ƒÈ" ½TnXÈúðnôn‰ÝA‹®éxÖ¯%ÛSý¶gÐÀaÇbX­ÜEÙä›DtÊ÷_LÃc]9œØi±ÖDÒ‡_ÃÊéŸ3ý¡\ìÉ]iÓÿ2’Š(+,aë{·³½:?2=Ó¶üðÂÈ^ôVÁò¯0á#¨Ûþ:^Ò «v;Ö*î?|/“¸Ëî&ýëÉ,xnå;Øn³ IDAT¡-Hëw5­ÃYÍ,¢¬$œ°ˆ_Ïþ êÔÅZRX\Öd` ËAñDך҉„ª1lßÓÏŠ•>œh€?~Ïâñ?‘“ïÆë)¢Ä{ÆïN™³ø¹Èñs×eQéw¡›ð–GXÑpbPYZV³‘TáÞ1‰ÉwO©þÈÄëèÎ y¦‘ü3Xè5| ßOÿ’wÊÃ?¹ g÷¿„V;ñ­[à°š¬d5£{’ýë\¬YT@‰k=“¹©>ÁkÆSv„=ÉKÍÎ00Í£Œ·›E•„Yc_®S[Ie¦†M’È[¾…ý¬Çhv5íÝ[øfC‘ÛrHh“ÈáùŸa˜˜¦IYa1®SxõîiÕuyñ:ºqøªÔËî¤÷×_1鹉‡6£s¿«èuèqGDDDäãcriÁæo§ª¬/¿ƒºq•Ua¯ïÅå¤ÐÓˆÖ7üøGÞÓ›ˆä¶4®ø’ êàlÜ•$¿c­ßã b`AÁí9ÿéá4?hXÓĹчxPBƒ ɯ±/—å;q;šd€_j3b¦,çÇŠ2’úÅëM£ôëÙl̯Oê~pŒK-Ž`üÒòïÛ»|ÐþãbÕAM¨ ?ÏJãKî ÃU¬ùŒ÷>ø”È'o!]÷7‹ˆˆÈ)ÌÇi±Vê5oFÙϓٔ™Û]NÑš)¬ÝKÃf‘˜® ,õ:Ë7à±úá€az1­ IL·±õÛÙä•y¡"‹Ì©_™wxèÝ5ƒÙ¯ÊöÜJ ¿@í‡J„u¤yz.k&Ì&§¨ oe.»§O!3° 1ŒðH‚K3ؽ£wÉN¶,ÞH• PÄöÏžcîœL*<ìÁÁØLïQF« Å”æWà5ÔÎÁΙ³È-÷âÉ_ÉŠöP¿S+ß’K¬D¶o‡wþçl¶µ'©z^œé.ÅUéÆãªÄU¼‡‹VSìöà9æÈ¬‰«´oUîÊrJ¶Ì%s‡Óã90âéÝËÖWR\YIÙúoظ'…øÔ€ß7ðOëHýÝß±lmÓMyÆ·,ž½Ý &Gcº62sÔ[ÌÞT€ÛêOPÿ}ÀžJó´B~ž“I|«¦øýÎúV»Wa>¥U¨›NËè ̱‰‰;o5³¿ü±zŠ©¬q´jç`ýÌ9ì.÷âÎ_Åìö’Ú©AŽÆ$­dù¾TšÄY±4lN¾¬ôoL£àcíìiíIÞ=›ïÖ:q›nŠ3f2}v&®ÃÖ-bÝg/óÙœm”z,øaÿµÏDDDDNa>Ž\ø·ʹEãøùý³¨ÐBPƒÖ4½á_´Š³`Й.wðã'ÿfL¾ÿúmiMwB ;!ÜNÇÏ?`ÖÃ_Pa„}æ º…~òfkvÝ:¾Ë¢goã{—ai}èÚ;áà¬Øppõ=T~1†ïý”w a»ÑmøDXÐδ볜FÝÁj¿8›FH z4|%ùc_ã³iEÚˆä7Ð(ȳ )í'3ïùG¨ü× t>ï:½Ï¬©°F×ûfºµÃ8¤·?ÂÒ°‰3ØÑ¶#u¬¿6§#mû­dî{÷±Þˆ!á¬4b‚+qóµ(V¢{_EÒ{c™úïÏHêFr“äV”x µ>‘¶ùÌñÅ–8R®¸•Ôp jv&]‡å²`Âùxt¶zmh{m#L9Àpt¤ßÀLøäþ“ï!¨~λ¦u ?’Ò[࿬œfM~g}+îÖ]¨÷æ{<ÿÎ@]¯»†âO>⥻óñÇÓæ’aÔµB‘O[‰=ïF.,úˆ±#¦Pj"µ÷p®h_ý¤VKÉMêTÜœ6€dš¦±5<ˆß¹d„uáòayLœðŽvá_/³¯íÎa­5¢é2ørö}“g§Ch"m £¥F-EDDäg”VÖîEŽó‹5~%òOqVÈÿ_W:Ú¾ÝgCùo?g¦ý¹ëPîMãxuv7ßÚõ¯}«YÂÒ·`⺃‡:ý;ÞÊ#CZŸèw0‰ˆÈI’´ÁÍŒ´Ú½/\¨yN â+mM"rxq—d±dö¢Ú]È1g”ž†ƒö·¾Eû¿¸Z‘ÓÙ ~‰ˆœ–Ü«øò¿Ïð£­/}~r*""""ÿh¹‘ãÏÖ†¯¼u²£‘¿F.EDDDDDÄgJ.EDDDDDÄgJ.EDDDDDÄgJ.EDDDDDÄgJ.EDDDDDÄgzZ¬ˆü®¤ î“‚ˆˆˆˆüÍ)¹‘#š‘x²C‘Sˆ¦ÅŠˆˆˆˆˆˆÏ”\ŠˆˆˆˆˆˆÏj=-ö¬Í ‘#ÓÈ¥ˆˆˆˆˆˆøLÉ¥ˆˆˆˆˆˆøLÉ¥ˆø¨’ÜïGñÅÝ×1ö£xŽºžIéÜgûîÒc¬s`½ŠÍ_1ç™{?âßLûx!ÅæñŠÕEæèùf~!Ç­Èų—Œ1óñ72sá_ï)ÔO§¼côµw7ËŸ¾‡›NÔ«€<ìýì&MÛ…÷ Ÿkp¯ã§ÿaÅïÑ 9©¼»'1éáÙwìƒÊqPÛã×t²û÷„oc¡“Ý—"(¹‘?ìÀÉðÔYÙ˜%¿°|Z.‰w¼ÁàkÓ±úZ¼{ËÇÌÆ{Æ­\pÏí´ï’H€Ï1×Ö¶M›“Sã³*v޹íð“î̳á–lM¦ûÓorn—0Œ]¡{[g,$¯ê÷ÛÅŠgïã§ ¿·b f9sßeÚÃ7ñÁmÃ÷ä(Vl(üó±šeìÿék¶gŸˆßH9Ûß¿ _f’dmbÑ÷óêòÚåü½Aféß)E÷°÷óû™ŠJHè˜DXTCbSêc?á™Õ_Ä4k9hâ.tâŽiJl¨Ã8xÙ 9¬Úy ¹týNéÖR¯¾‰Iµ}È›IÉ¢ÿñÝl)7¾ÀQ¯qáù¶¾÷?6æþÙ–”½ð¶ï?ÃUĵoEÕê¥äÖ(Þ»});Ý­InZË÷¿š&fx[:\w)qA§ ØBd¯ézfÜ?þÀÞ´=ûwÄqÒ»¿fŸ{)Û8‹uëÇ'¹ÿ[ncŽi*Aù'Ð#`EäO3s¾cÆKÓÈ-ñ0gÄf{†.ÍjVÌ"öL{‡ùs6QáH!1®Ó^½ÌÃö)ï³ø§-TÄ“rùMtnº•yOŽ'«ÒMö£÷³È“Ä/»Ÿ•õÿC¿s"È};«íg´o-yy妿ìqXL*3g²`Ütví÷àH;Ÿ®C/$&ÈÀ¬ÈdíG£Y¾6{ÃND{|;ñæ-cÉGãØ¼­"šÒìêi×, ãíéÒ¾ìžÄ”××áˆÉ'+¯}» ë¼÷ùqÆ* ]ÔisÝõ â×~Á¤rÉÛLüb®ª-|>b]êÆ¾g>¤0!„ü ^šx”ÖkXúñ86nvb†7¦é×Ó¾U],î5ÌøJ›FS±cÅ¥Äw ±ûæ°~ã>ʽѤ^};Z†ÿ›vMaúëß[áfïcÿ¥è–‡¨¸2¿aöœÙ•k¥Nçkô5Ùl÷6eý_ k+å'óãøYd9=$œE§aIЬ1~íÍ"㇠b.y¦  ¬mZ-~„Ì ù4í²‹y#&vÇX0KdæCKHzæ^ûg±ùÓwYºt•öhžw=ÝzT²ü©7Ù˜[‚÷ƒ{)¿`}ÎŽÀ9,ó§/%¿"€ˆÖÓu`/"*Ùòö¬6:˜—ÓYApúe´ŠÝÀÚŸ¶P\lP·×pzöm‚ss{ZgVŽgûÎ+‰ndÜä¬X·ÅêûƒYžÉºOÞgõºýTù×'ñâézFÆ!¿ëóîŽeùëH{é’lJV|μ/ç“S A©çpæÐK‰ 9Pgņ/™1s1{‹‚ˆ:ëZz]Þ–àC7¾¢5,;Žu›X¢ÛÐnèu¤5ðÿÿå9ß0íÅ=´~z8ñv7{?}€yÆp®†¥j%óùšÈþM9o³(øn.¹¨~-·úJr¾Å+×Rb‰#ùò[èÚ9 GßïÚgr~æç1ز½#º%­§UJäùø{³¸³Øôᘳ* od:m† §E|Þ“™9/+îê…9ïy&.‹"ɶ¬,'ž¨œuó4pGï×c¿þTŸßJëÜ7X¸¼/ñyþ5\:4¨Â¹ðL^²Œ|o$ —ÞA®qÏ1ËÉùþðãFxé2~®ÞÆ÷MbÊÛÛˆJ­dÿ–½”“H«ëo¥U£@0 Ù=õmüA…#•&MªØ\q.ƒoˆûcÛ&E³ždê® x][¬xØÿåær#ýû'Sy´ãÁÑ”Ï}Ž/ú[¹‰} 71hXÎ#´3â ~7)]û%ó'|Ï^§—àÔ³é2¤? £/M*¶|Í‚ñ3ØS…|:\3ˆ”;¸÷~œ9;?ãhÛwÕ1þÕr—ùÓn "šu.}º¡gÐûÙN,ªµŸ3o±ƒv¿Åµ#®$Âõë}eœ³ÞdÁö4z>õoi…óóOØêéBÏGëß’3Ÿx‰®-½þ奸8šö÷>ÏÕ"tõ$6ìô`–,gÑ»ßc;ÿQ®ù4í`þ·[ñâ&ç›Ñ¬®êÁ…/¾CÿÁ1Š}/p±{ú‡ìnxW½ö—^ä`˸©d»Üž-…Zk––Øsƒ¿šè¼ïYømÍx‹¡ÏÜI|öç,ZXsŠœÇ[¸¬~-†pÕ³·x‹pÕëÏ%/ý—ôh'›Æ¾Ëž¸!\þêÿè?8¬±£YŸSÝ6o$¦ßc#¹jXcr&}Ä΄ë¹ô©W¹ì²¶LýüÝ`ix ýBƒ€ftyì Ú'Yûl4¿k×üçRVèëƒx¶²zü|ü.~–!£^䬆ëøiò2\5×qïÆ™CTBðÿOí5Âh|ëëô9«Î1úÚ¤|Égüœ•Îy/¼Ëà{zâþî#ÖîO£ócÑ.1„¤ë^¦ïÙ±x2¾`Î7•¤Ýý:Ã^|´ªiÌ™´–w½Túµ¦Ûƒ/0ð?p¬þˆÅ»:pÎ^æêû`ΙÌÖÂC.8ø¥‘Ô²’+w]rg²mµ—øM±áfÿ×ï°Îv1ý^ú†¥°Âçd–þ»®W3;(XÀOŸfRÿ¦WúÊiÁ,~šµ­zôÊCIaÒx“!"lõ‡,YUvðµ™ËÆ1£Ù3ˆþ¯¼ÁEÝÊX>n57ç:͈ql%{<;ÙQDÙ¦µäyÀ»w ¹!iÄ„ÿ‰.¯“¿žô}>Ü/>f“Ó<Æ~Wó»Ù¬3޼´[¹rÔ›\ÜןM$Û îãô{3Kr0[Ý•#_§OÇbV|<ça»¹‰;·‚˜Aqå3“n›ÃŠE9Çì×£¿þlŸûÓhØËôéCH÷û¸jø™€7§«½Ÿ~›+$°ê ²¹ÒÜÿ{ÇêõŠr0Ú߯eO½BßN…¬üv•&¸Vμ%!ÕméOP^Öá#§µÙÆŽå¨Çƒc=Å~$Ü4’ACÛ`©E;Í¢E,üxážáÚWŸ£KÌ ~ür).óè}i–,eÑ{ ð¿è1®5’sZíãçw¿"×}”ãL–÷w¶ï#ÿ-%—"r¸É^µ¿NíÅ‘DJzüƒŽg™¿äÒð¼¾DÛ°7ìIJƒ vfTþN™ê¶éL„àH$2²’B/U°#¼mÚFaµÕ!¡k¼ë×ïÚÃεÄŸÝ›º6üâºÐ¨‘/w…X¬VÍ ²Z jÒÖMv’¹²ú^QK$õ’£°`à—˜J„½‰éÑX°Ÿˆ£ØIÉïž0Z‰>ãbÃý°G5§~ô¾>˜ «ÍMeî>ÊÜ¡Äõÿ/—_ÝŠšƒ fU%nÓû¡#>µ`ØlPé¤0· kloz?z-êúgËMöâ¥ØÎ¸˜Ôð«Oêݱ¯ø™}n a©M²‚–LtT 1m[hKD"u‚ (=ììÙØömð¬Y†ÓÞKÙi¶!9ÅX ïõ/.Ї͂JkêùåSR}c_ÍßõAi\p:]Vñ`‹¡aZ}*òœÕÉŠ•Èνˆ µc­Û–æBÉZ»õàD&9[iÞ§A6?Â:w'vÿZ²j&ÆÖ8âR\dgàÝ¿–½Ž4 ÚÀž\åÛ2q§6#âÏlþ–Xum…Ãn'¨IÒle÷–Š£ïw5ϱ+ض¯-ÏI!ÀêOhû+8ó¼TlUUÇí÷f„·¦i»úØmADõìM¬s-YÎÃg(Ø’:Ñ(ÒÖ:Ô§¼ ïQûµêèǯšŽGŸ[ê“Ò£-¡~v‚›5§ŽËIYÅÁñµ‚ºí/ ã%ÝúQxK qGâøm¶šÁuB©(,:|4Â0À°`XjüÛ[Û“ êÆ ‹Éa±&’>üVNÿœéåbOîJ›þ—‘ä¨Q‚Ý+.ªþÀó~­; ýPÎ)™ÈÊ÷GðSe=â{]Iç^ᇬWEyq9AIu~ÛÎŒ:‘»¶P^a’ 5û¢º‰GÚæ¬)H¨Ãö=ýð¬X éɶø‚ݛúq¹³/.*J´ü½ ×fÿ?öÎ;0Ê*{ØÏ;%uÒÒ I Ð;¨ÀºTEì®mõ·®²¬ŠŸbY×®`£)EA¤jBB 5 HH2©ÓËûýAÀ$d†$Äô>%Sî=÷œsÏÜsÛ‹)o Y³ó¨5Û‘õZl][ú w_¬%:ìø]xÕ^[ÑœKÖ¿"ûükr(~züη\MPBu9ǨáRòd¬ÇØqø,¾ÇÏÒ)-æòg”% î^&“ÍQ¿û»®“‡/ç» @ÄÀ@þo`7Ô¾xºë1û¸$IÈ8Ó«ÕqüjZa‡ê\R(‘h¡¯9ˆÎOKœ;£mä3âé¼-­ó1'8Šne̵u(¼}/le—¼ºÒe`ÍmÚú º”1U×"ùâ~¾м¼ëÐÖÉâŒf‡¿+Í9ÿ[ti Dr)~#”¸zº¡¯ªA¦Ùm§’7¯ ’'¿Nÿø¦‰Ÿ\×öš\4ž¨’&sÛcÃÏm3;­ˆb÷:ô56mÍOÊUEoÄÎù­VÌz ê0W²ºJ‘ž"a¢…ú YûÅB¼güÅa{ìÅMk°×–a ¾†¡ÿú“œó:[~êÌãZXq$¥ÆÝtf87º4£ÓÖããc+KéÌZêléqÿ‹¤Ûj)]=‹uó·Ðéék½DEA@§3œ-Ò#5l•k86ç%Ž'?Ïuý¥–WdLZÜúLaìÈ©XÊ2Éøï‡ì ›Á ?§ÆÝ˽V‹Ì¹3TU¢wñÅÝMâRkáQu!®‡Ì]™Xö+ˆ¹7öœ}ä*Ž}ó¥‰Ï1þ¾Ô¶dL_rÉâìËÙ´ÞFÿ§_!ÚWIÝÆ™,/lñ“ªjPyz6ñ…§7Ͼôù0Ñ.ÎÄNÁïûÝì7ꊟ=ÃêŸ8YFøDW¸Ükdä:ôµ2®\lú]¹½pÕGo”€¬§¦  etäoc7K5:ƒ¡î­ëMŽõj¥ØQüjÆo®sÇ C[óm%nžî«jñsØ–Öú˜$I-_¾ã(<ç >Êè¶´®¿ÆG o/ìµ5˜dð@6•SQbÇ7ҡĸúx!ï¯Ä(ƒ§Ø«ÐÕzáá%9ˆ3oÑÇÑï fZìºÛbÁo†ŠàÝ1o[MáY¶ÚcÝÝðøe$1=U¬Ù@¥ÞÆÓ®XJae{¦~%\“úVü»Vb“­Ž­aû†¬Ê¢R\9¾~•z ¦S8;£$8%ý¶å)¬Âj5P{à{懙ÔR´èu¶l,ÄhS öôD%Û‘ÛÐû©µlxÿŠ*LH.«‘å6>ýÒˆ:Êuyl6ŒÇV³ÿh±=ƒÚVN“¦«QP‡®ÊØê…MÙ|˜]ï¾OΑjlJ\=Üd{Óeí ª2Jw/Ôj¹aœ®F¥²`ÐÖ`µ) î—Ž5ûòËL`>Cþš_0§õ'䲦O•¦÷Æž±˜£ªtb#Ų “ÞŒÕlÂb¨¢bGgô6ì—¸éR6è0Û¬X-fŒå9º·›|ÞmœÍÞÀ™j–òØ^Gx÷ø¦?ÐiÄtÊeÿÚ< 6[å>ö|û3ÕÍÜYÒ$ê‘C~iW"Õ("»\šA¡k"!ží¼QÔ~†‚_öRg2¡?ô#y%ñDuqwÜï׿'1!‡9´©³ÍBýþE¬ÿr Õ²ªÃì&WïáðŽL–zÎnø‰ÓÝ oÍJ8Ñ«“øÕŒ¶ê\¡Vb­Ñb²ØZ½ØuyqCE§žÝ1ïü‘‚²†¶ä]\w«|LÂ- éä~NW›0—åp$÷Üön‡ñ ƒã£KbÂNoäÀ‘ìÖJ×|Ć …NŸ?ªNHäÙ äì¯Äf7P¹åŽ»õ%6Rrgœü®´RëÁŸ±r)~3ÔÝncHßÉ|åQ2½º†Â  ¦ÓõÑwñ¬Ÿ¾£äK§Aw2ÔW};*òÄà©d.yù³-¨‚Óèu÷p”¨ºþR¿ü”ÕÏ,EÕŸð÷sƒë6üc ‘/?C‚×…y¸ö¾‡ëj²íógÉ®QàуÄûŸ$5\“<ùVªæ½Ç¢•µàÝ™¸Ûï§³‡ JGíiöXDUòD†öCök²Éì‚OÒŠnÛLŸDâÝ÷Q?ÿ –þ]‹ìÓ•ÄÉ’¤ Ý#uñéËùùczò:µF MÜq‚_<ËÜ*;®a½H¿k^M—©Ñ |„kóÉþà)~®‘qO%éþI €0oAÉüÌ_áIPŸ®x) €’À1Ò}þç¬úç<ÌJBOeX¢ $Âûugÿâi¬ÒÏ`ü؉Œ=—ŒY“ipůÇ8FÞÔ uû׿PDö#Æo-'zõÅÿü‚‹"˜„ c)™÷߬u%°ÏÂbJ°êì\|½ë¯(“n _×È~é1ìþ)$¥&ã]aÀ s®­¡fö½õ8gjÜ :•kRÝ›®æ*BI¹w*úŸóíSUØ=£ˆ›p?^Íw|+:š€k]wUñDÆ»sÆ7¹ýäP†¨Ê`í´¨S„?ñotñ•Gý®±ت6:ŒÖÖ­¡©Sn=×–We«¦ Ã[XÁl¥©»£ÏîØ<ýJ!*àÜv[Çñ@—£øØÚv6úŒä=€A“‹ùyÁ³Ì­Sá•t Cïè›tÈaû%M:î/%ãë˜7Ç‚[tú<0Ž@•ÙQœQ´Â¿ÁEH:Ó¥j&þÈdÔý9çaåÚ-¬}9äKl‚«d©áµªÕ/²ªüf§H– ñkM‚ŽCl‹BdŒ÷ OD˜H,Á¹d%?Íù‰ kù.öo¯ 8±³ ‚G¬\ rþ¬+—X XpG-&lÁÛYŠ–ÏeWöjí~„½“aã{â!²KbåRбˆäR ø“ó§M.@ ˆäRСˆ9+@ @ \6"¹@ Áe#’K@ @ \6"¹@ Áe#’K@Ð6¬¹lö<{Jìmø’3‹žfÙÊS´å[W#öâe,pÇlB IDAT›>ŸÒV=Á]`׿°ãýñͳçÛwsª^Ü3÷»Ò®>þ?Äzšü¯_ãÛiO°èå7Ù›oþ½%êäêM¬þûûZÁ–ósßÙˆ¾C»‚ŒnËk|5{;WEx²áØÜéÌüAÖeÕð¿ çt5oή«CWÁ„H.àŠ¬çìÖÕ•µ$8{¯ãAwx#¹‡´çþÕnfí¿> P'N.ÿœ"ï¿rÝ?žeøØÞøºKí¯©<‡ý™G1Ê6Î,~†å+‹®ìIް…õk³¨´´K€¦öq‚9çc¾yg=µ¿éH¿™<¶Sìyíl=ldôÙ È:Mßǧ3殿¨nUMôö;øK“¾p9t”ì èÇYX½fÎ~›¯:<ÙuŽíðì(ˆcØÌ¹n€í ­ä²úcdÝ66>ý0véÿÇ ²@ðû ’K@ øÃROYÖmiîÝÙ{}ÞzriÏ |}{ÑçÞ ÷À^EõYîÕ‡€ PãñR¶¿&¹,‡[b’Ž|ÁƒÂ¯ð»°…åä¹q»ž.ÖÌ>NP'ŽcÄ-}Ñü¦#ýfò(Cè2é!ºÅª;µ¥å¸%ö%",ߘ}/C˜&zûü¥q_¸,®_—åV&X2Ö-ÖDB½ÕHÍÔ#ÿYÚeõ!GÈdsZ–)ݑӗZø”ìüàjB9ýùçgüÞB‚ß“æ6ÎsÛË9µy7Õõ¹äÌûŒvSçHd„2¦ÂuüüÁùåÛ•äÉø§tE£–©?¸žb—$&ø@õ>v͙Ŧ‹Ù—‡)0‘Ð`wLÛþË×ß[HìJ.&ç•ç8¤Il˜{á"¾{?Nƒ“[~𷵜¢eï³nÎWìþy/:ßD"Â4Íf»mÔížÇÚw?$kÍVÊ«óÙÿu.ÞÃzâݨL¹l-«f®FÑ·®çK0sjÞSl)K#!NƒT½‘ÕÏ-ÅÖAn2µë_fY¶?I1ZŽî(ÁR¶‘ÌÏæ²{k>ŠÎiû©Ê(/cù?Rqj »¾]BΦÃpþ;U_¹›í¿Å¦¯—°/û(–n„¹!aB›5—Ÿ>ú„ìÕ[8­%"¾‚ÝÿïMœ®G»ÿJU=‰õ:§k.Û.zO6ã ~úèS²W­çÄ“:ã¡j¬AÝ–7XôÝêv.cÛòoÙ¿O‡_j2Þ.r‹v•(úòŸlʪÀpbGKüˆ;EÆ›¿à:*šÓÎ$§°í-œ0w%Zû%_ÿ`'©o*YOéúYûñ¶ý¸‰SU~„&GરQ¿gë?øˆ¬«9šoÆ79iû,–}½ƒöùÙøKŸúU¶–v'Á¡ßy YsÙ:ýŽ–çq`Ù"v¯ÞB¹GÑQÞêöòmd<‹Í_/eÿ®ãžJ°¿ÉZJá’wY÷ù\vnØF…-‚ˆø@T6u„bÇE¶ð@wQûñv•À|’ÃófñÓW ÈÙ¼‹j÷.„I›YýÆ·”êÊ(ÉÞ5~a^g8ºp뾘Ϯۨ”bˆˆõGyQcàx3ûté鯙Í{¨³æ³ï«OÉ^—…Öóœ>äóX¾ÆBBÿXÔ¶’KÔáÜ_hQWžœúª¹<*ò>~Ÿ’°¸e½ÌºÍg0í$ï˜ Q1GX÷Ò ¿Wµlh×HfQ#^ù„;IE»xù5ͦ«3Éú:ÀÉo0å?Ï‘¢*¥¦…Å") ´[ÆÞdyFMpbõù˜eã‘TZŽS|TŒ‘ò‚ ‚ãQöÚbŒ±÷rˬw¹.µœ=kvc’Ë(×–#¥?ÊM¯Ìbl¿ö®ÙÝl–ÛLñª/)޼ŸÛÞû„oпpeV°æǦ•µt}ü]¦¼|/¿`g^,ýgÌ wŒ±÷¾ÍØkBM´U)½g;¶”?šHzê}¦¾ùI–•l\v‹wˆÉX+Œ„Ü9ƒ[_}‰žªìÉ.wbWW:O}›1#Cðön{`nçQ„òø4zFzß;LGcóZ/bK†½žû{^y”ðâùlÝZ Õ™lý¦°‡fqϬèÆz¶®/Âsèÿqû}pÇø—§Ùx¬çP¾ï´W¢óØÞæÖû©üa-§­-ù`/ãÐÜ…T&ý[ßýñc]Éûê;ʬ6´ë>"ûLFÍœÃÝÓnÆmÛGdìj8/ÖR\l ©ÅöÇŽò5Ÿ°×0”±oÌæÎ'†bZ5›\Å8ƽ4…·dÌø¤Ç*0ìXĶÓ=ýŸ9L~zÖŸ¾âàé–&’Ü[¶½­¹£f~Ì­·GsvEs}È­¬Ã¿àHWfbù J:{‘ÑCñù “ž¼ŸFÓ69‘šé­±÷µÃ–MôÓúxÑ6dÌ:/y•Û^}‰^n›ùùÇ#MÏ:ôÏF­+Û–/ršü(Ý#\ÚPãÐAÃ9©uõ¸˜Æ/M"˜öËø×˜òî› ‰ÌeëòÝüzrVµï#ÜtK.ݦpÛkç!vôöx†¼ô!£yPåÔ>µ7™q3Þá¶©])_ö'£ïãÆWþËM7ù‘¿b3U\UáÀì§+p?ƒÉoþ‹Û† ±.oîlN†ÜÉ-³>à†¡zr®§º¥î¥ÝEAQ,1ýÒ9ö8{*ªQ{4HMþw§|õ'äªÆ3î­O¹}j÷2á™›RZ)ݶ {ú8ÂÜQh’HH÷æôÂ6œ½²R¶}ªãéâ .at¹~ê=Û(m!ÁRÅö£s  ”þDùb¨®ÆîÌ®íÂJÙ ¸žÎ®(4ñ¤Þ~íÈž=ðÌã¤F¹ƒ*„Ȥ0Œ•ZçÛí.%Ÿ"˜¨Þ±¸Jê¨8|LZôF%j÷p¼4™îׯã¦tÅ;}"ƒFwAeàtÉ ÌÅ„Ýê`0&×¢¯©§à³Ç(j)É6ée@Æ­að$cª×!ûúÓîãM¾I„h~álñ1ô§bˆ~" Û{(-õ£Â+‘do ꛩGR !#;•±9Ðül’šð›ž¢çêåd¾¾ƒw7’ÆM¢‡¯cm=uÛß`~Æy}Ø‘R[*× u­¦`¢FÞJÿ‘¾Î•äI¡lAÖöÕqÞ_kÑ;ÔU{¤ìXq._+mÙšxQÛž¶6ªZル¡³Ì…¾ëÐ?‘Ѷ#¸ºh£‰%tHRÆÐ󻨻j1«þU:n0i·ÜD¬¦ b8µO3”$HŠFÿÛÛ~푤T [Á^[ÑœKÖ¿"»á=»ŠŸ^¿FµŸ¦pg †÷ÀM’ [:Á‹¢°t ia—¬ µ½œÜ…_Px²;fŒ: ÝeP'¦òõNU¦b>ª"òÎ+üœ­àO‡H.Áå!ס¯•qÕxàbóD•4™ÛÞh+€3 )4>¸èŽ 3îftÚzÜb¼Q "0!ŽÚì5œ¨ˆ#!&ï$5[¶nCòL$ÉQ’#ipó "yòëôw´ÑLÂÕ˪«ÐËàÕžSJX¼‰œ-[1§ÒÇ' sÐÏðÃ7g¿ðNd´·¢nÙ@}¥ŠÈ O‘0ÑBý…¬ýb!Þ/?„«§×ÿ‹ñcšå³­l˜w/wôZ-2 çT«*Ñ»øâîÖ:E9·k{Pãæå†±¦87ê´WŸà¬!€ Ý 6­·ÑÿéWˆöUR·q&Ë /G¾Š6I¦ðôÂU½ P²žš‚2”ÞxxÖPWeƒ` cªÒbÓ$âÚ³,o¹}’7îžuèëd1–AçÕ…€&Ë>2¦ -n}¦0väT,e™dü÷Cv†¿ÍàÄŽúÙ¿Ì:$çºjûÃE:Ö_.%_«¸œxÑJìÕUÝ}p‘¸0‰çÐ?£cEì-Œ»ÝNæû_p y=›ÚKåêF™ ç=Mz¸º¢¤íqÈ^|²©Ðf-u¶Îô¸ÿEÒmµ”®žÅºù[èôôµ­¿(ª#ìÓNžÜ<ûÒwæÃD;ÙQl?½üb=Usã³¹ç_UR·ë=Æ…:¯D®âØ7ŸQšøãï‹@m;@Æô%Hî݈‰ŸÏÑÌllæîô‰¼ŒÐ‚ß1Ù!ÚŽý ¿ì¥ÎdBèGòJâ‰êâŽkR_Šb÷ÁJl²ñ5lßP@“•~iÄGåÀº< 6Æc«Ù4‚ØžA¨â“ñ=²•’Ðî«h’R°nËÄ—Œ—BÆR²Ÿ“ÅÍ®tWFÓSEÁš Têí`¬ƒ³ÍŠÕbÆX~£{K°É ûU*º*êõ–¦+’—¯Mø÷$&ä0‡6b¶Y¨ß¿ˆõ_n¡ZAlo '×­§Â`ÇVµ—=›Kë—z‰oS;ÉŽÚ§Œ &UMц ªL6,¥lýhÇ«¥u誌Øívj³>eí ª2Jw/Ôjgû¤ÛnŸ¶×Ñ¥s]ýÏü¥‰ÞZ/_+ÙþxákÑNŽ—™§8´q7ª¤Ô¦gÑùgƒ"%ß@|¢Æ2ø8¸àG*›h ×.=*^Ï®'1Z,˜Ng³'ã4!©I¸¶+5E6f×»ï“s¤›ÒW7$ÙÞ¶Çttˆ}š—éÀšFL§\ö¯ÍÃ`“±UîcÏ·?SÝäà«ÊÛѧ>Â]ŸÌçOçóÀ§ó¸ëÞèveSq©‹¡e&½«Ù„ÅPEÅŽ,ÎèmØe$"{ÆQ±iú¤4‚Dn)¸Â+— í(ÃTe°vÚÔ)‰Ÿø7ºøJÀ O­ sÉ ÌŸmAœF¯»‡7=')‘x÷}ÔÏÿ‚¥×"ût%qòƒ$jIšDÂÂ]‘º%¢¤Ðî„ûnÆœ‰;å٠ȲLáÖI)fÇÕtºþ1ú.þ‚õÓ—b”|é4èN†úJP·Ÿ}‹¶™@Rà@ÜyœM žežÙŸðÔ ÜFxÖ‚õd­ 亄›ð¯ÜMÎ7GIŒ‚øfSéÊØd‚\J IòABÂ#±~*wÂb/ubȉŒ†K|@ &yò­TÍ{E+kÁ»3q·ßOg eÊŒù[g=N¦A…&q4ƒïöD’dÂûugÿâi¬ÒÏ`üØð_u&ù4{o"£FÏ%cÖãd\ñë1Ž‘7ukÅ9¨óå9·«oAø}8›ÅŸÜÅ-“[W¤:å6†üŒÌWa3þ„ ¼‹¡Ã:¡”o _×È~é1ìþ)$¥&ã]aÀ ƒgt?â=?`Ýó:F¾ùvÁ:“ÏÑÅ=ŽP„r÷$jç¾Ï7«u¨BÓèñÀÂ]”H£¡_í笟öFeá£fhº’ÍÉòts[\ë¨}*‚Æ>L…Ÿ±æŸ °hbˆ»áQzF)AN >}9?¿ñoLOþ‡~c¤ûüÏYõÏy˜•þ„ žÊ°D íʳÞx7'vm”Ü(›ØgâÃ­ÙÆ¬$°Å:Z;¬PâïHW4õ—‰‹kU‰íñº±Þ^#º5ò9³eóV¶;^8F¡±Rüå?É,6àžð†ý¥ ÊÆY½Cÿý…©ðu/Ý÷¿Jæºüõúè_ãtàH†ßW϶åo±h®¥g¢G=͈A Ñö8TÝT~IÓŸwœà—Ï2·ÊŽkX/ÒïÖÆÝ$ÎìÓNÅ6ñ…7èîèsŠPRîŠ~Áç|ûTvÏ(â&ÜßôJÖ| rLÄÜÞ«Ñ. ·ÔáÄ~÷…7œÛ|à°Ž`&Œ¥dÞ|³Ö•À>C‹)Áª³J\Rz¬8Žgj\;.…~[$©Cè#®22êÚ:²¾Ê‘eÎ?4Í~l>Kæ«ùâ$:‰_hA3ì…‹Yöκ «Û(;“>}:©m¹çŠÁFé’gÙîý4ãšo¡\Èè¶¼ÎwÇ®åÎÒERñgưƒ¯í£Ë¿ ª-—ý:`ˆ—Xkt›ÁŸkÛ?Ê àÖÉÄúTrtãnä.S<ÞDðgG{·¼Ûï-FÇa=ΉcAÄ="KàªDÆn®¥|Óz*»ü•¡X H.ÁŸUgº¦g‘ùÁSüR£À'å/Œ¸±5Wà Tqôzú TîW㪫@ @®åاϰ­ªCë.~»W$b[¬@ð'çO·-V ÁĶXAG"¦/@ @pÙˆäR @ —H.@ @pÙˆäR @ —H.àJB6P¾åS~xþ þûE6ü|ªñãÑW4f g?È5\tSží ÇæNgþã².«…÷«7±úïïShmúw£O Ûòóæì¢½ÏŠoIæÕ[´RZ¬¹lö<{J„;îÍaÇûÿâ›gÿηï,æT½¸gQ \½ˆäR \1˜s>æ›wÖSûG[YOQ°6‹J˹·[>ó™+µDÞõ7üm2ÝâüÚÿLBYÏÙ­«)*kÜk7³ö_P¨»²,—ç°?ó(Æv‹)£;¼‘ÜC¿AÂÔNl‡dGAÃf~Èu|®ºçL^¾M:€fýæªÁi?4prùçyÿ•ëþñ,ÃÇöÆ×½ýÞÑÄN¶Sìyíl=|…+¬¹~ÚÃåøÆÕ¢'à*A$—àŠ,;ªÇ1â–¾h~ç‘·3;ËÉs¡†'A5n·½ü õR‰Ã;¬ !šËHDê)Ëú‘¢³ k\¾½èsï„{\Ù©\–íG1µÛ vôyëÉ=¤½BV}e¬5Z¬!‰„z«‘®lõ·ÈåÛ¤hÖo:ÙáJrÇà¤Ú«¨> Á½úJ`b<^Êö×ÔÄNʺLzˆn±Wúc&šé§=\Žo\5z®DOmDÆ·œ_¾^Ïi­ ·è!ô›z±J°–SôýçlßšÑ-Šø›b@z' [^çÛ,WBMG(žÊ`y"ÿ͸ëB0P8çÅÍ`¬ïrÖýœÄÄ¿Â=¥ë?#ó§ýÔZ5ö›Äð[ûá­”1®#sá*Nµ¡Iú ƒïù+!&ù̬øo)½^~(K–óý‡Uôyé^B+2Ø:ï;Ž—èQu'uòýtë솾‰ŒqçÔ$´›>ç—µû¨1»ãŸvÃîŽ_ã§V[sÙúü ©áèŽR_ïJÈøÇ>8%2ÆüÕd~½–âr ®Qès×ÄZV³êý©0Z93ãj™AZõ¹vß|í)Vµ£9‡Ó‹øÜh*g}†4u&}c”ØË·±mîò‹j‘:u'õŽH÷C!¹ >gîY,®aÄŒÁ}«Ùùò‡äUÔcÿâÿ0\?Ñé‡ÙöA.Io=N¬ªeùâCTè¶¼Áw»ƒˆUçôi-¶ á yx"޲~Ù±­Z®C½xß|œ .&ÎæŸÁ@ ©÷=BçS³rù! f%+ž/gÄKS‰°´Ð¾çt¬;ø-K6qFkdzË5 ˜òW¬Ë§‘™S™·X\u7Þ?ùˆŸmÜŒ–ô80©EYÿFjgwdc!¿šMÎÁ Ô‘ýèdk>¸•1íø˜ï–ÆlÉgñ´} xþab¥ã-ÖÕÚ_{Õ.²ß\@~‘÷ı :Pä° Jpà?‡&*z›µ;ãùÔ­„zH€LÝ/³.¶Iý>vÍ_HÞQ-²oW'ÞGzj@ ò[Ðf}Êò»©²}ãã ýÃHeÆ<2Ví¢Êè†_ñ ¾c$nöÊÝìøj!G×€_"É“$Ík3«›õ›ôØóö3Pôù3ìk!¦\? ¶e}XsÙúü—ÔD{QuØNÊ´H¨^q 1S8û1ö«‡àQzÊJî='sÍ}Ñ(@®nA'É¥ìpÔÿ3Ãǯ²÷T=ö/ž¦jÄ“ŒZÁ’œ~Üþè`\Í'9¼ðsröŸ“}܃ ‰J®¥dõ²·¡Þ¦!`à ¿©7lmf§¯¥|áÇèoùƒT-Ë—NüÛ¡ÿ9ˆE’µ”Âo?gÇöB ÊNDŒšÂÐ1‰¸ÚÄÊþÇ©1£<9}QûÒñR¶\o7ן.ò^>{/ò¡ÞÉv ØË8Ú §ž?´Ncžú=‹ùùÛ ÊëÀ£Ëµ ºçF½Zöës2™Ðf- cåv´F/: ™ÂˆS¹Â燈•K@Ð6lìÿ:—ñ¯1åÝ7™ËÖå»1cC»þC2‹’ñÊ'ÜñH*ÚŠȯ97ضչýÐ;ÜyO?"{¥P`?:0£¸0”˜Ô€&ÕX/bK†½žû{^y”ðâùlÝZ‰\ŸCöœM¨þò"w½3“Þî›ÉXSÐd…J îM´ÏaNX™ºC1&õ!TYÂÁyßbð,“ß}—ÑiZr–n¦®!øUÆ4g7‘µÆHò??âžWŸ ªl1ÙY-l³´W¢óØÞæÖû©üa-§­ ×ï"û³L\o˜Á]ï¾Ãµ©¥l›óÚÐ Œ{i nÉ ˜ñÿ A‘r·LéƒkÌLxõQâ5ë)ãÐÜ…T&ý[ßýñc]Éûê;ʬVήþ„\Õxƽõ)·Oçì’Å“é?c½c¼ˆ½÷mÆ^Úd`åH¾ +€ŒµÂHÈ3¸õÕ—è©ÚÈžìr‡.áØVÎê¹¶)ýQnzecûÕ°wM.CþÛï€{Ô8Æ¿<•H•ƒöÕËȵÙdÍ߇ïí¯r÷_g@È~ùö á÷¼Í˜‘!x û·=07»#ŸmŒãzZ–u7&(Bæ IDATÙJù³ÙoÎ_ßü„[&wEªk¾V*áÚ÷nº% —nS¸íµGˆó°9­«5ØËõøÞ6“»g½Hªj3¿üx›³68ôŸ %R¿û+6üìE߇niH,ÏÉï5´™M”™7‡’ð)ÜüßO¹er4§çÍæPy ëÄör´æ>Œšù1·ÞÍÙçú‡õØR6þh"é©÷™úæs$YV²qÙA,˜)^õ%Å‘÷sÛ{Ÿpã ò® ÜI¿wÂ[Œ)>Îõl¯Å| ÞzžÇ[á#çôTW׉ôÿ{ƒI/Þ‰÷þe>iÙNª’÷CE)O£g¤7ñ÷½Ã„qqüÚ*åk>a¯a(cߘÍO Å´j6JìXö/âç=! œñ w¿p+šœ¯ØsØr±Ï8’¯Áf-û·#çsäK6´ë>"ûLFÍœÃÝÓnÆmÛGdìj8cÜR¬$å"ýX[lŸÙa½û†­E*³:hO3Z£ G1êL¶~SHØC³¸gÖ tc=[×ÇîÀ¯Ë¬`ÍÿŽM+kéúø»Lyù^~Á΃†Ö +\ˆäR ´J•SE)z«7á·¼ÀÍ“RQÛNQ¸³‚ÈÑcéä©B9‚øˆcœ‘A£» ²(ðù$×ßÞJk|‚]ª¨¿ÄÁÕKɧŠíGç@(ý ˆòÅP]í`‹©[]¢É;…ø$$ÔøuŽDYS…á"±•ÛgÎÛÁé°Q¤&ù¡Tùñ—{è›âÍÅcH>ÛÊzÊj-áäA#Q׌"À]…Kø:wnÍžFçuµUס$Ey¢p 'aD/ìy¨²9)סÿœ«Ózr%Ÿ&î¾ûéx‰6TåpìDÝǤà¡Tâ‘0Ž ')ÜÛ„"Œøá½ðvQ㙜‚¿Y‹Þh¡lû.TÇÓ%Ä\Âèrý0Ô{¶Qj•P(•Øj˨­“Ñô¹— ÏÜDÐ%Dj9¦¨œëYLtß$<ÕJZã# Òúãçhb ¬¡¾ÆÞ6´ÛIŠöš‰¹nþnJÔ#é?i(þ ;ʸ¹þñ› Õ(Pøõ 2ÒŒ®Êà|kï%äk]_lÀ‘/OQ˜SGÌØÑy(Pô¦×È0Noß.9s+›ã°}—ðá_iŸ]øö%uá8æÉž=ðÌã¤F¹ƒ*„Ȥ0Œ•Zd‡2Y)ݶ {ú8ÂÜQh’HH÷æôÂ+dK¿@ÐvĶX@Ð6”1ô|à.ö®Z̪U ŽLÚ-7ëV‹¾¦ž‚Ï£¨!O”mÒ«…A{7b»,$ÿP-þ§ãÑs4Þn¿´`¬3âw>™“PGö#™º µXO,cùSß7T"c× £éU üzöBýù^*kÃ8u6™¤®® ÉP³‰í_o¥¼ÊŠÝVK½}`Ë[¥G2|ª‘œµ³Xò¤_Oß Cñp¦IBBYÆT]‹äÈ…»9xyס­³CH+ôÜ »®“‡/çHRCÞ+'wឬΣNCw§#ÍKÈwQ³$'Wç¶rX‡ÿEµÐòÙ7 µ½¥öɘkëPxûâÚP¾äÕ•.lèáÈg5­©§¥67È*×a4x£ñmë!¹¶ÔÕŠÒ|üp7h1ËŽËuì?fj±Rž…Ê-ˆPùÒsÎöúÌžh\Ͽ₧¿7ÆšZì;œµ–ʆþaÅPgÀ#ÖÿBß“üñ4çc0ªèrÓSô\½œÌ×—`ðîFÒ¸Iôð½„P-Æ {kõÜ*¹¨EH’ ò¥tÒ¤ԥë0è½ðñ:¯M%>=®=W’ÙLÅÚOØ’{“ ¬5V|»;/ι|·ËÙ9T‡¾d=À¡z_|ü.¼›ÊúLr³!V^\¾Â¥åö9‹4YèSÞj‘–tá(æ²SÞ²fçQk¶#ëµØº:“I‰±¶žºío0?£¡8ÙŽ”z‰Éà F$— m˜µÔÙ:ÓãþI·ÕRºzëæo¡Ó“q¸y‘<ùuúÇ7lËè¶4/İžñlÏÙHa…Ñ÷5{_›—ÆšàÜèÎ^}‚³|5ž¨’&sÛcÃqsr&E éM´r¿”QÝu¡.€1‡íŸe£yð_Üï‰|r)Ë?5¶ø}{mÆàkúq ?ÉÁ9¯³å§ÎÜ8.ª[>$\}¼÷Wb”ÁSìUèj½ððj߆…§®úãèm€õÔ”¡Œò¥ä›Ï(M|Žñ÷E ¶ cú’Ë“¯M—¬:²U~¡¹Šc-¶OÂÅÛ {m &<$MåT”ØñíØ´ G>ûôµ¿^å°'HÜÜëÐר ´#ÚÔ>ì5UܽpÁq¹ý':PâsÍ3\¼’.#úÙI»:®O¡ñÁEwp0£ÓÖããÝÊíP*ܽÜÑkµÈ4\XUU‰ÞÅwW#õ¥*"'—Ä>„ÞÈ#5Ø­5”®ùˆ  ± µk“ņݑÏ6®ÓI=QF•âÊñõ›¨Ô[0Ê   ÛžÛSW3¬G·p¨¨›¡˜#v£LJÅOá¤\Gþ#Hxâ7h éþYd¬Ì㢇24¶‰_ñQG9°.ƒÍ†ñØjö ¶góI"G¨î—Ž5ûòËL`>Cþš_0§õ'DUKÑ¢×Ù²±£MÚÓÕy[5ë7rýqN:Ó° º…˜Ò=;ŒkÍãŠ#œêÄq?tˆ2‚˜T5E2¨2Ù°”f°õ£y¯–1ë Ø-¬&õù[(߬֡ M£ÇSws'hÂXJæ½Á7k] ì3„°˜¬:;H>„÷ëÎþÅÓX¥ŸÁ¸­“OçXŠqd+Iä°g9µÝxÏX÷¼Ž‘o>D‚ƒöI4¹˜Ÿ<ËÜ:^I×0ôŽþ¸Iêƒðûp6‹?¹‹‰ và³õì°<Iª"èúHýòSV?³UTÂCÜ[8óÙ gu9݆yAC¸FR»t:óŠ x$þ…aé‚Rãrù ¿Pl wLäÄë_±³û‹ HpÿuÛj›H6'•4‹SãG9hŸ"Ê¡_S[ô!;Ú•/²Þx7'v½¬ÕG1O)ß@¿®‘ýÒcØýSHJMƻ€`‡~­L¹“Q#¿bë¬ÇÉ4¨Ð$ŽfðÝžbSpÕ"éLþÀ(@p‘Q×Ê+ôrìÔ¬ŸÉòï7½™7ð:®áv:]ƳùÁ•‡½p1ËÞYGmã¯ìLúôé¤_ßl”.y–íÞO3NlAmÂ/±Ö$è8Dr)üÉÉ¥@ þðXóÙþÆwx>ø ÝÚ°Êþg@$—‚ŽD$—ÁŸ‘\ àŒÅ`Dåî.V-›!’KAG"¼I @ðGBíîþ{ !üáû@ @pÙˆäR @ —H.@ @pÙˆäR @ —H.ÁåaÍeë´çÙSrñƒÉ[í ÇæNgþã².«†?ãÖöâe,›>ŸRÛï-ÉŸ¹z«ÿþ>…²Ë’…Ÿ9Æ–ósßÙˆþ¢$£Ûòóæì¢õj3Q±é]–>u/ó¾ÚÓ†ï]™ü9ýÆÆ™EO³lå)ÚóëæLgŽ}M ¸ú·Å ‚6"£;¼‰"9”dÿ)ÑvøGvÄ1læ "½Ôâšø+ ë) 6œÂwÔ@Ô—Y–v3kßÊ¥ëôG‰õt`iYÏÙ¬ÍèãÇs©‡µ[Ë(ü~9ÙG¨5»ã“<œ>·M Ê_y™‚6ÆFÅÓY±º»¤@é@@·ô¹ùzÂ|€3‹Ÿc›Ç£Œ¿!æògmÛÒþ°W`ï¢EÎ=ƒÉ%ˆÐþ0a¾Nm'SŸñ+æÆàÖæNè,.t|Ìh û¡/øú½ÍØU½ñÖxþÐöirýNrVVóøôŽqog2º-¯³ôð0î|d ê†×ÌÙ³øz[Onýû(<~÷`ù[úÍ•D+ûx£øó?”N ¸’É¥@ h#vôyëɵE“”ìß5kkÈ B½Û’XÊÈHœˆþeþ°œ¤`m61C ¾Líøö¢Ï½]Ñ8×S–õ#•Þ×9O®d%Kß&»¤/Cþù!îÕ¯›ÃÏÚýÜD:]n"Ü —ÿÇSz@} '×~Á¦÷ê¹æŸ“qS8òA+Ã/ê² R›UÖÊö_T—Œd;ÁÞ?æDìÝŒ™Ù1ŸÜ…³Y·Èƒ'÷pò£/áÙó6FÄàÚ.;‹ 3#uºžñ/ÞN§&s 2öùÍÐUap‰&9ÊE*•e©íÓ>dYºÜx÷[úÍåѱºtÜÇ›Ð8¾UuPÕÁU†H.A0püËidæTcæ-WÝÅ÷ø´YŸ²|ÇnªìDßø8ǣĄ6k+·£5zÑiÈFܘÚh¶]Æ´ãc¾[z³%ŸÅÓö1àù‡‰5ïg×ü…äÕ"ûv%qâ}¤§ °æ²õù/©‰ö¢ê°”ÞLÝ{ Ñ%vÂxâu:wÂGO ´t#‡òJ1Ø;ÑeÒcôëî Žd±5+sÚ‹ô ùuø WïkQŠ—ñýÇÇ êbâlþ ÄzßßHíì&ãõ{¾fó¢Ÿ)7ûÖ- ¡ ï©Ì˜Gƪ]TÝðë1žÁwŒ$ÐMr\6Ê7}Î/k÷QcvÇ?í&†Ý9¿Æ –5—­Ï/ÀŽîh!õõ®„Œ¬ÁV-×é_¾‚UïÿH…ÑÊ™/PûÈ ÒcÜ­å}ÿ9Û·æct‹"þæ‡Þ }æÛ¬ø9–1ÏÞD€-—¬—gc¼ñe†ÇífÛ¹$½õ8±”pô›9ìÚu “º‘£ïcèp9¯|H^E=ö/þÃõÓsMh‹`¹~'wz‘:íf¢‚$@CìMSÑÎ|“܃¥S÷B‡í½`a¹†£ïÿ“à /1îº$¹’ƒ³¦S2àM®èÕB½JMo~ˆúã3Ø»k,£{Q±ñc²=Ÿb ÁÍ~Œ=¦¤¢\»8dÁè‰ý PÞÝéu×_9=s…ãRé `=Í‘/Ÿgã¾ÓØ{’6õºE¹bÚ·˜µû0éÑÁ¸¶h×`Èè~KÆ’MœÑÚñìr ¦üëòfqáþA «XÍb†öfRMß’‘¾ÿà óG¬ØéEÅTTÔ#EŒbèÔñ„h$~ÜÊdÄÞÈ>‘(”ÕÔ¹j)Yù `ÔÄ^ƒÜЗ앻ÙñÕBޝ¿D’'=HïdŸ ¾"—ÿÄÚ·VRQocã´£tú*’ÿ{÷EÑÿqü½WÒ; ¡w„ÐxTÄŽ‚EÅ^ûc{ Ø‘bAé½H•¡’K.Éår—»Û߀HB0"ðãóú ²»3³3³{ûÝ™Ýõ•rLÛ†}oiEyÇÝK/KÉç‰Ý_1å­µDTÉfOVkz<Û—*ffR¸ys?û‘ôE×J£í }iPåÐŽÿýæÖVäýzœóàß;‡yã&³mw¶„dš÷@³º!S—Mq÷\ äþβcŽÑâ—ÈGö!s÷,~ý%Û÷Ctó¶DîÚLÜíÏÒ*â¯ó[Rë,ä¨ÌËó{!ræÐ3—"rB©Ûÿ5zt­Bd燸ö¶C8¼méöÂ{\Ó§6û§þÈø6Oæ—os9çîáÜôß[¨´f4KÖ¸‹¥gœ:ˆ+®J"¨ÙM\ûÒ ê‡f±qÜHvW¿‰+ßü€«úÕfϸYwàÐS/\¼‰WÑ{ØS¤T6 õûÑë™7¸¶ÿ9øj ;kßÊåÏ¿ÉWIJyê¯dŽS–âi)23Ë,‹™{£Í]\ñüëôlçdåËð˜åÙo0ó˜ÿÉZâú½ÊM¯!9Öõçt>ߦ/ùù{I÷¿EÿW#©è[~þj E”ž¶¹ÿæÿPH“GÞåæï¡VÆDÌwÛ„,\á=èñÔk\skc²¾9ÔV¥äé¯Ù›^ÏÞD&¤=óÜ‘%~3Þaîö$º<ÿ>×jŽcâ'lvBDÚu$Íbé¢dÏšÄöÄ+HmU,X3q/žÀÂ=)te$ýè‚ï§1¬ÙŸDûgž¡uHêÝò=K ,̽ÛÉŽ:‡*qÅÖ°V'±Žc׃ÏI•²¿uÁ(j´¬OΚßq™`ºÖ³gO=j5‰({DLj§Z£2·í,ááœ÷ì;tïàaãØÙY¥/W½þ6—v*`ù§3È @Ñú ÌšB«ÇÞáæçï¢zúxæ-¬rÌþûËèþ¼ jßñ}onAÁŽuWüº8¶!‰Ñ»ÉÜsðá/3ÿfóA\óÆ[ôHÍcÅøé8Žx¨¬´v51s0ü*bú¼Èo¾LZ•ü6i Õo.á¼sθýê–Zß&^W$½Èµ/>K«_™ýýFüe”çÄ•/­¢5™½(‚ÖCßåÆ!×ë=ü,¸—ôï>&½æ®ñ>—_ÁæO§’Q¬O ÑãÁK©Õn/½BZ[™Çô‘mزÜeYe)ëdºò í2„¾Ï^Gb±ÌÌü¥,5—àKŸá†áopaó},ù ™¾ÃËO~¿ >PŽóX`7kÆM¢0íQú N÷––ù+yæ±ui–ã\Œ™É†RŽÑv³füDr[ÜËuo¼Î­|d;J^ùøuV¾ß ‘3‰‚K©8K5œßЍ ;áMšçuPPXľ… ´éE£j¡X"’hÔ&Š=¿o-ûåÙËÙ´£É=šfµÖ¨-ídëʇòJ¤vjáv+€%žÄú X0ªÓX{]ê¤TÆ‚…ÐZuˆÈsð•]–£Ó,gYŒ¨¦4HŠÆÀNlÝšXÙ¸Íãäuˆïì­Ú•Íb±Úb©šÚ‚(ÀGÆ¢¥Ø:\FÃ*ÁT†wƾb!û|¥§mZíXÌò3²ð…4 åž—9¿]t m•H­Öõ6 ìµêí9ØV¥çYF[ùw±uI&5»÷¤r¸ {Í.4¨±‰›<`­NÓ«ÎÃ5í5fþb¡ÙUçqT´fØlàqàÌ,ÀZµÝž~ˆf'2 ÔSˆ/(ÛéZ°‡ã󖱿Šƒ°fmHH_Éî<ß–5dVoIÍèã X°‡†às–\Z¨Ôê\â#ì9ËÙ´¥M{4#ÌDtûÎTÝ¿†=Î"2–­$$íbêÆc‰h@ó>7P7>pTzeõ‡ƒkØêµ§Aµ0¬(òx±…Á؃<y¦lÄ´ qëjØma$téFUÇö8ŠåZF»z7,fOµn4O:ØoküçfR›FQþ÷"•]ßÖêMŽTZã¨w^ ¿“í-£ŸÅÜ?©wÞÀÈ;n`äý™:#ãÈÊê³Åë|Õ‚Ú]LýÊÁX"êÑ ¥Ö¡ &‹ÕŠ?7ƒÜ<“ˆ¶·Ðûá+H(3"<‘6<‘áªÒÊRö9ȈnFÃäìVËý¤hÃv%t£eJVoA!¶Ð2G8¹9z×2ÿ‰;XpøofUb Š(Ì+$¤þá g{Ív40÷K¡¬þpôŽ؃ƒ(rxŽÜEÓC‘7{P %µÇZ@aa±]j»àñäa‰Šùóù:#ò¦øq•QG(¥¾ÞÞˆˆ&ØíÄ{œ~V|¯J~æ²Øë:ËJ+ü¯õ=.7áubJh[;Õ¯¸Ÿ”i_3÷å/pG5#©×u´(³ÛžHžˆÒÊbýç^ON.F\ü_ç$K%"£òpäàèw휬~Sžó˜ Î_XôÙ<dûøsÉt(¡­Ês..ë-¹¶î<¼aq„èC¦%ÕY9Ë(r&Qp)"'‰•àð0*]ü8—õ¨Vî—FX"¢ rmÄå…ƒqŸ—#Ÿ:QXÈü›e±•^ßÚ¿Y–¿‘ן ‚#Â1Ù¸MŽ dì„F†Ràp`rhjfvA1„†Ø ”´¹»)L¼€Nõ‚‚¬ù2³~ªËå½j•cŠŠ­ŒÌZ“:)6¶ü0“¬‚îaëÔ/Ùše‚o+«¾\N¥Þ÷Ó­g$LœIÎß{ ;ÿ~üt9…&ÖÐHìv“ƒCÂvl¶"Ü'>¿ ~ûVl ÿ¨ïÅmiÖ6Uc¿bgF>Eù»Ù1e ÌN4mZúˆô± "[´"rítþ0šS»rY?ü¹;Ù2éÖxÏ'¥MI£[ÅTjIÊkYýãÜ~Ö*VLšMŽßFbË.ø‘YE\ÛY3ö –­/À8bÿ­e·ÍQlIÒØ>‹¹“âÈuã9°†•Ÿ~‡«ÕEÔ;4õÔÌYÁúÅ»ñ峿Oì‰O¦zlñçVKo× Æm©¶çg~ßè$às²ï‡w™9s+~Ê>/¹¬ôúöm_¶ fá.Öý¼ [RsbƒÊèg'ª¬>ûW-’Ø"ïÂilÝïÆŸ»‰?–m?4[!—í^fÖÏ[)ô[°‡‡c3žÊ|L«œPþÅ ¸a Òg°tÉN ‹ŠðìYÀŠ9{¨Ò<‰àRËò÷Îwö¤ÔÜ?“嫳ðÜdÍú†m!©Ô«y0Pü7úMyÎc¦Ï…×ãÃïõàÍÛÍŽ«Éóùñ³s嬇RÑR**&™ÚU7°væFÜEnœ+æ³;¯äš=nýÝß&‘Ó˜F.EäY‰iÑ‘Øw>dâû7põÀÒG,‚šö¥[×1Ì{ýnæºmD4îι7†çE) 4¾ñVòÇæËû˜Ñçиßí4I°pvü²¤W,/#º#i×mã—Oeœ7Žêmjrx€ÀÖðjºuËœ×ïf®;˜Ø½èzE³ƒß¹+%m{øÕtJÉ‚—îâoÑI=8·[írßA,3O{#´ùšÙÿ{Ͻ¯•°SùâÁ¤NÍŒ¡_RhÄP¹c_:ÅÈùå36„ôàÒV1D®¡Ñìa,ZÊEÍçh%¾Çí$ÿˆï‡×G•sûÓ¹± Œhª·KfõÄ!|Wð —¥mbÕ„EÔªÙˆ¤øbµh„Rýêé8u‹_¹§7”˜F9ïÎ+¨ĉõ—¸êT™„§qK¢K¬4ïü×øxKX ÉçÓåžÿPåè?ÍR•¦·ô§à“˜t6ðZÔï=€H+X›^ËùF1÷ÅAüJU:Ü@§Î•Á¹ÿ=Koï1 Y‡VwÄ2q? ýOP‰©}èqy ÁÆÁØÝˆ¯Kðú÷™ôén|ñ-iskwb,ðרOiíj`XÓèØ/ÙŸ<ÊØ<‘IÐéúö„öâç…Áùë3¦G3w&¼”ú¶DøHÿø榻 mô:ÿ§!VŒRËsâJß7v[«Ùµœ—úsŸ¿‹¹‘çРA5,>ÀH¤I¿kÈ7‚ ßæBT]ê÷@Ýã¼Ú³¬ãë˜6,.¾+çߚϯ‡1alÖ¸ºÔîö]:VƒRËb-í”SzVFDÒìcÎgO1nd!µÛÓö¶^ÄÛþÅ~s×ñÏcFD*­z­dÖ¨‡XgT¡öyIT ÷àõŽ•ë¼_Æ1Zâku,UiÚïZ çóé“ÒŒÐcŸo8XÖRê¬xÜú·~›DNc†ËSÂÑ("g9yˆØDþ¿0¬ñ*y—>O»zœzyF2)œ;Œ ‡?)qÒ³;º¾M\³^fò¦ é{[›xcªœZÿr¿9]ÿF¨w)¿ ™Fü£OÒ¼ÌY§¯ó"5Ö$ÿœ3ó(ù§ø É_÷=œ)Ô«}–†5/y™9X‚CNþ”&Õ÷ÿÿf¿9]˜.¶ò*‹VÀïËgÿÏ3ØÙ˜ª•tI-š+""gµ93^fÊ ƒ¤[$þ¬Œu|¤ö3VÆÓì¶&'ù®³êûÿ³ßœFŒ0ªulÁ¶/^à“\ت·¡Í­—çs4"gM‹9ËiZ¬ˆˆÈÙKÓbåŸtÖÜh‘“GÁ¥ˆˆˆˆˆˆT˜‚K©0—""""""Ra .EäÄù÷²iìPÆß};Óç;ùGÞ æ[˼!O²bwàŸH r–³à•{øøžgY½ïJSDDDDJ¥àRDN˜ý÷,ÞRŸÎ/¼ÃEiÑ?$}ÂL\ëfí:ÇñWuüÊ¿ÍVWyÃX?~ý‚m1×põkOÐ<ñoœêÌöÏ›Æö ¦""""å¡àRDN‰ÏéÀW¥1U£ìåŽ,Í£F8l˜ÁÚu޾Ŵ¢í-—S=¬¼™(ÈvY¯v+/úÍ'cþ÷lßï?¡­L}ÜIDDDÎRÖ¡O>ùÌ©.„ˆœ:;½'22gâYü“'®¦pßïlœ›Nx‡6Älýb8Ó?Ë’™ Éô× FƒxlþµÌú k6/`ñø_ ´ìL•p³íãGøe~&î‹ùcw, SBØûë ò|›Y5æLŸ#<‰Úµ¢0œóùõ•ß¾°±ÝüñéëL=ž¥?/$˨CzqXÿ }¤>„_å·y>6S;µ.l›Îì·ßä·Iß²y»I\Ósˆ°˜î­¬3Œ™ã'°ü×e8ÃÏ¡fÕ],~îU~ß“cõoì³µ ò–7ørv$ÍZVÅ‚Ÿý“cÚºº$5‰`Û‡ƒøeþV6|1šáçS¿Z.;¾z‹é#ǰlöJ\1©Q-âoŽðŠˆˆœ<µƒ5Ö$ÿõ&9Á©ƒ¸âª$‚šÝĵ/ ¢~XÇôwY°·Ý^ÉC®$dá»ÌYzèYÌ@.ÞÄ«è=ì)RþœžJÝþ¯Ñ£k";?ĵ·u$ÄpxÛÒí…÷¸¦OmöOý‘=¾âù›¸O`ឺ¿2’~tÁ÷ÓÖì) Û¨qÝKœß:œÄ^ÏrýÝéZ΂‘¿`ûÏÓÜðÆ ´ý•9?l!€ýÓÞg­í2z û€>ý°ÿ‹‰l-lBûgž¡uHêÝò=/¨zœÀ0@A ç=ûÝ;†‘=ãænO¢Ëóïsý æ8&~Âf§†4EDDäÿ7—"R1þt¶.Ï£NÏî$„Y°VjM«®Õسh5°$R;5‰ðòLOµT£Áù­ˆ ²Þ¤)q^…Ge†ÍÎ̬U»Ñíé‡hvœg*‹ÖÏeGÌù´l•€ÕGís[X÷;Ù~+1]ïåâ>m‰°YnЂĠlòsO4´P©Õ¹ÄGØ1»Øº$“šÝ{R9܆½fÔØÄÎMžLSDDDäÌb;Õ‘3œ™KA~ ѱÖC0‰«„5߉njûÛÉ+&G>¨iÒæf.ÌŸÌʆ0Ï“H­®×оkLYÄãÌÅ·ã+¾¾Ê¡?™":S„=p€µŸŽfëÎ<x)tE\‘AF3—g>[F fû¡`ÚôC•VnLB45VDDDþßRp)"cDî$/Û‰ÀÄ“íÀјà<’2ñd:i{=»ö§(c.sÞ|‡%Õ_ãÜÆ¥ŸÎ‚"±%õãÚÁçœ~ûgrÙlü|û?Æe·ÖÀîÿ9C¿(1 Ã00Ëó¶#‚Èšô{™ö ¬Ç__DDDäÿ M‹‘б֠^ëvNŸA¦;€?{%+~ÝMµvÍ\ZìV|Nž"9¿• wþüøér M¬¡‘Øí&e¿nÖ 8)•jé?±lM~Ó‡{Ó,š¹ŸéÁSàÅçõPäÎ&sñ|öø ˜&`Çf+ÂípâóCH¥xŒ«Ù“ãÁ›±œk%—ÙZ“:)6¶ü0“¬‚îaëÔ/ÙšebæocǺ½øJÚNDDDä §àRD*ÈJ\÷A´«¼œCncÜóqµȹmŽ÷ýK+1-:»éC&¾?—‚rE—Vâ{ÜN²uß=2€1OB^‹þ´,cԀ莜Û?•‚¯Ÿbü=w2yâv"Ï©†Õ’H£Þ=±ÏÿŸ?úó6ÇR­Ž Ÿ+F4ÕÛ%“ûÕ¾ûi¶ä^´­ù¿Ä„÷~ÃSÊþÙ©|ñ`Rc3cèíŒyüu6øP9ÆÀ·eó¿^€óľn""""rF0\¯^a(r›“§q4‘³Õy‘zJNþ9¹‘ Sp)""""""¦àRDDDDDD*LÁ¥ˆˆˆˆˆˆT˜‚K©0—""""""Ra .EDDDDD¤Â\ŠˆˆˆˆˆH…)¸‘ Sp)""""""f¸<^óTBDDDDDDÎl¹‘ Sp)""""""¦àRDDDDDD*Ìvª "§§Œ<÷©.‚ˆˆÈ KŒ =ÕE9kiäRDDDDDD*LÁ¥ˆˆˆˆˆˆT˜‚K©0—""""""Ra .EDDDDD¤Â\ŠˆˆˆˆˆH…)¸‘ Sp)""""""¦àRDN©@úÞú[ý'¶LDDDDN/ .½,~ /üxóÏ¿±òƒ<1y'º9;œÖ#—¦i¥p;9K™&:kˆˆˆˆTŒíä&o’»v2£FÿÄú,?‘õ:ÑgP?R¬à;ÀÒ 2qö&rCjÓáú;é—VçŒ2;˜¤Âl¬7ˆw¶Æþgz~,Ë{ãæ°³(ަë’½,Œ>¯÷§Ê¯Gmw[u–}ú!_ÎÛB®5‘f=ûsk¯$" ó†ÝÍ‚Öoò`—(ŒÀ^¦=û é½ßf@ÜTž~cÕkºØ±Ë;ø.8‹ê†@ÑnæŽyŸI wâ²'Ò¼×m èÙPãäÖ È™Êtocî'c˜½v?žàj4»ì®ìP~²WLä³ ¿‘î£A³xÛÂà7?æÝç¯&rÎ[ŒYsÜÑ 3ÏM•ÞCyéÍá<Ö¥€©£~ =`’;ÿ3>MoÉï|Ì[OtÅóíh¦§þñ*ùÿÁÇÎi#™g»”ÁÃÞaHÿúìúb2«òMLç¦|²žjý^⿯>L§Xù‡̲–ÉÄWC»;Ÿá±‡ÒÉú+_|ïæÜ{ŸgÈ ÷Ó"ók~]]f‹Ç}̦ê7ðà›ïðP¿Zl7Šù»¦+ŸÈ.ðÔ³×P˽‚©#gaÿÏPžyãY. Å—?lÕô~‘r:ÉÓbmØm~ò÷ï#»(šf}Ÿá…›ZìßÉ¢ù™4¿äbêGةӕ޵þ`ÕÏÁ­Îé@Zpì–#G <ë—óGµ®ü'%»=–ÆS¨\lþÜÎLgñ¢\Z÷îIÝp öø6ôî^5óVã:NtiDÖ'©N(vªvîBÒßY›eb±Y1 ì=àÂVýBÿï.ªrZÏ*9…¬Tî:˜}Zc³Ö ™ÚAÙdçšxÿXɶªéÒ,›-–ú©ÉT:t¨—µì˜ª7¢v˜¶xj×®Dl“ÖGƒªR£š…œì|Ù+X±£!z$iµÙèÎo”ÎÊ•™˜€Ý”–ÉñY-x×Ïg]L'ºµŠÇn‹¥Ù¹)ø×­!CÑ¥ˆˆˆH¹œÜi±Öº\zÏM|;ùs^º/“†çqYß«H s’ãÌcáÛƒXzèÂÑô›œ“ê.cdÑÄ•ïÂŒ­DÌñf©™Nròb©g=ôƒÈøJØórÈ;‘«‚¢ˆ ) ¿À$"íîÉŸÄ·o?ʸÂDRzöáºî±'˜Èÿ?»¿yŠw§gÀNò€7¸¾åá¹ÁÌýt,«wæáÇK¾+‚N¦‰;ß…KÄ1ÇqYˎËQìfa`šÌ|'áñÄ^Dt\$ÎÜ£Î5&Î<¼;¦ðæýßúS€@D' ÿ\ÇÏîož-eEDDD¤‚Á¥…à Ü.7à`(W„ÛUDHÍ,|õ¸äîç¸ÊïdãWÃxcä/ÔÒ€ˆÈº Æõ¬ÅÒ3qÌ(-/ƒðÈpŒ9&$”uñiD‘C¦ÃU-€‰+ËAQd" æñ§´šnwU \ûD¥õçáî·R¸w£_Á¤šÃ¹¹éI~lUä4V½×s¼Ð«„f6K?ÃÖÆ2øÖû×2iè$À 4"Ó™C¾ÉQ7ŠÊZö÷Ñ„¹þ Ç µCŠÈu¸«ÅÑɇD„”t=îDx‰y[Kß_©è´X+ Z4ÁùÛdfmÊÆãs“±âk¦o¬J‹äxð¬còËo2e]6EÖ`""B°À´Ö¢M;‹¦þÄWÓ½‡…_LdQfÙÊÁImh¼ç¾_™…Ç“ÅÚ¹ËÙ_RŒh­IjûH–3íŠ+˜úS:Í:6'Ü".!‚=k~瀧¬µ³Y–þ×¼7Ó¹–¥«ùóØôýt6TiN³8“ý³ßãÕf³Çmb‹ 4Ȥñ©ÈÙÉôRPàÅçõâug³{ñ¶ø ˜&Aç¤Pwïlf­qàõ:øcá*2Ke-û;ŒØRjmæ·éÉ÷ûqmúžÙT#%%þ¨àÒ 4© õÓgòÓ>ÓGÞ¦é|7s+Þ TƒˆˆˆÈÙ¤‚Ãníná^çx>û!>sZˆ©Õ‚.w?@Ïš Òè{ËvFz˜?á5ZsÅ€.$v.¿—kÆdÄ}É3b¨þ ˆ-{¨ÂˆéHß[¶òÞ¨¹ÓGÓV‰D•[©yÉ`úä|Ȉ{¾$ÏV™¦=îâÖ´  aϾ¤ŒÃã·!¦Q[jÅÿ5zj„F;û±BK®¼³'Õ,VÌ^é1j$/Ý5·5ކ]p›F-EJf©Ljï‹Øyœ§½q4lSƒJ‡Žc#ºôe‹O»o"{üX^½ÏÝvýÐ!ÁéG­Æ•ý³˜üÅs<ý¡—àÄ.¸±3šø*"""R>†Ëã=£>ïfš&†q0õ¯Ë#£l z¥/ ¬ÇÙ°ü;&ñô.ú½vÿôDÎdyîS]‘–zª‹ rÖ:³^wZ´ž ÿû€ù{Üø vñÛK4nB ‚""""""§Ô™5¯Ó^óÒæ1îÕ{c¡ró‹Ø'…S].‘³Ü7-VDþš+""g"M‹9uάi±""""""rZRp)""""""¦àRDDDDDD*LÁ¥ˆˆˆˆˆˆT˜‚K©0—""""""RagÖw.Eä_FàTADDDDÎ úÎ¥ˆˆˆˆˆˆT˜¦ÅŠˆˆˆˆˆH…)¸‘ Sp)""""""¦àRDDDDDD*LÁ¥ˆˆˆˆˆˆT˜‚K©0}çRDJ”‘ç>ÕE9a‰‘¡§º"g-\ŠˆˆˆˆˆH…)¸‘ Sp)""""""¦àRDDDDDD*LÁ¥ˆˆˆˆˆˆT˜‚K©0—""""""Ra .EDDDDD¤Â\Ê¿ÌË¢á·ò¿Ÿs0^ØÅ”¡÷0vïTLþ-tf¼ð_m<½Ú9>…7†~ÆVÿ©.‰ˆˆˆÈ™©‚Á¥—EÃoá… ŠXùÁ@ž˜¼““rV¸“9£Ÿç‘;n¢ÿMxð™÷˜±Åul rJ™8×NáÝ¡wqûM7rÇÝOòÁôMüÝBš.6Ïú–e{ÿh)%NöÏ/qǓ߰ïˆäÝ,}g ßH¹CÿN¦>yc×ýóÅ‘ÓÚi=rišGEcfË>~…IZpË‹2jä0¥¹˜öæxVºŽ^×ⵇΧè»7»$ïo–ÉŦÙÓXºïd„ë1mÚÓpßR–e‹.ÝkX²&ŒÖi °•'ÓÄ´VåÜ›ï¤{ƒrm!"""""ÿœä(À$wídFþ‰õY~"ëu¢Ï ~¤&XÁw€¥>dâìMä†Ô¦ÃõwÒ/­2Î/0dv0I…ÙXo#îlýpj¹KøeY<=^¼„Æ• ˜ÝÊA+0=àÏœÄÓ¯¬!¾šƒu™myhX?ªmþ–GÿÀïû‹ˆ¨Û«Ü@Z5ÓžáÙ½~gkìøÙüéÃ|È ^ê[›¥Ã2ÍlKhÆ&öçøHèpû¶&ÎRÆþüÉϦ™?áH½‡Ój P» WvŸÃËKÖãiegüÝ“©úäs\RÍ‚™?›×ï]Dêð‡9/xsǼϤ…;qÙiÞë6\èáë!o1kwïÅyÅ“<Ô3–ôŸ?fôWKØ]BµÖ—Ó¿ÿÔ …?þ—§F“lÝËÖ½üU;se·`–ý°€™5¾‚Aƒ.¤VÐ_%6¢Z“Öøs~Y~€ÿ\œˆ®]̺ÈvÉ÷«2( ®N›krsçXvU߯œÏºÑoãìû:751È\ò9#?ým¹Ûè"nt%M£ö‹¼5_òêw Ùè ¥^—þ êÛš¸£{s5S>ÇŒõ¬UZqù·ÑµvðIë­òOò²êÃû˜e¶&dÿ2s}Ä¥^ÇõW¶$ú¨5ÍܵÌ÷9óþp`­œÂ…7ßLZ L÷6æ~2†Ùk÷ã ®F³ËnáÊÕ±a’¿á¾øìg¶8ü„×îÈ%ý¯¥y¼µÔ´ŽÌ°€í3>fòO¿“å‹ z»késM[bXýùK|¾x;î¨&\pëœ_7|¬œ4†m#ßZ™sºõåê3(cYéåÄ—Éš)óݼ-¸BjÑòÊônSùô¾Û'"""r'÷ZÆ¿™i£gvÍÿxÿ£×è_k c',ÅŸôi#»­ ßÅðZ°kÜ8æç×ó;ƒhußpF lõg` س‹}áu©[ÉøëF,I]ºÒ$îàßLWÑÝŸdݾ4(XÂø·~#üªÿòÎGù§å^>{k Û;Ï3@ž-…ÛŸ×_¹•j+?bâ2f©ûSŒé$}g>5Öã¯0ÈBÕKžaø]©„”š§IîüÏø4½%¼ó1o=ÑÏ·£™¾¯ ׿ú_.¯EÛ;‡óHϪ­ŸÈ;SøàY.ä'ÆNÛzhª´ŸLg½žyŸ÷^¹‘ćê÷ˆêÈdöûï³¢ê¼øáû<ÞÕÍÔÑÓ9)3ƒå$ oMæÚÇ_äñ§o$ñ÷ñL[UpT;g±xìG¬¯r¾þ&ƒ:¹ùùÓ™ìøØ9m$ól—2xØ; é_Ÿ]_LfU¾ þ­Ìúl.¡—=LJ¿È•5×óÕ×+(,5­#Kå]ÿ%ŸÏ á‚ÇFðßçÒ0ý3¾šçÀ¹é¸êÝÈC¯ãææ™üüÃr L?{§À·{“¹á…wyvÈe„/üÉK˜”±¬´râgߌ÷ùj{×?ÿ6O JfïÄÏYî<½&÷‹ˆˆˆœ¨“|£Ü†Ýæ'ÿ>²‹¢iÖ÷^¸©Áþ,šŸIóK.¦~„:]éXëVmðÜꜤÕÇn1ŽHÍôzð… Ú{™öT?n¼þ:nì;€V|ÎψiNZËB¬öðмAx\%lù¹ÊXf)¹œÍCrÉuæ³rÔý¬)vþ«Ûª“àƒå*\ȸÇ>f}XjôâžG/&QsfEDDä4WÁàÒBpHn—›pðòª·«ˆš!X<øêqÉÝÏq•ßÉÆ¯†ñÆÈ_¨7¤‘ t0Œë^ÑÄ1£ŒÜªÕ¥†û{6ìñÓ¸¦µô0ˆˆŽ$•IÞáx$à ËAL”K†qì ƒJ ;3›ÐÈp¬ûJÚŸ'ºøÚÕˆ¦f­~Ø´ÏyɇF5ìûþ%^ÛÕÿÞjÃb196k×~Qiýy¸û­îÃèG0©æpn>"(³BN¦ƒ‘XÓ‘INP4Q! ºBi––Ì§Óæ17~- í¯?Ì/ IJ¬¥íϹÚhØõbO`ò² ýEäï˜Íäé{¨ßªÁ–b°~õnÜž¶ÌZpè»zöÏ~W?šÍ·‰=,‚Ð 3`'ÈVDn¦ßJƒ©x›Âü½LÏ^L™EAjÈ@i Bš¦Ñ,ã;&­L¤mê¡—‹˜\^|^ž‚l¶Ï›ËÆ?þ@Ùm(ȧÀW„×ë!?c5s–ìÆðª+[æÌ`C¶‡ÂŒÅü0/—&)G¾•ÖHhMëªkùþ›õäúMŠ2W0õÓ_Ù£ožAüì[µ„½îE1{I ’ë\VJ!¹òzfý¸‘|¿‰/k53'ýF†ÏKAŸ×‹×ÍîÅ ØZà'`š˜Þ Lþ.37æà³Œa ´´Žè36j·LƵà'Öepí`îØü´þ¨ç‹³V§yëÖMÿ™tw_ö*fþº—†íšf+}YhQÉå4­5h–bgõ¿°» €Y¸—•S'³*KS¾EDDäÌVÁ‘Kƒˆv·p¯s<Ÿ¿ýŸ9-ÄÔjA—» gM iô½e;£F=Ì@‡Ÿð­¹b@ ; —ßË5ãG2⾉ä1Ô?ÿFÄoä-”Æ×?Æí_cÒ‹ƒy'×OH|}Ú\ýW7¶ÂΣJÙ–ïeôÇC¹ó­""ê¦qÍݽ©cRzsõ¢¼ßmP9™”ø˜bÏ DZ¶òÉÛØšJÝ®¸³U†QÚþ™¯µæ%Ü}—qŸ=ÃÝoº°ÄÖ¡Õ%pC›H #‚óûte͇Or×áÔMkD‚µ°R§×@zŒÉKwÁm£a—ÜÖÔF4ÍÎMæÇqóRÁyê²k¹ëÒÑŒ~~cÝ!Tk}wõI&È«Hs7¡]Ë`îmO›ÃC±–D:]ûÖ~ø"÷Bí´N4®·+á¥'eOîÍuMÞâ“Gá«”L×VMHØ_ÀÁG5mÔ©áå»çîdCNu»à®Va`fý•€¥*Ýy+ΑòØmÙøÃk“ví$oÀZN#á–íL}þnvå…R£ÓômÊwc,U8÷–Èûd ÃîÏÆ^‹–½ûSÉ^™ÔÞ±yÜ0^ø1„êm;P¿Î¼®FTz]¿“/>y‚'³ý„UkI÷:g .9­£úLpÓ«èÓa “_¼›Ï‰£N‡ë¹ºsÆÞÒöÃJÕî·sIîÆ ™‚Ëš@Ãn·qu›h (u™Å(¥œ†¸‹ÒsâXÆ L¾CíŽ}¸&FÓ½EDDäÌf¸<^Ý.?‚—EÃ1«Ùk<Ò-]îÉÙ*#¯ŒÑ¼ãò²êÃûY”ô"·­ãHDDþ5‰‘¡§º"g-½"BDDDDDD*LÁ¥ˆˆˆˆˆˆT˜¦ÅŠH‰*6-VDDäÔдX‘SG#—""""""Ra .EDDDDD¤Â\ŠˆˆˆˆˆH…)¸‘ Sp)""""""f;Õ‘Ó“°ÀŠîB‰ˆÈ™¡èT@ä,§O‘ˆˆˆˆˆˆH…i@BDDDDDD*LÁ¥ˆˆˆˆˆˆTØÿè E.<IEND®B`‚82-1.11.0-06-notification_user-var_rendered.png000066400000000000000000001675631516513262500366400ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/82_changelog/v1.11.0‰PNG  IHDR…ÂXl]sBIT|dˆtEXtSoftwaregnome-screenshotï¿>)tEXtCreation TimeDo 01 Dez 2022 11:26:00 CET‡{Z¿ IDATxœìÝgxUÛÀñÿlIï½B )”„’„Þ¤wņ>–×ú ;ö‚HQ±+*¢ ô¤wÒ(!$$!=„ôžÝy?$@€¡ šûw]| ;;sæì™3çžSFI:Y¨"þq\­ÍovþѲ‹Ëov„B!„¸%hnv„B!„BÜ< !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4aº«úVM ¿¿8ƒ}U~ yåz¹iO@ÂÜøf›ý_~ƒÛ¼´—ÜMƒÔ|ö}ýK2Ùøòøš5¹Ä-ý•µ»âÉ-Q°tnFÛa3¼£ÊUÀ¥É^ÿ1_¬¬¦×ÿ&Ó÷jÎá–¦’½â &ÏM E£ÃÂчv}Ærǰv8\ïSVO±mÆ«üœÞ•§ß¹‡@Óë¼ÿ[†JÞº÷øøÏ´yd÷tПýäT$_½6—”60å±Îh“þdƬ­Øy…º;Ý€rü/¡V’³Í[örìD.e¬œ›ãÛ¡'½z…àhr³(„BñwS)OÚNíéÔÒâ¼vdÙ{vRèßVvïÿ»¦žBµêî¤P½ú}Sÿdêã3ui Ft˜Û9`ïh©@%ï¯ï™·6–bÛ6„õìJ —zÓó3à*Õäç䥩ë)PôVŽ88:b©ÿ7Õ-^]Ç2fÜXFºöö'Ù½`*Sç¥òºL‡…½NN6u¿©PLl°wpÄÖ¢øe´‰¨Î`Ï÷SøtöBbNZàÒðÎíðÐgp`áL¦½÷-û²«ov*…B!þF*IËùá³ïY0k:뎕q¶yXEÖ__òÍ÷s˜3s.‡¯ H»ºžÂz‰*]Äš¸öŒk{‚4Åšà;^!øÌjÈJN¡ZÀÐÇ£‹ÝÔ:?ĤÎ7ø07ÏðጯëÍÖëÉo³:r%Q#ZaqîÖªª¢(W™÷Š í'¾EûkKð¿ŠÆk¼6ào;Þ5ý~7ƒZÌÁyÓùc?´ÿ2ãú´ÀüLò ”[Ëoß,dþ,–/M$ÐêtnB!„WI-ÝÏ¢/s¼TޱþóOQŸx†Ûütdÿõ%ßþM¡Q…ôMÌý΃gžé‡c#šI×jì½p©Ngߟ+‰Ks}óIXý+·Ä’U–­ qýÛØQù!Í?Š`Å&ïÂS¯ö!yúK,ÍîÊCïö'åÃ)¬M3‡YøâÃü5`2O7_Í”ocð¿ÿSèbB%Û~gÙš½¤æU¡wð%tèÝ ŽðÀ•Ê´­¬X°Š˜¤\*µvx† dØø~xç-dÚ+È6E¿òî“{6åyZnŸÂ¬Õ*½_šÂíÍ´—8{4TsðûIÌÙçC·Ûm8¾%šì2S\B†1îÞ~xýS†JšøÜÊ‚Õ[³ÈÌ3P¶wO}ÏNTDí$7ôifü_[ £1÷· Äe” ±oI§¡¹§Ÿ%kßáÅŸRéôôL 3µÍOâ»øv<úé}Ïx†¹=y~ÖôÑZžÌæ_fù®NÕXáÜ‹ñŒ%Ô.‘yÏMaý|ôê œ(fÛ'OñmÆm¼òñ]øi ùqlôd⌗èsÃ܆Csxwæ6œÆ½ÇcýœPª39°ðÖíN$¯B‹W;ºŽ@OÓu|zA}‰žNò,bɲí$f—¡µkFpïñ ïï…¢R¾c&oÍIÀ§K*ãvs*p¾q+‰sΤ—Gà¡…ª˜oy÷‹]Ø}§‡zßRŒk’V±|gÞÃ^ᮾÞçUTZ,ýnçÞÇ*˜ýñJ–­í…ÿèüÛz !„BœO± eà¸R~ÜE^ŠZ–HäçÓ(êlIü¦¸Ú€M0ÇõhT@׺Ќe BŸµže3ê†ÖWMÚÊYü¸4–š–ý¹}äZ²~ötÖ¯Æ:d÷ÃN£Á.l÷ÝÝ §ú)Rœh?á1úúëQ´>ô|è)Ævs?/Ñ*¥Ñ¿ðý/[ȵïLÿ‘C¶<Áö93Yu´ µ,ŠÅ³æ°ë¤]Æÿ‡Q}=)Ü=Ÿþˆ¡Ê¹£ÿo Ï^ÜñèxÚØžŸs—:‡ª³›ˆMt¢ëøÜцܽóYº%—Ìh?µœâ¢*PÌ17«Ëµ”ûŽ`Ö®=‚©Žÿ©ÓqÔ¬=CîOoSlÿñæF—ãÐ1 _])‡£¨¨8B\B¦Áá´=¿G=ÉÖÏß燭ùxõǸaí0‰_Â短"Sñ!(Ð cÊQ’*k÷_…!7†¸ #sHL,@ñ"ÐæV U*‹rÉËÍ9ûïT1Õ- ÒVÍæ÷MØv»‹ ÷¦Yé>VÍþ‰f](£Pyd>ß}³šT}[úŒEgÏbþü”9‘™g¯CµŒÄ}G1 îJXëÚµ¶@ÍŒ!>×T“w˜r;mC=n©€ ¤îÝÃ)óNôés~@x–Ióô 1å佤þÖ !„BÜ$ZÂä‘û#pÔÕ¶…Õ²$voˆ­¶fȤ§èáÝøÅ®qø¨ÇîwÐkÇ;¬[½€ýac[ÿãªClÛ˜‚¡ùî}p0.0†ZRðæïlŒ¡÷CôwÁTQÀ¥AþnhÔSg¿¯˜áä×o[Ü‚Ûág©P•Vïj±›öPdÖž»™@¨¥‚fGŇ‹I>’†ÑÛ•Žw=AG—|Ý-P äí?Ȧģ䚄вuKöë@±ðį/vв+:‡Úí´þô½o áö j‹bîù•Œ´ 8_k&ß *…9dgëÀXA^Ü2–ÆV¡kJÛÓ=Aw½Á‹ýíQÔvL_O†I{zòÂ,èlKÎs³Ù½%Ž»Ÿ #ÌïWæÆFs¼¦> Ñ.7#8<K¥êœ#’7°2º÷ÁÿãáQÍÑ`į*‰w—oewúíôoíÉÖDS ´¯Šæp…–¦ÄÅd¸C‰éàÔ¯5.·V$s–ZÍ‘y¯òA5\ª9™‘ƒQëOHß„ÚA+'+ÜW`©q½°ŒRÈÞõ›9©kÃØÇ ÜNÞ(ï¾Ë¦È ï}Šß±/òHO{ Ò´-{÷r(î½ 9r¨Žm=n±>6µœ“9E(-ð¼HO»±8“ô“¥(Vvp*‰„c‰hì\ðtµ¾Å\!„Bˆë­.0Táë9µ=†§)6­:éIzx]Ùj|ׯè¼é9¶ûfl`ÍÒ†Ök_O¦’U®`çßêL Æ!? ©i)ä:á~­Ç7æ•UƒâÖ¯ºIGŠ]î{¿GÝ*®q¬þm¿§¤¬¢†ƒ 4¦sáòçr:#ÐÎM½`¨¾…»/Ôj¢xŽèÓÿWÌÜ»2ñÑÁxh¨ Œ¬m¬j犳IM«B-ÝÇ7Oý‡oêíJ—ŸG1atˆðç·Ÿ£‰9qJÌ!JL‚èb…©s]™–BŽÁ@õ²7ytY½;ò T,Ûà£D“˜˜MÒ©XJ[bœë:þŒŠ%ß'ãÕV´nÝüÖ.¨èhÞÿAz¶¨—²8ÖÎÛL^ƒ_0Å¿[7\nbÑ”ÉìkD«¶át„ƒ Ô-{–1‹ôô÷@Zœî-ÕyáëkÅÆ'H/PkƒB,­¬ÎÌõ5 #Ðrѱ±JÁmp‡[2¸Ö Œ>¨¥h‹‰ûm:“+Pµ_ü†:éY¼þ¾$ !„BÜD*K˨>¿±TSNYy5*&W´ÞËuéÄ2m5ŒÁöòË®lr?·W¨6n­Ÿ$¥ö¿*×yh¥Òà‰«'7ñëgóÉðÈèÇ:ãfq’_Áö+X´ðï;‡¿‘¢Ãðc ôÓÕ¾’ÂÁ‹–>.˜k¡á³2`4ªh»1ññxÖ $sì]Çp|çþL\Ô~”ƒ'Ñ¢õù¿ŠŠÑhEG«Ï2>ļÞgZl½´(fAº«¬>²™}Ùù¸G„ÓÝ3Å_`st!…zZû74õV¡Á®eÚóJŠB¶+\$(T°l{/O¿Õ…Ø=û8r(–­¿nfãú~L|~›—ª¨çí.Y"Í‚ ikÍþ}QìÜUB h« sœÝíQ·Æ“RÚ‡‘Q,Z1è±)šúûòˆxðIú·4“W{!„¢ ¨"kÓl¾K‘ñܶŸZ–HäÓáñ§¹Íß²Ñm£ëÓT¬i;r8þ&¹¤¥]Uãä…›¹JÁ±xòê¢X5ÿ(IÙFL<¼qÔ™`ëb]—£qÁÍM‡šLzEí‘Õ²XÖÌžÉü-iT¥&µRK³n·ÓÎÏWW[ô KULBãÎáŸHƒƒáá„…u µïé€ðb›»àé®G-H£À—V´ h…§™w{ô€âЉ0? )ÍgGšŽ€ð.ˆ Q0÷ðÂA1™YŽ[«€Ú}ùÚ¡3sÅÅR­'ÁAvTÇ­eS†mC<± î@‡X™ŒÒ¢5­,þEÍcþIJýF‚ÜÁ„§§ðÔ(_ŒYÛ‰Jª×MxºŒjÜððСf&RRwµÕ¤“”TÖ^x\tñS|;…`Us„Í“Á£mÝo¹ÐâŽKU ‘«ŽR~‘8W±ëȘ'ÿÃ&1²­„B!„hªÈúk6ßþSÖÎ!ì;¼3NgæÖ†kJÝuݦ»)NÝ2`3IË’ÏŽv3iC÷ÞÞĬXÎOßUÞBÉk9Ž;½ú†b¨V˜+FÒ¢V°Æª;}®p˜bG»žYÿõn–}ó;y­­ÉŠdW’žˆÞNè­=pÔì#qÍO¬-õ¡:~3Ûs `o¨m`+–XZj0¦ï`Ý2Âzw㜸8‡&A±%|HVÄ®aù´©”÷Á¶è[6Äb5öC^¹ÝEq¨B:ç¹&¡ m¸¡®õíÏ Öùi÷wLý2ƒ®>*é»#Ù–Û§§>L;3>­1[·r‡ž„4×¢hÛâ[CTœŠwp0ÿÐEG¦Ø /ŒfgäŠÊâZCJTF­.NÚÊhÚöëFäáM,ûbanTÝ̶ ÍFõ¡¥Ž‹¾kÒ¤U'‚¬·²»PƒW‡8ߊ1! ñĈÞûù.òs¾SîgÂðg_T¯V’{$ ü‚pvëL/·›šT!„Bˆ¿Zzˆ¿VÇÕ Û0tÒôðÒá¢áëwÔ­JšÄ¶•{èôßÞZô:6 uxô¿ƒ..Úz€¯Á“˜8´ ºÄu¬X´ŠDéóÈÓÜîWÛÂS#èׯ6ùÑlÝqŒÒ+©`z/ÜÝÇÜí¬[¸”˜"Oº=ð ÂÌÐx æÎ ]q«ˆaã’u$˜u¡K€ jIùå*h›1¤;^&DmÜu¦·ñ¬ËŸCÓ `Öúnž{f!–'Ø´`.‹¶dâÜÿ éïZ÷›+8t ÇO§`N»‹­ªq¥ï's_ŸæTD-å÷y+‰3¶ãÎIhkV»‰i@|õ ÖíBi©;Ú´o‰VcG`°Ç­;Ÿðj(V´ž0‰Ñ]lÉÜ4—y?. ¦Â—Þ=BOwMeÌ‚ïä¡Ѭ*š ±=Õœà‘“˜x›×¥/j“Ú¶µAÑzѦýù+ùÞB üÆ<ÃÝ}ÉYÿ9½ô2Ÿös¿žÎç¯=ËÔÓ™·.íª!„Bü)–¡Œ~r¶šz¡ µ‹Ï<À#÷wÆQ§`Ör÷?ԫѯ¤P’N^Á«îÅ-ÃÕºÉôQÞÙÅå7; 7‡z’mÓ^eiÅ0þ7y®·lTxš¢ÄìØ¶c'NRnÐaéÒ‚€Ž½‰èØ Ë[>ýB!„×_Uz ÓÚóüN*§ESܼ=Í-?´N‚Â( ¯MÓ U ã7²}ÛVvîÉÄãηy¤—“ÌÃB!„·îè1!Äõd¤$~[÷çãÐu"c»K@(„B!jIOá?”ô^›¦×S(„B!Dä§P!„B!š0 …B!„¢ “ P!„B!š0 …B!„¢ “ P!„B!š0 …B!„¢ “ P!„B!š0 …B!„¢ “ P!„B!š0¥´²J½Ù‰B!„BqsHO¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4aº›€ë£Šì+Yºr;“³)¬P1±vÂçGNä¶Væ(7;‰7ŒJÎÖÏ™6g/Å®}yø…{ µù÷žíuUs€ožø˜-Å*º ‰|üê ÿ®¬3¦³ìµYpÜ€Æq/MŸH öo:¶@-?Ââ©3Y•¬'èŽçxê6ﳕ¡!ŸÃë²rK4‰§(7˜`éèF3¿NÜ~Ï(ÚÚþý×WuÊjfM›Ï‘ÿ÷yF˜ÿíih•Š´í,þ}»Ž¤QTcŽkÿI¼uwð¿åfsQ†Äy¼üæR2 Z­éÔo·uòÀì†ßSŒänšÁ;ߠШžùkyA&‰Ñ%xÜöà¿8 (ãØ®=d–V¡ßÎþ”»m{ë5¿ …GÙºr5ÛÄ“š[H¥Ñ+GO|CºqÛÐþ;ÞziÀÄ‚—^gYºáòÛ*öô{e&ƒoÑs¹Õ¨9¬zëYæÅ×€bCÇGßç¿=ê]¯F2¿Ê+ócPLˆ˜ô-O„ë¯ì…‡Øy˜",[õa@ÛÚý3¢Øy4Ÿ ÄîŒ#€7Î  ²ÿÛ7˜µ9Ùꤜ¢ìãÌ·§ëÄëuò ¦–ŠÄ-¬‰Êňžf]‡ÒÑ]¨ÚI\n95egTÃnÍ€C-ÜÉwï~ήÂÓ™WCAIåMMÓ-©ú$7¬ rG4ÇÒò(®T1±qÁ; =¥»ŸÍMÆóϸ—!„¸1®¾ÆWËIZþ)ŸþwN0V]”KrÌ&’cw²{à$^¸7”ú°ÑHäÒ( *Љá#GÑÜ Me1¹¥x´ø·ßÔ,è0æ~n39@±K7Þzç[•²‚Oßÿ•CEFê…ífcV"¶ïfì /0Ì×ì&¦RÜTjûçý®vOÑù:öÄ ¹èOÒ \‡´£_[´€¶Åî]ÀæT=­uÇ©îÆìÍ,ßš‹AUÐ:…2dToüìtT•œ$+ß‹ûˆ©,i3KþÜýTŸë¹ÓëGÍcË/ jBÅ‚}'0¦§všbNì^ÌoËQX|„E߯¢ýÛ£ðºÕf¹j=é?ém:UÕ5ßÔöþô1Ëj@ëËÐç ̺îUtظýCš¿7¤,^µ`¿ýÚ•ÖvÂúF§KãHȨG 9ïÏÆìL²ZZœÈ˜>®·ÄHÅ&A2èf'ä’TJŠŠj{X‚»w£•÷u ,n`yUFÐhþ¦ßÙHúš9¬H*CEÁ&h(wŽŒ ™µ‘‚ÄÍ,œIRY>~ý‰-¡/ÒçZdz_Q¾Ýâ÷!„7ÔÕݱՓl]º•<£ ZOn{ú&´2­û° íü´ä¾4cÕ…ìÛ°‡‚ð~Ø+ÕäD­`ÉŠmÄϦ¸ZµK ‚»ÞÎÈÁq50pâÏWxýÏ ú6ŒŸÔ™Sk×°7!‹Õ ÷Ö½sß:8+›û,ï¬ÈÆXwäêý_ðè]³1íò _< ßþß§ì¨PÑ·}ˆi/õö. Ù{³`ÉfâR 1X¸Ðu8*æóÓÆÃ{«r1j}óÞ»Œð®‹¬Ô’7/aÉú]ħåS©±Â±ykºÇŽ®è ÇYðÒk,K7¢o÷Ó^ì‹­å»fðÌÌT8 ä¥Oï'PÆ´E¼9y>ÉF÷}Êä¶œX=™ SÓb(O<7ÿ†:ú ™¤eT¡Š]Wî˜ØŸÓ£+›µt£ìødæ'Ô@NÇŠT¼ìj[/Õ¹Q¬Y¸œ­ÑIä–ÐÛzЪSFŒî‹¯µj>‘ïý—9kÐ6ΣCTv®ÚÎá´B æÎøwÍÝwvÇót±TËHýk¿­ÜɱìR´­è<¸ •ji>‡)ö^-°?Sö H>=&ZcŽS³–´°?¿Åe ðÈ:/ÙDÔ±L «tX»ùÒ®çpFjƒýeâÆË•ÓGS‹±aþï¬Û›@n™;ŸPút#æ«?9\­#à¾i¼<ȉœK–E-%Ç6±ti$ûãÓ8UfÄÄÖ¿Ž}>º?­l5”ç¡õ¥jËöͤÄhs«®Œ˜8†–™+Y°x q'ò©1u¢eø0îšÐŸF÷®Éßö ºñ@ˆå¥é†|ެ_ÄòMûIÌ*¤Jc…“w Œbh×f˜+Õìõ0³vTÖõÆÉ^ñ:¬´£ÏK³¸¿ù¦>õ5±ÕJm}ñ„kß|žß&\CÂܧ™8WOëgò?%¼øîjNµøŒÿ7GzÖï«Ìdߊ?Y³ý ɹ%Llq÷ïDßQ£éí_o`U6V-dͶXŽgQ­±ÂÉ'˜Î·eH¸¦†Ãüòô;¬­{À…Zʶïc›>ŒÇ¿þc?ã‰O·Q¡Ö¦ç…~vµùsÙ|àʯÃ)®þƒeEÕ¥Õ{¯Vtè=‚á}ü±nèÁMõf×Õ·µéÏ'òÝ{‰Tjóû¶:Wÿ_¾îÆWû«Ñ¸öd\o#û7 9¿S§–´pw ¨­rf1Xt¹‡{mö±hËQò›Màƒ×ã¬4&}§ÏLv/œËÒ­‡È,[ŸNôï¬;s/º¸ÒOdbT­}ﻃîÍk+„f>-±)HäýåÕdŽ&UÑDZö —­/•oO?Œúí'l.TÑzŽäîÀG PÆ®OñÅ®2ÐùsçG¯á»îÙ†ï%-ç—»çœÞ¬8.bã¾£dT€¹n-Cè6t Ú8üëçŸ !Ä­èªê^µô«Q­gºùšžó¹Æ­ #ÆWPª¢XÚS@ ë¦ñþœèzÃM«ÉO?ȶ?}è&¿0ïúS†jñÇ´ƒ¨hÐ`Ä`Ìçľ%|‘oÊ›S†¡5µÄÊÊœ²ÒrjTPôæXšé05× ÍSÉß1›÷¿ØÉ©Ó† Ó‰Yý%±W”ÕZö‡ ŠÑpŠÔ}˘}<Þ}‚pÛzÛ“Yý]ƒ Š=Z P™ÈÒÞgáÑҳǪsHÚ³”/åÔ«/3¤E8]W°<Ã@ñÁX’ !økÁËÁB# Å¹S-´Ø`‹‰ûùmf¬9Q/ð) ëÈ6=HòCSxª·A6,Oϧ&å©5}i«¯ähÔaÊUP bˆN6è§¡"9‘L# q'0ÐŘM̶hrÊ ¿•é#ð÷m ÚÑºâæ¦Cɯ†Â("7&Ò¬¯/VZ@qfÀËß2༯Ԥ¯cæ;?Sxv¸iu^2Qk¾ãð‘lž}}õPã‰åÌž­¢j4hŒF E™Ä­ý’éGÞ½7ŒdGÎ䃢)9½ÃìƒDþxèô¨äí˜Í{³·“[sú`U䟈å¯_s8m¯=Ò Û‹}½1e£¹ªYòÑ{,J,¯Û®’Ü„mÌ?v‰3º ,ª”ÄüÈ;Ÿ¬#£ZEQt˜èUÊóSˆY÷#‡eóì[÷\Mc+>OEƒF5bP Ɉ]Í×oíÀ¼´RUƒ¢1Veq$ò[>­±ãýG:pÙ¸Pc‡½u1…'Ùòã|:¿wÿ¹Ç='‹óØùå¾ÞžKM½²yt'Ë¢‰K‘ÉãZ¢3·ÂÒÊË*1¨ s,Ì,1Ó5EƒÞÜ+óRJ+ªQU­™æz,ôI¼!“ Ó§ðSL!g«´?­Ï>ïI«¯þÏ2õûŸùþ›÷¹#È•ª”½Dç(´û.³¦M¤u]«I×á¦õ5Ÿ>Ô—£¨>ŠßvqÊ ¢è=èöàk¼÷ɇLþOO¿,º°}ÉF2«UëŽügú÷|óÃW¼6¼zE¥:ck÷•ž·;-n½'ñÑw?óíì×ÒB‚Š¡¸Û¾Ï1퇟ùö³géí¦T öïâhM#2Nëà»{â¤CN$?-Œ§¢á“ d÷\~ÞžK :ÞÍ Nç÷ÿË _sµœäeß²ì¸BèCŸ1ëÕ¡¸kœ¼Ä¬/§2!¨²ª¸rÛäÙÌx²3æuçÙjÂG|þÕ<ÕÓ¶ŠR¥pû\æÇbÄïþOòæ'Óy÷ùÑZ+¨Õlüc#ÙF¨9´Š%qE¨hñòŸÿð#_~ú(a¶ ¨Å\µ‘dZ1þý/yoB`Ý5mAø“ŸóÅçÑÉô‚ƒ_A>œ—ù—¹VÔ¢=¬ÝšƒAÕàÔûY>ý3¾ø;ƒLQÔ*26¬bILßžf}É›£}êòÊŽžÏ~Áuù}UõÿuçeºØ5Ž„=ø_Îù™/§=Ag ¨$­XÄÞâsÓ¬u¸´ÌøûÿÃݱ8Ùøô’VóçÎ< ª‚Þ»¼9•ß}ž±!vd´4tý›™¡¨ÕdlüœWžzšw?›ËêGÉ;èÂÕÔ‡ä›;`§ÆTbã QÃñX« èhŽKƒ‰o|9oÜ=*ãÖ±!µU±¦Ã#ÓùìóÏ™5íQ:Ú(¨†“ìZ¹œËw¹ !„¸Î®.(¬©áLSC§kÄ"*'÷nãh… ŠÆM¤w'®žôºïÎÚ9Yj%Ƕï:÷f q¤mPœMsoÚ·s«M°ZH~Á•7æ ɈÉ3 vÝîab¿`¼Ü›Ôgݼ¯$+48µëLƒEkM«¡Ãéd­²ãbÏ=Å‚°&óð¸ÁôЇ`»dvlO£F­Çî߉殮4k?Š‘]РRy$Šør-Þ¸kc:桪ùŒIÃhÝ#ov±œ¯âÈÖ]œ4‚¢kÅÿ §­·+n-#=,3Ô¢X¢“j0 lMKÆ ’’Ë1¤D[`DÑëÑ+Ò££É5䑜\ˆ³€6ԮݣàÐþþûú›üïÞθ^¢˜ùæ¥^fBïVØë òÔ1ö¬™Ç—ï<ߛʟû²9&©9»Øq´»nwqWw?Ü]< ºm½›iA­&5:†üú?¿E]»xb¦(˜ºv ]³Ú§jQ>…F0á`¡Zû»õ˜ÀØð–¸{ú1n8í-¯çóh•Ò¨­D« ˜:öúyàâÞŠw¦•0æÞ`?6†ã+e%>p„*?CKÇxø†1lPÛÚ!ƒ 9¿,:ÙÓýÉiL1“O>|œîÎzP,iTÛ€T«ÉË-8/(´"°sG\M´6­hX×Ö¸Ö7G½‚ξíZêQµ¢ÂòÆ\« V!wrw74ªÌµ?²,±òÂøV-%fëÚ_ÌÐû‡ÐÆÛwß.Œ»§.P ìÞžÔp_/j ±;ã(WA1iÃàq]iéîŠwûÑÜ9´=~~¾47©¤Pm«q¼1}&ŸÌœÁä±X( w ¥Om95æåpêJÁW›—¹V@AQTʲŽq,£˜½ýŸù”OfÌdêÇÓéŠÛ¹Êúÿüòz¹ùuÚ–„uo†¹FÁÔµ £´D ¨å‡‰9ïAŒ¶ùpžzæ^†Þ6€~áÍ(itúŒdÇÆcK:½—î­l ßL#ho¯µ†¤˜ƒ”©Òcc9eEçGx'ç†ÚF—óÆßsÎ¨Š“Iñœ(¬BãØ‡?˜É'3fòñÓ}p¸Õæ– !DpUÃGöìkªÑø2›™S»ÆŸæõÞhÖ‚–žZ¶Õ`ÌÉ ÇÈÙù[çÑhNÏ•3`P¯"(<•[wóÔáíïKƒெÞOg P NQ¨Ö?=ææõú-«²ÉQö¿ª|Ó9´aÐ#m0áq»w±g×vöÊ¢,sK¦%püþ7yf€;jvÙ•üððÆN¯ Ÿ‚‹6¢5œ-&Œ@MþIjWÈ×âáã}n¡¿®c”Œäff× å+gß0ñ‹ ·)8•ŠË…_olÙ(:EÅ)* ±÷Ãש±'q^YD‡… Y­`Õ–ý;‘KaY£z&SÆKö¥ž¹&/øûé4046:S¬i×=„ÇÎdgA*k~X×+Áä‘™S;t]ãàƒÝÙs×7÷Ã[§]eäTV6•´º~×øùŒydŸ¬©û ðŽölZ—GåÑhâ+üÉŽÍÄ€‚Þ?‚Ž«C[ÎÕ\V7òžc1„áA±Ì?\Dʺ™¼±^…KsÚu¢kß¾tjny^Ç!„âê‚B;'´ ©ãÉòŒœ»j¤šÏ‘M;I®PQÌšÖ;õt HQê5Œ¯<¾»v¾{7F 5løªFÙ b錷‹Õ…7@­V@ëMX„KSS¨Jˆ&ꀖ£U*h½ ÷¾x­jÀX—©ŠÖ—fN\8=K‡‹¨ƒФäR˜¸›¿”tŒÚu„ñ:víJ`ÿ'NVª ñ&(ÐöŠâ(µ$‹ãYÅU3§fxÙ{ÒÏ›~c¸;y%Ÿ½?—Øâ"b.%®çÿl0Ô=dP0sðÂÍöÂ"ªq°mxxðÅÒP¯|i4Ê «b0Ôk(zlݽ°¿ *Q0s0k0 WR6Î ­¼–r¬–qèç·ødM:Õ˜âFŸè ²i["e7áºTl#¸sB'}¹‡¢ãËø-ßô¼€él¢”óWŒTg뙿‘¢\zåJcv$³^ÿŽ˜bÐZ7#´G7Ü,¤í^GtöÕögÞ |P, š0…B·¹i'Ñ’–ŸAü® âw¯#²×S¼úpWúÖ›Qÿ«†š³×Óå¶½šô)šó¶mCɹ”AcáBsO{Z† ¢eØ Æfá'±<¡‚“;ç³vP£¯[}¨Ç¿s‘«9Yzˆ˜ýÈI1€¢Ç?¢éá¼T9¿’{ŽI Oþˆ ‘lضC )œÌ>ÆþuÇ8°a í|ƒÿöv•ÀP!þfWZÜBGt|5Æ´=ì91¯ægweÌÙÆ‚%¡t÷Сw0Îî.h) ÆÉñä2pµ¬Ý¸"•äŒÚÛžÆÅ \lÆÕµÒ:¹b¯,C 'Ž%RÕ;ôª{ê·¹Ô²TRj×±GãèŒý%îfŠ™3.6È3¢Xväž×'X/ÕUUèLLên¾ áx/L!¹<Žå‹5”© õ'ìRïnÐØâìd†’PŠŠÝ}›ÞõBÈê*ªõ&g>­0_“KYò&6 `B¨Ÿ Íó‚0ݵ#›¶QcKnWv«6_ΧDR¨*Øõy>ç æÍ{ÞâwbcªQK³È*Rië䊳R  ËOFpv„§ª*01Ñ‚šOB#Ó wtÆN\Õ@FJ5=j ¾ª^ÉDÒFÐàèêŒVɈ¯ÏòÂdz )µŠªLô€1ý‚o7ºl¨%lsÒ¡¤Pó‘”§Òª1ãÖÎWÅúMT« ¦mïåÕ—jW 6ý…}ÛoNP ÝïcÜŽ#|UL~~Õ¹kqsÑ¡œ0`ÌK"¹PÅ·®E[“šDZmwn®7®—°.®NuéÈO#«\¥¥•ÉÝ¿ŒMñe¨zº §ú¯Õ,VAãJÿ§ßâî P‹ÙœyõAá ʇª¼$Že–¢*Íéû`Æ™(KfÙ·Ÿ³2¾Œœ­«Ø5¦·]Ñ«´WTÿ_‹³õ²Œ¤TªU@1ÇÑÙêᕤOƒÑÉ  Y¤¦U€k]øcT¹l,^y?Þùœ½•µ+¾þÁ´¨«šµ6tëàÁÊ„$ †“deU£mÖÈú•ìËZïAGǵ¬É- êÏU”V«(ú@":9\Bñoqu·`Å…îƒ#°S@5¤²|Ú§,Ø´C‡ãˆÚ²˜¯¦-äXµ Š%mzwÆIQpîÔ?SÔRöÍÿ‘‡O™v˜¿~šÇžbS|»†_s£àR´Í:ÒÞ¥nŒ­sùiã!N¤'¹ˆ-©W2€ËHö¶E¬N!+=žÍ¿,$º¢ö…Íž!íp¾T{IëG—nîh0æ®çÛ/–²?1ƒ¬ôD¢×}Ç{Ͼμآ3±ŠÆ=œ°æZPKÉÎ.F¥v®¡Ç%óÉŒ6=Âkçe’YþÙ׬I&++„=˘ýêÿøxqâ™E^Lü[ã«WPkª©6‚u»øé,Ûv$Àª«kWc´æì4F•üè?øüÝw˜1wwíâ7 Ðùu"Ô¾öµ…[à‹“̉äxö¯žÃÊõ³S \m4ž]èêgŠ‚JÉ®9|öÇÒ³È:Ëæ¹ðÒ䝨weƒí´>!´±ÓFrþšÇŸ»I?ÏŽß³¯ôzF> v{ÐÖ²vÒ¡3˜û×!Ò²2I=¼EÓ^dòŒõd\ì©GcˆbIëN­kª>ÊŠo²?1´£»X²2†FMáTC%•u¿›±4—ì‚ *ò“ر)šS7% ¬£8Ñcâ8‚š»¦XÑ®k(– ¨Õ‡XöýrbR2ÉHØÁü_6’cEëAx—ÚùdŠ^ *…I1N:NfÑuXÅB±¢mç6˜+ VƲü÷­$¤gµœŸ¿ŸÏ²eËXµ?UªÊº¹‘jùY¹”U–»Žç/èuµs1Q+8MRr:ù •—+̇Æ2&­ä³÷ßãÃ÷Þã»õ)”«Z, ®íB©]G©˜½Ìe[ü Òíaé[/¿@Šy0ÛÔ¾nűš¯g/aGÜ1RSsd×b~[ŸR74Õýõ­u~„urBƒ‘SY9Tªus í.qÃjt9oü='{ó×|üÞ{|øÞ,–-Æ 1ÇÅ7o›Óc™Õëû¬N!D£\å뀬:ÝÇc#s˜±ø(¥¹ûYöõ~–³‰ î½fbº§.ý¸ïμÿS,Å™[ùáí­çî¯õx&öwCs#—‡Ðû1ä®î쾙ܪ4¶|ó6[®jG*†Ü=ÌûpóÎüMAëÒ‹±¼.iëñù(#ã?`a|)9{æ1}ÏÙ½ è(Þ‘ÀÐ6kß­¥q',‡EÇk_»¡õ!<Ìý2ÇP0™Àƒ·%2cM*•'6óÓ›ÏùÜ”Ý$ò%Ь®ç·¹†˜(–´îXÛ»`B{=1qU¨Š þ­ýëØ€1“m,fW¢ŽäãÞ¹#ãz%…yw>1’Ìé‹I(ÎáÀ¢/9°è¼Ôjí 7’¶¦îôèn¿;‡è‚|.šÉÁzÛ+;¶ÇåÖó Š®i†Ž eï7û).gÅôWY èÑëj»®Å®÷>CÚ—ÛÈ)I`íWo³¶þç–[‰Ê샇WCßn|Ù°ë:ž›Ž0?¾ŒÂ¸?˜÷Ç•§Õ:”n¡6Äí)¤:i ï=±ä‚mªªnT¿ý¥i\ûrߘ¼ñËáóV¨U°Ž¸‡{÷ãë]yœÚÿ+S÷×›½¤˜ÓbØC kY[>4ξ´°Ó”g¤âð|ôêBÍӡךBÛ®w3~û1~Š)$-ò ÞŽ¬÷©ÞƒÞw ÀS£¥ºs7<×/áDu>»¿yŽÝßœ¿¯jª«½‚EK?Ü´Ñœ0H]ó o®÷gÂÔ7éßÀñ¯$ˬÃƶ‹cNt!qs'óä";¬”R J«P-Ž~/TW]ÿ_õ¨–‘´ú3Þ^]×–ŒMK.± nãÓø d\÷ÍÌÚ|’Ê”H¾šRûÃ+z=:…K‡UìéúŸGI<ù9‘)å¤oÿÙÛÏßFk· òÓ‚ÒÈú°—S#2H‡oD8Îk–“m":\f(pc˹‚ÒÈ{NÀлˆØó;O&²ì­ÇYkc¾¢ˆ’JŠbC뽸èjB!n˜«G¬bMà¸Wx+p=+Wo'61ƒüÒj4ö¸ùÓ©ï†{×[”@×ÀgyݹîåÀÉ9×è°rö¡M·!ŒÜ·«]S ñ‰Æ¦ãƒ¼ô?g~_¸±öåõ–ž´íÝÛóˆL1и•G´¸÷@·òlˆJ¡kÜ[÷bÔÝ£ ±ª}‘ð%™ù1â¥wi¶zk·Çr<«J̰ó  c¿‘Œèãõ™dhp ëŒÏ‚$ŽÕ€¶E83„S±¦Í½oð†ß –EîäPr.%U æŽÍî<ˆ#ºâ}úfg]Ð&db4¦}pÝŠm;ú¢;x˜j­Aõ†`iœiÓ¥-3SãÓ…P‹ÝÅ,ƒÆ1ù£P¶¯dWô’3OQZ¦6.4 hO×Cè`w¦GCï9€ÿ¾ãNä’Ul;p”Ìür &6¸ùµ§çð1ôo퀢æ_>ÎÐàÜëI^Ræ3oùN²KÑ9ÐyÄ0\¶Me^Üõ |48vyœ7œƒX¾l#ûãÓÈ+©FkåB‹vÝ4f\µ\te‘Æ– }s?÷ ócÍ®£ä”ëpðëÌmÁü±p*(—›o¨ØÓå±WPœç±l{íK¸­<‚è2ÀŸÜù°¯ÄH~j*%jËë˜?¥Å}À ßù Î[…TãD—'ÞÆÎÿO–oŽ"1³€*ÅÇfA„Ý6ša]›­wô­ûä]”ý²Š)Íq°¾ôÀÆ'ѾO¿‰íŠ?X½í )'‹1èíð£ïÈÑôö·FLüÇñü æüþG$’ò¨6q yh_ºZîdîÚ †tRÓjè CÛ|ÿ÷Ÿ<~^¼›¤SUè±¹Ø{›WgiÝéûÌì–ÿÁêíq$çQ¤1áY0!=‡0ü¶6\ªcéâþ†ú_ˆûņÿy•'ì~fñæCd–(صcà¸V$|ò-»~—ÊŠ}Gî{ë#:mZÇ_{¢IHɦ ¬­¹®Íƒiß{0ƒºúœ&Ú¨ú°‘?²Ö7‚Ž®«X™i@1mMD‡FÌod9oô=Ǭ3¼i…ÏŸËØuŒì¢" ¦6x´nK—ÛG3¨ƒÌ'Bˆ›A)­¬jb#5Œ”•bac}öÆSÅwÏ|Ä_*Z÷á¼öÑZ6Њ0$Îãå7—’iÐâ9êmÞ×⊆f q=©…+6ؘžn֩䬜ÂK¿ÄS£˜ÐþÑ/xº‡¥¼Zü‹•²mêc|µ¿ôa<þõÿè|C'“ !„ÿNWßSøeÈZÇgSÖ`5ä^FvóÇÎÅE¿²£î=vvmÚà)‘ž¸Õ©¥œ7…¯RÛsç]içaBñ± ü²ì(5€bâGë@ …B!Äe5± Ð@ÊæHŽeRóëGì>çEJ z÷^Ü3ªÍ]µPˆë@-ŽbÃŽ, KVòÕ+ÏùLQ¬ {/½/¹â‘B!„µšXP¨¥åØWxÙy%k·îãHݼÃú1dhWš5´â¡·Ŧÿ7Šߕؓ@ú©2 ÜýBézûú·qlj·B!„¸JMpN¡B!„BˆÓd‘/!„B!„hÂ$(B!„Bˆ&쪦—^ït!„B!„¸¬­-/ù¹Ì)B!„Bˆ&L† !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D&A¡B!„B4a !„B!D¦»Q;.¬2r àm¦`«\ù÷+óËi–PC  Vz ]LxÙSO§ë”jCy%=Ö0¢µ%/š_Ÿ}^oªªRlµîÿz­‚ÅUä§øwò „B!®·ëÞSXUYˇKñ‰*%"¶„±•l¬¹Êi´L ¶d[K–´ÐÓ¼´’!G®aÿ0ÆÊjÆF•à±ÿì?—}%ôO©!Áxû«®føÞbzf1\vk•_–à›\CÕU}~m*óËqÝ]ŒeÝ?Û½%ÿÏÞ}GWQ¼ ÿîî½¹%=„ÐB/¡×„âK ""ŠPÄÞ+**Š¢(V¬Ø~‚`QQPÁB „^CH¤'·îîûÇ  €€%ÏçÎáÜm³3³›yvfgi±ÉÍÛùgpê'ðæ»©—ââóU]2˜´¥è˜úPk³—=e¬¹?ßËÍ› ©™R@ÔÊBºnõò£§d¡îgPJ!·åžÏ´ÿ=t—‡Î)E¼ì:ûûÞ‘QLÕu^Öšå¯+„BñOvvƒBCçù-.Þ+0ð) í¢mÌlj£Ç÷ì)T³«4r¨$F1®±ƒ› íÓñ”¿ñ¿žß«³ÖN‡…{b-4TÁ4L–dºè»ÝÇ–ÓŒŽöæøYlºC>6Ÿã†¬'×Mßý•NÕÕ4˜å-‚YØÄÎÝA:Ïmsó¥ï¬%óŒ˜~R y¨à|Yep;mÞsÝ÷qeé.ôrå¡v¦%³°‘+ñ24µòˆn†Á¼‚ÊÛ5ã7Ì‚Àã­Êö²Åaáõ:;UB,ÚT@•m~ÎÁÈÄ2{¼ÙÍL¯B»˜ ®,ÕcXZ¢`úLÒK—EctcÏ„ݦ°ØË ‰M)¤îz ÑLÝ`Ò.-Wµ¢ˆŽ[¼Ì.éž/ÌqQk¥‹Jöoúý\¿¢a9‡·Ô†»ü'ôè†ísÛ.ÍVÒ73¤få{¶!–øµ.ž(UŽ…Å>îÙTHõ”¢WquºŸôRÑäÞ<ƒ×¶­±¦˜»èe^ß9‡\ÔXéfv©|Y“^DÕ^¶šœò@n¡—¡ë‹ˆN)¤ñF7ŠÿY¶B!Ä™:«Aa¨]%®¤ÅéÊqÓ{‡—Inz¬-ft¾ÉÙè4T'&…z Ðy=[åž:6® Qiláé|9>~?ÜðS4n޳¯AˆÍ³qù9>~=> 1uþ—¡S¯šÑQ ì*}kÚy,Ø`ü?«ÆÕ!ðkN ¸õú™oh\©–Ù0?EÁ¡@¡ËÏÛ~6•@U40Ü’íc½C£Ÿ]¡O”Æþl?É¥¶),ðr]šŸªÕìüÞÜÁ˜Pß Í //•j®nBFC ᪅‰mCù!ZAñûy<ÕÍ,Íʤf!,ªD\¾›+vù9X¼ÐuƒÙ{½üfѸ¶dæ¢ýÝ ÜgÒ=ÞÉšVN>­“w¸™ì0™µÇÍ‹n7š†ÒÄNG·—Ái~²Ûwv¾‡»tZ×vòJ¸ŠrЇ 1Nö·±Ó[U¸¥qûê[8sé./×¥z˜çSHªá`F›8­¹ækDÃÇ ›\<›åg‹@!>X£EÐá•Mædé$Ôpòg‚a'wûØ €Á×;]gó·‚Õi¡¿½ìÞ ÒÊ Mƒo²MšDZi @µH ü>¾)<Ú³ó[–ŒoU³Ð®Ò3ÖÎð0¥‚Ë¥*Þ*°ª`Uà@Ž)ºÆ˜:Ats(4³òf¼²½L9Ù ¢†Ÿ{W•R@ÔŠ"®=`Ч–¾%yfcfS;OD¨Ô Rék¥“i°ÚX¾Óc¬ÑÝ©P?ØÂèzvžŽTŽ™d§¸ØËàm>«;ø8:Ðyʇ Ø”À…£© ¶ó4ó§¤q±S¥[MÓkhDV›…û¢5BŽ[×b·2¥¹ƒ'BL¦¤¹h»ºˆÿÛîå×cê¼ÂeµìÜ®ÒÈiᡪŠË ÕÝåã\“›âm U©ç´p_;ù|¼›c‚ÕB/',.4Ð1Yœ«S/ÊBX¾NŠ ºKg©®Ñ+ä$™£Zx >ˆÞÁ*u­&¿fúØnãÝX Íl*]cìÜå4˜–mà7 vø !L£­M¡yDïÖ·qÀä—L/ÛC‚_ÝB ›J‡*6ÞŽQø=ÓÇêãžY(á&¿ä‚WÝãç'·JÿHÊyÀ”•ãcÏÕ¶rC¥M„WªigåA—B!Äßí¬„4ó=\±ÍË]¡(6ˆçl:SrtÒLhjåášA\}6"B ­Ø Ð¢Ñ@+yIµ0º©K´Òk)D[÷‰Û›‚‚“µåOõ{•+=v{ø!_§Zt©¦}ÆgRªÆˆú6Ö¥zøÙwê÷¯ÒsÜôÛ¥ðG=Ë ÃY}Å>¦»UE–¼V ýƒ=¼”­3&ÌB°i²Å µÃÔcÎÇr$&,gyl)ÒÑ6KÕ¸à` mp³Öe>1P5F6±ÓÏHÃöÆï÷rÕFOš9¸ª$ýõh© ˜&^Àë2HU4†]®X5º8àÃb?ÝÃUFåëdUS˜›¯ri+9Û<Ì+²Ñ°Ø`§Sã‚SDL¶Ruk}±Av±›ú¥fCÕ “p‡a±p_5CvÓõÆEáúEYjLƒõÅP?J#¶Ô¾Â4Â2t6êÐ꘣*ôŠÒð¥ùYfXˆÏó³Éi¡Ÿ ü9§.ónÓDÛRõW“O!„â?â/…‡ò=\¹ÕËš’wüRx©[?˜ä:ÊYo;›~?ãèÔŠ²Ñ^«M¥.>¶úîqíÕ*ÔBŽ|*Á(Meꤩ ‚ ô·‹J +,)2ÐÃ÷š$˜„9Uj(ž†«ÃLÚï!ʧ2<âÜ =Ìé â‹Æ0¸á·A¶ 1Ç%jÅ!?Û ƒ1 x©ä7Ó±ŸßjY¸¬¤ ”rΦ¼åqü”2~+½´š]¥QI-mä°³+·ˆ×ê<bag†‹ë(¼ÜÀÁ÷Á*ÝÏ UGŸT´³(Ô`ažŸùù~Þè!.ÎÁŒê%=<¦5ØÊEÅ~O÷“o!” énlàdlØÑ´–•þ²„†Yémº™]dÒ Ç M”•Ú”Ü NQæ+x.B!„ÿF)nË)ð­%dEQ¸´¶“ñQg/ Ìòlw$çzy`‹›/µ ÆU×°š3ˆ{Âàó]nþ—o°Û£3}‹v[½l;22Rç­tKÜ&[ó½ ßç'*ÊJ/í¸)·TÓØšáæùƒ4ÁÜ}n^.V¹3æð{c ½«h˜…:ûB¬\|žÆŽC½­'oìÙ,¼W?ˆ&ǯ`è|“cÒ¶ºƒäæÁ,-ù—ÜÔFÓÏ×y&( í°»H?æý>ßá<,oy4 ÖЊu–— ¨Š‹ü¬F¥Åi¼”gBÉ»b&)Žp+ƒ‚UZ|ô¼?O÷0˯ҭJÏÕu0·¦ÊªLɇӭZx¼žÿÕµ g¹y2/0qHàaƒÎV¿B}›ZòO!Ö¢pxÄì¹y`òmš‹n[=ÌÊöЯ$ ìïäù „€i2eW1×íÓé(WT¨¦€Û(r” §FcÓ`I©Y£L¿Î’bHpªX‹S£›ªóñ^?þ0 -…޲r½|Y¨Ð-´ô0ìSPÚ`¯KÇv$¯UêX Úª »ý¼˜îc‡Uc@Lo7vòv¸ÉÄ:EŠBs'l+ÐÉ*µËÔ<›FBY Ð4DÀO<Ì(Ö¸22p¯*¯Ìë94Ôb½äáW€_f™B!ÄÄÇn¹^lõr$ T¹8ÞÉäXõìM¼aø¹¡ˆV늹r—ŸýÁ6~lb£ç‘þM…!õ¼oo+¦Å:Ïi¼T7ˆ‡ÛЊJ¢ÅÏ#›Šè¸ÅÇöŸ× ô¯a¬oâ~K+¦õÚbîÍ;:xÄytÐ0+½, Ý£,T9[çY‡ËÊ ƒlÞoâàú2†`º }üàS¹:ÚBc»J£ÃÿB¬ ƒy‡t²Qè^ÕJµdøYãÒ™—áæÕü#Qa9ËO¤ª ¡,ÊÓÙæ‡˜H+×k~žÚåc±Ûd{¡ái~ü‘A\wŠ¡ÅYƒíƒm.YûܼUGhXQ¨o‡Üïæé¬,ð3j›—¸ @Q8”ïã‘4sŠMö¸ufå¨6•Z¥öo"ÂmŒQ˜²Ó;ò6(ªB¨ëóü¬ö˜gµãÐÄ$;ß˵ۼ¬5®ªëdRÌi\SŠÊj\Ýܸ×ÏoE©E~&îö2ÕÐèQ~°¦Ù­Üw{˜Vd²Ûíçý]n~²X¹'²¤¿XÕè ‹ àÿ"U‚€àP ]=~æ=ƒË9ÈÑsI¬•ø"/·§ûYë1ÙœïåÖÅ<–g¢h&«xxd¯Ÿ“E~æCœ]Á†Â…±AÔ/ôpß~?›½&«³=ÜŸiÒ5ÖJë2ãh…ÿ‹²Pœíc™ÓBß ’s.§Ì£#¬ôUtžNóñg±AJއáÇÏà+„BñïtFÃGu·![=¤†Ø˜äã–,èYÛÁg§Óx-‡-ÒAfÇò×S,7×qps“®Aç8ãk¸DsØXÜÞvìºÕüVíäÇÓ½:Ûи'ül ¦<=NgŸ7†R=Ì-Jd³ðA×–X™üqH';ÄJ¿–+\¥Á./?ù-  bJ¼É={ÝtOWhaa@¸Â—%k—³üxÖ+‡ûµÝŦÚÁÌŒ±0¶±çÒ<\¿ÞM¡ª’XÅÆ÷5-'/Óð3rƒŸ‘z¡£íW×u2*"÷‰ÕŒöº·µ˜±šFßjVî1}ìó›ŠÊ= ìäîòpÏ&/M•¡V>¨g¥¡rÌÈa@¡KM;¸xh—v ­ ©çÀ—îåÍmÅilãíè:]Â5‚óá’Ãïj—†*ÌU,$žÆã&g¨ï(<¾×Mïý&¦E£OœÑá *VÆ70¾ÇÍe&>M¥C”ÏJ†[ƒƒøº<ºÇM·t5Hãò^Ž ô–uªÁ¡úXü슲WêœOYæV ãqß./Wn4‰rZ¸3JcI~B!„ø—QŠ<ÞÓå/ò’¸ÑCª AªÊµL‰Uq–¿éyåÍwÓd‹ÉèÖ†üÕ·' ƒ-Åߤ{øÔf#¥®…°ò·:'Š‹½Ü˜êajaüIBñïcð¿ÍE¤— \rØ»ñO¾Ý´šÔ›žã‘Þqhç#Éz>»×,eÉ’¥,_™J–ËÀ,M;Ÿr3óÀ2–oó£TéHdžç& 0r7òëwß’®«Ä^Ö’^-¢Ð­no ÈåÝV]Ò•ª €IÁ²YÌO÷b¢Öôú_Øœªvס}dØZ”¬w®è¤'ÏwÉ>°¶¡jïÎÔR€²ëø·3)\ý'«òMP4âþï6néÓˆ°ÐÈósí !„BœÒ2=ÛÜH^™ A­Hl‚‚½Nß×ãè:f>˾œDò!ÔHZ_{×tŒÅ»cŸ~4]ž6Ìø‰Ôî7sŽ:ߎ¡§Ïãƒqß’®ŸÎV™Ë“ÙáWˆîDƒóΨUhuå´:.]Yû3ð›€V  æÂúÿ„æyõ@ü˜æç£›€FB×.4ª%·U!„Bü»œQëÅØ3QO~MÚI‚Åy¾7m¬>¬žÍŒÙ‹X¿3“Ÿ•Иº$t¾”þ}ÚkÐÙóíS<ómºµ9×[ M.¸Œ:¾“oáÞ°„Õù`kÓ‰6a  ³å³‡xñ§, ­W½8†+bRY¹¶k“+¹©o+¢ öZ.]ú,÷`d’Yl’~ên-}ûž|ööëVš_w-3ç±`å6+„TOà‚k†Ñ§êFfLMrê>òõ`bšt¡ÿ×TR`V"j·¦nËÖ´i©²ô‰,+2Oy\Œ R’w «±´KªåLʰ`;Ìøž)©ìËqcÚ#¨Þ¨ݯ¸‚î ÂPð‘òÎm¼³ÄSÒ›j9û†ýAïpSüŸ¼vßG¬ó)Ø:=Ä{ÊyçžXs¸|ôýÌ~z³µ:\õâh:¬ÅSÓv¢«U¹è©7Ò´$XôìgÅìo™»x»² у‰kØžžW {ð#³1é9ëùyúl®ÞFF® œQÔlœÈ…úÓ¥N0æñ×…oß>ˆ‰M‡òêÈÞúü¸zPK­`>f¿¾x?“6øÑâûqçe&KZ̦ô\{Mwâe×gϪxôµßÉ3"{àµ[Z¸}¬eâƒcYc¢DöâÑq·Ò<èÄíý‡Öñóô™ü¹z ¼¨!1ÔkÝ˯¾”fQG T(¯}ɼ{ë›,ó©Téu;ƒ#ÖðãŸëÙíÆUŸv— aÐ…õqú—óþãXâ.¹VÌ~s¿*ú9L† !„â_✴Z”àP‚U?û~~ƒ—&­!Ï8døÈÙ»EßldÍÆ!<ñXj•îeòoä›76`¢¢b 9ìY1ƒñ96ž}®?55À³ƾÄô-EG‡^ú°cù|°q Ù#Ÿä²x+¸SùúÅ—˜æÅŠ3"¥0›=kç3uÃZÒî͉‘'à·ó;Þxù¶nôyö²æÇY{Ò3/fÝ’5b§mRBO¶cK.>’ž(¨á5‰<Áºq¹Œ@ÚɰŸÎ8G?¾ÇTTÅÀ0LrÒV0ó­íünÍ#¿8ð»nä²oÍ|øºJ•—ÑÐ Zí+xlÌ%»YŪ LÂbì[Jò.µZ"‰u5 Ô‚ ”¡Y°†/žÇÏéžRe˜ÅÎ?²kí*v=8Š›Ú8±8BW±ÝTPƒ8íÁØ-eäbÅŠ£¨·×ÀT4lN'VK0A'ë,Ô÷3ÿÍ瘼6£Uô»WÏeÒ†õìþƒ[Cö>õ^`¸¯¢b Ò0 ³Ø‘2‹7l&{ä3ôµá Å^\ˆÛg‚bÁìÀî:i«X>„³½±gï¿obª*ªa çïgý¼xS­Â˜šRFÌtâq+p>ýê–º0MgNd“¢¢ª&†žÍî3yç!sÃKçéN~þl'ŠªÊ?/õó>fW†Á¨Çz•9É­YgÚFüÁ‚“¼5«ØîoI ø·¯f}ž ¨TéЙÆeœœ™³”Ÿ{—¥K ÅÎÝËÆß¾$uÝNî}/‰‘ÊäµIö‚xÇ4Q5C×ñØÌŸ¾†?âUîhmÁ‚Ó,ÆåÑ1«=›õ$õS!„âêŒæ`T«_Â#ãÞæõ·Jþ½6œ‹jZQÅR o@C ̬Lž²†<¬q0ìé×xõÕg¹¥[ ¬˜nœÆä_21ŽÙ»…š>Âk>cÂÇ/qmS &Þ´Ö0ݳ>fÆÖ"L%˜F—?ÂóãÞä…G¯"!TÁ,JeÆW É1Á³þgæïö`*¡´½ýMÞ}ï=ÞyãNÚ…)˜úA’\Ä£ÌS3eÓg³Ãm‚AóñÂë¯òÔí=©u’Þ³h-ËÖ‚³[‡œ|6E-’ZMhÒ´)ª‡–¬gR´þ;ælòc*1»‘` üîÉ?HVVV©É)<±»2¨îe<úîD&L|—û{Ä¢¦7Oõ+yâýILød·uŒ@ÁDÏXFÊ®Ó/ZŠÎÞädÒu¸Ž‰Ô>!à*¯ =lþö~I”M“+‡óüoòÂð«IS0}ûù}Â4Ö¹¬´¾õ]ÞÙ—8@!º÷Þùà5®ozb”§wæî÷ÞçÑÞÑz˜G¸¿Ô¿xá»Ç6ÄQ©Úª3M#­(Ö(Z¶m€UШӵÃ4[ -[Ôt›ùäæ,".‡¾‡eÉ{ѵštH¬uâ„å•¡o3‹“bZ­‹¹a@;â«ÅR»í• ½´.`d/gɦs<ƒ£YȺ¥ëq™ 5§ÏÀÎÔ‹‹¥V›\×· Ô'>ÈCž©QýÒ¼úÖÛ¼þæhnh†Fxó6Ô R“⃇(.gÄí Î4œMéÜ©vEÁÛ––µõÑÌÏ¡bEz&ç£RµeM£¬(Z(úö£}h`xtæúuÇ=\ ¡Ib;bm Š#ž^ý/8LmZ·›²ãV+ ;u$ZŒ,Ö®Þƒ®ïe͚耛Hbƒ2®;ï&–­È \§õ/b@Ï&T­AÂѹ"©õÔ%ÌŸ‡Ç{fym©ŸÄÿÕ EÃBd«¶Ô³òÇ—›ƒëtË[!„âê/5ÉIžÀGs÷â3B[áŽ~uK†¯édí4èPã¨ô=?ìu©WCcq¾ãÀ>y’#¨jIÔfêè¦ 'ð‹¢ IDATÞLö 4+õ½ß3ê†ïOÜÈŸCN‰­ÅeôkºŽi›òIûùmFýbÅOã–íéܳ'íãƒO›…‡Èñ˜€‚­vbJ­¨”ï™…¬^²7!$ujÁI^*“wÏϼ7ö3ÖåƒÞ†! ¢Ùi•'PÕ#ç¦óó‘7ä0Î4&ܵ”eûu´Ú‰t¬Y~ÈñehægYT’·ñu©vd*Ñõê¢ì Ïtq`.&±g–ÈŠ0‘yÐ ¨‘5¨v¤Ð4ê]þ(Ï\^jÝÐpÔ=¿ðãO‹Y»}ÙÅøtóÈ0DÓ08Ýì<­|hs²A¡*G³W¯p‚þêùX㨭B¾Ž™›MžyŠk¸ZMb4È0Lråœt¿–i;—Ùûuö¯^ÅþÎkÒu@#.©ñeT5³àYÅ%yw´GV£Ç½ÏqxZóÐÜŠçu‹“´ŠZ²ÿ3)o!„Bˆª¿ú÷Îå£ K8d€Ý•awô$¶TÃÍ4Kš˜Š‚ªóVÔÑ÷·N“imø*ÁÑÔŠ 91°Óª¢AuéóÄ+4]ú+ó­`ãÖ4fncåÏÛX5.mnÅýÝcËí.UµÜk›+IÞà†Ð®$6wVø|<{æñÞØI¬É1QÂZpÝã÷Ó£zéArÁt>™.'ÙþL€ž9ÉË8`hÄ'&– ë<]G _U•ãòÖäïè€QNYÆ&¹Éðü»‹9¤ƒ£F+“j¦e²fÞrÒ}gšâ¿+ÎÆùøñW´òéþ£õôT’V‡NIÕ™óÝŒ=+Yð‹ÆÐjÒ1©v¹Ÿx(¯ û§Ô9!„BˆŠ3 Ý[ùnüT6š(ÖÚ\|×0Ú3S¦Ft\ ¹øõýìÜU ±Á%Ûîf×¾@3Q©NŒ §˜ÐóŠ=š˜0(ÁíòÌPš”zÇÏçõb BA'/mé&Jt?:»éâÀ¦Ÿ™üîTÖæå°æ§?ØsÁÀ2{ ”ªDÚð›¸ÒÓÈ2Z ÌZ&ù+–²Éa‰I$8*v.ž´9¼3ö3Öå™(á­4âA.Šÿ;>YüÛX¾<C«ObÇjg4þX «F¬Sas¾‰k×N2Œ6ÔT ²vì"Сã &.¢Ü`ü/Q«[Õ‚²GÇÈI'ÃeR/D ¤cåL~K-Æ´Ö¡Kÿ†l˜—L¶n¢„uá¶gï¡}°¾•ä.XNú©*ï)¢Óˇâ³wÞæ!–Áù”®÷fñnÒ2gÔ*ÑDž¢"øöìdŸ@%²jÉ{ƒe®©Q3)‰š?ì!MßÎü_ SA«Ó‰Äe@ !º$Ýû÷‘c¶&ZÌ\6Λ˺l­ZGúvý‡Ô9!„Bˆ 3{§ÐÌcÕgïòã.¦D­‹®§GŒ‹œìl²³³ÉÎÉÇm(D·ïD›f+¦}Ê‚M{ØŸ¾‰ß'Oay Šú;34³\Z:u‰CSÀÈú…ÿÿ•Û÷‘±w;k~þ„y†)ëò1Ì?>âÕ_äåßaÖ–tÕALý¦Ô ;<Þ®¤‡À»‡?'¾Ê‹/ç§Ã3š5¦u3g`Zþsùbæ*víMcÓ‚Ïùq£ÿ¸üÈeåÒMx‰ uR3ì8 OÚ¼=ö3ÖåÜ€¾w¥}hQ ÿ²³ÉÎÎ!ÏuþûËãÛº””,Ký$Ú•5dEX›”XÐwÏaò×ËÙ¹o?»VLgòO;Ñ5ªšdÅj-’l’·c-›vìdþY¼§„Ð"©9LÏ:f}µ­{÷±kõ,>›0™3gòÓÊý˜xðxJêŠ? ð$uþïl9áµG«Õ,ô½l\¹•]{á.+8<Í|8kÌÓ9ŸÃ 2}Ǽ5idìMåϧ³Æø`{V-Ø‘ýç±ò‡ïIÙ¾ýÛ—0í«E䚀EËÖ§îñSkt"©Ž†bšèz`ÙzIITS9ÉuÚ”Äv<Ü6—¯Ù@úþÝlüås&}1ƒÙ3g±x·Ëß•×B!„ÿgÔS¨ošÎ¤ß>ØŒ—ݳ_æÑÙ¥÷Ú˜A¯â’˜^ÜxÝ*^š¼Ž‚ý ™øüÂR+)„4»†¡VC=­AVê÷¿“þ©c™žZÄåSxsù”R»µP°d+}›·£aßA$.—¥·3sôÝÌ ÅêΧУ£(a4»¸µ5ðoø‰©¿¬¤ÀTØ®5ã‚G»¢„Òa@?~]7•-®Ö~õ k¿«EEáèô÷fv É©^ˆèJbE•Fó'La}žØGÑV~xù!~8f%jýžã¥ëê—;lîüñ±uér™%u868-v®Fo2o›g¼Á¨G—*Ö8º H‹’W5º>u#Tv2poú†WFΠõïó`ë¿z> ásÍâmL^›Gú¯ãyþ×Òé¨N÷k{SÌ֥3wnÂ]¼ž©OÝÁÔãwåóàÀBí†õ Z´q€EŽbIµËùêµ-ÎæøF5Žö>ŸÃLô¬åLyy9G¯6-¦W÷®yÜÓ%“¼ ßòöÓß–úM!¼Ý@.mrâü¡Ç¦­í;5`úŽT_õhHbÇÀ¿¹¬ëÔA‹«‡’¸î–<ÀÒ‰/°´túªtd`ß&XP*ž×¶ „Bñqf¯/.ªà`6+5/~„g¢K>^¿ë~ !ÑuhÞå2®èÓŽjå´ËdoÀ#ÆP{ÎwÌ[¼Žyx°Q£1ízõçŠ ßŒLâögC¨óíLþ\½Ìü|t[Õ›µ Ó¥¸¤mà}B¥N{:ÕYÁïBh›ÔäÈ$1–Ú—óàˆ ¾š:‡Ûá³W£i·«énùžw¾;< ¿ÉÁ”%lõ)DµO*ó;j'Òñûÿ…ï1y7‘¼"Óš@bûªi˜Ö†ŸyšøïK>$žíG$qÚÓãŠ+éÞ0ìèþ­Í¸úÞAþ«Òr1ìUˆ -ÿ=Ï ÑâèùೄÏþ†9‹6v°ÝAõÆèÙÝ>wÉÃŒ°LeÚÜålË,B ¯MóÿëE\êdfmò¢ïßÍ^ÄÚªö¸•Û2&ðÍÂMd¹,„UÀ®Pæ5sZùP!>/0)S™KP…ϧêÑŒ"®çõtq-aþê4 %®Y7®<€V!9"œÄk®À¾fË·g£;ciÔé ®¿¦+UÊ=…˜ÄN4øj ›|`mÔ‰öUi'¹N•ÈDnå¤Îô™ü¹z;™ù´8ê·íÎåW_BBɇ@Ï~^ !„Bü7(Eï¿.6ùG10gôp¦l ÷S¯3¤é™D¹ÿž5ñè+¿áj~ ¯ŒèE¤´ ÿy|ËyÿŽq,)s¼*€JìeÏ2vpà õ@ëÛ§ðä³?°_רqåó¼0°îI¶3Éœ=Š'¾ØŠ_‰ ÇˆwÖâÌ^Y6³æðÒ£“Ùì ¢å­ãx¤G¤kB!„çÐ_ü$…Àç"¼U?ú·§S£ÿn@&ÅZ<=\MxóŽDH+]œeFñ!22÷°úÛØâ5Qœ-èÜN&~B!„8×$(ü«‚âéÔ?þïNÅy Ùübú7ÿ»Ó!NÉÚ»&|É]w:N›IQòÿxúãÕWú+5/ìGû0 …B!Î5 …ÿšÃ‰ÓªQl‹¦q·AÜtuC*ôŠ®B!„øKäB!„B!„¨ÄÎðCsB!„B!þ $(B!„BˆJL‚B!„B!„¨Ä$(B!„BˆJL‚B!„B!„¨Ä$(B!„BˆJL‚B!„B!„¨Ä$(B!„BˆJL‚B!„B!„¨Ä$(B!„BˆJL‚B!„B!„¨Ä$(B!„BˆJL‚B!„B!„¨Ä$(B!„BˆJL‚B!„B!„¨Ä$(B!„BˆJL‚B!„B!„¨Ä$(B!„BˆJL‚B!„B!„¨Ä$(B!„BˆJL‚B!„B!„¨ÄþSA¡ãgŒ¸û.î¹ånó39æÙÛ·¾} ß0”~Ê$°[ƒ}ß?ɽ®ÄWá½xHÿS¶è'_Å·œ÷o¹•W•µWÌÅŸ0æ¡Û¹}Ø0n¿í.žùz+z…·ÿkŒôéŒ~í7 Oš¯<¹í™Øoœõß‚ÉÁ9Ïq˲֯³cÊÃÜòø7ì>’1ö-œÄ+ÝÍÝwÜÆwÜÏè÷~dkÑY¬ ¥ù×2áîO]·W]?nÌMCsÓA <¨äÿƒ¹ííä Õ­sYïÿ^&™³Ÿáæ†óõŽ’¼4sYðÒͼñG=Íòë-è›&ñð°Wø³¬•ÌÖLy‰Çï¼™Ûn¾™;ï|€Ikü¥pë}îf. ^º‰G¿8î^ðOPnÞýW¸YòÆÍ<;s?ªz+¿z§ï»ƒ»ï¸•»ï{‚·¾]sÞ¯ÝSÖûsyÜÓ1ôa¦m×ñ¯ù»‡>ÏχN' ¸.Î8q•»lÜì˜ý*ßu÷Ýs/ÏLMýçÝ[„gåïNÀÙdI¸±ã‡ýóF,;ûû7ƒ4vÿ2­Þ@#ëìÀÈdÏ^ϩױ$0àÉ'¡ZE£ï`Á·Kê3†÷.ŒÅªœæö‘wï2Œ¨S¬¡RµÛ]<Ñ>„ªçõqƒ‚3؉ê Á©(8Cœ¨N'Ž’4{çðÑÄT}™Gš„¢nå‡×ÇòÁ´Ú¼8¬9¶ó™ÔãXšßÌ[ŸÝ ˜äýúÃį1WQó4òï\×û¿—‚Ś͹«¹ìÎv8Ï`å×[Pë\Æ#}TqžxQ1c^I£Þ£'®që}EîJ(í†>M}[ÜS¾òóît™pöò÷2Éùc-«Âí£ß£m¤†{Ï<Æ¿8ž/k¼ÆÝI¡çí OUïÏéqNœj0!Á ŠŒSur:i¨ÈuqFÎUÙœ~½ý»ÊßæÎØG«‡ÞfPÓ¿ó/¤â|:¯A¡éÚÉüO'2gý!|€½v7Ý1–  ³yÒC|ìíCoÏŸüºùEZ .z/×µD)wù)LÞŸ¯óÄ5>ö:êi%?{Ö2qøG·¾Æ-­ìå¦_lEÛ°d~NéOÃNÁ'£0õ'>ûr[r ìÔHº–¡×´£ª¸’ùð±YžãFyí^k€µ-7¿~m¬€žÊW#ßba®w¡Aû‡ßçŽ6‡#O?›>‚÷åà*pÁ×ÏòðtƃÆpÏá(§ÜгYûݧ|»x'y.?ZÕzº‘>MÃQ*P6»¿žWgn§È¿–w…‚B¾OñØe5P1Éý}ÏMÝŠÏ_DqÜÕŒy¶q¥Z¨FÎf|:•…;Š…à=¸î¦+HWÀØÃŒ§_b_Òo_KFÎ~2½õèwït«Q±èÛêtb Æ©(ØNgð‘ÂÈÚOVPšÖEiÈ¥÷>C£jÉàaßÂ)|>{-‡<~üÖš$^{ Wµ­‚ø–½Í}?Ue`Bëvæppß!B: ãžkZªè ™:žÏîG ¯J­ÍÀG…R^z+¿™Ä÷ËöâÖuÔªm¸bØ:U0o̼ Ìšü‹v¢ûMB›öᆡR׸j<{æóéÓÙXd'<¶%%d2yMsÆ<})ъΦ‰2Ùq7·Uù™ ߯ç ÛGµË_à™þ5P18´r¿ZÈžbÔ*4»â6†ö¬ ?'<Ì÷¾$Â3V°ËÑ~MÓY´p#E-ïä©Aͱ—ÛÞQ°%´§îÆ9,:Ø–ÞU_îf÷oŸóùÌÕdùk,­®ÆuÔÀVn½#}&/¿ô#ûtE®& {ïQ.)I”žÆÌ^fÞ>…^}/?Ì|µ—Á%qJ¹õÞ,HeÎä/Y°å .BxÃn\=t­«nB¾ý‹øòß²*ˉ…Ø×qË IÄVäž•?ÌÄ•~|®B{bìà†hG~Ê{R¹õ»Èä9©ä› ¦BƒK†1´w]ʽ[–›w*ø2Y6m"ß%§ãU´È.ºa(½ê;÷¤œŸyù±5\0ª'{>ÌŸixiÃãï¥}yUßØÃŒ‘ϱ§Ë‚S~`mF!ft®¹kãW½;ùMžÓÇ®ñ1}Â\¶æ¸ÐÜÈ«÷$\)ç~ŽNæ’OùpÊ òìT©×™úž ÷]““‘‰Q£+M#i±×º›Ÿlˆ+âpà|ê{ún¾9–ìO°êc¦-ÛG‘7„n½Î ¨9Œ±€ÆÏ¼ÌÀº%µÁ<Àœçã¦ÏòüÀ:(§ª÷Pþß‹rî)fÎj¾ùßTR2|€%&‘·]C먒‹ÃŒS &Ø© øœ8lÁ8*Ú)÷º(¯ìÎmÙœªÞ¶Ëžý—˦¼{JyeS!†ŸNTÕ Šo#„ø×;A¡AÆ/Ÿ05½ #߸ŠxK&óÆ>ɧ3ZðêЦh€ªBnÊ |#FòʽAúã-FòM½üå'§Þ¡7í§}Ä‚õý©×ʘ¯þö.<Ô¬ü€0p Q$]Ô”Is'#±Ï1‹ÌÂ>{ëGÌÁÏòj—ªhëùâù7ù(j O\‹âHäŽq¬÷OÀñàë\ß踿NZc®}i<×ê;øzÄX²Yh¡éWyûºõLzè#´»Ç1¤éélo°oÎ[|°¶>÷ Bu2{‡ßšDÕWï#1Ô,§l4j÷Å3öÑ<µ¦cëNÈ1_"º≠nà^ô÷Ï=.ß̃üþÁ»,­v£ÞjM˜™CòÏ0þÓX^º¿¡¨¨J!kÖú9üQjÚ\¬Ÿð8ïÏXKÒÝí*Ô“§:Cv†âTÁv¬Î‚JÒ¨Õï@kË»Lz#˜‹{v eB}b«Ä_²­oË7¼õÙnº<ö<—×wR¼y*¯Œû€È矤wŒªŠ±c9i—â˜Ys;b¿_М¾ÕUÿe;=®;6*ônšÆ»S³è5òu.®iýs:¯¼ø6³j¾ÈUuË«· Ö¼œ'Þ»3ëGÆŒXìB-žËG§OÚ7<óÂ~®|û¾‚‘S×û~8Žß£nç‰×Û©ä°rÂs¼ÿa8/ú®9ýÇCqv0M¥y—¿„©Ÿ®£ÖÝ/ót«P<»¾çõçýм"iӨѦU~þ‚qsè™Ô–æ ªQ«%k”{OÒbˆ‹qñÇ—SÐm0ÏŽoL¸fbš ]è–ð3þÜJÿºM°FúŸ,ÜU—ÿ»3>TžªÞ—÷÷"$÷Ô÷t¶Îú”qw1úÑÆØð6o2ó×eв[uT@±‡à´: v‚BgpΊvs—s]”û·ø—Í©ê­ó˦Ü{J9÷û f1ææ!Äi8£Tâú<ÍÛO_A¼ ТiÞ,–ƒñ–^«~WzÔq  Q5±3Ü[Øœ®WxùIÙ›Óóÿ‚YñËròLÀÌ%yÁ:bºu§îi„ÆÎÖ—T4Ÿù©ÞcÞiò¥.c­Öžž‰Þ'%4cعr=ù÷ýÕÈdÕÒÝÔé~ CUÀJl·{xéÕÛh¢PѲ9SfÁ:R¶V¡ó…- S-’ö=Ûc[¿‚ÔÃ0Uê%u¥† ÀNÚ±ø<å{`¥iñüÃ݉PÀÖñ^¿­5‡Û Jh;†ÁåuóYõ훌¼û.žxí+Vð:iËSÈK¸ˆ‹ê£ ÜøºÅogÅšÜ#e¬„·¦s«@ªM-g6s @gïÆT\M:Ó>J ämç®49“áÅe1°:e7ñ=ûÒ4\ÅNí^½i–Âʽå×{³p-Ë7GÒù’öTµÖX:]Üså2vøïRwEÒ:±>v´ª¸(1¦Ô!04×(Œ¥ë =©X¢(%M+{[n~ãunMŒ@EÁÙ¤õÔƒÈ6ŽlÏÿ³wßáQÿÇß³Wr%wé @Z t¤·`P@ëWl òEô'JEEDAEEDEÅö‚òE‘*-‘*½†’ä’\re$sDPóy=ÏÓ½Û™ÏÎÌ^¸Á‰Ói§rÕ(ŒŽ0BÝ.‚_Òi¦æå騗Îe­ëô¿ûصj5¹õÒIK(éîX’Òi_=“uë·¶ë/¤ç­cù¦HÚtiL„0DÐôÎ1<7èR¢ Âi?x"Oö¬‡MrÖ¥^5Gæ½^²,Á´I^¯ÍBˆ¾—ŒW³ýp>zø%ô¸ïúÀa0ü™¬]}€¤´Ë¨aS€‰øéÔ/\ÇšëG•»%½þ ÜÐ(ªäzVê,&á¨Ü²#u¨0ê·nˆå×Mì*ݽf³a+."ùŠž´Š· 8U¯åoç/l37¤U½’é„–Äö4O 8 uRH[xäÑÛ¨çÛÄ7¯ŽdÀ½ƒxöíEìsCpm’›ÝD®½·\•B˜@¡JëU³Ž)Z¾ME^¶/\̱zé´‰ "÷Ü/¶)€Ùb&gób~Ú°—œb3‰ûÒ»4 ÀÔ”»&üML "/cȘ›©|ö•é|ïÅç]6eÕÛó,›@mJ0eø n­XÅîÐÿô©ÚBˆ³qA§gfðùGóØx¸eÐðfÄŸÈo:@æ0ç©)e6³›ÂÂSóñÿ|{ ;¦“0b>K·¥‹‹vÖ¢ãÿU:»ÈØTôË¢óíJ.I<‘¢\^G<¡'w¦u8 ?|Â.f۪璓§uØOu¨T6Ç©S6ç|xW.ùºçi7åp`÷$¿H§ô®‰Ùr2}šRœÕÑ5–A !X~×Á0F¤Ö#…´:žì­ü0ý^{)„ÇG_…Ëå¢hýÛŒðîÉÏûŠD¤äà'¢$½!–Óž²–t¾t?€NAA!!¡ÖSÓöLV¬å5ëFw‘›çeÇœÇxà‹ôSŒ G^ùS‡Ësyã±èDÝÔ½¸½©äz@/ΧÀoÅ~²£¯ùÛéØJ!6™Äß³è¹l_ð_þ´‹\¿†2‹!íÔ·1†˜J:Eš£±t‡~ÿYÕ--.Ëj}Ãw‹Ðêä_ý¸òò±:' ì8ùy®r©»çCwåàò;pœžo&;Ž“‰õ‘½q.~•ÁÁ0ü¸úp4,—«.`›d£¬z ÊÑšÞü|3÷;¦ŽšL–%‰æ]oáæÎµ°Ÿo{¦ç‘çÒp†…žªkÆP–ò ü€¡$=š‘jÕ«ãJá wžlߕ͎¥ø8^Jî|J!êI¿? œw–‚|Š- œœ‘§N¿†‚¡šÜ–kîjË5xÉÛ¹”÷_Ê‹Z c{Õ Ø&¥ 8“’‰>Ãa­.¥…q"KÖåÓ Ñ6.+¢iŸf8ƒIb€û… MÁh éÚ¡Ükû’ï?Ϭý¢ëuäÚÛ®§Y܉ÊoÀl-m1•‘ 'ë‘ør¸ŸoÙ”]oϧlµ)Ë&ÐŽ1ÿ阱«×<ø0õË­\„ÿ.(ô䯿κšC~}œ?{çŒ`ôÎß~ÌSàæÄ=_!ÅbN»ÙÚ^Ý–N >ã“ï·QC-äXã›i~¶½EtÛ.ÔýâS–ØN<µV„8˜òrqù)ÕÉËÍE9¸èÛ”§ÃÏÞÜ|tJFÐ 8v cL%ÂŒÁ•Í9>4ŒP•Gnž¥ùíÏËÃev༨ì<ù8úËB~ÑÒ¡~ …)"…N]›1÷¹=ð)¢ÂœX›ÞÂØûšqzMÙ#N «ÍBÑá‚“õRwç’ë†ß¯:='š“°0µ»?ÅÐKÃÎþ%¡a8ÍUiòðhºW9Óã+å¦Ð}"ñ““ýÇ€J3r¦ùEkg1é³<®}lé•CPEË™tßg›ÊÀ”ƒKº´âã)ß³ûä;c4ÎP ³óðPF »ÈËõã¨vá^ÖñgT¨“P•Kn¨îÎæPDÄG’»˜·_Y€ý®Q<Ú* “žÍü§‡°¤|Ž^m’"´znì×õb²·~Ç[/¿Â§‰/p[óÖQNÂ~öæ¸Ð)}áÉ#·ÐNxèéõTÃ`8×’Ôq¸Ñ) nô‚|Ü!6쿹ë0þáTçÁjÃTà¢àäe“WRÎA%ë8¿.^I^ÍtšÄ#Žävtk;—¿ìÃ¥× M:™zãŸÜÂÍuhßÎɳ‹3Èô¯!#¤-ƒ¹ÊÞ·¸< IDAT9Àý°ML±4ìö_v_þ~2>œÈ›Ó¢©1¬é…yžõ¾ÜʦŒz{e°M ¦lÊ<@†O¤Æ·¯2aʧ4xúj–׬!ÄßÞ…›>ªç“çRD&TÅaßñu,Î8ŠÏSŒç´{©wËb–e–,NÏ^µŒm–:ÔM0½½LÊA“Ë[á[<•é‹|´¼´Ñ9½ DÙsy»"V¯›<•¥™ÁL@4P%¥&æÍKYu̸Ùûö—W±ªh·Hf×÷sÙæÒ‚ß0õµïØÄïU([ZÔËbÉ·k9ît7~œÎäÏ6áÖ$j&d±~õŠß±ÕÌ_y4È©—:^WE¶xªÆ„ (bß‹ùÕçÁSóŽÇT«3—:×°|ljÔHjÞ ç/óY°·Ðqï˜ÏÂ]UiÞôÔ €s­·çK9Ò¼Î1–Î[GŽðå°aÖžx;ƒ|w.Ÿ“„ÄLèl[Àн><ÅžSAùy´AµIeðlû˜ñ粯¨$á IÄZ5´òèÔk±4n–À®ç•¶IÅøq>ÃZЬz9Í#ÄÇ®å‹(©ùl^ñ3EµêÌ,Ï@ygHªCõâu,û9ü- X±/ø ËGVÏaêô¯Ø–S2§Ï“½…«U3§:ß6 À@b‡4ªl]ÊÇ 7“Ö‘êÁ>p¿ئèY,›ò,ïeÇì•HJä´òëp”q]œo½ÿ;—M 6%`Ù•<I—¶%9k+Ûs.ö| !Ä…táF Ét¼¶%¯|ô.Œ%<®Ýnº‚­¯ÎaüÌHFôl(ìu“Èy î=JŽ7ŽÖwÝAƒ“ãþ|»?s.ÏþŒ=>ð»(òì`d¿Ñ´Jt6’«ª•ôÌ)hþ?>ѯ£ß9ý®€‘äN©6w»O¤ÌÞ”ž3yçݧ6Ûšƒêiè“yjÄÂPƒW¥2iæ`î™nÂÏ¥ýFq} lû`$GLJÛåBuŒ`L¹™Ç¦˜òâ øý*W䮂éLÑŸŸ-2•.ƒî,]S¨lš`S g³®¤/žÊ3ÿ÷-šÙFD£›zo{"s2iä,¶xA÷æSäÞÈèû¾Á Âh?p =R¢h÷ýdMŸÅèÁÓÑuá©Ýéß«)¶³œ%zö4â.ïO÷ >~a0³\^tc(•S;Ðï¾.TÒ€×qÏYÌxù!¾ó€®Â¨~+é±Áua,{pG«I¼7¢sBc¨•Þžf‘_á+—ÈC#¾s?îÊÆÛ  lI´îÑ›S0õ>œÖ}ú“5ý]Æ žŽ‰oF÷;k–LÃV•Hïy[_ÇÐÅ¢«^B§VµX¶1˜´)lM¯¢Ûâ×™üðb¢"Hîxÿi6‰wßx¸!©ZYp2+biß9•/&®:ù'SÊèóLf¼8”y^ÀZw ËÉßôøóz¥à›±Oñõ>ô"òÝ^öíLJê·o(ý3zNàzßážäNŸÅSƒ¦âõƒ½fGîÿ¿Ò5…±méž¾Š™c‡“ITJg®»¾¯~ü"Scæ®¶Q¨?m3 xÖ¼Éð7VS x s)Rã´ØxêMŒÁ´Ie0%·%-|*“†ÍÅgÐ@ÙIJ»›^xá͹0PåÊþôvMgÚˆ¡0Å6æ–Aÿ9·Ÿû9##5køfÜv=ŽÛÙ„ÛïkÔ4½€íyx[n鹉×Þ|€Æ0âê_I‹Æ–yƒ¸èU8­îz€¼÷fñæ°ÏÉöú1Xb©Õú.\W£dÄû<Û$Û†5æ0uSmz÷=m=Ÿ?p½/û~ M!‚FiõY3ã š©Ð”Ž)º1·ÞÑ®ü–Q”q]u/þÓLûû—M™mJÀ² ’f@C—÷ÍQÁ¨ü¢â¿ÉeïcëŒ!Ltÿ— }!Z ´=Hz.K& gqƒÑŽ¯Í—{sE›àž– ñï¦søãyðéÏÙW ícÅŠ½TªUƒ³ùY+!„ÿNk¹/vJ„Ð}ûèEåÛÆìGŸãû‚\qo?Ȉ€"¦õµ¤ÿ2•燦q¤öà¿]*Ú#!„ƺt½©¯LHe&¢}FÝœrÆ— !þ=þFÓG…B!„B\h2 „B!„˜…B!„BQIP(„B!„˜…B!„BQIP(„B!„˜…B!„BQUÀ ÐÏOGÐ÷±Ï9è¿Øiùß&f›ÌϹ|ÙͲ ·ÓçùEúóÍã·3ð­ xK·ú½^žûµ€z.ªe¸¨ñs!gé—còƒ±ù@1‹ÙvE÷z¸fu¯ý;÷yé¹:çÊ’¡+Ný?|m ƒ9OŸ—¾kóIÎp¾ªOþnõ²L:Gç>AŸ{^g½×ÇŽYCè3l6{|;]B!„"XçÇëOÒˆN»—‡›…ý7 ‰õÜ}ìËÑ©wNß6b³Y0ëvŒÊŠÝªaµÛP%{æ›=E¼Ž™o›¨©éì<ææªn’ìVî )ϳ([bŒ…¹PU]¸cþ¥ Ff^âÀWXDû~þÛÐÊ]¦³ÛÇ”ÆF¼Å´ÙôO‹¦6» ÍŠM)l¡64› ëßìÚB!„®…:ÇœÀïoÃãͧ þ?ŒyüjâK;¯EË^dè¡´6ífíÁJ\Þ-†-‹~b;i q ‰®ùŒ{`9µ{%²åëŸØŸãÃYÿúÞÝ…¤’ý»¶|ÃŒ÷¾cëq? UZÝÄ=.!ÚàcÓ´A¼cíGߨy¼õ鎺=Têþ][ÿÆŒ|i>™.]~ÆSnæñi„@)¬6¡ØÑ”›ÍˆídPÛÝ:IQFªk%ŸM޲ð©EÇy"xÑu¾Üçæ™l?yºŽÁlbX’™›¬%{ð{<\õ³—žuMü²ËÍÌB(ÀÀÔÆVZgÒxŸâ†:•æ§îñrëÏnbkÚyÉ©8t¤´½~ŠÐɱ˜YQ×L­ÓÎK÷ø˜¸§ˆ·\~r}ç0óX¢™+Ì%Ûsò‹¶×òbð芦±f&ĉ9‹pàxWö°Ñ£ˆ 3óF’‰†šÇ6²%ÞÆûÑÚÉüÚ•Y@›,#‹êš©qÇ8£y{¾ß/(ð0`g ¼Š¸#ýÂ|Ð44ïV–ýZ“»ÇNäå ƒitðÞ™w? »V1㥯Ñ;düK/óüS··f2oü/“’„±•c8ºl*n­ÇÝã^㵩ÓuMe4À˜Ú‹1ï RhKîyy2'Of `Â’ó³…†bµ¡PXlVlvki£è¡±á@!ÿwÀÃü?…(jÙ5âJkÀæC…Ü“£ñTªuì¼áç¡íÖ•NÔŒŠšÊϸ´Êv¶4 åHS+Wia¦›îãÝœSs%÷gyøÁdæNGI *ÅXÙÒÔΆDæ?¤]çÝnÞ6˜ùºa(;šØiôðßÅìt¯‡¶“ieiC;ëSC;RÄY:AÏBÕý|Shàõú¡loh!½°ˆÁGüø”;c4ñ²C?õÙ÷Žøic¤z°û/C ¼=¿ïë¼³»ˆõN+kÙYPÝÀâ#~Š•âD¼o 1P©ÐÃ=tn®ecoÓP•„àçýÝn¾·†°²I([뇛åftvIâ Àš"§SBH/(fº2óqu3ž,/«OÔ [(v››RXíL¶PÌÿ–‘`!„Bˆ  …©¸dmfN+‘ Ø œöò J? …Ó$­‘P¶ê´º$†}›¶áÖÁ³eë ÍHoPŽT.mËÎŒ äêpbšßG»^éT³—d½RåÕ{Ö¨ÒýQ†‘Ô^ãèß!ìäÈW½x+?$qæ{´9ŸÄµÜ{ØG6€îgn¶Ÿ†1f:KÒÚ ÆÄ¥Å¾,<™;„üà4óh˜Ârò¨€ÁÀ‘:ßõq´tóQ?ÆH£ NO÷x™“§¸)ÎHe(E·D?×4‘»<|ƒ‘~1vÀh2p_4ÌÏò‘tþ(ºF©¢@ Ü¡Øë#HŽ2ÓÑíáíÒ¹<¼ï1Ò;âÔÈá9 *oÏãû>K ]# %£vf#÷F* §íB3B˜šV á?…‚ÓÎK£g-;‹« 4“Æ¥6ØS '–6ÆÛ4â”FŒIQǪa2A¤_çxiPhH¹•ÑC:® ¤Å}<ß·1g3{V!„B\\húh`ÊlƤšÒ0€ŽR:~½´÷«œ„;OÄÑ%kötwè„äºð:â =f+BÈÏ#_‡0J!6™ÄпfEC8±hc¢êfŸ¹Ýãå=·Æh-¨§~ŸÎ1Q§×FM\ó™çÕÉ÷øè³ÎÅi³]1Út²€Ð ŽRÄŸ©„øurp“¾‘:÷ñòP¨EG=hQVÒ º·³\Þžë÷u³NŽ®ˆ8-­qæ?æ»R—ØÏ\ïä3ê ->0)8æÖ‰ ?µ=D+ "5¥c.ݱÒ95J«™°œ¨l†,å’oB!„âB‘ ðlè…ú)™Tç§0¿e-YKet:0ååâòS:|¦“—›‹r„á8½/®¹Ð}fÝëç³c~’cŒ4Ò¥H‰0qG¦‡):þ8“¢u%ŸÆ–=:fü“‘MƒÍL/[>ïgù©á.&'ÜÊÕAÖ.Í ˆÄÏQ/œˆútŸÎ6T¶(¬&E˜ÙÄ; ChsÎñ´Îq/œˆ”s¼:h 'Šö1f"7{ø,Nçóã=ë(—÷ï¨àóöœ¾ïS„¢“{Úûi{üœé¦¦3\÷z¼ÝCx’ï#!èLٜϬ³M§B!„øÇ’é£gßÉêÅ[(ТݬÌ8BµÔÚXS–4ò¯bþ²#xî¾_zŒ:-ìÀ 2›1áP–Ðñäçã.‡Ÿ'PÊÏ‡Ü Üïe_éþ޹¼Ì)„KBWDj¬=êå§ÒÑ«œübîÛQ̺ ¯¸1ÚÀ¶ì"^ÏQÜS21¨ošŒ\ªó~¦—LÐýÌß[À¥»¼d!¡F®ÄÃkÇtŠü:Ÿí-äÑãg~ÎH÷óÕ1Ç|>>ÊÖif, Áh3ÑÇæãùÅ,±™¸Õ쎞Ýyæm€ïk-¬:óŽû(<Å^¦déûSݧ“å×Hµ)B€ãyÅ|\¨ãöŸÅzM!„BñVaF õœ…L9‹-^нù¹72ú¾o0¨0ÚÃuÁìÄD]Ç2^yl:G²\˜ëÜÌ=âJ"k{SzÌäwŸfØlhª§  OZdУCZ|[®h½’÷¾‹O !Ø£ÛpÇÈÛiü'Óþ‚f02¦Vï-"m­›¬fWU±2ºôM6µb­L.v3èWÉ:=ƒ êÅcƒ˜3÷ð‘ÙÌ²Óætê^½6³Ä::>Öx0(èUÓΓE¯êï.æ²unŠuˆ 5ñN UKÓÿtÍÚS@ãý:JWT 3ó¬#¸é©èàSF.3{¸õ7{‹ua!L‰Q§}_qcœ§~õqye#ñÁŸv@eæ­îã©M…Lu+@'Û÷­Íg:-ìÌŠUÊF£O53Kw¸©ªYMô2ðA.AÕ;-ÄÈÐ/nÎç+‹F‚ÃĈ*FîÜWH¿·–c>!„Bˆ¿'•_T,AÐsà¹A?ÒàÙQt‘W+þyò‹ió«Î BhÿCß“Y@ó›k›ˆ¸Ø‰B!„{ÿயåÈççµ}ÅDÄ™hó»*v. Áæb~ñ~?gû©j895V!„Bˆ²T˜é£Bü™Ì£…´ßã'6ÒÂÛqÚÐùJŠ ¡o®›Ö£)ˆq†ðÊ?ð<„B!ÄÅ!ÓG…B!„¢û‡M”B!„BQž$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(,oúq~{'¾» ßÅNËI>¶ÎHÿ)ëð^ì¤üyV2¹Ï]¼¾Æs±SRqy×óV¿AÌÚZNWOár^ï/ýïéMï;_dÅ?¬hõœu|ôÌÃŒ|t$ŒÇg›òÑÏb{Y<«^áÿü€aCåß÷1O>·W°‰¿õ¯m“træã©/â¿ØIù7Ë&ÜNŸçQè?Ì7ßÎÀ·6\´{§oç<|Ï«œ¨¾2üŽ!|¸Ý‡wÝëô»c4óŽÉ&„8Æ‹€åà’;¥FH• q뀺؉(?ÆT®1*Éeñ¯amÉ=[âÛ=›GŸØWN;½PõÞϾÿ}ÀÏ5îfÔÉxW¾Âð/V’^§#Ìö‹¯xÿ^ù#/v2þ¹þµm’Ÿ{öá¾Øé8#6›³nǨ¬Ø­V»í<¯øòk34› ›f'Ô®P>;6ÍJ¨íorÁ !þÑþmwš2y.á½7ç°æP1:FâšßLŸ^­ˆ3”l׳×2ûÍ÷YuÈø1Æ¶äÆ¾=h©:ù[¾dÚÌØS¨Â\Gïžm‰7xȘ2„i^<…y8.Å3·ÕÂpòè>ÿô6oÌZE¶ÉITÊå\âÂÈyê¦dü+^¦ÿ7ÑܘšÍÏ;³9zà¡­{s_†;xÞõo0dfCÆÞD’áô ˜>x:öÁOÓЊ÷ðýä9Ìßpˆ­2íïÀ­—D–ܪ|GȘý6Ÿ®ØÛçC‹nÂ5½{ÒºŠ©4oæñìCëh?*½ÓßaÑî<ŠiÂ=¯ÞO3è9¿ðå;°d— ŸWÇQ÷JzÝqÉÖànVò¾`û<Þ}oÛ²=øtÉ{rûÕ©8KϦiƒxÇÚ¾QóxëÓ u{¨Ôý)»6Š S†ðªë6žÔ–ÐÒ䭟°I.nzn­m[ù`äK,>îÅíòÓlÈdîib:½æppÙ¼ûù*öçºñ…T¦Ñ•½¸µS2%§WÄų˜ùÕzŽyñšhySnh…²é™_1fø¤<ö,7&Ÿ¨ˆ‡™;ú!Ö}œÑ7&¡îäûéÓ˜»áÀR-[﹑†á%'ã^þ"CæÖâ¡>~ë[¶eâ«y;㇥¦åmÀ’ PïË.ýøÿ÷@)=«p c/Ù‡W©3}û]E + g³îýW™¹ø ZX4U›×¬AÕ@Ïcóçoòî÷ÛÈórÔâòÞwsEm{P]0=@Þ–Uï¬z‘¡?†ÒÚ´›µ+qy·¶,ú‰í¤1pÄ5$Ï?ï}~?»ƒ/›M¿ÀQµ ìö`ä³íó˜öã¯)4“Üùnú]ŸZz¸Ù³`&3¿X˯B™âhtMonn_…ŠØ3ïÌÝB®®ÐõPjvíÍ—'cÁÇžOG3þ‹íä{×3¼ß(U®z„‡º~`ÌuáОÿÕ×Å9×{óv>>š­Æ3¢kLi=õ±ëƒa<½õ2ÆŒìJŒKÙm’oŸŒ|†¬&uÍ>\q€üâPÒzžÛêÀ“ÉŠ§ñÉò}+…!"•νî S  ›§æmÿ´ómdË‘,f¨Û@zµˆBû–gÇþB•º¶þœMÊÕ—£Ö,`íž0®1„Kã´²Û{ÿ^>{t,Z]ƒ}ûze$³¸:WßiUL å‡çミSdÅÀ¯  Âh?p =Rµ˜‚Âj³ŠMY°ÙŒØN =+_æþO£¸ù’üïÇdY¨Ù¥/÷\[» |¯,»l@ÏßÂW¯MaÞN?ŽÈxê5qüv4ÕfǦٱÛÊcÃbÇZ¡zrBˆ¿JÅiJôã,}ç-~IÌÓ#ëcÍ]Æ«ÃßâãÔFÜÛ øØöåtVÇßË“¦B»¿{‡ï>DôÊhþ|?ó[L×<˳Íì(O&KÞ›Ãú½-ˆ¯nL4í;‘¦xùyJfüþð®|8m-qw?Ã#—8ÈÛðÏOpa¸²ô&¨iøw¬dw÷Q ¼1ýÈ\žþ!?¶¯ÏU•Ëî¤âˆËÞJ¦’pãrù0;í˜röqÀ]™K+‚ ë)ô ÏÜkáÐÜq<1óZ4¾Z?¾žÈkk1à±Á¤:=ìùúyž}å3*?õ  qÄ™·óùdM{<Ê‹¢0é:ºôl¿ñ }öLK¢ÉdѤ'™ô~ã&¼FÄè\[v]Ŷ%-õ>[´k“ë`üû±xW2þ/~þo*ïïkÂÈn јÉwÏŒ`úg G] €)® áûæñÆ'õ¹zÈÇ[@×Q*pÞìþ¨÷z€²A3 y7’qø†¹ ›ws{’O~jÇ—†S¼þ#¦-´q㘗hé'sþ‹<™íÖ™Òš³í3¦~QHç1/syœ]³Ÿ`ÌôoiøÔõ$>9ÈÛ²ê½× pï餮 ScjÞʸƒñÃïdö÷ÈØI‰œ_Þc Jš}ëÆ-ñckÚƒÁ×ÖÂôöÀüGײÅ>”ªÂÎÙ<=ú=~ló$Ýâ5Š7}È+ï¡ÓÈçé’‚{çÇŒ{úe¾Lxš’ è9Køð£\Ú}ž´ ÿñÕÌ~w ;Ú&‘j3PíÚQ FÀëB?Îâ2Ûó¿öº8¿zŸLûUùnÑbv¾ŽÊàÙ¢¥9ÔïцhÊn“0Ä[ÈÂ÷¦—v¿šB˜AG×àcï—/ñÖæ& }f5m^Î{§^žEü¸>Ô ͇WnÆùø@†Äp-}‘‡f}MëKzQK3À±]è­Æ1¸Ús ›ó+÷=7œê“²`ýq:^¦´÷šr±n½‡‘C$!¤ o cògëiÕïBT4—}Ë ýø¶Ö<Ö=þ,fÕøÙÿù“Œù|ï–gh‘—1xìMØ¿*kû-Ôw*l¡¡Ø±¡PXlVlv멇LJCß¿” —ŽdÔKñ°ïKžb _4ÏÍ5 eß+–]_NáËÂtFM¸’x-›•SF1Ï_çTê,¡ØL6ìÖ’ ÐfÅö$„¸*NS¢Âi?x"Oö¬‡MrÖ¥^5Gæ\ƒc¶˜ÉÙ¼˜Ÿ6ì%§ØLbç¾ô>ÑAP&BÌnv._Èú]Çpâh{G?ºT® æÛ½‰_µú´lèD¡pÖëJ»¤ßf¿ kL›Fá(@‹¬FU[G³¯¸PU¨d>Ì¡#> V¼ÆÃƒaÖF¾Cû9U•Ê¥Q™V§]S(LĦ¦s˜c^À˜µ«ö˜~uà  ,Tët9õ²V‘±¿ôÖªìØ-ùèõoà†FQ%O¥JžlºÖ³rsmº6#Ú˜âhÝ¥zÆ v¹£¬¼÷n]ΚÑ9­d„Âј.íÂùyÅ&ŠJ‡ÍnÃ]¯tªÙKòU•ôþ0ÖèHÛJ[YòÓat@ÏYÁÂõZw .`ݵ|9Çë_Fz¢µ¤“Ø!/Œ¡G3àc÷ÊUä¤v¦s ; …=¥+i‰ÛY½îxàõ]*œfS´|!›Š¼C§Ò IDATl_¸˜cõÒi£ø+ååG¯!10ÄP¿^®£G).Ý…f³a+."ùŠž´Š· N;÷@yP€z¸l­2—´­…M¦*T‹‡¬£9øñ±ã ë´¡Y¤0צuÎ"ª1Ôº™Ñ/?@zœ¡jý:8³ŽÔB¥Ày[V½PqÉ$ÚÌ8œV"°8íä”l?Ÿ¼÷ìŸÏë3·`öÁÒu(ýohDÈŠ)¼ðÕn|Al†²5¦Sz5,Ja©–JÐ,Ždù»V­&·^:i %W‰%)öÕ3Y·îPÉÈ…f!DßKÆ«Ù~8=üzÜw=©å1•-ÐuD{þW^çWï5âÚu¤væ–ì*))÷ú¬ð5§ã%Î '±ÙMäÚ[pËU)„TIÀëÏdíê$¥]F’ƒß!ú…ëX³ãTÍ0ÕmG‹# °U­FdÎQ²N´×Z’ª…àp†¢b«RÅ‚#,„BW>þ`Ú{]£z«vT °P¥ZžcGËam©F•«çÕ7§òúïþMw µ ¶yŒîòp÷4Œ¤öGÿa¿-—z´ë0WiCóÄ,¶n9ZR÷Êj3•~ŒÍ›Ž‘Ô²5•L€!‚&íâ8ýئ¦Ü5áÿhbyCÆÜLͿëâ¯âŒâ#{ã\>ü*ƒƒ`0øqôáhxâ.e éÚ¡Ükû’ï?Ϭý¢ëuäÚÛ®§Yœ T,îÃWßòåÄO˜ärR»ÍÕÜtSªZ]/ȧÐyꉞrþÛ–\…XN RJnðz0[CeªÄcWf2ŽÐ¬sMvdüʱ¸¸ãëg€=(Ì6ëÉWJCè>é.ró¼ì˜ó|qb§~Š1áÈ;‘? ¥©V½Ú+MA.ÏAæÄ¢ç§{q{SÉõD-+;ï=y.ŠrWóú5'§cêÞ" Õrqé`Q b“I<Óp„V™¶kòÕ‚%ìïr¦e?²µrGz&s'õ“—ëÂzÚi°8Nܦu\.EëßfÄ€wO~ÂWl$"%?§Z]J ãD–¬Ë§A£m,\VDÓ>ÍJ§ÆBqfŸ4‡‹P oöAü‰œ 8•CÕ“Îâ¨×¨÷Ê&@™ 9U.JŽÐ)(($$Ôz*LV¬æÀÉ:A/ÜËòæ°hkÍ€*:FŽÞ0è—­ÌÛ²ê= ÌfLJ¡) £Ñè(¥ã×uÀxîy¯áÇés(¾ò)ž¨öc'½ÏšFw¢­ÿêô@ÓðCYÛƒ<e³sr†·Ò0(ðøü¸òò±:§F•‡C#?Ï…hŽÖôæå›¹ß1uÔd²,I4ïz 7w®…½ⲯ‹@í9éuq~õTx+Ò}ć‹¶rmrV/Xƒ­í0Rƒ¸—œÚŸgRrÉÈâéô<ò\ΰÐSŒ1‡¥€¼?%Ï‚¦óim“:u?À„Ù\Ò°*£ #%µß¯£jïKN³%ääñ5¥ è«òâSÆ“÷bÍlýÃÃC-4ç‰ÌSVì6(È/ÀÊj3•¿€‚~32©¬v,Zñi;1`¶N$”³¨3BQ– ê9‹yû•ØïÅ£­¢0éÙÌzKNÿ)–†ÝþKÃnàËßOƇysZ45†u"B!¢.zÖ¥SO÷áõ|1yoέÁ¨k¯‘Q+–¢Ü'î‹zÇû r9œœŠ ¡²‘U»³zm:ö¬Mþs«Xå9JtÕ*ìckNÂÂLÔîþC/ +ãIµ†Áp†­¡a8ÍUiòðhºW9ÇÁç2ò>4, [d÷=ß«ì'½šñO0Ed«K©?ûc–mo‚iá~êtD\PIÕu†Rí ¥û÷á:rˆBK%b g˜kÓ[{_³ FÏÀ\‡öíœ<»8ƒLÿ2BÚ2¸Aéª:ÿAþ÷ú묫9”á÷×Çið³wÎFïüýN ÿ,oÔë@ʪ÷¦eSv7PaµY(:\€—’ÆHwç’ë{àd>¶ú2ïîjÏÃ#†l×ðmœÆÐ—‹Î"oÿ¤Þã\óÞ·Ÿ]û£H©NHüÕÜÕi'M&üpu:ÞêDùÖ•½ýÜR{ ‡3”Âì<<”Ö{ÝE^®G5Géþ¡Õ;pc¿ܨ“½õ;Þzù>M|Ûê”ÃÐE×EPí9ðW]çWïe§QÇæ¼ÿÚ"6vNfÑæx:ÜZý¬oÈ㾡œ„9üìÍq¡QRVž!6p!«h·Hf×÷sÙæÒ‚ß0õµïØěЕ­-êe±äÛµ÷º›?Ngòg›NÁe ÷¦Ú-h¢/gÞÒÃxÈbzæ‰4:š’ÖÌÍš¯?cUn:6²ãl ¹y3œ¿üö–Eûç1yäx¾ÛWò\¸Zó„o˜Ç{Ýør6ðÙä©,Í<½|}ìúäq†<øþ0¥Ö@b‡4ªl]ÊÇ 7“Ö‘ê'úzz>y.EdBUð_Ç⌣ø<ÅxÊ!oO}îóÇ`èäeœ¶ß@õþüÊÆ@•”š˜7/eÕ1àfïKØô€‚N~^>æØDâíx³bÑÏä{=x‚™?y¾ypÿAæý™h•¨›Éº{pë&âÛt¦ÆUl³'oV·Ÿ7IÍ›áüe> ö:îóY¸«*Í›VB<Û>füĹì+”™ð„$b­§7‰f“=뇋)Mrþ®³~Ž×E ö< ËFÏÿ‰× à…y‡;ŽVmRHjGZÙÖ³à£eì©y)m*•ÓíX‹¥q³vý8_óu ˜?ÎgcX šU?ÿˆè¼Û{ ˜C4r*ùŽÏ+?˜ŸÝ¸ÓGÓ]ëYš‘ðZÎÊÝQ¤Ô‰|O T6*šZµ#ØõÓRzO&Km 8Ð~…¢T˜‘BÛ–î高9v8q‘D¥tæºëëñêÇ/25öaîjI£´ú¬™ñÍThJÇݘ[ïhG˜ìui×jo?ûŸê4Ý€3åZd‘¼gÍ› c5Å€§0—"5ŽA‹`jÊŸïK“°6ÜtËÏLž<”lTªß•æ BXBy¼¨ZQ%Ï êÝZ“2“ÚÐÁ´ JßèN­ß¹wåNãíGP„¶$Z÷èMB0ë»T8­ûô'kú»Œ<?ߌîwÖ îMˆ*¢ì¼·6â–×0sÆ3 ›íCé¢tãÖºejþž…ÔŽ­ñ>ù zç‘4°ø»mŒdâ‚ãèøp»\è¯`ƒŒ)7óøÀ4ÂRndàmï1ãå¡|ëöá7U¢ñ-C¸¡nIæk\Çý=g1ã凸κ £vú­¤Çþ¶“ç-8Nv¶ëŒ‡ŠmC‡s˜º©6½ûž¶®ÉLÇk[òÊGñèÂXÂãÑí¦+ØúêÆÏŒdDÏ&e¿©3PÞž {qçe‘í/ú̓~ Þ*›@5ÏÒ¸w´šÄ{#ú1'4†Zéíiù¾ Å©Ûõzj¿2ÇF~EdXeZv¿…¿Náݱãш £Ÿç‡£:øÝ¸Š|¼5à^f QãÆÑ Lœ·¶À‰øsÁæý™h•Hÿï-ìŸúÎõ¢™Ã©•v'7f/äÅ?R·÷Xî°ýî–¡çÕ¶˜RþCÿ›g2ãÅ¡ÌóÖj´¸{]JßàcJnKZøT& ›‹Ï ²“”v7½Nö¼Îf]I_<•gþï[4³ˆF73ôÞöD–°s¹.·çQeŸ\Ð×E®ì,òܾßþ¨ÀyÖ{ ÉtèÁ#ï ùà–§NÑ&•Y°ª\ÙŸÞ®éL1€"¦ØÆÜ2è?Ô>›·ý™@í}P'o$õ²nT~mÿ«c²…Q³û`v­pºýß›Jì¶7óÉA²r¡Z·»éTÀ¨l ÔèÞ‡.¯¾É˜û¿Æ™LëËÚPåçc£ß=Bü[©ü¢âÎDÿ7Ë&ôc^­§yU¥ 4d+„Bü3yV½BÿböÌMµ,]!þ!*ÌHáE§ç²âõÇùÆÙ—‡n©‹ùèrVlsR£k”„BüΑ•³ùbmöŸ *„B!„˜Ì\B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ L‚B!„B!„¨À$(B!„Bˆ ¬…~|:‚¾}ÎAÿ·êù[øò…a ¼ëNúöéC¿þ/³4÷ì~Êѳ÷Kžðßìó”SšËoÓÛ é=ŽE.ùyÊßðmbæ°É¬)÷"ó±uÆ@úOY‡·¼wýwá?Ê’ 9k îs­VÞ,œ4œÿw/ïÈ[«‹Ë5‰B!„âÏ/v.<è´{y¸Y(щu VÎçûë2pÂXê9Î!föíåÛ7¿ÆØýqº$˜Ê#ÁåJKêÆÀ‘¢lêb'åoEÏÝǾz;!ÿDZ4mzßÌšGÞàãÆc¸µ®å¬wáÛ>ŸÏ7$Ðëù±4³KÝB!„¸*PP¨süÇ <ñþ6<Þ| âÿØǯ&¾4îÓÍç¥Q³ÙVè¢ÈkfòCËQ€y)ýŸìAMCpÇp­˜Ã·ùíØ1öwð:ù[¾dÚÌØS¨Â\Gïžm‰7q`ñ,f~µžcE^¼¦ZÞÔ‡šFaðíá“‘Ïuã䮙‡+_JÚCÏs[í]|4|4[;gD×JºÔ>v}0Œ§·^Ƙ‘]‰ÚÿÏŽýš¾"ò ëÐ{Òƒ´=­óíËbý'Ó™³t'9…^ Ñ©¤ßz;WÖ +ÙŸï³ßæÓûqû|hÑM¸¦wOZW øêä.zž‡>çþçï¢~Hé_ó–0ñY8û?Ï Bð\Â{oÎaÍ¡btŒÄ5¿™>½ZWròlš6ˆw¬ýè5·>ÝÀQ·‡JÝŸâ±k« ÌÛ²y7Î`äKóÉtéìð3&À˜r3L#LQ6x8¸ìÞý|ûsÝøB*ÓèÊ^ÜÚ)kikÅ{ø~òæo8DŽV™öwàÖK" þøØ:cÝÿeBßFÿÞ5jÝ&¡UèÙk™ýæû¬:äüc[rcß4Ž,©zÎ/|ùÎ,ÙåÂçÕqÔ½’^w\FriâÜË_dÈÜZ<ÔÃÃÇo}˶ìB|5ogü°tÂTpy«Â[q}—¯ybö\6ò bÏ2®Ó‹‹ð„Æe‘€P!„âB«@A¡"ÖÜe¼:ü->NmĽ-¬€FlåŽ~=•k_ÁÝãî§š]C×õ’ *@ÞbLíŘáfF>sŒ/÷£Éᄄl<Ûfóò;{é0|,$Z(Úý/<5âÇs{=# S°a=ƒä™{-š;Ž'f~C‹Æ·Q+¨‡ eñ±íË鬎¿—'L!„"v÷ßÿ|ˆ†i•Ñôl¿ñ }öLK¢ÉdѤ'™ô~W™Ààx è:JMÞjÄ·iGâ§KY•Ù…++UÀ™éB!„ÿPÒs+O¾ÝlÛe¦z­Êü¡¯¯L„˜Ýì\¾õ»Žá6ÄÑöŽ~t©n|ì^¹ŠœÔÎt®aG¡°§t%-q;«×§d™–›ÝD®½·\•B˜@•tÜшkבڙKX²Ë€{ýVøšÓñgàÑ(&k~ÚCRÇÎÔrh€‰¸´û;¾/—„*ðfíª=$¦_EÝ0( Õ:]N½¬Udì÷ÎkÒZ[X¿(ƒ<ðdÙÂíTëØ±$ Tá´<‘'{Öæ@9ëR¯š‡£GóJÏ]a³Ûð»âh×+jö’j«” "oÏW ²ñ±kùrŽ×¿ŒôD+ …%±C^C:æ“{Ñêt¢kŠ…‰ØÔ¢ss¬œš-fr6/æ§ {É)6“ع/½Ó*£ºk=+7GЦk3¢M€)ŽÖ]Z g¬`Géñ5› [qÉWô¤U¼Ź孊¨EÍÈýìØu–ë=ÇøyÕVüUˆ”I!„â‚«@#…€'—œBUÃÏгU±tºÿ _}Ë—?a’ËIí6WsÓM¨jÑq¹\­›Þ=ù_±‘ˆ”üD`”2àLJ&ú Qž oEZ£øpÑV®M®Âêk°µFj0Ë»ô\rò¡û©R…`s”þßï"7ÏËŽ9ñÀ'>à§޼`Þ,b¢VZ;¢ž\Īì¶t8¾ˆÅ™u¹ªmìÉ©®ÙçòáW,ƒÁë GÃSûV ±É$†žéäËÊÛ ’W¦@eJ^® khèi“‹ÃqÚ>f›õäv¥4åõ¢I×å^Û—|ÿáxfí÷]¯#×Þv=ÍâLP‡Ësyã±èDµÔ½¸½©äz(i”CÕ“Bþ¸û³É[-‚È0?¿æ¸Ð±15(\Τþ/³.ª3÷?ÒæìGç…B!Äy“ ð2DÔ¥SϺtê©ã>¼ž/&Oúÿöî<ÎÆòÿãøë>gÎì+cÛÛ0Ùû2–HÉ—øR¡¯¨Tˆ”hB’"©Y+K‰²UÊ’µ±ä—­dÉÎŒYÍ™3çÜ¿?©03L3rÞÏÇÃuιïë¾®ûÌã~ŸÏußS——cXûbâSëFõ‰á —ælÃã*CføQ½im>~o-?·Šdížpšt)›³6 pq$)“ଋy3³Ç’ð(RŒ [ AA6*¶ÁÀfA9»Øÿ K©XšD,cý¦c=¹žóµ"æB0×ñÑ;ßá÷È0^ªW›™À7¯=Íú¿mÄãïØ ®Þ·%n°nd36NüýIKH!.´ÏIÊéœ÷.F‘€¿}ຸ\<*×ÌÈ ãòLi £Z›žTkÎÔ£Ä}:‘©ÓC)7¸ÁþAz–¢æóÃi[âZ=aÅã*›û¾ÍÅâS—Þ_gý´×™>¯*¯õªué>LÉ𬕗lA„ø$sîÜß׺0S·3oÔ¬? x‡FPº'‹X)]»Á»V±úH:ÎÄ],ž<N^aÝŒ«ðŠnJ=ß|7‡Ë7£ANïë²¥fí’ün%¿¤š€ƒ3?LcÄÈìÏ0Á¥FH~»œý)&`’v`ÓÞ[ɡ˗p0OóÍØ~ œ¼´¿ÂŒPê5­Ì‰Í øz›õšUåR¡)=™g %#B°a’¶ÿ;6qâÈp䨞ví¾½ü}yÿ©~¼¹êÔß¶kxzbË8͉øLÀÄ‘šJº ²+‘µcü¿¯Y}Ä€ýè*&ËÊßs>vWgDÆ©“œ3Îs`ËvÎ\Ü´φ)c˜w`õ+F™’AØ Àð­JÛâY¿b;眀™Î±ïg0yñî-‘Ó¾À•@|¢… `ÿ\ýp`ø” ^ãÛÈüõrqº‹ˆˆˆHq›J¡™¸†ICæ±7ÌÌTìé?3¼Ï2¬Fû¤sÔ ?ñ¬”/ëà«ýÇpVøSUËð«L£z›ùhÌ3|nZ±˜V£ÚÓ½e8ÀRî^úv›Ç¬ ƒXéÓ¢bó.4ËEn·FÒ¤I/~|ŒÚêrñÊÜuŒe£FðÕï&˜vRÓ392°7Ÿ%îy‘AmJPâîþ<’6ƒ/õPÖ=…„·êÍ#IÓùèÅ~Ø1Á· õ;÷àO«n˜™¤'Ç“à²ó÷kû¬ÎT›;Ž…:1¢Â4ÂÒ¶ùVfzޏ¢…(ÕŠ{;ÜÆ»‹ÞbZØó<Ò°ð5;»¾ý£}vRâINwbòçz–%¼!wÕßÂÜçá3«~¡ è>äÔð3ðÈfllQèßu.³& dEº—­5xšŽ•³î½1Š6î@‹m3;d+¡ÁDÔ¨I9#˜.À¡zl¶Íz…A³ ,†‰-´]º7º03˜ú?IüŒ9Œ0àCۇʓ“}æ¸o3a?¿Ä—¤fÏ+nëÚ‡iÁbšy6©VDDDDrÎHµgè:,Ϙ¤lœÈó ÓTWÊß|ËŠüC\[<”Ww6âÕ!­s½$EæOSyf¦?ýGßOÙ<ø}FDDDDrÎm*…ùÃÀ¿ö½Ü¹l‹¾kÉÀ–]«Pä2f2»–|¦«Í™4‚©Ö®µ‹Üü7Ù™‰Y´òïId«^ôî}i¬®Å±õžü¤ƒGßG¤pîfö€‰8@ªÙŸ÷ÎÓÄ-øˆÏ7%ÝéÄZ“v=ºQ¿DÖø› «3h‡5çÈŒ™¬=”L5yìÝ¾ÄØn°oEDDDn …7 3q=ŸÎO¢ñ¨qĆXpû‘s¶q a¢} ûðö¬Ã44œ¶å|IÛó1¯á/Ð2ÌkáaçY3w ɱ]yùÝ(‚¬&¦™uemß>ŸÙªðÂëí(îa’¶{1³ãöp®RmBn°èáÜ3‡Ç}K‚ù—¬¥i7ô%î.‘ݲ“ýKgðcø¼úl^Ø9´r&ßþt‚j±Å1R·1güç¤Þû"Ã[”À#!Ž#&2+l ½ëb`!¬xÎ|5O+ÞE¯×ûRÚÏ‚išD7mHÐè5l9×€f!˜©ìø~+FÞÔ 0€(îõ.÷90ÿ¹ÑÄÿ¥uŽý ˜0óMžÅ3ÞØ-áÍã™>–ÿÝæ•ýØ\ƒÖØèÏX¼v?í#+a\¿¯eÝÁHš<Ç¿žÆÇ¿×dÈ›‰ð8ÉÊÑ/0cqUÆv¯Œ°-Aðï«øà³*üçéñ ÷ÓÄ0²ïÛl£‹O]߇ø<5Ž*þ9æšÙŒ ©Û˜=î32:¿È¨FŰ¥îáÓ×^gÒ’¼Ò1×™íìõÈ ãKÁo xmø\¾oð*mÂo´ŒeßÍdô‡'0JÖ¤ù»Ñ¦jHö [-zN˜ @æOS¼º £úÕËÃé£VʴȾKùöÓ±Ì;ê ô¶¦´ïÚ˜¢6É)Ø“~äý§·]šŽifÚ±–N"Åo#+YÃ"‰¸ÒœCKq6-Ï—ß­çè÷bÛð=ûŠ7¥[dv“;\$'¥àãïÙ—ÅŠw@ÀÅ–ähl®Å§z3êxLdýŽTªVßÏš vj=saú%dœŒã‹ù«øù”Ãj!3á8®ˆ¬;Û€ _’²e®q¯Ý·7êÚcc☌ï؟¦‚zøüéáëwa.`X°àpÝpÓ€lÎ{3…¤äL,Ê3K.~ÂE6’/ö®añ tÙÒWøcùÏö­ˆˆˆH~Q(ÌG.ÌK»22Ì?½ê_¶ z7¡“™A¾•|8á>x“®• ƒñ©õ£úÄ\³ºeõ¸Ê>¯Û‡ëv€ÌD®›Å¤Isß—Ÿ;®Ÿ> ØÂ¨Ö¦'ÕÚ€3õ(qŸNdêôPÊ nP¾…bé3îA*^+aY<®À ÕkF•‹ØðkMlkŽR©õSÍQ!Ê‚ ?i )dÂ…í;I9}‚óÞÅ(ó±¹*ÏJ4nȘuqœtm#Ϋ!ª^×q¾~ÿ}v”Ès}«huqdá ÿí¯±âqµ¾¹FßÞèÔa[6c“€-%™äËÎŒÄœÉ $¼°ïí²±ËÅ¥¯•iÇî¸ì±Ê×:ï½ ²Q±í6 ºFEׂÕz•WÿÁ¾É/ºí%Ÿ>AyÆsâTγ[ØúËÏáwì_ÄØ‰ËùÝž—,C˜‹`¥tí:ïZÅê#éYŸOÜÅâÉÓøádNJ*.Ž­z‹·î%Í<‚,†ŸaÁ’g€µRWFO™ÆûSÿòïýa9 „f<¦ŒanÜ9\€Õ¯eJa3,X[Å:Ô47±ê‡S8gØ:ï>‰;Ç_sèÕµˆIgÛW‹ÙšT“¦µƒsø€+‘µcü¿¯Y}$ë œö£«˜"šÄRbß,Z³›"±M){1Û›©$§*YŠ+8Ïí`]ÜœŽ 99ølúö÷æ›±ý8yCÖ9ò§ÎóÄË–Æ©“I¸—=™4{Ö›²[¥ºTwmá›NãÌÔ_X:nï­=›ã±»K`AÉÇ9•f&É;7³ûÒdsÞ¡Ô¨ÉÁo—³?%ëói–1í½•Êɪ$9í[‘›œ*…ùÅV•Ö+ðþ‡/1"´0þŪU=˜ã® ב ‰ žÆ¤ÁËqZ-`øQ&¶^(¿x”»—¾Ýæ1k V:À4‚¨Ø¼ ÍÃrrùi!¼v3JM›Î°Vû81½zR#—¥-ª0®j.=;FÕc«°mÖ+ šm`1Ll¡5èÒ½QÖ½‘>Õy ;fÏÍàN ÓJáªmèRùZÕ¿ò&ºi}2_]†ÙjU/©œìÿd¿;‡‰“ô”Ìwû±Ë<¢îçåþ±Eu¢׹̚0éN\¶bÔxài:VΚ"˜Ó±ÉL;GBBÊÜÖ€&å2mwEz4ŠU©Qb;Y™5»óÞBx«Þ<’4^ì‡|ËP¿sJædögNûVDDDä&g¤Ú3òâ{ùR¥PDnB&§·,`Éö„«L3µV¯3÷T Ô2ò""""7H•B7¦ç!ˆˆˆˆˆˆ¸1…B7¦P("""""âÆ EDDDDDܘB¡ˆˆˆˆˆˆS(qc …""""""nÌ}¯wîeþЉ¬‹wàò-ÏݽŸä®rÞy¹>œq+NbOK&ô?¯ñJÇÒXóp9’yŒ5ïO`áO‰`õ¤zϱô¼Ý3¿[!"""""ÿn¸x½=³žã­¤®LèCÞÇ¥ 6½ýKJ¾R ¡Ð¹wƒßJäþ7úãgäóÞEDDDDä߯}*…—xR¸H0®Óv\¹úœIÚ¯«˜3wû8M_"›vãÿ‰&0GÙË$uïR¦Ï^ÍáópApÕ{éÑ­!á6;ÇÖÍcö—;9kÏ$ÓV’º÷=LÇZ…s,Í ;ÿ"öV ‘ì¹a(„ë‰Kfê6æŒÿœÔ{_dx‹x$Ä1cÄDf…¡wýÀì·é:Æ·³W`k7†11~Ž“¬Ÿ»Gê^Ö†cßÞžu˜†ƒ†Ó¶œ/i{>æõñï2üZ†)à‰ˆˆˆˆÈ?à 4cà_¼8þ‡~dëñtr:w6sß&¶C«ØxÖÜÙ(˜Ÿ6ïÆž£ÝÚðòLç·MkØyð,éÖ¢4ìÞ›;ËÚ'‡¶l%1º­Êùa`à՚؈_ùqǹ·ÇY~ÚºW‰’rÑ‘ÜsËJ¡wÕn<Þxo>û8뺿Áà–¡ÙVúÉ)Ø“~äý§·]šÎifÚ±–N"Å„lgka´èû Ö/W°tâgLJ ¤bƒÿpß}M(åm’’’‚}çG¼ÐoÎ¥83<‰JÄEHöSHÏobÒ“ØQ¸}_l@Š‹"""""’n 3|ÁŒÕ~´{u"­Êäh:©-(ßB±ô÷ ¯óé1ÖÊ´èV™ÝLÒOídÉäIL]^Ža틈O­Õ'¯ëÙ¸O]zO|õÓ^gú¼ª¼Ö«> †"""""’ 7œdh’øË^ÎD6 iÙ€?ÄÅV±5ÍM¬úáǶÎ{‡Oâr6½ÓLÝμQ°þt&`àAéBžX,`¥tí:ïZÅê#é8w±xò4~8™óÇá>%¨×ø62ý…\|LDDDDDܘ[V ]¦ Kî8ãSú·cö¬Ñ ^àÄ0­®Ú†.•ƒ00I]ÿCfÿL&àH³cß1‚§¾¶b6¢÷k]©äW™Fõ6óјgøÜ´b1­Fµ§{Ëp,€¥Ü½ôí6Y±Ò¦DÅæ]h–ËÜn±`1͜߇("""""nÍ ×)49½ìU^ÜÓ’ —Ë×ß 2šÊ33ýé?ú~Êæ÷"‰"""""ò¯ã†ÓGÓ9yì,>þ·d™Ô Â?ù8'SÝ,니ˆˆˆÈuqŸJ¡s/ó‡Nd]|fPu:?õ8ŠÝ‚¥43¸™ã™ùÃ)L/ª÷KÏÛ= ºU"""""r“rŸP(""""""ã†ÓGEDDDDDä"…B7¦P("""""âÆ EDDDDDܘB¡ˆˆˆˆˆˆS(qc …""""""nL¡0¿™çX=ê!ž³çß^trò‡iŒЋ^=zÐëÑ':ÿJﻧ׌ã™?aÿù¿íœs_äÑçò»+7Ût²oVžœ²ƒÌ\µ%7L¿yKŽsŦ¹Î°~|?†ÌÛKúu¯¬™Î/Ç2ø‰Çx²O_†~¼7—}+""""rëñ(è¸#€Û»¿D9¯Oäά^¸Ï»G2鎢،ÜoÞ<ó=3?N ñà~Tðùûë6 ›pà];ü;®Ð«¼l ¥AûÙöâ,ª1’.•½s¿ Çÿ±bñ1ª˜@—Ê^7ÔZ‘[ÅÍ— nYâ¦<Íô¸Lç“ h9ŒÑ]+` “ݳŸgòúÎ'Ÿ‡ù/óô"+Q]FÒ§q9ˇvv/ùŒÃÕ¢O„í ¯xxXÁÆõ:§%ã0ßN^È7»Nh)Nã‡úÑåöB€+a‹g|̺©€_ùfÜÿP;¢ƒ²vd&lgÁÔÙz¸ð«K§G;S£Ì3¬7”O~:‡Ýcý¿²‚Dãþ#éeý£õÁõèpçW¼²`5w ¹‹°Üƒ+‡3ˆB¡ž¹?x‘[”Ba¾±QëщÔ"“Ÿ¦<ɬ?½æAånc™pÿ.>ðÖÞãéVÙz•í\ƒýÿX¿ÙE­¾U¹ZÍêaðڮcàMÒví$í©gý„7'–¿Î+³—Q§FW*XÎðý{ï°±X†½]ƒ@3Mï åÝEÕ¯>†“ýKgðcø¼úl^Ø9´r&ßþt‚j±Å±¡4ø&ÞoöfE…WÚ6ü*óš-„7hDÄç?°õäÜ],—³ŸÍëžw*""""rËÒ=…·çñ_ù-£ #¯T%¼ÀÃÛõMµTjAë¨ l„EGšxг™`&ÿÄÖý…ipG5-€5„˜æ1xíú‘½YŸõôö$qÏ:6î:Bb†'­¥Glñ\Ÿ€FHÊ:ʃ¹û ™Î‰Í[9ä_’’×Q&¹E©Rx 1“Hö!è³# 6ÈÔ顔܂ë*ÜåâCFaZ<7‘r+Þeü”Ï©úÚ”Ïe¹Uiúè-Ä*D@z‰×˜Yéˆ?ÌþßNßÀ²WØo@UjGeê$ºçY¶|½WÍzT²f<¦ŒanÜ9\€Õ¯eJa3,—€V<½,$ž8‘Õ6g:)©Ž¿ïÌ•@|¢… `ÿÜÄB°P¦YC"ã÷ñk¢î-¹H•Â|âØ6•ç>ø‘ Àq> »ñ:O­ó[-zŽ{”šyP¹²†—§¬×wìûÍAýÛ®´A“s[góö÷U6²#%óêÖ:£0{õ%~Æ<†˜iZ ŽnË“ÖÂסzl¶Íz…A³ ,†‰-´]º7"èR<ˆ¾£ Åß›Dÿž&6ß Ê·@ÿÖ¥¸ü‘;fÂ~~‰/IÍ2×ñQ‹ ¦ž7#""""r#Õž¡Kä[†ÝÓñ^FwF?V‹+,Sø/çâØâ¡¼º³¯iû%)ì˜Ð{G£u=lFDDDD4}ôãE¥¶í)½c+]aê応™¸‘E+ÏÓä¿Ms¬úÄsüDzž·MDDDDäßJ¡ðc„Æò¿ûBXûÁ"öŸ/èÖä!×~øðcN4z”•®óñ¡•i}_%~ÜŸ'ûôeèÇ{qæm+EDDDDþu4}TDDDDDÄ©R("""""âÆ EDDDDDܘB¡ˆˆˆˆˆˆS(qc …""""""nL¡PDDDDDÄ)Šˆˆˆˆˆ¸1…Bù繎²äżµþü?¸;[ß}žyûþËÑ»~_Ä«o|GJnW ½‰úÖqd)¯õÁ²ß—þŸ™´š±=_fùép9TçnfžÌ6Göo½ù8øý« ¾„#ÿÊö‹ˆˆÈ­@¡PnÀ?x¡Ÿ[®“9j/èV\·Œ£G8á*èV\ENúÖy„S¿Â£m/î,iËŸv]`&ýÎï‰7ѹ˜+6JÞùwY¾bÚ—‡È,èæˆˆˆˆ[ò(èÈ?Ï<ù%#Ÿ[MÔÐ1tŠ´^øŸ§X>|k*¿ÌðNe°œÿogLgù®³8ïÒ±ty¬Õ‚¬·'¬bÌ 4Öœ#3f²öP2Ôä±wû“à à:µ‘†Éö£çpŽ¡sßGhžu ºv°xÆÇ¬; ø•oÆýµ#:ÈLR÷.eúìÕ>oW½—ÝnÎoâýASØ’ŽñF_~°¶Zô÷(5ó#Ÿ˜çøéÓÉÌZsÿ°æ3N gUpž&nÁG|¾ù(éN'–К´ëÑú%l€“ßgì’_IÍÜÉs½?ÁÀ Ä=/2¨M‰ÿjsý} fÂvLý˜­'€ °ºtz´35 YrØ·&)›²"µý›†ý½Í$nŸÇد7r8>¿èv<Þû.Êx¤sø»ÙÌ^²Ó™†­(ÕÛõàþÆ%ðÀÎáo¦3sù^’LÓô§|ëto‰7ùó,†¼ý 'SLöû àu?/÷åÂá]ƒ“=3ð‘ë.9fïéxŽŸ´R¥k¬S `^ã{aßð¿÷§¾íÛ£e›"ì]»‘_‰¥ÿ í(ãfâÿ±tæ'¬?˜‚3Ó$ òÝ<Øý"}.kœµÍþÛoÆ/dKóÔ̶á""""yJ¡Ð a ‰þŒÅk÷Ó>²6ÀõûZÖŒ¤ÉãXqqüëi|ü{M†¼Ù‘“¬ý3Wel÷ÊX# (E=å‹ÉNju~‰·ªÆfš˜9½~5œì‹;Fï§ÇÐ=0‰ ï¼ÈìÏwRû‰Zx™gøþ½wØX¬ÃÞ®A ™À¦÷†òŒêWŸóßÎ^­ÝÆÄøa8N²~îBv©CxYøÔå±ñ>Øú}ˆÏSãx ¢5çc&ðý¸ç˜»ç¯5¯:½׫ÙåJÇÏ‹øpµ{G¼M“Âv|>ž7NÔµ¸8öÕD>Ø^~CèàðWãóÎbŠø/V+¥Ûc¨÷«¼¸#–уšâŸÛLp#}k8Ù¿t?†?Á«ÏFá…C+gòíO'¨[KNúÖLfûºŸ¬7”È+uVæ!¶lÅ€]KßÁGÃÞfá†ú<Ý4ÇîOyçãÓ´2Ž;Kz‘þÛ"^mKK¾FÇH+fâz>ŸDãQ㈠±à:÷# ælã@Ã2DûxD?ÈÈç<2ú,'ôÎõ+œÚ²‡À—ûót+)?¼Å y_Qÿö©huqâß ‹Õ ý@*åÞ|žrÓžäøîŒ}î!<=—¸£÷P¦të>x›53xt]B9ÉÚI¯2éãpFö¨r!ôf±•oHÀlØ–L½Ø@ EDD$?iú¨;0‚‰iZû¦5ì¶dòëšuœ½­9 Š€…ð»_bÂKíˆð¬E¨r[QRΜ!ãÒ6üðóNŬґŽÕ g%ÃÈùÅ«i!¢É]T ±‚5˜JÑ%pœ9MŠ fòOlÝ_˜wT#ÐXCˆiƒ×®Ù›6¼<ÓùmÓvïOö—S™ƒ@NNìÙKj…zÔµ‚áKÙ;›SùâÏ-®Slßz˜ˆæ÷P9È †7¥[´ä¶ø­ÄÍ£ûo¤oOoO÷¬cã®#$fxÑêQzÄÏùç!öô¤l…â\1Ž[ŠP§U]ŠÚÀ¨Ltœ=ˆ '·þHÒm͉-™‘¼Ë4§qÙ“ìØq€Å/óqßÿȯ§R1ƒo§sŸDûæ]l²UnD"€o©ÒJ!d33…ä$¥.ô•Ù&têÝ„Nf ûVòá„wø<âMºVÊÅ4áë‘ãïÅUøèYŠšÏ§m‰œž¥š8*"""ùOÓG݆•ˆ&±”Ø÷‹Öì¦HlSÊ^üIÀL%9Å PÉRXÁynëâÎàtdàȇ‡:U©u– «vèœgÙòõ\5ëQÉfêvæú€õ§3ïÐJò¼P»¸O¼liœ:™”Uƒ²'“fÏAãoxú¨•¢åËáõËlOtyžßV}ÇÞ‹sPjÔ‰äà·ËÙŸb&i–1í½•ºl O›'fü NeUMJ9Ÿ'Ó³ë[Ìx6LÃܸs¸«_1Ê” ÂfXþøã]ßÚ‚ñIæÜ¹Ü>>ÕJ™Ú1þß7|wʤø†5KQ»V1,€cÿ"ÆN\Îïö¬v—,C˜…?½'¶ŒÓœˆÏL©©¤çÅ“\oð{aøV¥Îmñ¬_±sNÀLçØ÷3˜¼x7éû¼‹sñÉøê—:Éwºþp#FXš”[È´Ýéñèe÷ŒY#iÚ¾.ïÌÊKkÂ.Z6÷Ýžw2vv!^èVß´a…iÜ«/ñ3æ1|À LÓJpt[ž|°¾àW™Fõ6óјgøÜ´b1­Fµ§{ËðËŽ¡Mî‰fÒì<6Æ·8Íz£CÔ?\M¼«uäÁÚ™7¸‹ ¥bÓºÔ >JÖ—Â[õ摤é|ôb?ì˜à[†ú{ðÇÊ 1­i¾n£_ÅÓ—ê÷3ð‰Æ¾ÑÂQv}KÕc«°mÖ+ šm`1Ll¡5èÒ½ÑOïÌ®o­”/ëà«ýÇpV¸ò}…Wa‹ú/OÞ?›Yo dU&àSš:½úqgɬ‘µE6$6x“/Çiµ€áG™Ø^ÿŸY½ð m@÷!ÿ£ÆÎ/Íæ{1¨b6Ÿ7‚©ÿð“ÄϘÃÈ3p^á1´}¨<Þmšó(ûÍ ô=¥õKˆˆˆä;#Õžño]àKäæ”¹“éýgàýÔX¨ðχ҂g’²q"Ï/(LÿQ])Ÿ¿ËÞ{g3düiÚ}ŠúšB*"""ùK•B‘eÿ‰¹Ãfq¾ã‹ô¬HÒÎüì*Ë}%n0šÉìZò ›N^e.¤Lµv¨]¤ C„í{¹sÙ(}×’-¯°Va~û×ôà:ÉêëñiýµEDD¤¨R(rÜœÚ4›©Ÿlâ”ӊųu»ô¢SÍBŽò‘ãÈRÆŽÝA­Aƒh]RåœÉäèW£yãÇê<ý\[J©ÛDDD¤(Šˆˆˆˆˆ¸1w*dˆˆˆˆˆˆÈ_(Šˆˆˆˆˆ¸1…B7¦P("""""âÆ EDDDDDܘB¡ˆˆˆˆˆˆS(qcÝwá:º”±c¾â÷ '^%[У'n 0 ºY"""""âæ´x}~seÉËCØÝl<Ï6F±PDDDDD ’¦æ7kaBC Ž‚n‰ˆˆˆˆˆˆBa0ÕgEDDDDä& P˜ïl-ʉ›9”ê*èÆˆˆˆˆˆˆ›S(ÌwVÊvx’¶,å•ÞÏóÙAgA7HDDDDDܘž>šï\œøúC–¤7cðÛ¨l-艈ˆˆˆˆS¥0ß98¸çaub‰ V&‘‚¥P˜ïLL,u½ˆˆˆˆˆ<%“|wñ±£Z¡PDDDDD žBaŸJd¯|IDAT~sœàØi >Š…"""""RàtS[>q]ÊØ1_ñ{†‰O…ô¾Ý¯ ›$"""""‚‘jÏÐ2ê""""""nJÓGEDDDDDܘB¡ˆˆˆˆˆˆS(qc …""""""nL¡PDDDDDÄ)Šˆˆˆˆˆ¸1…B7¦P(Ïu”%/öà­õçÿÁØÙúîóÌÛçü÷QPL¿yKŽãÊë-'­flÏ—Y~ZË™ŠˆˆˆÜª %WÌÄ_øqÏÙ<ÿ8×I޵t+.“—!ËűÿÿûÆDDDDDn Ýwa&­æ§¾§ê˜a´.b¶N|Œ…Å^bD§H¬Ø9üÍtf.ßK’i`šþ”o݃î-#ñÀαuó˜ýåNÎÚ3É´•¤î}Ó±Va¬ÎÃ|6d4ñž'zÛ>Ý|ŒÔ b£ke+džd㜩|±ã,N‹ ^¥iÜíÚTÀÈÅq8ÇÜÕU¨Z©0žyÜG®Sùhø—l?zgá:÷}„Fá€IÊÞeÌš»’}ç\xS¢Þ}tï|;¡V“Ô½K™>{5‡Ï[ÀÁUï¥G·†„Û€ó›xж$¤c¼Ñ—¬€­=Ç=JM[vü+óŸξcy¡u‘ }åäà'ƒymߌҚ"$³ç‹©Ìùv?ÉN0*вG/îªè‡˜ «3h‡5çÈŒ™¬=”L5yìÝ¾ÄØ¸±±1ϰzÜP>ùévaôÿÊ Fû¤s”5ë-‰ÿÇÒ™Ÿ°þ` ÎL“€Êwó`÷;ˆôÉÚº™¼—å3ç²zßÎÛ ‚*Äòßչ`@âöyŒýz#‡ã3ð‹nÇã½ï¢ŒWöcz«œ÷""""·2…›„™¸žOç'ÑxÔ8bC,¸ÎýÈ‚9Û8а ѾŽ} x{ÖaNÛr¾¤íù˜×Ç¿GÈðhf€5Œð°ó¬™;…䨮¼ünAVÓ̺ôµoŸÏìUxáõv÷0IÛ½˜Ùq{8W©6!7xuìÜ3‡Ç}KÂ_‹_ÖÒ´úw—ÈAAÚp²/C÷À$6¼ó"³?ßIí'jᙲ•Yo…ÙõeÆ6 Åš¼‹9ÃßâƒB#yþ΢®c|;{¶vcã‡á8Éú¹ Ùy¤áemàS—ÇÆû`ë÷!>OãŠÖœœ5’ÆMJ±rí:Ž·º—âÀ±—µ?$R¥sB pî[Ì´%çi5r-‹:9¸àFÎXAµ(i# (E=å‹ÉNju~‰·ªÆfš\š#”fßÄûÍÞ¬¨ð CÛ†ÿ¹üo&°îƒ·Yø0ƒG×%”“¬ô*“>gd*x™ ¬{<ßêÅóãjb$÷á+L~?ˆ/´" óÛ¶bÀˆ.„¥ïà£ao³pC}žn|ÃÁêß|Þ‹ˆˆˆÜ* oo¼Ì#Ä}ÿ#%DS&ìv:÷¹ý‹NmÙJbô}´*—U}ò‹jMlÄ3lÞqŽ;Z†`௟$¿:¾>%‹AÖ}w&ö¤2Âñ·üñ^ÿ€HM&Õ„ K-ú>ƒõË,ø“R©Øà?Üw_JyçAË‚ë[}>Ÿ®ÝGûÈüøÝ6|&ú¶ÍóGØ4!k÷Åã°X1ìgI4«]v× añ tÙÒWüÂÝÐØd'-™ÇqV}е7ff’žM’Ì”DR\ø_vÒØü¸0­Ö0|ñõ½øa‹Ì<ºƒñ¦>ïEDDDÜ„Ba>2pa^º–v‘aþéUÿ²MèÔ» Ì ö­äà ïðyÄ›t­dˆO­Õ'†kÝÊeõ¸Ê>¯Û‡ëv€ÌD®›Å¤Isß—Ÿ;®<™>zU^Ø’“HqqáÑH&ÉIIA\ÖÊ´èV™ÝLÒOídÉäIL]^ŽaíKÜøÅ¿áGõ¦µùø½µüÜ*’µ{ÂiÒ¥ì…/“_?ŸÀœƒyþ…§‰ô³àüy:'üõ¡6¬Ö«ÌWüÇÿ =KQóùá´½Â8˜Ž@ü$’’L.”Ù0Ó8!á!×<×rêV=ïEDDDnú±<Ÿ>AyÆsâTγ[ØúËË#8ö/bìÄåün O‚K–!ÌǂŰRºv‚w­bõ‘ô¬Ï'îbñäiüp2'ÇV½Å[ ÷’fA„GÃϰ`Ƀ3ÀZ©+£§Lãý©ù÷þ° „Yl•êRݵ•o6œÆ¸’vñíg©T·:þ˜©Û™7êÖŸÎ ¼C#(]ÈóBµñÃ/[§N&á\ödÒìN±™»fñ\¿a,þíïËVxE7¥žïN¾›¿Ãå›Ñ Ø¥²©É©x†EîgÇ)6¯ý‰ÔLŽ­~‘Ó±qrð³—yúÙ™ìÊüë6¬xzYHïEDDDnªæ[UZw¬Àû¾ÄˆÐÂø«BTõ`Ž»²‚‰-²!±ÁÓ˜4x9N« ?ÊÄöâÁ Eñ(w/}»ÍcÖ„A¬t€iQ±yš‡åäêÖBxíf”š6a20¬&†wqbzõ¤F.KAUa\Õ\û 2üjÑ­ÿIfÎyÁ œ`  ll?Ž-”5ÝÔ¯2êmæ£1Ïð¹iÅbZ ŒjO÷–—=tÅZŽ&÷D3iö›aÃÛ?œf½‡Ñ!ê»âLG2çIs\¡ÖHš4 áÅQ{@ÝËRâAåÖ¨øÎt†ù’BAÅ©Ûöšü2…9£øR*^óèr>6™içHHHÁñ·Õ,<ˆ¾£ Åß›Dÿž&6ß Ê·@ÿÖ¥°ÁÔøIâgÌa䀸¯ðÚ>To 0MëGÒŒyŒxj™.ð+ß”¾7£°‘ gÜ"罈ˆˆÈ­ÌHµghUj7¥J¡ˆ\ç‘5|²|ç¯òºµt3ºÜY!Ï׳‘¼¥J¡ˆˆˆˆˆˆÓãDDDDDDܘB¡ˆˆˆˆˆˆS(qc …""""""nL¡PDDDDDÄ)Šˆˆˆˆˆ¸1…B7æ>‹×;÷2èDÖÅ;pù–çîÞOrW9ï‚n•ˆˆˆˆˆHrÃÅëíì™õo%ueBŸ< º9""""""È §zR¸H0.»WA7EDDDDD¤€¹a(£  """""r“pÃPhà_¼8þ‡~dëñtÜlˆˆˆˆÈŸ¸a(ïªÝx¼ñf?û8cVQ0·å>O½Læ/˜±Úv¯N¤UÙM'·å†•B“Ä_ör&²MË`-èæˆˆˆˆˆˆ 7 …à2M°XT!·ç–¡0 EDDDDDÜ0¦sòØY|ýÝó†J‘˸O.rîeþЉ¬‹ÏÀ ªNç§ns£ƒ¹2#Õž¡DDDDDDÜ”N‘‹ EDDDDDܘB¡ˆˆˆˆˆˆS(qc …""""""nL¡PDDDDDÄ)Šˆˆˆˆˆ¸±|\¿ÝÁöiÏ2=ÎN&ATùï“<Ú¬„)@°x½IÚ–I<7;>oþ(kþî]DDDDDDþPÓG ¼B‹à—iÇ‘ÏqTDDDDDDþ¬€î)400Q&)X -…JP̵Ÿ¸gqDDDDDDD( Ph5à¡^Ñì}§}ÞÞHzA4BDDDDDD èáŸi;X0c;¥º¿ÎÐ&%ð.FˆˆˆˆˆˆHT §öóKF4 –ÀÛ(ˆˆˆˆˆˆˆÔƒfL¦ÅRPO¹‘ ”ËDDDDDDÜX„B“´cÇHò&@SGEDDDDD T>>hÆÁöiÏ2=.L£õzsî™sUŠ¢(!„Bñ7¤–&B!„†…B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„0,„B!Ä…M{¶7Xd¯à‹Ü…üZ¸«Ë@ëÀ8FÆ]ÂÀæQ«TÒêB!„â‚ RE9[°ž'Ö}H¨1¡Ñ]‰0áözXW¾“_ ÖÓ9´¯e܉¯Î$-/„B!.ž0¼¡<‡Û—O`D\OƧ]NýÇNçm–½<°rÉþÍy§û}¨b!„Bq~•1Ã^Eá…¬ÏÉ oËcí¯;.¤Æóz×»YUºŸóל“Êy*×3còDÞŸ½ïÅ÷â5¦~ž²|ÍÒù~ß2Ggœr»Šm_}0Ÿ"s{®×—Hm}(ûôóÕTE 厫Zb<Ùúî:ìN¨³;¨ÏoNöý0…Y»"¸ìŽ1´øÃÊr¿y—óØ1…1· ¢¹îtZådû:Ñ[Ù2ýC›i÷qôk¦pà瘱ÝK«ÑÿdHŒš’eŸòåZ+q—ßÎåþ§S¿Spìâ›wàPõU† ¢[u¤gT" Ò‹/„B Ã'´µr/A?ZÄPX[Nˆ1½ZËG;æðnö÷¼Ùí^zD¤’žÂÄ-3ÏMåºsý]ðh èԀ⠺Æ}‚¥Õ˜#âˆòºðÖSdñ€!„f!4挧›Oº¯P ÷bå5.·s ¸€¢ü<1¾ØÊl€‘Z´¡§Q?ÕÁÿNÉL³¸ œEùämú…iV®½:“ÓÞŽB!Äß$ ×z˜µGº!ï[ù6Í|BH ŒãƒsøOÇqôˆHÀWëƒÝãÀ«(gef‰C=Åž6™$Y7³9ÏŠ:$•Á£ú‘`_Yߋ֗›ÿÏ®Ÿ°¤àsÞ›ˆ©íUÜ<0Šú_Í.ÉU€#wïþxCb?F]Ú Žâ,æ-üìRú–t¿téázðÖ³ô'o*Àæ5’܉Þ}ZPþçÇï«¿{]¶_b}µƒÿf°¹k™ wL%y–ú©Ê+¡.CCyµÔDøiŽô’Ÿ¤~c;Ü´«Œ ³?fÓž*TÛ'ÙÜÀ(c=‡ ¢¹RÄŠiÓY]¶Ž{ÓxèÅÞϲ¯W“[hÇßÁƒ»ÐÜ(éX!„MÓY3ÜÌL‰½»ÇÀ+]î`›eíœËË]ngXLæáe÷Z ‰4õ)Ö¬Û'×Il  wù~ÛXçèTzBñÀ@tëTÚÆ˜ÕŠ-—ù3“]j ®U2U;Y<{Enpì[Ìü¬êBZ‘Ö:w¥ •ÖÐà¾\ -«9ºT‚Ã1¶R+ŽÊ}”y}h¢ò}TÔY©ïŽ$àØ¯1§ª_åf6”¨1ki¸}Ž¥ 5=pS¼§òȲÖ]ìsúlôR³ws–È»H!„ï0Ü5</ óòWïÉÛ™÷òZÆôêxx9·×ܼ•ôŒHkä–O2çıa:¸'WŽÆÐ¾‰hš’šc°‰ØÎ‰5„Ò¾Ïz¶@sê(ŒuÏ:v9!¨Ûe\Ú¯ý;u7¹•n/ ÒúÒ¼ÃPn¼¾/1FŸ÷¥nhYÃ÷¦õoFà®)§¼°»&”V-ƒÁQLAEh‚"ð=öÀOU¿€.\sÓX®¦¡öi í ~T€«Î…÷¨v¾úºpõè.øµ{så]$„Bˆ¿w1ø3*îÞÞú-y¶ZÄÒ+²ý–{kÛLJë,ÜØbp㢰VWæ<.<'€S<.<€Z«ýãÁkê—Uü¿âQ8;({°WÚ¨\9)ïNaÚÊJÀ‰Ý¥`ŒïË€¶!(…ë˜7í>ú~%®†·Ô¨eõADøµ¥åWC@ QÍ#0QMþbê;†N|‹Þ“Ôz#ÚFµGµÐûè´õÁöÕú†`8ø`!„Bˆ¿m¸?u Ñæ0nZúsóVáòù!×Ú2]3…i»~á?ÆåÒ¸jü‰ðê°¯Ò ¸©Ú·+àá׈^Ý*¬®¸.Oc£²S@ýCBÌm0bÔ(FŨÑWª­I}¯ãŽq#é«§vïr–í«kx_'Yö0­?ÍÚì)q¢$08†`<”íÞO #|OX÷Ó¯ß 8‹Ù˜Uh‰Œ:jõÛuUSà,ï"!„B4YgíqÌFžzŽç­m3ùφyaãgüq{=Û+ˆ÷‹äÝÒ9´Õi]mR‚Y·ª‚Õ_þ ‹¡mëú€æ9ƒÔøîØŠXúãŠS{Ò«mà)Bµ ߤŽ$ü6=Û—³Ò•H0ÕT™;sy´BͶøb‰•¨ä(´µn@‡É n`_Ýé ZÊô†–ý~_C¡ £ÑLDÀ’ Hm£ë×#â4_Ⱥ},ûñœEù”;€ð ºÇQü!¥K˜ñÕ´å…XðÔò.B!D“¥>›3htŒO»š½ÄýmÇpió.ŒŒëÉäîðM¿ÿž^®Ow„fŒ`X§XtµX,vt±tºü :ŸA¿°Ê–}{ï«¢®0—œý3ù™ÊÜŠÁ£ûÐ:Šs·’}À†Në­€& –Ä`;{·nbg¥/1Ó«¹¾Á})þ'Xö˜ï'þÍŽ•ö!"Ì„JãOTØÁIŽ5ADøj]?×i7’Â}ù”+4OíÇ5£»zTöHË ¹§‹b¦Y»¡ K’w‘B!š¬³ö8f!„B!šµ4B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„8W´]°ªªJZK!„B4 ZN¥(Š"Í%„B!þŽd˜„B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„0,„B!„„a!„B!$ !„B!aX!„B â‰rlaâ}SÈqºÉŸþ/¬¯g> &ÜÆe=ºÐ9c7>7‡ýNe¿½ÁmÃÑ¿o?FÜ÷1›j¼')B!„0,.`Jm!ù†dÂuNŠr!9Ò€»,‹µîÁL˜·ŠUóž%uÕË<·° oízÞ|a9ퟟÅÂ_¾áÿ‚fñÂô½¸NP.„Bq>h¥ DcÔm~ƒÛù†mÕþì¡¢ª æ§šü=rè;U{ú¤èY¹Ï‚ÛQA±7–! fTj3éýâ¨_ëå(,„B4A^¯—ªª*^ï_·W­Vc0@­þóýº†E£ÓàÝgí<¶ãz&\YLJÍã’W省áàŠ“òMßòéæpÜ> ˜k»NáÝ)KI¼;œE5tÞ S€«Ár!„8ß²³³q¹\øúú’ÐÈ5«™3w5ûm:"Òú3¬O üÔ'*oĺ^ ;–-à·-X312¤{>*yÄ…Çb± Ñhˆˆˆ@¥úëOREQ¨®®¦ªªŠ   ÃâÜqYÊÑE¢ugSL‡Î{Ï_ùOfëI»ý=nheµ–6½;â}2·Ï+¡:ê&>J÷C¥v7X.„çÛòå˱Z­¨T*š7oÞø0ì*`ÙO›ñé}÷ÄÚX;s6 vD12ÙÒpy3ªS¬;Ä´Ž­Þ4Fß~%þöü<}>ËâÆ2(Z//”¸à8"##ÏIP©TøûûSTTtV¶'c†E£ìúô^n~~+_¿™«®’¹k>á¡Ç¿ã€0¥óÄœÕ,ý~ÝVçîOvcÛõ ÄS§1ë›·¹=x÷¿ºšŠÜ†Ë…â|²Ûí´oßFƒÉd">>žÊÊJvîÜyÊuÝeÛÙ§K¥K¢ZCí:Q²5Ÿš”×Ú²ùþýXï<áºJ|FõkMN…Æ?Ôæ ¥¥vy¡ÄIQ”s„ÄŠ¢HçNÒ/óÔà®ÜòÖ4>e ]ǼÂÇ/ ¹öÈ©äÓ<“ëÆ¶"oÁ26-[LM»>$™T¨ýÛ2ú_WbZù¿/n¨|4°⼩¨¨àË/¿dÆ $''ŪU«˜:u*6l8åúΪr¾áøjTèCÑÛJ©ªh¸¼_B## 1©O¸®Í}Ô¼uTTƒ Q^,!þgm˜Äª’mLÙ6›lË~l.ùözˆYg¢u`,·§\AFx›&\%jšjqï)ˆ´¸9ðÝ3¼g¹Œ»®îB„+—y3·¢M¼–„6¹Ô}÷#ë+Z‘ä`ÏŠT† ¡E[u¯_.„烢(üüóϘÍfFŒAuu5yyy\rÉ%̘1__ßSmÓ‹F¯9<ôA¥Ñ£ñ8pº.w¢éqE4 Psà˵}Gþ*ÖÙ[0$Ú /˜jþ½x O¯ùˆgºÜBzH LZyÃbw;ØP–ë§ð\—[é‘Ò4+⮢ÈBK#8ËËÐF EKd¯a$¾2‘±}wRáò!¶×M¼4>ƒHÿ^ñ,/^7˜§ ƒyèÙá´l6¨Ár!„8JKK)..æšk®A§ÓQZZʾ}ûèÔ©Ý»wççŸÆáp`0œèsM…F¯Áëts膭âvàÑÐë.×6bÝCË(¶\ÍßOLÿki¦“×Kˆ 6 OÞ2‹wGfDª´è1LZÝ#SyªÓMLÞ:«é†am ×¾õTýŸ½Áë‹5ÁŒ{éKÆ·‚?éc_嫱ǖëOP.„çžÅb 44”yóæ‘““C\\áááTWWvÂmèBÑ[K¨ñ$aÐ(8,e8}Ó v4Xî«=õº¾ZÀYÈÊïQÙö ®L0!Iñ×8+c†wVåÑ¥Iøëu oC¶eŸ4„B\@Ìf3•••\vÙeÜÿýŒ9€òòrT*Õ)‡JhCÛàÞªœ*\uEl\g!2µ9¾'(7:°böÖ—»O¸®Ñ]AÖ³ÙÚŸ+ºE"sHñ×9+=à ƒFîßœŒA£ÇáqIC!Ä$**Š   –,YÂå—_Ž^_;m6+V¬ !!“Étòè"é>¸=sçNeÒ<íry 3*µOƒåØó()(Ä\ë…†Ö5Qµa‹÷Ûù`Û¡äÞžûoí+/šg™J9 óR¤ÏGÖ˜Ok‚Úrfí]Ê6Ë>¼Š½™>ÍÒ¹´yÔª‹s’‹3i'!„­’’fΜ‰V«%!!ÇÃîÝ»1 \uÕUøoDEEözŠÛA­Ý…ÚèƒI§>gû=ÖyyèÆ·{—òʦiD™C鑆¿ÎLNu>Ïl˜Ê¹ y£ÛÝ„›Ö™àÞÆø¹Ÿ×û9î g™ñ÷á$÷Ó—YÖíanj)?nŠÂÃùþúëÙ°aEEEh4:tè@‡NòÃ9!Ä™Q¨+ÚÊïË×°5¯êðÌ)¦ðVtìÞƒÑ^rWïÀ§C±¦s3Rþœ§¶ùÖðâÆ/x¤ÝµŒŠï…ú¨IšKê,<ºæ}î^1‘O{?ŽQ#£¤„¸x¯‡6v-ø‚Ï~ø]7æØLFÞ<–AIæ3ø¡PÛ&=Ê™/ðHGŸú"O%›fOåËŸ×sÀ¾1]zýX†¦ø£9xA¶ïYÀÿ>˜ÅÊ<+š€D2‡ßÈõ“0>eóŸæÏöÿqw~½yjâ?i©\…¬ßF§1pç1ãáÇ™óoÞß߃ÛqîúŒ‡þ³˜¤G&q_ªñ„'=o Ù?Må³W³ßª& 1“+n¼ž‡ÚËÇŒÇ^¦ü–׸£µÌG{ºüüüèÕ«—4„)UÛæñõül:‚xjʨ(ÙÁòïrØ ¡¦ÊLfëÎÄš4_®ó8yuÓtnk}9W&ô>þÛ¹1‰ÝþŘ_þÍ»rKË¡MèVÉL„h4ù?¾ÌKóƒyÇËŒO2R±q> sÊp&™9ý¾8µÕ¼‡se¹_¿À«¸á¡‰t‹RÈ[ö“^{çÓÿet¼œ{ùö­™T x7ûÆ¢*ÞÀ‚_³)v$’h<”†5„zžÏÚn YSžc^Òp’~Ww—n"' 3C€ÐèÐìZÂ[:ùª'y¿oĮ՟<äŸôx<øé5^ãÏèû^牅=‹þÇÛ/¾Ï?ÆÀœRBˆ ž»l-³çç`×ä¾Ã‰Q àÆ²s3æn£¦Ê{Î뜆áeÅ›©ó¸›|éqÿ¶ºt;ŽGgpCò fìYܸ0ìÞÆøŸ¦EvÑ~ íboæÕÔT‚©fmÎ×¼µs5›ìn‚Ã.çµî#è¨W·„Ö½ÃkyEÔiÂè•rÏ$X¸þ˜²Ñ(UKxaÍ÷üZmÇØ‹'»_M£ [åBþ³j& jâ›uÀ¬¨ˆ‘s]ˆSR¬›™1§šž>ÎЖõ½˜æ®Wœ¢O¡.ïW>™2‹uv ±}¸ù¾kèhÌæíG¾%ñŠD6/\˾b1ÃäÁáál›ø0on³Âö{¸Å/•;ïÆ/‹Ü xôú%ÕGëVoå®ü‡yãÛÍ\ú@'|]ì·“Þ9™` $t窄“·sï¾ÊïÆÝ·„ì]ö`Ù¶C§^Gz“u‘´+bév+»ø¡ræ±";ŽQœJ5«_}€Ùiÿ心ë·aß:‰G¦'ñäÃa'>žÚí|7§ŒÎw>ÌÖõ=Ám‡ÝÅ­»æãÙ9\rkk¤/Xq¡Û·b å@D¯Ñ iÄá¯ñ+yÛwÕ÷Ÿç´3sWõRãÐktx…Ö°¦,›ûW¾C‘½€ôdòl%Ÿ}ÁSB¶¶o |‘Ÿ/½žð½ñVYà¡NÝšûú¾ÉÚ‘Ï2γ€Wö–âj˾ebY“†¿ÏòÁ·qeX0žòãËô®¼±|6®²h䛼½—W³¶PåÚÁ„å3)Œ¹£&òvbV·WÎt!ÁY°Ž]ºT2ãpŠ}Ó^ÿÏ¥O0éÃI<ÒeŸ±›ØsXœ×†[Ÿy7ŸêEùÜ™lµ™éxï3Œ3’rÿ;|4éAÚÕl"Ï”FFÌQ}Ì*ñÝۢݻ‘"`Jf`z 3_ŸÂœEÔê§ÄJ ›¿_EÐ~GC®T³=KEÇV~Gz}½j"º¶ ä·íXpæ­`GpWâô ¨üHéßËŠ ”{œä­ÊÅ¿[:!æ³p9¤Ð«ÅQCHT~´éÝ×ö,Še¢!D{À š8º´9*×_Ð0E§“‘‘AFF]{t#É÷ÜÝñ:§=à  :8F¸´®’g³>eQáz–nbl‹K¹©ÅàƒM¢:¸|#'ºP‡Ñ;&‰@`lËèp/ÿ.(ÆGÏäž(^+û*Kð5–—á ­>_g¿••‘GW8,Ç—ÙŠ²H7˜©±TÛ—È]ØZZË/ªž¼Óº a ¼=-u/ÚØîöòÆÚRí·RRën2Çœt ŨU_ôuj*¼µœÆ$Ì ~]îÖ™‡ðtf$zD÷èGÈ¢u8»‚.Š^ƒÚ¢UAD¢Õ(²zᘙ¯¼uÕ8 Éø³})£³»PÐùŽç¿è[f~ô(34© »ñ&Ftmð¨X·³hw3zßâ8*Ö\Ö;ÒøGÐÑ;ò¢‰éIëŸç°µ¦a+vvI/Œsê¯næÖhm™AVù°.ÛD—Á¡hÔÚÇZB­9‘c›« ŠÂl/¡ÆÃyú9´B4žÍ ˜ü1;¯&€äN™$Ÿ§ã:§—Ï$¿(¾Ú½·×C„)˜ÉÝà®opC‹AÜÞúÈ#y·Tî&Úv†? SaÒëp8êð*VÖeÿ—öÕކ抷¾÷Ö8’÷2æòúæÿÒC27t¼™[#Ž-»‰ö *,?pÛO v£»©Q¥b³—ã4¤þ7(üúÚR¾Ê¶4¹ã.©u3m{%u ¿èëÔT¨MèíåØŽ q u•åTïÛ΋/¨Ï).jUíð÷VW£U+x˜Rí„Á^qÜö=¶r솠#!Y@ëãx¢ÿUì[öo½õ"î¿ÈÕñÇ_{ykÉ hO¢Ï‘‘¿ö=k©nu¡Çv`bé™RÉ÷›v±+’^#|±Ì9xØ>-è×¶†¯³*èÝ6‹-ÚNÜ®=éñŒPkP{]xŽ©ªâqáUiä÷ Bˆ&!ÈöÛʨ¨Shæ{áþy{ªÿuj*ôQˆwnfùÞºã¾Ìƒ‚ð½œÇ^™À„ ˜ðú[¼;៴6œô;ð·ß¬ñ®Í¬ØwÔö•ZrÛŽ7±=‘ºúà}8G«ÍÄ]òFÅW±%·šãßÖ,»óñFDãwø"RÇþµe$tˆl WAOL¶”|;Í=iåsôIꛆue{6oěޙíÉG¿u¥å_ì…û°úÅ$½ÂBˆ& U¢PÈÊ5ù8ŽëÇpSŸGÕy¸Q{NðYkäÞ¶£y{ë·ÌÉû_Ý‘û›UN÷¯|JÃ-5~ÃÞ2–ååPâqW0‹wÊ#ŽÊUM­¢l5˜¶¿çÁ‘ªÒùL=PŒAæ|pSq\™cHú8bž<¬ ¸yl¬©Ã”I;ÇRÞË+¤ÖSÍæ= XíP.ÚØRçiÒÇ_ÙÀñ_Œuj*T~í3Ø—e“Þççí%Xk-ì_ù9/NX@Uü@:ÚæðÅ’ýÔzÁS“GNaÝÉM©ŒøBYn1un'ßvŒhbé¤Y˜SŽÍZFöü)¼·*€Á£R0« .÷Kž|j ¶P]k¥dë/,Ì÷¥E¼F7–üj !æ#_¨¬?ÐŒŽÍ¾ƒ¥Î¤½ÊJÌ%-ð9&¬â{“n[Èw‹ëHë…Ž“>¢3]üsùyMù‘rO +ì%(#0 ÃBˆ& ²k/tP³ñ[¾Z°‘üj7 ൗ’³ü;¾øf&_þ”MÍ9îh<ç—Бq—`w;yvç|µûWzE¶Ç_çCNõæXCss(“{<€Yk:HoÂlË-³·R¢KäŠ.wsŸi8ÿ x“;¾[‚_pOn‹oE@éÁU´:öl~™þ«jðh£¹,ýN2Œ[ykÃÑewÑÙJûž#yyÍ+ôYW‹ÆÇÐvw’×™gìbüÚÇ龯vIè_*gº¢'nÄcŒ7~Æoçó/>Ñ ¿iá~f®ÿ¿Ñ|öÁKÜõ‰ <™WßMBç“…a3)#à÷úÓܺ°5cŸ{”#ãAíÇ|þÚýL­UÕÏ3üÐ#\S^‰Ã{É4¦Oy’O+\¨üèyÍü#©¡pëÆZé@k:”ÝÅYìî̈Mã ‹c̳/ã5ù€rL¸>–K:8yry:cšëN}<ªh_ŸÁò·_åC×ÕôŽUØ³è ¾©êÎýƒ¢\È=U,þV–¾6¦òÙÔGätB\Ô¾­<²ŠÙ³~çÀ¶_ùfÛ¯Ç,HÛÖÍü=É_ÚAs¾Ǽ±bu'Í|BÎìqÌîmŒŸû%múþ—›ý.ì¹6›òã˜Û}²£É¿ 7ÝÔꢯ“8W<ÿô2_ÿ‹û»úÁCB<ýø4¯–ŽãÅqÉè¹NUö/|ûÝmµ’Ðk ×\562ǰâü:ÝÇ"{ëŠÙ±n=[våSVãFã@D|kÒ;µ#Î_û—í÷DÎÛ͵(ŸîNyÖ¶×è™'Ä…ø]‘–Éþøç[X[wÚßçˆmÍé†Ãj05ä¬Ü͵Ùn¾)ßèhæ¦Z¸lž»Ÿ õcöy|mUÎS]ÅÃkaÛ&-o;“§å)¸Ë×1ë™ÆÓøŸ kh=ˆq¶ÂÿßϱJã¯FÁëq£¨µhTò²œñ燣˜mY»¨ I¡}r ZÀU¾ƒ ;íD¶kGì9ì¦Rl;øþÓß0ËÀæ:yqÄÅù©oŒ M!´éqaŒ4À»BC—Vø•U±¶îtƒ¦Âþì<.Í>xBû2©·ŽÉ»ÎîÄ«îš*_`£ÂÖÀÌ€÷Ôõ晪 IDAT´ö#þâs6„¾<|&g?<Íãߨhwõ ‹>ƒK°>Žÿ ÕÇ_òâ=ïRchÏݯüÝ$ ŸiWJMö6ÖÅá»|!±Ãˆ×;È[¾KHy›£iÞ-”ö¿»-ìX¶€ß¶`UÌÄtÈîqÇoô×{cí{dbþ3Ï.òæ~ÊšÖ×3*Ñ /±ç" 4:Íyø«MáÕáÏ]ð íð8ÏOûü¥T4‹ ãÙŽ¾ÄhUØËʹiΘ0žmçC°F…£¼’Ç—[Ø­õãƒaþlÍSH ÒÑÂÏÃô_ ø¤REïî͹'Ì€·<½ŠJ¹k¹ ß„pžK7¡k……–W°Áj½‰ÛûDr™¯“o–0µòP¨ÔУC UóØì:³úÄ&EðRG3Їœ*õ‘7ˆÞÌð¿™ù,Sûñþ_ÖjèêaúâbÖ……_gÏ1íSna–Û;YW Çlr¤©_r£.O.ÿs[ѵcÔƒí% ú§-ÿ|kÊZ“õ¾ýÜ·ÚKlZ´5ðÕ2;K~/dFX3jÝÇ{­0“»èøzî¾³©èÐ)ŽWº:½Ô†ªY(c”RFβbÕiñ=jâU¯ã‚kym¹çŒzPµþ¼ÔEÇìŸv3½JE‹ÔX¦FŸà  ¿/m7íáÆUnTþA¼×@ï+ó;®}jìVBBW×êcöã‘·‘g]aYý¨–Wy04Ó4xë1$Òæåe,´*€ÂæUT]êG’ÖÆ¦²*Vu çÍîz>Ûná×Ê£ÖkæOhI)¹g˜ƒ"üˆ*-gNUý~ -nÜ'Ã^§yõ5"²á:‡7Ð>h´®ë†cö#„8û4 d´â<œI}¤’½>Ä…)”î³ÓºW ò³J·1oÕàŸb<~z>gÛ-]}}Èùžš…³ïhÆŒDÅòÏùö÷<Ú]‘Èqƒœ…l-ïĨkzc*_Îg3'¯Ý’NÏIv }§}Nnæ-ŒN4€ó‹f¯Â“9†ÛZ›±¬ŸÅì%ûKËæ·‚xFÜÞ“pw ¬~Ç„/.M4=Æô&ÊÇJÖ̯Y²5…«; ²ïfѯˆqc‚kÈúö; :^Å¥qzpæ³ôûåØ:âŸc°fÏçÛÙ¿xÃ`ârΉ‹4 gF¤ò|×[ywëwŒ_9·W>ºÑ©µ¤'ðB×ÛÈosQÕM¥ªÖÁÑ·âT€­¸”;Ù°½°á—xEu4T|h[5}o£Ml ·÷M`øÆ}<¸Ë5‰Íu”îwâ8Ãú¨U*Phô­EåuŽlu|ûœN]Oôw!ÄÙ£öiNJz:d{©MN'JÉÙLz’B®»’Øöf¼;ËuEpä¯b½C¢§« ¦M»ÌjÞˆh *Ú· E§‚ è`Øk¡ÎËñaXLJz|ýÃ^£ QíÆÒà‚'é”)Ì"ר‰´ D«‚Ð6íðÛ¼‹ÖC]{TṈ3šª}IhŸ;•%5Õ…Õ¸ @c+Á¢"#X‡J@L´ŽÍ%u¨’}qf‘£j˨ÔpŒZ0¶éAúú¯Ø_G|²¤aq‘†a€®á)t O‘ý)/¶RÒ!˜¡þµ|] A:Ü%5w aL°O*¼èM:L'}è±¢PãUÓL_Ë‹k(L¢Ÿo-³­*ÒZTRÂn7|M$yêØ¶·œçµf¾ˆÖcØå¦V­!ÑŠkÏ|^KY-Öôô©ež]MJ3=ÆFµCÃun¨}¼5¯+2c–9¯½€í›´¨Š pÔm¤T©¤°¢M6()¨¥Zg Ð~êWŠ-—Eó÷ÓÿZšêç!j jÕ1ÇÛˆk—šA~²î²ÖP[²š™S³ê¿€+ª8Ô¡™Œ¼t-¿-ÿ’)¿6£cÿdÄúéÕVê8°f>¿fÛ Œ‰!@Q¡xêÛBãM¤²˜]¥"C«Ù½×AH¦/ê¬V<>‰˜]Ã4f‚}¼ì¬q†ÅE†ÅßËRÁøu:ž”È-Š‚­ªŠ/©àÿVêx¶O<ÿP£ÖÆ[KJøåd7 ¼.ìt2¥ß–qßÒJ^«ã¹K¸KöÊ*Yf£ afîJ L­ÂŒƒÿ-­£@¥&Rç¥Äuæý¨ŽÊržÜÅK#ù—ÍŦb'e|쪪l¸Î'hŸÆÕUq.¨MQ´i×ônj“Û¥äáÈ ¦]’B®³’Ø43žìS “p²òûET¶½‚+Lçf\¬JJñâöéT8|õSqÔm):__La-}MGŽ¿‘ЕË:Qµc!_ÿ´„æã†pð¹4¸‹çç-~\zÝpš¼T®ÝÅÖ‚ƒë"h¯bñ¯3Ù†€¤Kéwp „Î×Mm96˜µ€ÇFE­³ŸÌlq±R©T(Š‚JuîF…ŸÍýIæTdON׿S¼§˜q{Ž]¶†›§ùuŠ5/^yG¶³w{>ƒ¶µøîbnÜ}üþJó˸'¿[–¯»çOVÇKÖ¦|oj()}ü¬ (ä7XgnŸFÕõØ} !þ ºgØ]AÖ³ÙÚŸt‹D®\ëK°ÞBîþ*Ú$¹Ø¹|-¥nÿƒÉDÙ¨P]dÁ‚&²=‰uóXº5†A©aèêÊ(®ó#жmu ´KÄà‡Ëz§½NNÅŒ‚gå.²¶Wâ 8øuy¬ÝÂ%×%á˜Î^}d{’½sX¶¹CÓ°f/gC]<ƒ¢% _¬ ÕÕÕøûûŸ“@¬( ÕÕÕgçNƒ„a!„[¶gزq.‹÷Ûù`ÛÁBs{®×—È¿òVA§®1Ì\ø “–FÒ¡_wZl=MˆéÚÓ÷Ó˜´1š¾×¤Ï™,žÿ-ïÿR‡ÚN«žC謡bù7L™gGхк÷e4?*Íë›u%#t6³ÞÝ‚!2…®m›ctK^6!aX!„Bˆ¦Bº•„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„B\P´]°ªªJZK!„B4 ZN¥(Š"Í%„B!þŽd˜„B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„0,„B!„„a!„B!$ !„B!aX!„B â‰rlaâ}SÈqºÉŸþ/¬¯g> &ÜÆe=ºÐ9c7>7‡ýNe¿½ÁmÃÑ¿o?FÜ÷1›j¼à­dÍ”{Ù¯Ý{âÿ>ÝLWšV!„†ÅN©-$ßL¸ÎIQ.$Gp—e±Ö=˜ óV±jÞ³¤®z™ç–á­]Ï›/,§ýó³XøË7ü_Ð,^˜¾—Ê5xz^ Î\ʲÙO’´ði^_S#+„BˆóB+M £nóÜþÈ7l«ögçU•6=EÐäçxì‘Cß©ÚÓ'EÏÊ}ÜŽ н± I0£R›IïGíüb 5¹º=Iz5¸þæ8®›± ºöFB!š ¯×KUU‡¯÷¯¿Ý«V«1  Vÿù~] âQŒiðî³vÛq=®¬ãÇæqÉ«÷ÒÖppÅIù¦oùts8nŠF̵]§ð$ÞF΢º oK3kÖŸ³½º ©ìbɯ»)ߟ HBœ_“'OÆétÁ5×\ÓÈ5«™3w5ûm:"Òú3¬O üÔ'*?ÕºI(›¦ñ¿Å¥Ü©-÷ß>P^(qÁ±X,h4"""P©TùþE¡ººšªª*‚‚‚$ ‹sÇe)GˆÖM1:{ìY<å?™U¬'íö÷¸¡•ÔZÚôîˆ÷ýÉÜ>¯„ꨛø(ÝŸ Õ#<²öiž1WxgF K%d»SWqÞõïߟ_~ù£ÑHff&FsŠ‹cË~ÚŒO'ÖÆÚ™³Y°#Бɖ†ËÛ˜QjÝôë¸?ýÐ'¿=óg°>2C^$qAr8DFFž“  R©ð÷÷§¨¨è¬lO°h”]ŸÞË߬¢Øçf®ÒW³¯PCöã^{~ÍMé<1g5XÅgÿÏÝšwy·÷"þ$ˆ'¦N£µk_ÿç!îµ5_<žÁÀ‡?dàÃõÛ­^|ÓMaÒÀBˆóÆëõ²hÑ"¶nÝŠ¢(8N~øáÂÃÃq8Üxã']ß]¶}ºT®HôC«ñ¥]Ç ²¶äS˜×`ym¬ÂÂÏ—ãsÙ ôÕ4¼®½M+|m¿tËÊ[1t@€¼X₤(Ê9 ÂGbEQ$ ‹s'鯗yªè6\9뼟ðÐìn¼ò`ÆÃK¨ñižÉuc[1}ò26iSÓîq’L*Ô¦¶Œþו̺w{´;¼’ìE¹øw¼GXqÞ,]º”;v0hÐ bbb°Z­äåå±bÅ ÚµkwÊõUå8|ñըІ¢·•RUÑpy-ñ„FFb2©q–6¼ŒÍÝ -€}«vâÛñkäµâ¯pÖÂðª’mLÙ6›lË~l.»´ìAf‰Ö±ÜžrámšpM\T”¨i¨Å½§"ÐâæÀwÏðžå2 ®\æÍÜŠ6ñZÚäR÷ݬ¯hEfƒ=+VP6„ëj>á¢ÿè¨Ö½Ïk¿ErÕÔd9Q„çEMM 7n¤ÿþ´iÓ†;v°uëVF…ÝngûöíôîÝû$?ÒQð8½hôšÃCT=§«ár·!šWD 5N°Ì¡ÍÛóÙ\DÛG ­B\xaø÷â-<½æ#žér é!-0i Ò²‡®cnÊrxbõžër+]#RšfEÜU9ChigyÚÈ´h‰ì5ŒÄW&2¶ïN*\>Äöº‰—ÆgéŸÂ #žåÅëó”Ã!a0=;œfêuÔ,žÑo– ŠèÂ5ϼÂU±rƒBq~”––¢( -[¶$++‹;v ÓéhÕªëׯÇb±|‚-¨Ðè5xnݰUÜ<z]ÃåÚF¬{hWY.¥>ñDÊǪvž¼eÿî4ŽÌˆTiÑc˜´ºG¦òT§›˜¼uVÓ ÃÚ®}ë©ú?zƒ×k‚3÷Ò—Œ;nÒǾÊWc-Ïäî÷ær·œBˆ À¡1‡n·›àà`RRRðóó«¢.W}d=ÅXH}@(zk 5ž$ ‡¥ §o:ÁŽË}µ§^·~/Öâr”ÀTLòT!þ2gåíµ³*.MzÀ_¯kx²-û¤!„â…V«%++‹ØØXÒÒÒˆ ++ ÿSNݤ mC‚{ «rªpÕ±q…ÈÔæøž Üè8ÀŠÙsX_î>áºõ?­ð`+³£ó3È !þBg¥gØáqaÐèN{½ÂÚr6Vì¢Îã$Ê'„ôèÕç-sƒFÃã’3N!. &“‰ŒŒ V¬XÓé$99¯×ËæÍ›ÉÍÍeذa§Þˆ.’îƒÛ3wîT&ÍÓÑ~ —·0£Rû4XŽ=’‚B̵^9Áºx©³9цéåq±â¢¤¸ÔÚ]¨>˜tçï,W)ga^ŠôãÈóq£—/©³ðBÖç,-ÚH˜1½FGy]ž{RF0:¾wÓ{EÝÛ?÷Sâz?Ç=Ú³ÒNBˆ¦ÀIî§/³¬ÛÃÜÔRv6U›7ofåÊ•Øl6‚‚‚èÕ« Ò8BœBAAQQQÀÔmå÷åkØšWuøÇ¢¦ðVtìÞƒÑ^rWïÀ§C±&ÕYÜï‰ónØb{7-}‰pS_ö}ŠÖ±@}ïò7{óêæ¯(¨-ç_)£äìâ¢î°±kÁ|öÃï첸1Çf2òæ± J:“_Í×±mÒ£üùt<8;«§’M³§òåÏë9`ߘ. ½~,CSüѼ Û÷,àÌbežM@"™ÃoäúI˜€‡²ùOóÀgûÿ¸;¿Þ<5ñŸ´Ô®BÖï £Ó¸ó˜ñðãÌ>ôà0Ñ.å†q—“â¯þóu:; òz{kÈþi*Ÿý¸šýV5‰™\qãõ 8ôº¸ó˜ñØË”ßòw´6^4§cZZiiiò¾â/å¡jÛ<¾žŸƒ @çOX°OM%;Xþ]›4ÔT™ÉlÝ™XÓ¹™Oðœ‡á'×}Dœo$ogÞ‹î¨!Žë’Ò* –»V¼AçÐVd†·mB/°Jnc Ñh.ò|™—æ1òŽ—Ÿd¤bã|æ”áL2súý«j«xç½:r¿~7V%pÃC饷ì &½ö"ΧÿËèx=8÷òí[3©ð oöEU¼¿fSìH$Ñx( kô<Ÿ :´Ý²¦<Ǽ¤á$éë‹Ü¥›È èÌP#à4ôxâ5îhmÀ]³Ÿe¿Â;Sxížvø¨þDΖ“ÖÛß^ãÕ9þŒ¾ïužˆQسè¼ýâðüc Œ‰n…gÎ]¶–Ùós°áKrßa H‹Ä¨pcÙ¹ˆs·QSå=çÇuNÃðæŠÝl(ÏaÖ€çþ„ln;un'C[1<¶;Ÿìœ×¸0ìÞÆøŸ¦EvÑ~ íboæÕÔT‚©fmÎ×¼µs5›ìn‚Ã.çµî#è¨W·„Ö½ÃkyEÔiÂè•rÏ$X¸þ˜²Ñ(UKxaÍ÷üZmÇØ‹'»_M£ [åBþ³j& jâ›uÀ¬¨ˆ‘s]ˆSR¬›™1§šž>ÎЖõ½‹æ®Wœ•D¡.ïW>™2‹uv ±}¸ù¾kèhÌæíG¾%ñŠD6/\˾b1ÃäÁáál›ø0on³Âö{¸Å/•;ïÆ/‹Ü xôú%ÕGëVoå®ü‡yãÛÍ\ú@'|]ì·“Þ9™` $t窄SåÈ9|•ß»o ?Ø»ìÁ²m †N½ŽêM>òYëG×Þ Lÿ*Ÿoê‚Å|úá,VíµbŠéÌð[nb`‚*w Ëþ7‘/VáÐ…ÑaäX:o}‡ÉGÕéΗï%aÛ—Lž¾š‚Ê*¬îúKx‡ñ“y°ånÞ~t6­†G°ì»õè†=ÍãƒÂp5ÔŽº“Ô»v;ßÍ)£ó3¤u}OpÛawqëî‡ùxv—ÜÚ£œ¾Bˆ3´oÅʈ^£Ò>ˆÃ_¯=Vò¶ïªï->ÎigæúòZúÇc¯ïòÖ±ºìܹü ^ÝüýšudCEÞÆgö”­íÇ[_äçK¯'|ïG¼UVx¨S·æ¾¾o²v䳌ó,à•½¥¸Ú²o™X–Ƥáï³|ðm\Œ§üø2½k'o,Ÿ«Å£,ù&ïFïåÕ¬-T¹v0aùL cîcÁ¨‰¼€Õí•3]ˆFp¬c—.•Ìøã£•bßÁ´×¿ÇséLúptÙÃç_lÁ¦öçµáÖg^çͧzQ>w&[mf:Þû c㌤ÜÿMzv5›È3¥‘sT³ÊD|÷¶h÷n¤È˜’˜^ÃÌ×§0gcu§ºÜ(5lþ~ACúÑüÐwy¥šíY*:¶òk`h‡‚«*—%?ïÂÐ"™ç¦MøKxóÃwxd€“ï'Le“U¡nç ¦ïlÇC“>âƒWï¤_ëXºÞ÷Ç:uR6ðÉÔlRïÀä)/s}Ë02î›À=©¦ƒAv³7&r×koóÔ pÔ'jGã‰ëí,Ü@)ôjqÔP•mz·Àµ=‹bù °âOÈ=àM]Ú„v˜¢ÓÉÈÈ ##ƒ®=º‘ä{îîDÓ0\í²lôà@m—ÎÏ’¢Ü¹âuœ^7¶¿€Pcn¯›»‘O²S‡Ñ;&‰@¨mîeMA1U=“{ÒÑä!¿ª¯QCay@£Á×™Ãoee¸ qt 4£k ¬®b!‹tƒùWl•䨾DVn`ké¯ü¢êÉ#­Û¦1Þž–:™üFˆÆðÖZpƒ17pªË]À:óÆdF¢WˆîÑ=ë(pº(z jGˆV…>¢ Ñê Š¬Ç õÖUã4âsÌö5¦@ŒÎjì^@@ç;žgü#Y=ʾÆ7ÊŽ<ùëØhkÝ΢ÝÍèæ8(*Ö\Ö;ÒH :jGž*–?+7Ü0–[~—u¡Wñ×´@ÉÏju/®ê›€¯Î‡˜žW1ÈœÅÏÙ6ÔæPL¶6î(ÃãOÛ8ßã.ÎË^Šõ-H‹2 Ò…“ÒFÏ=6?MJ‘=ˆÔ«NÞŽž×Ûc-¡ÖÜŒc¬ ŠÂl/¡Æ#ç®âÌÙœ€Áó±iHî”I÷îÝéÞ½;™]Zª?wÇuN‡I„ù¥`Í}B“ЇV¾Cêÿ³wßQ”yÇ¿³5u7=Ò„@HB€„‚ "G+§¢g9Ëyê)§gy={÷¼³adž)J‘(H“Þ[èBún²›-ÙÝyÿHD A‚`ðûüyvfžyž}æ7Ï<óLhïô½ }}G¡½Œ@ß‘¿OŽ‚¿AËåħÚX›ÿϨ!!*vª¯¯þÄi Û9sxióc ^ŸÊŸ³oà¦èÆi×3ÚQI¥ånžû}ÃÉÉC’ŽÝQÛØ‰¨ód °Ãããå5e,(°QZë9kö;*@Çà„`îîŸNsΗél¡ñ7cpT`÷6n…TœUTØÎÓ÷çÕÿæÔ:j• މà :Úä$M@(FGå1Û÷Ú+pC ’µf:™È¿_Î¥Ÿðê«Oãyôi®L<¶v®¡ÐœIòQûÖPÝáR"´¿nÔëÇ ûýª\UU•Ô™ºòóþèÌ´3ùXY^‹¶û8&Ýò-Ÿ}ñ·OiÏð‰72²ÑÔíÚð4’ÕXs –äø2ÖorÐnìQ½+#AFåÄõ¨¿Ü£5Z4¾ºúeŽÞ{o>E+ÏE!NIhØË©tª´ j=ˆ- ÷î ›§²±r™a)ü5mí#è“ù«À÷›‚ŸèÓå÷L3®:)¨¶Œ·j:í å‰!wÒMïã@þ:fTüRô6mFò|›a¾Ïõ+?%{ø­äü*m*²C Éá­‹.&î¨Ý±¿‚Ö]ŠÅçÃ3%/­)ãó|ËY·ß¥µ>Û^À¹Qç|™Î†¶]ItIJýN.èà÷«‹Y¿ÐP‚âsyàß—uôo˹•¼ã_ÿzûmº’X÷?prAØdÔZv/ÙŽ/ù/ÄèëFUUP@HB¿+»ð^æî®Æ—Ñ(ðóbÙ[„/zÁGöÉIÁšr’Ä4£!­/—¾ú V„蕃ÕB"Р#"k4wf§tå»<þúÇtxáŠ_oÁ?‰¾™>úð)¶(¢»ÝÌõAÇi%££ÜcÓ1ÙvQæRIÐÿX;Š` Î$TÞœ.„8’ظ¹˜«‹H‡ñW ˜‡ê¢bÔ˜8Ì-ÜÖ´è…~l`$#âzóغ(wZ߇CБe¾Ø»¥[ùK‡ê |˜ IDATÍß°¯œ¥…»(õº(<4ÿUD3:6 ¥®šZUTì5ëù¬ wCãn-›Ï‡Kp '40œYT@­¼5…ì*vò›¿.Ås”ï.Áéqã Ê`Ü¿ößïªÀn+'þdÞ\ifØØN*àÜý)=<™¼­‡¨®µQºõ¾/ ¢}¢©‰†Ñƒ¥¨cxà/=±îC¬;؆ìvÍ»—ç—2„îžEL]°[]-…K>ç;[C;úcÏŸÇì5‡q¡ÇŽ>|Êä±ocöæX®þçã<ñø#Ü9º3Ášßί©ztüF¹ ÑÝéaÚÍw«+~é‰÷–²"o?¡9YDJ0,„81¹ýIÒCÍÆ¯ù›OM ?‚ÕâM̫ۤ¸ý§W¸êÇǹ-mý¢30hõ²—óñžùÌ?¸†Ç²'’|“(kü ´ÍáÆY[)Õ'3ªÇí\¬Cï?’¿˜ÿí3Ö—›;`n˜ÿS£Ó³oó³ ^YƒWË¥Y%Ço+¯®?:í6ºûGÙw Ï®~ŽkkÑú%0<ã¯tJèΣ9{¸o̓ô^LFʆ˜ÊÎÙØâ<» V5±ÿçb™ÎF?À}~ñÉïãã±9Œ¼~4QÁL¸w½ý ·}`GkJ¤×•·“Ôý·‚á@:¾ˆà—á¦ï;rÝÿä¢1pî}>~áï|X«ÔÏ3üI\W¼ú%äº~Ÿ1uòCL©¬C1%Ñ÷ª»¹"¥©àÖƒ­Ê…!ÞÿH ì)ÙÀÞ°îŒnæô J@×üc±ãß‘÷L$3HƒÃ¨§øó§¸ãõ|~qôžpýq]¦ßHÐ7xá¯×64b~DtÌ w\NCÓù5U×÷þr+± ›Ã²ÿ>Ï;uW2 ^eß‚OøÊÚ›¿ýå„Ñ0.zÙ‘68>œ$gz!Äo‡kA6ÆÊ¬éË9¸m!_m[Øh‰:wl×äó$hÍ™xÛ[Çû»æñå¾…Tºê{ç4ŠB×ðöÜÙi,a)ÍÏܳûæ|JÚ…qCpë¯p6¿.ãƒgýpÓõÎù2‰–â¥dî³|v'Ï ¦%F¾¹v}Äã3¹ûî~„kU¼ö}|óøSlý2ÿêy:÷Á‹5ÿ¾ž1›[m$õÏU—!Í,s !šv²o‚ó9Kرv[öQ^ãA`&:±#YÝ2H0éþ°|çŒÜô2hõÜÒñOÜÔa…öRœ^71þ¡˜.q²TT9…-ÃgaÛ&Ù7Ò2€¨8ËŠ°ÔÅ6<ܦ :J)v†sA¿Ó¼Ż2ñž˜}‚•ZAZŸ×ƒªÑ¡='ÍQ]%lÛ°gx'2SCÐu;X¿ÓALFñ-ØM¥Úw0sÊG^Çvzù­‰s’Æ/š´>—Ö§uìϦQ‚¢å¨Ÿ¤š0YXã<Ùuâ;Æòv–ñÈ[Ëý´ìZ±—«óOmRÔ ØXæ¤[¸tž ‡)”†3ëÛB¾°©g¨¬¢õ²á\8éþÌPÁÔmc7¿ÃSwÏ@cÔ£1¶¡Ç„{“ðL†Fß'ÊûŸòôoPcÌäöçù\‹†Ujò±Ñ™@в¥„Ç Ñà¢pÙZ,áf 7ÇÒ®gÇí÷Xر4%[aS‰ËÂ%½NòmƒG}Ó~mÉìÓ cØ©œžë(œ3…Õ'06Ù(¿W!Z"6jõ¸¼uµgà*V׉çG>Ñê+ÚåuŸ™ú9+ -=:„\neódM•‚üB.Îo8‚Cxm€ž×÷œÞ·xj¬<˜g§ÒÞÄ4^ÐüWæžBYO*qÎQŒq ºå1µ`žÚÐ ÆÞ“ÁØs¸^—}ü«Ë½ÄëEèžåÌxý•†O¢èßÙDÑ7óú®îÜùç¾M®ï,ZËV_ÆÝr&ÇN¾›:Ÿ¥ ×14öwN’ª &)£ó)–ʇËQ'÷K…hÉ`øs«K·Ó·M†Ôèq¬,ÝNÇ„síôL›„HÏ"N§à(¯àï‹­¸ã"y<#€0­‚«¢Š—YØ« æí&¶ª¤„êiìeê‡ø Ja@ïvÜiÄ78‘þ‡Ë¸m™ ¤(žÈ $Z ¶J O-«d½ 4nÃ¥ úÜ|µøVýÜäkéÓ5ëÆB6×ý¾òħDóLv Ѫ—]VÍ/?C ÿ7ÄÌ{ÓŠXª æ­K‚XW¬¥„—©?–°62âØ2{ÕO……éž`nmfY16Îç0ߨåô&ÄéT\^?ÇxÙÆUØ~5ÁL%ÛÖ¹©ÔŠÃÇ]ß/q0cþÐ'‘ÞnKÊøb ¿ÌJâ.dö”ŸˆêÅ»)©Ñ“97Ž@ùîC¾-tBÑÛüÏ?Ža׎$Á¶…óW°§Ò>2Á#ú‘ìWÃö¾aÑN ­‰¤ž—0´k$Gºm|µmXʲu;)¶y ˆÍáÒ?õ¤Q|ÔìZÄÜ%»©´Û©žWKÒè[•h ®|3 óV°³Ô…12…ƒ‘mD^M%ÎÙ`ø¶ô1<¼ê]þ•ýgú´ÉÀ ‘ùwŽ´>K‹7òÔºy2ç¦sëà1…ð|O#s¿Ûϧ•Ð ŽÀþÛÉËËs÷³¥NC×ÜxîK°qûAÐùÐ(à®U>â»$ðvg#Ÿ/u°hy1_F¶¡váÞ´¨èLa¼ÞCÏsö1îе[Ï康؎Ò&‚ñjc¦Û°éuõvmP0Ãjya™÷wõ êL!<ÓCϬ¹{™jUhŸχ±M/k4ÑyÓ>®]éA1…òfe¾«<ø˜ú©qØo^Y«å#/ÿâôÓš“ÈÉŒƒ’BÜ) ¡Šý•$Dª”pб{Š6”6oc>'•Õ`êäwìô|îÃl·ä2nÂ@Ø5“÷çNÇ}á8ÆOJå²ùzy!£’9fPƒ»˜­Ý{Õü+–ñÑ´åfŒæø™û‘<â*.üìcv÷º‘qÉFpdÁ¬•x{çæŽXÖMgÖ¢DvÉgÉ¡DFßÒ—(O)mÁ‚uÚXúŒ@Û¦}Á¢­¸2ÛŒâØË‚…I}=ãÃjØðõ e_ÎÅ p±xæ2ìÝÆò—ñflùóùzÖBBþ<ŒD?9æÄ9 ÷ŠNçÉÜ›xcë î[ñ:Ÿœ¶¦×èHKâ©Ü›É‰J;§Êc"®¼œY*Pió}‰L³Â¤‹ñZ½‚£FƒP=u¬ª¬T+¬^Œm´MŽÃ ¦]E9ßÛT@eóN+Ö‹ƒIÑÙÙTneevÿémà£íVµ^¥eìþ‡_ht0mË*˜m­Ï·ØâÁsœ`Øçvðea}€Ót™£š¨´ºf—u}£|„§Ÿ& ²² ßGmjmÕBÜ…ad¥¨ìöTŸˆogy3¶¤â*ZÉZG{.‰mbœ®.Œ´Œ85 ¾èXÌF…Ì´ô „ƆÁ~ NÇú0:e%Ö¿ì%$–pe/–&üN™â ìöëÆBÐ)‘–Aðæ½XtÁ‡Øw°šˆÄ(â¿ôUDRf'ð:¨*µ h¨.®Æƒ­½‹®-9az™¸X=›K(©A¸‹7°KéÌØô(ütà—Ö‡¬uŸ³¾ÈIbªDÃâ †r£:‘ÕIjô<¢(õ/þ:úƽØKÊøë;¶£6þºåVU8Þý2¥ÉÓL=¯½šfÚI‹á– “¹ñ÷ìñàECr;=en\¿÷¤¨( Òìqvê ÊÓáØú9™²ïo!Äéãsbû&ÊáC¸œ)S«(®,f“JÕR­7Rì8ñ½&Õ¾›ó ˆ|5mNôxˆF‹Fiô7¾füÖ5h54ù òßj©êl5Ô–®bÚ‡êÛÕ‹KI@Ñ‹1¯aɲO™¼° Ùƒ‡ðK¯¶êäàêù,Ìw‡YUP½õu¡ Ž%Fý‘=e.b"ªÙ»ßEx¯ ´¨8m6¼ÉþÜÛ¡ $,ÀÇÎ Á°8‡ƒaqþ©(±QÚ5Œá¦Z¾¨†Ð=žÒJº…3>ÌÁ•> þzü]uüæKU•Ÿ†6†úб¢¤†â¬PÕ2˦Ðå3¡¥¥ìõ€1ÈŸ¯“mû+xRÈ'±Œ{<Ôj´$CIíïŸdÏR^‹­k}j™çÐЩ¡YÍvEIÓenª~|5Í/+2­«8[Ò22Àà¡65“¶j!®Â02RTv»«ˆïˆ7ÿÃ$ÜŬ˜¹€ªÎ£¸,É¿eÆÅ*Õ‡Ç÷K;ª}•}äJ\A„䌻*sãñI¹\šÔ ëŽïùbî"ÚM¼„†÷Òà)YÎw[‚¹øš‘´3ú¨Z³‡­‡~îàˆ&-QáÇ…Ó(@‹9åb5ŒÐ¡­­Àî…@àµSY«!0Xf¶ ‹sL¥’ûÖêyrh27ª*v«•GUrï =Lä \µv^]TÊ¿uŸßWGÞN7“'ñUq9w-®âþ5zž¸8‰ÛpTY™´ÔŽ…È@nËŠ&R£ˆ‹÷;©m81Äè}”Öýþ~TWUmoË3£“¹Ó^Ǧ7åÍ|\g­jºÌÇ©Ÿæ•UÑN¹gØSɆog±=b0WôŒÁÐR;® "Ì`aw•´”:v.[C™ÇÔ ôS©>l¡.1mL&ÉÎy,ÞÇÐôHôÎrJœÁ„Ø·±Í™DFjþæ`ôX~Õ™àsÛq«¨øpWíaÃö*¼æ†…¬9N¿«‡“Ô¨×À“Iªo6K7w`x3¶üe¬w&24V‚ás•¢(¨ªŠ¢´Ü#’§3? †Å©ŠìÛu˜«w5JÞWÂÄ}—­á†©¿<ªm+,¤á/ÛÙ¿½ˆ¡ÛZ|o ×î=6¿²¢rî(jbüž×ÅK_ï;ÅâøØ°©ˆa›šŠ”Þÿ_—TŠš,3M×O³ÊÚ8O!ÄáT{†-çðcø–··5$fråÄ ‰ù#ϰºhºåÆ1íûxmq ]õæ‚C[>4—›‰ÿÌÏxmc,^3†£zñãü¯yë'šÀ(:ô½„>aZ*—}ÅäyT}8\J»£¢yC›\r"f1ý-c:‘Û¹~þ0ŠÔ yÌ|ó•#¸©]ïKB@ýGõáÇïgòÎb†ˆrF"ÑOæ’8WFª««1™L-«ªJuu5~~§gØÍiy³8÷õŸº‹óì}Œ+ÔOË¢+SÏù2 !NÎÌÏWÓo\WرžÚÔn´U‹XSJ·d•=k-Äg²ñ«¥ä^9J*ë(uÅ?òåÊ(þ4²Áð¹JXýùWäÞÀøþRAçŸÏ‡ÕjÅétÒa¥¢(øùùa6›ÑhNý ‘Ò3,šåâÄ`>Ï·œµû?,Ét^”Iqr’‚÷0û³†·ö¬Ë?’¾cEý¿+w€><‹\©ª£¨ÔY+°{Ãñ5Ä=ªËJU]0mÃäåRç#FChhèY»ÿÒ3,šÅáññòš2æì­¡Ú}öô¦šZ†'›¸»[~:Í9_&!„huål^Ǫ;Š^‡FJjî@z¦š¥—MH0,„B!ÄÙBº•„B!„ÃB!„BH0,„B!„ÃB!„BH0,„B!„ÃB!„BH0,„B!„ÃB!„BH0,„B!„ÃB!„BH0,„B!„ÃB!„BH0,„B!D«¢kî‚V«UjK!„BœÌfs³–STUU¥º„B!ÄùH†I!„B †…B!„`X!„B †…B!„`X!„B †…B!„`X!„B †…B!„`X!„B †…B!„`X!„B †…B!„`X!„B †ÅYʵ…WîšÌ.·‡¢©wóÔºZp‘÷âÍ\Ú§Ýs.âÚ'fSà|U¬žü7Æ êCïc¹wÊfj|>ª7¼ÃíÃ{Ó#g×>ó%©Z!„BH0,Z9µ¶˜"c*Qz7‡wCjŒOùÖx†ñ⼕¬œ÷8é+Ÿå‰ïË©^ý"Ì‹ãŸÓ³tÖC¤|ÿ/­®A­ÝÈÿúšÐ{§³ô‡ÿÒwó³ü{~™T®B!ÎThçæ—¹eÒWl«6±s´‚õPÆMúú<0éçkªLv2°â@‡ïÆØó!²BµhèÊ„¸æËMTøÿÈò€Ñü§_4FC$—]“Èç3×Áð‹¥’…Bˆ³ÏçÃjµâr¹ðù|x~£ÑˆÙlF£9õ~] †E³øu¹›7wðÀŽ ¼x™“wþ1~ÏÿÎÆ†T7›¾fÊæ(.º>‘¨âhlsd{uéìaѽTì¢pÿì‘ýˆ4hŒO%°l Á°âÌÊËËÃívF¯^½š¹¦ŠëÐ*fÏYE]Ot—ÁŒØž`ÍñÒ›³îÏŸ×qxÉGLÝÎè[F‘hïI´>‹­VKtt4Š¢üáù©ªJuu5V«•ÐÐÐS®å+ÍUg©@‚Îc¡„hB~¾”rlàɽ¹øÆ×±ù'îàOH¿IL걇GaÄÍïPÜ>p\8ìt´ «*†@t»T®âŒSU•}ûöqðàÁ“ëݪ;ÄÒ¹› p=wÜ:š¤Ã ÉÛaG=^zsÖmøØ[µ™Eù>tr¶­˜ËåÂd2µH  ( &“ §ÓyZ¶'?/Ñ,{¦üž\ÊŠ—nàò 1gõüãÁôþYükö*Ï|‘ž+ïãööâÖ·eÈýïð̛͂úWÆVc÷"̤ÇcwámØ®ÏUƒG,,„8£<ˆÍfÃëõât:)--eëÖ­,Z´è„ëzÊ·s@ŸNä`tÆh2²C)ÝZDÍqÒkíùÌ|ë]òŠÜÇ]× ÚÙ½d=J— "ä>®hå’-«ª*Á°h9)×>ËÃÃr¹ñÕÏøø¹ñ䎎÷ŸM;Ý/‡R@»^\s] óVPê=zm;ù vcÊN£m|{‚ʶSâða+Ø=ºƒT°âŒÙ½{7Ó¦MCUU D¿~ý°Ûíäååa·ŸøÎ•ÛZ+(Š -€‚!$ƒ½ keÓéµC¸¿æ¸ëÚ=à*ZÁOÖŽ H B‘¯Iˆ?Ìi»Ö\YºÉÛf‘o)À^çšm¨÷§cH<·tENTÚY\’:*K5´ ÑáÙW Ñftx88ãß¼i¹”Û®ìAtÝnæMÛŠ.ùjLÖUL™]Çàq]Q־ŠKb¸üÃTL‘Ãé뺟wü‰G{UðÅGtž˜-ŠâŒðx<,\¸´´4† ¾}ûÈÏÏçꫯfÚ´iÔÔÔœ` *^·­A{$`U´´^Ó=ÆXúŒŠTjgO9ë;àj¢t{ä‹¢µÃËK¶ðÈêwùwÉ o¿Î(5ÛÀáq±¾|ÿZ5™'zÜDnt§³ôŒaå°;œ üÀ]QŽ.ÆŒ1ýGüÜ+\wáN*ëˆï=ÏÜ—Co%5ËždÜJQ¢{pÕ¿ŸãòxέçÁÆÑïá:ˆ. —EqF”””`·ÛÉÍÍ¥¬¬Œ‚‚†=z0cÆ ìv;ÇÙ‚‚Ö Åçöç«z\xµF ú¦Óu'\×€kÇ"¶÷âŠ8#ÔÊ÷$D«†_ß2G»M¤WtºÔh#þ:#½cÒy¸Ûõ¼¾uúÙ ëâ¸úÕ‡ëÿ?ôe^jHÖ†å0ñ™O™xÌ ½¸ýÍ9Ü~LºSæüoÎrp!Î8›Í@@@›7oæàÁƒ´k×àH\[[ûÁ0Ìl¥ÔxS0jU\–rÜAY„„¹šLÒ`ÝÀ (Ûº–êÒBÞþϼ#ËΘüƒ®½Œ “Œp¢ÕÃ;­…ô8«‡üñr£Ò¸oùkRBÑŠ„‡×ß™***¢OŸ>ôéÓçÈg………hµZBBB~ûD‘F’ç[VîêÄÐÄZ6®µÓ£AÁM¦û¹òÓwðës1ÙM®Ûžî²èѰ}Õ¾/>ÞEîD™ZMˆ?Âi¹¼tyë0jõR›¿Á¨5àòÖIE!D+A\\?üð‡>’¾wï^V¬XAzz:zý ÎoúzËĽôC^{sÚ â¢ö(ÇIÇSCé¡b*j}Ç_W¾!ZŒ¢ž†y)²¾œÈ†ñïŸÔ:KobêÞlªÜƒÃë¦m@8Ûdq]ûa„MçdeÿžzBñÇr8Ìš5‹ââbL&^¯»ÝNûöí6lZ­V*IˆßpèÐ!Ú¶m{Ò멵Ž:4~øë5-–oc->s¡Wõñë> ïÐFÇ÷áÊäA´zÚËùzÿb¾)XÎó9·Ò=â,›n˳ûæL!aÀÜa– !…8Tër^˜ô¡Ž¿tô;ÁÒnvOy–¥=ïçú ä¡ßó™¿¿?—_~9{÷îåðáÃ(ŠB||<±±±R9Bœþ–çá­,_¶š­…V›šRyƒ‰gš.œÌAý›µ¨§l»ÌÝîx­ížEì°w¥[¸)\¾‡ÎðÛã7ÝûùúÕiX/º‡ÿ\R²ž¼…ù”¸’Iöórpî Õºˆ§VÏdaµÿþ<ÔûJú)Ø«¾çÿVN#¯F%±MWU…89Ö…8*ÎÂ…|0y:k90Æ䆻®";¨‚¥ï½Â'+ãÒGÒuÌíÜ<ÈÕï7Jë_Ãä|DâCOð§6Ú¦·¢¼X¶mÁØ­}ï-€>†ÌÈÃ,Þn#»G0Š»ŸòCÈnë­V³êù»™Õå1…pl}ISSxèþH laduO%,@ I½¹<©a›µÛ™1»œî½ŸK:Ö÷wq7í½Ÿ÷gí¢ßM‘¾`!ÄùâÀO«©¢ûã’ÌPŽtxmn߃ý íW‹vf×–“Ü…šºZžØðv“wwÎá½sèÝ0Oq²©-V· »§™o²ó–’¯Ä«Cžæ»‹'µÿ]^-w^œšŽÜuáX3æq&zóxn ¶ük^)ïÂk#ßbÙ°›¹,2 oűi†º¼¼luíÿÉ‚1ÿáØý<¿a Öº¼¸lÅqw‘7öþ›lÆæñÉ‘.Ä©„ÂŽ|öÒL¼ÿ‹×ÞyI=öññ'[¨Øù%Swfð×ÞåíçÿÊ Žaxw›¦WN¼-» ¨Õlß Ý!ø—^_Ÿ†èÜö”.ÙŽMwáOìË%Á ‚L§Á`ùi=^7…+wcê™Ex`*C²j˜öÒdfo<Œó¨G’ÝÅëÙE'ú=;€LÚ€öÔmß@‰L0#„8ì>èm=ÒŽ „ëFüc³ÈÉÉ!''‡Ü>=I j¹;g-Ú3ì§5Pëq6[akÕ>®\ðå.+/çÞAndý\ŵ'EÁ¨i愊šHÄ¥¢~åãÑC%¸"è›ÚÕgã@U)>?-Å师Bg'Ƚ‹%å夯$k—åØ4{É÷,ÐãÃøhŒ ¤Æ_HÌžõl-«å¥/ÿë˜F¤ˆÊäýÆsövx|¼¼¦Œ6Jk=gl?¢t Næînøé4­rOg™Î7ÎÝy¬ ¼„GzÅ`P ¶Ï ¬¥dhþölÜQN\F"ƒ¡îÀ±i8O¼­Cu™¤ºv³ÎÕ…+B®oÚ¸¾tün6[k2ˆüi'‘ýúã7»¾Å ìx-_²¡â"††bm¾?=†E Õèè~ë“Ü·àk¦½ûO¾Ô¦3âÚëÝ5¯­”ÚÀd?S«mK £”/gàÉ !„83ìnÀßD`ãÙ µ¸’‚î IDATfR»õ"õ íW‹6ÃC“˜¼ã[,n!† Þìsÿ\=™³&Ð3ê—7³ýT²•ŽætšßsU àoÐãr9ñ©6Öæ¿Ç3jHˆJ£ªÁë«ï½5†ŒáÍœ9¼´ù1¯OåÏÙ7pStã´ëí¨¤Òò 7Ïý¾¡ÝC’ŽÝQÛØ‰¨ó$vyiMŸç[Îø~”Özøl{äFµÊ}°§ïÏ«ÿ½©uÔ*hâÇ1é–oùì‹G¸}J{†O¼‘‘éM¤¥žx[^ûÖPÝáR"71Æxúvªbæ¦Dÿè ,³Z–€ö ê\Ã*Ðy[tÝøk”îHCÞqÈDþ5ør,ý„W_}Ï£O3Z£Eã«ÃÛhKÕ[‡OÑÊsBˆóJhØË©tª´ j=³i·h0œÙ‘ØÀH^Þò%eOÄlâ>÷üj™¶>Ûó“2¯þçS'Õv‚£‚ñVMç¡}¡<1äNºé}È_ÇŒŠ_ŠÞ¦ÍHžo3Œ¢Â÷¹~å§d¿•œ_¥M¥Cv(!!9¼uÑÅÄõ½ÙŠ_Aë.Åâƒóá˜ïö×´ªý™·¯ú˜À±µíãé(ÓyÁW‡GÕ¢Ó*ø…†ŸËÿ¾„¨Æ¿«¬ÑÜ™9œÒ•ïòøëÓá¥ÛéÔ8íÉG.Š¿-'ùkÊIÓDh ®OgJÿû¥í¯bL€ÂÊ#Ÿù‘ralS7°Ï·_ÖõDëêoUUP@HB¿+»ð^æî®flZ"&Û.Ê\* GÆp¨8Š` Î$Tz……ç‘ÉlÜ\ÌŠÕE¤ŒÃø«xØCuQ1jL-=Cm‹vLh eOdþÁÕ<¾~ ·íWŸ¯(ÝÆ­Ë^¢GdGFÄõ:‰“i9K wQêuQxh:ÿ«ˆftlJ]5µª¨ØkÖóYA1‘µl>,ÁžÐÀpðPyLš¿ðÁ tÏåÅ}…ØTð¸ ÙXãÄ?´®Å¼YXL­·šÍûòXåRÏÙØâô¶ªý©jbZÛ>žŽ2«ªV¼Æãï-ç`M …«~¤Ð/‰Ä`-~)CÈ¶Ïæ“EÔúÀ[SÈ®âZjòç1{Ía\è1E†ã‡‡êíÓ|=j¿ém9Q݇Xw° ÙÇ™~ÍÛ‹LÅF\¿ö4ê¸0& Ëþ=3~tÒ¥G[ô€s÷§<ôðdò¶¢ºÖFéÖø¾(ˆö‰& ÑÝéaÚÍw«+8òízKY‘·ŸÐœ,"%BœGbrû“¤‡š_óyÞFŠª=¨€ÏQÆ®e3øä«i|:7Ÿš~«Å›âôÐ$Þíw?­}—aóî£KX2&} »ª‹8T[ÁUɃù[ç±h”“è>×øh›Ã³¶RªOfTÛ¹*X‡Þ$1ÿ‡[g,"8¬/7'vÀ\Ö°ŠNϾÍÏ2xe ^],—fý•¿­¼ºþè´ÛèîAfß1<»ú9®­Eë—ÀðŒ¿Ò)¡;æìá¾5Ò{u0)Cb*“#]ˆfé2„¬ŸÞâ‘Û^ÇÜžKn¾ŒT#(¤1áÞq|ôö3Üö­)‘^WÞÆåíôþw¼^ƒÏ/ŽÞn§SȾ˜rtÚtô/caCJ@SÛº8Ïö†ugôñ¦qÐ'0þñgñù€êl)ÇÓ¯«›‡–e1¾]ý 7¿ä‘\×ï3¦N~ˆ)•u(¦$ú^u7W¤@‰eØ„–ý÷yÞ©»’ñ*û|ÂWÖÞü}hì/ °×ʲ'obÙ‘6->œ$Š✢ êÀ°1VfM_ÎÁm ùjÛÂÆg:wlG` !;c¯c®óyXrxÛ,ð©>̆@Äd‘sr™{¶qßœOI»ð1nnÝãÎæ×1g|°£ÕíÓ¦ë;´ú}<Õ2‰ÓÍKÉÜgù4ìNþžŒò;Ö?üí#<_6‘§'¦bhæ:ÖüøzÆllµ‘Ô„4³Ì1ÜZ¨®¶m؃3¼™©!耺Ьßé &#ƒø<3«öÌœ²„À‘×1¤^¾qV8Ù×"ûœ%ìX»Ž-{Š(¯ñ  0Ø‘¬n$˜tX¾ÇsÆnÒé5:µÍfPÛìÓÓ€ ÊÑØÂtÁ!¼;ÜÄìÙ…|a;µú×™Bù`x0³¾=õmOPl,sÒ-\:φã´å§á‚T¦" kœrL´z> Û6éȾ9ðwÂ*žŠµLÿÁK¯{›h1wÊÄ{:`zô VjMiU|^ªF‡V‘¯å ‡ÂÔä/b£3 eK A¢ÁEá²µXÂÍnŽ¥]ÏŽ{éâ±°ciK¶¦—=„Kz'3Ħ¹¿¶döé…1ìTNÏuΙÂꎛ,¯­Æ/š´>—Ö§•Ä3§c#F­—·£V®bÇåuŸsõã±Uóp^-•öS^=5V̳Ÿ–mj~ ÙÕ4Zzt!¸ÜÊçÉíûIå#NS Î…“îÿ=G ‡¾y„¿²“qåÝŒˆýM§!Ñ÷߉òþ§<}ÇÔ3¹ý¹{éi–høLZöñk¬.÷;¬¡{–3ãõW>‰¢gEß|Ì뻺sçŸû6¹¾³h-[}]wËe˜;ùnê|–&\ÇÐXÃïÛ!m0IOõª—£Nºˆ„hÉ`øs«K·Ó·MÆ(A'žùD«¯è•¥Ûé’pn=ú¹8„¦±È­Ð61’Ç3Ó*¸*ªxp™…ýZnÃ¥ úÜ|µøÙýŽIû°6ÿbæ½iE,­kz[{Oúù2…ø”hžÉ$Zõ²Ëªùå€7•Ÿ&˜·. b]±–þ^¦þXÂÚȈ&òWh“ÉãÙAÄé¦{‚¹5Òˆop"ý—qÛ2;AIQ<‘H´l•žZVÉz`lœÏa¾±Ëéêli*Ûþé)>øÓ©mEšÁØ{2+Új—×ÏI^¶q¶_MHSɶunjµâðq×÷KÌØÄŸÛÄ$ÒÛ-bI™_¬á—'ÔÝ…ÌžòQ=¢8°q7%5z’'ùšE ¨ôF‘;j$=¢ôõË~ð#Q㯦Gà!fOYNtN4›öPjñ‘3Š‘9Ñù|þþº\wTÛ¦NÉ'çÆ(ß}È·…N(z›ÿùÇ1ìÚ‘$ض°`þ öTºÑG¦3xD?’ýjØþÃ7,ÚiÁ£5‘Ôó†väH·¯–¢ KY¶n'Å6/±9\ú§ž´3*€š]‹˜»d7•v;õÏÿjI} £ Ô•ofaÞ v–º0F¦Ðcð 2£È¥Ÿ8gƒáÛÒÇððªwùWöŸéÓ&ƒF‘>Òú<,-ÞÈSë>æÉœ›ÎÝÉ¿;yyyî~¶ÔièšÏ} 6ôF0^-cÌt6½Ž ¯JpܱièO¼­¿îõœô>=ÓCϬ¹{™jUhŸχ±M/k4ÑyÓ>®]éA1…òfùßUÌó=Ìýn?ŸZTBƒ4Ô8l„‡·¡váÞ´¨èLa¼ÞCÏsö1îе[Ï康ØNu£|¼òóâŒÓš“ÈÉŒƒ’BÜ) ¡Šý•$Dª”pб{Š6”6oc>'•Õ`êäwìTMîÃl·ä2nÂ@Ø5“÷çNÇ}á8ÆOJå²ùzy!£’9fPƒ»˜­Ý{Õü+–ñÑ´åfŒ&åøá9É#®âÂÏ>fw¯—l÷AÌZ‰·×xnîˆeÝtf-:@d—|–Jdô-}‰ò”rÐÜ((ðQ§¥Ïø´ °±aÚ,ÚÚ‰+³Í(޽,Xx„Ñ×3>¬† _ÏàPöå\œ`w‹g.ÃÞm,oÆ–?Ÿ¯g-$äÏÃH”÷‹s5îΓ¹7ñÆÖÜ·âu<>9ÍÿL¯Ñ‘–ÄS¹7“•vΖ3<ÆD¦YaÒEø­^ÁQ£ÁqÀÊÊì(þÓÛÀGÛ-,¬¥üØ´ælëd…FÓ¶¬‚ÙVP)¶xð'ö¹|YX F'ÿ¨qåå̲øPJ›´ºFûL»Šr¾·Õç¹y§ëÅÁ¤èì¬o”âÌÓ´£SVäû¨MÍ¢­Zˆ»0Œ¬•Ýž*â3ñí,oÆ–T\E+YëhÏ%±MŒÓÕ…‘–G FÁ‹Ù¨™^ÐØ0ØoÁéãØ`XF§¬D‚µ@H,áÊ^,M.ø2ÅØí×+:„ S "-ƒàÍ{±è‚1:±ï`5‰QÄù7®œ ’2;×AU©5@Cuq5Ìhí¥XtmÉ Ó£èÌÄÅêÙ\êDI Â]¼]JgƦGá§¿´>d­ûœõENS%çh0 ՉܣÞ"'Î/ `/)㯠ìüzöh7Ì´“Â-&1rãîÙS}lZQs¶u’'9E•f›SOL‡úÏÔÔÃñ¶{¼¿…gŽÏqˆí›t(‡árn¤L­¢¸²˜Mv(=TKµÞH±ãÄ£ûUûnÌ/ nðÕ´9Ñã!-¥ÑßøšÑ6hÐjÀwR“@©ÔÙj¨-]Å´7Ô·Qª—’€&¢c.^Ã’eŸ2ya²!'>à—^mÕÉÁÕóY˜ï $.³ª zëëBKŒú#{Ê\ÄDT³w¿‹ð^AhQqÚlx’ üù©Cm a>vÖ¸ †Å9 ‹ó[EI %ÝÂæàƒJ=þ®:þ¤xlÛ_Á“º@>‰5`*ÑÓ¦Qš±èÄÛ²œäÓf–òZl]CèPË<‡†Nm Íj†—E‰Ò®a 7ÕòE5„†èñÕ¨Ôø4´1Ô‡É%5g…2(¨–Y6….˜ --e¯™´„hu4þmIËȃ‡ÚÔLÚª…¸ ÃÈHQÙí®"¾K Þü “p³bæª:â²$ÿ–«hPTžŸÛEõ¨9•ŽºrWÐáyã®ÊÆÜø&[R.—&uúã{¾˜»ˆv/!®áÙ?OÉr¾ÛÌÅ׌¤ÑGÕš=l=Ô°ž1š´D…N£-攋Ô0B„¶¶»u€×Ne­†À`™ÙBH0,ÎauÖ*î]¡çñ‰\¡€«ÖΫ‹ÊØÈmYÑDjqñÞbºÐFiNj <Á¶Jù¡öäúT]U<´½-ÏŒNæN{›JÜ”û~oYJùÁRÉ}kõ<94™U»ÕÊ£‹*ÉÛéfòà$¾*.ç®ÅUÜ¿FÏ'q›Ž*+“–Ú±Ê!"D«tÊ=ÞJ6|;‹íƒ¹¢g †–Úq]a » ¬¤¥Ô±sÙÊ<¦†`Ø@ ŸJõa u‰áhc2IvÎcñÖ8†¦G¢w–Sâ &ľmÎ$2RCð7£Çò«ÞiŸÛŽ[ DŇ»j¶Wá57|è,dÍpú]=œ¤F½ †˜LR}³Yº¹û˜±å/c½3‘¡± Ÿ«EAUU¥å‘<ùI0,~ŠN‹¿O¥NP)ÚWÂÄ}ª-玢Fãí,M¤Qà S~”û8Û:é_Š ›Š¶©©HùèüŽþÿoç¿o×a®ÞÕ(q{C·õ÷Þ®Ý{¢<…­¢;ÅžaËÆ9üXà¾åím ‰™\9ñBbþÈ3¬.šn¹qLûþ^[C×A½¹àÐÖ†Äåfâ?ó3^Û˅׌aà¨^ü8ÿkÞúÁ‰&0Š}/¡O˜–Êe_1yžUNÇ—rô[Ê mrɉ˜Åô7¶`ŒéDnçvøüùÃ(Rƒæ1óÍWŽà¦v]<¼/ qôÕ‡¿ŸÉ;‹]"RÈ9ˆD?™Kâ\e4©®®Æd2µH@¬ª*ÕÕÕøùža7§å tâÜ×øín¡qmx¯w ¾ýÅܰʎõ Eò:!Ä©šùùjúë ;ÖS›Ú¶jk Cé–¬²g­…øì@6~µ”Ü+GIe¥®øG¾\ÅŸFv"X>W «?ÿŠ‚ÜßÁ_*è<ãóù°Z­8NZ"¬T???Ìf3Í©¿!Rz†E³„øi±8™¡ª°˜1ŸŸ¹ý õÓžpÏ6M•IñÇJ ÞÃìÏòëÿX—$}ÇŠúWî}x¹RUGQ©³V`÷†ãkˆ{T—•ªº`Ú†ÉË·ÎG†ÐÐгvÿ%Írqb0Ÿç[ZÍþ K2µú}<eBü±2†_I†TÃIRH@Ïy|õÞJ½>”ԣȔ°Bœ…G´ “ÍáðøxyMsöÖPí>s½¯f£–áÉ&îîŸNÓ*÷ñt–I!„ !„Bñ‡n(!„B!Á°B!„ !„B!Á°B!„ !„B!Á°B!„ !„B!Á°B!„ !„B!Á°B!„ !„B!Á°B!„­“®¹ Z­V©-!„BqV0›ÍÍZNQUU•êB!„ç#&!„B!$B!„B‚a!„B!$B!„B‚a!„B!$B!„B‚a!„B!$B!„B‚a!„B!$B!„B‚a!„B!$B!„B‚a!„B!$g)×^¹k2»ÜЦÞÍSëjÁ]DÞ‹7siŸtϹˆkŸ˜MðU±zòß3¨½ŒåÞ)›©ñx©X=•çþ6ŠÜÞ·³Ä&Õ*„B †ÅY@­-¦È˜J”ÞÍáÝcÄS¾5ža¼8o%+ç=NúÊgyâûrªW¿È#óâøç´Å,õ)ß?ÂK«kPU >½!rô !„â ÓIˆæpn~™[&}Ŷj;G+XUaÜô0¡¯?Á“~Žj3ØÉÀŠe>¼cÏ‡È Õ¢¡+nHàš/7aÏíCD÷‘\ëæÛOJÅ !„B‚aÑúùu¹›7wðÀŽ ¼x™“wþ1~ÏÿÎÆ†T7›¾fÊæ(.º>‘¨âhlsd{uéìaѽTì¦ÒÓ‡ 9ê„­Ðp»ÝѦM›f®©â:´ŠÙsVQ`×Ýe0#¶'Xs¼ô­›‚ºé3Þû±ì×Ùøwæï· ‘/J´:>Ÿ«ÕŠËåÂçóýáùi4ŒF#f³æÔo3KX"š­ÎR>&'Ÿ¢ ùùèqlàÉËþÂô]ny“?wð'8u“Ö<Âã‡PÕ±#Ò ßîÆ£J= !Z§Ù³g †£££¹êª«šÙ8béÜÍ ¸ž;âí¬™6‹¼m“ji:=-åDëf]Ãß³~Ž—ì›ÿ%ëbräK­’ÅbA«Õ¢(x~ªªR]]Õj%44ôÔƒkù Esì™ò7nxr)+^ºË'<ÄœÕðgpÐøgñ¯Ù«X<óEz®¼Û?Ø‹[ß–!÷¿Ã7 0oês\[Ý?’ ­Ô¥¢õñz½ 0½^OPPYYY8NŠ‹‹O¸®§|;ôéôHFgŒ&#;”Ò­EÔ'½ÖžÏÌ·Þ%¯È}ÜuGo¿l-K+:00Ý,_”h•\.&“©EaEQ0™L8ÎÓ²=éÍ’rí³<|xë/{‘k|ðY=yîž.øu]Ю×\ש¯¯ ôºdb¾vòìÆ”}‡<4'„huìv;3gΤ²²’ÈÈH¼^/yyyh4¸úê«s}·µWPrÞ‚!$ƒ½ keÓéµ$ƒ¿¿wYÓËØ=Ð88°r'AÙW& ¢•RUµÅá£bU==·›O[0¼²t“·Í"ßR€½Î!GFƒ@½?Câ¹¥Ó(r¢ÒÎâ’ÔQYª¡MˆϾRˆ6£ÃÃÁÿæMË¥Üve¢ëv3oÚVtÉWc²®bÊì:늲ö-^XÃå¦bCBÑÊÌŸ?Ÿºº:&L˜€ªª”””`6›™1c‘‘‘' ðº}h Ú#C­­×…»®ét1–>£b•šƒÇYæçÍ;ŠØ\J狎Z!„8­NK0¼¼d ¬~—÷¸‘¬ðöøëŒR³?·cëËwñ¯U“y¢ÇMäFw:; â±rØÎ~à®(GcF‡Ž˜þ#H~î®»p'•uÄ÷¿žgîË!È·’šeO2î?¥(Ñ=¸êßÏqy¼jWpÿˆ;XP]¿Ù»vǯÇS,}c¨,BˆWYYÉ7n!!!ìØ±ƒmÛ¶1vìXz÷îÍ¢E‹8p z½þ8[PдøÜ~î£R=.¼Z#}Óéºf¬ûó2uå») H$FN«B´î`øõ-Óy´ÛDzE§K6â¯3Ò;&‡»]Ïë[§Ÿ½Á°.Ž«_}¸þÿC_楆dmXŸù”‰Ç¬Ð‹ÛßœÃí“zòÜ‚5r`!Z…ŠŠ Ú¶mK^^;wî<2‹D»víŽ<%qÜmÌl¥ÔxS0jU\–rÜAY„„¹šL?zFã­[¿Œ[IjH:þ2ÄLˆ?Ìiùyí´Òã¬ðÇËJ#ßr@*B!Z£±¾ËÕjµÒ·o_&L˜À°aÀú'äüüü~»¯ "$ÏVî²Rç<ÌÆµbÒÛtœt?×A~š5›užã®[Ÿ£{¹}°Q†HÑÚƒa—·£V/µù[ ®Ö€Ë['!„­H»ví dÉ’% Ìf3¸\.–/_þÿìÝw|EÿÀñÏ^OïH'@ ”@"R14A좊X°ü¬€¢b; 4AiÒ$R„N ô„„ôrw¹~ûû#!& „ˆó~½ž×#›½™ïN6sߥQ£F¸»»_¼u0ú´ÂºiÓ¾\ÌÉF=¸µ‰R5Û±ëÉÍʦ ÌYýgpb6ZQ¹jÄÒO‚p Ir-<Š×úçìúýe}Æh7³úôvvÅì°ÐÐÕŸnÁ­iéuÃ6ö•´“ ‚pm8q‚¥K—âããCdd$N§“ÇcµZ6l¾¾¾¢‘á"²²²hذáeN¶[(3ÙPè\qQ+ê¬ÞÊ®ËÒjåìãÕß¡””tˆÅMåÂÁâ“ÌHÿ ÚðzÛ¸þÛ³`ìò™„ß2‰'½ÄŠu‚p=È%›™:n>ϼËÿbt—ØÛÊ‘™ï°é¦x¨©x:é¿,""‚ádzyóföïßR©$$$„N:]zTX„Ëí©1ŸÙÏæäög”œ[9Å%°m;u¦Mˆ“#ÛáÚ&‘0—º™ TçY[J~ÏlýŒ{÷âñ˜$4çM¯H+9ÅË)_óì–Ïø¼ó³(%qcHnxe©¼óÌ|ZNœD¿ «[HUrkJïawâÒ¨‹øÙ²Ùy2€„¡Z°gðó /³äìÛo•„´¹ûGÜAœçåöCfL{‘ß:¾Å¸¶®µúb:¾šï¾^Ä– J¯(:&=À}½ã&N=i+f0ké6NxEudÀ÷qkãŠ[îö ~~é ™Ê¨K^(ü÷øûûsÇwˆ†„kÊAÉ•Ì_•Ž@íI€¯‡>ŸÂÜC$/Ng—}‰cÚæR7‹k×i2lw:x3u&ãz0¦ùü<Æ+Œé]žç®µoðˉ ìö/úKbN— \o*?ZõèZ³þ(oé^íè§€Ò‹Îã§2*F‹]ŠMß¿Ëg3"™úd<®—58á ¬Ô‚³¶Íz‚_>YHÉ­Ïñq÷0¤œTV¯K#ÇE”ÎÁéSyo™'CÆ|ÀøP™ãk¿ãÓ·?„É/Ñ+H¼­A„ëÏž¿%«Ò1âNt÷þÜÚ2ÀNñáµü¼üúgÇU§Éð–¼䛋y,æŸWß饙”ZËHðoÊð¨,8¾¡fɰýcWÌÁ'¼!igN‘m²õ0ïµh/¥lOŸÏ'‡·±ÇdÇ7à¦vH[Î\~ÛñS3Î`VÐ5noFiY³³Ò¶&!È%x+åWÖ•špñîÊ„NÃ馓0­áõ­ Y­—‰hÐ7Y"Tœë‚pdÌëøá«EìÈ2¡ ëÆÃc{›¾ûˆŸ¶žÁ¢ Í 'x´‡Ž”ï+mëªç«ÿ›EÄ„IÜÑ@YuYÞJÀAñ}hº–ªVº°Uy„Óá–HæÎËDïl‰"k=3¿YÄÖ\BÛ‘ôÈCôŠtE²çVŠëAÚíÿŒÏàà“<âÑ‚ÇßyšÈ³ù|î6²ŠJ0ØË»Þ6c?ç¹¦ÇøôÅ%4K bÓâ¨û¿Ê˽°U·ºS_Z·‹Æ×U ‘YrÙA/˧Ýã/Ð7¦|$¸yÿÑŒ<öß/Içæ‘1ˆ±`A®·“¥PuBßV>œ»LwÈ8x´|´øzŒ£Ôee‹O뎛ʀÅ'ˆóŽ ­ä'HÿÐŽ$ø7%1 –éi¿asÚQ+j¢#—4Õ}|Ò«ž–Œ_ý-Ÿ¿ÍëþÌŠÆt¿—VÚBæl˜Ì»':ócÓ@¬ù¿ðQ~K¦%½AŒã;L¾8 fýc›Æv˜)ÉK°5‘µaÞœJŸgví£M‚†“’9†Õ1˜sódŽSœé‚p5©°és>øÇñLëìCΊwùð§}„wßÄÜÃñüß´ÉDØN’Vè‹#}Æ?¶©%ý%Ëj6ºn”rp—DÛ‡<ªX²JÆVr” ¿EÛ$ /ë!æ¼?Ÿâ~/ðñ„ Š’¿bÊû3š2Šf§~®ƒ?±·¾‰ñµ—Hü1/µuEÖ§ðÁŒ4ZÞéÜ IDATŒ}Ÿ X5e*‡ûNà±.`ʰdwG&LA°FB6¥U÷¨hzµÖóÅ_!ß3ˆžñÁè*‚·f§’N#›œ÷–2ɃØ[š`›¹‹[ ábm.A®³#§í  §}ìy‰pÅ „KHkÊ×tÔ¾4v¯»;Zuš [vtÊò¹|ÙeŒØøC"º²"s+··æÙCÐ*ÕÈÈXkš +¸%´1Þ kÎ@'¯eå` §Ktd§“E¹8uJ² ò±ˆJㇻ5?ó󉧃,ÅÿÜfÌYÃZuf„¡• :¬;ÁGSÙŸWÆR>‹‰%@ ¶¢©z÷ {›ìN>ÜžÇÚSrËì×-Ž@W=Ã=x6ÁJQ/c¬Ícú¯1YÍ·¾¼Ú1!{à·v9½ýq1f÷¡|Bã#hî¶“ÿ܆ùÒeeÙZm9ÂNKKîò9¯½%$OI2JךtÆów7ANÿ”mŠ®Œë‰»Ü» £÷Š7ø=ÍHl@18Ì^«Ÿ GÓ„ µHê@âb5¬;nDÑ®b…¥?u&X#]…f™îõçvU&Ã]‚Zòö®ŸXš±…¤°Nt l΂oÐÐÕÿ\"lsÚ™{l-½%\á÷©™S¥F<=p-bÂq&õzе““i;Y\ð÷¡7hÄ{ ú™ñ=mMÛ~£H¼`Û\šµõÁÛ;‘é·ÞFèy¿7CöG(­¹;á¿ðlÊï'ôõ*ž•ÇKÿ‘8Ö·kã˜þœ6첕RBçãƒ{X^z³/•ÿ®Zä©VýÈÝú-?ÿ‘fICP£<ï^ÍÅ.·Œ,KH p#ü滼îyV)eplž†tò,2áê¿kSöI ­ð£Â‚ ÔÍ¢\Ù½7›-)™Dw E{AGh§4398”º^¡¶N ¼5î<7w÷ÌfgÁaBÜPHå­aw:xmç÷èm&F6ë_¦ùlÊH'×a!#kŸ10$ÉVJ™,2F}*sNec­ø’(É[ÅŒÓ9˜Pããæ‡+v ÿ±Íί'ݬ+xÿxì– vë͸øt$Þ²‘/3²)s”²÷øj¶Yäö.6;êUz'ÑZˆå¾ç‡0ëë)ŒþÁˆÒ3‚ŽÃG3¬‘šìyoñäçzœºP:Ý÷qÞû˜?óümOã’ǺŠ:$תÊz‚Pû.Žù¶c` gaI®±ÜûC™ùÍŒùɈKXIÏ •»“¶r\Oãâ†eà­x|ð*#×Äðà›ÐÞç ¦>þ@Eç£Ã¿YO~r-5U×WUÜuJâÁ›ç0÷« Ì,´!yFÒåîg¹«±¤úÜ—Hò§ïñm8·„É_û J:ñLï¿;úsó¢Ïö-˜5cœ8!A¨ ÷fôTÂ’E›9}` ¬«üí@ó˜F¸ÕñÜ®ëö:æ]G˜w|-» ŽbvXË_ÇÜ 5w7îqnµ‰±`ìòÙÄvƒ‡=ê÷|…óë˜ã8TïbÚóP³zãÕ“PÛä¬x‡Ù¾OñLêbÆš%}àÙgoÆO)ã0ç·‰o±oà‡Œ¿©6cpP’ö¿,^ÆÚý"»åîa½ˆõk ‚pm]îk‘æíØÉ¾£™äëí(]½Šˆ¡uB<ឪkVou®ÛͳÖ~Ñ´ö«½çedq6Ö1•‡7ßöódÙ² æ®®ýUž>üÐσ%K¯¾¬ê¸‡„°¼E1·¯4`ªµú4öÄ3³˜ífqNÔ{ÎbìQÑöQ7êæÑ s^&ŶЇÛ$dS.Ùf?š6ÐÕr J¼bz3â¹fx¾6‰­JOÜ•2N‡Y¡B)–V«þ·dÉáÀ®£˜ýâhí °"õ°‰àøx®t˜ÊšÁ²Ö8ôÚûü;/Jdã!~ù'nIÒ«‘Zœ,B­P肈íÜ—ØÎõ$Ÿ¿áJÙ ¥¼²ºŒBãÕ'¯v} /¯6ÖJYW[Ÿjþö0…’öͼñÈ/a»ùòb¿¬z„Zêýè>î…:¬PÂ3á>ïý†·ž]ŒB«F¡m@ûûžgPø5J,4á |á)¤ïgóö“_ ×¶â‰wŸç&/‘ WwÁ¢OÛÀns8îÉ›ð ëO„ÆBFòŠý¼ÈØB£›ü©?©¬Œå3I‰¹ÁQÚkëÒªsG´¾ªMÌ‚p]’a­RÅaC«¼Wª8ÞKšTïÚâ°^Ÿö¹–Ô®¼z›7³f²Á*Ñ0"€‰ñ®ø*%,E¼œ\Ì ¥ u æv7VlÌb–Q÷m3ÊÜx½—ß-Ìd“­ê²Ž]öóeaƒ˜ÒÖ ÙAz‰âï^s^} ¦÷ugg¶’®þæ®ÏaG€õK4`b[wBU¦‚bÙ= ÅÙ3‚®gòlÄ=2I­ÝR‚¡°˜·’ IµÚÊõœá7£¸£q£“´¡ôxì zÔaJŸx?Ï`Ñü—”üã4Rò„ôéˆÏÑÍ,þü£ŠŸÒµ¹'™¿ýÈçéíxêþ.WuQT{œXL¶º»ªô 2¾ù¿+fA¸ÉpS¯PRrÒ¥A¼hÑjlÍ=HŒwø{"yzófœƒWœ`ŸMA›aŒ 7ð²ÃŸ¡rƒ0¨U¸;dP}áT·,–ÍÜLPb§ö%·ØŽâ’ƒÐ\VÌI„ö±vÕŽZQ´ gÿ›‰::ÊEʼn>}+þÆ€Mõí*NwáZ&ã[ â•mß2¾íýtnF!f_œësœv6eïæ­?29qä {œ~Áž´ò’w«N@©–0é˜N–°µm wÒ0ë`1ëŠ@Êÿç¶š”u¹|‚k åuî=\BÉm4VI­T ןÒ+’ÄV¡“µq7¼)âD¡+á2y'MÄtmBæ®Ü‹”àĦ ¡óÐ[hèj`×ÂùlØÇð¶^åk—:ôdÑïxöñÛÏ+Ùþ½rØøk2Æ„Áüo¨†´Uü²dÞ÷÷!¢ÚºtDõ¿›îs~äHÇGò)—ˆå‚/§3,îÀûºAú¯|¿bÖîC:¢7…É?òËæ âDñI Ölö$0øî[p)HfÖÂÍdĤñåÄl=ÍÚ%[qtÊ£1nï\Ä’ 'iÔ/ò¼úª?ÉtŒµëN>ð!†úêÙõËb²Úã¶p X3«oW8ß…k˜ w jÁä#ùbÿbÆnù»S|ÕŸ¥V¨háÉ[%10ö†=N 0æäñøZ#† {N^úÕHl˜7u$i÷Iž;ZúÏm™5)ëò($ dj|kN¾DýÁÍÊ&_¢ª+·º ‚pý(\׺5¤9)‹nMC9k†/­Ë±ÖÊ çáü‹àNd«8p˜(Ê-FvUPš]Š/4*_š·!ÐE .q´ßÊšcE”Ùw‘.5gp‹@t*ÐÅv¦õÎy¤fš ot¥s‰X.øö÷%6>7…„3(/­D«XÔø„øÂ‰bÌNþ™ «|‰k‡ðÁO:Fq•;^d({Gt ÜÕÌ•þ±ñxì=F¡=’ªK‹Ò˜K±ª!‰¾j$•¡!jöæš‘¢Ý±fWß®Ñ"®a2 Ð!0Žq¢Eÿ£ rôä$ø1Ô×Ä…N4.j\,6L®.4v˜9p¢€É*7~ Ñà™£¦A¥mÚÌK—U|™O›ç—ahãM×2VšÄ5Р»Šc)È1ÛÆ—~žeÌ/o5N½ŒÞ© ¦¿¾óÿûâõO?Ã=é•6̤÷Áóþ},‡Ž]ªNAꃫvZXe7dœX‹Ž²ë`¯óvpè9™žM\Û ì'·œíMËî^¸¸¶"Ú¹ŒM{›Ñ¯¥†´dRÍôÑ‚Ê_M1GN•ÛØÆáäíäÙ=+K n:™Ò3ÅØ"üP(Uçn:]2–kšMÔ:%†G×ëkã˜A¸¶~—ÂÍCÚÀ¡TÊ¢h(g²=Ç„(™£;Š këÆî›è0|€h¬z–½žŸ·rGR pZrH™·€Sfh3Ñ@×Ó餤¤³ÙL]¤•’$¡ÓéðòòB¡P\uybdX¨‘Û"<˜—V\oâééYïc¬cáÚŠô8ʲ9iåÿØ™vnû¡-åÿ¿õ¨ýZÓA4U=!c+)Àèð;÷Àl)¡ÈæAC_ñºèëE¡Pàããó¯_Œ 5b²;ùp{Ëé)µ^¿ÑW/­’~Qž<›àN¥¨—1Öæ1 ‚ •ØòÙ»v5ÛN‘Ô*j¢;tã¦h/1Â'ˆdXAA.‡†AAD2,‚ ‚ "AA‘ ‚ ‚ ‚H†AAA$ ‚ ‚ ’aAAAɰ ‚ ‚ ˆdXAAD2,‚ ‚ "AA‘ ‚ ‚ ‚H†AA¡^QÕtÇ’’ÑZ‚ ‚ ¿‚——Wö“dY–Es ‚ ‚ ÿEbš„ ‚ ‚ ’aAAAɰ ‚ ‚ ˆdXAAnl*Ñ‚ B}PPPÀ„ X¿~½XÁH¸®¼¼¼èÑ£'NÄ××W4È N¬&!‚ Ô #GŽdÙ²e¢!„z#))‰/¿üR4„H†AáÚkÒ¤ F£Q4„Po¸»»søðaÑ781gXA¨D",Ô7ƒA4‚H†AAA$ ‚ ‚ ’aAAAɰ ‚ Ô¡i³øÁ°sk‚ºuù’ “ð‘®®\•_Gžøf-;vn#eÇz¾ÝÏjÊTx¶eÔ×køks ©)¿òF¯ Šx´Dÿ”?v¦’ºc C]±½ñÐWønÝQN.:?V —&Ãùpé_ìHÝEÊÒ·éß@u™1UU§šˆóHÙ³‡={ö°gÏ~Žefùƒ!µº–ªäÚ”;'ÿÌæƒ‡9”¶—¿æ¿Fÿ0 ¸ubZZžŽ®8~@ÊC+²8ùcO>žøøxîxm»¾ä•…§±×Vƒ)ƒðÙ|Æzþ̈ÄXšÅ¶çž¯O¢P—Çg/-À÷Ž$k*ráF½Ò¨b€ägo¡M›6tyt¹;ÆÓ+¡ m:=Ä‚l á—Dÿ¦.—8ÎêÛ¶ºý«/Gɰ Ô”eùŠt«Ì¹ÏòÖÎ2°f²úýG¹½s{Ú%ÞÊ“–qÊ 8‹HùêiõèL§[óü̽è€5ƒUï¤_çDÚuìǨi[(tЦ¡_XÖýL_Ƹ'[ãúŸjð‹þÜ–-›Yóí“$z+@È y;˜Ñ× @áOÒìÍ|ÙÝ“³‰Ž¢TVmΊŸÈh<‹rÊXUÇä¤è¯Ï˜ºädÊŽoå˜2”@­϶IDìæ|'öÓ+™u$†-Ýy»ÿäÏ]¹XÏ[ÈԥŽô3Lç³? pà ôÈ^²-ç%þÕĤŽÅÒ]¿0"B}‘:+H>tw?E~FªA]†¿³€ [·±cO*¿Mè‚ðîÏü¿f0á­o™¿d©›¦óHÿ‘Lµ•›·±ð¹Ö¸7*­n|/cÚ$óÂøŸIÓ;@6sbõ,9j.¯ÖtåE=ØD ¨ íÛëê”Õ0-ñl÷÷Å»W$(Òe¶mõû_²½‘ Â%GOʲÉÔF¨¶ræDk±çïb»½ï¯ÜÊÖ•i±õ&­É§4å}^]Ê‹ 7²iɯy•RJ)Þ>‹Åö!|±f -|Ÿ__ã“Ô2Ѹ‚ \’¤V“=çmRz¼Ê½‘ÞàVG=̯‡1÷Þ›¹©Óm¼|b_LꊗœÏŸ?$ö®D¼%|:24|'sv”rþ"ûÊ $>O>Ä²æ¹·H¹äŠZžm›½š}%Þa>OæcÀJ~†ÿPO”Õ|õºGÆ . âÁϳòUÌ}£?!•îÙW“=w#3¦Íà¯<.Y§ªÑŒŽMfúŸE8lùìžó}oJ¤]·qœò2•OžP5AZòÓúóôî.¼ô°“é#‡pûÐÏq}ðIÜþŽËµqGœZÍ>}Õ¯)P¨-lŸš›‡Ä S‡Óÿ6=‹¶šP_ÑtÕe¶muûûâWM9‚ ^Ç,Ôˆyï‡<6nJ=9:T ®¢‘A¸äøÒ°?,bÁø>¬þÁSPâßéB÷¼ÏŠS6ÀFêOó(ž?€f.ëIÙô#^F;¯ÕlOBøŽoØYzaÉŽœ%Œî¼‚WÚbúgÓ:x󲪟X ðê̸I ü1î5NØ ¢òû«$rµ‰´ÚE‡?¶Æ”¼†<8o!“oMæ¡Eç’ôªc:ÀÏ_ÔD^´N%þ7&hÇd™ÏXÌÑ3Ñ$=ù?nnCsÏrüT ¹ì(ÉûKp¢&çèÎälã”Å'Èa¾Z eKçeµn71å—èà}ÕÃôžXþó’-ó8>âNZÇåÓ-oÏ çÙ‹&Ã:Z<û5ïÜ€KPsYþ?g–¼Ä;—Õ¶@•ûW·]¼w¬68NJJJ°X,8×þv¯B¡@«Õâåå…Bqõãº"jD×òY¾˜hâ¥C÷ñþf¾ù¿•ÜüÞÓ4מí|¬ìù…™{¹õ¡³ƒ0¬XÏÁÒXZp” ëŽQpê…öθ«þî˜gCƒþ¢A¨!9Ë'òÓ#_óxó4lγy²|Þh¯|.÷‘‹7óÓ¾ mŠ4$œßïB_EÉee%”mü’O=À#MÌ˪&m÷OûV‹á®-¥ÈHËEÑL‡ÕX†IíN@¨–¼ßõØ6,+ c&«½">†ì ެgk–§ãkWe2°‘+6kJ ‡Í‚ÕfäÔÆéL;ö(£â]™—u6‹·St²×6~¨ Z+êt”6Ф[(gVçl.¬Ž|„Ù?uçÏW^çµoáÁßf(UKžßŽNYâüÝLǶ’ÚX÷ÅlÒoáÅÛ:áyë,~¬Aªø¤\šÂÜC/ðÌ+Y³ È9üRC.ìûð~nÿPIÃæñAÙãܳ 'Þý.vœ•U×.…äëª.G¸zÅÅÅ(•J‚‚‚$éš×'Ë2¥¥¥”””àããS —Ù‚PC¶âÔÁÞ¨ìÅä„÷Ù¤Ö´‹Éý;qÛ#Ÿcô"÷7sÁûæqŒk¿‹Wö¢ÿ£ßݤ~X±Ÿëa”nÿ–YÅ·ò@‚¸M%ÂåtFǘõÆFGuªXaÁAÞæ¥œn5‚¾¡jÜßø‹÷V›Ê‡&áÙ9¦s‰­[óÛhrìGf®MÇØ–ÖW¶–‚õȾ8Ôƒw^K"ÒET¸ù¹U]Ó“:o?ÍÚgòó¶®|üU¾øq^Æþ—WŽp9, žžžu’H’„§§'f³¹VÊ#ÃBùRK¦E IDAT4/ü°•ׇ¦)åd¶’´—µL¿-þþmƒýd•‚K w5óNÎGvdW}œ’o/>ùùMÃð÷kÏï›þÇ’'ïbRjÕû;¸H{ WE–å:K„ÏOˆe¹v¦¹Hrm•$ÜàLìzw©w¾Ï½Îø¿%7ñîs-ÑUÚËðçÓÜñùMÌúñBÎõ²F¶½:„·ü>bþ˜ÔƽLõ,É]>fú£Íq•Dë ‚ 6¼.õZ­Vl6¥R‰,Ë8l6-ÇÍæ±3n³±úDÀnÂd×à¢S–O'pZ)³€VíÀRÅvN‰ÝbGÒhQ9«û¬‹MV§A‰»ÕŒÅ©ÆÍE¬Œ[ײ²²D#Ô ®ÇßomÕ[k#Ã[sðÕ%¤ŸÂh3‰3£‚›Ú…ï0‹@b`ì¿øHlæ*hà­Â~<‚¼Paçôâ7ù²øvFoOí+îGuž%Û˜¹ÌFÏ!mvLgêŸÁ ›ÆrŒ¹cŸcyãñ|7R$‚ \_²,ŸK„Õj5v»»ÝŽN§Ã=a £]¾æ½ã% *õe’|‘í’®|´@vT½¤Ô¢qZ°˜Ê@R¢V)‘Ä ¦ \µ’ oÎÙÇ«)ßòfûGhíוV´l“ÝBj~:ã·}Ťö#é÷ï<{ g¬~4Õµ U°*TwíOÔ»ñ`÷ÃÚ\ ëúSÆ&âîÜŠ>y2C>ÎE jÏÝo¾Ë°085ëe¦n+ÆÒgiEÙ~CÙþû8q²‚PçÎ>ù®R©Î%Âg™wÈã[L¸¸¸\ü‰uI¢ò¤XYºÈö~V¥Ñ¡ªxq…ì0cCŒµP+Ó$îÿc"Å  KƒxÑ¢ÕØ˜½›o.eFñ¢1Aªp=n³Úív, ®®®8œN' …•J…ÓéÄdªA2|vúƒ‹ Û͘ì*\4NLUmשþNk«ûìùû ã°˜°H:\5â¹÷º&¦IÔ¬þÍÓ$jå¯êpIíÿÕS®½±¤Ÿ !‚P 77·:¯S©TžKŠU*•Jun›$I—^ÇT¡B%Û±ÙeØlN*%RuÛeV³¥|Y¸‹ìc³9ÙaÃêP«D"\×ÜÝÅêþ jå/Ëâ°¡U^þ¤~«Ãƾ¢ã¤ä§qº,ÿ†nh­RƒÅagœ B5ºuëVçuJ’„Z­>÷,Ë8Î ª«ÉW©Z«F¶–a,3ãPjЪ¤‹l—q:8eù"û€ì°Pf4Rfq¢ÔêP‹\¸ÎõèÑC4Â5$Û-õL¶ë;!þº,­f´›ùâàbØ„Éñ÷ËØ›x†ðL‹;éØüß÷µ`ìò™„ß2‰'½ÄŠu‚P§jÉf¦Ž›ƒÏ3ïò¿]õ;š÷óé󳈘0‰;œý;µrdæ;lºéj*žw¸ž¦L™‚R©dõêÕ˜Lu÷ öÙ„×jµbµZÏ%ÉZ­öÜ(ñ%“j¥«ºfÛ%:WÕ%öQ¢Ñ¹¢§ÅuáââBïÞ½™ ޝgÌ–Où¿w1,ª»8_áU°~2/¯ˆe¤Á„ªÁ‘·†I¯m¥ë›/ÒÝÿòW>•ÜšÒ{ظ4º‚ÔÁ–ÍΓ$ Õ‚=ƒŸ_x™•¡Ïòñ3mq¯è‡­Ggñ¯¯§ñ¸iŒi¡«¶ƒ7_Íw_/bK†¥W“à¾^q“§ž´3˜µt§ ¼¢:2àû¸µ±[ùÜP{?¿ôLeÔÅú˜ŸŸ_~ùåu«ßl6“——‡$I×8¾ÞÞÿ}Þÿý*öüóÏóüóÏ‹NG¨'”XÉüUéÔžøêpèó)Ì=Dòâtöx)Ñ—¸Ñ1¦a.Ê:‰ªÎÿÒ_Ýù0£ëK¸«ÿ^†»‘«?cšßIS¯P^ÙñM½Biíý/úKâu~‚PÓ¤§Ó=t_ú vÝÊ3í5Yº C—'éä…ŸÊV=º^ÑGíy{H÷jG?à”j”G7pÈØ†w °’±y7&•æâÏò[OðË' )¹õ9>“ÊêuiäX¢ˆÒ98½b*ï-ódȘ*s|íw|úö‡0ù%z)ÅIQèt:BCCÿuqŸMv+'Ä"ê{þv–¬JLj;ÑÝûskË`t ;Ň×òóòèKê~ÊD&ÃGJOóç™=Ìîöʉ0€ÝéÀ!;éÒõÙ»ø>}û=Uƒ–=ÀØsð oHÚ™Sd›,„E=Ì{-ZàK)ÛÓçóÉámì1Ùñ ¸ƒ©ÒV#3—ßv|ÆÔŒ3˜•tÅ›QZÖ쬴­IrÉÞJù•u¥&\¼»2¡Ópºé$ŒEkx}ëBVëe"´ÁM–çº \š&‚¾w5eü‚Õœõã—=aÜùzå“dÌëøá«EìÈ2¡ ëÆÃc.OÇýBÔ€(ö®ÙÎÉ¡IÏñ\R:ËyÓË8¸j.óWláH‘Ϙ<ýÌ`š¹IUŽR؇6¡+ç~¬¦UÀ64ж½’5ƒ¿Ò¼iÛЂUÖ³í½gYÒò Þèˆ0íŸÆ¸¹™06€S_Z·‹Æ×U ‘YQfÙA/˧Ýã/Ð7¦|$¸yÿÑŒ<öß/Içæ‘1èÄY!ÔbB,a¡>:ùW @P×!ômåó÷2ÅxâªÓÁÌmy‰ölDŒwØÛmN;ãR¦3q×Lú‡v$%/ ¹¦o3wä’¦êÁ'½Þæ÷Ûî#ðÄ·|’o˜1Œéþ1ÛMd„c5ïžÈÔåÿÂGù-™–4ä>rg€/Ž‚nÓØóaòlM^dí ù"äïíÚG‰íï'/$;t «ħQ^ìbEtA¨ ¯6øM½†iŸ.ÂxË0¼*2bοâ¸m<Ó¾™Æ¸öÇùñ§}eÀ”ÎúŒXF¾ù¿Ò•‚å Ùo”ÿ‘àZU±Ü5á3~øæ-úÛV1ëÏ<U…!—rp—DÛfç-u¥ ¨Crÿ<ˆAkÆ_òí@¸FɸžM)þ+•€•Œ­Gð¼©5~îÑôj­gá_±l÷Ìç…eÍN%8º6qû»ɃØ[š`;¸‹ñl­PK ñùÿ„úæÈi;(ÃiëSéUà.!­ILL$11‘o¢±{ÝÝ1«Ód¸ÀRJ ‹9¦Bî^÷&饙ŒÝö%GJOótó!¹ø`vX1ÔôMvŠn mŒ· ]s†:IÉÊÁ"ùÐ%º m]d–äâÔ)É.ÈÇ(5~¸[Óù3?»6œÞn¨«Øf.\ÃZuž B+i‰ëNpQ*ûóÖñ‡Ô…q1±(] lESµX]jLHÛwrNéèÐ!øÜm*ó‘ÕìpëËÐŽÁh$-!{àw|Y6@Ý®½ãñSIh‚b QrÆPé"TéC«^7ÓÌ×Aî©\dO%éyT•oʆ#ì´´$Îçü®Ð‰2´ 1ù²_o&ã¯ÃÜÜ\Þa»ÅÜJLq2» `ËbGš íÛø£TxÑnÔdÆÞªc×·/2깩,HÍÇ8 ¹”¹5 ò³µjŸ†¸™rÑ;Äé ÔnB,õ‘Ñ h=q«ü¬©Ò‹è„ŽtêÔ‰N:ѱ} þuøôhN“ðÑxk*À_çM”GCî^÷& ]ýùºËXuÞ‰r¥7•Ë8¹hÔX,fœ²iß1夞ðÀXÉ oÒzâËÄå|°÷ z¦FsÛ‡TyÛC 4RXü®XSqå`G/µÀh*Àª#ð?2QØdwòáö<Öž2[f¿îñºªèîÁ³ þè*­½Yßb­cºɆ},Ù¨¥K»2Ö.;DÏGâp•dÌE”ž<ÈÛ/¬.ÿ›“m”Iñ8*K T ¹byªósYi¿}ÍÌ¿ôÇň„Óî¬ò>“éøvJ›ÝÎ?¦*kÃèWį{t4˜®Ý)^VQ­kz4×3W!·4ßÅ>UªÎuè1½F0¾ç0Nnú‰O>yûko3P¡Dá´ýãd‡ §¤Ï‚ðŸàã §Œùše¸×ŸÄ:M†;Æòᾟ9¦Ï"Ê£!&Ú³ýB;T1b °êôv:Ä¢® ¡d3§Jxzà(ZÄ„ã>Lêõ j''Óv²¸àïCoÐ ‰÷ô!3ã{Ú:›¶ýF‘xÁ¶¹4k냷w"Óo½ÐóÂ1d„ÒšK±þ Ͼ|°=yiÅõ&žÜ2;s–_X½Ô!°^ÇZÇt㱑¹j.›ÜÍä»Le6d¿Î Uè||pëÀKoö%ðü¿-ó~V× dëñ…L_ïËc“Ÿ!ÆÕÉ™¥ÛÙ^ÕžfNmÏ'ò–à*:B ¡›“ûér›ÜÍ W‰­ç~¦£q÷–æîâ¸s7ÎÖ¤‘e In„ß|ƒ×=ÏŠ#¥ ŽÀÓNžE&üÜ$SöI ­ð«1 ‚ðÐ,Ê•Ý{³Ù’’It·P´¤yvJ3³‘ƒC©ëjët@¢‰g]‚[òfêLL IÁˆ¦} rñ=·ÏÆ3»Y™¹•MúÖ¼`g>›2ÒÉuXÈÈZÄgA D²•R&—/pnÔ§2çT6ÖŠ/¡’¼UÌ8ƒ 5>n~¸b§ðÛèüzÒͺ‚÷g`ÁnÉ`·ÞŒ‹OGâ-ù2#›2G){¯f›E¾aOàßOèëe\+—þkb½šcºÑ8‹¶1ç½5ÇçCo±²bîJœ kÜ‹¶Æeü´áeNpè3HÏ6×ô œæ’ŠùºNÌÙ;X•|æ¼)*I.ó—5‹§жšåØ4!i%½¹ ®•®Ëµ·ÐÚ¸†ÅëÍ´lß5`>2› ¯|ÅêýY”–ÈÝÿk2Ýiá‰&¨í=ð{JÁßs—¹lY}ŸÄÖˆdX„ÿ€à]‰Tƒ~÷/Ì[½›ÌR;2à4呞¼˜Ÿ,döŠ4ôuüVwÁ¯µyˆ‡ÿœÂƒÞflËá$ø7C!I[ Ì9úß^Îqƒ.oY5… n†å<²d?¹ê(´‚»=T¨]’øŸ×ÇŒZ¼ß.<Ñ ¯¼Š¨Ôßû=·êq¨B¸½õã$êöóIêùÛFÓÎÅŸV]ñNÊ»tÛQ†RN¿øÇ‰ oÇk‰G»ýe:¥x߸½<ónظØ\?'5UW}õjŽéFsdÉ2Z>ÌÁå]PØmCiúâ~;ÖŠû¢c¹ïù!Ìúz £0¢ôŒ ãð'ˆlW³²µÑI û€w[kã® ìÚ ÷´³nZ5.å›ï’éò@Ç|Û1°ºeÔá øNWÍ•2å0nnceBrk†6*Ÿü¦‹JâÁ›ç0÷« Ì,´!yFÒåîg¹«±¤úÜ—Hò§ïñm8·„É_û J:ñLï¿;bG É“G’|®okÁ¬ãÄ7¨ 7…{3ú *aɢ͜>°ŽÖUÚÛæ1p«ã¹c’,ËW=œÙúçìú}÷/±xï|VdnE£P£V(1ØÍ¹ø0¦ùz7j_óÊí»|6±Ýßàaú=_árÛ©>‰ÿáP½mÏCÍþ5±^é1 µÍAΊw˜íûÏtð@º‚ÏŸYú*ïåàíÑ5|K˜ƒ’´?øeñ2Öî7Ùu(wëE¬—XcX„·¬¬,6lXãýæíØÉ¾£™äëí(]½Šˆ¡uB<ឪkVou®ËÍ9/;o&<Ìó-ïbÑqÌ+ ]ýiêzeó„¡æË° ‚ 8‹9°GEÛGÝ® –±ì`Ñ:>q¯ËUâÓ›Ï5ÃóµIlUzâ®”q:ìÈ J±Íu#[r8°ë(f¿8ZE{£l‡H=l"8>ž°:¦’‡øu柸%=H¯FjñËnH ]±ûÛ¹žÄs=+÷Ò¸Ñ)¨=¶%Æ;ìŠaáßMåéÃÃÃv±'Kµ|7<„.µðÝàÂÆ>îxÔ´îþ)5ö¦xs¿¤'ö£û¸¸Åçr»@;Y¿çÏý„©÷(ú‡\Áx‚&œ/<ÅMÅKxûÉ<8ú#RJÅÅüuL…ѧm`·YÉéäMdZ,d$ï Øy𔽅\tâ’½˜Cëæ›Ï>æ£O¿aaòIÊ®â×)éÒªsGšû^ÍX•ŒåßòË1‹øõ BMòÚ(D«TcqØÐ*¯ÃU¬*Ž÷’&Õû†¶8¬×§}þìú^^m¤Ð(׫º@çð+”´oæG~ ÛÍ—w—Upݻ̆w¼Åw\])JŸx?Ï`Ñ ×]òÓHÉwÒ§#>G7³øó*~H׿ždþö#Ÿ§·ã©û»Tùysæö;[2ä±;ñ4æ÷¹«Øþ ½C®p‘T¥‘ñͯò¨œXL6q¿Tê2nêJJîAº4ˆ-Z­¹‰ñ¿¡Ž©a³P¾ )áµ¥˜3»µ…'Vc `b¼+¾J KA/'sLåÁ×ý=ÙŸ!ÓØGMsÿÈâ‡"'hÜx½—ß-Ìd“SÃ Ä l¤ÆM%qæH6Oí(ãêJ“kÄ”¶nÉÒKŸøç×­ð`z_wvf+éêï`îúvøÿóX ˜ØÖP•„© ˜EvFhqöŒ ë™Òé÷,Í0Cæ×|æJŸ’7ìcíª--´¢hAÏþ7¥Ósðߨp¸»Ò“È›úÒ»Mç†mœedîÚDòÎÃd¸†$rû7ÑH+NôéXñç FÊŸûU9ð1Dh°åïeÝê-ε  hLûž=h¤EÜÿnØdxt‹A¼²í[Æ·½ŸÎ âÑ(Ä:Açú@§MÙ»ykçLNyC[Vzs£ñdˆSñZ~ßœC–»7_Æ9øpÅ öÙ´éÆØpOœ•‹ÅÉSŒÙæ$¬e8_7×2o“‰ Þ3èt°/ý wo¶aÖ¹ó~R}ÒN1÷*^W«òôfJ{5KVcn‰D“aÌ©z_­§;Í÷ç­v$OŸ*eL¾ïݤeÅï'˜],ãã®@o2àç×€²u'ù²XFåéËçíÕÌ_~œÅF‰6 á¼ÛÁÂFJ+Õ#^>&×Ò+’ÄV¡“µq7¼)âD¡ëÿ·wßQ”ùÇß³5u7=R) P)R¥ˆHÑCE9ëÙO=Å»³ÜÏÞõì]¬€JUŠ€4ÉÑBoBMHo›ìfûÎïR…Pü¾þò<ÏÎÎ|öÉ33ÄGª”í³Ó¶w+ Ö—6ne>•5`Jó;~ ¢«˜mÕY\=¶/ìœÁçs¦áêw5£Ç ¢2ûk¦.Ï'}DÆã–+bKE®ÓÿŠl¾š²œüô‘$Ÿ8ž“4l ý&~M^÷[¹:É®,œ¹o÷ÑÜÑ6êµÓ˜¹d‘rùµ0‘wö"ÊSÊkð1¡À‡[KÏÑ}h`eý”ïX²%ë:›Qì»Y¸èñ#oftX-ë§N§°ó5 Ž7€«€¥3²±u¹ŠÛF›±æÎcêÌE„üu 2”L\¬a¸{t{žËº÷·Lç‘ïáñÉéý½FGû°DžÏºƒÌ¨Ô‹«r>—×2ih,ò0¦R%¼µ‰ ³ÂøËñZ½‚½VƒP=nVUzñ/ÆfZŽ»Ž^õ²¯ÎÀàôP. 7ÒÚ ¥Ôøa84:˜æe̲¨€JQµO쉪dçûüú€Óp]¢bLÄ•—3³ºþ©f•V/hþ*…ÇÓ¢¢œÖúmnÚaÁ28˜duÇlGqîhZÖ±#äú¨KéHs5W~“Uò½ó-|Ä{n/ü¸‹Ïyè×NÞ™™Ç;¿ëãcýƆll()Y®£Ë* Ööì,æúÇLÜVÀ mG¼Þ]»OµM!ĹôG{†«7Ìfñ~;ðo=810ƒëÆõ#ælžauÑtÉŠcÊ‚ ¼»4†Ný{кpËÁ7Äeeà?c"ïnˆ¥ß £è;¢;‹çMåÃ_h£hÓërz†i©ÌþæÚQõá´ís-ŽHó†fYdFÌdÚû›1Ƥ‘Õ®~½EJÐ\f|ðæánjÑC{Gï=Y¼`Ÿ,ubˆH&sxüä^+£ÑHMM &“©I±ªªÔÔÔàçwf†Ýœ‘Ç1‹‹Ÿ<ŽùÜÖIqv̘¼šK¯îÛ×Q—Ò…æj9ù¡tIRÙµ¦š–ÙðÃ2²®!uwÑb¾_Å•ÃÓÖ€ÏYÂêÉ?°?ëF·ñ—ú“ñù|X,M+EÁÏϳٌFóÇŸ'=âQBü´T;ο{„úi/˜²þ‘: !ÎŽÄà]Ìš˜[ÿbmîáéÛWÔÿ»r;èÃ;’%Mu·¥›7ßÁÜ£:-T¹ƒi&—ú3Òh4„††^°å—0,epBÇ¿üš IDAT0“s«Ï»r I4]0eý#uBœéC¯Cuº’ûpɾùüðÙJ½>””>#ÈŠ”X!.À=Z†IˆÆ°{|¼‘SÆìݵԸÎ}¯«Ù¨eh’‰»Dà§Óœ×e=uB!„„a!„B!Î(é~B!„†…B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„0,„B!„„a!„B!ÎOºÆÎh±X¤µ„B!ÄÁl67j>EUUUšK!„BüÉ0 !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†Åʹ™7øˆ.“äùµuà*`þkwpEÏntͼŒŸÅ~à«bõG÷3ªOzô¹Š‡¿ÜD­Ï/„B!aXœÏÔº" Œ)Dé]çAJŒOùzrùÇ\.}å~ÚΠº¨Ø8•/7EqÙÍ DEc³˜m5©´gKí¦b•žžéŽ?VXqέZµ —«~Ü–Ùl¦C‡\RÅY¸ŠY³W±ß¦'ºÃ†õmE°æDÓ±,5l˜ø‹Ê~›3²ï-ÜÐÑ$”8ïTWW£Õj‰ŽŽFQ”³¾=UU©©©Áb±*aX4wuú˜tž\Jˆ&äÐÞc_Ïs¹i%:ÜùmãOpÊxÆç<É#âŽêÊUÃھͅGmh~?i\!Ä9·ÿ~ŠŠŠÐjµ$''7> » Y6g}næÞ–6r¦ÌdþöæŒJ©nxzj Ê©–míÂæ #sì ôˆÐʇ#ÎkN§“˜˜˜& Š¢`2™(..>#ë“1âQv}y?·<·Œ¯ßÂ5cgöê üã_Ó9àü;òïY«X:ã5.Yù÷LØKßœ~ 2wÒË\[ƒÍ?’ mÃó !ĹTUUuT“^¯gïÞ½äääœrYOù6öéÛÓ-)1šôΡ”n) öÓël¹ÌøðSæ¸N¸¬]uSç1ì'§iqþSUµÉ‚ð‘XUU âé$ßøO ÉâÖ·&òõË£Éý2Ÿ¿4’ºßv¥€ݹá¦6äÏ_A©÷È¥mä.ÌÃÔ¹-!š†çBˆs¥°°I“&Q\\L—.]HOOgïÞ½LŸ>‚‚‚S.ï²Tà Šªÿ±‚!$ƒ­ KeÃÓë""&†pÍ —µ¹œÔÙËY;õ3>øàS&Î]G‰S•Kˆ³àŒ “XYº•¶Î$·z?6·]Zö @½?mCZrgÚ2£R/àš¸©,ÕÐ,D‡gO)D›ÑááÀô§ù ú î¾®Ñî<æNÙ‚.ézL–U|9ËÍ€«;¡¬ùWáš/(›þdƒó !Ĺàõz™7oÍ›7gذa±{÷nn¸á¾ûî»F\ ¤âuù䇇>(ZZ¯—»áéc,=GÄ*µN0>šn— AŸH¸Zš™Óø1;†Ûú7“Mˆó1 //ÙÌ“«?åén·Ò1¼þ:£´ìAv“uå;ù÷ªx¶ÛídE§]˜ñX(v…ÓÚ\åèbÌèÐÓ{I/¿ÉMývPé eï›yñ‘L‚|+©Í~Ž«ÿ[ŠÝ1O¿Ì5-ýP‚ž_!Î…ÒÒRª««>|8v»¢¢"ÊËË1tïÞŸ~ú »ÝŽ¿¿ÿ Ö  5hñ¹<ê·U=N¼Z#}ÃÓuXV§øÙ:ùàÔfddµdÍ’ý€„a!ÎË0üÞæi<ÕeÝ£ÛK‹Ã_g¤GL{žèr3ïm™vá†a]׿õDýÿ½Áë'kÃ2÷â·Œ;nîÜóÁlî9vò çBˆ¦WSSÔß=béÒ¥ìÝ»—-Z€Õj=Iƒ9ƒµ”Zo2F­Š³ºWPGBœ NÒzÙ cÎÎ>U#×¼ q6œ‘1Ã;,ùt» ‡œ}YQ©äVBˆóÈ¡À[TTD¿~ý7nƒ êÇk4L¦“ßÎL‘J¢g3+wZp;ŠÙ°¦š˜ö-:Át?çþ7sk+<'X6†ºµ?2+'«GÅkÝǪì·N”Lˆ³àŒüÌtzݵziÍ“0j 8½ni!„8DGGâE‹1bÄáà[ZZÊòåËIMMÅh<ÅÐ?} =†d0{ö¼;WOtÆ@®lˆ¢ hp:ö|J ‹¬óAxCËš°§±h _¿[ŽCLóv¹²K˜|`BœŠzîKÑñûq¬ýùi-³¾"É{²µj>TÌú@ú6ëȘäþêü/ÊÆþ=í$„âì²X,L™2…ºº:š5k†×른¸˜¨¨(Fuê0,ÄŸ\aa!Í›7?íåT“:»_þzM“m÷XçdÒÛ[§2aÇ\ºG·ã†äË6Ws€ï÷,fêÞ¥¼Õý~RL-.¬=Á³•GfI|Ÿg¹×,㺄hJªe9¯ŽŸHèß_æ¶¶'yˆ‹c o?ü ?Ë•Í}O]ä}ùË.y”›[Kèù32›Íüõ¯eëÖ­£ÕjéСmÚ´9#zBuÄÆQ¼…å٫ْoÁspªT:÷èI§Xy«¶Ð)“–þMsïâ&OmßîZÀ¤] y§ÇtjwÔ{··ÆSk?ç¾åo1©ß˜ A²ÏqªXüÿš“ÊãÏ^Eœ¼e xö©•ô~ú1úýާm)­tÍ_ðoa8ý¸‹X»/’.£àÉçûGÿÅÌCÀÕÛi0w%i¦Ó E¶¾û?vžñÎè‰Ä¾g>Ÿ}<ùV´æ$º¿‘±“ T_-¹s¾à«ŸV±ßªÁœÔ7Žå²äƒO=óäóý?_¢âÖWù[[yúã!z½žŒŒ 222¤1„8k¼X¶Îå»y;±èMD†ùá­-§²t;ÙÓw²Ñ¬¥ÖH÷¶]iéß4O_lÒŸ¼5î:Þß6ƒ‡:Œ>.øi <Óùüµ&ìœ{}ÀŠ<ÁDˆF ïq=ý¼ øa} *ò~š…µ×u¿ÿ±³ºp2ú÷¦uðé =eÙiîJâ¡\¨5ÓóßóÕW_òùÛã¬Ìã/6SwÚʼÔÕ8ñéÆsíeê[S°ôü;ÿýð#Þxx0¡¹ÈàáÀœWye–“ž¼Î‡¼Â]]«™òÂ,(ñÊŽ'„8§<å9Ìœ·A¤ô»Ž¿Ýu 7Œ¹ž︛›‡¦ˆZKÓ__Õ¤=ÿoÀ Õ3*þÒãÞû)9ÕN+cS26e åþÈíþÒˆ–ÝÊ#s&ßœÜâýÙ´Lº…WÚ·'Œrv~Ç[;V±Ñî!,òJ^í1’Î|¥ü¸æ^Í/Æ¡¤wÚßx:ÉÈ‚µÇLk‹jYÂó«g°¨ÆŽHoïq}ýlU øÏÊ)̯UIhÖ‰@U!Nöu!NÍÀå×¶æß?Ìgo\8S7¶ä/ÿI¢~‚Š#>šÆšB;Æ–}¹å1töËåíñSI‘Ħ9ì+q7ü!ž„ŸóˆáQul›7‰ïæ¬ ¯Êƒ©íîÿûU´ T ¬Õ[7cìÒ›ãßVÐÇ“Õ'‘I“ ¨õu@S¸˜/?™ÆÊ½Vüãº2üÖ›˜€â)eÙgoòÍÊbœúH:º‰®[Þá½­VØv/··ç®—î'që·¼7i…U¬žúCp§GÞã¡Ö»yû±™´ͲékÑ{’ ŠÄÝP;è+Ùo £c×´؃kÝd nÓg•Óõ®G¹¼m}Op»awsûîGù|æN.½½-Ò,„8Wöýo5@t﫹<#”ÃÝ^+ùÛvÕ÷ŸMÚ™¹ÏZBkS,EƒËëfÂιx|^fç¯äéu_j¬‘O©£š:³‘0¥äêúóÖÀøyðX¢ö~Ê[åÀ‹CÓ–úý—œQÏ0Î;Ÿ—÷–áêʧòfyÞþ!ÙCîà/‘ax+ŽŸfpïà외[=ÆÂQÿåýؽ¼²~3÷v^ËžBQÜÌ¿êMÞN2cõødO¢QÌ®a°~ï¾= [Ÿkèb®O£ª};_Ÿwð¿y÷“wßm_³› Øw²8?•ÛŸ~ÿ>Ñ›ŠÙSØbS ¸.]*×>þ>yžaîy|õk ö‹ª5l[¯Ð¹M0ÇGe·%%?ïÂØ*³k;_ûŽêžòßOÞaüe.f¼ö­*Žß3iG:ÿx÷S>~å.ú·mIÖOsS¼i‡Oß}ˆ.ê:&|‘Kûû_ã½^blëH2x{Û¼`¸n+37$q÷«oóÄ (4'j¿v¬eÊë1kC1Ž#ªï*ZÇNÒèÝ*ð·ú(Á¤öi…{ÛzJä†6Bˆs(ñtK="<'øÇv$33“ÌÌL²z^Br¶ÉÊÕ¤=Ã:E‹G­?%ÕzìLÞ½ˆ¥ÅØRµ—';ÝÄqÝpû<((è4lM$}â’ Q¿v\åã©Âœ‘ñôJé…ê³²¯ªŸŸ–¢ŠrœD¡3„äÚɯåå¤ÄÄ“egõñÓl% X¨Â-£1*Ò²1»Ö±¥¬Ž_”^¼Ó6•H-•Aký†‹v¶{|¼‘SÆÂýVJë<L¹£t ˆæÁ.øé4|NVŸ Ž.ŠÎ]‚ønª†kî9|0räÍgMàå<Ù=ƒ±=û¾p …®,Ð7§÷ tÂu D§«YG±Õ!G¬WJÆÀKQ=µï)E5i©ØY†{HÇQTkk¸6ôˆ¶ôZÈ~îv²QÐDÒ*ëÓ uçÛ¬Òôf|¿D‚ôÔëÍù?~ε‘¿m¶——ž@»`Àë8:¢Wï¥ÄЊÍ(ú(ÒR ,ÚcCÓõàí²´ôÕ“ƒròvðfÐõoÏñÈ©Lùô1¾×¶gØ73²S^k)uI{ ¯>´9öRj½œ£Ë¦…l.ÀßDà±wãÕšIéÒ”su:jÊ¥†ÄóÅΟ±{„M|ÜëÜõ¿7x¢Ó ;„Ö”ï ÙÔÃïzÚŽ‚¿AÓéÀ§ZY“û/î«%>*•ªïÁçÌCFñAæl^ßô X—Â_;ßÂíÑÇN»™‘öJ*«äŽ9 v£{¨UÚc³Wà2¦õ'(üzN“s«/¸r—Öy˜¸­ €fE]ðu:Y}.4ªu33—éյޅ³¶3àÖ4GU5û¶ñ£óë¿sª›:%ýøž]EƒN£â;öî>+¹?~Ì—ÿ«%&-(| ùµïÉ¡¦Í5TYk¦ç¿½¸L¥ªª·©!‡K:3-L>V–סíz5ãïü‰‰ß=É=_¶bè¸[~Ìsˆ´á©$©_‘³¯Ž¤–e¬Ûh§ÅUGôŽhŒ•ÃÛ;a;¨õel;pÿp û–}Ã[o½€ç©©Ñ¢ñ¹ëç9²ô^7>E+×5!Î©ÐØo+§Ò¡Ò,H9oÊÕ¤a8+2“!€¶ÍäÁö£‰ ŒäÇÏ5O™£š¯òæqk›¡¿ó ë`à¨`¼UÓx|O(ϼ.zûr×2½â·ª7k6œWš ¡ ÿsn^ù-‡þÌ£¦M¢MçPBB2ùð²ÁÄñ¹Y‹ÞDë*¥ÚÑÚ‹þyoí]þ¹{jŽ rªÏ…ÅMÁ¼Ilk5†çÆØøð‰où¥è?\Ù\‡_h(A-³øçÓ—uäw˱…ùX³kÏ>\ÆÏý¶>ŠÊaÉΆæt°?§œÄ>18*ø…†¢¯9€Å!zÀcá@†ˆ4èˆè8’û2†RºòSžyïkÚ¼zíÑkðO¤W††¯¾xžÍŠè.wpszÊI¶×`; ¢ª Šh‰¿ôZ®Zô0sòj¸*5“u'eN•xýoÁÚ^´kp¡Ò+,„8‡Ú$°aS+VÒ7ãQ@5E¨1q4õj›´£À Õ󯌱|³kæþˆÇwt_ÏÞÚbîÊ~ƒØÀHF'öküŠ}å,ËßI©×I~á4Þ©ˆfdlŠ»†:UTlµë˜¸¿×Á“ƒ¥l_(ÁŽžÐÀpðPyÜ4/~áèëšÃk{ò±ªàq泡ÖhwÒKù ¿ˆ:o ›öÌg•S½hwàjÇ…}%zUå¿ëTu¾ªULüEÇ QííÊè>.æLZƒÅ~Éél›Å7KöSçom>;‹4öÛåsXŽ£õá(ZüìbÜG„L¢âö®BÖhFçFÞŽÍ/y ]=K˜´pVwù¿Nægk:ƒÚúcËˬœbœè1E†ã‡Ÿâ‡9ÊóJpx\xl[™µ)–ë{†gŸy’ûF¶ãd7¿8Q;Øó¾åñ'>bþ–Bjꬔnù…A´J0aˆîJ7S?¯®ø­'Ý[ÊŠù{ ÍìH¤„a!Ä9“Õ›D=Ôn˜Êäù(¨ñ >{;³§óÍSøvN.µM| V“/IçÕÌ»xvý—LÝ»”îQí0|èÆê²\zÇdðd§›Noˆ„ÆŸ@ëln¹…R}#ºÝØ`zÿáÜfþ/›¾„à°^Ü‘ÐóÁû‡jtzölz‰+kñêb¹¢ã]dúmá­uGN»›®þdôÅK«_¦ïš:´~ñ M¿‹´ø®<•¹‹GrþEÕÁ¤'d ©Löt!!oæäw¸…{bê¿ç-¦õcùqwcSRûðÕ|õñ‹Ü=Á†Ö”@÷ëî!±kãÖmLÉð–¯óÒ‹ HîÍÈÞmÊ=ô‹¼É5|òY6½n¬`wXWF6òö J@*7üc4_~ò:|cÿe†?4ŽŒ v£ž¢ÉÏsï{µøüâè1ö^ÚúâyÁ¯?Éí ÚrÓÓ·Ò-ô}^½ëƃ!?"Ú à–{¯¡ƒ¡áí5Ô7÷ÎM—NdÒGóe¥Å”H¯1rm²”X†ŒÍ$ûíWøÄ}}ZªìYø ?Xzð÷A±¿ð‹>t mÏW_Œ—SqVi‚Ú0d”…™Ó–s`ë"~غè˜9Bh×¶M<¦ëœ=ŽÙæq0ÿ@*wáð:iAߘŽtK:½{¶òÈìoIí÷Ü|~W¸Çœ>aûÿ%Üxs›‹ªNÇÖGœ/%s^âÛ°ûø{V0M1r͹ó+ž™‘Àƒ^J¸VÅkÛÃÏ<Ïæ‘oðïKÎd¼XraêôY,Üb%±÷hÆ\3T³V>v!ÄYqºEö9Jؾf-›wP^ëA`&:¡-»¤oÒµížÈ9û£Y Î‘ñ½ß댬OE•½ñ Ševûj®˜kÅn eÂÐ`fþ”ÏwÖ?òÙhhbÂTPMŽãVÎÌg£Ì|6¥€egìöTçIÝþŒ|Õlݨ£ó4Í%*޲ªÝ±/nSPí¥9ÂiÝÌï —A‹¹í Æ=ÔÓSϲRk"H«âózP5:´Š|üÇ}:ζ®ß…#<Œ”t€»b;ëv؉IO§åïí¦rå3kÂb¢F_O·Ð óLjjÛÎŒ/%pøM l¡—Eœ™³Ÿ_4©=/'µçyRùHÄÙੵð¯ùÅ̶©l§ÓhéÖ&„®~ÊÅ·sÿº‰?Úöáôÿ(}B›j/Q0uËUa‹yþÁxèÿà±7² û0£âÏRÀ0Ä3òÑû¸¤z&/Ü;Ž›î~“Õ5ÒiÐЕÚÜ%lph9½Œ€“üì5Tû°zS%ç×}7ù³?eêngÓì¹~ÍÉèÙvaº ¦ÌBœ®3Ò3lÔêqzݵçàW£.W†?{Þ7´Óë:7ís–Oð-“£y±s Ѫ—Ío;”!ÿ <Ø“ª æÃ˃X[¤¥w„—I‹KXÁ3é„iœUü+»šÝ^…fñ‘<Ó9ˆ8‚½¢šiž`þiÄ7 ÞÅeÜm#(1Šg;­ke5ÏgW²Î ÝN1?Úò×…òÍ#/N/f½G!®]K>4•rÕr;EÇÀÌXî6ÒLëbò¯…¼WìE9ÙrÆ`>fbK¾Jr¨žVÁ^&ýRÈ„*…>=Zpïu»oƒžwXÏÐåv9R] ßcýïü?ú7á6µ¡é\õP:WIóŸPö×ﲺÜKìî„îZÎô÷Þ<øN½Û™(øñkÞÛÙ•ûþÚë+ÏN»»éþª &1½Ý…Uf!ÎEnmŽcué6z5K—=•¥Ûhqí<¦^ì¦gæœÝL²(´jß’/bOðƒÉD»{¸q¥ÅÊi^Þ˜³—Ín ²ZòH¼•ʃyå#s~ÞË·Õ*¡AjíVÂÛQ·hT«èLa¼×MÏw³÷0ݦЩKT*,^ŒZäR&!ÎZs"™½{“aґг/}{eÖ>}º¥§gïn$˜NöõáÖÆÒsôíÜÏXºzÖ³dK ‡ï å­¥ÈÖ‚7ÞÃÝ×wCY?—e…np°tF6¶ÔÜvÏíŒJ÷°jæ"öôú?’†¡_¤¸+oçÞ;ŽÂ)ËQ'§b¶U'rùØÛ¸ù²vÍŸFŽ.‹Ñãnctj 9ËóipPƒ«ˆ-± s ·]ÓŽÚ5ËÉ?Ý2k ùuæJ¼FsÇ=w0*¥„ÅKö³½×Eµïfá¢Ä»™;ﺑ>ÍM´6Ž+â ¿³]ÅŸÝéîÝžç²nçý-ÓydÅ{ÇÝ?øÏL¯ÑÑ>,‘ç³î 3*õâú%¥( Òè?}šOl%eܵІõˆ÷cÚÔ¿w²õ)'Yï‰^ŸV॑ÐT4èQq©§·œzн}!Ä™9Ž´ ­cGÈõQ—Ò‘æj>®ü0:&«äyªh™ˆoGùIVDbFxíT•V£h¨)ªÁƒ€.ŒvÝÚå¯ÿ4ºÅ¯dÁî*ê<ëÙ©´ãªöQøéÀ/µ'×Nf]ƒø¿·2§(ËQgÿ0RÓãÔ(ø¢c12R#Ð+{«qøÀØÀriÖ!±„+»©npÆ“t­'ϯ ×¶ A§@Dj:Á›vSéI¤™îÔuÑÚJ©Ö5'3L¢3«gS©%%WщÛ5!ÅOvxqöÂ0@VTYQiÒ¢"ÕåuX;…Ð+ Ž¹v iÍ 4æPSQRKI—pF‡Ù™PéÃà¯Çß馢ÄJi§0†šêø®BCôøjUj}šêcrEI-ECéTÇL«B‡ÖfBKKÙí?ÚÝêóx°éM´òSØà228Þ€¡êˆü«Õ‘¤!»J%!)„V5µlr“/w²d|dÝNµ}!ę糲m£¥¸§cejE•El´Aia5z#Eö“<@up`õ<åÚ ‰‹Ã¬*¨ÞͯÁ¨Ç[çÂeµâ H"ðÐqKHX€µÎßÿƒþ´Êrd±´h”c^ãkD94h5ÿHôSt9¸­µÔ•®bÊëëü«^œJ<>µquÑÇ£.fW™“˜ˆvïuÞ=-*Ž“´+Hg9 ‹?gUok΋#“¸Ïæfc‰‹òFwÝ–*^¡ç™¾ \«€³ÎÆ[KJù¥º’GÖèynP·ª*6‹…§–T2‡‹$òCQ9,­âÑ=ÏNänìUÆ/³a9õQu|²+œ×G%3®ÒÊ×{íÔÿö¾Çá!©c,SÃõ:l¼¾Ô“¾ðã\IDATpŠåN|v]·_­¿o=BˆßMãßœÔôt0x¨KÉ ¹š3?Œôd•(ÿÈÖ\=¦3fÍïhWc4© ‹Ma?ZÌɃéŸPtõ'iWq?~EAUU¥éþ¶y&·'aXü=ÑÇú ÙØPR®å–I‡®F9òÿõ={J·çøÅöì,æúc¯HÛVÀ mG¼Þ]»OµÍßS/+Ví¥Çªß&}sĺoŸRû»–;²LÖü|zçÿÖ{©Û­GqVüÑžaŸË†K DŇ«jë·Uá51ƒ·–};‹Hëgß ²‹BèÐÏŒ@)¾Y,ÛÔ†¡ÌXs³YçH`P¬tA„ªÉÛo!5ÙÍŽìÊ<¦ƒ©Ã@ ŸJMq5î„p4ZÝá?в,gÓi”Y“A’c.K·Ä1¨}$zG9%1¡†ÃÃÄNZG>9û¹ôú¡$ÓÙkˆ9I»Š³Æh4RSSƒÉdj’@¬ª*555øù™Þ~ ÃB!þ´þhϰ¡Y™3™öþfŒ1idµkßßÞW aD»×ñÃG»©ÕÇvÙ0:†j8zèÉâ3ød©CD2™Ãû“à§ÑtÉŠcÊ‚ ¼»4†Ný{кpË¡ØA\Vþ3&òî†XúÝp»WOU–³†O§Ì£è;¢;‹çMåÃ_h£hÓk(Q¡†ÃÁþ¤u1D‘4—¼y8l›Zt`ÀÐ^Äœ¬]ÅÙ‚Åb¡¸¸˜3ð`ãSR???Ìæ3ókïŒ<ŽY\üzOÊ£Úqá^ê§eÉu)Mªâô͘¼šK¯îÛ×Q—Ò…æj9ù¡tIRÙµ¦š–ÙðÃ2²®!užp-æû•Q\9<` øœ%¬žüû³nati qú¿å¤ Dc Nfrnõ[þ!‰¦‹ªN ÕGqúƒw1kbný‹µ¹‡§o_QÿïÊí ïH–4ÕyBÅm©Àæ ?|Áê´På¦y˜<.Zü>Ò3,ÅîññFN³w×RãºpzSÍF-C“L<Ø%?悯ÓÉê#„ îr6-œÏªý6½>””¬¾\’b–>!aX!„BˆÓ!]KB!„B°B!„†…B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„0,„B!„„a!„B!$ !„B!aX!„B ÃB!„BHB!„B°B!„†…B!„0,„B!„„a!„B!ΈÿšzÄÚN’-IEND®B`‚932_director_testing_output_testdox.png000066400000000000000000004413611516513262500352420ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/93_testing‰PNG  IHDR  †õƒsBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìÝwtTeÞÀñïÞÒ{ï!¡½ƒ‚€DEÁ²ö®««®[,[Ý]WWw]E×¶¯¬¢¢ˆ€H‘ªôÞC $¤÷df2}îûGBLHB |>çp™¹å)wnùݧHN§SFAAA¡ÅÅN€ ‚ ‚ ‚ =‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ BaµZøú‹ù\;a<£öç¶®gõŠå;Y‚ ‚ üD©.vAA¨sêD6_}þ9µv:“‰Â¢"¾[¾ŒÔ´tbââ.vò„Ÿ‡ÃÅbÁëõ^ì¤ÂeI¡P`2™Ðjµ;)‚pN"` ‚ =DMM5§NDg2¡Ôjñ8TVTr:7G „ Êb±„Z­¾ØI„Ë’Ë墼¼\ „OtIA„B«Õ€×ãÁëvãõxÐôøúù_ì¤ ?1^¯W ¡©ÕjÑ‚G¸$ˆ‚ ‚ÐCÄ%$rõ´é|òÑÿ¡t¹0™LôíןäÔÔ‹4AAºùäqªŽda/,Dv:ÝnT5­c\Æ”t´‘1;™"` ‚ =EPp0WN™ŠˆŠŒ¢Wz:½z÷¾ØÉÜn7.— Y–/vRzI’P«Õ¨Tâ¶Z„¶YO xõJjNG©Ñ£ÒëPJ ÔiQ¹U¨e/®ÃY”íÙ AAŽ¿ }tüEK¯ät:ÅY_AºIuU'Oœ 95“Ï9—­©©ápVZŽþýû_  Bs¥¥¥DFF6ùÌf³‰`A+$IB¯×_ìd—˜‚‚BBB.v2„ E–É_¾ë¡}øE¢”Ô¸e/n ÙnCm4 ÷F£Rã¶›qÖVQ[SŽÛaÃØ7“°«®IºàÉ¡PAAè&.—‹»gÝLUu5áÌûêës._RRÌñãÇ¸áÆ›.P ¡ýD° u¢lA8'YfÕï³}å ¬ña¡ô‰'""£N¬Ò€äÁZ]N‘¹† ‹™Ò .‡å?`©1“tÓÆê¼7Þàøw+Ñ S]YÁ¦‚BJò‹èŸORd$J•§ÛÉ¡S¹l9rŒüÊJBL&¢ƒ‚Q(5l¯,gXU5h $M¿°/.ÏY¼Ulù×ϹÿÙ¹±]ìÄœá¡xÙïx꽬fßt(­=2oeçÐ[sÏóË(ö\ì´œ™êÍ/qÏ=fcu{ß0tWÞÏJËeu¼\ÍÊ«=õÔ™ú~*” W^5·ÕFRJ ›7ojøÎírqüèÎÿœOç~Ħ 8™ÍÐaÃÚÜnYi)ÿ~õ&ŌɓXþÍ\NgwfEA¸Ìx­ìß°Œ…ó?çËEËø~OÖ 0qƒ§¶€ƒ›W³n_)¶Š¬_µ‘ýyÜÝ¿ëf¼ÖSìø~ kÖ¬eÃÞlÝp+wrß^¶|ü!¶êr²KŠ©vØñU*pš+(‘çpÉ´0(\üž[Ã3¯=Bï6_¼(ÐùúâgñAÓSB"Þj²všI¼®ù<ÚKkÌ[·’qïàëO°î@ v…ñ#¦q×­ã‰Õ_ø><—ž w¼xÍGX³®˜^“Æ£»°uS¸ø7<÷uq£OTøE¦1dÊLfŒŠ¡ý‡ÊOí÷%t7¥JÅ‹/ý¨ëž°{çNÞûÏ;Œ1’×þúŽdBR(@–Q*U ÈÌ$=-¤””sn÷Ðþýìܱf›•˾%6>žÞ}û]ˆl ‚ €ìõâEB¡¸ÔîJÝUXþåzrg>±¡ Oïæ½Ê8ж³äëí^ĸ)ËÞÃ÷Ùû8”yÓ‡Gsán#e¬ÙÛØº¿´îO©†è´éÄk»r2[ß n• 3PæpâÕIØ,5ÔZkˆ ¤WZ/îÝKyI1f+f…Ž"· sM%Q!ÄÐË^|4—ˆ—þ|Áº&t:`P’µ“S5nÚ„‘”˜búÐ'â £ðeÀÝf@÷ï©Ýdó¶•GsEbóüw(­=0oÝÉ]´Š×ÿ¥½§qûÉ*÷°xÞÿø»#€¿><ŸKíì|¡]ÀãÅ]¶‹oŸ@?v 1£5µ*[q#‰/NK)Ç·,aᇥL÷Wì×¾ ùOì÷%\XjµšÌÁƒq»Ý<|×Ïê>Óhê€ì•Ùµs¯þåÏüò¹HLNnq;N§“ÂÂjjªQj4 Ë8NÜ.×Ë‹ ´ÉSή5ð9†$cÓ¬ìÈgûúÃè##è½»’…ì\í 1ô ¼dÞ™uŽ»„-Ëvã?~i>"Þµd\¶ZÌVÎ3oã%%Z½£Õ¥poê5“µúû†`>nWŽ@œO7ÿ.ùlZ¶½•V›^Êv-çûˆÛ™¯»@?"Ëí¶m§üƒqäåÒ/:š” !!(•:JÊÊ(2×`±×`òñ':9#GŽãB"ØäGºÖ@XX(­£^‹_ˆJdœ…U(œeÔæåaˆ¹0S.vú¨øèÕ·Èêh‰&ÞˇÏêì./a2Ö[) F²éR8‹ôªÀ~L¼#žÔ‘)õÁ4b¼'øå¼2÷g˜oÏ(OI’ ËO1Óá´È2²tþ‘q¯½GW5c“åŽGMUF"IÔ$“Ö'wö |»)ûà~tg¨²'տгÙl6¶nÜ€,˨4T*5’òLÀÀ‹ä–8~ô(_}þÏ<÷˸*³sÇ!NW9‘´Ä¥¤ršžqû"t˜{M Uöº…R‰R’q»=8j-8œz‚ô¨{xýʶ<޹oQÑ?£ûƒ€³d?Çjϵ„ƒìý…8â¸\Fò9¾j-²,ŠB©¢¬¢³ÙŒQ§&Õ/ á$EÇ‚ROßäN'^•…BBáõèïOdt4²ÛN­¥«Ç‹ÕëÄ–u¤ç B%²Ê;rƒ,árîé¤:ÆMÕþoùäËÕì>mÆ«`àäÙÜqM_ü•v½õ ^-œÆ_ÿ0•0¥Co=ÃÛÊøÕ°£ÌÿlJè"G0ûñ»V?ʆ«”í_ÍeáÆ,Š,Ÿ|LŒþÍ+Ü“¢ÅS}Œ–.eÕ–ƒX’›òÝ‹˜ûùjö—ØÑ„ôaâì{˜1 €†Ëµä¦hó<æ.ZOV¹Ÿ¸̸çvÆÅè4á Þ(½JL1ј¼Ù”Û¼àÛÒE¿¾L÷ñdÆ~æ/øžcU^üz]Í}]M`ÖBæÎ_Ë‘*‰ Œé<ôÀÕ$ÎTŒ›²]‹øøË5ì+²¡ðcðäYÜ6¹ zÙIñ¶Ìýr-Yå|“ÆqMïÜr^zŠ•󯝇P#rrbî¯xiÏP^üÛlâ5-'í(«³µ•Z>^ÞQ?È3»ø¿OÖsJ7•ßÿe&±ê¶ößÚq™Lá{OóʶºA>øÅ½|€Ž¡¿|‡Òuí(Ó–Óôá+3[ËuûH*4*PkTuåÑ®z9»¼:Sæ2µ'VòÑGKÙ‘gA6D1n:·LB„¶‡ßAÝÎa³±î»ïP(U(U* • Ýu­öœN'ìgÞÇÿÃbµ¢R©ˆˆˆdÐàÁM¦¹«¹e…¨T*Â##1-_ÂOSÈ)\ÈöÓl\šÄ #‰ªÝEAvÛù±MšŒÛy&ðçÅVœÅ®ãZFj¹•Ûyì—ÅJ[máF#&ƒ?É©¸¼2»Zk ’ÍŒäõà®­E©€Ôèh”>A( &ŒFôz=ŽªrjjÍÈ^ WÆè£CÞu®šxAòÐé€Á¯|À]™’‘1ïùˆ?¾±ú_Ç]3QífýþT]ÕÿŸ®5ƒä¥z÷‡üéß»šxO ¥öÀbæ¾õ:Ú?¼Èugî{óòö·ƒ™:ýA&)óÙ°`!s_‘ üË}d4k‘áÅV\ˆUH¸ñ\gÖíïð–u ?{úeî©\ÇÛ¯Ã/mÃ7d³Ÿz™»ªÖñöë xÿ»üiz*¼Tïú€?½¹Óˆ›xxV®ìu|ñÅ˼l{žçg$¢“¼Tí|Ÿ—þ³Í€ë¸óæhE{Xµ8™Ä6k·um•UK?ÕΦŋeÿgü;'ž©üûS·µå9ŽËÞ$Íz_ÅÌáå27üê!2}U‚´uùj³L[NÓÙÜÕyäÖalc´V·¥„¬uÿcia£îJ ëº¢µ£ÌíǘÿïÏ9”p3OÞ†¶l?ë6ž Ì9„ˆ®ì'\’¼^/e¥%¨µ:$……R…B¥ ¼€ÂãAQßâ'))‰a#F¶º-_??|ýüÚµß#Y‡ $0(¥òüÞêz½^ì6†N(Ì55 Iøøtå ¡Ç’ÀYv”-[²)·« ê5„!Éþ(wWÐÛÈß¿“ƒ…µxzBS’‘àûã ª§œ]k¢‰ò¡¦´›Ý1¶?™½‚ÑxËÙµþÉFòŽ£LÁ°#^s.÷£°Ú…Ê'œ¤Œ¾Äû©Üì^·Óð1¤˜¸Í¹Ø{”"‹•o ý¥¦•ðXò8´ï(U6dC8©™½1ÝÀÎrT¬b¹:ˆㇴ=ª»§–j§žÈ¨ ôjÄÒoð™/eÜÕ'Ùµý ù5nTþ ÙŸH­ƒÒcûÙ4—r›Œ.$á#{¢‘꺬È"(ÝHΡB”½&0.ň\“އȭ¨E6FÒwÄPRL€ Î’ƒ¬_„›†>cpi4™ï¡lµ.dü~ H 5>~&Üåv£O~à•t!„è Âà!wù'|Ù{qžãìj67ðïôþÊòóQúÈ(Ô*4j5 ½Á€J¥Âe·`v9±ÛÌøÛjpÚì¸%/jRÂc³Rk7㩵!;ݸ­6¼’Uaöœ=NSG]š¸\§Y9o#Õ ³øË£WQ×2¬?ç´±žÿhyr&©z ðãšq_³yÅ^ #ðW°ekAW<Æ5bQÇÕ·Mfó‹ÛQ¦$ÉG (Išý¯(T(ëÏiÅìüý:6ŸvÐ/­åÆ3΂Ñàªàvܤõà¼i"ú“¤]KÖñj< !È¥‡8©ÌÄðƒ8Z…'>ªŽq´&€~©þ(]y¬út ÞáOò‹Ùuot“ïÇ}ô×|¹&—É·×G &òô ³IÑK@&}bÜ<ÿâR–íŸI¿þM#´®Ö{MßGHn-@ÓP&cyä±é$ë$ˆœÄÕ©Ky§¸÷=6ƒ^z ¢ê?Û—eZþîgûø_1Æ'ŸÕów`M˜Åsœ©ŸÁô (æ©Û®ÞVµYV‰4k”àêlZd°JŒýÍÝ\q&áÊ=÷þoQû¸Ô…¨dÂ#‰ô«¯×é¶Ë4°•45æ.dÙß_daq/îõYFø·P÷ö¼úÈ=>ˆ¸âq®NìÂ~pí(s¯5S5z]1–~ Hˆ'uȹ7[¹ã^žgæªgaB¤¦¾E„•£_¿ÎÛûÒxðéIÝ™.+u½$ÿ“š|j4™ ;ç6JKJÙ¹}Z­–ƒ2ñhzC³mËVæÏ›Ï®m;¨­­k̬;f3cæ ˜L¦&Ëÿ°î{ÊbÖí³ññõmò­¶–E ±pþWäœ<€Ÿ¿'ObúM3Hí•Új:³OdóÙÿ>eíw«1›Í$&%2íÆë¹ròDBBBΙÏZ«•¹|„ŒÌì;nk–O¡s[È+‰aÐè«0Tdî£”Æ %¼Ñƒ”»ò(Y•! ˜Ž¯·šJ»¾ùËO-5ª> „ÚYÄÞör8d<þ€«œã%Q ß“p—spûaì ør¸{Á^¶lßiÜ@BŸFÝåÞq 9u“"µÔžÚÎŽC¥öSqtÛAÌ1ƒ7,©¦”ZŽ€A£é³a=E©ÞÞ. ê ’#lݸ9£Iᦆ‡uÙUξ ‡ðö™À´8–£?°qOÁCýq+Bè7aAÚZŽ¿–=§â¸2ÕT,w•U8ˆ+¦¤”À]Æ® {¨ŽÅ”ñH•%Xõʺ눧†œ¢FL¼ž¡»YµõÅÉ£‰ý!:Íéjt-E]jô*p¸<¸¼2:EÏ,gOM«Væ‘ÉñmÔµ-pP|h+ÅR(C†uG /µ•ö¶³UQë…Ànê±TÒj° %^*ËjÎ_wöäd ®¨M0à•Q»˜-Uج¼^PÈ TJzƒ ·WÆVk£(ûF“n— ku%N— ¯Ç‹+ë4Sd‹û«)Ì¡ÂÑRÄE…oDhíÚù1 ~y/ë;Ø%Áؼöà9:µµ“§â »Ë$RnFhGr`¯á$©Ä`‡¹®ßµBB!AÓ' Ivbkæ’”*”¸1%ëð N8Œ•Z*,­Mâ¦dÏAèso»ÒÚ£ó¦cP¬‚ÿî?mbαDMaP¯ÖíÉÆ:))w?%ºDú†©ëób¢ÿ½½hxÖ‘Lħ`Ù›G­\ ëðmtñR‡ö%Íg {—âáßèAÙMÑšÿ㛢(®{¤?m_`ÀçL'2IŸªð=û³Ó5Ø=ue¿·\AÊ-ø7Ų̈‰:’ðE‹Ùzª–1Yì-ƒäMëGRž_ö¶Ë*±YGOÕy¤%bCÝð´µs¹µSÇe{Êtô™§ÎJS =a¾¨Ü‘´ØPõæÎ_Í"IãÅí¨¡øØv–/zƒçËïæ!¨ "ýí)s…_:Ã<|ñþ[|~Ó4& K%°›³ÊÓ¹”Væã—ÞÄûÛǸ2ÒÉÑ…ÿàÕorðètÔzH3]šñ]¡)VË#Ùµc;²Çƒ×]w~•ÙíAöx½^t:~Í[Ú4¶vÕþûî&žüå/=~LÃw_Ìûœÿýw.%Å%MÖ)/+ã­×ÿͽûùÍïŸÃß¿î&È\Sà Ï>‡Ý^w3wÿ#6¬c®1óü³¿eë¦-M¶U]U͂Ͽd׎]<ùìS Ñt:H—ÓÉÚUkøÏ›ÿ!?/¯ÉwÙ'²ùçß_ãèá#ÜýÀ½ÄĶÞs岕,ùz1åeåŒFfκƒÑpβz¥‰ÄÞñj‰Ÿ"‹Z§—Æ“%µµ³’’ÊZ|Büjé¯ÐPwÔ$³·Ø‚Ç D¦DÖ wU…R ÃbýP+AÕ‹„É.wüã&ÝU9©iD)Od,úœbªÊ]äÃÐÄ tJ ¬®•Zg.ñ’ލ¡“›}ˆ;—s@ #-3“´#Þòcäizqeœ ¥¾ñIè³ 0ËD$Ç#{X*­ QP[Q‹—ú€d ¾w|]°p—ã´ÏØ^!è@PD]ñº•/)ÉëC€b§Œ@á<É­ ]?`^Wó˜²jÁŽ×ÂiÝpÆÓ³cû ªë{++’6aºcPP¯Ò’s`PÇYF‘ÅCt@÷D ” êšôµ“By~7}‚£8e.$· …‚B$äšjÊË‹ñ%**$ðx¼xÜ2¾~ÁØj­–áq8 ŽB-IXÍhôZ¬v¾²„&$¨Åý^ÿ Û[ìf¤÷ôÙLˆîxs×ÎÏ’PÑÑŸ„LU©¹³»kÂc­¤=qÚó{s(I?þè5QŒÃêï¾b}æÝŒ©fëW«( ÅÀ†'GÁ>~çS6UÒg`)áÉFö¶Ržröïqzkdó7Ä—PÞd@’L$ǽ|/…Î^Ôî)%¨‘±)è–ï&Ï1ÕÞ<ˆ™M´<…•Ôbaã˳ñìôEÙpµöc•´Õಹýžeì'¿aÎü“DLÿS¢ëÚÚ¼Á/^ÛÙÙÇõCžá·Ö¿¥•@ö"s¦ìuÄùhš,©4…`ƒ¥Ê;°+:"ýϳ~ÎR·ïÖËʼÿ ~ýϦùüÛÔóH‹¤h²N[ûwX:w\¶§L½gNCg¥© …?Cû'Cϵ3•¨h¢ëoDã“ûÐ7Úɯ_ÿšïNgVóM;ÌkmG™«"˜òô ø,þ’%ÿ{™ÿ #sú]Ü9µÑ8gI¼þ—<ãþ;¯.;À¼—^§ ÓÊ÷›òðêÒ¹å71¡CÑC¡'3\=m:;¶lÆ£P²§î${½xÜn‚CB1j çÜVYi)••M[ ¬ùn5_~þeC° *&š^½zQVVÆ‘¬Ã8Ö¯Y‡¯O>û&“‰ÇOàõ6?)Ûl6Þzý†`V§£Oß>x<*Ê+8›ËÉÙÌùç›úfü8­ã®»˜ûá܆`AXx8QÑQÔT×PXXˆÕbáÛÅK1Ü~÷Ï o¹EÅÆï7R]U÷Jhýêu\;ý:0¸I ”Ró*¥o*Cœ ëð¾;@Rß ’ƒÏu­‘Phxœõã H ´ o{eÜv²&ôÇæà -&Ø\ö]·œ£¦œ­ëNÕæÅ%ã²Ùµ¡uß]A¡#89“ñI}©ÊÙ˦Íßã™0‰{-Ϊ,Ö-;VŸW/.)Ùë¤ìèvvå8ð Å(ýxލÛ^Ýø4…ÌÐDj ö±i÷!¯HPk/eV³U°޳¾”PiuHκ–Z%àu`±ƒV¯FÂÞd9oCG'Ò¸‡£»t’ÃŒýÌúM¶ÞQ2²,ÕMú#iðË oö·©pfÔ£ñ‹aܤT÷8ó”ïbE¶ž¡W$X-c9œÏÉVÇ”Pét(ÕØd.àÜõ?]:£K•{³¯“¶®û‡×í ¦º Ôëz\#oíIÖ}µ‚#ÖÆŸ12ƒP"|À IDATI×ÝÓÞ»(Þ»³®ËC;”íÙMaúx¢ºaì'¿øÞôoøË‹Yq´QÀÀÄ~HèÂýúŒzëf¬N•ŠJ·ª ÞôñÿеkvQ‘9îÇ‹ÊùL'›Ù7o1–I¿åïÓ#[,9›¬r-½îÊ$´¾Y»×nÆ´ü®CÆ|d;±“ˆoçï°§çMžAŠ~‡î£ÆÏ­¡jÐÄ10Üš‡0”û–V?ª~`ú,`ë¡jŒƒÓ14K|ý…[öðc ™š¬ur˜È솭‡YðêØn˜Ä/KHã¦àZÂ"Ï~kGÿ¨(ƒú¸€5ë÷S=pD}z…[7Q(%pU‚µ!‰8ƒ—½bÉ̬ŸõÂCmE-œ™¸ORc4(¡¤³|T ;Š8”]Óú¾Û,+]ó|êÚ‘–öæ½­ýÚ:.%”jVj]^¨?%µ§L¥6ÇËí,ËÉC”àÏ@HÞ×ËÙTí(sÙƒÓ£@£’4Aô™2‹IŸgí‘rh-` Aƒ_J¯ðú:nüµ\®tz=&]űcǨ,-aÏÎè Rúô¡oÿŒ;¾s7oG²s:7·ËÅUS'3õº«‚½ûôáú›fðÞœÿP]UÅlFnå•£Ûåf岕øúùòÀc6 BBC˜9ûNçä²eÓNeg“}ü‰ÉIäçå±ï~2‡d2í†é Á€ƒ2¹rÒ•œÎ9ÅbÁåjù<°eæ†Ög,Y¸„~ý3š³ \Šd\å'9í %6܈֠GEmó ®×NIA%Q‰~xJp´ÊD\?C PÄîÝIVn$™±Fìù‡9é ¥ªÙra®Ýdf@Œ/ —™j—ÿ8B=;9t2ŒÌ?äê"ÊUaDùªÐh$ì•VÜ!& e›owù^Öìr‘˜‘Ft OÅqŽWkòסöM&Òµ•½'Úà‡ÒYE¥Ó„¯Û -² nsÇrÍxÏ1¾¨*0‰pÏfö‰dxj re¥ªHbL­¯#tžBcÀßè¡ÒêÆZ] IjÚrÃc·c×Ñ÷Vrí)~Xð-YMzûÑ÷šë£¿ ÷ÎÂm|·§-Í­Yµ%™[ÆF_ò°¸‰P¾úùÅUøûQáñ²üèIÌN7zŽR‹…osòˆ $¯ª‚Z¯—h³ TÙm 8½J—ܲJ<*² ZùLÐ@¹b¶Þ“ŸÚù`œGÀ "û§k:2½ŒŸèT’‚» d£‰cÊÌlxï#þöv3F'¢¯Êbíw9d<ñC;³Q·ÇIùÞ ìH@FBR¨Ðù‡T÷¦[©%TçàÀ·+Ø¡LGSº—• W“¤´¸I ÙÛŠ –D[ãó]2yÓF“ÿ]óRømDjɇä~|¼f Uà•«™14çÉõ|±¨ð©Ï1,@ R2S¯Œ`ë’wù×¼›™ÚÇóѵ,^U 3h‰Êˆy+øxQ ¢ld­^I–»q+ •N 5§È.±ÑVYµ0³®=ii§6몭ãR‰.<•`–°æÛ-DdQFö%=°eÚU·•¢ÜS4àuTQpxKïC‘q/ã"ꦭk»^Îvv=µUæ2–ýðâe žq-Ã}qd¯ä‡b 7¶£I›d"íÆøçµzÝ…Ÿ\¸p¬V+Û¶måG#æ¬9”O<É®];IKOG§ëø,ÔU•UØluoJ’R’ðmá¡ú¦Y3Ñéõx½úgluÖ¯ìe﮽hµZ† Öl_?_úöïÇ–M[¨ª¬"ûD6‰ÉIÔZmTWU˜Hzïôfë^wÃtBBC¨1›ÉÐ||£¼Ó§Ù»{V«•´ÞéX-V X»j >ö&$é¿“T ,G¶°zYéCdŸÌæƒ)”¨¬ÇÙ²ª»ÊŸèŒLâ šÝ5¦ ¢Ï4ìÛÎê,7*Ÿ0’‡ô#D-Õõëo´\ï!©Ü»•ïö»´~D¦Ä/*˜¾Cz±ÿÀ.Öq¡ô '¹_(2*‚“ãÈÞ±9Aô3”8ùCªÀt2ã÷±oûJvÛ¼Hºâ2F‘¨D’B0º/»·¯gñ.'’ÖŸØ~#Ý›tÿ |¿è$šÀxÒãCдØ³¾ü4adŽîË®[XzЉÆ7Š´A­¯ œ' ч`µ‹ÕŽÝåE–%”*5:ƒ•ÓJµÝIu%pñƒ²-— _/å@ ‰3Ïm>¤_}câ $Xà5g±rÉÚÿz¦ŽåÀ7, ˜ÍŒŒöÍÔS…Ì ~ìN®YÃѼ"‚0¨$ú…†PXVMËÆ §¶¶–(½ ƒ¤ ’Ëþ’r|ô:” ™ù¥h%èˆ!©?†¾içܯ¤eäõ±]’‡N >|é5u´]oÒ}|ø\ëÑöS8ü!^¾bÞ¢¼ÿ†ÉMæÄ™ ìäˆäCß«‡axu9ïþcy“¯4‰×òôS3H1¤sëWñöÿ-fÎß¿Á?e4Ó~‚Øw_çDKÛ´bsnCæÓdÏ›d$q`Žy§‰¼"¾¾Š Þ)èý€9ézb^Œ)ð|/>±”y ñïud•?‰ƒ¯dzÃJ|†ßËì¨Í|öÞRŠ]&b‡Ýʯo»‚PØ-à«£. 5ï½ÆšÆiIy˜7~=„®<¾.½/<ÌÇ_.fÎ&;’O,Cnz–[''ÕG85ÄN{†'¼ÿeÞwóÖj=‘ƒ®æ®'âøä_Gò<ú.fe½Å‚¥ÿå°1†3ã¿/øí¼†’'zôH"·¬äÓo® óþ^í(«³µ'-Ë{ëûoë¸UÔ$îºî8ï}ó¯­÷gà}/ÐkD@;Ê´‹¸³øøoløS˜@¿iñ‹©ëo>ÛS/gk^Oç.s cÚ ~vÅ,^ü&«ªÜH¦hÝôwd¶óm¨¤BßñçDááp8Ø»gþ~þÍ‚‘‘Ä–•²háW\5y çÇ ³®~m‡–—$ £©ù+K¥J‰Áйñt:ã'^Ñê÷kW®¡¬´®Ãë˜ñcP(•|ö¿yTWU³xá"îäAôl‰!t-IÃèÉgÏÊ 2'kåïÆÿ#cdç[C`ʆ 8ëýì}œùØ7–þ£c5;>Cnr?¦òiy9…G'p6uP£&Ÿû&½ IKpÊ®Hiiª •_C&&pö·©£®¡ñ¼#ÉgþP…2üºÉͶ£HaØÄš†ôÎZ¶Åu…ΑPjtøit4{”Õù"QC•ÝIu¥„2ÈxQ»'[µŒ}•6þzúÿŠÕyzR'ßÀøC7v mJ¡ &&>‚ÚÊÇ‘=µTÖxðzµÒùdR5üF%•±¡Ý}C¤@ãˆ2jüB1vÃûš±¿}–mËW“›G…×W–ˆ dPH{œ¢ÀjÁ¤Ó`Tª 6˜ˆ‹ Bï¯Ç^TŽÓæâ»Ã9„Ë^†ÇÅ *µýˇ»>‘ç 9ÎNuç}ïç÷°ÙÒ±ut~ΜŸèÌîºl?Æ'¿{Ë-¿ãÌúA6¼vJ÷|Æ_ßÜDìÿäÉþ»)²ù€ç?âÙ¦z_vGÞA„¶É²Ì±#‡±Z¬DDEðå—_ðØã?oqy»ÝΚ•+xóõ×>j?ýL«ƒÎù×›Ìýà#¢cbfIX·z-ï¾õÙdzyøç0cæøúµ¬Ú³k7?à1œN'÷>t÷?ò ‡ƒÇï”}{öÆ¢•ß4[Ïl6³ä«E¼ñÇý>ÈÄɓؼa3¯¿ü*¹9¹Ìº}6O>ûTJ­nÇß>ó[¶mÞ‚@o½?‡Ðî¼åòNçÊ' >mWÞ„Î)--%2²é´]g¦ç¼ <åìZs¿‘cH2žß#Žl;Íæïs‰7’˜nhçÜÙà™p¹ñâ0[0{ÔøùéQŸãP+((hsjÙóqjÅû,=~æ¡Ü@ò¤›˜xžÍÓ»„#‡ïíÇé>ͩʺ®¬qSïäÚÄË7|jÅf¾úõ‹,9¶“ò@“R†Û!Q]læDy9’FE¯è`õ˜Ýn¾Ü{Œ¼Š*´j®‰Åפ§ÿw’pëÌ šöN·0¸ÿ¹¿+Sr‘¹ ¶³«2„Y)¾?FÜ:c"1¡Á éèEÊIÁŽ£èNí¶yDÛ«ëó&‚ ´¥¦ºšÇî½›ì'$ I’ˆOJæµ9oŸs= Y§ËÍù gÚ3­Y¹š÷ß~—ìÙ@ÝÌ >ù×]úú®­›·r:7Çä)“ðõ÷Ãh2qŤ+ùâ³ù”–”°|é2fÜtjM ]¶¡ {ÞVÖï­D“Ih'æ!„öS õñ¥Æëë°ø+¦3¶Íù’®¸¡g ´1Œ|š5»íøk«P&elÜå,ˆŸ<‚ëuÿ äocþ¶¯¬bptJ¥‡¯‹MÂO¯A£Ó!©t(Ô^,n/Z¯—QáA¨Õ "ÇM¼àÁ8€ÁåF˜H´b æÿ´Lb}Àœ»›eŸ|IQâtHê`“٠јÑ'ô¢r—çMAhÓo~ñ$§NB«×ƒBìñRV\Ìêå˸åö;Z\G§Ó1~Ò$ „Noh2`áåâpVVC°Àa·³sÛv DRJ2ëV­¥´~ZÈà`Ž=†R©$,"µZ «–­äºë§‰€Á宕n#¡‹Îäè.I‘ \:Ô!d^ýÜ Võ¤„ L‰£™–Øh&‘Ÿ€Äq¼˜ö’Þy›×ÿýwvGF’Œ^ÉЄ8”*5F£ÉËþü|ªÌVFà£Ó2àþ‡IŸ~ÃEI÷Å~–í1þCyàé>¿„×~õN@ãGßQ÷ñûk†©isMIÇM鎤vX—çMAhÓž];Ñê ¨t:$•¯ËËåâûµkZ èõzôú¨ ˜Ò kÂÄ+©µÖrèÀ!òóòGèãªå«ÈÍÉaã©®®"¸ ~¤V«q¹\"hpI’~w‚ í•Ò;”¦îiDÀ@AºÁãO?ÃËüðãÛÇàðnœ}k·í³Wï4‚CB8’u„ï¾]ɰà @¥ª»Ü[-Þù×ÊË+ð¸Ý˜kÌÝòðFrj GåÀ¾lß²«§]Óð}iI)¿ß@Ω"ÂÃñõõeá_‘[ÿÙ5Ó¯aö·Ôlûz½ž÷漋ÕbaÙ’eÜ~÷â ï R©Ž%Aá§AœõA¡\{ý ÂÂÃYðÙgØl6bãã™qó-$$v_?Ä€€ ÌáC‡)/+ãÏ/þ‰É×LaÐAX­Væò9G²ãq»éÓ¯/½ÒÓQ*»~Ìì˜ØFŒɆõÈÏËçÍ×ß`ïî=Œ;ŠêªjV~»‚½»öàr¹3~,}û÷Ãåv³w÷^ÊË+ÐëõŒ3ºÅ`Àô¯gî‡a·Ûùò³/¸õÎÛº%‚ ‚ðS'‚ ‚ÐM† ÁáÝÓA£Ñ¢Ñ4µvÆÍ7PTXÈ·‹—RQ^Χs?áÓ¹Ÿ4YÆ`4òä³Oâãë€Édêò7ôC†eæì›ùßçRQ^Á¢_³hÁ×M– åºÓHé•Jö‰lÊÊÊð¸ÝŒ›2‰°ðÐV·mòñ᪩“YøåW±kÇN† Ú¥éÿ©S(¸ÝnÑ¢@º‰ÛíF¡èI3BËÄU@A.A2蕞F`P á‘ ŸëõzyâQBÃBùìãÏ(+-m²^zïÞ<ýÛgHëýcë‚äÔÊäÀþd€R©dÒÔ«8’u˜+¯šØb )½R‰‰‹%:6†>}û4|çàÏM³fâëëÃçó>§ /¿Éº™ƒñÐã“1°Ãòþþþ‡„pÕÔÉ„†…3ÿ·ß}ëÖ¬ÃÏÏÔ^©í,5¡½L&eeex½Þ‹A¸,) L&ÓÅN† ´Ir:bäAA¸ •—•±}Ëv òóÑhµôí×—ô¾½Ñjµ4ååìÚ±‹SÙ'1ù˜è•žFjZ/ŒFãM‡ ‚ #‚ ‚ ‚ ‚ 4#:΂ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒ‚ ‚ ‚ ‚ÐŒêb'@AAAz*¯×‹ÕjÅétâõz/vr:D¡P Ñh0(o/ 9N¹Ò%‚ ‚ ‚ —¼ššT*¾¾¾H’t±“Ó!²,SSSƒÇãÁÇǧÃë‹. ‚ ‚ ‚ ‚Ð §ÓyI $IÂ×ׇÃÑ©õEÀ@AAAZ!Ëò%,8C’$d¹s DÀ@AAA„fDÀ@AAA„fDÀ@AAA„fÄ´Š‚ ‚ ÝH–eÜn7n·»a:®Æýa•J%J¥•JuI÷‘Z®ë3D= ‚p)AA„nâv»[·ûÌTg0].•JÜž]ŠÎU×g¾õ,Â¥FtIAAèN§»ÝÞêäÙ¼^/v»§ÓÙÍ)ºZGêZÔ³ —0¡KÈÖ,>ÿÇ¿Xš{yÝÉ–|úÊë|“Óz¾Ú³ÌåêrÉ»·ès® ‹ç,Û€y ³£ðòQçùoërà8É‚¼ÍÆrÏÅNÉEsæmsg8N<žŸnÙ]j:[׳ž›œ»[ù½^.çwA¸˜ÜËyí…øÝ ¯²¢À}±“Ó)¢-” üÄ­{ãl¨ªÿCi $e(“¯M¼±cñDIÍà+®@ܙӊ“S æ°©ßCÜšªëÄúml=g1o}tˆ¨YO03UϹ{Ž6M‹¤eÈІ´ž¯¦Ëto^ZÒ¤Ñ8ˆIÓ'ê£ìö}_ì¼wÔ‹©þvªþu0}®~Œ×ÞúGòÈŸþ€_ºþ¼÷¡èÂmu9ÙNÑîÕ¬üa¹Õ.”>1ôŸp û‡¢¹LºT¯{ó5ª¯{Œéqš‹–Y–q8çµ »ÝŽÁ`èÒ¾îëÞø#[Cgñó[RÑ×oÖ•¿œ·>ØMÔíO13QÛeûj“»˜usþsÑÎ]­ëØyì|뺫ëùä—¯²Ôÿ6š 7¥ëßæý##xä¾Áø)À™»˜w–úqë½;xm¡½Ü•{XüÉF~ƒjOP @5ÙÇóÈ-ØÉ·ÛŒ¾u}ý/æ¹®ýÄ@~ê&úÝùÓãÔxj‹Ù·ô¾ZÉ#7&£ëÈý‹Ò‡¤ý:™«‹ö5Úí('Å MÙ¾<©)œûð¬´(}I4àÜ»h²Lwæ¥ u¨Áë(#kÙ\ÅóÒ1v÷CàÅÎ{G©Â¹uÕ!þo¬gÙ>>~ôn{b‡æMfêwvÍ>41]·­.å¦lË<ænÔ0bÚ}Üï‹\v”]‡K±yCÑ\÷-—·ÛÝ0>ÁÙdg‡6næH¥·×H°ñ ŠÑ7kòyfð<µZÝu S¨Pìæ´-…Tƒ¸(=p §RÕF µ›\ÌsW«:vk½®=Ôßĺ݅Ø15h<ÃMœý3ëêzJôǶ¯‡J¶‘ŸmEQsœbÇ üô2¶’¼Á}ñÑø|æÜÝZ¼£=×?Ašò”²ù“ì-½ÇÞF_}÷Ôÿÿ‹y¡D<8Š KàÚ+‚ Ô“PÂé= ’5«K±Ù•,ýÏÄŽ dßú£¨FÝÍíÃüñ”ìfÅâu*²£ McäµW3$R‡ä<Å×o~Kà26D³dË}ÏÑ2ê°\3s)>®Ò}|÷Í:äÕ û§2~æTֽ˧ló/¹þá[èe袻EW s}pS&?ÛG=…D€Ü¾´Ü7”ï¯ üÎÛð_ö¶¤=ÀÝCüPöcóyg],wÞÆš9Ë ¿ëB¿{çÇõõa¤úWPÞ÷>î€pd/àíÕQCÈ­éìY±‡œ+É÷¾Ç§œD¨RÆrà}¿÷Ï,>\ƒ±ÿ=Ìùüe®55Ú´y ³Óm+ã úÍ`V¿ó5»³ô{v!_ýf0>R+Û ÌåãGfòËǰjã¹úùùౌó~€’mÙ¬ÝPMï›ft‚®î1²c#ë8»NFÝÍíC4äm]ÅÚ-É3{0Æáƛǫ—ê–oí8ª+bì§ÖóÉG›8iÑ7þVn‰ÖÓÂq44¬ë[8´t¼ÒpøìÏú–2ïÍ­d>z& ¯y7ÿ³Ÿ1OüŒTÜò¹L_}Î<¸Ý­7;uVâJÏô >Èå»ùfínb#FÖ™ÇãéÚ€*ä€rvçØHI7 ¹J8ãCj°­äW“ÓüØæ‹5k% ¿Ë¢Üb¡Ö  "åÖ§¹%YÓÊ5 õ–kí:wùH8 ·ñ͵d•y HÍ$ªü$þ3ïgœñ0w=^MúÉ/YØø<öàd«;^ײ5›-û¼ô¿v&1Þ¬Y¾…œˆ+IÔ7?л²žõaÑèªs©r÷Åè)ä¸3™ÌàbŽ•¹I‘©Ì©Á'>µã$ Þ\Nø]0ªñùKv·êTŽåžëŒ¬œS¿Ì¥ðT#=2ˆŒ1iüðåáVcq ¥×¨~\"?+0¡žŒÛ’Ïžmy¨bFcT¸ÁqŠÇûñ³Ç¯!P-!;rX1o æ·ñó»0ï_Ä'Ÿ-#ðáëIntÒ“¹¬þô{<îäÉ~&*·ÌcþÊD_«eý¼å” œÅ#wDAQ6Õ>&¢n¾Ÿ)ï¿ÃáñOp{7ew•à”±£cW±¯ÐAb‚§YÝž´8Nr@27 Œ;Nb4…ƒ¢ùûLÄWQ]¿7=)MÖ×R{t>ï®?JÍÐaø+\”ÊÃØ{|—æñG2ns>{·æ E Âäj­TતH=•›ˆCW{„Eï.bmò£\^ĪVê8¶x kr“™õô„¹ŠÈ5û¢¢¶•¼ë9,kíxùöî;>Š2àøg¶f“Mï½AB½iRí(ØîŽŸ]±žõ<ÏÓSÏÞ{EO©Ò;Ò{$¤÷í;¿?˜Ý%„¢ß÷ëÅlfŸyÚ>3ógžÑpLÿ‚º°DæÂº²®äã7Váßÿ!btÖÆ¶ìeƒÿ«L[=ˆÐ’é\ÛûF³™w»nà¡KŸÆþ¯ùøK,{^½ËîŸËÀ·}Lå®^ÁÇ›ïcöŠç Ûò=Fý›§s‘n‰Ç´ºÝô/ÍôkèfÙÀâü„–ÍöñÂQ¼|m:—Æûy¿›|Ìow5] îM‚«'œߺr]¿Ðú;¥^úÑ…1€£˜»º3þæ¹$ÿg>øn!ûz_MЧ~Ôw“íšîÇ}`¦‡>\ì5 ocYt>Ëàmv€1¦3GïÙEìÞ„Õ…Ç3²V¾]Õ–Çößr©ëÐCÑ&öeÓ©n1ð5vëšj·ñóÌý¤þåþ/²ŠÕŸO!¯ßu\œfDµíóœÎeíñp½L³Ç® ôüò8o{Ý IDATå*{\ÉÝãpä,âËoœ„¯ØÍnÇ’{ß„¥Á8fÏÊ['ÐÖö’ªÂ:gRÐDFðzv•:HKhú¨Lk¶³.4…0ûRŠ­*QU{( ʤO|³÷VàŠÓQPª#¶¯?Ê<|[¥nÏ~Ø‘ÌE7d¨Émµ| ñgQyp/ûJ­Gg)ÓGpÕØ¾Ä©Yõý—Ìßk\XËóÈ;”Drt`óÓÎÏ¥ÌæiÌÑ—@¸±m¦fIÀ@ˆ?;w ›>ý/›PÐúßq8WHÀ@.hƒé4¸sý…`?°Šíšnü¥g,&˜º §×òXµÏBzÚïIÚ¬b‡©?×v C¯@dçž­ÙA~®…­j7®êŸŒY$d`Ún»ƒ’-9˜²  ¹S0 +À–šW¶0/ )݈œóû-]É6±5/€ìÁÁh©ôúSR/’j°³ª7}Ì%ìØçG‡~Ç;½m¡£m #²Ó¹\1&åà·Û¡Ô‘ ÚÚwJÀ_˜Sé‘3v–QçôÞÆÉ!!¬yìÞWId»XRð>••ãô—Tšô¯SRWÎB¦Œc úàú]þ?ü·?,h¼!… ®ìK„ˆ>—‡º¹éÇÝ”Xßä‡Ð{øõªv˜4ý—›H|oÛ­ã½ïÓ¯ÿwÇh ¤¢£îGv•9©ÎñœÖS2AåËøyÉ>²GwçÜÈÖ)ºj­ÁnˆÇ¤°±ç«—ùr§cÐĉ ¦I›  ¤]ﮨ®:ÊòËQ4T¨ÀÉဗ~äŒt‘ôÙ›D³’;«™O©ÅMšŸ‡~Ô4öã,lú™Zë= ocYYßehî[ì%9”ù'ÒÓËÍe_‡£¢Du%yÅröÕµ#xS!]»a\v8?^Ê[?f4BÊt œa@Ñ…’¬g]AJ‡@ïé8ۓа¬-»ò÷[Ù¡éÊ•S1ëäöDûí–>äÕ„êùôß]µ•™3}å ¤šŸã»³ïÞý”œ£?é†DZˆH眱ÃÙòÒL q²oþW|ôK*ÿ~âúf§½õ—ïYYâé/f:›ÀˆÄ¶Y‡FBüÙ5x†´ 0'¬â¨®ÂAÀ‘ÙÚ¢Ül«°óûéNývµ…K˜üƪÃw2]Ø•t¬UU8ÛxªFg)[·“Wù Oÿtø3ÿÙ“ ;¼(æ4ºFÌcó+AÛÈ5fqEˆ|,z«ø%Ð#µ–_vVÑ-u9ÚLƶö"7‡Ûðâ¨}|ÿö ôÝ»g‚ZíÐÎCLDAï¯ÅYkÃæ£µ†ð×K–1ï—÷yeV"}/¸sâ½eªý¥Qÿ:Euut sãÏ«}}IK@¸kq5Uùymø/£²ß¬¿PmTiFãlîù¾¢Ã¨Uqº]ÔzIKÓé1~þè&=ÚÄ»ûs÷ïððˆè“>`+~fôöJ¬n#éW=Ä£ÎBæ¿ûÝï¿ßcÚwû—NgÖ& a))„¢ :½] éGv}L‡N£âVAã¡¥™[ýµMž÷Óô³ÑÞRð6–µCí» Š¢÷"Pµ°~e1 ýzä¥ð­¹àáὂ>š.©U,Þ³°ƒatäOõ²ú¿y+¯šô mp2qê,vZ‰®`çn+C‚Тbõ–αUÒ¢±+{uNsA-ZØŽ)¿}¼þÚœ¶>RõxiÏVmgm ‘*;•S¸ßIÜ`3ÆÐ Â+7SPE¥)‘H£ÇNjpW±ùÇÙÔZµP倸ӷh¨\'÷[ï7îRlß|džF„È}ÃÚ(X0B4›‚>0mm1µ.ê/´]µ×j0‡ õÛùGwäo7õ'´Á‰°u÷ÿÐÖSsäûÇjå›iÎÒ­ì2 âæG†¥\%,yÿ 6:n6·ÚÐúŒÀxèGwŒ#¥ÕÏu¼ìçØÏnÌBQÝ8Ü* €ê>üóõ>–࣠Z­Öç:¸ªØùëRJR‡1:Æû…™VÛ¸ê‰ìœJÅ·ó(OÁ “ÂVÀgy3ÅKçöfÿü{=!™c9¯]ý[h|֛ͻ¬»¾BSWNŽ]AQ4­ÓŽ·¨ÿüèzkk£Ùˆ«Ø†Ð⤮ƅ’ç©$­ÛÎ:ÂSC¨Ý½—=ÕatÓ£cH7/boŽ kX‚t4 ¸lXâÆs]¦ü¸˜©£IlÅ\ ñg1þŽ›8°}ßÎÍÁA!¿ü°”èKzCk¦Ï§=)ç^Ê̤¥­˜’rù¥p4h@Æè+ÔdAÕÖÔÚ}!Ę!¾\ëùem§•¢ßæ³Ú’Nï¤Æ¯*4Ä÷¦½e9s×ÂêWí!”Ú0Ä÷¢ss—ï§Æá zÿF6ÚP=f•ʃeØ]\­8(Û¶GRûß/:µÁ¤¥*ìÙT„¦¹yi”¢†€ô.\ÉŠm ™Y¡Mhe1Ät§½e5KÖÛIÏŠhÃH­–ÐîÃɬ^Æ‚=uè½´ƒ àªd÷æýT;ì”ïXÀ‚ƒatËÅäµý°ì[ÁòíeØÑa A»ñäcÊ®mfièÔÕÕqØ÷3ëKÉ·Ô°wúãüsU;®ŸFXßÛ¸°ì%øx#•.pobùÎjÜŠ½Æ…½ÙS ÐcZ•”üú/þ°›ZüˆHM"g“sû¡ø§3¬Ÿ™ÍS§±lW 5ÖZ*Îíµ=ܶZìª‚ŠŠ­t'«7•6΋—~äýÄE¥îxý¨UxÚ‹ZOûÖa(cÇÞJì–Clœ¿ŒCõ+zˬžÓi°wŸ€îö.ÇVÿ¾œÛ%Ügo›€è£:Ñ Ñ]½5ÆÛØí±W[sY±'’‘nâÆ›®cüàT޼·EéÍ» ±ˆ·¬gÑæìÎnXɾÚéê[©cvªsO¬­ ‘)–íà€EÅ]›ÇΪ0RÂOEÀ@ƒ_L<Ú¼ äèÓ‰63‰‰N¶m(Â?9ÂÃC€>‚ÞC2 OÌа­Ì^]âkòœ sTq¡¦£ÇAëî9|üâS<óâGÌÝ}d½$}H"ÉqÁ-NÿHРgB Ç´}°d†¢¿dFüå\fÏøŠ×æX0Fg2ઠh節½áv)ŒúËPfÿ0™—gZÑÄ=b<±]Ò}õPfý4•7Ö^5¿=(&’õÆôÕ<·:™1·ü^­0}ûV q£#ùýMOxF®6Q2jLóòríÀFijÒé0ƒ™µç0(ÌÃê±,ÑtÍtðþÆ †F´í°«ø%3h`(ïÏ[EÉÍC<·C& 1b,_Æg/î¥ÚO׋/§w¸ïmlÓë(ÿ)¯L³ #é4êr’õå¬÷Qv¯ýÅÛ³±úSWW>é Êyáñó9Ø›kÞûwdPÊ‹ÓÿÅ=7Ž!îŽrtÑݹêé/èyuç÷*ææÛ¦pý÷ÉÍÚ…ì)­Éü'ËÈŽŒ qB)®Àl®~áKŸäì‚zz¢Mào~s˜óã»,¨v¡ ˆ%kà…ôŽÐqx™üF ƒó%Sž[‡_|7Î隌ßþxéG¾ž}ÖxêGm0“²é~Æ“bÞÂYÇìÛl&dp “g¼Îssãé{þ¹tÌ«ï՞Dzq ‹ð]N‡Ýn÷8U½jÛçTcô_ÁŒo–ZÂ{žÇðtÿFÛ)Š‚N×F¿] Cn¾Õèêï ïuìÎô†1ŽÌ ïøêù'ëÿ¯1œÔ“óÇKz€—tÂ^Ol›5vuÉâÂKòíoñÜ â»t"* ´>},ý[¥MØŽcI ½(‹Š-okÅ?~ Yøã7¬>üZÅ$«—¶E;ëB“ µ®¤4)¾~}t„¦GãXžCT\€—»… Ð’5²'Ë>›Í–Ìþ­š/!þ\lY²«ÏììZ²².C‰<Ó]Ŕ̠ñÍ;×h ŠÝnoíu„Fö\¾{c&ánað‰Œ~h.Ê–~À”Š ¸å‚Zñ%i'Æ–ÃÔ7fsíMg૲΀ºªþ…«³î£û/«x0ã´·Ö™ëŒîG§ŸÓéÄjõ}Êè‹Édj³­Áž7‹Ï–ÄrÅ•] Ò¨¸,,ûä3rßɄ쀓|R·¹™ÈaÚë?6a"C£N_€ñdÚúLog!D½ââbââ⎿!àªÜÌS~ÅÕëBzÙ~âÃÙùD¼‹ÖñÓ 7ý®K7O7žÚP~~>‘‘-_IYf!ZŠÛZN…ÃHjk¼ÿíEÅUµ“_׸é|UÌéu&ƊϤºRQÏÈ::ÓHy£Óé0 Øíöão| ƒÁp†_DªØ+‹¨qFárÕ^N©-ˆÄðæ­ÑJÙ8#zà‰¶õ™ßÎBˆ¡ îÄ%·vÀYNùTDjz<‰ñ)Lìyš3ØB0Bœ$7Õ¿}ÎÛ?äaî~9ídi”ß¹(]òï-¬#møUô;wÀÎ|RWâÇ`0 Ñh°ÛíÍzÕ¢F£Á`0´Ý£­F! c ƒwOgòë‹Ðèt(†H²Æü…A1gzÞÛFKÚúìig!ÄÉÒÅŽâž'Gîlœy$A!„¢ ©ªŠÓéÄétâv»=ï®( Z­­V‹N§kƒW)ŠSÉ[[K; qvkÉ# g*y$A!„â ¤( z½½þÌy(I´ ik!ÄÌB!„B!D0B!„B!D0B!„B!D0B!„B!D0B!„B!¼P¥ÑnÎ6ªªžðÛY$` „B!„Bxa0¨ªª:+ƒªªRUU…Ñh<¡ï+v»ýì+µB!„Bq ¸Ýnjkk±Ùlg]Ð@QŒF#h4-Ÿ/ !„B!„B4!$!„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ Ýé΀Bq²Æ¾Zsº³pZ}ÿwóé΂B!þ€”ƒÊk…B!„BшR[[+!„B!„B4"k!„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„B!„¢ !„huªe/s¿øK '–€³€…_~Ǧ*×ɧu–ø³”óŒÑ My~"„âTÒî !„8{­ûöc6VþÆHHb6ýt!ÆEVÏèCOþ0£´bZ­­Qùˆ ÿå’iVZœÖ™\Nß.úž©c•¤oûÝ©vŠ·­dÕÆŠ-. aitП¬H-¯õ–s.aêϹD¸‚s §bê÷ìí'B!ÎFr´Bqâ4&ÒÎÇà=n[»—ÍfÁŠÆ '¡CûÖÙ‡ÖÜziµ¶å?igr9}R±Õ9pŸ’}¹¨Ø<›9[üé6d,## Ôæme{Q5ÎÈpÚ>\á lo !"©ÜS„=1¶S¿gm?Bq6’€BˆV¡1†‘Ú>‚5k*°Ú5,›º‚ð .¦³ ¿]‰_z(eK©©s”1ˆ¡=ãðSÀQ¾ƒ‹×³¯Ò‰>,ƒçö"±á•Ÿ³€…ß4HkÚz"ºDppû>J«]„uÁˆ®èð’–¡†=Ë~aUnN™ÄnC˜Ö¶—ÎÏùìÀþÙÓØ’| d™Ñö¿ðݺhÎƺ†uöÝ¢»±{CºÎç3ºc®ò¬\²ÜRú°d:@V„ÅÛþºF s°pÚ:Â;‡qpÛ>Jë $öB†}«·¤ÒNבÃé^_#žÛã—ô)˜?•…68ô%ŸãtIœkÛ¨¾mY·ÑBúˆóÈŽ®?…1¤ö ¿j%wÎ6Æ_È…ÙAhGþ"¾[Á˜ ³ñ¯Úͪ¥ëÉ)®A L¦û°Ad5NÚc¹MÇ<¹é,'ç?Ã2È™¿‡GqzíÝ5ÛJáÖÕ¬Û’CQ¿˜. ÞhCƒùª•Ü9?xÈ Ù¦í¬nX¿u$gÆÊú~¤ÅYá¡lÁ–Sßç…Bü!IÀ@!D«pYŠØ¹¥}TLšcî7»ª)Ó÷cø%1¬ûXüÃbÖ&Œc`x kæý†»Çy\•æOõÖ¹ü²*ŸèZï;²±«¼£.ꃱb-Ó^G~‡Q$i =¦ž¹‡5E Œ¼ªa®RÕœšƒŸÇ|Ž$6#Œ•Û °vh¿â¤lO ¦´ž˜5u¿o+dãtÆŒH°p²rîZê:æŠó©Ý³„Ùó–|éâµ>êE Ø‹Ù]Ý•1cûAî<¦.šƒ£ßÆŒHåÚéÌYWHæÈD Ïu=@ë=ýaÓoÆwäv¿Š1Iz…‹˜ÖFõí¨ØO±6ž¡áǤ¨øÛ!š•ò¨ÍÊ&Pã¤,§¿Ôn˜Ý‡X5w#¸tL$Ji>5þÇ|ß[¹‡4žAà,Ï¡À/•.AÑ`^Ëîq±zí=Š$½§6–ç÷#ʯ–m³då®vGÇËVvÚõ‹³€œ£:Äes¯?=}^!ÄŽ,z(„âĹ-ìýùs>ùøc¾˜ú+y½Þ'ºéL™Ä´HŒ (¦82bU ÷Wb-ÞÆ~c6=RƒÑ)zBÓ2 (ÙO…ÓÇ>µÁ´ËŽ'@ º ‚5µTYÝ8¼¤U¥ À`+"ïP5n¿pbÃŒ­÷¬{ƒòòñÇL[WÁÑåë<æSÅ/6ƒÐÊ=ÚTp–±·ØHZb`Ó²ÆLZ·ôú`à(ÞF®¦==3Ã1h „¦÷$ËÇ–B›Ïz9ú·±˜4 Æð̆:´ E¯è Ž ‚ÚJ¬n¼Öa…ó8é7̶¡ ëÛQ‡ÓàÑC‚ƘÄXö’WëW%û õ$'™qm%‡ údÇà¯ÕbŠJ$Ò¯q>Ë}”“Šœ|üRc1iüˆI÷§dW)G7ñV?²Úã簾¼ ü4Ô×6y„Ã[þ}¨9½”­MÛ@!ÄŸŠœ…Bœ8oÏðûºàGAç§Åiµc¯­ÅRú³§m;|Aã®$àV›¹EƒVUqãð’!Ý9x3kÖÎà«•Qtê?.q¦Ö‰˜7w ƒ£ùTQübi²†œ";I¹Ò¥mÖÀ±eVtøMVÅQ[‹Û/ÿ#ך1An½éú ö×4Ï4JÃMµhPîÃc{´ }mXַ΄Î^‹Í ; ÅMf¬•5yµ´;@6‰Áf ö¢Zܦ|LZñZî†ÅsU’³¯‚C5ßðéòßwSâˆ!æØ«ñ†õ£Ú(ܸ„•{¬ÇÆbFAu¹›4·çüûÈ4`¯õ\¶6m!„*0Bqj©NªÊ¬âü1úûã–¨‹:ÔðjÆYÀö%ª ÷–@BW†&dS½w)3­"æò!Äœ®# b"¶]ësŠ( ÊG“2”@-Ç ²èýýQ¬åXÜ`Ò. •0™ ­t!è£}µ‡røßÑK`-æ6ªo}H"áΕì-uÝ$Aá™ñØ× TÍÃ0€@­‚Ûß„b© îH½yJ×Wß9ÌU™Ã]W.ù¿„jW%gÌao™ƒ˜pïyv–¬cÉNÎ;œ½›ÊMûØYäiKOù§¾ZÕoÃ|{+[ÛµBˆ? 6 !„h{îZì-¢Îé jÿ:Ö—Ó>ÕŒ1*‹DÛfÖì*á‚ÛZNQ•UUPW –Þ×{L˵p ›÷Uâ@‡)0=îS´¢¿7 ¦¸tÌÅ[Øš«”ìáqôQIqíbÍöRì.;å{Ö°Õ–HǘÖ[§ßs:=\ª6 èñ3*ÔUáp9°´e}û%Ð#ÛÈžE¿²µ°›ÝBÙÞUÌš»*7èÃÛ“`ÛÆo;ħ£ô‘HpngÕ–B,N'u‡ö°·Ô úØñËí¢*w?®˜„ú‹xmqq ÷–ûŽõ8¬ØQ@uã¬ÚÏöÝU¿§{L?÷”ÿÆõël4ëÁsÙìØÎ¸>/„âl%±f!„mOÑ¡¯ÚȬ¯ ¨ÕGÐ~à0²‚´@,}Fö`åâY|¹ÌŽÆNjï¡D¤‘ieɲ=´ؼ}è=¥5„žÁZ*×ÌâëE6T}i}‡µÞÖÃkì=ú\΀0ß_SüãIó[Ê2kg.ò=íü(} }FödùÒ¹|½ÚŽ>4™Î#úoTŽ3;¡<ÖáP"’}}É@\×lž7ƒ/¶ÇÐc`2Õ[Ú¨¾ÑÖíªŠÓjÇírªžîÜqâN‹ÎhEiÓ]9ÊJKql^‡mËl•µ(ŠêDg2a2…`p+¸7mÀ²n®Î=°fu'<"DBˆ£ÔÊ•¼òèÿ¹ãi®KÞË[M!ù¡Ç¹ æ˜qƺ•·&M&ö'¹4ÁÇÔÜíZ;BüAœÒž½¥<—©¹‹ØQ™@¬8—$ 䜘Î(´í‰âÏÃiµãv:Ow6„8yªŠÛáÄ©‚ÎÔvk9Š Ù5}*‡¶o'9>™˜ØtF=n« ­^‹ÁˆËf¥²N¡¼Ú‹~`?î¡ç+A!D#Ó¼žKÿGLJï ¹æoç’lò}ί´gø¸Ë0ÅÚ>“GYÙöΣÌì÷÷uó÷¹åéÉŸø£zûÝE|\yäZâSâ¸ç¼Tzû¸X=}5ŸuìÅëíNÍq÷”Ì#t©nþ³á3þoÑÓ²”3:¡7% À¨ÑóÀª·™¸ä%ªu§"+­Ë¹•¦?Ä•gÎ…‰Z¹œç'ÞÅÛ­`ÝÂë·?ÄŒù³náõÛàÛ¼3'ï R³e Ý< ·¾Ìšê?ÆáFmÒFœ‡óÞ#73aÂnyn)åî6ÛU³öÿ»ÓÓ¦n—ë:z. IDAT”ìGˆSÅSŸö:¾·4m·›ÒÒR¾}ùü8‹Y+VóÉôé,X¶˜Ò‚ýØ­uT”•°hñ"^úâsÞž6k·òë–}ü4}6ß}IiI n÷‰ <μo¹oÂ&<:’?àO×Sù¼™>ø:¦Ÿ%NÅñPœA´ÁôŸô}ôï=+]ó§òÞœŽÛƒuatzíw™¢ iÖýÆælçÂRm§Y£X³ó'D3h œwõ9¬zp+þÞƒ[ñøìRʽ~ÁMm»y}µ•œ’°Ä«[¾eîÁµ¼wÎýôŒÈ8úùUiçrkí%ܹüUXõ6o¸MO¹<+8óøæÁG˜^|øÿº`Rû^Âõ׌ å¸QÙ F]1SüID=mÛy÷þ÷¼÷)†mþ7︊—ïïÆ‘x«»b9/Ý÷¿ÙÁØû!Þ¸+?TêöÎâýw¦²¦ÀN`úpþïö¿Ò/R‡j/bõ·ñÕü-Ûýˆíy17Þx!æcÊ¢V³ùûØ/~–ÎF×¼£À¯q›XÙúæCÌèÿ4“z4Ž`«¶|V|ó ÿ›¿R§ŽðÌa\yóÕôªôG­ÛÜO>ä»åyÔêÂÉ~×_Ñ—}-¿ø„ÅyvÒzЫk,–‹ùeÞOü´ê š£mà¢rã4Þùøg6—8ð‹í͸[obtªÉÇ%sãžÉûù\KçûÞâÁ®îÆûï–Ò P§©M›<† âÚ:ƒœ‡¾§ê 0b~ø9Ú<‰¹Mªú/57>J\»Süx–#ŸÂëžÇvçS$÷õo£¼œÆò \e”Ýý ã&‘ýpûÃÑu×®ùä=úe»ëPBS ¿ë.ŽEƒŠkûòþ5•Š J|bŸšHTGîý‹9ðØ7TìªA‰î@Ä÷Ó;Åuˆ¢¿ÞÃ]Z”ÃGd%|í¦ÞŠÙÔ ?møhMuu5k~šÎÎ…spjtÔÙìèrwï Xµ„Åé`×Î*ŠJ¨UÀUWG”Ñ€K§¥è·ß i9¦s‡äqkžšÀ«Û=üÁ<ˆ‡ïk³²µ*ÕFþòiLùaókQýbè2âJ®¹¬Q-ù‰¨5ÞÇÌSÎû1©-´Ê9Ê)γhºà4úôca~%NâÐV¯à™IóòÌ?¬à®ø•ÿ<²‚‹_xnš­¿Oói˜ŠŠ%w¿?5*1ݺcrAt“½ùÚNÅz`“?œÎú ÆÄÁ\sûðÙ?yc[ l¿‡‰ÙÜüïkð_ñ-Sg¯bO…“ Ì‹¸íŽKÈPêqð”?g1Ë>}¯V¦ ëŹaD"Æ?Æé¬84Ff¡›WC…+cYÏÎÜǯ¥Nü¢bydl"ÌYÃû·œAþ¡<9!žÙ_ì§{?.+ůO6ãr7óyr>é퇨ÍÝÊå‹‚˜yM‰å«u‹ÙTnu!SöÌç©^76 ‘ÉýÿÎæ²æ\ÓÖÙieJÛU 6˜ÿxŸÉ“'óñ+wÒíà×¼=+¿QÙpºž;˜Œ“ˆÊªÖ ­A$†BùjâCøý\ÈÊžé_ò›ý˜ïÔmcÊ‹SXS@‡n)8÷ÌãÍ׿PèrS¾ê#Þùy+´ëE×D7k¿æ¥É›©krMg§Æ¢!,!½FûÇyH¥Q›¸¨«²yŒ Úò1uö6ì‰]éÞÎD鎹¼õÆ/¹w9Ëß~†Ï—ç¡IîHÇ•;÷Sa\äæÛDÆÞ~7ž«eÑ»ïñýªƒ»‚†Zó½6ÍÖLÆŒF|éj¾xó'øìX úˆödgd‘‘AFûdêqdFšîT|ƒž)mj£îãXúÞMçUSè±öc2N*X8ʨÍ=wÉTœ ÿGIÀ…Äöòo»¼œ¶òn.\ùÛ)þ÷Óì_YG£aÊ~€C“¦`9‰.«&Óé™T?÷.e…n°î%ÿþoqŒœ.+> óov üšZ+à©1ôÊæÂ¤þü˜·ŒÑ ½Ÿ¨s+üü%¡Éql/ÜOÅFRÚõ<ß©aT±f××¼¶s-NÂ"/â…céaPÀ]ÄŒµoðB^!Vm$ƒ;Nä‰4#óÖóYûÔÊE<½úTY0… æÑW1ÔO¡¶|¯œÊÜj•”Øî¨ ‰mPo é‚Óé×+œ_Vâ$mõ2ž¼wÃ^øƒ‚Üå yüÁeŒ}õzh¶ðú}“Iyô?\Ú0KÎ>xçVå«Ävïé1*kÙø·=¿'°ûΛúO1=Ë3cãPŠ~å‹yå˜ÚecܽËá-¬{æ±² ÂÏ¿‡¯Š`ÓËçåõ X^8ŠKÜÁ¿"ªˆÎŒÃX½œ§ïx‹íÛ~ã£3©Go2ØØññøt_¼x 7u¿Ÿ×îí‚’·Ï>øŽ•¹5˜{qñ ×22Õź…ךNæÅÑ,ù~ú ã‘QQüþ’/ûÁ%|þá4–ï.ÅÕƒËïœÈèd#6_iNšJÊ…Élœ·šÜ2Ý'ÜÁ¹5Ó™2w3)Œ½ÿ.Lñkù¶÷M&åч‰ÿêa^ÝZÛîà†ÀNÜúì=ô:<Ó¯ÝxþñÔpL‰QøÕ®á¿·¿Ê–üí9FVºˆï7Ø0÷¿—g®kNç¿Nƒ¢Ô°æ¹ñÝ!€<¾¸ïò}ž«}žþ›?äñßÒsU Ðý/åòqÉì-^ÉS+÷Qæ€DJÝÞ¹|úá4–í¯Å/¾—ßz#“ýîq-õ8ÜÖ»>ç¡'ö{É-œomºÿ¾ÂMõ§MÚô64i·H­Ñ&^~?î߲󦩫±/°e¦!ìµgIêiÀ½{yÿ@e‘ „Oº“¸A!(¸q®øš½OÎÃZ§B`&ÑOßIt'X÷p`“íµÃ_o¢Hš¾wÒñ¥žè,ÛÈû!Æ·ÿKlš¬;ØwéÞ|†Ø4Ë;°·òo$|Oîç;qºˆÿæ)¢“µ>òÒ€u/…o äÉ[1hñTiª¸¶Ïbßc?RS(AÝp;IãÐØ|¥é‹Ã{ù¢vy¯—ØäŒýýåiXWåaÏ-E7ö.Ò&f¢³mñþ7¯òùÈK²÷R¨ûç²÷ö…hF_FÊßr aÔÍ­Ç4îB.m‡N«@ç~¯ÅRîDµn¢º.‹„óãÐhÀï‚K ýè-Êr®Æ?teyéÄŒKA«Q ïùD=IÉv;­8mF ¦¸€Ríä/þ-\ÂÞÚ`².œÈ—%²í¥ILïüoþ=¦~L´ly“I_¥óÚ“cš$a±XØ÷ëbB £²:àv¹Ñ¨:Êk,ôĆG—šIAþ!Âó ˆ×‰2› ô'&.S –¢b\5u8wïÄŽÙln²ŸöW=È?ÚÕO1ñµíô¸–‡n逑ú)ûØö3ëåû˜¿¡Mü0nt ½B5ÔåÌgò§3Xµ§]tƒÆ_Ïý¢Ñä}ˤG~À5h<=‹ç2w{%¦Ô‘\si$ë¾ú–•ù*qC&2éº>„: Y;ó[¦Ï_CN¥ }Tw.»u"´óGq•²jÊ[Lž¿“ —?ñ½Îgµ‘ü{›¨•kùâë8‰dă3¡sG{hIŽ×ÞÇÏÆjXó’÷1WÛæ|Å×?¯`w¹“ —p×Ý—‘ xoóqÙjT¬^ÆQ¼ž3Üï>èõ˜tܼqBÇÃÿpQè^Ÿ4´KÒØ4o û9H¼ø^î½8 cMËòÜ©|Ÿ¼÷kó-“†rý߯¦GHƒ×~ú,‹‹ÒU_ðÖW«È/¯¤Æ  £ûoqo?¯õ*×Íà®dùË÷³Q礶Ύ&a$wd˜Q€™3eËYÀ:Í9Ü}~! ³ ‰¦ßZ´uÏ|֌摾шï?”ð…ë)°¸Ó†Ðeø@Tg5‡r‹Qµ”í.Æ1*o/”ÕDàW·‹M;KIèœLÇÀ(¤øóqÛùùË%ü €†´¬T^‚&+‹L‰|e¨@zÇX¢×—’ëhzŒEãǘÑ$>½ Jˆ£{M.Kªã¹2ÀÂÂ<-Ãzø:Hm>à §º€N¡©T;ꘙ·€ÏwÏåµ-ßÝ®Sh*{« šŸ°«ˆíºsymä3Ìý7¢r?äµ+àªéÀ߇½ÊšKŸä:×\žË-Æ Ô•L㕒μyñ»,s3ã#Ãp•6ýÌàØÉËK§ãhÿ¿\ú*o'äòü†ÍT:vðâÒ©$þ¹—½ÂëiÁÔ8Û>Æí,ß΢5¤õˆ?‰¨ìv¦¼ü ¥}îåµßàþaž£²†Ô˸ãÒdt!¸öö¿ÒÝl$cüß¹q@8Zµ†ßLeϨQI f¸¨È=ˆ 1™Qè?bÒÃ"v²ƒÆLr‡8üP6*` Ưшk$óÚG¹&ÙŸÎ÷½Ëû÷vÅϲƒ/_üšŠ÷ðêo0i„^ü”5‡3u[™þ[·½ð:ÿl,¬»øò…Éèr Ï}ø/MB»0/MË–êÆO¿Æ 7D³öýg™iË#/½Æ?Î)áÇ©Û8ºÚFK¶ €w=Á5É~t¼û >|óÞßOÌК†³$—õóç±Ç úvÝ‰Õ«Ôæn¤ÐWNçá›oeâõ7òèç¿QéÖÑ©ñZ?Òû !;ÔsD ÑaM3ÐEt¢[$T/ú~Zȯ[ëè9„?pW®æ½ÿNfÙ~û÷"ºx“_ú†½ g“¸JXöå\JM}¸zL<ì¿ÁIÚ±mjòÐnšÖl4ãé°èmÒû˜ðøeº.ý„nK_!©§lû)|à lcî£Óìwèøx @E™Zÿ·§æ¢Üö¼CÆør ÿ»» ðK'aòÄGÅóÅût[ú ]Ž{1]߯úöA8f|FAÕh2~NUÿ­¿€õ•—ßûOS¨H½œ˜¬Ã"¾òâ+Mw•/ÏÀ}ãSt™õ&'C·qV[•Ï' Šm•UƒHyç ²>¼×—_QY¦úþ›Ï:;±¼(Ich?㿤ßÑ ã±×z~1„þuþþõ§»®]+©²$«Eªû÷³` ­¾Ë!jÑ>A‰èÌKÕ‡`Š´cË©BuÛpÖ–Qñô?ØxεüvÁ¿É›]Ô¼»§ÎRvWdrݳòÞ“¡Ì}‡ÿíÒÓqxËÖSê°“·r7AýºyLÂf³Q°dƒž´¸DÚ·ëHLB™™ ìœM—ä\NH‹edÏž >g0Ù½úÒ©Ï`’3Ð+FtØPQvçb³Ùš“sÏ 0'GCˆìðåü|ì+y÷éOY²§šðŒ4LE[™ýæ3|µÓz´ªKË*wÁP—3—·_šJAdâµòMaÖ~¸JY? %!èÖ!GÑzþ÷ÎL8¡nódÞ›³“š„~ ˆ£ å˜Û‚ÖÜåls€’1ޱ‚êOžôa¤¥£¥™ã'ÀqÆLpa×eqå£oðÉOs¡c“ÿ~WÓS›ï´¢oõÈ|œcÒqòÒЉŽÓ–],ÌËâ¦'^âÕ¦tæT¶Ô¶,Ï=µ;øò¥pþo~ð&“zçðù›iœŒ÷²¨ÕëøäÓítºëEÞzïYþ–IŸ¿¿ÈL'X¯â(M0ýïy×ßx‡ß{™‡âÓ§¿bÏ ¶Ê2A „úÆUÛ¹±U”Qµÿ'ž{d“&Mâ¡§¾á êÆul“ºkØ1ã5þõ¯×™º"‡jEÁítû tè“Ærÿ Ùœúw?ô?l©ô9#Aàè+ïìĨºÄí–e‡ösÛû+¹ôÝ•\öù^ö¢zîS Á Sü‚¹,ÙάÝ6,•¥¬ÒF04äÄ/ûÛ<` Q4ùyí«9Ä>ãÞ•oòÆÖi<ßçVúGe ¢¢iI¼VÉÄtBÐøe3.ÊÍêüCØ”PÎiw=L.TáöÓRPZ‚ ÐÂ1Ûw±¸¤§1™¾!è=|f-›Ç/ú1Ü™Q1Ò.i1åëÙR¼€ùÊ9LêE¤ÖDbTW2Új®‘»’¥Ïÿ‰·ÜÀuw=Ë,¥Ã2Í'ѶíÏÍ`&\Ô‘Pƒ‰¨¬n$y¸£¥1EgMh&2£PÔ@R³:iÄ™7‹)+ê0ü+Ãc5 M7ö:; Ã¨× :?àÆVçø};µŽ3¾g iÃûå-D{˜u÷VisŰTÌzϹ‚Q˜½½¶>Mm/HŒ¡i­XwÏf…:˜¿ßP½ŽàvÝi¨9~šúXΞM°Vƒ9%‹¨€4†LÄO1›‹RZHí‘_jK¶m.û¦<öO^úv Ö€\wã@µn,åõ§Zåyþ pƒcìŸó13÷kHu1=âtÕ ˆòq$5$3f|wüÔ|–~õ9‹ËÃè=°=fÅMùº™¬µ@ìew1ñšë¸á‚([Çš‚ßo±: óó.7æ^#É2+€±eû‡&íÖªmÒBjÁz**2‰¾$ ¢ ë>š¨˜Ý”ï°‚1…„io“~^ z ]ÓÑTâ<É7¥*f5šèÛúbôS82½Øg^ލÞJÁ'"n£·Ï4-?–_–Qµ» 5¼ O\Œÿ±É­T¾ã2D|~: (‘©˜jpT»|þíxuvÂyiµp%y“~ÅxÛ‚C”èN™·Q85—ˆõ—™”åÙÁæBµ[pëŒ(³ØÖó:ö®´¢1ép×:AcÆ`w‚ÿz½OLJ’©zâ%Šr›1Í]Ëà‹’¨Ç”4˜‹:»Øºþ†#èP±” ¥.pä³v»‰ÞÝ#<&át:)Ú¾Uuã`&:<šÙ]HMk9À›Ã‚³ª{]¦#‘á!ÄFFaöÓ㮫EµÚp8옜 Öâ<™·“D]Ä¿_|ŽÿÜÑPš[Jñº™¬³‚¿{xüÑÇxì†ö(”òëÏ»8úˈ¿’ç^þyÿ\ÛÏ(%§Ä†âß‘kŸ{›ƒû‘®ma­·ÃŽ ÐÂé0úNž}æÿèèß°¯¨X++qþQáø)vv|&L`„ ÜññNŠš1~Ö;Θ© ¥ëÈAd†¹(Ú_„¤¥tWñï—ylóBª}Œ£'ìxyièDÇi}ƒGu!\§`ˆÎ"ASFaMËnÄXwÏemÀy\Þ?ƒb$aไç¬%¿aF}”ÅU‘Ë!C{:ÇQôQtÌ2p0§Æ÷ñI´Œ¢ &ýœsI±î`O• EÑ¢àÂqäJÝíûb@ˆ¶¶˜jŸÇ|ÅÇvŒ!!˜ÏçÁ§ŸåÙgŸåÙç^âµg¯#ó˜cŸ=÷{>ø5Œ¿þãanÿÛÅ ngnÆE“Žð®sÛã/ðïq~,zïKvþŸì'D1…qsóçV0™„D%ñÖM}ùî–¾|wKæÞœI÷ÃoYöý{Ñ’Ý-ŒÊí¥lË)ÃAâq®»|ióGÒãXP°¨ŸEðRŸÛ˜´ú=žë3‘A1]Žn·¡t7í‚Zúß &ƒ›ÍŠ[­aíöøï¾j’£²ˆW5¸¯Ül ¹”wúÌä¥MÿføúvLèq=7EûÙµŒµ”QV1ƒ›žwxppR­t¢ÖRŠÝØ‘¨S±(ª&˜¼ÀÄ~¨ÎJöÌŸWžü‚»Ÿù?Ò[œ˜Š­¢GPöq¢²°ë“ûxrQ5ð1÷ßuøÃ''aì ºLÿ™B4ÄÙVóýŒÝTνs˜±&‚f#àÀjs: Åä¯?|Šî¢|ÕǼ6¯/åú¡Q^§tɳµ¼ GPwBŽäYL|›•%uõwß4FÌW’Q±”•âéJ˜¾ñçÇM³!­mƒä­ ^V%mɶ¾èã}óDRv­æçkyï?Ÿþô5DùÕg8õòë?,Œ*Ój~}o»ò-¨-X¿Ä‘7ƒÞYOèE“¸!n_~<›…/¿Lâ ‘YX@Á´Ç¸}Ú‘o˜©::ÅEÉú•¢¥s„žíÒ¸ÝÚ°MšA­­ÀUµœ‹n:¼¦‡ŠZ§b*·ª`™ñyÿۂéE±•âP‡žàžP@‰ÍÀï˜i½>ó‚ p`ýúKª»_E|jóVXó™¦Bðãà|wnü«>ð›o a|J£:ö¨t9»Æ¿EM ‹$âgHìlôY¾ãRth GWMýÁPõý7µî8uæ+/¾Êpî‹ÙwËç8.ŸDú¸¨ú1Î/•ØçƳﱧÙôÓÈQ„¶7c Ô£ýÑ8m¨þY„^q.ºh n‹Y~±Äüç¶£ikŽ%¦Ý½¯¯"&¥%‹jð1b¯²¢ú·çÜìj¾ÞPÆì lÖõäV/<·ÛͦƒûH%”¤à0´n v»•ªš2vZƒ:EÁ`4aw«äᨬ!<4—ÃAMe v§{n!еî„ß”€)Œ@‚ÖdÆXœNjU’ŽAÑ ‹ÃÌ.ªKK±Ù•Î :¿úß…Ö`@ƒ±þÿn—ŠÛ–Ç/ï¾ÄçëJQÌ¡˜œ¬N0w½†¿Ì¿þÄÛÿú‰/º\ÍwžGŠß‘~£` ôG Ô•”aUÛ˜Þ›^…Y»µpSãkülöz€»†í3Þç³eÕÄtìH¾îjis u¾ÆÑÌìÿ„óÒÀ‰ŽÓЦþ1£-ð©b-/¥jß6žypný9›ê NéÒøŽ±²hóHS'³f_iIŬßh!þ²P´¨Tû¨WþŸ½ûŽŽ¢j8ü›ÙšÞRH#:¡WéÒ¤ªØQéEì¢ *RD¨ˆ€¨ˆET”&½÷ iBÚ&›Í–ï‚$›ª|ïsç°;sï¼÷n¶ÜwîÜ¡„iÁ¢t¶Ž®þƒ£Ú*Üá¡Õ›`Ãi¶îM§YýB6û+ E%%6´Š«\"šû?nlÉ ¦®$¯ýƒ¹v‚ÿUÂÙ~ÆèÄ™fóåšš<Öº2S"ÇMþT 2àåéGOc®‚µ ›B‡`ÇœºåëOQPRÃÎÅg'ïàï¬1Õ£}ý@<üý0pJÖÚ—A¡rhÚnÞÏÇ*1©r·`Æ.o^®çޱÀÄ>³‘Ú¾*~.’\@~”ºR>2]‚‚ie>À'»šuuåJ–𽿠ƒn•›1çÐR–'o¥cHCZÕæ¯®3Ъÿ Oä¦òËÉ Li<ØIMN8Ì$ä˜ðôÀvæÆ÷áµN£h¨³`‹3Îí¨%8¸'ow!ñä<Þ¸]‡Òä¢çÛÀoï&|Ô±3•/øÒËKyå4Yvº‚,ÍåR´^Ä´îDÔâ¯8’m#ÆõlVÖê”rdetîhL§Éµ¯“„Gå#¹'q:ËB摪;˜ýEÝGßK£;»ÎÏ­LÞòÉç dlcÕîtnR’HÞ›‚¥a‰Ò€@b+é;¹{1õý äëðȘžD”ùW«`ôñA—“D¶¼u€5›¤o×2²¼ o/´Ù‰œ9WöŠë¼Jœ¡Š28šª'²~K"êUG»{+óNlcsÊýÜ;ñœ>‚¹­7æ3 Á袽Œs¦6ÎìÛD‚öqÕˆ­VÇNmgìâãlK²Ò0ÈÈÀ«å£ º- øÃA1~öÅrprw àKx€á*«½±¯‰âá‹Ö§1‘?>‡ÛÅÛÇsü­øÏB`5ö³÷ÅòÖìÀa?wÖÄ‚Írñ;TÑhø÷ aœÅ@úV’¾7ôq-´åìü²êT|ªáÿüóø?g¡hÛ/zi&S)ªŒ¯Ÿ†D}óÞÙ*Š÷Åoè’ÚWÌy¿\®2ûÌY,e´¡4ŽÓIòŽÇ&Ó+ä‚Åc4±‰þæŽâ‡y»9ÞÏÊz}ºœX ÷Pé¹`9Irªc´;J^2¹» qi…V`Çaw ê/ó¯ßQHz’ ·žh0R¥]òíà¸}'ö¸‡ *å%UU•:þaœÌLáHüq"¬ de’•Iåˆh<ݼ(4[°Û|=ü8žy†cÉÇÉÈÎÂCo   tz4E+ù¡ªWó]«âvös)ëdG%Ì)Éä??ŒjzYœå {˾ؖ—qLêoä§ç¬S´/ IDATƱôüýáýhøð$ݹesßå›]_³hwkžküϬ>cxc¢•Ý>°˜_Öå®Ö1"ªx …BTÜ}~¦ýGY,ǿ㣕¾ ™4†ê®vRÞªå5ëÜkî…›³ÏQÅÉo'Ÿ%—ËU¦”;æâï÷ð¦Œ}õŽRg.:k‹âE«z*Ÿ}:™=Šž †ƒy¸nñkïìûI”ƒ-›õ¯b“èðŽnBß1wQÕÅ=c™6ÿy†Ííô¥É‘Õ—Ö¡¦nT.ó>]OëçZ0ð±£Ìšÿ"ÃçyP¥MG…\ú9 x5*u?ŵ:ÆôbáÜ7yü3ÏšöJd%ª÷hÇ»¯2üÏXî{7ÝÂßgúÈÕ¸F·¢G«j¸,¡Ä×èn©¿¾Îåa7†ÑlÀ°Kf.áŒbô汦Fî[™Ä±‡#y²_$ÓÝÅí¿[Ѹ»Ó¹MMjøhØ<ïï·Ñv»7Ï(e5=­Ýclܿןa~WöÝ|Í¡nw £_ÚZ>búñš¼U£å${-ÔöiNÝÂÏùðd+&Uvãèñ?ØTè âjwÚ¿Ùr8²ò7Žèbèî©Õ‡Ã)6ïI£EÃB6~½”x'YÙ";¸D6§JÎ~XC›»‘´zûJÊÊãîPñ­Q—j¾;À#†š5ª¨ƒŽ¯}FdzûÅ/âÙqKÉmüˆ3k¿bY^]Ww+s°êR¥#q–wùâ׆Œê…ýÄföÐâ ê¼*cqûÈ)ÌuCÑjôç'—LãåNX­&Aö$öœô‘Äúë0¸ÞN‡àÕü¸n&o9ªS°% ôq´Ž¾ôÔ•#w7ß|ö'‰§a¬¾eÖÌ´ºçêTŽÀ“¬™û žÍ=9¾â4F­ #>‘]ˆ[ø;þþš,õ !4¯î<^㟰’ÏØ7ܯ^ÆìJ^ç+¥Tª—÷/œZ–Š[ŸJ(é»H™± ÷§îÅÝt›!cˆ¬™ä,Þ‡ÕRó‚³5sbÄh±ç䃇ªÆ ½K.ɈÑbÝ±Ž¼l{™'ÅâékÁ´àkÌí†RRß—‹³:ÝI}ö;4 Z.& ƒÛF”ó#àRêTUÖÿ2sÕì—Š÷Y_ŽiƒõéÏ‚¹Ï8ªõ¹8¡UOÒ€iX†¾Jd{¦Ï‘W¹¡!jãý©_Ãã‘ì«$Ã\ŸÈFùÇI»Ã+¯P¹Ö K8_™ÀzåX-ËšÁ®M‡iuGE{¾çë£A´{(- lCœi6‹WªÔBisR´Z-QUHÝšB–ÕŠ[Á lŒ®^‰Ç×Ë›hÅÅ\Àæ'P\ÝIwñáhZ5|}pQµdžNÇ?·kã\µWóg…‚wý;¨ÿå,¶o˜ÁË™áXÅ·ÝQ#%ýz/™ãì€3cÛÌ>‘ÂÖóc kßaÜç™Tk\ }N`ÀÓõâd¬êÛœûz,ã埒X:i8«+…➟ÄiÀKÕà]¿ôÏOÕÕ7€ø_ùi V/=N»9󹳚)[ùýïTŠ/Ø¡”×ÜÝËÉç¨ÞÉo'ßIeÆr-]F̺*h`šÅ«j1¤m8ÓIŽåüÏb¸NÛbÚÇÒÝaÜûêpêýëvÏξŸDÙúL›KŸR·j j7šéí.xªI“³ÿ©Éð·_;ûoš~—fçöip//6¸÷‚B=J¨[ƒ“ýŒamxä¥6<òïˆbû1nf¿žý&/ØÞáÜcéñ |±KˆHˆÒ Ôü‚G ¡ °²áÙ‡ÁŒ0˜ñÿ*£«żǣÎ?î7¢¤‰ F£ŽÐ˜@®ôîØ×c]ë£fD#&49Ê3[^ ÅfêVéD'Ï4çqV”-›¿' eÃÙ¬¬O•fÜõÔª¢éÖ»S>yšA_V¡ËÃýivxå¥u胩W%‡9sÿ¦í‹­xlÈÞûä9Íñ ¦]gš„–»-´|~¾zв2±¸×£›>æÄË5‰Ô±2wGqø™¡lC6övªÌ¹7c(þƒã82iæû¡¯]¯°Ã8.YQ©ü±8’×’´<˜àUJžuQj,¥×‰‚ïž9š› OÜï} ÿs¹•ZgEûº‚ýâ´N'í« Ç©U¾{¦pXmÀËì\¬E{û³ÔxÓ;ó(Üý";gŸ+aÄcê bÚU&ð¹Û8>~ Û_PÐÖëDÄ”vÅw² ¿W&ÿÅwØ3/%¬ASâá ¸6#òå㜘ö$ÛŸ² Vªÿ+£ñ+ûƒWq ¥Já2¦ŒÜNº1šÖަsðÙ¯u}8·Õ·0îï8ú‡–þKÁ`0Ü¡5Ö¿VYP„‹¥ˆÕ ÉäYUlEEdædÓ¢J §Ù›‘IÕJ¡ä¢b§²—j‘#§2ð´ÚQ[7Áh¼º§ÓTŸf }>— ~fó¡chkr{ßÜ]Õˆ’XÞZ¼ÞKŸšï°xß>Žúw¦Wýµ,.¾Z]@mê‡üºU+°iý©ÕýATÿW;#Uú翯Y´tûSÉÕúÓª+÷ô‰Âè]êç§»OCzµ[Æ{%sèH6' CL/z†¿ÅëCVâZ¥5½ZÇâ~ÁÍnJ{Íœ|Ž:ûÍàä;©¬X®)ýåÄü÷?Õ—Ï>žÊðù&4ž‘4¿gQÁÆó?r¶Å%ŠÆ>ðæ°‹«Füc;ðÈÈ»¨ãé¬_…âæU”›ÁœívºôuçJ¿™‡ã².;/î›ìè?ï²Ê$šÒøöø*f'ìêGŸÈÖçï¢PnÖ}<óËBj´{…GÊ5š½q*ÒOBˆ+cÉ•©Ä­G_Úu%²‘úóK¼‘6)cJ½vÑf³‘ϼN=8fÉ!<*Œm§Oá¡Ó‘žÍéÂBô-UÅG££N/zw=9+Í#BIN<›¢¥®Í“ª ?$("ææþ^âB…‡?câ‘<ñÄmøiØLÇY2q2{zÍàÅfÿ··OLNN&  Ä‹ö…75;ñ¶1`MÍÛÖáÕÆî\霨ë2Ãàœ0·ÆÔîWöŽåä¨Ð]\…Bˆ[™kÆV~Xa£ù“‘N:Òh4xøùÑfÔ(=ù;mO/šGEÐÜ¿]GÑè4¸itTòò¤JL»2ÏdÊaÅãÔtu!ÂÇ;ïÁÝßO’â?Æ9-‘¬¢°³‹$*8 N“bö£Ú—4!ćJD³F¬kVöžåu]B!„¸–¬$/y‰¾5Q÷ž'èVö×¼‡‡ÕïíÃÓL}ñyV%&[9„–x{ú°ãD"v­J¥¨@tž®dœÊdkÒ)Zùzîçƒ_ã–xõ醻»¬/þk<ÞOŸÝs˜üÄbTƒÕLãûŸ¢wÄ^ô+„·ˆ ' …¶" šðª­É=_+{¿¬Ðf¹1ý#Äÿ»‹îÉ'Ä- äÛN”@KHÉÌ/i°R¨ªŠö®-åù…ï¼Ææc'¨Y)»üC|pÑpu÷¦H§åTA!Áz- }lÖ‚¨âëë{•ï Äõ¡*Ó~È+´¿Ñ!ÄMªÂßîÕ¼*³ùôþ«Ë-gãéýT÷¾æ÷PBü‹*Ó¢Å-æZÿMët:üüý¨Òº6s¾ú/?VOÀ¡sÁÛÝE¯#­ÐÂo{p"ù4«W¥ñˆ1Ô4œÀÐP´WõîB!„¸YTxÑÃõ§ö0~Ó'¼ØàZ×E¯Ê…s,v+kSv2yÛçLj2ˆ¦A5otHBüq8°š-ØmÖòÜú\ˆ›—ªF‹Ö¨¿ŒYg·ÛÉÍÍ%/7—µË—“¸giÇŸ˜€W@% AtnÓšÚ-[áå‡Ì,â$‹ !ΩpÂ`ãé}|°w1{2aµ;¿EÞÿª¥¶oÃjõ¦I`ŽBqYl6bµZ±Ûí¨ªŠV«Å`0àââ"  q “„âœ+J!„B!n-’0Bœ#ó…B!„Bq I!„B!„â’0B!„B!Ä%$a „B!„BˆKHÂ@!„B!„—„B!„â–à0æç9óù3¹èF‡rã™÷1ëñ±üh½Ñ‘ˆÿ0í@!„BqkÙ¸`&[r‹ÿ¯u $ªN3ZÖ¯ŒÛU?]YDâ²…l‹½‡ž‘c0µ›5Åàs †9Eilþv._­:D¦ÕÈVw3ä¾é®þ¡„¸YÈ !„B!ÄÕ¥ºQ­×`F Ì}k ìý…ï×¥`¹ê²c1[qœ{¨q'²v ‚]”«~$[ö!öÛš1ê­ùxú ¢÷~Îü-Yÿû¦£ ^ýnÿgd†B!„âÚPt¸צ]×<ý°‘õ駱z˜ï>ßE­{ûRÝMÁaÚÇ· ÑèÁ^D)‰üöåVByr`S<Ú†}èU[KÊ®õlØq„T“ ×ÐFt¾£1!†BN,]ȯ‰fHšÏG.atêW—Cß®% ÷]4ôÖP”±—ÕnâHšƒ Ú¶¡N Å’Èo 7Ø(Ä=ÇH˶á×°]¢Ë?Ä/‹ÖãÒyíCõ盢ñoɃ÷Ÿ{Cƒ({Só°áýϠʚƺOßcÑæSêü©×s(v Ñ´ŠÏ>ù‰í)*·æ¡wç­bI^Ç—ó³ñh&ö€8ú D§p…‰«ùbÞlŽ7áÖ€n?@‡HWó>f½ø#Q=¢ØûçVN[ ë6šÑÝ£0* N,gÞÇß³%ÅA¥¸ú¸Ø ¨Ô¸*c„‚(ƒ$ „B!„×”Ö;Špý~ⳬTó-cgK"[ãÛÑûvxk»‰"M(Íú´"ØÅÄ®¿gíþêô‹ó$òŽþ´þfÇš>È‘°$rè|=Iüýóòë÷ä¡Þž˜­à§_VãuO'"T (•ý™õ¹³+Œ™øòÇM$ÕîN”Æ ¿  Œ.¥LÆvXÉ>²’ߎxÓ¸kàE*óáïøæpƼý E <ãƒÖ|ˆ/ÞY‚­÷s¼ÝÜ›ÓËÞâÝE{©ú ?ÌXHÒm£™üL”„½¤ûè¡à_¿ýÙ]žäÍçÉZÿ o¾ó9QW ˜°:ñžyénÜ“¾gü‹Ùßn qšƒ|õî÷d¶Í[]#)Úÿ#oí±——N’¢ä’!„B!ĵ¥èqÕY1•c¿êAlãjÅÉÕÈ:Õ u³““‘ÃE%75‡²–ò³¤îâ¨Rƒf50j øÅ6§Ž>ž]Éæâ´>T¯Ž»´^!ø*¹dÚÁJ³n]ˆó-áÜjáa>}f0OLùž‚6Ò%BÑf›?Æü#ì>”Í=‚šáîXŽ®`»[gú6 B¯mÞ¿Û9~ð69Z1 K,Þ:-^UêQÅCÅ|t9[ÔVôm‰»Î•°ýè຋å‡LÅ—?è‚iÕ±6¾Z}`,¡j&©&;…Çÿb›ÚŠ{»ÖÀ[ïB@l]*ŸMz”— EyÈ !„B!ĵå(ÄdÑáª/ÇimU‡áÂÓß3É[W°ú¯°0¼PpØìe«É„Í5 WÍÙ§4®øºÚ9’káÒÒ*ìŽ2†ª<ôæîNÛDz9ï3]}†±=BΪtá½xúÑ_øê»WóE |Û²2ÉIXÊ´VÒE(µÉÏȤȻ.>-šè 0ë Ežqx«TëI¨§Íé—Æ­¨hUv‡ƒÂìLŠÝF?H]w̥ǭx5bàcG™5ÿE†Ïó J›Ž4 I/5®X™] ÊAq8ʺPG!„Bñÿ"99™€€€†â& ‹c !„B!„â’0B!„B!Ä%$a „B!„BˆKHÂ@!„B!„—„B!„B!.! !„B!„B\BB!„B!„¸„$ „B!„Bq I!„B!„â’0B!„B!Ä%$a „B!„BˆKHÂ@!„B!„—„B!„âšs˜óóœùü™\teûYùmÞ—lͲU<K"¿Íýœ¬Ã¼YcƱ4ÕZñn0GöFfŒz’yÍ7:qÓV´`FFÛ·ï <¼2îîîW3&!„B!DäååŸ@ƒú ðóó½aql\0“-¹>H›û»P»YS >· Š1¸\ûÝzÌìÿp¿4{•§â\¯ùÑ·ªtèÛ—ýÔr}c×_…ß…;vì`÷îÝŒ=šüü‚«“B!„¢\]]:x0Š¢Ð±C‡ˆêFµ^÷Ñ)Twñó^5Ê.«q'²v9öC©PhçŠ*WPüªÄp ¹ìW±F§´¾ÔmÛê +¹Î1‹ë®Â ƒÈÈHFŒ’dB!„7‹üü>šý1K~Z|£C¹”%‘ß¾XC@ï»hèšÂo 7Ø(Ä=ÇH˶á×°]¢¿p?WþÂÚ#ÙX5D4¾5&nâǶ‘˜o$´i÷â²@QÆ^V­ØÌñ3tþ5iÛ¥‘n*–´üùÇFŽžqà…Þ¦à 8òñË¢õ¸t@ûРζÛr8°ü¾[¶‰£YVW¯ã¸É‹ê]cX¯šx¨̉«ùbÞlŽ7áÖ€n?@‡HWÈÝÀ”ç–ÓfÊ‹´ôR°g­æµ6ÐóÍá0çEÞߟž`¨G-¿6ŠîJùb9ǼY/.&¢k8{þÜJü#õîFÛ¼ŸùjÅ>’­ô3Š®Fó>f=¿ˆç_¦›÷!f½ø#Q=¢ØûçVN[ ë6šÑÝ£0ä]^Ì5³VñÙ'?±=¥CåÖ<4â.â¼5åìW™[ñÑ×[HÉÊ&Ï  %î‰w]ÇXj¿^Í´¸X…×0pqq‘dB!„7S~>®®ÿéáE©ìÏ ¥}ÿy¨O rwl"é_—Ó¥l`]JÝ û:Q;Ô½øŒ§õ ã4¹k»EµýlYK2ë–nÆV¯7¤GôiV¯MÀ\˜Äß?o$/¦+‡ ¤G-W,ÖâóâŠÆ ¿  |]þ=4²cÑV§ßØ|üÁ«ÜQ´œ…§s~Õk&G³ªñàk2sBW”søö°GÁ!¾~û;²›æÍfðT{ ?¿ó9»óN:ø/q¸‘£fðáÛ£ÿI”'– ™±ît]†¾:)±}ît–é{òì´é<×"_$¿ÄrGXXG^šÆ›c[‘±l1ûM—s}Í!¾~g ¶NÏñöoóTÃ,\´—‹«)½-ŽÜ|öùAjŽ˜Ê;3'1 ª?F¾ÎÐZ.ìWq¥dÑC!„B!ÄÕe7qhñlfΜÉÌ™3ùbcÆ¥ƒ[­Õë†ã®­W¾J.Y…OnWŒè SˆOÎÅî@˜¿±øl²Ö—º-ëì¦Ã5$†€³e-©»8f¬Oóª^h~±µñH;Áé”=S«s[ƒ0\µzŸ­âê­§(§€‚¬3yÆáun¤¥õ$ÔÓÎæôìU/ãøŽå-š &*(-*ö²×PT´ªã’×Ã9…Y™ä$,eÚ +ŠÏL;Š(Pê`»°'mÑøÆåXȶ„|¢*§³cw!wz£ÁAž“~Y„ÿZ‘„B!„â&¥Á#²1]"ë“sø/¾ÿc-!÷Ô,e_­›.þ1ôê‡çs© O,E5gS`·rŽ€,'3gµ/½2ŠXW;§~ÙÊš#¥ìì($#9×X/\½½Ñå$“co`Í!)GÅÛßUÑ `£Èæ°_0èwr!þeÅr•)åŽYÁàí{åÆ<ûRgJIÎ8k‹âI‹º* ?ŸÆ^EO`ýGy Ž; `pÒ¯âÚ‘K„B!„7!æ¤l?–MZŒžhq~V]T‡HóÖîO§Ðö‚ R³,èªdÞǦÃg(²æsêÀN’ ÎÖT˜ÌÆ¥¿±#ÓzQ]vs6…;æÔí,_êâK¬™ìÙ|„,‹™´?òí±@Z5À=º ¬køfå òŠòIüû–›jÓ¡šŠÞ›`Ãi¶îMÇœw’¿¿ý•„¢³£nÅ€—;¤=ÙjÁ긌X®¥ËˆYÝ8Óo|¹æ$ùv°å&r$Õ|Ñkæ´-¦ü¶'”»ŸžÀË^`xÏšxœ±ô«¸vd†B!„⦤è4œÙðóþ0ãÐùR­UB´9ì-­€!ŒÛº7aÍŠŸ˜»ÒŒê@Õæ ˆ­Bû©üö×BfÿéB¥Úu©â›€Ã–GZj*®ùvð½ ª*=éþÓG®Æ5º=ZUÃíà±Cˆ¶üÁ´'v’aˆ¢ÕÃ#èTI‹Buîy¢_Ì{—§™p©\Ÿn£¤®»DqGÏX¦Ížá_Gsû}irdõ٠ݨޣ=ï¾Êð?c¹ÿå§iö4}Y±\Súˉù)ŒéŹoòøg&bǰï IDAT4ž4í?”ÈJÆóO§mq‰¤¡ÏlÞýhñcÕˆ_µv<4´/µ=õ«¸V‡ã².L9/99™f-®ô¾B!„Bˆ«múµ„„„T¨lrr2W9"!ÊVxd!S~Ž`ô¨–øjØL'X:eûzNã¹&rûÄ@.IB!„Bqƒ90§'‘]d=»H¢‚ÜFªÙ—ª•Œ’,¸Aä’!„B!„7˜‚gýܹg¯?ûª^‡j¦Ñ½cè®+»¸¸&nÙªG¦~ú"\ot$ˆÅµ!ã?~–¸k°àçå÷‹ŽˆÞÏñúŒ™,üô êËY̵!ã?¼Œý/Ãõ{m+Øö³n¦¿AQ Õ›&#§ñb—àeOµµÉ›Ídæ»ÓyóÅ^Dܰ琢Ţ£èûÚÖv»u?è…BqKQ a´}lkR­€Ð0²O,®v ŽÔ¿˜ýîböå7@ÜšGFõ¦Ž;8 ãYúÞ‡,K0—}ÿäRb)«Ïæã,ùx Çô£êØ4Wh¹!„Bñìº\’`ËXÅOÎáP¡‚!²/SÆ  ÆÆìR2þ­Öü8f»ÌàÖt3Ú/áñ);)ðhÊø©í‰ß”އá6ÖÎx—% …àlFj>6–Gjù”ÊŒÇ&±%ÿl ÎÊ)F¢{ŽfTG_ò2R9tȇ–•¿ç‰×wRPjï…ÒoÊHo绤sà =1'óàÉɼ¼<Ÿê¥ÅbŒåá cè­§Þ”˜‹ÒXùÞ ~NØDŽWîíÆ’gdz1»¾Æk÷×dË›»°ÜÆþž,ÿ+3\©ûèD†õÛÅÓóŽP¨©ÄíûRøù8Fï+ÀÙ”FîFTÌØœ¼œÅ’UŽ>³œ\Á’ô‰ôm°˜Éë²/¯„B!Äÿ½ë¼†‚ÁÓ]aeì²YQ¼BP׿ÅÌCV*uŸÈøîQü>ë…ζafßœ <íÇsïv+wEÞM¸¿«ÊwÏ¿ÀÚÚ“û›…úݗÑ;B!„B\§„Æï6žœ^Õà GÂZ¾ys!G 2®ívädzãdñH,7-]Ãùkqm«HZ¿hüsr<×¶3ìXs’¦eÕf!íx~aþTŽÀ€vEü”ø¡^Ù>]Ö™ô2â4eí¾ìÀ™„t1Æ2ÛW±6\{§‹¢¹çù¨î‘nºéP;à(H`ã\ì@æ¾½äuŠÆW³™\'ô!q„ålg_Vñ°'cí,&¯½Ò@md'ea1›ÈÏ1‘c±oÓcT(iüuÃØ)*°b>ú++Ë›,8«"ï]p]ªTªÅ€±¯Ò@ë æ ¼UȱW<–+b¬BÏ>^üõÆNrËÊ\!gî)d–•¼€Ã´‡…_·åå©oÑ!CC€v¼PÓqÚ÷6ýÅï§ TkR ocz4îþø†aûè^þÈBð/0~XSŽLþ›3e¼Êä´ÏìäŸJÃîë_î6 !„BqÎuº$a o=ý)wLàùè½lÏ/ñ‡°ª*ß.ÃnÃ^ÚoygÛœ)¥œ¢((ç‡EåªÜJÆñ \›W¥‘çi¾ÿIOã¸*¸¨Il4]áhÇn=gy›Y±6Tœ>º£º+|òÜkìÈ5÷ì ú\´‡ë…!8þy ‹èËøç;RI –ß1qêrN¼Wì¦)¥×yA_8ìç{¨¤£\ò7x 8o»ü̼2óWç½âÀ’´Œã–\âËËÕ£à^»2–1îÔM•É9OÒ•'zç1{ôvæ€oóѼòx;ŽM\Azæß|øi$Þ™BÇ‚SØ{’Ìì òì`/4‘Ÿu˜íÇó°; uûV²:Çà§ýSxYï#gnþ>B!„ÿ]×oñlG'™ÃÊJ÷ñH3ŸâÛ-˜ðÀË FBkݰ0‹2OpÆ#†04>Ôm޾å,§OPTµ5 MÙ¾}'úv·˜u˜ÓåYwÍnásÅx•^…ж¡¢±h\|ÐçÆ“”oGõ¬IËhTõŸ —pêGQPñ®^·ÔcdžÓÅÇKÆ1xÐ0FNúgÀlIÞI’W}jû¨€ŠßmcxmXîåÅ—V§óv_Áß`_¿ëgiq$ïä¤Osš„ê:}y¨cÈ5Ï"ê#{0ä±çëû‡‘¨ÛbÈ\€œòm¥—«[Î)òŒÁø”ûM7?<ÈÇd±ÌyfT7  õ%ÊýŸŒ}šgÆ}À6ÎlØK–l{Øm©A«ªn¨hð©QÏ´£¤[Ë~9ç¼Ï@Å5(53½üB!„â¬ë»†AaZÇägÒüÀÛü}æ(¿®V2ö%g–NêáÕ…÷äÉaÍñÕºæéCø+Sèo>Â—Óæ²ÃÉÀÌ~f_®j͈ɓèv*‰ýÇR0‡”}†Þšqœl¿î(_&ïŒ ;y„ˆ¤dòíeÄ’ëÀž½—¿÷äñwfcâÄ’·™¹*½Âgtµ¡¢±hcîâ™AõñиSÙÛ“Á§`*8À¼ÉŸrð诬´ çÙqµHN=ÄúŸöñpŸiwp&+r58òÒQ[cܽ•rOáÛ7w:]¿ ¸ ë™ýEUF¼0•ÎVÐä‡÷÷ç(» RXúß ÁIÛ˜)µÏÔëgEÙ³73gN,£žxfÐÛŽòÓ{i”±Ô¥SçWî×éð öG}v*rð夨|vD«õ¯Kë–Y¬ù|ÉLãId%;É¿•<©¤rå9^iùGÙxzÍ¢]Ù²+¿\3y ýȧۆ1lÒ$ \´ü9w)V@5‘í݆§Þèbw·o1³~O-~?[âùþý 6…wõÈÛÇ¢w6eÅÙû(¥ŒW£Œ>Cõ Fs_þJ(Gë„B!„¸˜âp8*4‚INN¦Y‹VW;žG1R¯ÞñÛØwF%¼ßD×Îâ¹E W4€º®n…6qݨxÔÊÄ;3y✾gôë"ú0qŒóä¶ŠBñgúµ„„„T¨lrr2W9"!ÄÑu¾KÂMÌaÅæÕ€^¹M!èLÛY0#ñ¿5оÚ Äuc'wçB¶|Ç:îfÚ²Ô[ê½¢#é9¨1?yÃ’,B!„ 3 „B!„¸ÅÈ !ÄÕpý=B!„B!Ć\’ „B!„¸ª6.˜É–ÜsôxV®E«͈r»‰ÏWZŽñõ¬Ý´ÙÃÊ™üZy0ÆêÈÞÿ?/ûƒ•ûñöSĹ80^‡þ̾l#mdä½ðÕÜèFquÝÄïX!„B!Ä’êFµ^ƒ1bÃõ£™ëAVüu‚‚—ŽÂ NiÃðÖ‘ža~Å7±v`$(ª2̇ùö£•x ˜ÊÞÑÏ™·)ëÆ.Ä5$3 „B!„׌¢÷!"¶êš LV~Y¸‹Z÷ö¥º›‚ôo¢Ñƒ½ˆRùmá&’¸çiÙ6üv£k£@ô'Û€¢Œ½¬Z±™ãg,èükÒ¶K "uÉüöåVByr`S<Ú†}è“ʲEëqé<€ö¡úó1ZŽ~Å´™q<ß•WŸW0¥ç¢;ò1O¦qV´*âï?¶ý³âzöÛðDœ/z­m;³bÍAhÞôô°׎$ „B!„׌ՔÊþÉ(µqSʘcP”ÊþÌúÜÙ¿ÆÌ |ùã&’jw'Ju¶-™uK7ckÚ›Õ\ÉÞ±„¥kn§K"[ãÛÑûvxkÂ\ü‚‚0º\<ÑZ_ånžlæÃ„.ŒjWÈ’™©;¼?Ñú’‚tP–„Ù§^q(¸…b<“HÂ@ÜZnú„êß‘ÉÓ›òí°IlÉ¿AA¸6dü;X2z;.k•ŽˆÞO2¼u8•}0uÈ v™Ë³M!„Bˆÿ0»‰C‹gs-¾U›qGë0 öÃÎËi}¨^7w à‚¯rœ¬B;¸”¾Í’½‹cÆúô­ê…V¿ØÚxì=Ák ¨Ä6®vv`BiÖ-´ÄC[ó²Ñø¹¡±e¥®GàÀf¶¢1hÏ_ß­ê\ÐXM—ÕEBü\ó„¡ú¦?’̤±KH±>ú~¦²0㙯‰/ÇMÏíòÒÕX¯õ`ZãCÃ{‡soOl=nJ Íþ€ï÷çb¯p¥EÄÿð:ÏýÑ„—¦·¼Œmÿ!Æê לUçq¨ðF#„B!n ªÕzÝG'¿$~ÿò/´5«SÉ py‹¨hT°—xøsÛìXMyä§meñ»P6,J8v ê0è”2”ôë fþºLýÆéò9•¡ÿ‘žQCZpIâ@Aë¢Ãn¶ž'Ø-ùXµn—Ó8!þnð -· dTT è'Yúþ'¬>eŒÔ|l,Ôò%8(•]0ÃÀ£)ã§¶'~S:>~„GØX;ã]–$‚b$ºçhFuô%/#•C‡|hYù{žx}§ÓÏ']Xgîo–Êì§&±ß¬âÙð!F¶®ŽçÁÍ/_âF½ûž¡olA.),žö6¿$XŠÛÐü~†ÝY½]‹í0‹ßŸÏšSåȆT´ÏJ9ž& OkȆ‰o±*]Kd¿—x<ð;&|¸»³8µø7½‡¡}jâ®ê1Z±xæ|V&[ŠgW¼ÕšÇÏ€pk:Ží—ðø”cyxÂ:Dë©7¥æ¢4V¾7ƒŸ‹ë¬Ôúa†ßY½tæ|óÞglH/~m댙JϽ_‘Ъ}TL;>ä幑œƒB!Ä-ÄN“87¾Y·ýêã­¨(;Ös9‡ƒ’Òå§ usÃÅ?†^ýãð¼ðJK"»ÊYKèØù‡Ú¤³})ﯭÍð{ªPâ (Â0œ9A¦5W­ƒüS‰úv¼¢–q3º± ](î gÃ/ñË)p¹¦>.¨§r±cfßœ <íÇsïv»¸œÍŠâ‚ºþ-f²R©ûDÆwâ÷Y(ònÂý]U¾{þÖæøÐæùit´”ý1dËK!]Ó‰†q¤lM kë<&oýg»â„ÇöéL˜“OhÿÉ<ß=гRäÝ„Gû»ðóËØ–Þ-žäµG³sêzr*>5¡Tª³ã¥­â£/k1~p;Ž}ãàÆ˜ýÊrìÎËåy5cÈCa¬?ŽUà×j(C:ŰiÁ>œ^b>È‚éß3!’cç\4Ã@õmÉà{XñâXVe(Têú2/?ÇÞ7¶ë°’_Hõ~mÙ>éEO0_á…B!„¸9©x×lNôÎ?ØPÎanøè³9v2‡Ø¨"ެßFºÕóŠŽ ªC¤y9k÷‡Ñ¡¦?:s§ =r-açÂd6.ß…¡yGâ|/ ‘›©àç®Ášœ>î8»C¢>¬õ,3ùiKK­Í_¿"º[µ+j‡7£›0°e°k¯ÇÇ>Gø†­lݰžÕGÊw €#?ž'‹G¨¹iùèêP­_4þ99žkÛv¬9Ia9Ö±g¬fú«yt¼ýNF÷ íà(«¾ZÈoŠãq˜Ž²v_vàLBº#*  ®K•Jµ0öUúh]Á„·Ê5I8?ž¬MŸòiWxel>K_Èþ|G™å,!q„ålg_VqÀkg1yí•Å©®Cð™­çëLß³Sçêè¶k±ST`Å|ôWVJ²@!„âÖf¥qO­ÛMæ] ©ß(”Å}Î쿃¨×¦1)û¯°þ0nëÞ„5+~bîJ3ª[U›w& êÒ]¶<ÒRSqÍ·ƒïlù¤Û<©¬‡¢œlT?·â„y3Ÿy‹­g—'xwä#èk å§Ó{p;>úð†}l$²Ý@F5òº²vqºö ‡  êÙK‡Ã\œ°ç±gÞóŒ¬B i5r*ÝW¾ÆÄŸS(sB¿ÝV|]Ò¿(Š‚r~êÀQÒN%Š9e+?ÏßÊϨ¸VëÏkÏÿCvš€’®:W2{3sæÄ2ê‰×hf½í(?½—†0ÄÜÅ3ƒêã¡q§²·'ƒ'NÁTp€y“?åxXéÛ8¹#„ÓãEÞÉðöÉÌ›°“LÌ^Çøaí9òúrN9)Ç™õÌþ¢*#^˜Jg+è òÃû{Ès…GùuµÊ±ÏÐ(9ƒ´ìt PÏϰgïå¯Ã=yüdç˜8±ämf®JÇ–¹ŽÙ_TcÄ “¸Ý¢bÈßÉ'ïïÆTÎ Zÿº´n™ÅšÏWl½ümÍYQ¾ !„B!„(‘âp”xŸ’2%''Ó¬E««Ï•SŒ„Ô«ƒwü6öQ ï7‘ǵ³xnQBÙ—9!„Bq ذn-!!!*›œœL@@ÀUŽHñ_tƒo«x 8¬Ø¼ðÀ+w£)i; f$J²@!„B!„¸ ·^Â+§V}ÄØU7:!„B!„â¿ëš/z(„B!„BˆÿI!„B!„â’0B!„B!ÄÿØ»ïè*ª<€ãß™WÒC !!@€zéM, ‚‚¢‹¢"",J¥›P %"Dp)‚˪(*¨Di ¡wHB i¤¾¼¼²’Ì Àßçœ=gÃ}÷Îï–gîÜ™¹ŠL!„B!„â*wáK‹¨å»0mVKþ7x*ÛóÊ:šïÚëg jÏ×x¹CUüŽ5(šÝ¦Rds¿—ˆw:ðí«¥üýU\©ûòL^Jbô7ÿkw{¿ !„BÜîl6¹¹¹˜Ífl6[Y‡#Ä?–ªªF<<Ôý3šÝêå£-ɾçǒïÕ’ˆ¨û‰ÛšŠ—¯?!U­lŠžÃªøÐJÕzÆÑ¿¾Ï=à’;ÍZùWB{ ch?rÒÎpø°/m«|͈·bÉ׬ž ýxùÑš-`0ä˹±%Õâ N š±hÔϵ6ý&¾JçP#§×ÅTx–us£ùþ”ƒûúª'u€Öå(´Ч®gþ»ßsÜt~.IçCÓ¾£è]+˜—VΜǚ³ƒ^w¡ö ãx©¾F¿ŠX׌gÔÅzZ÷eð£50ÚŒ¸Y°rÞ‡lL¶¥µ¡Ý«¢šÁ`Oà‡y‹Ùà0M£]4¶§¯ü/?_ƒ”­±Ä¦„9¨“B!„pÄl6ãçç'“B”1EQðööæÌ™3·÷„Áß\¼½1d’ïh]ƒÕ‚R.uó;¼wØBÐ#‘D˜ž€[)›L!„BÏn·Ëd· EQpò¡àMèüÛóÚ¬†¨^å°ÇoâË™Ÿr¬p×ÎgÏ‹cWBÑUoöÙ< ].¾¥Q+Í™2õþ¡”Ï:ĉlX3ص1‚–ŽË3VlHÅŒ¿ØŸY´>uïrªC€a;ÙNÆél,N³åRʿǶA5[ñ¬æA‡°öüxþ<˜ Hß¿œBñÓm#ÛÉ*6¢FP}úŒ{“Þzw0â£B–5Ýû\>n ![þâ¯-›Ùp´hÛh¥9»½»òy!„B!„¸~·è‘„¼3rùÿšÈØÐ}ü—WìEžª*\6i³b+i2D+MK ùEAáB‚û5~Å ªÝÎÅI'â¼¾X®1´CQX«h/$áÇE¬ z†þ­|‹6l3“‹å\TÀ•Jõ1ܲ€.W˜~’ ¯0*»© ó¥QÛŒ¥Èg>½›$ߦÔóQ=6Àõä^R®ãsÎÆ€ÍŠÝàŽë5ô¬ÎÍcv‰y6Tïz´ u»ì-šŠ[÷TuEAŧN=<Î'ýü…waÜWL<˜/ fÈÔÒL@aR, ¾­iQɨx5|œç»Í^¹†Ð¹g+|Ò°uÍg,üä~õ‹ê¯•æìöJÁX­;ƒt&¸˜ ¥IB!„Bˆ;Ñ­}‡AA«þÁ´Q/Ðúàl~Ï8Æê *ƒÆ¢YRgÏ¥’zåýúkbéÁkƒ[ã§÷ ²·/!“§ÓÛt”3–°KãbÖ–±•ë;ðÊ´©tKNäÀñÓ˜‚ßÙ·¥ÿÁŸÔâ•ñSyЬâ’Ëây{ȽŽEZ±hÖ/ÛŽíÜ>~;ÒƒáïFs.+—“«fóÞúTôaO2ê¥{ðÒyRÅÇ›‘ÓÉÍ?ÖÑ+õ IDATÈÒiË8tl5ëÌ/3:¼>Ig³ù»ýôëõ½GL¶{N*j‡Á„?D çiþ73ÖÁû ÔïÜ6-ªÍÐShe£õßÍ=[´JÀœÁiC^Þ•ÂB0p†(zñ¤Fšf»hlOÔ…¯?L°Á€oÅò¨££h–}”S²íüó úòèÐ6“ÇtÅDPiÒ.Šq¾±„B!„¢ŒÜôÏ*Þ1W‚7Ä'nû3TBžˆd¸~>c>‹w°Üý.åzéüh72’·E0é×ô»ó—B!„·™²ü¬âÙ³gåS|wù¬âÝãzöé[ü•„݂ۘµ\Sžüº0äîdyô©²¹@¿bqŠ‚gãÿB=¼\\(<þ#ó6gÈdB!„¸­½?ø9v»⩳b.p!ô¡y©kîòч;Æûÿy–íªzPðn>„ˆgkâRÖÝ¡dÂà" Éë2n}YÇ·W,ΰ“»ˆñ¯–uB!„B\Cužxc"ýU¬™ÛY0Ῥi<•^•å²éŽa åé‰E}X<;v”ëz þŸDF¾B!„B\AW® ür‰Í´@…Öò!?î>‹Élůýxý©PŽeEp&>Pó¾yŒ˜cgÈì¡4pIã·©38õL$φ–úõåâfÉÙÊ[SvP»^6»NxðÀ îXVtEÖÃ#ïßÌ[ÌættAtü ]«¨¤þù)|w€¬B Æê]ùÏ‹þ‡t«L!„B!Äeìäøõ)´ 4€Þ›Ðû^âÍ~sv0÷ÏÙÒ%‚V-B8·ö8y]¼IÙNp …Ø$3 ‚âÙ•ƒÿ!W•·óq>ηz\Âè>”:(<³ƒ=¢ˆxÎ-‡„«ús­N~ïê“DE5ÃÍ”I¾ÁˆõÌþû³ÿŽ˜F¨‹‰ÃOá“íMÕ¦\Y×ô– !„B!„0ç‹È‘¬*H'št0„Ž:ÀƒŠ¾IüùýOì=ž@|î9|³lxToN…3;IÌ­ÌѸ téœO̾Tòì»H®p/!®e]¡ âIÈŽ÷ßã‡@-®?­¸U¿ú_~Âì%É<ü`'šV±‘y` G“Ì|ôö^TÀf*Ä%  !„B!„øç0†òdÄ:ä}ǤY§ óEXÎüÌŒ·wSÿ¹gxæAˆ™<‹svP¼kÑÔk5» ÞØˆëå±nñ~NØOâѤ»¼,ñ6URêü[3xj}Nîˆaå»ãÙøX8}±ãZë)FhŒ{Y^Jz„B!„Bü)*ÿ‹Z&ðÉç{ɱƒ)~I;ѹQ0.™Ç8~ÎZôSõë+ìÙ´K½xûÖ¦NÁV6î²S·ŽOÑÝlqÛ)©?Í©G8‘ëAµÑïQâbSp«Ó¿Ãßò[œ ;vÌ™)äX˸·Ð]·ÂÀ¥f¦ âȬßX°¯øžt­ÝécÙ÷öo,:P6½]š8…B!„e@q¥Æ£ýhøÆb¾:IßÚÿ¢Å÷KxcìwVk@ˆ¿ñü'à 6 %#ruºú¢ÓÛiP)‘È]M‰¨p×]jÝÌÇù8|_«EË;\žeâ€Ëï“»ÛŸ6òwòõWËÈ´Y0Ù+ñÈËaxV¬ÅÐçSùï¼q¬µ©}Ñ{H_šùþ3¦ƒ»Ýnw&cRR­Ú´sø;]`5Þ˜^›àKÿÑt†Ù¯ÅrÐä 87žŸÞåý ,=Tº‹êÒ\ˆ+¾åt˜Ï™È),U±7œL!„Bˆ›eË›vüÃb$%%àô¶Ïž=ëô¶Åí#)) @úò.p=ûô-›öÊÞ²e›ò±X ˆ7ŠŽŠíêò|Ï ªùèÈ?•ÄW ÷ó{¢5¸§„Q`LZ‡æÆ½Ó¨ThU‡~OU&´œBn|"_/<À§ÿ¾ðv «Ék«RËÓDìòm|°>«ÎƒE¶ãÑ +Û/YaàR»!ÓÇ”çàªüî¯L5w;>ÜÊâùX¡Ý3ø1ÜS’Y²÷7Ífî°ìÓœôp2NÕ@íxîáòøíœ;t‚¥ór0Ûî|œ%·µ]1R³{žýW\ /1™ÕKö²ö„§f“„B!„BÜñnÙ; Ò²8v$£èÇrÉ·¡r ^~!ˆ¼•0lÐz>9À3ƒB¨ ëéãDÍL" ÛgýÊÐA¿0g—]`^X¿»˜0f› Á<Ý¿~W…è¨ÞÀʯócYŸîJãîU¨l¬¹üñ #g&ÿÊmvì©’ÉÒqðM¢+M !غ Á<ý˜?ú{‰zÿ,¾õ]Áfsx1ílœŠ»¡å økÙï¼q„ÜÚ¡ôníZô ”“qjµµêÈ“óÅF^}y#ï‡Êõ=q‘—´!„B!Ä?Ö-[aP¾[k¢»ÿ#ù(oF§ NyÐЯ=súO+,O%÷$gÛ±ZìX-6 mËr¯DÌlø=”³V¾yãg¾9ŸæBQžã?žd×!ùG-Üר·óS#6« ‹¥¤K};GK&9ÇΉSh⊇ þbeßogHˆƒ_wÕæžæŽëìtœf3Ùª­{ßK3›? Ý×€zqšãZãTðÖhë”Ü\â2 Ý3ÍyýžtìIdõÆs˜dyB!„Bücݲ ƒ¬ß÷°xCÀ^ÏY+xÛLü2y#_ÅٮΤ@±7¹Ïÿã…åªQ‹ÎŽ9ÿÂRfsQy¶'ŠcÃj-ú½ÝzI>¥h[¶óÿTêŒÓ³q]ú´÷à¯w6òa\yF¾ÛŸëS³­ÓùôMìlDƒzþ4ûwShy‰ÓãH‘×+!„B!Ä?Ò-~$!“cG29_@¡ÝιƒgIÁ•fËäçEËçZ0j@Å‹Köí+ôøWtÁÍÍH9/ w2…DŒ4ìPžÀòþ<:©3ÑãªàèE•Š‚Á ¢×]É«zƒAAu°ô¾05“TtÔêPÊ•+б‘¡Tuv.N«`µé¨Ø²Á€Á]çð³,%Ç©ÝÖºÀJôXƒ „¾^²››Í(þx^Ü ‚Ͻµ8¸u½®l,gÓ„B!ÄÝHQœ|¯ºâ³Ûí(Šó×b·l 8–Äã,XžDν÷0ifþfbû/gÉ8WۜϚت?מè÷:ñzWô€59žÿ.M$«i&ÏhF;s"½G²ƒ»ážÍ[0wáÌ|½"nèh:â~æ.lG÷JÚÍ`=“ÀŠŸ²Ð·hĘWÉ‹/»ã•ÎÅi'+öëN©´ÙŽ«œæÓõyxµ¿—çëkOhÅ©ÕÖÖ´tŽfyðð˜»à>ÖÉaíòãÄ™ÿ.ÛµRš6÷§B1s%Φ !„Bˆ»Ñh$++K& „(cv»¬¬,\\\œ.ã¦Vñ®`t§éý©™Â†Ý Æ´æ1ý&N8îp’â–ºSâB!„7UY~VÑf³‘››KAALQ†EÁÅÅTÕ¹µ·ìw´ÂB²Œåxü…03€éL _ý7þö{¾ÿN‰S!„BܵTUÅËË //¯²Eqd…B!„w™²\a „¸{”é; „B!„Bq{’ !„B!„B\E& „B!„Bq™0B!„B!ÄUþ‘jù.D-{ƒfîeÉ]Ìý^"Œ ‘ë5¦9[æM§àÕ&‚÷_k€[Ylþ:]û˜7PµçÞŠ~O—]C›ßÄ>ºuû­“uB!„â.sÓ?«¨îÁ´7*°èµE.·Æ#y·÷VFOØ@NPÞŠîOæ9Ìç¿ÕP˜ðÓ£~æ´µ(¼JFÑÍÎw"ùñŒõb™Eù²°*f’¶¯âÃÖq2ßVª˜li¿2aÐ,¦›Sç2åZ‡—Â[³>r)‡ J™Gq¡êƒx©K0˜U\¬Çønþ‡l>„­ËQh5 O]Ïüw¿ç¸É®µé7ñU:‡i<½.¦Â³¬›Í÷§´ë ú´ _OVŽàÏ,¨Ðu SúÖcûÌÝä£' u_?Z£Íˆ›õ+ç}ÈÆd ªwúöòcíäĤ(wdò3õø#j'y:šöEïZÁ¸$°ræ<Ö$˜‹6ZBšv,Êt†g "f>À±­fêÔ¢¼k«fÍcu|(îÔì9œWîó #%•¤Œrè®»JnO§)®„öÆÐ.~ä¤áða_ÚVùšoÅ’¯5æ/šu'ûHOù–ÿæ?½êá©q5få{².ÉŒö~[]'^í FÏßG> x7ãµi]Ø1‹£&2²z<‰já~pÉh û…ȷבjuT¶B!„ÿ ·õ# naitvÛþÜDv³ŽTs¹ú7ö‚3lùòG2v¤ºÑQ‰&ö/šÈÈñ‹Ù{E’¡<–YŸÀäeÑùº9n «¥\0êæå¼7ûm¢c|yø‘긪_[>@Ì´qŒ3ž·ÿ ¥_ÿ&xY38~Ö=:ŸÚ´jQ/+A!*‰§òJž,P=ñ7og~øxÆŽ~“•®ÿâÉúçÉ›±|Öÿ8šòsÆf䘷_üvs6™V7|ÜUÀ€»»JNJ6VŠ&^ìíÆ÷Ó&>~‘«}xêÅæx«`ËÚÊŒ¡Ó‰I)ºÂRô`JËáÂõ–âˆçÎL=’‰?ùÒ«oc¼í4­X•é›Å+„ {2iÌ(&¬òäÑóeª~­xöÁ> ŸÀäé‹Ùéâý÷ ›“ý ÕžÎR}Zз«ÊWÆùñÕ+ãf»°ÆCcÌ;9^4ëŽs}¤ú¶bÐó•Ù8#œ±£F¹ZO›ÂpWÔ¡DVÎnüžu¦‘· ¨øÞó •|Ï_™6lþ`ñ’X*43òëÂå jNUyü@!„Bˆ‹nÉ ]ùN¼ñ~ ,€bðÀ-aë%i÷1fN“ó$rjå[¼µæ Å‹ºÕ$!æS²³u¬O}œ.a®ÝwõzdkÎYrÕ–x09¹ÞšÆî}. 7†-ñ×–Íl8š­}ñ~ž=/Ž] EK$²Ïæahè‚ +6¤bÆ_ìÏ,*%uïrªC€agOäã_¹ý¢#“¢Þ¡sšŽýnÞŸ‡p©ØˆAõé3îMzèÝÁˆ Y6¨©Ø¾?ÛïgÑôc\X,bÏçσEm˜¾9„â§ÛF¶VšF,še^Ç z{A<›daÎ=D^·Püt[1W¨‰_Æ>NäÙÀ–ËÑI˜›žÏäd?JÓž×HïJù¬CœÈ¶5ƒ](hé\Y¥â îÎô‘1¸ •³v^ÜWÒ6ÍgÚ¦ë 3{«vô¦O ?¶ÿ¦Ò²‹["Ï^X9—˜‰Ù”K^V.Yf3yV#®ªÎ?P#„B!Ä]å–LXScêeï0¸4­øGTŸFtkD•°©Ì±‚êî›­ŸìßQ´4ý:ïŠx¦‘Yx'ú¶ö.˰ 5hØô^Ú ‰â‘uSˆüþ4¯EmVl%núŠ[«v;v»…´i¸·®I3ï¾þÎHó&5pSù3WûªÑÚ‹¡(,3…]Ù.4M¯RV±$ú஌è™ÃÃ^%6 üZcòðNŒ!;æÄŸˆ_ERqKµu¾4}z(OleÁ”Ÿ9žwiü,—¶‹Ýî0M+–T‡e–ÀnE‡zauƒÎ€ÎnúûÂÞfÇz¡EEáïŠ*ªîâc:ýßËœïíéEQP.^äÚ±—<oÇu/¹ U'bl‚ô`>ù‘QkI¾Ø׳T¤8&ޝù ݰvT9¦ÒÞú+Ñ …€ŽËÚÉn»Øz7:!„B!îd·é# *þ-$`sÃ^Á°a#:bC¤q¹+BÖ—§yÏñØñ+'®çår®!tîÙ Ÿô#l]ó ?9‚_½@>å Á|z7I¾M©ç£z*4l€ëɽ¤XÀœr’š¸7÷OvîŒÅØ©=2R¨]¦ÎÍcv‰y6Tïz´ uCU/i›»Á×kèY‡?^ä‘k¶vL9&T/\(LŠ%Á·5-*¯†ó|—࢙&Õ‡ÇÐÓö5Sg¯¹b²·î©êŠ‚ŠOzxœ9NºU;M+Ge–Är.‰ßZTó*ê‡òuÃpMOäÜÅX*qOˆ *Þ¡a¸%•i9{Œ ŸzTóPAõ¡^‹Ê\x*ÆÙ~ÐlÏR0VëΠ ¾$CaúI2¼Â¨ì¦‚ΗFmCJ?n/ê®ÕG…q_1að`¾4˜!Sÿž,0'Å’Xîø=>àßþU¦ n‚g)¯à‹kkÊ&~LmM¿ç[qöÇ-¤Éû „B!„(µ2éáå$¦ƒüwÒJªw.ÇžE'¸ð‚=ç1ÇŸç±æ~lÛw!ß=XtVÎþµ’·— ÏÁUCH^Ü?½•½} ™<Þ¦£¬˜±„]¹œ6ôáÕé]),gøaá«V3\ [ú|ðI-^?•Í*.y±,ž·‡\;v‚sþ ¬8BN†±ô§jby–¥›Ž­fùeF‡×'éÌa6·Ÿ~½ž£Ó¡÷ˆ9mÁvn¿éÁðw£9—•ËÉU³yo}*Z×IÇ¿eÙŽÁ ž:•ü7}¿.‰á´lç¶±hQm†Ž˜B+3­ÇønîY,€¡j7žëXcr?&5+*Ë’´†è赜VuØsRQ; &üé =Oó¿™±dÛ­4XpÕȧÁš²å?7aðŒùìIF½t^:Oªøx30r:¹ùY:m‡´êží\Ù26óÁ'5ye|YÀXpˆoæí%Çî¸%µKQÁÙì^sœ†˜Y±»t¹”P÷1–•²—„B!„¸;(v{iÖt_-))‰VmÚÝèx„¸µÜï%âÝά6ƒ]×3;T–W‚7Ä'nû3TBžˆd¸~>c>‹/õDÄ]Kq£Ö3x.{.“¾M’öBñ±åM;•7))‰€€§·ït^!ÄÍâT¾2_a „¸Nv ÖrMyvòSè À»“åѧþñǪOsŽ}†Z©«‰þR& „Bˆ[ÅÙ !ÄíGV!„Bq—)ËBˆ»ÇmúÒC!„B!„B”%™0B!„B!ÄUdÂ@!„B!„W‘ !„B!„B\åŸ5aà~/ÿM·²äJ 1+¼åu×’V<µ|¢–½A3÷Ònß@Õžcx+ú=>]6‚F®¥Ìæ~/ ®á÷73–Ë(xµ‰àý×puW_{{j¹ö¶¾Нƒ³±”M®ÁMg7‚Ö8»Ò××Ëmß·B!„â¶vK>«øú²OhdÎ ÏZô·åÔLZMÒíö3×:¼Þšõ‘K9\p i×ËP…=]m —’j½†´ØÒ~e  XLW$”X‡Bâ¾y‹1¿´`¬¶Î×ã2*.å*R§u7žíS—GóéÉÂRä»±\âÊöt©Á3‡Ó>ÈÙéįz›é?”î3|%¶õÍT˜p6–2©Ã c$¸Ó }¢>žv5÷ ßÌ[DLBN}þ妹É㺷´ooæ1R!„B”‰[2a€ùËÆLâ×tÛ ®4|5Šû>'¾Ý4÷UÉݵ€IKQ€ž ýxùÑš-`0ä˹±%ÕNÅG'3²z<‰já~pÉh û…ȷוâ¢ÚƒÆÏŒâñÚÁºfåŒÙüo×Úô›ø*C4ž^SáYÖÍæûSí4ÏDÌ|€c[ÍÔ©Dy×$VÍšÇêø¿Ï˜Ý›½Á_Édêà÷ØÕ‰»ŠÛ>´Iüœ‰qfÇiŠ+¡=†1´‹9ig8|Ø—¶U¾fÄ[±äãJ½ãè_ߊgˆ0•íyšZ£ZTOê>>„­ËQh5 O]Ïüw¿ç¸éüå˜Î‡¦}GÑ»V0. ¬œ95 fô•âåçk²5–Ø”0GR*º€NŒ ¿—-‘ï°>UOµ'&0¼ÂWL\°“,»;5{ç•û<ÈHI%)£W/ (¦= ŽñÉøaü¯Ö‹Ì”AÔ˜¯ù»Iô”oùoþÓ«žªWóaV¾÷!ë’Ì ÕÖ^-‰ˆºŸ¸­©xùúRÕʦè9¬Š/Ðî?Gm]R´b¹]ê` æ‰éC°ÏŽà«Ä l$ì…i<—0Ik³ðoÝ—ÁÖÀh3âf=ÂÊy²1ùüoKgªwúöòcíäĤ(wdò3õø#j'›àê‘äàRұNJÆ8s¿—ˆw:ðí«Ñì6GËp¢ï_Åðé±äkŽl=Zu/‰V,šcBû¸[r,cIóø¢Ñž%Ä2nÉ!íº !„Bˆ[âÖL”ÈBZ\užèÈΩo0<Þtñ® ê×–OóÆ8Ö§)uĤþMØ÷öNlþ`ñ’|"‡Y¾ý›=¨êºŽÔ\í-*îxíœÅÄEyTê=±T'fþ! L‡X>ë„M¬Æòq‹.¿C¦•f³¢x…PaÏ(&-ÉÁ¯KSú6fÓô­dŸ¯Œ%u7~Ï#³˜óÅ£.?j`MÔ²mŽÓTŸôíªòÕØñlÊòå¾±3èb¾Ðj&ö/šÈH·&Œ™Óíò´ê EõÄß¼ùá1Ë÷¢Ý„(ž¬CÔ_yÛÓsçL&.Ê# ë$"û6æ÷¨mdŸZMôT@LÏ(Å’mǬg׳pE}"vâø—¾¼Ôü LÞE– TÿV<û`ŸŽz‹­¹4>‹ÖWä×jëb«îÛŠAÏWfcD8ëÓÀ¿Ýô@[—ï'Ï®ÑÖV J¹`ÔÍïðÞa ADñHu~žB­þsÐÖ%סäXnŸ:dpü¬÷ùëÑåÖ y-3ûþJ#(D%qsø´àÅÞn|?i";²À§ÍkLy±9±Q›ÉBcœemeÆÐ­çƒÖ£èÁ”–ƒ£yC­cHºKIÇžíäú9g×JÕª»Æ8U5cÑè[­ã®F,9å4Æ’Æñ¥äcùv²í%Ç"„B!ÊÞ­™00Öàù·æÐûüY¼éÀ&ÌÙA¶ÝFa¾Ó±Õ¬»âDÑX±!3þbfÑsêÞ=ä>T‡ÃNr±r.1³)—¼¬\²Ìfò¬F\UœnÚs±i6 #> C˜ëu¿ÈÁ^ÏæEež;zˆ¼n¡øé¶’}~‚À|r —SO¥‡ú¶} Ë’¯¼Ä)>MïJù¬CœÈ¶5ƒ](hyÐbË!¥0”mƒj¶âY̓*`ìùñüy0¾9„â§Ûv±î782·.cYÃÉL—ÇoFr ¯¨¿ jâ—±y6°årtg榗æÕjë⃛P9kçÅ1˜¶i>Ó6•.R{^»Š®š²Ïæah肊ƒþsÐÖwvr9{"ÿÊå©Ö‡> ùîÔçT*wŽ#)f Q#¨>}ƽIo½;˜ñQ!‹RŒ3ÅHÅöýÞ|?‹¦Ãñ|XÉÇ’=Û1;g×N³îŽÇ|IJ>îjÅbvr,iµg¶¹äX„B!DÙ+ãGl䥗tGP¹üO»»ÀŽÝvþÔÒn»x’yů‹g³p1ki~_ª2íX/¡¢8¼¿YDõkÅ3í“ùrÂÉ«.pJJSåbä—´ÃMb íÅÐG™Â®lšŒŽ¦×e¿°`¹4ûM>åW\ðóUÈ5¹RÞ׈z²€ £JQu—dëô—Oiµµƒ :§ÍJq]£ÕŽÚúήƒ…´i¸·®I3ï¾þÎHó&5pSù3ר1'þDtø*’®Ü}ŒEùKg:_š>=”§¶²`ÊÏÏûû8c¨ú8c»¤óɯˆŒZKÑ\‹£cHIÇíqv)UUJÙòu׬Céc¹ZIÇÝ’c)zO£“cI£=µÿ „B!ÊÒmû•óéÝ$ù6¥ž è©Ð°®'÷’r3_”h³b7¸ãZ\«h¤)n•¸'Ä ïÖ£ IDATÐ0Ü’“~ÉÙ¯±Zw èL°þ²LÔéÕ÷_¾`ÇUÏ"”œV˜~’ ¯0*»© ó¥QÛ¢ë©ë­_ tn¾³ãH̳¡z×£m¨ªúwŠ[÷TuEAŧN=<Î\^w-Ŷ‹&=Á ¢{Îr&F®Áÿ¹þ´ö+ŠÅrö>õ¨æ¡‚êC½•qù;È’ÛZƒ9)–Är÷ÐÀWTüÛ¿Ê”ÁMðtöš íþÓlë» 攓ÖìÀ½¹²sg,ÆNí©y„”B(LŠ%Á·5-*¯†ó|—à‹3š%Ž3Õ‡ÇÐÓö5Sg¯¹l² 0î+& ÌÀ—3dêßÚšm¦qìÑg63¹xQÎE\©T?CiÚÓAÝKªƒf,NÒŠÅáX*áøR&Çr!„BqC”ñ; JfKÿƒ>©Å+ã§ò YÅ%/–ÅóökWð¼YÛ<·ßŽô`ø»ÑœËÊåäªÙ¼·>«ƒ4{þ9ÔŽƒ ï@€×YV¾{ñýúòèÐ6“Ç\ü2„>¸ O×ÙÃò“¯º³¦•fËØÊŠõxeÚTº%'ràøiLÁç—å‡ôàµÁ­ñÓ{PÙÛ—ÉÓém:ÊŠKØ•m/±ú°'õÒ=xé<©âãÍÀÈéäædé´e:¶šuæ—^Ÿ¤3‡ÙüÝ~úõzŽN‡Þ#&[‡='µÃ`Ÿ"Ðó4ÿ›YTw]PF¼þ0Á¾Ë£ŽŽ¢YöQVL]ȶó묋kXN=ÊË÷'±tb,é¹ðÁÊ&D ¾Ÿ£o­%9}3ÿÚŠ!Ó£xäl‡Ž&a T¶ç•_I˜8¯ýß_IÈØÌŸÔä•ñQ¨Uw VX´u׊Ec,å-á©ÕžB!„ⶦØíέ!OJJ¢U›v7:ž;û½D¼Û™UÃf°KûUè7†âJpã†øÄí`†JÈ‘ ×ÏgÌgñ¥ú  (cwCÿÝ uB!îr[þØDpp°Sy“’’¸Á !îD·í Q»k¹¦<;ù)t`ÈÝÉòèSr¡v§¸úïn¨ƒB!„Â!Ya „B!Ä]FVüÍ~îOf‡ŽÏi¼PÛõÆä3ígþØO©:v݂䬸{ݶ/=B!„BÜ¡ì¹_»˜)¯ ¤ÿþ ¸_Žç–É'tšt~¼í‚€‰ F2kW^1¿¼<­ôù„¸{Ét˜B!„â*$ñÇYÌŒñ¡Ç€©Œu!cO ¿MÃêqÝ_õ¹fz?u¼°2ÚJ~¶™â¿9uEZ©ó q÷’ !„B!Ä cÏÙÇWk²h3l4×,ZÊïѼ'Ï¥b:µO–~˶¸\Ü*7¥[¿gé\ÍÅ´Ÿùo¬¤j×öþúq®4~z0s¾çó˜ý$YªÒýÕ¡t­êzí¿û)UÇŽ¢Ò˜w Žà?^õ8e(M= ‡]sÞ¸<-¢ ["KÈÑåÒc:µžÇÎÓù¸TéÀó¯-«^ý¾{þa¾˜ýçZcæûѼ~¿™ïßý˜=¾Ók:Î)øÏ›³˜Þ/Kfñ“±£gÌbL›TV¯<ÄŇ®å·xÐä• ô q¥îÐhÌv~²Àóê4|—jÏ?Ìï®ÂúÀf¿?›×ï=ɧŸí»-*DÙ‘ !„B!Ä cË;‡ÙÅb®4LÇÖ²]mÇã÷UÃÓàNå6OÐÙ}7kŸ¿!ˆ6êQN§âYµ6ÕéØº2®Š Aµ+¢¤!Ïz¾°kùíMd:ÃN‡x¼e FÅ…J­;ârçÍß°·€L\à~/ FШ¸§j¥9[f™ÐØi3¾Ç{sf1óǨj(똮ÕÝP‡ < bVx'ÊËŠ5qQËw!jÙ4s¿5ùŠ·?Èþ.„w"ÕÍ£)Ü«.ÖídfPè]‰rŒÖ{SÉÛFfjþÕïÐéÑ)ÿ©èô¨ØŠÀµüö†²S™NVüÌ?†1cÆ0vê—$Úåmâîpg¾Ã@q¡êƒx©K0˜U\¬Çønþ‡l<ãèKðF‚;½ÀÐ'êãiWPsòͼEÄ$8ÿÆV§cqv{®„téÏ à =Fóa¾û_~‰/ªƒ¡búíICO°ÄñÃÜüo*ªŸ>ˆv]k°ÿ×Xr¨à’BU\ÊU¤Nën<Û§.;&ŽæÓ“…×U?]PF¼þ0ÁçG˜ê@@êb†LØ@Æõ?K¬Ãup­ÃKá­Y¹”Ã7¨ÈR1Tá_OWcÛÂ¥¤^øê͈¥¬êWæ4Ƶæ±À…Jû3¤WmÜm:ìg~ãƒ9+ÙŸmô´ëÇð'êàf%k'Ï^ÁŽL¸„1àÝ ´0§c(äÔªhÞý5gon¸5 †r”ƒ§M·ô%K¶´_™0hÓ­É¿?Èþ~íd/Óýý_SÊ® „¸+6¡ªù6Ç™¨YëÒ;g .>>²’Ȳ€°d‘˜¥âSÞíÖÜÉTntZQ<«4gô„‡Iaq—¹#' TŸôëéÁªÑü™ºNaJßzlŸ¹›|ô´îËàGk`´q³aå¼Ù˜lAõnBß^~¬<‚˜…àî‘L~¦Dí,z¾IçCÓ¾£è]+˜—VΜǚsÑFKHÓŽÅA™ÎÔÝ·9OÿKÏw“F²%C!°ëd¦ü».gì"_ă/w¥àãp†íÏǵZKšyº¢bBW£7cþӖЬ¯¼I=³‚ùÄÿ˜ñþVr‚âåçk²5–Ø”°ÒÖÖ3k™9jíù¶ó§Ã«#¨½vç®ãªÇ¨Q‡L[ɱ zR÷ñ! h]ŽB«}êzæ¿û=ÇMvp­M¿‰¯Ò9ÔHãéu1žeÝÜh¾?e)Z!òN¾}5šÝ&ðhNôý«>=–|\iøj=ö}N|»'hî«’»k“–¢@£].iYüÛö¡MâçLŒ;?´bÑ,SO@ûÚ½*ª ö~˜·˜ ÉejѨŸV»xµ$"ê~ⶦâåëOHU+›¢ç°*¾´Ò4ë§ÕÖ%ÓWÖ×Ç‚‚€ö êíÍO¯³.ÍF/F2ø‰ÝŒ\z”BŸæ x:€˜ £ù-UG¥G'2ö™ºxoùŠÞ¶½,;ƒ7è‹Kv]yÚ x–~–ƒüöÃÖí>M~©ö!=Aúñò£51ZÀ`:È—s?bKª£öt¥Þ€qô¯ïGÅÀ3D˜Êö uQ\ í1Œ¡]üÈI;Ãáþ´­ò5#Þ*ÚJ̧Ùï{äªýAöwÙßÿiû»wÅ«!½ôdÚ‚ETø­C dì]Íg›+ð\ÿÎ4µ¼Ï—ëš3¨c2ÿø’µ¹ è_ËCózýÆçB9OH=–‚©A0z½RBš]# zÅŽÅ®¡i’û+6Öc@‡*¸äžâDny‚n›eÆB8펜0°›³É´ºáã®B–ww•œ”l¬]à¾ØÛï'MdGø´y)/6'6j3YY[™1tëùRô(z0¥å\¼û§¸â¹s&åÐu‘}ó{Ô6²5Òr4bÑ,ÓÉ% ¶ôD½¶±¨l½?•‚]ɈÏÀ¨¾ héušÃ†0é9?ŒY»øjá6¬€õØ—DŽßÆ3o kÆDV¹äžç©ÕDOôÁô|ÜnD[_¼¨Qñký<=Ì_3yOÎuÝ%5kÔA3Õóvæ‡Çp,ß‹v¢x²~ QåéËgý°‰ÕX>nÑ5Ü‘³W@':²sê ¿°Š£”í¢xÔåñG ¬‰ÚCö…FшE³L]%x4„-oOàÇdpkOK_7Ôäll7¡~š¬”rÁ¨›ßá½Ã‚‰$â‘êü<ÿ i…šmæ\,qmÓ8èýªã›¾‹}éV°eshÓ!Ôêà§;JFpS*§þήs.xyÚHýk;yhØGœÑ/·Jt=ç*x`‰ÿƒÿý’¿ÒœxÒœ¸ŽE“7àÒ”.]_dJ_+b¾å‹Ÿ÷“¥Q¬ê×–OóÆ8Ö§)uĤþMØ÷öv²íZíibÿ¢‰Œtk˜9Ý./Ó§}»ª|5v<›²|¹oì º˜íóiމó?)ný]ö÷Úþ.ÄÝÅHH÷QŒpù”ÏÞÇŠlÑíÙîxyðï½ødéF~–‹[•{è6ì9y*àÌ µk¥xP§ûýxÍy“—­MßI#¹ÿ²€+ÓÆv-9ß„4ªžÍÒe›é0¦}^}ŒO—ÌdøG¹è¼«Ò²÷dÂ@ÜîÌ ƒÜ½|úEG&E½Cç4úݼ?)3àR±5‚êÓgÜ›ôлƒ)•¿/b#Û÷gxóý,š~ìâI«=?ž?fcÒ÷ï#çPütE%¦iÄ¢Yæu=± 'ø‘±Lz¦.ÆãßñvT…€Á³<¾*c]8™I ÍTü×x"·äè´ß~ àºÛÚµ=z•ã··cÿ>Q¾ š±äRʿǶA5[ñ¬æA‡®cÃFa¾Ó±Õ¬»â„V;=•êCØö%,K.ÝÉ¥f™Ö4vïsaø¸1„lù‹¿¶lfÃÑìë\Â^rý±çű+¡h¯Ê>›‡¡¡ËÅ%†%¥i·™ó±8Ṯ@={˜¿ö4 üŸ“]¨Õ¢>®iPÝ<Ñd£küó^É$*ü …Æ@Üt@áiÖ}ý-gßÀLjöϨWN3vÊzÒ®«3läÅogÕ¢£zð†?þÛ~ÛO¬ÆÐ1VlHÅŒ¿ØŸY´áÔ½{È}¨†íd›kO½(å³q"ÛÖ vmL  eéòj‰¾?Èþ~Cëçˆìï—ïï/½¹þFF,ÄMõ¢öØøð «’\«täÅ yñª„z¼<{ÊÅ?uå`ÒœþN®?„wß¼èüo=j?Aø{O´rUÚý³–œoØZ]øÿ•ï£ÿ„ûè_L©BÜÉîÈ }pWFôÌáƒa¯›~­‡1yx'ŽGÆsâOD‡¯"©¸s3/MŸÊS[Y0ågŽç]zšeÁréÙ‰Ýî0M+–T‡e:ËBÒ÷S¸Úƒj_aäëy3òÒ rÉË<ÂÎ9Øìpfç_d>†¿þw2œ| âºÚÏÝh–öá¥ù‘Qkù»«Jªßõ¹²]lVl% óÓ¥’cÑ®ƒ†Ž¶ôßY°¬ƒGM§K~2÷%~.Øò²)tñÆ~äS¦Í($Q×ó9ò­`/<ÉúU'ÏnáØï[H¿¯þ†õ¤9èh­:èË…Òê¡n<Ü:Ì1Ìû;Ju抅vû%‡ŸÒõíe¥) ÊÅË7;ö;¹câFﲿ—Lö÷›¿¿ƒL!„¸»Ü‘_IÐyøãE¹f`Ç”cBõðÂE¤X|[Ó¢’Pñjø8Ïw .šQ}h1p =m_3uöš+& @q ឪ®(¨øÔ©‡Ç™ã¤[µÓ´bqT&€±Zw è|ñ倗*.ÍPíIޞݟ*XóIKÎD)ç‹›Ö´½ì1×¥]MTtøÖmˆ÷Ùc¤^Çj§ÛWª·#}óÁKQ¸9´bѹùbÌŽ#1φê]¶¡n¨ê%CßfÅnpÇõʽÁf&/ʹ¨€+•êRš´k¶‹âF^=pÿå v·ä¢„X4Ët ¡sÏVø¤aëšÏXøÉüêbtT? 0î+& ÌÀ—3dj)O¼l-ŽÇ’F^gê u,ÐûQÝó0‹ÇdTøûìð &cË>2m`NÜN¼;îqM`ßÁT|[µÄõà.’ A_å1Þ|ëyxª€À{îÅ'ù0g KŒÂA<àÍÑ=9û3Ñ£#˜ùÑoìO5;¼ëj>½›$ߦÔóQ=6Àõä^R®ãXP˜~’ ¯0*»© ó¥Qۿǘ³í%Å"û»ìï·éþ.„BÜmîÈÇ¿eÙŽÁ ž:•ü7}¿.‰á´lç¶±hQm†Ž˜B+3­ÇønîY,€¡j7žëXcr?&5+*Ë’´†è赜VuØsRQ; &üé =Oó¿™±EïÐJÓˆW|çéË7¢CÛL6~CÒ'óÅ¥ƯæÃMÿ¡ÿÛ³1ÚU –Süºh €8¾žÃ˃§3Çh‡œý|öî2œ‡_ü¢Á€oÅò¨££h–}”S²Íɶ.*Ø›jA6’ÖäÝô7¼kÅb=¶šuæ—^Ÿ¤3‡ÙüÝ~úõzŽN‡Þ#æ´Û¹}üv¤Ãßæ\V.'WÍæ½õ©X ޱzƒÊ q£h–”ÆÙs©ä£:|!V,úà.<]gË?N.öîY‰±hµµ9ƒÓ†>¼:½+……`à ?,‘¯àÓ—_œ(^åyf½4?½ŸisH±{ð¯Èv<`eû%+ \j7dú˜ò\•‚ßý•©ænbLJ[Y¼1«b ´{c?æ{J2ëO–ãþ¦Ù̶ƒ}ZgæŠê6 ß£tÓéd¾_´—˜\ê7aÆë¾lŸ¾åÇô´ ïH_ãa&LÇ·mx .éïGÕ›xiËžìÅÐKCX¶9•<—ûö³¥âÍWÓj:ŸÑ›A“:Ò1¡ˆ"‡‚¯F,IZWÄuF:ŒîÊ-—dR)OæÃw8P®‚b¢Ý•qÜ|i¡P•™Ë’{Xž\;YRwãiÇb×蟱è#Ü·­Y£Oäéüûò.ȉgqucz{¢ÏMà…©‰d9µÎ•ÃôD^Ünù‰¼ø—4cAëüÓ¨OÖ>µÝçWÔÁ}½”Ƹ?o šç´F~±di¤aîèþ\ч¶dÒÍáønÞÏÛaÀ­±\3±»¦¥Pˤ‹È_²‹… ž\|G{n»±˜§æ` hÎÍ“Zà¿e/¯o40ò®LšPÈÓoçSåaÂSé_mâƒ6TÀYmŪ]ÓB!„B4X“¯aÒ-”@ªøóÓÖoIãóÿmä•W‘tä[­žÖqNþ|g«ŠÌt»²%‘&0F¶åž[éúa=÷M^Åg9!L˜E¨ôa-¹ãΖîØÉ³oa­1‚ÿÓ‚@ý16ùrÁÿug`u2o¾›NžpVòÛÔe<2;›êu©¨˜ˆ*áÃ'׳(ÓLÏ«¢ˆ0‚>4‚¯ °}3ßÍ' ³\.Áfmmb¸ëºPì¿mâ©G¶°JƸ{ÚiÔ.çÌNbæ¬,*q°uöŸL™¼Œ7vÖ3ଠ{yüŽe¼üm‰iåUƒ³ÜŽMS‹p:˜ä»B¹î¾nŒîé‰%Û†•ò ›™òÀ.EK7òàäeLyxÉ6°&îcê=ðÒ—”Ÿp<{z2ÿZFИ~Ì|¥CM…|;?ƒ|§vû¹*ʉßSÀÞ½ÅTÅ´¤9|ôi>å.íX´(^¾´ifeÛÇëxxê!*;´aü3z@ƵW…Pñõ¸g ŸîƒÈÎ>x(Z{ÔŽE+?­XÛ¶8,d±s.2eðþŒÌ|7‹Âzêú0}`8ãF*¬ý<“‚Úy5­X´ö©UŸM‘Ÿ&óVk›f52­sÅUœÅÜ'×ð‚4ö&Vc¥,.Ðy0⤠¥„Cû I,Ïv!„ÁF´ÞÆÎ•y¤%æ°ê€s»PÂŒ 3{à„\Щ3†ðüã!ËÒ!„Bˆ3§Éï0073ÕTÔ ¯íE¥$Õnó@%é×vÆ»¨Np0¬›O‚_Ç`BÐ2ioLª-`¦…W2UÑá´ÄÆêu…äå;Yôôï,ª}Éá¯ËÍ/íÎÕžN¶¾šLÒ1³.§ ‡ÃÝP_%aE.¹*ÉènÆ[Æ Âp²wEé©ðçÎôèS_æ ƒhFn*¥¨Haë £. $ÚG!_«¨ªâtÔÄãt¸°Û]õìh9§žèóÄH3åòÉÂJ]àéiÂŒÿªL>˜Aÿ;â¸ü¶Vìx껽fDu¹pØ]y`Äf§Ð7;ùpú°Æ^âGáoÛ™¿ÙÀ°{»rÕ ÍÙ1+4Ú/·v4elÙš‰—z? {ÊÕ#9¸E‹ÍF¹Î›ã{ÑÛ¥'( 0¢£Ge%©Å0xBîQÄþ¿2Y²¦K}3>ncÑîŸyV÷±8ݶ.¬vœÅ|ûa2;K¯T_]+FÚmGäþ}ÌO9fÔë6–zòÓ¬ÏzòÓëñöÒ£T—“êJgÍ:#nósý•Sçyë~›v~¹åîcÑÊAÕ8WT›‚\;æVQÜq,Ý+ÓyïÃ\ÊTPö%°<µ/£îÆÛØÈ*RÁÈIF/#FœØ[wáÅÉV~=ä#fಒ²·cr듌 šÔ‘ËooÃî§âkíB!þ l,ýt%cn _¾þ×7µò¿|±¯Ë&pAÄ Wþl,ýl !c¯¥—¿F| }]cã8]g >ñÏÔäUEvÀƒ0?JTôôh {Š)À…ÍV3¨p;W,,›¶†ïRtøÖ^><9 3ðЫتނíÌÉb‡W ú\Û’_ã“ÈjШӅÓY³ÕyL,Jͱ\‡Ç´ KÝ=¥æÿTô:@Ña:±%”Ú—ò¾]d/ÙÎÿvûÑûÚÎÜüH{2Ÿ>@vµ N’Öå¯âÜÛ|ñ7@F.ו„_‡æDëªYº¾ôt…ûí М¦L25Ú¯¦¸‰¸«¢ /ÏâÓíV8lv˧[,7 ñfÛ«kø(5˜G^ïJíè–">z-;ú†×)ˆÞ×÷ä¢~xnF*y}Ä^«öq  Ñ¶õô €Òr²«NèõÔµ±E+Æ÷²²dZ>å'v^w±húÔè»æöq¼ôhxÍ$À±ëVhåWo½¸9oµ¶Õ×?ÝÆÒ€ê¤àÛµ#‹­A¨ IDATÜ…yÛ>^^NzíãLju ?ÎXÉ*?=ÎJ1÷㎠UN°WÙ°ã…)'‘wç©ø]Õ6,.pdóÝùØË­Xœzª·µ¦ç?È„BˆsnõÇ á’VûÁí*eû׋(2‹ZœáÁ.v2~ûœí®gt´ÇݳbnN\ÿ~xšô8§‡gG“ß¿Z°3‡\ÌŒ¸¹ƒúF2î¾ÞÜþŸ(Â5ß'TJ䓇™Þà ô¥ß-}yôöæê¡*%LLtLXpcž¿9O¶"ä˜É°¼MI|¹ ’Ènâ…@Q0u 5ÃA‡Ñ¨ «gdn/(¡=퇆Êð® y“S):PH)>ôíïO`p}{˜!'Ä2gU5ŒDwöÁ?*œ~-N(ípâÀ@Ps<=M4óÕ×3 à׿o|p!ÿ7ÌsMÂàë…lÙì©ÔÓyL4=»D0´«r‹)¨g"E1 ó"4Ø„06ó"4ÌŒ—^¥:§œJ<éÜ3€°zÄ¡°”b‡vû(^þ ŠÓS¹;ëÈÀ©ñôf}Í-ÿ.=Íûµ 0zÕü›>¬7ÜÙ–ðôt¾_°›/6ØP‚¼ñiôä©V~Ú±€û¶­¯O>¶zÂßšu­ó ×õ­0¯ÛÏÚÜ“¿uÇ¢½ÏúêS«ïÚRykÖV^›µ•9螺{Rÿ;1¿†ÖË©¨¿º‹E+÷çJÍ“§Dš™Ê÷««ðnDÇö>xé@Í“sGðÀ%DõiÇU± E;rɳƒ-#—D§‰n|1z2¤£žÊ}¹dÛÁÇôW‡ñðøætêÉÈÞ]DΑóIÁ¿Wî¼»=±¾'¾{4v›Bq–) 4èãÈ…Í¢µ>ÕiÐûKsOå ç4>[‹Cˆ³£É§§™É¼û‰[®iÅÍw)ØóóYüú^v—«õÊ%1w¡™[¯îÁóà:#›Ÿ>餯 jnïèÍm×vgÚ¨LËä“y©ä:=U, ‰|½£wŽëHÏí;Øß¾/³î:z­·çƒГ*–<»Ž¥98sÒùâ·0îÕ•Ç[å²!Í1õßi`KJ`îWLÓ——GCeZŸ½ŸB¶Ô´4~ÞÆWôç©ÖI¬MVæ£38¶ô4–î áš[†0çÈûmÓ¿*Ó¸=_¥lÛ~>[Ñ…«/ïÊ=Ø‹ŠX±`?û«@¥ˆ¯ßLÀûö6Üù Kv._½ŸFn=WØ -cxljGî²Ó‡çÇT±ø™µür(ž÷~01áÒÞLÕY¹|· ™ ;¨í ð#ÌE‰Õ {ä@“JÙ®DVftcø#ƒiµf?Ÿ¯òä?Ãz1qó æÅ‘PŸ§G0^WS/Ë&ÖUX÷ýSEÑŠe¯Ó}ÛÖÓ'N=ðìÃØVÅ|3¿´Î•óÝÆ¢uþj×§VßuUU°¯â”꺱õÒØ:«»´Î•áÄèÈVÜúP«ší¶\Þx`'ûò3ùbQwŒîÂÿédo>À{‹J±”dóÉüî¼1–)}]îMbþ—ET«Àþ|ð«‘.îÊ}CEJ&ŸÌO!ç˜Ì-BéÙÇAüW‡ØB¼Ý&„Bœ6[K?_‹WûòÓ («´ãßéFõÂK[þ.þ\¶‰ÄbÿèÖ˜œJÍÝš®*2wo`ãÎr*xµèͨKûáa%å—ÏY’a̘çÉE7\FËÊ}¬úc ÉÅ6ŒÁ~É@¢½Ý}ƒpQ‘¸–ß×%Q\U‰Å  'úŠÿpyó¼ÚÛõG´î«ã3®ë1»p_íEµS|`ßì‹'ÏâE‹^#Õ7’ºÆÿŽâ¬ýs3sËQýZÓï’‹èî—{òcj‰¿|Á¶ÈñŒë¥ÿÆg¸fL0ë¿ØDH¯ÒÿJ"¯Â@ôQÄY¶±ö¯ Š]!ô¾ü2z…4ÅâŸBQUµQdYYYô8øLÇs~2yÑó‚æ„–ä±z·ÂÐÇp•áÏ=›Tï€[!„Bˆ³mãúµDDD4ªlVV!!!§u|ÍGBrYºð*»^Ée}"0W'³ìë•.žÀÁù¬øì ;_Æe=CqdlfñÒdbÆßH¿ ){Ó1¶jMsÏJvÿø=c®­(»Êùë›/Iêw c¢=À–Ū/ÇÒo,¶÷¢tçb~ÉëÉu£¢©ëAµ:‰_¿ÜLè×Ð; ‚Ý?-&»û5ŒlíÁ~Ìóý~U'çØmñÙ2XúñO´Á¨íhV¹%‹¶ã{y]ë"d³ú˟ɽŒK{„£¤SÞ¬áúÌ:×°¤üÊ›[p͸nøéd¯øœÕÍF3>®‚ß?þ‰¢ØË30 áÓßóˆ:†‹ãü(Þø%? áæË£ñ5 „²¤vCØí”™š1äÖ¼úÖ.1æñÝü´Æ?ÿ.„B!Ä¿™Þèöax* xEÒ¹d¤”R»‡$]G†ôŒÄË`Â/"š Óá̼‰îÒ‘Þ.Ê KQ=u”ç”Q×r\¶œÝ$™{0 ]3 Š‘ qøæ§Pìfí.WU>%úæ´ 0¢üˆla¤(ßÒÀÇ!hX|†b{µ'ÄÓ€)¸#=[ºÈH)9)~[î.©± éÑ/ƒïðhÂ5C07#¢ê ).p“œe¢mkßšž!€q‘xëh¡Yd$ÍPPuvU•Tåoã‡Ïv×<²¬:±)QG1?)^ŸÂÔ5$X *'9ÕJ`_oNéZ{ƒãÐáámÀUe¥d×"o.Àÿħ§w«c~õ©átެfcJ%±-SH×·á"?=œxqS§?~í6õÿT¼øw“ !„B!ÄÕÌÃF|‰ 5ÜP3`w”’oñ ̳ŽQ°j£´ÈŠ©…F3:K)ÕNð>a¤âÈÛÌò}¾Œ¼îr"<\”lObvíF¥öjÍoo<ƒc¸j|würOµG(Z)¬Yý#éèñk=’a­êøqçãŽs ñÄNy±S„7ÝÆrk·£[¬©^誊¨ª£êf"¬s–õ)ä©i¸¢‡á§çä !AIB!„BœQQ±nXËþÜ ª« IØ´ž ¯v´ö­~8ËI=˜M¥ÃNYòf6ä4#6ÆsH{Â,ûØ|¨»£ŠÜ»È¬®»l•ØUPqa+Ifw|ÉÑ1±bÄÛ¬R–[ŠÝé@Ö…hËNÖî/Àª‚«ºœÛñã|k›~YÊÎ"X2Ù‘ÈÀÑ×ríµ×pIŸº#<ñ8N@¯¨¸\õÄଠ=!‡*‡²ä-Gr>q Å#<ŽVÎ}¬Ý™E¥ÃAev<óOX­ûØØcH,ÑֿغÏFT[ÿS¿*¬ÍCˆcÉB!„Bˆ3ʯÓ(F–-gõ¢Yá4âÞa—t#àð•o ²,ZN¥1ŒŽ\JW= m¹à–®øœ÷þô$<®+mË0…÷¡Wð/,ž¿°ŽôŽÀ#ëð=hÑ» ž¿|Ã{µ`èuW2䊾¬ùã'¬´ ó¡Ý€Q„ø›ŽþÔµ³‚üœ¼ª\àBŸeüòÁÛ5¾~ñ¢Ž1pœk/¤UH5+V$ö ­ø@1êØÅ¢S¨0„ÑqDMÎ'ñhÉÐËû±zåï|ºÉ‚)¸ =‡G7Ùq\ì€!ˆŽ­|Mÿ€F ñ Gòèsuì©—ÿXò+ B!„BüÜë_IÐtdEþëèå~ÜðlÏYâ­!\vYG|tà²æ±í»Èès3cÛyžëðÀEÉöoX\>Œ†…ËUaqÆœ½3Ô3˜‰·QÇ“@ç½7—¾<й F1wÁHn•Ÿi::ßws_lMd›ö¼¼`·´—úþG9ßÏwᆜ›B!Φóe¹={YUNç‘EU[%všµ‹ž'œÉlÙã¤}\ˆLˆ3ªÉû“âá˰[»rE/|ô0 W)«>ÙÉ×[-ç×:ÎJ~›ºŒ5ã˜þp蹎¦I(žALœÑåÝÕ|.k_ÅZá@mf£Ú6ÕE¥¥öÝYÑ9,–›®Š ÚOÁš›ËÏïïey’ØnÌ|4üÈ T­¬`ç’½|²¤WÇã·`ÉᵇvqÀB̈́РƒÓR®æ••Õ¸0Òýñ ¸«Ã‰ñ9Ù9{¹â´÷醹sw^y8 €ÓFÆŽ4¾û,‰ý¥µ96"–¹{nÊù„z¡²Œ5ŸìäËÍÕ5瘛r˜¼èwm£dk~~ò‹÷Ø0¸Ïæ®u¾5êÅÙŽç_hCð±;ˈç™i)T´od»[Ýõ%è¦U×û¢/êÌÄ1á4÷„Š”L~ø`?ë2š}°ÊíwžÓèg.wm¤ÒUkŸtq[×ÚýEãÜB!þ±¼Z¦OÚŸ,úd ŠÁ€Î@Û!WÐ;ø|~;)Þö _n²5ðrzÉD¿8³šü ðìÔžñ}u,Ÿ½ ÿzâ•¶Œ½¤kv%’awWJOì=øݿ„¢æA˜÷¦’Eoc³§%`š0„ú”ðÎ#;Ø]¡à׿73îôfÕô5|¢§Ý•qÜ|i¡P•™Ë’{Xžì@Õ›é~SOnæ‹ã`*ëu ¸œ.Ž3÷å¸fàÀÖ«Y˜h`ð3ùÉtgŸK&Ok¼nôcì˸ 'žÅÕQŒéí‰>7¦&’å4Òúâ8& %Ì –ì\~ž¿‡?’¨Šûmºˆ¶<÷b ¡¤ÿæÌÙáæÇhBÑÓ|p,dží¯§:#‹ïæíc]¦³žùbk…‡ÕµZ‡Íé ÜZSÂØ*†{ni÷Ád~f¡ÝÕ±\s¿ƒ´Ç÷Z[:óÇ|›¢#æâÎ\>.Žôëøóȶ|s¨¶rVÒjׇч†Ó/´Š[ôôŒÿštŠœ¾ØÂk>zBÇ1¡¿“Õó÷±½ÄIYª ¢´÷YŸôvñ›-„+ÇÇ0%Àγ3Ó(p62·9=^Ú—[ø<Å“áwÅ1ä†Ölع$›»r ~=ã˜t}²™wSL øO7.Þ§÷‘YO}º£u¾hÔKa~¼RBäУ¹oË.§ÔÅ‘ç OµÝÝ÷¥½šumމåžëÃÑï:ÄGÛu ¸¡-7M±‘:õ ù±üší®×7¶Ÿ)øõu×Fûµ÷í¾®+4û‹ûsS!„8cL‘\rë ç:ŠãƒèÄû3 )±Ú(t‚©M w]Jù›xjŽaöaÜ=ÕÄ?On”ûméÙIÌœåÅôGBÙ?{5târœ^æÆÈ¶Üsk8ù­ç¾ .ºÞ1Û&GqhZ2¹š70¨ïHæ§är,•:þ\¤’Uª !ÝB ¤Š%Ÿ&°>ÃÅ–ÄRÖxZH·8Vf“¯ÇØÃ±ÇßÌV™YB⡚IÕ¥R“¢BhŸŠrX¸ÊƒÎFÒ% ƒU*iE@GY{'à ç`! jöhÖÜg}TÊS غ+Ÿ¢Ð`Þ‚NÍÒY]D£bÑÊá°êü2R’mdU:–zrwTY±âOPKüåñãs¿óMmnÍ]ë|7kÖK5ɬX;Í=¾6·Æµ»B„Û¾¤bw[×z¢z…âG‹¾Lfc®BfxO_J\ð!V4 –ºúBãú™Š—FQï>ë®ë͵Åëî/îÎM!„BñoÔäÖ„xÞøÐÅU5§sds^š×žý?ìbþâb*ëùê,*§ 4‡ÅA^± :ÌF{Z:Ë“£?<¿Dƒb éÓlò VV’Z ƒ'ôááEìÿ+“%kJ±¨ ¡1Í𥊕‹ÉË©duJ ¼Î@’z=Þ^zt€êrR]é<½Ç-TV» Îb¾ý0™¥GáƒhFn*¥¨Haë £. $ÚGÝí6…ôb§@Åépa·ŸÂdAù)øu &=!“†ðƤÚ×Úƒiá•Ln¹f‚TJgYí_—¾æ©ÃÜÌTSPQ“³½¨”¤ÃaÔþ·ý=#x »¿ÝêüOÜÖ­[yüB,oz ð¢|O>Éì-ÔÍÌÚ?ªÔNuî³åj¸(ϱFü½(ój\,9ÖaÊ…ÌpU²öí rÚåªþÚËìF_ÔáP*ËØôÃ>¾ü³ôÈøTs×:ßÏï„z)ªPzjí^¢Ù—´xúëkÊÕ¾AUØüÌG—|©3–ÓTW]kµQuƒyB]ת³¿¸=7…B!Ä¿Q“Oè< Ø’™»-Ÿ <Ø™Åä«:1pÓz–åjãuÕ®:¢ºÔã¯à9-l[RÀØ;[Ò³›‹ÖÎB>Ú^»&‚¥ˆÏŸ^ËŽ¾áÄu ¢÷õ=¹¨ßž›‘†rìo©ªÊ»³ÀÜ>Ž—?\œÊŒ'jPPQÐëE‡éTk»´œl÷F¯®ß‰=q›¢ý2wÜæ§XX6m ߥž‰ÚtQUT38 óS DEH¶±§˜’ÚW¥·ƒU­â¸©—„¥T©G¯Ò¦»/k¯Ò:Ë*°†ðpú…_X?ÞQûÂÁ!ø¯L£°3uí³átø57ÕVªŽE«\eퟩ_lâ“xЙ;¦ôÅ:}‹ìîË•uTîKbîÚxT³7ÝÆõbò„n”\Ë’Fæ®u¾¯Ñ¨—†8µv×îK9nŸËW©.q‚}¨Pð5J«]GXW,§«®ºÖ{¸o£Eé =çN¨kßš­«¿|“|^­,#„B!α&Ÿ0Ù‹çǪüþ^f½ëȽ»§÷ýZ¥|O2[*úpåX°n߯¾Ú«ˆú°\]9‹ðýÆLö9ð½ñÑ«d%—SEszönƆ]þ Š‚#V+ Fƒ‚ÁP3¤Öt.œõÈj©îØRykV@µV“[{ ¶³ª ¡DwöÁßH¿@ö©å©žðwÑBJ‰¢o¶¬ÕÑ·‡r2H,sjl«xq8q` ¨¹žiL'eåõ­7à.?•ÒùäцÞÃY·¸šVWÄ2Ô”Îf÷lý©ä[°3‡Ü«Û2âævä.«$òÒNŒËcîãG' ª²ŠØ°>ž>Ýã¸rB[çdRU»MÑ)èu5W‚õͼ(®À«osBœ%|=k? VðîÇýc[Ð50ùõ÷Ä“÷YFQ½ë(øDÒ5 ˜«†špÆd™BøˆÆÄ¢#\#‡ ‡¨èÐé]( (˜ k¦'¼›rA9dÌlú|?ëÒT¼=À‰Íy4ŽSË]iÀù^W½¨(&O¢¢½hRsIhÛb¼ªHM?z?éµ{™f_Êq{›„‹Ü­ù”^Ü’‹¯kCév‡™!7‘=*¸¥q}þ˜Ú;1‡’jBoª¿4öXg]^»õ¤þ¢ƒók)Z!„BqŽ5ù„Aîò¿øºeFOŽÅ t·T²ó›=¬Ë;ÍKr–RVm°2øRX±¼äÈí¹ÎÂ"Ê¢÷ôÆëÀ^TÄò…I¤ÚÀyð_ojÆÍWõcj·L¶@›ÚÝùôéˬ»üì¾çƒГ*–<»Ž3´¯ä¹ª*HØwò­»ö´4~ÞÆWôç©ÖI¬MVæÓû-K[Rs¿ò`☾¼<*Ó²øìý² jl°¥§±tW×Ü2„9·@Þo˜þUõ-)á.?Gfsš¹õê< ÚÈØ°ŸïyÐïF7庘ùù6¾Òuâ²ëzÒOŽ’R6~º?²UhÖ˜ÜUíó=ØM½8ÁÐ<’;ž8ú+ Ã'÷aøá_I8æ n÷g×ñ£F_ÒbM<È;_™86†IÝ "5“OÞO&Ó±¼¿ÃvZ¡uåð“V5@]u}ø®Œ“ú˾,.#„B!þUUUõ7++‹þ7¼€g0Ç«|µðTžÿ®›b0ââÏÅ÷õäBk<ÏMO©g‘½ºvb¢ßS#¸Õ§ö×NãÇ„'8ƒçûß‚‡/îlAØI?Õ¬bIKç×uUÈ[ŒBˆ³iãúµDDD4ªlVV!!!g8"!ÄßÑÙûaQKß|Ë)>ÿ]7cëö<ód$>Åy|õvú©O!šÖ<ßÿ¬å¬úöÀ¹ŽB!„Bˆ3êìÝa „B!„8+ä!Ä™p:Ó !„B!„âJ& „B!„Bq™0B!„B!ÄIdÂ@!„B!„'‘ !„B!„BœäìMx3ñ– Ìg`Wí☽`$wuÖŸ½5œ¹Cæ,Éí±g÷¸ç ÅD¿§G1wF["ÎÞr6-½7—¾<й F1÷ßܶB!„Bq‚&Ÿ0P<|~× f½Ñ‹Ã{óÚëý¹¡·™¿ã°Ìšt€é­åËçqÿ®x1éµÜÚáìdÕÇ;Û9œ7œ•ü6uÌΦú\Ç"„B!„ç‘&¿NìÙ©=ãûêX>{þôÄ+m{I ÖìJ$Ã)¦3/=Õœ¬_³ðÑ’h¥Œ?ßÝÆ·Ù޼Æ#¦ÝÙŠö>v-ÜÂ{«ªÐk”3uîÎ+°uÆj&üÌpn2äÙç’)éŒǃ9°8À "‰ö²°ý£Í|°¦§Þ›K§fL8€“­ÿ[Áüý5“úˆ¶<÷b ¡¤ÿæÌÙáh’úÔ<ž¢§ùàX&Ž 'Ú_OuFßÍÛǺL'ªb¢Ý•qÜ|i¡P•™Ë’{Xžì@§µO½™žz2q¸/®”lvyŒb¤õÅqLJ˜,Ù¹ü<$;ñéѕ秄8w-s·éñÄ`Æû¦1ëù$Xš¢ft„öïȤë"iÓL¡2-“ïçíg}¶ÕmœTÀåtáp¨'ïR«œÑ±/à‚œxWG1¦·'úÜ^˜šH–³îº^–Ü4}B!„B!šB“O8+,TDçA¡Ø< øiîjÕ˜(8Luºp¡§MÛ*f¿¸÷ä‚[¢ÙðÔAòÐÓ:ÎÉGïì"ûön »²%‘âÉÒ(—¯u@—ŠŠ‰Ø¨f>™F÷Ç2öª(–lŒ'Ý^szMÇ8¦?z|~ÙIÌœåÅôGBÙ?{5târ¸_aõÐ:ž1²-÷ÜNþGë¹oƒ‹®w ä¶ÉQš–L¾×^BÅ'kxytÛžn}ðH)Á¢±OsL †ûRðÃ&ÞÞåÏíÏ4‡‚šXLmb¸ëºPÊÜÄSkt {´ãî©&þ©xÒwîcþÊÜ?±£¢L\Ѧ’Ÿ_8ÔD“ kÉw¶Äwåž]â`н¹ñ?e˜™Fy´FœZ“VZù9,d±s.Ú}ˆ÷gRbµQè]`ÝuMrIÓ$/„BqIKK;×!!NÕ¨rM>a`Mˆç]\uQs:G6ç¥yíÙÿÃ.æ/.¦²Ž‹ºÇSIü=“”lº]V† ÂK©0PIú5…ñ.ª ëfÆS§]Ns ¶\Š\r+T’3ÐÝŒ·°k\…VUœŽš²N‡ »ý& ôz¼½ôèÕ夺҉³¾mn§à×1˜ô„L“jÿÙL ¯dò*+I-†Áúðp"öÿ•É’5¥XÔÃûª{ŸÍÚ4Û*þÜZJQ¶…uihãU³-°cͨàÏM¥)lÝaaÔ%Dû(¤Û9ðõ.þˆëǘËTR¾^ÏÒÔãå8“õâNKl¬^WH^¾“EOÿ΢ÚÂ5ãt× ëËÏ…Õ®‚³˜o?LfgéÑý(nêZ!„âß ±!Äù§É' tì ÉÌÝ–Ï„ ìÌbòU¸i=Ërë1àøá·‚rÌ›­f««Ž|ÝåTô:@Ña:){Ng;Tgý±³ûcâj8sû8^z4¼f!ÈâTfø0›Òà\]9‹ðýÆLö9ð½ñÑCžScŸI¥TÒ‚^}ýÙ²7€!ÑPs‹‡JÑBJ‰¢o¶¬ÕÑ·‡r2H,SAo¦ï­qô¨HåO=˜xgW®ÝµŽvÙš¤^ªRòȤ=]†Vê`àC½å8ÄóÓ’´ãÔh[ÍrG[ã¤|ôau×µB!„Bü4ù„Aîò¿øºeFOŽÅ t·T²ó›=¬ËkÈÀ_%¯8ˆ;^ §¹³Œ?ç&“ic#˹ÒÒøyG7^ÑŸ§Z'±6Z™ëÿ©Ÿ>}™u—ÿ‘¿{>x=©bɳëø1Ã…-=¥»B¸æ–!̹ò~ÛÀô¯Ê¨o©WU û*Ny›Ûãe&1w¡™[¯îÁóà:#›Ÿ>餯 ja eQŒ{zãu`/*bù¤#WîÝíÓ’Àçk›qëè¾<Ù9õéUûH€-)¹_y0qL_^ •iY|ö~ Ù…]˜ÐÅÆŸ3ø+QÏg=qçØýÌ.¶•h·}cêÅ™›Æûzs۵ݙ6*Ó2ùd^*¹NPÝÆ >}5ÚV£œ§›ºB!„Bˆ¿EUÕS¸÷þ¨¬¬,úÜðžÁL¯òÕÂB²î±u,/N$íÕ¼½§á«Ë7¶œB!„ÿׯ%""¢Qe³²² 9à !þŽšüƒ#,E|ó-XÏÚ…B!„BÑXgï!„B!ÄY!w!΄-z/„B!„Bˆ™0B!„B!ÄIdÂ@!„B!„'‘ !„B!„Bœä_9a  ÉÌŸ¦·×¹Žä,òêÅÔ¹ÒÕ|®áœÅò¯lw!„B!„h¤&ÿYECÄhþûêxüŠŠ±¢ÇèÌeãçïòɆ|ˆÍËO‡2ÿ¡ù´‚g·Gx}üf{v5áîËé;Nfö²xéÉÅd;ÁÔæ&^™bcΣ_“ê¨?&WáŸ<;y5Ë Ì¹ã™¬šþ!Oõ÷3Ñcžâ¥ë\¼{ç4Ö–×÷ã&"FÜÊ”qñQt•XôÖ|þH·R_Icó¡ügÊXºø€jMå—7çò[š¥Þrgœ>€^7ÞÃ=ýpª&¼•lV¼÷.ßï/Çu¶czÛÏm»Ÿa'öy]å!–Ì{_ªÎM½!„B!D#4ù„€³pÿ{h>­ ž1×ñò7»ã ö7²ÜA­B¾ý˜:óR7àDT+'kç¼Áâ4+`¦ÓíOòŸÎ4ËaÎí/±µª¶œ¹“ž{€ Û˜è6#‹=Ÿ•oÎáçŒÌ@ Ã¿÷ Üv€ø²˜†T :¿îÜtu ˧=Èy WNgÚ„N¬Ÿ¹ƒ*­‚úp.¾ç2¬Ÿ>Ã}ûª1G÷£·œõTïOÏ›e|ûB<ÒùaÖ[,MwvÙ³<ý5½³—j@ñëÍC/dóÔWXSì~ˆkŒÅMýsxïá—ØoÑá×k"÷íˆ_üJ\BÜÄÝcÚbr™ðt⇷>bM®C#è|ˆ½æ^nÐ »Óˆ¡`ï¼þ3I02äV¦\Ù Œj:¿¼õ«sõ´ŸF»kO³/i;Úwõ„]27÷`õ´u”jÖ‹™.ÌdôÞ¯H<Ž>:*wÎåùñX3mFßÇ”‘Tæpð`ƒZ~σÿ݃ÿ˜i<Ò:ÌÐöxØBnXWâô˘þ¿•¨Ìï4rB!„Bü3œ• ƒ£ôxù7Ãh-£ú”.µžB9§¥Yº ¯òöAáWLgê­ùýX±°oþs<âÙÇ߸üør–xÎþ–˜ç¢YøäüS¸Ã@Á£Õ¥Ü6(?ÈáÚî ›0p•mæ•)›kÿ2 ÀRXQï _G?ßl½—ço ÄT¶“ïæm©²P¼ÂðÙ1‹çæWrÙóL¿©ëfn!ÍÏ$_r ]ýö³© z\LäþŸx·D»²Ùè/¢W÷VdoK£dÛ‡¼¼­6Nÿ¾Ü6Þ“ŸŸŽíeà?ð!^¼­»fn L#–rA¶­¼óÌ$Vû2øÙ™\Ûùfn«c .ÅÆÿ=˯¹à3„~žèrËqi¶ŸF»kO³/5΄o3#•Y…X]õÔ‹ËAaª•Žã†³ã¥§¹ÿ˜»Ftþ}¹é2ß=ñkËöÄ+Œ´Õlu9tx³žT3ý>_<³à £ie^Iµ‘ù‰Ü…B!„kgeÂ@4„‡fwƆgÉ~~õk’l5 (èƒGðô»}qŠÑÏôÍõ–3Ös<µ*•é5Úòü*Œ]<šl±]³žL¸ÁŸßßþ‚,{ì©ï@1Ñ|ȸ¿Ï>æÏH¬w0¦÷ & 4ç¼igérŒÍ»Ò6¼37<ùã ^` Ã_eZ±¸*ȳ·áú'¢³9ñ‰öÆêmD¸œ…ìÞëÁýO>NÔÆmlÛ¸Õ §ùøƒÖñh|_:Üwæ »X83h׋˅½Ú%q +OxÄÄÔ†à²x’Ë]à,fçšt¬ýouRšY‚ÍRIUY%e6UNfrZùÍóH!„Bqþ9K$¬áÕ‡O¾j¯œ+xé¸5 ê/‡êEN©ùSÑÑ«–£G—×Yy _GPßQôlH§çºÞ“ðÀ:>s•/¾ÏŽúÖ1ÐÐóÆ)\²™¹/þNRUýC_—µ’ª’CìH®À¥BÎŽm”ŒŠ!ȰŽb[}¥8Ž I=ü‡…¤¥+Ðß7˜–‰:†8ÿdNº½ÞX@Å’½Ÿ?ÚÆÏèðj?ž½¬û_c?*¶ÌߘóÌb²N¼ýÁä>S›«™r…¿ÈÎrº?6‡«$_ÁžŸà¾Ð¶téÙ‹Á÷Î䊕/2ýçlòàH]4îKGû®ÏèKxü±)T<=‹-ZõRs@ªŠN¾ÓDQ”#S*êqAó·ê:ò*åtó;kç‘B!þIv¿>™×vü]Ò³Ï#̾»çÃÜBˆ†ù[^0t”fQОh_` 86sQ&¥ ¹/_‹Ë‰jôÂÜàZq‘¿ìeîý¿Gxä‘Çxäɹl-:ȧ'L˜¢¯dòíqìôŒÎŸ¾w>ÎX×÷¼ôÚÒ:' ê*ç,ÜÃ_¶X·óF‡ž€Ø.øå'RЀ³âEVftøwì„wNEµuæÌ[˯˜4±?ù¿n¤°ÞºÔrÑTÞ~r(!§Õ†K1¢WÀžµ‹ô€ômatøv¹†‰##ŽÌP¹‹E<•Ì*:¿N jã‰NWÛ æ(.Ûÿ¢Cl^ú%ó>;D`§°šùhDûÕs¼3Â…­¼›)@³Ro½¸c/J¡Ø7†HOèè:(êhÞš2¿ÃýS!„âX]ïŸÇ‚ ˜ÿê$¢Í1Üùú,X°€·e²@ˆ¿³¼†Á™áÌ[ÍÂß»s÷+ïp³ (ÛÃWol§¬ž«¡Æ¨Ñ‘›öÓi´û.­ã•6¸‰O¢Æ£sºbUUp•spÑ|–ç:q¹4êE«¶‹7óŪ¡üßË/qyn&û“²±DÔùßÒDùÁÑþ9oþ§·#!„Bü;8Ë8°ü¾ûm3‰%ü:\É=÷Ž¡½·8)Úú%ó¾ÞJvI)Ý|ûb+Xÿñ›|¹%«1˜n£ïâ¶‘-ñPÎq>Bü (ªª6ê¦ã¬¬,ú|¦ãçŠâIû ÏrKù›<ÿcV£oñMD1Ñ­ þ©ÛÙW¬#jÜtî7¼Ãã_¦I[ !„â$ׯ%""¢Qe³²² 9í\%«yñ©µ\üß'éï«€³„Ý+÷âѵ1~Å,ÿß 6ô}Ž©‡ +߯S$úÁ§QÄòYs84êInï€+~.O~Ä”çÇÑÊžF|q£|þž·J ñ7ó·¼Ã@œY:ÿ>ÜùÄÚ,aÎ72Yp^R8›õäæiס·‚±r çdH[ !„âïCïO× ¡:ÊÉMÉGõÕS”ýâ ¥©äc¸¢¹Š1„ØŽ&V¥T¢ë€âŒ¹ê,$²K+:ùžëD„ø÷ «d sŸØr®Ãš䮚Ǔ«ÎuB!„äª þ—|¶±‚°ØXB—£fÁf}`Z«Ÿ³=­ŠÖ- ØùW5cüÑJÔUüJ©°&|ÎŒŸ[qß”AêUœ•)ü2ãö~…Çûú"¿ (Ĺ!¿F"„B!„8‡T,™”Ú8UÕ’OŽ%váf™,â’G„B!„ç‚_³çCþûØOèLFtÍé}㌎2žëà„øW“ !„B!Ä9¥xD2üö© ?×!Ž#$!„B!„â$2a „B!„Bˆ“È„B!„B!N"B!„B!„8‰L!„B!„â$2a „B!„Bˆ“È„B!„B!Nb8×!„B!þ9ª.ÞØQÄŠôJò«ç:œ ñÔsA”÷uÀl8z]õ|ÉÇ]|B4%™0B!„Bœ1¯ï(⛃eç:ŒS–_í䫸RëtäßÏ—|ÜÅ'DS’©)!„B!ij,­ò\‡pZ~O­8îïó-Ÿã¢)É„B!„âŒ)±ü}C¨Kñ ñŸoùœŸMI& „B!„Bq™0B!„B!ÄIþÆÂFÜˬyoóö³™õôU´2ݪ ÉÌŸ¦·×¹‹°!þ.qÖOÁwàTÞ}(Ͻ^»ýÎ ﮓ™ýÌ‚õ€W/¦¾ÿÝ–PÓÆÒ§Þ—Œ´û8ÿó6Ÿü ]Í ,æÕ‹©sOáõkuô‰ÓȽî6jh;œê9æ&‡•Ææ~fëìܼÏ×Ccc9ï?«ÎÛ÷¥S9oùž|š±œ÷mÛ`§pÞž£Ï÷N]Ÿ>ŸÈHV_âƒ/`ð àÓ룸ÖG9ͽêhãOï³ð>`ðõçãëÎDÌg2!šÆYø•=A½¯çž‰Ché©@ù~~|û=–$Tá:ÝÂ|Y[ö½ú â­'mvþɳ“Wã°œÎAÎsGîxf«¦ÈÁ“Ã<â<Ûêi¿sÂØ’KoŒf˼)8׆5"·}Ém´“ºè¿<¾¬/ÏÎt†ÿ‡9Ã}¢î6jâv8)Z\ø^.=jÎ Þ{ãö•»!ƒ'qÿ¸Žxº@)ÛÁ§¯}Áö’z¶)´ºøvî6ÎD~zç#Öä8#neÊ¸Îø¨ ºÊ,zk>¤[QÑáѬ9\ÎÍ7IJý¹Çø<Å^¸Fœ1Üþú³ôµåQᬩÌÅsxýÏ<œš¹kå§QΣ-ž»Ÿ!áø{»(/."mñÿ˜ñKŽ4Á9yŸwÓwËßû³J«žOÎÍ{òYmÛz¾–óé3ÜSÿœþwp”—òÔ²JŠ*O>#uÐðñ‚NOŸþø”²Õrjg÷)pT”1uYU1Ÿ*­ü…84ù„.p wßÝÄWâ¥x+Íz߯37cû KÈv:‰{Æ´Ãä£åß¼ù  àÛ©3/ us¾ADµr²vÎ,N³bj;žÇïD›¨œÿ÷l ¶äoyåÝÍ”¸ÌtºýIþÓ9æa9̹ý%¶VÕ£˜i3ú>¦Œ ¤¢0‡ƒÔò{üï.ª½z1õÕ¡üøÀv[À»ß3̹`1÷ÏØE5fº<0“Ñ{¿"mð8úè¨Ü9—çÄcÕù{ͽÜ> v§CÁ*Þyýg’,*˜;0鹸°‰n3b±ØóYùæ~ÎpqÒ¸zѦ‘BÜÄÝcÚbr™ðt⇷>bM®´òS¼h7ö~þo˜7Åyd7£!ãêk?­8뮕æc¦ñHë42CÛãu` ¹a]‰Ó/cúÿV6ð‹ƒŽ A700ó+žKµóïÞt›ð(×tˆ Ì3›^y_ÓlmT_,u­‹VßÕêKš}P«:4Ú@ïOÏ›e|ûB<ÒùaÖ[,M·iïS«jZ}^ó|Ъk­~VOŸp—{=ï!îÏw šç˜!·2åÊVèl`TÓùå­X]O_Ò‡ aòx?~›ú0+ ½èzÛtî·›G>LÀî߇Ûo ágcEžcžã‰ ±ì{/VÍm}™4Ö›ÅMeS„^ö"/ÞÔ‰­³vcõëÎMW²|Úƒü‘§qåt¦MèÄú™;°EŽâž‰mÉÛ¼‹]y1Ç¥®§UñÄϵ‡¹O¼Âv·õxrî:ªµÚÝšÈgOÝÇ·íocöäbf>þ=GO!Áý®ç®«;á£3a¶䇷?be– Í÷y­¾«u¾×wnºí»ÚŸ9çEŽÆÍ¸õµ©|—y¸‚MÄÜú2·¤¿ÌóËËÒzÿtsnê4ú ûÓP_ï{¹ÛÏi­óVó}BKC>;ê ù¢Õ'ùA«/i~iÔgc߯}ú2uÖE$n¶Ñ±C8Áæ,Ï~‹%G¾/¹ù|×*×ØÏª¦øœþÛQˆjÆÌžÞ„©N•êŽBLÞ<Q3|—ÁZ/ó.õa{¶ž¡ÁN¾\™Ë¶`¦wõ"P¯`-,æ©u%$9š· azOZª KXäðå®\F34'Ÿ{ÖUâÓ:”»{¦‡Š¢^^WÄ+àqâqrX|*v£ÏŽòç“ï2XeSˆˆùöî;:ªjmàðoΔôNHïU‘âwQPT¸`CE”&J54C  ä*E@@‰"xmH¹Ø@@¤ƒ„ é=™L¦|#Ì™! ú>k¹–dæìó¾{ïSöžSŠÅx^ëÆÐ*ñ°ج&¾ÜÇ'9®Åþ¶*÷ºü J.ël9ÿ e>aàZ³=5S·±üÚiû—ñÆþÂÏÿ޼<0-oMd{ІJ½¦1í…fDÏÛO–ÅŒÆ'e÷|2S©w8“{×ä‡Å'É?óá“öñï9/’9w*®^¿9¾|*oº5cüûß‹âÛ†A½¾š0‰™~Ü?a.ÝMÎì̤\È'ô‰84ó-F]4þù«„âI€i?‹Ã¶p&Ï‹NS"x²Ñ"ä‚1†¨w¿¤ÎÔDM\~Ó¬±Jœ¥­—Ræ ø¶aH76N›ÊÁLðí0†CZs$b7™*ù)þíÜ3ŸÏÆÎaoŽ­F½K{'jÓ¤Ú~*qÚ­—CXÍ ìbÅÊ<ÂGX…îí>TwÝF²oÂÑx4àñGõ|ñ;Y×M1k܃ð:ô.S—çR¥ÿ,&ô®É–Å1”2–T½J][íÇ¢Þwí÷%õ>¨B­__«ÏCï0uy.½¦>¨)¿Fì#KusRÙŽÔ¨õy•Ï ÔúµÕq,j}¢ÄÜU“Pi#ªÛ˜¾ = aϼ)ü/Üët¦­ŸJBVѯ$%å ó¯‰_êa¢S-`Í"fg Êó¡økcI nAÕä_9œá‚—§•äûÉ} )Aúh®ª|vÁ”EºÅ _w2µ¸»+d'fa¬™{™;b﵈tht`LÉÆ˜/o&r&  ¦on¸LZ-ΫO¼ÜªðȸÙ[•_&‡±=:½ÂÐuØuœ\›J»;è»v·wÛ¦ýTŽ9å&‡4Î&¹q€mNmZ×3} …J! Wvç‚Ú6ʶ©ÒÕ¨îË]ì§sJylT£zœVé§êÇiµýRéβ}Tú’ÊñHõ¼ÇVÊýµÕ‚Æ+„Š¿eÚÊlü»OfÆ ¦ìœ½—,ìßó,g—êùY§ï1:o_"ZëY¿ù,k34Ô½/„UUKþ®‹·'Žžã™ßÌh¼ýXÒÐBäæó+PhÞ6„±Õ³•ìżv.lþþ<Ÿ¥ÛðóTÈÊË&  2¹?_`Iº ·?‹[ëùïÿα.GCó–Õ™Û6ŸÇwäyÓzng<®óöåíbœd©@[}¿É&[¯ÃÓbëZñ¿¡w\Ö°³· $q/)ó ƒ§Š1Üh†Ê©œv€ã×.M>ö;9…¨ßO`˽ÀáK…{ά¤\ô]në¡ º€ZTÈŒá\–,iþåùmYÒJAžã™Íl»ù@eÍ&± OOè€b²àYÃ|ý-_Út½²©û9è+7¡v¥F ˜ø6ýtî` ÂWL•üôëâŸ͹\+Xsˆ=‡©E)“v"Nûõrˆ,d\IÇdÌ!73‡L“‰\‹WE‡¥:ª<4€:ûW²*áÆC†-ç ;gNv]ÌD_Çå6bQ¯kû±”¾ï–’ƒ~mË»Èo' ¦©Ç£ÉîQ í>²Tg*Û‘j}ÞÞgêuí(•>a/÷[ÈÇYªÛ˜%…£Ñ.Œš8ž=8°g7;b³®ÛCAÒ)ý;Ó"èg~Hp¡^›zøº¦`Ð€âæ‰.? mÓ1,|-ˆ°“‚pÓªfË9Ægÿ}€ióé–¢%Pw”¦]à†kN4*w~Q­³|öœêqR϶¯¿%éלHw¡n¿IŒ}-ž 3¶“¢²©å@ýåÔ‚›Q5óPѾ eçbfítjQ»}Wu{wx̹—sÈ!é\U+P­Ît-`ýåÏ©â“ÁéD“ú6û¥[샨ìËÕŽÓ¦286:>vØY®Ô±”îœÁTʾ¤zÞcºýuþEvŸ(<†gÄÆûp-üµ…{ÇwGË©¹Óç­'~A^'¥°)Ã؈O7c¶3a`5åñÅ¥ÂA|P%ošúhßÝ+ ÕkÈËR¨XÉ›jÉɬO·bR³- ½qXPÉ‹*)Éü”]¸ÎßOeñµu9ºi=·#ÀNŒy2ø­EEÞë`à“éüœšäâs¦,!î¦2Ÿ0ÈOÏÀìVO2-€F‡§·Ž¼Œ?nàºé6¶?ŽV Ö;x;F£ASt¨±aS)\Q47Ef%7µø/†ZýÑ[Êñ38œåB³q‘ô»3ÑÞøÏ;R/%ç6LW¾'2lq7}h¨£žŸFÑ]Þ¨ÕÝ©š½8Á~½\מ6kQ+;óøÅ¿ÿîœÀSÎ?´š‹êºx•—&ûu­Ë­ôÝ;Áq¿6c¾>ÛŸÿÐWœÉºSI¦ó_ñžÃ©µíŸŠmj}Þîgêu­‹jŸPÉ]5‡R²»Y³9öÑFV¬Mã-é4<‚ÞÛf¾1³JÖÔ_Y²ªÃÆÎ¦{^'£/‘š‘B¶¬¹Y¸xc;ý³æpEÛSyõÏtÁ½x½o6ËFŽæH&ø·ÉôQ]9¾¥ð– ­-Žà©À½,™ñgKšA¾‰Zœ¶¼ólßpþÚ7Íœùu©÷×&@¿”|•ÜUr@¥Îœh¥[úöŸ•ÜwÕ¶wGÛæ½ƒ™”s)¸·¯K+ïD¾^o u³Ú¸)Wø-ÇŠê6m(\Þî¶©Òíï³Wì§=6:¿ŸPߟ©íwKœ¾õs†ÂgÍ•vϧrÞSÚýµÕ†¥¨á4×— v|W[îúußʱêNÑhÀæø'œ?\¿½å$$1lkÙ×}^©~ágjå•Ôoþþh.{1‚‰‰ßæÐ Ä—¡]kÒçÈÆœÉ,þ·ËΔ%ÄÝSæSVùg!Æ·+=z¡ àÕð)¦†"ÔMƒ)þ(q~-hè«:*6¾×óÇH,£«n RÏ“æU‡ªn hýhÒ1¤ðÀj"/|\À•*‚pæ¡ýZ7? Y¸’kEñnHÇZn(Êõ'õlzw\o¡¦{5§§ IDATÿòz‰;Â%¿ö´©b¼?γ݃ѡžŸ9é i¾ ©á¡€âKÃ6Uq)›2ª¡ýúàþã9èÌõÇ·‹Z]«Å¢Úw)EtÔ¯5n!4¯îŠßІx\=Kêµó©‚ _1eØ0^~iÃg^?Y cé¶?5ªu­ÆAŸ°›{ä º¹†Ð­o;|SO³÷»µ,]}ÿ†A…ýB-?5=O±b⛌ û€ƒ^Á¤í‰&Ý ¦+û¹Љ殗ˆ>™Œ_»¶¸žÍ¹ÏO:fưfÜÎîնwÕmóoƒ)ñ<u»Ð2ç7:‚¡kg*¦Ÿ&±Àñ6mwÛtÐK³ÏR;¨n·¥ÜO8ÊÝ^eqœV‹Åa_²s<*õñÝáþº ÍCÜРà]«n «Ô‹µ³\ìçR§ï5éɹdúÒÉ]- +pæe) Y$Ðß_A¸¸éñU %!›Ä@zyk ~¾|°‘eU¨hÐ-àǃž@¡q=ü³¸ÓW÷Û‹ÑÅÓ†.VNœOaæÑT5à]Âß\œ(Kˆ»©Ì¯0°f`Ù{ÕxuÈ–x(}’õï-ãDž kÞ.–­®Çk“fÒÓ¤à’{„ çvªéØaíñ×yPÕÛé³éoŒeÍÜ•NÛËší]xmÖLN¸Â‰³ñƒ¯­,ÿ ›w( 8–Vq)$e$“‡âpžÜxf3ÛL¯2.¬qWO±{ýqžë÷ ]c±%ÞŒ5#šŸO÷aÔ{‘ddæp~ÃX´=E-ÎÔ;_/j¬ûX¾¼>#^ŸA;,gX¿ 3`QË/a7ŸnmÇðÙôNŠ#&6cPÙ½Æj·^4x–²L]pw†þNÔ§ ·tIZicQ«kµX¬*}WµÏgÙìöA]'ûRs¼´žTóõæåðÙäää£Y«ˆQk÷,-¶ìd”.ÃX‰ Ïx¾|爃ç8PÊíOZ]«QíŠJî*9¨µÑ‰ þvÛádªÊ6fJ#^?€Ñ³{QPz®²ié òå`Í!Ã÷~Þ˜×ÕFöñu,þájá÷2°òÓFŒœ8Þ°&îbÉ‚S…cSûìì·¬:8Œa3g’—¯ÁM—ÂÖ•[ˆ7ƒ¾æÃ<ó@U Ï1­Uaæ¸ïˆŒü‰Ä Ýyýÿ#X¯Ç¯r”q´ÊŠeÍÌ¥ìËV‰óÊ>ß?Œ!s磵(²Ÿî!Í º**Û‘JªuvÓ[¦.ìüç[Òv³lu]^›ÁCf0äÇðÍÂcdÛl›*;µí]혳]±Ÿƒú±±üä°%å½Ñ¬9MvšGxêWâȵ:ئU¶M} û}0¾”ûÇ@m»UÙO¸¨ì“O–rfQ‰EýØ¡’»Z,*}©pÙ’G–Rž÷8:†Ûò2PFØ€@½’X7ß¹c•ÝåJy¬*ÍqúýíÉŽ½‡ä§¥v"˜ˆÇj1"§€£ &’˜×,ÈHã=z¨ÁSÈÏÍáýí‰lIOeì=3{ÖbˆÍFNFS·§òã)˺ÕäËødFíHcÜ~=3ªÉ«ÈKË`üÎ2îpn%ǘÄQ_^mD ¢Áƒ|VîÈGçëwÓߌäâá8ß\¹tEÜ=›ÍÎõ´ÄÅÅÑ®C§;OÙҸܴ1¾rŒÙȪ. õ )¹Ó9ÖNšGüSŒnmàÔGYî2œkãR–Á£YðÆ'Ô›Á#• ‡`æ¸ Ìù²2£F´ÂÓr‰/&Î!eÈ;¼ê‚9ë";?šË5CygxÜ5·²²öÏ~“z—‰-Üï\¦s¬Á…îcx¥kš„Cüøs­ö¢–«…+›Â™²É›ÇG>ËÕlœÛº’ßðøÌ‰ôÒ‚ùú]ï\\ÂiQQQtèÐá––‘ !„B!D¹f²ðÁ‰oѨ_‰“/Ö˜“Yxâ¶UrA†üë©z¼õ圯À×GCxbZ­k“6Œ—~æãeßp .—xaÔZ¸ždÁø¯©õh-~ÿi? ¨Ög cúÔÂ5ÿº‰€Š¹œøa-ÿݼ‡Ø43Þ¡2rt?ê{”4Ú·~ü.-»Püc :¯ê´½¿&k?¿L–µ1JÜ6¢–Ãoç³q«ÖŠ>Cž£GMw4æDv®ü«»J¾>æ}Ÿ¥UôBφÃâuÃæŒ¤æñÏX¼v/qid›t4»˜1õβ`Âzê÷ b纃è{OaRÏ@ Jª}*³ýiÖªþîZ¨Ù'k^ 9÷ë6%ÓjØ8þêhÔûU^:;ŽÖŸ¦óK¡ÈÁ½Iža „B!„(פœ"Ï’O¿]Š}¶þâ¯LØ· €µ»ñ[âq² ò씤Á§ù“<¤ÿ‰E ¾!çþ'iéS8b·åŰfþ·Xz‹EË1¾õ9>]}Œwšm—ðÒÛóyorRþ÷Ñ9¶›Ê¶`Ò5à©°…|¼|½ ~à“_’°”†-“‡5´¨ïEñé±lÿþ .uëàcŠaÍ»ÿ%½ãë¼·|!ã»›øöÝUͶa<õkO5áÍE+øpÞ0 ¡í¨·y¶º+ G/dÅ¢1´´âãU'¹oä»,^6‡Aõi3ê]†ßçV¸ºÜã¬?R‹WßYÀäžQìÕƒkz4Ëâ«ùËØtä*ÆëÒ7Åâ4 éR×ãÏ|4^4¸¿.'“P`§9D¹'B!„Bˆr-.7™`·Ü´.XÍÌ:ò)ÉÆ 6^Ú͌ßХRj{c±Y¹š—j¿0]EZ´ô$á¢+mÛV*ºäÚû#<þEÿö•0h\¨ÚñAÎ ÎèƒéÒ³ : † TUR¹šm½±\­M{t¦¾¿…Ä‹‰Ø¼µ¤œN¢¤±²-;–ƒùièwÝpÌ’Á¯3_bðàgyiܨð$o ¨‹-öö*]x²kM<õîTëô$==óýÉ ¸åœæHL2Ï4ªîYl€gI?O‚¡.ƒ]Ðè+Ò°+çrPþø¢¶ûv¤’A£^Z½2“±Ý]9¼b¯Œy‡/%c,Ù‰äzTÆç¦ë×õ~Áxä%’U⬉¸È- B!„BˆrÍUk ×l@ƒ†Ë9I<³}ÉùLmþ,½ªµ Çœ€›Îþ lÙÇX¿Ã…N­rÙº)†nCâ®±aLK!ó fû±pÐm+ WÓ¤øbÃj»é k6'7|HÔ®,*5lHE4XÍVn¾ ïÜ~2ë?LíuÔúÐñ­›ïï·‘––Jws|ÿ¹é|¨âmå·ä\´­güЬùï^‹ªK¯ç‡Ð§ÁëÒ4 –íö_È¥VH‡ŽæQ¥ŸE«V\ðtÑ­Ïn=Ø c íñó fðÕæ ®d*øVpGAG…f1¢i/[AøâO©ÿÎS7–àV“NM>Y5‹cA-_æ¹&ž%Ü ñçúJ¬lØl4@ñ zç§è÷ólŽÍ¤_ƒxgŸ&)ßFuýŸ“yñÈöjŠŸŒ:ïY2Ù#„B!„(×jxV¢m`æý¾«Í†‹VÏ»m_½a² -?‹e1è_ã~MÉÃakÚ^ÖlÑѳo#¼üZÑÿ~›× à ®µ{Ð"g«·_$× –¬KœŽ7–x…@‰e3®Ý×oÅ€~½zÝítVÀÇÁ+•iQÅàT¹®µ{Ðʼµ[Ï‘]Ë¥_>çûì&ô u#çäwlÚ•|ôxàŠ«ÆOHŽMÀh6aÎ9Φ߫2pB83§0â±Fx©ŒíÕC^ìg„M^ÆÑqdæf“½…Ÿ.{R·†7† V´öŽåû})^‘aIdÏçñkÓŒ@™0¸gIÓ !„B!ʽ·š fðöY¼¹w1ã› ÈÍ¿è³è´óL?ô1•Üüy¶îÿÙ-#vý—\jü¯U*…<ÔŸzÖ°álSÕiÀ 7ç“#xõã´Þ5hÿôkÔlå\|.u£OÈ|æ ݆{í.<Ö¥>ž'¯}h¨LÓÚ™,_ù+žIá¬+sòµ÷üûÍþD-ŸÏ¨Õ9¸…´¤Ï˜çiê©ç¢'þóY _œ…Õµ 'Ô̓üǺã5 /ýʳo¡µß¼3ì™ÂW*ÔïÆ ÃŸ¤q s÷’ëá¹}x¶óÖ. #*µwM: x§j@S•ÿÔ†_ÌcyÁÓÜbãÜÖÕ|™ÑÑ=«þ9è¼öœ†_ÿø·rŸ¬ï\Eˆ»Bc³Ý|ósâââhסӎG!„Bq›öìÚIppp©–‹‹+õ²eíRN"oí_Îñô ÜçW“ ®>\Ⱥʙ¬8®Öž Mâ¡+Ï/ð³°yŸù`tÛ’ÞpçåŸþ„ðokðúë ÐÚ°äœcCø,Ž=É[íîd 2Nnáëu›ØMÍ.ýðdøh/*þQQQtèÐá––‘+ „B!„÷„jù¸ËDö$Fs(5‹ÕB¨O‚êr·ÃsÌšÎñ£:Z¼ìñ—L€ cÒeÒ ª^{ ¡[^"ñÆêUv½Ã1hñ íÉócêã=u¿i½ñÔÚ°ZÌØÚ¿&aq‡ÉB!„BüÍü]¯0·Î–‰Ÿ?^Îúcé(.z—Ê´î;˜~­*¢/£uZÒŽòíGŸñÓÑ+d¹4åµ¹oÐÎGf î6¹Â@!„B!DK5:ÿÂujýšÐoLúý…ëeCÞ’ „B!„BˆbdÂ@!„B!„ÅÈ„B!„B!Š‘ !„B!„B#B!„B!„(æ®Nè‚{óöÜÔq½óe+º±ê-Z¹ßù²¯W–9ÒàÕa2Œ¹7‡ßÕS½ïxæD.â³U¯ÓÄɘn7‡¿ª®ËBÙ·ß½í–ÛÖ½%“—Øë{w§þÝ•‡6B!„OwuÂÀ¿…51Íø@E´7èR›ÏzŸ%+?aíç«øpI$“vú=Ö”­L:ƒ¹w8蛨åàÞb<«?d@u §ÆÀ÷X»b(¡ev^À…oæ0~ò*N_J-]pÞýüV,]IJe‘L{ùAj¸ÝØmþªºÀ5”—f.æƒÆ•Z}F2¢»?Ù)W9uÊŽÕ¾æõ9GÈS”Ü[2y~¾ÉQ#x´ #òÁ Œš}„<Ôèl?ˆaÖÆ`5àf9ͺ…ó‹£v,ÉÛ™3f9§©D‡—&1áåTÆ.8L–U¥®q¥ñèúDÎÅNOÐÚO!ç𦭌!_-µ¶u­ÏsSGÓ­–¦³`,HbÛ‚H6^6«×§Z,*¹+þ6¬)gæŽafL>>­†6ø~¾½™xµvPéó¥ÊÁFåG§ófÍ‹\©X÷“ûHjÂ}Ú Ÿ·ƒ=ß]áÑžMðÙ÷+éVÐVhM÷ ¾:œU­ïª¶‘JÛª– h}i1h,ýëèr‰uï,ä»K&ÕÞYÚþ)mTNÚH­>…B!Ä=«ì' ôUèñh{æMá à^§3mýÜP²°Ö´ßølç¿Ñ»:ÑŸ#߉"¿v }¶*¿Lc{ tz…¡=ê°7ê8¹6#Ç—OåM·fŒÿá´˜Ñø£ìžÏ¢Sf*õgrïšü°ø$¾mÔKá« “Ø™éÇýæÒÝtíäZñ$À´ŸÅa[8“çE§)<Ùh  ÏÎÕrÈ;½ƒËõ{Ь¹šg÷p%4°°Hÿ޼<0-oMd{ІJ½¦1í…fDÏÛOŽ;÷Ìç³±sØ›ãA«QïÒþ6›AñmÃþnlœ6•ƒ™àÛa 3†´æHÄn2­Îµƒ-ÿ*{¾øÌ|€š†Ã5ªÔ5fR.äúÄšù£.±9K¶JÛcˆz÷KêL­AÔÄ场.Hµú̲ÙE­ý\k¶§fê6–ÇæbÒö/ãýNT¶ZŸ/U‡°š<ØÅŠ•y„4°&, ÝÛ}¨îºƒ¿çÌ€^´ôßÍ–d AíÀçÈ'œÈ¶N­ïªÕ‹JÛ:Ø4îAxz‡©Ës ì5ðAMù5bY6ì*mÿ”6*'m¤-¹>IÈr¢1„B!DyUö–ŽF»0jâxBöàÀžÝìˆ-œ,(dæÊ÷k8>Î?Îæ§$«Ja… Áͨšyˆãé…ßMÙ¹˜Y; Ç–{× GYI¹è» º€ZTÈŒá\–,iþåùm¯-dÍ&± OOè€b²àYÃ|= \ËÃ~¶¼Süx¼-CŸÎgûâýÔ¼6a`¨Ü˜ÊiŠrH>ö;9…¨ß©b]üÓ¢9—kk±‡â0µp.?{ô•›P»R#L|›þ:w0á«@á¶Îµƒ%;‰¥-^z UFX)È3c<³™m7 ÐÕb1•²mÕê3Ëd?–B%å®`ðô@1¦“ë¸KÞÈaŸ¿Õ‘ƒ…Œ+阌9äfæi2‘k1àªh°eE³ùØ`´©À¶\èÔEÏo‹c ¯8Qí»ŽêÅÛƒ-ï"¿,Ì7õx4Ù=já¯ÝG–ÊÍ¥ëŸÒFvýÕmd§>…B!Ľ­ì' ¬Ùûh#+Ö¦q‹–tAïm3ßÏ禶œ|¹áÞz²1¿}p„,§Nþ5Ž¿Rb<¬%œuk44E§ã6l×}ÉP«#zkX1~‡³\h6.’~7-o?‡|Îÿø' yl+ ¦Z6¶k«Õ(Ú¢Û´:ûw9+ŠÆÉš°aºò=‘aˆ³Øù†í õ®ŒgA éÎ ]¬ä¦fS|uöc)|¼C)ÛV¥>íÇrí«År·’ŸžÙ­ž dZOoyÆbåÜÐNôù[Ïáº>i³õÔÂoçr껸¿Üžj±ž´³ìäÝ …——;î»êõRÇeš1_ß=lÎô•ÒôOi#{þú6*¹>§nŒ¿…¨…B!DySö=t ¡[ßvø¦žfïwkYºú4þ ƒ0Üð%+)¿®aOÈSô 1Ø)èO¦¸#\ñiÎ}~  Ðy43†5ó´ãL  õ…B!Ľ­ì¯00¥¯ÀèÙ½((=WÙ´ôDñô™.±yíe¦êÈ–Ù?“¬«Í¿§Ž¢s%?|=¬L]Ø™‹æ1{Sæ´Ý,[]—×&Eð ù1|³ðÙ6Їôa̰öøë<¨êíGÈôÙô7ƲfîJ«œ[Óö²f{^›5“‡®pâl<ÆàÂ_ÝŒg6³Íô*ãÂwõ»×ç¹~ÏÐ5f[⯟¸1µ‡–[Sw±lu=^›4“ž&—Ü#¬Xø;96 u7ŸnmÇðÙôNŠ#&6cеsþ6ïP:q,­âRHÊH& àRçIƾÔ/­'Õ|½y9|69y'ùhÖ*NfìcùòúŒx}íL`°œaý‚¤â¿¦Þ”C: ­p?ãßoŽYk!éÀ:æ­:A®£ºV¹Ùª‹JÛ.Íϧû0ê½H22s8¿á?,ÚžŒE­>usÌ:À²÷ªñê9,ñP û$ëß[Ɖ<hì·ƒ£>ë9hðt»9ŽÛÌDÌañòä¢_£Õû®ýKyÔÚöˆZ™YZlÙÉ(]†6°Ažñ|ùβleÓ?¥ÊIÙ©O!„BqoÓØlN]‹ZL\\í:tºÓñÜ=W‚›6Æ÷ÂAާ)„<Î(ÝbƯ½èÄ%ÊB!„B”{ví$88¸TËÆÅÅ•zY!DùE‡ni™¿àµŠ÷›‹O O m>èsyY& „B!„Bü#É„A3 Û—2qûÝŽC!„B!„([V«•ƒ‡{ö v­Z´hÖô†g_É„B!„Bñsðð~>^ôïߣ£Ñh eóæE+û·$!„B!„¢\‰={¶ØßNŸ¹ño2a „B!„BüÃäå{wa±¿É„B!„B!йûº`úÎbå{Ì™5œµÎ,DÕÞo0kîDE1£«ßí'âÞ’ÉŽ£™ÛíTÆe–CJ…îD¬z‹VîÎ.¡§zßñ̉\Äg«^§‰«³+ò§ÛŒÿðJ¨³ !„B!„(­»?a`¾ÊO‘“?i!Û’,Î,Àåï2iÜTïIÇêÌ:\2|ñ ªp}Ê:BžšCäàšèKùµ²CyiÆóÔs¹Bî]Ö”­L:ƒ¹Î.QÀ…oæ0~ò*NË22!„B!„¥Unß’  ìÊ›a-Ù>ŸíÉ:j<1…Q¿bê’Cd:5Cp“‚$bÓ<¨æ¯‡äükÔáSÕ´]ɘñœÛûP`Ñ£KÞÎâ÷6rÖh+Eã•@[Î#&ÐýòD|u†<›½lõšBXÿ2nq4y€Æ»cfugïä¹ü’¦Ò™¼Ú29âA.ìMÆË/€êvF¾Ï†‹ù*ù)T~t:oּȕŠõp?¹„ &ܧý‘ðyÛH¶¨×µÝöB!„Bˆ¿X¹0°$mgéšFL~¹+g¿ðã¥Ö'Y6ýpé& ,™\JPh`ÀµÞLhdeÄv*û¹˜ иáuè]¦.Ï¥JÿYLè]“-‹c(ðmÃþnlœ6•ƒ™àÛa 3†´æHÄn21D½û%u¦Ö jârNÝ4¢/U™V3)ò }âÍ|‹Q85ÌÖW¡Ç£!ì™7…ÿ%€{δõsCIÈÂjµ ñ ¡âïc™¶2ÿî“™1¨);gï%ÇÇ~,Ù>íúlU~™Æöèô C{ÔaoÔqrmFŽ/ŸÊ›nÍÿþÃ7Æ¢x`ÚÏâ°-œÉó¢Ó”žl´…ˆN_†`ŸÆƒFÿM¯Œ(f}†<(*õ™ôËFÎýßÿÑÄû¿e‚_óžT=±žÒt&‹O0Êîù,:e¦Rïp&÷®É‹O’o7¿|¬fv±beá# ¬ ‹B÷vª»n#U¯ÒîÚ’Û„¬Û¯3!„B!„¸Eåv¬¤ï]ŪÆÓ™>1—Mo‡s"÷v~. )6ϪԨŠ‹§•–UŽãã‘Ω¤l9gØy<+v1}W@_¹ µ+5bÀÄ·é sc¾ '0JW¦•‚<3Æ3›Ùæìd€%…£Ñ.Œš8ž=8°g7;b³ŠnÙ°å_d÷‰ÂX2bcÈ}¸þÚ½˜Tb17£jæ!Ž_\§ì\̬NÄbÍ&± OOè€b²àYÃ|= 8w ‰=U{½Î¨Š¿1í­£Eõ¯ZŸY¿³á`´ñgÿÏ m»{±wE Ît'[î_*œÊJÊEߨ¥ð>»ùå2®¤c2æ›™C¦ÉD®Å€«¢QÓNû !„B!ÄÝPŽ' þ~rŒ®Tð3 œÏ¿Á¦•ÌKIèÿ/”VWٸمZÔÄj¹Ì£­°&¬f¬×‘7Ž%m˜®|OdØâœyÄ «-m™VrS³¹¥ÕY³9öÑFV¬Mã-é4<‚ÞÛf¾13€Õ†å 4 š¢ÒíÇRøxAÍ­D€¡V?FôÖ°bü g¹Ðl\$ýn¹”hÜðµç¸Ëýôjð3+ϾÖ'ÔêÓÈÙï~F;²ÕÎ(t¶l%òRsë³ZŠÚïzêùÙ°5ºµ¨Ý5ã,¹ý¦nŒw.V!„B!„¸ƒÊÇCK¤#ø¡¡<’ÅÔðïxæÚûß^¸‰gÉ­Ö–ÆÙûøýÈ!¬mÚR!ã,Én/ˆ;Â%¿ö´©b¼?γ݃ÿœm±Z°éÝq½…ð–Y®!tëÛßÔÓìýn-KWŸÆ¿a†kkܪÐ<Ä Þµêà–p–T‹z,¦¸#\ñiÎ}~  Ðy43†5ÃÓÁ‚ÖÍCÖ®äZQ¼Ò±–Šrº›5ƒcß}Å’û¨;ô9Zù–é¨>-‰;ù_r{ž{¶IÿÛCÊ­Nüܤ´ù©Æi§ý„B!„ân(·W¸Ôx”WŒã£©GHÍeëš1y؃ÄÎù‰Ò>Î’q‘ŸŒ%3Ý…cÚ!ôŠÿ”<—-X3ö±|y}F¼>ƒv&0Xΰ~Aæ¢Ï£ùùtF½IFfç7ü‡EÛ“U¯pTf©˜Òˆ×`ôì^€ž«lZz‚¼kÛò2PFØ€@½’X7ÿY6@-–´Ý,[]—×&Eð ù1|³ðÙ6Їôa̰öøë<¨êíGÈôÙô7ƲfîJŽœÙÌ6Ó«Œ kDÜÕSì^œçú=CטEìôèÇØ—šã¥õ¤š¯7/‡Ï&'ï$Írö­ Œg¾aÑ–ÉŒ¥3gßÙN²£ú´fqô»³;ïäeâE\iðê\œ˜Ê´ŸÓn{ø·æÞ’ÉïucÃȹÎsüõ¿õþ=…g²0íÛ¸Û›˜B!„(çöìÚIppp©–‹‹+õ²Bˆò+**Š:ýû£O>-ñ{ÏTôÿåã ]ÝFM£qö6¿¿”IŽ®×Qåáá¼Ò)¯`²åGX¡BñmÍËþM½äÍD~!“B!„Bጻ?a`Žã›1ÏòÍ­-Ä•Mÿaò¦2Šéï(÷á/¸ÛQÜÖô},™°ïn‡!„B!„÷”rüÐC!„B!„BÜ-2a „B!„BˆbdÂ@!„B!„ÅÈ„B!„âž`µÙøìÌz}?žë^*úoж™üš örë²aËØÍ¼WF²ÜÑ»ÁÑ,xmâ¯ü¶‰Ø¨p>>•_¦1 q;dÂ@!„BQîYmVÆí[Â'¾åÑêùïƒÓØÚ+’•ÇSß§£ö, *ö{Õ2R¶Ídèø¯¹tímî–¤Ÿ˜þêL~Nvô–¶’i<êÑóÉ'èRÅpë ÄsðB -«¹€ù_ŒÌȃd_÷Ò{Ó™O9xïS›°‘wîMÆàÁƒynøT–þp†œ?ʱfqrÓBÞö ƒ?Çð©KùñLE«1_⋱ÃYâhÒCü#Ýý ]0}çG±ò½æÌÎZg¢jï7˜5w ¢¢˜ÑÕ¯$Rι·dò’×iâz·¹Wiðê0™ÆÜ‡ÛÝå/¤TèNĪ·hå~·#B!Ä?݇19œršO˜ÄÐÐ>Ôñ®‚¯Á“fu˜Üüæµy……Ç¿ao’ýw®tHWËO|y8Fb7n"»ÓÓt¨à̤ºš>Ø…z^·>1'å´O+jþq~®Õ£=³˜¢‘¾‰K»§3 Q+Ètž¯ßÿŠŒŽ£yoé2"ßx¿Ë'IÈ·f®l~‡y›òé8j>K—ÌcX«t¾šÉO ¥›$ÿ,åcœm¾ÊO‘“?i!Û’œé¸f.o|—I㦲xO:VgÖ¡­H¯Ù0¾­×ŸœâO×éÖÉ·œT„pÈ5”—fœÛûP`Ñ£KÞÎâ÷6rÖh\i<:‚>ÑŸs±Ó´öSÈ9¼„i+cÈGG`ççñHuèm—Ø´p;ÌÒQ¡íÓ¼Ò¯!žŠWÓ)Ö-ú˜mq&P‹Å«-“#äÂÞd¼ü©nagäûl¸èĽOZ_Z KÿzÁº\bÝ; ùî’ ÐØ~íÁjÀÍršu ?æG9¸·dòü.|;:’£FðhFäƒ5ûyªqªÕ™J,®õynêhºÕ2ÐtvŒIl[ÉÆËâ,m}jÜ©Ûw¯ÝïAZb2qi>87÷\ŽòÓ¸R«ÏHFt÷';å*§NùѱÚ×¼>çyú|Ã'òB#*]%òÅ™ìÿcÒàvú B!D)ìO>…FÝ‚[ûlÉÉõJ9ÍÒŽoðHµ|qv¦l| ž%”¤Á§ù“<ôm8‹p½-} Gì¶¼ÖÌÿËão±¨£ ›ç¹úõ_ÐAÞi¶]z˜ oÄëòLœýÑÝÞ¤å £) &]ž D]ŸT~˜Î'¿tfúÿU,~iËäÄa -ž»îÇL«BPÛZøåÙ­Úàri1þméõ-§5ž4ìV¨u‡Héñµ&.ý‹w»Ç ðt£G³,>˜¿ ÛÀ¾tkR ×k…šâqš†¼T×ãÏõh¼hp] ¢“PJuÕËÄ?]¹ýaÝ’´¥kŒôy¹+Õêöá¥Ö'YöñáÒM`%íà÷œ©Ò–þ  %¨ýøùÙ6P< 0ígqØ$&Œ{›u®ÿâÉF\|n&åB>¡O<@ÊŠ·5òu&®Œ!@_…†°çÝ)„…Maúª“hýÜV¬â׎¡ÏVå—¹aL;ŽðÍ::ô¨ƒ»õX,f4>Á(»£XôŸyDnñãÿz×Ä™¤5îAxZÂÔqo2õ{?ú jŠ—ß6 éïÆÆYS ›4‘ð;<5¤5Þ·Ó;ÔâT©3ÕXŒ1D½û%±‰»xâ8Þ?Ïñ`J]ŸŠ;÷Ìç³°)LŸ½‚C.ÞÎͰ•£üß6 ê¥ðÕ”ILÿ„‹5«âfµ9®Œ_>•7'­àhÎMë³SgB!„e%1/ 7ôŠŽ|K¯íúg³âø0f#Q§¿çÅúPÕ#6’Œö ÓU¤EKO.ºÒ¶m¥¢ó;cìðøýÛW q¡jÇ 8w€¸@L—žMÐi05 ª’ÊÕì›&Z?šöèL} ‰±ykI9DA !زc9˜ß˜†~ןp[ÑVëDhò/Dg¹´ëëájÐàÚÐô_9œb‚8œt£uó hZ½2“±Ý]9¼b¯Œy‡/%c,Ù‰äzTÆç¦“X½_0y‰dÉ] Âr{…XIß»ŠU§3}b.›ÞçD®½KzœcËŠfó±Á hSm?¸Ð©‹žßÇ’`Í&± OOè€b²àYÃ|= `ÅJAžã™Íl»hä†(,)vaÔÄñ„ì9À=»Ù›åð6 Cp3ªfâxzá7Sv.fÖÎ?RW‹l¹8|©ð×ܬ¤\ô]œšù±å]ä·“…±¥&»G-üµû0UnBíJ0ñmúèÜÁ„¯ÂmLШĩRg.eK)ëS_±.þiќ˵‚5‡ØCq˜ŠOjWŽòÓÔ¢Bf 粬`Iãð/—Èoë\½¨)©Î„B!ÊŠ·Þƒ S66lè®><»}6›•÷Ú u…PÒMÙ…ß7xØ-Ë–}Œõ;\èÔ*—­›bè6¤!îÆ´2/œ`ö¸ ÏYmäjš`¹y¢QÐ)6¬¶›>°fsrÇDíÊ¢RÆTDƒÕl¥¤LÞ¹ýdÖ˜bNp ¡SÃ4¾=CЙJtyÌ“ôM×Vë^—eñßéÜßè0Çt-VñÚpNëChçy«Û“\عš÷ߟyêlS´(Ö‚b9Ø,X5Úòûë±(7Êñ„ qÁßOCŽÑ• ~”óùÎ=¯À®\N}w÷—ÛS-Ö“v–¼{Á€¡V?FôÖ°bü g¹Ðl\$ýnXÖJnj6Å&á¬Ùûh#+Ö¦q‹–tAïm3ßã߆K¾þÇa,V ÖR͘1_¿\ÑNΆéÊ÷D†m î6fEscFöâT©³;Ëõn§>5жè2­ÎÉ]j9ÊO£Ñ áÏv¶]—¨ã>¯–ciû B!Ä­k^¡.iùÙI9C³€:Liþ>O:5¦u`hÑ÷~Ž?DU@*ºúÚ)©€Ë?¬åDÝÌÃÒÉŸ±%~ëpõóÃ3¤-ßþ¯È£ùщMç¾bé6†ÎM¨»•«÷³ýtIß4rq25ï¯TÂ`Ì@µŽH\°†Äºèë®á·¢Ï\©Ýµ1ÙksÎzk³çÒذÙ4h4€âAõÎOÑïç7Ø›I¿5ðÎ>MR¾êú?ÎÔmäÅ_ Û«)~å{4(Êr<©¤#ø¡¡<’ÅÔðïxæÚûß~¸ùç·²KÓ‘GmNÖ–]\½6ª×ºùaȺÀ•\+ŠwC:ÖrCQœXŸkÝú¶Ã7õ4{¿[ËÒÕ§ño„£«˜âŽpŧ9÷ù)€B@çÑÌÖ OÍmÄâ€Æ-„æÕ]Ñ àÚ«gIµ@AÜ.ùµ§M àÕøqžíìx6Éj"/|\À•*‚Ð;ˆJ9ŒÅjÁ¦wÇõª£´õiN:CšoCjx( øÒ°MU§ný(Où¤ž'Í«UÝÐúѤcHQß,«~&„Bq§Utõ¥{•–Ì:ò)9æ<†×ïëÃdÁÙ¬8VÄüAµ{Ø-Çš¶—5[tôìÛ/¿Vô¿ßÄæµȰ‚kí´ÈÙÄêíɵ‚%ë§ã%^!PbÙÆŒÂ!bÅ€~½zÝítVÀÇÁ+•iaçUŒ†ªíiªÉ¦Z纅·+_Ç¥Æý4Ëù‰uÛŒ4nŒ0Æ~FØäeüGfn6‰Ñ[øé²'ukxcjEkïX¾ß—ò矖Döüx¿6Í” á@¹í".5åÕãøhêRs`ÙºfLö ±s~ÂáóÕ˜ãØ±ÍLäÀ/O.ÚpŒg6³Íô*ãÂwõ»×ç¹~ÏÐ5f[âU®k0¥¯ÀèÙ½((=WÙ´ôDám*¬i»Y¶º.¯MŠà!3òcøfá1²m Q‹Eåv,UŠ[v2J—a„ ¬Dg<_¾s„,±åËë3âõ´3Ár†õ ’_!‘†Í;†NK«¸’2’ÉCQí ¨Ö™ÍA,ÖŒh~>݇QïE’‘™Ãù ÿaÑöäâW~\GµmUêÓ’º›O·¶cøìz'Ň1ȉ§Â”§üö²f{^›5“‡®pâl<Æ`›Ãåvè{1fX{üuTõö#dúlúcY3w%‡å^7!„BÜš äÙ³yñ—yŒo2¦µÑ Álµ°5þ sŽ®¡U…z<Ûy k—…•Z€æÿÙ»óÀ˜Îõãß9™™ì²!ˆ}ÔNi©¥½ª\[[½ZEÕ^ª%¶bIl©"-?KEKoµåZª÷¶ÕR;%bßÇ’Död2™å÷Gˆ5gbb‰öùü%3sÞ÷y—3æ}Î;gŠ”§yy£¢4¥y¥g#~›7“ÅÙoòb ³[¾âÛäf oWúöbÐ’ÌoSûñÛ­¿•Z¬Xœ¿†‹¿4Ívï—oòÇ`0ФYó‚G   ó´á¸Fcå¹ÝD Õ͠DZP&þ’XÀ¯+ñ¤q! NÞç÷“¨Ø-ŒaÚ(‚¿¾¯Ì!„âYµë÷8t¬Á`pøØÇ-ٔƬ?¿aÓ¥]xë=pÕº”•† +½*¿BŸ*íqÒæ“®mŠ`¥ïP†ßùsïqüÕ ˜×›é½+ÙÝÕ|ë˜äØÍ|¿v#[ަQþ…îôx½-Õ½ò÷û_â¯#::šfÍšåþ½lÅ—|]ï·{æþ»pì0ÐúÓzØD‚Ò.³éÓ…l³w SK©W‡0 ¹ž^¤{"Q ñì±™±xÕãíIoà”ºôDG^’dB!žI^zÂê÷!¬~Ÿ§Šc¬IÄÖRï}w’6Ì ûX³ÙBÓåò™,p«Z;z¨J‘Ð)üáT'V‹›¢ÅI~VQ¨xú; „B!„Ô_u‡Áß—Ãú Œý6Úo~È WÊáâÀBß’x˜ÿ,[Éχ/“ê\‡Á3>¢‰—d þ.žÝB!„B!ò %àµi|ñZÁJqò©M—µóÿËXâo¯0ÁG!„B!„O‰$ „B!„BqI!„B!„â>O?a   óœh–Î 'bÚZúåçç=´”îðÓfD0/:š)­|žzC”bm_>Žnù<À­>!ŸHíþþªŽ²ƒ‰ˆ\ÀÊåy½F<)=¶B!„Bñð´×Ù9ÌWù92„à±óÙj÷'Ì\Ú0›±£B‰Ú•„5?u8§ýôϾó÷N_ZMúŒñͽ ÜÖ„-Lè?“ý,€lί‰ 8d9±ÆGQ^>¸T£ß”ÞTq~Bõ=CíØ !„B!ij¡ÐþJ‚“_+>_Ÿ]asد¥\· +þ¡Ÿ %_‚{XâÙõãe:µ«×žßH²‚S±†´ñ?Îw“±*Tï:„÷šz‘mÑ¡ßFÔÜ œ1Ú‚†‡Óñ迹м }Ò~ÎÄ¥ÇÉÂ…ï¡OM_Jú_%ò½©ì½µ°T-pò¦^Ï‘t¯€ŸóEÖΚÏMv¢Å¯iOvªˆÞªÇÕr’µó¿à×kæœçZôfèkeQL ³]dãü%l¿fV/Ò¥*u=u¦WǘÇÖy‘l¸”Sf‰ÞeP§ÊèÍ 3ƲzÞ vÅÛ)S%NÕ±ukDȬ¶œÞm¢ZÕs1°~ö|6]Ȳ3Žö‹Ús*c«Ö/ž ‰ó»ãñô)J`Y ;"?eý…,;}&„B!„…G¡MXâ¶±pUMBÞoÅ™Õ>ôkË¢IK`%qÿ9Ý£=õ}w²9^ƒÓ–xZÁ±4h=(jÚKÔøÍœÎô¤ù„p^¯¹™ð}€™„óYTëÖ’SÇ1ì‚[n¹Fb‡ò±k]‚?}õî*µ2AãæÇY„.ÎÀ¯ýDÂzÖá·ð=¤ÚÈ“â݈¾Ý]Ù01”ý)àÝlSú6äPøNRœJѶS »fNà‡kàV©}\Q®¥ªïÂ0'zö·T -Gô˜Åœ¸c]«ø>Ïûoù±yܶ%h(Ñ~"ûÔåè̽ŽÇ©6¶V Ï@Šÿ9’‰KÓðm”žuØ1}7©¶¼ÇÁá~Ñ©õYÞc«Ú/3¯”sXpÂL‰a„t(Ïú¨XµQB!„BˆB¥Ð& ÀJÒîå,šÄ¤1lœƱ •j>ØR²éÈÛôhTŒ­ÿs¦ù :þˆ:E&€5ëÙxst3“rîd¹ëP+V²3ÍOobë]É{MP+l™ø#6g1#æ(im+àë´‡T•‹÷º’µ©X¢&=ÆL¦;€Ö Œþx+bIàðQg† &p×>öíÚÉöSv’vèKQ2q1I9¥Äù“ô—«á§ÛKªÊfÕ8­êck˺ÀÎc)XäSÇÉxµ¾N»I5ç=÷‹ƒ}¦Ú/€-ã</æd^Rã2ÐÉw=„B!„Ï–Bœ04ÎøúhH7ºPÌGr.«@‹_ÈàÄûp{¿)eNyÐIJƒÙçsV½ú ]ÚAÃ’à)Lu¦î¨HºÜu¬•Œiäç ·Ø/ÓŒùÎU¯-?©¦Ëÿ%rüz ÷“Æ‘e£ù xE‚êÕ§ùp:lB؆+Øû:ÍÝÚlùU-NÔÇÖjÃr«|‚æ®^ÏkìkAúL¥_¬¬Ëo !„B!ÄSU8nzø@Z^îÏkiÑ„†ýHÑwúÐÔ·àáfÛÂïšçéÔé9R7ÿÎÕ›«B'Wô©ç¹œaE)Rƒç+¸¢(«Ï^™×@ž+ë‚ïj5p¿z†v2Ù†C\ôiJ£Rz@Á3¨+½Úäd~\iݹ Þ7N²ûǯYøÕI|kø£ÏO°V 6.÷4Ùtå0ŸzÔðV-Ńjárî×í¬¦Uã´3¶×R<芅"*ází1ö‹ƒ}æh¿!„B!ij¢Ðî0p.׉A/Xzˆé°hm]B¾Ä©ˆŸ±w?UfÛ·š‰|+¨Åñ¹Wª§7±Õ4ˆQãkb¸z‚ëbx·Ë;´:¾€ÍWòÞ×  ìȈMñÕºSºˆ“¦ÓÝxŠU3–rH­ÌT'liñ(/ dü[%ð÷¸Â·³‘jçJ¯3²ßsx:yPÆ»ï‡M'=3–eÓ–›¼‡Å‹«2ôÃ)41Þršuóâr®†›¹¢ëÁðéíÉÎWÙ¸ðXÎW.ì°&å—“67’ä”tέÿ„Ûâ±ÜøE_UaðØ©´3)8gbÉü?I·sõܪ§êضÌd”–ßÃ?Ï8ÖÎ9¤z¿{õ©ö‹Êsjc{ÐÁ~B!„Bˆg…ÆfË×>øû š4k^ð´tž6רq¬<—ý»P}Ð z eâ/‰üº‚(Üê2·5ë?˜ÁÁüd:„B!Ä}vý¾ƒ€€‡Ž5 Ó¯7 IDAT+„(¼¢££iÖ¬YîßËV|ùÀ×õ~»gî¿ Ç­?­‡M$(í2›>]Èö8{w ÐRêÕ! hî‡g€iÇžH”B!„B!Ä߯ÓO˜ ¬Ñ‹5w—7~BÈÆÇ“xz2öÖoßÓŽB!„B!þö ñM…B!„Bñ´HÂ@!„B!„÷‘„B!„B!î# !„B!„BÜGB!„B!„¸$ „B!„BqI!„B!„â>’0B!„B!Ä}$a „B!„BˆûHÂ@!„B!„÷‘„B!„B!î# !„B!„BÜGB!„B!„¸$ „B!„BqI!„B!„â>’0B!„B!Ä}$a „B!„BˆûHÂ@!„B!„÷‘„B!„B!î# !„B!„BÜç©& ´˜<ã-*¹<ú²•bm_>Žn¾ì;=Î6äÐàÙ,„ÏFÔÂÕîku”íLDäV.ÿÚùŒ© mxR}ý8üæàã£Å¿Õf-\À‚Og3kÜ?)«»ýìöïñŸ+ölÃÜïB!ÄßÑbbæŸ_Ódý š®DËÃh´n­7à›³[ŸZ\¶äÌð‹cùxµ‰SÑa|q"ë±Ç%DAiŸfåæ+›Yu|oµü™©?^Çrç“ÎùWè0Z”ðÁÛÝJjâ .¬ŸÉôÌù(Ûš°… ý·cÎÏ9[jmp«Ìÿ—`葬:¯¡Ü[³oÃÄÁ É×{ÉCËæüš‚jÄ„ÙÏçû(µ6h:Ùï¤,†½ëùbÅVÎeZs_ó¤ú—jôß”maËxï±…9Nmð&ƒzµ Œ«RñŸ‹Øt*«ýƒó¦-Aóö‰™3‚¥Çïïì‡mŸj_çTH©N!„¼jcÝ„0~¸zÿ+ñ(ÇAБˆ9Ý)r#‘,t¶ìÿ&Š¥Û®’]ðâ…B¡Âh1Ñÿ·ÙÄe&1½A?Zø×F«8‘nÎä?çã“#«9“j`tí·òW`Æ"†CPØÚû;(6{Ú½Þ ×Rzû/ξÂþó~Ôïî æ‹¬5–uq7Ÿsò¤ôs/óvïרQäa¯í‰Y0šõM§\ïQ^)±‘yö'–þßv]LÃÉ«M;¾C϶q×ÖTb7-gņÝ\HSðªÐ”Nïô¤MEw4ÓÆ1$ôÅ€jOøÊ‘(°'0Ðâ×¢7C_+‹bí"ç/aû53Ø29þý0†¼Nߣ؟rÇò&ë4_ý€o«ôevÿDƒ¿ç’ùv™Å¿É€.5ðPô¸˜N°vÁl5˜j¼7†>5})é•È÷¦²7ãæaž ‰ó»ãñô)J`Y ;"?eý…,иP¡ã mãKZÂUNœðáù2ßóaÄ!2ªwÂ{M½È¶èÐÆo#jîÎmêmÀBò5¨ßºî®uå­Šm¨í[‘÷wÌ¢^ÑÊ´+Õðɧ-J—^È×KÍq‡9éÕ€ö.€pòâùq³PÍsêv,›Áüåå™5¤6nš‡ ÂBFJVÁ.=ˆéßúÉmF0·U škøé—X®eU ‚‹…Ë›f1scº›Ã¸26ÎnYʼé‘0u m ˜ˆOßãOèJѶS »fNà‡kàV©}\Q®¥b¬‰°rÇ?Ú¡,GWž%?Ÿ&ôïUš_CƳ-Š6@ÿ¶•ØC†ÍHÌâP>v­Kð§¯Þ} ÅŒÆ+eçœ0S¢C!Êó¿¨X²½ѳ½Âw£Ç²#ŇGÏ Év³BŠšö5~3§3=i>!œ×kn&|_ÎêC­ ™'·s©j[ê>g£ü™]\®æ—S¤ïó¼ÿ–›Ça[‚†í'2±O]ŽÎÜKºoÞn—ÅÊ‘ìNw§Á°Ù4-à0(ÞèÛÝ• CÙŸÞÍF0¥oC…ï$Åš¿q°e]e×êxmjKÊërبÒטI8ŸEµn-90uÃ.±å#–4/•±5'zö·T -Gô˜Åwí0PëÏT[ޱؿ<û³ÍA—òM)c+‹oî(HÜ»ˆöæ£_TbÉ:½š°±{øWÄ{¤Ìeý]WûónŸ¢Ö;}íZ©5µã¶²î=õǵ¤Üº/9•…ú{ˆêû‹ƒqªôËÝ{48)‚.+‰L›sLmÜUÎwõóÖ±sLí8!„¢°JÌJåûó¿òIã!w% ¬6+ɦtjù”ç_•Ú²øøF6Œá‹EkØgÈÄ9°%}†õ žG;–~ÂW\%KçÇsóþK.ìYvÏc/¤²èã”?…×J:=¸,o'ÀBRÌœë¿suþ.´žeiüby¾þ÷%R­A(†­D/^ÃçÒp-Ó€Ž}ߥmy74æë÷ÄÕ‹Gç“džÐ׳#> |ÌJ¢¾Þ!1™43€–çFF1¢Êæ^GÕŽþìX»]‡ ŒmçGöƒâÖÝàBš/uTÂ×Í Ê7ãõò7CÎ8ÆÚñ48ŠTËÙQP³Ã úŲu'iѯ²§àÙöø–ufؘ`wícß®l?•zGæËÌåÿ®âLØ[´øi:?ÇÙωéêR:å1I9¯MØÅ´ù Ç–qžƒs–)©q肜QmÑ K9ÎÙT+X9øëE²ß<ÈšÆõì ¼9ºŠÉ‚G9w²Üu(p³y·Á–y‚ŸbÓÿÍ,¶Eí¥üÍ„¾d%÷å¶!þÈŸ¤¿\ ?Ý^LÅ+ã›x”³V°¦sê€S½üµ//º’µ©X¢&=ÆL¦;€Ö Œþx+s¡7ã`I‹#]iŒ§NFµe†•ìL3ÆÓ›ØzÏ‚D-“ƒc«ÖŸ©¦¼cÉñ,ÏA½‡;Š1‰Œ„­Ú/*±8Jµ @ž}­ñ¤úË•¹¸y%©©Nl‹ïJ›J.œ:jT±ûþâXœyõ‹p*Ú‚³ƒP<½°]ØÁêY+9º *ç˜J™:•ó]ý¼uìS;N!„(¬ö%œÀÍÉ™&ÅkÜõ¸ÕfeÂþ¥2XÚ"˜—K5dÉñ$“)êâ•ïòm™ÇY5ç?XºŽcÁó>\Û4ƒÈ¯ŽP¶Õ¾>Q›L¥\öyboøb9¹ü¾ÇtšT»eUTwR8vPC½w=¹ó€ìäÓlûïiœ+wÄËtœU³¿!©ý(æŽ÷'ñ·E„Ï^Žøª^X}O ŨÞf2é¡cØÓe.cê¹aKÝÜå±Ô9›ñ¥ø_ø,Nüc<ýk¹‚ ȈaÝ¡¦ŒŸÕ›z ¶ÌØÇ= më¦òÙœEØÞêLëÚ%p¹¼éÊNRƒ~•Ýo·GãIõ+“}kÙÕ(ûP»$DaóøÖ4Ž,ÍÅ+T¯>͇„ÓaëÂ6\Éý¸-ýß®q¯ñÇg‡HÍ×>gžÕ‚õŸ5 šÜÎ6lw¼H_¡ C;hX<…ƒ©ÎÔI—{ŽÏ» YœûégŽé3ÙfȦü]GÝÓ› ÛÍj5ŠSî¶d'mÞK8EÑä³'l˜.ÿ—Èñë1äñÕðüŒƒS‘’xd'”Ÿe†•Œiø®zÞ±äd }WÉ»?óŽåæKŸÙ9h%+)³k1<H±-E´d&ßúÒ¾J¿ä‹£ÔÚ[ýúZñ®Í«uKP¦ÒT>µ€âVWk ¾ŠÙOªÚ{H>Þ_ŠS¥_, ¿2çãådþ#”Ñ޲ïü­{E¨œczõ2ó>ßí·Ž©'„BN‰Y©uñBÑ(dZ²xsËdFÖ~“w²7î8 ›@qWn˜R*a`<õûÜÿÁ„¦%Ðk ôó/QtË>®µ+†kú §LírÔô„ìó÷?†Ñ~Y†ì:TÊ:Åþ¬ Þð¹ãÿ{K2¿MíÇohpró£rã×ù¨Gel'ç±[yàVåñÐGó×i·iÿM§ºßb°Ü}Ã&KÒ9®é+Ó)À®85ªëùål:Jßœ8ãùÎÏSB¯QÛR‡¦2rË÷|·d4«jÑáwùçsۤ]'ý^÷¬*u>¸g^'ÕÂS¾kž(¨Çÿ+ .´îÜï'Ùýã×,üê$¾5ü¹ûv V~[Å®À7hhÿF!&Ã!.{=G-P(Úb8SÖÅ£Ù«ìçHô¬DiWœ|¨ý|`nŒN®>èSÏs9ÊR¤ÏWpEQîíº¼Û`6üÌgÿ÷ñw¬`LWcð©G oÐR<¨.çŽpÝ æ¸Ó$z× œ»Š75•Æ9·éxâå¬.”ªéû² ‡¸èÓ”F¥ô€‚gPWzµ ¸çüµ3Úb4ìÜ÷ý[8[€ªÅbwl­l:7\îé~µþÌŸgwfù•ãÞ­hWÃÏoÖ“j®šGÐ/® ·ÝÛ× E·Ãog8 þ>ø¡~Jl…vÔñRÔßCòõþâhœ*lÙ\üa1[Kü‹>M|PÈï9v?µóÝÑ2=N!„(¬Š:!Θ„ÅfÅÕÉ™nå_䃟r þ$KZSÁ3CFüÍ×ç?Y6Œ‰ ¤œ_ÇôQñÑGññ¤sÉfE ìJpÿ .3ÁÏaÍ‘d”²÷?fÉGYdžÝKJÕ ŠÝùÕ~'/ž÷¬XÍ g3®O+]À˜xƒì"¥ñ¾õ¸Ö‹RE¬$Ågà¤ÃÍb‹V§‚-–½ç3°f]æÀáLJUö¹}¯$Åç[^ÕãÆÉ‹jm{3î“Lê\„ŸNçÛs&4ŠŠ5;ç5wö¨%«Æééþ$Ÿx$ÿçGS"Wt=>½=ÙÙ ã*»ÿ}¦‹lúú“z>Ïæé¿¯½ûõ¡ó[ܾC}âN}U™ÁcÃyÙ ú¬ã¬™„4è;2b`S|µî”.âCà¤ét7žbÕŒ¥T¹œfMÜͪm/0xÚT^½v™cg®` È™ùÆÓ›ØjĨñ51\=ÁÎu1¼ÛåZ_Àæ+wfînCFuXoü΢¯ª0xìTÚ™œ3±dþŸ¤Û€;ùrK†L§Cœã§ ýožÌY§Ù´]¡ÿ˜‘40$—O& À¹ÒëŒì÷žN”ñ.ÂûaÓIÏŒeÙ´åÄ&ïañ⪠ýp ML ·œfݼ¸û¯ÂÞÓ†$À©Ø‹úf' qûÖ2sù12ìõuê½ßÑvµXTÆ6çØ£ür²#ÃæF’œ’ιõŸ°`[<µþ̯gvîcÑÜ2 êÁçî ¤Å²nî"ŽeÚ°f>‚~¹‡jûTÚg_Ï<Á ­½øsñÙÜä¼-í›Ïô⟠}Ù¹Yå=Dåýå‘Ä©&ë<ëþδ‘½iû ¿ÝÈç9v‹Êù®z®¨pô8!„¢°ª_¬ F‹‰íWѪäs¼]©îZWê­H GñÜ×mºøU¼Êà{Ï}ÈšÙæ„ÖIƒ‹3ù¿÷>}uÿÉÐ:í¹þÇ¢¾¤êœÁÔ¸÷±©-o¾X­,#±{ã)ÿb‰|,ÂrÊÑ¥\&Ù Þ:ÀœÌåïbn(h)vo ³Þ¸»×ò4¯£°bù4Žhôø×Ÿwk{ä±GV-n6›PÜ)Ûâ ºüò›N¥Ð¥z9Ф$.ËFYÝíäCæ•ó¤yÖÁG®V<ó46›Í¡¥ƒÁ` I³æ:ž§GãB@ ¼Ïï'&Q!°[ôQ}A>d‹'ã¯0Ÿ•6<+q !„Úõû:Ö`08|ìã4çÈ7üty_¼Œ¿«ï}ÏeÈιD4ìOË’uXFâ®Ì©GŸîµ°îùŒ©kŠ2bV_*[bX26ŠÔŽ£èß2çô‹œI+J‰äílO«K›úþØÎ¬&döºö«J‚åÎÇ®ÑkêKü2>禇¼N< ,?*5°*b uG¾G[wTùÉA[F KGÏ#þÕQ ~ÉŸÄ ™þ­ž÷#PéÒOlK»'†Ù½Éœû!_WËÔ.¥Ð1{Ân^™<ˆ:÷nƒ5eÞG·nҨͭïAq—NÿŽ)_¤Ó²G—/‚ñÌÿølîvÊÏ W¹k¬ƉöÓݪXÎîË5þ6ŽŸƒB™Þµ ZùYÅB#::šfÍšåþ½lÅ—|]ï·{æþ[r>·ØÌX¼êñö¤7pÊ]ú¢#/ÉâA<9…9ø¬´áY‰S!„¹†ÖèÂÉäK¼µu ÔèB›R p׺oLæÛsÛXzâzU~%Ïd€wP[êþ¾ ƒ¢0yVæïw£’3h¨NϺ²âÿÂôE:NEÊÑôÍA¼^JÇ•OcHT*V—24ë9˜ÞGø&úÎdžPÍ5Ž_nÖ¡q{PYƒ)c>Èßü3Ÿkf[uþõqw¢ÏaØWé¸Ö§ãˆÞÔñPÈt¾7®!Tsu'ëŸmðœ3~?W£×ä¾4ôùŒYßÉ)Pq¡XÕÖôò:Aø.f^q¿Û¬#½Z¬âëE㉾‘¦Hyš÷ø7*êASšWz6â·y3Yœý&/Ú8»å+¾MnÆðv¥o/6sïÓp“R‹˃ó×â©’B!„BüÅüwd[Í,=ñ«No&%ûö€K»û1¨ú?y¥t£§ ×6E°Òw(Ã?转“+ûO9>ü°ElXÒϲ>lGþɸ&2 ɱ›ù~íF¶M£ü Ýéñz[ª{ÝûÝñ´É!„B!Ä_–NÑÒ¿ZGúWëø´Cy8Ö$bk©÷¾ûI€ cÜ%’²Kß¼!¡[æu®‹R¥¤Ë#ŽÁ ¯jíè=¢*EB§ð‡S<œlX-flŠ'ùYÅgš$ „B!„âqRŠÒ*xÔ¬PC‘ú=éòçb¦}¸ÅY‡â\’†=?¢sÙüüÆšôeù稡h–­dúÏHu®ÃàÑÄK2Ï2I!„B!Ä_ŒÆ¹ /õŸÄKO°N'ŸÚtQ›.O°NñxÉOc !„B!„â>O?a   óœh–Î 'bÚZúåçæZJwøˆi3"˜Í”V>oˆ[}Bþou] ZÐc.³PÑQ¶s0‘ X¹üCjÖ_I)à8(ÅÚ¾| ÜmXÏ®gdÜï¢Á³YŸ¨Å“9o×'„B!ijêé' ÌWù92„à±óÙgÉÏ\Ú0›±£B‰Ú•„5?u¸Ô`HÔ^.vg“µ¾AäÛå)Ð7y\ªÑoJoª8¤gQ6ç×D²œXãªò)ôµ5a úÏd†ý×þ¥äÙ×OaÜ…B!„O\¡½‡“_+>_Ÿ]asد¥\· +þ¡Ÿ %_‚{dÇq*Ñ2¾:ˆÏºù ¯Òn$þ_À:ÿIתø»^aíŒOøá‚ Ðâ×´';UDoÕãj9ÉÚù_ðë53¸TåÝÐá´® §Îôê³ãØ:/’ —ný¢»eâBÐðp:ý7šw£¡BúÁÏ™¸ô8Yj[.•25®Tê<œ!-=IIˆçâUz|ɰÙ’éVŸ9/ðŸá‘6‚{ãñD¾´žaÓ‘©xP½ëÞkêE¶E‡6~Qs7pÆèЯqN”ì4‰Ë_àrñ*¸Åîášmj9ýDØÌ­ÄÛTêSík-ſɀ.5ðPô¸˜N°vÁl5˜ìŒƒj¼7†>5})é•È÷¦²77i Å¯Eo†¾VÅ:ÛE6Î_ÂökfµíÄ©¥Ä ï2¨SeôfÐcY=o»âíÍ µçÔæ™J,vçõƒÇÖ¿ýÆ—û†QQGÉ4E0bZv‡Ìà×Dµ×Á6x6&$ü%ÎïŽÇÓ§(e-ìˆü”õ²@ãFåÎÃü¢;‰×ã1$zq{ÿ’£çŸÚ9¦VŸB!„ÏžB›0°Ämc᪚„¼ßŠ3«}è×0–E“:–,°¤pñšBâz\ªtcì[F–†o£¤‘ó׳°7<Ì&tq¥ºOct‡òlŽ:N¶w#úvweÃÄPö§€w³LéÛCá;I1'zö·T -Gô˜Åœ¸gEïP™V3 糨֭%¦ŽcØ#ùYž+*e¦ù4åvY¬Ái4úp6Mmù(Uñ ¨i/Qã7s:Ó“æÂy½æfÂ÷9~¹ÝjVpçw–,Í$ì=«ÆG£Ü‘².[‰ÏR©O¥¯Ÿ&ôïUš_CƳ-Š6@ÿ¶•ØCyƒzÆHÌâP>v­Kð§¯Þý”®m;²kæ~¸n•ZÐØÇåZªê޵8>Ïóþ[~l7†m J´ŸÈÄ>u9:s/©6µ9‘÷sªsÂK¥ÏìÌë³÷ëξò µ‹ãðy®¥­ã³${'®cmH±˜Ñx ìœÃ‚fJt#¤CyþK¶oÞn—ÅÊ‘ìNw§Á°Ù4ÍO™*çŸú9–w}B!„B<‹ m¬$í^Îò IL“ÁÆÉaËpôª6@6q§’ð(íG¹ÊÕpö°R¿T ^îIœˆËÀ–~š1)XÄ )è*¹ º’µ©X¢&=ÆL¦;€Ö Œþx+ØM`8V¦•ìL3ÆÓ›ØšÏdvÊÌ*^ßäXÎ¥[ÁšÆ‰}—1ÕËG¡Ö4®gWàÍÑÍPL<ʹ“å®Cü}ä,$_NÂdL'#%“‰ ‹Eãp}ú€º”N9@ÌÍ…iÂŽ(¦í¸ý|^ãàx8|Ô™ac‚ ܵ}»v²ý”z²À^œ.%ƒ(™¸/÷¹ø#’þr5üt{I5©Í‰¼ŸS›&;}æk꟬ßß|Ùû‹Bã6žì^rû§®cmHlç9x1'£‘—.È9ç+^ßÄ£œÍ°‚5S ¹sÞÑóÏî9–G}B!„B<‹ qÂÐ8ãë£!ÝèB1=ʹ¬,R­¤\ŒC÷J5¸_eÃ&gZÖ+Õr‰íF[NOXÍXo®î^ߨ0]þ/‘ã×cÈÏ-îªÖÑ2­dÜHãáªË»Lglh€[¿‚ê¤Í{¹¬(šÜ×é+tah K‚§p0Õ™º£"ÁϤذåvŠ5·_4®Oå7^óYÓ8²l4¯HP½ú4N‡­SÛp{_JPóÞçl6noQ›y=—÷œp±‹#Œœùñœ>hN™Ó -,[ˆ¼˜Ïc¾ è«%wlï¥Qœr¿p÷œwôüS;ÇÔêB!„âÙSˆ?Ñj x¹?¯¥Eö#EßéCSß‚…›}ý e”¶‡?ÀÚ¨1Å’Ïog…—m8ÄEŸ¦4*¥<ƒºÒ«MÀíl‹Õ‚Mç†ËC„g·L¨•™w†DŸZTôTÀɇšK‘{/;«‰t<ñrVJÕôϽ ¤“«úÔó\ΰ¢©Áó\Q”Ç7mìÖ—G_› ‡¸ìõµ|@¡h‹áLXG½¾Å%Ö›à}ã$»üš…_Ä·†?z;‡©ÅiºrƒO=jx+€–âAµp9w„ëö3yR›vûÌy `¹¾ƒâ›òn¯&Äý°‹„‡M²=DÔ˜ãN“è]ƒrî (ÞÔhT:wÎ;Z¦Úqjõ !„Bñ,*´; œËubÐK–…âF:,Z[—/q*âgìÞW.–ä $xõ èþS¤$9sÄ©/í¯|I¦m Öä=,^\•¡N¡‰ ô–Ó¬›—{%Ùš|”_NvdØÜH’SÒ9·þl‹WÝ`¯LG¨–yãwVüÔ˜¡Ó"èp…çâÈòºy`Öi6mWè?f$ Ä%Ç“‰‚È<½‰­¦AŒ_ÃÕì\û]Þ¡ÕñìpïÂÈ~ÏáéäAï"¼6ôÌX–MsüîùF•ú6_1çÝ׉;YôUe çe3賎³fþÒ °@Ø‘›â«u§t'M§»ñ«f,å`z"Wt=>½=ÙÙ ã*#ÓN™Vµ8oü΢¯ª0xìTÚ™œ3±dþŸ¤  ªsÂNŸåÕ×ÚJ¯«»5•Ã?ž¡÷«ÛÿšFÚ Ârc'_niÂéátˆ3pü”£¿¦@eªŸcy×'„B!ijHc³åçÎw÷3 4iÖ¼àhèðu½ßî™ûï±Ã@ëOëa J»Ì¦O²=ÎÞf-¥^€æ~xx‘vì‰D)„°CñnÈû£ÿE•øMD®–dB!„ϲ§Ÿ00X3¢kî .oü„)¦¿<©¿‡1ð÷§‡ø«±&íáóÑ{žvB!„BˆG ßôP!„B!„O‹$ „B!„BqI!„B!„â>’0B!„B!Ä}ž~Â@@ç9Ñ,NÄ´!´ôsÊÏA”îðÓfD0/:š)­| Þ·ú„üß(꺴 Ç\f)ÅÚ¾| Üî|TGÙÎÁDD.`åò©í’×Ñ<›…ðÙˆZ<™&=éúõ¬Äù¦9ÿHb¹=¶B!„BüÝ<ý„€ù*?G†[íþ¤"€™Kf3vT(Q»’°æ§— ‰šÂËÅîl²–À7"ˆ|»<:Ç"¿Yv5úMéMç‚òdX¶0¡ÿLögÜùh6ç×D²œXãÓŠL:Ïʼ~VâB!„âóôV1N~­øx|}v…Ía[¼–rÝ&0¬øw„~~€”|eî‘Ç©DwÊøê >ëæƒZ¼J»‘ø{ᇠ&@‹_Óž ìT½U«å$kçÁ¯×ÌàR•wC‡Óº‚ž:Ó«cÌŽcë¼H6\ºõ ô”‰ AÃÃéxôß\hÞ†> é?gâÒãd=¨mÚRt›>Û'!|wùVÝz*õžÆ;§1ñç ª½7†>5})é•È÷¦²7#¯Âî q£rça ~ÑÄëñ½¸½DK±Æo2 K <=.¦¬]ð[ &P<¨Þuï5õ"Û¢C¿¨¹8c´©·ÏN}~-z3ôµ²(&ÐÙ.²qþ¶_3? ð;©õ§Ê8x6&$ü%ÎïŽÇÓ§(e-ìˆü”õ²ìöË#[°ÓŸyq¢d§I|\þ—‹WÁ-v×ükSËé'Âfn%Þ¦R¦ê¼Vw ï9ï`œ–Çsþ•xá]uªŒÞ :c,«ç­`W¼ÙÎØ !„Bñ÷Qh–¸m,\U“÷[qfµýƲhÒAÇ’–.^ShXTK•nŒ}ËÈÒðm”ô1rþz6@ãæçÙ„.ΠT÷iŒîPžÍQÇÉönDßî®l˜Êþðn6‚)}r(|')ÆãDÏþ–J¡åˆ³˜÷¬ú*Ój&á|ÕºµäÀÔq »`DmY€9‘3q®¼XT‹SzEV1qt_%.ïÌÀŠ‘˜Å¡|ìZ—àO_Íw·)¾Mx»]+GF°;ÝÃfÓôÖs>Mèß«4¿†Œg[m>€þm+±;:† Ń¢¦½DßÌéLOšOçõš› ß—äÝ>µúЕ¢m§@vÍœÀ×À­R û¸¢\Kµ³ËD¥>µq°˜Ñx ìœÃ‚fJt#¤CyþK¶Z¿<ê±PíϼYÍ îüÎ’¥™„} gÕøh´“;RÖe+ñY*eªÌkÕq'ï9¯–Q‹ó†î1œ¾Ïóþ[~l7†m J´ŸÈÄ>u9:s/éjsP!„Bˆ¿‘B›0+I»—³(^‘ zõi>$œ[§¶á ö¾”w}*ã ¬–ÜñËwœ|lóÓŸy±aË€ÖÜ9¨)P™·JÈCžsÞ±8Ïùw»ôÛ!ذÝ|‘úœB!„âï¡Öðr^K‹&4ìGоӇ¦¾ 7ûú2Ê4&(m:€µQcŠ%Ÿ!ÞÎj3Ûpˆ‹>MiTJ(xu¥W›€ÛÙ«›Î —‡Ïn™0]?Gv娟þBߪÅ“Nr=Ûñ2Íq§Iô®A9woj4*Í­{Ë™ ‡¸ìõµ|@¡h‹áLX 8¹ú O=Ïå +J‘<_ÁE±ßAjõáHëÎMð¾q’Ý?~ͯNâ[ýãÍsxÔâ|cëh¨Ì<æµÚ¸?ãü3]9ŒÁ§5¼@Kñ Z¸œ;Âu³9(„B!ÄßH¡Ýaà\®ƒ^2°,ô7ÒaÑÚº„ |‰S?c÷wy°$_ Á«E÷Ÿ"%É™#N}iåK2í\€·&ïañ⪠ýp ML ·œfݼ¸Ü«ÚÖä£ür²#ÃæF’œ’ιõŸ°`[¼êd{e:œp–ä¢Ь:IZ¢+‡èCÙË2¬  ìȈMñÕºSºˆ“¦ÓÝxŠU3–rÌ¿;#û=‡§“e¼‹ð~ØtÒ3cY6m9±7vòå–& ™N‡8ÇO0úç¬ ­‰;YôUe çe3賎³fþÒl 9½‰­¦AŒ_ÃÕì\û]Þ¡Õñl¾’w‡[TêÔÈ]†OoOv6è¸ÊÆ…ÇÈ,@Ÿ9:jq>ޱ5ªö§c%Û+3Ïy­2îÃc9ÿnü΢¯ª0xìTÚ™œ3±dþŸ¤Ûµ9(„B!Ä߈Æf³9ô1ß`0ФYó‚G   ó´á¸Fc幇½îBõA3èq,”‰¿$àë B!„Büuìú}k0>VQxEGGÓ¬Y³Ü¿—­øò¯ëývÏÜŽZZ›HPÚe6}ºíqö¾¨¬¥Ô«CÐÜÏ/ÒŽ=‘(…B!„Bˆ¿§Ÿ00X3¢kî .oü„)&!„B!„âo®ßôP!„B!„O‹$ „B!„BqI!„B!„â>’0B!„B!Ä}$a „B!„Bˆû<ý„6€Îs¢Y:7œˆiChé生ƒ(Ýá#¦Íˆ`^t4SZù¼!nõ ù¿QÔu-hA¹Ìg…[}B>ÿÚ.y¿D)Ö†ðåãhàö¨+×àÙ,„ÏFÔ"]¯Å¿Õf-\À‚Og3kÜ?)«³§Ž²ƒ‰ˆ\ÀÊåêí|ö=lŠûýæ‹B!„ø«xú óU~Ž !xì|¶ÆYòs—6Ìfì¨P¢v%aÍO.55…—‹ÝÙd-oDùvyty˜Ÿ²«ÑoJoª8¤¿kÂ&ôŸÉþŒ§ˆ¶ÍÛW$fÎðO]ËùìÛO?8Îlί‰ 8d9±Æ”)sâï)Ïq·3_„B!š‰SÑa|q"ëi"þ´O;€¼8ùµâãñõÙ6‡mñZÊu›À°âßúùRò•!¸Gv§Ý)㫃ø['•¯Òn$þ_À:ÿIתø»^aíŒOøá‚ Ðâ×´';UDoÕãj9ÉÚù_ðë53¸TåÝÐá´® §Îôê³ãØ:/’ —Ì7ëp L\NÇ£ÿæBón4ôQH?ø9—Gõí@ñ z×!¼×Ô‹l‹mü6¢ænàŒÑf§s´kü&ºÔÀCÑãb:ÁÚ_°Õg‰ÞeP§ÊèÍ 3ƲzÞ vÅÛ(Ùi—¿ÀåâUp‹ÝÃ5ÿÚÔrú‰°™[‰pò¦^Ï‘t¯€ŸóEÖΚÏM€ 5ÞCŸš¾”ô¿Jä{SÙ{k1îÙ˜ð—8¿;OŸ¢–µ°#òSÖ_ÈRï3•;cð‹î$^ÇèE~öªè+v'xÀóTôÃ2x25LLg¿eÆg»I²ªÄ©FuN<†qW=N¥>µ¾VíOG۠ůEo†¾VÅ:ÛE6Î_Âökæ¼›v³¾‡ŸŸöbq°ÏÔb±û^ð Nø·ŸÀørß0*ê(™€¦HFLkÃîüšèÈ›Bñו•ÂäËùõêaÊzøã¦u!Þ˜L’)7+¼ÄÐ]Ð*v>ÚÒ9ýÓW¬X¿“ÓIfܛҹO/ÚUtGóЉY0šõM§\ïævTK"‡×-gå÷s9<Ê4¤}Ï^´¯Qäæç)™gbéÿ­a×Å4œ¼*дã;ôl[÷Ü,Äÿo®¸pwuž/òÉ{TÑÙWØÞúÝÁ|‘գƲ.îæëœ<)ýÜ˼Ýû5jyØkÄhÓ#a§ÝÖTb7-gņÝ\HSðªÐ”Nïô¤Í­q1_dõ˜úÎb@5Ù®ù¤Ú„%n WÕ$äýVœYíC¿†±,štбd€%…‹×ÕãR¥cß2²4|%}Œœ¿ž… иùãy`6¡‹3(Õ}£;”gsÔq²½Ñ·»+&†²?¼›`J߆ ßIŠñ8ѳ¿¥Rh9¢Ç,æÞŸCeZÍ$œÏ¢Z·–˜:ŽaŒØ[ò xPÔ´—¨ñ›9éIó á¼^s3áûÔW¹ŠOú÷*ͯ!ãÙ–E› ÛJ쎎Áèó<ï¿åÇæqcØ– ¡Dû‰LìS—£3`5+¸ó;K–föžUã£ÑNîHY—­ÄÛrÚîq`¡‹3ðk?‘°žuø-|©6#1‹Cùص.ÁŸ¾zÏ8™Ñx ìœÃ‚fJt#¤Cyþ«Úgi>Mx»]+GF°;ÝÃfÓ4]f:½š°±{øWÄ{¤ÌeýÕ;w¸¨Ä©FeN(cÜÉû8ÕúÔúÚ7ïþt¸ ºR´íÈ®™øá¸UjAcW”k©ª»„›Ÿ{Iµ©õ§c}–æ•w,vÞ ÌBܯ8ûÊ+Ô.rŒ?RÀç¹v”>¶ŽÏ’$Y „BÜ)Þ˜Lï_#ðsñbuëITô À†]×c˜|`9gS¯ÙdNš¼ÉÙ\ÚAøÿ|è< ‚‘]¸qèü|2SEw~s¨…Œ”¬ÛŸelFN}3È?ÊóöÇŸÐ$ÀÆÅ_±`ÖtL&ѵœLçøþÓïHn3‚¹­Ñ\;ÀO¿Är-«\ne œ(Ön*+ÚÝ*7•ƒ‹¦ðcÅŽTÔç=X6q§’ð(íG¹ÊÕpö°R¿T ^îIœˆËÙnK?ÍŽ˜¬@â…t•\P]ÉÚT,Q“c&Ó@ëF¼ì&0+ÓJv¦ãéMlÍ÷¢°¦q=»oŽn†b²àQÎ,w ¨žðú€º”N9@ÌÍJÂŽ(¦íÈyÎ¥d%÷å>äOÒ_®†ŸîéXH¾œ„ɘNFJ:)&=.Š,`˼À±9‹Á1GIk[_§=¤Ú¹ lË8ÏÁ‹9«­Ô¸ tAÎvû,«xe|r6à ÖtN0`ª—ߎ{r˸“÷qªõ¡Ò×*ýép, >ḛ̂1ÁîÚǾ];Ù~J=YŽÎϽ¤šÔúÓ±>3©Äâ(k꟬ßß|Ùû‹Bã6žì^rœ½Ý !„AS®ÀGïÁgÍFàìtû Å44-^“Å-FÑsëT¾<õ½*¿üÀ2li²zc ÍGŒ¥}•œ«Ôî»Ñ;çYŒá‹EkØgÈÄ9°%}†õ žK,ó‚¿§B§ üùó^Î_˦LÇŒèXœ˜OF17& Ž ¡¯g-ŒmÂæ-fÚŒîËKsÒUÛöcÐ¥QD~ÿ'/Xì\Hó¥nƒJøº9Aùf¼^^½í¦sù÷¥& î[üæ. I1Gp®ÿ»n÷ˆÖ³,_,Ï×ÿ¾Dª5Ű•èÅkøã\®eбﻴ-ï†Æ|K?á«?®’¥óã¹Î½hpt>Qw´i`Ä”YIÔ×»1$&“fÐòÜÈ(FT9üÑë¨ÚÑŸk÷£ë0±íüÈ~P?êTÚqŒµãi0pÿ¨–³£ f‡Aô;3ŠeëNÒ¢_5dOÁÓQˆ€Æ_ éFŠùèQÎ$Óe%åbºWªÑÀý*69Ó²^y¬–Kl7ÚrzÂjÆzóCúÝŸÕm˜.ÿ—Èñë1äç wUëh™V2n¤ñ0Õé+tah K‚§p0Õ™º£"é’ï£ÕÒŽ÷½%τɰӺZ¼Zîþå§-ó8«æüK×q,xÞ‡k›fùÕªöÑBæI¶^|•Ñ“ßÂóÒjÆLÿŽ£­?¦þ“é:†=]æ2¦žY±Ÿó…k]ËܱWAãJ¹f5ÑFâjv}*¹V¢mÝT>›³Û[i]».j/l©üùŸ?ðùÇDJÝZ½ÙR8vPC½w=ðÉÄFvòi¶ý÷4Ε;âe:ΪÙßÔ~sÇû“øÛ"Âg/Ç?|U/¬æëµùxÁTÊeŸ'öF1ª·™Lúÿ³wßU•ÿÇß÷p¹ì-‚¨hnQro´ÕïëL›–fËma–«@48©©_ÍÔl|ZjÚ°\%¹qŠæ¼¨,Ùp¹ã÷†pîdŸ×_rï=Ïù|žç9Èó9ãÞ“%sóVÆÓxì\ª¦ðcÔNü'Œ¡Àäã»Øv„Íy Kn|Éý8¬ô¼ ‰8IƒëÞp[ˆÆ†Õ¥`ÕA.4 ÆþLؤ¢®ª- ¥WÖ*""7ãóÂË´ó¾½p ®œ&§z‚³öp8öæÖm¨”~šd+«•},ç½ÚѺªPp ~‚AÝ®W[Ì&,öÎ8ÞBxVÛ,;'/t™g¹˜cFq¢C-'ÅzP},=šÑØK|:Žfêð¦¸jÀx½Ws‚<@KåàÆ8ž9Âë+<4N4«áˆÏA¸\:Mê­¯„‹¨õ™1éižAÔtQ@ñ$¨uµ2\Rv•2'îÆ¸«)ëþÔú³Ì98Òµo[ôÀ>€N>ˆVƒÎ¯!Õ”T.e?•iÎËÀàà‰óßÚ·sòÄÑA®PÅ¥NÙ'‰=žŒÉµ&j¸[ š®žá²®.Áhì+ÔPÇÅ?³)ZfØU¢Cßøë4êýh*=oSÖr\ªàñ·?(í½pɽB¦ümTn*ì5û0¢‹ž±¤fÃÒuM Þ…„™?cõi¥0¥Ÿ#Å£?>ûȸêÀ»WèžøIá«Âœ¾‡eËêóÚSikéßÍO*:¨ÍéGùõdoBß&=#›3ëßcá¶dÕ³ÄÖÚ,‹¼S›ØjÁ¸°Fè/`×wÇx±ß t>¾-‰¥·lNÛÅÒ5uùvA—œµ ŽeRgéšzŒ|{rbY¾à0Ù ®jÁ(vX²’Q: 'ì9ü\ùjN,™°ì͘áíðÖºPÍÝ‹À)3x*/Ïf}ÄA•NSí³Ô]|òK[F͈¢g’žã zòün¯ ©gœßSŒÜ 7;Wª{º3$rÙ¹ñ¬˜^øüRçÄ]w5eg&•þ,óÜ5¤‘hߟÑ3ºSPö\bã’8r­åP¦ùi[ÿ”¸?µüÔb¡ôq×ÖyZu¾`ÎäÐæÓ¼4ÊÀg‡¬ß¦!„BüÛdäáf_øÏ9Æ|ºÿ0 ûðÓÅ}ä˜òø°ýÜí]È*È¥¤ïƒVœ<Ðå¦mâo+! yi)dœcƸŸ Í–r4ÿ›^£ U,˜K¸zVqöÂ!7µXû¦ìr¼®ì§Eïðé™[½ ב†#fÑ?.‚É¿¦ÉÙBˆ&õžŸÄ ™ó™ü­þ®„Bü{Äü¾“€€€2m«×ë˼íݲãÒ!ÆïYÂÖî³gû¥XÆí^L}Ï@¶ëµbBlê)^Ù1“_º¿‡»}ñ'ü[2÷0÷ÍÕø¼9‹—êß|[Bîá÷yóózL~÷?T¾q!žw”ùo®¦fØTzUÑÞü³ßU~žtãåû{™ûÖj*½9“¯=#KG–ŽcAÞ«Ì}½). ‹MÑ;ßÞ}“M¢x·[¥¿-ŽM\ÚÎÔ3Ï3gT£k·GæÿÑlö>4žEO@,ýr¿Ï˜~L˜ù,5죞oß™Âñ§æ2¶¥káU WþXNä*3Ãç<ƒ~úõœ°dsä㩬>e‡½F‡_‹'x±w#Ü”úF­)=ïI wöîIžž;––®×‹é¿MãÍïš9­UoI¸]«V­¢}ûöE?¯XýI‰Ÿ{ià€¢WŒbÖ®¡“™9‚N¾¶<SKÕ£‰œÎÐ6$ !„¸uŠg+†Í˜Á0ÿ­,Ù,Å!„¢$-}ë£UìØ|q7ü›°¸Ã›|Ðöõ¢bÀº³;iáS¿Äb€Æ­ OýŸ+;.ᇸ+då\å\Ì'̘ûé5¡yöFÖl;GŽL™ç9™håAÔG<\!9á2yF&×yâ'¶/\ÆÏ'SÈÎJ&þÇ¥,þÃÿë„‹ò>%,|)?Õ“‘“Å•£[øù‚+ukº—°®1rõB>.×Ïèôì¿X…æU­ÝØYȱö#´4nãó_þ$« ‡ó;¾à‡¬y´Ùñ›Ù¸÷ùØãîëƒ#fÌËɘ}Œ‡«ñÜ„H¦FNâµÇ¯ TöWR?æªä­ókI+÷~Ø“rýŠÓb~:ƒWë¦øVØëâïåßõF=kÇ bí­mÄÅï¾ñ.Å$„÷ˆùêOØSÞa!„š“¯ÔëÁÜÃÿ£ž{uxÒÔ§ÎMŸYîw6žßÅCƪ´¤£Æã븚5óÇòI¦çj­éýâãTvsaÀ›O°ú¿QŒø8;÷š´{v$´TiNãBÐãÝp›7‰Á?7`ÐÔ të;‘1Ú|2g4+s4¸VoE÷·ÆÓ£záß±VouüŒÏ—†±*µû„ôƒgj—T0’•–.Щ¨˜`¼|ÓÞ-yÜÆ“ìç†<ÿÖS¬Z6Ð5Ù8¶ ÷˜—hâªë`OâÓµ(³cuÚE'òoÌéÝWhåõ!s†¿PØ âH¥ú]yyÔÓ—²Æ¹a‰ýøb{•¼5Õø¿­ùmþl–<ËCþüe _¥·gô£Õ®/Z¯=§á·¿~V³zåxÛ:B”Iùß’ „B!„¸£î·[,X˜²%›/îf`Gy$ .ZG’òÒùêÌ6~¸°›‰MЯfÇòõ.2qyÓL>õ~ÑmJú†„;/ÿäj"¿­ÉotÄÇ΂)ûOÖGNçÈãѼÓöNÆ`"=~ ߬ÛÈ/G³x ÓSôúzØrº°EYnI(ÿ+ „B!„ "š¢¥o}>Iø‰åÇ /7¶Ó(´òmÀCÆ»êà¾c¾Ê±CZšq¹'Ű—t«Õ®=Pƒ%÷ ‰y>Ô«âx‡c°Ã£Á£¼4¦>îSùÃÎW; f“‹¢ÅN¾Öl"b IDATV±\HÁ@!„Bñ ACÏêíèY½]y‡R>:ww¨Á½Åú^Æô7Ö¡8Ø£8T¡Õ€7é[ÃþîìRWƒÇǽ†fŧÌõ!™M9ëMÚzHÅ í¼¤ß˜éw÷)J&_0 „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆb¤` „B!„Bˆbʵ`  èÉ»³ž£Žão[©Ô¨•ïÐÒùη}£»™C! níÃùpLcœ¬~Öž}Ç33z!Ÿ®|ƒmŒévs¸W}}7ÜsðîÑâ×ys–,dás™óÎãÔ°¿þî­æw÷•{§ÄÜ[¾¸´ã®lǦB!„åI[ž;7&ná³ãSxî៙¶ù ¦ßt¨Íó¡tô÷ÂÓÅLfZ*çÖÏfÆF=FÚ6§ü¤¡Û1æÝ¥à¯QËÁ¹ùxþ;ÞŸ ãÆòÙY 5Ÿ›CT×cL¹„ø»Wg×ÎdüO­™4·ƒÍ[©å  èÍÌè§ð¼šIc@¿w=¯ÞÊ™\sÑgîU_àØ€ÁaíØ¹‚ù·ßÜý0ÁŸ–Ï2bPGª;i 3Žo.eSBfë—NëOH÷Ú›7†Žïì[Í϶y–ŽÁRøZÁùï˜õ#‰¦›»îÏ [ÜúØ–íØÄ΋Ïà¹æî˜,:\4‰üºôC¾‰Ë´>¶åÐ/B!„âþr Z|;¾Äk½j ÀÞrž –³ý²,¹ÿæ[òŸ¦Éï‹ØŸqßÀù§Xóöë|UïæM#jü7\0^o³R›gÖ/WE‡£áë~ÌV½p$èÕ‰¼ÜÈ›*~—ˆ~u{s®mæÖ†ð¨.œÝŒ›—5LìŒþ€õçòAãH­Þ¯óZ7o²R.qKÃ3cÉU\iøÄ(^mçAÉmò6½¿Óyõ0‘~Zt}€µŸ*tn’Ojîõü;½Èˆ>uÑÁ>/ž/ç¯&&Ùgêö eäC.¤]IFŸæÝ_›9· |^'¾Í¡úçBž¤•—BöÁÅLþè8ùj±¨­c}^ŒM×Z:šÌhH^A[çG³á‚Q½?Õb¹æ âÝžáÛpjÖ¦ÏÇ£å+„ |ˆýïn"ѤÒ/*±èj?Åøa¨è‹iä»4þüŠYîæªÚ¸«å`ã<ûûâÖη3o…µ &rÛ’µÔ|r¡•¿&bñ2tês¢Ôy¦6j¿³ÔÆÀΓæÆòT½|γnÎ6Ÿ7¨™jqÚW{Œm/±ôÍiÄå)¸·ĨN p?¾‡«f•üT!„B!ls÷ öUy¤O 1³'ñýep®Ó‘6^N(— Ï™ÓþàÓÿᵞ58úéŸØr"LñjËÐAÕØƶð ÆÐGê°{Õ1r,y[Á[NMÿA›74Ñx ìšÇÂFü{FÞó~\OgktWøzÂÛìÌðâ¡ ³èöשNÅÃ^…máT®!“¢xºÑ¢ö®ÔrÈ=¹ õ¡i3 œŽábßÂ&½;0ä9_¶¼3‘m)ü»OfòËM9:{/ÙÞmøh>ŸŽÉîlZ†Î¥ÝmƒâÙšWžrbÃäög€gû1L}¥±Q»È0Û6–üKÄ|ù=½¦=̺ƒÊSékŒ¤œÍ§Á“s`Ú;„žËÃbC,Y*c›wœUs¿¢NDMVM¼ya©ÖŸ™–Òc±6~¥ögšƒŽ´ãÔ­,»vEAÚÞ¥¼¹×†~Q‰%ÿÔ—D¾½‡çg¾JƬÖ_ºñ4éù)j9”±¯MIÛXòY#‡tæô—^ nÏÒ)É0jsBmΫå®ú;Km΃ÆÙ×sˆX–ƒo÷ÉDhÂoQ{È´û¨Mqfe%’l÷-šÖ qß9®î[Áô}6ä§Ò/B!„BØêî L):ê@èÄñÆìc_Ì.¶'Üx9­‘‹?|ÆéÈçèøÓ ~N²~µ. )Õ2pìjágSv.búNÛ±äœåàù¿ž3“r°v@´>µ¨”qœ?3Í`JãàŽóä·¹¶‘9‹+µxvB{ƒ ך.仨£Àµes|¦ Ç´B!„·çî ÌYY1×+×&¸y BFEÑsëT"7$ÝnÉŽã«õ½xçé`þø0–L›þØÕ”1æÖMÑRÒ‚å†éjõ㵞–ŸÊÁLšŽ‹¦ßß¶/=‡|Îüô3qº\¶é x@-‹˵Ýj»¢Ûì´¥/áEccOX0\üè°õèK¹'Ü–q°s¯‚kA W ¬/ØÀLNjÅwWz,…Ï‚+ãØªôgé±\ûè?všÉ¿šŽÑ©® d˜Ww-¹éÝ`¯Ò/¥ÄRVj9í¾”¾.햄†ðöÒçH%/Ê™|ð*s^Gé¹Ûð;«tFŒ7¶i±¥sÕŽM y‰ûØðñ>6 à\ï)¦Ž}}è{ÄÙpL !„Bq;îþ·$8Òµo[Ïš}Kyñü7l!G+õaD=+"bI͆¥ëš>¼ 3æ²QeNØ:ç‹ÅVúï,ÕÜ-vX²’Q: 'ì9ü\ùjN,™–²›f’w|ÌÚºC‰˜ÿ“Ŝ̛ fÔó+©_>Ø–\öB!„ÿ:‹Å¦kf‹Ñëõ´mr§ã)?Gšãyv?ÇÒŸŒ$T»ˆñŸŸ³é+ô„¸m÷ürB!î1¿ï$  LÛêõú2o+„¨¸V­ZEûöí‹~^±ú“?÷ÒÀEÿ¾_«øa1bòhÎÀ)Ï`—öÙX}A9âÞ¹æàýƒB!„‚Á Œ\Þ¶„‰ÛÊ;ñïu?ÌÁû!!„B!Ü‹‡ !„B!„âG B!„B!„(F B!„B!„(F B!„B!„(F B!„B!„(¦ü¿%A@ßYQô²Ó“”}MѲ5Édm#ªõ eD§Ê¸ùW!}E(“~MÃ|O¾Sì©Ñw #:RÝ;¨¡ÑÊ+ï˜î•»—»R©Óç¶á«áÓØ›sgÚB!„Bˆ£Šq…ñ?G‡3þí6 Œ\Ø0—·ÇE°(æªÍ…m@oæ}±œ1­ÜP]íAÌ›Ò Ïré…Î®Éøð•Äÿk ±’»cO}‰z·Þ²9å& ÍþŠ\,¸ü‹B!„¢B)ÿ+ JaçÛ™·ÂZ9mÉZj>9‰ÐÊ_±ø·q)AAfuÿëI¾é-þ^dDŸºèŒ`ŸÏ—óW“lT‹ÿS˜´–±sö‘iÅça&Eµg˸(v¤;Óð‰Q¼Ú΃“=Úäm,z§ó,êA:· |^'¾]xæÝ¥MÑ]Ö:#–\´ø¶Àð>µÑ™u8™N²nÁÇì¸l´øv|‰×zÕ@1€½å<,gûeµ Eï£_p.äIZy)d\Ì䎓_Öý©æ J}^ŒM×Z:šÌhH^A[çG³á‚õ‚^È˼©âw‰èWo¸ÂÀ­ áQ]8»;7/k˜ØýëÏå[i³´Ü-Té3…·8ÇÅÊõpŽßÃe¿il÷‘³·’ìÔšð9pj·õý©ä¨gýÜl:—¯’Ÿ¿î“«ù?Æ-:J. qoɘéÝØ>‹ij“^mÜUƯÌ}-„B!„ø7¨°SÒ6–|Öˆð!9ý¥ƒ[ųtÊÁÛ*˜“öðCz7ú…åY×_W¼;0ä9_¶¼3‘m)ü»OfòËM9:{/™¥®ïM\‰ù‰ÄÞÝhì~€]é|ÛvÃ/îk\5ƒ+>†½, Û©\7B&Eñt£-Dí+ûéoų5¯<åĆÉìÏÏöc˜úJ+b£v‘aW•Gú3{ß_ç:iãå„r9ÓÊUFRÎæÓàɇ90íBÏåa¹«ûS‘wœUs¿¢NDMVM\Æ kkúërlYo95eü=n~ËdD〲k OñïIxÏøqQ&Ò/^Å—MNF69&ŽŠL`É?Ç®¸ Ì@zÂqrzÔÂÛn7™*'ïÍ™‡Y¿ÿ)ú·öfï¯ mº¹±{ùq¬N{•qpP¿Š8PB!„¸oX²Žñåìh~ÈaÔÄ4ó°aÕlʼnôó„í[Î…ì$šWª‡‹Ö‘S™YÿüdR³Axê\mj+/~1¡Ó~#·ÑOh†ómGw¥ ‹Œ\ÈÎÈÆ–®ÁÀ•¸ ˜üÇ߸Ÿé£‰Ã™öÞcx#'ÀBFÌ,BÁèÚ‘°÷†P_õ–R yç·ñéGß°#! £Ce‚:öæù§;è¤Sq›?á³M»ù3Ý„®R:>>g:â¤rö3}h4q6íKÜÏ*pÁÐ8àí¥!;Ï‘J^:”3ùwd1j8ó#› ÆÓ«î)nZ£¹ùƒ k‹5s‡7Å3ð™–T¹X™»]D'.LuµúñZO ËÇOå`¦MÇEÓ¯ ñ*Šæ†È,.þ@tØzôÅ~ûdqdÅ^¯\›àæ-EÏ­S‰Üˆõ‹ÌÍä¤f•ð íÎìïæÊÙ„ù–ëM¥ån‡,5h1M£¢ÍLE/*hlú¯"Ó›ÅîõªŸRèhú…èóÖ73—>êã'„Bq·˜IÛûëOç?3ï]3c&½p[Eƒ„Œ‹¼²c!þÁü7ä-þ÷½¨F¿wßgÎÌhÞ«pì«o9ù¯{ »PSa¯0p¨Ù‡]ô¬ˆˆ%5–®kJøð.$Ìü«Ïð³Aî‰ü˜Ö•®õ€9õw–®©ÇÈ·§ñ¨AÁ!'–å “mËYé¼?ÙãÄÌÞé,Yy¥è\rÞ©Ml5Œ`\X#ô—N°ë»c¼Øï:_ÈN—~ŒÜ 7;Wª{º3$rÙ¹ñ¬˜¾’øüSlÚ®0tâXZêSHJO& `Nßòeõyí©´5€ÎtŠïæ'V i$Ú÷gôŒî€=—ظ$Ný!ƒV”y*98ÔyºôÜóÀœ~”_Oö&ôýhÒ3²9³þ=nKV=GoØ›1ÃÛá­u¡š»SfðT^ŸÍúˆƒeüI5w+,¹é('¬¿/¾nI¬›[ô, ÕüÌ™Ú|š—Føì·w¨ŒƒÅJ%ÅòÁ¶dµ½ !„BØDã\‡Çǽ³¦ñÍ)ãµ¢eºÒàÏÌD¦$°¶ÛTÍÍ×­^ÎM%îê9®Ò”¡ zñÁѯÙ°o±ÏYcNßÃÒ¨ÕìË­Dp»†dì‹aõ)Äç7‚º4Âþp,±»/RP· ç÷Á„mšûâàúöréfÏÍ¢WÏÇ òÃA¹ç÷`êõ¤KÍÂý¹5ú]ü¶³öò1^. ï-u¸UØ‚Aþ™¯ {ëúÏÉÛæºíöÚ4ê¿câÛýt™ï'>Ïõú£‘Ë;–1iG™Zæìçoòìç7¿jÉ9Ágá£ù¬è•õÄíðLÿ¿RÚË!îÓÉŒþôú+ŸýËDrÌJ"bJØÌœÉ±ÿͤÔfKe&is8¡%¾WÆýYTrHPË0]á—¹oð‹ÑœûŽ™¿+åÝ}DÛWôSöSò‡-­–žû哘À7L/|må›Ó ÿá X®òÇÇó8XRµF-?Õ›×$ù‡ùœ²µº«:î*ãg-!„Bˆ[´kÅ ~ø3÷¦“æ<øëtE‹G¯žÁÏÉ›®~œÎÔSË-€+yW²s.õ<ªñp•¦´ömHj~&‰9ÉTu¹•U¯™´ýß³/ªô{aúâIk÷³7ñz0ŠÎ‡ à…<Ðj,d•ø:SlmûYj×°'WG²C êxk‹vftjBs Än?Ì¡Ü㘪v¦šù§Â‚\t%Ø!–ýp¹¯B쉨ԙ•µhì[1$´ oäø‘ùøÈ|R½3Ãß|ziW1.•}pü«:¡õ¤ªp9“+Y&‚¸¦b ´~t LpÖE6}°„íIÖN k©ÚcÃB|q ð +îžD)Ä]¥x¶bȄ穗¼‰è/õ6ߣ&„BQQlýõ§¬]¡{å­nÍG5²¹]ƒ©G»Â‹õsMù¼´}&½ÛóÛåúVfZ‹Wp´+¼7ÏlÃs nzX™‰¬K…ÏHüf#¿ùëuW2ò-¸6Ä«¢Y¶}#Fld̓ýûÚ¨YÊëÕnÚ‘ZÛfÀ@RüELþ}ñ××N™ñ¥mKOb¶}Î&<„î§ŸŠZÕ¸Ô§KGöïÞË¡3.M¯G[SÅÀÏ&Ï6ÿ?œúã¾ýj=ÎÿÊ’UM™Ö¶°PcÌ7^¿%ÂR@ž±p;{¹UUÜ ü F=kÇ bí­mÄÅï¾ñ.Å$ÄíÈÙGäà}Ö?÷7æ«{XÁÈ ÇKm§Þ3¯ótË´iÉdÛyÑ û(^jî†P¼Ú1|â@:Ô„Ó{¶ó{üUtùÌ`ïÛ˜fYÄnÛBL¢z£ÇR_/Ö-*mS8›_‰†NÅÖU§Ïøw‰ÙÏ’:ͱ·tÀ©qj:hp{ðyF=Ó:>R.êIs¨Jó¾o1¾WU´Újôñu´F¾Ëı“øð×+àØˆC¦òM–Èæüñ8âââˆ;zˆ3Yò=Ýÿ6‹ÅrËßN ×ëiÛ>äNÇ#„B!„¸M1¿ï$  LÛêõú2o{…ŒÝóxcþA Àí nôßãXÿü‚éÐ_GÎd^býùß9—u™¨VC ñ ¾ÍØï% Y{gñú2wÞzo8AÅk Vpîãyg}6mÇE3"Ø[¿˜~’_-aùÖËàÖžÐiChéukß^!þYV­ZEûöí‹~^±ú“?÷ÒÀEÿ–[„B!„w˜G¿:T³;ÈiÓ) ®ß“V•°:áGæþ‚ÌlŒŠ IDAT‚\*;yâÌìÖéê\éŽDïp%þ"fÿ¶T)ù.ŠRY2óõªulI‚Ê=éQßöb€Ö£.=?œ¤““ùîâï,˜œHƒ^Tn=€A!¾Hé@@E(hè;+Š^vz’²/°)úC¶Úð- Õz†2¢SeÜü«¾"”I¿¦ÙöõebO¾cÑ)êÞ D æ­_y÷¯¡Á­}³Ú®e̼#”ôm‚Bü{\?†Ï;RÞÁ!„åBW£7oÏnÌ9Suüni1«¦©OšúÔ¹C­•3sçNfàQ/—[ì Câüs‚\¿– |ýqjüý6Ð8Öæ‰°<>]Æ] =ð'—Ü£@ ⚊ñ ã%~ŽgüÛ l(¹°a.o‹`QÌUÛ v•é>ãCÆ·q»þËJñ¦ó” ñ´Òœ];“ñá+‰—BÁáØ€ÁS_¢Þ-VR+”{ÃýÐgÿÒ×B!Ä ÁÁ·6uï`±à¾£xóð”yÿùŠ=ðЇz¯²põj>šÊ£eîcŵ‰àƒ«Y½z5ï½Ä-ß!î[å…A)ì|;óVX b"ç±-YKÍ''Zùk" £,—˜’‰Ù|‘>>ˆÇžß¸j»J­èæwœ¯¦cV\iøÄ(^mçAÉmò6½¿ÓyVñàÜ‚ðyøvtáU.mˆбä¢Å·Ý†÷©Î¬ÃÉt’u >fÇe# Å·ãK¼Ö«Šì-çÙ¸`9Û/Õ÷çÚšð9pj·õý©ä¨gýÜl:—ª9¨íÏÊ{¥å q¦nßPF>äBÚ•dôi¶U"ëóbÄhºÖÒÑdFCò ’Ø:?š  ÷çßéEFô©‹Îöyñ|951ÉVú-•Ú<˰~A¸*: 'X·ðc¶ê êmºµ!<ª gw'ãæåC` ;£?`ý¹|õ~QÍÁ‘àÑQô>úçBž¤•—BöÁÅLþè8ùVæK©9”¹ÏTbQëNÕ¹¤Ö¦Úœ/ëþÔÇVí½RcQ;ެôõ?„B!„¨ *lÁÀ”´%Ÿ5"|HgNéÅàVñ,r°lÅ̤íÿSý»ÓÂ{[’5øµ{ØÕÄeY@ëŠa/‹Â¶p*×IQ<Ýh QûrÊœƒâÙšWžrbÃäög€gû1L}¥±Q»È°«Ê#}‰™=‰ï/ƒsŽ´ñrB¹œ©~ńلÆ-ʇÇ2ù£,¼»…3u@vÎØM¦¢’ƒ½ÊþTÞC%‡,¯¶ |4ŸOÇÎdw¶ -CçÒΖŽÉ;Ϊ¹_Q'¢&«&.ãÄ +WÅ»CžóeË;Ù–¢Á¿ûd&¿Ü”£³÷’©R»Q¼Ú2tP5v„‡±-|B†1ô‘:ì^uŒ³-–Y?JkSmÎßÎþnalm‰EG©Ç‘ºò8„B!„(ø/Z- ¥WÖ*""7ãóÂË´ó¾ýpóÏüÂïšôéÓŒÌ-¿séÚÊÏÎÉ ]æY.æ˜Q܃èPË E±afÙ¸áá ŽTmä‡ýµ· ô±œ÷jGëª:@Á-ø u (¬Ò8Òµo[ù¥-£fDÑ3IÏñ=y~¶!7§åד½ }?šôŒlά…Û’1¥þÎÒ5õùö45(8äIJ|Áa²­\a`NÛÅÒ5uùvA—œµ ŽeÊØ¦µ1*5µ6Õæ‹Zw¡ÏÔ¨[K¿ÎGuΗy*ý¢ÖgVb)í8Ríë»t<!„BQi,Û.öþ;½^OÛö!·6€¾ÓGã´è>=Sp‹;ÒpÄ,úÇE0ù×´Û¼]á¹áïweýë³8hKuAQœGB!îs1¿ï$  LÛêõú2o+„¨¸V­ZEûöí‹~^±ú“?÷ÒÀEÿ®Whýè:™à¬‹lú` Û“¬ÝK¬¥jQ ñÅ-Àƒ¬¸{¥B!„Bñ¯Qþ£žµc±öÖ6ââÆ÷ßx—bªÈrö9x_yG!Ä?›GB!„BXUz(„B!„Bˆò"!„B!„B#!„B!„B#!„B!„BSþ=ÔÐwV½ìô$e_`Sô‡lµá[ªõ eD§Ê¸ùW!}E(“þ-_«(*¥R7¦ÏmÃWç±7çv[³§Fß1ŒèHuFs(ïNDùOE!„BQ*ÆÆKüÎø·ØP,0raÃ\ÞÁ¢˜«·P(°Ã§åó„Ï_ÌÒeKX=šuœïn'86`ðÔ—¨çp7wRŽû«HÊ!wsÊ/L:›ý·],(àìÚ™Œ_I|¹/Î+R,B!„BˆòPþW”Âη3o…µ &rÛ’µÔ|r¡•¿&bñ2Êx)âÝžáÛpjÖ¦ÏÇ£å+„ |ˆýïn"ѤſӋŒèSìóâùrþjb’àÖ†ð¨.œÝŒ›—5LìŒþ€õçò-¾_âµ^5P `o9ÏÆËÙ~ÙŽõy1b4]kéh2£!yIl͆ FÀ‘àÑQô>úçBž¤•—BöÁÅLþè8ùÎ-Ÿ×‰oGžÕuiFt—õ„Έ%-•Ú<˰~A¸*: 'X·ðc¶ê Vö§’ŸZ,ªêJÃ'Fñj; Löh“·±èý œÎ³€ZœVÞóm7€á}j£3ëp2dÝ‚ÙqÙ®­ Ÿó§vhPߟJŽzÖÏ]À¦sùVs/uŒT©mçHЫy¹‘7Uü.ýê W¨Í#µz¿ÎkݼÉJ¹Ä‰^t¨þ oÌŒ%×Z,¥õK©ìðï1…ÉAk;g™P|fRT{¶Œ‹bGº³Êø©°2?K³¬ã „B!„(¶``JÚÆ’Ï>¤3§¿ôbp«x–N9Xæb€ãíx u+Ër0i{—òæÞÂ÷ï yΗ-ïLd[Šÿî“™ürSŽÎÞK¦ÉˆÆ#e×<ž0âß3’ðžðã¢xòí«òHŸ@bfOâûËà\§#m¼œP.gbÎ;Ϊ¹_Q'¢&«&.ãÄM«o#)góiðäØö¡çò°²L+ŒÓ«-CUcGxÛRÀ'dC©ÃîUÇÈQÙŸj~–²Å‚âŠa/‹Â¶p*×IQ<Ýh QûrTãÌóTyÏ£5¯<åĆÉìÏÏöc˜úJ+b£v‘a6¡q ¤òá±Lþ( ïnáLЄ3v“©Ö×jc¤–Ÿêvy[Á[NMÿA›·S™/ž­Ð]áë o³3ˇ&Ì¢›Ázo+žjýRÚV&®ÄüDbïn4v?À®t ¾m»á÷5®šÁ®ôñ++Õ8íJîO.g–yB!„Bˆ»§Â ÀÌÕÝ+Y<…)sØøn$q96-cK¡ suAÉ»JN ,]•`ª¤íãØÕÂ7“&û±øÚï%°äœåàùÂUhfRöÁ…·2˜R8tÔЉ㠌ÙǾ˜]lO°²½–_A®‘¼S›ØjëÐ4¥ZÆ¢8Sv.búN¶SËÏP¶X0gq¥ ÏNhb0áZÓ…|{+q:ª¼çPåAjû7¢ÿÄwy @ë y~x*Xòϱ+.3žpœœµð¶ÛM¦ÚI겎Q™Ç¶ôù¢õ©E¥Œãü™iSwœ'¿õöìÕúE% sÚ~6Ÿ~’ÇšyòÇN':vvcÿòcdYP¿²ÖåTã,¥?…B!„S.¼½4dç9RÉK‡r&ÿ6lh&ÿj:F§J¸*a4Z\ݵä¦ÿu“¶ææM,,­žÍ&Ì%­¤ÍYY1×+×&¸y BFEÑsëT"7$býBk39©YX{jƒ¢hþ™¦”OZ£’Ÿ±ÜHW«¯õÔ°|üTf:Ðt\4ýl޳´÷,.þ@tØzôF˜-˜þŠY£ ±%ⲎÑíŒm)óE£Ñ )*ÉX°”8©J¢Ò/ªqdqxS<ŸiI•‹• ±ÛEtBa!ÃúøÙææù©gÉý±!± {B!„BÜm㡇%ÒðØPze­""r3>/¼L;ïÛ 7ÿôŽ{væÑ 7Ü‚ž!"r œ4¡÷jN§h©ÜÇ3G¸bmeèH×¾mñL=ÉîÍŸ³dÍI¼ƒüÐýõ¾Ù„ÅÞÇ[ Ýl 7<À‘ªü°¿ö–AËEf4öRŸŽ£™:¼)®­ØJÙ_™óSaçä….ó,sÌ(îAt¨å„¢(VãT{¯@Ëy¯v´®ªÜ‚Ÿ`P·€¢Ê–Æ©*ÍРà^«N—O“ú×´´¾¶6F¥)ëv* RÏæV‡jN Øyñ`‡@›Ú³Ö/¥³sâGö»t¢G¯fdÿ²• …﨟*•ù©g)ý)„B!„¨˜*ì5û0¢‹ž±¤fÃÒuM Þ…„™?SÖg¤™3÷±ôýêŒxe&‹]ÈŠç»÷——kÁœû;K×ÔcäÛÓxÔ àËò‡É¶vØF¢}FÏèNAØs‰KâŠ`gN?ʯ'{ú~4éÙœYÿ ·%«ŸÏ?Ŧí C'Ž¥¥>…¤ôdrQÐæ´],]S—‘oGñ˜tùÇY»àHá%æjûK-c~*òNmb«aã¡¿t‚]ßãÅ~/ÐùøB¶$ªÄ©–Cú–-«ÏkoL¥­t¦S|7?©èŒ¾%7åáá„õ÷Å×-‰uóbÉ´–»•1*•Êvö½3¼ÞZª¹{8eOå%ðÙ¬8¨2¸æ´Ý|¶­#§O£Çå‹ÄN$/ 0‡:O3vp3Üì\©îéÎÈdçÆ³búJâ­ô‹ú@ýÉ–'föNgÉÊ+EsOmüvºô+=µù©g)ý)„B!„¨˜4‹¥LKF½^OÛö!·6€¾ÓGã´è>=Sp‹;ÒpÄ,úÇE0ù×´Û¸]Aü#8· üý®¬}­®ö+(#M‚ñ<»Ÿci OFª]ÄøÏÏÙ¶øB!„°AÌï; (Ó¶z½¾ÌÛ !*®U«VѾ}û¢ŸW¬þ¤ÄϽ4p@Ñ¿+ÆZ?º†N&8ë"›>XÂö$k7ik©ÚcÃB|q ð KNRŠ ‹“GsNy»|°Ï>Àªè R,B!„BT8å_00êY;fkom#.n|ðw)&Q1åì#rð¾òŽâ6¹¼m ·•wB!„B¡®?ôP!„B!„åE B!„B!„(F B!„B!„(F B!„B!„(F B!„B!„(¦ü ÚúÎ[ÅGïG1sú(öµ³e#ªõ|“é³f2Õ*¦vöºc‰(•ºµòZ:߉Öì©Ñw<3£òéÊ7xÐñN´y?Är9· |ñÎYµÍ»Ð׊7]§¾Ç°%5f}wv^ÛJƒ[ûp>Óø^îT!„Bq‡”ÿ×*/ñóá|z¦ÀÖ ¸°a.oop¤áˆYô·u?v^´xnÏ5wÇdÑá¢Iä×¥òM\&æk1§ü¤¡Û1æÝzÅpvíLÆÿÔšIs;܉ï“Xîw÷º¯­ï¯LóÚ±ƒÃÚ±-r'òïL¤B!„BˆŽŠQ0(ogÞ kALä<¶%k©ùä$B+MÄâd˜­o_ûj1 í%–¾9¸<÷ƒþŸ½ûªÊ?þž›Éd&½! „^”¦ûAqeWl¨Á +% @‘ª°Ô¬mа «¢4ÁP¤—ÐJBÚd2ÉÌüþEJî„ ˜ˆŸ×óìó,™¹ç|N r>÷ÜsÚ¡ÞGwqͦ§ÁQ¼ÞПÊA—H|c ¿˜®_èÕŠ˜„NœÙ™†—_¡Õ¬lKœÃš³ù ÑÖó†uñ''ýÇŽùñxÕ¯xwÚ>òT£ÑØæ%÷ª‰Î¦Ã`=ÎêyËÙz¹P­W¨Ô}"¬bäŒd²í <Éø„¶l•ÀÖLwê?7”7ÚøP`uE›¶™³×rÒlWï÷fÄÌêÀ†'ò« ðTtè-ÇX=9›ŒP<‹oƒÚ88ââKÓ—FÒ·N0nçX=cÎYœGeªPkŸZ¿ÜVoÚC—ó’°2…<ÕáU™×j㧯˫±Ã馣q|}Ì©lš›ÈÚó…ê}¦q§vïHÞ~ƒŒ+i3|(Éž!!„B!DùSnÖÔÍ,ü¬!1ouää~¼Ùâ‹&îu:Y`͹HšKWšETãbòY®%/cjòOÍZË{†FÏé~Ç……h|‚Q¶Ïbþ±B*õˆ#¦G ¾Yp„ß–¼ÔMa嘱lËòã‰1Óébq°@ß– èk`í„XvgoÛLЂ} ÛUÚhåÊŽo¹Ø³ yïa{¦†ÀÖ]:¼’=×làâI€åDo$%Ï‹vãx¡áF’MÅXº8]ªÐµW(;ÞÏ/ƒ{­ö´ò3 \¾µcãžeúµfà+!l‰fs:´ÄÀ®µØ™t“¢Ò•qp”2иá¹g±‹Mv›@ÜKù1a¹>ÎŒƒz™ÙjïÒ>Õ~¹Y© ÿ>œn™IÄå(YªóÚUeüÌGIšù%µb«“µø¶js"ǯ5ýŸÊçÓ‘ÓØ™ëAóÈ™´q¢B!„¢\*· °qmç V„Odb”‰u“â8lr¼W-1} 3'åÐå©^¼óly)lþ÷§l8¢¾À°›Î°÷\Ѫ);Õ„k¸   £BÖQNeÛÀšÁÞ­çÈoå8×ʨY©!ý¢&Ñ@ëæ |Tª¶ŒÝl8ù°c¿×—ЉÅrá$F¯Áh½&ØrØ¿þýÿÚœÊ*ÒÎe;‰'Šк°> ë¡aÉèÉìÍv#bT"}î£èEƒ¦Dqæp`ÙÞ©X“ð¦Íh74›&·ö"Ž7ôkîùS‡m(f+¤ð·×Ùo™Sã Zfñѽû¥è#¾ÖCr{‚nõ`éþœÒý>Øœ¿âûÌ Ð(.7CpÑ–ý¹ªB!„x´\ÍÏfÕé-ì¹z«ÍŠ»VÏãAáômƒN)ßË›ˉ¤ilk=ŠW븕u0âUŽÿ5¯%øé<““DlÜ^~6þ¥ W!°k ó£:¨°cÍ·`Ӹ⢲Fs¤àêi2¼jbPÀÅF‡¢+ÉuÆ}œókCË*:@Á+ü9^é\‚ ŽÓ±oØíÑîÏ4!÷ûMœ¿~V¤‹Á]ö.˜l(Þ x<Ì€¢” ÏlrñÂÇMôTi„kIâÔ‡Ò¹wk|¯gç†ÏYøÉqü9l¿Å¸ >MxÌOÚgòà<5¥hƒC(MªéÑ à[¯—NrÕZšq(¾L5jíSël™ذ’æî¢öÀWiîSÊ~q4~6+vWwôwT£Ög…©)dø6 º‡Š/ Z† ÿùB!ă²éâ^z};–•§·PÕ£"Íëá¡ÕóÁÁ/xáûXNe_t\ˆ=—”o1aØkôïߟAãð¿”\œÛËlæÐüáLÛý›»Ö ~]õc½Lÿþ/3xì\ÖÊâÖ?íäú†ùcÓ¿^ËÂoRȽ-+iߌ£ÿþ·ÿoÈbŽÝ8Þªà"»ÏÒ¬ªžã‹ý¸»hçñu–”ñNÿÌ> vòµƒxlÙY7qƒ_¦ÿW»oÛ_…çøbäP>:ò@NåL¹MÁ¹UïÅNF–Åîãj.,ZAÌàNœ˜ö%9în6Ò¶.gUíÄÎ}»UƒbKcÏòØ— ®¡=1¸ þZB¼ýO_ó >›¾”½*‹@[ÆN>ÛÜ·§N¡ûå >yspѯ[­ùf¼\<©êëÍ[qñäæaÙÔÉÜÅâÅuöîdZ[@gMá빩%¸3˜O±q‡i=3Y¸âÊÍ¿|Ì)ëÙd¨è†/cûׇxµÏËt<:Ÿm}Š%?…õ[F¤¹1ÔÌ4òPÐ6µ8-\tíÇðøn€+—X·ð°ƒÃÁ–±EŸÔæí± <]ºü£¬šw€;hTÚ°1³$sŠ öœ4”ƒ‰þ[%‚þ¾5Cãè‘jäè #æ Rdä„B!®Û~ŒQ»>b@n ¨Ó­rëhå¬w/gÈO‰|üd4nÞÅ”RÀùµÓHøÆÞƒ¦1²¦ž«û¾á»ãiXjz8q£ÃŠ)ë7» ífNü¿©$þ\ƒþï}@ë`;ç¶}ÂüñXÆOä¹ê:°œæ«9+Éì2‚ÙCÑ\Þ÷?ár~aúÿnr¡ÂSSø×S7ÊÍfï¢Él¨Ù“š×ïî¦þÊqŸætÓVÀÅ—”ÍÍmB3O `áÜö}äiuj{XÄcåÂú¼¿Î›ç"g1®ªSß/en|"L‰¢koý¨ÓØí%ØG}F£‘ÖmÛ•>m0½§ǰ`Ü}¼Vñ†ë¯U<Ë„2Jù¸‚“4z‚‡ã{f7‡2BŸ#R»€ÑŸŸ-Ùâ_!„BˆlÇOÛvêZ£Ñèôµ‹;/lœ@¸㛼rÏïXl…ôß4…Fþ5ñÒ½ËÉÙÍï%á?"WêèïªÅ|î–/ZE²1·Ð'y=²MõG˜;ú+Âz…±ÿ»_8s¹€ª=G0¢gE}0ŠÄÝÙ qEçõƒÆ¶fã„/¨:&¿×¼ž~°çqdÙ(¯½ÊÌw›áiJ&~ø—4ž<™n%\p[N}NìR7ÞŽíMˆÀJÚwÓYnÂ?÷ASxŽ/ÆÈ_+–ŽÑ oá…Æ’¿&}FŽý2–ch³!–¯Ã'2ñ/qòÎgôç5‰È’ÅÄcÚÏü÷>B`ƒêÝsÂu IDATÙ§¢IÐÑ9rñqCèX’_-Uº'.>†­|ʶöB¬>Mé?qÓßçÝÇöóñúó’,B!„â9˜qšS9\¿×]ŸË<Çç'¿G§hy³^6œÿ‹íÞÿ·“Iq}Œ6Õï^ØÚóŽòÙ¬ÿ`}zóÏgt‹S|üÉ¢­ùyÇÙt®>oNšÅ오ÿw%s=húÎ$^©¦§Áðy,™?‚FÙ¿rÎN˪¿Ù« 1P½mC´§÷q©0Ô¢kD6+g-bݾK8z:ölöÿçgüþ¯Unì·gqx¯†¦u½ní°)µªÍ•­‡É±ƒåÜOõoE54^4è\‡k?í!Ý `áÜÏ'ðnA€GññX.îá8 èPÛã7^½¨ÿDm ïåòýÞï8eÿHB¡‘U#^aÕý]Ä…u³î!Åt_ ¹¼y!Q›Ë:!„B!M)Y¨ì^@½/»y²r§²/2èÇYCÔô™Ìœ9“™³æðáÌ7¨§vâ§ ê*7¡zÁ~~:ó›òí&Nl=Œ-¬1•\ì·ÞÆ­xP­ý_éS=“'²îq&›•k'Ïc ÁëfrÀÌÙ_ҨѤÒ=îþê¨úxC®|õûƒÚQ×ý·ê©Ù1œœ{9µ¶ˆæiÕãQü«ãs†ÔüÛÞ%NÞÅ3äx…â'·Ÿy’0B!„B”k ýjâQEG×êY‘•]&1¾É­dA¡ÍÊâ£kéÜ rƫ1}ÿâɶù ùßá+䘮qvÇÇÄÏü–Ìê]iš»ŽO6ŸÅdkö9Ž_4«¿nQ£ÇÇÒN\Æ\hÁêÙˆçºØ21ßO'7'#ß,⣟}øKŸxhÀ|âS¢cñíA#Y¦®ÜÈwç=©]Ýû‹³B®ÏÂ-Àƒ›ù‹‘Ý*Ӵʽ_f® iCcMUÛׯýŽ„†[õ'ˆÈýŽÕ›Ì„·ÆõxtAÍiá}‚ÿíJ¿µÓÂz…ߞƯeÄõ×Õ‹G™ ±B!„e$¬F æÍM@@N¾¼¬XF£EQpssÃÇÇEùcÞ/T4F…÷ãs 2øñJí§ñÐÞ:@Àlµ»{FS:3ZV)IGµg£©ÿŸÌÉÇÙ6ÜCZÒóÕg©èåÁKÿxŽý3!Ësqñ®N›ߦFs•â44x¶ ^³ÆóæwõxeòºôŽb„vÏÎ “Ϫ-èöÞhºW-ZàëÃzòJûÏø|Q4IW Ðx× ]¿wùkÍ{% ÉÉÈGj¸™L(¼¼—“þÍy¶¸¸V£oÜ4lw°ß±“BJû&¢Œ oWÇñhBøËK-ùqîû,.x‘'Bíœúþ¾ÌlËð§Bn-&­™ü8åM~¼ñgå1þµb´Jlj?ŠòñZÅé <ãb$5÷<ë?dSê]O Ýy!="Ò¡"^•*“¹,’ñõµŠ®Të=‚!B©ê‚„‰üzç.&J….LÙŠ/OáÓïïÁ*O±üÎÜ›3«ÿþÛ¬ZæCèkşΓÆSûã1|täÎÂ×wÿs÷AÐàÕ6šé­W1xÖß«R!„¢Lløï:ªT ÆÛÛûÖó÷˜Ýn'++ ›Í†ŸŸŸÃï—Ç×*Þð¿ó»˜¼7‰J:7¥‚Þ‡39—øß…_0¸èx¿å`êúT-ë0"+—×OãSÿa oåuç%ºþÒÚñ¼Ÿúñ¯ÕâÞ{î¾&óÈF¾Z½ŽïæP£C_ú½Ð•ú>%{%¤(?þ¸¯U,¼Äw‰1Œ;¯É€BÎ¯ÉØQ±,Øq­Ä‰÷¦£ùä߉ô«¦\©þ·Ù|¾d Ž_ZÀ™UÓ³‚»Ö\úz¼9ù5êó|“-ý{Æ|ŸÝ%^p9¨ïwUžbyÔýÞ}í¸¾ûŸ»8ü}B!Ä-¾¾¾5YEz{{c6ÿñÿ1÷tH þÓu* iɯWSøÏ™¹hºÊàz½ø²ó¤Gõžâµ#x6DÁìâ§‹›µð®ÃÅ£§Ü>’àØ‘÷¢›±#n›Ó´T~<‘WûѲœÞJ`%ó24ë\ƒUŸ*tlœÏÕ¼ëÝqç×£U4‰Ö¿<µ"õuy5v8Ãt4ޝ¹ •MsY{¾ÐÓà(^oèOå K$¾ñ›»´ž-‰™Ñ•”êÕ­D½‘53ç±þl¾ƒ6h lóƒ{ÕDgÓa°gõ¼ål½|ïwÍq¡R÷‰Lh°Š‘3’ɶƒð$ãÚ²qT[3Ý©ÿÜPÞhãCÕmÚfÌ^ËIG/…Uí3µ8µ¶aÏTC±€«ýëæ-a‹jŠÚ^¡Õ‹ êÓOE‡ÞrŒÕó—³Éhųø6xµ"&¡gv¦áå@h5+Ûç°Æa_.¾4}i$}ëèvŽÕ3æ±áœÅÉqpT¦ µö©õËmõV ý°1t9ÿ! +SÈS^•¹«6~ª¿*}¦q§vïHÞ~ƒŒ+i3|œµBˆ?ûCMÜ Ñhø#eÅßÍ‹u»3 n÷²å÷§Ðqô('.,ĸf‹ùÇ ©Ô#Ž˜5øfÁ¥ 4îAxî™AìbÝ&÷Rc~LØE®3ã ^¦Ú¸£Ò>Õ~¹Y© ÿ>œn™IÄå(Yªs×UeüT~ÔæDŽ_kú?•ϧ#§±3׃æ‘3iã(D!„BQBZ‚Ÿ™ÊògJWŠ‹_#úŒhDŸ”ø(· °qmç V„Odb”‰u“â8l*}VÔžwŒoµbà‹ùl^ð 5J›0(M,ùgÙ~¸èõ)™'ŽbꆿËN²UnR»VnDÍJ é5‰¾Zw0á« ºPµeìfÃÉçyº‰/?o3о£»—"ÇØr¸RÆ‹cÚ¢X¬xV÷ ßÜ>B5Nk:¿t#2j4¡;’IÞ±-'Ô“ºàB²öpèZÑ7Ó·-`ê¶ ToƒÝt†½çŠV¯Ù©&\ÃÝJô<Ž=ï,?)Šíꡃät Ãße'ÇA­LµqWkŸj¿hŽnïYñg&ŒûµÔI7œ?µ9‘_±6þ9e²-—{ŒXš–2N!„B!D©”ã„ qÃßOC®YO?Êéüp°a>§¿ýŽÃº<6 ¨QÌ·EãÄsA÷Éf¿õÜFACIÎo°c¹ð?£×`,É×oÖ•ÃþõGèÿ׿T¾P‘v.ÛI`þæ4”ОŒÜ­!Þ~„NŒ§¯ùŸM_Ê^+Øó2QžLt¿@½RY=kÙvõeîbñ⺠{w2­- ³¦ðõÜÔÜ™̧ظÃÀ´ž™,\qåæ~sÊz6Y†0*º!ÆKÇØþõ!^íó2Îg›GŸâcQé3›Zœ– .ºöcx|7 À•K¬[xXýpIÀ–±EŸÔæí± <]ºü£¬šw€;hTÚ°1ÓÉ9¡¸`ÏICé0˜è¿U"Èó"_Î(#œ•2ÕÆý¨Zû.ß/·6h0§¬bþÆFjÏɛɮQ|})Uæn®úø÷û`U볫ÛùøûÖ O Gª‘£'Œ˜ƒä!„B!Ê’Æîäq©F£‘ÖmÛ•>m0½§ǰ`Ÿž.¸Ï‹õÔ2~‡c™ðCÆx\áwäÞŒ˜ÙYóÎtö:Z) !„BˆGÒŽŸ¶ü»Ôe4KTWI¿'„øcIJJ¢mÛ¶7ÿ¼ì_ßó{¯õéæÿ/; ´AtŽœ@xÎÖÏYÈ–TG…k©Ò}(ƒÚâìCÎáß%J!„B!„âO£ì…FVx…U÷wÖ}@̺‡ÓïÁ”LÜ›Ée…B!„BqOåøÐC!„B!„B”I!„BñGb·`²ü¡NïBüAIÂ@!„Bˆ? ë5v/‹bØèÅìtô^f!„(%I!„BñG`Í yùdiF¿6—Y>e‰$ „Ns7îþ™»ûm–„B!„å5ƒ_–MáŸçÚòÑýèÒ÷=F>yE’B§Õªv÷ÏÂnÿYÙ' ´Áôž•ÄÒÙ L›:”']Jr!=þÁÔéÓ˜›”ÄäŽ~¬!J….$¬GswÇßuÌ•j½G3-q>Ÿ®x—FúQf‘ûŽÓ½1ÿEÄÝI¤ß?–GâOçÉ0¨Þp´uÊŒ…ó™?g&3Æ=K5×ßT+ã „B<²L‡þÿ¾ø8ïêMmw h ÔèñF>™Æ—ÿ>PÖá !þ€š4nL£Çân0àîîN£Ç£IãF·}§ì_«Px‰ïæÄðéé‚’^Àùµ3»VOý!ÓéWÒz\ühö·!ü­©7V»ÍE~Xô!_ÎæÆ±1¶ôï?p …æûoÆÝ 8³j£¿mÉø™?ˆoz°q>¤Xôõx3º ›ã–q,¿LB{´h+Ñ®[MÍÁÒ£wwhyšB!„x°ÜÃ2=4¿ý¡Æ@gÆ2­¬‚Bü¡)ŠB³&MhÖ¤I±ß) ƒ{p ìÈ{ÑÍØ7‹ÍiZª??žÈŠ+‰ýhYN ëò4/µ¾Ä¢Lá°YÁ»Ù+ íP¸fÓÓà(^oèOå K$¾1…_L.Tî5‘÷jœåBÅ:¸ÙÅå F<æò-qïo"ÍÐ’˜]IÙi¡^ÝJTÐY3sëÏ:Z!k lóƒ{ÕDgÓa°gõ¼ål½\èàºââ¼Z“Љ3;Óðò ´š•m‰sXs3ÿ}$ÏÕ &Èp‘ÕÓ?à¿g-bÑ><žÿÍÙvÏÓÂO!wïGLXz”|µXôuy5v8Ãt4ޝ¹ •MsY{¾Oê?7”7ÚøP`uE›¶™³×rÒlwÐ-Z½È > ðTtè-ÇX=9›ŒŽÚPÜTáùø¡Ø?ˆaå…ßÓQ뵩¼|n*¾Ë¢b‡WÒ«6ºBp5ዹÿbGš£~ù — ´6†.ç?$ae yv-í_cØ3ÕP,àj?ǺyKØâ`Üu5û2zÐã„…b}{ ,,§¾dú‡;U殣9áìB!DYÐÜçÏ…¢´ÊmÂÀšº™…Ÿ5$æ­ŽœüÂ7[aÑĽN' ¬9IséJ³ˆj\L>˵äeLM¾ñ©™C‹cyÏÁè9Ýo»ÎV¨àÁO,YšGÜ;:>‹NB;©'Õô›H³YÑx…RqÿH&,ÍÁ¿K “_j̶ødÛ‹EñmÉ€¾ÖNˆewø¶Áä-Ø—°ÝA‹k!Ÿ`”í³˜¬J=âˆéQƒo!иáµg&±‹MTé;•1=j°qÁQ Tc)$ýL>õž’=SÆyÖŒ½$±˜’4óKjÅV')jñí; O,¿° z#)y^´ŸÀ 7’lRmC_k¾ÂÖ˜h6§C@»A ìZ‹I‡0û8ÑŸ…œL5ðD€—Üš´¨cá`r:•B.l7ÿã¼õ·@6Ž‹bsº†JÝ&0áõ¾ÿ Ùvµ~¹NãAÿ§[fñ_¥g\«ÐµW(;ÞÏ/ƒ{­ö´ò3 \¾µËå^,)_7vŸöYÓcYsé·Ï*:7'Š÷­S·«D"„Bˆ?£ÑXÖ!!°.]ºÜ÷5å6a6®í\ÁŠð‰LŒ2±nR‡M*+𒔘¾…™“rèòT/Þy6¼6ÿûS6Q_¬•Ì ×°˜s1eå’e±`²êÐ+°‚=ÿ,Ûga2OÅÔ= —d«Ü¨u­Üˆš•Ò/j}´î`ÂW¡TI»é {ϭγSM¸†»Ý<ßÁž›Â¶CEqfœÍµ–Åa,6 ò 1§¬gÓ½Åΰåp¥ ŒÇ´E±Xñ¬îA¾‡+ `Siƒ.8‚¬=ºVÔAéÛ0u[Q‘nNõ§…ÔSy„T j­~ôëXÀ×çÿMŸLŽ_± «NåŒä›õ¥ØOîÓõtý…l‹ƒ~Ñèéö.‘f¸_oÅ`Mç׃nDF&tG2É;¶³å„£ùW:Åõgqã.„BXÖ!!Êrœ04nøûiÈ5ë©à§C9_Ê…•óÅdÖ.Of- îuú2y䌑°×¤~Ýv}Ih·Ý\ÞÜþe³c½ùC %9©ÖŽåÂÿHŒ^ƒñAlk³b+nUo+¼ùÙí_q‹ ÓÕœµª$ta}ÖCÒѓٛíFĨDúÜVJŠÝtçL’~*÷6µiî}…¯¾ÖÑ"¢&å?çÞ˜iwÔg·c¿›J¿h øZqÈí ºÕÿ¥ûsŠæ®-‡ËÆðNÅš„7mF»¡ ôØ4™¸µyhÛŸi !„B! eÿ–„bi ~z Ïä$·€—_§iÂUìÃü¨jìXó-Ø4®¸”òÁ/¡ MB hPð«…áòI½Ý¦À¸s~mhYE(x…?Ç+]‚Ë$ƒóÐb±Y±»º£¿cØ\ ~è²ÏpÁdCñnÀãaÅñØZŒû¸àÓ„Çü@! ýp&ŽÀSã|,WNSP»ÍrfÏž}è:¶§âµã\)ËÅ_1ú5¥¯h©þúÓ¸R’•½-“VòÑÜ]Ôø*Í}®·OJçÞ­ñ½zœ>gá'Çño„®E>hÅõ™B!„B@9ÞaàV½C:Y»«¹°hu1ƒ;qbÚw8w&›´­ËYU{ ±sŸÃnÕ ØÒسü#öå‚khOF nƒ¿Öƒo?B'ÆÓ×|‚Ϧ¯à¢ƒ’íy™(O&º_ ^©¬žµl;¸Õz‘o6ÁËÅ“ª¾Þ¼OnÞ–M]Á‘Ì],^\—aïN¦µtÖ¾ž›êð.sñq.e¯“w‰m#–l;¶Ìƒüp¼'‘³ÉÌÊåôš˜¿9­h¿e£¢b¼tŒí_âÕ>/Óñè|6fªÄ™±EŸÔæí± <]ºü£¬šw€;àd ÓO‘ÐÍgÇÉÉ0°×©vÁˆÉ¶«?±è“:¼=v OYÜLûX2o?¹%~.Cƒ9eó7Æ0zP{NÎØLš%ƒ‹®ýß‚påë&¯¤EÞƒ³s¢¸qB!„BÝnwê±t£ÑHë¶íJ6˜ÞS‡cX0î>^«xÃõ×*ŽeÂõ9ðb¹7#fvgÖ¼3½¥Yõ !„Bˆ??m#8ø÷Ùág4KT—Ñh”3 „@yÙa  ¢säÂs.°~ÎB¶¤:ºU®¥J÷¡ jˆW°9‡—(…B!„Bˆ?²ßa „B!ÄŸ”ì0B”gåøÐC!„B!„B”I!„BQf48¹á÷¾Øív4šR¾Lñ§# !„B!Êȵk×ÈÊÊz¨I»ÝNVVz½þ¡Õ!„x4•C…B!„øòöPæÏ›ƒ¿¿ÿCKh4ôz=>>>¥|!Ä£«ìÚ`zOOà#©¹çYŸø!›Jð–„‘ éP¯J•É\Éø²z­bQ*taêÌV|9x ¿˜JpÁC|ýã}Çâ– Žƒùb} ùfò.oeîôÕœ¹ß·n–WªõÁ¡Tõ?AÂÀD~5—üêûïÏÒÕ'„Bˆ²sòÔ)þ¯û3¼Üßó0E!Ä£«|<’Px‰ïc=v^ ’…œ_;“±£bY°ãZÉú ]0™§+ü¶ÉZBÿ:Äþ5pu.ò2cKÿžñßg÷Y ?¤XôõxsòkÔq»Ïµ•h×­&‡fàíwþÁ{SþHÉ€άšÆè˜¹×ÂÝA¿ÜÿØ:¨ïQàì\B!„B8­ìwÃ%°#ïE7cGÜ,6§i©þüx"+®$ö£=d9³•  •Tõw…´üë?ÔââNÆOi¢%°ÍK îUM‡ÁzœÕó–³õr¡ƒ‚µThõ"ƒú4ÀSÑ¡·cõüål2Z@ñ¤þsCy£VW´i›Y0{-'ÍvðjELB'ÎìLÃË/€ÐjV¶%ÎaÍÙ|õéiðF¯7ô§rÐ%ßøÍ]h‡ezÐøï#y®n0A†‹¬žþÿ=kÕ¶ë ž@σÿæl»çiá§»÷#&,=J¾Z,úº¼;œÎa:Ç×Ç\ʦ¹‰¬=¯ÞŸºš}=èqÂB±¾=‰ –S_2ýÃ\³©Å¢¥R‡WÒ«6ºBp5ዹÿbGšÊ½&ò^³\¨X÷#»¸ÔˆÇ\¾%îýM¤›ŸrQ¿Î­1³:ðŸáEwó=ZE“Øi ‘ñûPÝÀ¡Ú/*ýéÙ’˜]IÙi¡^ÝJTÐY3sëÎ'çµZ}jóZu¾¨Ä¢6wUûLK`û×öL5 ¸ÚϱnÞ¶8ü½B!„B8RnÖÔÍ,ü¬!1ouää~¼Ùâ‹&îu.Y`ÍâÜe…:ôužgìßÌ,MØLe?3g®ä£ñmÉ€¾ÖNˆewø¶Áä-Ø—°]µNů5_ akL4›Ó! Ý v­ÅΤC˜O,¿° z#)y^´ŸÀ 7’lk!Ÿ`”í³˜¬J=âˆéQƒoA} hæÐâXÞ3D0zN÷;Ú¨^¦Æ=¯=3‰]l¢Jß©ŒéQƒ ŽR ÚöBÒÏäSïù'Ù3e‘gÍØK‹ù(I3¿¤Vlu’¢sÌѺö:KÊÄÝÅß§½AÖôXÖ\ú튾øXÿÇyëolÅæt •ºM`Âë|¶B~bÉÒ<âÞÑñYtÚI=©¦ßDZnñ±¨^çì#†ªý¢ÒŸ6+¯P*îÉ„¥9øw‰aòKÙ¿“l•X'çµj}jóZmŒÔbQ›»j}æZ…®½BÙñþxþ{Ükµ§BL|à IDAT•Ÿ.gßϨ!„B!î¡Ü& ÀƵ+X>‘‰Q&ÖMŠã°©4Ázâž!T¯]7OͪÂÇãÇR p­Òˆš•Ò/j}´î`ÂWAua¥ Ž $k‡®})}Û¦n»Ñ„®„ñ☶(+žÕ=È÷pEl€Ýt†½çŠV?Ù©&\ÃÝJýŒˆZ™öܶÊÂdœÍµ–p­¬Övy…˜SÖ³é¶dAY(>]åp*g$߇´ûÉ}º®{ÈÅJæ…kX̹˜²rɲX0Yuè ¨¶H庒<9ó€ÙóϲýpÑøež8Š©{þ.;ÉV¹™®>¶NÖ§:¯‹#ÕXpò÷ÁšÎ¯݈ŒMèŽd’wlgË I!„Bñ ”ã„ qÃßOC®YO?ÊéüRlh#ë\*®©GsK¬]ïÆ“Mk`³žg‹Ùر\ø‰Ñk0Þ÷bðÞï´Õ…õaX KFOfo¶£és[HVlz®V¦­ðæg·ÅQÛm˜®æ”ÅùÔb¹cìvжc¿ÙpÛͶ;~qɯSM Ê+%›ëÍ 4%‘RÌëbês8¯‹#•Xt8÷û`ËáÀ²1¼S±&áM›Ñnh=6M&víÅû,H!„Bq§òqèá=i ~z Ïä$·€—_§éÂ-¸rSÕV„çìbÿ¾=ØZ¶¢BæIÒ ¡À¸s~mhYE(x…?Ç+]‚fT,Æ}\ðiÂc~  Ð~8“G੃ºì3\0ÙP¼ðx˜E)]îlÛ²Y±»º£ÿšl¹ø+F¿¦4ðU-ÃCúWÖ£ì6 ¹xáã¦zª4 *ùÁ™Nö‹ÆP…&¡4(x‡ÕÂpù$W$J3¶ÅÕçì¼.Õ<+®Ïô¡tîÝß«ÇÙ¹ás~rÿA%)Q!„Bá@¹ÝaàV½C:Y»«¹°hu1ƒ;qbÚw8{ž™5ó,é>ýØ}‚¬knp@·‹“g[æ./®Ë°w'ÓÚ:k _ÏMÅQU¶Œí,ú¤6oMàéBÐåeÕ¼äØA“²žM–!ŒŠnˆñÒ1¶}ˆWû¼LÇ£óÙ˜é\\C{2bpüµ„xû:1ž¾æ|6}){ÜàlÛUcɶcË<ÈÇ{9;‘̬\N¯ù€ù›ÓÊNÛÕŸXôIÞ;…§, n¦},™·Ÿ\»χPù)¬ß¢00j$Íé¤f¦‘‡‚p«õ#ßl‚—‹'U}½y+.žÜ¼#,›ZôƒâúEq0¶ö¼L”'Ý/@¯TVÏÚG¶ÝA}NŽ-_Ÿê¼¾Xü gçYѵÅÌ%K]û1<¾àÊ%Ö-<\²1B!„B¨ÒØív§6ÅFZ·mWú´Áôž:Âq|zú~ß§§þéô;Ë„2Jñ¸‚åœ{3bfwfÍ;ÓÙ«ú†?h}B!„x vü´àà`§®5>àˆ„Dåc‡6ˆÎ‘ϹÀú9 Ù’êè´–*݇2¨] ^Á>äÈ E!„BñV£óæÎ& 'ïãËh4 ( nnnøøø”ËÇc…åWÙï0B!„âOjÃ×Q¥J0ÞÞÞh4çe»ÝNVV6› ???‡ß—Bˆ$Å(„B!Dñõõ}¨ÉFƒ··7f³ù¡Õ!„x4IÂ@!„Bˆ2c¨É‚4ÍäAñè“„B!„B!î" !„B!„BÜ¥ìÚ`zÏJbéì¦MÊ“.%¹ˆÿ`êôiÌMJbrG¿rÐÉ•j½G3-q>Ÿ®x—Fú²Ž§|Q*t!aÅ8š»÷ ^mcøpÄc~ÏÀ„B!„âR>^«Xx‰ïæÄðéé‚’^Àùµ3»VOý!ÓéWâŠtT~↽، Z°$iΧìLwôÇß[gVMcô·-?óñ²¦Ü±¥Ïø[(ü³Û£¯Ç›ÑmØ·ŒcùeŒB!„âQW>÷àØ‘÷¢›±#n›Ó´T~<‘WûѲlN–Y©3Ã^©Êö ‘¬=§P»ß$FJáØûgè2e(öbXy¡ðú·uÔzm*/Ÿ›Ê„Ÿk3.¡gv¦áå@h5+Ûç°æ¬ÚªÍ…JÝ'2¡Á*FÎH&ÛJÀ“ŒOhËÆQ lÍt§þsCy£VW´i›Y0{-'Í£qoF̬ügx"¿šÁ£U4‰Ö¿<´¶y‰Á½j¢³é0X³zÞr¶^.´¶aÏTC±€«ýëæ-aËåBõúÐR©Ã« éU]!¸šðÅܱ#ͮ޾ E%=áÃèyðßœm÷<-ür÷~Ä„¥GÉwðYƒ7¢x½¡?•ƒ.‘øÆ~1]SãNíÞ‘¼ý„WÒ0føàò›6‹ Ï–ÄÌèJÊN õêV¢‚ÞÈš™óX6O•ñSkƒJ,^­ˆ)nžéëòjìp:‡éh_sA*›æ&²ö|iÆV!„B!ŠWnÖÔÍ,ü¬!1ouää~¼Ùâ‹&îu:Y žuZQÙø-[Ïçc·CÊ[¸Ö¹ Õ]ör2ÕÀZ\rkÒ¢Ž…ƒÉéT U¸°Ý„ÍZˆÆ'eû,æ+¤R8bzÔà›G(>e`åÊŽo¹Ø³ yïa{¦†ÀÖ]:¼’=×làâI€åDo$%Ï‹vãx¡áF’MÅ–è°…¾-Ð×ÀÚ ±ìÎß¶#˜< û¶“åR…®½BÙñþxþ{Ükµ§•Ÿår6j]ªø?Î[ dã¸(6§k¨Ôm^ààû¿¨¶Oñm]|,¶BÒÏäSïù'Ù3e‘gÍÜJ“¨}fæÐâXÞ3D0zN÷;âlMÿ§òùtä4væzÐ7µXl6 ò 1§¬gÓm µÏTÚ^±6þ9e²-—{ŒXš– _t€=ÿ,Ûga2OÅÔ= —d«Ž_ñmPçæÅŒ­B!„B”F9N7üý4äšõTðÓ¡œÎwz1 6L×L(^ÞèȳâáÁr¬‚ÒO¥ãÞ¦6ͽ¯ðÕ×:ZDÔÄ \àç\¸6+¶ûÍWØrØ¿þýÿÚœÊ*ÒÎe;‰'Šƒº°> ë¡aÉèÉìÍv#bT"}œh•¢h¸õæ^;– ÿ#1z Æ»ŽeÈáÀ²1¼S±&áM›Ñnh=6M&níEo\¿ãÝÀv;v»zûÔc°aºšÃ½OPûL%JÅåæc.Úß.³Å¢ÂfÇzcÜ5 šëQ9¿âÚ ‹§çÙ½Æ6víÅû,H!„B!n)Ç/Ðüô@žÉI"6n/¿NÿÒ„k'÷ØvÎWêJû74=ÕŸh‡÷ñ9mË•ÓÔî@³ÜŸÙ³gºŽí©xí8WJzc1ušŽ}Ãnt¦ ¹ßoâüõò\ ~è²ÏpÁdCñnÀãa¥í³YÈÅ 7ÐS¥a®×?*0îãœ_ZVÑ ^áÏñJ—ࢬ>”ν[ã{õ8;7|ÎÂOŽãß ƒê,Åè×”¾  ¥bøcèOàJ¡zûTcy SSÈðm@u_´ ÁÒÇ¢1T¡I¨ Þaµ0\>ÉU«óãWª~±Y±»º£¿³šbÆV!„B!J£Üî0p«Þ‹!Œ,‹ÝÇÕ\X´:‚˜Á81í;œ=ËÍzeó—WcXÔlº»Ø±·òÑìä¢méé§È èæ³ãädØÇëT»`Ääü–†"æSlÜa`ZÏL®¸ró޳9e=›,CÝã¥clÿú¯öy™ŽGç³Í£#ßl‚—‹'U}½y+.žÜ¼#,›º‚#ù)¬ß¢00j$Íé¤f¦‘‡‚°eîbñ⺠{w2­- ³¦ðõÜÔ¢– .ºöcx|7 À•K¬[x˜<áÛ®þÄ¢OêðöØ)n]-Uº'.>†­|ÊI#„B!„x8ôµÿÊØ·j°ëƒi|q$ëõdÁ!oÕÏq²@!œQö; „B!„ø“*éƒ"V2÷$1å£xøäUçM¢_kŽ_Iî·!; „÷OnÎ !„Bñ‡à‚O“—7¸"ÞW²@!œQn=B!„BÜÉŸˆy;¢¬ãBüÈ!„B!„BÜEB!„B!„¸‹$ „B!„Bq—²Ohƒé=+‰¥³˜6u(O–ðµŠ!=þÁÔéÓ˜›”ÄäŽ~·!î͈ùç(" ¾h¥BVŒ£¹ûƒ.YƒWÛ>ñ!ìë\©Ö{4ÓçóéŠwi¤h•?î͈ùè·YµÌ‡Ð׊?'À z÷*Ìq}o5¯…B!„Wù8ô°ðß͉áÓÓ%½€ókg2v­žúC¦Ó¯¤õ¸Õäﱑ´¯ä‡¯‡ìŒ«œ]ó>ñëŒ:ziÙÒ¿güÀ-šïø@_7£Û°9nÇòË$´(à̪iŒþ¶%ãg>^ÖÁ<â~ï¾v\_±sWÍb^ !„B! ¼$ îÁ%°#ïE7cGÜ,6§i©þüx"+®$ö£=dÙœ,4?…Oƾ×u0s` £¿âüLW+b:qfg^~„V³²-qkÎÞXÕxÐøï#y®n0A†‹¬žþÿ=k´¶y‰Á½j¢³é0X³zÞr¶^.ô„O çÁs¶Ýó´ðSÈÝû–%= Þˆâõ†þTºDâSøÅt½*}]^Nç0ãëc.HeÓÜDÖž/T¯OãNíÞ‘¼ý„WÒ0føàx¿† •ºOdBƒUŒœ‘L¶”€'ŸÐ–£ØšéNýç†òF ¬®hÓ6³`öZNšíêź7#fVþ3<‘_ÍàÑ*šÄNkˆŒßGžjŸi lÿÞ©†bWû9ÖÍ[–ˎR:Z*´z‘A}à©èÐ[ޱzþr6- x߇ã®Öu¾4}i$}ëèvŽÕ3æ±áœ£9ál™*ÔÚ§Ö/·Õ[öÃÆÐåü‡$¬L!OuxUæ®Úøý®óZ!„BQZå6a`MÝÌÂÏóVGN~áÇ›-ްhâ^ç“+,D㌲}óR©G1=jðÍ‚#ä÷ ¼öÌ$v±‰*}§2¦G 6.8JoKô5°vB,»³À·í&hÁ¾„ídÙ I?“O½çŸdÏ”qDž5skfæÐâXÞ3D0zN÷Ûc1%iæ—ÔŠ­NRÔâÛîÄ**õåøµ¦ÿSù|:r;s=h9“6ŽΕßr±góÞÃöL ­»tx%{®ÙÀÅ“Ë/,ˆÞHJžíÆ'ðBÃ$$›–\µ6d¹T¡k¯Pv¼?žÿ^÷Zíiåg@¹œÚÐ+~­øJ[c¢Ùœí1°k-v&¤¨´ÁÁ¸«Ñ¸á¹g±‹Mv›@ÜKù1a¹>js¹2³Õð*íSí—›•zÐðïÃé–™DüWŽ’ :w]UÆïw×B!„BˆÒ*· °qmç V„Odb”‰u“â8lr¸’)»é {Ï­b²SM¸†»Ý<Áž›Â¶CYØ€Œ³Y¸ÖÒ£®•Q³RCúEM¢/€ÖÌAø*e³QWˆ9e=›nK8O­¾üеñÏ8È)“ l¹œØcÄÒÔq™¶ŒÝl8ùsþà¢H²gœ$0Ôßç¿dïuy×z÷“ì5köÆôÞÛªZóÉÎ@’gL'¶h+[‹ ÙTb¾X`µ¤wÕ6Š¿9qæñ‚Ådœ Ð<³y7ãª?ÈG»Oô­¼x'5·ö#Êo M¦9á]Õf›Lâ3 `±Òûö§Iîñ³g~Òñ9/ç¯+òZDDDDD:Ƈ K Q6 µ A\d³b|ÑèõMªGœ­8Û»«w¶œ>væ).šÿÜ”U8ZÛ,H]y mòJûíÃïôvm?é¬áÓµ»¹ïC¸øpü É-9qmí7ž'-¼2=ƒíÕ œ–Ëx/zm,Ä5|¶üYžêq)®LBR6‰2H_}ăçLXÚü­ÛÌæÝT -ß-ç:õƒ»œð¦Îö¹Ÿ£¶ÇåÄ¡`"[‹)ü·_õË>­éØ5æôvþº ¯EDDDD¤C|ø?oì·M䎚|ÒÒ×Ñýþ‡å{ÝmvìàmC{YƒðwñÀh{ÇWbœ­¸Bú^Èfíµ”•RGßPŒHâ†ö&УÆ\Ôí}—Cob̃¨}_ž|þ¤_° kõ×91ºÅqc¿` Ãyp6QK8D¯þ1xA±Ü2.žÈò}l^÷–¼º¨¸¬nškrìàpÄ ®¶€A÷SȘ40KbpÃË >AX0ˆ¼2ŽÐ£û)oíXN´W§³øÌÆg%Ÿ­{“—náò‰2$¢ƒãânþÎi^‹ˆˆˆˆHGøìƒÀ¾w2y”ƒåi;(¯…—W$uÒ(JrÞÓgǵ]é™oIH[4¢ÃoIpVnaéÒ+xòé â›ÀÚZÊÛ ËÜÖ;–g& #Ê?”ÞÝlÄÎÉbBC ¯Ï]ÆöjÎÊ|°o,É/æRYUË«^ oã1ZÍÚ+/äÏïÇ“”•Mb™ƒ=%bL>]þ®†ÏY_LÎØJ–¬øúôŽˆ†ÒµlhšÌ´”þ8Žî¥ðíb?#÷äQ:ž©"Ü/ŒŸDvã±ô,jëw³Ë^Ì&'3‰›£ý<)DïÄß97‡…ùùdŒ´um !ƒIýïi îüª‹F“½b&CB:»f áÃSùã3WÓÝ>)€>㦓“›Çk+žæš .kÈ÷„ &õ¥KÌÞæÒ·åDDDDDäÂã¯Ul9Ê{ Ryí‹fO ðåêù<·:ˆ«&ÏåOÛ ¼”_§%3¢§ÈP'Õå\õ²Ö8hñ²ëå<þ>³&n¢¥á{‚®äÑ”alL_ÎÞÆóÒ54sà­¦ÿc(³æßx¾;óãvA䋈ˆˆˆˆ\H|cÁ  ~Ñ#ùmÊ`ŠÒŸgã1úÞ=‹äo’öÒ6ªœ^VÚXÊ«Ï=Å?}˜ù+Èžþ7¾<µR~©Ù£8°ùá¶îÄöi¥ w«žºû åÚ_Oå®+ìÄaåÜxç`àOô°{™tç¥XV‚[÷±rÑŸøð« ˆS²»ó8˜p7×Û j·¿Äìe{h$ˆ¸GfðPÿ(.Ž9Jî#¿ç_u'› º‚Ó¦pK?+×f]ECsæ²úËóö,!\>.™'~JÅ×ÇpTDà~¿†=ÇÌavÜ[L·•jÝofVöpÖOËæÃÊ®º+‰G†EÐÜ€ÿ±,~q5ûܼ3d0©ÏßÄÿNÉ哽!…ÜQ«HÎÚA½é˜ù=â¿xòŽ>Mà:ÄšE¯°é+wK:þ\tÃ/y||a†• ¦½¬ÌûM`„µƒÛy7ºH®»w*~j':ð+ç-bÝ!w9aC{åL¯«—ùb»i.uvŠˆˆˆˆˆ/òÙƒÖ²,y½?©dÿ_mOÞÞz&¦“šx ï.ÞM#` ‰!|Û|Ò–ÖÑkB&Ï&^ÂúÅ{hŽÊÂY=;« rø3d<|=;² ©r¶pü@#WÞ}3Û~?“äƒ |{›Ý@ñÒ4~<é ÆœÙ—†=äσËÒú’?céŸ&íÕØâ¹ï?ymj›kC’<Ÿaîçë¢pdìh®î¶ÂJ Ññ£‰Ùõ&Û¾q‚_Ý›þÅâ”õ”Ö‡“0+›Ÿ÷_OöÖ:·5·Ç,†*¿^Üzg,E˜Å;_AÈe#¸ÁŒñU5fSoØâ™ø@o>LMaãqèžð8o½ŒÍùÅÔ&1¸™w3–¶Í#miÑ·Ï&ýÞkù¿ì-ÔF˜å„—ãbv=x™/U&±7GµŸKŸƒ"""""â‹|vÁœ|³y+ÌaÎŒ:Öü.]un>Õî Wݶ:q·U]VGÀ€ÀÓÏFpÕ–RP\…¨8XEÀeA@ÀÅ×piÏþÜ3ãwLð†" ¨r:i®o¡¡t-ÎX,ðžY{=.'ªb'Ÿ×9ÁYKÉ6M×¹¯ÓYñ1ëößÍmƒ"ù¨ ˜#Ãùø•bj\€³†¯›ûñËg‡c4µÖ7”ÆÐ 0½÷6†ªÖã|²3äÓ‰-ÚÊÖ¢B6•˜/Xíé]µâoNœy¼`1™§4ÁlÞ͸êòÑî}+/ÞIÍ­ýˆòÛB“iNx9.Nï®Ó:Mb0É¥®ÈAñ=>¼`X‰²Y¨mâ"›ã‹F¯oR=âlÅÙÞ=˜³åô±3OqÑtøï䦬ÂÑÚfAêÊkhóWÚo/°~§·€ûù{ø(Hg Ÿ®ÝÍ}¿ÂŇ{àWHnɉ›Hk¿ñ<™há•él¯dà´\Æ{Ñkð`ñ ¨á³åÏòTKpÝ`’²IÜAúê#£Æ“ÖWz6Ÿ¯×‹ªªR‡Q½^N'] !Äñ9 ÷qpñB÷íEk0£3›Ð* 5ÑùtèÕÞùToZ„½sbꙹ¾y<¹â !„穆úzöïÛGFV¶  cnÛØØÈÎü|Œ&ýúõ“¨ªª">>þˆÏœN§M:ê\( f³Y BtJYYQQQR?ªJéüOqìØBpD—Os=Í5øÜN¬9yÄ\|(ÊiM²„ƒ…Bˆó”Ïëå¶i×QßÐ@l\³>úä˜ÛWVdïÞ=\}͵RxB³Í/A)!ÄI^$XôÚ«¬]¸‡ÛMjL4}’S‰‹‹Åj2£ê  øq4ÔPao¤¶ÉNUc^· á5_ÓÔh'ýÚ›OkðD'B!ÄùJQ¨©©ÁŠËå¢`ß>ÒÒÓÛÝÔãñàv»IHHÄd2IÙ !„§…ªÕñiA—];’Øó|-êYÏ>ËÞ/b@¥¡®–oÊÊ©,­ _V*éññhuF<>; ‹Yµk¥uuDÙl$FD¢ÑX[WÃÐú0XHŸ|úôh{ì±?œg PϪgåUÑsT?"ÏŠ ççà¼?òø²X&üÒ` &¤)ÃÙÒ4¿ÞNÚ•)Gý©si= óÖÍA ÏÁu|òöl–m«Ä¥ !uø$n½a,ÉfqöÔ—€}K–¤ç„Ñ$™äÜq¶Ñjµ<þÄ_Û:zׯ畗^døð<ýeWþT­VGÿ¼<²{e“ž™yÌýîØº•õëÖáWÀît²pÞ$§¦Ò;§¯ºBü©4…s­Eè«ßÆü—Sä>ô‰Clv·÷wÜkùô“µô·¥„ê‚M|U°…yW2yX"§¯y­â(XÃê­U-ÿTIì5™TcWBeõ«/`ÀÇΊJLÖ0ªÝ&gS#ÍŽFâÂÃéÙ«'Û7o¦¦ò µvv‰ Ÿ‹¸ {c¹ Q¤DX0«¶½9“¸'þrZ¦ìt*pR™¿žÂF'÷Þú£–Ï †–À  T6¬_ÇSý ¿øíc¤ed´»ÇCyy h PU<>y/Dûü5lX²£I·ùDCu—²vùNL/ 7âô=ÏT=å¬_¾ãÀÑô ?Ïgîû*Y5o#¡c'Ð+H#õ±‹;Û^g3v‡Oà»þŸÑl&Èj@w.´ÙvòÕ41§ å¢ ú“ÔÍ¿ w)ßÌ;õ<ù-Á´Ûyýw#Ç¾Õ”Ç %Ã&=ýNUÊ𾌿9•¬™­A’^$öñ‹Y ØaïÇÐà³£<Ei¹Èœ‹iQUTåÔŸ\ ¸]õ“QOûêØBüÐ8NV¯\ªªè t:=ŠöPà$€âSØ»{7½÷.üöw@ËH•²ÒR¶lÙByyZE!>!‘m[¶ (Ý»ñ‰IRÀâ«jí|ÖTÝÒÅc|î1îßúpR{öDtz§¹)º0Rzeäq}Ôlüнñcs¢] oÝ^Ö¯ÛÁzŠ1Œ”ìôˈèö©¢Û"¸©wµ45Z-ZEÅçóãnnÂí1fîò©]Þcs–°«BmëÇõËíþ  à©ÜÊžæcFV(ØZŽ;µç˳ɽ‹–¢ª*)‘Ñh´:ªkëZ¦h™ôd…Äa –ôÄdКÉÉÈDãñÐYÐh4á¡¡Ä'&¢ú\47Õâðp<8ów}“èp…üšÎtB¢‚º0¹>ê·~ÁÛ.fã;s&NçæËsÕºØñüÏyª|ÿ÷ÇK‰ÑºØñü#¼ ½‹_ÝÍûï.b[•Süp¦ÿôVFǴνôV±ö£™|¼2ŸŠ¦Ã{€6Fýúü8Óˆ¿a_þ9‹Vm§¬É!"‡Kn»“I½ƒŽ1÷ÌIáªb‡ÜÜî‰Ïß{XZÏÖ¼ù(ÿôq~ûy,>ý3r-€jgÝ?bÆþ<òÏ{Z§P9Øô¯‡˜á½ƒ>2˜ ÅGÍÆ9Ì|o1[+]¢ú0~ú™Ò?Œ¶Û³â£âÛYÌœ³œüA)Ùò㛸 É„bˆeàÈØÃÒ«Å–”ˆ-P@3ÁíÝä[ËDsænåýÙ_±§>@HÏ˸ãžËÏÿ˜™ï/eW½BDîdî¹ë2Ò-J[½ªÞ0‡·>\– 'šàMœÆ{Òö`BõppÍlf~¸”ü?Áépy¿ÀwµžO<ÄëÚ{yöWƒi‰•yØ7ó—<±iÿm:©†ŽÇ)«£®ðÇI í×—õwóHîþûör M—ò‡¿N%Y¼ãwT/3(åaþ±Æ Àk?¿×01äOsO¶éÊ´ý4½þ©Ò¢¹N–}ù%­­N‡Æ C£Ó ª¯eD©Çãaû¶­Ìzë49èt:âââ8hЯdm¼~åeeèt:bããÏèÜt!δ¨Á—p9 º°rùÒÆ þÐ}ß_Óñ5f¢SO‚5&¢’N¶«‰×íëÜ£#=Û¿Ù+cWŒ …¦röî«ÆáÇ “ÈÉ96q9hp@£'8Ô†¥õ<ª/M v^'uMz¢‚tgõÔÕçÂ{XÝöyüm!çÁ|6ì52rdFWo“ƒãÓô;ìx`:OJüf5Š¢dµb³„’‘•‹7 âv9iv4¢8í(?¾æf´ÈJLDÖbÃj Âl6㮯¡±ÙŽPðT¬A&Ô ÛáâñgWàä–¼Æ-g®Zcßô&zv%ô»’[§¤¡«ØÈò­û¨¿¸¡íö2ý8ÖÌ੺ ¹á¾'¸U»‡ÙO¿ÌÌ™9ô}d8¡Š›‚þÁ Ë™t÷c ‹¨gÍ{/óIY®™2„^±:ÀÅþO_eîl.šö’­v¶úsg¼Mú“wÓ×ÚÁ¥À}€56ò®E{ÎæMGDïlB>ÞÈöƒr{ÀSƦtž}l­ðÒ;Už ¶ùˆ½4‹ aãëüù?ˆ# ަyÛ\f>ÿ Æ?>Ε‡ÚÜ¥óƒ¸tòÝLЖ²böÇÌü‡Jø_ï ÷¨:œËq艵ëÊáDZöEžw\Â~’×-ã…g>ãÙ'Ö5”é=É­õËxá™Ù¼úeþ<96¼ÆŸŸ[‹møµÜ;-oÁ2>øàIžtþŽßMIä¨_ÿ*O¼´Cÿ+¹åºD4›X4·•´S¹å§¬tí~çäÒ ië»ü§(•Kïû#w„‡£?ÞñµÇ¨—½IŸö¿LšÁ“³U®þå=äë°D[òuÜ2m?MBˆnnèTWU¢7šP4Z4Z¿Mëh´ôôt†ÑᾂCB 9¡ãîÊßIxD8á§¼€l Àåtb9‰@½±娅>…èv xªw³jU5.==38#íáÓxÌNJ·®g{y3™èÌäöþ®±î¯aÃÒí‚h¬jÄéòaMîG^ÏH 6,ßCx†•’=Ѧ gh+{1۷졼Á‹.(–ôÜRCt(¾Z6.ÛŠmØh2m|öb¶mÞME“]p}fcTð7•°cËnÊꨖX²òzcݽ‚õ5^¨]Ä|}ýÇ>þ[@üÍ4xÌÄ'D`Ök ,™¾ƒë¬6ìgÃÚí”6úÐ…ö`àˆ~ÄÝTíÙÊÖÝÅÔ8ULQÙ Ñ›(ƒÒ2ýfA>ÙVŠv”£í9Ž 2­¨ElZ·ƒâÚfTk<9ÇiTðTngùò]T: Dõͨì0$fsòœÍ^T4XB¾ š(=A!6|5M¸]NÜÖ ³ºã¯˜¢ˆ2A­«¥/Q<ÿm>ìÝŸÿ^ÖïªA“v9]?wBÅï>é­>ÞnÜþÍ[ϳ±¡£¿–òÅ«Ïm%vät®ézÒÇ«.-E¤¢Ñë0èõhüÌ :¯« »×ƒËi'ÔÙˆÇé§Ð˜´ ~§ƒf—³ÕãÃçpPèÊ«qm:-uåÜ™Ôè=ÀÂY+iè1¿þäbZFöcØ%Çù^è(î{p*Yfáò >áÛ›)w'TSƪÕÕD\x?—÷OFO —Ý8‘o_‹6kéAZ@Kúô'ø‡F‡¶õšÐ+ì ëÿ°Œo¸éÛ«ýÁSž²õì2öçâHí97C\?ÒKÉßÛ€¿GjÕö1>v;Ûv×ãO‚ú=ìn £oV(Zo ‹ÞYE`؃ü|znËÈ‹Œ;ñíþ.)fâM­‘“°ñ<üØt2Í GŸ$¿{üsæmJßá¡GF¦½e,ÿb†œûȰç:†ûîŸL†Iø \–õ9/ìÃ÷O¡§Y„Ö϶Ð4)P_ ßY³÷íüáö‘„i€ÜÞ$)óûOßcíØ_2:¨”Åï¯ÃÑc¿½ïÐùDß°ƒ<ôú©Ôéã•UG RñžlZTp(Œùõm\x( ã->öñ¯×»^šbˆ 7*a±ñć(ßÕçã•ixiê@ݺ×xr–‹¹qñ†–ú¡:ØýÉ3¼°¥w?| ½dJœh²©-¿Á¶ÿ”#>µÚlÄÄÄsU•U¬_»£ÑÈ€y„†Ù˜Z³j5ïÏzŸ kÖÑÜÜ29"2’i7OgÊÔ«±ÙlGlÿõ²¯Ø¹#Ÿi7M'(8ø{ ôfæ|<‡ßÿˆ¢ý…„„†0~â&_;…¬žY¦³`_ïþï–~¹»Ý@Zz“®¹Š‹&Ž'**ê˜ùlv8˜ùÚ›¨¨L¿ùÆ£ò)Ä ñ5QR™ÄÀQciØÎŠ »©JBìaJ_Ýnòë¢2>›à@u.óÑßüÍ4êú0htzO›¿ÞÌΨ±ä†ÞöV&0ll_lZÀWÃöµ;qõÊEì¸Ê6³jíVl êð[¦¯†ëö f gB¼‘æÂµ¬ÛQEx_»×lÇž4ˆ ††¡4VÑl26p}V,§"k<ÃNtªŽ>‚Œ87«W®EÍíCz¬­-h¡zkزb>㘔b¢i÷׬ÜTAäP|š(úŽëO„±™½_-eSa eÙZF|{+É/È…—ĦUÀW͆›hHÉ%cÃQê*q˜µ-m#E=>þ*†ÔndÑêmÌE‚Ì:i? Ñcj/ú¤ÑcÖÛëÇP1iÎÎrö7æ³ha)q¹ñì]SFËX7w¬æ €Íà¡Ý1",@së¢Sõ4 ¼›fòU6t.ÍuÕÍÀÉß·”a!¥¢C$PÑûÜØ›êq:š@£jÐiu˜-6|g³“Š‚B¬+¶  |^/ކ:<^'oþ ¶øv×X^D­[m7—@¸±sõ²skœüâv–wrªNèÐxúîÜS¯ØµÛÙX­yõP¢;“jK!mE-–0 ¸í-ë2h4Jk{ñ°4+ªçaá=E«C‹{Ùnòwî£pßN4SÛäëèîHå¦íÐçöJëY7s “5¼±õÎñxöm§)áö,cÙ¦"QŠ·RiJ#'FßšýnïI[?V±‘Ú+Œ¦Í%4«­ÛFða7+}t½‚>eÓÎ*¼ÃC ø¨Xò_>«HàÊûúqÜåM,ašL©è 1BCÁßÿì@#.KÙo®Ñy}.¡m=qCF;g.« ›ž”ÏæjȘräùQ´§¶ÆÉñË*í¨y¿þúSHKÜpÖÀ9Þñí5Ž“ª—'R¦£-D÷½4u89PLUýÞzâ9¿¹Ÿ‹â=ìþøŸ<õY~“‰²f?½lçùâvBtƒÑÈàá#ذn-ªßOÀç;ZEõùQý~Ô@“ÉDHرG-]´„7^~ «Õƃ¿ø9£ÆŽnûÛ³Þão̤ò`åß©©®æùgþöÍ[ùõ~KhhKÌÞØÈcþ—«¥!yç}w·}ÇÞhçwþ†Õ߬:b_ õ Ì~ïC6¬ÛÀƒ>ÄÐáCŒ3{<,]´„—ž{‰Ò’’£‚)ÿúûÓìÞ¹‹ÛäŽçF/œ·O?™KMu «•©Ó®ÃbµHe£µ‘Ö;•p£Âã ÑäÓì pøâŠÞŒÞSGe]3AQ!D´7ÅWc&&>¬¥}`Œ$9BeóÁ&ü¡€b!>3¾%høê‹(W’š‚^ ú„žôØ·’‚/Q‡½½ÓW_D….ñV´ Å'c.:H}—R’’I „Å`ä$›>Љ„!S°ƒmëç³M‰¡W^½â¬jöPbèÉE)6´ §¦c.(îÆ—‘ŠpÓT烆æÚf´N ©½S[‚&€¯fÔTÆôŒÂ¬"âZŠ×è‚ÉÌÍ Ò¤¨$Â4[hò¨È+§Hí¨2¨gÉ*€Çh¯Úw³höö6ÃÓ0Æ5³ní>ZW7Іe0tÜôïŽÅ“Nª*›O :UME“ŸÄ°î‰œh5´ 7=Aí© ê™@¡½œâ²r4>ˆˆRP¨©9Hhd4 i €ßÀïS ‰ÄÙì ¼º¿ÛCldzEÁa¯Å`6âp¹ V QíoçòÏXÛîLI+½'Og\bç^Ô¹·êÔvö' R_eïšÊí¨£3)aÆS›'§(ßýÈ Œº ‰Å_~Äò¼ÛÕÀêQ>’m=EwÙ Þzñ¾© §Ï€\2cã°R€è <ü5lÝä&ë†x çpÞT@Ql¤õÅ73åžž4oª"¢_â“31ÍßH‰»?ºÍ%4DøËëh¦‰•OÞËÊï§/Á‰·£§bΝÓ{ØïWŵÿ3f¼¿Ÿ¸É¿ç’Ä–q ÎmÏòó§7áiÝÊ<øþyoZ‡Á»v?S¨meo"%ÈpÄ–Z[6ü4Õ»ñ…×âÀD|¨±Kçh¶»ã²²o}–_ýëÈ|þíÒSH‹¢9â;Ç;¾»éäê剔iàÐ¥ç{iêHÚU¿àßßyjÞ6f=ñ ey¾ú¦„€)›ë}?ã¢%h"ĉ°X­\6i2ëV}‹_£TËõP ðû|DFE1|äh¹¯êª*êjë°Z9²äËÅ|øÞ‡mA“„¤DzöìIuu5»òwâv»Y¾dAÁA<øèCØl6öíÝG pô Âétòü3϶MŒ&}rúà÷û©­©å@q1û÷0ã_ÏaµZÈÉýîuÈÖm`æë3Û‚&1±±$$&ÐØÐHyy9ަ&¾˜û9V«•›nû1±í°YùÕJê[Ë-_¼Œ+&_)qj Zå莥68‹!ý÷‘¿s_n#='—ŒÈc݃4 ~Oëz#ŠcÛӟˉjˆþnš„ÆˆÍeNïaÇnÙÎÝXÃêe…‡zux•H¼N'ª1º%Ñ4&"3ò›žC}Ñf¾ùö+üã&éjÆSŸÏ²y{ZóÀ«Ä¢jJH°áUý-#Oªj‰õ3ÄÔî8˜Á“¯Äýñ§l©;2h’1þÆ$vþ=ËêmüèáŸPdïÜ눭‰½»æZkÆŒ‹úF/*]õZ&=±CG’ºðs¾xúçÌrš‰ê5’»¾ê»…<=E|òÌlJ¹ƒÿ{l8Ñzµa%›?^ÙqDZ~;ëíi\u‚ïg=»ó¦%,;‡°·²û` 5%zO Æ™KŠÿm¶•ÄRÐLôÈ-£,!˜±qïo˜šzä„W>ˆ0-Tµ—\o•°DZÛ†¥úëÖòÆ¿æRÕçþtyr[Ê”ù#þø—k9´t“Ö‰‘“{µ‹Ö‚7 M^T¾kœ58ÐbDk´bă½Ù×6 ½½ÆË¡›½Ú©cw\V¡æ¡GåÓäÜwiéšã9T½<‘2íôÅ_±‘}í£<ÂßyjÞ.–}˜z3í7?eB¢y^$ĉ1 ŒºàîúéÏxù¹ÿ ª*Šÿ»·ê˜M&FŽÃe“'ŸÔþN'_-YNiI)·ßs'×NŸJXëè•Û·ó×ß?AÁÞ}|öɧL™z5Ù}Úo'¨ªJIq1ŸÌþEQHé‘Êßž~’Ô´@ËT¡™¯ý—ÞyŸÂý…|úñ§m“êªjV³Š½»÷ ×ë¹bÊ$n¿û"[³o\¿—ž{‘Më7²pÞBÜnàdå×+Ù·g¾Ö‘9;¶mgW~>C†C§“€­èjÌÑ™äE§Ñ\¶…o6î üÂDtô°Yõã°{ÐEÑà>ª]¢3šP<-#‘Z à¦ÉF³×Û‚ã2*ÃgDûªÖ¡¸í¸}ÿˆ½wº«ˆª*-/ÏS „¦ä’Sð»jÝô²š1„$qÁ„,Ÿuë¯ÙÀ‚3C.A¤^¥ig)ûk:"éL&4îœ*­k©‰îd²iªwãjlÂlÅfl™ð¹ilhÆ hͦ³nPO y?Ë>ZÀ.Çំ‘;"—h“Ådîæx9¸y}ËT P½i#åÙcI0v}JBR{Óï»’Á®Ù}Xà$„´¾ýéÑ…Ç 1ýêoqxü¸u:ê|NJÍhŒ7ó·n%7#“þII”×T1góÂã1Û(¬ªÃpa3é1*:íÍì/¯"K F?b@ûWs2£¦\ mÁ“– ÉøžAœÌžNÝõcz$æ Ur]Doú„~ÄÒ%¨Í»à»›È©¼VUµ³eÖ\š&ü†¿OŽo·0üöòkŒô¼5èÖé—7`éàÆ`ßµ–Úä ¤šÏ¼bsÉ4/cÇö-4úS¹!Z†Ä6±dÛ,5AôêÕú–ð>ô ›Íê Xec9*ñ®¶›ýwvTó—±Ãm#¯o z@uìdöS/±Ö2_Ü5†¨Ã§¥C‰‰m¿ Dô!7|6K–o¥aÀðÖ©%^ÊWC¹Òƒ‹{˜Ñ[ÒI±ؼr7Myy­oIòÓ\Û ´ždEÕ¢…Ê ì~Òê®`GAcÇÇ>nY™ŽÎ§éÒr¢y?Þñ-Ç«— Z½ÍÞ´^‚N¤L¼?Y­Á“_(ÿà™eA\ó+ šqR]³™q.ý½²ô IDATfÏž=ÔUU²iýzÌ ™}úÓo#ÆŒÁd>¹†ã®ü(.Æçõrñ¥¹ôÊËÚ‚&½ûôáªk§ðÊŒ—h¨o ÉnGí౯Ïëcá¼…‡s×ýw·M¢¢£˜:ýz³ê›UP°wié”–”°uóVòç1éêÉmA€ó¸hÂE(:@SS^oûפU+¾imrȧJß~¹G­Ã"Ä©QñÖìç€7šäX+F‹ÍG?Œ ¸¨,«#!-Õ.v×ÛHéki'pº°TbëÉ/Ž'/ÙŠ«t'û½Ñô‹Ðµ]Œw#ù"韌Æk§Ák!44…hÿzvì!¯GjC5º‚u ®:¾(ö¸D|5›Y²ÁKZn/Ãøk÷²·Á@D¨ }pñÞÕlÞÃ!h=õÔylûÜx1¢ªà³—±§ØNàkBëÂÓ‰õËæ]ñ Ë G­+¡JO’MjW·„ù B­~ê> 8PP”#Gòø].\f+æ³dÔ‰Ú\È׳¿ ÿˆ !ä\~#“̧¥Mé)_×›:1#ñE«2¸~Lâ9L?íSÏRz°ž°ÐjýæïÞÝãÃl0QÕÔÄE%¤„‡SR_Ks @¢ÝI„ê]NÂ-<­?@qu~Õ–q/d(x¢]°gÍ:¹ I§'µÛ8ÐØ™×i JÌ"=² BU†.™ÚŸ¯¼Éß^¨gʨ4Ìõù,ý²ˆÜb|ôÉݤ|~5›W°.£?E£ÃM\DËÈ­9šh“›m_,`6CÕf~¼˜R ³Ý]6Q°æ ±CÓ±*çIÞŒ‰ä¥ÀK¾F‰½‘x# ‘Ñ7Œ·–,B£Kå’ØÖñ †d.™>„ogü›§”©LšŠÍWÅ® »0¿ ãZ÷Y>‡ÏpsÉÈ ¬5ùìƒø²ndR¦ Õ}€ùÿy†ùå±\xg_ü[ØÔeÑ÷ wZ]6ÓOŸÌÄiƒY9ã5þñzS†ÄâÙ¿œæ”{éo¦%ƒK/Šcõ§/óïY×qiŸì»—2wQ9´½ÉÆHBnÌZÀ[s—à$ñBò}‡:RЙôÐXHA¥‹è¸ã•U;KÔ›N$-'ZïŽwüãÕK-¦Ø,"ù”%_¬".ÏŠ6>‡ìð(Ó“ œ´Oz]óÿºBÁlÒ"„è<‡ÃÁš5«¹ë'÷“”täÚ…û÷³aÃzzegc2™:½ïúºzœÎ–§Ué™é·\¸vÚTLf3€Ÿ~y:|ËN@ °yÃæ–+¬ÑÈÐaCÚ&8$˜œ~}YõÍ*êëê)ØW@ZF:Í' õõôHK#»wöQß½òêÉDEGÑh·“ÛÿèµØJ`óÆM8zõÎÆÑä ¬¬Œ¥‹–p÷ý÷` BQ$t+ºŽ¢Óдk‹7yPµAÄ÷É;zQHc/«ÕàÒ…’˜›GªUCÛðÔ#ZùôÜ‹m[Ö²8߇.(†ŒÁ}‰Ò+-ë~¶]ïÁYlß¼š/·zQŒ!Äg $!’œÁ=ÙºmKwyÑÇ’Ñ7‘)¬[Á‚¢rF!ÅrìЉ.<›¼Ô-lY»ÎŠ)Œ”Ü‘ä†kQ”(úÊaãÚåÌÝàA1†’Üw8{“º‚¯æìÇžJvj†ªc”Ÿ!†¼Q9lX¿ŠÏ·{0'Ðk`œT¬î«±¬ADêÝ49\¸¼TUA«Óc²Ñy4¸<4Ôag>x¢:‹YñÉçlkÔ¡p¨?DöeW3:ÕrZ‚&{> ?ÝDc'¿×´í3æ…MgJnÈ9]c¢ä’:f8û—,awI11Xt }££(¯n ÑëÆ`1ÓÜÜL‚Ù†EÑ ÎLfke AfZʾÒ*Œ ô Ç’ÞKN¯c×Ts2#®J>åôw*pòúO³£³óÓïàõߎ肢Ö>ìS>bÖœ¼ú¬ Å–HÞø© ?ÉŽ˜DÎeC±<5Ÿ—ÿ9ÿÈ>eÚ<üÐ2-ÙÜp׿ðß¹Ìøûg„fŽbÒ½üò3ìkoŸÎB¾-Ž`È‚:ñ<Ëó¦XIƒ{Öâ/LmF©#¢w&æ9_cO¿Šä¶‡“BÝÁã|άÙsøÏ²&T](iƒ.b²ñ»…lƒ†ÝÎô„oy÷•Ï9赑<ô~uã…DëÀ¹c6íöå,yåi–ž–Ì{yöWƒéº¨´¤÷±ŸDòÖ‡s™ñ %(™Á×>Ê Ó[#»’'=Â7˜õå[<¿ØLüÀ˸õÞþ÷®¶“#ìßÛ¶Ý žh &B &ŽêÒ›‚Qh¤Þå¡¡NAa=£Óvö,šÇ–:ˆ{9{?bq‰™¬‰W3¶‡…Óõ¶d)’¤Ô8šë¾[gHõ7S×è'à?lÔ˜)”›®í7ªèBHŽîîÆ¯Ch8ªi‰ÆÚ Ï(ÇüæQÖÌ_@Qq µU!),œQ1lÚVH™£ ›É€U«'Òb#%)s¨WE §—/w«–’„®ÊIâ/î=}µÝãñœp(䕟ý˜o›:Ù0éÿ3fü¬ÿYùSW]{xû÷/Ðtýï¹+¯uÑ€‹ªMïòÏ}CòÿâÁ~k¹v½ÆïÞIàÑÇ.!Z{~åM!ĹEUUöìÚ‰£ÉA\B~ø÷ÿôgíßÃ\.–,\ÀsÏ<Ͱ‘#ùéÃt¸HìŒ?ÇÌ×Þ$1)©í­:Ë/ååç_¤`o÷þì>¦L½†àãOiÙ´a#?»ë~<·ßswÞw7n·›ŸÞù¶lÚLLl s~vÔ÷ìv;Ÿ~4‡gÿùoRRS¸ó'w3~â¾]ñ-Ï<ùÅEÅL»i:>úP§ÊÍÙÜÌoù k¾]EhXÏ¿:ƒ¨è(n¹þfJ”ÍÛ³ß9¡¼‰s_UUññG¾îòÐ+¶O+ –l#dÄhÒ­§ÖÕSøö«b’.AR7Œÿ?Ù€¦8ßpÛ›°ûõ„„˜Ñ£ª•••÷õð§¢pÁ«|¾÷PpÂBÆ„k Ó6ºŒ»ˆ/çlÅã;@a]ËÔ÷”Koኴó70_¸à[>úÕã|ºg=5á6&d¥1:9Ÿ[¡á }55(=# 7c÷ùøpóJjëéaÔsyj2Á63ý®¹…7L=méîÔˆ“;Ÿ};Ï£“æ-[ˆº(¦eiÔ˜OŠÇ†‹¡³7%eëvcpi·½oûÌåM!Ť±¡ûo¿‚}ûPEQHMÏàé/ó{ ª ¯ÎÃU„–,\Ì«/¼LÁ¾ åM=?yð~®¼êJÌ­½Õß®æ@q1~¿Ÿ —L 84«ÍÆ….âƒwß§ª²’ùŸÏcʵW£7襲‰sˆŠ«d5Ë7×aJÊ#Ú(ÓÍDwÒ` Æx¤$õÂÉ w~Ì·¥Ò/¼úìš“>èK6º5Ö£MØ”ó{4cêÄá\eú'•ûï¯YÀÞºz%Æ¡Õúpkir*„˜ L& >@“/€1`dlz½†ø ÆŸÖ I§'ç]x‰šEÌ~ÿ+B'å‘öâÌ{ûC*Ò&sWz'‡D©>HÇ”>Ñg¼`»xÅóçqýM7·û“ÉÄØ è?h &³åˆ…]Ï;óóÛ‚&n—‹õkÖ2pð@Ò33X¶h)U­¯SŽŒŠdïî=hµZbâbÑëõ8q²hÞB®¼j’NÄéÓÁtœÎQ0%cb¢§øÑG‘wÕôõ^w6=@Ö`KŤ´ÃÞ<õvA.÷z‰ô_à™ÿüññäFFdÖ2¤G Z«5·`ki)õv£"Ã2éç½dO¾úô÷¯È¿Mèîz¸‘wÞÿ”§ù&ÀšBÎÈ;øÃ僉7tö^d!í‚KÎϼ !„8§lÚ°£Ù‚ÎdBÑi x}x½^¾Zº¤ÃÀ €ÙlÆlN8oËeÜø‹hv4³cÛJKJÛ‘=dëæ-ìÛ»·»eH÷sÏü§ÝýlÙ¼…ÒÒÒ32d‘X!„87zèÏÚÞï'hrˆ%&ˆ;÷(N;¾ÿ?Â&\ÑÐäõàô5anjæ@C=+öÑìç¢K&2â®{KM;#éÕýÐ<¶Ì‹¹ó·ŸWSÎÿ¼ !„8nLQP4 ­E§UÅëv·¤8“ª*+1 ‡„œö CvŸl²ûd³w÷ž{æ?¬Zù-F“ ½¾eäÈŠe_s°üà íkæ«oòØŸ/£N~ ¿¯Ž^¥-e#D!Ä ÒÂÃû3“~t_-\Hå®”(¦¤¢Œˆ¨x”ˆ(î½ô2&NœHbŸœ3šTœ-!„âücµÙðx½ø½^”@ÕçÃ`00døðn;¦é°Dmm-nû¨m¶oÛίþ(MMž{å9zõîÝåéÐô˜Z_¿UW[KUeQÑG.:Xr „êÊ–w›ÆÆÇa ²QW[ËömÛill$<"‚±%<âèÅqÍ_DqQ+¿^ICC=‘ݸ ¡8;éõz¼^¯O¾GQ”¶k€Bœ¨ÌÞÙdöÎ>«Ó(!„â<ôÓ‡áÉ?ý±­3Ç5Óoè¶cöì݋Ȩ(våïâË/2tø0ÂÂÂÐéZšަ&^ü÷ jjjñû|ØíÝÒñŒ‰!#+“Ý;w³mË6Ö®ZÃe“.oû{Ue+¿ZAQaq±±óñQÜúÙå“/gúÍ7qÔþÍf3¯ÌxGSó>ÇM·Ý,OÙ`t:][½Bñ¸îK!„çŸ+®šBl\¾óN§“äÔT¦\w==ÒºonpXXbçŽÔTWó—ÇÿÌÄË/aàà8Þû=våïÄïóѧo=³³Ñj»þ½IÉI 9‚ËWPZRÊsÏ<Ëæ›1f$ õ ,üb›7lÂëõ2zìrúõÅëó±yãfjjj1›ÍŒ=ªÝ  Àäk®bæëoâr¹øðݸᖻ%B!„8;HàD!„8O :ŒAC‡u˾ #ÃÑ+O¹îj*ÊËùbîçÔÖÔðÎÌ·ygæÛGlc±ZyðÑ Àf³uùˆÁÆ0uúuüï™ÔÖÔ2gö'Ì™ýÉÛDÇDså”IdöÌ¢`_ÕÕÕø}>.¸d1±ÑîÛÄÅ—Näã?â`EÖ­gðÐ!RáÎSŸÏ'#L„è&>ŸF#!ÎjrB!D§åöÏ¥gv/Â#‰kûÜl6sß?!:&šwßz—ꪪ#¾—Ý»7ÿæzõþn´IFV&æ±më6ò@«Õ2áÒ‹Ù•¿“‹.ßn, ™=³HJI&19‰>9}ÚþʵӦÄ{³Þ£¬¤ôˆïæ È=?½—ÜýÚ¶ %2*Š‹/HtLÌ1óÓm7³lÉ2BBBÈê™%⟯׋Á`@§“æáùv®å< !Ä©‘©:B!„ç!ǃËåê°#ý}@—Ë…Çã‘Â;ϵœg!„è< œ!Î ª#Ÿ÷þùo>/>¿‚jÓ6ÞùÇ3|Vä9¥mÎÛó~žä=PñWƤr××M'·û¦'öçÉÝžSß×ùÀ½ŸÙÿ|•5þl}p²p¿ÿ‡[v?”s}&Ïó×î~¯?ä{›ç嵪l>O?ö¿ì)”ùιôË=!ĵìÙ?±¢¾õZ Q™C˜xù(R­‹ë*¦D]x!¦È“¹¬y(œ=ƒoúÞà Y¦.Ï£§h.Ï¿¹ƒ„i05ˌ҉´(æd_8cTÇù:r›îÍËqÏ!FÂÒ2aò8²‚´Ý~ì3÷Îz<ËÀß [ÿ¡¤Ïe÷óôó¿d\øîûó É6Ÿò14]¸¯®ï-¹¨Ø¸˜…_o¡¸Á‹6(‰~ã.g|¿h çÉ’ Ëž{š†+ïgrŠá̳ªâv»Oi.— ‹ÅÒ¥ka,{öO¬ŽžÆÏ®ÏÂܺ[oé|žm# 7=ÄÔ4ãilÁdÙŒ—ÎØµ««îG§z®»ú<ïÿð)>½‘{ÆÇ¡ÃGÕòxu×pî»c!ðÏåÅÏC¸áö¼· !ÎÉ`IÝ&æ¾½†]ÉÀæ}4Ð@ÁÞŠËÖóÅ £n˜DN¨ö¬Ï‹\‰„g–ÆFß[îgrŠóA¶|þ6Í‹ç¾k20u¦§ "}@ß“L„·ÃK [2èáà¶2¢%R½¥wV&¦Î¤ELÆÀþÇÉûáÛtg^Žw ÜÕäÏ›ÉÜϸwZ6Öîî Ÿé¼wú®Ë ‹vðß1V<Õ[xë'—sãÙ1k"—ÞuK×ÃÔuûêÚæÕ«f1s¥á“îàšÔ`ÔêÝlØY…3A‹èª’öùÚÖ/9ª£í©fÇÊoÙUçÆ°ÒcèX&™‚|h‘Q½^ß…× š²pf’eQ/UÛöàÑê8#q³3yíê¢ûQÇçÚOãÞoX¶±ŽeXš m7Ÿçˆ´Pœ[jp«qèT'¥4{9èHˆYÅYYI 2‡ C0‘‡®Ýî¹¾ !Î9þ*¾}{6›s^aóaªøò5^kýÿfEw÷H"Îòv€N„g ­%–ÞýãY²¸ §KËç/}Mòèp¶,ßnämÜ44åFÌ]ÆŽ Æè^Œ¸â2Ç›P<…|òÜ„ß|7c¢4x*70oÎWì®v£ÀåS'¤à­Ú—Ÿ-c[I#jhc§^Jز—ù Ð EOó¤%«î½žž–.j5{+Ù^DÿkóØþîÊ\™¤™ÔKËCØöêbo¹‘Ðy/±ª×]Ü68 àÚó>/.Kæ–›bX2c>±·ÞLô—/~÷}s Y¡µÔäÜÁ‡…¡Ü³yaqÞ9¬{ú!ÆH2r“Ð̯Äè…¾¦ó`(böŒXûFQ±·‚z»‡ð¼I\3.«FÅÓÑ9öÕ±åó÷Y´£.”Œ1×0©3Ÿ>×NÞ[Ïc¦öåÞÏì«_#®c`Á»¬J»ý4••‚!²×ޚǯ»ƒšz=÷ö}ˆþKÖð˸LÏy„¨²Ù´`Ee2n…wþ4h­JÓ¶WùéíaîÎF¬ý~ÌŒ÷žä Ûa»¶/azöaûÊý=ˆÅ/~ÂÆ7}ý˜~=ˆ ¥ƒ}…óÖ}SùÅì=8Œ©\ö»·xíþÜSîHªÎ–®h ÷µ÷2ª‡©¥£ß—1ñ­|ÿœŒ¼›(Y½ˆ¥«¶Sb÷cMÍ5×]@²YiÙ¾£zÔRĸ —óö›ß°¿ÉDÊØ¸ntk>•¦qßÍ PQ@C„ëîä’W_dçØ¸©‹§xx+·QhíÃÈð$”ðEl)w“ÖÃî,>‘´¸÷³ @±Ò?†ëöãØŸ ›Šm¥XûŒ'XÓp¨ÉJæß7Ò¼û}^^¾›Æ!C Õx©ÜQ‚µ÷Øî;‡öR6¯.B‰ˆÍÛÑyÐ·Ž ý¥\wW ¦æ]ÌyyK3~Âå±,êà'\Â’â ¦=|1Þ ŠíÁèhî ï&Twó:ª/¾W¿ 9<‰E§±¬\«yã¹5X†ÿŠXëÈ?; Ødù7­MXõ\n|¿»d/õÛį¦üÏïSrCûþ}W?ò%#_8Æû*ÞØö0 Výƒðí“wñYzÏ\®Ô­hw_ýï|›_3‘¹%ëèïÜÄ×e‰ýÕÑo¡j'eÚt¦$˜:]ð½ß<;^]*ãn›H¢¥‘µÿû/ 7÷ã¶aa-OÎ;¨GWÄÞ*¶ìÀµw=Êä²y¼úñ2ŠO'µ½zÔ £ <%G'PòE;u¸ªãZÒÁµ,&oË1óÐÑhcl_ÚžáÇØŠËß~‹°Ë׿P5„÷‰gçæBš{õÆP¹•¢à>ä4MÉ1¯Ýº£ïŽ|æ}QLîçGQ¬}k†ÝƤ4#ª»¨ýý\‰Y9…k×åz–¼³”†¼ëypd<ÞýËyç¡ÇËö ŸÇPR߉ó°ë˜§p63Nâ\{ª÷ÓžC¼YAC2Y!ÙSã%-ÑЭçY–J¸g%U.•èÆ}Ô÷dHB- êñÇë(¯Ñ7Ô‚†ÚvÏCó¾…Ìٕ•·÷!HS(M#!Îa ¥Õ¸ÚFÐÓÇ3íª¡Ä«¥¬ùä¸?®º8˜LJLЉﻬZ·Únx#8>‘c×ߨ%p"„8³Ml}óolEAk !¡÷ELŸˆBІ3¦oK ð”¬a§¦?7 ŒÃ¬sîE úöuÖ9IO;¼Ã²†]æáÜšŽ^¨¾ ^·‹²B';ÔþLž‚M$faºon‡—êíû1÷Uk%%'„e›Ëq÷H…ÿgï¾ã«¸îüÿ¿æö«ŠºPAÑ‹éÅtƒvâØ‰“رS)›Ýd“ìf“8›d7Ž÷›8ÅqâÄ=qÅÆŽi¦÷^$!@¨]éê¶ùýÆlIHöûùxðx iî™9çsîÜs>wæÌÉõ-<ƒèÜA¤,ÚÎñúBú¹ÊÙSM¿ññØ©²|·Û0ºÕ.ç@õpFÄœaÿ1½Gui£žÿXIé?™;fäaœ|±Ñ8œ ö{zöÏ"ÊÄä1$^?PA]È:Æ9]ºàòsèX)=º’ M|…ÑtÉãªþÕ.m*ãÙ©‰<‹3>—QóbÁ/FÍòË·så2ûΑ$Û´ÉÜ71Âý qÆÿ( ¾Å»Ÿê×ýìÇ^gŸÿvë}zzóÙ¯M'Ëe@÷qôu,ä`Eˆš¢ÆË:ìÍ!îÜZÞZ}Œ~Ó39¥•æÌþZ®L¼6€?ÿž;÷àƒLˆ¿:&Øbé1¼3\GEÉ9ÌhU'* q!qbÑBé€#…7';Æ9}éj[ÊÙúùžFúQ°5²ŸPÙÕ¿3}M÷áÆÞC#š®CsŸ¢8SDET6C-.6h*óa†Fj!9ï­ãX]âwÓ¥pîµM×÷ü9ãò¾®-£Â‘É¥þ› IDATÅØd†£ ¹9N¶”Öaô޵.'Ô“,ç‡?w•÷³ßVÈcòˆq9=IóhF­qŒ®Ùšë†ÚŽXÏ…[°ìxcìøk€«Mãl¸“ɉ­¦ø\ÝŠOâÌEjf:å%Ôˆ¦¸¶ ýŸ~Dª÷ðæë'èwçÉóMžßE¤ã{åO§èâé%)7#¿‹ èÎØ›§°ûá7)#ı¥Ïó×eyü×O¾Ðì²÷,{•õgûK ýo»‡©Ù­¿f–'"r}]rùå£>Àpá½xý¼I°¦šPtÑï_]b&5:ÂÞÊæ%ó`M5¾²Õ<õ» ¾Ù0ºã¯®&Û“Øö:ó…βgïiŠ«áço\ø]TNrHüÇbÄäS˜¼„]'üÄí娻wt±C “ž,†äùXv šAy)²÷âæÖ^€ëB ç¦ãÕ?¼Žsð 2¼àk4=É 8£ì„| 44c{ï |fÞZ–,û3¼ÍÈÙs›i=A»f¹¬µS[]\ã$æòß×4õ";ÑInü§k¨.)¦|Û/˜ÖïÑó"³jÛtBÍ÷Üv“P$ŒÏ¢,[ÿÿà­¿þ/ÿöÃQds4ßüÝùþÔ´<`0<18Uø#nºê{ü0TÆÒ?½òÁû÷Š˜©ãøš×x{g=‰¹¹$``†"–‰Âóý(ÐHsà°™DLp¤7ÒòcZý1ƒïçêßIkº7ö²¥5]Ã0®96¥l]š¬Qɳ¨|k. û~p¦10¯šU‡‘x2‘A㢨YÛt}#ô {|æÛì/óÓ5­’‡ü$OˆÃŽ‰ßª󣜻º¨©&“Oœ½eunQs›ÓZë÷›‹x¶jœíqd¥˜ì?u޲ã!2ÆÇàN( ©j¥©Ty³Iq¾*k®…ïàóÛ¡:×oqeií¼3ê¶[hxá¶]vñZ4Óï`RvÛ,4®Ä‰ˆtš¬36»ï4¾0ça§}6bº¸.9ýžß.*­/wß?š„K&þCÿÀ^{šÚ÷_ߨÀ²Uó&{8èÇ—þ}© |†Õ~†eA¦ÄÄ´üXŒ(ò “X¹«˜SÉGpô¾íü=¡¡¦^ï&chwê—¤4rˆHÁ,ÚèÌoxó™0:–¿,Ù _¸h‹8ÐPÄÆËgpœ+÷ãÎÁÓdŒÄŒç¶ž£©Üó:åº=0Ä¢îÍí/—j¿¶j‘H ‡wŸ#~b*]ºf

    ï¼÷Mò/=¶šeü¾eÙ.¢­Ê˜õž›ùmŠ^x€‰Ÿûc÷=ͤØV gr]Co²£¤¬\w³†LÁÒ,ØǼ'BÅš}l+¶Ì\èGÑØ›ÌD5Ò¾v¹­>βØÏ•¿»¯†!1Ï$ÍÈ…·¯õ¹ €&ê`·Û›\ç„p5Þ]Ù¼ILO·ž ÚímqÓ¹“”yT¾¸„sÙSç5Øs­ú^yÎ wWô´ñÎ[OrÄpÒ¥×ÍÌìqþ©eM¶ÛG8wù>­îu¸r¹ðµN¿:õŠsxÓýÕ*Öî7áÓ D;!êjÃDus¶Cœ$åuÁwè‡kéèÄp§Ó=f%GŠð'Ž ÎÁÕ‰“põ·óù!E<»p'ò¦“­H§vû×îçľ%¼¸¸ˆ e,[°†´yÃI§”M¯-¥ìÂgBîä[˜Ð«[ Çœ9L˜ \LžDS0ýN¦÷‰£­–K±)¤"ÒY¸2GÐ;¼•e›K©ù)ß¾”õÝÞíòGüº2‡Ó³~‹·žÂ°ï'Î6àÊFЯ;Nm0HÍñì,kÀ4œÄD™T¬ n¥JÅÞ}»õü`òm'?ÏàðÎrlÍ=–+'»Ýr=ïí5èÕ'áê‡FêâJLÏú¬Þ {Ÿä6̘ÛI<…^5kY~¸§EL€p‡v§&àÜþå,?™È ~ x-cì¡þØ{¬ÛWAÞ.]p¹üÊ‚+ênof¹¬µ[[]Cà8oÿc %õµyíÇühCî½=ŸÄ‘_aNÅÃ|÷‰T…!xz'ëÔ1l8ma¡æwÞØF˪âÌ»ÿ_/8„Éy݈&Dk¬€`DugÒ¨v½ô2kž¡Öï£òäJë"–ñˆ4ø˜&& g°qçÙËÅ¢YšLê®ÕZEcû ãklßöX’]ì?RE þ;–®åT°©s™¿ñrš;ŽÔrdÍöDdòÀ¤&ûxÛ$NÀ™ÚŸÔ“V˜}ÙSÆ\M3®ä?Ê{‡S¸ñžû¹ïþÏsûø<ÞŠ}‹ÊiÁ¹ËÕµ?™õ[Y¹ë P-'·­ç˜ïB©ÎVŠãeç±5G?\¬])¹ÄVìçD½IÄWÌêDr“Ú#qbÓž‰½xEÎ[ ÙÙ!ön+'*'Wã™U†OèERÎx&&îágšº˜RD:˜Ô,2¼?“ý‡ñįâ¿ýWzm7g—lr2â[>®¸<š•Nßm›4]q""ˆáÉaê]“yçõçù‹êq§õâ†OͦG”K·ËeÚ]ygÁSüæM?¶ètúM½®ó™þ鉼ýÆKünEÝ…§¬ôÃKθáxŸœ_mÌaÆw3¬nÑØ·§žŒé)|0Tu’TExÁNÎL›Ñ¼c¹wÌåCÒèîô~7}c—èhìS¤‘º¤QØ+ÈŸw01ÙÑæ17&?/ÙÀ™/Mh<½›÷¹µ<ùë#Ô¸2)œ;ŸáIv ¬cÜàtpvéßyäåzLw ý§Í'ÇyŽ­MÔݲ¿XÝ;ïl¿¶júÓ9–¸¢ÿeJæRNÆçsýƒ¯¸0˜È¯_ûO¾uß 2¾vGÚ`>õógúéf ;Í—¾ò,_x5§y±Šo¬¬§øY7û0•ì{ÎŽíǧÿ÷9ÆÇ¶F¥œ¤Ž»‡»=‹X´ðO,¯ c‹îJŸ1sžìàÂcU.ŸüegLús<û«-x21¶0ÏñKß÷£¦ÖF°5ÖÚàªÞ«÷s;¹1‡Yþöûމ¡Ëø\žzý·üjq&#gM¦oñÖ&Îe·1)¹é:8@£·pTï]Ϊ¢ÜQïñú ë;ICg2¥{ÔåýÃ0p8Úè=àHg—¾Œéö€¼ö¹»W#e¸3è÷ ÏÿÏO/ö…ønC™uÛdºG[”“ä¶T7ëÜ5°sæäÅ…¿çW¯G‘9°?©Ñg/tﮌn•8z \}šŒŒŒæªªv±ðÙw ›Ã°†7øË;%¤ÝøEnŠÞÂïEõé›”ؾçÐ’’RRZ¶ú½®8‘“ˆÿ•A7yCÍqEÛ„«ðî¦>•޳—Úªéc1Ñ÷³u ‡—ËE hñk].WŸL›ªÊ© ¥Ž63p޳ qd'¹1Ú±û™8Ö?Î"ÒÙÙãû3ïËý•v§ %TG^÷L²3syph'ú\U8E¤s‹P³ýiþ° ˜˜Áóé­¥›>æìêÇylEùS>ŨTòÕVòIâr¹°Ùlf=¢Øf³ár¹ÚîVc]0ƒñ‡^ã©ß®Äæp`¸Rè3ã.Æ¥;ëkĺóÄYD>N]§ñ­ŸNë´Ç¯[uDDDD>ÆLÓ$  …ˆD"—­‡av»»ÝŽÃáhƒGKGˆµâ,"­¥%·êtTºUGDDDD.cN§§Skæ(Ö""òaèšv JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8‘k2 ã²§³u6¦i~¨'‹)q""""""""×är¹¨®®î”ÉÓ4©®®Æív·øµF 0~iJ$ÁçóÑÐÐÐé’'†aàv»‰ŽŽÆfkÙ5$JœˆˆˆˆˆˆˆˆXЭ:""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q""""""""bÁ¡&ùhnþ¿ÚOtý_ýÿbÔ DDDäcË8yò¤G,"""""""ÒÃçó)q""""""""Ò­q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q""";f]˜‡þà%æ‡+ hòð^©l…²:K›Õañ3ÿ`MYP¨=„JYñÜ+ì¬wªcP?‘O"‡š@DD:«çžnàåê ?Ø ;×Á&Øéï¶1s”AT¢ñ‘÷a´bY­mË‹O°£æÒß$3zþzÅ´üX W*}†Á™ÐÙ†AÊV¾Ê޼›™ÖÍÙö»3œÞ»ž ;Š8]Æ•˜Ï FÓ'ÅE{ô`Ùj^zë(©Sï`r¶«ÝÛ·óö‘OŸz""ÒyÙ ÆÍsòLƒßdåʯ2øÝ4CúµÒ4Ön´^Y­^/ù3oc|z+$ ì1dõîÙ ;IC]H»ì+Lå®wX´;ŠAnæÆ¾â=ì+¯!”’DÛ§m‚T9C—Þ)T.'…«½Û·Óö‘O‰ùx| y nèmã©u&U &|6HÞ-.n‰6yø™ q6ŠŽ›œö™tíëàÛ£lÄP_æñ¥a6œO²f8vé 8hòðÓ—”õ\ˆîC ¶ïŒPT݆8øþP,Êr›¬\äoG `ƒ¡Ã|e §-#TÊŠ—·’<0™“ûŽq¶&LâÀ©LÍñw^fwÎĆ5[):]‹›ÃàIãèwEJ¤±z{¯¸£:tŽ¢SQL* héaγÈp6ïÂd?e{6²ewåu<é™4e0i®K’¦Ÿ£‹4rü±ôóîcã¥í{S_Š^_¾ŸÄÙ U6R·øz¯m£ˆˆˆ(q"""òáê",ÝÁÓÕN•+x… Èiã{wÚˆöGøí?B<›ãâÁ”O¿&<ÜÉ_  lGˆ_®‰ÐgbW˜4DXvÖÉæ;ˆ­ñ/ Âìèoc¸­ñ²òúFxªÌÆîu2Ùë3pµKƒ”sð\¦Ý4wåf^{k %½o¤kA"ë÷•âïÝ“(#DÅá3xó‡c«»¢žeì8Ñ·!ÞËX¿x3uý§sǬX|‡WóÎ’µÄß2L»Õþ¦ÑÍNs¨¦7‚£Kxiå"‚£f0ãö1Tm~E[Êèuc6®`›–l'2d&ŸÊ¢fÏb–m(!í»uù“æ2êõW8:øSÌèæ$X¶’—˳¸ñSÃH ŸåT]t« v‚•Ç9mÏdbÒ%ºöNcý¶b|}úk QQTŽ'o1‘SlXü•S¹eF ÆÙj£®x½U½'\~EIè\¥ž<Æ¥AÌf ’ÑÕÙD¼§ÑÍ!dïÊY£HõøØûÎBÖìq1Ar­ãïÓ¯û%íK¨”¢‹tŠMÔ-xz+›Ú("""׃‡‘Î+b²jA€ù¿oàsφØëàû7Ø®¾šÃÃzÚˆ5Àæ5¸1v™T—EXï²óéž.à »ÀNry„M­{é0˜8ÐF²Ü]ldÙLÊêÁoQV™¢ý&›KMÂ^ƒÉ­øá©çÈ[Oó·'žàoO<ÁË[*¹¸Ì§=žý2‰¶ƒ#.x›j¿‰§k U‡)k0!TÁ‘Ónò³c¯>&[ ùƒºŸOšÁÓ{9jëÉÐ^I¸ì.º¥«˜Ýe Mì/òÁßzwÅk3p'¥ãJ¦wœ†“øô8ðUáœßÇqw?†äÅã0œ$ä÷"úÌq*C×(ÿÒÃvEãj(§øT O]Ý­·öH°Ž+ w#ºÓ{“^„b_ÂU/s’Ó-†HùŠ(`D¿t¢ìv¼©Ù¤x./ Éz_’ý«,*Á“ׯÍCz÷(Î"pU]iôêêgS±ž'(µwc|Œ@¹ˆ7‹è&nYïK«®¢èX%§j_àïëÞÏvâL0t£‰ö1(Û±šõ‡ýÄwíJ f8rU¸?þ¦{iÀ×xÝÚ4"""Jœˆˆˆ´1Ó ì¬IT–At4Ä&ÙùÑ|é—Îê‚&o·°XUY9v¾cãÔÁ?Z¦ÏÝú_¯ /]{ıµ¨œŠ¸l¹‰µ¡&_„3* ÃŽúxí@¸žªzðƸZiB|~žÄ\¦ÝÔŸ¸K •²Ïúeçÿ]L؉É*dbV?jެáÍ•HŸ?ôVñ8»d“ZÏ‘³!Ò®*ÐAR¯L›NpÖ,&’u±vƒH”£¾’º÷Û­±r­ê}YÞ¤ˆŽBæ}v ö󉔯/âHEô$ëcÙÂêQŒ½y éÎU;q ¼ñ!áÕÇ¡Y/kßKÛªnm‘ëAÉùø ÃÖƒ&!“²¢Ï•Lén“æ`XC„'÷šÔ™ª7Ù_y~Šh7 Ø‚Gµx,ʪ9æµ#&~ âãÎ/ ¹®aàÍèNÌéÝì9jÐ-'¶Yƒgj_rÃÙ´ï,p€s‡7±§!›¾é­·b‹3µÙ »Øt°‚  ÿ9Ê«CLÙ/­ŽÛ ®¼š`8H}Ùnv«"ˆol4N"­×Þž,†ôssxå»ì)«¡!POÅ‘ ¼½x/Õp&õ$«a/ÛÉÌ‹Ç8Sz“ÚdžÝeÔ‡BÔ:Ì‘³A0 Ã$iN½ÃT=N8=ë|2ÀMF†ÁÉ#çšÎyý0ÀŒª>ξCÕ”{É1@ãÇyû†.» ¦ñºhhˈˆˆ\Êý‹ˆÈÇŸ ¼Õ!~üD„³.“&:™Ù îc牥¾¸lQ6ÆŽv톦šüae˜)³›÷ƒáj¼¬Ï$ÀÉ÷‚|i‰IØi0n¬“¾­uµÉ…5NŽ|0³§`ö|nH¼Æ±Fe’ïYÃZÿæÆ5ó¦!g:#nʺ5‹ùçÆÎ„LM¦Û¸ÆÕ*-ÉœteÄCX¿êmž[ÀæM"oøD’sšz‘‹ŒÂÞìZò:ÏìKgȘjv¿Í?W6`:»?rR+^éà qÐL¦:ßcãò—Øà7quÉcàèBbm€-‘ݼv(›!ñÚÕ•Á臲ví ^ܸð4¢lLGÝRü¬^{˜ž3 ¯w\ìù‹=Â5;Ú@ò¨„Knºd§^u„ÊÁÖ äH)¤0a)‹ž9€+¥…=Ópzÿ—C´£‘ã¿¢}GÍxIÓ7V·, ‡ªMm‘ögø|>SÍ ""['œ‹‹›»¨9¤-E¨Úù:KjG3otj'üvª³¿ˆˆHÛЭ:""ò‰ o ¤­E|ÇÙ¾/B~ï¤N™tèìÇ/""ÒVô¹("""ò‘„©Úù: 6È6… v¿ˆˆÈLjnÕ± [uDDDDDDDD,(q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚£²²R­ """""""ÒÃ4MSÍ """""""r5ݪ#"""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q""""""""bÁ¡&‘ŽêhM)_]õ0¥uD̈ä#°6ºF'ñû±ß!'6íšÛG"ªªªhhh é¼mo³Ùp»ÝÄÇÇc³µüúÃ4MSÝGDDDDDD:¢o|‡3þ*6†šã#1P$DŠ7·fýÏ5·¯¨¨Àn·‡atÞÖ7M“êêj"‘ -~½nÕ‘ëT]…’&­Ä6e¾³ÍÚ¾¡¡¡Ó'M à ..¿ßÿ¡^¯Ä‰ˆˆˆˆˆˆtXæ… ¿´0iÞ'¦ivú¤ÉÅzö†%NDDDDDDDD,(q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚£3´iš‘HÓ4-WÇ5 Ã0°Ûí8N\.×ÇfUàÎÅ@DDDDDD:«N—8 Ô×׉Dš=™7M“H$B0Äï÷ãõzq¹\Š~;ÅE1‘ΪSݪã÷ûñù|ÍNš4&‰àóùðûýŠþuŠ‹b """""«‰µg8¿™ó ~ìþp8zóЬÿà³1Ž^V'gV­ãüïë8óÅëŸ8©YÊiýùïýËÿ…÷¯hh-õõõƒÁOV¬;ÈÂÇÿÆò’Ö«÷G‰Ë'1 žà¿>ǖʰÚBDDDDä#xpúYwËûÿáÅ1·2ÞkoóýF‡ya÷k¼^ìPeµï„ÓÇáEñ㯞{ð{Þ9ìà óÂw¿Æ¯L„XüÞˆ.`Ú·3>óZw(øÙóè7ùå–º6¯Z»ÞªSûîÉŸðOnxí8¯Ü”@sW¹0M“ººÖo ŸÏG||üu]ocýS²¹úýŸœÄg÷ç†É£È‹iýœ–áNgÀ¨‘¸['ì­—{©=†1aüRt'Ñ5_øG»:áãê1ÏMÏ©&‘ö©æíU?â¿Î4`s¤3¥ð[ühpó×n¥²M÷[ÁÚ¢µ¯¬väÄÂ_ò‹E Üòà/ùnwÛ±äà9-œÛ:’(œ<¾†©«n ÒµkÇĉíÏndÀ—G±÷©÷¨ºi&]šùÊ@ `±økˆŠ½kXw¸3“;šñSqEj9ºqÛÊ0±ä CaWÏU‰š÷3u»¯ã%P¶( n¹›©NÌÀ9½»€¥+ÒøÌœîx[{_öXrú÷iµâ¬ã¦úðV6ïÚÇI÷XæÏÈŪ…;Z "u%l^¸%Û3¹sxb;_’ÕùÌí6çA¾˜¾=¼ôÌ^ ﹞^DDDDD®%TÆšâ#„fèuò«©“xuñ¯xÓobóŽåñ©#øÛÛó®Ù›‡¦ÞÄÞýG‘?˜^Ñíÿ=ßÝ”˾&vôæ¡çs®¸”^iÙ¤{Üœ8ú$ÿ¾gçì½yhÚì÷ç<éïa½iàËw‡ÎaB¬‡úª5ürý‹¬ ]±ŸK˲<6‹²ü‘vok³v'/¼QÍØoÿ;³ <D¼Ï„Š[V˜7¿ýÎSäþðgÜ”°ŸßþÛËäÏËgç’M;${î·ùöÜTö<ò¯üßžZØû5¾ÛŸ/ÿò[ ‹i›9Uû%Nêvðìê ¾ðûxþæ'ÙP5“iñÍŸ 7œº£lØç`ÈœÙtµcû›k9˜7“î•Ø\[À̹Ýq×ìeɲM”ÎKF#WƒÁë;i¿tÚìJ ·W:«VUPï óÖ3;èw÷môŠ2.LL0ôÞ›É3NðγHšJû/8— IDATñ®#œ® “_MÕö×yku1Éýö³®4‡9_øɡӔøb:Ø#²"–mdÔ[÷¯`ÉŠ^/éÐlqÌ÷Ì8?ÈæÈ‰Wù×íûðÙ†_cRRʇws*bB페ÉvÙ pÅ\%r†U'Ѝ4†½¼zÚà驸®LœXl×Å6‰ %|©¸œŽ_Ey^!¹öÍ->¶¨¨ÆË‚öOœDê* xºÝ—ì;3?m IÒúeÛJYmÚñJ÷vš“Ô³ûù¥$Þù/¤;S˜pW7~ôäfj¦L"ö#$N o.#zbÑKÈɲS•4ˆ ±v"]¼Ô9E}¯<¾2NTÕQ[j´ºå =­ÔÃ8ðÊcÀNbÏÑÌŸ…;r°é×Ùè]Ø;ŸA‚­ˆJ¢¯ñ·f” Ÿ¦ÊÑ•a N {™™v—7`äÇ´IÛuˆ¼þwŽÙÂ4BI…Ì̸äÖ.[,Ã{OšØ¢ÉÐÂ~*OWazmÔ”Õ~?qbÑ®Áší¢semÒs‰:>G"…cúÓ5Ê=H±­¥Ò!P³ƒ"Ï níÙ‡IýˆÙUDua,®†RŽ–T“˜“BVG»=¦©6ª³î_†»ƒ×KDDDD:¶ kœü¤º'ÿ5õüGײ;hB‹.p4Á~Í[é#ÔB¸ÝnìÍÚÎCŒ7‘„.üöÆIç׿0Ę»±-=6^‹²®Ëðß«þ,¾pg ›I¤Ñ%#:{âÄ¿¼¼‡ÕÇrp|ùÂï’sÙZ;‰æ,ùb³Ù\›þ2œˆbàÈ"Gwr²ö4ÕÁ RrF1¸|KîÅ•MF¼‡:»Í²ìë;Á¼°¾Fb ‹Ÿ[Ž£oÒÜÔ·¬óØ 01[ö7‹íì1™¤™«8r&@jR5GH}ÕÉÀ*.-n‚Žƒ›Î¯qB¸ŽS»–ñÖË«™ñ©ñ¤N<ÎË:%›—±ê@=]2³ˆÃÀ Goá‹í!P[K8*ç|B¥ÉXØqØÎ¿&X[KÝéM,xfÇ…Óv˜€‘‰#¸iêVÖ¾÷O¬JgЄI ÍŽê8Ïo¢šì_ɼ^""""Ò)˜½<~°Š¿öËÓ+sÜ ÁŽÛf&`|ô1¦á!+.ŠÚÓ5„šZÁóâvÕÔø+©ªÚÄ×—/áä¥Goæ·¬†Ô[•u¸2“xŠ5Gýôò´ÏNÛq‰Èv™4ìÿ'oDÿ€~Ó41öò³®Ëxj›¯Y¯·ÛŸiÖÞÆé¬Adv£ï˜iŒŽ9̦c>L{ÝGMgîÜ9Ì“£ÁI’ÅlÕªìvçÉføà(¯ÝMeäü„Û Bèý+ÃÌk¦>Z;•‚ƒ£ï¾Ê ¯¬äLþÆwó´YÛu˜Ø£Hë3€”@ §êO …Ê׳tO4ãn¿é†Ó§«·ïYgt¶º |‘æŸ œÑÑx“‡2÷3÷p÷=÷p÷=÷ò…»'‘á´›3Œéw~Ž;GºØ½x5¥èieM¶Q“ý«c×KDDDD:‹0ÅG_a¥g:¤Å` Wr,”ÊÄ”$¼®,f÷›FOû‡˜aÙ’¸!«;)v7™]çò`b9¯ŸË®ÿù³G”óÅžæ¾e3.þÿÇ«¿øA\.ü~ÿU·…Dçf`ùjÞY° ‡-‚=ycr¼Dê²wå6Êl8¢3(߯ò&6› —ËÕqÞÙîL† çŸë¶SÑmƒ†gòÚò§ùóš4 'Œ¤GÙÞvêó©äG/æ¿~ðæO>ø}芟/ËVøØ¾ÿQ¾³ùŠË(.}£‰í0©¯^ÍCËWóÐYôÞwXtáÿì¿éc³*뺰ÅÒ{ÖWøé¬¯\ñ‡æÿÏïÉFd3ÿá§½Ei𣿸ð¿~|ýâÿÏå?G÷¾“?vg›WÍ0MÓì o€@ €ÏçkÕ2cbb:ÖÕD°l¯lJaÖ¬ÞÄØ ÒPΖ—_¥xØ=ÜÒÓÛªqQ Ô¿šê_"""""ƒ^ø<^‡ûúˆ£7M»ƒýïþœ'kC}»ë¨>ÔÀ¶ùO\s»’’222>6}éÃÖ§Ó¬¹èr¹ðz[oRåõz5ao”I°ú,uá0á )53PŹ` ]\­Å@ýëZýKDDDDDäzë4Wœ¼/P__ÿ¡Ÿæb³Ùðz½ëŽ&x–Ý+—±¹¸›ÓŽáìBþðñŒÈ³|ÌVK⢨µ´‰ˆˆˆÈ'W‡¹âäcDWœ´Œ£³UÔårát: Âá0×Êý†ÃáÀétâr¹0 C8“è7u>ýZ1.Š|”þ%"""""r½8:ãA†ÛíÆíVÖQqi;65ˆˆˆˆˆˆˆHã”8± Ä‰ˆˆˆˆˆˆtX`ªZ 4oÍIÃ0èdÏ“±®·i~èµ6•8‘+-*‘`$¤äI+0`8DztR³¶w»ÝTWWwúä‰išTWWãñx>Ôë;ÝãˆEDDDDDä“ãhM)_Yõ0¥¾3Jž|DÌïÇý 9±i×Ü>‰PUU…ßïïÔÉÃ0ðx<ÄÇÇc³µüú%NDDDDDDDD,èV JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,8Z²ñìÿ=§»Äÿ’ Fù3LÓ4Õ """"""""WkÑ'çÎéŠéœZ~爮8± ÅaEDDDDDDD,(q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q"†éÛÏ«xœÅ'ƒ®€@1o<öÏ…?zY"ù½ """""Íæhš†ê ?ؼ$åfâäád{2(3wâGï¶F+–%ŸfeÛW²bã~Ê|aÜ)½5e2ƒÒÝí|(—÷_3E¤ÝN„­4Öé\ZoÖ*gÝëð œË}R0ªŽ°mÇ *ƒé¤¹"4Ô1›UPK¶•%[4½o¿—YNÂõ§Ù»ôÞ\žÊ½³sÉدuöam½²ä ÄÙM/óÒ¶FÍø,·¤9©9º%U„ÒSq¶÷á\ÖuΑö:¶ÖXODD¤si½ÄI¸–3þòzt%ÆmƒÔÞŒ™ àçÈkga±Nü™ßy³™q÷xö­fÍ–”Ö†‰ÊÁì›F‘én¸zÛÛ{±ùùm øÜô60kwñü“ûñÅÛéî¨bïÒ×Yy ’=޼Q3™68¥ý'1ÒvóCo ýRYµæ,õ~;Kž\Aêü»]Â_ITïDʦº6H—þ72{LQÏìdÙ¢÷8\À™ÒŸ)sÆ‘iÇóÆß.)ëÉu¤HãøŽÃ”W†H1¹#ÒpaQV´îrûDñcí¦:úλ¡.Ü70ùŸƒgv²|ñ{(oÀÒáS&S˜æÆóÆ“kIžÊ±í‡8Uã$â,ú7²rûq*©Œœ7—á©Îó}²%Ûþm©óo%iÕÓ—Ÿ3?;…LDÚ@«Œõ BÍÁ•¼µê>þ0€¼›`^®«ñÏ]OÆ|""rÝ´ÞìÏ•NažŸu¯-bsÑ9¿rð?çÓLJq‘}Óý|íKóèቴg1fþý|ã«w3,´•»«‰4¶­×z—Á’µ¬*Éåæ¾ÆWîÁÀ¬XtãÅÇKÈWÊ®me8»våª\E¨’rg!s?ó9îûì$bö.bMI'YõÚzƒçó¥¯~‰[zœbÅÊc44µ£@)»Ïfqã§¿À}wô£fó:ŠýX–%Ÿ,ÁŠ#”9ºÑ+ÕÕHß9Á» Öàë3û¾z?· ±áµåó¿ÿ÷2öVæ1óîû¸wj/~…MŽ‘Ìÿü}ÌïSͦuÅôÍ–lky~U¼D¤´ÊXÌú#,[~’œ9÷òÀ—?Ë„Œ8zÎù<³s\–Ÿ»5ó‰ˆÈÇ"qbDÓcú]ÜRè¢héSüñ‰WY{¤šp£{!¯°/Y1ªÎTbFÙ¨.­&ÔÒ]zbqûK(:YMÄ›JvЧÝ×6ñ±ïÅGyä‘Gøý“os8n,óÆe\ý­’=žü^éx 0¢º1 Û¤øH%u¥Û8äʘ^]pN’û $¶üMu0G"}åkG—,’Œ*ýeÉ'‹Ùà#èŠÅÝÈ &PºƒF?ÆôOÅãp“Üg ƒÜEl=á¿Ø·ú Ì&ÚfàMË"ÞNaŸdœ†“„¬D¨©Ä¡åÛŠˆ´·VëE|åT:2è–èÄpÄ“åäl¹ÃÀòs·Ò¡1Ÿˆˆ\?­›¬·E“Y8™ÛŽ¡|ÏJÞxã%ÂwÞøä+g!~Nn\Äò}õtÉÎ&Þ40Ã-Ÿ 8RFsËôM¬Zó,-ïÊ)72¢[”ÔÙ]²ÆÉå3Ô&Gs8=Âu‚µ5Ô•oॿo;?¨2Ã49Dš}ãµ » "fIJ,ù„Í\Q854Dûe'3‚µµ„£ò‰~ÿ÷öh£"¨iળšÍŽÍ¸âg"¯ Ð’mEDÚñ3ú£Žõì±Y¤›+8|ºôäjŽm it vLüŸ»¶dùDDäc’81áü‡œá&µßXFïz‚-¥u˜)þpaÄ:µŽwvÅ2ý3sÉtG8·é0»K.Î/ÛÆaF½?1ÍK&vâòF2;o(Uû—ðÏ·V’ùù™d»ØO3@åY?îì(\11xS ¸íÓCˆ¿tD(f[˦Ë8­Ê’Ogb>iÁì+‘麪ØëÎâ C´û¨¨³ënŸý•çL‘¶ü¸m±ž;>¹+–¿ÄqìÄwŸÎäÜó÷6ù¹«1Ÿˆˆ\'­6®–®äÙg±ýxu ~ªŽï`ûY]S£0 Ñ“ê²J‚á¡€€ &ç³mï¹.ó¼bÛ°=†DW%‡ŽWôŸfÏšMœÿdöŸØÊæC•qàÅ©oc?YÂÕí/¡6¤êð:Ö”v¡_Ïx¼é…äû7óîîÓ4˜©?C鹦vä%7¹,Ê’Oo.£{Øóæ"¶ž¨Âßàãôþ•¼´`;u©…ôˆìfõÎrü¡Îì]ÃV.ƒ²ÚéqœWž3-i#­6Öó³éXãn½‹»îº“Ù#³ñM}î6P¯1Ÿˆˆ\G­vʼn3}“ú¬bÕ¢gY^ˆJ¥ÏعŒéêìd,Ä»à9ݞŤ;Æ1"y!¯üaîô¾Œì—‰çäû%¹/ßö3ó:2›—–üGßMgðä((Ù}~¾à´S±æE{»Ó™Dï ³ÉÔ7Ÿ6îªM¼ø§ãÔºÒé{ã%Øl&ÎÍŠE/ó§¥~lÑ©ô;‹ÔÞ ä¦Õ±dé>úÏ‹kÞ>Ü—Õ5Aí“vªLu·¸V°ò¿±²ÞÄÔ““Gïõ0~ÞV,YÀãï6àJîΈ¹“Éõ׸½¬µ\yμ•B]%"m ÕÆz®Tzļ͂?>rþgÃE\æ¦ÌKNTcŸ»3“¨1Ÿˆˆ\?†išJØKçsñq¬Ÿax‚&‰"""E°t/¬O妹}‰µA¤áÿñ"ÇG~ù½¼j ép4ã”NNy?‘Îô¹¬:‹/¾¸h»ÙPŹ`,‰N5ˆˆtH5ˆˆˆˆ´ƒ¨îul1/þu=†ÓÍ™@ ó™¢a©ˆˆtÐO/ݪ#"""""""Ò8ݪ#"""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDDDDDDDDÄ‚'""""""""”8± Ä‰ˆˆˆˆˆˆˆˆ%NDDDDDDDD,(q""""""""bA‰ JœˆˆˆˆˆˆˆˆXPâDD¤SðñÞ¿MfæïįÆi7Jœˆˆt E¼»½šp+eª5EDDDDšÍ0MSch‘&”¬}·¸tÓl†$9šÜvËNáËûÆ2ºö-6tù4ß²‰Gž+aÈžá7·¤S³áOüð§O±¾4€-i0wýè|}lvB”¯ü=?þõ l(©Ç›ÇøÏþ;?úÜ`bϼʽ³~ÆžKw”ý%þù/‘ïŠP½ó9~ñ‹'Y±ÿ,áäÁÜùo?ã“ÒpDÊxñž9üâÜíüü‹>ûÍ[õ x9Óªm©.áÁ?ïekàƒß…"v¦f¿Èµ7ùÚºòüìÕC¼}:„ÇÜÉýù^aî ÷•å{¯±º2 Ø~èèÊ]˜É_•qEDíI¼å|6;•Œ),é€7#•[fnçǤ¶\ ^¶¬Ì 5©‹. !èÏ~’ž2&ÎÙ‡³Gæ73â<¸‡a_nç—¸.·*5ïÏ]Êû³öRÔ©KSLܰ™[gï¡ÍÈÆ´ü3㢺YµtÛ´LÒü…B!ÎXæí/@nAZÊß¼/¨Ì. sÄ 4øõCIœ!ĹÔ%`6>kbà³—bp§²µ¸ÍM;ÙïèFxué‘)$7Šä „¶kF½<+¤ãÐuæÖ§s£_ ‰Q>,M^dþŠ4r€Ö‹ÇŽììÈlÌÅC?dÉ=æÃïSHl¨©O³-Ž<Зm›Ãò hzÿôm#øjîKÌYzˆ«nÅìT}Û»¼>¢~{Nx½^ÒÒÒp8$%%pW-' fbìÔŽæª_ÙóðòÜ}¬(õâÕYÔ·÷64¢U5ÔOnLÏd A{Si*.û>n™šÎn§›è·PŒô»®#φÛÙZa¤o¬-àL3]»ËU.·*8ò³yeî^~+tcטéÙ½O¶µ¢/-`•+‡ZX0)Ô²½ßÊÏù iU튬}¼W˽õ3™(Í_!„âŒ9¤5þíIðÓh):˜Ö˖ĉBœBdœ.·•„˜Ñ+âsÞqÜ΋–.F+FEÑaÖkP4 ¨>T_ ›¾Ç;?m§àÈ+-jÕ˜#–¶<ðôÕäýo¿°ˆ[Ê^{ýNR4T?2‰Ga!.`ÇKýiÿÒÑ%»sqŠ¢(@4w«sÒÄét2kÖ,ÊÊÊ0™L,[¶Œ˜˜X·ís2ù0/Œ›Ðxʘ4+•Ì”vÌí`Á•‘ÊͳwÐüÎÖô¶øÑ·ƒß‘m+s±ÚmåA›ƒ_=¦géËù¨iG¦¥˜ŽÌåóçÒp¿ì®d@;?œÙylÕñDXɇóÙUè¤Üí“èVê×Ð$ÄĨÖ!´ò“€q¾ðe³è“q|¶!ÚÝÁS-,§=÷„»Ôô IDAT¹xŸ£½K—25Õ ä³m×!:„/`ôõïP~ų<> [X0&´XüªÞÐø…bÓÀîMKY¹YÁæðÕºÍÓÕ²ŒEßÎcS“þ„¤ÍàÝiÿäÛŒ 6Ö¹nYYY,\¸UUñz½$&&b4VmÇúõëY¸p!‰‰‰ôëׯÚrÔÊ"ffÔÓ|äãsº(wäóØ{K÷zQñ¸ y¥:4€«è ÏLÛMAÛdÞJ9õ¯ª£Wfd‘0¸62àÎ;ÀÃ_nâÓ°‹¸ÉåÄ®Óc=’+R0›µ¢ `äz<÷ý.]®¡aÓ8z‡ëÙgÔà+9È;lŒ¹ÑŠá¬Ì_$„B!$qrŒÙ<½<‡q]#I7cÖÉLÇÕ±{|l8dçñey±k£%y"Äù¡,_7®yâ:4 B}-)#Ñn~5–·\Ï“ãïÂ÷Ð|þòt.ýbܳ•&>ǨY*"H¹vOõ ©z=Å։ѣ:òèÇSxø¶)`íÂK³'ܧ޽åÅɼp÷l0ÅÐ醇¹)9gë–””ĨQ£HMMeþüù¤¥¥a³ÙX³f ‰‰‰ <ø”åT:Ä6s÷û ÖdÄæÎów·¢S5¹oÙ!ž›–†«k;þ/ÙB]Ò=®Â<Öø‚ŸdDèCù̖ʌƒnnŽ2bv—Qv$ЎÃêG”AÁÇ«#ã«âê,ä±L´ ÖP”™ÃºìF¼YõŠŽÇãÃË®®Láû~ò' „Bq:kÓßøC£Z‡Ò-Ö"Q­ƒ¥ûË™´¥ÏûÇK0Äv“·¶ÌdñõäÚ‹þ±z„›ƒè“­†bÒÊD¬{¿~g癸ñõq\vªYbþ#–-[ÆÆñz½DDD0`ÀüýýO±•=ËVqû¡ÆüpuG®ÞrÞŸ¸žmíÛ1!ÙMy/, eï†t3Û™>õæ6h˧]¬Õ$M<ÕŽqâ+ËæŽ÷ÑüÚö<¯ÇWšÃ؉©„]Û™'#*yëãõ¤v¾ˆ müðæfpççé1¼=·VðÎÄdu¿ˆ›hزlc3c˜vc,ÑÇåû½lüa%Ï[ÛðµLG,„BqF¶4½Šݹ§°Àã åŽoÎj™g­ÇÉîB§¼zr:F[»$[qžr88\.>_Õ×ÚƒÁ€Ùl>òŠÃéš°y3ö,úÇ/×^ÄWi¿ðXò° þ|/ÌÄ«/”2si=‡Ö» ¢»uëF§Np¹\øùÕõ³]¥¸ÐƒŸMüÅEkåÖ+ëóâÜuôYìCÕ¸¨S3nòSpäðu–›Œ«éúÛÑKSÇ!y§±¾Æ×¡4þ‘ŒPγ߯ §[AÑèIéÔ’{¢µ øsçÕ xiîZzÿêÅ«³Ð»O+†…j+7õbìw¿Ó~ŽBh\,Ï\sBÒDQ¥./K÷W°)×N±Ó‹A«iÑsqœ…Vaæs: Bñw:k=NZ}¶‹ÍÃKD%fÿin·›ââb9Ù”oÙ€'/χ¢Ñ`4é1ÇÆ£iÐ]Hèt§—›ìñý½;Ëÿ5Çdôgñï\ðç}÷Ÿ±ä€–†— ¥GœQ„4Ÿ “¶ðé–ÂÇ´kfæñá45IÀ„â&=N΂ ‡ìLßYÄö'>UÅfÔrIœ•šaÕË×âßÅétR˜—‡cÍ2”¬lL>-´ ªøÙBð÷³âÎÍ¥d×& š’—Ò•à°°Óê}òoJš9ËäÄú§‘„A!pzUÆ,:Àò„™uÜÕ&”^ V"-z\^[òÌÜUÌü}e ÿ)“—»Gqi‚¿N!ÄyíKœ¼½.É[ écaX³  R‹œ|½«˜ov—ðÞ¥142þãòÙK='ð^I<!ÉœóÕ»£#ñ©ñ Œ:³&ïñx(ÈËcéGºy3þth֌؈4>»ÃÁÎŒ r P½^t{rh”š×ÝJXDÄi÷<B!þ^X‘Ãò\šàϸ®‘XÑUîò‘Uî¦m„Eú1¤a%ü–Íã¿$²ŸžÒóD!ÄyìÉLÛ^Ä—;Šù O,ôŽåº&„šu\ÙÐÆC’hfâî…Y;ÿùé 5F37´ e°M’&çŒ}5c/žÍN7{ÞȨ¥å€‡ƒóââ¤BƒBhpùˬ,ö7EÏõ£a°&[#ÿoÅÃLØÅÅÅ|ÿÁ{ü±èWöÈbýÆ ,ûm{¶®çÀ¾ü±úwf|÷?.^¶»Ø¶=•«×‘ñÓË9BqÞ[~ ‚¹{JéíÇkGIšì)q2ôûtúÌÜÃÏûÊèíÇ;=cðªðüŠ|ªÄO!Ä)Xã1mÎ|Ì‹ñ ƒzbŒÖÿ³ys½ÃR——÷6ä3ö¢0:GgÒ–B}›Î—;Šy±[&†É[ ÿù“§ÑÓ­±dù¢äœQË3ØcjAŒÁIæho‚²ßxxät™žJ^þÞ û˜‘ïì$oÑÜôeCÞßUJÅÞ‰´˜yc~­)Qqf#S8òöîáÀâŸÈ-ȧԣ ÕØ›¾¢Õ(¤§îFë¨EG^i)fµ’X›‘òåK)ߟ…Óé<³`Ú1éŠ1t­õsÂH£Ä´5žÉŸó_ÙV!Ä…dÒæt…§:F ÕTMÍ­ôðèÒlæí)¥M¸™«ÙØUèdù  Bˆšù%áÿÑ8‚ž¾Ÿ°÷ú£÷S@€ñÑg;!_݃_Ì?׋ÿœïyéþ Z…«ž´ÌëSy{]Éáfnnć x°]Xõ¹+ûm)­ô|¿©cËx&&Ù¹ý›"®’ÀfðU–pãœRî¼&ŽK”JÆ~›OóV&Vî,gG™J£–1¼ÓÚ„Å}ŠeßäÒ¤_#üì5¯‡JNz®-cŸÝC±·êAýâÞ x7FJëªrÕC\rõüQĦ öåbZ1ŒÐéÈò5âÆ¦(ÚºiLù×ûÉÐnÁÜ纆éÐÒŸlLÊû+ wÿ²1.²—MâÙ%ËÙ[a£é€QÜ;$Žo>Ê÷-ŸçùËÂÑömïñèWõygÜeÇ%Nöþ²€¦QÑ4 ÷¡¨:J+*ÕGb“V„nÚ‚Á`%Ü?€ð@"£#ÐúœädäâÚ¹{RâÏ´sJJÕïµp9뜾s·­Bˆ F‰Óˆ\;í£üˆ¨}n1xyõ!zÆ[Ò(¯v³t9Ýc-H!„Õ LÂØ´*=¡\t¡øS¶¯WEU-j‚1ÑHåÏ…‘8É(uÑ8ØÈ‰_TøOî£+²+¸$ÞJn¥‡J·¿šŠuUòÉH>»*’-¨{í;wÙ™]Ì'à ,Êçªùù¬nKOÍ)–Õ¡Œj9ãWUÒ©wŸz˜þKšÅó¢ÌqyZü:¾Á¯ÓʹvÃX¾½«‚qC¾dÀ7ÿ£½áÆÞãyú¹¹4©#›gÓç¶ö$”ÄQòÅ·¬+jKußÏÙFNêà„ĉ§€´âÆŒ~õV"ŠóÖøùºåÿ¸®W#>ÿv½û®u±u¯:þ”»\ä­YKDhqa±¸µ\n7îòb¢CBÁ«ÒµE |fK+>{E‡öãÖ(ø¶§âêÕë¯GÍà67qKD~:-‡Ò?æÞ-ûiÝî~îŽÁ×õyºåÎàžµÛð‹»Žš4!X«ÅQ4Ÿ'×.!CÛˆ;;ÞJ³ŠªæðÍêi¤7:~Ûak7I#Bq’ýen|*´ 5×iý2— ¹v:ÇX0jö•¸$ˆB!j–½˜Â‘á„Lˆ^JÊ@Rþ\èÀùÊ8ŠWüs½ÏùS½N£à9æ‹m»ÇǓ˲ú`å‘ßYôÜ>åðú5×^Ï€Ö$hëúàidPS ‘0˜©¯xÈtª§^V‡2û‰#Thƒi{Ew| žä’¤ÆÜ´ó*îíDØ€÷x¯×r†Õ'¡Ç8Ò[u ’j^‹ÑGÑ}`ýõ˜ã»3°¥—íahr)MŠgcÜÙ¬Ûiæ¢äÐã6õz½¤íMÃîpbÒé‰ #", ðQYQ‚¯¢¯z½ŠÑëÆWQн°gE%JY9ÞEëðzÏÂx=¾R¶í›Ì ?Žå²ùŸ“ —ùUòÛúO˜U–Å´åÏ2lí&Ê­=y¾A?ÍŸ_à5gOÆÆØ°… âju7Í‚!‹?绲“¶B!ªSyxÚáê¾Ìò©ðkÆÉ³Â•:½(€Y¯¡Â-½…BÔFÅ÷Ç×Üù3Ç÷)ñàzãy ¿ÌBýÇË:ç=NšùtK!vB‡—1‹°³ð胮I§¡W‚?¿¤—Q?ȈA[KæAÑ`;ã#P0(àQOwYõëé-fZª¹üZè£E°›¥¼ÔKÖ¡—¿€Ó²õý¸úÕ…ì·v¡¹©ˆÝéZÖ_oæ«'2ü•p>^½‰dç¼7üJÞ—Âúz1ôÝe }·jû¢oûò®%ú{ÑàhÄUê@õkHÏæeÌØXÈÅÍ7²U×–»ÂOnT»›Ô½ûÑ ¨°S\šÅ߆ŸÙh°…STœÏŽÔ?ˆ Áëtàĉ§°SéYzEG­ ÃEŸ&½éKcCyF8Ž?¶ð´ 0ðh·æx­N½ÂŒýÀo¬±\Ç„vLK]Â’@+mN!Ä©›ª.‡*ÜÇý>§ÂÃã¿e³îÐɽ~mì%/-Bd°8!„§zL ÀЫõ I úKÚ ›¹wÅ?—99牓ŽÑŒÞßPÀèämv:Q “–q]£0i¦l+䎖!§— QÀñ痪ʹú~C1˜«ðʪLV*ââ£x*F‹t89=-™ÅÄý×°ì®oyÐû W~Ú‡Yo¶%ûŽuþæ­¥=£^½‹Oú}Ív{/:ûý¹u)ëgo!¨û˧H@8É?P¥iZLÔ¿¤%å_mdŸo¾6É8á¯B«ÕÒ&2‘Ý%™d•`ñ¹ð¢Ç¥–a6Y0ëtäåå’Waç ÎDfV*‰V<>_a)šèFhµ=C¡·^ÊûÝZ²jãW¼ž×ô¼ŸÐêÚ" ù3¹û÷Íÿý_Oü²ƒ¦Ñ—pgçq\±ýEÊ’6'„âÔmü VdW¢R5Üú¢Ìržý=‡’jfAlj¢Iˆ‰E™å¨@«p³Q!D-I¦ÇŸ&øº¨“ŸoR®%ô…ü»¿Ç]þÏ$OÎyâĨ­ýþEðÓkx©[´§Äé%1À@f™›;ÙOœ¿žk›ž^áZI:¿f»¯òóºBvyÏQŸg%Ÿ00v`4ÝŒÒîÿB ÉÍҪǽ= bCУ'¬MsìNá·Üdú†9ØñÓÏäÆÜHdÉB^{ßÅU£º£,y–ûæÆ3zMË“‹õ°yM*]û%áÞ:›{"¸ä–pt€.ñbÚT|Ì·K4´}R/!ƒÁ@t·Nlú2ŸÊ–ƒÙSìÀaw U Yd$Ë÷¦Œ‚—=Ä6`ÿ¡BÌ¥è®i{V†õ L&©üW:˜ÃÚ•&-9ª‹2Ÿ‰(ƒðP÷‡ZäêÀÝL)vb0…bråá07 ¾wÛ³¾çE]s¦EE`Ü_|ܶ¢î‡—Ë…ÇãA§Óa00›Íß@ÀBñÑiú$úóÍî~I/£o¢?; Õ&MBÍ:^î…ªVÍÄ£Qà²D ¢Bˆ) =8’4qà|mÅ©]ù¨?:”ä« èº˜‚ŸK/ŒÄ ÀÅqV&\Ãó+r˜µ»˜.1 R‹\¬É©¤G¬…çºDÖþšNµGcâÖÖ~ŒX±Ž˜Ö)Œ¾¹Åçæ ô&zY2zú®Ãg^CtD Ïô£³ôN­;w!™ÎHZûãÐAôñÁèÛ%o1}ÄîJŽf˜Ý‹¹Ùõ¼=õ64K(úñNš<|%®'Lý†{žœ,SÌ1ÔwÎçå{6oªG÷Ûï£oÔáæoˆ§[²‹§~oÃ51'ok6›‰Їò·'°u†J“³ÏKyy9ieeÌ/Ä_££A ŠÑߌW£aAN—“zhú^ŒÉt†À›Ëz{=FÖæŽôù,h2œ}°¿x»*ÝUoÚøòX¸7›»¼ÌŒÜo³z¯áùŽãªñâ´oåÝUÓÙІ»š#TÑc៮ÞC¥ÏwܶCWþ&mðTMÔí¦¸¸GN6•Û·à-ÈÇWQÑ€%&Gƒ&èB D§ÓIÀ„ÿw´ aÞžR^\uˆ–¡&F'‡Ò<ÔÄÌ]Åì(pâ§×Ð-ÆÂm-ƒ óÓñÁÆ|¶æ;¸¢D›A(„¢Fjú/½ÝšÐûãq½ú<…_ìGU3É¿B>îvÁÇ/*ýÇꧨêÙb¥Õg»Ø<¼ñimSáö1?½ŒM¹vì1V=—Ä[ivþuç´çærË&#ïô²©ËÁ¤÷³²u=>KÒžµ˜‰¿ƒ—œyÏðZÞ­¼|kª»µËÏÏgÓ;S˜öÎkl×{è×¶% fv¤åPærd£iÃÖæ²rïõôHˆ¡IJb¸‹º½vÖfæ­ÿºèl¼æSi"‡9N óòp­]YñxT¼>7:£ÀÐH´%Ð$ÕG›Ò…àÐ0é}"„øO™»§”'—$Ô¬ãù.‘t«fŠá2—·×å1cW1‰6_\ž€¿AfBˆ Ñ–¦W¢«ë—ÈZ-jÙ±3±)(V3TV¢ÖqŽƒ–;¾9«Çñ^Å,z CÚx¾K$ÿ»8šûÛ†—I€Êr'ù>÷á4”ÏåfŸ[G²MnþÝT<ë˜ó«—N—&RÓ÷a´¸ûFF¾ù:K(+3` $¡a Úl1¡˜‚ƒÉqy)++§UXÁ-Z6r86›­Îµ 4ZÿUÑ 2J×ê?y< òòXüá|:ùsoÝŽS£` Fo0±7+“_6ldéîýüöób²¾žBa~>Ï¿á(iŸã³ÝNplãÝÑ1÷àþjÖ±qøÛb¢R¾íKž¹ó&nºkkËÔÓ¯ÏÙ®Ûyuþßšý+xmÔ}LÜé8ýc¾ûafí÷ –¬<³2Äëð\çHŠ^F/Ìâ†y¼»>Ÿ»Š™¶½ˆ§–çÐÿ›½ÌØULÓŸô‰“¤‰Bˆ:òž4©ºPËëž4ù»H?ò³$8>œ»ä0bV½­NÏ¥íc,ÃÃþ‹…Éžû O̪ Õuc[óŸƒN§#0(ˆ„ËÚóMçÜtÝ –îË"%*š†±:üü,lW¿­û ë3Âh{ÍßÕû¥.uþ+ÇužRËØúíb\W¼Êäþè4çËõà_r®NŒŸ¯ãЫ1Çœù+Š¥}þb†4²Ñ:ÜÄ{ Xº¿œ­ùÇ'¢",:F´ ãº&Aµr$„âüwÖ'F­‚Ó«^°HEgäšn \SÇõ/äXý›šôÀ—øl`Û¸ÑHXx%Æ&͞ìÏ?#}O*ràVópúY¸áúké9p ÁIõ°Ùl§=ÆÅ˜VCQ…Ÿ2WQêªøÇ"c3Xèß‘Z •fBÕ@°y{÷¾pÙ¥N|&t[·o§al,y¹”äÀ¬1RPéÄêu›@ÅŠß(Oi¿¿ÿi¼²ã¥²Ôy†3‚U¿­'o3©¶vô7Gf?›Ÿ?u©ó_9®ó5qâ¢Ü®!86½æ¯Î¬u.¯ÿ’subü4!´îÙýŒbw$g¥;Ó2ĉêyó’hÊ]>¶8(vz1h"-zeVA!„’8©N£`#kVVû®«8Ùªì š†È¨±çÝŒNGHHV«•Û¸§Ó‰ÏWõx¡Ñh0iV³ÎÈãÉÃxvÕî3Áˆ³¦v娯»Î¦Þ zlY¸–ŒCnâ®x¯ˆ!ãÄøÝ­câCSI|j<£ Ö|Áû_­!»¨„rOÕ-MòÃïó`+ö}¿0ñÙ¬ÉV‰Jn‹Ù PÕŽþ,#hï>v||ºO¸|à&«ACû(? „Bˆÿ´³öÒéèäPžû=‡E™å¸¼ªD¶.¯Ê¯™å¼°âw· •€œ§ŒF#DDDETTÊ` ÿÅ¿[—‹¼?ÖL«¦­hÒ¢%§Ð½E (Ć„py—®tïÑ‹¶{[­OGQðlOÅårÕy_)÷½À- &š=ðLzïAÚjw1ýÍïðö}’÷&¾Ç£ícÚ[)Ø=“¯v·bì{“øäµ»èÙ$ž÷¿m;«j);6*¤4ö?úë) ­¸1·¾:‰Ç DYð!_ïv Úw1ýwÃÛÿG/uñÝSØ\®Ö²ÌrR[œU‡º•Ûù~S=î~ý]žîŽ/.]S®}êÿølâK pÿÂÔey™ìÔuˆtc/ÿo½r AË>aÆnŠ1˜øõ‰ñ?ñ»€S”W]Ž¢ÆãÔ“}g*¥^pål%7 ‚MY8Q©ÌØLIL¢LÌe¤ñð§¸%Á–}Ä'¶Æ|õ©í|Õz|ŽT¦¿>•¬V#ùߤɼ9êbŽIt¨”mù’×7áÎÛ;NšX«oƒ5´‹ã3ŒÕïû)¶·§²dSîxáMÞ~º;?~ö C5ñ;æ<•­ç³);iqß¼ÿñ« kFûûßàžfTûN¾œ0“‚öòΤÿcì%6*5ôŸ9¡ !„BTç¬õ8émá¥îQ¼¿!Ÿ±K²ñø$yR½F¡E˜‰—»GÉ74Bœ'¼^/{ö¤bk‚Eo 88ŒÒ’(ÄU^„×íBcP0¨4ŽJìå8Ë+ ¢ß’õxG{Ïxߎ´¬³ôã™N‘ˆíÒ“Eë8Ô'sÅn6íÊ'®U"ÍýïÉ^ªåi¬w¶äÚ còäú(ºìB¢¿ü»3°å·LÞC™ûÖhºóè%IXõ`í:”>?=Ïü44Ö¼¬UòñûÔZêV7´¡t¹² ‘†ÃóÚ Z÷î†ê)#g_.j€–‚Ô<Ü—…WM½­ #¥cü5€­9—4÷ñɆ«Ôî<Ü¿ Az A26€Ã§Á[´†Ï&¦ÒqÌó4·*§hƒµœûvÖ#ÉG û´o©eû€>šî}Z¢S ¢)±š ä”û –±â½Åé24dP´EN³¦ï«@Ó.çÞ_Y«éÎØÍ2MÛoÞXÃ99¡ !„Bü‰€Q~tˆŠ—¨ !þs*í.R÷ì%X뇡¸ˆÒŠbB‚"Ð(zŒ&ªªeÇæ?°ü0ëTºJq—c,ù+c[¨8Š (ÍØÁË,¨ê"¨º©TZ¡‰¿ŠGGÎcúŒgýyCúßz;W4=¹û¾µ”6¾œÐ«¡Á/Ј«ÔNeQ!î€dÿ¼2èlÄøX_ݯ¦e•øN輨O¨[Ýбy`õ•³sî'|¾¢ŒÈfÍGÁçñ¡ÖPo£U«ÔQóX§UÞŸñ®ù8iÓˆVß³)»ï6‡4‡USI-èDÙ>MzÛjïÆyÚõ©í|9ðÕXžŠ£°w`k‚õÕÕ£“¦QR¡…'$OÑk;÷ÖÃI{µû<Õö'P4è4*>µö¨hCšROÊÚŒJêÅç±a³˜!AhQ©(.ÀМ ºÜáœØÅyã7x衇$B!$q"„"­VK«Èö• «$£ ­Öˆ¦´[™ ŸÇMzn% Ûs÷SÏjA§Ñà*(EY­ö4’'Êñ?˜‚‚°Æwàñúcðs IDAT~b1msoëþ䮞ĸ÷§ÑøõkOXÁAæÚ|’.ެùÃ^u’ KS–  ô¥(ñ@ ð”p TC`¨³±¦e~hÇI—–ÐSÖíd®}ßðÑ’`F¾øMü|äÌ[ËÒÔšêíàPV9–f5öÖ8­òމwÇ©3ТLݱOI,GEAB?îJÅiO``„þìß)ÏWÞËS0ÚЕdQôçqËc§¼Þ½G À‡ãà:~ù=÷ õÞ¸jwU½×ÍbfZ$ÝÛ‡£­ÜÉÌ7ßåçîÓ(OA§¨¸}ÇÿßTÛq¢'&%Ž’KÙgkI´Á@L›p²-æPD2±§8ÍgRŸÚΗ¦–òÌõ/¥k1_ü´‹—‹¢Ý¿ó{†½ªw‹!š¾W¦Õd0WG¬æóÙxNÑkŽÉQ5íÓTÇíOKÅv~ØË cü¸g¸wpóªW¸sb'ê—.aÎÊlîöü6Ÿíe>ù ;I“B!L!Tz=¨üýCy¨¨Tz=˜¢ÎþX¢ÒãD!NÁl67 ÅïL`«EG±~ªJzqËŠK Ј·XhbÕ‘gð§¨Â޽´œ&AAh/»“é4fÐR,4|)þo>à ›pËøGöÐULýäîþ¬m@"®»›¡1z~ý÷¼_†ÏGça÷ÐÄlÁy̶7ŽjÄÞàv >a÷Š9†úÎù¼|ÏòMõè~û}ôҡДÇ^Ãçßäþ/*0Ç·åŠo¥µU©u[çÆ\s{{r®½n·àõ»n®úYc"´q/n»g(-mí12w'=ÊýipI_ÚÇäÉÙßœ49ö÷ =O„BT‰Ÿô ™wŒ§(;ïoOž((˜£Ã‰›øÔÙ/[UUÅU!N!??Ÿ oOæ“·^å`™aµÆWXIjVz½–Võ¢qX4ÌÙº›ÇCߤXZwìMì½# ùjìåÐO¯òeð½<ÐÁŸó~Ç6Þ}hÚá©hµÒ /pÎÔ©Œû.‘1cº¢UñVìcØ:xOv<»í½  €§žzŠ%K–PRR"ÁgÌf³Ñ³gOÆGpp°D!Î#òªŽBÔA`` ­FßÌíãߢÀáekA1IQÅ…aÄF…ÖHVa M-Ä&·#|ÄÍØl¶¦Â¾b¶oÖ‘ÒÈÂgèKõð?qaSqäeQìöàUT{.!4Š2õöþØcñÝwßIÒDüe%%%Ì™3‡'žxB‚!„çéq"„uät:),,¤8ã#®ÌUíRÐhð) z£‰y;vb)+cÄÃi8t!áá  ÜÙàØÆ»M=ÜãDÞ2½Ð©Îý,þl"ßo-FcÔ£1FqÑ•71¤]8ú³¼¯† RQQ!AgÕje÷îÝ!„8HâD!NƒÇ㡤¤„üœCü2k&%iidfíGc ¤a‹æ 4ˆÐzõ±Ùlètò€/Äù.::Z‚ κììl ‚BœG$q"„gÀétb·Ûq:ø|>4 F£³Ù|z³è!þÕ$q"þ’8Bˆó‹|*„gÀh4J‚D!„Bˆ € +„B!„BQIœ!„B!„BÔ@'B!„ghò¦¹ ?z;eéú!ë¿Bè)æEÖ'ÞÁÜ-ßrsœð£éÐat ѳ†•.–²aÃ6îÌ&;;Í6°aÅg\¥­cíª+·:þ\æb’““ézçOä®{’Þm“Iî<œY½uÛIµåV§’´eÙDuJÂè"ÛÓÞTIBÏÆ˜]XKÙ×±yëôÚë\—ùìyyP:^ÔžþÏí¦÷Ó¹¿©±îÛ×p;«ù»Ï‘Bˆ š$N„B!þ˜±â3ž|á¦Ì˜ÏêÕ_qwSsÕ2ÿî¼þåó´³Óûµ)<’Ò‚;§,à‡7{\ko=qW¼È¬…‹X²l9?ÿß0š@cëÀC_-ã÷¥¿±ü×ÏÕ4ú¤rCO\Çt¸L/›7`o؆H½B`›‹ñ̘BVóî$À\¯AûV±ßpŠ:+At~àSæ¯ÞÁž3Žkµ<¬z—G¿0qãmðÐE3àù¯øeù¶¯É#ƒÐúz£˜·q6·&ê‹íWKÞaÌ‹_0oîÿqMÇQü¼ê5Ú™«b”8r>+_i‹ùTç¡.çÈrŠõ´¡ôxb:¿üü‹6g“ÁÖoGJûBIœ!„BˆSÑE4Bùá1n:€¦†qûÈVUI‚?©…,xì^¦îÙÁÇ·ôæòPXKÇ }ÒpÞ¼½ñƒ{Ñ£{?ž)Îsý ìò7y_âòÝé1øQ¾JË>©\Oç×q)×¹o9éÁí©çg¥i¯0¶/ZÈ2µ…™‰i›HÁÊ4*OQgÅKÈÆ§Ø1…!3c¸ãÄc=‰‹ý«Ó04nˆM ŠÁÒïî¥×vt2ë_»›¦FðäþÆ”÷¦°"ïøžƤ¾´^7–Áïæ›lÏŸ‡Sž£S¬gl2ŠúläA—Ó«ëP¾Þþ ÿX¿BHâD!„B¨*(ÇõQ@Uù3÷¡VîaÅö|¸ÉK+ÄÀ™˜¡%´ó`Ú6èϸisøvÎTžîdDjžñK–Ç=ǧ¯ÝMïX;eî“·.¯eµb¿çÇqQƒF\\?‹%Û÷°bS—´Œ¤A²s9Õ +jùVæ.ÉÂ¥ÚÙ·.CŽUÑhPT/ª ª}¿­Ï×ü•ß°ÕÖ‘æ6 jùvf~ò»*ŽÏ(ùJÿ`ꂃÔåEšÚÎC]ÏQMëùì…”ëB6iКC²˜1ȶBü§ÈhWB!„g(ÏáGd€ùSp0JqÎêzøTPþÚþE¡|ÍKÜx믔·d/÷ôZNËËnf̤E pw|ü¶žìoO^gfvUâÁúFLéK˜\^Iù¢½ÄöëA—Èl~ßç8½ŠÖéXM$v©Oå–Ý”ø¢Ž_¤1bÀ…Ó[Û¸'GT ¢*Z4Ê_¬[]ÏÑ1ë¹3æ0eï×<ñÉ4Š=elzöqªòÇ!„ÿ!§•8)))‘ˆ !„â‚¡žbÀÒŸÖñÒ-˜úÌR ýZ3ld}¶}² UE=î'ü|Ì?¯§…˜ªêª¶Uÿ<䮘Köc÷qcóU|°µcD<æÂ ì‘íhäÜÄæï'ð˜¹?\’„aNÎqåšâªYgƪ:žØÙ»,‹„‘CÈûi4yï–E?sÝK™RâCõ«¥ÎµëÑ9æ÷:ºÜÇ+W—0eÈf*ÕHЇÓ(ÆÌ¢^ê_y÷Ìe}±üšpÅ5õÙúõ챫Քžò\ʬƒi¬åmsôKİ£ºx×rj]VózÚ¨¾\oûœQC>!£ŽãÈÊ=µBüsl6Ûß›89“!„Bœ¯¥öîËŸ½9o¿Â’m!è½%ìøæIFÿ‹ª((ÇýㄟùçÙÏ_¤òõçËY´üun=L÷ñuøóŸgï$F>Ë„3\ëÁyh /|žõûððØ—‰Ð°*»xôz*=ÞcÊ}‹G¿‰å¾NXGQwœP)Þ¾šßÄžg2q+ ¬g•æ îÊxƒîSÔùɲšõè ø%óÄ÷+MÁj>u¥ºQ¼EE4;ƒ%­â°æÿÊø»§³ß« êɨ‡ú2kéö¦»–uÌþ(^λßÜÇÄe[½íg>™»ÒÄêâ]Ëy¨uYÍëy 6²!|6?®¸R¯Š»üë§ç[äžZ!þ+÷ªªJ_B!„BˆjDGGKD-4„þ”)-'0dÜFìh±u|ŸÞpÒ¹Ë 5n•-¡BˆóˆŒq"„B!ÄñQ²åRoÿ3¿)¦ÂZr™6ö Bü‡H!„BˆHñw'Bq~‘ÉÒ„B!j`±X$⬲Z­!„8ÏHâD!„¢=zô ˆ³ªgÏž!„8ÏÈ'B!„5xå•WÐjµ,X°»Ý.gÌl6Ó§O^|ñE †BœgdŒ!„B!„BˆÈ«:B!„B!„5ĉB!„B!D $q"„B!„BQIœ!„B!„BÔ@'B!„B!„5ĉB!„B!D $q"„ç… V=Ú“~/oÁ!ÁB!„✑ĉBœœûømS)Þ³P”*ÑB!„¢ÎUUåZ!j‘½b&?ï6Ðfà处èj]wý³½¸kgW:•ÿÄšÀ듲–·¦g“òäL¸2’²5ñÔ¸©¬>èB’Ì O¿Â½]CÐâ!wéû<÷ÆLÖdÛÑø'Ñýæ'xú–düó¿exÿñl?vGqw2ãë;©gðQºe:¯¼ò9Kvà MæÚGÇsß%è|9̺i¯]ÍK·Wðñ„ŸHw(\ôæb>èn=wôÙùbÒ>« ;œ®×X#ù¿‘ÍiëÈfÔ';Øà:ººÇ§¥ïÝx%º”'>ØIâ¸3ôä<EÎ~ÆÏÝË¢|úÀPFjΰhʱ».?ÄÃna÷Eùæb+ âà~Æý°Å¹.|fú÷lÁ­-k©çEù;B!„¸Pé$BQ»yë¢2¤„/dÐâš 6~9•îdn¸¹;á'|Šju Þôt|ñjRû‚/:¼Á­Çòê¼Í”ö9Ä{ONbµþJ^|¿¿=õ<ÓÆOâÒï¡…w=žþœÍÍF3á…Ö8—¿Í Ÿ¾É¬î“¸=¡Ͼ™ÎاQÔã)ÞÞ“9’X=øŠ–1þž , ̸ÉñÍyœg}ŒØ9Ÿ04&€ø8?Ø5‹çާݵc¸.Ê@p½sœP½yÍ\k'‰>!bˆæã‡¢üè.Ì䎯ʸ"B[{™îRÞŸµ—¢NíXšbâà†ÍÜ:{mF6¦¥þÏýºYµtÛ´LG²2¥|8{/EíSXÔΊ+#•›glg^R;®²ÔRO!„8 YYY¤§§ ( ÉÉÉøùùÕågö~øq ™z"Zöb@†økjúý±Ûú¨Ø¿™5ë6°e¿w!ÉøJÙ4}2‹óŽ®Öã6nl 'J!$q"„gG—€Ù<ú¬‰Ï^ŠÁÊÖâ47íd¿£áVåä "SHnÉm׌zyVH+Æ¡ëÌ­NçF¿£|Xš¼Èüiä:­Ù;ؑ٘‹‡~È’{̇ߧ4Ø 3PRŸf-ZI”m›Ãò hzÿôm#øjîKÌYzˆ«nÅìT}Û»¼>¢>uM™x½^öîÝ‹Ûí&66–€€Sß`;ò³yeî^~+tcטéÙ½O¶µâçóRìÑqª«N.ÌÄØ©Ì€«ê!"gûNnÚ”GZ¥†”î­ù_§ ¥¬ròP &’ZÖ£÷ï[ù9¿!-£ª¢V‘µ÷Êb¹·~&ÿÜ…OC³ö¹*Ù‹–˜pRLyì«PÁ\Çz !Ä)äçç³uëVV«•FÕ-qâÎfùO[ð»x8÷ÄW°ö›ïY°+š+Wÿû¦Ž¿ é Š ÜuL7>ÕE…/˜öÃn¤s¨VNŽBHâD!ξÈ8?\n+ !05¢WÄç¼ã¸-Jõ­uE‡Y¯AÑ( úP}%lúrïü´‚#÷´jÕ˜#–¶<ðôÕäýo¿°ˆ[Ê^{ýNR4T?2‰Ga!.`ÇKýiÿÒÑ%»sqŠ¢(@4w«sÒÄív3sæLJJJ0 Øív D\\\ÍyÊøxV…Úñsk?<9錘º…©ñióRìt²ã§5|S‰ÃÀÀžÍÓÜ|\œ9™|˜Æ ƒM¹µ÷Tò{Q¦Žn†-?áSvðm“ö\‹‚‚ztÌ– ­‹¥^ˆÒ€§ŒÏ-§ÿID¯Ì<²Å`¥ßEU¯)©^[7¦³RÆk!PëVO!„¨ªªh4¬V+‡ƒ°°0ìv;ëׯ§Q£FX­5¿*éÉßA†¾ƒêù£ÓZi•ÄÆ­Y”î¯ö÷•ñ* §ýŽßå7Ñ;Ö€%®9­½lßvL…ÜTzŒD˜¤'BHâD!ÎÅ qe&ë·:HƒQ9½m+׿ÍËßm'tødݕȆûzóÐê?—ˆéó“{?Héþm¬þáÆOžÈ„ƒ™rUä1‰“c(Ì!!€Äû&órÀ#ß4h@BB999Ìž=FC|||­‰WINk=¬ZC`(†Š¼©´4!Îw¾l}2ŽÏ6¤B»;xªÅ‰Ý£ëP„Û‰ð9 Ù»t)SS½@>Ûv¢CøF_ÿåW<Ëãâ°…cB‹Å¯jÀ_(6 ìÞ´”•›lQ­[Ñ|0]-ËXôí<65éOHÚ ÞqöO¾Í˜`cë–žžÎ¼yóŽüÜ AŒÆªíظq#³gÏ ))‰Aƒ·½×éÄ®Óc=rï®`6î7¢àŽAͬknȈðl¾Êt3<ĈP+‹˜™a`POóñ&ŽÓáH+:‚ *N>]#‡Ôã¹ïÿŸ½û¢ú8þݾ›¶é i„ !. 6ºØE@Á.öþS,X± ¾(JSD”b)R¤(½ ¡%ô¾›lß÷DDHB x>Ïã#¹³sçΙ»»3gïÙFïµJZÄGÒ'XÃaWEoeyè/´ <‡È£i"+ŸlÅуGyvÞ6%°.'¶ºQ6n'åvÞ:%JÀ34’ ££jãc-å‰ÿÓÓÞ_IYv>[ŽW0êíÚ):‡ '¹®:…/º:ùn·ƒnBWiˆnÑ”a9|zÔÆíÞN¶ž¡BјŒŒ âãã £¢¢‚#GŽÐ¡C:uêÄÞ½{Ù·o:uj`m*­ —ÍñûC‡§J‡VSùYÈ+ 4iÙ¼î&$§G±eu6 ‰!„øÛ'îžÏóíGÐ)$Q¢ Ô:. MäÙöÃùpÏ|Iœq«(2‘ô½y]Îð´—äg—³¹îß36 ¬ýG‡'ÊF}´”Q'½¾×š;~ÿãæ×˜ssC'¾ž$Žü€Fž¾È'é6&̹­ž•t$<º˜ÍžÛþÆÅÅQPPÀ¼yóp»ÝÒ¿ÿF×ÑøÑ]ŸÃÕthë³0‡ûgäÑcx#ôU|:?‹&ý;ðTK ¥‡Ž0­Ä‹#4u7¿u‘Ÿ[…30ŒÐSÃë²²fw%÷„ù¡/+bI…׫ÀQÅ{Ÿl'·[^ŽS²ë×L6ú…s¿QI _{Ö·ù­'Ûø…ÿyµeNw/ÔæÖ¯ÝÏv/o^LôÀUTÀ‚"±”öòÛ)„gõ}QQAll,ùùù,X°¥R‰B¡ÀÏϪªªF××Ñš ©r6G§rc-/ÆæÕ_k½å^çq&ïr8p+e¶¾Bü#‰“9t))§IŽçÑ_&I .1‹‹Å‚ÍfÃår81Òjµ †SÄ¥ayþ&¼XÉÜÕG¹üú˜KþF¡ …‚=zбcGžžžu7™mìÛÄ›»®‹å•ï6Óç''Nµ'}®HâÖ@%JBx¡_%Ï,YGú\?nè׆!~¿Õ馼ԇQsÊ—’—Ú“.º\Æ|¸›œjm»&ÓÏWxq[ß&<²pióFFðÜ pÎôa¥g0/ 2ñܸl¡ttí˜ÈÃQ*”Š3µSq2«ÓΆ¢½l-ΤÐR†^¥%Ú;”n!ÉD{‡þ'câããCAAíÛ·g̘1'ÊÅÅÅDD4>­FO3Ç÷lÈLàŠèjvl)'´C8^Þõ–ë­ÇX¿d;úÎ}I ¨ï´ÞIéÖEüâjK÷¶,Ùl\w ï¸nÒ…â\ÎÝn·ûBTÔvî¶ýL"*±¹¤ÙívÊË˱äÇ´kŽ¢"”. ¥^ƒ!" el<ê€ |}}Q«åKÁEÓXuLE‹+¯§G¤¹ŒBü—¹q3÷ðj¦ìû–Rký#(. Iä‘Äþs ”Ý»w³|ùr®¼òJâââ€ÚÇ»ÿôÓO8p€aÆáñîn¬Ç7±hѯ5iIîC¿î±x)ë/÷¬ÙÇ™kñ¼f}Bòø~ê|²Nš¥©Ž¼šWêØ½r ÛcQyÖº+}»µÄ(O&Bˆ³ö&N²*1÷ð*v”Äâ´æHж ŒîŠöB(‰“Þû÷ 2„    -[¶dذa’4Bˆ‹Ø?2¬cþÑ5LÞ÷-¯¦ÞEŸðÔ?,»½Å•<½ùcîY?‘/z>ƒ§Ú Gé?Æm:ÊA}"áZ+;wA›~z¨ú™GG/¢ó7™¬ê`á‡;ÒýÞ6?”_oùÎçê»ïùO°(//çÛÉ“8°j%UV+V‹[q>iñ­ð08˜—Ϫ{09D£vAuQ!6c0šƒ ”+„â¢öká^¾Í^G²sÞJ¿§ÑÑÁ—…$òFÚÝÜûË»Œß>“Y=žFñšèIdd¤t!„¸Düí#NÌŽÞÛó ·zZÒÀGãÁ›icQ(`FæÒ‹ „Šn»±ò IDATØÎ%¨ú×qtl7œ…?ÞO‡ØxN]Ê‹×ÞÊœÃÇÉuµ¤k¼ U0]·Â´¿«¥ ÞòÓ¸m_3•çÇã¶Ûï㕹{¨rV²ñ1<óc!κ—Õì™ÄýÏþø‡U- E‡rlåb KŠ©t(P©µ:r˜cyy¨” Žd@e©…š¢ÊJ îj"Œ:LkWcÊÉÅjµÊÁBqQ›žù#J…’gÚ ;«)ÕƒèuåGùµp¯P!ÄEëoq²&ƒ£O¿›÷Šã[)·™Ý›bz13k)câÔ_‘c/.ž_Ó0öåg“Wc%*f$o$&âO%›3¿â½ÙYãÀ?¨o^6­\…|·åÞÌÉÇ¢ ¢[Âݼ£cùÖSÊZDà®XÍ+›²²²ƒo7ž¹ìFzè˜Ë–ó†oXVå&ºI;<Ý ä7… ãã[ü4ËÄ ÛaÁ3/ þ‚k¿y4mº>ãyö…ïhýJGvÎ+犑íðò·ò`ŸÿV~z)!«¼÷LAHÙJ&Žÿˆ9m^çÆ^-™±`%}ú¬²‘³! ŸŽCNKœZºŒø&aÄ»P¸ÕTV[(¨TIt\;v¡ÕzìíCp€/¡a!¨\VòbÛ—AM³h¹×‰Bˆ‹–É^Ö’´ ˆ¥¹wXƒ¯û6{=_\ÎäËÂOçÍuÑÝYxt-«ówüçîu"„B'çípU­ŒQ¨•*.' ³×2¨iW~:¾•§·|£mn Ñ/†ãÕ%Ô8­T \p: Ù§¾•÷ú´ÂǺ•§—Må½ÐWy!ЉEÇ=o!YWÊìÕ/óú‘ÎÌjŒ­x‹Û0©ÿÿˆsf³¥ÆgÉÌÓÊ´ö¼¶î[ì­Ÿ`E”/Ù™oñàöÝ´k¯åÝuß×ì–ÅEc)XÀ½.éIµ¸mTûQrˆ$P¨üiß¿®ž¦çì\J£Ÿdmg_*{½å§Ñ4¡[¿ÎD{«Á»ýÚ,àÓmhô&®|.ÛKzs…ßq¶ì3ÐáÊ?N«±ÙlmÜLH ‘AØUZlv;vS9aàtÓ%1—ÁˆÖÓO/\5U”ä`W*píÍÄÖ«—X!„­s!—“$ÿæ'Ê.'‡My´ð©}Äî£kyiû ‚ô~Ø\µ÷÷Š÷mŠF©æpUžQ!„$NΖR¡Äé®Qf«brÆBål`WÙ!ks×5ë€ËíBeca”AtlޝзfH°‹ç` jJ—Ø.¸]&Ž–âÒ«È+)ÆJ0jm^¶LÖÚ”tXËO/3,g…æJ¦G… S@lTOBncOQ5?)ºðA\•Çðׂ™²aí¬›˜4|ýîOá—ûÖs]=処4–¨Pâá«ÃViÁíÑ‚Ë[WñÕöRº·ÞÎnu{Æÿñmát:É:”…W ôj þþAØœvrM¥T›+ð6WâT€VãFç´ã2WRS^†Õ\¢Ê„sÅœcrp…B\´Lö¼Nº÷Üë»fóíÑu¼‘6†bk/oŸIÞ»á,¿êí?$MÊm&fú‰þM;Ÿ}Ån Ù•f¼½½q–Íç™Ã~<Ñë)ÞLÀà@oT'^¨¦I“þ¼Ñçmæ$øzÃlqœZö%j?|}¯åÿ®zï¯~ï¯~›ÕW¤“‡*[!å2;ç/b¥0WIÓ@ ö’\ˆ@ƒ† ¶­©Y<Ÿ à6‘±øG ÃÓHN«¯¼þ{œìܘI™ÍBá¶y|u0„niÁ¨]twÚš—³`•…6Â85U§R©hÙd%·¢„£EÙ”Zí”UVa6™pTTPTG^i%yj=r3)®)§Ì\µ´e?T*•Z!„­¦^!xi l(Ì8QçÅgÝžÀ¨õ"Ì#Ϻ=þ‡¤ À†¢ \n7‰~Í$ˆB!.Zûˆ½J˳m‡ñð†Iè”noÑ¥â÷üM޹Ç7þ¡nnÞ»ñÊ\ŬÍɤ_«¬ùóù $„ëS‚QTWRí6nÌUÛ˜‡ÍÀMEÑ2Ø’¹><?Ï<ȧ´h)Ó]'— èEÛÿñÖáÆ7‹DoËa-ˆD¿N$YgñQN^Žôäàáel´ºi*}é°—’m %Ù,yh¢üÑÆž™=jcÚ…qkCÂM¼;s$ÉÑ7Ô[~*…!œæÖ%¼zï6Šõ1t»ã~ú6©ëþÚ(º¶³ñ̺¶ ?}„“V«%¬k'v|‘E…ËÍ®¼<–[°ÔXP) !4”µ‡²ðõñG D´ò!§ C¥õÐörcØKÅbÁb±`³Ùp8¨Õj´Z-ƒAŽ·â’£QªéÚ–ïs~áçüt M ™wft{­RM€Þø‡uܸ™–ù# ô k/ABqÑR¸Ýn÷…¨¨íÜlúÙY¿~ٱͼ¸m:Az_. iV©áXu1«ówÐÖ?– î¨õj¸Ç^]ô15¡=¶‡BM ’GóHdG³~}—÷ò*ðöïÂ]‘L+ºšo:·ÆU¶Š·¶}ÇÒò*œê®i;†{½÷ðÞÊÆòdT öŠŸ™°ék~(«F¥oÊÕIcxª©?¥Çæðèæeì´y“Ô¼-‹6àÛñî5ª/HlÄßÍIþ÷ÏñFÑ^‹ö”¥V«•ìM[x»ÏU(¢ƒ©Öëp¹œ•š8RU…V‡·RMRh:oN¥’½«©†ø*í¦¼O`»6r1}‰°Ûí”——cÉ?NõÞ]8KŠq™ÍèŒ>x†G ŒC„¯¯/jµZ&„¸dd› ¹nÅsµ^Ììþ¡ÿF_?uÿLÊX@ŸðT&t-B!‰“óI”Y«ø.g=;JbqÚó¤G“¶tI<óÊŽ½<ºè â{þ‘Þÿîi’8ù7sã(ÙÄÇãçôðx®‹¬ÿB·¸¸˜ïMgÖ{o°Wãàªömh¡3‘•O•ÍJ˜Ÿ‘ø!l..å—CÇh¡ÓУi8q)=p êK€Õj¥´¨Ûæõ›‡ÃáÆé²£Öiñ Eå°PQr e³æ¨R:ã$ 3!Ä%eΡLØ9›ƒ¯uMòIOÙ9ñYé´39c!3²–ÐÄ#€YÝŸ>q!„âbôþê§ófXl_ˆý3—½n9Šâ<98þÝs<õµ™¤âÚˆ†ß¾¾¾$޽…ÑѱŒ{ñq~É>FR§Tš*TdäclˆÞߟüãETU™HŠˆÁ?1™ ÑÃ1êK¡·8”±ê£Éعƒè°pÒ0úøãr:8”›Íá¼ãX,Tû³i‘™7 '($äâybÙÃûãfýÌxú5Qÿ{·oÙÃ{}JȯqCS5¦=³yýÝÅV¥ðÀë’ê­ø—ÖFÖŒ ¬íøÃ[JríŸêÛ¿÷Äã,Ýs9N·›‰{æ2òç t N cp!?¬N;û+røéø jÊháÁ[écÿSI·µ€½Ûb H 9Ö5`/Ù϶5„&%åùïxº€Û¼Ÿ…3ÖàÙÿvú„KÿBˆuâDˆºû‡õ{…iýÎâ•j5¾~~4½2o.[Æm7`õá\Rš„Ñ"B‡‡'Û ÊÙ¬ˆËÃCˆï7€–×ßB@p°L׸D”——óÝäId®^E‘ÉÄñìl•ÅÄG5¥ÚncÕöÝìË+ 4 ­ž²c¹¸Ah &00ðœ¶5÷áÛø1ò!Þ}0¯ºë}ÛÁ™<òÂ*š?>‰õr@N¥Ð`ÐéðÔ)Á]Åî+±õŸÀ§W‡ VžOÒÄÂÞIOð]§Wx<Åã·מÇÖ£A´ªû“Ûú‹Ûù·pR±÷'.ZŠ=Á<0éqÚyö~ýòc¾Xu€2—/ WÝÉ=×µÁ‡*ö.øˆO—î£ÄåOҀь¾:…ó…|0i!{ÊõD÷Á·¥@1ËžˆGßbÔmïðb÷“úŒ8'77ïEzp<“3²&'¿îùÃòƒ%å†f=ѪþKånªö­f‡¥)^ëÖu-ÑZ+9ë¶P`$gWá9Ó8isÎv6nÙÆ®#ýîL3€ sÎÎzÊÏó#SFrçNèüÿÌ9ŠœE3Øw+ƒc$,„ÄÉYÑ©4Xösx|ðŸmyoôÿ¯°Õiûûb"þR:Ž à *tL7Ÿ¯gLãÈÁLŽÃî.ÂêáÉÍ7ÝÀåýúáß,£Ñ(I“K„Åb¡èÐAŽ,ÿžã•V\zoÔ »÷î¥ED%E…TäàÔQRmÅËi!*¢)æõ?cJIÃÛÛûܦì¨4¨®f¿¹í½€œ_vP£ÖòÏ›ø§Glœaû*ü½¼ñ÷P‚Û†©F‰„/åùNåtR]iå¯z€š£h'™ÆT®ÖÿÙmýµíüû.7õ„ÆDá•a9QbÚ»ˆUŽËyòç ªÚÀG/ü_¶y“[³øè—Pîzãa™Ì{ý#f5}‘;cs˜óá |ny“OËùá•·ùä×<š^C…#œ¯œ2Óaù½ÏˆsÖÜ;Œ7ÓÆ`²×°«ì…5eèU:¢½CiiŒ@â?“u³&±©ØIÄ•ð;ø >œX·$˜n­}Èýnf¦rßm]ÎP“¿Ð ¹¶³,?*oš%µþ“•¸°ÖØeì·B'碥1’M…ti’$Q=Ɇ â|å™;—ÌF­& ///F>øV«—«ö’E©T¢Óéä©*—hâäð²å´‰ˆ¤Ó N%EU&ln;M[´•–#¹$xùâg$,¢ :È?’5c/5͢ϭOhBIÊçç )¼QØrX¿Ï—”0+¶º‹JKÎJ¦M™Ï–ã5è¢z0ò›HÑïãý'¾¥UÿÖ.ØŠæÚçxêŠÊ7~·_näxY&GíG»G?äá$}ýõøž’lpÛ8¾f*ϯZË!³‘økïæ¾!­ñ¶í9}{½ôXú%_-þ•¬2>q¸ÿÁÁ´òTÔN»y|1bص|3G ìDö˜‡ûÇ W¸±[ˬ©óø%«Wp Cï»›¾!µ9sÆ7¼öêì)ó$îºG×?ýÉ×e*#q:ࣷ±ÿ³ñL?Z oæÎvðÞÃI(êÛOo3õ¶ÕÌÖwãݽ&ȸ—;¼ótG=¿”žo>OW£WÙ*^xl=ß}Še=q¸"{ƒ±uR¾w7ºöÝðT˜NßÖ„‡H,«g]¯Ö~:‘Ï7äcÕÑnÐí¤îù€OY7Õë¤ÀXNoÛ“²xåáFö¥¡cdmüø}Ÿ >åw¾ ÝèbgÍ’Í'e^É#x"¹îO][z¶šÅ죥”ZsÐ$ÞAKoJZqå€&<»<“ Ývé{ðHJZµ?—_ÆÒÕû0¥Ri7ÐìÔ)'úŒB>äþ/NÁ­%@^±€¢1U¼¤”½[mTî’ü3ÖãÙšd_'{·eTªl ü$¶~˜±žàÁÝ‘EA•†˜W“dÙÄêÙ”:ƒIПÁšÚ×N[EðЛéàyœfüBHZÙ;RXî 0mýÓBÐÖìcÎgÛisû $x*p›vóåŒ}¤Ýq-Š%Óù>ǹó!’+‡õ§©i7+–þÊÁRš Dz]Û•}?}Çêå8T>4ëxW´ âÄÏŠ®jr·¯eÝÖ䙜xD¤qM¿Ž„뀋ªÌÕ,^“E©ÙŒÅYû™ÑlàhDk±ïbå²_9PhEÔœ½.'9D‡¼«…ÿÚÄÉØÄA<»q*O§ÜFç&Ih•ÿí_Úm.kóvðÊÖY¼œv§ô´KŒN§“äÈéýl³Q´i áþ„…cCI´Å‚ÊfF‹‚ˆ€®éÜ­_^ž^h\Ê ²q(8öfbë}Ž¿º”„¤Ç°eM¦Ô4t9ëÙïŸÎeU ÉÜ5û™ýöBœCžfRg? ¿Î;Ÿï¦ÕH5TïåÛxæÍ„j¸«61mú>}‹gÂKXúÚ›¸êF'p×ì«¿ž±Éxž|Öé(!«¼÷LAHÙJ&Žÿˆ9mÞ`T4§mg6u<7oÇS®§oS-Ørùyá:Ìí3j¨Ó¾¥Ìûv%¾·]I´ÌhBü['By9ýN&ïYÀ£¿~ˆÃåüOV£T“èߌWÒï"-8^zš1§ÓÉÁƒ™ãðÔhñ÷¢²¢„‚c¥ØLe8í6”ZZ·¥¥š³ «É æj\«¶â¼ç\?]¨"»·äöT%´þA]»¡ÿ¡v©%k[<¯â¹N¡hÑùrVlá¸-TtÔùγüÚ Ó¡Ð“¯eåa3ÊTÿ†ë±'ÓâäçrkšÐ­_g¢½ÕàÝ~mðé¶|ìÑœ¶=T~$÷éŠÛQEþáBÜ>*J2‹°ÿ–8Ñ„ÑíŠ$Ô ‰'B¹|“ Kñ~uwãÑ«ãðÓ±í0Xm8WÞÔ›–F5Ä¥ÓLõ%ù&xÝ4œ÷Ó™Üx[ÏéŠéqh,¶±Ö,¶ZÛpƒŸòœÚ[pE óvì/&2)šÖÞ€ÓrÎm;óXýÇßFŽ_ÑÙ÷ÉsçÆœ±E¦Œ÷Â[=œÛ÷Nfò¸{pø'гK,¾‡íXk¨ô~‹ªRc@å0c×6£ÿcÑ&&î>Ì¢w&ðîW1¼>¼’þ’Ò#œ„¶maŸ‹êض„¹s°åøÓ¶¹›,GQÉž¸ÿÅgöþÄ'Eâ©Tà ‰À¨SˆF~þp¤‹‹Óû¾ÚŸ„¶Ñx«ß‡(¯÷…älò¶“¥oÏ ­|Q+ 0> ï]‡(W{£³çð±J£ƒ‰4œ8/š%'€³†²ÂrÜJ*ó*q`De.¤\Fš¿…ÚHd„†]…±^Øò¶“©hÍàÄ`ôjÐÇw¦íÖ9l˵+™!Ä¿4qœ@zp‚DUqÉ©®±‘yðþ*´åeTšË ð A©Ð Ó«q»UdìÜ„§ÖƒFGµ­{¹ ]ÅyÞcCE—„2îÜOÈÁPº ô¢ü‡Ú¤Š¥¬„Ê£¼úزڋD·jEN¥/Ý飯€xbÜ3Ù|´š˜¨"¶í¬!|°*ÜT5TO£Ö•xøê°UZjï«qÊöp™Ø÷ÝÇÌX_EhBÁ(p9\õÏW(Q+ݸÜ.jJK°û&ã¦[B)ÔhUn\î³Uïn8^Nûže[ÏxÅtrÙ¦jo¦²Õ5ªÎ­½Ê¨!<>ú{fõ÷ÌhÁÕ#î ÿòòNò—¼ÊK_ņ†°kžäÙ+ë9FçâÄ1r7züξOÖÓÆ‘žŒ¸Ê71mÊnîx‰z€@Ò‡=Kú°Úåæ-¯³LWýÄý^\¶jjO´*o¢ÒSêJcé=0‘E³vSìhA¸Ü†J\@®šãdìT£È?ŽÕ²ƒ"wy¥yì4Cáñj*5:òjþÆ;)UüáÞØJJÎæ3N‰JÉ9|ÎÖ~vÙMUTnä›éÛkG ºXMQvbPßͬY÷SV6!¥WÒ¢¨(;m±íð7üß*F¿ü q.ò¿ßÌêÌ3^£ó5¢®È¥Ì¾ô~ÚŠ÷Óvp:7ÔÖSò … NìwíBWcŠFbkaßæbšuýý Xq¶ëmr_òÕn˜ÊK΢՛7œÜS íû “úþ±OœÖºsÚ—?ãÓûd=ml¬»Õd1ÿíiôÇSIÞõÜ· †#›rðhu=¡GÑ—¦Ä‘‚‡ÚMu~ÿ+ê¦îü~qç´Ûq«´¨ä&âBç) aÄ'%ÖAul2aî¬9þ$5w“e+#ª'Î}…×N)”(Ü.¿å{Üîß?/uÿ¹kÿÐxyajÉ›R0ž: ®Y:×4kOÅþå|µx5á#®"²nd££à–ìö¦ï-ý ×¹(Û|=ÇëÖÓ…­`ÕÊoÈF…±y_.¯›‡£ñòBU]‚Ù žjÀi¦´Z‰§·Œ%BüŸñ!„8C C«%¼Ëe˜«ì”:,?šÍç{ö3þ§Ÿxcñüï»oynÉîÜͪ#9˜\. ÊÍ”U¢éœzÞ÷ÃÑFt"Ya"²k _Mµ œU9dæYê¿ø5ïå‡]ÜüÄKŒé9îØoå9Öã(açÆLÊl ·Í㫃!tK ®7óî²T`q¸°ämaéº|ìg±¯†æ½ik[Éç‹÷Sa³Qv`ëŽÖ\§54´ŸŽÆÚªÐcô‚â¬,aº6í.ÂbÊfÍW?pÔ®8çmºmÇÙz¬ )á'Í…:e[šz×­¦jßü°9+|‚ÐãÂuj;Ï&`ÚsÛ—?ã?uülÇXöîÛ¬ÉÛŸ¸°»j?,ÚA¡ÅBѶyÌÜ@Ÿž‘xEv¡­m 6b5e±|Q>Í{ÄR¹äÞÿ~/¥v7޲Ý|ûÕ~üÓÛ60âGˆóW;âd'û²“¹{;v$ïðvîÜË‘ãÙ½kÿß;âäBP{á¯-'+»»¥ˆ½ë6Sä¨{3*´xêÝTæ—cw:P…&cÙÂÏ{аºÁUSL^™•šÜmlÉ*ÇŽƒÑÍ)£^\6367¸qa+;ÈöŒ2NLpµä°ùh]ßÌÍ7ßÀ5é‘ê6¯ M&Öµ‡µ» ±8¬g¬c›%š¶’8Bü‡!„8ÃE½Á@äµWPþÞ;ìöTS®·›#åU¬)¯ÄG­%ÊÓ“8/5EZoÊÌ5ÔTšˆóóCuewôúó2¬iÊЗ&à2x€û÷{Y(<â¹uÜf~üc§™QùDÓéÆ{h–Z_ã›ÑÁo2oŽ©›× Ôت#~6> ÔÓDÿ‡/…!œæÖ%¼zï6Šõ1t»ã~ú6Q×ÞäºØôz› £WáѼ»µÂkß™wUá™È°qC™þÙ<ôµ Cd*ýF¶½ ǯ¡x ïÐH[ž$ ì÷ÛÏqçò8n?ŽkÅóêÔG¸svs®>”Ž™«Îy›‘ŽíòOe þ;ʶ¯gݱ\®!oÎ+Üûa.}$—Ýz/qO¬X÷ zŸiø6æœöåÏĸÞ>y*Ë.Þ{ðu6™kÿ|{ômhîæ‰¤˜¹§ x—ûÖÔ½ÖØ›çžOÁ¼c*Í.C@ß» O¨ hÎucz3iÒcŒúHO³^£x0-ceo"gÌâéQ9˜Ô´ì~^.'@â‚»P#N¾Ÿ<‘,kí¿Nžˆ:òjîè§ã§©óO/ÒÃä]æš IDAT_z¥BûôH¾Y>I?‡ÒîòËhyü·‘l:"Ó“1,œÍ¤ô¼e=tbÕÒyüßO”žÁ´êrýU”®ûš)?ÖàÖ×ýNÎk›¤“ø-ó'ïFš@zëpôÇ~[L¬×,ühâ‰dOxz]Ý…¦‘tЙUËòÉÏV´ÍIë9Ñò¤,!Ä_@áv»åñëBqÅÅÅl{÷S>ž8„Ñá o³’;ö!â¾Ñücí¶fÎ䥅Ñ<ôPWTnœæÃ|÷Ò+ìøOwô–G6þ­œ,žÀþ÷ñ`ºÄ^ˆKÍÂ9›è:¤ìßFul{ÂܹlÎñ£}Œ›ƒ[ʉJñdÇ×kI¿q€ë,ÙóV1wC0ýú'à­—µ€Ms¾&;}$C[$@Bˆ¿üà"„gÁ××—¤{†qG`zù1v—”Ñ'&šbØ\.ŒM‚(1›È-­ cT0íR 5 £Ñø¶Ú¥(—r{DÝ _¸k ɳв‰^.Üÿn®röîT“r—§Ä^ˆKP3ïƒü0»nØÚÖ߇Úíÿµöÿöƒ& -骳þ³W”`vàªû™×m­ ÌîM˜¿FÂ#„ø[Ɉ!„8KV«•ÒÒRÊ0ê¦ IMÁG©Ä¥P Ñéù>cžUUŒºs8-®¿•€à`´Zí?{ÚiÍaå´Oøvw9J¥® ÝÆàÔ`ä´S!Ä¿š½˜]+–±1ÛŒB£F©ñ#6½còë¯âo%‰!„8‡ƒŠŠ Šó Xúõ\*²²ÈÎÍAiô¥Ebk®0€À˜æFÔj9­B!„âb'‰!„8V«•šš¬V+.— ¥R‰N§Ã`0œ÷St„B!„ÿ>’8B!„B!„h€RB „B!„BQ?Iœ!„B!„B4@'B!„B!„ ĉB!„B!D$q"„B!„BÑIœ!„B!„B4@'B!„B!„ ĉB!„B!D$q"„B!„BÑIœ!„B!„B4@'B!„B!„ PŸË‹+**$bB!„B!„¸(Æs^Gáv»Ý:!„B!„BˆÓÉT!„B!„BˆHâD!„B!„¢’8B!„B!„h€$N„B!„B! ‰!„B!„BˆHâD!„B!„¢’8B!„B!„h€$N„B!„B! ‰!„B!„BˆHâD!„B!„¢’8B!„B!„h€$N„B!„B! ‰!„B!„BˆHâD!.8'…«ÞâΫ/#55•ÔÔŽ\÷άªN3¿>~9W½º Ëß¼7îÊõ<Óû2†ÏÉÅñ—µåŸÛ¿Wé2êšJêO9b?QJÕ®!„Bˆ N-!BˆÆ_?—hiÛïRÎâcÓqŒÅ“f³­"…1¯"É ”þ‘hþL#¬‡ùyG%Îî~Ü€â¬_mãà—o³T;ˆOúEÔ~i\À¶üóû÷×:c[Üv*¬gƋϳ¦æ”eÕ;yÜ{¬4%ÐdÖU3X7ÇŒòd<þ¸ÌYUŒ®mO†<ù O޽—Çïn‡‚yŸ‰ï~Äì™T¹+ÿÇ"æœí¬\ðï½?Ã' st[óØòý >œ8‘w§ÌaåJ µBHâD!.œÎ>óxüùu4í‰ÖžÇîòXZ;÷‘c9ý¢Ë£í£Lûd<ýƒÿkxñãiL›6ƒñW¡([Ãø{ßaieWžýt*Ïu:Æ?Á¼c¨ÞÁOOeƒó^þðyú¸·1küT2¬ ôïÁóoßJ$àÕã¦L›ÆŒ7q¦!,J¢"= ðk^xk aCâ‰ÇchŒWcm9¡šÝŸ½Ï†à[¹ÿò ”4Þ–Fë¬ÞÊ;ÏÎ`gØHÞùd ¯ ñ`ãgoóõaÛ_²RëPf/Æã¶ ¼<8”’_?⃠U¸Yællÿγ-šð~¼ðÑ–Îz€ö>\¦ é͸×ßàÉ~¨kö1wê6ÜÄÒ9Ö·£;àák@‰cx0Z,ä*ûKß ‡·Û}Ö€¥‡²¸ëýUt{{Ý&mç³cjg9)w¨ð«/ ~á!¤é­d™k·[StŒç>]KéùÁ&fZqþÉ:ÁMþÞ}Üöþj:MXÃ=¿Tb>SB4býúõLœ8ñÄÇ?»íÇY»x݇sïÝi–¿’eû͸*?ýS¿Ð 'ÁA¨p†Ð¢u"-ê.ºªÖÎg­â¸‹¾IÁ2Š/¿{…ù« r}sF|4›[<‰nâÂ3îe–¬Ï¢Ð øø†04'!1}Ýö¿oŠ O š°‘ï󿍿üvý×h[nG8r¿å­ùV®xëFšÿ¶¢ºá¶Tíi¤ÎN.°Ï #»ݯÿˆU÷ê²÷ÚëpUleÖ”ɵxÓX5Ó6ºÖŠFÂRwØ|ºÜÍðËÛ£ îF༯8~¸ gDÃË*ÕÅ,°Á¶4¶JŸ¤¥¶ý §ÌÌ7šÉû$ŒyšjÐ(ÚÁ:öÎ]ÈöäË82w+6Àn±ÿ%ï‹ÅÂÒ¥K9|ø0Z­–Ž;Ò®]»3dYLL_œ‹ºG'V¶Ñýë&n]’Ï•Ã#hâvRnµ’±x#sò«±è}èwykjm@«ö oúïÃoª Ø`÷âa£ULý:“ì”T¾K÷Äv4“aó2h}W2}4çY'€£šue±Ì¼'cñ†OÏ`A\·x6R§|4ŠFÄÅÅ‘——GNNIIIøûûc6›ñðð@¡hx:£8ƒ£šDÄx£Vy‘”âÇöݹTùæÔ[^åfù¬ux\s}"´xF¶&Ù×ÉÞmY¿þTe±µ(ŠW4ÇW 袈•C$„’8Bˆ¿Š»:›­»-4Žîœn%áÂRZŠ ÈxåjÒ^ù}‰ÏBl.;¾x‰÷ï¥äÄ÷I¿&ºÏ«½µ'èatïyÒ…ÞÚB8W¿~8…­FóršÏ)÷épŸûþy¶çÁg¯£èõ¯™ò⠦ƔQ¼ñæ]¤ø(Ý?·y?‹çÌ#³.ÉÒµÇu‰“†öïìø4ñ­ýÔêÑ.§ëD+N_æ8CÌmKcûÐxÛÏôûFòÁN5)c?æÍáqµ¿$Gä¡! ¹ÿ›ÉÜ5x2Q‘h1aðõøKúýO?ýDUUƒ¦²²’+V`4‰‰‰iä Ûîî†C©D4‰ðÁ{K5e.h¢PÓ*6æqÍÞROEV&£çï (4‘¿†uT0~^=Òèâö’bVTûò@²ÀÉ>›X\à¤OäùÕ‰ Pjé˜@° æ*ãÖ9¹Åëìêâdû÷ïgÙ²e¸\.<==Ù¹s'GÅd21`À¢¢¢\×VQ‚Õ+/€­o Zs¥õ—WM`h(CÃýÑQžM¥>ˆ¢µsYšY‚Û·%]®êN+•,!„ø'' ÷2eï·ì+ÏÆl¯ùOÖSc Î7ŠÑ H Ž—ž&ÄÅÎuœ¿Ä´m™z'Ï$zžã H•ÐÑ÷Ê«=|O¬¯ò Á¹åi^]¸—À៲bL4Ûîïø õ%+NI0(T(K…N*óë›·®Ç÷'Õ·EØ~É;Ëõ ú¤§}SÔ×–3Õ©%üŠÇø´ÏÃTæìaÓÿé'¼³l Ó‡„6¼€*ì&fo¾©‘Øžºg—s;~ú3ĬÁ¶œÕ>Ô×ç*Ù4ñ!>Ø©"mÜ4Þ¾±9úß6ªô!uì$¾¸¦‹¾ Á9/3øñ*âZ/X—_¾|9™™µ©›ÍƵ×^Kdd$‡fÑ¢E¨T*”J%}ûö%::ú”œdí<À[›Ë(p*P:,¸Ãki|¸s@ë¯4ÄF3*ø8_fÛ C ØÊòxnÖJÚ·cbŠ `µÚ0YŠybÒêºä”‡ ZW;qgµñTò[pjü´nÌVW£uŽ ÐÉç¢8M^^‹/&99™Î;“ÑhdÅŠ˜ÍfBCCYÛÓæB¥Uø|Q¨´¨œVlöú˺:ˆh´MNK5Õû)ï0a=tþ2‡…Ë2i5$N˜Bü݉“_ vóܦ©¼ØáÚ´À þoŸPÔ8¬l+ÎäéSßáNÒC¤· qQ+%×Õ•¡OÝKz ?4çñàÖé⹆ ¾gGÜÕd}Åû_å‘öô»Üa·â\–R­^ÍÌL'PÌžýtI AëˆQ v¬æ— ŒM’“ hF°çǹ,Onņ¹‡8›gÊ4Ö–‡|+Xþî,Š:>ňÄÓG0(jK#uÞkšË7¾‡©ÿób ^Ï}Áˆu£x`[wÖûÄY·-99™¦M›°fÍ hÞ¼9‡ƒ’’Z¶lI³fÍê½´góäò* KçÖÖܽ \P—²šÙœë¤UŒƺÃâtƒZ]û‡³ª€feaë’ÊíôlÈáÿíc{xf †ÔTžY–Éö2'/_nêÛ”ë¡à0#þ{˜c vìPÓ~XGÞo¬ÁœwœW:̺R'.¥–¶ây>ÉO…‹œ±Íèr&O?€W‚{ö”Q© e—^kï‰;5oS~íT±9í*Ï¢ÔjD«Tbð#ÔÍÿš-3fШQ#Ú¶mKzz:ÑÑѨÕjfÍšuFo”ê 4›•³–PÙq$}£*ÙòÝOäµÅe¬ªnzT —¦ ïÔÖþUQWùNæÌN£Ã¸aDëG!|ûÇ› gp‚;Ù«ç±ÌÚ“»úÕ“,„uà¤å‚±¤ŒøRJTÊæš`6›1›ÍX­VœÎªGØJ¥­V‹Á`8ÿ E º/~KÅU“O_'+¿Í×÷Á_¾bÕq ¯I÷HÒI_q­Ë®,ä³KX~|Fû™ãÚÅz…3*¦7ƒêuD©¸¶Ñ]¹r%©©©Œ=7·?_uàvúg³ä‹I;­œ:òzîÞMÑ~ûe Š\xD´¢Ïõí‰ÔËÕL!êêoœ(Í`GÑ!Ì an´ l‚§Æí_UÈ8ù÷°Ùl”””`ÉÍ¢bg ¶ü<”N'J• ^‹>"eLjÿ@|||P«ÕÜV®6Òv…BœnEÖ6žÛ6³ÃJ= ÚÆdðÅê´s $Mùû0;¬´öoÄ´vãñÑz\3eSYYÉܹsq:´iÓ233III¡Aƒ 0@BüýmŸ#>ZžÃK)_³³èÑ¡hUrLE˜íVÆ5êÏØFýÿO)ì{yü—™Ôïö ¼åëÎW«˜DÔ3¯0(ôâëÈb±P”ŸOùkPfecPêÐ(uà²á怇ÁKn.EûR04ŒÇÖº~ÝûD!„¸Ú¬ÌNfÒ–ÿâ¡6ðLËÛ附â¬~xæR¦íšÇ²ã[¿þmft}ƒêÚ¸º¹¹qÓM7±zõjÖ­[‡Ãá@¯×Ó¶m[’’’¤ !Ä?Ôßr§ŸVvœ±k¦Ò6°1?õyíÔ»°N—“YÛ˜’2›#Ù¼ÜæÎs.Æâ`ÚÄc7þÛx ÷ÿãÍ„9|ÒMOö’'¹ùÁÙì)±ãÓñ1f}3‘ÐYID?´ãÌõîÄ•ÿùeM’Ýn§0?}HêŽ4Z›6#&2•FCAakŽn#¿´ƒZ{Ó‰ßFÝI`pð÷<B!®6æRžÝöž7¾ì2‰(Ïê?­ ÷æõ¶÷bðcfÚRÞÛý“F]3åäîîÎõ×_/ F!þEþò»9§Ëų۾ m`c¦%ÝRñg`D©PÒ7¼-îŒ[û]CèÞö*/BJiG—•«â‡ôÍ×Zع šÒCù¿÷:}ŸÊª¶f~¾³÷¾?„­Ï¥àzðdã*àç±]y§Ýäëêb•””°dúGl_¶”« …ó([“Fxyzr0=“ ûR)r8 õñÅS©@UV„Ú?Ía\ÜŽµ‰|q]¾üõÖÙjZHG£¨xf¯a›åB?r)ë !„¸–Ì8ø •v So¯1hrº‡šgsÁ>~8¶–Ûö#Ü-@ Q!Ä?Ò_8I.LåPytxøŒ  @ž¹£ÍD¼O#£»óí¡ßjœØ÷òø¯sð­Æþœt²Mê5Ǜ͚áG[SçóþÁÍì4Ùñ Ä´ŽCi­U€3Ÿ¶}È´Œ̪@ºÆßÇK t¬Ø~Ö´†¸JW3eË"V–™0øt噎7Ó]¯ÀX¼‚6}ÏòrQ¡­pw)ˆ”¶tYTþ1‘7NgK±/;b•ÉC¿a4s’élĨ&^(T^tÖ˜Šy¹X‰?õ…“Êä7™´ûfæ|SM4ÆJÖÚ/x~Õ:½i2ð>ɾ·Ÿdqóyñº T€iÏG<97†÷_¾îÔªf³™‚C‡(Ù° µÃJ¨—.«…¬ìlŠëEÕ –ÌõÐ;섹{ã¡Víc aˆkWS™Ø‹§ç•{eGáEÛ˜îx­»ðàÇ¥¬+„âšáp9ù_æfÂÝj}¨•iÌç÷ìíÜÛ¥BÁ؆ýyrËYš¹™q¤†B œÔÉŽ¢4â¼ë ÷Àh7á®6o.áÞuÓHð‹å…ÖcèÒ‚oý†ÃåDUÓX'Ž<ö«Gó~ŸÆxY¶óôò/x?ä5^p`VÆñpQ$芘³úUÞ8Ú‰Ù‚°üÀ»Íùhð‹Ä9ÒÙfòÃQ8ëœiZÛA^_¿[ÓIü^χôÔ·øOÊnZµÑòÞúïÉŽ~˜åqQ˜s2!Wn8/·öoñÛì nJ~Œ…ã¼<ì[~ÿIÚ\t}^áÙ~¢é”öìü¡„¾ãZá~*0RÀ²Wæ>q#ñÕÅ'ì…¤•4æ©c .^É»¯|¼æops¯FÌ\˜LaŸ~©¬dlJëýð3V5›Í^ºŒF¡a´Žj€ÅlÇh±QäO“èF„ÖoH›¸xŒV>nnùûããïCei>éEYX÷îÃT¿þ¥NTa mywâ¦V‘{ôSÜ•ABâÃÜï޳ó‹tɛτ­{p‹¼™—ââðS©0/åé­«8¦jÄ=íÇr½Á…Ë•Ã÷›fs´Ñ™ëŽÞºC¡Bˆs«È¡ÄZAßðÄs|tܘÏÝ릑o.¡cP3b½ÂéÒ v’BB!“ºª´[N}5'ÇTĈߞ牷ðåÁ_ s `ò‰w`½4î8]NLv CõSÒ-2 oÊð 'Ïgåb ¬OçØÎ¸œ+ÎéW‘]X€… ÔZ<¬©¬-( 6¤>ít`)9wš1w¿k®ãëzÁè[¯!‡’Ù“_ÉoŠÎ|ׄ@”@#Ül^N–‚\´õüÑØŽ‘A$@åG›Á]q¾ð4=ædR5™u|N½|ã*XÉ·4bܧÁÕ¿:¥ ¥ë NDyªÁ³+ƒš/dFr.Ú!½‰+Y@Jaoúúf±m¿¶×Ù•Øjµ’µi3!D…Ç õòÃâ°Qtüîj°–•ŒÎ7ƒ§?ZµŠÊ‚<f;àĹ~;Ö^=/½`œeì92ƒ[·åcÖµâÍ>#¸îÐ+ÌÛþßùßEå†ùo™µG_ÞŒ-ç•ϲǮ§UËÉ<žÌ3Ž!ÜèúŽáK·Q¡ñÁÃQBéYë !„Õ)´”dð=5miæf¦-åÃcrX¹gý[ä›Kx±õb½Â0¨txiÝ)0—J! !„ÀI]|Yš¹€ƒ5¿‰“¿¢kHSÛÞ‹FY•¤c9xjÜjšœCA«Áb1ãtU°mÿ ^?VNý &„»”8œU½Bt>7ðIÒ/¼½ëEz%Çr[ëqÜ|ö´1 5QTò÷üºâĸrE3Œ¦B¬ºx‚d`“+b÷ý¹qê 2<:ÑT_ÌÁ£*¶ßb`îSÙŒy=ˆO7í •e ¹Aµfû{á£ã®Ù|=m}ë2މ7Ö23.·†ôlZÎü”"º5Ma·º ãƒÎ<,;Óâr†êî •ær¬66›•ÓKãFYi9‡áï€ÙXÑT‚#¯çî2Ç¥ŽËÈ1S(}ãúÐÎ/‚ÆZ/òuj0Ÿ™7ÿ v´ðÒòd—¦8•ZƒÉhÀt| ›ÝoæÄ`f§®bU) ’6'„âüN~Çä°žLÙWrŒñÞÁh3‘k*æÅÖcÙáÏK.Lv3njùœB œÔY—¼±srwÓ1¸Cêw&ØàG+ÿ†§‚&.\,8²Šî¡-/à¦ÒLz™Ï OÅ?òÌ_^éó m4NŽíßÎÂÂ?³:˜7C¯#3ãKÆlú–Ö×ßGÒÓæÒ¸µ/>>Iü·w?"O»¯È~GdÑ IDAT•5'ËMçe×ì‰ïøÝ¿„½ÅǸ«ñ€Ú7æ,`]F*y Y?òaa0C#‚PØÊ¨t)Æòdæ¤gc=’)Í_Æ×Çs1¡Á×Ý7ì3ÍÞ¿Ý­¿òÖ‘ *\`·d°£ÜŒÁ·-,kø$#›JG»Ž,g³Å%-é²±—©¤~€[a&Dø£AC`˦˜~ýš5yvpU°ï×ÿ‘ÞŠ0-€•ìÝù¸GúÖ ´²ss*ÅV3yÉ?0ÿP0]“‚Pº¨n´4®`á*3ÍÛ†¡9kU­VKÃΰU:)vÚÙž›Éºüæ'§ðõšUlܵ“iK1s[2«òJXž~„J…ƒìÂ2òs‹PwjyY†uóiEtÅjdgaÖ7 ™þD0Æe¥Ü©'H«œæo!7`7úèQ @§Ä[ :÷XâµFöe.æÕ}…Ä…£;c]!„¢z>ZšúF³9¹¦¢SÓ‡GucrÂ(¦$Þ}NÐà§c€ªgB!Ä?•úïØé#ÍF]YÈ-«^æ¦=éÜO­ieÇùîÈjvæõ¶÷œÿé„Ò€{Å/ܹxyš iû·xªÑs—÷{Ü·p5ž~¹'ª1Þù'VQk8²k*½6•ãPG0 åx’ô{x?ùôi÷“h ¡ó LÝòÝ·U¢Ò×çú㉯ŸÈóI‡x|ëStÜâI‹˜>ôñÊ—–t¹ØŠH·„àæÜl4õüÐÞ=ÞeÎ]w1¾U£M ñ·ðÞ¬qD©«'EÇ+pKðªñÍ…!œËR^›L¾]ï|ˆ~¡'š¿¶]ZYyf}KF„kÎY×`09°/¥Ó?âŸ;¹NY¥e–™È7›ðÛ± «ÕF| ?žîô=%&3¹%¥Äx¸£¼®z½þâÊÑÇvSî ãî£KY7†ùý’Q²‡•¶ªü:óYq8‹O:½Æü¼…<²i9o÷çÅö¯0RéÀbÚÍÌa§WKÆ7M€Bƒ;ÇùrÓ!*Î3Ö¹q´Á:2›Í˜Íf¬V+v»µZV«Å`0\¹/( !ÄßèŽØ~<¶y:SwÎaZÒý§‰½1º[µË(Í`î‘߉ò ¡K°N„Büs)\.×eé.ÑrÁXRF|Yçå]¸øñèZf¦-%½"¯êþU¥¡spsþÓôF"Ük߀}/ÿò-Mz¼È8Ï«ûiù…–ø«9ÈYòoæåµ±±§>o|º‚‚Ö¿òs>ûOºÇ7ÄÇæd÷‘\\¸ñð il©&#;² r9iL‹¤Þ„?|þþþun+Wi»g²Ùl”””`ÎÉ¢rï.…8FtÞ^¸‡G ŒCíˆjµZ Lñ¯2qÓǬÌNfHýÎLN…VYýynwñÛô1EÖr¦w|”6¤ð„BücýmCœ*P0,ª+ {¿Êšï³jÀ{¬ð>Ó’ÆŸ?hròšŒ¸.ì…Ûøñ7zGU4ðññ¡Ý“¸÷•÷È­°³-'úÑ´ŽAïëEpT¾aA·8HÍÉ'ÆËƒðV‰ÞsÞÞÞRÌÿ‹…‚Ü\*ׯĹzêìÔfnnø{á^R†ué˜7þF~n‹åÊ´ÚÒ¼yßC|¾ß,•r­±N¯{ó>x`?e_±jØÆEµ±Ë‘ž+±-qY½Ôf-ýcYtl#~{žÅ騰™NÍ?XšÁk;¾aìš×)´”ñlËÛ¯© ‰Ë’ËžMØ–VÂÉÖk+<Àæ)¤WO:X8ýs–·I£Bˆ:¸*‡ÖýË9B\Nv²~zާ¾3ÒâæGQóá V«ñõó#î¦~,îÞq£‡³6=›øÀ@é4xº{°·ÈÈþìz…Ñfø4q+þAAÔëÀGçA‰¥âª)!_§4““­Ån§0?ŸUŸLçàÎD……“·—N‡Ã™éÉÎÂl6£:NÃÔ4¸i ÁÁÜódÁã(¼s÷ÅUÿŠ—Â½}GÞˆ!\{…2›Á‚ÉSÏLƒ#‡ŸŸ~ž=7¿Ã-Ý.ô.˜½Mâ§Sx²µ‚o=À´”s¬ÚMâý MÑ_ð6Ý.Ãrÿ W¼îÿâýüõ.¥=ü»ÚÒÅrWëù¤ÓD>Úû#óÿÎ Û¿ä¾ÄCcÀê°auV… x†1)áV_C¥ã¢|ÿjv˜ëã±~þõ¥µ±~%þÞdìŠ ¼}Ày?hgÌHaó¶dvex3èžaDë{ Ö-gíî,*\îD¶îCÿŽõqS\ä1®#¡St~—r+`#ã—™l‰ͰòŠªB'u¢Si°8lg òzeSÏ›ƒ_¹ê Øâ°þue".¸ù‡ šÂWƒêØÆu:ƒ)ÕiùjñO|?k&™G‘U˜5¿“›#GŽ × AøE7ÀÛÛû‚o˜ûF$1ÿÐïWM õ‹L’frBII ?MÿˆÔիȯ¨ +=EYMêÕ§ÒfeUÊnögçâï—VOññL\Þh† # à27]zvý•žƒÊ2 UÏZ $LœÁ,ÀY¼ŠžXÃuo?KGOÅ%lór,÷O9mV÷æ¿h?~Köi‹åºÿ.Z¥šGš`TlV߯öƒ䙊1¨tU㙄´ cPS” å5U.ëgÄ–×uÀ÷ÐF~üî‰9AtmêEæO³ù85‘oë|ž-ið Äùç§ŸÍ™ÛØãlÎð{oÄËt¥s—±®þô¸Èà¦Ê“èM/1ÇN,&›ôýBHàäB4òŽdKÞ>:‡Êà_§Û”·8ŸúRÿ–F­Æß߯ýça, NgÕÏh¥R‰N§»¤ÁAi1…BÁ¯éPf5þmùôÖºÓ¿^{þÓb¤T:UÁæ>ÄÑKÈ*³àÔ{¢¶›Ù½w/ #"(ÌÏ£4ç8¥ŽÂJ 3õ"êcܰ†ŠÖIxzz^d›pa=¾ŽÙ_üÀÆ´BœA­ñà}ô >ćgõÌ+ ò=ÀOþ@ƒ! صb+ÇrmD~”G7@¯pP¸ù>ž»™¬âR*ìU§ýVÌ£Mmì[6—ù¿þAZ±¯¸!<ôŸa4vWÔ)]æŒUÌüüG6­À™Èà;ÇÐ'Ú …=u3Þå›M9X4´ºá÷|ÈÇ{+`ßîôlÆø©è¡¨a»+ùêÓÙ–eBW¯;ã¾…Ö…çÝæ½“Ú³æµùø<øw59Ù‹±‚íï<Á{gí»Yq5ûÐïçƒ'¿'j`}v®ØÂÑ"­n›@ÏŠÅ|»|7ÇmQ }ìFéQ˜÷ðÁãßàÕ)œ£;RXl!¸ûÝ<8¢9^ÊZÊÆ¼‡&-¦ñà`Ö-ÜŽfàs<ÕKÏÁšê¡ºå»æóñ©º?Ylel~ói7‘¯ B˜ö|Ä“scxæ…ë:ùxûœºy€{N¸L¤Î}ò†ðÂ]Þ|óÄim¬Æüž]…V²Ö~Áó«ÖqØèM“÷ñàð¦xZ«ÉKß@l5•5¤kBܲjª¿šŽ.¼=Ô¡ÍÕÜŽ¯AznéÅ­1½äBdTõ¶Éß±™ŠòÓç±w»•rÀU˜sÞí¸G6%ÁÇÁÞä´SÓôQ½u2®M³ðÕ¬Í7áŒÐþùÞ½5ƒŸgn ¨mÇv¤‘[®¡A÷ëiaÞÂêé9‚h7d0mƒ4UË~µŠ ·ÒÖ=‹Ÿgn$8)˜ô‡È+±4„ÁIÁhMû™÷e Í︉xw®ŠÝ̹Ÿ¤;¢Xú5K2Ìù"¹îöÁÔ¯ØÍïËþàP‘M`3z ìB}9û~û‰ÕK°«¼ˆnߟ¾­ÿüŠ¡³’Ì”u¬ß~ì nI ÔžppRžºš_צQd4bv¨ˆz/C¢´Ø v±rù̳  Œ¡m¯ž$ëPHsB\­“û›ÝÀ³›¿àéÖ·Ñ)´Eƒ…]+¬N;ë²w0eûl^Mº[ZÚ¿ŒN§»"_N1¨uLn5šÉ­FK!_e“#ËWÐ<"’æ8”ä—W`u٨߰)¨´Í$ÞÇ`_oÂ"BqÓAÎÑ,ûöbŠŽº¸öbNeδYdv{”7&Ç¢<¶‹|?í¹?M©¬ÊÀ¤—nÅ3s“_ûž=½£µk;_}½Ÿf¿Å3á…,{}û?Ã½Í à2cU7á¦gFÓлˆe¯½Ì¬µ]NÝx×61`Î[ó)¹þ Þ{&˜âõŸòú[_üú}4N_À܃-xì£W‰²cQMz¿„ñùÉlö“kyÅÁe:Àœ·áþ4uò%÷×7xç›ÝÔï±î¼ÛtUîçhl žž§_{Sƒéër‡ðÔ”Û`ËÛ<úÑTÌwLæ©·ï!kÞSLý~='¶ÂÀšËQÝí<úJîåÛøäéϘŸðwÖ?ZcÙ$¨Ê½,ÞÑg¦%D«Gqíõpöòæj¾â¦ð"¾W#f.L¦°O?‚TV26¥áÕ~8þ§U¦ùàÙuã‡FQ~*hU¾ë[>ÙÇ=ÏwÀOµ÷¬‹Zõù½ëì×Éì…¤•4æ©c .^É»¯|¼æorWÔ¹yq™ö×^VÕ¤Ë×z –ú«þ8hs*¸Q÷öP—6'ÄÙTÞÑ$%DBnÖ˜îøPÌÑ"7êºÈ?f"®kC2Sò.}GN3Eeà¯?w°BkûJÚ1|twH]Ä—¿þˆµÇpFŒíKÑúÙü°1ƒCpÎɚ͞Â6 »¥†ÂõÌú~#-†Sc"ô4x =æÌ&­Ã o ëq~_¼ G‡ÜçNÉöY¼úÍ÷³6+Š¡÷v&ÈžÇñ ϳn@œØTtÑ0· R¾ŸÏê=ñÜÜÚ…é0¿¯]æ]µÕ_õǪ+Òæ„8›Ò-œø–-a¿“ÊØ–„¹2°føÑ2ÆEš½˜z î8\â^\X27±ÍÔþÕäÕ~4i‰»R38o‚„&hàáGK0;97p¢ö#¾ež*À'ÅaJª]°–kev iú6ÜÔØµš´Às×aJÔžèÌY9^F@T‘gm¨ô :!&ŠóJp¹))Ë.ÃŽ7*c%ê0’ü4(ÔÞDFhØ•gFë5;…TES†5 B¯}“N´Ü>äL3Q±9B\¥€vAñ´ Š—RBü«8JÅß;w?¿@ÊJ É=^„µ¢‡ÍŠR«@ë²£4Wb2V`©0‚±çªí8¸˜@² SQ!6Ÿü.d˜$…µÒ…ÓåBåß„®Yl=VIƒzù$ï4>Ì÷D`¤‚ý?}ÆÌ å„ÄÇ„§Ýùç»êJO'<Ï Oüjvä±âõiÆ…¹¸›W+|N^AÔÞ„{9ÙTP‰*q8OÞ»„9óŸã™ ¹~ì nR·üš‹ );¶×žX^õÕe£RÑe½‹ÝfÝ÷qN ©Ô¨N‹U(T”8kßB‰ÎCƒµÌDe-eãPêðжáóÖÃYË×Tín éÙ´œù)EtkšÂnuÆy‰×Ô¯¦cg¾˜M©Q…ªF¢¬õöðD~ÍçïC‰›îÏåÎÈKííÈIuéÒÖ½þN;þÞ6'®%NSûvªQäda1ï ßULvQ6;—UI™FG¶éÒFÉqÓø}Y:‘½n%ô|×¥ ¥â¬ÿã¬Ã˜$JTJÎsüœ{<Ù*Ê©ÌÛÌ÷_§TõŒt9°(ê£ èÀ ý¶²vý·|º2”Ö½úTÏíÏÞ2.3Ç·,cå~>‘‘x»¸Uå¤òŒ ĵŠCùBÊ8|Ô‚T¸0WTàpk€ûÉØ¨Ê?7'Ë-€N„WqàD!þ­*MVRÆO冶¤˜2c þ¾Á(tz5.—Š};·à®uàÑQi-ÃVR®Tu‘{T óñF]šI±|.bŒi…!šÎ Jf}=…Ý -ÁmîaL €õÈ÷üw•÷¾úâÜœä,ÙÊêÔ³nŽ=½ññ9ùU3•P ÷õESvœÒ“é²—r¼L‰O€JÔ´ʃ ד·é ^þx6§ÝT§üê}}ñ¨×ŽÉ/õÿs\Ž“.j›œ5Ni-û0ïaùEßɘÉͬÀ=Þ÷ZËæ\篇ºÒÓ£9sS8âܳå‚Õç^òÏ©›W»ƒÝDEƒy¡ÇÞøb©ÍFÓ¨Nùõªýµ.—…‚ãFÜ›x¡¢¸Úú®µ¬ªIWä¥ÖŸâ/hs⚥4„ѤE ÐÚ©ŒM Ì•%Ã1.Ò¬ÅÔkîŽcÿ%¼ªcÍæE¿SÜt7Fþšq<J.'ö“ñ—ëÏÀ‹âÄWÕ41ü–ÖxŸ}‹nÇ€è6”XÁü_W>¶?‘'ƵµçndénOúL¸ÎIñÖCìÉ:±ž.˜&Q V­üžtTxÇô£ç‰÷p4¨* «zª‡‘¢J%îžò…!Ä8ÇK!DíT*-BêSVa&³4ô‚,Ê­ŠËJ±”—c.)æhF¥Zw¶äe’YšC™ÅŒ©° Uˆ/*ÕÅO 1½ii]É7¿ Ôj¥øàzÖ3Õý ƽü¼+‚['½Ì+/?ǃC›V½j8Í¥˜]NÌÙÛX¶>[]oÑcúh_ÍÜßPa«$cí<–V´ oœãþÿñóÖ,hð ôG§B·¤åb¶[±»jÞnkãÏ|³:J'8Ê3HÍ®¤¼.Û4îgÁÛð¿ãgåâ¬å4ÕîÃ|á_…°’òÇAŠ­fò¶}Ç‚´º&áQcÙ¸W{“s)õ Ô ¶74º¨n´4®`á*3ÍÛ†ù .*ª+GmýnhMhÜPn ÞÄÌåYØë˜_u5ËíÜœZµ\òÌ?\ýrµ¶£eUMºÔ—Zujulsò)qöñlÊbßÎìOÏ"u÷vì>Dö‘=ìܹ—£Y‡Ø½ëÀÅ÷8±‘²d1ûz1¤}Ù‡ÂÕøiKHK/ÅfÎgïú­äÛOœÍZÜõ.ÊrJ°9ì¨Bh`ÞÆš=ùX\à4]lÁ”™Ì¶´l¨1x{¢9«×‹ÓjÄêN¬Å‡HÙWüg/2s[ùÓeØ­ÜzëM h‰áÄîµ! Ä:÷°nWf»…‚}ëI6GÑ2B'Bˆ+p:”"BˆÚiµZÂ;wd÷‚o)²ÛÙ™“NÉIQi1ƒC©09TRF„¯æ2‚âa)3a-.C3$ñ¢V¸7ãö‰#øúËy仪¯Ž ×ò"/Ñ´õδñ·Wý_©' q/ÆMI³Ø¡ ®÷6Sï]…[LW†vmŒÇþ:¦Ë­ £ÁÌÏßæáoŒêµað£cIðPbÒiÈž7… —ãÔGÒqôâ îX†öÆóíç¸{Ew¼2‰ÞAªj·;zâpf}ö:÷eDåE‡›ïgdøù·yÛc]9–š†w©Â5§"ñgìûÉjöñщMÓcÈ[«ì¦ÈC×»¢_¨5•¢ÚÏë.¡І’SÆç3ÖÓýénøiëÑ¥••gÖ·dDø¹]””ÕÖM>+QTuçWúÒîÖ^,™2›­¯¯S~Ï©CC81–¥¼6!™}ºÞyb9ó…´£“eunºþèøØ¥Õ_ÚCÝÚ\MíX\».W“%Óß%ÍRõïEÓßEyã¶²*Ý,᳓c7»'póØ„\É_óê`Ú´‹äû_ñÑšZõìH£¬='Ï`D¶KÀ°h툠Ǩè>¤«–ýÀ3£t¢qçþtòSQ´þ;>ýŸ —ÆŸ¸nמ~*kGRÀb~œ¾]H<횆£?~rf±ÿcÑ'ïž Öx…7§×õ©ïI×!XµbŸ¯±  ˆ!ipO¢ôòM!Äå§p¹\òÌD!ja±X8¶eÓúöGN‘´.{çcÆ…—ZK=wwâ"ýÉ·ÚˆõõÁTZA\¥š¶Óß' Uó+ò¦ó¦;u//Šâ‘Gºà¯rá0á§—§°{è;<ÝÞS>×x±Ì{ø`âìªOõ†^M7Îr–<Ç›ùcymlìå{"}ÕæWˆ«Ë¢y[è2¼H¦2¶ a®L¶føÒ¦‹CÛJ¨×Úß­£ÝÍC¤°êÈ–½Š›‚48O%8-¹l™÷éíÆ1¢±A Hñ—‘'Bq:¿¸FŒ˜ø4Ÿ½;•l_£Û&ÐÎ?„ÔÌ|4-„avW²y÷aŠŠÊéAtŸ>èFÿ-ApaÎϤÄãÄûç.SÙf…ê%hrÊ\WUzì…Ûøñ7ºÝø¯¶ü qõ‰ö<ÄÏsNtÛþg×±Tý½éhü[ÒNŠªÎç[i!F‡?Χ—¥”b›'a~)!Ä_J'BQ>>>´xàvî å‘WŸ`wa1}DQ «Ó‰wh …Æ 2‹Ji_/ˆˆV‰Ýu;ÞÞÞSŠxµͰ]Ÿ3å‘…(u”ºPÚŽžÈ õåç¿‹¬Ÿžã©ïŒ´¸ùFÈ¥]ˆ¿C‹ëo¦…Ãe½Ž¹Åt£ý±å|7c ¥Æ—ØnCh(ç9!Ä_|F’Wu„¢n, EEE”Ëå®[†2<±5^J%N…NÏ’}ûq//ç®»ÇÐpähüƒ‚ÐjµRpB!„BüƒIàD!.€Ýn§´´”‚œ\–}·€Ò´4Ò33PzûаYSB@ƒ¼½½Q«å‰˜B!„ÿt8Bˆ‹`±X0™LX,œN'J¥N‡Á`ø›Æ4B!„B\ 8B!„B!„¨RŠ@!„B!„¢z8B!„B!„¨N„B!„B!j !„B!„BˆHàD!„B!„¢8B!„B!„¨N„B!„B!j !„B!„BˆHàD!„B!„¢8B!„B!„¨úB.--•B!„B!Ä?’··÷¯£p¹\.):!„B!„BˆsÉ«:B!„B!„5À‰B!„B!D $p"„B!„BQ œ!„B!„BÔ@'B!„B!„5À‰B!„B!D $p"„B!„BQ œ!„B!„BÔ@'B!„B!„5À‰B!„B!D $p"„B!„BQ œ!„B!„BÔ@'B!„B!„5À‰B\vòV½ÅÝ×w$11‘ÄÄöÜøÎ,—´M#<Ù“þ¯íÂüçÆU¶gzwd̼LìW,-_þ®΢å<Ò%‘Äá38j;5•ò]3yüÆ®$&&Ò¶×­<»à •®ªyE›?åẘ˜H§¡óÅöRœrð !„B\v8BˆËÍ~œ_?šCri3Æ¿ñ1Ó?~ŸÉƒ"Ñ\Ê6-GX³£ ÇeHžë‚–¶rhîÛ,ÓÞÀ£ƒ"P_æ´üýù»²Î›—²#«ùxâó¬55¯r'L|Ÿ•YQ 7†¾þiü:u"Ÿ°â,^Å+?e}QFÞy#qEë™>q*Ê\rü !„B\f8BˆóÈÚ°€_-b{¡ý¼ËV¬{ví‡ñÁÀ²éOÜÏøûïç­m¸pR¶ëžÕމ‰´»^‘¡s IDATînÞ^™{¢‡“âÍÓy`PU/•¤~wóîºB€3o!·wÃü(ú~,I¼áS[Á²ç ®KLä¦oªzƒ”ý~‰‰íxp]8sønT"‰×¿Î²ïŸåÆÎ‰$&¶åþ5PkZþäÌÿ÷fçÑþ¡14s«=-µoÓNÞê÷¹pU‰¤#xìËdJçÛf-jÉ_måbÝ÷¹õó˜6¶‰‰‰ô›0“ƒ&W­ójÍ_­e]K¼hÿܶ³›[E.§­`Ðê ¬rZB!ÎËétR\\LNNYYYWüONNÅÅÅ8—¿®ZªS!j·d[Æ•òÍòc4áKÊ·³Ø`kÅ­·w%謳¨[ËÇùêó½,˜ü ‹xiêêi”¸…¢(^Ë+Þáw¯¡¼DņaŒþ1Ä7kvêæ­öqST¸û¹•„û€iwÅpò6¾Ö´ÜŽ °g.æ­-ô}ëfbN®¨®9-å{jÙæv'˜³ö±/½1ÝF~ª †Ýµ5nÀYºÙŸþL€Mn¹Ÿ¢µµæÏR[àäD•yu¾1=Û  êJÀóÉ:RŒ#¢æyeêÚÊ, Æ´Ô–¥WC’ëš÷1kâ½L?  ~ü ÜT_ƒFÑŠÖ³wÁ"R:rtÁv¬€Íl»¢7‚GE£ÑЪU+üüüêt˜³w?·íÈ'­RIë® ¼ÑÁ mY!X}˜ØÌ½¢›7 ÏúÝü¯ !qÚšç54²d·‹ÃB‰Ò( $Š/øs_E‡1éçLöÛc‡6cL¸…½–õÌ&vuô‹Ð¢ÜüˆWçp°Âu*pbÌ<ÂGå<“ÎçrJu Õj±ÙldggÓ°aCT*UÝV´e±î×]¸uÄzF¶~¿˜å¸!¶¤úéMÜ9ó*¤Á7$Cæiý¢\•¤-ÿ…}žÝ¹u|} •Yd˜5RIBˆ+Îb±ò—M ^^^äää\ömKàD!Î#$Ò «ÍƒúþZÐ7¢WðLÞ7ßÉ«îrpb.* ì›r=ISþœãu0«ÓÉŽo_æý_÷RhýóFÐuÚ èÅ^@ Œn]#O»‘?OZÇà,å?å`ã{y5Éë¬æ® ÏŸ{þóìä¿ñŸ¾ô;ŸÞ­ïâÍi÷ÐÚKYkþ\Æü:ïROYºt¿ûDदüÕW¨OÕEP«G8ÎS©8wžýÜ©¦õýŸ1mL9”G†/â¡ï§sϰé¸Õ‹DK·+r $''³víZ6lH~~>óæÍcÔ¨Qxy牵½’õűÌz ï‚£Œùz ã’¸  \Ži£T᫲’Ræ@Pó<——‘&5íîáæyEda W·¦<™àŽÞ^Á׿f¢îÞ•Í5¤ÿ±…ÑKs¸nL!–ZÖÓzÒ;Èʲƒ• LtÃ’•Ïn¥/Oùžx”o/gæo\?8š°érBçe2™HKK#??€ŒŒ vîÜIaa!:t ((¨æC¦`Ç4ÍÒÀµÊƒ­}IÙI¹OFµÓ+ë¹X1{=nn£O„÷Ȧ$ø8Ø›œöçÙ¹<íùõèÞ7- «G¬T“â/àr¹þ² Éé¿}]®Ë?æ›N„âB.•élßm¦þ°pttPbð÷G D=4ƒ×ºûœ F¨<‚ql{š×í%`Ì ~EòC}˜¸©º`ÅY… %`.5ãÄAYNY5ûÖãcPÖ9-zÀzh.ï¬ÐsÃ烈8çJQ]ZηM-á}Ÿ`FŸG)ËØÃ¦Ÿ§óÊŒÏygùP¾RsþUØ-ÌÙzK-e{vþêZ.Vúó”Yi©Sª‹E•±åÝGøp§Š¤‰_ñöÍ1èOîTéEâýñí€<ÌúP‚2^eØ“åÄ5ô¾lmýðáÃdee°gϺtéB«V­p¹\Ì™3‡åË—ŒR©¤Y³fÕQ”ZÚ·ö'H Ñßû(ëòŒjàGGÝQ¾Ø^F«vîìOç—b*ïšç9lV*Le¬°DóáÍÐgáÞ9»˜žÄÝž<|_WìJ%* 4 Ïm•;!¨Öõ í_e_m¤ÓJ%N«–þ7$ÒZW<ºí [c3ÝOyÆ«TBTÇb±0wî\\.Ý»wÇÃÜœ¶nÝ @Ÿ>}j]ßZZˆÅ£*ZŸ´Æ|J‹ªŸ^I!! 5[h/I§LHþº,K-ÄåÓˆÎý»ÑØK%&„Gà¤â]ä}4Óþ#8+LÿúÂSz04i@Ðý#ðhß\Z“ÿfÎ,~ÿìe¾JN…Ä»y¦ÙÙÝ£ÏÏ­éP:»¯å÷…KØw=þióù`~6IO¿Ç6 vÀi.âðêÕÌJuì9KçÄ`´nx+áàŽÕlÜ©ÀÛì$4¡ÁþÑ{þ·€ Ù´à0Ô!eµ¥åŸRV¼7›üöO1¶Ù¹=”5¥¥–mN¨XÀÝ7¿OÅàç™<0ï@?ô¨pwÓÔºÍPÝÅ=¥Ð\d¹\t™ùé.2wŒMöSj9Ρ À²ŸµË—r(¸|óæyàÖŠú%¿1ó³ß5~‰CZoÿø,›Cú0özoR¾Ý€5ìv†76°abOKƧS|ycì§x<÷-c×ßÅÃÉÝØ°xRÓ–——G^^6› ƒÁP“R(0 ŸzŠUCàDMðÉhB¯Ö…ÑâÄ©öâÞa xaq2½×)iØ$’>AŽè”(j™§TªÐh<šäO°JáÜxŒyY6î P“¶ó om-&ס@i7“ë ¯Úu-ëó0òúüLêíÂ'´Øòóø·;ø2°-ã´Ù¼µÏ›GFy ½¼ß‘ÿR›7oÆf³1zôhÜÜܘ1cÆ #88˜E‹QPP@½zõj:#à°:QiU§ÎV ••ÂÕVýt».‚NC"jM“Ã\IeîJÚåöî:ò6ÎcÑòT“ Bˆ¿:pR±~™O}HÄ” ¸µŽCiÐýë Ïi²`ܶÌ'ß'âõñèÐBZ”ÿZEd:»0â© ´kè‹æ"îÁ•>]x惇Q¼:ƒ—îÿôát¸õqnkå…—å^îJ<À'sãÑ]·ðô+ãqNœÎÌ׿Ð{Έ÷îÀ÷µçÉO¿æñq_ƒG'¦üð¡½yhÌO<öÕ÷¼4µãGwÇãU8œ›OL;§óÁæ`FÓ‹Àjb*jJ‹_ÍùÓ*‡òĄݼôù Ü÷ ´Á´¾éežéå_5ÎIMÛ¼ÈÀ‰ò"ËåbëOqžÑfjbÏÿi“>âè©)¿óÞs¿CË×Xrײ*“YðEò©%¬ܺO=·…'§-æËOÁ+n0Ͻ|Mô°ÖTÕhÁé´Ri6¢²;p˜*°V˜/(míÛ·?õïß~ûõë×ãp8(--%==#Fvž ¥ƒRë‰^D.%6ž:%JÀ=$’©÷Ö«ªK“þ«§_Õðšæ) nDëä›]à¥\8¥R½ É+Êr{;F«°dîeèÂuWËz¶¢|6;}y%Z‡Ðqw*ó³­ Qä°-«”»Þ®zEÇnwâ`37V¶fq9-Šs=z”¦M›¢T*Ùµkf³§ÓItt4=z´–À‰•V…ÓúçW¤\v •­¦úéuù!¯TªÐ†¶¥]¬j $¾ žûÓ œ!D])\—é C7M"è‘xvm}Íbùª­ä}ú1ßN‘%Ä¿Ðáyòü=£¦½ÌuÁÒµY\{ëÖ­#-- ½^O»víˆ=ÿ( O½µ‚”fm˜Û×}Q:ã¾Ìaà]m¹Ù£‚÷?O!³k[^S²km2¥‡3{TaÎòšç)lûe“Ì ùzH0^9G¸sN>Ç%1Òt¡ó­<{s:j,üöËVžHó㋚ÐRSóz£4ÙÜýÉšÞ”Äêip–åðØç©ÞÔ‘§ÃO?Þ¤ü¼‘=Z2¯›Ç©#® Ÿ}ö-[¶$&&†7н{wÜÝÝ™?>¾¾¾µ¾®cÏþ™Ë Õ• ã¾ÌÚÛ’Q3YPÍô;†7ÂpÖ6\å;™3;㪾ªcÏ[Ëì%6úÝÞ“P58Š6óíÂrn×K*LqEeeeÿ!Ë?d¿—­Ç‰éÀQ<Ú]›¯«¸·oé?Óäȸ†˜ÍfÌf3V«õÔw•J%Z­ƒÁ€N§“BúY‘3„©/•±`õ1zŽl 7L⚣R©èÖ­ݺu» õœjw:ë2ÿñn2*´ì’À àÁmýBylÑz’~TÁs7„¦”µÌCE«ž-õÓF¾±«Îƒëú4g¤Ÿ=‚;ÂSxêÓDøxг} ýì㩟|™14¤Æõ”„ðòÀ ž_¼ž6 ¥†Öš3!L‚¤çS¹3•’%k1nÙ‹=¯…^‡¾A8žÝñÜ •§Û5W&AAA>|˜ÄÄD pjzyy9yyy4nܸöæÿgï¾££*ÚŽ·ï¦mzB EJ€¢‘&¢"ÒAÅÞë«X_ò"þ@”"RAQAé5@ZB IHo›lßßA¤$! ‚Àó9‡sÈ-sgæÎmÏÎëC”}9[R›Ò#²‚Ý;Š nЇ¿gµÓõ–ãlüeúŽ=‰ó«þ¶^í×”hÍ"6&ÅÒ¯¥;Ù»÷b í& X!.À%ëq’3ˆû_ÔºŽ² p9Qêu(´WççÑþNùÅÕÃf³Q\\Œ9'‹ò¤Dìyy(NJ%:½CXÊF1¨ýðööF­–ñ—¯šÉšã*÷B×p ©!ÄuÌQRNæËŸQºªjkµ¯š ?œVÖôl\v*oOê=?Ÿþ]¯«º9~ü8‹-¢iÓ¦tîÜNGaa!?ÿü3••• >¦¶{]–¬müôÓfÒË5µìNß.ðPV?ݽr?Kç¬ÇýöátÊfùŒïH;íÍAuxoFºMa ¿ýô ]x„µ¦{ïö„ëåj&„øg]K=N®XàÄåpPøÍÏÌ]%=»*3: žZôØÝèGHàD\2“~žÈ—'Ò·ÞÅ2, …yy˜·®C‘™…˩ŽœvÜ|ýñtóÀf*¤¤(m£Tqð Þ'B!®öüb{Kz6žãxàÜãb@©8T)Zº–¼iK°4a(ã_Wu”’’ÂêÕ«±ÛíhµZ¬V+F£‘¾}ûâïï/Hqݸ؆Ën¡¢Ò†Rï†A£¼lÛ­Íù9Üeµ‘þèûT$îÇïÞÛðìÊËóÁt çÿ¡!ÏþÑSxÝ_[*86Ïâȣ˨Tµ¥þOÏáå[Cä<=GoŸ…zÊdÂbR9Ös†9UÇâ›’8ÖãÿÐ}õ1A7häø§Unáé;fø’qÿ¿ü·å<>ï¢'{ùs }ôkRŠíxßø4sæ>Go%ÎâÍ|4f$o,Þ)°ã'Ãä!‘—öFÑn§ /µÿ7•Ô={ðòô¢]Ó¦„¡tº¨4›ÙŸžNNa.‡õ¡nHMƒ¡#  ’ž'B!®z.‡“ôGßÇ’žMð÷ðàÀs–Q=ð~;Æž8úÀ›œ˜¼]ƒ0Œ=;\7õÔ¬Y3¢¢¢8vì&“ ___"""P©äõ/!„¨íùÞœ“¦ ÛHÉ(Á~rª!° q7v¤u˜“´­pk@„áò÷˜»"OsÙïÏœzŒF‹?@tjº.*cÏäN]DÆSÑøûÐF×P¯¥”MY‰sì$š¬‡BUKå£ñ{ânT ed‚«â)Oç¾9¡Z {’ E_=”ýÁ3c¢ãâTÖ´5óãèvŒý´?Û_òã‡ÑC˜>™Å= ÈYÇï…î5¤|ñXqq1?LÂÁ5«)³X°˜-XósHˆi‚›ÁÀ¡ìÖìN¡Ün'" µ*òr±Ñ (¿0 !„¸ê-ùŠ]ðÒ½Ú Éé4A¾D~þ"©ž$û/ñìw]|qñOnnnDGËWk„¢n”ìý™oMÅ ñ"ÀW£,ŸÂÜlø>•=Fe%îtˆŽ'ÂpùÑÊ˽A[v>…ó%ìíGІaÍÌÅžW@Å®àr8îNÜZ5!wêšrZq˜Thû¢8__ãçÐn¸ù\dqë™[\€ŠÍOѾõ–þ<¶b0ãWÞè3ŒG²ÈtÞÀM1^(TtØ„ò'¨È\ÂG»nåÓ7ûÓØ¨Ç»Iwv87a—•¬u3xmüpî»ÿQÞ^˜B™£”­ÿÇË?çâ8¹XeÊ&¼òó«šÍfòâøêääSjW Rk9|ôdz³Q)M=ˆÊ\ 5y¥¥\„u”¯_KyF&‹Ev®Bˆ«ZÁÜ(Ýô?9ìÔ´¼/¾£xÙU·f•2_˜ŒåhVÕíWHþ£`;QHéÊ-RB!ªeÏßο¦bƒF7å¡q£¸÷î{þàxFônŠ;NÊJlW4—=pRºfšz~x´¯úOîÔ…þ*¹Ÿ/æððW1§eà;øVJÛVC*L¯¿LÖ>eÝGʸ8%˜fNæPס$ÅÜɾáó1•ž¾Å”ıN“wÄ~öÓ4΃¿’1h )­ïaßÝ_Ršç¨šžò#Çn¿‡¤˜{8øÔ*¬6‰œ\ní?ä·¯ï㶉k8²ŒÇz=Ʋíó¹«Ywï~€W^_ƱÊ<Ö/)¦Ç¨Ö(®âˆo$»ŸëLƒ?"nϼ#Õ)ì¤7aä{3˜öf_+?gAª†¦·Ü@ñÆD V2¶¤áÕ¾Õ9“ÿ®$¦^½£1 ~íü 1úNdt,þ>¾4 ¥Wd}·hÆí:6'Öýû¨¬¬”+„âªeË-Ä| ÏN­P=ª%f+s&ó…É-]Cúøw(ú~ÍAï>7P¶!Q*Q!DµÒ7n£ê<ˆÛZ£ÿ3Já('cß¡ª^(WØåïq’“.ò¯ZB^*%'&}CÈ‹£N «‹ ÁQfªúâÎ9t¸¿>‘wóµ«ÕJÞÖíø½ˆmÒœèf±´jÕšnq­©ïçš7§W×›ißùfZ%ÜD _=”N6¥çÞT¬V«ìX!„Woà$3ý õÿº‰Ôki8ï-4¡d>?™òÍIŽ»“€î8µŒ6,¥»ë±R‰B!ª•vܪú´ñáÌwIÂZ‘@BBí:¶§¡Ç•/ê²q¢òpÃQúW̨xéZ¬éÙèo¨OþœñêÞµŸ7Ž • ¥[߇UùâyïÍ`+Å’œ~j¬»òpÝ\ã[6ÎÝ?QêÕ†}ê¡T‚¾_4ó·R±ÍD‰²‘¶@£âÑ{î}$¿w¾·Š Ž4Óqð¨Šw˜ÿb6#Þ dÚ–Ý´¶lcʈ;è;!Žßziðlÿ"¯Þ…A #î#|î*àÞZ¶¢ÄÍ[‡µÔŒË­1Ýš•ñí®Bº4ÛE²º ãÏ<,i‡ÓðòhŒ^­Á×7«ÃFfy!¦…¬e¥èÚ5GëR€µ¶‹´ lj|ìûsä¶ŸNN²áP¶Â™›Ë?|@ç²kþì"¾È̺qßó¤ã]îøª‹>jCÖ‡í)ºñsš¹+P¹'ðÐ{ã˜~ÛŽÜO@Ö&ŽTÞG¸œvœªóÛ\ò›pñB…ž†7· |þ.Ž8wãl5‚ jŽ s¥ÔÃGðSéð2UR\š»§7ƒPâe ¤¨8Ÿ}©Û¨çŠÃbÆ‚{a9úRù±Bˆ«›:Ðë±ì¿.§véãߥbç~|òMId¾ø?”n:¼nm€½¨Gi9š“ë !„góqƒc¦| Í.êyü;‡È¸ì¯ê¸·ŽF׸>Yo~N>»áÕ½=J½Ž—F£öó¦2ù… Wâ?¬wÓu¦Ì'c‘!óß"âÕ»ðiãuž5¨}QG$jÅg4ùõ3š¬œNÓ_Æ#Ä EÉ viÄ—Ÿ…ÜL%õý5Ø 2!Ì Z5£rÅ,þȵƒ«œ}+~&7´5 Z ç^ÏE¼4}å¶|Ö~6‹â››¬½€=[S)²šÉM\·‡‚蜈ÐEv¡•i߯1Ó¢mç:U*ZGb*·YR@zÞ1 -6ŠJË0•—c/)!ïD6Ù…¥d«õlÉL%¿²˜"S–ÂR”õ|ä„B!®jºˆ`4Á~”ý‘ˆËjûóV …N‹ÿð>„½õ0 f¿6"…æ¯_ JWUwâÑ®¹T¢Bˆj5iàd³y[&–sÆÚ°Sš™AÉ~6¿üŸ#V*ïQÝûéÞ'äÅQhBª¾‚âr8)ýuÇ_Ÿ†±GŒ½n¬{º¦bœNÀ‰óÈV ~ÈÂ^]¼DBáÄép¡lyžÅŸ½¨awF¢,I§²$CÓ›p+ü‚?ÞLøí,§¼Ð…ô¸ l…³ÓÒ Ì'²ÑDø¢Œ7¼1c×:„a• MïfÒœQDºëxnỹ« >O;¿ù fÏ»åÜÝn¥¡åÞy$‘|}:ž@Ïz'›¿6‚›Z[yyC+‡žÛÍH«ÕrSv“F‰ÓERv6‡ŠÍ˜+ͨÐ48˜õ‡ÓðöòE/ „5ñ"ãD!†RêÁmÐé¤õ\kÌf3f³«ÕŠÝnG­V£Õj1 ²¿…×…Ÿ;º‘;u!ùs~$`ô*‘S_øëzÄ ?M>õ·ÓTIîç‹Qt{w”:BQ­àv‰Úÿ3Gv/a­+ÝÚ7#ÔK«2C;ײj[&4ìŰۣñT^™<ª¯ÄFõ7Ô§Ñ‚÷8þêTöw‡¾A [vÎJ ªXLQ÷n:ÊVƒ lòGV¢ŠíFàÀ¦¨¶W³ .ÏØ2_ûßÙÝù¿¡d½øöý§…_ŒO?Ihÿ„¾{c¯L åe/ÜîꃱQ®´èËAÓˆÇú¢êÿw-cé©ìK§ç–ôܹ«¢G1k÷(fÕ’ì#Ÿ¼ÀÐ!Õ¶tnÆu$\[Múá}zP>éc’)©Ðë08”——“VVFv~!žJ5¼]è< 8”J2 аX-4ðöFÙ³ z½^öí5Âf³Q\\Œ9'‹Š½I8 òqšLèŒ^¸‡†anÚ/oooÔjµT˜âšá?²… Wrâ“oÐ7ŽÀ³s\˺¬6Ž=ý ¶¬<Ûƒm§ IDAT‚ÚÏ[*P!DõÏòMèuG ?|·‰ã{W³hïê³–ð¦Yt(îÊ+—G…Ëår]Š„’bÑbßâ ^ϼÿ¦Ä¸*-hBñ¸1•§ûU·³/¶üâJsa/ØÆô‰Kxr"w†Wÿ ›ŸŸÏîOgñõ§ÿe¯ÆÎmmZÐXg`_ZeV !>Fb±=¿M‡ÓX§¡kýP¢ãºúø8üüü¤ª¯‹…¼<¬Û7Bf6v» ‡Ó†Z§ÅÛ?•ÝLIÁq”Q QÅuÄ×?@zŸ!®)‰8<ò5°; |x0þ#û¡ÔŸyž«Üw„¬ÿL£b÷A<;µ¢þç/Ö}̺«ý®Âr‚½»aökJËFÞ¨[ÁVKÄ•¼ë?=Ÿ¦,½÷~÷Ó=TõBü3²²² ©óòNó ìØIò¡LòËì¨ÜŒEFÓªM,õ½ÔÿØvë⊟½õÑQøÝÝ ÿQý1öìpUMÄÕÊNÖ²—óä\*{ø6oIÀØF©êk¡µØíäå±úó©|õålV'ïÅ¢Tàîí‹F«çpæ1~MÜÅÚƒüñój2Ì¢0?»ýZ,ÉEyÊ7¼úà}Ü7îc¶—¹®lvÌ)L~øy–e_S¹J6ñ߇&ðÅ~óK»¶åꜿ‹Üoµ¦_×4¯³6s)¹µnBùo¡ ñçħóÙwãHŽ>8‘ã¯L%ã¹I¤ö{‚´OS±'¿»{QÊó×MÐ\”í_Ën³ŠãÖ“i°±aÅÎãlK*¤.ß2eìbõ÷_ñéä%±œ=×Fκ/ùdòRŽZ/>§ }-;v ™ïßéi#ã§,9l‘Cqi‚ú b:ÞÆàá0îáq<8òúßwAA“Ê%ËB§Áe±¡Ð]Qk§Ùz]–ûê§&¤ïÛÌì[‡%Õj¼}|¨ß+Å7®ä¾¡ýY{$“¸z!4SãææÎ®Å8žG·Ð búöç†!÷â(¯k\#Š‹‹Y6u ©k×W^NÖ±c(J󉉨O…ÍÊš]ÉìÏ>A°Ÿ^Z=EÇ3qÐôˆ¿¿ÿ…DØ;åy–ux›çâÜ.4‚ð7Ö½gƒ2’¿_µß{|Ù;µòbF?¿Ly½øhLòweÊ p¿CîνbiŸ¹Ü™õpIòçªàèšÌýa=ûó­¨}sÓ QÜÓ9 }-Û—‡¡YCnX6‰üÙË)Zº†²u‰§Ýôêðº%€1pkÕ亪— _Oa[¾ƒ°^ð9´‰ï?ûääœ@:7ó"sÙ×|–Ï£÷u:OJ|‚0džq%±v¿õßýéSåITl³¿{Œ¥Ò†K !Äuñäx©.¢M")ß’Tëû®×*Óæ=š6ÖtÓétP¢+aÆ’ïX4{&G¥r<÷86W7wî¹û.ºõí‹oTŒF£M®f³™¼Ã‡8ºj9Y¥œzOÔv3É{÷Ò8,Œ‚¼\JrŽcPê(¨°àá0VÓÆ?(KÀÓÓó^ÙqPQjÁyQ9ý;ë^ÈC­•òJ%¾aÞh”ûKò?‘×Kùùººäï2Õ÷9Wn?Zvë|eÓ>c¹³êáoçÏNÖŠÿòÖr=·?ðb|±g'²z[&åÎ0ôµmûж™ë‹B§!à;xàe8ŠËPh5¨}},Š£¿ÎçÛ›I+²ãÝŸ ¤‰»pa=¾ž¯g,aSZÎÀ8?zK^©¦œk˜ýÅwl9ZŽ!<ž~£GÐ=Ê Eµy DuV0'kÝ ^[³žÃ}âÑAÍðTº0gÔ.5Ís’øñ³gæïœº¬¦¾ÿÓ“MÏÊç-zÖT7æ&?3¯Ž¡Ýs”‚" A]àÑÁ-ð²žgÞSsˆ|y"}}0ù¹%4è߀¤UÛI?a#¼ß“<Ù¯z…ƒ‚­sùlþV²ŠJ(·W]ö[?óOÆjhìuLÛòçr/:ÿ…3ëê?=ÙôÚÉ4+ØWcÛ¨áÚZžÄÂeù´{ä=ú7s«zŠº‘Qgç±úmÿ×*­}Û5¶9ç](•§*Oéñ£2F‘Ð2Nd`mØoŠ8ZèFýyé•DwnL残ÿØ€%s3K¢éÝŃ5»kXȚþâv ÖR—òÕŠï°Þ<ˆÁ#{P¸ák–lÊ ¶ƒs¿iÍ&¥  ïî‚¡`so"#v kÌž}îææy_“Öa4ƒèÀzœßØ‚£Ã`Œv§xçwü°6€ûY—É€±´çr¼Üó¬'6Uw!Ä­œ]‹¿emJS†ÆQTæ÷ÕÇ©?`ƒ}ËØµä{²â†Ð³¾¬™ü±t¦63ØHùþ_YòÃj¼ïëE¤ŒÉ/„ø·N<:¶$üýÇ81y>Çÿ—ÝqÍWžB£Æ-¶1áï?†GûÒš®#:N‚#׫ÕJÞ¶„úûŠ%‘f3*« - Âüü¸½c'´>Ax¸{ qÚ):q »B}o*Ö[ëþ"zÜ„7¸ÿµØ6p/ĹáªÜÏÌ–âôS:úpbÅû|<7™ú7¯gþÁXžžò‘¶töúsë˜N[×¼w OŸ±Œ/Z]âéYÍé¿b/?ìîÀËŒ$X«ÀU¹Ÿyçl;•7z™û¼ÄÎ;?æÙVnà(ªŽá®—‡ÑØXȯï¼Éœu7ñŸ^¨Ì©Ìû`™]žäý¡LO"ÏׇFÕ•óÃo)îý,“^¢hÃ4ÞýpAï>DKõ¹y;‡½€´â&<üÞH‚ŠVóÉÄÏYÐ⿌®”y5¤«:Pã¼³÷ùuyn}cNaÓÙù¬­n¬'8ªΓ£q/ÛÁç/MçÛ–ï3&ò<óNW™ÊšŒÛyþ{ðÌ\È ï,&å–§‰sídæ¬ý4æC^-à×w?ààm/3¶¹¡î¿†´Ûœj>îçÔæ6ý½¨½üÕoY;HSÅòH#·óüjü7·]C›-O\ââ(ÝBiÚªìwRѨ!® ¬¾´jè"Í^DDKwœó/.q{>‰#¬Ë=ªÕrgïKLl8îJΠ0Œ:-cüÑ(À'ÌŽcvrnàDíKÓV‘xªï0ü‡)®vÁZ®•Ù»HÓ·á®&Þ¨à‹gÒaŠÕžèÌY9^Šd ágŸ‚”Dµl ŽJŠr‹q¹))Í.ÅŽ•)—bu ¾j#áa’rÍ(y`ÍÞEª¢›¢Wƒ>¦#­v. 1ÓLd#9Ž…ÿÒÀ €Gû@B\s‡¥âgŒÆ]£Å×7€Ò’N/ÄZ^„ÃfE©U uÙQš+¨4•c)7©çš8¾ø@²9m%;ÜoãÕÁhÖ±~¿ïàD ¦ƒì>Oxl$Í<Ç™ƒeªÜ«Y†h†<]ýÆTþt¼£ã©ÀDMÛβ†žµž-»ß„Ë^FΑ\\^* Ró°õ Ä–ö ›]y¦w4> QkŒUÏ´g•óW¶*;óÜÍQxhÀ£Óz¬ø¿ì7ÛüܼCSÎ};é©ÏÎômñ=_&æPf«9ÝÆºZ¶Ùšó×¥Ã|Þ:¬­nTêâÚ7ªêå`lÆÍÍœLOÌÁyžyg”=„Î=bñS+ (†0e"9åN¶£œÐ6¦ˆ…&¦1ZV1¡Œ÷­{¬!mêúeÙó•¿Ί",††x¨*Ùóñþ»Ó 3àíwp‰¶]C›±EG"£–‰‹á¬Ìbß5Šœ,,æÝ乊È.Ìf r³*(ÕèÈ®¼˜Ëœ”î[Ë^ÏÜ®ƒŠºFrTœ1•R…gÆ$Q¢R‚ó‚>¼éÂV^FEîVÏÚUôt9°(ê£ôïÀ=·³nÃ7L[]¸[º“áö×*\fŽoû•Õû+ñÇèRàrTÕ“Ê3Œ`×åYö/åðQ ~>xD´ã…7n#ðìdZ àÑ–½ÉÝ2ƒ7?ûš&ÜuÎ)Þÿìe>z˜¦úºe¤Æm;òÉ<íOë‘Åüß_ƾõ8ÑnNr–ogmjU:o#ê’LŠìà­©½œšÒã”ü¹œ½„ã¥J¼ýݸàG—…üã&ÜcŒ¸×˜®;]-ÛT˜Ï_—çÔ÷¹j®›êòmæDf9îM½PQT÷y5íACZ*™3ëm’Z‚Ú<ȈXK?h¢â•ÿ$mHkØf³þp%c µç÷RmûT›ñ!´çËLé)ç=qñªÇ‰ÒH«{£ÕŸÍÕ´—o¿N¥ÝÈþDjÿáB©=ðÕ“v¬„˜†6nØNžÝëäñ§Å]ï¢4§[¤ªà–40ÿÌ)áôh€ÆœÏ ³'Þ¦½ì5GÛÈƒÑ Åg0VV—;.œX‹±k_ãÉ™æ ¶§ûqÓ=½‰:ëÚ¥ nI#ç¬OjBïFÊ÷o ÑI0 œño¡P(p¹\(—oÈæj{2šBœ‡V«%´Ó˜ÊlÚí¬J?ÆÜ”Lüí7þ»âgþ³ì^ýå–îIfÍÑ ÊNN›8QTЦcü…‡£Ðcô€ü´˜íV4 »gú‘¹kQáGY©Ù”íÿ™·ç`AƒW€zœ8ÏX×Bñ¾s—q˜ö³ð£Éü|ÜvÞ¬è«Ý¶ùœ_ìæÌ.'æìüº!‡?S74¼•VÖÕÌ]q€«•¢ƒØ^‰«šrÆÛ×2ÿ÷#”Û*ÈX·€_Êcéí^·}{{¶¦Rd5“›¸„oÑ9!ZÒ5Ô¶Í:Ô¥ó¬2Ø«éÊP[Ýü™ï]›Vå{Ç"¦Ó9!°êWÚæÕ…i/?&…qÏóo2ñÍWytÀiŸÚrظh!ë³­ÿ©¥j/¿µÂ…í¬çH…g,ƒ{{±aò–ï΢¤¢ŒÜC)-sžÛÎÞöiiÖ¥î«k3ÕÕï¡ï?fÒ²#Xþ ʤ/cÒÇß‘f>YX[&+&Ä¢r¼ŽýÙã$:"„ÆÍ[Ò²yCêE5#6¶)‘! iÞ¢ õ ç¿õ^>õ&Íø\Ë1–Ný„ÿ->Hå•*”:ˆ6íÂ)\5“)_ýF~ÔÜàñ瑨#¼]K »ç1åÿ¾'ÙB×þÐ'-áÿ&M⳯W’œS‰K£¢pÇ"¦ýo2Ó–¦Ö¥§­\[¯ þ‡ùnêfþr ßf¡èÿÜ„6F‡Yúù'|òÉ'|2é3¾\´Žô èÂéÜ¿#û—òÅ”é,Ù­&¡_7"õòM!þ-t:¥¥¥¸\—çÃå.—‹ÒÒRôúKÿºžô8Bˆó0 „÷éAñ§“쮦Xn.G‹ËXW\Š—ZK„»;Ñjò´ž™*©,-'ÚÇU¯.vòV¸ÓtÀ­x~ô*¬Šæþ‰Ï1ì©AÌ™þ.ãgšPyEÒaèx†„jÈ^ð6|V†SÎÃ!ÚàŽåÔºM<:ÜŸÏ\¦‰2_RÓ0–Ø!´ö‘n1Õlûa¢ϼñ×5@¿ˆxoìÜvf@ç&xìÿ³8ÍþÔ`f}õ?žXTõåš¾£ZU[Î{ŸÌì/>â±¹& mè÷äHZz(À\‡j3„ÒÐò ï<’H¾¾GO g=5 bjL·¶ypzþª¯Ë3ë;šû_î{î C-u€J!w9o=œL¡¡!¨Ê7æóÌ«Sâ­ÏT>7üäSÿ&·0ê‘!4'ƒÍ¿üÀS ÷7äoýh}ö¾<­j-¿¶-–òÅ—èúR|O5+-áýžçÃ7ÌñßÙQyE’Ðw=BÕ`­eÛoŒ=•f—§k¯ûšÚLuŠ¥‘ª*ÁæÂ…­8ƒ´TÅVª†R°—‘šJY¼¯Ë\¿\U_Ús¹pºœU¯µ¹œ8.\®“ÿêJŸqŸçkÊ]c›ž;CÎíÞ÷W Ç«5÷>ô×€MÚˆ>ŒVݲg®wv:>±}{Úvš49üÔ…vbèøN§ÍlN÷{šÓýŒŒyÓý®Ø³¦F@\ÿÑÄ6©åÉ?l'v’¬íÆè MñT‚Ór‚m ±5#žúM hZÐãîôÆ'Ä¿’··7%%%äää\–à‰B¡@¯×c4/}Ú®ËþBˆ«X~~>‰“¾dú'ï‘íc`XÛ–8 +HÍÌC£QÛ ³»’ï’c´ÛéFËöÝ {t,~~~Râ\æ&?õuÕg{ë©ê>¯Ž,©sxsi$Oæ¥ö”oÿ”IYƒy¾_ˆüŠ"Ä%°ç§ùì.¨½7ŸÆ¯C{ˇêÆEÅþ%ÌM¹!Z`T£ô +nƳß=t 3—âò‘3ŽBÔ··7±g´=žxëY’ ŠèÞ ’|XNŒõ(0•“YXBûˆ@ÂZÇ8fø?ñ×Öƒ5þ]Û¼ó§kÎˤØvr0_®Ê\²Í~ÜPO#ûwfþèFÏÇ‚åF@ˆK$¶÷Pb¥.!n »Ð>}%‹¾Ü‚B£F©ñ¡Q—þ´“ ‰â2“³ŽBÔåd©VãíãCì[YÜncî@T@0õüp*äY]¬MË ÖÛ‹Îw ¥ñaø¢VËiV\™¯6Øôo?ñ=J¥®m‡=Åõ5(+Z0ä鮹ËPgBˆ1?-zÞôÑB\ñ;+yUG!êÎn·SRRB~Î ~]´’´4Žef 4zÓ¸y3úôF š!„Bq À‰B\‹ÅBee%‹§Ó‰R©D§Óa0.ì+:B!„Bˆ5 œ!„B!„BÔ@^nB!„B!„¨N„B!„B!j !„B!„BˆHàD!„B!„¢8B!„B!„¨N„B!„B!j !„B!„BˆHàD!„B!„¢8B!„B!„¨N„B!„B!j ¾…KJJ¤Æ„B!„BqU2¼ŽÂår¹¤ê„B!„B!Î%¯ê!„B!„BÔ@'B!„B!„5À‰B!„B!D $p"„B!„BQ œ!„B!„BÔ@'B!„B!„5À‰B!„B!D $p"„B!„BQ œ!„B!„BÔ@'B!„B!„5À‰B!„B!D $p"„B!„BQ œ!„B!„BÔ@'BqÉ9È]ó!ô¾‘øøxâãÛsçÇ)XþVš&6?×ÛÞIÂ|™Kã*ÝÈË·ÞȈ™Øÿ±¼\¹òý8 WòÄMñÄú’£¶SS)KšÍ3wv&>>ž¶·ÜÃ+ R᪚W¸uÝqñññtð3v–à”ƒO!„â’“À‰B\jö㬘2Ä’æŒ{ÿ3¦~ö)/ô GówÒ´áÝ¥8.Aö\´´•Có?âWí<Ù7 õ%ÎË•/ß?ë¼yqÙ(=²–Ïžzu•gÍ«ØÃä§>euV$ýF ‡_+Þ{Š/Xq­aâSÓØPÃÑw]¸©O½ÇÆR—B!„—˜N„â<²6.äË™KÙY`?ï²åë¥]ûL>Xv2õÙñŒ?žw”ãÂIiÒ\^¼·'7ÆÇÓ®×|´úÄÉ^NжNåá¾U½Tz>À'ë pÎÜïÞqßæCáâ‘tŠ'þŽi¶‚%å}zÅÇs×ÜªÞ ¥¿?H||;]_ÎÝO|ïwùuñ+ÜÙ)žøø¶Œÿ£jÍË_œy¿1éë\ÚOAs·ÚóR{švr×~Êø~U=$nÌÓ_%Râ<_𵍥|µÕ‹ußÇÜÏ=_,ბ·OÏGfs°ÒUë¼ZËWk]×/Ú?™¡ƒŸbvqKšº9ÏQ–®ÕÍ zám^ÿÏ=ÔÙ$eVbN]ÉöJh0æž÷,'DCÙ|—lºjŽ+ka6oÎ\Oç÷WÓíóD¦µUõ˜qV2wú*Z¿õmß©ú×nr ÛN¶SN/L_K»w~£ÓÔÝÌɲÿ ²W°lùº½÷m?ÜÄó;Ê©°ñâ¤MLËw^X^jKS!„8BQeùŽúu×°ne:VG![çLâ“/ÿ ·š8Š[«g˜ùÅDú¾·óÆô™Ìœ9›‰=P­câ#ókéM¼òå ^ípœož{ž%ÇíP±›ÿ½4ƒ-ŽÛyë³×èîJäë‰3Øg¥oW^ûhá€G×—™6s&³?HØùº°(½ˆwƒÜE¼þáB?ÁóÏ>ËàZœµåå” ’¿šÌ–ÀaL耒ÚóRkš;ùø•Ùì ÅÇ_LãíAnlýê#±þ#å«•Z‡88on÷½Ç[ƒ)Øü9ÿÛR†«–yŽÚÊw‘yÑ„öåõÏðë×ÑÆëÌyª [yêýÿòBß0Ô•ûY8#èØÈ —½àæm@‰ch ZÌd.º:*g%K~8Hê ±¬x¦+ oÕ³léA¶š—ƒ"‡»GÞ̶naÛ ·°åÑf´Õ¶R>[t˜¢¸xÖ>ß•9íœÌXrˆd[Uà.mÓ&›ÂøòÉn¬½·'6b½Éuñy¹Ø4Åu/??Ÿ¤¤$’’’HNNÆl®ëKˆ.,Y[XòÅd>™ô9ó~O¥ÌYÛô33¦Œ]¬þþ+>¼„#–Ó¦ùƒ…_Nãó©ŸóÕÒmd[¤ !Ä…PK!Dí:z-á¹×ôô}íV´¶T’‹ÑL¿Ÿ óMz(Î|–÷ˆ ¦©`=à¢q³æ4>ùì\¶þ;Ö› æ±éAc˜¿ìm¾[{‚AC2òóyÜëJd='îÑoñËÆ4r-€—7‘B0&¿†4mÞýÉíÕ>nŠ w_7 ‚Q“ù`LCþ|Œ¯5/÷„¢ì™?ðáwz|8”†®¨®9/e)µ¤ÙßÝ æ¬}ì;Ö„.C>gÍ#†“Ñ{mi8Kvòõ´ŸÉ´¸s÷xîˆÒÖZ>KI-Õrr—yuzˆÝÚ  ìŒÿ’oÉ:R„#¬æy¥êÚê̿ƼÔV¥Wcâ뚣Lû˜óÔX¦PÐtÜëÜU_ƒFÑš06°wáRvµ¼‘£ wblfÛ?vX­VòòòÐh4Öis~ï.;Ì…6*•º 35‚ IDATunÎKm<З°¼È‹1­½pW€{Twèwð}Žƒö¡Ší*‚ª‰9ÙJ Ølõæ©æîèÕ¢Ý7$ós~cZ˜Xžì¢ÏÀzDjÉWÿ™ùªÏœ½û¹owiJâ:·äý^jËKXEÍi Q‹Ã‡³uëVìv;Z­‚ƒƒÏ¿¢-‹õ+’pë2‚G"Ll_ü+„pG£âê§Ç¸sæUHƒOp†ÌÓºìY³nÕQBúŒ`p°#+çóÛ®† kç+;J!$p"„—Fp¸V›õý´ ¿[‚fó©y4o¹+. 'æÂB¬À¾·{“ðö_s¼æbu:ÙýÍ›|ºb/§îw]§‘qq¿* „.ÃO{?O^Åà,aógÓ8Ød,o%xucîºðò¹·áñWî$ïýEL{ãw¦Ƹ1ü÷ƒ‰óRÖZ>—é+,!õd妮œ œÔT¾ºñªç]uÔêÑN‡óT.Îg?Oùך—ÚÊPWÅf=:ŠÿíQ7~:ŒˆÆ ÂðÄ ¥LX<•NÅ-"-å¼Ýþ‘c 77—¥K—b±Xp8DFFÒ§OT*UÍ+Ù˘¶(ÂñüÜÒ {ÎQÆÌIbND;î·–Q ÷ ÞŸ½ŠT:nðtò{¾ gˆƒb‹…}+¶² §³Þ‹¾ÝšñD3J(pý5ŽR…ÊÊ®R./{*Õ´;˜ÂÐ…daà–.Íx®¥{U Î^Á†¢FÌy¸)Æü£Œ˜µï£TQs^çISˆ@vv67F§ÓqðàAêׯN§«ù°ÉßGº¦9ýx¢VyçîäLʼ3ª^ábÕ×p»ý>º‡iqoFKo{ÓþJÔQA9ÞDûjA¡%¤‘Öƒ&@'B!!„ø¸*ޱ3ÙLý¡è.$n‚ƒŸZ r—¼ÓÕûT0Bå„cÇK¼³t/þ#¾ä÷q‘$NèÎS[ª Vœ`P¨Pæ3N”æ”V³m=Þe󢬇æóñ*=w|Ñ—°s®Õåå|ij íñ,_v’ÒŒ¶ü8•‰_~ÁÇ+0kPpÍåT!w3oûݵÔíÙå«k½\ØþÓŸ§ÎjÌKÊP],ª”mŸ<Áÿö¨Hxj& mˆþÏ*½ˆ?…onÏŬ¯G`Æ[ |®ŒèÆÆKÖÖív;&SÕ˜)¿ÿþ;¡¡¡ôêÕ‹²²2æÏŸObb"7F¡PàååuÎú¶âûcç%1'4¼¥–öq~*ÿ@n3e}žƒ;t5çÅ^[šþò¶³¨ÞªU«HNN¦^½zÄÄÄ™™ÉÞ½{¸ë®»jíyb-)ÀâÑ€­·?ZS%…ÕO¯ ÿà` †ZÚ£>œÖ›Ù¸ù0~둟f¡~³@ÙQBq¥'[r÷2mïì/>†Év}æ®1íÁئýIŒ‘–&ÄÕΙÅïÓßdfb*Ä?ÀËÍÏî}~nÍÐÉ}¿¿œÝѽñKû–Éßf“ðÒ$FÛ,ا¹Ãk×2'Õä“ràâƒÐºùcTÂÁÝkÙ´GÑì¤^ËX‚ü¢R~^Ȫ–Mزð0Ô!gµåå ïVMúš¼ö/2²ù¹=”5奖4)_ÈC?¥¼ßk¼Ð'c€/zT¸»ijM³žNqQ»Ks‘õrÑuæ«»È@\:[6î§ÄrœCå€e?ëVþ¡ Ötðùÿ.É·ÖÔ/þÙÓÔøÆ`@Äïó [ƒ»3²·‘]ßlÄ2œAM l|ªOÈ´·}xä4<^ý†‘ÆðXb6þð|ó¶lÙ2ÒÓÓOý€R©Äh4ÆúõëY¿~=½zõ"::úŒõ •j §žçôU=Tœj5§»Ö›^mBññR`±ºÐê”(5^<п٩t "˜Åüc6F´öbìÀ¼þC"·®WÒ8&œîŽè”(•*4$ø¤R@h÷¤³ ËÆh/@©&èÏÈ“BÖ…Éâ÷šó¢ª%Íüur^çØ»w/)))ôíÛ—† ²iÓ&:uêÄÖ­[INNÆÃã¶3«•Vuêl¥PiQ9,XmÕO·ëÂèØ?¬öL)ô6…ÍYt  ³WCêIûBˆ+8Ùt"™W·Íà¶£iå׃úú>!WÚ-$æ§òÒÖiLlû킚JkâªVH¦ó&¿øíû ¹ˆgp¥÷M¼<ù1o}Éã—€>”÷<Ã}­½ð²ŒeLü>Ÿÿ4O&ÝÍKÇá|j*³ß™Ç­ó§©±?Ôžç¦Íâ™Q³À£#o/ù˜z·2aÄ2žž¹˜7Þ»™qúâñþ΋͋'•{¦2ykÃæÞB@5?b*jÊ‹oÍåÓ*ðì#ɼñÅë<´ÈÚ âîz“—oñ«礦4/2p¢¼Èz¹Øý§8Ïh35±çýÎÏOáè©)¿3éÕß¡Õ;,s€l€ŠDÎH<µDˆµýânáÅW·ñÜ?ðÕ4ðŠîÇ«o>HŒÖU–c5Yp:­T˜M¨ì•åXËÍ”·~ýúa·W ¼téR’““ £¤¤„ŒŒ ºvíJLLÕÕ½z Òê0ØÊNÀÒIQa%f7‚<½ð7Ÿ KݘQ½|ÀQÎg¥*hÀbbk¦ƒ& ¼0žÜý¨ÕU¸‡óÞØˆªvc)äùÿÓÓÆW…ÒàF”ÞAžÙ^ À…P*U›N%Ö“=š\Šm ™¶“ÔÛòq+7¹é<8;›®#íkeÉÜ­,ŠjÅ´Ž”ïßËðU*ÞC+kã?O£^¿¶¼xƒ†ÂC©Œý®”¡£ãêYΧ_ì"³s[ÞŠV’´.‘§…òõ½a„(ìøi#Ï›3«^9G=/>£¸Ï£˜'ï`Wó6Ìïჾð£¾Ê¡Ï˜¶ õ²Ô˜—8m-iúJðDœkúôéÄÅÅ‚ >|8¾¾¾,^¼///ºwï^óa“ý;³WèwoüU.Lû2go+î½1“…ÕL¿Ð ÎJÃU¶‡y_§ÑaÔ@¢tNŠwÌçû²[Ö55à(ÜÊ7ß—rߨ[e‡ !D]²'K2h+¯¤œ£]` Ïlš"q1›Í˜Íf¬V+NgÕÏ©J¥­V‹Á`¨uà7qõY•ÓŸ÷Þ(eáÚtº ipÁƒ qµó÷÷çþûï¿°¯ê¨=yðÎF¼½l;ÝsàP»Ó½G,Ãü•€ž¾ýšpðû=ôÚ`CçãÇ}›ÐJ Jm¯÷-åå_6Ðn¡—wõmÁ àÁ}=ëñôÒ $|§À?<ŒWï%D  ¢u·Xî]–Â÷S°ê<èÕ½C|`uáT»ÓI—ɸϒɨPÐꦖôõVÔš—ZÓ8]Nöfwá!J¬åhU‚ ¾t j¿Þx]Ö‰Á` °°¸¸8ÆTõÈr¹\÷Ë:jÿ¢ìËÙ’Ú”‘ìÞQLpÛP<ü=«®·gã/»ÐwìIœ_u·õJ ~Ø“ör¼"€ún ¥Ò=Z°B\€KÖã¤Õ‘ìü•Ô¨ÔÍ5Íf³Q\\Œ9'‹ò¤Dìyy(NJ%:½CXÊF1¨ýðööF­–ñ—¯šÉšã*÷B×pòÈ$„¸Þ­ËÙÃI È0åžû¨®PÐ'üF&4„¯Î󺪗íÛ·³qãF Dhhè©é7ndÛ¶m 6 ??¿ZRpaÉÚÆO?m&½\CPËîôíÒeõÓÝ+÷³tÎzÜoN÷ l–ÏøŽ´ÓÞT‡÷fôÀŠv¬â·ÄãTØ]¨ýšÐ©ggš¥¥BÔÕ œYÊX–±‘݇0;¬„¸ùÓµ^+:5¿¦*Y'WÞ䇟'òå‰ô­wñ ‹ÅBa^æ­ëPdfárª°ã§7_<Ý<°™ ))ÊFÛ(U\'|¤÷‰Bˆk†ÓåâÃäÌ;ô:•†¾7Ò!°z¬NJ2ø)c3ÉEGÐ{óAÂ8Zø6¸~êÇédùòå=z”FáééINNYYYtéÒ…V­ZI#Bˆ«Ðû–ÞÊãÛùÿöî;>Ê"àøgûnÚ&ÙdÓ{ •‚$„^D@¤¨g»üTN±Üyž Û) ÔSAQl(5G‡- %½—Ýl¶ïóûDZ((à¼_¯¼ÄÙç™gvföÙçùîÌ<#–=ÎÂCk ó $I…Éiá‘3¹+ï5Z­—F ºv1eñc¼Õâ½é|±nà‘aÿd»ÝIÉôáܵªpQõíÃô !(À@â°X×ì×AÞê"C&ûõ¯ó›Ï3»\4ÔÕ±òÝ·™ýñg,ܸ•ê6 Z_?¼|°ÚllÚ]È’üüw-k\AÕÑX_tqEAA¸ÔÍØý5sK~"IÅüÿâñÌéÖ…´€Xº:p]ü>î;•©™7Ðä0óÀúé§•rÙ^XËå >œ`µZ)++ÃËË‹qãÆ‰ ‰ Â%ì™G°¼r ožÅCéã¹6~rÙ¯ßk¬M<¼a&wÿ÷ß|ØûQ´ ±šÀŸÔzˆm:j;Ûw@§áZ0¯fʤïé9¿ˆ•Ýl|71‡IÓG²ùQ75ÎTž(ØÊ³gÙñÛ'X477³øíì[¹³ÝŽÝfÇQ_MvJ^:%UÕ¬,(¤Õå":؈Òmuµ8ôFT£Æ$VA¸¤íj>ÈGû–ëÊ{½ÁWåÕη­ŒqqýÐ)5ü}ˇ<—?‡wz>ô§©'™LFzz:ééé¢Ó‚ \&~÷'6·ƒiŸ11i×' <.h¢ à­RokáÓ’å—Â×ã7lç2Ô¶þaºw¹•EK [b £>XÊ3×ÜÈ*)÷t¤wŠ2…‘^c’hÝ[ƒÃm¦Æª':ð 1@ÉAåšøÇ=7sÓ-÷óü¼BÌn_¾›'—Ôâ>²™µp<µäø>k³Q·¿„Š?PÛPÉ%C¡T³ÿà*ªªPÈe,Ú‡ÂÖ2%u&:©H½†Öµ«h-+Çn·‹ÆA.iìý ‰t¹µÝ É±®‰Ê¥X6Öí¦ ±DT  ‚pÉúÝGœ¬«-ÄævpK‡Á'½¶½±„»‰þa]¸!áJÊcbÇ«O‘kS~˜K@L8{ªK©²Ú‰ŽŸÀËéébbsÑ—Lß·‘íVÁÃy¥Ç(²Ô2ðÔòÍ–·x¥¬›"˜>©wñL¼†å[OHë‰Ô²Šç7-b…ɊοOö¸Ž~Z–¦å<½a>Ë̱a]ð–dD‰¾t^xu•Ÿæ´rí¶GXx·…ùŒkæ¿D¶ºÍ gyêéoH{¾;Û4sÕ„.x»ÖS]¿W¯ŠçñZˆü3gÞO7ý á,WÅÍIÜ;í6BšVðú³ïðE§—¸n`G>Y¸†Aƒ1*”m(ƯûØ“'û—.#%,œ£™¤ÄÔf£Æ¤$<<ŠØä ‚ v Vû`ôõÃhð'4<…ÇNõ¡Z{vc‹k‚ —¬6—¼Ú¤Ä’˜Ðîv+ª¶±øPÏ]q^J ×' dEÕ6–Wl9í~‚ ‚ 'ÇØ×RNª,:… ‰õµ»È5¦‘ßPÌýëÞ`bÒ0º%1½pv·BuêÌܵìQÞÈôAIøÙ·òIJ˜úO¹±É“y°ÿ dj™»ê9^:Ø“98êðz}'fŒø'ÉîR¶Xq7Ì>)MíÜÇ‹y‹q¦=ÆÏÑþ”½Êäütéªæ¼ùTÅ=ȲäXl5 ¹¯Æ#zÒyd¯¯Am@å9ÍR³œŸUCø8: £ûZ²Âº6~’õâ­ä‚€1“ŽªѓΓ/ å/Ó–SæÓ“4mû*Øz½ŽÏ¯âÖ¼·¡€.öM̸u4ÃÈbë»é>~䑽s¹çÉ+yeòr ÇiŽ"ÇË_ƒÃdCòêÀ€43_æ7Ò7-ŸÊ®Üm<þcáv»)Þ_ŒŸO´JÁ8ÜNÊ[i³´àk1á–Z%¡q;ñXLX››°[Ú™[qÿ¼÷=nѸ‚ Â%Ëä°pÌã…gî^ļý+x»çCÔÛZøÛÆwðVjy·çÃDxþB!“ã§ö¦åÈþ‚ ‚ 'g!Î7Œ/¬ÀåqîeàýÞS¸ç¿¯sWòHnLôë tÓ~½ èg;½A†N­Ân·á‘ZÙ²çC^3O=kËŠž½úkÞja|–Y›‰6IHXÌÛ˜[Z…Ã@¢¥n ™Œ0àmÀ‹jë–ò±çØ´´†ôs¼Ë«Ry6. ­£ŒBG0é¹dØçðNY/ž‹ò¦äÀ26Ú%bD_:?œ”ÚCÉô[Mªè@T€¾ÿë̽ývîîÎV7ºÔëycö] Ô&³éþÉtöÙNƒ&Š^Þgá”Ô“²•é"H°ÿÈ ÷m£^OŸ‰08ìH÷WGÓ»‹ƒ'ó:3.âäõtÔj5á½s)ø¬˜ÄŽª*Jšmج62H eíþbüý‘áÆO‘I~”Õ4¢3YPŽë*†A.iZ…šÆtVTm£ ±äèB¯Y†Ž|ØûQ”rñ¾á'í7·ä'„e‰JADàä\ŒŽéÉaaêæ÷Xxh-½B:¡Q¨¨h«gñ¡<|Õ^Ìè1oå¦\Èux·~ÏÄÅ…ÔªâÙí^®÷U¢Òàvýܵp¾½¸36 }Ý‘]”*ì˜ÆÀ fÜÊH†u¾›lm!Ó·›vWè‚Èì5ši›^¢ß–6ڮθ›Ô˜+øGv S6?NM¾d$ b_èIç‹*‘Éß¿øß×~â£mH¯G°ãÑwÌSóóÔ²½ïõ§¸nü);/ŒY=‰RŸüªN§#êš«h}ãßì,‘Ó¦Õ ó¸imm¥Øl¦ª¾_¹’D ¯·\NYCv‡xäƒû¢ÕjEÛ^fl66› ‡ÃËåB©T¢V«Ñét"P&ÂeiRòpVUçóÏmñqŸ©GIܱÑ$ß–­cEÕ6z†¤Ó)0^T  ‚pÉ’I’$Œ:Ï»üqÿ9§}ŠMÌ;°’‚Æln;á^Aô į́ØÞ¨ågˆé¸v1åûÏHéÿO&ø^ÜÓ ~KÝ¿ WÃ&f=»€à‡žå/Q§îwõõõLÿ˜9Ó_f—ÊÅЮè Ñ±»¸³ÃNx€ž”!l®odÝþ :hTô‹‰ 9«“ïÆ`0ˆª¾L8Nš››±×TbÙµw}ž6 Z?=^‘È’Q‚ñ÷÷G©TŠ á²òÁ¾ï™±ëk’ôQ¼’sÏÑE`å‘$æ\ÅË;>G¯öaNß'шÊA.YèU}¢_S3oøo{%ÑŠÂoä¢ò›¿óøW2®û?®‰lÿãàïïOú=70)6‘‡Ÿy”u¥dä^AŒLÁîêzôaAh©®¬Ãln%#2žÀôL‚'ÝŠ^¯U}™°Ûí4ÖÕѶ)EE jä¸]”>züB5›iüñk”q‰8³züÇŽ>±òæC6õ…vƒ‚ÂÌVÈ›Ï&öÉg&ÚH¸øMè8«Ë·û¾gÌò§Ñ•þaY„êqxœìl:ÀâCy”˜+ Ñ2=÷þ?UÐD²×°+¿›!•ÌD”€³a/ÛöY ÍÈ Úûâxº€dÙË¢OÖà=âbš² ‚pa+äÍ)Ÿâ×3‚ƒÛÒÐd'¤ßÜ?®~r 를ÿÎ<6VJ„uéŠÎ !n»—~Η?¬§¸É…_òH˜<†$o [ÿý7ÞØÕ »ïc¢o:wOû?Ò›VðÑ{_³¥ÒŠ&º¼ž,ÿö'Uêè~…Ÿ+Zp²ÝãÉÀUËÚ_çÓ ÕØUÁt}/w^…T~.Ç”°•b{Ÿ†ò¾…+ ßbæ±ï奄¬ùÎD¯‡çꎇoî¼sþÂm§­§ÿ¡Ü§k³#1®A§bIDATËîù¼øÂw6y“ü—GxxDtèæÌôžöÒ9×T³»9‡±7öƒ¢Eü燯qô˸ۮ¢1o Ö•‘12þä‘uŽ* º2æú¾èò˜=e£Hh·|Z⯹žþsçPœ;‘±ñpTðóâ ¸sÇqg²7Í[¿fñªCwÚÚÊXFMê…ÑUKE«ï 7 œŠHzŽëK¸W+ùó¿dUa*×eé‘Y÷óóŠ bFÝʸ@3ù R™5žÁ1jp”³zQ–®c¸}œžÖ=KY°xþ7 !Vœ"A¸X'¹!é<—so.dÊú™¸<î?uŪäJÒãx>çN²)¢§ Â%ÌápP¹q#±azâ#‘û豘M´Ö•áj5ᣔ“•š„1­F‹ÓÔ„µ©pýw+Ž+žç3w0YÝñ•ú4ú§y˜µ­šV÷Ol–÷á‘ᩨ”ÎDëò\Ñ9¨7’ËLõZ$? Eu8‡Oºð¶/c‹÷PþžŠZ‘=`øy •ÎL:ûÈnO y/?H¾Ò…¥Í§ºÕþíïGr¬ø` ÂEFîAjçΰÇC[bgÂ¥2etN(v5ég_ý™3rV²ü“/ÙiV–ûº+OŸ~Ü÷C )QxËexB"Ñkdd¦¡’A@d lÆæáäÀ‰2Ôαø*ÿH ²ý4ŸrÃÓ|WVåS¬íʵIþ(e”’ïŽý4+}ÑØ*9Pa"(ÖH”îÄŠó!.3ÜVšj›‘¼ä˜ªL¸Ð£°ÔÒ¬ ';P…L©'*RÅŽZ²DUùÉÒ“nD«mJO:oý‚må6bEäD„‹4pcL%ǘ*jU„ËŠÛífGÑ>T²HB}Q{$,¦n\dr%.™ŒÒ=ùøi|Ifs®†¤͸ÝçHV*$ìÇ.8"ypIr”§\°DŽÆG…ÃdÃÚÜ€Ó/€SÙ=­ìùfŸü×Lhj*Fdx\žSÌM—°55`:´›þ¶ 9€ä¤M–ûÄåzzN9¼Æ‰äj¡ä§Y¼þ¯O™üÂÍ$ªÚ?ž*f,Nú–¹_þ{?éÀÕ·M ÏÙó e”GŸ˜÷DFœ»–ëô¨­ Xܧøô\ÈrŸÜf'­+#S¢VHx$é´û ‚pññX+Ù½]‰¬º»­€:©‰ªÆ*¶[ ¶² “JC•õ,V“R…såÄéÛRÊæ¿el ã³ (ÚKo÷T£8~+¹9ž³X“DŽBN;ç¡öH8[Í´ÕndþÇù‡è’»,yP.£ofMÞg¼·"Œ¬ƒÈŽöâhìZ²Q±i)+öXñŠB/É܇ëIáI¨´’’:;¡A&ö´cÈõA„­µ·W<Þ¿T€Â›@/ûÌv@NA¸ˆ'‚ —#…BArp‡Ê+ ÔzãåÝ€Óí":,…[†B¦À))©mi急 ƒF‡GæÆÕbAgŒB¡PœÓñB½,äU[:¨_|:ê8hò"Áï§lÉFMy+Þ©~è||QXj1»!ð„ÑŽóywe “ž›L²—‡êo7³ªè—›õãîÜÑàÃÔg†b<ˢ˔zû "ná·¸‰6Ÿæx( ê<Šû3¯¦vÃükæ§Dßz.Ça0ŽÌÃQùø h;÷Vn mr¼}ÅTjA.À9^T Âé©Õj:ôì‰Ý*Qï¶±®ªœ5ÕÌZ½Š·lfAÞ¦-ùž•Õ|w°”Z‡…†V+UUõ({t9çõM:õ‰¤tÞ\V•4`n*cÃ¼ÏØKVБ;sWùë÷Ñä°Q»å+æ‡Ò'ÛˆOl. ¦•|½®›³…’Õ?²Ë|øj×ckÁ&x°Umai^5Gò+Ó¢÷úâl.ª„AdY¾ãÓU¥´yÀm.£¨Êvú_)Ý&ŠW.¡X•HœŸâ4Ç“hݳ„ï6WcG…_°-Ô‰çvLí)ËØ†ùy{NxnŸLÆ ñaíŒwùqw-­mÍ”®ŸÃ ¯.£ªõü”ÛÓ¶‡y¯½É’ çiÛ쌿^´³Ÿ ŸÃ#N¶³§´’¢ì,¡ê@!Û·ïâ`e ;wì=㈓–?²dS)&—„d¯cïöjä†ì»N•n@{¡¯ä•>ª›).mÁi«cWÞfê\G¢í25ÞZ Su3N· Eh&ñ¶-¬.¬Ã.ÇZOU“kù6¶7ãD‰Nï‹ê„Q/‡‡M%äïnâè8M[›è=æ¯üõ¯×2,'Š_žx¯Í$ÑSÈÚµØ\vêwç±ÍKçH8áœE‚ œžN§#úš«hxïm0øPd2c²ÚØ_ßÌ’âTÈðWiH ³¡”ÜØ\š‰ðöB>´/Zí¹ 6ö¿»jßaö³“ùÀ¥ÁС'·Ý?„p%àZtµßòܽ;iÔ%Ð玦DF6·O*æÍåŽ÷}Iì?˜ìˆ:4‰£ýÓ&­Ä+¡£ú$á³ç—À‰7©£®Ä÷µ¿sÇòdnyöQn|x,³g½È=YPøÅ’{ݽąiÿÒp·÷Ü]¬W€„Š€„îŒøz:jÓO®QQõÅóÜ7ÓŒGEï#%0˜gsÌ_Šì•rŠ2ÞÃøˆ“óNÖyc?îý=Æ•£¦2E;›Oߜ³¯ÈlFÜ:ŠÈؤóRF£oq¡ý6ãL³nÚÛO„‹Îùq⟊aÅj>»Ž6·Š€øn ëK¤KXôÎëGƒ5~xu/b¼¢è3²'+—/âýÕvÔA d@¬Vÿ9[°¸ xŽœ%{ MN_ÂU¢zAø]‰À‰ ÂÙœ,•Jé~ç8¾ê}ÞþW"‚ ™œfIAÞÁ*Ò|}zã t#£¥RœfAþ 2®¾Ž Q ç‘ ¯„¾t?´Œ¯>Ü€L¥D® ±ïHr‚Åw« ¿óILÕA8{.—‹––ꪪùiÁ|L%%”U”!óõ'.-…á#GŸ€^¯AAAA¸ ˆÀ‰ Âo`·Û±Z­Øív<r¹FƒN§;ç§è‚ ‚ ‚pñAAAA„vü?nG­ ^ðIEND®B`‚icingaweb2-module-director-1.11.8/doc/screenshot/director/readme/000077500000000000000000000000001516513262500247105ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/doc/screenshot/director/readme/director_main_screen.png000066400000000000000000010666321516513262500316120ustar00rootroot00000000000000‰PNG  IHDRxJô¸FbKGDÿÿÿ ½§“ pHYs  šœtIMEâ ,á<6 IDATxÚìÝ\Tu¾?ð×À0 8à€£‚:訣L†FJŠf¦¥µöóÛ&•u]k“¶mï¶­WÛ®›¶vµnëµÖ6ÛÚ¶V[±,ÍLÑHIQAQÇDDq€‡a`¾ŒsšÎ 30(?^Ïǃ‡œsÎç|ÎgŽðæ=ïÙau9!ì"""""""""¢®‰^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.JÊ. ¢®È>?Ð IVåøwÿû.ag]ÏûtáevQ'Á ^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.Š^"""""""""¢.JÊ.èXsF¨‘©SC¯R@.Ev‰o–#§ÒÄÎ!""""""""¢va€·ƒ(eRl˜‘ˆô8¥ÛúŒ2TXk¨ÂãÛ ì("¢ëí¶×uŠãû/êϹoO˜¤üÚñ}á»Àë:¶=“^úÝXk?Þ¾ÝT¿ˆ0ô”ÁÚlG¹¹uMÓDDDDDÔ£0ÀÛAÓ´îºÊÔ©±±Äˆì#;‹¨ijj®]»°k×.”••áòåËèÝ»7t:¦NФ¤¤N Ï<ó Î;‡wÞy}úôáMíbGýoq|ê+àJÏþ¿#R‚_ÝLº˜ÈŸÞ¿v;~8W‡7 Ï`ÝÉ °säQÀoPʤXßê~+Ò´ ðu"&“ K—.Eqq1 ´Z-úõë‡Ó§O#??»wïÆ¤I“0oÞ<„……uÚëP(¸|ù2$ ojw«FýÂñýÙ}=:À›Û Ù31´wàŒ¹§j¯ <4£bza¼:ãÕ£ñä™j<¼õ(ªl?DDDDDÔ­1ÀÛô*…_ûi¢äPʤ0YùË'ÑõfµZ±dÉ”””`Ú´iÈÌÌ„L&¶WWWãÍ7ßÄÎ;†yóæuÚkY¶lo(uK#”ØuïMˆ —"§Â„ßî9‰}çë~ú¡F"AÆþ<~(¦ ŒÅ¶{ô˜¸á Ì,Û@DDDDDݼ@-÷{_½JÁ ׈:Í›7£¤¤S§NÅÓO?Ýb{ll,-Z„_|Û¶mÔ)S0|øpv\O5HÌb†a½S1Pò5pú[%ÀÀt`X ˆ¤á@ý â{àø:G ]oœuvn 8ûû÷ýÂÀMó~c €ŠÝÀ¡5€­¾{üÀ"‘àß3nDL¸kŽžÅ¼ÇÑäQƒÁf·cýÉ ø¶ü¶ÎJFJ¿(¼uÛ0<Áš÷DDDDDÔ…° ‚¯´Öâ÷¾ î]v»_ý5ÂÃÃñÐCy`†„à±Ç|ýõ×€7ß|³gÏÆ¹sçZì¿páB<ôÐC0›Í€ÚÚZüßÿýž{î9<òÈ#ÈÊʆ `³¹gñ/_¾/¿ü2jkkñÆoà‘GAmm­ßçZ¾|9ž|òI·íþœ{Ñ¢Exøá‡ÑØØ(¬ËÍÍÅìÙ³ñÜsϹoݺu˜={6 zîÀ¹a pÇ_€øÛ€^j@åÄÞò;à¦gÜ÷þs õ÷@ŸQ@xo TD t^$>þ;¾bt_1–‹ƒS L| |Ñ÷†În^Ðmº{ŽNQ1‘Ø{¾N4¸ëêRƒ ?ûê0j­MŽ:½ÊH>興ˆˆˆ¨Ûb€·äTšPV×zw#ëïu F£çÏŸÇðááT*}î{ã7B&“¡¨¨––ÈËËsÛ¯ººÇŽCjj* ŒF#žþyìÙ³III¸÷Þ{üãxýõ×a·»G«l6–-[†cÇŽaäÈ‘ óû\b×çϹnjƒÆÆFüøãÂk= ¨¬¬Ä¥K—„õEEEÉd5jT÷ wÜÿûWʯ[î' qqCåÀå³À®—€oŸ*w;¶k3€˜á?í›8Çñ}ýyààÛ@ÞŸ€‹Ž¾…*ˆì½M{_Žüý§åÝòW¸ï#t™‹ÖÇ>š¯éMqdwhû^ÝWê3¸ët¶ÞŠwVB`öо|ÐQ·ÅoÉüÖ÷ÇAk¬6då³£ˆ:£ÑñÇ–¸¸¸Öš!!èß¿?.^¼ˆææf$''C¡P`Ïž=nû}ÿý÷€)S¦>üðC455á7ÞÀܹsqÿý÷ã•W^Á=÷܃à‡~p{ýÉ“'Ñ·o_¬Zµ .DDD„ßçòäï¹ÇŒ8tèðÚcÇŽaàÀ€#GŽpÔ+>~ü8’’’Üê÷(ýÆ8Ê3ÀÑçòêã@Þk@Sƒcý°{ÿÊûç e ߊ7gv'²:ž"®ýmúî÷À±Eï§¾ î±;½* ðmù%¿_ãÜ÷Æ>½ø #""""¢n‹Þ’Si½›‹ÐÐÔÜb[¡ÑŒôì”ÖYØQD@s³ã}æ×þ Ass3¤R)RSSQ\\,ŠGi•J…ÄÄDØl6ìÙ³·Þz+"##qùòe\¾|õõõ˜6m÷ ªÓc=æ@õç\ž9w|| ÀQÖáÌ™3˜5kÂÃÃ…¬å'NÀf³áæ›oî~ƒ¡x£#Hêúuö‡–ûEÅÿôýèÇ€8¾¦½HB¯îãŒãÊG½Üïÿ ¨? ýpóó€Þe¢>‰¤}í¶Õ—Nü´\{æ§ï¥ÝâÖÄ„KQokÆ‘ÿW=-LŒ¼ŸÁŸÇLÔy?ƒåW—‰ˆˆˆˆˆºN²Ör*L°45#ÿ|¶]Í"*0š‘ÍÒ Dг,CEEE«ûÚív”——£ÿþJÐÛn» Û¶mÞ={0kÖ,TUUáäÉ“¸ÿþû‚³gÏ¢¹¹ß|ó ¾ùæÑãÖÔÔ¸-‡‡‡#66¶Å~­ËÓ¹sçü>·D"Á˜1c°mÛ6Ô××ãØ±ce)F%dð:½ÎŒßnåø:GÖU  ÿ-îë"û‰ïJÑÿ§ïMôóõw¬uÁkw³Íc 6w»[c´4¢¤ Ña¡¨mlò¹ïòƒgpçÀX$Æ:2w£e¡èŠ%ûËøÀ#""""¢n‡Þ”•Þ2)ÝvŒÙºDXÿþýââbX,Èår¯ûž9sf³7Þx£°näÈ‘ˆE^^fÍš%”L˜=wÐ4¸L¹y`®ô¾oÔ `Ü:jñÖ”?~;êîNø#߀~Ú¾35}p·¦þyâ¼Ï}¯45cæ—‡±óÞ›Ô§Êê,˜þE!.5ØØ‘DDDDDÔí°DCQʤX U îuöaH¦L™‚ÚÚZ|öÙg^÷³Ûíxï½÷wÝu—Ûë'L˜€ãÇ£ºº¹¹¹HLLD¿~ŽÌNµZ ÀQ.aôèÑn_Z­MMMˆˆˆð»­¾Îå)Ðs'&&B*•âðáÃ8zô(F-¬€‚‚œ8q¢{fïÂ5 3Ì}[Ì0ÇÄiÊ«åú&9‚»pø= ôkÇëû´q‚:IÏìòüèȬ^4VƒHië?¾˜¬6ÜùE!~8W‹;¿(DÅe+vDDDDDÔ=ã=ùâõ*& èÝ!ÇÎÔ©¡ —bñ¾RŽ2¢. ##ýúõCvv6>ýôSØlî™~uuuX±bŽ9‚Ûo¿#GŽtÛž––X¿~=Μ9ã6á™L&ƒ^¯Gnn.Μ9ãöº 6àü#.]òâ(_çòè¹år9F}ûö¡´´£F9‚ ˆŒŒÄ† ºoýÝ@Tå–‹Žïoœë(áÐg$0ò`ê*`ò `À­ŽíÎI×`Ø}@ümÀÈÿ ÿ¹ÿçkv)I Ôþ0îA>->½çë0B‰uwŽF/?‚¼UõV¤~vÇMWø#""""¢n«G–hPʤØ0#éqŽº›¥uÜ»¹FsÐα ™Ù»D]‰B¡ÀÂ… ±téR¬[·ß~û-´Z-T****pâÄ Ô××#%%?þx‹×2jµ[·nEDDn¹Å½fkff&^zé%üîw¿Ã¤I“£GâèÑ£˜8q"†îw[[;—§@Ï=f̼ÿþû xCBB˜˜ˆ½{÷B¡PÔÞn©Éü? õ÷@/5ößîÛEŽR p¾°]qLvvÃÇà˜Í™ýåû|u.Áù1Ï9ʹèQ]n0{Kò~~3îÜûHÁ¢½¥ø¢Ôˆz›£æð ax|dL‰‹Á½›ã²­™7"""""êözd€wešVî€&JŽ 3‘ða^PŽŸ©SC%Çdfïu)ýû÷ÇòåËñí·ßâûï¿Ç‘#GpåÊDGG#11“'OFJJ $’–Ÿ‘—H$¸í¶Û°nÝ:L˜0ááánÛããã±bÅ |øá‡(((€Éd‚Z­ÆOÌ JÆmÉ/RQh4#csGQ±ÏOg'tÇÿ”Våøwÿû.ag]ÏûtáåëzþP ðèp5©ÆuoHC¤05ذõL5V–cϹZÞ("""""êzdoMƒ ù4l0‚»ÎìÝÇ¿5ptu€&;ðÁñ*|p¼ ¡@%C“¸hi„ÝCDDDDD=LüŒ­·‰ÏÞŸ¢ƒRÖ¾˜÷¢±ì¬4!§ÒÔ!m׫X1A‹÷è±b‚é”ÅDDÔc5ÙsWadp—ˆˆˆˆˆz¨™Á›]bĽ›‹©SC.Eö)#LVÞŸ¢ƒ^¥Àä올6¯¯Ÿ4 7ôª((Ã¥05ØP`¬C¡ñ22†¨:4{7S§ÆûStÂrzœYÉñx>·+•s4õ0ÒžzáÙ%Fd—ÝÖÍÈÉУ䩘¼±F³°M%Ç¢±d$¨  ï¶« û/ÔuHö®&JŽ´¢ÛV¤imï ¬a"""""""""êœ8 º‹£š¿ç¡¬Î‚ƒ¤ Sç˜=~AR¼°ì-¸ ½eRÜÜ7Êk ¶=|– cˆŠ7ˆˆˆˆˆˆˆˆ¨‡‘² Ü™¬6èÿ•µStxŠ™:5&Xç6+9z•÷n.òYê!¾‚»€£6/õ,Ìàõ"s»ÿàà®Szœïß®kw;4QrÌ¡Æíñ1>÷Ë©`y""""""""¢ž†¼^h¢ä˜1(¶]ÇÈHP!S§ÆZCU@ç4@‰ô8Ç—&J8cn€µÙYˆ¤Åkj¬¶€ÎADDDDDDDDDݼ^,«iµ,‚?Õø ¾z èÍØXbDN… 9&Gé•Ù31øê>€#¸›ù­¥uÞ4""""""""¢†^/îIΤeš(92TÈ.1pÔÊ4@ ½JÑj@×SÑ ý§ùHs¼¾´Î‚œ ƒ»DDDDDDDDD=¼"Ò(ƒ’½ë”•9:µÛqý èŠ1YmÈ.1 c"""""""""ê¹à‘§ êñ& P¢ÐhÆÇ«èyÃï5°³Ò„ôì‚NÛ>Yˆ!ÇämÍv;¬ÍöNÕ>¥LŠdU¯«}YsMÏ- Øší°ÙíÌDDDDDDDDÔ©0ÀÛEi¢äm®½«”I1G§F¦N ½J!ºOv‰Ù§ŒØXblS¶±R&ms–²R&Å= *d Q!C¤²©á§2ƒ\ªâžÇ93T¢e:r*LXk¨js¿økÒ€Þ€Bãef{‘W ðŠö¤e¥µÁ;^ú%6ÌH„2\ Sƒ o7ø]W)“bAr<²’â[­1ì r–ÖYð|n±ßçЫØ0#š(9L 6<ÿ}1Öªü¾¾9#ÔX'záRd^ PÍx>·9•¦v÷뢱šVËs¤Ç)‘§„©Á†•‡ÊñʾҠ¿ƒ¤÷Ò: îÝ\„£™oL""""""""j!„]ÐRN…)¸Ç« Þñ²ïJ‚³Êp)ÞŸ¢ó uÒDɱ#CÅc5M §‰’cÃŒD¼?Eç×þÎàn íSʤØ0#ko÷o'½Jz,«isŸ.«ÁŽ }@µ—•áR,«ÁÁRjokÕ¸eUk¢äX1AË7%‰b¯ˆÒ: vVš0i@p&[Ë>œ2é”è-s¿eÊpi«åô*vÜ£(°ë)S§<¾ÝàóÙY×ó>± ˆˆˆˆˆˆ: fðz±²°<(ÇyóPùu­¡ª”9²hÛÜuÊÔ©±2Mëó\bZËp}ÿv]»‚»®í[@&ïⱚvw…ëwd{»þ@Úï­¯²’âù¦$"""""""¢˜Áë…s¯{D&ùòWÕ†Å{K¯ëu¬LÓú žn,1"§Â„£šh94QrdêÔì%и )Ù§ŒA+;±x¬Ft"5§B£Ù%F!;V¯R }€É^®iÑX r*L­¶ÏYs×›²:‹ã¼µ˜¬6h¢äHSzÍêÖ«XÌkwû”2)xÉL-«³8úßK ¶½íóÜuåWÉàÞç ¯LÓŠŽ‰IñXYXÞ¦R z•¢ÕÀYÉñXÜ“ºQ×Å >˜®i ¬}z¹± éÙ×½fª·r…F3Ò³ |"תž]€‘µ&JŽa½#Úݾ¬äxÑÒ…F3ôŸæûÌÂm­}¾J/d$¨Dƒ©Î ¼hp÷ªœJ“Ï1±¸“½ùS‚aNÊIQ÷Âo+LV›ð±{KSs«ûWÕ[q±ÁÖ)&Ä+/HfqÑìµÄD¿ˆ°v·Ï[À2s»Áïöe|U$ºÍWÙoÛï-õë¾™¬6dz™ÌM-¸”2©_ÁÛÖ×DDDDDDDDÔó0ÀÛ ¥Ì1ÖÎJ"ÞÙ…{7áCvVš„¯%F<Ÿ[Œ˜5¹˜±é)ÂÛœÉ,š(¹hvìZCU@e#V*ÍV=Qs¥Ýí›PìCU@ÁñœJ“hû¼ÕÊÄßeuŸ™»ž Œf¼)²NE൉³’ýŸ@ÍW^""""""""êyXƒ·ïß®ƒDâ¨Ç 8&_Ë.1zÝßø[µ†ª6Õc ±à.dŸ2|¬ÌíŽZÄÎz·o*Çù+íjŸÆË$n¾úÖ›µ†*¬HÓ¶¸~¥L*Ìë›¶œwñÞR· ß f¬,,ø8¾ê${ÖúMSB¯RtŠ q""""""""ºþ˜ÁëC¦NŒ2¿5¨]¼· Z¯¥/^_um½)0š¡\“‹ÉÙˆY“+”¬ho¥ Ú÷ìÔ‹L„)ò¥µŸ×dµAÿ¯|Üô¯|LÎ.€þ_ùOª—©S{Ídö–QìO½^""""""""êàõB%ÇŠ Zll%cWŒ³noF‚ é>Jt59•¦€˜¾úWLGg¦J%’ Ÿ·ÀhnSàð^raå¡r¬5T¡L$à=G§†RÆä{""""""""b€×«÷§èPcµ ¥µöjÞ÷o×±3I”^¥@z\Ë?ì¬4 絆*Ñ×R·—ˆˆˆˆˆˆˆˆº/xE,«Azœ™ßÚ•±ºð‡h¢ä¸ôdVLвcÉ·R ®u|½ÕôõV·—ˆˆˆˆˆˆˆˆz–à ‘´è½JEc5xóPy›?vïôó¡}8&õÊJŽG&ƒrt•R& Ò–ÕYÜJ‚˜¬6| ’Å«‰’s<z\!ÏôJ,HŽGF‚JXgj°!»Äˆ…gðþ æàL$æQgÖ[ÝYê:cgÑÕìnO¦ Œf¼²¯Ô¯? x+±°x_©è:±`ðœj¯%ˆˆˆˆˆˆˆˆ¨gèQ¼+Ó´Ø‘¡w îŽ ÛL{gß ½JÌí†àœÏåãõ5Vƒq]˜&JŽ 3Eƒ»Î1”§ÄŽ =¢ÃB[=žXÀ¶ÆjCö©–ú•ÖY°S$hœ§„^¥àÍ!"""""""êÁzL€wñX $ùž˜*<ÔÑÁÊ´Í©4!áÃSÍBÙµ™:5’ÛYA¯Rx-ó°öv]ÛÆwr¼hí^""""""""êþzD€×[@ͽJÁ/ LVÒ³ ZLŽHf8Ð1%æèÔ ðõP="À;¸ 5uÕ‘2Žrc²ÚZR ð*eRÑÉÕÚK%G¦NÍIüˆˆˆˆˆˆˆˆz 1ÉZ 듍½ƒ6]gÓ–,o¥,°¿xfÿ“·º¾DDDDDDDDÔ½õˆoN…)à×äž­éÒ×|ö²Ut}ú€¶•«8ø@ r2nBÉ/R±b‚¶ËöKmc“èzÏÉËüí1Þþ ÐÙ»Â}Szmu_=¢DCv‰÷$¨zMîYS—¾f“— cÆr*»¶÷§èÜ‚‡YÉñxí@Î_iì’}Scµ¡·Göí= *dåtœŒ!âcªÖÚ2ˆœ©S‹f?o,1beay@çÕ«X‘Ö2Èž•Ìí>Õˆˆˆˆˆˆˆˆzà]k¨BVR<’ýÌp|óP9ÎuÑà¥SU½eu–õ‡$Åcea9Jë,~gñXhfè°Þ]6À›}ÊØ"›V%GVRΆ*Ÿõ‰½Mî%6¡›©áúO¶x_©×’(4š‘ž] ºÍ[ðÜ[ Ý@”ÖYDKMˆÕû%"""""""¢î‰Þ.$§ÒÔ¢îjÕ&@ue²Úž]  ô×›‡Ê‘¹ÝàsŸ£Yt"»œ “èµxòg¼@ú¥À væv^ɼõ×ÎJÒ³ ¼·Å®óC•×ý%V.cg7Ȱ&""""""""ÿ0ÀÛÅd|U$3k¬6då·à~ ò>¾ÝP µ¬Î‚{7ùÌÜukßæ"·ã?c  IDAT¾Ý Ú¾£Ï»³Æjk×wbýâouñ¾RL0^cµáñíŸÁ]ÀQŠÁ5K¸Ðhö»/ý‘Sir;~Y%¨Ç'"""""""¢ÎM‚¿ì°³ºžôÊ6×ÂUʤÈ¢BF‚Jt°« 9&d—Û\ËU¯Rø•Aè¾Ù/Î×gêÔÈ¢BoYËÚ¹KŒÈ.1"û”1 ,\M”š(y‡Õ/Ö«Pʤݢ>²¿ìóÓù """"""¢^‚<4òPG2·Ín‡¹±‰@*‘@ °45ÃÒÔÌNéDà%"""""""¤ìbðRœÍnZ­\""""""""¢ŽÀ¼DDDDDDDDDD]¼DDDDDDDDDD]¼DDDDDDDDDD]¼DDDDDDDDDD]¼DDDDDDDDDD]¼DDDDDDDDDD]¼DDDDDDDDDD]¼DDDDDDDDDD]¼DDDDDDDDDD]””]@DX,<úè£^·‡††¢W¯^èß¿?’’’0cÆ DGG½999øâ‹/pöìYØl6Œ1¯¾ú*àé§ŸFuu5à¶Ûn zĽٻw/^ýuaùÕW_ÅÈ‘#9h‰:¹þóŸøì³Ï„å?þ2™Œ$GŽÁ¢E‹„å—_~7ÝtS¸ö—_~ÇŒ1K–,ဠ""¢^""?455¡¶¶µµµ8~ü8¾øâ ¼øâ‹HNNÚ9 ñöÛo»­³ÙlìüëdãÆ°X,€Áƒ#55•B]vLrçÅ‹…ïccc±lÙ2·ãNž<—/_ÚGDD=Wll,¦OŸ.,«T*v QÅ/‘ˆˆˆˆÙ³III˜8q"^yåœ={pòäI9r‰‰‰í>gss³ð}TTT‹ ñÃ?ÌCDD€þýûcîܹì""""b€—ˆ(*• >ø V®\)¬Û¾}{‹oUU>ÿüs:t/^DXXú÷ïÔÔT̘1r¹\Ø÷Í7ßÄwß}çöú²²2Ìž=½{÷Æ{ï½Àû$k[·nÅ»ï¾+¼vÕªU¨©©Áºuëðã?Âf³!>>·Þz+fΜ‰ÐÐÐ×H{}Y¼x1ŠŠŠ½{÷Æš5k„@umm-žxâ aßqãÆá·¿ý­°¼eˬY³FX^²d FŒ!zž3gÎàÓO?Å‘#GÐØØˆøøxÜqǘúÙÙÙÂòúõë[´kÞ¼y0€ÔÔT·ó_Ë1è¸jÏ{51é)×¶åžjëÖ­øúë¯QYY‰ˆˆèt:ddd`øðá¢ûëÙäOŸ|ò‰°üñÇcÿþýX¿~=***‰ÄÄD<ôÐC0`L&>ùäìß¿uuu¸á†œœŒx …¢ÅñÛÒíy~{›€²£ïy Ï–¶ÞÃK—.aýúõØ¿?L&”J%&L˜€û￟?Œy`€—ˆ(@·Ür zõê%”K0 nÛsssñ¿ÿû¿hjjÖ566âäÉ“8yò$¾ùæ,\¸ýû÷ïöåççcíÚµnÁÅÅÅ(..Æ¡C‡ð‡?üÁ-;8˜íMNN‚i555¸páúõë'´Á•çò‰'„ï###½–¡8qâ>ùäX­Ö×W\\ìVZÃn·ãwÞq T€Õj…ÙlFYYrrr0oÞ<õÔS˜6mÚ5}–nذëÖ­–kkk±{÷nþ<êëë…_Jßzë-á—ÏÐÐP$$$à†npÛÉ’%hhhÜqÇxæ™g0pà@aŸ>}úà™gžqË. $ˆâpUXXˆ¼¼<·_¢m¯/z½Þmùøñãnçò 8ë{nOJJÍ4Yž®Á]Wß|ó[Pî»ï¾k„ëÕ«W‹,ß¿þõ¯B[œ÷#""BØ>lØ0<óÌ3BFm ý¦V«1tèPaÛÜÎo·ÛqèÐ!·~tfë}ôÑGnuž[3zôhôîÝÛk›   @ø^§Ó!66xíµ×Z<³ôÌf3–-[†ÊÊÊ}¿vĘl˸jÏ{ÕŸ1é?¯½V÷Ì5¸ë9þß}÷]”””tسIŒkp×Õ•+WðßÿýßnÁ]WUUUøê«¯„å`ö_ ÏïÎrϽ=[Úz­V+–/_îÜuuâĉí&"""êéà%"jƒ˜˜·åºº:À?þñá—óèèh¼ñÆøóŸÿŒ·ß~Ï>û¬[€`Ë–-€Q£FaòäɈ¶+ Lž<ÙçG轑J¥xüñDZzõj¬^½ÚmgÀ©-íõeðàÁˆŽŽ–}Óœ¿¨@}}=***„õžA9Wv»<òV¯^U«Vá–[nqÛîÌÖÙcN7ÜpV­Z…>ø~ø!æÍ›'lkjjÚâ¼2™LØ®V«1yòdètº6÷Ûøñã…õeeeB¹ À‘1ç,;à¹o°î‘Á`@tt4Æ;ï¼}ûöõýBHn½õVa¹²²çÎs Â;v¬E›srrÜuC† ÁŠ+ðá‡âoû&Ož,l³X,n™ï1&Û2®Úó^õgLzãÏk¯å=ûÙÏ~†wÞyï¾û.fÍšå¶Íµ$G°ŸMbT*.\ˆ¿ýíoøío ©Ôýƒmƒ Â’%Kð·¿ýÍí¾ºŽ“`÷_ ÏïÎrϽ=[Úz7oÞìö<ÔëõX±b>øàüêW¿r».""""ºúû»€ˆ(pž5 ëëëQ__Ç ëî»ï>ÄÇÇ$ ÒÓÓÝ‚D;wîì¶=ôÐC¸ûR© R©ðøãC©T ÛA«ŽhoHHˆÛÇøA»Ý.|'l?yò¤Û¿®¿Ð{s×]wá¾ûîƒJ¥B¿~ýðË_þÒm»kP.""ÉÉÉHNNÆý÷ß/|4?<<¼Å9Ο?ïWÿ¶µß<ƒõ®±®Ù»¡¡¡;vlÐïQBBÞzë-üú׿ÆSO=åµ¾±+_m>vìl6›°ì,Ïàša(“ÉðòË/càÀH$ˆŽŽÆüùóÝÊoäååÁb±tÜ:0&ƒ5®ü}¯v´kuÏn½õV<öØcèÓ§bcc1gη?ÐüðøpáÂ5{–>ùä“HNNFtt4ÆçVž}öYŒ1ÑÑј:uª[¸Þ×`ößµÁl³Ø³¥=÷Ð5ØÛ·o_üîw¿ÃÀÑ«W/Lš4 O>ù$!"""òÀ¼DDmàÌØuêÕ«Ξ=ÛbŸ;v¸­ ¾¯¬¬Dsss‹u·—gÔÐÐPôïß_ø¸±ó£°ÕÞääda‚Ÿ’’X­V˜L&¡Ï&Nœˆ7¢¾¾^°¹fÃÅÅÅA¥Rù}} …J¥R¸>× ÄóÏ?ßâËÊÊPVV†Ý»w·©ÛÚo*• ÇÇ?þÀ,uÖgõ,ÏЫW¯ ß£Ù³g‹N åˈ#+d8p3fÌàžIè,ϸ RSSÝÊ<ŽàδiÓ„ìÙææfœ:u £Fê°÷k°Çd°Æ•¿ïÕŽv­îÙwÞÙbÝôéÓñÃ?ËgΜiqþŽz–zNìæ|ߎLZFãu»kÙ`ößµÁl³Ø³¥­Ï.«ÕŠ .ëo¿ýö™Õ'NÄš5kÐØØÈFˆˆˆˆœ?¿² ˆˆçY›1**JÜ9}öÙg>a³ÙP]]í3˜Ù®u]ƒž<V{]ÍÍÍ8yò¤[9‚áÇcèС8|ø0Š‹‹a·ÛÝ>*ï+{7ës*++ÃæÍ›QXXè8h«öôÛ„ „qrèÐ!Øl6H$·²®å‚y\³Tý‚ñãÇcÓ¦Må/¬V+d2™[€×YÊÁb±¸}´ÚÛäW®5¬ÅÞOÁÖc2ã*бÜ®å=ó<†Ø¸<{ö¬PÓ¼£Ÿ¥®“¤y’Éd~ŒƒÝ×bL»ÍbÏ–¶>»<ÿx*6fÂÂÂЯ_¿k–áNDDDÔ°DQ€Ý&œQ«ÕˆˆˆhSfU0ŽmÕQ퉉ÁàÁƒ…åãÇ Á2‰D­V+|ô·¾¾UUUnÙ’žlí±k×.¼øâ‹Ø¶m›Ðö°°0hµZddd\ó~s­ik±XpìØ1 -©T*”gö=jkÝJ×2 (**‚ÉdBYY™°Þõºü!‘HÜ–½M*,Á“1®:»`Ü3±‰=Ç¥ÅbérÏÒÎ8æ¯e›Åž-m½‡žçðlƒð L…!"""rÅ ^"¢ýðÃ0›ÍÂòÈ‘#´Ì‚úŸÿù 4¨Ó^GG¶799Yþøã¨­­à˜´(""­¶ãÞ½{qéÒ%ÇJR)F”6X,¬Y³F :<ð’““!•JqñâEdgg_Ó~‹Å¨Q£pôèQÀÁƒÝ2öôz="##¯É=ò—V«Eß¾}…ÚÜÆ¿ky¹\•J%dzfñ9¹þh9i¡“ÍfsË^´Ûím®×¬1ÙQãêz ö=óåüùó-J¸NÜ8²A]'ÅëìÏÒkÙ]©Ím}vyfo{¶Áù\ð7DDDD=4íŸ ½þuÜÛúöîKD]k½Á¶îë\ïºÝŸubÛ0ïué£ÑˆO?ýÔmÝ”)S´ü(iIII‹_hm6›ÛÄTþ~ ¸#td{“““ñùçŸpdK^¹r0lØ0p ¦¹N¨3räHŸ›DEE…[°àþûïÇÍ7ß,,;ƒ¬ŽéööÛ„ „s8pÀmÂ>×ò eLI$L˜0AZ8pÀ­_=³w  Žòòò0gη žÝnÇÖ­[…å 2@ËÌWVVº]ï©S§Ü‚ËÖ˜ 渺VÏäÖ^Ûž{ˆÝ»w ýíä¬ì×bË®ð,½ýÌñÒÑmnë³+22Ò­¦ú·ß~‹{î¹Çí=»ví‚ÕjåfDDDD.B\³‰„_üâ¿‚þåíãkØ¿×Ò•+WPRR"|:t6lÀK/½ä–í4|øpèt:@ïÞ½Ý~]¿~=.^¼(,×××ãÕW_Å£>ŠG}/½ôÒuý #Û;räHaššá—qç¤F±±±ÂÌð®­n­þn \ÎÀäåË—a·Ûa0ðá‡ú},g6g0ú-55UÓååå0 ™¢)))×ìµLÃùóç‘——ç5À›šš*|oµZñ§?ý °Ûí¨­­Å_þò·ò·Ür‹Åì™õ÷׿þ§OŸFmm-òóóñÆo´ù‚5&ƒ9®ÚÃuL¶÷µí¹gزe öíÛ',ïÝ»×-˜®Õj×垥תÿ‚9^:ºÍí¹‡®“ñ?¯¿þºð‡•]»vá½÷ÞãopDDDD¤žÁo˜¡KÔ³µö pÍòµ¯Ýn‡D"qû×ùÏcˆ-{®ï(ÅÅÅxñÅ}î†_þò—nèGyK—.àøØë³Ï>‹Aƒ¡¡¡A˜%Üéᇾ®u;²½2™ £Fr›ˆ FŒ!œ[«Õ"??ßm{0¼ƒFHHˆp [·nÅÖ­[.ZÒ³ö£R©DMM GÆç[o½½^‰'¶«ßz÷îÄÄD>|Øí½3fÌ·ò iLi4ôïß_øã†38êZžÁ)==[·nEii)àäÉ“X°`äry‹ò xä‘G„eN‡°°0466Ž;†_ÿú×A¹†`ÉöŽ«öð5&ÛóÚöܳ@466bÙ²eèׯGðÎÕœ9s„ñÛ•ž¥×ªÿ‚9^:ºÍíyvÝ}÷ÝØ´i._¾ ÀñG”ð1""""Bœ?„µ–Éëm=¿øÅ/~ùznx>cÄöÛÏßÀòõ‰?üá8p Ûú””Ì™3Ç- qòäI”—— ¿Ì†„„àW¿úÆwݯ£#Û닌ŒtËÐ:t¨Ûö˜˜˜ ÖÙ”ËåxàZ¬ohh€T*ÅÓO?íö±_ç¤[NcÆŒ¾·ÙlصkŠŠŠ‚Òo®±Nžå:Ó˜’H$¢í›\M&“ᥗ^‚F£q[ï4ŠŽŽÆïÿ{·1¡R©ðàƒzmÇĉѧOŸ6_G0Æd{ÇU{ø“íym{îY œåΟ?ïÜ•J¥xê©§„zæ]íYz­ú/˜ãåZ´¹­÷022/¼ð‚׉!Õj5âââø[‘ ©ØG ÛPa†/Q÷æ+kÖŸ÷¿3ûÖÛ:²u¯Uö®˜ÐÐPôêÕ  @rr2f̘…B!ºï¬Y³0zôhlݺeee8sæ  R©pÓM7aÚ´iP©TæÞvT{“““Ý–‡ æ–eçY‹3999èÿ—Üwß}èÛ·/¾üòKTVV"&&#FŒÀÌ™3¡Ñh°}ûv!·{÷nÜ{ï½HHHਭÚÔÔ„Ý»w£ºººE&f{ú-55ï¾û®p̰°0·:®qLM˜0Ÿ}ö™Û:±/ôéÓK—.ÅÎ;QXXˆòòrTUU!&&ÄðáÃ1mÚ4Ñ÷PFFâããñù矣¼¼‹ñññ˜6m¦L™‚ùóç·ù‚5&Û3®Ú£µ1Ùž×¶çžùkÑ¢EøòË/qàÀœ>}J¥Æ ÃÝwßÝ"¸ÞÕž¥×¢ÿ‚=^®E›Ûz“’’ðÆoàßÿþ7 QSS¥R‰qãÆáÁÄk¯½Æ̈ˆˆˆ\ã2ééévoAN²FDNí™dÍŸ Ôìv»ßëà‡~àM!ºÆ²²²P^^ÀQÚ`É’%ì"""""¢ëL øÎÞõ7pË/-3u=³t=³sÅêðúªÍKD×Oxx¸ð½·’DDDDDDtmµ©Dƒ¹D=Øû^,ðÚZp×s›¯@nkÁ_"ºv>Œ“'O ËÞÊ3ѵå–ÁË DäMkÁ\±}Å2wÅÖ{ûžY¼D×߻ヒ . °°PXwË-· 66–CDDDDDÔ Hý™µÞŸà-¼D$Àõ|>x›4A\¢Î騱c8s挰,“Épÿý÷³cˆˆˆˆˆˆ: ©·Ò ØQ |•gpÝî+CWì5 ü]?‘‘‘ ADD´Z-xàh4v Q'!u~ÓZp—_¢ž­µg€?õsýÙæí®Ë|];K–,a'ubí®ÁË@ QÏâ+ë¹XÆ®¿™»bÇg&/‘;©· í™pˆº¯Ö&VsîÓZ0–["""""""¢ö“Šeï¶¥/ÀDÝ›?[×ýÄ2u½eñz¿µlÞ`»téo0µ*,, ì"êTÜJ4øú¾-úöí‹””Ìœ9ƒFhh(ª««±ÿ~|ýõ×8räïQ7ã«CgÍØ‰‰á#""""""¢.É­Dƒ¿Á]¿111Ðh4èÛ·/.]º„††€ÍfCHHŒºº:œ>}šw¨ {ßûS/7 Ö¼e‘8Ѽ޸þfôÊårèõz¤¦¦B&“¡  §N‚ÍfC¿~ý0lØ0¤¦¦bРAø×¿þ“É„ææfÞ ¢.ÆW)…Ö‚²þmÜ%"""""""òNrÇw‘±z¼bË­™1cÒÒÒpêÔ)¬_¿555nÛ¥R)’““ñðã®®«W¯Æ¹sçx7ˆº8Ï@¬sÙu½Ýnw[ïúȺ¼¼j+û–ˆˆˆˆˆˆˆ(mŠvú î466"44¡¡¡~G&“¡¹¹9Hµ7P)å€ÑÒb‹1o Þ6Ha1y¶•k:s*R4j¨RØÌå0äå`[^1Üw•B©KÇôt=´j¤l#J‹r±m[ª„S^­£+ß‚·?2!uvRâMØ´|5òÍ€T­ÇÌéiÐÆ« Z`ª*FÞ–-È+uKK•:LšŽDJ¹ ¦ò"älÚ„‚*æ¥ÎA"¯™ÛXþ^žoÇ’UÏ!É5#wÐL,ÿp<¬ŠXx&êVmYˆù˾G5»•ˆˆˆˆˆˆˆ( ¡C‡] ˆO²&ÈmíãÑ'NÄ•+WpöìY\¸pÁç¾ááá7nbbbPTT£ÑØÆËh†Å6©‰ýÐ/):`®®†Él…P$¢ÙŠúz ¬.U#¤ª<öÜHQ7ãüÑC(*®‚E¡Á¨¤1HdÆ¡‚J8ã¶rí}xö‘¨qGÂåµ°ÉÕÐO„^mÄCçáH>”B5& ‰ ¢Ç¤#Iiñô(8T ‹&Ï=‘ŽAòZœ:TCe=¢%BŸ2 ŠÒüh‚ãµ±‘ÐŒƒ~µä8„Js4† ×bTb,JóÂÄ/uÞžMµ'ó]5§ß‚\ÿÖ#‹€çŸ~ª¶,Ä3¯Kž{îܹ¼DDDDDDDÔã¹eð£¶å¦M›0~üxÄÅÅÁ`0ø¬Ã+—Ë1qâDìÛ·/^l×y-†l¬Ù’ÙSuP'NÅC‰S˜QU\ŒbƒEE—,[P 1c&4(Ŧ•k‘oººzÛ6hfÎCfÊtÌÔá#ƒ€š´DÈQŽìÕkP`þé)ó~ƒ™šD¨¤E0»^:Ä­ÇÊì"G@VŒ =>yû®c[n1æfe eº9« Âq¥k°rS9‡Ì‡¿Á\½‰J)J™ÅK]€#“-3y]T}ý;<óúÞ€ƒ»DDDDDDDDäô‚´ßÿ=Ôj5’““aµZ‘››‹¦¦¦ûõïßwÜq°qãF˜ÍævžÙ‚ª¼Oðvž*ZZZ­j­i3-(Ïým+udå*´H‰,E¹0Xä»L¾V•—‹ª”™Ð$ª!5” Š?YŽå°Àlñ·ûª³­Hȶ•ªS S¦mÛ„à.ÀT„MÙ h¥f·×nËqwÀc±Ы e aêBË¿Áê bÕƒ7´Üh݇¿þuƒ»DDDDDDDDí õ· ƒ¿Ù½555ÈÍÍEZZRRRƒ'NàܹshjjBïÞ½ÄÄDŒ37nŒF#N:«µ½³,Y`,-‚±´y WC—’Ž©é:ħ=ŠÙU+ñQ‘RE<”ä‰â7‰^¥”;jí°Y̰(ÕÐj㡎G¼:ñ•c¢(±„Z›F—˜­T©‚6”–›^ X®®U$bæT Pšåk ðSJ­ŸM´˜M° jµ(5¹Ý•~*RÕFäm+∤nÀ{p·zßVœKž†‘®5yÕ³°ì¯vüvî ì»ÌÞ#""""""" DHGüâŋسgÞ{ï=üùÏƲeËð—¿ü_|ñ ÊÊʰzõjìß¿ÍÍÍHKKÃÏ~ö3 0Ò@ŠÍÚÊ‘_l”ixhªV$cPMz:ÔŒE厭¹U€4q&RÕ®ç’">=s3Bªòê…Jc\+'HÕ)H×8^Ój« PjTéS¡•»6Mƒôé©HÑ)™¶KÝBÌÄ߉w«¶.Æü?¼ßüòMzVbQÿ ¯¯z#ÃØDDDDDDDD¸®SvÙív˜L&|ôÑGH$HIIÁÍ7ߌððp|üñÇ(--õóHoZõCЧ>Šßè(-­‚ÉläJ¨5Z¨ª¶a}žñêkLÈÏÎ…~^¦ÎË‚¶¨å&@¯ƒ^£„Ű[JW›±ÅæTèS21Wi@i•r•: 63…Sg¦`Ë–|”{«k)Ʀìbhf'âÑ, EÅ0ÚˆOÔC#7£à“\¨ÚÝ«*¤Í›‡©*#¶­^\ãO·Z5uæ¥)aÜò6Vçý”E,UOǼ¹©PVmÂÛkòaâû‚ÚáÒáØ_=“bZWµu1²Þ؃Kìg¾ÄKóìxmu’]2y‹s·ãt#ûˆˆˆˆˆˆˆ(ÒÎУшuëÖ¡ººéééÐëõ0`ž}öYÿb6 {år¤¤#-E µ6)`³˜`2»%¹EªmX³²éÓÓ‘¨M…FXLå(Ú’-y¥?•b°•cÓÚõ°ÍœŠD­©3Œå¥ÈY³ùf2ŽD­*i>Ê}5±è#¬4¥bæôhôiÐI-0•aËú-È+µ@˜d­är) •·8šT*‡RÈ[dGKáx‰”ïj¿K»°ôYo¿„I±À¹o^‚»Ng¾ÄKó y‹?~Y=Vh """"""" ŒdÚ´i”ôÎYêÅf²[LR©C† ÁwÞ‰Ûn» f³O<ñïQa·ÛÝWô»™w5 ûýý¨vÙf·Û…}¥ñw`nÊi¬ýì(ÌW×9·{~ynËËËc§Q×i¼DôÿÙ»ó¸ªêüñã¯Ër‘EÙ”E\QH%×\h´f´,m³­É6k¾:•63:M MY.S?[FͬÔR*Å)qY”EÙd¹l¿?œ{ârÙ.¢,¾Ÿ‡âœsÏùœÏ½÷}ÎyßÏÒ±é%xk-«i ÁÛTW¼B!„B!„3’*B!„B!„BˆŽI¼B!„B!„BÑAI‚W!„B!„B!:(Ið !„B!„B!D% ^!„B!„B!„è $Á+„B!„B!„”$x…B!„B!„¢ƒ’¯B!„B!„BtP’àB!„B!„BˆJ¼B!„B!„BÑAI‚W!„B!„B!:(Ið !„Bq‡h4BCC‰‹‹kp›ÈÈHöïßOee¥T˜B!„h’‰TB!„·ßÉ“'Ù¾};ùùù˜™™±dÉzõꥳMLL Ÿþ9555:tˆÀÀ@¼½½¥ò„B!Dƒ¤¯B!„·QUU!!!lذüü|ÊËËY·neeeÊv999|òÉ'ÔÔÔ(ôÑG|øá‡R‰B!„¢AÒ‚W!D§ñïÿ[éöüÎ;ï`oo¯³þ—_~áË/¿`Ö¬YtèóýË_þB~~>îîîüßÿý_“Û¯_¿žS§N¡R©X¿~½|`„¸CŒ¹råŠÞòÜÜ\6mÚÄÃ? ÀþóÊËËõ¶ËËËk“r¯^½šÄÄDåï±cÇòøãël³nÝ:NŸ>­üíååÅ¢E‹îHù>þøcΜ9ƒ‰‰ }ôQ‡úLDGG³qãF,X€¯¯o£Û—••±oß>bccÉÍÍ¥²²’=zЯ_?¦M›¦w½k ùýí_uu5999PXXHMM ]»v¥W¯^ØÙÙu¨s©¬¬$<<œ'N••Euu5NNN 8ßýîwXYYÉ~‡b«‰$x…BˆÛèâÅ‹œ;w¸™±µµ•óâ.äççÇô–Ÿ9s†3gÎ4ùÚöàÒ¥KzËRSS%öÜf………üãÿàÚµk:Ë322ÈÈÈàÈ‘#<ÿüóxyyÉMt:111œ¿ÿþûdffêÅÒÔÔT~ùåžþy $o¾ ’àB!n£K—.±{÷n† ҦɆ=zàêꊑ‘Ñ]uÞB´ãǯ7ÁÛ•JŘ1cÚÅ9\¾|FƒZ­àÚµk´yL311éÔ±góæÍJr·ÿþxyyQSSÃ… ˆ‹‹£ªªŠÏ>ûŒ+V`aaÑ®Þ!Z*!!ï¾û®Þ–ê*,,äСC:tˆ¡C‡2wîÜvѪ½®ªª*>úè#%¹kbbBÿþý±··'%%…ÌÌLÊÊÊøÏþòe˰¶¶–‚¢Ùäê+„BÜ%fÍš%• DqvvÆÃÃøøxƒ^çããÓ.’”jµFCZZýû÷~k½«]w§vúÏMuu5çÏŸ _¿~¼þúë¨T*¦M›Æ7ß|þ}û())áâÅ‹ 2¤ÍÊz7¼âÎ|æ¿ùæöïßߢן;wŽÐÐP½ádÚƒcÇŽ‘––€­­-/¾ø¢2ÑfMM ›7o&""‚ââb~ùåxàù@!šM¼BÑTVVrýúueⶤR©°°°èt-t4 {öì!>>žÌÌLe\·éÓ§ëu÷«©©áܹsìÝ»—ÌÌL4 =zôÀÏÏI“&aff@HHˆN2çÝwßmr|JCÊQ[JJ ;wî$--ž={âïïϸqãt¶ih ÞÌÌLvíÚEZZeee¸ººrï½÷2jÔ(½ã”””°sçNRRRÈÍÍÅÞÞ///|ðÁfwsëNˆ;íÆTVVê-755mµÏe—.]ê]njjJuu5UUUÍ~ÍÖ§O¹té’^‚W»îVcÚŠ+ÈÈÈÀÑÑ‘×_mÛ¶)ûõôôdöìÙ:cSjc¥¥%ÁÁÁMÆÜ––eéÒ¥ü÷¿ÿåìÙ³¼ÿþû7sssùî»ïHLLÄÜÜ???%©Ó”k×®QQQ€£££’ÜÕ;v,W¯^Ðûü4·Œ «¿¿?ááá,]º”~ýúéÔmJJ ¦¦¦£V«õÞC®†–Y®%SYY7nTæSh‰~ýúqÿý÷·Ëó;vì˜òÿ:q@¥R1kÖ,"##©¬¬$>>^'ÁkHüzë­·ÈÍÍÅÝÝGy„¯¿þšôôtzöìÉøñãñ÷÷çàÁƒüúë¯dggãììÌÌ™3ñôôlÕ}ÔÔÔpâÄ |x‡¯çââbþõ¯‘““£,+//çêÕ«ÄÄÄ0wî\Ư¬;rä_|ñ…Î>´c!ž;wŽÅ‹cllŒµµ5–––ʘq666v·3´ZW¯^åý÷ßW&gJNN&99™üü|f̘Ñè¹ÇÅűnÝ:ÖwñññÄÇÇsñâEyäeyNNï½÷žÎ8™™™dffÇ_þòLLL=ïæÖwÒñãÇùôÓOë]gddÄŸþô§oZYYIAA‰‰‰:“‘¸»»H¿~ý¨®®&66–mÛ¶‘››«lsôèQ|||pqqÁÆÆ¦Í¾ýúõ#11‘‹/*˴צ¾}ûÖ›àmiL»qãÁÁÁ:cTFFF’ŸŸÏ«¯¾ª—äÔj,ö´´,Ÿ|ò ±±±-Š›—/_fÍš5J™Š‹‹ ÅÉÉ©YõÞµkWŒŒŒ¨®®æÄ‰888pÏ=÷ààà€““Ï=÷Ü-Åö†ÎÕÇÇGIðÆÅÅ) Þ7n(Ÿƒ¡C‡*CvÔ§¹× CË,×’ÎG£ÑðᇒœœÜ¢×[[[óðÃ3jÔ¨cD[ËÊÊÀ¢ÞûgsssÞ~ûm***t>¿-_¹¹¹¬^½Z¹?LII!%%…Ó§Oë\RSSY»v-Ë—/׋M·²°°0¾ùæýeggóóÏ?“””Äk¯½¦÷=mnü74¶JÌwIð !D;õÓO?±cÇŽv[¾´´4Ö¯_Ïþð‡vÙ…ì7Þhö¶;vìPnš‡Š¿¿?W¯^e÷îÝTTTðÍ7ß0lØ0%Q°k×.åÁ;((µZ͉'ˆŠŠ"))‰Ó§OãëëËÓO?ÍÁƒùꫯX¸p!nnn­V­¢¢"ÌÍÍ™9s¦òÙ¹qã?þø#þþþJ" ®ªª*¶mÛ†F£¡{÷îÌ; BCC‰‰‰áàÁƒŒ=ZiòÝwß)é“&MbàÀœ:uŠcÇŽ‘‘‘Áhô¼›[wBÜIu¯µUWWsîÜ9ƒ¼ååålÞ¼™””®^½Zoï‹òÊ+¯(”FFFxyyѯ_?þùÏ*­2kjjX·n²M=0`sçν££Úä^ík'x[;¦©T*f̘AUUûöí£¼¼œ„„²²²pvv®÷xÅž––%77—ììl¬­­±²²28n~ûí·JbĈxxxpòäÉfÕallÌØ±c9|ø0UUU|ÿý÷|ÿý÷8::âêꊛ›Æ ÓoÔÐ26t® ÀÊÊŠ’’âââ”k}bb¢ò™nêGÞæ^7 -³\K:ŸÍ›7·(¹kbbÂÔ©S™6mZ»n…©Ñh(,,nŽWÝÐ|õݳµ4~]»v¾}ûâëëË™3gHJJR®yƒ bÈ!DEE‘––FUUÑÑÑz÷ô-݇6^ØÙÙ€¥¥%$%%…ääd233éÝ»w‹â¿¡±Ub†¸H‚W!Ú¡”””vÜ­íûï¿§ÿþv¶ß²²2~ýõWàf«äE‹)­lmmùÿïÿQ^^Α#G˜6meee7ÇÔ6lfffxzzbjjª$anw9êZ°`Ò-ÎÕÕ•>ø€šš:DPPP½ÇŒWZ“<ðÀÊØÏ>û,¯½ö8p€§Ÿ~š’’N:€¯¯/sæÌnNbKII ±±±4zŽ·£î„¸U—/_nt½ö{Ò\%%%:]që3gΜz´VVV<ôÐCüç?ÿÑ[W]]Mvv6ÙÙÙÝѯ‹‹ *•ŠÜÜ\JJJ¨¬¬¤¨¨“z»ÄÞJLS©T¼þúëôèѸ9„…öš˜““Ó`‚÷vÄ×êêjfÍšÅÔ©SQ©TÄÆÆ6;næää(­a½¼¼X°`*•бcÇòÎ;ѬòÒ¥K<¨ × ýœ8q‚mÛ¶qï½÷òÈ#`fffPloì\áf7""‚äädÊÊÊ077'!!¸™|nì‡C®†”Y®%ÏéÓ§9zô¨Á¯>|8írBµº´É]€nݺݑø¥V«yå•W077Çßߟ?ÿùÏÔÔÔ`mmÍK/½„‰‰ Æ ãí·ßP~Xl})Ïþþþ:ÉÓ””%ž×Mð6'þ[%fˆ»…$x…¢:xð`½7XíEÝÉtÂÂÂÚ]‚wâĉ˜››ë,KOOçܹs:Ëjww9r¤N·>___6mÚDMM ÙÙÙÊû`aaÁõë×¹p᯿þ:ƒÆËË‹™3gbccÓ¢òZŽÚºuëÆàÁƒ•¿===±¶¶¦¨¨¨ÑÄUí}ýðƆê<è×NlÕî2^{|5µZÍ›o¾IYYY“ɦÛUwB4¦ººš°°0T*“'OÖ{ˆ«©©Ñù|×§¡oee%ûöíÃÄÄ„)S¦4»[p—.]ôjkk?˜©Õjz÷îMzz:©©©ÊxÅ...õ~÷o%¦ÙÙÙ)÷psìÙ†®?·;¾š™™é$< ‰›W®\QÖ=ZÙ‡±±1÷ÜsO³¼jµšY³fñûßÿž„„’’’¸xñ"‰‰‰Ê19‚••³fÍ2¨Œ+ÜlAMM øøø(-ä<<<°°°h°Ü†\7 )³\K:_Œ®Û¿)½{÷&((¨C5.¨Ýº¶¤¤äŽÄ¯=z(÷Â]»vÅÔÔFC¯^½”¡Qj'ÇëëmÒÒ}ØÙÙ±hÑ"ª««IMMåСC¤§§Óèñšÿ ­3ÄÝB¼BÑÕMÊ1yòävS¾ððp¶lÙ¢üÝÇÐkÑñË/¿è%x ”ÿ¯{ƒgbb‚••ÅÅÅäåå)7 ,àË/¿$//FÙ3g8sæ psÌÂ'žxKKKƒÊkh9j³±±Ñ¹áW©TØÚÚRTTTïöZùùùõþmÚ–µ××=7;;»fãíª;!R^^κuë8þ} ž|òÉÛ^­úZ‚h—56©[í$׊+«·î~ iyR×í¨;!êSVVÆ¿ÿýoIÁ.\¸ÀÊ•+•±Yóòòêí1QŸÐÐPƽ½=gΜá³Ï>ãúõëÊú£GRYYÉ3Ï<Óä¾*++9þ¼Ò ½®[™Aþvêׯ\¼xQIB74þî­Ä´öçJ.´4njãœVíIÇÏöíÛ˜Ê#fZZšÎß©©©TTT`ff†‹‹‹Nw¹³gÏ2nÜ8åaä½÷Þ£  €¾}ûòüóÏ7x¼ÛUwBÔuãÆ Þÿ}¥umm………¬^½šAƒqþüùz»ˆÖç§Ÿ~â矦_¿~ÊøuEEEaddÄ“O>É£>Jbb"™™™äææêýp÷ÕW_±dɬ¬¬t–_½zµÞ1ØÍÍÍéÞ½;={ödàÀm2l¶µî¥K—”zëÓ§O«Ç´¶ŽóÍÝWSq³öþŽ=ʈ#P©TTWWsâĉf•ÝÎÎNén|ðàAî¹çeÌH€ÒÒR%Þ÷ìÙÓà26Lj#ˆŒŒ$77—_~ù€þýû79ލ!× CÊ,×’ÎC;ôÇÝbäÈ‘\¸p€¯¿þš—_~YiÍ^SSÃO?ýDyy9îîîí.–âÂ… JÙzè!¥çv<á[ahl•˜!î’àBqW377çÞ{ïåÈ‘#¤¥¥ñÑGáïïONN»wïnv«Ó¶š222âСCÀÍ1}'NœH×®]ÉÌÌTƤ¬}3^» vZZ}ûö­·[¶¡å¨kÆ Ì™3‡šš¶mÛ¦,;vlƒç^{¬Þï¾û333,--‰Wfþýï‹‹ ÖÖÖÊÄ8gΜaË–- 8¨¨(妸vWí†ÎÛº¢%ªªªøøãëMîÖÞ¦%­dkjjLîÖ~·±±aÖ¬YLœ8QY~éÒ%V­Z¥<ðæääðÎ;ïðàƒ2`Àªªªˆ%44T§µ£©©)o¿ý¶N²¬­899aff¦´577ÇÑѱÞîÕ·ÓZª¾ØÓše1$n:;;3`À‰‰‰á“O>aàÀœ:uŠ´´´fO=èÓ§©©©¤¥¥ñ׿þ•{î¹ 9~ü¸Ò’ÜÇÇÇà26‡§§'fff”——+Ã1¢É×rÝ0¤Ìr-éùäòòòX»v­Îzwww¦L™¢üÈÅ‹¹~ý:ááᄇ‡+ëúöí«³m}çý /TwB´ÄÙ³gÛ¼EØÞ½{3fŒÎ÷ oß¾Œ=šÈÈHeY^^Ÿþy£û?~|»Hîj’ûöí«ÔoŸ>}³¥1íV4s[«,†ÆÍÙ³góþûïSVVFTTQQQÊXœMQ©T,\¸wß}—¢¢"®^½Ê?þ¨·Ý!C¸ÿþû[TÆ&MLðööÖi§M&7¥¹× CÊlèuX´_ ·Üi“/&&¼ð „„„““Ãõë×‰ŽŽÖÙÆÔÔ”'žxB§•j[ÄÒ[5hР凡øøxerFWWW% [{˜#C[%fˆ»&ÆH!„¸ÛuëÖeË–ÊùóçÉÌ̤k×®¸¸¸0}út.È*•Šgžy†ÁƒsäÈ®^½Êõë×±¶¶ÆÕÕ•€€¥[Ü?yÊ”)DFFRZZÚj娭OŸ>Lš4‰½{÷’••…££#þþþÜwß}Mž»ŸŸöööìÞ½›ôôtnܸA=5j'NÔiáììÌ_ÿúWvìØÁÅ‹ÉËË£GŒ1‚ûï¿_gbŒúÎÛк¢%úöí«L ÕVzõêE÷îÝõ–×Ù»9´Zµ§úÕ&x÷VcÚ­h(æ¶fY ‰›}ûöåÏþ3ßÿ=III˜››ããル«+Ÿ~úi³ŽgooÏŠ+8tè111äææRZZŠ­­-Œ?žaÆé$Û )csøúú* ^WWW½ILbÈu£¹e–kIçqãÆ»îœíììX¶l ::šììlT*ôë×iÓ¦é§Û±´5Îó…^à»ï¾ãÊ•+8991vìX†Êo¼Üü1T;tKK®EÍ­3ÄÝBPSûƒ_û¿u¿BÑúÆ0Ô.«½®¦¦Fgyíõ-khÝÑ£G;u}¾õÖ[:]^ßzë­fw¥¼²²²xûí·•¿Õj5~ø¡|Ú¹õë×sêÔ)T*ëׯ— V||<ÿþ÷¿•‰Àî$ Þ|óM½obb"«W¯nÑ>ß~ûme|U!„è,bbbøè£š½½ÿüç? >Njj*;w´”%K–`ll,•/„ètŒ¤ „BˆÎïüùóJKÀúÆ¢3ñðð`Ö¬Y-~}KþU*Ï>ûl½­w>Üàë,,,°°°hp½vb+!„èL‹{õiZ%%%|ùå—¼óÎ;ÄÅÅ‘ššª7á¥Bt2DƒBqøÏþ£tW®/ù$Dg3eÊ.\¸À™3gšÜÖÊÊŠ‰'âíí³³3jµš7npåÊNŸ>Mxxx³ºO:•!C†è-¯ªªâôéÓ –300€uëÖÕ»ÝéÓ§ ’7UÑ©:±UAAï½÷aµx] IDATSSSCDD;vìЮÇÒÒsss©x!D§$ ^!„â.`ffÆõë×±³³S’IBtvÍ'Ôßߟ9sæè=ôwéÒ777ÜÜÜàË/¿l0I«ejjZïr•JŸqã8xð Î°îîî<üðÃÊßO>ù$éééäåå)ËŒ1b„¼™BˆN§[·nØÙÙ4ÙZRRÿüç?9r$3gÎÔ‹ó—.]bË–-¤¦¦ê½ÖÃÃC*]ÑiI‚W!„¸ ´dÌ:!:²²²2~ýõ×F·™>}:3fÌhr_VVV<÷Üslݺ•ððð· çÐâÁÈȈ   ÆÏöíÛ9wîvvv<÷Üs:ÛZXXð§?ý‰ýë_”——ãååE`` ŽŽŽò† !:%//¯FãjCŽ?ÎÉ“'™4iÓ§O§ººš;vðË/¿48”ƒT¸¢Ó’¯B!„èðjjjÈËË#33“ÌÌL(//opû#F4+¹«¥R©xä‘GÈÊÊ"!!¡ÞmJJJøöÛoñððÀÁÁîÝ»cbòÛí¶““/¾ø"çÏŸÇÖÖ–nݺéí£wïÞ¼òÊ+”——3xð`yc…Ree%&&&Œ3¦E ^í>öîÝË‘#G”Ükkké !„èÔ$Á+„B!:´Ï?ÿœ¨¨¨fOžcjjÊœ9s >Ž‘‘>ú(ûÛßl!¶ÿ~öïßÜL ÛÚÚ2vìXxàe›¦·nnnò¦ !:­¢¢">øà^~ùeúô郧§'qqq-Þ_c‰]­É“'ëüà&„L£-„B!:´#GŽ43º666-:–³³3ƒ jÖ¶555äççsàÀy“„(,,dõêÕddd°wï^æÌ™s[“¯ÎÎÎL™2E*_Ñ©I‚W!„BÜU† rG_ßPk_!„¸›h“»9998p€¬¬,œœœnÛ°¦¦¦ÌŸ?_olt!„èlZñg2[F/ZB›ú·Eštö‡ðc©óÏÇ×¶ÖæÑlZµ™³Ž3xuÑ\j¿,åkÞ]{”y„B!D+³³³kÓ× !ÄÝ&??Ÿàà`rss•eUUU|úé§,Y²„‰'’““£ qÓT*Ï>û,}úô‘7@Ñéµb ^üj'wÔ.x{Ø‚­7^¶u6·õÂÛlÝ$¦n øoh(Áã-å#„BˆŽltk·ÀÒL!š/??Ÿ5kÖè$wµÒÒÒøïÿ @PP­rLµZÍÂ… ñññ‘7@qW裌kâ÷_ª åØö„‡·7Sz3aÂ&/ÙNJ…¼ÙB!„âæ?·¢°°P*Q!š!//5kÖ——×à6‘‘‘˜››ĬY³pqqaË–-”••µè˜ÎÎÎ<ýôÓ¸ººÊ „¸k´b‚·€ôpÓi2«!;»J“ÉÆí³I.…’ìl48¢Óˆ· Ý á²Ã7³qWŽîBSÆ/fé„ùü}a ó×& 9^!„B‘€ŸŸß-½^!Dãš“ÜÕ:pà×®]ã‰'ž`äÈ‘ 4ˆ~øÈÈH*++›u¼®]»2uêT¦L™"=-„wVLðæ°kÅÂl­”d­¦¤€Ò €£„,9‹­Õoi\e]Ág,]bYk†’‚Ò[OÆVäp8x9^k™9}!þ›sXõB!„èt<==‰‹‹köö'OždöìÙ˜™™|¬k×®kÐkúõë'o’â®rõêUÖ¬YC~~~³_Ezz:O<ñýû÷ç±ÇcæÌ™DEEqþüyÒÒÒ(((P&®466ÆÞÞwww†Š&&&RùBˆ»R«G¿Ú-qÕjþ—àmêEê:{(mÂT¤°s{:3z0}%‡j÷kŠÃèy,œ7_w;Ô€¦$˜ÃÛùlS)µoÚ›Ñóæ3oŠîvV É'=&ŒMk7s4G÷äÔŽ£yjþ<&x¹ãh¥!;>œÍk×Vw|µ—ñ x*ÐowGÈO'>z;׆é %aÚ{< âëᎣU ùÉ)ݵ– au’àÍ='KFog¹å,ËfæÒÅL÷ÈæÃy/òcÁÍ},š7wGÔùéÄGïds˜Z¾)B!„h·^~ùe4 ÙÙÙÊ¿„„„[Ú–””°gÏ~øaƒµcÇ4MƒëquuÅÙÙYù×£Gmrss±´´Ä¢Þ}äççcdd„¼¹Bˆ'77—5kÖPP`x «ììlÞ{ï=|}}ùÝï~‡««+'NdâĉTWWS^^Ž‘‘Q‹~¤BˆÎª¼þ})þVµ—iˆÙ°ŒÏr|yuYP!ÒùzEÑO±b¡·î %‘¬Z¾œV(UA| %¸ÐÛÏÓ£)T–¾‹Y»|Vùñ„ï #Gܼ|ñ›¾o ó—þß¶Œ_ÌR+ò“#Ùw8zûâïÄò`+–,\ËYmâÔÊ‹Åk'@L(¡›Ã°t›ÂÌ©SY¼JMöüwÛP{½ÊZ+’#ÃØ­ÁÑ{ ¦.f­·Ký¶OKßE¬]1G²‰Ù·“ðRKÜü§2}ñFF{-caH´’ oþ9i_àÍü`ü­òI9K†Æ”Þï²q¾hÒ‰Ú·“ zã;áEÞpó!&G¾/Bˆ ??Ÿ;v’’µk×prrbÔ¨QÜwß}zÝõJJJøá‡HHH ¨¨wwwî»ï>† ÒäqÖ­[ÇåË—Y¹r¥Þº[Ù¯!^xáüýýyì±ÇšÜö­·Þ"77—U«VakkÛ®ßÃõëד””ÄêÕ«;ÜçÏ÷D´.µZ‹‹ ..7ï8ÇŽËÒ¥K©®®®wûŸþ™>}úàëëÛìc>|˜#GŽ4|cmbÂ’%K077¯w}yy9»wïfÿþý¸ººòÚk¯ajª;õnqq1kÖ¬áÚµkpÿý÷£V·Ýí555Õm/^¼È®]»ÈÈÈ ²²'''&OžŒŸŸŸ^¬–ø+ñWtN­˜àµÅÑJïVGG+(uÇQo{GÜ-!Á±Îø»VŽØÒ: ÅŠÒlJ[[Ëÿ-±Ä+pVÄüâb ~+ÿ´7ó¢÷z›¦ °õ%Ðß bþÎÂ¥Gÿ—L5e{`0kçù2¡·)g•†!v˜†½Zk¬ßP"ÙLÈT/&8šr¶vÓ\++¢‚°S* ;'¥¸þ _ÅSÁ‡É©l§<ßJÂùûÂw9ªÝÇg£Y¶a9þÒˆWÑñ÷¿ÿFý÷Þ‹ ñññlß¾ÄÄDž{î9å&·¢¢‚._¾Ìˆ#2d'Ožäƒ>ॗ^j4{êÔ)NŸ>­×*ïV÷{;YXX`iiÙª7ùµ¥¥¥qæÌƵµµ|E›³¶¶ÆÏÏãÇ7¸Í'Ÿ|Bqq±Ò2¬!555„††òý÷ß7ºÝ½÷ÞÛ`âáØ±c|ûí·Êo/^dóæÍ<õÔSÊ6UUU|üñÇ\½z€Ý»wó믿2{öì[3øVlÞ¼™ˆˆúöíËÔ©SIHH`ëÖ­”••1mÚ´Å_‰}BtN­•ÜxôÑG›ŒÍù>Õm“’’xï½÷°¶¶ÆßßSSSNž<É'Ÿ|BQQS¦L‘{O!îwá5¥D¯˜Ç¾µÇÕ.ˆfSðfÎÚÎ`É¢ 8Ö~YÊ×¼»ö(·Z$S7fº1„&üï¦Òv‹æ{CL0ó–†Õ:†%zSlX:àæhEIz‡w%px×Íót›²ˆU‹'°h~(áï¦\,µ›/.¦ÑÔ–[ü]€øx * ¢ üéíÛÓà :I_ÓÞ~8ùÚ&¸†œSCéùôlÀ¯AVRP'Iî•|W„¸£úôéCPPÛ¶mk÷e={6ƒ jór¨T*–-[VïºcÇŽзo_nܸAEEE½Ý©µËê>¨TTTðÅ_0`ÀÆŒCxx¸Þk[²ßºRRRX³f jµš‘#GbaaALL ›6m"##ƒÙ³gëláÂ"##¹çž{2d 8p€„„Þxã LLê¿ÔçççóÎ;ïPYYɨQ£èÚµ+ñññìØ±ƒÄÄD-Z¤ÜÐÇÇÇóá‡Ò­[7F…‰‰ ‘‘‘„„„ðç?ÿ™Y³fqôèQöïßÏܹs•áD¾øâ Nœ8‡‡¾¾¾deeqúôiRSSùë_ÿÚ`Ù´I¯ýë_ôêÕ‹û￟ÌÌLÂÃÃùàƒxçw”›Ê¸¸8>úè#?~}:í:ѳwï^öìÙƒ þþþʃˆvìÈÚ,--ëMÄîÙ³‡¼¼<^xá…o²Z²ßºåýꫯ066æ7ÞP~íàøè£ cìØ±899)¯ÉÎÎæé§ŸfÔ¨QÜÿý|÷ÝwìÝ»—ˆˆ›þÚ¾ýö[ª««Y¶löööÊq´¯=}ú4ǧººšmÛ¶aeeÅ›o¾‰•ÕÍŸü&NœÈòåËÙ»w/Ï=÷iiiÀÍ_ê]\\Ðh4DEE1bÄ.\¨÷çŸVZ<46®tyy9ÞÞÞÌš5KYfddÄÈÊÊRZR=zSSS–.]ªÔqMM ï¿ÿ¾N«ÈÁƒcaaAtt´ÎMvTTð[ ÉæÖKcšûžr,CË•™™É”)S üí¦ÏÄ„}ûöqåÊ•v3¬Êí––Æ… Ú´ III\¼x‘þýûë|~½¼¼êýq¨1Æ k“s(..¦¦¦†®]»òã?rðàAŠŠŠ055eèС*ŸECâ¯Ä>‰}û:‡+W®Ü*ÉÝÇ\‹ünbhœlζ~ø!ôïߟ¹sç6Y‰¿%þJ‚·Ýpœ0ŽÚn_jl{ÂÃÛG5hâ7°|Ão-`+ÒÉΟÉÔé«vˆälJ)–.^øû» Éì¼™¿h6þHBüׄeû3}ú»¬µ #2¾+7¼|½q!›Ðíñ”¶ ¼šì¼_üŒµþûˆÎG¯ ø»«ÑÄo 8ü™ÕŠ6‡ìÃÅT^ܸÿ}‘¤”Zâæ??GÈߦ„ ÃÏ©¡D²vCÈ¡C‡8wî\½7ÙUUUœ~ü8vvvxxxT/Þ—4ã=1äX--×ï~÷»zë¯=Å’ÛÁÕÕ¥ëf[pssÓ‡·°°£Gu3366fÔ¨Q <€ØØX½áy~ýõW~÷»ßéůÛMÛý÷رc˜™™qß}÷aggGjj*‡"55•åË—×[®æÄ_‰}û$öu\—/_&88˜’’’[Þ×O<Á˜1cîº:4$N²í£>ª´ˆˆ 88˜×^{Mog‰¿%þJ‚·¤€›NK] ÙÙ%PšL6¾u¦éÊ&¹J²³Ñà¨Û¶ Ý Ö»j©Ì¬Ó€¬$;†};7óÙ®³ºûªH`íÒUT,šÏx¿©¸{ç“–ͯ.%´ÀŸÅ+0Á×õ$”&°aÉ2²>Å ¯éùš²ã÷ñáæÏøñl)`ipMeï\λ¥ÓyjÆh¦ûÙAv2Q_ofígGu&—+aÁ‚³,\Èè 3ñSkÈO!4x-ÂjM¾fÐ95Tª 2v-fAÆS,zjSgâ—ŸNLø‡¼º¹”…Ÿ-•o‹mH¥RéŸ$êW]]MXX;wºš±cÇ2kÖ,VµÚ®jõ ©½ÑNTQ]]Í—_~‰££c“7‡†ì·>¹¹¹zã|ÊØU99ºÓöîÝ[/¡lff†£££Þ¶µS]]MDDõn£m‘“Ý`™jßHêÝ`˜˜0gξþúk–-[†««+ `èС 4¨ÉñÄÌÍÍõºÖí`eeEAAÑÑÑdddžžNrr2ׯ_×{˜9r$œ‰}û:¶ŒŒ BBBn9¹«R©xâ‰'ÚlŒñö|Ÿz+1UÛsÄÏÏ{{{¾ýö[Ž;Öàð%þJü•o=rصb a¶VJ²VSR@iÀQB–œÅÖê·»¦ àfëׂÏXºÄ²Ö: %¥Í˜h *¢—2}ºá%­È8ÌÚ¥‡Y«·&Œw†ñníms¢Ù¾"ší î­”£‹§S_1J/fúa³\)ðZ–‡­mFYÃX»4Œµ­vN — 'ú3–G¦·|±Î‰!nÕ믿~×ó;ï¼Ó`ëÖRSSçŸ~JTT®®®<õÔSõÞvéÒ“z‡KÐ.Ó&b;ÆÅ‹™?¾ÎØ™TVV’““ƒ±±1öööí×PÚ›ÒæÕQ]]Ý`}k÷1vìØo”µÉí$U-¹A›8q"ÞÞÞœ>}šóçÏsäÈöïß““/½ôR£Ý»›;NWdd$›7oF­V3dȆÊôéÓ Ó›ÐjÀ€ØØØÍ”)SôºÈR/-}¨Ó¾'†«%åºÛÇ9³°°à•W^aÍš5deeé}—fÏžÍ}÷ÝG\\‡"&&¦É}úúú2fÌ<==9xð ß|óÞ÷ÑÁÁW_}FCppp£û›;wn½Ý½½½¹ÿþû U–QTTDbb¢²ìƒ>¸­?üuíÚ•JÅ Aƒ”ä®ÖðáÃùâ‹/HMM58þJì“Ø'±¯ãJOO'$$¤Y“&6ænMî'›»mvv6qqq :To"¯¡C‡òí·ß¶xòP‰¿%þv,­üTPªMÜê­*¥   Acë„¢jñÊ:âMííöóÏ?ŨQ£xì±Ç¼ÉT©T¸»»“˜˜HUU•Î/úÚnÝÚîÕEEElÚ´©Þ}-[¶Œ=z°råJƒö[íy}­µËꑞžNMMÎMðõë×ÉÎÎÆÛÛ»ÑãTUUéM§ÑhHNNVºþ9::7gWöòòÒÙöøñãdddðÐCéãúõëäååaooϤI“˜4i•••üúë¯lÙ²…Ÿ~ú‰yóæÝÒû]YYÉÖ­[:t( ,ÐieQßÈJ¥ÂÏϰ°0 9~ü8ƒ ¢{÷î×KSÀM½'†«µÊu·éÖ­¯½ö!!!\¹r{{{,X LN3dÈzõêÕ¬ïœ9s”h&MšDß¾}Ù°aƒ2™[¯^½xùå—±¶¶&//¯ÉäFccëŽ=Z'ÁÛŒŒŒpvvæÆú·îzwÍ¿û$öIìë˜ÒÒÒ ÑéªÝ*•Š'Ÿ|²Ññf;+Câds·½~ý:_}õL™2Eg6_÷G:‰¿%þvNFRBѹ=š+VèýÓÎúÚYTUUqàÀ sK IDATlllxòÉ'›L.Œ3†òòrŽ9¢,+..æÄ‰¸¹¹áìì € ,ÐûgooO×®]Y°`<òˆÁû­µµ5®®®üúë¯: ¢ÊÊJ~øáT*C‡ÕyMNNŽÎ±jjjعs'••• þâ®mqpâÄ ½V?ýôï¿ÿ¾’ØîÕ«vvv8p@ç¡îúõë|óÍ7$&&êÜLjù™™™¬\¹R'Iebb¢ŒÕÕØXÄÍ•ŸŸOyy9ŽŽŽ:7ØW®\áüùóÔÔÔèý° ­“={öpåÊqÿ ©—Æ4ç=1äX­U®»‘6É;|øpFÍ[o½¥$wµlllèÒ¥K£û111¡[·n:ËÜÜÜxë­·ðóócÔ¨QüùÏnv }“F[º45ãù2nÜ8HJJÒù<ïÛ·€¶(þJì“Ø'±¯cIMM­7¹kbbB@@?þx£?`×Nv=õÔSwer×8iȶ½zõ¢K—.DDDèŒsZ]]Íþýû›­H%þJü•øÛùIj!„hfff:c1ÞNÑÑÑ\¼xQoyAAÁ;_LMMoë1²²²(**ÂÑё͛7×»ÍÀ=z4#FŒàçŸ櫯¾"33kkk"##)**â©§žR^ãääTïÄj?ýôFFFøúúê,oî~zð™3g!!!¬\¹’Q£FannNLL L:U­v’éË/¿$66GGG.\¸@RRžžžøøø4x¬ÀÀ@V­ZÅ;#¿¿?VVV\¸pÄÄDF¥<¨iÇ3[¿~=+V¬ÀÏϵZ͉'¸víÏ>û¬²ÀðññaÈ!899±oß>JJJprr"77—ØØXŒ[åá®{÷îØÛÛÆÕ«Wqvv&;;›Ó§OÓ½{w®\¹ÂÖ­[™1c†ÒÒÐÕÕ•=zpøðaºté¢79Dsë¥1Í}O 9Vk”ëneeeÅsÏ=×è6NNN\ºt©ÑÏZ}]E»víÊÿøGƒËTQQAVVVƒ“666vðäïïOXXÁÁÁŒ9;;;’’’HHHÀËËK‰†Æ_‰}û$öu—/_&$$¤Þ‰­‚‚‚˜0aps›7Þx£Á¾*•Šùóç3jÔ¨»² ‰“†l«V«yøá‡Ù²e ÿûß>|8ÆÆÆÄÆÆ’––¦ô8‘{O‰¿;?cww÷¿Öþr×þoÝ/¾B´Ú {GebbB\\Ü9Vuu5¥¥¥zÿš;žVk˜1cF£­ZÃ¥K—8q⥥¥¤§§×û¯k×®J7%ccc|}})++ãüùóÄÆÆÒ»wo}ôQ<==›<^DD•••Lš4I÷Âz‹ûµ³³cøðáäää@bb"666<ôÐCL:UçzÊäÉ“7nñññœ>}µZÍ„ ˜7ožNË‚¨¨(òóó• ‘ºvíʨQ£ÈÏÏçÂ… œ?µZÍôéÓ™1c†ÎkœœðôôäÊ•+œ;wŽ””yê©§”|666dffröìY ;v,ÞÞÞ\¿~øøxbbb(,,ÄÅÅ…Ç\™¤>uËZû!óÔ©SŒ;[[[T*C† !77— .ššŠ……O>ù$“&M"11‘ôôtüýý•š*•Š’’ñ÷÷×»É6¤^êcÈ{bȱ Ù¶¡ú»råŠ2#²v&gqSRR ®÷ððÐû1§).\ ¸¸¸Áái ¹çž{ô–WUU±iÓ&1¿ë^?ÜÝÝ3fL“ŸÇ[ejjªÄ³””Î;G—.] 00P9¾¡ñWbŸÄ>‰}CMM ï¿ÿ~ƒñhÆŒJÏSSSNžÜê¤(Btf“&MÂÓÓS™<¬6333Z´_cccppp`ðàÁÊðZQQQDGGÓ£G%\×ðáÙóÌ3õöV…­K¼BÑÆŒ±··—Š·E^^‘‘‘$%%áââ""D·5Õ7ãtMM 999 ¾¦© à„Ä>!n—æü¸•™™©7 €‘‘Ï<ó ~~~R‘…w€ôïB!:±K—.ñã?âââÂܹs¥B„h#¹¹¹œ9sÆà×8q‚ââb©@‰}BÜqŽŽŽ 6Ìà×IrWâ¯Ä_!î<ƒWÑ*d ^!„¢aß~û-{÷îmÑkgÍš¥7q‰BÜ eee„„„ššÚ¬íŒŒxöÙg ž˜R!Ä­‘¼B!„BÜfǯwù€xõÕWyõÕWì}âÄ ©@!D›077ç•W^ÁÕÕµÉmŒŒøãÿ(É]!„h’àB!„â6ª¬¬ÄÊÊJoy·nÝxöÙg•I7Ÿ{î9ÔjµÞvÒ“NÑ–,,,xå•WèÝ»wƒÛ±`ÁFŒ!&„mÀØÝÝý¯uoeˆ!D{÷ì³ÏJ%!„茌Œ7nVVV¤¤¤PYY‰‰‰ /½ôÎÎÎÊvݺuÃÞÞžS§N7“*³gÏfÞ¼yr/.„hSjµ___âââ¸víšÎ:þøÇ?2|øp©(!„h#2¯¢UȼB!DÓŠ‹‹Ù¹s'žžž vc ¥°°?üáõ¶üBˆ¶¢Ñh8pà111”——ãââB@@={ö”ÊBˆ6$ ^!D«¯B!„B!Ä'cð !„B!„B!D% ^!„B!„B!„è $Á+„B!„B!„”$x…B!„B!„¢ƒ2vwwÿ«ö™dMÑQ<ûì³R ¢ÙÒÓÓù¿ÿû?ìííqqqiÑ>öìÙÃúõë9pàS§Nå³Ï>cݺu899Ñ«W¯yNZü1IIIxyyÕ»þâÅ‹|þùç|óÍ7„††rúôiÌÌÌèÙ³g«ßhëù—_~aÒ¤IÍ~Ýúõëùꫯ¼Sïø9µ4N6%¦ !1UîS%N ÑÒ‚W!„hBFFßÿ=NNN<üðØ™™aii‰‰‰I‡>·¬¬,Î;×àú¤¤$V­ZÅ•+Wð÷÷gÒ¤IܸqƒO>ù„ýû÷ß¶z~ðÁÜ.--~ø¢¢"ùp !1µÍµ4N6%¦ !ä>Uâ¤Íe"U „B4.''€ßÿþ÷ <€G}”G}´CžOUU±±±\ºt‰Ã‡SUUÕà¶;wîD­Vóæ›obmm À´iÓøÛßþÆ÷ßÏäÉ“[­o}õÜÐMöîÝ»ñññQÊ$„˜ÚV ‰“†ÄßÿÏÞ½ÇUU'úÿqa;€¨ ‚)xK.!(ˆš&j:¥SØI;“N3zúNú=ó›œÊšQÇÑ©´Òæ˜ÕCÏ1ÓtLKÓ¸yŽ˜¢F˜ˆ¢¹xÙ Êv¸ÿþ0ö¸”xíý|ûŒS§NáììLXX&L %%…¸¸8ŠŠŠpuueüøñDDD´è8‰‰¡¨¨ˆÊÊJÜÝÝ f„ uºjÕ*ÊËËyñÅÙ°aééé,Y²ƒÁ`Õ1$¢L½5™jmN¶4•©ÊTQ¦ªªœTNŠ5t“5¹'é&kÒ”ÄÄD>þøcjkk £sçΤ¤¤žžŽÉd"88Ø|££ÑÈ¢E‹8}ú4ÁÁÁøûûS^^ξ}ûÈÍÍ%,, ¼¼¼0 deeMdd$äääpôèQF³³3)))”••±ÿ~ ÇÇÍÍ””ÒÒÒ5j¶¶¶V­ÛÚ2µ” öööØÛÛSSSC\\={öltó ;;;zõêE§N(++ãÌ™3$%%‘À!C¿îº²³³Y²d eee„„„зo_NŸ>Mbb"••• 0 Ùz¾V÷îÝqtt$''‡)S¦0|øpÜÝÝIII¡¸¸˜Ã‡c07×ÿwß}Gddd«êÿðáÓ””„¯¯/!!!qèÐ!Ž?Nrr2C‡¥ÿþ?~œC‡1hÐ C³u’‘‘ÁŠ+°··'""???L&‡Âh4b^6%%…ŠŠ >L~~>½zõ",,Œòòò—AD™zë2ÕÚœliþ*S•©¢LU;U9©œkh¯ˆˆÜL&[·nÅÃÃ?þñtèЀqãÆ±xñâFËoÙ²…ºº:æÏŸonÌ?žÏ?ÿœØØXÒÒÒ8p Ý»w§¸¸€ž={Ò»wïf·¡¨¨ˆ1cÆý¯­½=qqqÒ£G«Ömm™nµ+VPPP@ïÞ½™2eÊu—¯¯¯gãÆØÙÙñÊ+¯˜/Q?~<ï¿ÿ>ñññ >Ü|‡ç–Ôs=ÈËË®Œ:¹úKCee%AAA<õÔSæÇlmmÙ½{7ÅÅÅæ‘-­ÿF£‘éÓ§3dÈBCCùýïONNo¼ñ]ºtÀÝÝ>úˆœœ¼¼¼š­—àààÀ¼yópqq1×Õ;ï¼CFFF£åsssúè£MÖeee«÷½ƒ6ÿÝ¡C ½{÷67°ºvíj±¯›3yòdþú׿šØ ìÊÊÊf_ûôÓO›Ø·òøQ¦ÞÞœ´†2U™*ÊTµS•“ÊIiŽFðŠˆÈ}¡á.¸M]ÖÐÐjpöìYêêêØ»w/{÷îmòý.^¼hõ6´oßÞ¢ §8²fÝÖ”évhÙ0hÐ <<<زe äá‡nrù³gÏ4šƒ 0ÏõÖPƶÐTý7\w3ûÞÉɩѼb666.…kéeiƒÒÒRRSS)(( ??ŸS§Na2™pttl´¼££#nnn·üøQ¦Þþœ´†2U™*ÊTµS•“ÊIiŽ:xEDä¾p½‰ý¯müÔÖÖ0|øpš|ÍÕ¿p·ø¤jãÓª5붦L·BII XŒ‚`Ë–-ÝÔþj¨6iÔ´qýß*III¬_¿GGGüýý  **Šøøø&G•´k×î®+ƒ(S•©·>'•©ÊTQ¦ªªœTNJ‹GUˆˆÜ.WÊËË£W¯^Ïåçç[üÝð%¼¶¶–~ýúYÝ蹆Ǯ7_Ø®ÿ[¡¦¦† 6ÀŒ3,Fy´ô Ç.ƒ(S•©m—“­)«2U™*ÊTµS•“ÊI¹–æà‘û‚ŸŸƒ˜˜‹K„.^¼HBB‚Ų ¿^:t¨ÑȪ¯¿þšwÞy‡ .Ü’í´fÝÖ”éVèÞ½;NNNìÝ»×b~®ºº:óúûôéÓìë]]]éÑ£ûöíãüùó ÍíÛ·cccC@@@«·¯¾¾þ–Öÿ­`4©¬¬ÄÓÓÓ¢]XXȱcǨ¯¯¿a¹îtD™ªLm»œ´†2U™*ÊTµS•“ÊIiŽFðŠˆÈ}ÁÉɉI“&±nÝ:.\Hhh(¶¶¶¤¤¤àéé‰Ñh´X>::š%K–°xñb"""0 œ8q‚¬¬,ÂÃÃDhK-]·µeúöÛoY·n!!!<÷ÜsmÒÈÿÅ/~Á§Ÿ~Ê‚ 8p vvv=z”¼¼<"##éÙ³g³¯·±±á™gžaùòå,Z´ˆððpÚ·oOzz:Œ;Ö<šU—/‡Û½{7ÁÁÁß’ú¿:uꄇ‡ñññœ;wŽ®]»RRRBZZ:u¢°° 6ðä“O^÷R·;YQ¦*SÛ.'­¡LU¦Š2UíTå¤rRš=NU""r¿>|8®®®ÄÄÄ””D‡ aâĉ̞=ÛbÙ®]»òÆo°e˾ÿþ{.^¼HçÎyæ™g9rä-;Ìšu[S¦šš***Ìwím #FŒàg?û±±±|óÍ7À•KÛ^xá‹»û6§wïÞ¼úê«lݺ•o¿ý–þóŸtëÖ_ýêWÍÎáu#’ššÊùóç­ndßÉ}okkËìÙ³ùÇ?þAFF™™™<ðÀÌ™3þþ÷¿säÈ¢¢¢îÚ2ˆ2U™Ú¶9i eª2U”©j§*'•“Ò›G}Ô<»a‡4µc´³Däzšº¬£á±«Ÿ»ú†_ï±æž;pà€*]¤ ÇçÀ<ÿüóª eªˆˆ2Uä'@sðŠˆˆÜG èÚµ«*BDD™*"¢Lù‰Ð "Òˆ 6Lut%Ⱦ¾¶Ž·l=§j+I«ºÌ›Îs±¾V/r“Nœ8A~~>Ï<óŒ*CDD™*"¢Lù‰Ð "ba¬ƒ 3Ýp±¹}ü/ÕÕò~ÅY¾þg¹¦h±‚FðŠˆÙXæ´ëxÛ×k°µãå^ìº|A;BDDDDDDD¤…4¯ˆW¦e˜áèvG·á·.1Ø(–DDDDDDDDZJ=)"Àsí\oë´ M1ØÚ1ÍÅC;CDDDDDDD¤…ÔÁ+"Úµ»+¶#ØÑY;CDDDDDDD¤…ÔÁ+"øÚ:ÞÛÑÛÞI;CDDDDDDD¤…ÔÁ+"""""""""r²WˆÈMéìÏO‚`pªÎÁþX¿.¨zDDDDDDDDn%uðŠHëuŽ€åÓ ú8|ú!œú †‰Ï\éðý݃IÕ$"""""""r«Ü†^¼#ˆòų‹ @Å™²3SIMͦTû@äÞ''ã9xõ=È­¹òð¡øa.ün(o…ýåª*‘[ä–vðº>É´©#ñ¹öÞM>>ô *:ŸÔÍëYŸz¦Uïï8ŸÍK#hêÖP—Œùd&®gõšD ªÛ°P¡,øb!A{^&zé®ÿÖîŒY±ž¹î;yiúJ²«uÀÉ}¦‹+P ¦ËÇOýÀÅAu$"""""""r ݲÞ.cæ07ʧÉÎW3GB§ÎÃ×÷–m>NE+×Uuj;ük,°£‹'¾¡ š8Aý™3c5ÇÕ¹*ÒÆj`ßqîÿ/ÞÜýãt ö0Ì(†£çUM""""""""·Ð-éàu œÑ¨s·*óæ­>€÷Ô%Ì ý׳î3™Qº„åñ­É[šºžÕk ,tðæñ¥«™Õ"3Gnfn¼&ƒis{>‚ž/Âøg`íÏa_"œõ†(àý÷ PU$Òœwß}—³gϲhÑ¢{¾,999|ñÅPSSƒ——£GfРAØØØ´zÙŸJ½ççç³hÑ"žþy†ª‡ÈOQSâÞ†ÛQ]@ü{¸øFx£ ÅEn…j8k‚Šs°/‚ÇÁÄ0ÃY ›—Û///íÛ·sá•ó69yò$K–,¡°°ˆˆ"##ùç?ÿÉG}DBBB«—U½‹è˜ÿ)–óÂ… ,X°€ÔÔT|ðA{ì1ÚµkÇæÍ›Y½z5õõõªKeÊy‹3µ¸¸˜ï¿ÿ¾ùoÁÕÕ,_¾œ={öЭ[7†ÊéÓ§yï½÷8zô¨v¹#Ú|o—éßTg®ƒ#@5àØdo«Qcºp`ó™¶Û˜Š*ƒ‹ Ž@5. Y¶™×]>`Æü&ΛKTÿVLÅ®RpðÁÌÑ„ö÷ÃÓp ã©l|±’â ϵëèˆÏˆL‹Ž ÈÏŒùd¦nfõÊøϵëÈ“/M'*ÐŸŽŽT3Iúb=k¶¥rÆüZB—|ÁB÷5¼´´”¨Ñ éïCǪ|Ò׳ìƒ$#fòÒÔù¨2žbÏÚ¥¬¼z[¼2u:SÇâ×ÑUFòÓãY³r=ΨóMÚ@Ôl˜æz2._‰”‡FÃozíªÇEn_ƒrÇŽãêêªrÞÛ¶mÃÑÑ‘W_}Õ¼-?þ8þóŸùòË/=z´yd®5˪ÞEtÌÿ˹cÇ._¾ÌK/½D`` ãÇçÓO?%11‘ï¾ûŽàà`Õ¥ˆ²FålãL­­­åèÑ£üðÃ$&&R[[Ûìû~ûí·ðÔSOñè£0zôh-ZÄŽ;Z4ŠW¤­µñ^w‚‚Z0 ·™Ñ¼†Àº´åÖ†â  ÎPuõ.AL_ö:Q¾Uä§¡  \B_bõêyD 2P’´MÛ’È65w5kæ„ârmç°r^îgRÙ¶iIgÜ ;—•«_"Ð¥ùmrð~œ%ë—2s¤;¥©;Ù´i'©¥ÞŒœ¾Õ o\~Ï(,›oI<›×l"©Ô‡ ¨y¬\¹š•sûQš´žÖÄ‘oðcìÜ…Lõv0ï‹ó–ñúäÜK·mq鸚ÌëËf^wEZÄÁ&úÂ鯯êÄ­ïbàÕÏW˜¢›Èý¬¾¾ž~øX4àð÷÷§²²’sçÎY½¬ˆÈOÕ‰'ðòò" Àü˜¹áøñãª$‘[©•••¼ÿþû|õÕW\¼xñºï»oß>5j”ù±Ž;Fvv6%%%ª|¹íÚx¯;ÞÍöï:þ8Šš›¯Áà‹§ÜôàRw|#¦2g–PBâÎ|˸#è·g Ó–%^Y—ƒ/3æDáI&+f¼Ì®‚—^³ùÊ<¾cç0õ‹é¬¾zh®Á@ʲ¼nž7x=;g¬déÄ(æFmcúæ‚&ëgäÜY‘ΊióØÕðÒµk|i%K£fòÒD^?pÕíæÝ)X6y?Î!üER +ÖÎÂÏç̘Ë?nk|‰'›çÚßÀÚ‚Rp%:Âé ˜9ïÀ7°s`sô2VN e¤·Gtç9¹)Îà ”51B·¬ª—Ÿ©šä¶Y¾|9™™™,Z´oooæÏŸÀŋٶmYYYF:uêÄ!C;v¬ÅÜ[~ø!çÏŸç7¿ù Ÿ}ö§NÂÙÙ™°°0&L˜@JJ qqqáêêÊøñ㉈ˆ0¿~Ö¬YŒ7???bbbÈÉÉÁÍÍÀÀ@žxâ ®?aPzz:111QYY‰»»;ÁÁÁL˜0''§6+gUUqqq$''sþüyœéÓ§'N¤sçÎ-®óêêjžzê)ºuëÖè¹Ë—¯dCÃv[³lsV­ZEyy9/¾ø"6l ==%K–`0Z\ö;Yï 능  WWW4h>À¢LU¦R__½½=}ûömt5C]]ÊIeª2õdjûöíyï½÷(//çµ×^kö}O:EŸ>}ÕÙƒ>ÈÿþïÿrêÔ)<==o¸lܸ‘“'Ob2™ðõõåé§Ÿ¦{÷îV×ýÇLrr2‹-jTOo½õ999¼ùæ›8;;ßÔù@~2¼š›k×ÑG ‡f¦høq±†^`+xN^ÍÎÉM=c$eÅ|Ö4š3áë×$þ«#ÙsáRÜÄ\µluñpU IDATÄ1}ùX"Fx²:ûªNÛ’¬ÝsõtYÿ)Q¯3hL ]6Ðh² ÷P¢úÃ¥=›9Pá‚ËU£h³·mâTÔ,‚FúâpàÈUUɶ¤«nWšMÁ%ð+ØLâUÛZU‘ Ì“ W]ºÒ©ëA ÷TÕlžÅÄÍ:ð¥ TŸ‡³@ÏÑÐ-Éò†j=]©4Gõ$·ÍSO=ÅHHH`Ê”)øøø\9,^¼˜ššÂÃÃéС™™™lݺ•¬¬,^zé%‹Fß… xûí· fÀ€ìÛ·;vpüøqJJJˆŒŒdРAÄÆÆòßÿýßôêÕ ///óë;ÆÎ; dÔ¨Qœ}°···zß©zOLLdýúõ¸ººš¿p:tˆï¾ûN`Q¦*S±±±1w„\ëàÁƒWšX={*'E”©ÊÔ[©666´k×ÎÜnmÎ?ÿùOª««qsskô\Ãcååå7ܾªª*þö·¿Ñ½{w{ì1ŠŠŠØ³gï½÷‹/6w´¶´îÃÂÂHNNæÛo¿5Pnhsgee†³³óMä'ÕÁ[AiMOÁàhø±ïÑ‘æ?*ÕTUY¿ÖªS{Øy¤ôêG(ÍÏ$35•#M ®* àªÅÜ}p²Sϵ[]Jcéïë‰W=ŸŸJþµ Wd“ZƒÜýpob$²ƒ{º†‘ Y?²¹Þj,ú¸«J©hªNª*¸tÝ]‘ÊêÒY2s,¯¯KUI&©©é$%Å“”Z@…Ž}¹içáÃ=ð§‘ð·×`sVCŸÁ01ÊÁfuðÊíÓ£Gòòòðõõ57(·lÙB]]óçÏÇÃø2÷ÖçŸNll,iii 8Ðü>F£‘éÓ§3dÈBCCùýïONNo¼ñ]º\™LÇÝÝ>úˆœœ‹†sVVS¦LaäÈ+A___ÏæÍ›IHHààÁƒ#)®vàÀ˜7o.?þX__Ï;ï¼CFFF›•³ªªŠ””BBB˜9s¦ù}cbbÌ#ÞÓZ+V¬  àÊ¡½{÷fÊ”)m²ìÕrssÿ·Ö&‚IU$wVmm-‡fذa´oß“é_åˆ#ˆ%##âcggÇàÁƒÍwèЃÁ€···¹Ñ еk×+‘Í/“<üðÃæ¿mlløùÏNbb"iiiÍ6$'OžLtt´¹áÖÐx«¬¬l´Ž›)§­­-666äææræÌs™{ì1{ì±›ªïgŸ}Ö‚731¦6ÑÃ[º‡eËvRRåNÄÜyLlb:’ÒôTîDŸcui>¥DàêCâq‹ÎYïAtŒ–²Ž¾¡ø8¤b1ûƒ{"|€ÌLJ«›ZÏ)JÇR2±ìvèB¿þžp©ªm åÒ_O—ò“øÅq¿pÇwÌK,™;’—¦ïdÏÒ#h^¹i¹Iðç$ՃܕΞ=K]]{÷îeïÞ½M.síMœœœÍ=eccƒÁ`¸a£ÀÇǧÑåmíÛ·§K—.œ9ÓüYÎ`0PZZJjj*äççsêÔ)L&Ó ;=­)§½½=Ï<ó ›6mbþüùôèу>}ú@¿~ýnjÞ­Þ½{0hÐ <<<زe ´ø"Ñše-Î¿ŽŽ—ĵf߉zoØ÷M:ihÌ‹(S•© ñññlÛ¶ºº:†ÎSO=Õäh1夈2U™zk3õZ ?@55'zC‡éÕ7nNûöíMOÖÔÖÔ}XX{÷îåðáÃŒ3†³gÏ’››Ëøñã±±±¹éóÜÝìÛú +Òw’=“Ðk?ãU¥TTTSMé•iÉfçRZ’H’q2ÇÎdÌæ«n²æà͘™QtÄÈÎ=×Þ¨-Šc¶1×™w!tÚ ‚€Ì©49>·4•øS0säKLÜü›Í½Ãô›º”å“]ØóòT–¶A58øÎdÙÒ.íœÃô• Ö¥d§§PB~.Ž´bºc‘{Jmm-Ç',,¬Ée®þ5¼-47w™Å¯ñ×JJJbýúõ8::âïïO@@QQQÄÇÇsäÈ‘6-ç#mÞÁKõq¶­O'pzå\»Žî88Õî4>\ªÈ^¿žÔ;51lu6ë—DZp,³V¯&".‰ì |#Æ2ÈŒqËYsܲ+´ªäA³Ö²2"ŽÔð I„Ÿ#U™°lO3Ó/p†Ë71fåd¦¯\CèžD2KÀ½cƒ<¹”´„ÕGڦ˵:sñ%DE-e¥{x™™ i³Z¨>Î/ÏgMR>.QLž>™¨_³ãXñò\VQ÷®XÊ®­º+¶ãTM¥v†Ü´†ù¯~é>tèP£Ñ¡_ý5ï¼ó.\hÓusèÐ!‹mÙ¾};UUU<ôÐCM¾Æh4RYY‰§§§Eí°°cÇŽQ__o.ÓÍ–³¨¨ˆE‹±sçNó2öööæ¹¶Z:g@÷îÝqrrbïÞ½s€ÕÕÕ‘\I`í²Ö¸™}|;ëÝÏσÁ@LLŒÅ¥o/^4—_D™úÓÎÔÚÚZvïÞ››Ï?ÿ|›tD('E”©ÊÔ¶ÍT€aÆQYYÉþýû-²êСCøúúšç@¾Y­©û†‘¹_}õ……… 6¬MÎr÷³¿Uo|&q% Æ=5Š æä\Ê&nývo]gcõ‘…LŒ²æ˜Es/©.ˆgå¼xV^w¥©¼Õð+y=þzK—?+ŠøkßâÌÖ.<ÀÚë—ŽÔyMlkõq–NŽbéµg¯æ¹¨Õ׬'•Í SÙ¬ã\ZàH]%¾vŽw|;¾­Òr'µ/uÚ½{7ÁÁÁÍ’%KX¼x1 Nœ8AVVááámö {777Ö¬YCzz:]ºtáäÉ“?~œž={6{ãŠN:áááA||<çΣk×®”””––F§N(,,dÆ <ù䓸¸¸ÜT9{ôè——qqq\ºt ///Ξ=ËÑ£G±³³3oã·ß~˺uë á¹çžk¶Óà¿øŸ~ú) ,`àÀØÙÙqôèQòòòˆŒŒ¤gÏžV/k­ÖîãÛYïNNNLš4‰uëÖ±páBBCC±µµ%%%OOOŒF£>À¢Lý‰gjqq1.\ÀÓÓ“õë×7¹Lß¾}2dˆrRD™ªL½ƒ™BLL 7n¤¨¨WWW’’’¸páÓ¦Mk³ýemÝ7ÔaçÎILLÄÉÉ©Ñ Ón÷1'·1cnå›Wddzva<î¾áãî‚ UT”™™Núñ3šVä.ñI寨»àbc{Ƕ¡¢¾Žµçµ3¤Õ $55•óçÏL×®]yã7زe ßÿ=/^¤sçÎ<óÌ3Œ9²Íçõó÷÷'44”;w’žžŽ»»;cÇŽå‰'žhv~A[[[fÏžÍ?þñ222ÈÌÌä`Μ9xxxð÷¿ÿ#GŽõãŒ7SNfÏžÍöíÛÉÌÌ$99ƒÁ@=7nœùæg555TTT\w>6¸rÇÝŸýìgÄÆÆòÍ7ßàååÅ /¼`q—gk—µFk÷ñí¬w¸2ß™««+111$%%Ñ¡CBBB˜8q"³gÏÖX”©?ñL=þJ¨¤¤„’’’fËÖšÎ夈2U™Úv™êààÀܹsùòË/9zô(åååøùù1yòd ÐfûËÚº‡+Ó4„……ñÕW_1xðàF#—o÷1'·Í£>Zõpõÿ-ÔN¹ïupaN»ŽwlýK/³ëòó¥&WÿXü}àÀí0¹ëÌš5‹ÁƒóË_þò¾(ÏñãÇ9pàÏ?ÿ¼v®ˆ(S•©"¢LU¦ŠÜ¥ìU"Ò ®úÊô3ÝnëHÞŠú:V^:Ã×ÿ,×N¹‹´Ùb""ÊTeªˆˆ2UäÖ°UˆÈÕâª+˜VQÈÕoù×NÕTòù?ËxÖ˜£Î]‘»Ì‰'ÈÏÏçá‡Veˆˆ(SED”©"w1à‘F*¨çƒÊ2«^s½;§^ý\sS.ˆÈÝ¥oß¾ôíÛW!"¢LQ¦ŠÜå4¯ˆ´‰›íàmî1ÍÁ+"""""""Ò}š¿üå/„††ò /˜_{âÄ Þ~ûmÆÇ?üÐd¦Y[ž¦Î=Ÿ|ò‰UålI¾ÝHll,[¶láø~~~Ï-X°€Ë—/³xñâf§ðIOO'66–‚‚\]] `РA­Þ~ø!)))¼ù書¹¹±téRó9uñâÅxxxX}LXs\ZS&¹yv~~~jø£á@kꀻUóH‰ˆ´Æ¯ýkU‚4òÝwß±bÅ jkk2dìÝ»—¼¼<ŒF#C† 1áLII¡¢¢‚Ç“ŸŸO¯^½ #//%K–PVVFHH}ûöåôéÓ$&&RYYÉ€ÌëÛ·oµµµŒ9Òb;rrr8zô(‘‘‘¸¸¸°k×.ª««‰‰‰¡[·nRQQArr2ÇŽcèС×=×fgg·x»vîÜÉåË—Ù³g½{÷fàÀ˜L&’““IOOgذaØÚÚšëÁh4òè£`4Y´h§OŸ&88ÊËËÙ·o¹¹¹„……™·333“·ß~›ÊÊJŒ¯¯/™™™ìÙ³‡€££#999L™2…áÇãîîΚ5køßÿý_¼½½|¸ùsŸ––ƨQ£šÍ kÖõ³Ÿý [[[xàðôô¤ªªŠ÷Þ{Ž;ò /àããÓd¦Y[ž¦Î=iii-.gKó ààÁƒ˜L&"##ýíææFBBNNNøûû›_SPPÀŽ;ˆŒŒ¤ÿþMÖkbb"ü1µµµ„……ѹsgRRRHOOÇd2ŒUûÀËË ƒÁ@VVÑÑÑDFFâááa>§Ž=ggg«Ž kö5e’¶¡¼""r_¨©©aÓ¦M¸»»óꫯš;FÍŸÿüç&_“››ËàÁƒ™3gÔ×׳qãFìììxå•WÌãÇçý÷ß'>>žáÇãååÕªmÌÊÊbÊ”)æÎ‹úúz6oÞLBB$""¢É×µf»JJJøÕ¯~Exx8=öŸþ9±±±ìÝ»—Q£F5¹®-[¶PWWÇüùóñðð0¯§áµiii 8ºº:>ûì3 ¯¾ú*ƒ€Gy„×_ØØXþã?þƒ¼¼<àÊ(ªªªHII!$$„™3gš×c9q½Æ^ee%AAA<õÔSæÇlmmÙ½{7ÅÅÅægÀÁÁyóæ™…úúzÞyç222̯}ðÁqvv&55ÕÜ!Óð…`èСVÕ‹ˆ2U™ªLU¦Š4§¥YbÍgÄÚÏSQQcÆŒ!::ú_CööÄÅÅQXXH=šÝ~kÖõè£òí·ßòÉ'Ÿð§?ý‰;v`4yõÕW±··§G2­5å¹öÜcm9[šo7âááA¯^½8|ø0ÑÑÑæŽÎƒ0dÈ&_g2™Øºu+üñ¤C‡Œ7ŽÅ‹·ztïÞââbzöìIïÞ½›Ýö–ÖUK×mm™¤mh^¹/äååqîÜ9‹^ ­æTO?ý´¹1xáÂrss6l˜Å¥¥öööŒ?žúúzŽ9Òêmôððàá‡6ÿmccÃÏþsHKKköu­Ù.OOOÂÂÂ,Ö5aÂùþûï›\Omm-‡&$$„öíÛc2™0™L\¾|™#F˜ºEEEòÈ#˜;"ÜÜÜxî¹çÌ—m7jxØÚbccCnn®ùÆ _p–-[Ö¢_ò¯î4ÌÎÊÊJóc“'Oæ¯ý«Å±P__Oee%UUUuÊ?ü€Ñh4?žœœLÇŽéß¿¿Uõ"¢LU¦*S•©"ÍiI–XóiíçiܸqM~î¯þ<ßL¦ØÙÙ1}út***øûßÿNBB“&Mj4ýËͬ£©sµåli¾µDhh(¥¥¥äää˜ß'99___óC×j˜gܸqæŽPWWWFÝ&õÓ7ª+kÖmM™¤íh¯ˆˆÜJJJšl467Ÿ˜££#nnnæ¿Ïž={Ã÷¸ú ´µ|||]öÖ¾}{ºtérÝ÷mÍvy{{7º¼µ]»vxzz6»®³gÏRWWÇÞ½{Ù»wo“Ë\¼xñ†õ}õ—F {{žyæ6mÚÄüùóéÑ£}úô! €~ýúÝpÞÅöíÛ[4:8®e0(--%55•‚‚òóó9uê&“ GGÇFÛ»wï^>̘1c8{ö,¹¹¹Œ?«êED™ªLU¦*SEšÓ’,±æ3ÒšÏSSŸû–L‰ÒšuuíÚ•'Ÿ|’-[¶àëë˘1cÚ|מ{¬-§5ùv#¡¡¡üãÿ 55___Nœ8AYY&Lhö5 û½©ä®M}«ò³%ueͺ­)“´uðŠˆÈ}¡¶¶¶Ùçš›KìÚ›Y\O×äë­§AuuµUÛaggg1RÊÖl@]]]³Õ†÷>|x³ £jjjZü…àZ<òAAA¤¥¥qìØ1öïßOBB^^^Ìž=Û|ÉWs-‘””ÄúõëqttÄßߟ€€¢¢¢ˆo42¯OŸ>¸¹¹‘ššÊ˜1c]JlM½ˆ(S•©ÊTeªˆµ®Îk>#­ù<µôs3™vµsçÎW:+**,®Rh‹u4wî¹ùv#;vÄ×חÇóôÓO“œœl¾²áFç¦\{N¸UùÙ’º²fÝÖ”IÚŽ:xEDä¾àéé \¹ÌõÚKY‹ŠŠZô —êž>}ºÑs ];Wd}}}£e滺Vaa!õõõ ›ÊÊJŠ‹‹›½éBk·+??¿ÑºL&%%%]w=µµµôë×Ï⹪ª*N:Eûöí-껸¸˜ÀÀ@‹e“““)((`Ò¤IÖa2™8þ<DFFIMM ûöíãÓO?å믿fêÔ©7u,ÔÔÔ°aØ1c†E'PS6666 4ˆøøxÊÊÊHNN¦_¿~têÔÉêzQ¦*S•©ÊT‘æ´$K¬ùŒÜÎÏSkÖ•‘‘Áž={xä‘GØ»w/Ÿ}ö/¼ðB›®ãvæ[K <˜Ï>ûŒ“'O’ššÊC=„³³s³Ë7LÝ——G¯^½/w²~Z»nkÊ$mGsðŠˆÈ}áÀÕÕ•Ý»wc2™Ì—••‘””Ô¢÷puu¥GìÛ·óçÏ[4þ¶oߎ æÇ9wî—/_6?f4IMMmòý‹‹‹9tèEGÆöíÛ©ªªâ¡‡j³í‚+—Fíß¿ßb]Û¶m£¦¦¦Ù_ÝF.:t¨QÎ×_Í;ï¼Ã… €+—wìØ±Q}›L&þñ••eñ奡Ӧ¨¨ˆE‹±sçNósöööæ›eÔÕÕÝô±`4©¬¬ÄÓÓÓ¢¡^XXȱcǨ¯¯oÔ‰ÔP'_}õ……… 6¬Uõ"¢LU¦*S•©"ÍiI–Xó¹Ÿ'k×e2™X»v-½{÷æßþíßxüñÇINNæ»ï¾kôÞ r»ó¡5ùv#!!!¬_¿žË—/7{ÃÏ~~~ bbb,¦W¸xñ" 7µÚ’5붦LÒv4‚WDDî ŽŽŽLž<™?ü¿üå/„††RWWÇÁƒéÓ§ééé7¼üÈÆÆ†gžy†åË—³hÑ"ÂÃÃiß¾=ééé0vìX‹¹'ýýý9vìË—/gèС\ºt‰ÄÄD Ðä ~ÜÜÜX³f ééétéÒ…“'OrüøqzöìyÝÆŸµÛWîF¼nÝ:Ž=Ч§''NœàäÉ“ 0€àààf×Í’%KX¼x1 Nœ8AVVáááæ_áæ}\µj .dРA8::rèÐ!ÊËËùõ¯m^`÷îÝãïï——qqqÀŽ— IDAT\ºt ///Ξ=ËÑ£G±³³»a#¸%:uꄇ‡ñññœ;wŽ®]»RRRBZZ:u¢°° 6ðä“Oš/%ëÑ£;w&11''§Fwooi½ˆ(S•©ÊTeªHsZš%Ö|FnççÉšumØ°ŠŠ þó?ÿüqRSSùä“OèÝ»7...2-88ø¶–§5ùv#nnnôéÓ‡¬¬,:tèÀ€®»¼“““&Mbݺu,\¸ÐÐPlmmIIIÁÓÓÓ↕w:?[ºnkË$mÃÎÏÏïOW7v®þÿµ !‘»EÑ«uëÖ ???òóó9rä•••<öØc’””ĸqãÌó~¥¤¤`4Ý=¼cÇŽ 83gÎpüøq²²²psscÒ¤IŒ;Öâ|Ø«W/lll8uêéééTUU1~üxz÷îÍÁƒ-î>¿k×.‚ƒƒ™8q"GŽ!-- """˜>}z“wþmívíܹ“Ñ£GóðÓ™™IZZŽŽŽŒ9’©S§ZŒP¸¶:tè@xx8F£‘'NpìØ1‰ŠŠâÉ'Ÿ´x­——  °°ï¿ÿžììl<==™6m}ûö57r‹ŠŠ8r䥥¥ >œ   L&™™™¤§§SVV†ÿþïÿNïÞ½›­ƒæöÙéÓ§ùöÛo>|8îîîØØØàïïÏÙ³g9qâ¹¹¹8;;óüóÏIVVùùùDDDàäädnç\ºt‰¬¬,"""uFXS/"ÊTeª2U™*r-k²ÄšÏˆ5Ë6÷¹/,,äðáà 6ŒŽ;6[†–®+55•/¿ü’I“&™¯¨°µµå`÷îÝ”••1pàÀF™6tèÐ6)OKËim¾ÞÞÞª¹-ôÓ¨ˆˆÜêëë™?>~ø¡Å uuu$&&Ò«W/«îðþSqõ\""ÊTeªˆˆ´^MM ß|ó ÞÞÞêÜ•ÛJsðŠˆÈ}ÁÎÎŽÈÈHvíÚÅý×€  77—_|QW£\åüùó$%%qòäI]%"ÊTeªˆˆÜ¤Ï>ûŒ¼¼<ŒF#O<ñ„*Dn+uðŠˆÈ}ãÉ'ŸÄÍÍÄÄD6oÞL»víðôôäw¿û>ø *è*?üð»víÂÇLJ)S¦¨BDD™ªL‘›pôèQÊËË‰ŠŠbÈ!ª¹­4¯ˆ´ ÍÁ+"""""""rûi^‘{”:xEDDDDDDDDDîQêà¹G©ƒWDDDDDDDDDä¥^‘{”:xEDDDDDDDDDîQêà¹G©ƒWDDDDDDDDDä¥^‘{Ô-ìàõeê’e,[öãsBq1?×…'\õÜ’©øj_ˆˆÈMúíoË'Ÿ|¢Š¸Gäçç3sæLöï߯ÊQ¦Š2UDî¡Lxíµ×˜9s&¥¥¥¼ûöÚkæç¯ý[ç¹;ŸÝ÷Â>ѹ¬õné^‡ëüåxçDDDäî‘——ÇöíÛ¹pá‚*CDD™*"‚³³3...ØØØ(gEîö·î­/‘}$LJíV•”Re~®šì㙸7 é­ÈæÒM­Ë…~c¦29*‚ÀþžªŒœJ?@ü›Ø™z†ê»y/8øòÒš•DuÌçƒi3ùâŒL¹»É;vì 88WWWUˆˆˆ2UD~â^yåå¬È]ä–tð:xaòo¨¢ª  š’ìjB§N£¿T—$—^B`¨û/ð%jšñë‰/°re´d!Q>Fò3SH-©ÆÝ»ýE1sPÑI˘·$ž‚»¸—÷RE*®ê¹¾[ÐÁë€oÔBû[NÂPRII`AŽ@IéŽA¹[,ÓŸ$â×f[±*_¦ýع[²gó—]Ó‰ëÒ'_^È̈¹,›[Êô¥©TÜ{¡:›µ3'²VÇ£ˆH›ÈÈÈ`×®]äååáææÆ€˜8q"íÚµ³XîâÅ‹lÛ¶¬¬,ŒF#:ubÈ!Œ;;;»V-»jÕ*ÊÊÊxñÅÙ´iGÀ××—§Ÿ~šnݺÝpû øâ‹/øá‡¨©©ÁÇLJ &зo_ó:ÊËËyñÅÙ°aééé,Y²ƒÁ`U™ÒÓÓ‰‰‰¡¨¨ˆÊÊJÜÝÝ f„ 899°|ùr233X´hÞÞÞÌŸ?ßêúKOO'66–‚‚\]] `РA:XE”©ÊTeªÈOFKr¢5Ù×ÚLxûí·ÉÎÎæÝwßÅÞþJ÷СC‡øè£ðôôdÁ‚æe¿úê+¾üòKfÏž¿¿?«V­âäÉ“¼õÖ[­®kËY\\ÌÖ­[ÉËËãòåËtïÞ‡~˜ððpóT×ËÙÛyžknÿ·t?µt]³fÍbܸqøùùCNNnnnòÄOààpý)Q[R§±±±lÙ²…?üáøùùY¼~Á‚\¾|™Å‹ccc£sÙdççç÷§†?v^Ss¨´|^•žŒ‹Ž Û5ÇvEÖ*|ƒð´*²H;çÃÀží-7ÆÝŽ£ñG(oáš¼ŸZ¼‘®w¾Ìÿ[~€óu×,P}žãß$q)ìç Œ!e;É‘{ѯýkU‚4²sçN._¾Ìž={èÝ»7Äd2‘œœLzz:Æ ÃÖöÊôóF£‘E‹qúôi‚ƒƒñ÷÷§¼¼œ}ûö‘››KXX˜ùÜgͲ)))”••±ÿ~ ÇÇÍÍ””ÒÒÒ5j”yš’™™ÉÛo¿Mee%ƒÆ××—ÌÌLöìÙÀpww'%%…ŠŠ >L~~>½zõ",,ŒòòòogFF+V¬ÀÞÞžˆˆüüü0™L:t£ÑHHHÝ»wÇÑÑ‘œœ¦L™ÂðáÃqww·ªNùøã©­­%,,ŒÎ;“’’Bzz:&“‰àà`|||t‹(S•©ÊT‘ûVKsÂÚì»™L¸téG¥ÿþtêÔ €={ö››KEE#FŒ0w<ïØ±ƒ‹/2eÊìììHIIÁh4òè£pðàAL&‘‘‘MþÝkʙ͒%K(++#$$„¾}ûrúôi©¬¬dÀ€×ÍÙÛyžkŠ5ûÉšuíÚµ‹êêjbbbèÖ­TTTœœÌ±cÇ:t¨yÙk÷IKëÔÍÍ„„œœœð÷÷7—©  €;vIÿþýu.»ÃÚ~o—Pú9¶òµŽýí-™ƒÖÁ—‰Oú@U +×i~dnu;Wƽ|,c¦±æõLú/XÏÂA¥¬™1ÍSBtáñk™å—É’©sI,\yò¥éDúâÓÑ‘*c&I_¬gͶTΘG »0dÙf^wù€óK˜8o.QýKX1ugæ´d]ó©š¿™×½÷0gêRŽ7¼ï ×Ýðé,ˆžÇ+ÁeÈ6¿Æm¼4}5Ù?¾Ÿ÷´5¬žìNÒËÑ,>žáÇãååÕlÎÞÎóܵ¬ÝOÖ®+++‹)S¦0räHóqµyóf8xð ÖaMzxxЫW/>Ltt´E‡1À!Ct.» ض}ÿnÿ+79kAA]Z¶¨{ ÌxŽÜ`Þ…ê칎ýGàíPAæ©TáIT„÷5ÁD?¨JÙDj)8x?Î’õK™9ÒÒÔlÚ´“ÔRoFN_Èê…ÓhK]‚˜¾ìu¢|«ÈO?BAUË×u­–­û ©‰ù€/#}BÖß‘¾WþÙ1”@óUî†zéÄe«sWDî_žžž„……™ÿ¶±±ùÿÙ»÷¸(ëüÿÿTQÐ8A † T¢µãªãnâ¶JiY–»énâ~va· ý¤íVî×r³L÷–´©{ÝßMü”Z)­§ÌÓ–h)ÓA´’@PA”å÷02œd`@Ñçývó&3×5ïÓuÍ{f^óž×Åĉ1 a±XZ}ƒ›ŸŸÏ¸q㬨ýÖüç?ÿ9wÜq‡Íþ=ö˜õM¶½íœ:u*¯¿þºõFý½ÊÊÊVÛho]G¥¢¢‚Ÿüä'Ö7oýû÷çÇ?þ±NXÍ©šS5§ŠÜÚ3O\iîëèœàç燧§§5¥Ayy9L˜0ƒÁ@ff&P»Ò³ººšaÆuÊØ\©ŸgΜ!''‡üàÖ@$Ô‚|ðAjjjHOO¿&^çšcÏqjO]^^^Ü{ï½6}˜4iÎÎÎ|õÕWͶÉÞ15”––òí·ßZÏÝ}ûö„^Ë®^ÁëAè0Ž•„ÇÎ"J¯°Ÿ³G@I^Þ•/LVUÊRôÅÙë1[L˜Æ›ðY»–úÃ>¦H)'y­™sx0~VÃ8ÀÒ¨ø¨~§Ä„Å.cQd ±£wóÒÞÑeO!É ‰Šß}yuo›ê24Çð6Ö]j6S8s2a¦@œÓ³©Âc¨”bñ ÄÔ— Eç o჌džÓ‰/"ׯ€€€&?rqqÁ××—¢¢Ú õäÉ“\ºt‰={ö°gÏžfË)++³{ßz®®®6oVêßh]Iaa!PûӲƾñ0 ÜtÓMÖÛö¶ÓÍÍÒÒRÌf3yyyäææ’••EEECë?ű§®ú1onõDK«îDDsªæTÍ©"×{牶Ì}œœœ:t({öìáüùó9r€† b ð>|¨]ñëhméçÉ“'[œÏëóôÖÅÕ~kŽ=Ç©=u6IWäêêŠO‹ãbï˜FÖ­[‡Ùl&((ˆÃ‡súôi&Nœ¨×²k„c¼}ƒ0úv°Œ@}÷RzÅ dÝhiK¡UTYjc8—ÁúÔrLáã1ù¬eC€á‘P¾ƒõUàa$2ʓײ÷\_|ÉFöú÷ÉŠŒcXxÎ{Ó¹¼6‹U+wÛZWã¯=uç&c.ŸL¤1 ²)òÃè KWQ3˺AáY[Ò¯<¹]ºtÉúæùâÅ‹üð‡?lò!ßú’V7ùÚ³¯õŵWû^^«««Û¸h|Ñ{Û™ššÊªU«0 Üu×] :”ÈÈHvîÜyÅöÔÕÚ'Úžß_D4§jNÕœ*Ò½Ù;O´eîsÄœÆîÝ»9zô(GŽÁÓÓ///BCC9tè§OŸ&33“[o½µÅ\¶ÑÞ9¾ñÔÏ¥Wûu®£Ç©=uµ”‹¾gÏžTVV:dL=== â‹/¾à±Çcß¾}ôêÕ £Ñ¨×²k„C¼ÎA&ZÎnb¡´°”R7°–¶— ÄäLúrÄV+äààhuog‚<K)¥€*2¶˜)'ÒäÆ ENd ®ß@v8{„⸅ÏgUx åúöµ­Û’G^“èé•ëjÚ\;ê®Ê&Ù\Ndx8¡8db0¹,O?À¹lf"Ð9‹17rYu@á]¹¾åææRSScóæ ¢¢‚ÂÂBëÏÊê†tñâEk¾1ëTn±••…«««Ýûv”¯oí·¤'Nœ ,,ÌfÛ¾}ûÈËËã‘Giö±ö´³ººš5kÖ0tèP¢££mÞ¶åͱ=uùøÔ&úî»ï¸í¶Ûš+Ñœª9UsªÈõ®£óDK1'„„„гgOþûßÿräÈ‚ƒƒ­÷:tˆììl&L˜pÕÆ¯~ž<~üx“mõ÷ÝrË-×Äë\GS{êÊÏÏoÒ‡ÊÊJNœ8Ahh¨ÃÆôûßÿ>ï½÷GÅl63|øpúôé£×²k„CsðZÜf)ÍfÛó™?>‹Í³´RN®”Wh&£ ¡ã ºRŽo_#&O ;™¼º€jUÆzRË!0Ò„0>_rÙ²%Û&X\²c!Ï?ÿ|óÿ–5º¸›¥ùÅm­«±¶Õ]EöÎ ,1>ȃ€±¡P’NzaRsëòðúÔæß-LÅ\¤“^D®oEEE¤¤¤Xo×ÔÔ°~ýzª««­ß&ׯœØ¿?6ߺu+ùË_8sæŒÝûvÔ­·ÞЧ§'ü16o2×­[Ç‘#GZüVÛžv–””PYY‰¯¯¯ÍŒüü|þûßÿRSSCMMM“:êï³§®ÁƒãææÆ¶mÛl~NVVVÆþó°"šS5§jN¹îµwž¸GÌ ...„„„pàÀrss2dPûóyWWW¶nÝÊÅ‹›|QÖ•ú÷ïÏ€øì³Ï(..¶Þ_]]ͦM›¬©&Zšg»òu®£Ç©=u8q‚ýû÷ÛôaÓ¦MX,†î°1ýÞ÷¾ÀªU«8þ¼ÍÅÛôZvõ9po#B[È/Uº…UfÛœ ¥;W°ÃôšYáo5@6y­UW•ÁÚÝ%„G†=y³Öæµ,õ`lôt|±ö¾ùrz‚ªl¶ì.gBd$¦€t<Â}!k)Éu•V•fQ JÉHO·-ÛÙ‡P_(·´mh®PW“Ýí¬û\ÆN2Aèx#¦P7,Ù©VÅœNÉÌHÂF,ƒ¡dýn u΋Èu.((ˆ·ß~›C‡áëëËáÇ9zô(wÞy'wß}·u¿Çœ… ²`ÁL&nnn>|˜#GŽ0jÔ(›o“íÙ·C/ʽzñÓŸþ”üãÌŸ?Ÿ#F`0Ø¿?gÏžåW¿úU«ok;½½½ñòòbçΜ:u ??? ùꫯðöö&??Ÿ5kÖððÃÓ·o_ëOç>þøcî¾ûnî¾ûî6×Õ»woyäÞ~ûmæÏŸÑh¤G¤¥¥áëëKII‰NZÍ©šS5§Š\×ì'ÚÊQsÂСCyÿý÷¬+x{ôèAHH_}õ}úô!((誟““?ýéOyóÍ7yõÕW5j®®®8p€¼¼<&L˜`Í[?ÿ7žg»òu®£ÇÉÞºnºé&V¬XÁðññáèÑ£dff2hÐ › lGÆ´¾ž!C†päÈÜÝݹóÎ;ÛÕn½–uŽžƒž×ð7ü¿ñÁoá‘#h6#ËÙC|òYlî4ào 'Ô­¹V]àÀ¶}·Zß%Jåà3þ>FŒ¹Ÿ{úaŸ¹À¶Ž¾!<”ÉiË–-üøÇ?æÞ{ï%##ƒ¯¾ú ƒÁ@xx8Ó§O·Y1áîîΨQ£())áðáÃü÷¿ÿÅ`0ÉÃ?Üî}ÓÒÒ())!""¦mùùù|ñÅüà?ÀÓÓ³Å>ÜrË-ÜyçäççsðàA²³³ñõõ%**Êú†»¥:ÚÚN'''îºë.Nž<ÉáÇÉÉÉ¡OŸ>̘1ƒûî»#GŽ››‹Éd¢wïÞÜtÓMžžNii)cÆŒ±kL À Aƒ8qâß|ó §OŸføðá<ùä“|ôÑGÜ}÷ÝÍ^dAD4§jNÕœ*r=°wž°gîsÄœàææÆ'Ÿ|B¿~ý˜?—ÉÍ^”-›å³–‘Ù†8ûŒgVü,Â=K!YÙdZð "447 üÀr^˜¿ìÆns"zÅ2&{–4^™þ{Ï5ÜEü²© ¦„É»É(P†ùRžº˜ùõ}êËèøµ¼̳Ó‘ÙÜRâVëjúø¶×]Ëçáå$Æ…¼=“ļÚrÇ.\Ë ÃK*Ï?>Ÿ+¤6i·Ö~zØp[ßÕÿÝÚ}-mÛ»w¯]DDDDDDnXqqq|ÿûßçÉ'Ÿì’ú>üðC6nÜÈܹs и†ôêî¨*ÚÉ¢™Ø2~*GŽfØ0ƒ,%äØÁÚõkY¿·…ô U¹ìÜ]ÂäÉž”§®¥Q ª²™•Áô˜é„'3Ì Ê 3H^O†tìº\Ùêj²»u™S)$ßò¤Zó0œ##5†b9°£Ù º‰ˆˆˆˆˆˆˆˆ´¦ººšO?ý”€€w¯AÝ~¯ˆ\´‚WDDDDDD¤ëtÕ Þ÷Þ{ï¾ûŽ£GÕbn_¹zziDDDDDDDDD¤9‡âìÙ³DFF2zôh È5ÈÞs–BP3WY³–biro9¥…ð54}@a¡}éDDDDDDDDDn K—.í’z^yå ö5Î)DäF¦ """"""""]¯‡†@DDDDDDDDD¤{R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›R€WDDDDDDDDD¤›êÕ%µô cú¬™=ÜWjfÅÂU¤Wé ˆˆˆˆˆˆˆˆˆˆ´G×x=†æÑø¾0†ùBz^{ u& *„©¾Íl+§0+ƒÔU ¬Ø›G§Åƒˆ]±ŒHÏ\–GŰ¡¨{žÎasY»È„¡¹‘,É%c÷*Vì&OÁx‘kJ¯ë¡…©[H-´ÔÝ2Ð×7£i“_Aèò(fubäµüœÜÎa¹ÆÑ’•Ì–ôRëmC__‚Œ&FL~¦PžN SA^‘kÆuൽ~9 s=øŒç•„YŒ˜Ëè/±÷\'T]•MbÌd¯““¡Ô¼Š„ÄFKªx`Qq¡“‰ _ˬ¥zÖˆˆˆˆˆˆˆˆˆ\#ºæ"k–òfV¸Z(ïÌe¯EÉl8‚æë¬#Ý^Uyì\žL9d @#)""""""""ríèš¼E[HXuްÐ0&É5ï =#ä.ÉY{ŽÂòúÕ½><¼<‘ÃûDÏL¤áZUŸ‡—“c`EôLÖÖop`ôô™LÆ`O7°”{`'+–­boQЗÑñky) ™g§/"³ªîvßåDÏÍÃÍã#qÃBaÆNVÅ/ggãD¶}Ãx8v&‘aAz°”dºa+Ö›ZE‘à IDAT)j¸ëÛÒÆ}Ú5„…œÜúöÅTѰŸ…L~a‘¡…,ÇG¥à0–˜èÇ1†Æ×­œ’¬lönXÆòMó!;'6úqŒ¡xÊ)Ì2³>! RE\•1rd"""""""""¤kVðREžy'íȦœr²w|ÄNs'^ü À'œ‡‡¹;1·+ìÁØâyiª Òtv¬_ÏŽçð1•—âcëÛÊCûšˆŸËä³vùrÞß‘MßÐHfÅϲyœsÀ,\µˆ˜pJÍ[xÿý-˜KŸ9Ÿ„ùàcW[:ÐÞ+D˜_ $¯Èv%vßaÌŒ‰È ¹Òɳ@_c, /9ÂÂÔõ¼¿>•l·aDÎJ`ųF6£¯ñYV,›Å„ ™;ßçý-fÊ}ÉYOl]ƒ¯Æ9¶N‘ÎÓ9+x} õ¥I|Ë7‡…VØxã9 3²±Ñ£ É1Ć[+§¯G a¦Pª_­¼bmmß Ï2}ÃL²«À9„èg'àYžÊ+1óÙ[·`7ñ}3ñ‰³ˆŒ6±*ÎŒ±ËÇÈͱÇEW¥‘NÔ ^xá&x´¼GPäL‚šÛPºƒ…ó?ÂÞ·¾¦H"›ÝÒ— œóŠì_-l)¯ Øùš HgoÞ9 Š¼µqL^[¿“¡…g±jU}p—ÚÇ¥Adƒ¶F"C¡Õ¿ìfÒoTå™Éc¡A¾8“‡Á·67qzFã¥ÜUdï\K6àÛåcäðã"""""""""Ò‰:ñ"k–&÷TYjï³XªÚ°wGTQš½—„ùË1&Æ`šjÄcïnJí,#{à LO Ád Çd2bŒœŠ)r*&ÿü"vµÜõ¶ö§dÇBíl¡eç²ë‚„miKÚ[§Ô¼Š„Ä<»±¥çƒÁŽãÞ•c”ìð:5ɈˆˆˆˆˆˆˆHçq`€×ƒ±±Ï39¨.t7u>ñ“sI^ö&JØ>k&ƺ´ á/Ä^jfEü*Ò=æùØp|ë%û}-Ûkg@¶ç kq}=.§Fh–3¾¡ÐpÍe_‚|Ý(ÏÍd÷†Lvo¨ícÐøXÎ 'væ’e·»iU¥Y”†R2ÒÓmW¼:ûê å–¶·eY!Wloz§^Ø®ª4—RLpÞiS—sÀ|€’º%¿å¥…”JP¤Ù‹€ñ3™”Ëú_…1Jpp<æ""""""""rcëḢ|Ô('­!Ð ðFX㜼a ó Pkp×ú° Ú``‡[dšLPž],®Âb|C jØŸñÌ w³y¬sP ñË–Ò 8\Jö4 C_C‹xÛ¤ÔÌÎ,0„Ç29¨aøÙ™é‹xsÑ\&û¶½-};»½mQ¸›Ôp›Ãø€}r`|L$ž”°7¹öBmUÙ;I·@àô™^¯ï0¦GO&Òä '¯Â9ø¸4LjˆˆˆˆˆˆˆH'êÕý»` hr Ѧ?ö7ôÅ7`¦a¾`I#>¡~e)é»sað0^X8— -i”z cüdn…z¹ˆªŒ÷ÙYh"2rË+L‘n£¦¦¦Åûn«©©±¹¿á¿æîkiÛÞ½{5è"""""""rÃsà ÞLÖ.cPƒ šËÃl>l!aÕ9Â|.g*­*J'¹ªŠV±¢¯‘ëbØ*J³Í ˆˆˆˆˆˆˆˆ\WðŠÈL+xEDDDDDDDº^ ˆˆˆˆˆˆˆˆˆH÷¤¯ˆˆˆˆˆˆˆˆˆH7¥¯ˆˆˆˆˆˆˆˆˆH7¥¯ˆˆˆˆˆˆˆˆˆH7ÕKC "ÒTuu5)))¤¥¥qôèQNŸ>Á`ÀÏÏ[n¹…Q£F1räHzôèþß“íÛ·?ÿùÏÖÛóçÏçŽ;îÐI 1”N8Þ‡âå—_¶ÞþãÿÈ=÷Ü£A‘vS€WD¤‘ƒòüƒ'NØÜo±X8räGŽaÏž= 8¨¨(ÂÂÂZÿ† ¸pádôèÑ×ý˜ßˆ}“""""""Ž ¯ˆH{öìaéÒ¥\ºtéŠûæää0þ|ž{î9FŽé°6lܸ‘3gÎpï½÷Þ¥±Ï¢sRDDDDDÄà©“Í_ÿúW›à®··7£F"((Ž?ή]»(((àÒ¥K,[¶Œ¿üå/xzzjE¤Užžžüä'?±™cDDDDDD:B^ ¦¦†þóŸTWW[ï5jO=õ}ûöµÙ÷á‡æ­·Þ"55€ŠŠ ¶nÝÊ´iÓ4"Ò*???~õ«_i DDDDDÄaà2228räˆõ¶Ï>û,½z5&{õêÅSO=ÅÁƒ)++Àl67à=qâ7näÀãì쌟Ÿ£Gæ wïÞÖ}ßzë-öìÙcóø={ö°gÏî»ï>žzê©+ö£¦¦†C‡±eËŽ?ÎÉ“'1 xyyqÛm·ñàƒrÛm·Ù=>öô`ûöí$$$XoÿíoÃÉɉwÞy‡¯¾úŠèèh~ðƒØÕço¿ý–7’““Caa!...øúṳ́I“Ú¼rÞ¼y :”ŸýìgøûûsúôiÞ}÷]Ìf3eeeøúú2|øp¦NŠ››ÛUy¶õx·v6GÓòòr’’’øüóÏ)))ÁÓÓ“±cÇ2eÊâããÙ¿?£Gæ¹çžkóùБrÛsN´÷yÑæ‹¶Î¿kù\ÇS€WDHKK³¹=uêÔfƒ»õ\]]Y¸p!åååÖü }úé§,]º”‹/Z﫪ª"++‹¬¬,vìØÁܹsñóósHjjjX¾|9;wî´¹ßb±P^^NNN»víâ7¿ù ãÇos¹ŽèGII o¾ù&ÅÅÅÖ¶Ú£q ²²’³gÏräȶnÝÊÓO?ÍØ±c¯XÖðáí›3gÎpòäI|||8zô¨Í¾o7ü OŸ>Ü~ûíÍÖqäÈÞ}÷],‹MYõÿbbb>Æiii$&&Ú¤©¯ïÀü¿ÿ÷ÿš=O9Þ%%%,\¸ììl›û ((( --M›61{öìV/Nøïÿ›µk×ZoŸ={–””¾üòKfϞͲeË8}ú´uûñãÇ9~ü8_|ñ‹/ÆÅÅ¥KŸ‡öo{æ%{ŽiAA/¿ü2%%%ÖûŠŠŠX·nß|ó ƒ¡]íèH¹9'Ú{ìºÛ|ÑÚüè¨çÔµr.‰ˆˆˆHçè¡!©]ÁÛаaîø___ÌàÁƒ jòAÉ’%ÖÀDÏž=¹í¶Ûðõõµù°üÚk¯QYY À„ xúé§quuµî3dÈž~úiî»ï¾+¶gÏž=M‚»}ûöm²ZôŸÿü'¥¥¥m—öô£9ï¼óŽ5xÑP[úœžžÞ$Xãééi“óøâÅ‹üío#''çŠ}ºûî»mngffÚô·¡’’›±j¸}ذa-®Š}çwl‚} íØ±Ã&ðã¨1n¼iè믿fïÞ½m:æí着*^ýõ&¨Æ+,ËËËY´hùùù-¶¡ap·¡óçÏóꫯÚw:qâ[¶léòç¡=ÇÛöÓššÞzë-›€œ««+|óÍ7|õÕWv·¡#åväœhïó¢»ÎÍÍŽ|N] ç’ˆˆˆˆt­à›åÎÎÎÜtÓMMö9{öl³¡vï Aƒ¬·W­Zeý0ݯ_?^y娩©!99™eË–µ©­[·òðÃsçwrçwòÎ;ïpþüyn¹å~ô£µ©Ÿ~ú©õo___^~ùe|||¨¬¬dÏž=üãÿ°7Ž9ÂÈ‘#¯Xf{úÑœŒŒ úõëÇСCqwwçæ›ohSŸ?ÿüsëßîîî,X°ÀºbïðáÃüéO¢²²’êêjRSS8p`«}8p ýúõãìÙ³@mÀæÞ{ïm©W?V?~ÜzãÀOC555L›6±cÇréÒ%V®\iÓƒ2dȇŽq¯^½˜>}:£F`ýúõlݺÕ&ˆc2™®xÌÛ;Þ»víâÛo¿µ>6((ˆ¸¸8(++ãí·ßæ“O>àÂ… ¼ûî»Ìš5«Ù6x{{óÛßþ–Ûn»ŒŒ âããmòc0€˜˜üüüØ·oŸõÜ®?^]ý<´çxÛõ&ÍŽcºÿ~›ó÷¾ûî#&&†ž={RPPÀ«¯¾Jaa¡ÝmèH¹9'Úû¼èŽóEKó£#ŸS×¹$""""G+xED¨½PZ½~ýú5›#uïÞ½üþ÷¿oöß /¼`SVzzºõö£>J@@P7nœÍ‡ýääd‡ôÁÕÕ•áÇ3|øpüqëψ]\\šŠŠŠÚ4&ŽêÇm·ÝÆ’%K˜5k¿þõ¯[Ì[ÛœÜÜ\ëßNNN8;;[o3uêTÆǸqãZÌãióÂףǷޮÖÔÔXÿ¾õÖ[­Û³²²lþ¯×ZÀ&22’G}ooo|||øíok³½>ðãÈ1þÙÏ~ƃ>ˆ··7ÞÞÞÌœ9Óæ‹Š†Á¦Îï†+ üã ÄÉɉ~ýúñÔSOÙüD}ïÞ½\¸p¡Ù6üÏÿüǧ_¿~Œ9²É—±±±„„„Я_?ÆoSný¹Ý•Ïöo{ÙsL®\¾é¦›øõ¯m]1êççÇÓO?Ý®6t¤Üöž9vÝq¾hi~täsêZ8—DDDD¤óh¯ˆµ© êóé–––R]]ÝjÞÖØÜ.++³®²ª×0蟟ϥK—š *ÛãÙgŸmRoNN999¤¤¤\Õ~<öØcÍ^üª-ú÷ïoýûìÙ³<õÔSÜqÇÜsÏ=ÜsÏ=<ôÐCmÎ-[oøðáÖ i}ûí·X,NŸ>m½hÞØ±cÙ°aÖ NÕ¡·Þzk«ijpss㦛n²¦¨Â8rŒ×Ù³gOüüü¬u¶–ÞÁãÝ0@4zôh›r 6Øa]xéÒ%²³³¹óÎ;›”Üäùi}ãÒ«—ÍjùÆÛëó—våó°­Ç»£å¶vLóòòlÆ¿aß vµü-·Ü‰'ìjCGÊmï9Ñ0‡²½Ç®;Î-ÍŽ|N] ç’ˆˆˆˆtxED¨ÍÑXÿ“ÓK—.QXXh³*ËKIII­î_]]MIII›¯êÞšœœ>úè#¾þúkNž<Ù¡²ÙöŽ%ÀC=Ä—_~iý¹ü¥K—8tè‡âwÞÁÃÃïÿû<ðÀÖ‘WÒ0ØqéÒ%²²²lòM3xð`ÒÓÓ9zô(5556?Ynm5`“¿Õú‚ÛÌŽã¶ÖÙã}áÂN:e-£¥ –ùûûÛÜn)—nã_Cƒ¡MAØ®|:jìÛ[îùóçmƲ~õ~c~~~vå:RnGΉƹbí9vÝq¾hn~tôsêjŸK""""Ò¹”¢ADš¬xj˜Ï¶^DDëÖ­³þûÍo~ÓlYm])ÙPGƒ±»wïæ÷¿ÿ=;wî´–çììÌí·ßÎäÉ“í.Ï‘ýèÈ×o¿ýv/^Ìĉéׯ_“í¥¥¥lß¾çž{®Íóðð°É½™™™i È899qûí·[ú\QQÁ‰'lVä5^ ×^Wë\éêñ®×xådK}º^Ƕ«úZ¿Š¹±–îïêr¯tNtäØuÇù¢#󣣟S]qÌEDDDÄñ´‚WD9r¤Í*± 6‡‡G³û_¼x‘ÿüç?Ínk¼Ò*>>žtjû/\¸À¿þõ/ë‡ûÁƒ3uêT†N¯^½(..fýúõv•y5úÑ¢¢¢xòÉ'ÉÌÌdÿþýìß¿ßf•æÅ‹ùç?ÿÉÈ‘#Û´Âsøðáäääµ_ª¿ˆÒ€puuµÉm¹oß>ë…øzõêÅ]wÝå~]KcÜ‘ñîÝ»7ÞÞÞÖ‡WÏÖËÏÏ·¹ÝÒóëzÛÎп\\\¬Á¹æVVÖÔÔ4ÿÎ,·#çDã ¥½Çîz˜/®Ösª³Î%é\ZÁ+"Bm@´á‡p‹ÅÂ+¯¼ÒìÅ‘, ÿûßmVh5Ôø'³ ¯‚^¯ººš .Xÿµ´êª­«¤Ž?ns¡¸Ç£Ñhý î7ß|c÷˜8²öhØçS§N±råJë¿üü|î¸ãž|òI–,YÂo¼a“¯õÌ™3-þD¹±†«ê233ÉÎÎ`È!6›†W›¿ãŽ;ZM!ÐƸ%ï†}Ù»w/gΜir\·oß~ù HuZ_®Æóðjqrrâ–[n±Þþì³Ï¬) ê™Íæ6]\Ñ‘å¶÷œhï±»Þæ‹«ñœê¬sIDDDD:W¯ââb‚ˆð«_ýŠçŸ‹ÅÔ^ýùçŸg̘1Ó§OrssùÏþc“±±þýû3`À¾ûî;Ö­[ÇСCñòòj»hÑ":@`` ‹/n¶¬úU`WR]]msû‹/¾àŽ;î OŸ>dffòöÛoÛ=Žì‡=öÙÍÍ?üÐxËËËãw¿ûnnn899áïï··7‡jSR4÷³ìæÜqÇ8;;SUUe8©yzzZ/”Õð§ûWʧÙƸ%ïÑ£GsàÀ öK ðÌ3ÏàïïOYYÿ÷ÿgó¥È¨Q£šÍ z-Žm[Ÿ‡W“Éd²®0­¨¨àõ×_'::OOO¾øâ º¼Üöž½{÷n×±»Þæ‹«õœê¬sIDDDD:R4ˆˆÔ ä™gžáÍ7ßäâÅ‹@mêƒ?þ˜?þ¸Éþ>>>¸»»“••es¿““Ó¦McáÂ…@íOkccc0`•••Ö+¾×{â‰'l~"|ÓM7Y™™™,Y²„»ï¾›±cǶØöÒ£Gk¹Û·ogûöí6?µm¨-«@;Ú{´Öç#F°oß>¾üòK¢¢¢¬?ãnh:th›/ne0¸óÎ;ùúë¯mî ±öÿöÛo'--Íf»#¼]9ÆmÑ»wïv÷¸qãØ¾};ÇŽ ++‹ßýîwôîÝ› .Ø<ÎÕÕ•iÓ¦uêóùj<¯¦‰'²eËkê€o¾ù†ÿýßÿ½ªå¶÷œhï±ëÈù{-ÎWë9ÕYç’ˆˆˆˆt¥hi`ôèÑÌ;·Å+‡×»õÖ[™;w.¡¡¡Ín1b3f̰ޮªª"++‹¼¼}úØän‹\–––¦A‘^§¬àu3½Æº¥÷ã]yŒ”Õó˜³r;‹ë¢ˆÉÛY³x ¦IQDψcqR™K§0}eŽŽ†¹x‡0fÊÆDŒaÎcϱ½øÚm«[ð£DM„ÁR@êš5¤ëø‰ˆˆˆˆˆˆˆˆ´E'x Šƒ7•dn^ÍÊ5 ‚»õÊsHÝ´w//ü¢Æ†×Ê®F\¯üX&ù^îXŠ (ëÆòÔ®$¶çW.x ŠqLÞîãxyÁDÌ1›­ã{­õÙ}è4¢¦ Êpß•Dj±–‹ˆˆˆˆˆˆˆˆ´E'æàu!dÊ–O™C¾9‰Ä„D6› pŽà‰èL‚;•W9ÀXŽùOÓyè:8‡“ß ×‚aࣼ±zc\ÀÅËŒàíĶ\W}¹ÑõèŠJüS˜³|)iil[½€(#¤,Í´q÷3'¥sê4ø…3ãµå¬Úø iii|¶uKfE0ÐÐp//&®J#--´Ï^ÃhÝ6Øu÷oÅм¸|#Ÿ¥¥‘öÙVV½ñ¤ÁUZ IDATCÝš©ÔËDì«ØøYŸm]Å’Yá›Þ¨}\Ú'¼6´aånGÌbɺ­|’V[×'[×±äʼn͗m'KÎüiqfÝ-o"&Â`GŸƒ½†2ã|öÙrÂëÚã6ôQ^^²ŠŸÔögãª%¼øèP¼:8þ›æ ª»íΤÄÒVD`Ã@"f½ÁŠu[kÇñ“¬Zþ3L~šÔzå>ˆˆˆˆˆˆˆˆˆ\Ozuu…™K£ˆYyÚë~0uB†3XžGXƒû\¼1fÚÆŒJÔcñlk÷1Ì[=A.Ö‚7›Äå•LšþõûùMdÉêyŒ©¿æ™Kc¦-Æ8® —¦-dàŒå¬Ž ±­Ê{c¦ÌcÌP/¦Ì\IN3§næ! ¼Á¸s¸i0üyâD&…uð U‹ï¯MûPÛZüCÆ0eÎ"Œ³yìÉÖ²íKq>eøc½T\eùÅuëºý"xmÅî÷n8Hþ„ý 1ÞOÄÒiÌ\yKû """"""""r½qø ^ƒŸ‘qÁî-n/>|¸.¸ †&Æ üM˜‚µÄÒ‰ .37-fÎì9,Ý•_{‡ÿ4Dl{q.ƒdIgSâR–®ÞE~ýý!Ñ<\¿†Ô‹ˆy—ƒ»™I󈉊cÁ¦c¸ø73n&æÔwËRX½xsæ-&)½²®ì(¢‚ вc—C›^ÁxµµHïqµÑÊSä˧ÜÍȬyuÁÝS»XÅ´¨Ù,5×bÝï_À‹&·vŒ1ÛŸyˆi ŽÕ7˜M1÷óÐs©”ãEļËÁÝ2ój̙üÄËÇ $nO lcô\‘ëƒVðð3N$jFSÆøCe>ÇNù3È»¹}ÝhŠ *z“¼¡,ŸcÜϼÕ÷3;s‰ $%ç´? ç7Žiõ cͳ‰ùSrmY©ùøoLdŠ7øƒß²œË«o[uŒ¥Q3Y™S{kWñF’âüoB¼ €¼LÌ0Öíž>g^¯½ ™ù` ÿmÌ36wN™Í˜©äXââSk{›R6Ž)‹€;þî8, eµ×]wì g6XëfZÂ8w€JvýikêÚ{xö<ÆìZŒÆEqKM¦ÜQãï~yLó‰Š[V»¢yûvR/gÛ#0ˆ'¦³&¾ùU¼™­®ðéþ:àõ åÅÙQŒñ‡Êc»Hœók¶¦¸qзΘ¥Û”encéì•$%¦7†O!**ЏÅ÷w*¤eóX¼9ÇîàœÁ߈_Ýß™›^[²xæVÊÛþ£ýSfRD" µý1ÔEL ƒÆ1ÈZgjƒ²‹ÙµÚ ÆFÞ‚Íü1f3`Ào¨‘ˆ'Œ‡†agtìÑ5p¯ÏQYÖö±¬ÜŲ5—£^ÆAui&\·`Ÿ\®àrj…cð7$sÌAão4Æ:¦Ç“lÒU§$’‚‘1€wØ 4ÄmÔ‘ëQǼ#³D1Æ¥ óââlj Ìðºù–cYº$Š0€SìšÃ›àm99É+ùSò'.`ù¼qL™7”]3I¶s)¯ÁÍËšó¶¼>—k}‹ rȱ»“•öÕY`»¿¥üe€í‚\'¾Èâ']ÎíÛÜ]¾ZñaŠÛí,Ëo€5àîÕ õîî4»¸ØÝ wŽ¿Áàn-§¸À¶,e×j]½å­öADDDDDDDDäúÔÁ¼õ+DÝ1Î^Í'SRHJL`åöƒ[êVðFG1Åèßà1ÞŒ›—Ķ'¶‘¸r%IÛkWð‡OaFt÷‡¸Û–mg€×b¹ tór§+.°Õ°N/?Ûp£ÁË¿I@Ô00š¥ó&Õ®ÎßÅêÄ$¶§¦slÐv-ã°vy'ZWÁž2¦¬½ý+«¤6ššÏÒ)YÓU4{F8hü-–2ê³K4S îXcÎeÅZ¥+""""""""7,‡^dÍeЦÍKd[ÊV6nMaÓò9Lô;Æê1Lš²€Ìûº‡ÜOÜ‚Õìúl#?ÙÅêÅqŒ!…¥³§1)nWÖÍ6Ï’oæXÝß!“Œ—W°2+>á³Ï>ã“OXÓ8‚%ßl½ð× )ã”íǤaMö÷3®.ÉC›æÌ!þƒTXð7;¬M¿‰¼<»>n>›7kg ÔBþÁúþŒ ñjX ~ÁC:t(Cƒ½08pü-ÇR¬å šÁÀ „½ÆES?•~¬Ýk‘î®Wçë¿K ‹cþD’¹n…¥×ÀæwuñÇß²‹Qóøà`í*MCGRÑæìbÓ±8âÆ,Ù‹„]ÅxEÄV»ì³ØlvìºÞœ]$åÇç„ÌfÅ?Vî*fÐýQL iº»¥²>|íθ¸XÒ“b žHì4ïv7!xJ,³Lu¥ú‡aFýºéJó2Önÿ:×róÌ•a]ÀøâĘ̈L µØàqQÌŽ2âœJŠâ¡×‹Û5þËåñðä…á`–âdVšçP{-µ8—z±4é –àb£êƒæÇX“¤<»""""""""rãêÕi%§²ËÜÆŸÏçï"ù`¹ƒ*ÎaÍœ¥D¬ˆ#ÄMšÍ‚I 6Kä¹GsHš³šI‰Óx™Æìú%¦••àâÒhh’Hga€»qsêÚeù§À¿6ÈkozïqÓ˜Ö܆SÛøÓœí hogÞëY=o îîcˆ[<†¸†Û3ynéÁº1µüË ŽQFî€qÞ&R¦ÌaÜÌílŸ7‡ˆ çm;Nu¼x6krô$‘WS4”‘߆ßÇ»G0ëåhB®¸§/ã¼ü¢ —ÊbŠÛ™§Árx%ÓŠcé®tŽª-¤,?“”ÄÙL™¶ŒÃ°ä³ü`<Ó¦-`“¹.e@Ù1Ì«g3å¹Ô¦é& >๘¥ì:VV×¶t¶-ˆâ±¸5—ÓÄÎ ØÐþöTžÊ$%iQý‘íX®\°ù&E-f“ùµCZYÛ™4s ãóöŽ¿Åϼ¤tN5©t;Ï=4…9«SH?vªvËòÉLÙÄ‚¨IĬÉÑê]¹¡9ÆšŽ`AìœYL36J/pl)Q󊉈‹­Ýv*…Õ+͸GD1)¬ÑeÇ2SfÅ1)IJÌM,}}±5eCw澂]‹Ã€S$M{ˆ×+$)âiii¹áu8À[Ï-x"ѳc›zóSX½l ÛS—a/ãDb낹 •en"!~Ù弽݅×DVl›GÀ©$⦿Nj1àeâÅK™âT¦0ûþgH.×I'â ðŠˆˆˆˆˆˆˆ80À[Ï-8‚èØŒó*`ûÊ­ÝÆ x§=…0ÒIJH É\ÐMrï†ñÅÕ,Ÿâo½§²¬ ÷úv%æÓˆù@ cEE^‘Nð޸܎ˆ"zFÆAþ¸»@eY>ÇÒSY“°”͵tWÄ‘àQ€WDº)xEDDDDDDD —†@DDDD®gÕÕÕ9r„ââbª««éß¿?·ß~;îîîW­M§OŸ&;;›³gÏÒ«W/¼½½¹ýöÛéÕKoÏE¤ûͱùùù\¸pšš ·Ür ®®®«ãüùóœ8q‹Å‚““}úôÁÏÏž={ꈈ ¯ˆˆˆˆ\§***زe ÉÉÉX,¶WzprrâÎ;ïäÑG%  ËÚôí·ßòÁpøðá&Û cÇŽåÁ¤OŸ>:€"rM»té›7ofçÎTVVÚlëÙ³'#GŽä§?ýi‡½¼÷Þ{ìÛ·K—.Ùlsuu%""‚x'''¹¡)EƒˆtKJÑ ""­ÉÏÏgÙ²e·º_Ïž=ùÅ/~Édêô6íØ±ƒ¤¤$jjZûíååÅÓO?Í­·Þª)"פššøâ‹/ZÝ/ €?üḸ¸Ø]Gyy9þóŸ),,lu?£ÑȯýkyEä†ÖCC """"ד’’âãã¯Ü¸xñ"‰‰‰ìß¿¿SÛ´sçNÖ­[wÅà.@qq1ñññœ:uJSD®IŸþùƒ»yyylذ¡]u¼÷Þ{W î˜ÍfRRRtPD䆦¯ˆˆØeÿþý$%%‘­Á‘kÒ¿þõ/ÊÊÊìzÌÊ•+)))é”ö|÷Ýw¬[·Î®Ç”——“Ц€°ˆHWkP5 0€лwo›m©©©vÏeM~±×¯_?kWë*À+"7:åà‘6¹xñ"ëÖ­ãã?`ûöí<øàƒ<ôÐC×DûÞzë-¾ùæ&OžÌ<`³ý«¯¾âïÿ;÷ß?>ú¨CëÿÛßþÆ×_M¯^½øë_ÿjócóæÍ”””àïïÏK/½Ä'Ÿ|Â»ï¾ Àïÿ{n¿ýö«2f-µY¤;KOO'++ËîÇUUU±iÓ&f̘áð6mذ¡]Úœœ¾øâ ŒFc—ã{ï½gïŸyæîºë.›íÛ·o')) €_üâüð‡?ìöçζmÛøàƒ®ØŸêêj’““Ù¿?'NœàÒ¥KÜrË-ó“Ÿü777=åº×xemLL C‡àìÙ³¼øâ‹TWWµÁÚ³gÏÒ¿ÿ6—òäI›œ»®®®¼úê«ÖT°yïròäÉkv¬Þ|óM222Ú´ott4F£ñ†~Ö™}7›Í$$$ØŒµÈõB^¹¢³gϲ|ùrŽ=jsÿ‡~H`` ÷ÜsÏ5÷!ýÞ{ïí”Ùß~û-à‡?ü!-î{úôiÞ~ûmë”ú:]Íž6‹twIµðå—_òóŸÿÜ¡We¯¨¨°~ùÔiiiúÚEê0wÜqG«óú_þò lîÏÉÉ!''‡O?ý”ßþö·„„„\·s¼^Sj¿kÈÏÏÏúw¿~ýpqq±yßcï{ Æå»ººÚäñõòò²Ù~µÞc‰ˆ\+à‘V}óÍ7$&&ræÌ™f·ïر㚠ðž?ž­[·òØc9¼ìcÇŽ±yófîºë.ëÛ›o¾™Ы×å—Öüü|kp÷G?ú¸»»3`À€v]t¤3Û,ÒÝåääthî(**² TtÔwßýÿìÝyXTGºøñoC‚ ²‰¢¢ˆ((Q\‚nM\¢I&“Ñä&ñN2fcÙ4jVïÄ,3^ãèÏ%ј¸¯#* "в#› Êb#ôï/ghé†ßÏóä‰t×9§N>oUWשJ¯±ò»!RSSå¢6ƒòòréܹsŽ£*|õÕWJç®Z­¦wïÞØÛÛ“’’Bvv6%%%|ûí·,Z´È ÑŠMãÛÊñ„hí‚‚‚èÙ³§òw\\œÛýýýqttTÞsvv~àÛhÒ>¢aäŽBQ«²²26oÞÌáÇï™îòåË-2ÿ$44;;»f9ÞôéÓkí0¨Ò³gO%/ƒ bРA÷½Œj˳­]aaa£·¿W¯F£!??ŸÂÂB,,,°²²ÂÁÁ¡Î/¢Í¡s ‹†IMMåöíÛôíÛ·Î4'Ož$==€N:ñòË/ãêê €V«eýúõ=z”¢¢"þýï3qâD)XÑ&qëÖ-©f v&//ŠŠ ½Ó߸qàýkµZ®^½ªü­R©°´´lS¦ 2DçïÍ›7+¼ƒfÀ€ÒF“s¢Ñ¤ƒW!D IIIüãÿÐi(W±··×Y™ÞÆz³Unj5ååålß¾gžy¦Þôeeeìܹ“¸¸8²³³±±±ÁÕÕ• &УG%ÝÝs¨}üñÇøøøðÒK/)ïµoßžÏ>û¬FÚï¿ÿž 6°jÕª{ÎÁ[\\ÌÏ?ÿLJJ ¹¹¹ØÛÛãããäI“tFûjµZ"##9xð W¯^¥¬¬ŒN:áëëËØ±c•/4†äÙÐòX²d ™™™899±`Á6nÜHbb"ýúõcÚ´i:_®´Z-çÏŸgÏž=dggSVV†ƒƒƒ "44´YF4‹¶ÍÂÂFÓàíï^ ++‹'NpöìÙZWt·°° oß¾ 2__ßï5ö|ZCïñììl~ùåÒÓÓ)))ÁÍÍ!C†Tg¬yóÍ7ùßÿý_Î;ǪU«011it\¹xñ"@½¼Õ; ª:w«:“{ì1Ž?Nyy9qqq:¼MWïãõ­' ©ê;žÄ÷¶%%%…õëד™™Ùè}­X±¢IóªÑhX´hQ×{öìÉ“O>I×®][UÙ×ÖF{ûí·ÉÍÍ¥W¯^<þøãlÚ´‰ŒŒ ºtéÂðáà æàÁƒ;vŒ+W®àââ”)Sèׯ_ƒâî‚ (**ÂÃÃÇœmÛ¶‘œœŒ££#Œ5ªÆbwƈéŸþy£Û§pg^æ­[·’˜˜ˆ¥¥%ƒ Ò‰Û©»„h‰¤ƒW!„¢  €­[·râĉZß;v,ƒæý÷ßoÑçÊž={8~ü8cÆŒ©³1wF¥|òÉ':Ù¥¥¥\»v˜˜fÏžÍðáðµµ¥}ûöܼy€Ž;Öù®­­-:tPFïÙØØÔû¸îÕ«WùôÓOuFüegg“Í… øÛßþ¦ŒÜ·o›7oÖÙþÊ•+ìÞ½›¤¤$þú׿bjjjPž -ênݺÅgŸ}¦3/åñãÇÉÏÏç•W^Q¾„‡‡óÏþSgÛÌÌL2339þ<¯¾úªQç?GGG®_¿Þ mU*;wVþÎÏÏgÛ¶mDDDÜs»ÒÒRΞ=ËÙ³géÝ»7O<ñ]ºtQòÓØóiM ¹Ç/\¸À7ß|CYY™’6..Ny|ùñǯõk×®%66¶AǬK||<À=çÎÍÉÉÀÊʪ֩‰,--Y¼x1·oßÖ9^SÆÕ{Åx}ë CêŸ{Oâ{Û’žžÎŠ+Zýܶ©©©,_¾œ… ¶ºxZ—ÜÜ\–/_Nii)p§#>%%…èèh¢££•tiii|ùå—¼óÎ;ÊÔ ‰»EEE|ñÅʨêª9ÇsrrxòÉ'•tÆŠéÆhŸfee±bÅ %VñÛo¿)åИºKˆ–ÊDŠ@!Dyy9{öìaÑ¢EµvîÚÚÚòßÿýß<öØc­¢q3lØ0øùçŸï™vÛ¶mJcÑÛÛ›?ÿùÏL:333´Z-›7oVæž3g“'OV¶7oO=õT­û3gŽÎ{Ó§O¯udIu[·nU¾\‡††òüóÏ+#233•í+**ؾ};vvv<þøã<û쳸»»œœ¬t’gCË£º‚‚JJJxä‘GtF{ÅÇÇ+"¿üò p§ÃûÙgŸå…^P¦«HJJÒùb"DCøøø4xÛž={Ò¾}{åKéÒ¥Këíܽ[RRŸ|ò‰ÒaèââR眮M}>÷ƒ¾÷xEE7n¤¬¬ŒÎ;3þ|Þ|óMåQåƒréÒ¥Z;6bcc±µµU~¼kl\)--%%%….]ºÐ¡C‡ZÓ”••)˜˜Ôþ5ÊÑÑWWWN„¦Œ«uÅxCê CêŸ{Õ)ßÛ–­[·¶™…ËJJJêm¶&US =öØc:OEGGãééÉ£>ª¬õPQQÁ©S§wsrr¸}û6S§NeÊ”)XZZpôèQ222ŒÓÑ>ݲe‹Ò¹ëççÇìÙ³éÛ·¯N›´!u—-™ŒàBˆXYYGeÏž=uÎuÌŒ3°²²j5çejjÊ”)SøöÛo‰‰‰!))©Îÿ±cÇpss㥗^RFšvêÔ‰ï¿ÿžÒÒRÂÃÃ?~|“湸¸˜3gÎwܘ9s&pg›ØØXŠ‹‹‰eìØ±(£Ì‚ƒƒñ÷÷Wö“’’Üeèãˆ)•JÅ‚ ”Žu333¶mÛ¦äÅÅÅ…’’¥ñíââÂÀ±°° _¿~˜™™ÔÙi"„¾†Êo¿ýÖ iÆ@dd$ß}÷ÁsLV¿—V¯^ÍüùóéÛ·/cÇŽeÆ ï§]»vµŽìlÉ(úÞãqqqÊí‰'Ò¿ž{î9þú׿rûöm8Àœ9stŽQYYÉc=Ƙ1cP©TF‰+‰‰‰TVVÞsz†êud]À÷#®ÖÅzÂúÇ×^´ÉÉÉmê|ª¦ai ÌÍÍùË_þ‚¥¥%ÁÁÁ¼öÚkhµZlmm™?>jµš²xñb®]»Ö¨¸ ð_ÿõ_Jgr÷îÝY½z5p§“wöìÙF‹éƈ£W¯^UFûøø0wî\T*!!!,[¶¬Æ”#¿D[!¼Bñ*((àØ±cìß¿ŸâââZÓtîÜ™'Ÿ|//¯VyŽþþþìÞ½›ôôt¶lÙRëÓêyê4,ýýýùá‡ÐjµµÎ¹il¹¹¹Ê¿«Ï•fnnÎ[o½EII‰2zÚÎÎŽ—^z‰ÊÊJÒÒÒ8tèÄÄÄ(Û5¤cª1åagg§tB899)ÿ®zTÏÜÜ+++4 ,X°///|||˜2e ;v”›S4š••3fÌàÇ4h;___|}}INNæÇlpçn•ŠŠ ¾ýö[Þzë-† Fddd?6ÕeúôéØØØ´ªN}ïñêqdÇŽüöÛo:_øZGZYXXèt#®TÍ){¯ú®úÔ6uÕ›÷#®ÖÅzÂúÇ×^´õ}ÆZ›’’’6s.Ê(ZÌÌÌ(++ÃÕÕU™Ê«ú“#U÷zCã®ÎHa///¬­­)..VÒ+¦#ŽV_zðàÁJzSSSjtðJüm…tð !Ä¢¼¼œ˜˜ÂÃÃ9þ|L˜0Ñ£G×¹*|k R©xôÑGYµj)))œ={¶FšêótÞÝxS«ÕX[[STT¤³¨\SÉÏÏWþ]õˆxõ†õÝNž<ɦM›t:;ʺ1åq÷g¥¶†º©©)sçÎeݺuäååQVV¦Ì[ w:ØþøÇ?Ö8! ̵k×øõ×_õJß«W/æÌ™CYYÿûßöXrqq1ßÿ= ,àùçŸgåÊ•deeéµíøñã iå©og·!÷xõ˜WýßÕU:«ÎÖÖV'¾#®ÄÅÅ¡R©ððð¨3………2¯úµk×ÐjµµÆ¹Ë—/sûömT*nnnMWïEßzÂÐú§±×^Ñ8uýàRß1‰»wÇ"[[[Š‹‹•‘¯ÆŠéÆhŸÞ+}mµ¿D[!¼BÑFUTT““ÃÅ‹¹p቉‰÷ajjÊ!CøÃþ`Ðã§-™——}ûö%..ŽãÇ×x¿S§Nʿ¢¼¼\ùR\=]S1dtXvv¶2ZÁÕÕ•Q£FáááAvv6_ýuƒóÐåáååÅÒ¥KIHHàÌ™3œ9sFùr••O?ý´ÜÀ¢Ñ&OžŒ££#ÿïÿý?ŠŠŠjMcbbˆ#˜6mjµšßÿ½Îéj*11‘sçÎáããÃo¼Á† 8qâD¦ÖÖÖ̘1£ÆŠãÍ­úbsÕÞª-FTO«ï=^}dò’%Kô^ü¨¶Ž€ÆÄ•ââb222èÙ³§2"®.ÎÎÎRTTÄ… ”G«×»}ô¥¥¥¸ººòÎ;ïÜ·zÆz¢¡£“%¾‹ê¢¢¢”9KÓÓÓ•ùO¥  €¤¤$å^‘9Q ×и{÷áZ­Vy­êz3¦7¶}Z=¦Ý÷Úê3‰_¢­^!„¸nܸAZZ·nÝjð>*++¹uë·nÝ¢¤¤„k×®‘Í•+W¨¨¨¨¿"P« aܸqzÔiM}ôQ–-[Vë{ÕŸŒ=ZihFDD(0÷šçÐXª?†{îÜ9† ¦t|úé§\¿~=zð / ämêÔ©Ê"LUó“5TS—Grr²²`Õ¨Q£˜5k?þ8ñññ|óÍ7ܺu‹ÔÔT ¢ÁJJJ077WF11pà@"##‰%//òòr:t耇‡Êç¾²²’½{÷6I¾~ûí7|||°°°à™gžaܸqDDDœœLaa!fffØÛÛÓ¿h×®²mEE¥¥¥Í>zõÅnŽ;F`` 2¢T£Ñ(‹öTOkÈ=^=Þ¤§§ëü––ÆíÛ·±°° [·nMWî9ÿn•ÀÀ@%ý¦M›øïÿþo¥ÞÔjµìÚµKYÕ¾W¯^÷µž1¤ž0¤þ‘ø.ê²uëV¶nÝÚdû¯ú< ã´ó ‰»ùùù$%%)Ó4\¸pAéT­ZPÒX1ÝíÓêñôĉøùù¡R©¨¬¬$22Râ—h³¤ƒW!îS'Ć 8yòä}˃½½=Æ #$$¤UÍñh¨îÝ»3hÐ ¢¢¢j¼giiÉ!C'==¯¾úŠàà`®^½ª<ÚmaaÁ!C”mª/²žžN=Œ²ð‚­­­² ÍÙ³gùé§ŸèÓ§QQQJ£²gÏžÀ¹ÂªìÛ·²²2rrrØ·o_­ûÖ7Ï )C˜˜˜pèÐ!2229r$666dgg+Äë;âCˆê´Z-ëÖ­ãØ±cØÚÚFHHæææ´k׎iÑ IDATaÆ)VuINN6úˆ³*)))(£Š\\\xä‘GêíÌ8~ü8;vìàÆòÌ3ÏÔû®±ôêÕ ²³³IJJbñâÅxxxPQQ¡óåÞ××W©C ¹Çûõ뇭­-lݺ Ú·oO\\œ²šùäÉ“ëí hl\©šWŸÞàà`:Dff&999,Y²///lmm¹té’²x™¹¹9¡¡¡ÍWëŠñ†Ô†Ô?÷ªS$¾ Ѳ5&î~ýõ׌7ŽÊÊJvïÞ­¼>bÄ£ÆôÚG]\\ððð 11‘˜˜Ö®]KŸ>}8sæ éééÒ>m–tð !D3+++cåÊ•¤¥¥5û±­­­0`xyy<Ÿ_kõÈ#púôie‘‡ê¦NJbb"¹¹¹œ;wŽsçÎ)ï©T*f̘¡ó¨WÕH€ 6pþüy^zé%£äsúô餦¦¢Ñh8|ø0‡VÞëÑ££GÀÓÓ JKK‰‹‹S:(ÜÜÜ”†«F£iPž -CôèÑ???NŸ>MrrrºU*£F’ ! ¶wï^edbAA7ndçÎŒ1‚áÇ׹@ŠV«¥¬¬ ‹&_aýüùó :”ÒÒRÌÍÍ댿………œ8q‚ÇëÌW££#“'On–2533ã¹çžcÅŠh4®]»VcþDžzê©Ýã̘1ƒµk×’——Ç—_~©“¶W¯^JÌkʸrñâEÔj5îîîõqR«yñÅY¹r%W¯^­1’¹ªÜþøÇ?êŒ kʸZWŒŸ={¶Aõ„¾õO]Ç{ñÅ%¾ ÑÂ54îvìØ‘¢¢¢#´ÇŽ«Ä:cÅôºG§M›ÆªU«())!**JèQ5—º´OE[$¼Bq:"š«s×ÜÜœž={âáá§§'½{÷6ÊhÓÖÆÑÑ‘aÆé|a­Ò¡C-ZÄo¿ýÆÅ‹ÉÎÎÆÆÆ†nݺ1aºwﮓ¾OŸ>Œ=šãÇ}´Ÿ‹‹ ï¾û.Û¶m#55•¼¼<ðóócܸqÊãÑvvv¼øâ‹lݺ•Ë—/ãììLHHÞÞÞ,\¸€={ö(# ɳ¡åa•JųÏ>‹——ááá\»v Fƒ­­-nnnŒ;Vy¬Y}UTT°gÏž¯³sçNvî܉››tèÐSSSe1–øøx¦L™BHHH‹ÂKÕ*àñññüðÃxzzâàà€ ååå’’Rëè¢*û÷ïgܸq:£3›R×®]ùàƒøý÷߉‹‹ãêÕ«¨Õjy衇 ÕYÌÐ{|РAØÛÛó믿’‘‘Á­[·ppp ((ˆ‘#Gêuž‰+ׯ_çêÕ«xzzê]¦vvv,Z´ˆpêÔ)®\¹‚J¥ÂÑÑ‘ž={2~üøóé6e\­+ÆZOè[ÿÔu<‰ïB´ ‰»Ìš5‹={ö™™‰³³3C‡eøðáÞ·¾ £=zôàµ×^cûöí$%%aii‰¯¯/nnn|÷ÝwÒ>m’Êßß_+Å „hmj{ܾµX¼x1999M¶ÿ‡zˆ¡C‡âääDçÎÞ¡›““ÃâÅ‹•¿Õj5óçϧgÏžÍÖé „UX±bEƒ·á…ðõõeõêÕ\¸p¡ÉòÄœ9sHIIáã?nð~^~ùe¼½½å !šÔ¼yótþÖ§Wµ˜¯¾íÁÛ·o£ÕjQ«Õz·WËÊÊP©T˜™™é¸Ó‰·f͹°X°`EEExxx°`Á)!Z8Á+„Í,77·I÷ïîî®,¦ÒÊËËùì³Ï°²²bÖ¬YÊEB4›ÄÄÄFm¯Ïb”ÆP5%Cc—˜˜(¼Bˆf·|ùr,,,î™æÕW_åæÍ›,Z´H¯9K?øàÒÓÓ™?>žžžõ¦ÏËËcáÂ…8;;óî»ïê•V!&RBѼš«3¡¹i4¾ûî;bccå" !šMvvv£¶¯zÄÜÚÚºIóÙ¡Ceq²ûu¾B!„¢í‘^!„FµcÇ)!D³¹{á/Cååå`ooߤùtppÐ9^C5õS B!„¢õ‘)„BUFF†‚¢Ù5jûÔÔTú÷ïÏï¿ÿÞdù¬šV!))龞¯B¡åË—K!ÑŠÈ^!„FÕ®];)!D³©šb¡¡RSS)--ÅÝݽɦipssÃÎÎŽòòrµ/F#]!„Bè^!„Fåëë+… „h6·oßnÔöeeeDEEajjJXXX“äqòäÉœ>}ºÑÒhµZ¹ðB!„B!¼B!ŒÆÕÕ•G}T BÑlŒ±påÁƒÑjµ<üðÃtîÜÙ¨ùóôôdÀ€hµZöíÛg”}–——Ë…B!„ éàBˆffaaѦÎG¥RÑ»wo¦L™Âo¼Aûöíå" !š©©i£÷‘‘‘Á‰'P«Õü×ý—ѦšéÔ©Ï=÷ááᤥ¥%æ㜅B!DÛ!‹¬ !D3ëÙ³'qqqM¶ÿ;wræÌœœœèÒ¥ ½zõ¢{÷î¨ÕMòÍÌÌxíµ×ä !î ²³³´­““>>>888àääÜyáùçŸç믿¦¬¬¬Áùjß¾=/½ô:tPŽ5kÖ,rss9þ<999 ㉉ŒÑB!„ÿ¡ò÷÷—I¼„­NTTT«Í{||<+W®lÖ9Õj5½zõÂ××___ìì켯œœ/^¬ümnnÎ_|!J!Ä}±ÿ~6mÚdÐ6äø]»v­3MVVß|ó ¹¹¹çÉÅÅ…_|‡{îÇŽœ9sÆ }Ϙ1ƒQ£FÉ…B4©yóæéümnn^ï6U?Šé“îÌ¡®ÕjQ«ÕzÿpUVV†J¥ÂÌÌLïüÀ§Ö¬Y#VÑfÉ^!„hfžžž<ñÄüôÓOTVV6Ë1ËËˉ'>>ž7Ò³gOBBBhsSF!,¡¡¡\¾|™ÿûßõ¦µ²²âÙgŸÅÛÛ€ÒÒRâããINN¦°°Ž;2vìX,--quuå­·ÞbÏž=ìß¿ŸÒÒÒz÷onnΨQ£?~¼[5 {÷îåÆtèÐ^½záé驌¾xñ"k×®¥¸¸¸Þý*]Ñì y¢ÁЧ W\«Õ6ê !„h‹d¯¢UjÍ#x«dee±ÿ~.]ºÄ­[·tFôæçç7KÚµkÇàÁƒ;v,ööözm##x…-Q||<$>>FSã}[[[þò—¿Ð¥KÊÊÊøí·ß8pà@Ž[[[[fÍšÅC=¤¼V\\ÌéÓ§‰‰‰áÒ¥K)ïYZZÒ½{w À Aƒ°µµUÞ;yò$›6mªÑykiiIhh(ãÇÇÌÌŒ+W®°jÕªZc¿¹¹9½zõâá‡fàÀr¡…Íâî¼K—.­wdî»ï¾‹F£á7ÞЫ]ùù矓™™ÉóÏ?»»{½é¯_¿Î‡~ˆ““ýë_õJ«t|È^!D'#x…â>quuåüc×/_¾Ì{ï½gоºuëÆ¤I“èÞ½;×®]#77—ììl’’’HOO¯sdÄ­[·8tèG%((ˆñãÇãèè(GÑêxzzâéé @II‰òèo•víÚaaaA~~>_~ù%YYYµî§  €5kÖàããôiÓpvvÆÚÚšáÇ3|øp***Ðh4XZZÖ:¿yvv6›6mâÂ… µ£¤¤„;wrîÜ9^zé%œœœxï½÷())ÑéŒP«ÕXZZ¢R©ä !î«:ÔûÔWU¬²¶¶Öù±«.UÓ2XYY镾ª=kbbRozCG !Dk'¼BѤ§§”ÞÇLJçŸ^édèÔ©: Ü””NŸ>Í™3g¸qãF}TTTΉ'1b“'O¦}ûö­®ì´Z-QQQ9r„+W®PRR‚½½==zô ,, gggƒ÷¹fÍ’’’X¾|y³œCFFK—.åé§ŸfÈ!o¿zõjrssYºt©ÜLâeii‰¥¥e×KJJøüóÏõZ”íܹsœ?žAƒ1räHz÷î­¼gjjŠMø“À±cLjˆˆÐkžõôôtV¯^Ík¯½†¥¥¥ÞóVÞ/ß|ó YYYF//¾ø"ÁÁÁ<ùä“õ¦}ûí·ÉÍÍå£>¢S§N-º¼š»þ¸_×D!1UbªÄTqÿI¯B´0†tð:99étîÖèÕjúôéCŸ>}˜9s&ÉÉÉ>|˜S§NQQQ¡“¶²²’ƒròäI&MšÄÃ?ÜjVk×jµ¬]»–¨¨(œ  ]»v\½z•ÈÈHNœ8ÁË/¿LÿþýåC&ÄjýúõzuîV+‘‘‘DFFbgg‡§§'=zô }ûöXXXP\\LAAiii$%%éLÝ ¯¬¬,6lØÀœ9sZtÙ9s†èèè{.׬¬¬hß¾}“jNOOçìÙ³ >\¯…B!1Ubª-º5g½ûì%¼”Ïú·?%¢–ö´Ý…,žiÉ¡OÞc[–ñѰé=‚‘Ýó9¶ÿùòYBI] ×f̘1÷ìܽ›J¥¢wïÞôîÝ›3fpäÈöïßÏÍ›7uÒi46mÚÄÉ“'yúé§quumñåMTTAAA<óÌ3:ÓS¦LáÃ?äûï¿çÓO?m5ÖBã‰%22²ÁÛçççsüøqŽ?nô¼Ž 'NdÙ²eLž<¹ÖÇ™ÓÒÒøàƒؾ}{Ѿ-M||<ãÆ«ÑkooϰaÃ(..&''G>dB<€¶mÛ&ùk ­[·RVV†|„Bbª¢’®I!„haî^Ñý^Œñ8U»ví˜4i¡¡¡lß¾C‡éÌYQQÁÎ;¹páÏ>ûl‹-·Û·owFÙÕ6âx̘1Õ˜_,33“_~ù…K—.Q^^®,X×§Ot7oÞä_ÿúIIIh4ÜÝÝ™6mZcñóÏ?“˜˜H~~>;wfðàÁŒ3SSS´111ìÙ³‡ÌÌLlmmñööfРA5òþÉ'ŸPZZÊ¢E‹t^ß¿?›6mbÉ’%÷\Ïm¬¦ûÔ×yu¤…±uß%Êm¼1þ¼¼Ðƒ—­áL îÎŒW^`¨ú'o$éŠ=üF3tæËt(ZÄšsED¬ù€üɯð‚_?~²‰¤ü"=¶+‘Oœ¢^vvv\½zU¯´û÷ï' @ï_õáææÆo¼ÁáÇٲe eeeÊ{¥¥¥ìܹ³E–›³fÍbÇŽ9r„#GŽÐ¾}{<==éÛ·/~~~:«ÞWVV²qãF¬­­yë­·”Q¡#GŽäwÞaÏž=<ÿüóÊy0€Ç{LÙÞÄÄ„““£Œزe •••,Z´{{{&NœÈÖ­[Ù³gÑÑÑ<ôÐCh4¶mÛ†½½=ûÛß”|………±lÙ2£–‹¾yª½½=={öäôéÓLŸ>]ròäIŒV«å_ÿú¦¦¦,\¸Pý0qâD¾úê+öíÛGHHÎÎÎ ÊZZ¼òÊ+˜™™I€ R5‚¨¥»páB‹ÊÏÎ;ÉËËãÅ_4艑†Ä…+W®0g΂‚‚€;ÓíTÅ©£GòðÃ7*Æéó«:uww§[·n”••…ŸŸóæÍSŽ»{÷nedX·nÝê, }ë'N`ffÆ›o¾Iûöí•r\µj•ÎçÂËË +++N:ÅØ±c•×£¢¢2dH£c¿¡×Äcš¯ììlFÍôéÓÿóN­fïÞ½\¾|777 p¢Õ˜*1UbªhJm`¯¾¾”¥Kkþ÷úœt“ÚøñèH'n_\Ë'k¶q†ˆý?±rå>ò¬¼xt´ëo»ôí™ÛÖòÓŽp""³ií¶Ÿ¾H¡å/áåEù•”%åçST®ßvBQC:ÂÒÓÓINN6zT*#GŽä­·Þ¢{÷î÷L[Ûܽ÷CUž?ùäþú׿2qâD\\\8{ö,?ýôo¼ñ;wîT~ÉÎÎÎæòåËŒ9Rç‘ÿŽ;òä“Oâå女ÿê>@iUM©QQQÁéÓ§ñóóÃÒÒFƒF£¡¤¤„áÇëtÞT=R¦Óélkk«Œt0CòT®_¿NjjªÒ8ŽˆˆÀÝÝGGG HKKcèС:¶©Õj&NœˆV«åܹs:iÓ¦Iç®h°ÒÒR233[E^srr(**jyÉÊÊb÷îÝLœ8Ñàhœœœ”‘TU1}Ò¤I˜››sþüùFÇ8Cc~õŽ•JEZZšÎ¯ãÆã³Ï>»gG„¾õÀŒ3øðÃ•Žˆªx[ZZªóC«Z­ÆßߟK—.‘ŸÿŸež#""°³³£oß¾F‰ýú^CŽÕÐ|………ÕZ~ÕËEˆ–NbªÄT‰©¢©µ¼y[¿‰˜Âšïtð{‚'‚ª¬“®h8·ï"Õ›ÎåYÇ8|e4zõ¦Ã¶,ò‹ɺ=šSŸf†åaŽ»HV~ûÿQÏc³ ÝN!ªÑ§aSÅÎÎ&Ë‹³³3o¼ñ;vìà÷߯5Mß¾}[Tù™ššÒ§Oe]FÑ#GØ·oÛ·oÇÑÑ‘€€®\¹Pë|½Õ_p§»zGlUµºÜÜ\*++9zô(G­½šø¿Ž›ªmm×Ú˜¿œ’§ºøûû³yófN:…»»; ܸqƒI“&)Ǩ««æòÒwDzmÌÍÍ騱£Ñ`wO×ÒÒ%''ãëë{_óPYYɺuëprrbܸq Š=†Æ…®]»ÖÑfaa““S1ÄgHÌ×ù²¤V3sæL6mÚÄ¢E‹pssÃÃÃooo<==ë}‚FŸúÀÚÚšëׯsêÔ)233ÉÈÈ 99Fƒ¹¹yü=z”Ó§O3zôhrssIKKcâĉ¨T*£Ä~}¯‰!ÇjH¾j+?c¬? ÷ÆoÔ›¦j>Ù¥K—Öú9¿Û­[·øòË/õz­²²¸ócØ_þò½Ò¶S%¦JLÍ¡ tð–pébqEµu|”@ÐF–™ÙXbF ù…å5ö‘_ØÙa©JâøÇ'?2ùÑñ>úC4WH}úªóž••aaaxyy±lÙ2N:E@@€2Ï”>å§Ï¼¯Uó~…„„ÔÙ°­Ep¯Æ«!׳ja9cä©.vvv¸»»súôi¦M›FDD„2ÚAŸÏNõ|4ä\î^tBC]¾|¹Uå7##ã¾wðžþøcœœœxå•WôJÛHL•˜*1U4“éd˯œ& +|F{Qýc®vÊ'(LJ¢°ìû,ï,y©ÝÕ@ ùiçß¶–ŸNßW/ìêèoèvBqw#ãîJº.‰‰‰6[ÞY¸p!«V­â¥—^jÐHƒ¦2`À²³³ùùçŸk4Þ´Z-»wïPÊÖÕÕUY½¶zgºF£aóæÍ$&&4*¡j„@dd$ÙÙÙ:ïíÚµ‹U«V) ü^½zammÍîÝ»u***bÿþýµîûÚµk:£Uòóó9uê”Ñòt/~~~¬_¿ž’’‚ƒƒ•÷lmmqssãØ±cäååé4®wìØJ¥ÂÛÛ»Ñç"DC]¿~½Uå÷Æ÷=¾¾¾Ì;·ÆöööØØØ0wî\üñ:·74.ÀÇ‹ÃÃÃuâöÏ?ÿLyyy#“ ‰q†Æüêóµ/]º”ß~ûí?ßÔjeÑc<žŸŸOii)NNN:—/_æâÅ‹hµÚ?ŒU•ÉÎ;¹|ù2C‡5zì×çšr,cåKÜ;v¤S§N÷ü¯êêСC½i;uꤌ>µ¶¶Ö+½­­íN ½Ó¶S%¦JLÍáÁêr,:ÍÖCa¼:ò9^{vûNgRnçňñAØk.òãïY”åW/RÔa&#Ÿ{³C§IÌ;Œô3CA–2ø÷6˜¹âãÓ›’¤Kdé½BÜÛC=Ä™3gêMWVVÆÆùóŸÿÜly333k‘ ^=öØc$''³k×."##éÕ«¶¶¶Ü¼y“ÄÄDrssñññaذaJcræÌ™¬Y³†%K–0hÐ ÌÍ͉ŒŒ¤°°çž{Îà>úˆeË–Œµµ5 $&&¤ŒÖm×®S§Neݺu,Y²LLLˆŠŠÂÉÉIçñ=€þýûsñâEV®\É!C(..æÈ‘#ôë×èèh£ä©¾/u$&&bccC¿~ý”÷T*3gÎdåÊ•,]º”   ,--‰‰‰!33“1cÆ(óÃ5ö\„hˆââbɯœk]h×®]˜˜˜Ô;E‹¡q¾nÝ:bccqrr"!!¤¤$úõëwÏ)+ôqúÆüªÇW8€¯¯/ýû÷ÇÙÙ™½{÷R\\Œ³³3¹¹¹ÄÆÆbjjªóƒWÚÄ% IDATCuîÜ{{{öíÛǵk×pqqáÊ•+DGGÓ¹sg._¾Ì† xä‘G”ÇmÝÜÜpppàÈ‘#´k×®ÆêíÆˆýú^CŽeŒ| ÑÚHL•˜*1U4‡lLi9iÛ–ñAÖ£ÌȣόÆL“GæÅí|±i?IUƒ¨òÃYó…3¦Ž&ð3 Ü.¼BÒ¾Ùúû9Jþo_W"ã5™‘Ï<ëïñå}¶Bˆú 8µZ­Ìou/QQQôêÕ«ÆÜ³sssÞ|óMŽ?Ή'HHH ¸¸˜Ž;âèèÈÔ©Sy衇t~É÷õõåõ×_gÇŽ„‡‡SYYI·nÝxê©§´x‹‹ ‹/fË–-œ?ž¢¢"˜9s&#FŒÐÉ‚­­-»wïæøñãØØØàççÇ”)S˜?¾Î~GÅ­[·gëÖ­tëÖéÓ§ceeUo§¨!yº—Aƒ)Å»çîÝ»7o½õÛ¶mãÌ™3ܺu‹.]º0gΜ£Ds.B4Dk[º¾¹µ[ CâBUŒ;v,û÷ïçüùótîÜ™I“&1a„{Æ)Cbœ>1ßÛÛN:E^^¾¾¾ÌŸ?Ÿ;vGDDÖÖÖ¸¹¹FïÞ½]V&&&ÌŸ?ŸÍ›7sáÂâââèÞ½;¯¼ò ööö|ýõל;wŽ &ètø²sçNj<:oŒØ¯ï51äXƪ“„xÐHL•˜*1UÔGåïﯕbB´6U“ß·eÿûß zl}Ö¬YŒ9R>¢Iìܹ“íÛ·³hÑ"ºví*"Z÷Þ{¯U-´fmmÍŠ+äÂÕaÍš5$%%±|ùr) !šÐ¼yótþþüóÏë]øôÕW_åæÍ›,Y²DYoà^>øàÒÓÓyõÕWõšž,//… âââ»ᆱWÚ**•Š5kÖÈ…•˜*D›e"E „-S]ócÕeÆ ¬_¿^¯Q¿B¢¼¼œÿûßtíÚU:wE«£ïÊâ’ßÖAŸH…BHLâA#Ë~ !D åíí¥¥¥ÎbTõ9zô(!!!tïÞ] PÅÆIOO'??Ÿ?üáR ¢Õ±²²’ü¶yyy?~œ¤¤$ºuë&"„S…ÕÈ^!„h¡Ôj5ãÇ×;½……þóŸ¥sWUll,YYYL˜0ÁƒKˆVÇÁÁ¡Uå×ÎÎN.Z-.]ºÄï¿ÿN·nݘ={¶ˆBHLBTï?"Bˆ–kܸqxxx°oß>Î;WëbAŽŽŽøùùŠ­­­š0ª÷ß_ A´j^^^DDD´ªüŠšüýýë]i^!„ÄT!TÒÁ+„-œ»»;sçÎ¥²²’«W¯rãÆ ***°´´ÄÁÁ)$!„¸Ç—Ø-[¶P\\Üòæj5C‡•‹&„hqΟ?™™Ù=ÓTÍ!ONNN½û¬š†,%%…ÒÒÒzÓPZZJLLŒ^i«˜˜ÈÃËBˆ¶MåïﯕbB´6QQQRB!ôòïÿ›uëÖµø|N™2Å ©y„¢©¼þúë´™ó±³³ãÃ?” +„h³äg,!„BѦ…„„Ö¢ó8lØ0éÜB´ƒ jSç#ë!Ú:™¢A!„B´yS§N¥k×®lݺ•üüü“/[[[y䙚AÑ¢<òÈ#¤¤¤ššÚêÏ¥ÿþLœ8Q.ª¢M“)„­’LÑ „¢!***ˆ%>>žk×®qóæM*++›íø&&&XYYaoo§§'ÞÞÞ¨Õ2æBÑò”——sôèQ.\¸À­[·Ðj[O×J¥¢}ûö 8Áƒ£R©ä‚ !Ú4éàB´JÒÁ+„B!„B!sð !„B!„B!D«%¼B!„B!„BÑJI¯B!„B!„B´RÒÁ+„B!„B!„­”tð !„zûí·™7oׯ_W^Û¹s'¯¾ú*o¼ñ?þø#óæÍ#22ò¾æ«¥‹ŽŽfÞ¼y5þ{ùå—Y¶l‡¢¢¢¢ÑÇi ×§±Ö¬Y ä÷UFFóæÍ#<<¼ÍÜÆ8§*_ý56lh²¼V•Ý¢E‹$~!1UbªÄT!ÒÁ+„BÜCzz:;vì   @yÍÊÊŠöíÛ£R©ÈÌÌdûöí8;;óè£`aaAûöíQ«Õ÷-_­‰§§'ãÇgüøñ„……Ñ¿nܸÁ† øüóÏ)++kð¾ïÇõB{õÕ…UuWaa!/¼ð6l &&†>úkkëÇi!$¦JL•˜*1µ52íҥ˻R BˆÖfîܹRBGTT7nÜ <<kkkBBBèØ±#QQQDGGóðÃcbrgêù””>úè#nܸŸŸ}úô!++‹#GŽPZZJ¿~ýpuuÅÜÜœÔÔTfÏžMHH:u"**Šüü|ÆŽ‹³³3ÖÖÖ$&&2}útBCC±··'55•ØØXF…••qqq¬X±‚ÒÒRpww'..ŽÃ‡Ó¯_?:uêÄ… øâ‹/P«ÕÓ«W/4 ‘‘‘äççãçç§w¾ 9OCËï‡~ààÁƒtíÚ•€€ÌÍÍ9{ö,gÏžeøðáJ:}áQQQôë×^½zÕš¦¤¤„ÈÈHzö쉻»;ùùù,]º”¬¬,|}}éß¿?………;vŒ´´4Q©Tz_CÎ_ßcצ¸¸˜ØØXúöíKçÎ8|ø0iiiܼy“áÇ+ í_ý•¢¢"fÏž©©)QQQäääpúôi¬­­ RòxöìYBCC þŒ Q—#GŽðÝwßQQQA`` DEEƒF£Á××—nݺµªûÑsÒ—J¥B­V£V«)//gïÞ½ôèѽ¶×÷^­«ìîv¯úAßøaH™ž>}šœœŽ?Ž»»;~~~dggI||< 2„¾}ûOdd$ƒ ÂÚÚºÎ2Ñ·.¬ª»nÞ¼ÉéÓ§ÉÈÈ gÏžRXXØà8-„ÄT‰©S%¦¶F2‚W!D›‘ÍèÑ£™>}ú*:µš½{÷rùòeÜÜÜÐjµüë_ÿÂÔÔ”… *#N'NœÈW_}ž}û ÁÙÙ777ÒÓÓ;£jk¤ººº’““@=èÝ»w4•••lܸkkkÞzë-¥6räHÞyçöìÙÃóÏ?ω'033ãÍ7ߤ}ûöÀÇÇV­ZÅ… ”ýé“/CÎÓò+++#** ???æÍ›§¤Û½{·22ÀÐÆ|}:uê@nn®òÚ–-[¨¬¬dÑ¢EJƒ|âĉlݺ•={öÍC=¤×õ1äü 9vm¼½½Ù²e qqqxzz@—.]¸|ù2 pûöm’““éׯŸÎ£ƒ¥¥¥ 0€Ç{LyÍÄÄ„““ƒ««kƒ®½Õi4¶mÛ†½½=ûÛß°±± ,,ŒeË–ÕHßîGCÏ©9r¯ê[v÷ªô‰ ‰qùùùüéObðàÁøûû³`ÁRSSY¼x1ŽŽŽJ,_»v-©©©÷Œ?úÖ…UÒÒÒà•W^Qâåºuë§…˜*1UbªÄÔÖÈDŠ@!D[V£aw¦((( --¡C‡êL' V«™8q"Z­–sçÎ5OÙÙÙ\¾|™‘#GêüÂÞ±cGž|òIea‡3fðá‡*¯ªXii©’}5ô<ë+?T*iiiÊâãÆã³Ï>3zç. Œ¨úEE§OŸÆÏÏKKK4 †’’†PkƒÕŸŸÆÛÅÅ;;;åq¿ââb²³³3f æææÄÇÇwF ”——3`À€û¸{1ºª<–––޷ϸh[ª5 S¾´ØÚÚ2jÔ(´­å~4䜚Ëý¸Wë‹ ¹ž¦¦¦(ÛØØ`mmMïÞ½•ŽˆªøWýúÕ¥!uá´iÓ”Žˆ¦üL !1UbªÄT‰©-•ŒàBÑfXZZê42 U½{n,@™ƒ¬zÇ¥1\¹r¥Îc*ÿ¶¶¶æúõëœ:uŠÌÌL222HNNF£Ñ`nnnÐ1ržú”ŸZ­fæÌ™lÚ´‰E‹áææ†‡‡ÞÞÞxzz6É\ùùùJc=77—ÊÊJŽ=ÊÑ£Gkݦ¨¨¨É>?9¶J¥ÂÛÛ›£GRRRBbb"žžžxxx(¼ À¿õåñî)1îÇg\´-UŸÚ~°©úòj¬{¢¹îGCΩ¹4÷½ªoü0ôz¶k×®FìW©T5Ö÷ñ]CëBsss:vìØäŸI!$¦JL•˜*1µ%“^!„m§RS7®Z«jLUTT5_åååz5ÄŽ?Îúõë177§ÿþx{{3aÂöíÛgÔu§¾å7räH @tt4/^$<<œýû÷ãììÌüùókì1233ÿtðVå;$$D§ƒ¼ºê£Œùù1Ʊ}||8räIII$&&bgg‡½½=}ûö%66–7n«««2=EKÿŒ‹¶å^?ÔÜÇZËýhÈ9µ¤k`Ì{µ¹b\cZZXX´¸sBbªÄT‰©¢Ù¿ K!„xTufeeÕx¯ê5cÏMêääÜYPìîE""""ÈÌÌdòäÉlذoooæÎ«3 !Ѧ:OFC^^ööö„††Jyy9ÇŽã§Ÿ~b×®]<ñÄF+»òòr:„µµµ2gmõŽÞª×ª”••‘œœŒ¥¥e“~~s쪑Î/^$11‘>}ú(¯ÄÆÆ’’’˜1cZÍg\´-U€¦§§Ó³gO÷222Œ~O4ÇýhÈ9µåú¨9b\cc~cëÂû}BHL•˜*1UÜ2¯BˆŠ­­-nnn;vŒ¼¼<ÐŽ;”Gèï¦Õj|LWWWììì8pàFy]£Ñ°yóf¹~ý:¥¥¥899é4¾._¾ÌÅ‹Ñjµµæ¡®|5ô<ë“ÍÒ¥Kùí·ß”×Ôjµ²°Bee¥Ñ®Uii)ßÿ=„……)# ªF DFF’­³Í®]»XµjMòù1Ʊ-,,ðôô$&&†ŒŒ <<<€;9ZZZ²k×.***ô^1º¹®½xpôêÕ kkkvïÞ­óØeQQû÷ï7ú=Ñ÷£!çÔÒë#}5¤ÞºŸ×îLÉÓº°%ƒS%¦JL÷ƒŒàBñ@Q©TÌœ9“•+W²téR‚‚‚°´´$&&†ÌÌLÆŒ£ÌÓÿyüêÀøúúâëëkxeûóÖ®Y³†%K–0hÐ ÌÍ͉ŒŒ¤°°çž{ŽÎ;cooϾ}û¸ví...\¹r…èèh:wîÌåË—Ù°a<òíÛ·¯7_†ž§¾ÜÜÜpvvfïÞ½ãììLnn.±±±˜šš À™3gX·nÌš5«Þýž?^éüÖjµ\½z•ääd ðòòbäÈ‘:é§OŸÎG}IJeËÆÚÚš„„ ª1šÄ˜Œqlooo6mÚ Œà511ÁÓÓ“èèh¬¬¬pwwo–ϸwk×®S§Neݺu,Y²LLLˆŠŠÂÉÉI™»5݆žSU óóóãÉ'Ÿlõ‘!uNcê­ûy= ­ [â9!1UbªÄTq?H¯BˆNïÞ½y뭷ضmgΜáÖ­[téÒ…9sæÔ˜[ÊÛÛN:E^^^ƒ:x|}}yýõ×Ù±cáááTVVÒ­[7žzê)eçüùóÙ¼y3.\ ..ŽîÝ»óÊ+¯`ooÏ×_͹sç˜0a‚Þù2ä<õeffÆüùóÙ±cqqqDDD`mm››aaaôîݸ3ZâæÍ›Ê*Âõ‰Wƒ;£œ?~<ǯ1×›‹‹ ‹/fË–-œ?ž¢¢"˜9s&#FŒhÒùߌql6mÚD‡tVz®êàõöö®±PGS}Æ…¨MHH¶¶¶ìÞ½›ãÇcccƒŸŸS¦Laþüù­ò~4äœ a-é^ml½u?¯§‰‰‰AuaK<!$¦JL•˜*î•¿¿¿VŠAÑÚDEEI!!„¢ÉÄÇÇsâÄ ž~úi) !„˜*D‹&sð !„B!Ä]233qqq‘‚B‰©B´xÒÁ+„B!„Õ$$$‘‘Á°aä0„Bbª-žLÑ „h•dŠ!„B!„BÁ+„B!„B!„­–tð !„B!„B!D+%¼B!„B!„BÑJ©[ý ØõfhXC½\qê`·5ä]IãÜáìŠÈ¢¤Ù3Ô›g?z™%‡øä½md•ˇL!„B!„BÑ4Zw¯] Ï/|þ?{÷e÷ü‰è ¿Ó1EÁ5PȰ Å¢K¹7û®m¹•gWÏÚ¶Ý»–ëÝ­™ý0óî®8';Ù–´JwTþ‚VtÁB…”1EA~³ 9£2Â÷cE5uôõ8Çsdæº>×çó¹æzóæ3響‚¬õl.¯ÅnôÅCÌ´g 3½Ã¢UÅW9Ék£Ú|ƒ¶rlJˆˆˆˆˆˆˆÈ/È%<<¼Ñ9»ndðã ˜9¬ŠÏ^\JFuólª „¹<ãÊæW^ UËhEn8¹¹¹š¹éœ¹ë¾¾®`-Çl9;k§43ÍÆXê[>ãiËÔø(Lýüp¯¯¥¬(‡õ©ë(t´áKôÜùÄš_giQ$O  èM^XUMðS ˜a2³|^…Í–{Þ6‡…úóÍ›óXeö"zî|&׾ßþ·ûO} Œ˜JBl0¼ÀZCIN)iù4ÏK_¼o€ï`ââ‰î—+Ô×$oÝZR³K¯~9 ¹¦œø&k6J͵àÉ´ic õ7¶|Ú’Oêª2›eP}#þÀüY1QÌúä$¯+‚àXfÌÁmž-w7MfÎôP\æ‘ShÁŽ óæ"ê]MD™šË“à˜~P›CæÁÖV 1M˳Ó"1ÜLòŠ¬Î±ó(s¦‡âÙž¾‚˜:g&±&;E™«IN^KN¹/‘‰³˜jÔ«YDDDDDDDDä&ãÄ+xí”§½I²q: ‘™6¬U”˜Ía.,¢´®YÂÕh">a ®ekY´4 ùäVñìs™DáªRšöpím$ó•HkVÞÁfΤ¨~ÁQA ªíëJt?¨ù,«õªùFåGmÖë,Mù©ýüBJísy66ŽPÏB²ímì›ï0{AYòrVåÔ“g¦fZFOÐ^‘›ŠsßdÍ^MΪWÉIñ$°Ÿ Sh0Á¦P&&FA"Ôä%“”œCµ þa˜Ü¡$%ç§jS9¬;8‘GM&|)¥ºé‰ª,²ÎÎØÚ’YheXh AÆbŠmàCoÊX_ÝjAaô¦†ôÍ?'ÁNùºWy>Ë€½ Amì[] åõ± K˜ÎTc&Y…E”[ÊÉøà=½’EDDDDDDDDnBÎà5Àn{åæ|ÊÍùd_aqS™9§jËY”ZF_ŒÀÀG³ìÑVÚªõÃÕŽ,l­¥•õ°vn.ÄFL‘âb#¡Qpp…–Ö»hô26ªÎnÌn£î§} mí›­˜^YAüäûˆ˜<ƒ¨ÉœYµœ¿™´´lJµ€WDä‚’’’0›Í¼öÚk׬Ë–-ãèÑ£,\¸ð‚Û>|˜… 2}útî¸ãŽón÷ûßÿžQ£FñÈ#ÜPçêùçŸçèÑ£,^¼˜®]»ðÅ_‘‘««+/¿ü2+V¬`Û¶m̘1ƒ‘#G^‘ã¶uÞEäúÑÖ¸*:GŠ÷"Š©"7*çMðúŽeîü‰°öe¶Ì®Ú-frR’1…>Mdp^©åÔÚj©§sò›-Ê.8Ô×RÕâázê[9¬½<‹üÚH"b‚ð´POÑòbêÎÓÍz[=`ÄÓ-62xâëk¤ÞR­}³W瓚”O*F|ƒL ‹"6&‘§á…¥ÙXôš'sèÐ!víÚÅ]wÝ…··7îîîtéÒÊÊÊøì³Ï0`ÑÑÑtêÔ‰.]º`04‰"WáºÔ8EçHD¯cSäúä¼7Y«5sÐ ±q nåþbß~ºC½åÌJ\{u¥õ®š\±”—SÞô¯ L±ñÄšÚx“2{9Yyµ¸šb‰ˆ‰ÂÏZHzÑù—ÎÖÌ£?b¢[dÓ}#žbþsOãÛö¾?Îßü™„ `ÃRZHvêrVåÕC`0¾ú|+""NúaàóÏ?§¶¶ÖñØÜ¹syýõ×ñññ ºúL)¤øøx"##øõ¯Í믿Îm·Ý¦I¹ ×¥Æ):G"zkœ"×'çM ÚKI[•GðŒHf.6QôM>%å5Ø0âÌm‘ñ«/"9å§›¡Ù̬M+ã¹É³˜cLgs^v¯ÞGDÖ»Šôt ö¶˜ò¬jbb™µYïqðB;Vg“’Ã̘9Ì1®#³È¾aÄMìM}Ñ 6W´­oöê"꼉™ñ®›ó(±€ïÀaÄ„¹b-Èiý&o"""7€ÆÆF\]]5""""""Í8õšÏºÂxáÅ<¢ï‹%2ø&FºõÔÖTQ¾9™Òs(u”E°S¹”,÷15.‚ÉÆâŠ•š’’_I#§=ÙÑêoȪ‰e¢_ 9›Ë/’¶QüÁ"^?8•ÉѱL‹t?S7wó ’ÒòªÚÐÆ¾Y²IzÓ•© ±DLL$ ¨¯­Âœ¾‚µë Q ^¹™:uŠM›6‘““CMM îîî 8I“&ѽ{÷Û?~œ?þ³ÙŒÕj¥ÿþ<ôÐC¶Ø®²²’ÔÔT:„Íf#00;3ÈÈHGé€W^y…“'O2oÞ¼ûgdd’’‚ ð÷÷?oß Ø¸q#eeex{{ˆ#Ú5þ={ö°nÝ::„C† aÒ¤ItêÔ©å{g]Ÿ~ú)%%%X,ºuëÆí·ßθqãèØ±ã‘””Ä?üÀÌ™3IIIa÷îÝŽùëÕ«W»çoéÒ¥°páBz÷îͼyóZÔK~÷ÝwÉÍÍàÕW_ÅÇLJ—_~Ù1¿‹-ÂÏϯÝã»ó.r#:ßuÙžkìÝwߥ¦¦†ßýîw¬^½šýû÷ãîîNDD&L 77—M›6QQQ··7ãÇgÔ¨QŽýgÍšE\\ `Æ 8pBCC™8qâEÿØSPPÀ† ¨¨¨àäÉ“tíÚ•áÇ3aÂ:wî|ÅÆÙž÷ž¶hëûN{ãñåÆþÚÚZfΜÉG}DAA‹/ÆÃÃã²Ú½ZçHñ^SoÞ˜*r3騫W¯ÿræ4¯æÀ®¯ÙúÏ Ö¯_Ïúõùgf6¹Åå;uÎÖØª÷‘›ýO6®_Ïúõdæì¦¼®yŠÖFéÖõ¬Ïùž†óõ82׳~}&ûŽŸý\kûÛ9Vº‹¯3êcÆVrŠ+9ÞÐÞ¾ÝRÊ.Ç6ëÙøÏ­äî;»-‘ßO<¡IÞÿ}þùÏÒ»woFމ››»vírÔëС¹¹¹TVV’——‡‡‡‘‘‘øøø››Ë®]»3f :œ©^ôÝwß±xñb~øá¸õÖ[)//gË–-œÌ-·ÜBDDµµµmn÷Zž#Å{QL½9cªÈÍFU[EDÄé:uŠÜÜ\ÂÂÂxòÉ'oذÁ±Ú éÃÛÉ“'6l>ø c»:ðÕW_QYYI`` |üñÇtìØ‘¹sç:V Œ?ž·Þz‹ôôtFM=.«ßV«•ÔÔTüüüøë_ÿЧ§'qqq,Z´¨ÍíTUUñØc9jÓÞ{ャ]»–7²uëVî¾ûnÖ¬YCCCóæÍs¬x?~¼cÛ;w^´žmEE±±±L™2åç_& 6mÚÄ‘#GèÛ·o»æ¯oß¾:t8³ò¬µÙTVVЯ_?L&S«}këø®Ô¼‹Ü¨Îw]¶7†X,~ûÛßrûí·Î3Ï<Ø?¾ã› ]»veùòå8p E\-))áá‡vüñ¬±±‘O>ù„ŒŒ ¾ù曫Ӛûúë¯quuå/ù‹ãk¼ñÆìٳ犳=ï=s)ï;m‰ÇW*ö—––2räHæÌ™ãXé·råÊKn÷j#Å{QL½9cªÈÍHþç3ëÐJKK7ã‚3‰Î×_ýœ_ï¹çžs~ñ†3É_€cÇŽQZZJTTT‹¯ƒ ÆOcc#………—Ýï¦qqqŽÞÞÞŒ;¶ÍíáøÙÅÅ… &àææÆ·ß~ ÀéÓ§ÉËË#,, £ÑˆÕjÅjµb³Ù¸ë®»Zü’~!qqq­Îß©S§®êü5מñ]©y¹™\J 騱##GŽtüìé鉇‡&“©EÙšž={¶ˆ!Müüü¸óÎ;[Ķøøx\]]Ù¹sçyû:uêT^zé%G"¢)qòäÉsŽq9ãlï{Ï…\jܼX<¾’±ÿ¡‡r$w/·Ý«uŽïE1õ挩"7#­àç33HLL$%%…yóæÑ·o_HHHƒ jQÛËh4¶ø×ô esG8§&/à¨kØüÏKÕÔFk¿°6}Ho‹Þ½{ŸóõÚN:à8ÆÑ£Gihh`ëÖ­lݺµÕvêêê.z¬Öæïìc_­ù;û˜mß•šw‘›É¥ÄÎ;ŸS ÕÅÅÅñ•áóÅ&}úô9'>Füýý/C<<<ø÷¿ÿÍŽ;(++ãðáÃìß¿«ÕŠ››Ûg{Þ{Ú2¿í›mÇW"ö»¹¹áããsÅÚ½ZçHñ^SoΘ*rS~&ÖˆˆÈ &&†aƱsçNŠŠŠÈÎÎ&##ƒ=z0{ölÇW †Ë{ëkúåòôéÓݶ¾¾¾MmµæBõÛª¡¡Áñ‹wSGÝbµosÍWfœ÷‡«8íÑžñýÒó.r#ºR1¤=ÎWk±cÇŽŽo\´fÛ¶m$''ãææÆÐ¡C áþûï'==ý¢ßhï8ÛúÞóKÄͶÄã+uÞξaçå¶{µÎ‘â½(¦*¦ŠÜ,”à§gµZ©©©ÁÏÏ1cÆ0fÌìv;YYY¬ZµŠõë×3mÚ´6·×ôõØòòòsžkzììú»çlÛT7ö|š¾NwèÐ!n¹å–Ï>|¸Íý=|ø0->¬Z­Vªªª6lX‹1>}šAƒµØÿÔ©Sìß¿£ÑxEÎÇ¥Ìß•:f[Æw¥æ]äfr5cH“#GŽœÛNž|¸c»)S¦°xñb-ZĨQ£ððð`ß¾}”””yÎê¦KÕÞùkúšñW_}ÅðáÃ[ô¹=Ú:¾öÎ{~~>+W®$,,ŒGyDœÜZ¹.¯V iâããÃûï¿OAAþþþ˜ÍföîÝK¿~ýÎ×»u놟Ÿééé|ÿý÷ôìÙ“ªª*vîÜI·nÝ8rä}ô<ð]ºt¹¬q¶õ½§-1¤½qó—ˆW«Ý«yŽ®Ôû¬ˆbêõSEä'Nœ W¯^<öØcçÔ;v,'Nœ ;;›µk×Ò§O¦L™‚»»û¼p¦&™··76l`Û¶mxzzƤI“˜={v›ú:bÄî¹ç222øöÛoéÖ­&Làþûïoñ5¼ž={2þ|Ö¬Y÷ß~K]]Ý»w'11‘èèè+Z°=óBhh(;vì ¦¦æ’¼í_{æÝn·süøñ Ö§¹Ñ´v]^ÍgþxΗ_~IAA]»veܸqLœ8ñ¼µU;tèÀìÙ³ùÇ?þÁž={(..&((ˆ9sæàççÇÛo¿Maa!÷ßÿe³­ï=m!퉛¿Tl¼í^Íst¥ÞgES¯Ÿ˜*"­s oÔ4ˆˆ³ÉÍÍÕ$ˆÈU³wï^¾þúk¦OŸ®É¹ fÍšÅÈ‘#ùÍo~£""¢˜*"¡¼""""QVVFÏž=5"¢""""×%xEDDD.`ß¾}>|˜;ï¼S“!"Š!"""rÝQ ^‘ ¸õÖ[¹õÖ[5"¢""""×%Õ৤¼""""""""*Ñ """""""""â´”àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆÈM-))‰gžyFъÇóä“O’}Ñm¿øâ ž~úiæÍ›çôçùùçŸçÉ'Ÿäßÿþ·^G"ò‹Ä ‘+I ^¹,eee|öÙgôèу &8ýxÜÝÝéÒ¥ ...:¹"ò‹ÄŒC‡‘––ƱcÇ4"""rÙ š¹ÕÕÕÄÇÇìôã™;w®Nªˆü¢1ãСC|þùç >oooM¢ˆˆˆ\­à‘ËÒØØ€«««&CDDDDDä*Ó ^qzK–,á»ï¾cÙ²e gÞÚ¶oßÎòåË à¿ÿû¿Û~ñÅ|öÙgÌž=›¡C‡:?~ü8ü1f³«ÕJÿþýy衇 lq¬ºº:>ýôSJJJ°X,tëÖÛo¿qãÆÑ±cGÇvIIIüðÃÌœ9“””vïÞ àh·W¯^—4Ö‚‚6lØ@EE'Ož¤k×® >œ &йsçK>~AA7n¤¬¬ oooBBB1bÄEûóî»ï’›› À«¯¾Š/¿ü2•••¤¦¦rèÐ!l6ÜyçDFF¶ø*sRRµµµÌœ9“>úˆ‚‚/^Œ‡‡Ç59ÏIII˜Íf^{í5ÇceeeüßÿýÄn·Ó§O&L˜À­·ÞÚ¢m}‰8³ÙÌçŸNii)]»veäÈ‘ :”_|‘?þñŽûº†Û^yåNž>>„††2qâÄ6ý±©-±¼¼¼œ_|‘ððpüqǾûöícÉ’%ÄÅÅ‘pNÌ8uê›6m"''‡ššÜÝÝ8p “&M¢{÷î,]º”ââb.\HïÞ½™7oÞE÷9­à§ŠÝngÿþýŽÇJJJ¨ªªjQãpïÞ½¸¹¹µHÌ:uŠW^y…Ó§Osï½÷rûí·STTÄÿüÏÿpúôiÇv‹…^x;vL\\¤¦¦òöÛo;V²69qâK–,áôéÓLš4ÉÑî²e˰Ûííçž={xë­·¨­­å®»îbܸqøøø°iÓ&’““ÏÙ¾­Çß²e o½õÕÕÕŒ5Š!C†°}ûvÞ{köéþûïgüøñL™2…3fðÝwß±`ÁöíÛǰaøûî»9qâï¿ÿ>kÖ¬9§»ÝÎ;ï¼CII t$p¯Åy>[qq1/½ôeeeDFFMUUK—.å»ï¾»ìöE®G»víbÉ’%TUU1zôhLzz:)))­nßÚ5ÜÞ8ÐEEE¼ùæ›têÔ‰»ï¾OOO6nÜÈ’%Khhh¸à¾måÄÇÇ“““CAAã:ÿûßÿNïÞ½‰oµý¿ÿýï|öÙgøøøpÏ=÷`2™Ø¹s§#ö>øàƒŒ;€‡~˜iÓ¦µi?‘óÑ ^qz!!!¬Y³†ââb œYaÕ«W/Ž9¾}û9r$õõõìß¿Ÿ!C†´XáuòäI† ƃ>èx¬C‡|õÕWTVV:V_®Y³†††æÍ›‡ŸŸãÇgíÚµlܸ‘;wrÛm·9Ú¨¨¨ 66–)S¦üüÆk0°iÓ&Ž9Bß¾}Û5ί¿þWWWþò—¿Ð¥KàLy„7Þxƒ={öœ³}[ŽoµZIMMÅÏÏ¿þõ¯xzzÇ¢E‹.Ú§ÀÀ@*++èׯ&“‰ÆÆF>þøc:vìÈܹs+ÏÆÏ[o½Ezz:£G¦GŽvJKK9r$sæÌ9ï껫už›khh`õêÕxxxðÜsÏ9VÇÄÄð·¿ý7òÔSO]rû"×#»ÝNJJ ]»vå¹çžsÄ›±cÇò /´ºÏÙ×ð¥Äö())áá‡&::Ú ?ùä222øæ›o5jÔy÷mO,¿çž{ÈÏÏçÃ?ä¿þë¿øüóϱX,<÷Üs­þ!êÔ©SäææÆ“O>éx|Æ Žo_ôíÛ—C‡g¾UѧOŸ6í×§O½8EDD¤UZÁ+""N¯gÏžøúú:¾òúã?RQQÁ¸qãpsscïÞ½À™U¥v»aÃ†ÓÆ=÷ÜÓâç¦äëÉ“'8}ú4yyy„……a4±Z­X­Vl6wÝu@«IÖ¸¸¸VÛ=uêT»Ç9uêT^zé%G²¥)©qòäÉó¶w±ã7•ˆ‹‹s$w¼½½+ÌÚëØ±c”––ÕâkŃñãÇÓØØHaaá9û=ôÐCüjõÕ8Ïg«¨¨àÈ‘#ÄÄÄ´(áããÃ#[SÝ˶ÌÅ•>ß"×Ê…jFŸïm½†/ZS__ß®~tìØñ‚+æ/%–|ÿý÷À™ññãÇϹ ds111 6Œ;wRTTDvv6ôèуٳg;ÊB\©ýDDDDôIDDDnM+œŠŠŠ())qÜ\«©VëîÝ»ùî»ï7nÜ%µßôãÓ§O;ÚlrêÔ)öïßÑhüÅÆg·Ûùè£ á‰'žh‘ܸœx5Ý•þСCÜrË--ž;|øðeÍUyyù9Ï5=v©u7éó|¶€€*++ mñ\NNeee$$$è”JÓë¾¢¢âœ2$¿X8ûF•M×^kŽ9Bccc‹?¾œ}N’®­šVÍnß¾ýœÇúõëyã78vìØ/6>‹ÅÂÉ“' h‘Ü=räEEE466¶š¹˜àááÁ† Z|-¹®®ŽŒŒŒKê«··7}ûö%++‹ššÇãv»´´4G©…ëñ<Ÿ-00___¾úê+¬V«ãq«ÕÊ?þñJJJ~‘•Î"×RPPÞÞÞç¼îøá¶mÛö‹Ä777¾ÿþ{l6[‹¸·cÇŽVÛ¯¬¬dûö펟IKKãÔ©SüêW¿ºb±Üjµ²bÅ L&ÿñÿÁ}÷ÝGNN»víjµýŠŠ .\È—_~ùó¯àƒã¦m -¶oŠÛíÝODDD¤9ƒ³wßÿŽÌI ÆÝZFQáf²Ê-àÛaQ$>Á°‹HÊ·èL‹ˆÜBBBHIIp¬ììСƒ bçθ»»Ó¿ÿKnÊ”),^¼˜E‹1jÔ(<<<Ø·o%%%DFFž³¶­òóóY¹r%aaa<òÈ#­nÓ­[7üüüHOOçûï¿§gÏžTUU±sçNºuëÆ‘#Gøè£xàZýzñùtîÜ™„„V®\É‚ §C‡äææ€ÅÒþ÷PYºt) .$22£ÑHAAeeeŒ7î¼u<¯‡óÜâ7Ÿêb&%%±`ÁFŒ››Û·o§¶¶–3f蓎››S§NåÝwßåÅ_$<<œ††¾ùæHAAÁEK’´7 :”¢¢"–.]ÊwÜÁ?þÈ–-[2dH«7Móññáý÷ß§  Ìf3{÷î¥_¿~Œ5êŠÅò>úˆãÇó§?ý î»ï>vìØÁ‡~ˆÉd:'ÞöíÛ—=z°iÓ&~üñGzôèÁÑ£GÙ½{7;vtô­iþ¾úê+†ÎСCÛ´ŸˆˆˆH«Ÿ[œºóAñ<•ŒkÉg¼þ^¥Ž?øg’‘¶™øgŸ&öÑéD˜—’S§“-"r£ %%%//¯wmoJü…„„\ÖM¯zöìÉüùóY³f ß~û-uuutïÞÄÄD¢££/y%§Ýnçøñã¬Ù¡CfÏžÍ?þñöìÙCqq1AAAÌ™3???Þ~ûm ¹ÿþûÛ}üÑ£Gãíí͆ ضmžžž„……1iÒ$fÏž}Ic2™L<÷Üs¤¦¦’ŸŸÏ‰'èÕ«=öØyë^^/çùlÇçÙgŸ%--ììlèÓ§ÿïÿý?Ç b‘͈#pwwç‹/¾ 33“€€xàºwïNAA^^^W4Œ;–'NÍÚµkéÓ§S¦LÁÝݽÕïСC çË/¿¤  €®]»2nÜ8&NœxÑ’µ5–ïØ±ƒœœ|ðAGÙ ƒÁÀôéÓyùå—Y½z5=öX‹¶]]]™={6iii“““ƒ‡‡}ûö%..“ÉœùCUhh(;vì ¦¦†áÇ·i?‘Ö¸„‡‡7:g×=¹í yt` +žÿ_ò[IàMóçǃ)_µˆ÷ ›²¿ü#&356”~^¸Zk8hÎ"-%³£ _¢çÎ'îà›ü¯9‚©qaô󃚲BÒW¥PèË´ÉxAm߬}Uù–ËØïÌ1C㈋¦·—+POíÁBÒÓRÈ4ÛÎé×ÒÂP&Ç…aê}¦­Âu«HÉ.ÇÖl~ÇO#>ÂÄ™MŠØœ–…×´™D™ßä/˜±ø&>!žˆàÞx¹B}íAòÖ­%5»´Y["ןÜÜ\M‚ÜPöîÝË×_ÍôéÓ5"rM544PWWGçÎϹyÚ¿þõ/V®\ɲeËèܹó5é߬Y³9r$¿ùÍot²DDDD€Ž½zõú/§ì¹q“Ãè^’ÊÇÿª>“¬<‹ÝRHfÆ?ɯnzÖ@P³üçÄ`\o#mãfv•w¤ÿ¨±Œ‹êGUN.•§Œô»3†a}‚ õ«dó—ëøºÞ1’Ȩ;¸sPŠÖɺœƒtIxd UY9TžºÔý &ü‰YczS»;“ô¯¶PpðîÁ‘ÜuWÐOÛ4ëW·~ Ö‘âëIÏ*ÂÖ;’Q£GàkÎd—¥ð%â©y<€m÷?ùâ«J]úqÏä{Ø *rHße¡ÁÄÔ¿Ì&¦›…ÿÚ@æ¶}÷ʨ˜(Ë·’[m×"×­'žxB“ 7”]»vÑ¥K  É‘kª¡¡ÿüÏÿ¤´´”‘#G:V´644œœŒ¯¯ïe}kár­[·ŽÀÀÀ ÖÚ¹™8o‰O|šÒª¶¯4õ crLõEËy%©3 vóÉ+®cî³±LŽ ¤0µ¼Y²ØLrR Ŷ3ÿ· eV˜œåI¤–žÙª”P†Í Ÿ—¡Ù*âöîçE ¯ƒY)$¥ÿ4ž|rJ=Y<«½ ä×5K¶úÕ“þB™?-þ-.7`Z˜H`/˜«1Å‘ìJíæ×y%µôÌxrr(,›ÃüÄ~?·ã;ŒÁ^P–¼œU?Õ°ÈÉ3S3-Ž£'h ¯ˆÈU±oß>>Lbb¢&CD®¹Ž;2fÌÖ­[Ç;ï¼CHH...|ýõ×”––2sæLÝ\PDDDä:b¸™:o#+…éE4¯è`/Ï"³*–ÉÁ&¼RËqÜN¦º Y]_¨µØ ¾š‚òŸ“­õµ¬àÚü@íÞÏBÎ{¯’ãè¨ÿ@ÁÑýZ¶Û¤,“¼æ÷¼±Y°ÆŸ~ô5™p§ŠÕ™¥-V6[ò×Q4y&Ž ^u%”×Ç2,a:S™dQn)'ãƒ÷teˆˆ\E·Þz«ãfa""׃x¶lÙÂ'Ÿ|B§Nàü#ÁÁÁš ‘ëˆó&xmê€@_ ´^¢| ¾ ÿÚB2ó«qõ4⊠KíÙ[Û°Ø__Œø¹±ÖZ­çâ… Ú¿Ÿ!0‚øø(‚ ðrÅZsòóÝÎV{µµ\ý\ –Ú³»PwfœŽvŠùà•ÄO¾ˆÉ3ˆš X«(ÉßLZZv‹$µˆˆˆˆÜ<\\\ˆ‰‰!&&æºëÛ›o¾©$"""ÒŒó&xëJÉ«‚~ÁQ‹)l%iŒeêä( ߘÉ̇ú:õøãëe€õeø9³öZ”5†2cÎ4LUY¤$'Sd®¦Î† é,xº½w̵c«²^øzÍWúâyfœÍ·®Î'5)ŸTŒø™ElL"O K³[î."""""""""וÎÛu 9iXû‚.\ IDAT]‡ñðô;<+q‰ÁŸ¨©QxQKN智ºöª<Êq'46˜æ›£ˆ€Z³™Úk0ƒ(A®õ˜S×’S|&¹ †á~ íG÷EµÈà{†ÅܬæƒqðãümÁŸI26,¥…d§.gU^=ãkÐ"""""""""r=sêž­pIé¾<›È³‹¢ ¿sY øõ#4"’^PµùÖ7Õ¾­Ëcíæ8žŽ™ÁŸO'=¯ »o0Ñ÷Eâg-bźr®Å^»ÅL5‘?<„ÌBÚŒô "j˜¦¨0‚ÒrÚ\2Á^¾ŽµE<ó4Ïz¥³¹¨ ×Àbc©­ÿ¹V¯­ºˆ:¯Dbf<…ëæ™©±L~4Wk eEŸñfJæºk4Œº–¿À´©w3yõµU,Lgéó šú“#b‰ü&ÒÒ67H~Ò Øâ§MbÔ–™Éys)eñÏ1­i3K6Ioº25!–ˆ‰‰DõµU˜ÓW°v]!*Á+""""""""r}s oÔ4ˆˆ³ÉÍÍÕ$ˆˆˆˆˆˆˆÈM¯ƒ¦@DDDDDDDDDÄ9)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDä†ðÌ3Ï””tÁmžþyž|òIþýï_±ã>|˜'Ÿ|’ììì+:ž/¾ø‚§Ÿ~šyóæ]7süûßÿž?ü°MÛ.[¶ŒçŸ^/L‘_˜AS ""7 wwwºté‚‹‹ËuÝϲ²2>ûì3 @tt´Nœˆˆˆˆˆˆœ—¼""rÓ˜;w®Sô³ºº€øøx‚ƒƒuâDDDDDDä¼T¢ADDä:ÓØØ€«««&CDDDDDD.H+xEDä†ÔØØÈßÿþw²³³ùõ¯MLL III˜Íf^{í5’’’øá‡˜9s&)))ìÞ½€þýûóÐCÑ«W¯m°qãFÊÊÊðöö&$$„#F´¹O•••¤¦¦rèÐ!l6ÜyçDFF:ÊF¼ûî»äææðꫯâããÃË/¿Üj{³fÍ"..ްaÃ8€¡¡¡Lœ8±E‚8))‰ÚÚZfΜÉG}DAA‹/ÆÃãMýjnÏž=¬[·ŽC‡áããÃ!C˜4i:uºàøëêêøôÓO)))Áb±Ð­[7n¿ývÆGÇŽÛ½ûî»ÔÔÔð»ßýŽÕ«W³ÿ~ÜÝ݉ˆˆ`„ äææ²iÓ&***ðööfüøñŒ5J/z¹))Á+""7œÖ’»çsâÄ –,YB¯^½˜4i•••dff²lÙ2^|ñE †3o•[¶l!99oooG2qûöíìÚµ«M}úî»ïX²d nnnDDDàîîNAAï¿ÿ>eee<ôÐCÜÿýðÅ_0eÊ‚‚‚.ØnQQ_~ù%¡¡¡Ü}÷ݘÍf6nÜHII Ï>û,:üüe»ÝÎ;ï¼ÃÑ£G8p ƒ¡Íýj²oß>¶mÛÆÈ‘#:t({÷î嫯¾bïÞ½Ì;×1_g³X,,Z´»ÝNdd$žžž“ššJII øÃZ$“;Æ’%K>|8C† !++‹Ï?ÿœ½{÷RUUŘ1c1b7näƒ>à–[n¡Gzñ‹ˆˆˆˆÈMG ^¹¡466òᇶ)¹ PQQAll,S¦LùùÍÑ``Ó¦M9r„¾}ûbµZIMMÅÏÏ¿þõ¯xzzÇ¢E‹ÚÔ§?þ˜Ž;2wî\ºwïÀøñãyë­·HOOgôèÑôèуÀÀ@*++èׯ&“é‚m—””ððÃ;nÆÖØØÈ'Ÿ|BFFß|óM‹•­¥¥¥Œ9’9sæàêêÚ®~5©ªªâ±Ç#22€{ï½—µkײqãF¶nÝÊÝwßÝj?׬YCCCóæÍÃÏÏÏqœ¦}wîÜÉm·ÝæØÞb±ðÛßþ–Ûo¿€ððpžyæ8Àüùóñ÷÷ k×®,_¾œ(Á+"""""7%Õà‘Fcc#ÉÉÉüë_ÿbäÈ‘Mî6‰‹‹kñsß¾}8uêf³«ÕJ\\œ#¹ àííÍØ±c/Úþ±cÇ(--%**Ê‘D…3‰äñãÇÓØØHaaá%ÙÏÏ;ï¼Óñ³‹‹ ñññ¸ºº²sçÎs¶衇¥.¥_DDD´8Þ„ pssãÛo¿mµ§OŸ&//°°0ŒF#V««ÕŠÍfã®»îΔ}h®cÇŽŒ9Òñ³§§'˜L&Gr gÏž-ΕˆˆˆˆˆÈÍF+xEDä†Ñ”ŒìÚµ+ùùù=z´Eâ²5F£±EÒ8§îluu5}úô9gÿ¦dð…=z€ÀÀÀsžkªóÛtŒöêÓ§O‹2 Mcò÷÷?§M777|||.«_½{÷>g~:uêD@@ÀyÇpôèQغu+[·nmu›ººº?wîܹE]Þ¦óâááqÁs%"""""r³Q‚WDDn(O<ñ]ºtáµ×^cÕªUÌž=û‚IÀóÕŒmîìDcs—›`ljûôéÓ—´ÿÙÉÝæíž|Îñ¬V+UUU 6ì‚Ç9}ú4ƒ jñÜ©S§Ø¿?F£Q/`‘K ¼""rÃhžtœýôS~øáKn«sçÎ$$$°råJ,X@xx8:t 77—€€,Ë÷wqq!11‘¥K—²páB"##1PVVƸqã5oÛËÇLJ÷ߟ‚‚üýý1›ÍìÝ»—~ýú1jÔ¨+Þ¯þýû³råJvïÞM@@ûöíÃl63dÈÇêéÖL™2…Å‹³hÑ"F…‡‡ûöí£¤¤„ÈÈÈsVF‹ˆˆˆˆˆHÛ(Á+""7¬Ûo¿¬¬,233/šì¼˜Ñ£Gãíí͆ ضmžžž„……1iÒ$fÏž}ÑýM&Ï=÷©©©äççsâÄ zõêÅc=vÞ•¯m1tèPÂÃÃùòË/)(( k×®Œ7މ'^°vð¥ökĈÜsÏ=dddðí·ßÒ­[7&L˜Àý÷ßÁzÄ={ödþüù¬Y³†o¿ý–ºº:ºwïNbb"ÑÑѺYšˆˆˆˆˆÈ%r oÔ4ˆˆ³ÉÍÍÕ$ÈMoÖ¬YŒ9’ßüæ7š ‘›”jðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ5xEÄ)©¯ˆˆˆˆˆˆˆˆVðŠˆˆˆˆˆˆˆˆˆ8-%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'åÄ ^#¡s–±lÙ2æDû¶º…aðX¶ì%2´»uOS4ñcCq´l0ñøkËX¶ À¦æŒƒI˜³€eË–ñ·x þñümÙ2–=5Ã/0â6õIDDDDDDDDDn7Ä Þ~“'ÚÿJ¶hÀ+4–ØûÂðu$NmT›rÐ\ŽÍ~æßÛâ‰éy«ßáƒÍìö*J¤¤¼îeÛú$"""""""""7`Ýg µôfòôhŠ^ͤú—:Œ½œ´¤¥-'ÏhÊù&§˜R;@,͹zCo¥O"""""""""rópþom!Éi̘6™éÑE,ͬÆ~‘!ûGLfjl(ý¼pµÖpМEZJæ:OîøóB{„1kIe«ŸçÕlW¢çÎgrí;üéK ž³˜ýü˜¹d5é/òßë|ùÃ’™x­}E™Çñ#¦’ÌÀ/°ÖP’“FJZ>ÕŽŽúŸ@\D0½½\zj’ž–B¦ÙÖÆ>ÿ4î‹ïÌñ¢çÎ'îà›,- er\¦Þ^P[FáºU¤d—csl:˜ø„x"‚{ãå õµÉ[·–ÔìÒŸ·‘kâ†(ÑP——LrQ=½'O'ÚÿB9kA ÏòÜ´(,y¬M^ArºCðDfÍ}ŠÛ<êÈIz‘w¾±B}+^|¤œ³K.Ø(Zþon®’üâ ,Momí°ÓÔ¹<;-ãÁÍ$¯XÁê 12gz(ž?õ)0á̈ s&k“W°ú³Ê}Ø<ëñvô©­ãû™»i*³¦Pž™Âòw’ɲ–ø¦š~šCCSçÌ$Öd§(s5ÉÉkÉ)÷%2qÓCºzDDDDDDDDD®±äÖ\uä'@ØüLœMáÒŒf«c›ñ crLõEËy%©3)Ò|òŠë˜ûl,“c)L-Ç^g¡ÎflÔY,ÔµÒ–½ÎBmm=`£¶i›³gÓ7‚„(?j³^giJé™¶ù…”Úçòll¡ž…d×yèkã`V I)Å?­ŠÍ'§Ô“ųú1ÐË@~½M}jóøš¶÷«'ý…$š—0-L$0ÈÌÕà;ŒÁ^P–¼œU?%”sòÌÔL‹#Àè ZÃ+""""""""rMu¸aFRWHÊX{OdF´«™kC@X)L/¢ùúW{y™UàlÂë vÉFojÈÙ\Ú¬l„òu¯òü Iä×XÈyïU–6%w FüƒB‰Šî‡k;×îñ•e’giö³Í‚fyêºÊë¡wÂt¦F‡èk{9¼Çªœj]="""""""""טáFL]á*V˜˜1qÑ…¯yÖó®žF\±a©={ù« ‹ ðõÅh€‹ñm3£—°QuöBW»ºf‰UC`ññQà劵æ åuí?^»Çg«½ð\[1¼²‚øÉ÷1yQ“k%ù›IK˦T xEDDDDDDDD®)Ã5…«VQ`šÁÄјÓZ>[_g£|½ ´¬á`Ä×È™¬ö+×›z[=`ÄÓ-–Ô<ñõ5Ro©¦Î5”s¦aªÊ"%9™"s5uv0MgÁÓ¦ö:ŸÔ¤|R1âdbpX±1‰</,ÍÆ¢kHDDDDDDDDäšépÃÈVȪò°LdF\@‹§ìUy”ãNhl0ÍofŒ":jÍfj¯`WêæQƒ1Q-2é¾O1ÿ¹§ˆñƒ(A®õ˜S×’S\ýSm]Âpoçñ®ôøŒƒço þLB°a)-$;u9«òê!0_ƒ. ‘ké†LÑÙŠSø o03üëÏOÔå±vsOÇÌàϧ“žW†Ý7˜èû"ñ³±b]³Q®„†š°™/­dÕÙ¤äÅ03fsŒëÈ,²€oq{S_´‚ÍÕ`÷4SM$ÁO'!³ƒ6#ýB£ˆæ€)*Œ ´œŸÊ!\¤Oí_決ˆ:¯Dbf<…ëæE‚Éxéýø`¯¯-ÄnŠeÚ£2-6Ëæ¼²<ÿLÕ†º–¿“N&b&OcZ|ué,}þEVÔàK¤¿¡}jëøÚÈ’MÒ›kÉ« bb">šÈ}¡¾”§¯`é…¨¯ˆˆˆˆˆˆˆˆÈµåÞ¨ig“››«I‘›^MˆˆˆˆˆˆˆˆˆˆsR‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDäÿ³wïQUkãÇ¿£8‚  ‚ˆ &"†  BBŠ—¼åÝ“uNêíò+íµH dÞ$<¡0;‰È›I² çþYx»tƒâlŽnYÏÆ­²­ï´™L ôÆ­›PNqF‘;6•¦lë©›¡K_eVñÇ<÷AÊoÇe^]W'ù2k’?žnÕõJÚ³‘Í19èåû!„Ba–’’Ö®]KZZš²ÌÊÊŠ‡~???i !„BÑâÚÿ jW‚ý»AF$ñZù Q\¤¡®Mˆ^—»ö >>ªƒòd>㟬­îöùgCdjïé,\úÃlMK±ö}'‚ ݺŽu›â1¸ù3ÿùWxõþ¾\ŒÜÌÇ불A-øm[5®3ŸæÑpoH‹bˆÏÙ´=–f-|ä·uê«[­1¯®žóX8Ï…œ¨Í¬ûxÑZüç?Í¥„¥Ï‡3+Ü•¤­9¿g“Ɔµ›IÑWÿ¬÷òe¡¿ØukÙšY½V&¾ }ÔnjJºáê '#z3k7§ü–9›@l¦-+zàÕMMB‰¡îºÝÈܺ:–ùϵDý–Hœ’£Æsù|\û:@Z¾|C„B!ÁÜÍÍÍ­ûoLƒü‘ûî»OK!„B´¨vàÕàî‹uy2Ñ Ñh=i±Ù0Ë—pO i)Íh@íâ+:’"“©™3kȉ&êb8³¼=é¶5ã` ä'’Yc·ÅZ=”ç“XcȈòb-:\°@Kìú·‰Uv¨ÁÙÕïPß>oźfG¯­±¢^‹ÐÈwCˆv¥ªªŠôôt.]ºDUUÕM×·´´ÄÃÃîÝ»w˜6øöÛoÙ·o_­åvvvôìÙ“¾}û2qâÄ?æñãÇùä“Oxì±ÇhSõûè£8yò$jµš?üP¾¼¢C¸Yp×èfŸ·5z½ž}ûöqúôi 0 899ѯ_?î¹ç›\öêÕ«III¡k×®¬Zµª]õ­Uwsê÷GºçÉ}C!„¸¹öàµD¸·0”G—­õ±wø 4) ÍKÖÂVƒz´Å7¦ÌêÑê4jø=-¶®ÔÚrJ&V»2mZ0Þ®®¸t³@W˜ANÉ-¨«¾XÆÚ¢»~ý:|ð©©©fm×¹sgî¿ÿ~‚ƒƒ;tû\¹r…+W®pöìYŽ?ÎóÏ?½½½\8BˆÑØà.Ю‚mEEE¼ñÆ›,ÏÎÎ&;;›˜˜ž|òI|}}å"{^‹HOOçÔ©S„„„t¨B !„­­]xm½Ãð¢œÔ-ëø¡æ„jhè;óQ¦{…ák›@lCR- ¡UÊKô”ãŒC75ä›îÇACuÖ«¡¢ñåÑÅ÷ãy1šÍ6œ–O‰Ô}äõg=Í*ªÕë*„hs¾ÿþ{³ƒ»lܸ‘Aƒ5+ «- ÀÙÙ€üü|Μ9ƒ^¯§°° 6ðÔSOÉ…s›899áîîŽZ-c½‹öÏœà.ÀÈ‘#ÛͱmذA îzzzâëëKUUçÎãÌ™3TTTðùçŸóúë¯cmm-ƒÜóš-##ƒ;wàãã£xå¾!„BÜ\;¾K:àîºx~ˆN©5ÖnΩLÔ‹P_bc~ƒÀÚ¶XÕ¸ãHÃ^ÃÅxrðÆ7ÜMZ’’ñªv &ÔŠ£Ó(nÎIpö¥¯E9i[·«ˆ—¡}1÷ÏåÖ®«¢íIIIiò¶ƒ³gÏ2zôèÕ&#GŽdèÐßßì¸xñ"ï¾û.W®\!11‘œœ\]]åâ¹ æÎ+ :sƒ»ãÆ3é—Ú²ÊÊJ’““èׯK–,A¥RpÏ=÷(Ã\½z•ôôt|||ä‚{žÜ7„BˆÛ¨ýx‡êº£ɨ##UŸEr¹ÞaÃpŽÙO¾¡˜Ôœr‚½ðà´ÍL5ààÊ=èjm]®øúz¢OË §$ž-'ñlØ£üí‘H"ã³18xzOŽºd>ß“Cs’b Ú4ò Â{ÁƒÌŒJ"C¯ÁÃ7˜à¡ÕužÁþôÝûÛ¸¾7ÖíÆ§Ö­«¢í¹~ýz³¶×ë;þ@-...„‡‡óÝwß`ò°›››Ë÷ßOVVz½wwwFMPPI9K–,¡¤¤///þô§?±uëV~ùåœ dܸqJÄܲ_ýu²³³qqqaÉ’%lÚ´IÉÌ|8cÇŽ5Ù—­ÅÜànXXóæÍk7ÇW\\Lyy¹ÒÞØ¯…„„péÒ% úm¦ô5ét:6mÚ¤•ï¼óNfÍšõÛüæ÷aæö5ûö%K–(Ë£¢¢Ø¸q#Ï>û,wÜqGƒíÖZõké{^YY»ví"%%…ÜÜ\lmmquueòäÉxxx(ë­\¹’ôôt¬¬¬X³f *•Š«W¯òÜsÏàááÁ‹/¾@\\Ÿ~ú)ùË_6ë^b¼7½ùæ›øúúòôÓO×yßxùå—)((`À€üéObóæÍœ?žÞ½{3fÌFÅ?þHtt4/^¤W¯^̘1ƒÁƒ7éœÉ½G!D[§n¯Õv Ñb¢£ê XêÓˆN+ÇÛ;˜ çýìÈ/!ድ8,˜GxøC<ZLvZ<›?ˆÄñ“8(¸E¢÷4Âz×ÏÿÉ %dn]Á9³˜Ȭ‡Â±Ð’¼÷7ï'­¤™‡S˺]¸ÞhÂf ¥¼ø"I‘¬~9ƒ¾óž`V`8AGãÉ̬«n7fhݺ !D;åçç§<ìæçç+ËÏœ9ÃÇLYY™²,%%…””ÒÓÓùÓŸþTgpçý÷ß§¨¨€ÌÌL233ÉËËãhVÙׯ_gÕªU&£#GŽ ÕjY¼x±hÉÉÉáÝwßåÚµkJvïÞMÏž=ë<þÖ¬K~~>o¿ý¶ÉX¹¹¹äææræÌ^|ñÅ_­5§n111üïÿþ¯ÉöÆ1AO:ųÏ>KçÎå‚MríÚ5ºvíÚðŸmMîÞwß}íªlmméÔ©•••;v gPEò IDATggFŒ¡ гgOžxâ‰ZÛ5¥/0 ¬Y³†ŒŒ eÙ¡C‡¸~ý:<òH“ú sûÇ–ÐÖêWß=¯¤¤„·ÞzËdYii)—.]"11‘ 0fÌ Dzz:¥¥¥äååÑ«W/²²²LúÞŠŠ :wîLff¦²|РAfßKìììèÚµ«Ò&öööØÙÙÝô8 xçw(--à×_å×_åĉœ8qBY/33“>ø€W^yEig¹÷!„èHÚi€×@ÎÖe<³µ¡uô$­]Â3&‹ÒØ¿~ûoX3iÉ3¦¥çD±~ET­}æÇnæƒØÍ ìSKÔŠgˆºq»¯ñÌŽJËÜÈ‹5v[’²ƒµ¯í¨UbÎú׈¹IÝêÜg“ê Røà™gä›!„èpjN2SPPTgžmÚ´‰²²2zôèÁ‚ °¶¶f÷îÝ$&&òã?2räH“Œ&€¼¼<ºvíÊÌ™3©ªª"""½^ÏáÇ ¥OŸ>M.ûÊ•+¨T*î½÷^***Ø·o¥¥¥œ={VyÀøî»ï”a D|||Cv´v]¶lÙ¢tÆŽËÀIHHàèÑ£dggsàÀ&L˜Pçy1·nßÿ½€š7o–––;vŒ¸¸8ÒÒÒ8qâDƒ3Ï QŸÈÈHöìÙÃâÅ‹qss«s?Bpª'á áСCTTT°}ûv¶oߎ‹‹ îîîôïߟ;ï¼³ÖøíMé JKK),,dúôé”——³oß> ±±±,X°Fcv?aNÿØÚbýêºçlݺU î2„Q£FqéÒ%vîÜIyy9ß~û-wÞy'vvv 4ˆ={öÕããöêÕË$k0ÈÍÍÅÍÍMYîääTëºh̽äá‡æÇä믿àñǧÿþ7=Îââb<<<àäÉ“¤¥¥pâÄ î¸ã|||ˆ‹‹#++‹ŠŠ Ž?Δ)SäÞ#„¢Ãé$M „âÀÒÒRÉ»rå P©“——À”)Sðññ¡_¿~<úè£XXXpàÀ:Ëûÿïÿ1iÒ$î¹ç{ì1eùáÇ›U¶J¥bÉ’%Lž<™iÓ¦1yòdå3ãCy~~>§OŸÀ××—Ç{ŒÐÐP-ZTg`ª5ërõêUª_' `þüù 6Œx@yõÖX׺˜S7½^¯œ»^½zqçwâççǃ>ȨQ£5j:ÉŸ6Â|‘‘‘|óÍ7\½z•U«V‘]k?Jp×hîܹL˜0AùBõخǎcÓ¦M,]º”/¾øBÉœlN_°páB¦L™ÂŒ3¸ë®»Lögn?anÿØÚbýêºçéõz¢££pwwçé§ŸføðáLš4‰?ÿùÏ@uÀ=&¦:½dÀ€JéééJ¦µƒCõû™™™TUU)™½7fï6ö^Òœãüïÿþo&L˜ÀO<¡¼YbggÇ¢E‹˜8q¢I&¸qh¹÷!„èhd*R!„eee Õƒú3›ŒÁ€;v°{÷nå÷ÊÊJå°&<==•ß½½½±±±áêÕ«ÊúÍ)ÛÉÉIùÝÅÅÅä.\¸ ,9r¤ò@Û¹sgFŒQ+8Õšu©™VslCKKK^zé%ôz}ƒ¯­šS7KKK¬­­Ñétœ;wŽ%K–àíí¯¯/3fÌ0ÉX¢±öíÛÇ·ß~«ü~íÚ5Þ}÷]/^Œ»»;ðÇ î¿o³gÏfÚ´iœ={–´´4ÒÓÓIMMU¾›111ØØØ0{öì&÷VVVJ;&ÃƒÇæôæö-¡-Ö¯®{^Í`j`` ÉØÊ|öÙgTUU)Çcaa§§')))J`ט©ÂöíÛÉÌÌÄËËKÏßÛÛ»I÷’¦rrrRÆj¶µµÅ‚²²2\]]•àt͌⪪*¹÷!„è$À+„âÁ˜}УG´Z­²¬æÏ5³}jºq\@ãøW¯^UöÓÔ²oŸòÆÉ._¾¬ü|ãƒe]š­Y—šåÝ8v©1ë!æÔ­sçÎ<öØc|ùå—RVVÆÉ“'9yò$P=æä_þò—›Ž¡*„ÑÁ]#NÇêÕ«Y¼x1Ý»w7+¸ÚäànEEyyytîܹÎÉÍnKKK|}}ñõõª3ucbb”ñ]?ÎìÙ³›Ü¨Õj“ã¼Y?s³~ÂÜþ±%´ÅúÕuÏkhßjµJJJ(,,T–4ˆ””²³³Ñjµ\¾|ggg¼½½Ù¾};YYY&Ã6Ô5]cî%MUß?o6®Ü{„Bt4àBñ‡Ps²cö­­­²ìõ×_W&2çÁª3‚ŒËºwïÞ¬²£f€ùƺԜÜÈèVÕåêÕ«foonݼ½½Y¾|9çÎ#!!„„¥ Nœ8µµ5>ø \ðâ¦ê ¶¶¶&Ù~ eÁ‚Mª1hjü988ðÀàããsËÛ&%%…o¾ù€qãÆ1zôhå3&L˜À±cÇÈÊÊ¢¤¤¤Eú‚–ê'ÌíoìËk2fÀ¶•ú5÷žg¼?Ê$¡5ÕxÞj®gr¡¢¢‚Ÿ~ú ÜÜÜP©Tœ?^¾ÁÍÍMŽ£­“{BˆŽF BÑá©üîïï`ò@Wsfp¨~ 5--óçÏ×*O«Õ*¹@õLÜÆcãëÅM-»1Œ“›üüóÏJPÂ8ãýZ³.5_»MJJR~®¨¨`åÊ•¼ð |üñÇõnoNÝ~ùå¾úê+6mÚ„ƒƒ÷Ýwo¾ù&‹/¦K—.ÀïãD Ѩ¨¨ƒ»F:î–wwíÚÅ_|aÕjµ|øá‡&}Í­âàà@vv6ÙÙÙüøã”——›|~íÚ5%»±wïÞ-Ò4Äœ~ÂÜþª³”¡:cÓøz>ÀÙ³gÛDýZãžkЮù{Í:º»»+C Ô ðZZZÒ«W/ ƒRﺆgh«äÞ#„¢£‘ ^!„Nll¬2ñKAA§NB§ÓÕ¯R^ŒW®\aË–-XYYѵkWRRR”³§M›FŸ>}jíã£>bâĉTVV¡, mvÙ7Ó«W/¼¼¼HMM%11‘uëÖ)³Õßø ÚÚu±³³ÃÇLJӧOsòäI6nÜÈÀ‰‹‹SxûõëWïöæÔ­S§Nm¦.sæÌ‘à®B!„hq’Á+„¢C©¨¨àèÑ£=z”ììlôz=¶¶¶ 0€»îº ooïZÛ<õÔSŒ5Šxà¦å¿üò˰råÊfeD·–óçϳ|ùr|ðAFÝ¡ÎmG>6Ñz¼¼¼ÚL]6lØ€³³3}ûömm§ÕjÙºu+¿þú+ÅÅÅôìÙ“   î¾ûn:wîÜbûéH}pMk×®%--wÞy§Ý}oÌ9'B!„¸ý$ƒW!D‡qåÊÞzë-¾øâ ²²²èÛ·/ÁÁÁôèуÄÄDÞ{ï=>ûì3 C“÷ammM×®]Q©T­r YYYìØ±ƒ+W®È ¢ôèу^½zµ‰ºèõzÞ{ï=²²²ÚEúÚk¯qüøq¼½½™8q"VVV|óÍ7|òÉ'·m˜郅B!j“ ^!„Byy9ï¿ÿ>çÏŸg̘1Ì;KKKåó¢¢"Ö¯_ÏÏ?ÿŒZ­æÏþs“ö³téÒV=ެ¬,vî܉ŸŸvvvrb…h#GŽdëÖ­m¢.:ŽÕ«WóÜsÏ5k"ÍÖ¶sçNôz=O?ý4¾¾¾L™2…7rèÐ!Nž<‰ŸŸß-¯—ôÁB!„µI€W!n±ÊÊJöìÙÑ#G(..V² ÊÊÊLÖ{ûí·• %FÃwÜÁܹséÖ­[­2£¢¢8pà—/_VÊ+//7Yçþçøüóϰ´´¤ÿþÌ›7''§Zå•””°iÓ&Ξ=Ëõë×Ú“ª]»v…  R©°³³cäÈ‘ÜsÏ=têtë_ùñÇ9þ···gñâżñÆüôÓOÓ¿¹ …øf×®]µúÙÛE§Ó±jÕ*ž{î9\]]Ûd›;wŽž={2dÈe™J¥b„ :tˆ³gÏÞ–¯B!„¨M¼Bq‹íÞ½›;vÜt½šÚ²²2bcc)((à…^0y5õÈ‘#lܸñ¦åÕ– ¬¬ŒÄÄDrrrxõÕW±²²R>«ªªâ£>â×_½i™5ƒ%ùùùlß¾ªª*¦NzKÛ´ªªŠƒbiiɽ÷Þ[ïz:uböìÙ¬Y³†¨¨¨ZÞ3gΰgϲ²²°··gðàÁ̘1ä}êS±¤¤„mÛ¶‘ššŠV«¥GŒ9’ñãÇ×§2;;›ï¿ÿžŒŒ }úôaêÔ© 8Õ«W“’’ÀòåËqsscÙ²eõObb"{÷î%;;;;;† ÂðáÃë\·±u\¸p!“&MbÀ€DDDžžŽ½½=¾¾¾LŸ> ‹&•»víZŠŠŠxòÉ'Ù¼y3§OŸ ÿþÌ™3‡Þ½{·ú±™[‡†ÎÕÞ½{ùî»ïxþùç0`€Év¯½öz½ž+V´ÚkäÂ<¶¶¶„††²oß¾6S§k×®qüøñ6à­ªªB­V3pàÀZ×pee¥Rÿ›ÉËËcëÖ­dee¡×ëquuå®»î"((¨ÎïF[íƒËÊÊØ·o±±±bmm——3f̨óŸ¤u믿þš´´4t:ÒçÜxˆ 77—ÒÒRºwŸS§N¥K—.¬_¿žØØX–/_^kßï¼óééé¼ýöÛX[[›Õ.õiÌ91÷´VŸ-„Bü‘uîÝ»÷?¤„íÍc=Önë¾~ýz%+Ö\EEEøûû›dñ~õÕW\¾|¹Iåéõz<<<èÙ³§²ìÂ… lÛ¶­ÉÇ—ŸŸÏøñãoi›jµZvî܉——aaa ®Û£G"""())!<<¨ºëõz¢¢¢ðôôdذaèt:bccILL$88XÉJŽ‹‹C«Õ2aÂeßË—/'''???|||(..&::šÌÌL•@FJJ ï¾û.¥¥¥Œ1‚þýû“’’BTTƒfÈ!XZZ’žžÎ‚  ©w¡C‡±~ýz*** ÄÉɉ¸¸8ÑétøùùѧO³ë¸gÏÊËˉˆˆ wïÞøúúríÚ5bccINNfôèÑʺæ”GQQ111ØØØ‚½½=qqqœ8q‚»ï¾[iãÖ:6sêp³sÕ¯_?öïßO—.]ðññ1 íܹ“±cÇ2hÐ é¬Û~ýúÝf²xÇǬY³Úd[©T*BCCM²w8@jj*!!!ôëׯÞ2~ýõWV®\©Ü·HNN‡¢´´”Áƒ+ë¶õ>ø³Ï>ãÇÄÍÍ#F`iiÉÉ“'9yò$cÆŒ©÷­•¸¸8òòòˆÇÆÆ†   ¥Ï9yò$cÇŽU¶=sæ ï¿ÿ>jµšQ£F1`Àt:ÇŽC«Õâï…±±±tïÞÝäŸKEEElÚ´‰áÇdV»ÔÅœsbξZ«ÏB!þè$ƒW!n±¢¢¢fm¯ÕjM²~š[^aaa‹Ö¯¨¨ˆÊÊÊ[úÐe p× T7¸pqq!;;Û¤ž/^äá‡&((€‰'²eËöîÝËáǹûî»ë,ï»ï¾£²²’eË–áèèTSiÜöĉ 6ŒÊÊJ6mÚ„ /½ô666„……ñÊ+¯°wï^žxâ eò¥þýû+AÌét:¶nÝŠ££#/¾ø"¶¶¶Lš4‰+V4¹ŽF©©©,X°€ÐÐP :›ï›o¾aÿþý=z”Q£F5©ÜÜÜ\ÂÃÙ;wîÕìÛ· .àîîÞêÇÖ˜:4ö\õë×øøxæÎ«$Ž= Tù*ÚKKKzõêEIIÉm¯Ë×`{PUUÅÞ½{ÙµköööJ?Pߺ_ý5;wféÒ¥J¦é”)SøðÉŒŒ$$$ĤÏn«}pYYqqqøûûóøã+ûˆˆP²mëë«JKK:t(³gÏV–uêÔ‰——§ÜÏþùg,,,øûßÿN×®]•v|ï½÷8s挲­··7ÖÖÖ?~\ rCu0`ôèÑMêëÒØsbξZ£ÏB!È¿<…¢¹q,ÜÛ5“¹9ulmÊC_ctéÒ•J¥¼j àââB`` ò»J¥bêÔ©XZZrêÔ©z÷¿¿?N‡N§C¯×3fÌåÁ<77— .¦ zlàxooïF¯ñ5ßI“&)P;;;Æ×ä:9::r×]w™´Å´iÓ°°°àĉM.ªµ5ÎY•­}l©CcÏU@@—/_&==]¹îcccéß¿?ÎÎÎÒYµ!|òÉ'œ;wî¶×eüøñí.¸›››ËªU«Ø²e ööö,Z´FSïúW®\!33“àà`“aÔj5S¦L¡ªªŠ¤¤$“mÚjÜ©S'T*™™™äçç+Ë'NœÈªU« îÕ ÄÖìsJKK•eóæÍã_ÿú—Ü5ö)¥¥¥&Yçjµš€€222ÐjµÊòØØX4hP“ûÆ5朘³¯Öê³…B!¼B!:ãLç/^¼éºUUUäææâââbvss«õºª••...&õ5PYYÉáÇ9|øpë³u«k¼ÍšÐa¬O]…³™Ì©£QŸ>}je`k4œ•}7¥\Fc´5 nå±5¦=W|ûí·?~œþýûsîÜ9ŠŠŠnùÔ¢aÆà®ñŸ·Óøñã™3gN»i»ÊÊJ"##Ù¶m•••„„„0{öl¬­­Ü®   ÞïqÜÔûÕ¶Ú«ÕjæÏŸÏæÍ›Y¶lîîîxyy1dÈî¸ãŽ›Že[WŸS×.666\¾|™ãÇ“Íùóçùå—_ÐétXZZÖªïálj'<<œ‚‚233™2e *•ªI}c]sNÌÙWkõÙB!„¯BˆÀÅÅÒÓÓ)--­5ùKM.\àÚµkµ²²²Öõ‘1s8$$¤Þ1Ë8É]K<˜6P¸±|sêØPðÁ¸_cÆYSÊmL†uk[cêÐØsåàà@ÿþý‰gΜ9ÄÆÆ*Ùu¢mhKÁÝI“&1sæÌvÓvUUU¬_¿ž¸¸8ÜÝÝy衇ZdB8ãwÜøým}pXXC‡åĉ$''ÃþýûéÙ³'‹-R†¨óa«‘o–9r„ 6`ii‰C† aòäÉDFFÖÊvöòòÂÞÞžãÇ^kx†¦ôæ¨yNÌÙWkõÙB!„¯Bˆ@¥RLDD»wï®7ˆRUUŦM›jçxþüyªªªLþu:/^dèСu–g|õ¸¢¢‚;î¸Ãä³²²2~ùåå5f zVy___“ucccÉÎÎntðÇøúVVV­IŽÎŸ?ßä:]¸p¡V[”––’——§Æ›Rn[8¶Æhì¹R©TŒ1‚M›6‘––ÆñãǹóÎ;ošÝ(n¶ÜU©TÌ™3G™Ô±½ˆˆˆ ..Ž   xàzƒ¬ õ999µ>3.»qÌô¶Úët: qttdìØ±Œ;ƒÁ@tt47nä‡~àþûïoV[ ¾úê+† Âc=fòO¶ºá*•ŠáÇIQQ±±±ÜqÇôèÑ£EûÆÆœsöÕZ}¶B!:м¶‹Y³f kÖüÑÍ(Ç3”iã|QŠP{òÈ;kXóúL\¯c›Zå6™3Ó^YÃ;OxJt^!j˜4i=zô ""‚íÛ·×z(¾zõ*Ÿ~ú)gÏž%$$///“Ïóó󉉉Q~¯ªªbÛ¶m †z3Œ™VÇŽ#77×ä³~ø÷Þ{+W®Õ¯;88pàÀt:ÉÃò·ß~KjjªÉCtCã0"""L^g-))aÿþýM®£Q^^ÇŽ3©ËŽ;(++ãÎ;ïlr¹ÑÚÇÖæœ+ãÌö6l@¯×78ñ”¸uÚJp×ÎÎŽÿþïÿnwÁÝŠŠ 8€½½=>ø YÁ]ãq»»»m2‘§Á``ÇŽ¨T*† Ò.úàÜÜ\–/_ÎîÝ»ÿS_­V&«9–{SiµZJKKqqq1 î^¸päädªªªjÝŒm²k×..\¸@ppp‹÷9'æì«µúl!„Bt˜ ^|C=~ûÙ0_b¢´MjŽn¾á„§‘•„Ö '?-ƒ }zCc˹q›ºÊBÑ’¬­­yæ™gøðÃÙµkÇ×Gn IDATÑÑÑxxxààà@^^éééèõz†ʼyójmß¿¾üòKNŸ>‹‹ çÎ#--ÁƒãççWï~çÎËÊ•+Y±b£FÂÆÆ†sçΑššJPP’…jÇqíÚµ¼þúë >KKKŽ;Fqq1>ú¨²Àðóó«sß]ºtaæÌ™|ùå—¼þúëЩS'âââpqq1™xÇœ:ÙÛÛóÙgŸ‘˜˜ˆ³³3iiiœ={“¦¹å6Fk[£þhä¹2¶•——©©©ØÚÚ2xð`ù2Þfæw½¼¼˜1cß}÷¿þúk‹ÔA¥R¬Y³ÚeFw^^W®\ÁÅÅ… 6Ô¹ÎÀ9rd½Ç?þ|V¯^ÍòåË B£Ñ˜˜Hvv6ãÇWÆâmë}°={ödß¾}\½z•ž={RPPÀéÓ§éܹs‹üS§G8::É¥K—èÕ«/^äĉôèу .ðÕW_qï½÷*C¸»»ãääÄ¡C‡èÒ¥‹pnɾ±±çÄœ}µFŸ-„BˆŽàuF¸üœ$߇ Æ9jù-Q¶!‡kW·þ6B!š;pvfÙ²eüôÓOÄÅÅqîÜ9®_¿Ž wÜq£GfèСuŽÁ8|øp&L˜Àþýû9uê=zô`êÔ©Lž<¹Á1{õêÅ«¯¾Êwß}Ç©S§())ÁÉɉùóçj²­ŸŸÏ?ÿ<;vì &&†ÊÊJúôéßÿüg%£xÈ!øúúrüøq ë l„„„`ggGDDGŽÁÖÖf̘Á¢E‹š\Gؽ{7‰‰‰tïÞñãÇ3}út“1rÍ-·±ZóØ«1çªæµc NÜlÂ%ѺšÜ]¸p!VVV<ÿüóœ"))‰É“'+Û¨T*Ùµk#FŒ¨•eÝ}ccω9ûj­>[!„ø£STµïCPã:óUžÓ³åŸo‘k3iÚ05WOÚÁdʽ½ öÔ¤Dxmñó€âƒDeÜ"-©³Ü‡ Ãà ö¶%V‰ð:3,Ø.n!!¿ñ§°ïÌçy6Ì…âäƒl‰ÌÀ`ëMè=ÓY¸Ô‹ÏW¬%¡¤úø-XÊ“A²îaÃŽ4^ÁL{ö‰ßŽL!DcÔ»QƒÁÀO?ý„›››wo£– îBõx­®®®Ü{ï½  ¸|ù2ׯ_§²²+++lllprrÂÆÆFN€ôÁB!„·U»ðª=ÂÖ­œäÍI”h“8˜=‹ù¾ax¨¿ Íoudf°#ÅÑ«X½ù·ÀoB™†¥<> _Û$bJ´”è €ž­–’:ÒYõiQ$—Å;¸/š¤”êÀ¨ƒ/¡P¸=šœ:¶1ÔUnþQ à öÄ66¡ºîξ»@ö¦x‹gëϬ0Ê“×ñÖÚßÚ€âSJXú|8³Â]IÚšƒÁy4³‚ºQxð-VoÍùíøãIÖ/å¥pk ð q i4ôz}³¶¯ÉÚÚºY¼]ºtiðwsYZZšLÓQräÈÒÒÒèÓ§\È‚M›6‘••…V«eúôéÒ ·IKwký­©VÓ«W/zõê%-}°B!D›ÔΟÀ5x†ûb]žLtFuÐC£Ñ“› Ö¾„{þÑôõÇBbÖÌê5³çm^þ§1˵ D%é°ð £ïoÅ;ø†áF6‘ æŒú›ÏÑ„BðÃÓ¶z‰sP0Žd™TÒèRÔ.þ¸¢#)2™š[r¢‰ºݼ=éØzøãÂE¢£rLŽ??:Š‹ò=â–jÎ$LÖÖÖµl›S^çÎ8p É277·fe¤ 4¨CŽ¡—‘‘Áž={èÓ§ , Ypúôirrr˜MJz@ÓMè¹xcÒœAO‰Y‰o2&¡ó÷'¬¯†” ¾Á.ñ9If&Ðåým˜O I:BêVRßÅÂVƒz´Å7¦ëÑê4jP»h€’êe&«i)Æt !Dëš7oyyyää䘵F£á‘G©•a;uêTÒÓÓIMM5ï V³`ÁœœœL–[YYñðónÝ:³_…uuuí°Þtøëóý÷ß—/i#½öÚkÒm€wÿþ(}°B!DS´ë¯­w^”“ºe?˜Œ ¡ïÌG™î†¯m±%P®/4ØVÇ9k´€-ʵùuÉPCN4 ÅA†õÅVëJ¨K9ÉëR(1÷j Óàr’7¤™5\By‰žrœq覆|Ó6pÐz-z”ê ¿Å¹MŽ_#ß!n){{{–.]JFFEEETUÝ|®KFC¿~ýèÚµk­Ï¬¬¬xî¹çÈÈÈ °°°QåYZZâáá]ŸûøøðÆožžÞ¨ ¯J¥ÂÞÞž~ýúuØÉÕ„í—w…B!DGÖŽ¼ø‡{€.ž¢S~k÷79?¤2ýQ/B}ˆÑR’O!Ó v%jëïÃ8>Á«ó5D¾ñ;;‚!‡èøb‚ƒÃ sÀQ—ÄÆä¦Œ§Y=LCxx8¡“œéVžÄiæ•c¸OÞø†{£IKRb·j×`B] 8:bÀ–B!ᄆº]ãøÃp å» Ä­í|Õj<==[¬<•JE¿~ýèׯ_‹•immœ,!D»&Á]!„BÑѵß1x‡êº¤ƒdÔ;¸… à ?†ÍñÅt [Ìâã6ŒÀqðô|7Ê“wpP î–ƒ…+¾¾ž¸ÚÖÿ6K¡…Óƒ)Nˆ¬³¦ê.W{4B<j.þ`#ʹAI<[báý({d£‡ #pÜ/ÇQ—Ì–=¿só²5Q‡cØb/%pX ¡óžfa¸šb娄B!: î !„Bˆ?‚vàUã†#Å$˜LVƒ>è´rp &È@OÊ+Xµ% ƒg8÷?ô÷‡» =ø9o­Kømxc£H¼è@ØCO0Ó³Á ò]PHìÁœ›Gë/× =JB!@1 Ñ9M²Èܺ‚76D£u dÖCq¸'$oçý5'+!iý ÞLÃÂ{÷?4“`‡6¯þ‚¤b@'_!„BtÜB!„ª€€€*i†ÛÉ–a‹—óÃAÞúçVrZ1V­VƒÁ`DÖ â‰•O¢ùüeV'”ÈéíF\\œ4‚B¾ýöÛ:ÿæ¹çž{$¸+„B!þÔÒ·™­/aP¸=ºUƒ»8„òü«³`Ë?Y¥UkúãI!Ñùz9B!„hwæÌ™# „B!þÐ$À{ÛZÞ™a¾x݃lˆÍoÝýiãÙ“<‡f=Á‚ò-DçèæÈ´ùC±ÈØDTŽŒÀ+„B!„B!D{#ÞÛÅÂ… iÓñ¶Èæèç_Ûê£#”°î-˜6iÓž$ÈÊ‹ ɉߪÍ1håŒ!„B!„BÑîȼBˆvIÆàB!„B!„€NÒB!Dµ5kÖðòË/·Xy/¿ü2?þ8—/_¾íǶvíZ–,YÒîê­ÕjY¿~=/½ô .ä7Þ 22’ŠŠŠÝÏSO=Åÿýßÿµ»öâV;þD!„ ƒW!„hYYYìܹ???ìììXºti»<–¶Rï;w¢×ëyúé§ñõõ`Ê”)lܸ‘C‡qòäIüüü:\ûÔu- ÑQäçWO,D!„ ¼B!„h£Î;GÏž=2dˆ²L¥R1aÂΞ=+$D;c̼·°°èÇSZZʇ~È®]»())‘¶B!Äm!¼B!:„µk×R\\Ì“O>ÉW_}Ebb"+W®ÄÆÆ†’’¶mÛFjj*Z­–=z0räHÆOçÎ,711‘ˆˆrss)--¥{÷îøùù1uêTºtéÀêÕ«III`ùò帹¹±lÙ2Ö®]KZZï¼óŽR^^^[·n%++ ½^««+wÝuAAA&¯ü¯]»–¢¢"ž|òI6oÞÌéÓ§èß¿?sæÌ¡wïÞʺeeeìÛ·ØØX ±¶¶ÆËË‹3fàäädr<×®]ã믿&-- N§”çêêj²ïšõ^¸p!“&MbÀ€DDDžžŽ½½=¾¾¾LŸ>Ý$Ø`N]nÈP«Õ 8°ÖP•••ʱÜLcÛÛèÌ™3ìÙ³‡¬¬,ìíí}ÌúôìÙRSS™;w.cÇŽÅÑÑ‘ôôtNŸ>͸qã°¶¶6«ÿ3çûgÎ15–J¥B­V£V«1 ìÛ·eX™›il?U_Ûݨ¡ûQcïæ´i||ë«Ü¤Õ»M‡……1tèPNœ8Arr2111ìß¿Ÿž={²hÑ"åõÔÆ–W—úÁ;w6Éþml]£ªªŠõëׇ»»;=ôÐÿgïÎ㪬óÿÿ?ŠB² "Ѝ(¡²¸¤2hšKj¦e‹mc«ÎǦYZÌïLŽ5Ó”ÍÔô³Io5cj™¦…šh. ˆŠ©(˜¢ì *èAößƉ£ ôØã~»uËk¿_×u®Ëóò}^×UËH\o¼ëSUUUoBß’k¬¢¢Â¢$GcÎ1Д÷¤º\~ý^ï}¶Þ/) ¸_YrlKút3ƒ†Þ§nDL›‹¥ÏÞ¦~ö`HðnY5?y­¬¬T¯^½Ì–•••éèÑ£õþÌ¿¢¢B+V¬P`` fΜi–àlÌîš¶dee]±¬fÞÕjÖÇh4ª  @îîŒTdd¤***´cÇ-_¾\ëׯ׃>xݱÌÎÎVuuµY"¤´´T¹¹¹êÝ»w³´eÆ JJJRXX˜zè!‹FM7&Þ'Ož¼¢F£Qyyyêׯßu_c^^^’¤ÜÜÜ+^À” ÌÌLMš4é†c FÍÏêOœ8qÅ‹ Ož<Ùd÷Ù–¼Ç[Ò§–~F5õsáF=7›BS<{ot¸¨Á ¸eÕŒþILLTNNŽÙ²õë×ëÝwßÕ¹sçêܶ°°P¥¥¥òòò2û‚™­C‡©ººZÕÕÕWlW×<éRG___íØ±Cf_f£££ecc£ÀÀ@‹û˜““£ùóç+&&Æ4Ï`0˜^SUUÕ$±ÌÍÍUbb¢Y?£££UVV¦Ûo¿½ÉÛRYY©Í›7ËÅÅE3f̰¸$Fc⟟¯¸¸8³>®]»Võ޳äóññ‘›››6oÞ,£ÑhZÏh4jÕªUJKK3K.×\K-uŽ=zô“““6lØ`öSöââbmÚ´©Éî³-y·¤O-¥¹ž ×z5×s³)4öÙ{3õ€¼€[Ú}÷ݧ7ß|S ,PDD„œœœtäÈ¥¥¥),,슑\5<<<äîî®ØØX>}ZÞÞÞÊËËÓÞ½{åáá¡ììl­X±B÷ÜsÚ¶mkúéëæÍ›¬àà`³ýÙØØhÚ´iZ¸p¡æÏŸ¯°°09::*%%E™™™9r¤©æ¢%|}}Õ¡CmܸQçÏŸW‡têÔ)8p@vvvŠˆˆh’8º¸¸èã?VJJŠ<==•žž®Ã‡«k×®¦c4´-{öìÑÒ¥K5pà@=ðÀu/77WçΓ———–-[Vç:={ö4½µýr‰w÷îݵtéR8p@^^^:räˆÒÓÓÕ§OŸ+Îgc®±šZº‹-Ò믿®ÈÁÁA‰‰‰***Ò“O>iZ¯öµÔ·oß9Ç@Ö­[kÒ¤IZºt©^ýuõïß_¶¶¶JJJ’——— ›ä>Û’÷xKûTsŸ ÑC=Ô,mo®çµžGÍõÜl –>{oÆ>p#àÜÒ¼½½5oÞ<­^½Z?üðƒŠ‹‹Õ¾}{M›6MÆ «·ö¢­­­fÏž­U«VéàÁƒJMMU—.]4gι»»ëƒ>Ðþýûu÷ÝwK’¤Ý»w«   Î/Ô~~~zå•W´fÍíÙ³G/^TÇŽõøã_õ%[Wcoo¯Ù³g+::Z©©©JHH“““|}}5zôhùùù5Iûöí«þýû+&&F)))ruuÕÈ‘#5aÂS­È†¶¥¢¢B.\0«Ý{¹šÑlyyy¦—“ÕuŽêKð6&Þ ШQ£´iÓ&ýðÃòððиqãt÷Ýw_µF§%×Xpp°~ÿûß+::ZqqqªªªRçÎõðÃËßß¿Þk©%Î1PÛ!CÔ®];mذAñññrvvVHHˆ&Nœ¨Ù³g7É}¶¥ïñ–ô©!÷©¦ÐÏ…†<šã¹Ù,}öÞŒ}àF°éß¿5a`m’’’ÐBfÍš¥ê‘G!’-Z¤ôôtýýï'À-ìðáÃÚ¹s§f̘A0ÀM¼¨]?À­+33SÞÞÞÜôHð4@AA¾þúk¥§§ËÝÝ€·°#GŽèäÉ“:t(Á7=jð4ÀñãǵnÝ:uîÜYÓ§O' À-¬gÏžêÙ³'V¼¬5x(ÑV‹/X)¼`¥Hð€•"Á VŠ/X)¼`¥Hð€•"Á VŠ/X)¼€[¢E‹ôâ‹/ZeÛŸ{î9}úé§·äy9yò¤žzê)ÅÅÅ5zß|ó^xáýá$}òÉ'zê©§”˜˜h•}*,,Ô’%KôÊ+¯hÖ¬YúË_þ¢ØØXUVV6y[kb7wî\n¸eýãÿЫ¯¾J À/ ^pÓÊÌÌÔW_}¥:hòäÉ’¤V­Z©mÛ¶2 VןsçÎéÏþ³vïÞ­€€Ýu×]jÕª•¾øâ ýûßÿVuuu³Änܸq\L°È‰'­sçÎÑO€›œÁšï6ìeÍ›ìuÅ|cÞqeOVlôV¥7g <5þµW4,ÿ=ýqQº*nÑ‹ÄÙo˜†w)ÔŽMûUÈgЂòóó%IãÇW@@€$éÐ<`•ýùúë¯URR¢çŸ^AAA’¤±cÇjùòåÚ¶m›öíÛ§àààf‹ÐP'NœÐ×_­àà`µk׎~ÜÄ Öß…r¥Å~©„fV¦ IDAT¼KéUƒ³ºvõSHØd„éË¿-ÒÖü Îôu\"·E)jpºmݯBB hA5#Zííío‰þ9rD:tP`` ižF¥mÛ¶éðáÃM–à½Õb n·@‚·H»â”ÿóœ8IkºŒ×ó/Diò“ÃthÁ&ås®àáÂ… úì³Ï”žž.£Ñ¨îÝ»kÊ”)òññ1[/%%E6lPNNŽJKKåêêªàà`7N­[·–$-Y²D š?¾Ú·oo¶ýßÿþw;vLo½õ–Ú´i£ââb­]»Viii*,,”‡‡‡ÂÃÃ5räHÙÙÙ5¨íÔºuëtâÄ ¹¸¸¨OŸ>š8q¢Zµje¶ž%Çj躋-ÒÙ³gõÌ3ÏhåÊ•:pà€$™â×±cÇk¶?%%Eß~û­233Õ®];jÀ€u®Ûv}ôÑGJJJ’$½õÖ[rqqÑ_ÿúWmÚ´I+W®Ô‚ äîînqÛ-‰Ÿ%}º–êêj õìÙS666f˪ªªL×ïµäææjÍš5:qâ„JJJäã㣡C‡*,,Ì´ßúb4ÄÂ… •šš*Iš?¾:uêdªãÜÐÏÏG}¤‚‚ýú׿Ö矮£GªM›6 Õ¸qã”””¤7*''GíÚµÓØ±caÚ~Ö¬Y=z´zôè¡ 6èØ±crqqQPP&L˜p͸hÈ=¾)úYVV¦7*!!AjÓ¦üýý5qâÄ+žÍÅ®cÇŽÿÏZïØu¨†ØêÇí[uä²ïCçŽ(Ý>Twöë%»C[uà\•i™³ß¯ôðŒ‡5õÉš5XATœñ£òK~ZÇùýî­uXþ€¾ÿ~M›8B¡TžsD'ÏÕ cm«^ÃîT× ŠM*Ô¥­ ò ¢Çfܯ©S&jì°Pt5ètú1–]ÚÊsükZð\ˆ wìTVÙÏmvö²Þ|a„Ê“·êØ7 {ùM=Ý9]©Ž£õä3ôÀäQ òVyÆõ£Çg>¬‡§LÔ˜ÁAr;›ªý¹% ï£~Þÿ~ ÓÃ3ÔýÓ&jÔà y—fèÈÉbUÈYƒ~÷W=Õ¯•dç­°»Æ(¨h‡âN–In½5~úczøÁiš8vŒ¢È£4Gé'ωA¾h 3gÎ$0“””¤ÜÜ\%''ËÉÉIaaarqqQRR’öíÛ§ÈÈHÙÚ^*=ðàA½÷Þ{2 ŠˆˆP=d4•˜˜¨ÂÂB…„„Hº4ò1!!A®®®êÑ£‡éXgÏžÕ矮(,,L………š?¾²²²¬¾}ûª¨¨H;vìPFF†BCC¯HèÕ£’’mݺU~~~ºãŽ;d4• ”” <ØÔvKŽeɺIII:{ö¬âââäää¤!C†˜â·wï^1ÂÔ†ºlÛ¶MK–,Qee¥BCCÕ¾}{%%%)%%EF£QÁÁÁêܹ³EíêСƒœœœ”––¦ûî»O‘‘‘rww×±cÇtàÀýêW¿R›6m,j»%1±¤O acc£aƙޭ±yóf¥¥¥iÈ!êÖ­[½ûøñÇõæ›oêìÙ³ QÏž=•••¥mÛ¶©´´T}úô‘¤zc4„tìØ1MŸ>]C† ‘«««EŸŸäädåææ*>>^Ý»wWHHˆrrr”˜˜¨Ã‡+!!Aƒ RïÞ½uøða%&&jÀ€rrr’$­[·NåååÚ°aƒ:v쨠  ]¸pA :tè d:Ö®]»d4iÑ=¾)úùñÇë»ï¾S§N4pà@988hß¾}Ú·oŸî¼óΫÞ7šŠáVî\aò~E —ŸßmRÆ¥ê±n¡ÏëåýU~|‡Ö/KS‰s€†‰Ò“>úäO‹´ÇT³×^Ó_P¿’Å®[©­ö> ‰®i/tQ§÷ÞÒÊô’:ÃÙeÒïõÂp/Ú¢/c«Â9@ÃÆLЬ—ýõÉ‚KûÏßµGQQ଄„šzêŽÁ^RÞ—ÚSk¸q› zÚk¿Ö­Y¬X矦i¿ï­ÉEYÚ½R[JÜ4xêd…=:]‡ÒßמbKú(µñ›ªY…Jˆ^©-EŽ 3Uç=/åÏÕÒ‹•°è/*?GÏ„dè“¿­Tza±d袩sžÑ`ÃqíÚú¹ÒóìÕ5$Jƒ§ÍÒmÅsµh Ÿ,7Dii©úõë§{ï½×4ÏÖÖV›7oVnn®iïÎ;eoo¯?þñjÛ¶­¤K£+ß}÷]5Vuuµ¾ýö[}óÍ7rqq1ÁX׺Ÿ}ö™ìììôòË/›FŽ;Vÿú׿«!C†¨C‡Å¸œ¯¯¯Nœ8!éÒHøšȰôžRXX¨Ç{Lááá’¤þýûëÅ_Ô±cÇ4oÞ@SÇw1ËxÛ+Yÿß[K— „­k´èo‹u¨Ü]ƒ'Ý!·ºè¢ÉýT~h±þ¶hâjö¿0Vm49ÊçÒþówiOÔu°Ÿœk¶õ Ò`/)sKòe/2KײE+·?UûãVje²QR…/Òš„ýJÝ¿UËW¦IòR×Û ÷QîåŠ]¸HÑ û•šš 5‹¿T¦Úȧ˥Vª¸¤BR‰Š U\!É­Ÿzß&e®Y¬åÑqJHت•‹é«äC*rtæSà†ªˆ­ù/]JþÖ˜:uªÞxã Óÿš/ÿ¥¥¥*+ûù§ƒAýû÷×ñãÇUXøóÝ9!!AnnnêÝ»·*++•œœ¬9::Êh4Êh4ª¤¤DwÞy§$™%êãåå¥ÐÐPÓ´Æ'ýðÃ’dѱۮѣG׿Úq¹\M9ŒÑ£G›¡’Ô®];ýêW¿2[·©âU—kµÝ’c[Ò§ÆÊÉÉÑ;ï¼£/¿üR...š={¶ë]ÿܹsÊÈÈÐàÁƒÍ~úm04vìXUWWkÿþýÜÐ,óÙµ³³ÓÀþ«²³³œœœäççgJîJ’··w÷www :Ôì¾8~üxÙÛÛkïÞ½õ¶µ¡÷øëí§­­­lll”‘‘az©¡téèÞyç’» Å~Qõ ‘_)me‚Yµ"?AëŽOУ~~rS†©^oQB¬ÌêÒºd£ÂBäã§Â˪¼Bä#£öÇRqíýgíÐÖ¼(MðÓmk²T¨|íÚS ¨¨áòsÞ£=Å’gØ`¹ë¸>Ù_l¾ÓüeÔ:NQa‰Tž¯”¬Ÿ !”Ê(/Ù7¢ÊܪäÚ+–ªD’ãÕYœ¦¬ò(õ›4CS·jÇþCÊ*ÌÒ¦ÿ,áà†rtt4KÆÕ|¿œ“““Μ9£Ý»w+33S'OžÔÑ£Ge4åàà`¶nhh¨¶oß®äädEEEéÔ©SÊÈÈÐØ±cecc£S§N©ªªJÛ·o×öíÛë¾m_³í:uº¢ŒC«V­äååeJXr¬Æ´«®ø]­´„éQõSûêJf\>ê·©âÕsyÛ-9¶%}²TUU•bccµvíZUUUiÈ!º÷Þ{Õ¦M›«nwêÔ)Iº¢ž´$SáÚI& )5æ³Ûºuë+êZÛØØ˜Ê0\ë>Ó¹sç+îᎎŽòôô¼êµnÉ=þzúi04mÚ4­\¹RsçΕ¯¯¯üýý¨^½z5¸þ:Àõº¥¼†Û|t›¤â¼bUH28ºÉQ’ÿ£oêÖ±A‘»ìkE¤(¯è²z²*Î*–ä(ç:"gïì({•¨°èò*´%—’Ánnr4Hª¨U¦ÁÏQ{ö»ip¨»”¶F©W|§­«¢myýunÚÇš”Éâ‚ %©úÏß>ÑøÉc:ùI ž,ɘ§´=[g–€½ïöX‹×²eËäàà ¾}û*00Pwß}·bcc¯éïï/íÞ½[QQQW”g¨¬¬”$ 2ÄlnmµG‘YªªªÊ”°äXiWCãw¹«%1.OÜ4W¼ÒvKŽmIŸ,Q]]­%K–())I¾¾¾zôÑGëLØ6öÔôhjÍ}¯«K}õkíììÌ~•q=÷øëíçðáÃÕ¯_?íÝ»W‡R\\œ6mÚ¤:höìÙÔ¾-ó]øVîœ[ï Ý&£ö§]šQR¤r•+}Ù{ŠÎª#EZ^¤¼Z³Ý%³±¸9{9J*ºTªàòÍ‹KT.O¹Ýfòk¯à(7G][3;—öD)j°ŸÜòýr[¹-K×uçF-ìccUäïÑšE{´FŽrëâ§Þ!ƒ5|š^ð‘þ´0î²2p󨨨Њ+¨™3gš%êJŽÙØØhÀ€ŠÕÙ³g• ^½zÉÃÃC’L?•¯¬¬T¯^½Ì¶-++ÓÑ£G¯ú³û'OžTuuµYòÐh4*//Oýúõ³øXMÕ®†¨ù©õ‰'®xAØÉ“'ͦ[²]—³äØ–ôÉ6lPRR’ÂÂÂôÐC]s4a]íÏÊʺbYͼÚõKõùi*ÙÙÙWÜKKK•››«Þ½{7É=þzúi4UPP wwwEFF*22RÚ±c‡–/_®õë×ëÁäâÍî–­ÁëØåWzp‚»”«-—2šùÉÊ(·—Ÿ½ ³²”Uó_žä5^Q~æ)u’_í¸s€¢Bo“2÷+«ŽLlE^²²ÔFAQf% >ƒ5ÌK*JOW‘iî¥2 òÒ°Ñ¡º­|¿bӯ諥}lTl{?¡×^ÿ&u1H*QaÆ~Å­Y¬åÉå’O€Ü |°Ü¼ UZZ*///³/þÙÙÙ:t誫«U]]m¶MÍ(®o¾ùFÙÙÙ|X]»vUDDD“Ü㯧Ÿ¾¾¾êСƒ6nܨóçÏ«C‡:uê”8 ;;»zÛÐäw³þ.ØË?jšükÍ1WÆ®/½Céfµ*”¿u¡þT8FSG‡jò£Q²—Qi Zö·h%\–™Ìüü=Åv­1ãTT£ Ž'ëËÅ+µµÞ"³ÊX³@Éš¬©Q?íßX ÌC_齕›”~Y}݊ŸÊ4¸iÏŽ,5M^Ô²>6dy [•0^Ã}Z>ŸüIïï‰Ó¢÷ì5uR”B'LÓ`IåEyJýD_®Û/Jð¸™ÙÚÚjöìÙZµj•<¨ÔÔTuéÒEsæÌ‘»»»>øàíß¿_wß}·i…††ê›o¾ÑÀ¯yéíí­yóæiõêÕúá‡T\\¬öíÛkÚ´i6lXƒj¶0@£FÒ¦M›ôÃ?ÈÃÃCãÆÓÝwßm¶½%ÇjŠv5Ô!CÔ®];mذAñññrvvVHHˆ&Nœ¨Ù³g7y¼Ë’c[Ò§ŠŠ ]¸páªuAkFÝæåå)//¯Þë³¾¯$ùùùé•W^Ñš5k´gÏ]¼xQ;vÔã?^o½P 1¤Ý»w«  @ÁÁÁ-þÙíÛ·¯ú÷ﯘ˜¥¤¤ÈÕÕU#GŽÔ„ ê­“mé=þzúioo¯Ù³g+::Z©©©JHH“““|}}5zôhùùùq!€aÓ¿ÿjÂpç;ô»ùJË^Õ[ ÅÍy Ý1g¾uÛ¢¿ýi #_ Ô¼è n‡ÖÎ;5cÆ ‚\§Y³fiàÀzä‘GÀ5Ø‚È9HûJ[vÜÀÊeffÊÛÛ›@hQ¼ë†DÝSw„É?lŒºê¸–%䬨‘#GtòäIM›6`hQ$xo{/…Ÿ ûLíúä?jÖ* ÙõìÙS={ö$Z5xX%jðPƒ¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^À-kÑ¢EzñÅ Ä-èÿø‡^}õUà/à–pâÄ EGGëܹsƒÒO¿wwwÓ„Ùÿk«kÔ¨®®®w^íeÕÕÕfókÿW×¼ú–—;qℾþúk«]»v„r­øE`/X)!X»… *55U’4þ|uêÔIsçÎ5-¿pá‚>ûì3¥§§Ëh4ª{÷îš2eŠ|||ÌöS\\¬µk×*--M………òððPxx¸FŽ);;;Óz}ô‘ ôë_ÿZŸþ¹Ž=ª6mÚ(44TãÆSRR’6nܨœœµk×NcÇŽUDDÄ5û‘’’¢ 6(''G¥¥¥ruuUpp°Æ§Ö­[›Ö[´h‘ŠŠŠôÌ3ÏhÅŠJIIÑ›o¾)''§÷Á’¶T\fÍš¥Ñ£G«GÚ°aƒŽ;&i„ ²··¿îø5E?ËÊÊ´qãF%$$¨  @mÚ´‘¿¿¿&Nœ¨öíÛóТìzôèñÿj&(ÑÀZ<ùä“&>>>rppбcÇ4}út 2D®®®JJJRnn®’““åä䤰°0¹¸¸())IûöíSdd¤lm/ý˜¥°°PóçÏWVV–‚ƒƒÕ·o_iÇŽÊÈÈPhh¨éY˜œœ¬ÜÜ\ÅÇÇ«{÷î QNNŽuøða%$$hРAêÝ»·>¬ÄÄD 0@NNNõöáàÁƒzï½÷d0¡=zÈh4*11Q……… 1­›””¤ .(99Y'OžT·nݪ¢¢¢÷¡¡1lɸ¬[·NåååÚ°aƒ:v쨠  ]¸pA :tè d:Ö®]»d4iQüš¢Ÿü±¾ûî;uêÔI”ƒƒƒöíÛ§}ûöéÎ;ï4]SÐÁ °z¾¾¾:qâ„$©{÷îêܹ³iYii©úõë§{ï½×4ÏÖÖV›7oVnn®iïêÕ«UUU¥¹s窦>ýرcõå—_êÛo¿ÕÞ½{uÇw˜öQXX¨Ç{Lááá’¤þýûëÅ_Ô±cÇ4oÞÔÖŽKß¾}Õ¿ÅÄÄ(%%E®®®9r¤&L˜Pï Ì,ßõôÓÞÞ^³gÏVtt´RSS• '''ùúújôèÑòóóãàEÙŒ5Êô›Åš//u}YkÎ/¶¬ßÕ~þ\{YíŸJ×üùjóê[¶sçN‚ÜbfÍš¥ê‘G!Ð@Ôà+E‚¬ ^°R¼d ÜÞ{ï=‚b/X)¼`¥Hð€•"Á VŠ/X)¼`¥ M¹³ßýîwòôô¼îýäççë­·ÞâìÀU4i‚·S§NosäÈíÝ»×4íëë«ðððF·aîÜ¹ŠˆˆÐý÷߯¢¢"-Y²DÞÞÞzä‘GtúôiÎ8€[†áF7àÔ©Sf ÞªªªëJð^îüùó***RUUgÀ-¥I¼ååå²···h›ÁƒkðàÁWì§©üæ7¿á,¸%5i‚÷í·ß–‹‹ËuïçìÙ³œ¸†&Mð:::ªmÛ¶×½Ÿ‹/6Y›^~ùeõíÛW>ø iÚÍÍM¯¿þºž}öY…††jÆŒ***RXX˜î½÷^ùúúªuëÖ*((P||¼–-[¦’’®7•&Mð>ÿüó²³³»îýTVVê…^h¶NÛÛÛkîܹòööÖT^^®½öÚkÊÎÎVLLŒlllÔ§OMž¼AëvêÔ©E:¾dɳ—¹ýûßÿÖâŋ͒»¶¶¶jݺµZµjÅ•à¦Ó¤ ÞãÇ«}ûöWÌoÕª•FÕàý;v¬Y;}ñâE˜Í+..–‡‡‡† ¢nݺ©{÷îêÛ·¯œœœš´&04•&Mð.\¸°Å>eÊÝ~ûízûí·uöìYÓ|[[Ûkn[× Ó~õ«_éùçŸWii©vïÞ­Ý»wëóÏ?×ĉÊ•à¦Ó¤ Þßÿþ÷uŽàµT~~þ5_jÖ©S'õïß_...f ^WWWUUUՙĭ7ƒž}öY%%%é7ÞPUU•Ù2¸5iöÒÇǧAëkݺuu.óõõUxxø5÷qâÄ I—^ÊvüøqI’›››ºwï®ÌÌL³úº×âéé)GGGeee™%w}}},®72<µ¼¼\YYYu.kÛ¶mƒö«)S¦è±Ç“···Îœ9£ÈÈH }úé§µ'77W¹¹¹š4i’¼¼¼tòäIùøø(""B¹¹¹êÚµ«ž}öYý÷¿ÿ5{ ÜHMšà5jÓ¦Í5×sssÓœ9sê]~áÂ…k¨H¿ýíoõØc)""B­[·Ö‰'ôÑGi×®]µ»ªªJsçÎÕ“O>©+--M/¿ü²òòòôÚk¯)44TŸ}öW €›†Í¨Q£ªM?•"¨«$ACÊ´iÓ¦A Þk¹pá‚E5tÜxÕÕÕõΫ½¬ººÚl~íÿêšWß²;wtð‹×ä#xF#Q€`KÀ:‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬ ^°R$xÀJ‘à+E‚¬”¡©whoo¯òòòŸ`0(((H½{÷–›››lmmuöìY9rD)))*))á,@#4é^½ñÆŠŠŠ’$…„„hîܹzôÑG®ž={ÊÏÏO ÐôéÓ5oÞ<1¢ÑÇ?~¼bbb4dÈz×™9s¦bbbäïïoš·dÉÅÄÄÈÃÃ+€ÕjÒ¼ööö²··×øñã ???³å•••ªªª’½½½$ÉÑÑQ'NT×®]õŸÿüGUUU-ÒéóçÏ«¨¨È¢ãõèÑCáá኉‰Ñ™3g¸rÜp†æÚqíäîÎ;µmÛ6eeeI’<==5hÐ Ýyç²³³Spp°Îž=«5kÖ´H§ó›ß4ª?>ø âããIð¸)4ûKÖ’““µbÅ Sr×`0(??_k×®Õ?ÿùO]¼xQ’4|øpùøøpF š=Á¢Q£F™¦çÍ›§AƒI’Ž?®/¾øÂ´,22²E:ýòË/kÙ²e¦iÝÿýZ´h‘Ö¬Y£O?ýTüãåíí-IZ°`iÔïû￯÷ßß´m§Nôꫯê“O>ÑÊ•+õÖ[oÕÙ—_~YÿûßÕ®];½ôÒKZ³f¦OŸ®˜˜\±þ| O>ùD666\¥êÔ¤ Þ²²2_1¿öKÐìììdgggšNJJRAA$©oß¾²µµmñ üßÿýŸyähõêÕ:pà€"""ôúë¯ËÞÞ^K–,1•¨àíÝ»·Þÿ}õë×O»víRtt´Z·n­_|QO<ñÄDZ··×ܹs¨èûï¿—$ :Ôl½®]»ªk×®ŠUuu5W)€:5i Þòòr½úê«owäÈEDDÈÑÑQ·Ýv›Îž=kÑöÆ S÷îÝë\Ö§OŸ«nÛªU+Ýyçúþûïµ`ÁÓü)S¦hÊ”)êܹ³Ž=jª)œššªüQ’ôôÓO«²²R³gÏVnn®$iÅŠš7ož&Mš¤ 6(33Ó´OmÙ²E/½ô’ÊËËMû>þ†$ºXÛæÚñ=÷Ü£gžyF'N”­m݇2dˆÆŒ#I*++ÓæÍ›[<;wÖû￯ûï¿ß4¯¢¢Bqqq’$;;;³õmll$I………JKKÓ¨Q£äééiZn0ôàƒªªªJ‰‰‰ jÃ÷߯êêjÍš5KmÛ¶Ull,W&€kj–¼6l˜$iĈò÷÷×÷߯¬¬,UVVªcÇŽ4hºwïnÚæóÏ?oTýÝ땞ž®'NhÒ¤IrvvVff¦¼½½Õ¿UTT˜’­5/F›0a‚vîÜ©øøx}øá‡zã7ôÞ{ïé»ï¾Ó… ª=zhõêÕ:qâDƒÚPXX¨~øAAAA:s挒““¹2\S³$xOŸ>­O>ùD3fÌÁ`P§NÌFÈÖV]]­µk×*))醠¼¼\¯½öšzè!køðá*..VZZš¾øâ >žh×aæÌ™òóó“§§§–.]J@4˜ÜX «««V¬X¡M›6 F‚÷›9s&AÐ(¶„¬ ^°R$xÀJ‘à+E‚¬ ^°RBu+++ÓO<¡’’Ó¼±cÇê±Ç#8¿ úÛßþfš~ýõ×pÍeÖdÅŠZ½zµizùòårppàä€ Á õسgYrW’âãã5cÆ ÙÚ6Ï þ÷¿ÿéâÅ‹’¤.]º(<<ü–ï/©¯ôÐ\Hð@=vìØqżÂÂB¥¥¥©W¯^Ír̯¾úJçΓ$ :ô–Núý’úJÿÍ…¼P‡‹/*))©ÎeqqqÜHð@UVVfšvrr2ý9..NUUU Üp”h€:Ô.Ïàââ¢1cÆhÅŠ’¤3gÎèðáÃu¾LëÓO?ÕÚµkMÓ«V­ºb§Ÿ~Z§OŸ–$…‡‡ëÅ_Ô?þñmß¾Ýl½íÛ·kûö튌ŒÔ³Ï>kš_QQ¡íÛ·+..NG•ÑhTûöíåãã#5JÎÎÎfûZµj•>ûì3Óôòå˵{÷n­ZµJYYYjÓ¦uÿý÷«cÇŽ:{ö¬>ûì3íÞ½[ÅÅÅòòòÒí·ß®©S§š%»%©ººZPLLŒ²²²têÔ)988ÈÝÝ]ݺuÓØ±cÕ­[7Óú–ô577W_}õ•RRRTPP {{{y{{+<<\cÆŒQëÖ­-:¯–¶µ94´ÿ×ÓÖcǎ髯¾RFF†òòòÔªU+yyy©gÏž?~¼<<<ÜÞóçÏ륗^RNNޤKÿØñ—¿üE>>>Ír<€eHðÀeΟ?¯={ö˜¦ÃÂÂaJðJ—FñÖ•àmn………zóÍ7õã?šÍÏÉÉQNNŽ’’’­ßþö· ªw?kÖ¬Ñ_|aš.**R\\œöìÙ£ßþö·zÿý÷uöìYÓò¬¬,eee)99Yo¿ý¶Zµj%éRòÃ?Tll¬ÙþËÊÊtþüyeddhË–-zúé§eQ_¿ÿþ{½÷Þ{ª¬¬4Í+//×Ñ£GuôèQmܸQsçΕ··wƒöלmmj×ÓÖË“ù’TZZª¢¢"¥¥¥iýúõzî¹çtçw^³•••Z¸p¡)¹k0ô‡?üÁ,¹Û”ÇXŽ p™„„³¤bXX˜:vì¨Î;›æÅÇÇ7i™†‘#Gê¹çž“£££iž¿¿¿ž{î9EFFJº”Ü|ã7®Hî^>Šõüùóúë_ÿªìììzW;¹[[II‰æÏŸo–Ü­-77W111¦éíÛ·_‘„lÛ¶­lmÍ/}ô‘Μ9Óྦ§§ëŸÿü§é<ØÙÙ©[·nòòò2m“ŸŸ¯¿üå/*--mPŒÓÖæÐþ7¶­û÷ï¿"Ùêææ&777Ótee¥>øàedd\³­ÿýïµoß>Óôo~ó³Øhêã,Ç^¸Ì÷ßoúsÛ¶mÕ§OI—Ê)œ}ú¨OŸ>úôÓOURR"IêСƒFŒaZgË–-:vì˜iº{÷îš5k–:uê¤ââb-]ºTß}÷¤K/‰ûì³Ïô /Ôy<=óÌ3êÖ­›RSSõÎ;諸¢Â´Ü××WO=õ”¼½½• E‹™–¥¥¥Õ+///Í›7Ožžž*--ÕöíÛMÛUVV*--M¡¡¡ êë²eËL ôÛn»MþóŸÕ©S'UWWkëÖ­zÿý÷%]J8¯_¿^÷ÜsE絡mm écÛºk×.ÓvÎÎÎZ°`i„ó‘#Gô§?ýI¥¥¥ª¨¨P||¼ºtéRo;7oÞ¬o¾ùÆ4=cÆ EDD˜­Ó”Ç4 ^¨åìÙ³Ú¿¿izàÀ2.Ý*ÃÃÃÍF¾ÆÅÅ5Y‚·!vîÜiú³ƒƒƒ^yåµk×NÒ¥$è³Ï>«“'O*==Ý´þÅ‹ë¬SûÄOèöÛo—$…††*44Tqqq¦åÏ?ÿ¼ºwï.IŠŠŠRll¬i¿ùùù¦õMû:t¨<==%I­ZµRpp°Ù1kow5F£ÑìLž|X~ø¡izìØ±?~üë5ÕñG‚jÙ¹s§ª««MÓaaa¦?ûúúÊËËKyyy¦uüñ+~6ß\²²²L7%wkØØØhÔ¨Q¦DlUU•~üñÇ:“Ð={ö4›nÛ¶íσA]»v­wyíøÌ™3Çl½ââbedd(##Ã,al‰šz¯µ÷Y32¹FíDbvv¶ªªª®yš£­Í¥±m­}MéÙgŸU@@€î¸ãÝqÇš0a‚lll®yü·ß~ÛTÃÖÖV÷Þ{o³Ðx$x –Ú?wpp0¢”.%PÃÃÃõ¿ÿýOҥѾ‡Rß¾}›½]/^ÔéÓ§MÓõ½X¬cÇŽfÓõÕÒ­yIZ],JZgddhݺuÚ·oŸN:uÝ}½<Á»zõê«®_QQ¡ÂÂByxx´x[›ScÚ:aÂíÙ³ÇTú¡ªªJÐôé§ŸÊÕÕUÔ˜1cÌjJ_îüùó¦?WUUiÕªUzüñÇ›íx€Æ#Á ?9}ú´RSSMÓeeeš>}úU·‰‹‹k‘oC]>Z²)_W—mÛ¶éý÷ß7;޽½½ºté¢ÀÀ@­]»Öâ}6ô¥iµ:uêš ÞæhëÍW???½ýöÛŠ‰‰Ñ¶mÛTTTd¶üÌ™3úöÛoµiÓ&Í™3Gáááõ¶ÁÖÖÖtüõë×ë®»î’O³Ð8$xà'ù™~||¼žxâ‰zG¼VTT˜jøJ—Ê\¼xÑâã´nÝZ¦Q¼—r­‘m6íêêÚlñºxñ¢/^lJöèÑCS§NÕí·ß.ƒÁ ‚‚‚F%M/üÎ;ïÈ××÷¦lëÍWOOO=úè£zä‘Gtøða%&&*11Ñìš©¬¬ÔG}¤ÐÐÿŸ½û«âJ8þ¥\:ÒQAŠ¢`C…ˆXLѬ%Æ’ìšnŠ)&î/‰ÝìjLÜ$»11Y“˜lº%QcMÄÞ *ˆÒ‘^”ÞïïF®©ú~žg¸3çΜ™¹s˜ûræ=¾õ~vÝÜÜxôÑGùÇ?þhþQðí·ß²hÑ¢vÙžB!„Bˆ–“¯Bü¡vz†¦ÊÏÏ'::šÁƒuS¤¦¦j'´oLí\· I¿Pà cîܹZ9PÕj5ÁÁÁÊk]]]e ´öpåÊŠ‹‹•×3fÌ`øðáÊëèèè&¯«ö¾Þ˜f"11±N€·²²’ÊÊJåõÍÒJ´e]ÛCíýoi]³³³Ù±c‡òz„ 0€ðç?ÿ™¤¤$¾øâ .^¼Àµk׸zõ*ÖÖÖuÖõúë¯cmm¯¯/ÇàäÉ“œ>}Zä­-·'„B!„¢å$À+„hzÄ&$$(¯½½½™={v½e“““ùä“O”×!!!J€÷ÆÞ§_~ù%O?ý4–––\¼x‘¯¿þºÉuÊËËÓz=jÔ(Μ9hÒG,_¾œ—^z  øî»ïˆUÊ9ccãv;fµ¬  0.\¸À÷ßߢ}µ°°ÀÙÙ™ääd~ùåŒ ÅÅŬX±‚¨¨(œœœøðÃoY]ÛCíýoi]ÍÌÌØ±c‡Òó7%%…—_~333tttpppÀÖÖV ¸ªT*ºuëÖàºfÏžMxx¸€þæ›oøðÃÑÓÓkÓí !„B!„h9 ð !pôèQ­×cÇŽ¥wïÞõ–uqqá›o¾¡  Ðô¦}òÉ'ÑÓÓ£ÿþ¨T****8þ<¯¾új“ëaiiɵk׸páü1^^^Œ3†±cÇÌ¥K—ˆçå—_ÆÈȨNÚccã›æn-­<­ÁÁÁchhXoÝó7¶¯sæÌá½÷Þ4Á÷ùóçãììLYY©©©Zëš={öMûom]ÛCCû_“Æ ¹u522ÂÇÇGéq{êÔ){ì1¬¬¬ÐÑÑ!77Wë}ƒÖJR'''9pà  âîÞ½›{ï½·]¶'„B!„¢ù$žB àU©Tx{{7Üpêêâë뫼®IÓ`kkËÌ™3|ï˜1c”ž¨õ©½ÝÊÊJ:ĹsçM‚7ß|WWW­÷ÜÜíÖ­‹-ªÓ›¸­ñðÃ×™_VV†¾¾>Ï<óŒV@/..®ÉûêããÃܹs•åÄÇÇ“’’¢4uuuyñŵÎE{Õµ=4´ÿ­©ëüùóëüc"//¯N°ÕÞÞž^x¡Iõœ9s¦ÖöÖ­[§¤ií !„B!„héJ#„¸ã%''sùòeåõ°aÃ022jô=#GŽdïÞ½Êë£Gâéé À”)SèÕ«[·n%%%…ÒÒRzõêEPPãÇçùçŸop½3fÌ ªªŠrssëô$µ±±á½÷ÞãàÁƒDFF’’’Bzz:VVV899áîîNPPòˆ}{›6mvvvìØ±ƒÔÔT¬¬¬ððð`Ò¤I¸ºº²oß>%ÂÔ©S•€àÍöuòäÉ 4ˆàà`’’’¸|ù2*• [[[† FPP¶¶¶·¤®í¡±ýoi]MLLX±bìÛ·ŒŒ rrr¨¨¨ÀÚÚ[[[3f Mª§'NTòíòóÏ?óøã·Ëö„B!„B4NPP2²‹ŽŽŽÖO­‚õÌBˆ7V{^íejµZk~í©¾y - “ƒ.„B!„Bˆ;ž¤hB!„B!„Bˆ.J¼B!„B!„BÑEI€W!„B!„B!º( ð !„B!„B!D%^!„B!„B!„è¢$À+„B!„B!„]”x…B!„B!„¢‹’¯B!„B!„BtQúr„wº¼¼<9B!´èééQUU%B!„•JEEE…!D§"^!ÄÏÊÊJ‚B!„B!º$IÑ „B!„B!„]”x…B!„B!„¢‹ê^•J¥õS!„B!„B!ÄÍuh^SSSæÍ›Gyy9«W¯æé§ŸÆÄĄիWSXX(gG!„B!„B!Ñ¡ÞÒÒR¬­­177ç_ÿúzzzQRR"gF!„B!„B!n¢]S4ôë×Ù³g3kÖ,lmmµ–âääDII iiilݺ•´´4JJJprrÂÐаy;¢«ËÚµkÙ¹s'o¿ýö-?K—.嫯¾R^õÕWìܹ³Î~·§ŽØ¦B!„B!„¢ã´y€×ÐÐP Î6ŒQ£Fáç燛›ݺuCWW—û￟ `ooϺuë8pà?ýô¶¶¶,X°€ûï¿¿YÛõòò€áÇcnnÞ¡¶°°üü|ª««Ûeýnnn<òÈ#XYYݲm !„B!„B!:—6MÑ`aaÁ /¼€J¥bÇŽôë×OY6|øp ˜4i±±±ÄÅÅ‘ŸŸO·nݰµµåÒ¥KØØØŸŸOvvv³¶=nÜ8"""ðññá®»îâ÷ßï°ûòË/·ëúûöíË#€óçϳfÍ’““•²L›6±cÇÒ½{wŠŠŠ8wîß~û-iiirU !„B!„Bq‹´Y^===ª««©ªª‚üå³ IDAT --åË—³zõj>þøc>úè#JKK(**BOO²²2~ÿýwvìØÁ×_ͯ¿þÊï¿ÿNYYY³¶]“žáðáƆ¢££Ã˜1cê-?lØ0þùÏRRRÂÖ­[¹ví=ô+V¬@WW·Åe3tèPV®\IïÞ½Ù·o;vìÀÑÑ‘åË—Ó¿¼½½Y²d VVVìܹ“Í›7“Í´iÓ˜?¾²®¯¾úŠÍ›7šïªU«êÝfÿþýYµjC† áØ±clÛ¶ ###.\È“O>Y§¼‰‰‰²_ß|ó {÷îeذa,[¶ }ýëÿ xå•WøË_þBNN7n$** ???–.]ª÷…B!„B!„í¯Ízð®X±B+¸·qãF®]»¦¼NNNfÏž=Lš4 Þ}÷]¢££ùüóÏ•2û÷ïoövÍÌÌðññ!++‹ .Æ”)S dË–-uÞãééɧŸ~ÊŽ;”yO?ý4S§NeܸqìÝ»·Ee¢««Ë¼yó¸ví/½ôùùùlÛ¶/¿ü’éÓ§óÎ;ï0nÜ8ÊËËY°`………Êû—/_Ž···ò:>>ž¾}ûCBBB½Û}öÙg©ªªâ¥—^"==€µk×ò÷¿ÿ©S§²k×.RRR”òÎÎÎlÚ´‰5kÖ(ó*++™6m...ÄÇÇchhȘ1c8räË—/WÊ=ôÐC<ôÐC8995X!„B!„B!DÛj³¼7öÜÌÊʪSæÆÓLMM[½]T*‡F­VEaa!ýû÷Wr×–‘‘Áo¿ý¦5ïǤ¬¬ ÿ—mˆ³³3®®®lß¾] îäææòÉ'ŸpêÔ)¾øâ {ì1­à®®®.FFF6ë¸X[[ãîîNpp°ÜMÀvíÚµèêêâëë[ç}?ÿü³Ö븸8eûÕÕÕ¨Õjúõ뇃ƒƒRî—_~aÖ¬YÜB!„B!„âj³¼ááá8::*A?Ž;¦U¦f5µZMzzºÒãVOOªª*ågsÔ¤g¸páöööÊü¨¨(FŽI`` 6lÐzOBBÕÕÕZóŠ‹‹IMM¥gÏž-.ÛGGG’’’ê,;pà€ò{AA¶¶¶Œ=šÞ½{Ó§O „™™™’Þ¢©jÎÃ¥K—ê,«©Çõ/**Òêu ÔÙ÷ŠŠ >ÿüsžyæÖ¬YCll,QQQDDDÙìó'„B!„B!„h¹6 ðþðÃèèèðÏþ“nݺ1mÚ4***ˆŒŒD__ŸÀÀ@üüüˆŽŽæ‹/¾ÀÄÄ„—_~™òòr>ÿüsžzê)LLLøâ‹/š4Èšµµ5C† àÍ7߬·L}Þ†‚UUUµ¸lƒùüµ7 ~N˜0ùóçSVVƉ'8qâëׯgÊ”)õö¶m©šzÔΫ P^^Þ¤÷oß¾°°0üüüðööæî»ïfÊ”)\¾|™Å‹“™™)W–B!„B!„·€~[®lذatëÖ ###æÎ«ôÌ­ÍÃÃ'''RSS±³³ÃÜÜœwß}###ŠŠŠš<ÈÚ˜1cÐÑÑáÈ‘#õæï}ùå—éÝ»7ÎÎÎ$''+óë”544¤W¯^DFFjÍoNÙ†\¹rEYWDD„Ö²ÀÀ@úôéÃ?üÀóÏ?ODDï¾û®VÏÙ±M‘šš €‹‹Ke®®®Zùw›ÊÌÌ {{{233Ù¶mÛ¶mC__Ÿ   æÏŸÏŒ3øôÓOåÊB!„B!„âÐm˕դ"”|¸µƒ»5AK}}}œœœpvv¦¤¤„ŒŒ vïÞMzz:%%%8995)çlMz†uëÖZgÚ·o  ׿ììÌØ±cµæ=úè£Öâ² IJJ"33“|333e¾©©)O?ý4ƒ ÂÎÎccc®\¹¢ÜuvvÆËË z×ÝÐüÜÜ\bcc ÒJ]¡¯¯Ï#ÇNNN¬ZµŠY³f)ó*++ ©s¾…B!„B!„í«M{ðnß¾333ôôôØ´i?þ8îîîìß¿ŸƒòÈ#púôiºwïÎÌ™3øè£HLLäâÅ‹¼öÚk¼òÊ+8p€Í›77¸-GGGúõëGlllƒ{3eÊÆŽË?ü ÌÏÎÎæµ×^Ã××—ÔÔT ÄСC¹pá»wïÖZGsÊ6¤¢¢‚Õ«WóÖ[o±jÕ*:DYYXZZ²bÅ ÒÓÓIOOgêÔ©tïÞË—/ãè舟Ÿéé鸺ºòüóÏóÝwßQXXHEE>ø aaa„††ÖÙîçŸλï¾Ë'Ÿ|Âþýû)**Â××7776nܨի¹©âââHNNfêÔ©˜››“’’BÏž=>|8•••ìÙ³G®*!„B!„B!n‘6 ðªÕjÖ®]«¼¾té’àMLL$//U«VàããCbb"...¸ºº’˜˜ˆ««+jµšK—.qùòåF·Ào¿ýÖ`™K—.qñâEÜÝÝ•`0À‰'8rä³fÍÂ××—œœ6mÚÄwß}WgP±æ”mLXX .äÑGåž{îAWW—„„V®\ITT‹/æ©§žÂÛÛ///bccY´h,Y²___Ö­[@DDÇ' €îÝ»×àŽŽæÅ_ä±ÇÃßß.]ºÄûï¿_oJ‹¦¨¨¨`É’%<úè£xyy1vìX ˆåçŸ&::Z®*!„B!„B!n   µòâÇýë{ì¿¡TQ©T˜››£V«¹zõª’¶¡¶ àêêJQQ¦¦¦¤¤¤ðþûï·ÛoÚ´‰ƒ²råÊ6-+Ä®¾ë»f^íejµZk~í©¾y -kjŠ!„B!„BˆÛ™n{®¼¢¢‚ÜÜ\òòòê þ˜››ãââBee%G¥¢¢‚^½zaii)gF!„B!„B!nB¿#7^PPÀ—_~‰¾¾>‘‘‘¤¤¤põêU93B!„B!„Bqú]šü³‘‘‘rF„B!„B!„¢‰Ú5¯âÎ!9x…B!„B!n=]9B!„B!„BÑ5I€W!„B!„B!º( ð !„B!„B!D%^!„B!„B!„è¢ôå!DW] ¹Wáj>Ca1”–Be•fª®==ͤ¯&F`j ¦&`e–Ý@ÒB!„B!º$ ð !DWQYI) RRár¤gBÞU¨V·â/X[CwèåÎз78öÀ¯B´‡+GÀ¼ts•c!„B!ZM¼BÑ™]N…“gáÔ9ˆK„òжßFedfk¦ÓQ×ç›Cÿ¾à5¼=ÁÞF·B´V~„üôŒ à°"ÇD!„B´Šx…¢³).ý!°ÿ($_éØzœ<«™¾^« öŽõ‡€‘ ’?BÑ"Ueü,…Ó ¯B!„h5ù†.„EE%l †m»¡¨¸óÕ/&N3­ßS@ЕBÑbäBÜaÔ@q”T@i”W‚¡>©ÀØL ä !DKH€W!:ƒ”4ø÷皟]Þ5MÞCa°ài°ë©–.]JJJ «V­B¥RÉç 8qâ_|ñÏ<ó Ç—ƒ"DgRU ‡AÀòNä-))a÷îÝDEE‘••Eee%vvvôîÝ›ûΙºç?ÿù111˜ššòïÿ»SŸþÏ>ûŒÈÈHôõõùôÓOåz·_W Ò!>R¯BÚUM`·!&à` VàÞúØß¾ý ¾ùæBCCxýõ×éÓ§O‹Öóæ›o’››‹››ÿ÷ÿ':!îPàBˆŽ–– ÿ »V½ã5õ^þXZÈyl‰‰‰œ;w€Ñ£GceeuG×CˆÛVUÙAÞwÀnh§¨ÒÕ«WyçwÈÏÏךŸ’’BJJ !!!<÷ÜsxzzÊùBÔ‘’¡qu¥ñ€îŠË!.S3ºf†0Ä üû­™W!„hˆx…¢£}÷s× îÖÈÎ…_vÀSsä<¶ƒK—.±}ûv ÔaÕÎR!nkUeµÒ5t|÷ÇT‚»}ûöÅÓÓµZÍÅ‹‰ŽŽ¦ªªŠo¾ù†¥K—bbb"篅ìììpvvF__¾–‰ÛCú5>Ñ©m³¾Â2‰ƒ°xî ‚¥49BQ‡ÜI!DG;Óµë1AΡ¢ã¦BÁe4™ë¡«*S0¶cÛö«Gy>”dCi.TW6^߆t’ ouu5çÏŸ wïÞ,\¸Í3Ò÷Ýw¿üò »w聆°ÄÄD $ŸÃš1c†q[¨ªÖv]h°5n]»¤†ðD8• ÷ÿ¾rÌ…¢6 ð !DG++ïÚõ/ï¼õë­·ÈÊÊÂÍÍY³f±aÃ._¾ŒƒƒcÆŒÁÏÏýû÷sôèQ222èÙ³'S¦LaàÀÊ:.\HAAýúõcÖ¬YlÞ¼™øøxìííñõõe„ Jàãú!)gÇŽÄÄÄ––†¹¹9ŽŽŽÜÿý¸ººj•­Éܽ{wÞxã ~øáΞ=KïÞ½¹pá‚RnÅŠxzz2þü÷7++‹M›6‹±±1>>>8::Ö[V­VÎþýûÉÌ̤¼¼+++¼¼¼ ÂÌLódM.ËúêÑÔu4D­VsîÜ9‚ƒƒIKK£¼¼;;;|||?~<†††->®µÏÛÂ… •ùä§Ÿ~àÕW_ÅÃãÑóðÑG¡§§Gaa!¿þú+ deeaccƒ§§'“&MªSÏ´´4¶lÙBrr2%%%8;;ãïïÏÈ‘#[µÿ¢{^€Š&>a`® œö ÐLº­ÈÕ])!ý\Klzn%ù#È;zØ{uÈ!ÍÏϧ¢BóLu÷îÝë´q£G&;;[Sݪ*¾øâ Nœ8¡\ýúõSʯ^½šS§N¡§§Ç|€‰‰‰Ö5·páBÖ¯_Oll,䡇ªÓ†4ç:¬Q\\Ìúõë•€õСC™6mÆÆÆ7m‡k®ÿ–¶éMÙ¯óŸ?ž>ú¨ÁsSûï@SÛ!Ú[F>¬ ƒ´kí¿­Ê*Øz bÒàá`ft{Óæ´;µ%$$ð믿’œœŒƒƒ~~~Èý‡w ð !„¸íeeeñÁPVV¦Üü&$$púôiNŸ>­”KJJbÕªU,Y²„=zhÇr øä“O¸zõªR6))‰ôôt}ôQ­rÿú׿ÈÌÌTæ•••‘Í™3g˜3gcÆŒ©·žkÖ¬!** LMM)**ÀÒÒ ‹†s_¹r…?üP)_PPÀÎ;ëìG={öðË/¿hAËÈ`×®]ÄÅÅñÚk¯¡§§×h=šºŽ†„„„ðÝwßiÍ«ÉïyîÜ9^}õUåý­9®ÍUû<dffòþûïkå"MKK#--èèhÞ|óMåñêèèhþûßÿR^ë111ÄÄĘ˜È¬Y³Z´ÿ¢Í ¬–À•#š)ò 0 Üݦ¯£4"?‡ä}´O?54AÞ#ouX×ÜÜ]]]ª«« ÇÞÞž#F`oo@=xöÙgµÞ3bÄ%À{îÜ9%À[UU¥ü“hàÀuÒ9”––òïÿ›´´ëƒŒ†††’››Ë‚ ”àrs®C%TYÉÊ•+¹té’2ïСC”––òä“O6éúoiÛÓÔýj©æ´5B´§¸ ø>Ê*oív/¦Ãª½ðDØw»½ŽiKÛììl>úè#å~7>>žøøxrssùÓŸþ$÷BÜætå!„¸ÝåççÓ³gO¦OŸN߾ןé;}ú4L›6 ggg%Q¤¨-==ŠŠ ¦NÊ”)S”Þ_‡æòåËJ¹Í›7+7äƒæé§ŸfêÔ©¨T*Ôj5¿üò ×®Õíâ’••ETT8::òØc1yòdeù¼yóøóŸÿÜà>nܸQ Âz{{3gÎú÷ïOzzzÝØQU[·nÀÚÚšY³fñä“O*£7ÇÇÇ+A‰'žx¢Þz4g Ù²e‹LzòÉ'yî¹çðññÑ|aŒ‹Ó ¾·ô¸6×ç`Ó¦MJPiüøñ<ûì³J¹””öíÛ§×õë×S^^Ž­­-/½ôo¼ñC† `ÿþýZ¦æì¿h¥9pêSØûbãi´‚~’÷ÒnÁ]åBý#È›yë?zzzŒ=Z«½X¼x1K–,aÍš5ìÛ·œœ­÷ ¼Î¶®]»FII úÓŸ´zâ^¸pA«ýjêuX[YY999<øàƒÜwß}JøøñãJnvý·´íiê~ÝÈÅÅ…W_}U™,X€²¼wïÞÍnk„h/§’àëÃ-îèC7c0Vn þçqµþ».eß^ǵ5펮®.S¦LaÊ”)iº7ÿöÛoZÁb¹ÿâö$=x…B´N+{!Ý ¼òÊ+ãççÇ_ÿúWÔj5¼ôÒKèëë3tèPþþ÷¿(ßèùçŸWÄ...¬\¹ÐyçÌ™CII GÀÙÙ™ùóç+½´¬¬¬øúë¯)++#$$„ûî»OkÝÕÕÕLŸ>{î¹§Ù=»233•gžžž<óÌ3èèè0zôh–/_NJJJ/5© üüü´‚. Ê:{õêÕà6[»Ž’’åËIÏž=:t(††† 8•J󨼮®®R¶¥Çµ¹n<………œ:uJ NÍœ9Ð 6Eaa!QQQ£nxà%/éSO=Åk¯½FEEûöíã‰'žhÖþ‹v–wQ“æÁ Øk¸\ü68µ ÔÕ·®nUeºþ´ñ––3f`ddÄþýû•t dddÎúõëñ÷÷gÖ¬Y¢R©6laaa\¹r…ÜÜ\¬­­‰ŽŽ4Aã¡C‡Öó'D‡… bgg€J¥bóæÍJÒ³gÏf]‡7zñÅqqq4½j÷ï߯ìË9ßxý·¦íiÊ~ÕÇÄÄDi[k=5Áôpß}÷qþüù&·5B´—³)°áxÓÿÕelƒÁͬÀÎ\;¨«r !õ*Ħù+PÜ„,`%š ó¼±àxŒÛÚ{žgžyFI5æììÌÇŒZ­æÀ<üðÃrÿ!ÄmL¼BÑÑ\{Á¥”®[ÿö¾ŠvvvJ[sssT*ååå8::*=ºj÷R«ë~]±¶¶Öêý;`ÀÌÌÌ(,,T¾h×îáë뫨>|8ÿûßÿP«ÕdddÔY¿¡¡a‹‚»©©×{Ž5JY‡žž#FŒ¨൶¶fþüùTWW“””ĸ|ù2gΜiô´å: 011¡¸¸˜‹/²páB €§§'S¦LÁÒÒR)ÛšãÚ\7ž‡¬¬,eYíÜÌüío£¤¤DyŒ±öö·mÛÆÎ;µG€òYiÎþ‹[ ¢ðúàfõyã¶h‚»¡»w‡lÖÀÀ€éÓ§3yòd.\¸@\\‰‰‰ÄÆÆ*ŸçÌÌ̘>}: IÓ@TTJ€·¾ô 5mIM49kÔ¤hÎuxãõ\ót •²¦ææÆ®ÿÖ´=MÙ¯›9}ú4¿ÿþ»Øyê©§ÐÕÕmV[#D{H̆uÇšÜu°„ñ`€è57ÔlÌ4“g/ø“7œ¹ »£ ·¨ñm”Wj‚¼Ï×¼¿+kM»Ó­[7  Õ^ZXXpíÚ5®\¹"÷BÜæ$À+„mÚðïÏ»ný¸»ÓW±¡qâ„à0`€88{ö,>>>JþšÇë|¹!on}í`s®Ã×]{}7kco¼þ[Óö4e¿“‘‘Áÿþ÷?¥½˜7ož28[sÚ!ÚÚµøî(TÝäaSCøÓ0âÔÂ{7]æCáÈEØu®ñm•ÁÿÃK÷hR?t&!!!JÚƒ› ’ÖšvÇÒÒ²N›geeŵk×”òrÿ!ÄíK¼BÑÑFyÃì)°ö×®W÷'gÃ`;ã Í ¹ÎÔjµ2ÏÊÊJë'  ÆV£²²R „Ö.×Ò/ÿ7%ªgí‰j¤¥¥)=@™0aýúõ#--Ï>û¬IÛl‹u 0€eË–qñâEN:Å©S§”úŸ>}æÎÛªãzc/âÊÊÆÞxjÛÚìú˜››+¿/]ºTªµû/n¡ª2y‚>}(¸ ÇVtL]ï‚Qoî­¿]‰‰áçŸ`„ øûû+ËÌÌÌ "<<œääd ®dôôðööæÈ‘#œ?žsçΡV«LÏÐ’6îf×akÜxý·¦íi²²2V¯^Mii)3gΤwïÞ-nk„h+j5¬?%7é„Þ¿'<ì &­ß¦®ŒñžðýQÈn¤ È.„-§`ƈÎuÜÒÓÓ•êÈ‘#•oUUUö§5íN}ícͼÚí¨Üq{’ä*BÑL½þï°0ïõµ·¿¿ ÇÞ1§(77—¸¸8åutt´rÓ\óØoí/ÙÇ× .Ö~ÝPîÅ–ª½¾°°0e;ÕÕÕ„‡‡×)ñâE¥ÌÔ©S¹ë®»°··WzÚ5Ek×ÏÚµkY¿~=ÖÖÖÌž=›+V°`ÁePÄÄÄWÍ·Êììlå‘eÐ pÔµ±®=pTUUï½÷¯¿þ:ÿýïëÔ399Yk=IIIÄÅÅ)ò5gÿÅM8O30íYÿdÐÌvÕÐôŒ@]ÇÞƒªÒ¦¿WßL쮋iO0¶½ùz:0¸ š^±5#ª×ÎÁ[£¨¨Hé!êàà µlÄMd¥¼¼œmÛ¶š\¹5irZ¢9×a›þ©ë€6]­Vóý÷ß+©wFŘ1c¬×ÍÚ!ÚÒ¡‹Õx™Qn𗻚Ü­¨Ò¤Y¨n$çC÷nðüp±i|]'.Ad'ûø×nÃjþ¶«Õj­ûJ[[ÛV·;¹¹¹J*€+W®(muͽªÜqû’¼BÑYø ÁïÀν°sät¾:v·ƒÉ÷Àø»@ÿÎûòÙgŸ1qâDª««Ùµk—2?00cccüýý !99™O?ý???233Ù¾}; ÉñX»7\cjr‘œœŒ««k½_ôìÙ“~ýúË™3gX³f îîîœ:uªÎ—¸üسgåå大§³gÏž&×£¹ë¨oàòåËŒ;sssÒÒÒ”^¶5_rZr\íííÉÉÉáêÕ«|þù縻»«ô i* e §ÈÈH~úé'ÜÝ݉ˆˆP¾Õô¬«ënÓ¦MbjjJLLŒ2bõäÉ“qrrjÖþ‹›ùÆÍË”æÀÕH9—‚(Íû%ÐÑ…‹5°ÝŒÊܧƒÓ80ïuóò5ƒº5¤ƒƒ»5Á’’’HNNæí·ßfĈXZZrõêUŽ?Nqq1 yœ·6wwwÌÍÍ)((PrDÖ„±%šs¶¥¶nÓ›âðáÃÊ?æŒñöö&&&æúÇM¥jV[#D[)(…=Q—î Sš™6üדÿÇç[^ j8®‰<9Vï× ÆÖm§a@ÏΓª¡OŸ>Êïû÷ï§°°œœ%ÅŠ’‚¥µíÎçŸÎÌ™3Q«Õ¬_¿^™?zôèfß !º ð !DgbdÓî‡'ÂÉ3p4"£¡¸¤ãêdm ÃCÀHÐZ‘J +³´´¤  €M›6iÍ ÒêE1uêTbccÉÊÊâìÙ³Z½Ítttxøá‡ëäómHíÖ®]˹sç˜?~½ezè!>úè#JJJˆˆˆ ""Ð ¸qcš )++#&&F 8;;+ášàMCõ˜3gN³Öq#WWW¼½½9yò$ñññÄÇÇk-×ÑÑa„ ->®ãÆãüùó€æqÚÜwNNNÍîÙ6cÆ )..æàÁƒkÖ,­1-mwôõõÉÈÈàã?Öš üLî?„¸}I€W!:ZF–¦g¬V묾Ã4SUÄ&Â…xˆM€„dÈÎmŸºèêhêâæ în0 /¸ôj~ýoCvvvÌž=›àà`RRRèÑ£wÝuWGg»uëÆâŋٹs'çÏŸ'-- sssœœœ¸ÿþûqqqiò6ÝÝݹûî» ¥¨¨ñ!¤]]]ùë_ÿÊÖ­[‰‹‹ÃØØ///œùꫯê^xá6mÚDjj*=zô`ôèÑ <˜E‹L@@@ƒõhî:ê =ùä“ 0€²³³)..ÆÂÂggg‚‚‚psskñq2d?þ8»ví";;GGGÆŒCEE?ýôS³Î}Ïž=yûí·Ù¼y3‰‰‰äää`gg‡··7'NÔLÉÇǶoßÎåË—)--ÅÎÎŽ‘#G2vìX¥çss÷_´!›Ap×?ààëš4 ʇR?¦ù=ú{¨,n|=†–0æ=0éÞF€ÎÜU“ K—.åÀœ9s†¬¬,ŠŠŠ°²²ÂÞÞž1cÆ0tèÐzó‡1B ð¶6=CK®Ã¶Ô–mz[jj[#D[È+‚ãd`2Ї‡GhF»Ì4yv¿:Ôp™CÀÏM3Ø[g0{ölzõêÅáÇIOOÇØØGGG&Ož¬Õ÷5펋‹ ãÇ'88˜ôôtºwŸãÆkñý—¢ëÐ R×¾Økÿ¼ñ‹˜B4äÆŒjÏ«½L­Vkͯ=Õ7¯¡eaaa·ÏÁ{t¾&ïä 0P5í=¥ep%Ò3!'O3]½EÅPX ¥¥PY •UP] ººš” úú`b¦&šÉÊl¬ÁÖzÚƒCP5ñKra1¬ßQàßoß¶Ÿí… RPP@¿~ýX¸p¡\ìBÜ.b7ÁéZy[ÆÁ¨EP”¿=¦ü½‘®>ŒûX÷oA¤¤ž ,¸ÛZJ{ùÄO0räHù¼ Ñ…íŽÒôàmÈC!À½eëþï>HʹþúñðèÑ´÷þ¤‹ìwõ“ó'„¸3H^!„èhå°~+ü¶î Ac¡›Yãï127Ít«eåÀ޽°ïˆ&ÐìÐ]Ρ¢ëé7 RC!S“¾ƒ³5?cÖ6Ü0§eÁÝúÜFÁÝ’’Š‹‹•<°*•Š!C†ÈgMˆ.îtrÃËÌŒ4=e;Â=ƒàTT5VýT²x…w ð !Dg‘_¶ÁÆ0t øûÀð!šž¶-ï?!jµœ/!D×7ôYØý¬&7¯EoMîÝK»¡%x<Ü6Û¿Ízîž:uŠo¿ýVyÐ&é„çJä6¼|t?Mf±Ž`a >®p¬ô)¹[Ö¦r…·? ð !DgSU'Ïj&pu‚ýÀã|¸Ýí4¹rÛKe¤¦Ã¥ˆ‰…èXÍk!„¸ÝXºAÏ‘ÐoªæuܯP]Ñø{úϽV$u4sÐ Êfí¾¯ß6Á]Р𣣣£äŸ:uª|Æ„èâj§O¨—sÇÖo˜KÃ^€ä ð !î àBˆÎL­†ÄdÍ´c¯fž8õÔzm­Áά,ÁÜÌþ˜ Tš|»zzš/ªª¯çä-/‡Â"ÍTP¤Éß›£I½žWÒ4å|ð!ngÃ^Ð\«J!~[ãe -ÀmRë¶§2ƒû¿»-¥¯¯/¾¾¾ò™â6’š×ð2'k°ìàÍ\l¡›1ä—Ô¿<íjÇ¡…âV¯Bt4[kÈÎmzùòrˆOÒL¥…œC!D×eÚSóóÒn(/h¼lß)­ë½+„]LêÕ†—¹Úv|ýtgk8w¥þåé×ä !î ºr„¢ƒMÛµë?f”œC!D×ûëMîšUà6YŽ“âŽRXÖð2G«ÎQÇÆêQT.çPqg¯Bt´IwÃ(ï®Y÷±þ0Î_Ρ¢kˈ€‚äÆË8פhBˆ;HyeÃË,M:GÍ˱ªZΡâÎ ^!„èhzzðòS0ýö<­-©ôáÏÁsÑ '„]ÙÅ7/ÓoŠ'!ħ±¯‰A稣±ªáeÕàBÜ!$¯Btzz0óAðë·BøéÎ[ÏÀQ0í°·‘ó&„èú®%BzDãelƒe_¨(]Ð7–ã&„¸#èêBucï6¥_ºcª7¸>m1®oc} t¥‚â!^!„èLœá¯ÏAz8 !šß;Zogí #Á²›œ'!Äí#fýÍ˸O×üLبÁcfË·WQû_«~0|èÊí¸¢ó23„«Åõ/+­¼ùû/¦7Þ ¸-4¶~#9‡Bˆ;ƒÜQ !DG++Ãî>{ØÁ¬)š)5"£àB<Ä%BfNûÖGG{@¿Þ0  VÍ«¿Bt¹1¼¯ñ2fŽààê*Í@lÕåàö`Ë{ñ¦jz _KÔôõ–y…–i#Þ‚ÒÎQÇâFRk,}ƒBÜNänR!:Ú«oÃã3Ághý˺k¦ûÆÿ(†+i’陓§™®^ƒ¢b(*ªFžwÓ×Sc05Õnm¬ÀÖzÚC/Mp×ÈðæõV«aï8Ë^—ó(„èZÔÕpb% n¼\ÿYš´ É{¡ä'*¢€!O·¾WŽBØ2 ò !:-K¸’Wÿ²Ô<гñ÷Û™CRû&èé‚U nKÍkxY7ɨ#„¸CȤBt´¬ø×gàá“ï¯Æ†™™hÊz¸5\¦¼*+5Þªjͳ¾¾fRµ²é¯¨„ÃÇ`ûnMÙ¡»œC!D׿ ®Æ5^Ƥ;¸Þ¨áüÚëó/þ½Fƒõ€Ö×ãÊQ] ~‹%È+„ètzYCÔ•ú—%7!p;o—Ýô_iêƒA šÁ˹ /s°”s(„¸3ܲ»H ÐÑÑ¡¼¼œ’’ªeHK!„¸îB¼f²µÍÔÇ¥eë2Pi¦¶R­†ó!ô„€üB9_Bˆ®+÷œùòæåýtôàÊÈOº>_] ¡ËàîOÁ° ¢©!äBtJNV /‹Ë„’ŠÆÓ èꀙQûÕ/32ò^îh%çPqgh—;H•JÅ!CðððÀÙÙ[[[T*íV¿ººš¼¼Z§·nSèééÈ™3gˆ‹‹kÒ{üüüX¼xqù¥¥¥$''³gÏvîÜ)© „[7sÈ/hZÙÊ*HJÑL 10ФgÐ×ׄuu¡ºZ““·²ÊÊ5ytÛŠ©I§:œƒ&((Hk^YYß~û-'Nœ`ÿþýLœ8±EëÎÌÌ`òäÉ  É½9{ölfÏž-Ÿc!:Ê©Usž3}úðÐCÕ¹ioʶsæÌvíÚEZZeeeXYYáååŤI“´.Í­×™3g&%% ŒO“Žõ—_~INNO?ý4ëׯ'>>|}}™4iìÞ½›´´4,,,xàðóó»eûÕ”õÄÅű}ûv’’’°²²bĈ 4ˆwÞy‡W^yEéqØçQtÝ àÐÿ#JaÚ|^cïÝúº¤†vê ïíÚ¦±nÝ:âââ(..V¶åèè¨U.==Í›7“œœLII ŽŽŽ0räH%…‡~HBB+W®T:²„‡‡³fͺwïÎ?ÿùOe};vì`ëÖ­¼ôÒK >¦}c¾ÍÖ¶·/¾ø"÷Þ{/nnnìÚµ‹ÄÄD,--•z7ß›²Ï5õÌÏÏç¹çžcíÚµœ9s†÷Þ{/¿ü’˜˜–-[F¯^½”'2›sîZó7J4Ÿ¡¾¦‡îþóõ//«„ Çà©À[“!¿6o¼ÌØþ'=@E…&:ž››[§-¸çž{9rdÜÚ)))lÙ²…K—.QYY‰“““&MÂÝݽEíV{\gÿú׿(++«ótuM{¾téRìíí<6·ã½psêÕÔã÷Ÿÿü§Áö³©mó­ºGo¬®rÏÜ~ôÜÜÜÞ®yQsâëËéÔÔù}}}üüüpss£¸¸˜ððprssñööVÊ6§^‡⫯¾¢ªª ___ìì숈ˆàÌ™3ãåå…““Sƒõ:yò$éé鄆†Ò§O¼½½IKK#<<œ .püøqüýýéß¿?.\ <<ÌÌÌÚu¿š³ÞÈÈH>ù䪪ª5j666>|˜äädrss5jvvvmrE+Eß6ëÑUÁ˜÷Àò†öâèBÆÉ[¿o)Ppœ¥M½mjDDéééœ×*• 333­'šcbbøðÃ)++cĈôéÓ‡˜˜<ÈÀ±²²jV»Õ^×ÙÑ£G©ªªRr©×¨iÏǯŒÑtìØ1Š‹‹?~üm}/Üœz5õø9::ÖÛ~6§m¾U÷è ÕUî™ÛW›w˜8q"{÷î%88{{{œ±µµÅÜÜCCCttt(//§¸¸˜ììlÒÒÒHNNF­Vããヱ±1)))mR—ÊÊJ¶oßÎܹsñòò"44TY6räH¦OŸŽ³³3FFFäääÊ?þHII Ë—/Wz#¬ZµŠ„„æÏŸßä÷×puueîܹ¸»»£R©ˆç§Ÿ~âìٳ׿;XX0wî\ŒìÝ»—M›6QUU¥”[´h¶¶¶,]º”yóæ1|øpΟ?Ïš5kHNN¾iÝ›³-kkk–.]ÊóÏ?¯¯/sçÎ%??_®!Úš© ,xÆEÁÏÛ 6±óÖu`?˜ù'ЯËæš^YYYʼ7R]]ÍâÅ‹±±Ñ ôÀ°iÓ&‚ƒƒ9}ú4Æ ÃÑÑ‘ôôt¥]ïÛ·ádsiiiÜ}÷Ý̘1ãú\}}vïÞMjj*ÎÎÎÍÚvCÂÂÂP©T¼ñÆʳZ­æ£>"::ºEõ*..fóæÍØØØðæ›obnnÀ½÷ÞËòåË›|¬sssyüñÇ5jÇgáÂ…$&&ò÷¿ÿ]éÉaeeÅš5kHLLTFnýjÎz+++Ù°aVVVüíoSÊN˜0üãu¶ßÚó(:]•&ç­MO¡y̵Î~uëë–yZÚÔ[Ô¦‚&¿ð!C˜>}úõ‡®.ûöí#==GGGÔj5ëÖ­COOE‹)ÿìyàøôÓOÙ³g£G¦G <˜7ƒ‡‡/^ÄÁÁÔÔT.^¼Èˆ#¨¨¨ >>ž6;eEkÚ[€ØØXæÌ™£Ôj5?ÿü3{÷î娱cøùù5kŸk$%%1bÄ,X ì“³³³ò}¥OŸ>J€¤©ç®­þF‰æ31€q ø\ÃeN%J¦xƒn;ÄhŠÊàG ýZãå¢3ñôôdöìÙlÛ¶C‡qèÐ!LMMñðð ÿþx{{+Ÿg€êêjÖ¯_™™ûÛß”ÛØ±cY²d ÁÁÁ<ûì³Mn·:ëuv»Þ 7·^MQ_ûÙ’¶ùVÜ£·¶­-¼më±lÙ2žyæHQQìØ±ƒuëÖñã?²eË>Lff&=zô`öìÙ,]º”G}T«Qk —.] {÷ë x¼½½Y²d VVVìܹ“Í›7“Í´iÓ” (ÀW_}ÅæÍ›• éªU«šõ~€¡C‡²råJz÷î;}ûرcŽŽŽ,_¾œþýû`ggÇgŸ}F@@§NâçŸæÚµk<þøã,Y²¤îWV¬X®®.ß|ó {÷îeذa,[¶Lù_Cuoî¶T*‹/fðàÁDEE)–!Ú‰× xç øöî<.ªë~üÿ‹meÄ…EÄqƸ$ØHl³ù‰¿$Ö¤±M›O“6³5Õ4Ÿ&æ«YZ·¨IEŒ¨ƒ”MD‘]Ã" "ŠÂ ˜ßtnÙf`p¡ïçã1Äaî½çœ{ï9çž{îû®yfNuï;#]jÛ¦ô¬yþøÂ]9¸ -ŸTihh 55•àà`lllÐh4h4jjj˜}P«Õ 2Dï1=777½íwW¾ŒYoaa!åååz3N )Fž®3¬ÓǸE¬`ÒpŸÐþï†ÿƯ«[X/[XCØR§Þ¢:µùõLkÛª­mzA^ee%Lœ8Q¹˜Ö Ì;­V«LäpssÃÑÑQyTµªªŠÒÒRfΜ‰J¥Rârž={–úúzFŽiüaÒ…úVW·Mš4Io¿ÎŸ?+++ÒÒÒŒÎss .ìpÀÚ˜}gª6JtΔaàÖÁ»’ÏÂ?ŽB‰_qá||Š+ÚÿÝwxgÖ—S§Nå½÷ÞãøsçÎÅÍÍ“'O²yóf^zé%¢££•Øä¥¥¥”””0uêTepÀÞÞžG}T/L”!õÖxžõä¾pgÒÕ©›ou]úÌ·ŽÉgðæåå1dÈüýýیՖºº:.\¸`ÒôèfèN€iÓ¦QWWÇóÏ?OUÕÞ¨¼fͽ©òùùùÊl‚¬¬,Ξ=kÔòæææ,]º”ÊÊJ–/_®Ì|ŠŠbÆ <øàƒ¼õÖ[,Y² ž}öYåm›7oæ‰'ž 22’°°0âããõ* ]»v±qãÞê\__Ï/~ñ H~~~›i7v[¾¾¾>|˜W^yEw…è.Z-Üü(ÊÁMŸÿïWsNœ†Ì\Èÿ ~®ïþ4õR÷@1‚`¨wÛϹµ–þ;TEEÓU®téÒ%9räGŽiu™ëׯ½›7,o~ÜÈÛV«Õ\¹r…””Š‹‹)**"??FƒJ¥êTºtmCké:À™Y[·xÄØÌÌLï"¥µíwW¾ŒY¯®/ÒZŒ¼›ã³u×1$n^và=†/úOÌÝŽxNƒ~£àôßá§} mì¾ôYX7Åî7òŽ-žV§¶µ­›_ˆ¤»¾h¯ŽÐÕ¥fffpäÈjjjÈÍÍ`ذaøúú*¼999]>]©ouõýÍy´±±ÁÅÅEɇ1yÖQ©TØÛÛt½fè¾3U%:Y-™CäXø¿ƒm‡jÈ*…¿ÄÀ/Bš\»ÚMNȇ½'¡¾ƒ*×VÕ´Í;º -,:t¨CW£ÑÇÁƒÙ½{7...„††¶Û;vl§ê­;í<ëÉ}acÓÕÕñ.cêæ[ÙG—>ó­eòÞÿ÷ÿþ³fÍ",, [[Ã:Ë J f]GÑtã&Z½ÿêÒ¸qãF½ÁYsss¬­­éÕ«—Ay4dy/// Ä—_~©Ö ¢¢‚>ú[[[,,,'&&†êêj½;!ß}÷‘‘‘Œ=ZoÐà믿Öûw^^^ÓµJ;éïì¶>ûì3Ü¢;­|–ü ¼[é0˜›Ãð!M€úzø© ÎCáy()ƒKP^ÆÞ 63û¾àìØôqs…nàåÑô_C—¥eÀþÃðâ³wEQëBé#taiÂÃÃ[t–uš×•7®–7¯¦Ø¶.4J¥Âßߟ€€æÌ™ÃÁƒ[IeHºÚ{¹Á­Š‰Õù2f½Íõ<%ÍM¾EW{³ÖPÃÀßÚ€Ëh8£iÆ®y'bˆ[;˜çÁï(8eÉp%L8]í.Üí‰uª1õIGuhóz$00¸¸8òòòÈÍÍÅÑÑ'''†NFFW¯^%;;/XºÌÛhï-,,”ÙÆæ¹£ë’Îî»;¡úoçn C;~ÉÙõð÷£0ÈføÁW0fï9Õ4{·ÃsןØ÷NS__ÏÆ:t¨{VÇÖÖ–Ù³g3bÄÖ¬YCJJ ¡¡¡Êûƒ 9®M]Gšê<ëh ¡'÷…MWgʯ³uó­ì£KŸùw‰M½ÂI“&±oß>¢££0` ÀÙÙ™¾}û¢R©077§®®Žêêj._¾LII çÎãçŸfÔ¨Q˜››sþüy“¥G×áÔÅø‚¦»ÎÎ΄‡‡+/…ð÷÷G­VsãFdž.¯»‹RPPÐb‡V~caaÁœ9s˜3gN«Û»ùÎwuu5••ú‡;žAÒ¿£·uãÆ ._¾,gŠÝ)ç,¼²ÆÃÜ{šf˶݃ûÏìÞ›ij ªª4PS ÐÐØ4õÁÒ¬,A¥[èÓlm; M«mšQ}Ne»ë]QÌõõõ>|µZ­ÄAl>(¡ûN§®®Žüü|ƒ_ÚÙö©³Û®¯¯gË–-ðôÓOë] w¥#§²L¸ IDAT{4«°°Áƒõ³¢¢¢[²Ÿº#_ƬWÖ©´´´Å#¥¥¥&ݦ~•?ý{8 µÑ++°²›~`7ÌL¡ÌÖF<ÒôÑ6Bu)Ô”Cí5øùú-¬›¶©»(¬¾Ðþ‹áî’ÁÝžV§vf[­]³è¾kïpذaXXX™™Inn®2sO—ÎŒŒ Ξ=ËÌ™3o˾,))A«Õê \ÔÖÖRVV¦RΘ¡N§ùÌS_¸3éêLùuwÝlêò–>ó-¨kL½ÂùóçsÏ=÷™™INN¥¥¥Ê››BöêÕ ggg\\\xàðóóÃÉɉõë×›t€WwB6¿ ›1c¿ùÍo¨­­%%%…””¶mÛFDDD›wš3tyÝÝ¡övÝoöíÛÇ÷ßßêonž¦ÞÙ˜-ÙÖÍ/ŒBt­Rš>Þ^Ú4àëbDOÕÖ¦éãÒMi,(†c©p4 Ê.ÞUÅ[[[Ëßÿþw*++Y¸p¡2«Hw÷9))‰{ï½W/œîfåK/½¤¼À”ººíŠŠ jkkquuÕë`•””™™‰V«mqÁnÔj5111z/ü¸~ý:±±±Ý¾¯º+_ƬwàÀØÙÙqèÐ!Ư<‘tõêU½¶ÞîcHü›ÃЦÏídfj¦OG®ä´=À{— îöÄ:ÕvvvxyyqôèQî¹çeõõõDEE)aš_÷ 6ŒôôtÊËË•—™yzzbccþ}ûhhhh1ˆs«”••‘””¤\ÇhµZ¢¢¢¨««cÔ¨Qʳa]­Ñûîv·Q¢Ù5±Ô7À÷Y†ý¾²~Ìmú@ÓŒ[X[A]=ÔÖÃNLX47kšQ8àÎ.¯‘#Grøða¾ýö[î¿ÿ~½Y¢Z­–˜˜à?7~<<zgêzÑ9&à-,,ÄËË‹àà`½x´Ð4Å\«Õ¶›£¾¾^ï-¼]eeeży󨬬T^`iiÉ3Ïø ùùùìÛ·¤¤$|||°³³£ººšÜÜ\.]ºD`` òÂCKKK-ZÄúõëYµjcÆŒA¥R‘””ĵk×xòÉ'»­Ž4ö<ó÷÷'33“µk×FUUqqqøùù)ã0ÿM}acÓeLùµVšªn6u_º+u½¸Cx?ùäæÍ›Ghhh‹ÜöÞ š••ÅÞ½{)//7I:¬­­yþùçqrrbãÆJü(lll8þ¼Þଗ—AAAmÞÝÑ}oÌò\¼x‘û￟ýû÷+1{{÷îÍSO=EYY™2 xêÔ©ìܹ“ÂÂB½Êîá‡æ÷¿ÿ}‹ÀØÆvB¡iæowoKabÅ¥MŸý?4ýÛÆ<Ý›>®ýþ?×ÁÔ½›fðr—ºQ MSH‡ËWšbø^ª€ — è|Ó6ëîÎØÛÙÙÙÊKk énqÿþý¹ï¾û˜>žÆÆF<==yì±ÇðõõíÖ:Ò˜ólÆŒܸqƒøøxvíÚ…§§'‘‘‘ØÚÚv8ÀÛûÂÆ¦Ë˜òk­þ4UÝlê¾tWëzщ±¿Y³fiol­P -è‰'’€¹¹9ƒfàÀ¸¸¸(1xÍĮ̀­­¥ººšòòrJJJÈÏϧªª ___ªªªZÄ·kË„ X¹r%'Ož$33S9èÜÝÝñóóÃÑÑ‘ÔÔTþô§?)ªÍÍÍÙ¸q#NNNÄÇÇSTT„‡‡&L ¬¬ŒAƒ±gÏþñPUUÅôéÓyá…8pàÇŽãøñãF-?~üx^{í5ÊËˉ‹‹£¶¶–)S¦àîîÎ+¯¼Â©S§ðôôdíÚµ˜››Kee%Ë| äyÅŠøûûóÈ#è•ÅäÉ“yùå—yá…8sæ @‹´'$$˜d[B´¦µ¸A­½äP÷èFóÿoï»¶þvìØ±žSxOþ®U™¨å5käU©ÀÒ,þýihhzŽ®¾jëšâõšŠ÷@xg…œ¢Çhlläúõë­¾|õÇdÓ¦M|øá‡X[[Ka ã]ɃÏÞƒ»¢ç{î¹ç åñÇ—Â]RWߥCB~÷nÇÂfúÃäa{•„BôT&ŸÁûÐCqï½÷rúôi²³³ÉÈÈàðáÃÊ[ uÌÌÌpppÀÅÅ…)S¦àççÇ€X¿~½Á¼:£FRâCAS\°ÂÂB¶mÛFtt´ÞLÛÆÆFV®\É“O>Ipp0AAAäææ²bÅ .\¸Àë¯¿ÎØ±cÙºu+ÉÉÉ$&&2iÒ$\]]IHH0jùcÇŽñ /ðè£2sæLÌÍÍ9{ö,~ø!MQ鋊ŠX¶lK–,!$$JKKùä“OØ»wo§÷Ekiï®m !º ,ö}ošu5j›^²Æ- ·2r„ìCÑ£hµZV®\ÉСCyöÙg•›ÜÄÅÅ1xð`ƒß/Dû#2¸+„èT–ð@0ŒõØ 8}Þ´ë77ƒ1ƒ`š8ØJy !ÄÍL>ƒ÷å—_Ö –¬S[[Kmm-Z­–^½z¡R©Z<†ÔØØÈ»ï¾kÐÛ…w™ÁÛšxý}(<÷¥ÝÓV½Ø4kXˆäÛo¿å»ï¾cÔ¨Q`ffƱcÇÈËËcÙ²eI!‰Î¹V1OÊஸ#È ^Ñ]Ê*!!¯i ·º¶óë±³Qžæ ö2°+„m2ùoß¾}ùÅ/~Á¨Q£ŒŠ#UPPÀž={ÈÉÉ‘½"Ä]Hx»zÁ_}'ÏÜ=iåÏýÐW-'€è‘uÚ?ü@\\—.]¢W¯^¸ºº2oÞ•×á\!—@q)”]„ò+Pqµi毱TVàhÎŽMºÜš>ÞAÝ[Ê_!„B!„¸ÃɯBÜMìú4…Jò×ÿ^«…ꨮ†j ÔÜ€úhø÷ÇÂ,-šfÛXCoÛÿ|„B!„Bq×’^!„è ÌÌšB(H!„B!„⿊¼%G!„B!„B!îR2À+„B!„B!„w)àB!„B!„Bˆ»” ð !„B!„B!Ä]Jx…Bô¯½öK—.åÊ•+RÿÍïÿ{V®\)…!Lj&QTTÄÒ¥K‰¿«Ò½~ýz^xá…Ûš†?ü×^{Ídeüì³ÏòÏþSJ!îW®\aéÒ¥lذῺ´Z-III|ðÁ¼øâ‹<÷ÜsüñäË/¿¤¬¬Lú§Ò'] ¼B!z[[[z÷î™™Ù]›‡ÂÂB¢¢¢¨¬¬ìòºŠ‹‹Ù½{7ýû÷gÞ¼yr€ôcDˆ»)ë9!„wO®ÕjÙ¸q#7näÚµk„††2kÖ,<==IJJâü#Ò?½ûLúÄ=“¥Bˆž`ÅŠ=¢Ó¼gÏ‚‚‚°³³ëÒº.^¼Àüùó1b„ =äBê9!„wcž––Frr2ãÆãþç07ÿÏ|ȈÞ~ûm>ÿüsÞÿ}½¿IÿÔôûLúÄ=“ÌàB!z ­V €•••†B!„¸­²³³¸÷Þ{[ à:991iÒ$ªªªþkC5ÑU2ƒW!D°~ýzòòòøóŸÿ À† ¸|ù2O=õÛ¶m#??[[[ÆŽ˼yóHNNæÀ”––bggÇܹs™0a‚²¾çž{ŽÙ³gãããCLL çÎÃÞÞžÀÀ@î¿ÿþ§eee|óÍ7RSSƒ‡‡“&Mbܸqz?­_¿žk×®±lÙ2¶lÙBzz:ï¼ó6l ++ €Õ«W3`ÀV®\I]] 11‘Ë—/ckk‹¯¯/ôëׯղذaÉÉɼÿþûØÛÛóî»ï¶¹mµZmpú»Z®7ûì³ÏHLLdõêÕ-òóç?ÿ™sçÎñþûïckkKzz:111”––R[[‹ƒƒAAAÌ›7kkëËøŸÿü§Þ1bÌ~{ï½÷¨­­mÏ866–íÛ·³jÕ*\\\:µÏ„¸¥§§³ÿ~Š‹‹±³³# €1cÆ´ùÛŽÎϵk×¶ZϺ|[Œ9窫«Ùºu+yyyh4¼½½Y¸p!ªÓ©ºZÆm9sæ ß}÷………ØÛÛãççGDD½zõÒûÝõë×ùöÛoÉÍÍ¥¢¢gggÆÏÌ™3±°°^ˆ[¬§ôU õóÏ?PQQѢΘ9s&ãÆÃÁÁ€ýû÷³sçN^|ñE|||ô~ûæ›oRSSÚ5køôÓO¹zõ*Ë–-cûöíJ˜]ýîîî®·lqq1ÿú׿øé§Ÿ¨¯¯ÇÓÓ“yóæ1tèÐvóoLyýúõ§©ù5LCCÏ<óL›eøØcÞåv÷æë&ccÊ[Ü:>>>ÔýC·ÓZ‹Ã!±9„w’'Ÿ|R AèINN¦¢¢‚Y³fššJYY x{{Lii)IIIdgg“˜˜HXXÇ';;›¤¤$ÆŒƒZ­à»ï¾ãçŸ&&&www©®®&11‘ÌÌL”¶ñìÙ³¼óÎ;\½z•àà`†Êùó牋‹£¶¶???½tVWW“ššJQQƒfìØ± 8•JŹsçxøá‡ ÇÁÁ/¾ø‚ï¿ÿžŠJ¥âäÉ“œûì3;v,ýúõ#99™ôôt4 AAAxzz*Œ†œŸ­ÖsƜ߭1äœKNN¦¬¬ŒÔÔTÔj5ãÆÃÞÞžäädNž<ÉôéÓ•s³»ê†ãÇ£Ñh˜>}ºÑeÜš½{÷RSSÃ?üÀ!C=z4†ÄÄDÒÓÓ™8q¢’§ŠŠ V¯^Íùóç Âßߟk×®qôèQ ;v¬\ï ÑnܸÁÁƒqww'$$¤GõU effFRR'NœàÊ•+ØÛÛÓ·o_%VVV¨Õj,-›æ!ÚÛÛ‹µµ5þþþz´{öìaúôé >œääd®^½J|||8ÁÁÁJ]MaLjj*‘‘‘Ê@ðñãÇ”2(--åž{î!22ò?ƒ]––8p€’’¼¼¼hlldÛ¶m¨Õj^}õUe |êÔ©¼þúëìß¿Ÿ_ÿú×&ë/’¦›™™™)õ¹ÎáÇ)++#""___“´»]íw&o¢ûɰºBˆË‚ÐÐPåß}úôA­V3dȽGfÝÜÜ”‚ætñÀšwºæÏŸ••iiiTVVRPPÀĉõ¶´´dîܹhµZN:Õ"m .ì0>®¹¹9fff(/MÓ]Àÿå/éô@aómw&ý]-׿,-- á§Ÿ~¢¢¢Bù>11GGG†ÀC=ÄÛo¿­tbuÒÚÚÚ6×ß^wv¿uرê¦}&Ä­¤ _0{öl½‹m;;;f̘Ñâ÷9?Mµ¼±ç\óIº‹_hüíκ¡«eÜWWWÆŽ«×NÍ›7•JÅéÓ§hhh 55•àà`lllÐh4h4jjj˜»’oÝ CºsŸ q«µw#¢µ 8cÏOS/oè9§‹ëx»ê†®”±±•‹|]zÃÃÃ[ bè4Ÿ&„¾jWúQ­©¯¯gãÆ :T‰C®ckkËìÙ³1bkÖ¬!%%EàuttÄÛÛ›ÔÔT.\Hbb¢òôWs†Ôïõõõ×±¦è/w¥Í©­­åã?ÆÌÌŒgžy¦EzºÚnÞμ‰î#{E!„hCII Z­V¯#X[[KYY™:@÷(Óùóç[,¯û®³±5 —/_ÆÉɉéÓ§3}útêëë9zô(›7ofß¾}<òÈ#]Êcw¦ßPfffŒ3†ƒrõêU6lÎÎÎJ‡|Ë–-ðôÓOë]Ìtvð¹3ùnþÈ Ž.Öñ­ÜgBt7Ýc¯……… 666rà !}ÕnciiIAAeeeL›6­ÕAVGGG å uhh(Û¶m#//””F…­­­ÑipuuUêçÀÀ@½¿%&&R\\Ì‚ n{Y«ÕòùçŸSZZÊóÏ?¯ô‡MÕnÞ‰×Â4$¯Bц²²2’’’ô:\QQQÔÕÕ1jÔ( )^¢——GåòåËz¯¨¨(ÌÌÌ0ºcM±ÂV¯^ÍÞ½{õ:Ⱥá466v9Ý‘þÎÐÍ*‹ŽŽ¦¤¤„‰'*«¨¨ ¶¶WWW½NlII ™™™hµÚVXL™o•JEyy9555zéJIIÑ[ï­ØgBt7Ôj5111zî_¿~ØØX½ßvöüÔ}×ÕóÛÔç\wÕ ])ãö\¼x‘øøx½rýöÛo©¯¯WêUÝ ¯¤¤$JKKõ–ß·oëÖ­£²²R|!¤¯jt_Õ#Gޤ´´”o¿ý¶Å@¤V«%&& Å¨àà`¾úê+jjj˜0aB§ÊÊÃÃGGG:„F£Q¾×h4ìØ±ƒÜÜÜ6g÷ÞÊþrTTiii,Z´¨EY˜¢Ý½S¯D×É ^!„¢ ööö|ñŤ§§ãââB^^ÙÙÙ 4Hé\š™™±hÑ"Ö®]ËêÕ«7n666¤§§S\\ÌÌ™3•øU6Êÿ~ÜéСCáïïOÿþý9pàUUUôïߟK—.‘‘‘……E§;¸Í™2ý]áååE¿~ýˆ‹‹ÃÚÚZïmîÎÎÎ899qðàAÊËËqssãÂ… ¤¥¥áììLII [¶lá0ø1ccóíïïOff&k×®%,,Œªª*âââðóóS^b¢ËGwï3!º›µµ5 ,`Ó¦M¬ZµŠÌÍÍINNÆÕÕUƞŸ7×s#GŽìÒùmês®»ê†®”q{¼½½Ù´i¸ºº’““C^^~~~)¿‹ŒŒäwÞaÍš5L˜0µZMNN¹¹¹Œ7®Å,b!„ôU é«qâÄ 6mÚDpp0>úh›Ë>øàƒäçç³oß>’’’ðññÁÎÎŽêêjrss¹téz/ÓåÑ××—ÜÜ\úô郟Ÿ_ç¿þ³}ýúõ¬ZµŠ1cÆ R©HJJâÚµk<ùä“·½¿œ••Ett4...ØØØpüøq½¿;::âããÓ¥v·yÛÐÝy3ôئ!¼B!Düýý aïÞ½¤§§ãààÀÌ™3¹ÿþûõâ'2„W_}•o¾ù†'NpãÆ ÜÝÝY²dI›ñ[@`` )))\¾|™   –/_NTTYYY$&&¢V«ñòòböìÙ 2Ä$ù4Uú»ÂÌÌŒ±cÇMhh¨Þ "ÌÍÍY¾|9;vìàÌ™3dee1pà@žþyœœœøøã9uêsæÌé¶|Ϙ1ƒ7S¼@g IDATnÏ®]»ðôô$22[[[½A++«[²Ï„ènáááØÙÙCBB}úô!88˜ˆˆ–/_Þéó³­z®³çwwœsÝQ7t¥ŒÛ3fÌfÍšEll,§OŸÆÙÙ™yóæ1gν™hnnn¼ñÆìܹ“Ó§OsýúuúõëÇ¢E‹˜2eмGé«vº¯Z__Ouuu‡1U*/¿ü2 ;vŒœœªªª°··ÇÅÅ… 0zôèVã 3F¹!Õ•Öñâ‹/E||·,-ÑÑÑÄÆÆbeeÅ»ï¾Ë—_~IBBO>ù$¡¡¡]^ZZŸ|òI‹ïU*nnn„……1iÒ$,,,nI~?üðC.]ºÄêÕ«å@=’ ð !„í(,,ääÉ“Lž<;;;)!„­²µµ¥wïÞ˜™™õè|ÝIíbO-sÑ3UUUñ׿þ•‚‚ñ÷÷ÇÚÚšââb:DBB¯¼ò ®®®Ýž–ââbvïÞS¦L W¯^ôîÝKKÓ 6 ooo´Z-.\àìÙ³lÙ²…'Nðì³Ï¢R©ä‘kÑE2À+„BtÐ)Ú³gAAAÒ)BѦ+VüWäëNj{j™‹žéË/¿¤  €ûî»x@ïÆÄ‰'øôÓOùôÓOY¹re·ß´¸xñ"óçÏgĈüêW¿âW¿ú•É·À¬Y³ô¾«­­åïÿ;)))|ÿý÷Ü{ï½r€ÈµŒè"‰Á+„B!„BÑMòòò8uê&L ""¢ÅîèÑ£ ãüùóœ;w®ÛÓ£Õj°²²º-åÑ«W/–,Y‚111ܸqC!ºHfð !„è1ÒÓÓÙ¿?ÅÅÅØÙÙÀ˜1cÚümLL ¥¥¥ÔÖÖâàà@PPóæÍÃÚÚ€µk×’••ÀêÕ«0`+W®4xù¶ÔÕÕqàÀ¹|ù2¶¶¶øúúA¿~ý”ß•••ñÍ7ßPXXHMM Lš4‰qãÆé]¼÷Þ{ÔÖÖ*iÓ‰eûöí¬Zµ  )Nâµk×X¶l[¶l!==wÞyµZMqq1ÿú׿øé§Ÿ¨¯¯ÇÓÓ“yóæ1tèPeׯ_çÛo¿%77—ŠŠ œ?~<3gÎÔ‹¡fh…w¦ŽÎáýû÷³sçN^|ñE|||ô–}óÍ7©©©aÍš5|úé§\½z•eË–±}ûv222ðööfáÂ…¸»»ë-kH=P]]ÍÖ­[ÉËËC£Ñ(ëóððP~Ó^}ghýº~ýzƒÓß<mCCÏ<óL›åûØcnT½jl;×Ü|ÀÙ³gùðÕǯ“’’ظq#®®®¼ùæ›Êo£££Ù½{7Ë—/Çßß_/_íµ‹†îctt<Üûטý¥tÛ³g888Š¿¿?o½õ¿ûÝï”™]m÷…Ø¿?÷Ýw_›¿™9s&NNNÊ૱ýACÿ 6œœ Àû�½=ï¾û®Òo\³f NNNFŸ#FFYZ2uêTþõ¯‘••EPPÑýÍçž{ŽÙ³gãããCLL çÎÃÞÞžÀÀ@î¿ÿþ° )[CÛ»7rùòežzê)¶mÛF~~>¶¶¶Œ;–yóæ‘œœÌ(--ÅÎÎŽ¹sç2a½õšoC÷uGu¶èY,|||þ¨û‡îníq‰k$„¸“<ùä“RBO\\Ÿ}ö Œ;–~ýú‘œœLzz:†   <==8sæ }ô–––L˜04 IIITTT €‡‡*•ŠsçÎñðÃŽƒƒƒÁË·å‹/¾àûï¿gÀ€„††¢R©8yò¤ËÜÜœ³gÏòÎ;ïpõêU‚ƒƒ:t(çÏŸ'..ŽÚÚZüüü”õ=z”††%†šÎ¹sçÈÈÈ`úôéôîÝ€äädª««IMM¥¨¨ˆÁƒ3vìXòòòøàƒ¨­­%44ooo²²²øá‡ðóóÃÁÁŠŠ V¯^Íùóç Âßߟk×®qôèQ ;v¬Ò_0$Bˆ;WGç°££#±±±X[[ãïï¯7 ·gϦOŸÎðáÃINNæêÕ«ÄÇÇ£V« ÇÞÞžäädÒÒÒ˜6mšRdeeuX%''SVVFjj*jµšqãÆ)ë;yò$Ó§OWÖ×V}WXXhpýjLú“““©¨¨`Ö¬Y˜™™áââÂèÑ£•OPPeeeTUU1kÖ,œœœŒªWiçnVUUEFFÇÇÙÙ€~ø‚‚ª««™¢¡¡ñãÇãääÄ‘#G(,,¤¢¢‚ñãÇ+7$»Úî ñ¯ý •JEDDD›¿éÓ§C‡ÅÑÑQùΘþ ¡ÇÿþýQ«ÕäææÉôéÓqrrRú3fÌÀÖÖÖ¨s¤­ÁÓäädüüüZ ŒêÔÔÔ””ÄàÁƒ•8½ÆÔ‹ß}÷?ÿü3111¸»»Huu5‰‰‰dff¦üöøñãh4¦OŸnTÙÚÛÛÔÞ¥¦¦RVVFBBÞÞÞSZZJRRÙÙÙ$&&ÆðáÃÉÎÎ&))‰1cÆ V«Î·¡ûº­:[ôLÝ6ƒ×ÊÊJé BÓŸââb“nã—¿ü%?þ8+W®$%%¥Åß#""xúé§IIIió.…¥¥%Ÿ|ò ¼ð œ9s†§Ÿ~šˆˆŽ=Ê[o½ÕêróçÏgÙ²e¼ôÒKœ:uŠÞ½{óÉ'ŸàèèÈï~÷;òòòZ,3mÚ4þ÷ÿ—´´4^}õÕwæ~ûÛßF—^SY±bþþþ<òÈ#&ÝOŸ}önnn<þøã”——óÕW_‘‘‘Áš5kä B˜„F£á›o¾ÁÉɉW^yEyñìÙ³[­kŽ;†••/¿ü²2ð©ÕjY·n^½êååEaa!ÐtG\wálèò­©««#99™àà`–.]ª|£Ì 0`[·nÅ‚+V(ç¹sçò·¿ýƒNÿþý;U^„††òüóÏceeEcc#Û¶mC­Vóꫯ*Í©S§òú믳ÿ~~ýë_³sçNY¹r¥2³cîܹìÚµ‹ýû÷“––ÆèÑ£ Êc[ƒBˆÛÏÐsxðàÁ¤¦¦©w 0~üxe¹ÒÒRî¹ç"##õúà ¤¤///ƒë!hŠÝ8räH|ðAe}æææ:tˆ²²2½Ù¢7×wZ­ÖèúÕôßÌÌÌŒqãÆé}wøðaÊÊʈˆˆÀ××ÀàzÕØvîfìܹ“¬¬,† @NNîîî”””““Chh(?ÿü3ùùùøùùµ:ó­­vÑØýÒcއ›²¿êëëÙ¾};¼úê«J[>cÆ þô§?uºß Dk(//gÈ!F-×]õ•‡‡eee 4¨Õt{Žt–n°ñÒ¥KÊw†Ö‹:¹¹¹<üðÃÊD­VË×_Mll,Ço1KÖØ²urr2¸½«¨¨à‰'žP¾ á…^àܹs¼ñÆÊulܸ‘sçÎ)ûÏØ|²¯Û«³EÏcòé3½{÷¦wïÞ :”E‹±`Á,XÀüùó•·œ¶÷1匞ݻw“——GHHH«'µn ÖÃÃýû÷·hœ'NœØ¢cÖ–êêjÖ­[‡¹¹9¿ýío[Kzz:555n/55•ï¾ûŽûî»|íÛ·+ûõ¯Mß¾}ùóŸÿÜîÀlBB Ê¿­­­Y¸p!EEEüãÿ¸+²ßþö·r¦ !º•n¢µÃÖfV©Õj®\¹BJJ ÅÅÅ‘ŸŸF£QžûŒyäŽ=Êùóç7nS¦L!>>žC‡ÉQ'„&ÖÞ€ak„„¾úê+T*þþþ0gÎ>>Ü{ï½dffràÀV—;tèAAAÌŸ?ŸC‡”~FÃÚµkyûí·Y¾|9o¾ù&¿ùÍo¸zõ*}ô‘ÉófggÇâÅ‹  _¿~\¸pØØXvíÚÕ¢R4h‹/fèСXYY‘ŸŸÏæÍ›[tJÔj5Ë–-ÃßßµZMVV7nä§Ÿ~R~³bÅ œYµjK—.U*¶ÌÌL6nܨÄyÑý¶½Ø¾fffüö·¿eÖ¬Yüío#::ZÎL!„Qt<2xð`½¿µ¸hܲe <ýôÓzBCM»º¼F£áòåË8991}út¦OŸN}}=GeóæÍìÛ·¹sç*ýÖ:ÿ@‹ø»­…þÑÅW3ä¢C÷ûÀÀ@½¿%&&R\\¬¤©¡¡A‰ß¨SWWG~~>666çÑÔñÞ…¦cÌ9ʶmÛÈËË#%%…Q£FakkÛ©ÁŽê¡ t9oºAcê×ÎÒjµ|þùç”––òüóÏ+/7»9-†Ô«Æ´smÑ;ÎÌÌ$77—¡C‡*ßdddpöìYfΜyG †uçñ [iii‹p7O8êj»/À¤I“ÈÉÉaÏž=mö’““>|ø-¯¯ºrŽtV}}=‡F­V+õ1õ¢NII Z­Vï†Pmm-eeeJYš¢-0U{×^zŒÉ·7ë¶WXk4¶nÝʦM›Ø´iS›±On…šš>þøc¬¬¬xúé§Xºt)Z­–>ú¨Íx¸€òÖÈåË—|§êäÉ“DEEÈ_þòœœœøë_ÿJee¥IóÕ¯_?>þøc&MšÄ‰'øú믩¬¬ä‰'žàõ×_×ûí¨Q£øðÃøKKK%0yPPo¾ùf‹™¶¶¶¼û››óå—_ËèÑ£Y½zµÁw“dpWa >>>¨Õjbbbô_º~ý:±±±z¿­¨¨ ¶¶WWW½z½¤¤„ÌÌL´Zm«í‚î»Î.ß¼S¼zõjöîÝ«|gii©¼4¡±±;;;¼¼¼8zô(—/_ÖëGEE)Úê¨T*ÊËËõ UTT´úÒÖxxxàèèÈ¡C‡Ðh4zmùŽ;ÈÍÍ¥W¯^øûû“””Ô¢c¿oß>Ö­[§´s†äQqç2æÖ=±÷ÕW_QSSÓæ{/LQ™âÑScë×®ˆŠŠ"--E‹µ¸`×Õ݆֫ƴsméÕ«Æ #==¢¢"åEožžžØØØ°oß>Z ¨¶¥½¶®«ºûx8p vvv-ÖõêU½py¦h÷…€¦ÁA///ââ∎ŽnÑÊÎÎfÿþýØÛÛ+õê­¬¯ºrŽtFmm-Ÿþ9•••Ìž=[yºÁ˜zQ§¬¬Œ¤¤$½º)**Šºº:Fe²¶ÀTí]k:“ocI=ÕóÝ–9Ý~~~Ìš5 sss‰‰‰Qfþv—cÇŽOXX¿ûÝï`×®]z³RÛêànÞ¼™Å‹³`ÁvîÜiÐö>ÿüsƧ§'ßÿ=ÇŽ3yž–,Y‚……Ï>û¬fóæÍ<ñÄDFFF||<æææ,]º”ÊÊJ–/_®„£ˆŠŠbÆ <øàƒ¼õÖ[@Ó íÞ½{õb744§§§^yyyy±k×.6nܨW!þâ¿`àÀäçç·›~333ž{î9ÜBt™µµ5 ,`Ó¦M¬ZµŠÌÍÍINNÆÕÕU‰ïàì쌓“¤¼¼777.\¸@ZZÎÎΔ””°eËxàz÷î­Ü°Ò=Õ1räH£–¿™——ýû÷çÀTUUÑ¿.]ºDFFL˜0333-ZÄÚµkY½z5ãÆÃÆÆ†ôôtŠ‹‹™9s¦^ü3233Y»v-aaaTUU‡ŸŸŸA7Xuñ6ׯ_ϪU«3f *•Ф¤$®]»¦<&É;ï¼Ãš5k˜0ajµšœœrss7nœ2«Ì< !î\ÆœÃöööøúú’››KŸ>}ðóóëÜE‰õPW[¿vVVVÑÑѸ¸¸`cc£¼m]ÇÑÑ___ƒëUcÚ¹ö(ï ÑÍà577gذa¤¥¥akk‹··w‡ûªy»dú‹Ôn>T*=ô6là­·Þ"$$„ÆÆFŽ?ޝ¯/éééJ>í7ÑVÝóÔSO±nÝ:vïÞM||<ƒF­VSZZJVV*•Š%K–(³BoU}ÕÕs¤#§OŸV‰µZ-/^$??ŸÊÊJFŒÁÔ©Sõ~oh½Ø¼úâ‹/HOOÇÅÅ…¼¼<²³³4hP›}ÎΔ­©Ú»¶›ocêÓ›ëì'N°iÓ&‚ƒƒyôÑGåí!L>À{óÉÙ½ƒÓÏÏOyàĉ&Ÿéª³~ýz‚‚‚˜5kååå|õÕW-·sçN¦L™Â£>Ê?þ¨o»»»»jÈ!¨T*“¾ÉЂððpbbb¨®®ÖëL|÷ÝwDFF2zôhâããñòòbРA|ùå—z±†+**øè£Z}úLDD„^\[sss–/_ÎŽ;8sæ YYY 8çŸ'''>þøcN:Åœ9s”‹áÀÀ@RRR¸|ù2AAAF-3+++–/_NTTYYY$&&¢V«ñòòböìÙ 2Di;^}õU¾ùæNœ8Á7pwwgÉ’%-bs͘1ƒ7nÏ®]»ðôô$22[[[ƒŸ  âÅ_$**Šøøxñôôä±ÇSfy¹¹¹ñÆo°sçNNŸ>Íõë×éׯ‹-bÊ”)Êl*Có(„¸3{3F¹íÊK ©‡LÁ˜úµ³t× /^ä‹/¾hñ÷1cÆàëëkp½jL;מÀÀ@¶oßNß¾}õÞ¯à èð©ÅÖÚÅîÐÝÇØ1c°µµ%::š~øWWWxàúõëGzz:}ûöíT¿AˆöÆAÞxã ¾ÿþ{RRRHOOšžÌüðÃV'¸!çÈsŽ<÷Üs„††òøãK{g¤ììlŽ;ÆâÅ‹å€ï!L>ƒwÅŠþF÷¢²²2þñÜ’ ëf7ŸÉjˆ¬¬,öîÝËܹs™2eJ»¿}øá‡___f̘Aýúõˆ‰‰!))‰ÇGGGã8^zé%:wîü—¯¨XxÕЂÕ3ýüü´0ˆˆˆˆ…8~ü8çÎÃÛÛ›~ýú©AÄ¢<ñÄ<óÌ3\¼x‘€€Ö¯_À믿^my…E4Fôyw'hß¾=cÇŽÅÞÞ^ý.R­‹¬$p.œ—¥GfAÆ¢*²ÈÚ°aÃèܹs‰ûV¯^mÌd­ »víbïÞ½ôí۷ؾ±cÇÒ¼ysŒ…É ¬ZµŠxoooöìÙÃÁƒ+]—%K–0wî\æÍ›Ç¶mÛ¸rå îî»³mÛ6#_nVV‹-â½÷ÞcÁ‚sãÆ  D½zõ˜5kÖmí„×®]㫯¾â­·ÞbìØ±|þùç™""""w¸>ø@ Ëd21xðà2-.¢1rgš?¾>ïDþ«Ê¼^^^ÆÏüñG±ý:u¢S§N¥¾þÌ™3åðÞ,'n```•x.\H·nÝÌ×îîîøøøÏŠ+н&;;›yóæ1{öl^ýu^}õURSS+UØØX^y寇‡NNN$$$ðÅ_[@.44”)S¦ðÜsÏ1|øp¬¬¬ˆŽŽæÓO?åøñã·½#nÛ¶ ///¼½½ 2[eSDDDDDDDDDJfòòò2¾›_C¥¤\*ͯâïïO:uŒíiÓ¦‘––¦–¹Ë””棠¬ð¾¼¼<³òÂJ*+m_Ag‘{Yµ/²¶`Á#lZZš‚»""""""""""U¤Ú¼‰‰‰$&&ª¥EDDDDDDDDDª˜•š@DDDDDDDDDÄ2)À+"""""""""b¡à±P ðŠˆˆˆˆˆˆˆˆˆX(xEDDDDDDDDD,”¼""""""""""J^‘jòÛo¿áççGXXX©Ç¬\¹???bbb,îþ¦L™Â¢E‹îøz¾÷Þ{øùù‘’’r×÷¹ØØXüüüسgà=B^¹«ÕªU L&“Cî:6j¹›M›6M w-Íà±PšÁ+"""""""r:þ}ºÙë·mÛÆªU«ð÷÷§qãÆdff²uëVöíÛÇ¥K—¨U«íÚµÃÇLJF¯½víëÖ­ãÔ©S$''Ó°aCúõëÇðáñ¶¶.µÎyyy|ûí·ìÙ³‡gžy†Áƒ—û|e=vòäÉ<üðôiӆ͛7sæÌêÕ«‡»»;?þ8¶¶¶Æ±‹-âôéÓ|òÉ'ÆöåË—yå•WXµjÇÀÍÍ‘#GÒ´iS³:>}š_~ù…˜˜œœœèÝ»7;wæ£>âõ×_§S§N7}–ááálÞ¼™„„nܸ““Ý»wçÑG¥fÍšfõ,O½ÂÃÃÙ²e qqqÔ­[—.]ºÐ«W/ ž{ŒfðŠˆˆˆˆˆˆˆÜa¢££ñ÷÷ç?þ k×® 2„ŒŒ –.]Êš5k*|Þo¿ý–Ÿþ™zõêáååEÛ¶m9|ø0Ÿ~ú)ÙÙÙ$''ó¯ý‹°°0:uêÄÃ?Œ££#?ýô .$//¯Äs—Ü-ÏùÊ{í“'O2þ|jÔ¨Á!C¨]»6[¶laöìÙäææÞ´-222˜={6999øøøÐ¯_?Nž ×^»v-[¶láðáÃôèÑ£X¿ûî»bÁ] \ç+ïµO:ųÏ>Ë AƒŒz°mÛ6öîÝ‹§§g©í‘À°aÃðõõ5Êlllغu+ñññ´hÑ‚ììlV­Z…““ï¾û.<øàƒüë_ÿ*S»‡††bkkËÔ©S×çåå1oÞ%ž·ðLÔ&LÀÁÁO>ù„ï¿ÿž×^{ “ÉT®óUäÚEƒ»…ÛéÆ7m›[‡ÅnÖÎ¥]»¨V¬X;w¦K—.x{{TâLì²Ôëf Ý ËÝO^‘;HÁì×sçÎÛWPV4ÿnI Ÿ?Þl;==K—.Ñ A†ÊСCÉÎÎf÷îÝ|ÿý÷lÚ´ÉÈûš““C‡Ì^Ÿ™™ITTöööfåîîîtïÞ€û￟ݻwsàÀz÷îmÜKYÎWžc ÄÇÇ“——gÔ¼qãçÏŸ§cÇŽ•~ÎÎÎ@~^ÜN:™íKHH¸åë³³³ùá‡èÒ¥ &L0 —%H_šÆù)$Z·nm¶¯´\Ïr÷R^‘;HݺuiÑ¢»wïæÒ¥KFyvv66lÀd2Ñ¥K£ÜÎÎŽ‹/rýúu£,99™°°0³ó&$$ðá‡h”ÙØØ‹–åææ³L÷ïß_,€¹iÓ&æÍ›Ç•+WÌÊ WŸzê)Yµj•‘‚ ¬ç«ÈµÏŸ?Ïþýûí¼¼<6lØ@ff&ݺu«ô³hÙ²%uëÖeûöí¤§§å—/_&$$ä–¯ONNæÆ8;;›wããã9yò$yyy%ço¥M›68::²yóf³´×®]cÛ¶mD÷Íใ˜L&FÍܹsùðÃéÛ·/ööö„‡‡ÇðáÃÍò¿vîÜ™“'O2wî\ú÷ïOjj*ÁÁÁÜwß}f µhÑ‚&Mš°uëVRSSiÒ¤ .\àøñãX[[ãéé €¯¯/3gÎdÆŒxzzâèèÈüÁ©S§èÛ·o±£…9::2räH–-[ƺuëxöÙgËu¾ò^»^½z,]º”ððp7nÌéÓ§‰ŒŒ¤U«VÆýT†£FbÉ’%|ôÑGxxx››ËÞ½{i×®ááá7M©Ð°aC4h@PP/^ÄÅÅ…ÄÄD>LÆ ‰ç‡~à‰'ž(1õEij֬ɓO>ÉòåËñ÷÷ÇÃÃ+++8€³³3ÉÉÉH÷xEDDDDDDDî0mÛ¶åÝwßå§Ÿ~âСCdddдiSÆ_,?íƒ>HFF{öìaíÚµ¸ººâëëK­ZµÌ¼¶¶¶¼öÚklذˆˆöíÛ‡££#-Z´àᇦmÛ¶¸¸¸ðþûï³fÍŽ;Ƶk×hÔ¨£GfРA·ÌñÚ¯_?vïÞÍŽ;ðôô¤uëÖe>_y¯Ý¹sg<<< $<<'''†Îã?~Ó<µåÑ«W/jժů¿þÊŽ;pvvæ‰'ž Q£F„‡‡S§NR_keeÅk¯½ÆêÕ«9qâ´lÙ’7Þxƒ °páBŽ=Š··w¹ë5`ÀêÖ­ËæÍ› ¡víÚôìÙ^{í5 ¢{ˆÉËˢ^0HJ¨JÐ,"7SÒWJ Ê ï+üõ“‚ŸoVVÚ¾ÐÐP5ºˆˆˆˆˆÈ=lòäÉôîݛ矾ڮ‘››ËµkרY³&5jÔ0Û·k×.–/_ΧŸ~JÍš5õ@ä¶Q^‘äåå1}út–,Yb6y)77—àà`Z·n],ð+òWSŠ‘X[[3tèP6nÜÈ_|A—.]0™L„††Ã+¯¼¢o½Ëm§¯ˆˆˆˆˆˆˆˆH)žxâ êÕ«Gpp0Ô¨Qggg^ýu:uꤒÛN9xE¤J(¯ˆˆˆˆˆˆˆÈ_O9xEDDDDDDDDD,”¼""""""""""J^ ¥¯ˆˆˆˆˆˆˆˆˆˆ…R€WDDDDDDDDDÄB)À+"""""""""b¡à±P ðŠˆˆˆˆˆˆˆˆˆX(xEDDDDDDDDD,”¼""""""""""J^ ¥¯ˆˆˆˆˆˆˆˆˆˆ…R€WDDDDDDDDDÄBÙ¨ DDDDDDDDªÇ’%K¸té/½ô+W®$**ŠZµjѧO}ôQ8ÀÖ­[IHH nݺŒ1OOO³sœ?žŸ~ú‰³gÏrýúuš5kÆ<@ß¾}1™LÆq‹-âêÕ«¼òÊ+üðć‡3sæL¹víëÖ­ãÔ©S$''Ó°aCúõëÇðáñ¶¶Öƒ±`ÖmÚ´ùŸ‚‚7…ÂoE÷‰ˆÜ ^|ñE5‚ˆˆˆˆˆÜñ<Èùóç ÁÍÍž={’Àþýû‰ŒŒdß¾}ôïߟŽ;ÉþýûéÕ«ŽŽŽDGG3sæL._¾LÏž=iß¾=çÎ#88˜7npß}÷×:pàiii}¸zõ*~ø!çΣ{÷îtîÜ™«W¯²{÷nbbbèÓ§â>"L3xEDDDDDDDªQrr2ãÆ£_¿~xxx0eÊΜ9Ãûï¿OãÆprr⫯¾âÌ™34iÒ„¼¼<~üñG¬­­™6m5`Ĉ|þùç1`Àš4ib\+&&†Þ½{óÆo`kk ÀòåËÉÍÍeúôé4hÐÀ8ÇÚµkÙ²e ‡¦GzP"êŽËÁkee¥ÿ5‘»†µµ5½{÷6¶k×®££#mÛ¶5‚»...dffpåÊbbb¸ÿþûà.€ #FŒ //£G»ÞÈ‘#ànNN¤gÏžØÛÛ“žžNzz:ׯ_gàÀœ8qBIÄ‚ÝQ3x_|ñEÜÝÝÉÉÉáÍ7ßÔÓ‹W³fÍbynM&“‘†¡pYa.\ Y³fÅÎÙ´iS’’’ÌÊíìì¨W¯žÙ9rssÙ¹s';wî,±~×®]ÓC±`wT€·à—ÊšÜû¾ûîã“O>)q_zz: lÛ¶_ý•¬¬,‹~P_ý5...<ÿüó\¼xQ=WDDDDDDäV;ÉÉÉ1+¯Q£†ÙvÁþЧOŸÏåàà ±`wEÞ“'OräÈcÛd2Q¯^=zõêÅ„ hÕªóæÍ³˜ûiÓ¦ ýúõ#00””RSS¹zõ*¹¹¹êµ"""""""÷€‚´ çÎ+¶¯ ¬pþÝ›#''‡:˜íËÌÌ$** {{{5¶ˆ»+¼ÇŽãÛo¿-VnooÏ_|——ßÿ}±¯-ܩڶm˘1c 1¼ÿûßÕ[EDDDDDDî!uëÖ¥E‹ìÞ½›aÆ ¤egg³aÃL&]ºt¹é9ìììèܹ3û÷ï硇2òülÚ´‰_ý•·ß~Û8·ˆX›»ùæ®_¿ÎÞ½{yì±ÇhÑ¢…ÅxEDDDDDDDL&£Gfîܹ|øá‡ôíÛ{{{ÂÃÉ‹‹cøðáF.Þ›ñõõeæÌ™Ì˜1OOOùã?8uê}ûö¥uëÖjl v[¼  I“&¤§§X­×*šƒ·nݺ¼ð téÒ…F‘˜˜È¶mÛX»v­YþšµkײjÕ*Nž<ÉÈ‘#騱#/^dÿþý,_¾¼Øy›7oÎØ±ciÛ¶-µjÕ"&&†7²}ûv³ã¦M›Fýúõñ÷÷çÕW_¥OŸ>¼ð L:•îÝ»°`Á¢££™4iÓ¦M£sçÎŒ3Æx}Æ ñ÷÷ÇÏÏ ?]ÅW_}ÅÙ³gÍ®wß}÷ñì³ÏÒ¾}{.^¼ÈŽ;8pàóçÏgÚ´i>|X£ADDDDDDäÓ¶m[Þ}÷]~úé':DFFM›6eüøñ¥æÔ-ÊÅÅ…÷ߟ5kÖpìØ1®]»F£F=z4ƒ *¶¸›ˆX–ÛàíÓ§-[¶$##£Z¼5kÖ¤OŸ>\¾|™“'Oå5bÞ¼yØÙÙ±}ûv®\¹B·nÝ7n]ºtáý÷ß7;O=xæ™gØ»w/?ÿü3;wfäÈ‘téÒ…)S¦yq;vìÈÌ™3ÉÌÌä·ß~#55•>}ú0eÊZ·nÍ×_mv^[[[¦OŸŽ‹‹ Ç'++‹¯¿þš¡C‡òä“OÞÒÔªU‹Y³fñ矲lÙ2\]]1b~ø!ãÇ';;€¾}ûòÞ{ïqéÒ%6n܈­­->>>ôìÙS#@DDDDDD¤½ôÒK%–—´h|³fÍøòË/‹•7mÚ”‰'ÞòZ/¿ür©ûêׯ_j]DIJÝ)ºtéÂóÏ?ol›L&êÔ©CïÞ½øàƒÈÌÌ4ö?kkk&Nœh¤møþûï7n¾¾¾ôïߟ={öÇ»»»óùçŸó믿š½A?ùä“ 2„mÛ¶o¤999¼öÚkœ?€~ø÷ߟ'Ÿ|’Í›7gœ£]»vüþûï¼óÎ;ÆLਨ(Ú¶m @DDÄM¼-Z´`íÚµ|õÕWFYvv6O=õ-[¶$** &L˜ÀÅ‹™m¶}æÌ™›nŸ;wŽsçÎÛ $$$è©T¡œœ~þùgž~úi¦OŸÎÈËËãÁ¤}ûöøûû«‘DDDDDDDDD,”šàî·|ùr.]º„··7&L ==øøx¦M›ÆáÇÕ@"""""""""Êäååe$¾5™Lf›XB™ˆH’rh—”_;//Ϭ¼ðŸ’ÊJÛªF‘{ž•š@DDDDDDDDDÄ2)À+"""""""""b¡à±P ðŠˆˆˆˆˆˆˆˆˆX(xEDDDDDDDDD,”¼""""""""""J^ ¥¯ˆˆˆˆˆˆˆˆˆˆ…R€WDDDDDDDDDÄB)À+"""""""""b¡à±P ðŠˆˆˆˆˆˆˆˆˆX(xEDDDDDDDDD,”¼""""""""""J^ ¥¯ˆˆˆˆˆˆˆˆˆˆ…R€WDDDDDDDDDÄB)À+"""""""""b¡à±P ðŠˆˆˆˆˆˆˆˆˆX(xEDDDDDDDDD,”¼""""""""""J^ ¥¯ˆˆˆˆˆˆˆˆˆˆ…R€WDDDDDDDDDÄB)À+"""""""""b¡à±P ðŠˆˆˆˆˆˆˆˆˆX(xEDDDDDDDDD,”¼""""""""""J^ ¥¯ˆˆˆˆˆˆˆˆˆˆ…R€WDDDDDDDDDÄB)À+"""""""""b¡à±P ðŠˆˆˆˆˆˆˆˆˆX(xEDDDDDDDDD,”¼""""""""""J^ ¥¯ˆˆˆˆˆˆˆˆˆˆ…º½^‡ø¾=“™o ¤±mc¾1“™oûâî #"""""""""r+6·õê™YØ9ÙagçÃÔYedfêÁˆˆˆˆˆˆˆˆˆˆÜJµxm݆1ÊÓH%·ãƒ©žŒ™äAfئ®ˆ»ù¥l›óˆÿ&wµƒäv…˜i‡SóxzŽâŸžÞ˜3‰%Uù]Úº cÌ@ÂÖ \‹ˆˆˆˆˆˆ8N-´ IDATˆˆˆü5ª6ÀëàΘ·ÇáaÁÖ€hœÝíŒ]·ÑÏÁ‘á>8D¬cEt©™n8ÚÙáìäqi88;a™J\ì­ó48yNbrW;RCfâçLá8ë‚ÆÃ˜¾øMzMòÃ#ÄŸ°´ªm8G·'5Ê »à@ަh–°ˆˆˆˆˆˆˆˆˆüõª0Àk‹û¸qx8tdø˜Žf{í\1Êõ¿}áÏ?§ÂÀ·§ã3n:ÓÿàM d¦Ie¸^óAD—šw²’‚X¼b ½Æ¹3°¹-a‘ ŠˆˆˆˆˆˆˆˆÈÝ¥ ¼Y]µ•Ä©Ãq6ÊR‰Ž#ËÖ™æ®ÿ ÆúpðÀã¿g¦¥â€8¹ãæDR™gÜ:áêœ?¸¨¸uo2!Ä–´Äüànsß/Y<Ή­oŒa®YÀ·9c—.f”m oŒ[@$Íé7fc†¹Ó¦¾#d&ÄÒ+MrdØü¼Ù&ÿ•> Öã“¸Š ã–ààΓÆáíî†k};2“#Y¿‚¥ëÂH2.i‹ÇÌõø;-eÒ¬¼'øÒ¯£+õ3c ^Áœ/C°óôcÒ˜tuu$39ŠËf± (…©EDDDDDDDD¤€u›6mþ§`Ãd2™ý]XIeælqrrÆÝ³#uwðå¬Eü²;Œ}¡ÁºÎ}}:R×H;ή]§¹š‘AJŽ#v§Xüã_wÁ>v7¡'’ȸeÕsIËl‡Ï V´êM¿æ’@bJ¹Æ!\½šFÆ ®^´g O_ÚYïc]è%ã8[·§ysTG®oþ”eûaÀ» x÷á6Æ®à0¢¯7¤]¯þ X—ðÍÁD ç]ÐÌ÷çÓ aÄ\Júù#Ìøú]F´É!f×oì‹&ÍÉCÆ»s2ÛƒNÿwá8kš{†¡­šÒï!OìŽÿBào§ÈríO¯^6`( ¯Ã© õlÞ—BÃ^½è5 Ö;9|5W½VxñÅÕ"""""""rÏ«¢¼˜0ÇÿMÊIØŠõDžT›̲@O¦û8ƒÓpÞœ5bW0}î –‡,cE9®š:‡7¿|“·ÇyÒfÐ8þ9hLÔ0ÂBB%Ú¬;Œ‡Ÿ§7n "ÉŸÄk‹«÷@ê“ÈÒÀh²œ†áëéáà75ô¿Y[|ç°`ŒƒšÛ² ò(G#RÁÛ–¸ÈpŽFgN {s2] gþØ©l,È1±l)î“0ËÛIý‚ùgh¡ Ù97gSƒòL¬Idþ²É´qMåË o²>.¾nP¢3S»âÑÑ‘eqZÑMDDDDDDDDDòYUÕ‰ì̶Rˆ*!ÅBJb‘à¤C‘וWÑëýñóñeÂÛ3ùrÝVDA›^Ã5ùŸ,XÅœ±î8Ç' Žžx»ÙæÙºñÄÀú»Žq@fj~P×Ù÷æ¯Ì".`2>>ãXPZ._'¼;BjH¡i88üèu«ˆÂŽ®ƒÜ°5{QëB µIJ4q©@DÁqÿ{̸h’"/‘{\ÍàM!<,[·æ¸:ÙÎôjî@hŠy”×­—›ñsfj"qq¤VÉõÓˆ;LÜÑ`Ö8¸ÑÏ{ ãÆxÒq”?oGãŸÁùÔ¤@býüðôvcAd$tôÁÓ¢–ç/ì–Æâ/Ùé7œ.Nfbaaá„„Gi©m:ÒpäÏŠA¥äœÐ6B·™)¤e–p\fZµ‹ˆˆˆˆˆˆˆˆˆÜͪ(À›DðŠãƘ™“ð°·qð]º‚uG“È ·ac˜àñßùº±+ðŸFšCžxc&ž2gîQÜ&½mK˜§w(‰ƒ;ÞôÅ)|1sÖY|,-šÐÂÂ'°t®½|Üq & )„ÀX?ü<†ãf‡'ŽD° ´`&mÑë§2&¤žžƒðôôÀÃ{žÞ£ qsÞžEPRéÕJÞ:“YA¥¤QH‹&M}NDDDDDDDDDªˆMUžÌÁ}îFÎW<ÇMų¤]‡1°yÁÉÙ;;¦ÎñÉß—é™e¸X¦Î½ðt‹fEà2âJÈœ•M Pß¶p"ˆü4 ~~ýÞõNv¾Š°‚˜¬CcÜœI$x}$Áëœp6‰™obÒ¸@vÌ:ZüZ)Q¤®v)D=jp¶mL‡ŽÎš©'"""""""""Uƪ*OæÔѹŒ9uhã֜ƮŽde©„lÝAD*@Ž® åÍ-EVa™à<Šéãþ¬KøÑhSÒògáº÷¢M} j)³Ö9ORë¢ü˜Ü¦>¤î`]øÿ&NÈŠXEP¢'ÞÞ³XàDHD*Žnq÷èŠ+‰Däƒ3³€úxúú½#ŒÐhç®bØ‚QŒ[°ÁD$‚SGO†wu&5d&‹f©Ç‰ˆˆˆˆˆˆˆˆH•±©ÚÓ¥ptÅ,ŒÑ©àê@RD,i)YÌÍßëäq”Øæpuv¤¹[cˆK¢±[sÔÄX"#Ê­6%”¹ãÆôÈ|½=póDW»üÜãBXµxÁ%å½M",0 &·!5d…ã®Y‘|ùötýÆò„»7£<ÌT#¶2Å26Í?[ÚÑFMÇ{Ð8&5Ï$<4š´èe¼96‚1~cäáCWGHMŒ`Ç—sX¼þ()êo"w¬ŒŒ ž{î¹R÷[[[ãàà€‹‹ ]»vå‘G¡N:wDÝ÷íÛÇ¿ÿýocÛßߟN:é¡V‘ßÿ 6@vv6:tÀß߀ &œœ À<Àßÿþ÷{º­Ž?Îûï¿ol¿ûî»ôèÑCè·eË/^llOœ8‘!C†¨¯Y¸wß}—ÈÈH:tèÀG}¤F¹MlªóäIëý™ìˆ™¤¤˜Ï^M [ÁÜ0'¾=Ÿ©¤à%%³‚H*óUR8ºqG7–¯nvÎŽ@2Aë£):¯6+)Œÿ0nzÙ0LöaA±×†²Ì?”e7½zaS½ñ.VɬQÞÌ*Z½˜ç¼«·ŠÜF999\½z•«W¯Ɇ øÇ?þA·nÝÔ8w±#Gް`ù;}vvö=Ý&ëׯ'##€–-[Ò¯_?݈ˆˆˆˆÈmdU½§Ï"-%…””Rfã:uÀà •ððü®Nttªæ»¶uÇ×ÛƒŒVÚ)¿ŒŒ >þøcbbbÔw±³m777Z·n}O·ÉÏ?ÿL@@ìÝ»W÷#"""""r›ÙÜÖ«§„²l©#„t4§ˆGð ŒàêÊe`ÛœGü|éÕažŽ¾x=qê"R‚¶mÛâççgl_»vÓ§O³qãFRRòߤ²³³Y¸p!3gÎÄd2©ÑîB—.]2~®_¿>³fÍ2{ÖC† !--Íè3÷ºúõëóðÃÛ 6T'õ5‘jfs»+r4ˆ ãçÆÏÕÃ6ÃñtN&bÝ\f)+®ˆ”ÌÞÞ¾ØLÍ®]»2pà@þõ¯‘@TTǧK—.j´»Pnn®ñsíÚµ‹òŸyæ5R!...¼øâ‹jQ_ù ÙÜSw›É‚qÞÅò抈”UÆ =z4óæÍ3ʶoß^,À{þüy~þùgÂÃùté¶¶¶¸¸¸Ð¯_?yäjÖ¬ivüwß}ǺuëŒíÕ«W³gÏÖ¯_Oll,vvv´k׎Ç{Œ®]»–»ÞÙÙÙìܹ“={öEzz:5¢Y³f´k×///j×® À¢E‹ úßÿn›>}z±\Ãþù'S¦L1¶Ç··w™ê’žžÎæÍ›‰ŒŒäìÙ³\¹rZµjÅSO=EÓ¦M+}Š.î´páB®\¹B@@üñÙÙÙ4oÞOOO}ôQ¬­­øôÓOÙ¹s§Ù¹bbb9r$uëÖå믿n½ÈZjj*kÖ¬aïÞ½$''S¿~}Èÿù?ÿ‡9sæ°ÿ~úõëg´gI}¡¨—_~™‹/{mI÷k2™øî»ï8|ø0&Làþûï //ãÇȹsç¸pávvv4hЀ֭[3bijÿä(©MvîÜÉÎ;:t(¯¾új™üû+ŸãÍ”å~*SçÒTv|U¤.UŸªŒò¾/ܬ¯UE©Èحȸº•ª¸—Êôß””V¯^MXX—/_¦^½zÜÿýøúúÞ²îåý,pæÌ~þùgbbbHLL¤F8;;Ó¾}{{ì1ÍÖ)š@D¤|úö틃ƒƒñÕüˆˆ³ý»víbþüùäääeYYYDEEÅÖ­[™>}:...¥^ã×_eéÒ¥Ævff&‡âСCŒ=ºL¿\HNNfæÌ™DGG›•'$$Àذao½õîîîÜÿýf¨C‡ @9rÄl»¬ SÅÄÄðÑGAÑþù'þù';wîä…^(,.ï=”æÀ,[¶ÌlfîéÓ§9}ú4ááá¼÷Þ{U–n#!!÷ßßì^“’’X½z5'NœÀÎήÚûjrr2sçÎ5RMäååùå—fϹ Ÿ¥¦¦Ãï¿ÿÎË/¿Ì°aê´>–ö«ªÎ*3¾ªº.UÙ§*£¢ï eUÞþRѱûWŒ«òÞKeúÌéÓ§ñ÷÷7>ë.^¼Èúõë9qâ„Ùg\Qý\½z5?þø£YÙ7¸zõ*§NbÓ¦MLœ8‘ê#""""…X© DDÊÇÖÖÖl6YRRéééÆ/ÄŸ}ö™ñK­µµ5­[·ÆÙÙÙìø>úˆ7n”zo¿ý¶Ô}+W®ääÉ“eªkVVüq±_î‹ÎœJMMeÖ¬YÄÇÇÓ¹sgêÖ­kì;xð`±ó>|Øø¹cÇŽÔ¯_ÿ–uIKKãã?.Ä©U«–ñsNNË–-#22²R÷Pš¢‘ÂŽ9Bhh(Çgâĉ¸ººû4hÀĉ?~ü-ï5//O?ýÔì^íííó8q¬ «Ëwß}g–G¸ÀÎ;‹¡°²2ÿgÁ’%KŒœÓmboooìo×®'NdèСÕÒ+ûo¦,÷S•u.PÑñUu©Ê>UQ}_(òô—ʌ݊Œ«ê¼—Êô™ÌÌL>ùä³àna§N*vÞý_rrrX¸p¡8)B^‘ prr2Û¾ví+V¬0~ù®S§³gÏæ?ÿù ,`Ò¤IÆñçÏŸgÓ¦M¥ž?''‡‘#G²xñb/^Ì“O>i¶¿è/Á¥ùý÷ß9sæŒ±íææÆÜ¹sY¾|9ÿïÿý?† bìËÈÈàÇÄÊÊ OOO£<>>žÄÄD³_ü ˜û÷ï_¦ºlÚ´Éø 8ÀC=ÄÒ¥KùöÛo™9s¦ÐÉÍÍå‡~¨Ô=”ÆÆÆ†qãÆ±hÑ"-Zd¶HSA€à¾ûîcÈ!fGGG† R¦¯£ïß¿ŸÓ§OÛC‡eÙ²eÌ;—ùóç›:ªSDDuêÔ¡ÿþ<ôÐC4jÔÈŸ]WÀÙÙ™… òÍ7ß°|ùr^~ùe³~xêÔ)³6)<{±I“& 2„Ž;VK_¬ìs¼™²ÜOUÖÙø‡WÇWuÔ¥*ûTEUô}¡<ÊÓ_*3v+2®ªó^*Óg6nÜhö\ºwïÎܹsùæ›o˜ûŒ7ß|“—^z‰:ù3»uëF·nÝðõõ¥qãÆÔ¨QìBþL»ª`‰Ï±*ë\XEÆWuÕ¥ªúTEUô}¡<ÊÓ_*3vÿŠqUž{©LŸ)xmÔ¨S§NÅÕÕ Äßþö·ëW™ÏÁØØXãg“É„­­­±Ý¾}{FÅàÁƒø`±68p _}õYYY¥>Ïò~®ßÕ«WyõÕWéÔ©=zô G<þøãU–[[DDDän£¯ˆHü2] víÚüñÇfekÖ¬¹é9²³³INN.qEð¢+ÆÅ£)ú‹tQf_±-mQ·¢×º|ù2VVVôïߟ_~ù€cÇŽ‘™™‰YªðWÍo&--Í,(^4Å@ݺu‹¯2÷P’ÂùVB›ªý(¼~ýºÙõ fñ•ô<«;ÀÛ¬Y³R÷ÅÄİqãFŽ9bÌ©–ø«ºÎ…•w|Ug]ª²O•WEßÊ«¬ý¥*Ænu«²ÞKeúLÑÏ–’>lmmiܸq±ÙòE_[žÏÁÇœC‡qýúu ?à|üøqŽ?Îwß}‡““½{÷æ‘G1Ë.""""JÑ "RnYYYf‹Ñ4iÒ{{û Í,O èLß’fþVDÑQ¹ <++‹cÇŽqùòe³ÅmÊx¹ÙjëÕy·CÑ~——Wâq¥•W¥Òòdóüƒ   £ÚÚÚÒ¶m[|||n[ÛÝIϱºë\•ãë¯l¿›å^-¯ê~_ø«Çî:®ÊÛgŠö›ÒfÍ–ôT™ÏÁ¶mÛ2{öl}ôQêÔ©S츔”¶lÙ”)SÊ´¢ˆˆˆÈ½D3xEDÊiïÞ½¤¦¦Û:uŠÏš3g-Z´¨Ð5âããi×®YYÑ™R%ͪ*¬fÍš4lØÐ˜ÅUÚŒßÂÁjøßYtmÛ¶¥Q£FÆ/ß4»ïò¤g¨]»6öööÆÌ¬Â3˪ón‡ºuëR£F #ÐQÒL¿¼¼¼bu.Mvv¶Ù ½¼¼¼JåVÍÈÈ૯¾2‚8mÚ´aÔ¨QtëÖ .]ºÄºu몴M,ñ9VwË3¾ªº.Uݧ*ª¢ï wâØ½㪺úoÑϲ’î7;;ÛlqÀ•ýlܸ1cÇŽåùçŸ'22’ýû÷³ÿ~³úçää°dÉúôéSeÿÑ)"""béô¯"‘r¸xñ"+W®4+:t(P<àZxõò¿gddJ›a·uëÖbe[¶l1Û.ËW¥ ×)44”+W® V>¯••nnn@þ¬­Â³ <ÈáÇíòÌ.4™Lfù‚CCC‹-–´~ýzžþyžþyÆŽKzzz¥ïáv(z¯»wï6XÂÂÂJ]d©`¥øEƒ+ÑÑÑfÀò:wîœÑ¶¾¾¾xxx¿'N”ù\å™…l ϱèýTgË;¾*S—êîSU5VÊó¾p§ÝªWU¥¢}¦V­Zf ·mÛ¶­Øs &33ó¦×,ÏçàÅ‹ùæ›oŒ?ñññtêԉ矞Ï>ûŒO>ù„öíÛç¸råJµ¤ ±T ðŠˆ”àúõëœ9sÆøÎO?ýÄ;ï¼c6“¨}ûötìØÈŸýUx¦ÒêÕ«¹té’±žžŽ¿¿?Ï=÷Ï=÷ï¼óN©×ß¾};+W®äòåË$''³|ùrvïÞmìïÙ³g‰¹{‹êׯŸñsff&3fÌàܹsäååqõêU>ÿüsN:eÓ·o_³…PIIIf_‹-ï×Ç ¯œ~ñâE.\h•NŸ>ÍÊ•+IOO'==WWWjÕªU%÷p;n›ôôt>þøcâââHOOg×®]|öÙg¥¾¶è ¸%K–pöìY®^½Ê˜={v¥êV4PsðàAÒÒÒÈËË#""‚åË——ù\)))e>ÖžcÑû©î:—g|U¦.Õݧ*£¢ï wÚØ­ÊqUU*Ógzè!³¾ùïÿÛbóõ×_—xÍŠ~:::ò믿²aÃ6lØÀ7ß|cô“ÉDÓ¦MÍ>ólmmKLã """r¯RŠ‘œ>}šüã7=ÆÖÖ–W^yÅÈOh2™xöÙg™9s&ÿ•ØI“&Ñ¢E nܸa¬^à™gž¹é×K(qߘ1cÊtƒfË–-üùçŸDEEñ÷¿ÿš5kûJ¶½½=Ï>û¬YY«V­pqq1‚Ú3¶Ê“ž¡Àˆ#ضmW¯^òg€S«V-³™oVVVŒ=ºÊîávxôÑG 4îõĉ¼þúëezmÇŽ±µµ5V§?yò$o¾ùf•Õ­eË–XYY}qË–-lÙ²Åì«é…e^¯^=c&`dd$Ÿ}öÝ»wgàÀÕÚ«ËÍë\žñU™ºTwŸªŒŠ¾/Üic·²ãª:T¦ÏŒ1‚_~ù…´´4 ?`}ðàÁ[^³¢Ÿƒ5kÖ¤W¯^ìÛ·€C‡1vìXœœœ0™L$''›]§K—.U¾°¢ˆˆˆˆ%Ó ^‘ ¨U«ï½÷^±•¼{õêÅ /¼`lgeeE\\œñK­••“'O¦OŸ>¥žßËË«Ô}ûÛßhÙ²e™êiggÇ;ï¼C«V­ÌÊ‹þr_§N¦M›Vl¦ŸÉd¢ÿþÅÎ[‘UíëÕ«Ç;ï¼CíÚµÍÊ qlllx饗èÒ¥K•ÝÃíP³fM&MšTj¢M›6´mÛ¶Ä} 6¼i kàÀ4hРRu5jT±ò7n`ccÄ Ìê}úôi³ãzöìiüœMpp0ÇŽ«ö¾X]nv?Õ]çòŒ¯ÊÔ¥ºûTeTô}áN»•WÕ¡2}¦V­Z¼õÖ[¥.ª×¤I“RÓUôspÒ¤I´nÝÚì\)))Å‚»7fâĉú‡ˆˆˆˆH!ú¯o‘2°¶¶ÆÁÁ¦M›Ò­[7yäK<ö±Ç£sçÎlÙ²…˜˜bcc±µµ¥aÆôèÑ//¯[¦WxñÅqvvfÛ¶m$%%Q³fM:vìÈ“O>I‡ÊU÷ 0sæLvìØÁ‘#Gˆ‹‹ãüùó899áêêJûöíñòò*õ~î¿ÿ~Ö¬YcVV‘/@»víøôÓOÙ´i§N"66–k׮ѴiSÚ´iÃSO=EãÆ«ün‡ž={òÉ'ŸðË/¿púôihÞ¼9Ý»wgäȑ̙3§Ô×úøøÐ¼ys~þùgâââÈÈÈ yóæxyy1tèP^}õÕJÕí©§ž¢Q£Füúë¯ÄÇÇãääD‡xôÑGiÕªÛ·o7P{öìáÉ'Ÿ4/¾¾¾äää°gÏ’““Ë5ñN|Ž·ºŸê®syÆWeêRÝ}ª2*ú¾p§ÝÊŒ«êR™>ÓµkWfÏžÍÚµk9räW®\¡^½zôéӇѣGóñÇ—zÝŠ|ÖªU‹Y³fqàÀ¶oßNbb"—.]"++‹úõëÓ°aCxàXjàYDDDä^eòòò2V)ü5ãb–P&"R ¤Å– Ê ïËËË3+/ü§¤²ÒöÎUy7øî»ïÌVX_½zõU¿×_¸¸8:tèÀG}¤N_I}ô‡òzo½õ–å¥ñ¥±+""""RšÁ+""·T£F ãç’¾R.æ"##¼›5jÔ(6ë://sçÎÛwBZ Ñø]±L ðŠˆÈM=z”¨¨(c»¢éî%6l0f™›L&>ûì3³@ÐÎ;IJJ2¶ÿ?{wUu7pü;Y&d#I Â’Bˆ$,A„*«Dp¡¶b[Ð >Q°k¥Z±mÐW°€­ô}•Rq„¨€  aI d!Á,ld#“eÞ?â\f²ÀL2I&á÷y23wfÎ=÷ÞsÏý͹¿ÓÑ·i 9¾„»B!„¢ç’¯BˆmÞ¼™ÂÂBΞ=«<7nÜ8ÜÝÝ¥rná®»îR‚DZ­–W_}•û￟޽{sáÂöíÛ§,Û§Oƒ‰¾„_BŽ]!„B!L!^!„-ºpáÙÙ¯.’ IDATÙÊcµZÍüùó¥bŒ0nÜ8.\ÈÖ­[(**bË–-Í–óññá…^0¸E_Èñ%äØB!„ÂàBÑ"¬¬¬°··gÈ!,X°€JÅiîܹŒ7ŽÝ»w“žžNAA555xzzâííÍwÞÉĉ±¶¶–Ê’ãKŽ/9v…B!„h3ÕôéÓ•éíU*•Áÿ ¶ðœBèhµÚVŸÓM«Õ<¯ÿ¯¥çZ{Mw ­B!„B!ÄíÌJª@!„B!„B!º'IÑ „¸í•””H%!„B!„¢[’¯â¶çææ&• „B!„BˆnIR4!„B!„B!D7%^!„B!„B!„è¦$À+„B!„B!„Ý”x…B!„B!„¢›’¯B!„B!„BtSàB!„B!„BˆnJ¼B!„B!„BÑMI€W!„B!„B!º) ð !„B!„B!D7%^!„B!„B!„è¦$À+„B!„B!„Ý”x…B!„B!„¢›’¯B!„B!„BtSàB!„B!„BˆnJ¼B!„B!„BÑMI€W!„B!„B!º) ð !„B!„B!D7eÓ_ê0ž¨©‘ø¹¡®,!;9Žý1ÇÈ©• "„B!„B!„Æêä¯-~÷.eé´þ¨uO99á¦. 1î9mý\7FÞ»ùQã ìŽ ùÙdÄǰeëW¤”tÖú92ò‰Õ¬\Š{Å>ž[¸õêOX¡&ùµù,?VÙ½öÛ–nYO”{6›žXÂÎ9`„B!„B!„°$ൠ\hÜÕä¿c+ÛåÐæÁ»Žá,Ž^Üþ@E>É'‘]©Æ;`$¡QËX5M‹W²³†Û,då‚Pœ’÷±eG 9µPY¨©è£“m¦²p’#ñ;w’øSP¼¢RN•häXB!„B!„Ââtb€×‘ШÐÁ]J8½¶£B½xàÍÆànúŽÕ¼²9žƒumñš´œèU“Y²f‰‹7“ÑÑAV·Ü©àЦõ|’Òøe‰kNÔÚî±38<À‚n¨ccH,©…Ú þ½dÿ–ãD!„B!„B‹Ô‰“¬¹ämøL{8Ž_Ê¢ÁP±o%« ‚»µÄ®gmœ¼£XjÛik*£]…B!„B!„¡¼4‘OG¼½oÀÊè-l‰aÇ–wY½x<~‹ù(f«Gê>Ó‹6ųå üš¬Uãgna¾_KåÏÒèíÄļ˽neóÿ«ßýˆ11ÄÄİcû&^[:•Çu9õݶ. ¸3gýΟ¾÷§Ïݾ’@ÛŽª;!„B!„B!D[ubІ’s4Dé­j­!0ù±ùý™49'4ÄÇ™³ÁÖÈ 8^ÉÛ’ÚœX>ù·ásŽáKY¿& oòIØ·ƒC•ŽDN#jùfÆ\Í’uñ†cÇH–Fá—±ŸO6Åà0™¨iQ,v$ÑZ+kIÞ¼’×&-å•Þ$lz“­É9dÔ‚[“ò¸MZͦU‘8U¤G¾­ás^a}d>êöV±c(‹¢#‰t*&;!‘ 8†/gý+“q*NæÐŽýäãMÀÈp"¢–ê¥aÑ+±”PBüº•¼µœUQŽœ|w-Ÿdd“Í‚Ëæ¯;9…B!„B!„h«Î ðÚpïÒ(j÷"?hú™œ‚&ôÓƒìb2ŒüL'o¼Ô@I2%µ¦•eásQx“Ì»‹Wò•nòµ-ŸpïÚÍ,›ö w.b³~Â^÷PübV²d½n¤p qµ[XÎd?[Sj©ÌH$Þ­¸‘ŸObJ …rÉ⥑8Ubõ¢µÄÿÜ´ýä^Ön^FP{“;¸GxèMžˆŽ¥ À‘ñó'ãD2ÑË–³_ „»qï»[Y:?ÛXJj¡$#‘Ää ˆ²%'%ÄŒZÀ±SêN!„B!„BÑ6Ÿ¢ÁÖ{—.eZÿ¢¦ª‰ÙG~ ‹i²±~},%¦~~­‰9o½'éû6±?G/¸X›ÃþMû¨ÀÈIM’“Þ$ D-9'G›’hÀ6 ŠH'ÈÞºE î6~õ~¶ì«0Ce§³u‹.¸ PIüš…,œ¿R/¸kj©-£î„B!„B!„Íuì^[?î]ºœiýzÜ2‹æ$°cË&JÜ‚ê¢˜ôäcK11´«)i ºyãÆÍ&lsÄ+À'M Ù9%àÖ7 #>‡¦cGksâÉaAÞØ¢÷º&‡3Ä_üüPSArrÓu­%'>ŸÕFšrš|tme ^„‡DP@¡ýq“gƒ³íºB!„B!„B4×qÞ¦Á]·úó ±±)$¶çó+³‰Ë†Ðþ‘¹}Ò,°©#`!Ñëçàžü&ó—ÇÞ"¦©iõi9ªä&Yv5˜!UA³rÚ0 Ñ‹BQSLz\<ñq[‰Ù’Û¢u,2çïØºB!„B!„B4×1)Z îRAü–µl5ËÌZÄŤA,œØÊíþ¶ôŸ: w ûP2•@mI6%€_¸_³÷ØúEàç”tHµ”ä£Á‰€·fåô õ2¶rñr3nQ·É,] Ñ,Œú9ËÖ¬ãß;c‰OÉ¡-kØ•u'„B!„B!„hÎüÞN î6*ˆYOL1xÏYËÚ'FÒ4ì龈ÕsÜA“ÀÖØÆ¼¯äÇW NÓ–0ÕÏÖ ÜS—DáN1ÇeÓSÕ&Ç Á ®?™×dMuoº4 à„A<Øk*‹&;·)Üð*r2ÐÏ’`ÅÂP09 nÖB!„B!„¢93§hðcêÒåL믡¤ÜÜt) ÌÜ 6…M«¢q‹^N䂵lÊ&99ƒìpë?’ˆ w Ÿ}o®%V7°´6ƒ­ëö¹fË6o&r_•ŽDN#Š÷­cKJ…(+±~}›—OcÍ–þŠM „þ„O GœŽ&´¿^:ƒc³ap(«Þ\M@ÌIJÜB™:'§ä|0"½Bmö!â‹ç0-êM¢½âH̨ıÿH"#û£)ÜCY´ô^6mþŠ”JÐhjw"çÏ!ãP·EË£9”­!(<’þ?Åá+·“®Á{ò"–.‰c Ù•u'„B!„B!„0¤š>}ºVy Rüo°` ϲeäâ5, ÒŸH¬cƒ»Ý-ŽnNPQBe“®Ž“¢ùd•#ï>±„¯ ¤¦D÷£Õj[}Nÿ5­Vkð¼þ¿–žkíµcÇŽI¥ !„B!„â¶gÆ µ$nÙBܪ%Dºw[àÎê­¯šÍÂåûõ&:ócêü (ÞAŠÌQ&„0BZ ®—âa×›ŠÚj®Ö”µd7k•}z¹àbë(•/„·¢m€ŠËPUÕW-ع‚Ë pð’úBÜv***¨¨¨ ®®{{{éÕ«—TŒB˜‰ysðÖ¦ðÉ›ÑdL‰mJ,Ç2$¸k 2ž-;òY7g9Ñ«ýØ~(ƒJGo"£2y°†„èdH [!Ä-|s%žÍi{¸V[…•ÊŠmC§}w˜Û`~ü ¾ö_Oýë_¹xñ"!!!,[¶¬Ã¾ë½÷ÞãìÙ³ØØØ°aÆN¿)öìÙî]»xòÉ'7nœTB˜Kî1ÈŽmü_SÞò2öà;L÷@‹_¥ºº::ĉ'ÈËË£¡¡¾}û2lØ0fΜ‰““S§—éèÑ£ìÞ½›ââbúõëÇ+¯¼ÂÁƒùïÿ À /¼À!CÌö}Ÿ~ú)ûöíkö¼‹‹ }ûöeÀ€̘1£Sëbݺu$''ãèèHtt´{ÂâsòäI.\¸À¥K—¨®®n¶Œ««+ƒ&88˜1cÆ`gg×cëcÍš5äää°~ýzlmM›ð¼3ûŠ–²Î7kó…ÍÙ˜ýksˆÿ*Gj¶åÊ!eórVf?Á¢Q,‹tMùÙ ÄDofÓ~ÉÍ „¸¹KyD_øL êvfpàLI:ËOlä½qËð°ëm±õTVV¦w.\¸@uu5öööí«ÿK—8wî'NÄÍÍ­ã¶u'~—¢ ÏBÂûPœrëe«‹àâÎÆ}ÇÂèeàØ×"W«´´”·ß~›ÜÜ\ƒç333ÉÌÌäÈ‘#<ýôÓvj™>üðCÏuuu]z®)++#%%…øøx^|ñE\]]åxèŠþ‘œ3-Fnn._~ù%§NºåÝe¥¥¥ÄÇÇÏöíÛ¹óÎ;™={6ŽŽrǘ°¼6ßÒÚi÷DS6R­„įֱü«uRB“ý;}o§u›*Ö”óûynøƒ[O§OŸ6x\__Ϲsç3fL»>÷Çd÷îÝŒ1BéHyzzâïïMÛN«-½¿µïBXmœÝiŸ·íýyÇáÂ6ˆxÎâV­¾¾ž 6(Á]† ‚‡‡äææR]]Íûï¿ÏêÕ«qqqé”r]¹rE¹Ð¿ûî»™>}:ÎÎÎøûûtè(Àððp¼¼Ól””Duu5EEElݺ•gžyFŽ‹. çLËh3víÚÅÞ½{•cÔ5558p€cÇŽ1oÞ<&Nœ(•z‹¾âí i›?sæLig¤Ý­¯Btù×Kˆ+¼`eùáê‹®«S§N)ù555@cз½ÞÖÌŸ?¿Kß/„赕·òãÛþîA´À"Wï‡~ ++ 777–-[†¯¯/Ð8ééÖ­[9|ø0ååå9r„Y³fuJ¹ôGo 4www"""ˆˆˆèðï?~<¡¡¡7ÎÍùùüý溺¬Œ„„._¾¬Ô“·‹òòrÞ{ï=222ÚýYUUU|øá‡¤§§³páÂÛ. )}Å›·ùr—„­“ÖR!º‰Ï³¾G‹Ö"Ê¢©¯³Øz*//'55€°°0rssÉÊÊ"11‘ÚÚÚóUTT°cÇ222(,,ÄÃÑ#G2{öle$˜.ß¡ÎÚµk9r$K—.m– qÛ¶m|÷Ýw¬ZµŠAƒ¼/##[[[¢££Q«ÕÍÞßÚw©ÕjâãƒI+V¬`èСÊ27näôéÓX[[ó·¿ý ómo†={öœœLnn.ÎÎÎøúúÅÀ›-_ZZʧŸ~JJJ öööŒ7ŽAƒñÎ;ï°|ùòN½¥[³«¯Ã/CÑù¶½¿—„þ LT¹Š?üðƒA`A?h©R©˜7oqqqÔÕÕ‘œœlà5¥ÍÐåhôööfÅŠ|üñǤ¥¥ÌC=¤ä¶mÚ6~ðÁlÛ¶·ß~û¦9x;²MòööfêÔ©|öÙg@ã‰úu•››ËÎ;ÉÊÊ¢ºº&L˜Ð,ÿùŠ+(//gèС<òÈ#|ñŤ§§ãååÅØ±c™2e *Õ­÷cë~óæÍ&Oþð‡?PXXÈàÁƒyä‘Gؾ};ÙÙÙôë×I“&ÉÁƒùþûïÉÏÏÇÇLJ9sælP>cë£=û…þùYt¼’’¢££)(0oºÁ£GRTTIJeËÚœ»µ;0¦ª¿ŸëçÝ6å8iK{¨Õj9q⤠ Fƒ››aaaLŸ>½MyÇÍÕæëΪU«øè£HLLäí·ßÆÊÊÊèrkµZÎ;ÇÞ½{ÉÍÍE£ÑàééIDD÷ÜsQ×7+ËÊ•+•¶}ÅŠÊû:ÄþóŸÏAí½.Ñ?Ÿó7+¿µµµÑí¶èzàBˆnà\éìÊŽ³˜ò8ûXl]9sFÉù6jÔ(¼¼¼ÈÊÊB£ÑpბWÐx‹í_ÿúW®]»fpš››KRR/½ô666¸¸¸àèèHee㢮®®­Þ’ŒÝ/Œ=? 󪪪âwÞ1{pW'%%…M›6ñôÓO´3=…±}Ð[1æ8iK{¸ÿ~>ýôSƒçòóóùæ›o¸xñ"Ï?ÿ|›·‹9ÛüþóŸœ?¾Må>zô(ÿ÷ÿg°lNN999œ;wŽåË—cmmmt;Ó´,µOtT»×´ümi·E×±’*BËVV[ÉŸÎ~H¶ÞbÊ4¶åŽ¾Ô¥g°¶¶&88˜Q£F)¯5ÍÍ ðùçŸ+¨{§žzJùE:''‡ðä“Orß}÷)ï[²d ?þx‹e:t¨2: ))Iy>--M >·0Ñií»BBB”_î .¤u³S‡‡‡›µ>¿øâ åÂ-$$„ßüæ7Ì;[[[´Z-Ÿ~ú)eeeÊò»wïV.f̘Á‹/¾È=÷Ü£¶…èö.™ûLŸïD˜ùŒ|Ò⃻F9Ž===±²jù’ÁËË ___%€×–6C9ו•Q]]Í<`0J)%%E 6?ùä“íîüùóY½zõM×¥3Ú$ý[† Æ@éÇŒF£¡OŸ><û쳬ZµJù‘ñàÁƒüøãÍ>+//ÚÚZæÎËœ9s”ÉA>Lvv¶ÙÚë¶žO®]»†óæÍ3%}æÌyðÁ•\ÈõõõJ¹­õaì~aìùY˜V«åƒ>h6 £¹%&&Ó#ëÐØ>è-¯Œ8NLmu9•ÜÝÝyä‘GøÕ¯~E@@éééíÚöæjó 9þ<...øúúš\î;wÁã_ýêW<ýôÓJºŸ‹/*?\ÓÎ4-KGîÑîµT—mi·Eב¼BaáJ.QZ[yËåÔV6X™éVßz´Ô6´ž†a|Ÿ`‹¬«ÊÊJeäѰað··ÇÏÏ777JJJ8{ö,õõõʯöJÐ7<<œ‡~hœ¨àüùóTTTpþüyecYYYqÇwpøðaÒÓÓ©®®ÆÞÞž”” 1øï·¿ý­<0`€rëôáÇyì±ÇÌR÷m=Ÿ¨Õj~÷»ßaooOdd$/¼ðZ­ž}öYlll5jüã¸zõj»ê£#ö a±±±v^‰‰aäÈ‘-¦…ª¯¯ÇÊÊʨ&–Äœ}PcŽSÛò²2åþÈÈHƒ|t¹– ðóókÓú›ëØnhh`Þ¼yL›6 •JEqq±Ñå®®®VÚlF…ÁÁÁJZÖ~à4¦,]¹O´EÓòŸ?¾Íç1Ñ5$À+„γ׭o·ùÃÈǘìj¾Z^=û!G “š½ækï¿£§EÖÕÙ³g•™vu¦*•ŠÐÐP:Dee%/^T:~º‘V€Až@µZÍË/¿Luuu›o==z4‡F«Õ’’’BXX˜| js…1cÆpìØ1Ο?Ï]wÝ¥\›;=ƒþ-—cÇŽ5謆‡‡³eË´Z-ùùùÊòúé1ô…‡‡K€Wt—@¥‘#–¬l!ìi˜ªîuÓœþmžÖfèswwW.ô¡1·­Žþ­¡¦¶aÑ&i4e" Ýh^ýuüòË/ F êÎSú#ëôëAdìðáÃqrr¢¢¢¢ÅåÛS÷m9Ÿxzz*£Š±µµE£Ñàëë«ÜJîááq£?ñSý·§>̽_ˆö«ªªR‚q¡¡¡O>ùDùAáÔ©SÄÅÅ‘žžNUUÖÖÖxxx0bÄ~ö³ŸÜU`©ÌÙ5æ81µ=twwgéÒ¥444™™Éwß}Gvv6 ÍŽï¶0×±mgggP5¥ÜjµªªªHMMeÅŠ >œ‘#G2gΓ'tkZ–®Ü'Ú¢iùÛÚn‹®#^!„°pWªŠnúz`o?³wT¨È­.nñµHOÃÑ»éåWpöAeéÒ3dee±cÇ qýetÞââëèèèØ¬ãÙJ§1))‰!C†(·×Þ,=í >\ùÜÄÄD"""” æžA^¿Þšvrmllprr¢¼¼œ¢¢Æ}T÷?Ðlâ ɇ(z„Ìo_¶— ¾¯[®¦’÷ðêÕ«hµÚ/X¯\¹Bmm-*• “ÛŒ¦¯œ‡Ì0¯³Ú$ý”}úôiv~Ñÿ[ŸntëÍÊ¥ËCYQQÑbj‹¶¶×m=Ÿ´\¸UС­õÑû…h¿ƒ*©<:ËÅ‹ùþûï9r䈲ŸêÔ××SPP@AA‡bÆŒ<ðÀ½¿˜³jÌqÒ–öð‡~`ûöí?ô™k ¹Žm—fï5¶ÜÖÖÖ,^¼˜?ü¢¢"4 gÏžåìÙ³@c~õ_üâͶ)eéª}ÂuÙÖv[t ð !„…;Y”zÓ×ïîkþÛ~¬ÌçREË¿ÈFzx7¤|‰½µš?ŽzµU×Vª«« òÝ=z´ÅåΜ9Ã#<¢\4ë˜2JͺÛ[ãââHJJbøðáÊkíI£`mmÍèÑ£9rä.\àܹshµZ³§g€ÆÛzuôoÙ¨««SêL·œ³³³òºþä-½_ˆnGÛ…go›ÕíÛ·/×®]£¼¼œ¤¤$åÖLý€Ê›o¾IMM ¾¾¾¼òÊ+&·­³Ú$ýÉÅt£Ðô¿{Íš5xyyõYMƒ¸Z­VyîfõÖ–ºïÌóI[ëCX`S¨Õrøðá.ùaµ¤¡¡¯¾úŠ‚‚~ó›ßXl·#û æhsss•‘ÿ¾¾¾L™2…¡C‡’››Ë{ï½g1õØtûšZîáÇóç?ÿ™ÔÔTNŸ>ÍéÓ§•6÷Ì™3888ðË_þ²MeizÜ4m—;zŸ0æ;oV~i·»™dM!,XMC-G Îݼ#«ÕR¬)7Û¿œª«¼—²«åΡ=!.ô¾»Ky/Já“ÌØ.­«„„êëo=]ii©2!€þ­aú·¦é+W®äÿøG›Ë4zôh ñ–«#GŽ0dÈ“rZ¶d̘1@ã-l_~ù%ИŸKwÛ¬¹èwäŽ?nÐQԬ˓¦_Ÿ'NœP^×jµ­Ü…è6*sÁˆ|è=ÅØ±c•¿·oßn0zG«Õòõ×_SSS4æplK›ÑÑ:£M*,,dÿþýÍÚ}ýºÈÊÊ2xOff&/^lqÒ´ââb.^¼¨þøcÜÝÝyôÑGY»v-Ï=÷½zõRö÷öP«Õ@ãHW]Z@™—£#ö S¾SÚížEFð !„û./êú›ç¡ÚœÃæ´Î™]xlŸ ¬ôrIž+ý‘ŠºÆ[ôäfá {º¬®ôÓ3¼òÊ+Íf¯=~ü8ÿú׿8}ú4ƒ ÂÅÅE™¸àìÙ³üç?ÿaذaœ~üñGåbY­VsÏ=m¿©mFGëˆ6éøñãdff¢Õj),,äܹsTUU·óê¨ÁÁÁ¸¸¸PVVÆçŸŽŽŽŽ$''+³¶ßwß}ôïß¿Ùw¼÷Þ{̘1ƒ††¾ùæåùÉ“'·Z®¶Ö½¹Î'·Òžúhï9S˜—©A¢®ôÕW_iÚR˜ÚíìöP$Ø¿?†¼¼<ƒ´,‘)å¶²²â»ï¾ ;;›Ÿýìg8;;“››«ŒvÕr¶¥ñòò¢¨¨ˆÒÒR6mÚİaÃHKKSÒ@´gŸh­<¦|gW¶ÛÂü$À+„J‹–ϲ[T™"=‡<þ^o¶âšŠ.+×õëוª§§'ýúõk¶LHH*• ­VËéÓ§™;w.*•ŠùóçséÒ%ªªª8tè‡RÞ3pà@¦Nª<Ö=µmÛ6Î;ÇÒ¥K[?ÉÚØʉ'”çÂÂÂŒZ§›}—••Sú Ý*ƒ’““•‰‚ýýý•Ñœº·,‰)å8p £GæÔ©S¤§§“žžnðY*•Š)S¦´«¹ûpáB³~wÿþý[ýjŽëS¿³«Úma~ò³¦BX¨/²¾o5n—\쫬Ó'Ðà¹8½¯w/×.+Û¹sç”_ÚÃÂÂZÌåààÀСCÆ™„sssÆÛU_}õU"##éÛ·/¶¶¶ôë×Ù³góüóÏL1lØ0¦Njôd `8ÊßßßèQ$·ú.ÝmµÐ1·ÓêôîݛիW3sæL €Z­ÆÃð°0^zé%&Nœh°ü AƒX¹r%#FŒÀÁÁOOOf̘Áã?.µèÞTÔm.I…Ø—`ÿ3ÐP×¥«ìîîÎêÕ«™;w.þþþØÙÙÑ«W/üýý™iK}«-çgÑ6-M’hÉt.KdJ´³ÛCwwwžyæˆZ­ÆßߟÇ{Œ§žzJYfïÞ½W§¦”[¥Rñ«_ýŠ… 2hÐ œ±¶¶ÆÝݰ°0^xáebæ¶¶3¡¡¡,Z´ˆ~ýú¡V«4h¿üå/¹ë®»Ú½O´VS¿³«ÚmÑ]ÕéÓ§+ štÄ-]ËŒ¥Bˆ›išÄ]ÿ9ý×´Z­ÁóúÿZz®µ×Ž;Ö£ëóÛ¼Ó¼yîã[.g­²ÂVem¶ï­i¨C‹¶Å×Â݇òæè_)¬Ìç7që”Çóüïâ©a³ä`è$ååå¬X±€'Ÿ|’qãÆYtyõSd¼úê«–ƒS³¹z>güòöž0û?Æ/¯¹ ÿ„K_Ýxnΰ•€ÕíÐ&­X±‚òòr†ª´ír>–èÕW_U~$ï\\\xë­·dÃIMˆOR4!„úøÇC·\f²w(+C6k€÷fåHÏ`ƒÇG ’ Oh’¾AtŒêêjªªª”ÜW¶¶¶„††ZDÙ4 Ï?ÿ<µµµ¸¹¹ñÒK/Ñ»woÊÊÊ”<’öööÊ,óBt+N¾&¬…áQO{`ëËiàR $~šòÏ«%¸+mÒm{>–˘ m-‰î/i¥=¢§“¯BX k»[.óë!3ÍܸRÕúmwMóïê§gp¶u Äu l¸Npúôiþ÷ÿWy|×]wuØí´¦R«ÕÜ}÷Ý|óÍ7ó /ЧOJJJ” ÂÇ\&¾ÝS/7pð2m²µ«çàÛ¥àŒ|š\8§À©ÿiLËД×RçÒ&ݶça™rss©®®îVevuu• 'í¡· ð !„*­­¼éë½ékïnöï=Z˜ÔâóN>xéåØ-ª)'ùÚ$ýãûa¥’a§œ¸mlP©TØÛÛÆÜ¹s-ª|º\±±±äååQZZŠ»»;~~~Ìœ9“ÊFÝ—Ï8HÿÒô÷e€œÃ0t. ¬qÔnâ?!ã+h%-¾wJ}K›t[ŸO„娫«ã³Ï>ãàÁƒ-¦e³dºù„´‡BôøóºTBX–bM9—«®ÞtWµš†:ÔVæiÆв3û(˯´øzÓѻǮ&5y=X6\';v,cÇŽµØò©T*"""ˆˆˆ%zކZ°²…A3ÛàÕ}FÊv¸ôuãc͵֗íå~wI½ßFmÒßþö79ŸËì—óÞ{ï‘Ý-ËßÙ;J{(„è*àB Ó4·mKΔ¤3ëÀ:­Lšpã oÌHl«²&Âc˜l8!DÏt½b“Þ·aàù'Ûþy7 ìê {°1 ,„]¨¤¤„èèh »eù=<<¨­­E«ÕʤñBˆOî§B ³?÷”euŽíœÚûÆäB×ë5œ*¾¨<¾Ã}öÖjÙpBˆž§º>e£oîxºcƒ¯½ÀÐyR÷Bˆ.U[[Ë»ï¾Ûmƒ»EEE¬]»–ßÿþ÷ÄÆÆv» â„ÂàB ’Q‘Ëù²L‹*Ó¸>ÃQqcÔÃÉ¢4jnÌH<ÁKÒ3!z ê«ðÝr¨¸Üøøâ(Ïg{ªc¾ÓZ c_+¹ÉNѵ>þøc._¾Ü#Ö¥¸¸˜­[·òú믓ŸŸ/WÑ#I€W!,Èÿ¦ï³¸25MÏp´ð¼Áãñ}$À+„èaª ààr¨ÐËKÞP?ü¥1—îàûaèƒfþRŒû}c!„èB™™™>|¸Ç­×åË—yýõ×IKK“,„èq$À+„b_î)Ž&YT™zYÙr‡ûåqƒ¶®&+{ûáaç,OÑsTÀwÏCenó×JÒ þíÆ¿Ãž†ÀæùNk;˜ð øÞ)õ/„èr;vìè±ëVSSûï¾Kff¦lh!D"^!„°Sw[\™F{ E­w«ðù²L®ÕV)'xŽ '„è9ªò îæµ¾Ì{áô@ ¡¿q/­cÛ¿³÷¸çmð•™Þ…]¯¨¨ˆ¤¤¤½Ž555lÞ¼™ššÙàBˆC¼Ba!´X¦fé ;ü‘žÃeà !z†Ê¼Æ ÕnÜÕ¹¸޽u×Áÿ˜ùÌ2mò5;Wý5LÛ®C¤þ…áäÉ“·Åz^½z•;wÊBô2ƒƒBX€š†Z®×YÖ(*Æõ 2x.N/…D_{w9õ•'„èþ*óGîVÿžìï ô"D<}B üw²rA^|ãkU…(?ß©¬Á±/xƒÏØÆt ¦„…¢¤§§ß6ëKTTNNN²á…Ýžx…œ.¾H­¶Þ¢ÊäÒWõoVe—«‹”ÇMG÷ !D·Tq¾[Õ…¦¿·<>~“`ø£#qßßø@ÛuÕÁ]›^R×B‹—““sÛ¬kmm-qqqL›6M6¼¢Û“ Ba¾Í=cqej–ž¡Ép–àÝ»w/K–,a×®]Í^+//gÉ’%,Y²„²²²f¯õÕW,Y²„={ötz¹³³³Y²d G5ëçþá`É’%”””Xô~ÿÌ3ÏðÑGõèc{ãÆ¬X±B9KUq¹qän[‚»úrbáê¹æÏ«¬óóvóàn}}=Ï?ÿØØXRRR$ÀkAäjV!ºÐÆÔÝTÖ]·¸r5 àÆÞHs`«²fŒ‡å¥3 $!!ôôt%À›——Gii)S§N¥¾¾ž””²³³ñ÷÷n¤g R>'///¾ø‚¬¬,ª««ñõõå®»îbܸq· mܸ‘ÒÒRž~úi¶oßÎùói6x衇èׯŸAùØ»w/999¸¸¸BDDD‹ëR^^ÎŽ;HKK£¸¸˜>}ú0~üx¦M›f0:yãÆ\»v§Ÿ~šmÛ¶‘À›o¾ÉG}ÄÅ‹ùÛßþÖ¦²^¼x‘Ý»w“™™‰››cÆŒaĈ¼þúëüîw¿kuÔšþº~óÍ7äææRSSƒ››aaaÌž=›^½šç"MJJ⫯¾"++ WWW‚ƒƒ™3gvvvË»mÞzë-jjjšåÇüöÛoÙ¾};kÖ¬ÁËË‹uëÖ‘œœ ÀŸÿügüüüZÌ©ù÷¿ÿŒŒ ÞyçåðĉüóŸÿÄÛÛ›×^{MYvÏž=ìÚµ‹gŸ}–#F(ÏWVVòßÿþ—‹/RUU¥Ô½¯¯¯Éugl¹E ®eÁ¡pÝ 9ï³z|•%&&RSSÃĉñõõÅÃÔ”ÊÊÊn9¢öfûª1ÇóÍÞoj;s+Æ”çý÷ßWnŸþë_ÿŠ««+k×®5ú;ÒÒÒøúë¯Yºt)®®®·\>''‡;wòã?RWWGÿþý™={6Æ ë°sVkë¨k?ßxã <<<Ìr®–ÉÇÇç¶ ðÚÙÙuêüáááÊÈǦiÃâãã±±±aäÈ‘-xm÷ÚÒG5¶=5å¸7¶?ÛÔÞ½{ùì³ÏxñÅ£¡¡Õ«W+£¤fÍšÅçŸÎÞ½{9sæ wÜq‡²|ff&cÆŒá¹çž»éí´Æ”µ®®ŽíÛ·ãææÆË/¿Œ££#S¦LáOú“QÛáØ±cØÚÚ²jÕ*åýZ­–·ß~›¤¤¤fËçççóä“O*¹èf̘¡¬ëáǹûî»Û´mŒáïïOVVÐ8BB7ò»©>ûì3’““•RSSéׯW®\!55•1cÆP[[Kzz:ÁÁÁÛ¢¦¦†ÐÐPæÍ›§þøcœœœxùå—•Qc?ûÙÏxå•WØ»w/K–,és–1ëhŽs…°\ááá|úé§·ÍúêÚ¶ÎALLŒAš†ÜÜ\òòò”XÚÛ¿2æx7åsM=îMíÏêóðð`РAœ:uŠùóç+£GuAÅñãÇwXßÐÔþu[Úï§žzªÓúêæ<_êÞ»wï^öìÙƒ««k³Qè¢kÉ^!„è"ž½,sb¤é>£ Çžü›æçµ*•ŠaÆQTTDii)uuu¤¦¦2|øpT**•Šàà`ÒÓÓ©©©¡ººšË—/3xð`lll(++#33“;ï¼Sé$ê:V³fÍB«Õ’˜˜Øì{gΜÙ, (”ènÉŸ9s¦Ü…Æ#Mƒ#õõõœ:uŠÑ£GcooOUUUUUTWW3iÒ$€;c=ôQÏ[•5++‹«W¯rÏ=÷(@]G{üøñFm‡ ð—¿üÅàýZ­–ššš'mñööfìØ±ÛqöìÙ¨ÕjÎ;Ðæmc.>>>¸»»+·ŠWTT››Ë´iÓP«Õ¤¤¤?ÔÕÕÚü¸š>½Åº×Ÿ­ÜÔºF*»Ô˜s×,ÁÝço›à.À©S§¨¯¯'<<\¹À2d\ºt‰«W¯š¾9Ìp<›óXéŒö¥¢¢‚={ö0uêTÜÝÝo¹|nn.W®\ág?û™Á-Á®®®üüç?gøðávÎ2†9ÎÂr¹»»ßV95[:gw´ððpêëë9sæŒòœ~zsµ{ÆïÆ~®)Ç}[û³M먤¤„K—.)e:~ü8xyyuJÛmlÿÚÔö»3ûêæ<_æææÍ矎««+Ï>û,öööÒhZÁ+„]äjM™Å•i°“¡nÊã´+LVë퇇]o‹­ÓÀÀ@Μ9Czz:½{÷¦¦¦†àà#ŽGŒÁ?ü@JJŠÒaÓÈÔå›kšPFëf×±··7ÚÍrTéÞÓÒ(K]§M§°°††>ÌáÃ-O¾×tVeµZmT.GcÊšŸŸË:¸'''JJJˆ'''‡ììlÒÓÓ©ªªB­nžÚÃÏϯY9ìììðööVê®-ÛÆœT*!!!>|˜êêj%=C`` C‡U¼©©£ò›Þ~ÝRÝ[YYµ»î„Ê2Gîj®µw/€1ÏÃÀ·UõéÒ3 4ˆ¢¢¢çŠÁƒILLäĉÊÆ2ÇñlÎc¥3Ú—ï¾ûŽëׯsÏ=÷µüÍÚbÝbºvÈÜç¬ö–ÏØs…°l÷ß? JžÍžªwïÞ­T;’ýúõãäÉ“L˜0h ð·03µÝ3öx7ösM9îÛÒŸmJ7’<>>ž€€RSS)--eöìÙÒvÛ¿nKûÝ™}usœ/Ø¿?;vì ¡¡‰'2oÞ¼f“Š®'^!„è"E5×,ª<*T,6Û๤ÒLÊjo$Ï·Ôô :úyxuùËô)×{ÏŸ?OïÞ½ Þs3º‰ ôó¥FåãºÙ$M;mºÏŸ8qb«@ý_àó´µxÂ7¢¬M×O_KÉ–ÄÅűuëVÔj5#FŒ $$„¨¨(öïßoÒHІ†£:ž­m›–ÔÖÖ¶yßÒMxrñâEÒÒÒpwwÇÃà  Ο?Oii))))øúúâææfrÝ›³îÄOJÓáÐ  )owëx;wuû44N¼Õ’¶xÍq;;;IHHàêÕ«Lž<hL½aooÏ×_M}}}›oõlKÝSîÛRI*Z µM=[:œ}!ã+(N¾U‹rÛwu¢Ð8aMK)fRSS•ÉÖî¿ÿþ[~žn_mk[«{[•ÖtTÛ¯sâÄ llln™wQŸ¯¯/îîî8p€;ï¼Si‹«ªªøôÓOñðð`îܹZîŽxxx°ÿ~®^½Šùùùœ9s†>}úpåʶmÛÆ< ÜšÀ‡~Èùóçñöö&55•‹/¬Lòbê¶1b.\`ݺuL˜0ŠŠ bcc 6˜ÐnÜwàÀÂÂÂn:±LHHÛ·oPFðZYY)¹ŸhóŦ)ugJ¹o+e—Gî꥖Q„= ƒïküÛo2ìùyó °Ò XÁ˜`ÀÔÛ²óóóÉÌÌdÀ€-w¡ñÖÛpüøqî»ï¾V/[ÚWM9ž›¾?44ÔävæVA¬ŽhûuÇIII 4Ȥ‰zlllxøá‡Ù¸q#kÖ¬!""µZ͉'¸ví¿þõ¯;´Ü}®݇Z­fÙ²e|ôÑG=&xïççÇ3Ïû¬Á²>>>üñä³Ï>ãܹs”——ãééÉÃ?ÌäÉ“Ûõ«¿±ìÙ³‡C‡áííÍ<€§§' Jîâ–XYYñì³Ïòé§Ÿ’””Drr2 à¹çžÃÃÃ÷Þ{ÄÄD¢¢¢ ¾oúôé|ûí·œ;wŽ>}ú0{öl¢¢¢ ÖÕ”m3eÊ®_¿ÎÑ£GùüóÏéß¿?óçÏÇÁÁ¡Y'>$$„‘#GOQQÑM¥#GŽdûöíôîÝÛ`Æf]€7$$¤Íù'M­;SÊ}ûÐÂi9¸ à¡×†Ù:‚S¿ÆÑ¾Í"~V0öEðŸrÛÖä‰'¸ë®»Z]Æ××—™™IVV–’–öUSŽç–Þoj;s+Õö§§§sýúu†jò{ÃÂÂxñÅùòË/9zô( ôïߟÇ\ù¼Ž*wGŸ+D7 ØØðÄO0bÄ>ùäÊÊʺíºDFFòè£vYÞݦÂÃÃÙµkÖÖÖŒ5ʬý«Žè{˜rÜ›«?¡…›Ž í¨¾a{Ó~wFûÛÞýF7¹j~~¾2¹[Kûx-‡júôéʽ}ºƒ¬¥ƒ­]”nLŠšL¸—Ôæ“·Ÿ˜øj¥þ…è9—Õ-Ü&¬{Nÿ5Ý­ úßì¹Ö^;vìX·¯³ìªB~}4š×o £7K†Íb”û`lU]w L½¶¯¯œ`Cò.jµù™œmødÒ°VÉä)=YCCåååôêÕ«ÙÅÏ‘#GøðÃyçwèÕ«—T–°<¥aßÓ­¿>dÜñ[@Õ¸ì·Ë ¡®I‡× Æ®ÿ{¤>…s…h¢¦¦†#GŽpäÈ®\¹Ò-ÊlccCHH³fÍÂßß_6b7;î÷ìÙî]»X½z5~~~²¤ý7kï:üüîå¹åÓ¸qs—7ýB‰ŒÜNôúcÈ6Bܦú;xòЀIlÏ<À•ù¼túÔV6¸©q´éü³-×K©¬»nðüÌ~ܽ hµZV¯^ͰaÃxæ™g”wˆeРA3êEˆfª‹nþúÅPp \‡À•£-wÇ­‚þwK] !ç Ñ;;;¦L™Â”)S¸zõ*éééäççSYYI]]Eä…W©TØÛÛãââ‚··7AAA21T7=îëêê8rä~~~Ü•öW¡ƒ¼~Ì_¬ܽA°€ES3X»¿í!^Û€©,œäHüÎ$–ÈÆBt?¿2ƒìª‚ÿgïÞã¢.óþ¿8Êa <@ â 00SÃ4V-mó°·½ÛZ[>rÝm[ËvïjæÊztoy¯íÖ½®™”e™©xèSCE@ƒ€¢#‰ óûÃeÖÐæØûùxø¨™ùÎ÷{Íu}çs]óáú^_öT¶>רÒd]›÷Z0Ð;†h6Û÷››ÉÉÉlܸ‘·Þz‹¨¨(\\\ÈÌ̤¤¤„ùóç÷ø"ftåmΕ^ø×&#à ¿‚IªGõb‡¾}ûÒ·o_U„¾÷=ò½_³f ¥¥¥˜L&»nä©vPüp ÿ/ëØ¶»—hè'?J¡£¿—n8MÖ®þÙÉÂûÅ-ä7ÅQ÷Åzrζ¨5E¾Gºº@ýµÂÅÅ… A£17ÿ“Ãß”]så ñéÇ˱?¡O¯Þ:é¾'†NïÞ½9|ø0ÙÙÙc0xøá‡‰ŽŽVɵ«× PsjŒ¥.®ð¼’»"ê+DäùÞ§¥¥qúôi¦NÊäÉ“•´Tü{†´=ºoØ,}2®Ã/g·°tÑÆN/ÓpǬúEëž|”¿Óо"ß%­ÁÛu‡¾)á½ã_}¦ËwûG«Þ>Ü=8‘ ¹/Wà"â¾­ƒ϶ó´vG®ø ž º§Õ³K4œ<ÊIâÚ]¢ ñä1:wrw¼±Š_„_x4ë¿?aÖÉ4ô]ÊÁxâñ9Ä'ÈpÓÑcd~òßüÏÖ‹oìæAÜÒOXðOþþ,ÓŸCâˆú4–‘—±ŠWÿgžIOðäb Ñt”ïþžÿÞª›Ã‰HÏåw#‹c~Œ¹¹’ó§¨kªÇÂÕ]ËÌWzâ„«ÖÜgãá ÿ÷Ÿn¤vÙ€ç ‰¿†Á·©ÞDDDDÄ©õì ^<{ •'ã í¼v–KñI'§ï„E=í<7Íã¿çƒce9…gÜ“ü÷¢iq’¼-{(¨ó%,i c‚À´%•'–åP÷¯²Å-ý„E#Nb—S;>`Ç1_FO›KRœ/;‰gÐyö¬ÛJA]w<0…pÏ“¤=þ8ï–+Å+r)Íà‘kFc-üß3ðͱFÀ®” ƒÆ«®DDDDÄéõè ^þ!xìYEs™pÑ û$9|ÀCNêÔ,Þ³Çp àÉ“C€FÊr>çw.NŠ7ëIž ±îÕÿ&ãT76hI}àü–ÿaëųl¿-gëÿláÑeSHšÄ_Ž•_ô¦Öí¹¨lgQ~ÂË? ã¢}4–ÃÄhÐR”""""×¾^~ü:} ™ÐTþá0b.Üp“êGDDDD®=“à ›Ëã[WÞõ$$nÆu°­g³@Áï3èjŽ×# „àXNÛur¿-Ï¡œ)Œ ƒ‹^oÏk$lâ,æÎšHXcŸ¿ú8.Ë¡Nm."""""""""× —©S§Z¬\\lþk³a;Ïu¤ÿ„…<7+ÄþR4æñ΢w9 ì«ˆÓ²X,>wñk‹Åæù‹ÿµ÷\G¯effªÒÅaË—/§¸¸˜?ýéOß›Ï\VVÆâÅ‹yä‘G7nœSÔ©Ùlæ“O>áðáØL&=z4Ó¦MÃÛÛ»Ã÷ýýïg×®]vã?ÿó?:th×ÿ3Ï<ÃСCùÙÏ~¦/ (¦ªNäê¿D®¦_ÿú×TWW³téR~ÿ† ضm¾¾¾,Z´HzY½z5ÿ÷ÿ‡››¯¼òJ‡ãÕòòrkûýèG?âöÛoWåI·qÊXÆ¢“‰Ä…à{¹¥i¬;Å‘œŽ)¹+""ò½×ÜÜÌÿøGªªªHLL$>>žãÇ“žžÎÑ£Gyæ™gpumÿ¤èèhn¸á›}¥§§Ó¯_?ÆŒc³mg~\‰ˆˆˆt†¾¾¾MœkU^^ΧŸ~Jxx8'N¼ªå.--eÿþýL˜0??¿ïͱ»2ŽÍËË#!!¡Ý×F£êNzŒ{Oíøì‘L¶Q‹ˆˆˆýŒF#mfl¥¥¥±mÛ6òó󉎎n÷½·Ür ·Ür‹õqCCééé3kÖ,U®ˆˆˆ|'žþùN¿÷Ô©SÜu×]Œ9òª–»´´”Ï>ûŒ˜˜˜ï$Áû]»³ F£±Ý¯Åb!''‡Þ½{S[[«º“nçª*‘kEii)@›·7ß|3ª$ùÞh]®ÎÃÃC•q‹%??³ÙÜæµŠŠ N:e3A¤;¹« DDäzQ^^Î'Ÿ|Â×_MSS!!!̘1ƒaÆÙlWWWÇûï¿Oqq1f³™°°0fϞ͠Aƒl¶ËËËcóæÍTVVÒÐÐ@@@111̘1///ëvË—/§¦¦†ùóç“––F~~>€u¿´Ùoqq1Ÿ}ö%%%Odd$/½ôO?ý´ÍìŒÚÚZÖ­[GQQ&“‰¾}û’˜˜È”)SpsskSÞôôtÊËËñóó#**ªM¢´=¯¼ò ÇŽãõ×_ÇÝýÂÐ ;;›·ß~›   ~÷»ßY·Ý°aŸ~ú) , 22Òî:MOOgíÚµ<û쳄‡‡Ûÿw¿ûõõõ,Y²„¨¨( €ç%K<•——Ü-çÊòåË9wîóçÏgõêÕäåå±téR ƒÝíîÈ9wñ´¿ÿýïìÞ½›ûî»I“&é‹+Š©×`LmlldË–-deeqæÌ|||ˆˆˆ`Ö¬Yôë×ïŠu×ÝuòÔSO‘’’Bxx8›7oæøñãøûûÍÝwßm“øqd[GêÄÑv¹ý—ˆ³¸t}n{¿O+V¬°^ÖÿÇ?þ~ÿûßwË8æJqnÙ²e°xñbLjjj‡Ç~óÍ7ihh 55Õæ³oÛ¶´´4-ZDÿþýíêc::öþð»q¹:²7>µŽ‡“’’øñ|ÅvŽ‹‹###ƒýû÷“””dóZNNîîîDGG“‘‘Ñæ½=ÝnŽÆûöêÎÓÓ³K}£ô,·ðððÿj}Ð]7Yéi=ö˜*AlðÊ+¯ÐÐÐ@||̸qã¬ewd[GêÄ‘v¹Zý—ˆ³0˜L&¦NêÐ÷)88ƒÁ@QQsæÌ!99™ÀÀÀnÇ\)Î…„„àééÉñãǹÿþû?~¼5ö·wì½{÷ÒÜÜÜfàãÇ“ŸŸOrr2¾¾¾võ1QQQí{×®]v££rž;wÎîøtêÔ)>Lhhh‡K„×®]KKK ©©©0}út>úè#ÒÓÓÉÍÍå–[nÁl6óñÇȯ~õ+z÷î @JJ K–,¹býEEE±víZ >|8……… 8ŠŠ ‰çÛo¿åèÑ£Œ5Ê&ÉjO2dÈöíÛÇœ9s¬Ƚ{÷˜˜ØnÙΜ9Ã믿\˜•ÖÑ]‰;£¤¤„øøx.\hý<ö¶»#ç\ë>þñ(¹+Š©NS1ÄÆÆòÄOXß¿yófëìªË%{ªNŠŠŠ¸ÿþû­‰ ‹ÅÂ|À¶mÛØ»w¯Íl1{·µ·Ni—«Ù‰83{¾Oƒ ¢ªª €›nº‰¡C‡vË8Æž8j]:+,,Ì&îµwìîîc::vWÇz+W®´;î]z{Œ3†Ï?ÿ³ÙŒµ­«ªª˜>}z»ï¹íæh¼¿´îºÚ7JÏSz]DD®‹rEE“&M²üýýyðÁÛÜ¢uöD«Ö¤ ÖçæÎËË/¿ldµ´hlll·)))íî·uûÒÒRNŸ>m3» 00°M‚³¹¹™}ûö‹··7f³³ÙL}}=&L°øZ/NII±þ8ðóócòäÉW¬¿ЧOëå\çÏŸ§²²’)S¦àééÉ‘#îšzìØ1ššš=zt›}ØS§qqqœ={–ãÇ[ë3++‹°°0›KöZ?žW^y…ÚÚZ~þóŸwÛò ›={¶Í{ÛÝ‘sÎb±°jÕ*¾üòKâãã•ÜÅÔk<¦ºººâââBII‰õæFwÞy'¯¾úª]?`{¢N¹í¶Û¬]\\¸ë®»ððð 77×ám©GÚåjö_"ÎîJß§žÇtGœ»ôØ=ÕÇtçX¯³qÏqqq477ÛÄå‹—ghOO·[g?÷Åu×çŒô,Íà§wòäI€6km.Í÷öö¶ùÙ:`¹”Á`àìÙ³äääP^^NYYGÅl6·Y¶£ý^º¼ÑåÊyéÚ…ÕÕÕ´´´°sçNvîÜÙîçn½oë «½Õ¥Ë´ÇÅÅ…¨¨(vîÜI}}=EEE >œˆˆk‚·°°¸0ã·3uLJ~HNNaaaRSSÃŒ3Ú-×—_~É™3gx衇lf¬tOOOüýý;Õs €¯¾úŠêêj­S&Š©×pLuwwgÞ¼y¤¥¥‘ššJhh(DEE1|øð6ëÇÚSö6ûñöö¦ÿþ6?¶íÝÖ‘:q¤]®fÿ%âÌìù>õÔ8¦«q®½c÷DÓÝc½ÎÄ=G 0€b47np!Á;jÔ¨¯DëévëÌç¾´îºzÎHÏS‚WDDœ^SS“݃âÖ›ˆ]Éž={XµjžžžDFFÅ´iÓØºu«5açè~›››;|íÒâ­ÛŽ?¾ÃÁnë_ù/7 ²÷‡Bë Š‹‹)**¢OŸ>2bÄòóó©©©áÈ‘# 4ˆ€€€NÕiŸ>} cß¾}Ìž=›¬¬,ÜÝ݉‹‹kwû³gÏtxò®êÕ«W§ÛÝ‘sàñÇÇ××—?ýéO¼÷Þ{,X°@÷7ÅÔk4¦Â…K…GMnn.‡f÷îÝlÛ¶àà`,X`½¼õjÖIGkº¹¹ÙÌ ¶w[GëÄÑv¹Zý—ˆÓ&cÜ»–ŽéÊ8¦«q®½cwäÛo¿ítÓÙctTÎÎĽΈ‹‹cÆ ÔÕÕqîÜ9*++ùÁ~Ð-ýAgÚ­3Ÿ»½6îÊ9#W!¦¨ DDÄÙPUUÕæÒ§¬¬,ÊË˹çž{Jn¬^½š¨¨(üq›Ê—K(Ø[ÎÊÊÊ6—ŸUVVÚÇŽcÊ”)]j«øøxÖ¬YCqq1999Ü|óÍÖõÉ.uûí·Óé"Žr¤Ý9碣£‰‰‰àÖ[oe×®]FâããõåÅÔk0¦šÍfΜ9C`` ÉÉÉ$''ÓÔÔÄ®]»xï½÷Ø´i<ðÀU‹7­***°X,6I‘††ªªª1b„ÃÛ:R'ޏÚý—ˆ8Wz*ÎY,–6ϵ®!Ü]}Œ=ÇèŽøÔqqq¬_¿žÜÜ\Ξ=‹››[»Kœ]­vëŽÏ}5úFé­Á+""NoРAôéÓ‡íÛ·c6›m"~ø!EEEÍ0™L444d3Ȫ¨¨àðáÃX,–v—Wrã7âççצœ555ìÙ³ÇfÛÖ¿àggg·ITlÚ´‰×^{o¾ù€ððp ›7o¶¹¼ª¶¶–mÛ¶ÙU¶^½z1|øpòòò(++#""¸pÙ¬··7›6m¢¹¹ù²w¶Gë]€W­ZE}}½ÍM.ÌÈ‘#Û½T¹'8ÒsŸ{?üá1 ¤¥¥Ù¼OD1õÚ‰©•••,^¼˜Ï?ÿܺ»»»õæ3---W5Þ\œÀÈÎζIr¬_¿žÆÆFn¾ùf‡·u¤Nqµû/q<®8çì‰Ñžžžœ>}šúúz›2åäät©¹øØö£;âSW\¼LÕ–g¸íÖŸûjôÒ5šÁ+""Îß™ýkM¨åË—³hÑ"ÆŒƒ§§'ÙÙÙœ;wŽÇ{Ì¡ýõíÛ—ÀÀ@¶nÝÊéÓ§0`'Ož$77—¾}ûRQQÁêÕ«™9s¦C—qyzz2wî\V¬XÁK/½D\\---ìÝ»—ˆˆòòòl.×›3gK—.eÉ’%$%%a0(,,¤¨¨ˆ„„ël'///î¹çV®\É¢E‹ˆ‹‹ÃÕÕ£ÑHPP&“É®òEEE‘––ü{YWWW†Nnn.>>>„……u©­üýý‰ˆˆ ¨¨ˆÞ½{3jÔ¨·]»v-»víâ׿þ5}úôéñóÈÑvïÌ9g0˜={6ï¾û.ëÖ­ãþûï×XS¯±˜Jpp0[¶láüùóS]]M~~>nnn—ýÃTOÖ‰¿¿?ï¼óyyyôïߟââbŽ9ÂM7ÝÔ¦Lönko8êj÷_"âX\±7εÆÐíÛ·c½"©=‘‘‘>|˜eË–1nÜ8Ο?OFF£F²¹á˜½}L{Ƕ÷ÝŸ¾úê+V®\I||<÷ÝwŸCí1fÌ>ýôS í7¿‹vëj¼·÷Ø­u˃>¨/æÕ¿© DDäzóÏ>ËúõëÙ½{7---„„„ðÐCYg£ÚËÕÕ• ðá‡rèÐ! ¸ñÆY¸p!¼ùæ›8p€iÓ¦9\Î1cÆàããÆ رcAAAÌœ9“~ýú‘——Ç 7Ü`ÝvÀ€¼øâ‹¬]»–ƒR[[K¿~ý˜7o'N´™Ý0~üxüüüؼy3{öì¡wïÞÄÆÆ2kÖ,,X`WÙ¢££IKKã†n°¹ Xk‚7**ªÃu­ƒÖÁäåÖ_lll¤®®®S3û:ÃÑvïì9—˜˜È®]»Ø±cIIIN ˆ(¦öLLõðð`Á‚¬_¿ž‚‚²²²0 „††’’’Ò-7}ìLDFFÇçŸN^^L™2…»ï¾»M,µw[GúG\íþKD‹+¾¾¾vʍ¨(¢££ÉÉÉáÌ™3—MðNž<™þóŸìÞ½›>úˆæÌ™ƒO›ä«=}L{ÇväÝŸššš¨««k³Î¹=âââøôÓOqssks•ÅwÑn]÷öö]©3é—©S§Tæ÷w IDATZ5µw)᥯‰ˆ´§½Lës¿vñ%&­ÿ¹ç:z-33S•.N§¥¥…ÚÚZ¼¼¼ÚܸàË/¿dåÊ•¼þúëxyy]×õ°aÃ>ýôSRSSø€^½zÄÓO?ÍÈ‘#¯ëÏžŸŸÏ¹sç˜6m‰‰‰:DD1UDDä:2lØ0ëÍšåêÒ¼"Ò-´¯ˆˆˆˆˆˆˆÈÕ§5xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”»ª@DDäÚ²|ùrŠ‹‹ùÓŸþô½üü§N"55•¹sç2yòd"ר_ÿú×TWW³téRT!ôúë¯S]]ÍâÅ‹¯Éò•••±xñbyäÆ÷½®‹«]rýxúé§©¯¯¿âvo¾ù&nnn×eX,ŒF#œþ¾öwŠwÎE ^q˜¾¾¾¸¸¸¨2®a¥¥¥ìß¿Ÿ &àçç§ ùL™2…o¿ý¶Ý×Nœ8A^^>>>×m<µX,¼ýöÛF‚ƒƒ‰ÇËË‹S§N‘Mff&O=õ‘‘‘×dœ»´¿S\•k‘¼"""""â°çŸ^•àJKKùì³Ïˆ‰‰Q"Bä;2}úôvŸ¯¯¯·Î}ôÑGqu½>WÑÌÍÍÅh4’Àüc›Ï9kÖ,^~ùeþö·¿ñÇ?þ±SuÐÓqîÒþNqU®EZƒWDDDDDDDä*²X,üïÿþ/§OŸfêÔ©Œ=úºý¬GŽàÎ;ïl“À ä¶ÛnãüùóTUUéÄé$Íà§—žžÎÚµkyöÙg ·yíw¿ûõõõ,Y²ªªªøøã)--¥¾¾žAƒqÛm·‘`sYÜþðHMMµÙß¶mÛHKKcÑ¢Eôï߸°fî¹sç˜?>«W¯&//¥K—b0Ú-oyy9Ÿ|ò _ý5MMM„„„0cÆ † f³]]]ï¿ÿ>ÅÅŘÍf˜={6ƒ ²Ù.//Í›7SYYICCÄÄÄ0cÆ ¼¼¼¬Û-_¾œššæÏŸOZZùùùÖý8Ðf¿ÅÅÅ|öÙg”””@||<‘‘‘¼ôÒK<ýôÓŒ9Òºmmm-ëÖ­£¨¨“ÉDß¾}ILLdÊ”)6kÉ566²e˲²²8sæ >>>DDD0kÖ,úõë§“YäaÏwõÒõÂ1öÄB{c‹³÷ —²7®_©–-[FAA‹/fðàÁmÊéqÓÓÓ)//ÇÏϨ¨(ÆŒÓî¶ö¶ÍSO=EJJ ááálÞ¼™ãÇãïïOtt4wß}7—­ {ÚÇ‘öväœr¤>Dµ}ûv¾úê+ÂÃÙ5kV§ÎýÎÄÞïbÌÖº<…Édj3Ž… KX$$$´YßÖžXx¹8×Ù>äR÷wÝq¼®ÔmOû[xxøµ>h í­û¢µµDäZòØc©ÄÊßߟmÛ¶áååe³vWyy9Ÿ}öÉÉÉŒ1‚cÇŽ±téRjjjˆeذaœ8q‚ŒŒ 5j”õ½»ví¢¹¹™‰'Úëøñãäç瓜œŒ¯¯/F£‘ºº:öíÛGYYC† aìØ±¸»·ý;jAA¯¼ò ÄÇÇFAA;vì`Ô¨Q`4©ªªbß¾} ð÷÷Çh4²ÿ~’““­³:Äo¼»»;III„‡‡c6›ÉÎÎÆd2k=¶Ñh¤¦¦†Ý»wc0?~¼u¿¹¹¹Ü~ûíÖýîß¿Ÿ7Þxƒææf dçΔ––b2™HLL´@M&‹/æÄ‰ÄÄÄɹsçØµk%%%Œ;Ö:Žxçwøâ‹/̸qã¬Û^Zö¶½ííH¹©G?~œ·ß~.\ˆÍëŽÄ&GbowÙìåââBvv6_}õgÏžÅßߟn¸Áz, ƒMŒ´74¨Ý8çÈg½4ö\úøâþ®;Ž×Ùºí©q¿âÝõA3xEDÄé2dÈöíÛÇœ9slk‰‰‰X,Þÿ}ÜÜÜxþùç­ÉÉéÓ§óç?ÿ™­[·2~üøNßÁ·¤¤„øøx.\Øál¤––Ö¬YƒÁ`à…^°Îäš4i¿ùÍoHOOçg?û Œ=š{ï½×ú~WWW¶oßNUU•uöCff&<÷ÜsÖÄ‚Åbáµ×^ãСCmÊPYYÉwÜÁœ9sþ=pwgË–-TTTJSSiiið /X÷;yòd~ûÛß¶ÙçÚµkiii!55•ÀÀ@k½~ôÑG¤§§“››Ë-·ÜBcc#F£‘ØØXžxâ ëû7oÞl‰bÜ·—‘žgïwµ=öÄ{c¡½±Å™û…öØ×íi§ÐÐPJKK ³¶:j7³ÙÌÇL`` ¿úÕ¯èÝ»7))),Y²¤Óq¿UQQ÷ß¿59n±Xøàƒضm{÷î%))©Í1i{ÚÛ‘r;Z"ލ««ã/ù ÍÍÍüÇüG›?ºt&6Ù{{bÌf¯èèhî»ï>Ö¯_OFFøúú2|øpFŒAll¬õ{æh,ì(Îu¥¹œ®¯+uÛã~Å»ë‡Öà‘ëB\\gÏžåøñãÖÁNVVaaaôïߟo¾ù†’’n½õV›KŸÜÝÝ™>}:‹…t© ³gϾìøÊÊJ***˜4i’Íeºþþþ<øàƒ6KÖYq(áBò·Õܹsyùå—­ƒ¼ÖÏÞÐÐ@ccc»åHIIiw¿­Û—––rúôi›Ùh­ “ÖÉ­š››Ù·o±±±x{{c6›1›ÍÔ××3aÂë€ÓÕÕJJJ8uê”uwÞy'¯¾úªu0{à 7è¦"ßÕ;¿«¹RŒ±':[œ¹_h½q½«ít±Ö¥€RRRl’,~~~Lž<¹Óqÿâþã¶Ûn³>vqqá®»îÂÃÃÜÜÜvËähû\©½)·#õ!â‹Å»ヒÉdâ?øÍŒóΞûöÆÞž³ÙËÅÅ…I“&ñ‡?üÿ÷ÿþÓ§OgÀ€ìß¿Ÿ÷Þ{_þò—lذ‹ÅÒ¥1nWâTW\­ºí‰q¿âÝõCScDDäºLJ~HNNaaaRSSÃŒ3¨®®hwݯÖ5¨.d9ÊÓÓÿËnsòäÉË0vìX›ÇÞÞÞmf2´w¹–Á`àìÙ³äääP^^NYYGÅl6ãééÙfûöö{é%Η+ç¥ëuUWWÓÒÒÂÎ;Ù¹sg»Ÿ»¶¶ÖúÃdÞ¼y¤¥¥‘ššJhh(DEE1|øpëÚdîîî †+Ö§ˆôÐ;¿«íéjŒi…UUUvÇgîÚco\ïJ;]ªõs¶—XhMt&î· iÓ‡y{{Ó¿ÿëØÑö±§½í-·#õ!âˆ-[¶——GDDwÝuW·œûöÆÞž³9ÊÍÍaÆY×Z7›Íddd°uëV>ýôSú÷ïO|||§Æ¸]S]qµê¶'ÆýŠw×ÑøMU ""׃>}úƾ}û˜={6YYY¸»»g×`.üõýJZoq©^½z]ñ½MMMí¬:J°ØcÏž=¬Zµ OOO"##‰ŠŠbÚ´ilݺµÝÙöì÷rõpéôÖmÇß&IÝêâY“&MbôèÑäæærøðavïÞͶmÛfÁ‚ÖKÚüýý•àùÙû]íLŒ±':[œµ_èj\ïl;uôyÛsi;u¦m:ZOÒÍÍÍæªG’D—¶Ï•ÚÛ‘r;R"ö*..æ£>¢wïÞüô§?íT’´£ØäÈø®»ÇlöÄü·ß~›aÆY×´måããCJJ #GŽdÉ’%äääX¼ŽŽq»»qÄÕªÛž÷+Þ]?”à‘ëF||wé:‹_&ÖªªªªÓå ²î#::Úæµ¬¬,ÊË˹çž{ìÞ_SS«W¯&**ŠÇÜæ´=I‰+•³²²²Í²•••6[ëµ¹¹™áÃ‡Û¼ÖØØÈÑ£Gñöö.ÌÒ8sæ $''“œœLSS»víâ½÷ÞcÓ¦M<ðÀÌœ9³ÍŒ¹:ù®öT,œ>}ºÝ±Å™û…®Äõîl§þýû–è2dˆÍkeeeŽû­***°X,6É‚††ªªª1bD»eêLûØÓÞö”Û‘ú±Gmm-+V¬Àb±ðØc]vªÎœûöè©1Û“Nîî”””PUUÅí·ßÞnÒ°OŸ>À¿ÿÔÕ1ngâTW\ºí©q¿âÝõCkðŠˆÈu£õα«V­¢¾¾Þæ¦-~~~„††²k×.Μ9c3XZ¿~=...DEEYŸ÷ôôäôéÓÔ××[Ÿ3™Lääätº|ƒ ¢OŸ>lß¾³Ùló#ýÃ?¤¨¨È¡¿”›L& ²äUTTpøða,K»Éˆ+¹ñÆñóókSΚšöìÙc³më ‚ììì6ÉßM›6ñÚk¯ñÍ7ß’Ë/æóÏ?·ô·Þࢥ¥ÅúüèÑ£;}ùŸˆt#ßÕžŠ…½zõ²;¶8s¿Ð•¸îh;]®?Ç`0°yóf›Ë–kkkÙ¶m[§ã~«ªª*²³³mʲ~ýz¹ùæ›Û-“£ís¥öv¤ÜŽÔ‡È•X,þö·¿QSSÃ]wÝÕá5ºrîÛ£§Ælö=z4•••¬[·®M2Òb±°yófkr´³cÜÖç:§:Û¶W«n{jܯxwýÐ ^¹nøûûAQQ½{÷fÔ¨QÖ×\\\˜7oË–-cñâÅ$$$àííM^^åååL™2Åf}ÙÈÈH>̲eË7nçÏŸ'##ƒQ£FuxC˜+vºÿZskùòå,Z´ˆ1cÆàééIvv6çÎã±Çsh}ûö%00­[·rúôi ÀÉ“'ÉÍÍ¥oß¾TTT°zõjfΜéÐehžžžÌ;—+VðÒK/GKK {÷î%""‚¼¼<›K¾æÌ™ÃÒ¥KY²d III  )**"!!Á: 44”àà`¶lÙÂùóç ¦ººšüü|ÜÜܬ?ÄO:ÅÒ¥K™9s¦õŽë"rõØû]íô;c¡½±Å™û…®Äu{Û©5^oß¾˜˜bbbÚ×ËË‹{•+W²hÑ"âââpuuÅh4„Éd²ÙÞѶñ÷÷çwÞ!//þýûS\\Ì‘#G¸é¦›:<ŸmŸ+µ·#åv´>D.g÷îÝ:t¾ýö[Ö­[×á¶3f̰ÆHGÎ}{u÷˜í«¯¾båÊ•ÄÆÆòàƒvxÜ{ï½—£G²iÓ&²³³ ÇÏϺº:ŠŠŠ¨®®&::Úz3FGǸíŹîèC.×uöxíc{jܯxwýp ÿ¯‹;Ñ‹ÿ{i+"r­p4&ß W¯^ñôÓO3räHUˆ¨_µ·È÷ܰaì릋ÈwKkðŠH·Ð¼""""""""WŸÖàqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDäš²aÃ~ñ‹_ðË_þ€wß}—'žx‚ìììnÙÿòåËyæ™g®™ÏûóŸÿœüãjxéwUˆˆˆˆˆ\+ÊËËùôÓO gâĉôêÕ ___ÜÝõóEDDDäR!‰ˆˆˆˆÈ5ãÔ©SÜu×]Œ9€ûî»ûî»O•#"""Ò-Ñ """""× ‹Å€‡‡‡*CDDDÄšÁ+"""""m”——óÉ'Ÿðõ×_ÓÔÔDHH3fÌ`ذaÖmªªªøøã)--¥¾¾žAƒqÛm·‘€‹‹‹u»åË—SSSÃüùóIKK#??€°°0fÏžÍÀX±bF£€?þñøûûóûßÿžmÛ¶‘––Æ’%K  ¸¸˜Ï>ûŒ’’ˆ'22’—^z‰§Ÿ~Ú:û÷rêêêxÿý÷)..Æl6[Ë3hÐ ›íòòòؼy3•••444@LL 3fÌÀËË˺]cc#[¶l!++‹3gÎàããCDD³fÍ¢_¿~W,Ï¡C‡Ø¸q#¥¥¥øûû3jÔ(fÍšE¯^½l¶«­­eݺua2™èÛ·/‰‰‰L™277·Nmko‰ˆãV¬XÁ™3gøéOÊš5k8zô(>>>Œ;–3f`4Ù²e •••øùù1}út’’’löáH¼=wîóçÏgõêÕäåå±téR ƒC±CDœ‹[xxøµ>h ‡K_¹<öØcª‘RPPÀ+¯¼BCCñññ„……QPPÀŽ;5j;vŒ¥K—RSSCll,Æ ãĉdddÐÐÐÀ¨Q£¬û3ÔÔÔ°{÷n ãÇÇßߣÑHnn.·ß~;®®®c0(**bΜ9$''ÈñãÇÉÏÏgòäÉøøø°ÿ~Þxã š››ILL$00;wRZZŠÉd"11ñ² U£ÑHUUûöíÃ`0`-ÏþýûINNÆÕõÂÅŽ‡â7ÞÀÝݤ¤$ÂÃÃ1›Ídggc2™ˆµî÷wÞá‹/¾`ðàÁÄÇÇãééÉþýûÙ¿?&L°îóRŸþ9õõõìØ±ƒ¡C‡rË-·`6›ÉÊÊ"//[o½Õú^“ÉÄâÅ‹9qâ111DFFrîÜ9víÚEII cÇŽµþvsd[{ÛHD·oß>ªªªØ³gaaaÄÆÆRYYIvv6GŽ!++‹qãÆ1bÄŽ9Bvv6cÆŒÁ`08oëêêØ·oeee 2„±cÇrîÜ9»ãˆ8Íà«––Ö¬YƒÁ`à…^°&&MšÄo~óÒÓÓyâ‰'xÿý÷qssãù矷&S§OŸÎŸÿüg¶nÝÊøñã ¶î·²²’;9sæüûLj»;[¶l¡¢¢‚ÐÐP DUU7ÝtC‡mS¾¦¦&ÒÒÒà…^À×׀ɓ'óÛßþÖîÏÙÐÐÀèÑ£¹÷Þ{­Ï¹ºº²}ûvªªª¬³x333ñððà¹çž³Ëb±ðÚk¯qèÐ!ë{1ÄÆÆòÄOXŸß¼y³uöoHHH‡å9yò$?ùÉOHHHàÎ;ïä£>"==;wrûí·°víZZZZHMMµÎfž>}ºuÛÜÜ\n¹å‡·µ·D¤sL&>ú(‰‰‰ÄÅÅñÌ3Ïpüøq^|ñEú÷ï@@@o¿ý6Ç'88‹Åâp¼-))!>>ž… Z—»Y¹r¥Cñ@Dœ‹þ+"""""V•••TTT0iÒ$krÀßߟ|‘#GòÍ7ßPRR­·Þj3SÖÝÝéÓ§c±X8pà@›}§¤¤ØMrr²5á hMœØkêÔ©í–§¡¡ÁúÜܹsyùå—mŽe±Xhhh°)·««+...”””Xoµ¯¾úêe“»AAAŒ;ÖúØÅÅ…3fàééÉÁƒhnnfß¾}ÄÆÆâííÙlÆl6S__Ï„ ¬IgG¶íî6‘¶ÜÜ܈·>îÝ»7ƒ¡C‡Z“» °ùÎu6ÞΞ=ÛšÜíl<硼"""""buòäI€6ëÐÖdQQQ‡Û´®Õzq’ÀÛÛ›Þ½{Û<×™Ë/W>GÖ‰m¯<í-A`08{ö,999”——SVVÆÑ£G1›Íxzzþû‡•»;óæÍ#--ÔÔTBCC‰ˆˆ **ŠáÇ_q}ËÁƒ·©^½zd­ËêêjZZZعs';wîlw?µµµoÛÝm$"myyyµ‰...6Hkï;W]]íp¼õôôÄßßßfŽÆq.JðŠˆˆˆˆˆUSSÐùÄ^k£¹¹Ùö‡‡{÷üô¸t¿sdX{˳gÏV­Z…§§'‘‘‘DEE1mÚ4¶nÝÚfÖܤI“=z4¹¹¹>|˜Ý»w³mÛ6‚ƒƒY°`õ²hG´´´XÉ­Ÿ}üøñ6³}/Ö:ÓØ‘m»»Däêè(Þ^zcÆÎÄq.êÁEDDDDÄ*((¸pÇöèèh›×²²²(//·®{âĉ6ïo}îâõ {¢|•••Œ9ÒæµÊÊÊn=VSS«W¯&**ŠÇÜ&|iBÅl6sæÌINN&99™¦¦&víÚÅ{ï½Ç¦M›xà:}ؾ};f³Ùú¼ÙlæÃ?¤¨¨BCCÙµkgΜ±nÓÔÔÄúõëqqq!**ªGÊwã7âççצ|555ìÙ³§[e2™hhh ((È&¹[QQÁáDZX,X,àBryñâÅ|þùçÖíÜÝÝ­7-jii¹ì±N:ÅîÝ»­- ëÖ­£©©É:ã®uqvvv›dö¦M›xíµ×øæ›oÞVD®]~~~]Ž·Š"×?Íà‘ÿ@ø×Z²Ë—/gÑ¢EŒ3OOO²³³9wî=ö...Ì›7eË–±xñbðöö&//òòr¦L™âÐz¸Žðôôdîܹ¬X±‚—^z‰¸¸8ZZZØ»w/äååuÛR}ûö%00­[· 9 IDATrúôi ÀÉ“'ÉÍÍ¥oß¾TTT°zõjfΜIhh(ÁÁÁlÙ²…óçÏLuu5ùùù¸¹¹‘””tÙc………±råJòóó ¢°°ââbFELLŒu»9sæ°téR–,YBRRƒÂÂBŠŠŠHHH`È!ÚVD®MÝoD®óñ›ª@DDDDD.óÏ>ËúõëÙ½{7---„„„ðÐCÀСCyá…øøãùꫯøç?ÿÉÀùÉO~ÒáÝe̘1øøø°aÃvìØAPP3gΤ_¿~äååqà 7tËq\]]Y°`~ø!‡¢  €o¼‘… È›o¾É˜6m¾¾¾,X°€õë×SPP@VVƒÐÐPRRR:tè?ÓÔ©SÙ¶m¤o߾̘1ƒiÓ¦Ù,Û0`À^|ñEÖ®]ËÁƒ©­­¥_¿~Ì›7‰'vz[¹vuG¼U<¹¾¹L:Õb}ð¯/t{_l}ÙEärZ/Ol﹋_»øRÆÖÿ¿Üs½–™™©Jùjii¡¶¶//¯67úòË/Y¹r%¯¿þ:^^^ª,ù^м"""""â4, ©©©¬X±ÂæÈ---ddd0dÈ6‰_‘ë™–h§áææFrr27nä­·Þ"** 233)))aþüùºúPDDD¾W”à§2sæLüýýÉÈÈàƒ> W¯^ñôÓO3räHUˆˆˆ|¯(Á+"""""NÅÅÅ…I“&1iÒ$U†ˆˆˆ|ïi ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆ\“ÊÊÊxâ‰'ؽ{·Ê&"""Ò%xEDDDDDDDDDœ”¼""""""""""NJ ^'å®*‘‹-_¾œsçÎ1þ|V¯^M^^K—.Å`0P[[˺uë(**Âd2Ñ·o_™2e nnn6û¨©©aþüù¤¥¥‘ŸŸ@XX³gÏfàÀ6ÇÌËË#==òòrüüüˆŠŠb̘1í–Ï‘2tõs8Z6‘«M ^i£©©‰·Þz‹êêj"""pwwÇd2±dÉšššHHH wïÞðñÇSTTÄ“O>‰‹‹‹uÿüç?yå•W8p ³fÍ¢ªªŠ;vðúë¯óÒK/áî~áçHFF«V­ÂÏϤ¤$²³³Ù¿›r9Z†®~GÊ&"""ò]P‚WDDDDDÚ())!>>ž… âááÀÊ•+iii!55•ÀÀ@¦OŸÎG}Dzz:¹¹¹ÜrË-Ö}TVVrÇw0gΜÿqwgË–-TTTŠÙlæã?&00_ýêWôîÝ€””–,YÒ¦\k×®u¨ ]ùŽ–MDDDä» 5xEDDDD¤]³g϶&E›››Ù·o±±±x{{c6›1›ÍÔ××3aÂ:Ôf)))6CCChll ¸¸³ÙLJJŠ5 àççÇäÉ“mÞÛÙ2tös8R6‘ïŠfðŠˆˆˆˆHžžžøûû[WWWÓÒÒÂÎ;Ù¹sg»ï©­­µyìíím“l–O8uê!!!möך îJºò9)›ˆˆˆÈwE ^i£W¯^6›››?~|¸Ík=zooo‡÷Û¿JKK2dˆÍkeeeÝ^GöáHÙDDDD¾+ZƒWDDDDD®ÈÓÓ“ÈÈH²³³©¬¬´ymÓ¦M¼öÚk|óÍ7ï7<<ƒÁÀæÍ›m–W¨­­eÛ¶mÝ^GöáHÙDDDD¾+šÁ+"""""v™3gK—.eÉ’%$%%a0(,,¤¨¨ˆ„„„6³\íáååÅ=÷ÜÃÊ•+Y´hqqq¸ººb4 Âd2u{ì݇£eûꫯX¹r%ñññÜwß}:aDDDäªP‚WDDDDDì2`À^|ñEÖ®]ËÁƒ©­­¥_¿~Ì›7‰'vz]ÚñãÇãççÇæÍ›Ù³g½{÷&66–Y³f±`Á‚n/ƒ#ûp¤lMMMÔÕÕÑÐР“EDDD®—©S§Z¬þ5ioP¤›ˆÈåX,–Ÿ»ø5‹ÅbóüÅÿÚ{®£×233Ué"""""""ò½§5xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆˆˆˆˆˆˆ“R‚WDDDDDDDDDÄI)Á+"""""""""⤔àqRJðŠˆˆˆˆˆˆˆˆˆ8)%xEDDDDDDDDDœ”¼""""""""""NJ ^'¥¯ˆˆˆˆÈÿgïÎã¢*÷?€†Aö}“EQEpÃMMÑ0·«æ’z[½åV7—ÊJ­ÌÒʵ4oÚ­®šK–šâ.† ¸€‚ ‚ÈŠ ;Ìï^s~3Ì3¬3ðy¿^¾œsfæðœçœóœç|çYˆˆˆˆˆt¼DDDDDDDDDD:Š^""""""""""Å/‘Žb€—ˆˆˆˆˆˆˆˆˆHG1ÀKDDDDDDDDD¤£à%"""""""""ÒQ ðé(x‰ˆˆˆˆˆˆˆˆˆt¼DDDDDDDDDD:Š^""""""""""Å/‘Žb€—ˆˆˆˆˆˆˆˆˆHG1ÀKDDDDDDDDD¤£à%"""""""""ÒQ ðé(x‰ˆˆˆˆˆˆˆˆˆt¼DDDDDDDDDD:Š^""""""""""Å/‘Žb€—ˆˆˆˆˆˆˆˆˆHG1ÀKDDDDDDDDD¤£à%"""""""""ÒQ ðé(x‰ˆˆˆˆˆˆˆˆˆt¼DDDDDDDDDD:Š^""""""""""Å/‘Žb€—ˆˆˆˆˆˆˆˆˆHG1ÀKDDDDDDDDD¤£à%"""""""""ÒQ ðé(x‰ˆˆˆˆˆˆˆˆˆt¼DDDDDDDDDD:Š^""""""""""Å/‘Žb€—ˆˆˆˆˆˆˆˆˆHG1ÀKDDDDDDDDD¤£à%"""""""""ÒQ ðé(x‰ˆˆˆˆˆˆˆˆˆt”>³€ˆÆ?þ(,bĈ ÚfTTV¬X!,üñÇèÓ§O«Ë»ââb¼ôÒK5¾/‹abb'''ôìÙcÆŒ¹¹y›Í¯–”››‹3gÎàÆHOOÇÓ§Oakk‹öíÛ£sçÎ;v,ÌÌÌ´.ÝçÎÑ#G––†òòrxzzbåÊ•€9sæ 770tèP¼ûî»múó:"""""j{à%"¢&UQQ'OžàÉ“'ˆÅ‘#G°dÉôêÕ«Uìß¡C‡P\\ èСüüü´.R©GŽÁž={PZZªð^zz:ÒÓÓqýúuaÒ¤I˜>ýõ=z ªæ–-[°zõjˆD¢6_MíòåËJÁ]WWW 0îîî(,,Äõë×qùòeáýÓ§OÃ×× hñôçää(\SkÖ¬Î1bž>}*œ{,wxµ5 ð5'''¼ñÆmn¿ŒŒ”ZXöìÙÆ ÃgŸ}†´´4@BB¢¢¢àííݦó«)UVVbÇŽ ë† ‚·Þz ‰DXçïï¯4õáǵ"À[YY)¼633SîÀÌ™3y Yîµi ð©©°°'Nœ@ll,’““‘——'''tìØ/¼ðÚ·o¯ðù«W¯â믿–W®\‰îÝ»PžÔmË–-ÈËËÃï¿ÿŽ»w¼...4hƱX¬”ž‚‚üñǸrå rssammaÆaÊ”)X·nÂÂÂ~~~X¼x±ð=©TЍ¨(;v >DVV$ lllàîîŽqãÆ5Ix[[[¼øâ‹Ø°aƒ°îÌ™3B€WÓü‰Dعs'nÞ¼‰9sæà™gžÞOOOÇáljœœÀÉÉ ~~~3f Úµk×àc¼qãF„„„(|?$$!!!ð÷÷Ç[o½%¬///GHHBCC‘€ÂÂBØÙÙÁÙÙPšÜLÓ}V%"" Ç`Á‚Ð×W¾ýàìÙ³ˆ‹‹ÄÄÄ °°ÆÆÆ¾êœëªò7)) S§N………~úé'uO²VŸëdçÎ8xð °ýû÷+å×¼yó­ô]MŽ›¦×¢:ç\m×QKG"""""jz ð©!)) «V­I2÷ïßÇýû÷‚W_}cÇŽ­×öÃÃÃñË/¿(´VŒG||<"##ñÉ'Ÿ(´\LKKÊ+Ò“™™‰ýû÷#::Z¡u¦<©TŠÿüç?8uê”ÂúÒÒR )) çÎüyó0jÔ¨FÏÇÂÄÄDèRS¯íäææbýúõB÷}©T*¼wñâE|÷Ýw¨¨¨Ö•••!!! 8yò$–-[''§f9ƹ¹¹X½z5îÝ»§°>-- iiiÇ‘#G°hÑ"øøøÔkŸkrëÖ-…åI“&© îÊ̘1ׯ_–‹‹‹…oc퇦çzCÔ÷:iL5·–ºuñ8Qíô˜DDµ{úô)¾úê+¥ÀŸ|ËÆŠŠ üòË/ˆ­×ߨ(‘¡0>ªT*ÅÆÒcddWWW@tt4nÞ¼©r[!!!J%èé)Þ¶mÛ&Œ—Û˜ ZÁfff¢°°PãíìܹSalV™øøxlÚ´IîŠÅb¸»»ÃÁÁAáo®Zµ %%% :ÆÏ=÷add$|ÆÃÃð÷÷PXþꫯ”‚iÕ[`Íš5HMMÕxŸk“ °\[Àzõê…×_]øgmmÝèû¡î¹.Ë_Ùy 666 ÄìÙ³ëÜ÷†\'©¦ãVŸkQs®6-q‰ˆˆˆˆ¨é±/QŽ?.tŀѣGcÆŒ033C||<>ÿüs¢²²»wïÆ§Ÿ~ªya¬¯þóŸ8p ààÁƒ8~ü¸ð~DD  C||¼ðž¿¿?æÎ ±XŒ´´4|ñÅ Ýòå]¼xQxíàà€+VÀÞÞ%%% ÁÖ­[T3ãââšd V+++…åüü|…@ª:bbb`nnooo˜™™ÁÎΰk×.!èdnnŽÏ?ÿ...J¥8þ<¾ÿþ{UC8?~'N¬÷1öòò‚——vî܉¢¢"€££#FŒ!lçܹsHLL–;uê„·ß~...ÈÏÏÇŽ;pöìYU­e÷ìÙƒ… j´Ïµyòä‰Â²:ßQ¥1÷CÝs]–¿/^㦦¦ ù[›†\'©¦ãVŸkQsNÛŽ#5=x‰ˆêpíÚ5áuûöíñÆo]»t邉'b÷îÝ ŒEY[7xUf̘qãÆ Ë¯¿þ:._¾ŒÇ>|(¼wìØ1áµ¥¥%Þ|óMa¼K'''bùòå*ÿŽ‘‘zõê j¼R{{{€¡¡!z÷î­ðÙÌÌÌ&ÉÏêc{Ö§¯»»;V¬XSSS…íÈIð /ÀÅÅ ‰0|øp\¼xQhµyþüy!ÀÛTÇX¾£D"ÁÇ Uè·Þz <‘—/_Fqq±Ê1‚Uís]dA@ ª5r}‡$hÌýÐä\oˆ†\'©¦ãÖ×¢.G"""""ª¼DDuHKK^÷ïß_i\ÉQ£F) ;PVV¦q€Wè‘‹Åprr‚%òà ¤¤¤¯ýüü``` ð]///8::"==]éï¼÷Þ{ ËùùùHJJBRRBCC›%?óóó–MLL4ÞÆÔ©S•fòÇIöwd­eäó*55•••ÐÓÓk²c,äòóó‚i2"‘B@­²²÷î݃———Zû\ù®ü………(++S:_Ôјû¡É¹Þ ¹NSMÇ­%®E]<ŽDDDDDT7x‰ˆjñôéS…€dõáÀ¢Á]‘åqB­"€XTT$P­þªsrrª1p•””„¿þú ÈÊÊjö<•O? Ü¢WÎÎÎJëªxÿøãZ·Q^^ŽÜÜ\5É1...Vö¡ú¤n2òcUùSÛ>×ÅÜÜ\a977Wa<â–ØuÏõ†hŒë¤±ÔvÜšóZÔÅãHDDDDDêaMœˆ¨²Éº´EõVqR©TåçjZáÂ|ÿý÷ “# C‡ðööÆÁƒ›4ýeee 79::ª ÕEÕPõi1˜••U¯ÀicªÞZ¸¦‰«ê3¼B—.]%,ÇÄÄÔà­>9Ö¸qã`kkÛ¨û¡ ×Icªé¸µôµ¨ Ç‘ˆˆˆˆˆÔÃ/Q-ÌÌÌ`dd$Œe*ß®%XXXÀÐÐP`©j}(•J‚¨2ÅÅÅØ¾}»°éܹ3¦OŸŽ^½zA__999MTºrå „åîÝ»7Ú¶«·H\·nÜÜÜêüžT*m’cÜ®];ØÚÚ Û«ÞÂX¦ú±RÕ‚¸¾|||pèÐ!aùðáÃ6l˜RO&88W®\–'L˜ ûќ׉*ÕÇ\–J¥(..®wúZâZÔÅãHDDDDDêÑcÕL$ÁÑÑQX¾|ù2ÊËË>sèÐ!¼òÊ+xå•WðÚk¯ÕkÒ°ú¦çï¿ÿV˜H ¨š0LÕ¤L>THÛ´iÓàëë+®¢££›4/³³³±wï^…uþþþ¶ýê]Ë•>S^^Žââbá_eee£ãê-BåÓtùòeäåå)}>88øÿoÊzzèÔ©S£åIÏž=†'HJJÂÎ;U¶ÊŒŒŒÄÕ«W…e[[[!hÞÒûÑœ× P5Ñ™¼êAÏ{÷î)üP¡©Æ¼5i…¬kÇ‘ˆˆˆˆˆÔÃ/Qäg´ÏÎÎÆ–-[„àN||<öîÝ‹ÂÂBÂÕÕÆÆÆMšù±` ñÕW_!%%………¸xñ"6mÚ¤ò{Õƒ–ׯ_ÇÓ§O!•Jƒ;v4JúŠŠŠ˜˜(ü‹ŒŒÄ°téR…Vƒ]»vE·nÝ-_,,,Zìîß¿999 yµråJ¼ôÒKx饗°téÒF?Æ=RXöóó^—––âË/¿ÄÇ!•JñäÉlÞ¼qqqÂgX¯!+j¼Éëéáå—_VXwèÐ!|öÙg Bdd$BCC±uëV¬ZµJ!X8nÜ8¡¥oKïGs^'€rkðmÛ¶!99OžæÌ™£°Íøøø&I¿±±1>ù为º6ú¶ûõë‡W_}UX.++CBBRRR„ ™žžÞ~ûm 0 QŽqß¾}…×ååå¸pánß¾  j‚­¥K—¢cÇŽ ß©L377ÇG}¤Ôr´±¼öÚk˜5kV猼#Fàƒ>€X,ÖiË~4ÇuT OQÛ5Æ ƒMƒÒÖk±¶s®6ºx‰ˆˆˆˆ¨nlÁKD¤lܸÇG\\>iiipqqAïÞ½1uêT¬[·Nå÷^xáØÙÙáèÑ£HMM…••<==1~üxtìØgΜ‚I¡¡¡˜~ü«V­Â“'OÖ§¤¤ %%¡¡¡˜?>|||u¿Zj©õKNNƺuëPVVÖàmeff⯿þBpp0† ‚É“'·©V½?Ɔ ––¦°>)) III¸xñ"æÏŸOOÏfMÓŽ;PYY)ÜŸZ].srr““ƒ7nàwÞ——Q3×·Z^¶Dút]^^žÜ€;wî ¨¨H£z‚T*Ezz:ÒÓÓ‰+VÀÄÄ„™KõÂ/Q ¹uë~üñG”––jM𯝴®¢¢?þø£BpWæúõëØ¶mÞ|óM­ òúúúÂÞÞ@U€&::EEEÈÉÉÁ®]»(|ÖÎÎnnnÐ×oÙ[âýû÷èÑ£G³=TîÚµK¨ÌwéÒ>>>J¥¸{÷.¢££QQQ_~ù+W®„±±q£íWMëµåxîúóÏ?%¸[½<þ<îܹƒÀÀ@8::¶ú|¬¨¨ÀæÍ›…ா¾>ºtéÜ»wiii(**¶mÛ°lÙ2XXX4KºRSS…`ň#033ƒ››ÀÐÐPçò[—ÊDooo¸ºº çIRRbcc!•J±cÇ|ùå—:;ìSKÝ‹©õkêú–:ååóÏ?¯Ué«m*oܸ¡tß¼}û6ú÷ï_ë÷úõë;;;@~~>ÂÃÃQ\\Œ¼¼<üõ×_˜:u*/ª>=µ€”””ƒ»b±íÚµk–tH¥Rf̘Áƒ+½¿mÛ6DDDÔZ¹ùñÇ1gέ òúùù¡gÏžÂrFFÖ®]‹¼¼È{åÊ…jY™)»7L™2—.]Byy9bbb¼õ-³êº¾«—)ÿýï±{÷nlذ¡Ö1x5)/^Œüü|xxx`ñâÅÂ6Ο?ß~ûMé󵕹zzz ÃÙ³g‘™™‰ÒÒRXYY¡wïÞ¨q¿ê*›2rŸ• m _fJ¥Rµò 1Ê⨨(lÚ´ @UëÛÀÀ@á¾×{Ö‚ xŸ¨Ã“'OpçÎܽ{ñññÈÌÌZŽÖÆÀÀNNNèÚµ+ºvíŠnݺµÊ¼lêú–*µ•—-‘¾šÊÊAƒáüùó€?üîîî ×à½{÷```€uëÖA"‘ÔX&ªSßnhžV¯ ܽ{лwo¤¥¥!99·nÝBYY™FãåvèÐfffÈÏÏGVV+rÄ/‘®¸yó&¾þúk…4—”” ;;‘‘‘˜5k† ¦VÚ«333ƒžž*++{{{ôïß_ÞÂÑÑóæÍSúžºyPÓ~•••Õ¸¿µ)..ƺuëÆ½térssñÞ{ï $999øúë¯ñøñcáÁåðáà  òBCCñ¿ÿýOal̹۷ocáÂ…Z=Î4ÕH$‚T*­×wÛBW66¼±±1úôé£ô¾‘‘V¬X²²2…룾e–:×·……ÌÍÍ…2ÕÌ̬βCÓò !ª—¹§NÂþýû>“‘‘'N >>‹-‚X,®õPÓù×Ty¬©ŠŠ $''#,, @U×nùŒÕ̓†–ÅÙÙÙØ¾};ÀÉÉIa訆޳xŸ¨ùØ_»v —/_Fttt½ÊÓ²²2$''#99§N‚D"AŸ>}àçç§Óc97w}KMÊËæNŸ|YÙ»wo!À-”ÍÅÅÅHLLP5,Œì¹DuëÛ ÍÓêÏs²s¾W¯^°··Grr2JKKqçÎ…ž„š`£jx‰ˆšYxx¸Â²§§g‹wUÉÍÍźuëðì³Ïâ¹çžüãÿ€X,ÆáÇkýî­[·pâÄ Œ;Vëò]¾[šº¿Žgee!##055EEEöîÝ‹ÒÒRØÚÚbÖ¬Y066Ʊclj³gÏÂÏÏOh=õçŸ •MtíÚ7nÜÀ•+W’’‚3gÎ ³gÏVh}6wî\têÔ pàÀá!ÞÛÛƒ Bvv6‚‚‚PVV†ýû÷£W¯^J•öêiWE,cÈ!¸pá***pøða>|pssC§NЫW/…Y“5ɃÚö«¦õµÉË˃H$ÂĉQQQ“'O¢¤¤±±±HOOmAAAB0gôèÑèÕ«ÂÃÃUÎ^ ‡p¦OŸ‰D‚°°0„‡‡#>>7oÞ„¯¯/ ¯VÀÚÚ“&MBÏž=add$´â©>Žž:Zs·´´T¸†ììì §§§òs²‡yõ-³Ô¹¾gÏžÈÈHaæôiÓ¦ÕÙâJÓò ¾TÝ/d÷LkkkÀÄÄgϞŽ{÷€´´4¸¸¸ÔZVªÒ”y¬Ž;v`ÇŽJë]\\0þ|…û…ºyв¸´´[·nEaa!LMM±`Áa’£Æºgñ>ñÿÊÊÊpñâEœ8q=jô²çÊ•+¸rå \]]1vìXôéÓGç‡qhêú–*š”—Í™¾êe¥‡‡LMMQPP€èèh¡7H\\œ@Uõ#£UõÓ>}ú $$ (**‚‘‘bccTP}||jL·&õíÆÊÓ§OŸ Ã_tíÚFFFpqq••=z„ˆˆTTTÔØª?44T&G6ÉšLkKžš¼DDÍL¾ûµ~%nYYYX·nrss…u@ee¥°3f Äb±0Ô*ÚÚµ¨´´T˜l¢¦I&Tí‹|4##CxïÈ‘#8vì˜B…øÿnÍò­„å»J$|üñÇ(**ª³;§|÷Û(j}}}ñóÏ?C*•*¤«¦´×D"‘`Ê”)˜0abccÄÄDÄÅÅ û SSSL™2E£}Šøøxá®êª÷æ”iß¾=†Ê Õ¼DDÍLö«¸L»víZrrrêL»:{¡•DAABCC…`þµk×0eÊò Ñ+-Õ&ðSµòyQ=˜§jì9±XŒ9sæ`ÇŽÈÉÉAii)""" jl¸W^yEé’î©­Ë»©©)œ‘œœ\¯m·¶ ¯¡¡¡0vcvv6¤R©Êë-55eee‰DpsskP™¥Îõ­)M˃†PUæ^¹rûöíS’רhêûBcåq¯^½0dÈ…užžžøå—_™™‰Ë—/ãÙgŸÕ(ê[Ëÿ(“™™‰K—.)¤­1îYmý>‘ŸŸ­[·">>¾ÅÒPQQýû÷ãáÇx饗´rBßÖRßjêô©*+===…Q¢££Ñ¥Ka¾’º†gФ¾ÝXy*ž’““…Þòåóõë×k ðVggg‡îÝ»cÊ”)MÎF¤tŸgµméééX·nµ´´D`` Ž9"´²9rä***„±‚GŽ ===aœ:™ñãÇkm×¢›7o ¯å[-Õ¦zT~☕+WªRUð@“pò¬¬¬„×ÕƒïåååÂvå?§Éƒ{LL ~ÿýwá˜|ø°^yPß²xøðá¸rå ŠŠŠpøða 0@˜©±îYmõ>QXXˆõë× Ç´¥]ºt ÅÅŘ;w®NË«íõ­æLŸªã&‹Ñ«W/\ºt ÑÑÑèÞ½»ð^õÞ ©o7Fž!::ZX ­ñ¹cÆŒ*÷÷wÞQº§5*GDÔ†¥¦¦âÛo¿Uî.^¼VVVJ]”Ž;&ŒÕ#FŒÀ¬Y³„å±cÇb„ Z¹ŸYYY8uê”°Ü·oßzmG¾"X½¥_RRâãã…òÝ`å»Ë‚"|ð~øáµÿÞÕ«WòËõ &Y[[ ³€Ë¹&óôéS¡%Cûöí5΃– ŸïaaaBI¥R••ð„„ìÞ½{÷î…µµ5fΜ‰5kÖà½÷ÞZ×W7›tÓÝ»wk- UµxÔ”,È›––¦óù5`Àáõ¾}ûZ;I¥R?~%%%ªÆ´mŽ2«©ËB`0;;[è‚ @R“óMö÷&OžŒgžyöööÂpõ¥my,sÿþ}ᵬe±&yPß²ØÉÉ 3fÌÀ¨Q£TõÖ‘¿ß7Æ=«­Þ'ÊËËñÝwßiMpWæÆصk—N奶׷´!}²ºyVV.^¼èÒ¥KãÀkRßnŒ4GFFª5œÓãÇÊE¢æÀ¼DDmTJJ Ö¯_/üÚ- î¶k×k×®UçOæøñ㨨¨ÀÔ©SÏ>û,Äb1²³³…Ö½ÚàêÕ«HJJ‚T*EVVnß¾ÂÂBU])ëûàëåå äååáÏ?ÿ„¡¡!LLL#̰=a¸ººÂÂÂB˜à!""¿ýöºvíŠððpáAP¾Å“ü-ÉÉÉèØ±#ŒŒŒ0xð`„††"99›7oÆ Aƒ™™‰   U]©å[ZhüèС’’’œœŒO?ýýû÷‡¥¥%?~Œ«W¯*䛦yPÓ~éééÕ¸¾¡,--áé鉨ØX$$$`ëÖ­ðòòBDD„0¡…<===œ;w@Õ„.LJ™™ÒÒÒ„{ÚÖJ™ê'((>>>JÝÚ¥R)öîÝÛh§µ´ä4hÎ;‡””¤§§cåÊ•èÞ½;,,,pÿþ}!H'‘H„¡yšºÌjêò@v½çääàñãÇøÏþƒ®]»"..N莯.Y N:…ÒÒR¤§§+«—EꔉÚÇBWdù1xeºuë¦qÔ·,666†H$ÂÈ‘#qêÔ)áøñã:t(ÌÌÌížÕïlðM%$$Ý»wW˜¸O›5G}K×ÓçååCCC”””àöíÛÔk¡I}»1Ò,?<ÃòåËáìì¬ô òÓO?¨ú1¢ú¸àDM‰^"¢6H6ЬKrõànm­ÏNž<‰ÊÊJLŸ>”ÆáÓòšÕ+°ò­Ž5ehhˆéÓ§cûöíÈÉÉÁ÷߯ð~çÎ…VD@Ռĉ‰‰(,,Äùóçqþüy὎;*|ÖÑÑQx½{÷nܾ} ,ÀäÉ“'Ìø.ß:A$aúôéõKR$aîܹX³f òòò¿þúKés=zôÀèÑ£ë•5íWMëÃäÉ“±nÝ:”––âæÍ›Âð²y;vDß¾}qýúu$$$ !!A)FŽÉB£xüø1>ûì3üãÿ@¯^½`mm-<äÉ&si,­!È«¯¯ÀÀ@¬_¿™™™(,,ĵk×>c``€W^yEa›²Ìjêò¨êrçÎPø¼«««F­Ñ<==…`ELLŒp޹¹¹ -Çd“ÚÊÊšö©%ó822Ra¢4yþþþÂxךäACËb###àСC())ÁÑ£G1cÆŒF¹g¶¹ûĽ{÷jü1B[ìÚµ žžž5Nž©M𣾥ëéÓ××GÏž=êð²`r]Ô­o74ÍÅÅÅBðÙÎÎNhÍ,ÏÛÛ"‘R©7nÜÀäÉ“uj8Òm ðµ1IIIذaƒðPeee…E‹©Ü•9}ú4***0sæL­ß_sss899ÁÝÝÏ=÷\ƒúõëáÁƒ(..†ˆáÇ+´Xrrr§Ÿ~Š 11999°³³Cß¾}1zôh…IBºvíŠQ£FáÒ¥K cš››cÙ²e8vìîܹƒ´´4˜™™ÁÕÕcÇŽE‡´?666X¹r%Î;‡ÈÈHdeeáéÓ§°²²‚½½=† †^½z)TN5Ƀšö«¦õÁÝÝ|ðþüóO$&&ÂÄÄ}ûöE×®]ñÝwß)=Ôüë_ÿB÷îÝŠììlÂÂÂnnnºŸ“î+,,Äž={°gÏH$”––6Ùßj A^kkk,[¶ gΜÁµkב‘‘H{{{¸»»c̘1Jc½6u™Õ”åôìÙ¯¿þ:Nœ8ììl8;;cذa(++Ão¿ý¦QÞâÏ?ÿDjj*1dÈx{{ã£> 3¦kR&j[[ZZÂÑÑ#FŒP/S“qäÈ¥q¨µÍÓ§Oqúôi­êAÖ’õ­Ö>___!Àëææµ¾§I}»!i¾}û¶Ðj¿wïÞ*·ÆÆÆðððÀÝ»w‘™™‰´´4•`¢¦ Ê?äÈÿ_ýˆˆ¨&ª*òcÝɯ“_/ÿOÕºšÞ»|ù²ÎæÕܹs–7mÚCCÃfùÛ‰‰‰Ø¸q#ŠŠŠÔ/¸+óâ‹/ Ýr‰t|·¹O?ý´UL„Eu—±-ÍÌ̬ÕL¼Æò€¨õ{øð!>ÿüsH«‘‘¾þúk… Ü‘#Gàçç§06+Q[ÀIÖˆˆÚˆ„„¬_¿¾Q‚»ÿüç?Ü%­TZZŠ·ß~óæÍÃÒ¥KñäÉUïœ8qBx tpp`fQ³hM¯±< jýdÃ’è‚¢¢"¥ñ´‹ŠŠðé§ŸâÌ™3<˜DÔ¦pˆ"¢6 ..ß}÷0ãy}ƒ»"‘/¿ü2žyæf*i%‰D‚#FàĉÈÍÍÅ’%K`kk‹G ³¿üòË2¡iï9ДC/ÔGk™xåQëרc’7Gz{ôè!,wìØ§OŸÆÞ½{‘€×_]¡‹>QkÅ’Žˆ¨•‹Å÷ß/<Ü}íµ×àççÇL%­6yòd¸¹¹áÂ… HOOÇãÇamm <ÿüóèØ±#3©³±±ÑÊÖ² ò²< ÒYYY:^sssáuxx8ŠŠŠ0þ|ðàQ«Æ/Q+-[¶ ¬¬ @Õ„' .¬WpwöìÙ0`3•´žH$B¿~ýЯ_?fFäáᡵÃ!0ÈËò€HÛåççëtz«O¦…ŸþsæÌáÁ%¢Vý‘ˆˆZ©¨¨(lÞ¼¹ÁÁ]±XŒ7ß|“Á]"Ò ¾¾¾Z>ŽÉKDÚL,ëtz+++•>síÚ5óàQ«Æ/Q+‰-[¶ ¼¼`hhXïàîœ9s´>`BD$ãéé ­N#ƒ¼D¤­ä‡8Ðfff ˲ù&ª;tèÎ ?AD¤ x‰ˆZ™›7obëÖ­BpW&%%E£€‚¾¾>æÏŸÞ½{3S‰HgˆD"Lš4IëÓÉ /i#777J¯³³³Ârvv¶ÊÏ•——ã?þà&¢V‹^"¢VäÚµkøñÇ…ÙÁeJJJ°uëVµ  „3•ˆtŽFŽ©õéd—ˆ´§§§N¥×ËËKa999¹ÆÏÞ¼y999<ÈDÔ*1ÀKDÔJ„……aûöíBp×ÖÖ†††oG"‘`Á‚Jf""]2uêT˜X‹A^"Ò&ýû÷‡¾¾nÌÅnoo:(¬»sçNŸ—J¥ ãA&¢V‰^"¢VàÊ•+øé§Ÿ„‰%ðþûïãÝwß…‘‘‘ÚÛ144Ä;#nݺ1S‰H·+¹zzø×¿þ¥SA^ŽID-ÍØØƒ Ò‰´Ž="‘HXNMM­óDz»wïò Që¬û2 ˆˆt[hh(~þùgH¥RUÁÝE‹ÁÂÂ;wÆ{s:·Ó®];¼ûî»ððð`¦Që¨èêXwÇŽsæLßKMMå&¢ÖYïeé¶#GŽÁ]GGG!¸+Ó¡C,Z´Hi–ayFFFø÷¿ÿÎ;3C‰¨uUvu(È‹‚‚4"jQfff˜9s¦Ö¦O,ãõ×_‡X,9ØA IDATÖ=zô¡¡¡u~—e,µÚ:/³€ˆ¨õxùå—‚»2ÎÎÎX²d ,--•Þ366ÆÂ… áîî®°>++ Ÿþ9~üñGf,év…W‡‚¼………<`DÔâˆáÇkm}×ÅÅEaݾ}û”&VE~H"¢ÖDŸY@DÔzˆD"”••Uðúú •X`ß¾}Â:SSS¼÷Þ{J•䬬,¬]»=B^^žÖï÷ÿþ÷?üý÷ßj}vÉ’%èÒ¥‹Ö¤}ñâÅèÒ¥ æÍ›ÇXM7nDVV¾øâ ¿ˆAƒᥗ^Òš4Qóy <<\+Ó(‘H`mm­i‰ŠŠÂ¦M›”Ö‹ÅbØÛÛÃÇÇãǯ×dž¤=>ùädeeaõêÕ°²²=z§OŸ†Ö¬Yƒ_~ù—.]Âo¼þýû3ÓÚ3f ¸¸—/_Öš4M›6Mih†7nàúõëj}ßÔÔ´EÒýèÑ#|øá‡èׯÞ|óÍ]£ÚèæÍ›øá‡TÞלœœ0xð` :T¡Õµ.í_s’•Á&&&X¹r%¤R)vïÞ«W¯ÂÍÍ .d&‘J ðµ"_ýµðºz 3<<û÷ï–ÍḬ̀páB´oß^aÅÅÅøöÛoñøñc†Ðf>>>077–+** ;;;¥{¬<µ]Úä>|¸ÖÍ^ïáá¡p/)**Â;wŒ»wïâƒ>€ž;ê*ccc˜˜˜?§¤¤àðáÃèܹ3ž}öYU°š˜˜hݹIMO$áµ×^ƒ¹¹9‚ƒƒ[6p¡¯—_~~~~ ë322ð믿ª½êtíÕvžžžèÔ©“ð ‘‘‘{÷îa÷îݸqã!‘HZ|ÿ’““aÆ©ìýØRT•Á·o߯ùóçáííaƱ`¢šËIfQ놟~úIÖZXX`áÂ…pttTúlnn®ÜÕ}úôAŸ>}„å’’ÃÑÑ“&Mâ @Dm òúøøheyÕ½{wŒ7Na]yy9¶lÙ‚¨¨(„‡‡cÀ€<±tÔG}¤°œ™™ ˜0aºwï˜9s¦VÇJMK$aÊ”)èØ±#víÚ…§OŸ6{ìíí1{öl¥áÄ °eË©½­®]»êô5ªí¼½½ °®¤¤¿þú+®]»†³gÏbôèÑ-¾ÉÉÉ BïÞ½µ*À«ª –­›6mšÊg7"¡ŽË, "jÝ®^½ªܵ´´ÄâÅ‹k¬ èB‹]"¢U€µlL^Ì›7O©ëª¶Ò××ǨQ£÷ïßç ÕŠÈêÌ Ràëë‹Ï>û :thÖ²f̘1X¾|¹Êàîºuëžž®QÙÏ¤šŸ¡¡!fÏž œ8qÅÅÅÌ”z”Á,—©Î2“Y@DÔ:mذ"‘¥¥¥Â:kkk,\¸vvvm2OÖ®]‹{÷îaãÆBWÓ°°0lß¾øüóÏ…Ï=z‡Æ;#=zòóóqðàAÄÅÅ!77¶¶¶ðóóÃsÏ=§˜‰ŒŒÄ‰'––†’’XYY¡wïÞ?~<ÚµkWkÅîÿûBCC1sæÌ'8)--ÅÉ“'qõêUäääÀØØ˜4i’ÂñMOOÇœœŒ¢¢"8;;cèС8p Bw¸mÛ¶!''o¾ù&öîÝ‹„„cÀ€?~<ÂÃÃqòäI¤¥¥ÁÂÂãÆSO“üQ%>>AAAHJJ‚••ú÷ï=z`ÕªUø÷¿ÿ-´dPEÝý”‰ŽŽÆ_ý…äädXZZÂËË “&MRO´¾Ç‘´Ÿ¶´ä•wu­û»lËüü|aÝÖ­[ñäÉÌŸ?»wïFdd$V¯^ SSSµËuË6u·WSšöîÝ‹«W¯â‹/¾Pº'~ûí·HLLÄ7ß|ccã•mêìÏÛo¿çŸ;wƉ'˜˜KKKøøøàÿø‡ÒC½&éIIIÁ¡C‡pÿþ}”——ÃÕÕãÇZ1nݺñññøöÛo±mÛ6áZøæ›o`ii‰5kÖàôéÓØ·o¾üòKØØØ¨µ]jŒŒŒ®ù¦"‘H0tèP¨œ 833›7oÖ(¸ ýúõÓªÖšš^£²åÇcþüùØ·o¢¢¢:uÂÔ©S•†^Ó¤nÕ”u}}} >‡BLL z÷î]ãþ5ô>RW¾®_¿111€/¾ø...X¶l™FõÉÚÒYßzjõ2¸º>úîîîøðÃå>(‘HԺߪÂú±vb€—ˆ¨•’M¶&ckk‹…  gm‘îÞ½‹„„xzzâââTá–——'Tüccc!‘H„ vnn.¾üòK”——càÀ033CLL 8€¸¸8,X°@¨ EGGcóæÍ°··ÆÊŠÇÉ“'‘——'•êܪ&– C·nÝàëë‹ôôtܼyIIIøôÓO¡¯¯{÷îaíÚµH$0`Œ‰Ÿþ)))˜:uªÂ6óòò°víZôîÝ^^^øûï¿„ØØXdddÀßßýúõCpp0~ýõW¸»» -Á5ÉU"""°uëVXZZbÈ!¨¨¨À©S§„—ÚhºŸwïÞÅ¥K—„‡œØØXœ9s±±±øè£„@[}#1ÈÛÚƒ» jOyåååøá‡••èëëkT>¨S¶iZÞ¨JÓ€põêUܸqC¡;ñãÇ'”% -ÛÔÙ¸sçŽ;Œ1ñññF\\Þÿ}aœcMÒƒï¾ûæææ8p ôõõqéÒ%¬_¿K–,ÆÉ”;v,pôèQL›6­Æ–ššn—Z£G"77·I¶-‰Ð¥KøùùÁ××FFF*?…íÛ·£°°P£íK$LžnÜ8üùçŸÆÍ›7…q€/_¾ |øá‡011‚·6l@tttÁÝ;wªÜ---Exx8úö틹sç ëOœ8!üšîââ‚={ö@,ã£>~‰7n6oÞŒS§NaÈ! Cuäææâõ×_&0ñõõÅâÅ‹‘˜˜ˆ+V•J+++lß¾‰‰‰Â÷5ÉUù}ûöÁÊÊ ü±g#GŽÄgŸ}Vë1•J¥ïgFFfÏžF-¤3$$#FŒ¨÷q$y[{p·¨¨QQQ8tèÄb1ú÷ï¯ð~RRú÷ï÷Þ{O(?wìØ¡Vù NÙæêêªqy£*MÝ»w‡±±1®]»¦à•ƒnpÙ¦îþU?6Κ5K˜TG*•â÷ßÇéÓ§qåʡDŽºé©¬¬ÄÞ½{ajjŠ?þXhU6|øp,_¾ÁÁÁ˜7ožBz…‘;vT˜\O¦>Û¥Ö!%%ǯósÎÎΰ°°@VVrssQQQ¡ô±X ØÙÙÁÙÙððð¨1¨ OŸ>Åï¿ÿŽK—.Õ+ýS¦LµµµÖägC®¥´´4Œ5 Ó¦MûÿÀ޾>Nž<‰ÔÔT¸¹¹i\·jŽ:ì9$++«ÖÏ5ä>¢n¾&''¨jùìêêZ¯ú¤ªt6¤žZSœšš èÒ¥‹°ï ½jrj‰s…à%"Ò æææÈÉÉ–“““…!êcùòåuŽ›+‘HÔ"È*<2ÚÖ•­!œœœ`mm˜˜Lœ8HKK믾ŠÝ»w#66ýû÷ǽ{÷P^^Žž={***pýúu<óÌ3022Rh52lØ0#::Z¨HMŸ>Ó¦M*=²ŠOII‰R]öÞ®]»pñâEôïß¿Öà®, %‰””„ÌÌL!ð:zôhaâŠÇ#)) þþþ ݬôõõ1nÜ8DGGãÖ­[ ÕêÁ333˜ššÂÅÅEø²|”/ê“?ªÎ¹ììl¥<³±±ŸŸΟ?_c^äååi¼Ÿ cð‰D"Œ?çÎÃíÛ·…¯¦Ç‘tWsyu)¸{øða>|Xù!B_ÿüç?•ZðÀÔ©S…‡]MÊuʶú–7òi’¥ß××!!!ÈÍÍ?W¯^…µµ5ºuëÖà²Mý‘/P.M˜0.\ÀÍ›71hÐ Ò“––†ÔÔTLš4I¡Ë°¥¥%^zé%&¥ªXjŠí’v{òä ¶nÝŠÊÊÊ?c``€ñãÇ+t—J¥(..FII ÊËËa``€víÚA"‘ÔÚò]^ii)Μ9ƒ'NhÜjWÆÏϯκUskèµôüóÏ+,»¹¹)ÔÍ4­[5GGvÌÕ9öõ½Ô7_ëSŸTuoi¬íÖ¦1ܟªcýX{1ÀKDÔÌÜÝݼ§NjP€·¶Öšª¨¨ÀÙ³g•ÒÛZˆD"x{{#$$EEEÂð žžžððð@ll,€ªV½@U‹_ ª¥Aee%BBB¢rÛòcÒ™ššâÑ£G¸víRRRðàÁ$$$ °°‰Dé»·nÝPÕ²áÆÈÊʪuì+}}}¼øâ‹Ø·o–-[777xxxÀÛÛžžž‹ÅBëY÷.y²ñÙd³òÊ´k×Ni 3‘H¤4žXõй¦ùS]FFFi­I}öÓÅÅEi áàà ðYM#é¶æ òêZË]¥–œ¶¶¶ðôôTYNI$…135)Ô-Û4-oª§IfÀ€ Áõë×1jÔÿ±wïQQçþÀ¿ãÀpÃUEPDDd €\• (SMãeEӴͱ1®6Ö4=MކæäˆÆ6&êÉJãZ¦M[W4¡11Þ$‚"7Dî.2 ‚܇™ßþfFœuôûYË•°gfï÷}˜ýì½ÞýîùhnnFMM !‰†Û é–§§§0 Cÿãûرc…¼dL{†Ê«ÃyÈÔH­—]J¥;wîtÔ¥X,ƬY³˜˜8`?‰D°³³3é\µ½½gΜÁ™3gÐÕÕerûCBBðòË/?rqξdgg‡Ñ£Gynfì¹Õƒ8çÑNïq¿ù]‡s15®¦œOvlîzïÇÇAcŽOã»B¦a—ˆè Ñ)\¾|ÄÒ¥Kj»4 öíÛ…B¡³<44ô±Š`` 222PUU…ÊÊJ¸¸¸ÀÕÕÓ¦MCII ÚÚÚP^^áV2íí…111ƒžöÿ+ö¹sçðÅ_@"‘ r¹‹-BZZšP̽׫¯¾ lß¾ûöíÃúõë‡á‹   ¢´´gÏžÅéÓ§!“ɰ~ýú!c =iÓwÛ¤)ŒÏ`Ÿ¬èf*cû©V«uNLMù=’eé"¯%NËàïïÄÄDƒßï´>Ææ‡ûå6SòÍ`S ùúúÂÉÉ ùùù˜?þ€é†›Û éöÖÚÁrX,FOOÑíQ©Tz‹>Ã5Rë¥Gמ={píڵ˟zê)Ìš5 sçÎ5h 0C´··ãÒ¥KÈÍÍEYYÙ}ïP»Ÿ˜˜¬ZµÊ ½>hÃÙ— 9†{nõ ÎyêëëÜ¿À;œãÈHä¨ÁÎ'‡;©çãæ:z|zß2 ¼DDØŒ3pôèQa>%8~ü8êëëñÜsÏ úP“‘T[[‹ƒxè‚vdëãDûWéÒÒRTVV QÓÎÉ[RR‚+W® >>^øŒöD´¯¯OxŸVoo/ª««…Ñ)*• û÷ï‡\.Ç«¯¾ªs=Ø \`` ð4áY³f!++ yyyæ¶ÔR*•hii««+âââ•J…¬¬,ìÛ·'Nœ 2ú.Ê´ËŒ¹l(ÆÄGí-Þ …BçiÎÚe†lÛ˜~ÖÕÕA£Ñèœü+•J455 Ór˜ò{¤ÇÃHy-ùj*?’Û´sNššoú‰D CZZÚÚÚ““???¸¹¹™%·ÒŸÕ«W¸;Çâ½y©§§˜6mšÑíÑæÕÆÆFê¼7''õõõ&=pÊÐõ²üøèèèöwwwøûû#88¾¾¾÷-œÞûîmooGkk+®]»†ºº:TUUÝ÷˜o(¬X±111l\Gj5åÜêAœó¨T*üûßÿ†T*¿Ìy15®¦œOÓvs®w¸Ç&cOú»B¦c—ˆè‰Dxùå—±}ûvá¯ÌÀÝÛô‹‹‹agg7à–ø‘ÔÕÕ¥w>*{{{½vKgcc???áÆÂm<==agg‡'N ¯¯Oç¤PûêÜÜ\,\¸P˜ƒNœ8£Gâ­·Þ‚««+Z[[ÑÓÓwww“ž††”––B£Ñ ¸àéÿÿ?ýéOqñâE¤¤¤ öööú P(ðç?ÿñññ“w­¬¬‚}ûöA­VÃÑÑ^^^ÈÊÊÂüùó…¿Â«T*>|X˜®ÂŒ‰>'N„££#ÒÓÓ%ô¹­­í¾S1¥Ÿ×¯_ÇÙ³g1kÖ,áôàÁƒP©TÂHS~ôø0w‘÷I-î› ÉmÃÍ7÷Šˆˆ@ZZšð‡×W^yÅl¹Íþh566"77WÈA‡Foo/ž~úi£Ûãáᤧ§cÖ¬YB^U*•øúë¯áêêjRþ©õÒ£ëw¿ûnܸ™LfôˆÅ;wîàôéÓøá‡ Ñh R©pçÎtww{tî`&L˜€ßüæ7fU]I=Üß#Y>syŸäâ®±ùÁÜ6Ü|£/ŸŽ3°µµðPšálËÐþwôù矣¨¨cÇŽEUUÊËË1iÒ$÷ÚíüŠ»wïÆæÍ›‰D‚ÜÜ\ttt`Íš5¦]<ŽÐzéÑåàà`òqN"‘àÙgŸEdd$Ž;†sçÎé n æ§}$ 1#¼/sneÎsžK—. ýÒh4¸~ý:ª««ÑÞÞ“vgîܧí{zz:‚ƒƒ<"çÍ#u>>Üã 1ǧþx~ühûøøüwÿ/_ÿÿÞûÅ$"zT<ãÆÃ´iÓPZZúH=uZ&“á·¿ý­E?\­¯¯Ç‡»»»Þ¹©¤R)¾ÿþ{<õÔSXºt©pŒëììDII BBB0cÆ ÏŒ=‘‘‘hmmEEEJKK!‘H°hÑ",Y²Dø+¶H$B@@š››QQQššØÛÛãç?ÿ9âââPYY‰ºº:DGGÃÖÖ§N‚‹‹ „mM˜0ååå(((€\.0 E,#((J¥eee(**B[[<==ñ³ŸýLx ’‹‹ BBBpýúu”——£²²NNNxþùç¯sl/((À7<9÷Ô©SpssÓ‰Ggg'Μ9ƒÀÀ@Lš4ɨø füøñðññA]]Š‹‹ÑÓÓƒ… "00çÎCBB‚0²ýüùóP*•ˆ‹‹3ºŸÇŽüyó0{öl”••¡°°‰sçÎÅêÕ«Mþ=ÞÛ&z<ˆD"„„„ ©©IgZCYrq·¹¹çÏŸ‡ŸŸŸð‡°ûÉËËCkk+,X`Rþ44·“okSÿßqWW*++= À;œÜfhŽ?Žàà`,]ºÅÅÅ(,,„H$Btt4~ùË_ê<¡Ý˜öÈd2LŸ> ¸té®\¹wwwüâ¿~§÷ÆG¡P ??³fÍ‚‹‹ àêÕ«())Á¼yó`oooÐz‰ú³³³CPPæÎ‹Ñ£GãÖ­[hoo‘mõôôÀÆÆfÀÃ!¶Û·o#-- ãÇΩLÙGËi (((ÐÙw =·2öœGŸÆÆFäåå¡¥¥UUU¿––¸¹¹áÙgŸÅŠ+ ퟹsŸ““ Š‹‹qóæMÌœ9Ó¨óÉû[ú3f½†ä`s =>é;f÷»B#xÞº`Á ¼D4\ún³Ò.ëÿšö¶þÿ?Ô²Á^ËÎÎ~lb§R©‘‘ÜÜ\\½zuÄnYʨQ£0eÊDEE!::zX¶"2–Z­Fgg'lmmܶ÷Ã?`ï޽صkOé¡~Gÿú׿5’—#wÉP¯¿þ:ÂÃÃñòË/3ôÄhmmEyy9ª««qíÚ5466 #?õyê©§0fÌttt ¹¹yÈu[YYá?ÿó?…?BóÜŠçVDOžq=ìDle%LnçÎtttŒèÜdý‰D"ØÛÛã©§žb‚Fƒ¤¤$L:¿þõ¯…?*«ÕjdddÀÛÛ{ØO*&c§k`q—ˆhh...ˆŽŽÖ¹üÎ;èììDoo/T*¬­­acc{{{H$wF;vLxf‚>*• Ÿ~ú)6nÜGGGž[ñÜŠèɨ+0DDkkkƒ Cô¸‹Åˆ‹‹ÃñãÇñé§ŸB.—C$!;;555X·nï$¢‡ÎÐ"/‹»DD¦ŸkoKŒ••~ò“Ÿ`æÌ™8rä²³³õŠhkkÃ'Ÿ|‚7ß|ó‰,dòÜŠè ¼¦â¼Dd‰ø¢Ç‹ŸŸFÒÒRäææ¢ªª R©/¿ü2 z$ÜoN^wÉLJ‡‡ž~úiƒÈ@öööFTT¬¬¬ÐÔÔ„ÞÞ^÷´··C¡P <<œçV<·"züÏS9/™çà%"¢'é˜wòäIœ9s7oÞ„‹‹ æÌ™ƒ ps"¢‡ ¯¯eee¸xñ"._¾,ÌÓëíí·ß~›"¢Ç ¼Dd¶‹ÝÁ–±ÀKDDDDDŠR©„B¡€››Û;/=Yxÿ=6ìííáããÃ@у÷Y(x‰ˆˆˆˆˆˆˆˆˆ, ¼DDDDDDDDDDŠ^"""""""""" Å/‘…b—ˆˆˆˆˆˆˆˆˆÈB±ÀKDDDDDDDDDd¡¬""zâÓO?°\"‘`ܸq˜9s&fÏž ±X¬óú;#ææflÛ¶ ÎÎÎ ¤1¶Ddª£GâôéÓ°¶¶ÆŸþô'üýïǹsç°fÍ„‡‡3Ž_ÿú×ˆŽŽÆK/½ôXåxèQ Ñh——‡ŒŒ 455¡»»®®®˜4i “ÉL^÷®]»ÐÜÜŒäääyÔÁÁ›7o~(í²ô}·¯¯øÃÐÕÕ…ÀÀ@üæ7¿Ñû¾’’üïÿþï€åb±cÇŽE`` /^ áµ›7oâí·ßFXX~õ«_q¡ac—ˆˆ+~~~˜C^^d2ÂÃÃakk‹ëׯ#77ÙÙÙxýõ×0byôQh—¥í»eeeèêêp·ˆÛÕÕ©T:èû}}}1eÊáçîîn”––âÔ©S¨¨¨À[o½…Q£x#= x‰ˆè±"—˱`Áe===øÇ?þüü||ÿý÷X¸p¡ðÚÆZàÈ‘#¶Èï½m×·ìaÅ–ˆ,Ûõë×Ï=÷üýý/¾ø"^|ñE‹Í‘c>é>™ó8Éã=l………ÈËËCdd$~ñ‹_èù–.]Š÷ßûÛßðÁ˜¥¨/> í²´}7''€’’\¸p³gÏôýþþþHLLÔY¦R©ð—¿ü%%%ÈËËCDDwüÓ=ölllðÊ+¯ÀÑÑ'OžÄíÛ·"¢G”F£X[[3DôX(//,\¸p@¡ÔÕÕéBo IDAT³gÏFWWh}Ðí²$½½½¸páœñÓŸþ››kôz¬¬¬0þ|À?þÈF GðÑ“qÀ³²Bll,¾ûî;”••!88°{÷nTUUaûöíÂÏX·nöïߢ¢"lÛ¶ R©8xð *++ÑÚÚ 777DEE!>>~Àܾõõõøî»ïðã?B¥RÁÓÓ‹/ÆÔ©S±cÇ”••’““1aÂ$%%ñí·ß¢¶¶ÝÝÝðððÀìÙ³©s{ÚPíÔw‚šššŠœœ´´´ÀÞÞ¾¾¾Xºt)ÆŒ#¼Ïþék»T*ÕÛ}±mkkúuë’’‚’’ÀäÉ“±lÙ2Œ?^§ÝUUU8räjjjàììŒððp`Ë–-ذaƒ0"ÅÐþ‘q†ÊcZÆä,Cöÿ={ö //ðÁÀÉÉ úÓŸpúôi¤¤¤`ëÖ­puu5*GüùÏFOOgµ´ëܼy3ÆŽ{ßÜZTT„“'OB¡P §§ÎÎÎÆâÅ‹akk;hŽÔ—G"vC1t[Z—/_ÆñãÇQ[[ '''LŸ>K—.Õ™?R_ŸFú8ij¾îñˆh¸îܹhmm…‡‡Ç€×ããã9`žYcö)­ÁòèÃh×`9õ«¯¾BNN’““ì»Û·oÇÕ«WñÁàŸÿüç€DEEÁÕÕ™™™¨­­Ekk+¢¢¢„ CúGDƹ_3%g²ÿËd2H¥RTVVbùò刋‹ƒ««+®^½Š’’Ì›7öööF刬¬,ôõõ ˜‡R»Î¸¸8888 ™[+**ðñÇÃÊÊ ÑÑÑðññR©Dnn.Z[[ zs¤¾|8±Œ1Û:v캻»qæÌL™2!!!P*•ÈÉÉAQQfÍš%lëÞ>zÎqÒÔ|?œã‘9ˆD"äææâÂ… ¸yó&œœœðÔSO û„µµ5¤R©Îyœ1ûÔùóç¡T*7h}í,§ÚÙÙ!''ÎÎÎ:çímmmøê«¯†ÈÈÈû®!Ç&cÚ7”ï¾ûX±b\\\pãÆ \½zÎÎÎÂu„Vss3Ο????B³VAA.]º$ä`¸}û6ÒÒÒ0~üx̘1ƒ; GðÑC;ú ¹¹yÈ÷ÕÔÔ <<o¼ñ†pkÛÞ½{¡V«‘””$œ$'&&â›o¾Á©S§PXXˆ¨Õj|õÕWJ¥Ø´i“ðûØØXüñÄ©S§ðÚk¯¡¶¶ÀÝÑBžžžÐh4øòË/!‹±qãF¡0‘˜˜ˆO>ùiiiˆ‰‰Ñy’±¾vÞ«··yyy ÅÚµk…å'OžF¢yzzâÀõÏËËk@Ûè]¦B¡Àüùó±|ùòÿ;±²Bjj*àåå•J…””8;;cÓ¦MBáeÞ¼yxï½÷LêÎ<¶víZ£s–!û¿‡‡‡p+ð¤I“tV£eLŽ0…¾Üš kkk¼ýöÛÂö4 vî܉˗/ Ÿ,GögJ¾7$vú˜²­¦¦&¼òÊ+ˆŒŒp÷Ömí± 33Ï<óŒÞmz1õ8iî|ojL‰Lˆ_|‡FFF222ààà???L›6 ¡¡¡=z´IûÔ½ É£²]úrª¿¿?ìí푟Ÿ¯óì íÈã™3gštlzíµ×LŽ[J¥ÅÅÅpvv†··7 88éééÈÍÍżyó ú½www£¤¤ß}÷Äb1ÂÃù3ЈáŸ%‰ˆè‰1Ô*÷Z¶l™pÚ×ׇ‚‚„††ÂÎÎJ¥J¥ÝÝݘ3gø … ˆÕ™.ÁÉÉ /½ôÒ ºhooGMM fÍš¥s«š••¡ÑhP\\¼õÖ[8zô¨0wîƒ:7{Píº7§ZYYaÆŒøñÇÑÚÚ*,ÏÉÉ‹‹ ¦M›fÒ±É\q+((@__f̘!\7L™2ööö¸zõ*nܸ¡÷s‡ÂÚµk…6lÀž={pçά^½îîîÜhÄp/=1´'÷›—U"‘ÀÉÉIø¹¹¹jµ™™™ÈÌÌÔûíœZMMM w³¡žš«U¬ïsÚ¹û_Ðêk§Þ½•V®\‰””$%%ÁËË ¾¾¾ËåðóóƒX,6ªÃegg7`$Ƚ÷¡bx(†ôˆŒcH«¬¬4:g²ÿ·}æ˜;U_n•J¥¸yó&òóóQ__ºº:TWWC©TB"‘µ~Sò½©±3e[&L°n¸»»x››QSSƒÄÄD½û¢!¹£±±Ñ,qËÉÉx{{£¥¥EXîããƒââbäææâÙgŸð9__ß#¦ÝÜÜàççÇçBЈc—ˆˆžõõõî_àíÿàîhˆ‰‰ôâS;ªK¥R™ý"Q{ѪmÇ`íLll,‚‚‚PXXˆÒÒRœ={§OŸ†L&Ãúõëêß°O<¬îêqo?ûÓ7'âýú7ؼsD¤ßpóØ`9Ëý߯æˆÁh.t¿cœ;w_|ñ$  —˱hÑ"¤¥¥émkî|o®Ø²­Á¨ÕêA‹Ùê8iÎ|?1%,§~öÙg˜:u*ââât^³··GBBüýý±uëVäçç#<<üœ›=¨v v¾êëë '''äççcþüùCNÏ`hî0GÜÚÚÚP^^àîëô¬ÀëïïÄÄD~éé¡àQˆˆž˜“ëÿûßJ¥ðóó3ê³Ú‚p__߀Ïööö¢ººvvv ÜzÕØØˆÀÀ@÷æää ¾¾Ï?ÿü Û¸víÚ€×´ËúÏ‘h(¥R‰––¸ºº"..qqqP©TÈÊʾ}ûpâÄ aþACú÷ hc¨P(ܪ«P(ŒîßêÕ«¹™°•Ç´ó°š;g™;Ghio/îO;G¥!Çýû÷C.—ãÕW_Õ)"Z}ùÞ\Ûª««ƒF£Ñ)¢(•J455!((è¡'™ïÉb‹.VV¨©©Acc#žyæ½Jÿ÷G*cö)Km—H$BXXÒÒÒÐÖÖ†œœøùùÁÍÍÍäc“¶¸:œöi Í!!!¦ýÑh4Ø»w/®]»…BqãÆñ N ÎÁKDD½žžüíoC{{; ùª¥±•››; xpâÄ ìܹíííîÞ6æââ‚ôôt(•J Ó¯¿þ•••:'ÐÚ¢ƒ££#¼¼¼••¥s+˜J¥ÂáÇ!‰ —Ëî»B¡@rr2Ž;¦sB¯}¸„vD–¡ý»_ÁDß2cMœ8ŽŽŽbØÖÖ†sçÎÝ?"2Ž!yÌÉÉiDr–¹s„6‡ß¸qÝÝݲÖÖVäçç´½ÖÖVôôôÀÝÝ]§¸ÛÐЀÒÒRh4£òáHå{smëúõë8{ö¬N?<•J5舸qœd¾'K…BƒøÃF£ÁÉ“'@(JšznfiíÒæ”£G¢¡¡³fÍֱɯÆfØíÓNϘ˜ˆàà`!!!Â(sssùŦG GðÑcåÒ¥KÂIŸF£Áõë×Q]]öövøûû#66Ö¤õ._¾Û¶mÃÖ­[ ©TŠŠŠ TVV"22Rx®vŽÀÝ»wcóæÍ ƒD"Ann.:::°fÍá}žž.œ4®\¹;vì@rr2"##agg‡¢¢"Ô××#>>Þ¤¹%½¼¼ “ÉššŠ®®.Èd2477£¤¤b±ÑÑÑFõo°¶ë[f*‰D‚+V`Ïž=زe f̘µZóçÏÃ××EEEÂö íq`@‰D#’³Ì# ¥¥¥Ø±cfΜ‰®®.ddd`úôé(,,¼ïöÜÜÜàêꊴ´4ܸqãÆCSS áææ†††ìß¿K–,ƒƒÃ}ó჌)Ûš}ú¹}¤“Ì÷d±^xáTWWãĉÈÍÍ…qëÖ-TVV¢¹¹˜={¶Ñû”%·ËËË cÆŒAFFlmm…?ؘzlnûšššPSSƒ‰'úàÆ˜˜¤§§#''Ï=÷œY§e»páöîÝ‹ÐÐP¼ôÒKÜqȸó7†€ˆˆ'ååå¼YÚB€L&óÏ>‹9sæ˜üЭqãÆáÝwßÅpéÒ%tvvb̘1X¹r%æÎ«srŒ?üá8|ø0Ξ= µZ OOOüìg?ƒ¯¯/@.—#00ùùùhiiApp0¦L™‚M›6áÛo¿Å… pûömŒ?¯¼òÊžеµ5Ö¯_Ç£¬¬ 999J¥ðòòBBB‚ð cú§¯íú– GXXìííqôèQœ9sîîîX²d ÆŒƒ¢¢"<õÔSFõˆŒcH‰œeîóæÍÃíÛ·qöìY|óÍ7ðôôÄòåËaoooPwÔ¨QX¿~=¾þúk\¾|eee˜8q"Þxã ¸ººâ/ù Š‹‹±hÑ¢Asä½dìŒÝVXX,X€Ó§OãÒ¥KpssÃâÅ‹±hÑ¢! â8É|O–J"‘àí·ßƹs犊 tuuÁÉÉ cÇŽÅóÏ?»ŒÙ§,µ]"‘8zô(ÂÃÃïûÐJCrÇpÚ§•Û¿ }/Lœ8555¨­­ÅĉÍö=Q©T¸uëzzz¸ÓÑD ,Ðôß¹úÿ÷Þˆh0CÝšØÿµþ·1jÿ¨eƒ½–Í =¦Ôj5:;;akk;`:~ø{÷îÅ®]»`kkË`1G0G<$»wïFUU¶oßÎ`™Iyy9²³³ñóŸÿœÁ £p^"""z¤h4$%%aÏž=: R«ÕÈÈÈ€···Ñó(s™Wÿ90‰ˆÈ<êëëùð62 §h ""¢GŠX,F\\Ž?ŽO?ýr¹"‘ÙÙÙ¨©©ÁºuëxgssÄCÒÒÒ‚sçΡªªjÐ9*‰ˆÈx¨««ÃÊ•+ 2§h "³à DdîœræÌddd ¹¹666pwwÇâÅ‹áïïÏ1G0G<$ùùùøÛßþ† &`ÕªUf’ˆˆˆLÃ/™íBk°e,ð ÎÁKDDDDDDDDDd¡Xà%"""""""""²P,ðY(x‰ˆˆˆˆˆˆˆˆˆ, ¼DDDDDDDDDDŠ^"""""""""" Å/‘…b—ˆˆˆˆˆˆˆˆˆÈB±ÀKDDDDDDDDDd¡Xà%"""""""""²P,ðÑåwÞÁÚµkqóæMaÙÑ£Gñ»ßýo½õàïÿ;Ö®]‹ÜÜ\Œˆ˜]»váwÞô燕#éÿܼyk׮Ş={Wzd°ÀKDDDDDO{{{888@$êëëqèÐ!Èd2üô§?ØØØÀÁÁVVV#ÞžÚÚZ>|íííåóDDCåHb\éÑgÅÑ“dãÆ:?_¿~ðÜsÏÁßßðâ‹/âÅ_| í©­­Å‘#G GGÇþy"¢¡r$1®ôèã^"""""z¢i4€µµ5ƒADDD‡#x‰ˆˆˆˆh€¢¢"œ>b±Xç½õõõøî»ïðã?B¥RÁÓÓ‹/ÆÔ©S»wïFUU¶oߎ={ö //ðÁÀÉÉ úÓŸpúôi¤¤¤`ëÖ­puu5h½¦ÄbÇŽ(++$''c„ HJJ2øw0Ôç‰=º9õ^øöÛoQ[[‹îînxxx`öìÙˆŒŒnÿÿðÃqåÊìÚµK˜j&77Ÿ}öÜÝÝñ?ÿó?ÂúŽ=ŠC‡aýúõÐɑڜÙÖÖ†uëÖ!%%%%%€É“'cÙ²e?~¼NûªªªpäÈÔÔÔÀÙÙáááÀ–-[°aÃáN }ŒÝ–!yn8±0†1Çž‘Ž«9¿od8‚—ˆˆˆˆˆt\¾|Ÿ|ò :::0gÎÄÇÇÃÉÉ ©©©øâ‹/îûùþóŸ8t蜜œ°`ÁL™2………صkT*•ð¾ÒÒR|üñǰ±±Á3Ï<ƒÑ£GãÔ©SøðáV«…÷µ¶¶â½÷ÞC~~>üýý‘©TŠo¿ýùË_„¸PVV†÷ßõõõˆŒŒÄܹsÑÔÔ„;vàÊ•+ÚºhÑ"$&&–/_Ž5kÖè퓱ë54/¼ðæÍ›XµjV¯^mÔï`°Ï3"z´sjW®\ÁæÍ›QQQ   <óÌ3¸}û6>ÿüs8p@x_`` T*ª««…e•••€¦¦&9»ËËË!‘H†ücÕíÛ·ñᇢ¯¯K—.ETTJKKäõ‹/âÃ?DSSbbb0mÚ4¤¥¥!%%Åà>º-Cóœ¹caÎcÄHÄÕœß7²ÁKDDDDD:²³³amm·ß~îNc°sçN\¾|yÈÏööö"//¡¡¡X»v­°üäÉ“Âh"OOOá{ÕªU˜;w®°ýë_8}ú4Ο?èèhÀ V«‘””$Œ¦MLLÄ7ß|ƒS§N¡°°!!!P«Õøê«¯ •J±iÓ&H¥R@ll,þøÇ?âÔ©Sxíµ×tÚëááÆÆFÀ¤I“0eÊ”}2e½†ÆÂËË µµµîŽÚÒÆÆÐßÁ`Ÿ74fDôhçÔþ4 ¾üòKˆÅblܸQ¸#"11Ÿ|ò ÒÒÒ™L¹\Ž ¬¬ ~~~€ŠŠ Œ? ¨¨¨@xx8îܹƒêêjLŸ>}Èij æÏŸåË— ˬ¬¬ššŠ††xyyA¥R!%%ÎÎÎØ´i“Ð×yóæá½÷Þ3¸Ÿ†l˘ àêêŠÙ³g ?‹D"<÷Üs°¶¶Faa! ¯¯ …”J%”J%º»»1gÎ.X +\`€““^zé¥!o ¾_±Á”õ sþŒ‰=Ú9µ¿öövÔÔÔ`Ö¬YBq¸[LLL„F£Aqq1`ܸqpqq¦péêê‚B¡@||<$ ÊËËܬR©tßí'$$èü¬-´jûP[[‹7n ..N§¯®®®ˆŠŠ2*f÷Û–1yn$baŽcÄHÅÕ\ß7²,ÁKDDDDD:¤R)nÞ¼‰üü|Ô××£®®ÕÕÕP*•H$C_`XYaåÊ•HIIARR¼¼¼àëë ¹\???¹_===1j”î˜;;;Œ;V(ˆ677C­V#33™™™z·ÙÙÙ àî­¶ÀÝQ¹÷Šˆˆ09¦®×˜X˜ów`L̈èÑΩ÷îÛƒå"í|­ÚÜ)‰ —Ë‘™™‰îînaJ???øúú EÍŠŠ €\.rÛvvv=z´Î2í|¿†äÊ{ç“î¶ŒÉs掅¹Ž#Ws}ßȲ°ÀKDDDDD:Î;‡/¾ø‰ËåX´hÒÒÒ„ÑaC‰EPP QZZгgÏâôéÓÉdX¿~½p+í½Å]-±XŒžžwGi@LLÌ ÊÚQJÚù ï½8®á¬×ÐX˜ów`L̈èÑÏ©†ÐþÁH»ÿwçžÍÈÈ@UU*++áââWWWL›6 %%%hkkCyy9<<<àìì<äúµ'3$÷è3X¾î¶ Ís挅9#×ñ}£G ¼DDDDD¤s¡ºÿ~Èår¼úê«:C]dj)•J´´´ÀÕÕqqqˆ‹‹ƒJ¥BVVöíÛ‡'Nkhh€F£Ñ¹(îééAcc#¦M›ÂmÈ}}}Â܉Z½½½¨®®†ÀÝÝÀÝ'Ìê¼7''õõõxþù玉¡ë½÷âÞ˜X˜ów`L̈èÑΩúöík×® xM»L&“ Ë´w ”––¢²²Rxp˜6/”””àÊ•+ˆ7K_µ¹R¡P ˜–@¡P˜5®Ææ¹‘ŒÅH{L‰«9¿odY8/ Z[[ÑÓÓwww Ɔ”––B£ÑO&×G¡P 99ÇŽ–YYY ôR«ÕÂòÆÆFäææ ?k4>|½½½xúé§@”››;àBöĉعs§ðt¸¸¸ ==J¥RxŸR©Ä×_ÊÊJ“FX™º^cb¡íÿp~ÚeÆÄŒˆíœÚŸ££#¼¼¼••…––a¹J¥ÂáÇ…©´lllàç燢¢"ÔÕÕÁ××ÀÝéqìììpâÄ ôõõ (Jšjâĉptt+ÛÚÚpîÜ9³ÆÕØ<7’±©c)q5ç÷, Gð‘ÀÍÍ ®®®HKKÃ70nÜ8455¡°°nnnhhhÀþýû±dɽ·ù{yyA&“!55]]]ÉdhnnFII Äb1¢££…÷:99áóÏ?GQQÆŽ‹ªª*”——cÒ¤I:ï[¾|9¶mÛ†­[·"::R©¨¬¬Ddd$¼½½ï^Üüÿ9owïÞÍ›7#,, ‰¹¹¹èèèÀš5kL»h2q½†ÆB{‹nzz:‚ƒƒdÔïàÞÏ3"z´sj"‘+W®ÄŽ;œœŒÈÈHØÙÙ¡¨¨õõõˆ0'«\.GJJ £VG???ÂÞÞ“'O6K_% V¬X={ö`Ë–-˜1cÔj5Ο?___4%¡ŒÍs#‹‘:ö˜Ws~ßȲp/ýߨQX¿~=üýýqùòe|ÿý÷¸uëÞxã lذ“&MBqq1îܹ£÷óÖÖÖX¿~=¢££QVV†C‡¡¸¸&LÀï~÷;L™2Exo@@~ó›ßàæÍ›HKKC{{;âããñæ›oê<€lܸqx÷Ýw„K—.!55J¥+W®ÄÏþs‘QÁÁÁøÃþ™L†³gÏ"==NNNxóÍ7… zS˜²^Cc!—ˈüü|œ>}ÚèßÁ½Ÿ76fDôèæÔ{M™2›6m”)Spᤧ§C"‘à•W^Á /¼0àýÚ©O=õ”0­ðSÈår£æÇ½Ÿ°°0üö·¿…““Μ9ƒŠŠ ,Y²óçÏÚa.Ææ¹‘ŒÅH{Œ«¹¿od9D ,Æfk¿üúö< ¢¡ u›`ÿ×úߢýÿ¡– öZvv6ƒNDDdÁ^ýu„‡‡ãå—_f0ˆˆjµ°µµ…Îk?üðöîÝ‹]»vÁÖÖ–Áb\ÉÌ8‚—ˆˆˆˆˆˆˆˆ†E£Ñ )) {öìÑä£V«‘‘‘ooïJb\É<8/ ‹X,F\\Ž?ŽO?ýr¹"‘ÙÙÙ¨©©Áºuëxw8ãJ#„^""""""""¶%K–ÀÉÉ ø×¿þ¸»»cÆ ð÷÷g€W!œƒ—ˆÌ‚sð=xœƒ—ˆˆˆˆˆˆˆˆˆÈB±ÀKDDDDDDDDDd¡Xà%"""""""""²P,ðY(x‰ˆˆˆˆˆˆˆˆˆ,DÓfò IDAT ¼DDDDDDDDDDŠ^"""""""""" Å/‘…b—ˆˆˆˆˆˆˆˆˆÈB±ÀKDDDDDDDô˜¨««ÃÚµkqöìYÃHï¼óÖ®]‹›7o2dQXà%"""""""¢a©­­ÅáÇÑÞÞn±}°··‡ƒƒD"ÑÕo²|V  Gmm-Ž9‚àà`8::Zd6nÜøDö›,GðY(Žà%"""""""!»wïF[[Ö­[‡”””””&OžŒeË–aüøñ:ïollÄ·ß~‹ÚÚZtwwÃÃógÏFdd䀩ŠŠŠpêÔ)Ô××ÃÑÑr¹aaazÛÑÙÙ‰ƒ¢²²­­­pssCTTâãã!‹…÷õöö"55999hii½½=|}}±téRŒ3FïºwìØ²²2@rr2&L˜€¤¤$£û£/vX·nöïߢ¢"lÛ¶ R©Ôàþ@UUŽ9‚šš8;;#<<زe 6lØa{UUUؾ}»A±ªß†¶o¨>JìããóßÚ´;–¾̘ùGˆˆFÚš5k"""""zäååå¡­­ gÏž…T*ELL œœœ——‡ÂÂB<óÌ35êî ÖW®\Á¶mÛÐÖÖ†ÐÐPL:×®]CFFzzz0}úta½øë_ÿо¾>DDD`̘1ÈËËCQQ”J%‚ƒƒáéé hmmErr2®]»†àà` ££YYY¨©©ADD„P÷ùüóÏñý÷ßc„ ‡D"ÁÅ‹qñâEÌ™3GhkH$¸zõ*V­Z…˜˜8;;ÕŸÁbwëÖ- ®®ÞÞÞˆˆˆ@GG‡Áý¹xñ">þøcôõõ!** ®®®ÈÌÌDmm-Z[[%®óòòÐÚÚŠ  OOO½ý6&ÞƒõÑÊŠc2Épü¶ …BùóçcùòåÂ2+++¤¦¦¢¡¡^^^Ðh4øòË/!‹±qãF¡è˜˜˜ˆO>ùiiiˆ‰‰L&ƒR©Ä·ß~ WWWü×ýF HHHÀÖ­[lÿÀP«ÕHJJ‚«««°Þo¾ù§NBaa!BBBÐÛÛ‹¼¼<„††bíÚµÂçOž<‰“'OB¡PEãþ¼¼¼P[[ àîÈdOOO£ú3”šš„‡‡ã7Þ€µµ5`ïÞ½õG¥R!%%ÎÎÎØ´ióæÍÃ{ï½7äv ‰…¾~ï¡úHd ÎÁKDDDDDDD4Ât~öòòp·ííí¨©©Á¬Y³t¦B°²²Bbb"4 Š‹‹Ür@©T"!!A(£#æÍ›§³¾¾> 44vvvP*•P*•èîîÆœ9s—/_Œ5 "‘555¸~ýº°Ž… â£>Ò[ÜŒ1ý¹ŸeË– …OcúS[[‹7n ..N(«+¢¢¢†Ü¦©±0¦}ƒõ‘ÈXÁKDDDDDDD4‚ìììt ±ÀÀ©0›››Üîà^Úyzµ…FíM{ïzÕj5233‘™™©·}î_W®\‰””$%%ÁËË ¾¾¾Ëåðóó0·íPŒéÏP$ œœœLêOSSÓ}Û0ScaLûë#‘±Xà%"""""""AÃOU[LìëëÓùYŸ{ ÇÚÏÄÄÄ ""BïgúnEPP QZZгgÏâôéÓÉdX¿~½0å€9û3“û3ÔúõÍ%|/Sbal¼õõ‘ÈèÃ=\Úi ®]»6à5í2í|µcÇŽpw ooo÷ÖÕÕé]o__üüüt^ëííEuu5ìììJ¥---puuE\\âââ R©••…}ûöáĉX½zµÙûcJœ é»»;€»s ûûûë¼W¡P ¹ScaLûˆÌ…sð=dŽŽŽðòòBVVZZZ„å*• ‡†H$‚\.øøø@*•âäÉ“:·ûwvvâôéÓ:ë•H$@nnæ‰'°sçN´··¸[ôLNNƱcÇ„÷XYY S«Õ÷í‡F£1º?Æ0¦?'N„££#ÒÓÓ¡T*…÷µµµáܹsCnÇØXhûmLûˆÌ…#x‰ˆˆˆˆˆˆˆ2‘H„•+WbÇŽHNNFdd$ìììPTT„úúzÄÇÇ óÆÚÚÚâùçŸÇÞ½{±yóf̘1£FB^^ÜÝÝÑÚÚª³îåË—cÛ¶mغu+¢££!•JQQQÊÊJDFF £€½¼¼ “ÉššŠ®®.Èd2477£¤¤b±ÑÑу¶_; Ezz:‚ƒƒlpŒeh$ V¬X={ö`Ë–-˜1cÔj5Ο?___ :}†¡±Ð×oCÛGd.bŸÿîŸLúÿ÷ÞDCDô¨X³f ƒ@DDDDD¼¼¼<´¶¶bÁ‚:ËPPP€Y³fÁÅÅàââ‚\¿~åå娬¬„““žþyÄÇÇëÔf¼¼¼0iÒ$466âòåËhkkÃÓO?—_~ÇGpp°ð¶Ñ£G#22­­­¨¨¨@ii)$ -Z„%K–óÑŠÅbA©T¢¬¬ EEEhkkƒ§§'~ö³ŸaÊ”)ƒöÓÉÉ …ÅÅŸyó&fΜiTŒ‰¡ýî>LÍÇÇuuu(..FOO.\ˆÀÀ@œ;w J¥¶gh,ôõÛ˜ö ÖG"cˆž}öY Ã@DÃ¥½Eß²þ¯i4åýÿé[6ØkÙÙÙ : J­V£³³¶¶¶döÃ?`ï޽صklmm,²hœƒ—ˆˆˆˆˆˆˆˆ;IIIسgÎÀ#µZŒŒ x{{(üY"ÎÁKDDDDDDDD±XŒ¸¸8?~Ÿ~ú)är9D"²³³QSSƒuëÖqJRz,°ÀKDDDDDDDD¥%K–ÀÉÉ ø×¿þ¸»»cÆ ð÷÷g€è±À/=–D"bccË`Ðc‹sðY(x‰ˆˆˆˆˆˆˆˆˆ, ¼DDDDDDDDDDŠ^"""""""""" Å/‘…b—ˆˆˆˆˆˆˆˆˆÈB±ÀKDDDDDDDDDd¡Xà%"""""""""²P,ðY(x‰ˆˆˆˆˆˆˆˆˆ, ¼DDDDDDDDÐîÝ»ñûßÿþ±ïç®]»ðÎ;ïðN4ÂXà%"""""""!µµµ8|ø0ÚÛÛ ",ðÚÚZ9r x‰ˆˆˆˆˆˆˆˆˆ,”C@DDDDDDDd~;vì@YY 99&L@RR’ðú­[·ðå—_¢ªª J¥“'OƲeËàáᡳžÎÎNÿüs|ÿý÷˜0aÂÃÃ!‘HpñâE\¼xsæÌÁ¨Q£ŒjÏùóç¡T*kkkäääÀÙÙ>>>BŒÚÚÚðÕW_!,, ‘‘‘F­ßö= 8‚—ˆˆˆˆˆˆˆhxyy¡¶¶0yòdxzz ¯õôô ((/¼ð‚°lÔ¨QHOOGcc£0Š÷ÀP«ÕHJJ‚««+ 11ß|ó N:…ÂÂB„„„ëhmmÅ/ùKDEEf̘ßÿþ÷¸zõ*Þ}÷]Œ;àììŒÏ>û W¯^…L&Coo/òòòеk× ë;yò$Nž< …BOOO£Û£åïï{{{äççcÁ‚Âò¼¼<ÀÌ™3ꯡí%zðODDDDDDDDAÿB'p· Ü-þ@__  ;;;(•J(•JtwwcΜ9€Ë—/ë¬C,#<<\øyôèÑJ¥˜2eŠPÜ€qãÆ¸;Íp·¸,‰PSSƒëׯ ï[¸p!>úè#xzzšÔ-+++̘1?þø#Z[[…å999pqqÁ´iÓŒZ¿!í%zRp/Ñfgg‡Ñ£Gë,»wJææf¨Õjdff"33Sïz:;;u~¶µµ0®H$¦a迬?+++¬\¹)))HJJ‚——|}}!—Ëáçç±XlR{ú‹ˆˆ@ff& 0þ|477£¦¦‰‰‰‰DF­ßö=)Xà%"""""""zÀ¬¬î_’éëëÄÄÄ ""Bï{ÌÖ¦ØØX¡°°¥¥¥8{ö,NŸ> ™L†õë×»=¾¾¾prrB~~>æÏŸ?`zc׿öj§x zìó C@DDDDDDDôè3f €»…O???×z{{Q]] ;;;³lK©T¢¥¥®®®ˆ‹‹C\\T*²²²°oß>œ8qË—/V{D"––†¶¶6äääÀÏÏnnnF÷×ö®^½š_"z"p^"""""""¢¦ÑhŒþŒD"A@@rss¡P(t^;qâvî܉ööv³´O¡P 99ÇŽ–YYY LS«ÕfivdîÑ£GÑÐЀY³f™Ô_CÚKô¤à^"""""""¢¢Š!==ÁÁÁ6êóË—/ǶmÛ°uëVDGGC*•¢¢¢•••ˆŒŒ„···YÚéåå™L†ÔÔTtuuA&“¡¹¹%%%‹ÅˆŽŽ6K{¼¼¼0fÌdddÀÖÖV(ÈÛ_CÛKôD䆀ˆˆˆˆˆˆˆhdÈår"??---FxLJwß}À¥K—ÐÙÙ‰1cÆ`åÊ•˜;w¥™ÊÚÚëׯÇáÇQVV†œœH¥Rxyy!!!S¦L1K{D""""pôèQ„‡‡C"‘˜Ô_CÛKô$=û쳆ˆ†KßíFÚeý_Óh4:ËûÿÓ·l°×²³³t"""""""zâq^"""""""""" Å/‘…b—ˆˆˆˆˆˆˆˆˆÈB±ÀKDDDDDDDDDd¡Xà%"""""""""²P,ðY(x‰ˆˆˆˆˆˆˆˆˆ, ¼DDDDDDDDDDŠ^"""""""""" Å/‘…b—ˆˆˆˆˆˆˆˆˆÈB±ÀKDDDDDDDDDd¡Xà%"""""""""²P,ðY(x‰ˆˆˆˆˆˆˆˆˆ, ¼DDDDDDDDDDŠ^"""""""""" Å/‘…b—ˆˆˆˆˆˆˆˆˆÈB±ÀKDDDDDDDDDd¡Xà%"""""""""²P,ðY(x‰ˆˆˆˆˆˆˆþ{wUõÿü5¬²/‚(n,b(¸á™š¹UæVù)í£¥™f·>-«O–i‰iŸ2×Vsûiæ–†š …Šà‚B ›ÈªÊ";Ìïs¾sg˜gðõ|<|È]æÞsÏÜ{νï9÷""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2R ð)x‰ˆˆˆˆˆˆˆˆˆŒ¼DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2R ð)x‰ˆˆˆˆˆˆˆˆˆŒ¼DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2R ð)x‰ˆˆˆˆˆˆˆˆˆŒ¼DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2R ð)x‰ˆˆˆˆˆˆˆˆˆŒ¼DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2R ð)x‰ˆˆˆˆˆˆˆˆˆŒ¼DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2RfÌ"" ¬¬ /¾øbËMMMaccôêÕ cÆŒ½½=3®•ˆÅ| ¦ß{ï=ôîÝ[«ÏFFFâ³Ï>ÓË—/‡¿¿?3µ•{ï½÷ðóóÃ'Ÿ|ÂL!""""¢‚^""-TWW£°°………HHHÀÁƒ±téR2sû÷ïGYY S§N8p 3…yÄ<$"""""ƒÀ/Q#”••áÓO?ŪU«Ð©S'fH+wàÀ}ôQÞ˜GÌC"""""2 ðiàíí9sæˆé¢¢"$%%áÈ‘#¸{÷. ªª ëׯÇÊ•+!“ɘiFÌÙÙ£GÓ...Ì""""""2 ði`ee….]ºHæõêÕ !!!øïÿ‹ììl@rr2bccÀL3bxå•W˜DDDDDDdtà%"Ò‹‹ ž{î9¬]»VÌûã?Ô¼UUUGDD’““QRRWWWxzzÂÇÇ£F‚ÖûݳgvîÜ)¦·oߎèèhìÙ³™™™°¶¶F@@žþy´oß÷îÝÃÎ;¢¢"´kט:u*lmmնߘô†……aÓ¦MbzýúõÉdضm._¾ŒÙ³gcÈ!byNN8€˜˜äååÁÜÜ8p ÆŒƒ6mÚh•~ø!®]»pppÀ–-[D êÂÂBÌœ9S¬Œ·ÞzKL=z[¶lÓŸ|ò üüüê(mݺu—ì?<<ááá>|8^ýuiLOOÇ®]»‹ÊÊJtèÐO<ñüq˜˜˜ètΕ””à÷ßGBBnÞ¼‰‚‚xxx sçΘ8q"Ú·o/YÛ¶møõ×_%玪×^{ wîÜ 8K–,‘,OMMÅ––†[·nÁÒÒíÚµƒ¯¯/žzê)I g]ò¨1çYsŸûõ¹{÷.öìÙƒèèhÜ»wŽŽŽ2d¦L™Rïçär9bccñÛo¿!33¹¹¹°°°@Û¶mÑ¥KŒ7Nò’¶y¨ëv‰ˆˆˆˆèáÀ/‘Ž Ü¿/YžŸŸ•+W"%%E2?;;ÙÙÙˆŠŠÂÁƒ±xñbôìÙ³QiØ·oþßÿûbº°°¸té/^Œ¯¾ú ÷îÝË333‘™™‰‹/"44–––zOo~~>¾øâ äåå¨ F)üùçŸøßÿþ‡êêj1¯²²ÉÉÉHNNƱcǰlÙ2xxx4xì"À[PP€ÜÜ\¸¹¹’’’$ëªN'&&Š¿­­­áíí­÷ó#11;wîDEE…$ŠÊ]4$-- Ÿ|ò òóó%óoܸ7n <<3fÌÀرcõ–~Õ€*”——£°°‰‰‰8zô(æÍ›‡¶«¯óLŸç~}’’’°|ùrqÀ;w°ÿ~ÄÅÅIÎeer¹7nÄñãÇ%ó+**P\\Œ´´4œ:u ¯½öFŽ©uþ5×v‰ˆˆˆˆÈø™0 ˆˆtcnn.i5yûöm”””¨ Z~úé§jA,ÕÖ©ÅÅÅXµj²²²•å—²ÒÒR|üñÇ’—²œœüöÛobZŸéݶm›î*KJJ—_~)b¦¦¦èÒ¥ Úµk'ÉÃO>ùååå {PPd:!!A²/eùùù¢ÏdÕå½zõ‚©©i½ûzâ‰'0oÞ>>˜7o†^g>(w•;vLd®Ïýû÷ñé§Ÿªw­­­ÅßÕÕÕøþûï%yÐW¯^U î:;;ÃÙÙY²Ïõë×#--Më<Òçy¦¯s¿>X½zµ$¸«,11QíXÂÃÃÕ‚°666j-·7oÞ,ÎMmò°1Û%""""¢‡[ð5‚“““dº¨¨ÖÖÖ8uêRSSÅü®]»â7Þ@‡PTT„Ÿ~ú 'Ož”••açÎX´h‘ÎûwqqÁܹsÑ¥KÄÇÇcÍš5¨ªª˽¼¼0gÎxxx 226lË”ŒúLo||<ìíí;;;¸ºº~þùgÔÔÔìííñÑG¡C‡Ëå8}ú4¾úê+µ¸£Gâ™gž©÷Ø;uê{{{¨ ð>úè£Ô¼Šã FII 233Å|Õ@±&=zô@=°mÛ6”––ÜÝÝñøã×ù¹\ŽiÓ¦!$$555øá‡pþüy±üÚµkðññipßGÝ(À“O>‰çŸvvvHJJÂG}„’’ÔÔÔ`ÇŽøðÛ|^+§ÓÎÎ+V¬­ª¯_¿Žÿþ÷¿(//GUUΞ=‹N:i•Gú<Ïôuî×çÈ‘#’¼ ÂŒ3àì쌨¨(lܸ±Î þŸþ)þn×®>øà¸¹¹¡¼¼ááá"=ÕÕÕâÜÔ&³]"""""z8°/Q#¨öªhÁ{îÜ91ÏÂÂï½÷:vì™L{{{¼þúë’nÎ;‡²²2÷?kÖ,ÂÞÞÁÁÁjÁœùóçÃÏÏööö9r¤dŸ·oß–ì__éíÒ¥ ¾üòK,Z´¯¾ú*üüüPRR‚«W¯Šu&Nœˆ:d2† & ´ž>}ºáŠËÄbZ´“ËåâoOOO±<99Yò¿‚6ÞÆ;v,&Nœ¸¹¹aîܹ’åÊAæúDGG‹¿Û·oW^yEœwÞÞÞ’@øõë×%AÎÆJOOËd2˜››‹i___L:Æ ðaÃtêCZŸç™¾Îýú=zTüíêꊷß~;v„ {ì1Ìš5«ÎÏZYY!00˜2eŠè>ÄÒÒRíœÓ6=͹]"""""2~lÁKDÔEEE’iÒàÝÀáàà YO&“aÔ¨Q¢¥iMM RRRУGöïëë«qÿ`ff†Î;×¹\¹o\}¦wòäÉjƒXegg«å›¢¥¦‚r1++ 555 D(¥JMMEEEîÝ»'¾—ìß¿%%%"è«ÜzÓÓÓS2P˜>)ŸÀÖÖŽŽŽ¢ëmúÊy׿1œÂÈ‘#%]…TVVÂ̬iÕºò÷_XXˆ×_þþþèÝ»7z÷î§Ÿ~Z-ÚÐçy¦¯s¿.eeeÈÍÍÓ#FŒPË×lÙ²•••jŸ_¸p¡Ú9Ÿ––†´´4DDD4ú»i®í‘ñc€—ˆ¨Tûù´³³CYY™äµîº SÊiÚ–6ê(Ê¢Á)½§W¹Õ¬‚j€wïÞ½õ¦©ªª ùùù _•ƒ¨555HNN–ôUëëë‹nݺáêÕ«HJJ‚\.—tßÐ\­wHúQ•­Ž×û÷ïK~DPí¨ Æ4H¯iúé§qéÒ%ÑM@MM bcc‹mÛ¶ÁÉÉ ýû÷ǘ1cбcG­¶©ïóLç~}TÏYÕtµ?J¸¹¹ÕÙ;-- GŽÁ•+W$Áâ¦j®í‘qc DD:ª¬¬” åîî®1¨WÕŠþi •¶éµ°°P›§Í iª´ \999¡S§Nb:!!Ape2¼½½Å«ù%%%ÈÉÉ‘´àUmekhÒµ4ooo„††büøñ°··W[~÷î]„……aÉ’%’nZò ¸pá.\¸ 9?ª««±yóf7ØbÖØ® ÕsV5]Š<½uë–Úü²²2lÙ²E‰»u놩S§"00fffÈËËï¿þªsššk»DDDDDÔ:°/‘îܹƒ]»vIæ >\ü­ü:÷¹sçPPP YW.—#,,ìÿ atíÚõOs§WõõöÔÔTµuªªªPVV&þiÛrS¹nBBRRR>>> ð*šåïï_ïkþ Ѧצ’Édpww—|7ªƒ¨í߿ӧOÇôéÓñòË/‹þTM5@™’’"ùBùÜþá‡Ä¿¬¬,øûûcúôéøòË/±zõjIÿ·uv£ šGÆt]X[[ÃÑÑQLŸ8qB-ïÏœ9ƒŠŠ µÏfffŠï¦L™‚¾}ûŠ{\\\£Î3}n—ˆˆˆˆˆZx‰ˆ4(--Ejjªøƒ}ûöáwÞ‘´@ôõõE÷îÝÅôÀÅßX±b233!—ËQXXˆ¯¿þZÒUÀ€têÞAßš;½’»{öìA^^ž˜.))ÁòåËñâ‹/âÅ_Ä;ï¼£õ¶ýýýÅm"à¦B:;;‹@r·MíWѸ¹)§óÎ;X¿~½Ì&%%a×®]())AII :vìkkkê-P7oÞŒ›7o¢°°QQQ Õ¸?[[[>|ÄÁƒñÃ?ˆýÉd2´oß^Ò7²¹¹¹Æn4呱]O>ù¤øûöíÛøì³ÏDõÌ™3غu«ÆÏ©‚/^¼ˆû÷ïC.—#>>?ýôS£Î3}n—ˆˆˆˆˆZvÑ@D¤ARR–.]Zï:æææ˜;w®¤ÎaÆ!,, 7nÜ$''ãÍ7ßD›6mÔ^‹·²²Â´iÓèq6wze2¦M›†•+W¨}=þüùðòòByy9²²²$-v_xá­ɲ°°@=påÊÉ|???±ooooDEEI–7&Àëèè(Z&$$àË/¿DPPBBBší»7nNœ8!ºž8sæ Μ9kkkIkN<÷Üsbº{÷î077Gee%àï¿ÿÆ¢E‹Ü_›6mЯ_?DFF.]º„—_~NNNÉd’Aì @ÒõC}ydlןqãpèÐ!Ü¿@m@õâÅ‹ ~®S§N011çtXXÂÂÂ`ii©±?jÕÖêuå¡¢+ŒÆn—ˆˆˆˆˆZ7¶à%"jkkküç?ÿAÇŽ%ó-,,ðÎ;ï sçÎ’ùªA,{{{¼ûî»j­-[ZK¤·_¿~˜1c†˜®¬¬Drr2222D ÊÄÄo¼ñ‚ƒƒuÚ¶j°ÖÚÚZ’ÆnݺI–;995ªà>}úˆ¿«ªªpæÌ\»v­Y¿GGG¼óÎ;°³³“ÌWîš™™áÕW_E@@€˜çââ" øª AÛ¶m5.›?>ºté"™w÷î]µà®››æÍ›§uÛuammÅ‹k8¨XÑÓÓSm~›6m0uêTµùååå033ÃìÙ³%AqÅÀ€ åaS·KDDDDD­[ðiÁÔÔ666hß¾=1fÌØÚÚj\·mÛ¶X¹r%NŸ>+W® ##999prrBÇŽáëë‹Q£FÕùù–Öé}ê©§ðÈ# ,, iiiHOO‡¹¹9\\\лwoŒ5Jòú¿¶”ûájûßUn¬èWy}å×Úš2e ª««üüük!éããƒuëÖáèÑ£HLLDzz:ŠŠŠÐ¾}{tëÖ 'N„›››Úç&L˜€:àÀÈÈÈ@YY:tè€Q£Faøðáxýõ×5îÏÚÚ«V­BTTþøãܺu yyy¨¬¬„³³3\\\ðè£"$$D-øÙPÛuÑ«W/„††â—_~Á•+WPPPGGGã¹çžÃ§Ÿ~ªñs'N„««+>Œ¬¬,899ÁÏÏãÇGçÎñLjlDDž}öYT¯/›²]"""""jÝdcÆŒ‘3ˆ¨©4 <¥˜§¼L.—Kæ+ÿÓ4¯®eçÎc¦ÑC]4)x‰ˆˆˆˆˆˆˆˆˆŒ¼DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2RfÌ"zØÝ½{—™@DDDDD 277Gee%3‚ˆ ¼DôÐsrrb&‘Qb DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2R ð)x‰ˆˆˆˆˆˆˆˆˆŒ¼DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2R ð)x‰ˆˆˆˆˆˆˆˆˆŒ¼DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH1ÀKDDDDDDDDDd¤à%"""""""""2R ð)x‰ˆˆˆˆˆˆˆˆˆŒ¼DDDDDDDDDDFŠ^""""""""""#Å/‘‘b€—ˆˆˆˆˆˆˆˆˆÈH™1 ˆˆˆˆ¨µ+..FNNŽÆeöööpssk–ýfdd ¬¬L2ÏÕÕüRˆˆˆˆH/à%"""¢VoõêÕÈÎÎÖ¸L&“aùòåpuuÕë>+**ðÙgŸ¡¼¼\2?88³fÍâ—BDDDDzÁ.ˆˆˆˆ¨Õ+,,¬s™\.GQQ‘Þ÷£Ü€Ë—/£¢¢‚_ é¼DDDDDÍ 22RãüŠŠ ÄÄÄ0ƒˆˆˆˆH/ØE‘©®®FAAJJJ —Ë›}2™ vvv°··‡L&ã@D¤'%%%¸v횘¶²²Bii©˜>þ<úõëÇŒ""""¢&c€—ˆè«©©ÁÙ³g‰ÄÄDTWW·x,,,€áÇÃÇÇGã:ÕÕÕ Ctt4LLLŒáÇÃÄÄ0^Ù³gŽ;¦6ßÁÁîîîèÔ©ž|òIØÚÚ6i?8tèòóóѾ}{¼ÿþû8yò$vîÜ Xºt)¼½½[u4‡mÛ¶!<<¼ÁõV®\ '''¬_¿W®\™™¾þúk÷÷Å_ >>666X³fM½ëFGGcÓ¦M€Ù³g£oß¾,¸¨A/^””ç={öÄ•+WD— ±±±())µµµA¦×®]øã?ÔæËd2´k×>>>˜0a‚A”'º”Íu=sù{øða8p0sæL 0@oùMDRUUU8}ú4.\¸€œœÔÔÔÀÝݾ¾¾=z´A–Í-<<Û¶mLž<O<ñD÷mðé§ŸÂÙÙ¹ÙÓ%—ËqåÊüùçŸHKKÃýû÷aoo??? 6 ]ºt1º¼fùݺ1ÀKDô¥§§cË–-uŽìÞR***pñâE¤¥¥aÅŠoF7lØ€«W¯ŠyiiiHNNÆ+¯¼SSSƒÍã‚‚ !!ÑÑÑxë­·àèèØ¨mÝ»w?ýôjjjD¾}æAjjªh•8tèP899ñB&ÒàÂ… ’é=z ¸¸qqqj4»xñ"†jTÇ%—Ë‘““ƒœœÄÄÄàƒ>€ ¿p–¿¬Gˆ´¸\»v­Ú€ŸiiiHKKßþ‰¹sçÂÏÏ{õê%þŽ‹‹S ðVVV")) ЩS§ îVVVbëÖ­¸té’dþÝ»wqîÜ9œ;w£GÆ„ ø$ x‰ˆ«W¯bÓ¦M5ÐÎøñãÕæUWWcÓ¦M’à®ÂÅ‹±yóf¼úê«äíÛ·/ÜÜÜ·oßF\\JKK‘——‡ŸþóæÍkÔv³²²Dp÷ñÇǨQ£vvvðòòXZZ¶ê<¸qã:xä‘Gšåa`À€uÞ¼·iÓàêê ///˜™ñV† " §`jjŠÀÀ@”––Š/P6†o¿~ýàêê (**BTTÊÊÊPPP€#GŽ`òäÉ4}†VsùÛùm(ÇAÔ’ª««ñõ×_‹à®™™¼½½Ñ¶m[¤¤¤ ;;¥¥¥Ø¼y3–-[‡fO“¡\‹èÚµ+RRRpýúuTVVÂÜÜ\,OJJ*z÷îÝ"iÚ¾}»îÊd2tîÜîîî¸yó&233GE›6m0fÌ£9yÿܺñ[%"z222ê îšššŠ Vs“Ëå())<ÿüó}úˆ‡úÎ;ãÆâŠŠŠÂˆ#Œêø:uê;;;!77WÌW.óÞ~ûmlÛ¶ W¯^ÅÚµkajjŠŠŠ >|ñññÈÎΆ<==Eݧ°cÇœ:u ðöÛoKú9\µjRRR`nnŽ5kÖÀ¢Îò@—ë™åoÓÊ_mËÃ†Žƒe*µVçÏŸ—Ù”Ë"™L†I“&áìÙ³¨ªªB||¼ð.Y²EEEðññÁ’%KÄgNŸ>íÛ·-Z$~×ǵ@ëòþóŸÿ 77ݺuÃóÏ?Ý»w#==íÛ·GHH „“'O⯿þ­[·àáá & Gbøå—_ÔvÓ )ÀÛ®];xxxèTvjS7©Ú¿¿øû¹çž“wÚñ222pìØ1ÔÔÔàÌ™3˜8q¢Îu—.õN]Ç0hÐ œ>}ºÉõ¥6éX¹r%RSSaii‰uëÖA&“¡¸¸‹/tîÜï¼ó€Úº7oÞ ˜>}:† ÂB 0ÀKDÔÂ._¾Œôôtɼ±cÇâ™gžy é177—¼¥¸©SÜxL˜0&&&8|øp½Û‰‰‰Á† 0wî\ƒì“7((H<\ß¾}[Ì‹‹Ã7ß|# ¸ÇÇÇ#>>©©©xþùçÔ¾>fooÂÂBµÝ2hÛꮬ¬ kÖ¬‘ô¹vöìYäççcáÂ…" ¯mZôÇÇž={$ëÞºu ¿ÿþ;’’’°xñb˜ššÂÁÁ666¸ÿ>ÀÑÑQä¶ÛhNMÍ¿ÌÌL„††Šã+**Âo¿ýVçøñÇ%ó222‘‘k×®aÑ¢EÝ?55ÜÜ\¤¦¦JÜ•[õîÝ[xÚ`°±x•ÕtÛ²e bccÅtQQ>ûì3IÙS^^Ž;wî &&Ó¦MCHH€Ú€¸â!9..N<°–••‰¼ õ”>®g–¿M£myXßq°L¥ÖL1Þ†âmUVVVøàƒPYYÙ¤ó\×¢.åµjý·zõj1˜hJJ RRRpùòe\¾|Y¬—––†¯¾ú ï¿ÿ¾(“ÝÝÝáîœÄÅÅaÒ¤I€ââbÑòY¹.ml¹§Z7i’’’"îýû÷ï¯q‘#GŠ5ÓÒÒUw5¶ÞQ>†   àml}©m:ºwïŽÔÔT”——#''â»QœgÕÕÕ055y¢øµ fQËŠŠŠ’Lûùù=°à®&ùùùøè£$£?ýôÓxúé§üìÕ«Wñûï¿d¾+j£hqV]]]»v¡¢¢...X°`Þ~ûmñjíÉ“'E fæÌ™x饗Ä6¦L™‚eË–iµï‚‚”––â™gžÁøñãE@$!!AÜðë’}çbôtggg<ÿüó˜5kºví HNNé™3gâ©§žÛ˜3g^zé%¶¡5kÖ`Μ9jÿbbbêüŒ>òoïÞ½âA§OŸ>˜6mºwï^ç ˆŠvvv˜5kæÎ+ºêHJJ’<ÌÐÃCµõ®···ä Ek^…ÔÔTI+Xc––†¢¢"}óª>äÇÆÆÂÁÁA´RÛ·oŸàÕW_ųÏ> sssÈårìÙ³ÑúJ¹ÏâÄÄDÑõECý0êr=³üm:mËÃºŽƒe*µf¸wïž(3ML4‡aÜÜÜàéé©ÕÛsÍy-êR^++,,„‡‡&Mš$Þfj·øùùaâĉbÌŠêêjDGGK>¯àfddˆÊýÙ+ÊýÆ–{šê&UÅÅÅ¢îððð¨3Øîèè(UÔ+ºÔ]­wT¡©õ¥.éPÔ*æ)r«ªªD¾+滺º¢mÛ¶,Z[ðµ0å–] ªåV^^BCC‘——‡={ö ºº£GŒ7&&&øõ×_ëÝFtt4ÆŽkpùnaa333TUU‰›ÒøøxqS6nÜ8ÑÇä+¯¼‚Å‹£²²üñfΜ٤}Ëd2,Y²DBÌÍͱoß>µ-¹<<ܹsGòù   =z@m·  Ý3888ˆ®![î©ÖMu= )4tŽ8::âþýû¸w着ª`ff¦uÝÕØzGÓ14¥¾Ô%ݺuõXjj* $½ÎÎÎÈÏÏGZZ<==EË^¶ÞmY ðµ0Å/Ò ªýX=(¹¹¹X³f òóóż}ûö¡¦¦FÆŒSSSñš©&†ÚG^EE…$MqÃvëÖ-±üàÁƒøí·ß$7Pêl½© gggI+·víÚIÒÕRiÑ”ÎÎΘ?>jjj––†S§N!==]ÒZVy°¨ºŽ¯©ÛP6hÐ ¿ö+盪¦æ_VV–ø{àÀâ¦ÙÔÔýû÷W YXXÀÚÚ%%%¸~ý:–,YôìÙ&LhÑG2™™™j­†LLLÔZº¸¸H¼‘‘‘àU}óD¡}ûöxôÑG5ÖʟʯùK¬ûöí‹ï¾ûr¹\r÷éÓáááËåHHH@PPè/²{÷î°¶¶ÖÛõÌò·iôQ²L5,‰‰‰Ø¾}»äZjm\]]1uêTÉ€ˆÍE¹K¯ââbƒ¾S^+ç©••€ÚÄæææ¨¨¨€§§§£CùþNµlêܹ3PPP€¸¸8 0@´J iil¹§Z7ÕU¦*hj¥¬L±ÜÖÖVŸ¶uWcëMÇДúR—t˜››ÃÛÛñññj-x‡Š -- >>>â‡!å¾”©ù1ÀKDÔÂ*++%ÓmÚ´yàiºuëÖ¬Y#ia °ÿ~ÔÔÔ`üøñ€Q£FÁÔÔ»wïÖ¸­áÇd¾+ߤ)FºUf+ÿ­LµuA£*[•ç4ÝX¶DZ4åP;ðÇîÝ»%õÝ j¢m( 4H´ÌÐVSóïîÝ»âoÕ MD¦¦¦˜={6~úé'äåå¡¢¢W®\Á•+WăÈôéÓÅë{ôpPm½ ÔÖììldffÖ;˜¡Füýý1iÒ$µ>ÜÁ år®¾ëËÌÌ ¶¶¶(**’´œòóóЏ¸8x{{‹þëêžA×ë™åoÓè£îÞ½ 777øûûãÀ¸yó¦¤Û]ï穉ϜÌ"¢‡[NNÖ¬Y#>1oÞ<þøc\¿~—.]Â¥K—Äg/_¾ kkk̘1ƒ…ÌCDµÿ]]DFFâÙgŸ5ÈãZ°`NÕ‡O'''ñ·ê‰UUUâ!Yy=SSSâìÙ³j#ªêõzfùÛtú(Y¦†}ûöµúஂ\.ÇÞ½{›=À Ô"VXXˆ¢¢"ÄÅÅ©í³ºº+W®Dyy9<==ñþûï«¥UµìlŽë¨1åµ>áÌ™3(((À‰'Ô@çëëÛär¯¡à®bŽ;"!!÷îÝÃÅ‹5>Û?~\ü­Œ×¶îjl½£éšR_êšE— ÕÕÕøóÏ?Ô¶¼îСd2ÒÓÓEw„:týSË`GFDD±¬¬,¬^½ZÜ]²d œœœÔ^ úí·ßD¿±ðøãcÚ´ibzìØ±’Á Inn®äFLÑ'¦òMŒò(°@í+GIIIâðæÖÜi©+®_¿.ž}öY 2nnn¢3mèc:ÿ”[_œ;wNOMMÆ ]rr2vìØ]»vÁÙÙ/¼ðV­Z…… ŠVùªýmSë–’’¢±E“¶š6tÊ×gdd¤$P¡<­|*—S¹¹¹âAÒÛÛ»Á>,u½žYþ6>ÊC–©†U–)³°°huÿ”eff¢ºººÙó588Xü½{÷nIkI¹\Ž£G¢¼¼Э[7Iþµ­(¯ÌÒÁÇôy5¶¼Ö???ÑÝÛ™3g½zõ’´nîrï±ÇïܹSm»‘‘‘’2=$$DçºKßõNcëK]Óáåå%ºáPðZXXÀÃÃUUU¢že÷ --x‰ˆRøâ‹/Ä/ñŠàn›6m*éƒKáèÑ£¨®®ÆäɓŠ©©)îܹ#Z÷‚ÈÈH¤¥¥A.—#77×®]CII €Ú–Š›Ò=zˆ¾¾~ùåXZZÂÆÆñññbâ§žz ;vlö4ë;-ÚæòƒÎñãÇQQQœœÉ«2å×ÔnÞ¼)nêtÙ†!柇‡|||˜˜ˆ˜˜lÙ²¾¾¾¸té’Ú ¯"N:HOOǰaÃ`gg‡ììlѪæA¶§Sî(swwÇܹsë\?33›6mÓyyyHII£€·&VVVõà®ê AÊŽ™.œò IDAT;†ššL:@m§ú†¦®–p®®®’VÇ–––˜:u*¶lÙ‚¼¼<|õÕW’õ»u놑#G¶Hšõmó@ÑR¢¼¼ñññbP///Q&A+…;vàÚµk˜6mšNÛ0Ôü›j}ÊÚµk'ªΟ?ß*¼@m+«ÄÄDäææâêÕ«¸zõªäz™:uª¤kŃ~¯^½$åYPPVûÓåzfùû._¾¬6( â»¨+À«ky¨é8æÍ›Ç2•ZwàÅÌ óæÍÃ_|Û·o£¤¤ÑÑÑ’uÌÍÍ1}útIëØÇÿý·ÚõÙ±cGµžú¸çϟߨòZŸ‚‚‚D™mff†=zH–ëZvêJ&“áÕW_ÅÆ‹šš$%%!))I²Þˆ#46pѦîÒw½ÓØú²1éèÞ½»øAÑ¥…"ÿÏž=  6ìííÍ ¿¥ËfÑÃ%-- k×®7>NNNX¼x±VÁ]…'N ºº/¼ð‚Á¯½½=<<<Ð¥K<ñÄj}Aõë×mÛ¶Å¡C‡žžŽ²²2¸ººbÀ€6l˜Ú«|Í©¹ÒR_8;;cÞ¼yøå—_••www :x÷ÝwaaaxôÑG¾¾¾9r$Ξ=+~ Ðu†š;wÆÒ¥KqàÀ$%%ÁÊÊ AAAðòòÂÖ­[ÕnþgÍšDDDàÎ;())ƒƒ¼¼¼0jÔ(É+–ÔºÅÇÇ£¨¨H2¯oß¾ >@öîÝ[´¶€èèh<÷Üst1vöööX¶l~ûí7üý÷ßÈÎΆ:v숱cÇ¢S§N?×·o_ñÀêåå%]_×3Ëߦѵ<Ôt,SéaàììŒeË–á?þ@tt4nݺ™L777téÒcÆŒQëÛ¶W¯^øç?ÿ‰ßÿwîܧ§'BBBPYY‰íÛ·ëýZlJy­/055Euu5yäµä-QîYZZâ7Þ@tt4"""––†ÒÒRØÚÚÂ×ׯ «7€©MÝ¥ïz§±õ¥®éPn™ëéé)–+Ÿ]ºtiu-ÿl̘1rf5•jÇÿÊó”—ÉårÉ|åšæÕµìܹsF›Wª¯…}ùå—-V¦¦¦bݺu(--иà®ÂsÏ='y…ŒˆÈ-Z´Hò«êßÿþw£[ÏþðȈˆÓnnnX¾|yƒŸKHHÀš5k$óÞ|óMµÖJDD†rŸZ^^޲²2µ­ôT8¯¬¬LLL$ƒ8µƒ3)º“Éd°µµ•ü¨%—ËQTT$îÿmll`f&m—VTT$ú£µ²²R @Ý¿_tI`ii)úŸ5„{q"¢æÂ¼DD‰ääd¬[·N àДàî?þñµˆˆ&ÅÅÅâuÍK—.I–¹ººâòå˰°°Ð¬-**Brr2är9ÌÌÌ$£¡ÿñǨ¨¨€™™˜ÑDdP>ûì3dddˆé÷ßžžžbzëÖ­’2qîܹ’WÅ<ˆ#GŽˆégŸ}£GÓ§NÂÎ;Åô!C0}út1‹/¿üRLwëÖ o½õ–˜ÎËË­8Ú±êiDD­¼DDÄÄDüïÿkrpW&“ᥗ^Â!C˜©DôPËÌÌÄ7ß|£qYll,bccáììŒO?ýTmyFFFŸUôwÈ ¢ÊÊJÉ´òTš¦Z_uysOµV ðµr øê«¯Ä¨ÈM î¾üòË8p 3•ˆˆˆˆˆˆÈ@0ÀKDÔŠÅÅÅaýúõ¢õ‚³³3-ZÔ¨àîÌ™3ÌL%"""zHY[[‹¿MLLÔú®U^®iÚÆÆ¦Ië[YYÕ»œˆèaÅ/Q+‹õë׋WáÜ555ŬY³žˆèaâííÐÐÐz×Q8H™¯¯oƒŸ•ÉdÌd"28o¿ýv½ËgΜ‰™3gÖ¹|̘13fLˇŠ¡C‡Ö¹ÜÏÏ7näAD¤‚^"¢V(&&7n”Œ ÜØàîìÙ³%ƒc‘æÑã[â³DDDDDªà%"je._¾ŒM›6¡ººZ2?##û÷ï×:¸kff†×^{ ={öd¦(x‰ˆZ‘èèhlݺU-¸[^^Ž 6h½sss¼þúëèÑ£3•ˆˆˆˆˆˆÈ€1ÀKDÔJ\¸pß~û-jjj...(**Byy¹NÛ±°°À¼yóн{wf* kÖ¬AjjªÆe&&&xóÍ7ѵkW1o÷îÝPÛ·ø´iÓ0pà@±üôéÓØ»w/är9`üøñxòÉ'ÅòØØXlܸQ,4h¦M›&–ß¾}+V¬PkÜ@Dô°a€—ˆ¨8þ<¾ûî;qóÛ®];,^¼wîÜÁÿþ÷?”––jµKKK¼ñÆðñña¦‘Ľ{÷PQQQçòââbÉtAAdýÂÂBÉòÂÂBIc„¢¢"µí)/¿wïždyii©Ö÷¹DD­™ ³€ˆÈ¸EDDh î:88 [·nX¸p!lllÜN›6mðæ›o2¸KDDDDDDdDà%"2rÁ]wwwÜUèÔ©/^ ;;»:·aee…ýë_èÖ­3”ˆˆˆˆ4277¯w¹……E½ë7´ÜÌ̬Þé†Öo(=DD­»h "jE^zé%IpWÁÓÓK—.Åš5kÔ^m³¶¶ÆÂ… áåå%™Ÿ››‹o¾ùîîî˜={63—ˆ¨‰‰‰øá‡š¼̘1ƒJDë­·ÞBYY™Æe&&&j ^|ñE<ûì³jûàU]>jÔ( ÿüs±\õ­4OOO„††ÖÙ¯¥¥%¿4"z(0ÀKDÔŠÈd2TVVÖðffÉdbY»ví0jÔ(ìÞ½[̳µµÅÂ… Ñ¡CÉvrssŠ»w À(ŽýòåËøæ›oÔæ[XXÀÃÃƣ> SSSƒKûáÇqâÄ ˜››cÕªUøþûïqöìY¼òÊ+èß¿¿NÛZ·nrssññÇ×»^zz:>þøc̘1ƒ6šs|É’%ðööÆk¯½Æ ž FEErss›¼WWWƒ9¦ØØX|ùå—jóMMMáææ†ž={büøñ$xòŸÿü¹¹¹X¹r%œœœ ¢œ3Ä2Uµ>Ð6߈êcii©Óuoff¦±ñ‚‰‰ ìííëÝFCËUƒÂ†L.—#** çÎÃÍ›7qÿþ}8;;ÃÃÃÇG÷îÝ%÷ïô`k¹©x¶°±±ÁòåË&ÝÆú|b(à%"jE>ûì3ñ÷Ò¥Káíí-¦£¢¢°gÏ1mgg‡E‹¡}ûö’m”••aõêÕ¢¥¯¢Å„±ðóó£7Ëårܺu )))رc.]º„yóæ5úu½›7oâÊ•+ ©÷aE8pàºuë†Ç{L<<ÙØØ4øÚ!µ.†øPïãã#©KJKKñ÷ß#,, ׯ_Ç¿ÿýo˜˜´l¯oÖÖÖ°±±iUAæ¨_ô‘oúLWK#‘!+))Á† +++têÔ îîî¸wïâââƒàà`Ìœ9³Ñå¯3Ö7šž-èáÀ'G"¢‡À… °uëV¬uppÀ¢E‹àîî®¶n~~¾Z7Æ$ £F’Ì+//Ç?ü€èèhœùd£oš:„   ½Ý4ß¾}ðÔSOÁßßð /à…^à‰Kd¤Ѷm[Ëd2¬­­¯6ýÀ îXüýý1nÜ8ɼªª*¬_¿±±±ˆŠŠBppp‹¦éÝwßmuçLsÔ/úÈ7}¦«%Ž‘ÈPÉårÜíß¿?þñÀÊÊJ,¿ÿ>¾ÿþ{DFFÂÕÕO?ý4¯3`Œõ¦g z80ÀKDÔÊEFFâÛo¿Á]GGG,^¼nnnuÞ€¶6–––˜9s&’’’ðûï¿ã±ÇC›6m æ†hxÐ"2 Àĉë\~äÈÄÄÄHæõëׯÅ¥~€03ÃÈ‘#‹7nMº‰¨é6mÚ„›7o¨í²eÁ‚’´öîÝ‹K—.µXzTû./**ÂêÕ«EŸ¼ŽŽŽX²dÉÏ·óçÏ#!!˜5k–Z‹PÌ™3ï½÷N:…±cÇòM.â³évÆ, "jÖ®] ™L&i!æììŒE‹T?-6löïßøøx‰e111øý÷ß‘òòr899!((ãÇà/¾øñññ€?þ:tÀ²eË´þ¼&›7oFTTàóÏ?‡££#V­Z…'N`÷îÝX±b…xh***¯¿þŠÄÄDäççÃÅÅÄO<Ñ`¿Â111 CFF€~ýú©­WQQcÇŽ!22yyy°¶¶†&L˜Pï9³yófäååáÕW_Å®]»œœ kkkcüøñˆŠŠÂ±cÇ Œ7ƒ RKccòP.—ãÇDDD^xá 6¬Éù¥M>|öÙg(//瀂â»[¾|¹øeÆ (,,Äܹs±cÇÄÄÄ`åÊ•°µµmR:É8¥§§ãàÁƒ’y˜6mšQ‡¢ÏË¢¢"1¯¾s=''ûöíÃÍ›7QZZ OOO<úè£0`€tlݺ‘‘‘øøãÕʜիW#55Ÿþ9~üñG$%%aõêÕ:—sM-tÝ׃ª_4Ù°aƒ$ß*ëêJWcêŠúŽQ›sƒ GFF†¤ÏñââbI€7;;[/}’kK¹,PÛ6''GLÊXýõd2&Ož\çymff†yóæ!??’¯6åV}×YcË'EÙqïÞ=Ì;»wïFll, k×®˜Û”r®©×.ûzõ‹6*ëêJWcÊȺ¶¥í¹Adì²²²àîî^çt ^^^ðòòjT¹U×u¦‰®åKYYBCCѾ}{L˜09998}ú4Ö­[‡O>ù¤Þ{#}׺–ãšê¥ÆÖ7Úî»gÏž¸~ý:’““áççHLLܺu ¢ „„XXXÀ××·Éy¨í³…¾ë ]ïku©K‰^""ƒenn. ¾VTT4û(ännnX´h‘V£¿ªö ù FHo.ŠãWnYrîÜ9˜››ãí·ß¹\޵k×"..Nríx%±k×®â¦YÛÏkâéé)Z™tîÜY2‘²½{÷¢¦¦Ë–-úqãÆá—_~AXX._¾ŒÞ½{«}®¤¤ûöíCÛ¶mñÎ;ïÀÎÎ0zôh¬X±Bí{ŠŠBŸ>}0gÎ1ÿ÷ß­;ê{PÈÏÏÇ?ÿùOчhß¾}±dɤ¦¦âƒ>4NNNزe RSSE€·1y(—˱mÛ6µànSòKùP—´´4ôïß .¯ÌýôÓON'–öíÛ㥗^ÓŠ“Týúë¯ÈÊÊ’Ì6lzôèa4ÇZZZŠØØXìß¿¦¦¦èß¿½çº\.ÇÎ;ajjŠwß}W´ô7n¾þúk?~C‡…»»;üýýammèèhÉ·¢5’¦µu)çšZ>躯Y¿hS×7TÖiJWcËHMÛÒåÜ Ã¡Ú ¯¡é‡-=𣏏>>>jË233qáµù={öD·nÝt*·ê*K4ѵ|ÉÎÎÆÈ‘#1eÊ”ÿ &™™áرcÈÊÊR J+߯é»е×tÖ˜úF—}`ïÞ½ˆÞëׯ£}ûöÈÊÊÂõë×Ñ¿TVV"99=zô¨³K]òPÛg }×;vÔ:ot­K‰^""ƒeoo¼¼<1}óæÍz_ÇiÈûï¿ß`¿¹Z·:TÜ*´¦¿+ÿª?uêTL™2EÒzN.—£¼¼\-Ø­IS?ßêêj\¼xC† ••JJJIJ„……!..Nc@")) %%%xöÙgÅÍ“â;1böîÝ+晘˜@&“!-- ·oßÙ'Ÿ|R«AéT=vvv°µµE‡$­U<<<ÄÍbcóP.—ãçŸÆŸþ‰þýûK‚»MÉ/}äC}&Ož,nÞ›šN2,NNN:th½ë\¿~Ç—ÌsssäI“ úØ8€¨?D˜™áÿø‡Z ^Õs½  iii>|¸ä5N333Œ7qqq¸zõ*ÜÝÝaff†¾}û"<<ùùùpvvPÛ—¼³³3ºwïÞ¤r®©×.û2ôú¥±e>ËH]Î 2 ,@qq±¨ûõºÂ‹/¾ˆñãÇ·è}µ2WWW|øá‡¨ªª Þ…à¸^MLLÔ–åääàÈ‘#jóíììЭ[·f»_hLù2zôhÉ´"¨[_y¤ï: ±ù¡\/)ö¯k}£Ë¾=<<àììŒøøx<óÌ3(..Fvv6f̘;vˆÁöRRRPUU…^½zlY©M¹¯KÞèZ—’öà%"ja]ºt‘x?Þ¤¯>o\«««qòäIµô¶ùùùâæ_ÁÖÖwïÞEtt4222žžŽääd”””À¢Ám6õó ÉÍÍEMM ÂÃîqå>0•)FÑ­«5•j°æ¹çžÃîÝ»±lÙ2xyyÁÇÇðóók°L›6mÔÖ‘Éd¢ŸNåyMÍëW¯Š Ú¥K—››+¾Ó¦ä—>ò¡.pttÔË÷JƧ´´ß}÷äÇ8Ìœ9S/åDsòññQkäââ???ý­j:×Ú7T)úmT”U@í+ºááá¸xñ"FމÜÜ\¤¥¥aܸqË]ʹ¦^wºìËÐë—Æ–uú,#u=7È0899ÕûF˜$hó ¨ !Ï,--qëÖ-µe}ûöÅÆÅô­[·ðþûï7ûý‚®å‹•••Ú÷ªM7Rú®“ªõRcë]ö-“É€ððp”––Šîüüüàãツ„µ?þ@@@€Á–•Ú”ûºä®u)éð]1 ˆˆZVïÞ½Åë?@mX¿þú+&L˜ð@Ó%—˱}ûvdggKæ÷éÓ§Õä}FFi€÷ìÙ³øùçŸaaaGy;v,Ž?.‰õiêç¢è«sèСuŽT_Wßõ=hkºq6lzõê…Ë—/ãï¿ÿFDDNœ8wwwµQ²õ©1y8{ölØØØ`õêÕØ¾};,X™LÖ¤üÒG>¨ö}­ ÚÕ‰>ÒIÆc×®]â&…1cÆÅhþþþ7nœÖëëÒ­¢ŒRî“ØÇÇŽŽŽˆŽŽÆÈ‘#|]V—rîÿ·wïQU×ùþÇ_pËe˜JÐPD@Í ¥¼•VZ«šêœ¦ò´ÖŒ§Îj5ó«˜fÔqœjÆ:³*g5é2jz²ò6y­ñž„¢ 1 ‚"Š‚°4ìÖîïæºñùX‹µô»/Ÿ½ßûû}>û½?ßÏ·½ÇÑœÚÓûWs]WôŽö À]™L& 8P'OžTUU•ÃbãåcÕÎ/Í/®\ 3úWâÑV¿d´¿1Úö¨Q£´{÷n8qBùùù TPP†®œœUUUéøñã4hSËèuU®t4–½ZÞ7£})œG@‡ \._& y[ËÛš“vóö–msæ6w§Í›7Û­Ãøù矫¤¤DwÝuW‡-†oDqq±>ûì3ÛUq›5ÿÊÜ444èÿø‡,‹m-¬††­^½Z111zê©§ìNsf ÔÞÇ;£¹ÝØØh{ÝÍêëëUPPÐæ,îæS¨Š‹‹[’Nž­ZµJ[¶lÑÃ?Ü)Ÿ‹ÑŽ5J±±±’¤‰'jß¾}JOOW|||»âe4Ž–FiyåîÎú\á^²²²tàÀ»m7Þx£¡¢©;kÞ×O:Õê¶æm-O+5™L7nœvìØ¡ªª*¥¥¥iذa nwžkïqg¤­žÞ¿¸šó;²¯0ºoîì¶ÛnÓû￯Ï>ûLÿöoÿÖæ÷üã>^èŠñkgõ£ýѶ›g·æææ*??ßvµæÇæääèÛo¿UJJJ·åJgƲÎäýæµ™‰‘¾ÆPà€.f2™ôè£êµ×^³­&ýxÚù‘#GäããÓê´öÎtáÂÕÖÖ¶ÚîëëÛ)½îPWW§÷ß_çÎÓ¼yól¿äWVVª®®N!!!vƒÛÒÒRåææÊjµ¶ùcD{oDóÌŠC‡éÎ;ï´;ípË–-Ú¼y³~ñ‹_8œ15tèPY,mݺUcÇŽµZW]]­;wÚÝ·¬¬L¯¼òŠRRRlWâõòòÒ˜1c´jÕ*555uÊgãJ [þûÞ{ïÕáǵvíZEGGË×××åx‰ƒÙlVII‰jkkmÖÊÊJeddtú状5ÿXæÈ¥K—®øØõë×;̽f³YwÝu—m}>#ª««õá‡ÚmëÓ§üñq៮àïﯰ°0íÛ·OÓ¦M³íÓ Ú¸q£í4֖Ư;vØ~ }üñÇÛ|~#y®½Ç‘¶zzÿb4ç7¿®Žè+šŸË•}]P ðò²Ÿ.Z´¨×ϪëŒÙ©—KJJÒž={tàÀ™ÍfÍ›7Ïn)„ÚÚZ}üñǶSöÛ›·®t}Ž®¿vVÐÑã'#ýѶûöí«aÆ);;[ºí¶Û$ý¸4¶lÙ¢ÆÆF5ªÃcèìXÔ™±¬3yßHlŒô¥0˜Ët½ððpýô§?Õ_þò—V¿”×ÖÖ:,¸v¥¾}ûê?þã?^<§§ûæ›ol û[­V}ÿý÷*((йsç4bÄ» r+((H;vìPEE…¨ï¾ûNYYY Vii©V¯^­9sæÈÏÏÏöà‹/¾Pll¬Fmèñ®š?¾–-[¦¥K—*))I‹EyyyÊÏÏWBBB›§y{{{ëž{îч~¨Å‹+..NJOOWHHˆÝ)ãaaa ÕöíÛuáÂ…††ª¼¼\999òôôTRRR§|^F?ƒËY,Í›7Oï½÷ž>ûì3=ôÐC.ÇËH¢££•››«åË—k„ ºpá‚vïÞ­‘#G*++«S?W8ÖØØ¨M›6Ù&Œ8vìX›·EDDèÖ[o5üœ|ðíbDÍî½÷ÞkjV¢ÉdÒ< åË—kÉ’%JHH²³³URR¢””Û‚-Ãh÷îÝòöö¾âŃŒä¹öwFÚêéý‹³¹îò×ír_qùsÅÆÆÞ7Ð5cÔæõB%©¢¢¢W¿ß!C†tÉn&“IO<ñ„þû¿ÿ[»víRFF†n¼ñF…„„èìÙ³ÊÏÏ×?ü Ÿýìgzûí·]Î[ŽŽ³Ž{uwБã'#ý+mÇÄÄhíÚµ’d›Áëáá¡aÆ)++K¾¾¾Šˆˆèð:ÃÙ±¬³ý…³±1ÚoÃyžQQQ¿& ÜÍO<áöïaàÀ>|¸rss»½ ÛRhh¨þó?ÿÓíŠK§OŸVzzºÎœ9£'NØþΜ9£àà`͘1C÷ß¿Ý, “ɤèèh•——+//OEEEòõõÕc=¦äädåççëäÉ“JJJ’···TVV¦#GŽèìÙ³š8q¢¡Ç;RVV¦ŒŒ Mœ8Ñ6C°°°P999š:uª|}}Õ¯_?%$$¨²²RyyyÊÍÍ•ÙlÖÌ™35gλÙTMM’““mƒ²›nºI§OŸÖÑ£GUUU¥[n¹E>ú¨>ÿüsÅÆÆÚ¾ÜŒ=Z555:v옲³³UUU¥!C†è‘Giu‘¥–233UQQÑê êÛ¶mSpp°âââlÛª««µk×.5J7Ýt“áÏ`Û¶m Ô¸qãlÏ9xð`?~\™™™Š‰‰Ñ!CœŽW«‘“q—ÉdRAA²³³U__¯Y³f)22RT§%R' IDATrr²íKQzzº*++uÇwصeäsÅÕyxx(88Øé»³†®{ï½×p`ïÞ½Ú¾}{«çzðÁÝb6\yy¹<¨aÆپ”^M[ûz`` ÆŒ£ï¿ÿ^ÇW~~¾tÏ=÷(%%¥Uúh—MhðõõÕ¤I“d±XTUU¥ââbê‡~P\\œž|òI………éðáÃ22R?ÿùÏ w¥—&¹¼¸;nܸ6‹»ï¾û® mÿ饗Ú<åºRpp0A7A½Îm·Ý&«ÕªÕ«WzÜСCµpáBõíÛ×p›%%%Z¿~½Ý6=ôÐCm>æìÙ³v§A755ñáÀY@¯4eÊÝÿýNß?""ÂåânCCƒþçþGvÛ{ì±v_…¸ ¼èµ¦Nªûî»ïª÷»é¦›´páB——GX¿~½N:e·mîÜ¹ŠŽŽæC@§b‰ôjwÜq‡šššôé§Ÿ:¼ýÆoÔ3Ï<#—ž¿  @Û·ooµýË/¿Ô† ®x¢Þvñ"t= ¼èõ¦OŸ®ÆÆFmذÁn{XXX»Š»Ò^G…ÚsçÎxt:–hÀ5aÖ¬Yš={¶íÿC† ѳÏ>+___‚·Å ^\3îºë.y{{«°°P=ôP‡wû÷ﯡC‡vÈëóôôäC€!¦3f°ð€áèôÔæm-o³Z­vÛ[þ9Úæè¶ppÍc‰pSxÀMQà7EÐk­X±BÏ=÷Ü5ûþ7oÞ¬ÿú¯ÿÒ/~ñ IÒ{ï½§ èСCnù~^zé%-X°@gÏž%ž@/òÜsÏiÅŠÚÆo¼¡—^zéŠù¤ùOMMuû˜ve¾ìMq:[cc£víÚ¥W_}UÏ>û¬~þóŸkÑ¢EZ³fª««{õ{?vì˜,X wß}÷Š÷[´h‘ž~úi]¼xñšÚ7Nž<© hÿþý=æ;Ow½a ^@¯P\\¬7êܹs½ª-W•””hÆ Õ½÷Þ+IêÛ·¯üüüäååå–Ÿ§¯¯¯üüüd2™zd<Ýa¿à8Ÿ´<ÆgÏžÝëÞ_WäÆÞ7 3]¸pA¿ÿýïµjÕ*UVV*::Z 2›Íúâ‹/”ššªï¾û®×Žao¾ùfùûûëðá꯯wxŸï¿ÿ^§NRtt´üüüØiºù3ìα7Œó"€Þ2ØÙ´i“bccåïïßkÚrÕ÷ß/Iºë®»4bÄIÒƒ>¨|Ðm?Ï^x¡GÇÓö r˜Oã½éýuenàØ{ï½§¢¢"͘1CsæÌ±+š}ýõ×úóŸÿ¬?ÿùÏJMMí´‚ZwŽU<<<4nÜ8íܹS9993fL«ûdffJ’âããÙazÀgØco¸pŒz«Õ*IêÓ§Á ž8ƉÐNœ8¡#GŽ())IsçÎmUÀ3fŒ&L˜ S§N©°°°×Æ!!!A’Ú\Þ*33S^^^=z4; `3xnoùòå:vì˜$iÉ’%­O?ýTÅÅŪ­­Õ Aƒtë­·*!!Áî ÀŠ+TUU¥§Ÿ~Zk×®UNNŽ$ÙÞÏ 7Ü Izçw”žž.IzõÕW ßÿþ÷Ú¹s§Ö®]«¥K—*((Èö…cÓ¦M***Rÿþý¯èèhýö·¿Õ3Ï}Z™™™²X,JHHP@@€ÒÓÓuøða%''ËÃãÇ“YŽ=ª?ýéOòòòRRR’†ªšš:tH•••;vìÛr䨱cúÃþ ºº:ÅÇÇ+""BÇŽÓ®]»4räHõïß_ß~û­–-[¦ªª*;V7ß|³N:¥Ý»w«®®N#GŽ´=_zzºªªª´ÿ~Y,Mš4Éö~²²²tûí·ËÃÃC¡¡¡²X,ÊÏÏ×üù󕜜¬   *''GS§N•¯¯¯>¬?ýéOjllTbb¢‚‚‚´gÏ«²²R‰‰‰¶ï¾}ûÔØØ¨Ûn»Íî=6?grr²m­´ôôt]¼xQ™™™:yò¤ÂÃÃ5~üxåååµ+Æéé骬¬ÔwÜ!I;Gœ‰gdd¤Ã×ü׿þU_~ù¥¬øøx™Íf>|X‡ÖäÉ“Ûlèn™™™:}ú´8 ˆˆ;Veee:tèŽ?®´´4M˜0AÇ×ñãÇuèÐ!7Îö%ÏÙœÚ\ø Ô¸qãÚ,îVVVjÉ’%:uê”bcc­óçÏkß¾}***Òøñã¯xJóÁƒUSS£ääd[NhÎ'mãímÓÈãÄË™¼ry¾4òZÚÊá—¯ßÞVÜŒæfgÚ ÐÎ;åíí­èèhÛö’’mÚ´IÉÉÉ>|¸¡¶;¢_s‡5íÑ3¬_¿^f³YsçÎmó>ýúõÓÍ7߬ÀÀ@—öÓ«å†!C†8«9nÚÛ7˜L&ÕÔÔ(77W7Üpƒ]áqÿþýÊÉÉÑÝwßm+ˆÉm§~ø¡Kc1£m;;Îܽ{·Þ}÷]566jüøñ0`€ÒÓÓ•­ššÅÆÆjÈ!öÇhв/!öl| ·¦ââbI?þRÞrPTWW§Ñ£Gë¾ûî³móððÐ_|¡Ó§OÛ–_}õ•úôé£_þò—¶²ÕjÕ믿®£G:ÕVKMMMZ³f,‹^|ñEÛÀvÊ”)úÕ¯~¥mÛ¶iÁ‚úè£äéé©^xÁVL5k–Þ|óMíØ±C“&MRhh¨íyËÊÊ4mÚ4ÍŸ?ÿÿ:s//mß¾]¥¥¥ Ó AƒtúôiIÒM7ݤÈÈÈV¯¯¡¡Ak×®Uÿþýõâ‹/ÚÞóÔ©Sõ›ßü¦ÝŸIQQ‘âããõì³ÏÚNÝíÈ[­ÖN‰][ƒé«ÅÓÑk®¯¯WzzºÆŽ« Øî»uëVÛl¶ö '¨¬¬Ô¿ÿû¿+11Q’§çž{N………zùå—m³Æú÷ﯿüå/*,,´sÎï—×ûÛßZw%iݺujjjRjjªí „Y³fé“O>ѶmÛ”••åp=Gg´uŒ··M#w6^®æ£ïÅQw&n®äfgÚ Rxx¸2335þ|[ñáàÁƒ’¤ÄÄD—Úno¿8£±±QÇÅ™Üàh¬âÊqÓž¾A’Ư 6(==]ãÇ·+›Íf5ʶÍh_rùqÚž±˜Ñ¶gÖÔÔèÓO?UPPþßÿûêׯŸ$iúôéZºti—|çioßF.치6èõšun98j5»ÿþûõ»ßýÎV«Uuuum^é÷JÊÊÊTZZª)S¦Ø¶ Ÿüä'1b„Î;§¢¢"Mœ8Ñî1///Íš5KV«UGŽiõÜÓ§Owø~Œ¼ÎââbUTTØÍühþÝ<`o¯yóæÙ ü:2ÆÝ;§Y2™L***²]ˆH’î¼óNýñ¤¸‹ÏÓÓÓîB7ýúõ“ÅbQdd¤í ¼$ 8°Õqdôx·Z­Z¹r¥öîÝ«øøx»âncc£2335vìXùøø¨¦¦F555ª­­ÕäÉ“%©Í¢q{ 2íiÓèã—+yÅÕ÷ryïÌÜìL[qqq:{ö¬m}R«Õª´´4EDDèúë¯w¹íöôk€3dµZ;u–£«cWŽ›öô ’4`À…‡‡ë›o¾Qmm­íuœ8qB·Ür‹Ìfs»ÆŽ-ÓöŒÅ\iûjãÌæ¥¦OŸn+îJ’¿¿¿¦NÚéßy:ª?%öLÌàôj>>>v¨æÁÞå,‹Îž=«ŒŒ •””èäÉ“*((PMMÝ@ÓYß}÷$µZóJ’m¶B~~~›÷i>5­å`´­÷ãÊ•–¯ôú®´­³Ìf³:-ÆåååÝ;§Y^^zà´víZ¥¦¦*,,LQQQЉ‰Ñ°aà ¯ t5ooïVû©ÉdjµÖž£ãÈèñÞ\@èß¿¿¾þúk•——ÛŠ åååjjjÒž={´gχ¯µºººCß{{Û4úxgãåJ^qå½8Êá•›m+..Nü±222¡¼¼>þª×q´Ÿvô˜ÃÈqcT||¼Ö®]«C‡)))I™™™òññ±[cÛ•¾ÄÑqêj\Œ¶íÌ8óJåöN:p¦ýŽèOÉ…=ø{/!\ë´zõjÅÄÄè©§ž²+pº:¨ ‘ôãU‰[®%&Iiii*))Ñí·ßnÐ;äKry­@g__YY™FŒaw[YY™ÃÇ´¼ªs³æõ»:ÆÍ3ûº#vΪ©©Ñ™3g¤ääd%''«¡¡AûöíÓªU«´eË=üðÀ §J5j”bcc%I'NÔ¾}û”žž®øøxÛñÞØØ¨aÆÙ=®¾¾^vW\ïímÓÈãÄË•¼Ò•ñëìܯ5kÖèĉÊÈÈÐ-·Ü"___—ÛnO¿që­·*//O›6mj³ïOOO—$ >Üð~ê꘣»ÆSýúõÓÈ‘#•››«ï¾ûNÇWbb¢]‘²#ÆŽ®Æ¥3¾H²-aQ\\¬ððp»ÛNž<Ùéûawô§è:¬Á èU ‚¯¦²²Ruuu ±À•––*77WV«Õáó^©­Aƒ)00P_|ñ…jjjìšü±òóó °°0íÛ·OgΜ±TnܸQ&“I111§o¼Qþþþ­^_UU•8Ðêþf³Y¶µÒšã–‘‘Ñ-1ö÷÷ï¶Ø9»–••iÉ’%úûßÿn»ÍËËËvኦ¦&XôJ®ï-g.Ý{ï½²X,Z»v­íTØèèh:t¨ÕP[¶lÑ믿®sçÎuè{ho›Fo$^®ä•®Œ_gçææ«Ö¯\¹RµµµJJJr¹íöök€ñññ ÓîÝ»µyóæVÇêñãǵmÛ6Øös#û©ÑÜМSºs<• ¦¦&½ÿþû²Z­­–gpuìØž¸tdÛŽ :T‹E[·nµ[ ¡ººZ;wîìôï<ÝÑŸ¢ë0ƒÐ;:´ýâÿÅ_(66Ö6ÌÁÁÁ ÒŽ;TQQ¡ê»ï¾SVV–‚ƒƒUZZªÕ«WkΜ9òóósª­æ5¿V¬X¡Å‹kܸq2›Í:tèΟ?¯'žxB&“I<ð€–/_®%K–(!!A>>>ÊÎÎVII‰RRR:d=ܶx÷ß¿Þyçýö·¿U\\œššštðàAEEE);;ÛnEtt´rssµ|ùrM˜0A.\ÐîÝ»5räHÛºi]ãû`tt´BCCµ}ûv]¸pA¡¡¡*//WNNŽ<==í @obôx¿œÅbѼyóôÞ{ïé³Ï>ÓC=¤ùóçkÙ²eZºt©’’’d±X”——§üü|%$$´š ÕÚÛ¦³7¯°°0—òJWů³ss@@€¢¢¢”ŸŸo›èjÛíí×£ÇÆ“O>©×_]6lÐþýû.‹Å¢²²2;vLf³Y?þ¸mVº‘ýÔÙÜàh|Õ]ã©ØØX™ÍfÈb±´š¹ÜÞ¾ÄH\:ºk‹···î¹ç}øá‡Z¼x±âââäáá¡ôôt…„„¨²²²S¿óte€nø>L½ALLŒF¥ŒŒ 9sÆÐ`ÇÃÃC .ÔǬ£GêØ±cºñÆõì³Ï*((Ho½õ–Ž9¢™3gj+66VÏ?ÿ¼6nܨýû÷«©©IC† Ñ#<¢¨¨(IRdd¤^|ñE}úé§úúë¯uéÒ%Ýpà züñÇÛ\«£Œ7N¾¾¾Ú¼y³víڥ͙3G Pvv¶®»î:Û}§NªK—.iÿþýúä“O4dÈÍŸ?_¾¾¾N}îŒwgìœÝ.\¨7êØ±cJKK“ÅbQXX˜¦OŸ®ÈÈH\ôJFwGµoß>íÚµKIII ×Ë/¿¬uëÖé›o¾Quuµ  x@·Ýv[§\0qàÀíjÓÙlj—ŸŸŸKy¥½ïňÎÎÍãÆ³"._ÏÒHÛíí×£®¿þz½üòËúòË/•‘‘¡ììlI?ž6?yòdÍš5«ÕÅ«œÝOûôéãTnp4Vé®ñTß¾}uË-·èСC3fL«ã¹#úgãÒýX[&Mš$mݺUP¿~ý4vìXÍ;W .ìÔï<]Ý k™f̘a% :•N¯ny[ËSZšÿ}¥mŽnst 9ç555©ººZÞÞÞ­.–°wï^}øá‡zã7äííM°=ÆæÍ›µaÃ¥¦¦jðàÁ±/×$«ÕªÔÔT½óÎ;v?À455i÷îÝ ç*¹€¥¡¡A{÷îÕàÁƒ)îÐK4p òôôTrr²>ÿüs½ýöÛŠ‰‰‘ÉdÒW_}¥¢¢"=ýôÓœ¢è1Ö¬Y£ââbUVVêî»ï& ´@€kÔœ9s Ý»wëÿ÷Õ·o_…„„è™gžÑˆ# ÇÈÉÉÑùóç5sæL%&&Z` ^†5xºkð€›¢À nŠ/¸) ¼à¦(ð€›¢À nŠ/¸) ¼à¦(ð€›¢À nŠ/næ7ÞÐK/½D `óÒK/iÁ‚:{ö,Á®1xÜœ¯¯¯üüüd2™:µââbmܸQçÎ#è@áEÜÛ /¼Ð%íkÓ¦MŠ•¿¿?zfð€›b/ÀímÛ¶MëÖ­ÓóÏ?¯¡C‡ÚݶhÑ"ÕÖÖjéÒ¥2™L:}ú´>ýôS«¶¶Vƒ Ò­·Þª„„»ÓÙ^yåÕÕÕ)55ÕîùvîÜ©µk×jñâźþúë%I+V¬ÐùóçõôÓOkõêÕÊÎÎÖ²eËd±XZ½Ö¶îûÖ[o9Ýž#ÕÕÕúì³Ï”ŸŸ¯ÊÊJ+11Q)))òôô´Ý¯¾¾^Û·oWZZšÎœ9#___EEEiîܹ0`;Ã9ÐÙ¼âlžj+OšÍfò·óî»ï*--MK–,i•«^{í5êÕW_•¯¯¯²³³µuëV•••©®®Nýû÷Wll¬fÏž-ooï«æÉ¿ýío:qâ„^{í5Û}]‹EŸ~ú©Þzë-Y­VÛ}?øàmذAºãŽ;©¬¬,½ñÆjhh`g`˜3yÅHžj+O’¿¸£ñãÇK’¾þúk»íUUUÊÏÏר±cåëë«£GêÍ7ßÔùóç5yòd¥¤¤( @Û·o×Ê•+]O}ÎK—.éøƒ5wî\%&&*77×.ÏÞwß}š:uª$顇ÒÃ?Ìè˜Á p{AAA Wff¦æÏŸo›‰{ðàAIRbb¢¬V«>úè#yzzê…^°Í$˜5k–Þ|óMíØ±C“&MRhh¨K¯¡¨¨HñññzöÙgÕ§OŸ»¯3Ö­[§¦¦&¥¦¦*((Èö¾>ùämÛ¶MYYY3fŒêë땞ž®±cÇjÁ‚¶ÇoݺÕ6³cÈ!ìPœæl^q6Oµ•'É_ÜÕˆ#äë뫌Œ ÝqǶíééé’¤ &H’¾úê+õéÓG¿üå/åçç'I²Z­zýõ×uôèQ—Æ“FŸ³¬¬LÓ¦MÓüùómÛ¼¼¼´}ûv•––*,,Laaa*..–ôãìÞ!C†£€¼€^!..NgÏžUaa¡mðš––¦ˆˆ]ýõ:wîœŠŠŠ4qâD»Óļ¼¼4kÖ,Y­V9r¤]¯aÞ¼yNlÜ÷J•™™©±cÇÊÇÇG555ª©©Qmm­&Ož,I¶¼‡‡‡L&“ŠŠŠôý÷ßÛžãÎ;ïÔÿøGÞŒ™p"¯ÉSmåIòwåå奸¸8ýóŸÿTee¥m{ZZš5|øpIÒý÷߯ßýîw¶Blóx¶®®Nõõõ.']yÎéÓ§Ûý?,,L’Ú¼?9è!¹†zƒ¸¸8}üñÇÊÈÈPDD„òòòTUU¥Ù³gK’ÊËË%Iƒ jõØæ5ÅZH2›Í èðû^Myy¹ššš´gÏíÙ³Çá}ª««m_0xà­]»V©©© STT”bbb4lØ0»50ÀÙÂÅÕòŠ‘<ÕVž$pgãÇמ={”™™©iÓ¦©¼¼\EEEš5k–íÌ3‹Å¢³gÏ*##C%%%:yò¤ TSS#³ÙìÒxÒèsúøø¨_¿~vÛZ^£¢=}€N“@o¨ˆˆeffjÞ¼yJKK³Í˜¸šæAgccãUïûÃ?8ÜÞ·o_§_«‘û¶Õ^³æ×g{® AŽº^@¯¯5kÖèĉÊÈÈÐ-·Ü"___I²-ËpêÔ©VkÞvùú»—_ôG’NŸ>Ýi¯ß•öšßWccØèóÈ ƒIDAT£† fw[}}½ äãã#Iª©©Ñ™3g¤ääd%''«¡¡AûöíÓªU«´eËÛ…2À™œäL^i^ËÑ™<Õòwf2™4nÜ8íØ±CUUUJKKÓ°aÃ,éÇ ¦­^½Z111zê©§äáñ«i:3Á‘ÎxNr4Ðs±/ ×;v¬$iåÊ•ª­­URR’í6………iß¾}:sæŒÝàwãÆ2™LЉ‰±m7›Íª¨¨Pmm­m[ee¥222:åµ»Ú^óŒŒC‡©¬¬Ìî¶-[¶èõ×_×¹sç$ýxáŒ%K–èïÿ»í>^^^¶ 555±0”“œÉ+FòT[È_Ü]ó ›7oVii©&Nœh—_ëêêbWˆ---Unn®¬V«ÃÝ®¤3žórÍ'Gݼ€^# @QQQÊÏÏW¿~ý4räHÛm&“I<ð€–/_®%K–(!!A>>>ÊÎÎVII‰RRRlkñJRtt´rssµ|ùrM˜0A.\ÐîÝ»5räHeeeuøkoO{óçÏײeË´téR%%%Éb±(//OùùùJHHPxx¸¤/’ªíÛ·ëÂ… Uyy¹rrräééiWpms6'9›WœÍSm!pwaaa0`€vïÞ-ooo[ñS’‚ƒƒ¤;v¨¢¢BÔwß}§¬¬,«´´T«W¯Öœ9sZ-iÓ–ÎxÎfÍK9|ñÅŠUtt49èfžQQQ¿& ÜÍOR7^çÕª¸kÛØÁ  ãQÜèí®¬X­VI’Éd"š@/Ö|¬_Å]€.à ^‡â.@—ê° ‹Ó³ûôN—wØŠ»öZ£¸ Ðq˜Á  cÔU«òâ¿þíÝ_,ÿ*âÖ³Ûd¡¸ ÐQ(ðè>¡>auth = $auth; } /** * Whether the given permission is available * * @param $name * * @return bool */ public function hasPermission($name) { return $this->auth->hasPermission($name); } /** * List all given roles * * @return array */ public function listRoleNames() { return array_map( [$this, 'getNameForRole'], $this->getUser()->getRoles() ); } /** * Get our user object, throws auth error if not available * * @return \Icinga\User * @throws AuthenticationException */ protected function getUser() { if (null === ($user = $this->auth->getUser())) { throw new AuthenticationException('Authenticated user required'); } return $user; } /** * Get the name for a given role * * @param Role $role * * @return string */ protected function getNameForRole(Role $role) { return $role->getName(); } } icingaweb2-module-director-1.11.8/library/Director/Application/000077500000000000000000000000001516513262500244005ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Application/Dependency.php000066400000000000000000000047171516513262500272000ustar00rootroot00000000000000=1.7.0 * @param string $installedVersion * @param bool $enabled */ public function __construct($name, $requirement, $installedVersion = null, $enabled = null) { $this->name = $name; $this->setRequirement($requirement); if ($installedVersion !== null) { $this->setInstalledVersion($installedVersion); } if ($enabled !== null) { $this->setEnabled($enabled); } } public function setRequirement($requirement) { if (preg_match('/^([<>=]+)\s*v?(\d+\.\d+\.\d+)$/', $requirement, $match)) { $this->operator = $match[1]; $this->requiredVersion = $match[2]; $this->requirement = $requirement; } else { throw new \InvalidArgumentException("'$requirement' is not a valid version constraint"); } } /** * @return bool */ public function isInstalled() { return $this->installedVersion !== null; } /** * @return string|null */ public function getInstalledVersion() { return $this->installedVersion; } /** * @param string $version */ public function setInstalledVersion($version) { $this->installedVersion = ltrim($version, 'v'); // v0.6.0 VS 0.6.0 } /** * @return bool */ public function isEnabled() { return $this->enabled === true; } /** * @param bool $enabled */ public function setEnabled($enabled = true) { $this->enabled = $enabled; } public function isSatisfied() { if (! $this->isInstalled() || ! $this->isEnabled()) { return false; } return version_compare($this->installedVersion, $this->requiredVersion, $this->operator); } public function getName() { return $this->name; } public function getRequirement() { return $this->requirement; } } icingaweb2-module-director-1.11.8/library/Director/Application/DependencyChecker.php000066400000000000000000000041101516513262500304500ustar00rootroot00000000000000app = $app; $this->modules = $app->getModuleManager(); } /** * @param Module $module * @return Dependency[] */ public function getDependencies(Module $module) { $dependencies = []; $isV290 = version_compare(Version::VERSION, '2.9.0', '>='); foreach ($module->getRequiredModules() as $moduleName => $required) { $dependency = new Dependency($moduleName, $required); $dependency->setEnabled($this->modules->hasEnabled($moduleName)); if ($this->modules->hasInstalled($moduleName)) { $dependency->setInstalledVersion($this->modules->getModule($moduleName, false)->getVersion()); } $dependencies[] = $dependency; } if ($isV290) { $libs = $this->app->getLibraries(); foreach ($module->getRequiredLibraries() as $libraryName => $required) { $dependency = new Dependency($libraryName, $required); if ($libs->has($libraryName)) { $dependency->setInstalledVersion($libs->get($libraryName)->getVersion()); $dependency->setEnabled(); } $dependencies[] = $dependency; } } return $dependencies; } // if (version_compare(Version::VERSION, '2.9.0', 'ge')) { // } /** * @param Module $module * @return bool */ public function satisfiesDependencies(Module $module) { foreach ($this->getDependencies($module) as $dependency) { if (! $dependency->isSatisfied()) { return false; } } return true; } } icingaweb2-module-director-1.11.8/library/Director/Application/MemoryLimit.php000066400000000000000000000025261516513262500273650ustar00rootroot00000000000000 The available options are K (for Kilobytes), M (for Megabytes) and G * > (for Gigabytes), and are all case-insensitive. Anything else assumes * > bytes. * * @param $string * @return int */ public static function parsePhpIniByteString($string) { $val = trim($string); if (preg_match('/^(\d+)([KMG])$/', $val, $m)) { $val = (int) $m[1]; switch ($m[2]) { case 'G': $val *= 1024; // no break case 'M': $val *= 1024; // no break case 'K': $val *= 1024; } } return (int) $val; } } icingaweb2-module-director-1.11.8/library/Director/Auth/000077500000000000000000000000001516513262500230365ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Auth/MonitoringRestriction.php000066400000000000000000000017111516513262500301220ustar00rootroot00000000000000setAllowedFilterColumns([ 'host_name', 'hostgroup_name', 'instance_name', 'service_description', 'servicegroup_name', function ($c) { return preg_match('/^_(?:host|service)_/i', $c); } ]); foreach ($auth->getRestrictions(Restriction::MONITORING_RW_OBJECT_FILTER) as $filter) { if ($filter === '*') { return Filter::matchAll(); } $restriction->addFilter(Filter::fromQueryString($filter)); } if ($restriction->isEmpty()) { return Filter::matchAll(); } return $restriction; } } icingaweb2-module-director-1.11.8/library/Director/Auth/Permission.php000066400000000000000000000030041516513262500256740ustar00rootroot00000000000000fail($e, $errorState); } return $this; } public function assertTrue($check, $message, $errorState = 'CRITICAL') { if ($this->makeBool($check, $message) === true) { $this->succeed($message); } else { $this->fail($message, $errorState); } return $this; } public function assertFalse($check, $message, $errorState = 'CRITICAL') { if ($this->makeBool($check, $message) === false) { $this->succeed($message); } else { $this->fail($message, $errorState); } return $this; } protected function makeBool($check, &$message) { if (is_callable($check)) { try { $check = $check(); } catch (Exception $e) { $message .= ': ' . $e->getMessage(); return false; } } if (! is_bool($check)) { return null; } return $check; } } icingaweb2-module-director-1.11.8/library/Director/CheckPlugin/CheckResult.php000066400000000000000000000010211516513262500272500ustar00rootroot00000000000000state = $state; } else { $this->state = new PluginState($state); } $this->output = $output; } public function getState() { return $this->state; } public function getOutput() { return $this->output; } } icingaweb2-module-director-1.11.8/library/Director/CheckPlugin/CheckResults.php000066400000000000000000000057361516513262500274540ustar00rootroot00000000000000 0, 1 => 0, 2 => 0, 3 => 0, ]; public function __construct($name) { $this->name = $name; $this->state = new PluginState(0); } public function getName() { return $this->name; } public function add(CheckResult $result) { $this->results[] = $result; $this->state->raise($result->getState()); $this->stateCounters[$result->getState()->getNumeric()]++; return $this; } public function getStateCounters() { return $this->stateCounters; } public function getProblemSummary() { $summary = []; for ($i = 1; $i <= 3; $i++) { $count = $this->stateCounters[$i]; if ($count === 0) { continue; } $summary[PluginState::create($i)->getName()] = $count; } return $summary; } public function getStateSummaryString() { $summary = [sprintf( '%d tests OK', $this->stateCounters[0] )]; for ($i = 1; $i <= 3; $i++) { $count = $this->stateCounters[$i]; if ($count === 0) { continue; } $summary[] = sprintf( '%dx %s', $count, PluginState::create($i)->getName() ); } return implode(', ', $summary); } public function getOutput() { $output = sprintf( "%s: %s\n", $this->name, $this->getStateSummaryString() ); foreach ($this->results as $result) { $output .= sprintf( "[%s] %s\n", $result->getState()->getName(), $result->getOutput() ); } return $output; } public function getResults() { return $this->results; } public function getState() { return $this->state; } public function hasProblems() { return $this->getState()->getNumeric() !== 0; } public function hasErrors() { $state = $this->getState()->getNumeric(); return $state !== 0 && $state !== 1; } public function succeed($message) { $this->add(new CheckResult($message)); return $this; } public function warn($message) { $this->add(new CheckResult($message, 1)); return $this; } public function fail($message, $errorState = 'CRITICAL') { if ($message instanceof Exception) { $message = $message->getMessage(); } $this->add(new CheckResult($message, $errorState)); return $this; } } icingaweb2-module-director-1.11.8/library/Director/CheckPlugin/PluginState.php000066400000000000000000000045671516513262500273150ustar00rootroot00000000000000 3, 'CRITICAL' => 2, 'WARNING' => 1, 'OK' => 0, ]; protected static $stateNames = [ 'OK', 'WARNING', 'CRITICAL', 'UNKNOWN', ]; protected static $sortSeverity = [0, 1, 3, 2]; /** @var int */ protected $state; public function __construct($state) { $this->set($state); } public function isProblem() { return $this->state > 0; } public function set($state) { $this->state = $this->getNumericStateFor($state); } public function getNumeric() { return $this->state; } public function getSortSeverity() { return static::getSortSeverityFor($this->getNumeric()); } public function getName() { return self::$stateNames[$this->getNumeric()]; } public function raise(PluginState $state) { if ($this->getSortSeverity() < $state->getSortSeverity()) { $this->state = $state->getNumeric(); } return $this; } public static function create($state) { return new static($state); } public static function ok() { return new static(0); } public static function warning() { return new static(1); } public static function critical() { return new static(2); } public static function unknown() { return new static(3); } protected static function getNumericStateFor($state) { if ((is_int($state) || ctype_digit($state)) && $state >= 0 && $state <= 3) { return (int) $state; } elseif (is_string($state) && array_key_exists($state, self::$stateCodes)) { return self::$stateCodes[$state]; } else { throw new ProgrammingError('Expected valid state, got: %s', $state); } } protected static function getSortSeverityFor($state) { if (array_key_exists($state, self::$sortSeverity)) { return self::$sortSeverity[$state]; } else { throw new ProgrammingError( 'Unable to retrieve sort severity for invalid state: %s', $state ); } } } icingaweb2-module-director-1.11.8/library/Director/CheckPlugin/Range.php000066400000000000000000000044511516513262500261020ustar00rootroot00000000000000start = $start; $this->end = $end; $this->mustBeWithinRange = $mustBeWithinRange; } public function valueIsValid($value) { if ($this->valueIsWithinRange($value)) { return $this->valueMustBeWithinRange(); } else { return ! $this->valueMustBeWithinRange(); } } public function valueIsWithinRange($value) { if ($this->start !== null && $value < $this->start) { return false; } if ($this->end !== null && $value > $this->end) { return false; } return true; } public function valueMustBeWithinRange() { return $this->mustBeWithinRange; } /** * @param $any * @return static */ public static function wantRange($any) { if ($any instanceof static) { return $any; } else { return static::parse($any); } } /** * @param $string * @return static * @throws ConfigurationError */ public static function parse($string) { $string = str_replace(' ', '', $string); $value = '[-+]?[\d\.]+'; $valueRe = "$value(?:e$value)?"; $regex = "/^(@)?($valueRe|~)(:$valueRe|~)?/"; if (! preg_match($regex, $string, $match)) { throw new ConfigurationError('Invalid range definition: %s', $string); } $inside = $match[1] === '@'; if (strlen($match[3]) === 0) { $start = 0; $end = static::parseValue($match[2]); } else { $start = static::parseValue($match[2]); $end = static::parseValue($match[3]); } $range = new static($start, $end, $inside); return $range; } protected static function parseValue($value) { if ($value === '~') { return null; } else { return $value; } } } icingaweb2-module-director-1.11.8/library/Director/CheckPlugin/Threshold.php000066400000000000000000000021531516513262500267770ustar00rootroot00000000000000warning = Range::wantRange($warning); } if ($critical !== null) { $this->critical = Range::wantRange($critical); } } public static function check($value, $message, $warning = null, $critical = null) { $threshold = new static($warning, $critical); $state = $threshold->checkValue($value); return new CheckResult($message, $state); } public function checkValue($value) { if ($this->critical !== null) { if (! $this->critical->valueIsValid($value)) { return PluginState::critical(); } } if ($this->warning !== null) { if (! $this->warning->valueIsValid($value)) { return PluginState::warning(); } } return PluginState::ok(); } } icingaweb2-module-director-1.11.8/library/Director/Cli/000077500000000000000000000000001516513262500226445ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Cli/Command.php000066400000000000000000000055461516513262500247450ustar00rootroot00000000000000fail('Invalid JSON: %s', $e->getMessage()); } } /** * @param string $msg * @return never-return */ public function fail($msg) { $args = func_get_args(); array_shift($args); if (count($args)) { $msg = vsprintf($msg, $args); } echo $this->screen->colorize("ERROR", 'red') . ": $msg\n"; exit(1); } /** * @param null $endpointName * @return CoreApi|\Icinga\Module\Director\Core\LegacyDeploymentApi * @throws \Icinga\Exception\NotFoundError */ protected function api($endpointName = null) { if ($this->api === null) { if ($endpointName === null) { $endpoint = $this->db()->getDeploymentEndpoint(); } else { $endpoint = IcingaEndpoint::load($endpointName, $this->db()); } $this->api = $endpoint->api(); } return $this->api; } /** * Raise PHP resource limits * * @return self; */ protected function raiseLimits() { MemoryLimit::raiseTo('1024M'); ini_set('max_execution_time', '0'); if (version_compare(PHP_VERSION, '7.0.0') < 0) { ini_set('zend.enable_gc', '0'); } return $this; } /** * @return Db */ protected function db() { if ($this->db === null) { $resourceName = $this->params->get('dbResourceName'); if ($resourceName === null) { // Hint: not using $this->Config() intentionally. This allows // CLI commands in other modules to use this as a base class. $resourceName = Config::module('director')->get('db', 'resource'); } if ($resourceName) { $this->db = Db::fromResourceName($resourceName); } else { throw new RuntimeException('Director is not configured correctly'); } } return $this->db; } } icingaweb2-module-director-1.11.8/library/Director/Cli/ObjectCommand.php000066400000000000000000000364111516513262500260670ustar00rootroot00000000000000shiftExperimentalFlags(); } /** * Show a specific object * * Use this command to show single objects rendered as Icinga 2 * config or in JSON format. * * USAGE * * icingacli director show [options] * * OPTIONS * * --resolved Resolve all inherited properties and show a flat * object * --json Use JSON format * --no-pretty JSON is pretty-printed per default. Use this flag * to enforce un-formatted JSON * --no-defaults Per default JSON output ships null or default * values. This flag skips those properties * --with-services For hosts only, also shows attached services * --all-services For hosts only, show applied and inherited services * too */ public function showAction() { $db = $this->db(); $object = $this->getObject(); $exporter = new Exporter($db); $resolve = (bool) $this->params->shift('resolved'); $withServices = (bool) $this->params->get('with-services'); $allServices = (bool) $this->params->get('all-services'); if ($withServices) { if (!$object instanceof IcingaHost) { $this->fail('--with-services is available for Hosts only'); } $exporter->enableHostServices(); } if ($allServices) { if (!$object instanceof IcingaHost) { $this->fail('--all-services is available for Hosts only'); } $exporter->serviceLoader()->resolveHostServices(); } $exporter->resolveObjects($resolve); $exporter->showDefaults($this->params->shift('no-defaults', false)); if ($this->params->shift('json')) { echo $this->renderJson($exporter->export($object), !$this->params->shift('no-pretty')); } else { $config = new IcingaConfig($db); if ($resolve) { $object = $object::fromPlainObject($object->toPlainObject(true, false, null, false), $db); } $object->renderToConfig($config); if ($withServices) { foreach ($exporter->serviceLoader()->fetchServicesForHost($object) as $service) { $service->renderToConfig($config); } } foreach ($config->getFiles() as $filename => $content) { printf("/** %s **/\n\n", $filename); echo $content; } } } /** * Create a new object * * Use this command to create a new Icinga object * * USAGE * * icingacli director create [] [options] * * OPTIONS * * -- Provide all properties as single command line * options * --json Otherwise provide all options as a JSON string * * EXAMPLES * * icingacli director host create localhost \ * --imports generic-host \ * --address 127.0.0.1 \ * --vars.location 'My datacenter' * * icingacli director host create localhost \ * --json '{ "address": "127.0.0.1" }' */ public function createAction() { $type = $this->getType(); $props = $this->getObjectProperties(); $name = $props['object_name']; $object = IcingaObject::createByType($type, $props, $this->db()); if ($object->store()) { printf("%s '%s' has been created\n", $type, $name); if ($this->hasExperimental('live-creation')) { if ($this->api()->createObjectAtRuntime($object)) { echo "Live creation for '$name' succeeded\n"; } else { echo "Live creation for '$name' succeeded\n"; exit(1); } if ($type === 'Host' && $this->hasExperimental('immediate-check')) { echo "Waiting for check result..."; flush(); if ($res = $this->api()->checkHostAndWaitForResult($name)) { echo " done\n" . $res->output . "\n"; } else { echo "TIMEOUT\n"; } } } exit(0); } else { printf("%s '%s' has not been created\n", $type, $name); exit(1); } } /** * Modify an existing objects properties * * Use this command to modify specific properties of an existing * Icinga object * * USAGE * * icingacli director set [options] * * OPTIONS * * -- Provide all properties as single command line * options * --append- Appends to array values, like `imports`, * `groups` or `vars.system_owners` * --remove- [] Remove a specific property, eventually only * when matching `value`. In case the property is an * array it will remove just `value` when given * --json Otherwise provide all options as a JSON string * --replace Replace all object properties with the given ones * --auto-create Create the object in case it does not exist * * EXAMPLES * * icingacli director host set localhost \ * --address 127.0.0.2 \ * --vars.location 'Somewhere else' * * icingacli director host set localhost \ * --json '{ "address": "127.0.0.2" }' */ public function setAction() { $name = $this->getName(); $type = $this->getType(); if ($this->params->shift('auto-create') && ! $this->exists($name)) { $action = 'created'; $object = $this->create($type, $name); } else { $action = 'modified'; $object = $this->getObject(); } $appends = self::stripPrefixedProperties($this->params, 'append-'); $remove = self::stripPrefixedProperties($this->params, 'remove-'); if ($this->params->shift('replace')) { $object->replaceWith($this->create($type, $name, $this->remainingParams())); } else { $object->setProperties($this->remainingParams()); } PropertyMangler::appendToArrayProperties($object, $appends); PropertyMangler::removeProperties($object, $remove); $this->persistChanges($object, $type, $name, $action); } protected function persistChanges(DbObject $object, $type, $name, $action) { if ($object->hasBeenModified() && $object->store()) { printf("%s '%s' has been %s\n", $type, $name, $action); exit(0); } printf("%s '%s' has not been modified\n", $type, $name); exit(0); } /** * Delete a specific object * * Use this command to delete a single Icinga object * * USAGE * * icingacli director delete * * EXAMPLES * * icingacli director host delete localhost2 * * icingacli director host delete localhost{3..8} */ public function deleteAction() { $type = $this->getType(); foreach ($this->shiftOneOrMoreNames() as $name) { if ($this->load($name)->delete()) { printf("%s '%s' has been deleted\n", $type, $name); } else { printf("Something went wrong while deleting %s '%s'\n", $type, $name); exit(1); } $this->object = null; } exit(0); } /** * Whether a specific object exists * * Use this command to find out whether a single Icinga object exists * * USAGE * * icingacli director exists */ public function existsAction() { $name = $this->getName(); $type = $this->getType(); if ($this->exists($name)) { printf("%s '%s' exists\n", $type, $name); exit(0); } else { printf("%s '%s' does not exist\n", $type, $name); exit(1); } } /** * Clone an existing object * * Use this command to clone a specific object * * USAGE * * icingacli director clone --from [options] * * OPTIONS * --from The name of the object you want to clone * -- Override specific properties while cloning * --replace In case an object already exists replace * it with the clone * --flat Do no keep inherited properties but create a flat * object with all resolved/inherited properties * * EXAMPLES * * icingacli director host clone localhost2 --from localhost * * icingacli director host clone localhost{3..8} --from localhost2 * * icingacli director host clone localhost3 --from localhost \ * --address 127.0.0.3 */ public function cloneAction() { $fromName = $this->params->shiftRequired('from'); $from = $this->load($fromName); // $name = $this->getName(); $type = $this->getType(); $resolve = $this->params->shift('flat'); $replace = $this->params->shift('replace'); $from->setProperties($this->remainingParams()); foreach ($this->shiftOneOrMoreNames() as $name) { $object = $from::fromPlainObject( $from->toPlainObject($resolve), $from->getConnection() ); $object->set('object_name', $name); if ($replace && $this->exists($name)) { $object = $this->load($name)->replaceWith($object); } if ($object->hasBeenModified() && $object->store()) { printf("%s '%s' has been cloned from %s\n", $type, $name, $fromName); } else { printf("%s '%s' has not been modified\n", $this->getType(), $name); } } exit(0); } protected static function stripPrefixedProperties(Params $params, $prefix = 'append-') { $appends = []; $len = strlen($prefix); foreach ($params->getParams() as $key => $value) { if (substr($key, 0, $len) === $prefix) { $appends[substr($key, $len)] = $value; } } foreach ($appends as $key => $value) { $params->shift("$prefix$key"); } return $appends; } protected function getObjectProperties() { $name = $this->params->shift(); $props = $this->remainingParams(); if (! array_key_exists('object_type', $props)) { $props['object_type'] = 'object'; } // Normalize object_name, compare to given name if ($name) { if (array_key_exists('object_name', $props)) { if ($name !== $props['object_name']) { $this->fail(sprintf( "Name '%s' conflicts with object_name '%s'\n", $name, $props['object_name'] )); } } else { $props['object_name'] = $name; } } else { if (! array_key_exists('object_name', $props)) { $this->fail('Cannot create an object with at least an object name'); } } return $props; } protected function shiftOneOrMoreNames() { $names = array(); while ($name = $this->params->shift()) { $names[] = $name; } if (empty($names)) { throw new MissingParameterException('Required object name is missing'); } return $names; } protected function remainingParams() { if ($json = $this->params->shift('json')) { if ($json === true) { $json = $this->readFromStdin(); if ($json === null) { $this->fail('Please pass JSON either via STDIN or via --json'); } } return (array) $this->parseJson($json); } else { return $this->params->getParams(); } } protected function readFromStdin() { if (!defined('STDIN')) { define('STDIN', fopen('php://stdin', 'r')); } $inputIsTty = function_exists('posix_isatty') && posix_isatty(STDIN); if ($inputIsTty) { return null; } $stdin = file_get_contents('php://stdin'); if (! $stdin) { return null; } return $stdin; } protected function exists($name) { return IcingaObject::existsByType( $this->getType(), $name, $this->db() ); } protected function load($name) { return IcingaObject::loadByType( $this->getType(), $name, $this->db() ); } protected function create($type, $name, $properties = []) { return IcingaObject::createByType($type, $properties + [ 'object_type' => 'object', 'object_name' => $name ], $this->db()); } /** * @return IcingaObject */ protected function getObject() { if ($this->object === null) { $this->object = $this->load($this->getName()); } return $this->object; } protected function getType() { if ($this->type === null) { // Extract the command class name... $className = substr(strrchr(get_class($this), '\\'), 1); // ...and strip the Command extension $this->type = substr($className, 0, -7); } return $this->type; } protected function getName() { if ($this->name === null) { $name = $this->params->shift(); if (! $name) { throw new InvalidArgumentException('Object name parameter is required'); } $this->name = $name; } return $this->name; } protected function hasExperimental($flag) { return array_key_exists($flag, $this->experimentalFlags); } protected function shiftExperimentalFlags() { if ($flags = $this->params->shift('experimental')) { foreach (preg_split('/,/', $flags) as $flag) { $this->experimentalFlags[$flag] = true; } } return $this; } } icingaweb2-module-director-1.11.8/library/Director/Cli/ObjectsCommand.php000066400000000000000000000060351516513262500262510ustar00rootroot00000000000000 list [options] * * OPTIONS * * --json Use JSON format * --no-pretty JSON is pretty-printed per default (for PHP >= 5.4) * Use this flag to enforce unformatted JSON */ public function listAction() { $db = $this->db(); $result = array(); foreach ($this->getObjects() as $o) { $result[] = $o->getObjectName(); } sort($result); if ($this->params->shift('json')) { echo $this->renderJson($result, !$this->params->shift('no-pretty')); } else { foreach ($result as $name) { echo $name . "\n"; } } } /** * Fetch all objects of this type * * Use this command to fetch all matching objects * * USAGE * * icingacli director fetch [options] * * OPTIONS * * --resolved Resolve all inherited properties and show a flat * object * --json Use JSON format * --no-pretty JSON is pretty-printed per default (for PHP >= 5.4) * Use this flag to enforce unformatted JSON * --no-defaults Per default JSON output ships null or default values * With this flag you will skip those properties */ public function fetchAction() { $resolved = $this->params->shift('resolved'); if ($this->params->shift('json')) { $noDefaults = $this->params->shift('no-defaults', false); } else { $this->fail('Currently only json is supported when fetching objects'); } $db = $this->db(); $res = array(); foreach ($this->getObjects() as $object) { if ($resolved) { $object = $object::fromPlainObject($object->toPlainObject(true), $db); } $res[$object->getObjectName()] = $object->toPlainObject(false, $noDefaults); } echo $this->renderJson($res, !$this->params->shift('no-pretty')); } /** * @return IcingaObject[] */ protected function getObjects() { if ($this->objects === null) { $this->objects = IcingaObject::loadAllByType( $this->getType(), $this->db() ); } return $this->objects; } protected function getType() { if ($this->type === null) { // Extract the command class name... $className = substr(strrchr(get_class($this), '\\'), 1); // ...and strip the Command extension $this->type = rtrim(substr($className, 0, -7), 's'); } return $this->type; } } icingaweb2-module-director-1.11.8/library/Director/Cli/PluginOutputBeautifier.php000066400000000000000000000033531516513262500300400ustar00rootroot00000000000000screen = $screen; } public static function beautify($string, Screen $screen) { $self = new static($screen); if ($self->isTty()) { return $self->colorizeStates($string); } else { return $string; } } protected function colorizeStates($string) { $string = preg_replace_callback( "/'([^']+)'/", [$this, 'highlightNames'], $string ); $string = preg_replace_callback( '/(OK|WARNING|CRITICAL|UNKNOWN)/', [$this, 'getColorized'], $string ); return $string; } protected function isTty() { if ($this->isTty === null) { $this->isTty = function_exists('posix_isatty') && posix_isatty(STDOUT); } return $this->isTty; } protected function highlightNames($match) { return "'" . $this->screen->colorize($match[1], 'darkgray') . "'"; } protected function getColorized($match) { if ($this->colorized === null) { $this->colorized = [ 'OK' => $this->screen->colorize('OK', 'lightgreen'), 'WARNING' => $this->screen->colorize('WARNING', 'yellow'), 'CRITICAL' => $this->screen->colorize('CRITICAL', 'lightred'), 'UNKNOWN' => $this->screen->colorize('UNKNOWN', 'lightpurple'), ]; } return $this->colorized[$match[1]]; } } icingaweb2-module-director-1.11.8/library/Director/ConfigDiff.php000066400000000000000000000020631516513262500246450ustar00rootroot00000000000000phpDiff = new PhpDiff($a, $b); } public function render() { $class = $this->renderClass; return (new $class($this->phpDiff))->render(); } public function setHtmlRenderer($name) { switch ($name) { case 'SideBySide': $this->renderClass = SideBySideDiff::class; break; case 'Inline': $this->renderClass = InlineDiff::class; break; default: throw new InvalidArgumentException("There is no known '$name' renderer"); } return $this; } } icingaweb2-module-director-1.11.8/library/Director/Core/000077500000000000000000000000001516513262500230255ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Core/CoreApi.php000066400000000000000000000661211516513262500250660ustar00rootroot00000000000000client = $client; } // Todo: type public function setDb(Db $db) { $this->db = $db; return $this; } /** * @return string|null */ public function getVersion() { return $this->parseVersion($this->getRawVersion()); } public function enableWorkaroundForConnectionIssues() { $version = $this->getVersion(); if ( $version === null || ((version_compare($version, '2.8.2', '>=') && version_compare($version, '2.10.2', '<'))) ) { $this->client->disconnect(); $this->client->setKeepAlive(false); } } /** * @return string|null */ public function getRawVersion() { try { return $this->client()->get('')->getRaw('version'); } catch (Exception $exception) { return null; } } /** * @param $version * @return string|null */ protected function parseVersion($version) { if ($version === null) { return null; } if (preg_match('/^[rv]?(\d\.\d+\.\d+)/', $version, $match)) { return $match[1]; } else { return null; } } public function getObjects($pluralType, $attrs = array(), $ignorePackage = null) { $params = (object) []; if ($ignorePackage) { $params->filter = 'obj.package!="' . $ignorePackage . '"'; } if (! empty($attrs)) { $params->attrs = $attrs; } return $this->client()->get( 'objects/' . urlencode(strtolower($pluralType)), $params )->getResult('name'); } public function onEvent($callback, $raw = false) { $this->client->onEvent($callback, $raw); return $this; } public function getObject($name, $pluraltype, $attrs = array()) { $params = (object) array( ); if (! empty($attrs)) { $params->attrs = $attrs; } $url = 'objects/' . urlencode(strtolower($pluraltype)) . '/' . rawurlencode($name) . '?all_joins=1'; $res = $this->client()->get($url, $params)->getResult('name'); // TODO: check key, throw return $res[$name]; } /** * Get a PKI ticket for CSR auto-signing * * @param string $cn The host’s common name for which the ticket should be generated * * @return string|null */ public function getTicket($cn) { $r = $this->client()->post( 'actions/generate-ticket', ['cn' => $cn] ); if (! $r->succeeded()) { throw new RuntimeException($r->getErrorMessage()); } $ticket = $r->getRaw('ticket'); if ($ticket === null) { // RestApiResponse::succeeded() returns true if Icinga 2 reports an error in the results key, e.g. // { // "results": [ // { // "code": 500.0, // "status": "Ticket salt is not configured in ApiListener object" // } // ] // } throw new RuntimeException($r->getRaw('status', 'Ticket is empty')); } return $ticket; } public function checkHostNow($host) { $filter = 'host.name == "' . $host . '"'; return $this->client()->post( 'actions/reschedule-check?filter=' . rawurlencode($filter), (object) array( 'type' => 'Host' ) ); } public function checkServiceNow($host, $service) { $filter = 'host.name == "' . $host . '" && service.name == "' . $service . '"'; $this->client()->post( 'actions/reschedule-check?filter=' . rawurlencode($filter), (object) array( 'type' => 'Service' ) ); } public function acknowledgeHostProblem($host, $author, $comment) { $filter = 'host.name == "' . $host . '"'; return $this->client()->post( 'actions/acknowledge-problem?type=Host&filter=' . rawurlencode($filter), (object) array( 'author' => $author, 'comment' => $comment ) ); } public function removeHostAcknowledgement($host) { $filter = 'host.name == "' . $host . '"'; return $this->client()->post( 'actions/remove-acknowledgement?type=Host&filter=' . rawurlencode($filter) ); } public function reloadNow() { try { $this->client()->post('actions/restart-process'); return true; } catch (Exception $e) { return $e->getMessage(); } } public function getHostOutput($host) { try { $object = $this->getObject($host, 'hosts'); } catch (Exception $e) { return 'Unable to fetch the requested object'; } if (isset($object->attrs->last_check_result)) { return $object->attrs->last_check_result->output; } else { return '(no check result available)'; } } public function checkHostAndWaitForResult($host, $timeout = 10) { $object = $this->getObject($host, 'hosts'); if (isset($object->attrs->last_check_result)) { $oldOutput = $object->attrs->last_check_result->output; } else { $oldOutput = ''; } $now = microtime(true); $this->checkHostNow($host); while (true) { try { $object = $this->getObject($host, 'hosts'); if (isset($object->attrs->last_check_result)) { $res = $object->attrs->last_check_result; if ($res->execution_start > $now || $res->output !== $oldOutput) { return $res; } } else { // no check result available } } catch (Exception $e) { // Unable to fetch the requested object throw new RuntimeException(sprintf( 'Unable to fetch the requested host "%s"', $host )); } if (microtime(true) > ($now + $timeout)) { break; } usleep(50000); } return false; } public function checkServiceAndWaitForResult($host, $service, $timeout = 10) { $now = microtime(true); $this->checkServiceNow($host, $service); while (true) { try { $object = $this->getObject("$host!$service", 'services'); if (isset($object->attrs->last_check_result)) { $res = $object->attrs->last_check_result; if ($res->execution_start > $now) { return $res; } } else { // no check result available } } catch (Exception $e) { // Unable to fetch the requested object throw new RuntimeException(sprintf( 'Unable to fetch the requested service "%s" on "%s"', $service, $host )); } if (microtime(true) > ($now + $timeout)) { break; } usleep(150000); } return false; } public function getServiceOutput($host, $service) { try { $object = $this->getObject($host . '!' . $service, 'services'); } catch (\Exception $e) { return 'Unable to fetch the requested object'; } if (isset($object->attrs->last_check_result)) { return $object->attrs->last_check_result->output; } else { return '(no check result available)'; } } public function supportsRuntimeCreationFor(IcingaObject $object) { $valid = array('host'); return in_array($object->getShortTableName(), $valid); } protected function assertRuntimeCreationSupportFor(IcingaObject $object) { if (!$this->supportsRuntimeCreationFor($object)) { throw new RuntimeException(sprintf( 'Object creation at runtime is not supported for "%s"', $object->getShortTableName() )); } } // Note: this is for testing purposes only, NOT production-ready public function createObjectAtRuntime(IcingaObject $object) { $this->assertRuntimeCreationSupportFor($object); $key = $object->getShortTableName(); $command = sprintf( "f = function() {\n" . ' existing = get_%s("%s")' . "\n if (existing) { return false }" . "\n%s\n}\nInternal.run_with_activation_context(f)\n", $key, $object->get('object_name'), (string) $object ); return $this->runConsoleCommand($command)->getSingleResult(); } public function getConstants() { $constants = array(); $command = 'var constants = []; for (k => v in globals) { if (typeof(v) in [String, Number, Boolean]) { res = { name = k, value = v } constants.add({name = k, value = v}) } }; constants '; foreach ($this->runConsoleCommand($command)->getSingleResult() as $row) { $constants[$row->name] = $row->value; } return $constants; } public function runConsoleCommand($command) { return $this->client()->post( 'console/execute-script', array('command' => $command) ); } public function getConstant($name) { $constants = $this->getConstants(); if (array_key_exists($name, $constants)) { return $constants[$name]; } return null; } public function getTypes() { return $this->client()->get('types')->getResult('name'); } public function getType($type) { $res = $this->client()->get('types', array('name' => $type))->getResult('name'); return $res[$type]; // TODO: error checking } public function getStatus() { return $this->client()->get('status')->getResult('name'); } public function listObjects($type, $pluralType) { // TODO: more abstraction needed // TODO: autofetch and cache pluraltypes try { $result = $this->client()->get( 'objects/' . $pluralType, array( 'attrs' => array('__name') ) )->getResult('name'); } catch (NotFoundError $e) { $result = []; } return array_keys($result); } public function getPackages() { return $this->client()->get('config/packages')->getResult('name'); } public function getActiveStageName() { return current($this->listPackageStages($this->getPackageName(), true)); } protected function getPackageName() { return $this->db->settings()->get('icinga_package_name'); } public function getActiveChecksum(Db $conn) { $db = $conn->getDbAdapter(); $stage = $this->getActiveStageName(); if (! $stage) { return null; } $query = $db->select()->from( array('l' => 'director_deployment_log'), array('checksum' => $conn->dbHexFunc('l.config_checksum')) )->where('l.stage_name = ?', $stage); return $db->fetchOne($query); } protected function getDirectorObjects($type, $plural, $map) { $attrs = array_merge( array_keys($map), array('package', 'templates', 'active') ); $objects = array(); $result = $this->getObjects($plural, $attrs, $this->getPackageName()); foreach ($result as $name => $row) { $attrs = $row->attrs; $properties = array( 'object_name' => $name, 'object_type' => 'external_object' ); foreach ($map as $key => $prop) { if (property_exists($attrs, $key)) { $properties[$prop] = $attrs->$key; } } $objects[$name] = IcingaObject::createByType($type, $properties, $this->db); } return $objects; } /** * @return IcingaZone[] */ public function getZoneObjects() { return $this->getDirectorObjects('Zone', 'zones', [ 'parent' => 'parent', 'global' => 'is_global', ]); } public function getUserObjects() { return $this->getDirectorObjects('User', 'users', [ 'display_name' => 'display_name', 'email' => 'email', 'groups' => 'groups', 'vars' => 'vars', ]); } protected function buildEndpointZoneMap() { $zones = $this->getObjects('zones', ['endpoints'], $this->getPackageName()); $zoneMap = array(); foreach ($zones as $name => $zone) { if (! is_array($zone->attrs->endpoints)) { continue; } foreach ($zone->attrs->endpoints as $endpoint) { $zoneMap[$endpoint] = $name; } } return $zoneMap; } public function getEndpointObjects() { $zoneMap = $this->buildEndpointZoneMap(); $objects = $this->getDirectorObjects('Endpoint', 'endpoints', [ 'host' => 'host', 'port' => 'port', 'log_duration' => 'log_duration', ]); foreach ($objects as $object) { $name = $object->object_name; if (array_key_exists($name, $zoneMap)) { $object->zone = $zoneMap[$name]; } } return $objects; } public function getHostObjects() { $params = [ 'display_name' => 'display_name', 'address' => 'address', 'address6' => 'address6', 'templates' => 'imports', 'groups' => 'groups', 'vars' => 'vars', 'check_command' => 'check_command', 'max_check_attempts' => 'max_check_attempts', 'check_period' => 'check_period', 'check_interval' => 'check_interval', 'retry_interval' => 'retry_interval', 'enable_notifications' => 'enable_notifications', 'enable_active_checks' => 'enable_active_checks', 'enable_passive_checks' => 'enable_passive_checks', 'enable_event_handler' => 'enable_event_handler', 'enable_flapping' => 'enable_flapping', 'enable_perfdata' => 'enable_perfdata', 'event_command' => 'event_command', 'volatile' => 'volatile', 'zone' => 'zone', 'command_endpoint' => 'command_endpoint', 'notes' => 'notes', 'notes_url' => 'notes_url', 'action_url' => 'action_url', 'icon_image' => 'icon_image', 'icon_image_alt' => 'icon_image_alt', ]; if (version_compare($this->getVersion() ?? '', '2.8.0', '>=')) { $params['flapping_threshold_high'] = 'flapping_threshold_high'; $params['flapping_threshold_low'] = 'flapping_threshold_low'; } return $this->getDirectorObjects('Host', 'hosts', $params); } public function getHostGroupObjects() { return $this->getDirectorObjects('HostGroup', 'hostgroups', [ 'display_name' => 'display_name', ]); } public function getUserGroupObjects() { return $this->getDirectorObjects('UserGroup', 'usergroups', [ 'display_name' => 'display_name', ]); } /** * @return IcingaCommand[] */ public function getCheckCommandObjects() { return $this->getSpecificCommandObjects('Check'); } /** * @return IcingaCommand[] */ public function getNotificationCommandObjects() { return $this->getSpecificCommandObjects('Notification'); } /** * @return IcingaCommand[] */ public function getEventCommandObjects() { return $this->getSpecificCommandObjects('Event'); } /** * @return IcingaCommand[] */ public function getSpecificCommandObjects($type) { IcingaCommand::setPluginDir($this->getConstant('PluginDir')); $objects = $this->getDirectorObjects('Command', "{$type}Commands", [ 'arguments' => 'arguments', // 'env' => 'env', 'timeout' => 'timeout', 'command' => 'command', 'vars' => 'vars', ]); foreach ($objects as $obj) { $obj->methods_execute = "Plugin$type"; } return $objects; } public function listPackageStages($name, $active = null) { $packages = $this->getPackages(); $found = array(); if (array_key_exists($name, $packages)) { $package = $packages[$name]; $current = $package->{'active-stage'}; foreach ($package->stages as $stage) { if ($active === null) { $found[] = $stage; } elseif ($active === true) { if ($current === $stage) { $found[] = $stage; } } elseif ($active === false) { if ($current !== $stage) { $found[] = $stage; } } } } return $found; } public function collectLogFiles(Db $db) { $existing = $this->listPackageStages($this->getPackageName()); $missing = []; $empty = []; foreach (DirectorDeploymentLog::getUncollected($db) as $deployment) { $stage = $deployment->get('stage_name'); if (! in_array($stage, $existing)) { $missing[] = $deployment; continue; } try { $availableFiles = $this->listStageFiles($stage); } catch (Exception $e) { // Could not collect stage files. Doesn't matter, let's try next time continue; } if ( in_array('startup.log', $availableFiles) && in_array('status', $availableFiles) ) { if ($this->getStagedFile($stage, 'status') === '0') { $deployment->set('startup_succeeded', 'y'); } else { $deployment->set('startup_succeeded', 'n'); } $deployment->set('startup_log', $this->shortenStartupLog( $this->getStagedFile($stage, 'startup.log') )); } else { // Stage seems to be incomplete, let's try again next time $empty[] = $deployment; continue; } $deployment->set('stage_collected', 'y'); $deployment->store(); /** @var DeploymentHook[] $hooks */ $hooks = Hook::all('director/Deployment'); foreach ($hooks as $hook) { $hook->onCollect($deployment); } } foreach ($missing as $deployment) { $deployment->set('stage_collected', 'n'); $deployment->store(); } $running = DirectorDeploymentLog::getRelatedToActiveStage($this, $db); if ($running !== null) { foreach ($empty as $deployment) { if ($deployment->getDeploymentTimestamp() < $running->getDeploymentTimestamp()) { $deployment->set('stage_collected', 'n'); $deployment->store(); $this->deleteStage($this->getPackageName(), $deployment->get('stage_name')); } } } } public function wipeInactiveStages(Db $db) { $uncollected = DirectorDeploymentLog::getUncollected($db); $packageName = $this->getPackageName(); foreach ($this->listPackageStages($packageName, false) as $stage) { if (array_key_exists($stage, $uncollected)) { continue; } $this->client()->delete($this->prepareStageUrl($packageName, $stage)); } } public function listStageFiles($stage, $packageName = null) { if ($packageName === null) { $packageName = $this->getPackageName(); } return array_keys( $this->client() ->get($this->prepareStageUrl($packageName, $stage)) ->getResult('name', ['type' => 'file']) ); } public function getStagedFile($stage, $file, $packageName = null) { if ($packageName === null) { $packageName = $this->getPackageName(); } return $this->client() ->getRaw($this->prepareFileUrl($packageName, $stage, $file)); } public function hasPackage($name) { $modules = $this->getPackages(); return \array_key_exists($name, $modules); } public function createPackage($name) { return $this->client()->post($this->preparePackageUrl($name))->succeeded(); } public function deletePackage($name) { return $this->client()->delete($this->preparePackageUrl($name))->succeeded(); } public function assertPackageExists($name) { if (! $this->hasPackage($name)) { if (! $this->createPackage($name)) { throw new RuntimeException(sprintf( 'Failed to create the package "%s" through the REST API', $name )); } } return $this; } public function deleteStage($packageName, $stageName) { $this->client()->delete( $this->prepareStageUrl($packageName, $stageName) )->succeeded(); } /** * @throws Exception */ public function stream() { $allTypes = array( 'CheckResult', 'StateChange', 'Notification', 'AcknowledgementSet', 'AcknowledgementCleared', 'CommentAdded', 'CommentRemoved', 'DowntimeAdded', 'DowntimeRemoved', 'DowntimeTriggered' ); $queue = 'director-rand'; $url = sprintf('events?queue=%s&types=%s', $queue, implode('&types=', $allTypes)); $this->client()->request('post', $url, null, false, true); } /** * @param IcingaConfig $config * @param Db $db * @param null $packageName * @return DirectorDeploymentLog * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function dumpConfig(IcingaConfig $config, Db $db, $packageName = null) { if ($packageName === null) { $packageName = $db->settings()->get('icinga_package_name'); } $start = microtime(true); /** @var DirectorDeploymentLog $deployment */ $deployment = DirectorDeploymentLog::create(array( // 'config_id' => $config->id, // 'peer_identity' => $endpoint->object_name, 'peer_identity' => $this->client->getPeerIdentity(), 'start_time' => date('Y-m-d H:i:s'), 'config_checksum' => $config->getChecksum(), 'last_activity_checksum' => $config->getLastActivityChecksum() // 'triggered_by' => Util::getUsername(), // 'username' => Util::getUsername(), // 'module_name' => $moduleName, )); /** @var DeploymentHook[] $hooks */ $hooks = Hook::all('director/Deployment'); foreach ($hooks as $hook) { $hook->beforeDeploy($deployment); } $this->assertPackageExists($packageName); $response = $this->client()->post('config/stages/' . \rawurlencode($packageName), [ 'files' => $config->getFileContents() ]); $duration = (int) ((microtime(true) - $start) * 1000); // $deployment->duration_ms = $duration; $deployment->set('duration_dump', $duration); $succeeded = 'n'; if ($response->succeeded()) { if ($stage = $response->getResult('stage', ['package' => $packageName])) { // Status? $deployment->set('stage_name', key($stage)); $succeeded = 'y'; } } $deployment->set('dump_succeeded', $succeeded); $deployment->store($db); if ($succeeded === 'y') { foreach ($hooks as $hook) { $hook->triggerSuccessfulDump($deployment); } } return $deployment; } protected function shortenStartupLog($log) { $logLen = strlen($log); if ($logLen < 1024 * 60) { return $log; } $part = substr($log, 0, 1024 * 20); $parts = explode("\n", $part); array_pop($parts); $begin = implode("\n", $parts) . "\n\n"; $part = substr($log, -1024 * 20); $parts = explode("\n", $part); array_shift($parts); $end = "\n\n" . implode("\n", $parts); return $begin . sprintf( '[..] %d bytes removed by Director [..]', $logLen - (strlen($begin) + strlen($end)) ) . $end; } protected function preparePackageUrl($packageName) { return 'config/packages/' . \rawurlencode($packageName); } protected function prepareStageUrl($packageName, $stage) { return \sprintf( 'config/stages/%s/%s', \rawurlencode($packageName), \rawurlencode($stage) ); } protected function prepareFileUrl($packageName, $stage, $file) { return \sprintf( 'config/files/%s/%s/%s', \rawurlencode($packageName), \rawurlencode($stage), \rawurlencode($file) ); } protected function client() { if ($this->initialized === false) { $this->initialized = true; $this->enableWorkaroundForConnectionIssues(); } return $this->client; } } icingaweb2-module-director-1.11.8/library/Director/Core/DeploymentApiInterface.php000066400000000000000000000032161516513262500301330ustar00rootroot00000000000000db = $db; $settings = $this->db->settings(); $this->deploymentPath = $settings->deployment_path_v1; $this->activationScript = $settings->activation_script_v1; $this->dir_mode = base_convert($settings->get('deployment_file_mode_v1', '2775'), 8, 10); $this->file_mode = base_convert($settings->get('deployment_dir_mode_v1', '0664'), 8, 10); } /** * TODO: merge in common class * @inheritdoc */ public function collectLogFiles(Db $db) { $packageName = $db->settings()->get('icinga_package_name'); $existing = $this->listPackageStages($packageName); foreach (DirectorDeploymentLog::getUncollected($db) as $deployment) { $stage = $deployment->get('stage_name'); if (! in_array($stage, $existing)) { continue; } try { $availableFiles = $this->listStageFiles($stage); } catch (Exception $e) { // Could not collect stage files. Doesn't matter, let's try next time continue; } if ( in_array('startup.log', $availableFiles) && in_array('status', $availableFiles) ) { $status = $this->getStagedFile($stage, 'status'); $status = trim($status); if ($status === '0') { $deployment->set('startup_succeeded', 'y'); } else { $deployment->set('startup_succeeded', 'n'); } $deployment->set('startup_log', $this->shortenStartupLog( $this->getStagedFile($stage, 'startup.log') )); } else { // Stage seems to be incomplete, let's try again next time continue; } $deployment->set('stage_collected', 'y'); $deployment->store(); } } /** * TODO: merge in common class * @inheritdoc */ public function wipeInactiveStages(Db $db) { $uncollected = DirectorDeploymentLog::getUncollected($db); $packageName = $db->settings()->get('icinga_package_name'); $currentStage = $this->getActiveStageName(); // try to expire old deployments foreach ($uncollected as $name => $deployment) { /** @var DirectorDeploymentLog $deployment */ if ( $deployment->get('dump_succeeded') === 'n' || $deployment->get('startup_succeeded') === null ) { $start_time = strtotime($deployment->start_time); // older than an hour and no startup if ($start_time + 3600 < time()) { $deployment->set('startup_succeeded', 'n'); $deployment->set('startup_log', 'Activation timed out...'); $deployment->store(); } } } foreach ($this->listPackageStages($packageName) as $stage) { if ( array_key_exists($stage, $uncollected) && $uncollected[$stage]->get('startup_succeeded') === null ) { continue; } elseif ($stage === $currentStage) { continue; } else { $this->deleteStage($packageName, $stage); } } } /** @inheritdoc */ public function getActiveStageName() { $this->assertDeploymentPath(); $path = $this->deploymentPath . DIRECTORY_SEPARATOR . 'active'; if (file_exists($path)) { if (is_link($path)) { $linkTarget = readlink($path); if (! $linkTarget) { throw new IcingaException('Failed to read symlink'); } $linkTargetDir = dirname($linkTarget); $linkTargetName = basename($linkTarget); if ($linkTargetDir === $this->deploymentPath || $linkTargetDir === '.') { return $linkTargetName; } else { throw new IcingaException( 'Active stage link pointing to a invalid target: %s -> %s', $path, $linkTarget ); } } else { throw new IcingaException('Active stage is not a symlink: %s', $path); } } else { return false; } } /** @inheritdoc */ public function listStageFiles($stage) { $path = $this->getStagePath($stage); if (! is_dir($path)) { throw new IcingaException('Deployment stage "%s" does not exist at: %s', $stage, $path); } return $this->listDirectoryContents($path); } /** @inheritdoc */ public function listPackageStages($packageName) { $this->assertPackageName($packageName); $this->assertDeploymentPath(); $dh = @opendir($this->deploymentPath); if ($dh === false) { throw new IcingaException('Can not list contents of %s', $this->deploymentPath); } $stages = array(); while ($file = readdir($dh)) { if ($file === '.' || $file === '..') { continue; } elseif ( is_dir($this->deploymentPath . DIRECTORY_SEPARATOR . $file) && substr($file, 0, 9) === 'director-' ) { $stages[] = $file; } } return $stages; } /** @inheritdoc */ public function getStagedFile($stage, $file) { $path = $this->getStagePath($stage); $filePath = $path . DIRECTORY_SEPARATOR . $file; if (! file_exists($filePath)) { throw new IcingaException('Could not find file %s', $filePath); } else { return file_get_contents($filePath); } } /** @inheritdoc */ public function deleteStage($packageName, $stageName) { $this->assertPackageName($packageName); $this->assertDeploymentPath(); $path = $this->getStagePath($stageName); static::rrmdir($path); } /** @inheritdoc */ public function dumpConfig(IcingaConfig $config, Db $db, $packageName = null) { if ($packageName === null) { $packageName = $db->settings()->get('icinga_package_name'); } $this->assertPackageName($packageName); $this->assertDeploymentPath(); $start = microtime(true); $deployment = DirectorDeploymentLog::create(array( // 'config_id' => $config->id, // 'peer_identity' => $endpoint->object_name, 'peer_identity' => $this->deploymentPath, 'start_time' => date('Y-m-d H:i:s'), 'config_checksum' => $config->getChecksum(), 'last_activity_checksum' => $config->getLastActivityChecksum() // 'triggered_by' => Util::getUsername(), // 'username' => Util::getUsername(), // 'module_name' => $moduleName, )); $stage_name = 'director-' . date('Ymd-His'); $deployment->set('stage_name', $stage_name); try { $succeeded = $this->deployStage($stage_name, $config->getFileContents()); if ($succeeded === true) { $succeeded = $this->activateStage($stage_name); } } catch (Exception $e) { $deployment->set('dump_succeeded', 'n'); $deployment->set('startup_log', $e->getMessage()); $deployment->set('startup_succeeded', 'n'); $deployment->store($db); throw $e; } $duration = (int) ((microtime(true) - $start) * 1000); $deployment->set('duration_dump', $duration); $deployment->set('dump_succeeded', $succeeded === true ? 'y' : 'n'); $deployment->store($db); return $succeeded; } /** * Deploy a new stage, and write all files to it * * @param string $stage Name of the stage * @param array $files Array of files, $fileName => $content * * @return bool Success status * * @throws IcingaException When something could not be accessed */ protected function deployStage($stage, $files) { $path = $this->deploymentPath . DIRECTORY_SEPARATOR . $stage; if (file_exists($path)) { throw new IcingaException('Stage "%s" does already exist at: ', $stage, $path); } else { $this->mkdir($path); foreach ($files as $file => $content) { $fullPath = $path . DIRECTORY_SEPARATOR . $file; $this->mkdir(dirname($fullPath), true); $fh = @fopen($fullPath, 'w'); if ($fh === false) { throw new IcingaException('Could not open file "%s" for writing.', $fullPath); } chmod($fullPath, $this->file_mode); fwrite($fh, $content); fclose($fh); } return true; } } /** * Starts activation of * * Note: script should probably fork to background? * * @param string $stage Stage to activate * * @return bool * * @throws IcingaException For an execution error */ protected function activateStage($stage) { if ($this->activationScript === null || trim($this->activationScript) === '') { // skip activation, could be done by external cron worker return true; } else { $command = sprintf('%s %s 2>&1', escapeshellcmd($this->activationScript), escapeshellarg($stage)); $output = null; $rc = null; exec($command, $output, $rc); $output = join("\n", $output); if ($rc !== 0) { throw new IcingaException("Activation script did exit with return code %d:\n\n%s", $rc, $output); } return true; } } /** * Recursively dump directory contents, with relative path * * @param string $path Absolute path to read from * @param int $depth Internal counter * * @return string[] * * @throws IcingaException When directory could not be opened */ protected function listDirectoryContents($path, $depth = 0) { $dh = @opendir($path); if ($dh === false) { throw new IcingaException('Can not list contents of %s', $path); } $files = array(); while ($file = readdir($dh)) { $fullPath = $path . DIRECTORY_SEPARATOR . $file; if ($file === '.' || $file === '..') { continue; } elseif (is_dir($fullPath)) { $subdirFiles = $this->listDirectoryContents($fullPath, $depth + 1); foreach ($subdirFiles as $subFile) { $files[] = $file . DIRECTORY_SEPARATOR . $subFile; } } else { $files[] = $file; } } if ($depth === 0) { sort($files); } return $files; } /** * Assert that only the director module is interacted with * * @param string $packageName * @throws IcingaException When another module is requested */ protected function assertPackageName($packageName) { if ($packageName !== 'director') { throw new IcingaException('Does not supported different modules!'); } } /** * Assert the deployment path to be configured, existing, and writeable * * @throws IcingaException */ protected function assertDeploymentPath() { if ($this->deploymentPath === null) { throw new IcingaException('Deployment path is not configured for legacy config!'); } elseif (! is_dir($this->deploymentPath)) { throw new IcingaException('Deployment path is not a directory: %s', $this->deploymentPath); } elseif (! is_writeable($this->deploymentPath)) { throw new IcingaException('Deployment path is not a writeable: %s', $this->deploymentPath); } } /** * TODO: avoid code duplication: copied from CoreApi * * @param string $log The log contents to shorten * @return string */ protected function shortenStartupLog($log) { $logLen = strlen($log); if ($logLen < 1024 * 60) { return $log; } $part = substr($log, 0, 1024 * 20); $parts = explode("\n", $part); array_pop($parts); $begin = implode("\n", $parts) . "\n\n"; $part = substr($log, -1024 * 20); $parts = explode("\n", $part); array_shift($parts); $end = "\n\n" . implode("\n", $parts); return $begin . sprintf( '[..] %d bytes removed by Director [..]', $logLen - (strlen($begin) + strlen($end)) ) . $end; } /** * Return the full path of a stage * * @param string $stage Name of the stage * * @return string */ public function getStagePath($stage) { $this->assertDeploymentPath(); return $this->deploymentPath . DIRECTORY_SEPARATOR . $stage; } /** * @from https://php.net/manual/de/function.rmdir.php#108113 * @param $dir */ protected static function rrmdir($dir) { foreach (glob($dir . '/*') as $file) { if (is_dir($file)) { static::rrmdir($file); } else { unlink($file); } } rmdir($dir); } protected function mkdir($path, $recursive = false) { if (! file_exists($path)) { if ($recursive) { $this->mkdir(dirname($path)); } try { mkdir($path); chmod($path, $this->dir_mode); } catch (Exception $e) { throw new IcingaException('Could not create path "%s": %s', $path, $e->getMessage()); } } } } icingaweb2-module-director-1.11.8/library/Director/Core/RestApiClient.php000066400000000000000000000146751516513262500262610ustar00rootroot00000000000000peer = $peer; $this->port = $port; } // TODO: replace with Web2 CA trust resource plus cert and get rid // of user/pass or at least strongly advise against using it public function setCredentials($user, $pass) { $this->user = $user; $this->pass = $pass; return $this; } public function onEvent($callback, $raw = false) { $this->onEventWantsRaw = $raw; $this->onEvent = $callback; return $this; } public function getPeerIdentity() { return $this->peer; } public function setKeepAlive($keepAlive = true) { $this->keepAlive = (bool) $keepAlive; return $this; } protected function url($url) { return sprintf('https://%s:%d/%s/%s', $this->peer, $this->port, $this->version, $url); } /** * @param $method * @param $url * @param null $body * @param bool $raw * @param bool $stream * @return RestApiResponse */ public function request($method, $url, $body = null, $raw = false, $stream = false) { if (function_exists('curl_version')) { return $this->curlRequest($method, $url, $body, $raw, $stream); } else { throw new RuntimeException( 'No CURL extension detected, it must be installed and enabled' ); } } protected function curlRequest($method, $url, $body = null, $raw = false, $stream = false) { $auth = sprintf('%s:%s', $this->user, $this->pass); $headers = [ 'Host: ' . $this->getPeerIdentity(), ]; if (! $this->keepAlive) { // This fails on Icinga 2.9: // $headers[] = 'Connection: close'; } if (! $raw) { $headers[] = 'Accept: application/json'; } if ($body !== null) { $body = Json::encode($body); $headers[] = 'Content-Type: application/json'; } $curl = $this->curl(); $opts = [ CURLOPT_URL => $this->url($url), CURLOPT_HTTPHEADER => $headers, CURLOPT_USERPWD => $auth, CURLOPT_CUSTOMREQUEST => strtoupper($method), CURLOPT_RETURNTRANSFER => true, CURLOPT_CONNECTTIMEOUT => 3, // TODO: Fix this! CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, ]; if ($body !== null) { $opts[CURLOPT_POSTFIELDS] = $body; } if ($stream) { $opts[CURLOPT_WRITEFUNCTION] = [$this, 'readPart']; $opts[CURLOPT_TCP_NODELAY] = 1; } curl_setopt_array($curl, $opts); // TODO: request headers, validate status code Benchmark::measure('Rest Api, sending ' . $url); $res = curl_exec($curl); if ($res === false) { $error = curl_error($curl); $this->disconnect(); throw new RuntimeException("CURL ERROR: $error"); } $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($statusCode === 401) { $this->disconnect(); throw new RuntimeException( 'Unable to authenticate, please check your API credentials' ); } Benchmark::measure('Rest Api, got response'); if (! $this->keepAlive) { $this->disconnect(); } if ($stream) { return $this; } if ($raw) { return $res; } else { return RestApiResponse::fromJsonResult($res); } } /** * @param resource $curl * @param $data * @return int */ protected function readPart($curl, &$data) { $length = strlen($data); $this->readBuffer .= $data; $this->processEvents(); return $length; } public function get($url, $body = null) { return $this->request('get', $url, $body); } public function getRaw($url, $body = null) { return $this->request('get', $url, $body, true); } public function post($url, $body = null) { return $this->request('post', $url, $body); } public function put($url, $body = null) { return $this->request('put', $url, $body); } public function delete($url, $body = null) { return $this->request('delete', $url, $body); } /** * @throws RuntimeException */ protected function curl() { if ($this->curl === null) { $this->curl = curl_init(sprintf('https://%s:%d', $this->peer, $this->port)); if (! $this->curl) { throw new RuntimeException('CURL INIT FAILED'); } } return $this->curl; } protected function processEvents() { $offset = 0; while (false !== ($pos = strpos($this->readBuffer, "\n", $offset))) { if ($pos === $offset) { // echo "Got empty line $offset / $pos\n"; $offset = $pos + 1; continue; } $this->processReadBuffer($offset, $pos); $offset = $pos + 1; } if ($offset > 0) { $this->readBuffer = substr($this->readBuffer, $offset + 1); } // echo "REMAINING: " . strlen($this->readBuffer) . "\n"; } protected function processReadBuffer($offset, $pos) { if ($this->onEvent === null) { return; } $func = $this->onEvent; $str = substr($this->readBuffer, $offset, $pos); // printf("Processing %s bytes\n", strlen($str)); if ($this->onEventWantsRaw) { $func($str); } else { $func(Json::decode($str)); } } public function disconnect() { if ($this->curl) { @curl_close($this->curl); } $this->curl = null; } public function __destruct() { $this->disconnect(); } } icingaweb2-module-director-1.11.8/library/Director/Core/RestApiResponse.php000066400000000000000000000102071516513262500266240ustar00rootroot00000000000000parseJsonResult($json); } public static function fromErrorMessage($error) { $response = new static(); $response->errorMessage = $error; return $response; } public function getResult($desiredKey, $filter = array()) { return $this->extractResult($this->results, $desiredKey, $filter); } public function getRaw($key = null, $default = null) { if ($key === null) { return $this->results; } elseif (isset($this->results[0]) && property_exists($this->results[0], $key)) { return $this->results[0]->$key; } else { return $default; } } public function getSingleResult() { if ($this->isErrorCode($this->results[0]->code)) { throw new IcingaException( $this->results[0]->status ); } else { return $this->results[0]->result; } } protected function isErrorCode($code) { $code = (int) ceil($code); return $code >= 400; } protected function extractResult($results, $desiredKey, $filter = array()) { $response = array(); foreach ($results as $result) { foreach ($filter as $key => $val) { if (! property_exists($result, $key)) { continue; } if ($result->$key !== $val) { continue; } } if (! property_exists($result, $desiredKey)) { continue; } $response[$result->$desiredKey] = $result; } return $response; } public function getErrorMessage() { return $this->errorMessage; } public function succeeded() { return $this->errorMessage === null; } protected function parseJsonResult($json) { $result = @json_decode($json); if ($result === null) { $this->setJsonError(); //

    Bad Request

    bad version

    throw new IcingaException( 'Parsing JSON result failed: ' . $this->errorMessage . ' (Got: ' . substr($json, 0, 60) . ')' ); } if (property_exists($result, 'error')) { if (property_exists($result, 'status')) { if ((int) $result->error === 404) { throw new NotFoundError($result->status); } else { throw new IcingaException('API request failed: ' . $result->status); } } else { throw new IcingaException('API request failed: ' . var_export($result, true)); } } $this->results = $result->results; // TODO: Check if set return $this; } // TODO: just return json_last_error_msg() for PHP >= 5.5.0 protected function setJsonError() { switch (json_last_error()) { case JSON_ERROR_DEPTH: $this->errorMessage = 'The maximum stack depth has been exceeded'; break; case JSON_ERROR_CTRL_CHAR: $this->errorMessage = 'Control character error, possibly incorrectly encoded'; break; case JSON_ERROR_STATE_MISMATCH: $this->errorMessage = 'Invalid or malformed JSON'; break; case JSON_ERROR_SYNTAX: $this->errorMessage = 'Syntax error'; break; case JSON_ERROR_UTF8: $this->errorMessage = 'Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: $this->errorMessage = 'An error occured when parsing a JSON string'; } return $this; } } icingaweb2-module-director-1.11.8/library/Director/CoreBeta/000077500000000000000000000000001516513262500236215ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/CoreBeta/ApiStream.php000066400000000000000000000024731516513262500262250ustar00rootroot00000000000000createSslContext(); if ($context === false) { echo "Unable to set SSL options\n"; return false; } $conn = stream_socket_client( 'ssl://' . $this->peername . ':' . $this->peerport, $errno, $errstr, 15, STREAM_CLIENT_CONNECT, $context ); return $conn; } protected function createSslContext() { $local = 'ssl://' . $this->local; $context = stream_context_create(); // Hack, we need key and cert: $certfile = preg_replace('~\..+$~', '', $this->certname) . '.combi'; $options = array( 'ssl' => array( 'verify_host' => true, 'cafile' => $this->ssldir . '/ca.crt', 'local_cert' => $this->ssldir . '/' . $certfile, 'CN_match' => 'monitor1', ) ); $result = stream_context_set_option($context, $options); return $context; } } icingaweb2-module-director-1.11.8/library/Director/CoreBeta/Stream.php000066400000000000000000000003751516513262500255720ustar00rootroot00000000000000stream = $stream; } } icingaweb2-module-director-1.11.8/library/Director/CoreBeta/StreamContext.php000066400000000000000000000041341516513262500271340ustar00rootroot00000000000000ssl === null) { $this->ssl = new StreamContextSslOptions(); } return $this->ssl; } public function isSsl() { return $this->ssl !== null; } public function setCA(CA $ca) { // $this->options } protected function createSslContext() { $local = 'ssl://' . $this->local; $context = stream_context_create(); // Hack, we need key and cert: $certfile = preg_replace('~\..+$~', '', $this->certname) . '.combi'; $options = array( 'ssl' => array( 'verify_host' => true, 'cafile' => $this->ssldir . '/ca.crt', 'local_cert' => $this->ssldir . '/' . $certfile, 'CN_match' => 'monitor1', ) ); $result = stream_context_set_option($context, $options); return $context; } public function setContextOptions($options) { if (array_key_exists('ssl', $options)) { throw new ProgrammingError('Direct access to ssl options is not allowed'); } } protected function reallySetContextOptions($options) { if ($this->context === null) { $this->options = $options; } else { stream_context_set_option($this->context, $options); } } protected function lazyContext() { if ($this->context === null) { $this->context = stream_context_create(); $this->setContextOptions($this->getOptions()); // stream_context_set_option($this->context if ($this->isSsl()) { $this->options['ssl'] = $this->ssl()->getOptions(); } $result = stream_context_set_option($this->context, $this->options); } return $this->context; } public function getRawContext() { return $this->lazyContext(); } } icingaweb2-module-director-1.11.8/library/Director/CoreBeta/StreamContextSslOptions.php000066400000000000000000000021371516513262500311730ustar00rootroot00000000000000 true, ); public function setCA(CA $ca) { $this->ca = $ca; } public function capturePeerCert($capture = true) { $this->options['capture_peer_cert'] = (bool) $capture; return $this; } public function capturePeerChain($capture = true) { $this->options['capture_peer_chain'] = (bool) $capture; return $this; } public function setCiphers($ciphers) { $this->options['ciphers'] = $ciphers; return $this; } public function setPeerName($name) { if (version_compare(PHP_VERSION, '5.6.0') >= 0) { $this->options['peer_name'] = $name; $this->options['verify_peer_name'] = true; } else { $this->options['CN_match'] = $name; } return $this; } public function getOptions() { // TODO: Fail on missing cert return $this->options; } } icingaweb2-module-director-1.11.8/library/Director/CustomVariable/000077500000000000000000000000001516513262500250555ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/CustomVariable/CustomVariable.php000066400000000000000000000156511516513262500305160ustar00rootroot00000000000000key = $key; $this->setValue($value); } public function is($type) { return $this->getType() === $type; } public function getType() { if ($this->type === null) { $parts = explode('\\', get_class($this)); $class = end($parts); // strlen('CustomVariable') === 14 $this->type = substr($class, 14); } return $this->type; } // TODO: implement delete() public function hasBeenDeleted() { return $this->deleted; } public function delete() { $this->deleted = true; return $this; } // TODO: abstract public function getDbValue() { return $this->getValue(); } public function toJson() { if ($this->getDbFormat() === 'string') { return json_encode($this->getDbValue()); } else { return $this->getDbValue(); } } // TODO: abstract public function getDbFormat() { return 'string'; } public function getKey() { return $this->key; } /** * @param $value * @return $this */ abstract public function setValue($value); abstract public function getValue(); /** * @param bool $renderExpressions * @return string */ public function toConfigString($renderExpressions = false) { // TODO: this should be an abstract method once we deprecate PHP < 5.3.9 throw new LogicException(sprintf( '%s has no toConfigString() implementation', get_class($this) )); } public function flatten(array &$flat, $prefix) { $flat[$prefix] = $this->getDbValue(); } public function render($renderExpressions = false) { return c::renderKeyValue( $this->renderKeyName($this->getKey()), $this->toConfigStringPrefetchable($renderExpressions) ); } protected function renderKeyName($key) { if (preg_match('/^[a-z][a-z0-9_]*$/i', $key)) { return 'vars.' . c::escapeIfReserved($key); } else { return 'vars[' . c::renderString($key) . ']'; } } public function checksum() { // TODO: remember checksum, invalidate on change return sha1($this->getKey() . '=' . $this->toJson(), true); } public function isNew() { return ! $this->loadedFromDb; } public function hasBeenModified() { return $this->modified; } public function toConfigStringPrefetchable($renderExpressions = false) { if (PrefetchCache::shouldBeUsed()) { return PrefetchCache::instance()->renderVar($this, $renderExpressions); } else { return $this->toConfigString($renderExpressions); } } public function setModified($modified = true) { $this->modified = $modified; if (! $this->modified) { if (is_object($this->value)) { $this->storedValue = clone($this->value); } else { $this->storedValue = $this->value; } } return $this; } public function setUnmodified() { return $this->setModified(false); } public function setLoadedFromDb($loaded = true) { $this->loadedFromDb = $loaded; return $this; } abstract public function equals(CustomVariable $var); public function differsFrom(CustomVariable $var) { return ! $this->equals($var); } protected function setChecksum($checksum) { $this->checksum = $checksum; return $this; } public function getChecksum() { return $this->checksum; } public static function wantCustomVariable($key, $value) { if ($value instanceof CustomVariable) { return $value; } return self::create($key, $value); } public static function create($key, $value) { if (is_null($value)) { return new CustomVariableNull($key, $value); } if (is_bool($value)) { return new CustomVariableBoolean($key, $value); } if (is_int($value) || is_float($value)) { return new CustomVariableNumber($key, $value); } if (is_string($value)) { return new CustomVariableString($key, $value); } elseif (is_array($value)) { foreach (array_keys($value) as $k) { if (! (is_int($k) || ctype_digit($k))) { return new CustomVariableDictionary($key, $value); } } return new CustomVariableArray($key, array_values($value)); } elseif (is_object($value)) { // TODO: check for specific class/stdClass/interface? return new CustomVariableDictionary($key, $value); } else { throw new LogicException(sprintf('WTF (%s): %s', $key, var_export($value, true))); } } public static function fromDbRow($row) { switch ($row->format) { case 'string': $var = new CustomVariableString($row->varname, $row->varvalue); break; case 'json': $var = self::create($row->varname, json_decode($row->varvalue)); break; case 'expression': throw new InvalidArgumentException( 'Icinga code expressions are not yet supported' ); default: throw new InvalidArgumentException(sprintf( '%s is not a supported custom variable format', $row->format )); } if (property_exists($row, 'checksum')) { $var->setChecksum($row->checksum); } $var->loadedFromDb = true; $var->setUnmodified(); return $var; } public function __toString() { try { return $this->toConfigString(); } catch (Exception $e) { trigger_error($e); $previousHandler = set_exception_handler( function () { } ); restore_error_handler(); call_user_func($previousHandler, $e); die(); } } } icingaweb2-module-director-1.11.8/library/Director/CustomVariable/CustomVariableArray.php000066400000000000000000000043101516513262500315030ustar00rootroot00000000000000getDbValue() === $this->getDbValue(); } public function getValue() { $ret = array(); foreach ($this->value as $var) { $ret[] = $var->getValue(); } return $ret; } public function getDbValue() { return json_encode($this->getValue()); } public function getDbFormat() { return 'json'; } public function setValue($value) { $new = array(); foreach ($value as $k => $v) { $new[] = self::wantCustomVariable($k, $v); } $equals = true; if (is_array($this->value) && count($new) === count($this->value)) { foreach ($this->value as $k => $v) { if (! $new[$k]->equals($v)) { $equals = false; break; } } } else { $equals = false; } if (! $equals) { $this->value = $new; $this->setModified(); } $this->deleted = false; return $this; } public function flatten(array &$flat, $prefix) { foreach ($this->value as $k => $v) { $v->flatten($flat, sprintf('%s[%d]', $prefix, $k)); } } public function toConfigString($renderExpressions = false) { $parts = array(); foreach ($this->value as $k => $v) { $parts[] = $v->toConfigString($renderExpressions); } return c::renderEscapedArray($parts); } public function __clone() { foreach ($this->value as $key => $value) { $this->value[$key] = clone($value); } } public function toLegacyConfigString() { return c1::renderArray($this->value); } } icingaweb2-module-director-1.11.8/library/Director/CustomVariable/CustomVariableBoolean.php000066400000000000000000000020251516513262500320050ustar00rootroot00000000000000getValue() === $this->getValue(); } public function getDbFormat() { return 'json'; } public function getDbValue() { return json_encode($this->getValue()); } public function getValue() { return $this->value; } public function setValue($value) { if (! is_bool($value)) { throw new ProgrammingError( 'Expected a boolean, got %s', var_export($value, true) ); } $this->value = $value; $this->deleted = false; return $this; } public function toConfigString($renderExpressions = false) { return $this->value ? 'true' : 'false'; } public function toLegacyConfigString() { return $this->toConfigString(); } } icingaweb2-module-director-1.11.8/library/Director/CustomVariable/CustomVariableDictionary.php000066400000000000000000000052541516513262500325420ustar00rootroot00000000000000listKeys(); $foreignKeys = $var->listKeys(); if ($myKeys !== $foreignKeys) { return false; } foreach ($this->value as $key => $value) { if (! $value->equals($var->getInternalValue($key))) { return false; } } return true; } public function getDbFormat() { return 'json'; } public function getDbValue() { return json_encode($this->getValue()); } public function setValue($value) { $new = array(); foreach ($value as $key => $val) { $new[$key] = self::wantCustomVariable($key, $val); } $this->deleted = false; // WTF? if ($this->value === $new) { return $this; } $this->value = $new; $this->setModified(); return $this; } public function getValue() { $ret = (object) array(); ksort($this->value); foreach ($this->value as $key => $var) { $ret->$key = $var->getValue(); } return $ret; } public function flatten(array &$flat, $prefix) { foreach ($this->value as $k => $v) { $v->flatten($flat, sprintf('%s["%s"]', $prefix, $k)); } } public function listKeys() { $keys = array_keys($this->value); sort($keys); return $keys; } #[\ReturnTypeWillChange] public function count() { return count($this->value); } public function __clone() { foreach ($this->value as $key => $value) { $this->value[$key] = clone($value); } } public function __get($key) { return $this->value[$key]; } public function __isset($key) { return array_key_exists($key, $this->value); } public function getInternalValue($key) { return $this->value[$key]; } public function toConfigString($renderExpressions = false) { // TODO return c::renderDictionary($this->value); } public function toLegacyConfigString() { return c1::renderDictionary($this->value); } } icingaweb2-module-director-1.11.8/library/Director/CustomVariable/CustomVariableNull.php000066400000000000000000000017211516513262500313420ustar00rootroot00000000000000getValue()); } public function getDbFormat() { return 'json'; } public function setValue($value) { if (! is_null($value)) { throw new ProgrammingError( 'Null can only be null, got %s', var_export($value, true) ); } $this->deleted = false; return $this; } public function toConfigString($renderExpressions = false) { return 'null'; } public function toLegacyConfigString() { return $this->toConfigString(); } } icingaweb2-module-director-1.11.8/library/Director/CustomVariable/CustomVariableNumber.php000066400000000000000000000031261516513262500316610ustar00rootroot00000000000000getValue(); $new = $var->getValue(); // Be tolerant when comparing floats: if (is_float($cur) || is_float($new)) { return sprintf(self::PRECISION, $cur) === sprintf(self::PRECISION, $new); } return $cur === $new; } public function getDbFormat() { return 'json'; } public function getDbValue() { return json_encode($this->getValue()); } public function getValue() { return $this->value; } public function setValue($value) { if (! is_int($value) && ! is_float($value)) { throw new ProgrammingError( 'Expected a number, got %s', var_export($value, true) ); } $this->value = $value; $this->deleted = false; return $this; } public function toConfigString($renderExpressions = false) { if (is_int($this->value)) { return (string) $this->value; } else { return sprintf(self::PRECISION, $this->value); } } public function toLegacyConfigString() { return $this->toConfigString(); } } icingaweb2-module-director-1.11.8/library/Director/CustomVariable/CustomVariableString.php000066400000000000000000000025771516513262500317100ustar00rootroot00000000000000getValue() === $this->getValue(); } public function getValue() { return $this->value; } public function setValue($value) { if (! is_string($value)) { $value = (string) $value; } if ($value !== $this->value) { $this->value = $value; $this->setModified(); } $this->deleted = false; return $this; } public function flatten(array &$flat, $prefix) { // TODO: we should get rid of type=string and always use JSON $flat[$prefix] = json_encode($this->getValue()); } public function toConfigString($renderExpressions = false) { if ($renderExpressions) { return c::renderStringWithVariables($this->getValue(), ['config']); } else { return c::renderString($this->getValue()); } } public function toLegacyConfigString() { return c1::renderString($this->getValue()); } } icingaweb2-module-director-1.11.8/library/Director/CustomVariable/CustomVariables.php000066400000000000000000000303321516513262500306720ustar00rootroot00000000000000getDbAdapter(); $parts = array(); $where = $db->quoteInto('varname = ?', $varname); foreach (static::$allTables as $table) { $parts[] = "SELECT COUNT(*) as cnt FROM $table WHERE $where"; } $sub = implode(' UNION ALL ', $parts); $query = "SELECT SUM(sub.cnt) AS cnt FROM ($sub) sub"; return (int) $db->fetchOne($query); } public static function deleteAll($varname, Db $connection) { $db = $connection->getDbAdapter(); $where = $db->quoteInto('varname = ?', $varname); foreach (static::$allTables as $table) { $db->delete($table, $where); } } public static function renameAll($oldname, $newname, Db $connection) { $db = $connection->getDbAdapter(); $where = $db->quoteInto('varname = ?', $oldname); foreach (static::$allTables as $table) { $db->update($table, ['varname' => $newname], $where); } } #[\ReturnTypeWillChange] public function count() { $count = 0; foreach ($this->vars as $var) { if (! $var->hasBeenDeleted()) { $count++; } } return $count; } #[\ReturnTypeWillChange] public function rewind() { $this->position = 0; } #[\ReturnTypeWillChange] public function current() { if (! $this->valid()) { return null; } return $this->vars[$this->idx[$this->position]]; } #[\ReturnTypeWillChange] public function key() { return $this->idx[$this->position]; } #[\ReturnTypeWillChange] public function next() { ++$this->position; } #[\ReturnTypeWillChange] public function valid() { return array_key_exists($this->position, $this->idx); } /** * Generic setter * * @param string $key * @param mixed $value * * @return self */ public function set($key, $value) { $key = (string) $key; if ($value instanceof CustomVariable) { $value = clone($value); } else { if ($value === null) { $this->__unset($key); return $this; } $value = CustomVariable::create($key, $value); } // Hint: isset($this->$key) wouldn't conflict with protected properties if ($this->__isset($key)) { if ($value->equals($this->get($key))) { return $this; } else { if (get_class($this->vars[$key]) === get_class($value)) { $this->vars[$key]->setValue($value->getValue())->setModified(); } else { $this->vars[$key] = $value->setLoadedFromDb()->setModified(); } } } else { $this->vars[$key] = $value->setModified(); } $this->modified = true; $this->refreshIndex(); return $this; } protected function refreshIndex() { $this->idx = array(); ksort($this->vars); foreach ($this->vars as $name => $var) { if (! $var->hasBeenDeleted()) { $this->idx[] = $name; } } } public static function loadForStoredObject(IcingaObject $object) { $db = $object->getDb(); $query = $db->select()->from( array('v' => $object->getVarsTableName()), array( 'v.varname', 'v.varvalue', 'v.format', ) )->where(sprintf('v.%s = ?', $object->getVarsIdColumn()), $object->get('id')); $vars = new CustomVariables(); foreach ($db->fetchAll($query) as $row) { $vars->vars[$row->varname] = CustomVariable::fromDbRow($row); } $vars->refreshIndex(); $vars->setBeingLoadedFromDb(); return $vars; } public static function forStoredRows($rows) { $vars = new CustomVariables(); foreach ($rows as $row) { $vars->vars[$row->varname] = CustomVariable::fromDbRow($row); } $vars->refreshIndex(); $vars->setBeingLoadedFromDb(); return $vars; } public function storeToDb(IcingaObject $object) { $db = $object->getDb(); $table = $object->getVarsTableName(); $foreignColumn = $object->getVarsIdColumn(); $foreignId = $object->get('id'); foreach ($this->vars as $var) { if ($var->isNew()) { $db->insert( $table, array( $foreignColumn => $foreignId, 'varname' => $var->getKey(), 'varvalue' => $var->getDbValue(), 'format' => $var->getDbFormat() ) ); $var->setLoadedFromDb(); continue; } $where = $db->quoteInto(sprintf('%s = ?', $foreignColumn), (int) $foreignId) . $db->quoteInto(' AND varname = ?', $var->getKey()); if ($var->hasBeenDeleted()) { $db->delete($table, $where); } elseif ($var->hasBeenModified()) { $db->update( $table, array( 'varvalue' => $var->getDbValue(), 'format' => $var->getDbFormat() ), $where ); } } $this->setBeingLoadedFromDb(); } public function get($key) { if (array_key_exists($key, $this->vars)) { return $this->vars[$key]; } return null; } public function hasBeenModified() { if ($this->modified) { return true; } foreach ($this->vars as $var) { if ($var->hasBeenModified()) { return true; } } return false; } public function setBeingLoadedFromDb() { $this->modified = false; $this->storedVars = array(); foreach ($this->vars as $key => $var) { $this->storedVars[$key] = clone($var); $var->setUnmodified(); $var->setLoadedFromDb(); } return $this; } public function restoreStoredVar($key) { if (array_key_exists($key, $this->storedVars)) { $this->vars[$key] = clone($this->storedVars[$key]); $this->vars[$key]->setUnmodified(); $this->recheckForModifications(); $this->refreshIndex(); } elseif (array_key_exists($key, $this->vars)) { unset($this->vars[$key]); $this->recheckForModifications(); $this->refreshIndex(); } } protected function recheckForModifications() { $this->modified = false; foreach ($this->vars as $var) { if ($var->hasBeenModified()) { $this->modified = true; return; } } } public function getOriginalVars() { return $this->storedVars; } public function flatten() { $flat = array(); foreach ($this->vars as $key => $var) { $var->flatten($flat, $key); } return $flat; } public function checksum() { $sums = array(); foreach ($this->vars as $key => $var) { $sums[] = $key . '=' . $var->checksum(); } return sha1(implode('|', $sums), true); } public function setOverrideKeyName($name) { $this->overrideKeyName = $name; return $this; } public function toConfigString($renderExpressions = false) { $out = ''; foreach ($this as $key => $var) { // TODO: ctype_alnum + underscore? $out .= $this->renderSingleVar($key, $var, $renderExpressions); } return $out; } public function toLegacyConfigString() { $out = ''; ksort($this->vars); foreach ($this->vars as $key => $var) { // TODO: ctype_alnum + underscore? // vars with ARGn will be handled by IcingaObject::renderLegacyCheck_command if (substr($key, 0, 3) == 'ARG') { continue; } switch ($type = $var->getType()) { case 'String': case 'Number': # TODO: Make Prefetchable $out .= c1::renderKeyValue( '_' . $key, $var->toLegacyConfigString() ); break; default: $out .= c1::renderKeyValue( '# _' . $key, sprintf('(unsupported: %s)', $type) ); } } if ($out !== '') { $out = "\n" . $out; } return $out; } /** * @param string $key * @param CustomVariable $var * @param bool $renderExpressions * * @return string */ protected function renderSingleVar($key, $var, $renderExpressions = false) { if ($key === $this->overrideKeyName) { return c::renderKeyOperatorValue( $this->renderKeyName($key), '+=', $var->toConfigStringPrefetchable($renderExpressions) ); } else { return c::renderKeyValue( $this->renderKeyName($key), $var->toConfigStringPrefetchable($renderExpressions) ); } } protected function renderKeyName($key) { return 'vars' . self::renderKeySuffix($key); } public static function renderKeySuffix($key) { if (preg_match('/^[a-z][a-z0-9_]*$/i', $key)) { return '.' . c::escapeIfReserved($key); } else { return '[' . c::renderString($key) . ']'; } } public function __get($key) { return $this->get($key); } /** * Magic setter * * @param string $key Key * @param mixed $val Value * * @return void */ public function __set($key, $val) { $this->set($key, $val); } /** * Magic isset check * * @param string $key * * @return boolean */ public function __isset($key) { return array_key_exists($key, $this->vars); } /** * Magic unsetter * * @param string $key * * @return void */ public function __unset($key) { if (! array_key_exists($key, $this->vars)) { return; } $this->vars[$key]->delete(); $this->modified = true; $this->refreshIndex(); } public function __toString() { try { return $this->toConfigString(); } catch (Exception $e) { trigger_error($e); $previousHandler = set_exception_handler( function () { } ); restore_error_handler(); call_user_func($previousHandler, $e); die(); } } } icingaweb2-module-director-1.11.8/library/Director/Daemon/000077500000000000000000000000001516513262500233405ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Daemon/BackgroundDaemon.php000066400000000000000000000146521516513262500272640ustar00rootroot00000000000000loop = $loop; $this->loop->futureTick(function () { $this->initialize(); }); if ($ownLoop) { $loop->run(); } } public function setDbResourceName($name) { $this->dbResourceName = $name; return $this; } protected function initialize() { $this->registerSignalHandlers($this->loop); $this->processState = new DaemonProcessState('icinga::director'); $this->jobRunner = new JobRunner($this->loop); $this->systemd = $this->eventuallyInitializeSystemd(); $this->processState->setSystemd($this->systemd); if ($this->systemd) { $this->systemd->setReady(); } $this->setState('ready'); $this->processDetails = $this ->initializeProcessDetails($this->systemd) ->registerProcessList($this->jobRunner->getProcessList()); $this->logProxy = new LogProxy($this->processDetails->getInstanceUuid()); $this->jobRunner->forwardLog($this->logProxy); $this->daemonDb = $this->initializeDb( $this->processDetails, $this->processState, $this->dbResourceName ); $this->daemonDb ->register($this->jobRunner) ->register($this->logProxy) ->register(new DeploymentChecker($this->loop)) ->run($this->loop); $this->setState('running'); } /** * @param NotifySystemD|false $systemd * @return DaemonProcessDetails */ protected function initializeProcessDetails($systemd) { if ($systemd && $systemd->hasInvocationId()) { $uuid = $systemd->getInvocationId(); } else { try { $uuid = \bin2hex(Uuid::uuid4()->getBytes()); } catch (Exception $e) { $uuid = 'deadc0de' . substr(md5((string) getmypid()), 0, 24); } } $processDetails = new DaemonProcessDetails($uuid); if ($systemd) { $processDetails->set('running_with_systemd', 'y'); } return $processDetails; } protected function eventuallyInitializeSystemd() { $systemd = NotifySystemD::ifRequired($this->loop); if ($systemd) { Logger::replaceRunningInstance(new SystemdLogWriter()); Logger::info(sprintf( "Started by systemd, notifying watchdog every %0.2Gs via %s", $systemd->getWatchdogInterval(), $systemd->getSocketPath() )); } else { Logger::debug('Running without systemd'); } return $systemd; } /** * @return DaemonProcessDetails */ public function getProcessDetails() { return $this->processDetails; } /** * @return DaemonProcessState */ public function getProcessState() { return $this->processState; } protected function initializeDb( DaemonProcessDetails $processDetails, DaemonProcessState $processState, $dbResourceName = null ) { $db = new DaemonDb($processDetails); $db->on('state', function ($state, $level = null) use ($processState) { // TODO: level is sent but not used $processState->setComponentState('db', $state); }); $db->on('schemaChange', function ($startupSchema, $dbSchema) { Logger::info(sprintf( "DB schema version changed. Started with %d, DB has %d. Restarting.", $startupSchema, $dbSchema )); $this->reload(); }); $db->setConfigWatch( $dbResourceName ? DbResourceConfigWatch::name($dbResourceName) : DbResourceConfigWatch::module('director') ); return $db; } protected function registerSignalHandlers(LoopInterface $loop) { $func = function ($signal) use (&$func) { $this->shutdownWithSignal($signal, $func); }; $funcReload = function () { $this->reload(); }; $loop->addSignal(SIGHUP, $funcReload); $loop->addSignal(SIGINT, $func); $loop->addSignal(SIGTERM, $func); } protected function shutdownWithSignal($signal, &$func) { $this->loop->removeSignal($signal, $func); $this->shutdown(); } public function reload() { if ($this->reloading) { Logger::error('Ignoring reload request, reload is already in progress'); return; } $this->reloading = true; Logger::info('Going gown for reload now'); $this->setState('reloading the main process'); $this->daemonDb->disconnect()->then(function () { Process::restart(); }); } protected function shutdown() { if ($this->shuttingDown) { Logger::error('Ignoring shutdown request, shutdown is already in progress'); return; } Logger::info('Shutting down'); $this->shuttingDown = true; $this->setState('shutting down'); $this->daemonDb->disconnect()->then(function () { Logger::info('DB has been disconnected, shutdown finished'); $this->loop->stop(); }); } protected function setState($state) { if ($this->processState) { $this->processState->setState($state); } return $this; } } icingaweb2-module-director-1.11.8/library/Director/Daemon/DaemonDb.php000066400000000000000000000247071516513262500255340ustar00rootroot00000000000000details = $details; $this->dbConfig = $dbConfig; } public function register(DbBasedComponent $component) { $this->registeredComponents[] = $component; return $this; } public function setConfigWatch(DbResourceConfigWatch $configWatch) { $this->configWatch = $configWatch; $configWatch->notify(function ($config) { $this->disconnect()->then(function () use ($config) { return $this->onNewConfig($config); }); }); if ($this->loop) { $configWatch->run($this->loop); } return $this; } public function run(LoopInterface $loop) { $this->loop = $loop; $this->connect(); $this->refreshTimer = $loop->addPeriodicTimer(3, function () { $this->refreshMyState(); }); $this->schemaCheckTimer = $loop->addPeriodicTimer(15, function () { $this->checkDbSchema(); }); if ($this->configWatch) { $this->configWatch->run($this->loop); } } protected function onNewConfig($config) { if ($config === null) { if ($this->dbConfig === null) { Logger::error('DB configuration is not valid'); } else { Logger::error('DB configuration is no longer valid'); } $this->emitStatus('no configuration'); $this->dbConfig = $config; return resolve(); } else { $this->emitStatus('configuration loaded'); $this->dbConfig = $config; return $this->establishConnection($config); } } protected function establishConnection($config) { if ($this->connection !== null) { Logger::error('Trying to establish a connection while being connected'); return reject(); } $callback = function () use ($config) { $this->reallyEstablishConnection($config); }; $onSuccess = function () { $this->pendingReconnection = null; $this->onConnected(); }; if ($this->pendingReconnection) { $this->pendingReconnection->reset(); $this->pendingReconnection = null; } $this->emitStatus('connecting'); return $this->pendingReconnection = RetryUnless::succeeding($callback) ->setInterval(0.2) ->slowDownAfter(10, 10) ->run($this->loop) ->then($onSuccess) ; } protected function reallyEstablishConnection($config) { $connection = new Db(new ConfigObject($config)); $connection->getDbAdapter()->getConnection(); $migrations = new Migrations($connection); if (! $migrations->hasSchema()) { $this->emitStatus('no schema', 'error'); throw new RuntimeException('DB has no schema'); } $this->wipeOrphanedInstances($connection); if ($this->hasAnyOtherActiveInstance($connection)) { $this->emitStatus('locked by other instance', 'warning'); throw new RuntimeException('DB is locked by a running daemon instance, will retry'); } $this->startupSchemaVersion = $migrations->getLastMigrationNumber(); $this->details->set('schema_version', $this->startupSchemaVersion); $this->connection = $connection; $this->db = $connection->getDbAdapter(); $this->loop->futureTick(function () { $this->refreshMyState(); }); return $connection; } protected function checkDbSchema() { if ($this->connection === null) { return; } if ($this->schemaIsOutdated()) { $this->emit('schemaChange', [ $this->getStartupSchemaVersion(), $this->getDbSchemaVersion() ]); } } protected function schemaIsOutdated() { return $this->getStartupSchemaVersion() < $this->getDbSchemaVersion(); } protected function getStartupSchemaVersion() { return $this->startupSchemaVersion; } protected function getDbSchemaVersion() { if ($this->connection === null) { throw new RuntimeException( 'Cannot determine DB schema version without an established DB connection' ); } $migrations = new Migrations($this->connection); return $migrations->getLastMigrationNumber(); } protected function onConnected() { $this->emitStatus('connected'); Logger::info('Connected to the database'); foreach ($this->registeredComponents as $component) { $component->initDb($this->connection); } } /** * @return \React\Promise\PromiseInterface */ protected function reconnect() { return $this->disconnect()->then(function () { return $this->connect(); }, function (Exception $e) { Logger::error('Disconnect failed. This should never happen: ' . $e->getMessage()); exit(1); }); } /** * @return \React\Promise\ExtendedPromiseInterface */ public function connect() { if ($this->connection === null) { if ($this->dbConfig) { return $this->establishConnection($this->dbConfig); } } return resolve(); } /** * @return \React\Promise\ExtendedPromiseInterface */ public function disconnect() { if (! $this->connection) { return resolve(); } if ($this->pendingDisconnect) { return $this->pendingDisconnect->promise(); } $this->eventuallySetStopped(); $this->pendingDisconnect = new Deferred(); $pendingComponents = new SplObjectStorage(); foreach ($this->registeredComponents as $component) { $pendingComponents->attach($component); $resolve = function () use ($pendingComponents, $component) { $pendingComponents->detach($component); if ($pendingComponents->count() === 0) { $this->pendingDisconnect->resolve(); } }; // TODO: What should we do in case they don't? $component->stopDb()->then($resolve); } try { if ($this->db) { $this->db->closeConnection(); } } catch (Exception $e) { Logger::error('Failed to disconnect: ' . $e->getMessage()); } return $this->pendingDisconnect->promise()->then(function () { $this->connection = null; $this->db = null; $this->pendingDisconnect = null; }); } protected function emitStatus($message, $level = 'info') { $this->emit('state', [$message, $level]); return $this; } protected function hasAnyOtherActiveInstance(Db $connection) { $db = $connection->getDbAdapter(); return (int) $db->fetchOne( $db->select() ->from('director_daemon_info', 'COUNT(*)') ->where('ts_stopped IS NULL') ) > 0; } protected function wipeOrphanedInstances(Db $connection) { $db = $connection->getDbAdapter(); $db->delete('director_daemon_info', 'ts_stopped IS NOT NULL'); $db->delete('director_daemon_info', $db->quoteInto( 'instance_uuid_hex = ?', $this->details->getInstanceUuid() )); $count = $db->delete( 'director_daemon_info', 'ts_stopped IS NULL AND ts_last_update < ' . ( DaemonUtil::timestampWithMilliseconds() - (60 * 1000) ) ); if ($count > 1) { Logger::error("Removed $count orphaned daemon instance(s) from DB"); } } protected function refreshMyState() { if ($this->db === null || $this->pendingReconnection || $this->pendingDisconnect) { return; } try { $updated = $this->db->update( 'director_daemon_info', $this->details->getPropertiesToUpdate(), $this->db->quoteInto('instance_uuid_hex = ?', $this->details->getInstanceUuid()) ); if (! $updated) { $this->db->insert( 'director_daemon_info', $this->details->getPropertiesToInsert() ); } } catch (Exception $e) { Logger::error($e->getMessage()); $this->reconnect(); } } protected function eventuallySetStopped() { try { if (! $this->db) { return; } $this->db->update( 'director_daemon_info', ['ts_stopped' => DaemonUtil::timestampWithMilliseconds()], $this->db->quoteInto('instance_uuid_hex = ?', $this->details->getInstanceUuid()) ); } catch (Exception $e) { Logger::error('Failed to update daemon info (setting ts_stopped): ' . $e->getMessage()); } } } icingaweb2-module-director-1.11.8/library/Director/Daemon/DaemonProcessDetails.php000066400000000000000000000067401516513262500301300ustar00rootroot00000000000000instanceUuid = $instanceUuid; $this->initialize(); } public function getInstanceUuid() { return $this->instanceUuid; } public function getPropertiesToInsert() { return $this->getPropertiesToUpdate() + (array) $this->info; } public function getPropertiesToUpdate() { return [ 'ts_last_update' => DaemonUtil::timestampWithMilliseconds(), 'ts_stopped' => null, 'process_info' => \json_encode($this->collectProcessInfo()), ]; } public function set($property, $value) { if (\property_exists($this->info, $property)) { $this->info->$property = $value; } else { throw new \InvalidArgumentException("Trying to set invalid daemon info property: $property"); } } public function registerProcessList(ProcessList $list) { $refresh = function (Process $process) { $this->refreshProcessInfo(); }; $list->on('start', $refresh)->on('exit', $refresh); $this->processLists[] = $list; return $this; } protected function refreshProcessInfo() { $this->set('process_info', \json_encode($this->collectProcessInfo())); } protected function collectProcessInfo() { $info = (object) [$this->myPid => (object) [ 'command' => implode(' ', $this->myArgs), 'running' => true, 'memory' => Memory::getUsageForPid($this->myPid) ]]; foreach ($this->processLists as $processList) { foreach ($processList->getOverview() as $pid => $details) { $info->$pid = $details; } } return $info; } protected function initialize() { global $argv; CliProcess::getInitialCwd(); $this->myArgs = $argv; $this->myPid = \posix_getpid(); if (isset($_SERVER['_'])) { $self = $_SERVER['_']; } else { // Process does a better job, but want the relative path (if such) $self = $_SERVER['PHP_SELF']; } $this->info = (object) [ 'instance_uuid_hex' => $this->instanceUuid, 'running_with_systemd' => 'n', 'ts_started' => (int) ((float) $_SERVER['REQUEST_TIME_FLOAT'] * 1000), 'ts_stopped' => null, 'pid' => \posix_getpid(), 'fqdn' => Platform::getFqdn(), 'username' => Platform::getPhpUser(), 'schema_version' => null, 'php_version' => Platform::getPhpVersion(), 'binary_path' => $self, 'binary_realpath' => CliProcess::getBinaryPath(), 'php_integer_size' => PHP_INT_SIZE, 'php_binary_path' => PHP_BINARY, 'php_binary_realpath' => \realpath(PHP_BINARY), // TODO: useless? 'process_info' => null, ]; } } icingaweb2-module-director-1.11.8/library/Director/Daemon/DaemonProcessState.php000066400000000000000000000036151516513262500276210ustar00rootroot00000000000000processTitle = $processTitle; $this->refreshMessage(); } /** * @param NotifySystemD|false $systemd * @return $this */ public function setSystemd($systemd) { if ($systemd) { $this->systemd = $systemd; } else { $this->systemd = null; } return $this; } public function setState($message) { $this->state = $message; $this->refreshMessage(); return $this; } public function setComponentState($name, $stateMessage) { if ($stateMessage === null) { unset($this->components[$name]); } else { $this->components[$name] = $stateMessage; } $this->refreshMessage(); } protected function refreshMessage() { $messageParts = []; if ($this->state !== null && \strlen($this->state)) { $messageParts[] = $this->state; } foreach ($this->components as $component => $message) { $messageParts[] = "$component: $message"; } $message = \implode(', ', $messageParts); if ($message !== $this->currentMessage) { $this->currentMessage = $message; if (\strlen($message) === 0) { Process::setTitle($this->processTitle); } else { Process::setTitle($this->processTitle . ": $message"); } if ($this->systemd) { $this->systemd->setStatus($message); } } } } icingaweb2-module-director-1.11.8/library/Director/Daemon/DaemonUtil.php000066400000000000000000000004401516513262500261100ustar00rootroot00000000000000addPeriodicTimer(5, function () { if ($db = $this->connection) { try { if (DirectorDeploymentLog::hasUncollected($db)) { $db->getDeploymentEndpoint()->api()->collectLogFiles($db); } } catch (Exception $e) { // Ignore eventual issues while talking to Icinga } } }); } /** * @param Db $connection * @return \React\Promise\ExtendedPromiseInterface */ public function initDb(Db $connection) { $this->connection = $connection; return resolve(); } /** * @return \React\Promise\ExtendedPromiseInterface */ public function stopDb() { $this->connection = null; return resolve(); } } icingaweb2-module-director-1.11.8/library/Director/Daemon/JobRunner.php000066400000000000000000000141071516513262500257600ustar00rootroot00000000000000loop = $loop; $this->running = new ProcessList($loop); } public function forwardLog(LogProxy $logProxy) { $this->logProxy = $logProxy; return $this; } /** * @param Db $db * @return \React\Promise\ExtendedPromiseInterface */ public function initDb(Db $db) { $this->db = $db; $check = function () { try { $this->checkForPendingJobs(); $this->runNextPendingJob(); } catch (\Exception $e) { Logger::error($e->getMessage()); } }; if ($this->timer === null) { $this->loop->futureTick($check); } if ($this->timer !== null) { Logger::info('Cancelling former timer'); $this->loop->cancelTimer($this->timer); } $this->timer = $this->loop->addPeriodicTimer($this->checkInterval, $check); return resolve(); } /** * @return \React\Promise\ExtendedPromiseInterface */ public function stopDb() { $this->scheduledIds = []; if ($this->timer !== null) { $this->loop->cancelTimer($this->timer); $this->timer = null; } $allFinished = $this->running->killOrTerminate(); foreach ($this->runningIds as $id => $promise) { $promise->cancel(); } $this->runningIds = []; return $allFinished; } protected function hasBeenDisabled() { $db = $this->db->getDbAdapter(); return $db->fetchOne( $db->select() ->from('director_setting', 'setting_value') ->where('setting_name = ?', 'disable_all_jobs') ) === 'y'; } protected function checkForPendingJobs() { if ($this->hasBeenDisabled()) { $this->scheduledIds = []; // TODO: disable jobs currently going on? return; } if (empty($this->scheduledIds)) { $this->loadNextIds(); } } protected function runNextPendingJob() { if ($this->timer === null) { // Reset happened. Stopping? return; } if (! empty($this->runningIds)) { return; } while (! empty($this->scheduledIds)) { if ($this->runNextJob()) { break; } } } protected function loadNextIds() { $db = $this->db->getDbAdapter(); foreach ( $db->fetchCol( $db->select()->from('director_job', 'id')->where('disabled = ?', 'n') ) as $id ) { $this->scheduledIds[] = (int) $id; }; } /** * @return bool */ protected function runNextJob() { $id = \array_shift($this->scheduledIds); try { $job = DirectorJob::loadWithAutoIncId((int) $id, $this->db); if ($job->shouldRun()) { $this->runJob($job); return true; } } catch (\Exception $e) { Logger::error('Trying to schedule Job failed: ' . $e->getMessage()); } return false; } /** * @param DirectorJob $job */ protected function runJob(DirectorJob $job) { $id = $job->get('id'); $jobName = $job->get('job_name'); Logger::debug("Job ($jobName) starting"); $arguments = [ 'director', 'job', 'run', '--id', $job->get('id'), '--debug', '--rpc' ]; $cli = new IcingaCliRpc(); $cli->setArguments($arguments); $cli->on('start', function (Process $process) { $this->onProcessStarted($process); }); // Happens on protocol (Netstring) errors or similar: $cli->on('error', function (\Exception $e) { Logger::error('UNEXPECTED: ' . rtrim($e->getMessage())); }); if ($this->logProxy) { $logger = clone($this->logProxy); $logger->setPrefix("Job ($jobName): "); $cli->rpc()->setHandler($logger, 'logger'); } unset($this->scheduledIds[$id]); $this->runningIds[$id] = $cli->run($this->loop)->then(function () use ($id, $jobName) { Logger::debug("Job ($jobName) finished"); })->otherwise(function (\Exception $e) use ($id, $jobName) { Logger::error("Job ($jobName) failed: " . $e->getMessage()); })->otherwise(function (FinishedProcessState $state) use ($jobName) { Logger::error("Job ($jobName) failed: " . $state->getReason()); })->always(function () use ($id) { unset($this->runningIds[$id]); $this->loop->futureTick(function () { $this->runNextPendingJob(); }); }); } /** * @return ProcessList */ public function getProcessList() { return $this->running; } protected function onProcessStarted(Process $process) { $this->running->attach($process); } public function __destruct() { $this->stopDb(); $this->logProxy = null; $this->loop = null; } } icingaweb2-module-director-1.11.8/library/Director/Daemon/JsonRpcLogWriter.php000066400000000000000000000016541516513262500272740ustar00rootroot00000000000000 'debug', Logger::INFO => 'info', Logger::WARNING => 'warning', Logger::ERROR => 'error', ]; public function __construct(Connection $connection) { parent::__construct(new ConfigObject([])); $this->connection = $connection; } public function log($severity, $message) { $message = \iconv('UTF-8', 'UTF-8//IGNORE', $message); $this->connection->sendNotification( Notification::create('logger.log', [ static::$severityMap[$severity], $message ]) ); } } icingaweb2-module-director-1.11.8/library/Director/Daemon/LogProxy.php000066400000000000000000000031761516513262500256430ustar00rootroot00000000000000instanceUuid = $instanceUuid; } public function setPrefix($prefix) { $this->prefix = $prefix; return $this; } /** * @param Db $connection * @return \React\Promise\ExtendedPromiseInterface */ public function initDb(Db $connection) { $this->connection = $connection; $this->db = $connection->getDbAdapter(); return resolve(); } /** * @return \React\Promise\ExtendedPromiseInterface */ public function stopDb() { $this->connection = null; $this->db = null; return resolve(); } public function log($severity, $message) { Logger::$severity($this->prefix . $message); /* // Not yet try { if ($this->db) { $this->db->insert('director_daemonlog', [ // environment/installation/db? 'instance_uuid' => $this->instanceUuid, 'ts_create' => DaemonUtil::timestampWithMilliseconds(), 'level' => $severity, 'message' => $message, ]); } } catch (Exception $e) { Logger::error($e->getMessage()); } */ } } icingaweb2-module-director-1.11.8/library/Director/Daemon/Logger.php000066400000000000000000000011441516513262500252700ustar00rootroot00000000000000setLevel($level); } $instance->writer = $writer; } catch (ConfigurationError $e) { self::$instance->error($e->getMessage()); } } } icingaweb2-module-director-1.11.8/library/Director/Daemon/ProcessList.php000066400000000000000000000066151516513262500263330ustar00rootroot00000000000000loop = $loop; $this->processes = new \SplObjectStorage(); foreach ($processes as $process) { $this->attach($process); } } public function attach(Process $process) { $this->processes->attach($process); $this->emit('start', [$process]); $process->on('exit', function () use ($process) { $this->detach($process); $this->emit('exit', [$process]); }); return $this; } public function detach(Process $process) { $this->processes->detach($process); return $this; } /** * @param int $timeout * @return \React\Promise\ExtendedPromiseInterface */ public function killOrTerminate($timeout = 5) { if ($this->processes->count() === 0) { return resolve(); } $deferred = new Deferred(); $killTimer = $this->loop->addTimer($timeout, function () use ($deferred) { /** @var Process $process */ foreach ($this->processes as $process) { $pid = $process->getPid(); Logger::error("Process $pid is still running, sending SIGKILL"); $process->terminate(SIGKILL); } // Let's a little bit of delay after KILLing $this->loop->addTimer(0.1, function () use ($deferred) { $deferred->resolve(); }); }); $timer = $this->loop->addPeriodicTimer($timeout / 20, function () use ( $deferred, &$timer, $killTimer ) { $stopped = []; /** @var Process $process */ foreach ($this->processes as $process) { if (! $process->isRunning()) { $stopped[] = $process; } } foreach ($stopped as $process) { $this->processes->detach($process); } if ($this->processes->count() === 0) { $this->loop->cancelTimer($timer); $this->loop->cancelTimer($killTimer); $deferred->resolve(); } }); /** @var Process $process */ foreach ($this->processes as $process) { $process->terminate(SIGTERM); } return $deferred->promise(); } public function getOverview() { $info = []; /** @var Process $process */ foreach ($this->processes as $process) { $pid = $process->getPid(); $info[$pid] = (object) [ 'command' => preg_replace('/^exec /', '', $process->getCommand()), 'running' => $process->isRunning(), 'memory' => Memory::getUsageForPid($pid) ]; } return $info; } } icingaweb2-module-director-1.11.8/library/Director/Daemon/RunningDaemonInfo.php000066400000000000000000000062211516513262500274320ustar00rootroot00000000000000setInfo($info); } public function setInfo($info) { if (empty($info)) { $this->info = $this->createEmptyInfo(); } else { $this->info = $info; } return $this; } public function isRunning() { return $this->getPid() !== null && ! $this->isOutdated(); } public function getPid() { return (int) $this->info->pid; } public function getUsername() { return $this->info->username; } public function getFqdn() { return $this->info->fqdn; } public function getLastUpdate() { return $this->info->ts_last_update; } public function getLastModification() { return $this->info->ts_last_modification; } public function getPhpVersion() { return $this->info->php_version; } public function hasBeenStopped() { return $this->getTimestampStopped() !== null; } public function getTimestampStarted() { return $this->info->ts_started; } public function getTimestampStopped() { return $this->info->ts_stopped; } public function isOutdated($seconds = 5) { return ( DaemonUtil::timestampWithMilliseconds() - $this->info->ts_last_update ) > $seconds * 1000; } public function isRunningWithSystemd() { return $this->info->running_with_systemd === 'y'; } public function getBinaryPath() { return $this->info->binary_path; } public function getBinaryRealpath() { return $this->info->binary_realpath; } public function binaryRealpathDiffers() { return $this->getBinaryPath() !== $this->getBinaryRealpath(); } public function getPhpBinaryPath() { return $this->info->php_binary_path; } public function getPhpBinaryRealpath() { return $this->info->php_binary_realpath; } public function phpBinaryRealpathDiffers() { return $this->getPhpBinaryPath() !== $this->getPhpBinaryRealpath(); } public function getPhpIntegerSize() { return (int) $this->info->php_integer_size; } public function has64bitIntegers() { return $this->getPhpIntegerSize() === 8; } /* // TODO: not yet public function isMaster() { return $this->info->is_master === 'y'; } public function isStandby() { return ! $this->isMaster(); } */ protected function createEmptyInfo() { return (object) [ 'pid' => null, 'fqdn' => null, 'username' => null, 'php_version' => null, // 'is_master' => null, // Only if not running. Does this make any sense in 'empty info'? 'ts_last_update' => null, 'ts_last_modification' => null ]; } } icingaweb2-module-director-1.11.8/library/Director/Daemon/SystemdLogWriter.php000066400000000000000000000011001516513262500273300ustar00rootroot00000000000000 7, Logger::INFO => 6, Logger::WARNING => 4, Logger::ERROR => 3, ]; public function __construct() { parent::__construct(new ConfigObject([])); } public function log($severity, $message) { $severity = self::$severityMap[$severity]; echo "<$severity>$message\n"; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/000077500000000000000000000000001516513262500240245ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Dashboard/AlertsDashboard.php000066400000000000000000000006001516513262500275730ustar00rootroot00000000000000translate('Get alerts when something goes wrong'); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/AutomationDashboard.php000066400000000000000000000004511516513262500304650ustar00rootroot00000000000000translate('Automate all tasks'); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/BranchesDashboard.php000066400000000000000000000031221516513262500300700ustar00rootroot00000000000000getDb())); if ($branch->isBranch()) { $this->prepend(Hint::info(Html::sprintf( $this->translate('You\'re currently working in a Configuration Branch: %s'), Branch::requireHook()->linkToBranch($branch, $this->getAuth(), $branch->getName()) ))); } else { if (($implementation = Branch::optionalHook()) && $implementation instanceof PreferredBranchSupport) { if ($implementation->hasPreferredBranch(Auth::getInstance())) { $this->prepend(Hint::warning( $this->translate('You\'re currently working in the main Configuration Branch') )); } } } return $this->translate('Prepare your configuration in a safe Environment'); } public function loadDashlets() { /** @var BranchSupportHook $hook */ if ($hook = Hook::first('director/BranchSupport')) { $this->dashlets = $hook->loadDashlets($this->getDb()); } else { $this->dashlets = []; } } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/CommandsDashboard.php000066400000000000000000000015661516513262500301160ustar00rootroot00000000000000translate('Manage your Icinga Commands'); } public function getDescription() { return $this->translate( 'Define Check-, Notification- or Event-Commands. Command definitions' . ' are the glue between your Host- and Service-Checks and the Check' . ' plugins on your Monitoring (or monitored) systems' ); } public function getTabs() { return $this->createTabsForDashboards( ['hosts', 'services', 'commands'] ); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashboard.php000066400000000000000000000165411516513262500264330ustar00rootroot00000000000000db = $db; $dashboard->name = $name; return $dashboard; } public static function exists($name) { return class_exists(__NAMESPACE__ . '\\' . ucfirst($name) . 'Dashboard'); } /** * @param $description * @return $this */ protected function addDescription($description) { if ($description instanceof ValidHtml) { $this->add(Html::tag('p', $description)); } elseif ($description !== null) { $this->add(Html::tag( 'p', null, HtmlString::create(nl2br(Html::escape($description))) )); } return $this; } public function render() { $this ->setSeparator("\n") ->add(Html::tag('h1', null, $this->getTitle())) ->addDescription($this->getDescription()) ->add($this->renderDashlets()); return parent::render(); } public function renderDashlets() { $ul = Html::tag('ul', [ 'class' => 'main-actions', 'data-base-target' => '_next' ]); foreach ($this->dashlets() as $dashlet) { if ($dashlet->shouldBeShown()) { $ul->add($dashlet); } } return $ul; } public function getName() { return $this->name; } abstract public function getTitle(); public function getDescription() { return null; } public function getTabs() { $lName = $this->getName(); $tabs = new Tabs(); $tabs->add($lName, new Tab([ 'label' => $this->translate(ucfirst($this->getName())), 'url' => 'director/dashboard', 'urlParams' => ['name' => $lName] ])); return $tabs; } protected function createTabsForDashboards($names) { $tabs = new Tabs(); foreach ($names as $name) { $dashboard = Dashboard::loadByName($name, $this->getDb()); if ($dashboard->isAvailable()) { $tabs->add($name, $this->createTabForDashboard($dashboard)); } } return $tabs; } protected function createTabForDashboard(Dashboard $dashboard) { $name = $dashboard->getName(); return new Tab([ 'label' => $this->translate(ucfirst($name)), 'url' => 'director/dashboard', 'urlParams' => ['name' => $name] ]); } #[\ReturnTypeWillChange] public function count() { return count($this->dashlets()); } public function isAvailable() { return $this->count() > 0; } public function getDb() { return $this->db; } public function dashlets() { if ($this->dashlets === null) { $this->loadDashlets(); $this->fetchDashletSummaries(); } return $this->dashlets; } public function loadDashlets() { $names = $this->getDashletNames(); if (empty($names)) { $this->dashlets = array(); } else { $this->dashlets = Dashlet::loadByNames( $this->dashletNames, $this->getDb() ); } } public function getDashletNames() { return $this->dashletNames; } protected function fetchDashletSummaries() { $types = array(); foreach ($this->dashlets as $dashlet) { foreach ($dashlet->listRequiredStats() as $objectType) { $types[$objectType] = $objectType; } } if (empty($types)) { return; } try { $stats = $this->getObjectSummary($types); } catch (Exception $e) { $stats = array(); } $failing = array(); foreach ($this->dashlets as $key => $dashlet) { foreach ($dashlet->listRequiredStats() as $objectType) { if (array_key_exists($objectType, $stats)) { $dashlet->addStats($objectType, $stats[$objectType]); } else { $failing[] = $key; } } } foreach ($failing as $key) { unset($this->dashlets[$key]); } } public function getObjectSummary($types) { $queries = array(); foreach ($types as $type) { $queries[] = $this->makeSummaryQuery($type); } $query = $this->db->select()->union($queries, ZfSelect::SQL_UNION_ALL); $result = array(); foreach ($this->db->fetchAll($query) as $row) { $result[$row->icinga_type] = $row; } return $result; } protected function makeSummaryQuery($type) { $columns = array( 'icinga_type' => "('" . $type . "')", 'cnt_object' => $this->getCntSql('object'), 'cnt_template' => $this->getCntSql('template'), 'cnt_external' => $this->getCntSql('external_object'), 'cnt_apply' => $this->getCntSql('apply'), 'cnt_total' => 'COUNT(*)', ); if ($this->db->isPgsql()) { $dummy = IcingaObject::createByType($type); if (! $dummy->supportsApplyRules()) { $columns['cnt_apply'] = '(0)'; } } $query = $this->db->getDbAdapter()->select()->from( array('o' => 'icinga_' . $type), $columns ); return $this->applyRestrictions($type, $query); } protected function applyRestrictions($type, $query) { switch ($type) { case 'host': case 'hostgroup': $r = new HostgroupRestriction($this->getDb(), $this->getAuth()); $r->applyToQuery($query); break; } return $query; } protected function applyHostgroupRestrictions($query) { $restrictions = new HostgroupRestriction($this->getDb(), $this->getAuth()); $restrictions->applyToHostGroupsQuery($query); } protected function getAuth() { return Auth::getInstance(); } protected function getCntSql($objectType) { return sprintf( "COALESCE(SUM(CASE WHEN o.object_type = '%s' THEN 1 ELSE 0 END), 0)", $objectType ); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/000077500000000000000000000000001516513262500254105ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ActivityLogDashlet.php000066400000000000000000000012621516513262500316650ustar00rootroot00000000000000translate('Activity Log'); } public function getSummary() { return $this->translate( 'Wondering about what changed why? Track your changes!' ); } public function listCssClasses() { return 'state-ok'; } public function getUrl() { return 'director/config/activities'; } public function listRequiredPermissions() { return [Permission::AUDIT]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ApiUserObjectDashlet.php000066400000000000000000000007721516513262500321330ustar00rootroot00000000000000translate('Icinga Api users'); } public function getUrl() { return 'director/apiusers'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/BasketDashlet.php000066400000000000000000000011441516513262500306370ustar00rootroot00000000000000translate('Configuration Baskets'); } public function getSummary() { return $this->translate( 'Preserve specific configuration objects in a specific state' ); } public function getUrl() { return 'director/baskets'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php000066400000000000000000000012471516513262500321310ustar00rootroot00000000000000translate( 'Manage definitions for your Commands that should be executed as' . ' Check Plugins, Notifications or based on Events' ); } public function getTitle() { return $this->translate('Commands'); } public function listRequiredPermissions() { return [Permission::ADMIN]; } public function getUrl() { return 'director/commands'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ChoicesDashlet.php000066400000000000000000000016021516513262500310020ustar00rootroot00000000000000translate('Choices'); } public function getSummary() { return $this->translate( 'Combine multiple templates into meaningful Choices, making life' . ' easier for your users' ); } protected function getType() { return strtolower(substr( substr(get_called_class(), strlen(__NAMESPACE__) + 1), 0, - strlen('ChoicesDashlet') )); } public function getUrl() { return 'director/templatechoices/' . $this->getType(); } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/CommandObjectDashlet.php000066400000000000000000000007721516513262500321410ustar00rootroot00000000000000translate('Commands'); } public function getUrl() { return 'director/dashboard?name=commands'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php000066400000000000000000000010441516513262500326620ustar00rootroot00000000000000translate( 'External Notification Commands have been defined in your local Icinga 2' . ' Configuration.' ); } public function getTitle() { return $this->translate('Command Templates'); } public function getUrl() { return 'director/commands/templates'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/CustomvarDashlet.php000066400000000000000000000011451516513262500314120ustar00rootroot00000000000000translate('CustomVar Overview'); } public function getSummary() { return $this->translate( 'Get an overview of used CustomVars and their variants' ); } public function getUrl() { return 'director/data/vars'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/Dashlet.php000066400000000000000000000134521516513262500275120ustar00rootroot00000000000000db = $db; } /** * @return string[] */ public function listRequiredStats() { return $this->requiredStats; } public function addStats($type, $stats) { $this->stats[$type] = $stats; } /** * @param $name * @param Db $db * @return Dashlet */ public static function loadByName($name, Db $db) { /** @var Dashlet */ $class = __NAMESPACE__ . '\\' . $name . 'Dashlet'; return new $class($db); } public static function loadByNames(array $names, Db $db) { $dashlets = []; foreach ($names as $name) { $dashlet = static::loadByName($name, $db); if ($dashlet->isAllowed()) { $dashlets[] = $dashlet; } } return $dashlets; } public function listCssClasses() { return []; } public function getIconName() { return $this->icon; } abstract public function getTitle(); abstract public function getUrl(); protected function assemble() { $this->add(Link::create([ $this->getTitle(), Icon::create($this->getIconName()), Html::tag('p', null, $this->getSummary()) ], $this->getUrl(), null, [ 'class' => $this->listCssClasses() ])); } public function listRequiredPermissions() { return array($this->getUrl()); } public function isAllowed() { $acl = Acl::instance(); foreach ($this->listRequiredPermissions() as $perm) { if (! $acl->hasPermission($perm)) { return false; } } return true; } public function shouldBeShown() { return true; } public function getSummary() { $result = ''; if (! empty($this->requiredStats)) { reset($this->requiredStats); $result .= $this->statSummary(current($this->requiredStats)); } return $result; } public function getStats($type, $name = null) { if ($name === null) { return $this->stats[$type]; } else { return $this->stats[$type]->{'cnt_' . $name}; } } protected function getTemplateSummaryText($type) { $cnt = (int) $this->stats[$type]->cnt_template; if ($cnt === 0) { return $this->translate('No template has been defined yet'); } if ($cnt === 1) { return $this->translate('One template has been defined'); } return sprintf( $this->translate('%d templates have been defined'), $cnt ); } protected function getApplySummaryText($type) { $cnt = (int) $this->stats[$type]->cnt_apply; if ($cnt === 0) { return $this->translate('No apply rule has been defined yet'); } if ($cnt === 1) { return $this->translate('One apply rule has been defined'); } return sprintf( $this->translate('%d apply rules have been defined'), $cnt ); } protected function statSummary($type) { $stat = $this->stats[$type]; if ((int) $stat->cnt_total === 0) { return $this->translate('No object has been defined yet'); } if ((int) $stat->cnt_total === 1) { if ($stat->cnt_template > 0) { $msg = $this->translate('One template has been defined'); } elseif ($stat->cnt_external > 0) { $msg = $this->translate( 'One external object has been defined, it will not be deployed' ); } else { $msg = $this->translate('One object has been defined'); } } else { $msg = sprintf( $this->translate('%d objects have been defined'), $stat->cnt_total ); } $extra = array(); if ($stat->cnt_total !== $stat->cnt_object) { if ($stat->cnt_template > 0) { $extra[] = sprintf( $this->translate('%d of them are templates'), $stat->cnt_template ); } if ($stat->cnt_external > 0) { $extra[] = sprintf( $this->translate( '%d have been externally defined and will not be deployed' ), $stat->cnt_external ); } } if (array_key_exists($type . 'group', $this->stats)) { $groupstat = $this->stats[$type . 'group']; if ((int) $groupstat->cnt_total === 0) { $extra[] = $this->translate('no related group exists'); } elseif ((int) $groupstat->cnt_total === 1) { $extra[] = $this->translate('one related group exists'); } else { $extra[] = sprintf( $this->translate('%s related group objects have been created'), $groupstat->cnt_total ); } } if (empty($extra)) { return $msg; } return $msg . ', ' . implode(', ', $extra); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/DatafieldCategoryDashlet.php000066400000000000000000000011631516513262500330020ustar00rootroot00000000000000translate('Data Field Categories'); } public function getSummary() { return $this->translate( 'Categories bring structure to your Data Fields' ); } public function getUrl() { return 'director/data/fieldcategories'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/DatafieldDashlet.php000066400000000000000000000011461516513262500313050ustar00rootroot00000000000000translate('Define Data Fields'); } public function getSummary() { return $this->translate( 'Data fields make sure that configuration fits your rules' ); } public function getUrl() { return 'director/data/fields'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/DatalistDashlet.php000066400000000000000000000011511516513262500311710ustar00rootroot00000000000000translate('Provide Data Lists'); } public function getSummary() { return $this->translate( 'Provide data lists to make life easier for your users' ); } public function getUrl() { return 'director/data/lists'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php000066400000000000000000000010251516513262500326310ustar00rootroot00000000000000translate('Dependencies'); } public function getSummary() { return $this->translate('Object dependency relationships.') . ' ' . parent::getSummary(); } public function getUrl() { return 'director/dependencies/applyrules'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/DeploymentDashlet.php000066400000000000000000000056331516513262500315550ustar00rootroot00000000000000translate('Config Deployment'); } public function hasUndeployedActivities() { return $this->undeployedActivities() > 0; } public function undeployedActivities() { if ($this->undeployedActivities === null) { try { $this->undeployedActivities = $this->db ->countActivitiesSinceLastDeployedConfig(); } catch (Exception $e) { $this->undeployedActivities = 0; } } return $this->undeployedActivities; } public function lastDeploymentFailed() { return ! $this->lastDeployment()->succeeded(); } public function lastDeploymentPending() { return $this->lastDeployment()->isPending(); } public function listCssClasses() { try { if ($this->lastDeploymentFailed()) { return array('state-critical'); } elseif ($this->lastDeploymentPending()) { return array('state-pending'); } elseif ($this->hasUndeployedActivities()) { return array('state-warning'); } else { return array('state-ok'); } } catch (Exception $e) { return null; } } protected function lastDeployment() { if ($this->lastDeployment === null) { $this->lastDeployment = DirectorDeploymentLog::loadLatest($this->db); } return $this->lastDeployment; } public function getSummary() { $msgs = array(); $cnt = $this->undeployedActivities(); try { if ($this->lastDeploymentFailed()) { $msgs[] = $this->translate('The last deployment did not succeed'); } elseif ($this->lastDeploymentPending()) { $msgs[] = $this->translate('The last deployment is currently pending'); } } catch (Exception $e) { } if ($cnt === 0) { $msgs[] = $this->translate('There are no pending changes'); } else { $msgs[] = sprintf( $this->translate( 'A total of %d config changes happened since your last' . ' deployed config has been rendered' ), $cnt ); } return implode('. ', $msgs) . '.'; } public function getUrl() { return 'director/config/deployments'; } public function listRequiredPermissions() { return [Permission::DEPLOY]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php000066400000000000000000000025101516513262500323330ustar00rootroot00000000000000translate('Endpoints'); } public function getUrl() { return 'director/endpoints'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } protected function hasDeploymentEndpoint() { if ($this->hasDeploymentEndpoint === null) { try { $this->hasDeploymentEndpoint = $this->db->hasDeploymentEndpoint(); } catch (Exception $e) { return false; } } return $this->hasDeploymentEndpoint; } public function listCssClasses() { if (! $this->hasDeploymentEndpoint()) { return 'state-critical'; } return null; } public function getSummary() { $msg = parent::getSummary(); if (! $this->hasDeploymentEndpoint()) { $msg .= '. ' . $this->translate( 'None could be used for deployments right now' ); } return $msg; } } ExternalCheckCommandsDashlet.php000066400000000000000000000010521516513262500335470ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlettranslate( 'External Commands have been defined in your local Icinga 2' . ' Configuration.' ); } public function getTitle() { return $this->translate('External Commands'); } public function getUrl() { return 'director/commands?type=external_object'; } } ExternalNotificationCommandsDashlet.php000066400000000000000000000007461516513262500351710ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlettranslate( 'External Notification Commands have been defined in your local Icinga 2' . ' Configuration.' ); } public function getTitle() { return $this->translate('External Notification Commands'); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/HostChoicesDashlet.php000066400000000000000000000001601516513262500316360ustar00rootroot00000000000000translate('Host Groups'); } public function getSummary() { return $this->translate( 'Define Host Groups to give your configuration more structure. They' . ' are useful for Dashboards, Notifications or Restrictions' ); } public function getUrl() { return 'director/hostgroups'; } public function listRequiredPermissions() { return [Permission::HOST_GROUPS]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/HostObjectDashlet.php000066400000000000000000000010001516513262500314610ustar00rootroot00000000000000translate('Host objects'); } public function listRequiredPermissions() { return [Permission::HOSTS]; } public function getUrl() { return 'director/dashboard?name=hosts'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php000066400000000000000000000012411516513262500322200ustar00rootroot00000000000000translate('Host Templates'); } public function getSummary() { return $this->translate( 'Manage your Host Templates. Use Fields to make it easy for' . ' your users to get them customized.' ); } public function getUrl() { return 'director/hosts/templates'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/HostsDashlet.php000066400000000000000000000012731516513262500305310ustar00rootroot00000000000000translate('Hosts'); } public function getSummary() { return $this->translate( 'This is where you add all your servers, containers, network or' . ' sensor devices - and much more. Every subject worth to be' . ' monitored' ); } public function getUrl() { return 'director/hosts'; } public function listRequiredPermissions() { return [Permission::HOSTS]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ImportSourceDashlet.php000066400000000000000000000026511516513262500320650ustar00rootroot00000000000000translate('Import data sources'); } public function listCssClasses() { try { return $this->fetchStateClass(); } catch (Exception $e) { return 'state-critical'; } } public function getSummary() { return $this->translate( 'Define and manage imports from various data sources' ); } protected function fetchStateClass() { $srcs = ImportSource::loadAll($this->db); if (count($srcs) > 0) { $state = 'state-ok'; } else { $state = null; } foreach ($srcs as $src) { if ($src->import_state !== 'in-sync') { if ($src->import_state === 'failing') { $state = 'state-critical'; break; } else { $state = 'state-warning'; } } } return $state; } public function getUrl() { return 'director/importsources'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/InfrastructureDashlet.php000066400000000000000000000012211516513262500324420ustar00rootroot00000000000000translate('Icinga Infrastructure'); } public function getSummary() { return $this->translate( 'Manage your Icinga 2 infrastructure: Masters, Zones, Satellites and more' ); } public function getUrl() { return 'director/dashboard?name=infrastructure'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/JobDashlet.php000066400000000000000000000026311516513262500301420ustar00rootroot00000000000000translate('Jobs'); } public function listCssClasses() { try { return $this->fetchStateClass(); } catch (Exception $e) { return 'state-critical'; } } public function getSummary() { return $this->translate( 'Schedule and automate Import, Syncronization, Config Deployment,' . ' Housekeeping and more' ); } protected function fetchStateClass() { /** @var DirectorJob[] $jobs */ $jobs = DirectorJob::loadAll($this->db); if (count($jobs) > 0) { $state = 'state-ok'; } else { $state = null; } foreach ($jobs as $job) { if ($job->isPending()) { $state = 'state-pending'; } elseif (! $job->lastAttemptSucceeded()) { $state = 'state-critical'; break; } } return $state; } public function getUrl() { return 'director/jobs'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/KickstartDashlet.php000066400000000000000000000012661516513262500313720ustar00rootroot00000000000000translate('Kickstart Wizard'); } public function getSummary() { return $this->translate( 'This synchronizes Icinga Director to your Icinga 2 infrastructure.' . ' A new run should be triggered on infrastructure changes' ); } public function getUrl() { return 'director/kickstart'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php000066400000000000000000000015501516513262500330630ustar00rootroot00000000000000translate('Notifications'); } public function getSummary() { return $this->translate( 'Apply notifications with specific properties according to given rules.' ) . ' ' . $this->getApplySummaryText('notification'); } public function shouldBeShown() { return $this->getStats('notification', 'template') > 0; } public function listRequiredPermissions() { return [Permission::NOTIFICATIONS]; } public function getUrl() { return 'director/notifications/applyrules'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php000066400000000000000000000007351516513262500335430ustar00rootroot00000000000000translate( 'Notification Commands allow you to trigger any action you want when' . ' a notification takes place' ); } public function getTitle() { return $this->translate('Notification Commands'); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php000066400000000000000000000013211516513262500335450ustar00rootroot00000000000000translate('Notification templates'); } public function getSummary() { return $this->translate('Provide templates for your notifications.') . ' ' . $this->getTemplateSummaryText('notification'); } public function listRequiredPermissions() { return [Permission::ADMIN]; } public function getUrl() { return 'director/notifications/templates'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/NotificationsDashlet.php000066400000000000000000000013501516513262500322360ustar00rootroot00000000000000translate('Notifications'); } public function getSummary() { return $this->translate( 'Schedule your notifications. Define who should be notified, when,' . ' and for which kind of problem' ); } public function listRequiredPermissions() { return [Permission::NOTIFICATIONS]; } public function getUrl() { return 'director/dashboard?name=notifications'; } } ScheduledDowntimeApplyDashlet.php000066400000000000000000000010541516513262500337640ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlettranslate('Scheduled Downtimes'); } public function listRequiredPermissions() { return [Permission::SCHEDULED_DOWNTIMES]; } public function getUrl() { return 'director/scheduled-downtimes/applyrules'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/SelfServiceDashlet.php000066400000000000000000000012441516513262500316410ustar00rootroot00000000000000translate('Self Service API'); } public function getSummary() { return $this->translate( 'Icinga Director offers a Self Service API, allowing new Icinga' . ' nodes to register themselves' ); } public function getUrl() { return 'director/settings/self-service'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php000066400000000000000000000013421516513262500330470ustar00rootroot00000000000000translate('Service Apply Rules'); } public function getSummary() { return $this->translate( 'Using Apply Rules a Service can be applied to multiple hosts at once,' . ' based on filters dealing with any combination of their properties' ); } public function getUrl() { return 'director/services/applyrules'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ServiceChoicesDashlet.php000066400000000000000000000001631516513262500323240ustar00rootroot00000000000000translate('Service Groups'); } public function getSummary() { return $this->translate( 'Defining Service Groups get more structure. Great for Dashboards.' . ' Notifications and Permissions might be based on groups.' ); } public function getUrl() { return 'director/servicegroups'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ServiceObjectDashlet.php000066400000000000000000000015351516513262500321610ustar00rootroot00000000000000translate('Monitored Services'); } public function getUrl() { return 'director/dashboard?name=services'; } public function listRequiredPermissions() { throw new RuntimeException('This method should not be accessed, isAllowed() has been implemented'); } public function isAllowed() { $acl = Acl::instance(); return $acl->hasPermission(Permission::SERVICES) || $acl->hasPermission(Permission::SERVICE_SETS); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php000066400000000000000000000013031516513262500316620ustar00rootroot00000000000000translate('Service Sets'); } public function getSummary() { return $this->translate( 'Grouping your Services into Sets allow you to quickly assign services' . ' often used together in a single operation all at once' ); } public function getUrl() { return 'director/services/sets'; } public function listRequiredPermissions() { return [Permission::SERVICE_SETS]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php000066400000000000000000000012551516513262500327100ustar00rootroot00000000000000translate('Service Templates'); } public function getSummary() { return $this->translate( 'Manage your Service Templates. Use Fields to make it easy for' . ' your users to get them customized.' ); } public function getUrl() { return 'director/services/templates'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/SettingsDashlet.php000066400000000000000000000011231516513262500312230ustar00rootroot00000000000000translate('Director Settings'); } public function getSummary() { return $this->translate( 'Tweak some global Director settings' ); } public function getUrl() { return 'director/config/settings'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/SingleServicesDashlet.php000066400000000000000000000012131516513262500323500ustar00rootroot00000000000000translate('Single Services'); } public function getSummary() { return $this->translate( 'Here you can find all single services directly attached to single' . ' hosts' ); } public function getUrl() { return 'director/services'; } public function listRequiredPermissions() { return [Permission::SERVICES]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/SyncDashlet.php000066400000000000000000000026271516513262500303510ustar00rootroot00000000000000translate('Synchronize'); } public function listCssClasses() { try { return $this->fetchStateClass(); } catch (Exception $e) { return 'state-critical'; } } public function getSummary() { return $this->translate( 'Define how imported data should be synchronized with Icinga' ); } protected function fetchStateClass() { $syncs = SyncRule::loadAll($this->db); if (count($syncs) > 0) { $state = 'state-ok'; } else { $state = null; } foreach ($syncs as $sync) { if ($sync->sync_state !== 'in-sync') { if ($sync->sync_state === 'failing') { $state = 'state-critical'; break; } else { $state = 'state-warning'; } } } return $state; } public function getUrl() { return 'director/syncrules'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/TimeperiodObjectDashlet.php000066400000000000000000000010671516513262500326620ustar00rootroot00000000000000translate('Timeperiods'); } public function getUrl() { return 'director/timeperiods'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php000066400000000000000000000013141516513262500332220ustar00rootroot00000000000000translate('Timeperiod Templates'); } public function getSummary() { return $this->translate('Provide templates for your TimePeriod objects.') . ' ' . $this->getTemplateSummaryText('timeperiod'); } public function listRequiredPermissions() { return [Permission::ADMIN]; } public function getUrl() { return 'director/timeperiods/templates'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/TimeperiodsDashlet.php000066400000000000000000000010031516513262500317040ustar00rootroot00000000000000translate('Timeperiods'); } public function getUrl() { return 'director/dashboard?name=timeperiods'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/UserGroupsDashlet.php000066400000000000000000000012151516513262500315430ustar00rootroot00000000000000translate('User Groups'); } public function getSummary() { return $this->translate( 'Defining Notifications for User Groups instead of single Users' . ' gives more flexibility' ); } public function getUrl() { return 'director/usergroups'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/UserObjectDashlet.php000066400000000000000000000005521516513262500314750ustar00rootroot00000000000000translate('Users / Contacts'); } public function getUrl() { return 'director/users'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/UserTemplateDashlet.php000066400000000000000000000012501516513262500320360ustar00rootroot00000000000000translate('User Templates'); } public function getSummary() { return $this->translate('Provide templates for your User objects.') . ' ' . $this->getTemplateSummaryText('user'); } public function listRequiredPermissions() { return [Permission::ADMIN]; } public function getUrl() { return 'director/users/templates'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/UsersDashlet.php000066400000000000000000000010001516513262500305160ustar00rootroot00000000000000translate('Users / Contacts'); } public function listRequiredPermissions() { return [Permission::USERS]; } public function getUrl() { return 'director/dashboard?name=users'; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/Dashlet/ZoneObjectDashlet.php000066400000000000000000000007361516513262500314760ustar00rootroot00000000000000translate('Zones'); } public function getUrl() { return 'director/zones'; } public function listRequiredPermissions() { return [Permission::ADMIN]; } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/DataDashboard.php000066400000000000000000000005101516513262500272120ustar00rootroot00000000000000translate('Do more with custom data'); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/DeploymentDashboard.php000066400000000000000000000005211516513262500304630ustar00rootroot00000000000000translate('Deploy configuration to your Icinga nodes'); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/DirectorDashboard.php000066400000000000000000000004711516513262500301220ustar00rootroot00000000000000translate('Icinga Director Configuration'); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/HostsDashboard.php000066400000000000000000000015321516513262500274460ustar00rootroot00000000000000translate('Manage your Icinga Hosts'); } public function getDescription() { return $this->translate( 'This is where you manage your Icinga 2 Host Checks. Host templates' . ' are your main building blocks. You can bundle them to "choices",' . ' allowing (or forcing) your users to choose among a given set of' . ' preconfigured templates.' ); } public function getTabs() { return $this->createTabsForDashboards( ['hosts', 'services', 'commands'] ); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/InfrastructureDashboard.php000066400000000000000000000035261516513262500313730ustar00rootroot00000000000000translate('Manage your Icinga Infrastructure'); } public function getDescription() { $documentation = new Documentation(Icinga::app(), Auth::getInstance()); $link = $documentation->getModuleLink( $this->translate('documentation'), 'director', '24-Working-with-agents', $this->translate('Working with Agents and Config Zones') ); return (new HtmlDocument())->add([ $this->translate( 'This is where you manage your Icinga 2 infrastructure. When adding' . ' a new Icinga Master or Satellite please re-run the Kickstart' . ' Helper once.' ), Hint::warning($this->translate( 'When you feel the desire to manually create Zone or Endpoint' . ' objects please rethink this twice. Doing so is mostly the wrong' . ' way, might lead to a dead end, requiring quite some effort to' . ' clean up the whole mess afterwards.' )), Html::sprintf( $this->translate('Want to connect to your Icinga Agents? Have a look at our %s!'), $link ) ]); } public function getTabs() { return new InfraTabs($this->getAuth()); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/NotificationsDashboard.php000066400000000000000000000031311516513262500311540ustar00rootroot00000000000000translate('Schedule your notifications'); } public function getDescription() { return $this->translate( 'Notifications are sent when a host or service reaches a non-ok hard' . ' state or recovers from such. One might also want to send them for' . ' special events like when a Downtime starts, a problem gets' . ' acknowledged and much more. You can send specific notifications' . ' only within specific time periods, you can delay them and of course' . ' re-notify at specific intervals.' . "\n\n" . ' Combine those possibilities in case you need to define escalation' . ' levels, like notifying operators first and your management later on' . ' in case the problem remains unhandled for a certain time.' . "\n\n" . ' You might send E-Mail or SMS, make phone calls or page on various' . ' channels. You could also delegate notifications to external service' . ' providers. The possibilities are endless, as you are allowed to' . ' define as many custom notification commands as you want' ); } public function getTabs() { return $this->createTabsForDashboards( ['notifications', 'users', 'timeperiods'] ); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/ObjectsDashboard.php000066400000000000000000000005161516513262500277400ustar00rootroot00000000000000translate('Define whatever you want to be monitored'); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/ServicesDashboard.php000066400000000000000000000021251516513262500301300ustar00rootroot00000000000000translate('Manage your Icinga Service Checks'); } public function getDescription() { return $this->translate( 'This is where you manage your Icinga 2 Service Checks. Service' . ' Templates are your base building blocks, Service Sets allow' . ' you to assign multiple Services at once. Apply Rules make it' . ' possible to assign Services based on Host properties. And' . ' the list of all single Service Objects gives you the possibility' . ' to still modify (or delete) many of them at once.' ); } public function getTabs() { return $this->createTabsForDashboards( ['hosts', 'services', 'commands'] ); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/TimeperiodsDashboard.php000066400000000000000000000015321516513262500306320ustar00rootroot00000000000000translate('Define custom Time Periods'); } public function getDescription() { return $this->translate( 'Want to define to execute specific checks only withing specific' . ' time periods? Get mobile notifications only out of office hours,' . ' but mail notifications all around the clock? Time Periods allow' . ' you to tackle those and similar requirements.' ); } public function getTabs() { return $this->createTabsForDashboards( ['notifications', 'users', 'timeperiods'] ); } } icingaweb2-module-director-1.11.8/library/Director/Dashboard/UsersDashboard.php000066400000000000000000000020171516513262500274460ustar00rootroot00000000000000translate('Schedule your notifications'); } public function getDescription() { return $this->translate( 'This is where you manage your Icinga 2 User (Contact) objects. Try' . ' to keep your User objects simply by movin complexity to your' . ' templates. Bundle your users in groups and build Notifications' . ' based on them. Running MS Active Directory or another central' . ' User inventory? Stay away from fiddling with manual config, try' . ' to automate all the things with Imports and related Sync Rules!' ); } public function getTabs() { return $this->createTabsForDashboards( ['notifications', 'users', 'timeperiods'] ); } } icingaweb2-module-director-1.11.8/library/Director/Data/000077500000000000000000000000001516513262500230065ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Data/AssignFilterHelper.php000066400000000000000000000105241516513262500272530ustar00rootroot00000000000000filter = $filter; } /** * @param object $object * * @return bool * @throws NotImplementedError */ public function matches($object) { return $this->matchesPart($this->filter, $object); } /** * @param Filter $filter * @param object $object * * @return bool */ public static function matchesFilter(Filter $filter, $object) { $helper = new static($filter); return $helper->matches($object); } /** * @param Filter $filter * @param object $object * * @return bool * @throws NotImplementedError */ protected function matchesPart(Filter $filter, $object) { if ($filter->isChain()) { return $this->matchesChain($filter, $object); } elseif ($filter->isExpression()) { /** @var FilterExpression $filter */ return $this->matchesExpression($filter, $object); } else { return $filter->matches($object); } } /** * @param Filter $filter * @param object $object * * @return bool * @throws NotImplementedError */ protected function matchesChain(Filter $filter, $object) { if ($filter instanceof FilterAnd) { foreach ($filter->filters() as $f) { if (! $this->matchesPart($f, $object)) { return false; } } return true; } elseif ($filter instanceof FilterOr) { foreach ($filter->filters() as $f) { if ($this->matchesPart($f, $object)) { return true; } } return false; } elseif ($filter instanceof FilterNot) { foreach ($filter->filters() as $f) { if ($this->matchesPart($f, $object)) { return false; } } return true; } else { $class = \get_class($filter); $parts = \preg_split('/\\\/', $class); throw new NotImplementedError( 'Matching for Filter of type "%s" is not implemented', \end($parts) ); } } /** * @param FilterExpression $filter * @param object $object * * @return bool */ protected function matchesExpression(FilterExpression $filter, $object) { $column = $filter->getColumn(); $sign = $filter->getSign(); $expression = $filter->getExpression(); if ($sign === '=') { if ($expression === true) { return property_exists($object, $column) && ! empty($object->{$column}); } elseif ($expression === false) { return ! property_exists($object, $column) || empty($object->{$column}); } elseif (is_string($expression) && strpos($expression, '*') !== false) { if (! property_exists($object, $column) || empty($object->{$column})) { return false; } $value = $object->{$column}; $parts = array(); foreach (preg_split('~\*~', $expression) as $part) { $parts[] = preg_quote($part, '/'); } // match() is case insensitive $pattern = '/^' . implode('.*', $parts) . '$/i'; if (is_array($value)) { foreach ($value as $candidate) { if (preg_match($pattern, $candidate)) { return true; } } return false; } return (bool) preg_match($pattern, $value); } } // fallback to default behavior return $filter->matches($object); } } icingaweb2-module-director-1.11.8/library/Director/Data/DataArrayHelper.php000066400000000000000000000023611516513262500265310ustar00rootroot00000000000000getDbType() === 'mysql'; } public function isPgsql() { return $this->getDbType() === 'pgsql'; } /** * @deprecated * @param ?string $binary * @return Zend_Db_Expr|Zend_Db_Expr[]|null */ public function quoteBinary($binary) { return DbUtil::quoteBinaryLegacy($binary, $this->getDbAdapter()); } public function binaryDbResult($value) { if (is_resource($value)) { return stream_get_contents($value); } return $value; } public function hasPgExtension($name) { $db = $this->db(); $query = $db->select()->from( array('e' => 'pg_extension'), array('cnt' => 'COUNT(*)') )->where('extname = ?', $name); return (int) $db->fetchOne($query) === 1; } } icingaweb2-module-director-1.11.8/library/Director/Data/Db/DbDataFormatter.php000066400000000000000000000016131516513262500270500ustar00rootroot00000000000000 id map for prefetched objects */ protected static $prefetchedNames = array(); protected static $prefetchStats = array(); /** @var ?DbObjectStore */ protected static $dbObjectStore; /** * Constructor is not accessible and should not be overridden */ protected function __construct() { if ( $this->table === null || $this->keyName === null || $this->defaultProperties === null ) { throw new LogicException("Someone extending this class didn't RTFM"); } $this->properties = $this->defaultProperties; $this->beforeInit(); } public function getTableName() { return $this->table; } /************************************************************************\ * When extending this class one might want to override any of the * * following hooks. Try to use them whenever possible, especially * * instead of overriding other essential methods like store(). * \************************************************************************/ /** * One can override this to allow for cross checks and more before storing * the object. Please note that the method is public and allows to check * object consistence at any time. * * @return boolean Whether this object is valid */ public function validate() { return true; } /** * This is going to be executed before any initialization method takes * * (load from DB, populate from Array...) takes place * * @return void */ protected function beforeInit() { } /** * Will be executed every time an object has successfully been loaded from * Database * * @return void */ protected function onLoadFromDb() { } /** * Will be executed before an Object is going to be stored. In case you * want to prevent the store() operation from taking place, please throw * an Exception. * * @return void */ protected function beforeStore() { } /** * Wird ausgeführt, nachdem ein Objekt erfolgreich gespeichert worden ist * * @return void */ protected function onStore() { } /** * Wird ausgeführt, nachdem ein Objekt erfolgreich der Datenbank hinzu- * gefügt worden ist * * @return void */ protected function onInsert() { } /** * Wird ausgeführt, nachdem bestehendes Objekt erfolgreich der Datenbank * geändert worden ist * * @return void */ protected function onUpdate() { } /** * Wird ausgeführt, bevor ein Objekt gelöscht wird. Die Operation wird * aber auf jeden Fall durchgeführt, außer man wirft eine Exception * * @return void */ protected function beforeDelete() { } /** * Wird ausgeführt, nachdem bestehendes Objekt erfolgreich aud der * Datenbank gelöscht worden ist * * @return void */ protected function onDelete() { } /** * Set database connection * * @param DbConnection $connection Database connection * * @return self */ public function setConnection(DbConnection $connection) { $this->connection = $connection; $this->db = $connection->getDbAdapter(); return $this; } public static function setDbObjectStore(DbObjectStore $store) { self::$dbObjectStore = $store; } /** * Getter * * @param string $property Property * * @return mixed */ public function get($property) { $func = 'get' . ucfirst($property); if (substr($func, -2) === '[]') { $func = substr($func, 0, -2); } // TODO: id check avoids collision with getId. Rethink this. if ($property !== 'id' && method_exists($this, $func)) { return $this->$func(); } $this->assertPropertyExists($property); return $this->properties[$property]; } public function getProperty($key) { $this->assertPropertyExists($key); return $this->properties[$key]; } protected function assertPropertyExists($key) { if (! array_key_exists($key, $this->properties)) { throw new InvalidArgumentException(sprintf( 'Trying to get invalid property "%s"', $key )); } return $this; } public function hasProperty($key) { if (array_key_exists($key, $this->properties)) { return true; } elseif ($key === 'id') { // There is getId, would give false positive return false; } return $this->hasGetterForProperty($key); } protected function hasGetterForProperty($key) { $func = 'get' . ucfirst($key); if (\substr($func, -2) === '[]') { $func = substr($func, 0, -2); } return \method_exists($this, $func); } protected function hasSetterForProperty($key) { $func = 'set' . ucfirst($key); if (\substr($func, -2) === '[]') { $func = substr($func, 0, -2); } return \method_exists($this, $func); } /** * Generic setter * * @param string $key * @param mixed $value * * @return self */ public function set($key, $value) { $key = (string) $key; if ($value === '') { $value = null; } if (is_resource($value)) { $value = stream_get_contents($value); } $func = 'validate' . ucfirst($key); if (method_exists($this, $func) && $this->$func($value) !== true) { throw new InvalidArgumentException(sprintf( 'Got invalid value "%s" for "%s"', $value, $key )); } $func = 'munge' . ucfirst($key); if (method_exists($this, $func)) { $value = $this->$func($value); } $func = 'set' . ucfirst($key); if (substr($func, -2) === '[]') { $func = substr($func, 0, -2); } if (method_exists($this, $func)) { return $this->$func($value); } if ($this->getUuidColumn() === $key) { if (strlen($value) > 16) { $value = Uuid::fromString($value)->getBytes(); } } if ($this->propertyIsBoolean($key)) { $value = DbDataFormatter::normalizeBoolean($value); } if (! $this->hasProperty($key)) { throw new InvalidArgumentException(sprintf( 'Trying to set invalid key "%s"', $key )); } if ( (is_numeric($value) || is_string($value)) && (string) $value === (string) $this->get($key) ) { return $this; } if ($key === $this->getAutoincKeyName() && $this->hasBeenLoadedFromDb()) { throw new InvalidArgumentException('Changing autoincremental key is not allowed'); } return $this->reallySet($key, $value); } protected function reallySet($key, $value) { if ($value === $this->properties[$key]) { return $this; } if ($key === 'id' || substr($key, -3) === '_id') { if ( $value !== null && $this->properties[$key] !== null && (int) $value === (int) $this->properties[$key] ) { return $this; } } if ($this->hasBeenLoadedFromDb()) { if ($value === $this->loadedProperties[$key]) { unset($this->modifiedProperties[$key]); if (empty($this->modifiedProperties)) { $this->hasBeenModified = false; } } else { $this->hasBeenModified = true; $this->modifiedProperties[$key] = true; } } else { $this->hasBeenModified = true; $this->modifiedProperties[$key] = true; } $this->properties[$key] = $value; return $this; } /** * Magic getter * * @param mixed $key * * @return mixed */ public function __get($key) { return $this->get($key); } /** * Magic setter * * @param string $key Key * @param mixed $val Value * * @return void */ public function __set($key, $val) { $this->set($key, $val); } /** * Magic isset check * * @param string $key * @return boolean */ public function __isset($key) { return array_key_exists($key, $this->properties); } /** * Magic unsetter * * @param string $key * @return void */ public function __unset($key) { if (! array_key_exists($key, $this->properties)) { throw new InvalidArgumentException('Trying to unset invalid key'); } $this->properties[$key] = $this->defaultProperties[$key]; } /** * Runs set() for every key/value pair of the given Array * * @param array $props Array of properties * @return self */ public function setProperties($props) { if (! is_array($props)) { throw new InvalidArgumentException(sprintf( 'Array required, got %s', gettype($props) )); } foreach ($props as $key => $value) { $this->set($key, $value); } return $this; } /** * Return an array with all object properties * * @return array */ public function getProperties() { //return $this->properties; $res = array(); foreach ($this->listProperties() as $key) { $res[$key] = $this->get($key); } return $res; } protected function getPropertiesForDb() { return $this->properties; } public function listProperties() { return array_keys($this->properties); } public function getDefaultProperties() { return $this->defaultProperties; } /** * Return all properties that changed since object creation * * @return array */ public function getModifiedProperties() { $props = array(); foreach (array_keys($this->modifiedProperties) as $key) { if ($key === $this->autoincKeyName) { if ($this->protectAutoinc) { continue; } elseif ($this->properties[$key] === null) { continue; } } $props[$key] = $this->properties[$key]; } return $props; } /** * List all properties that changed since object creation * * @return array */ public function listModifiedProperties() { return array_keys($this->modifiedProperties); } /** * Whether this object has been modified * * @return bool */ public function hasBeenModified() { return $this->hasBeenModified; } /** * Whether the given property has been modified * * @param string $key Property name * @return boolean */ protected function hasModifiedProperty($key) { return array_key_exists($key, $this->modifiedProperties); } /** * Unique key name * * @return string|array */ public function getKeyName() { return $this->keyName; } /** * Autoinc key name * * @return string */ public function getAutoincKeyName() { return $this->autoincKeyName; } /** * @return ?string */ public function getUuidColumn() { return $this->uuidColumn; } /** * @return bool */ public function hasUuidColumn() { return $this->uuidColumn !== null; } /** * @return \Ramsey\Uuid\UuidInterface */ public function getUniqueId() { if ($this->hasUuidColumn()) { $binaryValue = $this->properties[$this->uuidColumn]; if (is_resource($binaryValue)) { throw new RuntimeException('Properties contain binary UUID, probably a programming error'); } if ($binaryValue === null) { $uuid = Uuid::uuid4(); $this->reallySet($this->uuidColumn, $uuid->getBytes()); return $uuid; } return Uuid::fromBytes($binaryValue); } throw new InvalidArgumentException(sprintf('%s has no UUID column', $this->getTableName())); } public function getKeyParams() { $params = array(); $key = $this->getKeyName(); if (is_array($key)) { foreach ($key as $k) { $params[$k] = $this->get($k); } } else { $params[$key] = $this->get($this->keyName); } return $params; } /** * Return the unique identifier * * // TODO: may conflict with ->id * * @throws InvalidArgumentException When key can not be calculated * * @return string|array */ public function getId() { if (is_array($this->keyName)) { $id = array(); foreach ($this->keyName as $key) { if (isset($this->properties[$key])) { $id[$key] = $this->properties[$key]; } } if (empty($id)) { throw new InvalidArgumentException('Could not evaluate id for multi-column object!'); } return $id; } else { if (isset($this->properties[$this->keyName])) { return $this->properties[$this->keyName]; } } return null; } /** * Get the autoinc value if set * * @return int */ public function getAutoincId() { if (isset($this->properties[$this->autoincKeyName])) { return (int) $this->properties[$this->autoincKeyName]; } return null; } protected function forgetAutoincId() { if (isset($this->properties[$this->autoincKeyName])) { $this->properties[$this->autoincKeyName] = null; } return $this; } /** * Liefert das benutzte Datenbank-Handle * * @return Zend_Db_Adapter_Abstract */ public function getDb() { return $this->db; } public function hasConnection() { return $this->connection !== null; } public function getConnection() { return $this->connection; } /** * Lädt einen Datensatz aus der Datenbank und setzt die entsprechenden * Eigenschaften dieses Objekts * * @throws NotFoundError * @return self */ protected function loadFromDb() { $properties = $this->db->fetchRow($this->prepareObjectQuery()); if (empty($properties)) { if (is_array($this->getKeyName())) { throw new NotFoundError( 'Failed to load %s for %s', $this->table, $this->createWhere() ); } else { throw new NotFoundError( 'Failed to load %s "%s"', $this->table, $this->getLogId() ); } } return $this->setDbProperties($properties); } public function prepareObjectQuery() { return $this->db->select()->from($this->table)->where($this->createWhere()); } /** * @param object|array $row * @param Db $db * @return self */ public static function fromDbRow($row, Db $db) { $self = (new static())->setConnection($db); if (is_object($row)) { return $self->setDbProperties((array) $row); } if (is_array($row)) { return $self->setDbProperties($row); } throw new InvalidDataException('array or object', $row); } protected function setDbProperties($properties) { foreach ($properties as $key => $val) { if (! array_key_exists($key, $this->properties)) { throw new LogicException(sprintf( 'Trying to set invalid %s key "%s". DB schema change?', $this->table, $key )); } if ($val === null) { $this->properties[$key] = null; } elseif (is_resource($val)) { $this->properties[$key] = stream_get_contents($val); } else { $this->properties[$key] = (string) $val; } } $this->setBeingLoadedFromDb(); $this->onLoadFromDb(); return $this; } public function setBeingLoadedFromDb() { $this->loadedFromDb = true; $this->loadedProperties = $this->properties; $this->hasBeenModified = false; $this->modifiedProperties = []; } public function setLoadedProperty($key, $value) { if ($this->hasBeenLoadedFromDb()) { $this->set($key, $value); $this->loadedProperties[$key] = $this->get($key); } else { throw new RuntimeException('Cannot set loaded property for new object'); } } public function getOriginalProperties() { return $this->loadedProperties; } public function getOriginalProperty($key) { $this->assertPropertyExists($key); if ($this->hasBeenLoadedFromDb()) { return $this->loadedProperties[$key]; } return null; } public function resetProperty($key) { $this->set($key, $this->getOriginalProperty($key)); if ($this->listModifiedProperties() === [$key]) { $this->hasBeenModified = false; } return $this; } public function hasBeenLoadedFromDb() { return $this->loadedFromDb; } /** * Ändert den entsprechenden Datensatz in der Datenbank * * @return int Anzahl der geänderten Zeilen * @throws \Zend_Db_Adapter_Exception */ protected function updateDb() { $properties = $this->getModifiedProperties(); if (empty($properties)) { // Fake true, we might have manually set this to "modified" return true; } $this->quoteBinaryProperties($properties); // TODO: Remember changed data for audit and log return $this->db->update( $this->table, $properties, $this->createWhere() ); } /** * Fügt der Datenbank-Tabelle einen entsprechenden Datensatz hinzu * * @return int Anzahl der betroffenen Zeilen * @throws \Zend_Db_Adapter_Exception */ protected function insertIntoDb() { $properties = $this->getPropertiesForDb(); if ($this->autoincKeyName !== null) { if ($this->protectAutoinc || $properties[$this->autoincKeyName] === null) { unset($properties[$this->autoincKeyName]); } } if ($column = $this->getUuidColumn()) { $properties[$column] = $this->getUniqueId()->getBytes(); } $this->quoteBinaryProperties($properties); return $this->db->insert($this->table, $properties); } protected function quoteBinaryProperties(&$properties) { foreach ($properties as $key => $value) { if ($this->isBinaryColumn($key)) { $properties[$key] = $this->getConnection()->quoteBinary($value); } } } protected function isBinaryColumn($column) { return in_array($column, $this->binaryProperties) || $this->getUuidColumn() === $column; } public function propertyIsBoolean($property) { return array_key_exists($property, $this->booleans); } /** * Store object to database * * @param DbConnection $db * @return bool Whether storing succeeded. Always true, throws otherwise * @throws DuplicateKeyException */ public function store(DbConnection $db = null) { if ($db !== null) { $this->setConnection($db); } if ($this->validate() !== true) { throw new InvalidArgumentException(sprintf( '%s[%s] validation failed', $this->table, $this->getLogId() )); } if ($this->hasBeenLoadedFromDb() && ! $this->hasBeenModified()) { return true; } $this->beforeStore(); $table = $this->table; $id = $this->getId(); try { if ($this->hasBeenLoadedFromDb()) { if ($this->updateDb() !== false) { $this->onUpdate(); } else { throw new RuntimeException(sprintf( 'FAILED storing %s "%s"', $table, $this->getLogId() )); } } else { if ($id && $this->existsInDb()) { $logId = '"' . $this->getLogId() . '"'; if ($autoId = $this->getAutoincId()) { $logId .= sprintf(', %s=%s', $this->autoincKeyName, $autoId); } throw new DuplicateKeyException( 'Trying to recreate %s (%s)', $table, $logId ); } if ($this->insertIntoDb()) { if ($this->autoincKeyName && $this->getProperty($this->autoincKeyName) === null) { if ($this->connection->isPgsql()) { $this->properties[$this->autoincKeyName] = $this->db->lastInsertId( $table, $this->autoincKeyName ); } else { $this->properties[$this->autoincKeyName] = $this->db->lastInsertId(); } } // $this->log(sprintf('New %s "%s" has been stored', $table, $id)); $this->onInsert(); } else { throw new RuntimeException(sprintf( 'FAILED to store new %s "%s"', $table, $this->getLogId() )); } } } catch (Zend_Db_Exception $e) { throw new RuntimeException(sprintf( 'Storing %s[%s] failed: %s {%s}', $this->table, $this->getLogId(), $e->getMessage(), var_export($this->getProperties(), true) // TODO: Remove properties )); } // Hint: order is differs from setBeingLoadedFromDb() as of the onStore hook $this->modifiedProperties = []; $this->hasBeenModified = false; $this->loadedProperties = $this->properties; $this->onStore(); $this->loadedFromDb = true; return true; } /** * Delete item from DB * * @return int Affected rows */ protected function deleteFromDb() { return $this->db->delete( $this->table, $this->createWhere() ); } /** * @param string $key * @return self * @throws InvalidArgumentException */ protected function setKey($key) { $keyname = $this->getKeyName(); if (is_array($keyname)) { if (! is_array($key)) { throw new InvalidArgumentException(sprintf( '%s has a multicolumn key, array required', $this->table )); } foreach ($keyname as $k) { if (! array_key_exists($k, $key)) { // We allow for null in multicolumn keys: $key[$k] = null; } $this->set($k, $key[$k]); } } else { $this->set($keyname, $key); } return $this; } protected function existsInDb() { $result = $this->db->fetchRow( $this->db->select()->from($this->table)->where($this->createWhere()) ); return $result !== false; } public function createWhere() { if ($this->hasUuidColumn() && $this->properties[$this->uuidColumn] !== null) { return $this->db->quoteInto( sprintf('%s = ?', $this->getUuidColumn()), $this->connection->quoteBinary($this->getOriginalProperty($this->uuidColumn)) ); } if ($id = $this->getAutoincId()) { if ($originalId = $this->getOriginalProperty($this->autoincKeyName)) { return $this->db->quoteInto( sprintf('%s = ?', $this->autoincKeyName), $originalId ); } return $this->db->quoteInto( sprintf('%s = ?', $this->autoincKeyName), $id ); } $key = $this->getKeyName(); if (is_array($key) && ! empty($key)) { $where = array(); foreach ($key as $k) { if ($this->hasBeenLoadedFromDb()) { if ($this->loadedProperties[$k] === null) { $where[] = sprintf('%s IS NULL', $k); } else { $where[] = $this->createQuotedWhere($k, $this->loadedProperties[$k]); } } else { if ($this->properties[$k] === null) { $where[] = sprintf('%s IS NULL', $k); } else { $where[] = $this->createQuotedWhere($k, $this->properties[$k]); } } } return implode(' AND ', $where); } else { if ($this->hasBeenLoadedFromDb()) { return $this->createQuotedWhere($key, $this->loadedProperties[$key]); } else { return $this->createQuotedWhere($key, $this->properties[$key]); } } } protected function createQuotedWhere($column, $value) { return $this->db->quoteInto( sprintf('%s = ?', $column), $this->eventuallyQuoteBinary($value, $column) ); } protected function eventuallyQuoteBinary($value, $column) { if ($this->isBinaryColumn($column)) { return $this->connection->quoteBinary($value); } else { return $value; } } protected function getLogId() { $id = $this->getId(); if (is_array($id)) { $logId = json_encode($id); } else { $logId = $id; } if ($logId === null && $this->autoincKeyName) { $logId = $this->getAutoincId(); } return $logId; } public function delete() { $table = $this->table; if (! $this->hasBeenLoadedFromDb()) { throw new LogicException(sprintf( 'Cannot delete %s "%s", it has not been loaded from Db', $table, $this->getLogId() )); } if (! $this->existsInDb()) { throw new InvalidArgumentException(sprintf( 'Cannot delete %s "%s", it does not exist', $table, $this->getLogId() )); } $this->beforeDelete(); if (! $this->deleteFromDb()) { throw new RuntimeException(sprintf( 'Deleting %s (%s) FAILED', $table, $this->getLogId() )); } // $this->log(sprintf('%s "%s" has been DELETED', $table, this->getLogId())); $this->onDelete(); $this->loadedFromDb = false; return true; } public function __clone() { $this->onClone(); $this->forgetAutoincId(); $this->loadedFromDb = false; $this->hasBeenModified = true; } protected function onClone() { } /** * @param array $properties * @param DbConnection|null $connection * * @return static */ public static function create($properties = array(), DbConnection $connection = null) { $obj = new static(); if ($connection !== null) { $obj->setConnection($connection); } $obj->setProperties($properties); return $obj; } protected static function classWasPrefetched() { $class = get_called_class(); return array_key_exists($class, self::$prefetched); } /** * @param $key * @return static|bool */ protected static function getPrefetched($key) { $class = get_called_class(); if (static::hasPrefetched($key)) { if ( is_string($key) && array_key_exists($class, self::$prefetchedNames) && array_key_exists($key, self::$prefetchedNames[$class]) ) { return self::$prefetched[$class][ self::$prefetchedNames[$class][$key] ]; } else { return self::$prefetched[$class][$key]; } } else { return false; } } protected static function hasPrefetched($key) { $class = get_called_class(); if (! array_key_exists($class, self::$prefetchStats)) { self::$prefetchStats[$class] = (object) array( 'miss' => 0, 'hits' => 0, 'hitNames' => 0, 'combinedMiss' => 0 ); } if (is_array($key)) { self::$prefetchStats[$class]->combinedMiss++; return false; } if (array_key_exists($class, self::$prefetched)) { if ( is_string($key) && array_key_exists($class, self::$prefetchedNames) && array_key_exists($key, self::$prefetchedNames[$class]) ) { self::$prefetchStats[$class]->hitNames++; return true; } elseif (array_key_exists($key, self::$prefetched[$class])) { self::$prefetchStats[$class]->hits++; return true; } else { self::$prefetchStats[$class]->miss++; return false; } } else { self::$prefetchStats[$class]->miss++; return false; } } public static function getPrefetchStats() { return self::$prefetchStats; } /** * @param $id * @param DbConnection $connection * @return static * @throws NotFoundError */ public static function loadWithAutoIncId($id, DbConnection $connection) { /* Need to cast to int, otherwise the id will be matched against * object_name, which may wreak havoc if an object has a * object_name matching some id. Note that DbObject::set() and * DbObject::setDbProperties() will convert any property to * string, including ids. */ $id = (int) $id; if ($prefetched = static::getPrefetched($id)) { return $prefetched; } $obj = new static(); if (self::$dbObjectStore !== null && $obj->hasUuidColumn()) { $table = $obj->getTableName(); assert($connection instanceof Db); $uuid = UuidLookup::requireUuidForKey($id, $table, $connection, self::$dbObjectStore->getBranch()); return self::$dbObjectStore->load($table, $uuid); } $obj->setConnection($connection) ->set($obj->autoincKeyName, $id) ->loadFromDb(); return $obj; } /** * @param $id * @param DbConnection $connection * @return static * @throws NotFoundError */ public static function load($id, DbConnection $connection) { if ($prefetched = static::getPrefetched($id)) { return $prefetched; } /** @var DbObject $obj */ $obj = new static(); if (self::$dbObjectStore !== null && $obj->hasUuidColumn()) { $table = $obj->getTableName(); assert($connection instanceof Db); $uuid = UuidLookup::requireUuidForKey($id, $table, $connection, self::$dbObjectStore->getBranch()); return self::$dbObjectStore->load($table, $uuid); } $obj->setConnection($connection)->setKey($id)->loadFromDb(); return $obj; } /** * @param $id * @param DbConnection $connection * @return static */ public static function loadOptional($id, DbConnection $connection): ?DbObject { if ($prefetched = static::getPrefetched($id)) { return $prefetched; } /** @var DbObject $obj */ $obj = new static(); if (self::$dbObjectStore !== null && $obj->hasUuidColumn()) { $table = $obj->getTableName(); assert($connection instanceof Db); $uuid = UuidLookup::findUuidForKey($id, $table, $connection, self::$dbObjectStore->getBranch()); if ($uuid) { return self::$dbObjectStore->load($table, $uuid); } return null; } $obj->setConnection($connection)->setKey($id); $properties = $connection->getDbAdapter()->fetchRow($obj->prepareObjectQuery()); if (empty($properties)) { return null; } $obj->setDbProperties($properties); return $obj; } /** * @param DbConnection $connection * @param \Zend_Db_Select $query * @param string|null $keyColumn * * @return static[] */ public static function loadAll(DbConnection $connection, $query = null, $keyColumn = null) { $objects = array(); $db = $connection->getDbAdapter(); if ($query === null) { $dummy = new static(); $select = $db->select()->from($dummy->table); } else { $select = $query; } $rows = $db->fetchAll($select); foreach ($rows as $row) { /** @var DbObject $obj */ $obj = new static(); $obj->setConnection($connection)->setDbProperties($row); if ($keyColumn === null) { $objects[] = $obj; } else { $objects[$row->$keyColumn] = $obj; } } return $objects; } /** * @param DbConnection $connection * @param bool $force * * @return static[] */ public static function prefetchAll(DbConnection $connection, $force = false) { $dummy = static::create(); $class = get_class($dummy); $autoInc = $dummy->getAutoincKeyName(); $keyName = $dummy->getKeyName(); if ($force || ! array_key_exists($class, self::$prefetched)) { self::$prefetched[$class] = static::loadAll($connection, null, $autoInc); if (! is_array($keyName) && $keyName !== $autoInc) { foreach (self::$prefetched[$class] as $k => $v) { self::$prefetchedNames[$class][$v->$keyName] = $k; } } } return self::$prefetched[$class]; } public static function clearPrefetchCache() { $class = get_called_class(); if (! array_key_exists($class, self::$prefetched)) { return; } unset(self::$prefetched[$class]); unset(self::$prefetchedNames[$class]); unset(self::$prefetchStats[$class]); } public static function clearAllPrefetchCaches() { self::$prefetched = array(); self::$prefetchedNames = array(); self::$prefetchStats = array(); } /** * @param $id * @param DbConnection $connection * @return bool */ public static function exists($id, DbConnection $connection) { if (static::getPrefetched($id)) { return true; } elseif (static::classWasPrefetched()) { return false; } /** @var DbObject $obj */ $obj = new static(); if (self::$dbObjectStore !== null && $obj->hasUuidColumn()) { $table = $obj->getTableName(); assert($connection instanceof Db); $uuid = UuidLookup::findUuidForKey($id, $table, $connection, self::$dbObjectStore->getBranch()); if ($uuid) { return self::$dbObjectStore->exists($table, $uuid); } return false; } $obj->setConnection($connection)->setKey($id); return $obj->existsInDb(); } public static function uniqueIdExists(UuidInterface $uuid, DbConnection $connection) { $db = $connection->getDbAdapter(); $obj = new static(); $column = $obj->getUuidColumn(); $query = $db->select() ->from($obj->getTableName(), $column) ->where("$column = ?", $connection->quoteBinary($uuid->getBytes())); $result = $db->fetchRow($query); return $result !== false; } public static function requireWithUniqueId(UuidInterface $uuid, DbConnection $connection) { if ($object = static::loadWithUniqueId($uuid, $connection)) { return $object; } throw new NotFoundError(sprintf( 'No %s with UUID=%s has been found', (new static())->getTableName(), $uuid->toString() )); } public static function loadWithUniqueId(UuidInterface $uuid, DbConnection $connection): ?DbObject { $db = $connection->getDbAdapter(); $obj = new static(); if (self::$dbObjectStore !== null && $obj->hasUuidColumn()) { $table = $obj->getTableName(); assert($connection instanceof Db); return self::$dbObjectStore->load($table, $uuid); } $query = $db->select() ->from($obj->getTableName()) ->where($obj->getUuidColumn() . ' = ?', $connection->quoteBinary($uuid->getBytes())); $result = $db->fetchRow($query); if ($result) { return $obj->setConnection($connection)->setDbProperties($result); } return null; } public function setUniqueId(UuidInterface $uuid) { if ($column = $this->getUuidColumn()) { $binary = $uuid->getBytes(); $current = $this->get($column); if ($current === null) { $this->set($column, $binary); } else { if ($current !== $binary) { throw new RuntimeException(sprintf( 'Changing the UUID (from %s to %s) is not allowed', Uuid::fromBytes($current)->toString(), Uuid::fromBytes($binary)->toString() )); } } } } public function __destruct() { unset($this->db); unset($this->connection); } } icingaweb2-module-director-1.11.8/library/Director/Data/Db/DbObjectStore.php000066400000000000000000000132701516513262500265400ustar00rootroot00000000000000connection = $connection; $this->branch = $branch; } /** * @param $tableName * @param UuidInterface $uuid * @return DbObject|null * @throws \Icinga\Exception\NotFoundError */ public function load($tableName, UuidInterface $uuid) { $branchedObject = BranchedObject::load($this->connection, $tableName, $uuid, $this->branch); $object = $branchedObject->getBranchedDbObject($this->connection); if ($object === null) { return null; } $object->setBeingLoadedFromDb(); return $object; } /** * @param string $tableName * @param string $arrayIdx * @return DbObject[]|IcingaObject[] * @throws MergeErrorRecreateOnMerge * @throws MergeErrorDeleteMissingObject * @throws MergeErrorModificationForMissingObject */ public function loadAll($tableName, $arrayIdx = 'uuid') { $db = $this->connection->getDbAdapter(); $class = DbObjectTypeRegistry::classByType($tableName); $query = $db->select()->from($tableName)->order($arrayIdx); $result = []; foreach ($db->fetchAll($query) as $row) { $row->uuid = DbUtil::binaryResult($row->uuid); $result[$row->uuid] = $class::create((array) $row, $this->connection); $result[$row->uuid]->setBeingLoadedFromDb(); } if ($this->branch && $this->branch->isBranch()) { $query = $db->select() ->from(BranchActivity::DB_TABLE) ->where('branch_uuid = ?', $this->connection->quoteBinary($this->branch->getUuid()->getBytes())) ->order('timestamp_ns ASC'); $rows = $db->fetchAll($query); foreach ($rows as $row) { $activity = BranchActivity::fromDbRow($row); if ($activity->getObjectTable() !== $tableName) { continue; } $uuid = $activity->getObjectUuid(); $binaryUuid = $uuid->getBytes(); $exists = isset($result[$binaryUuid]); if ($activity->isActionCreate()) { if ($exists) { throw new MergeErrorRecreateOnMerge($activity); } else { $new = $activity->createDbObject($this->connection); $new->setBeingLoadedFromDb(); $result[$binaryUuid] = $new; } } elseif ($activity->isActionDelete()) { if ($exists) { unset($result[$binaryUuid]); } else { throw new MergeErrorDeleteMissingObject($activity); } } else { if ($exists) { $activity->applyToDbObject($result[$binaryUuid])->setBeingLoadedFromDb(); } else { throw new MergeErrorModificationForMissingObject($activity); } } } } if ($arrayIdx === 'uuid') { return $result; } $indexedResult = []; foreach ($result as $object) { $indexedResult[$object->get($arrayIdx)] = $object; } return $indexedResult; } public function exists($tableName, UuidInterface $uuid) { return BranchedObject::exists($this->connection, $tableName, $uuid, $this->branch->getUuid()); } public function store(DbObject $object) { if ($this->branch && $this->branch->isBranch()) { $activity = BranchActivity::forDbObject($object, $this->branch); $this->connection->runFailSafeTransaction(function () use ($activity) { $activity->store($this->connection); BranchedObject::withActivity($activity, $this->connection)->store($this->connection); }); return true; } else { return $object->store($this->connection); } } public function delete(DbObject $object) { if ($this->branch && $this->branch->isBranch()) { $activity = BranchActivity::deleteObject($object, $this->branch); $this->connection->runFailSafeTransaction(function () use ($activity) { $activity->store($this->connection); BranchedObject::load( $this->connection, $activity->getObjectTable(), $activity->getObjectUuid(), $this->branch )->delete($this->connection); }); return true; } return $object->delete(); } public function getBranch() { return $this->branch; } } icingaweb2-module-director-1.11.8/library/Director/Data/Db/DbObjectTypeRegistry.php000066400000000000000000000044751516513262500301250ustar00rootroot00000000000000getTableName(); } public static function shortTypeForObject(DbObject $object) { if ($object instanceof IcingaObject) { return $object->getShortTableName(); } return $object->getTableName(); } public static function newObject($type, $properties = [], Db $db = null) { /** @var DbObject $class fake hint for the IDE, it's a string */ $class = self::classByType($type); return $class::create($properties, $db); } } icingaweb2-module-director-1.11.8/library/Director/Data/Db/DbObjectWithSettings.php000066400000000000000000000104541516513262500301010ustar00rootroot00000000000000hasProperty($key)) { return parent::set($key, $value); } elseif ($this->hasSetterForProperty($key)) { // Hint: hasProperty checks only for Getters return parent::set($key, $value); } if (! \array_key_exists($key, $this->settings) || $value !== $this->settings[$key]) { $this->hasBeenModified = true; } $this->settings[$key] = $value; return $this; } public function get($key) { if ($this->hasProperty($key)) { return parent::get($key); } if (array_key_exists($key, $this->settings)) { return $this->settings[$key]; } return parent::get($key); } public function setSettings($settings) { $settings = (array) $settings; ksort($settings); if ($settings !== $this->settings) { $this->settings = $settings; $this->hasBeenModified = true; } return $this; } public function getSettings() { // Sort them, important only for new objects ksort($this->settings); return $this->settings; } public function getSetting($name, $default = null) { if (array_key_exists($name, $this->settings)) { return $this->settings[$name]; } return $default; } public function getStoredSetting($name, $default = null) { $stored = $this->fetchSettingsFromDb(); if (array_key_exists($name, $stored)) { return $stored[$name]; } return $default; } public function __unset($key) { if ($this->hasProperty($key)) { parent::__unset($key); } if (array_key_exists($key, $this->settings)) { unset($this->settings[$key]); $this->hasBeenModified = true; } } protected function onStore() { $old = $this->fetchSettingsFromDb(); $oldKeys = array_keys($old); $newKeys = array_keys($this->settings); $add = []; $mod = []; $del = []; $id = $this->get('id'); foreach ($this->settings as $key => $val) { if (array_key_exists($key, $old)) { if ($old[$key] !== $this->settings[$key]) { $mod[$key] = $this->settings[$key]; } } else { $add[$key] = $this->settings[$key]; } } foreach (array_diff($oldKeys, $newKeys) as $key) { $del[] = $key; } $where = sprintf($this->settingsRemoteId . ' = %d AND setting_name = ?', $id); $db = $this->getDb(); foreach ($mod as $key => $val) { $db->update( $this->settingsTable, ['setting_value' => $val], $db->quoteInto($where, $key) ); } foreach ($add as $key => $val) { $db->insert( $this->settingsTable, [ $this->settingsRemoteId => $id, 'setting_name' => $key, 'setting_value' => $val ] ); } if (! empty($del)) { $where = sprintf($this->settingsRemoteId . ' = %d AND setting_name IN (?)', $id); $db->delete($this->settingsTable, $db->quoteInto($where, $del)); } } protected function fetchSettingsFromDb() { $db = $this->getDb(); $id = $this->get('id'); if (! $id) { return []; } return $db->fetchPairs( $db->select() ->from($this->settingsTable, ['setting_name', 'setting_value']) ->where($this->settingsRemoteId . ' = ?', $id) ->order('setting_name') ); } protected function onLoadFromDb() { $this->settings = $this->fetchSettingsFromDb(); } } icingaweb2-module-director-1.11.8/library/Director/Data/Db/IcingaObjectFilterRenderer.php000066400000000000000000000067241516513262500312330ustar00rootroot00000000000000 'host.object_name', 'service.name' => 'service.object_name', ]; public function __construct(Filter $filter, IcingaObjectQuery $query) { $this->filter = clone($filter); $this->fixFilterColumns($this->filter); $this->query = $query; } /** * @param Filter $filter * @param IcingaObjectQuery $query * * @return IcingaObjectQuery */ public static function apply(Filter $filter, IcingaObjectQuery $query) { $self = new static($filter, $query); return $self->applyFilterToQuery(); } /** * @return IcingaObjectQuery */ protected function applyFilterToQuery() { $this->query->escapedWhere($this->renderFilter($this->filter)); return $this->query; } /** * @param Filter $filter * @return string */ protected function renderFilter(Filter $filter) { if ($filter->isChain()) { /** @var FilterChain $filter */ return $this->renderFilterChain($filter); } else { /** @var FilterExpression $filter */ return $this->renderFilterExpression($filter); } } /** * @param FilterChain $filter * * @throws FilterException * * @return string */ protected function renderFilterChain(FilterChain $filter) { $parts = array(); foreach ($filter->filters() as $sub) { $parts[] = $this->renderFilter($sub); } $op = $filter->getOperatorName(); if ($op === 'NOT') { if (count($parts) !== 1) { throw new FilterException( 'NOT should have exactly one child, got %s', count($parts) ); } return $op . ' ' . $parts[0]; } else { if ($filter->isRootNode()) { return implode(' ' . $op . ' ', $parts); } else { return '(' . implode(' ' . $op . ' ', $parts) . ')'; } } } protected function fixFilterColumns(Filter $filter) { if ($filter->isExpression()) { /** @var FilterExpression $filter */ $col = $filter->getColumn(); if (array_key_exists($col, $this->columnMap)) { $filter->setColumn($this->columnMap[$col]); } if (strpos($col, 'vars.') === false) { $filter->setExpression(json_decode($filter->getExpression())); } } else { /** @var FilterChain $filter */ foreach ($filter->filters() as $sub) { $this->fixFilterColumns($sub); } } } /** * @param FilterExpression $filter * * @return string */ protected function renderFilterExpression(FilterExpression $filter) { $query = $this->query; $column = $query->getAliasForRequiredFilterColumn($filter->getColumn()); return $query->whereToSql( $column, $filter->getSign(), $filter->getExpression() ); } } icingaweb2-module-director-1.11.8/library/Director/Data/Db/IcingaObjectQuery.php000066400000000000000000000145501516513262500274200ustar00rootroot00000000000000 table */ protected $requiredTables; /** @var array maps table aliases, alias => table*/ protected $aliases; /** @var DbQuery */ protected $dummyQuery; /** @var array varname => alias */ protected $joinedVars = array(); protected $customVarTable; protected $baseQuery; /** * IcingaObjectQuery constructor. * * @param string $type * @param Db $connection * @param bool $resolved */ public function __construct($type, Db $connection, $resolved = true) { $this->type = $type; $this->connection = $connection; $this->db = $connection->getDbAdapter(); $this->resolved = $resolved; $baseTable = 'icinga_' . $type; $this->baseQuery = $this->db->select() ->from( array(self::BASE_ALIAS => $baseTable), array('name' => 'object_name') )->order(self::BASE_ALIAS . '.object_name'); } public function joinVar($name) { if (! $this->hasJoinedVar($name)) { $type = $this->type; $alias = $this->safeVarAlias($name); $varAlias = "v_$alias"; // TODO: optionally $varRelation = sprintf('icinga_%s_resolved_var', $type); $varRelation = sprintf('icinga_%s_var', $type); $idCol = sprintf('%s.%s_id', $alias, $type); $joinOn = sprintf('%s = %s.id', $idCol, self::BASE_ALIAS); $joinVarOn = $this->db->quoteInto( sprintf('%s.checksum = %s.checksum AND %s.varname = ?', $alias, $varAlias, $alias), $name ); $this->baseQuery->join( array($alias => $varRelation), $joinOn, array() )->join( array($varAlias => 'icinga_var'), $joinVarOn, array($alias => $varAlias . '.varvalue') ); $this->joinedVars[$name] = $varAlias . '.varvalue'; } return $this; } // Debug only public function getSql() { return (string) $this->baseQuery; } public function listNames() { return $this->db->fetchCol( $this->baseQuery ); } protected function hasJoinedVar($name) { return array_key_exists($name, $this->joinedVars); } public function getJoinedVarAlias($name) { return $this->joinedVars[$name]; } // TODO: recheck this protected function safeVarAlias($name) { $alias = preg_replace('/[^a-zA-Z0-9_]/', '', (string) $name); $cnt = 1; $checkAlias = $alias; while (in_array($checkAlias, $this->joinedVars)) { $cnt++; $checkAlias = $alias . '_' . $cnt; } return $checkAlias; } public function escapedWhere($where) { $this->baseQuery->where(new ZfDbExpr($where)); } /** * @param $column * @return string * @throws NotFoundError * @throws NotImplementedError */ public function getAliasForRequiredFilterColumn($column) { list($key, $sub) = $this->splitFilterKey($column); if ($sub === null) { return $key; } else { $objectType = $key; } if ($objectType === $this->type) { list($key, $sub) = $this->splitFilterKey($sub); if ($sub === null) { return $key; } if ($key === 'vars') { return $this->joinVar($sub)->getJoinedVarAlias($sub); } else { throw new NotFoundError('Not yet, my type: %s - %s', $objectType, $key); } } else { throw new NotImplementedError('Not yet: %s - %s', $objectType, $sub); } } protected function splitFilterKey($key) { $dot = strpos($key, '.'); if ($dot === false) { return [$key, null]; } else { return [substr($key, 0, $dot), substr($key, $dot + 1)]; } } protected function requireTable($name) { if ($alias = $this->getTableAliasFromQuery($name)) { return $alias; } $this->joinTable($name); } protected function joinTable($name) { if (!array_key_exists($name, $this->requiredTables)) { $alias = $this->makeAlias($name); } return $this->tableAliases($name); } protected function hasAlias($name) { return array_key_exists($name, $this->aliases); } protected function makeAlias($name) { if (substr($name, 0, 7) === 'icinga_') { $shortName = substr($name, 7); } else { $shortName = $name; } $parts = preg_split('/_/', $shortName, -1); $alias = ''; foreach ($parts as $part) { $alias .= $part[0]; if (! $this->hasAlias($alias)) { return $alias; } } $cnt = 1; do { $cnt++; if (! $this->hasAlias($alias . $cnt)) { return $alias . $cnt; } } while (! $this->hasAlias($alias)); return $alias; } protected function getTableAliasFromQuery($table) { $tables = $this->query->getPart('from'); $key = array_search($table, $tables); if ($key === null || $key === false) { return false; } /* 'joinType' => $type, 'schema' => $schema, 'tableName' => $tableName, 'joinCondition' => $cond */ return $key; } public function whereToSql($col, $sign, $expression) { return $this->connection->renderFilter(Filter::expression($col, $sign, $expression)); } } icingaweb2-module-director-1.11.8/library/Director/Data/Db/ServiceSetQueryBuilder.php000066400000000000000000000123371516513262500304630ustar00rootroot00000000000000connection = $connection; $this->db = $connection->getDbAdapter(); if ($uuid) { $this->setBranchUuid($uuid); } } /** * @return \Zend_Db_Select * @throws \Zend_Db_Select_Exception */ public function selectServicesForSet(IcingaServiceSet $set) { $db = $this->connection->getDbAdapter(); if ($this->branchUuid) { $right = $this->selectRightBranchedServices($set)->columns($this->getRightBranchedColumns()); $left = $this->selectLeftBranchedServices($set)->columns($this->getLeftBranchedColumns()); $query = $this->db->select()->from(['u' => $db->select()->union([ 'l' => new DbSelectParenthesis($left), 'r' => new DbSelectParenthesis($right), ])]); $query->order('service_set'); } else { $query = $this->selectServices($set)->columns($this->getColumns()); } return $query; } protected function selectServices(IcingaServiceSet $set) { return $this->db ->select() ->from(['o' => self::TABLE], []) ->joinLeft(['os' => self::SET_TABLE], 'os.id = o.service_set_id', []) ->where('os.uuid = ?', $this->connection->quoteBinary($set->getUniqueId()->getBytes())); } protected function selectLeftBranchedServices(IcingaServiceSet $set) { return $this ->selectServices($set) ->joinLeft( ['bo' => self::BRANCHED_TABLE], $this->db->quoteInto('bo.uuid = o.uuid AND bo.branch_uuid = ?', $this->getQuotedBranchUuid()), [] ); } protected function selectRightBranchedServices(IcingaServiceSet $set) { return $this->db ->select() ->from(['o' => self::TABLE], []) ->joinRight(['bo' => self::BRANCHED_TABLE], 'bo.uuid = o.uuid', []) ->where('bo.service_set = ?', $set->get('object_name')) ->where('bo.branch_uuid = ?', $this->getQuotedBranchUuid()); } protected static function resetQueryProperties(\Zend_Db_Select $query) { // TODO: Keep existing UUID, becomes important when using this for other tables too (w/o UNION) // $columns = $query->getPart($query::COLUMNS); $query->reset($query::COLUMNS); $query->columns('uuid'); return $query; } public function fetchServicesWithQuery(\Zend_Db_Select $query) { static::resetQueryProperties($query); $db = $this->connection->getDbAdapter(); $uuids = $db->fetchCol($query); $services = []; foreach ($uuids as $uuid) { $service = IcingaService::loadWithUniqueId(Uuid::fromBytes(DbUtil::binaryResult($uuid)), $this->connection); $service->set('service_set', null); // TODO: CHECK THIS!!!! $services[$service->getObjectName()] = $service; } return $services; } protected function getColumns() { return [ 'uuid' => 'o.uuid', // MUST be first because of UNION column order, see branchifyColumns() 'id' => 'o.id', 'branch_uuid' => '(null)', 'service_set' => 'os.object_name', 'service' => 'o.object_name', 'disabled' => 'o.disabled', 'object_type' => 'o.object_type', 'blacklisted' => "('n')", ]; } protected function getLeftBranchedColumns() { $columns = $this->getColumns(); $columns['branch_uuid'] = 'bo.branch_uuid'; $columns['service_set'] = 'COALESCE(os.object_name, bo.service_set)'; return $this->branchifyColumns($columns); } protected function getRightBranchedColumns() { $columns = $this->getColumns(); $columns = $this->branchifyColumns($columns); $columns['branch_uuid'] = 'bo.branch_uuid'; $columns['service_set'] = 'bo.service_set'; $columns['id'] = '(NULL)'; return $columns; } protected function getQuotedBranchUuid() { return $this->connection->quoteBinary($this->branchUuid->getBytes()); } } icingaweb2-module-director-1.11.8/library/Director/Data/Exporter.php000066400000000000000000000244501516513262500253340ustar00rootroot00000000000000connection = $connection; $this->db = $connection->getDbAdapter(); $this->fieldReferenceLoader = new FieldReferenceLoader($connection); } public function export(DbObject $object) { $props = $object instanceof IcingaObject ? $this->exportIcingaObject($object) : $this->exportDbObject($object); ImportExportDeniedProperties::strip($props, $object, $this->showIds); $this->appendTypeSpecificRelations($props, $object); if ($this->chosenProperties !== null) { $chosen = []; foreach ($this->chosenProperties as $k) { if (array_key_exists($k, $props)) { $chosen[$k] = $props[$k]; } } $props = $chosen; } if ($column = $object->getUuidColumn()) { if ($uuid = $object->get($column)) { $props[$column] = Uuid::fromBytes($uuid)->toString(); } } ksort($props); return (object) $props; } public function enableHostServices($enable = true) { $this->exportHostServices = $enable; return $this; } public function showDefaults($show = true) { $this->showDefaults = $show; return $this; } public function showIds($show = true) { $this->showIds = $show; return $this; } public function resolveObjects($resolve = true) { $this->resolveObjects = $resolve; if ($this->serviceLoader) { $this->serviceLoader->resolveObjects($resolve); } return $this; } public function filterProperties(array $properties) { $this->chosenProperties = $properties; return $this; } protected function appendTypeSpecificRelations(array &$props, DbObject $object) { if ($object instanceof DirectorDatalist) { $props['entries'] = $this->exportDatalistEntries($object); } elseif ($object instanceof DirectorDatafield) { if (isset($props['settings']->datalist_id)) { $props['settings']->datalist = $this->getDatalistNameForId($props['settings']->datalist_id); unset($props['settings']->datalist_id); } $props['category'] = isset($props['category_id']) ? $this->getDatafieldCategoryNameForId($props['category_id']) : null; unset($props['category_id']); } elseif ($object instanceof ImportSource) { $props['modifiers'] = $this->exportRowModifiers($object); } elseif ($object instanceof SyncRule) { $props['properties'] = $this->exportSyncProperties($object); } elseif ($object instanceof IcingaCommand) { if (isset($props['arguments'])) { foreach ($props['arguments'] as $key => $argument) { if (property_exists($argument, 'command_id')) { unset($props['arguments'][$key]->command_id); } } } } elseif ($object instanceof DirectorJob) { if ($object->hasTimeperiod()) { $props['timeperiod'] = $object->timeperiod()->getObjectName(); } unset($props['timeperiod_id']); } elseif ($object instanceof IcingaTemplateChoice) { if (isset($props['required_template_id'])) { $requiredId = $props['required_template_id']; unset($props['required_template_id']); $props = $this->loadTemplateName($object->getObjectTableName(), $requiredId); } $props['members'] = array_values($object->getMembers()); } elseif ($object instanceof IcingaServiceSet) { if ($object->get('host_id')) { // Sets on Host throw new RuntimeException('Not yet'); } $props['services'] = []; foreach ($object->getServices() as $serviceObject) { $props['services'][] = $this->export($serviceObject); } usort($props['services'], [$this, 'sortByName']); } elseif ($object instanceof IcingaHost) { if ($this->exportHostServices) { $services = []; foreach ($this->serviceLoader()->fetchServicesForHost($object) as $service) { $services[] = $this->export($service); } $props['services'] = $services; } } } protected function sortByName($left, $right) { return $left->object_name < $right->object_name ? '-1' : '1'; } public function serviceLoader() { if ($this->serviceLoader === null) { $this->serviceLoader = new HostServiceLoader($this->connection, Auth::getInstance()); $this->serviceLoader->resolveObjects($this->resolveObjects); } return $this->serviceLoader; } protected function loadTemplateName($table, $id) { $db = $this->db; $query = $db->select() ->from(['o' => $table], 'o.object_name')->where("o.object_type = 'template'") ->where('o.id = ?', $id); return $db->fetchOne($query); } protected function getDatalistNameForId($id) { $db = $this->db; $query = $db->select()->from('director_datalist', 'list_name')->where('id = ?', (int) $id); return $db->fetchOne($query); } protected function getDatafieldCategoryNameForId($id) { $db = $this->db; $query = $db->select()->from('director_datafield_category', 'category_name')->where('id = ?', (int) $id); return $db->fetchOne($query); } protected function exportRowModifiers(ImportSource $object) { $modifiers = []; // Hint: they're sorted by priority foreach ($object->fetchRowModifiers() as $modifier) { $modifiers[] = $this->export($modifier); } return $modifiers; } public function exportSyncProperties(SyncRule $object) { $all = []; $db = $this->db; $sourceNames = $db->fetchPairs( $db->select()->from('import_source', ['id', 'source_name']) ); foreach ($object->getSyncProperties() as $property) { $properties = $property->getProperties(); $properties['source'] = $sourceNames[$properties['source_id']]; unset($properties['id']); unset($properties['rule_id']); unset($properties['source_id']); ksort($properties); $all[] = (object) $properties; } return $all; } /** * @param DbObject $object * @return array */ protected function exportDbObject(DbObject $object) { $props = $object->getProperties(); foreach ($props as $key => &$value) { if ($object->propertyIsBoolean($key)) { $value = DbDataFormatter::booleanForDbValue($value); } } unset($value); if ($object instanceof DbObjectWithSettings) { if ($object instanceof InstantiatedViaHook) { $props['settings'] = (object) $object->getInstance()->exportSettings(); } else { $props['settings'] = (object) $object->getSettings(); // Already sorted } } if ($object instanceof Basket) { if (isset($props['objects']) && is_string($props['objects'])) { $props['objects'] = JsonString::decode($props['objects']); } } unset($props['uuid']); // Not yet if (! $this->showDefaults) { foreach ($props as $key => $value) { // We assume NULL as a default value for all non-IcingaObject properties if ($value === null) { unset($props[$key]); } } } return $props; } /** * @param IcingaObject $object * @return array * @throws \Icinga\Exception\NotFoundError */ protected function exportIcingaObject(IcingaObject $object) { $props = (array) $object->toPlainObject($this->resolveObjects, !$this->showDefaults); if ($object->supportsFields()) { $props['fields'] = $this->fieldReferenceLoader->loadFor($object); } return $props; } protected function exportDatalistEntries(DirectorDatalist $list) { $entries = []; foreach ($list->getEntries() as $name => $entry) { if ($entry->shouldBeRemoved()) { continue; } $plainEntry = $entry->getProperties(); unset($plainEntry['list_id']); $entries[] = $plainEntry; } return $entries; } } icingaweb2-module-director-1.11.8/library/Director/Data/FieldReferenceLoader.php000066400000000000000000000023201516513262500275050ustar00rootroot00000000000000db = $connection->getDbAdapter(); } /** * @param int $id * @return array */ public function loadFor(IcingaObject $object) { $db = $this->db; $id = $object->get('id'); if ($id === null) { return []; } $type = $object->getShortTableName(); $res = $db->fetchAll( $db->select()->from(['f' => "icinga_{$type}_field"], [ 'f.datafield_id', 'f.is_required', 'f.var_filter', ])->join(['df' => 'director_datafield'], 'df.id = f.datafield_id', []) ->where("{$type}_id = ?", (int) $id) ->order('varname ASC') ); if (empty($res)) { return []; } foreach ($res as $field) { $field->datafield_id = (int) $field->datafield_id; } return $res; } } icingaweb2-module-director-1.11.8/library/Director/Data/HostServiceLoader.php000066400000000000000000000133441516513262500271110ustar00rootroot00000000000000connection = $connection; $this->db = $connection->getDbAdapter(); $this->auth = $auth; } public function fetchServicesForHost(IcingaHost $host) { $table = (new ObjectsTableService($this->connection, $this->auth)) ->setHost($host); $services = $this->fetchServicesForTable($table); if ($this->resolveHostServices) { foreach ($this->fetchAllServicesForHost($host) as $service) { $services[] = $service; } } return $services; } public function resolveHostServices($enable = true) { $this->resolveHostServices = $enable; return $this; } public function resolveObjects($resolve = true) { $this->resolveObjects = $resolve; return $this; } protected function fetchAllServicesForHost(IcingaHost $host) { $services = []; /** @var IcingaHost[] $parents */ $parents = IcingaTemplateRepository::instanceByObject($host)->getTemplatesFor($host, true); foreach ($parents as $parent) { $table = (new ObjectsTableService($this->connection, $this->auth)) ->setHost($parent) ->setInheritedBy($host); foreach ($this->fetchServicesForTable($table) as $service) { $services[] = $service; } } foreach ($this->getHostServiceSetTables($host) as $table) { foreach ($this->fetchServicesForTable($table) as $service) { $services[] = $service; } } foreach ($parents as $parent) { foreach ($this->getHostServiceSetTables($parent, $host) as $table) { foreach ($this->fetchServicesForTable($table) as $service) { $services[] = $service; } } } $appliedSets = AppliedServiceSetLoader::fetchForHost($host); foreach ($appliedSets as $set) { $table = IcingaServiceSetServiceTable::load($set) // ->setHost($host) ->setAffectedHost($host); foreach ($this->fetchServicesForTable($table) as $service) { $services[] = $service; } } $table = IcingaHostAppliedServicesTable::load($host); foreach ($this->fetchServicesForTable($table) as $service) { $services[] = $service; } return $services; } /** * Duplicates Logic in HostController * * @param IcingaHost $host * @param IcingaHost|null $affectedHost * @return IcingaServiceSetServiceTable[] */ protected function getHostServiceSetTables(IcingaHost $host, IcingaHost $affectedHost = null) { $tables = []; $db = $this->connection; if ($affectedHost === null) { $affectedHost = $host; } if ($host->get('id') === null) { return $tables; } $query = $db->getDbAdapter()->select() ->from(['ss' => 'icinga_service_set'], 'ss.*') ->join(['hsi' => 'icinga_service_set_inheritance'], 'hsi.parent_service_set_id = ss.id', []) ->join(['hs' => 'icinga_service_set'], 'hs.id = hsi.service_set_id', []) ->where('hs.host_id = ?', $host->get('id')); $sets = IcingaServiceSet::loadAll($db, $query, 'object_name'); /** @var IcingaServiceSet $set*/ foreach ($sets as $name => $set) { $tables[] = IcingaServiceSetServiceTable::load($set) ->setHost($host) ->setAffectedHost($affectedHost); } return $tables; } protected function fetchServicesForTable(QueryBasedTable $table) { $query = $table->getQuery(); if ($query instanceof Select || $query instanceof Zend_Db_Select) { // What about SimpleQuery? IcingaHostAppliedServicesTable with branch in place? $query->reset(Select::LIMIT_COUNT); $query->reset(Select::LIMIT_OFFSET); $rows = $this->db->fetchAll($query); } elseif ($query instanceof SimpleQuery) { $rows = $query->fetchAll(); } else { throw new RuntimeException('Table query needs to be either a Select or a SimpleQuery instance'); } $services = []; foreach ($rows as $row) { $service = IcingaService::loadWithUniqueId(Uuid::fromBytes($row->uuid), $this->connection); if ($this->resolveObjects) { $service = $service::fromPlainObject($service->toPlainObject(true), $this->connection); } $services[] = $service; } return $services; } } icingaweb2-module-director-1.11.8/library/Director/Data/ImportExportDeniedProperties.php000066400000000000000000000026751516513262500313730ustar00rootroot00000000000000 [ 'last_attempt_succeeded', 'last_error_message', 'ts_last_attempt', 'ts_last_error', ], ImportSource::class => [ // No state export 'import_state', 'last_error_message', 'last_attempt', ], ImportRowModifier::class => [ // Not state, but to be removed: 'source_id', ], SyncRule::class => [ 'sync_state', 'last_error_message', 'last_attempt', ], ]; public static function strip(array &$props, DbObject $object, $showIds = false) { // TODO: this used to exist. Double-check all imports to verify it's not in use // $originalId = $props['id']; if (! $showIds) { unset($props['id']); } $class = get_class($object); if (isset(self::$denyProperties[$class])) { foreach (self::$denyProperties[$class] as $key) { unset($props[$key]); } } } } icingaweb2-module-director-1.11.8/library/Director/Data/InvalidDataException.php000066400000000000000000000010221516513262500275510ustar00rootroot00000000000000db = $db; } /** * @param class-string|DbObject $implementation * @param stdClass $plain * @return DbObject * @throws JsonDecodeException */ public function import(string $implementation, stdClass $plain): DbObject { $this->assertTemplate($implementation, $plain); $this->fixRelations($implementation, $plain); $this->applyOtherWorkarounds($implementation, $plain); $this->fixLegacyBaskets($implementation, $plain); $this->fixSubObjects($implementation, $plain); $object = $this->loadExistingObject($implementation, $plain); if ($object === null) { $object = $implementation::create([], $this->db); } $properties = (array) $plain; unset($properties['fields']); unset($properties['originalId']); if ($implementation === Basket::class) { if (isset($properties['objects']) && is_string($properties['objects'])) { $properties['objects'] = JsonString::decode($properties['objects']); } } $object->setProperties($properties); return $object; } protected function fixLegacyBaskets(string $implementation, stdClass $plain) { // TODO: Check, whether current export sets modifiers = [] in case there is none if ($implementation == ImportSource::class) { if (!isset($plain->modifiers)) { $plain->modifiers = []; } } } protected function applyOtherWorkarounds(string $implementation, stdClass $plain) { if ($implementation === SyncRule::class) { if (isset($plain->properties)) { $plain->syncProperties = $plain->properties; unset($plain->properties); } } } protected function fixSubObjects(string $implementation, stdClass $plain) { if ($implementation === IcingaServiceSet::class) { foreach ($plain->services as $service) { unset($service->fields); } // Hint: legacy baskets are carrying service names as object keys, new baskets have arrays $plain->services = array_values((array) $plain->services); } } protected function fixRelations(string $implementation, stdClass $plain) { if ($implementation === DirectorJob::class) { $settings = $plain->settings; $source = $settings->source ?? null; if ($source && !isset($settings->source_id)) { $settings->source_id = ImportSource::load($source, $this->db)->get('id'); unset($settings->source); } $rule = $settings->rule ?? null; if ($rule) { if (! isset($settings->rule_id)) { $settings->rule_id = SyncRule::load($rule, $this->db)->get('id'); unset($settings->rule); } $settings->apply_changes = DbDataFormatter::normalizeBoolean($settings->apply_changes); } } } /** * @param class-string $implementation * @param stdClass $plain * @return DbObject|null */ protected function loadExistingObject(string $implementation, stdClass $plain): ?DbObject { if ( isset($plain->uuid) && $instance = $implementation::loadWithUniqueId(Uuid::fromString($plain->uuid), $this->db) ) { return $instance; } if ($implementation === IcingaService::class) { $key = [ 'object_type' => 'template', 'object_name' => $plain->object_name ]; } else { $dummy = $implementation::create(); $keyColumn = $dummy->getKeyName(); if (is_array($keyColumn)) { if (empty($keyColumn)) { throw new \RuntimeException("$implementation has an empty keyColumn array"); } $key = []; foreach ($keyColumn as $column) { if (isset($plain->$column)) { $key[$column] = $plain->$column; } } } else { $key = $plain->$keyColumn; } } return $implementation::loadOptional($key, $this->db); } protected function assertTemplate(string $implementation, stdClass $plain) { if (! in_array($implementation, self::$templatesOnly)) { return; } if ($plain->object_type !== 'template') { throw new InvalidArgumentException(sprintf( 'Can import only Templates, got "%s" for "%s"', $plain->object_type, $plain->name )); } } } icingaweb2-module-director-1.11.8/library/Director/Data/PropertiesFilter.php000066400000000000000000000011241516513262500270170ustar00rootroot00000000000000blacklist)); } } icingaweb2-module-director-1.11.8/library/Director/Data/PropertiesFilter/000077500000000000000000000000001516513262500263105ustar00rootroot00000000000000ArrayCustomVariablesFilter.php000066400000000000000000000010501516513262500342060ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Data/PropertiesFilterdatatype) && ( preg_match('/DataTypeArray[\w]*$/', $object->datatype) || ( preg_match('/DataTypeDatalist$/', $object->datatype) && $object->format === 'json' ) ); } } icingaweb2-module-director-1.11.8/library/Director/Data/PropertiesFilter/CustomVariablesFilter.php000066400000000000000000000005111516513262500332670ustar00rootroot00000000000000 $value) { $current = $object->$key; if ($current === null) { $current = [$value]; } elseif (is_array($current)) { $current[] = $value; } else { throw new InvalidArgumentException(sprintf( 'I can only append to arrays, %s is %s', $key, var_export($current, true) )); } $object->$key = $current; } } public static function removeProperties(IcingaObject $object, $properties) { foreach ($properties as $key => $value) { if ($value === true) { $object->$key = null; } $current = $object->$key; if ($current === null) { continue; } elseif (is_array($current)) { $new = []; foreach ($current as $item) { if ($item !== $value) { $new[] = $item; } } $object->$key = $new; } elseif (is_string($current)) { if ($current === $value) { $object->$key = null; } } else { throw new InvalidArgumentException(sprintf( 'I can only remove strings or from arrays, %s is %s', $key, var_export($current, true) )); } } } } icingaweb2-module-director-1.11.8/library/Director/Data/RecursiveUtf8Validator.php000066400000000000000000000030771516513262500301120ustar00rootroot00000000000000 $row) { foreach ($row as self::$column => $value) { static::assertUtf8($value); } } return true; } protected static function assertUtf8($value) { if (\is_string($value)) { static::assertUtf8String($value); } elseif (\is_array($value) || $value instanceof \stdClass) { foreach ((array) $value as $k => $v) { static::assertUtf8($k); static::assertUtf8($v); } } elseif ($value !== null && !\is_scalar($value)) { throw new InvalidArgumentException("Cannot validate " . Error::getPhpTypeName($value)); } } protected static function assertUtf8String($string) { if (@\iconv('UTF-8', 'UTF-8', $string) != $string) { $row = self::$rowNum; if (is_int($row)) { $row++; } throw new InvalidArgumentException(\sprintf( 'Invalid UTF-8 on row %s, column %s: "%s" (%s)', $row, self::$column, \iconv('UTF-8', 'UTF-8//IGNORE', $string), '0x' . \bin2hex($string) )); } } } icingaweb2-module-director-1.11.8/library/Director/Data/Serializable.php000066400000000000000000000002601516513262500261230ustar00rootroot00000000000000value = $value; return $self; } public static function wantSerializable($value) { if ($value instanceof SerializableValue) { return $value; } return static::fromSerialization($value); } /** * TODO: Check whether json_encode() is faster * * @param mixed $value * @return bool */ protected static function assertSerializableValue($value) { if ($value === null || is_scalar($value)) { return true; } if (is_object($value)) { if ($value instanceof JsonSerializable) { return true; } if ($value instanceof stdClass) { foreach ((array) $value as $val) { static::assertSerializableValue($val); } return true; } } if (is_array($value)) { foreach ($value as $val) { static::assertSerializableValue($val); } return true; } throw new InvalidArgumentException('Serializable value expected, got ' . static::getPhpType($value)); } protected static function getPhpType($var) { if (is_object($var)) { return get_class($var); } return gettype($var); } #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->value; } } icingaweb2-module-director-1.11.8/library/Director/Data/ValueFilter.php000066400000000000000000000002561516513262500257440ustar00rootroot00000000000000createElement('extensibleSet', $name); } } icingaweb2-module-director-1.11.8/library/Director/DataType/DataTypeBoolean.php000066400000000000000000000015071516513262500273770ustar00rootroot00000000000000applyRawViewHelper( $form->createElement('boolean', $name) ); } protected function applyRawViewHelper(ZfElement $element) { $vhClass = 'Zend_Form_Decorator_ViewHelper'; $decorators = $element->getDecorators(); if (array_key_exists($vhClass, $decorators)) { $decorators[$vhClass] = new ViewHelperRaw(); $element->setDecorators($decorators); } return $element; } } icingaweb2-module-director-1.11.8/library/Director/DataType/DataTypeDatalist.php000066400000000000000000000130431516513262500275630ustar00rootroot00000000000000getSetting('behavior', 'strict'); $targetDataType = $this->getSetting('data_type', 'string'); $listId = $this->getSetting('datalist_id'); if ($behavior === 'strict') { $enum = $this->getEntries($form); if ($targetDataType === 'string') { $params['sorted'] = true; $params = ['multiOptions' => $form->optionalEnum($enum)]; $type = 'select'; } else { $params = ['multiOptions' => $form->optionalEnum($enum)]; $type = 'extensibleSet'; } } else { if ($targetDataType === 'string') { $type = 'text'; } else { $type = 'extensibleSet'; } $params['class'] = 'director-suggest'; $params['data-suggestion-context'] = "dataListValuesForListId!$listId"; } $element = $form->createElement($type, $name, $params); if ($behavior === 'suggest_strict') { $element->addValidator(new IsDataListEntry($listId, $form->getDb())); } if ($behavior === 'suggest_extend') { $form->callOnSuccess(function (DirectorForm $form) use ($name, $listId) { $value = (array) $form->getValue($name); if ($value === null) { return; } $db = $form->getDb(); foreach ($value as $entry) { if ($entry !== '') { $this->createEntryIfNotExists($db, $listId, $entry); } } }); } return $element; } /** * @param Db $db * @param $listId * @param $entry */ protected function createEntryIfNotExists(Db $db, $listId, $entry) { if ( ! DirectorDatalistEntry::exists([ 'list_id' => $listId, 'entry_name' => $entry, ], $db) ) { DirectorDatalistEntry::create([ 'list_id' => $listId, 'entry_name' => $entry, 'entry_value' => $entry, ])->store($db); } } protected function getEntries(QuickForm $form) { /** @var DirectorObjectForm $form */ $db = $form->getDb()->getDbAdapter(); $roles = Acl::instance()->listRoleNames(); $select = $db->select() ->from('director_datalist_entry', ['entry_name', 'entry_value']) ->where('list_id = ?', $this->getSetting('datalist_id')) ->order('entry_value ASC'); if (empty($roles)) { $select->where('allowed_roles IS NULL'); } else { $parts = ['allowed_roles IS NULL']; foreach ($roles as $role) { $parts[] = $db->quoteInto("allowed_roles LIKE ?", '%' . \json_encode($role) . '%'); } $select->where('(' . \implode(' OR ', $parts) . ')'); } return $db->fetchPairs($select); } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ public static function addSettingsFormFields(QuickForm $form) { /** @var DirectorObjectForm $form */ $db = $form->getDb(); $form->addElement('select', 'datalist_id', [ 'label' => 'List name', 'required' => true, 'multiOptions' => $form->optionalEnum($db->enumDatalist()), ]); $form->addElement('select', 'data_type', [ 'label' => $form->translate('Target data type'), 'multiOptions' => $form->optionalEnum([ 'string' => $form->translate('String'), 'array' => $form->translate('Array'), ]), 'description' => $form->translate( 'Whether this should be a String or an Array in the generated' . ' Icinga configuration. In case you opt for Array, Director' . ' users will be able to select multiple elements from the list' ), 'required' => true, ]); $form->addElement('select', 'behavior', [ 'label' => $form->translate('Element behavior'), 'value' => 'strict', 'description' => $form->translate( 'This allows to show either a drop-down list or an auto-completion' ), 'multiOptions' => [ 'strict' => $form->translate('Dropdown (list values only)'), $form->translate('Autocomplete') => [ 'suggest_strict' => $form->translate('Strict, list values only'), 'suggest_optional' => $form->translate('Allow for values not on the list'), 'suggest_extend' => $form->translate('Extend the list with new values'), ] ] ]); } } icingaweb2-module-director-1.11.8/library/Director/DataType/DataTypeDictionary.php000066400000000000000000000071771516513262500301360ustar00rootroot00000000000000getObject(); if ($form->isTemplate()) { return $form->createElement('simpleNote', $name, [ 'ignore' => true, 'value' => Html::tag('span', $form->translate('To be managed on objects only')), ]); } if (! $object->hasBeenLoadedFromDb()) { return $form->createElement('simpleNote', $name, [ 'ignore' => true, 'value' => Html::tag( 'span', $form->translate('Can be managed once this object has been created') ), ]); } $params = [ 'varname' => substr($name, 4), ]; if ($object instanceof IcingaHost) { $params['host'] = $object->getObjectName(); } elseif ($object instanceof IcingaService) { $params['host'] = $object->get('host'); $params['service'] = $object->getObjectName(); } return $form->createElement('InstanceSummary', $name, [ 'linkParams' => $params ]); } public static function addSettingsFormFields(QuickForm $form) { /** @var DirectorObjectForm $form */ $db = $form->getDb()->getDbAdapter(); $enum = [ 'host' => $form->translate('Hosts'), 'service' => $form->translate('Services'), ]; $form->addElement('select', 'template_object_type', [ 'label' => $form->translate('Template (Object) Type'), 'description' => $form->translate( 'Please choose a specific Icinga object type' ), 'class' => 'autosubmit', 'required' => true, 'multiOptions' => $form->optionalEnum($enum), 'sorted' => true, ]); // There should be a helper method for this if ($form->hasBeenSent()) { $type = $form->getSentOrObjectValue('template_object_type'); } else { $type = $form->getObject()->getSetting('template_object_type'); } if (empty($type)) { return $form; } if (array_key_exists($type, $enum)) { $form->addElement('select', 'template_name', [ 'label' => $form->translate('Template'), 'multiOptions' => $form->optionalEnum(self::fetchTemplateNames($db, $type)), 'required' => true, ]); } else { throw new RuntimeException("$type is not a valid Dictionary object type"); } return $form; } protected static function fetchTemplateNames($db, $type) { $query = $db->select() ->from("icinga_$type", ['a' => 'object_name', 'b' => 'object_name']) ->where('object_type = ?', 'template') ->where('template_choice_id IS NULL') ->order('object_name'); return $db->fetchPairs($query); } } icingaweb2-module-director-1.11.8/library/Director/DataType/DataTypeDirectorObject.php000066400000000000000000000060241516513262500307210ustar00rootroot00000000000000getDb()->getDbAdapter(); $type = $this->getSetting('icinga_object_type'); $dummy = IcingaObject::createByType($type); $display = in_array($type, ['service_set', 'notification']) ? 'object_name' : 'COALESCE(display_name, object_name)'; $query = $db->select()->from($dummy->getTableName(), [ 'object_name' => 'object_name', 'display_name' => $display ])->order($display); if ($type === 'service_set') { $query->where('host_id IS NULL'); } elseif ($type === 'notification') { $query->where('object_type = ?', 'apply'); } else { $query->where('object_type = ?', 'object'); } $enum = $db->fetchPairs($query); $params = []; if ($this->getSetting('data_type') === 'array') { $elementType = $type === 'notification' ? 'select' : 'extensibleSet'; $params['sorted'] = true; $params = ['multiOptions' => $enum]; } else { $params = ['multiOptions' => [ null => $form->translate('- please choose -'), ] + $enum]; $elementType = 'select'; } return $form->createElement($elementType, $name, $params); } public static function addSettingsFormFields(QuickForm $form) { $enum = [ 'host' => $form->translate('Hosts'), 'hostgroup' => $form->translate('Host groups'), 'notification' => $form->translate('Notification Apply Rules'), 'service' => $form->translate('Services'), 'servicegroup' => $form->translate('Service groups'), 'service_set' => $form->translate('Service Set'), 'user' => $form->translate('Users'), 'usergroup' => $form->translate('User groups'), ]; $form->addElement('select', 'icinga_object_type', [ 'label' => $form->translate('Object'), 'description' => $form->translate( 'Please choose a specific Icinga object type' ), 'required' => true, 'multiOptions' => $form->optionalEnum($enum), 'sorted' => true, ]); $form->addElement('select', 'data_type', [ 'label' => $form->translate('Target data type'), 'multiOptions' => $form->optionalEnum([ 'string' => $form->translate('String'), 'array' => $form->translate('Array'), ]), 'required' => true, ]); return $form; } } icingaweb2-module-director-1.11.8/library/Director/DataType/DataTypeNumber.php000066400000000000000000000007321516513262500272470ustar00rootroot00000000000000createElement('text', $name) ->addValidator('int') ->addFilter(new FilterInt()); return $element; } } icingaweb2-module-director-1.11.8/library/Director/DataType/DataTypeSqlQuery.php000066400000000000000000000052721516513262500276100ustar00rootroot00000000000000fetchData(); $error = false; } catch (Exception $e) { $data = array(); $error = sprintf($form->translate('Unable to fetch data: %s'), $e->getMessage()); } $params = []; if ($this->getSetting('data_type') === 'array') { $type = 'extensibleSet'; $params['sorted'] = true; $params = ['multiOptions' => $data]; } else { $params = ['multiOptions' => [ null => $form->translate('- please choose -'), ] + $data]; $type = 'select'; } $element = $form->createElement($type, $name, $params); if ($error) { $element->addError($error); } return $element; } protected function fetchData() { // TODO: Hash _:) //if (self::$cachedResult === null || (time() - self::$cacheTime > 3)) { self::$cachedResult = $this->db()->fetchPairs($this->settings['query']); self::$cacheTime = time(); // } return self::$cachedResult; } public static function addSettingsFormFields(QuickForm $form) { Util::addDbResourceFormElement($form, 'resource'); $form->addElement('textarea', 'query', array( 'label' => 'DB Query', 'description' => 'This query should return exactly two columns, value and label', 'required' => true, 'rows' => 10, )); $form->addElement('select', 'data_type', [ 'label' => $form->translate('Target data type'), 'multiOptions' => $form->optionalEnum([ 'string' => $form->translate('String'), 'array' => $form->translate('Array'), ]), 'value' => 'string', 'required' => true, ]); return $form; } protected function db() { if ($this->db === null) { $this->db = DbConnection::fromResourceName($this->settings['resource'])->getDbAdapter(); // TODO: should be handled by resources: $this->db->exec("SET NAMES 'utf8'"); } return $this->db; } } icingaweb2-module-director-1.11.8/library/Director/DataType/DataTypeString.php000066400000000000000000000017361516513262500272720ustar00rootroot00000000000000getSetting('visibility', 'visible') === 'visible') { $element = $form->createElement('text', $name); } else { $element = $form->createElement('storedPassword', $name); } return $element; } public static function addSettingsFormFields(QuickForm $form) { $form->addElement('select', 'visibility', [ 'label' => $form->translate('Visibility'), 'multiOptions' => $form->optionalEnum([ 'visible' => $form->translate('Visible'), 'hidden' => $form->translate('Hidden'), ]), 'value' => 'visible', 'required' => true, ]); return $form; } } icingaweb2-module-director-1.11.8/library/Director/DataType/DataTypeTime.php000066400000000000000000000005261516513262500267160ustar00rootroot00000000000000createElement('text', $name); return $element; } } icingaweb2-module-director-1.11.8/library/Director/Db.php000066400000000000000000000514761516513262500232100ustar00rootroot00000000000000getDbAdapter(); } /** * @param $callable * @return $this * @throws Exception */ public function runFailSafeTransaction($callable) { if (! is_callable($callable)) { throw new RuntimeException(__METHOD__ . ' needs a Callable'); } $db = $this->db(); $db->beginTransaction(); try { $callable(); $db->commit(); } catch (Exception $e) { try { $db->rollback(); } catch (Exception $e) { // Well... there is nothing we can do here. } throw $e; } return $this; } public static function fromResourceName($name) { $connection = new static(ResourceFactory::getResourceConfig($name)); if ($connection->isMysql()) { $connection->setClientTimezoneForMysql(); } elseif ($connection->isPgsql()) { $connection->setClientTimezoneForPgsql(); } return $connection; } protected function getTimezoneOffset() { $tz = new DateTimeZone(date_default_timezone_get()); $offset = $tz->getOffset(new DateTime()); $prefix = $offset >= 0 ? '+' : '-'; $offset = abs($offset); $hours = (int) floor($offset / 3600); $minutes = (int) floor(($offset % 3600) / 60); return sprintf('%s%d:%02d', $prefix, $hours, $minutes); } protected function setClientTimezoneForMysql() { $db = $this->getDbAdapter(); $db->query($db->quoteInto('SET time_zone = ?', $this->getTimezoneOffset())); } protected function setClientTimezoneForPgsql() { $db = $this->getDbAdapter(); $db->query($db->quoteInto('SET TIME ZONE INTERVAL ? HOUR TO MINUTE', $this->getTimezoneOffset())); } public function countActivitiesSinceLastDeployedConfig(IcingaObject $object = null) { $db = $this->db(); $query = 'SELECT COUNT(*) FROM director_activity_log WHERE id > COALESCE((' . ' SELECT id FROM director_activity_log WHERE checksum = (' . ' SELECT last_activity_checksum FROM director_generated_config WHERE checksum = (' . ' SELECT config_checksum FROM director_deployment_log ORDER by id desc limit 1' . ' )' . ' )' . '), 0)'; if ($object !== null) { $query .= $db->quoteInto(' AND object_type = ?', $object->getTableName()); $query .= $db->quoteInto(' AND object_name = ?', $object->getObjectName()); } return (int) $db->fetchOne($query); } // TODO: use running config?! public function getLastDeploymentActivityLogId() { $db = $this->db(); $query = ' SELECT COALESCE(id, 0) AS id FROM director_activity_log WHERE checksum = (' . ' SELECT last_activity_checksum FROM director_generated_config WHERE checksum = (' . ' SELECT config_checksum FROM director_deployment_log ORDER by id desc limit 1' . ' )' . ')'; return (int) $db->fetchOne($query); } public function settings() { if ($this->settings === null) { $this->settings = new Settings($this); } return $this->settings; } public function getMasterZoneName() { if ($this->masterZoneName === null) { $this->masterZoneName = $this->detectMasterZoneName(); } return $this->masterZoneName; } protected function detectMasterZoneName() { if ($zone = $this->settings()->master_zone) { return $zone; } $db = $this->db(); $query = $db->select() ->from('icinga_zone', 'object_name') ->where('parent_id IS NULL') ->where('is_global = ?', 'n'); $zones = $db->fetchCol($query); if (count($zones) === 1) { return $zones[0]; } return 'master'; } public function getDefaultGlobalZoneName() { return $this->settings()->default_global_zone; } public function hasDeploymentEndpoint() { $db = $this->db(); $query = $db->select()->from( array('z' => 'icinga_zone'), array('cnt' => 'COUNT(*)') )->join( array('e' => 'icinga_endpoint'), 'e.zone_id = z.id', array() )->join( array('au' => 'icinga_apiuser'), 'e.apiuser_id = au.id', array() )->where('z.object_name = ?', $this->getMasterZoneName()); return $db->fetchOne($query) > 0; } public function getEndpointNamesInDeploymentZone() { $db = $this->db(); $query = $db->select()->from( array('z' => 'icinga_zone'), array('object_name' => 'e.object_name') )->join( array('e' => 'icinga_endpoint'), 'e.zone_id = z.id', array() )->join( array('au' => 'icinga_apiuser'), 'e.apiuser_id = au.id', array() )->where('z.object_name = ?', $this->getMasterZoneName()) ->order('e.object_name ASC'); return $db->fetchCol($query) ?: []; } public function getDeploymentEndpointName() { $db = $this->db(); $query = $db->select()->from( array('z' => 'icinga_zone'), array('object_name' => 'e.object_name') )->join( array('e' => 'icinga_endpoint'), 'e.zone_id = z.id', array() )->join( array('au' => 'icinga_apiuser'), 'e.apiuser_id = au.id', array() )->where('z.object_name = ?', $this->getMasterZoneName()) ->order('e.object_name ASC') ->limit(1); $name = $db->fetchOne($query); if (! $name) { throw new ConfigurationError( 'Unable to detect your deployment endpoint. I was looking for' . ' the first endpoint configured with an assigned API user' . ' in the "%s" zone.', $this->getMasterZoneName() ); } return $name; } /** * @return IcingaEndpoint */ public function getDeploymentEndpoint() { return IcingaEndpoint::load($this->getDeploymentEndpointName(), $this); } public function getActivitylogNeighbors($id, $type = null, $name = null) { $db = $this->db(); $greater = $db->select()->from( array('g' => 'director_activity_log'), array('id' => 'MIN(g.id)') )->where('id > ?', (int) $id); $smaller = $db->select()->from( array('l' => 'director_activity_log'), array('id' => 'MAX(l.id)') )->where('id < ?', (int) $id); if ($type !== null) { $greater->where('object_type = ?', $type); $smaller->where('object_type = ?', $type); } if ($name !== null) { $greater->where('object_name = ?', $name); $smaller->where('object_name = ?', $name); } $query = $db->select()->from( array('gt' => $greater), array( 'prev' => 'lt.id', 'next' => 'gt.id' ) )->join( array('lt' => $smaller), '1 = 1', array() ); return $db->fetchRow($query); } public function fetchActivityLogEntryById($id) { $sql = 'SELECT id, object_type, object_name, action_name,' . ' old_properties, new_properties, author, change_time,' . ' UNIX_TIMESTAMP(change_time) AS change_time_ts,' . ' %s AS checksum, %s AS parent_checksum' . ' FROM director_activity_log WHERE id = %d'; $sql = sprintf( $sql, $this->dbHexFunc('checksum'), $this->dbHexFunc('parent_checksum'), $id ); return $this->db()->fetchRow($sql); } public function fetchActivityLogChecksumById($id, $binary = true) { $sql = sprintf( 'SELECT' . ' %s AS checksum FROM director_activity_log WHERE id = %d', $this->dbHexFunc('checksum'), (int) $id ); $result = $this->db()->fetchOne($sql); if ($binary) { return hex2bin($result); } else { return $result; } } public function fetchActivityLogIdByChecksum($checksum) { $sql = 'SELECT id FROM director_activity_log WHERE checksum = ?'; return $this->db()->fetchOne( $this->db()->quoteInto($sql, $this->quoteBinary($checksum)) ); } public function fetchActivityLogEntry($checksum) { $db = $this->db(); $sql = 'SELECT id, object_type, object_name, action_name,' . ' old_properties, new_properties, author, change_time,' . ' UNIX_TIMESTAMP(change_time) AS change_time_ts,' . ' %s AS checksum, %s AS parent_checksum' . ' FROM director_activity_log WHERE checksum = ?'; $sql = sprintf( $sql, $this->dbHexFunc('checksum'), $this->dbHexFunc('parent_checksum') ); return $db->fetchRow( $db->quoteInto($sql, $this->quoteBinary(hex2bin($checksum))) ); } public function getLastActivityChecksum() { $select = "SELECT checksum FROM (SELECT * FROM (SELECT 1 AS pos, " . $this->dbHexFunc('checksum') . " AS checksum" . " FROM director_activity_log ORDER BY id DESC LIMIT 1) a" . " UNION SELECT 2 AS pos, '' AS checksum) u ORDER BY pos LIMIT 1"; return $this->db()->fetchOne($select); } public function fetchImportStatistics() { $query = "SELECT 'imported_properties' AS stat_name, COUNT(*) AS stat_value" . " FROM import_run i" . " JOIN imported_rowset_row rs ON i.rowset_checksum = rs.rowset_checksum" . " JOIN imported_row_property rp ON rp.row_checksum = rs.row_checksum" . " UNION ALL" . " SELECT 'imported_rows' AS stat_name, COUNT(*) AS stat_value" . " FROM import_run i" . " JOIN imported_rowset_row rs ON i.rowset_checksum = rs.rowset_checksum" . " UNION ALL" . " SELECT 'unique_rows' AS stat_name, COUNT(*) AS stat_value" . " FROM imported_row" . " UNION ALL" . " SELECT 'unique_properties' AS stat_name, COUNT(*) AS stat_value" . " FROM imported_property" ; return $this->db()->fetchPairs($query); } public function getImportrunRowsetChecksum($id) { $db = $this->db(); $query = $db->select() ->from(array('r' => 'import_run'), $this->dbHexFunc('r.rowset_checksum')) ->where('r.id = ?', $id); return $db->fetchOne($query); } protected function fetchTemplateRelations($type) { $db = $this->db(); $query = $db->select()->from( array('p' => 'icinga_' . $type), array( 'name' => 'o.object_name', 'parent' => 'p.object_name' ) )->join( array('i' => 'icinga_' . $type . '_inheritance'), 'p.id = i.parent_' . $type . '_id', array() )->join( array('o' => 'icinga_' . $type), 'o.id = i.' . $type . '_id', array() )->where("o.object_type = 'template'") ->order('p.object_name') ->order('o.object_name'); return $db->fetchAll($query); } public function fetchTemplateTree($type) { $relations = $this->fetchTemplateRelations($type); $children = array(); $objects = array(); foreach ($relations as $rel) { foreach (array('name', 'parent') as $col) { if (! array_key_exists($rel->$col, $objects)) { $objects[$rel->$col] = (object) array( 'name' => $rel->$col, 'children' => array() ); } } } foreach ($relations as $rel) { $objects[$rel->parent]->children[$rel->name] = $objects[$rel->name]; $children[$rel->name] = $rel->parent; } foreach ($children as $name => $object) { unset($objects[$name]); } return $objects; } public function getLatestImportedChecksum($source) { $db = $this->db(); $lastRun = $db->select()->from( array('r' => 'import_run'), array('last_checksum' => $this->dbHexFunc('r.rowset_checksum')) ); if (is_int($source) || ctype_digit($source)) { $lastRun->where('source_id = ?', (int) $source); } else { $lastRun->where('source_name = ?', $source); } $lastRun->order('start_time DESC')->limit(1); return $db->fetchOne($lastRun); } public function getObjectSummary() { $types = array( 'host', 'hostgroup', 'service', 'servicegroup', 'user', 'usergroup', 'command', 'timeperiod', 'scheduled_downtime', 'notification', 'apiuser', 'endpoint', 'zone', 'dependency', ); $queries = array(); $db = $this->db(); $cnt = "COALESCE(SUM(CASE WHEN o.object_type = '%s' THEN 1 ELSE 0 END), 0)"; foreach ($types as $type) { $queries[] = $db->select()->from( array('o' => 'icinga_' . $type), array( 'icinga_type' => "('" . $type . "')", 'cnt_object' => sprintf($cnt, 'object'), 'cnt_template' => sprintf($cnt, 'template'), 'cnt_external' => sprintf($cnt, 'external_object'), 'cnt_total' => 'COUNT(*)', ) ); } $query = $this->db()->select()->union($queries, Zend_Db_Select::SQL_UNION_ALL); $result = array(); foreach ($db->fetchAll($query) as $row) { $result[$row->icinga_type] = $row; } return $result; } public function enumCommands() { return $this->enumIcingaObjects('command'); } public function enumCommandTemplates() { return $this->enumIcingaTemplates('command'); } public function enumTimeperiods() { return $this->enumIcingaObjects('timeperiod'); } public function enumCheckcommands() { $filters = array( 'methods_execute IN (?)' => array('PluginCheck', 'IcingaCheck'), ); return $this->enumIcingaObjects('command', $filters); } public function enumEventcommands() { $filters = array( 'methods_execute = ?' => 'PluginEvent', ); return $this->enumIcingaObjects('command', $filters); } public function enumNotificationCommands() { $filters = array( 'methods_execute IN (?)' => array('PluginNotification'), ); return $this->enumIcingaObjects('command', $filters); } public function getZoneName($id) { $objects = $this->enumZones(); return $objects[$id]; } public function getCommandName($id) { $objects = $this->enumCommands(); return $objects[$id]; } public function enumZones() { return $this->enumIcingaObjects('zone'); } public function enumNonglobalZones() { $filters = array('is_global = ?' => 'n'); return $this->enumIcingaObjects('zone', $filters); } public function enumZoneTemplates() { return $this->enumIcingaTemplates('zone'); } public function enumHosts() { return $this->enumIcingaObjects('host'); } public function enumHostTemplates() { return $this->enumIcingaTemplates('host'); } public function enumHostgroups() { return $this->enumIcingaObjects('hostgroup'); } public function enumServices() { return $this->enumIcingaObjects('service'); } public function enumServiceTemplates() { return $this->enumIcingaTemplates('service'); } public function enumServicegroups() { return $this->enumIcingaObjects('servicegroup'); } public function enumUsers() { return $this->enumIcingaObjects('user'); } public function enumUserTemplates() { return $this->enumIcingaTemplates('user'); } public function enumUsergroups() { return $this->enumIcingaObjects('usergroup'); } public function enumApiUsers() { return $this->enumIcingaObjects('apiuser'); } public function enumSyncRule() { return $this->enum('sync_rule', array('id', 'rule_name')); } public function enumImportSource() { return $this->enum('import_source', array('id', 'source_name')); } public function enumDatalist() { return $this->enum('director_datalist', array('id', 'list_name')); } public function enumDatafields() { return $this->enum('director_datafield', array( 'id', "caption || ' (' || varname || ')'", )); } public function enum($table, $columns = null, $filters = array()) { if ($columns === null) { $columns = array('id', 'object_name'); } $select = $this->db()->select()->from($table, $columns)->order($columns[1]); foreach ($filters as $key => $val) { $select->where($key, $val); } return $this->db()->fetchPairs($select); } public function enumIcingaObjects($type, $filters = array()) { $filters = array( 'object_type IN (?)' => array('object', 'external_object') ) + $filters; return $this->enum('icinga_' . $type, null, $filters); } public function enumIcingaTemplates($type, $filters = array()) { $filters = array('object_type = ?' => 'template') + $filters; return $this->enum('icinga_' . $type, null, $filters); } public function fetchDistinctHostVars() { $select = $this->db()->select()->distinct()->from( array('hv' => 'icinga_host_var'), array( 'varname' => 'hv.varname', 'format' => 'hv.format', 'caption' => 'df.caption', 'datatype' => 'df.datatype' ) )->joinLeft( array('df' => 'director_datafield'), 'df.varname = hv.varname', array() )->order('varname'); return $this->db()->fetchAll($select); } public function fetchDistinctServiceVars() { $select = $this->db()->select()->distinct()->from( array('sv' => 'icinga_service_var'), array( 'varname' => 'sv.varname', 'format' => 'sv.format', 'caption' => 'df.caption', 'datatype' => 'df.datatype' ) )->joinLeft( array('df' => 'director_datafield'), 'df.varname = sv.varname', array() )->order('varname'); return $this->db()->fetchAll($select); } public function dbHexFunc($column) { if ($this->isPgsql()) { return sprintf("LOWER(ENCODE(%s, 'hex'))", $column); } else { return sprintf("LOWER(HEX(%s))", $column); } } public function enumDeployedConfigs() { $db = $this->db(); $columns = array( 'checksum' => $this->dbHexFunc('c.checksum'), ); if ($this->isPgsql()) { $columns['caption'] = 'SUBSTRING(' . $columns['checksum'] . ' FROM 1 FOR 7)'; } else { $columns['caption'] = 'SUBSTRING(' . $columns['checksum'] . ', 1, 7)'; } $query = $db->select()->from( array('l' => 'director_deployment_log'), $columns )->joinLeft( array('c' => 'director_generated_config'), 'c.checksum = l.config_checksum', array() )->order('l.start_time DESC'); return $db->fetchPairs($query); } } icingaweb2-module-director-1.11.8/library/Director/Db/000077500000000000000000000000001516513262500224625ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Db/AppliedServiceSetLoader.php000066400000000000000000000025751516513262500277060ustar00rootroot00000000000000host = $host; } /** * @return IcingaServiceSet[] */ public static function fetchForHost(IcingaHost $host) { $loader = new static($host); return $loader->fetchAppliedServiceSets(); } /** * @return IcingaServiceSet[] */ protected function fetchAppliedServiceSets() { $sets = array(); $matcher = HostApplyMatches::prepare($this->host); foreach ($this->fetchAllServiceSets() as $set) { $filter = Filter::fromQueryString($set->get('assign_filter')); if ($matcher->matchesFilter($filter)) { $sets[] = $set; } } return $sets; } /** * @return IcingaServiceSet[] */ protected function fetchAllServiceSets() { $db = $this->host->getDb(); $query = $db ->select() ->from('icinga_service_set') ->where('assign_filter IS NOT NULL'); return IcingaServiceSet::loadAll($this->host->getConnection(), $query); } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/000077500000000000000000000000001516513262500236575ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Db/Branch/Branch.php000066400000000000000000000107141516513262500255700ustar00rootroot00000000000000uuid)) { $row->uuid = stream_get_contents($row->uuid); } if (strlen($row->uuid) !== 16) { throw new RuntimeException('Valid UUID expected, got ' . var_export($row->uuid, true)); } $self->branchUuid = Uuid::fromBytes(Db\DbUtil::binaryResult($row->uuid)); $self->name = $row->branch_name; $self->owner = $row->owner; $self->description = $row->description; $self->tsMergeRequest = $row->ts_merge_request; if (isset($row->cnt_activities)) { $self->cntActivities = $row->cnt_activities; } else { $self->cntActivities = 0; } return $self; } /** * @return Branch */ public static function detect(BranchStore $store) { try { return static::forRequest(Icinga::app()->getRequest(), $store, Auth::getInstance()); } catch (\Exception $e) { return new static(); } } /** * @param Request $request * @param Db $db * @param Auth $auth * @return Branch */ public static function forRequest(Request $request, BranchStore $store, Auth $auth) { if ($hook = static::optionalHook()) { return $hook->getBranchForRequest($request, $store, $auth); } return new Branch(); } /** * @return BranchSupportHook */ public static function requireHook() { if ($hook = static::optionalHook()) { return $hook; } throw new RuntimeException('BranchSupport Hook requested where not available'); } /** * @return BranchSupportHook|null */ public static function optionalHook() { return Hook::first('director/BranchSupport'); } /** * @param UuidInterface $uuid * @return Branch */ public static function withUuid(UuidInterface $uuid) { $self = new static(); $self->branchUuid = $uuid; return $self; } /** * @return bool */ public function isBranch() { return $this->branchUuid !== null; } public function assertBranch() { if ($this->isMain()) { throw new RuntimeException('Branch expected, but working in main branch'); } } /** * @return bool */ public function isMain() { return $this->branchUuid === null; } /** * @return bool */ public function shouldBeMerged() { return $this->tsMergeRequest !== null; } /** * @return bool */ public function isEmpty() { return $this->cntActivities === 0; } /** * @return int */ public function getActivityCount() { return $this->cntActivities; } /** * @return UuidInterface|null */ public function getUuid() { return $this->branchUuid; } /** * @return string */ public function getName() { return $this->name; } /** * @since v1.10.0 * @return string */ public function getDescription() { return $this->description; } /** * @since v1.10.0 * @param ?string $description * @return void */ public function setDescription($description) { $this->description = $description; } /** * @return string */ public function getOwner() { return $this->owner; } public function isSyncPreview() { return (bool) preg_match('/^' . preg_quote(self::PREFIX_SYNC_PREVIEW, '/') . '\//', $this->getName()); } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/BranchActivity.php000066400000000000000000000262151516513262500273100ustar00rootroot00000000000000objectUuid = $objectUuid; $this->branchUuid = $branchUuid; $this->action = $action; $this->objectTable = $objectType; $this->author = $author; $this->modifiedProperties = $modifiedProperties; $this->formerProperties = $formerProperties; } public static function deleteObject(DbObject $object, Branch $branch) { return new static( $object->getUniqueId(), $branch->getUuid(), self::ACTION_DELETE, $object->getTableName(), Auth::getInstance()->getUser()->getUsername(), SerializableValue::fromSerialization(null), SerializableValue::fromSerialization(self::getFormerObjectProperties($object)) ); } public static function forDbObject(DbObject $object, Branch $branch) { if (! $object->hasBeenModified()) { throw new InvalidArgumentException('Cannot get modifications for unmodified object'); } if (! $branch->isBranch()) { throw new InvalidArgumentException('Branch activity requires an active branch'); } $author = Auth::getInstance()->getUser()->getUsername(); if ($object instanceof IcingaObject && $object->shouldBeRemoved()) { $action = self::ACTION_DELETE; $old = self::getFormerObjectProperties($object); $new = null; } elseif ($object->hasBeenLoadedFromDb()) { $action = self::ACTION_MODIFY; $old = self::getFormerObjectProperties($object); $new = self::getObjectProperties($object); } else { $action = self::ACTION_CREATE; $old = null; $new = self::getObjectProperties($object); } if ($new !== null) { $new = PlainObjectPropertyDiff::calculate( $old, $new ); } return new static( $object->getUniqueId(), $branch->getUuid(), $action, $object->getTableName(), $author, SerializableValue::fromSerialization($new), SerializableValue::fromSerialization($old) ); } public static function fixFakeTimestamp($timestampNs) { if ($timestampNs < 1600000000 * 1000000) { // fake TS for cloned branch in sync preview return (int) $timestampNs * 1000000; } return $timestampNs; } public function applyToDbObject(DbObject $object) { if (!$this->isActionModify()) { throw new RuntimeException('Only BranchActivity instances with action=modify can be applied'); } foreach ($this->getModifiedProperties()->jsonSerialize() as $key => $value) { $object->set($key, $value); } return $object; } /** * Hint: $connection is required, because setting groups triggered loading them. * Should be investigated, as in theory $hostWithoutConnection->groups = 'group' * is expected to work * @param Db $connection * @return DbObject|string */ public function createDbObject(Db $connection) { if (!$this->isActionCreate()) { throw new RuntimeException('Only BranchActivity instances with action=create can create objects'); } $class = DbObjectTypeRegistry::classByType($this->getObjectTable()); $object = $class::create([], $connection); $object->setUniqueId($this->getObjectUuid()); foreach ($this->getModifiedProperties()->jsonSerialize() as $key => $value) { $object->set($key, $value); } return $object; } public function deleteDbObject(DbObject $object) { if (!$this->isActionDelete()) { throw new RuntimeException('Only BranchActivity instances with action=delete can delete objects'); } return $object->delete(); } public static function load($ts, Db $connection) { $db = $connection->getDbAdapter(); $row = $db->fetchRow( $db->select()->from('director_branch_activity')->where('timestamp_ns = ?', $ts) ); if ($row) { return static::fromDbRow($row); } throw new NotFoundError('Not found'); } protected static function fixPgResource(&$value) { if (is_resource($value)) { $value = stream_get_contents($value); } } public static function fromDbRow($row) { static::fixPgResource($row->object_uuid); static::fixPgResource($row->branch_uuid); $activity = new static( Uuid::fromBytes($row->object_uuid), Uuid::fromBytes($row->branch_uuid), $row->action, $row->object_table, $row->author, SerializableValue::fromSerialization(Json::decodeOptional($row->modified_properties)), SerializableValue::fromSerialization(Json::decodeOptional($row->former_properties)) ); $activity->timestampNs = $row->timestamp_ns; return $activity; } /** * Must be run in a transaction! Repeatable read? * @param Db $connection * @throws \Icinga\Module\Director\Exception\JsonEncodeException * @throws \Zend_Db_Adapter_Exception */ public function store(Db $connection) { if ($this->timestampNs !== null) { throw new InvalidArgumentException(sprintf( 'Cannot store activity with a given timestamp: %s', $this->timestampNs )); } $db = $connection->getDbAdapter(); $last = $db->fetchRow( $db->select()->from('director_branch_activity', ['timestamp_ns' => 'MAX(timestamp_ns)']) ); if (PHP_INT_SIZE !== 8) { throw new RuntimeException('PHP with 64bit integer support is required'); } $timestampNs = (int) floor(microtime(true) * 1000000); if ($last) { if ($last->timestamp_ns >= $timestampNs) { $timestampNs = $last + 1; } } $old = Json::encode($this->formerProperties); $new = Json::encode($this->modifiedProperties); $db->insert(self::DB_TABLE, [ 'timestamp_ns' => $timestampNs, 'object_uuid' => $connection->quoteBinary($this->objectUuid->getBytes()), 'branch_uuid' => $connection->quoteBinary($this->branchUuid->getBytes()), 'action' => $this->action, 'object_table' => $this->objectTable, 'author' => $this->author, 'former_properties' => $old, 'modified_properties' => $new, ]); } /** * @return int */ public function getTimestampNs() { return $this->timestampNs; } /** * @return int */ public function getTimestamp() { return (int) floor(BranchActivity::fixFakeTimestamp($this->timestampNs) / 1000000); } /** * @return UuidInterface */ public function getObjectUuid() { return $this->objectUuid; } /** * @return UuidInterface */ public function getBranchUuid() { return $this->branchUuid; } /** * @return string */ public function getObjectName() { if ($this->objectTable === BranchSupport::TABLE_ICINGA_SERVICE && $host = $this->getProperty('host')) { $suffix = " ($host)"; } else { $suffix = ''; } return $this->getProperty('object_name', 'unknown object name') . $suffix; } /** * @return string */ public function getAction() { return $this->action; } public function isActionDelete() { return $this->action === self::ACTION_DELETE; } public function isActionCreate() { return $this->action === self::ACTION_CREATE; } public function isActionModify() { return $this->action === self::ACTION_MODIFY; } /** * @return string */ public function getObjectTable() { return $this->objectTable; } /** * @return string */ public function getAuthor() { return $this->author; } /** * @return ?SerializableValue */ public function getModifiedProperties() { return $this->modifiedProperties; } /** * @return ?SerializableValue */ public function getFormerProperties() { return $this->formerProperties; } public function getProperty($key, $default = null) { if ($this->modifiedProperties) { $properties = $this->modifiedProperties->jsonSerialize(); if (isset($properties->$key)) { return $properties->$key; } } if ($this->formerProperties) { $properties = $this->formerProperties->jsonSerialize(); if (isset($properties->$key)) { return $properties->$key; } } return $default; } protected static function getFormerObjectProperties(DbObject $object) { if (! $object instanceof IcingaObject) { throw new RuntimeException('Plain object helpers for DbObject must be implemented'); } return (array) $object->getPlainUnmodifiedObject(); } protected static function getObjectProperties(DbObject $object) { if (! $object instanceof IcingaObject) { throw new RuntimeException('Plain object helpers for DbObject must be implemented'); } return (array) $object->toPlainObject(false, true); } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/BranchMerger.php000066400000000000000000000126171516513262500267360ustar00rootroot00000000000000branchUuid = $branchUuid; $this->db = $connection->getDbAdapter(); $this->connection = $connection; } /** * Skip a delete operation, when the object to be deleted does not exist * * @param bool $ignore */ public function ignoreDeleteWhenMissing($ignore = true) { $this->ignoreDeleteWhenMissing = $ignore; } /** * Skip a modification, when the related object does not exist * @param bool $ignore */ public function ignoreModificationWhenMissing($ignore = true) { $this->ignoreModificationWhenMissing = $ignore; } /** * @param int $key */ public function ignoreActivity($key) { $this->ignoreActivities[$key] = true; } /** * @param BranchActivity $activity * @return bool */ public function ignoresActivity(BranchActivity $activity) { return isset($this->ignoreActivities[$activity->getTimestampNs()]); } /** * @throws MergeError */ public function merge($comment = null) { $username = DirectorActivityLog::username(); $this->connection->runFailSafeTransaction(function () use ($comment, $username) { $formerActivityId = (int) DirectorActivityLog::loadLatest($this->connection)->get('id'); $query = $this->db->select() ->from(BranchActivity::DB_TABLE) ->where('branch_uuid = ?', $this->connection->quoteBinary($this->branchUuid->getBytes())) ->order('timestamp_ns ASC'); $rows = $this->db->fetchAll($query); foreach ($rows as $row) { $activity = BranchActivity::fromDbRow($row); $author = $activity->getAuthor(); if ($username !== $author) { DirectorActivityLog::overrideUsername("$author/$username"); } $this->applyModification($activity); } (new BranchStore($this->connection))->deleteByUuid($this->branchUuid); $currentActivityId = (int) DirectorActivityLog::loadLatest($this->connection)->get('id'); $firstActivityId = (int) $this->db->fetchOne( $this->db->select()->from('director_activity_log', 'MIN(id)')->where('id > ?', $formerActivityId) ); if ($comment && strlen($comment)) { $this->db->insert('director_activity_log_remark', [ 'first_related_activity' => $firstActivityId, 'last_related_activity' => $currentActivityId, 'remark' => $comment, ]); } }); DirectorActivityLog::restoreUsername(); } /** * @param BranchActivity $activity * @throws MergeError * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function applyModification(BranchActivity $activity) { /** @var string|DbObject $class */ $class = DbObjectTypeRegistry::classByType($activity->getObjectTable()); $uuid = $activity->getObjectUuid(); $exists = $class::uniqueIdExists($uuid, $this->connection); if ($activity->isActionCreate()) { if ($exists) { if (! $this->ignoresActivity($activity)) { throw new MergeErrorRecreateOnMerge($activity); } } else { $activity->createDbObject($this->connection)->store($this->connection); } } elseif ($activity->isActionDelete()) { if ($exists) { $activity->deleteDbObject($class::requireWithUniqueId($uuid, $this->connection)); } elseif (! $this->ignoreDeleteWhenMissing && ! $this->ignoresActivity($activity)) { throw new MergeErrorDeleteMissingObject($activity); } } else { if ($exists) { $activity->applyToDbObject($class::requireWithUniqueId($uuid, $this->connection))->store(); // TODO: you modified an object, and related properties have been changed in the meantime. // We're able to detect this with the given data, and might want to offer a rebase. } elseif (! $this->ignoreModificationWhenMissing && ! $this->ignoresActivity($activity)) { throw new MergeErrorModificationForMissingObject($activity); } } } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/BranchModificationInspection.php000066400000000000000000000075001516513262500321510ustar00rootroot00000000000000connection = $connection; $this->db = $connection->getDbAdapter(); } public function describe($table, UuidInterface $uuid) { return static::describeModificationStatistics($this->loadSingleTableStats($table, $uuid)); } public function describeBranch(UuidInterface $uuid) { $tables = [ $this->translate('API Users') => BranchSupport::BRANCHED_TABLE_ICINGA_APIUSER, $this->translate('Endpoints') => BranchSupport::BRANCHED_TABLE_ICINGA_COMMAND, $this->translate('Zones') => BranchSupport::BRANCHED_TABLE_ICINGA_DEPENDENCY, $this->translate('Commands') => BranchSupport::BRANCHED_TABLE_ICINGA_ENDPOINT, $this->translate('Hosts') => BranchSupport::BRANCHED_TABLE_ICINGA_HOST, $this->translate('Hostgroups') => BranchSupport::BRANCHED_TABLE_ICINGA_HOSTGROUP, $this->translate('Services') => BranchSupport::BRANCHED_TABLE_ICINGA_NOTIFICATION, $this->translate('Servicegroups') => BranchSupport::BRANCHED_TABLE_ICINGA_SCHEDULED_DOWNTIME, $this->translate('Servicesets') => BranchSupport::BRANCHED_TABLE_ICINGA_SERVICE_SET, $this->translate('Users') => BranchSupport::BRANCHED_TABLE_ICINGA_SERVICE, $this->translate('Usergroups') => BranchSupport::BRANCHED_TABLE_ICINGA_SERVICEGROUP, $this->translate('Timeperiods') => BranchSupport::BRANCHED_TABLE_ICINGA_TIMEPERIOD, $this->translate('Notifications') => BranchSupport::BRANCHED_TABLE_ICINGA_USER, $this->translate('Dependencies') => BranchSupport::BRANCHED_TABLE_ICINGA_USERGROUP, $this->translate('Scheduled Downtimes') => BranchSupport::BRANCHED_TABLE_ICINGA_ZONE, ]; $parts = new HtmlDocument(); $parts->setSeparator(Html::tag('br')); foreach ($tables as $label => $table) { $info = $this->describe($table, $uuid); if (! empty($info) && $info !== '-') { $parts->add("$label: $info"); } } return $parts; } public static function describeModificationStatistics($stats) { $t = StaticTranslator::get(); $relevantStats = []; if ($stats->cnt_created > 0) { $relevantStats[] = sprintf($t->translate('%d created'), $stats->cnt_created); } if ($stats->cnt_deleted > 0) { $relevantStats[] = sprintf($t->translate('%d deleted'), $stats->cnt_deleted); } if ($stats->cnt_modified > 0) { $relevantStats[] = sprintf($t->translate('%d modified'), $stats->cnt_modified); } if (empty($relevantStats)) { return '-'; } return implode(', ', $relevantStats); } public function loadSingleTableStats($table, UuidInterface $uuid) { $query = $this->db->select()->from($table, [ 'cnt_created' => "SUM(CASE WHEN branch_created = 'y' THEN 1 ELSE 0 END)", 'cnt_deleted' => "SUM(CASE WHEN branch_deleted = 'y' THEN 1 ELSE 0 END)", 'cnt_modified' => "SUM(CASE WHEN branch_deleted = 'n' AND branch_created = 'n' THEN 1 ELSE 0 END)", ])->where('branch_uuid = ?', $this->connection->quoteBinary($uuid->getBytes())); return $this->db->fetchRow($query); } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/BranchSettings.php000066400000000000000000000071511516513262500273120ustar00rootroot00000000000000 $value) { if (! static::propertyIsBranchSpecific($key)) { if (is_resource($value)) { $value = stream_get_contents($value); } if ($value !== null && static::propertyIsEncodedArray($key)) { $value = Json::decode($value); } if ($value !== null && static::propertyIsRelatedSet($key)) { // TODO: We might want to combine them (current VS branched) $value = Json::decode($value); } if ($value !== null && static::propertyIsEncodedDictionary($key)) { $value = Json::decode($value); } if ($value !== null) { $normalized[$key] = $value; } } } static::flattenEncodedDicationaries($row); if (isset($row['set_null'])) { foreach (Json::decode($row['set_null']) as $property) { $normalized[$property] = null; } } foreach (self::BRANCH_BOOLEANS as $key) { if ($row[$key] === 'y') { $row[$key] = true; } elseif ($row[$key] === 'n') { $row[$key] = false; } else { throw new \RuntimeException(sprintf( "Boolean DB property expected, got '%s' for '%s'", $row[$key], $key )); } } return $normalized; } public static function flattenProperty(array &$properties, $property) { // TODO: dots in varnames -> throw or escape? if (isset($properties[$property])) { foreach ((array) $properties[$property] as $key => $value) { $properties["$property.$key"] = $value; } unset($properties[$property]); } } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/BranchStore.php000066400000000000000000000172501516513262500266070ustar00rootroot00000000000000connection = $connection; $this->db = $connection->getDbAdapter(); } /** * @param UuidInterface $uuid * @return ?Branch */ public function fetchBranchByUuid(UuidInterface $uuid) { return $this->newFromDbResult( $this->select()->where('b.uuid = ?', $this->connection->quoteBinary($uuid->getBytes())) ); } /** * @param string $name * @return ?Branch */ public function fetchBranchByName($name) { return $this->newFromDbResult($this->select()->where('b.branch_name = ?', $name)); } public function cloneBranchForSync(Branch $branch, $newName, $owner) { $this->runTransaction(function ($db) use ($branch, $newName, $owner) { $tables = BranchSupport::BRANCHED_TABLES; $tables[] = self::TABLE_ACTIVITY; $newBranch = $this->createBranchByName($newName, $owner); $oldQuotedUuid = DbUtil::quoteBinaryCompat($branch->getUuid()->getBytes(), $db); $quotedUuid = DbUtil::quoteBinaryCompat($newBranch->getUuid()->getBytes(), $db); // $timestampNs = (int)floor(microtime(true) * 1000000); // Hint: would love to do SELECT *, $quotedUuid AS branch_uuid FROM $table INTO $table foreach ($tables as $table) { $rows = $db->fetchAll($db->select()->from($table)->where('branch_uuid = ?', $oldQuotedUuid)); foreach ($rows as $row) { $modified = (array)$row; $this->quoteBinaryProperties($modified); $modified['branch_uuid'] = $quotedUuid; if ($table === self::TABLE_ACTIVITY) { $modified['timestamp_ns'] = round($modified['timestamp_ns'] / 1000000); } $db->insert($table, $modified); } } }); return $this->fetchBranchByName($newName); } protected function quoteBinaryProperties(&$properties) { foreach ($properties as $key => $value) { if ($this->isBinaryColumn($key)) { $properties[$key] = $this->connection->quoteBinary($value); } } } protected function isBinaryColumn($key) { return (strpos($key, 'uuid') !== false || strpos($key, 'checksum') !== false) && strpos($key, 'hex') === false; } protected function runTransaction($callback) { $db = $this->db; $db->beginTransaction(); try { $callback($db); $db->commit(); } catch (\Exception $e) { try { $db->rollBack(); } catch (\Exception $ignored) { // } throw $e; } } public function wipeBranch(Branch $branch, $after = null) { $this->runTransaction(function ($db) use ($branch, $after) { $tables = BranchSupport::BRANCHED_TABLES; $tables[] = self::TABLE_ACTIVITY; $quotedUuid = DbUtil::quoteBinaryCompat($branch->getUuid()->getBytes(), $db); $where = $db->quoteInto('branch_uuid = ?', $quotedUuid); foreach ($tables as $table) { if ($after && $table === self::TABLE_ACTIVITY) { $db->delete($table, $where . ' AND timestamp_ns > ' . (int) $after); } else { $db->delete($table, $where); } } }); } protected function newFromDbResult($query) { if ($row = $this->db->fetchRow($query)) { if (is_resource($row->uuid)) { $row->uuid = stream_get_contents($row->uuid); } return Branch::fromDbRow($row); } return null; } public function setReadyForMerge(Branch $branch) { $update = [ 'ts_merge_request' => (int) floor(microtime(true) * 1000000), 'description' => $branch->getDescription(), ]; $name = $branch->getName(); if (preg_match('#^/enforced/(.+)$#', $name, $match)) { $update['branch_name'] = '/merge/' . substr(sha1($branch->getUuid()->getBytes()), 0, 7) . '/' . $match[1]; } $this->db->update('director_branch', $update, $this->db->quoteInto( 'uuid = ?', $this->connection->quoteBinary($branch->getUuid()->getBytes()) )); } protected function select() { return $this->db->select()->from(['b' => 'director_branch'], [ 'uuid' => 'b.uuid', 'owner' => 'b.owner', 'branch_name' => 'b.branch_name', 'description' => 'b.description', 'ts_merge_request' => 'b.ts_merge_request', 'cnt_activities' => 'COUNT(ba.timestamp_ns)', ])->joinLeft( ['ba' => self::TABLE_ACTIVITY], 'b.uuid = ba.branch_uuid', [] )->group('b.uuid'); } /** * @param string $name * @return Branch * @throws \Zend_Db_Adapter_Exception */ public function fetchOrCreateByName($name, $owner) { if ($branch = $this->fetchBranchByName($name)) { return $branch; } return $this->createBranchByName($name, $owner); } /** * @param string $branchName * @param string $owner * @return Branch * @throws \Zend_Db_Adapter_Exception */ public function createBranchByName($branchName, $owner) { $uuid = Uuid::uuid4(); $properties = [ 'uuid' => $this->connection->quoteBinary($uuid->getBytes()), 'branch_name' => $branchName, 'owner' => $owner, 'description' => null, 'ts_merge_request' => null, ]; $this->db->insert(self::TABLE, $properties); if ($branch = static::fetchBranchByUuid($uuid)) { return $branch; } throw new \RuntimeException(sprintf( 'Branch with UUID=%s has been created, but could not be fetched from DB', $uuid->toString() )); } public function deleteByUuid(UuidInterface $uuid) { return $this->db->delete(self::TABLE, $this->db->quoteInto( 'uuid = ?', $this->connection->quoteBinary($uuid->getBytes()) )); } /** * @param string $name * @return int */ public function deleteByName($name) { return $this->db->delete(self::TABLE, $this->db->quoteInto( 'branch_name = ?', $name )); } public function delete(Branch $branch) { return $this->deleteByUuid($branch->getUuid()); } /** * @param Branch $branch * @param ?int $after * @return float|null */ public function getLastActivityTime(Branch $branch, $after = null) { $db = $this->db; $query = $db->select() ->from(self::TABLE_ACTIVITY, 'MAX(timestamp_ns)') ->where('branch_uuid = ?', DbUtil::quoteBinaryCompat($branch->getUuid()->getBytes(), $db)); if ($after) { $query->where('timestamp_ns > ?', (int) $after); } $last = $db->fetchOne($query); if ($last) { return $last / 1000000; } return null; } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/BranchSupport.php000066400000000000000000000106431516513262500271660ustar00rootroot00000000000000get('object_type')) ); } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/BranchedObject.php000066400000000000000000000306001516513262500272240ustar00rootroot00000000000000getObjectTable(), $activity->getObjectUuid(), $activity->getBranchUuid() )->applyActivity($activity, $connection); } public function store(Db $connection) { if ($this->object && ! $this->object->hasBeenModified() && empty($this->changes)) { return false; } $db = $connection->getDbAdapter(); $properties = [ 'branch_deleted' => $this->branchDeleted ? 'y' : 'n', 'branch_created' => $this->branchCreated ? 'y' : 'n', ] + $this->prepareChangedProperties(); $table = 'branched_' . $this->objectTable; if ($this->loadedAsBranchedObject) { return $db->update( $table, $properties, $this->prepareWhereString($connection) ) === 1; } else { try { return $db->insert($table, $this->prepareKeyProperties($connection) + $properties) === 1; } catch (\Exception $e) { var_dump($e->getMessage()); var_dump($this->prepareKeyProperties($connection) + $properties); exit; } } } public function delete(Db $connection) { $db = $connection->getDbAdapter(); $table = 'branched_' . $this->objectTable; $branchCreated = $db->fetchOne($this->filterQuery($db->select()->from($table, 'branch_created'), $connection)); // We do not want to nullify all properties, therefore: delete & insert $db->delete($table, $this->prepareWhereString($connection)); if (! $branchCreated) { // No need to insert a deleted object in case this object lived in this branch only return $db->insert($table, $this->prepareKeyProperties($connection) + [ 'branch_deleted' => 'y', 'branch_created' => 'n', ]) === 1; } return true; } protected function prepareKeyProperties(Db $connection) { return [ 'uuid' => $connection->quoteBinary($this->objectUuid->getBytes()), 'branch_uuid' => $connection->quoteBinary($this->branchUuid->getBytes()), ]; } protected function prepareWhereString(Db $connection) { $db = $connection->getDbAdapter(); $objectUuid = $connection->quoteBinary($this->objectUuid->getBytes()); $branchUuid = $connection->quoteBinary($this->branchUuid->getBytes()); return $db->quoteInto('uuid = ?', $objectUuid) . $db->quoteInto(' AND branch_uuid = ?', $branchUuid); } /** * @param \Zend_Db_Select $query * @param Db $connection * @return \Zend_Db_Select */ protected function filterQuery(\Zend_Db_Select $query, Db $connection) { return $query->where('uuid = ?', $connection->quoteBinary($this->objectUuid->getBytes())) ->where('branch_uuid = ?', $connection->quoteBinary($this->branchUuid->getBytes())); } protected function prepareChangedProperties() { $properties = (array) $this->changes; foreach (BranchSettings::ENCODED_DICTIONARIES as $property) { $this->combineFlatDictionaries($properties, $property); } foreach (BranchSettings::ENCODED_DICTIONARIES as $property) { if (isset($properties[$property])) { $properties[$property] = Json::encode($properties[$property]); } } foreach (BranchSettings::ENCODED_ARRAYS as $property) { if (isset($properties[$property])) { $properties[$property] = Json::encode($properties[$property]); } } foreach (BranchSettings::RELATED_SETS as $property) { if (isset($properties[$property])) { $properties[$property] = Json::encode($properties[$property]); } } $setNull = []; if (array_key_exists('disabled', $properties) && $properties['disabled'] === null) { unset($properties['disabled']); } foreach ($properties as $key => $value) { if ($value === null) { $setNull[] = $key; } } if (empty($setNull)) { $properties['set_null'] = null; } else { $properties['set_null'] = Json::encode($setNull); } return $properties; } protected function combineFlatDictionaries(&$properties, $prefix) { $vars = []; $length = strlen($prefix) + 1; foreach ($properties as $key => $value) { if (substr($key, 0, $length) === "$prefix.") { $vars[substr($key, $length)] = $value; } } if (! empty($vars)) { foreach (array_keys($vars) as $key) { unset($properties["$prefix.$key"]); } $properties[$prefix] = (object) $vars; } } public function applyActivity(BranchActivity $activity, Db $connection) { if ($activity->isActionDelete()) { throw new \RuntimeException('Cannot apply a delete action'); } if ($activity->isActionCreate()) { if ($this->hasBeenTouchedByBranch()) { throw new \RuntimeException('Cannot apply a CREATE activity to an already branched object'); } else { $this->branchCreated = true; } } $dummyObject = IcingaObject::createByType( $this->objectTable, [], $connection ); foreach ($activity->getModifiedProperties()->jsonSerialize() as $key => $value) { if ($dummyObject->propertyIsBoolean($key)) { $value = DbDataFormatter::normalizeBoolean($value); } $this->changes[$key] = $value; } return $this; } /** * @param Db $connection * @param string $objectTable * @param UuidInterface $uuid * @param Branch $branch * @return static * @throws NotFoundError */ public static function load(Db $connection, $objectTable, UuidInterface $uuid, Branch $branch) { $object = static::loadOptional($connection, $objectTable, $uuid, $branch->getUuid()); if ($object->getOriginalDbObject() === null && ! $object->hasBeenTouchedByBranch()) { throw new NotFoundError('Not found'); } return $object; } /** * @return bool */ public function hasBeenTouchedByBranch() { return $this->loadedAsBranchedObject; } /** * @return bool */ public function hasBeenDeletedByBranch() { return $this->branchDeleted; } /** * @return bool */ public function hasBeenCreatedByBranch() { return $this->branchCreated; } /** * @return ?DbObject */ public function getOriginalDbObject() { return $this->object; } /** * @return ?DbObject */ public function getBranchedDbObject(Db $connection) { if ($this->object) { $branched = DbObjectTypeRegistry::newObject($this->objectTable, [], $connection); // object_type first, to avoid: // I can only assign for applied objects or objects with native support for assignments if ($this->object->hasProperty('object_type')) { $branched->set('object_type', $this->object->get('object_type')); } $branched->set('id', $this->object->get('id')); $branched->set('uuid', $this->object->get('uuid')); foreach ((array) $this->object->toPlainObject(false, true) as $key => $value) { if ($key === 'object_type') { continue; } $branched->set($key, $value); } } else { $branched = DbObjectTypeRegistry::newObject($this->objectTable, [], $connection); $branched->setUniqueId($this->objectUuid); } if ($this->changes === null) { return $branched; } foreach ($this->changes as $key => $value) { if ($key === 'set_null') { if ($value !== null) { foreach ($value as $k) { $branched->set($k, null); } } } else { $branched->set($key, $value); } } return $branched; } /** * @return UuidInterface */ public function getBranchUuid() { return $this->branchUuid; } /** * @param Db $connection * @param string $table * @param UuidInterface $uuid * @param ?UuidInterface $branchUuid * @return static */ protected static function loadOptional( Db $connection, $table, UuidInterface $uuid, UuidInterface $branchUuid = null ) { $class = DbObjectTypeRegistry::classByType($table); if ($row = static::optionalTableRowByUuid($connection, $table, $uuid)) { $object = $class::fromDbRow((array) $row, $connection); } else { $object = null; } $self = new static(); $self->object = $object; $self->objectUuid = $uuid; $self->branchUuid = $branchUuid; $self->objectTable = $table; if ($branchUuid && $row = static::optionalBranchedTableRowByUuid($connection, $table, $uuid, $branchUuid)) { if ($row->branch_deleted === 'y') { $self->branchDeleted = true; } elseif ($row->branch_created === 'y') { $self->branchCreated = true; } $self->changes = BranchSettings::normalizeBranchedObjectFromDb($row); $self->loadedAsBranchedObject = true; } return $self; } public static function exists( Db $connection, $table, UuidInterface $uuid, UuidInterface $branchUuid = null ) { if (static::optionalTableRowByUuid($connection, $table, $uuid)) { return true; } if ($branchUuid && static::optionalBranchedTableRowByUuid($connection, $table, $uuid, $branchUuid)) { return true; } return false; } /** * @param Db $connection * @param string $table * @param UuidInterface $uuid * @return stdClass|boolean */ protected static function optionalTableRowByUuid(Db $connection, $table, UuidInterface $uuid) { $db = $connection->getDbAdapter(); return $db->fetchRow( $db->select()->from($table)->where('uuid = ?', $connection->quoteBinary($uuid->getBytes())) ); } /** * @param Db $connection * @param string $table * @param UuidInterface $uuid * @return stdClass|boolean */ protected static function optionalBranchedTableRowByUuid( Db $connection, $table, UuidInterface $uuid, UuidInterface $branchUuid ) { $db = $connection->getDbAdapter(); $query = $db->select() ->from("branched_$table") ->where('uuid = ?', $connection->quoteBinary($uuid->getBytes())) ->where('branch_uuid = ?', $connection->quoteBinary($branchUuid->getBytes())); return $db->fetchRow($query); } protected function __construct() { } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/MergeError.php000066400000000000000000000014071516513262500264430ustar00rootroot00000000000000activity = $activity; parent::__construct($this->prepareMessage()); } abstract protected function prepareMessage(); public function getObjectTypeName() { return preg_replace('/^icinga_/', '', $this->getActivity()->getObjectTable()); } public function getNiceObjectName() { return $this->activity->getObjectName(); } public function getActivity() { return $this->activity; } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/MergeErrorDeleteMissingObject.php000066400000000000000000000005321516513262500322450ustar00rootroot00000000000000translate('Cannot delete %s %s, it does not exist'), $this->getObjectTypeName(), $this->getNiceObjectName() ); } } MergeErrorModificationForMissingObject.php000066400000000000000000000005671516513262500340500ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Db/Branchtranslate('Cannot apply modification for %s %s, object does not exist'), $this->getObjectTypeName(), $this->getNiceObjectName() ); } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/MergeErrorRecreateOnMerge.php000066400000000000000000000005051516513262500313710ustar00rootroot00000000000000translate('Cannot recreate %s %s'), $this->getObjectTypeName(), $this->getNiceObjectName() ); } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/PlainObjectPropertyDiff.php000066400000000000000000000026771516513262500311340ustar00rootroot00000000000000 $value) { if (array_key_exists($key, $new)) { if ($value === $new[$key]) { $unchangedKeys[] = $key; } } else { $new[$key] = null; } } foreach ($unchangedKeys as $key) { unset($new[$key]); } return $new; } protected static function flattenProperty(array &$properties, $property) { // TODO: dots in varnames -> throw or escape? if (isset($properties[$property])) { foreach ((array) $properties[$property] as $key => $value) { $properties["$property.$key"] = $value; } unset($properties[$property]); } } } icingaweb2-module-director-1.11.8/library/Director/Db/Branch/PreferredBranchSupport.php000066400000000000000000000002641516513262500310230ustar00rootroot00000000000000getDbAdapter(); $query = $db->select()->from('icinga_service', 'uuid'); if ($objectType) { $query->where('object_type = ?', $objectType); } $query = self::addKeyToQuery($connection, $query, $key); if ($set) { $setId = $set->get('id'); if ($setId === null) { $query->where('1 = 0'); } else { $query->where('service_set_id = ?', $setId); } } elseif ($host) { $hostId = $host->get('id'); if ($hostId === null) { $query->where('1 = 0'); } else { $query->where('host_id = ?', $hostId); } } $uuid = self::fetchOptionalUuid($connection, $query); if ($uuid === null && $branch->isBranch()) { // TODO: use different tables? $query = $db->select() ->from('branched_icinga_service', 'uuid') ->where('branch_uuid = ?', $connection->quoteBinary($branch->getUuid()->getBytes())); if ($objectType) { $query->where('object_type = ?', $objectType); } $query = self::addKeyToQuery($connection, $query, $key); if ($host) { // TODO: uuid? $query->where('host = ?', $host->getObjectName()); } if ($set) { $query->where('service_set = ?', $set->getObjectName()); } $uuid = self::fetchOptionalUuid($connection, $query); } return $uuid; } /** * @param int|string|array $key * @param string $table * @param Db $connection * @param Branch $branch * @return UuidInterface * @throws NotFoundError */ public static function requireUuidForKey($key, $table, Db $connection, Branch $branch) { $uuid = self::findUuidForKey($key, $table, $connection, $branch); if ($uuid === null) { throw new NotFoundError('No such object available'); } return $uuid; } /** * @param int|string|array $key * @param string $table * @param Db $connection * @param Branch $branch * @return ?UuidInterface */ public static function findUuidForKey($key, $table, Db $connection, Branch $branch) { $db = $connection->getDbAdapter(); $query = self::addKeyToQuery($connection, $db->select()->from($table, 'uuid'), $key); $uuid = self::fetchOptionalUuid($connection, $query); if ($uuid === null && $branch->isBranch()) { if (is_array($key) && isset($key['host_id'])) { $key['host'] = IcingaHost::loadWithAutoIncId((int) $key['host_id'], $connection)->getObjectName(); unset($key['host_id']); } $query = self::addKeyToQuery($connection, $db->select()->from("branched_$table", 'uuid'), $key); $query->where('branch_uuid = ?', $connection->quoteBinary($branch->getUuid()->getBytes())); $uuid = self::fetchOptionalUuid($connection, $query); } return $uuid; } protected static function addKeyToQuery(Db $connection, $query, $key) { if (is_int($key)) { $query->where('id = ?', $key); } elseif (is_string($key)) { $query->where('object_name = ?', $key); } else { foreach ($key as $k => $v) { $query->where($connection->getDbAdapter()->quoteIdentifier($k) . ' = ?', $v); } } return $query; } protected static function fetchOptionalUuid(Db $connection, $query) { $result = $connection->getDbAdapter()->fetchOne($query); if (is_resource($result)) { $result = stream_get_contents($result); } if (is_string($result)) { return Uuid::fromBytes($result); } return null; } } icingaweb2-module-director-1.11.8/library/Director/Db/Cache/000077500000000000000000000000001516513262500234655ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Db/Cache/CustomVariableCache.php000066400000000000000000000042761516513262500300530ustar00rootroot00000000000000getConnection(); $db = $connection->getDbAdapter(); $columns = array( 'id' => sprintf('v.%s', $object->getVarsIdColumn()), 'varname' => 'v.varname', 'varvalue' => 'v.varvalue', 'format' => 'v.format', 'checksum' => '(NULL)', ); if ($connection->isPgsql()) { if ($connection->hasPgExtension('pgcrypto')) { $columns['checksum'] = "DIGEST(v.varvalue || ';' || v.format, 'sha1')"; } } else { $columns['checksum'] = "UNHEX(SHA1(v.varvalue || ';' || v.format))"; } $query = $db->select()->from( array('v' => $object->getVarsTableName()), $columns ); foreach ($db->fetchAll($query) as $row) { $id = $row->id; unset($row->id); if (is_resource($row->checksum)) { $row->checksum = stream_get_contents($row->checksum); } if (array_key_exists($id, $this->rowsById)) { $this->rowsById[$id][] = $row; } else { $this->rowsById[$id] = array($row); } } Benchmark::measure('Filled CustomVariableCache'); } public function getVarsForObject(IcingaObject $object) { $id = $object->id; if (array_key_exists($id, $this->rowsById)) { if (! array_key_exists($id, $this->varsById)) { $this->varsById[$id] = CustomVariables::forStoredRows( $this->rowsById[$id] ); } return $this->varsById[$id]; } else { return new CustomVariables(); } } } icingaweb2-module-director-1.11.8/library/Director/Db/Cache/GroupMembershipCache.php000066400000000000000000000054341516513262500302400ustar00rootroot00000000000000table = $object->getTableName(); $this->type = $object->getShortTableName(); $this->groupClass = 'Icinga\\Module\\Director\\Objects\\Icinga' . ucfirst($this->type) . 'Group'; Benchmark::measure('Initializing GroupMemberShipCache'); $this->connection = $object->getConnection(); $this->loadAllMemberships(); Benchmark::measure('Filled GroupMemberShipCache'); } protected function loadAllMemberships() { $db = $this->connection->getDbAdapter(); $this->memberships = array(); $type = $this->type; $table = $this->table; $query = $db->select()->from( array('o' => $table), array( 'object_id' => 'o.id', 'group_id' => 'g.id', 'group_name' => 'g.object_name', ) )->join( array('go' => $table . 'group_' . $type), 'o.id = go.' . $type . '_id', array() )->join( array('g' => $table . 'group'), 'go.' . $type . 'group_id = g.id', array() )->order('g.object_name'); foreach ($db->fetchAll($query) as $row) { if (! array_key_exists($row->object_id, $this->memberships)) { $this->memberships[$row->object_id] = array(); } $this->memberships[$row->object_id][$row->group_id] = $row->group_name; } } public function listGroupNamesForObject(IcingaObject $object) { if (array_key_exists($object->id, $this->memberships)) { return array_values($this->memberships[$object->id]); } return array(); } public function listGroupIdsForObject(IcingaObject $object) { if (array_key_exists($object->id, $this->memberships)) { return array_keys($this->memberships[$object->id]); } return array(); } public function getGroupsForObject(IcingaObject $object) { $groups = array(); $class = $this->groupClass; foreach ($this->listGroupIdsForObject($object) as $id) { $object = $class::loadWithAutoIncId($id, $this->connection); $groups[$object->object_name] = $object; } return $groups; } public function __destruct() { unset($this->connection); } } icingaweb2-module-director-1.11.8/library/Director/Db/Cache/PrefetchCache.php000066400000000000000000000102651516513262500266660ustar00rootroot00000000000000db = $db; } /** * @throws LogicException * * @return self */ public static function instance() { if (static::$instance === null) { throw new LogicException('Prefetch cache has not been loaded'); } return static::$instance; } public static function forget() { DbObject::clearAllPrefetchCaches(); self::$instance = null; } public static function shouldBeUsed() { return self::$instance !== null; } public function vars(IcingaObject $object) { return $this->varsCache($object)->getVarsForObject($object); } public function groups(IcingaObject $object) { return $this->groupsCache($object)->getGroupsForObject($object); } /* Hint: not implemented, this happens in DbObject right now public function byObjectType($type) { if (! array_key_exists($type, $this->caches)) { $this->caches[$type] = new ObjectCache($type); } return $this->caches[$type]; } */ public function renderVar(CustomVariable $var, $renderExpressions = false) { $checksum = $var->getChecksum(); if (null === $checksum) { return $var->toConfigString($renderExpressions); } else { $checksum .= (int) $renderExpressions; if (! array_key_exists($checksum, $this->renderedVars)) { $this->renderedVars[$checksum] = $var->toConfigString($renderExpressions); } return $this->renderedVars[$checksum]; } } public function hostServiceBlacklist() { if ($this->hostServiceBlacklist === null) { $this->hostServiceBlacklist = new HostServiceBlacklist($this->db); $this->hostServiceBlacklist->preloadMappings(); } return $this->hostServiceBlacklist; } /** * @param IcingaObject $object * @return CustomVariableCache */ protected function varsCache(IcingaObject $object) { $key = $object->getShortTableName(); if (! array_key_exists($key, $this->varsCaches)) { $this->varsCaches[$key] = new CustomVariableCache($object); } return $this->varsCaches[$key]; } protected function groupsCache(IcingaObject $object) { $key = $object->getShortTableName(); if (! array_key_exists($key, $this->groupsCaches)) { $this->groupsCaches[$key] = new GroupMembershipCache($object); } return $this->groupsCaches[$key]; } protected function templateTree(IcingaObject $object) { $key = $object->getShortTableName(); if (! array_key_exists($key, $this->templateTrees)) { $this->templateTrees[$key] = new TemplateTree( $key, $object->getConnection() ); } return $this->templateTrees[$key]; } public function __destruct() { unset($this->groupsCaches); unset($this->varsCaches); unset($this->templateResolvers); unset($this->renderedVars); } } icingaweb2-module-director-1.11.8/library/Director/Db/DbSelectParenthesis.php000066400000000000000000000006431516513262500270710ustar00rootroot00000000000000select = $select; } public function getSelect() { return $this->select; } public function __toString() { return '(' . $this->select . ')'; } } icingaweb2-module-director-1.11.8/library/Director/Db/DbUtil.php000066400000000000000000000043131516513262500243570ustar00rootroot00000000000000connection = $connection; $this->db = $connection->getDbAdapter(); } public function getTaskSummary() { $summary = array(); foreach ($this->listTasks() as $name => $title) { $func = 'count' . ucfirst($name); $summary[$name] = (object) array( 'name' => $name, 'title' => $title, 'count' => $this->$func() ); } return $summary; } public function listTasks() { return array( 'oldUndeployedConfigs' => N_('Undeployed configurations'), 'unusedFiles' => N_('Unused rendered files'), 'unlinkedImportedRowSets' => N_('Unlinked imported row sets'), 'unlinkedImportedRows' => N_('Unlinked imported rows'), 'unlinkedImportedProperties' => N_('Unlinked imported properties'), 'resolveCache' => N_('(Host) group resolve cache'), ); } public function getPendingTaskSummary() { return array_filter( $this->getTaskSummary(), function ($task) { return $task->count > 0; } ); } public function hasPendingTasks() { return count($this->getPendingTaskSummary()) > 0; } public function runAllTasks() { $result = array(); foreach ($this->listTasks() as $name => $task) { $this->runTask($name); } return $this; } public function runTask($name) { $func = 'wipe' . ucfirst($name); if (!method_exists($this, $func)) { throw new NotFoundError( 'There is no such task: %s', $name ); } return $this->$func(); } public function countOldUndeployedConfigs() { $conn = $this->connection; $lastActivity = $conn->getLastActivityChecksum(); $sql = 'SELECT COUNT(*) FROM director_generated_config c' . ' LEFT JOIN director_deployment_log d ON c.checksum = d.config_checksum' . ' WHERE d.config_checksum IS NULL' . ' AND ? != ' . $conn->dbHexFunc('c.last_activity_checksum'); return $this->db->fetchOne($sql, $lastActivity); } public function wipeOldUndeployedConfigs() { $conn = $this->connection; $lastActivity = $conn->getLastActivityChecksum(); if ($this->connection->isPgsql()) { $sql = 'DELETE FROM director_generated_config' . ' USING director_generated_config AS c' . ' LEFT JOIN director_deployment_log d ON c.checksum = d.config_checksum' . ' WHERE director_generated_config.checksum = c.checksum' . ' AND d.config_checksum IS NULL' . ' AND ? != ' . $conn->dbHexFunc('c.last_activity_checksum'); } else { $sql = 'DELETE c.* FROM director_generated_config c' . ' LEFT JOIN director_deployment_log d ON c.checksum = d.config_checksum' . ' WHERE d.config_checksum IS NULL' . ' AND ? != ' . $conn->dbHexFunc('c.last_activity_checksum'); } return $this->db->query($sql, $lastActivity); } public function countUnusedFiles() { $sql = 'SELECT COUNT(*) FROM director_generated_file f' . ' LEFT JOIN director_generated_config_file cf ON f.checksum = cf.file_checksum' . ' WHERE cf.file_checksum IS NULL'; return $this->db->fetchOne($sql); } public function wipeUnusedFiles() { if ($this->connection->isPgsql()) { $sql = 'DELETE FROM director_generated_file' . ' USING director_generated_file AS f' . ' LEFT JOIN director_generated_config_file cf ON f.checksum = cf.file_checksum' . ' WHERE director_generated_file.checksum = f.checksum' . ' AND cf.file_checksum IS NULL'; } else { $sql = 'DELETE f FROM director_generated_file f' . ' LEFT JOIN director_generated_config_file cf ON f.checksum = cf.file_checksum' . ' WHERE cf.file_checksum IS NULL'; } return $this->db->exec($sql); } public function countUnlinkedImportedRowSets() { $sql = 'SELECT COUNT(*) FROM imported_rowset rs LEFT JOIN import_run r' . ' ON r.rowset_checksum = rs.checksum WHERE r.id IS NULL'; return $this->db->fetchOne($sql); } public function wipeUnlinkedImportedRowSets() { // This one removes imported_rowset and imported_rowset_row // entries no longer used by any historic import if ($this->connection->isPgsql()) { $sql = 'DELETE FROM imported_rowset' . ' USING imported_rowset AS rs' . ' LEFT JOIN import_run r ON r.rowset_checksum = rs.checksum' . ' WHERE imported_rowset.checksum = rs.checksum' . ' AND r.id IS NULL'; } else { $sql = 'DELETE rs.* FROM imported_rowset rs' . ' LEFT JOIN import_run r ON r.rowset_checksum = rs.checksum' . ' WHERE r.id IS NULL'; } return $this->db->exec($sql); } public function countUnlinkedImportedRows() { $sql = 'SELECT COUNT(*) FROM imported_row r LEFT JOIN imported_rowset_row rsr' . ' ON rsr.row_checksum = r.checksum WHERE rsr.row_checksum IS NULL'; return $this->db->fetchOne($sql); } public function wipeUnlinkedImportedRows() { // This query removes imported_row and imported_row_property columns // without related rowset if ($this->connection->isPgsql()) { $sql = 'DELETE FROM imported_row' . ' USING imported_row AS r' . ' LEFT JOIN imported_rowset_row rsr ON rsr.row_checksum = r.checksum' . ' WHERE imported_row.checksum = r.checksum' . ' AND rsr.row_checksum IS NULL'; } else { $sql = 'DELETE r.* FROM imported_row r' . ' LEFT JOIN imported_rowset_row rsr ON rsr.row_checksum = r.checksum' . ' WHERE rsr.row_checksum IS NULL'; } return $this->db->exec($sql); } public function countUnlinkedImportedProperties() { $sql = 'SELECT COUNT(*) FROM imported_property p LEFT JOIN imported_row_property rp' . ' ON rp.property_checksum = p.checksum WHERE rp.property_checksum IS NULL'; return $this->db->fetchOne($sql); } public function wipeUnlinkedImportedProperties() { // This query removes unlinked imported properties if ($this->connection->isPgsql()) { $sql = 'DELETE FROM imported_property' . ' USING imported_property AS p' . ' LEFT JOIN imported_row_property rp ON rp.property_checksum = p.checksum' . ' WHERE imported_property.checksum = p.checksum' . ' AND rp.property_checksum IS NULL'; } else { $sql = 'DELETE p.* FROM imported_property p' . ' LEFT JOIN imported_row_property rp ON rp.property_checksum = p.checksum' . ' WHERE rp.property_checksum IS NULL'; } return $this->db->exec($sql); } public function countResolveCache() { $helper = MembershipHousekeeping::instance('host', $this->connection); return array_sum($helper->check()); } public function wipeResolveCache() { $helper = MembershipHousekeeping::instance('host', $this->connection); return $helper->update(); } } icingaweb2-module-director-1.11.8/library/Director/Db/IcingaObjectFilterHelper.php000066400000000000000000000124241516513262500300250ustar00rootroot00000000000000get('id'); } elseif (is_string($id) && ctype_digit($id)) { return (int) $id; } else { throw new InvalidArgumentException(sprintf( 'Numeric ID or IcingaObject expected, got %s', // TODO: just type/class info? var_export($id, true) )); } } /** * @param ZfSelect $query * @param IcingaObject|int|string $template * @param string $tableAlias * @param string $inheritanceType * @return ZfSelect */ public static function filterByTemplate( ZfSelect $query, $template, $tableAlias = 'o', $inheritanceType = self::INHERIT_DIRECT, UuidInterface $branchuuid = null ) { $i = $tableAlias . 'i'; $o = $tableAlias; $type = $template->getShortTableName(); $db = $template->getDb(); $id = static::wantId($template); if ($branchuuid) { if ($inheritanceType === self::INHERIT_DIRECT) { return $query->where('imports LIKE \'%"' . $template->getObjectName() . '"%\''); } elseif ( $inheritanceType === self::INHERIT_INDIRECT || $inheritanceType === self::INHERIT_DIRECT_OR_INDIRECT ) { $tree = new TemplateTree($type, $template->getConnection()); $templateNames = $tree->getDescendantsFor($template); if ($inheritanceType === self::INHERIT_DIRECT_OR_INDIRECT) { $templateNames[] = $template->getObjectName(); } if (empty($templateNames)) { $condition = '(1 = 0)'; } else { $condition = 'imports LIKE \'%"' . array_pop($templateNames) . '"%\''; foreach ($templateNames as $templateName) { $condition .= " OR imports LIKE '%\"$templateName\"%'"; } } return $query->where($condition); } } $sub = $db->select()->from( array($i => "icinga_{$type}_inheritance"), array('e' => '(1)') )->where("$i.{$type}_id = $o.id"); if ($inheritanceType === self::INHERIT_DIRECT) { $sub->where("$i.parent_{$type}_id = ?", $id); } elseif ( $inheritanceType === self::INHERIT_INDIRECT || $inheritanceType === self::INHERIT_DIRECT_OR_INDIRECT ) { $tree = new TemplateTree($type, $template->getConnection()); $ids = $tree->listDescendantIdsFor($template); if ($inheritanceType === self::INHERIT_DIRECT_OR_INDIRECT) { $ids[] = $template->getAutoincId(); } if (empty($ids)) { $sub->where('(1 = 0)'); } else { $sub->where("$i.parent_{$type}_id IN (?)", $ids); } } else { throw new RuntimeException(sprintf( 'Unable to understand "%s" inheritance', $inheritanceType )); } return $query->where('EXISTS ?', $sub); } public static function filterByHostgroups( ZfSelect $query, $type, $groups, $tableAlias = 'o' ) { if (empty($groups)) { // Asked for an empty set of groups? Give no result $query->where('(1 = 0)'); } else { $sub = $query->getAdapter()->select()->from( array('go' => "icinga_{$type}group_{$type}"), array('e' => '(1)') )->join( array('g' => "icinga_{$type}group"), "go.{$type}group_id = g.id" )->where("go.{$type}_id = {$tableAlias}.id") ->where('g.object_name IN (?)', $groups); $query->where('EXISTS ?', $sub); } } public static function filterByResolvedHostgroups( ZfSelect $query, $type, $groups, $tableAlias = 'o' ) { if (empty($groups)) { // Asked for an empty set of groups? Give no result $query->where('(1 = 0)'); } else { $sub = $query->getAdapter()->select()->from( array('go' => "icinga_{$type}group_{$type}_resolved"), array('e' => '(1)') )->join( array('g' => "icinga_{$type}group"), "go.{$type}group_id = g.id", [] )->where("go.{$type}_id = {$tableAlias}.id") ->where('g.object_name IN (?)', $groups); $query->where('EXISTS ?', $sub); } } } icingaweb2-module-director-1.11.8/library/Director/Db/MembershipHousekeeping.php000066400000000000000000000062451516513262500276440ustar00rootroot00000000000000connection = $connection; if ($this->groupType === null) { $this->groupType = $this->type . 'Group'; } } /** * @param string $type * @param DbConnection $connection * * @return static */ public static function instance($type, $connection) { if (! array_key_exists($type, self::$instances)) { /** @var MembershipHousekeeping $class */ $class = 'Icinga\\Module\\Director\\Db\\' . ucfirst($type) . 'MembershipHousekeeping'; /** @var MembershipHousekeeping $helper */ self::$instances[$type] = new $class($connection); } return self::$instances[$type]; } protected function prepare() { if ($this->prepared) { return $this; } $this->prepareCache(); $this->resolver()->defer(); $this->objects = IcingaObject::loadAllByType($this->type, $this->connection); $this->resolver()->addObjects($this->objects); $this->groups = IcingaObject::loadAllByType($this->groupType, $this->connection); $this->resolver()->addGroups($this->groups); MemoryLimit::raiseTo('1024M'); $this->prepared = true; return $this; } public function check() { $this->prepare(); $resolver = $this->resolver()->checkDb(); return array($resolver->getNewMappings(), $resolver->getOutdatedMappings()); } public function update() { $this->prepare(); $this->resolver()->refreshDb(true); return true; } protected function prepareCache() { PrefetchCache::initialize($this->connection); IcingaObject::prefetchAllRelationsByType($this->type, $this->connection); } protected function resolver() { if ($this->resolver === null) { /** @var GroupMembershipResolver $class */ $class = 'Icinga\\Module\\Director\\Objects\\' . ucfirst($this->type) . 'GroupMembershipResolver'; $this->resolver = new $class($this->connection); } return $this->resolver; } /** * @return IcingaObject[] */ public function getObjects() { return $this->objects; } /** * @return IcingaObjectGroup[] */ public function getGroups() { return $this->groups; } } icingaweb2-module-director-1.11.8/library/Director/Db/Migration.php000066400000000000000000000030721516513262500251260ustar00rootroot00000000000000version = $version; $this->sql = $sql; } /** * @param DbConnection $connection * @return $this */ public function apply(DbConnection $connection) { /** @var \Zend_Db_Adapter_Pdo_Abstract $db */ $db = $connection->getDbAdapter(); // TODO: this is fragile and depends on accordingly written schema files: $queries = preg_split( '/[\n\s\t]*\;[\n\s\t]+/s', $this->sql, -1, PREG_SPLIT_NO_EMPTY ); if (empty($queries)) { throw new RuntimeException(sprintf( 'Migration %d has no queries', $this->version )); } try { foreach ($queries as $query) { if (preg_match('/^(?:OPTIMIZE|EXECUTE) /i', $query)) { $db->query($query); } else { $db->exec($query); } } } catch (Exception $e) { throw new RuntimeException(sprintf( 'Migration %d failed (%s) while running %s', $this->version, $e->getMessage(), $query )); } return $this; } } icingaweb2-module-director-1.11.8/library/Director/Db/Migrations.php000066400000000000000000000132501516513262500253100ustar00rootroot00000000000000= 1.4.0, you're running %s." . ' Please either upgrade PHP or downgrade Icinga Director', PHP_VERSION ); } $this->connection = $connection; $this->db = $connection->getDbAdapter(); } public function getLastMigrationNumber() { try { $query = $this->db->select()->from( array('m' => $this->getTableName()), array('schema_version' => 'MAX(schema_version)') ); return (int) $this->db->fetchOne($query); } catch (Exception $e) { return 0; } } protected function getTableName() { return $this->getModuleName() . '_schema_migration'; } public function hasSchema() { return $this->listPendingMigrations() !== array(0); } public function hasPendingMigrations() { return $this->countPendingMigrations() > 0; } public function countPendingMigrations() { return count($this->listPendingMigrations()); } /** * @return Migration[] */ public function getPendingMigrations() { $migrations = array(); foreach ($this->listPendingMigrations() as $version) { $migrations[] = new Migration( $version, $this->loadMigrationFile($version) ); } return $migrations; } /** * @return $this */ public function applyPendingMigrations() { // Ensure we have enough time to migrate ini_set('max_execution_time', '0'); foreach ($this->getPendingMigrations() as $migration) { $migration->apply($this->connection); } return $this; } public function listPendingMigrations() { $lastMigration = $this->getLastMigrationNumber(); if ($lastMigration === 0) { return array(0); } return $this->listMigrationsAfter($this->getLastMigrationNumber()); } public function listAllMigrations() { $dir = $this->getMigrationsDir(); if (! is_readable($dir)) { return array(); } $versions = array(); foreach (new DirectoryIterator($this->getMigrationsDir()) as $file) { if ($file->isDot()) { continue; } $filename = $file->getFilename(); if (preg_match('/^upgrade_(\d+)\.sql$/', $filename, $match)) { $versions[] = $match[1]; } } sort($versions); return $versions; } public function loadMigrationFile($version) { if ($version === 0) { $filename = $this->getFullSchemaFile(); } else { $filename = $this->getMigrationFileName($version); } return file_get_contents($filename); } public function hasBeenDowngraded() { return ! $this->hasMigrationFile($this->getLastMigrationNumber()); } public function hasMigrationFile($version) { return \file_exists($this->getMigrationFileName($version)); } protected function getMigrationFileName($version) { return sprintf( '%s/upgrade_%d.sql', $this->getMigrationsDir(), $version ); } protected function listMigrationsAfter($version) { $filtered = array(); foreach ($this->listAllMigrations() as $available) { if ($available > $version) { $filtered[] = $available; } } return $filtered; } protected function getMigrationsDir() { if ($this->migrationsDir === null) { $this->migrationsDir = $this->getSchemaDir( $this->connection->getDbType() . '-migrations' ); } return $this->migrationsDir; } protected function getFullSchemaFile() { return $this->getSchemaDir( $this->connection->getDbType() . '.sql' ); } protected function getSchemaDir($sub = null) { try { $dir = $this->getModuleDir('/schema'); } catch (ProgrammingError $e) { throw new RuntimeException( 'Unable to detect the schema directory for this module', 0, $e ); } if ($sub === null) { return $dir; } else { return $dir . '/' . ltrim($sub, '/'); } } /** * @param string $sub * @return string * @throws ProgrammingError */ protected function getModuleDir($sub = '') { return Icinga::app()->getModuleManager()->getModuleDir( $this->getModuleName(), $sub ); } protected function getModuleName() { return $this->getModuleNameForObject($this); } protected function getModuleNameForObject($object) { $class = get_class($object); // Hint: Icinga\Module\ -> 14 chars return lcfirst(substr($class, 14, strpos($class, '\\', 15) - 14)); } } icingaweb2-module-director-1.11.8/library/Director/Deployment/000077500000000000000000000000001516513262500242555ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Deployment/ConditionalConfigRenderer.php000066400000000000000000000026701516513262500320530ustar00rootroot00000000000000db = $connection; } public function forceRendering($force = true) { $this->forceRendering = $force; return $this; } public function getConfig() { if ($this->shouldGenerate()) { return IcingaConfig::generate($this->db); } return $this->loadLatestActivityConfig(); } protected function loadLatestActivityConfig() { $db = $this->db; return IcingaConfig::loadByActivityChecksum($db->getLastActivityChecksum(), $db); } protected function shouldGenerate() { return $this->forceRendering || !$this->configForLatestActivityExists(); } protected function configForLatestActivityExists() { $db = $this->db; try { $latestActivity = DirectorActivityLog::loadLatest($db); } catch (NotFoundError $e) { return false; } return IcingaConfig::existsForActivityChecksum( bin2hex($latestActivity->get('checksum')), $db ); } } icingaweb2-module-director-1.11.8/library/Director/Deployment/ConditionalDeployment.php000066400000000000000000000123011516513262500312670ustar00rootroot00000000000000setLogger(new NullLogger()); $this->db = $connection; if ($api === null) { $this->api = $connection->getDeploymentEndpoint()->api(); } else { $this->api = $api; } $this->refresh(); } /** * @param IcingaConfig $config * @return ?DirectorDeploymentLog */ public function deploy(IcingaConfig $config) { $this->hasBeenForced = false; if ($this->shouldDeploy($config)) { return $this->reallyDeploy($config); } elseif ($this->force) { $deployment = $this->reallyDeploy($config); $this->hasBeenForced = true; return $deployment; } return null; } /** * @param bool $force * @return $this */ public function force($force = true) { $this->force = $force; return $this; } public function setGracePeriod(DeploymentGracePeriod $gracePeriod) { $this->gracePeriod = $gracePeriod; return $this; } public function refresh() { $this->api->collectLogFiles($this->db); $this->api->wipeInactiveStages($this->db); } public function waitForStartupAfterDeploy(DirectorDeploymentLog $deploymentLog, $timeout) { $startTime = time(); while ((time() - $startTime) <= $timeout) { $deploymentFromDB = DirectorDeploymentLog::load($deploymentLog->getId(), $this->db); $stageCollected = $deploymentFromDB->get('stage_collected'); if ($stageCollected === null) { usleep(500000); continue; } if ($stageCollected === 'n') { return 'stage has not been collected (Icinga "lost" the deployment)'; } if ($deploymentFromDB->get('startup_succeeded') === 'y') { return true; } return 'deployment failed during startup (usually a Configuration Error)'; } return 'deployment timed out (while waiting for an Icinga restart)'; } /** * @return string|null */ public function getNoDeploymentReason() { return $this->noDeploymentReason; } public function hasBeenForced() { return $this->hasBeenForced; } protected function shouldDeploy(IcingaConfig $config) { $this->noDeploymentReason = null; if ($this->hasNeverDeployed()) { return true; } if ($this->isWithinGracePeriod()) { $this->noDeploymentReason = 'Grace period is active'; return false; } if ($this->deployedConfigMatches($config)) { $this->noDeploymentReason = 'Config matches last deployed one'; return false; } if ($this->getActiveChecksum() === $config->getHexChecksum()) { $this->noDeploymentReason = 'Config matches active stage'; return false; } return true; } protected function hasNeverDeployed() { return !DirectorDeploymentLog::hasDeployments($this->db); } protected function isWithinGracePeriod() { return $this->gracePeriod && $this->gracePeriod->isActive(); } protected function deployedConfigMatches(IcingaConfig $config) { if ($deployment = DirectorDeploymentLog::optionalLatest($this->db)) { return $deployment->getConfigHexChecksum() === $config->getHexChecksum(); } return false; } protected function getActiveChecksum() { return DirectorDeploymentLog::getConfigChecksumForStageName( $this->db, $this->api->getActiveStageName() ); } /** * @param IcingaConfig $config * @return bool|DirectorDeploymentLog * @throws IcingaException * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function reallyDeploy(IcingaConfig $config) { $checksum = $config->getHexChecksum(); $this->logger->info(sprintf('Director ConfigJob ready to deploy "%s"', $checksum)); if ($deployment = $this->api->dumpConfig($config, $this->db)) { $this->logger->notice(sprintf('Director ConfigJob deployed config "%s"', $checksum)); return $deployment; } else { throw new IcingaException('Failed to deploy config "%s"', $checksum); } } } icingaweb2-module-director-1.11.8/library/Director/Deployment/DeploymentGracePeriod.php000066400000000000000000000025101516513262500312110ustar00rootroot00000000000000graceTimeSeconds = $graceTimeSeconds; $this->db = $db; } /** * Whether we're still within a grace period * @return bool */ public function isActive() { if ($deployment = $this->lastDeployment()) { return $deployment->getDeploymentTimestamp() > $this->getGracePeriodStart(); } return false; } protected function getGracePeriodStart() { return time() - $this->graceTimeSeconds; } public function getRemainingGraceTime() { if ($this->isActive()) { if ($deployment = $this->lastDeployment()) { return $deployment->getDeploymentTimestamp() - $this->getGracePeriodStart(); } else { return null; } } return 0; } protected function lastDeployment() { return DirectorDeploymentLog::optionalLatest($this->db); } } icingaweb2-module-director-1.11.8/library/Director/Deployment/DeploymentInfo.php000066400000000000000000000024171516513262500277260ustar00rootroot00000000000000db = $db; } public function setObject(IcingaObject $object) { $this->object = $object; return $this; } public function getTotalChanges() { if ($this->totalChanges === null) { $this->totalChanges = $this->db->countActivitiesSinceLastDeployedConfig(); } return $this->totalChanges; } public function getSingleObjectChanges() { if ($this->objectChanges === null) { if ($this->object === null) { $this->objectChanges = 0; } else { $this->objectChanges = $this->db ->countActivitiesSinceLastDeployedConfig($this->object); } } return $this->objectChanges; } public function hasUndeployedChanges() { return $this->getSingleObjectChanges() > 0 && $this->getTotalChanges() > 0; } } icingaweb2-module-director-1.11.8/library/Director/Deployment/DeploymentStatus.php000066400000000000000000000141641516513262500303200ustar00rootroot00000000000000db = $db; $this->api = $api; } public function getDeploymentStatus($configs = null, $activities = null) { try { if (DirectorDeploymentLog::hasUncollected($this->db)) { $this->api->collectLogFiles($this->db); } } catch (Exception $e) { // Ignore eventual issues while talking to Icinga } $activeConfiguration = null; $lastActivityLogChecksum = null; $configChecksum = null; if ($stageName = $this->api->getActiveStageName()) { $activityLogChecksum = DirectorDeploymentLog::getRelatedToActiveStage($this->api, $this->db); if ($activityLogChecksum === null) { $activeConfiguration = [ 'stage_name' => $stageName, 'config' => null, 'activity' => null ]; } else { $lastActivityLogChecksum = bin2hex($activityLogChecksum->get('last_activity_checksum')); $configChecksum = $this->getConfigChecksumForStageName($stageName); $activeConfiguration = [ 'stage_name' => $stageName, 'config' => ($configChecksum) ? : null, 'activity' => $lastActivityLogChecksum ]; } } $result = [ 'active_configuration' => (object) $activeConfiguration, ]; if ($configs) { $result['configs'] = (object) $this->getDeploymentStatusForConfigChecksums( explode(',', $configs), $configChecksum ); } if ($activities) { $result['activities'] = (object) $this->getDeploymentStatusForActivityLogChecksums( explode(',', $activities), $lastActivityLogChecksum ); } return (object) $result; } public function getConfigChecksumForStageName($stageName) { $db = $this->db->getDbAdapter(); $query = $db->select()->from( ['l' => 'director_deployment_log'], ['checksum' => $this->db->dbHexFunc('l.config_checksum')] )->where('l.stage_name = ?', $stageName); return $db->fetchOne($query); } public function getDeploymentStatusForConfigChecksums($configChecksums, $activeConfigChecksum) { $db = $this->db->getDbAdapter(); $results = array_combine($configChecksums, array_map(function () { return 'unknown'; }, $configChecksums)); $binaryConfigChecksums = []; foreach ($configChecksums as $singleConfigChecksum) { $binaryConfigChecksums[$singleConfigChecksum] = $this->db->quoteBinary(hex2bin($singleConfigChecksum)); } $deployedConfigs = $this->getDeployedConfigs(array_values($binaryConfigChecksums)); foreach ($results as $singleChecksum => &$status) { // active if it's equal to the provided active if ($singleChecksum === $activeConfigChecksum) { $status = 'active'; } else { if (isset($deployedConfigs[$singleChecksum])) { $status = ($deployedConfigs[$singleChecksum] === 'y') ? 'deployed' : 'failed'; } else { // check if it's in generated_config table it is undeployed $generatedConfigQuery = $db->select()->from( ['g' => 'director_generated_config'], ['checksum' => 'g.checksum'] )->where('g.checksum = ?', $binaryConfigChecksums[$singleChecksum]); if ($db->fetchOne($generatedConfigQuery)) { $status = 'undeployed'; } } // otherwise leave unknown } } return $results; } public function getDeploymentStatusForActivityLogChecksums($activityLogChecksums, $activeActivityLogChecksum) { $db = $this->db->getDbAdapter(); $results = array_combine($activityLogChecksums, array_map(function () { return 'unknown'; }, $activityLogChecksums)); foreach ($results as $singleActivityLogChecksum => &$status) { // active if it's equal to the provided active if ($singleActivityLogChecksum === $activeActivityLogChecksum) { $status = 'active'; } else { // get last deployed activity id and check if it's less than the passed one $generatedConfigQuery = $db->select()->from( ['a' => 'director_activity_log'], ['id' => 'a.id'] )->where('a.checksum = ?', $this->db->quoteBinary(hex2bin($singleActivityLogChecksum))); if ($singleActivityLogData = $db->fetchOne($generatedConfigQuery)) { if ($lastDeploymentActivityLogId = $this->db->getLastDeploymentActivityLogId()) { if ((int) $singleActivityLogData > $lastDeploymentActivityLogId) { $status = 'undeployed'; } else { $status = 'deployed'; } } } } } return $results; } /** * @param array $binaryConfigChecksums * @return array */ public function getDeployedConfigs(array $binaryConfigChecksums) { $db = $this->db->getDbAdapter(); $deploymentLogQuery = $db->select()->from(['l' => 'director_deployment_log'], [ 'checksum' => $this->db->dbHexFunc('l.config_checksum'), 'deployed' => 'l.startup_succeeded' ])->where('l.config_checksum IN (?)', $binaryConfigChecksums); return $db->fetchPairs($deploymentLogQuery); } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/000077500000000000000000000000001516513262500250375ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Automation/000077500000000000000000000000001516513262500271575ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Automation/Basket.php000066400000000000000000000111071516513262500311010ustar00rootroot00000000000000 null, 'basket_name' => null, 'objects' => null, 'owner_type' => null, 'owner_value' => null, ]; protected $binaryProperties = [ 'uuid' ]; public function getHexUuid() { return bin2hex($this->get('uuid')); } public function listObjectTypes() { return array_keys($this->objects); } public function getChosenObjects() { return $this->chosenObjects; } public function isEmpty() { return count($this->getChosenObjects()) === 0; } protected function onLoadFromDb() { $this->chosenObjects = (array) Json::decode($this->get('objects')); unset($this->chosenObjects['Datafield']); // Might be in old baskets } public function getUniqueIdentifier() { return $this->get('basket_name'); } public function supportsCustomSelectionFor($type) { if (! array_key_exists($type, $this->chosenObjects)) { return false; } return is_array($this->chosenObjects[$type]); } public function setObjects($objects) { if (empty($objects)) { $this->chosenObjects = []; } else { foreach ((array) $objects as $type => $object) { $this->addObjects($type, $object); } } return $this; } /** * This is a weird method, as it is required to deal with raw form data * * @param $type * @param ExportInterface[]|bool $objects */ public function addObjects($type, $objects = true) { BasketSnapshot::assertValidType($type); // '1' -> from Form! if ($objects === self::SELECTION_ALL) { $objects = true; } elseif ($objects === null || $objects === self::SELECTION_NONE) { return; } elseif ($objects === self::SELECTION_CUSTOM || is_array($objects)) { if (! isset($this->chosenObjects[$type]) || ! is_array($this->chosenObjects[$type])) { $this->chosenObjects[$type] = []; } if ($objects === self::SELECTION_CUSTOM) { $objects = []; } } if ($objects === true) { $this->chosenObjects[$type] = true; } elseif ($objects !== '0') { // TODO: what would generate '0'? foreach ($objects as $object) { $this->addObject($type, $object); } if (array_key_exists($type, $this->chosenObjects)) { ksort($this->chosenObjects[$type]); } } $this->reallySet('objects', Json::encode($this->chosenObjects)); } public function hasObject($type, $object) { if (! $this->hasType($type)) { return false; } if ($this->chosenObjects[$type] === true) { return true; } if ($object instanceof ExportInterface) { $object = $object->getUniqueIdentifier(); } if (is_array($this->chosenObjects[$type])) { return in_array($object, $this->chosenObjects[$type]); } else { return false; } } /** * @param $type * @param string $object */ public function addObject($type, $object) { if (is_array($this->chosenObjects[$type])) { $this->chosenObjects[$type][] = $object; } else { throw new \InvalidArgumentException(sprintf( 'The Basket "%s" has not been configured for single objects of type "%s"', $this->get('basket_name'), $type )); } } public function hasType($type) { return isset($this->chosenObjects[$type]); } protected function beforeStore() { if (! $this->hasBeenLoadedFromDb()) { // TODO: This is BS, use a real UUID $this->set('uuid', hex2bin(substr(sha1(microtime(true) . rand(1, 100000)), 0, 32))); } } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Automation/BasketContent.php000066400000000000000000000007141516513262500324360ustar00rootroot00000000000000 null, 'summary' => null, 'content' => null, ]; protected $binaryProperties = [ 'checksum' ]; } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Automation/BasketDiff.php000066400000000000000000000075101516513262500316750ustar00rootroot00000000000000db = $db; $this->importer = new ObjectImporter($db); $this->exporter = new Exporter($db); $this->snapshot = $snapshot; } public function hasChangedFor(string $type, string $key, ?UuidInterface $uuid = null): bool { return $this->getCurrentString($type, $key, $uuid) !== $this->getBasketString($type, $key); } public function getCurrentString(string $type, string $key, ?UuidInterface $uuid = null): string { $current = $this->getCurrent($type, $key, $uuid); return $current ? JsonString::encode($current, JSON_PRETTY_PRINT) : ''; } public function getBasketString(string $type, string $key): string { return JsonString::encode($this->getBasket($type, $key), JSON_PRETTY_PRINT); } protected function getFieldResolver(): BasketSnapshotFieldResolver { if ($this->fieldResolver === null) { $this->fieldResolver = new BasketSnapshotFieldResolver($this->getBasketObjects(), $this->db); } return $this->fieldResolver; } protected function getCurrent(string $type, string $key, ?UuidInterface $uuid = null): ?stdClass { if ($uuid && $current = BasketSnapshot::instanceByUuid($type, $uuid, $this->db)) { $exported = $this->exporter->export($current); $this->getFieldResolver()->tweakTargetIds($exported); } elseif ($current = BasketSnapshot::instanceByIdentifier($type, $key, $this->db)) { $exported = $this->exporter->export($current); $this->getFieldResolver()->tweakTargetIds($exported); } else { $exported = null; } CompareBasketObject::normalize($exported); return $exported; } protected function getBasket($type, $key): stdClass { $object = $this->getBasketObject($type, $key); $fields = $object->fields ?? null; $reExport = $this->exporter->export( $this->importer->import(BasketSnapshot::getClassForType($type), $object) ); if ($fields === null) { unset($reExport->fields); } else { $reExport->fields = $fields; } CompareBasketObject::normalize($reExport); return $reExport; } public function hasCurrentInstance(string $type, string $key, ?UuidInterface $uuid = null): bool { return $this->getCurrentInstance($type, $key, $uuid) !== null; } public function getCurrentInstance(string $type, string $key, ?UuidInterface $uuid = null) { if ($uuid && $instance = BasketSnapshot::instanceByUuid($type, $uuid, $this->db)) { return $instance; } else { return BasketSnapshot::instanceByIdentifier($type, $key, $this->db); } } public function getBasketObjects(): stdClass { if ($this->objects === null) { $this->objects = JsonString::decode($this->snapshot->getJsonDump()); } return $this->objects; } public function getBasketObject(string $type, string $key): stdClass { return $this->getBasketObjects()->$type->$key; } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Automation/BasketSnapshot.php000066400000000000000000000436001516513262500326240ustar00rootroot00000000000000 DirectorDatafieldCategory::class, 'Datafield' => DirectorDatafield::class, 'TimePeriod' => IcingaTimePeriod::class, 'CommandTemplate' => [IcingaCommand::class, ['object_type' => 'template']], 'ExternalCommand' => [IcingaCommand::class, ['object_type' => 'external_object']], 'Command' => [IcingaCommand::class, ['object_type' => 'object']], 'HostGroup' => IcingaHostGroup::class, 'IcingaTemplateChoiceHost' => IcingaTemplateChoiceHost::class, 'HostTemplate' => IcingaHost::class, 'ServiceGroup' => IcingaServiceGroup::class, 'IcingaTemplateChoiceService' => IcingaTemplateChoiceService::class, 'ServiceTemplate' => IcingaService::class, 'ServiceSet' => IcingaServiceSet::class, 'UserGroup' => IcingaUserGroup::class, 'UserTemplate' => [IcingaUser::class, ['object_type' => 'template']], 'User' => [IcingaUser::class, ['object_type' => 'object']], 'NotificationTemplate' => IcingaNotification::class, 'Notification' => [IcingaNotification::class, ['object_type' => 'apply']], 'DataList' => DirectorDatalist::class, 'Dependency' => IcingaDependency::class, 'ImportSource' => ImportSource::class, 'SyncRule' => SyncRule::class, 'DirectorJob' => DirectorJob::class, 'Basket' => Basket::class, ]; protected $objects = []; protected $content; protected $table = 'director_basket_snapshot'; protected $keyName = [ 'basket_uuid', 'ts_create', ]; protected $restoreOrder = [ 'CommandTemplate', 'ExternalCommand', 'Command', 'TimePeriod', 'HostGroup', 'HostTemplate', 'IcingaTemplateChoiceHost', 'ServiceGroup', 'IcingaTemplateChoiceService', 'ServiceTemplate', 'ServiceSet', 'UserGroup', 'UserTemplate', 'User', 'NotificationTemplate', 'Notification', 'Dependency', 'ImportSource', 'SyncRule', 'DirectorJob', 'Basket', ]; protected $defaultProperties = [ 'basket_uuid' => null, 'content_checksum' => null, 'ts_create' => null, ]; protected $binaryProperties = [ 'basket_uuid', 'content_checksum', ]; public static function supports($type) { return isset(self::$typeClasses[$type]); } public static function assertValidType($type) { if (! static::supports($type)) { throw new InvalidArgumentException("Basket does not support '$type'"); } } public static function getClassForType($type) { static::assertValidType($type); if (is_array(self::$typeClasses[$type])) { return self::$typeClasses[$type][0]; } return self::$typeClasses[$type]; } public static function getClassAndObjectTypeForType($type) { if (is_array(self::$typeClasses[$type])) { return self::$typeClasses[$type]; } return [self::$typeClasses[$type], null]; } /** * @param Basket $basket * @param Db $db * @return BasketSnapshot * @throws \Icinga\Exception\NotFoundError */ public static function createForBasket(Basket $basket, Db $db) { $snapshot = static::create([ 'basket_uuid' => $basket->get('uuid') ], $db); $snapshot->addObjectsChosenByBasket($basket); $snapshot->resolveRequiredFields(); return $snapshot; } /** * @throws \Icinga\Exception\NotFoundError */ protected function resolveRequiredFields() { /** @var Db $db */ $db = $this->getConnection(); $fieldResolver = new BasketSnapshotFieldResolver($this->objects, $db); /** @var DirectorDatafield[] $fields */ $fields = $fieldResolver->loadCurrentFields($db); $categories = []; if (! empty($fields)) { $plain = []; foreach ($fields as $id => $field) { $plain[$id] = $field->export(); if ($category = $field->getCategory()) { $categories[$category->get('category_name')] = $category->export(); } } $this->objects['Datafield'] = $plain; } if (! empty($categories)) { $this->objects['DatafieldCategory'] = $categories; } } protected function addObjectsChosenByBasket(Basket $basket) { foreach ($basket->getChosenObjects() as $typeName => $selection) { if ($selection === true) { $this->addAll($typeName); } elseif (! empty($selection)) { $this->addByIdentifiers($typeName, $selection); } } } /** * @throws \Icinga\Module\Director\Exception\DuplicateKeyException * @throws \Icinga\Exception\NotFoundError */ protected function beforeStore() { if ($this->hasBeenLoadedFromDb()) { throw new RuntimeException('A basket snapshot cannot be modified'); } $json = $this->getJsonDump(); $checksum = sha1($json, true); if (! BasketContent::exists($checksum, $this->getConnection())) { BasketContent::create([ 'checksum' => $checksum, 'summary' => $this->getJsonSummary(), 'content' => $json, ], $this->getConnection())->store(); } $this->set('content_checksum', $checksum); $this->set('ts_create', round(microtime(true) * 1000)); } /** * @param Db $connection * @throws \Icinga\Exception\NotFoundError */ public function restoreTo(Db $connection) { static::restoreJson($this->getJsonDump(), $connection); } /** * @param Basket $basket * @param $string * @return BasketSnapshot */ public static function forBasketFromJson(Basket $basket, $string) { $snapshot = static::create([ 'basket_uuid' => $basket->get('uuid') ]); $snapshot->objects = []; foreach ((array) JsonString::decode($string) as $type => $objects) { $snapshot->objects[$type] = (array) $objects; } return $snapshot; } public static function restoreJson($string, Db $connection) { (new static())->restoreObjects(JsonString::decode($string), $connection); } /** * @throws \Icinga\Module\Director\Exception\DuplicateKeyException * @throws \Zend_Db_Adapter_Exception * @throws \Icinga\Exception\NotFoundError * @throws JsonDecodeException */ protected function restoreObjects(stdClass $all, Db $connection) { $db = $connection->getDbAdapter(); $db->beginTransaction(); $fieldResolver = new BasketSnapshotFieldResolver($all, $connection); $this->restoreType($all, 'DataList', $fieldResolver, $connection); $this->restoreType($all, 'DatafieldCategory', $fieldResolver, $connection); $fieldResolver->storeNewFields(); foreach ($this->restoreOrder as $typeName) { $this->restoreType($all, $typeName, $fieldResolver, $connection); } $db->commit(); } /** * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException * @throws \Zend_Db_Adapter_Exception * @throws JsonDecodeException */ public function restoreType( stdClass $all, string $typeName, BasketSnapshotFieldResolver $fieldResolver, Db $connection ) { if (isset($all->$typeName)) { $objects = (array) $all->$typeName; } else { return; } $class = static::getClassForType($typeName); $importer = new ObjectImporter($connection); $changed = []; foreach ($objects as $object) { // This relation is unnecessary as the relation is restored using template choice members if (($typeName === 'HostTemplate' || $typeName === 'ServiceTemplate') && isset($object->template_choice)) { unset($object->template_choice); } $new = $importer->import($class, $object); if ($new->hasBeenModified()) { if ($new instanceof IcingaObject && $new->supportsImports()) { /** @var ExportInterface $new */ $changed[$new->getUniqueIdentifier()] = $new; } else { $new->store(); // Linking fields right now, as we're not in $changed if ($new instanceof IcingaObject) { $fieldResolver->relinkObjectFields($new, $object); } } } else { // No modification on the object, still, fields might have // been changed if ($new instanceof IcingaObject) { $fieldResolver->relinkObjectFields($new, $object); } } } /** @var IcingaObject $object */ foreach ($changed as $object) { $this->recursivelyStore($object, $changed); } foreach ($changed as $key => $new) { // Store related fields. As objects might have formerly been // un-stored, let's do it right here if ($new instanceof IcingaObject) { $fieldResolver->relinkObjectFields($new, $objects[$key]); } } } /** * @param IcingaObject $object * @param $list * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function recursivelyStore(IcingaObject $object, &$list) { foreach ($object->listImportNames() as $parent) { if (array_key_exists($parent, $list)) { $this->recursivelyStore($list[$parent], $list); } } $object->store(); } /** * @throws \Icinga\Exception\NotFoundError */ protected function getContent(): BasketContent { if ($this->content === null) { $this->content = BasketContent::load($this->get('content_checksum'), $this->getConnection()); } return $this->content; } protected function onDelete() { $db = $this->getDb(); $db->delete( ['bc' => 'director_basket_content'], 'NOT EXISTS (SELECT director_basket_checksum WHERE content_checksum = bc.checksum)' ); } /** * @throws \Icinga\Exception\NotFoundError|JsonEncodeException */ public function getJsonSummary(): string { if ($this->hasBeenLoadedFromDb()) { return $this->getContent()->get('summary'); } return JsonString::encode($this->getSummary(), JSON_PRETTY_PRINT); } /** * @return array|mixed * @throws \Icinga\Exception\NotFoundError|JsonDecodeException */ public function getSummary() { if ($this->hasBeenLoadedFromDb()) { return JsonString::decode($this->getContent()->get('summary')); } $summary = []; foreach (array_keys($this->objects) as $key) { $summary[$key] = count($this->objects[$key]); } return $summary; } /** * @return string * @throws \Icinga\Exception\NotFoundError|JsonEncodeException */ public function getJsonDump() { if ($this->hasBeenLoadedFromDb()) { return $this->getContent()->get('content'); } try { return JsonString::encode($this->objects, JSON_PRETTY_PRINT); } catch (JsonEncodeException $e) { foreach ($this->objects as $type => $objects) { foreach ($objects as $object) { try { JsonString::encode($object); } catch (JsonEncodeException $singleError) { $dump = var_export($object, true); if (function_exists('iconv')) { $dump = iconv('UTF-8', 'UTF-8//IGNORE', $dump); } throw new JsonEncodeException(sprintf( 'Failed to encode object ot type "%s": %s, %s', $type, $dump, $singleError->getMessage() ), $singleError->getCode()); } } } throw $e; } } protected function addAll($typeName) { list($class, $filter) = static::getClassAndObjectTypeForType($typeName); $connection = $this->getConnection(); assert($connection instanceof Db); /** @var IcingaObject $dummy */ $dummy = $class::create(); if ($dummy instanceof IcingaObject && $dummy->supportsImports()) { $db = $this->getDb(); $select = $db->select()->from($dummy->getTableName()); if ($filter) { foreach ($filter as $column => $value) { $select->where("$column = ?", $value); } } elseif ( ! $dummy->isGroup() // TODO: this is ugly. && ! $dummy instanceof IcingaDependency && ! $dummy instanceof IcingaTimePeriod ) { $select->where('object_type = ?', 'template'); } $all = $class::loadAll($connection, $select); } else { $all = $class::loadAll($connection); } $exporter = new Exporter($connection); foreach ($all as $object) { $exportedObject = $exporter->export($object); // This relation is unnecessary as the relation can be restored using template choice members if ( $object instanceof IcingaHost || ($object instanceof IcingaService && $object->isTemplate()) && isset($exportedObject->template_choice) ) { unset($exportedObject->template_choice); } $this->objects[$typeName][$object->getUniqueIdentifier()] = $exportedObject; } } protected function addByIdentifiers($typeName, $identifiers) { foreach ($identifiers as $identifier) { $this->addByIdentifier($typeName, $identifier); } } /** * @return ExportInterface|DbObject|null */ public static function instanceByUuid(string $typeName, UuidInterface $uuid, Db $connection) { /** @var class-string $class */ $class = static::getClassForType($typeName); /** @var ExportInterface $object */ return $class::loadWithUniqueId($uuid, $connection); } /** * @param $typeName * @param $identifier * @param Db $connection * @return ExportInterface|DbObject|null */ public static function instanceByIdentifier($typeName, $identifier, Db $connection) { /** @var class-string $class */ $class = static::getClassForType($typeName); if ($class === IcingaService::class) { $identifier = [ 'object_type' => 'template', 'object_name' => $identifier, ]; } /** @var ExportInterface $object */ return $class::loadOptional($identifier, $connection); } /** * @param $typeName * @param $identifier */ protected function addByIdentifier($typeName, $identifier) { /** @var Db $connection */ $connection = $this->getConnection(); $exporter = new Exporter($connection); $object = static::instanceByIdentifier( $typeName, $identifier, $connection ); if ($object !== null) { $exportedObject = $exporter->export($object); // This relation is unnecessary as the relation can be restored using template choice members if ( $object instanceof IcingaHost || ($object instanceof IcingaService && $object->isTemplate()) && isset($exportedObject->template_choice) ) { unset($exportedObject->template_choice); } $this->objects[$typeName][$identifier] = $exportedObject; } } } BasketSnapshotFieldResolver.php000066400000000000000000000162071516513262500352360ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Automationobjects = $objects; $this->targetDb = $targetDb; } /** * @param Db $db * @return DirectorDatafield[] * @throws \Icinga\Exception\NotFoundError */ public function loadCurrentFields(Db $db): array { $fields = []; foreach ($this->getRequiredIds() as $id) { $fields[$id] = DirectorDatafield::loadWithAutoIncId((int) $id, $db); } return $fields; } /** * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function storeNewFields() { $this->targetFields = null; // Clear Cache foreach ($this->getTargetFields() as $id => $field) { if ($field->hasBeenModified()) { $field->store(); $this->idMap[$id] = $field->get('id'); } } } /** * @param IcingaObject $new * @param $object * @throws \Icinga\Exception\NotFoundError * @throws \Zend_Db_Adapter_Exception */ public function relinkObjectFields(IcingaObject $new, $object) { if (! $new->supportsFields() || ! isset($object->fields)) { return; } $fieldMap = $this->getIdMap(); $objectId = (int) $new->get('id'); $table = $new->getTableName() . '_field'; $objectKey = $new->getShortTableName() . '_id'; $existingFields = []; $db = $this->targetDb->getDbAdapter(); foreach ( $db->fetchAll( $db->select()->from($table)->where("$objectKey = ?", $objectId) ) as $mapping ) { $existingFields[(int) $mapping->datafield_id] = $mapping; } foreach ($object->fields as $field) { if (! isset($fieldMap[(int) $field->datafield_id])) { throw new InvalidArgumentException( 'Basket Snapshot contains invalid field reference: ' . $field->datafield_id ); } $id = $fieldMap[(int) $field->datafield_id]; if (isset($existingFields[$id])) { unset($existingFields[$id]); } else { $db->insert($table, [ $objectKey => $objectId, 'datafield_id' => $id, 'is_required' => $field->is_required, 'var_filter' => $field->var_filter, ]); } } if (! empty($existingFields)) { $db->delete( $table, $db->quoteInto( "$objectKey = $objectId AND datafield_id IN (?)", array_keys($existingFields) ) ); } } /** * For diff purposes only, gives '(UNKNOWN)' for fields missing in our DB * * @param object $object * @throws \Icinga\Exception\NotFoundError */ public function tweakTargetIds($object) { $forward = $this->getIdMap(); $map = array_flip($forward); if (isset($object->fields)) { foreach ($object->fields as $field) { $id = $field->datafield_id; if (isset($map[$id])) { $field->datafield_id = $map[$id]; } else { $field->datafield_id = "(UNKNOWN)"; } } } } public static function fixOptionalDatalistReference(stdClass $plain, Db $db) { if (isset($plain->settings->datalist_uuid)) { unset($plain->settings->datalist); return; } if (isset($plain->settings->datalist)) { // Just try to load the list, final import will fail if missing // No modification in case we do not find the list, if ($list = DirectorDatalist::loadOptional($plain->settings->datalist, $db)) { unset($plain->settings->datalist); $plain->settings->datalist_id = $list->get('id'); } } } protected function getNextNewId(): int { return $this->nextNewId++; } protected function getRequiredIds(): array { if ($this->requiredIds === null) { if (isset($this->objects['Datafield'])) { $this->requiredIds = array_keys($this->objects['Datafield']); } else { $ids = []; foreach ($this->objects as $typeName => $objects) { foreach ($objects as $key => $object) { if (isset($object->fields)) { foreach ($object->fields as $field) { $ids[$field->datafield_id] = true; } } } } $this->requiredIds = array_keys($ids); } } return $this->requiredIds; } /** * @param $type * @return object[] */ protected function getObjectsByType($type): array { if (isset($this->objects->$type)) { return (array) $this->objects->$type; } else { return []; } } /** * @return DirectorDatafield[] * @throws \Icinga\Exception\NotFoundError */ protected function getTargetFields(): array { if ($this->targetFields === null) { $this->calculateIdMap(); } return $this->targetFields; } /** * @throws \Icinga\Exception\NotFoundError */ protected function getIdMap(): array { if ($this->idMap === null) { $this->calculateIdMap(); } return $this->idMap; } /** * @throws \Icinga\Exception\NotFoundError */ protected function calculateIdMap() { $this->idMap = []; $this->targetFields = []; foreach ($this->getObjectsByType('Datafield') as $id => $object) { unset($object->category_id); // Fix old baskets // Hint: import() doesn't store! $new = DirectorDatafield::import($object, $this->targetDb); if ($new->hasBeenLoadedFromDb()) { $newId = (int) $new->get('id'); } else { $newId = sprintf('NEW(%s)', $this->getNextNewId()); } $this->idMap[$id] = $newId; $this->targetFields[$id] = $new; } } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Automation/CompareBasketObject.php000066400000000000000000000112251516513262500335400ustar00rootroot00000000000000 &$v) { static::normalize($v); } unset($v); } if (is_object($value)) { $sorted = (array) $value; // foreign baskets might not sort as we do: ksort($sorted); foreach ($sorted as $k => &$v) { static::normalize($v); } unset($v); $value = (object) $sorted; // foreign baskets might not sort those lists correctly: if (isset($value->list_name) && isset($value->entries)) { static::sortListBy('entry_name', $value->entries); } if (isset($value->fields)) { static::sortListBy('datafield_id', $value->fields); } } } protected static function sortListBy($key, &$list) { usort($list, function ($a, $b) use ($key) { if (is_array($a)) { return $a[$key] > $b[$key] ? -1 : 1; } else { return $a->$key > $b->$key ? -1 : 1; } }); } public static function equals($a, $b) { if (is_scalar($a)) { return $a === $b; } if ($a === null) { return $b === null; } // Well... this is annoying :-/ $a = Json::decode(Json::encode($a, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); $b = Json::decode(Json::encode($b, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); if (is_array($a)) { // Empty arrays VS empty objects :-( This is a fallback, not needed unless en/decode takes place if (empty($a) && is_object($b) && (array) $b === []) { return true; } if (! is_array($b)) { return false; } if (array_keys($a) !== array_keys($b)) { return false; } foreach ($a as $k => $v) { if (array_key_exists($k, $b) && static::equals($b[$k], $v)) { continue; } return false; } return true; } if (is_object($a)) { // Well... empty arrays VS empty objects :-( if ($b === [] && (array) $a === []) { return true; } if (! is_object($b)) { return false; } // Workaround, same as above if (isset($a->list_name) && isset($a->entries)) { if (! isset($b->entries)) { return false; } static::sortListBy('entry_name', $a->entries); static::sortListBy('entry_name', $b->entries); } if (isset($a->fields) && isset($b->fields)) { static::sortListBy('datafield_id', $a->fields); static::sortListBy('datafield_id', $b->fields); } foreach ((array) $a as $k => $v) { if (property_exists($b, $k) && static::equals($v, $b->$k)) { continue; } if (! property_exists($b, $k)) { if ($v === null) { continue; } // Deal with two special defaults: if ($k === 'set_if_format' && $v === 'string') { continue; } if ($k === 'disabled' && $v === false) { continue; } } return false; } foreach ((array) $b as $k => $v) { if (! property_exists($a, $k)) { if ($v === null) { continue; } // Once again: if ($k === 'set_if_format' && $v === 'string') { continue; } if ($k === 'disabled' && $v === false) { continue; } return false; } } return true; } throw new RuntimeException("Cannot compare " . Error::getPhpTypeName($a)); } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Automation/ExportInterface.php000066400000000000000000000003031516513262500327660ustar00rootroot00000000000000connection = $connection; $this->exporter = new Exporter($connection); } public function serializeAllServiceSets() { $res = []; foreach (IcingaServiceSet::loadAll($this->connection) as $object) { if ($object->get('host_id')) { continue; } $res[] = $this->exporter->export($object); } return $res; } public function serializeAllHostTemplateChoices() { $res = []; foreach (IcingaTemplateChoiceHost::loadAll($this->connection) as $object) { $res[] = $this->exporter->export($object); } return $res; } public function serializeAllHostGroups() { $res = []; foreach (IcingaHostGroup::loadAll($this->connection) as $object) { $res[] = $object->toPlainObject(); } return $res; } public function serializeAllServiceGroups() { $res = []; foreach (IcingaServiceGroup::loadAll($this->connection) as $object) { $res[] = $object->toPlainObject(); } return $res; } public function serializeAllDataFields() { $res = []; foreach (DirectorDatafield::loadAll($this->connection) as $object) { $res[] = $this->exporter->export($object); } return $res; } public function serializeAllDataLists() { $res = []; foreach (DirectorDatalist::loadAll($this->connection) as $object) { $res[] = $this->exporter->export($object); } return $res; } public function serializeAllJobs() { $res = []; foreach (DirectorJob::loadAll($this->connection) as $object) { $res[] = $this->exporter->export($object); } return $res; } public function serializeAllImportSources() { $res = []; foreach (ImportSource::loadAll($this->connection) as $object) { $res[] = $this->exporter->export($object); } return $res; } public function serializeAllSyncRules() { $res = []; foreach (SyncRule::loadAll($this->connection) as $object) { $res[] = $this->exporter->export($object); } return $res; } public function unserializeImportSources($objects) { $count = 0; $this->connection->runFailSafeTransaction(function () use ($objects, &$count) { $importer = new ObjectImporter($this->connection); foreach ($objects as $object) { $importer->import(ImportSource::class, $object)->store(); $count++; } }); return $count; } public function unserializeSyncRules($objects) { $count = 0; $this->connection->runFailSafeTransaction(function () use ($objects, &$count) { $importer = new ObjectImporter($this->connection); foreach ($objects as $object) { $importer->import(SyncRule::class, $object)->store(); } $count++; }); return $count; } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Lookup/000077500000000000000000000000001516513262500263105ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Lookup/AppliedServiceInfo.php000066400000000000000000000055361516513262500325450ustar00rootroot00000000000000hostName = $hostName; $this->serviceName = $serviceName; $this->serviceApplyRuleId = $serviceApplyRuleId; $this->uuid = $uuid; } public static function find(IcingaHost $host, $serviceName) { $matcher = HostApplyMatches::prepare($host); $connection = $host->getConnection(); foreach (static::fetchApplyRulesByServiceName($connection, $serviceName) as $rule) { if ($matcher->matchesFilter($rule->filter)) { return new static($host->getObjectName(), $serviceName, (int) $rule->id, $rule->uuid); } } return null; } public function getHostName() { return $this->hostName; } /** * @return int */ public function getServiceApplyRuleId() { return $this->serviceApplyRuleId; } public function getName() { return $this->serviceName; } public function getUuid() { return $this->uuid; } public function getUrl() { return Url::fromPath('director/host/appliedservice', [ 'name' => $this->hostName, 'service_id' => $this->serviceApplyRuleId, ]); } public function requiresOverrides() { return true; } protected static function fetchApplyRulesByServiceName(Db $connection, $serviceName) { $db = $connection->getDbAdapter(); $query = $db->select() ->from(['s' => 'icinga_service'], [ 'id' => 's.id', 'uuid' => 's.uuid', 'name' => 's.object_name', 'assign_filter' => 's.assign_filter', ]) ->where('object_name = ?', $serviceName) ->where('object_type = ? AND assign_filter IS NOT NULL', 'apply'); $allRules = $db->fetchAll($query); foreach ($allRules as $rule) { $rule->uuid = Uuid::fromBytes(Db\DbUtil::binaryResult($rule->uuid)); $rule->filter = Filter::fromQueryString($rule->assign_filter); } return $allRules; } } AppliedServiceSetServiceInfo.php000066400000000000000000000067511516513262500344630ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/DirectorObject/LookuphostName = $hostName; $this->serviceName = $serviceName; $this->serviceSetName = $serviceSetName; $this->uuid = $uuid; } public static function find(IcingaHost $host, $serviceName) { $matcher = HostApplyMatches::prepare($host); $connection = $host->getConnection(); foreach (static::fetchServiceSetApplyRulesByServiceName($connection, $host->get('id'), $serviceName) as $rule) { if ($matcher->matchesFilter($rule->filter)) { return new static( $host->getObjectName(), $serviceName, $rule->service_set_name, $rule->uuid ); } } return null; } public function getHostName() { return $this->hostName; } public function getUuid() { return $this->uuid; } /** * @return string */ public function getServiceSetName() { return $this->serviceSetName; } public function getName() { return $this->serviceName; } public function getUrl() { return Url::fromPath('director/host/servicesetservice', [ 'name' => $this->hostName, 'service' => $this->serviceName, 'set' => $this->serviceSetName, ]); } public function requiresOverrides() { return true; } protected static function fetchServiceSetApplyRulesByServiceName(Db $connection, $hostId, $serviceName) { $db = $connection->getDbAdapter(); $query = $db->select() ->from(['s' => 'icinga_service'], [ 'id' => 's.id', 'uuid' => 'ss.uuid', 'name' => 's.object_name', 'assign_filter' => 'ss.assign_filter', 'service_set_name' => 'ss.object_name', ]) ->join( ['ss' => 'icinga_service_set'], 's.service_set_id = ss.id', [] ) ->where('s.object_name = ?', $serviceName) ->where('ss.assign_filter IS NOT NULL') ->where( // Ignore deactivated Services: 'NOT EXISTS (SELECT 1 FROM icinga_host_service_blacklist hsb' . ' WHERE hsb.host_id = ? AND hsb.service_id = s.id)', (int) $hostId ); ; $allRules = $db->fetchAll($query); foreach ($allRules as $rule) { $rule->uuid = Uuid::fromBytes(Db\DbUtil::binaryResult($rule->uuid)); $rule->filter = Filter::fromQueryString($rule->assign_filter); } return $allRules; } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Lookup/InheritedServiceInfo.php000066400000000000000000000044701516513262500330760ustar00rootroot00000000000000hostName = $hostName; $this->hostTemplateName = $hostTemplateName; $this->serviceName = $serviceName; $this->uuid = $uuid; } public static function find(IcingaHost $host, $serviceName) { $db = $host->getConnection(); foreach (IcingaTemplateRepository::instanceByObject($host)->getTemplatesFor($host, true) as $parent) { $key = [ 'host_id' => $parent->get('id'), 'object_name' => $serviceName ]; if (IcingaService::exists($key, $db)) { return new static( $host->getObjectName(), $parent->getObjectName(), $serviceName, IcingaService::load($key, $db)->getUniqueId() ); } } return false; } public function getHostName() { return $this->hostName; } public function getUuid() { return $this->uuid; } /** * @return string */ public function getHostTemplateName() { return $this->hostTemplateName; } public function getName() { return $this->serviceName; } public function getUrl() { return Url::fromPath('director/host/inheritedservice', [ 'name' => $this->hostName, 'service' => $this->serviceName, 'inheritedFrom' => $this->hostTemplateName ]); } public function requiresOverrides() { return true; } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Lookup/ServiceFinder.php000066400000000000000000000025341516513262500315550ustar00rootroot00000000000000host = $host; $this->auth = $auth; $this->db = $host->getConnection(); } public static function find(IcingaHost $host, $serviceName) { foreach ( [ SingleServiceInfo::class, InheritedServiceInfo::class, ServiceSetServiceInfo::class, AppliedServiceInfo::class, AppliedServiceSetServiceInfo::class, ] as $class ) { /** @var ServiceInfo $class */ if ($info = $class::find($host, $serviceName)) { return $info; } } return false; } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Lookup/ServiceInfo.php000066400000000000000000000015131516513262500312350ustar00rootroot00000000000000hostName = $hostName; $this->serviceName = $serviceName; $this->serviceSetName = $serviceSetName; $this->uuid = $uuid; } public static function find(IcingaHost $host, $serviceName) { $ids = [$host->get('id')]; foreach (IcingaTemplateRepository::instanceByObject($host)->getTemplatesFor($host, true) as $parent) { $ids[] = $parent->get('id'); } $db = $host->getConnection()->getDbAdapter(); $query = $db->select() ->from( ['s' => 'icinga_service'], [ 'service_set_name' => 'ss.object_name', 'uuid' => 's.uuid', ] )->join( ['ss' => 'icinga_service_set'], 's.service_set_id = ss.id', [] )->join( ['hsi' => 'icinga_service_set_inheritance'], 'hsi.parent_service_set_id = ss.id', [] )->join( ['hs' => 'icinga_service_set'], 'hs.id = hsi.service_set_id', [] )->where('hs.host_id IN (?)', $ids) ->where('s.object_name = ?', $serviceName) ->where( // Ignore deactivated Services: 'NOT EXISTS (SELECT 1 FROM icinga_host_service_blacklist hsb' . ' WHERE hsb.host_id = ? AND hsb.service_id = s.id)', (int) $host->get('id') ); if ($row = $db->fetchRow($query)) { return new static( $host->getObjectName(), $serviceName, $row->service_set_name, Uuid::fromBytes(DbUtil::binaryResult($row->uuid)) ); } return null; } public function getHostName() { return $this->hostName; } public function getName() { return $this->serviceName; } public function getUuid() { return $this->uuid; } /** * @return string */ public function getServiceSetName() { return $this->serviceSetName; } public function getUrl() { return Url::fromPath('director/host/servicesetservice', [ 'name' => $this->hostName, 'service' => $this->serviceName, 'set' => $this->serviceSetName, ]); } public function requiresOverrides() { return true; } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/Lookup/SingleServiceInfo.php000066400000000000000000000037371516513262500324110ustar00rootroot00000000000000hostName = $hostName; $this->serviceName = $serviceName; $this->useOverrides = $useOverrides; $this->uuid = $uuid; } public static function find(IcingaHost $host, $serviceName) { $keyParams = [ 'host_id' => $host->get('id'), 'object_name' => $serviceName ]; $connection = $host->getConnection(); if (IcingaService::exists($keyParams, $connection)) { $service = IcingaService::load($keyParams, $connection); $useOverrides = $service->getResolvedVar('use_var_overrides') === 'y'; return new static($host->getObjectName(), $serviceName, $service->getUniqueId(), $useOverrides); } return false; } public function getHostName() { return $this->hostName; } public function getName() { return $this->serviceName; } /** * @return UuidInterface */ public function getUuid() { return $this->uuid; } public function getUrl() { return Url::fromPath('director/service/edit', [ 'host' => $this->hostName, 'name' => $this->serviceName, ]); } public function requiresOverrides() { return $this->useOverrides; } } icingaweb2-module-director-1.11.8/library/Director/DirectorObject/ObjectPurgeHelper.php000066400000000000000000000106641516513262500311300ustar00rootroot00000000000000db = $db; } public function force($force = true) { $this->force = $force; return $this; } public function purge(array $keep, $class, $objectType = null) { if (empty($keep) && ! $this->force) { throw new InvalidArgumentException('I will NOT purge all object unless being forced to do so'); } $db = $this->db->getDbAdapter(); /** @var IcingaObject $class cheating, it's a class name, not an object */ $dummy = $class::create(); assert($dummy instanceof IcingaObject); $keyCols = (array) $dummy->getKeyName(); if ($objectType !== null) { $keyCols[] = 'object_type'; } $keepKeys = []; foreach ($keep as $object) { if ($object instanceof \stdClass) { $properties = (array) $object; // TODO: this is object-specific and to be found in the ::import() function! unset($properties['fields']); $object = $class::fromPlainObject($properties); } elseif (get_class($object) !== $class) { throw new InvalidArgumentException( 'Can keep only matching objects, expected "%s", got "%s', $class, get_class($object) ); } $key = []; foreach ($keyCols as $col) { $key[$col] = $object->get($col); } $keepKeys[$this->makeRowKey($key)] = true; } $query = $db->select()->from(['o' => $dummy->getTableName()], $keyCols); if ($objectType !== null) { $query->where('object_type = ?', $objectType); } $allExisting = []; foreach ($db->fetchAll($query) as $row) { $allExisting[$this->makeRowKey($row)] = $row; } $remove = []; foreach ($allExisting as $key => $keyProperties) { if (! isset($keepKeys[$key])) { $remove[] = $keyProperties; } } $db->beginTransaction(); foreach ($remove as $keyProperties) { $keyColumn = $class::getKeyColumnName(); if (is_array($keyColumn)) { $object = $class::load((array) $keyProperties, $this->db); } else { $object = $class::load($keyProperties->$keyColumn, $this->db); } $object->delete(); } $db->commit(); } public static function listObjectTypesAvailableForPurge() { return [ 'Basket', 'Command', 'CommandTemplate', 'Dependency', 'DirectorJob', 'ExternalCommand', 'HostGroup', 'HostTemplate', 'IcingaTemplateChoiceHost', 'IcingaTemplateChoiceService', 'ImportSource', 'Notification', 'NotificationTemplate', 'ServiceGroup', 'ServiceSet', 'ServiceTemplate', 'SyncRule', 'TimePeriod', ]; } public static function objectTypeIsEligibleForPurge($type) { return in_array($type, static::listObjectTypesAvailableForPurge(), true); } public static function assertObjectTypesAreEligibleForPurge($types) { $invalid = []; foreach ($types as $type) { if (! static::objectTypeIsEligibleForPurge($type)) { $invalid[] = $type; } } if (empty($invalid)) { return; } if (count($invalid) === 1) { $message = sprintf('"%s" is not eligible for purge', $invalid[0]); } else { $message = 'The following types are not eligible for purge: ' . implode(', ', $invalid); } throw new InvalidArgumentException( "$message. Valid types: " . implode(', ', static::listObjectTypesAvailableForPurge()) ); } protected function makeRowKey($row) { $row = (array) $row; ksort($row); return json_encode($row, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } } icingaweb2-module-director-1.11.8/library/Director/Exception/000077500000000000000000000000001516513262500240735ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Exception/DuplicateKeyException.php000066400000000000000000000002231516513262500310430ustar00rootroot00000000000000 'The maximum stack depth has been exceeded', JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON', JSON_ERROR_SYNTAX => 'JSON Syntax error', JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded' ]; if (\array_key_exists($code, $map)) { return $map[$code]; } if (PHP_VERSION_ID >= 50500) { $map = [ JSON_ERROR_RECURSION => 'One or more recursive references in the value to be encoded', JSON_ERROR_INF_OR_NAN => 'One or more NAN or INF values in the value to be encoded', JSON_ERROR_UNSUPPORTED_TYPE => 'A value of a type that cannot be encoded was given', ]; if (\array_key_exists($code, $map)) { return $map[$code]; } } if (PHP_VERSION_ID >= 70000) { $map = [ JSON_ERROR_INVALID_PROPERTY_NAME => 'A property name that cannot be encoded was given', JSON_ERROR_UTF16 => 'Malformed UTF-16 characters, possibly incorrectly encoded', ]; if (\array_key_exists($code, $map)) { return $map[$code]; } } return 'An error occured when parsing a JSON string'; } } icingaweb2-module-director-1.11.8/library/Director/Exception/NestingError.php000066400000000000000000000002121516513262500272200ustar00rootroot00000000000000dataType = $dataType; $this->varName = $varName; $this->caption = $caption; } public function toDataField(IcingaObject $object) { return DirectorDatafield::create([ 'varname' => $this->getVarName(), 'category' => $this->getCategory(), 'caption' => $this->getCaption(), 'description' => $this->getDescription(), 'datatype' => $this->getDataType(), 'format' => $this->getFormat(), 'var_filter' => $this->getVarFilter(), 'icinga_type' => $object->getShortTableName(), 'object_id' => $object->get('id'), ]); } /** * @return string */ public function getVarName() { return $this->varName; } /** * @param string $varName * @return FieldSpec */ public function setVarName($varName) { $this->varName = $varName; return $this; } /** * @return string */ public function getCaption() { return $this->caption; } /** * @param string $caption * @return FieldSpec */ public function setCaption($caption) { $this->caption = $caption; return $this; } /** * @return bool */ public function isRequired() { return $this->isRequired; } /** * @param bool $isRequired * @return FieldSpec */ public function setIsRequired($isRequired) { $this->isRequired = $isRequired; return $this; } /** * @return string */ public function getDescription() { return $this->description; } /** * @param string $description * @return FieldSpec */ public function setDescription($description) { $this->description = $description; return $this; } /** * @return string */ public function getDataType() { return $this->dataType; } /** * @param string $dataType * @return FieldSpec */ public function setDataType($dataType) { $this->dataType = $dataType; return $this; } /** * @return string */ public function getVarFilter() { return $this->varFilter; } /** * @param string $varFilter * @return FieldSpec */ public function setVarFilter($varFilter) { $this->varFilter = $varFilter; return $this; } /** * @return string */ public function getFormat() { return $this->format; } /** * @param string $format * @return FieldSpec */ public function setFormat($format) { $this->format = $format; return $this; } /** * @return string */ public function getCategory() { return $this->category; } /** * @param string $category * @return FieldSpec */ public function setCategory($category) { $this->category = $category; return $this; } } icingaweb2-module-director-1.11.8/library/Director/Field/FormFieldSuggestion.php000066400000000000000000000111611516513262500276100ustar00rootroot00000000000000command = $command; $this->existingFields = $existingFields; } public function getCommandFields(): array { if ($this->fields === null) { $this->fields = $this->prepareFields(); } return $this->fields; } protected function prepareFields(): array { // TODO: remove assigned ones! foreach ($this->existingFields as $id => $field) { if (preg_match('/ \(([^)]+)\)$/', $field, $m)) { $this->blacklistedVars['$' . $m[1] . '$'] = $id; } } if ($this->command) { foreach ($this->command->arguments() as $arg) { if ($arg->argument_format === 'string') { foreach (self::extractMacroNamesFromString($arg->argument_value) as $val) { $this->addSuggestion($val, $arg->description, $this->argumentVars); } } if ( ($arg->set_if_format === 'string' || $arg->set_if_format === null) && $val = self::getMacroIfStringIsSingleMacro($arg->set_if) ) { $this->addSuggestion($val, $arg->description, $this->booleans); } } } asort($this->suggestedFields, SORT_NATURAL | SORT_FLAG_CASE); ksort($this->argumentVars); ksort($this->booleans); asort($this->existingFields, SORT_NATURAL | SORT_FLAG_CASE); // Prepare combined fields array $fields = []; if (! empty($this->suggestedFields)) { $fields[$this->translate('Suggested fields')] = $this->suggestedFields; } if (! empty($this->argumentVars)) { $fields[$this->translate('Argument macros')] = $this->argumentVars; } if (! empty($this->booleans)) { $fields[$this->translate('Toggles (boolean arguments)')] = $this->booleans; } if (! empty($this->existingFields)) { $fields[$this->translate('Other available fields')] = $this->existingFields; } return $fields; } public function getDescription($id) { if (array_key_exists($id, $this->descriptions)) { return $this->descriptions[$id]; } return null; } public function isBoolean(string $macro): bool { return isset($this->booleans[$macro]); } protected function addSuggestion( string $val, ?string $description, array &$targetList ) { if (array_key_exists($val, $this->blacklistedVars)) { $id = $this->blacklistedVars[$val]; // Hint: if not set it might already have been // removed in this loop if (array_key_exists($id, $this->existingFields)) { $this->suggestedFields[$id] = $this->existingFields[$id]; unset($this->existingFields[$id]); } } else { $targetList[$val] = $val; $this->descriptions[$val] = $description; } } /** * Returns a macro name string ($macro_name$), if the given string is such, null otherwise * * @param ?string $string * @return ?string */ protected static function getMacroIfStringIsSingleMacro(?string $string): ?string { if ($string === null) { return null; } if (preg_match('/^(\$[a-z0-9_]+\$)$/i', $string, $matches)) { return $matches[1]; } return null; } /** * Extracts all macro names ($macro_name$) from a given string * * @param ?string $string * @return array */ protected static function extractMacroNamesFromString(?string $string): array { if ($string !== null && preg_match_all('/(\$[a-z0-9_]+\$)/i', $string, $matches, PREG_PATTERN_ORDER)) { return $matches[1]; } return []; } } icingaweb2-module-director-1.11.8/library/Director/Filter/000077500000000000000000000000001516513262500233625ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Filter/CidrExpression.php000066400000000000000000000051621516513262500270400ustar00rootroot00000000000000networkAddress, $this->broadcastAddress) = $parts; } else { throw new InvalidArgumentException("'$expression' isn't valid CIDR notation"); } parent::__construct($column, $sign, $expression); } public static function isCidrFormat(string $string): bool { return static::splitOptionalCidrString($string) !== null; } protected static function splitOptionalCidrString(string $string): ?array { if (preg_match('#^(.+?)/(\d{1,3})$#', $string, $match)) { $address = $match[1]; $mask = (int) $match[2]; if (filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) && $mask <= 32) { $bits = 32; } elseif (filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) && $mask <= 128) { $bits = 128; } else { return null; } $binaryAddress = inet_pton($address); $broadcast = $binaryAddress | static::bitmaskToInverseBinaryMask($mask, $bits); return [$binaryAddress, $broadcast]; } return null; } public function matches($row): bool { if (! isset($row->{$this->column})) { return false; } $value = inet_pton((string) $row->{$this->column}); return $value >= $this->networkAddress && $value <= $this->broadcastAddress; } public static function fromExpression(FilterExpression $filter): CidrExpression { $sign = $filter->getSign(); if ($sign !== '=') { throw new InvalidArgumentException("'$sign' cannot be applied to CIDR notation"); } return new CidrExpression($filter->getColumn(), $sign, $filter->getExpression()); } protected static function bitmaskToInverseBinaryMask($mask, $maxLen): string { $binary = str_pad(str_pad('', $mask, '0'), $maxLen, '1'); $address = ''; foreach (array_map('bindec', str_split($binary, 8)) as $char) { $address .= pack('C*', $char); } return $address; } } icingaweb2-module-director-1.11.8/library/Director/Filter/FilterEnrichment.php000066400000000000000000000016401516513262500273360ustar00rootroot00000000000000getExpression())) { return CidrExpression::fromExpression($filter); } } elseif ($filter instanceof FilterChain) { foreach ($filter->filters() as $subFilter) { if ( $subFilter instanceof FilterExpression && CidrExpression::isCidrFormat($subFilter->getExpression()) ) { $filter->replaceById($subFilter->getId(), CidrExpression::fromExpression($subFilter)); } } } return $filter; } } icingaweb2-module-director-1.11.8/library/Director/Health.php000066400000000000000000000227041516513262500240600ustar00rootroot00000000000000 'checkConfig', 'sync' => 'checkSyncRules', 'import' => 'checkImportSources', 'jobs' => 'checkDirectorJobs', 'deployment' => 'checkDeployments', ]; public function setDbResourceName($name) { $this->dbResourceName = $name; return $this; } public function getCheck(string $name, ?string $checkName = null): CheckResults { if (! array_key_exists($name, $this->checks)) { return (new CheckResults('Invalid Parameter')) ->fail("There is no check named '$name'"); } if ($checkName !== null && ($name === 'deployment' || $name === 'config')) { return (new CheckResults('Invalid Parameter')) ->fail('--name is not supported with --check deployment or --check config'); } $func = $this->checks[$name]; if ($checkName !== null) { $check = $this->$func($checkName); } else { $check = $this->$func(); } return $check; } public function getAllChecks() { /** @var CheckResults[] $checks */ $checks = [$this->checkConfig()]; if ($checks[0]->hasErrors()) { return $checks; } $checks[] = $this->checkDeployments(); $checks[] = $this->checkImportSources(); $checks[] = $this->checkSyncRules(); $checks[] = $this->checkDirectorJobs(); return $checks; } protected function hasDeploymentEndpoint() { try { return $this->connection->hasDeploymentEndpoint(); } catch (Exception $e) { return false; } } public function hasResourceConfig() { return $this->getDbResourceName() !== null; } protected function getDbResourceName() { if ($this->dbResourceName === null) { $this->dbResourceName = Config::module('director')->get('db', 'resource'); } return $this->dbResourceName; } protected function getConnection() { if ($this->connection === null) { $this->connection = Db::fromResourceName($this->getDbResourceName()); } return $this->connection; } public function checkConfig() { $check = new Check('Director configuration'); $name = $this->getDbResourceName(); if ($name) { $check->succeed("Database resource '$name' has been specified"); } else { return $check->fail('No database resource has been specified'); } try { $db = $this->getConnection(); } catch (Exception $e) { return $check->fail($e); } $migrations = new Migrations($db); $check->assertTrue( [$migrations, 'hasSchema'], 'Make sure the DB schema exists' ); if ($check->hasProblems()) { return $check; } $check->call(function () use ($check, $migrations) { $count = $migrations->countPendingMigrations(); if ($count === 0) { $check->succeed('There are no pending schema migrations'); } elseif ($count === 1) { $check->warn('There is a pending schema migration'); } else { $check->warn(sprintf( 'There are %s pending schema migrations', $count )); } }); return $check; } public function checkSyncRules(?string $checkName = null): CheckResults { $check = new CheckResults('Sync Rules'); if ($checkName !== null) { $rules = [SyncRule::load($checkName, $this->getConnection())]; } else { $rules = SyncRule::loadAll($this->getConnection(), null, 'rule_name'); if (empty($rules)) { $check->succeed('No Sync Rules have been defined'); return $check; } ksort($rules); } foreach ($rules as $rule) { $state = $rule->get('sync_state'); $name = $rule->get('rule_name'); if ($state === 'failing') { $message = $rule->get('last_error_message'); $check->fail("'$name' is failing: $message"); } elseif ($state === 'pending-changes') { $check->succeed("'$name' is fine, but there are pending changes"); } elseif ($state === 'in-sync') { $check->succeed("'$name' is in sync"); } else { $check->fail("'$name' has never been checked", 'UNKNOWN'); } } return $check; } public function checkImportSources(?string $checkName = null): CheckResults { $check = new CheckResults('Import Sources'); if ($checkName !== null) { $sources = [ImportSource::load($checkName, $this->getConnection())]; } else { $sources = ImportSource::loadAll($this->getConnection(), null, 'source_name'); if (empty($sources)) { $check->succeed('No Import Sources have been defined'); return $check; } ksort($sources); } foreach ($sources as $src) { $state = $src->get('import_state'); $name = $src->get('source_name'); if ($state === 'failing') { $message = $src->get('last_error_message'); $check->fail("'$name' is failing: $message"); } elseif ($state === 'pending-changes') { $check->succeed("'$name' is fine, but there are pending changes"); } elseif ($state === 'in-sync') { $check->succeed("'$name' is in sync"); } else { $check->fail("'$name' has never been checked", 'UNKNOWN'); } } return $check; } public function checkDirectorJobs(?string $checkName = null): CheckResults { $check = new CheckResults('Director Jobs'); if ($checkName !== null) { $jobs = [DirectorJob::load($checkName, $this->getConnection())]; } else { $jobs = DirectorJob::loadAll($this->getConnection(), null, 'job_name'); if (empty($jobs)) { $check->succeed('No Jobs have been defined'); return $check; } ksort($jobs); } foreach ($jobs as $job) { $name = $job->get('job_name'); if ($job->hasBeenDisabled()) { $check->succeed("'$name' has been disabled"); } elseif ($job->lastAttemptFailed()) { $message = $job->get('last_error_message'); $check->fail("Last attempt for '$name' failed: $message"); } elseif ($job->isOverdue()) { $check->fail("'$name' is overdue"); } elseif ($job->shouldRun()) { $check->succeed("'$name' is fine, but should run now"); } else { $check->succeed("'$name' is fine"); } } return $check; } public function checkDeployments() { $check = new Check('Director Deployments'); $db = $this->getConnection(); $check->call(function () use ($check, $db) { $check->succeed(sprintf( "Deployment endpoint is '%s'", $db->getDeploymentEndpointName() )); })->call(function () use ($check, $db) { $count = $db->countActivitiesSinceLastDeployedConfig(); if ($count === 1) { $check->succeed('There is a single un-deployed change'); } else { $check->succeed(sprintf( 'There are %d un-deployed changes', $count )); } }); if (! DirectorDeploymentLog::hasDeployments($db)) { $check->warn('Configuration has never been deployed'); return $check; } $latest = DirectorDeploymentLog::loadLatest($db); $ts = $latest->getDeploymentTimestamp(); $time = DateFormatter::timeAgo($ts); if ($latest->succeeded()) { $check->succeed("The last Deployment was successful $time"); } elseif ($latest->isPending()) { if ($ts + 180 < time()) { $check->warn("The last Deployment started $time and is still pending"); } else { $check->succeed("The last Deployment started $time and is still pending"); } } else { $check->fail("The last Deployment failed $time"); } return $check; } public function __destruct() { if ($this->connection !== null) { // We created our own connection, so let's tear it down $this->connection->getDbAdapter()->closeConnection(); } } } icingaweb2-module-director-1.11.8/library/Director/Hook/000077500000000000000000000000001516513262500230355ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Hook/BranchSupportHook.php000066400000000000000000000016271516513262500271670ustar00rootroot00000000000000settings = $settings; return $this; } public function getSetting($name, $default = null) { if (array_key_exists($name, $this->settings)) { return $this->settings[$name]; } else { return $default; } } } icingaweb2-module-director-1.11.8/library/Director/Hook/DeploymentHook.php000066400000000000000000000036151516513262500265140ustar00rootroot00000000000000onSuccessfulDump($deploymentLog); $this->onSuccessfullDump($deploymentLog); } /** * Please override this method if you want to trigger custom actions * once success (or failure) information have been collected for a deployed * stage. startup_succeeded will then be filled, and startup_log might be * available * * @param DirectorDeploymentLog $deployment */ public function onCollect(DirectorDeploymentLog $deployment) { } } icingaweb2-module-director-1.11.8/library/Director/Hook/HostFieldHook.php000066400000000000000000000005401516513262500262470ustar00rootroot00000000000000onSetup($form); } } } icingaweb2-module-director-1.11.8/library/Director/Hook/ImportSourceHook.php000066400000000000000000000070141516513262500270240ustar00rootroot00000000000000getDb(); $settings = $db->fetchPairs( $db->select()->from( 'import_source_setting', ['setting_name', 'setting_value'] )->where('source_id = ?', $source->get('id')) ); $className = $source->get('provider_class'); if (! class_exists($className)) { throw new ConfigurationError( 'Cannot load import provider class %s', $className ); } /** @var ImportSourceHook $obj */ $obj = new $className(); $obj->setSettings($settings); return $obj; } public static function loadByName($name, Db $db) { $db = $db->getDbAdapter(); $source = $db->fetchRow( $db->select()->from( 'import_source', array('id', 'provider_class') )->where('source_name = ?', $name) ); $settings = $db->fetchPairs( $db->select()->from( 'import_source_setting', array('setting_name', 'setting_value') )->where('source_id = ?', $source->id) ); if (! class_exists($source->provider_class)) { throw new ConfigurationError( 'Cannot load import provider class %s', $source->provider_class ); } /** @var ImportSourceHook $obj */ $obj = new $source->provider_class(); $obj->setSettings($settings); return $obj; } public function setSettings($settings) { $this->settings = $settings; return $this; } public function getSetting($name, $default = null) { if (array_key_exists($name, $this->settings)) { return $this->settings[$name]; } else { return $default; } } /** * Returns an array containing importable objects * * @return array */ abstract public function fetchData(); /** * Returns a list of all available columns * * @return array */ abstract public function listColumns(); /** * Override this method in case you want to suggest a default * key column * * @return string|null Default key column */ public static function getDefaultKeyColumnName() { return null; } /** * Override this method if you want to extend the settings form * * @param QuickForm $form QuickForm that should be extended * @return QuickForm */ public static function addSettingsFormFields(QuickForm $form) { return $form; } } icingaweb2-module-director-1.11.8/library/Director/Hook/JobHook.php000066400000000000000000000035541516513262500251100ustar00rootroot00000000000000jobDefinition = $definition; return $this; } protected function getSetting($key, $default = null) { return $this->jobDefinition->getSetting($key, $default); } public function getName() { $parts = explode('\\', get_class($this)); $class = preg_replace('/Job$/', '', array_pop($parts)); if (array_shift($parts) === 'Icinga' && array_shift($parts) === 'Module') { $module = array_shift($parts); if ($module !== 'Director') { return sprintf('%s (%s)', $class, $module); } } return $class; } public function exportSettings() { return $this->jobDefinition->getSettings(); } public static function getSuggestedRunInterval(QuickForm $form) { return 900; } /** * Override this method if you want to extend the settings form * * @param QuickForm $form QuickForm that should be extended * @return QuickForm */ public static function addSettingsFormFields(QuickForm $form) { return $form; } public function setDb(Db $db) { $this->db = $db; return $this; } protected function db() { return $this->db; } } icingaweb2-module-director-1.11.8/library/Director/Hook/PropertyModifierHook.php000066400000000000000000000134021516513262500276720ustar00rootroot00000000000000rejected = (bool) $reject; return $this; } /** * Whether this PropertyModifier wants access to the current row * * When true, the your modifier can access the current row via $this->getRow() * * @return bool */ public function requiresRow() { return false; } /** * Whether this modifier wants to reject the current row * * @return bool */ public function rejectsRow() { return $this->rejected; } /** * Get the current row * * Will be null when requiresRow was not null. Please do not modify the * row. It might work right now, as we pass in an object reference for * performance reasons. However, modifying row properties is not supported, * and the outcome of such operation might change without pre-announcement * in any future version. * * @return \stdClass|null */ public function getRow() { return $this->row; } /** * Sets the current row * * Please see requiresRow/getRow for related details. This method is called * by the Import implementation, you should never need to call this on your * own - apart from writing tests of course. * * @param \stdClass $row * @return $this */ public function setRow($row) { $this->row = $row; return $this; } /** * @return string */ public function getPropertyName() { return $this->propertyName; } /** * @param string $propertyName * @return $this */ public function setPropertyName($propertyName) { $this->propertyName = $propertyName; return $this; } /** * The desired target property. Modifiers might want to have their outcome * written to another property of the current row. * * @param $property * @return $this */ public function setTargetProperty($property) { $this->targetProperty = $property; return $this; } /** * Whether the result of transform() should be written to a new property * * The Import implementation deals with this * * @return bool */ public function hasTargetProperty() { return $this->targetProperty !== null; } /** * Get the configured target property * * @return string */ public function getTargetProperty($default = null) { if ($this->targetProperty === null) { return $default; } return $this->targetProperty; } public function setDb(Db $db) { $this->db = $db; return $this; } public function getDb() { return $this->db; } public function setSettings(array $settings) { $this->settings = $settings; return $this; } public function getSetting($name, $default = null) { if (array_key_exists($name, $this->settings)) { return $this->settings[$name]; } else { return $default; } } public function setSetting($name, $value) { $this->settings[$name] = $value; return $this; } public function exportSettings() { return (object) $this->settings; } public function getSettings() { return $this->settings; } /** * Override this method if you want to extend the settings form * * @param QuickForm $form QuickForm that should be extended * @return QuickForm */ public static function addSettingsFormFields(QuickForm $form) { return $form; } } icingaweb2-module-director-1.11.8/library/Director/Hook/ServiceFieldHook.php000066400000000000000000000005621516513262500267360ustar00rootroot00000000000000host = $host; } protected function assertAgent() { if ($this->host->getResolvedProperty('has_agent') !== 'y') { throw new ProgrammingError( 'The given host "%s" is not an Agent', $this->host->getObjectName() ); } } protected function getCaServer() { return $this->db()->getDeploymentEndpointName(); // TODO: This is a problem with Icinga 2. Should look like this: // return current($this->getParentEndpoints())->object_name; } protected function shouldConnectToMaster() { return $this->host->getResolvedProperty('master_should_connect') !== 'y'; } protected function getParentZone() { if ($this->parentZone === null) { $this->parentZone = $this->loadParentZone(); } return $this->parentZone; } protected function loadParentZone() { $db = $this->db(); if ($zoneId = $this->host->getResolvedProperty('zone_id')) { return IcingaZone::loadWithAutoIncId($zoneId, $db); } else { return IcingaZone::load($db->getMasterZoneName(), $db); } } protected function getParentEndpoints() { if ($this->parentEndpoints === null) { $this->parentEndpoints = $this->loadParentEndpoints(); } return $this->parentEndpoints; } protected function loadParentEndpoints() { $db = $this->db()->getDbAdapter(); $query = $db->select() ->from('icinga_endpoint') ->where( 'zone_id = ?', $this->getParentZone()->get('id') ); return IcingaEndpoint::loadAll( $this->db(), $query, 'object_name' ); } /** * Get the PKI ticket * * @return string * * @throws LogicException If ticket has not been set */ protected function getTicket() { if ($this->ticket === null) { throw new LogicException('Ticket is null'); } return $this->ticket; } /** * Set the PKI ticket * * @param string $ticket * * @return $this */ public function setTicket($ticket) { $this->ticket = $ticket; } protected function loadPowershellModule() { return $this->getContribFile('windows-agent-installer/Icinga2Agent.psm1'); } public function renderWindowsInstaller() { return $this->loadPowershellModule() . "\n\n" . 'exit Icinga2AgentModule `' . "\n " . $this->renderPowershellParameters([ 'AgentName' => $this->host->getEndpointName(), 'Ticket' => $this->getTicket(), 'ParentZone' => $this->getParentZone()->getObjectName(), 'ParentEndpoints' => array_keys($this->getParentEndpoints()), 'CAServer' => $this->getCaServer(), 'RunInstaller' ]); } public function renderIcinga4WindowsWizardCommand($token) { $ifwParams = [ "IfW-DirectorSelfServiceKey" => [ "Values" => [$token], ], "IfW-DirectorUrl" => [ "Values" => [$this->getDirectorUrl()], ], "IfW-StableRepository" => [ "Values" => ["https://packages.icinga.com/IcingaForWindows/stable"], ] ]; $script = "[Net.ServicePointManager]::SecurityProtocol = 'tls12, tls11';\n" . "\$ProgressPreference = 'SilentlyContinue';" . "\n" . "[string]\$ScriptFile = 'C:\Users\Public\IcingaForWindows.ps1';\n" . "\n" . "Invoke-WebRequest `\n " . $this->renderPowershellParameters([ 'UseBasicParsing', 'Uri' => "https://packages.icinga.com/IcingaForWindows/IcingaForWindows.ps1", 'OutFile' => '$ScriptFile;', ]) . "\n" . "\n" . "& \$ScriptFile `\n " . $this->renderPowershellParameters([ 'ModuleDirectory' => "C:\Program Files\WindowsPowerShell\Modules\\", 'InstallCommand' => json_encode($ifwParams, JSON_UNESCAPED_SLASHES), 'IcingaRepository' => "https://packages.icinga.com/IcingaForWindows/stable/ifw.repo.json" ]); return $script; } public function renderPowershellModuleInstaller($token, $withModule = false) { if ($withModule) { $script = $this->loadPowershellModule() . "\n\n"; } else { $script = ''; } $script .= 'exit Icinga2AgentModule `' . "\n " . $this->renderPowershellParameters([ 'DirectorUrl' => $this->getDirectorUrl(), 'DirectorAuthToken' => $token, 'RunInstaller' ]); return $script; } protected function getDirectorUrl() { $r = Icinga::app()->getRequest(); $scheme = $r->getServer('HTTP_X_FORWARDED_PROTO', $r->getScheme()); return sprintf( '%s://%s%s/director/', $scheme, $r->getHttpHost(), $r->getBaseUrl() ); } protected function renderPowershellParameters($parameters) { $maxKeyLength = max(array_map('strlen', array_keys($parameters))); foreach ($parameters as $key => $value) { if (is_int($key)) { $maxKeyLength = max($maxKeyLength, strlen($value)); } } $parts = array(); foreach ($parameters as $key => $value) { if (is_int($key)) { $parts[] = $this->renderPowershellParameter($value, null, $maxKeyLength); } else { $parts[] = $this->renderPowershellParameter($key, $value, $maxKeyLength); } } return implode(' `' . "\n ", $parts); } protected function renderPowershellParameter($key, $value, $maxKeyLength = null) { $ret = '-' . $key; if ($value === null) { return $ret; } $ret .= ' '; if ($maxKeyLength !== null) { $ret .= str_repeat(' ', $maxKeyLength - strlen($key)); } if (is_array($value)) { $vals = array(); foreach ($value as $val) { $vals[] = $this->renderPowershellString($val); } $ret .= implode(', ', $vals); } elseif (is_int($value)) { $ret .= $value; } elseif (is_string($value) && $value[0] === '$') { $ret .= $value; } else { $ret .= $this->renderPowershellString($value); } return $ret; } protected function renderPowershellString($string) { // TODO: Escaping return "'" . $string . "'"; } protected function db() { if ($this->db === null) { $this->db = $this->host->getConnection(); } return $this->db; } public function renderLinuxInstaller() { $script = $this->loadBashModule(); $endpoints = []; foreach ($this->getParentEndpoints() as $endpoint) { $endpoints[$endpoint->getObjectName()] = $endpoint->get('host'); } return $this->replaceBashTemplate($script, [ 'ICINGA2_NODENAME' => $this->host->getEndpointName(), 'ICINGA2_CA_TICKET' => $this->getTicket(), 'ICINGA2_PARENT_ZONE' => $this->getParentZone()->getObjectName(), 'ICINGA2_PARENT_ENDPOINTS' => $endpoints, 'ICINGA2_CA_NODE' => $this->getCaServer(), 'ICINGA2_GLOBAL_ZONES' => [$this->db()->getDefaultGlobalZoneName()], ]); } protected function loadBashModule() { return $this->getContribFile('linux-agent-installer/Icinga2Agent.bash'); } protected function replaceBashTemplate($script, $parameters) { foreach ($parameters as $key => $value) { $quotedKey = preg_quote($key, '~'); if (is_array($value)) { $list = []; foreach ($value as $k => $v) { if (!is_numeric($k)) { $v = "$k,$v"; } $list[] = escapeshellarg($v); } $value = '(' . join(' ', $list) . ')'; } else { $value = escapeshellarg($value); } $script = preg_replace("~^#?$quotedKey='@$quotedKey@'$~m", "{$key}={$value}", $script); } return $script; } protected function renderBashParameter($key, $value) { $ret = $key . '='; // Cheating, this doesn't really help. We should ship the rendered config if (is_array($value) && count($value) === 1) { $value = array_shift($value); } if (is_array($value)) { $vals = array(); foreach ($value as $val) { $vals[] = $this->renderPowershellString($val); } $ret .= '(' . implode(' ', $vals) . ')'; } else { $ret .= $this->renderPowershellString($value); } return $ret; } protected function getContribDir() { return dirname(dirname(dirname(__DIR__))) . '/contrib'; } protected function getContribFile($path) { return file_get_contents($this->getContribDir() . '/' . $path); } } icingaweb2-module-director-1.11.8/library/Director/IcingaConfig/AssignRenderer.php000066400000000000000000000204421516513262500301030ustar00rootroot00000000000000filter = $filter; } public static function forFilter(Filter $filter) { return new static($filter); } public function renderAssign() { return $this->render('assign'); } public function renderIgnore() { return $this->render('ignore'); } public function render($type) { return $type . ' where ' . $this->renderFilter($this->filter); } protected function renderFilter(Filter $filter) { if ($filter instanceof FilterNot) { $parts = []; foreach ($filter->filters() as $sub) { $parts[] = $this->renderFilter($sub); } return '!(' . implode(' && ', $parts) . ')'; } if ($filter->isChain()) { /** @var FilterChain $filter */ return $this->renderFilterChain($filter); } else { /** @var FilterExpression $filter */ return $this->renderFilterExpression($filter); } } protected function renderEquals($column, $expression) { if (substr($column, -7) === '.groups') { return sprintf( '%s in %s', $expression, $column ); } else { return sprintf( '%s == %s', $column, $expression ); } } protected function renderNotEquals($column, $expression) { if (substr($column, -7) === '.groups') { return sprintf( '!(%s in %s)', $expression, $column ); } else { return sprintf( '%s != %s', $column, $expression ); } } protected function renderInArray($column, $expression) { return sprintf( '%s in %s', $column, $expression ); } protected function renderContains(FilterExpression $filter) { // Note: expression and column is flipped in this mode $value = json_decode($filter->getColumn()); $expression = $this->renderExpressionValue($value); $column = $filter->getExpression(); if (strpos($value, '*') !== false) { return sprintf( 'match(%s, %s, MatchAny)', $expression, $column ); } else { return sprintf( '%s in %s', $expression, $column ); } } protected function renderFilterExpression(FilterExpression $filter) { if ($this->columnIsJson($filter)) { return $this->renderContains($filter); } $column = $filter->getColumn(); try { $rawExpression = JsonString::decode($filter->getExpression()); $expression = $this->renderExpressionValue($rawExpression); } catch (JsonDecodeException $e) { throw new InvalidArgumentException( "Got invalid JSON in filter string: $column" . $filter->getSign() . $filter->getExpression() ); } if (is_array($rawExpression) && $filter instanceof FilterMatch) { return $this->renderInArray($column, $expression); } if (is_string($rawExpression) && ctype_digit($rawExpression)) { // TODO: doing this for compat reasons, should work for all filters if ( $filter instanceof FilterEqualOrGreaterThan || $filter instanceof FilterGreaterThan || $filter instanceof FilterEqualOrLessThan || $filter instanceof FilterLessThan ) { $expression = $rawExpression; } } if ($filter instanceof FilterEqual) { if (is_array($rawExpression)) { return sprintf( '%s in %s', $column, $expression ); } else { return sprintf( '%s == %s', $column, $expression ); } } elseif ($filter instanceof FilterMatch) { if ($rawExpression === true) { return $column; } if ($rawExpression === false) { return sprintf( '! %s', $column ); } if (strpos($expression, '*') === false) { return $this->renderEquals($column, $expression); } else { return sprintf( 'match(%s, %s)', $expression, $column ); } } elseif ($filter instanceof FilterMatchNot) { if (strpos($expression, '*') === false) { return $this->renderNotEquals($column, $expression); } else { return sprintf( '! match(%s, %s)', $expression, $column ); } } elseif ($filter instanceof FilterNotEqual) { return sprintf( '%s != %s', $column, $expression ); } elseif ($filter instanceof FilterEqualOrGreaterThan) { return sprintf( '%s >= %s', $column, $expression ); } elseif ($filter instanceof FilterEqualOrLessThan) { return sprintf( '%s <= %s', $column, $expression ); } elseif ($filter instanceof FilterGreaterThan) { return sprintf( '%s > %s', $column, $expression ); } elseif ($filter instanceof FilterLessThan) { return sprintf( '%s < %s', $column, $expression ); } else { throw new QueryException( 'Filter expression of type "%s" is not supported', get_class($filter) ); } } protected function renderExpressionValue($value) { return IcingaConfigHelper::renderPhpValue($value); } protected function columnIsJson(FilterExpression $filter) { $col = $filter->getColumn(); return strlen($col) && $col[0] === '"'; } protected function renderFilterChain(FilterChain $filter) { // TODO: brackets if deeper level? if ($filter instanceof FilterAnd) { $op = ' && '; } elseif ($filter instanceof FilterOr) { $op = ' || '; } elseif ($filter instanceof FilterNot) { throw new InvalidArgumentException('renderFilterChain should never get a FilterNot instance'); } else { throw new InvalidArgumentException('Cannot render filter: %s', $filter); } $parts = array(); if (! $filter->isEmpty()) { /** @var Filter $f */ foreach ($filter->filters() as $f) { if ($f instanceof FilterChain && $f->count() > 1) { $parts[] = '(' . $this->renderFilter($f) . ')'; } else { $parts[] = $this->renderFilter($f); } } } return implode($op, $parts); } } icingaweb2-module-director-1.11.8/library/Director/IcingaConfig/ExtensibleSet.php000066400000000000000000000330441516513262500277500ustar00rootroot00000000000000__set * * @var string */ protected $propertyName; public function __construct($values = null) { if (null !== $values) { $this->override($values); } } public static function forIcingaObject(IcingaObject $object, $propertyName) { $set = new static(); $set->object = $object; $set->propertyName = $propertyName; if ($object->hasBeenLoadedFromDb() && $id = $object->get('id')) { $set->loadFromDb(); } return $set; } public function set($set) { if (null === $set) { $this->reset(); return $this; } elseif (is_array($set) || is_string($set)) { $this->reset(); $this->override($set); } elseif (is_object($set)) { $this->reset(); foreach (['override', 'extend', 'blacklist'] as $method) { if (property_exists($set, $method)) { $this->$method($set->$method); } } } else { throw new ProgrammingError( 'ExtensibleSet::set accepts only plain arrays or objects' ); } return $this; } public function isEmpty() { return $this->ownValues === null && empty($this->plusValues) && empty($this->minusValues); } public function toPlainObject() { if ($this->ownValues !== null) { if (empty($this->minusValues) && empty($this->plusValues)) { return $this->ownValues; } } $plain = (object) []; if ($this->ownValues !== null) { $plain->override = $this->ownValues; } if (! empty($this->plusValues)) { $plain->extend = $this->plusValues; } if (! empty($this->minusValues)) { $plain->blacklist = $this->minusValues; } return $plain; } public function getPlainUnmodifiedObject() { if ($this->fromDb === null) { return null; } $old = $this->fromDb; if ($old['override'] !== null) { if (empty($old['blacklist']) && empty($old['extend'])) { return $old['override']; } } $plain = (object) []; if ($old['override'] !== null) { $plain->override = $old['override']; } if (! empty($old['extend'])) { $plain->extend = $old['extend']; } if (! empty($old['blacklist'])) { $plain->blacklist = $old['blacklist']; } return $plain; } public function hasBeenLoadedFromDb() { return $this->fromDb !== null; } public function hasBeenModified() { if ($this->hasBeenLoadedFromDb()) { if ($this->ownValues !== $this->fromDb['override']) { return true; } if ($this->plusValues !== $this->fromDb['extend']) { return true; } if ($this->minusValues !== $this->fromDb['blacklist']) { return true; } return false; } else { if ( $this->ownValues === null && empty($this->plusValues) && empty($this->minusValues) ) { return false; } else { return true; } } } protected function loadFromDb() { $db = $this->object->getDb(); $query = $db->select()->from($this->tableName(), [ 'property', 'merge_behaviour' ])->where($this->foreignKey() . ' = ?', $this->object->get('id')); $byBehaviour = [ 'override' => [], 'extend' => [], 'blacklist' => [], ]; foreach ($db->fetchAll($query) as $row) { if (! array_key_exists($row->merge_behaviour, $byBehaviour)) { throw new ProgrammingError( 'Got unknown merge_behaviour "%s". Schema change?', $row->merge_behaviour ); } $byBehaviour[$row->merge_behaviour][] = $row->property; } foreach ($byBehaviour as $method => &$values) { if (empty($values)) { continue; } sort($values); $this->$method($values); } if (empty($byBehaviour['override'])) { $byBehaviour['override'] = null; } $this->fromDb = $byBehaviour; return $this; } protected function foreignKey() { return $this->object->getShortTableName() . '_id'; } protected function tableName() { return implode('_', [ $this->object->getTableName(), $this->propertyName, 'set' ]); } public function getObject() { return $this->object; } public function store() { if (null === $this->object) { throw new ProgrammingError( 'Cannot store ExtensibleSet with no assigned object' ); } if (! $this->hasBeenModified()) { return false; } $this->storeToDb(); return true; } protected function storeToDb() { $db = $this->object->getDb(); if ($db === null) { throw new ProgrammingError( 'Cannot store a set for an unstored related object' ); } $table = $this->tableName(); $props = [ $this->foreignKey() => $this->object->get('id') ]; $db->delete( $this->tableName(), $db->quoteInto( $this->foreignKey() . ' = ?', $this->object->get('id') ) ); if ($this->ownValues !== null) { $props['merge_behaviour'] = 'override'; foreach ($this->ownValues as $value) { $db->insert( $table, array_merge($props, ['property' => $value]) ); } } if (! empty($this->plusValues)) { $props['merge_behaviour'] = 'extend'; foreach ($this->plusValues as $value) { $db->insert( $table, array_merge($props, ['property' => $value]) ); } } if (! empty($this->minusValues)) { $props['merge_behaviour'] = 'blacklist'; foreach ($this->minusValues as $value) { $db->insert( $table, array_merge($props, ['property' => $value]) ); } } $this->setBeingLoadedFromDb(); } public function setBeingLoadedFromDb() { $this->fromDb = [ 'override' => $this->ownValues ?: [], 'extend' => $this->plusValues ?: [], 'blacklist' => $this->minusValues ?: [], ]; } public function override($values) { $this->ownValues = []; $this->inheritedValues = []; $this->addValuesTo($this->ownValues, $values); return $this->addResolvedValues($values); } public function extend($values) { $this->addValuesTo($this->plusValues, $values); return $this->addResolvedValues($values); } public function blacklist($values) { $this->addValuesTo($this->minusValues, $values); if ($this->hasBeenResolved()) { $this->removeValuesFrom($this->resolvedValues, $values); } return $this; } public function getResolvedValues() { if (! $this->hasBeenResolved()) { $this->recalculate(); } sort($this->resolvedValues); return $this->resolvedValues; } public function inheritFrom(ExtensibleSet $parent) { if ($this->ownValues !== null) { return $this; } if ($this->hasBeenResolved()) { $this->resolvedValues = null; } $this->inheritedValues = []; $this->addValuesTo( $this->inheritedValues, $this->stripBlacklistedValues($parent->getResolvedValues()) ); return $this->recalculate(); } public function forgetInheritedValues() { $this->inheritedValues = []; return $this; } protected function renderArray($array) { $safe = []; foreach ($array as $value) { $safe[] = c::alreadyRendered($value); } return c::renderArray($safe); } public function renderAs($key, $prefix = ' ') { $parts = []; // TODO: It would be nice if we could use empty arrays to override // inherited ones // if ($this->ownValues !== null) { if (!empty($this->ownValues)) { $parts[] = c::renderKeyValue( $key, $this->renderArray($this->ownValues), $prefix ); } if (!empty($this->plusValues)) { $parts[] = c::renderKeyOperatorValue( $key, '+=', $this->renderArray($this->plusValues), $prefix ); } if (!empty($this->minusValues)) { $parts[] = c::renderKeyOperatorValue( $key, '-=', $this->renderArray($this->minusValues), $prefix ); } return implode('', $parts); } public function isRestricted() { return $this->allowedValues === null; } public function enumAllowedValues() { if ($this->isRestricted()) { throw new ProgrammingError( 'No allowed value set available, this set is not restricted' ); } if (empty($this->allowedValues)) { return []; } return array_combine($this->allowedValues, $this->allowedValues); } protected function hasBeenResolved() { return $this->resolvedValues !== null; } protected function stripBlacklistedValues($array) { $this->removeValuesFrom($array, $this->minusValues); return $array; } protected function assertValidValue($value) { if (null === $this->allowedValues) { return $this; } if (in_array($value, $this->allowedValues)) { return $this; } throw new InvalidPropertyException( 'Got invalid property "%s", allowed are: (%s)', $value, implode(', ', $this->allowedValues) ); } protected function addValuesTo(&$array, $values) { foreach ($this->wantArray($values) as $value) { // silently ignore null or empty strings if (strlen($value) === 0) { continue; } $this->addTo($array, $value); } return $this; } protected function addResolvedValues($values) { if (! $this->hasBeenResolved()) { $this->resolvedValues = []; } return $this->addValuesTo( $this->resolvedValues, $this->stripBlacklistedValues($this->wantArray($values)) ); } protected function removeValuesFrom(&$array, $values) { foreach ($this->wantArray($values) as $value) { $this->removeFrom($array, $value); } return $this; } protected function addTo(&$array, $value) { if (! in_array($value, $array)) { $this->assertValidValue($value); $array[] = $value; } return $this; } protected function removeFrom(&$array, $value) { if (false !== ($pos = array_search($value, $array))) { unset($array[$pos]); } return $this; } protected function recalculate() { $this->resolvedValues = []; if ($this->ownValues === null) { $this->addValuesTo($this->resolvedValues, $this->inheritedValues); } else { $this->addValuesTo($this->resolvedValues, $this->ownValues); } $this->addValuesTo($this->resolvedValues, $this->plusValues); $this->removeFrom($this->resolvedValues, $this->minusValues); return $this; } protected function reset() { $this->ownValues = null; $this->plusValues = []; $this->minusValues = []; $this->resolvedValues = null; $this->inheritedValues = []; return $this; } protected function translate($string) { return mt('director', $string); } protected function wantArray($values) { if (is_array($values)) { return $values; } return [$values]; } } icingaweb2-module-director-1.11.8/library/Director/IcingaConfig/IcingaConfig.php000066400000000000000000000544411516513262500275160ustar00rootroot00000000000000getModuleManager()->loadEnabledModules(); $this->connection = $connection; $this->db = $connection->getDbAdapter(); $this->configFormat = $this->connection->settings()->config_format; $this->deploymentModeV1 = $this->connection->settings()->deployment_mode_v1; } public function getSize() { $size = 0; foreach ($this->getFiles() as $file) { $size += $file->getSize(); } return $size; } public function getDuration() { return $this->generationTime; } public function getFileCount() { return count($this->files); } public function getConfigFormat() { return $this->configFormat; } public function getDeploymentMode() { if ($this->isLegacy()) { return $this->deploymentModeV1; } else { throw new LogicException('There is no deployment mode for Icinga 2 config format!'); } } public function setConfigFormat($format) { if (! in_array($format, array('v1', 'v2'))) { throw new InvalidArgumentException(sprintf( 'Only Icinga v1 and v2 config format is supported, got "%s"', $format )); } $this->configFormat = $format; return $this; } public function isLegacy() { return $this->configFormat === 'v1'; } public function getObjectCount() { $cnt = 0; foreach ($this->getFiles() as $file) { $cnt += $file->getObjectCount(); } return $cnt; } public function getTemplateCount() { $cnt = 0; foreach ($this->getFiles() as $file) { $cnt += $file->getTemplateCount(); } return $cnt; } public function getApplyCount() { $cnt = 0; foreach ($this->getFiles() as $file) { $cnt += $file->getApplyCount(); } return $cnt; } public function getChecksum() { return $this->checksum; } public function getHexChecksum() { return bin2hex($this->checksum); } /** * @return IcingaConfigFile[] */ public function getFiles() { return $this->files; } public function getFileContents() { $result = array(); foreach ($this->files as $name => $file) { $result[$name] = $file->getContent(); } return $result; } /** * @return array */ public function getFileNames() { return array_keys($this->files); } /** * @param string $name * * @return IcingaConfigFile */ public function getFile($name) { return $this->files[$name]; } /** * @param string $checksum * @param Db $connection * * @return static */ public static function load($checksum, Db $connection) { $config = new static($connection); $config->loadFromDb($checksum); return $config; } /** * @param string $checksum * @param Db $connection * * @return bool */ public static function exists($checksum, Db $connection) { $db = $connection->getDbAdapter(); $query = $db->select()->from( array('c' => self::$table), array('checksum' => $connection->dbHexFunc('c.checksum')) )->where( 'checksum = ?', $connection->quoteBinary(hex2bin($checksum)) ); return $db->fetchOne($query) === $checksum; } public static function loadByActivityChecksum($checksum, Db $connection) { $db = $connection->getDbAdapter(); $query = $db->select()->from( array('c' => self::$table), array('checksum' => 'c.checksum') )->join( array('l' => 'director_activity_log'), 'l.checksum = c.last_activity_checksum', array() )->where( 'last_activity_checksum = ?', $connection->quoteBinary(hex2bin($checksum)) )->order('l.id DESC')->limit(1); return self::load($db->fetchOne($query), $connection); } public static function existsForActivityChecksum($checksum, Db $connection) { $db = $connection->getDbAdapter(); $query = $db->select()->from( array('c' => self::$table), array('checksum' => $connection->dbHexFunc('c.checksum')) )->join( array('l' => 'director_activity_log'), 'l.checksum = c.last_activity_checksum', array() )->where( 'last_activity_checksum = ?', $connection->quoteBinary(hex2bin($checksum)) )->order('l.id DESC')->limit(1); return $db->fetchOne($query) === $checksum; } /** * @param Db $connection * * @return mixed */ public static function generate(Db $connection) { $config = new static($connection); return $config->storeIfModified(); } public static function wouldChange(Db $connection) { $config = new static($connection); return $config->hasBeenModified(); } public function hasBeenModified() { $this->generateFromDb(); $this->collectExtraFiles(); $checksum = $this->calculateChecksum(); $activity = $this->getLastActivityChecksum(); $lastActivity = $this->connection->binaryDbResult( $this->db->fetchOne( $this->db->select()->from( self::$table, 'last_activity_checksum' )->where( 'checksum = ?', $this->dbBin($checksum) ) ) ); if ($lastActivity === false || $lastActivity === null) { return true; } if ($lastActivity !== $activity) { $this->db->update( self::$table, array( 'last_activity_checksum' => $this->dbBin($activity) ), $this->db->quoteInto('checksum = ?', $this->dbBin($checksum)) ); } return false; } protected function storeIfModified() { if ($this->hasBeenModified()) { $this->store(); } return $this; } protected function dbBin($binary) { return $this->connection->quoteBinary($binary); } protected function calculateChecksum() { $files = array(); $sortedFiles = $this->files; ksort($sortedFiles); /** @var IcingaConfigFile $file */ foreach ($sortedFiles as $name => $file) { $files[] = $name . '=' . $file->getHexChecksum(); } $this->checksum = sha1(implode(';', $files), true); return $this->checksum; } public function getFilesChecksums() { $checksums = array(); /** @var IcingaConfigFile $file */ foreach ($this->files as $name => $file) { $checksums[] = $file->getChecksum(); } return $checksums; } // TODO: prepare lookup cache if empty? public function getZoneName($id) { if (! array_key_exists($id, $this->zoneMap)) { $zone = IcingaZone::loadWithAutoIncId($id, $this->connection); $this->zoneMap[$id] = $zone->get('object_name'); } return $this->zoneMap[$id]; } public function listNonGlobalZones(): array { if ($this->nonGlobalZones === null) { $this->nonGlobalZones = array_values($this->connection->enumNonglobalZones()); } return $this->nonGlobalZones; } /** * @return self */ public function store() { $fileTable = IcingaConfigFile::$table; $fileKey = IcingaConfigFile::$keyName; $existingQuery = $this->db->select() ->from($fileTable, 'checksum') ->where('checksum IN (?)', array_map(array($this, 'dbBin'), $this->getFilesChecksums())); $existing = $this->db->fetchCol($existingQuery); foreach ($existing as $key => $val) { if (is_resource($val)) { $existing[$key] = stream_get_contents($val); } } $missing = array_diff($this->getFilesChecksums(), $existing); $stored = array(); /** @var IcingaConfigFile $file */ foreach ($this->files as $name => $file) { $checksum = $file->getChecksum(); if (! in_array($checksum, $missing)) { continue; } if (array_key_exists($checksum, $stored)) { continue; } $stored[$checksum] = true; $this->db->insert( $fileTable, array( $fileKey => $this->dbBin($checksum), 'content' => $file->getContent(), 'cnt_object' => $file->getObjectCount(), 'cnt_template' => $file->getTemplateCount() ) ); } $activity = $this->dbBin($this->getLastActivityChecksum()); $this->db->beginTransaction(); try { $this->db->insert(self::$table, [ 'duration' => $this->generationTime, 'first_activity_checksum' => $activity, 'last_activity_checksum' => $activity, 'checksum' => $this->dbBin($this->getChecksum()), ]); /** @var IcingaConfigFile $file */ foreach ($this->files as $name => $file) { $this->db->insert('director_generated_config_file', [ 'config_checksum' => $this->dbBin($this->getChecksum()), 'file_checksum' => $this->dbBin($file->getChecksum()), 'file_path' => $name, ]); } $this->db->commit(); } catch (\Exception $e) { try { $this->db->rollBack(); } catch (\Exception $ignored) { // Well... } throw $e; } return $this; } /** * @return self */ protected function generateFromDb() { PrefetchCache::initialize($this->connection); $start = microtime(true); MemoryLimit::raiseTo('1024M'); ini_set('max_execution_time', '0'); // Workaround for https://bugs.php.net/bug.php?id=68606 or similar ini_set('zend.enable_gc', '0'); if (! $this->connection->isPgsql() && $this->db->quote("1\0") !== '\'1\\0\'') { throw new RuntimeException( 'Refusing to render the configuration, your DB layer corrupts binary data.' . ' You might be affected by Zend Framework bug #655' ); } $this ->prepareGlobalBasics() ->createFileFromDb('zone') ->createFileFromDb('endpoint') ->createFileFromDb('command') ->createFileFromDb('timePeriod') ->createFileFromDb('hostGroup') ->createFileFromDb('host') ->createFileFromDb('serviceGroup') ->createFileFromDb('service') ->createFileFromDb('serviceSet') ->createFileFromDb('userGroup') ->createFileFromDb('user') ->createFileFromDb('notification') ->createFileFromDb('dependency') ->createFileFromDb('scheduledDowntime') ; PrefetchCache::forget(); IcingaHost::clearAllPrefetchCaches(); $this->generationTime = (int) ((microtime(true) - $start) * 1000); return $this; } /** * @return self */ protected function prepareGlobalBasics() { if ($this->isLegacy()) { $this->configFile( sprintf( 'director/%s/001-director-basics', $this->connection->getDefaultGlobalZoneName() ), '.cfg' )->prepend( $this->renderLegacyDefaultNotification() ); return $this; } $this->configFile( sprintf( 'zones.d/%s/001-director-basics', $this->connection->getDefaultGlobalZoneName() ) )->prepend( "\nconst DirectorStageDir = dirname(dirname(current_filename))\n" . $this->renderFlappingLogHelper() . $this->renderHostOverridableVars() . $this->renderIfwFallbackTemplate() ); return $this; } protected function renderFlappingLogHelper() { return ' globals.directorWarnedOnceForThresholds = false; globals.directorWarnOnceForThresholds = function() { if (globals.directorWarnedOnceForThresholds == false) { globals.directorWarnedOnceForThresholds = true log(LogWarning, "config", "Director: flapping_threshold_high/low is not supported in this Icinga 2 version!") } } '; } protected function renderHostOverridableVars() { $settings = $this->connection->settings(); return sprintf( ' const DirectorOverrideTemplate = "%s" if (! globals.contains(DirectorOverrideTemplate)) { const DirectorOverrideVars = "%s" globals.directorWarnedOnceForServiceWithoutHost = false; globals.directorWarnOnceForServiceWithoutHost = function() { if (globals.directorWarnedOnceForServiceWithoutHost == false) { globals.directorWarnedOnceForServiceWithoutHost = true log( LogWarning, "config", "Director: Custom Variable Overrides will not work in this Icinga 2 version. See Director issue #1579" ) } } template Service DirectorOverrideTemplate { /** * Seems that host is missing when used in a service object, works fine for * apply rules */ if (! host) { var host = get_host(host_name) } if (! host) { globals.directorWarnOnceForServiceWithoutHost() } if (vars) { vars += host.vars[DirectorOverrideVars][name] } else { vars = host.vars[DirectorOverrideVars][name] } } } ', $settings->override_services_templatename, $settings->override_services_varname ); } protected function renderIfwFallbackTemplate(): string { return ' // Make sure config validates for Icinga < 2.14 with IfW 1.11 configuration. This might look weird, // but is intentional. get_object() does\'t work as expected at parse time. if (! globals.System || ! System.get_template || ! get_template(CheckCommand, "ifw-api-check-command")) { object CheckCommand "ifw-api" { import "plugin-check-command" } } '; } /** * @param string $checksum * * @throws NotFoundError * * @return self */ protected function loadFromDb($checksum) { $query = $this->db->select()->from( self::$table, array('checksum', 'last_activity_checksum', 'duration') )->where('checksum = ?', $this->dbBin($checksum)); $result = $this->db->fetchRow($query); if (empty($result)) { throw new NotFoundError('Got no config for %s', bin2hex($checksum)); } $this->checksum = $this->connection->binaryDbResult($result->checksum); $this->generationTime = $result->duration; $this->lastActivityChecksum = $this->connection->binaryDbResult($result->last_activity_checksum); $query = $this->db->select()->from( array('cf' => 'director_generated_config_file'), array( 'file_path' => 'cf.file_path', 'checksum' => 'f.checksum', 'content' => 'f.content', 'cnt_object' => 'f.cnt_object', 'cnt_template' => 'f.cnt_template', 'cnt_apply' => 'f.cnt_apply', ) )->join( array('f' => 'director_generated_file'), 'cf.file_checksum = f.checksum', array() )->where('cf.config_checksum = ?', $this->dbBin($checksum)); foreach ($this->db->fetchAll($query) as $row) { $file = new IcingaConfigFile(); $this->files[$row->file_path] = $file ->setContent($row->content) ->setObjectCount($row->cnt_object) ->setTemplateCount($row->cnt_template) ->setApplyCount($row->cnt_apply); } return $this; } protected function createFileFromDb($type) { /** @var IcingaObject $class */ $class = 'Icinga\\Module\\Director\\Objects\\Icinga' . ucfirst($type); Benchmark::measure(sprintf('Prefetching %s', $type)); $objects = $class::prefetchAll($this->connection); return $this->createFileForObjects($type, $objects); } /** * @param string $type Short object type, like 'service' or 'zone' * @param IcingaObject[] $objects * * @return self */ protected function createFileForObjects($type, $objects) { if (empty($objects)) { return $this; } Benchmark::measure(sprintf('Generating %ss: %s', $type, count($objects))); foreach ($objects as $object) { if ($object->isExternal()) { if ($type === 'zone') { $this->zoneMap[$object->get('id')] = $object->getObjectName(); } } $object->renderToConfig($this); } Benchmark::measure(sprintf('%ss done', $type)); return $this; } protected function typeWantsGlobalZone($type) { $types = array( 'command', ); return in_array($type, $types); } protected function typeWantsMasterZone($type) { $types = array( 'host', 'hostGroup', 'service', 'serviceGroup', 'endpoint', 'user', 'userGroup', 'timePeriod', 'notification', 'dependency' ); return in_array($type, $types); } /** * @param string $name Relative config file name * @param string $suffix Config file suffix, defaults to '.conf' * * @return IcingaConfigFile */ public function configFile($name, $suffix = '.conf') { $filename = $name . $suffix; if (! array_key_exists($filename, $this->files)) { $this->files[$filename] = new IcingaConfigFile(); } return $this->files[$filename]; } protected function collectExtraFiles() { /** @var ShipConfigFilesHook $hook */ foreach (Hook::all('Director\\ShipConfigFiles') as $hook) { foreach ($hook->fetchFiles() as $filename => $file) { if (array_key_exists($filename, $this->files)) { throw new LogicException(sprintf( 'Cannot ship one file twice: %s', $filename )); } if ($file instanceof IcingaConfigFile) { $this->files[$filename] = $file; } else { $this->configFile($filename, '')->setContent((string) $file); } } } return $this; } public function getLastActivityHexChecksum() { return bin2hex($this->getLastActivityChecksum()); } /** * @return mixed */ public function getLastActivityChecksum() { if ($this->lastActivityChecksum === null) { $query = $this->db->select() ->from('director_activity_log', 'checksum') ->order('id DESC') ->limit(1); $this->lastActivityChecksum = $this->db->fetchOne($query); // PgSQL workaround: if (is_resource($this->lastActivityChecksum)) { $this->lastActivityChecksum = stream_get_contents($this->lastActivityChecksum); } } return $this->lastActivityChecksum; } protected function renderLegacyDefaultNotification() { return preg_replace('~^ {12}~m', '', ' # # Default objects to avoid warnings # define contact { contact_name icingaadmin alias Icinga Admin host_notifications_enabled 0 host_notification_commands notify-never-default host_notification_period notification_none service_notifications_enabled 0 service_notification_commands notify-never-default service_notification_period notification_none } define contactgroup { contactgroup_name icingaadmins members icingaadmin } define timeperiod { timeperiod_name notification_none alias No Notifications } define command { command_name notify-never-default command_line /bin/echo "NOOP" } '); } } icingaweb2-module-director-1.11.8/library/Director/IcingaConfig/IcingaConfigFile.php000066400000000000000000000065331516513262500303150ustar00rootroot00000000000000content = $content . $this->content; $this->checksum = null; return $this; } public function getContent() { return $this->content; } public function setContent($content) { $this->content = $content; $this->checksum = null; return $this; } public function addContent($content) { if ($this->content === null) { $this->content = $content; } else { $this->content .= $content; } $this->checksum = null; return $this; } public function getObjectCount() { return $this->cntObject; } public function getTemplateCount() { return $this->cntTemplate; } public function getApplyCount() { return $this->cntApply; } public function getSize() { return strlen($this->content); } public function setObjectCount($cnt) { $this->cntObject = $cnt; return $this; } public function setTemplateCount($cnt) { $this->cntTemplate = $cnt; return $this; } public function setApplyCount($cnt) { $this->cntApply = $cnt; return $this; } public function getHexChecksum() { return bin2hex($this->getChecksum()); } public function getChecksum() { if ($this->checksum === null) { $this->checksum = sha1($this->content, true); } return $this->checksum; } public function addLegacyObjects($objects) { foreach ($objects as $object) { $this->addLegacyObject($object); } return $this; } public function addObjects($objects) { foreach ($objects as $object) { $this->addObject($object); } return $this; } public function addObject(IcingaObject $object) { $this->content .= $object->toConfigString(); $this->checksum = null; return $this->addObjectStats($object); } public function addLegacyObject(IcingaObject $object) { $this->content .= $object->toLegacyConfigString(); $this->checksum = null; return $this->addObjectStats($object); } protected function addObjectStats(IcingaObject $object) { if ($object->hasProperty('object_type')) { $type = $object->object_type; switch ($type) { case 'object': $this->cntObject++; break; case 'template': $this->cntTemplate++; break; case 'apply': $this->cntApply++; break; } } return $this; } public function __toString() { return $this->getContent(); } } icingaweb2-module-director-1.11.8/library/Director/IcingaConfig/IcingaConfigHelper.php000066400000000000000000000257251516513262500306610ustar00rootroot00000000000000 doesn't work '/\f/', ]; $replace = [ '\\\\\\', '\\"', '\\$', '\\t', '\\r', '\\n', // '\\b', '\\f', ]; $string = preg_replace($special, $replace, $string); return '"' . $string . '"'; } public static function renderPhpValue($value) { if (is_null($value)) { return static::renderNull(); } if (is_bool($value)) { return static::renderBoolean($value); } if (is_int($value)) { return static::renderInteger($value); } if (is_float($value)) { return static::renderFloat($value); } // TODO: // if (is_object($value) || static::isAssocArray($value)) { // return static::renderHash($value, $prefix) // TODO: also check array if (is_array($value)) { return static::renderArray($value); } if (is_string($value)) { return static::renderString($value); } throw new InvalidArgumentException(sprintf( 'Unexpected type %s', var_export($value, true) )); } public static function renderDictionaryKey($key) { if (preg_match('/^[a-z_]+[a-z0-9_]*$/i', $key)) { return static::escapeIfReserved($key); } return static::renderString($key); } // Requires an array public static function renderArray($array) { $data = []; foreach ($array as $entry) { if ($entry instanceof IcingaConfigRenderer) { $data[] = $entry; } else { $data[] = self::renderString($entry); } } return static::renderEscapedArray($data); } public static function renderEscapedArray($array) { $str = '[ ' . implode(', ', $array) . ' ]'; if (strlen($str) < 60) { return $str; } // Prefix for toConfigString? return "[\n " . implode(",\n ", $array) . "\n]"; } public static function renderDictionary($dictionary) { $values = []; foreach ($dictionary as $key => $value) { $values[$key] = rtrim( self::renderKeyValue( self::renderDictionaryKey($key), $value ) ); } if (empty($values)) { return '{}'; } ksort($values, SORT_STRING); // Prefix for toConfigString? return "{\n" . implode("\n", $values) . "\n}"; } public static function renderExpression($string) { return "{{\n " . $string . "\n}}"; } public static function alreadyRendered($string) { return new IcingaConfigRendered($string); } public static function isReserved($string) { return in_array($string, self::$reservedWords, true); } public static function escapeIfReserved($string) { if (self::isReserved($string)) { return '@' . $string; } return $string; } public static function isValidInterval($interval) { if (ctype_digit($interval)) { return true; } $parts = preg_split('/\s+/', $interval, -1, PREG_SPLIT_NO_EMPTY); foreach ($parts as $part) { if (! preg_match('/^(\d+)([dhms]?)$/', $part)) { return false; } } return true; } public static function parseInterval($interval) { if ($interval === null || $interval === '') { return null; } if (is_int($interval) || ctype_digit($interval)) { return (int) $interval; } $parts = preg_split('/\s+/', $interval, -1, PREG_SPLIT_NO_EMPTY); $value = 0; foreach ($parts as $part) { if (! preg_match('/^(\d+)([dhms]?)$/', $part, $m)) { throw new InvalidArgumentException(sprintf( '"%s" is not a valid time (duration) definition', $interval )); } $duration = (int) $m[1]; switch ($m[2]) { case 'd': $value += $duration * 86400; break; case 'h': $value += $duration * 3600; break; case 'm': $value += $duration * 60; break; default: $value += $duration; } } return $value; } public static function renderInterval($interval) { // TODO: compat only, do this at munge time. All db fields should be int $seconds = self::parseInterval($interval); if ($seconds === 0) { return '0s'; } $steps = [ 'd' => 86400, 'h' => 3600, 'm' => 60, ]; foreach ($steps as $unit => $duration) { if ($seconds % $duration === 0) { return (int) floor($seconds / $duration) . $unit; } } return $seconds . 's'; } public static function stringHasMacro($string, $macroName = null) { $len = strlen($string); $start = false; // TODO: robust UTF8 support. It works, but it is not 100% correct for ($i = 0; $i < $len; $i++) { if ($string[$i] === '$') { if ($start === false) { $start = $i; } else { // Escaping, $$ if ($start + 1 === $i) { $start = false; } else { if ($macroName === null) { return true; } if ($macroName === substr($string, $start + 1, $i - $start - 1)) { return true; } $start = false; } } } } return false; } /** * Hint: this isn't complete, but let's restrict ourselves right now * * @param $name * @return bool */ public static function isValidMacroName($name) { return preg_match('/^[A-z_][A-z_.\d]+$/', $name) && ! preg_match('/\.$/', $name); } public static function renderStringWithVariables($string, array $whiteList = null) { $len = strlen($string); $start = false; $parts = []; // TODO: UTF8... $offset = 0; for ($i = 0; $i < $len; $i++) { if ($string[$i] === '$') { if ($start === false) { $start = $i; } else { // Ignore $$ if ($start + 1 === $i) { $start = false; } else { // We got a macro $macroName = substr($string, $start + 1, $i - $start - 1); if (static::isValidMacroName($macroName)) { if ($whiteList === null || in_array($macroName, $whiteList)) { if ($start > $offset) { $parts[] = static::renderString( substr($string, $offset, $start - $offset) ); } $parts[] = $macroName; $offset = $i + 1; } } $start = false; } } } } if ($offset < $i) { $parts[] = static::renderString(substr($string, $offset, $i - $offset)); } if (! empty($parts)) { return implode(' + ', $parts); } return '""'; } } icingaweb2-module-director-1.11.8/library/Director/IcingaConfig/IcingaConfigRendered.php000066400000000000000000000012231516513262500311550ustar00rootroot00000000000000rendered = $string; } public function toConfigString() { return $this->rendered; } public function __toString() { return $this->toConfigString(); } public function toLegacyConfigString() { return $this->rendered; } } icingaweb2-module-director-1.11.8/library/Director/IcingaConfig/IcingaConfigRenderer.php000066400000000000000000000003161516513262500311750ustar00rootroot00000000000000 doesn't work '/\f/', ]; $replace = [ '\\\\\\', '\\$', '\\t', '\\r', '\\n', // '\\b', '\\f', ]; $string = preg_replace($special, $replace, $string); return $string; } /** * @param array $array * @return string */ public static function renderArray($array) { $data = []; foreach ($array as $entry) { if ($entry instanceof IcingaConfigRenderer) { // $data[] = $entry; $data[] = 'INVALID_ARRAY_MEMBER'; } else { $data[] = self::renderString($entry); } } return implode(', ', $data); } public static function renderDictionary($dictionary) { return 'INVALID_DICTIONARY'; } public static function renderExpression($string) { return 'INVALID_EXPRESSION'; } public static function alreadyRendered($string) { return new IcingaConfigRendered($string); } public static function renderInterval($interval) { if ($interval < 60) { $interval = 60; } return $interval / 60; } } icingaweb2-module-director-1.11.8/library/Director/IcingaConfig/StateFilterSet.php000066400000000000000000000014451516513262500300740ustar00rootroot00000000000000translate('Hosts') => array( 'Up' => $this->translate('Up'), 'Down' => $this->translate('Down') ), $this->translate('Services') => array( 'OK' => $this->translate('OK'), 'Warning' => $this->translate('Warning'), 'Critical' => $this->translate('Critical'), 'Unknown' => $this->translate('Unknown'), ), ); } } icingaweb2-module-director-1.11.8/library/Director/IcingaConfig/TypeFilterSet.php000066400000000000000000000024241516513262500277330ustar00rootroot00000000000000translate('State changes') => array( 'Problem' => $this->translate('Problem'), 'Recovery' => $this->translate('Recovery'), 'Custom' => $this->translate('Custom notification'), ), $this->translate('Problem handling') => array( 'Acknowledgement' => $this->translate('Acknowledgement'), 'DowntimeStart' => $this->translate('Downtime starts'), 'DowntimeEnd' => $this->translate('Downtime ends'), 'DowntimeRemoved' => $this->translate('Downtime removed'), ), $this->translate('Flapping') => array( 'FlappingStart' => $this->translate('Flapping starts'), 'FlappingEnd' => $this->translate('Flapping ends') ) ); } } icingaweb2-module-director-1.11.8/library/Director/Import/000077500000000000000000000000001516513262500234075ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Import/Import.php000066400000000000000000000314451516513262500254010ustar00rootroot00000000000000 property * * @var array */ private $rowProperties; /** * Whether this rowset exists, for caching purposes * * @var boolean */ private $rowsetExists; protected $properties = array(); /** * Checksums of all rows */ private $rowChecksums; public function __construct(ImportSource $source) { $this->source = $source; $this->connection = $source->getConnection(); $this->db = $this->connection->getDbAdapter(); } /** * Whether this import provides modified data * * @return boolean */ public function providesChanges() { return ! $this->rowsetExists() || ! $this->lastRowsetIs($this->rowsetChecksum()); } /** * Trigger an import run * * @return int Last import run ID */ public function run() { if ($this->providesChanges() && ! $this->rowsetExists()) { $this->storeRowset(); } $this->db->insert( 'import_run', array( 'source_id' => $this->source->get('id'), 'rowset_checksum' => $this->quoteBinary($this->rowsetChecksum()), 'start_time' => date('Y-m-d H:i:s'), 'succeeded' => 'y' ) ); if ($this->connection->isPgsql()) { return $this->db->lastInsertId('import_run', 'id'); } else { return $this->db->lastInsertId(); } } /** * Whether there are no rows to be fetched from import source * * @return boolean */ public function isEmpty() { $rows = $this->checksummedRows(); return empty($rows); } /** * Checksum of all available rows * * @return string */ protected function & rowsetChecksum() { if ($this->rowsetChecksum === null) { $this->prepareChecksummedRows(); } return $this->rowsetChecksum; } /** * All rows * * @return array */ protected function & checksummedRows() { if ($this->rows === null) { $this->prepareChecksummedRows(); } return $this->rows; } /** * Checksum of all available rows * * @return array */ protected function & rawData() { if ($this->data === null) { $this->data = ImportSourceHook::forImportSource( $this->source )->fetchData(); Benchmark::measure('Fetched all data from Import Source'); $this->source->applyModifiers($this->data); Benchmark::measure('Applied Property Modifiers to imported data'); } return $this->data; } /** * Prepare and remember an ImportedProperty * * @param string $key * @param mixed $rawValue * * @return array */ protected function prepareImportedProperty($key, $rawValue) { if (is_array($rawValue) || is_bool($rawValue) || is_int($rawValue) || is_float($rawValue)) { $value = json_encode($rawValue); $format = 'json'; } elseif ($rawValue instanceof stdClass) { $value = json_encode($this->sortObject($rawValue)); $format = 'json'; } else { $value = $rawValue; $format = 'string'; } $checksum = sha1(sprintf('%s=(%s)%s', $key, $format, $value), true); if (! array_key_exists($checksum, $this->properties)) { $this->properties[$checksum] = array( 'checksum' => $this->quoteBinary($checksum), 'property_name' => $key, 'property_value' => $value, 'format' => $format ); } return $this->properties[$checksum]; } /** * Walk through each row, prepare properties and calculate checksums */ protected function prepareChecksummedRows() { $keyColumn = $this->source->get('key_column'); $this->rows = array(); $this->rowProperties = array(); $objects = array(); $rowCount = 0; foreach ($this->rawData() as $row) { $rowCount++; // Key column must be set if (! isset($row->$keyColumn)) { throw new IcingaException( 'No key column "%s" in row %d', $keyColumn, $rowCount ); } $object_name = $row->$keyColumn; // Check for name collision if (array_key_exists($object_name, $objects)) { throw new IcingaException( 'Duplicate entry: %s', $object_name ); } $rowChecksums = array(); $keys = array_keys((array) $row); sort($keys); foreach ($keys as $key) { // TODO: Specify how to treat NULL values. Ignoring for now. // One option might be to import null (checksum '(null)') // and to provide a flag at sync time if ($row->$key === null) { continue; } $property = $this->prepareImportedProperty($key, $row->$key); $rowChecksums[] = $property['checksum']; } $checksum = sha1($object_name . ';' . implode(';', $rowChecksums), true); if (array_key_exists($checksum, $this->rows)) { die('WTF, collision?'); } $this->rows[$checksum] = array( 'checksum' => $this->quoteBinary($checksum), 'object_name' => $object_name ); $this->rowProperties[$checksum] = $rowChecksums; $objects[$object_name] = $checksum; } $this->rowChecksums = array_keys($this->rows); $this->rowsetChecksum = sha1(implode(';', $this->rowChecksums), true); return $this; } /** * Store our new rowset */ protected function storeRowset() { $db = $this->db; $rowset = $this->rowsetChecksum(); $rows = $this->checksummedRows(); $db->beginTransaction(); try { if ($this->isEmpty()) { $newRows = array(); $newProperties = array(); } else { $newRows = $this->newChecksums('imported_row', $this->rowChecksums); $newProperties = $this->newChecksums('imported_property', array_keys($this->properties)); } $db->insert('imported_rowset', array('checksum' => $this->quoteBinary($rowset))); foreach ($newProperties as $checksum) { $db->insert('imported_property', $this->properties[$checksum]); } foreach ($newRows as $row) { try { $db->insert('imported_row', $rows[$row]); foreach ($this->rowProperties[$row] as $property) { $db->insert('imported_row_property', array( 'row_checksum' => $this->quoteBinary($row), 'property_checksum' => $property )); } } catch (Exception $e) { throw new IcingaException( "Error while storing a row for '%s' into database: %s", $rows[$row]['object_name'], $e->getMessage() ); } } foreach (array_keys($rows) as $row) { $db->insert( 'imported_rowset_row', array( 'rowset_checksum' => $this->quoteBinary($rowset), 'row_checksum' => $this->quoteBinary($row) ) ); } $db->commit(); $this->rowsetExists = true; } catch (Exception $e) { try { $db->rollBack(); } catch (Exception $e) { // Well... } // Eventually throws details for invalid UTF8 characters RecursiveUtf8Validator::validateRows($this->data); throw $e; } } /** * Whether the last run of this import matches the given checksum * * @param string $checksum Binary checksum * * @return bool */ protected function lastRowsetIs($checksum) { return $this->connection->getLatestImportedChecksum($this->source->get('id')) === bin2hex($checksum); } /** * Whether our rowset already exists in the database * * @return boolean */ protected function rowsetExists() { if (null === $this->rowsetExists) { $this->rowsetExists = 0 === count( $this->newChecksums( 'imported_rowset', array($this->rowsetChecksum()) ) ); } return $this->rowsetExists; } /** * Finde new checksums for a specific table * * Accepts an array of checksums and gives you an array with those checksums * that are missing in the given table * * @param string $table Database table name * @param array $checksums Array with the checksums that should be verified * * @return array */ protected function newChecksums($table, $checksums) { $db = $this->db; // TODO: The following is a quickfix for binary data corrpution reported // in https://github.com/zendframework/zf1/issues/655 caused by // https://github.com/zendframework/zf1/commit/2ac9c30f // // Should be reverted once fixed, eventually with a check continueing // to use this workaround for specific ZF versions (1.12.16 and 1.12.17 // so far). Alternatively we could also use a custom quoteInto method. // The former query looked as follows: // // $query = $db->select()->from($table, 'checksum') // ->where('checksum IN (?)', $checksums) // ... // return array_diff($checksums, $existing); $hexed = array_map('bin2hex', $checksums); $conn = $this->connection; $query = $db ->select() ->from( array('c' => $table), array('checksum' => $conn->dbHexFunc('c.checksum')) )->where( $conn->dbHexFunc('c.checksum') . ' IN (?)', $hexed ); $existing = $db->fetchCol($query); $new = array_diff($hexed, $existing); return array_map('hex2bin', $new); } /** * Sort a given stdClass object by property name * * @param stdClass $object * * @return object */ protected function sortObject($object) { $array = (array) $object; foreach ($array as $key => $val) { $this->sortElement($val); } ksort($array); return (object) $array; } /** * Walk through a given array and sort all children * * Please note that the array itself will NOT be sorted, as arrays must * keep their ordering * * @param array $array */ protected function sortArrayObject(&$array) { foreach ($array as $key => $val) { $this->sortElement($val); } } /** * Recursively sort a given property * * @param mixed $el */ protected function sortElement(&$el) { if (is_array($el)) { $this->sortArrayObject($el); } elseif ($el instanceof stdClass) { $el = $this->sortObject($el); } } protected function quoteBinary($bin) { return $this->connection->quoteBinary($bin); } } icingaweb2-module-director-1.11.8/library/Director/Import/ImportSourceCoreApi.php000066400000000000000000000046661516513262500300320ustar00rootroot00000000000000getSetting('object_type') . 'Objects'; $objects = $this->api()->$func(); $result = array(); foreach ($objects as $object) { $result[] = $object->toPlainObject(); } return $result; } public function listColumns() { $res = $this->fetchData(); if (empty($res)) { return array('object_name'); } return array_keys((array) $res[0]); } public static function getDefaultKeyColumnName() { return 'object_name'; } public static function addSettingsFormFields(QuickForm $form) { $form->addElement('select', 'object_type', array( 'label' => 'Object type', 'required' => true, 'multiOptions' => $form->optionalEnum(self::enumObjectTypes($form)) )); } protected static function enumObjectTypes($form) { $types = array( 'CheckCommand' => $form->translate('Check Commands'), 'NotificationCommand' => $form->translate('Notification Commands'), 'Endpoint' => $form->translate('Endpoints'), 'Host' => $form->translate('Hosts'), 'HostGroup' => $form->translate('Hostgroups'), 'User' => $form->translate('Users'), 'UserGroup' => $form->translate('Usergroups'), 'Zone' => $form->translate('Zones'), ); asort($types); return $types; } protected function api() { if ($this->api === null) { $endpoint = $this->db()->getDeploymentEndpoint(); $this->api = $endpoint->api()->setDb($this->db()); } return $this->api; } protected function db() { if ($this->db === null) { $resourceName = Config::module('director')->get('db', 'resource'); if ($resourceName) { $this->db = Db::fromResourceName($resourceName); } } return $this->db; } } icingaweb2-module-director-1.11.8/library/Director/Import/ImportSourceDirectorObject.php000066400000000000000000000073631516513262500314070ustar00rootroot00000000000000db(); $objectClass = $this->getSetting('object_class'); $objectType = $this->getSetting('object_type'); /** @var IcingaObject $class fake type hint, it's a string */ $class = DbObjectTypeRegistry::classByType($objectClass); if ($objectType) { $dummy = $class::create(); $query = $db->getDbAdapter()->select() ->from($dummy->getTableName()) ->where('object_type = ?', $objectType); } else { $query = null; } $result = []; $resolved = $this->getSetting('resolved') === 'y'; foreach ($class::loadAllByType($objectClass, $db, $query) as $object) { $result[] = $object->toPlainObject($resolved); } if ($objectClass === 'zone') { $this->enrichZonesWithDeploymentZone($result); } return $result; } protected function enrichZonesWithDeploymentZone(&$zones) { $masterZone = $this->db()->getMasterZoneName(); foreach ($zones as $zone) { $zone->is_master_zone = $zone->object_name === $masterZone; } } public static function addSettingsFormFields(QuickForm $form) { /** @var ImportSourceForm $form */ Util::addDbResourceFormElement($form, 'resource'); $form->getElement('resource') ->setValue(Config::module('director')->get('db', 'resource')); $form->addElement('select', 'object_class', [ 'label' => $form->translate('Director Object'), 'multiOptions' => [ 'host' => $form->translate('Host'), 'endpoint' => $form->translate('Endpoint'), 'zone' => $form->translate('Zone'), ], 'required' => true, ]); $form->addElement('select', 'object_type', [ 'label' => $form->translate('Object Type'), 'multiOptions' => [ null => $form->translate('All Object Types'), 'object' => $form->translate('Objects'), 'template' => $form->translate('Templates'), 'external_object' => $form->translate('External Objects'), 'apply' => $form->translate('Apply Rules'), ], ]); /** @var $form \Icinga\Module\Director\Web\Form\DirectorObjectForm */ $form->addBoolean('resolved', [ 'label' => $form->translate('Resolved'), ], 'n'); return $form; } protected function db() { if ($this->db === null) { $this->db = Db::fromResourceName($this->settings['resource']); } return $this->db; } public function listColumns() { $rows = $this->fetchData(); $columns = []; foreach ($rows as $object) { foreach (array_keys((array) $object) as $column) { if (! isset($columns[$column])) { $columns[] = $column; } } } return $columns; } } icingaweb2-module-director-1.11.8/library/Director/Import/ImportSourceLdap.php000066400000000000000000000056761516513262500273720ustar00rootroot00000000000000listColumns(); $query = $this->connection() ->select() ->setUsePagedResults() ->from($this->settings['objectclass'], $columns); if ($base = $this->settings['base']) { $query->setBase($base); } if ($filter = $this->settings['filter']) { $query->setNativeFilter($filter); } if (in_array('dn', $columns)) { $result = $query->fetchAll(); foreach ($result as $dn => $row) { $row->dn = $dn; } return $result; } else { return $query->fetchAll(); } } public function listColumns() { return preg_split('/,\s*/', $this->settings['query'], -1, PREG_SPLIT_NO_EMPTY); } public static function addSettingsFormFields(QuickForm $form) { Util::addLdapResourceFormElement($form, 'resource'); $form->addElement('text', 'base', array( 'label' => $form->translate('LDAP Search Base'), 'description' => $form->translate( 'Your LDAP search base. Often something like OU=Users,OU=HQ,DC=your,DC=company,DC=tld' ) )); $form->addElement('text', 'objectclass', array( 'label' => $form->translate('Object class'), 'description' => $form->translate( 'An object class to search for. Might be "user", "group", "computer" or similar' ) )); $form->addElement('text', 'filter', array( 'label' => 'LDAP filter', 'description' => $form->translate( 'A custom LDAP filter to use in addition to the object class. This allows' . ' for a lot of flexibility but requires LDAP filter skills. Simple filters' . ' might look as follows: operatingsystem=*server*' ) )); $form->addElement('textarea', 'query', array( 'label' => $form->translate('Properties'), 'description' => $form->translate( 'The LDAP properties that should be fetched. This is required to be a' . ' comma-separated list like: "cn, dnshostname, operatingsystem, sAMAccountName"' ), 'spellcheck' => 'false', 'required' => true, 'rows' => 5, )); return $form; } protected function connection() { if ($this->connection === null) { $this->connection = ResourceFactory::create($this->settings['resource']); } return $this->connection; } } icingaweb2-module-director-1.11.8/library/Director/Import/ImportSourceRestApi.php000066400000000000000000000266621516513262500300570ustar00rootroot00000000000000getRestApi()->get( $this->getUrl(), null, $this->buildHeaders() ); $result = $this->extractProperty($result); return (array) $result; } public function listColumns() { $rows = $this->fetchData(); $columns = []; foreach ($rows as $object) { foreach (array_keys((array) $object) as $column) { if (! isset($columns[$column])) { $columns[] = $column; } } } return $columns; } /** * Extract result from a property specified * * A simple key, like "objects", will take the final result from key objects * * If you have a deeper key like "objects" under the key "results", specify this as "results.objects". * * When a key of the JSON object contains a literal ".", this can be escaped as * * @param $result * * @return mixed */ protected function extractProperty($result) { $property = $this->getSetting('extract_property'); if (! $property) { return $result; } $parts = preg_split('~(?$part; } else { throw new \RuntimeException(sprintf( 'Result has no "%s" property. Available keys: %s', $part, implode(', ', array_keys((array) $data)) )); } } return $data; } protected function buildHeaders() { $headers = []; $text = $this->getSetting('headers', ''); foreach (preg_split('~\r?\n~', $text, -1, PREG_SPLIT_NO_EMPTY) as $header) { $header = trim($header); $parts = preg_split('~\s*:\s*~', $header, 2); if (count($parts) < 2) { throw new InvalidPropertyException('Could not parse header: "%s"', $header); } $headers[$parts[0]] = $parts[1]; } return $headers; } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ public static function addSettingsFormFields(QuickForm $form) { static::addScheme($form); static::addSslOptions($form); static::addUrl($form); static::addResultProperty($form); static::addAuthentication($form); static::addHeader($form); static::addProxy($form); } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ protected static function addScheme(QuickForm $form) { $form->addElement('select', 'scheme', [ 'label' => $form->translate('Protocol'), 'description' => $form->translate( 'Whether to use encryption when talking to the REST API' ), 'multiOptions' => [ 'HTTPS' => $form->translate('HTTPS (strongly recommended)'), 'HTTP' => $form->translate('HTTP (this is plaintext!)'), ], 'class' => 'autosubmit', 'value' => 'HTTPS', 'required' => true, ]); } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ protected static function addHeader(QuickForm $form) { $form->addElement('textarea', 'headers', [ 'label' => $form->translate('HTTP Header'), 'description' => implode(' ', [ $form->translate('Additional headers for the HTTP request.'), $form->translate('Specify headers in text format "Header: Value", each header on a new line.'), ]), 'class' => 'preformatted', 'rows' => 4, ]); } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ protected static function addSslOptions(QuickForm $form) { $ssl = ! ($form->getSentOrObjectSetting('scheme', 'HTTPS') === 'HTTP'); if ($ssl) { static::addBoolean($form, 'ssl_verify_peer', [ 'label' => $form->translate('Verify Peer'), 'description' => $form->translate( 'Whether we should check that our peer\'s certificate has' . ' been signed by a trusted CA. This is strongly recommended.' ) ], 'y'); static::addBoolean($form, 'ssl_verify_host', [ 'label' => $form->translate('Verify Host'), 'description' => $form->translate( 'Whether we should check that the certificate matches the' . 'configured host' ) ], 'y'); } } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ protected static function addUrl(QuickForm $form) { $form->addElement('text', 'url', [ 'label' => 'REST API URL', 'description' => $form->translate( 'Something like https://api.example.com/rest/v2/objects' ), 'required' => true, ]); } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ protected static function addResultProperty(QuickForm $form) { $form->addElement('text', 'extract_property', [ 'label' => 'Extract property', 'description' => implode("\n", [ $form->translate('Often the expected result is provided in a property like "objects".' . ' Please specify this if required.'), $form->translate('Also deeper keys can be specific by a dot-notation:'), '"result.objects", "key.deeper_key.very_deep"', $form->translate('Literal dots in a key name can be written in the escape notation:'), '"key\.with\.dots"', ]) ]); } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ protected static function addAuthentication(QuickForm $form) { $form->addElement('text', 'username', [ 'label' => $form->translate('Username'), 'description' => $form->translate( 'Will be used to authenticate against your REST API' ), ]); $form->addElement('storedPassword', 'password', [ 'label' => $form->translate('Password'), ]); } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ protected static function addProxy(QuickForm $form) { $form->addElement('select', 'proxy_type', [ 'label' => $form->translate('Proxy'), 'description' => $form->translate( 'In case your API is only reachable through a proxy, please' . ' choose it\'s protocol right here' ), 'multiOptions' => $form->optionalEnum([ 'HTTP' => $form->translate('HTTP proxy'), 'SOCKS5' => $form->translate('SOCKS5 proxy'), ]), 'class' => 'autosubmit' ]); $proxyType = $form->getSentOrObjectSetting('proxy_type'); if ($proxyType) { $form->addElement('text', 'proxy', [ 'label' => $form->translate('Proxy Address'), 'description' => $form->translate( 'Hostname, IP or :' ), 'required' => true, ]); if ($proxyType === 'HTTP') { $form->addElement('text', 'proxy_user', [ 'label' => $form->translate('Proxy Username'), 'description' => $form->translate( 'In case your proxy requires authentication, please' . ' configure this here' ), ]); $form->addElement('storedPassword', 'proxy_pass', [ 'label' => $form->translate('Proxy Password'), 'required' => strlen((string) $form->getSentOrObjectSetting('proxy_user')) > 0 ]); } } } protected function getUrl() { $url = $this->getSetting('url'); $parts = \parse_url($url); if (isset($parts['path'])) { $path = $parts['path']; } else { $path = '/'; } if (isset($parts['query'])) { $url = "$path?" . $parts['query']; } else { $url = $path; } return $url; } protected function getRestApi() { $url = $this->getSetting('url'); $parts = \parse_url($url); if (isset($parts['host'])) { $host = $parts['host']; } else { throw new InvalidArgumentException("URL '$url' has no host"); } $api = new RestApiClient( $host, $this->getSetting('username'), $this->getSetting('password') ); $api->setScheme($this->getSetting('scheme')); if (isset($parts['port'])) { $api->setPort($parts['port']); } if ($api->getScheme() === 'HTTPS') { if ($this->getSetting('ssl_verify_peer', 'y') === 'n') { $api->disableSslPeerVerification(); } if ($this->getSetting('ssl_verify_host', 'y') === 'n') { $api->disableSslHostVerification(); } } if ($proxy = $this->getSetting('proxy')) { if ($proxyType = $this->getSetting('proxy_type')) { $api->setProxy($proxy, $proxyType); } else { $api->setProxy($proxy); } if ($user = $this->getSetting('proxy_user')) { $api->setProxyAuth($user, $this->getSetting('proxy_pass')); } } return $api; } /** * @param QuickForm $form * @param string $key * @param array $options * @param string|null $default * @throws \Zend_Form_Exception */ protected static function addBoolean(QuickForm $form, $key, $options, $default = null) { if ($default === null) { $form->addElement('OptionalYesNo', $key, $options); } else { $form->addElement('YesNo', $key, $options); $form->getElement($key)->setValue($default); } } /** * @param QuickForm $form * @param string $key * @param string $label * @param string $description * @throws \Zend_Form_Exception */ protected static function optionalBoolean(QuickForm $form, $key, $label, $description) { static::addBoolean($form, $key, [ 'label' => $label, 'description' => $description ]); } } icingaweb2-module-director-1.11.8/library/Director/Import/ImportSourceSql.php000066400000000000000000000040351516513262500272350ustar00rootroot00000000000000db()->fetchAll($this->settings['query']); } public function listColumns() { if ($columns = $this->getSetting('column_cache')) { return explode(', ', $columns); } else { return array_keys((array) current($this->fetchData())); } } public static function addSettingsFormFields(QuickForm $form) { /** @var ImportSourceForm $form */ Util::addDbResourceFormElement($form, 'resource'); /** @var ImportSource $current */ $current = $form->getObject(); $form->addElement('textarea', 'query', [ 'label' => $form->translate('DB Query'), 'required' => true, 'rows' => 15, ]); $form->addElement('hidden', 'column_cache', [ 'value' => '', 'filters' => [new QueryColumnsFromSql($form)], 'required' => true ]); if ($current) { if ($columns = $current->getSetting('column_cache')) { $form->addHtmlHint('Columns: ' . $columns); } else { $form->addHtmlHint(Hint::warning($form->translate( 'Please click "Store" once again to determine query columns' ))); } } return $form; } protected function db() { if ($this->db === null) { $this->db = DbConnection::fromResourceName($this->settings['resource'])->getDbAdapter(); } return $this->db; } } icingaweb2-module-director-1.11.8/library/Director/Import/PurgeStrategy/000077500000000000000000000000001516513262500262145ustar00rootroot00000000000000ImportRunBasedPurgeStrategy.php000066400000000000000000000050171516513262500342750ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Import/PurgeStrategygetSyncRule()->fetchInvolvedImportSources() as $source) { $remove += $this->checkImportSource($source); } return $remove; } protected function getLastSync() { return strtotime($this->getSyncRule()->getLastSyncTimestamp()); } // TODO: NAMING! protected function checkImportSource(ImportSource $source) { if (null === ($lastSync = $this->getLastSync())) { // No last sync, nothing to purge return array(); } $runA = $source->fetchLastRunBefore($lastSync); if ($runA === null) { // Nothing to purge for this source return array(); } $runB = $source->fetchLastRun(); if ($runA->rowset_checksum === $runB->rowset_checksum) { // Same source data, nothing to purge return array(); } return $this->listKeysRemovedBetween($runA, $runB); } public function listKeysRemovedBetween(ImportRun $runA, ImportRun $runB) { $rule = $this->getSyncRule(); $db = $rule->getDb(); $selectA = $runA->prepareImportedObjectQuery(); $selectB = $runB->prepareImportedObjectQuery(); $query = $db->select()->from( array('a' => $selectA), 'a.object_name' )->where('a.object_name NOT IN (?)', $selectB); $result = $db->fetchCol($query); if (empty($result)) { return array(); } if ($rule->hasCombinedKey()) { $pattern = $rule->getSourceKeyPattern(); $columns = SyncUtils::getRootVariables( SyncUtils::extractVariableNames($pattern) ); $resultForCombinedKey = array(); foreach (array_chunk($result, 1000) as $keys) { $rows = $runA->fetchRows($columns, null, $keys); foreach ($rows as $row) { $resultForCombinedKey[] = SyncUtils::fillVariables($pattern, $row); } } $result = $resultForCombinedKey; } if (empty($result)) { return array(); } return array_combine($result, $result); } } PurgeNothingPurgeStrategy.php000066400000000000000000000003061516513262500340040ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Import/PurgeStrategyrule = $rule; } protected function getSyncRule() { return $this->rule; } abstract public function listObjectsToPurge(); /** * @return PurgeStrategy */ public static function load($name, SyncRule $rule) { $class = __NAMESPACE__ . '\\' . $name . 'PurgeStrategy'; return new $class($rule); } } icingaweb2-module-director-1.11.8/library/Director/Import/Sync.php000066400000000000000000000776601516513262500250540ustar00rootroot00000000000000> key => [property, property]*/ protected $setNull = []; /** @var array> key => [propertyName, newValue]*/ protected $newProperties = []; /** @var bool Whether we already prepared your sync */ protected $isPrepared = false; /** @var bool Whether we applied strtolower() to existing object keys */ protected $usedLowerCasedKeys = false; protected $modify = []; protected $remove = []; protected $create = []; protected $errors = []; /** @var SyncProperty[] */ protected $syncProperties; protected $replaceVars = false; protected $hasPropertyDisabled = false; protected $serviceOverrideKeyName; /** * @var SyncRun */ protected $run; protected $runStartTime; /** @var Filter[] */ protected $columnFilters = []; /** @var HostGroupMembershipResolver|bool */ protected $hostGroupMembershipResolver; /** @var ?DbObjectStore */ protected $store; /** @var IcingaObjectGroup[] */ protected $modifiedGroups = []; /** @var IcingaObject[] */ protected $modifiedGroupObjects = []; /** * @param SyncRule $rule * @param ?DbObjectStore $store */ public function __construct(SyncRule $rule, DbObjectStore $store = null) { $this->rule = $rule; $this->db = $rule->getConnection(); $this->store = $store; } /** * Whether the given sync rule would apply modifications * * @return boolean * @throws Exception */ public function hasModifications() { return count($this->getExpectedModifications()) > 0; } /** * Retrieve modifications a given SyncRule would apply * * @return array Array of IcingaObject elements * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function getExpectedModifications() { $modified = []; $objects = $this->prepare(); $updateOnly = $this->rule->get('update_policy') === 'update-only'; $allowCreate = ! $updateOnly; foreach ($objects as $object) { if ($object->hasBeenModified()) { if ($allowCreate || $object->hasBeenLoadedFromDb()) { $modified[] = $object; } } elseif (! $updateOnly && $object->shouldBeRemoved()) { $modified[] = $object; } } return $modified; } /** * Raise PHP resource limits * * @return self; */ protected function raiseLimits() { MemoryLimit::raiseTo('1024M'); ini_set('max_execution_time', '0'); return $this; } /** * Initialize run summary measurements * * @return self; */ protected function startMeasurements() { $this->run = SyncRun::start($this->rule); $this->runStartTime = microtime(true); Benchmark::measure('Starting sync'); return $this; } /** * Fetch the configured properties involved in this sync * * @return self */ protected function fetchSyncProperties() { $this->syncProperties = $this->rule->getSyncProperties(); foreach ($this->syncProperties as $key => $prop) { $destinationField = $prop->get('destination_field'); if ($destinationField === 'vars' && $prop->get('merge_policy') === 'override') { $this->replaceVars = true; } if ($destinationField === 'disabled') { $this->hasPropertyDisabled = true; } if ($prop->get('filter_expression') === null || strlen($prop->get('filter_expression')) === 0) { continue; } $this->columnFilters[$key] = Filter::fromQueryString( $prop->get('filter_expression') ); } return $this; } protected function rowMatchesPropertyFilter($row, $key) { if (!array_key_exists($key, $this->columnFilters)) { return true; } return $this->columnFilters[$key]->matches($row); } /** * Instantiates all related ImportSource objects * * @return self * @throws \Icinga\Exception\NotFoundError */ protected function prepareRelatedImportSources() { $this->sources = []; foreach ($this->syncProperties as $p) { $id = $p->get('source_id'); if (! array_key_exists($id, $this->sources)) { $this->sources[$id] = ImportSource::loadWithAutoIncId( (int) $id, $this->db ); } } return $this; } /** * Prepare the source columns we want to fetch * * @return self */ protected function prepareSourceColumns() { // $fieldMap = []; $this->sourceColumns = []; foreach ($this->syncProperties as $p) { $sourceId = $p->get('source_id'); if (! array_key_exists($sourceId, $this->sourceColumns)) { $this->sourceColumns[$sourceId] = []; } foreach (SyncUtils::extractVariableNames($p->get('source_expression')) as $varname) { $this->sourceColumns[$sourceId][$varname] = $varname; // -> ? $fieldMap[ } } return $this; } /** * Fetch latest imported data rows from all involved import sources * @return Sync * @throws \Icinga\Exception\NotFoundError */ protected function fetchImportedData() { Benchmark::measure('Begin loading imported data'); if ($this->rule->get('object_type') === 'host') { $this->serviceOverrideKeyName = $this->db->settings()->override_services_varname; } $this->imported = []; $sourceKeyPattern = $this->rule->getSourceKeyPattern(); $combinedKey = $this->rule->hasCombinedKey(); foreach ($this->sources as $source) { /** @var ImportSource $source */ $sourceId = $source->get('id'); // Provide an alias column for our key. TODO: double-check this! $key = $source->key_column; $this->sourceColumns[$sourceId][$key] = $key; $run = $source->fetchLastRun(true); $usedColumns = SyncUtils::getRootVariables($this->sourceColumns[$sourceId]); $filterColumns = []; foreach ($this->columnFilters as $filter) { foreach ($filter->listFilteredColumns() as $column) { $filterColumns[$column] = $column; } } if (($ruleFilter = $this->rule->filter()) !== null) { foreach ($ruleFilter->listFilteredColumns() as $column) { $filterColumns[$column] = $column; } } if (! empty($filterColumns)) { foreach (SyncUtils::getRootVariables($filterColumns) as $column) { $usedColumns[$column] = $column; } } Benchmark::measure(sprintf('Done pre-processing columns for source %s', $source->source_name)); $rows = $run->fetchRows($usedColumns); Benchmark::measure(sprintf('Fetched source %s', $source->source_name)); $this->imported[$sourceId] = []; foreach ($rows as $row) { if ($combinedKey) { $key = SyncUtils::fillVariables($sourceKeyPattern, $row); if ($this->usedLowerCasedKeys) { $key = strtolower($key); } if (array_key_exists($key, $this->imported[$sourceId])) { throw new InvalidArgumentException(sprintf( 'Trying to import row "%s" (%s) twice: %s VS %s', $key, $sourceKeyPattern, json_encode($this->imported[$sourceId][$key]), json_encode($row) )); } } else { if (! property_exists($row, $key)) { throw new InvalidArgumentException(sprintf( 'There is no key column "%s" in this row from "%s": %s', $key, $source->source_name, json_encode($row) )); } } if (! $this->rule->matches($row)) { continue; } if ($combinedKey) { $this->imported[$sourceId][$key] = $row; } else { if ($this->usedLowerCasedKeys) { $this->imported[$sourceId][strtolower($row->$key)] = $row; } else { $this->imported[$sourceId][$row->$key] = $row; } } } unset($rows); } Benchmark::measure('Done loading imported data'); return $this; } /** * TODO: This is rubbish, we need to filter at fetch time */ protected function removeForeignListEntries() { $listId = null; foreach ($this->syncProperties as $prop) { if ($prop->get('destination_field') === 'list_id') { $listId = (int) $prop->get('source_expression'); } } if ($listId === null) { throw new InvalidArgumentException( 'Cannot sync datalist entry without list_id' ); } $no = []; foreach ($this->objects as $k => $o) { if ((int) $o->get('list_id') !== $listId) { $no[] = $k; } } foreach ($no as $k) { unset($this->objects[$k]); } } /** * @return $this */ protected function loadExistingObjects() { Benchmark::measure('Begin loading existing objects'); $ruleObjectType = $this->rule->get('object_type'); $useLowerCaseKeys = $ruleObjectType !== 'datalistEntry'; // TODO: Make object_type (template, object...) and object_name mandatory? if ($this->rule->hasCombinedKey()) { $this->objects = []; $destinationKeyPattern = $this->rule->getDestinationKeyPattern(); $table = DbObjectTypeRegistry::tableNameByType($ruleObjectType); if ($this->store && BranchSupport::existsForTableName($table)) { $objects = $this->store->loadAll($table); } else { $objects = IcingaObject::loadAllByType($ruleObjectType, $this->db); } foreach ($objects as $object) { if ($object instanceof IcingaService) { if ( strstr($destinationKeyPattern, '${host}') && $object->get('host_id') === null ) { continue; } elseif ( strstr($destinationKeyPattern, '${service_set}') && $object->get('service_set_id') === null ) { continue; } } $key = SyncUtils::fillVariables( $destinationKeyPattern, $object ); if ($useLowerCaseKeys) { $key = strtolower($key); } if (array_key_exists($key, $this->objects)) { throw new InvalidArgumentException(sprintf( 'Combined destination key "%s" is not unique, got "%s" twice', $destinationKeyPattern, $key )); } $this->objects[$key] = $object; } } else { if ($this->store) { $objects = $this->store->loadAll(DbObjectTypeRegistry::tableNameByType($ruleObjectType), 'object_name'); } else { $keyColumn = null; $query = null; // We enforce named index for combined-key templates (Services and Sets) and applied Sets if ($ruleObjectType === 'service' || $ruleObjectType === 'serviceSet') { foreach ($this->syncProperties as $prop) { $configuredObjectType = $prop->get('source_expression'); if ( $prop->get('destination_field') === 'object_type' && ( $configuredObjectType === 'template' || ($configuredObjectType === 'apply' && $ruleObjectType === 'serviceSet') ) ) { $keyColumn = 'object_name'; $table = $ruleObjectType === 'service' ? BranchSupport::TABLE_ICINGA_SERVICE : BranchSupport::TABLE_ICINGA_SERVICE_SET; $query = $this->db->getDbAdapter()->select() ->from($table)->where('object_type = ?', $configuredObjectType); } } } $objects = IcingaObject::loadAllByType($ruleObjectType, $this->db, $query, $keyColumn); } if ($useLowerCaseKeys) { $this->objects = []; foreach ($objects as $key => $object) { $this->objects[strtolower($key)] = $object; } } else { $this->objects = $objects; } } $this->usedLowerCasedKeys = $useLowerCaseKeys; // TODO: should be obsoleted by a better "loadFiltered" method if ($ruleObjectType === 'datalistEntry') { $this->removeForeignListEntries(); } Benchmark::measure('Done loading existing objects'); return $this; } /** * @return array * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function prepareNewObjects() { $objects = []; $ruleObjectType = $this->rule->get('object_type'); foreach ($this->sources as $source) { $sourceId = $source->id; $keyColumn = $source->get('key_column'); foreach ($this->imported[$sourceId] as $key => $row) { // Workaround: $a["10"] = "val"; -> array_keys($a) = [(int) 10] $key = (string) $key; $originalKey = $row->$keyColumn; if ($this->usedLowerCasedKeys) { $key = strtolower($key); } if (! array_key_exists($key, $objects)) { // Safe default values for object_type and object_name if ($ruleObjectType === 'datalistEntry') { $props = []; } else { $props = [ 'object_type' => 'object', 'object_name' => $originalKey, ]; } $objects[$key] = IcingaObject::createByType( $ruleObjectType, $props, $this->db ); } $object = $objects[$key]; $this->prepareNewObject($row, $object, $key, $sourceId); } } return $objects; } /** * @param $row * @param DbObject $object * @param $sourceId * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function prepareNewObject($row, DbObject $object, $objectKey, $sourceId) { if (!isset($this->newProperties[$objectKey])) { $this->newProperties[$objectKey] = []; } // TODO: some more improvements are possible here. First, no need to instantiate // all new objects, we could stick with the newProperties array. Next, we // should be more correct when respecting sync property order. Right now, // a property from another Import Source might win, even if property order // tells something different. This is a very rare case, but still incorrect. $properties = &$this->newProperties[$objectKey]; foreach ($this->syncProperties as $propertyKey => $p) { if ($p->get('source_id') !== $sourceId) { continue; } if (! $this->rowMatchesPropertyFilter($row, $propertyKey)) { continue; } $prop = $p->get('destination_field'); $val = SyncUtils::fillVariables($p->get('source_expression'), $row); if ($object instanceof IcingaObject) { if ($prop === 'import') { if ($val !== null) { $object->imports()->add($val); } } elseif ($prop === 'groups') { if ($val !== null) { $object->groups()->add($val); } } elseif (substr($prop, 0, 5) === 'vars.') { $varName = substr($prop, 5); if (substr($varName, -2) === '[]') { $varName = substr($varName, 0, -2); $object->vars()->$varName = array_merge( (array) ($object->vars()->$varName), (array) $val ); } else { $this->setPropertyWithNullLogic($object, $objectKey, $prop, $val, $properties); } } else { $this->setPropertyWithNullLogic($object, $objectKey, $prop, $val, $properties); } } else { $this->setPropertyWithNullLogic($object, $objectKey, $prop, $val, $properties); } } } protected function setPropertyWithNullLogic(DbObject $object, $objectKey, $property, $value, &$allProps) { if ($value === null) { if (! array_key_exists($property, $allProps) || $allProps[$property] === null) { $this->setNull[$objectKey][$property] = $property; } } else { unset($this->setNull[$objectKey][$property]); $object->set($property, $value); } $allProps[$property] = $value; } /** * @return $this */ protected function deferResolvers() { if (in_array($this->rule->get('object_type'), ['host', 'hostgroup'])) { $resolver = $this->getHostGroupMembershipResolver(); $resolver->defer()->setUseTransactions(false); } return $this; } /** * @param DbObject $object * @return $this */ protected function setResolver($object) { if (! ($object instanceof IcingaHost || $object instanceof IcingaHostGroup)) { return $this; } if ($resolver = $this->getHostGroupMembershipResolver()) { $object->setHostGroupMembershipResolver($resolver); } return $this; } /** * @return $this * @throws \Zend_Db_Adapter_Exception */ protected function notifyResolvers() { if ($resolver = $this->getHostGroupMembershipResolver()) { if ($this->rule->get('object_type') === 'hostgroup') { $resolver->setGroups($this->modifiedGroups); } $resolver->refreshDb(true); } return $this; } /** * @return bool|HostGroupMembershipResolver */ protected function getHostGroupMembershipResolver() { if ($this->hostGroupMembershipResolver === null) { if ( in_array( $this->rule->get('object_type'), ['host', 'hostgroup'] ) ) { $this->hostGroupMembershipResolver = new HostGroupMembershipResolver( $this->db ); } else { $this->hostGroupMembershipResolver = false; } } return $this->hostGroupMembershipResolver; } /** * Evaluates a SyncRule and returns a list of modified objects * * TODO: Split this into smaller methods * * @return DbObject|IcingaObject[] List of modified IcingaObjects * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function prepare() { if ($this->isPrepared) { return $this->objects; } $this->raiseLimits() ->startMeasurements() ->prepareCache() ->fetchSyncProperties() ->prepareRelatedImportSources() ->prepareSourceColumns() ->loadExistingObjects() ->fetchImportedData() ->deferResolvers(); Benchmark::measure('Begin preparing updated objects'); $newObjects = $this->prepareNewObjects(); Benchmark::measure('Ready to process objects'); /** @var DbObject|IcingaObject $object */ foreach ($newObjects as $key => $object) { $this->processObject($key, $object); } Benchmark::measure('Modified objects are ready, applying purge strategy'); $noAction = []; $purgeAction = $this->rule->get('purge_action'); foreach ($this->rule->purgeStrategy()->listObjectsToPurge() as $key) { $key = strtolower($key); if (array_key_exists($key, $newObjects)) { // Object has been touched, do not delete continue; } if (array_key_exists($key, $this->objects)) { $object = $this->objects[$key]; if (! $object->hasBeenModified()) { switch ($purgeAction) { case 'delete': $object->markForRemoval(); break; case 'disable': $object->set('disabled', 'y'); break; default: throw new RuntimeException( "Unsupported purge action: '$purgeAction'" ); } } } } Benchmark::measure('Done marking objects for purge'); foreach ($this->objects as $key => $object) { if (! $object->hasBeenModified() && ! $object->shouldBeRemoved()) { $noAction[] = $key; } } foreach ($noAction as $key) { unset($this->objects[$key]); } $this->isPrepared = true; Benchmark::measure('Done preparing objects'); return $this->objects; } /** * @param $key * @param DbObject|IcingaObject $object * @throws \Icinga\Exception\NotFoundError */ protected function processObject($key, $object) { if (array_key_exists($key, $this->objects)) { $this->refreshObject($key, $object); } else { $this->addNewObject($key, $object); } } protected function optionallyTellResolverAboutModifiedGroup(IcingaObjectGroup $group) { if (in_array('assign_filter', $group->getModifiedProperties())) { $this->modifiedGroups[] = $group; } } /** * @param $key * @param DbObject|IcingaObject $object * @throws \Icinga\Exception\NotFoundError */ protected function refreshObject($key, $object) { $policy = $this->rule->get('update_policy'); switch ($policy) { case 'override': if ( $object instanceof IcingaHost && !in_array('api_key', $this->rule->getSyncProperties()) ) { $this->objects[$key]->replaceWith($object, ['api_key']); } else { $this->objects[$key]->replaceWith($object); } break; case 'merge': case 'update-only': // TODO: re-evaluate merge settings. vars.x instead of // just "vars" might suffice. $this->objects[$key]->merge($object, $this->replaceVars); if (! $this->hasPropertyDisabled && $object->hasProperty('disabled')) { $this->objects[$key]->resetProperty('disabled'); } break; default: // policy 'ignore', no action } if ($policy === 'override' || $policy === 'merge') { if ($object instanceof IcingaHost) { $keyName = $this->serviceOverrideKeyName; if (! $object->hasInitializedVars() || ! isset($object->vars()->$key)) { $this->objects[$key]->vars()->restoreStoredVar($keyName); } } } // Hint: in theory, NULL should be set on new objects, but this has no effect // anyway, and we also do not store vars.something = null, this would // instead delete the variable. So here we do not need to check for new // objects, and skip all null values with update policy = 'ignore' if ($policy !== 'ignore' && isset($this->setNull[$key])) { foreach ($this->setNull[$key] as $property) { $this->objects[$key]->set($property, null); } } } /** * @param $key * @param DbObject|IcingaObject $object */ protected function addNewObject($key, $object) { $this->objects[$key] = $object; } /** * Runs a SyncRule and applies all resulting changes * @return int * @throws Exception * @throws IcingaException */ public function apply() { Benchmark::measure('Begin applying objects'); $objects = $this->prepare(); $db = $this->db; $dba = $db->getDbAdapter(); if (! $this->store) { // store has it's own transaction $dba->beginTransaction(); } $object = null; $updateOnly = $this->rule->get('update_policy') === 'update-only'; $allowCreate = ! $updateOnly; try { $formerActivityChecksum = hex2bin( $db->getLastActivityChecksum() ); $created = 0; $modified = 0; $deleted = 0; // TODO: Count also failed ones, once we allow such // $failed = 0; foreach ($objects as $object) { $this->setResolver($object); if (! $updateOnly && $object->shouldBeRemoved()) { if ($this->store) { $this->store->delete($object); } else { $object->delete(); } $deleted++; continue; } if ($object->hasBeenModified()) { if ($object instanceof IcingaObjectGroup) { $this->optionallyTellResolverAboutModifiedGroup($object); } $existing = $object->hasBeenLoadedFromDb(); if ($existing) { if ($this->store) { $this->store->store($object); } else { $object->store($db); } $modified++; } elseif ($allowCreate) { if ($this->store) { $this->store->store($object); } else { $object->store($db); } $created++; } } } $runProperties = [ 'objects_created' => $created, 'objects_deleted' => $deleted, 'objects_modified' => $modified, ]; if ($created + $deleted + $modified > 0) { // TODO: What if this has been the very first activity? $runProperties['last_former_activity'] = $db->quoteBinary($formerActivityChecksum); $runProperties['last_related_activity'] = $db->quoteBinary(hex2bin( $db->getLastActivityChecksum() )); } $this->run->setProperties($runProperties); if (!$this->store || !$this->store->getBranch()->isBranch()) { $this->run->store(); } $this->notifyResolvers(); if (! $this->store) { $dba->commit(); } // Store duration after commit, as the commit might take some time $this->run->set('duration_ms', (int) round( (microtime(true) - $this->runStartTime) * 1000 )); if (!$this->store || !$this->store->getBranch()->isBranch()) { $this->run->store(); } Benchmark::measure('Done applying objects'); } catch (Exception $e) { if (! $this->store) { $dba->rollBack(); } if ($object instanceof IcingaObject) { throw new IcingaException( 'Exception while syncing %s %s: %s', get_class($object), $object->getObjectName(), $e->getMessage(), $e ); } else { throw $e; } } return $this->run->get('id'); } protected function prepareCache() { if ($this->store) { return $this; } PrefetchCache::initialize($this->db); IcingaTemplateRepository::clear(); $ruleObjectType = $this->rule->get('object_type'); $dummy = IcingaObject::createByType($ruleObjectType); if ($dummy instanceof IcingaObject) { IcingaObject::prefetchAllRelationsByType($ruleObjectType, $this->db); } return $this; } } icingaweb2-module-director-1.11.8/library/Director/Import/SyncUtils.php000066400000000000000000000102311516513262500260520ustar00rootroot00000000000000 { 'disk' => { 'sda' => { 'size' => '256G' } } } } * * and a key vars.disk.sda given as [ 'vars', 'disk', 'sda' ] this would * return { size => '255GB' } * * @param string $val The value to extract data from * @param array $keys A list of nested keys pointing to desired data * * @return mixed */ public static function getDeepValue($val, array $keys) { $key = array_shift($keys); if (! property_exists($val, $key)) { return null; } if (empty($keys)) { return $val->$key; } return static::getDeepValue($val->$key, $keys); } /** * Return a specific value from a given row object * * Supports also keys pointing to nested structures like vars.disk.sda * * @param object $row stdClass object providing property values * @param string $var Variable/property name * * @return mixed */ public static function getSpecificValue($row, $var) { if (strpos($var, '.') === false) { if ($row instanceof DbObject) { return $row->$var; } if (! property_exists($row, $var)) { return null; } return $row->$var; } else { $parts = explode('.', $var); $main = array_shift($parts); if (! property_exists($row, $main)) { return null; } if ($row->$main === null) { return null; } if (! is_object($row->$main)) { throw new InvalidArgumentException(sprintf( 'Data is not nested, cannot access %s: %s', $var, var_export($row, true) )); } return static::getDeepValue($row->$main, $parts); } } /** * Fill variables in the given string pattern * * This replaces all occurrences of ${var_name} with the corresponding * property $row->var_name of the given row object. Missing variables are * replaced by an empty string. This works also fine in case there are * multiple variables to be found in your string. * * @param string $string String with optional variables/placeholders * @param object $row stdClass object providing property values * * @return string */ public static function fillVariables($string, $row) { if (preg_match('/^\${([^}]+)}$/', $string, $m)) { return static::getSpecificValue($row, $m[1]); } $func = function ($match) use ($row) { return SyncUtils::getSpecificValue($row, $match[1]); }; return preg_replace_callback('/\${([^}]+)}/', $func, $string); } public static function getRootVariables($vars) { $res = array(); foreach ($vars as $p) { if (false === ($pos = strpos($p, '.')) || $pos === strlen($p) - 1) { $res[] = $p; } else { $res[] = substr($p, 0, $pos); } } if (empty($res)) { return array(); } return array_combine($res, $res); } } icingaweb2-module-director-1.11.8/library/Director/Integration/000077500000000000000000000000001516513262500244205ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Integration/BackendInterface.php000066400000000000000000000024111516513262500302770ustar00rootroot00000000000000getHostQuery($hostName)->first() !== null; } public function hasService(?string $hostName, ?string $serviceName): bool { if ($hostName === null || $serviceName === null) { return false; } return $this->getServiceQuery($hostName, $serviceName)->first() !== null; } public function getHostUrl(?string $hostName): ?Url { if ($hostName === null) { return null; } return Url::fromPath('icingadb/host', ['name' => $hostName]); } public function canModifyHost(?string $hostName): bool { if ( $hostName === null || ! $this->getAuth()->hasPermission(Permission::ICINGADB_HOSTS) ) { return false; } $query = $this->getHostQuery($hostName); return $query->first() !== null; } public function canModifyService(?string $hostName, ?string $serviceName): bool { if ( $hostName === null || $serviceName === null || ! $this->getAuth()->hasPermission(Permission::ICINGADB_SERVICES) ) { return false; } $query = $this->getServiceQuery($hostName, $serviceName); return $query->first() !== null; } /** * Get the query for given host * * @param string $hostName * * @return Query */ protected function getHostQuery(string $hostName): Query { $query = Host::on($this->getDb()) ->filter(Filter::equal('host.name', $hostName)); $this->applyDirectorRestrictions($query); return $query; } /** * Get the query for given host and service * * @param string $hostName * @param string $serviceName * * @return Query */ protected function getServiceQuery(string $hostName, string $serviceName): Query { $query = Service::on($this->getDb()) ->filter(Filter::all( Filter::equal('service.name', $serviceName), Filter::equal('host.name', $hostName) )); $this->applyDirectorRestrictions($query); return $query; } /** * Apply director restrictions on the given query * * @param Query $query */ protected function applyDirectorRestrictions(Query $query): void { $queryFilter = Filter::any(); foreach ($this->getAuth()->getRestrictions(Restriction::ICINGADB_RW_OBJECT_FILTER) as $restriction) { $queryFilter->add($this->parseRestriction($restriction, Restriction::ICINGADB_RW_OBJECT_FILTER)); } $query->filter($queryFilter); } } icingaweb2-module-director-1.11.8/library/Director/Integration/MonitoringModule/000077500000000000000000000000001516513262500277135ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Integration/MonitoringModule/Monitoring.php000066400000000000000000000133111516513262500325500ustar00rootroot00000000000000auth = $auth; $this->initializeMonitoringBackend(); } public function getHostUrl(?string $hostName): ?Url { if ($hostName === null) { return null; } return Url::fromPath('monitoring/host/show', ['host' => $hostName]); } public function hasHost(?string $hostName): bool { if ($hostName === null || ! $this->isAvailable()) { return false; } try { return $this->selectHost($hostName)->fetchOne() === $hostName; } catch (Exception $_) { return false; } } public function hasService(?string $hostName, ?string $serviceName): bool { if ($hostName === null || $serviceName === null || ! $this->isAvailable()) { return false; } try { return $this->rowIsService( $this->selectService($hostName, $serviceName)->fetchRow(), $hostName, $serviceName ); } catch (Exception $_) { return false; } } public function canModifyService(?string $hostName, ?string $serviceName): bool { if (! $this->isAvailable() || $hostName === null || $serviceName === null) { return false; } if ($this->auth->hasPermission(Permission::MONITORING_SERVICES)) { $restriction = null; foreach ($this->auth->getRestrictions(Restriction::MONITORING_RW_OBJECT_FILTER) as $restriction) { if ($this->hasServiceWithFilter($hostName, $serviceName, Filter::fromQueryString($restriction))) { return true; } } if ($restriction === null) { return $this->hasService($hostName, $serviceName); } } return false; } public function canModifyHost(?string $hostName): bool { if ($hostName !== null && $this->isAvailable() && $this->auth->hasPermission(Permission::MONITORING_HOSTS)) { $restriction = null; foreach ($this->auth->getRestrictions(Restriction::MONITORING_RW_OBJECT_FILTER) as $restriction) { if ($this->hasHostWithFilter($hostName, Filter::fromQueryString($restriction))) { return true; } } if ($restriction === null) { return $this->hasHost($hostName); } } return false; } protected function hasHostWithFilter($hostname, Filter $filter): bool { try { return $this->selectHost($hostname)->applyFilter($filter)->fetchOne() === $hostname; } catch (Exception $e) { return false; } } protected function hasServiceWithFilter($hostname, $service, Filter $filter): bool { try { return $this->rowIsService( $this->selectService($hostname, $service)->applyFilter($filter)->fetchRow(), $hostname, $service ); } catch (Exception $e) { return false; } } protected function selectHost($hostname) { return $this->selectHostStatus($hostname, [ 'hostname' => 'host_name', ]); } protected function selectHostStatus($hostname, $columns) { return $this->restrictQuery( $this->backend ->select() ->from('hostStatus', $columns) ->where('host_name', $hostname) ); } protected function selectService($hostname, $service) { return $this->selectServiceStatus($hostname, $service, [ 'hostname' => 'host_name', 'service' => 'service_description', ]); } protected function selectServiceStatus($hostname, $service, $columns) { return $this->restrictQuery( $this->backend ->select() ->from('serviceStatus', $columns) ->where('host_name', $hostname) ->where('service_description', $service) ); } protected function restrictQuery($query) { $query->applyFilter(MonitoringRestriction::getObjectsFilter($this->auth)); return $query; } protected function rowIsService($row, $hostname, $service): bool { return (array) $row === [ 'hostname' => $hostname, 'service' => $service, ]; } protected function initializeMonitoringBackend() { $app = Icinga::app(); $modules = $app->getModuleManager(); if (!$modules->hasLoaded('monitoring') && $app->isCli()) { $modules->loadEnabledModules(); } if ($modules->hasLoaded('monitoring')) { try { $this->backend = MonitoringBackend::instance(); } catch (ConfigurationError $e) { $this->backend = null; } } } protected function isAvailable(): bool { return $this->backend !== null; } } icingaweb2-module-director-1.11.8/library/Director/Job/000077500000000000000000000000001516513262500226475ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Job/ConfigJob.php000066400000000000000000000050701516513262500252220ustar00rootroot00000000000000db(); $deployer = new ConditionalDeployment($db); $renderer = new ConditionalConfigRenderer($db); if ($grace = $this->getSetting('grace_period')) { $deployer->setGracePeriod(new DeploymentGracePeriod((int) $grace, $db)); } if ($this->getSetting('force_generate') === 'y') { $renderer->forceRendering(); } $deployer->deploy($renderer->getConfig()); } public static function addSettingsFormFields(QuickForm $form) { $form->addElement('select', 'force_generate', [ 'label' => $form->translate('Force rendering'), 'description' => $form->translate( 'Whether rendering should be forced. If not enforced, this' . ' job re-renders the configuration only when there have been' . ' activities since the last rendered config' ), 'value' => 'n', 'multiOptions' => [ 'y' => $form->translate('Yes'), 'n' => $form->translate('No'), ] ]); $form->addElement('select', 'deploy_when_changed', [ 'label' => $form->translate('Deploy modified config'), 'description' => $form->translate( 'This allows you to immediately deploy a modified configuration' ), 'value' => 'n', 'multiOptions' => [ 'y' => $form->translate('Yes'), 'n' => $form->translate('No'), ] ]); $form->addElement('text', 'grace_period', array( 'label' => $form->translate('Grace period'), 'description' => $form->translate( 'When deploying configuration, wait at least this amount of' . ' seconds unless the next deployment should take place' ), 'value' => 600, )); return $form; } public static function getDescription(QuickForm $form) { return $form->translate( 'The Config job allows you to generate and eventually deploy your' . ' Icinga 2 configuration' ); } } icingaweb2-module-director-1.11.8/library/Director/Job/HousekeepingJob.php000066400000000000000000000015621516513262500264450ustar00rootroot00000000000000housekeeping()->runAllTasks(); } public static function getDescription(QuickForm $form) { return $form->translate( 'The Housekeeping job provides various task that keep your Director' . ' database fast and clean' ); } public function isPending() { return $this->housekeeping()->hasPendingTasks(); } protected function housekeeping() { if ($this->housekeeping === null) { $this->housekeeping = new Housekeeping($this->db()); } return $this->housekeeping; } } icingaweb2-module-director-1.11.8/library/Director/Job/ImportJob.php000066400000000000000000000074001516513262500252660ustar00rootroot00000000000000db(); $id = $this->getSetting('source_id'); if ($id === '__ALL__') { foreach (ImportSource::loadAll($db) as $source) { $this->runForSource($source); } } else { $this->runForSource(ImportSource::loadWithAutoIncId($id, $db)); } } /** * @return array * @throws \Icinga\Exception\NotFoundError */ public function exportSettings() { $settings = parent::exportSettings(); if (array_key_exists('source_id', $settings)) { $id = $settings['source_id']; if ($id !== '__ALL__') { $settings['source'] = ImportSource::loadWithAutoIncId( $id, $this->db() )->get('source_name'); } unset($settings['source_id']); } return $settings; } /** * @param ImportSource $source * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function runForSource(ImportSource $source) { if ($this->getSetting('run_import') === 'y') { $source->runImport(); } else { $source->checkForChanges(); } } public static function getDescription(QuickForm $form) { return $form->translate( 'The "Import" job allows to run import actions at regular intervals' ); } /** * @param QuickForm $form * @throws \Zend_Form_Exception */ public static function addSettingsFormFields(QuickForm $form) { $rules = self::enumImportSources($form); $form->addElement('select', 'source_id', array( 'label' => $form->translate('Import source'), 'description' => $form->translate( 'Please choose your import source that should be executed.' . ' You could create different schedules for different sources' . ' or also opt for running all of them at once.' ), 'required' => true, 'class' => 'autosubmit', 'multiOptions' => $rules )); $form->addElement('select', 'run_import', array( 'label' => $form->translate('Run import'), 'description' => $form->translate( 'You could immediately apply eventual changes or just learn about them.' . ' In case you do not want them to be applied immediately, defining a' . ' job still makes sense. You will be made aware of available changes' . ' in your Director GUI.' ), 'value' => 'n', 'multiOptions' => array( 'y' => $form->translate('Yes'), 'n' => $form->translate('No'), ) )); } protected static function enumImportSources(QuickForm $form) { /** @var DirectorObjectForm $form */ $db = $form->getDb(); $query = $db->select()->from( 'import_source', array('id', 'source_name') )->order('source_name'); $res = $db->fetchPairs($query); return array( null => $form->translate('- please choose -'), '__ALL__' => $form->translate('Run all imports at once') ) + $res; } } icingaweb2-module-director-1.11.8/library/Director/Job/SyncJob.php000066400000000000000000000101351516513262500247270ustar00rootroot00000000000000db(); $id = $this->getSetting('rule_id'); if ($id === '__ALL__') { foreach (SyncRule::loadAll($db) as $rule) { $this->runForRule($rule); } } else { $this->runForRule(SyncRule::loadWithAutoIncId((int) $id, $db)); } } /** * @return array * @throws \Icinga\Exception\NotFoundError */ public function exportSettings() { $settings = [ 'apply_changes' => $this->getSetting('apply_changes') === 'y' ]; $id = $this->getSetting('rule_id'); if ($id !== '__ALL__') { $settings['rule'] = SyncRule::loadWithAutoIncId((int) $id, $this->db()) ->get('rule_name'); } return $settings; } /** * @param SyncRule $rule * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function runForRule(SyncRule $rule) { if ($this->getSetting('apply_changes') === 'y') { $rule->applyChanges(); } else { $rule->checkForChanges(); } } public static function getDescription(QuickForm $form) { return $form->translate( 'The "Sync" job allows to run sync actions at regular intervals' ); } /** * @param QuickForm $form * @return DirectorObjectForm|QuickForm * @throws \Zend_Form_Exception */ public static function addSettingsFormFields(QuickForm $form) { /** @var DirectorObjectForm $form */ $rules = self::enumSyncRules($form); $form->addElement('select', 'rule_id', array( 'label' => $form->translate('Synchronization rule'), 'description' => $form->translate( 'Please choose your synchronization rule that should be executed.' . ' You could create different schedules for different rules or also' . ' opt for running all of them at once.' ), 'required' => true, 'class' => 'autosubmit', 'multiOptions' => $rules )); $form->addElement('select', 'apply_changes', array( 'label' => $form->translate('Apply changes'), 'description' => $form->translate( 'You could immediately apply eventual changes or just learn about them.' . ' In case you do not want them to be applied immediately, defining a' . ' job still makes sense. You will be made aware of available changes' . ' in your Director GUI.' ), 'value' => 'n', 'multiOptions' => array( 'y' => $form->translate('Yes'), 'n' => $form->translate('No'), ) )); if ((string) $form->getSentOrObjectValue('job_name') !== '') { if (($ruleId = $form->getSentValue('rule_id')) && array_key_exists($ruleId, $rules)) { $name = sprintf('Sync job: %s', $rules[$ruleId]); $form->getElement('job_name')->setValue($name); ///$form->getObject()->set('job_name', $name); } } return $form; } protected static function enumSyncRules(QuickForm $form) { /** @var DirectorObjectForm $form */ $db = $form->getDb(); $query = $db->select()->from('sync_rule', array('id', 'rule_name'))->order('rule_name'); $res = $db->fetchPairs($query); return array( null => $form->translate('- please choose -'), '__ALL__' => $form->translate('Run all rules at once') ) + $res; } } icingaweb2-module-director-1.11.8/library/Director/KickstartHelper.php000066400000000000000000000324621516513262500257540ustar00rootroot00000000000000 null, 'host' => null, 'port' => null, 'username' => null, 'password' => null, ]; /** * KickstartHelper constructor. * @param Db $db */ public function __construct(Db $db) { $this->db = $db; } /** * Trigger a complete kickstart run */ public function run() { $this->fetchEndpoints() ->reconnectToDeploymentEndpoint() ->fetchZones() ->fetchCommands() ->storeZones() ->storeEndpoints() ->storeCommands() ->removeEndpoints() ->removeZones() ->removeCommands(); $this->apiUser()->store(); } /** * @return bool */ public function isConfigured() { $config = $this->fetchConfigFileSection(); return array_key_exists('endpoint', $config) && array_key_exists('username', $config); } /** * @return KickstartHelper * @throws ProgrammingError */ public function loadConfigFromFile() { return $this->setConfig($this->fetchConfigFileSection()); } /** * @return array */ protected function fetchConfigFileSection() { return Config::module('director', 'kickstart') ->getSection('config') ->toArray(); } /** * @param array $config * @return $this * @throws ProgrammingError */ public function setConfig($config) { foreach ($config as $key => $value) { if ($value === '') { continue; } if (! array_key_exists($key, $this->config)) { throw new ProgrammingError( '"%s" is not a valid config setting for the kickstart helper', $key ); } $this->config[$key] = $value; } return $this; } /** * @return bool */ public function isRequired() { $stats = $this->db->getObjectSummary(); return (int) $stats['apiuser']->cnt_total === 0; } /** * @param $key * @param mixed $default * @return mixed */ protected function getValue($key, $default = null) { if ($this->config[$key] === null) { return $default; } return $this->config[$key]; } /** * @return IcingaApiUser * @throws \Icinga\Exception\NotFoundError */ protected function apiUser() { if ($this->apiUser === null) { $name = $this->getValue('username'); $user = IcingaApiUser::create(array( 'object_name' => $this->getValue('username'), 'object_type' => 'external_object', 'password' => $this->getValue('password') ), $this->db); if (IcingaApiUser::exists($name, $this->db)) { $this->apiUser = IcingaApiUser::load($name, $this->db)->replaceWith($user); } else { $this->apiUser = $user; } $this->apiUser->store(); } return $this->apiUser; } /** * @param IcingaObject[] $objects * @return IcingaObject[] * @throws NestingError */ protected function sortByParent(array $objects) { $sorted = array(); $cnt = 0; while (! empty($objects)) { $cnt++; if ($cnt > 20) { $this->throwObjectLoop($objects); } $unset = array(); foreach ($objects as $key => $object) { $parentName = $object->get('parent'); if ($parentName === null || array_key_exists($parentName, $sorted)) { $sorted[$object->getObjectName()] = $object; $unset[] = $key; } } foreach ($unset as $key) { unset($objects[$key]); } } return $sorted; } /** * @param IcingaObject[] $objects * @throws NestingError */ protected function throwObjectLoop(array $objects) { $names = array(); if (empty($objects)) { $class = 'Nothing'; } else { $class = explode('/\\/', get_class(current($objects)))[0]; } foreach ($objects as $object) { $names[] = $object->getObjectName(); } throw new NestingError( 'Loop detected while resolving %s: %s', $class, implode(', ', $names) ); } /** * @return $this * @throws NestingError * @throws \Icinga\Exception\NotFoundError */ protected function fetchZones() { $db = $this->db; $this->loadedZones = $this->sortByParent( $this->api()->setDb($db)->getZoneObjects() ); return $this; } /** * @return $this * @throws \Icinga\Module\Director\Exception\DuplicateKeyException * @throws \Icinga\Exception\NotFoundError */ protected function storeZones() { $db = $this->db; $existing = IcingaObject::loadAllExternalObjectsByType('zone', $db); foreach ($this->loadedZones as $name => $object) { if (array_key_exists($name, $existing)) { $object = $existing[$name]->replaceWith($object); unset($existing[$name]); } $object->store(); } $this->removeZones = $existing; return $this; } /** * @return $this */ protected function removeZones() { return $this->removeObjects($this->removeZones, 'External Zone'); } /** * @return $this * @throws \Icinga\Module\Director\Exception\DuplicateKeyException * @throws \Icinga\Exception\NotFoundError */ protected function fetchEndpoints() { $db = $this->db; $this->loadedEndpoints = $this->api()->setDb($db)->getEndpointObjects(); $master = $this->getValue('endpoint'); if (array_key_exists($master, $this->loadedEndpoints)) { $apiuser = $this->apiUser(); $apiuser->store(); $object = $this->loadedEndpoints[$master]; $object->apiuser = $apiuser->object_name; $this->deploymentEndpoint = $object; } return $this; } /** * @return $this * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function storeEndpoints() { $db = $this->db; $existing = IcingaObject::loadAllExternalObjectsByType('endpoint', $db); foreach ($this->loadedEndpoints as $name => $object) { if (array_key_exists($name, $existing)) { $object = $existing[$name]->replaceWith($object); unset($existing[$name]); } $object->store(); } $this->removeEndpoints = $existing; $db->settings()->master_zone = $this->deploymentEndpoint->zone; return $this; } /** * @return $this */ protected function removeEndpoints() { return $this->removeObjects($this->removeEndpoints, 'External Endpoint'); } /** * @return $this * @throws ConfigurationError */ protected function reconnectToDeploymentEndpoint() { $master = $this->getValue('endpoint'); if (! $this->deploymentEndpoint) { throw new ConfigurationError( 'I found no Endpoint object called "%s" on %s:%d', $master, $this->getHost(), $this->getPort() ); } $ep = $this->deploymentEndpoint; $epHost = $ep->get('host'); if (! $epHost) { $epHost = $ep->getObjectName(); } try { $this->switchToDeploymentApi()->getStatus(); } catch (Exception $e) { throw new ConfigurationError( 'I was unable to re-establish a connection to the Endpoint "%s" (%s:%d).' . ' When reconnecting to the configured Endpoint (%s:%d) I get an error: %s' . ' Please re-check your Icinga 2 endpoint configuration', $master, $this->getHost(), $this->getPort(), $epHost, $ep->get('port'), $e->getMessage() ); } return $this; } /** * @return $this * @throws \Icinga\Exception\NotFoundError */ protected function fetchCommands() { $api = $this->api()->setDb($this->db); $this->loadedCommands = array_merge( $api->getSpecificCommandObjects('Check'), $api->getSpecificCommandObjects('Notification'), $api->getSpecificCommandObjects('Event') ); return $this; } /** * @return $this * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function storeCommands() { $db = $this->db; $existing = IcingaObject::loadAllExternalObjectsByType('command', $db); foreach ($this->loadedCommands as $name => $object) { if (array_key_exists($name, $existing)) { $object = $existing[$name]->replaceWith($object); unset($existing[$name]); } $object->store(); } $this->removeCommands = $existing; return $this; } /** * @return $this */ protected function removeCommands() { return $this->removeObjects($this->removeCommands, 'External Command'); } protected function removeObjects(array $objects, $typeName) { foreach ($objects as $object) { try { $object->delete(); } catch (Exception $e) { throw new RuntimeException(sprintf( "Failed to remove %s '%s', it might still be in use", $typeName, $object->getObjectName() ), 0, $e); } } return $this; } /** * @param Db $db * @return $this */ public function setDb(Db $db) { $this->db = $db; return $this; } /** * @return string */ protected function getHost() { return $this->getValue('host', $this->getValue('endpoint')); } /** * @return int */ protected function getPort() { return (int) $this->getValue('port', 5665); } /** * @return CoreApi * @throws \Icinga\Exception\NotFoundError */ protected function getDeploymentApi() { unset($this->api); $ep = $this->deploymentEndpoint; $epHost = $ep->get('host'); if (!$epHost) { $epHost = $ep->object_name; } $client = new RestApiClient( $epHost, $ep->get('port') ); $apiuser = $this->apiUser(); $client->setCredentials($apiuser->object_name, $apiuser->password); $api = new CoreApi($client); $api->setDb($this->db); return $api; } /** * @return CoreApi * @throws \Icinga\Exception\NotFoundError */ protected function getConfiguredApi() { unset($this->api); $client = new RestApiClient( $this->getHost(), $this->getPort() ); $apiuser = $this->apiUser(); $client->setCredentials($apiuser->object_name, $apiuser->password); $api = new CoreApi($client); $api->setDb($this->db); return $api; } /** * @return CoreApi * @throws \Icinga\Exception\NotFoundError */ protected function switchToDeploymentApi() { return $this->api = $this->getDeploymentApi(); } /** * @return CoreApi * @throws \Icinga\Exception\NotFoundError */ protected function api() { if ($this->api === null) { $this->api = $this->getConfiguredApi(); } return $this->api; } } icingaweb2-module-director-1.11.8/library/Director/Objects/000077500000000000000000000000001516513262500235265ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Objects/DirectorActivityLog.php000066400000000000000000000157401516513262500302000ustar00rootroot00000000000000 null, 'object_name' => null, 'action_name' => null, 'object_type' => null, 'old_properties' => null, 'new_properties' => null, 'author' => null, 'change_time' => null, 'checksum' => null, 'parent_checksum' => null, ]; protected $binaryProperties = [ 'checksum', 'parent_checksum' ]; /** @var ?string */ protected static $overriddenUsername = null; /** * @param $name * * @codingStandardsIgnoreStart * * @return self */ protected function setObject_Name($name) { // @codingStandardsIgnoreEnd if ($name === null) { $name = ''; } return $this->reallySet('object_name', $name); } public static function username() { if (self::$overriddenUsername) { return self::$overriddenUsername; } if (Icinga::app()->isCli()) { return 'cli'; } $auth = Auth::getInstance(); if ($auth->isAuthenticated()) { return $auth->getUser()->getUsername(); } elseif (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) { return '<' . $_SERVER['HTTP_X_FORWARDED_FOR'] . '>'; } elseif (array_key_exists('REMOTE_ADDR', $_SERVER)) { return '<' . $_SERVER['REMOTE_ADDR'] . '>'; } else { return ''; } } protected static function ip() { if (Icinga::app()->isCli()) { return 'cli'; } if (array_key_exists('REMOTE_ADDR', $_SERVER)) { return $_SERVER['REMOTE_ADDR']; } else { return '0.0.0.0'; } } /** * @param Db $connection * @return DirectorActivityLog * @throws \Icinga\Exception\NotFoundError */ public static function loadLatest(Db $connection) { $db = $connection->getDbAdapter(); $query = $db->select()->from('director_activity_log', ['id' => 'MAX(id)']); return static::load($db->fetchOne($query), $connection); } public static function logCreation(IcingaObject $object, Db $db) { // TODO: extend this to support non-IcingaObjects and multikey objects $name = $object->getObjectName(); $type = $object->getTableName(); $newProps = $object->toJson(null, true); $data = [ 'object_name' => $name, 'action_name' => self::ACTION_CREATE, 'author' => static::username(), 'object_type' => $type, 'new_properties' => $newProps, 'change_time' => date('Y-m-d H:i:s'), 'parent_checksum' => $db->getLastActivityChecksum() ]; $data['checksum'] = sha1(json_encode($data), true); $data['parent_checksum'] = hex2bin($data['parent_checksum']); static::audit($db, [ 'action' => self::ACTION_CREATE, 'object_type' => $type, 'object_name' => $name, 'new_props' => $newProps, ]); return static::create($data)->store($db); } public static function logModification(IcingaObject $object, Db $db) { $name = $object->getObjectName(); $type = $object->getTableName(); $oldProps = json_encode($object->getPlainUnmodifiedObject()); $newProps = $object->toJson(null, true); $data = [ 'object_name' => $name, 'action_name' => self::ACTION_MODIFY, 'author' => static::username(), 'object_type' => $type, 'old_properties' => $oldProps, 'new_properties' => $newProps, 'change_time' => date('Y-m-d H:i:s'), 'parent_checksum' => $db->getLastActivityChecksum() ]; $data['checksum'] = sha1(json_encode($data), true); $data['parent_checksum'] = hex2bin($data['parent_checksum']); static::audit($db, [ 'action' => self::ACTION_MODIFY, 'object_type' => $type, 'object_name' => $name, 'old_props' => $oldProps, 'new_props' => $newProps, ]); return static::create($data)->store($db); } public static function logRemoval(IcingaObject $object, Db $db) { $name = $object->getObjectName(); $type = $object->getTableName(); /** @var stdClass $plainUnmodifiedObject */ $plainUnmodifiedObject = $object->getPlainUnmodifiedObject(); if ($object instanceof IcingaServiceSet) { $services = []; foreach ($object->getCachedServices() as $service) { $services[$service->getObjectName()] = $service->toPlainObject(); } $plainUnmodifiedObject->services = $services; } $oldProps = json_encode($plainUnmodifiedObject); $data = [ 'object_name' => $name, 'action_name' => self::ACTION_DELETE, 'author' => static::username(), 'object_type' => $type, 'old_properties' => $oldProps, 'change_time' => date('Y-m-d H:i:s'), 'parent_checksum' => $db->getLastActivityChecksum() ]; $data['checksum'] = sha1(json_encode($data), true); $data['parent_checksum'] = hex2bin($data['parent_checksum']); static::audit($db, [ 'action' => self::AUDIT_REMOVE, 'object_type' => $type, 'object_name' => $name, 'old_props' => $oldProps ]); return static::create($data)->store($db); } public static function audit(Db $db, $properties) { if ($db->settings()->get('enable_audit_log') !== 'y') { return; } $log = []; $properties = array_merge([ 'username' => static::username(), 'address' => static::ip(), ], $properties); foreach ($properties as $key => $val) { $log[] = "$key=" . json_encode($val); } Logger::info('(director) ' . implode(' ', $log)); } public static function overrideUsername($username) { self::$overriddenUsername = $username; } public static function restoreUsername() { self::$overriddenUsername = null; } } icingaweb2-module-director-1.11.8/library/Director/Objects/DirectorDatafield.php000066400000000000000000000235071516513262500276170ustar00rootroot00000000000000 null, 'uuid' => null, 'category_id' => null, 'varname' => null, 'caption' => null, 'description' => null, 'datatype' => null, 'format' => null, ]; protected $relations = [ 'category' => 'DirectorDatafieldCategory' ]; /** @var ?DirectorDatafieldCategory */ private $category; private $object; public static function fromDbRow($row, Db $connection) { $obj = static::create((array) $row, $connection); $obj->loadedFromDb = true; // TODO: $obj->setUnmodified(); $obj->hasBeenModified = false; $obj->modifiedProperties = array(); $settings = $obj->getSettings(); // TODO: eventually prefetch $obj->onLoadFromDb(); // Restoring values eventually destroyed by onLoadFromDb foreach ($settings as $key => $value) { $obj->settings[$key] = $value; } return $obj; } public function hasCategory() { return $this->category !== null || $this->get('category_id') !== null; } /** * @throws \Icinga\Exception\NotFoundError */ public function getCategory(): ?DirectorDatafieldCategory { if ($this->category) { return $this->category; } elseif ($id = $this->get('category_id')) { $this->category = DirectorDatafieldCategory::loadWithAutoIncId($id, $this->getConnection()); return $this->category; } else { return null; } } public function getCategoryName(): ?string { $category = $this->getCategory(); if ($category === null) { return null; } else { return $category->get('category_name'); } } public function setCategory($category) { if ($category === null) { $this->category = null; $this->set('category_id', null); } elseif ($category instanceof DirectorDatafieldCategory) { if ($category->hasBeenLoadedFromDb()) { $this->set('category_id', $category->get('id')); } $this->category = $category; } else { if ($category = DirectorDatafieldCategory::loadOptional($category, $this->getConnection())) { $this->setCategory($category); } else { $this->setCategory(DirectorDatafieldCategory::create([ 'category_name' => $category ], $this->getConnection())); } } } /** * @throws \Icinga\Exception\NotFoundError */ public function export(): stdClass { $plain = (object) $this->getProperties(); unset($plain->id); if ($uuid = $this->get('uuid')) { $plain->uuid = Uuid::fromBytes($uuid)->toString(); } $plain->settings = (object) $this->getSettings(); if (property_exists($plain->settings, 'datalist_id')) { $plain->settings->datalist = DirectorDatalist::loadWithAutoIncId( $plain->settings->datalist_id, $this->getConnection() )->get('list_name'); unset($plain->settings->datalist_id); } if (property_exists($plain, 'category_id')) { $plain->category = $this->getCategoryName(); unset($plain->category_id); } return $plain; } /** * @throws \Icinga\Exception\NotFoundError */ public static function import(stdClass $plain, Db $db): DirectorDatafield { $dba = $db->getDbAdapter(); if ($uuid = $plain->uuid ?? null) { $uuid = Uuid::fromString($uuid); if ($candidate = DirectorDatafield::loadWithUniqueId($uuid, $db)) { BasketSnapshotFieldResolver::fixOptionalDatalistReference($plain, $db); assert($candidate instanceof DirectorDatafield); $candidate->setProperties((array) $plain); return $candidate; } } $query = $dba->select()->from('director_datafield')->where('varname = ?', $plain->varname); $candidates = DirectorDatafield::loadAll($db, $query); foreach ($candidates as $candidate) { $export = $candidate->export(); CompareBasketObject::normalize($export); unset($export->uuid); unset($plain->originalId); if (CompareBasketObject::equals($export, $plain)) { return $candidate; } } BasketSnapshotFieldResolver::fixOptionalDatalistReference($plain, $db); return static::create((array) $plain, $db); } protected function beforeStore() { if ($this->category) { if (!$this->category->hasBeenLoadedFromDb()) { throw new \RuntimeException('Trying to store a datafield with an unstored Category'); } $this->set('category_id', $this->category->get('id')); } } protected function setObject(IcingaObject $object) { $this->object = $object; } protected function getObject() { return $this->object; } public function getFormElement(DirectorObjectForm $form, $name = null): ?ZfElement { $className = $this->get('datatype'); if ($name === null) { $name = 'var_' . $this->get('varname'); } if (! class_exists($className)) { $form->addElement('text', $name, array('disabled' => 'disabled')); $el = $form->getElement($name); $msg = $form->translate('Form element could not be created, %s is missing'); $el->addError(sprintf($msg, $className)); return $el; } /** @var DataTypeHook $dataType */ $dataType = new $className(); $dataType->setSettings($this->getSettings()); $el = $dataType->getFormElement($name, $form); if ( $this->getSetting('icinga_type') !== 'command' && $this->getSetting('is_required') === 'y' ) { $el->setRequired(true); } if ($caption = $this->get('caption')) { $el->setLabel($caption); } if ($description = $this->get('description')) { $el->setDescription($description); } $this->applyObjectData($el, $form); return $el; } protected function applyObjectData(ZfElement $el, DirectorObjectForm $form) { $object = $form->getObject(); if (! ($object instanceof IcingaObject)) { return; } if ($object->isTemplate()) { $el->setRequired(false); } $varName = $this->get('varname'); $inherited = $origin = null; if ($form instanceof IcingaServiceForm && $form->providesOverrides()) { $resolver = new OverriddenVarsResolver($form->getDb()); $vars = $resolver->fetchForServiceName($form->getHost(), $object->getObjectName()); foreach ($vars as $host => $values) { if (\property_exists($values, $varName)) { $inherited = $values->$varName; $origin = $host; } } } if ($inherited === null) { $inherited = $object->getInheritedVar($varName); if (null !== $inherited) { $origin = $object->getOriginForVar($varName); } } if ($inherited === null) { $cmd = $this->eventuallyGetResolvedCommandVar($object, $varName); if ($cmd !== null) { list($inherited, $origin) = $cmd; } } if ($inherited !== null) { $form->setInheritedValue($el, $inherited, $origin); } } protected function eventuallyGetResolvedCommandVar(IcingaObject $object, $varName): ?array { if (! $object->hasRelation('check_command')) { return null; } // TODO: Move all of this elsewhere and test it try { /** @var IcingaCommand $command */ $command = $object->getResolvedRelated('check_command'); if ($command === null) { return null; } $inherited = $command->vars()->get($varName); $inheritedFrom = null; if ($inherited !== null) { $inherited = $inherited->getValue(); } if ($inherited === null) { $inherited = $command->getResolvedVar($varName); if ($inherited === null) { $inheritedFrom = $command->getOriginForVar($varName); } } else { $inheritedFrom = $command->getObjectName(); } $inherited = $command->getResolvedVar($varName); return [$inherited, $inheritedFrom]; } catch (\Exception $e) { return null; } } } icingaweb2-module-director-1.11.8/library/Director/Objects/DirectorDatafieldCategory.php000066400000000000000000000031651516513262500313130ustar00rootroot00000000000000 null, 'category_name' => null, 'description' => null, ]; /** * @deprecated please use \Icinga\Module\Director\Data\Exporter * @return object */ public function export() { $plain = (object) $this->getProperties(); $plain->originalId = $plain->id; unset($plain->id); return $plain; } /** * @param $plain * @param Db $db * @param bool $replace * @return static * @throws DuplicateKeyException * @throws \Icinga\Exception\NotFoundError */ public static function import($plain, Db $db, $replace = false) { $properties = (array) $plain; unset($properties['originalId']); $key = $properties['category_name']; if ($replace && static::exists($key, $db)) { $object = static::load($key, $db); } elseif (static::exists($key, $db)) { throw new DuplicateKeyException( 'Cannot import, DatafieldCategory "%s" already exists', $key ); } else { $object = static::create([], $db); } $object->setProperties($properties); return $object; } } icingaweb2-module-director-1.11.8/library/Director/Objects/DirectorDatalist.php000066400000000000000000000112121516513262500274750ustar00rootroot00000000000000 null, 'uuid' => null, 'list_name' => null, 'owner' => null ]; /** @var DirectorDatalistEntry[] */ protected $entries; public function getUniqueIdentifier() { return $this->get('list_name'); } public function setEntries($entries): void { $existing = $this->getEntries(); $new = []; $seen = []; $modified = false; foreach ($entries as $entry) { $name = $entry->entry_name; $entry = DirectorDatalistEntry::create((array) $entry); $seen[$name] = true; if (isset($existing[$name])) { $existing[$name]->replaceWith($entry); if (! $modified && $existing[$name]->hasBeenModified()) { $modified = true; } } else { $modified = true; $new[] = $entry; } } foreach (array_keys($existing) as $key) { if (! isset($seen[$key])) { $existing[$key]->markForRemoval(); $modified = true; } } foreach ($new as $entry) { $existing[$entry->get('entry_name')] = $entry; } if ($modified) { $this->hasBeenModified = true; } $this->entries = $existing; ksort($this->entries); } protected function beforeDelete() { if ($this->isInUse()) { throw new Exception( sprintf( "Cannot delete '%s', as the datalist '%s' is currently being used.", $this->get('list_name'), $this->get('list_name') ) ); } } protected function isInUse(): bool { $id = $this->get('id'); if ($id === null) { return false; } $db = $this->getDb(); if ($this->getConnection()->getDbType() === 'pgsql') { $datalistJoin = 'l.id = CAST(dfs.setting_value AS INTEGER)'; } else { $datalistJoin = 'l.id = dfs.setting_value'; } $dataFieldsCheck = $db->select() ->from(['df' => 'director_datafield'], ['varname']) ->join( ['dfs' => 'director_datafield_setting'], 'dfs.datafield_id = df.id AND dfs.setting_name = \'datalist_id\'', [] ) ->join( ['l' => 'director_datalist'], $datalistJoin, [] ) ->where('datatype = ?', DataTypeDatalist::class) ->where('setting_value = ?', $id); if ($db->fetchOne($dataFieldsCheck)) { return true; } $syncCheck = $db->select() ->from(['sp' => 'sync_property'], ['source_expression']) ->where('sp.destination_field = ?', 'list_id') ->where('sp.source_expression = ?', $id); if ($db->fetchOne($syncCheck)) { return true; } return false; } /** * @throws DuplicateKeyException */ public function onStore() { if ($this->entries) { $db = $this->getConnection(); $removedKeys = []; $myId = $this->get('id'); foreach ($this->entries as $key => $entry) { if ($entry->shouldBeRemoved()) { $entry->delete(); $removedKeys[] = $key; } else { $entry->set('list_id', $myId); $entry->store($db); } } foreach ($removedKeys as $key) { unset($this->entries[$key]); } } } public function getEntries(): array { if ($this->entries === null) { if ($this->get('id')) { $this->entries = DirectorDatalistEntry::loadAllForList($this); ksort($this->entries); } else { $this->entries = []; } } return $this->entries; } } icingaweb2-module-director-1.11.8/library/Director/Objects/DirectorDatalistEntry.php000066400000000000000000000050321516513262500305220ustar00rootroot00000000000000 null, 'entry_name' => null, 'entry_value' => null, 'format' => null, 'allowed_roles' => null, ]; /** * @param DirectorDatalist $list * @return static[] */ public static function loadAllForList(DirectorDatalist $list) { $query = $list->getDb() ->select() ->from('director_datalist_entry') ->where('list_id = ?', $list->get('id')) ->order('entry_name ASC'); return static::loadAll($list->getConnection(), $query, 'entry_name'); } /** * @param $roles * @codingStandardsIgnoreStart */ public function setAllowed_roles($roles) { // @codingStandardsIgnoreEnd $key = 'allowed_roles'; if (is_array($roles)) { $this->reallySet($key, json_encode($roles)); } elseif (null === $roles) { $this->reallySet($key, null); } else { throw new RuntimeException( 'Expected array or null for allowed_roles, got %s', var_export($roles, true) ); } } /** * @return array|null * @codingStandardsIgnoreStart */ public function getAllowed_roles() { // @codingStandardsIgnoreEnd $roles = $this->getProperty('allowed_roles'); if (is_string($roles)) { return json_decode($roles); } else { return $roles; } } public function replaceWith(DirectorDatalistEntry $object) { $this->set('entry_value', $object->get('entry_value')); if ($object->get('format')) { $this->set('format', $object->get('format')); } return $this; } public function merge(DirectorDatalistEntry $object) { return $this->replaceWith($object); } public function markForRemoval($remove = true) { $this->shouldBeRemoved = $remove; return $this; } public function shouldBeRemoved() { return $this->shouldBeRemoved; } public function onInsert() { } public function onUpdate() { } public function onDelete() { } } icingaweb2-module-director-1.11.8/library/Director/Objects/DirectorDeploymentLog.php000066400000000000000000000126711516513262500305240ustar00rootroot00000000000000 null, 'config_checksum' => null, 'last_activity_checksum' => null, 'peer_identity' => null, 'start_time' => null, 'end_time' => null, 'abort_time' => null, 'duration_connection' => null, 'duration_dump' => null, 'stage_name' => null, 'stage_collected' => null, 'connection_succeeded' => null, 'dump_succeeded' => null, 'startup_succeeded' => null, 'username' => null, 'startup_log' => null, ]; protected $binaryProperties = [ 'config_checksum', 'last_activity_checksum' ]; public function getConfigHexChecksum() { $checksum = $this->get('config_checksum'); if ($checksum === null) { return null; } return bin2hex($checksum); } public function getConfig() { if ($this->config === null) { $this->config = IcingaConfig::load($this->config_checksum, $this->connection); } return $this->config; } public function isPending() { return $this->stage_collected === null; } public function succeeded() { return $this->startup_succeeded === 'y'; } public function configEquals(IcingaConfig $config) { return $this->config_checksum === $config->getChecksum(); } public function getDeploymentTimestamp() { return strtotime($this->start_time); } public static function hasDeployments(Db $connection) { $db = $connection->getDbAdapter(); $query = $db->select()->from( 'director_deployment_log', array('c' => 'COUNT(*)') ); return (int) $db->fetchOne($query) > 0; } public static function getConfigChecksumForStageName(Db $connection, $stage) { if ($stage === null) { return null; } $db = $connection->getDbAdapter(); $query = $db->select() ->from( array('l' => 'director_deployment_log'), array('c' => $connection->dbHexFunc('l.config_checksum')) )->where('l.stage_name = ?'); return $db->fetchOne($query, $stage); } /** * @param Db $connection * @return DirectorDeploymentLog * @throws NotFoundError */ public static function loadLatest(Db $connection) { $db = $connection->getDbAdapter(); $query = $db->select()->from( array('l' => 'director_deployment_log'), array('id' => 'MAX(l.id)') ); return static::load($db->fetchOne($query), $connection); } /** * @param Db $connection * @return ?DirectorDeploymentLog */ public static function optionalLatest(Db $connection) { try { return static::loadLatest($connection); } catch (NotFoundError $exception) { return null; } } /** * @param CoreApi $api * @param Db $connection * @return DirectorDeploymentLog */ public static function getRelatedToActiveStage(CoreApi $api, Db $connection) { try { return static::requireRelatedToActiveStage($api, $connection); } catch (Exception $e) { return null; } } /** * @param CoreApi $api * @param Db $connection * @return DirectorDeploymentLog * @throws NotFoundError */ public static function requireRelatedToActiveStage(CoreApi $api, Db $connection) { $stage = $api->getActiveStageName(); if (! strlen($stage)) { throw new NotFoundError('Got no active stage name'); } $db = $connection->getDbAdapter(); $query = $db->select()->from( ['l' => 'director_deployment_log'], ['id' => 'MAX(l.id)'] )->where('l.stage_name = ?', $stage); return static::load($db->fetchOne($query), $connection); } /** * @return static[] */ public static function getUncollected(Db $connection) { $db = $connection->getDbAdapter(); $query = $db->select() ->from('director_deployment_log') ->where('stage_name IS NOT NULL') ->where('stage_collected IS NULL') ->where('startup_succeeded IS NULL') ->order('stage_name'); return static::loadAll($connection, $query, 'stage_name'); } public static function hasUncollected(Db $connection) { $db = $connection->getDbAdapter(); $query = $db->select() ->from('director_deployment_log', ['cnt' => 'COUNT(*)']) ->where('stage_name IS NOT NULL') ->where('stage_collected IS NULL') ->where('startup_succeeded IS NULL'); return $db->fetchOne($query) > 0; } } icingaweb2-module-director-1.11.8/library/Director/Objects/DirectorJob.php000066400000000000000000000140071516513262500264470ustar00rootroot00000000000000 null, 'job_name' => null, 'job_class' => null, 'disabled' => null, 'run_interval' => null, 'last_attempt_succeeded' => null, 'ts_last_attempt' => null, 'ts_last_error' => null, 'last_error_message' => null, 'timeperiod_id' => null, ]; protected $stateProperties = [ 'last_attempt_succeeded', 'last_error_message', 'ts_last_attempt', 'ts_last_error', ]; protected $settingsTable = 'director_job_setting'; protected $settingsRemoteId = 'job_id'; public function getUniqueIdentifier() { return $this->get('job_name'); } /** * @deprecated please use JobHook::getInstance() * @return JobHook */ public function job() { return $this->getInstance(); } /** * @return JobHook */ public function getInstance() { if ($this->job === null) { $class = $this->get('job_class'); $this->job = new $class(); $this->job->setDb($this->connection); $this->job->setDefinition($this); } return $this->job; } /** * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function run() { $job = $this->getInstance(); $currentTimestamp = DaemonUtil::timestampWithMilliseconds(); $this->set('ts_last_attempt', $currentTimestamp); try { $job->run(); $this->set('last_attempt_succeeded', 'y'); $success = true; } catch (Exception $e) { Logger::error($e->getMessage()); $this->set('ts_last_error', $currentTimestamp); $this->set('last_error_message', $e->getMessage()); $this->set('last_attempt_succeeded', 'n'); $success = false; } if ($this->hasBeenModified()) { $this->store(); } return $success; } /** * @return bool */ public function shouldRun() { return (! $this->hasBeenDisabled()) && $this->isPending(); } /** * @return bool */ public function isOverdue() { if (! $this->shouldRun()) { return false; } if ($this->get('ts_last_attempt') === null) { return true; } return ( $this->get('ts_last_attempt') + $this->get('run_interval') * 2 * 1000 ) < DaemonUtil::timestampWithMilliseconds(); } public function hasBeenDisabled() { return $this->get('disabled') === 'y'; } /** * @return bool */ public function isPending() { if ($this->get('ts_last_attempt') === null) { return $this->isWithinTimeperiod(); } if ( $this->get('ts_last_attempt') + $this->get('run_interval') * 1000 < DaemonUtil::timestampWithMilliseconds() ) { return $this->isWithinTimeperiod(); } return false; } /** * @return bool */ public function isWithinTimeperiod() { if ($this->hasTimeperiod()) { return $this->timeperiod()->isActive(); } else { return true; } } public function lastAttemptSucceeded() { return $this->get('last_attempt_succeeded') === 'y'; } public function lastAttemptFailed() { return $this->get('last_attempt_succeeded') === 'n'; } public function hasTimeperiod() { return $this->get('timeperiod_id') !== null; } /** * @param $timeperiod * @return $this * @throws \Icinga\Exception\NotFoundError */ public function setTimeperiod($timeperiod) { if (is_string($timeperiod)) { $timeperiod = IcingaTimePeriod::load($timeperiod, $this->connection); } elseif (! $timeperiod instanceof IcingaTimePeriod) { throw new InvalidArgumentException('TimePeriod expected'); } $this->set('timeperiod_id', $timeperiod->get('id')); return $this; } /** * @param string $name * @param int $id * @param Db $connection * @api internal * @return bool */ protected static function existsWithNameAndId($name, $id, Db $connection) { $db = $connection->getDbAdapter(); $dummy = new static(); $idCol = $dummy->autoincKeyName; $keyCol = $dummy->keyName; return (string) $id === (string) $db->fetchOne( $db->select() ->from($dummy->table, $idCol) ->where("$idCol = ?", $id) ->where("$keyCol = ?", $name) ); } /** * @api internal Exporter only * @return IcingaTimePeriod */ public function timeperiod() { try { return IcingaTimePeriod::loadWithAutoIncId($this->get('timeperiod_id'), $this->connection); } catch (NotFoundError $e) { throw new \RuntimeException(sprintf( 'The TimePeriod configured for Job "%s" could not have been found', $this->get('name') )); } } } icingaweb2-module-director-1.11.8/library/Director/Objects/DynamicApplyMatches.php000066400000000000000000000004001516513262500301300ustar00rootroot00000000000000arguments === null) { if ($this->hasBeenLoadedFromDb()) { $this->arguments = IcingaArguments::loadForStoredObject($this); } else { $this->arguments = new IcingaArguments($this); } } return $this->arguments; } public function gotArguments() { return null !== $this->arguments; } public function unsetArguments() { unset($this->arguments); } /** * @return string */ protected function renderArguments() { return $this->arguments()->toConfigString(); } /** * @param $value * @return $this */ protected function setArguments($value) { $this->arguments()->setArguments($value); return $this; } /** * @return array */ protected function getArguments() { return $this->arguments()->toPlainObject(); } } icingaweb2-module-director-1.11.8/library/Director/Objects/Extension/FlappingSupport.php000066400000000000000000000027601516513262500313550ustar00rootroot00000000000000renderFlappingThreshold('flapping_threshold_high', $value); } /** * @param $value * @return string */ protected function renderFlapping_threshold_low($value) { return $this->renderFlappingThreshold('flapping_threshold_low', $value); } protected function renderFlappingThreshold($key, $value) { return sprintf( " try { // This setting is only available in Icinga >= 2.8.0\n" . " %s" . " } except { globals.directorWarnOnceForThresholds() }\n", c::renderKeyValue($key, c::renderFloat($value)) ); } protected function renderLegacyEnable_flapping($value) { return c1::renderKeyValue('flap_detection_enabled', c1::renderBoolean($value)); } protected function renderLegacyFlapping_threshold_high($value) { return c1::renderKeyValue('high_flap_threshold', $value); } protected function renderLegacyFlapping_threshold_low($value) { // @codingStandardsIgnoreEnd return c1::renderKeyValue('low_flap_threshold', $value); } } icingaweb2-module-director-1.11.8/library/Director/Objects/Extension/PriorityColumn.php000066400000000000000000000022561516513262500312170ustar00rootroot00000000000000getDb(); $prioValue = '(CASE WHEN MAX(priosub.priority) IS NULL THEN 1' . ' ELSE MAX(priosub.priority) + 1 END)'; $query = $db->select() ->from( ['priosub' => $this->getTableName()], "$prioValue" ); if ($prioSetColumn !== null) { $query->where("priosub.$prioSetColumn = ?", $this->get($prioSetColumn)); } $this->set($prioColumn, new Expr('(' . $query . ')')); return $this; } protected function refreshPriortyProperty($prioColumn = 'priority') { /** @var \Zend_Db_Adapter_Abstract $db */ $db = $this->getDb(); $idCol = $this->getAutoincKeyName(); $query = $db->select() ->from($this->getTableName(), $prioColumn) ->where("$idCol = ?", $this->get($idCol)); $this->reallySet($prioColumn, $db->fetchOne($query)); } } icingaweb2-module-director-1.11.8/library/Director/Objects/GroupMembershipResolver.php000066400000000000000000000415631516513262500311020ustar00rootroot00000000000000connection = $connection; $this->db = $connection->getDbAdapter(); } /** * @return $this * @throws \Zend_Db_Adapter_Exception */ public function refreshAllMappings() { return $this->clearGroups()->clearObjects()->refreshDb(true); } public function checkDb() { if ($this->checked) { return $this; } if ($this->isDeferred()) { // ensure we are not working with cached data IcingaTemplateRepository::clear(); } Benchmark::measure('Rechecking all objects'); $this->recheckAllObjects($this->getAppliedGroups()); if (empty($this->objects) && empty($this->groups)) { Benchmark::measure('Nothing to check, got no qualified object'); return $this; } Benchmark::measure('Recheck done, loading existing mappings'); $this->fetchStoredMappings(); Benchmark::measure('Got stored group mappings'); $this->checked = true; return $this; } /** * @param bool $force * @return $this * @throws \Zend_Db_Adapter_Exception */ public function refreshDb($force = false) { if ($force || ! $this->isDeferred()) { $this->checkDb(); if (empty($this->objects) && empty($this->groups)) { Benchmark::measure('Nothing to check, got no qualified object'); return $this; } Benchmark::measure('Ready, going to store new mappings'); $this->storeNewMappings(); $this->removeOutdatedMappings(); Benchmark::measure('Updated group mappings in db'); } return $this; } /** * @param bool $defer * @return $this */ public function defer($defer = true) { $this->deferred = $defer; return $this; } /** * @param $use * @return $this */ public function setUseTransactions($use) { $this->useTransactions = $use; return $this; } public function getType() { if ($this->type === null) { throw new LogicException(sprintf( '"type" is required when extending %s, got none in %s', __CLASS__, get_class($this) )); } return $this->type; } /** * @return bool */ public function isDeferred() { return $this->deferred; } /** * @param IcingaObject $object * @return $this */ public function addObject(IcingaObject $object) { // Hint: cannot use hasBeenLoadedFromDB, as it is false in onStore() // for new objects if (null === ($id = $object->get('id'))) { return $this; } // Disabling for now, how should this work? // $this->assertBeenLoadedFromDb($object); if ($this->objects === null) { $this->objects = []; } if ($object->isTemplate()) { $this->includeChildObjects($object); } else { $this->objects[$id] = $object; } return $this; } /** * @param IcingaObject[] $objects * @return $this */ public function addObjects(array $objects) { foreach ($objects as $object) { $this->addObject($object); } return $this; } protected function includeChildObjects(IcingaObject $object) { $query = $this->db->select() ->from(['o' => $object->getTableName()]) ->where('o.object_type = ?', 'object'); IcingaObjectFilterHelper::filterByTemplate( $query, $object, 'o', IcingaObjectFilterHelper::INHERIT_DIRECT_OR_INDIRECT ); foreach ($object::loadAll($this->connection, $query) as $child) { $this->objects[$child->getProperty('id')] = $child; } return $this; } /** * @param IcingaObject $object * @return $this */ public function setObject(IcingaObject $object) { $this->clearObjects(); return $this->addObject($object); } /** * @param IcingaObject[] $objects * @return $this */ public function setObjects(array $objects) { $this->clearObjects(); return $this->addObjects($objects); } /** * @return $this */ public function clearObjects() { $this->objects = array(); return $this; } /** * @param IcingaObjectGroup $group * @return $this */ public function addGroup(IcingaObjectGroup $group) { $this->assertBeenLoadedFromDb($group); $this->groups[$group->get('id')] = $group; $this->checked = false; return $this; } /** * @param IcingaObjectGroup[] $groups * @return $this */ public function addGroups(array $groups) { foreach ($groups as $group) { $this->addGroup($group); } $this->checked = false; return $this; } /** * @param IcingaObjectGroup $group * @return $this */ public function setGroup(IcingaObjectGroup $group) { $this->clearGroups(); return $this->addGroup($group); } /** * @param array $groups * @return $this */ public function setGroups(array $groups) { $this->clearGroups(); return $this->addGroups($groups); } /** * @return $this */ public function clearGroups() { $this->objects = array(); $this->checked = false; return $this; } public function getNewMappings() { if ($this->newMappings !== null && $this->existingMappings !== null) { return $this->getDifference($this->newMappings, $this->existingMappings); } else { return []; } } /** * @throws \Zend_Db_Adapter_Exception */ protected function storeNewMappings() { $diff = $this->getNewMappings(); $count = count($diff); if ($count === 0) { return; } $db = $this->db; $this->beginTransaction(); foreach ($diff as $row) { $db->insert( $this->getResolvedTableName(), $row ); } $this->commit(); Benchmark::measure( sprintf( 'Stored %d new resolved group memberships', $count ) ); } protected function getGroupId($name) { $type = $this->type; if ($this->groupMap === null) { $this->groupMap = $this->db->fetchPairs( $this->db->select()->from("icinga_{$type}group", ['object_name', 'id']) ); } if (array_key_exists($name, $this->groupMap)) { return $this->groupMap[$name]; } else { throw new InvalidArgumentException(sprintf( 'Unable to lookup the group name for "%s"', $name )); } } public function getOutdatedMappings() { if ($this->newMappings !== null && $this->existingMappings !== null) { return $this->getDifference($this->existingMappings, $this->newMappings); } else { return []; } } protected function removeOutdatedMappings() { $diff = $this->getOutdatedMappings(); $count = count($diff); if ($count === 0) { return; } $type = $this->getType(); $db = $this->db; $this->beginTransaction(); foreach ($diff as $row) { $db->delete( $this->getResolvedTableName(), sprintf( "({$type}group_id = %d AND {$type}_id = %d)", $row["{$type}group_id"], $row["{$type}_id"] ) ); } $this->commit(); Benchmark::measure( sprintf( 'Removed %d outdated group memberships', $count ) ); } protected function getDifference(&$left, &$right) { $diff = array(); $type = $this->getType(); foreach ($left as $groupId => $objectIds) { if (array_key_exists($groupId, $right)) { foreach ($objectIds as $objectId) { if (! array_key_exists($objectId, $right[$groupId])) { $diff[] = array( "{$type}group_id" => $groupId, "{$type}_id" => $objectId, ); } } } else { foreach ($objectIds as $objectId) { $diff[] = array( "{$type}group_id" => $groupId, "{$type}_id" => $objectId, ); } } } return $diff; } /** * This fetches already resolved memberships */ protected function fetchStoredMappings() { $mappings = array(); $type = $this->getType(); $query = $this->db->select()->from( array('hgh' => $this->getResolvedTableName()), array( 'group_id' => "{$type}group_id", 'object_id' => "{$type}_id", ) ); $this->addMembershipWhere($query, "{$type}_id", $this->objects); $this->addMembershipWhere($query, "{$type}group_id", $this->groups); if (! empty($this->groups)) { // load staticGroups (we touched here) additionally, so we can compare changes $this->addMembershipWhere($query, "{$type}group_id", $this->staticGroups); } foreach ($this->db->fetchAll($query) as $row) { $groupId = $row->group_id; $objectId = $row->object_id; if (! array_key_exists($groupId, $mappings)) { $mappings[$groupId] = array(); } $mappings[$groupId][$objectId] = $objectId; } $this->existingMappings = $mappings; } /** * @param ZfSelect $query * @param string $column * @param IcingaObject[]|int[] $objects * @return ZfSelect */ protected function addMembershipWhere(ZfSelect $query, $column, &$objects) { if (empty($objects)) { return $query; } $ids = array(); foreach ($objects as $k => $object) { if (is_int($object)) { $ids[] = $k; } elseif (is_string($object)) { $ids[] = (int) $object; } else { $ids[] = (int) $object->get('id'); } } if (count($ids) === 1) { $query->orWhere($column . ' = ?', $ids[0]); } else { $query->orWhere($column . ' IN (?)', $ids); } return $query; } protected function recheckAllObjects($groups) { $mappings = []; $staticGroups = []; if ($this->objects === null) { $objects = $this->fetchAllObjects(); } else { $objects = & $this->objects; } $times = array(); foreach ($objects as $object) { if ($object->shouldBeRemoved()) { continue; } if ($object->isTemplate()) { continue; } $mt = microtime(true); $id = $object->get('id'); DynamicApplyMatches::setType($this->type); $resolver = DynamicApplyMatches::prepare($object); foreach ($groups as $groupId => $filter) { if ($resolver->matchesFilter($filter)) { if (! array_key_exists($groupId, $mappings)) { $mappings[$groupId] = []; } $mappings[$groupId][$id] = $id; } } // can only be run reliably when updating for all groups $groupNames = $object->get('groups'); if (empty($groupNames)) { $groupNames = $object->listInheritedGroupNames(); } foreach ($groupNames as $name) { $groupId = $this->getGroupId($name); if (! array_key_exists($groupId, $mappings)) { $mappings[$groupId] = []; } $mappings[$groupId][$id] = $id; $staticGroups[$groupId] = $groupId; } $times[] = (microtime(true) - $mt) * 1000; } $count = count($times); $min = $max = $avg = 0; if ($count > 0) { $min = min($times); $max = max($times); $avg = array_sum($times) / $count; } Benchmark::measure(sprintf( '%sgroup apply recalculated: objects=%d groups=%d min=%d max=%d avg=%d (in ms)', $this->type, $count, count($groups), $min, $max, $avg )); Benchmark::measure('Done with single assignments'); $this->newMappings = $mappings; $this->staticGroups = $staticGroups; } protected function getAppliedGroups() { if (empty($this->groups)) { return $this->fetchAppliedGroups(); } else { return $this->buildAppliedGroups(); } } protected function buildAppliedGroups() { $list = array(); foreach ($this->groups as $id => $group) { $list[$id] = $group->get('assign_filter'); } return $this->parseFilters($list); } protected function fetchAppliedGroups() { $type = $this->getType(); $query = $this->db->select()->from( array('hg' => "icinga_{$type}group"), array( 'id', 'assign_filter', ) )->where("assign_filter IS NOT NULL AND assign_filter != ''"); return $this->parseFilters($this->db->fetchPairs($query)); } /** * Parsing a list of query strings to Filter * * @param string[] $list List of query strings * * @return Filter[] */ protected function parseFilters($list) { return array_map(function ($s) { return Filter::fromQueryString($s); }, $list); } protected function getTableName() { $type = $this->getType(); return "icinga_{$type}group_{$type}"; } protected function getResolvedTableName() { return $this->getTableName() . '_resolved'; } /** * @return $this */ protected function beginTransaction() { if ($this->useTransactions) { $this->db->beginTransaction(); } return $this; } /** * @return $this */ protected function commit() { if ($this->useTransactions) { $this->db->commit(); } return $this; } /** * @return IcingaObject[] */ protected function getObjects() { if ($this->objects === null) { $this->objects = $this->fetchAllObjects(); } return $this->objects; } protected function fetchAllObjects() { return IcingaObject::loadAllByType($this->getType(), $this->connection); } protected function assertBeenLoadedFromDb(IcingaObject $object) { if (! is_int($object->get('id')) && ! ctype_digit($object->get('id'))) { throw new LogicException( 'Group resolver does not support unstored objects' ); } } } icingaweb2-module-director-1.11.8/library/Director/Objects/HostApplyMatches.php000066400000000000000000000002151516513262500274650ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'password' => null, 'client_dn' => null, 'permissions' => null, ]; protected function renderPassword() { return c::renderKeyValue('password', c::renderString('***')); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaArguments.php000066400000000000000000000310741516513262500273240ustar00rootroot00000000000000object = $object; } #[\ReturnTypeWillChange] public function count() { return count($this->arguments); } #[\ReturnTypeWillChange] public function rewind() { $this->position = 0; } public function hasBeenModified() { return $this->modified; } #[\ReturnTypeWillChange] public function current() { if (! $this->valid()) { return null; } return $this->arguments[$this->idx[$this->position]]; } #[\ReturnTypeWillChange] public function key() { return $this->idx[$this->position]; } #[\ReturnTypeWillChange] public function next() { ++$this->position; } #[\ReturnTypeWillChange] public function valid() { return array_key_exists($this->position, $this->idx); } public function get($key) { if (array_key_exists($key, $this->arguments)) { if ($this->arguments[$key]->shouldBeRemoved()) { return null; } return $this->arguments[$key]; } return null; } public function set($key, $value) { if ($value === null) { return $this->remove($key); } if ($value instanceof IcingaCommandArgument) { $argument = $value; } else { $argument = IcingaCommandArgument::create( $this->mungeCommandArgument($key, $value) ); } $argument->set('command_id', $this->object->get('id')); $key = $argument->argument_name; if (array_key_exists($key, $this->arguments)) { $this->arguments[$key]->replaceWith($argument); if ($this->arguments[$key]->hasBeenModified()) { $this->modified = true; } } elseif (array_key_exists($key, $this->storedArguments)) { $this->arguments[$key] = clone($this->storedArguments[$key]); $this->arguments[$key]->replaceWith($argument); if ($this->arguments[$key]->hasBeenModified()) { $this->modified = true; } } else { $this->add($argument); $this->modified = true; } return $this; } protected function mungeCommandArgument($key, $value) { $attrs = [ 'argument_name' => (string) $key, ]; $map = [ 'skip_key' => 'skip_key', 'repeat_key' => 'repeat_key', 'required' => 'required', // 'order' => 'sort_order', 'description' => 'description', 'set_if' => 'set_if', ]; $argValue = null; if (is_object($value)) { if (property_exists($value, 'order')) { $attrs['sort_order'] = (string) $value->order; } foreach ($map as $apiKey => $dbKey) { if (property_exists($value, $apiKey)) { $attrs[$dbKey] = $value->$apiKey; } } if (property_exists($value, 'type')) { // argument is directly set as function, no further properties if ($value->type === 'Function') { $attrs['argument_value'] = property_exists($value, 'body') ? $value->body : self::COMMENT_DSL_UNSUPPORTED; $attrs['argument_format'] = 'expression'; } } elseif (property_exists($value, 'value')) { // argument is a dictionary with further settings if (is_object($value->value)) { if ($value->value->type === 'Function' && property_exists($value->value, 'body')) { // likely an export from Baskets that contains the actual function body $attrs['argument_value'] = $value->value->body; $attrs['argument_format'] = 'expression'; } elseif ($value->value->type === 'Function') { $attrs['argument_value'] = self::COMMENT_DSL_UNSUPPORTED; $attrs['argument_format'] = 'expression'; } else { die('Unable to resolve command argument'); } } else { $argValue = $value->value; if (is_string($argValue)) { $attrs['argument_value'] = $argValue; $attrs['argument_format'] = 'string'; } else { $attrs['argument_value'] = $argValue; $attrs['argument_format'] = 'json'; } } } } else { if (is_string($value)) { $attrs['argument_value'] = $value; $attrs['argument_format'] = 'string'; } else { $attrs['argument_value'] = $value; $attrs['argument_format'] = 'json'; } } if (array_key_exists('set_if', $attrs)) { if (is_object($attrs['set_if']) && $attrs['set_if']->type === 'Function') { $attrs['set_if'] = self::COMMENT_DSL_UNSUPPORTED; $attrs['set_if_format'] = 'expression'; } elseif (property_exists($value, 'set_if_format')) { if (in_array($value->set_if_format, ['string', 'expression', 'json'])) { $attrs['set_if_format'] = $value->set_if_format; } } } return $attrs; } public function setArguments($arguments) { $arguments = (array) $arguments; foreach ($arguments as $arg => $val) { $this->set($arg, $val); } foreach ( array_diff( array_keys($this->arguments), array_keys($arguments) ) as $arg ) { if ($this->arguments[$arg]->hasBeenLoadedFromDb()) { $this->arguments[$arg]->markForRemoval(); $this->modified = true; } else { unset($this->arguments[$arg]); } } return $this; } /** * Magic isset check * * @param string $argument * @return boolean */ public function __isset($argument) { return array_key_exists($argument, $this->arguments); } public function remove($argument) { if (array_key_exists($argument, $this->arguments)) { $this->arguments[$argument]->markForRemoval(); $this->modified = true; $this->refreshIndex(); } return $this; } protected function refreshIndex() { ksort($this->arguments); $this->idx = array_keys($this->arguments); } public function add(IcingaCommandArgument $argument) { $name = $argument->get('argument_name'); if (array_key_exists($name, $this->arguments)) { // TODO: Fail unless $argument equals existing one return $this; } $this->arguments[$name] = $argument; $this->modified = true; $this->refreshIndex(); return $this; } protected function getGroupTableName() { return $this->object->getTableName() . 'group'; } protected function loadFromDb() { $db = $this->object->getDb(); $connection = $this->object->getConnection(); $table = $this->object->getTableName(); $query = $db->select()->from( ['o' => $table], [] )->join( ['a' => 'icinga_command_argument'], 'o.id = a.command_id', '*' )->where('o.object_name = ?', $this->object->getObjectName()) ->order('a.sort_order')->order('a.argument_name'); $this->arguments = IcingaCommandArgument::loadAll($connection, $query, 'argument_name'); $this->cloneStored(); $this->refreshIndex(); $this->modified = false; return $this; } public function toPlainObject( $resolved = false, $skipDefaults = false, array $chosenProperties = null, $resolveIds = true ) { if ($chosenProperties !== null) { throw new InvalidArgumentException( 'IcingaArguments does not support chosenProperties[]' ); } $args = []; foreach ($this->arguments as $arg) { if ($arg->shouldBeRemoved()) { continue; } $args[$arg->get('argument_name')] = $arg->toPlainObject( $resolved, $skipDefaults, null, $resolveIds ); } return $args; } public function toUnmodifiedPlainObject() { $args = []; foreach ($this->storedArguments as $key => $arg) { $args[$arg->argument_name] = $arg->toPlainObject(); } return $args; } protected function cloneStored() { $this->storedArguments = []; foreach ($this->arguments as $k => $v) { $this->storedArguments[$k] = clone($v); } } public static function loadForStoredObject(IcingaObject $object) { $arguments = new static($object); return $arguments->loadFromDb(); } public function setBeingLoadedFromDb() { foreach ($this->arguments as $argument) { $argument->setBeingLoadedFromDb(); } $this->refreshIndex(); $this->cloneStored(); $this->modified = false; } /** * @return $this * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function store() { $db = $this->object->getConnection(); $deleted = []; foreach ($this->arguments as $key => $argument) { if ($argument->shouldBeRemoved()) { $deleted[] = $key; } else { if ($argument->hasBeenModified()) { if ($argument->hasBeenLoadedFromDb()) { $argument->setLoadedProperty('command_id', $this->object->get('id')); } else { $argument->set('command_id', $this->object->get('id')); } $argument->store($db); } } } foreach ($deleted as $key) { $argument = $this->arguments[$key]; $argument->setLoadedProperty('command_id', $this->object->get('id')); $argument->setConnection($this->object->getConnection()); $argument->delete(); unset($this->arguments[$key]); } $this->refreshIndex(); $this->cloneStored(); $this->modified = false; return $this; } public function toConfigString() { if (empty($this->arguments)) { return ''; } $args = []; foreach ($this->arguments as $arg) { if ($arg->shouldBeRemoved()) { continue; } $args[$arg->get('argument_name')] = $arg->toConfigString(); } return c::renderKeyOperatorValue('arguments', '+=', c::renderDictionary($args)); } public function __toString() { try { return $this->toConfigString(); } catch (Exception $e) { trigger_error($e); $previousHandler = set_exception_handler( function () { } ); restore_error_handler(); if ($previousHandler !== null) { call_user_func($previousHandler, $e); die(); } else { die($e->getMessage()); } } } public function toLegacyConfigString() { return 'UNSUPPORTED'; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaCommand.php000066400000000000000000000172061516513262500267360ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'methods_execute' => null, 'command' => null, 'timeout' => null, 'zone_id' => null, 'is_string' => null, ]; protected $booleans = [ 'is_string' => 'is_string', ]; protected $supportsCustomVars = true; protected $supportsFields = true; protected $supportsImports = true; protected $supportedInLegacy = true; protected $intervalProperties = [ 'timeout' => 'timeout', ]; protected $relations = [ 'zone' => 'IcingaZone', ]; protected static $pluginDir; protected $hiddenExecuteTemplates = [ 'PluginCheck' => 'plugin-check-command', 'PluginNotification' => 'plugin-notification-command', 'PluginEvent' => 'plugin-event-command', // Special, internal: 'IcingaCheck' => 'icinga-check-command', 'ClusterCheck' => 'cluster-check-command', 'ClusterZoneCheck' => 'cluster-zone-check-command', 'IdoCheck' => 'ido-check-command', 'RandomCheck' => 'random-check-command', ]; /** * Render the 'medhods_execute' property as 'execute' * * Execute is a reserved word in SQL, column name was prefixed * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ protected function renderMethods_execute() { // @codingStandardsIgnoreEnd return ''; } protected function renderObjectHeader() { if ($execute = $this->get('methods_execute')) { $itlImport = sprintf( ' import "%s"' . "\n", $this->hiddenExecuteTemplates[$execute] ); } else { $itlImport = ''; } $execute = $this->getSingleResolvedProperty('methods_execute'); if ($execute === 'PluginNotification') { return $this->renderObjectHeaderWithType('NotificationCommand') . $itlImport; } elseif ($execute === 'PluginEvent') { return $this->renderObjectHeaderWithType('EventCommand') . $itlImport; } else { return parent::renderObjectHeader() . $itlImport; } } /** * @param $type * @return string */ protected function renderObjectHeaderWithType($type) { return sprintf( "%s %s %s {\n", $this->getObjectTypeName(), $type, c::renderString($this->getObjectName()) ); } public function mungeCommand($value) { if (is_array($value)) { $value = implode(' ', $value); } elseif (is_object($value)) { // { type => Function } -> really?? return null; // return $value; } if (isset($value, self::$pluginDir) && strpos($value, self::$pluginDir) === 0) { $value = substr($value, strlen(self::$pluginDir) + 1); } return $value; } public function getNextSkippableKeyName() { $key = $this->makeSkipKey(); $cnt = 1; while (isset($this->arguments()->$key)) { $cnt++; $key = $this->makeSkipKey($cnt); } return $key; } protected function makeSkipKey($num = null) { if ($num === null) { return '(no key)'; } return sprintf('(no key.%d)', $num); } protected function prefersGlobalZone() { return true; } /** * @return string * @throws \Zend_Db_Select_Exception */ public function countDirectUses() { $db = $this->getDb(); $id = (int) $this->get('id'); $qh = $db->select()->from( array('h' => 'icinga_host'), array('cnt' => 'COUNT(*)') )->where('h.check_command_id = ?', $id) ->orWhere('h.event_command_id = ?', $id); $qs = $db->select()->from( array('s' => 'icinga_service'), array('cnt' => 'COUNT(*)') )->where('s.check_command_id = ?', $id) ->orWhere('s.event_command_id = ?', $id); $qn = $db->select()->from( array('n' => 'icinga_notification'), array('cnt' => 'COUNT(*)') )->where('n.command_id = ?', $id); $query = $db->select()->union( [$qh, $qs, $qn], DbSelect::SQL_UNION_ALL ); return $db->fetchOne($db->select()->from( ['all_cnts' => $query], ['cnt' => 'SUM(cnt)'] )); } /** * @return bool * @throws \Zend_Db_Select_Exception */ public function isInUse() { return $this->countDirectUses() > 0; } public function getUniqueIdentifier() { return $this->getObjectName(); } protected function renderCommand() { $command = $this->get('command'); $prefix = ''; if (preg_match('~^([A-Z][A-Za-z0-9_]+\s\+\s)(.+?)$~', $command, $m)) { $prefix = $m[1]; $command = $m[2]; } elseif (! $this->isAbsolutePath($command)) { $prefix = 'PluginDir + '; $command = '/' . $command; } $inherited = $this->getInheritedProperties(); if ( $this->get('is_string') === 'y' || ($this->get('is_string') === null && property_exists($inherited, 'is_string') && $inherited->is_string === 'y') ) { return c::renderKeyValue('command', $prefix . c::renderString($command)); } else { $parts = preg_split('/\s+/', $command, -1, PREG_SPLIT_NO_EMPTY); array_unshift($parts, c::alreadyRendered($prefix . c::renderString(array_shift($parts)))); return c::renderKeyValue('command', c::renderArray($parts)); } } /** * @codingStandardsIgnoreStart */ protected function renderIs_string() { // @codingStandardsIgnoreEnd return ''; } protected function isAbsolutePath($path) { return $path[0] === '/' || $path[0] === '\\' || preg_match('/^[A-Za-z]:\\\/', substr($path, 0, 3)) || preg_match('/^%[A-Z][A-Za-z0-9\(\)-]*%/', $path); } public static function setPluginDir($pluginDir) { self::$pluginDir = $pluginDir; } public function getLegacyObjectType() { // there is only one type of command in Icinga 1.x return 'command'; } protected function renderLegacyCommand() { $command = $this->get('command'); if (preg_match('~^(\$USER\d+\$/?)(.+)$~', $command)) { // should be fine, since the user decided to use a macro } elseif (! $this->isAbsolutePath($command)) { $command = '$USER1$/' . $command; } return c1::renderKeyValue( $this->getLegacyObjectType() . '_line', c1::renderString($command) ); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaCommandArgument.php000066400000000000000000000163611516513262500304420ustar00rootroot00000000000000 'skip_key', 'repeat_key' => 'repeat_key', 'required' => 'required' ); protected $defaultProperties = array( 'id' => null, 'command_id' => null, 'argument_name' => null, 'argument_value' => null, 'argument_format' => null, 'key_string' => null, 'description' => null, 'skip_key' => null, 'set_if' => null, 'sort_order' => null, 'repeat_key' => null, 'set_if_format' => null, 'required' => null, ); public function onInsert() { // No log right now, we have to handle "sub-objects" } public function onUpdate() { // No log right now, we have to handle "sub-objects" } public function onDelete() { // No log right now, we have to handle "sub-objects" } public function isSkippingKey() { return $this->get('skip_key') === 'y' || $this->get('argument_name') === null; } // Preserve is not supported public function replaceWith(IcingaObject $object, $preserve = null) { $this->setProperties((array) $object->toPlainObject( false, false, null, false )); return $this; } protected function makePlainArgumentValue($value, $format) { if ($format === 'expression') { return (object) [ 'type' => 'Function', // TODO: Not for dummy comment 'body' => $value ]; } else { // json or string return $value; } } protected function extractValueFromPlain($plain) { if ($plain->argument_value) { return $this->makePlainArgumentValue( $plain->argument_value, $plain->argument_format ); } else { return null; } } protected function transformPlainArgumentValue($plain) { if (property_exists($plain, 'argument_value')) { if (property_exists($plain, 'argument_format')) { $format = $plain->argument_format; } else { $format = 'string'; } $plain->value = $this->makePlainArgumentValue( $plain->argument_value, $format ); unset($plain->argument_value); unset($plain->argument_format); } } public function toCompatPlainObject() { $plain = parent::toPlainObject( false, true, null, false ); unset($plain->id); unset($plain->argument_name); if (! isset($plain->argument_value)) { unset($plain->argument_format); } if (! isset($plain->set_if)) { unset($plain->set_if_format); } $this->transformPlainArgumentValue($plain); unset($plain->command_id); // Will happen only combined with $skipDefaults if (array_keys((array) $plain) === ['value']) { return $plain->value; } else { if (property_exists($plain, 'sort_order') && $plain->sort_order !== null) { $plain->order = $plain->sort_order; unset($plain->sort_order); } return $plain; } } public function toFullPlainObject($skipDefaults = false) { $plain = parent::toPlainObject( false, $skipDefaults, null, false ); unset($plain->id); return $plain; } public function toPlainObject( $resolved = false, $skipDefaults = false, array $chosenProperties = null, $resolveIds = true, $keepId = false ) { if ($resolved) { throw new RuntimeException( 'A single CommandArgument cannot be resolved' ); } if ($chosenProperties) { throw new RuntimeException( 'IcingaCommandArgument does not support chosenProperties[]' ); } if ($keepId) { throw new RuntimeException( 'IcingaCommandArgument does not support $keepId' ); } // $resolveIds is misused here if ($resolveIds) { return $this->toCompatPlainObject(); } else { return $this->toFullPlainObject($skipDefaults); } } public function toConfigString() { $data = array(); $value = $this->get('argument_value'); if ($value) { switch ($this->get('argument_format')) { case 'string': $data['value'] = c::renderString($value); break; case 'json': if (is_object($value)) { $data['value'] = c::renderDictionary($value); } elseif (is_array($value)) { $data['value'] = c::renderArray($value); } elseif (is_null($value)) { // TODO: recheck all this. I bet we never reach this: $data['value'] = 'null'; } elseif (is_bool($value)) { $data['value'] = c::renderBoolean($value); } else { $data['value'] = $value; } break; case 'expression': $data['value'] = c::renderExpression($value); break; } } if ($this->get('sort_order') !== null) { $data['order'] = $this->get('sort_order'); } if (null !== $this->get('set_if')) { switch ($this->get('set_if_format')) { case 'expression': $data['set_if'] = c::renderExpression($this->get('set_if')); break; case 'string': default: $data['set_if'] = c::renderString($this->get('set_if')); break; } } if (null !== $this->get('required')) { $data['required'] = c::renderBoolean($this->get('required')); } if ($this->isSkippingKey()) { $data['skip_key'] = c::renderBoolean('y'); } if (null !== $this->get('repeat_key')) { $data['repeat_key'] = c::renderBoolean($this->get('repeat_key')); } if (null !== $this->get('description')) { $data['description'] = c::renderString($this->get('description')); } if (array_keys($data) === ['value']) { return $data['value']; } else { return c::renderDictionary($data); } } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaCommandField.php000066400000000000000000000006111516513262500276720ustar00rootroot00000000000000 null, 'datafield_id' => null, 'is_required' => null, 'var_filter' => null, ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaDependency.php000066400000000000000000000446511516513262500274420ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'apply_to' => null, 'parent_host_id' => null, 'parent_host_var' => null, 'parent_service_id' => null, 'child_host_id' => null, 'child_service_id' => null, 'disable_checks' => null, 'disable_notifications' => null, 'ignore_soft_states' => null, 'period_id' => null, 'zone_id' => null, 'redundancy_group' => null, 'assign_filter' => null, 'parent_service_by_name' => null, ]; protected $uuidColumn = 'uuid'; protected $supportsCustomVars = false; protected $supportsImports = true; protected $supportsApplyRules = true; /** * @internal * @var bool */ protected $renderApplyForArray = false; protected $relatedSets = [ 'states' => 'StateFilterSet', ]; protected $relations = [ 'zone' => 'IcingaZone', 'parent_host' => 'IcingaHost', 'parent_service' => 'IcingaService', 'child_host' => 'IcingaHost', 'child_service' => 'IcingaService', 'period' => 'IcingaTimePeriod', ]; protected $booleans = [ 'disable_checks' => 'disable_checks', 'disable_notifications' => 'disable_notifications', 'ignore_soft_states' => 'ignore_soft_states' ]; protected $propertiesNotForRendering = [ 'id', 'object_name', 'object_type', 'apply_to', ]; public function getUniqueIdentifier() { return $this->getObjectName(); } public function parentHostIsVar() { return $this->get('parent_host_var') !== null; } /** * Check if the given string is a custom variable * * @param $string string * * @return false|int */ protected function isCustomVar(string $string) { return preg_match('/^(?:host|service)\.vars\..+$/', $string); } /** * @return string * @throws ConfigurationError */ protected function renderObjectHeader() { if ($this->isApplyRule()) { if (($to = $this->get('apply_to')) === null) { throw new ConfigurationError( 'Applied dependency "%s" has no valid object type', $this->getObjectName() ); } if ($this->renderApplyForArray) { return $this->renderArrayObjectHeader($to); } return $this->renderSingleObjectHeader($to); } return parent::renderObjectHeader(); } protected function renderSingleObjectHeader($to) { return sprintf( "%s %s %s to %s {\n", $this->getObjectTypeName(), $this->getType(), c::renderString($this->getObjectName()), ucfirst($to) ); } protected function renderArrayObjectHeader($to) { return sprintf( "%s %s %s for (host_parent_name in %s) to %s {\n", $this->getObjectTypeName(), $this->getType(), c::renderString($this->getObjectName()), $this->get('parent_host_var'), ucfirst($to) ); } /** * @return string */ protected function renderSuffix() { if (! $this->parentHostIsVar()) { return parent::renderSuffix(); } if ((string) $this->get('assign_filter') !== '') { $suffix = parent::renderSuffix(); } else { $suffix = ' assign where ' . $this->renderAssignFilterExtension('') . "\n" . parent::renderSuffix(); } if ($this->renderApplyForArray) { return $suffix; } return $suffix . $this->renderApplyForArrayClone(); } protected function renderApplyForArrayClone() { $clone = clone($this); $clone->renderApplyForArray = true; return $clone->toConfigString(); } public function isApplyForArrayClone() { return $this->renderApplyForArray; } /** * @codingStandardsIgnoreStart */ public function renderAssign_Filter() { if ($this->parentHostIsVar()) { return preg_replace( '/\n$/m', $this->renderAssignFilterExtension() . "\n", parent::renderAssign_Filter() ); } return parent::renderAssign_Filter(); } protected function renderAssignFilterExtension($pre = ' && ') { $varName = $this->get('parent_host_var'); if ($this->renderApplyForArray) { return sprintf('%stypeof(%s) == Array', $pre, $varName); } return sprintf('%stypeof(%s) == String', $pre, $varName); } protected function setKey($key) { // TODO: Check if this method can be removed if (is_int($key)) { $this->id = $key; } elseif (is_array($key)) { $keys = [ 'id', 'parent_host_id', 'parent_service_id', 'child_host_id', 'child_service_id', 'object_name' ]; foreach ($keys as $k) { if (array_key_exists($k, $key)) { $this->set($k, $key[$k]); } } } else { return parent::setKey($key); } return $this; } protected function renderAssignments() { // TODO: this will never be reached if ($this->hasBeenAssignedToServiceApply()) { /** @var IcingaService $tmpService */ $tmpService = $this->getRelatedObject( 'child_service', $this->get('child_service_id') ); // TODO: fix this, will crash: $assigns = $tmpService->assignments()->toConfigString(); $filter = sprintf( '%s && service.name == "%s"', trim($assigns), $this->get('child_service') ); return "\n " . $filter . "\n"; } if ($this->hasBeenAssignedToHostTemplateService()) { $filter = sprintf( 'assign where "%s" in host.templates && service.name == "%s"', $this->get('child_host'), $this->get('child_service') ); return "\n " . $filter . "\n"; } if ($this->hasBeenAssignedToHostTemplate()) { $filter = sprintf( 'assign where "%s" in host.templates', $this->get('child_host') ); return "\n " . $filter . "\n"; } if ($this->hasBeenAssignedToServiceTemplate()) { $filter = sprintf( 'assign where "%s" in service.templates', $this->get('child_service') ); return "\n " . $filter . "\n"; } return parent::renderAssignments(); } protected function hasBeenAssignedToHostTemplate() { try { $id = $this->get('child_host_id'); return $id && $this->getRelatedObject( 'child_host', $id )->isTemplate(); } catch (NotFoundError $e) { return false; } } protected function hasBeenAssignedToServiceTemplate() { try { $id = $this->get('child_service_id'); return $id && $this->getRelatedObject( 'child_service', $id )->isTemplate(); } catch (NotFoundError $e) { return false; } } protected function hasBeenAssignedToHostTemplateService() { if (!$this->hasBeenAssignedToHostTemplate()) { return false; } try { $id = $this->get('child_service_id'); return $id && $this->getRelatedObject( 'child_service', $id )->isObject(); } catch (NotFoundError $e) { return false; } } protected function hasBeenAssignedToServiceApply() { try { $id = $this->get('child_service_id'); return $id && $this->getRelatedObject( 'child_service', $id )->isApplyRule(); } catch (NotFoundError $e) { return false; } } /** * Render child_host_id as host_name * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ public function renderChild_host_id() { // @codingStandardsIgnoreEnd if ($this->hasBeenAssignedToHostTemplate()) { return ''; } return $this->renderRelationProperty( 'child_host', $this->get('child_host_id'), 'child_host_name' ); } /** * Render parent_host_id as parent_host_name * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ public function renderParent_host_id() { // @codingStandardsIgnoreEnd return $this->renderRelationProperty( 'parent_host', $this->get('parent_host_id'), 'parent_host_name' ); } /** * Render parent_host_var as parent_host * @codingStandardsIgnoreStart * * @return string */ public function renderParent_host_var() { // @codingStandardsIgnoreEnd if ($this->renderApplyForArray) { return c::renderKeyValue( 'parent_host_name', 'host_parent_name' ); } // @codingStandardsIgnoreEnd return c::renderKeyValue( 'parent_host_name', $this->get('parent_host_var') ); } /** * Render child_service_id as host_name * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ public function renderChild_service_id() { // @codingStandardsIgnoreEnd if ( $this->hasBeenAssignedToServiceTemplate() || $this->hasBeenAssignedToHostTemplateService() || $this->hasBeenAssignedToServiceApply() ) { return ''; } return $this->renderRelationProperty( 'child_service', $this->get('child_service_id'), 'child_service_name' ); } /** * Render parent_service_id as parent_service_name * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ public function renderParent_service_id() { return $this->renderRelationProperty( 'parent_service', $this->get('parent_service_id'), 'parent_service_name' ); } // /** * Render parent_service_by_name as parent_service_name * * Special case for parent service set as plain string for Apply rules * * @codingStandardsIgnoreStart * * @return string */ public function renderParent_service_by_name() { // @codingStandardsIgnoreEnd $var = $this->get('parent_service_by_name'); if ($this->isCustomVar($var)) { return c::renderKeyValue( 'parent_service_name', $var ); } return c::renderKeyValue( 'parent_service_name', c::renderString($var) ); } public function isApplyRule() { if ( $this->hasBeenAssignedToHostTemplate() || $this->hasBeenAssignedToServiceTemplate() || $this->hasBeenAssignedToServiceApply() ) { return true; } return parent::isApplyRule(); } protected function resolveUnresolvedRelatedProperty($name) { $short = substr($name, 0, -3); /** @var IcingaObject|string $class */ $class = $this->getRelationClass($short); $objKey = $this->unresolvedRelatedProperties[$name]; # related services need array key if ($class === IcingaService::class) { if ($name === 'parent_service_id' && $this->get('object_type') === 'apply') { //special case , parent service can be set as simple string for Apply if ($this->properties['parent_host_id'] === null) { $this->reallySet( 'parent_service_by_name', $this->unresolvedRelatedProperties[$name] ); $this->reallySet('parent_service_id', null); unset($this->unresolvedRelatedProperties[$name]); return; } } $this->reallySet('parent_service_by_name', null); $hostIdProperty = str_replace('service', 'host', $name); if (isset($this->properties[$hostIdProperty])) { $objKey = [ 'host_id' => $this->properties[$hostIdProperty], 'object_name' => $this->unresolvedRelatedProperties[$name] ]; } else { $objKey = [ 'host_id' => null, 'object_name' => $this->unresolvedRelatedProperties[$name] ]; } try { $class::load($objKey, $this->connection); } catch (NotFoundError $e) { // Not a simple service on host // Hunt through inherited services, use service assigned to // template if found $tmpHost = IcingaHost::loadWithAutoIncId( $this->properties[$hostIdProperty], $this->connection ); // services for applicable templates $resolver = $tmpHost->templateResolver(); foreach ($resolver->fetchResolvedParents() as $template_obj) { $objKey = [ 'host_id' => $template_obj->id, 'object_name' => $this->unresolvedRelatedProperties[$name] ]; try { $object = $class::load($objKey, $this->connection); } catch (NotFoundError $e) { continue; } break; } if (!isset($object)) { // Not an inherited service, now try apply rules $matcher = HostApplyMatches::prepare($tmpHost); foreach ($this->getAllApplyRules() as $rule) { if ($matcher->matchesFilter($rule->filter)) { if ($rule->name === $this->unresolvedRelatedProperties[$name]) { $object = IcingaService::loadWithAutoIncId( $rule->id, $this->connection ); break; } } } } } } else { $object = $class::load($objKey, $this->connection); } if (isset($object)) { $this->reallySet($name, $object->get('id')); unset($this->unresolvedRelatedProperties[$name]); } else { // Depend on a single service on a single host. Rare case, as usually you want to // depend on a service on the very same host - and leave the Host field empty. The // latter is already being handled above. This duplicates some code, but I'll leave // it this way for now. There might have been a reason for the parent_host_id = null // check in that code. if ($name === 'parent_service_id' && $this->get('object_type') === 'apply') { $this->reallySet( 'parent_service_by_name', $this->unresolvedRelatedProperties[$name] ); $this->reallySet('parent_service_id', null); unset($this->unresolvedRelatedProperties[$name]); return; } throw new NotFoundError(sprintf( 'Unable to resolve related property: %s "%s"', $name, $this->unresolvedRelatedProperties[$name] )); } } protected function getAllApplyRules() { $allApplyRules = $this->fetchAllApplyRules(); foreach ($allApplyRules as $rule) { $rule->filter = Filter::fromQueryString($rule->assign_filter); } return $allApplyRules; } protected function fetchAllApplyRules() { $db = $this->connection->getDbAdapter(); $query = $db->select()->from(['s' => 'icinga_service'], [ 'id' => 's.id', 'name' => 's.object_name', 'assign_filter' => 's.assign_filter', ])->where('object_type = ? AND assign_filter IS NOT NULL', 'apply'); return $db->fetchAll($query); } protected function getRelatedProperty($key) { $related = parent::getRelatedProperty($key); // handle special case for plain string parent service on Dependency // Apply rules if ( $related === null && $key === 'parent_service' && ( $this->get('parent_service_by_name') && ! $this->isCustomVar($this->get('parent_service_by_name')) ) ) { return $this->get('parent_service_by_name'); } return $related; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaEndpoint.php000066400000000000000000000077201516513262500271400ustar00rootroot00000000000000 null, 'uuid' => null, 'zone_id' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'host' => null, 'port' => null, 'log_duration' => null, 'apiuser_id' => null, ]; protected $relations = [ 'zone' => 'IcingaZone', 'apiuser' => 'IcingaApiUser', ]; public function hasApiUser() { return $this->getResolvedProperty('apiuser_id') !== null; } public function getApiUser() { $id = $this->getResolvedProperty('apiuser_id'); if ($id === null) { throw new RuntimeException('Trying to get API User for Endpoint without such: ' . $this->getObjectName()); } return $this->getRelatedObject('apiuser', $id); } /** * Return a core API, depending on the configuration format * * @return CoreApi|LegacyDeploymentApi */ public function api() { $format = $this->connection->settings()->config_format; if ($format === 'v2') { $api = new CoreApi($this->getRestApiClient()); $api->setDb($this->getConnection()); return $api; } elseif ($format === 'v1') { return new LegacyDeploymentApi($this->connection); } else { throw new InvalidArgumentException("Unsupported config format: $format"); } } /** * @return RestApiClient */ public function getRestApiClient() { $client = new RestApiClient( $this->getResolvedProperty('host', $this->getObjectName()), $this->getResolvedProperty('port') ); $user = $this->getApiUser(); $client->setCredentials( // TODO: $user->client_dn, $user->object_name, $user->password ); return $client; } public function getRenderingZone(IcingaConfig $config = null) { try { if ($zone = $this->getResolvedRelated('zone')) { return $zone->getRenderingZone($config); } } catch (NestingError $e) { return self::RESOLVE_ERROR; } return parent::getRenderingZone($config); } /** * @return int */ public function getResolvedPort() { $port = $this->getSingleResolvedProperty('port'); if (null === $port) { return 5665; } else { return (int) $port; } } public function getDescriptiveUrl() { return sprintf( 'https://%s@%s:%d/v1/', $this->getApiUser()->getObjectName(), $this->getResolvedProperty('host', $this->getObjectName()), $this->getResolvedPort() ); } /** * Use duration time renderer helper * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ protected function renderLog_duration() { // @codingStandardsIgnoreEnd return $this->renderPropertyAsSeconds('log_duration'); } /** * Internal property, will not be rendered * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ protected function renderApiuser_id() { // @codingStandardsIgnoreEnd return ''; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaFlatVar.php000066400000000000000000000027471516513262500267230ustar00rootroot00000000000000 null, 'flatname_checksum' => null, 'flatname' => null, 'flatvalue' => null, ]; protected $binaryProperties = [ 'var_checksum', 'flatname_checksum', ]; public static function generateForCustomVar(CustomVariable $var, Db $db) { $flatVars = static::forCustomVar($var, $db); foreach ($flatVars as $flat) { $flat->store(); } return $flatVars; } public static function forCustomVar(CustomVariable $var, Db $db) { $flat = []; $varSum = $var->checksum(); $var->flatten($flat, $var->getKey()); $flatVars = []; foreach ($flat as $name => $value) { $flatVar = static::create([ 'var_checksum' => $varSum, 'flatname_checksum' => sha1($name, true), 'flatname' => $name, 'flatvalue' => $value, ], $db); $flatVar->store(); $flatVars[] = $flatVar; } return $flatVars; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaHost.php000066400000000000000000000410641516513262500262740ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'display_name' => null, 'address' => null, 'address6' => null, 'check_command_id' => null, 'max_check_attempts' => null, 'check_period_id' => null, 'check_interval' => null, 'retry_interval' => null, 'check_timeout' => null, 'enable_notifications' => null, 'enable_active_checks' => null, 'enable_passive_checks' => null, 'enable_event_handler' => null, 'enable_flapping' => null, 'enable_perfdata' => null, 'event_command_id' => null, 'flapping_threshold_high' => null, 'flapping_threshold_low' => null, 'volatile' => null, 'zone_id' => null, 'command_endpoint_id' => null, 'notes' => null, 'notes_url' => null, 'action_url' => null, 'icon_image' => null, 'icon_image_alt' => null, 'has_agent' => null, 'master_should_connect' => null, 'accept_config' => null, 'custom_endpoint_name' => null, 'api_key' => null, 'template_choice_id' => null, ); protected $relations = array( 'check_command' => 'IcingaCommand', 'event_command' => 'IcingaCommand', 'check_period' => 'IcingaTimePeriod', 'command_endpoint' => 'IcingaEndpoint', 'zone' => 'IcingaZone', 'template_choice' => 'IcingaTemplateChoiceHost', ); protected $booleans = array( 'enable_notifications' => 'enable_notifications', 'enable_active_checks' => 'enable_active_checks', 'enable_passive_checks' => 'enable_passive_checks', 'enable_event_handler' => 'enable_event_handler', 'enable_flapping' => 'enable_flapping', 'enable_perfdata' => 'enable_perfdata', 'volatile' => 'volatile', 'has_agent' => 'has_agent', 'master_should_connect' => 'master_should_connect', 'accept_config' => 'accept_config', ); protected $intervalProperties = array( 'check_interval' => 'check_interval', 'check_timeout' => 'check_timeout', 'retry_interval' => 'retry_interval', ); protected $supportsCustomVars = true; protected $supportsGroups = true; protected $supportsImports = true; protected $supportsFields = true; protected $supportsChoices = true; protected $supportedInLegacy = true; /** @var HostGroupMembershipResolver */ protected $hostgroupMembershipResolver; protected $uuidColumn = 'uuid'; public static function enumProperties( DbConnection $connection = null, $prefix = '', $filter = null ) { $hostProperties = array(); if ($filter === null) { $filter = new PropertiesFilter(); } $realProperties = array_merge(['templates'], static::create()->listProperties()); sort($realProperties); if ($filter->match(PropertiesFilter::$HOST_PROPERTY, 'name')) { $hostProperties[$prefix . 'name'] = 'name'; } foreach ($realProperties as $prop) { if (!$filter->match(PropertiesFilter::$HOST_PROPERTY, $prop)) { continue; } if (substr($prop, -3) === '_id') { if ($prop === 'template_choice_id') { continue; } $prop = substr($prop, 0, -3); } $hostProperties[$prefix . $prop] = $prop; } unset($hostProperties[$prefix . 'uuid']); unset($hostProperties[$prefix . 'custom_endpoint_name']); $hostVars = array(); if ($connection instanceof Db) { foreach ($connection->fetchDistinctHostVars() as $var) { if ($filter->match(PropertiesFilter::$CUSTOM_PROPERTY, $var->varname, $var)) { if ($var->datatype) { $hostVars[$prefix . 'vars.' . $var->varname] = sprintf( '%s (%s)', $var->varname, $var->caption ); } else { $hostVars[$prefix . 'vars.' . $var->varname] = $var->varname; } } } } //$properties['vars.*'] = 'Other custom variable'; ksort($hostVars); $props = mt('director', 'Host properties'); $vars = mt('director', 'Custom variables'); $properties = array(); if (!empty($hostProperties)) { $properties[$props] = $hostProperties; $properties[$props][$prefix . 'groups'] = 'Groups'; } if (!empty($hostVars)) { $properties[$vars] = $hostVars; } return $properties; } public function getCheckCommand() { $id = $this->getSingleResolvedProperty('check_command_id'); return IcingaCommand::loadWithAutoIncId( $id, $this->getConnection() ); } public function hasCheckCommand() { return $this->getSingleResolvedProperty('check_command_id') !== null; } public function renderToConfig(IcingaConfig $config) { parent::renderToConfig($config); // TODO: We might alternatively let the whole config fail in case we have // used use_agent together with a legacy config if (! $config->isLegacy()) { $this->renderAgentZoneAndEndpoint($config); } } public function renderAgentZoneAndEndpoint(IcingaConfig $config = null) { if (!$this->isObject()) { return; } if ($this->isDisabled()) { return; } if ($this->getRenderingZone($config) === self::RESOLVE_ERROR) { return; } if ($this->getSingleResolvedProperty('has_agent') !== 'y') { return; } $name = $this->getEndpointName(); if (IcingaEndpoint::exists($name, $this->connection)) { return; } $props = array( 'object_name' => $name, 'object_type' => 'object', 'log_duration' => 0 ); if ($this->getSingleResolvedProperty('master_should_connect') === 'y') { $props['host'] = $this->getSingleResolvedProperty('address'); } $props['zone_id'] = $this->getSingleResolvedProperty('zone_id'); $endpoint = IcingaEndpoint::create($props, $this->connection); $zone = IcingaZone::create(array( 'object_name' => $name, ), $this->connection)->setEndpointList(array($name)); if ($props['zone_id']) { $zone->parent_id = $props['zone_id']; } else { $zone->parent = $this->connection->getMasterZoneName(); } $pre = 'zones.d/' . $this->getRenderingZone($config) . '/'; $config->configFile($pre . 'agent_endpoints')->addObject($endpoint); $config->configFile($pre . 'agent_zones')->addObject($zone); } /** // @codingStandardsIgnoreStart * @param $value * @return string */ protected function renderCustom_endpoint_name($value) { // @codingStandardsIgnoreEnd // When feature flag feature_custom_endpoint is enabled, render custom var if ($this->connection->settings()->get('feature_custom_endpoint') === 'y') { return c::renderKeyValue('vars._director_custom_endpoint_name', c::renderString($value)); } return ''; } /** * Returns the hostname or custom endpoint name of the Icinga agent * * @return string */ public function getEndpointName() { $name = $this->getObjectName(); if ($this->connection->settings()->get('feature_custom_endpoint') === 'y') { if (($customName = $this->get('custom_endpoint_name')) !== null) { $name = $customName; } } return $name; } public function getAgentListenPort() { $conn = $this->connection; $name = $this->getObjectName(); if (IcingaEndpoint::exists($name, $conn)) { return IcingaEndpoint::load($name, $conn)->getResolvedPort(); } else { return 5665; } } public function getUniqueIdentifier() { if ($this->isTemplate()) { return $this->getObjectName(); } else { throw new RuntimeException( 'getUniqueIdentifier() is supported by Host Templates only' ); } } protected function rendersConditionalTemplate(): bool { return $this->getRenderingZone() === self::ALL_NON_GLOBAL_ZONES; } protected function getDefaultZone(IcingaConfig $config = null) { if ($this->isTemplate()) { return self::ALL_NON_GLOBAL_ZONES; } return parent::getDefaultZone(); } public function beforeDelete() { foreach ($this->fetchServices() as $service) { $service->delete(); } foreach ($this->fetchServiceSets() as $set) { $set->delete(); } parent::beforeDelete(); } public function hasAnyOverridenServiceVars() { $varname = $this->getServiceOverrivesVarname(); return isset($this->vars()->$varname); } public function getAllOverriddenServiceVars() { if ($this->hasAnyOverridenServiceVars()) { $varname = $this->getServiceOverrivesVarname(); return $this->vars()->$varname->getValue(); } else { return (object) array(); } } public function hasOverriddenServiceVars($service) { $all = $this->getAllOverriddenServiceVars(); return property_exists($all, $service); } public function getOverriddenServiceVars($service) { if ($this->hasOverriddenServiceVars($service)) { $all = $this->getAllOverriddenServiceVars(); return $all->$service; } else { return (object) array(); } } public function overrideServiceVars($service, $vars) { // For PHP < 5.5.0: $array = (array) $vars; if (empty($array)) { return $this->unsetOverriddenServiceVars($service); } $all = $this->getAllOverriddenServiceVars(); $all->$service = $vars; $varname = $this->getServiceOverrivesVarname(); $this->vars()->$varname = $all; return $this; } public function unsetOverriddenServiceVars($service) { if ($this->hasOverriddenServiceVars($service)) { $all = (array) $this->getAllOverriddenServiceVars(); unset($all[$service]); $varname = $this->getServiceOverrivesVarname(); if (empty($all)) { unset($this->vars()->$varname); } else { $this->vars()->$varname = (object) $all; } } return $this; } protected function notifyResolvers() { $resolver = $this->getHostGroupMembershipResolver(); $resolver->addObject($this); $resolver->refreshDb(); return $this; } protected function getHostGroupMembershipResolver() { if ($this->hostgroupMembershipResolver === null) { $this->hostgroupMembershipResolver = new HostGroupMembershipResolver( $this->getConnection() ); } return $this->hostgroupMembershipResolver; } public function setHostGroupMembershipResolver(HostGroupMembershipResolver $resolver) { $this->hostgroupMembershipResolver = $resolver; return $this; } protected function getServiceOverrivesVarname() { return $this->connection->settings()->override_services_varname; } /** * Internal property, will not be rendered * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ protected function renderHas_Agent() { return ''; } /** * Internal property, will not be rendered * * @return string */ protected function renderMaster_should_connect() { return ''; } /** * Internal property, will not be rendered * * @return string */ protected function renderApi_key() { return ''; } /** * Internal property, will not be rendered * * @return string */ protected function renderTemplate_choice_id() { return ''; } /** * Internal property, will not be rendered * * @return string */ protected function renderAccept_config() { // @codingStandardsIgnoreEnd return ''; } /** * @codingStandardsIgnoreStart * * @return string */ protected function renderLegacyDisplay_Name() { // @codingStandardsIgnoreEnd return c1::renderKeyValue('display_name', $this->display_name); } protected function renderLegacyVolatile() { // not available for hosts in Icinga 1.x return; } protected function renderLegacyCustomExtensions() { $str = parent::renderLegacyCustomExtensions(); if (($alias = $this->vars()->get('alias')) !== null) { $str .= c1::renderKeyValue('alias', $alias->getValue()); } return $str; } /** * @return IcingaService[] */ public function fetchServices() { $connection = $this->getConnection(); $db = $connection->getDbAdapter(); /** @var IcingaService[] $services */ $services = IcingaService::loadAll( $connection, $db->select()->from('icinga_service') ->where('host_id = ?', $this->get('id')) ); return $services; } /** * @return IcingaServiceSet[] */ public function fetchServiceSets() { $connection = $this->getConnection(); $db = $connection->getDbAdapter(); /** @var IcingaServiceSet[] $sets */ $sets = IcingaServiceSet::loadAll( $connection, $db->select()->from('icinga_service_set') ->where('host_id = ?', $this->get('id')) ); return $sets; } /** * @return string */ public function generateApiKey() { $key = sha1( (string) microtime(false) . $this->getObjectName() . rand(1, 1000000) ); if ($this->dbHasApiKey($key)) { $key = $this->generateApiKey(); } $this->set('api_key', $key); return $key; } protected function dbHasApiKey($key) { $db = $this->getDb(); $query = $db->select()->from( ['o' => $this->getTableName()], 'o.api_key' )->where('api_key = ?', $key); return $db->fetchOne($query) === $key; } public static function loadWithApiKey($key, Db $db) { $query = $db->getDbAdapter() ->select() ->from('icinga_host') ->where('api_key IS NOT NULL') ->query(); foreach ($query as $row) { if (hash_equals($row->api_key, $key)) { return (new static())->setConnection($db)->setDbProperties($row); } } throw new NotFoundError('Got invalid API key "%s"', $key); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaHostField.php000066400000000000000000000006001516513262500272270ustar00rootroot00000000000000 null, 'datafield_id' => null, 'is_required' => null, 'var_filter' => null, ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaHostGroup.php000066400000000000000000000016451516513262500273120ustar00rootroot00000000000000hostgroupMembershipResolver === null) { $this->hostgroupMembershipResolver = new HostGroupMembershipResolver( $this->getConnection() ); } return $this->hostgroupMembershipResolver; } public function setHostGroupMembershipResolver(HostGroupMembershipResolver $resolver) { $this->hostgroupMembershipResolver = $resolver; return $this; } protected function getMemberShipResolver() { return $this->getHostGroupMembershipResolver(); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaHostGroupAssignment.php000066400000000000000000000006501516513262500313360ustar00rootroot00000000000000 null, 'service_id' => null, 'filter_string' => null, ); protected $relations = array( 'service' => 'IcingaHostGroup', ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaHostVar.php000066400000000000000000000007521516513262500267440ustar00rootroot00000000000000 null, 'varname' => null, 'varvalue' => null, 'format' => null, ); public function onInsert() { } public function onUpdate() { } public function onDelete() { } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaNotification.php000066400000000000000000000151031516513262500300000ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'apply_to' => null, 'host_id' => null, 'service_id' => null, // 'users' => null, // 'user_groups' => null, 'times_begin' => null, 'times_end' => null, 'command_id' => null, 'notification_interval' => null, 'period_id' => null, 'zone_id' => null, 'users_var' => null, 'user_groups_var' => null, 'assign_filter' => null, ]; protected $uuidColumn = 'uuid'; protected $supportsCustomVars = true; protected $supportsFields = true; protected $supportsImports = true; protected $supportsApplyRules = true; protected $relatedSets = [ 'states' => 'StateFilterSet', 'types' => 'TypeFilterSet', ]; protected $multiRelations = [ 'users' => 'IcingaUser', 'user_groups' => 'IcingaUserGroup', ]; protected $relations = [ 'zone' => 'IcingaZone', 'host' => 'IcingaHost', 'service' => 'IcingaService', 'command' => 'IcingaCommand', 'period' => 'IcingaTimePeriod', ]; protected $intervalProperties = [ 'notification_interval' => 'interval', 'times_begin' => 'times_begin', 'times_end' => 'times_end', ]; protected function prefersGlobalZone() { return false; } /** * @codingStandardsIgnoreStart * @return string */ protected function renderTimes_begin() { // @codingStandardsIgnoreEnd return c::renderKeyValue('times.begin', c::renderInterval($this->get('times_begin'))); } /** * @codingStandardsIgnoreStart * @return string */ protected function renderUsers_var() { // @codingStandardsIgnoreEnd return ''; } /** * @codingStandardsIgnoreStart * @return string */ protected function renderUser_groups_var() { // @codingStandardsIgnoreEnd return ''; } protected function renderUserVarsSuffixFor($property) { $varName = $this->getResolvedProperty("{$property}_var"); if ($varName === null) { return ''; } $varSuffix = CustomVariables::renderKeySuffix($varName); $indent = ' '; $objectType = $this->get('apply_to'); if ($objectType === 'service') { return "{$indent}if (service.vars$varSuffix) {\n" . c::renderKeyOperatorValue($property, '+=', "service.vars$varSuffix", $indent . ' ') . "$indent} else {\n" . $this->getHostSnippet($indent . ' ') . "$indent if (host.vars$varSuffix) { " . c::renderKeyOperatorValue($property, '+=', "host.vars$varSuffix }", '') . "$indent}\n"; } elseif ($objectType === 'host') { return $this->getHostSnippet() . "{$indent}if (host.vars$varSuffix) { " . c::renderKeyOperatorValue($property, '+=', "host.vars$varSuffix }"); } return ''; } protected function getHostSnippet($indent = ' ') { return "{$indent}if (! host) {\n" . "$indent var host = get_host(host_name)\n" . "$indent}\n"; } protected function renderSuffix() { return $this->renderUserVarsSuffixFor('users') . $this->renderUserVarsSuffixFor('user_groups') . parent::renderSuffix(); } /** * @codingStandardsIgnoreStart * @return string */ protected function renderTimes_end() { // @codingStandardsIgnoreEnd return c::renderKeyValue('times.end', c::renderInterval($this->get('times_end'))); } public function getUniqueIdentifier() { return $this->getObjectName(); } /** * Do not render internal property apply_to * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ public function renderApply_to() { // @codingStandardsIgnoreEnd return ''; } protected function renderObjectHeader() { if ($this->isApplyRule()) { if (($to = $this->get('apply_to')) === null) { throw new RuntimeException(sprintf( 'No "apply_to" object type has been set for Applied notification "%s"', $this->getObjectName() )); } return sprintf( "%s %s %s to %s {\n", $this->getObjectTypeName(), $this->getType(), c::renderString($this->getObjectName()), ucfirst($to) ); } else { return parent::renderObjectHeader(); } } /** * Render host_id as host_name * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ public function renderHost_id() { // @codingStandardsIgnoreEnd return $this->renderRelationProperty('host', $this->get('host_id'), 'host_name'); } /** * Render service_id as service_name * * @codingStandardsIgnoreStart * @return string */ public function renderService_id() { // @codingStandardsIgnoreEnd return $this->renderRelationProperty('service', $this->get('service_id'), 'service_name'); } protected function setKey($key) { if (is_int($key)) { $this->id = $key; } elseif (is_array($key)) { foreach (['id', 'host_id', 'service_id', 'object_name'] as $k) { if (array_key_exists($k, $key)) { $this->set($k, $key[$k]); } } } else { return parent::setKey($key); } return $this; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaNotificationField.php000066400000000000000000000006441516513262500307500ustar00rootroot00000000000000 null, 'datafield_id' => null, 'is_required' => null, 'var_filter' => null, ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaObject.php000066400000000000000000002507501516513262500265710ustar00rootroot00000000000000 PropertyClass ]; protected $relatedSets = [ // property => ExtensibleSetClass ]; protected $multiRelations = [ // property => IcingaObjectClass ]; /** @var IcingaObjectMultiRelations[] */ protected $loadedMultiRelations = []; /** * Allows to set properties pointing to related objects by name without * loading the related object. * * @var array */ protected $unresolvedRelatedProperties = []; protected $loadedRelatedSets = []; // Will be rendered first, before imports protected $prioritizedProperties = []; protected $propertiesNotForRendering = [ 'id', 'object_name', 'object_type', ]; /** * Array of interval property names * * Those will be automagically munged to integers (seconds) and rendered * as durations (e.g. 2m 10s). Array expects (propertyName => renderedKey) * * @var array */ protected $intervalProperties = []; /** @var Db */ protected $connection; private $vars; /** @var IcingaObjectGroups */ private $groups; private $imports; /** @var IcingaTimePeriodRanges - TODO: generic ranges */ private $ranges; private $shouldBeRemoved = false; private $resolveCache = []; private $cachedPlainUnmodified; private $templateResolver; protected static $tree; /** * @return Db */ public function getConnection() { return $this->connection; } public function propertyIsInterval($property) { return array_key_exists($property, $this->intervalProperties); } /** * Whether a property ends with _id and might refer another object * * @param $property string Property name, like zone_id * * @return bool */ public function propertyIsRelation($property) { if ($key = $this->stripIdSuffix($property)) { return $this->hasRelation($key); } return false; } protected function stripIdSuffix($key) { $end = substr($key, -3); if ('_id' === $end) { return substr($key, 0, -3); } return false; } public function propertyIsRelatedSet($property) { return array_key_exists($property, $this->relatedSets); } public function propertyIsMultiRelation($property) { return array_key_exists($property, $this->multiRelations); } public function listMultiRelations() { return array_keys($this->multiRelations); } public function getMultiRelation($property) { if (! $this->hasLoadedMultiRelation($property)) { $this->loadMultiRelation($property); } return $this->loadedMultiRelations[$property]; } public function setMultiRelation($property, $values) { $this->getMultiRelation($property)->set($values); return $this; } private function loadMultiRelation($property) { if ($this->hasBeenLoadedFromDb()) { $rel = IcingaObjectMultiRelations::loadForStoredObject( $this, $property, $this->multiRelations[$property] ); } else { $rel = new IcingaObjectMultiRelations( $this, $property, $this->multiRelations[$property] ); } $this->loadedMultiRelations[$property] = $rel; } private function hasLoadedMultiRelation($property) { return array_key_exists($property, $this->loadedMultiRelations); } private function loadAllMultiRelations() { foreach (array_keys($this->multiRelations) as $key) { if (! $this->hasLoadedMultiRelation($key)) { $this->loadMultiRelation($key); } } ksort($this->loadedMultiRelations); return $this->loadedMultiRelations; } protected function getRelatedSetClass($property) { $prefix = '\\Icinga\\Module\\Director\\IcingaConfig\\'; return $prefix . $this->relatedSets[$property]; } /** * @param $property * @return ExtensibleSet */ protected function getRelatedSet($property) { if (! array_key_exists($property, $this->loadedRelatedSets)) { /** @var ExtensibleSet $class */ $class = $this->getRelatedSetClass($property); $this->loadedRelatedSets[$property] = $class::forIcingaObject($this, $property); } return $this->loadedRelatedSets[$property]; } /** * @return ExtensibleSet[] */ protected function relatedSets() { $sets = []; foreach ($this->relatedSets as $key => $class) { $sets[$key] = $this->getRelatedSet($key); } return $sets; } /** * Whether the given property name is a short name for a relation * * This might be 'zone' for 'zone_id' * * @param string $property Property name * * @return bool */ public function hasRelation($property) { return array_key_exists($property, $this->relations); } protected function getRelationClass($property) { return __NAMESPACE__ . '\\' . $this->relations[$property]; } protected function getRelationObjectClass($property) { return $this->relations[$property]; } /** * @param $property * @return IcingaObject */ public function getRelated($property) { return $this->getRelatedObject($property, $this->{$property . '_id'}); } /** * @param $property * @param $id * @return string */ public function getRelatedObjectName($property, $id) { return $this->getRelatedObject($property, $id)->getObjectName(); } /** * @param $property * @param $id * @return IcingaObject */ protected function getRelatedObject($property, $id) { /** @var IcingaObject $class */ $class = $this->getRelationClass($property); try { $object = $class::loadWithAutoIncId($id, $this->connection); } catch (NotFoundError $e) { throw new RuntimeException($e->getMessage(), 0, $e); } return $object; } /** * @param $property * @return IcingaObject|null */ public function getResolvedRelated($property) { $id = $this->getSingleResolvedProperty($property . '_id'); if ($id) { return $this->getRelatedObject($property, $id); } return null; } public function prefetchAllRelatedTypes() { foreach (array_unique(array_values($this->relations)) as $relClass) { /** @var static $class */ $class = __NAMESPACE__ . '\\' . $relClass; $class::prefetchAll($this->getConnection()); } } public static function prefetchAllRelationsByType($type, Db $db) { /** @var static $class */ $class = DbObjectTypeRegistry::classByType($type); /** @var static $dummy */ $dummy = $class::create([], $db); $dummy->prefetchAllRelatedTypes(); } /** * Whether this Object supports custom variables * * @return bool */ public function supportsCustomVars() { return $this->supportsCustomVars; } /** * Whether there exist Groups for this object type * * @return bool */ public function supportsGroups() { return $this->supportsGroups; } /** * Whether this Object makes use of (time) ranges * * @return bool */ public function supportsRanges() { return $this->supportsRanges; } /** * Whether this object supports (command) Arguments * * @return bool */ public function supportsArguments() { return $this instanceof ObjectWithArguments; } /** * Whether this object supports inheritance through the "imports" property * * @return bool */ public function supportsImports() { return $this->supportsImports; } /** * Whether this object allows controlled custom var access through fields * * @return bool */ public function supportsFields() { return $this->supportsFields; } /** * Whether this object can be rendered as 'apply Object' * * @return bool */ public function supportsApplyRules() { return $this->supportsApplyRules; } /** * Whether this object supports 'assign' properties * * @return bool */ public function supportsAssignments() { return $this->isApplyRule(); } /** * Whether this object can be part of a 'set' * * @return bool */ public function supportsSets() { return $this->supportsSets; } /** * Whether this object supports template-based Choices * * @return bool */ public function supportsChoices() { return $this->supportsChoices; } public function setAssignments($value) { return IcingaObjectLegacyAssignments::applyToObject($this, $value); } /** * @codingStandardsIgnoreStart * * @param Filter|string $filter * * @throws LogicException * * @return self */ public function setAssign_filter($filter) { if (! $this->supportsAssignments() && $filter !== null) { if ($this->hasProperty('object_type')) { $type = $this->get('object_type'); } else { $type = get_class($this); } if ($type === null) { throw new LogicException( 'Cannot set assign_filter unless object_type has been set' ); } throw new LogicException(sprintf( 'I can only assign for applied objects or objects with native' . ' support for assignments, got %s', $type )); } // @codingStandardsIgnoreEnd if ($filter instanceof Filter) { $filter = $filter->toQueryString(); } return $this->reallySet('assign_filter', $filter); } /** * It sometimes makes sense to defer lookups for related properties. This * kind of lazy-loading allows us to for example set host = 'localhost' and * render an object even when no such host exists. Think of the activity log, * one might want to visualize a history host or service template even when * the related command has been deleted in the meantime. * * @return self */ public function resolveUnresolvedRelatedProperties() { foreach ($this->unresolvedRelatedProperties as $name => $p) { $this->resolveUnresolvedRelatedProperty($name); } return $this; } public function getUnresolvedRelated($property) { if ($this->hasRelation($property)) { $property .= '_id'; if (isset($this->unresolvedRelatedProperties[$property])) { return $this->unresolvedRelatedProperties[$property]; } return null; } throw new RuntimeException(sprintf( '%s "%s" has no %s reference', $this->getShortTableName(), $this->getObjectName(), $property )); } /** * @param $name */ protected function resolveUnresolvedRelatedProperty($name) { $short = substr($name, 0, -3); /** @var IcingaObject $class */ $class = $this->getRelationClass($short); try { $object = $class::load( $this->unresolvedRelatedProperties[$name], $this->connection ); } catch (NotFoundError $e) { // Hint: eventually a NotFoundError would be better throw new RuntimeException(sprintf( 'Unable to load object (%s: %s) referenced from %s "%s", %s', $short, $this->unresolvedRelatedProperties[$name], $this->getShortTableName(), $this->getObjectName(), lcfirst($e->getMessage()) ), $e->getCode(), $e); } $id = $object->get('id'); // Happens when load() get's a branched object, created in the branch if ($id !== null) { $this->reallySet($name, $id); unset($this->unresolvedRelatedProperties[$name]); } } /** * @return bool */ public function hasBeenModified() { if (parent::hasBeenModified()) { return true; } if ($this->hasUnresolvedRelatedProperties()) { $this->resolveUnresolvedRelatedProperties(); // Duplicates above code, but this makes it faster: if (parent::hasBeenModified()) { return true; } } if ($this->supportsCustomVars() && $this->vars !== null && $this->vars()->hasBeenModified()) { return true; } if ($this->supportsGroups() && $this->groups !== null && $this->groups()->hasBeenModified()) { return true; } if ($this->supportsImports() && $this->imports !== null && $this->imports()->hasBeenModified()) { return true; } if ($this->supportsRanges() && $this->ranges !== null && $this->ranges()->hasBeenModified()) { return true; } if ( $this instanceof ObjectWithArguments && $this->gotArguments() && $this->arguments()->hasBeenModified() ) { return true; } foreach ($this->loadedRelatedSets as $set) { if ($set->hasBeenModified()) { return true; } } foreach ($this->loadedMultiRelations as $rel) { if ($rel->hasBeenModified()) { return true; } } return false; } protected function hasUnresolvedRelatedProperties() { return ! empty($this->unresolvedRelatedProperties); } protected function hasUnresolvedRelatedProperty($name) { return array_key_exists($name, $this->unresolvedRelatedProperties); } /** * @param $key * @return mixed */ protected function getRelationId($key) { if ($this->hasUnresolvedRelatedProperty($key)) { $this->resolveUnresolvedRelatedProperty($key); } return parent::get($key); } /** * @param $key * @return string|null */ protected function getRelatedProperty($key) { $idKey = $key . '_id'; if ($this->hasUnresolvedRelatedProperty($idKey)) { return $this->unresolvedRelatedProperties[$idKey]; } if ($id = $this->get($idKey)) { /** @var IcingaObject $class */ $class = $this->getRelationClass($key); try { $object = $class::loadWithAutoIncId($id, $this->connection); } catch (NotFoundError $e) { throw new RuntimeException($e->getMessage(), 0, $e); } return $object->getObjectName(); } return null; } /** * @param string $key * @return \Icinga\Module\Director\CustomVariable\CustomVariable|mixed|null */ public function get($key) { if (substr($key, 0, 5) === 'vars.') { $var = $this->vars()->get(substr($key, 5)); if ($var === null) { return $var; } return $var->getValue(); } // e.g. zone_id if ($this->propertyIsRelation($key)) { return $this->getRelationId($key); } // e.g. zone if ($this->hasRelation($key)) { return $this->getRelatedProperty($key); } if ($this->propertyIsRelatedSet($key)) { return $this->getRelatedSet($key)->toPlainObject(); } if ($this->propertyIsMultiRelation($key)) { return $this->getMultiRelation($key)->listRelatedNames(); } return parent::get($key); } public function setProperties($props) { if (is_array($props)) { if (array_key_exists('object_type', $props) && key($props) !== 'object_type') { $type = $props['object_type']; unset($props['object_type']); $props = ['object_type' => $type] + $props; } } return parent::setProperties($props); } public function set($key, $value) { if ($key === 'vars') { $value = (array) $value; $unset = []; foreach ($this->vars() as $k => $f) { if (! array_key_exists($k, $value)) { $unset[] = $k; } } foreach ($unset as $k) { unset($this->vars()->$k); } foreach ($value as $k => $v) { $this->vars()->set($k, $v); } return $this; } if (substr($key, 0, 5) === 'vars.') { //TODO: allow for deep keys $this->vars()->set(substr($key, 5), $value); return $this; } if ( $this instanceof ObjectWithArguments && substr($key, 0, 10) === 'arguments.' ) { $this->arguments()->set(substr($key, 10), $value); return $this; } // e.g. zone_id if ($this->propertyIsRelation($key)) { return $this->setRelation($key, $value); } // e.g. zone if ($this->hasRelation($key)) { return $this->setUnresolvedRelation($key, $value); } if ($this->propertyIsMultiRelation($key)) { $this->setMultiRelation($key, $value); return $this; } if ($this->propertyIsRelatedSet($key)) { $this->getRelatedSet($key)->set($value); return $this; } if ($this->propertyIsInterval($key)) { return parent::set($key, c::parseInterval($value)); } return parent::set($key, $value); } private function setRelation($key, $value) { if ((int) $key !== (int) $this->$key) { unset($this->unresolvedRelatedProperties[$key]); } return parent::set($key, $value); } private function setUnresolvedRelation($key, $value) { if ($value === null || strlen($value) === 0) { unset($this->unresolvedRelatedProperties[$key . '_id']); return parent::set($key . '_id', null); } $this->unresolvedRelatedProperties[$key . '_id'] = $value; return $this; } protected function setRanges($ranges) { $this->ranges()->set((array) $ranges); return $this; } protected function getRanges() { return $this->ranges()->getValues(); } protected function setDisabled($disabled) { return $this->reallySet('disabled', DbDataFormatter::normalizeBoolean($disabled)); } public function isDisabled() { return $this->get('disabled') === 'y'; } public function markForRemoval($remove = true) { $this->shouldBeRemoved = $remove; return $this; } public function shouldBeRemoved() { return $this->shouldBeRemoved; } public function shouldBeRenamed() { return $this->hasBeenLoadedFromDb() && $this->getOriginalProperty('object_name') !== $this->getObjectName(); } /** * @return IcingaObjectGroups */ public function groups() { $this->assertGroupsSupport(); if ($this->groups === null) { if ($this->hasBeenLoadedFromDb() && $this->get('id')) { $this->groups = IcingaObjectGroups::loadForStoredObject($this); } else { $this->groups = new IcingaObjectGroups($this); } } return $this->groups; } public function hasModifiedGroups() { $this->assertGroupsSupport(); if ($this->groups === null) { return false; } return $this->groups->hasBeenModified(); } public function getAppliedGroups() { $this->assertGroupsSupport(); if (! $this instanceof IcingaHost) { throw new RuntimeException('getAppliedGroups is only available for hosts currently!'); } if (! $this->hasBeenLoadedFromDb()) { // There are no stored related/resolved groups. We'll also not resolve // them here on demand. return []; } $id = $this->get('id'); if ($id === null) { // Do not fail for branches. Should be handled otherwise // TODO: throw an Exception, once we are able to deal with this return []; } $type = strtolower($this->getType()); $query = $this->db->select()->from( ['gr' => "icinga_{$type}group_{$type}_resolved"], ['g.object_name'] )->join( ['g' => "icinga_{$type}group"], "g.id = gr.{$type}group_id", [] )->joinLeft( ['go' => "icinga_{$type}group_{$type}"], "go.{$type}group_id = gr.{$type}group_id AND go.{$type}_id = " . (int) $id, [] )->where( "gr.{$type}_id = ?", (int) $id )->where("go.{$type}_id IS NULL")->order('g.object_name'); return $this->db->fetchCol($query); } /** * @return IcingaTimePeriodRanges */ public function ranges() { $this->assertRangesSupport(); if ($this->ranges === null) { /** @var IcingaTimePeriodRanges $class */ $class = $this->getRangeClass(); if ($this->hasBeenLoadedFromDb()) { $this->ranges = $class::loadForStoredObject($this); } else { $this->ranges = new $class($this); } } return $this->ranges; } protected function getRangeClass() { if ($this->rangeClass === null) { $this->rangeClass = get_class($this) . 'Ranges'; } return $this->rangeClass; } /** * @return IcingaObjectImports */ public function imports() { $this->assertImportsSupport(); if ($this->imports === null) { // can not use hasBeenLoadedFromDb() when in onStore() if ($this->getProperty('id') !== null) { $this->imports = IcingaObjectImports::loadForStoredObject($this); } else { $this->imports = new IcingaObjectImports($this); } } return $this->imports; } public function gotImports() { return $this->imports !== null; } public function setImports($imports) { if (! is_array($imports) && $imports !== null) { $imports = [$imports]; } try { $this->imports()->set($imports); } catch (NestingError $e) { $this->imports = new IcingaObjectImports($this); // Force modification, otherwise it won't be stored when empty $this->imports->setModified()->set($imports); } if ($this->imports()->hasBeenModified()) { $this->invalidateResolveCache(); } } public function getImports() { return $this->listImportNames(); } /** * @deprecated This should no longer be in use * @return IcingaTemplateResolver */ public function templateResolver() { if ($this->templateResolver === null) { $this->templateResolver = new IcingaTemplateResolver($this); } return $this->templateResolver; } public function getResolvedProperty($key, $default = null) { if (array_key_exists($key, $this->unresolvedRelatedProperties)) { $this->resolveUnresolvedRelatedProperty($key); $this->invalidateResolveCache(); } $properties = $this->getResolvedProperties(); if (property_exists($properties, $key)) { return $properties->$key; } return $default; } public function getInheritedProperty($key, $default = null) { if (array_key_exists($key, $this->unresolvedRelatedProperties)) { $this->resolveUnresolvedRelatedProperty($key); $this->invalidateResolveCache(); } $properties = $this->getInheritedProperties(); if (property_exists($properties, $key)) { return $properties->$key; } return $default; } public function getInheritedVar($varname) { try { $vars = $this->getInheritedVars(); } catch (NestingError $e) { return null; } if (property_exists($vars, $varname)) { return $vars->$varname; } return null; } public function getResolvedVar($varName) { try { $vars = $this->getResolvedVars(); } catch (NestingError $e) { return null; } if (property_exists($vars, $varName)) { return $vars->$varName; } return null; } public function getOriginForVar($varName) { try { $origins = $this->getOriginsVars(); } catch (NestingError $e) { return null; } if (property_exists($origins, $varName)) { return $origins->$varName; } return null; } public function getResolvedProperties() { return $this->getResolved('Properties'); } public function getInheritedProperties() { return $this->getInherited('Properties'); } public function getOriginsProperties() { return $this->getOrigins('Properties'); } public function resolveProperties() { return $this->resolve('Properties'); } public function getResolvedVars() { return $this->getResolved('Vars'); } public function getInheritedVars() { return $this->getInherited('Vars'); } public function resolveVars() { return $this->resolve('Vars'); } public function getOriginsVars() { return $this->getOrigins('Vars'); } public function getVars() { $vars = []; foreach ($this->vars() as $key => $var) { if ($var->hasBeenDeleted()) { continue; } $vars[$key] = $var->getValue(); } ksort($vars); return (object) $vars; } /** * This is mostly for magic getters * @return array */ public function getGroups() { return $this->groups()->listGroupNames(); } /** * @return array * @throws NotFoundError */ public function listInheritedGroupNames() { $parents = $this->imports()->getObjects(); /** @var IcingaObject $parent */ foreach (array_reverse($parents) as $parent) { $inherited = $parent->getGroups(); if (! empty($inherited)) { return $inherited; } } return []; } public function setGroups($groups) { $this->groups()->set($groups); return $this; } /** * @return array * @throws NotFoundError */ public function listResolvedGroupNames() { $groups = $this->groups()->listGroupNames(); if (empty($groups)) { return $this->listInheritedGroupNames(); } return $groups; } /** * @param $group * @return bool * @throws NotFoundError */ public function hasGroup($group) { if ($group instanceof static) { $group = $group->getObjectName(); } return in_array($group, $this->listResolvedGroupNames()); } protected function getResolved($what) { $func = 'resolve' . $what; $res = $this->$func(); return $res['_MERGED_']; } protected function getInherited($what) { $func = 'resolve' . $what; $res = $this->$func(); return $res['_INHERITED_']; } protected function getOrigins($what) { $func = 'resolve' . $what; $res = $this->$func(); return $res['_ORIGINS_']; } protected function hasResolveCached($what) { return array_key_exists($what, $this->resolveCache); } protected function & getResolveCached($what) { return $this->resolveCache[$what]; } protected function storeResolvedCache($what, $vals) { $this->resolveCache[$what] = $vals; } public function invalidateResolveCache() { $this->resolveCache = []; return $this; } public function countDirectDescendants() { $db = $this->getDb(); $table = $this->getTableName(); $type = $this->getShortTableName(); $query = $db->select()->from( ['oi' => $table . '_inheritance'], ['cnt' => 'COUNT(*)'] )->where('oi.parent_' . $type . '_id = ?', (int) $this->get('id')); return $db->fetchOne($query); } protected function triggerLoopDetection() { // $this->templateResolver()->listResolvedParentIds(); } public function getSingleResolvedProperty($key, $default = null) { if (array_key_exists($key, $this->unresolvedRelatedProperties)) { $this->resolveUnresolvedRelatedProperty($key); $this->invalidateResolveCache(); } if ($my = $this->get($key)) { if ($my !== null) { return $my; } } /** @var IcingaObject[] $imports */ try { $imports = array_reverse($this->imports()->getObjects()); } catch (NotFoundError $e) { throw new RuntimeException($e->getMessage(), 0, $e); } // Eventually trigger loop detection $this->listAncestorIds(); foreach ($imports as $object) { $v = $object->getSingleResolvedProperty($key); if (null !== $v) { return $v; } } return $default; } protected function resolve($what) { if ($this->hasResolveCached($what)) { return $this->getResolveCached($what); } // Force exception if ($this->hasBeenLoadedFromDb()) { $this->triggerLoopDetection(); } $vals = []; $vals['_MERGED_'] = (object) []; $vals['_INHERITED_'] = (object) []; $vals['_ORIGINS_'] = (object) []; // $objects = $this->imports()->getObjects(); $objects = IcingaTemplateRepository::instanceByObject($this) ->getTemplatesIndexedByNameFor($this, true); $get = 'get' . $what; $getInherited = 'getInherited' . $what; $getOrigins = 'getOrigins' . $what; $blacklist = ['id', 'uuid', 'object_type', 'object_name', 'disabled']; foreach ($objects as $name => $object) { $origins = $object->$getOrigins(); foreach ($object->$getInherited() as $key => $value) { if (in_array($key, $blacklist)) { continue; } if (! property_exists($origins, $key)) { // TODO: Introduced with group membership resolver or // choices - this should not be required. Check this! continue; } // $vals[$name]->$key = $value; $vals['_MERGED_']->$key = $value; $vals['_INHERITED_']->$key = $value; $vals['_ORIGINS_']->$key = $origins->$key; } foreach ($object->$get() as $key => $value) { // TODO: skip if default value? if ($value === null) { continue; } if (in_array($key, $blacklist)) { continue; } $vals['_MERGED_']->$key = $value; $vals['_INHERITED_']->$key = $value; $vals['_ORIGINS_']->$key = $name; } } foreach ($this->$get() as $key => $value) { if ($value === null) { continue; } $vals['_MERGED_']->$key = $value; } $this->storeResolvedCache($what, $vals); return $vals; } public function matches(Filter $filter) { // TODO: speed up by passing only desired properties (filter columns) to // toPlainObject method /** @var FilterChain|FilterExpression $filter */ return $filter->matches($this->toPlainObject()); } protected function assertCustomVarsSupport() { if (! $this->supportsCustomVars()) { throw new LogicException(sprintf( 'Objects of type "%s" have no custom vars', $this->getType() )); } return $this; } protected function assertGroupsSupport() { if (! $this->supportsGroups()) { throw new LogicException(sprintf( 'Objects of type "%s" have no groups', $this->getType() )); } return $this; } protected function assertRangesSupport() { if (! $this->supportsRanges()) { throw new LogicException(sprintf( 'Objects of type "%s" have no ranges', $this->getType() )); } return $this; } protected function assertImportsSupport() { if (! $this->supportsImports()) { throw new LogicException(sprintf( 'Objects of type "%s" have no imports', $this->getType() )); } return $this; } /** * @return CustomVariables */ public function vars() { $this->assertCustomVarsSupport(); if ($this->vars === null) { if ($this->hasBeenLoadedFromDb()) { if (PrefetchCache::shouldBeUsed()) { $this->vars = PrefetchCache::instance()->vars($this); } else { if ($this->get('id')) { $this->vars = CustomVariables::loadForStoredObject($this); } else { $this->vars = new CustomVariables(); } } if ($this->getShortTableName() === 'host') { $this->vars->setOverrideKeyName( $this->getConnection()->settings()->override_services_varname ); } } else { $this->vars = new CustomVariables(); } } return $this->vars; } /** * @return bool */ public function hasInitializedVars() { $this->assertCustomVarsSupport(); return $this->vars !== null; } public function getVarsTableName() { return $this->getTableName() . '_var'; } public function getShortTableName() { // strlen('icinga_') = 7 return substr($this->getTableName(), 7); } public function getVarsIdColumn() { return $this->getShortTableName() . '_id'; } public function hasProperty($key) { if ($this->propertyIsRelatedSet($key)) { return true; } if ($this->propertyIsMultiRelation($key)) { return true; } return parent::hasProperty($key); } public function isObject() { return $this->hasProperty('object_type') && $this->get('object_type') === 'object'; } public function isTemplate() { return $this->hasProperty('object_type') && $this->get('object_type') === 'template'; } public function isExternal() { return $this->hasProperty('object_type') && $this->get('object_type') === 'external_object'; } public function isApplyRule() { return $this->hasProperty('object_type') && $this->get('object_type') === 'apply'; } public function setBeingLoadedFromDb() { if ($this instanceof ObjectWithArguments && $this->gotArguments()) { $this->arguments()->setBeingLoadedFromDb(); } if ($this->supportsImports() && $this->gotImports()) { $this->imports()->setBeingLoadedFromDb(); } if ($this->supportsCustomVars() && $this->vars !== null) { $this->vars()->setBeingLoadedFromDb(); } if ($this->supportsGroups() && $this->groups !== null) { $this->groups()->setBeingLoadedFromDb(); } if ($this->supportsRanges() && $this->ranges !== null) { $this->ranges()->setBeingLoadedFromDb(); } foreach ($this->loadedRelatedSets as $set) { $set->setBeingLoadedFromDb(); } foreach ($this->loadedMultiRelations as $multiRelation) { $multiRelation->setBeingLoadedFromDb(); } // This might trigger DB requests and 404's. We might want to defer this, but a call to // hasBeenModified triggers anyway: $this->resolveUnresolvedRelatedProperties(); parent::setBeingLoadedFromDb(); } /** * @throws NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException * @throws \Zend_Db_Adapter_Exception */ protected function storeRelatedObjects() { $this ->storeCustomVars() ->storeGroups() ->storeMultiRelations() ->storeImports() ->storeRanges() ->storeRelatedSets() ->storeArguments(); } /** * @throws NotFoundError */ protected function beforeStore() { $this->resolveUnresolvedRelatedProperties(); if ($this->gotImports()) { $this->imports()->getObjects(); } } /** * @throws NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException * @throws \Zend_Db_Adapter_Exception */ public function onInsert() { DirectorActivityLog::logCreation($this, $this->connection); $this->storeRelatedObjects(); } /** * @throws NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException * @throws \Zend_Db_Adapter_Exception */ public function onUpdate() { DirectorActivityLog::logModification($this, $this->connection); $this->storeRelatedObjects(); } public function onStore() { $this->notifyResolvers(); } /** * @return self */ protected function storeCustomVars() { if ($this->supportsCustomVars()) { $this->vars !== null && $this->vars()->storeToDb($this); } return $this; } /** * @return self */ protected function storeGroups() { if ($this->supportsGroups()) { $this->groups !== null && $this->groups()->store(); } return $this; } /** * @return self */ protected function storeMultiRelations() { foreach ($this->loadedMultiRelations as $rel) { $rel->store(); } return $this; } /** * @return self */ protected function storeRanges() { if ($this->supportsRanges()) { $this->ranges !== null && $this->ranges()->store(); } return $this; } /** * @return $this * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ protected function storeArguments() { if ($this instanceof ObjectWithArguments) { $this->gotArguments() && $this->arguments()->store(); } return $this; } protected function notifyResolvers() { } /** * @return $this */ protected function storeRelatedSets() { foreach ($this->loadedRelatedSets as $set) { if ($set->hasBeenModified()) { $set->store(); } } return $this; } /** * @return $this * @throws NotFoundError * @throws \Zend_Db_Adapter_Exception */ protected function storeImports() { if ($this->supportsImports()) { $this->imports !== null && $this->imports()->store(); } return $this; } public function beforeDelete() { $this->cachedPlainUnmodified = $this->getPlainUnmodifiedObject(); } public function getCachedUnmodifiedObject() { return $this->cachedPlainUnmodified; } public function onDelete() { DirectorActivityLog::logRemoval($this, $this->connection); } public function toSingleIcingaConfig() { $config = new IcingaConfig($this->connection); $object = $this; if ($object->isExternal()) { $object->set('object_type', 'object'); $wasExternal = true; } else { $wasExternal = false; } try { $object->renderToConfig($config); } catch (Exception $e) { $message = $e->getMessage(); $showTrace = false; if ($showTrace) { $message .= "\n" . $e->getTraceAsString(); } $config->configFile( 'failed-to-render' )->prepend( "/** Failed to render this object **/\n" . '/* ' . $message . ' */' ); } if ($wasExternal) { $object->set('object_type', 'external_object'); } return $config; } public function isSupportedInLegacy() { return $this->supportedInLegacy; } public function renderToLegacyConfig(IcingaConfig $config) { if ($this->isExternal()) { return; } if (! $this->isSupportedInLegacy()) { $config->configFile( 'director/ignored-objects', '.cfg' )->prepend( sprintf( "# Not supported for legacy config: %s object_name=%s\n", get_class($this), $this->getObjectName() ) ); return; } $filename = $this->getRenderingFilename(); $deploymentMode = $config->getDeploymentMode(); if ($deploymentMode === 'active-passive') { if ( $this->getSingleResolvedProperty('zone_id') && array_key_exists('enable_active_checks', $this->defaultProperties) ) { $passive = clone($this); $passive->set('enable_active_checks', false); $config->configFile( 'director/master/' . $filename, '.cfg' )->addLegacyObject($passive); } } elseif ($deploymentMode === 'masterless') { // no additional config } else { throw new LogicException(sprintf( 'Unsupported deployment mode: %s', $deploymentMode )); } $config->configFile( 'director/' . $this->getRenderingZone($config) . '/' . $filename, '.cfg' )->addLegacyObject($this); } public function renderToConfig(IcingaConfig $config) { if ($config->isLegacy()) { $this->renderToLegacyConfig($config); return; } if ($this->isExternal()) { return; } foreach ($this->getRenderingZones($config) as $zone) { $config->configFile( 'zones.d/' . $zone . '/' . $this->getRenderingFilename() )->addObject($this); } } protected function getRenderingZones(IcingaConfig $config): array { $zone = $this->getRenderingZone($config); if ($zone === self::ALL_NON_GLOBAL_ZONES) { return $config->listNonGlobalZones(); } return [$zone]; } public function getRenderingFilename() { $type = $this->getShortTableName(); if ($this->isTemplate()) { $filename = strtolower($type) . '_templates'; } elseif ($this->isApplyRule()) { $filename = strtolower($type) . '_apply'; } else { $filename = strtolower($type) . 's'; } return $filename; } /** * @param $zoneId * @param IcingaConfig|null $config * @return string * @throws NotFoundError */ protected function getNameForZoneId($zoneId, IcingaConfig $config = null) { // TODO: this is still ugly. if ($config === null) { return IcingaZone::loadWithAutoIncId( $zoneId, $this->getConnection() )->getObjectName(); } // Config has a lookup cache, is faster: return $config->getZoneName($zoneId); } public function getRenderingZone(IcingaConfig $config = null) { if ($this->hasUnresolvedRelatedProperty('zone_id')) { return $this->get('zone'); } if ($this->hasProperty('zone_id')) { try { if (! $this->supportsImports()) { if ($zoneId = $this->get('zone_id')) { return $this->getNameForZoneId($zoneId, $config); } } if ($zoneId = $this->getSingleResolvedProperty('zone_id')) { return $this->getNameForZoneId($zoneId, $config); } } catch (NestingError $e) { throw $e; } catch (Exception $e) { return self::RESOLVE_ERROR; } } return $this->getDefaultZone($config); } protected function getDefaultZone(IcingaConfig $config = null) { if ($this->prefersGlobalZone()) { return $this->connection->getDefaultGlobalZoneName(); } return $this->connection->getMasterZoneName(); } protected function prefersGlobalZone() { return $this->isTemplate() || $this->isApplyRule(); } protected function renderImports() { if (! $this->supportsImports()) { return ''; } $ret = ''; foreach ($this->getImports() as $name) { $ret .= ' import ' . c::renderString($name) . "\n"; } if ($ret !== '') { $ret .= "\n"; } return $ret; } protected function renderLegacyImports() { if ($this->supportsImports()) { return $this->imports()->toLegacyConfigString(); } return ''; } protected function renderLegacyRelationProperty($propertyName, $id, $renderKey = null) { return $this->renderLegacyObjectProperty( $renderKey ?: $propertyName, c1::renderString($this->getRelatedObjectName($propertyName, $id)) ); } // Disabled is a virtual property protected function renderDisabled() { return ''; } /** * @codingStandardsIgnoreStart */ protected function renderLegacyHost_id($value) { if (is_array($value)) { return c1::renderKeyValue('host_name', c1::renderArray($value)); } return $this->renderLegacyRelationProperty( 'host', $this->get('host_id'), 'host_name' ); } /** * Display Name only exists for host/service in Icinga 1 * * Render it as alias for everything by default. * * Alias does not exist in Icinga 2 currently! * * @return string */ protected function renderLegacyDisplay_Name() { return c1::renderKeyValue('alias', $this->display_name); } protected function renderLegacyTimeout() { return ''; } protected function renderLegacyEnable_active_checks() { return $this->renderLegacyBooleanProperty( 'enable_active_checks', 'active_checks_enabled' ); } protected function renderLegacyEnable_passive_checks() { return $this->renderLegacyBooleanProperty( 'enable_passive_checks', 'passive_checks_enabled' ); } protected function renderLegacyEnable_event_handler() { return $this->renderLegacyBooleanProperty( 'enable_active_checks', 'event_handler_enabled' ); } protected function renderLegacyEnable_notifications() { return $this->renderLegacyBooleanProperty( 'enable_notifications', 'notifications_enabled' ); } protected function renderLegacyEnable_perfdata() { return $this->renderLegacyBooleanProperty( 'enable_perfdata', 'process_perf_data' ); } protected function renderLegacyVolatile() { // @codingStandardsIgnoreEnd return $this->renderLegacyBooleanProperty( 'volatile', 'is_volatile' ); } protected function renderLegacyBooleanProperty($property, $legacyKey) { return c1::renderKeyValue( $legacyKey, c1::renderBoolean($this->get($property)) ); } protected function renderProperties() { $out = ''; $blacklist = array_merge( $this->propertiesNotForRendering, $this->prioritizedProperties ); foreach ($this->properties as $key => $value) { if (in_array($key, $blacklist)) { continue; } $out .= $this->renderObjectProperty($key, $value); } return $out; } protected function renderLegacyProperties() { $out = ''; $blacklist = array_merge( $this->propertiesNotForRendering, [] /* $this->prioritizedProperties */ ); foreach ($this->properties as $key => $value) { if (in_array($key, $blacklist)) { continue; } $out .= $this->renderLegacyObjectProperty($key, $value); } return $out; } protected function renderPrioritizedProperties() { $out = ''; foreach ($this->prioritizedProperties as $key) { $out .= $this->renderObjectProperty($key, $this->properties[$key]); } return $out; } protected function renderObjectProperty($key, $value) { if (substr($key, -3) === '_id') { $short = substr($key, 0, -3); if ($this->hasUnresolvedRelatedProperty($key)) { return c::renderKeyValue( $short, // NOT c::renderString($this->$short) ); } } if ($value === null) { return ''; } $method = 'render' . ucfirst($key); if (method_exists($this, $method)) { return $this->$method($value); } if ($this->propertyIsBoolean($key)) { if ($value === $this->defaultProperties[$key]) { return ''; } return c::renderKeyValue( $this->booleans[$key], c::renderBoolean($value) ); } if ($this->propertyIsInterval($key)) { return c::renderKeyValue( $this->intervalProperties[$key], c::renderInterval($value) ); } if ( substr($key, -3) === '_id' && $this->hasRelation($relKey = substr($key, 0, -3)) ) { return $this->renderRelationProperty($relKey, $value); } return c::renderKeyValue( $key, $this->isApplyRule() ? c::renderStringWithVariables($value) : c::renderString($value) ); } protected function renderLegacyObjectProperty($key, $value) { if (substr($key, -3) === '_id') { $short = substr($key, 0, -3); if ($this->hasUnresolvedRelatedProperty($key)) { return c1::renderKeyValue( $short, // NOT c1::renderString($this->$short) ); } } if ($value === null) { return ''; } $method = 'renderLegacy' . ucfirst($key); if (method_exists($this, $method)) { return $this->$method($value); } $method = 'render' . ucfirst($key); if (method_exists($this, $method)) { return $this->$method($value); } if ($this->propertyIsBoolean($key)) { if ($value === $this->defaultProperties[$key]) { return ''; } return c1::renderKeyValue( $this->booleans[$key], c1::renderBoolean($value) ); } if ($this->propertyIsInterval($key)) { return c1::renderKeyValue( $this->intervalProperties[$key], c1::renderInterval($value) ); } if ( substr($key, -3) === '_id' && $this->hasRelation($relKey = substr($key, 0, -3)) ) { return $this->renderLegacyRelationProperty($relKey, $value); } return c1::renderKeyValue($key, c1::renderString($value)); } protected function renderBooleanProperty($key) { return c::renderKeyValue($key, c::renderBoolean($this->get($key))); } protected function renderPropertyAsSeconds($key) { return c::renderKeyValue($key, c::renderInterval($this->get($key))); } protected function renderSuffix() { $prefix = ''; if ($this->rendersConditionalTemplate()) { $prefix = '} '; } return "$prefix}\n\n"; } protected function renderLegacySuffix() { return "}\n\n"; } /** * @return string */ protected function renderCustomVars() { if ($this->supportsCustomVars()) { return $this->vars()->toConfigString($this->isApplyRule()); } return ''; } /** * @return string */ protected function renderLegacyCustomVars() { if ($this->supportsCustomVars()) { return $this->vars()->toLegacyConfigString(); } return ''; } public function renderUuid() { return ''; } /** * @return string */ protected function renderGroups() { if ($this->supportsGroups()) { return $this->groups()->toConfigString(); } return ''; } /** * @return string */ protected function renderLegacyGroups() { if ($this->supportsGroups() && $this->hasBeenLoadedFromDb()) { $applied = []; if ($this instanceof IcingaHost) { $applied = $this->getAppliedGroups(); } return $this->groups()->toLegacyConfigString($applied); } return ''; } /** * @return string */ protected function renderMultiRelations() { $out = ''; foreach ($this->loadAllMultiRelations() as $rel) { $out .= $rel->toConfigString(); } return $out; } /** * @return string */ protected function renderLegacyMultiRelations() { $out = ''; foreach ($this->loadAllMultiRelations() as $rel) { $out .= $rel->toLegacyConfigString(); } return $out; } /** * @return string */ protected function renderRanges() { if ($this->supportsRanges()) { return $this->ranges()->toConfigString(); } return ''; } /** * @return string */ protected function renderLegacyRanges() { if ($this->supportsRanges()) { return $this->ranges()->toLegacyConfigString(); } return ''; } /** * @return string */ protected function renderArguments() { return ''; } protected function renderRelatedSets() { $config = ''; foreach ($this->relatedSets as $property => $class) { $config .= $this->getRelatedSet($property)->renderAs($property); } return $config; } protected function renderRelationProperty($propertyName, $id, $renderKey = null) { return c::renderKeyValue( $renderKey ?: $propertyName, c::renderString($this->getRelatedObjectName($propertyName, $id)) ); } protected function renderCommandProperty($commandId, $propertyName = 'check_command') { return c::renderKeyValue( $propertyName, c::renderString($this->connection->getCommandName($commandId)) ); } /** * @param $value * @return string * @codingStandardsIgnoreStart */ protected function renderLegacyCheck_command($value) { // @codingStandardsIgnoreEnd $args = []; foreach ($this->vars() as $k => $v) { if (substr($k, 0, 3) === 'ARG') { $args[] = $v->getValue(); } } array_unshift($args, $value); return c1::renderKeyValue('check_command', implode('!', $args)); } /** * @param $value * @return string * @codingStandardsIgnoreStart */ protected function renderLegacyEvent_command($value) { // @codingStandardsIgnoreEnd return c1::renderKeyValue('event_handler', $value); } /** * We do not render zone properties, objects are stored to zone dirs * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ protected function renderZone_id() { // @codingStandardsIgnoreEnd return ''; } protected function renderCustomExtensions() { return ''; } protected function renderLegacyCustomExtensions() { $str = ''; // Set notification settings for the object to suppress warnings if ( array_key_exists('enable_notifications', $this->defaultProperties) && $this->isTemplate() ) { $str .= c1::renderKeyValue('notification_period', 'notification_none'); $str .= c1::renderKeyValue('notification_interval', '0'); $str .= c1::renderKeyValue('contact_groups', 'icingaadmins'); } // force rendering of check_command when ARG1 is set if ($this->supportsCustomVars() && array_key_exists('check_command_id', $this->defaultProperties)) { if ( $this->get('check_command') === null && $this->vars()->get('ARG1') !== null ) { $command = $this->getResolvedRelated('check_command'); $str .= $this->renderLegacyCheck_command($command->getObjectName()); } } return $str; } protected function renderObjectHeader() { $prefix = ''; $renderedName = c::renderString($this->getObjectName()); if ($this->rendersConditionalTemplate()) { $prefix = sprintf('if (! get_template(%s, %s)) { ', $this->getType(), $renderedName); } return sprintf( "%s%s %s %s {\n", $prefix, $this->getObjectTypeName(), $this->getType(), $renderedName ); } protected function rendersConditionalTemplate(): bool { return false; } public function getLegacyObjectType() { return strtolower($this->getType()); } protected function renderLegacyObjectHeader() { $type = $this->getLegacyObjectType(); if ($this->isTemplate()) { $name = c1::renderKeyValue( $this->getLegacyObjectKeyName(), c1::renderString($this->getObjectName()) ); } else { $name = c1::renderKeyValue( $this->getLegacyObjectKeyName(), c1::renderString($this->getObjectName()) ); } $str = "define $type {\n$name"; if ($this->isTemplate()) { $str .= c1::renderKeyValue('register', '0'); } return $str; } protected function getLegacyObjectKeyName() { if ($this->isTemplate()) { return 'name'; } return $this->getLegacyObjectType() . '_name'; } /** * @codingStandardsIgnoreStart */ public function renderAssign_Filter() { return ' ' . AssignRenderer::forFilter( Filter::fromQueryString($this->get('assign_filter')) )->renderAssign() . "\n"; } public function renderLegacyAssign_Filter() { // @codingStandardsIgnoreEnd if ($this instanceof IcingaHostGroup) { $c = " # resolved memberships are set via the individual object\n"; } elseif ($this instanceof IcingaService) { $c = " # resolved objects are listed here\n"; } else { $c = " # assign is not supported for " . $this->type . "\n"; } $c .= ' #' . AssignRenderer::forFilter( Filter::fromQueryString($this->get('assign_filter')) )->renderAssign() . "\n"; return $c; } public function toLegacyConfigString() { $str = implode([ $this->renderLegacyObjectHeader(), $this->renderLegacyImports(), $this->renderLegacyProperties(), //$this->renderArguments(), //$this->renderRelatedSets(), $this->renderLegacyGroups(), $this->renderLegacyMultiRelations(), $this->renderLegacyRanges(), $this->renderLegacyCustomExtensions(), $this->renderLegacyCustomVars(), $this->renderLegacySuffix() ]); $str = $this->alignLegacyProperties($str); if ($this->isDisabled()) { return "# --- This object has been disabled ---\n" . preg_replace('~^~m', '# ', trim($str)) . "\n\n"; } return $str; } protected function alignLegacyProperties($configString) { $lines = explode("\n", $configString); $len = 24; foreach ($lines as &$line) { if (preg_match('/^\s{4}([^\t]+)\t+(.+)$/', $line, $m)) { if ($len - strlen($m[1]) < 0) { $fill = ' '; } else { $fill = str_repeat(' ', $len - strlen($m[1])); } $line = ' ' . $m[1] . $fill . $m[2]; } } return implode("\n", $lines); } public function toConfigString() { $str = implode([ $this->renderObjectHeader(), $this->renderPrioritizedProperties(), $this->renderImports(), $this->renderProperties(), $this->renderArguments(), $this->renderRelatedSets(), $this->renderGroups(), $this->renderMultiRelations(), $this->renderRanges(), $this->renderCustomExtensions(), $this->renderCustomVars(), $this->renderSuffix() ]); if ($this->isDisabled()) { return "/* --- This object has been disabled ---\n" // Do not allow strings to break our comment . str_replace('*/', "* /", $str) . "*/\n"; } return $str; } public function isGroup() { return substr($this->getType(), -5) === 'Group'; } public function hasCheckCommand() { return false; } protected function getType() { if ($this->type === null) { $parts = explode('\\', get_class($this)); // 6 = strlen('Icinga'); $this->type = substr(end($parts), 6); } return $this->type; } protected function getObjectTypeName() { if ($this->isTemplate()) { return 'template'; } if ($this->isApplyRule()) { return 'apply'; } return 'object'; } public function getObjectName() { $property = static::getKeyColumnName(); if ($this->hasProperty($property)) { return $this->get($property); } throw new LogicException(sprintf( 'Trying to access "%s" for an instance of "%s"', $property, get_class($this) )); } /** * @deprecated use DbObjectTypeRegistry::classByType() * @param $type * @return string */ public static function classByType($type) { return DbObjectTypeRegistry::classByType($type); } /** * @param $type * @param array $properties * @param Db|null $db * * @return IcingaObject */ public static function createByType($type, $properties = [], Db $db = null) { /** @var IcingaObject $class */ $class = DbObjectTypeRegistry::classByType($type); return $class::create($properties, $db); } /** * @param $type * @param $id * @param Db $db * * @return IcingaObject * @throws NotFoundError */ public static function loadByType($type, $id, Db $db) { /** @var IcingaObject $class */ $class = DbObjectTypeRegistry::classByType($type); return $class::load($id, $db); } /** * @param $type * @param $id * @param Db $db * * @return bool */ public static function existsByType($type, $id, Db $db) { /** @var IcingaObject $class */ $class = DbObjectTypeRegistry::classByType($type); return $class::exists($id, $db); } public static function getKeyColumnName() { return 'object_name'; } public static function loadAllByType($type, Db $db, $query = null, $keyColumn = null) { /** @var DbObject $class */ $class = DbObjectTypeRegistry::classByType($type); if ($keyColumn === null && is_array($class::create()->getKeyName())) { return $class::loadAll($db, $query); } if ($keyColumn === null) { if (method_exists($class, 'getKeyColumnName')) { $keyColumn = $class::getKeyColumnName(); } } if ( PrefetchCache::shouldBeUsed() && $query === null && $keyColumn === static::getKeyColumnName() ) { $result = []; foreach ($class::prefetchAll($db) as $row) { $result[$row->$keyColumn] = $row; } return $result; } return $class::loadAll($db, $query, $keyColumn); } /** * @param $type * @param Db $db * @return IcingaObject[] */ public static function loadAllExternalObjectsByType($type, Db $db) { /** @var IcingaObject $class */ $class = DbObjectTypeRegistry::classByType($type); $dummy = $class::create(); if (is_array($dummy->getKeyName())) { throw new LogicException(sprintf( 'There is no support for loading external objects of type "%s"', $type )); } $query = $db->getDbAdapter() ->select() ->from($dummy->getTableName()) ->where('object_type = ?', 'external_object'); return $class::loadAll($db, $query, 'object_name'); } public static function fromJson($json, Db $connection = null) { return static::fromPlainObject(json_decode($json), $connection); } public static function fromPlainObject($plain, Db $connection = null) { return static::create((array) $plain, $connection); } /** * @param IcingaObject $object * @param null $preserve * @return $this * @throws NotFoundError */ public function replaceWith(IcingaObject $object, $preserve = []) { return $this->replaceWithProperties($object->toPlainObject(), $preserve); } /** * @param array|object $properties * @param array $preserve * @return $this * @throws NotFoundError */ public function replaceWithProperties($properties, $preserve = []) { $properties = (array) $properties; foreach ($preserve as $k) { $v = $this->get($k); if ($v !== null) { $properties[$k] = $v; } } $this->setProperties($properties); return $this; } /** * TODO: with rules? What if I want to override vars? Drop in favour of vars.x? * * @param IcingaObject $object * @param bool $replaceVars * @return $this * @throws NotFoundError */ public function merge(IcingaObject $object, $replaceVars = false) { $object = clone($object); if ($object->supportsCustomVars()) { $vars = $object->getVars(); $object->set('vars', []); } if ($object->supportsGroups()) { $groups = $object->getGroups(); $object->set('groups', []); } if ($object->supportsImports()) { $imports = $object->listImportNames(); $object->set('imports', []); } $plain = (array) $object->toPlainObject(false, false); unset($plain['vars'], $plain['groups'], $plain['imports']); foreach ($plain as $p => $v) { if ($v === null) { // We want default values, but no null values continue; } $this->set($p, $v); } if ($object->supportsCustomVars()) { $myVars = $this->vars(); if ($replaceVars) { $this->set('vars', $vars); } else { /** @var CustomVariables $vars */ foreach ($vars as $key => $var) { $myVars->set($key, $var); } } } if ($object->supportsGroups()) { if (! empty($groups)) { $this->set('groups', $groups); } } if ($object->supportsImports()) { if (! empty($imports)) { $this->set('imports', $imports); } } return $this; } /** * @param bool $resolved * @param bool $skipDefaults * @param array|null $chosenProperties * @param bool $resolveIds * @param bool $keepId * @return object * @throws NotFoundError */ public function toPlainObject( $resolved = false, $skipDefaults = false, array $chosenProperties = null, $resolveIds = true, $keepId = false ) { $props = []; if ($resolved) { $p = $this->getInheritedProperties(); foreach ($this->properties as $k => $v) { if ($v === null && property_exists($p, $k)) { continue; } $p->$k = $v; } } else { $p = $this->properties; } foreach ($p as $k => $v) { // Do not ship ids for IcingaObjects: if ($k === $this->getUuidColumn()) { continue; } if ($resolveIds) { if ($k === 'id' && $keepId === false && $this->hasProperty('object_name')) { continue; } if ('_id' === substr($k, -3)) { $relKey = substr($k, 0, -3); if ($this->hasRelation($relKey)) { if ($this->hasUnresolvedRelatedProperty($k)) { $v = $this->$relKey; } elseif ($v !== null) { $v = $this->getRelatedObjectName($relKey, $v); } $k = $relKey; } else { throw new LogicException(sprintf( 'No such relation: %s', $relKey )); } } } if ($this->propertyIsInterval($k) && is_string($v) && ctype_digit($v)) { $v = (int) $v; } // TODO: Do not ship null properties based on flag? if (!$skipDefaults || $this->differsFromDefaultValue($k, $v)) { if ($k === 'disabled' || $this->propertyIsBoolean($k)) { $props[$k] = DbDataFormatter::booleanForDbValue($v); } else { $props[$k] = $v; } } } if ($this->supportsGroups()) { // TODO: resolve $groups = $this->groups()->listGroupNames(); if ($resolved && empty($groups)) { $groups = $this->listInheritedGroupNames(); } $props['groups'] = $groups; } foreach ($this->loadAllMultiRelations() as $key => $rel) { if (count($rel) || !$skipDefaults) { $props[$key] = $rel->listRelatedNames(); } } if ($this instanceof ObjectWithArguments) { $props['arguments'] = $this->arguments()->toPlainObject( false, $skipDefaults ); } if ($this->supportsCustomVars()) { if ($resolved) { $props['vars'] = $this->getResolvedVars(); } else { $props['vars'] = $this->getVars(); } } if ($this->supportsImports()) { if ($resolved) { $props['imports'] = []; } else { $props['imports'] = $this->listImportNames(); } } if ($this->supportsRanges()) { // TODO: resolve $props['ranges'] = $this->get('ranges'); } if ($skipDefaults) { foreach (['imports', 'ranges', 'arguments'] as $key) { if (empty($props[$key])) { unset($props[$key]); } } if (array_key_exists('vars', $props)) { if (count((array) $props['vars']) === 0) { unset($props['vars']); } } if (empty($props['groups'])) { unset($props['groups']); } } foreach ($this->relatedSets() as $property => $set) { if ($resolved) { if ($this->supportsImports()) { $set = clone($set); foreach ($this->imports()->getObjects() as $parent) { $set->inheritFrom($parent->getRelatedSet($property)); } } $values = $set->getResolvedValues(); if (empty($values)) { if (!$skipDefaults) { $props[$property] = null; } } else { $props[$property] = $values; } } else { if ($set->isEmpty()) { if (!$skipDefaults) { $props[$property] = null; } } else { $props[$property] = $set->toPlainObject(); } } } if ($chosenProperties !== null) { $chosen = []; foreach ($chosenProperties as $k) { if (array_key_exists($k, $props)) { $chosen[$k] = $props[$k]; } } $props = $chosen; } ksort($props); return (object) $props; } public function listImportNames() { if ($this->gotImports()) { return $this->imports()->listImportNames(); } return $this->templateTree()->listParentNamesFor($this); } public function listFlatResolvedImportNames() { return $this->templateTree()->getAncestorsFor($this); } public function listImportIds() { return $this->templateTree()->listParentIdsFor($this); } public function listAncestorIds() { return $this->templateTree()->listAncestorIdsFor($this); } protected function templateTree() { return $this->templates()->tree(); } protected function templates() { return IcingaTemplateRepository::instanceByObject($this, $this->getConnection()); } protected function differsFromDefaultValue($key, $value) { if (array_key_exists($key, $this->defaultProperties)) { return $value !== $this->defaultProperties[$key]; } return $value !== null; } protected function mapHostsToZones($names) { $map = []; foreach ($names as $hostname) { /** @var IcingaHost $host */ $host = IcingaHost::load($hostname, $this->connection); $zone = $host->getRenderingZone(); if (! array_key_exists($zone, $map)) { $map[$zone] = []; } $map[$zone][] = $hostname; } ksort($map); return $map; } public function getUrlParams() { $params = []; if ($column = $this->getUuidColumn()) { return [$column => $this->getUniqueId()->toString()]; } if ($this->isApplyRule() && ! $this instanceof IcingaScheduledDowntime) { $params['id'] = $this->get('id'); } else { $params = ['name' => $this->getObjectName()]; if ($this->hasProperty('host_id') && $this->get('host_id')) { $params['host'] = $this->get('host'); } if ($this->hasProperty('service_id') && $this->get('service_id')) { $params['service'] = $this->get('service'); } if ($this->hasProperty('service_set_id') && $this->get('service_set_id')) { $params['set'] = $this->get('service_set'); } } return $params; } public function getOnDeleteUrl() { $plural = preg_replace('/cys$/', 'cies', strtolower($this->getShortTableName()) . 's'); return 'director/' . $plural; } /** * @param bool $resolved * @param bool $skipDefaults * @param array|null $chosenProperties * @return string * @throws NotFoundError */ public function toJson( $resolved = false, $skipDefaults = false, array $chosenProperties = null ) { return json_encode($this->toPlainObject($resolved, $skipDefaults, $chosenProperties)); } public function getPlainUnmodifiedObject() { $props = []; foreach ($this->getOriginalProperties() as $k => $v) { // Do not ship ids for IcingaObjects: if ($k === 'id' && $this->hasProperty('object_name')) { continue; } if ($k === $this->getUuidColumn()) { continue; } if ($k === 'disabled' && $v === null) { continue; } if ('_id' === substr($k, -3)) { $relKey = substr($k, 0, -3); if ($this->hasRelation($relKey)) { if ($v !== null) { $v = $this->getRelatedObjectName($relKey, $v); } $k = $relKey; } } if ($this->differsFromDefaultValue($k, $v)) { if ($k === 'disabled' || $this->propertyIsBoolean($k)) { $props[$k] = DbDataFormatter::booleanForDbValue($v); } else { $props[$k] = $v; } } } if ($this->supportsCustomVars()) { $originalVars = $this->vars()->getOriginalVars(); if (! empty($originalVars)) { $props['vars'] = (object) []; foreach ($originalVars as $name => $var) { $props['vars']->$name = $var->getValue(); } } } if ($this->supportsGroups()) { $groups = $this->groups()->listOriginalGroupNames(); if (! empty($groups)) { $props['groups'] = $groups; } } if ($this->supportsImports()) { $imports = $this->imports()->listOriginalImportNames(); if (! empty($imports)) { $props['imports'] = $imports; } } if ($this instanceof ObjectWithArguments) { $args = $this->arguments()->toUnmodifiedPlainObject(); if (! empty($args)) { $props['arguments'] = $args; } } if ($this->supportsRanges()) { $ranges = $this->ranges()->getOriginalValues(); if (!empty($ranges)) { $props['ranges'] = $ranges; } } foreach ($this->relatedSets() as $property => $set) { if ($set->isEmpty()) { continue; } $props[$property] = $set->getPlainUnmodifiedObject(); } foreach ($this->loadAllMultiRelations() as $key => $rel) { $old = $rel->listOriginalNames(); if (! empty($old)) { $props[$key] = $old; } } return (object) $props; } public function __toString() { try { return $this->toConfigString(); } catch (Exception $e) { trigger_error($e); $previousHandler = set_exception_handler( function () { } ); restore_error_handler(); if ($previousHandler !== null) { call_user_func($previousHandler, $e); die(); } die($e->getMessage()); } } public function __destruct() { unset($this->resolveCache); unset($this->vars); unset($this->groups); unset($this->imports); unset($this->ranges); if ($this instanceof ObjectWithArguments) { $this->unsetArguments(); } parent::__destruct(); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaObjectField.php000066400000000000000000000010451516513262500275240ustar00rootroot00000000000000toQueryString(); } return $this->reallySet('var_filter', $value); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaObjectGroup.php000066400000000000000000000034331516513262500276000ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'display_name' => null, 'assign_filter' => null, ]; protected $memberShipShouldBeRefreshed = false; public function getUniqueIdentifier() { return $this->getObjectName(); } protected function prefersGlobalZone() { return true; } protected function beforeStore() { parent::beforeStore(); if ($this->hasBeenLoadedFromDb()) { if (!array_key_exists('assign_filter', $this->getModifiedProperties())) { $this->memberShipShouldBeRefreshed = false; return; } } else { if ($this->hasProperty('assign_filter') && $this->get('assign_filter') === null) { $this->memberShipShouldBeRefreshed = false; return; } } if ($this->hasProperty('assign_filter')) { $this->memberShipShouldBeRefreshed = true; } } protected function notifyResolvers() { if ($this->memberShipShouldBeRefreshed) { $resolver = $this->getMemberShipResolver(); $resolver->addGroup($this); $resolver->refreshDb(); } return $this; } protected function getMemberShipResolver() { return null; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaObjectGroups.php000066400000000000000000000241121516513262500277600ustar00rootroot00000000000000object = $object; if (! $object->hasBeenLoadedFromDb() && PrefetchCache::shouldBeUsed()) { /** @var IcingaObjectGroup $class */ $class = $this->getGroupClass(); $class::prefetchAll($this->object->getConnection()); } } #[\ReturnTypeWillChange] public function count() { return count($this->groups); } #[\ReturnTypeWillChange] public function rewind() { $this->position = 0; } public function hasBeenModified() { return $this->modified; } #[\ReturnTypeWillChange] public function current() { if (! $this->valid()) { return null; } return $this->groups[$this->idx[$this->position]]; } #[\ReturnTypeWillChange] public function key() { return $this->idx[$this->position]; } #[\ReturnTypeWillChange] public function next() { ++$this->position; } #[\ReturnTypeWillChange] public function valid() { return array_key_exists($this->position, $this->idx); } public function get($key) { if (array_key_exists($key, $this->groups)) { return $this->groups[$key]; } return null; } /** * @param $group * @return $this * @throws NotFoundError */ public function set($group) { if (! is_array($group)) { $group = array($group); } $existing = array_keys($this->groups); $new = array(); $class = $this->getGroupClass(); $unset = array(); foreach ($group as $k => $g) { if ($g instanceof $class) { $new[] = $g->object_name; } else { if (empty($g)) { $unset[] = $k; continue; } $new[] = $g; } } foreach ($unset as $k) { unset($group[$k]); } sort($existing); sort($new); if ($existing === $new) { return $this; } $this->groups = array(); if (empty($group)) { $this->modified = true; $this->refreshIndex(); return $this; } return $this->add($group); } /** * Magic isset check * * @return boolean */ public function __isset($group) { return array_key_exists($group, $this->groups); } public function remove($group) { if (array_key_exists($group, $this->groups)) { unset($this->groups[$group]); } $this->modified = true; $this->refreshIndex(); } protected function refreshIndex() { ksort($this->groups); $this->idx = array_keys($this->groups); } /** * @param $group * @param string $onError * @return $this * @throws NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function add($group, $onError = 'fail') { // TODO: only one query when adding array if (is_array($group)) { foreach ($group as $g) { $this->add($g, $onError); } return $this; } if (is_int($group)) { $group = (string) $group; } /** @var IcingaObjectGroup $class */ $class = $this->getGroupClass(); if ($group instanceof $class) { if (array_key_exists($group->getObjectName(), $this->groups)) { return $this; } $this->groups[$group->object_name] = $group; } elseif (is_string($group)) { if (array_key_exists($group, $this->groups)) { return $this; } $connection = $this->object->getConnection(); try { $this->groups[$group] = $class::load($group, $connection); } catch (NotFoundError $e) { switch ($onError) { case 'autocreate': $newGroup = $class::create(array( 'object_type' => 'object', 'object_name' => $group )); $newGroup->store($connection); $this->groups[$group] = $newGroup; break; case 'fail': throw new NotFoundError( 'The group "%s" doesn\'t exist.', $group ); break; case 'ignore': return $this; } } } else { throw new RuntimeException( 'Invalid group object: %s', var_export($group, true) ); } $this->modified = true; $this->refreshIndex(); return $this; } protected function getGroupTableName() { return $this->object->getTableName() . 'group'; } protected function getGroupMemberTableName() { return $this->object->getTableName() . 'group_' . $this->getType(); } public function listGroupNames() { return array_keys($this->groups); } public function listOriginalGroupNames() { return array_keys($this->storedGroups); } public function getType() { return $this->object->getShortTableName(); } protected function loadFromDb() { $db = $this->object->getDb(); $connection = $this->object->getConnection(); $type = $this->getType(); $table = $this->object->getTableName(); $query = $db->select()->from( array('go' => $table . 'group_' . $type), array() )->join( array('g' => $table . 'group'), 'go.' . $type . 'group_id = g.id', '*' )->where('go.' . $type . '_id = ?', $this->object->id) ->order('g.object_name'); $class = $this->getGroupClass(); $this->groups = $class::loadAll($connection, $query, 'object_name'); $this->setBeingLoadedFromDb(); return $this; } public function store() { $storedGroups = array_keys($this->storedGroups); $groups = array_keys($this->groups); $objectId = $this->object->id; $type = $this->getType(); $objectCol = $type . '_id'; $groupCol = $type . 'group_id'; $toDelete = array_diff($storedGroups, $groups); foreach ($toDelete as $group) { $where = sprintf( $objectCol . ' = %d AND ' . $groupCol . ' = %d', $objectId, $this->storedGroups[$group]->id ); $this->object->db->delete( $this->getGroupMemberTableName(), $where ); } $toAdd = array_diff($groups, $storedGroups); foreach ($toAdd as $group) { $this->object->db->insert( $this->getGroupMemberTableName(), array( $objectCol => $objectId, $groupCol => $this->groups[$group]->id ) ); } $this->setBeingLoadedFromDb(); return true; } public function setBeingLoadedFromDb() { $this->storedGroups = array(); foreach ($this->groups as $k => $v) { $this->storedGroups[$k] = clone($v); $this->storedGroups[$k]->id = $v->id; } $this->modified = false; } protected function getGroupClass() { return __NAMESPACE__ . '\\Icinga' . ucfirst($this->object->getShortTableName()) . 'Group'; } public static function loadForStoredObject(IcingaObject $object) { $groups = new static($object); if (PrefetchCache::shouldBeUsed()) { $groups->groups = PrefetchCache::instance()->groups($object); $groups->setBeingLoadedFromDb(); } else { $groups->loadFromDb(); } return $groups; } public function toConfigString() { $groups = array_keys($this->groups); if (empty($groups)) { return ''; } return c::renderKeyValue('groups', c::renderArray($groups)); } public function toLegacyConfigString($additionalGroups = array()) { $groups = array_merge(array_keys($this->groups), $additionalGroups); $groups = array_unique($groups); if (empty($groups)) { return ''; } $type = $this->object->getLegacyObjectType(); return c1::renderKeyValue($type . 'groups', c1::renderArray($groups)); } public function __toString() { try { return $this->toConfigString(); } catch (Exception $e) { trigger_error($e); $previousHandler = set_exception_handler( function () { } ); restore_error_handler(); if ($previousHandler !== null) { call_user_func($previousHandler, $e); die(); } else { die($e->getMessage()); } } } public function __destruct() { unset($this->storedGroups); unset($this->groups); unset($this->object); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaObjectImports.php000066400000000000000000000243541516513262500301460ustar00rootroot00000000000000object = $object; } #[\ReturnTypeWillChange] public function count() { return count($this->imports); } #[\ReturnTypeWillChange] public function rewind() { $this->position = 0; } public function setModified() { $this->modified = true; return $this; } public function hasBeenModified() { return $this->modified; } /** * @return IcingaObject|null * @throws \Icinga\Exception\NotFoundError */ #[\ReturnTypeWillChange] public function current() { if (! $this->valid()) { return null; } return $this->getObject( $this->imports[$this->idx[$this->position]] ); } #[\ReturnTypeWillChange] public function key() { return $this->idx[$this->position]; } #[\ReturnTypeWillChange] public function next() { ++$this->position; } #[\ReturnTypeWillChange] public function valid() { return array_key_exists($this->position, $this->idx); } /** * @param $key * @return IcingaObject|null * @throws \Icinga\Exception\NotFoundError */ public function get($key) { if (array_key_exists($key, $this->imports)) { return $this->getObject($this->imports[$key]); } return null; } public function set($import) { if (empty($import)) { if (empty($this->imports)) { return $this; } else { return $this->clear(); } } if (! is_array($import)) { $import = [$import]; } $existing = $this->listImportNames(); $new = $this->listNamesForGivenImports($import); if ($existing === $new) { return $this; } $this->imports = []; return $this->add($import); } protected function listNamesForGivenImports($imports) { $list = []; $class = $this->getImportClass(); foreach ($imports as $i) { if ($i instanceof $class) { $list[] = $i->object_name; } else { $list[] = $i; } } return $list; } /** * Magic isset check * * @param string $import * * @return boolean */ public function __isset($import) { return array_key_exists($import, $this->imports); } public function clear() { if ($this->imports === []) { return $this; } $this->imports = []; $this->modified = true; return $this->refreshIndex(); } public function remove($import) { if (array_key_exists($import, $this->imports)) { unset($this->imports[$import]); } $this->modified = true; return $this->refreshIndex(); } protected function refreshIndex() { $this->idx = array_keys($this->imports); // $this->object->templateResolver()->refreshObject($this->object); return $this; } public function add($import) { $class = $this->getImportClass(); if (is_array($import)) { foreach ($import as $i) { // Gracefully ignore null members or empty strings if (! $i instanceof $class && ($i === null || strlen($i) === 0)) { continue; } $this->add($i); } return $this; } if ($import instanceof $class) { $name = $import->object_name; if (array_key_exists($name, $this->imports)) { return $this; } $this->imports[$name] = $name; $this->objects[$name] = $import; } elseif (is_string($import)) { if (array_key_exists($import, $this->imports)) { return $this; } $this->imports[$import] = $import; } $this->modified = true; $this->refreshIndex(); return $this; } /** * @return IcingaObject[] * @throws \Icinga\Exception\NotFoundError */ public function getObjects() { $list = []; foreach ($this->listImportNames() as $name) { $name = (string) $name; $list[$name] = $this->getObject($name); } return $list; } /** * @param $name * @return IcingaObject * @throws \Icinga\Exception\NotFoundError */ protected function getObject($name) { if (array_key_exists($name, $this->objects)) { return $this->objects[$name]; } $connection = $this->object->getConnection(); /** @var IcingaObject $class */ $class = $this->getImportClass(); try { if (is_array($this->object->getKeyName())) { // Services only $import = $class::load([ 'object_name' => $name, 'object_type' => 'template' ], $connection); } else { $import = $class::load($name, $connection); } } catch (NotFoundError $e) { throw new NotFoundError(sprintf( 'Unable to load parent referenced from %s "%s", %s', $this->object->getShortTableName(), $this->object->getObjectName(), lcfirst($e->getMessage()) ), $e->getCode(), $e); } return $this->objects[$import->getObjectName()] = $import; } protected function getImportTableName() { return $this->object->getTableName() . '_inheritance'; } public function listImportNames() { return array_keys($this->imports); } public function listOriginalImportNames() { return $this->storedNames; } public function getType() { return $this->object->getShortTableName(); } protected function loadFromDb() { // $resolver = $this->object->templateResolver(); // $this->objects = $resolver->fetchParents(); $this->objects = IcingaTemplateRepository::instanceByObject($this->object) ->getTemplatesIndexedByNameFor($this->object); if (empty($this->objects)) { $this->imports = []; } else { $keys = array_keys($this->objects); $this->imports = array_combine($keys, $keys); } $this->setBeingLoadedFromDb(); return $this; } /** * @return bool * @throws \Zend_Db_Adapter_Exception * @throws \Icinga\Exception\NotFoundError */ public function store() { if (! $this->hasBeenModified()) { return true; } $objectId = $this->object->get('id'); if ($objectId === null) { throw new RuntimeException( 'Cannot store imports for unstored object with no ID' ); } else { $objectId = (int) $objectId; } $type = $this->getType(); $objectCol = $type . '_id'; $importCol = 'parent_' . $type . '_id'; $table = $this->getImportTableName(); $db = $this->object->getDb(); if ($this->object->hasBeenLoadedFromDb()) { $db->delete( $table, $objectCol . ' = ' . $objectId ); } $weight = 1; foreach ($this->getObjects() as $import) { $db->insert($table, [ $objectCol => $objectId, $importCol => $import->get('id'), 'weight' => $weight++ ]); } $this->setBeingLoadedFromDb(); return true; } public function setBeingLoadedFromDb() { $this->storedNames = $this->listImportNames(); $this->modified = false; } protected function getImportClass() { return get_class($this->object); } public static function loadForStoredObject(IcingaObject $object) { $obj = new static($object); return $obj->loadFromDb(); } public function toConfigString() { $ret = ''; foreach ($this->listImportNames() as $name) { $ret .= ' import ' . c::renderString($name) . "\n"; } if ($ret !== '') { $ret .= "\n"; } return $ret; } public function toLegacyConfigString() { $ret = ''; foreach ($this->listImportNames() as $name) { $ret .= c1::renderKeyValue('use', c1::renderString($name)) . "\n"; } if ($ret !== '') { $ret .= "\n"; } return $ret; } public function __toString() { try { return $this->toConfigString(); } catch (Exception $e) { trigger_error($e); $previousHandler = set_exception_handler( function () { } ); restore_error_handler(); if ($previousHandler !== null) { call_user_func($previousHandler, $e); die(); } else { die($e->getMessage()); } } } public function __destruct() { unset($this->object); unset($this->objects); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaObjectLegacyAssignments.php000066400000000000000000000040411516513262500321200ustar00rootroot00000000000000supportsAssignments()) { throw new LogicException(sprintf( 'I can only assign for applied objects, got %s', $object->object_type )); } if ($values === null) { return $object; } if (! is_array($values)) { static::throwCompatError(); } if (empty($values)) { return $object; } $assigns = array(); $ignores = array(); foreach ($values as $type => $value) { if (strpos($value, '|') !== false || strpos($value, '&') !== false) { $value = '(' . $value . ')'; } if ($type === 'assign') { $assigns[] = $value; } elseif ($type === 'ignore') { $ignores[] = $value; } else { static::throwCompatError(); } } $assign = implode('|', $assigns); $ignore = implode('&', $ignores); if (empty($assign)) { $filter = $ignore; } elseif (empty($ignore)) { $filter = $assign; } else { if (count($assigns) === 1) { $filter = $assign . '&' . $ignore; } else { $filter = '(' . $assign . ')&(' . $ignore . ')'; } } $object->assign_filter = $filter; return $object; } protected static function throwCompatError() { throw new LogicException( 'You ran into an unexpected compatibility issue. Please report' . ' this with details helping us to reproduce this to the' . ' Icinga project' ); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaObjectMultiRelations.php000066400000000000000000000271021516513262500314560ustar00rootroot00000000000000object = $object; $this->propertyName = $propertyName; if (is_object($config) || is_array($config)) { foreach ($config as $k => $v) { $this->$k = $v; } } else { $this->relatedObjectClass = $config; } } public function getObjects() { return $this->relations; } #[\ReturnTypeWillChange] public function count() { return count($this->relations); } #[\ReturnTypeWillChange] public function rewind() { $this->position = 0; } public function hasBeenModified() { return $this->modified; } #[\ReturnTypeWillChange] public function current() { if (! $this->valid()) { return null; } return $this->relations[$this->idx[$this->position]]; } #[\ReturnTypeWillChange] public function key() { return $this->idx[$this->position]; } #[\ReturnTypeWillChange] public function next() { ++$this->position; } #[\ReturnTypeWillChange] public function valid() { return array_key_exists($this->position, $this->idx); } public function get($key) { if (array_key_exists($key, $this->relations)) { return $this->relations[$key]; } return null; } public function set($relation) { if (! is_array($relation)) { if ($relation === null) { $relation = array(); } else { $relation = array($relation); } } $existing = array_keys($this->relations); $new = array(); $class = $this->getRelatedClassName(); $unset = array(); foreach ($relation as $k => $ro) { if ($ro instanceof $class) { $new[] = $ro->object_name; } else { if (empty($ro)) { $unset[] = $k; continue; } $new[] = $ro; } } foreach ($unset as $k) { unset($relation[$k]); } sort($existing); sort($new); if ($existing === $new) { return $this; } $this->relations = array(); if (empty($relation)) { $this->modified = true; $this->refreshIndex(); return $this; } return $this->add($relation); } /** * Magic isset check * * @return boolean */ public function __isset($relation) { return array_key_exists($relation, $this->relations); } public function remove($relation) { if (array_key_exists($relation, $this->relations)) { unset($this->relations[$relation]); } $this->modified = true; $this->refreshIndex(); } protected function refreshIndex() { ksort($this->relations); $this->idx = array_keys($this->relations); } public function add($relation, $onError = 'fail') { // TODO: only one query when adding array if (is_array($relation)) { foreach ($relation as $r) { $this->add($r, $onError); } return $this; } if (array_key_exists($relation, $this->relations)) { return $this; } $class = $this->getRelatedClassName(); if ($relation instanceof $class) { $this->relations[$relation->object_name] = $relation; } elseif (is_string($relation)) { $connection = $this->object->getConnection(); try { // Related services can only be objects, used by ServiceSets if ($class === 'Icinga\\Module\\Director\\Objects\\IcingaService') { $relation = $class::load(array( 'object_name' => $relation, 'object_type' => 'template' ), $connection); } else { $relation = $class::load($relation, $connection); } } catch (Exception $e) { switch ($onError) { case 'autocreate': $relation = $class::create(array( 'object_type' => 'object', 'object_name' => $relation )); $relation->store($connection); // TODO case 'fail': throw new ProgrammingError( 'The related %s "%s" doesn\'t exists: %s', $this->getRelatedTableName(), $relation, $e->getMessage() ); break; case 'ignore': return $this; } } } else { throw new ProgrammingError( 'Invalid related object: %s', var_export($relation, true) ); } $this->relations[$relation->object_name] = $relation; $this->modified = true; $this->refreshIndex(); return $this; } protected function getPropertyName() { return $this->propertyName; } protected function getRelatedShortName() { if ($this->relatedShortName === null) { /** @var IcingaObject $class */ $class = $this->getRelatedClassName(); $this->relatedShortName = $class::create()->getShortTableName(); } return $this->relatedShortName; } protected function getTableName() { return $this->object->getTableName() . '_' . $this->getRelatedShortName(); } protected function getRelatedTableName() { if ($this->relatedTableName === null) { /** @var IcingaObject $class */ $class = $this->getRelatedClassName(); $this->relatedTableName = $class::create()->getTableName(); } return $this->relatedTableName; } protected function getRelationIdColumn() { if ($this->relationIdColumn === null) { $this->relationIdColumn = $this->getRelatedShortName(); } return $this->relationIdColumn; } public function listRelatedNames() { return array_keys($this->relations); } public function listOriginalNames() { return array_keys($this->stored); } public function getType() { return $this->object->getShortTableName(); } protected function loadFromDb() { $db = $this->getDb(); $connection = $this->object->getConnection(); $type = $this->getType(); $objectIdCol = $type . '_id'; $relationIdCol = $this->getRelationIdColumn() . '_id'; $query = $db->select()->from( array('r' => $this->getTableName()), array() )->join( array('ro' => $this->getRelatedTableName()), sprintf('r.%s = ro.id', $relationIdCol), '*' )->where( sprintf('r.%s = ?', $objectIdCol), (int) $this->object->id )->order('ro.object_name'); $class = $this->getRelatedClassName(); $this->relations = $class::loadAll($connection, $query, 'object_name'); $this->setBeingLoadedFromDb(); return $this; } public function store() { $db = $this->getDb(); $stored = array_keys($this->stored); $relations = array_keys($this->relations); $objectId = $this->object->id; $type = $this->getType(); $objectCol = $type . '_id'; $relationCol = $this->getRelationIdColumn() . '_id'; $toDelete = array_diff($stored, $relations); foreach ($toDelete as $relation) { // We work with cloned objects. (why?) // As __clone drops the id, we need to access original properties $orig = $this->stored[$relation]->getOriginalProperties(); $where = sprintf( $objectCol . ' = %d AND ' . $relationCol . ' = %d', $objectId, $orig['id'] ); $db->delete( $this->getTableName(), $where ); } $toAdd = array_diff($relations, $stored); foreach ($toAdd as $related) { $db->insert( $this->getTableName(), array( $objectCol => $objectId, $relationCol => $this->relations[$related]->id ) ); } $this->setBeingLoadedFromDb(); return true; } public function setBeingLoadedFromDb() { $this->stored = array(); foreach ($this->relations as $k => $v) { $this->stored[$k] = clone($v); } $this->modified = false; } protected function getRelatedClassName() { return __NAMESPACE__ . '\\' . $this->relatedObjectClass; } protected function getDb() { if ($this->db === null) { $this->db = $this->object->getDb(); } return $this->db; } public static function loadForStoredObject(IcingaObject $object, $propertyName, $relatedObjectClass) { $relations = new static($object, $propertyName, $relatedObjectClass); return $relations->loadFromDb(); } public function toConfigString() { $relations = array_keys($this->relations); if (empty($relations)) { return ''; } return c::renderKeyValue($this->propertyName, c::renderArray($relations)); } public function __toString() { try { return $this->toConfigString(); } catch (Exception $e) { trigger_error($e); $previousHandler = set_exception_handler( function () { } ); restore_error_handler(); if ($previousHandler !== null) { call_user_func($previousHandler, $e); die(); } else { die($e->getMessage()); } } } public function toLegacyConfigString() { $relations = array_keys($this->relations); if (empty($relations)) { return ''; } if ($this->legacyPropertyName === null) { return ' # not supported in legacy: ' . c1::renderKeyValue($this->propertyName, c1::renderArray($relations), ''); } return c1::renderKeyValue($this->legacyPropertyName, c1::renderArray($relations)); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaRanges.php000066400000000000000000000170561516513262500266020ustar00rootroot00000000000000object = $object; } #[\ReturnTypeWillChange] public function count() { return count($this->ranges); } #[\ReturnTypeWillChange] public function rewind() { $this->position = 0; } public function hasBeenModified() { return $this->modified; } #[\ReturnTypeWillChange] public function current() { if (! $this->valid()) { return null; } return $this->ranges[$this->idx[$this->position]]; } #[\ReturnTypeWillChange] public function key() { return $this->idx[$this->position]; } #[\ReturnTypeWillChange] public function next() { ++$this->position; } #[\ReturnTypeWillChange] public function valid() { return array_key_exists($this->position, $this->idx); } public function get($key) { if (array_key_exists($key, $this->ranges)) { return $this->ranges[$key]; } return null; } public function getValues() { $res = array(); foreach ($this->ranges as $key => $range) { $res[$key] = $range->range_value; } return (object) $res; } public function getOriginalValues() { $res = array(); foreach ($this->storedRanges as $key => $range) { $res[$key] = $range->range_value; } return (object) $res; } public function getRanges() { return $this->ranges; } protected function modify($range, $value) { $this->ranges[$range]->range_key = $value; } public function set($ranges) { foreach ($ranges as $range => $value) { $this->setRange($range, $value); } $toDelete = array_diff(array_keys($this->ranges), array_keys($ranges)); foreach ($toDelete as $range) { $this->remove($range); } return $this; } public function setRange($range, $value) { if ($value === null && array_key_exists($range, $this->ranges)) { $this->remove($range); return $this; } if (array_key_exists($range, $this->ranges)) { if ($this->ranges[$range]->range_value === $value) { return $this; } else { $this->ranges[$range]->range_value = $value; $this->modified = true; } } else { $class = $this->getRangeClass(); $this->ranges[$range] = $class::create([ $this->objectIdColumn => $this->object->get('id'), 'range_key' => $range, 'range_value' => $value, ]); $this->modified = true; } return $this; } /** * Magic isset check * * @return boolean */ public function __isset($range) { return array_key_exists($range, $this->ranges); } public function remove($range) { if (array_key_exists($range, $this->ranges)) { unset($this->ranges[$range]); } $this->modified = true; $this->refreshIndex(); } public function clear() { $this->ranges = []; $this->modified = true; $this->refreshIndex(); } protected function refreshIndex() { ksort($this->ranges); $this->idx = array_keys($this->ranges); } public function listRangesNames() { return array_keys($this->ranges); } public function getType() { return $this->object->getShortTableName(); } public function getRangeTableName() { return $this->object->getTableName() . '_range'; } protected function loadFromDb() { $db = $this->object->getDb(); $connection = $this->object->getConnection(); $table = $this->getRangeTableName(); $query = $db->select() ->from(['o' => $table]) ->where('o.' . $this->objectIdColumn . ' = ?', (int) $this->object->get('id')) ->order('o.range_key'); $class = $this->getRangeClass(); $this->ranges = $class::loadAll($connection, $query, 'range_key'); $this->setBeingLoadedFromDb(); return $this; } public function setBeingLoadedFromDb() { $this->storedRanges = []; foreach ($this->ranges as $key => $range) { $range->setBeingLoadedFromDb(); $this->storedRanges[$key] = clone($range); } $this->refreshIndex(); $this->modified = false; } public function store() { $db = $this->object->getConnection(); if (! $this->hasBeenModified()) { return false; } $table = $this->getRangeTableName(); $objectId = (int) $this->object->get('id'); $idColumn = $this->objectIdColumn; foreach ($this->ranges as $range) { if ($range->hasBeenModified()) { $range->setConnection($db); if ((int) $range->get($idColumn) !== $objectId) { $range->set($idColumn, $objectId); } } } foreach (array_diff(array_keys($this->storedRanges), array_keys($this->ranges)) as $delete) { $range = $this->storedRanges[$delete]; $range->setConnection($db); $range->set($idColumn, $objectId); $db->getDbAdapter()->delete($table, $range->createWhere()); unset($this->ranges[$delete]); } foreach ($this->ranges as $range) { $range->store(); } $this->setBeingLoadedFromDb(); return true; } /** * @return IcingaTimePeriodRange|IcingaScheduledDowntimeRange|string IDE hint */ protected function getRangeClass() { return $this->rangeClass; } public static function loadForStoredObject(IcingaObject $object) { $ranges = new static($object); return $ranges->loadFromDb(); } public function toConfigString() { if (empty($this->ranges) && $this->object->object_type === 'template') { return ''; } $string = " ranges = {\n"; foreach ($this->ranges as $range) { $string .= sprintf( " %s\t= %s\n", c::renderString($range->range_key), c::renderString($range->range_value) ); } return $string . " }\n"; } abstract public function toLegacyConfigString(); public function __toString() { try { return $this->toConfigString(); } catch (Exception $e) { trigger_error($e); $previousHandler = set_exception_handler( function () { } ); restore_error_handler(); if ($previousHandler !== null) { call_user_func($previousHandler, $e); die(); } else { die($e->getMessage()); } } } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaRelatedObject.php000066400000000000000000000115501516513262500300630ustar00rootroot00000000000000owner = $owner; $this->key = $key; $this->idKey = $key . '_id'; } /** * Set a specific id * * @param $id int * * @return self */ public function setId($id) { if (! is_int($id)) { throw new ProgrammingError( 'An id must be an integer' ); } if ($this->object !== null) { if ($this->object->id === $id) { return $this; } else { $this->object = null; } } if ($this->object === null) { $this->name = null; } $this->id = $id; $this->owner->set($this->getRealPropertyName(), $id); return $this; } /** * Return the related objects id * * @return int */ public function getId() { if ($this->id === null) { $this->id = $this->getObject()->id; } return $this->id; } /** * Lazy-load the related object * * @return IcingaObject */ public function getObject() { // TODO: This is unfinished if ($this->object === null) { $class = $this->getClassName(); if ($this->name === null) { if ($id = $this->getId()) { } } else { $this->object = $class::load($this->name, $this->owner->getConnection()); } } return $this->object; } /** * The real property name pointing to this relation, e.g. 'host_id' * * @return string */ public function getRealPropertyName() { return $this->key . '_id'; } /** * Full related class name * * @return string */ public function getClassName() { if ($this->className === null) { $this->className = __NAMESPACE__ . '\\' . $this->getShortClassName(); } return $this->className; } /** * Related class name relative to Icinga\Module\Director\Objects * * @return string */ public function getShortClassName() { return $this->owner->getRelationObjectClass($this->key); } /** * Set a related property * * This might be a string or an object * @param $related string|IcingaObject * @throws ProgrammingError * * return self */ public function set($related) { if (is_string($related)) { $this->name = $related; } elseif (is_object($related)) { $className = $this->getClassName(); if ($related instanceof $className) { $this->object = $related; $this->name = $object->object_name; $this->id = $object->id; } else { throw new ProgrammingError( 'Trying to set a related "%s" while expecting "%s"', get_class($related), $this->getShortClassName() ); } } else { throw new ProgrammingError( 'Related object can be name or object, got: %s', var_export($related, true) ); } return $this; } /** * Get the name of the related object * * @return string */ public function getName() { if ($this->name === null) { return $this->owner->{$this->key}; } else { return $this->name; } } /** * Conservative constructor to avoid issued with PHP GC */ public function __destruct() { unset($this->owner); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaScheduledDowntime.php000066400000000000000000000065621516513262500307720ustar00rootroot00000000000000 null, 'uuid' => null, 'zone_id' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'author' => null, 'comment' => null, 'fixed' => null, 'duration' => null, 'apply_to' => null, 'assign_filter' => null, 'with_services' => null, ]; protected $uuidColumn = 'uuid'; protected $supportsImports = true; protected $supportsRanges = true; protected $supportsApplyRules = true; protected $relations = [ 'zone' => 'IcingaZone', ]; protected $booleans = [ 'fixed' => 'fixed', ]; protected $intervalProperties = [ 'duration' => 'duration', ]; protected $propertiesNotForRendering = [ 'id', 'apply_to', 'object_name', 'object_type', 'with_services', ]; /** * @return string */ protected function renderObjectHeader() { if ($this->isApplyRule()) { if (($to = $this->get('apply_to')) === null) { throw new RuntimeException(sprintf( 'Applied notification "%s" has no valid object type', $this->getObjectName() )); } return sprintf( "%s %s %s to %s {\n", $this->getObjectTypeName(), $this->getType(), c::renderString($this->getObjectName()), ucfirst($to) ); } else { return parent::renderObjectHeader(); } } public function getOnDeleteUrl() { if ($this->isApplyRule()) { return 'director/scheduled-downtimes/applyrules'; } elseif ($this->isTemplate()) { return 'director/scheduled-downtimes/templates'; } else { return 'director/scheduled-downtimes'; } } public function isActive($now = null) { if ($now === null) { $now = time(); } foreach ($this->ranges()->getRanges() as $range) { if ($range->isActive($now)) { return true; } } // TODO: no range currently means (and renders) "never", Icinga behaves // different. Figure out whether and how we should support this return false; } /** * @return string */ protected function renderSuffix() { if ($this->get('with_services') === 'y' && $this->get('apply_to') === 'host') { return parent::renderSuffix() . $this->renderCloneForServices(); } else { return parent::renderSuffix(); } } protected function prefersGlobalZone() { return false; } protected function renderCloneForServices() { $services = clone($this); $services ->set('with_services', 'n') ->set('apply_to', 'service'); return $services->toConfigString(); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaScheduledDowntimeRange.php000066400000000000000000000045071516513262500317440ustar00rootroot00000000000000 null, 'range_key' => null, 'range_value' => null, 'range_type' => 'include', 'merge_behaviour' => 'set', ]; public function isActive($now = null) { if ($now === null) { $now = time(); } if (false === ($weekDay = $this->getWeekDay($this->get('range_key')))) { // TODO, dates are not yet supported return false; } if ((int) date('w', $now) !== $weekDay) { return false; } $timeRanges = preg_split('/\s*,\s*/', $this->get('range_value'), -1, PREG_SPLIT_NO_EMPTY); foreach ($timeRanges as $timeRange) { if ($this->timeRangeIsActive($timeRange, $now)) { return true; } } return false; } protected function timeRangeIsActive($rangeString, $now) { $hBegin = $mBegin = $hEnd = $mEnd = null; if (sscanf($rangeString, '%2d:%2d-%2d:%2d', $hBegin, $mBegin, $hEnd, $mEnd) === 4) { if ( $this->timeFromHourMin($hBegin, $mBegin, $now) <= $now && $this->timeFromHourMin($hEnd, $mEnd, $now) >= $now ) { return true; } } else { // TODO: throw exception? } return false; } protected function timeFromHourMin($hour, $min, $now) { return strtotime(sprintf('%s %02d:%02d:00', date('Y-m-d', $now), $hour, $min)); } protected function getWeekDay($day) { switch ($day) { case 'sunday': return 0; case 'monday': return 1; case 'tuesday': return 2; case 'wednesday': return 3; case 'thursday': return 4; case 'friday': return 5; case 'saturday': return 6; } return false; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaScheduledDowntimeRanges.php000066400000000000000000000007051516513262500321230ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'display_name' => null, 'host_id' => null, 'service_set_id' => null, 'check_command_id' => null, 'max_check_attempts' => null, 'check_period_id' => null, 'check_interval' => null, 'retry_interval' => null, 'check_timeout' => null, 'enable_notifications' => null, 'enable_active_checks' => null, 'enable_passive_checks' => null, 'enable_event_handler' => null, 'enable_flapping' => null, 'enable_perfdata' => null, 'event_command_id' => null, 'flapping_threshold_high' => null, 'flapping_threshold_low' => null, 'volatile' => null, 'zone_id' => null, 'command_endpoint_id' => null, 'notes' => null, 'notes_url' => null, 'action_url' => null, 'icon_image' => null, 'icon_image_alt' => null, 'use_agent' => null, 'apply_for' => null, 'use_var_overrides' => null, 'assign_filter' => null, 'template_choice_id' => null, ]; protected $relations = [ 'host' => 'IcingaHost', 'service_set' => 'IcingaServiceSet', 'check_command' => 'IcingaCommand', 'event_command' => 'IcingaCommand', 'check_period' => 'IcingaTimePeriod', 'command_endpoint' => 'IcingaEndpoint', 'zone' => 'IcingaZone', 'template_choice' => 'IcingaTemplateChoiceService', ]; protected $booleans = [ 'enable_notifications' => 'enable_notifications', 'enable_active_checks' => 'enable_active_checks', 'enable_passive_checks' => 'enable_passive_checks', 'enable_event_handler' => 'enable_event_handler', 'enable_flapping' => 'enable_flapping', 'enable_perfdata' => 'enable_perfdata', 'volatile' => 'volatile', 'use_agent' => 'use_agent', 'use_var_overrides' => 'use_var_overrides', ]; protected $intervalProperties = [ 'check_interval' => 'check_interval', 'check_timeout' => 'check_timeout', 'retry_interval' => 'retry_interval', ]; protected $supportsGroups = true; protected $supportsCustomVars = true; protected $supportsFields = true; protected $supportsImports = true; protected $supportsApplyRules = true; protected $supportsSets = true; protected $supportsChoices = true; protected $supportedInLegacy = true; protected $keyName = ['host_id', 'service_set_id', 'object_name']; protected $prioritizedProperties = ['host_id']; protected $propertiesNotForRendering = [ 'id', 'object_name', 'object_type', 'apply_for' ]; /** @var ServiceGroupMembershipResolver */ protected $servicegroupMembershipResolver; /** * @return IcingaCommand * @throws IcingaException * @throws \Icinga\Exception\NotFoundError */ public function getCheckCommand() { $id = $this->getSingleResolvedProperty('check_command_id'); return IcingaCommand::loadWithAutoIncId( $id, $this->getConnection() ); } /** * @return bool */ public function isApplyRule() { if ($this->hasBeenAssignedToHostTemplate()) { return true; } return $this->hasProperty('object_type') && $this->get('object_type') === 'apply'; } /** * @return bool */ public function usesVarOverrides() { return $this->get('use_var_overrides') === 'y'; } public function getUniqueIdentifier() { if ($this->isTemplate()) { return $this->getObjectName(); } else { throw new RuntimeException( 'getUniqueIdentifier() is supported by Service Templates only' ); } } /** * @param string $key * @return $this */ protected function setKey($key) { if (is_int($key)) { $this->set('id', $key); } elseif (is_array($key)) { foreach (['id', 'host_id', 'service_set_id', 'object_name'] as $k) { if (array_key_exists($k, $key)) { $this->set($k, $key[$k]); } } } else { parent::setKey($key); } return $this; } /** * @param $name * @return $this * @codingStandardsIgnoreStart */ protected function setObject_Name($name) { // @codingStandardsIgnoreEnd if ($name === null && $this->isApplyRule()) { $name = ''; } return $this->reallySet('object_name', $name); } /** * Render host_id as host_name * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ public function renderHost_id() { if ($this->hasBeenAssignedToHostTemplate()) { return ''; } return $this->renderRelationProperty('host', $this->get('host_id'), 'host_name'); } /** * @codingStandardsIgnoreStart */ protected function renderLegacyHost_id($value) { // @codingStandardsIgnoreEnd if (is_array($value)) { $blacklisted = $this->getBlacklistedHostnames(); $c = c1::renderKeyValue('host_name', c1::renderArray(array_diff($value, $blacklisted))); // blacklisted in this (zoned) scope? $bl = array_intersect($blacklisted, $value); if (! empty($bl)) { $c .= c1::renderKeyValue('# ignored on', c1::renderArray($bl)); } return $c; } else { return parent::renderLegacyHost_id($value); } } /** * @param IcingaConfig $config * @throws IcingaException */ public function renderToLegacyConfig(IcingaConfig $config) { if ($this->get('service_set_id') !== null) { return; } elseif ($this->isApplyRule()) { $this->renderLegacyApplyToConfig($config); } else { parent::renderToLegacyConfig($config); } } /** * @param IcingaConfig $config * @throws IcingaException */ protected function renderLegacyApplyToConfig(IcingaConfig $config) { $conn = $this->getConnection(); $assign_filter = $this->get('assign_filter'); $filter = Filter::fromQueryString($assign_filter); $hostnames = HostApplyMatches::forFilter($filter, $conn); $this->set('object_type', 'object'); foreach ($this->mapHostsToZones($hostnames) as $zone => $names) { $blacklisted = $this->getBlacklistedHostnames(); $zoneNames = array_diff($names, $blacklisted); $disabled = []; foreach ($zoneNames as $name) { if (IcingaHost::load($name, $this->getConnection())->isDisabled()) { $disabled[] = $name; } } $zoneNames = array_diff($zoneNames, $disabled); if (empty($zoneNames)) { continue; } $this->set('host_id', $zoneNames); $config->configFile('director/' . $zone . '/service_apply', '.cfg') ->addLegacyObject($this); } } /** * @return string */ public function toLegacyConfigString() { if ($this->get('service_set_id') !== null) { return ''; } $str = parent::toLegacyConfigString(); if ( ! $this->isDisabled() && $this->get('host_id') && $this->getRelated('host')->isDisabled() ) { return "# --- This services host has been disabled ---\n" . preg_replace('~^~m', '# ', trim($str)) . "\n\n"; } else { return $str; } } /** * @return string */ public function toConfigString() { if ($this->get('service_set_id')) { return ''; } $str = parent::toConfigString(); if ( ! $this->isDisabled() && $this->get('host_id') && $this->getRelated('host')->isDisabled() ) { return "/* --- This services host has been disabled ---\n" // Do not allow strings to break our comment . str_replace('*/', "* /", $str) . "*/\n"; } else { return $str; } } /** * @return string */ protected function renderObjectHeader() { if ( $this->isApplyRule() && !$this->hasBeenAssignedToHostTemplate() && $this->get('apply_for') !== null ) { $name = $this->getObjectName(); $extraName = ''; if (c::stringHasMacro($name)) { $extraName = c::renderKeyValue('name', c::renderStringWithVariables($name)); $name = ''; } elseif ($name !== '') { $name = ' ' . c::renderString($name); } return sprintf( "%s %s%s for (config in %s) {\n", $this->getObjectTypeName(), $this->getType(), $name, $this->get('apply_for') ) . $extraName; } return parent::renderObjectHeader(); } /** * @return string */ protected function getLegacyObjectKeyName() { if ($this->isTemplate()) { return 'name'; } else { return 'service_description'; } } protected function rendersConditionalTemplate(): bool { return $this->getRenderingZone() === self::ALL_NON_GLOBAL_ZONES; } /** * @return bool */ public function hasBeenAssignedToHostTemplate() { // Branches would fail if ($this->properties['host_id'] === null) { return null; } $hostId = $this->get('host_id'); return $hostId && $this->getRelatedObject( 'host', $hostId )->isTemplate(); } /** * @return string * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\NestingError */ protected function renderSuffix() { $suffix = ''; if ($this->isApplyRule()) { $zoneName = $this->getRenderingZone(); if (!IcingaZone::zoneNameIsGlobal($zoneName, $this->connection)) { $suffix .= c::renderKeyValue('zone', c::renderString($zoneName)); } } if ($this->isApplyRule() || $this->usesVarOverrides()) { $suffix .= $this->renderImportHostVarOverrides(); } return $suffix . parent::renderSuffix(); } /** * @return string */ protected function renderImportHostVarOverrides() { if (! $this->connection) { throw new RuntimeException( 'Cannot render services without an assigned DB connection' ); } return "\n import DirectorOverrideTemplate\n"; } /** * @return string * @throws \Icinga\Exception\NotFoundError */ protected function renderCustomExtensions() { $output = ''; if ($this->hasBeenAssignedToHostTemplate()) { // TODO: use assignment renderer? $filter = sprintf( 'assign where %s in host.templates', c::renderString($this->get('host')) ); $output .= "\n " . $filter . "\n"; } $blacklist = $this->getBlacklistedHostnames(); $blacklistedTemplates = []; $blacklistedHosts = []; foreach ($blacklist as $hostname) { if (IcingaHost::load($hostname, $this->connection)->isTemplate()) { $blacklistedTemplates[] = $hostname; } else { $blacklistedHosts[] = $hostname; } } foreach ($blacklistedTemplates as $template) { $output .= sprintf( " ignore where %s in host.templates\n", c::renderString($template) ); } if (! empty($blacklistedHosts)) { if (count($blacklistedHosts) === 1) { $output .= sprintf( " ignore where host.name == %s\n", c::renderString($blacklistedHosts[0]) ); } else { $output .= sprintf( " ignore where host.name in %s\n", c::renderArray($blacklistedHosts) ); } } // A hand-crafted command endpoint overrides use_agent if ($this->get('command_endpoint_id') !== null) { return $output; } if ($this->get('use_agent') === 'y') { // When feature flag feature_custom_endpoint is enabled, render additional code if ($this->connection->settings()->get('feature_custom_endpoint') === 'y') { return $output . " // Set command_endpoint dynamically with Director if (!host) { var host = get_host(host_name) } if (host.vars._director_custom_endpoint_name) { command_endpoint = host.vars._director_custom_endpoint_name } else { command_endpoint = host_name } "; } else { return $output . c::renderKeyValue('command_endpoint', 'host_name'); } } elseif ($this->get('use_agent') === 'n') { return $output . c::renderKeyValue('command_endpoint', c::renderPhpValue(null)); } else { return $output; } } /** * @return array */ public function getBlacklistedHostnames() { // Hint: if ($this->isApplyRule()) would be nice, but apply rules are // not enough, one might want to blacklist single services from Sets // assigned to single Hosts. if (PrefetchCache::shouldBeUsed()) { $lookup = PrefetchCache::instance()->hostServiceBlacklist(); } else { $lookup = new HostServiceBlacklist($this->getConnection()); } return $lookup->getBlacklistedHostnamesForService($this); } /** * Do not render internal property * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ public function renderUse_agent() { return ''; } public function renderUse_var_overrides() { return ''; } protected function renderTemplate_choice_id() { return ''; } protected function renderLegacyDisplay_Name() { // @codingStandardsIgnoreEnd return c1::renderKeyValue('display_name', $this->get('display_name')); } public function hasCheckCommand() { return $this->getSingleResolvedProperty('check_command_id') !== null; } public function getOnDeleteUrl() { if ($this->get('host_id')) { return 'director/host/services?name=' . rawurlencode($this->get('host')); } elseif ($this->get('service_set_id')) { return 'director/serviceset/services?name=' . rawurlencode($this->get('service_set')); } else { return parent::getOnDeleteUrl(); } } protected function getDefaultZone(IcingaConfig $config = null) { // Hint: this isn't possible yet, as we're unable to render dependent apply rules to multiple zones as well // if ($this->isTemplate()) { // return self::ALL_NON_GLOBAL_ZONES; // } if ($this->get('host_id') === null) { return parent::getDefaultZone(); } else { $zone = $this->getRelatedObject('host', $this->get('host_id')) ->getRenderingZone($config); // Hint: this avoids problems with host templates rendered to all non-global zones if ($zone === self::ALL_NON_GLOBAL_ZONES) { $zone = $this->connection->getDefaultGlobalZoneName(); } return $zone; } } /** * @return string */ public function createWhere() { $where = parent::createWhere(); if (! $this->hasBeenLoadedFromDb()) { if ( null === $this->get('service_set_id') && null === $this->get('host_id') && null === $this->get('id') ) { $where .= " AND object_type = 'template'"; } } return $where; } /** * TODO: Duplicate code, clean this up, split it into multiple methods * @param Db|null $connection * @param string $prefix * @param null $filter * @return array */ public static function enumProperties( Db $connection = null, $prefix = '', $filter = null ) { $serviceProperties = []; if ($filter === null) { $filter = new PropertiesFilter(); } $realProperties = static::create()->listProperties(); sort($realProperties); if ($filter->match(PropertiesFilter::$SERVICE_PROPERTY, 'name')) { $serviceProperties[$prefix . 'name'] = 'name'; } foreach ($realProperties as $prop) { if (!$filter->match(PropertiesFilter::$SERVICE_PROPERTY, $prop)) { continue; } if (substr($prop, -3) === '_id') { if ($prop === 'template_choice_id') { continue; } $prop = substr($prop, 0, -3); } $serviceProperties[$prefix . $prop] = $prop; } $serviceVars = []; if ($connection !== null) { foreach ($connection->fetchDistinctServiceVars() as $var) { if ($filter->match(PropertiesFilter::$CUSTOM_PROPERTY, $var->varname, $var)) { if ($var->datatype) { $serviceVars[$prefix . 'vars.' . $var->varname] = sprintf( '%s (%s)', $var->varname, $var->caption ); } else { $serviceVars[$prefix . 'vars.' . $var->varname] = $var->varname; } } } } //$properties['vars.*'] = 'Other custom variable'; ksort($serviceVars); $props = mt('director', 'Service properties'); $vars = mt('director', 'Custom variables'); $properties = []; if (!empty($serviceProperties)) { $properties[$props] = $serviceProperties; $properties[$props][$prefix . 'groups'] = 'Groups'; } if (!empty($serviceVars)) { $properties[$vars] = $serviceVars; } $hostProps = mt('director', 'Host properties'); $hostVars = mt('director', 'Host Custom variables'); $hostProperties = IcingaHost::enumProperties($connection, 'host.'); if (array_key_exists($hostProps, $hostProperties)) { $p = $hostProperties[$hostProps]; if (!empty($p)) { $properties[$hostProps] = $p; } } if (array_key_exists($vars, $hostProperties)) { $p = $hostProperties[$vars]; if (!empty($p)) { $properties[$hostVars] = $p; } } return $properties; } protected function beforeStore() { parent::beforeStore(); if ( $this->isObject() && $this->get('service_set_id') === null && $this->get('host_id') === null ) { throw new InvalidArgumentException( 'Cannot store a Service object without a related host or set: ' . $this->getObjectName() ); } } protected function notifyResolvers() { $resolver = $this->getServiceGroupMembershipResolver(); $resolver->addObject($this); $resolver->refreshDb(); return $this; } protected function getServiceGroupMembershipResolver() { if ($this->servicegroupMembershipResolver === null) { $this->servicegroupMembershipResolver = new ServiceGroupMembershipResolver( $this->getConnection() ); } return $this->servicegroupMembershipResolver; } public function setServiceGroupMembershipResolver(ServiceGroupMembershipResolver $resolver) { $this->servicegroupMembershipResolver = $resolver; return $this; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaServiceAssignment.php000066400000000000000000000006421516513262500310050ustar00rootroot00000000000000 null, 'service_id' => null, 'filter_string' => null, ); protected $relations = array( 'service' => 'IcingaService', ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaServiceField.php000066400000000000000000000006111516513262500277140ustar00rootroot00000000000000 null, 'datafield_id' => null, 'is_required' => null, 'var_filter' => null, ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaServiceGroup.php000066400000000000000000000017141516513262500277720ustar00rootroot00000000000000servicegroupMembershipResolver === null) { $this->servicegroupMembershipResolver = new ServiceGroupMembershipResolver( $this->getConnection() ); } return $this->servicegroupMembershipResolver; } public function setServiceGroupMembershipResolver(ServiceGroupMembershipResolver $resolver) { $this->servicegroupMembershipResolver = $resolver; return $this; } protected function getMemberShipResolver() { return $this->getServiceGroupMembershipResolver(); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaServiceSet.php000066400000000000000000000425451516513262500274400ustar00rootroot00000000000000 null, 'uuid' => null, 'host_id' => null, 'object_name' => null, 'object_type' => null, 'description' => null, 'assign_filter' => null, ); protected $uuidColumn = 'uuid'; protected $keyName = array('host_id', 'object_name'); protected $supportsImports = true; protected $supportsCustomVars = true; protected $supportsApplyRules = true; protected $supportedInLegacy = true; protected $relations = array( 'host' => 'IcingaHost', ); /** @var IcingaService[] Cached services */ protected $cachedServices = []; /** @var IcingaService[]|null */ private $services; /** * Set the services to be cached * * @param $services IcingaService[] * @return void */ public function setCachedServices($services) { $this->cachedServices = $services; } /** * Get the cached services * * @return IcingaService[] */ public function getCachedServices() { return $this->cachedServices; } public function isDisabled() { return false; } public function supportsAssignments() { return true; } protected function setKey($key) { if (is_int($key)) { $this->set('id', $key); } elseif (is_string($key)) { $keyComponents = preg_split('~!~', $key); if (count($keyComponents) === 1) { $this->set('object_name', $keyComponents[0]); $this->set('object_type', 'template'); } else { throw new InvalidArgumentException(sprintf( 'Can not parse key: %s', $key )); } } else { return parent::setKey($key); } return $this; } /** * @param stdClass[] $services * @return void */ public function setServices(array $services) { $existing = $this->getServices(); $uuidMap = []; foreach ($existing as $service) { $uuidMap[$service->getUniqueId()->getBytes()] = $service; } $this->services = []; foreach ($services as $service) { if (isset($service->uuid)) { $uuid = Uuid::fromString($service->uuid)->getBytes(); $current = $uuidMap[$uuid] ?? IcingaService::create([], $this->connection); } else { if (! is_object($service)) { var_dump($service); exit; } $current = $existing[$service->object_name] ?? IcingaService::create([], $this->connection); } $current->setProperties((array) $service); $this->services[] = $current; } } protected function storeRelatedServices() { if ($this->services === null) { $cachedServices = $this->getCachedServices(); if ($cachedServices) { $this->services = $cachedServices; } else { return; } } $seen = []; /** @var IcingaService $service */ foreach ($this->services as $service) { $seen[$service->getUniqueId()->getBytes()] = true; $service->set('service_set_id', $this->get('id')); $service->store(); } foreach ($this->fetchServices() as $service) { if (!isset($seen[$service->getUniqueId()->getBytes()])) { $service->delete(); } } } /** * @deprecated * @return IcingaService[] * @throws \Icinga\Exception\NotFoundError */ public function getServiceObjects() { // don't try to resolve services for unstored objects - as in getServiceObjectsForSet() // also for diff in activity log if ($this->get('id') === null) { return []; } if ($this->get('host_id')) { $imports = $this->imports()->getObjects(); if (empty($imports)) { return array(); } $parent = array_shift($imports); assert($parent instanceof IcingaServiceSet); return $this->getServiceObjectsForSet($parent); } else { return $this->getServiceObjectsForSet($this); } } /** * @param IcingaServiceSet $set * @return IcingaService[] * @throws \Icinga\Exception\NotFoundError */ protected function getServiceObjectsForSet(IcingaServiceSet $set) { $connection = $this->getConnection(); if (self::$dbObjectStore !== null) { $branchUuid = self::$dbObjectStore->getBranch()->getUuid(); } else { $branchUuid = null; } $builder = new ServiceSetQueryBuilder($connection, $branchUuid); return $builder->fetchServicesWithQuery($builder->selectServicesForSet($set)); } public function getUniqueIdentifier() { return $this->getObjectName(); } public function beforeDelete() { $this->setCachedServices($this->getServices()); // check if this is a template, or directly assigned to a host if ($this->get('host_id') === null) { // find all host sets and delete them foreach ($this->fetchHostSets() as $set) { $set->delete(); } } parent::beforeDelete(); } /** * @throws \Icinga\Exception\NotFoundError */ public function onDelete() { $hostId = $this->get('host_id'); if ($hostId) { $deleteIds = []; foreach ($this->getServiceObjects() as $service) { if ($idToDelete = $service->get('id')) { $deleteIds[] = (int) $idToDelete; } } if (! empty($deleteIds)) { $db = $this->getDb(); $db->delete( 'icinga_host_service_blacklist', $db->quoteInto( sprintf('host_id = %s AND service_id IN (?)', $hostId), $deleteIds ) ); } } parent::onDelete(); } /** * @param IcingaConfig $config * @throws \Icinga\Exception\NotFoundError */ public function renderToConfig(IcingaConfig $config) { $files = []; $zone = $this->getRenderingZone($config) ; if ($this->get('assign_filter') === null && $this->isTemplate()) { return; } if ($config->isLegacy()) { $this->renderToLegacyConfig($config); return; } $services = $this->getServiceObjects(); if (empty($services)) { return; } // Loop over all services belonging to this set // add our assign rules and then add the service to the config // eventually clone them beforehand to not get into trouble with caches // figure out whether we might need a zone property foreach ($services as $service) { if ($filter = $this->get('assign_filter')) { $service->set('object_type', 'apply'); $service->set('assign_filter', $filter); } elseif ($hostId = $this->get('host_id')) { $host = $this->getRelatedObject('host', $hostId)->getObjectName(); if (in_array($host, $this->getBlacklistedHostnames($service))) { continue; } $service->set('object_type', 'object'); $service->set('use_var_overrides', 'y'); $service->set('host_id', $hostId); } else { // Service set template without assign filter or host continue; } $this->copyVarsToService($service); foreach ($service->getRenderingZones($config) as $serviceZone) { $file = $this->getConfigFileWithHeader($config, $serviceZone, $files); $file->addObject($service); } } if (empty($files)) { // always print the header, so you have minimal info present $this->getConfigFileWithHeader($config, $zone, $files); } } /** * @return array */ public function getBlacklistedHostnames($service) { // Hint: if ($this->isApplyRule()) would be nice, but apply rules are // not enough, one might want to blacklist single services from Sets // assigned to single Hosts. if (PrefetchCache::shouldBeUsed()) { $lookup = PrefetchCache::instance()->hostServiceBlacklist(); } else { $lookup = new HostServiceBlacklist($this->getConnection()); } return $lookup->getBlacklistedHostnamesForService($service); } protected function getConfigFileWithHeader(IcingaConfig $config, $zone, &$files = []) { if (!isset($files[$zone])) { $file = $config->configFile( 'zones.d/' . $zone . '/servicesets' ); $file->addContent($this->getConfigHeaderComment($config)); $files[$zone] = $file; } return $files[$zone]; } protected function getConfigHeaderComment(IcingaConfig $config) { $name = $this->getObjectName(); $assign = $this->get('assign_filter'); if ($config->isLegacy()) { if ($assign !== null) { return "## applied Service Set '{$name}'\n\n"; } else { return "## Service Set '{$name}' on this host\n\n"; } } else { $comment = [ "Service Set: {$name}", ]; if (($host = $this->get('host')) !== null) { $comment[] = 'on host ' . $host; } if (($description = $this->get('description')) !== null) { $comment[] = ''; foreach (preg_split('~\\n~', $description) as $line) { $comment[] = $line; } } if ($assign !== null) { $comment[] = ''; $comment[] = trim($this->renderAssign_Filter()); } return "/**\n * " . join("\n * ", $comment) . "\n */\n\n"; } } public function copyVarsToService(IcingaService $service) { $serviceVars = $service->vars(); foreach ($this->vars() as $k => $var) { $serviceVars->$k = $var; } return $this; } /** * @param IcingaConfig $config * @throws \Icinga\Exception\NotFoundError */ public function renderToLegacyConfig(IcingaConfig $config) { if ($this->get('assign_filter') === null && $this->isTemplate()) { return; } // evaluate my assign rules once, get related hosts // Loop over all services belonging to this set // generate every service with host_name host1,host2... -> not yet. And Zones? $conn = $this->getConnection(); // Delegating this to the service would look, but this way it's faster if ($filter = $this->get('assign_filter')) { $filter = Filter::fromQueryString($filter); $hostnames = HostApplyMatches::forFilter($filter, $conn); } else { $hostnames = array($this->getRelated('host')->getObjectName()); } $blacklists = []; foreach ($this->mapHostsToZones($hostnames) as $zone => $names) { $file = $config->configFile('director/' . $zone . '/servicesets', '.cfg'); $file->addContent($this->getConfigHeaderComment($config)); foreach ($this->getServiceObjects() as $service) { $object_name = $service->getObjectName(); if (! array_key_exists($object_name, $blacklists)) { $blacklists[$object_name] = $service->getBlacklistedHostnames(); } // check if all hosts in the zone ignore this service $zoneNames = array_diff($names, $blacklists[$object_name]); $disabled = []; foreach ($zoneNames as $name) { if (IcingaHost::load($name, $this->getConnection())->isDisabled()) { $disabled[] = $name; } } $zoneNames = array_diff($zoneNames, $disabled); if (empty($zoneNames)) { continue; } $service->set('object_type', 'object'); $service->set('host_id', $names); $this->copyVarsToService($service); $file->addLegacyObject($service); } } } public function getRenderingZone(IcingaConfig $config = null) { if ($this->get('host_id') === null) { if ($hostname = $this->get('host')) { $host = IcingaHost::load($hostname, $this->getConnection()); } else { return $this->connection->getDefaultGlobalZoneName(); } } else { $host = $this->getRelatedObject('host', $this->get('host_id')); } return $host->getRenderingZone($config); } public function createWhere() { $where = parent::createWhere(); if (! $this->hasBeenLoadedFromDb()) { if (null === $this->get('host_id') && null === $this->get('id')) { $where .= " AND object_type = 'template'"; } } return $where; } /** * @return IcingaService[] */ public function getServices(): array { if ($this->services !== null) { return $this->services; } if ($this->hasBeenLoadedFromDb()) { return $this->fetchServices(); } return []; } /** * @return IcingaService[] */ public function fetchServices(): array { if ($store = self::$dbObjectStore) { $uuid = $store->getBranch()->getUuid(); } else { $uuid = null; } $builder = new ServiceSetQueryBuilder($this->getConnection(), $uuid); return $builder->fetchServicesWithQuery($builder->selectServicesForSet($this)); } /** * Fetch IcingaServiceSet that are based on this set and added to hosts directly * * @return IcingaServiceSet[] */ public function fetchHostSets() { $id = $this->get('id'); if ($id === null) { return []; } $query = $this->db->select() ->from( ['o' => $this->table] )->join( ['ssi' => $this->table . '_inheritance'], 'ssi.service_set_id = o.id', [] )->where( 'ssi.parent_service_set_id = ?', $id ); return static::loadAll($this->connection, $query); } /** * @throws DuplicateKeyException * @throws \Icinga\Exception\NotFoundError */ protected function beforeStore() { parent::beforeStore(); $name = $this->getObjectName(); if ($this->isObject() && $this->get('host_id') === null && $this->get('host') === null) { throw new InvalidArgumentException( 'A Service Set cannot be an object with no related host' ); } // checking if template object_name is unique // TODO: Move to IcingaObject if (! $this->hasBeenLoadedFromDb() && $this->isTemplate() && static::exists($name, $this->connection)) { throw new DuplicateKeyException( '%s template "%s" already existing in database!', $this->getType(), $name ); } } public function onStore() { $this->storeRelatedServices(); } public function hasBeenModified() { if ($this->services !== null) { foreach ($this->services as $service) { if ($service->hasBeenModified()) { return true; } } } return parent::hasBeenModified(); } public function toSingleIcingaConfig() { $config = parent::toSingleIcingaConfig(); try { foreach ($this->fetchHostSets() as $set) { $set->renderToConfig($config); } } catch (Exception $e) { $config->configFile( 'failed-to-render' )->prepend( "/** Failed to render this Service Set **/\n" . '/* ' . $e->getMessage() . ' */' ); } return $config; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaServiceSetAssignment.php000066400000000000000000000006631516513262500314640ustar00rootroot00000000000000 null, 'service_set_id' => null, 'filter_string' => null, ); protected $relations = array( 'service_set' => 'IcingaServiceSet', ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaServiceVar.php000066400000000000000000000007661516513262500274340ustar00rootroot00000000000000 null, 'varname' => null, 'varvalue' => null, 'format' => null, ); public function onInsert() { } public function onUpdate() { } public function onDelete() { } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaTemplateChoice.php000066400000000000000000000152531516513262500302460ustar00rootroot00000000000000 null, 'object_name' => null, 'description' => null, 'min_required' => 0, 'max_allowed' => 1, 'required_template_id' => null, 'allowed_roles' => null, ]; private $choices; private $newChoices; public function getObjectShortTableName() { return substr(substr($this->table, 0, -16), 7); } public function getUniqueIdentifier() { return $this->getObjectName(); } public function isMainChoice() { return $this->hasBeenLoadedFromDb() && $this->connection->settings()->get('main_host_choice'); } public function getObjectTableName() { return substr($this->table, 0, -16); } /** * @param QuickForm $form * @param array $imports * @param string $namePrefix * @return \Zend_Form_Element * @throws \Zend_Form_Exception */ public function createFormElement(QuickForm $form, $imports = [], $namePrefix = 'choice') { $required = $this->isRequired() && !$this->isTemplate(); $type = $this->allowsMultipleChoices() ? 'multiselect' : 'select'; $choices = $this->enumChoices(); $chosen = []; foreach ($imports as $import) { if (array_key_exists($import, $choices)) { $chosen[] = $import; } } $attributes = [ 'label' => $this->getObjectName(), 'description' => $this->get('description'), 'required' => $required, 'ignore' => true, 'value' => $chosen, 'multiOptions' => $form->optionalEnum($choices), 'class' => 'autosubmit' ]; // unused if ($type === 'extensibleSet') { $attributes['sorted'] = true; } $key = $namePrefix . $this->get('id'); return $form->createElement($type, $key, $attributes); } public function isRequired() { return (int) $this->get('min_required') > 0; } public function allowsMultipleChoices() { return (int) $this->get('max_allowed') > 1; } public function hasBeenModified() { if ($this->newChoices !== null && ($this->choices ?? $this->fetchChoices()) !== $this->newChoices) { return true; } return parent::hasBeenModified(); } public function getMembers() { return $this->enumChoices(); } public function setMembers($members) { if (empty($members)) { $this->newChoices = array(); return $this; } $db = $this->getDb(); $query = $db->select()->from( ['o' => $this->getObjectTableName()], ['o.id', 'o.object_name'] )->where("o.object_type = 'template'") ->where('o.object_name IN (?)', $members) ->order('o.object_name'); $this->newChoices = $db->fetchPairs($query); return $this; } public function getChoices() { if ($this->newChoices !== null) { return $this->newChoices; } if ($this->choices === null) { $this->choices = $this->fetchChoices(); } return $this->choices; } public function fetchChoices() { if ($this->hasBeenLoadedFromDb()) { $db = $this->getDb(); $query = $db->select()->from( ['o' => $this->getObjectTableName()], ['o.id', 'o.object_name'] )->where("o.object_type = 'template'") ->where('o.template_choice_id = ?', $this->get('id')) ->order('o.object_name'); return $db->fetchPairs($query); } else { return []; } } public function enumChoices() { $choices = $this->getChoices(); return array_combine($choices, $choices); } /** * @throws \Zend_Db_Adapter_Exception */ public function onStore() { parent::onStore(); if ($this->newChoices !== $this->choices) { $this->storeChoices(); } } /** * @throws \Zend_Db_Adapter_Exception */ protected function storeChoices() { $id = $this->getProperty('id'); $db = $this->getDb(); $ids = array_keys($this->newChoices); $table = $this->getObjectTableName(); if (empty($ids)) { $db->update( $table, ['template_choice_id' => null], $db->quoteInto( sprintf('template_choice_id = %d', $id), $ids ) ); } else { $db->update( $table, ['template_choice_id' => null], $db->quoteInto( sprintf('template_choice_id = %d AND id NOT IN (?)', $id), $ids ) ); $db->update( $table, ['template_choice_id' => $id], $db->quoteInto('id IN (?)', $ids) ); } } /** * @param $roles * @throws ProgrammingError * @codingStandardsIgnoreStart */ public function setAllowed_roles($roles) { // @codingStandardsIgnoreEnd $key = 'allowed_roles'; if (is_array($roles)) { $this->reallySet($key, json_encode($roles)); } elseif (null === $roles) { $this->reallySet($key, null); } else { throw new ProgrammingError( 'Expected array or null for allowed_roles, got %s', var_export($roles, true) ); } } /** * @return array|null * @codingStandardsIgnoreStart */ public function getAllowed_roles() { // @codingStandardsIgnoreEnd // Might be removed once all choice types have allowed_roles if (! array_key_exists('allowed_roles', $this->properties)) { return null; } $roles = $this->getProperty('allowed_roles'); if (is_string($roles)) { return json_decode($roles); } else { return $roles; } } /** * @param $type * @codingStandardsIgnoreStart */ public function setObject_type($type) { // @codingStandardsIgnoreEnd } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaTemplateChoiceHost.php000066400000000000000000000004541516513262500311010ustar00rootroot00000000000000 'IcingaHost', ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaTemplateChoiceService.php000066400000000000000000000004701516513262500315620ustar00rootroot00000000000000 'IcingaService', ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaTemplateResolver.php000066400000000000000000000305421516513262500306530ustar00rootroot00000000000000setObject($object); } /** * Set a specific object for this resolver instance */ public function setObject(IcingaObject $object) { $this->object = $object; $this->type = $object->getShortTableName(); $this->connection = $object->getConnection(); $this->db = $this->connection->getDbAdapter(); return $this; } /** * Forget all template relation of the given object type * * @return self */ public function clearCache() { unset(self::$templates[$this->type]); return $this; } /** * Fetch direct parents * * return IcingaObject[] */ public function fetchParents() { // TODO: involve lookup cache $res = array(); $class = $this->object; foreach ($this->listParentIds() as $id) { $object = $class::loadWithAutoIncId($id, $this->connection); $res[$object->object_name] = $object; } return $res; } public function listParentIds($id = null) { $this->requireTemplates(); if ($id === null) { $object = $this->object; if ($object->hasBeenLoadedFromDb()) { if ($object->gotImports() && $object->imports()->hasBeenModified()) { return $this->listUnstoredParentIds(); } $id = $object->id; } else { return $this->listUnstoredParentIds(); } } $type = $this->type; if (array_key_exists($id, self::$idIdx[$type])) { return array_keys(self::$idIdx[$type][$id]); } return array(); } protected function listUnstoredParentIds() { return $this->getIdsForNames($this->listUnstoredParentNames()); } protected function listUnstoredParentNames() { return $this->object->imports()->listImportNames(); } public function listParentNames($name = null) { $this->requireTemplates(); if ($name === null) { $object = $this->object; if ($object->hasBeenLoadedFromDb()) { if ($object->gotImports() && $object->imports()->hasBeenModified()) { return $this->listUnstoredParentNames(); } $name = $object->object_name; } else { return $this->listUnstoredParentNames(); } } $type = $this->type; if (array_key_exists($name, self::$nameIdx[$type])) { return array_keys(self::$nameIdx[$type][$name]); } return array(); } public function fetchResolvedParents() { if ($this->object->hasBeenLoadedFromDb()) { return $this->fetchObjectsById($this->listResolvedParentIds()); } $objects = array(); foreach ($this->object->imports()->getObjects() as $parent) { $objects += $parent->templateResolver()->fetchResolvedParents(); } return $objects; } public function listResolvedParentIds() { $this->requireTemplates(); return $this->resolveParentIds(); } /** * TODO: unfinished and not used currently * * @return array */ public function listResolvedParentNames() { $this->requireTemplates(); if (array_key_exists($name, self::$nameIdx[$type])) { return array_keys(self::$nameIdx[$type][$name]); } return $this->resolveParentNames($this->object->object_name); } public function listParentsById($id) { return $this->getNamesForIds($this->resolveParentIds($id)); } public function listParentsByName($name) { return $this->resolveParentNames($name); } /** * Gives a list of all object ids met when walking through ancestry * * Tree is walked in import order, duplicates are preserved, the given * objectId is added last * * @param int $objectId * * @return array */ public function listFullInheritancePathIds($objectId = null) { $parentIds = $this->listParentIds($objectId); $ids = array(); foreach ($parentIds as $parentId) { foreach ($this->listFullInheritancePathIds($parentId) as $id) { $ids[] = $id; } $ids[] = $parentId; } $object = $this->object; if ($objectId === null && $object->hasBeenLoadedFromDb()) { $ids[] = $object->id; } return $ids; } public function listChildren($objectId = null) { if ($objectId === null) { $objectId = $this->object->id; } if (array_key_exists($objectId, self::$reverseIdIdx[$this->type])) { return self::$reverseIdIdx[$this->type][$objectId]; } else { return array(); } } public function listChildIds($objectId = null) { return array_keys($this->listChildren($objectId)); } public function listDescendantIds($objectId = null) { if ($objectId === null) { $objectId = $this->object->id; } } public function listInheritancePathIds($objectId = null) { return $this->uniquePathIds($this->listFullInheritancePathIds($objectId)); } public function uniquePathIds(array $ids) { $single = array(); foreach (array_reverse($ids) as $id) { if (array_key_exists($id, $single)) { continue; } $single[$id] = $id; } return array_reverse(array_keys($single)); } protected function resolveParentNames($name, &$list = array(), $path = array()) { $this->assertNotInList($name, $path); $path[$name] = true; foreach ($this->listParentNames($name) as $parent) { $list[$parent] = true; $this->resolveParentNames($parent, $list, $path); unset($list[$parent]); $list[$parent] = true; } return array_keys($list); } protected function resolveParentIds($id = null, &$list = array(), $path = array()) { if ($id === null) { if ($check = $this->object->id) { $this->assertNotInList($check, $path); $path[$check] = true; } } else { $this->assertNotInList($id, $path); $path[$id] = true; } foreach ($this->listParentIds($id) as $parent) { $list[$parent] = true; $this->resolveParentIds($parent, $list, $path); unset($list[$parent]); $list[$parent] = true; } return array_keys($list); } protected function assertNotInList($id, &$list) { if (array_key_exists($id, $list)) { $list = array_keys($list); $list[] = $id; if (is_numeric($id)) { throw new NestingError( 'Loop detected: %s', implode(' -> ', $this->getNamesForIds($list)) ); } else { throw new NestingError( 'Loop detected: %s', implode(' -> ', $list) ); } } } protected function getNamesForIds($ids) { $names = array(); foreach ($ids as $id) { $names[] = $this->getNameForId($id); } return $names; } protected function getNameForId($id) { return self::$idToName[$this->type][$id]; } protected function getIdsForNames($names) { $this->requireTemplates(); $ids = array(); foreach ($names as $name) { $ids[] = $this->getIdForName($name); } return $ids; } protected function getIdForName($name) { if (! array_key_exists($name, self::$nameToId[$this->type])) { throw new NotFoundError('There is no such import: "%s"', $name); } return self::$nameToId[$this->type][$name]; } protected function fetchObjectsById($ids) { $class = $this->object; $connection = $this->connection; $res = array(); foreach ($ids as $id) { $res[] = $class::loadWithAutoIncId($id, $connection); } return $res; } protected function requireTemplates() { if (! array_key_exists($this->type, self::$templates)) { $this->prepareLookupTables(); } return $this; } protected function prepareLookupTables() { $type = $this->type; Benchmark::measure("Preparing '$type' TemplateResolver lookup tables"); $templates = $this->fetchTemplates(); $ids = array(); $reverseIds = array(); $names = array(); $idToName = array(); $nameToId = array(); foreach ($templates as $row) { $id = $row->id; $idToName[$id] = $row->name; $nameToId[$row->name] = $id; if ($row->parent_id === null) { continue; } $parentId = $row->parent_id; $parentName = $row->parent_name; if (array_key_exists($id, $ids)) { $ids[$id][$parentId] = $parentName; $names[$row->name][$parentName] = $row->parent_id; } else { $ids[$id] = array( $parentId => $parentName ); $names[$row->name] = array( $parentName => $parentId ); } if (! array_key_exists($parentId, $reverseIds)) { $reverseIds[$parentId] = array(); } $reverseIds[$parentId][$id] = $row->name; } self::$idIdx[$type] = $ids; self::$reverseIdIdx[$type] = $reverseIds; self::$nameIdx[$type] = $names; self::$templates[$type] = $templates; // TODO: this is unused, isn't it? self::$idToName[$type] = $idToName; self::$nameToId[$type] = $nameToId; Benchmark::measure('Preparing TemplateResolver lookup tables'); } protected function fetchTemplates() { $db = $this->db; $type = $this->type; $table = $this->object->getTableName(); $query = $db->select()->from( array('o' => $table), array( 'id' => 'o.id', 'name' => 'o.object_name', 'parent_id' => 'p.id', 'parent_name' => 'p.object_name', ) )->joinLeft( array('i' => $table . '_inheritance'), 'o.id = i.' . $type . '_id', array() )->joinLeft( array('p' => $table), 'p.id = i.parent_' . $type . '_id', array() )->order('o.id')->order('i.weight'); return $db->fetchAll($query); } public function __destruct() { unset($this->connection); unset($this->db); unset($this->object); } public function refreshObject(IcingaObject $object) { $type = $object->getShortTableName(); $name = $object->getObjectName(); $parentNames = $object->imports; self::$nameIdx[$type][$name] = $parentNames; if ($object->hasBeenLoadedFromDb()) { $id = $object->getProperty('id'); self::$idIdx[$type][$id] = $this->getIdsForNames($parentNames); self::$idToName[$type][$id] = $name; self::$nameToId[$type][$name] = $id; } return $this; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaTimePeriod.php000066400000000000000000000070161516513262500274170ustar00rootroot00000000000000 null, 'uuid' => null, 'zone_id' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'prefer_includes' => null, 'display_name' => null, 'update_method' => null, ]; protected $booleans = [ 'prefer_includes' => 'prefer_includes', ]; protected $supportsImports = true; protected $supportsRanges = true; protected $supportedInLegacy = true; protected $relations = array( 'zone' => 'IcingaZone', ); protected $multiRelations = [ 'includes' => [ 'relatedObjectClass' => 'IcingaTimeperiod', 'relatedShortName' => 'include', ], 'excludes' => [ 'relatedObjectClass' => 'IcingaTimeperiod', 'relatedShortName' => 'exclude', 'legacyPropertyName' => 'exclude' ], ]; public function getUniqueIdentifier() { return $this->getObjectName(); } /** * Render update property * * Avoid complaints for method names with underscore: * @codingStandardsIgnoreStart * * @return string */ public function renderUpdate_method() { // @codingStandardsIgnoreEnd return ''; } protected function renderObjectHeader() { return parent::renderObjectHeader() . ' import "legacy-timeperiod"' . "\n"; } protected function checkPeriodInRange($now, $name = null) { if ($name !== null) { $period = static::load($name, $this->connection); } else { $period = $this; } foreach ($period->ranges()->getRanges() as $range) { if ($range->isActive($now)) { return true; } } return false; } public function isActive($now = null) { if ($now === null) { $now = time(); } $preferIncludes = $this->get('prefer_includes') !== 'n'; $active = $this->checkPeriodInRange($now); $included = false; $excluded = false; $variants = [ 'includes' => &$included, 'excludes' => &$excluded ]; foreach ($variants as $key => &$var) { foreach ($this->get($key) as $name) { if ($this->checkPeriodInRange($now, $name)) { $var = true; break; } } } if ($preferIncludes) { if ($included) { return true; } elseif ($excluded) { return false; } else { return $active; } } else { if ($excluded) { return false; } elseif ($included) { return true; } else { return $active; } } // TODO: no range currently means (and renders) "never", Icinga behaves // different. Figure out whether and how we should support this return false; } protected function prefersGlobalZone() { return true; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaTimePeriodRange.php000066400000000000000000000044341516513262500303750ustar00rootroot00000000000000 null, 'range_key' => null, 'range_value' => null, 'range_type' => 'include', 'merge_behaviour' => 'set', ); public function isActive($now = null) { if ($now === null) { $now = time(); } if (false === ($weekDay = $this->getWeekDay($this->get('range_key')))) { // TODO, dates are not yet supported return false; } if ((int) date('w', $now) !== $weekDay) { return false; } $timeRanges = preg_split('/\s*,\s*/', $this->get('range_value'), -1, PREG_SPLIT_NO_EMPTY); foreach ($timeRanges as $timeRange) { if ($this->timeRangeIsActive($timeRange, $now)) { return true; } } return false; } protected function timeRangeIsActive($rangeString, $now) { $hBegin = $mBegin = $hEnd = $mEnd = null; if (sscanf($rangeString, '%2d:%2d-%2d:%2d', $hBegin, $mBegin, $hEnd, $mEnd) === 4) { if ( $this->timeFromHourMin($hBegin, $mBegin, $now) <= $now && $this->timeFromHourMin($hEnd, $mEnd, $now) >= $now ) { return true; } } else { // TODO: throw exception? } return false; } protected function timeFromHourMin($hour, $min, $now) { return strtotime(sprintf('%s %02d:%02d:00', date('Y-m-d', $now), $hour, $min)); } protected function getWeekDay($day) { switch ($day) { case 'sunday': return 0; case 'monday': return 1; case 'tuesday': return 2; case 'wednesday': return 3; case 'thursday': return 4; case 'friday': return 5; case 'saturday': return 6; } return false; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaTimePeriodRanges.php000066400000000000000000000015721516513262500305600ustar00rootroot00000000000000ranges) && $this->object->isTemplate()) { return ''; } $out = ''; foreach ($this->ranges as $range) { $out .= c1::renderKeyValue( $range->get('range_key'), $range->get('range_value') ); } if ($out !== '') { $out = "\n" . $out; } return $out; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaUser.php000066400000000000000000000026441516513262500262760ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'display_name' => null, 'email' => null, 'pager' => null, 'enable_notifications' => null, 'period_id' => null, 'zone_id' => null, ); protected $uuidColumn = 'uuid'; protected $supportsGroups = true; protected $supportsCustomVars = true; protected $supportsFields = true; protected $supportsImports = true; protected $booleans = array( 'enable_notifications' => 'enable_notifications' ); protected $relatedSets = array( 'states' => 'StateFilterSet', 'types' => 'TypeFilterSet', ); protected $relations = array( 'period' => 'IcingaTimePeriod', 'zone' => 'IcingaZone', ); public function getUniqueIdentifier() { return $this->getObjectName(); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaUserField.php000066400000000000000000000006001516513262500272300ustar00rootroot00000000000000 null, 'datafield_id' => null, 'is_required' => null, 'var_filter' => null, ); } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaUserGroup.php000066400000000000000000000011341516513262500273040ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'display_name' => null, 'zone_id' => null, ]; protected $relations = [ 'zone' => 'IcingaZone', ]; protected function prefersGlobalZone() { return false; } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaVar.php000066400000000000000000000034011516513262500261000ustar00rootroot00000000000000 null, 'rendered_checksum' => null, 'varname' => null, 'varvalue' => null, 'rendered' => null ]; protected $binaryProperties = [ 'checksum', 'rendered_checksum', ]; /** * @param CustomVariable $customVar * @param Db $db * * @return static */ public static function forCustomVar(CustomVariable $customVar, Db $db) { $rendered = $customVar->render(); $var = static::create(array( 'checksum' => $customVar->checksum(), 'rendered_checksum' => sha1($rendered, true), 'varname' => $customVar->getKey(), 'varvalue' => $customVar->toJson(), 'rendered' => $rendered, ), $db); $var->var = $customVar; return $var; } /** * @param CustomVariable $customVar * @param Db $db * * @return static * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public static function generateForCustomVar(CustomVariable $customVar, Db $db) { $var = static::forCustomVar($customVar, $db); $var->store(); return $var; } protected function onInsert() { IcingaFlatVar::generateForCustomVar($this->var, $this->getConnection()); } } icingaweb2-module-director-1.11.8/library/Director/Objects/IcingaZone.php000066400000000000000000000056661516513262500263020ustar00rootroot00000000000000 null, 'uuid' => null, 'object_name' => null, 'object_type' => null, 'disabled' => 'n', 'parent_id' => null, 'is_global' => 'n', ]; protected $booleans = [ // Global is a reserved word in SQL, column name was prefixed 'is_global' => 'global' ]; protected $relations = [ 'parent' => 'IcingaZone', ]; protected $supportsImports = true; protected static $globalZoneNames; private $endpointList; protected function renderCustomExtensions() { $endpoints = $this->listEndpoints(); if (empty($endpoints)) { return ''; } return c::renderKeyValue('endpoints', c::renderArray($endpoints)); } public function isGlobal() { return $this->get('is_global') === 'y'; } public static function zoneNameIsGlobal($name, Db $connection) { if (self::$globalZoneNames === null) { $db = $connection->getDbAdapter(); self::setCachedGlobalZoneNames($db->fetchCol( $db->select()->from('icinga_zone', 'object_name')->where('is_global = ?', 'y') )); } return \in_array($name, self::$globalZoneNames); } public static function setCachedGlobalZoneNames($names) { self::$globalZoneNames = $names; } public function getRenderingZone(IcingaConfig $config = null) { // If the zone has a parent zone... if ($this->get('parent_id')) { // ...we render the zone object to the parent zone return $this->get('parent'); } elseif ($this->get('is_global') === 'y') { // ...additional global zones are rendered to our global zone... return $this->connection->getDefaultGlobalZoneName(); } else { // ...and all the other zones are rendered to our master zone return $this->connection->getMasterZoneName(); } } public function setEndpointList($list) { $this->endpointList = $list; return $this; } // TODO: Move this away, should be prefetchable: public function listEndpoints() { $id = $this->get('id'); if ($id && $this->endpointList === null) { $db = $this->getDb(); $query = $db->select() ->from('icinga_endpoint', 'object_name') ->where('zone_id = ?', $id) ->order('object_name'); $this->endpointList = $db->fetchCol($query); } return $this->endpointList; } } icingaweb2-module-director-1.11.8/library/Director/Objects/ImportRowModifier.php000066400000000000000000000051231516513262500276610ustar00rootroot00000000000000 null, 'source_id' => null, 'property_name' => null, 'provider_class' => null, 'target_property' => null, 'filter_expression' => null, 'priority' => null, 'description' => null, ]; protected $settingsTable = 'import_row_modifier_setting'; protected $settingsRemoteId = 'row_modifier_id'; private $hookInstance; public function getInstance() { if ($this->hookInstance === null) { $class = $this->get('provider_class'); /** @var PropertyModifierHook $obj */ if (! class_exists($class)) { throw new RuntimeException(sprintf( 'Cannot instantiate Property modifier %s', $class )); } $obj = new $class(); $obj->setSettings($this->getSettings()); $obj->setPropertyName($this->get('property_name')); $obj->setTargetProperty($this->get('target_property')); $obj->setDb($this->connection); $this->hookInstance = $obj; } return $this->hookInstance; } /** * @deprecated please use \Icinga\Module\Director\Data\Exporter * @return \stdClass */ public function export() { $properties = $this->getProperties(); unset($properties['id']); unset($properties['source_id']); $properties['settings'] = $this->getInstance()->exportSettings(); ksort($properties); return (object) $properties; } public function setSettings($settings) { $settings = $this->getInstance()->setSettings((array) $settings)->getSettings(); return parent::setSettings($settings); // TODO: Change the autogenerated stub } protected function beforeStore() { if (! $this->hasBeenLoadedFromDb() && $this->get('priority') === null) { $this->setNextPriority('source_id'); } } protected function onInsert() { $this->refreshPriortyProperty(); } } icingaweb2-module-director-1.11.8/library/Director/Objects/ImportRun.php000066400000000000000000000110471516513262500262010ustar00rootroot00000000000000 null, 'source_id' => null, 'rowset_checksum' => null, 'start_time' => null, 'end_time' => null, // TODO: Check whether succeeded could be dropped 'succeeded' => null, ]; protected $binaryProperties = [ 'rowset_checksum', ]; public function prepareImportedObjectQuery($columns = array('object_name')) { return $this->getDb()->select()->from( array('r' => 'imported_row'), $columns )->joinLeft( array('rsr' => 'imported_rowset_row'), 'rsr.row_checksum = r.checksum', array() )->where( 'rsr.rowset_checksum = ?', $this->getConnection()->quoteBinary($this->rowset_checksum) ); } public function listColumnNames() { $db = $this->getDb(); $query = $db->select()->distinct()->from( array('p' => 'imported_property'), 'property_name' )->join( array('rp' => 'imported_row_property'), 'rp.property_checksum = p.checksum', array() )->join( array('rsr' => 'imported_rowset_row'), 'rsr.row_checksum = rp.row_checksum', array() )->where('rsr.rowset_checksum = ?', $this->getConnection()->quoteBinary($this->rowset_checksum)); return $db->fetchCol($query); } public function fetchRows($columns, $filter = null, $keys = null) { $db = $this->getDb(); /** @var Db $connection */ $connection = $this->getConnection(); $binchecksum = $this->rowset_checksum; $query = $db->select()->from( array('rsr' => 'imported_rowset_row'), array( 'object_name' => 'r.object_name', 'property_name' => 'p.property_name', 'property_value' => 'p.property_value', 'format' => 'p.format' ) )->join( array('r' => 'imported_row'), 'rsr.row_checksum = r.checksum', array() )->join( array('rp' => 'imported_row_property'), 'r.checksum = rp.row_checksum', array() )->join( array('p' => 'imported_property'), 'p.checksum = rp.property_checksum', array() )->order('r.object_name'); if ($connection->isMysql()) { $query->where('rsr.rowset_checksum = :checksum')->bind([ 'checksum' => $binchecksum ]); } else { $query->where( 'rsr.rowset_checksum = ?', $connection->quoteBinary($binchecksum) ); } if ($columns === null) { $columns = $this->listColumnNames(); } else { $query->where('p.property_name IN (?)', $columns); } $result = array(); $empty = (object) array(); foreach ($columns as $k => $v) { $empty->$k = null; } if ($keys !== null) { $query->where('r.object_name IN (?)', $keys); } foreach ($db->fetchAll($query) as $row) { if (! array_key_exists($row->object_name, $result)) { $result[$row->object_name] = clone($empty); } if ($row->format === 'json') { $result[$row->object_name]->{$row->property_name} = json_decode($row->property_value); } else { $result[$row->object_name]->{$row->property_name} = $row->property_value; } } if ($filter) { $filtered = array(); foreach ($result as $key => $row) { if ($filter->matches($row)) { $filtered[$key] = $row; } } return $filtered; } return $result; } public function importSource() { if ($this->importSource === null) { $this->importSource = ImportSource::loadWithAutoIncId( (int) $this->get('source_id'), $this->connection ); } return $this->importSource; } } icingaweb2-module-director-1.11.8/library/Director/Objects/ImportSource.php000066400000000000000000000324411516513262500266760ustar00rootroot00000000000000 null, 'source_name' => null, 'provider_class' => null, 'key_column' => null, 'import_state' => 'unknown', 'last_error_message' => null, 'last_attempt' => null, 'description' => null, ]; protected $stateProperties = [ 'import_state', 'last_error_message', 'last_attempt', ]; protected $settingsTable = 'import_source_setting'; protected $settingsRemoteId = 'source_id'; private $rowModifiers; private $loadedRowModifiers; private $newRowModifiers; public function setModifiers(array $modifiers) { if ($this->loadedRowModifiers === null && $this->hasBeenLoadedFromDb()) { $this->loadedRowModifiers = $this->fetchRowModifiers(); } $current = (array) $this->loadedRowModifiers; if (\count($current) !== \count($modifiers)) { $this->newRowModifiers = $modifiers; } else { $i = 0; $modified = false; foreach ($modifiers as $props) { $this->loadedRowModifiers[$i]->setProperties((array) $props); if ($this->loadedRowModifiers[$i]->hasBeenModified()) { $modified = true; } $i++; } if ($modified) { $this->newRowModifiers = $modifiers; } } } public function hasBeenModified() { return $this->newRowModifiers !== null || parent::hasBeenModified(); } public function getUniqueIdentifier() { return $this->get('source_name'); } /** * @param $name * @param Db $connection * @return ImportSource * @throws NotFoundError */ public static function loadByName($name, Db $connection) { $db = $connection->getDbAdapter(); $properties = $db->fetchRow( $db->select()->from('import_source')->where('source_name = ?', $name) ); if ($properties === false) { throw new NotFoundError(sprintf( 'There is no such Import Source: "%s"', $name )); } return static::create([], $connection)->setDbProperties($properties); } public static function existsWithName($name, Db $connection) { $db = $connection->getDbAdapter(); return (string) $name === (string) $db->fetchOne( $db->select() ->from('import_source', 'source_name') ->where('source_name = ?', $name) ); } /** * @param string $name * @param int $id * @param Db $connection * @api internal * @return bool */ protected static function existsWithNameAndId($name, $id, Db $connection) { $db = $connection->getDbAdapter(); $dummy = new static(); $idCol = $dummy->autoincKeyName; $keyCol = $dummy->keyName; return (string) $id === (string) $db->fetchOne( $db->select() ->from($dummy->table, $idCol) ->where("$idCol = ?", $id) ->where("$keyCol = ?", $name) ); } /** * @deprecated please use \Icinga\Module\Director\Data\FieldReferenceLoader * @return array */ protected function exportRowModifiers() { $modifiers = []; foreach ($this->fetchRowModifiers() as $modifier) { $modifiers[] = $modifier->export(); } return $modifiers; } /** * @param bool $required * @return ImportRun|null * @throws NotFoundError */ public function fetchLastRun($required = false) { return $this->fetchLastRunBefore(time() + 1, $required); } /** * @throws DuplicateKeyException */ protected function onStore() { parent::onStore(); if ($this->newRowModifiers !== null) { $connection = $this->getConnection(); $db = $connection->getDbAdapter(); $myId = $this->get('id'); if ($this->hasBeenLoadedFromDb()) { $db->delete( 'import_row_modifier', $db->quoteInto('source_id = ?', $myId) ); } foreach ($this->newRowModifiers as $modifier) { $modifier = ImportRowModifier::create((array) $modifier, $connection); $modifier->set('source_id', $myId); $modifier->store(); } } } /** * @param $timestamp * @param bool $required * @return ImportRun|null * @throws NotFoundError */ public function fetchLastRunBefore($timestamp, $required = false) { if (! $this->hasBeenLoadedFromDb()) { return $this->nullUnlessRequired($required); } if ($timestamp === null) { $timestamp = time(); } $db = $this->getDb(); $query = $db->select()->from( ['ir' => 'import_run'], 'ir.id' )->where('ir.source_id = ?', $this->get('id')) ->where('ir.start_time < ?', date('Y-m-d H:i:s', $timestamp)) ->order('ir.start_time DESC') ->limit(1); $runId = $db->fetchOne($query); if ($runId) { return ImportRun::load($runId, $this->getConnection()); } else { return $this->nullUnlessRequired($required); } } /** * @param $required * @return null * @throws NotFoundError */ protected function nullUnlessRequired($required) { if ($required) { throw new NotFoundError( 'No data has been imported for "%s" yet', $this->get('source_name') ); } return null; } public function applyModifiers(&$data) { $modifiers = $this->fetchFlatRowModifiers(); if (empty($modifiers)) { return $this; } foreach ($modifiers as $modPair) { /** @var PropertyModifierHook $modifier */ /** @var ?Filter $filter */ list($property, $modifier, $filter) = $modPair; $rejected = []; $newRows = []; foreach ($data as $key => $row) { if ($filter && ! $filter->matches($row)) { continue; } $this->applyPropertyModifierToRow($modifier, $property, $row); if ($modifier->rejectsRow()) { $rejected[] = $key; $modifier->rejectRow(false); } if ($modifier->expandsRows()) { $target = $modifier->getTargetProperty($property); $newValue = $row->$target; if (\is_array($newValue)) { foreach ($newValue as $val) { $newRow = clone $row; $newRow->$target = $val; $newRows[] = $newRow; } $rejected[] = $key; } } } foreach ($rejected as $key) { unset($data[$key]); } foreach ($newRows as $row) { $data[] = $row; } } return $this; } public function getObjectName() { return $this->get('source_name'); } public static function getKeyColumnName() { return 'source_name'; } protected function applyPropertyModifierToRow(PropertyModifierHook $modifier, $key, $row) { if (! is_object($row)) { throw new InvalidArgumentException('Every imported row MUST be an object'); } if ($modifier->requiresRow()) { $modifier->setRow($row); } if (property_exists($row, $key)) { $value = $row->$key; } elseif (strpos($key, '.') !== false) { $value = SyncUtils::getSpecificValue($row, $key); } else { $value = null; } $target = $modifier->getTargetProperty($key); if (strpos($target, '.') !== false) { throw new InvalidArgumentException(sprintf( 'Cannot set value for nested key "%s"', $target )); } if (is_array($value) && ! $modifier->hasArraySupport()) { $new = []; foreach ($value as $k => $v) { $new[$k] = $modifier->transform($v); } $row->$target = $new; } else { $row->$target = $modifier->transform($value); } } public function getRowModifiers() { if ($this->rowModifiers === null) { $this->prepareRowModifiers(); } return $this->rowModifiers; } public function hasRowModifiers() { return count($this->getRowModifiers()) > 0; } /** * @return ImportRowModifier[] */ public function fetchRowModifiers() { $db = $this->getDb(); $modifiers = ImportRowModifier::loadAll( $this->getConnection(), $db->select() ->from('import_row_modifier') ->where('source_id = ?', $this->get('id')) ->order('priority ASC') ); if ($modifiers) { return $modifiers; } else { return []; } } protected function fetchFlatRowModifiers() { $mods = []; foreach ($this->fetchRowModifiers() as $mod) { if ($filterExpression = $mod->get('filter_expression')) { $filter = FilterEnrichment::enrichFilter(Filter::fromQueryString($filterExpression)); } else { $filter = null; } $mods[] = [$mod->get('property_name'), $mod->getInstance(), $filter]; } return $mods; } protected function prepareRowModifiers() { $modifiers = []; foreach ($this->fetchRowModifiers() as $mod) { $name = $mod->get('property_name'); if (! array_key_exists($name, $modifiers)) { $modifiers[$name] = []; } $modifiers[$name][] = $mod->getInstance(); } $this->rowModifiers = $modifiers; } public function listModifierTargetProperties() { $list = []; foreach ($this->getRowModifiers() as $rowMods) { /** @var PropertyModifierHook $mod */ foreach ($rowMods as $mod) { if ($mod->hasTargetProperty()) { $list[$mod->getTargetProperty()] = true; } } } return array_keys($list); } /** * @param bool $runImport * @return bool * @throws DuplicateKeyException */ public function checkForChanges($runImport = false) { $hadChanges = false; $name = $this->get('source_name'); Benchmark::measure("Starting with import $name"); $this->raiseLimits(); try { $import = new Import($this); $this->set('last_attempt', date('Y-m-d H:i:s')); if ($import->providesChanges()) { Benchmark::measure("Found changes for $name"); $hadChanges = true; $this->set('import_state', 'pending-changes'); if ($runImport && $import->run()) { Benchmark::measure("Import succeeded for $name"); $this->set('import_state', 'in-sync'); } } else { $this->set('import_state', 'in-sync'); } $this->set('last_error_message', null); } catch (Exception $e) { $this->set('import_state', 'failing'); Benchmark::measure("Import failed for $name"); $this->set('last_error_message', $e->getMessage()); } if ($this->hasBeenModified()) { $this->store(); } return $hadChanges; } /** * @return bool * @throws DuplicateKeyException */ public function runImport() { return $this->checkForChanges(true); } /** * Raise PHP resource limits * * @return $this; */ protected function raiseLimits() { MemoryLimit::raiseTo('1024M'); ini_set('max_execution_time', '0'); return $this; } } icingaweb2-module-director-1.11.8/library/Director/Objects/InstantiatedViaHook.php000066400000000000000000000004311516513262500301450ustar00rootroot00000000000000 'object_name' ); protected $object; protected $flatObject; protected static $type; protected static $preparedFilters = array(); public static function prepare(IcingaObject $object) { return new static($object); } /** * Prepare a Filter with fixed columns, and store the result * * @param Filter $filter * * @return Filter */ protected static function getPreparedFilter(Filter $filter) { $hash = spl_object_hash($filter); if (! array_key_exists($hash, self::$preparedFilters)) { $filter = clone($filter); static::fixFilterColumns($filter); self::$preparedFilters[$hash] = $filter; } return self::$preparedFilters[$hash]; } public function matchesFilter(Filter $filter) { $filterObj = static::getPreparedFilter($filter); if ($filterObj->isExpression() || ! $filterObj->isEmpty()) { return AssignFilterHelper::matchesFilter($filterObj, $this->flatObject); } else { return false; } } /** * @param Filter $filter * @param Db $db * * @return array */ public static function forFilter(Filter $filter, Db $db) { $result = array(); Benchmark::measure(sprintf('Starting Filter %s', $filter)); $filter = clone($filter); static::fixFilterColumns($filter); $helper = new AssignFilterHelper($filter); foreach (static::flatObjects($db) as $object) { if ($helper->matches($object)) { $name = $object->object_name; $result[] = $name; } } Benchmark::measure(sprintf('Got %d results for %s', count($result), $filter)); return array_values($result); } protected static function getType() { if (static::$type === null) { throw new ProgrammingError( 'Implementations of %s need ::$type to be defined, %s has not', __CLASS__, get_called_class() ); } return static::$type; } protected static function flatObjects(Db $db) { if (self::$flatObjects === null) { self::$flatObjects = static::fetchFlatObjects($db); } return self::$flatObjects; } protected static function raiseLimits() { // Note: IcingaConfig also raises the limit for generation, **but** we // need the higher limit for preview. MemoryLimit::raiseTo('1024M'); } protected static function fetchFlatObjects(Db $db) { return static::fetchFlatObjectsByType($db, static::getType()); } protected static function fetchFlatObjectsByType(Db $db, $type) { self::raiseLimits(); Benchmark::measure("ObjectApplyMatches: prefetching $type"); PrefetchCache::initialize($db); /** @var IcingaObject $class */ $class = DbObjectTypeRegistry::classByType($type); $all = $class::prefetchAll($db); Benchmark::measure("ObjectApplyMatches: related objects for $type"); $class::prefetchAllRelationsByType($type, $db); Benchmark::measure("ObjectApplyMatches: preparing flat $type objects"); $objects = array(); foreach ($all as $object) { if ($object->isTemplate()) { continue; } $flat = $object->toPlainObject(true, false); static::flattenVars($flat); $objects[$object->getObjectName()] = $flat; } Benchmark::measure("ObjectApplyMatches: $type cache ready"); return $objects; } public static function fixFilterColumns(Filter $filter) { if ($filter->isExpression()) { /** @var FilterExpression $filter */ static::fixFilterExpressionColumn($filter); } else { foreach ($filter->filters() as $sub) { static::fixFilterColumns($sub); } } } protected static function fixFilterExpressionColumn(FilterExpression $filter) { if (static::columnIsJson($filter)) { $column = $filter->getExpression(); $filter->setExpression($filter->getColumn()); $filter->setColumn($column); } $col = $filter->getColumn(); $type = static::$type; if ($type && substr($col, 0, strlen($type) + 1) === "{$type}.") { $filter->setColumn($col = substr($col, strlen($type) + 1)); } if (array_key_exists($col, self::$columnMap)) { $filter->setColumn(self::$columnMap[$col]); } $filter->setExpression(json_decode($filter->getExpression())); } protected static function columnIsJson(FilterExpression $filter) { $col = $filter->getColumn(); return strlen($col) && $col[0] === '"'; } /** * Helper, flattens all vars of a given object * * The object itself will be modified, and the 'vars' property will be * replaced with corresponding 'vars.whatever' properties * * @param $object * @param string $key */ protected static function flattenVars(stdClass $object, $key = 'vars') { if (property_exists($object, 'vars')) { foreach ($object->vars as $k => $v) { if (is_object($v)) { static::flattenVars($v, $k); } $object->{$key . '.' . $k} = $v; } unset($object->vars); } } protected function __construct(IcingaObject $object) { $this->object = $object; $flat = $object->toPlainObject(true, false); // Sure, we are flat - but we might still want to match templates. unset($flat->imports); $flat->templates = $object->listFlatResolvedImportNames(); $this->addAppliedGroupsToFlatObject($flat, $object); static::flattenVars($flat); $this->flatObject = $flat; } protected function addAppliedGroupsToFlatObject($flat, IcingaObject $object) { if ($object instanceof IcingaHost) { $appliedGroups = $object->getAppliedGroups(); if (! empty($appliedGroups)) { if (isset($flat->groups)) { $flat->groups = array_merge($flat->groups, $appliedGroups); } else { $flat->groups = $appliedGroups; } } } } } icingaweb2-module-director-1.11.8/library/Director/Objects/ObjectWithArguments.php000066400000000000000000000004271516513262500301720ustar00rootroot00000000000000 null, 'rule_id' => null, 'source_id' => null, 'source_expression' => null, 'destination_field' => null, 'priority' => null, 'filter_expression' => null, 'merge_policy' => null ]; protected function beforeStore() { if (! $this->hasBeenLoadedFromDb() && $this->get('priority') === null) { $this->setNextPriority('rule_id'); } } public function setSource($name) { $source = ImportSource::loadByName($name, $this->getConnection()); $this->set('source_id', $source->get('id')); return $this; } protected function onInsert() { $this->refreshPriortyProperty(); } } icingaweb2-module-director-1.11.8/library/Director/Objects/SyncRule.php000066400000000000000000000337171516513262500260160ustar00rootroot00000000000000 null, 'rule_name' => null, 'object_type' => null, 'update_policy' => null, 'purge_existing' => null, 'purge_action' => null, 'filter_expression' => null, 'sync_state' => 'unknown', 'last_error_message' => null, 'last_attempt' => null, 'description' => null, ]; protected $stateProperties = [ 'sync_state', 'last_error_message', 'last_attempt', ]; protected $booleans = [ 'purge_existing' => 'purge_existing', ]; private $sync; private $purgeStrategy; private $filter; private $hasCombinedKey; /** @var SyncProperty[] */ private $syncProperties; private $sourceKeyPattern; private $destinationKeyPattern; private $newSyncProperties; public function listInvolvedSourceIds() { if (! $this->hasBeenLoadedFromDb()) { return []; } $db = $this->getDb(); return array_map('intval', array_unique( $db->fetchCol( $db->select() ->from(['p' => 'sync_property'], 'p.source_id') ->join(['s' => 'import_source'], 's.id = p.source_id', array()) ->where('rule_id = ?', $this->get('id')) ->order('s.source_name') ) )); } /** * @return array * @throws \Icinga\Exception\NotFoundError */ public function fetchInvolvedImportSources() { $sources = []; foreach ($this->listInvolvedSourceIds() as $sourceId) { $sources[$sourceId] = ImportSource::loadWithAutoIncId($sourceId, $this->getConnection()); } return $sources; } public function getLastSyncTimestamp() { if (! $this->hasBeenLoadedFromDb()) { return null; } $db = $this->getDb(); $query = $db->select()->from( ['sr' => 'sync_run'], 'sr.start_time' )->where('sr.rule_id = ?', $this->get('id')) ->order('sr.start_time DESC') ->limit(1); return $db->fetchOne($query); } public function getLastSyncRunId() { if (! $this->hasBeenLoadedFromDb()) { return null; } $db = $this->getDb(); $query = $db->select()->from( ['sr' => 'sync_run'], 'sr.id' )->where('sr.rule_id = ?', $this->get('id')) ->order('sr.start_time DESC') ->limit(1); return $db->fetchOne($query); } public function matches($row) { if ($this->get('filter_expression') === null) { return true; } return $this->filter()->matches($row); } /** * @param bool $apply * @return bool * @throws DuplicateKeyException */ public function checkForChanges($apply = false) { $hadChanges = false; Benchmark::measure('Checking sync rule ' . $this->get('rule_name')); try { $this->set('last_attempt', date('Y-m-d H:i:s')); $this->set('sync_state', 'unknown'); $sync = $this->sync(); if ($sync->hasModifications()) { Benchmark::measure('Got modifications for sync rule ' . $this->get('rule_name')); $this->set('sync_state', 'pending-changes'); if ($apply && $runId = $sync->apply()) { Benchmark::measure('Successfully synced rule ' . $this->get('rule_name')); $this->set('sync_state', 'in-sync'); } $hadChanges = true; } else { Benchmark::measure('No modifications for sync rule ' . $this->get('rule_name')); $this->set('sync_state', 'in-sync'); } $this->set('last_error_message', null); } catch (Exception $e) { $this->set('sync_state', 'failing'); $this->set('last_error_message', $e->getMessage()); // TODO: Store last error details / trace? } if ($this->hasBeenModified()) { $this->store(); } return $hadChanges; } /** * @return IcingaObject[] * @throws IcingaException */ public function getExpectedModifications() { return $this->sync()->getExpectedModifications(); } /** * @return bool * @throws DuplicateKeyException */ public function applyChanges() { return $this->checkForChanges(true); } public function getSourceKeyPattern() { if ($this->hasCombinedKey()) { return $this->sourceKeyPattern; } else { return null; // ?? } } public function getDestinationKeyPattern() { if ($this->hasCombinedKey()) { return $this->destinationKeyPattern; } else { return null; // ?? } } protected function sync() { if ($this->sync === null) { $this->sync = new Sync($this); } return $this->sync; } /** * @return Filter */ public function filter() { if ($this->filter === null) { $this->filter = Filter::fromQueryString($this->get('filter_expression')); } return $this->filter; } public function purgeStrategy() { if ($this->purgeStrategy === null) { $this->purgeStrategy = $this->loadConfiguredPurgeStrategy(); } return $this->purgeStrategy; } // TODO: Allow for more protected function loadConfiguredPurgeStrategy() { if ($this->get('purge_existing') === 'y') { return PurgeStrategy::load('ImportRunBased', $this); } else { return PurgeStrategy::load('PurgeNothing', $this); } } /** * Flat object has 'properties', but setProperties() is not available in DbObject * * @return void */ public function setSyncProperties(?array $value) { $this->newSyncProperties = $value; } public function getUniqueIdentifier() { return $this->get('rule_name'); } /** * @throws DuplicateKeyException */ protected function onStore() { parent::onStore(); if ($this->newSyncProperties !== null) { $connection = $this->getConnection(); $db = $connection->getDbAdapter(); $myId = $this->get('id'); if ($this->hasBeenLoadedFromDb()) { $db->delete( 'sync_property', $db->quoteInto('rule_id = ?', $myId) ); } foreach ($this->newSyncProperties as $property) { unset($property->rule_name); $property = SyncProperty::create((array) $property, $connection); $property->set('rule_id', $myId); $property->store(); } } } /** * @deprecated * @return array */ protected function exportSyncProperties() { $all = []; $db = $this->getDb(); $sourceNames = $db->fetchPairs( $db->select()->from('import_source', ['id', 'source_name']) ); foreach ($this->getSyncProperties() as $property) { $properties = $property->getProperties(); $properties['source'] = $sourceNames[$properties['source_id']]; unset($properties['id']); unset($properties['rule_id']); unset($properties['source_id']); ksort($properties); $all[] = (object) $properties; } return $all; } /** * Whether we have a combined key (e.g. services on hosts) * * @return bool */ public function hasCombinedKey() { if ($this->hasCombinedKey === null) { $this->hasCombinedKey = false; // TODO: Move to Objects if ($this->get('object_type') === 'service') { $hasHost = false; $hasObjectName = false; $hasServiceSet = false; foreach ($this->getSyncProperties() as $key => $property) { if ($property->destination_field === 'host') { $hasHost = $property->source_expression; } if ($property->destination_field === 'service_set') { $hasServiceSet = $property->source_expression; } if ($property->destination_field === 'object_name') { $hasObjectName = $property->source_expression; } } if ($hasHost !== false && $hasObjectName !== false) { $this->hasCombinedKey = true; $this->sourceKeyPattern = sprintf( '%s!%s', $hasHost, $hasObjectName ); $this->destinationKeyPattern = '${host}!${object_name}'; } elseif ($hasServiceSet !== false && $hasObjectName !== false) { $this->hasCombinedKey = true; $this->sourceKeyPattern = sprintf( '%s!%s', $hasServiceSet, $hasObjectName ); $this->destinationKeyPattern = '${service_set}!${object_name}'; } } elseif ($this->get('object_type') === 'serviceSet') { $hasHost = false; $hasObjectName = false; foreach ($this->getSyncProperties() as $key => $property) { if ($property->destination_field === 'host') { $hasHost = $property->source_expression; } if ($property->destination_field === 'object_name') { $hasObjectName = $property->source_expression; } } if ($hasHost !== false && $hasObjectName !== false) { $this->hasCombinedKey = true; $this->sourceKeyPattern = sprintf( '%s!%s', $hasHost, $hasObjectName ); $this->destinationKeyPattern = '${host}!${object_name}'; } } elseif ($this->get('object_type') === 'datalistEntry') { $hasList = false; $hasName = false; foreach ($this->getSyncProperties() as $key => $property) { if ($property->destination_field === 'list_id') { $hasList = $property->source_expression; } if ($property->destination_field === 'entry_name') { $hasName = $property->source_expression; } } if ($hasList !== false && $hasName !== false) { $this->hasCombinedKey = true; $this->sourceKeyPattern = sprintf( '%s!%s', $hasList, $hasName ); $this->destinationKeyPattern = '${list_id}!${entry_name}'; } } } return $this->hasCombinedKey; } public function hasSyncProperties() { $properties = $this->getSyncProperties(); return ! empty($properties); } /** * @return SyncProperty[] */ public function getSyncProperties() { if (! $this->hasBeenLoadedFromDb()) { return []; } if ($this->syncProperties === null) { $this->syncProperties = $this->fetchSyncProperties(); } return $this->syncProperties; } public function fetchSyncProperties() { $db = $this->getDb(); return SyncProperty::loadAll( $this->getConnection(), $db->select() ->from('sync_property') ->where('rule_id = ?', $this->get('id')) ->order('priority ASC') ); } /** * TODO: implement in a generic way, this is duplicated code * * @param string $name * @param Db $connection * @api internal * @return bool */ public static function existsWithName($name, Db $connection) { $db = $connection->getDbAdapter(); return (string) $name === (string) $db->fetchOne( $db->select() ->from('sync_rule', 'rule_name') ->where('rule_name = ?', $name) ); } /** * @param string $name * @param int $id * @param Db $connection * @api internal * @return bool */ protected static function existsWithNameAndId($name, $id, Db $connection) { $db = $connection->getDbAdapter(); $dummy = new static(); $idCol = $dummy->autoincKeyName; $keyCol = $dummy->keyName; return (string) $id === (string) $db->fetchOne( $db->select() ->from($dummy->table, $idCol) ->where("$idCol = ?", $id) ->where("$keyCol = ?", $name) ); } } icingaweb2-module-director-1.11.8/library/Director/Objects/SyncRun.php000066400000000000000000000023161516513262500256420ustar00rootroot00000000000000 null, 'rule_id' => null, 'rule_name' => null, 'start_time' => null, 'duration_ms' => null, 'objects_created' => null, 'objects_deleted' => null, 'objects_modified' => null, 'last_former_activity' => null, 'last_related_activity' => null, ); public static function start(SyncRule $rule) { return static::create( array( 'start_time' => date('Y-m-d H:i:s'), 'rule_id' => $rule->id, 'rule_name' => $rule->rule_name, ), $rule->getConnection() ); } public function countActivities() { return (int) $this->get('objects_deleted') + (int) $this->get('objects_created') + (int) $this->get('objects_modified'); } } icingaweb2-module-director-1.11.8/library/Director/PlainObjectRenderer.php000066400000000000000000000067131516513262500265360ustar00rootroot00000000000000 $val) { $vals[] = $prefix . self::INDENTATION . $key . ': ' . self::renderObject($val, $prefix . self::INDENTATION); } return "{\n" . implode(",\n", $vals) . "\n$prefix}"; } protected static function renderObject($object, $prefix = '') { if (is_null($object)) { return self::renderNull(); } elseif (is_bool($object)) { return self::renderBoolean($object); } elseif (is_integer($object)) { return self::renderInteger($object); } elseif (is_float($object)) { return self::renderFloat($object); } elseif (is_object($object) || static::isAssocArray($object)) { return self::renderHash($object, $prefix); } elseif (is_array($object)) { return self::renderArray($object, $prefix); } elseif (is_string($object)) { return self::renderString($object); } else { return '(UNKNOWN TYPE) ' . var_export($object, true); } } /** * Check if an array contains assoc keys * * @from https://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential * @param $arr * @return bool */ protected static function isAssocArray($arr) { if (! is_array($arr)) { return false; } if (array() === $arr) { return false; } return array_keys($arr) !== range(0, count($arr) - 1); } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/000077500000000000000000000000001516513262500254405ustar00rootroot00000000000000PropertyModifierArrayElementByPosition.php000066400000000000000000000127231516513262500357330ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifieraddElement('select', 'position_type', [ 'label' => $form->translate('Position Type'), 'required' => true, 'multiOptions' => $form->optionalEnum([ 'first' => $form->translate('First Element'), 'last' => $form->translate('Last Element'), 'fixed' => $form->translate('Specific Element (by position)'), 'keyname' => $form->translate('Specific Element (by key name)'), ]), ]); $form->addElement('text', 'position', [ 'label' => $form->translate('Position'), 'description' => $form->translate( 'Numeric position or key name' ), ]); $form->addElement('select', 'when_missing', [ 'label' => $form->translate('When not available'), 'required' => true, 'description' => $form->translate( 'What should happen when the specified element is not available?' ), 'value' => 'null', 'multiOptions' => $form->optionalEnum([ 'fail' => $form->translate('Let the whole Import Run fail'), 'null' => $form->translate('return NULL'), ]) ]); } /** * @param $value * @return string|null * @throws ConfigurationError * @throws InvalidArgumentException */ public function transform($value) { // First and Last will work with hashes too: if ($value instanceof stdClass) { $value = (array) $value; } if (! is_array($value)) { return $this->emptyValue($value); } switch ($this->getSetting('position_type')) { case 'first': if (empty($value)) { return $this->emptyValue($value); } else { return array_shift($value); } // https://github.com/squizlabs/PHP_CodeSniffer/pull/1363 case 'last': if (empty($value)) { return $this->emptyValue($value); } else { return array_pop($value); } // https://github.com/squizlabs/PHP_CodeSniffer/pull/1363 case 'fixed': $pos = $this->getSetting('position'); if (! is_int($pos) && ! ctype_digit($pos)) { throw new InvalidArgumentException(sprintf( '"%s" is not a valid array position', $pos )); } $pos = (int) $pos; if (array_key_exists($pos, $value)) { return $value[$pos]; } else { return $this->emptyValue($value); } // https://github.com/squizlabs/PHP_CodeSniffer/pull/1363 case 'keyname': $pos = $this->getSetting('position'); if (! is_string($pos)) { throw new InvalidArgumentException(sprintf( '"%s" is not a valid array key name', $pos )); } if (array_key_exists($pos, $value)) { return $value[$pos]; } else { return $this->emptyValue($value); } // https://github.com/squizlabs/PHP_CodeSniffer/pull/1363 default: throw new ConfigurationError( '"%s" is not a valid array position_type', $this->getSetting('position_type') ); } } /** * @return string * @throws ConfigurationError */ protected function getPositionForError() { switch ($this->getSetting('position_type')) { case 'first': return 'first'; case 'last': return 'last'; case 'fixed': return '#' . $this->getSetting('position'); case 'keyname': return '#' . $this->getSetting('position'); default: throw new ConfigurationError( '"%s" is not a valid array position_type', $this->getSetting('position_type') ); } } /** * @param $value * @return null * @throws ConfigurationError */ protected function emptyValue($value) { if ($this->getSetting('when_missing', 'fail') === 'null') { return null; } else { throw new InvalidArgumentException(sprintf( 'There is no %s element in %s', $this->getPositionForError(), json_encode($value) )); } } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierArrayFilter.php000066400000000000000000000111051516513262500336170ustar00rootroot00000000000000addElement('select', 'filter_method', array( 'label' => $form->translate('Filter method'), 'required' => true, 'value' => 'wildcard', 'multiOptions' => $form->optionalEnum(array( 'wildcard' => $form->translate('Simple match with wildcards (*)'), 'regex' => $form->translate('Regular Expression'), )), )); $form->addElement('text', 'filter_string', array( 'label' => 'Filter', 'description' => $form->translate( 'The string/pattern you want to search for. Depends on the' . ' chosen method, use www.* or *linux* for wildcard matches' . ' and expression like /^www\d+\./ in case you opted for a' . ' regular expression' ), 'required' => true, )); $form->addElement('select', 'policy', array( 'label' => $form->translate('Policy'), 'required' => true, 'description' => $form->translate( 'What should happen with matching elements?' ), 'value' => 'keep', 'multiOptions' => array( 'keep' => $form->translate('Keep matching elements'), 'reject' => $form->translate('Reject matching elements'), ), )); $form->addElement('select', 'when_empty', array( 'label' => $form->translate('When empty'), 'required' => true, 'description' => $form->translate( 'What should happen when the result array is empty?' ), 'value' => 'empty_array', 'multiOptions' => $form->optionalEnum(array( 'empty_array' => $form->translate('return an empty array'), 'null' => $form->translate('return NULL'), )) )); } public function matchesRegexp($string, $expression) { return preg_match($expression, $string); } public function matchesWildcard($string, $expression) { return $this->filterExpression->matches( (object) array('value' => $string) ); } public function transform($value) { if (empty($value)) { return $this->emptyValue(); } if (is_string($value)) { $value = [$value]; } if (! is_array($value)) { throw new InvalidPropertyException( 'The ArrayFilter property modifier be applied to arrays only' ); } $method = $this->getSetting('filter_method'); $filter = $this->getSetting('filter_string'); $policy = $this->getSetting('policy'); switch ($method) { case 'wildcard': $func = 'matchesWildcard'; $this->filterExpression = new FilterExpression('value', '=', $filter); break; case 'regex': $func = 'matchesRegexp'; break; default: throw new ConfigurationError( '%s is not a valid value for an ArrayFilter filter_method', var_export($method, true) ); } $result = array(); foreach ($value as $val) { if ($this->$func($val, $filter)) { if ($policy === 'keep') { $result[] = $val; } } else { if ($policy === 'reject') { $result[] = $val; } } } if (empty($result)) { return $this->emptyValue(); } return $result; } protected function emptyValue() { if ($this->getSetting('when_empty', 'empty_array') === 'empty_array') { return array(); } else { return null; } } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierArrayToRow.php000066400000000000000000000037771516513262500334640ustar00rootroot00000000000000addElement('select', 'on_empty', [ 'label' => 'When empty', 'description' => $form->translate('What should we do in case the given value is empty?'), 'multiOptions' => $form->optionalEnum([ 'reject' => $form->translate('Drop the current row'), 'fail' => $form->translate('Let the whole import run fail'), 'keep' => $form->translate('Keep the row, set the column value to null'), ]), 'value' => 'reject', 'required' => true, ]); } public function hasArraySupport() { return true; } public function expandsRows() { return true; } public function transform($value) { if (empty($value)) { $onDuplicate = $this->getSetting('on_empty', 'reject'); switch ($onDuplicate) { case 'reject': return []; case 'keep': return [null]; case 'fail': throw new InvalidArgumentException('Failed to clone row, value is empty'); default: throw new InvalidArgumentException( "'$onDuplicate' is not a valid 'on_duplicate' setting" ); } } if (! \is_array($value)) { throw new InvalidArgumentException( "Array required to clone this row, got " . Error::getPhpTypeName($value) ); } return $value; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierArrayUnique.php000066400000000000000000000014611516513262500336440ustar00rootroot00000000000000addElement('text', 'bitmask', array( 'label' => 'Bitmask', 'description' => $form->translate( 'The numeric bitmask you want to apply. In case you have a hexadecimal' . ' or binary mask please transform it to a decimal number first. The' . ' result of this modifier is a boolean value, telling whether the' . ' given mask applies to the numeric value in your source column' ), 'required' => true, )); } public function getName() { return 'Bitmask match (numeric)'; } public function transform($value) { if ($value === null) { return null; } $mask = (int) $this->getSetting('bitmask'); return (((int) $value) & $mask) === $mask; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierCombine.php000066400000000000000000000023551516513262500327560ustar00rootroot00000000000000addElement('text', 'pattern', array( 'label' => $form->translate('Pattern'), 'required' => false, 'description' => $form->translate( 'This pattern will be evaluated, and variables like ${some_column}' . ' will be filled accordingly. A typical use-case is generating' . ' unique service identifiers via ${host}!${service} in case your' . ' data source doesn\'t allow you to ship such. The chosen "property"' . ' has no effect here and will be ignored.' ) )); } public function getName() { return 'Combine multiple properties'; } public function requiresRow() { return true; } public function transform($value) { return SyncUtils::fillVariables($this->getSetting('pattern'), $this->getRow()); } } PropertyModifierDictionaryToRow.php000066400000000000000000000055711516513262500344260ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifieraddElement('text', 'key_column', [ 'label' => $form->translate('Key Property Name'), 'description' => $form->translate( 'Every Dictionary entry has a key, its value will be provided in this column' ) ]); $form->addElement('select', 'on_empty', [ 'label' => $form->translate('When empty'), 'description' => $form->translate('What should we do in case the given value is empty?'), 'multiOptions' => $form->optionalEnum([ 'reject' => $form->translate('Drop the current row'), 'fail' => $form->translate('Let the whole import run fail'), 'keep' => $form->translate('Keep the row, set the column value to null'), ]), 'value' => 'reject', 'required' => true, ]); } public function requiresRow() { return true; } public function hasArraySupport() { return true; } public function expandsRows() { return true; } public function transform($value) { if (empty($value)) { $onDuplicate = $this->getSetting('on_empty', 'reject'); switch ($onDuplicate) { case 'reject': return []; case 'keep': return [null]; case 'fail': throw new InvalidArgumentException('Failed to clone row, value is empty'); default: throw new InvalidArgumentException( "'$onDuplicate' is not a valid 'on_duplicate' setting" ); } } $keyColumn = $this->getSetting('key_column'); if (! \is_object($value)) { throw new InvalidArgumentException( "Object required to clone this row, got " . Error::getPhpTypeName($value) ); } $result = []; foreach ($value as $key => $properties) { if (! is_object($properties)) { throw new InvalidDataException( sprintf('Nested "%s" dictionary', $key), $properties ); } $properties->$keyColumn = $key; $result[] = $properties; } return $result; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierDnsRecords.php000066400000000000000000000063711516513262500334520ustar00rootroot00000000000000 DNS_A, 'AAAA' => DNS_AAAA, 'CNAME' => DNS_CNAME, 'MX' => DNS_MX, 'NS' => DNS_NS, 'PTR' => DNS_PTR, 'TXT' => DNS_TXT, ); public static function addSettingsFormFields(QuickForm $form) { $form->addElement('select', 'record_type', array( 'label' => 'Record type', 'description' => $form->translate('DNS record type'), 'multiOptions' => $form->optionalEnum(static::enumTypes()), 'required' => true, )); $form->addElement('select', 'on_failure', array( 'label' => 'On failure', 'description' => $form->translate('What should we do if the DNS lookup fails?'), 'multiOptions' => $form->optionalEnum(array( 'null' => $form->translate('Set no value (null)'), 'keep' => $form->translate('Keep the property as is'), 'fail' => $form->translate('Let the whole import run fail'), )), 'required' => true, )); } protected static function enumTypes() { $types = array_keys(self::$types); return array_combine($types, $types); } public function getName() { return 'Get DNS records of a specific type'; } public function transform($value) { if ($value === null) { return null; } $type = self::$types[$this->getSetting('record_type')]; $response = dns_get_record($value, $type); if ($response === false) { switch ($this->getSetting('on_failure')) { case 'null': return null; case 'keep': return $value; case 'fail': default: throw new InvalidPropertyException( 'DNS lookup failed for "%s"', $value ); } } $result = array(); switch ($type) { case DNS_A: return $this->extractProperty('ip', $response); case DNS_AAAA: return $this->extractProperty('ipv6', $response); case DNS_CNAME: case DNS_MX: case DNS_NS: case DNS_PTR: return $this->extractProperty('target', $response); case DNS_TXT: return $this->extractProperty('txt', $response); return $response; } return $result; } protected function extractProperty($key, $response) { $result = array(); foreach ($response as $entry) { $result[] = $entry[$key]; } if (version_compare(PHP_VERSION, '5.4.0') >= 0) { sort($result, SORT_NATURAL); } else { natsort($result); $result = array_values($result); } return $result; } } PropertyModifierExtractFromDN.php000066400000000000000000000062771516513262500340120ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifieraddElement('select', 'dn_component', array( 'label' => $form->translate('DN component'), 'description' => $form->translate('What should we extract from the DN?'), 'multiOptions' => $form->optionalEnum(array( 'cn' => $form->translate('The first (leftmost) CN'), 'ou' => $form->translate('The first (leftmost) OU'), 'first' => $form->translate('Any first (leftmost) component'), 'last_ou' => $form->translate('The last (rightmost) OU'), )), 'required' => true, )); $form->addElement('select', 'on_failure', array( 'label' => $form->translate('On failure'), 'description' => $form->translate('What should we do if the desired part does not exist?'), 'multiOptions' => $form->optionalEnum(array( 'null' => $form->translate('Set no value (null)'), 'keep' => $form->translate('Keep the DN as is'), 'fail' => $form->translate('Let the whole import run fail'), )), 'required' => true, )); } public function getName() { return 'Extract from a Distinguished Name (DN)'; } public function transform($value) { if ($value === null) { return null; } $parts = LdapUtils::explodeDN($value); $result = null; switch ($this->getSetting('dn_component')) { case 'cn': $result = $this->extractFirst($parts, 'cn'); break; case 'ou': $result = $this->extractFirst($parts, 'ou'); break; case 'last_ou': $result = $this->extractFirst(array_reverse($parts), 'ou'); break; case 'first': $result = $this->extractFirst($parts); break; } if ($result === null) { switch ($this->getSetting('on_failure')) { case 'null': return null; case 'keep': return $value; case 'fail': default: throw new InvalidPropertyException( 'DN part extraction failed for %s', var_export($value, true) ); } } return $result; } protected function extractFirst($parts, $what = null) { foreach ($parts as $part) { if (false === ($pos = strpos($part, '='))) { continue; } if (null === $what || strtolower(substr($part, 0, $pos)) === $what) { return substr($part, $pos + 1); } } return null; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierFromAdSid.php000066400000000000000000000020231516513262500332020ustar00rootroot00000000000000addElement('select', 'on_failure', array( 'label' => 'On failure', 'description' => $form->translate('What should we do if the host (DNS) lookup fails?'), 'multiOptions' => $form->optionalEnum(array( 'null' => $form->translate('Set no value (null)'), 'keep' => $form->translate('Keep the property (hostname) as is'), 'fail' => $form->translate('Let the whole import run fail'), )), 'required' => true, )); } public function getName() { return mt('director', 'Get host by address (Reverse DNS lookup)'); } public function transform($value) { if ($value === null) { return null; } $host = gethostbyaddr($value); if ($host === false) { switch ($this->getSetting('on_failure')) { case 'null': return null; case 'keep': return $value; case 'fail': default: throw new InvalidPropertyException( 'Reverse Host lookup failed for "%s"', $value ); } } return $host; } } PropertyModifierGetHostByName.php000066400000000000000000000035171516513262500337750ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifieraddElement('select', 'on_failure', array( 'label' => 'On failure', 'description' => $form->translate('What should we do if the host (DNS) lookup fails?'), 'multiOptions' => $form->optionalEnum(array( 'null' => $form->translate('Set no value (null)'), 'keep' => $form->translate('Keep the property (hostname) as is'), 'fail' => $form->translate('Let the whole import run fail'), )), 'required' => true, )); } public function getName() { return mt('director', 'Get host by name (DNS lookup)'); } public function transform($value) { if ($value === null) { return null; } $host = gethostbyname($value); // Workaround for "inet_pton: unrecognized address" error in PHP 7.2 if ($host !== $value) { $inAddr = inet_pton($host); } else { $inAddr = false; } if (! $inAddr || strlen($inAddr) !== 4) { switch ($this->getSetting('on_failure')) { case 'null': return null; case 'keep': return $value; case 'fail': default: throw new InvalidPropertyException( 'Host lookup failed for "%s"', $value ); } } return $host; } } PropertyModifierGetPropertyFromOtherImportSource.php000066400000000000000000000075631516513262500400170ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifiergetDb(); $form->addElement('select', 'import_source_id', [ 'label' => $form->translate('Import Source'), 'description' => $form->translate( 'Another Import Source. We\'re going to look up the row with the' . ' key matching the value in the chosen column' ), 'required' => true, 'multiOptions' => $form->optionalEnum($db->enumImportSource()), 'class' => 'autosubmit', ]); if ($form->hasBeenSent()) { $sourceId = $form->getSentValue('import_source_id'); } else { $object = $form->getObject(); if ($object instanceof ImportRowModifier) { $sourceId = $object->getSetting('import_source_id'); } else { $sourceId = null; } } $extra = []; if ($sourceId) { $extra = [ 'class' => 'director-suggest', 'data-suggestion-context' => 'importsourceproperties!' . (int) $sourceId, ]; } $form->addElement('text', 'foreign_property', [ 'label' => $form->translate('Property'), 'required' => true, 'description' => $form->translate( 'The property to get from the row we found in the chosen Import Source' ), ] + $extra); } /** * @param $settings * @return PropertyModifierHook * @throws \Icinga\Exception\NotFoundError */ public function setSettings(array $settings) { if (isset($settings['import_source'])) { $settings['import_source_id'] = ImportSource::load( $settings['import_source'], $this->getDb() )->get('id'); unset($settings['import_source']); } return parent::setSettings($settings); } public function transform($value) { $data = $this->getImportedData(); if (isset($data[$value])) { return $data[$value]->{$this->getSetting('foreign_property')}; } else { return null; } } public function exportSettings() { $settings = parent::exportSettings(); $settings->import_source = $this->getImportSource()->getObjectName(); unset($settings->import_source_id); return $settings; } protected function & getImportedData() { if ($this->importedData === null) { $this->importedData = $this->getImportSource() ->fetchLastRun(true) ->fetchRows([$this->getSetting('foreign_property')]); } return $this->importedData; } protected function getImportSource() { if ($this->importSource === null) { $this->importSource = ImportSource::loadWithAutoIncId( $this->getSetting('import_source_id'), $this->getDb() ); } return $this->importSource; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierJoin.php000066400000000000000000000015521516513262500322770ustar00rootroot00000000000000addElement('text', 'glue', array( 'label' => $form->translate('Glue'), 'required' => false, 'description' => $form->translate( 'One or more characters that will be used to glue an input array to a string. Can be left empty' ) )); } public function hasArraySupport() { return true; } public function transform($value) { if ($value === null) { return null; } return implode($this->getSetting('glue'), $value); } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierJsonDecode.php000066400000000000000000000040171516513262500334140ustar00rootroot00000000000000addElement('select', 'on_failure', array( 'label' => 'On failure', 'description' => $form->translate( 'What should we do in case we are unable to decode the given string?' ), 'multiOptions' => $form->optionalEnum(array( 'null' => $form->translate('Set no value (null)'), 'keep' => $form->translate('Keep the JSON string as is'), 'fail' => $form->translate('Let the whole import run fail'), )), 'required' => true, )); } public function getName() { return 'Decode a JSON string'; } /** * @param $value * @return mixed|null * @throws InvalidPropertyException|\gipfl\Json\JsonDecodeException */ public function transform($value) { if (null === $value) { return null; } try { if (is_string($value)) { $decoded = JsonString::decode($value); } else { throw new InvalidPropertyException( 'JSON decode expects a string, got ' . gettype($value) ); } } catch (Exception $e) { switch ($this->getSetting('on_failure')) { case 'null': return null; case 'keep': return $value; case 'fail': default: throw $e; } } return $decoded; } } PropertyModifierLConfCustomVar.php000066400000000000000000000020511516513262500341610ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifierextractLConfVars($value, $vars); return $vars; } public function getName() { return 'Transform LConf CustomVars to Hash'; } public function hasArraySupport() { return true; } protected function extractLConfVars($value, $vars) { if (is_string($value)) { $this->extractLConfVar($value, $vars); } elseif (is_array($value)) { foreach ($value as $val) { $this->extractLConfVar($val, $vars); } } } protected function extractLConfVar($value, $vars) { list($key, $val) = preg_split('/ /', $value, 2); $key = ltrim($key, '_'); $vars->$key = $val; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierListToObject.php000066400000000000000000000063101516513262500337420ustar00rootroot00000000000000addElement('text', 'key_property', [ 'label' => $form->translate('Key Property'), 'required' => true, 'description' => $form->translate( 'Each Array in the list must contain this property. It\'s value' . ' will be used as the key/object property name for the row.' ) ]); $form->addElement('select', 'on_duplicate', [ 'label' => 'On duplicate key', 'description' => $form->translate('What should we do, if the same key occurs twice?'), 'multiOptions' => $form->optionalEnum([ 'fail' => $form->translate('Let the whole import run fail'), 'keep_first' => $form->translate('Keep the first row with that key'), 'keep_last' => $form->translate('Keep the last row with that key'), ]), 'required' => true, ]); } public function getName() { return 'Transform Array/Object list into single Object'; } public function hasArraySupport() { return true; } public function transform($value) { if ($value === null) { return null; } if (! \is_array($value)) { throw new InvalidArgumentException( 'Array expected, got ' . Error::getPhpTypeName($value) ); } $keyProperty = $this->getSetting('key_property'); $onDuplicate = $this->getSetting('on_duplicate'); $result = (object) []; foreach ($value as $key => $row) { if (\is_object($row)) { $row = (array) $row; } if (! \is_array($row)) { throw new InvalidArgumentException( "List of Arrays expected expected. Array entry '$key' is " . Error::getPhpTypeName($value) ); } if (! \array_key_exists($keyProperty, $row)) { throw new InvalidArgumentException( "Key property '$keyProperty' is required, but missing on row '$key'" ); } $property = $row[$keyProperty]; if (isset($result->$property)) { switch ($onDuplicate) { case 'fail': throw new InvalidArgumentException( "Duplicate row with $keyProperty=$property found on row '$key'" ); case 'keep_first': // Do nothing break; case 'keep_last': $result->$property = (object) $row; break; } } else { $result->$property = (object) $row; } } return $result; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierLowercase.php000066400000000000000000000005301516513262500333170ustar00rootroot00000000000000 false, 'false' => false, 'n' => false, 'no' => false, '1' => true, 'true' => true, 'y' => true, 'yes' => true, ); public function getName() { return 'Convert to a boolean value'; } public static function addSettingsFormFields(QuickForm $form) { $form->addElement('select', 'on_invalid', array( 'label' => 'Invalid properties', 'required' => true, 'description' => $form->translate( 'This modifier transforms 0/"0"/false/"false"/"n"/"no" to false' . ' and 1, "1", true, "true", "y" and "yes" to true, both in a' . ' case insensitive way. What should happen if the given value' . ' does not match any of those?' . ' You could return a null value, or default to false or true.' . ' You might also consider interrupting the whole import process' . ' as of invalid source data' ), 'multiOptions' => $form->optionalEnum(array( 'null' => $form->translate('Set null'), 'true' => $form->translate('Set true'), 'false' => $form->translate('Set false'), 'fail' => $form->translate('Let the import fail'), )), )); } public function transform($value) { if ($value === false || $value === true || $value === null) { return $value; } if ($value === 0) { return false; } if ($value === 1) { return true; } if (is_string($value)) { $value = strtolower($value); if (array_key_exists($value, self::$validStrings)) { return self::$validStrings[$value]; } } switch ($this->getSetting('on_invalid')) { case 'null': return null; case 'false': return false; case 'true': return true; case 'fail': default: throw new InvalidPropertyException( '"%s" cannot be converted to a boolean value', $value ); } } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierMap.php000066400000000000000000000100131516513262500321050ustar00rootroot00000000000000addElement('select', 'datalist_id', array( 'label' => 'Lookup list', 'required' => true, 'description' => $form->translate( 'Please choose a data list that can be used for map lookups' ), 'multiOptions' => $form->optionalEnum($form->getDb()->enumDatalist()), )); $form->addElement('select', 'on_missing', array( 'label' => 'Missing entries', 'required' => true, 'description' => $form->translate( 'What should happen if the lookup key does not exist in the data list?' . ' You could return a null value, keep the unmodified imported value' . ' or interrupt the import process' ), 'multiOptions' => $form->optionalEnum(array( 'null' => $form->translate('Set null'), 'keep' => $form->translate('Return lookup key unmodified'), 'custom' => $form->translate('Return custom default value'), 'fail' => $form->translate('Let the import fail'), )), 'class' => 'autosubmit', )); $method = $form->getSetting('on_missing'); if ($method == 'custom') { $form->addElement('text', 'custom_value', array( 'label' => $form->translate('Default value'), 'required' => true, 'description' => $form->translate( 'This value will be evaluated, and variables like ${some_column}' . ' will be filled accordingly. A typical use-case is generating' . ' unique service identifiers via ${host}!${service} in case your' . ' data source doesn\'t allow you to ship such. The chosen "property"' . ' has no effect here and will be ignored.' ) )); } // TODO: ignore case } public function requiresRow() { return true; } public function transform($value) { $this->loadCache(); if (array_key_exists($value, $this->cache)) { return $this->cache[$value]; } switch ($this->getSetting('on_missing')) { case 'null': return null; case 'keep': return $value; case 'custom': return SyncUtils::fillVariables($this->getSetting('custom_value'), $this->getRow()); case 'fail': default: throw new InvalidPropertyException( '"%s" cannot be found in the "%s" data list', $value, $this->getDatalistName() ); } } protected function getDatalistName() { $db = $this->getDb()->getDbAdapter(); $query = $db->select()->from( 'director_datalist', 'list_name' )->where( 'id = ?', $this->getSetting('datalist_id') ); $result = $db->fetchOne($query); return $result; } protected function loadCache($force = false) { if ($this->cache === null || $force) { $this->cache = array(); $db = $this->getDb()->getDbAdapter(); $select = $db->select()->from( 'director_datalist_entry', array('entry_name', 'entry_value') )->where('list_id = ?', $this->getSetting('datalist_id')) ->order('entry_value'); $this->cache = $db->fetchPairs($select); } return $this; } } PropertyModifierNegateBoolean.php000066400000000000000000000011151516513262500340170ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifier PHP_URL_SCHEME, 'host' => PHP_URL_HOST, 'port' => PHP_URL_PORT, 'path' => PHP_URL_PATH, 'query' => PHP_URL_QUERY, 'fragment' => PHP_URL_FRAGMENT, ]; public static function addSettingsFormFields(QuickForm $form) { $form->addElement('select', 'url_component', [ 'label' => $form->translate('URL component'), 'description' => $form->translate('URL component'), 'multiOptions' => $form->optionalEnum(static::enumComponents()), 'required' => true, ]); $form->addElement('select', 'on_failure', [ 'label' => $form->translate('On failure'), 'description' => $form->translate( 'What should we do if the URL could not get parsed or component not found?' ), 'multiOptions' => $form->optionalEnum([ 'null' => $form->translate('Set no value (null)'), 'keep' => $form->translate('Keep the property as is'), 'fail' => $form->translate('Let the whole import run fail'), ]), 'required' => true, ]); } protected static function enumComponents() { $components = array_keys(self::$components); return array_combine($components, $components); } public function getName() { return 'Parse a URL and return its components'; } public function transform($value) { $component = self::$components[$this->getSetting('url_component')]; $response = parse_url($value, $component); // if component not found $response will be null, false if seriously malformed URL if ($response === null || $response === false) { switch ($this->getSetting('on_failure')) { case 'null': return null; case 'keep': return $value; case 'fail': default: throw new InvalidPropertyException( 'Parsing URL "%s" failed.', $value ); } } return $response; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierRegexReplace.php000066400000000000000000000036501516513262500337470ustar00rootroot00000000000000addElement('text', 'pattern', [ 'label' => $form->translate('Regex pattern'), 'description' => $form->translate( 'The pattern you want to search for. This can be a regular expression like /^www\d+\./' ), 'required' => true, ]); $form->addElement('text', 'replacement', [ 'label' => $form->translate('Replacement'), 'description' => $form->translate( 'The string that should be used as a replacement' ), ]); $form->addElement('select', 'when_not_matched', [ 'label' => $form->translate('When not matched'), 'description' => $form->translate( "What should happen, if the given pattern doesn't match" ), 'value' => 'keep', 'multiOptions' => [ 'keep' => $form->translate('Keep the given string'), 'set_null' => $form->translate('Set the value to NULL') ] ]); } public function getName() { return mt('director', 'Regular expression based replacement'); } public function transform($value) { if ($value === null) { return null; } $result = preg_replace($this->getSetting('pattern'), $this->getSetting('replacement'), $value); if ($result === $value && $this->getSetting('when_not_matched', 'keep') === 'set_null') { if (!preg_match($this->getSetting('pattern'), $value)) { return null; } } return $result; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierRegexSplit.php000066400000000000000000000030731516513262500334660ustar00rootroot00000000000000addElement('text', 'pattern', array( 'label' => $form->translate('Pattern'), 'required' => true, 'description' => $form->translate( 'Regular expression pattern to split the string (e.g. /\s+/ or /[,;]/)' ) )); $form->addElement('select', 'when_empty', array( 'label' => $form->translate('When empty'), 'required' => true, 'description' => $form->translate( 'What should happen when the given string is empty?' ), 'value' => 'empty_array', 'multiOptions' => $form->optionalEnum(array( 'empty_array' => $form->translate('return an empty array'), 'null' => $form->translate('return NULL'), )) )); } public function transform($value) { if (! strlen(trim($value))) { if ($this->getSetting('when_empty', 'empty_array') === 'empty_array') { return array(); } else { return null; } } return preg_split( $this->getSetting('pattern'), $value, -1, PREG_SPLIT_NO_EMPTY ); } } PropertyModifierRejectOrSelect.php000066400000000000000000000111601516513262500341720ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifieraddElement('select', 'filter_method', [ 'label' => $form->translate('Filter method'), 'required' => true, 'value' => 'wildcard', 'multiOptions' => $form->optionalEnum([ 'wildcard' => $form->translate('Simple match with wildcards (*)'), 'regex' => $form->translate('Regular Expression'), 'is_true' => $form->translate('Match boolean TRUE'), 'is_false' => $form->translate('Match boolean FALSE'), 'is_null' => $form->translate('Match NULL value columns'), ]), 'class' => 'autosubmit', ]); $method = $form->getSetting('filter_method'); switch ($method) { case 'wildcard': $form->addElement('text', 'filter_string', [ 'label' => $form->translate('Filter'), 'description' => $form->translate( 'The string/pattern you want to search for, use wildcard' . ' matches like www.* or *linux*' ), 'required' => true, ]); break; case 'regex': $form->addElement('text', 'filter_string', [ 'label' => $form->translate('Filter'), 'description' => $form->translate( 'The string/pattern you want to search for, use regular' . ' expression like /^www\d+\./' ), 'required' => true, ]); break; } $form->addElement('select', 'policy', [ 'label' => $form->translate('Policy'), 'required' => true, 'description' => $form->translate( 'What should happen with the row, when this property matches the given expression?' ), 'value' => 'reject', 'multiOptions' => [ 'reject' => $form->translate('Reject the whole row'), 'keep' => $form->translate('Keep only matching rows'), ], ]); } public function matchesRegexp($string, $expression) { return preg_match($expression, $string); } public function isNull($string, $expression) { return $string === null; } public function isTrue($string, $expression) { return $string === true; } public function isFalse($string, $expression) { return $string === false; } public function matchesWildcard($string, $expression) { return $this->filterExpression->matches( (object) ['value' => $string] ); } public function transform($value) { $method = $this->getSetting('filter_method'); $filter = $this->getSetting('filter_string'); $policy = $this->getSetting('policy'); switch ($method) { case 'wildcard': $func = 'matchesWildcard'; $this->filterExpression = new FilterExpression('value', '=', $filter); break; case 'regex': $func = 'matchesRegexp'; break; case 'is_null': $func = 'isNull'; break; case 'is_true': $func = 'isTrue'; break; case 'is_false': $func = 'isFalse'; break; default: throw new ConfigurationError( '%s is not a valid value for an ArrayFilter filter_method', var_export($method, true) ); } if ($this->$func($value, $filter)) { if ($policy === 'reject') { $this->rejectRow(); } } else { if ($policy === 'keep') { $this->rejectRow(); } } return $value; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierRenameColumn.php000066400000000000000000000012201516513262500337550ustar00rootroot00000000000000getRow(); $property = $this->getPropertyName(); if ($row) { unset($row->$property); } // $this->rejectRow(); return $value; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierReplace.php000066400000000000000000000017241516513262500327540ustar00rootroot00000000000000addElement('text', 'string', array( 'label' => 'Search string', 'description' => $form->translate('The string you want to search for'), 'required' => true, )); $form->addElement('text', 'replacement', array( 'label' => 'Replacement', 'description' => $form->translate('Your replacement string'), )); } public function transform($value) { if ($value === null) { return null; } return str_replace( $this->getSetting('string'), $this->getSetting('replacement'), $value ); } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierReplaceNull.php000066400000000000000000000014401516513262500336020ustar00rootroot00000000000000addElement('text', 'string', [ 'label' => 'Replacement String', 'description' => $form->translate('Your replacement string'), 'required' => true, ]); } public function transform($value) { if ($value === null) { return $this->getSetting('string'); } else { return $value; } } } PropertyModifierSimpleGroupBy.php000066400000000000000000000037511516513262500340650ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifiergetRow(); $aggregationColumns = preg_split( '/\s*,\s*/', $this->getSetting('aggregation_columns'), -1, PREG_SPLIT_NO_EMPTY ); if (isset($this->keptRows[$value])) { foreach ($aggregationColumns as $column) { if (isset($row->$column)) { $this->keptRows[$value]->{$column} = array_unique(array_merge( $this->keptRows[$value]->{$column}, [$row->$column] )); sort($this->keptRows[$value]->{$column}); } } $this->rejectRow(); } else { foreach ($aggregationColumns as $column) { if (isset($row->$column)) { $row->$column = [$row->$column]; } else { $row->$column = []; } } $this->keptRows[$value] = $row; } return $value; } public static function addSettingsFormFields(QuickForm $form) { $form->addElement('text', 'aggregation_columns', [ 'label' => $form->translate('Aggregation Columns'), 'description' => $form->translate( 'Comma-separated list of columns that should be aggregated (transformed into an Array).' . ' For all other columns only the first value will be kept.' ), 'required' => true, ]); } } PropertyModifierSkipDuplicates.php000066400000000000000000000010171516513262500342410ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/PropertyModifierseen[$value])) { $this->rejectRow(); } $this->seen[$value] = true; return $value; } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierSplit.php000066400000000000000000000031461516513262500324740ustar00rootroot00000000000000addElement('text', 'delimiter', array( 'label' => $form->translate('Delimiter'), 'required' => true, 'description' => $form->translate( 'One or more characters that should be used to split this string' ) )); $form->addElement('select', 'when_empty', array( 'label' => $form->translate('When empty'), 'required' => true, 'description' => $form->translate( 'What should happen when the given string is empty?' ), 'value' => 'empty_array', 'multiOptions' => $form->optionalEnum(array( 'empty_array' => $form->translate('return an empty array'), 'null' => $form->translate('return NULL'), )) )); } public function transform($value) { if ($value === null || ! strlen(trim($value))) { if ($this->getSetting('when_empty', 'empty_array') === 'empty_array') { return array(); } else { return null; } } return preg_split( '/' . preg_quote($this->getSetting('delimiter'), '/') . '/', $value, -1, PREG_SPLIT_NO_EMPTY ); } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierStripDomain.php000066400000000000000000000016351516513262500336330ustar00rootroot00000000000000addElement('text', 'domain', array( 'label' => 'Domain name', 'description' => $form->translate('The domain name you want to be stripped'), 'required' => true, )); } public function getName() { return 'Strip a domain name'; } public function transform($value) { if ($value === null) { return null; } $domain = preg_quote(ltrim($this->getSetting('domain'), '.'), '/'); return preg_replace( '/\.' . $domain . '$/', '', $value ); } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierSubstring.php000066400000000000000000000030021516513262500333500ustar00rootroot00000000000000addElement('text', 'start', array( 'label' => 'Start', 'required' => true, 'description' => sprintf( $form->translate( 'Please see %s for detailled instructions of how start and end work' ), 'http://php.net/manual/en/function.substr.php' ) )); $form->addElement('text', 'length', array( 'label' => 'End', 'description' => sprintf( $form->translate( 'Please see %s for detailled instructions of how start and end work' ), 'http://php.net/manual/en/function.substr.php' ) )); } public function transform($value) { if ($value === null) { return null; } $length = $this->getSetting('length'); if (is_numeric($length)) { return substr( $value, (int) $this->getSetting('start'), (int) $length ); } else { return substr( $value, (int) $this->getSetting('start') ); } } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierToInt.php000066400000000000000000000012251516513262500324320ustar00rootroot00000000000000addElement('select', 'trim_method', [ 'label' => $form->translate('Trim Method'), 'description' => $form->translate('Where to trim the string(s)'), 'value' => 'trim', 'multiOptions' => $form->optionalEnum([ 'trim' => $form->translate('Beginning and Ending'), 'ltrim' => $form->translate('Beginning only'), 'rtrim' => $form->translate('Ending only'), ]), 'required' => true, ]); $form->addElement('text', 'character_mask', [ 'label' => $form->translate('Character Mask'), 'description' => $form->translate( 'Specify the characters that trim should remove.' . 'Default is: " \t\n\r\0\x0B"' ), ]); } public function transform($value) { if ($value === null) { return null; } $mask = $this->getSetting('character_mask'); $method = $this->getSetting('trim_method'); if (in_array($method, self::VALID_METHODS)) { if ($mask) { return $method($value, $mask); } else { return $method($value); } } throw new InvalidArgumentException("'$method' is not a valid trim method"); } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierURLEncode.php000066400000000000000000000005341516513262500331570ustar00rootroot00000000000000addElement('select', 'lowerfirst', array( 'label' => $form->translate('Use lowercase first'), 'required' => true, 'description' => $form->translate( 'Should all the other characters be lowercased first?' ), 'value' => 'y', 'multiOptions' => array( 'y' => $form->translate('Yes'), 'n' => $form->translate('No'), ), )); } public function transform($value) { if ($value === null) { return null; } if ($this->getSetting('lowerfirst', 'y') === 'y') { return ucwords(strtolower($value)); } else { return ucwords($value); } } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierUppercase.php000066400000000000000000000005301516513262500333220ustar00rootroot00000000000000toString(); } } icingaweb2-module-director-1.11.8/library/Director/PropertyModifier/PropertyModifierXlsNumericIp.php000066400000000000000000000011601516513262500337550ustar00rootroot00000000000000 9 && strlen($value) <= 12) { return preg_replace( '/^(\d{1,3})(\d{3})(\d{3})(\d{3})/', '\1.\2.\3.\4', $value ); } else { return $value; } } } icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/000077500000000000000000000000001516513262500245325ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/CubeLinks.php000066400000000000000000000033731516513262500271300ustar00rootroot00000000000000finalizeInnerQuery(); $query = $cube->innerQuery() ->reset('columns') ->columns(array('host' => 'o.name1')) ->reset('group'); $hosts = $cube->db()->fetchCol($query); $count = count($hosts); if ($count === 1) { $url = 'director/host/edit'; $params = array('name' => $hosts[0]); $title = $view->translate('Modify a host'); $description = sprintf( $view->translate('This allows you to modify properties for "%s"'), $hosts[0] ); } else { $params = null; $filter = Filter::matchAny(); foreach ($hosts as $host) { $filter->addFilter( Filter::matchAny(Filter::expression('name', '=', $host)) ); } $url = 'director/hosts/edit?' . $filter->toQueryString(); $title = sprintf($view->translate('Modify %d hosts'), $count); $description = $view->translate( 'This allows you to modify properties for all chosen hosts at once' ); } $this->addActionLink( $this->makeUrl($url, $params), $title, $description, 'wrench' ); } } icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/IcingaDbCubeLinks.php000066400000000000000000000040071516513262500305040ustar00rootroot00000000000000getObjectsFilter(); if ($filterChain->count() === 1) { $url = 'director/host/edit?'; /** @var Condition $rule */ $rule = $filterChain->getIterator()->current(); /** @var string $name */ $name = $rule->getValue(); $params = ['name' => $name]; $title = t('Modify a host'); $description = sprintf(t('This allows you to modify properties for "%s"'), $name); } else { $params = null; $urlFilter = Filter::matchAny(); /** @var Condition $filter */ foreach ($filterChain as $filter) { $urlFilter->addFilter( Filter::matchAny( Filter::expression( 'name', '=', $filter->getValue() ) ) ); } $url = 'director/hosts/edit?' . $urlFilter->toQueryString(); $title = sprintf(t('Modify %d hosts'), $filterChain->count()); $description = t( 'This allows you to modify properties for all chosen hosts at once' ); } $this->addActionLink( $this->makeUrl($url, $params), $title, $description, 'wrench' ); } } icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/Icingadb/000077500000000000000000000000001516513262500262325ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/Icingadb/CustomVarRenderer.php000066400000000000000000000435051516513262500323640ustar00rootroot00000000000000get('db', 'resource'); if (! $resourceName) { throw new ConfigurationError('Cannot identify director db. No resource configured'); } return Db::fromResourceName($resourceName); } public function prefetchForObject(Model $object): bool { try { if ($object instanceof Host) { $host = $object; $service = null; } elseif ($object instanceof Service) { $host = $object->host; $service = $object; } else { return false; } $db = $this->db(); try { $directorHostObj = IcingaHost::load($host->name, $db); $directorServiceObj = null; if ($service !== null) { $serviceOrigin = ['direct', 'applied', 'inherited', 'service-set']; $serviceName = $service->name; $i = 0; do { if ($i > 3) { Logger::error("Failed to find service '%s' on host '%s'", $serviceName, $host->name); return false; } elseif ($serviceOrigin[$i] === 'direct') { $directorServiceObj = IcingaService::loadOptional([ 'host_id' => $directorHostObj->get('id'), 'object_name' => $serviceName ], $db); } elseif ($serviceOrigin[$i] === 'inherited') { $templateResolver = new IcingaTemplateResolver($directorHostObj); $parentIds = $templateResolver->listParentIds(); $query = $db->getDbAdapter()->select()->from('icinga_service') ->where('object_name = ?', $serviceName) ->where('host_id IN (?)', $parentIds); $directorServices = IcingaService::loadAll( $db, $query, 'object_name' ); $directorServiceObj = current($directorServices); } elseif ($serviceOrigin[$i] === 'applied') { $appliedFilterQuery = IcingaHostAppliedServicesTable::load($directorHostObj)->getQuery(); foreach ($appliedFilterQuery->fetchAll() as $appliedService) { if ($appliedService->apply_for === null) { $isAppliedService = $appliedService->name === $serviceName; } else { /** @var ?CustomVariableArray $hostVar */ $hostVar = $directorHostObj->vars()->get((substr($appliedService->apply_for, 10))); if ($hostVar) { $appliedServiceName = $appliedService->name; $appliedForServiceLookup = []; foreach ($hostVar->getValue() as $val) { $appliedForServiceLookup[$appliedServiceName . $val] = true; } $isAppliedService = isset($appliedForServiceLookup[$serviceName]); } else { $isAppliedService = false; } } if (! $isAppliedService) { continue; } $query = $db->getDbAdapter()->select()->from('icinga_service') ->where('object_name = ?', $appliedService->name) ->where("object_type = 'apply'") ->where('assign_filter = ?', $appliedService->assign_filter); $directorAppliedServices = IcingaService::loadAll( $db, $query, 'object_name' ); $directorServiceObj = current($directorAppliedServices); break; } } elseif ($serviceOrigin[$i] === 'service-set') { $templateResolver = new IcingaTemplateResolver($directorHostObj); $hostServiceSets = $directorHostObj->fetchServiceSets() + AppliedServiceSetLoader::fetchForHost($directorHostObj); $parents = $templateResolver->fetchParents(); foreach ($parents as $parent) { $hostServiceSets += $parent->fetchServiceSets(); $hostServiceSets += AppliedServiceSetLoader::fetchForHost($parent); } foreach ($hostServiceSets as $hostServiceSet) { foreach ($hostServiceSet->getServiceObjects() as $setServiceObject) { if ($setServiceObject->getObjectName() === $serviceName) { $directorServiceObj = $setServiceObject; break 2; } } } } $i++; } while (! $directorServiceObj); } } catch (NotFoundError $_) { if ($service !== null) { Logger::error("Failed to find service '%s' on host '%s'", $service->name, $host->name); } else { Logger::error('Failed to find host %s', $host->name); } return false; } if ($service === null) { $fields = (new IcingaObjectFieldLoader($directorHostObj))->getFields(); } else { $fields = (new IcingaObjectFieldLoader($directorServiceObj))->getFields(); } if (empty($fields)) { return false; } $fieldsWithDataLists = []; foreach ($fields as $field) { $this->fieldConfig[$field->get('varname')] = [ 'label' => $field->get('caption'), 'group' => $field->getCategoryName(), 'visibility' => $field->getSetting('visibility') ]; if ($field->get('datatype') === 'Icinga\Module\Director\DataType\DataTypeDatalist') { $fieldsWithDataLists[$field->get('id')] = $field; } elseif ($field->get('datatype') === 'Icinga\Module\Director\DataType\DataTypeDictionary') { $this->dictionaryNames[] = $field->get('varname'); } } if (! empty($fieldsWithDataLists)) { if ($this->db()->getDbType() === 'pgsql') { $joinCondition = 'CAST(dds.setting_value AS INTEGER) = dde.list_id'; } else { $joinCondition = 'dds.setting_value = dde.list_id'; } $dataListEntries = $db->select()->from( ['dds' => 'director_datafield_setting'], [ 'dds.datafield_id', 'dde.entry_name', 'dde.entry_value' ] )->join( ['dde' => 'director_datalist_entry'], $joinCondition, [] )->where('dds.datafield_id', array_keys($fieldsWithDataLists)) ->where('dds.setting_name', 'datalist_id'); foreach ($dataListEntries as $dataListEntry) { $field = $fieldsWithDataLists[$dataListEntry->datafield_id]; $this->datalistMaps[$field->get('varname')][$dataListEntry->entry_name] = $dataListEntry->entry_value; } } return true; } catch (Throwable $e) { Logger::error("%s\n%s", $e, $e->getTraceAsString()); return false; } } public function renderCustomVarKey(string $key) { try { if (isset($this->fieldConfig[$key]['label'])) { return new HtmlElement( 'span', Attributes::create(['title' => $this->fieldConfig[$key]['label'] . " [$key]"]), Text::create($this->fieldConfig[$key]['label']) ); } } catch (Throwable $e) { Logger::error("%s\n%s", $e, $e->getTraceAsString()); } return null; } public function renderCustomVarValue(string $key, $value) { try { if (isset($this->fieldConfig[$key])) { if ($this->fieldConfig[$key]['visibility'] === 'hidden') { return '***'; } if (is_array($value)) { $renderedValue = []; foreach ($value as $v) { if (is_string($v) && isset($this->datalistMaps[$key][$v])) { $renderedValue[] = new HtmlElement( 'span', Attributes::create(['title' => $this->datalistMaps[$key][$v] . " [$v]"]), Text::create($this->datalistMaps[$key][$v]) ); } else { $renderedValue[] = $v; } } return $renderedValue; } if (is_string($value) && isset($this->datalistMaps[$key][$value])) { return new HtmlElement( 'span', Attributes::create(['title' => $this->datalistMaps[$key][$value] . " [$value]"]), Text::create($this->datalistMaps[$key][$value]) ); } elseif ($value !== null && in_array($key, $this->dictionaryNames)) { return $this->renderDictionaryVal($key, (array) $value); } } } catch (Throwable $e) { Logger::error("%s\n%s", $e, $e->getTraceAsString()); } return null; } public function identifyCustomVarGroup(string $key): ?string { if (isset($this->fieldConfig[$key]['group'])) { return $this->fieldConfig[$key]['group']; } return null; } /** * Render the dictionary value * * @param string $key * @param array $value * * @return ?ValidHtml */ protected function renderDictionaryVal(string $key, array $value): ?ValidHtml { if ($this->dictionaryLevel > 0) { $numItems = count($value); $label = $this->renderCustomVarKey($key) ?? $key; $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml($label)), new HtmlElement( 'td', null, Text::create(sprintf(tp('%d item', '%d items', $numItems), $numItems)) ) ) ); } else { $this->dictionaryTable = new HtmlElement( 'table', Attributes::create(['class' => ['custom-var-table', 'name-value-table']]) ); $this->dictionaryBody = new HtmlElement('tbody'); } $this->dictionaryLevel++; foreach ($value as $key => $val) { if ($key !== null && is_array($val) || is_object($val)) { $val = (array) $val; $numChildItems = count($val); $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml($key)), new HtmlElement( 'td', null, Text::create(sprintf(tp('%d item', '%d items', $numChildItems), $numChildItems)) ) ) ); $this->dictionaryLevel++; foreach ($val as $childKey => $childVal) { $childVal = $this->renderCustomVarValue($childKey, $childVal) ?? $childVal; if (! in_array($childKey, $this->dictionaryNames)) { $label = $this->renderCustomVarKey($childKey) ?? $childKey; if (is_array($childVal)) { $this->renderArrayVal($label, $childVal); } else { $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml( $label )), new HtmlElement('td', null, Html::wantHtml($childVal)) ) ); } } } $this->dictionaryLevel--; } elseif (is_array($val)) { $this->renderArrayVal($key, $val); } else { $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml($key)), new HtmlElement('td', null, Html::wantHtml($val)) ) ); } } $this->dictionaryLevel--; if ($this->dictionaryLevel === 0) { return $this->dictionaryTable->addHtml($this->dictionaryBody); } return null; } /** * Render an array * * @param HtmlElement|string $name * @param array $array * * @return void */ protected function renderArrayVal($name, array $array) { $numItems = count($array); if ($name instanceof HtmlElement) { $name->addHtml(Text::create(' (Array)')); } else { $name = (new HtmlDocument())->addHtml( Html::wantHtml($name), Text::create(' (Array)') ); } $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml($name)), new HtmlElement('td', null, Html::wantHtml(sprintf(tp('%d item', '%d items', $numItems), $numItems))) ) ); ++$this->dictionaryLevel; ksort($array); foreach ($array as $key => $value) { $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml("[$key]")), new HtmlElement('td', null, Html::wantHtml($value)) ) ); } --$this->dictionaryLevel; } } icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/Icingadb/HostActions.php000066400000000000000000000042471516513262500312100ustar00rootroot00000000000000getThem($host); } catch (Exception $e) { return []; } } protected function getThem(Host $host): array { $actions = []; $db = $this->db(); if (! $db) { return $actions; } $hostname = $host->name; if (Util::hasPermission(Permission::INSPECT)) { $actions[] = new Link( mt('director', 'Inspect'), Url::fromPath( 'director/inspect/object', ['type' => 'host', 'plural' => 'hosts', 'name' => $hostname] ) ); } $allowEdit = false; if (Util::hasPermission(Permission::HOSTS) && IcingaHost::exists($hostname, $db)) { $allowEdit = true; } if ( Util::hasPermission(Permission::HOSTS) && Util::hasPermission(Permission::ICINGADB_HOSTS) && (new IcingadbBackend())->canModifyHost($hostname) ) { $allowEdit = IcingaHost::exists($hostname, $db); } if ($allowEdit) { $label = mt('director', 'Modify'); $actions[] = new Link( $label, Url::fromPath('director/host/edit', [ 'name' => $hostname ]) ); } return $actions; } protected function db() { $resourceName = Config::module('director')->get('db', 'resource'); if (! $resourceName) { return false; } return Db::fromResourceName($resourceName); } } icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/Icingadb/IcingadbSupport.php000066400000000000000000000002541516513262500320410ustar00rootroot00000000000000getThem($service); } catch (Exception $e) { return []; } } /** * @param Service $service * @return array * @throws \Icinga\Exception\ProgrammingError */ protected function getThem(Service $service) { $actions = []; $db = $this->db(); if (! $db) { return []; } $hostname = $service->host->name; $serviceName = $service->name; if (Util::hasPermission(Permission::INSPECT)) { $actions[] = new Link( mt('director', 'Inspect'), Url::fromPath('director/inspect/object', [ 'type' => 'service', 'plural' => 'services', 'name' => sprintf('%s!%s', $hostname, $serviceName) ]) ); } $title = null; if ( Util::hasPermission(Permission::SERVICES) && Util::hasPermission(Permission::ICINGADB_SERVICES) && (new IcingadbBackend())->canModifyService($hostname, $serviceName) ) { $title = mt('director', 'Modify'); } elseif (Util::hasPermission(Permission::ICINGADB_SERVICES_RO)) { $title = mt('director', 'Configuration'); } if ($title && IcingaHost::exists($hostname, $db)) { $actions[] = new Link( $title, Url::fromPath('director/host/findservice', [ 'name' => $hostname, 'service' => $serviceName ]) ); } return $actions; } protected function db() { $resourceName = Config::module('director')->get('db', 'resource'); if (! $resourceName) { return false; } return Db::fromResourceName($resourceName); } } icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/Monitoring/000077500000000000000000000000001516513262500266575ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/Monitoring/CustomVarRenderer.php000066400000000000000000000437251516513262500330150ustar00rootroot00000000000000get('db', 'resource'); if (! $resourceName) { throw new ConfigurationError('Cannot identify director db. No resource configured'); } return Db::fromResourceName($resourceName); } public function prefetchForObject(MonitoredObject $object) { try { if ($object instanceof Host) { $host = $object; $service = null; } elseif ($object instanceof Service) { $host = $object->getHost(); $service = $object; } else { return false; } $db = $this->db(); try { $directorHostObj = IcingaHost::load($host->getName(), $db); if ($service !== null) { $serviceOrigin = ['direct', 'inherited', 'applied', 'service-set']; $serviceName = $service->getName(); $i = 0; $directorServiceObj = null; do { if ($i > 3) { Logger::error("Failed to find service %s on host %s", $serviceName, $host->getName()); return false; } elseif ($serviceOrigin[$i] === 'direct') { $directorServiceObj = IcingaService::loadOptional([ 'host_id' => $directorHostObj->get('id'), 'object_name' => $serviceName ], $db); } elseif ($serviceOrigin[$i] == 'inherited') { $templateResolver = new IcingaTemplateResolver($directorHostObj); $parentIds = $templateResolver->listParentIds(); $query = $db->getDbAdapter()->select()->from('icinga_service') ->where('object_name = ?', $serviceName) ->where('host_id IN (?)', $parentIds); $directorServices = IcingaService::loadAll( $db, $query, 'object_name' ); $directorServiceObj = current($directorServices); } elseif ($serviceOrigin[$i] === 'applied') { $appliedFilterQuery = IcingaHostAppliedServicesTable::load($directorHostObj)->getQuery(); foreach ($appliedFilterQuery->fetchAll() as $appliedService) { if ($appliedService->apply_for === null) { $isAppliedService = $appliedService->name === $serviceName; } else { /** @var ?CustomVariableArray $hostVar */ $hostVar = $directorHostObj->vars()->get((substr($appliedService->apply_for, 10))); if ($hostVar) { $appliedServiceName = $appliedService->name; $appliedForServiceLookup = []; foreach ($hostVar->getValue() as $val) { $appliedForServiceLookup[$appliedServiceName . $val] = true; } $isAppliedService = isset($appliedForServiceLookup[$serviceName]); } else { $isAppliedService = false; } } if (! $isAppliedService) { continue; } $query = $db->getDbAdapter()->select()->from('icinga_service') ->where('object_name = ?', $appliedService->name) ->where("object_type = 'apply'") ->where('assign_filter = ?', $appliedService->assign_filter); $directorAppliedServices = IcingaService::loadAll( $db, $query, 'object_name' ); $directorServiceObj = current($directorAppliedServices); break; } } elseif ($serviceOrigin[$i] === 'service-set') { $templateResolver = new IcingaTemplateResolver($directorHostObj); $hostServiceSets = $directorHostObj->fetchServiceSets() + AppliedServiceSetLoader::fetchForHost($directorHostObj); $parents = $templateResolver->fetchParents(); foreach ($parents as $parent) { $hostServiceSets += $parent->fetchServiceSets(); $hostServiceSets += AppliedServiceSetLoader::fetchForHost($parent); } foreach ($hostServiceSets as $hostServiceSet) { foreach ($hostServiceSet->getServiceObjects() as $setServiceObject) { if ($setServiceObject->getObjectName() === $serviceName) { $directorServiceObj = $setServiceObject; break 2; } } } } else { return false; } $i++; } while (! $directorServiceObj); } } catch (NotFoundError $_) { if ($service !== null) { Logger::error("Failed to find service '%s' on host '%s'", $service->getName(), $host->getName()); } else { Logger::error("Failed to find host '%s'", $host->getName()); } return false; } if ($service === null) { $fields = (new IcingaObjectFieldLoader($directorHostObj))->getFields(); } else { $fields = (new IcingaObjectFieldLoader($directorServiceObj))->getFields(); } if (empty($fields)) { return false; } $fieldsWithDataLists = []; foreach ($fields as $field) { $this->fieldConfig[$field->get('varname')] = [ 'label' => $field->get('caption'), 'group' => $field->getCategoryName(), 'visibility' => $field->getSetting('visibility') ]; if ($field->get('datatype') === 'Icinga\Module\Director\DataType\DataTypeDatalist') { $fieldsWithDataLists[$field->get('id')] = $field; } elseif ($field->get('datatype') === 'Icinga\Module\Director\DataType\DataTypeDictionary') { $this->dictionaryNames[] = $field->get('varname'); } } if (! empty($fieldsWithDataLists)) { if ($this->db()->getDbType() === 'pgsql') { $joinCondition = 'CAST(dds.setting_value AS INTEGER) = dde.list_id'; } else { $joinCondition = 'dds.setting_value = dde.list_id'; } $dataListEntries = $db->select()->from( ['dds' => 'director_datafield_setting'], [ 'dds.datafield_id', 'dde.entry_name', 'dde.entry_value' ] )->join( ['dde' => 'director_datalist_entry'], $joinCondition, [] )->where('dds.datafield_id', array_keys($fieldsWithDataLists)) ->where('dds.setting_name', 'datalist_id'); foreach ($dataListEntries as $dataListEntry) { $field = $fieldsWithDataLists[$dataListEntry->datafield_id]; $this->datalistMaps[$field->get('varname')][$dataListEntry->entry_name] = $dataListEntry->entry_value; } } return true; } catch (Throwable $e) { Logger::error("%s\n%s", $e, $e->getTraceAsString()); return false; } } public function renderCustomVarKey($key) { try { if (isset($this->fieldConfig[$key]['label'])) { return new HtmlElement( 'span', Attributes::create(['title' => $this->fieldConfig[$key]['label'] . " [$key]"]), Text::create($this->fieldConfig[$key]['label']) ); } } catch (Throwable $e) { Logger::error("%s\n%s", $e, $e->getTraceAsString()); } } public function renderCustomVarValue($key, $value) { try { if (isset($this->fieldConfig[$key])) { if ($this->fieldConfig[$key]['visibility'] === 'hidden') { return '***'; } if (is_array($value)) { $renderedValue = []; foreach ($value as $v) { if (is_string($v) && isset($this->datalistMaps[$key][$v])) { $renderedValue[] = new HtmlElement( 'span', Attributes::create(['title' => $this->datalistMaps[$key][$v] . " [$v]"]), Text::create($this->datalistMaps[$key][$v]) ); } else { $renderedValue[] = $v; } } return $renderedValue; } if (is_string($value) && isset($this->datalistMaps[$key][$value])) { return new HtmlElement( 'span', Attributes::create(['title' => $this->datalistMaps[$key][$value] . " [$value]"]), Text::create($this->datalistMaps[$key][$value]) ); } elseif ($value !== null && in_array($key, $this->dictionaryNames)) { return $this->renderDictionaryVal($key, (array) $value); } } } catch (Throwable $e) { Logger::error("%s\n%s", $e, $e->getTraceAsString()); } return null; } public function identifyCustomVarGroup($key) { if (isset($this->fieldConfig[$key]['group'])) { return $this->fieldConfig[$key]['group']; } } /** * Render the dictionary value * * @param string $key * @param array $value * * @return ?ValidHtml */ protected function renderDictionaryVal(string $key, array $value): ?ValidHtml { if ($this->dictionaryLevel > 0) { $numItems = count($value); $label = $this->renderCustomVarKey($key) ?? $key; $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml($label)), new HtmlElement( 'td', null, Text::create(sprintf(tp('%d item', '%d items', $numItems), $numItems)) ) ) ); } else { $this->dictionaryTable = new HtmlElement( 'table', Attributes::create(['class' => ['custom-var-table', 'name-value-table']]) ); $this->dictionaryBody = new HtmlElement('tbody'); } $this->dictionaryLevel++; foreach ($value as $key => $val) { if ($key !== null && is_array($val) || is_object($val)) { $val = (array) $val; $numChildItems = count($val); $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml($key)), new HtmlElement( 'td', null, Text::create(sprintf(tp('%d item', '%d items', $numChildItems), $numChildItems)) ) ) ); $this->dictionaryLevel++; foreach ($val as $childKey => $childVal) { $childVal = $this->renderCustomVarValue($childKey, $childVal) ?? $childVal; if (! in_array($childKey, $this->dictionaryNames)) { $label = $this->renderCustomVarKey($childKey) ?? $childKey; if (is_array($childVal)) { $this->renderArrayVal($label, $childVal); } else { $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml( $label )), new HtmlElement('td', null, Html::wantHtml($childVal)) ) ); } } } $this->dictionaryLevel--; } elseif (is_array($val)) { $this->renderArrayVal(Html::wantHtml($key), $val); } else { $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml($key)), new HtmlElement('td', null, Html::wantHtml($val)) ) ); } } $this->dictionaryLevel--; if ($this->dictionaryLevel === 0) { return $this->dictionaryTable->addHtml($this->dictionaryBody); } return null; } /** * Render an array * * @param HtmlElement|string $name * @param array $array * * @return void */ protected function renderArrayVal($name, array $array) { $numItems = count($array); if ($name instanceof HtmlElement) { $name->addHtml(Text::create(' (Array)')); } else { $name = (new HtmlDocument())->addHtml( Html::wantHtml($name), Text::create(' (Array)') ); } $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml($name)), new HtmlElement('td', null, Html::wantHtml(sprintf(tp('%d item', '%d items', $numItems), $numItems))) ) ); ++$this->dictionaryLevel; ksort($array); foreach ($array as $key => $value) { $this->dictionaryBody->addHtml( new HtmlElement( 'tr', Attributes::create(['class' => "level-{$this->dictionaryLevel}"]), new HtmlElement('th', null, Html::wantHtml("[$key]")), new HtmlElement('td', null, Html::wantHtml($value)) ) ); } --$this->dictionaryLevel; } } icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/Monitoring/HostActions.php000066400000000000000000000036041516513262500316310ustar00rootroot00000000000000getThem($host); } catch (Exception $e) { return array(); } } protected function getThem(Host $host) { $actions = array(); $db = $this->db(); if (! $db) { return $actions; } $hostname = $host->host_name; if (Util::hasPermission(Permission::INSPECT)) { $actions[mt('director', 'Inspect')] = Url::fromPath( 'director/inspect/object', array('type' => 'host', 'plural' => 'hosts', 'name' => $hostname) ); } $allowEdit = false; if ( Util::hasPermission(Permission::HOSTS) && Util::hasPermission(Permission::MONITORING_HOSTS) && (new Monitoring(Auth::getInstance()))->canModifyHost($hostname) ) { $allowEdit = IcingaHost::exists($hostname, $db); } if ($allowEdit) { $actions[mt('director', 'Modify')] = Url::fromPath('director/host/edit', ['name' => $hostname]); } return $actions; } protected function db() { $resourceName = Config::module('director')->get('db', 'resource'); if (! $resourceName) { return false; } return Db::fromResourceName($resourceName); } } icingaweb2-module-director-1.11.8/library/Director/ProvidedHook/Monitoring/ServiceActions.php000066400000000000000000000046571516513262500323250ustar00rootroot00000000000000getThem($service); } catch (Exception $e) { return []; } } /** * @param Service $service * @return array * @throws \Icinga\Exception\ProgrammingError */ protected function getThem(Service $service) { $actions = []; $db = $this->db(); if (! $db) { return []; } $hostname = $service->host_name; $serviceName = $service->service_description; if (Util::hasPermission(Permission::INSPECT)) { $actions[mt('director', 'Inspect')] = Url::fromPath('director/inspect/object', [ 'type' => 'service', 'plural' => 'services', 'name' => sprintf( '%s!%s', $hostname, $serviceName ) ]); } $title = null; if ( Util::hasPermission(Permission::SERVICES) && Util::hasPermission(Permission::MONITORING_SERVICES) && (new Monitoring(Auth::getInstance()))->canModifyService($hostname, $serviceName) ) { $title = mt('director', 'Modify'); } elseif (Util::hasPermission(Permission::MONITORING_SERVICES_RO)) { $title = mt('director', 'Configuration'); } if ($title && IcingaHost::exists($hostname, $db)) { $actions[$title] = Url::fromPath('director/host/findservice', [ 'name' => $hostname, 'service' => $serviceName ]); } return $actions; } protected function db() { $resourceName = Config::module('director')->get('db', 'resource'); if (! $resourceName) { return false; } return Db::fromResourceName($resourceName); } } icingaweb2-module-director-1.11.8/library/Director/Repository/000077500000000000000000000000001516513262500243145ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Repository/IcingaTemplateRepository.php000066400000000000000000000056131516513262500320200ustar00rootroot00000000000000tree === null) { $this->tree = new TemplateTree($this->type, $this->connection); } return $this->tree; } /** * @param IcingaObject $object * @param bool $recursive * @return IcingaObject[] * @throws \Icinga\Exception\NotFoundError */ public function getTemplatesFor(IcingaObject $object, $recursive = false) { if ($recursive) { $ids = $this->tree()->listAncestorIdsFor($object); } else { $ids = $this->tree()->listParentIdsFor($object); } return $this->getTemplatesForIds($ids, $object); } /** * @param array $ids * @param IcingaObject $object * @return IcingaObject[] * @throws \Icinga\Exception\NotFoundError */ public function getTemplatesForIds(array $ids, IcingaObject $object) { $templates = []; foreach ($ids as $id) { if (! array_key_exists($id, $this->loadedById)) { // TODO: load only missing ones at once $this->loadedById[$id] = $object::loadWithAutoIncId( $id, $this->connection ); } $templates[$id] = $this->loadedById[$id]; } return $templates; } /** * @param IcingaObject $object * @param bool $recursive * @return IcingaObject[] * @throws \Icinga\Exception\NotFoundError */ public function getTemplatesIndexedByNameFor( IcingaObject $object, $recursive = false ) { $templates = []; foreach ($this->getTemplatesFor($object, $recursive) as $template) { $templates[$template->getObjectName()] = $template; } return $templates; } public function persistImportNames() { } public function storeChances(Db $db) { } public function listAllowedTemplateNames() { $type = $this->type; $db = $this->connection->getDbAdapter(); $table = 'icinga_' . $this->type; $query = $db->select() ->from($table, 'object_name') ->order('object_name'); if ($type !== 'command') { $query->where('object_type = ?', 'template'); } if (in_array($type, ['host', 'service'])) { $query->where('template_choice_id IS NULL'); } return $db->fetchCol($query); } public static function clear() { static::clearInstances(); } } icingaweb2-module-director-1.11.8/library/Director/Repository/RepositoryByObjectHelper.php000066400000000000000000000043261516513262500317730ustar00rootroot00000000000000type = $type; $this->connection = $connection; } /** * @param string $type * @return bool */ public static function hasInstanceForType($type) { return array_key_exists($type, self::$instances); } /** * @param string $type * @param Db $connection * @return static */ public static function instanceByType($type, Db $connection) { if (! static::hasInstanceForType($type)) { self::$instances[$type] = new static($type, $connection); } return self::$instances[$type]; } /** * @param IcingaObject $object * @return bool */ public static function hasInstanceForObject(IcingaObject $object) { return static::hasInstanceForType($object->getShortTableName()); } /** * @param IcingaObject $object * @param Db|null $connection * @return static */ public static function instanceByObject(IcingaObject $object, Db $connection = null) { if (null === $connection) { $connection = $object->getConnection(); } if (! $connection) { throw new RuntimeException(sprintf( 'Cannot use repository for %s "%s" as it has no DB connection', $object->getShortTableName(), $object->getObjectName() )); } return static::instanceByType( $object->getShortTableName(), $connection ); } protected static function auth() { if (self::$auth === null) { self::$auth = Auth::getInstance(); } return self::$auth; } protected static function clearInstances() { self::$instances = []; } } icingaweb2-module-director-1.11.8/library/Director/Resolver/000077500000000000000000000000001516513262500237365ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Resolver/CommandUsage.php000066400000000000000000000060771516513262500270240ustar00rootroot00000000000000isTemplate()) { throw new InvalidArgumentException( 'CommandUsageTable expects object or external_object, got a template' ); } $this->command = $command; $this->db = $command->getDb(); } /** * @return array */ public function getLinks() { $name = $this->command->getObjectName(); $links = []; $map = [ 'host' => ['check_command', 'event_command'], 'service' => ['check_command', 'event_command'], 'notification' => ['command'], ]; $types = [ 'host' => [ 'object' => $this->translate('%d Host(s)'), 'template' => $this->translate('%d Host Template(s)'), ], 'service' => [ 'object' => $this->translate('%d Service(s)'), 'template' => $this->translate('%d Service Template(s)'), 'apply' => $this->translate('%d Service Apply Rule(s)'), ], 'notification' => [ 'object' => $this->translate('%d Notification(s)'), 'template' => $this->translate('%d Notification Template(s)'), 'apply' => $this->translate('%d Notification Apply Rule(s)'), ], ]; $urlSuffix = [ 'object' => '', 'template' => '/templates', 'apply' => '/applyrules', ]; foreach ($map as $type => $relations) { $res = $this->fetchFor($type, $relations, array_keys($types[$type])); foreach ($types[$type] as $objectType => $caption) { if ($res->$objectType > 0) { $suffix = $urlSuffix[$objectType]; $links[] = Link::create( sprintf($caption, $res->$objectType), "director/{$type}s$suffix", ['command' => $name] ); } } } return $links; } protected function fetchFor($table, $rels, $objectTypes) { $id = $this->command->getAutoincId(); $columns = []; foreach ($objectTypes as $type) { $columns[$type] = "COALESCE(SUM(CASE WHEN object_type = '$type' THEN 1 ELSE 0 END), 0)"; } $query = $this->db->select()->from("icinga_$table", $columns); foreach ($rels as $rel) { $query->orWhere("{$rel}_id = ?", $id); } return $this->db->fetchRow($query); } } icingaweb2-module-director-1.11.8/library/Director/Resolver/HostServiceBlacklist.php000066400000000000000000000044741516513262500305470ustar00rootroot00000000000000db = $db; } protected function loadMappings() { $db = $this->db->getDbAdapter(); $query = $db->select()->from(['hsb' => $this->table], [ 'host_name' => 'h.object_name', 'service_id' => 'hsb.service_id' ])->join( ['h' => 'icinga_host'], 'hsb.host_id = h.id', [] ); $result = []; foreach ($db->fetchAll($query) as $row) { if (array_key_exists($row->service_id, $result)) { $result[$row->service_id][] = $row->host_name; } else { $result[$row->service_id] = [$row->host_name]; } } return $result; } public function preloadMappings() { $this->mappings = $this->loadMappings(); return $this; } public function getBlacklistedHostnamesForService(IcingaService $service) { if ($this->mappings === null) { return $this->fetchMappingsForService($service); } else { return $this->getPreLoadedMappingsForService($service); } } public function fetchMappingsForService(IcingaService $service) { if (! $service->hasBeenLoadedFromDb() || $service->get('id') === null) { return []; } $db = $this->db->getDbAdapter(); $query = $db->select()->from(['hsb' => $this->table], [ 'host_name' => 'h.object_name', 'service_id' => 'hsb.service_id' ])->join( ['h' => 'icinga_host'], 'hsb.host_id = h.id', [] )->where('hsb.service_id = ?', $service->get('id')); return $db->fetchCol($query); } public function getPreLoadedMappingsForService(IcingaService $service) { if ( $this->mappings !== null && array_key_exists($service->get('id'), $this->mappings) ) { return $this->mappings[$service->get('id')]; } return []; } } icingaweb2-module-director-1.11.8/library/Director/Resolver/IcingaHostObjectResolver.php000066400000000000000000000020051516513262500313450ustar00rootroot00000000000000 'icinga_command', 'event_command_id' => 'icinga_command', 'check_period_id' => 'icinga_timeperiod', 'command_endpoint_id' => 'icinga_endpoint', 'zone_id' => 'icinga_zone', ]; protected $booleans = [ 'enable_notifications', 'enable_active_checks', 'enable_passive_checks', 'enable_event_handler', 'enable_flapping', 'enable_perfdata', 'volatile', ]; } icingaweb2-module-director-1.11.8/library/Director/Resolver/IcingaObjectResolver.php000066400000000000000000000407251516513262500305220ustar00rootroot00000000000000baseTable . ' warming up'); $this->db = $db; // Fetch: ignore disabled? $this->prepareNameMaps(); $this->templates = []; foreach ($this->fetchPlainObjects($this->baseTable, 'template') as $template) { $id = $template->id; $this->stripIgnoredProperties($template); $this->stripNullProperties($template); $this->templates[$id] = (array) $template; } $this->templateVars = $this->fetchTemplateVars(); $this->inheritancePaths = $this->fetchInheritancePaths($this->baseTable, 'host_id'); foreach ($this->inheritancePaths as $path) { $this->getResolvedImports($path); } // Using already resolved data, so this is unused right now: // $this->groupMemberShips = $this->fetchAllGroups(); $this->resolvedGroupMemberShips = $this->fetchAllResolvedGroups(); foreach ($this->inheritancePaths as $path) { if (! isset($this->resolvedTemplateProperties[$path])) { $properties = (object) $this->getResolvedProperties($path); $this->replaceRelatedNames($properties); $this->convertBooleans($properties); $this->resolvedTemplateProperties[$path] = $properties; $this->resolvedTemplateVars[$path] = $this->getResolvedVars($path); } } Benchmark::measure('Object Resolver for ' . $this->baseTable . ' is ready'); // Notes: // default != null: // most icinga objects: disabled => n // Icinga(ScheduledDowntime|TimePeriod)Range: range_type => include, merge_behaviour => set // IcingaTemplateChoice: min_required => 0, max_allowed => 1 // IcingaZone: is_global => n // ImportSource: import_state => unknown // SyncRule: sync_state => unknown } protected static function addUniqueMembers(&$list, $newMembers) { foreach (\array_reverse($newMembers) as $member) { $pos = \array_search($member, $list); if ($pos !== false) { unset($list[$pos]); } \array_unshift($list, $member); } } public function fetchResolvedObjects() { $objects = []; $allVars = $this->fetchNonTemplateVars(); foreach ($this->fetchPlainObjects($this->baseTable, 'object') as $object) { $id = $object->id; // id will be stripped $objects[$id] = $this->enrichObject($object, $allVars); } return $objects; } public function fetchObjectsMatchingFilter(Filter $filter) { $filter = clone($filter); DynamicApplyMatches::setType($this->getType()); DynamicApplyMatches::fixFilterColumns($filter); $helper = new AssignFilterHelper($filter); $objects = []; $allVars = $this->fetchNonTemplateVars(); foreach ($this->fetchPlainObjects($this->baseTable, 'object') as $object) { $id = $object->id; // id will be stripped $object = $this->enrichObject($object, $allVars); if ($helper->matches($object)) { $objects[$id] = $object; } } return $objects; } protected function enrichObject($object, $allVars) { $id = $object->id; $this->stripIgnoredProperties($object); if (isset($allVars[$id])) { $vars = $allVars[$id]; } else { $vars = []; } $vars += $this->getInheritedVarsById($id); // There is no merge, +/-, not yet. Unused, as we use resolved groups: // if (isset($this->groupMemberShips[$id])) { // $groups = $this->groupMemberShips[$id]; // } else { // $groups = $this->getInheritedGroupsById($id); // } if (isset($this->resolvedGroupMemberShips[$id])) { $groups = $this->resolvedGroupMemberShips[$id]; } else { $groups = []; } foreach ($this->getInheritedPropertiesById($id) as $property => $value) { if (! isset($object->$property)) { $object->$property = $value; } } $this->replaceRelatedNames($object); $this->convertBooleans($object); $this->stripNullProperties($object); if (! empty($vars)) { $object->vars = (object) $vars; static::flattenVars($object); } if (! empty($groups)) { $object->groups = $groups; } $templates = $this->getTemplateNamesByID($id); if (! empty($templates)) { $object->templates = \array_reverse($templates); } return $object; } /** * @param string $baseTable e.g. icinga_host * @param string $relColumn e.g. host_id * @return array */ protected function fetchInheritancePaths($baseTable, $relColumn) { if ($this->db instanceof \Zend_Db_Adapter_Pdo_Pgsql) { $groupColumn = "ARRAY_TO_STRING(ARRAY_AGG(parent_$relColumn ORDER BY weight), ',')"; } else { $groupColumn = "GROUP_CONCAT(parent_$relColumn ORDER BY weight SEPARATOR ',')"; } $query = $this->db->select() ->from([ 'oi' => "{$baseTable}_inheritance" ], [ $relColumn, $groupColumn ]) ->group($relColumn) // Ordering by length increases the possibility to have less cycles afterwards ->order("LENGTH($groupColumn)"); return $this->db->fetchPairs($query); } protected function getInheritedPropertiesById($objectId) { if (isset($this->inheritancePaths[$objectId])) { return $this->getResolvedProperties($this->inheritancePaths[$objectId]); } else { return []; } } protected function getInheritedVarsById($objectId) { if (isset($this->inheritancePaths[$objectId])) { return $this->getResolvedVars($this->inheritancePaths[$objectId]); } else { return []; } } protected function getInheritedGroupsById($objectId) { if (isset($this->inheritancePaths[$objectId])) { return $this->getResolvedGroups($this->inheritancePaths[$objectId]); } else { return []; } } protected function getTemplateNamesByID($objectId) { if (isset($this->inheritancePaths[$objectId])) { return $this->translateTemplateIdsToNames( $this->getResolvedImports($this->inheritancePaths[$objectId]) ); } else { return []; } } /** * @param $path * @return array[] */ protected function getResolvedProperties($path) { $result = []; // + adds only non existing members, so let's reverse our templates foreach ($this->getResolvedImports($path) as $templateId) { $result += $this->templates[$templateId]; } unset($result['object_name']); return $result; } protected function getResolvedVars($path) { $result = []; foreach ($this->getResolvedImports($path) as $templateId) { $result += $this->getTemplateVars($templateId); } return $result; } protected function getTemplateVars($templateId) { if (isset($this->templateVars[$templateId])) { return $this->templateVars[$templateId]; } else { return []; } } protected function getResolvedGroups($path) { $pos = \strpos($path, ','); if ($pos === false) { if (isset($this->groupMemberShips[$path])) { return $this->groupMemberShips[$path]; } else { return []; } } else { $first = \substr($path, 0, $pos); $parentPath = \substr($path, $pos + 1); $currentGroups = $this->getResolvedVars($first); // There is no merging +/-, not yet if (empty($currentGroups)) { return $this->getResolvedVars($parentPath); } else { return $currentGroups; } } } /** * Hint: this ships most important (last) imports first * * @param $path * @return array */ protected function getResolvedImports($path) { if (! isset($this->flatImports[$path])) { $this->flatImports[$path] = $this->calculateFlatImports($path); } return $this->flatImports[$path]; } protected function calculateFlatImports($path) { $imports = \preg_split('/,/', $path); $ancestors = []; foreach ($imports as $template) { if (isset($this->inheritancePaths[$template])) { $this->addUniqueMembers( $ancestors, $this->calculateFlatImports($this->inheritancePaths[$template]) ); } $this->addUniqueMembers($ancestors, [$template]); } return $ancestors; } protected function fetchPlainObjects($table, $objectType = null) { $query = $this->db->select() ->from(['o' => $table]) ->order('o.object_name'); if ($objectType !== null) { $query->where('o.object_type = ?', $objectType); } return $this->db->fetchAll($query); } /** * @param \stdClass $object */ protected function replaceRelatedNames($object) { foreach ($this->nameMaps as $property => $map) { if (\property_exists($object, $property)) { // Hint: substr strips _id if ($object->$property === null) { $object->{\substr($property, 0, -3)} = null; } else { $object->{\substr($property, 0, -3)} = $map[$object->$property]; } unset($object->$property); } } } protected function translateTemplateIdsToNames($ids) { $names = []; foreach ($ids as $id) { if (isset($this->templates[$id])) { $names[] = $this->templates[$id]['object_name']; } else { throw new \RuntimeException("There is no template with ID $id"); } } return $names; } protected function stripIgnoredProperties($object) { foreach ($this->ignoredProperties as $key) { unset($object->$key); } } public function prepareNameMaps() { // TODO: fetch from dummy Object? How to ignore irrelevant ones like choices? $relatedNames = []; foreach ($this->relatedTables as $key => $relatedTable) { $relatedNames[$key] = $this->fetchRelationMap($this->baseTable, $relatedTable, $key); } $this->nameMaps = $relatedNames; } protected function convertBooleans($object) { foreach ($this->booleans as $property) { if (\property_exists($object, $property) && $object->$property !== null) { // Hint: substr strips _id $object->$property = $object->$property === 'y'; } } } protected function stripNullProperties($object) { foreach (\array_keys((array) $object) as $property) { if ($object->$property === null) { unset($object->$property); } } } protected function fetchRelationMap($sourceTable, $destinationTable, $property) { $query = $this->db->select() ->from(['d' => $destinationTable], ['d.id', 'd.object_name']) ->join(['o' => $sourceTable], "d.id = o.$property", []) ->order('d.object_name'); return $this->db->fetchPairs($query); } protected function fetchTemplateVars() { $query = $this->prepareVarsQuery()->where('o.object_type = ?', 'template'); return $this->fetchAndCombineVars($query); } protected function fetchNonTemplateVars() { $query = $this->prepareVarsQuery()->where('o.object_type != ?', 'template'); return $this->fetchAndCombineVars($query); } protected function fetchAndCombineVars($query) { $vars = []; foreach ($this->db->fetchAll($query) as $var) { $id = $var->object_id; if (! isset($vars[$id])) { $vars[$id] = []; } if ($var->format === 'json') { $vars[$id][$var->varname] = \json_decode($var->varvalue); } else { $vars[$id][$var->varname] = $var->varvalue; } } return $vars; } protected function fetchAllGroups() { $query = $this->prepareGroupsQuery(); return $this->fetchAndCombineGroups($query); } protected function fetchAllResolvedGroups() { $query = $this->prepareGroupsQuery(true); return $this->fetchAndCombineGroups($query); } protected function fetchAndCombineGroups($query) { $groups = []; foreach ($this->db->fetchAll($query) as $group) { $id = $group->object_id; if (isset($groups[$id])) { $groups[$id][$group->group_id] = $group->group_name; } else { $groups[$id] = [ $group->group_id => $group->group_name ]; } } return $groups; } protected function prepareGroupsQuery($resolved = false) { $type = $this->getType(); $groupsTable = $this->baseTable . 'group'; $groupMembershipTable = "{$groupsTable}_$type"; if ($resolved) { $groupMembershipTable .= '_resolved'; } $oRef = "{$type}_id"; $gRef = "{$type}group_id"; return $this->db->select() ->from(['gm' => $groupMembershipTable], [ 'object_id' => $oRef, 'group_id' => $gRef, 'group_name' => 'g.object_name' ]) ->join(['g' => $groupsTable], "g.id = gm.$gRef", []) ->order("gm.$oRef") ->order('g.object_name'); } protected function prepareVarsQuery() { $table = $this->baseTable . '_var'; $ref = $this->getType() . '_id'; return $this->db->select() ->from(['v' => $table], [ 'object_id' => $ref, 'v.varname', 'v.varvalue', 'v.format', // 'v.checksum', ]) ->join(['o' => $this->baseTable], "o.id = v.$ref", []) ->order('o.id') ->order('v.varname'); } protected function getType() { return \preg_replace('/^icinga_/', '', $this->baseTable); } /** * Helper, flattens all vars of a given object * * The object itself will be modified, and the 'vars' property will be * replaced with corresponding 'vars.whatever' properties * * @param $object * @param string $key */ protected static function flattenVars(\stdClass $object, $key = 'vars') { if (\property_exists($object, $key)) { foreach ($object->vars as $k => $v) { if (\is_object($v)) { static::flattenVars($v, $k); } $object->{$key . '.' . $k} = $v; } unset($object->$key); } } } icingaweb2-module-director-1.11.8/library/Director/Resolver/OverriddenVarsResolver.php000066400000000000000000000040211516513262500311230ustar00rootroot00000000000000overrideVarName = $connection->settings()->get('override_services_varname'); $this->db = $connection->getDbAdapter(); } public function fetchForHost(IcingaHost $host) { $overrides = []; $parents = $host->listFlatResolvedImportNames(); if (empty($parents)) { return $overrides; } $query = $this->db->select() ->from(['hv' => 'icinga_host_var'], [ 'host_name' => 'h.object_name', 'varvalue' => 'hv.varvalue', ]) ->join( ['h' => 'icinga_host'], 'h.id = hv.host_id', [] ) ->where('hv.varname = ?', $this->overrideVarName) ->where('h.object_name IN (?)', $parents); foreach ($this->db->fetchAll($query) as $row) { if ($row->varvalue === null) { continue; } foreach (Json::decode($row->varvalue) as $serviceName => $vars) { $overrides[$serviceName][$row->host_name] = $vars; } } return $overrides; } public function fetchForServiceName(IcingaHost $host, $serviceName) { $overrides = $this->fetchForHost($host); if (isset($overrides[$serviceName])) { return $overrides[$serviceName]; } return []; } public function fetchVarForServiceName(IcingaHost $host, $serviceName, $varName) { $overrides = $this->fetchForHost($host); if (isset($overrides[$serviceName][$varName])) { return $overrides[$serviceName][$varName]; } return null; } } icingaweb2-module-director-1.11.8/library/Director/Resolver/OverrideHelper.php000066400000000000000000000021451516513262500273700ustar00rootroot00000000000000getOverriddenServiceVars($serviceName); foreach ($properties as $key => $value) { if ($key === 'vars') { foreach ($value as $k => $v) { $current->$k = $v; } } else { $current->{substr($key, 5)} = $value; } } $host->overrideServiceVars($serviceName, $current); } public static function assertVarsForOverrides($properties) { if (empty($properties)) { return; } foreach ($properties as $key => $value) { if ($key !== 'vars' && substr($key, 0, 5) !== 'vars.') { throw new InvalidArgumentException("Only Custom Variables can be set based on Variable Overrides"); } } } } icingaweb2-module-director-1.11.8/library/Director/Resolver/TemplateTree.php000066400000000000000000000325341516513262500270510ustar00rootroot00000000000000type = $type; $this->connection = $connection; $this->db = $connection->getDbAdapter(); } public function getType() { return $this->type; } public function listParentNamesFor(IcingaObject $object) { $id = (int) $object->getProperty('id'); $this->requireTree(); if (array_key_exists($id, $this->parents)) { return array_values($this->parents[$id]); } $this->requireObjectMaps(); $parents = []; if (array_key_exists($id, $this->objectMaps)) { foreach ($this->objectMaps[$id] as $pid) { if (array_key_exists($pid, $this->names)) { $parents[] = $this->names[$pid]; } else { throw new RuntimeException(sprintf( 'Got invalid parent id %d for %s "%s"', $pid, $this->type, $object->getObjectName() )); } } } return $parents; } protected function loadObjectMaps() { $this->requireTree(); $map = []; $db = $this->db; $type = $this->type; $table = "icinga_{$type}_inheritance"; $query = $db->select()->from( ['i' => $table], [ 'object' => "i.{$type}_id", 'parent' => "i.parent_{$type}_id", ] )->order('i.weight'); foreach ($db->fetchAll($query) as $row) { $id = (int) $row->object; if (! array_key_exists($id, $map)) { $map[$id] = []; } $map[$id][] = (int) $row->parent; } $this->objectMaps = $map; } public function listParentIdsFor(IcingaObject $object) { return array_keys($this->getParentsFor($object)); } public function listAncestorIdsFor(IcingaObject $object) { return array_keys($this->getAncestorsFor($object)); } public function listChildIdsFor(IcingaObject $object) { return array_keys($this->getChildrenFor($object)); } public function listDescendantIdsFor(IcingaObject $object) { return array_keys($this->getDescendantsFor($object)); } public function getParentsFor(IcingaObject $object) { // can not use hasBeenLoadedFromDb() when in onStore() $id = $object->getProperty('id'); if ($id !== null) { return $this->getParentsById($object->getProperty('id')); } else { throw new RuntimeException( 'Loading parents for unstored objects has not been implemented yet' ); // return $this->getParentsForUnstoredObject($object); } } public function getAncestorsFor(IcingaObject $object) { if ( $object->hasBeenModified() && $object->gotImports() && $object->imports()->hasBeenModified() ) { return $this->getAncestorsForUnstoredObject($object); } else { return $this->getAncestorsById($object->getProperty('id')); } } protected function getAncestorsForUnstoredObject(IcingaObject $object) { $this->requireTree(); $ancestors = []; foreach ($object->imports() as $import) { $name = $import->getObjectName(); if ($import->hasBeenLoadedFromDb()) { $pid = (int) $import->get('id'); } else { if (! array_key_exists($name, $this->templateNameToId)) { continue; } $pid = $this->templateNameToId[$name]; } $this->getAncestorsById($pid, $ancestors); // Hint: inheritance order matters if (false !== ($key = array_search($name, $ancestors))) { // Note: this used to be just unset($ancestors[$key]), and that // broke Apply Rules inheriting from Templates with the same name // in a way that related fields no longer showed up (#1602) // This new if relaxes this and doesn't unset in case the name // matches the original object name. However, I'm still unsure why // this was required at all. if ($name !== $object->getObjectName()) { unset($ancestors[$key]); } } $ancestors[$pid] = $name; } return $ancestors; } protected function requireObjectMaps() { if ($this->objectMaps === null) { $this->loadObjectMaps(); } } public function getParentsById($id) { $this->requireTree(); if (array_key_exists($id, $this->parents)) { return $this->parents[$id]; } $this->requireObjectMaps(); if (array_key_exists($id, $this->objectMaps)) { $parents = []; foreach ($this->objectMaps[$id] as $pid) { $parents[$pid] = $this->names[$pid]; } return $parents; } else { return []; } } /** * @param $id * @param $list * @throws NestingError */ protected function assertNotInList($id, &$list) { if (array_key_exists($id, $list)) { $list = array_keys($list); array_push($list, $id); if (is_int($id)) { throw new NestingError( 'Loop detected: %s', implode(' -> ', $this->getNamesForIds($list, true)) ); } else { throw new NestingError( 'Loop detected: %s', implode(' -> ', $list) ); } } } protected function getNamesForIds($ids, $ignoreErrors = false) { $names = []; foreach ($ids as $id) { $names[] = $this->getNameForId($id, $ignoreErrors); } return $names; } protected function getNameForId($id, $ignoreErrors = false) { if (! array_key_exists($id, $this->names)) { if ($ignoreErrors) { return "id=$id"; } else { throw new InvalidArgumentException("Got no name for $id"); } } return $this->names[$id]; } /** * @param $id * @param array $ancestors * @param array $path * @return array * @throws NestingError */ public function getAncestorsById($id, &$ancestors = [], $path = []) { $path[$id] = true; foreach ($this->getParentsById($id) as $pid => $name) { $this->assertNotInList($pid, $path); $path[$pid] = true; $this->getAncestorsById($pid, $ancestors, $path); unset($path[$pid]); // Hint: inheritance order matters if (false !== ($key = array_search($name, $ancestors))) { unset($ancestors[$key]); } $ancestors[$pid] = $name; } unset($path[$id]); return $ancestors; } public function getChildrenFor(IcingaObject $object) { // can not use hasBeenLoadedFromDb() when in onStore() $id = $object->getProperty('id'); if ($id !== null) { return $this->getChildrenById($id); } else { throw new RuntimeException( 'Loading children for unstored objects has not been implemented yet' ); // return $this->getChildrenForUnstoredObject($object); } } public function getChildrenById($id) { $this->requireTree(); if (array_key_exists($id, $this->children)) { return $this->children[$id]; } else { return []; } } public function getDescendantsFor(IcingaObject $object) { // can not use hasBeenLoadedFromDb() when in onStore() $id = $object->getProperty('id'); if ($id !== null) { return $this->getDescendantsById($id); } else { throw new RuntimeException( 'Loading descendants for unstored objects has not been implemented yet' ); // return $this->getDescendantsForUnstoredObject($object); } } public function getDescendantsById($id, &$children = [], &$path = []) { $path[$id] = true; foreach ($this->getChildrenById($id) as $pid => $name) { $this->assertNotInList($pid, $path); $path[$pid] = true; $this->getDescendantsById($pid, $children, $path); unset($path[$pid]); $children[$pid] = $name; } unset($path[$id]); return $children; } public function getTree($parentId = null) { if ($this->tree === null) { $this->prepareTree(); } if ($parentId === null) { return $this->returnFullTree(); } else { throw new RuntimeException( 'Partial tree fetching has not been implemented yet' ); // return $this->partialTree($parentId); } } protected function returnFullTree() { $result = $this->rootNodes; foreach ($result as $id => &$node) { $this->addChildrenById($id, $node); } return $result; } protected function addChildrenById($pid, array &$base) { foreach ($this->getChildrenById($pid) as $id => $name) { $base['children'][$id] = [ 'name' => $name, 'children' => [] ]; $this->addChildrenById($id, $base['children'][$id]); } } protected function prepareTree() { Benchmark::measure(sprintf('Prepare "%s" Template Tree', $this->type)); $templates = $this->fetchTemplates(); $parents = []; $rootNodes = []; $children = []; $names = []; foreach ($templates as $row) { $id = (int) $row->id; $pid = (int) $row->parent_id; $names[$id] = $row->name; if (! array_key_exists($id, $parents)) { $parents[$id] = []; } if ($row->parent_id === null) { $rootNodes[$id] = [ 'name' => $row->name, 'children' => [] ]; continue; } $names[$pid] = $row->parent_name; $parents[$id][$pid] = $row->parent_name; if (! array_key_exists($pid, $children)) { $children[$pid] = []; } $children[$pid][$id] = $row->name; } $this->parents = $parents; $this->children = $children; $this->rootNodes = $rootNodes; $this->names = $names; $this->templateNameToId = array_flip($names); Benchmark::measure(sprintf('"%s" Template Tree ready', $this->type)); } public function fetchObjects() { //?? } protected function requireTree() { if ($this->parents === null) { $this->prepareTree(); } } public function fetchTemplates() { $db = $this->db; $type = $this->type; $table = "icinga_$type"; if ($type === 'command') { $joinCondition = $db->quoteInto( "p.id = i.parent_{$type}_id", 'template' ); } else { $joinCondition = $db->quoteInto( "p.id = i.parent_{$type}_id AND p.object_type = ?", 'template' ); } $query = $db->select()->from( ['o' => $table], [ 'id' => 'o.id', 'name' => 'o.object_name', 'object_type' => 'o.object_type', 'parent_id' => 'p.id', 'parent_name' => 'p.object_name', ] )->joinLeft( ['i' => $table . '_inheritance'], 'o.id = i.' . $type . '_id', [] )->joinLeft( ['p' => $table], $joinCondition, [] )->order('o.object_name')->order('i.weight'); if ($type !== 'command') { $query->where( 'o.object_type = ?', 'template' ); } return $db->fetchAll($query); } } /** * SELECT o.id, o.object_name AS name, o.object_type, p.id AS parent_id, p.object_name AS parent_name FROM icinga_service AS o RIGHT JOIN icinga_service_inheritance AS i ON o.id = i.service_id RIGHT JOIN icinga_service AS p ON p.id = i.parent_service_id WHERE (p.object_type = 'template') AND (o.object_type = 'template') ORDER BY o.id ASC, i.weight ASC */ icingaweb2-module-director-1.11.8/library/Director/RestApi/000077500000000000000000000000001516513262500235045ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/RestApi/IcingaObjectHandler.php000066400000000000000000000163261516513262500300440ustar00rootroot00000000000000object = $object; return $this; } public function setApi(CoreApi $api) { $this->api = $api; return $this; } /** * @return IcingaObject * @throws ProgrammingError */ protected function requireObject() { if ($this->object === null) { throw new ProgrammingError('Object is required'); } return $this->object; } /** * @return IcingaObject */ protected function loadOptionalObject() { return $this->object; } protected function requireJsonBody() { $data = json_decode($this->request->getRawBody()); if ($data === null) { $this->response->setHttpResponseCode(400); throw new IcingaException( 'Invalid JSON: %s', $this->getLastJsonError() ); } return $data; } protected function getType() { return $this->request->getControllerName(); } protected function processApiRequest() { try { $this->handleApiRequest(); } catch (NotFoundError $e) { $this->sendJsonError($e, 404); return; } catch (DuplicateKeyException $e) { $this->sendJsonError($e, 422); return; } catch (Exception $e) { $this->sendJsonError($e); } if ($this->request->getActionName() !== 'index') { throw new NotFoundError('Not found'); } } protected function handleApiRequest() { $request = $this->request; $db = $this->db; // TODO: I hate doing this: if ($this->request->getActionName() === 'ticket') { $host = $this->requireObject(); if ($host->getResolvedProperty('has_agent') !== 'y') { throw new NotFoundError('The host "%s" is not an agent', $host->getObjectName()); } $this->sendJson($this->api->getTicket($host->getObjectName())); // TODO: find a better way to shut down. Currently, this avoids // "not found" errors: exit; } switch ($request->getMethod()) { case 'DELETE': $object = $this->requireObject(); $object->delete(); $this->sendJson($object->toPlainObject(false, true)); break; case 'POST': case 'PUT': $data = (array) $this->requireJsonBody(); $params = $this->request->getUrl()->getParams(); $allowsOverrides = $params->get('allowOverrides'); $type = $this->getType(); if ($object = $this->loadOptionalObject()) { if ($request->getMethod() === 'POST') { $object->setProperties($data); } else { $data = array_merge([ 'object_type' => $object->get('object_type'), 'object_name' => $object->getObjectName() ], $data); $object->replaceWith(IcingaObject::createByType($type, $data, $db)); } // Avoid cyclic imports for hosts and commands if (in_array($object->getShortTableName(), ['host', 'command'], true)) { if (in_array((int) $object->get('id'), $object->listAncestorIds())) { throw new RuntimeException( 'Import loop detected for the object ' . $object->getObjectName() . ' -> Imports: ' . implode(', ', $object->getImports()) ); } if (isset($data['imports']) && in_array($object->get('object_name'), $data['imports'])) { throw new RuntimeException( 'You can not import the same object into itself: ' . $object->getObjectName() ); } } $this->persistChanges($object); $this->sendJson($object->toPlainObject(false, true)); } elseif ($allowsOverrides && $type === 'service') { if ($request->getMethod() === 'PUT') { throw new InvalidArgumentException('Overrides are not (yet) available for HTTP PUT'); } $this->setServiceProperties($params->getRequired('host'), $params->getRequired('name'), $data); } else { $object = IcingaObject::createByType($type, $data, $db); $this->persistChanges($object); $this->sendJson($object->toPlainObject(false, true)); } break; case 'GET': $object = $this->requireObject(); $exporter = new Exporter($this->db); RestApiParams::applyParamsToExporter($exporter, $this->request, $object->getShortTableName()); $this->sendJson($exporter->export($object)); break; default: $request->getResponse()->setHttpResponseCode(400); throw new IcingaException('Unsupported method ' . $request->getMethod()); } } protected function persistChanges(IcingaObject $object) { if ($object->hasBeenModified()) { $status = $object->hasBeenLoadedFromDb() ? 200 : 201; $object->store(); $this->response->setHttpResponseCode($status); } else { $this->response->setHttpResponseCode(304); } } protected function setServiceProperties($hostname, $serviceName, $properties) { $host = IcingaHost::load($hostname, $this->db); $service = ServiceFinder::find($host, $serviceName); if ($service === false) { throw new NotFoundError('Not found'); } if ($service->requiresOverrides()) { unset($properties['host']); OverrideHelper::applyOverriddenVars($host, $serviceName, $properties); $this->persistChanges($host); $this->sendJson($host->toPlainObject(false, true)); } else { throw new RuntimeException('Found a single service, which should have been found (and dealt with) before'); } } } icingaweb2-module-director-1.11.8/library/Director/RestApi/IcingaObjectsHandler.php000066400000000000000000000077221516513262500302270ustar00rootroot00000000000000streamJsonResult(); } catch (Exception $e) { $this->sendJsonError($e); } } /** * @param ObjectsTable|ApplyRulesTable $table * @return $this */ public function setTable($table) { $this->table = $table; return $this; } /** * @return ObjectsTable * @throws ProgrammingError */ protected function getTable() { if ($this->table === null) { throw new ProgrammingError('Table is required'); } return $this->table; } /** * @throws ProgrammingError * @throws \Zend_Db_Select_Exception * @throws \Zend_Db_Statement_Exception */ protected function streamJsonResult() { $this->response->setHeader('Content-Type', 'application/json', true); $this->response->sendHeaders(); $connection = $this->db; Benchmark::measure('Ready to stream JSON result'); $db = $connection->getDbAdapter(); $table = $this->getTable(); $exporter = new Exporter($connection); $type = $table->getType(); RestApiParams::applyParamsToExporter($exporter, $this->request, $type); $query = $table ->getQuery() ->reset(ZfSelect::COLUMNS) ->columns('*') ->reset(ZfSelect::LIMIT_COUNT) ->reset(ZfSelect::LIMIT_OFFSET); if ($type === 'service' && $table instanceof ApplyRulesTable) { $exporter->showIds(); } echo '{ "objects": [ '; $cnt = 0; $objects = []; $dummy = IcingaObject::createByType($type, [], $connection); $dummy->prefetchAllRelatedTypes(); Benchmark::measure('Pre-fetching related objects'); PrefetchCache::initialize($this->db); Benchmark::measure('Ready to query'); $stmt = $db->query($query); $this->response->sendHeaders(); if (! ob_get_level()) { ob_start(); } $first = true; $flushes = 0; while ($row = $stmt->fetch()) { /** @var IcingaObject $object */ if ($first) { Benchmark::measure('Fetching first row'); } $object = $dummy::fromDbRow($row, $connection); $objects[] = JsonString::encode($exporter->export($object), JSON_PRETTY_PRINT); if ($first) { Benchmark::measure('Got first row'); $first = false; } $cnt++; if ($cnt === 100) { if ($flushes > 0) { echo ', '; } echo implode(', ', $objects); $cnt = 0; $objects = []; $flushes++; ob_end_flush(); ob_start(); } } if ($cnt > 0) { if ($flushes > 0) { echo ', '; } echo implode(', ', $objects); } if ($this->request->getUrl()->getParams()->get('benchmark')) { echo "],\n"; Benchmark::measure('All done'); echo '"benchmark_string": ' . json_encode(Benchmark::renderToText()); } else { echo '] '; } echo "}\n"; if (ob_get_level()) { ob_end_flush(); } // TODO: can we improve this? exit; } } icingaweb2-module-director-1.11.8/library/Director/RestApi/RequestHandler.php000066400000000000000000000045651516513262500271550ustar00rootroot00000000000000request = $request; $this->response = $response; $this->db = $db; } abstract protected function processApiRequest(); public function dispatch() { $this->processApiRequest(); } public function sendJson($object) { $this->response->setHeader('Content-Type', 'application/json', true); $this->response->sendHeaders(); echo JsonString::encode($object, JSON_PRETTY_PRINT) . "\n"; } public function sendJsonError($error, $code = null) { $response = $this->response; if ($code === null) { if ($response->getHttpResponseCode() === 200) { $response->setHttpResponseCode(500); } } else { $response->setHttpResponseCode((int) $code); } if ($error instanceof Exception) { $message = $error->getMessage(); } else { $message = $error; } $response->sendHeaders(); $result = ['error' => $message]; if ($this->request->getUrl()->getParam('showStacktrace')) { $result['trace'] = $error->getTraceAsString(); } $this->sendJson((object) $result); } // TODO: just return json_last_error_msg() for PHP >= 5.5.0 protected function getLastJsonError() { switch (json_last_error()) { case JSON_ERROR_DEPTH: return 'The maximum stack depth has been exceeded'; case JSON_ERROR_CTRL_CHAR: return 'Control character error, possibly incorrectly encoded'; case JSON_ERROR_STATE_MISMATCH: return 'Invalid or malformed JSON'; case JSON_ERROR_SYNTAX: return 'Syntax error'; case JSON_ERROR_UTF8: return 'Malformed UTF-8 characters, possibly incorrectly encoded'; default: return 'An error occured when parsing a JSON string'; } } } icingaweb2-module-director-1.11.8/library/Director/RestApi/RestApiClient.php000066400000000000000000000160331516513262500267260ustar00rootroot00000000000000 CURLPROXY_HTTP, 'SOCKS5' => CURLPROXY_SOCKS5, ]; /** * RestApiClient constructor. * * Please note that only the host is required, user and pass are optional * * @param string $host * @param string|null $user * @param string|null $pass */ public function __construct($host, $user = null, $pass = null) { $this->host = $host; $this->user = $user; $this->pass = $pass; } /** * Use a proxy * * @param $url * @param string $type Either HTTP or SOCKS5 * @return $this */ public function setProxy($url, $type = 'HTTP') { $this->proxy = $url; if (\is_int($type)) { $this->proxyType = $type; } else { $this->proxyType = $this->proxyTypes[$type]; } return $this; } /** * @param string $user * @param string $pass * @return $this */ public function setProxyAuth($user, $pass) { $this->proxyUser = $user; $this->proxyPass = $pass; return $this; } /** * @return string */ public function getScheme() { if ($this->scheme === null) { return 'HTTPS'; } else { return $this->scheme; } } public function setScheme($scheme) { $scheme = \strtoupper($scheme); if (! \in_array($scheme, ['HTTP', 'HTTPS'])) { throw new InvalidArgumentException("Got invalid scheme: $scheme"); } $this->scheme = $scheme; return $this; } /** * @return string */ public function getPort() { if ($this->port === null) { return $this->getScheme() === 'HTTPS' ? 443 : 80; } else { return $this->port; } } /** * @param int|string|null $port * @return $this */ public function setPort($port) { if ($port === null) { $this->port = null; return $this; } $port = (int) ($port); if ($port < 1 || $port > 65535) { throw new InvalidArgumentException("Got invalid port: $port"); } $this->port = $port; return $this; } /** * @return bool */ public function isDefaultPort() { return $this->port === null || $this->getScheme() === 'HTTPS' && $this->getPort() === 443 || $this->getScheme() === 'HTTP' && $this->getPort() === 80; } /** * @param bool $disable * @return $this */ public function disableSslPeerVerification($disable = true) { $this->verifySslPeer = ! $disable; return $this; } /** * @param bool $disable * @return $this */ public function disableSslHostVerification($disable = true) { $this->verifySslHost = ! $disable; return $this; } /** * @param string $url * @return string */ public function url($url) { return \sprintf( '%s://%s%s/%s', \strtolower($this->getScheme()), $this->host, $this->isDefaultPort() ? '' : ':' . $this->getPort(), ltrim($url, '/') ); } /** * @param string $url * @param mixed $body * @param array $headers * @return mixed */ public function get($url, $body = null, $headers = []) { return $this->request('get', $url, $body, $headers); } /** * @param $url * @param null $body * @param array $headers * @return mixed */ public function post($url, $body = null, $headers = []) { return $this->request('post', $url, Json::encode($body), $headers); } /** * @param $method * @param $url * @param null $body * @param array $headers * @return mixed */ protected function request($method, $url, $body = null, $headers = []) { $sendHeaders = ['Host: ' . $this->host]; foreach ($headers as $key => $val) { $sendHeaders[] = "$key: $val"; } if (! \in_array('Accept', $headers)) { $sendHeaders[] = 'Accept: application/json'; } $url = $this->url($url); $opts = [ CURLOPT_URL => $url, CURLOPT_HTTPHEADER => $sendHeaders, CURLOPT_CUSTOMREQUEST => \strtoupper($method), CURLOPT_RETURNTRANSFER => true, CURLOPT_CONNECTTIMEOUT => 5, ]; if ($this->getScheme() === 'HTTPS') { $opts[CURLOPT_SSL_VERIFYPEER] = $this->verifySslPeer; $opts[CURLOPT_SSL_VERIFYHOST] = $this->verifySslHost ? 2 : 0; } if ($this->user !== null) { $opts[CURLOPT_USERPWD] = \sprintf('%s:%s', $this->user, $this->pass); } if ($this->proxy) { $opts[CURLOPT_PROXY] = $this->proxy; $opts[CURLOPT_PROXYTYPE] = $this->proxyType; if ($this->proxyUser) { $opts['CURLOPT_PROXYUSERPWD'] = \sprintf( '%s:%s', $this->proxyUser, $this->proxyPass ); } } if ($body !== null) { $opts[CURLOPT_POSTFIELDS] = $body; } $curl = $this->curl(); \curl_setopt_array($curl, $opts); $res = \curl_exec($curl); if ($res === false) { throw new RuntimeException('CURL ERROR: ' . \curl_error($curl)); } $statusCode = \curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($statusCode === 401) { throw new RuntimeException( 'Unable to authenticate, please check your REST API credentials' ); } if ($statusCode >= 400) { throw new RuntimeException( "Got $statusCode: " . \var_export($res, true) ); } return Json::decode($res); } /** * @throws RuntimeException */ protected function curl() { if ($this->curl === null) { $this->curl = curl_init(sprintf('https://%s:%d', $this->host, $this->port)); if (! $this->curl) { throw new RuntimeException('CURL INIT FAILED'); } } return $this->curl; } } icingaweb2-module-director-1.11.8/library/Director/RestApi/RestApiParams.php000066400000000000000000000020111516513262500267220ustar00rootroot00000000000000getUrl()->getParams(); $resolved = (bool) $params->get('resolved', false); $withNull = $params->shift('withNull'); if ($params->get('withServices')) { if ($shortObjectType !== 'host') { throw new InvalidArgumentException('withServices is available for Hosts only'); } $exporter->enableHostServices(); } /** @var ?string $properties */ $properties = $params->shift('properties'); if ($properties) { $exporter->filterProperties(preg_split('/\s*,\s*/', $properties, -1, PREG_SPLIT_NO_EMPTY)); } $exporter->resolveObjects($resolved); $exporter->showDefaults($withNull); } } icingaweb2-module-director-1.11.8/library/Director/Restriction/000077500000000000000000000000001516513262500244425ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Restriction/FilterByNameRestriction.php000066400000000000000000000032021516513262500317170ustar00rootroot00000000000000setType($type); } protected function setType($type) { $this->type = $type; $this->setNameForType($type); } protected function setNameForType($type) { if ($type === 'service_set') { $this->name = "director/{$type}/filter-by-name"; } else { $this->name = "director/{$type}/apply/filter-by-name"; } } public function allows(IcingaObject $object) { if (! $this->isRestricted()) { return true; } return $this->getFilter()->matches( (object) ['object_name' => $object->getObjectName()] ); } public function getFilter() { if ($this->filter === null) { $this->filter = MatchingFilter::forUser( $this->auth->getUser(), $this->name, 'object_name' ); } return $this->filter; } protected function filterQuery(ZfSelect $query, $tableAlias = 'o') { FilterRenderer::applyToQuery($this->getFilter(), $query); } } icingaweb2-module-director-1.11.8/library/Director/Restriction/HostgroupRestriction.php000066400000000000000000000131401516513262500313720ustar00rootroot00000000000000allowsHost($object); } elseif ($object instanceof IcingaHostGroup) { return $this->allowsHostGroup($object); } else { return $this; } } protected function filterQuery(ZfSelect $query, $tableAlias = 'o') { $table = $this->getQueryTableByAlias($query, $tableAlias); switch ($table) { case 'icinga_host': $this->filterHostsQuery($query, $tableAlias); break; case 'icinga_service': // TODO: Alias is hardcoded $this->filterHostsQuery($query, 'h'); break; case 'icinga_hostgroup': $this->filterHostGroupsQuery($query, $tableAlias); break; // Hint: other tables are ignored, so please take care! } return $query; } /** * Whether access to the given host is allowed * * @param IcingaHost $host * @return bool */ public function allowsHost(IcingaHost $host) { if (! $this->isRestricted()) { return true; } // Hint: branched hosts have no id if (! $host->hasBeenLoadedFromDb() || $host->hasModifiedGroups() || $host->get('id') === null) { foreach ($this->listRestrictedHostgroups() as $group) { if ($host->hasGroup($group) || $this->matchesHostGroupFilter($group, $host)) { return true; } } return false; } $query = $this->db->select()->from( ['o' => 'icinga_host'], ['id'] )->where('o.id = ?', $host->id); $this->filterHostsQuery($query); return (int) $this->db->fetchOne($query) === (int) $host->get('id'); } /** * Check if the given host matches the filter of given host group * * @param string $group * @param IcingaHost $host * * @return bool */ private function matchesHostGroupFilter(string $group, IcingaHost $host): bool { return HostApplyMatches::prepare($host)->matchesFilter( Filter::fromQueryString(IcingaHostGroup::load($group, $host->getConnection())->get('assign_filter')) ); } /** * Whether access to the given hostgroup is allowed * * @param IcingaHostGroup $hostgroup * @return bool */ public function allowsHostGroup(IcingaHostGroup $hostgroup) { if (! $this->isRestricted()) { return true; } $query = $this->db->select()->from( ['h' => 'icinga_hostgroup'], ['id'] )->where('id = ?', $hostgroup->id); $this->filterHostGroupsQuery($query, 'h'); return (int) $this->db->fetchOne($query) === (int) $hostgroup->get('id'); } /** * Apply the restriction to the given Hosts Query * * We assume that the query wants to fetch hosts and that therefore the * icinga_host table already exists in the given query, using the $tableAlias * alias. * * @param ZfSelect $query * @param string $tableAlias */ public function filterHostsQuery(ZfSelect $query, $tableAlias = 'o') { if (! $this->isRestricted()) { return; } IcingaObjectFilterHelper::filterByResolvedHostgroups( $query, 'host', $this->listRestrictedHostgroups(), $tableAlias ); } public function filterRestrictedHostgroups(array $groups) { return array_intersect($groups, $this->listRestrictedHostgroups()); } /** * Apply the restriction to the given Hosts Query * * We assume that the query wants to fetch hosts and that therefore the * icinga_host table already exists in the given query, using the $tableAlias * alias. * * @param ZfSelect $query * @param string $tableAlias */ protected function filterHostGroupsQuery(ZfSelect $query, $tableAlias = 'o') { if (! $this->isRestricted()) { return; } $groups = $this->listRestrictedHostgroups(); if (empty($groups)) { $query->where('(1 = 0)'); } else { $query->where("{$tableAlias}.object_name IN (?)", $groups); } } /** * Give a list of allowed Hostgroups * * When not restricted, null is returned. This might eventually also give * an empty list, and therefore not allow any access at all * * @return array|null */ protected function listRestrictedHostgroups() { if ($restrictions = $this->auth->getRestrictions($this->getName())) { $groups = array(); foreach ($restrictions as $restriction) { foreach ($this->gracefullySplitOnComma($restriction) as $group) { $groups[$group] = $group; } } return array_keys($groups); } else { return null; } } } icingaweb2-module-director-1.11.8/library/Director/Restriction/MatchingFilter.php000066400000000000000000000016301516513262500300530ustar00rootroot00000000000000getRestrictions($restrictionName), $columnName ); } } icingaweb2-module-director-1.11.8/library/Director/Restriction/ObjectRestriction.php000066400000000000000000000041671516513262500306170ustar00rootroot00000000000000db = $connection->getDbAdapter(); $this->auth = $auth; } abstract public function allows(IcingaObject $object); /** * Apply the restriction to the given Hosts Query * * We assume that the query wants to fetch hosts and that therefore the * icinga_host table already exists in the given query, using the $tableAlias * alias. * * @param ZfSelect $query * @param string $tableAlias */ abstract protected function filterQuery(ZfSelect $query, $tableAlias = 'o'); public function applyToQuery(ZfSelect $query, $tableAlias = 'o') { if ($this->isRestricted()) { $this->filterQuery($query, $tableAlias); } return $query; } public function getName() { if ($this->name === null) { throw new ProgrammingError('ObjectRestriction has no name'); } return $this->name; } public function isRestricted() { $restrictions = $this->auth->getRestrictions($this->getName()); return ! empty($restrictions); } protected function getQueryTableByAlias(ZfSelect $query, $tableAlias) { $from = $query->getPart(ZfSelect::FROM); if (! array_key_exists($tableAlias, $from)) { throw new ProgrammingError( 'Cannot restrict query with alias "%s", got %s', $tableAlias, json_encode($from) ); } return $from[$tableAlias]['tableName']; } protected function gracefullySplitOnComma($string) { return preg_split('/\s*,\s*/', $string, -1, PREG_SPLIT_NO_EMPTY); } } icingaweb2-module-director-1.11.8/library/Director/Settings.php000066400000000000000000000122171516513262500244510ustar00rootroot00000000000000 'director-global', 'icinga_package_name' => 'director', 'config_format' => 'v2', 'override_services_varname' => '_override_servicevars', 'override_services_templatename' => 'host var overrides (Director)', 'disable_all_jobs' => 'n', // 'y' 'enable_audit_log' => 'n', 'deployment_mode_v1' => 'active-passive', 'deployment_path_v1' => null, 'activation_script_v1' => null, 'self-service/agent_name' => 'fqdn', 'self-service/agent_version' => 'latest', 'self-service/transform_hostname' => '0', 'self-service/resolve_parent_host' => '0', 'self-service/global_zones' => ['director-global'], 'ignore_bug7530' => 'n', 'feature_custom_endpoint' => 'n', // 'experimental_features' => null, // 'allow' // 'master_zone' => null, ]; protected $jsonEncode = [ 'self-service/global_zones', 'self-service/installer_hashes', ]; public function __construct(Db $connection) { $this->connection = $connection; $this->db = $connection->getDbAdapter(); } /** * @return Db */ public function getConnection() { return $this->connection; } /** * @return \Zend_Db_Adapter_Abstract */ public function getDb() { return $this->db; } /** * @param $key * @param null $default * @return mixed|null */ public function get($key, $default = null) { if (null === ($value = $this->getStoredValue($key, $default))) { return $this->getDefaultValue($key); } else { return $value; } } /** * @param $key * @param null $default * @return mixed|null */ public function getStoredValue($key, $default = null) { if (null === ($value = $this->getSetting($key))) { return $default; } else { if (in_array($key, $this->jsonEncode)) { $value = json_decode($value); } return $value; } } public function getDefaultValue($key) { if (array_key_exists($key, $this->defaults)) { return $this->defaults[$key]; } else { return null; } } public function getStoredOrDefaultValue($key) { $value = $this->getStoredValue($key); if ($value === null) { return $this->getDefaultValue($key); } else { return $value; } } /** * @param $name * @param $value * @return $this * @throws \Zend_Db_Adapter_Exception */ public function set($name, $value) { $db = $this->db; if ($value === null) { $db->delete( 'director_setting', $db->quoteInto('setting_name = ?', $name) ); unset($this->cache[$name]); return $this; } if (in_array($name, $this->jsonEncode)) { $value = json_encode(array_values($value)); } if ($this->getSetting($name) === $value) { return $this; } $updated = $db->update( 'director_setting', array('setting_value' => $value), $db->quoteInto('setting_name = ?', $name) ); if ($updated === 0) { $db->insert( 'director_setting', array( 'setting_name' => $name, 'setting_value' => $value, ) ); } if ($this->cache !== null) { $this->cache[$name] = $value; } return $this; } public function clearCache() { $this->cache = null; return $this; } protected function getSetting($name, $default = null) { if ($this->cache === null) { $this->refreshCache(); } if (array_key_exists($name, $this->cache)) { return $this->cache[$name]; } return $default; } protected function refreshCache() { $db = $this->db; $query = $db->select()->from( array('s' => 'director_setting'), array('setting_name', 'setting_value') ); $this->cache = (array) $db->fetchPairs($query); } /** * @param $key * @return mixed|null */ public function __get($key) { return $this->get($key); } /** * @param $key * @param $value * @throws \Zend_Db_Adapter_Exception */ public function __set($key, $value) { $this->set($key, $value); } public function __destruct() { $this->clearCache(); unset($this->db); unset($this->connection); } } icingaweb2-module-director-1.11.8/library/Director/StartupLogRenderer.php000066400000000000000000000104361516513262500264450ustar00rootroot00000000000000deployment = $deployment; } public function render() { $deployment = $this->deployment; $log = Html::escape($deployment->get('startup_log') ?? ''); $lines = array(); $severity = 'information'; $sevPattern = '/^(debug|notice|information|warning|critical)\/(\w+)/'; $settings = new Settings($this->deployment->getConnection()); $package = $settings->get('icinga_package_name'); $pathPattern = '~(/[\w/]+/api/packages/' . $package . '/[^/]+/)'; $filePatternHint = $pathPattern . '([^:]+\.conf)(: (\d+))~'; $filePatternDetail = $pathPattern . '([^:]+\.conf)(\((\d+)\))~'; $markPattern = null; // len [stage] + 1 $markReplace = ' ^'; /** @var string[] $logLines */ $logLines = preg_split('/\n/', $log); foreach ($logLines as $line) { if (preg_match('/^\[([\d\s\:\+\-]+)\]\s/', $line, $m)) { $time = $m[1]; // TODO: we might use new DateTime($time) and show a special "timeAgo" // format - but for now this should suffice. $line = substr($line, strpos($line, ']') + 2); } else { $time = null; } if (preg_match($sevPattern, $line, $m)) { $severity = $m[1]; $line = preg_replace( $sevPattern, '\1/\2', $line ); } if ($markPattern !== null) { $line = preg_replace($markPattern, $markReplace, $line); } $line = preg_replace('/([\^]{2,})/', '\1', $line); $markPattern = null; $self = $this; if (preg_match($filePatternHint, $line, $m)) { $line = preg_replace_callback( $filePatternHint, function ($matches) use ($severity, $self) { return $self->logLink($matches, $severity); }, $line ); $line = preg_replace('/\(in/', "\n (in", $line); $line = preg_replace('/\), new declaration/', "),\n new declaration", $line); } elseif (preg_match($filePatternDetail, $line, $m)) { $markIndent = strlen($m[1]); $markPattern = '/\s{' . $markIndent . '}\^/'; $line = preg_replace_callback( $filePatternDetail, function ($matches) use ($severity, $self) { return $self->logLink($matches, $severity); }, $line ); } if ($time === null) { $lines[] = $line; } else { $lines[] = "[$time] $line"; } } return implode("\n", $lines); } protected function logLink($match, $severity) { $stageDir = $match[1]; $filename = $match[2]; $suffix = $match[3]; if (preg_match('/(\d+).*/', $suffix, $m)) { $lineNumber = $m[1]; } else { $lineNumber = null; } $deployment = $this->deployment; $params = array( 'config_checksum' => $deployment->getConfigHexChecksum(), 'deployment_id' => $deployment->get('id'), 'file_path' => $filename, 'backTo' => 'deployment' ); if ($lineNumber !== null) { $params['highlight'] = $lineNumber; $params['highlightSeverity'] = $severity; } return Link::create( '[stage]/' . $filename, 'director/config/file', $params, [ 'title' => $stageDir . $filename ] ) . $suffix; } } icingaweb2-module-director-1.11.8/library/Director/Test/000077500000000000000000000000001516513262500230545ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Test/BaseTestCase.php000066400000000000000000000074201516513262500260760ustar00rootroot00000000000000hasDb()) { return false; } $this->markTestSkipped('Test db resource has not been configured'); return true; } protected function hasDb() { return $this->getDbResourceName() !== null; } protected static function getDbResourceName() { if (array_key_exists('DIRECTOR_TESTDB_RES', $_SERVER)) { return $_SERVER['DIRECTOR_TESTDB_RES']; } else { return Config::module('director')->get('testing', 'db_resource'); } } /** * @return Db * @throws ConfigurationError */ protected static function getDb() { if (self::$db === null) { $resourceName = self::getDbResourceName(); if (! $resourceName) { throw new ConfigurationError( 'Could not run DB-based tests, please configure a testing db resource' ); } $dbConfig = ResourceFactory::getResourceConfig($resourceName); if (array_key_exists('DIRECTOR_TESTDB', $_SERVER)) { $dbConfig->dbname = $_SERVER['DIRECTOR_TESTDB']; } if (array_key_exists('DIRECTOR_TESTDB_HOST', $_SERVER)) { $dbConfig->host = $_SERVER['DIRECTOR_TESTDB_HOST']; } if (array_key_exists('DIRECTOR_TESTDB_PORT', $_SERVER)) { $dbConfig->port = $_SERVER['DIRECTOR_TESTDB_PORT']; } if (array_key_exists('DIRECTOR_TESTDB_USER', $_SERVER)) { $dbConfig->username = $_SERVER['DIRECTOR_TESTDB_USER']; } if (array_key_exists('DIRECTOR_TESTDB_PASSWORD', $_SERVER)) { $dbConfig->password = $_SERVER['DIRECTOR_TESTDB_PASSWORD']; } self::$db = new Db($dbConfig); $migrations = new Migrations(self::$db); $migrations->applyPendingMigrations(); $zone = IcingaZone::create([ 'object_name' => 'director-global', 'object_type' => 'external_object', 'is_global' => 'y' ]); if (! IcingaZone::exists($zone->getId(), self::$db)) { $zone->store(self::$db); } } return self::$db; } protected function newObject($type, $name, $properties = array()) { if (! array_key_exists('object_type', $properties)) { $properties['object_type'] = 'object'; } $properties['object_name'] = $name; return IcingaObject::createByType($type, $properties, $this->getDb()); } protected function app() { if (self::$app === null) { self::$app = Icinga::app(); } return self::$app; } /** * Call a protected function for a class during testing * * @param $obj * @param $name * @param array $args * * @return mixed * @throws \ReflectionException */ public static function callMethod($obj, $name, array $args) { $class = new \ReflectionClass($obj); $method = $class->getMethod($name); $method->setAccessible(true); return $method->invokeArgs($obj, $args); } } icingaweb2-module-director-1.11.8/library/Director/Test/Bootstrap.php000066400000000000000000000013131516513262500255400ustar00rootroot00000000000000getModuleManager() ->loadModule('director', $basedir); } } icingaweb2-module-director-1.11.8/library/Director/Test/IcingaObjectTestCase.php000066400000000000000000000044601516513262500275460ustar00rootroot00000000000000table; } $properties['object_name'] = '___TEST___' . $type . '_' . $object_name; $obj = IcingaObject::createByType($type, $properties, $this->getDb()); if ($storeIt === true) { $obj->store(); $this->prepareObjectTearDown($obj); } return $obj; } /** * Helper method for loading an object * * @param string $name * @param null $type * @return IcingaObject */ protected function loadObject($name, $type = null) { if ($type === null) { $type = $this->table; } $realName = '___TEST___' . $type . '_' . $name; return IcingaObject::loadByType($type, $realName, $this->getDb()); } /** * Store the object in a list for deletion on tearDown() * * @param IcingaObject $object * * @return $this */ protected function prepareObjectTearDown(IcingaObject $object) { $this->assertTrue($object->hasBeenLoadedFromDb()); $this->createdObjects[] = $object; return $this; } /** * @inheritdoc */ public function tearDown(): void { if ($this->hasDb()) { /** @var IcingaObject $object */ foreach (array_reverse($this->createdObjects) as $object) { $object->delete(); } if ($this->subject !== null) { $this->subject->delete(); } } parent::tearDown(); } } icingaweb2-module-director-1.11.8/library/Director/Test/ImportSourceDummy.php000066400000000000000000000017361516513262500272430ustar00rootroot00000000000000source = ImportSource::create(array( 'source_name' => 'testimport', 'provider_class' => 'Icinga\\Module\\Director\\Test\\ImportSourceDummy', 'key_column' => $this->keyColumn, )); $this->source->store($this->getDb()); $this->rule = SyncRule::create(array( 'rule_name' => 'testrule', 'object_type' => $this->objectType, 'update_policy' => 'merge', 'purge_existing' => 'n' )); $this->rule->store($this->getDb()); $this->sync = new Sync($this->rule); } public function tearDown(): void { // properties should be deleted automatically if ($this->rule !== null && $this->rule->hasBeenLoadedFromDb()) { $this->rule->delete(); } if ($this->source !== null && $this->source->hasBeenLoadedFromDb()) { $this->source->delete(); } // find objects created by this class and delete them $db = $this->getDb(); $dummy = IcingaObject::createByType($this->objectType, array(), $db); $query = $db->getDbAdapter()->select() ->from($dummy->getTableName()) ->where('object_name LIKE ?', 'SYNCTEST_%'); /** @var IcingaObject $object */ foreach (IcingaObject::loadAllByType($this->objectType, $db, $query) as $object) { $object->delete(); } // make sure cache is clean for other tests PrefetchCache::forget(); DbObject::clearAllPrefetchCaches(); parent::tearDown(); } /** * @param array $rows * * @throws IcingaException */ protected function runImport($rows) { ImportSourceDummy::setRows($rows); $this->source->runImport(); if ($this->source->get('import_state') !== 'in-sync') { throw new IcingaException('Import failed: %s', $this->source->get('last_error_message')); } } protected function setUpProperty($properties = array()) { $properties = array_merge(array( 'rule_id' => $this->rule->id, 'source_id' => $this->source->id, 'merge_policy' => 'override', ), $properties); $this->properties[] = $property = SyncProperty::create($properties); $property->store($this->getDb()); } } icingaweb2-module-director-1.11.8/library/Director/Test/TestProcess.php000066400000000000000000000043511516513262500260460ustar00rootroot00000000000000command = $command; $this->identifier = $identifier; } public function getIdentifier() { return $this->identifier; } public function expectExitCode($code) { $this->expectedExitCode = $code; return $this; } public function onSuccess($func) { $this->onSuccess = $this->makeClosure($func); return $this; } public function onFailure($func) { $this->onSuccess = $this->makeClosure($func); return $this; } protected function makeClosure($func) { if ($func instanceof Closure) { return $func; } if (is_array($func)) { return function ($process) use ($func) { return $func[0]->{$func[1]}($process); }; } } public function onFailureThrow($message, $class = 'Exception') { return $this->onFailure(function () use ($message, $class) { throw new $class($message); }); } public function run() { exec($this->command, $this->output, $this->exitCode); if ($this->succeeded()) { $this->triggerSuccess(); } else { $this->triggerFailure(); } } public function succeeded() { return $this->exitCode === $this->expectedExitCode; } public function failed() { return $this->exitCode !== $this->expectedExitCode; } protected function triggerSuccess() { if (($func = $this->onSuccess) !== null) { $func($this); } } protected function triggerFailure() { if (($func = $this->onFailure) !== null) { $func($this); } } public function getExitCode() { return $this->exitCode; } public function getOutput() { return implode("\n", $this->output) . "\n"; } } icingaweb2-module-director-1.11.8/library/Director/Test/TestSuite.php000066400000000000000000000030641516513262500255210ustar00rootroot00000000000000getBaseDir() . '/' . $base; $dir = new RecursiveDirectoryIterator($basedir); $iterator = new RecursiveIteratorIterator( $dir, RecursiveIteratorIterator::SELF_FIRST ); foreach ($iterator as $file) { if (! $file->isFile()) { continue; } if (in_array($file->getExtension(), $extensions)) { $files[] = $file->getPathname(); } } return $files; } public function getBaseDir($file = null) { if ($this->basedir === null) { $this->basedir = Icinga::app() ->getModuleManager() ->getModule('director') ->getBaseDir(); } if ($file === null) { return $this->basedir; } else { return $this->basedir . '/' . $file; } } } icingaweb2-module-director-1.11.8/library/Director/Test/TestSuiteLint.php000066400000000000000000000024201516513262500263430ustar00rootroot00000000000000checked = $this->failed = array(); foreach ($this->listFiles() as $file) { $checked[] = $file; $cmd = "php -l '$file'"; $this->result[$file] = $this ->process($cmd, $file) ->onFailure(array($this, 'failedCheck')) ->run(); } } public function failedCheck($process) { Logger::error($process->getOutput()); $this->failed[] = $process->getIdentifier(); } public function hasFailures() { return ! empty($this->failed); } protected function listFiles() { $basedir = $this->getBaseDir(); $files = array( $basedir . '/run.php', $basedir . '/configuration.php' ); foreach ($this->filesByExtension('library/Director', 'php') as $file) { $files[] = $file; } foreach ($this->filesByExtension('application', array('php', 'phtml')) as $file) { $files[] = $file; } return $files; } } icingaweb2-module-director-1.11.8/library/Director/Test/TestSuiteStyle.php000066400000000000000000000031401516513262500265350ustar00rootroot00000000000000isVerbose) { $options[] = '-v'; } */ /* $phpcs = exec('which phpcs'); if (!file_exists($phpcs)) { $this->fail( 'PHP_CodeSniffer not found. Please install PHP_CodeSniffer to be able to run code style tests.' ); } */ $cmd = sprintf( "phpcs -p --standard=PSR2 --extensions=php --encoding=utf-8 -w -s --report-checkstyle=%s '%s'", $out, implode("' '", $check) ); $proc = $this ->process($cmd); // ->onFailure(array($this, 'failedCheck')) $proc->run(); echo $proc->getOutput(); echo file_get_contents($out); unlink($out); // /usr/bin/phpcs --standard=PSR2 --extensions=php --encoding=utf-8 application/ // library/Director/ --report=full /* $options[] = '--log-junit'; $options[] = $reportPath . '/phpunit_results.xml'; $options[] = '--coverage-html'; $options[] = $reportPath . '/php_html_coverage'; */ return; `$cmd`; echo $cmd . "\n"; echo $out . "\n"; echo file_get_contents($out); unlink($out); } } icingaweb2-module-director-1.11.8/library/Director/Test/TestSuiteUnit.php000066400000000000000000000010501516513262500263520ustar00rootroot00000000000000testdoxFile = $this->newTempfile(); } public function __destruct() { if ($this->testdoxFile && file_exists($this->testdoxFile)) { unlink($this->testdoxFile); } } public function getPhpunitCommand() { // return phpunit --bootstrap test/bootstrap.php --testdox-text /tmp/testdox.txt . } } icingaweb2-module-director-1.11.8/library/Director/Test/Web/000077500000000000000000000000001516513262500235715ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Test/Web/Form/000077500000000000000000000000001516513262500244745ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Test/Web/Form/TestDirectorObjectForm.php000066400000000000000000000005641516513262500316000ustar00rootroot00000000000000setAction('director/test/url'); return $this; } public function regenerateCsrfToken() { return $this; } } icingaweb2-module-director-1.11.8/library/Director/TranslationDummy.php000066400000000000000000000006361516513262500261650ustar00rootroot00000000000000translate('Host'); $this->translate('Service'); $this->translate('Zone'); $this->translate('Command'); $this->translate('User'); $this->translate('Notification'); } } icingaweb2-module-director-1.11.8/library/Director/Util.php000066400000000000000000000126471516513262500235750ustar00rootroot00000000000000hasPermission($name); } public static function getRestrictions($name) { return self::auth()->getRestrictions($name); } public static function resourceIsAllowed($name) { if (self::$allowedResources === null) { $restrictions = self::getRestrictions('director/resources/use'); $list = array(); foreach ($restrictions as $restriction) { foreach (preg_split('/\s*,\s*/', $restriction, -1, PREG_SPLIT_NO_EMPTY) as $key) { $list[$key] = $key; } } self::$allowedResources = $list; } else { $list = self::$allowedResources; } if (empty($list) || array_key_exists($name, $list)) { return true; } return false; } public static function enumDbResources() { return self::enumResources('db'); } public static function enumLdapResources() { return self::enumResources('ldap'); } protected static function enumResources($type) { $resources = array(); foreach (ResourceFactory::getResourceConfigs() as $name => $resource) { if ($resource->get('type') === $type && self::resourceIsAllowed($name)) { $resources[$name] = $name; } } return $resources; } public static function addDbResourceFormElement(QuickForm $form, $name) { static::addResourceFormElement($form, $name, 'db'); } public static function addLdapResourceFormElement(QuickForm $form, $name) { static::addResourceFormElement($form, $name, 'ldap'); } protected static function addResourceFormElement(QuickForm $form, $name, $type) { $list = self::enumResources($type); $form->addElement('select', $name, array( 'label' => 'Resource name', 'multiOptions' => $form->optionalEnum($list), 'required' => true, )); if (empty($list)) { if (self::hasPermission('config/application/resources')) { $form->addHtmlHint(Html::sprintf( $form->translate('Please click %s to create new resources'), Link::create( $form->translate('here'), 'config/resource', null, ['data-base-target' => '_main'] ) )); $msg = sprintf($form->translate('No %s resource available'), $type); } else { $msg = $form->translate('Please ask an administrator to grant you access to resources'); } $form->getElement($name)->addError($msg); } } } icingaweb2-module-director-1.11.8/library/Director/Web/000077500000000000000000000000001516513262500226525ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/ActionBar/000077500000000000000000000000001516513262500245145ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/ActionBar/AutomationObjectActionBar.php000066400000000000000000000033261516513262500322630ustar00rootroot00000000000000request = $request; } protected function assemble() { $request = $this->request; $action = $request->getActionName(); $controller = $request->getControllerName(); $params = ['id' => $request->getParam('id')]; $links = [ 'index' => Link::create( $this->translate('Overview'), "director/$controller", $params, ['class' => 'icon-info'] ), 'edit' => Link::create( $this->translate('Modify'), "director/$controller/edit", $params, ['class' => 'icon-edit'] ), 'clone' => Link::create( $this->translate('Clone'), "director/$controller/clone", $params, ['class' => 'icon-paste'] ), /* // TODO: enable once handled in the controller 'export' => Link::create( $this->translate('Download JSON'), $this->request->getUrl()->with('format', 'json'), null, [ 'data-base-target' => '_blank', ] ) */ ]; unset($links[$action]); $this->add($links); } } icingaweb2-module-director-1.11.8/library/Director/Web/ActionBar/ChoicesActionBar.php000066400000000000000000000012561516513262500303710ustar00rootroot00000000000000type; $this->add( $this->getBackToDashboardLink() )->add( Link::create( $this->translate('Add'), "director/templatechoice/$type", ['type' => 'object'], [ 'title' => $this->translate('Create a new template choice'), 'class' => 'icon-plus', 'data-base-target' => '_next' ] ) ); } } icingaweb2-module-director-1.11.8/library/Director/Web/ActionBar/DirectorBaseActionBar.php000066400000000000000000000030001516513262500313470ustar00rootroot00000000000000type = $type; $this->url = $url; } protected function getBackToDashboardLink() { $name = $this->getPluralBaseType(); if (! Dashboard::exists($name)) { return null; } return Link::create( $this->translate('back'), 'director/dashboard', ['name' => $name], [ 'title' => sprintf( $this->translate('Go back to "%s" Dashboard'), $this->translate(ucfirst($this->type)) ), 'class' => 'icon-left-big', 'data-base-target' => '_main' ] ); } protected function getBaseType() { if (substr($this->type, -5) === 'Group') { return substr($this->type, 0, -5); } else { return $this->type; } } protected function getPluralType() { return $this->type . 's'; } protected function getPluralBaseType() { return $this->getBaseType() . 's'; } } icingaweb2-module-director-1.11.8/library/Director/Web/ActionBar/ObjectsActionBar.php000066400000000000000000000012321516513262500303770ustar00rootroot00000000000000type; $this->add( $this->getBackToDashboardLink() )->add( Link::create( $this->translate('Add'), "director/$type/add", ['type' => 'object'], [ 'title' => $this->translate('Create a new object'), 'class' => 'icon-plus', 'data-base-target' => '_next' ] ) ); } } icingaweb2-module-director-1.11.8/library/Director/Web/ActionBar/TemplateActionBar.php000066400000000000000000000025671516513262500305750ustar00rootroot00000000000000type); $plType = preg_replace('/cys$/', 'cies', $type . 's'); $renderTree = $this->url->getParam('render') === 'tree'; $renderParams = $renderTree ? null : ['render' => 'tree']; $this->add( $this->getBackToDashboardLink() )->add( Link::create( $this->translate('Add'), "director/$type/add", ['type' => 'template'], [ 'title' => $this->translate('Create a new Template'), 'class' => 'icon-plus', 'data-base-target' => '_next' ] ) )->add( Link::create( $renderTree ? $this->translate('Table') : $this->translate('Tree'), "director/$plType/templates", $renderParams, [ 'class' => 'icon-' . ($renderTree ? 'doc-text' : 'sitemap'), 'title' => $renderTree ? $this->translate('Switch to Tree view') : $this->translate('Switch to Table view') ] ) ); } } icingaweb2-module-director-1.11.8/library/Director/Web/Controller/000077500000000000000000000000001516513262500247755ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Controller/ActionController.php000066400000000000000000000166271516513262500310030ustar00rootroot00000000000000getRequest()->isApiRequest() && $this->Config()->get('frontend', 'disabled', 'no') === 'yes' ) { throw new NotFoundError('Not found'); } $this->initializeTranslator(); Benchmark::measure('Director base Controller init()'); $this->checkForRestApiRequest(); $this->checkDirectorPermissions(); $this->checkSpecialDirectorPermissions(); } protected function initializeTranslator() { StaticTranslator::set(new Translator('director')); } public function getAuth() { return $this->Auth(); } /** * @codingStandardsIgnoreStart * @return Window */ public function Window() { // @codingStandardsIgnoreEnd if ($this->window === null) { $this->window = new Window( $this->_request->getHeader('X-Icinga-WindowId', Window::UNDEFINED) ); } return $this->window; } /** * @throws SecurityException */ protected function checkDirectorPermissions() { $this->assertPermission('director/admin'); } /** * @throws SecurityException */ protected function checkSpecialDirectorPermissions() { if ($this->params->get('format') === 'sql') { $this->assertPermission('director/showsql'); } } /** * Assert that the current user has one of the given permission * * @param array $permissions Permission name list * * @return $this * @throws SecurityException If the current user lacks the given permission */ protected function assertOneOfPermissions($permissions) { $auth = $this->Auth(); foreach ($permissions as $permission) { if ($auth->hasPermission($permission)) { return $this; } } throw new SecurityException( 'Got none of the following permissions: %s', implode(', ', $permissions) ); } /** * @param int $interval * @return $this */ public function setAutorefreshInterval($interval) { if (! $this->getRequest()->isApiRequest()) { try { parent::setAutorefreshInterval($interval); } catch (ProgrammingError $e) { throw new InvalidArgumentException($e->getMessage()); } } return $this; } /** * @return ServerRequestInterface */ protected function getServerRequest() { return ServerRequest::fromGlobals(); } protected function applyPaginationLimits(Paginatable $paginatable, $limit = 25, $offset = null) { $limit = $this->params->get('limit', $limit); $page = $this->params->get('page', $offset); $paginatable->limit($limit, $page > 0 ? ($page - 1) * $limit : 0); return $paginatable; } protected function addAddLink($title, $url, $urlParams = null, $target = '_next') { $this->actions()->add(Link::create( $this->translate('Add'), $url, $urlParams, [ 'class' => 'icon-plus', 'title' => $title, 'data-base-target' => $target ] )); return $this; } protected function addBackLink($url, $urlParams = null) { $this->actions()->add(new Link( $this->translate('back'), $url, $urlParams, ['class' => 'icon-left-big'] )); return $this; } protected function sendUnsupportedMethod() { $method = strtoupper($this->getRequest()->getMethod()) ; $response = $this->getResponse(); $this->sendJsonError($response, sprintf( 'Method %s is not supported', $method ), 422); // TODO: check response code } /** * @param string $permission * @return $this * @throws SecurityException */ public function assertPermission($permission) { parent::assertPermission($permission); return $this; } public function postDispatch() { Benchmark::measure('Director postDispatch'); if ($this->view->content || $this->view->controls) { $viewRenderer = new SimpleViewRenderer(); $viewRenderer->replaceZendViewRenderer(); $this->view = $viewRenderer->view; // Hint -> $this->view->compact is the only way since v2.8.0 if ($this->view->compact || $this->getOriginalUrl()->getParam('view') === 'compact') { if ($this->view->controls) { $this->controls()->getAttributes()->add('class', 'compact'); } } } else { $viewRenderer = null; } $cType = $this->getResponse()->getHeader('Content-Type', true); if ($this->getRequest()->isApiRequest() || ($cType !== null && $cType !== 'text/html')) { $this->_helper->layout()->disableLayout(); if ($viewRenderer) { $viewRenderer->disable(); } else { $this->_helper->viewRenderer->setNoRender(true); } } parent::postDispatch(); // TODO: Change the autogenerated stub } /** * @return BackendInterface */ protected function backend(): BackendInterface { if ($this->backend === null) { if (Module::exists('icingadb') && IcingadbSupport::useIcingaDbAsBackend()) { $this->backend = new IcingadbBackend(); } else { $this->backend = new Monitoring($this->getAuth()); } } return $this->backend; } } icingaweb2-module-director-1.11.8/library/Director/Web/Controller/BranchHelper.php000066400000000000000000000050261516513262500300460ustar00rootroot00000000000000getBranch()->getUuid(); } /** * @return Branch */ protected function getBranch(): Branch { if ($this->branch === null) { /** @var ActionController $this */ $this->branch = Branch::forRequest($this->getRequest(), $this->getBranchStore(), $this->Auth()); } return $this->branch; } /** * @return BranchStore */ protected function getBranchStore(): BranchStore { if ($this->branchStore === null) { $this->branchStore = new BranchStore($this->db()); } return $this->branchStore; } /** * @return bool */ protected function hasBranch(): bool { return $this->getBranchUuid() !== null; } protected function enableStaticObjectLoader($table): void { if (BranchSupport::existsForTableName($table)) { IcingaObject::setDbObjectStore(new DbObjectStore($this->db(), $this->getBranch())); } } /** * @param string $subject * @return bool */ protected function showNotInBranch($subject): bool { if ($this->getBranch()->isBranch()) { $this->content()->add(new NotInBranchedHint($subject, $this->getBranch(), $this->Auth())); return true; } return false; } protected function hasPreferredBranch(): bool { if ($this->hasPreferredBranch === null) { $implementation = Branch::optionalHook(); if ($implementation instanceof PreferredBranchSupport) { $this->hasPreferredBranch = $implementation->hasPreferredBranch($this->Auth()); } else { $this->hasPreferredBranch = false; } } return $this->hasPreferredBranch; } } icingaweb2-module-director-1.11.8/library/Director/Web/Controller/Extension/000077500000000000000000000000001516513262500267515ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Controller/Extension/CoreApi.php000066400000000000000000000020171516513262500310040ustar00rootroot00000000000000api === null) { if ($this->db()->hasDeploymentEndpoint()) { $endpoint = $this->db()->getDeploymentEndpoint(); $this->api = $endpoint->api(); } } return $this->api; } /** * @param string $endpointName * @return Api */ public function api($endpointName = null) { if ($this->api === null) { if ($endpointName === null) { $endpoint = $this->db()->getDeploymentEndpoint(); } else { $endpoint = IcingaEndpoint::load($endpointName, $this->db()); } $this->api = $endpoint->api(); } return $this->api; } } icingaweb2-module-director-1.11.8/library/Director/Web/Controller/Extension/DirectorDb.php000066400000000000000000000110721516513262500315040ustar00rootroot00000000000000getDbResourceNameFromRequest()) { return $name; } elseif ($name = $this->getPreferredDbResourceName()) { return $name; } else { return $this->getFirstDbResourceName(); } } protected function getDbResourceNameFromRequest() { $param = 'dbResourceName'; // We shouldn't access _POST and _GET. However, this trait is used // in various places - and our Request is going to be replaced anyways. // So, let's not over-engineer things, this is quick & dirty: if (isset($_POST[$param])) { $name = $_POST[$param]; } elseif (isset($_GET[$param])) { $name = $_GET[$param]; } else { return null; } if (in_array($name, $this->listAllowedDbResourceNames())) { return $name; } else { return null; } } protected function getPreferredDbResourceName() { return $this->getWindowSessionValue('db_resource'); } protected function getFirstDbResourceName() { $names = $this->listAllowedDbResourceNames(); if (empty($names)) { return null; } else { return array_shift($names); } } protected function listAllowedDbResourceNames() { /** @var \Icinga\Authentication\Auth $auth */ $auth = $this->Auth(); $available = $this->listAvailableDbResourceNames(); if ($resourceNames = $auth->getRestrictions(Restriction::DB_RESOURCE)) { $names = []; foreach ($resourceNames as $rNames) { foreach ($this->splitList($rNames) as $name) { if (array_key_exists($name, $available)) { $names[] = $name; } } } return $names; } else { return $available; } } /** * @param string $string * @return array */ protected function splitList($string) { return preg_split('/\s*,\s*/', $string, -1, PREG_SPLIT_NO_EMPTY); } protected function isMultiDbSetup() { return count($this->listAvailableDbResourceNames()) > 1; } /** * @return array */ protected function listAvailableDbResourceNames() { /** @var \Icinga\Application\Config $config */ $config = $this->Config(); $resources = $config->get('db', 'resources'); if ($resources === null) { $resource = $config->get('db', 'resource'); if ($resource === null) { return []; } else { return [$resource => $resource]; } } else { $resources = $this->splitList($resources); $resources = array_combine($resources, $resources); // natsort doesn't work!? ksort($resources, SORT_NATURAL); if ($resource = $config->get('db', 'resource')) { unset($resources[$resource]); $resources = [$resource => $resource] + $resources; } return $resources; } } protected function getWindowSessionValue($value, $default = null) { /** @var Window $window */ $window = $this->Window(); /** @var \Icinga\Web\Session\SessionNamespace $session */ $session = $window->getSessionNamespace('director'); return $session->get($value, $default); } /** * * @return Db */ public function db() { if ($this->db === null) { $resourceName = $this->getDbResourceName(); if ($resourceName) { $this->db = Db::fromResourceName($resourceName); } elseif ($this instanceof ActionController) { if ($this->getRequest()->isApiRequest()) { throw new RuntimeException('Icinga Director is not correctly configured'); } else { $this->redirectNow('director'); } } else { throw new RuntimeException('Icinga Director is not correctly configured'); } } return $this->db; } } icingaweb2-module-director-1.11.8/library/Director/Web/Controller/Extension/ObjectRestrictions.php000066400000000000000000000036261516513262500333100ustar00rootroot00000000000000objectRestrictions === null) { $this->objectRestrictions = $this->loadObjectRestrictions($this->db(), $this->Auth()); } return $this->objectRestrictions; } /** * @return ObjectRestriction[] */ protected function loadObjectRestrictions(Db $db, Auth $auth) { $objectType = $this->dummyRestrictedObject->getShortTableName(); if ( ($objectType === 'service' && $this->dummyRestrictedObject->isApplyRule()) || $objectType === 'notification' || $objectType === 'service_set' || $objectType === 'scheduled_downtime' ) { if ($objectType === 'scheduled_downtime') { $objectType = 'scheduled-downtime'; } return [new FilterByNameRestriction($db, $auth, $objectType)]; } // If the object is host or host group load HostgroupRestriction return [new HostgroupRestriction($db, $auth)]; } public function allowsObject(IcingaObject $object) { $this->dummyRestrictedObject = $object; foreach ($this->getObjectRestrictions() as $restriction) { if (! $restriction->allows($object)) { return false; } } return true; } } icingaweb2-module-director-1.11.8/library/Director/Web/Controller/Extension/RestApi.php000066400000000000000000000057621516513262500310430ustar00rootroot00000000000000isApified; } else { return false; } } /** * @return bool */ protected function sendNotFoundForRestApi() { /** @var \Icinga\Web\Request $request */ $request = $this->getRequest(); if ($request->isApiRequest()) { $this->sendJsonError($this->getResponse(), 'Not found', 404); return true; } else { return false; } } /** * @return bool */ protected function sendNotFoundUnlessRestApi() { /** @var \Icinga\Web\Request $request */ $request = $this->getRequest(); if ($request->isApiRequest()) { return false; } else { $this->sendJsonError($this->getResponse(), 'Not found', 404); return true; } } /** * @throws AuthenticationException */ protected function assertApiPermission() { if (! $this->hasPermission(Permission::API)) { throw new AuthenticationException('You are not allowed to access this API'); } } /** * @throws AuthenticationException * @throws NotFoundError */ protected function checkForRestApiRequest() { /** @var \Icinga\Web\Request $request */ $request = $this->getRequest(); if ($request->isApiRequest()) { $this->assertApiPermission(); if (! $this->isApified()) { throw new NotFoundError('No such API endpoint found'); } } } /** * @param Response $response * @param $object */ protected function sendJson(Response $response, $object) { $response->setHeader('Content-Type', 'application/json', true); echo json_encode($object, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n"; } /** * @param Response $response * @param string $message * @param int|null $code */ protected function sendJsonError(Response $response, $message, $code = null) { if ($code !== null) { try { $response->setHttpResponseCode((int) $code); } catch (Zend_Controller_Response_Exception $e) { throw new InvalidArgumentException($e->getMessage(), 0, $e); } } $this->sendJson($response, (object) ['error' => $message]); } /** * @return string */ protected function getLastJsonError() { return JsonException::getJsonErrorMessage(json_last_error()); } } icingaweb2-module-director-1.11.8/library/Director/Web/Controller/ObjectController.php000066400000000000000000000575631516513262500310000ustar00rootroot00000000000000enableStaticObjectLoader($this->getTableName()); if (! $this->getRequest()->isApiRequest()) { $this->loadOptionalObject(); } parent::init(); if ($this->getRequest()->isApiRequest()) { $this->initializeRestApi(); } else { $this->initializeWebRequest(); } } protected function initializeRestApi() { $handler = new IcingaObjectHandler($this->getRequest(), $this->getResponse(), $this->db()); try { $this->loadOptionalObject(); } catch (NotFoundError $e) { // Silently ignore the error, the handler will complain $handler->sendJsonError($e, 404); // TODO: nice shutdown exit; } $handler->setApi($this->api()); if ($this->object) { $handler->setObject($this->object); } $handler->dispatch(); // Hint: also here, hard exit. There is too much magic going on. // Letting this bubble up smoothly would be "correct", but proved // to be too fragile. Web 2, all kinds of pre/postDispatch magic, // different view renderers - hard exit is the only safe bet right // now. exit; } protected function initializeWebRequest() { if ($this->getRequest()->getActionName() === 'add') { $this->addSingleTab( sprintf($this->translate('Add %s'), ucfirst($this->getType())), null, 'add' ); } else { $this->tabs(new ObjectTabs( $this->getRequest()->getControllerName(), $this->getAuth(), $this->object )); } if ($this->object !== null) { $this->addDeploymentLink(); } } /** * @throws NotFoundError */ public function indexAction() { if (! $this->getRequest()->isApiRequest()) { $this->redirectToPreviewForExternals() ->editAction(); } } public function addAction() { $this->tabs()->activate('add'); $url = sprintf('director/%ss', $this->getPluralType()); $imports = $this->params->get('imports'); $form = $this->loadObjectForm() ->presetImports($imports) ->setSuccessUrl($url); if ($oType = $this->params->get('type', 'object')) { $form->setPreferredObjectType($oType); } if ($oType === 'template') { if ($this->showNotInBranch($this->translate('Creating Templates'))) { $this->addTitle($this->translate('Create a new Template')); return; } $this->addTemplate(); } else { $this->addObject(); } $branch = $this->getBranch(); if (! $this->getRequest()->isApiRequest()) { $hasPreferred = $this->hasPreferredBranch(); if ($branch->isBranch() || $hasPreferred) { $this->content()->add(new BranchedObjectHint($branch, $this->Auth(), null, $hasPreferred)); } } $form->handleRequest(); $this->content()->add($form); } /** * @throws NotFoundError */ public function editAction() { $object = $this->requireObject(); $this->tabs()->activate('modify'); $this->addObjectTitle(); // Hint: Service Sets are 'templates' (as long as not being assigned to a host if ( $this->getTableName() !== 'icinga_service_set' && $object->isTemplate() && $this->showNotInBranch($this->translate('Modifying Templates')) ) { return; } if ($object->isApplyRule() && $this->showNotInBranch($this->translate('Modifying Apply Rules'))) { return; } $this->addObjectForm($object) ->addActionClone() ->addActionUsage() ->addActionBasket(); } /** * @throws NotFoundError * @throws \Icinga\Security\SecurityException */ public function renderAction() { $this->assertTypePermission() ->assertPermission('director/showconfig'); $this->tabs()->activate('render'); $preview = new ObjectPreview($this->requireObject(), $this->getRequest()); if ($this->object->isExternal()) { $this->addActionClone(); } $this->addActionBasket(); $preview->renderTo($this); } /** * @throws NotFoundError */ public function cloneAction() { $this->assertTypePermission(); $object = $this->requireObject(); $this->addTitle($this->translate('Clone: %s'), $object->getObjectName()) ->addBackToObjectLink(); if (! $object instanceof IcingaServiceSet) { if ($object->isTemplate() && $this->showNotInBranch($this->translate('Cloning Templates'))) { return; } if ($object->isTemplate() && $this->showNotInBranch($this->translate('Cloning Apply Rules'))) { return; } } $form = IcingaCloneObjectForm::load() ->setBranch($this->getBranch()) ->setObject($object) ->setObjectBaseUrl($this->getObjectBaseUrl()) ->handleRequest(); if ($object->isExternal()) { $this->tabs()->activate('render'); } else { $this->tabs()->activate('modify'); } $this->content()->add($form); } /** * @throws NotFoundError * @throws \Icinga\Security\SecurityException */ public function fieldsAction() { $this->assertPermission('director/admin'); $object = $this->requireObject(); $type = $this->getType(); $this->addTitle( $this->translate('Custom fields: %s'), $object->getObjectName() ); $this->tabs()->activate('fields'); if ($this->showNotInBranch($this->translate('Managing Fields'))) { return; } try { $this->addFieldsFormAndTable($object, $type); } catch (NestingError $e) { $this->content()->add(Hint::error($e->getMessage())); } } protected function addFieldsFormAndTable($object, $type) { $form = IcingaObjectFieldForm::load() ->setDb($this->db()) ->setIcingaObject($object); if ($id = $this->params->get('field_id')) { $form->loadObject([ "{$type}_id" => $object->id, 'datafield_id' => $id ]); $this->actions()->add(Link::create( $this->translate('back'), $this->url()->without('field_id'), null, ['class' => 'icon-left-big'] )); } $form->handleRequest(); $this->content()->add($form); $table = new IcingaObjectDatafieldTable($object); $table->getAttributes()->set('data-base-target', '_self'); $table->renderTo($this); } /** * @throws NotFoundError * @throws \Icinga\Security\SecurityException */ public function historyAction() { $this ->assertTypePermission() ->assertPermission('director/audit') ->setAutorefreshInterval(10) ->tabs()->activate('history'); $name = $this->requireObject()->getObjectName(); $this->addTitle($this->translate('Activity Log: %s'), $name); $db = $this->db(); $objectTable = $this->object->getTableName(); $table = (new ActivityLogTable($db)) ->setLastDeployedId($db->getLastDeploymentActivityLogId()) ->filterObject($objectTable, $name); if ($host = $this->params->get('host')) { $table->filterHost($host); } $this->showOptionalBranchActivity($table); $table->renderTo($this); } /** * @throws NotFoundError */ public function membershipAction() { $object = $this->requireObject(); if (! $object instanceof IcingaObjectGroup) { throw new NotFoundError('Not Found'); } $this ->addTitle($this->translate('Group membership: %s'), $object->getObjectName()) ->setAutorefreshInterval(15) ->tabs()->activate('membership'); $type = substr($this->getType(), 0, -5); GroupMemberTable::create($type, $this->db()) ->setGroup($object) ->renderTo($this); } /** * @return $this * @throws NotFoundError */ protected function addObjectTitle() { $object = $this->requireObject(); $name = $object->getObjectName(); if ($object->isTemplate()) { $this->addTitle($this->translate('Template: %s'), $name); } else { $this->addTitle($name); } return $this; } /** * @return $this * @throws NotFoundError */ protected function addActionUsage() { $type = $this->getType(); $object = $this->requireObject(); if ($object->isTemplate() && $type !== 'serviceSet') { $this->actions()->add([ Link::create( $this->translate('Usage'), "director/{$type}template/usage", ['name' => $object->getObjectName()], ['class' => 'icon-sitemap'] ) ]); } return $this; } protected function addActionClone() { $this->actions()->add(Link::create( $this->translate('Clone'), $this->getObjectBaseUrl() . '/clone', $this->object->getUrlParams(), array('class' => 'icon-paste') )); return $this; } /** * @return $this */ protected function addActionBasket() { if ($this->hasBasketSupport()) { $object = $this->object; if ($object instanceof ExportInterface) { if ($object instanceof IcingaCommand) { if ($object->isExternal()) { $type = 'ExternalCommand'; } elseif ($object->isTemplate()) { $type = 'CommandTemplate'; } else { $type = 'Command'; } } elseif ($object instanceof IcingaServiceSet) { $type = 'ServiceSet'; } elseif ($object->isTemplate()) { $type = ucfirst($this->getType()) . 'Template'; } elseif ($object->isGroup()) { $type = ucfirst($this->getType()); } else { // Command? Sure? $type = ucfirst($this->getType()); } $this->actions()->add(Link::create( $this->translate('Add to Basket'), 'director/basket/add', [ 'type' => $type, 'names' => $object->getUniqueIdentifier() ], ['class' => 'icon-tag'] )); } } return $this; } protected function addTemplate() { $this->assertPermission('director/admin'); $this->addTitle( $this->translate('Add new Icinga %s template'), $this->getTranslatedType() ); } protected function addObject() { $this->assertTypePermission(); $imports = $this->params->get('imports'); if (is_string($imports) && strlen($imports)) { $this->addTitle( $this->translate('Add %s: %s'), $this->getTranslatedType(), $imports ); } else { $this->addTitle( $this->translate('Add new Icinga %s'), $this->getTranslatedType() ); } } protected function redirectToPreviewForExternals() { if ( $this->object && $this->object->isExternal() && ! in_array($this->object->getShortTableName(), $this->allowedExternals) ) { $this->redirectNow( $this->getRequest()->getUrl()->setPath(sprintf('director/%s/render', $this->getType())) ); } return $this; } protected function getType() { if ($this->type === null) { // Strip final 's' and upcase an eventual 'group' $this->type = preg_replace( array('/group$/', '/period$/', '/argument$/', '/apiuser$/', '/set$/'), array('Group', 'Period', 'Argument', 'ApiUser', 'Set'), $this->getRequest()->getControllerName() ); } return $this->type; } protected function getPluralType() { return $this->getType() . 's'; } protected function getTranslatedType() { return $this->translate(ucfirst($this->getType())); } protected function assertTypePermission() { $type = strtolower($this->getPluralType()); // TODO: Check getPluralType usage, fix it there. if ($type === 'scheduleddowntimes') { $type = 'scheduled-downtimes'; } return $this->assertPermission("director/$type"); } protected function loadOptionalObject() { if ($this->params->get('uuid') || null !== $this->params->get('name') || $this->params->get('id')) { $this->loadObject(); } } /** * @return ?UuidInterface * @throws InvalidPropertyException * @throws NotFoundError */ protected function getUuidFromUrl() { $key = null; if ($uuid = $this->params->get('uuid')) { $key = Uuid::fromString($uuid); } elseif ($id = $this->params->get('id')) { $key = (int) $id; } elseif (null !== ($name = $this->params->get('name'))) { $key = $name; } if ($key === null) { $request = $this->getRequest(); if ($request->isApiRequest() && $request->isGet()) { $this->getResponse()->setHttpResponseCode(422); throw new InvalidPropertyException( 'Cannot load object, missing parameters' ); } return null; } return $this->requireUuid($key); } protected function loadObject() { if ($this->object) { throw new ProgrammingError('Loading an object twice is not very efficient'); } $this->object = $this->loadSpecificObject($this->getTableName(), $this->getUuidFromUrl(), true); } protected function loadSpecificObject($tableName, $key, $showHint = false) { $branch = $this->getBranch(); $branchedObject = BranchedObject::load($this->db(), $tableName, $key, $branch); $object = $branchedObject->getBranchedDbObject($this->db()); assert($object instanceof IcingaObject); $object->setBeingLoadedFromDb(); if (! $this->allowsObject($object)) { throw new NotFoundError('No such object available'); } if ($showHint) { $hasPreferredBranch = $this->hasPreferredBranch(); if ( ($hasPreferredBranch || $branch->isBranch()) && $object->isObject() && ! $this->getRequest()->isApiRequest() ) { $this->content()->add( new BranchedObjectHint($branch, $this->Auth(), $branchedObject, $hasPreferredBranch) ); } } return $object; } protected function requireUuid($key) { if (! $key instanceof UuidInterface) { $key = UuidLookup::findUuidForKey($key, $this->getTableName(), $this->db(), $this->getBranch()); if ($key === null) { throw new NotFoundError('No such object available'); } } return $key; } protected function getTableName() { return DbObjectTypeRegistry::tableNameByType($this->getType()); } protected function addDeploymentLink() { try { $info = new DeploymentInfo($this->db()); $info->setObject($this->object); if (! $this->getRequest()->isApiRequest()) { if ($this->getBranch()->isBranch()) { $this->actions()->add($this->linkToMergeBranch($this->getBranch())); } else { $this->actions()->add( DeploymentLinkForm::create( $this->db(), $info, $this->Auth(), $this->api() ) ->callOnSuccess(function () { $this->getResponse()->setHeader('X-Icinga-Extra-Updates', '#col1'); }) ->handleRequest() ); if ( DirectorDeploymentLog::hasDeployments($this->db()) && (new DeploymentDashlet($this->db()))->lastDeploymentPending() ) { $this->actions()->prependHtml( Hint::warning($this->translate( 'There is an active deployment running, please wait until it is finished' . ' before creating a new deployment.' )) ); } } } } catch (IcingaException $e) { // pass (deployment may not be set up yet) } } protected function linkToMergeBranch(Branch $branch) { $link = Branch::requireHook()->linkToBranch($branch, $this->Auth(), $this->translate('Merge')); if ($link instanceof Link) { $link->addAttributes(['class' => 'icon-flapping']); } return $link; } protected function addBackToObjectLink() { $params = [ 'uuid' => $this->object->getUniqueId()->toString(), ]; if ($this->object instanceof IcingaService) { if (($host = $this->object->get('host')) !== null) { $params['host'] = $host; } elseif (($set = $this->object->get('service_set')) !== null) { $params['set'] = $set; } } $this->actions()->add(Link::create( $this->translate('back'), $this->getObjectBaseUrl(), $params, ['class' => 'icon-left-big'] )); return $this; } protected function addObjectForm(IcingaObject $object = null) { $form = $this->loadObjectForm($object); $this->content()->add($form); $form->handleRequest(); return $this; } protected function loadObjectForm(IcingaObject $object = null) { /** @var DirectorObjectForm $class */ $class = sprintf( 'Icinga\\Module\\Director\\Forms\\Icinga%sForm', ucfirst($this->getType()) ); $form = $class::load() ->setDb($this->db()) ->setAuth($this->Auth()); if ($object !== null) { $form->setObject($object); } if (true || $form->supportsBranches()) { $form->setBranch($this->getBranch()); } $this->onObjectFormLoaded($form); return $form; } protected function getObjectBaseUrl() { return $this->objectBaseUrl ?: 'director/' . strtolower($this->getType()); } protected function hasBasketSupport() { return $this->object->isTemplate() || $this->object->isGroup(); } protected function onObjectFormLoaded(DirectorObjectForm $form) { } /** * @return IcingaObject * @throws NotFoundError */ protected function requireObject() { if (! $this->object) { $this->getResponse()->setHttpResponseCode(404); if (null === $this->params->get('name')) { throw new NotFoundError('You need to pass a "name" parameter to access a specific object'); } else { throw new NotFoundError('No such object available'); } } return $this->object; } protected function showOptionalBranchActivity($activityTable) { $branch = $this->getBranch(); if ($branch->isBranch() && (int) $this->params->get('page', '1') === 1) { $table = new BranchActivityTable($branch->getUuid(), $this->db(), $this->object->getUniqueId()); if (count($table) > 0) { $this->content()->add(Hint::info(Html::sprintf($this->translate( 'The following modifications are visible in this %s only...' ), Branch::requireHook()->linkToBranch( $branch, $this->Auth(), $this->translate('configuration branch') )))); $this->content()->add($table); if (count($activityTable) === 0) { return; } $this->content()->add(Html::tag('br')); $this->content()->add(Hint::ok($this->translate( '...and the modifications below are already in the main branch:' ))); $this->content()->add(Html::tag('br')); } } } } icingaweb2-module-director-1.11.8/library/Director/Web/Controller/ObjectsController.php000066400000000000000000000424121516513262500311460ustar00rootroot00000000000000getRequest()->getActionName() !== 'sets') { $this->assertPermission('director/' . $this->getPluralBaseType()); } } /** * @return $this * @throws \Icinga\Exception\Http\HttpNotFoundException */ protected function addObjectsTabs() { $tabName = $this->getRequest()->getActionName(); if (substr($this->getType(), -5) === 'Group') { $tabName = 'groups'; } $this->tabs(new ObjectsTabs( $this->getBaseType(), $this->Auth(), $this->getBaseObjectUrl() ))->activate($tabName); return $this; } /** * @return IcingaObjectsHandler * @throws NotFoundError */ protected function apiRequestHandler() { $request = $this->getRequest(); $table = $this->getTable(); if ( $request->getControllerName() === 'services' && $hostName = $this->params->get('host') ) { $host = IcingaHost::load($hostName, $this->db()); if (! $this->allowsObject($host)) { throw new NotFoundError(sprintf('Failed to load %s "%s"', $host->getTableName(), $hostName)); } $table->getQuery()->where('o.host_id = ?', $host->get('id')); } if ($request->getActionName() === 'templates') { $table->filterObjectType('template'); } elseif ($request->getActionName() === 'applyrules') { $table->filterObjectType('apply'); } /** @var ?string $search */ $search = $this->params->get('q'); if ($search) { $table->search($search); } return (new IcingaObjectsHandler( $request, $this->getResponse(), $this->db() ))->setTable($table); } /** * @throws \Icinga\Exception\Http\HttpNotFoundException * @throws NotFoundError */ public function indexAction() { if ($this->getRequest()->isApiRequest()) { $this->apiRequestHandler()->dispatch(); return; } $type = $this->getType(); if ($this->params->get('format') === 'json') { $filename = sprintf( "director-{$type}_%s.json", date('YmdHis') ); $this->getResponse()->setHeader('Content-disposition', "attachment; filename=$filename", true); $this->apiRequestHandler()->dispatch(); return; } $this ->addObjectsTabs() ->setAutorefreshInterval(10) ->addTitle($this->translate(ucfirst($this->getPluralType()))) ->actions(new ObjectsActionBar($this->getBaseObjectUrl(), $this->url())); $this->content()->add(new BranchedObjectsHint($this->getBranch(), $this->Auth(), $this->hasPreferredBranch())); if ($type === 'command' && $this->params->get('type') === 'external_object') { $this->tabs()->activate('external'); } // Hint: might be used in controllers extending this $this->table = $this->eventuallyFilterCommand($this->getTable()); $this->table->renderTo($this); (new AdditionalTableActions($this->getAuth(), $this->url(), $this->table)) ->appendTo($this->actions()); } /** * @return ObjectsTable */ protected function getTable() { $table = ObjectsTable::create($this->getType(), $this->db(), $this->getAuth()) ->setBranchUuid($this->getBranchUuid()) ->setBaseObjectUrl($this->getBaseObjectUrl()); return $table; } /** * @return ApplyRulesTable * @throws NotFoundError */ protected function getApplyRulesTable() { $table = (new ApplyRulesTable($this->db()))->setBranch($this->getBranch()); $table->setType($this->getType()) ->setBaseObjectUrl($this->getBaseObjectUrl()); $this->eventuallyFilterCommand($table); return $table; } /** * @throws NotFoundError */ public function edittemplatesAction() { $this->commonForEdit(); } /** * @throws NotFoundError */ public function editAction() { $this->commonForEdit(); } /** * @throws NotFoundError */ public function commonForEdit() { $type = ucfirst($this->getType()); if (empty($this->multiEdit)) { throw new NotFoundError('Cannot edit multiple "%s" instances', $type); } $objects = $this->loadMultiObjectsFromParams(); if (empty($objects)) { throw new NotFoundError('No "%s" instances have been loaded', $type); } $formName = 'icinga' . $type; $form = IcingaMultiEditForm::load() ->setBranch($this->getBranch()) ->setObjects($objects) ->pickElementsFrom($this->loadForm($formName), $this->multiEdit); if ($type === 'Service') { $form->setListUrl('director/services'); } elseif ($type === 'Host') { $form->setListUrl('director/hosts'); } $form->handleRequest(); $this ->addSingleTab($this->translate('Multiple objects')) ->addTitle( $this->translate('Modify %d objects'), count($objects) )->content()->add($form); } /** * Loads the TemplatesTable or the TemplateTreeRenderer * * Passing render=tree switches to the tree view. * @throws \Icinga\Exception\Http\HttpNotFoundException * @throws \Icinga\Security\SecurityException * @throws NotFoundError */ public function templatesAction() { if ($this->getRequest()->isApiRequest()) { $this->apiRequestHandler()->dispatch(); return; } $type = $this->getType(); if ($this->params->get('format') === 'json') { $filename = sprintf( "director-{$type}-templates_%s.json", date('YmdHis') ); $this->getResponse()->setHeader('Content-disposition', "attachment; filename=$filename", true); $this->apiRequestHandler()->dispatch(); return; } $shortType = IcingaObject::createByType($type)->getShortTableName(); $this ->assertPermission('director/admin') ->addObjectsTabs() ->setAutorefreshInterval(10) ->addTitle( $this->translate('All your %s Templates'), $this->translate(ucfirst($type)) ) ->actions(new TemplateActionBar($shortType, $this->url())); if ($this->params->get('render') === 'tree') { TemplateTreeRenderer::showType($shortType, $this, $this->db()); } else { $table = TemplatesTable::create($shortType, $this->db()); $this->eventuallyFilterCommand($table); $table->renderTo($this); (new AdditionalTableActions($this->getAuth(), $this->url(), $table)) ->appendTo($this->actions()); } } /** * @return $this * @throws \Icinga\Security\SecurityException */ protected function assertApplyRulePermission() { return $this->assertPermission('director/admin'); } /** * @throws \Icinga\Exception\Http\HttpNotFoundException * @throws \Icinga\Security\SecurityException * @throws NotFoundError */ public function applyrulesAction() { if ($this->getRequest()->isApiRequest()) { $this->apiRequestHandler()->dispatch(); return; } $type = $this->getType(); if ($this->params->get('format') === 'json') { $filename = sprintf( "director-{$type}-applyrules_%s.json", date('YmdHis') ); $this->getResponse()->setHeader('Content-disposition', "attachment; filename=$filename", true); $this->apiRequestHandler()->dispatch(); return; } $tType = $this->translate(ucfirst($type)); $this ->assertApplyRulePermission() ->addObjectsTabs() ->setAutorefreshInterval(10) ->addTitle( $this->translate('All your %s Apply Rules'), $tType ); $baseUrl = 'director/' . $this->getBaseObjectUrl(); $this->actions() //->add($this->getBackToDashboardLink()) ->add( Link::create( $this->translate('Add'), "{$baseUrl}/add", ['type' => 'apply'], [ 'title' => sprintf( $this->translate('Create a new %s Apply Rule'), $tType ), 'class' => 'icon-plus', 'data-base-target' => '_next' ] ) ); $table = $this->getApplyRulesTable(); $table->renderTo($this); (new AdditionalTableActions($this->getAuth(), $this->url(), $table)) ->appendTo($this->actions()); } /** * @throws NotFoundError * @throws \Icinga\Exception\Http\HttpNotFoundException * @throws \Icinga\Security\SecurityException */ public function setsAction() { $type = $this->getType(); $tType = $this->translate(ucfirst($type)); $this ->assertPermission('director/' . $this->getBaseType() . 'sets') ->addObjectsTabs() ->requireSupportFor('Sets') ->setAutorefreshInterval(10) ->addTitle( $this->translate('Icinga %s Sets'), $tType ); $this->actions()->add( Link::create( $this->translate('Add'), "director/{$type}set/add", null, [ 'title' => sprintf( $this->translate('Create a new %s Set'), $tType ), 'class' => 'icon-plus', 'data-base-target' => '_next' ] ) ); ObjectSetTable::create($type, $this->db(), $this->getAuth()) ->setBranch($this->getBranch()) ->renderTo($this); } /** * @return array * @throws NotFoundError */ protected function loadMultiObjectsFromParams() { $filter = Filter::fromQueryString($this->params->toString()); $type = $this->getType(); $objects = array(); $db = $this->db(); $class = DbObjectTypeRegistry::classByType($type); $table = DbObjectTypeRegistry::tableNameByType($type); $store = new DbObjectStore($db, $this->getBranch()); /** @var $filter FilterChain */ foreach ($filter->filters() as $sub) { /** @var $sub FilterChain */ foreach ($sub->filters() as $ex) { /** @var $ex FilterChain|FilterExpression */ $col = $ex->getColumn(); if ($ex->isExpression()) { if ($col === 'name') { $name = $ex->getExpression(); if ($type === 'service') { $key = [ 'object_type' => 'template', 'object_name' => $name ]; } else { $key = $name; } $objects[$name] = $class::load($key, $db); } elseif ($col === 'id') { $name = $ex->getExpression(); $objects[$name] = $class::load($name, $db); } elseif ($col === 'uuid') { $object = $store->load($table, Uuid::fromString($ex->getExpression())); if ($object instanceof IcingaService) { $host = $object->getRelated('host'); $objects[$host->getObjectName() . ': ' . $object->getObjectName()] = $object; } else { $objects[$object->getObjectName()] = $object; } } else { throw new InvalidArgumentException("'$col' is no a valid key component for '$type'"); } } } } return $objects; } /** * @param string $name * * @return \Icinga\Module\Director\Web\Form\QuickForm */ public function loadForm($name) { $form = FormLoader::load($name, $this->Module()); if ($this->getRequest()->isApiRequest()) { // TODO: Ask form for API support? $form->setApiRequest(); } return $form; } /** * @param ZfQueryBasedTable $table * @return ZfQueryBasedTable * @throws NotFoundError */ protected function eventuallyFilterCommand(ZfQueryBasedTable $table) { if ($this->params->get('command')) { $command = IcingaCommand::load($this->params->get('command'), $this->db()); switch ($this->getBaseType()) { case 'host': case 'service': $table->getQuery()->where( $this->db()->getDbAdapter()->quoteInto( '(o.check_command_id = ? OR o.event_command_id = ?)', $command->getAutoincId() ) ); break; case 'notification': $table->getQuery()->where( 'o.command_id = ?', $command->getAutoincId() ); break; } } return $table; } /** * @param $feature * @return $this * @throws NotFoundError */ protected function requireSupportFor($feature) { if ($this->supports($feature) !== true) { throw new NotFoundError( '%s does not support %s', $this->getType(), $feature ); } return $this; } /** * @param $feature * @return bool */ protected function supports($feature) { $func = "supports$feature"; return IcingaObject::createByType($this->getType())->$func(); } /** * @return string */ protected function getBaseType() { $type = $this->getType(); if (substr($type, -5) === 'Group') { return substr($type, 0, -5); } else { return $type; } } protected function getBaseObjectUrl() { return $this->getType(); } /** * @return string */ protected function getType() { // Strip final 's' and upcase an eventual 'group' return preg_replace( array('/group$/', '/period$/', '/argument$/', '/apiuser$/', '/dependencie$/', '/set$/'), array('Group', 'Period', 'Argument', 'ApiUser', 'dependency', 'Set'), str_replace( 'template', '', substr($this->getRequest()->getControllerName(), 0, -1) ) ); } /** * @return string */ protected function getPluralType() { return preg_replace('/cys$/', 'cies', $this->getType() . 's'); } /** * @return string */ protected function getPluralBaseType() { return preg_replace('/cys$/', 'cies', $this->getBaseType() . 's'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Controller/TemplateController.php000066400000000000000000000207521516513262500313330ustar00rootroot00000000000000requireTemplate(); $plural = $this->getTranslatedPluralType(); $this ->addSingleTab($plural) ->setAutorefreshInterval(10) ->addTitle( $this->translate('%s based on %s'), $plural, $template->getObjectName() )->addBackToUsageLink($template); ObjectsTable::create($this->getType(), $this->db(), $this->Auth()) ->setBranch($this->getBranch()) ->setBaseObjectUrl($this->getBaseObjectUrl()) ->filterTemplate($template, $this->getInheritance()) ->renderTo($this); } public function setmembersAction() { $template = $this->requireTemplate(); $plural = $this->getTranslatedPluralType(); $this ->addSingleTab($plural) ->setAutorefreshInterval(10) ->addTitle( $this->translate('%s in service sets based on %s'), $plural, $template->getObjectName() )->addBackToUsageLink($template); ObjectsTableSetMembers::create($this->getType(), $this->db(), $this->Auth()) ->setBaseObjectUrl($this->getBaseObjectUrl()) ->setBranch($this->getBranch()) ->filterTemplate($template, $this->getInheritance()) ->renderTo($this); } public function applyrulesAction() { $type = $this->getType(); $template = $this->requireTemplate(); $this ->addSingleTab(sprintf($this->translate('Applied %s'), $this->getTranslatedPluralType())) ->setAutorefreshInterval(10) ->addTitle( $this->translate('Notification Apply Rules based on %s'), $template->getObjectName() )->addBackToUsageLink($template); ApplyRulesTable::create($type, $this->db()) ->setBaseObjectUrl($this->getBaseObjectUrl()) ->setBranch($this->getBranch()) ->filterTemplate($template, $this->params->get('inheritance', 'direct')) ->renderTo($this); } public function templatesAction() { $template = $this->requireTemplate(); $typeName = $this->getTranslatedType(); $this ->addSingleTab(sprintf($this->translate('%s Templates'), $typeName)) ->setAutorefreshInterval(10) ->addTitle( $this->translate('%s templates based on %s'), $typeName, $template->getObjectName() )->addBackToUsageLink($template); TemplatesTable::create($this->getType(), $this->db()) ->filterTemplate($template, $this->getInheritance()) ->renderTo($this); } protected function getInheritance() { return $this->params->get('inheritance', 'direct'); } protected function addBackToUsageLink(IcingaObject $template) { $type = $this->getType(); $this->actions()->add( Link::create( $this->translate('Back'), "director/{$type}template/usage", ['name' => $template->getObjectName()], ['class' => 'icon-left-big'] ) ); return $this; } public function usageAction() { $template = $this->requireTemplate(); if (! $template->isTemplate() && $template instanceof IcingaCommand) { $this->redirectNow($this->url()->setPath('director/command')); } $templateName = $template->getObjectName(); $type = $this->getType(); $this->tabs(new ObjectTabs($type, $this->Auth(), $template))->activate('modify'); $this ->addTitle($this->translate('Template: %s'), $templateName) ->setAutorefreshInterval(10); $this->actions()->add([ Link::create( $this->translate('Modify'), "director/$type/edit", ['uuid' => $template->getUniqueId()->toString()], ['class' => 'icon-edit'] ) ]); if ($template instanceof ExportInterface) { $this->actions()->add(Link::create( $this->translate('Add to Basket'), 'director/basket/add', [ 'type' => ucfirst($this->getType()) . 'Template', 'names' => $template->getUniqueIdentifier() ], ['class' => 'icon-tag'] )); } $list = new UnorderedList([], [ 'class' => 'vertical-action-list' ]); $auth = $this->Auth(); if ($type !== 'notification') { $list->addItem(new FormattedString( $this->translate('Create a new %s inheriting from this template'), [Link::create( $this->translate('Object'), "director/$type/add", ['imports' => $templateName, 'type' => 'object'] )] )); } if ($auth->hasPermission(Permission::ADMIN)) { $list->addItem(new FormattedString( $this->translate('Create a new %s inheriting from this one'), [Link::create( $this->translate('Template'), "director/$type/add", ['imports' => $templateName, 'type' => 'template'] )] )); } if ($template->supportsApplyRules()) { $list->addItem(new FormattedString( $this->translate('Create a new %s inheriting from this template'), [Link::create( $this->translate('Apply Rule'), "director/$type/add", ['imports' => $templateName, 'type' => 'apply'] )] )); } $typeName = $this->getTranslatedType(); $this->content()->add(Html::sprintf( $this->translate( 'This is the "%s" %s Template. Based on this, you might want to:' ), $typeName, $templateName ))->add( $list )->add( Html::tag('h2', null, $this->translate('Current Template Usage')) ); try { $this->content()->add( TemplateUsageTable::forTemplate($template, $this->Auth(), $this->getBranch()) ); } catch (NestingError $e) { $this->content()->add(Hint::error($e->getMessage())); } } protected function getType() { return $this->template()->getShortTableName(); } protected function getPluralType() { return preg_replace( '/cys$/', 'cies', $this->template()->getShortTableName() . 's' ); } protected function getTranslatedType() { return $this->translate(ucfirst($this->getType())); } protected function getTranslatedPluralType() { return $this->translate(ucfirst($this->getPluralType())); } protected function getBaseObjectUrl() { return $this->getType(); } /** * @return IcingaObject */ protected function template() { if ($this->template === null) { $this->template = $this->requireTemplate(); } return $this->template; } /** * @return IcingaObject */ abstract protected function requireTemplate(); } icingaweb2-module-director-1.11.8/library/Director/Web/Form/000077500000000000000000000000001516513262500235555ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Form/ClickHereForm.php000066400000000000000000000011211516513262500267360ustar00rootroot00000000000000addElement('submit', 'submit', [ 'label' => $this->translate('here'), 'class' => 'link-button' ]); } public function hasBeenClicked() { return $this->hasBeenClicked; } public function onSuccess() { $this->hasBeenClicked = true; } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/CloneImportSourceForm.php000066400000000000000000000034151516513262500305310ustar00rootroot00000000000000setDefaultElementDecorator(new DdDtDecorator()); $this->source = $source; } protected function assemble() { $this->addElement('text', 'source_name', [ 'label' => $this->translate('New name'), 'value' => $this->source->get('source_name'), ]); $this->addElement('submit', 'submit', [ 'label' => $this->translate('Clone') ]); } public function onSuccess() { $db = $this->source->getConnection(); assert($db instanceof Db); $export = (new Exporter($db))->export($this->source); $newName = $this->getElement('source_name')->getValue(); $export->source_name = $newName; unset($export->uuid); if (ImportSource::existsWithName($newName, $db)) { $this->getElement('source_name')->addMessage('Name already exists'); } $importer = new ObjectImporter($db); $this->newSource = $importer->import(ImportSource::class, $export); $this->newSource->store(); } public function getSuccessUrl() { return Url::fromPath('director/importsource', ['id' => $this->newSource->get('id')]); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/CloneSyncRuleForm.php000066400000000000000000000035431516513262500276440ustar00rootroot00000000000000setDefaultElementDecorator(new DdDtDecorator()); $this->rule = $rule; } protected function assemble() { $this->addElement('text', 'rule_name', [ 'label' => $this->translate('New name'), 'value' => $this->rule->get('rule_name'), ]); $this->addElement('submit', 'submit', [ 'label' => $this->translate('Clone') ]); } /** * @throws \Icinga\Exception\NotFoundError * @throws \Icinga\Module\Director\Exception\DuplicateKeyException */ public function onSuccess() { $db = $this->rule->getConnection(); assert($db instanceof Db); $exporter = new Exporter($db); $export = $exporter->export($this->rule); $newName = $this->getValue('rule_name'); $export->rule_name = $newName; unset($export->uuid); if (SyncRule::existsWithName($newName, $db)) { $this->getElement('rule_name')->addMessage('Name already exists'); } $importer = new ObjectImporter($db); $this->newRule = $importer->import(SyncRule::class, $export); $this->newRule->store(); } public function getSuccessUrl() { return Url::fromPath('director/syncrule', ['id' => $this->newRule->get('id')]); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/CsrfToken.php000066400000000000000000000020051516513262500261610ustar00rootroot00000000000000 'db-selector' ]; protected $allowedNames; /** @var Window */ protected $window; protected $response; public function __construct(Response $response, Window $window, $allowedNames) { $this->response = $response; $this->window = $window; $this->allowedNames = $allowedNames; } protected function assemble() { $this->addElement('hidden', 'DbSelector', [ 'value' => 'sent' ]); $this->addElement('select', 'db_resource', [ 'options' => $this->allowedNames, 'class' => 'autosubmit', 'value' => $this->getSession()->get('db_resource') ]); } /** * A base class should handle this, based on hidden fields * * @return bool */ public function hasBeenSubmitted() { return $this->hasBeenSent() && $this->getRequestParam('DbSelector') === 'sent'; } public function onSuccess() { $this->getSession()->set('db_resource', $this->getElement('db_resource')->getValue()); $this->response->redirectAndExit(Url::fromRequest($this->getRequest())); } protected function getRequestParam($name, $default = null) { $request = $this->getRequest(); if ($request === null) { return $default; } if ($request->getMethod() === 'POST') { $params = $request->getParsedBody(); } elseif ($this->getMethod() === 'GET') { parse_str($request->getUri()->getQuery(), $params); } else { $params = []; } if (is_array($params) && array_key_exists($name, $params)) { return $params[$name]; } return $default; } /** * @return \Icinga\Web\Session\SessionNamespace */ protected function getSession() { return $this->window->getSessionNamespace('director'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Decorator/000077500000000000000000000000001516513262500254775ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Form/Decorator/ViewHelperRaw.php000066400000000000000000000004371516513262500307400ustar00rootroot00000000000000getUnfilteredValue(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/DirectorForm.php000066400000000000000000000022741516513262500266720ustar00rootroot00000000000000db = $db; return $this; } /** * @return Db */ public function getDb() { return $this->db; } /** * @return static */ public static function load() { return new static([ 'icingaModule' => Icinga::app()->getModuleManager()->getModule('director') ]); } public function addBoolean($key, $options, $default = null) { if ($default === null) { return $this->addElement('OptionalYesNo', $key, $options); } else { $this->addElement('YesNo', $key, $options); return $this->getElement($key)->setValue($default); } } protected function optionalBoolean($key, $label, $description) { return $this->addBoolean($key, array( 'label' => $label, 'description' => $description )); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/DirectorObjectForm.php000066400000000000000000001542761516513262500300330ustar00rootroot00000000000000preferredObjectType = $type; return $this; } public function setAuth(Auth $auth) { $this->auth = $auth; return $this; } public function getAuth() { if ($this->auth === null) { $this->auth = Auth::getInstance(); } return $this->auth; } protected function eventuallyAddNameRestriction($restrictionName) { $restrictions = $this->getAuth()->getRestrictions($restrictionName); if (! empty($restrictions)) { $this->getElement('object_name')->addValidator( new NamePattern($restrictions) ); } return $this; } public function presetImports($imports) { if (! empty($imports)) { if (is_array($imports)) { $this->presetImports = $imports; } else { $this->presetImports = array($imports); } } return $this; } /** * @return DbObject|DbObjectWithSettings|IcingaObject */ protected function object() { if ($this->object === null) { $values = $this->getValues(); /** @var DbObject|IcingaObject $class */ $class = $this->getObjectClassname(); if ($this->preferredObjectType) { $values['object_type'] = $this->preferredObjectType; } if ($this->presetImports) { $values['imports'] = $this->presetImports; } $this->object = $class::create($values, $this->db); } else { if (! $this->object->hasConnection()) { $this->object->setConnection($this->db); } } return $this->object; } protected function extractChoicesFromPost($post) { $imports = []; foreach ($this->choiceElements as $other) { $name = $other->getName(); if (array_key_exists($name, $post)) { $value = $post[$name]; if (is_string($value)) { $imports[] = $value; } elseif (is_array($value)) { foreach ($value as $chosen) { $imports[] = $chosen; } } } } return $imports; } protected function assertResolvedImports() { if ($this->resolvedImports !== null) { return $this->resolvedImports; } $object = $this->object; if (! $object instanceof IcingaObject) { return $this->setResolvedImports(false); } if (! $object->supportsImports()) { return $this->setResolvedImports(false); } if ($this->hasBeenSent()) { // prefill special properties, required to resolve fields and similar $post = $this->getRequest()->getPost(); $key = 'imports'; if ($el = $this->getElement($key)) { if (array_key_exists($key, $post)) { $imports = $post[$key]; if (! is_array($imports)) { $imports = array($imports); } $imports = array_filter(array_values(array_merge( $imports, $this->extractChoicesFromPost($post) )), 'strlen'); /** @var ZfElement $el */ $this->populate([$key => $imports]); $el->setValue($imports); if (! $this->tryToSetObjectPropertyFromElement($object, $el, $key)) { return $this->resolvedImports = false; } } } elseif ($this->presetImports) { $imports = array_values(array_merge( $this->presetImports, $this->extractChoicesFromPost($post) )); if (! $this->eventuallySetImports($imports)) { return $this->resolvedImports = false; } } else { if (! empty($this->choiceElements)) { if (! $this->eventuallySetImports($this->extractChoicesFromPost($post))) { return $this->resolvedImports = false; } } } foreach ($this->earlyProperties as $key) { if ($el = $this->getElement($key)) { if (array_key_exists($key, $post)) { $this->populate([$key => $post[$key]]); $this->tryToSetObjectPropertyFromElement($object, $el, $key); } } } } try { $object->listAncestorIds(); } catch (NestingError $e) { $this->addUniqueErrorMessage($e->getMessage()); return $this->resolvedImports = false; } catch (Exception $e) { $this->addException($e, 'imports'); return $this->resolvedImports = false; } return $this->setResolvedImports(); } protected function eventuallySetImports($imports) { try { $this->object()->set('imports', $imports); return true; } catch (Exception $e) { $this->addException($e, 'imports'); return false; } } protected function tryToSetObjectPropertyFromElement( IcingaObject $object, ZfElement $element, $key ) { $old = null; try { $old = $object->get($key); $object->set($key, $element->getValue()); $object->resolveUnresolvedRelatedProperties(); if ($key === 'imports') { $object->imports()->getObjects(); } return true; } catch (Exception $e) { if ($old !== null) { $object->set($key, $old); } $this->addException($e, $key); return false; } } public function setResolvedImports($resolved = true) { return $this->resolvedImports = $resolved; } public function isObject() { return $this->getSentOrObjectValue('object_type') === 'object'; } public function isTemplate() { return $this->getSentOrObjectValue('object_type') === 'template'; } // TODO: move to a subform protected function handleRanges(IcingaObject $object, &$values) { if (! $object->supportsRanges()) { return; } $key = 'ranges'; $object = $this->object(); /* Sample: array( 'monday' => 'eins', 'tuesday' => '00:00-24:00', 'sunday' => 'zwei', ); */ if (array_key_exists($key, $values)) { $object->ranges()->set($values[$key]); unset($values[$key]); } foreach ($object->ranges()->getRanges() as $key => $value) { $this->addRange($key, $value); } } protected function addToCheckExecutionDisplayGroup($elements) { return $this->addElementsToGroup( $elements, 'check_execution', self::GROUP_ORDER_CHECK_EXECUTION, $this->translate('Check execution') ); } public function addElementsToGroup($elements, $group, $order, $legend = null) { if (! is_array($elements)) { $elements = array($elements); } // These are optional elements, they might exist or not. We still want // to see exception for other ones $skipLegally = array('check_period_id'); $skip = array(); foreach ($elements as $k => $v) { if (is_string($v)) { $el = $this->getElement($v); if (!$el && in_array($v, $skipLegally)) { $skip[] = $k; continue; } $elements[$k] = $el; } } foreach ($skip as $k) { unset($elements[$k]); } if (! array_key_exists($group, $this->displayGroups)) { $this->addDisplayGroup($elements, $group, array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => $order, 'legend' => $legend ?: $group, )); $this->displayGroups[$group] = $this->getDisplayGroup($group); } else { $this->displayGroups[$group]->addElements($elements); } return $this->displayGroups[$group]; } protected function handleProperties(DbObject $object, &$values) { if ($this->hasBeenSent()) { foreach ($values as $key => $value) { try { if ($key === 'imports' && ! empty($this->choiceElements)) { if (! is_array($value)) { $value = [$value]; } foreach ($this->choiceElements as $element) { $chosen = $element->getValue(); if (is_string($chosen)) { $value[] = $chosen; } elseif (is_array($chosen)) { foreach ($chosen as $choice) { $value[] = $choice; } } } } $object->set($key, $value); if ($object instanceof IcingaObject) { if ($this->resolvedImports !== false) { $object->imports()->getObjects(); } } } catch (Exception $e) { $this->addException($e, $key); } } } } protected function loadInheritedProperties() { if ($this->assertResolvedImports()) { try { $this->showInheritedProperties($this->object()); } catch (Exception $e) { $this->addException($e); } } } protected function showInheritedProperties(IcingaObject $object) { $inherited = $object->getInheritedProperties(); $origins = $object->getOriginsProperties(); foreach ($inherited as $k => $v) { if ($v !== null && $k !== 'object_name') { $el = $this->getElement($k); if ($el) { $this->setInheritedValue($el, $inherited->$k, $origins->$k); } elseif (substr($k, -3) === '_id') { $k = substr($k, 0, -3); $el = $this->getElement($k); if ($el) { $this->setInheritedValue( $el, $object->getRelatedObjectName($k, $v), $origins->{"{$k}_id"} ); } } } } } protected function prepareFields($object) { if ($this->assertResolvedImports()) { $this->fieldLoader = new IcingaObjectFieldLoader($object); $this->fieldLoader->prepareElements($this); } return $this; } protected function setCustomVarValues($values) { if ($this->fieldLoader) { $this->fieldLoader->setValues($values, 'var_'); } return $this; } protected function addFields() { if ($this->fieldLoader) { $this->fieldLoader->addFieldsToForm($this); $this->onAddedFields(); } } protected function onAddedFields() { } // TODO: remove, used in sets I guess protected function fieldLoader($object) { if ($this->fieldLoader === null) { $this->fieldLoader = new IcingaObjectFieldLoader($object); } return $this->fieldLoader; } protected function isNew() { return $this->object === null || ! $this->object->hasBeenLoadedFromDb(); } protected function setButtons() { if ($this->isNew()) { $this->setSubmitLabel( $this->translate('Add') ); } else { $this->setSubmitLabel( $this->translate('Store') ); $this->addDeleteButton(); } } /** * @param bool $importsFirst * @return $this */ protected function groupMainProperties($importsFirst = false) { if ($importsFirst) { $elements = [ 'imports', 'object_type', 'object_name', ]; } else { $elements = [ 'object_type', 'object_name', 'imports', ]; } $elements = array_merge($elements, [ 'display_name', 'host', 'host_id', 'address', 'address6', 'groups', 'inherited_groups', 'applied_groups', 'users', 'users_var', 'user_groups', 'user_groups_var', 'apply_to', 'command_id', // Notification 'notification_interval', 'period_id', 'times_begin', 'times_end', 'email', 'pager', 'enable_notifications', 'redundancy_group', //Dependencies 'disable_checks', //Dependencies 'disable_notifications', 'ignore_soft_states', 'apply_for', 'create_live', 'disabled', ]); // Add template choices to the main section /** @var \Zend_Form_Element $el */ foreach ($this->getElements() as $key => $el) { if (substr($el->getName(), 0, 6) === 'choice') { $elements[] = $key; } } $this->addDisplayGroup($elements, 'object_definition', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_OBJECT_DEFINITION, 'legend' => $this->translate('Main properties') )); return $this; } protected function setSentValue($name, $value) { if ($this->hasBeenSent()) { $request = $this->getRequest(); if ($value !== null && $request->isPost() && $request->getPost($name) !== null) { $request->setPost($name, $value); } } $this->setElementValue($name, $value); } public function setElementValue($name, $value = null) { $el = $this->getElement($name); if (! $el) { // Not showing an error, as most object properties do not exist. Not // yet, because IMO this should be checked. // $this->addError(sprintf($this->translate('Form element "%s" does not exist'), $name)); return; } if ($value !== null) { $el->setValue($value); } } public function setInheritedValue(ZfElement $el, $inherited, $inheritedFrom) { if ($inherited === null) { return; } $txtInherited = sprintf($this->translate(' (inherited from "%s")'), $inheritedFrom); if ($el instanceof ZfSelect) { $multi = $el->getMultiOptions(); if (is_bool($inherited)) { $inherited = $inherited ? 'y' : 'n'; } if (is_scalar($inherited) && array_key_exists($inherited, $multi)) { $multi[null] = $multi[$inherited] . $txtInherited; } else { $multi[null] = $this->stringifyInheritedValue($inherited) . $txtInherited; } $el->setMultiOptions($multi); } elseif ($el instanceof ExtensibleSet) { $el->setAttrib('inherited', $inherited); $el->setAttrib('inheritedFrom', $inheritedFrom); } else { if (is_string($inherited) || is_int($inherited)) { $el->setAttrib('placeholder', $inherited . $txtInherited); } } // We inherited a value, so no need to require the field $el->setRequired(false); } protected function stringifyInheritedValue($value) { return is_scalar($value) ? $value : substr(json_encode($value), 0, 40); } public function setListUrl($url) { $this->listUrl = $url; return $this; } public function onSuccess() { $object = $this->object(); if ($object->hasBeenModified()) { if (! $object->hasBeenLoadedFromDb()) { $this->setHttpResponseCode(201); } $msg = sprintf( $object->hasBeenLoadedFromDb() ? $this->translate('The %s has successfully been stored') : $this->translate('A new %s has successfully been created'), $this->translate($this->getObjectShortClassName()) ); $this->getDbObjectStore()->store($object); } else { if ($this->isApiRequest()) { $this->setHttpResponseCode(304); } $msg = $this->translate('No action taken, object has not been modified'); } $this->setObjectSuccessUrl(); $this->beforeSuccessfulRedirect(); $this->redirectOnSuccess($msg); } protected function setObjectSuccessUrl() { $object = $this->object(); if ($object instanceof IcingaObject) { $params = $object->getUrlParams(); $url = Url::fromPath($this->getAction()); if ($url->hasParam('dbResourceName')) { $params['dbResourceName'] = $url->getParam('dbResourceName'); } $this->setSuccessUrl( 'director/' . strtolower($this->getObjectShortClassName()), $params ); } elseif ($object->hasProperty('id')) { $this->setSuccessUrl($this->getSuccessUrl()->with('id', $object->getProperty('id'))); } } protected function beforeSuccessfulRedirect() { } public function hasElement($name) { return $this->getElement($name) !== null; } public function getObject() { return $this->object; } public function hasObject() { return $this->object !== null; } public function isIcingaObject() { if ($this->object !== null) { return $this->object instanceof IcingaObject; } /** @var DbObject $class */ $class = $this->getObjectClassname(); $instance = $class::create(); return $instance instanceof IcingaObject; } public function isMultiObjectForm() { return false; } public function setObject(DbObject $object) { $this->object = $object; if ($this->db === null) { /** @var Db $connection */ $connection = $object->getConnection(); $this->setDb($connection); } return $this; } protected function getObjectClassname() { if ($this->className === null) { return 'Icinga\\Module\\Director\\Objects\\' . substr(join('', array_slice(explode('\\', get_class($this)), -1)), 0, -4); } return $this->className; } protected function getObjectShortClassName() { if ($this->objectName === null) { $className = substr(strrchr(get_class($this), '\\'), 1); if (substr($className, 0, 6) === 'Icinga') { return substr($className, 6, -4); } else { return substr($className, 0, -4); } } return $this->objectName; } protected function removeFromSet(&$set, $key) { unset($set[$key]); } protected function moveUpInSet(&$set, $key) { list($set[$key - 1], $set[$key]) = array($set[$key], $set[$key - 1]); } protected function moveDownInSet(&$set, $key) { list($set[$key + 1], $set[$key]) = array($set[$key], $set[$key + 1]); } protected function beforeSetup() { if (!$this->hasBeenSent()) { return; } /** @var array $post */ $post = $this->getRequest()->getPost(); $values = $post; foreach ($post as $key => $value) { if (preg_match('/^(.+?)_(\d+)__(MOVE_DOWN|MOVE_UP|REMOVE)$/', $key, $m)) { $values[$m[1]] = array_filter($values[$m[1]], 'strlen'); switch ($m[3]) { case 'MOVE_UP': $this->moveUpInSet($values[$m[1]], $m[2]); break; case 'MOVE_DOWN': $this->moveDownInSet($values[$m[1]], $m[2]); break; case 'REMOVE': $this->removeFromSet($values[$m[1]], $m[2]); break; } $this->getRequest()->setPost($m[1], $values[$m[1]]); } } } protected function onRequest() { if ($this->object !== null) { $this->setDefaultsFromObject($this->object); } $this->prepareFields($this->object()); IcingaObjectFormHook::callOnSetup($this); if ($this->hasBeenSent()) { $this->handlePost(); } try { $this->loadInheritedProperties(); $this->addFields(); $this->callOnRequestCallables(); } catch (Exception $e) { $this->addUniqueException($e); return; } if ($this->shouldBeDeleted()) { $this->deleteObject($this->object()); } } protected function handlePost() { $object = $this->object(); $post = $this->getRequest()->getPost(); $this->populate($post); $values = $this->getValues(); if ($object instanceof IcingaObject) { $this->setCustomVarValues($post); } $this->handleProperties($object, $values); // TODO: get rid of this if ($object instanceof IcingaObject) { $this->handleRanges($object, $values); } } protected function setDefaultsFromObject(DbObject $object) { /** @var ZfElement $element */ foreach ($this->getElements() as $element) { $key = $element->getName(); if ($object->hasProperty($key)) { $value = $object->get($key); if ($object instanceof IcingaObject) { if ($object->propertyIsRelatedSet($key)) { if (! count((array) $value)) { continue; } } } if ($value !== null && $value !== []) { $element->setValue($value); } } } } protected function deleteObject($object) { if ($object instanceof IcingaObject && $object->hasProperty('object_name')) { $msg = sprintf( '%s "%s" has been removed', $this->translate($this->getObjectShortClassName()), $object->getObjectName() ); } else { $msg = sprintf( '%s has been removed', $this->translate($this->getObjectShortClassName()) ); } if ($this->listUrl) { $url = $this->listUrl; } elseif ($object instanceof IcingaObject && $object->hasProperty('object_name')) { $url = $object->getOnDeleteUrl(); } else { $url = $this->getSuccessUrl()->without( array('field_id', 'argument_id', 'range', 'range_type') ); } if ($this->getDbObjectStore()->delete($object)) { $this->setSuccessUrl($url); } $this->redirectOnSuccess($msg); } /** * @return DbObjectStore */ protected function getDbObjectStore() { $store = new DbObjectStore($this->getDb(), $this->branch); return $store; } protected function addDeleteButton($label = null) { $object = $this->object; if ($label === null) { $label = $this->translate('Delete'); } $el = $this->createElement('submit', $label) ->setLabel($label) ->setDecorators(array('ViewHelper')); //->removeDecorator('Label'); $this->deleteButtonName = $el->getName(); if ($object instanceof IcingaObject && $object->isTemplate()) { if ($cnt = $object->countDirectDescendants()) { $el->setAttrib('disabled', 'disabled'); $el->setAttrib( 'title', sprintf( $this->translate('This template is still in use by %d other objects'), $cnt ) ); } } elseif ($object instanceof IcingaCommand && $object->isInUse()) { $el->setAttrib('disabled', 'disabled'); $el->setAttrib( 'title', sprintf( $this->translate('This Command is still in use by %d other objects'), $object->countDirectUses() ) ); } $this->addElement($el); return $this; } public function hasDeleteButton() { return $this->deleteButtonName !== null; } public function shouldBeDeleted() { if (! $this->hasDeleteButton()) { return false; } $name = $this->deleteButtonName; return $this->getSentValue($name) === $this->getElement($name)->getLabel(); } public function abortDeletion() { if ($this->hasDeleteButton()) { $this->setSentValue($this->deleteButtonName, 'ABORTED'); } } public function getSentOrResolvedObjectValue($name, $default = null) { return $this->getSentOrObjectValue($name, $default, true); } public function getSentOrObjectValue($name, $default = null, $resolved = false) { // TODO: check whether getSentValue is still needed since element->getValue // is in place (currently for form element default values only) if (!$this->hasObject()) { if ($this->hasBeenSent()) { return $this->getSentValue($name, $default); } else { if ($name === 'object_type' && $this->preferredObjectType) { return $this->preferredObjectType; } if ($name === 'imports' && $this->presetImports) { return $this->presetImports; } if ($this->valueIsEmpty($val = $this->getValue($name))) { return $default; } else { return $val; } } } if ($this->hasBeenSent()) { if (!$this->valueIsEmpty($value = $this->getSentValue($name))) { return $value; } } $object = $this->getObject(); if ($object->hasProperty($name)) { if ($resolved && $object->supportsImports()) { if ($this->assertResolvedImports()) { $objectProperty = $object->getResolvedProperty($name); } else { $objectProperty = $object->$name; } } else { $objectProperty = $object->$name; } } else { $objectProperty = null; } if ($objectProperty !== null) { return $objectProperty; } if (($el = $this->getElement($name)) && !$this->valueIsEmpty($val = $el->getValue())) { return $val; } return $default; } public function loadObject($id) { if ($this->branch && $this->branch->isBranch()) { throw new \RuntimeException('Calling loadObject from form in a branch'); } /** @var DbObject $class */ $class = $this->getObjectClassname(); if (is_int($id)) { $this->object = $class::loadWithAutoIncId($id, $this->db); if ($this->object->getKeyName() === 'id') { $this->addHidden('id', $id); } } else { $this->object = $class::load($id, $this->db); } return $this; } protected function addRange($key, $range) { $this->addElement('text', 'range_' . $key, array( 'label' => 'ranges.' . $key, 'value' => $range->range_value )); } /** * @param Db $db * @return $this */ public function setDb(Db $db) { if ($this->object !== null) { $this->object->setConnection($db); } parent::setDb($db); return $this; } public function optionallyAddFromEnum($enum) { return array( null => $this->translate('- click to add more -') ) + $enum; } protected function addObjectTypeElement() { if (!$this->isNew()) { return $this; } if ($this->preferredObjectType) { $this->addHidden('object_type', $this->preferredObjectType); return $this; } $object = $this->object(); if ($object->supportsImports()) { $templates = $this->enumAllowedTemplates(); if (empty($templates) && $this->getObjectShortClassName() !== 'Command') { $types = array('template' => $this->translate('Template')); } else { $types = array( 'object' => $this->translate('Object'), 'template' => $this->translate('Template'), ); } } else { $types = array('object' => $this->translate('Object')); } if ($this->object()->supportsApplyRules()) { $types['apply'] = $this->translate('Apply rule'); } $this->addElement('select', 'object_type', array( 'label' => $this->translate('Object type'), 'description' => $this->translate( 'What kind of object this should be. Templates allow full access' . ' to any property, they are your building blocks for "real" objects.' . ' External objects should usually not be manually created or modified.' . ' They allow you to work with objects locally defined on your Icinga nodes,' . ' while not rendering and deploying them with the Director. Apply rules allow' . ' to assign services, notifications and groups to other objects.' ), 'required' => true, 'multiOptions' => $this->optionalEnum($types), 'class' => 'autosubmit' )); return $this; } protected function hasObjectType() { if (!$this->object()->hasProperty('object_type')) { return false; } return ! $this->valueIsEmpty($this->getSentOrObjectValue('object_type')); } protected function addZoneElement($all = false) { if ($all || $this->isTemplate()) { $zones = $this->db->enumZones(); } else { $zones = $this->db->enumNonglobalZones(); } $this->addElement('select', 'zone_id', array( 'label' => $this->translate('Cluster Zone'), 'description' => $this->translate( 'Icinga cluster zone. Allows to manually override Directors decisions' . ' of where to deploy your config to. You should consider not doing so' . ' unless you gained deep understanding of how an Icinga Cluster stack' . ' works' ), 'multiOptions' => $this->optionalEnum($zones) )); return $this; } /** * @param $type * @return $this */ protected function addChoices($type) { if ($this->isTemplate()) { return $this; } $connection = $this->getDb(); $choiceType = 'TemplateChoice' . ucfirst($type); $table = "icinga_$type"; $choices = IcingaObject::loadAllByType($choiceType, $connection); $chosenTemplates = $this->getSentOrObjectValue('imports'); $db = $connection->getDbAdapter(); if (empty($chosenTemplates)) { $importedIds = []; } else { $importedIds = $db->fetchCol( $db->select()->from($table, 'id') ->where('object_name in (?)', (array)$chosenTemplates) ->where('object_type = ?', 'template') ); } foreach ($choices as $choice) { $required = $choice->get('required_template_id'); if ($required === null || in_array($required, $importedIds, false)) { $this->addChoiceElement($choice); } } return $this; } protected function addChoiceElement(IcingaTemplateChoice $choice) { $imports = $this->object()->listImportNames(); $element = $choice->createFormElement($this, $imports); $this->addElement($element); $this->choiceElements[$element->getName()] = $element; return $this; } /** * @param bool $required * @return $this * @throws \Zend_Form_Exception */ protected function addImportsElement($required = null) { if ($this->presetImports) { return $this; } if (in_array($this->getObjectShortClassName(), ['TimePeriod', 'ScheduledDowntime'])) { $required = false; } else { $required = $required !== null ? $required : !$this->isTemplate(); } $enum = $this->enumAllowedTemplates(); if (empty($enum)) { if ($required) { if ($this->hasBeenSent()) { $this->addError($this->translate('No template has been chosen')); } else { if ($this->hasPermission(Permission::ADMIN)) { $html = $this->translate('Please define a related template first'); } else { $html = $this->translate('No related template has been provided yet'); } $this->addHtml('

    ' . $html . '

    '); } } return $this; } $db = $this->getDb()->getDbAdapter(); $object = $this->object; if ($object->supportsChoices()) { $choiceNames = $db->fetchCol( $db->select()->from( $this->object()->getTableName(), 'object_name' )->where('template_choice_id IS NOT NULL') ); } else { $choiceNames = []; } $type = $object->getShortTableName(); $this->addElement('extensibleSet', 'imports', array( 'label' => $this->translate('Imports'), 'description' => $this->translate( 'Importable templates, add as many as you want. Please note that order' . ' matters when importing properties from multiple templates: last one' . ' wins' ), 'required' => $required, 'spellcheck' => 'false', 'hideOptions' => $choiceNames, 'suggest' => "{$type}templates", // 'multiOptions' => $this->optionallyAddFromEnum($enum), 'sorted' => true, 'value' => $this->presetImports, 'class' => 'autosubmit', 'validators' => [ new Zend_Validate_Callback(function ($value) { $objectInstance = $this->object->getShortTableName(); // Avoid cyclic imports for hosts and commands if ($objectInstance !== 'host' && $objectInstance !== 'command') { return true; } $templateTree = new TemplateTree($objectInstance, $this->getDb()); $importsElement = $this->getElement('imports'); $objectName = $this->object->getObjectName(); if (in_array($objectName, $value, true)) { $importsElement->addErrorMessage( $this->translate('You can not import the same object into itself, please remove it first') ); return false; } if ($this->object->isTemplate()) { $descendents = []; if (! $this->isNew()) { $descendents = $templateTree->getDescendantsFor($this->object); } $loopedImports = array_intersect($descendents, $value); if (! empty($loopedImports)) { $loopedImport = array_slice($loopedImports, 0, 1); array_push($loopedImport, ...$descendents); $importsElement->addErrorMessage( sprintf( $this->translate('Loop detected for imports: %s'), implode('->', $loopedImports) ) ); return false; } } return true; }) ] )); return $this; } protected function addDisabledElement() { if ($this->isTemplate()) { return $this; } $this->addBoolean( 'disabled', array( 'label' => $this->translate('Disabled'), 'description' => $this->translate('Disabled objects will not be deployed') ), 'n' ); return $this; } /** * @return $this * @throws \Zend_Form_Exception */ protected function addGroupDisplayNameElement() { $this->addElement('text', 'display_name', array( 'label' => $this->translate('Display Name'), 'description' => $this->translate( 'An alternative display name for this group. If you wonder how this' . ' could be helpful just leave it blank' ) )); return $this; } /** * @param bool $force * * @return $this * @throws \Zend_Form_Exception */ protected function addCheckCommandElements($force = false) { if (! $force && ! $this->isTemplate()) { return $this; } $this->addElement('text', 'check_command', array( 'label' => $this->translate('Check command'), 'description' => $this->translate('Check command definition'), // 'multiOptions' => $this->optionalEnum($this->db->enumCheckcommands()), 'class' => 'autosubmit director-suggest', // This influences fields 'data-suggestion-context' => 'checkcommandnames', 'value' => $this->getObject()->get('check_command') )); $this->getDisplayGroup('object_definition') // ->addElement($this->getElement('check_command_id')) ->addElement($this->getElement('check_command')); $eventCommands = $this->db->enumEventcommands(); if (! empty($eventCommands)) { $this->addElement('select', 'event_command_id', array( 'label' => $this->translate('Event command'), 'description' => $this->translate('Event command definition'), 'multiOptions' => $this->optionalEnum($eventCommands), 'class' => 'autosubmit', )); $this->addToCheckExecutionDisplayGroup('event_command_id'); } return $this; } protected function addCheckExecutionElements($force = false) { if (! $force && ! $this->isTemplate()) { return $this; } $this->addElement( 'text', 'check_interval', array( 'label' => $this->translate('Check interval'), 'description' => $this->translate('Your regular check interval') ) ); $this->addElement( 'text', 'retry_interval', array( 'label' => $this->translate('Retry interval'), 'description' => $this->translate( 'Retry interval, will be applied after a state change unless the next hard state is reached' ) ) ); $this->addElement( 'text', 'max_check_attempts', array( 'label' => $this->translate('Max check attempts'), 'description' => $this->translate( 'Defines after how many check attempts a new hard state is reached' ) ) ); $this->addElement( 'text', 'check_timeout', array( 'label' => $this->translate('Check timeout'), 'description' => $this->translate( "Check command timeout in seconds. Overrides the CheckCommand's timeout attribute" ) ) ); $periods = $this->db->enumTimeperiods(); if (!empty($periods)) { $this->addElement( 'select', 'check_period_id', array( 'label' => $this->translate('Check period'), 'description' => $this->translate( 'The name of a time period which determines when this' . ' object should be monitored. Not limited by default.' ), 'multiOptions' => $this->optionalEnum($periods), ) ); } $this->optionalBoolean( 'enable_active_checks', $this->translate('Execute active checks'), $this->translate('Whether to actively check this object') ); $this->optionalBoolean( 'enable_passive_checks', $this->translate('Accept passive checks'), $this->translate('Whether to accept passive check results for this object') ); $this->optionalBoolean( 'enable_notifications', $this->translate('Send notifications'), $this->translate('Whether to send notifications for this object') ); $this->optionalBoolean( 'enable_event_handler', $this->translate('Enable event handler'), $this->translate('Whether to enable event handlers this object') ); $this->optionalBoolean( 'enable_perfdata', $this->translate('Process performance data'), $this->translate('Whether to process performance data provided by this object') ); $this->optionalBoolean( 'enable_flapping', $this->translate('Enable flap detection'), $this->translate('Whether flap detection is enabled on this object') ); $this->addElement( 'text', 'flapping_threshold_high', array( 'label' => $this->translate('Flapping threshold (high)'), 'description' => $this->translate( 'Flapping upper bound in percent for a service to be considered flapping' ) ) ); $this->addElement( 'text', 'flapping_threshold_low', array( 'label' => $this->translate('Flapping threshold (low)'), 'description' => $this->translate( 'Flapping lower bound in percent for a service to be considered not flapping' ) ) ); $this->optionalBoolean( 'volatile', $this->translate('Volatile'), $this->translate('Whether this check is volatile.') ); $elements = array( 'check_interval', 'retry_interval', 'max_check_attempts', 'check_timeout', 'check_period_id', 'enable_active_checks', 'enable_passive_checks', 'enable_notifications', 'enable_event_handler', 'enable_perfdata', 'enable_flapping', 'flapping_threshold_high', 'flapping_threshold_low', 'volatile' ); $this->addToCheckExecutionDisplayGroup($elements); return $this; } protected function enumAllowedTemplates() { $object = $this->object(); $tpl = $this->db->enumIcingaTemplates($object->getShortTableName()); if (empty($tpl)) { return []; } /** @var int|string $id */ $id = $object->get('id'); if (array_key_exists($id, $tpl)) { unset($tpl[$id]); } return array_combine($tpl, $tpl); } protected function addExtraInfoElements() { $this->addElement('textarea', 'notes', array( 'label' => $this->translate('Notes'), 'description' => $this->translate( 'Additional notes for this object' ), 'rows' => 2, 'columns' => 60, )); $this->addElement('text', 'notes_url', array( 'label' => $this->translate('Notes URL'), 'description' => $this->translate( 'An URL pointing to additional notes for this object' ), )); $this->addElement('text', 'action_url', array( 'label' => $this->translate('Action URL'), 'description' => $this->translate( 'An URL leading to additional actions for this object. Often used' . ' with Icinga Classic, rarely with Icinga Web 2 as it provides' . ' far better possibilities to integrate addons' ), )); $this->addElement('text', 'icon_image', array( 'label' => $this->translate('Icon image'), 'description' => $this->translate( 'An URL pointing to an icon for this object. Try "tux.png" for icons' . ' relative to public/img/icons or "cloud" (no extension) for items' . ' from the Icinga icon font' ), )); $this->addElement('text', 'icon_image_alt', array( 'label' => $this->translate('Icon image alt'), 'description' => $this->translate( 'Alternative text to be shown in case above icon is missing' ), )); $elements = array( 'notes', 'notes_url', 'action_url', 'icon_image', 'icon_image_alt', ); $this->addDisplayGroup($elements, 'extrainfo', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_EXTRA_INFO, 'legend' => $this->translate('Additional properties') )); return $this; } /** * Add an assign_filter form element * * Forms should use this helper method for objects using the typical * assign_filter column * * @param array $properties Form element properties * * @return $this * @throws \Zend_Form_Exception */ protected function addAssignFilter($properties) { if (!$this->object || !$this->object->supportsAssignments()) { return $this; } $this->addFilterElement('assign_filter', $properties); $el = $this->getElement('assign_filter'); $this->addDisplayGroup(array($el), 'assign', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_ASSIGN, 'legend' => $this->translate('Assign where') )); return $this; } /** * Add a dataFilter element with fitting decorators * * TODO: Evaluate whether parts or all of this could be moved to the element * class. * * @param string $name Element name * @param array $properties Form element properties * * @return $this * @throws \Zend_Form_Exception */ protected function addFilterElement($name, $properties) { $this->addElement('dataFilter', $name, $properties); $el = $this->getElement($name); $ddClass = 'full-width'; if (array_key_exists('required', $properties) && $properties['required']) { $ddClass .= ' required'; } $el->clearDecorators() ->addDecorator('ViewHelper') ->addDecorator('Errors') ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) ->addDecorator('HtmlTag', array( 'tag' => 'dd', 'class' => $ddClass, )); return $this; } protected function addEventFilterElements($elements = array('states','types')) { if (in_array('states', $elements)) { $this->addElement('extensibleSet', 'states', array( 'label' => $this->translate('States'), 'multiOptions' => $this->optionallyAddFromEnum($this->enumStates()), 'description' => $this->translate( 'The host/service states you want to get notifications for' ), )); } if (in_array('types', $elements)) { $this->addElement('extensibleSet', 'types', array( 'label' => $this->translate('Transition types'), 'multiOptions' => $this->optionallyAddFromEnum($this->enumTypes()), 'description' => $this->translate( 'The state transition types you want to get notifications for' ), )); } $this->addDisplayGroup($elements, 'event_filters', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ), 'order' => self::GROUP_ORDER_EVENT_FILTERS, 'legend' => $this->translate('State and transition type filters') )); return $this; } /** * @param string $permission * @return bool */ public function hasPermission($permission) { return Util::hasPermission($permission); } public function setBranch(Branch $branch) { $this->branch = $branch; return $this; } protected function allowsExperimental() { // NO, it is NOT a good idea to use this. You'll break your monitoring // and nobody will help you. if ($this->allowsExperimental === null) { $this->allowsExperimental = $this->db->settings()->get( 'experimental_features' ) === 'allow'; } return $this->allowsExperimental; } protected function enumStates() { $set = new StateFilterSet(); return $set->enumAllowedValues(); } protected function enumTypes() { $set = new TypeFilterSet(); return $set->enumAllowedValues(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Element/000077500000000000000000000000001516513262500251465ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Form/Element/Boolean.php000066400000000000000000000037601516513262500272440ustar00rootroot00000000000000 '- please choose -', 'y' => 'Yes', 'n' => 'No', ); public function getValue() { $value = $this->getUnfilteredValue(); if ($value === 'y' || $value === true) { return true; } elseif ($value === 'n' || $value === false) { return false; } return null; } public function isValid($value, $context = null) { if ($value === 'y' || $value === 'n') { $this->setValue($value); return true; } return parent::isValid($value, $context); } /** * @param string $value * @param string $key * @codingStandardsIgnoreStart */ protected function _filterValue(&$value, &$key) { // @codingStandardsIgnoreEnd if ($value === true) { $value = 'y'; } elseif ($value === false) { $value = 'n'; } elseif ($value === '') { $value = null; } parent::_filterValue($value, $key); } public function setValue($value) { if ($value === true) { $value = 'y'; } elseif ($value === false) { $value = 'n'; } elseif ($value === '') { $value = null; } return parent::setValue($value); } /** * @codingStandardsIgnoreStart */ protected function _translateOption($option, $value) { // @codingStandardsIgnoreEnd if (!isset($this->_translated[$option]) && !empty($value)) { $this->options[$option] = mt('director', $value); if ($this->options[$option] === $value) { return false; } $this->_translated[$option] = true; return true; } return false; } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Element/DataFilter.php000066400000000000000000000242701516513262500277030ustar00rootroot00000000000000isEmpty($value)) { $value = null; } return $value; } protected function isEmpty(Filter $filter) { return $filter->isEmpty() || $this->isEmptyExpression($filter); } protected function isEmptyExpression(Filter $filter) { return $filter instanceof FilterExpression && $filter->getColumn() === '' && $filter->getExpression() === '""'; // -> json_encode('') } /** * @inheritdoc * @codingStandardsIgnoreStart */ protected function _filterValue(&$value, &$key) { // @codingStandardsIgnoreEnd try { if ($value instanceof Filter) { // OK } elseif (is_string($value)) { $value = Filter::fromQueryString($value); } elseif (is_array($value) || is_null($value)) { $value = $this->arrayToFilter($value); } else { throw new ProgrammingError( 'Value to be filtered has to be Filter, string, array or null' ); } } catch (Exception $e) { $value = null; // TODO: getFile, getLine // Hint: cannot addMessage at it would loop through getValue $this->addErrorMessage($e->getMessage()); $this->_isErrorForced = true; } } /** * This method transforms filter form data into a filter * and reacts on pressed buttons * * @param array|null $array * * @return FilterChain|null */ protected function arrayToFilter($array) { if ($array === null) { return null; } $this->filter = null; foreach ($array as $id => $entry) { $filterId = $this->idToFilterId($id); $sub = $this->entryToFilter($entry)->setId($filterId); $this->checkEntryForActions($filterId, $entry); $parentId = $this->parentIdFor($filterId); if ($this->filter === null) { $this->filter = $sub; } else { $this->filter->getById($parentId)->addFilter($sub); } } $this->removeFilterIfRequested() ->stripFilterIfRequested() ->addNewFilterIfRequested() ->fixNotsWithMultipleChildren(); return $this->filter; } protected function removeFilterIfRequested() { if ($this->removeFilter !== null) { if ($this->filter->getById($this->removeFilter)->isRootNode()) { $this->filter = $this->emptyExpression(); } else { $this->filter->removeId($this->removeFilter); } } return $this; } protected function stripFilterIfRequested() { if ($this->stripFilter !== null) { $strip = $this->stripFilter; $subId = $strip . '-1'; if ($this->filter->getId() === $strip) { $this->filter = $this->filter->getById($subId); } else { $this->filter->replaceById($strip, $this->filter->getById($subId)); } } return $this; } protected function addNewFilterIfRequested() { if ($this->addTo !== null) { $parent = $this->filter->getById($this->addTo); if ($parent instanceof FilterChain) { if ($parent->isEmpty()) { $parent->addFilter($this->emptyExpression()); } else { $parent->addFilter($this->emptyExpression()); } } elseif ($parent instanceof FilterExpression) { $replacement = Filter::matchAll(clone($parent)); if ($parent->isRootNode()) { $this->filter = $replacement; } else { $this->filter->replaceById($parent->getId(), $replacement); } } } return $this; } protected function fixNotsWithMultipleChildren() { $this->filter = $this->fixNotsWithMultipleChildrenForFilter($this->filter); return $this; } protected function fixNotsWithMultipleChildrenForFilter(Filter $filter) { if ($filter instanceof FilterChain) { if ($filter->getOperatorName() === 'NOT') { if ($filter->count() > 1) { $filter = $this->notToNotAnd($filter); } } /** @var Filter $sub */ foreach ($filter->filters() as $sub) { $filter->replaceById( $sub->getId(), $this->fixNotsWithMultipleChildrenForFilter($sub) ); } } return $filter; } protected function notToNotAnd(FilterChain $not) { $and = Filter::matchAll(); foreach ($not->filters() as $sub) { $and->addFilter(clone($sub)); } return Filter::not($and); } protected function emptyExpression() { return Filter::expression('', '=', ''); } protected function parentIdFor($id) { if (false === ($pos = strrpos($id, '-'))) { return '0'; } else { return substr($id, 0, $pos); } } protected function idToFilterId($id) { if (! preg_match('/^id_(new_)?(\d+(?:-\d+)*)$/', $id, $m)) { die('nono' . $id); } return $m[2]; } protected function checkEntryForActions($filterId, $entry) { switch ($this->entryAction($entry)) { case 'cancel': $this->removeFilter = $filterId; break; case 'minus': $this->stripFilter = $filterId; break; case 'plus': case 'angle-double-right': $this->addTo = $filterId; break; } } /** * Transforms a single submitted form component from an array * into a Filter object * * @param array $entry The array as submitted through the form * * @return Filter */ protected function entryToFilter($entry) { if (array_key_exists('operator', $entry)) { return Filter::chain($entry['operator']); } else { return $this->entryToFilterExpression($entry); } } protected function entryToFilterExpression($entry) { if ($entry['sign'] === 'true') { return Filter::expression( $entry['column'], '=', $this->jsonEncode(true) ); } elseif ($entry['sign'] === 'false') { return Filter::expression( $entry['column'], '=', $this->jsonEncode(false) ); } elseif ($entry['sign'] === 'in') { if (array_key_exists('value', $entry)) { if (is_array($entry['value'])) { $value = array_filter($entry['value'], 'strlen'); } elseif (empty($entry['value'])) { $value = array(); } else { $value = array($entry['value']); } } else { $value = array(); } return Filter::expression( $entry['column'], '=', $this->jsonEncode($value) ); } elseif ($entry['sign'] === 'contains') { $value = array_key_exists('value', $entry) ? $entry['value'] : null; return Filter::expression( $this->jsonEncode($value), '=', $entry['column'] ); } else { $value = array_key_exists('value', $entry) ? $entry['value'] : null; return Filter::expression( $entry['column'], $entry['sign'], $this->jsonEncode($value) ); } } protected function jsonEncode($string) { return preg_replace( ['/&/u', '/\|/u', '/!/u', '/=/u', '/>/u', '/characterIconName($entry['action']); } return null; } protected function hasIncompleteExpressions(Filter $filter) { if ($filter instanceof FilterChain) { foreach ($filter->filters() as $sub) { if ($this->hasIncompleteExpressions($sub)) { return true; } } return false; } else { /** @var FilterExpression $filter */ if ($filter->isRootNode() && $this->isEmptyExpression($filter)) { return false; } return $filter->getColumn() === ''; } } public function isValid($value, $context = null) { if (! $value instanceof Filter) { // TODO: try, return false on E $filter = $this->arrayToFilter($value); $this->setValue($filter); } else { $filter = $value; } if ($this->hasIncompleteExpressions($filter)) { $this->addError('The configured filter is incomplete'); return false; } return parent::isValid($value); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Element/ExtensibleSet.php000066400000000000000000000040561516513262500304420ustar00rootroot00000000000000_errorMessages; // @codingStandardsIgnoreEnd } /** * @codingStandardsIgnoreStart */ protected function _filterValue(&$value, &$key) { // @codingStandardsIgnoreEnd if (is_array($value)) { $value = array_filter($value, 'strlen'); } elseif (is_string($value) && !strlen($value)) { $value = null; } parent::_filterValue($value, $key); } public function isValid($value, $context = null) { if ($value === null) { $value = []; } $value = array_filter($value, 'strlen'); $this->setValue($value); if ($this->isRequired() && empty($value)) { // TODO: translate $this->addError('You are required to choose at least one element'); return false; } if ($this->hasErrors()) { return false; } return parent::isValid($value, $context); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Element/FormElement.php000066400000000000000000000002171516513262500300740ustar00rootroot00000000000000instances = $value; return $this; } public function getValue() { return Html::tag('span', [ Html::tag('italic', 'empty'), ' ', Link::create('Manage Instances', 'director/data/dictionary', $this->linkParams, [ 'data-base-target' => '_next', 'class' => 'icon-forward' ]) ]); } public function isValid($value, $context = null) { return true; } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Element/OptionalYesNo.php000066400000000000000000000006471516513262500304310ustar00rootroot00000000000000getUnfilteredValue(); if ($value === 'y' || $value === true) { return 'y'; } elseif ($value === 'n' || $value === false) { return 'n'; } return null; } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Element/SimpleNote.php000066400000000000000000000013261516513262500277400ustar00rootroot00000000000000setAttrib('sentValue', $sentValue); } } else { $sentValue = null; } if ($value === self::UNCHANGED) { return $this; } else { // Workaround for issue with modified DataTypes. This is Director-specific if (\is_array($value)) { $value = \json_encode($value); } return parent::setValue((string) $value); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Element/Text.php000066400000000000000000000004711516513262500266050ustar00rootroot00000000000000 'Yes', 'n' => 'No', ); } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Filter/000077500000000000000000000000001516513262500250025ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Form/Filter/QueryColumnsFromSql.php000066400000000000000000000023361516513262500314710ustar00rootroot00000000000000form = $form; } public function filter($value) { $form = $this->form; if (empty($value) || $form->hasChangedSetting('query')) { try { return implode( ', ', $this->getQueryColumns($form->getSentOrObjectSetting('query')) ); } catch (Exception $e) { $this->form->addUniqueException($e); return ''; } } else { return $value; } } protected function getQueryColumns($query) { $resourceName = $this->form->getSentOrObjectSetting('resource'); if (! $resourceName) { return []; } $db = DbConnection::fromResourceName($resourceName)->getDbAdapter(); return array_keys((array) current($db->fetchAll($query))); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/FormLoader.php000066400000000000000000000026031516513262500263210ustar00rootroot00000000000000getApplicationDir('forms'); } catch (ProgrammingError $e) { throw new RuntimeException($e->getMessage(), 0, $e); } $ns = '\\Icinga\\Web\\Forms\\'; } else { $basedir = $module->getFormDir(); $ns = '\\Icinga\\Module\\' . ucfirst($module->getName()) . '\\Forms\\'; } if (preg_match('~^[a-z0-9/]+$~i', $name)) { $parts = preg_split('~/~', $name); $class = ucfirst(array_pop($parts)) . 'Form'; $file = sprintf('%s/%s/%s.php', rtrim($basedir, '/'), implode('/', $parts), $class); if (file_exists($file)) { require_once($file); $class = $ns . $class; $options = array(); if ($module !== null) { $options['icingaModule'] = $module; } return new $class($options); } } throw new RuntimeException(sprintf('Cannot load %s (%s), no such form', $name, $file)); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/IcingaObjectFieldLoader.php000066400000000000000000000437311516513262500307120ustar00rootroot00000000000000 'varName' */ protected $nameMap = array(); public function __construct(IcingaObject $object) { $this->object = $object; $this->connection = $object->getConnection(); $this->db = $this->connection->getDbAdapter(); } public function addFieldsToForm(DirectorObjectForm $form) { if ($this->fields || $this->object->supportsFields()) { $this->attachFieldsToForm($form); } return $this; } /** * Get element names to variable names map (Example: ['elName' => 'varName']) * * @return array */ public function getNameMap(): array { return $this->nameMap; } public function loadFieldsForMultipleObjects($objects) { $fields = array(); foreach ($objects as $object) { foreach ($this->prepareObjectFields($object) as $varname => $field) { $varname = $field->get('varname'); if (array_key_exists($varname, $fields)) { if ($field->get('datatype') !== $fields[$varname]->datatype) { unset($fields[$varname]); } continue; } $fields[$varname] = $field; } } $this->fields = $fields; return $this; } /** * Set a list of values * * Works in a fail-safe way, when a field does not exist the value will be * silently ignored * * @param array $values key/value pairs with variable names and their value * @param string $prefix An optional prefix that would be stripped from keys * * @return IcingaObjectFieldLoader * * @throws IcingaException */ public function setValues($values, $prefix = null) { if (! $this->object->supportsCustomVars()) { return $this; } if ($prefix === null) { $len = null; } else { $len = strlen($prefix); } $vars = $this->object->vars(); foreach ($values as $key => $value) { if ($len !== null) { if (substr($key, 0, $len) === $prefix) { $key = substr($key, $len); } else { continue; } } $varName = $this->getElementVarName($prefix . $key); if ($varName === null) { // throw new IcingaException( // 'Cannot set variable value for "%s", got no such element', // $key // ); // Silently ignore additional fields. One might have switched // template or command continue; } $el = $this->getElement($varName); if ($el === null) { // throw new IcingaException('No such element %s', $key); // Same here. continue; } $el->setValue($value); $value = $el->getValue(); if ($value === '' || $value === array()) { $value = null; } $vars->set($varName, $value); } // Hint: this does currently not happen, as removeFilteredFields did not // take place yet. This has been added to be on the safe side when // cleaning things up one future day foreach ($this->forceNull as $key) { $vars->set($key, null); } return $this; } /** * Get the fields for our object * * @return DirectorDatafield[] */ public function getFields() { if ($this->fields === null) { $this->fields = $this->prepareObjectFields($this->object); } return $this->fields; } /** * Get the form elements for our fields * * @param DirectorObjectForm $form Optional * * @return ZfElement[] */ public function getElements(DirectorObjectForm $form = null) { if ($this->elements === null) { $this->elements = $this->createElements($form); $this->setValuesFromObject($this->object); } return $this->elements; } /** * Prepare the form elements for our fields * * @param DirectorObjectForm $form Optional * * @return self */ public function prepareElements(DirectorObjectForm $form = null) { if ($this->object->supportsFields()) { $this->getElements($form); } return $this; } /** * Attach our form fields to the given form * * This will also create a 'Custom properties' display group * * @param DirectorObjectForm $form */ protected function attachFieldsToForm(DirectorObjectForm $form) { if ($this->fields === null) { return; } $elements = $this->removeFilteredFields($this->getElements($form)); foreach ($elements as $element) { $form->addElement($element); } $this->attachGroupElements($elements, $form); } /** * @param ZfElement[] $elements * @param DirectorObjectForm $form */ protected function attachGroupElements(array $elements, DirectorObjectForm $form) { $categories = []; $categoriesFetchedById = []; foreach ($this->fields as $key => $field) { if ($id = $field->get('category_id')) { if (isset($categoriesFetchedById[$id])) { $category = $categoriesFetchedById[$id]; } else { $category = DirectorDatafieldCategory::loadWithAutoIncId($id, $form->getDb()); $categoriesFetchedById[$id] = $category; } } elseif ($field->hasCategory()) { $category = $field->getCategory(); } else { continue; } $categories[$key] = $category; } $prioIdx = \array_flip(\array_keys($categories)); foreach ($elements as $key => $element) { if (isset($categories[$key])) { $category = $categories[$key]; $form->addElementsToGroup( [$element], 'custom_fields:' . $category->get('category_name'), DirectorObjectForm::GROUP_ORDER_CUSTOM_FIELD_CATEGORIES + $prioIdx[$key], $category->get('category_name') ); } else { $form->addElementsToGroup( [$element], 'custom_fields', DirectorObjectForm::GROUP_ORDER_CUSTOM_FIELDS, $form->translate('Custom properties') ); } } } /** * @param ZfElement[] $elements * @return ZfElement[] */ protected function removeFilteredFields(array $elements) { $filters = array(); foreach ($this->fields as $key => $field) { if ($filter = $field->var_filter) { $filters[$key] = Filter::fromQueryString($filter); } } $kill = array(); $columns = array(); $object = $this->object; if ($object instanceof IcingaHost) { $prefix = 'host.vars.'; } elseif ($object instanceof IcingaService) { $prefix = 'service.vars.'; } else { return $elements; } $object->invalidateResolveCache(); $vars = $object::fromPlainObject( $object->toPlainObject(true), $object->getConnection() )->getVars(); $prefixedVars = (object) array(); foreach ($vars as $k => $v) { $prefixedVars->{$prefix . $k} = $v; } foreach ($filters as $key => $filter) { ObjectApplyMatches::fixFilterColumns($filter); /** @var $filter FilterChain|FilterExpression */ foreach ($filter->listFilteredColumns() as $column) { $column = substr($column, strlen($prefix)); $columns[$column] = $column; } if (! $filter->matches($prefixedVars)) { $kill[] = $key; } } $vars = $object->vars(); foreach ($kill as $key) { unset($elements[$key]); $this->forceNull[$key] = $key; // Hint: this should happen later on, currently execution order is // a little bit weird $vars->set($key, null); } foreach ($columns as $col) { if (array_key_exists($col, $elements)) { $el = $elements[$col]; $existingClass = $el->getAttrib('class'); if ($existingClass !== null && strlen($existingClass)) { $el->setAttrib('class', $existingClass . ' autosubmit'); } else { $el->setAttrib('class', 'autosubmit'); } } } return $elements; } protected function getElementVarName($name) { if (array_key_exists($name, $this->nameMap)) { return $this->nameMap[$name]; } return null; } /** * Get the form element for a specific field by it's variable name * * @param string $name * @return null|ZfElement */ protected function getElement($name) { $elements = $this->getElements(); if (array_key_exists($name, $elements)) { return $this->elements[$name]; } return null; } /** * Get the form elements based on the given form * * @param DirectorObjectForm $form * * @return ZfElement[] */ protected function createElements(DirectorObjectForm $form) { $elements = array(); foreach ($this->getFields() as $name => $field) { $el = $field->getFormElement($form); $elName = $el->getName(); if (array_key_exists($elName, $this->nameMap)) { $form->addErrorMessage(sprintf( 'Form element name collision, "%s" resolves to "%s", but this is also used for "%s"', $name, $elName, $this->nameMap[$elName] )); } $this->nameMap[$elName] = $name; $elements[$name] = $el; } return $elements; } /** * @param IcingaObject $object */ protected function setValuesFromObject(IcingaObject $object) { foreach ($object->getVars() as $k => $v) { if ($v !== null && $el = $this->getElement($k)) { $el->setValue($v); } } } protected function mergeFields($listOfFields) { // TODO: Merge field for different object, mostly sets } /** * Create the fields for our object * * @param IcingaObject $object * @return DirectorDatafield[] */ protected function prepareObjectFields($object) { $fields = $this->loadResolvedFieldsForObject($object); if ($object->hasRelation('check_command')) { try { /** @var IcingaCommand $command */ $command = $object->getResolvedRelated('check_command'); } catch (Exception $e) { // Ignore failures $command = null; } if ($command) { $cmdLoader = new static($command); $cmdFields = $cmdLoader->getFields(); foreach ($cmdFields as $varname => $field) { if (! array_key_exists($varname, $fields)) { $fields[$varname] = $field; } } } // TODO -> filters! } return $fields; } /** * Create the fields for our object * * Follows the inheritance logic, resolves all fields and keeps the most * specific ones. Returns a list of fields indexed by variable name * * @param IcingaObject $object * * @return DirectorDatafield[] */ protected function loadResolvedFieldsForObject(IcingaObject $object) { $result = $this->loadDataFieldsForObject( $object ); $fields = array(); foreach ($result as $objectId => $varFields) { foreach ($varFields as $var => $field) { $fields[$var] = $field; } } return $fields; } /** * @param IcingaObject[] $objectList List of objects * * @return array */ protected function getIdsForObjectList($objectList) { $ids = []; foreach ($objectList as $object) { if ($object->hasBeenLoadedFromDb()) { $ids[] = $object->get('id'); } } return $ids; } public function fetchFieldDetailsForObject(IcingaObject $object) { $ids = $object->listAncestorIds(); if ($id = $object->getProperty('id')) { $ids[] = $id; } return $this->fetchFieldDetailsForIds($ids); } /*** * @param $objectIds * * @return \stdClass[] */ protected function fetchFieldDetailsForIds($objectIds) { if (empty($objectIds)) { return []; } $query = $this->prepareSelectForIds($objectIds); return $this->db->fetchAll($query); } /** * @param array $ids * * @return ZfSelect */ protected function prepareSelectForIds(array $ids) { $object = $this->object; $idColumn = 'f.' . $object->getShortTableName() . '_id'; $query = $this->db->select()->from( array('df' => 'director_datafield'), array( 'object_id' => $idColumn, 'icinga_type' => "('" . $object->getShortTableName() . "')", 'var_filter' => 'f.var_filter', 'is_required' => 'f.is_required', 'id' => 'df.id', 'category_id' => 'df.category_id', 'varname' => 'df.varname', 'caption' => 'df.caption', 'description' => 'df.description', 'datatype' => 'df.datatype', 'format' => 'df.format', ) )->join( array('f' => $object->getTableName() . '_field'), 'df.id = f.datafield_id', array() )->where($idColumn . ' IN (?)', $ids) ->order('CASE WHEN var_filter IS NULL THEN 0 ELSE 1 END ASC') ->order('df.caption ASC'); return $query; } /** * Fetches fields for a given object * * Gives a list indexed by object id, with each entry being a list of that * objects DirectorDatafield instances indexed by variable name * * @param IcingaObject $object * * @return array */ public function loadDataFieldsForObject(IcingaObject $object) { $res = $this->fetchFieldDetailsForObject($object); $result = []; foreach ($res as $r) { $id = $r->object_id; unset($r->object_id); if (! array_key_exists($id, $result)) { $result[$id] = new stdClass(); } $result[$id]->{$r->varname} = DirectorDatafield::fromDbRow( $r, $this->connection ); } foreach ($this->loadHookedDataFieldForObject($object) as $id => $fields) { if (array_key_exists($id, $result)) { foreach ($fields as $varName => $field) { $result[$id]->$varName = $field; } } else { $result[$id] = $fields; } } return $result; } /** * @param IcingaObject $object * @return array */ protected function loadHookedDataFieldForObject(IcingaObject $object) { $fields = []; if ($object instanceof IcingaHost || $object instanceof IcingaService) { $fields = $this->addHookedFields($object); } return $fields; } /** * @param IcingaObject $object * @return mixed */ protected function addHookedFields(IcingaObject $object) { $fields = []; /** @var HostFieldHook|ServiceFieldHook $hook */ $type = ucfirst($object->getShortTableName()); foreach (Hook::all("Director\\{$type}Field") as $hook) { if ($hook->wants($object)) { $id = $object->get('id'); $spec = $hook->getFieldSpec($object); if (!array_key_exists($id, $fields)) { $fields[$id] = new stdClass(); } $fields[$id]->{$spec->getVarName()} = $spec->toDataField($object); } } return $fields; } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/IconHelper.php000066400000000000000000000045141516513262500263220ustar00rootroot00000000000000getApplicationDir('fonts/fontello-ifont/config.json'); * * $font = json_decode(file_get_contents($confFile)); * // 'icon-' is to be found in $font->css_prefix_text * foreach ($font->glyphs as $icon) { * // $icon->css (= 'help') -> 0x . dechex($icon->code) * } */ class IconHelper { private $icons = array( 'minus' => 'e806', 'trash' => 'e846', 'plus' => 'e805', 'cancel' => 'e804', 'help' => 'e85b', 'angle-double-right' => 'e87b', 'up-big' => 'e825', 'down-big' => 'e828', 'down-open' => 'e821', ); private $mappedUtf8Icons; private $reversedUtf8Icons; private static $instance; public function __construct() { $this->prepareIconMappings(); } public static function instance() { if (self::$instance === null) { self::$instance = new static(); } return self::$instance; } public function characterIconName($character) { if (array_key_exists($character, $this->reversedUtf8Icons)) { return $this->reversedUtf8Icons[$character]; } else { throw new ProgrammingError('There is no mapping for the given character'); } } protected function hexToCharacter($hex) { return json_decode('"\u' . $hex . '"'); } public function iconCharacter($name) { if (array_key_exists($name, $this->mappedUtf8Icons)) { return $this->mappedUtf8Icons[$name]; } else { return $this->mappedUtf8Icons['help']; } } protected function prepareIconMappings() { $this->mappedUtf8Icons = array(); $this->reversedUtf8Icons = array(); foreach ($this->icons as $name => $hex) { $character = $this->hexToCharacter($hex); $this->mappedUtf8Icons[$name] = $character; $this->reversedUtf8Icons[$character] = $name; } } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/IplElement/000077500000000000000000000000001516513262500256135ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Form/IplElement/ExtensibleSetElement.php000066400000000000000000000362471516513262500324300ustar00rootroot00000000000000 'extensible-set' ]; protected function __construct($name) { $this->name = $this->id = $name; } public function hideOptions($options) { $this->hideOptions = array_merge($this->hideOptions, $options); return $this; } private function setMultiOptions($options) { $this->multiOptions = $options; $this->validOptions = $this->flattenOptions($options); } protected function isValidOption($option) { if ($this->validOptions === null) { if ($this->suggestionContext === null) { return true; } else { // TODO: ask suggestionContext, if any return true; } } else { return in_array($option, $this->validOptions); } } private function disable($disable = true) { $this->disabled = (bool) $disable; } private function isDisabled() { return $this->disabled; } private function isSorted() { return $this->sorted; } public function setValue($value) { if ($value instanceof Set) { $value = $value->toPlainObject(); } if (is_array($value)) { $value = array_filter($value, 'strlen'); } if (null !== $value && ! is_array($value)) { throw new ProgrammingError( 'Got unexpected value, no array: %s', var_export($value, true) ); } $this->value = $value; return $this; } protected function extractZfInfo(&$attribs = null) { if ($attribs === null) { return; } foreach (['id', 'name', 'descriptions'] as $key) { if (array_key_exists($key, $attribs)) { $this->$key = $attribs[$key]; unset($attribs[$key]); } } if (array_key_exists('disable', $attribs)) { $this->disable($attribs['disable']); unset($attribs['disable']); } if (array_key_exists('value', $attribs)) { $this->setValue($attribs['value']); unset($attribs['value']); } if (array_key_exists('inherited', $attribs)) { $this->inherited = $attribs['inherited']; unset($attribs['inherited']); } if (array_key_exists('inheritedFrom', $attribs)) { $this->inheritedFrom = $attribs['inheritedFrom']; unset($attribs['inheritedFrom']); } if (array_key_exists('multiOptions', $attribs)) { $this->setMultiOptions($attribs['multiOptions']); unset($attribs['multiOptions']); } if (array_key_exists('hideOptions', $attribs)) { $this->hideOptions($attribs['hideOptions']); unset($attribs['hideOptions']); } if (array_key_exists('sorted', $attribs)) { $this->sorted = (bool) $attribs['sorted']; unset($attribs['sorted']); } if (array_key_exists('description', $attribs)) { $this->description = $attribs['description']; unset($attribs['description']); } if (array_key_exists('suggest', $attribs)) { $this->suggestionContext = $attribs['suggest']; unset($attribs['suggest']); } if (! empty($attribs)) { $this->remainingAttribs = $attribs; } } /** * Generates an 'extensible set' element. * * @codingStandardsIgnoreEnd * * @param string|array $name If a string, the element name. If an * array, all other parameters are ignored, and the array elements * are used in place of added parameters. * * @param mixed $value The element value. * * @param array $attribs Attributes for the element tag. * * @return string The element XHTML. */ public static function fromZfDingens($name, $value = null, $attribs = null) { $el = new static($name); $el->extractZfInfo($attribs); $el->setValue($value); return $el->render(); } protected function assemble() { $this->addChosenOptions(); $this->addAddMore(); if ($this->isSorted()) { $this->getAttributes()->add('class', 'sortable'); } if (null !== $this->description) { $this->addDescription($this->description); } } private function eventuallyAddAutosuggestion(BaseHtmlElement $element) { if ($this->suggestionContext !== null) { $attrs = $element->getAttributes(); $attrs->add('class', 'director-suggest'); $attrs->set([ 'data-suggestion-context' => $this->suggestionContext, ]); } return $element; } private function hasAvailableMultiOptions() { return count($this->multiOptions) > 1 || strlen(key($this->multiOptions)); } private function addAddMore() { $cnt = $this->chosenOptionCount; if ($this->multiOptions) { if (! $this->hasAvailableMultiOptions()) { return; } $field = Html::tag('select', ['class' => 'autosubmit']); $more = $this->inherited === null ? $this->translate('- add more -') : $this->getInheritedInfo(); $field->add(Html::tag('option', [ 'value' => '', 'tabindex' => '-1' ], $more)); foreach ($this->multiOptions as $key => $label) { if ($key === null) { $key = ''; } if (is_array($label)) { $optGroup = Html::tag('optgroup', ['label' => $key]); foreach ($label as $grpKey => $grpLabel) { $optGroup->add( Html::tag('option', ['value' => $grpKey], $grpLabel) ); } $field->add($optGroup); } else { $option = Html::tag('option', ['value' => $key], $label); $field->add($option); } } } else { $field = Html::tag('input', [ 'type' => 'text', 'placeholder' => $this->inherited === null ? $this->translate('Add a new one...') : $this->getInheritedInfo(), ]); } $field->addAttributes([ 'id' => $this->id . $this->suffix($cnt), 'name' => $this->name . '[]', ]); $this->eventuallyAddAutosuggestion( $this->addRemainingAttributes( $this->eventuallyDisable($field) ) ); if ($cnt !== 0) { // TODO: was === 0?! $field->getAttributes()->add('class', 'extend-set'); } if ($this->suggestionContext === null) { $this->add(Html::tag('li', null, [ $this->createAddNewButton(), $field ])); } else { $this->add(Html::tag('li', null, [ $this->newInlineButtons( $this->renderDropDownButton() ), $field ])); } } private function getInheritedInfo() { if ($this->inheritedFrom === null) { return \sprintf( $this->translate('%s (inherited)'), $this->stringifyInheritedValue() ); } else { return \sprintf( $this->translate('%s (inherited from %s)'), $this->stringifyInheritedValue(), $this->inheritedFrom ); } } private function stringifyInheritedValue() { if (\is_array($this->inherited)) { return \implode(', ', $this->inherited); } else { return \sprintf( $this->translate('%s (not an Array!)'), \var_export($this->inherited, true) ); } } private function createAddNewButton() { return $this->newInlineButtons( $this->eventuallyDisable($this->renderAddButton()) ); } private function addChosenOptions() { if (null === $this->value) { return; } $total = count($this->value); foreach ($this->value as $val) { if (in_array($val, $this->hideOptions)) { continue; } if ($this->multiOptions !== null) { if ($this->isValidOption($val)) { $this->multiOptions = $this->removeOption( $this->multiOptions, $val ); // TODO: // $this->removeOption($val); } } $text = Html::tag('input', [ 'type' => 'text', 'name' => $this->name . '[]', 'id' => $this->id . $this->suffix($this->chosenOptionCount), 'value' => $val ]); $text->getAttributes()->set([ 'autocomplete' => 'off', 'autocorrect' => 'off', 'autocapitalize' => 'off', 'spellcheck' => 'false', ]); $this->addRemainingAttributes($this->eventuallyDisable($text)); $this->add(Html::tag('li', null, [ $this->getOptionButtons($this->chosenOptionCount, $total), $text ])); $this->chosenOptionCount++; } } private function addRemainingAttributes(BaseHtmlElement $element) { if ($this->remainingAttribs !== null) { $element->getAttributes()->add($this->remainingAttribs); } return $element; } private function eventuallyDisable(BaseHtmlElement $element) { if ($this->isDisabled()) { $this->disableElement($element); } return $element; } private function disableElement(BaseHtmlElement $element) { $element->getAttributes()->set('disabled', 'disabled'); return $element; } private function disableIf(BaseHtmlElement $element, $condition) { if ($condition) { $this->disableElement($element); } return $element; } private function getOptionButtons($cnt, $total) { if ($this->isDisabled()) { return []; } $first = $cnt === 0; $last = $cnt === $total - 1; $name = $this->name; $buttons = $this->newInlineButtons(); if ($this->isSorted()) { $buttons->add([ $this->disableIf($this->renderDownButton($name, $cnt), $last), $this->disableIf($this->renderUpButton($name, $cnt), $first) ]); } $buttons->add($this->renderDeleteButton($name, $cnt)); return $buttons; } protected function newInlineButtons($content = null) { return Html::tag('span', ['class' => 'inline-buttons'], $content); } protected function addDescription($description) { $this->add( Html::tag('p', ['class' => 'description'], $description) ); } private function flattenOptions($options) { $flat = array(); foreach ($options as $key => $option) { if (is_array($option)) { foreach ($option as $k => $o) { $flat[] = $k; } } else { $flat[] = $key; } } return $flat; } private function removeOption($options, $option) { $unset = array(); foreach ($options as $key => & $value) { if (is_array($value)) { $value = $this->removeOption($value, $option); if (empty($value)) { $unset[] = $key; } } elseif ($key === $option) { $unset[] = $key; } } foreach ($unset as $key) { unset($options[$key]); } return $options; } private function suffix($cnt) { if ($cnt === 0) { return ''; } else { return '_' . $cnt; } } private function renderDropDownButton() { return $this->createRelatedAction( 'drop-down', $this->name, $this->translate('Show available options'), 'down-open' ); } private function renderAddButton() { return $this->createRelatedAction( 'add', // This would interfere with how PHP resolves _POST arrays. So we // use a fake name for now, that way the button will be ignored and // behave similar to an auto-submission 'X_' . $this->name, $this->translate('Add a new entry'), 'plus' ); } private function renderDeleteButton($name, $cnt) { return $this->createRelatedAction( 'remove', $name . '_' . $cnt, $this->translate('Remove this entry'), 'cancel' ); } private function renderUpButton($name, $cnt) { return $this->createRelatedAction( 'move-up', $name . '_' . $cnt, $this->translate('Move up'), 'up-big' ); } private function renderDownButton($name, $cnt) { return $this->createRelatedAction( 'move-down', $name . '_' . $cnt, $this->translate('Move down'), 'down-big' ); } protected function makeActionName($name, $action) { return $name . '__' . str_replace('-', '_', strtoupper($action)); } protected function createRelatedAction( $action, $name, $title, $icon ) { $input = Html::tag('input', [ 'type' => 'submit', 'class' => ['related-action', 'action-' . $action], 'name' => $this->makeActionName($name, $action), 'value' => IconHelper::instance()->iconCharacter($icon), 'title' => $title ]); return $input; } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/PropertyTableSortForm.php000066400000000000000000000031171516513262500305600ustar00rootroot00000000000000name = $name; $this->table = $table; } protected function assemble() { $this->addElement('hidden', '__FORM_NAME', ['value' => $this->name]); $this->addElement($this->createCsrfCounterMeasure()); $this->addHtml($this->table); } /** * Create a form element to countermeasure CSRF attacks * * @return FormElement */ protected function createCsrfCounterMeasure(): FormElement { $token = CsrfToken::generate(); $options = [ 'ignore' => true, 'required' => true, 'validators' => ['Callback' => function ($token) { return CsrfToken::isValid($token); }] ]; $element = new class (QuickForm::CSRF, $options) extends HiddenElement { public function hasValue(): bool { return true; // The validator must run even if the value is empty } }; $element->getAttributes()->registerAttributeCallback('value', function () use ($token) { return $token; }); return $element; } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/QuickBaseForm.php000066400000000000000000000103401516513262500267570ustar00rootroot00000000000000callZfConstructor($this->handleOptions($options)) ->initializePrefixPaths(); } protected function callZfConstructor($options = null) { parent::__construct($options); return $this; } protected function initializePrefixPaths() { $this->addPrefixPathsForDirector(); if ($this->icingaModule && $this->icingaModuleName !== 'director') { $this->addPrefixPathsForModule($this->icingaModule); } } protected function addPrefixPathsForDirector() { $module = Icinga::app() ->getModuleManager() ->loadModule('director') ->getModule('director'); $this->addPrefixPathsForModule($module); } public function addPrefixPathsForModule(Module $module) { $basedir = sprintf( '%s/%s/Web/Form', $module->getLibDir(), ucfirst($module->getName()) ); $this->addPrefixPath( __NAMESPACE__ . '\\Element\\', $basedir . '/Element', static::ELEMENT ); return $this; } public function addHidden($name, $value = null) { $this->addElement('hidden', $name); $el = $this->getElement($name); $el->setDecorators(array('ViewHelper')); if ($value !== null) { $this->setDefault($name, $value); $el->setValue($value); } return $this; } // TODO: Should be an element public function addHtmlHint($html, $options = []) { return $this->addHtml( Html::tag('div', ['class' => 'hint'], $html), $options ); } public function addHtml($html, $options = []) { if ($html instanceof ValidHtml) { $html = $html->render(); } if (array_key_exists('name', $options)) { $name = $options['name']; unset($options['name']); } else { $name = '_HINT' . ++$this->hintCount; } $this->addElement('simpleNote', $name, $options); $this->getElement($name) ->setValue($html) ->setIgnore(true) ->setDecorators(array('ViewHelper')); return $this; } public function optionalEnum($enum, $nullLabel = null) { if ($nullLabel === null) { $nullLabel = $this->translate('- please choose -'); } return array(null => $nullLabel) + $enum; } protected function handleOptions($options = null) { if ($options === null) { return $options; } if (array_key_exists('icingaModule', $options)) { /** @var Module icingaModule */ $this->icingaModule = $options['icingaModule']; $this->icingaModuleName = $this->icingaModule->getName(); unset($options['icingaModule']); } return $options; } public function setIcingaModule(Module $module) { $this->icingaModule = $module; return $this; } protected function loadForm($name, Module $module = null) { if ($module === null) { $module = $this->icingaModule; } return FormLoader::load($name, $module); } protected function valueIsEmpty($value) { if ($value === null) { return true; } if (is_array($value)) { return empty($value); } return strlen($value) === 0; } public function translate($string) { if ($this->icingaModuleName === null) { return t($string); } else { return mt($this->icingaModuleName, $string); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/QuickForm.php000066400000000000000000000375051516513262500262000ustar00rootroot00000000000000setMethod('post'); $this->getActionFromRequest() ->createIdElement() ->regenerateCsrfToken() ->setPreferredDecorators(); } protected function getActionFromRequest() { $this->setAction(Url::fromRequest()); return $this; } protected function setPreferredDecorators() { $current = $this->getAttrib('class'); $current .= ' director-form'; if ($current) { $this->setAttrib('class', "$current autofocus"); } else { $this->setAttrib('class', 'autofocus'); } $this->setDecorators( array( 'Description', array('FormErrors', array('onlyCustomFormErrors' => true)), 'FormElements', 'Form' ) ); return $this; } protected function addSubmitButton($label, $options = []) { $el = $this->createElement('submit', $label, $options) ->setLabel($label) ->setDecorators(array('ViewHelper')); $this->submitButtonName = $el->getName(); $this->setSubmitLabel($label); $this->addElement($el); } protected function addStandaloneSubmitButton($label, $options = []) { $this->addSubmitButton($label, $options); $this->addDisplayGroup([$this->submitButtonName], 'buttons', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'p')), ), 'order' => 1000, )); } protected function addSubmitButtonIfSet() { if (false === ($label = $this->getSubmitLabel())) { return; } if ($this->submitButtonName && $el = $this->getElement($this->submitButtonName)) { return; } $this->addSubmitButton($label); $fakeEl = $this->createElement('submit', '_FAKE_SUBMIT', array( 'role' => 'none', 'tabindex' => '-1', )) ->setLabel($label) ->setDecorators(array('ViewHelper')); $this->fakeSubmitButtonName = $fakeEl->getName(); $this->addElement($fakeEl); $this->addDisplayGroup( array($this->fakeSubmitButtonName), 'fake_button', array( 'decorators' => array('FormElements'), 'order' => 1, ) ); $this->addButtonDisplayGroup(); } protected function addButtonDisplayGroup() { $grp = array( $this->submitButtonName, $this->deleteButtonName ); $this->addDisplayGroup($grp, 'buttons', array( 'decorators' => array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'DtDdWrapper', ), 'order' => 1000, )); } protected function addSimpleDisplayGroup($elements, $name, $options) { if (! array_key_exists('decorators', $options)) { $options['decorators'] = array( 'FormElements', array('HtmlTag', array('tag' => 'dl')), 'Fieldset', ); } return $this->addDisplayGroup($elements, $name, $options); } protected function createIdElement() { if ($this->isApiRequest()) { return $this; } $this->detectName(); $this->addHidden(self::ID, $this->getName()); $this->getElement(self::ID)->setIgnore(true); return $this; } public function getSentValue($name, $default = null) { $request = $this->getRequest(); if ($request->isPost() && $this->hasBeenSent()) { return $request->getPost($name); } else { return $default; } } public function getSubmitLabel() { if ($this->submitLabel === null) { return $this->translate('Submit'); } return $this->submitLabel; } public function setSubmitLabel($label) { $this->submitLabel = $label; return $this; } public function setApiRequest($isApiRequest = true) { $this->isApiRequest = $isApiRequest; return $this; } public function isApiRequest() { if ($this->isApiRequest === null) { if ($this->request === null) { throw new RuntimeException( 'Early access to isApiRequest(). This is not possible, sorry' ); } return $this->getRequest()->isApiRequest(); } else { return $this->isApiRequest; } } public function regenerateCsrfToken() { if ($this->isApiRequest()) { return $this; } if (! $element = $this->getElement(self::CSRF)) { $this->addHidden(self::CSRF, CsrfToken::generate()); $element = $this->getElement(self::CSRF); } $element->setIgnore(true); return $this; } public function removeCsrfToken() { $this->removeElement(self::CSRF); return $this; } public function setSuccessUrl($url, $params = null) { if (! $url instanceof Url) { $url = Url::fromPath($url); } if ($params !== null) { $url->setParams($params); } $this->successUrl = $url; return $this; } public function getSuccessUrl() { $url = $this->successUrl ?: $this->getAction(); if (! $url instanceof Url) { $url = Url::fromPath($url); } return $url; } protected function beforeSetup() { } public function setup() { } protected function onSetup() { } public function setAction($action) { if ($action instanceof Url) { $action = $action->getAbsoluteUrl('&'); } return parent::setAction($action); } public function hasBeenSubmitted() { if ($this->hasBeenSubmitted === null) { $req = $this->getRequest(); if ($req->isApiRequest()) { return $this->hasBeenSubmitted = true; } if ($req->isPost()) { if (! $this->hasSubmitButton()) { return $this->hasBeenSubmitted = $this->hasBeenSent(); } $this->hasBeenSubmitted = $this->pressedButton( $this->fakeSubmitButtonName, $this->getSubmitLabel() ) || $this->pressedButton( $this->submitButtonName, $this->getSubmitLabel() ); } else { $this->hasBeenSubmitted = false; } } return $this->hasBeenSubmitted; } protected function hasSubmitButton() { return $this->submitButtonName !== null; } protected function pressedButton($name, $label) { $req = $this->getRequest(); if (! $req->isPost()) { return false; } $req = $this->getRequest(); $post = $req->getPost(); return array_key_exists($name, $post) && $post[$name] === $label; } protected function beforeValidation($data = array()) { } public function prepareElements() { if (! $this->didSetup) { $this->beforeSetup(); $this->setup(); $this->onSetup(); $this->didSetup = true; } return $this; } public function handleRequest(Request $request = null) { if ($request === null) { $request = $this->getRequest(); } else { $this->setRequest($request); } $this->prepareElements(); $this->addSubmitButtonIfSet(); if ($this->hasBeenSent()) { $post = $request->getPost(); if ($this->hasBeenSubmitted()) { $this->beforeValidation($post); if ($this->isValid($post)) { try { $this->onSuccess(); $this->callOnSuccessCallables(); } catch (Exception $e) { $this->addException($e); $this->onFailure(); } } else { $this->onFailure(); } } else { $this->setDefaults($post); } } return $this; } public function addException(Exception $e, $elementName = null) { $msg = $this->getErrorMessageForException($e); if ($el = $this->getElement($elementName)) { $el->addError($msg); } else { $this->addError($msg); } } public function addUniqueErrorMessage($msg) { if (! in_array($msg, $this->getErrorMessages())) { $this->addErrorMessage($msg); } return $this; } public function addUniqueException(Exception $e) { $msg = $this->getErrorMessageForException($e); if (! in_array($msg, $this->getErrorMessages())) { $this->addErrorMessage($msg); } return $this; } protected function getErrorMessageForException(Exception $e) { $file = preg_split('/[\/\\\]/', $e->getFile(), -1, PREG_SPLIT_NO_EMPTY); $file = array_pop($file); return sprintf( '%s (%s:%d)', $e->getMessage(), $file, $e->getLine() ); } public function onSuccess() { $this->redirectOnSuccess(); } /** * @param callable $callable * @return $this */ public function callOnRequest($callable) { if (! is_callable($callable)) { throw new InvalidArgumentException( 'callOnRequest() expects a callable' ); } $this->onRequestCallbacks[] = $callable; return $this; } protected function callOnRequestCallables() { if (! $this->calledOnRequestCallbacks) { $this->calledOnRequestCallbacks = true; foreach ($this->onRequestCallbacks as $callable) { $callable($this); } } } /** * @param callable $callable * @return $this */ public function callOnSuccess($callable) { if (! is_callable($callable)) { throw new InvalidArgumentException( 'callOnSuccess() expects a callable' ); } $this->successCallbacks[] = $callable; return $this; } protected function callOnSuccessCallables() { if (! $this->calledSuccessCallbacks) { $this->calledSuccessCallbacks = true; foreach ($this->successCallbacks as $callable) { $callable($this); } } } public function setSuccessMessage($message) { $this->successMessage = $message; return $this; } public function getSuccessMessage($message = null) { if ($message !== null) { return $message; } if ($this->successMessage === null) { return t('Form has successfully been sent'); } return $this->successMessage; } public function redirectOnSuccess($message = null) { if ($this->isApiRequest()) { // TODO: Set the status line message? $this->successMessage = $this->getSuccessMessage($message); $this->callOnSuccessCallables(); return; } $url = $this->getSuccessUrl(); $this->callOnSuccessCallables(); $this->notifySuccess($this->getSuccessMessage($message)); $this->redirectAndExit($url); } public function onFailure() { } public function notifySuccess($message = null) { if ($message === null) { $message = t('Form has successfully been sent'); } Notification::success($message); return $this; } public function notifyError($message) { Notification::error($message); return $this; } protected function redirectAndExit($url) { /** @var Response $response */ $response = Icinga::app()->getFrontController()->getResponse(); $response->redirectAndExit($url); } protected function setHttpResponseCode($code) { Icinga::app()->getFrontController()->getResponse()->setHttpResponseCode($code); return $this; } protected function onRequest() { $this->callOnRequestCallables(); } public function setRequest(Request $request) { if ($this->request !== null) { throw new RuntimeException('Unable to set request twice'); } $this->request = $request; $this->prepareElements(); $this->onRequest(); $this->callOnRequestCallables(); return $this; } /** * @return Request */ public function getRequest() { if ($this->request === null) { /** @var Request $request */ $request = Icinga::app()->getFrontController()->getRequest(); $this->setRequest($request); } return $this->request; } public function hasBeenSent() { if ($this->hasBeenSent === null) { /** @var Request $req */ if ($this->request === null) { $req = Icinga::app()->getFrontController()->getRequest(); } else { $req = $this->request; } if ($req->isApiRequest()) { $this->hasBeenSent = true; } elseif ($req->isPost()) { $post = $req->getPost(); $this->hasBeenSent = array_key_exists(self::ID, $post) && $post[self::ID] === $this->getName(); if ( $this->hasBeenSent && (! isset($post[self::CSRF]) || ! CsrfToken::isValid($post[self::CSRF])) ) { die('Invalid CSRF token provided'); } } else { $this->hasBeenSent = false; } } return $this->hasBeenSent; } protected function detectName() { if ($this->formName !== null) { $this->setName($this->formName); } else { $this->setName(get_class($this)); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/QuickSubForm.php000066400000000000000000000015151516513262500266420ustar00rootroot00000000000000loadDefaultDecoratorsIsDisabled()) { return $this; } $decorators = $this->getDecorators(); if (empty($decorators)) { $this->addDecorator('FormElements') ->addDecorator('HtmlTag', array('tag' => 'dl')) ->addDecorator('Fieldset') ->addDecorator('DtDdWrapper'); } return $this; } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Validate/000077500000000000000000000000001516513262500253065ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Form/Validate/IsDataListEntry.php000066400000000000000000000022661516513262500310500ustar00rootroot00000000000000db = $db; $this->dataListId = (int) $dataListId; } public function isValid($value) { if (is_array($value)) { foreach ($value as $name) { if (! $this->isListEntry($name)) { $this->_error(self::INVALID, $value); return false; } } return true; } if ($this->isListEntry($value)) { return true; } else { $this->_error(self::INVALID, $value); return false; } } protected function isListEntry($name) { return DirectorDatalistEntry::exists([ 'list_id' => $this->dataListId, 'entry_name' => $name, ], $this->db); } } icingaweb2-module-director-1.11.8/library/Director/Web/Form/Validate/NamePattern.php000066400000000000000000000015261516513262500302410ustar00rootroot00000000000000filter = MatchingFilter::forPatterns($pattern, 'value'); $this->_messageTemplates[self::INVALID] = sprintf( 'Does not match %s', (string) $this->filter ); } public function isValid($value) { if ($this->filter->matches((object) ['value' => $value])) { return true; } else { $this->_error(self::INVALID, $value); return false; } } } icingaweb2-module-director-1.11.8/library/Director/Web/Navigation/000077500000000000000000000000001516513262500247515ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Navigation/Renderer/000077500000000000000000000000001516513262500265175ustar00rootroot00000000000000ConfigHealthItemRenderer.php000066400000000000000000000123041516513262500340120ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Navigation/RenderercheckHealth(); } catch (Exception $e) { $this->directorState = self::STATE_UNKNOWN; $this->count = 1; $this->message = $e->getMessage(); } return $this->count > 0; } public function getState() { return $this->directorState; } public function getCount() { if ($this->hasProblems()) { return $this->count; } else { return 0; } } public function getTitle() { return $this->message; } protected function checkHealth() { $db = $this->db(); if (! $db) { $this->directorState = self::STATE_PENDING; $this->count = 1; $this->message = $this->translate( 'No database has been configured for Icinga Director' ); return; } $migrations = new Migrations($db); if (!$migrations->hasSchema()) { $this->count = 1; $this->directorState = self::STATE_CRITICAL; $this->message = $this->translate( 'Director database schema has not been created yet' ); return; } if ($migrations->hasPendingMigrations()) { $this->count = $migrations->countPendingMigrations(); $this->directorState = self::STATE_PENDING; $this->message = sprintf( $this->translate('There are %d pending database migrations'), $this->count ); return; } $kickstart = new KickstartHelper($db); if ($kickstart->isRequired()) { $this->directorState = self::STATE_PENDING; $this->count = 1; $this->message = $this->translate( 'No API user configured, you might run the kickstart helper' ); return; } $branch = Branch::detect(new BranchStore($this->db())); if ($branch->isBranch()) { $count = $branch->getActivityCount(); if ($count > 0) { $this->directorState = self::STATE_PENDING; $this->count = $count; $this->message = sprintf( $this->translate('%s config changes are available in your configuration branch'), $count ); } return; } $pendingChanges = $db->countActivitiesSinceLastDeployedConfig(); if ($pendingChanges > 0) { $this->directorState = self::STATE_WARNING; $this->count = $pendingChanges; $this->message = sprintf( $this->translate( '%s config changes happend since the last deployed configuration' ), $pendingChanges ); } } protected function translate($message) { return mt('director', $message); } protected function db() { try { $resourceName = Config::module('director')->get('db', 'resource'); if ($resourceName) { // Window might have switched to another DB: return Db::fromResourceName($this->getDbResourceName()); } else { return false; } } catch (Exception $e) { return false; } } /** * TODO: the following methods are for the DirectorDb trait, we need * something better in future. It is required to show Health * related to the DB chosen in the current Window * * @codingStandardsIgnoreStart * @return Auth */ protected function Auth() { return Auth::getInstance(); } /** * @return Window */ public function Window() { if ($this->window === null) { try { /** @var $app Web */ $app = Icinga::app(); $this->window = new Window( $app->getRequest()->getHeader('X-Icinga-WindowId') ); } catch (Exception $e) { $this->window = new Window(Window::UNDEFINED); } } return $this->window; } /** * @return Config */ protected function Config() { // @codingStandardsIgnoreEnd return Config::module('director'); } } icingaweb2-module-director-1.11.8/library/Director/Web/ObjectPreview.php000066400000000000000000000125301516513262500261340ustar00rootroot00000000000000object = $object; $this->request = $request; } /** * @param ControlsAndContent $cc * @throws \Icinga\Exception\NotFoundError */ public function renderTo(ControlsAndContent $cc) { $object = $this->object; $url = $this->request->getUrl(); $params = $url->getParams(); $cc->addTitle( $this->translate('Config preview: %s'), $object->getObjectName() ); if ($params->shift('resolved')) { $object = $object::fromPlainObject( $object->toPlainObject(true), $object->getConnection() ); $cc->actions()->add(Link::create( $this->translate('Show normal'), $url->without('resolved'), null, ['class' => 'icon-resize-small state-warning'] )); } else { try { if ($object->supportsImports() && $object->imports()->count() > 0) { $cc->actions()->add(Link::create( $this->translate('Show resolved'), $url->with('resolved', true), null, ['class' => 'icon-resize-full'] )); } } catch (NestingError $e) { // No resolve link with nesting errors } } $content = $cc->content(); if ($object->isDisabled()) { $content->add(Hint::error( $this->translate('This object will not be deployed as it has been disabled') )); } if ($object->isExternal()) { $content->add(Html::tag('p', null, $this->translate(( 'This is an external object. It has been imported from Icinga 2 through the' . ' Core API and cannot be managed with the Icinga Director. It is however' . ' perfectly valid to create objects using this or referring to this object.' . ' You might also want to define related Fields to make work based on this' . ' object more enjoyable.' )))); } $config = $object->toSingleIcingaConfig(); foreach ($config->getFiles() as $filename => $file) { if (! $object->isExternal()) { $content->add(Html::tag('h2', null, $filename)); } $classes = array(); if ($object->isDisabled()) { $classes[] = 'disabled'; } elseif ($object->isExternal()) { $classes[] = 'logfile'; } $type = $object->getShortTableName(); $plain = Html::wantHtml($file->getContent())->render(); $plain = preg_replace_callback( '/^(\s+import\s+\"\;)(.+)(\"\;)/m', [$this, 'linkImport'], $plain ); if ($type !== 'command') { $plain = preg_replace_callback( '/^(\s+(?:check_|event_)?command\s+=\s+\"\;)(.+)(\"\;)/m', [$this, 'linkCommand'], $plain ); } $plain = preg_replace_callback( '/^(\s+host_name\s+=\s+\"\;)(.+)(\"\;)/m', [$this, 'linkHost'], $plain ); $text = Text::create($plain)->setEscaped(); $content->add(Html::tag('pre', ['class' => $classes], $text)); } } /** * @api internal * @param $match * @return string */ public function linkImport($match) { $blacklist = [ 'plugin-notification-command', 'plugin-check-command', ]; if (in_array($match[2], $blacklist)) { return $match[1] . $match[2] . $match[3]; } $urlObjectType = $this->object->getShortTableName(); if ($urlObjectType === 'service_set') { $urlObjectType = 'service'; } return $match[1] . Link::create( $match[2], sprintf("director/$urlObjectType"), ['name' => $match[2]] )->render() . $match[3]; } /** * @api internal * @param $match * @return string */ public function linkCommand($match) { return $match[1] . Link::create( $match[2], sprintf('director/command'), ['name' => $match[2]] )->render() . $match[3]; } /** * @api internal * @param $match * @return string */ public function linkHost($match) { return $match[1] . Link::create( $match[2], sprintf('director/host'), ['name' => $match[2]] )->render() . $match[3]; } } icingaweb2-module-director-1.11.8/library/Director/Web/SelfService.php000066400000000000000000000250011516513262500255730ustar00rootroot00000000000000host = $host; $this->api = $api; } /** * @param ControlsAndContent $controller */ public function renderTo(ControlsAndContent $controller) { $host = $this->host; if ($host->isTemplate()) { $this->showSelfServiceTemplateInstructions($controller); } elseif ($key = $host->getProperty('api_key')) { $this->showRegisteredAgentInstructions($key, $controller); } elseif ($key = $host->getSingleResolvedProperty('api_key')) { $this->showNewAgentInstructions($controller); } else { $this->showLegacyAgentInstructions($controller); } } /** * @param string $key * @param ControlsAndContent $c */ protected function showRegisteredAgentInstructions($key, ControlsAndContent $c) { $c->addTitle($this->translate('Registered Agent')); $c->content()->add([ Html::tag('p', null, $this->translate( 'This host has been registered via the Icinga Director Self Service' . " API. In case you re-installed the host or somehow lost it's" . ' secret key, you might want to dismiss the current key. This' . ' would allow you to register the same host again.' )), Html::tag('p', null, [$this->translate('Api Key:'), ' ', Html::tag('strong', null, $key)]), Hint::warning($this->translate( 'It is not a good idea to do so as long as your Agent still has' . ' a valid Self Service API key!' )), IcingaForgetApiKeyForm::load()->setHost($this->host)->handleRequest() ]); } /** * @param ControlsAndContent $cc */ protected function showSelfServiceTemplateInstructions(ControlsAndContent $cc) { $host = $this->host; $key = $host->getProperty('api_key'); $hasKey = $key !== null; if ($hasKey) { $cc->addTitle($this->translate('Shared for Self Service API')); } else { $cc->addTitle($this->translate('Share this Template for Self Service API')); } $c = $cc->content(); /** @var ActionBar $actions */ $actions = $cc->actions(); $actions->setBaseTarget('_next')->add(Link::create( $this->translate('Settings'), 'director/settings/self-service', null, [ 'title' => $this->translate('Global Self Service Setting'), 'class' => 'icon-services', ] )); $actions->add($this->getDocumentationLink()); if ($hasKey) { $c->add([ Html::tag('p', [ $this->translate('Api Key:'), ' ', Html::tag('strong', null, $key) ]), $this->getWindowsInstructions($host, $key), Html::tag('h2', null, $this->translate('Generate a new key')), Hint::warning($this->translate( 'This will invalidate the former key' )), ]); } $c->add([ // Html::tag('p', null, $this->translate('..')), IcingaGenerateApiKeyForm::load()->setHost($host)->handleRequest() ]); if ($hasKey) { $c->add([ Html::tag('h2', null, $this->translate('Stop sharing this Template')), Html::tag('p', null, $this->translate( 'You can stop sharing a Template at any time. This will' . ' immediately invalidate the former key.' ) . ' ' . $this->translate( 'Generated Host keys will continue to work, but you\'ll no' . ' longer be able to register new Hosts with this key' )), IcingaForgetApiKeyForm::load()->setHost($host)->handleRequest() ]); } } protected function getWindowsInstructions($host, $key) { $wizard = new AgentWizard($host); return [ Html::tag('h2', $this->translate('Icinga for Windows')), Html::tag('p', Html::sprintf( $this->translate('In case you\'re using %s, please run this Script:'), Html::tag('a', [ 'href' => 'https://icinga.com/docs/windows/latest/', 'target' => '_blank', ], $this->translate('Icinga for Windows')) )), Html::tag( 'pre', ['class' => 'logfile'], $wizard->renderIcinga4WindowsWizardCommand($key) ), ]; } protected function getDocumentationLink() { return Documentation::link( $this->translate('Documentation'), 'director', '74-Self-Service-API', $this->translate('Self Service API') ); } /** * @param ControlsAndContent $cc */ protected function showNewAgentInstructions(ControlsAndContent $cc) { $content = $cc->content(); $host = $this->host; $key = $host->getSingleResolvedProperty('api_key'); $cc->addTitle($this->translate('Configure this Agent via Self Service API')); $cc->actions()->add($this->getDocumentationLink()); $content->add(Html::tag('p', [ $this->translate('Inherited Template Api Key:'), ' ', Html::tag('strong', null, $key) ])); $content->add($this->getWindowsInstructions($host, $key)); } /** * @param ControlsAndContent $cc */ protected function showLegacyAgentInstructions(ControlsAndContent $cc) { $host = $this->host; $c = $cc->content(); $docBaseUrl = 'https://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/distributed-monitoring'; $sectionSetup = 'distributed-monitoring-setup-satellite-client'; $sectionTopDown = 'distributed-monitoring-top-down'; $c->add(Html::tag('p')->add(Html::sprintf( 'Please check the %s for more related information.' . ' The Director-assisted setup corresponds to configuring a %s environment.', Html::tag( 'a', ['href' => $docBaseUrl . '#' . $sectionSetup], $this->translate('Icinga 2 Client documentation') ), Html::tag( 'a', ['href' => $docBaseUrl . '#' . $sectionTopDown], $this->translate('Top Down') ) ))); $cc->addTitle('Agent deployment instructions'); try { $ticket = $this->api->getTicket($host->getEndpointName()); $wizard = new AgentWizard($host); $wizard->setTicket($ticket); } catch (Exception $e) { $c->add(Hint::error(sprintf( $this->translate( 'A ticket for this agent could not have been requested from' . ' your deployment endpoint: %s' ), $e->getMessage() ))); return; } $class = ['class' => 'agent-deployment-instructions']; $c->add([ Html::tag('h2', null, $this->translate('For manual configuration')), Html::tag('p', null, [$this->translate('Ticket'), ': ', Html::tag('code', null, $ticket)]), Html::tag('h2', null, $this->translate('Windows Kickstart Script')), Link::create( $this->translate('Download'), $cc->url()->with('download', 'windows-kickstart'), null, ['class' => 'icon-download', 'target' => '_blank'] ), Html::tag('pre', $class, $wizard->renderWindowsInstaller()), Html::tag('p', null, $this->translate( 'This requires the Icinga Agent to be installed. It generates and signs' . ' it\'s certificate and it also generates a minimal icinga2.conf to get' . ' your agent connected to it\'s parents' )), Html::tag('h2', null, $this->translate('Linux commandline')), Link::create( $this->translate('Download'), $cc->url()->with('download', 'linux'), null, ['class' => 'icon-download', 'target' => '_blank'] ), Html::tag('p', null, $this->translate('Just download and run this script on your Linux Client Machine:')), Html::tag('pre', $class, $wizard->renderLinuxInstaller()) ]); } /** * @param $os * @throws NotFoundError */ public function handleLegacyAgentDownloads($os) { $wizard = new AgentWizard($this->host); $wizard->setTicket($this->api->getTicket($this->host->getEndpointName())); switch ($os) { case 'windows-kickstart': $ext = 'ps1'; $script = preg_replace('/\n/', "\r\n", $wizard->renderWindowsInstaller()); break; case 'linux': $ext = 'bash'; $script = $wizard->renderLinuxInstaller(); break; default: throw new NotFoundError('There is no kickstart helper for %s', $os); } header('Content-type: application/octet-stream'); header('Content-Disposition: attachment; filename=icinga2-agent-kickstart.' . $ext); echo $script; exit; } /** * @return bool */ protected function hasDocsModuleLoaded() { try { return Icinga::app()->getModuleManager()->hasLoaded('doc'); } catch (ProgrammingError $e) { return false; } } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/000077500000000000000000000000001516513262500237015ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Table/ActivityLogTable.php000066400000000000000000000204671516513262500276310ustar00rootroot00000000000000getAttributes()->add('class', 'activity-log'); } public function setLastDeployedId($id) { $this->lastDeployedId = $id; return $this; } protected function fetchQueryRows() { $rows = parent::fetchQueryRows(); // Hint -> DESC, that's why they are inverted if (empty($rows)) { return $rows; } $last = $rows[0]->id; $first = $rows[count($rows) - 1]->id; $db = $this->db(); $this->ranges = $db->fetchAll( $db->select() ->from('director_activity_log_remark') ->where('first_related_activity <= ?', $last) ->where('last_related_activity >= ?', $first) ); return $rows; } public function renderRow($row) { $this->currentRow = $row; $this->splitByDay($row->ts_change_time); $action = 'action-' . $row->action . ' '; if ($row->id > $this->lastDeployedId) { $action .= 'undeployed'; } else { $action .= 'deployed'; } $columns = [ $this::td($this->makeLink($row))->setSeparator(' '), ]; if (! $this->hasObjectFilter) { $columns[] = $this->makeRangeInfo($row->id); } $columns[] = $this::td($this->getTime($row->ts_change_time)); return $this::tr($columns)->addAttributes(['class' => $action]); } /** * Hint: cloned from parent class and modified * @param int $timestamp */ protected function renderDayIfNew($timestamp) { $day = $this->getDateFormatter()->format((new DateTime())->setTimestamp($timestamp)); if ($this->lastDay !== $day) { $this->nextHeader()->add( $this::th($day, [ 'colspan' => $this->hasObjectFilter ? 2 : 3, 'class' => 'table-header-day' ]) ); $this->lastDay = $day; if ($this->currentRangeCell) { if ($this->currentRange->first_related_activity <= $this->currentRow->id) { $this->currentRangeCell->addAttributes(['class' => 'continuing']); $this->continueRange = true; } else { $this->continueRange = false; } } $this->currentRangeCell = null; $this->currentRange = null; $this->rangeRows = 0; $this->nextBody(); } } protected function makeRangeInfo($id) { $range = $this->getRangeForId($id); if ($range === null) { if ($this->currentRangeCell) { $this->currentRangeCell->getAttributes()->remove('class', 'continuing'); } $this->currentRange = null; $this->currentRangeCell = null; $this->rangeRows = 0; return $this::td(); } if ($range === $this->currentRange) { $this->growCurrentRange(); return null; } $this->startRange($range); return $this->currentRangeCell; } protected function startRange($range) { $this->currentRangeCell = $this::td($this->renderRangeComment($range), [ 'colspan' => $this->rangeRows = 1, 'class' => 'comment-cell' ]); if ($this->continueRange) { $this->currentRangeCell->addAttributes(['class' => 'continued']); $this->continueRange = false; } $this->currentRange = $range; } protected function renderRangeComment($range) { // The only purpose of this container is to avoid hovered rows from influencing // the comments background color, as we're using the alpha channel to lighten it // This can be replaced once we get theme-safe colors for such messages return Html::tag('div', [ 'class' => 'range-comment-container', ], Link::create($this->continueRange ? '' : $range->remark, '#', null, [ 'title' => $range->remark, 'class' => 'range-comment' ])); } protected function growCurrentRange() { $this->rangeRows++; $this->currentRangeCell->setAttribute('rowspan', $this->rangeRows); } protected function getRangeForId($id) { foreach ($this->ranges as $range) { if ($id >= $range->first_related_activity && $id <= $range->last_related_activity) { return $range; } } return null; } protected function makeLink($row) { $type = $row->object_type; $name = $row->object_name; if (substr($type, 0, 7) === 'icinga_') { $type = substr($type, 7); } if (Util::hasPermission(Permission::SHOW_CONFIG)) { // Later on replacing, service_set -> serviceset // multi column key :( if ($type === 'service' || $this->hasObjectFilter) { $object = "\"$name\""; } else { $delimiter = $type === 'scheduled_downtime' ? '-' : ''; $object = Link::create( "\"$name\"", 'director/' . str_replace('_', $delimiter, $type), ['name' => $name], ['title' => $this->translate('Jump to this object')] ); } return [ '[' . $row->author . ']', Link::create( $row->action, 'director/config/activity', array_merge(['id' => $row->id], $this->extraParams), ['title' => $this->translate('Show details related to this change')] ), str_replace('_', ' ', $type), $object ]; } else { return sprintf( '[%s] %s %s "%s"', $row->author, $row->action, $type, $name ); } } public function filterObject($type, $name) { $this->hasObjectFilter = true; $this->filters[] = ['l.object_type = ?', $type]; $this->filters[] = ['l.object_name = ?', $name]; return $this; } public function filterHost($name) { $db = $this->db(); $filter = '%"host":' . json_encode($name) . '%'; $this->filters[] = ['(' . $db->quoteInto('l.old_properties LIKE ?', $filter) . ' OR ' . $db->quoteInto('l.new_properties LIKE ?', $filter) . ')', null]; return $this; } public function getColumns() { return [ 'author' => 'l.author', 'action' => 'l.action_name', 'object_name' => 'l.object_name', 'object_type' => 'l.object_type', 'id' => 'l.id', 'change_time' => 'l.change_time', 'ts_change_time' => 'UNIX_TIMESTAMP(l.change_time)', ]; } public function prepareQuery() { $query = $this->db()->select()->from( ['l' => 'director_activity_log'], $this->getColumns() )->order('change_time DESC')->order('id DESC')->limit(100); foreach ($this->filters as $filter) { $query->where($filter[0], $filter[1]); } return $query; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ApplyRulesTable.php000066400000000000000000000225461516513262500274730ustar00rootroot00000000000000setType($type); return $table; } public function setType($type) { $this->type = $type; return $this; } public function setBaseObjectUrl($url) { $this->baseObjectUrl = $url; return $this; } public function createLinksWithNames($linksWithName = true) { $this->linkWithName = (bool) $linksWithName; return $this; } public function getType() { return $this->type; } public function getColumnsToBeRendered() { return ['Name', 'assign where'/*, 'Actions'*/]; } public function renderRow($row) { $row->uuid = DbUtil::binaryResult($row->uuid); if ($this->linkWithName) { $params = ['name' => $row->object_name]; } else { $params = ['uuid' => Uuid::fromBytes($row->uuid)->toString()]; } $url = Url::fromPath("director/{$this->baseObjectUrl}/edit", $params); $assignWhere = $this->renderApplyFilter($row->assign_filter); if (! empty($row->apply_for)) { $assignWhere = sprintf('apply for %s / %s', $row->apply_for, $assignWhere); } $tr = static::tr([ static::td(Link::create($row->object_name, $url)), static::td($assignWhere), // NOT (YET) static::td($this->createActionLinks($row))->setSeparator(' ') ]); $classes = $this->getRowClasses($row); if ($row->disabled === 'y') { $classes[] = 'disabled'; } $tr->getAttributes()->add('class', $classes); return $tr; } /** * Should be triggered from renderRow, still unused. * * @param IcingaObject $template * @param string $inheritance * @return $this * @throws \Icinga\Exception\ProgrammingError */ public function filterTemplate( IcingaObject $template, $inheritance = IcingaObjectFilterHelper::INHERIT_DIRECT ) { IcingaObjectFilterHelper::filterByTemplate( $this->getQuery(), $template, 'o', $inheritance, $this->branchUuid ); return $this; } protected function renderApplyFilter($assignFilter) { try { $string = AssignRenderer::forFilter( Filter::fromQueryString($assignFilter) )->renderAssign(); // Do not prefix it $string = preg_replace('/^assign where /', '', $string); } catch (IcingaException $e) { // ignore errors in filter rendering $string = 'Error in Filter rendering: ' . $e->getMessage(); } return $string; } public function createActionLinks($row) { $params = ['uuid' => Uuid::fromBytes($row->uuid)->toString()]; $baseUrl = 'director/' . $this->baseObjectUrl; $links = []; $links[] = Link::create( Icon::create('sitemap'), "{$baseUrl}template/applytargets", ['id' => $row->id], ['title' => $this->translate('Show affected Objects')] ); $links[] = Link::create( Icon::create('edit'), "$baseUrl/edit", $params, ['title' => $this->translate('Modify this Apply Rule')] ); $links[] = Link::create( Icon::create('doc-text'), "$baseUrl/render", $params, ['title' => $this->translate('Apply Rule rendering preview')] ); $links[] = Link::create( Icon::create('history'), "$baseUrl/history", $params, ['title' => $this->translate('Apply rule history')] ); return $links; } protected function applyRestrictions(ZfSelect $query) { $auth = Auth::getInstance(); $type = $this->type; // TODO: Centralize this logic if ($type === 'scheduledDowntime') { $type = 'scheduled-downtime'; } $restrictions = $auth->getRestrictions("director/$type/apply/filter-by-name"); if (empty($restrictions)) { return $query; } $filter = Filter::matchAny(); foreach ($restrictions as $restriction) { $filter->addFilter(Filter::where('o.object_name', $restriction)); } return FilterRenderer::applyToQuery($filter, $query); } protected function getRowClasses($row) { // TODO: remove isset, to figure out where it is missing if (isset($row->branch_uuid) && $row->branch_uuid !== null) { return ['branch_modified']; } return []; } /** * @return IcingaObject */ protected function getDummyObject() { if ($this->dummyObject === null) { $type = $this->type; $this->dummyObject = IcingaObject::createByType($type); } return $this->dummyObject; } public function prepareQuery() { $table = $this->getDummyObject()->getTableName(); $columns = [ 'id' => 'o.id', 'uuid' => 'o.uuid', 'object_name' => 'o.object_name', 'object_type' => 'o.object_type', 'disabled' => 'o.disabled', 'assign_filter' => 'o.assign_filter', 'apply_for' => '(NULL)', ]; if ($table === 'icinga_service') { $columns['apply_for'] = 'o.apply_for'; } $conn = $this->connection(); $query = $this->db()->select()->from( ['o' => $table], $columns )->order('o.object_name'); if ($this->branchUuid) { $columns = $this->branchifyColumns($columns); $columns['branch_uuid'] = 'bo.branch_uuid'; if ($conn->isPgsql()) { $columns['imports'] = 'CONCAT(\'[\', ARRAY_TO_STRING(ARRAY_AGG' . '(CONCAT(\'"\', sub_o.object_name, \'"\')), \',\'), \']\')'; } else { $columns['imports'] = 'CONCAT(\'[\', ' . 'GROUP_CONCAT(CONCAT(\'"\', sub_o.object_name, \'"\')), \']\')'; } $this->stripSearchColumnAliases(); $query->reset('columns'); $right = clone($query); $query->columns($columns) ->joinLeft( ['oi' => $table . '_inheritance'], 'o.id = oi.' . $this->getType() . '_id', [] )->joinLeft( ['sub_o' => $table], 'sub_o.id = oi.parent_' . $this->getType() . '_id', [] )->group(['o.id', 'bo.uuid', 'bo.branch_uuid']); $query->joinLeft( ['bo' => "branched_$table"], // TODO: PgHexFunc $this->db()->quoteInto( 'bo.uuid = o.uuid AND bo.branch_uuid = ?', DbUtil::quoteBinaryLegacy($this->branchUuid->getBytes(), $this->db()) ), [] )->where("(bo.branch_deleted IS NULL OR bo.branch_deleted = 'n')"); if ($this->type === 'service') { $query->where('o.service_set_id IS NULL AND bo.service_set IS NULL'); } $columns['imports'] = 'bo.imports'; $right->columns($columns) ->joinRight( ['bo' => "branched_$table"], 'bo.uuid = o.uuid', [] ) ->where('o.uuid IS NULL') ->where('bo.branch_uuid = ?', $conn->quoteBinary($this->branchUuid->getBytes())); $query = $this->db()->select()->union([ 'l' => new DbSelectParenthesis($query), 'r' => new DbSelectParenthesis($right), ]); $query = $this->db()->select()->from(['u' => $query]); $query->order('object_name')->limit(100); } else { if ($this->type === 'service') { $query->where('service_set_id IS NULL'); } } $query->where( "object_type = 'apply'" ); $this->applyRestrictions($query); return $this->applyRestrictions($query); } /** * @return Db */ public function connection() { return parent::connection(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/BasketSnapshotTable.php000066400000000000000000000062771516513262500303270ustar00rootroot00000000000000basket = $basket; $this->searchColumns = []; return $this; } public function renderRow($row) { $this->splitByDay($row->ts_create_seconds); $link = $this->linkToSnapshot($this->renderSummary($row->summary), $row); if ($this->basket === null) { $columns = [ [ new Link( Html::tag('strong', $row->basket_name), 'director/basket', ['name' => $row->basket_name] ), Html::tag('br'), $link, ], DateFormatter::formatTime($row->ts_create / 1000), ]; } else { $columns = [ $link, DateFormatter::formatTime($row->ts_create / 1000), ]; } return $this::row($columns); } protected function renderSummary($summary) { $summary = Json::decode($summary); if ($summary === null) { return '-'; } $result = []; if (! is_object($summary) && ! is_array($summary)) { throw new RuntimeException(sprintf( 'Got invalid basket summary: %s ', var_export($summary, true) )); } foreach ($summary as $type => $count) { $result[] = sprintf( '%dx %s', $count, $type ); } if (empty($result)) { return '-'; } return implode(', ', $result); } protected function linkToSnapshot($caption, $row) { return new Link($caption, 'director/basket/snapshot', [ 'checksum' => bin2hex($this->wantBinaryValue($row->content_checksum)), 'ts' => $row->ts_create, 'name' => $row->basket_name, ]); } public function prepareQuery() { $query = $this->db()->select()->from([ 'b' => 'director_basket' ], [ 'b.uuid', 'b.basket_name', 'bs.ts_create', 'ts_create_seconds' => '(bs.ts_create / 1000)', 'bs.content_checksum', 'bc.summary', ])->join( ['bs' => 'director_basket_snapshot'], 'bs.basket_uuid = b.uuid', [] )->join( ['bc' => 'director_basket_content'], 'bc.checksum = bs.content_checksum', [] )->order('bs.ts_create DESC'); if ($this->basket !== null) { $query->where('b.uuid = ?', $this->quoteBinary($this->basket->get('uuid'))); } return $query; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/BasketTable.php000066400000000000000000000021501516513262500265710ustar00rootroot00000000000000basket_name, 'director/basket', ['name' => $row->basket_name] ), $row->cnt_snapshots ]); return $tr; } public function getColumnsToBeRendered() { return [ $this->translate('Basket'), $this->translate('Snapshots'), ]; } public function prepareQuery() { return $this->db()->select()->from([ 'b' => 'director_basket' ], [ 'b.uuid', 'b.basket_name', 'cnt_snapshots' => 'COUNT(bs.basket_uuid)', ])->joinLeft( ['bs' => 'director_basket_snapshot'], 'bs.basket_uuid = b.uuid', [] )->group('b.uuid')->order('b.basket_name'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/BranchActivityTable.php000066400000000000000000000071271516513262500303030ustar00rootroot00000000000000branchUuid = $branchUuid; $this->objectUuid = $objectUuid; parent::__construct($db); } public function assemble() { $this->getAttributes()->add('class', 'activity-log'); } public function renderRow($row) { $ts = (int) floor(BranchActivity::fixFakeTimestamp($row->timestamp_ns) / 1000000); $this->splitByDay($ts); $activity = BranchActivity::fromDbRow($row); return $this::tr([ $this::td($this->makeBranchLink($activity))->setSeparator(' '), $this::td($this->getTime($ts)) ])->addAttributes(['class' => ['action-' . $activity->getAction(), 'branched']]); } public function disableObjectLink() { $this->linkToObject = false; return $this; } protected function linkObject(BranchActivity $activity) { if (! $this->linkToObject) { return $activity->getObjectName(); } // $type, UuidInterface $uuid // Later on replacing, service_set -> serviceset $type = preg_replace('/^icinga_/', '', $activity->getObjectTable()); return Link::create( $activity->getObjectName(), 'director/' . str_replace('_', '', $type), ['uuid' => $activity->getObjectUuid()->toString()], ['title' => $this->translate('Jump to this object')] ); } protected function makeBranchLink(BranchActivity $activity) { $type = preg_replace('/^icinga_/', '', $activity->getObjectTable()); if (Util::hasPermission(Permission::SHOW_CONFIG)) { // Later on replacing, service_set -> serviceset return [ '[' . $activity->getAuthor() . ']', Link::create( $activity->getAction(), 'director/branch/activity', array_merge(['ts' => $activity->getTimestampNs()], $this->extraParams), ['title' => $this->translate('Show details related to this change')] ), str_replace('_', ' ', $type), $this->linkObject($activity) ]; } else { return sprintf( '[%s] %s %s "%s"', $activity->getAuthor(), $activity->getAction(), $type, $activity->getObjectName() ); } } public function prepareQuery() { /** @var Db $connection */ $connection = $this->connection(); $query = $this->db()->select()->from(['ba' => 'director_branch_activity'], 'ba.*') ->join(['b' => 'director_branch'], 'b.uuid = ba.branch_uuid', ['b.owner']) ->where('branch_uuid = ?', $connection->quoteBinary($this->branchUuid->getBytes())) ->order('timestamp_ns DESC'); if ($this->objectUuid) { $query->where('ba.object_uuid = ?', $connection->quoteBinary($this->objectUuid->getBytes())); } return $query; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/BranchedIcingaCommandArgumentTable.php000066400000000000000000000037571516513262500332210ustar00rootroot00000000000000command = $command; $this->branch = $branch; $this->getAttributes()->set('data-base-target', '_self'); } public function renderRow($row) { return $this::row([ Link::create($row->argument_name, 'director/command/arguments', [ 'argument' => $row->argument_name, 'uuid' => $this->command->getUniqueId()->toString(), ]), $row->argument_value ]); } public function getColumnsToBeRendered() { return [ $this->translate('Argument'), $this->translate('Value'), ]; } protected function getPaginationAdapter() { return new SimpleQueryPaginationAdapter($this->getQuery()); } public function getQuery() { return $this->prepareQuery(); } protected function fetchQueryRows() { return $this->getQuery()->fetchAll(); } protected function prepareQuery() { $list = []; foreach ($this->command->arguments()->toPlainObject() as $name => $argument) { $new = (object) []; $new->argument_name = $name; $new->argument_value = isset($argument->value) ? $argument->value : null; $list[] = $new; } return (new ArrayDatasource($list))->select(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ChoicesTable.php000066400000000000000000000026561516513262500267500ustar00rootroot00000000000000type = $type; return $table; } public function getType() { return $this->type; } public function getColumnsToBeRendered() { return [$this->translate('Name')]; } public function renderRow($row) { $type = $this->getType(); $url = Url::fromPath("director/templatechoice/{$type}", [ 'name' => $row->object_name ]); return $this::row([ Link::create($row->object_name, $url) ]); } protected function prepareQuery() { $type = $this->getType(); $table = "icinga_{$type}_template_choice"; return $this->db() ->select() ->from(['o' => $table], 'object_name') ->order('o.object_name'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ConfigFileDiffTable.php000066400000000000000000000113601516513262500301610ustar00rootroot00000000000000getAttributes()->add('class', 'config-diff'); return $table->setLeftChecksum($leftSum) ->setRightChecksum($rightSum); } public function renderRow($row) { $tr = $this::row([ $this->getFileFiffLink($row), $row->file_path, ]); $tr->getAttributes()->add('class', 'file-' . $row->file_action); return $tr; } protected function getFileFiffLink($row) { $params = array('file_path' => $row->file_path); if ($row->file_checksum_left === $row->file_checksum_right) { $params['config_checksum'] = $row->config_checksum_right; } elseif ($row->file_checksum_left === null) { $params['config_checksum'] = $row->config_checksum_right; } elseif ($row->file_checksum_right === null) { $params['config_checksum'] = $row->config_checksum_left; } else { $params['left'] = $row->config_checksum_left; $params['right'] = $row->config_checksum_right; return Link::create( $row->file_action, 'director/config/filediff', $params ); } return Link::create($row->file_action, 'director/config/file', $params); } public function setLeftChecksum($checksum) { $this->leftChecksum = $checksum; return $this; } public function setRightChecksum($checksum) { $this->rightChecksum = $checksum; return $this; } public function getTitles() { return array( $this->translate('Action'), $this->translate('File'), ); } public function prepareQuery() { $db = $this->db(); $left = $db->select() ->from( array('cfl' => 'director_generated_config_file'), array( 'file_path' => 'COALESCE(cfl.file_path, cfr.file_path)', 'config_checksum_left' => $this->dbHexFunc('cfl.config_checksum'), 'config_checksum_right' => $this->dbHexFunc('cfr.config_checksum'), 'file_checksum_left' => $this->dbHexFunc('cfl.file_checksum'), 'file_checksum_right' => $this->dbHexFunc('cfr.file_checksum'), 'file_action' => '(CASE WHEN cfr.config_checksum IS NULL' . " THEN 'removed' WHEN cfl.file_checksum = cfr.file_checksum" . " THEN 'unmodified' ELSE 'modified' END)", ) )->joinLeft( array('cfr' => 'director_generated_config_file'), $db->quoteInto( 'cfl.file_path = cfr.file_path AND cfr.config_checksum = ?', $this->quoteBinary(hex2bin($this->rightChecksum)) ), array() )->where( 'cfl.config_checksum = ?', $this->quoteBinary(hex2bin($this->leftChecksum)) ); $right = $db->select() ->from( array('cfl' => 'director_generated_config_file'), array( 'file_path' => 'COALESCE(cfr.file_path, cfl.file_path)', 'config_checksum_left' => $this->dbHexFunc('cfl.config_checksum'), 'config_checksum_right' => $this->dbHexFunc('cfr.config_checksum'), 'file_checksum_left' => $this->dbHexFunc('cfl.file_checksum'), 'file_checksum_right' => $this->dbHexFunc('cfr.file_checksum'), 'file_action' => "('created')", ) )->joinRight( array('cfr' => 'director_generated_config_file'), $db->quoteInto( 'cfl.file_path = cfr.file_path AND cfl.config_checksum = ?', $this->quoteBinary(hex2bin($this->leftChecksum)) ), array() )->where( 'cfr.config_checksum = ?', $this->quoteBinary(hex2bin($this->rightChecksum)) )->where('cfl.file_checksum IS NULL'); return $db->select()->union(array($left, $right))->order('file_path'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/CoreApiFieldsTable.php000066400000000000000000000057671516513262500300520ustar00rootroot00000000000000 ['common-table'/*, 'table-row-selectable'*/], //'data-base-target' => '_next', ]; protected $fields; /** @var Url */ protected $url; public function __construct($fields, Url $url) { $this->url = $url; $this->fields = $fields; } public function assemble() { if (empty($this->fields)) { return; } $this->add(Html::tag('thead', Html::tag('tr', Html::wrapEach($this->getColumnsToBeRendered(), 'th')))); foreach ($this->fields as $name => $field) { $tr = $this::tr([ $this::td($name), $this::td(Link::create( $field->type, $this->url->with('type', $field->type) )), $this::td($field->id) // $this::td($field->array_rank), // $this::td($this->renderKeyValue($field->attributes)) ]); $this->addAttributeColumns($tr, $field->attributes); $this->add($tr); } } protected function addAttributeColumns(BaseHtmlElement $tr, $attrs) { $tr->add([ $this->makeBooleanColumn($attrs->state), $this->makeBooleanColumn($attrs->config), $this->makeBooleanColumn($attrs->required), $this->makeBooleanColumn(isset($attrs->deprecated) ? $attrs->deprecated : null), $this->makeBooleanColumn($attrs->no_user_modify), $this->makeBooleanColumn($attrs->no_user_view), $this->makeBooleanColumn($attrs->navigation), ]); } protected function makeBooleanColumn($value) { if ($value === null) { return $this::td('-'); } return $this::td($value ? Html::tag('strong', 'true') : 'false'); } public function getColumnsToBeRendered() { return [ $this->translate('Name'), $this->translate('Type'), $this->translate('Id'), // $this->translate('Array Rank'), // $this->translate('Attributes') $this->translate('State'), $this->translate('Config'), $this->translate('Required'), $this->translate('Deprecated'), $this->translate('Protected'), $this->translate('Hidden'), $this->translate('Nav'), ]; } protected function renderKeyValue($values) { $parts = []; foreach ((array) $values as $key => $value) { if (is_bool($value)) { $value = $value ? 'true' : 'false'; } $parts[] = "$key: $value"; } return implode(', ', $parts); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/CoreApiObjectsTable.php000066400000000000000000000030071516513262500302160ustar00rootroot00000000000000 ['common-table', 'table-row-selectable'], 'data-base-target' => '_next', ]; /** @var IcingaEndpoint */ protected $endpoint; protected $objects; protected $type; public function __construct($objects, IcingaEndpoint $endpoint, $type) { $this->objects = $objects; $this->endpoint = $endpoint; $this->type = $type; } public function assemble() { if (empty($this->objects)) { return; } $this->add(Html::tag('thead', Html::tag('tr', Html::wrapEach($this->getColumnsToBeRendered(), 'th')))); foreach ($this->objects as $name) { $this->add($this::tr($this::td(Link::create( str_replace('!', ': ', $name), 'director/inspect/object', [ 'name' => $name, 'type' => $this->type->name, 'plural' => $this->type->plural_name, 'endpoint' => $this->endpoint->getObjectName() ] )))); } } public function getColumnsToBeRendered() { return [ $this->translate('Name'), ]; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/CoreApiPrototypesTable.php000066400000000000000000000017221516513262500310170ustar00rootroot00000000000000 ['common-table']]; protected $prototypes; protected $typeName; public function __construct($prototypes, $typeName) { $this->prototypes = $prototypes; $this->typeName = $typeName; } public function assemble() { if (empty($this->prototypes)) { return; } $this->add(Html::tag('thead', Html::tag('tr', Html::wrapEach($this->getColumnsToBeRendered(), 'th')))); $type = $this->typeName; foreach ($this->prototypes as $name) { $this->add($this::tr($this::td("$type.$name()"))); } } public function getColumnsToBeRendered() { return [ $this->translate('Name'), ]; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/CustomvarTable.php000066400000000000000000000056221516513262500273520ustar00rootroot00000000000000varname, 'director/customvar/variants', ['name' => $row->varname] ) ]); foreach ($this->getObjectTypes() as $type) { $tr->add($this::td(Html::tag('nobr', null, sprintf( $this->translate('%d / %d'), $row->{"cnt_$type"}, $row->{"distinct_$type"} )))); } return $tr; } public function getColumnsToBeRendered() { return array( $this->translate('Variable name'), $this->translate('Distinct Commands'), $this->translate('Hosts'), $this->translate('Services'), $this->translate('Service Sets'), $this->translate('Notifications'), $this->translate('Users'), ); } protected function getObjectTypes() { return ['command', 'host', 'service', 'service_set', 'notification', 'user']; } public function prepareQuery() { $db = $this->db(); $varsColumns = ['varname' => 'v.varname']; $varsTypes = $this->getObjectTypes(); foreach ($varsTypes as $type) { $varsColumns["cnt_$type"] = '(0)'; $varsColumns["distinct_$type"] = '(0)'; } $varsQueries = []; foreach ($varsTypes as $type) { $varsQueries[] = $this->makeVarSub($type, $varsColumns, $db); } $union = $db->select()->union($varsQueries, ZfDbSelect::SQL_UNION_ALL); $columns = ['varname' => 'u.varname']; foreach ($varsTypes as $column) { $columns["cnt_$column"] = "SUM(u.cnt_$column)"; $columns["distinct_$column"] = "SUM(u.distinct_$column)"; } return $db->select()->from( array('u' => $union), $columns )->group('u.varname')->order('u.varname ASC')->limit(100); } /** * @param string $type * @param array $columns * @param ZfDbAdapter $db * @return ZfDbSelect */ protected function makeVarSub($type, array $columns, ZfDbAdapter $db) { $columns["cnt_$type"] = 'COUNT(*)'; $columns["distinct_$type"] = 'COUNT(DISTINCT varvalue)'; return $db->select()->from( ['v' => "icinga_{$type}_var"], $columns )->join( ['o' => "icinga_{$type}"], "o.id = v.{$type}_id", [] )->where('o.object_type != ?', 'external_object')->group('varname'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/CustomvarVariantsTable.php000066400000000000000000000066561516513262500310720ustar00rootroot00000000000000varName = $varName; $table->getAttributes()->set('class', 'common-table'); return $table; } public function renderRow($row) { if ($row->format === 'json') { $value = PlainObjectRenderer::render(json_decode($row->varvalue)); } else { $value = $row->varvalue; } $tr = $this::row([ /* new Link( $value, 'director/customvar/value', ['name' => $row->varvalue] )*/ $value ]); foreach ($this->getObjectTypes() as $type) { $cnt = (int) $row->{"cnt_$type"}; if ($cnt === 0) { $cnt = '-'; } $tr->add($this::td($cnt)); } return $tr; } public function getColumnsToBeRendered() { return array( $this->translate('Variable Value'), $this->translate('Commands'), $this->translate('Hosts'), $this->translate('Services'), $this->translate('Service Sets'), $this->translate('Notifications'), $this->translate('Users'), ); } protected function getObjectTypes() { return ['command', 'host', 'service', 'service_set', 'notification', 'user']; } public function prepareQuery() { $db = $this->db(); $varsColumns = ['varvalue' => 'v.varvalue']; $varsTypes = $this->getObjectTypes(); foreach ($varsTypes as $type) { $varsColumns["cnt_$type"] = '(0)'; } $varsQueries = []; foreach ($varsTypes as $type) { $varsQueries[] = $this->makeVarSub($type, $varsColumns, $db); } $union = $db->select()->union($varsQueries, ZfDbSelect::SQL_UNION_ALL); $columns = [ 'varvalue' => 'u.varvalue', 'format' => 'u.format', ]; foreach ($varsTypes as $column) { $columns["cnt_$column"] = "SUM(u.cnt_$column)"; } return $db->select()->from(['u' => $union], $columns) ->group('u.varvalue')->group('u.format') ->order('u.varvalue ASC') ->order('u.format ASC') ->limit(100); } /** * @param string $type * @param array $columns * @param ZfDbAdapter $db * @return ZfDbSelect */ protected function makeVarSub($type, array $columns, ZfDbAdapter $db) { $columns["cnt_$type"] = 'COUNT(*)'; $columns['format'] = 'v.format'; return $db->select()->from( ['v' => "icinga_{$type}_var"], $columns )->join( ['o' => "icinga_{$type}"], "o.id = v.{$type}_id", [] )->where( 'v.varname = ?', $this->varName )->where( 'o.object_type != ?', 'external_object' )->group('varvalue')->group('v.format'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/DatafieldCategoryTable.php000066400000000000000000000031761516513262500307440ustar00rootroot00000000000000 'dfc.id', 'category_name' => 'dfc.category_name', 'description' => 'dfc.description', 'assigned_fields' => 'COUNT(df.id)', ); } public function renderRow($row) { $main = [Link::create( $row->category_name, 'director/datafieldcategory/edit', ['name' => $row->category_name] )]; if ($row->description !== null && strlen($row->description)) { $main[] = Html::tag('br'); $main[] = Html::tag('small', $row->description); } return $this::tr([ $this::td($main), $this::td($row->assigned_fields) ]); } public function getColumnsToBeRendered() { return [ $this->translate('Category Name'), $this->translate('# Used'), ]; } public function prepareQuery() { $db = $this->db(); return $db->select()->from( ['dfc' => 'director_datafield_category'], $this->getColumns() )->joinLeft( ['df' => 'director_datafield'], 'df.category_id = dfc.id', [] )->group('dfc.id')->group('dfc.category_name')->order('category_name ASC'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/DatafieldTable.php000066400000000000000000000071171516513262500272450ustar00rootroot00000000000000 'df.id', 'varname' => 'df.varname', 'lc_varname' => new DbExpr('LOWER(df.varname)'), 'caption' => 'df.caption', 'description' => 'df.description', 'datatype' => 'df.datatype', 'category' => 'dfc.category_name', 'assigned_fields' => 'SUM(used_fields.cnt)', 'assigned_vars' => 'SUM(used_vars.cnt)', ]; } public function renderRow($row) { return $this::tr([ $this::td(Link::create( $row->caption, 'director/datafield/edit', ['id' => $row->id] )), $this::td($row->varname), $this::td($row->category), $this::td($row->assigned_fields), $this::td($row->assigned_vars) ]); } public function getColumnsToBeRendered() { return [ $this->translate('Label'), $this->translate('Field name'), $this->translate('Category'), $this->translate('# Used'), $this->translate('# Vars'), ]; } public function prepareQuery() { $db = $this->db(); $fieldTypes = ['command', 'host', 'notification', 'service', 'user']; $varsTypes = ['command', 'host', 'notification', 'service', 'service_set', 'user']; $fieldsQueries = []; foreach ($fieldTypes as $type) { $fieldsQueries[] = $this->makeDatafieldSub($type, $db); } $varsQueries = []; foreach ($varsTypes as $type) { $varsQueries[] = $this->makeVarSub($type, $db); } return $db->select()->from( ['df' => 'director_datafield'], $this->getColumns() )->joinLeft( ['dfc' => 'director_datafield_category'], 'df.category_id = dfc.id', [] )->joinLeft( ['used_fields' => $db->select()->union($fieldsQueries, ZfDbSelect::SQL_UNION_ALL)], 'used_fields.datafield_id = df.id', [] )->joinLeft( ['used_vars' => $db->select()->union($varsQueries, ZfDbSelect::SQL_UNION_ALL)], 'used_vars.varname = df.varname', [] )->group('df.id')->group('df.varname')->group('dfc.category_name')->order('caption ASC'); } public function search($search) { if ($search !== null) { $search = strtolower($search); } return parent::search($search); } /** * @param $type * @param ZfDbAdapter $db * * @return ZfDbSelect */ protected function makeDatafieldSub($type, ZfDbAdapter $db) { return $db->select()->from("icinga_{$type}_field", [ 'cnt' => 'COUNT(*)', 'datafield_id' ])->group('datafield_id'); } /** * @param $type * @param ZfDbAdapter $db * * @return ZfDbSelect */ protected function makeVarSub($type, ZfDbAdapter $db) { return $db->select()->from("icinga_{$type}_var", [ 'cnt' => 'COUNT(*)', 'varname' ])->group('varname'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/DatalistEntryTable.php000066400000000000000000000032771516513262500301620ustar00rootroot00000000000000datalist = $list; return $this; } public function getList() { return $this->datalist; } public function getColumns() { return [ 'list_name' => 'l.list_name', 'list_id' => 'le.list_id', 'entry_name' => 'le.entry_name', 'entry_value' => 'le.entry_value', ]; } public function renderRow($row) { return $this::tr([ $this::td(Link::create($row->entry_name, 'director/data/listentry/edit', [ 'list' => $row->list_name, 'entry_name' => $row->entry_name, ])), $this::td($row->entry_value) ]); } public function getColumnsToBeRendered() { return [ 'entry_name' => $this->translate('Key'), 'entry_value' => $this->translate('Label'), ]; } public function prepareQuery() { return $this->db()->select()->from( ['le' => 'director_datalist_entry'], $this->getColumns() )->join( ['l' => 'director_datalist'], 'l.id = le.list_id', [] )->where( 'le.list_id = ?', $this->getList()->id )->order('le.entry_name ASC'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/DatalistTable.php000066400000000000000000000016101516513262500271250ustar00rootroot00000000000000 'l.id', 'list_name' => 'l.list_name', ]; } public function renderRow($row) { return $this::tr($this::td(Link::create( $row->list_name, 'director/data/listentry', array('list' => $row->list_name) ))); } public function getColumnsToBeRendered() { return [$this->translate('List name')]; } public function prepareQuery() { return $this->db()->select()->from( ['l' => 'director_datalist'], $this->getColumns() )->order('list_name ASC'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/DbHelper.php000066400000000000000000000025761516513262500261110ustar00rootroot00000000000000isPgsql()) { return sprintf("LOWER(ENCODE(%s, 'hex'))", $column); } else { return sprintf("LOWER(HEX(%s))", $column); } } public function quoteBinary($binary) { if ($binary === '') { return ''; } if (is_array($binary)) { return array_map([$this, 'quoteBinary'], $binary); } if ($this->isPgsql()) { return new Expr("'\\x" . bin2hex($binary) . "'"); } return new Expr('0x' . bin2hex($binary)); } public function isPgsql() { return $this->db() instanceof \Zend_Db_Adapter_Pdo_Pgsql; } public function isMysql() { return $this->db() instanceof \Zend_Db_Adapter_Pdo_Mysql; } public function wantBinaryValue($value) { if (is_resource($value)) { return stream_get_contents($value); } return $value; } public function getChecksum($checksum) { return bin2hex($this->wantBinaryValue($checksum)); } public function getShortChecksum($checksum) { if ($checksum === null) { return null; } return substr($this->getChecksum($checksum), 0, 7); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/Dependency/000077500000000000000000000000001516513262500257575ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Table/Dependency/DependencyInfoTable.php000066400000000000000000000061341516513262500323360ustar00rootroot00000000000000module = $module; $this->checker = $checker; } protected function linkToModule($name, $icon) { return Html::link( Html::escape($name), Html::webUrl('config/module', ['name' => $name]), [ 'class' => "icon-$icon" ] ); } public function render() { $html = ' '; foreach ($this->checker->getDependencies($this->module) as $dependency) { $name = $dependency->getName(); $isLibrary = substr($name, 0, 11) === 'icinga-php-'; $rowAttributes = $isLibrary ? ['data-base-target' => '_self'] : null; if ($dependency->isSatisfied()) { if ($dependency->isSatisfied()) { $icon = 'ok'; } else { $icon = 'cancel'; } $link = $isLibrary ? $this->noLink($name, $icon) : $this->linkToModule($name, $icon); $installed = $dependency->getInstalledVersion(); } elseif ($dependency->isInstalled()) { $installed = sprintf('%s (%s)', $dependency->getInstalledVersion(), $this->translate('disabled')); $link = $this->linkToModule($name, 'cancel'); } else { $installed = $this->translate('missing'); $repository = $isLibrary ? $name : "icingaweb2-module-$name"; $link = sprintf( '%s (%s)', $this->noLink($name, 'cancel'), Html::linkToGitHub(Html::escape($this->translate('more')), 'Icinga', $repository) ); } $html .= $this->htmlRow([ $link, Html::escape($dependency->getRequirement()), Html::escape($installed) ], $rowAttributes); } return $html . '
    ' . Html::escape($this->translate('Module name')) . ' ' . Html::escape($this->translate('Required')) . ' ' . Html::escape($this->translate('Installed')) . '
    '; } protected function noLink($label, $icon) { return Html::link(Html::escape($label), Url::fromRequest()->with('rnd', rand(1, 100000)), [ 'class' => "icon-$icon" ]); } protected function translate($string) { return \mt('director', $string); } protected function htmlRow(array $cols, $rowAttributes) { $content = ''; foreach ($cols as $escapedContent) { $content .= Html::tag('td', null, $escapedContent); } return Html::tag('tr', $rowAttributes, $content); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/Dependency/Html.php000066400000000000000000000040161516513262500273750ustar00rootroot00000000000000 $value) { if (! preg_match('/^[a-z][a-z0-9:-]*$/i', $name)) { throw new InvalidArgumentException("Invalid attribute name: '$name'"); } $result .= " $name=\"" . self::escapeAttributeValue($value) . '"'; } } return "$result>$escapedContent"; } public static function webUrl($path, $params) { return Url::fromPath($path, $params); } public static function link($escapedLabel, $url, $attributes = []) { return static::tag('a', [ 'href' => $url, ] + $attributes, $escapedLabel); } public static function linkToGitHub($escapedLabel, $namespace, $repository) { return static::link( $escapedLabel, 'https://github.com/' . urlencode($namespace) . '/' . urlencode($repository), [ 'target' => '_blank', 'rel' => 'noreferrer', 'class' => 'icon-forward' ] ); } protected static function escapeAttributeValue($value) { $value = str_replace('"', '"', $value); // Escape ambiguous ampersands return preg_replace_callback('/&[0-9A-Z]+;/i', function ($match) { $subject = $match[0]; if (htmlspecialchars_decode($subject, ENT_COMPAT | ENT_HTML5) === $subject) { // Ambiguous ampersand return str_replace('&', '&', $subject); } return $subject; }, $value); } public static function escape($any) { return htmlspecialchars($any); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/DependencyTemplateUsageTable.php000066400000000000000000000013151516513262500321210ustar00rootroot00000000000000 $this->translate('Templates'), 'applyrules' => $this->translate('Apply Rules'), ]; } protected function getSummaryTables(string $templateType, Db $connection) { return [ 'templates' => TemplatesTable::create( $templateType, $connection ), 'applyrules' => ApplyRulesTable::create($templateType, $connection) ->setBranchUuid($this->branchUuid) ]; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/DeploymentLogTable.php000066400000000000000000000047121516513262500301500ustar00rootroot00000000000000activeStageName = $name; return $this; } public function assemble() { $this->getAttributes()->add('class', 'deployment-log'); } public function renderRow($row) { $this->splitByDay($row->start_time); $shortSum = $this->getShortChecksum($row->config_checksum); $tr = $this::tr([ $this::td(Link::create( $shortSum === null ? $row->peer_identity : [$row->peer_identity, " ($shortSum)"], 'director/deployment', ['id' => $row->id] )), $this::td(DateFormatter::formatTime($row->start_time)) ])->addAttributes(['class' => $this->getMyRowClasses($row)]); return $tr; } protected function getMyRowClasses($row) { if ($row->startup_succeeded === 'y') { $classes = ['succeeded']; } elseif ($row->startup_succeeded === 'n') { $classes = ['failed']; } elseif ($row->stage_collected === null) { $classes = ['pending']; } elseif ($row->dump_succeeded === 'y') { $classes = ['sent']; } else { // TODO: does this ever be stored? $classes = ['notsent']; } if ( $this->activeStageName !== null && $row->stage_name === $this->activeStageName ) { $classes[] = 'running'; } return $classes; } public function getColumns() { $columns = [ 'id' => 'l.id', 'peer_identity' => 'l.peer_identity', 'start_time' => 'UNIX_TIMESTAMP(l.start_time)', 'stage_collected' => 'l.stage_collected', 'dump_succeeded' => 'l.dump_succeeded', 'stage_name' => 'l.stage_name', 'startup_succeeded' => 'l.startup_succeeded', 'config_checksum' => 'l.config_checksum', ]; return $columns; } public function prepareQuery() { return $this->db()->select()->from( array('l' => 'director_deployment_log'), $this->getColumns() )->order('l.start_time DESC')->limit(100); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/FilterableByUsage.php000066400000000000000000000002371516513262500277450ustar00rootroot00000000000000config = $config; $table->getAttributes()->set('data-base-target', '_self'); return $table; } public function renderRow($row) { $counts = implode(' / ', [ $row->cnt_object, $row->cnt_template, $row->cnt_apply ]); $tr = $this::row([ $this->getFileLink($row), $counts, $row->size ]); if ($row->file_path === $this->activeFile) { $tr->getAttributes()->add('class', 'active'); } return $tr; } public function setActiveFilename($filename) { $this->activeFile = $filename; return $this; } protected function getFileLink($row) { $params = [ 'config_checksum' => $row->config_checksum, 'file_path' => $row->file_path ]; if ($this->deploymentId) { $params['deployment_id'] = $this->deploymentId; } return Link::create($row->file_path, 'director/config/file', $params); } public function setDeploymentId($id) { if ($id) { $this->deploymentId = (int) $id; } return $this; } public function getColumnsToBeRendered() { return [ $this->translate('File'), $this->translate('Object/Tpl/Apply'), $this->translate('Size'), ]; } public function prepareQuery() { $columns = [ 'file_path' => 'cf.file_path', 'size' => 'LENGTH(f.content)', 'cnt_object' => 'f.cnt_object', 'cnt_template' => 'f.cnt_template', 'cnt_apply' => 'f.cnt_apply', 'cnt_all' => "f.cnt_object || ' / ' || f.cnt_template || ' / ' || f.cnt_apply", 'checksum' => 'LOWER(HEX(f.checksum))', 'config_checksum' => 'LOWER(HEX(cf.config_checksum))', ]; if ($this->isPgsql()) { $columns['checksum'] = "LOWER(ENCODE(f.checksum, 'hex'))"; $columns['config_checksum'] = "LOWER(ENCODE(cf.config_checksum, 'hex'))"; } return $this->db()->select()->from( ['cf' => 'director_generated_config_file'], $columns )->join( ['f' => 'director_generated_file'], 'cf.file_checksum = f.checksum', [] )->where( 'config_checksum = ?', $this->quoteBinary($this->config->getChecksum()) )->order('cf.file_path ASC'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/GroupMemberTable.php000066400000000000000000000130131516513262500276040ustar00rootroot00000000000000type = $type; return $table; } public function assemble() { if ($this->type === 'host') { $this->enableMultiSelect( 'director/hosts/edit', 'director/hosts', ['name'] ); } } public function setGroup(IcingaObjectGroup $group) { $this->group = $group; return $this; } public function getType() { return $this->type; } public function getColumnsToBeRendered() { if ($this->group === null) { return [ $this->translate('Group'), $this->translate('Member'), $this->translate('via') ]; } else { return [ $this->translate('Member'), $this->translate('via') ]; } } public function renderRow($row) { $type = $this->getType(); if ($row->object_type === 'apply') { $params = [ 'id' => $row->id ]; } elseif (isset($row->host_id)) { // I would prefer to see host= and set=, but joining // them here is pointless. We should use DeferredHtml for these, // remember hosts/sets we need and fetch them in a single query at // rendering time. For now, this works fine - just... the URLs are // not so nice $params = [ 'name' => $row->object_name, 'host_id' => $row->host_id ]; } elseif (isset($row->service_set_id)) { $params = [ 'name' => $row->object_name, 'set_id' => $row->service_set_id ]; } else { $params = [ 'name' => $row->object_name ]; } $url = Url::fromPath("director/{$type}", $params); $tr = $this::tr(); if ($this->group === null) { $tr->add($this::td($row->group_name)); } $link = Link::create($row->object_name, $url); if ($row->object_type === 'apply') { $link = [ $link, ' (where ', $this->renderApplyFilter($row->assign_filter), ')' ]; } $tr->add([ $this::td($link), $this::td($row->membership_type) ]); return $tr; } protected function renderApplyFilter($assignFilter) { try { $string = AssignRenderer::forFilter( Filter::fromQueryString($assignFilter) )->renderAssign(); // Do not prefix it $string = preg_replace('/^assign where /', '', $string); } catch (Exception $e) { // ignore errors in filter rendering $string = 'Error in Filter rendering: ' . $e->getMessage(); } return $string; } protected function prepareQuery() { // select h.object_name, hg.object_name, // CASE WHEN hgh.host_id IS NULL THEN 'apply' ELSE 'direct' END AS assi // from icinga_hostgroup_host_resolved hgr join icinga_host h on h.id = hgr.host_id // join icinga_hostgroup hg on hgr.hostgroup_id = hg.id // left join icinga_hostgroup_host hgh on hgh.host_id = h.id and hgh.hostgroup_id = hg.id; $type = $this->getType(); $columns = [ 'o.id', 'o.object_type', 'o.object_name', 'membership_type' => "CASE WHEN go.{$type}_id IS NULL THEN 'apply' ELSE 'direct' END" ]; if ($this->group === null) { $columns = ['group_name' => 'g.object_name'] + $columns; } if ($type === 'service') { $columns[] = 'o.assign_filter'; $columns[] = 'o.host_id'; $columns[] = 'o.service_set_id'; } $query = $this->db()->select()->from( ['gro' => "icinga_{$type}group_{$type}_resolved"], $columns )->join( ['o' => "icinga_{$type}"], "o.id = gro.{$type}_id", [] )->join( ['g' => "icinga_{$type}group"], "gro.{$type}group_id = g.id", [] )->joinLeft( ['go' => "icinga_{$type}group_{$type}"], "go.{$type}_id = o.id AND go.{$type}group_id = g.id", [] )->order('o.object_name'); if ($this->group !== null) { $query->where('g.id = ?', $this->group->get('id')); } return $query; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/HostTemplateUsageTable.php000066400000000000000000000004531516513262500307620ustar00rootroot00000000000000 $this->translate('Templates'), 'objects' => $this->translate('Objects'), ]; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaAppliedServiceTable.php000066400000000000000000000022001516513262500313660ustar00rootroot00000000000000service = $service; return $this; } public function renderRow($row) { return $this::row([ new Link($row->service, 'director/service', ['id' => $row->id]) ]); } public function getColumnsToBeRendered() { return [$this->translate('Servicename')]; } public function prepareQuery() { return $this->db()->select()->from( array('s' => 'icinga_service'), array() )->joinLeft( array('si' => 'icinga_service_inheritance'), 's.id = si.service_id', array() )->where( 'si.parent_service_id = ?', $this->service->id )->where('s.object_type = ?', 'apply'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaCommandArgumentTable.php000066400000000000000000000054351516513262500315650ustar00rootroot00000000000000command = $command; $this->branch = $branch; parent::__construct($command->getConnection()); $this->getAttributes()->set('data-base-target', '_self'); } public function renderRow($row) { return $this::row([ Link::create($row->argument_name, 'director/command/arguments', [ 'argument' => $row->argument_name, 'name' => $this->command->getObjectName() ]), $row->argument_value ]); } public function getColumnsToBeRendered() { return [ $this->translate('Argument'), $this->translate('Value'), ]; } public function prepareQuery() { $db = $this->db(); if ($this->branch->isBranch()) { return (new ArrayDatasource((array) $this->command->arguments()->toPlainObject()))->select(); /** @var Db $connection */ $connection = $this->connection(); $store = new BranchModificationStore($connection, 'command'); $modification = $store->loadOptionalModificationByName( $this->command->getObjectName(), $this->branch->getUuid() ); if ($modification) { $props = $modification->getProperties()->jsonSerialize(); if (isset($props->arguments)) { return new ArrayDatasource((array) $this->command->arguments()->toPlainObject()); } } } $id = $this->command->get('id'); if ($id === null) { return new ArrayDatasource([]); } return $this->db()->select()->from( ['ca' => 'icinga_command_argument'], [ 'id' => 'ca.id', 'argument_name' => "COALESCE(ca.argument_name, '(none)')", 'argument_value' => 'ca.argument_value', ] )->where( 'ca.command_id = ?', $id )->order('ca.sort_order')->order('ca.argument_name')->limit(100); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaHostAppliedForServiceTable.php000066400000000000000000000052531516513262500327060ustar00rootroot00000000000000setHost($host)->setDictionary($dict); $table->getAttributes()->set('data-base-target', '_self'); return $table; } public function setDictionary(CustomVariableDictionary $dict) { $this->cv = $dict; return $this; } public function setTitle($title) { $this->title = $title; return $this; } public function setHost(IcingaHost $host) { $this->host = $host; return $this; } /** * Show no related links * * @param bool $readonly * @return $this */ public function setReadonly($readonly = true) { $this->readonly = (bool) $readonly; return $this; } public function highlightService($service) { $this->highlightedService = $service; return $this; } public function renderRow($row) { if ($this->readonly) { if ($this->highlightedService === $row->service) { $link = Html::tag('span', ['class' => 'icon-right-big'], $row->service); } else { $link = $row->service; } } else { $link = Link::create($row->service, 'director/host/appliedservice', [ 'name' => $this->host->object_name, 'service' => $row->service, ]); } return $this::row([$link]); } public function getColumnsToBeRendered() { return [ $this->title ?: $this->translate('Service name'), ]; } public function prepareQuery() { $data = []; foreach ($this->cv->getValue() as $key => $var) { $data[] = (object) array( 'service' => $key, ); } return (new ArrayDatasource($data))->select(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaHostAppliedServicesTable.php000066400000000000000000000127131516513262500324210ustar00rootroot00000000000000setHost($host); $table->getAttributes()->set('data-base-target', '_self'); return $table; } public function setTitle($title) { $this->title = $title; return $this; } public function getColumnsToBeRendered() { return [$this->title]; } public function setHost(IcingaHost $host) { $this->host = $host; $this->db = $host->getDb(); return $this; } /** * Show no related links * * @param bool $readonly * @return $this */ public function setReadonly($readonly = true) { $this->readonly = (bool) $readonly; return $this; } public function highlightService($service) { $this->highlightedService = $service; return $this; } public function renderRow($row) { $classes = []; if ($row->blacklisted === 'y') { $classes[] = 'strike-links'; } if ($row->disabled === 'y') { $classes[] = 'disabled'; } $attributes = empty($classes) ? null : ['class' => $classes]; if ($this->readonly) { if ($this->highlightedService === $row->name) { $link = Html::tag('a', ['class' => 'icon-right-big'], $row->name); } else { $link = Html::tag('a', $row->name); } } else { $applyFor = ''; if (! empty($row->apply_for)) { $applyFor = sprintf('(apply for %s) ', $row->apply_for); } $link = Link::create(sprintf( $this->translate('%s %s(%s)'), $row->name, $applyFor, $this->renderApplyFilter($row->filter) ), 'director/host/appliedservice', [ 'name' => $this->host->getObjectName(), 'service_id' => $row->id, ]); } return $this::row([$link], $attributes); } /** * @param Filter $assignFilter * * @return string */ protected function renderApplyFilter(Filter $assignFilter) { try { $string = AssignRenderer::forFilter($assignFilter)->renderAssign(); } catch (IcingaException $e) { $string = 'Error in Filter rendering: ' . $e->getMessage(); } return $string; } /** * @return \Icinga\Data\SimpleQuery */ public function prepareQuery() { $services = []; $matcher = HostApplyMatches::prepare($this->host); foreach ($this->getAllApplyRules() as $rule) { if ($matcher->matchesFilter($rule->filter)) { $services[] = $rule; } } $ds = new ArrayDatasource($services); return $ds->select()->columns([ 'id' => 'id', 'uuid' => 'uuid', 'name' => 'name', 'filter' => 'filter', 'disabled' => 'disabled', 'blacklisted' => 'blacklisted', 'assign_filter' => 'assign_filter', 'apply_for' => 'apply_for', ]); } /*** * @return array */ protected function getAllApplyRules() { if ($this->allApplyRules === null) { $this->allApplyRules = $this->fetchAllApplyRules(); foreach ($this->allApplyRules as $rule) { $rule->filter = Filter::fromQueryString($rule->assign_filter); } } return $this->allApplyRules; } /** * @return array */ protected function fetchAllApplyRules() { $db = $this->db; $hostId = $this->host->get('id'); $query = $db->select()->from( ['s' => 'icinga_service'], [ 'id' => 's.id', 'uuid' => 's.uuid', 'name' => 's.object_name', 'assign_filter' => 's.assign_filter', 'apply_for' => 's.apply_for', 'disabled' => 's.disabled', 'blacklisted' => $hostId ? "CASE WHEN hsb.service_id IS NULL THEN 'n' ELSE 'y' END" : "('n')", ] )->where('object_type = ? AND assign_filter IS NOT NULL', 'apply') ->order('s.object_name'); if ($hostId) { $query->joinLeft( ['hsb' => 'icinga_host_service_blacklist'], $db->quoteInto('s.id = hsb.service_id AND hsb.host_id = ?', $hostId), [] ); } return $db->fetchAll($query); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaHostsMatchingFilterTable.php000066400000000000000000000032221516513262500324150ustar00rootroot00000000000000dataSource = new ArrayDatasource( (new IcingaHostObjectResolver($db->getDbAdapter())) ->fetchObjectsMatchingFilter($filter) ); return $table; } public function renderRow($row) { return $this::row([ Link::create( $row->object_name, 'director/host', ['name' => $row->object_name] ) ]); } public function getColumnsToBeRendered() { return [ $this->translate('Hostname'), ]; } protected function getPaginationAdapter() { return new SimpleQueryPaginationAdapter($this->getQuery()); } public function getQuery() { return $this->prepareQuery(); } protected function fetchQueryRows() { return $this->dataSource->fetchAll($this->getQuery()); } protected function prepareQuery() { return new SimpleQuery($this->dataSource, ['object_name']); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaObjectDatafieldTable.php000066400000000000000000000040711516513262500315030ustar00rootroot00000000000000object = $object; $this->objectId = (int) $object->id; return $this; } protected $searchColumns = array( 'varname', 'caption' ); public function getColumns() { return array( 'object_id', 'var_filter', 'is_required', 'id', 'varname', 'caption', 'description', 'datatype', 'format', ); } public function getColumnsToBeRendered() { return array( 'caption' => $this->translate('Label'), 'varname' => $this->translate('Field name'), 'is_required' => $this->translate('Mandatory'), ); } public function renderRow($row) { $definedOnThis = (int) $row->object_id === $this->objectId; if ($definedOnThis) { $caption = new Link( $row->caption, Url::fromRequest()->with('field_id', $row->id) ); } else { $caption = $row->caption; } $row = $this::row([ $caption, $row->varname, $row->is_required ]); if (! $definedOnThis) { $row->getAttributes()->add('class', 'disabled'); } return $row; } public function prepareQuery() { $loader = new IcingaObjectFieldLoader($this->object); $fields = $loader->fetchFieldDetailsForObject($this->object); $ds = new ArrayDatasource($fields); return $ds->select(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaScheduledDowntimeRangeTable.php000066400000000000000000000034031516513262500330610ustar00rootroot00000000000000getConnection()); $table->downtime = $downtime; $table->getAttributes()->set('data-base-target', '_self'); return $table; } public function renderRow($row) { return $this::row([ Link::create( $row->range_key, 'director/scheduled-downtime/ranges', [ 'name' => $this->downtime->getObjectName(), 'range' => $row->range_key, 'range_type' => 'include' ] ), $row->range_value ]); } public function getColumnsToBeRendered() { return [ $this->translate('Day(s)'), $this->translate('Timeperiods'), ]; } public function prepareQuery() { return $this->db()->select()->from( ['r' => 'icinga_scheduled_downtime_range'], [ 'scheduled_downtime_id' => 'r.scheduled_downtime_id', 'range_key' => 'r.range_key', 'range_value' => 'r.range_value', ] )->where('r.scheduled_downtime_id = ?', $this->downtime->id); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaServiceSetHostTable.php000066400000000000000000000027671516513262500314230ustar00rootroot00000000000000getConnection()); $table->set = $set; return $table; } public function renderRow($row) { return $this::row([ Link::create( $row->host, 'director/host', ['name' => $row->host] ) ]); } public function getColumnsToBeRendered() { return [ $this->translate('Hostname'), ]; } public function prepareQuery() { return $this->db()->select()->from( ['h' => 'icinga_host'], [ 'id' => 'h.id', 'host' => 'h.object_name', 'object_type' => 'h.object_type', ] )->joinLeft( ['ssh' => 'icinga_service_set'], 'ssh.host_id = h.id', [] )->joinLeft( ['ssih' => 'icinga_service_set_inheritance'], 'ssih.service_set_id = ssh.id', [] )->where( 'ssih.parent_service_set_id = ?', $this->set->id )->order('h.object_name'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaServiceSetServiceTable.php000066400000000000000000000164741516513262500321060ustar00rootroot00000000000000getConnection()); $table->set = $set; $table->getAttributes()->set('data-base-target', '_self'); return $table; } /** * @param string $title * @return $this */ public function setTitle($title) { $this->title = $title; return $this; } /** * @param IcingaHost $host * @return $this */ public function setHost(IcingaHost $host) { $this->host = $host; return $this; } /** * @param IcingaHost $host * @return $this */ public function setAffectedHost(IcingaHost $host) { $this->affectedHost = $host; return $this; } /** * Show no related links * * @param bool $readonly * @return $this */ public function setReadonly($readonly = true) { $this->readonly = (bool) $readonly; return $this; } public function highlightService($service) { $this->highlightedService = $service; return $this; } /** * @param $row * @return BaseHtmlElement */ protected function getServiceLink($row) { if ($this->readonly) { if ($this->highlightedService === $row->service) { return Html::tag('span', ['class' => 'ro-service icon-right-big'], $row->service); } return Html::tag('span', ['class' => 'ro-service'], $row->service); } if ($this->affectedHost) { $params = [ 'uuid' => $this->affectedHost->getUniqueId()->toString(), 'service' => $row->service, 'set' => $row->service_set ]; $url = 'director/host/servicesetservice'; } else { if (is_resource($row->uuid)) { $row->uuid = stream_get_contents($row->uuid); } $params = [ 'uuid' => Uuid::fromBytes($row->uuid)->toString(), ]; $url = 'director/service'; } return Link::create( $row->service, $url, $params ); } public function renderRow($row) { $tr = $this::row([ $this->getServiceLink($row) ]); $classes = $this->getRowClasses($row); if ($row->disabled === 'y') { $classes[] = 'disabled'; } if ($row->blacklisted === 'y') { $classes[] = 'strike-links'; } if (! empty($classes)) { $tr->getAttributes()->add('class', $classes); } return $tr; } protected function getRowClasses($row) { if ($row->branch_uuid !== null) { return ['branch_modified']; } return []; } protected function getTitle() { return $this->title ?: $this->translate('Servicename'); } protected function renderTitleColumns() { if (! $this->host || ! $this->affectedHost) { return Html::tag('th', $this->getTitle()); } if ($this->readonly) { $link = $this->createFakeRemoveLinkForReadonlyView(); } elseif ($this->affectedHost->get('id') !== $this->host->get('id')) { $link = $this->linkToHost($this->host); } else { $link = $this->createRemoveLinkForm(); } return $this::th([$this->getTitle(), $link]); } /** * @return \Zend_Db_Select * @throws \Zend_Db_Select_Exception */ public function prepareQuery() { $connection = $this->connection(); assert($connection instanceof Db); $builder = new ServiceSetQueryBuilder($connection, $this->branchUuid); $query = $builder->selectServicesForSet($this->set); $alias = $this->branchUuid ? 'u' : 'o'; if ($this->affectedHost) { if ($hostId = $this->affectedHost->get('id')) { $query->joinLeft( ['hsb' => 'icinga_host_service_blacklist'], $this->db()->quoteInto("$alias.id = hsb.service_id AND hsb.host_id = ?", $hostId), [] )->columns([ 'blacklisted' => "CASE WHEN hsb.service_id IS NULL THEN 'n' ELSE 'y' END" ]); } } return $query->limit(100); } protected function createFakeRemoveLinkForReadonlyView() { return Html::tag('span', [ 'class' => ['icon-paste', 'seviceset-obj-link'], ], $this->host->getObjectName()); } protected function linkToHost(IcingaHost $host) { $hostname = $host->getObjectName(); return Link::create($hostname, 'director/host/services', ['name' => $hostname], [ 'class' => ['icon-paste', 'seviceset-obj-link'], 'data-base-target' => '_next', 'title' => sprintf( $this->translate('This set has been inherited from %s'), $hostname ) ]); } protected function createRemoveLinkForm() { $deleteLink = new RemoveLinkForm( $this->translate('Remove'), sprintf( $this->translate('Remove "%s" from this host'), $this->getTitle() ), Url::fromPath('director/host/services', [ 'name' => $this->host->getObjectName() ]), ['title' => $this->getTitle()] ); $deleteLink->runOnSuccess(function () { $conn = $this->set->getConnection(); $db = $conn->getDbAdapter(); $query = $db->select()->from(['ss' => 'icinga_service_set'], 'ss.id') ->join(['ssih' => 'icinga_service_set_inheritance'], 'ssih.service_set_id = ss.id', []) ->where('ssih.parent_service_set_id = ?', $this->set->get('id')) ->where('ss.host_id = ?', $this->host->get('id')); IcingaServiceSet::loadWithAutoIncId( $db->fetchOne($query), $conn )->delete(); }); $deleteLink->handleRequest(); return $deleteLink; } public function removeQueryLimit() { $query = $this->getQuery(); $query->reset($query::LIMIT_OFFSET); $query->reset($query::LIMIT_COUNT); return $this; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IcingaTimePeriodRangeTable.php000066400000000000000000000031031516513262500315100ustar00rootroot00000000000000getConnection()); $table->period = $period; $table->getAttributes()->set('data-base-target', '_self'); return $table; } public function renderRow($row) { return $this::row([ Link::create( $row->range_key, 'director/timeperiod/ranges', array( 'name' => $this->period->object_name, 'range' => $row->range_key, 'range_type' => 'include' ) ), $row->range_value ]); } public function getColumnsToBeRendered() { return [ $this->translate('Day(s)'), $this->translate('Timeperiods'), ]; } public function prepareQuery() { return $this->db()->select()->from( ['r' => 'icinga_timeperiod_range'], [ 'timeperiod_id' => 'r.timeperiod_id', 'range_key' => 'r.range_key', 'range_value' => 'r.range_value', ] )->where('r.timeperiod_id = ?', $this->period->id); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ImportedrowsTable.php000066400000000000000000000047671516513262500300760ustar00rootroot00000000000000setImportRun($run); return $table; } public function setImportRun(ImportRun $run) { $this->importRun = $run; return $this; } public function setColumns($columns) { $this->columns = $columns; return $this; } protected function getKeyColumn() { if ($this->keyColumn === null) { $this->keyColumn = $this->importRun->importSource()->get('key_column'); } return $this->keyColumn; } public function getColumns() { if ($this->columns === null) { $cols = $this->importRun->listColumnNames(); $keyColumn = $this->getKeyColumn(); if ($keyColumn !== null && ($pos = array_search($keyColumn, $cols)) !== false) { unset($cols[$pos]); array_unshift($cols, $keyColumn); } } else { $cols = $this->columns; } return array_combine($cols, $cols); } public function renderRow($row) { // Find a better place! if ($row === null) { return null; } $tr = $this::tr(); foreach ($this->getColumnsToBeRendered() as $column) { $td = $this::td(); if (property_exists($row, $column)) { if (is_string($row->$column) || $row->$column instanceof ValidHtml) { $td->setContent($row->$column); } else { $html = Html::tag('pre', null, PlainObjectRenderer::render($row->$column)); $td->setContent($html); } } $tr->add($td); } return $tr; } public function getColumnsToBeRendered() { return $this->getColumns(); } public function prepareQuery() { $ds = new ArrayDatasource( $this->importRun->fetchRows($this->columns) ); return $ds->select()->order($this->getKeyColumn()); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ImportrunTable.php000066400000000000000000000043641516513262500273700ustar00rootroot00000000000000getConnection()); $table->source = $source; return $table; } public function getColumnsToBeRendered() { return [ $this->translate('Source name'), $this->translate('Timestamp'), $this->translate('Imported rows'), ]; } public function renderRow($row) { return $this::row([ Link::create( $row->source_name, 'director/importrun', ['id' => $row->id] ), $row->start_time, $row->cnt_rows ]); } public function prepareQuery() { $db = $this->db(); $columns = array( 'id' => 'r.id', 'source_id' => 's.id', 'source_name' => 's.source_name', 'start_time' => 'r.start_time', 'rowset' => 'LOWER(HEX(rs.checksum))', 'cnt_rows' => 'COUNT(rsr.row_checksum)', ); if ($this->isPgsql()) { $columns['rowset'] = "LOWER(ENCODE(rs.checksum, 'hex'))"; } // TODO: Store row count to rowset $query = $db->select()->from( ['s' => 'import_source'], $columns )->join( ['r' => 'import_run'], 'r.source_id = s.id', [] )->joinLeft( ['rs' => 'imported_rowset'], 'rs.checksum = r.rowset_checksum', [] )->joinLeft( ['rsr' => 'imported_rowset_row'], 'rs.checksum = rsr.rowset_checksum', [] )->group('r.id')->group('s.id')->group('rs.checksum') ->order('r.start_time DESC'); if ($this->source) { $query->where('r.source_id = ?', $this->source->get('id')); } return $query; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ImportsourceHookTable.php000066400000000000000000000055061516513262500307040ustar00rootroot00000000000000getAttributes()->add('class', 'raw-data-table collapsed'); } public function getColumns() { if ($this->columnCache === null) { $this->columnCache = SyncUtils::getRootVariables(array_merge( $this->sourceHook()->listColumns(), $this->source->listModifierTargetProperties() )); sort($this->columnCache); // prioritize key column $keyColumn = $this->source->get('key_column'); if ($keyColumn !== null && ($pos = array_search($keyColumn, $this->columnCache)) !== false) { unset($this->columnCache[$pos]); array_unshift($this->columnCache, $keyColumn); } } return $this->columnCache; } public function setImportSource(ImportSource $source) { $this->source = $source; return $this; } public function getColumnsToBeRendered() { return $this->getColumns(); } public function renderRow($row) { // Find a better place! if ($row === null) { return null; } if (\is_array($row)) { $row = (object) $row; } $tr = $this::tr(); foreach ($this->getColumnsToBeRendered() as $column) { $td = $this::td(); if (\property_exists($row, $column)) { if (\is_string($row->$column) || $row->$column instanceof ValidHtml) { $td->setContent($row->$column); } else { $html = Html::tag('pre', null, PlainObjectRenderer::render($row->$column)); $td->setContent($html); } } $tr->add($td); } return $tr; } protected function sourceHook() { if ($this->sourceHook === null) { $this->sourceHook = ImportSourceHook::forImportSource( $this->source ); } return $this->sourceHook; } public function prepareQuery() { $data = $this->sourceHook()->fetchData(); $this->source->applyModifiers($data); $ds = new ArrayDatasource($data); return $ds->select(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ImportsourceTable.php000066400000000000000000000031521516513262500300560ustar00rootroot00000000000000translate('Source name'), ]; } protected function assemble() { $this->getAttributes()->add('class', 'syncstate'); parent::assemble(); } public function renderRow($row) { $caption = [Link::create( $row->source_name, 'director/importsource', ['id' => $row->id] )]; if ($row->description !== null) { $caption[] = ': ' . $row->description; } if ($row->import_state === 'failing' && $row->last_error_message) { $caption[] = ' (' . $row->last_error_message . ')'; } $tr = $this::row([$caption]); $tr->getAttributes()->add('class', $row->import_state); return $tr; } public function prepareQuery() { return $this->db()->select()->from( ['s' => 'import_source'], [ 'id' => 's.id', 'source_name' => 's.source_name', 'provider_class' => 's.provider_class', 'import_state' => 's.import_state', 'last_error_message' => 's.last_error_message', 'description' => 's.description', ] )->order('source_name ASC'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/IntlZfQueryBasedTable.php000066400000000000000000000024001516513262500305510ustar00rootroot00000000000000getDateFormatter()->format((new DateTime())->setTimestamp($timestamp)); if ($this->lastDay !== $day) { $this->nextHeader()->add( $this::th($day, [ 'colspan' => 2, 'class' => 'table-header-day' ]) ); $this->lastDay = $day; $this->nextBody(); } } protected function getTime(int $timeStamp) { $timeFormatter = $this->getDateFormatter(); $timeFormatter->setPattern( in_array(Locale::getDefault(), ['en_US', 'en_US.UTF-8']) ? 'h:mm:ss a' : 'H:mm:ss' ); return $timeFormatter->format((new DateTime())->setTimestamp($timeStamp)); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/JobTable.php000066400000000000000000000043251516513262500261000ustar00rootroot00000000000000getAttributes()->add('class', 'jobs'); parent::assemble(); } public function renderRow($row) { $caption = [Link::create( $row->job_name, 'director/job', ['id' => $row->id] )]; if ($row->last_attempt_succeeded === 'n' && $row->last_error_message) { $caption[] = ' (' . $row->last_error_message . ')'; } $tr = $this::row([$caption]); $tr->getAttributes()->add('class', $this->getJobClasses($row)); return $tr; } protected function getJobClasses($row) { if ($row->ts_last_attempt === null) { return 'pending'; } if ($row->ts_last_attempt + $row->run_interval * 1000 < DaemonUtil::timestampWithMilliseconds()) { return 'pending'; } if ($row->last_attempt_succeeded === 'y') { return 'ok'; } elseif ($row->last_attempt_succeeded === 'n') { return 'critical'; } else { return 'unknown'; } } public function getColumnsToBeRendered() { return [ $this->translate('Job name'), ]; } public function prepareQuery() { return $this->db()->select()->from( ['j' => 'director_job'], [ 'id' => 'j.id', 'job_name' => 'j.job_name', 'job_class' => 'j.job_class', 'disabled' => 'j.disabled', 'run_interval' => 'j.run_interval', 'last_attempt_succeeded' => 'j.last_attempt_succeeded', 'ts_last_attempt' => 'j.ts_last_attempt', 'ts_last_error' => 'j.ts_last_error', 'last_error_message' => 'j.last_error_message', ] )->order('job_name'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/NotificationTemplateUsageTable.php000066400000000000000000000013171516513262500324730ustar00rootroot00000000000000 $this->translate('Templates'), 'applyrules' => $this->translate('Apply Rules'), ]; } protected function getSummaryTables(string $templateType, Db $connection) { return [ 'templates' => TemplatesTable::create( $templateType, $connection ), 'applyrules' => ApplyRulesTable::create($templateType, $connection) ->setBranchUuid($this->branchUuid) ]; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectSetTable.php000066400000000000000000000177531516513262500272610ustar00rootroot00000000000000type = $type; $table->auth = $auth; return $table; } public function getType() { return $this->type; } public function getColumnsToBeRendered() { return [$this->translate('Name')]; } public function renderRow($row) { $type = $this->getType(); $params = [ 'uuid' => Uuid::fromBytes(Db\DbUtil::binaryResult($row->uuid))->toString(), ]; $url = Url::fromPath("director/{$type}set", $params); $classes = $this->getRowClasses($row); $tr = static::tr([ static::td([ Link::create(sprintf( $this->translate('%s (%d members)'), $row->object_name, $row->count_services ), $url), $row->description ? [Html::tag('br'), Html::tag('i', $row->description)] : null ]) ]); if (! empty($classes)) { $tr->getAttributes()->add('class', $classes); } return $tr; } protected function getRowClasses($row) { if ($row->branch_uuid !== null) { return ['branch_modified']; } return []; } protected function prepareQuery() { $type = $this->getType(); $table = "icinga_{$type}_set"; $columns = [ 'id' => 'os.id', 'uuid' => 'os.uuid', 'branch_uuid' => '(NULL)', 'object_name' => 'os.object_name', 'object_type' => 'os.object_type', 'assign_filter' => 'os.assign_filter', 'description' => 'os.description', 'count_services' => 'COUNT(DISTINCT o.uuid)', ]; if ($this->branchUuid) { $columns['branch_uuid'] = 'bos.branch_uuid'; $columns = $this->branchifyColumns($columns); $this->stripSearchColumnAliases(); } $query = $this->db()->select()->from( ['os' => $table], $columns )->joinLeft( ['o' => "icinga_{$type}"], "o.{$type}_set_id = os.id", [] ); $nameFilter = new FilterByNameRestriction( $this->connection(), $this->auth, "{$type}_set" ); $nameFilter->applyToQuery($query, 'os'); /** @var Db $conn */ $conn = $this->connection(); if ($this->branchUuid) { $right = clone($query); $query->joinLeft( ['bos' => "branched_$table"], // TODO: PgHexFunc $this->db()->quoteInto( 'bos.uuid = os.uuid AND bos.branch_uuid = ?', $conn->quoteBinary($this->branchUuid->getBytes()) ), [] )->where("(bos.branch_deleted IS NULL OR bos.branch_deleted = 'n')"); $right->joinRight( ['bos' => "branched_$table"], 'bos.uuid = os.uuid', [] ) ->where('os.uuid IS NULL') ->where('bos.branch_uuid = ?', $conn->quoteBinary($this->branchUuid->getBytes())); $query->group('COALESCE(os.uuid, bos.uuid)'); $right->group('COALESCE(os.uuid, bos.uuid)'); if ($conn->isPgsql()) { // This is ugly, might want to modify the query - even a subselect looks better $query->group('bos.uuid')->group('os.uuid')->group('os.id')->group('bos.branch_uuid'); $right->group('bos.uuid')->group('os.uuid')->group('os.id')->group('bos.branch_uuid'); } $right->joinLeft( ['bo' => "branched_icinga_{$type}"], "bo.{$type}_set = bos.object_name", [] )->group(['bo.object_name', 'o.object_name']); $query->joinLeft( ['bo' => "branched_icinga_{$type}"], "bo.{$type}_set = bos.object_name", [] )->group(['bo.object_name', 'o.object_name']); $this->queries = [ $query, $right ]; $query = $this->db()->select()->union([ 'l' => new DbSelectParenthesis($query), 'r' => new DbSelectParenthesis($right), ]); $query = $this->db()->select()->from(['u' => $query]); $query->order('object_name')->limit(100); $query ->group('uuid') ->where('object_type = ?', 'template') ->order('object_name'); if ($conn->isPgsql()) { // BS. Drop count? Sub-select? Better query? $query ->group('uuid') ->group('id') ->group('branch_uuid') ->group('object_name') ->group('object_type') ->group('assign_filter') ->group('description') ->group('count_services'); } } else { // Disabled for now, check for correctness: // $query->joinLeft( // ['osi' => "icinga_{$type}_set_inheritance"], // "osi.parent_{$type}_set_id = os.id", // [] // )->joinLeft( // ['oso' => "icinga_{$type}_set"], // "oso.id = oso.{$type}_set_id", // [] // ); // 'count_hosts' => 'COUNT(DISTINCT oso.id)', $query ->group('os.uuid') ->where('os.object_type = ?', 'template') ->order('os.object_name'); if ($conn->isPgsql()) { // BS. Drop count? Sub-select? Better query? $query ->group('os.uuid') ->group('os.id') ->group('os.object_name') ->group('os.object_type') ->group('os.assign_filter') ->group('os.description'); }; $this->queries = [$query]; } return $query; } public function search($search) { if (! empty($search)) { $columns = $this->getSearchColumns(); if (strpos($search, ' ') === false) { $filter = Filter::matchAny(); foreach ($columns as $column) { $filter->addFilter(Filter::expression($column, '=', "*$search*")); } } else { $filter = Filter::matchAll(); foreach (explode(' ', $search) as $s) { $sub = Filter::matchAny(); foreach ($columns as $column) { $sub->addFilter(Filter::expression($column, '=', "*$s*")); } $filter->addFilter($sub); } } foreach ($this->queries as $query) { FilterRenderer::applyToQuery($filter, $query); } } return $this; } /** * @return Db */ public function connection() { return parent::connection(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectsTable.php000066400000000000000000000233311516513262500267550ustar00rootroot00000000000000 'o.object_name', 'object_type' => 'o.object_type', 'disabled' => 'o.disabled', 'uuid' => 'o.uuid', ]; protected $searchColumns = ['o.object_name']; protected $showColumns = ['object_name' => 'Name']; protected $filterObjectType = 'object'; protected $type; protected $baseObjectUrl; /** @var IcingaObject */ protected $dummyObject; protected $leftSubQuery; protected $rightSubQuery; /** @var Auth */ private $auth; public function __construct($db, Auth $auth) { $this->auth = $auth; parent::__construct($db); } /** * @param $type * @param Db $db * @return static */ public static function create($type, Db $db, Auth $auth) { $class = __NAMESPACE__ . '\\ObjectsTable' . ucfirst($type); if (! class_exists($class)) { $class = __CLASS__; } /** @var static $table */ $table = new $class($db, $auth); $table->type = $type; return $table; } public function getType() { return $this->type; } /** * @param string $url * @return $this */ public function setBaseObjectUrl($url) { $this->baseObjectUrl = $url; return $this; } public function filterObjectType($type) { $this->filterObjectType = $type; return $this; } public function addObjectRestriction(ObjectRestriction $restriction) { $this->objectRestrictions[$restriction->getName()] = $restriction; return $this; } public function getColumns() { return $this->columns; } public function getColumnsToBeRendered() { return $this->showColumns; } public function filterTemplate( IcingaObject $template, $inheritance = Db\IcingaObjectFilterHelper::INHERIT_DIRECT ) { if ($this->branchUuid) { $tableAlias = 'u'; } else { $tableAlias = 'o'; } IcingaObjectFilterHelper::filterByTemplate( $this->getQuery(), $template, $tableAlias, $inheritance, $this->branchUuid ); return $this; } protected function getMainLinkLabel($row) { return $row->object_name; } protected function renderObjectNameColumn($row) { $type = $this->baseObjectUrl; $url = Url::fromPath("director/{$type}", [ 'uuid' => Uuid::fromBytes($row->uuid)->toString() ]); return static::td(Link::create($this->getMainLinkLabel($row), $url)); } protected function renderExtraColumns($row) { $columns = $this->getColumnsToBeRendered(); unset($columns['object_name']); $cols = []; foreach ($columns as $key => & $label) { $cols[] = static::td($row->$key); } return $cols; } public function renderRow($row) { if (isset($row->uuid) && is_resource($row->uuid)) { $row->uuid = stream_get_contents($row->uuid); } $tr = static::tr([ $this->renderObjectNameColumn($row), $this->renderExtraColumns($row) ]); $classes = $this->getRowClasses($row); if ($row->disabled === 'y') { $classes[] = 'disabled'; } if (! empty($classes)) { $tr->getAttributes()->add('class', $classes); } return $tr; } protected function getRowClasses($row) { // TODO: remove isset, to figure out where it is missing if (isset($row->branch_uuid) && $row->branch_uuid !== null) { return ['branch_modified']; } return []; } protected function applyObjectTypeFilter(ZfSelect $query, ZfSelect $right = null) { if ($right) { $right->where( 'bo.object_type = ?', $this->filterObjectType ); } return $query->where( 'o.object_type = ?', $this->filterObjectType ); } protected function applyRestrictions(ZfSelect $query) { foreach ($this->getRestrictions() as $restriction) { $restriction->applyToQuery($query); } return $query; } protected function getRestrictions() { if ($this->objectRestrictions === null) { $this->objectRestrictions = $this->loadRestrictions(); } return $this->objectRestrictions; } protected function loadRestrictions() { /** @var Db $db */ $db = $this->connection(); $dummyObject = $this->getDummyObject(); $type = $dummyObject->getShortTableName(); if ($dummyObject->isApplyRule()) { return [new FilterByNameRestriction($db, $this->auth, $type)]; } else { return [new HostgroupRestriction($db, $this->auth)]; } } /** * @return IcingaObject */ protected function getDummyObject() { if ($this->dummyObject === null) { $type = $this->getType(); $this->dummyObject = IcingaObject::createByType($type); } return $this->dummyObject; } protected function prepareQuery() { $table = $this->getDummyObject()->getTableName(); if ($this->branchUuid) { $this->columns['branch_uuid'] = 'bo.branch_uuid'; } $columns = $this->getColumns(); if ($this->branchUuid) { $columns = $this->branchifyColumns($columns); $this->stripSearchColumnAliases(); } $query = $this->db()->select()->from(['o' => $table], $columns); if ($this->branchUuid) { $right = clone($query); // Hint: Right part has only those with object = null // This means that restrictions on $right would hide all // new rows. Dedicated restriction logic for the branch-only // part of thw union are not required, we assume that restrictions // for new objects have been checked once they have been created $query = $this->applyRestrictions($query); /** @var Db $conn */ $conn = $this->connection(); $query->joinLeft( ['bo' => "branched_$table"], // TODO: PgHexFunc $this->db()->quoteInto( 'bo.uuid = o.uuid AND bo.branch_uuid = ?', $conn->quoteBinary($this->branchUuid->getBytes()) ), [] ); // keep the imported templates as columns $leftColumns = $columns; $rightColumns = $columns; if ($this->db() instanceof Zend_Db_Adapter_Pdo_Pgsql) { $leftColumns['imports'] = 'CONCAT(\'[\', ARRAY_TO_STRING(ARRAY_AGG' . '(CONCAT(\'"\', sub_o.object_name, \'"\')), \',\'), \']\')'; } else { $leftColumns['imports'] = 'CONCAT(\'[\', ' . 'GROUP_CONCAT(CONCAT(\'"\', sub_o.object_name, \'"\')), \']\')'; } $query->reset('columns'); $query->columns($leftColumns) ->joinLeft( ['oi' => $table . '_inheritance'], 'o.id = oi.' . $this->getType() . '_id', [] )->joinLeft( ['sub_o' => $table], 'sub_o.id = oi.parent_' . $this->getType() . '_id', [] )->group(['o.id', 'bo.uuid', 'bo.branch_uuid']); $rightColumns['imports'] = 'bo.imports'; $right->reset('columns'); $right->columns($rightColumns); $query->where("(bo.branch_deleted IS NULL OR bo.branch_deleted = 'n')"); $this->applyObjectTypeFilter($query, $right); $right->joinRight( ['bo' => "branched_$table"], 'bo.uuid = o.uuid', [] ) ->where('o.uuid IS NULL') ->where('bo.branch_uuid = ?', $conn->quoteBinary($this->branchUuid->getBytes())); $this->leftSubQuery = $query; $this->rightSubQuery = $right; $query = $this->db()->select()->union([ 'l' => new DbSelectParenthesis($query), 'r' => new DbSelectParenthesis($right), ]); $query = $this->db()->select()->from(['u' => $query]); $query->order('object_name')->limit(100); } else { $this->applyObjectTypeFilter($query); $query = $this->applyRestrictions($query); $query->order('o.object_name')->limit(100); } return $query; } public function removeQueryLimit() { $query = $this->getQuery(); $query->reset($query::LIMIT_OFFSET); $query->reset($query::LIMIT_COUNT); return $this; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectsTableApiUser.php000066400000000000000000000004721516513262500302470ustar00rootroot00000000000000where("o.object_type IN ('object', 'external_object')"); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectsTableCommand.php000066400000000000000000000042171516513262500302560ustar00rootroot00000000000000 'o.uuid', 'object_name' => 'o.object_name', 'object_type' => 'o.object_type', 'disabled' => 'o.disabled', 'command' => 'o.command', ]; protected $showColumns = [ 'object_name' => 'Command', 'command' => 'Command line' ]; private $objectType; public function setType($type) { $this->getQuery()->where('object_type = ?', $type); return $this; } public function showOnlyUsed() { $this->getQuery()->where( '(' . 'EXISTS (SELECT check_command_id FROM icinga_host WHERE check_command_id = o.id)' . ' OR EXISTS (SELECT check_command_id FROM icinga_service WHERE check_command_id = o.id)' . ' OR EXISTS (SELECT event_command_id FROM icinga_host WHERE event_command_id = o.id)' . ' OR EXISTS (SELECT event_command_id FROM icinga_service WHERE event_command_id = o.id)' . ' OR EXISTS (SELECT command_id FROM icinga_notification WHERE command_id = o.id)' . ')' ); } public function showOnlyUnUsed() { $this->getQuery()->where( '(' . 'NOT EXISTS (SELECT check_command_id FROM icinga_host WHERE check_command_id = o.id)' . ' AND NOT EXISTS (SELECT check_command_id FROM icinga_service WHERE check_command_id = o.id)' . ' AND NOT EXISTS (SELECT event_command_id FROM icinga_host WHERE event_command_id = o.id)' . ' AND NOT EXISTS (SELECT event_command_id FROM icinga_service WHERE event_command_id = o.id)' . ' AND NOT EXISTS (SELECT command_id FROM icinga_notification WHERE command_id = o.id)' . ')' ); } protected function applyObjectTypeFilter(ZfSelect $query, ZfSelect $right = null) { return $query; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectsTableEndpoint.php000066400000000000000000000045671516513262500304700ustar00rootroot00000000000000 $this->translate('Endpoint'), 'host' => $this->translate('Host'), 'zone' => $this->translate('Zone'), 'object_type' => $this->translate('Type'), ); } public function getColumns() { return [ 'uuid' => 'o.uuid', 'object_name' => 'o.object_name', 'object_type' => 'o.object_type', 'disabled' => 'o.disabled', 'host' => "(CASE WHEN o.host IS NULL THEN NULL ELSE" . " CONCAT(o.host || ':' || COALESCE(o.port, 5665)) END)", 'zone' => 'z.object_name', ]; } protected function getMainLinkLabel($row) { if ($row->object_name === $this->deploymentEndpoint) { return [ $row->object_name, ' ', Icon::create('upload', [ 'title' => $this->translate( 'This is your Config master and will receive our Deployments' ) ]) ]; } else { return $row->object_name; } } public function getRowClasses($row) { if ($row->object_name === $this->deploymentEndpoint) { return array_merge(array('deployment-endpoint'), parent::getRowClasses($row)); } else { return null; } } protected function applyObjectTypeFilter(ZfSelect $query, ZfSelect $right = null) { return $query->where("o.object_type IN ('object', 'external_object')"); } public function prepareQuery() { if ($this->deploymentEndpoint === null) { /** @var \Icinga\Module\Director\Db $c */ $c = $this->connection(); if ($c->hasDeploymentEndpoint()) { $this->deploymentEndpoint = $c->getDeploymentEndpointName(); } } return parent::prepareQuery()->joinLeft( ['z' => 'icinga_zone'], 'o.zone_id = z.id', [] ); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectsTableHost.php000066400000000000000000000015071516513262500276140ustar00rootroot00000000000000 'o.object_name', 'display_name' => 'o.display_name', 'address' => 'o.address', 'disabled' => 'o.disabled', 'uuid' => 'o.uuid', ]; protected $showColumns = [ 'object_name' => 'Hostname', 'address' => 'Address' ]; public function assemble() { $this->enableMultiSelect( 'director/hosts/edit', 'director/hosts', ['uuid'] ); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectsTableHostTemplateChoice.php000066400000000000000000000011541516513262500324210ustar00rootroot00000000000000 'o.object_name', 'templates' => 'GROUP_CONCAT(t.object_name)' ]; protected function applyObjectTypeFilter(ZfSelect $query, ZfSelect $right = null) { return $query; } protected function prepareQuery() { return parent::prepareQuery()->joinLeft( ['t' => 'icinga_host'], 't.template_choice_id = o.id', [] )->group('o.id'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectsTableService.php000066400000000000000000000156041516513262500303020ustar00rootroot00000000000000 'o.object_name', 'disabled' => 'o.disabled', 'host' => 'h.object_name', 'host_id' => 'h.id', 'host_object_type' => 'h.object_type', 'host_disabled' => 'h.disabled', 'id' => 'o.id', 'uuid' => 'o.uuid', 'blacklisted' => "CASE WHEN hsb.service_id IS NULL THEN 'n' ELSE 'y' END", ]; protected $searchColumns = [ 'o.object_name', 'h.object_name' ]; public function assemble() { $this->enableMultiSelect( 'director/services/edit', 'director/services', ['uuid'] ); } public function setTitle($title) { $this->title = $title; return $this; } public function setHost(IcingaHost $host) { $this->host = $host; $this->getAttributes()->set('data-base-target', '_self'); return $this; } public function setInheritedBy(IcingaHost $host) { $this->inheritedBy = $host; return $this; } /** * Show no related links * * @param bool $readonly * @return $this */ public function setReadonly($readonly = true) { $this->readonly = (bool) $readonly; return $this; } public function highlightService($service) { $this->highlightedService = $service; return $this; } public function getColumnsToBeRendered() { if ($this->title) { return [$this->title]; } if ($this->host) { return [$this->translate('Servicename')]; } return [ 'host' => $this->translate('Host'), 'object_name' => $this->translate('Service Name'), ]; } public function renderRow($row) { $caption = $row->host === null ? Html::tag('span', ['class' => 'error'], '- none -') : $row->host; $hostField = static::td($caption); if ($row->host === null) { $hostField->getAttributes()->add('class', 'error'); } if ($this->host) { $tr = static::tr([ static::td($this->getServiceLink($row)) ]); } else { $tr = static::tr([ $hostField, static::td($this->getServiceLink($row)) ]); } $attributes = $tr->getAttributes(); $classes = $this->getRowClasses($row); if ($row->host_disabled === 'y' || $row->disabled === 'y') { $classes[] = 'disabled'; } if ($row->blacklisted === 'y') { $classes[] = 'strike-links'; } $attributes->add('class', $classes); return $tr; } protected function getInheritedServiceLink($row, $target) { $params = [ 'name' => $target->object_name, 'service' => $row->object_name, 'inheritedFrom' => $row->host, ]; return Link::create( $row->object_name, 'director/host/inheritedservice', $params ); } protected function getServiceLink($row) { if ($this->readonly) { if ($this->highlightedService === $row->object_name) { return Html::tag('span', ['class' => 'icon-right-big'], $row->object_name); } else { return $row->object_name; } } $params = [ 'uuid' => Uuid::fromBytes(DbUtil::binaryResult($row->uuid))->toString(), ]; if ($row->host !== null) { $params['host'] = $row->host; } if ($target = $this->inheritedBy) { return $this->getInheritedServiceLink($row, $target); } return Link::create( $row->object_name, 'director/service/edit', $params ); } public function prepareQuery() { $query = parent::prepareQuery(); if ($this->branchUuid) { $queries = [$this->leftSubQuery, $this->rightSubQuery]; } else { $queries = [$query]; } foreach ($queries as $subQuery) { $subQuery->joinLeft( ['h' => 'icinga_host'], 'o.host_id = h.id', [] ); if ($this->inheritedBy) { $ancestors = $this->inheritedBy->listAncestorIds(); $ancestors[] = $this->inheritedBy->get('id'); $subQuery->joinLeft( ['hi' => 'icinga_host_inheritance'], 'h.id = hi.parent_host_id', [] )->joinLeft( ['hc' => 'icinga_host'], 'hi.host_id = hc.id', [] )->joinLeft( ['hsb' => 'icinga_host_service_blacklist'], $this->db()->quoteInto('hsb.service_id = o.id AND hsb.host_id IN (?)', $ancestors), [] )->where('hc.id IN (?)', $ancestors); $subQuery->where('o.service_set_id IS NULL') ->group(['o.id', 'o.object_name']) ->order('o.object_name')->order('h.object_name'); } else { $subQuery->joinLeft( ['hsb' => 'icinga_host_service_blacklist'], 'hsb.service_id = o.id AND hsb.host_id = o.host_id', [] ); $subQuery->where('o.service_set_id IS NULL'); } $subQuery ->group(['o.id', 'h.id', 'o.object_name', 'h.object_name', 'hsb.service_id', 'hsb.host_id']) ->order('o.object_name')->order('h.object_name'); if ($this->branchUuid) { $subQuery->where('bo.service_set IS NULL') ->group(['bo.uuid', 'bo.branch_uuid']); } if ($this->host) { if ($this->branchUuid) { $subQuery->where('COALESCE(h.object_name, bo.host) = ?', $this->host->getObjectName()); } else { $subQuery->where('h.id = ?', $this->host->get('id')); } } } return $query; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectsTableSetMembers.php000066400000000000000000000173741516513262500307560ustar00rootroot00000000000000type = $type; $table->auth = $auth; return $table; } public function getType() { return $this->type; } public function getColumnsToBeRendered() { return [ 'os.object_name' => 'Service Set', 'o.object_name' => 'Service Name' ]; } public function setBaseObjectUrl($url) { $this->baseObjectUrl = $url; return $this; } protected function getRowClasses($row) { // TODO: remove isset, to figure out where it is missing if (isset($row->branch_uuid) && $row->branch_uuid !== null) { return ['branch_modified']; } return []; } /** * Should be triggered from renderRow, still unused. * * @param IcingaObject $template * @param string $inheritance * @return $this * @throws \Icinga\Exception\ProgrammingError */ public function filterTemplate( IcingaObject $template, $inheritance = IcingaObjectFilterHelper::INHERIT_DIRECT ) { IcingaObjectFilterHelper::filterByTemplate( $this->getQuery(), $template, 'o', $inheritance, $this->branchUuid ); return $this; } public function renderRow($row) { $url = Url::fromPath('director/service/edit', [ 'name' => $row->object_name, 'uuid' => Uuid::fromBytes(DbUtil::binaryResult($row->uuid))->toString(), ]); return static::tr([ static::td([ Link::create($row->service_set, $url), ]), static::td($row->object_name), ])->addAttributes(['class' => $this->getRowClasses($row)]); } /** * @return IcingaObject */ protected function getDummyObject() { if ($this->dummyObject === null) { $type = $this->type; $this->dummyObject = IcingaObject::createByType($type); } return $this->dummyObject; } protected function prepareQuery() { $table = $this->getDummyObject()->getTableName(); $type = $this->getType(); $columns = [ 'id' => 'o.id', 'uuid' => 'o.uuid', 'service_set' => 'os.object_name', 'object_name' => 'o.object_name', 'object_type' => 'os.object_type', 'assign_filter' => 'os.assign_filter', 'description' => 'os.description', ]; $query = $this->db()->select()->from( ['o' => $table], $columns )->joinLeft( ['os' => "icinga_{$type}_set"], "o.{$type}_set_id = os.id", [] )->where('o.host_id IS NULL'); $nameFilter = new FilterByNameRestriction( $this->connection(), $this->auth, "{$type}_set" ); $nameFilter->applyToQuery($query, 'os'); if ($this->branchUuid) { $columns['branch_uuid'] = 'bos.branch_uuid'; $conn = $this->connection(); if ($conn->isPgsql()) { $columns['imports'] = 'CONCAT(\'[\', ARRAY_TO_STRING(ARRAY_AGG' . '(CONCAT(\'"\', sub_o.object_name, \'"\')), \',\'), \']\')'; } else { $columns['imports'] = 'CONCAT(\'[\', ' . 'GROUP_CONCAT(CONCAT(\'"\', sub_o.object_name, \'"\')), \']\')'; } $columns = $this->branchifyColumns($columns); $this->stripSearchColumnAliases(); $query->reset('columns'); $right = clone($query); $conn = $this->connection(); $query->columns($columns)->joinLeft( ['bos' => "branched_icinga_{$type}_set"], // TODO: PgHexFunc $this->db()->quoteInto( 'bos.uuid = os.uuid AND bos.branch_uuid = ?', $conn->quoteBinary($this->branchUuid->getBytes()) ), [] )->joinLeft( ['oi' => $table . '_inheritance'], 'o.id = oi.' . $this->getType() . '_id', [] )->joinLeft( ['sub_o' => $table], 'sub_o.id = oi.parent_' . $this->getType() . '_id', [] )->where("(bos.branch_deleted IS NULL OR bos.branch_deleted = 'n')"); $columns['imports'] = 'bo.imports'; $right->columns($columns)->joinRight( ['bos' => "branched_icinga_{$type}_set"], 'bos.uuid = os.uuid', [] ) ->where('os.uuid IS NULL') ->where('bos.branch_uuid = ?', $conn->quoteBinary($this->branchUuid->getBytes())); $query->group('COALESCE(os.uuid, bos.uuid)'); $right->group('COALESCE(os.uuid, bos.uuid)'); if ($conn->isPgsql()) { // This is ugly, might want to modify the query - even a subselect looks better $query->group('bos.uuid')->group('os.uuid')->group('os.id')->group('bos.branch_uuid')->group('o.id'); $right->group('bos.uuid')->group('os.uuid')->group('os.id')->group('bos.branch_uuid')->group('o.id'); } $right->joinLeft( ['bo' => "branched_icinga_{$type}"], "bo.{$type}_set = bos.object_name", [] )->group(['bo.object_name', 'o.object_name', 'bo.uuid', 'bo.imports']); $query->joinLeft( ['bo' => "branched_icinga_{$type}"], "bo.{$type}_set = bos.object_name", [] )->group(['bo.object_name', 'o.object_name', 'bo.uuid']); $query = $this->db()->select()->union([ 'l' => new DbSelectParenthesis($query), 'r' => new DbSelectParenthesis($right), ]); $query = $this->db()->select()->from(['u' => $query]); $query->order('object_name')->limit(100); $query ->group('uuid') ->where('object_type = ?', 'template') ->order('object_name'); if ($conn->isPgsql()) { $query ->group('uuid') ->group('id') ->group('imports') ->group('branch_uuid') ->group('object_name') ->group('object_type') ->group('assign_filter') ->group('description') ->group('service_set'); } } else { $query ->where('o.object_type = ?', 'object') ->order('os.object_name'); } return $query; } /** * @return Db */ public function connection() { return parent::connection(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ObjectsTableZone.php000066400000000000000000000003761516513262500276150ustar00rootroot00000000000000getConnection()); $table->source = $source; $table->url = $url; return $table; } public function setReadOnly($readOnly = true) { $this->readOnly = $readOnly; return $this; } public function render() { if ($this->readOnly || $this->request === null) { return parent::render(); } return (new PropertyTableSortForm($this->getUniqueFormName(), new HtmlString(parent::render()))) ->setAction($this->request->getUrl()->getAbsoluteUrl()) ->on(Form::ON_SENT, function (PropertyTableSortForm $form) { $csrf = $form->getElement(QuickForm::CSRF); if ($csrf !== null && $csrf->isValid()) { $this->reallyHandleSortPriorityActions(); } }) ->handleRequest(ServerRequest::fromGlobals()) ->render(); } protected function assemble() { $this->getAttributes()->set('data-base-target', '_self'); } public function getColumns() { return array( 'id' => 'm.id', 'source_id' => 'm.source_id', 'property_name' => 'm.property_name', 'target_property' => 'm.target_property', 'description' => 'm.description', 'provider_class' => 'm.provider_class', 'priority' => 'm.priority', ); } public function renderRow($row) { $caption = $row->property_name; if ($row->target_property !== null) { $caption .= ' -> ' . $row->target_property; } if ($row->description === null) { $class = $row->provider_class; try { /** @var ImportSourceHook $hook */ $hook = new $class(); $caption .= ': ' . $hook->getName(); } catch (Exception $e) { $caption = $this->createErrorCaption($caption, $e); } catch (Error $e) { $caption = $this->createErrorCaption($caption, $e); } } else { $caption .= ': ' . $row->description; } $renderedRow = $this::row([ Link::create($caption, 'director/importsource/editmodifier', [ 'id' => $row->id, 'source_id' => $row->source_id, ]), ]); if ($this->readOnly) { return $renderedRow; } return $this->addSortPriorityButtons( $renderedRow, $row ); } /** * @param $caption * @param Exception|Error $e * @return array */ protected function createErrorCaption($caption, $e) { return [ $caption, ': ', $this::tag('span', ['class' => 'error'], $e->getMessage()) ]; } public function getColumnsToBeRendered() { if ($this->readOnly) { return [$this->translate('Property')]; } return [ $this->translate('Property'), $this->getSortPriorityTitle() ]; } public function prepareQuery() { return $this->db()->select()->from( ['m' => 'import_row_modifier'], $this->getColumns() )->where('m.source_id = ?', $this->source->get('id')) ->order('priority'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/QuickTable.php000066400000000000000000000350771516513262500264520ustar00rootroot00000000000000createClassAttribute($this->getRowClasses($row)); } protected function createClassAttribute($classes) { $str = $this->createClassesString($classes); if (strlen($str) > 0) { return ' class="' . $str . '"'; } else { return ''; } } private function createClassesString($classes) { if (is_string($classes)) { $classes = array($classes); } if (empty($classes)) { return ''; } else { return implode(' ', $classes); } } protected function getMultiselectProperties() { /* array( * 'url' => 'director/hosts/edit', * 'sourceUrl' => 'director/hosts', * 'keys' => 'name' * ) */ return array(); } protected function renderMultiselectAttributes() { $props = $this->getMultiselectProperties(); if (empty($props)) { return ''; } $prefix = 'data-icinga-multiselect-'; $view = $this->view(); $parts = array(); $multi = array( 'url' => $view->href($props['url']), 'controllers' => $view->href($props['sourceUrl']), 'data' => implode(',', $props['keys']), ); foreach ($multi as $k => $v) { $parts[] = $prefix . $k . '="' . $v . '"'; } return ' ' . implode(' ', $parts); } protected function renderRow($row) { $htm = " getRowClassesString($row) . ">\n"; $firstCol = true; foreach ($this->getTitles() as $key => $title) { // Support missing columns if (property_exists($row, $key)) { $val = $row->$key; } else { $val = null; } $value = null; if ($firstCol) { if ($val !== null && $url = $this->getActionUrl($row)) { $value = $this->view()->qlink($val, $this->getActionUrl($row)); } $firstCol = false; } if ($value === null) { if ($val === null) { $value = '-'; } elseif (is_array($val) || $val instanceof stdClass || is_bool($val)) { $value = '
    '
                               . $this->view()->escape(PlainObjectRenderer::render($val))
                               . '
    '; } else { $value = $this->view()->escape($val); } } $htm .= ' ' . $value . "\n"; } if ($this->hasAdditionalActions()) { $htm .= ' ' . $this->renderAdditionalActions($row) . "\n"; } return $htm . " \n"; } abstract protected function getTitles(); protected function getActionUrl($row) { return false; } public function setConnection(Selectable $connection) { $this->connection = $connection; return $this; } /** * @return ZfDbSelect */ abstract protected function getBaseQuery(); public function fetchData() { $db = $this->db(); $query = $this->getBaseQuery()->columns($this->getColumns()); if ($this->hasLimit() || $this->hasOffset()) { $query->limit($this->getLimit(), $this->getOffset()); } $this->applyFiltersToQuery($query); return $db->fetchAll($query); } protected function applyFiltersToQuery(ZfDbSelect $query) { $filter = null; $enforced = $this->enforcedFilters; if ($this->filter && ! $this->filter->isEmpty()) { $filter = $this->filter; } elseif (! empty($enforced)) { $filter = array_shift($enforced); } if ($filter) { foreach ($enforced as $f) { $filter = $filter->andFilter($f); } $query->where($this->renderFilter($filter)); } return $query; } public function getPaginator() { $paginator = new Paginator(); $paginator->setQuery($this); return $paginator; } #[\ReturnTypeWillChange] public function count() { $db = $this->db(); $query = clone($this->getBaseQuery()); $query->reset('order')->columns(array('COUNT(*)')); $this->applyFiltersToQuery($query); return $db->fetchOne($query); } public function limit($count = null, $offset = null) { $this->limit = $count; $this->offset = $offset; return $this; } public function hasLimit() { return $this->limit !== null; } public function getLimit() { return $this->limit; } public function hasOffset() { return $this->offset !== null; } public function getOffset() { return $this->offset; } public function hasAdditionalActions() { return method_exists($this, 'renderAdditionalActions'); } /** @return Db */ protected function connection() { // TODO: Fail if missing? Require connection in constructor? return $this->connection; } protected function db() { return $this->connection()->getDbAdapter(); } protected function renderTitles($row) { $view = $this->view(); $htm = "\n \n"; foreach ($row as $title) { $htm .= ' ' . $view->escape($title) . "\n"; } if ($this->hasAdditionalActions()) { $htm .= ' ' . $view->translate('Actions') . "\n"; } return $htm . " \n\n"; } protected function url($url, $params) { return Url::fromPath($url, $params); } protected function listTableClasses() { $classes = array('simple', 'common-table', 'table-row-selectable'); $multi = $this->getMultiselectProperties(); if (! empty($multi)) { $classes[] = 'multiselect'; } return $classes; } public function render() { $data = $this->fetchData(); $htm = 'createClassAttribute($this->listTableClasses()) . $this->renderMultiselectAttributes() . '>' . "\n" . $this->renderTitles($this->getTitles()) . $this->beginTableBody(); foreach ($data as $row) { $htm .= $this->renderRow($row); } return $htm . $this->endTableBody() . $this->endTable(); } protected function beginTableBody() { return "\n"; } protected function endTableBody() { return "\n"; } protected function endTable() { return "\n"; } /** * @return View */ protected function view() { if ($this->view === null) { $this->view = Icinga::app()->getViewRenderer()->view; } return $this->view; } public function setView($view) { $this->view = $view; } public function __toString() { return $this->render(); } protected function getSearchColumns() { return $this->searchColumns; } abstract public function getColumns(); public function getFilterColumns() { $keys = array_keys($this->getColumns()); return array_combine($keys, $keys); } public function setFilter($filter) { $this->filter = $filter; return $this; } public function enforceFilter($filter, $expression = null) { if (! $filter instanceof Filter) { $filter = Filter::where($filter, $expression); } $this->enforcedFilters[] = $filter; return $this; } public function getFilterEditor(Request $request) { $filterEditor = Widget::create('filterEditor') ->setColumns(array_keys($this->getColumns())) ->setSearchColumns($this->getSearchColumns()) ->preserveParams('limit', 'sort', 'dir', 'view', 'backend', '_dev') ->ignoreParams('page') ->handleRequest($request); $filter = $filterEditor->getFilter(); $this->setFilter($filter); return $filterEditor; } protected function mapFilterColumn($col) { $cols = $this->getColumns(); return $cols[$col]; } protected function renderFilter(Filter $filter, $level = 0) { $str = ''; if ($filter instanceof FilterChain) { if ($filter instanceof FilterAnd) { $op = ' AND '; } elseif ($filter instanceof FilterOr) { $op = ' OR '; } elseif ($filter instanceof FilterNot) { $op = ' AND '; $str .= ' NOT '; } else { throw new QueryException( 'Cannot render filter: %s', $filter ); } $parts = array(); if (! $filter->isEmpty()) { foreach ($filter->filters() as $f) { $filterPart = $this->renderFilter($f, $level + 1); if ($filterPart !== '') { $parts[] = $filterPart; } } if (! empty($parts)) { if ($level > 0) { $str .= ' (' . implode($op, $parts) . ') '; } else { $str .= implode($op, $parts); } } } } else { /** @var FilterExpression $filter */ $str .= $this->whereToSql( $this->mapFilterColumn($filter->getColumn()), $filter->getSign(), $filter->getExpression() ); } return $str; } protected function escapeForSql($value) { // bindParam? bindValue? if (is_array($value)) { $ret = array(); foreach ($value as $val) { $ret[] = $this->escapeForSql($val); } return implode(', ', $ret); } else { //if (preg_match('/^\d+$/', $value)) { // return $value; //} else { return $this->db()->quote($value); //} } } protected function escapeWildcards($value) { return preg_replace('/\*/', '%', $value); } protected function valueToTimestamp($value) { // We consider integers as valid timestamps. Does not work for URL params if (! is_string($value) || ctype_digit($value)) { return $value; } $value = strtotime($value); if (! $value) { /* NOTE: It's too late to throw exceptions, we might finish in __toString throw new QueryException(sprintf( '"%s" is not a valid time expression', $value )); */ } return $value; } protected function timestampForSql($value) { // TODO: do this db-aware return $this->escapeForSql(date('Y-m-d H:i:s', $value)); } /** * Check for timestamp fields * * TODO: This is not here to do automagic timestamp stuff. One may * override this function for custom voodoo, IdoQuery right now * does. IMO we need to split whereToSql functionality, however * I'd prefer to wait with this unless we understood how other * backends will work. We probably should also rename this * function to isTimestampColumn(). * * @param string $field Field Field name to checked * @return bool Whether this field expects timestamps */ public function isTimestamp($field) { return false; } public function whereToSql($col, $sign, $expression) { if ($this->isTimestamp($col)) { $expression = $this->valueToTimestamp($expression); } if (is_array($expression) && $sign === '=') { // TODO: Should we support this? Doesn't work for blub* return $col . ' IN (' . $this->escapeForSql($expression) . ')'; } elseif ($sign === '=' && strpos($expression, '*') !== false) { if ($expression === '*') { // We'll ignore such filters as it prevents index usage and because "*" means anything, anything means // all whereas all means that whether we use a filter to match anything or no filter at all makes no // difference, except for performance reasons... return ''; } return $col . ' LIKE ' . $this->escapeForSql($this->escapeWildcards($expression)); } elseif ($sign === '!=' && strpos($expression, '*') !== false) { if ($expression === '*') { // We'll ignore such filters as it prevents index usage and because "*" means nothing, so whether we're // using a real column with a valid comparison here or just an expression which cannot be evaluated to // true makes no difference, except for performance reasons... return $this->escapeForSql(0); } return $col . ' NOT LIKE ' . $this->escapeForSql($this->escapeWildcards($expression)); } else { return $col . ' ' . $sign . ' ' . $this->escapeForSql($expression); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/ServiceTemplateUsageTable.php000066400000000000000000000022601516513262500314430ustar00rootroot00000000000000 $this->translate('Templates'), 'objects' => $this->translate('Objects'), 'applyrules' => $this->translate('Apply Rules'), 'setmembers' => $this->translate('Set Members'), ]; } protected function getSummaryTables(string $templateType, Db $connection) { $auth = Auth::getInstance(); return [ 'templates' => TemplatesTable::create( $templateType, $connection ), 'objects' => ObjectsTable::create($templateType, $connection, $this->auth) ->setBranchUuid($this->branchUuid), 'applyrules' => ApplyRulesTable::create($templateType, $connection) ->setBranchUuid($this->branchUuid), 'setmembers' => ObjectsTableSetMembers::create( $templateType, $connection, $auth ) ]; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/SyncRunTable.php000066400000000000000000000047461516513262500267760ustar00rootroot00000000000000getConnection()); $this->getAttributes() ->set('data-base-target', '_self') ->add('class', 'history'); $this->rule = $rule; } public function renderRow($row) { $time = strtotime($row->start_time); $this->renderDayIfNew($time); return $this::tr([ $this::td($this->makeSummary($row)), $this::td(new Link( $this->getTime($time), 'director/syncrule/history', [ 'id' => $row->rule_id, 'run_id' => $row->id, ] )) ]); } protected function makeSummary($row) { $parts = []; if ($row->objects_created > 0) { $parts[] = sprintf( $this->translate('%d created'), $row->objects_created ); } if ($row->objects_modified > 0) { $parts[] = sprintf( $this->translate('%d modified'), $row->objects_modified ); } if ($row->objects_deleted > 0) { $parts[] = sprintf( $this->translate('%d deleted'), $row->objects_deleted ); } return implode(', ', $parts); } public function prepareQuery() { return $this->db()->select()->from( array('sr' => 'sync_run'), [ 'id' => 'sr.id', 'rule_id' => 'sr.rule_id', 'rule_name' => 'sr.rule_name', 'start_time' => 'sr.start_time', 'duration_ms' => 'sr.duration_ms', 'objects_deleted' => 'sr.objects_deleted', 'objects_created' => 'sr.objects_created', 'objects_modified' => 'sr.objects_modified', 'last_former_activity' => 'sr.last_former_activity', 'last_related_activity' => 'sr.last_related_activity', ] )->where( 'sr.rule_id = ?', $this->rule->get('id') )->order('start_time DESC'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/SyncpropertyTable.php000066400000000000000000000065711516513262500301140ustar00rootroot00000000000000getConnection()); $table->getAttributes()->set('data-base-target', '_self'); $table->rule = $rule; return $table; } public function render() { if ($this->request === null) { return parent::render(); } return (new PropertyTableSortForm($this->getUniqueFormName(), new HtmlString(parent::render()))) ->setAction($this->request->getUrl()->getAbsoluteUrl()) ->on(Form::ON_SENT, function (PropertyTableSortForm $form) { $csrf = $form->getElement(QuickForm::CSRF); if ($csrf !== null && $csrf->isValid()) { $this->reallyHandleSortPriorityActions(); } }) ->handleRequest(ServerRequest::fromGlobals()) ->render(); } public function renderRow($row) { return $this->addSortPriorityButtons( $this::row([ $row->source_name, $row->source_expression, new Link( $row->destination_field, 'director/syncrule/editproperty', [ 'id' => $row->id, 'rule_id' => $row->rule_id, ] ), ]), $row ); } public function getColumnsToBeRendered() { return [ $this->translate('Source name'), $this->translate('Source field'), $this->translate('Destination'), $this->getSortPriorityTitle() ]; } public function prepareQuery() { return $this->db()->select()->from( ['p' => 'sync_property'], [ 'id' => 'p.id', 'rule_id' => 'p.rule_id', 'rule_name' => 'r.rule_name', 'source_id' => 'p.source_id', 'source_name' => 's.source_name', 'source_expression' => 'p.source_expression', 'destination_field' => 'p.destination_field', 'priority' => 'p.priority', 'filter_expression' => 'p.filter_expression', 'merge_policy' => 'p.merge_policy' ] )->join( ['r' => 'sync_rule'], 'r.id = p.rule_id', [] )->join( ['s' => 'import_source'], 's.id = p.source_id', [] )->where( 'p.rule_id = ?', $this->rule->get('id') )->order('p.priority'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/SyncruleTable.php000066400000000000000000000034751516513262500271770ustar00rootroot00000000000000getAttributes()->add('class', 'syncstate'); parent::assemble(); } public function renderRow($row) { $caption = [Link::create( $row->rule_name, 'director/syncrule', ['id' => $row->id] )]; if ($row->description !== null) { $caption[] = ': ' . $row->description; } if ($row->sync_state === 'failing' && $row->last_error_message) { $caption[] = ' (' . $row->last_error_message . ')'; } $tr = $this::row([$caption, $row->object_type]); $tr->getAttributes()->add('class', $row->sync_state); return $tr; } public function getColumnsToBeRendered() { return [ $this->translate('Rule name'), $this->translate('Object type'), ]; } public function prepareQuery() { return $this->db()->select()->from( ['s' => 'sync_rule'], [ 'id' => 's.id', 'rule_name' => 's.rule_name', 'sync_state' => 's.sync_state', 'object_type' => 's.object_type', 'update_policy' => 's.update_policy', 'purge_existing' => 's.purge_existing', 'filter_expression' => 's.filter_expression', 'last_error_message' => 's.last_error_message', 'description' => 's.description', ] )->order('rule_name'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/TableLoader.php000066400000000000000000000022431516513262500265710ustar00rootroot00000000000000getApplicationDir('tables'); $ns = '\\Icinga\\Web\\Tables\\'; } else { $basedir = $module->getBaseDir() . '/application/tables'; $ns = '\\Icinga\\Module\\' . ucfirst($module->getName()) . '\\Tables\\'; } if (preg_match('~^[a-z0-9/]+$~i', $name)) { $parts = preg_split('~/~', $name); $class = ucfirst(array_pop($parts)) . 'Table'; $file = sprintf('%s/%s/%s.php', rtrim($basedir, '/'), implode('/', $parts), $class); if (file_exists($file)) { require_once($file); /** @var QuickTable $class */ $class = $ns . $class; return new $class(); } } throw new ProgrammingError(sprintf('Cannot load %s (%s), no such table', $name, $file)); } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/TableWithBranchSupport.php000066400000000000000000000035751516513262500310220ustar00rootroot00000000000000isBranch()) { $this->setBranchUuid($branch->getUuid()); } return $this; } public function setBranchUuid(UuidInterface $uuid = null) { $this->branchUuid = $uuid; return $this; } protected function branchifyColumns($columns) { $result = [ 'uuid' => 'COALESCE(o.uuid, bo.uuid)' ]; $ignore = ['o.id', 'os.id', 'o.service_set_id', 'os.host_id']; foreach ($columns as $alias => $column) { if (substr($column, 0, 2) === 'o.' && ! in_array($column, $ignore)) { // bo.column, o.column $column = "COALESCE(b$column, $column)"; } if (substr($column, 0, 3) === 'os.' && ! in_array($column, $ignore)) { // bo.column, o.column $column = "COALESCE(b$column, $column)"; } // Used in Service Tables: if ($column === 'h.object_name' && $alias = 'host') { $column = "COALESCE(bo.host, $column)"; } $result[$alias] = $column; } if (isset($result['count_services'])) { $result['count_services'] = 'COUNT(DISTINCT COALESCE(o.uuid, bo.uuid))'; } return $result; } protected function stripSearchColumnAliases() { foreach ($this->searchColumns as &$column) { $column = preg_replace('/^[a-z]+\./', '', $column); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/TemplateUsageTable.php000066400000000000000000000116141516513262500301250ustar00rootroot00000000000000 'pivot']; protected $objectType; protected $searchColumns = []; public function getTypes() { return [ 'templates' => $this->translate('Templates'), 'objects' => $this->translate('Objects'), ]; } /** * @param IcingaObject $template * @param Branch|null $branch * * @return TemplateUsageTable * * @throws ProgrammingError */ public static function forTemplate(IcingaObject $template, Auth $auth, Branch $branch = null) { $type = ucfirst($template->getShortTableName()); $class = __NAMESPACE__ . "\\{$type}TemplateUsageTable"; if (class_exists($class)) { return new $class($template, $auth, $branch); } else { return new static($template, $auth, $branch); } } public function getColumnsToBeRendered() { return [ '', $this->translate('Direct'), $this->translate('Indirect'), $this->translate('Total') ]; } protected function __construct(IcingaObject $template, Auth $auth, Branch $branch = null) { $this->auth = $auth; if ($template->get('object_type') !== 'template') { throw new ProgrammingError( 'TemplateUsageTable expects a template, got %s', $template->get('object_type') ); } $this->setBranch($branch); $this->objectType = $objectType = $template->getShortTableName(); $types = $this->getTypes(); $usage = $this->getUsageSummary($template); $used = false; $rows = []; foreach ($types as $type => $typeTitle) { $tr = Table::tr(Table::th($typeTitle)); foreach (['direct', 'indirect', 'total'] as $inheritance) { $count = $usage->$inheritance->$type; if (! $used && $count > 0) { $used = true; } $tr->add( Table::td( Link::create( $count, "director/{$objectType}template/$type", [ 'name' => $template->getObjectName(), 'inheritance' => $inheritance ] ) ) ); } $rows[] = $tr; } if ($used) { $this->getHeader()->add(Table::row($this->getColumnsToBeRendered(), null, 'th')); $this->add($rows); } else { $this->add($this->translate('This template is not in use')); } } protected function getUsageSummary(IcingaObject $template) { $connection = $template->getConnection(); $db = $connection->getDbAdapter(); $types = array_keys($this->getTypes()); $direct = []; $indirect = []; $templateType = $template->getShortTableName(); foreach ($this->getSummaryTables($templateType, $connection) as $type => $summaryTable) { $directTable = clone $summaryTable; $inDirectTable = clone $summaryTable; $direct[$type] = $db->query( $directTable ->filterTemplate($template, IcingaObjectFilterHelper::INHERIT_DIRECT) ->getQuery() )->rowCount(); $indirect[$type] = $db->query( $inDirectTable ->filterTemplate($template, IcingaObjectFilterHelper::INHERIT_INDIRECT) ->getQuery() )->rowCount(); } $total = []; foreach ($types as $type) { $total[$type] = $direct[$type] + $indirect[$type]; } return (object) [ 'direct' => (object) $direct, 'indirect' => (object) $indirect, 'total' => (object) $total ]; } protected function getSummaryTables(string $templateType, Db $connection) { return [ 'templates' => TemplatesTable::create( $templateType, $connection ), 'objects' => ObjectsTable::create($templateType, $connection, $this->auth) ->setBranchUuid($this->branchUuid) ]; } } icingaweb2-module-director-1.11.8/library/Director/Web/Table/TemplatesTable.php000066400000000000000000000102701516513262500273200ustar00rootroot00000000000000type = strtolower($type); return $table; } protected function assemble() { $type = $this->type; $this->enableMultiSelect( "director/{$type}s/edittemplates", "director/{$type}template", ['name'] ); } public function getType() { return $this->type; } public function getColumnsToBeRendered() { return [$this->translate('Template Name')]; } public function renderRow($row) { $name = $row->object_name; $type = str_replace('_', '-', $this->getType()); $caption = $row->is_used === 'y' ? $name : [ $name, Html::tag( 'span', ['class' => 'font-italic'], $this->translate(' - not in use -') ) ]; $url = Url::fromPath("director/{$type}template/usage", [ 'name' => $name ]); return $this::row([ new Link($caption, $url), [ new Link(new Icon('plus'), "director/$type/add", [ 'type' => 'object', 'imports' => $name ]), new Link(new Icon('history'), "director/$type/history", [ 'uuid' => Uuid::fromBytes(Db\DbUtil::binaryResult($row->uuid))->toString(), ]) ] ]); } public function filterTemplate( IcingaObject $template, $inheritance = IcingaObjectFilterHelper::INHERIT_DIRECT ) { IcingaObjectFilterHelper::filterByTemplate( $this->getQuery(), $template, 'o', $inheritance ); return $this; } public function showOnlyUsed() { $type = $this->getType(); $this->getQuery()->where( "(EXISTS (SELECT {$type}_id FROM icinga_{$type}_inheritance" . " WHERE parent_{$type}_id = o.id))" ); } public function showOnlyUnUsed() { $type = $this->getType(); $this->getQuery()->where( "(NOT EXISTS (SELECT {$type}_id FROM icinga_{$type}_inheritance" . " WHERE parent_{$type}_id = o.id))" ); } protected function applyRestrictions(ZfSelect $query) { $auth = Auth::getInstance(); $type = $this->type; $restrictions = $auth->getRestrictions("director/$type/template/filter-by-name"); if (empty($restrictions)) { return $query; } $filter = Filter::matchAny(); foreach ($restrictions as $restriction) { $filter->addFilter(Filter::where('o.object_name', $restriction)); } return FilterRenderer::applyToQuery($filter, $query); } protected function prepareQuery() { $type = $this->getType(); $used = "CASE WHEN EXISTS(SELECT 1 FROM icinga_{$type}_inheritance oi" . " WHERE oi.parent_{$type}_id = o.id) THEN 'y' ELSE 'n' END"; $columns = [ 'object_name' => 'o.object_name', 'uuid' => 'o.uuid', 'id' => 'o.id', 'is_used' => $used, ]; $query = $this->db()->select()->from( ['o' => "icinga_{$type}"], $columns )->where( "o.object_type = 'template'" )->order('o.object_name'); return $this->applyRestrictions($query); } } icingaweb2-module-director-1.11.8/library/Director/Web/Tabs/000077500000000000000000000000001516513262500235435ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Tabs/DataTabs.php000066400000000000000000000016371516513262500257460ustar00rootroot00000000000000assemble(); } protected function assemble() { $this->add('datafield', [ 'label' => $this->translate('Data fields'), 'url' => 'director/data/fields' ])->add('datafieldcategory', [ 'label' => $this->translate('Data field categories'), 'url' => 'director/data/fieldcategories' ])->add('datalist', [ 'label' => $this->translate('Data lists'), 'url' => 'director/data/lists' ])->add('customvars', [ 'label' => $this->translate('Custom Variables'), 'url' => 'director/data/vars' ]); } } icingaweb2-module-director-1.11.8/library/Director/Web/Tabs/ImportTabs.php000066400000000000000000000013021516513262500263340ustar00rootroot00000000000000assemble(); } protected function assemble() { $this->add('importsource', [ 'label' => $this->translate('Import source'), 'url' => 'director/importsources' ])->add('syncrule', [ 'label' => $this->translate('Sync rule'), 'url' => 'director/syncrules' ])->add('jobs', [ 'label' => $this->translate('Jobs'), 'url' => 'director/jobs' ]); } } icingaweb2-module-director-1.11.8/library/Director/Web/Tabs/ImportsourceTabs.php000066400000000000000000000032671516513262500275710ustar00rootroot00000000000000id = $id; $this->assemble(); } public function activateMainWithPostfix($postfix) { $mainTab = 'index'; $tab = $this->get($mainTab); $tab->setLabel($tab->getLabel() . ": $postfix"); $this->activate($mainTab); return $this; } protected function assemble() { if ($id = $this->id) { $params = ['id' => $id]; $this->add('index', [ 'url' => 'director/importsource', 'urlParams' => $params, 'label' => $this->translate('Import source'), ])->add('modifier', [ 'url' => 'director/importsource/modifier', 'urlParams' => ['source_id' => $id], 'label' => $this->translate('Modifiers'), ])->add('history', [ 'url' => 'director/importsource/history', 'urlParams' => $params, 'label' => $this->translate('History'), ])->add('preview', [ 'url' => 'director/importsource/preview', 'urlParams' => $params, 'label' => $this->translate('Preview'), ]); } else { $this->add('add', [ 'url' => 'director/importsource/add', 'label' => $this->translate('New import source'), ])->activate('add'); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Tabs/InfraTabs.php000066400000000000000000000024541516513262500261320ustar00rootroot00000000000000auth = $auth; // We are not a BaseElement, not yet $this->assemble(); } protected function assemble() { $auth = $this->auth; if ($auth->hasPermission(Permission::AUDIT)) { $this->add('activitylog', [ 'label' => $this->translate('Activity Log'), 'url' => 'director/config/activities' ]); } if ($auth->hasPermission(Permission::DEPLOY)) { $this->add('deploymentlog', [ 'label' => $this->translate('Deployments'), 'url' => 'director/config/deployments' ]); } if ($auth->hasPermission(Permission::ADMIN)) { $this->add('infrastructure', [ 'label' => $this->translate('Infrastructure'), 'url' => 'director/dashboard', 'urlParams' => ['name' => 'infrastructure'] ]); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Tabs/MainTabs.php000066400000000000000000000050611516513262500257540ustar00rootroot00000000000000auth = $auth; $this->dbResourceName = $dbResourceName; $this->add('main', [ 'label' => $this->translate('Overview'), 'url' => 'director' ]); if ($this->auth->hasPermission(Permission::ADMIN)) { $this->add('health', [ 'label' => $this->translate('Health'), 'url' => 'director/health' ])->add('daemon', [ 'label' => $this->translate('Daemon'), 'url' => 'director/daemon' ]); } } public function render() { if ($this->auth->hasPermission(Permission::ADMIN)) { if ($this->getActiveName() !== 'health') { $state = $this->getHealthState(); if ($state->isProblem()) { $this->get('health')->setTagParams([ 'class' => 'state-' . strtolower($state->getName()) ]); } } if ($this->getActiveName() !== 'daemon') { try { $daemon = new BackgroundDaemonState(Db::fromResourceName($this->dbResourceName)); if ($daemon->isRunning()) { $state = 'ok'; } else { $state = 'critical'; } } catch (\Exception $e) { $state = 'unknown'; } if ($state !== 'ok') { $this->get('daemon')->setTagParams([ 'class' => 'state-' . $state ]); } } } return parent::render(); } /** * @return \Icinga\Module\Director\CheckPlugin\PluginState */ protected function getHealthState() { $health = new Health(); $health->setDbResourceName($this->dbResourceName); $output = new HealthCheckPluginOutput($health); return $output->getState(); } } icingaweb2-module-director-1.11.8/library/Director/Web/Tabs/ObjectTabs.php000066400000000000000000000117401516513262500262770ustar00rootroot00000000000000type = $type; $this->auth = $auth; $this->object = $object; // We are not a BaseElement, not yet $this->assemble(); } protected function assemble() { if (null === $this->object) { $this->addTabsForNewObject(); } else { $this->addTabsForExistingObject(); } } protected function addTabsForNewObject() { $type = $this->type; $this->add('add', [ 'url' => sprintf('director/%s/add', $type), 'label' => sprintf($this->translate('Add %s'), ucfirst($type)), ]); } protected function addTabsForExistingObject() { $type = $this->type; $auth = $this->auth; $object = $this->object; $params = $object->getUrlParams(); if (! $object->isExternal() || in_array($object->getShortTableName(), $this->allowedExternals)) { $this->add('modify', [ 'url' => sprintf('director/%s', $type), 'urlParams' => $params, 'label' => $this->translate(ucfirst($type)) ]); } if ($object->getShortTableName() === 'host' && $auth->hasPermission(Permission::SERVICES)) { $this->add('services', [ 'url' => 'director/host/services', 'urlParams' => $params, 'label' => $this->translate('Services') ]); } if ($auth->hasPermission(Permission::SHOW_CONFIG)) { if ($object->getShortTableName() !== 'service' || $object->get('service_set_id') === null) { $this->add('render', [ 'url' => sprintf('director/%s/render', $type), 'urlParams' => $params, 'label' => $this->translate('Preview'), ]); } } if ($auth->hasPermission(Permission::AUDIT)) { $this->add('history', array( 'url' => sprintf('director/%s/history', $type), 'urlParams' => $params, 'label' => $this->translate('History') )); } if ($auth->hasPermission(Permission::ADMIN) && $this->hasFields()) { $this->add('fields', array( 'url' => sprintf('director/%s/fields', $type), 'urlParams' => $params, 'label' => $this->translate('Fields') )); } // TODO: remove table check once we resolve all group types if ( $object->isGroup() && ($object->getShortTableName() === 'hostgroup' || $object->getShortTableName() === 'servicegroup') ) { $this->add('membership', [ 'url' => sprintf('director/%s/membership', $type), 'urlParams' => $params, 'label' => $this->translate('Members') ]); } if ($object->supportsRanges()) { $this->add('ranges', [ 'url' => "director/{$type}/ranges", 'urlParams' => $params, 'label' => $this->translate('Ranges') ]); } if ( $object->getShortTableName() === 'endpoint' && $object->get('apiuser_id') ) { $this->add('inspect', [ 'url' => 'director/inspect/types', 'urlParams' => ['endpoint' => $object->getObjectName()], 'label' => $this->translate('Inspect') ]); $this->add('packages', [ 'url' => 'director/inspect/packages', 'urlParams' => ['endpoint' => $object->getObjectName()], 'label' => $this->translate('Packages') ]); } if ($object->getShortTableName() === 'host' && $auth->hasPermission(Permission::HOSTS)) { $this->add('agent', [ 'url' => 'director/host/agent', 'urlParams' => $params, 'label' => $this->translate('Agent') ]); } } protected function hasFields() { if (! ($object = $this->object)) { return false; } return $object->hasBeenLoadedFromDb() && $object->supportsFields() && ($object->isTemplate() || $this->type === 'command'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Tabs/ObjectsTabs.php000066400000000000000000000061051516513262500264610ustar00rootroot00000000000000isGroup()) { $object = IcingaObject::createByType(substr($typeUrl, 0, -5)); } $shortName = $object->getShortTableName(); $plType = strtolower(preg_replace('/cys$/', 'cies', $shortName . 's')); $plType = str_replace('_', '-', $plType); if ($auth->hasPermission("director/{$plType}")) { $this->add('index', [ 'url' => sprintf('director/%s', $plType), 'label' => $this->translate(ucfirst($plType)), ]); } if ($object->getShortTableName() === 'command') { $this->add('external', [ 'url' => sprintf('director/%s', strtolower($plType)), 'urlParams' => ['type' => 'external_object'], 'label' => $this->translate('External'), ]); } if ( $auth->hasPermission(Permission::ADMIN) || ( $object->getShortTableName() === 'notification' && $auth->hasPermission(Permission::NOTIFICATIONS) ) || ( $object->getShortTableName() === 'scheduled_downtime' && $auth->hasPermission(Permission::SCHEDULED_DOWNTIMES) ) ) { if ($object->supportsApplyRules()) { $this->add('applyrules', [ 'url' => sprintf('director/%s/applyrules', $plType), 'label' => $this->translate('Apply') ]); } } if ($auth->hasPermission(Permission::ADMIN) && $type !== 'zone') { if ($object->supportsImports()) { $this->add('templates', [ 'url' => sprintf('director/%s/templates', $plType), 'label' => $this->translate('Templates'), ]); } if ($object->supportsGroups()) { $this->add('groups', [ 'url' => sprintf('director/%sgroups', $type), 'label' => $this->translate('Groups') ]); } } if ($auth->hasPermission(Permission::ADMIN)) { if ($object->supportsChoices()) { $this->add('choices', [ 'url' => sprintf('director/templatechoices/%s', $shortName), 'label' => $this->translate('Choices') ]); } } if ($object->supportsSets() && $auth->hasPermission("director/{$typeUrl}sets")) { $this->add('sets', [ 'url' => sprintf('director/%s/sets', $plType), 'label' => $this->translate('Sets') ]); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Tabs/SyncRuleTabs.php000066400000000000000000000032751516513262500266410ustar00rootroot00000000000000rule = $rule; // We are not a BaseElement, not yet $this->assemble(); } protected function assemble() { if ($this->rule) { $id = $this->rule->get('id'); $this->add('show', [ 'url' => 'director/syncrule', 'urlParams' => ['id' => $id], 'label' => $this->translate('Sync rule'), ])->add('preview', [ 'url' => 'director/syncrule/preview', 'urlParams' => ['id' => $id], 'label' => $this->translate('Preview'), ])->add('edit', [ 'url' => 'director/syncrule/edit', 'urlParams' => ['id' => $id], 'label' => $this->translate('Modify'), ])->add('property', [ 'label' => $this->translate('Properties'), 'url' => 'director/syncrule/property', 'urlParams' => ['rule_id' => $id] ])->add('history', [ 'label' => $this->translate('History'), 'url' => 'director/syncrule/history', 'urlParams' => ['id' => $id] ]); } else { $this->add('add', [ 'url' => 'director/syncrule/add', 'label' => $this->translate('Sync rule'), ]); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Tree/000077500000000000000000000000001516513262500235515ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Tree/InspectTreeRenderer.php000066400000000000000000000047771516513262500302150ustar00rootroot00000000000000 'tree', 'data-base-target' => '_next', ]; protected $tree; /** @var IcingaEndpoint */ protected $endpoint; public function __construct(IcingaEndpoint $endpoint) { $this->endpoint = $endpoint; } protected function getNodes() { $rootNodes = array(); $types = $this->endpoint->api()->getTypes(); foreach ($types as $name => $type) { if (property_exists($type, 'base')) { $base = $type->base; if (! property_exists($types[$base], 'children')) { $types[$base]->children = array(); } $types[$base]->children[$name] = $type; } else { $rootNodes[$name] = $type; } } return $rootNodes; } public function assemble() { $this->add($this->renderNodes($this->getNodes())); } protected function renderNodes($nodes, $showLinks = false, $level = 0) { $result = []; foreach ($nodes as $child) { $result[] = $this->renderNode($child, $showLinks, $level + 1); } if ($level === 0) { return $result; } else { return Html::tag('ul', null, $result); } } protected function renderNode($node, $forceLinks = false, $level = 0) { $name = $node->name; $showLinks = $forceLinks || $name === 'ConfigObject'; $hasChildren = property_exists($node, 'children'); $li = Html::tag('li'); if (! $hasChildren) { $li->getAttributes()->add('class', 'collapsed'); } if ($hasChildren) { $li->add(Html::tag('span', ['class' => 'handle'])); } $class = $node->abstract ? 'icon-sitemap' : 'icon-doc-text'; $li->add(Link::create($name, 'director/inspect/type', [ 'endpoint' => $this->endpoint->getObjectName(), 'type' => $name ], ['class' => $class])); if ($hasChildren) { $li->add($this->renderNodes($node->children, $showLinks, $level + 1)); } return $li; } } icingaweb2-module-director-1.11.8/library/Director/Web/Tree/TemplateTreeRenderer.php000066400000000000000000000043231516513262500303460ustar00rootroot00000000000000 'tree', 'data-base-target' => '_next', ]; protected $tree; public function __construct(TemplateTree $tree) { $this->tree = $tree; } public static function showType($type, ControlsAndContent $controller, Db $db) { $controller->content()->add( new static(new TemplateTree($type, $db)) ); } public function renderContent() { $this->add( $this->dumpTree( array( 'name' => $this->translate('Templates'), 'children' => $this->tree->getTree() ) ) ); return parent::renderContent(); } protected function dumpTree($tree, $level = 0) { $hasChildren = ! empty($tree['children']); $type = $this->tree->getType(); $li = Html::tag('li'); if (! $hasChildren) { $li->getAttributes()->add('class', 'collapsed'); } if ($hasChildren) { $li->add(Html::tag('span', ['class' => 'handle'])); } if ($level === 0) { $li->add(Html::tag('a', [ 'name' => $tree['name'], 'class' => 'icon-globe' ], $tree['name'])); } else { $li->add(Link::create( $tree['name'], "director/{$type}template/usage", array('name' => $tree['name']), array('class' => 'icon-' . $type) )); } if ($hasChildren) { $li->add( $ul = Html::tag('ul') ); foreach ($tree['children'] as $child) { $ul->add($this->dumpTree($child, $level + 1)); } } return $li; } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/000077500000000000000000000000001516513262500240755ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Widget/AbstractList.php000066400000000000000000000015631516513262500272120ustar00rootroot00000000000000addItem($item); } if ($attributes !== null) { $this->addAttributes($attributes); } } /** * @param Html|array|string $content * @param Attributes|array $attributes * * @return $this */ public function addItem($content, $attributes = null) { return $this->add(HtmlElement::create('li', $attributes, $content)); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/ActivityLogInfo.php000066400000000000000000000445261516513262500276730ustar00rootroot00000000000000db = $db; if ($type !== null) { $this->setType($type); } $this->name = $name; } public function setType($type) { $this->type = $type; $this->typeName = $this->translate( ucfirst(preg_replace('/^icinga_/', '', $type)) // really? ); return $this; } /** * @param Url $url * @return HtmlElement * @throws \Icinga\Exception\IcingaException */ public function getPagination(Url $url) { /** @var Url $url */ $url = $url->without('checksum')->without('show'); $div = Html::tag('div', [ 'class' => ['pagination-control', 'activity-log-control'], ]); $ul = Html::tag('ul', ['class' => 'nav tab-nav']); $li = Html::tag('li', ['class' => 'nav-item']); $ul->add($li); $neighbors = $this->getNeighbors(); $iconLeft = new Icon('angle-double-left'); $iconRight = new Icon('angle-double-right'); if ($neighbors->prev) { $li->add(new Link($iconLeft, $url->with('id', $neighbors->prev))); } else { $li->add(Html::tag('span', ['class' => 'disabled'], $iconLeft)); } $li = Html::tag('li', ['class' => 'nav-item']); $ul->add($li); if ($neighbors->next) { $li->add(new Link($iconRight, $url->with('id', $neighbors->next))); } else { $li->add(Html::tag('span', ['class' => 'disabled'], $iconRight)); } return $div->add($ul); } /** * @param $tabName * @return $this * @throws \Icinga\Exception\Http\HttpNotFoundException * @throws \Icinga\Exception\IcingaException */ public function showTab($tabName) { if ($tabName === null) { $tabName = $this->defaultTab; } $this->getTabs()->activate($tabName); $this->add($this->getInfoTable()); if ($tabName === 'old') { // $title = sprintf('%s former config', $this->entry->object_name); $diffs = IcingaConfigDiff::getDiffs($this->oldConfig(), $this->emptyConfig()); } elseif ($tabName === 'new') { // $title = sprintf('%s new config', $this->entry->object_name); $diffs = IcingaConfigDiff::getDiffs($this->emptyConfig(), $this->newConfig()); } else { $diffs = IcingaConfigDiff::getDiffs($this->oldConfig(), $this->newConfig()); } $this->addDiffs($diffs); return $this; } protected function emptyConfig() { return new IcingaConfig($this->db); } /** * @param $diffs * @throws \Icinga\Exception\IcingaException */ protected function addDiffs($diffs) { foreach ($diffs as $file => $diff) { $this->add(Html::tag('h3', null, $file))->add($diff); } } /** * @return RestoreObjectForm * @throws \Icinga\Exception\IcingaException */ protected function getRestoreForm() { return RestoreObjectForm::load() ->setDb($this->db) ->setObject($this->oldObject()) ->handleRequest(); } public function setChecksum($checksum) { if ($checksum !== null) { $this->entry = $this->db->fetchActivityLogEntry($checksum); $this->id = (int) $this->entry->id; } return $this; } public function setId($id) { if ($id !== null) { $this->entry = $this->db->fetchActivityLogEntryById($id); $this->id = (int) $id; } return $this; } public function getNeighbors() { return $this->db->getActivitylogNeighbors( $this->id, $this->type, $this->name ); } public function getCurrentObject() { return IcingaObject::loadByType( $this->type, $this->name, $this->db ); } /** * @return bool * @deprecated No longer used? */ public function objectStillExists() { return IcingaObject::existsByType( $this->type, $this->objectKey(), $this->db ); } protected function oldProperties() { if ($this->oldProperties === null) { if (property_exists($this->entry, 'old_properties')) { $this->oldProperties = JsonString::decodeOptional($this->entry->old_properties); } if ($this->oldProperties === null) { $this->oldProperties = new \stdClass(); } } return $this->oldProperties; } protected function newProperties() { if ($this->newProperties === null) { if (property_exists($this->entry, 'new_properties')) { $this->newProperties = JsonString::decodeOptional($this->entry->new_properties); } if ($this->newProperties === null) { $this->newProperties = new \stdClass(); } } return $this->newProperties; } protected function getEntryProperty($key) { $entry = $this->entry; if (property_exists($entry, $key)) { return $entry->{$key}; } elseif (property_exists($this->newProperties(), $key)) { return $this->newProperties->{$key}; } elseif (property_exists($this->oldProperties(), $key)) { return $this->oldProperties->{$key}; } else { return null; } } protected function objectLinkParams() { $entry = $this->entry; $params = ['name' => $entry->object_name]; if ($entry->object_type === 'icinga_service') { if (($set = $this->getEntryProperty('service_set')) !== null) { $params['set'] = $set; return $params; } elseif (($host = $this->getEntryProperty('host')) !== null) { $params['host'] = $host; return $params; } else { return $params; } } elseif ($entry->object_type === 'icinga_service_set') { return $params; } else { return $params; } } protected function getActionExtraHtml() { $entry = $this->entry; $info = ''; $host = null; if ($entry->object_type === 'icinga_service') { if (($set = $this->getEntryProperty('service_set')) !== null) { $info = Html::sprintf( '%s "%s"', $this->translate('on service set'), Link::create( $set, 'director/serviceset', ['name' => $set], ['data-base-target' => '_next'] ) ); } else { $host = $this->getEntryProperty('host'); } } elseif ($entry->object_type === 'icinga_service_set') { $host = $this->getEntryProperty('host'); } if ($host !== null) { $info = Html::sprintf( '%s "%s"', $this->translate('on host'), Link::create( $host, 'director/host', ['name' => $host], ['data-base-target' => '_next'] ) ); } return $info; } /** * @return array * @deprecated No longer used? */ protected function objectKey() { $entry = $this->entry; if ($entry->object_type === 'icinga_service' || $entry->object_type === 'icinga_service_set') { // TODO: this is not correct. Activity needs to get (multi) key support return ['name' => $entry->object_name]; } return $entry->object_name; } /** * @param Url|null $url * @return Tabs */ public function getTabs(Url $url = null) { if ($this->tabs === null) { $this->tabs = $this->createTabs($url); } return $this->tabs; } /** * @param Url $url * @return Tabs */ public function createTabs(Url $url) { $entry = $this->entry; $tabs = new Tabs(); if ($entry->action_name === DirectorActivityLog::ACTION_MODIFY) { $tabs->add('diff', [ 'label' => $this->translate('Diff'), 'url' => $url->without('show')->with('id', $entry->id) ]); $this->defaultTab = 'diff'; } if ( in_array($entry->action_name, [ DirectorActivityLog::ACTION_CREATE, DirectorActivityLog::ACTION_MODIFY, ]) ) { $tabs->add('new', [ 'label' => $this->translate('New object'), 'url' => $url->with(['id' => $entry->id, 'show' => 'new']) ]); if ($this->defaultTab === null) { $this->defaultTab = 'new'; } } if ( in_array($entry->action_name, [ DirectorActivityLog::ACTION_DELETE, DirectorActivityLog::ACTION_MODIFY, ]) ) { $tabs->add('old', [ 'label' => $this->translate('Former object'), 'url' => $url->with(['id' => $entry->id, 'show' => 'old']) ]); if ($this->defaultTab === null) { $this->defaultTab = 'old'; } } return $tabs; } /** * @return IcingaObject * @throws \Icinga\Exception\IcingaException */ protected function oldObject() { if ($this->oldObject === null) { $this->oldObject = $this->createObject( $this->entry->object_type, $this->entry->old_properties ); } return $this->oldObject; } /** * @return IcingaObject * @throws \Icinga\Exception\IcingaException */ protected function newObject() { return $this->createObject( $this->entry->object_type, $this->entry->new_properties ); } protected function objectToConfig(IcingaObject $object) { if ($object instanceof IcingaService) { return $this->previewService($object); } elseif ($object instanceof IcingaServiceSet) { return $this->previewServiceSet($object); } else { return $object->toSingleIcingaConfig(); } } /** * Render service set to be previewed * * @param IcingaServiceSet $object * * @return IcingaConfig */ protected function previewServiceSet(IcingaServiceSet $object) { $config = $object->toSingleIcingaConfig(); foreach ($object->getCachedServices() as $service) { $service->renderToConfig($config); } return $config; } protected function previewService(IcingaService $service) { if (($set = $service->get('service_set')) !== null) { // simulate rendering of service in set $set = IcingaServiceSet::load($set, $this->db); $service->set('service_set_id', null); if (($assign = $set->get('assign_filter')) !== null) { $service->set('object_type', 'apply'); $service->set('assign_filter', $assign); } } return $service->toSingleIcingaConfig(); } /** * @return IcingaConfig * @throws \Icinga\Exception\IcingaException */ protected function newConfig() { return $this->objectToConfig($this->newObject()); } /** * @return IcingaConfig * @throws \Icinga\Exception\IcingaException */ protected function oldConfig() { return $this->objectToConfig($this->oldObject()); } protected function getLinkToObject() { // TODO: This logic is redundant and should be centralized $entry = $this->entry; $name = $entry->object_name; $controller = preg_replace('/^icinga_/', '', $entry->object_type); if ($controller === 'service_set') { $controller = 'serviceset'; } elseif ($controller === 'scheduled_downtime') { $controller = 'scheduled-downtime'; } return Link::create( $name, 'director/' . $controller, $this->objectLinkParams(), ['data-base-target' => '_next'] ); } /** * @return NameValueTable * @throws \Icinga\Exception\IcingaException */ public function getInfoTable() { $entry = $this->entry; $table = new NameValueTable(); $table->addNameValuePairs([ $this->translate('Author') => $entry->author, $this->translate('Date') => DateFormatter::formatDateTime( $entry->change_time_ts ), ]); if (null === $this->name) { $table->addNameValueRow( $this->translate('Action'), Html::sprintf( '%s %s "%s" %s', $entry->action_name, $entry->object_type, $this->getLinkToObject(), $this->getActionExtraHtml() ) ); } else { $table->addNameValueRow( $this->translate('Action'), $entry->action_name ); } if ($comment = $this->getOptionalRangeComment()) { $table->addNameValueRow( $this->translate('Remark'), $comment ); } if ($this->hasBeenEnabled()) { $table->addNameValueRow( $this->translate('Rendering'), $this->translate('This object has been enabled') ); } elseif ($this->hasBeenDisabled()) { $table->addNameValueRow( $this->translate('Rendering'), $this->translate('This object has been disabled') ); } $table->addNameValueRow( $this->translate('Checksum'), $entry->checksum ); if ($this->entry->old_properties) { $table->addNameValueRow( $this->translate('Actions'), $this->getRestoreForm() ); } return $table; } public function hasBeenEnabled() { return false; } public function hasBeenDisabled() { return false; } /** * @return string * @throws ProgrammingError */ public function getTitle() { switch ($this->entry->action_name) { case DirectorActivityLog::ACTION_CREATE: $msg = $this->translate('%s "%s" has been created'); break; case DirectorActivityLog::ACTION_DELETE: $msg = $this->translate('%s "%s" has been deleted'); break; case DirectorActivityLog::ACTION_MODIFY: $msg = $this->translate('%s "%s" has been modified'); break; default: throw new ProgrammingError( 'Unable to deal with "%s" activity', $this->entry->action_name ); } return sprintf($msg, $this->typeName, $this->entry->object_name); } protected function getOptionalRangeComment() { if ($this->id) { $db = $this->db->getDbAdapter(); return $db->fetchOne( $db->select() ->from('director_activity_log_remark', 'remark') ->where('first_related_activity <= ?', $this->id) ->where('last_related_activity >= ?', $this->id) ); } return null; } /** * @param $type * @param $props * @return IcingaObject * @throws \Icinga\Exception\IcingaException */ protected function createObject($type, $props) { $props = json_decode($props); $newProps = ['object_name' => $props->object_name]; if (property_exists($props, 'object_type')) { $newProps['object_type'] = $props->object_type; } $object = IcingaObject::createByType( $type, $newProps, $this->db ); if ($type === 'icinga_service_set' && isset($props->services)) { $services = []; foreach ($props->services as $service) { $services[$service->object_name] = IcingaObject::createByType( 'icinga_service', (array) $service, $this->db ); } /** @var IcingaServiceSet $object */ $object->setCachedServices($services); unset($props->services); } return $object->setProperties((array) $props); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/AdditionalTableActions.php000066400000000000000000000100741516513262500311510ustar00rootroot00000000000000auth = $auth; $this->url = $url; $this->table = $table; } public function appendTo(HtmlDocument $parent) { $links = []; if ($this->hasPermission(Permission::ADMIN)) { $links[] = $this->createDownloadJsonLink(); } if ($this->hasPermission(Permission::SHOW_SQL)) { $links[] = $this->createShowSqlToggle(); } if ($this->table instanceof FilterableByUsage) { $parent->add($this->showUsageFilter($this->table)); } if (! empty($links)) { $parent->add($this->moreOptions($links)); } return $this; } protected function createDownloadJsonLink() { return Link::create( $this->translate('Download as JSON'), $this->url->with('format', 'json'), null, ['target' => '_blank'] ); } protected function createShowSqlToggle() { if ($this->url->getParam('format') === 'sql') { $link = Link::create( $this->translate('Hide SQL'), $this->url->without('format') ); } else { $link = Link::create( $this->translate('Show SQL'), $this->url->with('format', 'sql') ); } return $link; } protected function showUsageFilter(FilterableByUsage $table) { $active = $this->url->getParam('usage', 'all'); $links = [ Link::create($this->translate('all'), $this->url->without('usage')), Link::create($this->translate('used'), $this->url->with('usage', 'used')), Link::create($this->translate('unused'), $this->url->with('usage', 'unused')), ]; if ($active === 'used') { $table->showOnlyUsed(); } elseif ($active === 'unused') { $table->showOnlyUnUsed(); } $options = $this->ul( $this->li([ Link::create( sprintf($this->translate('Usage (%s)'), $active), '#', null, [ 'class' => 'icon-sitemap' ] ), $subUl = Html::tag('ul') ]), ['class' => 'nav'] ); foreach ($links as $link) { $subUl->add($this->li($link)); } return $options; } protected function moreOptions($links) { $options = $this->ul( $this->li([ // TODO: extend link for dropdown-toggle from Web 2, doesn't // seem to work: [..], null, ['class' => 'dropdown-toggle'] Link::create(Icon::create('down-open'), '#'), $subUl = Html::tag('ul') ]), ['class' => 'nav'] ); foreach ($links as $link) { $subUl->add($this->li($link)); } return $options; } protected function ulLi($content) { return $this->ul($this->li($content)); } protected function ul($content, $attributes = null) { return Html::tag('ul', $attributes, $content); } protected function li($content) { return Html::tag('li', null, $content); } protected function hasPermission($permission) { return $this->auth->hasPermission($permission); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/BackgroundDaemonDetails.php000066400000000000000000000120561516513262500313230ustar00rootroot00000000000000info = $info; $this->daemon = $daemon; } protected function assemble() { $info = $this->info; if ($info->hasBeenStopped()) { $this->add(Hint::error(Html::sprintf( $this->translate( 'Daemon has been stopped %s, was running with PID %s as %s@%s' ), // $info->getHexUuid(), $this->timeAgo($info->getTimestampStopped() / 1000), Html::tag('strong', (string) $info->getPid()), Html::tag('strong', $info->getUsername()), Html::tag('strong', $info->getFqdn()) ))); } elseif ($info->isOutdated()) { $this->add(Hint::error(Html::sprintf( $this->translate( 'Daemon keep-alive is outdated, was last seen running with PID %s as %s@%s %s' ), // $info->getHexUuid(), Html::tag('strong', (string) $info->getPid()), Html::tag('strong', $info->getUsername()), Html::tag('strong', $info->getFqdn()), $this->timeAgo($info->getLastUpdate() / 1000) ))); } else { $this->add(Hint::ok(Html::sprintf( $this->translate( 'Daemon is running with PID %s as %s@%s, last refresh happened %s' ), // $info->getHexUuid(), Html::tag('strong', (string)$info->getPid()), Html::tag('strong', $info->getUsername()), Html::tag('strong', $info->getFqdn()), $this->timeAgo($info->getLastUpdate() / 1000) ))); $details = new NameValueTable(); $details->addNameValuePairs([ $this->translate('Startup Time') => DateFormatter::formatDateTime($info->getTimestampStarted() / 1000), $this->translate('PID') => $info->getPid(), $this->translate('Username') => $info->getUsername(), $this->translate('FQDN') => $info->getFqdn(), $this->translate('Running with systemd') => $info->isRunningWithSystemd() ? $this->translate('yes') : $this->translate('no'), $this->translate('Binary') => $info->getBinaryPath() . ($info->binaryRealpathDiffers() ? ' -> ' . $info->getBinaryRealpath() : ''), $this->translate('PHP Binary') => $info->getPhpBinaryPath() . ($info->phpBinaryRealpathDiffers() ? ' -> ' . $info->getPhpBinaryRealpath() : ''), $this->translate('PHP Version') => $info->getPhpVersion(), $this->translate('PHP Integer') => $info->has64bitIntegers() ? '64bit' : Html::sprintf( '%sbit (%s)', $info->getPhpIntegerSize() * 8, Html::tag('span', ['class' => 'error'], $this->translate('unsupported')) ), ]); $this->add($details); $this->add(Html::tag('h2', $this->translate('Process List'))); if (\is_string($this->daemon->process_info)) { // from DB: $processes = \json_decode($this->daemon->process_info); } else { // via RPC: $processes = $this->daemon->process_info; } $table = new Table(); $table->add(Html::tag('thead', Html::tag('tr', Html::wrapEach([ 'PID', 'Command', 'Memory' ], 'th')))); $table->setAttribute('class', 'common-table'); foreach ($processes as $pid => $process) { $table->add($table::row([ [ Icon::create($process->running ? 'ok' : 'warning-empty'), ' ', $pid ], Html::tag('pre', $process->command), $process->memory === false ? 'n/a' : Format::bytes($process->memory->rss) ])); } $this->add($table); } } protected function timeAgo($time) { return Html::tag('span', [ 'class' => 'time-ago', 'title' => DateFormatter::formatDateTime($time) ], DateFormatter::timeAgo($time)); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/BranchedObjectHint.php000066400000000000000000000055521516513262500302750ustar00rootroot00000000000000isBranch()) { if ($hasPreferredBranch) { $main = true; $hintMethod = 'warning'; $link = $this->translate('the main configuration branch'); $deployHint = ' ' . $this->translate('This will be part of the next deployment'); } else { return; } } else { $main = false; $hintMethod = 'info'; $deployHint = ' ' . $this->translate('This will not be part of any deployment, unless being merged'); $hook = Branch::requireHook(); $name = $branch->getName(); if (substr($name, 0, 1) === '/') { $label = $this->translate('this configuration branch'); } else { $label = $name; } $link = $hook->linkToBranch($branch, $auth, $label); } if ($object === null) { $this->add(Hint::$hintMethod(Html::sprintf($this->translate( 'This object will be created in %s.' ) . $deployHint, $link))); return; } if (! $object->hasBeenTouchedByBranch()) { $this->add(Hint::$hintMethod(Html::sprintf($this->translate( 'Your changes are going to be stored in %s.' ) . $deployHint, $link))); return; } if ($main) { return; } if ($object->hasBeenDeletedByBranch()) { throw new NotFoundError('No such object available'); // Alternative, requires hiding other actions: // $this->add(Hint::info(Html::sprintf( // $this->translate('This object has been deleted in %s'), // $link // ))); } elseif ($object->hasBeenCreatedByBranch()) { $this->add(Hint::info(Html::sprintf( $this->translate('This object has been created in %s'), $link ))); } else { $this->add(Hint::info(Html::sprintf( $this->translate('This object has modifications visible only in %s'), // TODO: Also link to object modifications // $hook->linkToBranchedObject($this->translate('modifications'), $branch, $object, $auth), $link ))); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/BranchedObjectsHint.php000066400000000000000000000020131516513262500304450ustar00rootroot00000000000000isBranch()) { if ($hasPreferredBranch) { $this->add(Hint::warning($this->translate( "You're currently in the master branch, your changes will make part of the next Deployment" ))); } return; } $hook = Branch::requireHook(); $this->add(Hint::info(Html::sprintf( $this->translate('Showing a branched view, with potential changes being visible only in this %s'), $hook->linkToBranch($branch, $auth, $this->translate('configuration branch')) ))); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/Daemon/000077500000000000000000000000001516513262500253005ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/library/Director/Web/Widget/Daemon/BackgroundDaemonState.php000066400000000000000000000022351516513262500322170ustar00rootroot00000000000000db = $db; } public function isRunning() { foreach ($this->getInstances() as $instance) { if ($instance->isRunning()) { return true; } } return false; } protected function getInstances() { if ($this->instances === null) { $this->instances = $this->fetchInfo(); } return $this->instances; } /** * @return RunningDaemonInfo[] */ protected function fetchInfo() { $db = $this->db->getDbAdapter(); $daemons = $db->fetchAll( $db->select()->from('director_daemon_info')->order('fqdn')->order('username')->order('pid') ); $result = []; foreach ($daemons as $info) { $result[] = new RunningDaemonInfo($info); } return $result; } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/DeployedConfigInfoHeader.php000066400000000000000000000055601516513262500314340ustar00rootroot00000000000000config = $config; $this->db = $db; $this->api = $api; $this->branch = $branch; if ($deploymentId) { $this->deploymentId = (int) $deploymentId; } } /** * @throws \Icinga\Exception\IcingaException * @throws \Zend_Form_Exception */ protected function assemble() { $config = $this->config; if ($this->branch->isBranch()) { $deployForm = null; } else { $deployForm = DeployConfigForm::load() ->setDb($this->db) ->setApi($this->api) ->setChecksum($config->getHexChecksum()) ->setDeploymentId($this->deploymentId) ->setAttrib('class', 'inline') ->handleRequest(); } $links = new NameValueTable(); $links->addNameValueRow( $this->translate('Actions'), [ $deployForm, Html::tag('br'), Link::create( $this->translate('Last related activity'), 'director/config/activity', ['checksum' => $config->getLastActivityHexChecksum()], ['class' => 'icon-clock', 'data-base-target' => '_next'] ), Html::tag('br'), Link::create( $this->translate('Diff with other config'), 'director/config/diff', ['left' => $config->getHexChecksum()], ['class' => 'icon-flapping', 'data-base-target' => '_self'] ) ] )->addNameValueRow( $this->translate('Statistics'), sprintf( $this->translate('%d files rendered in %0.2fs'), count($config->getFiles()), $config->getDuration() / 1000 ) ); $this->add($links); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/DeploymentInfo.php000066400000000000000000000125051516513262500275450ustar00rootroot00000000000000deployment = $deployment; if ($deployment->get('config_checksum') !== null) { $this->config = IcingaConfig::load( $deployment->get('config_checksum'), $deployment->getConnection() ); } } /** * @param Auth $auth * @param Request $request * @return Tabs */ public function getTabs(Auth $auth, Request $request) { $dep = $this->deployment; $tabs = new Tabs(); $tabs->add('deployment', array( 'label' => $this->translate('Deployment'), 'url' => $request->getUrl() ))->activate('deployment'); if ($dep->config_checksum !== null && $auth->hasPermission(Permission::SHOW_CONFIG)) { $tabs->add('config', array( 'label' => $this->translate('Config'), 'url' => 'director/config/files', 'urlParams' => array( 'checksum' => $this->config->getHexChecksum(), 'deployment_id' => $dep->id ) )); } return $tabs; } protected function createInfoTable() { $dep = $this->deployment; $table = (new NameValueTable()) ->addAttributes(['class' => 'deployment-details']); $table->addNameValuePairs([ $this->translate('Deployment time') => $dep->start_time, $this->translate('Sent to') => $dep->peer_identity, ]); if ($this->config !== null) { $table->addNameValuePairs([ $this->translate('Configuration') => $this->getConfigDetails(), $this->translate('Duration') => $this->getDurationInfo(), ]); } $table->addNameValuePairs([ $this->translate('Stage name') => $dep->stage_name, $this->translate('Startup') => $this->getStartupInfo() ]); return $table; } protected function getDurationInfo() { return sprintf( $this->translate('Rendered in %0.2fs, deployed in %0.2fs'), $this->config->getDuration() / 1000, $this->deployment->duration_dump / 1000 ); } protected function getConfigDetails() { $cfg = $this->config; $dep = $this->deployment; return [ Link::create( sprintf($this->translate('%d files'), $cfg->getFileCount()), 'director/config/files', [ 'checksum' => $cfg->getHexChecksum(), 'deployment_id' => $dep->id ] ), ', ', sprintf( $this->translate('%d objects, %d templates, %d apply rules'), $cfg->getObjectCount(), $cfg->getTemplateCount(), $cfg->getApplyCount() ), ', ', Format::bytes($cfg->getSize()) ]; } protected function getStartupInfo() { $dep = $this->deployment; if ($dep->startup_succeeded === null) { if ($dep->stage_collected === null) { return [$this->translate('Unknown, still waiting for config check outcome'), new Icon('spinner')]; } else { return [$this->translate('Unknown, failed to collect related information'), new Icon('help')]; } } else { $div = Html::tag('div')->setSeparator(' '); if ($dep->startup_succeeded === 'y') { $div ->addAttributes(['class' => 'succeeded']) ->add([$this->translate('Succeeded'), new Icon('ok')]); } else { $div ->addAttributes(['class' => 'failed']) ->add([$this->translate('Failed'), new Icon('cancel')]); } return $div; } } public function render() { $this->add($this->createInfoTable()); if ($this->deployment->get('startup_succeeded') !== null) { $this->addStartupLog(); } return parent::render(); } protected function addStartupLog() { $this->add(Html::tag('h2', null, $this->translate('Startup Log'))); $this->add( Html::tag('pre', [ 'class' => 'logfile' ], new StartupLogRenderer($this->deployment)) ); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/Documentation.php000066400000000000000000000052261516513262500274240ustar00rootroot00000000000000app = $app; $this->auth = $auth; } public static function link($label, $module, $chapter, $title = null) { $doc = new static(Icinga::app(), Auth::getInstance()); return $doc->getModuleLink($label, $module, $chapter, $title); } public function getModuleLink($label, $module, $chapter, $title = null) { if ($title !== null) { $title = sprintf( $this->translate('Click to read our documentation: %s'), $title ); } $linkToGitHub = false; $baseParams = [ 'class' => 'icon-book', 'title' => $title, ]; if ($this->hasAccessToDocumentationModule()) { return Link::create( $label, $this->getDirectorDocumentationUrl($chapter), null, ['data-base-target' => '_next'] + $baseParams ); } $baseParams['target'] = '_blank'; if ($linkToGitHub) { return Html::tag('a', [ 'href' => $this->githubDocumentationUrl($module, $chapter), ] + $baseParams, $label); } return Html::tag('a', [ 'href' => $this->icingaDocumentationUrl($module, $chapter), ] + $baseParams, $label); } protected function getDirectorDocumentationUrl($chapter) { return 'doc/module/director/chapter/' . \preg_replace('/^\d+-/', '', \rawurlencode($chapter)); } protected function githubDocumentationUrl($module, $chapter) { return sprintf( "https://github.com/Icinga/icingaweb2-module-%s/blob/master/doc/%s.md", \rawurlencode($module), \rawurlencode($chapter) ); } protected function icingaDocumentationUrl($module, $chapter) { return sprintf( 'https://icinga.com/docs/%s/latest/doc/%s/', \rawurlencode($module), \rawurlencode($chapter) ); } protected function hasAccessToDocumentationModule() { return $this->app->getModuleManager()->hasLoaded('doc') && $this->auth->hasPermission('module/doc'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/HealthCheckPluginOutput.php000066400000000000000000000051501516513262500313520ustar00rootroot00000000000000state = new PluginState('OK'); $this->health = $health; $this->process(); } protected function process() { $checks = $this->health->getAllChecks(); foreach ($checks as $check) { $this->add([ $title = Html::tag('h1', $check->getName()), $ul = Html::tag('ul', ['class' => 'health-check-result']) ]); $problems = $check->getProblemSummary(); if (! empty($problems)) { $badges = Html::tag('span', ['class' => 'title-badges']); foreach ($problems as $state => $count) { $badges->add(Html::tag('span', [ 'class' => ['badge', 'state-' . strtolower($state)], 'title' => sprintf( $this->translate('%s: %d'), $this->translate($state), $count ), ], $count)); } $title->add($badges); } foreach ($check->getResults() as $result) { $state = $result->getState()->getName(); $ul->add(Html::tag('li', [ 'class' => 'state state-' . strtolower($state) ], $this->highlightNames($result->getOutput()))->setSeparator(' ')); } $this->state->raise($check->getState()); } } public function getState() { return $this->state; } protected function colorizeState($state) { return Html::tag('span', ['class' => 'badge state-' . strtolower($state)], $state); } protected function highlightNames($string) { $string = Html::escape($string); return new HtmlString(preg_replace_callback( "/'([^']+)'/", [$this, 'highlightName'], $string )); } protected function highlightName($match) { return '"' . Html::tag('strong', $match[1]) . '"'; } protected function getColorized($match) { return $this->colorizeState($match[1]); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/IcingaConfigDiff.php000066400000000000000000000030671516513262500277250ustar00rootroot00000000000000 $diff) { $this->add([ Html::tag('h3', $filename), $diff ]); } } /** * @param IcingaConfig $oldConfig * @param IcingaConfig $newConfig * @return ValidHtml[] */ public static function getDiffs(IcingaConfig $oldConfig, IcingaConfig $newConfig) { $oldFileNames = $oldConfig->getFileNames(); $newFileNames = $newConfig->getFileNames(); $fileNames = array_merge($oldFileNames, $newFileNames); $diffs = []; foreach ($fileNames as $filename) { if (in_array($filename, $oldFileNames)) { $left = $oldConfig->getFile($filename)->getContent(); } else { $left = ''; } if (in_array($filename, $newFileNames)) { $right = $newConfig->getFile($filename)->getContent(); } else { $right = ''; } if ($left === $right) { continue; } $diffs[$filename] = new SideBySideDiff(new PhpDiff($left, $right)); } return $diffs; } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/IcingaObjectInspection.php000066400000000000000000000165631516513262500311760ustar00rootroot00000000000000object = $object; $this->db = $db; } /** * @throws \Icinga\Exception\IcingaException */ protected function assemble() { $attrs = $this->object->attrs; if (isset($attrs->source_location)) { $this->renderSourceLocation($attrs->source_location); } if (isset($attrs->last_check_result)) { $this->renderLastCheckResult($attrs->last_check_result); } $this->renderObjectAttributes($attrs); // $this->add(Html::tag('pre', null, PlainObjectRenderer::render($this->object))); } /** * @param $result * @throws \Icinga\Exception\IcingaException */ protected function renderLastCheckResult($result) { $this->add(Html::tag('h2', null, $this->translate('Last Check Result'))); $this->renderCheckResultDetails($result); if (property_exists($result, 'command')) { $this->renderExecutedCommand($result->command); } } /** * @param array|string $command * * @throws \Icinga\Exception\IcingaException */ protected function renderExecutedCommand($command) { if (is_array($command)) { $command = implode(' ', array_map('escapeshellarg', $command)); } $this->add([ Html::tag('h3', null, 'Executed Command'), $this->formatConsole($command) ]); } protected function renderCheckResultDetails($result) { } /** * @param $attrs * @throws \Icinga\Exception\IcingaException */ protected function renderObjectAttributes($attrs) { $blacklist = [ 'last_check_result', 'source_location', 'templates', ]; $linked = [ 'check_command', 'groups', ]; $info = new NameValueTable(); foreach ($attrs as $key => $value) { if (in_array($key, $blacklist)) { continue; } if ($key === 'groups') { $info->addNameValueRow($key, $this->linkGroups($value)); } elseif (in_array($key, $linked)) { $info->addNameValueRow($key, $this->renderLinkedObject($key, $value)); } else { $info->addNameValueRow($key, PlainObjectRenderer::render($value)); } } $this->add([ Html::tag('h2', null, 'Object Properties'), $info ]); } /** * @param $key * @param $objectName * @return Link|Link[] * @throws \Icinga\Exception\IcingaException * @throws \Icinga\Exception\ProgrammingError */ protected function renderLinkedObject($key, $objectName) { $keys = [ 'check_command' => ['CheckCommand', 'CheckCommands'], 'event_command' => ['EventCommand', 'EventCommands'], 'notification_command' => ['NotificationCommand', 'NotificationCommands'], ]; $type = $keys[$key]; if ($key === 'groups') { return $this->linkGroups($objectName); } else { $singular = $type[0]; $plural = $type[1]; return Link::create($objectName, 'director/inspect/object', [ 'type' => $singular, 'plural' => $plural, 'name' => $objectName ]); } } /** * @param $groups * @return Link[] * @throws \Icinga\Exception\IcingaException * @throws \Icinga\Exception\ProgrammingError */ protected function linkGroups($groups) { if ($groups === null) { return []; } $singular = $this->object->type . 'Group'; $plural = $singular . "s"; $links = []; foreach ($groups as $name) { $links[] = Link::create($name, 'director/inspect/object', [ 'type' => $singular, 'plural' => $plural, 'name' => $name ]); } return $links; } /** * @param stdClass $source * @throws \Icinga\Exception\IcingaException */ protected function renderSourceLocation(stdClass $source) { $findRelative = 'api/packages/director'; $this->add(Html::tag('h2')->add('Source Location')); $pos = strpos($source->path, $findRelative); if (false === $pos) { $this->add(Html::tag('p', null, Html::sprintf( 'The configuration for this object has not been rendered by' . ' Icinga Director. You can find it on line %s in %s.', Html::tag('strong', null, $source->first_line), Html::tag('strong', null, $source->path) ))); } else { $relativePath = substr($source->path, $pos + strlen($findRelative) + 1); $parts = explode('/', $relativePath); $stageName = array_shift($parts); $relativePath = implode('/', $parts); $source->director_relative = $relativePath; $deployment = $this->loadDeploymentForStage($stageName); $this->add(Html::tag('p')->add(Html::sprintf( 'The configuration for this object has been rendered by Icinga' . ' Director %s to %s', DateFormatter::timeAgo(strtotime($deployment->start_time)), $this->linkToSourceLocation($deployment, $source) ))); } } protected function loadDeploymentForStage($stageName) { $db = $this->db->getDbAdapter(); $query = $db->select()->from( ['dl' => 'director_deployment_log'], ['id', 'start_time', 'config_checksum'] )->where('stage_name = ?', $stageName)->order('id DESC')->limit(1); return $db->fetchRow($query); } /** * @param $deployment * @param $source * @return Link * @throws \Icinga\Exception\IcingaException * @throws \Icinga\Exception\ProgrammingError */ protected function linkToSourceLocation($deployment, $source) { $filename = $source->director_relative; return Link::create( sprintf('%s:%s', $filename, $source->first_line), 'director/config/file', [ 'config_checksum' => $this->getChecksum($deployment->config_checksum), 'deployment_id' => $deployment->id, 'backTo' => 'deployment', 'file_path' => $filename, 'highlight' => $source->first_line, 'highlightSeverity' => 'ok' ] ); } protected function formatConsole($output) { return Html::tag('pre', ['class' => 'logfile'], $output); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/ImportSourceDetails.php000066400000000000000000000053271516513262500305560ustar00rootroot00000000000000source = $source; } protected function assemble() { $source = $this->source; $description = $source->get('description'); if ($description !== null && strlen($description)) { $this->add(Html::tag('p', null, $description)); } switch ($source->get('import_state')) { case 'unknown': $this->add(Hint::warning($this->translate( "It's currently unknown whether we are in sync with this Import Source." . ' You should either check for changes or trigger a new Import Run.' ))); break; case 'in-sync': $this->add(Hint::ok(sprintf( $this->translate( 'This Import Source was last found to be in sync at %s.' ), $source->last_attempt ))); // TODO: check whether... // - there have been imports since then, differing from former ones // - there have been activities since then break; case 'pending-changes': $this->add(Hint::warning($this->translate( 'There are pending changes for this Import Source. You should trigger a new' . ' Import Run.' ))); break; case 'failing': $this->add(Hint::error(sprintf( $this->translate( 'This Import Source failed when last checked at %s: %s' ), $source->last_attempt, $source->last_error_message ))); break; default: $this->add(Hint::error(sprintf( $this->translate('This Import Source has an invalid state: %s'), $source->get('import_state') ))); } $this->add( ImportCheckForm::load() ->setImportSource($source) ->handleRequest() ); $this->add( ImportRunForm::load() ->setImportSource($source) ->handleRequest() ); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/InspectPackages.php000066400000000000000000000127571516513262500276660ustar00rootroot00000000000000db = $db; $this->baseUrl = $baseUrl; } public function getContent(IcingaEndpoint $endpoint = null, $package = null, $stage = null, $file = null) { if ($endpoint === null) { return $this->getRootEndpoints(); } elseif ($package === null) { return $this->getPackages($endpoint); } elseif ($stage === null) { return $this->getStages($endpoint, $package); } elseif ($file === null) { return $this->getFiles($endpoint, $package, $stage); } else { return $this->getFile($endpoint, $package, $stage, $file); } } public function getTitle(IcingaEndpoint $endpoint = null, $package = null, $stage = null, $file = null) { if ($endpoint === null) { return $this->translate('Endpoint in your Root Zone'); } elseif ($package === null) { return \sprintf($this->translate('Packages on Endpoint: %s'), $endpoint->getObjectName()); } elseif ($stage === null) { return \sprintf($this->translate('Stages in Package: %s'), $package); } elseif ($file === null) { return \sprintf($this->translate('Files in Stage: %s'), $stage); } else { return \sprintf($this->translate('File Content: %s'), $file); } } public function getBreadCrumb(IcingaEndpoint $endpoint = null, $package = null, $stage = null) { $parts = [ 'endpoint' => $endpoint === null ? null : $endpoint->getObjectName(), 'package' => $package, 'stage' => $stage, ]; $params = []; // No root zone link for now: // $result = [Link::create($this->translate('Root Zone'), $this->baseUrl)]; $result = [Html::tag('a', ['href' => '#'], $this->translate('Root Zone'))]; foreach ($parts as $name => $value) { if ($value === null) { break; } $params[$name] = $value; $result[] = Link::create($value, $this->baseUrl, $params); } return Html::tag('ul', ['class' => 'breadcrumb'], Html::wrapEach($result, 'li')); } protected function getRootEndpoints() { $table = $this->prepareTable(); foreach ($this->db->getEndpointNamesInDeploymentZone() as $name) { $table->add(Table::row([ Link::create($name, $this->baseUrl, [ 'endpoint' => $name, ]) ])); } return $table; } protected function getPackages(IcingaEndpoint $endpoint) { $table = $this->prepareTable(); $api = $endpoint->api(); foreach ($api->getPackages() as $package) { $table->add(Table::row([ Link::create($package->name, $this->baseUrl, [ 'endpoint' => $endpoint->getObjectName(), 'package' => $package->name, ]) ])); } return $table; } protected function getStages(IcingaEndpoint $endpoint, $packageName) { $table = $this->prepareTable(); $api = $endpoint->api(); foreach ($api->getPackages() as $package) { if ($package->name !== $packageName) { continue; } foreach ($package->stages as $stage) { $label = [$stage]; if ($stage === $package->{'active-stage'}) { $label[] = Html::tag('small', [' (', $this->translate('active'), ')']); } $table->add(Table::row([ Link::create($label, $this->baseUrl, [ 'endpoint' => $endpoint->getObjectName(), 'package' => $package->name, 'stage' => $stage ]) ])); } } return $table; } protected function getFiles(IcingaEndpoint $endpoint, $package, $stage) { $table = $this->prepareTable(); $table->getAttributes()->set('data-base-target', '_next'); foreach ($endpoint->api()->listStageFiles($stage, $package) as $filename) { $table->add($table->row([ Link::create($filename, $this->baseUrl, [ 'endpoint' => $endpoint->getObjectName(), 'package' => $package, 'stage' => $stage, 'file' => $filename ]) ])); } return $table; } protected function getFile(IcingaEndpoint $endpoint, $package, $stage, $file) { return Html::tag('pre', $endpoint->api()->getStagedFile($stage, $file, $package)); } protected function prepareTable($headerCols = []) { $table = new Table(); $table->addAttributes([ 'class' => ['common-table', 'table-row-selectable'], 'data-base-target' => '_self' ]); if (! empty($headerCols)) { $table->add($table::row($headerCols, null, 'th')); } return $table; } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/JobDetails.php000066400000000000000000000044121516513262500266270ustar00rootroot00000000000000get('run_interval'); if ($job->hasBeenDisabled()) { $this->add(Hint::error(sprintf( $this->translate( 'This job would run every %ds. It has been disabled and will' . ' therefore not be executed as scheduled' ), $runInterval ))); } else { //$class = $job->job(); echo $class::getDescription() $msg = $job->isPending() ? sprintf( $this->translate('This job runs every %ds and is currently pending'), $runInterval ) : sprintf( $this->translate('This job runs every %ds.'), $runInterval ); $this->add(Html::tag('p', null, $msg)); } $tsLastAttempt = $job->get('ts_last_attempt'); if ($tsLastAttempt) { $ts = $tsLastAttempt / 1000; $timeAgo = Html::tag('span', [ 'class' => 'time-ago', 'title' => DateFormatter::formatDateTime($ts) ], DateFormatter::timeAgo($ts)); if ($job->get('last_attempt_succeeded') === 'y') { $this->add(Hint::ok(Html::sprintf( $this->translate('The last attempt succeeded %s'), $timeAgo ))); } else { $this->add(Hint::error(Html::sprintf( $this->translate('The last attempt failed %s: %s'), $timeAgo, $job->get('last_error_message') ))); } } else { $this->add(Hint::warning($this->translate('This job has not been executed yet'))); } } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/ListItem.php000066400000000000000000000010201516513262500263310ustar00rootroot00000000000000add( Html::tag('li', $attributes, $content) ); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/NotInBranchedHint.php000066400000000000000000000012111516513262500301020ustar00rootroot00000000000000translate('%s is not available while being in a Configuration Branch: %s'), $forbiddenAction, Branch::requireHook()->linkToBranch($branch, $auth, $branch->getName()) ), 'info'); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/OrderedList.php000066400000000000000000000001731516513262500270270ustar00rootroot00000000000000file = $file; $this->highlight = $highlight; $this->highlightSeverity = $highlightSeverity; } /** * @throws \Icinga\Exception\IcingaException */ protected function assemble() { $source = $this->linkObjects(Html::escape($this->file->getContent())); if ($this->highlight) { $source = $this->highlight( $source, $this->highlight, $this->highlightSeverity ); } $this->add(Html::tag( 'pre', ['class' => 'generated-config'], new HtmlString($source) )); } /** * @param $match * @return string * @throws \Icinga\Exception\IcingaException * @throws \Icinga\Exception\ProgrammingError */ protected function linkObject($match) { if ($match[2] === 'Service') { return $match[0]; } $controller = $match[2]; if ($match[2] === 'CheckCommand') { $controller = 'command'; } $name = $this->decode($match[3]); return sprintf( '%s %s "%s" {', $match[1], $match[2], Link::create( $name, 'director/' . $controller, ['name' => $name], ['data-base-target' => '_next'] ) ); } protected function decode($str) { return htmlspecialchars_decode($str, ENT_COMPAT | ENT_SUBSTITUTE | ENT_HTML5); } protected function linkObjects($config) { $pattern = '/^(object|template)\s([A-Z][A-Za-z]*?)\s"(.+?)"\s{/m'; return preg_replace_callback( $pattern, [$this, 'linkObject'], $config ); } protected function highlight($what, $line, $severity) { $lines = explode("\n", $what); $lines[$line - 1] = '' . $lines[$line - 1] . ''; return implode("\n", $lines); } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/SyncRunDetails.php000066400000000000000000000075521516513262500275260ustar00rootroot00000000000000run = $run; $this->getAttributes()->add('data-base-target', '_next'); // eigentlich nur runSummary $this->addNameValuePairs([ $this->translate('Start time') => $run->get('start_time'), $this->translate('Duration') => sprintf('%.2fs', $run->get('duration_ms') / 1000), $this->translate('Activity') => $this->runSummary($run) ]); } /** * @param SyncRun $run * @return array */ protected function runSummary(SyncRun $run) { $html = []; $total = $run->countActivities(); if ($total === 0) { $html[] = $this->translate('No changes have been made'); } else { if ($total === 1) { $html[] = $this->translate('One object has been modified'); } else { $html[] = sprintf( $this->translate('%s objects have been modified'), $total ); } /** @var Db $db */ $db = $run->getConnection(); $formerId = $db->fetchActivityLogIdByChecksum($run->get('last_former_activity')); if ($formerId === null) { return $html; } $lastId = $db->fetchActivityLogIdByChecksum($run->get('last_related_activity')); if ($formerId !== $lastId) { $idRangeEx = sprintf( 'id>%d&id<=%d', $formerId, $lastId ); } else { $idRangeEx = null; } $links = new HtmlDocument(); $links->setSeparator(', '); $links->add([ $this->activitiesLink( 'objects_created', $this->translate('%d created'), DirectorActivityLog::ACTION_CREATE, $idRangeEx ), $this->activitiesLink( 'objects_modified', $this->translate('%d modified'), DirectorActivityLog::ACTION_MODIFY, $idRangeEx ), $this->activitiesLink( 'objects_deleted', $this->translate('%d deleted'), DirectorActivityLog::ACTION_DELETE, $idRangeEx ), ]); if ($idRangeEx && count($links) > 1) { $links->add(new Link( $this->translate('Show all actions'), self::URL_ACTIVITIES, ['idRangeEx' => $idRangeEx] )); } if (! $links->isEmpty()) { $html[] = ': '; $html[] = $links; } } return $html; } protected function activitiesLink($key, $label, $action, $rangeFilter) { $count = $this->run->get($key); if ($count > 0) { if ($rangeFilter) { return new Link( sprintf($label, $count), self::URL_ACTIVITIES, ['action' => $action, 'idRangeEx' => $rangeFilter] ); } return sprintf($label, $count); } return null; } } icingaweb2-module-director-1.11.8/library/Director/Web/Widget/UnorderedList.php000066400000000000000000000001751516513262500273740ustar00rootroot00000000000000=0.14.2), icinga-php-thirdparty (>=0.12.1) Modules: incubator (>=0.22.0) Description: Director - Config tool for Icinga 2 Icinga Director is a configuration tool that has been designed to make Icinga 2 configuration easy and understandable. icingaweb2-module-director-1.11.8/phpcs.xml000066400000000000000000000006741516513262500205640ustar00rootroot00000000000000 configuration.php run.php run-php5.3.php application/ library/Director/ test/ icingaweb2-module-director-1.11.8/phpstan-baseline.neon000066400000000000000000000627361516513262500230520ustar00rootroot00000000000000parameters: ignoreErrors: - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: application/controllers/BranchController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: application/controllers/BranchController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Table\\\\ObjectsTable\\:\\:setType\\(\\)\\.$#" count: 1 path: application/controllers/CommandsController.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: application/controllers/ConfigController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: application/controllers/ConfigController.php - message: "#^Call to an undefined method Icinga\\\\Web\\\\View\\:\\:formSelect\\(\\)\\.$#" count: 2 path: application/controllers/ConfigController.php - message: "#^Call to an undefined method Icinga\\\\Data\\\\Filter\\\\Filter\\:\\:filters\\(\\)\\.$#" count: 2 path: application/controllers/HostsController.php - message: "#^PHPDoc tag @var has invalid value \\(\\$filter FilterChain\\)\\: Unexpected token \"\\$filter\", expected type at offset 9$#" count: 2 path: application/controllers/HostsController.php - message: "#^PHPDoc tag @var has invalid value \\(\\$sub FilterChain\\)\\: Unexpected token \"\\$sub\", expected type at offset 9$#" count: 2 path: application/controllers/HostsController.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: application/controllers/ImportsourceController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: application/controllers/ImportsourceController.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: application/controllers/JobController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: application/controllers/JobController.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: application/controllers/KickstartController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: application/controllers/KickstartController.php - message: "#^Variable \\$tab in PHPDoc tag @var does not exist\\.$#" count: 1 path: application/controllers/NotificationController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\DirectorObjectForm\\:\\:createApplyRuleFor\\(\\)\\.$#" count: 1 path: application/controllers/ServiceController.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: application/controllers/SyncruleController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: application/controllers/SyncruleController.php - message: "#^Variable \\$after might not be defined\\.$#" count: 3 path: application/controllers/SyncruleController.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: application/controllers/TemplatechoiceController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: application/controllers/TemplatechoiceController.php - message: "#^Call to an undefined method Zend_View_Interface\\:\\:icon\\(\\)\\.$#" count: 1 path: application/forms/DeployConfigForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getSettings\\(\\)\\.$#" count: 2 path: application/forms/DirectorDatafieldForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getSettings\\(\\)\\.$#" count: 1 path: application/forms/DirectorJobForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getObjectName\\(\\)\\.$#" count: 1 path: application/forms/IcingaAddServiceSetForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getResolvedProperty\\(\\)\\.$#" count: 1 path: application/forms/IcingaAddServiceSetForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:setImports\\(\\)\\.$#" count: 1 path: application/forms/IcingaDependencyForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getAppliedGroups\\(\\)\\.$#" count: 1 path: application/forms/IcingaHostForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getGroups\\(\\)\\.$#" count: 1 path: application/forms/IcingaHostForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Forms\\\\IcingaImportObjectForm\\:\\:addNote\\(\\)\\.$#" count: 1 path: application/forms/IcingaImportObjectForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getUrlParams\\(\\)\\.$#" count: 1 path: application/forms/IcingaScheduledDowntimeForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:isApplyRule\\(\\)\\.$#" count: 1 path: application/forms/IcingaScheduledDowntimeForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:isApplyRule\\(\\)\\.$#" count: 1 path: application/forms/IcingaServiceDictionaryMemberForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:isApplyRule\\(\\)\\.$#" count: 2 path: application/forms/IcingaServiceForm.php - message: "#^Cannot cast Icinga\\\\Data\\\\Filter\\\\Filter to string\\.$#" count: 1 path: application/forms/IcingaServiceForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getResolvedProperty\\(\\)\\.$#" count: 1 path: application/forms/IcingaServiceSetForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getSetting\\(\\)\\.$#" count: 1 path: application/forms/ImportRowModifierForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getSettings\\(\\)\\.$#" count: 1 path: application/forms/ImportRowModifierForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getSettings\\(\\)\\.$#" count: 1 path: application/forms/ImportSourceForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Forms\\\\RestoreBasketForm\\:\\:Window\\(\\)\\.$#" count: 1 path: application/forms/RestoreBasketForm.php - message: "#^Function translate not found\\.$#" count: 8 path: application/locale/translateMe.php - message: "#^Call to an undefined method Zend_View_Interface\\:\\:formIplExtensibleSet\\(\\)\\.$#" count: 1 path: application/views/helpers/FormDataFilter.php - message: "#^Call to an undefined method Zend_View_Interface\\:\\:formSelect\\(\\)\\.$#" count: 1 path: application/views/helpers/FormDataFilter.php - message: "#^Call to an undefined method Zend_View_Interface\\:\\:formSubmit\\(\\)\\.$#" count: 1 path: application/views/helpers/FormDataFilter.php - message: "#^Call to an undefined method Zend_View_Interface\\:\\:formText\\(\\)\\.$#" count: 4 path: application/views/helpers/FormDataFilter.php - message: "#^Call to an undefined method Zend_View_Interface\\:\\:translate\\(\\)\\.$#" count: 1 path: application/views/helpers/FormDataFilter.php - message: "#^Variable \\$id might not be defined\\.$#" count: 1 path: application/views/helpers/FormStoredPassword.php - message: "#^Constructor of class Icinga\\\\Module\\\\Director\\\\Core\\\\RestApiClient has an unused parameter \\$cn\\.$#" count: 1 path: library/Director/Core/RestApiClient.php - message: "#^Binary operation \"\\*\" between string and 1000 results in an error\\.$#" count: 1 path: library/Director/Daemon/DaemonUtil.php - message: "#^Anonymous function has an unused use \\$id\\.$#" count: 2 path: library/Director/Daemon/JobRunner.php - message: "#^Variable \\$hook in PHPDoc tag @var does not exist\\.$#" count: 1 path: library/Director/Dashboard/BranchesDashboard.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Restriction\\\\HostgroupRestriction\\:\\:applyToHostGroupsQuery\\(\\)\\.$#" count: 1 path: library/Director/Dashboard/Dashboard.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbConnection\\:\\:db\\(\\)\\.$#" count: 1 path: library/Director/Data/Db/DbConnection.php - message: "#^Call to an undefined method Icinga\\\\Data\\\\Filter\\\\Filter\\:\\:filters\\(\\)\\.$#" count: 1 path: library/Director/Data/Db/IcingaObjectFilterRenderer.php - message: "#^Variable \\$filter in PHPDoc tag @var does not match any variable in the foreach loop\\: \\$sub$#" count: 1 path: library/Director/Data/Db/IcingaObjectFilterRenderer.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\IcingaObjectQuery\\:\\:tableAliases\\(\\)\\.$#" count: 1 path: library/Director/Data/Db/IcingaObjectQuery.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getObjectName\\(\\)\\.$#" count: 1 path: library/Director/Data/Db/ServiceSetQueryBuilder.php - message: "#^Access to an undefined property object\\:\\:\\$datalist\\.$#" count: 1 path: library/Director/Data/Exporter.php - message: "#^PHPDoc tag @param references unknown parameter\\: \\$id$#" count: 1 path: library/Director/Data/FieldReferenceLoader.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:toPlainObject\\(\\)\\.$#" count: 1 path: library/Director/Data/HostServiceLoader.php - message: "#^Call to an undefined static method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:fromPlainObject\\(\\)\\.$#" count: 1 path: library/Director/Data/HostServiceLoader.php - message: "#^PHPDoc tag @param for parameter \\$implementation with type class\\-string\\|Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject is not subtype of native type string\\.$#" count: 1 path: library/Director/Data/ObjectImporter.php - message: "#^Access to an undefined property object\\:\\:\\$format\\.$#" count: 1 path: library/Director/Data/PropertiesFilter/ArrayCustomVariablesFilter.php - message: "#^PHPDoc tag @param references unknown parameter\\: \\$object$#" count: 1 path: library/Director/Data/SerializableValue.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\QuickForm\\:\\:getDb\\(\\)\\.$#" count: 1 path: library/Director/DataType/DataTypeDatalist.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getRequest\\(\\)\\.$#" count: 1 path: library/Director/Db/Branch/Branch.php - message: "#^PHPDoc tag @param references unknown parameter\\: \\$db$#" count: 1 path: library/Director/Db/Branch/Branch.php - message: "#^PHPDoc tag @var has invalid value \\(@var string\\)\\: Unexpected token \"@var\", expected type at offset 9$#" count: 1 path: library/Director/Db/Branch/Branch.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Db\\\\Branch\\\\Branch\\:\\:getBytes\\(\\)\\.$#" count: 1 path: library/Director/Db/Branch/BranchMerger.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:toPlainObject\\(\\)\\.$#" count: 1 path: library/Director/Db/Branch/BranchedObject.php - message: "#^Call to an undefined method Zend_Db_Adapter_Abstract\\:\\:exec\\(\\)\\.$#" count: 4 path: library/Director/Db/Housekeeping.php - message: "#^Variable \\$helper in PHPDoc tag @var does not exist\\.$#" count: 1 path: library/Director/Db/MembershipHousekeeping.php - message: "#^Variable \\$object in PHPDoc tag @var does not exist\\.$#" count: 2 path: library/Director/DirectorObject/Automation/BasketSnapshot.php - message: "#^Access to an undefined property object\\:\\:\\$datalist_id\\.$#" count: 1 path: library/Director/DirectorObject/Automation/BasketSnapshotFieldResolver.php - message: "#^Binary operation \"\\|\" between string\\|false and string results in an error\\.$#" count: 1 path: library/Director/Filter/CidrExpression.php - message: "#^Class Icinga\\\\Module\\\\Director\\\\Db\\\\Branch\\\\BranchStore referenced with incorrect case\\: Icinga\\\\Module\\\\Director\\\\Db\\\\Branch\\\\BranchSTore\\.$#" count: 3 path: library/Director/Hook/BranchSupportHook.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getRequest\\(\\)\\.$#" count: 1 path: library/Director/IcingaConfig/AgentWizard.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\QuickForm\\:\\:getSentOrObjectSetting\\(\\)\\.$#" count: 3 path: library/Director/Import/ImportSourceRestApi.php - message: "#^Access to an undefined property object\\:\\:\\$order\\.$#" count: 1 path: library/Director/Objects/IcingaCommandArgument.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Objects\\\\IcingaService\\:\\:assignments\\(\\)\\.$#" count: 1 path: library/Director/Objects/IcingaDependency.php - message: "#^Call to an undefined static method Icinga\\\\Module\\\\Director\\\\Objects\\\\IcingaObject\\:\\:renderAssignments\\(\\)\\.$#" count: 1 path: library/Director/Objects/IcingaDependency.php - message: "#^Default value of the parameter \\#2 \\$preserve \\(array\\) of method Icinga\\\\Module\\\\Director\\\\Objects\\\\IcingaObject\\:\\:replaceWith\\(\\) is incompatible with type null\\.$#" count: 1 path: library/Director/Objects/IcingaObject.php - message: "#^Static call to instance method stdClass\\:\\:getKeyColumnName\\(\\)\\.$#" count: 1 path: library/Director/Objects/IcingaObject.php - message: "#^Variable \\$imports in PHPDoc tag @var does not exist\\.$#" count: 1 path: library/Director/Objects/IcingaObject.php - message: "#^PHPDoc tag @param references unknown parameter\\: \\$filter$#" count: 1 path: library/Director/Objects/IcingaObjectField.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Objects\\\\IcingaRanges\\:\\:\\$objectIdColumn\\.$#" count: 3 path: library/Director/Objects/IcingaRanges.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Objects\\\\IcingaRanges\\:\\:\\$rangeClass\\.$#" count: 1 path: library/Director/Objects/IcingaRanges.php - message: "#^Call to protected method getRelationObjectClass\\(\\) of class Icinga\\\\Module\\\\Director\\\\Objects\\\\IcingaObject\\.$#" count: 1 path: library/Director/Objects/IcingaRelatedObject.php - message: "#^Undefined variable\\: \\$object$#" count: 2 path: library/Director/Objects/IcingaRelatedObject.php - message: "#^Undefined variable\\: \\$name$#" count: 1 path: library/Director/Objects/IcingaTemplateResolver.php - message: "#^Undefined variable\\: \\$type$#" count: 2 path: library/Director/Objects/IcingaTemplateResolver.php - message: "#^Variable \\$obj in PHPDoc tag @var does not exist\\.$#" count: 1 path: library/Director/Objects/ImportRowModifier.php - message: "#^Call to an undefined method Icinga\\\\Data\\\\Filter\\\\Filter\\:\\:filters\\(\\)\\.$#" count: 1 path: library/Director/Objects/ObjectApplyMatches.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\QuickForm\\:\\:getDb\\(\\)\\.$#" count: 1 path: library/Director/PropertyModifier/PropertyModifierMap.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\QuickForm\\:\\:getSetting\\(\\)\\.$#" count: 1 path: library/Director/PropertyModifier/PropertyModifierMap.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\QuickForm\\:\\:getSetting\\(\\)\\.$#" count: 1 path: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php - message: "#^Access to an undefined property Zend_Controller_Action_HelperBroker\\:\\:\\$viewRenderer\\.$#" count: 1 path: library/Director/Web/Controller/ActionController.php - message: "#^Access to an undefined property Zend_View_Interface\\:\\:\\$compact\\.$#" count: 1 path: library/Director/Web/Controller/ActionController.php - message: "#^Access to an undefined property Zend_View_Interface\\:\\:\\$controls\\.$#" count: 1 path: library/Director/Web/Controller/ActionController.php - message: "#^Call to an undefined method Zend_Controller_Action_HelperBroker\\:\\:layout\\(\\)\\.$#" count: 1 path: library/Director/Web/Controller/ActionController.php - message: "#^Call to an undefined method Zend_Controller_Request_Abstract\\:\\:getHeader\\(\\)\\.$#" count: 1 path: library/Director/Web/Controller/ActionController.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: library/Director/Web/Controller/ObjectController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: library/Director/Web/Controller/ObjectController.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: library/Director/Web/Controller/ObjectsController.php - message: "#^Call to an undefined method Icinga\\\\Data\\\\Filter\\\\Filter\\:\\:filters\\(\\)\\.$#" count: 1 path: library/Director/Web/Controller/ObjectsController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getObjectName\\(\\)\\.$#" count: 1 path: library/Director/Web/Controller/ObjectsController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: library/Director/Web/Controller/ObjectsController.php - message: "#^PHPDoc tag @var has invalid value \\(\\$ex FilterChain\\|FilterExpression\\)\\: Unexpected token \"\\$ex\", expected type at offset 9$#" count: 1 path: library/Director/Web/Controller/ObjectsController.php - message: "#^PHPDoc tag @var has invalid value \\(\\$filter FilterChain\\)\\: Unexpected token \"\\$filter\", expected type at offset 9$#" count: 1 path: library/Director/Web/Controller/ObjectsController.php - message: "#^PHPDoc tag @var has invalid value \\(\\$sub FilterChain\\)\\: Unexpected token \"\\$sub\", expected type at offset 9$#" count: 1 path: library/Director/Web/Controller/ObjectsController.php - message: "#^Access to an undefined property Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:\\$branch\\.$#" count: 1 path: library/Director/Web/Controller/TemplateController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Controller\\\\ActionController\\:\\:getBranchStore\\(\\)\\.$#" count: 1 path: library/Director/Web/Controller/TemplateController.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:getShortTableName\\(\\)\\.$#" count: 1 path: library/Director/Web/Form/DirectorObjectForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:listImportNames\\(\\)\\.$#" count: 1 path: library/Director/Web/Form/DirectorObjectForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:ranges\\(\\)\\.$#" count: 2 path: library/Director/Web/Form/DirectorObjectForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:supportsApplyRules\\(\\)\\.$#" count: 1 path: library/Director/Web/Form/DirectorObjectForm.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Data\\\\Db\\\\DbObject\\:\\:supportsImports\\(\\)\\.$#" count: 1 path: library/Director/Web/Form/DirectorObjectForm.php - message: "#^Class Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\Element\\\\Boolean referenced with incorrect case\\: Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\Element\\\\boolean\\.$#" count: 1 path: library/Director/Web/Form/Element/InstanceSummary.php - message: "#^Class Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\Element\\\\Boolean referenced with incorrect case\\: Icinga\\\\Module\\\\Director\\\\Web\\\\Form\\\\Element\\\\boolean\\.$#" count: 1 path: library/Director/Web/Form/Element/SimpleNote.php - message: "#^Variable \\$file might not be defined\\.$#" count: 1 path: library/Director/Web/Form/FormLoader.php - message: "#^PHPDoc tag @var has invalid value \\(\\$filter FilterChain\\|FilterExpression\\)\\: Unexpected token \"\\$filter\", expected type at offset 9$#" count: 1 path: library/Director/Web/Form/IcingaObjectFieldLoader.php - message: "#^Variable \\$hook in PHPDoc tag @var does not match assigned variable \\$type\\.$#" count: 1 path: library/Director/Web/Form/IcingaObjectFieldLoader.php - message: "#^PHPDoc tag @var above assignment does not specify variable name\\.$#" count: 1 path: library/Director/Web/Form/QuickBaseForm.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getFrontController\\(\\)\\.$#" count: 4 path: library/Director/Web/Form/QuickForm.php - message: "#^Variable \\$req in PHPDoc tag @var does not exist\\.$#" count: 1 path: library/Director/Web/Form/QuickForm.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getRequest\\(\\)\\.$#" count: 1 path: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php - message: "#^PHPDoc tag @var has invalid value \\(\\$app Web\\)\\: Unexpected token \"\\$app\", expected type at offset 9$#" count: 1 path: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php - message: "#^Method gipfl\\\\IcingaWeb2\\\\Widget\\\\ControlsAndContent\\:\\:addTitle\\(\\) invoked with 2 parameters, 1 required\\.$#" count: 1 path: library/Director/Web/ObjectPreview.php - message: "#^Access to an undefined property object\\:\\:\\$object_name\\.$#" count: 2 path: library/Director/Web/Table/GroupMemberTable.php - message: "#^Comparison operation \"\\<\" between \\(array\\|float\\|int\\) and int\\<1, max\\> results in an error\\.$#" count: 1 path: library/Director/Web/Table/JobTable.php - message: "#^Method ipl\\\\Html\\\\BaseHtmlElement\\:\\:tag\\(\\) invoked with 3 parameters, 0 required\\.$#" count: 1 path: library/Director/Web/Table/PropertymodifierTable.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getViewRenderer\\(\\)\\.$#" count: 1 path: library/Director/Web/Table/QuickTable.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Table\\\\QuickTable\\:\\:renderAdditionalActions\\(\\)\\.$#" count: 1 path: library/Director/Web/Table/QuickTable.php - message: "#^Call to an undefined method Icinga\\\\Web\\\\Widget\\\\AbstractWidget\\:\\:setColumns\\(\\)\\.$#" count: 1 path: library/Director/Web/Table/QuickTable.php - message: "#^Variable \\$file might not be defined\\.$#" count: 1 path: library/Director/Web/Table/TableLoader.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Director\\\\Web\\\\Widget\\\\IcingaObjectInspection\\:\\:db\\(\\)\\.$#" count: 2 path: library/Director/Web/Widget/IcingaObjectInspection.php icingaweb2-module-director-1.11.8/phpstan.neon000066400000000000000000000017621516513262500212620ustar00rootroot00000000000000includes: - phpstan-baseline.neon parameters: level: 2 checkFunctionNameCase: true checkInternalClassCaseSensitivity: true treatPhpDocTypesAsCertain: false paths: - application - library/Director ignoreErrors: - messages: - '#Unsafe usage of new static\(\)#' - '#. but return statement is missing#' reportUnmatched: false scanDirectories: - /icingaweb2 - /usr/share/icinga-php - /usr/share/icingaweb2-modules excludePaths: - library/Director/CoreBeta - test - library/Director/Test universalObjectCratesClasses: - Icinga\Module\Director\Data\Db\DbObject - Icinga\Data\ConfigObject - Icinga\Web\View - Icinga\Module\Monitoring\Object\MonitoredObject - Icinga\Module\Monitoring\DataView\DataView - Icinga\Web\Session\SessionNamespace - Icinga\User\Preferences - ipl\Orm\Model icingaweb2-module-director-1.11.8/phpunit.xml000066400000000000000000000010451516513262500211270ustar00rootroot00000000000000 test/php icingaweb2-module-director-1.11.8/public/000077500000000000000000000000001516513262500201745ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/public/css/000077500000000000000000000000001516513262500207645ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/public/css/module.less000066400000000000000000001035661516513262500231540ustar00rootroot00000000000000div.action-bar a:focus, .tabs a:focus { outline: none; text-decoration: underline; &:before { text-decoration: none; } } table.common-table td { padding-top: 0.2em; padding-bottom: 0.2em; vertical-align: middle; p { word-break: break-word; } } #layout.minimal-layout table.common-table td { padding-top: 0.5em; padding-bottom: 0.5em; } table.common-table thead th { border-bottom: 1px solid @text-color; } table.common-table tbody td { border-bottom: 1px solid @gray-lighter; } a:before { text-decoration: none; } form.director-form { max-width: 68em; } form.director-form:focus { outline: none; } div.action-bar a, div.action-bar form i { color: @icinga-blue; } div.action-bar > a { margin-right: 1em; } .controls.compact { display: none; } .controls > .pagination-control.activity-log-control { float: right; width: 5em; } .controls > .pagination-control li > a { padding: 0.5em 0 0.5em 0; } .controls > .pagination-control > ul { float: right; } div.action-bar { .pagination-control { float: none; clear: none; display: inline-block; line-height: inherit; margin: 0; vertical-align: middle; } form.director-form input { margin: 0; } input { max-width: unset; } select { line-height: 1.25em; } } div.action-bar ul { padding: 0; margin: 0; li { list-style-type: none; a { display: block; } } } div.action-bar > ul { display: inline-block; } div.action-bar > ul ul { padding: 0.5em 0em 1em 0em; min-width: 10em; position: absolute; display: none; color: @text-color-inverted; background-color: @icinga-blue; a { display: block; padding: 0.3em 2em 0.3em 2em; margin: 0; outline: none; color: @text-color-inverted; &:hover { text-decoration: underline; } } li.active a { font-weight: bold; } } div.action-bar > ul > li:hover ul { display: block; } div.action-bar > ul > li > a { padding: 0.2em 0.5em; } div.action-bar > ul > li:hover { background-color: @icinga-blue; & > a { color: @text-color-inverted; text-decoration: none; } } #layout.twocols div.action-bar .pagination-control { li { display: none; } li:nth-child(1), li.active, li:last-child { display: list-item; } li.active a { border-bottom: none; } } .content a { color: @icinga-blue; &:hover { text-decoration: underline; } } p { max-width: 56em; } table.common-table { max-width: 68em; a { color: inherit; text-decoration: none; } th { padding-top: 0.5em; } td { vertical-align: top; } pre { margin: 0; padding: 0.2em; max-height: 10em; background: none; overflow: auto; word-break: keep-all; white-space: pre; display: inline-block; -ms-overflow-style: none; scrollbar-width: none; &::-webkit-scrollbar { display: none; } } } table.history { td:last-of-type { text-align: right; } } span.disabled { cursor: no-drop; color: @gray-light; } .controls span.action-links { display: block; margin-bottom: 0.5em; a { color: @icinga-blue; margin-right: 1em; } form.director-form { display: inline; margin-right: 1em; } } .action-bar { form.director-form { display: inline; margin-right: 1em; } } pre.disabled { color: @disabled-gray; } form.director-form i.link-color::before { color: @icinga-blue; } /* TODO: remove this, but autosubmit looks ugly otherwise */ form.director-form input[disabled] { background: inherit; } /* END OF TODO */ pre { background: none; } pre.logfile { font-size: 0.875em; padding: 1em; background: @gray-lighter; color: @gray; overflow: auto; white-space: pre-wrap; a { color: @link-color; } .loglevel, .application { font-weight: bold; } .critical { color: @color-critical; } .warning { color: @color-warning; } .information { color: @color-ok; } .notice { // color: @color-ok; } .debug { color: @color-pending; } .error-hint { color: @text-color; font-weight: 900; } } pre.generated-config { a { color: @link-color; font-weight: bold; } .highlight { border-bottom: 1px dashed @gray-light; &::before { // icon: right-big font-family: 'ifont'; content: '\e826'; margin-left: -1em; padding-top: 0em; float: left; } &.critical::before { color: @color-critical; } &.warning::before { color: @color-warning; } &.ok::before { color: @color-ok; } } } pre.agent-deployment-instructions { color: @text-color; height: 14em; overflow: scroll; } table.avp th { font-size: inherit; } .content form.director-form { margin-top: 0.5em; margin-bottom: 2em; } .content form.director-form.inline { margin: 0; i.icon::before { color: @icinga-blue; } } .invisible { position: absolute; left: -100%; } form.remove-link-form { float: right; } form.director-form input[type=file] { padding-right: 1em; } form.director-form input[type=submit] { .button(); border-width: 1px; margin-top: 0.5em; &:disabled { border-color: @gray-light; background-color: @gray-light; color: @disabled-gray; } } form.director-form input[type=submit]:first-of-type { border-width: 2px; } form.director-form input[type=submit].link-button { color: @icinga-blue; background: none; border: none; font-weight: normal; padding: 0; margin: 0; text-align: left; &:hover { text-decoration: underline; } } form.director-form p.description { padding: 1em 1em; margin: 0; font-style: italic; width: 100%; } form.director-form { input[type=text], input[type=button], select, select option, textarea { -webkit-appearance: none; -moz-appearance: none; } } form.director-form ul.form-errors { list-style-type: none; margin-bottom: 0.5em; padding: 0; ul.errors { list-style-type: none; padding: 0; } ul.errors li { background: @color-critical; font-weight: bold; padding: 0.5em 1em; color: @text-color-inverted; } } form.director-form { select::-ms-expand, input::-ms-expand, textarea::-ms-expand { /* for IE 11 */ display: none; } select { border: 1px solid @gray-light; cursor: pointer; background: none; } input[type=text], input[type=password], textarea, select { max-width: 36em; min-width: 20em; width: 100%; line-height: 2em; height: 2.4em; padding-left: 0.5em; border-style: solid; border-color: transparent; border-bottom-color: @gray-lighter; border-width: 1px 1px 1px 3px; background-color: @low-sat-blue; &.search { background: transparent url("../img/icons/search.png") no-repeat scroll 0.5em center / 1em 1em; padding-left: 2em; } } textarea { max-width: 100%; } select[multiple] { height: auto; } select option { height: 2em; padding-top: 0.3em; } select[multiple=multiple] { height: auto; } label { line-height: 2em; } } form.director-form dl { margin: 0; padding: 0; } form.director-form .host-group-links { line-height: 2.5em; padding-left: 0.5em; } .strike-links a, table.common-table .strike-links a { text-decoration: line-through; &:hover { text-decoration: line-through; } } .strike-links span.ro-service { text-decoration: line-through; } // TODO: figure out whether form.editor and filter-related CSS is still required div.filter > form.search, div.filter > a { // Duplicated by quicksearch display: none; } div.filter form.editor > ul.tree ul li.active { background-color: @tr-hover-color; } div.filter form.editor { padding-top: 1em; select, input[type=text] { line-height: unset; height: auto; } } form.director-form.editor { select, input[type=text] { background: @low-sat-blue; max-width: unset; min-width: unset; width: auto; } .tree li a { padding: 0; } } ul.unordred-list { list-style-type: none; margin: 0; padding: 0; } ul.extensible-set { margin: 0; padding: 0; list-style-type: none; display: inline-block; width: 100%; max-width: 36em; min-width: 20em; border-bottom: 1px solid @gray-lighter; input[type=text], input[type=password], textarea, select { border-color: transparent; } li { display: inline; } select { width: 100%; } input[type=text] { background-color: @low-sat-blue; .rounded-corners(0.5em); border: 1px solid transparent; padding: 0.1em 0.3em; margin: 0.2em 0.2em; width: 30%; min-width: 4em; text-overflow: ellipsis; } span.inline-buttons { position: absolute; z-index: 10; right: 0.225em; top: -0.275em; input[type=submit] { font-family: 'ifont'; width: 2em; height: 2em; font-size: 1em; margin-left: 0.2em; padding: 1px 0 1px 0; } } select.extend-set, input.extend-set { display: none; } } form.director-form { #_FAKE_SUBMIT { position: absolute; left: -100%; } } form.director-form dd.active ul.extensible-set, ul.extensible-set.sortable { li { display: list-item; position: relative; clear: both; } input[type=text], select { width: 100%; } input[type=text] { background-color: @low-sat-blue; .rounded-corners(0); border: 1px solid @gray-light; padding: 0.25em 0.5em; margin: 0; } } form.director-form dd.active ul.extensible-set { border: 1px solid @icinga-blue; input[type=submit]:first-of-type { border-width: 1px; } select.extend-set, input.extend-set { display: inline; } } form.director-form { select::-moz-focus-inner { border: 0; } select:-moz-focusring { color: transparent; text-shadow: 0 0 0 #000; } select, input[type=text], textarea { &:hover { border-style: dotted solid dotted solid; border-color: @gray-light; } &:focus, &:focus:hover { border-style: solid; border-color: @icinga-blue; outline: none; } } select option { padding-left: 0.5em; } select option[value=""] { color: @disabled-gray; background-color: @low-sat-blue; } } a { &.state-critical { color: @color-critical; } &.state-warning { color: @color-warning; } &.state-ok { color: @color-ok; } &.state-unknown { color: @color-unknown; } &.state-pending { color: @color-pending; } } ul.tabs a.state-critical { background-color: @color-critical; font-weight: bold; color: @text-color-inverted; } ul.tabs a.state-warning { background-color: @color-warning; font-weight: bold; color: @text-color-inverted; } ul.tabs a.state-ok { background-color: @color-ok; font-weight: bold; color: @text-color-inverted; } ul.tabs a.state-unknown { background-color: @color-unknown; font-weight: bold; color: @text-color-inverted; } a:hover::before { text-decoration: none; } ul.main-actions { margin: 0; padding: 0; min-width: 38em; max-width: 64em; li { list-style-type: none; text-align: left; display: inline-block; padding: 0; clear: both; width: 18em; min-width: 16em; vertical-align: top; a { i { font-size: 3em; display: block; float: left; line-height: 1em; margin-right: 0.3em; color: @text-color-light; } &.state-critical i { color: @color-critical; } &.state-warning i { color: @color-warning; } &.state-ok i { color: @color-ok; } &.state-unknown i { color: @color-unknown; } &.state-pending i { color: @color-pending; } border-left: 0.5em solid transparent; padding: 1em; color: @text-color; font-weight: bold; display: block; text-decoration: none; min-height: 12em; overflow: hidden; &.active { border-color: @icinga-blue; background-color: @tr-active-color; } &:hover { background-color: @tr-hover-color; text-decoration: none; } &:active, &:focus { background-color: @tr-hover-color; outline: none; } } p { font-weight: normal; margin-bottom: 0.5em; padding-left: 4.5em; color: @text-color-light; } } } #layout.compact-layout.twocols ul.main-actions, #layout.minimal-layout ul.main-actions { max-width: unset; min-width: unset; li { width: 100%; a { height: auto; min-height: unset; } > a > i { font-size: 3em; } > a > p { padding-left: 4.5em; } margin-bottom: 0.5em; } } #layout.minimal-layout div.content form.director-form { dt, dd { display: block; width: auto; } fieldset.collapsed { dd, dt, ul, div { display: none; } } dt label { color: @text-color; } fieldset { min-width: unset; } input[type=text], input[type=password], textarea, select { max-width: unset; min-width: unset; border-color: @gray-light; } dd.active { input[type=text], input[type=password], textarea, select { border-color: @icinga-blue; } } ul.extensible-set { max-width: unset; } dd ul.extensible-set { border: 1px solid @gray-light; } dd.active ul.extensible-set { border: 1px solid @icinga-blue; input[type=submit]:first-of-type { border-width: 1px; } } dd.active ul.extensible-set, ul.extensible-set.sortable { input[type=text], select { width: 100%; } input[type=text] { background-color: @low-sat-blue; border: 1px solid @gray-light; } } } form.director-form fieldset { margin: 0; padding: 0 0 1.5em 0; border: none; legend { margin: 0em 0 0.5em 0; font-size: 1em; border-bottom: 1px solid @gray-light; font-weight: bold; display: block; width: 100%; padding-left: 1em; line-height: 2em; cursor: pointer; user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; &:hover { border-color: @text-color; } &::before { // icon: down-dir font-family: 'ifont'; content: '\e81d'; margin-left: -1em; padding-top: 0em; float: left; color: inherit; } } &.collapsed { legend { margin: 0; } dd, dt, ul, div { display: none; } legend::before { // icon: right-dir content: '\e820'; } margin-bottom: 0.2em; padding-bottom: 0; } } /* BEGIN Forms */ form.director-form dt label { width: auto; font-weight: normal; font-size: inherit; &.required { &::after { content: '*' } } &:hover { text-decoration: underline; cursor: pointer; } } form.director-form fieldset { min-width: 36em; } form.director-form dd input.related-action[type='submit'] { display: none; } form.director-form dd.active li.active input.related-action[type='submit'] { display: inline-block; } form.director-form { select.config-diff { width: auto; } p.description { color: @gray; font-style: italic; padding: 0.25em 0.5em; display: none; } dd.active { p.description { font-style: normal; display: block; height: auto; color: @text-color; } } } form.director-form.db-selector { padding: 0; margin: 0; select { float: right; text-align: center; max-width: 20em; margin-top: 0.5em; min-width: 14em; width: auto; } } // Adjustments for the legacy layout to keep backwards compatibility #layout.twocols > #main &#col1 { width: 50%; } #layout.twocols > #main &#col2 { width: 50%; } #layout.twocols > #main &#col1 + #col2 { width: 50%; } // Adjustments for the flexbox layout #layout.twocols > #content-wrapper &#col2, #layout.twocols > #content-wrapper &#col1 + #col2 { flex-grow: 1; } form.director-form dd { padding: 0.3em 0.5em; margin: 0; } form.director-form dt { padding: 0.5em 0.5em; margin: 0; } form.director-form dt.active, form.director-form dd.active { background-color: @tr-active-color; } form.director-form dt { display: inline-block; vertical-align: top; min-width: 12em; min-height: 2.5em; width: 30%; &.errors label { color: @color-critical; } } form.director-form .errors label { color: @color-critical; } form.director-form dd { display: inline-block; width: 63%; min-height: 2.5em; vertical-align: top; margin: 0; &.errors { input[type=text], select { border-color: @color-critical; } } &.full-width { padding: 0.5em; width: 100%; } } form.director-form dd:after { display: block; content: ''; } form.director-form textarea { height: auto; } form.director-form dd ul.errors { list-style-type: none; padding-left: 0.3em; li { color: @color-critical; padding: 0.3em; } } form.director-form div.hint { padding: 1em; background-color: @tr-hover-color; margin: 1em 0; max-width: 65em; font-size: 1em; pre { font-style: normal; background-color: @body-bg-color; margin: 0; padding: 1em; } } /* END of Forms */ ul.health-check-result { list-style-type: none; padding: 0; margin-bottom: 2em; li { line-height: 2em; } .badge { font-weight: bold; } } .title-badges { .badge { font-size: 0.6em; margin-left: 0.5em; } } li.state { border-left: 0.5em solid transparent; margin-bottom: 0.5em; padding-left: 1em; &.state-ok { border-color: @color-ok; } &.state-warning { border-color: @color-warning; } &.state-critical { border-color: @color-critical; } &.state-unknown { border-color: @color-unknown; } &.state-pending { border-color: @color-pending; } } span.error { color: @color-critical; a { color: @color-critical; } } p.legacy-error { color: @text-color-inverted; padding: 1em 2em; background-color: @color-critical; } table th.actions, table td.actions { text-align: right; } table tr.disabled td { color: @gray-light; font-style: italic; } /* Simple table, test */ table.syncstate { tr td:first-child { padding-left: 2em; &::before { font-family: 'ifont'; // icon-help: content: '\e85b'; float: left; font-weight: bold; margin-left: -1.5em; line-height: 1.5em; } } tr.in-sync td:first-child::before { content: '\e803'; color: @color-ok; } tr.pending-changes td:first-child::before { content: '\e864'; color: @color-warning; } tr.failing td:first-child::before { content: '\e804'; color: @color-critical; } } table.jobs { tr td:first-child { padding-left: 2em; &::before { font-family: 'ifont'; // icon-help: content: '\e85b'; float: left; font-weight: bold; margin-left: -1.5em; line-height: 1.5em; } } tr.ok td:first-child::before { content: '\e803'; color: @color-ok; } tr.warning td:first-child::before { content: '\e864'; color: @color-warning; } tr.pending td:first-child::before { content: '\e864'; color: @color-pending; } tr.critical td:first-child::before { content: '\e804'; color: @color-critical; } } table.icinga-objects { tr td:first-child { padding-left: 2em; &::before { font-family: 'ifont'; // icon-wrench: content: '\e83d'; float: left; font-weight: bold; margin-left: -1.5em; line-height: 1.5em; } } tr.icinga-object-external td:first-child::before { color: @gray; // icon-pin content: '\e879'; } tr.icinga-object td:first-child::before { color: @text-color; // icon-thumbs-up // content: '\e867'; // icon-ok content: '\e803'; } tr.icinga-template td:first-child::before { color: @gray-light; // icon-paste content: '\e817'; } tr.icinga-apply td:first-child::before { color: @text-color; // resize-full-alt content: '\e829'; } } div.content.compact table.icinga-objects thead { display: none; } table.deployment-details { .succeeded { color: @state-ok; } .failed { color: @color-critical; } } table.deployment-log { tr td:nth-child(2), tr th:nth-child(2) { text-align: right; padding-right: 1em; } tr th:first-child { padding-left: 2em; } tr td:first-child { padding-left: 2em; &::before { font-family: 'ifont'; // icon-help: content: '\e85b'; float: left; font-weight: bold; margin-left: -1.5em; line-height: 1.5em; } } tr.succeeded td:first-child::before { // icon-ok color: @color-ok; content: '\e803'; } tr.pending td:first-child::before { color: @gray; // icon-spinner content: '\e874'; .animate(spin 2s infinite linear); } tr.failed td:first-child::before { // icon-ok color: @color-critical; content: '\e804'; } tr.running td, tr.running td a { font-weight: bold; } } th.table-header-day { text-align: right; } table.activity-log { td { max-height: 2em; } tr th:first-child { padding-left: 2em; } tr td:last-child { text-align: right; white-space: nowrap; width:10%; } tr td:first-child { padding-left: 2em; &::before { font-family: 'ifont'; // icon-help: content: '\e85b'; float: left; font-weight: bold; margin-left: -1.5em; line-height: 1.5em; } } tr.action-create td:first-child::before { // icon-plus color: @color-pending; content: '\e805'; } tr.action-modify td:first-child::before { // icon-wrench color: @color-ok; content: '\e83d'; } tr.action-delete td:first-child::before { // icon-cancel color: @color-critical; content: '\e804'; } tr.undeployed td, tr.undeployed a { color: @gray; } tr.undeployed { background-color: @gray-lightest; &.active { background-color: @gray-lighter; } &[href]:hover { background-color: @gray-light; td, a { color: @text-color; } } } tr.branched { background-color: @gray-lightest; color: @color-pending; } tr.undeployed td:first-child::before { color: @gray; } div.range-comment-container { width: 100%; position: absolute; height: 100%; background: @body-bg-color; border-radius: 1em; } a.range-comment { width: 100%; height: 100%; display: block; border-radius: 1em; padding: 0.2em 1em; vertical-align: middle; &::-webkit-scrollbar { display: none; } scrollbar-width: none; -ms-overflow-style: none; overflow-y:auto; overflow-x:hidden; word-break: break-word; &:hover { cursor: default; text-decoration: none; } background: fade(@color-warning-handled, 20%); &:hover { background: fade(@color-warning-handled, 60%); } } td.comment-cell { padding: 0; min-width: 10em; width: 40%; position: relative; &.continuing div.range-comment-container { border-bottom-left-radius: 0; border-bottom-right-radius: 0; a.range-comment { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } } &.continued div.range-comment-container { border-top-left-radius: 0; border-top-right-radius: 0; a.range-comment { border-top-left-radius: 0; border-top-right-radius: 0; } } } } tr.branch_modified { color: @color-pending; } table.config-diff { tr th:first-child { padding-left: 2em; } tr td:first-child { padding-left: 2em; &::before { font-family: 'ifont'; // icon-help: content: '\e85b'; float: left; font-weight: bold; margin-left: -1.5em; line-height: 1.5em; } } tr.file-unmodified td:first-child::before { // icon-ok color: @color-ok; content: '\e803'; } tr.file-created td:first-child::before { // icon-plus color: @color-pending; content: '\e805'; } tr.file-removed td:first-child::before { // icon-cancel color: @color-critical; content: '\e804'; } tr.file-modified td:first-child::before { // icon-flapping color: @color-warning; content: '\e85d'; } } input[type=submit].icon-button { font-family: 'ifont'; font-weight: normal; background: none; border: none; padding: 0.2em 0.4em 0.2em 0.4em; margin: 0 0 0 0.2em; &:hover { background-color: @icinga-blue; } &:disabled { background-color: unset; color: @gray-light; cursor: default; } } /** BEGIN breadcrumb **/ // Hint: .badges is unused right now .breadcrumb { list-style: none; overflow: hidden; padding: 0; .badges { display: inline-block; padding: 0 0 0 0.5em; .badge { line-height: 1.25em; font-size: 0.8em; border: 1px solid @text-color; margin: -0.25em 1px 0 0; } } } .breadcrumb { > .critical a { color: @text-color-inverted; background: @color-critical; } > .critical.handled a { color: @text-color-inverted; background: @color-critical-handled; } > .unknown a { color: @text-color-inverted; background: @color-unknown; } > .unknown.handled a { color: @text-color-inverted; background: @color-unknown-handled; } > .warning a { color: @text-color-inverted; background: @color-warning; } > .warning.handled a { color: @text-color-inverted; background: @color-warning-handled; } > .ok a { color: @text-color-inverted; background: @color-ok; } } .breadcrumb { > .critical a:after { border-left-color: @color-critical; } > .critical.handled a:after { border-left-color: @color-critical-handled; } > .unknown a:after { border-left-color: @color-unknown; } > .unknown.handled a:after { border-left-color: @color-unknown-handled; } > .warning a:after { border-left-color: @color-warning; } > .warning.handled a:after { border-left-color: @color-warning-handled; } > .ok a:after { border-left-color: @color-ok; } } .breadcrumb:after { content:''; display:block; clear: both; } .breadcrumb li { float: left; cursor: pointer; user-select: none; background: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; } .breadcrumb li a { // color: white; color: @icinga-blue; margin: 0; // font-size: 1.2em; text-decoration: none; padding-left: 2em; // line-height: 1.5em; // background: @icinga-blue; border: 1px none @icinga-blue; border-right-style: solid; border-left-style: solid; position: relative; display: block; float: left; &:focus { outline: none; } &:hover { text-decoration: none; } } .action-bar .breadcrumb li a { padding-left: 2em; } .breadcrumb li a:before, .breadcrumb li a:after { content: " "; display: block; width: 0; height: 0; border-top: 1.3em solid transparent; border-bottom: 1.2em solid transparent; position: absolute; margin-top: -1.2em; top: 50%; left: 100%; } .breadcrumb li a:before { border-left: 1.2em solid @icinga-blue; margin-left: 1px; z-index: 1; } .breadcrumb li a:after { border-left: 1.2em solid @body-bg-color; z-index: 2; } .breadcrumb li:first-child a { padding-left: 1em; padding-right: 0.5em; } .breadcrumb li:last-child a { color: @text-color; } .breadcrumb li:not(:last-child) a:hover { background: @icinga-blue; color: @text-color-on-icinga-blue; } .breadcrumb li:not(:last-child) a:hover:after { border-left-color: @icinga-blue; } .breadcrumb li:last-child:hover, .breadcrumb li:last-child a:hover { background: transparent; text-decoration: underline; } .breadcrumb li a:focus { text-decoration: underline; } /** END of breadcrumb **/ ul.filter-root { margin-top: 0; width: 100%; padding-left: 0.5em; list-style-type: none; ul { list-style-type: none; padding-left: 1.5em; } ul.filter { padding-left: 1.5em; list-style-type: none; width: 100%; } li.filter-chain, div.filter-expression { width: 100%; padding: 0.3em 0.5em; min-width: 30em; } ul li.filter-chain::before, ul .filter-expression::before { font-family: 'ifont'; // Formerly: icon-down-open: e821 // icon-right-small: content: '\e877'; float: left; margin-left: -1.5em; margin-top: 0.5em; } ul.extensible-set { padding-left: 0; border: none; display: inline-block; vertical-align: top; li::before { content: none; } } .filter-chain > input[type=submit].icon-button, .filter-expression > input[type=submit].icon-button { display: none; font-family: 'ifont'; font-weight: normal; background: none; border: none; padding: 0.2em 0.4em 0.2em 0.4em; margin: 0 0 0 0.2em; } .active input[type=submit].icon-button, li:hover input[type=submit].icon-button, div:hover input[type=submit].icon-button { display: inline; } } .errors > ul.filter-root { input[type=text], select { border-color: transparent; border-bottom-color: @gray-lighter; } select.column, select.operator { border-left-color: @color-critical; } } form.director-form li.filter-chain > select.operator { min-width: 5em; max-width: 5em; width: 5em; } form.director-form div.filter-expression { .column { min-width: 7em; max-width: 30em; width: auto; } .sign { min-width: 4em; max-width: 4em; width: 4em; margin: 0 0.3em; &.wide { min-width: 6em; max-width: 8em; width: 8em; } } div.expression-wrapper { display: inline-block; vertical-align: top; } div.expression-wrapper > input[type=text], div.expression-wrapper > select { min-width: 7em; width: 10em; max-width: 10em; } } ul.director-suggestions { /* min-width: 18.5em; max-width: 34.65em; width: 100%; */ width: 20em; max-height: 25em; overflow-y: auto; overflow-x: hidden; border: 1px solid @icinga-blue; position: absolute; z-index: 2000; padding: 0; margin: 0; list-style-type: none; background-color: @low-sat-blue; li { margin: 0; padding: 0.5em 1em; } li:hover { background-color: @tr-hover-color; cursor: pointer; } li.active { color: @text-color; &:hover { color: @text-color; } } table.benchmark { font-size: 0.8em; font-family: @font-family-fixed; } } table.pivot { width: 100%; table-layout: fixed; thead th { text-align: center; } tbody th { text-align: right; width: 25%; } tbody td { text-align: center; } tbody td > a { display: block; font-size: 2em; line-height: 1.5em; text-decoration: none; color: @icinga-blue; &:hover { background: @tr-active-color; text-decoration: none; } } } .tree li a { display: inline-block; padding-left: 2.4em; line-height: 2em; text-decoration: none; color: @text-color; outline: 0; background-repeat: no-repeat; background-position: 0.8em 0.4em; } ul.tree li > .handle { background-image: none; &:before { content: '\e806'; font-family: 'ifont'; position: absolute; font-size: 0.6em; margin-left: 0.25em; margin-top: 0.9em; } } ul.tree li.collapsed > .handle { background-image: none; &:before { content: '\e805'; } } .tree li a { padding-left: 1em; } div.sql-dump { background-color: @gray-lightest; border: 1px solid @gray-light; padding: 1em; } div.exception { margin: 1em; } h2.action-create::before { color: @color-pending; } h2.action-modify::before { color: @color-ok; } h2.action-delete::before { color: @color-critical; } /* Special components */ table.table-basket-changes { min-width: 18em; max-width: 100%; th { width: 80%; font-weight: normal; text-align: left; min-width: 10em; } } .font-italic { font-style: italic; } .table-basket-changes { .basket-new { color: green; font-weight: bold } .basket-modified { color: orange; font-weight: bold } .basket-unchanged { color: green; } } .seviceset-obj-link { float: right; font-weight: normal } .dictionary-header { margin-top: 2em; } .text-align-left { text-align: left } icingaweb2-module-director-1.11.8/public/img/000077500000000000000000000000001516513262500207505ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/public/img/globe.png000066400000000000000000000015621516513262500225520ustar00rootroot00000000000000‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<IDATxÚ„RKoWþîvã@vãF{äJ}ã@ÿ@NäV†åX‡åbŽæl”çn—çe•ój™õv›èzŸéqõ¡éw¢ö}§ø€€€“¢·–¥ºš©¾ž®Ã„¥é†¦ê‹ªê„«ù‹°úµû–¹üš½ý£²È§¶ÌŸÀþ¢ÂÿÐàðààðàèððððððÿðøÿÿøÿÿÿÿ!ù ,ŽH° ÁƒA(ñÁ„,@` €@)P” 1BD *Hˆ@à¢B 8`à@—žˆA³fÍ/\h"€Ÿ?iâtÁ"€À6oædQT ‡š¢JºÂ¨‚ ImµªÁ'PB—rÍc(Ó±4§N­*°«M9[°X¡‚k€»xóâEÈ7 ;icingaweb2-module-director-1.11.8/public/img/script.png000066400000000000000000000007271516513262500227700ustar00rootroot00000000000000‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<yIDATxÚŒS?KÃP¿—÷ò§ ÝÚ¯*”NquÉâàäð+ŠŸA\œ: ıC¡“‹““ƒƒd0C!U&iÚ&ñ®¤iŠøÒƒƒ»w÷û½{ïî˜Ó뉢( ©ª…f ”,ËF¢äXWÝnÿ¬ÓqЖÃ8ž]7¾¯ŠÕr¹=oYí¶óR°¦ëp?Þ=ïA¨ª'¢Å¢þ =¯ 8b '“gι»NaÁušÂ eB9eÌ‚ì¤2¡ø¿Œ°2a¢¨p8Eå”1"*;T9—PÎ&Žã;Þ^E@9eLy•¯UU€9ˆ)~Zd;Áxå ¦˜`48†±²7Å>S«¶Ù¶–å6@’h4žúÃ0ÏmûôÕu7àRNªi`äJ>絆é^¯›¦mß~Îfßx{&Uܲ»áð‰5HrLDŒÕj'J³yyð Á[êû/´:¨ó_“V¸¼`èm¼IEND®B`‚icingaweb2-module-director-1.11.8/public/img/server.png000066400000000000000000000006471516513262500227730ustar00rootroot00000000000000‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<IIDATxÚŒ“½j„@€Ç¿-ҤѤÐ&ÍÕ6äÂ5ñ Ò˜—±=ÛÔ’*'Hu`°ÒØ!þà_f +‚›õ†ÝÙùvggGÇ|ßI’p¸±|aÌMâ8•&Ã0°ÍÛ(ŠNmÛr#5Mƒ ž—k ï{fKMÓ@UU\€®ëä+­]×1[NÓt:‰'t3ô•…Çq@”Â& ®k(Ë’ 0 ƒXœ8¥ ª*@¡¯`Û¶0…MU€—B’$àºî&@¡’.Ê:‹çy@ïƒ¾Ê P³wÿò<Ÿ}w+@–eÌÞ‡a(üÇè»_¨eºYn𿲬³œŸÎpx9€,Ëùò÷Îì‡;Ül-ËâŽïGP­¿'#_Œùœþ>c^£>¢ÞÂ1¨¯¨9¸~Ee„Ë„Ú÷c~^´Äiÿ“ëæIEND®B`‚icingaweb2-module-director-1.11.8/public/img/service.png000066400000000000000000000011311516513262500231120ustar00rootroot00000000000000‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<ûIDATxÚ¤S¿‹AþfvwvÃîšœ’*†¹lN=­ÕBÄJH'X©ha‹46vWÆJ¼ …ÚØ ‚‚ ,("D4›ä6ûÓ÷fs+6ÂyóŠ÷}ï{ï͈¢(°Ÿcöz½6Ý›ÜðÚ̲ìl¿ß¿×jµºY–"M3B‚$á8Ežç(MÂÔ0M…ñxüa8|øÀ¤„³Ù¬Nf¨Æ¿bBw4¹¦eYù`0@³ÙÔ¾x&eÕ¢ŠI’ ŠbHÉLíRÏ€l &w:ª [_œZCöò½&N&!aŽzÝ×öóù¤\‰I»`RqôUŒˆ8¥ä–åJ2¹¦œè€qkâ.œÕÂp†Å"ƒm×–Dµt`Q<Õ’’%Ûæjé™ãúfð!x6ŽlÝDãÒi-dÛ”²µˆv@•Ú…“H7O`ñé+¼ûתE{ëÇиu?î>ý<ÜsWp¸¶‚•6_½S Hñâ-&ï>ë!þ|úJïÝ]_ÃÁÛ—ŸÁu馧 -rˆÈmWÇÑ}ó¹¥<¨o L=‡ó=A½Kiüõ wvʘôˆ,¥Tµ÷òX4À1Œ¿QJ±¬(*( i­uOø¾Ã0ŒÕÿùHäö KÖ–ÉÜ#?å%öû 0¾»/Ž+‹ZIEND®B`‚icingaweb2-module-director-1.11.8/public/img/tree.png000066400000000000000000000010141516513262500224110ustar00rootroot00000000000000‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<®IDATxÚŒS;nÂ@Ûk“ˆ„‚o"¤H š4tЦ*w R΀BAÁ(èRåЦâi‘.Rì%Ûà›Y›ÉHcïÌ=ÏÎR¾$¥¯¦iN×ëµ/Ýk·X–;võÒjutÓ„•mƒ(IPk4)¥(ð<„DA ߯X'$8‡A[,`1Ÿ» Û²”ërùiU’"îsD:Í&dB!° yVqxÌò‰Dm$Ë]v¾pÛÕÁÀ+ÝT*3ð²9ŽSÅD2ò˲ x®mZ³þɶçë`{ˆ‹ðÖï'ó¥RW_“ÍÆ.s9·Cf£Á v‹_÷PZ¥©p,Q,Žd³L8áLf*â½ÂŠ* `‹c8u PaG…ƒØ …Å =PX[!N ΄tJ88ùg‡„c«ª® ‡©x¡ Ágîß‹.±m¡ ðsпqÆ1#¶f%l IEND®B`‚icingaweb2-module-director-1.11.8/public/js/000077500000000000000000000000001516513262500206105ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/public/js/module.js000066400000000000000000000723311516513262500224410ustar00rootroot00000000000000 (function (Icinga) { var Director = function (module) { this.module = module; this.initialize(); this.openedFieldsets = {}; this.module.icinga.logger.debug('Director module loaded'); }; Director.prototype = { initialize: function () { /** * Tell Icinga about our event handlers */ this.module.on('rendered', this.rendered); this.module.on('beforerender', this.beforeRender); this.module.on('click', 'fieldset > legend', this.toggleFieldset); // Disabled // this.module.on('click', 'div.controls ul.tabs a', this.detailTabClick); this.module.on('click', 'input.related-action', this.extensibleSetAction); this.module.on('click', 'ul.filter-root input[type=submit]', this.setAutoSubmitted); this.module.on('focus', 'form input, form textarea, form select', this.formElementFocus); this.module.on('keyup', '.director-suggest', this.autoSuggest); this.module.on('keydown', '.director-suggest', this.suggestionKeyDown); this.module.on('dblclick', '.director-suggest', this.suggestionDoubleClick); this.module.on('focus', '.director-suggest', this.enterSuggestionField); this.module.on('focusout', '.director-suggest', this.leaveSuggestionField); this.module.on('mousedown', '.director-suggestions li', this.clickSuggestion); this.module.on('dblclick', 'ul.tabs a', this.tabWantsFullscreen); this.module.on('change', 'form input.autosubmit, form select.autosubmit', this.setAutoSubmitted); this.module.icinga.logger.debug('Director module initialized'); }, tabWantsFullscreen: function (ev) { var icinga = this.module.icinga; var $a, $container, id; if (icinga.ui.isOneColLayout()) { return; } $a = $(ev.currentTarget); if ($a.hasClass('refresh-container-control')) { return; } $container = $a.closest('.container'); id = $container.attr('id'); icinga.loader.stopPendingRequestsFor($container); if (id === 'col2') { icinga.ui.moveToLeft(); } icinga.ui.layout1col(); icinga.history.pushCurrentState(); ev.preventDefault(); ev.stopPropagation(); }, /** * Autocomplete/suggestion eventhandler * * Triggered when pressing a key in a form element with suggestions * @param ev */ suggestionKeyDown: function (ev) { var $el = $(ev.currentTarget); var key = ev.which; if (key === 13) { /** * RETURN key pressed. In case there are any suggestions: * - let's choose the active one (if set) * - stop the event * * This let's return bubble up in case there is no suggestion list shown */ if (this.hasActiveSuggestion($el)) { this.chooseActiveSuggestion($el); ev.stopPropagation(); ev.preventDefault(); } else { this.removeSuggestionList($el); if ($el.closest('.extensible-set')) { $el.trigger('change'); } else { $el.closest('form').submit(); } } } else if (key === 27) { // ESC key pressed. Remove suggestions if any this.removeSuggestionList($el); } else if (key === 39) { /** * RIGHT ARROW key pressed. In case there are any suggestions: * - let's choose the active one (if set) * - stop the event only if an element has been chosen * * This allows to use the right arrow key normally in all other situations */ if (this.hasSuggestions($el)) { if (this.chooseActiveSuggestion($el)) { ev.stopPropagation(); ev.preventDefault(); } } } else if (key === 38 ) { /** * UP ARROW key pressed. In any case: * - stop the event * - activate the previous suggestion if any */ ev.stopPropagation(); ev.preventDefault(); this.activatePrevSuggestion($el); } else if (key === 40 ) { // down /** * DOWN ARROW key pressed. In any case: * - stop the event * - activate the next suggestion if any */ ev.stopPropagation(); ev.preventDefault(); this.activateNextSuggestion($el); } }, suggestionDoubleClick: function (ev) { var $el = $(ev.currentTarget); this.getSuggestionList($el); }, /** * Autocomplete/suggestion eventhandler * * Triggered when releasing a key in a form element with suggestions * * @param ev */ autoSuggest: function (ev) { // Ignore special keys, most of them have already been handled on 'keydown' var key = ev.which; if (key === 9 || // TAB key === 13 || // RETURN key === 27 || // ESC key === 37 || // LEFT ARROW key === 38 || // UP ARROW key === 39 ) { // RIGHT ARROW return; } var $el = $(ev.currentTarget); if (key === 40) { // DOWN ARROW this.getSuggestionList($el); } else { this.getSuggestionList($el, true); } }, /** * Activate the next related suggestion if any * * This walks down the suggestion list, takes care about scrolling and restarts from * top once reached the bottom * * @param $el */ activateNextSuggestion: function ($el) { var $list = this.getSuggestionList($el); var $next; var $active = $list.find('li.active'); if ($active.length) { $next = $active.next('li'); if ($next.length === 0) { $next = $list.find('li').first(); } } else { $next = $list.find('li').first(); } if ($next.length) { // Will not happen when list is empty or last element is active $list.find('li.active').removeClass('active'); $next.addClass('active'); $list.scrollTop($next.offset().top - $list.offset().top - 64 + $list.scrollTop()); } }, /** * Activate the previous related suggestion if any * * This walks up through the suggestion list and takes care about scrolling. * Puts the focus back on the input field once reached the top and restarts * from bottom when moving up from there * * @param $el */ activatePrevSuggestion: function ($el) { var $list = this.getSuggestionList($el); var $prev; var $active = $list.find('li.active'); if ($active.length) { $prev = $active.prev('li'); } else { $prev = $list.find('li').last(); } $list.find('li.active').removeClass('active'); if ($prev.length) { $prev.addClass('active'); $list.scrollTop($prev.offset().top - $list.offset().top - 64 + $list.scrollTop()); } else { $el.focus(); $el.val($el.val()); } }, /** * Whether a related suggestion list element exists * * @param $input * @returns {boolean} */ hasSuggestionList: function ($input) { var $ul = $input.siblings('ul.director-suggestions'); return $ul.length > 0; }, /** * Whether any related suggestions are currently being shown * * @param $input * @returns {boolean} */ hasSuggestions: function ($input) { var $ul = $input.siblings('ul.director-suggestions'); return $ul.length > 0 && $ul.is(':visible'); }, /** * Get a suggestion list. Optionally force refresh * * @param $input * @param $forceRefresh * * @returns {jQuery} */ getSuggestionList: function ($input, $forceRefresh) { var $ul = $input.siblings('ul.director-suggestions'); if ($ul.length) { if ($forceRefresh) { return this.refreshSuggestionList($ul, $input); } else { return $ul; } } else { $ul = $('
      '); $input.parent().css({ position: 'relative' }); $ul.insertAfter($input); var suggestionWidth = (parseInt($input.css('width')) * 2) + 'px'; $ul.css({width: suggestionWidth}); return this.refreshSuggestionList($ul, $input); } }, /** * Refresh a given suggestion list * * @param $suggestions * * @param $el * @returns {jQuery} */ refreshSuggestionList: function ($suggestions, $el) { // Not sure whether we need this Accept-header var headers = { 'X-Icinga-Accept': 'text/html' }; var icinga = this.module.icinga; // Ask for a new window id in case we don't already have one if (icinga.ui.hasWindowId()) { headers['X-Icinga-WindowId'] = icinga.ui.getWindowId(); } else { headers['X-Icinga-WindowId'] = 'undefined'; } // var onResponse = function (data, textStatus, req) { var onResponse = function (data) { $suggestions.html(data); var $li = $suggestions.find('li'); if ($li.length) { $suggestions.show(); } else { $suggestions.hide(); } }; var req = $.ajax({ type: 'POST', url: this.module.icinga.config.baseUrl + '/director/suggest', data: { value: $el.val(), context: $el.data('suggestion-context'), for_host: $el.data('suggestion-for-host') }, headers: headers }); req.done(onResponse); return $suggestions; }, /** * Click handler for proposed suggestions * * @param ev */ clickSuggestion: function (ev) { this.chooseSuggestion($(ev.currentTarget)); }, /** * Choose a specific suggestion * @param $suggestion */ chooseSuggestion: function ($suggestion) { var $el = $suggestion.closest('ul').siblings('.director-suggest'); var val = $suggestion.text(); // extract label and key from key var re = /^(.+) \[(\w+)]$/; var withLabel = val.match(re); if (withLabel) { val = withLabel[2]; } if (val.match(/\.$/)) { $el.val(val); this.getSuggestionList($el, true); } else { $el.focus(); $el.val(val); $el.trigger('change'); this.getSuggestionList($el).remove(); } }, /** * Choose the current active suggestion related to a given element * * Returns true in case there was any, false otherwise * * @param $el * @returns {boolean} */ chooseActiveSuggestion: function ($el) { var $list = this.getSuggestionList($el); var $active = $list.find('li.active'); if ($active.length === 0) { $active = $list.find('li:hover'); } if ($active.length) { this.chooseSuggestion($active); return true; } else { $list.remove(); return false; } }, hasActiveSuggestion: function ($el) { if (this.hasSuggestions($el)) { var $list = this.getSuggestionList($el); var $active = $list.find('li.active'); if ($active.length === 0) { $active = $list.find('li:hover'); } return $active.length > 0; } else { return false; } }, /** * Remove related suggestion list if any * * @param $el */ removeSuggestionList: function ($el) { if (this.hasSuggestionList($el)) { this.getSuggestionList($el).remove(); } }, /** * Show suggestions when arriving to an empty auto-completion field * * @param ev */ enterSuggestionField: function (ev) { // Has been disabled long time ago, as we do not want to open // extensible Sets on focus. Should we re-enable this and just // blacklist extensible sets? // // var $el = $(ev.currentTarget); // if ($el.val() === '' || $el.val().match(/\.$/)) { // this.getSuggestionList($el) // } }, /** * Close suggestions when leaving the related form element * * @param ev */ leaveSuggestionField: function (ev) { // return; var _this = this; setTimeout(function () { _this.removeSuggestionList($(ev.currentTarget)); }, 100); }, /** * Sets an autosubmit flag on the container related to an event * * This will be used in beforeRender to determine whether the request has been triggered by an * auto-submission * * @param ev */ setAutoSubmitted: function (ev) { $(ev.currentTarget).closest('.container').data('directorAutosubmit', 'yes'); }, /** * Caused problems with differing tabs, should not be used * * @deprecated */ detailTabClick: function (ev) { var $a = $(ev.currentTarget); if ($a.closest('#col2').length === 0) { return; } this.alignDetailLinks(); }, /** * Caused problems with differing tabs, should not be used * * @deprecated */ alignDetailLinks: function () { var self = this; var $a = $('#col2').find('div.controls ul.tabs li.active a'); if ($a.length !== 1) { return; } var $leftTable = $('#col1').find('> div.content').find('table.icinga-objects'); if ($leftTable.length !== 1) { return; } var tabPath = self.pathFromHref($a); $leftTable.find('tr').each(function (idx, tr) { var $tr = $(tr); if ($tr.is('[href]')) { self.setHrefPath($tr, tabPath); } else { // Unfortunately we currently run BEFORE the action table // handler var $a = $tr.find('a[href].rowaction'); if ($a.length === 0) { $a = $tr.find('a[href]').first(); } if ($a.length) { self.setHrefPath($a, tabPath); } } }); $leftTable.find('tr[href]').each(function (idx, tr) { var $tr = $(tr); self.setHrefPath($tr, tabPath); }); }, pathFromHref: function ($el) { return this.module.icinga.utils.parseUrl($el.attr('href')).path }, setHrefPath: function ($el, path) { var a = this.module.icinga.utils.getUrlHelper(); a.href = $el.attr('href'); a.pathname = path; $el.attr('href', a.href); }, extensibleSetAction: function (ev) { var iid, $li, $prev, $next; var el = ev.currentTarget; if (el.name.match(/__MOVE_UP$/)) { $li = $(el).closest('li'); $prev = $li.prev(); // TODO: document what's going on here. if ($li.find('input[type=text].autosubmit')) { iid = $prev.find('input[type=text]').attr('id'); if (iid) { $li.closest('.container').data('activeExtensibleEntry', iid); } else { return true; } } if ($prev.length) { $prev.before($li.detach()); this.fixRelatedActions($li.closest('ul')); } ev.preventDefault(); ev.stopPropagation(); return false; } else if (el.name.match(/__MOVE_DOWN$/)) { $li = $(el).closest('li'); $next = $li.next(); // TODO: document what's going on here. if ($li.find('input[type=text].autosubmit')) { iid = $next.find('input[type=text]').attr('id'); if (iid) { $li.closest('.container').data('activeExtensibleEntry', iid); } else { return true; } } if ($next.length && ! $next.find('.extend-set').length) { $next.after($li.detach()); this.fixRelatedActions($li.closest('ul')); } ev.preventDefault(); ev.stopPropagation(); return false; } else if (el.name.match(/__REMOVE$/)) { $li = $(el).closest('li'); if ($li.find('.autosubmit').length) { // Autosubmit element, let the server handle this return true; } $li.remove(); this.fixRelatedActions($li.closest('ul')); ev.preventDefault(); ev.stopPropagation(); return false; } else if (el.name.match(/__DROP_DOWN$/)) { ev.preventDefault(); ev.stopPropagation(); var $el = $(ev.currentTarget).closest('li').find('input[type=text]'); this.getSuggestionList($el); return false; } }, fixRelatedActions: function ($ul) { var $uls = $ul.find('li'); var last = $uls.length - 1; if ($ul.find('.extend-set').length) { last--; } $uls.each(function (idx, li) { var $li = $(li); if (idx === 0) { $li.find('.action-move-up').attr('disabled', 'disabled'); if (last === 0) { $li.find('.action-move-down').attr('disabled', 'disabled'); } else { $li.find('.action-move-down').removeAttr('disabled'); } } else if (idx === last) { $li.find('.action-move-up').removeAttr('disabled'); $li.find('.action-move-down').attr('disabled', 'disabled'); } else { $li.find('.action-move-up').removeAttr('disabled'); $li.find('.action-move-down').removeAttr('disabled'); } }); }, formElementFocus: function (ev) { var $input = $(ev.currentTarget); if ($input.closest('form.editor').length) { return; } var $set = $input.closest('.extensible-set'); if ($set.length) { var $textInputs = $('input[type=text]', $set); if ($textInputs.length > 1) { $textInputs.not(':first').attr('tabIndex', '-1'); } } var $dd = $input.closest('dd'); if ($dd.attr('id') && $dd.attr('id').match(/button/)) { return; } var $li = $input.closest('li'); var $dt = $dd.prev(); var $form = $dd.closest('form'); $form.find('dt, dd, li').removeClass('active'); $li.addClass('active'); $dt.addClass('active'); $dd.addClass('active'); }, highlightFormErrors: function ($container) { $container.find('dd ul.errors').each(function (idx, ul) { var $ul = $(ul); var $dd = $ul.closest('dd'); var $dt = $dd.prev(); $dt.addClass('errors'); $dd.addClass('errors'); }); }, toggleFieldset: function (ev) { ev.stopPropagation(); var $fieldset = $(ev.currentTarget).closest('fieldset'); $fieldset.toggleClass('collapsed'); this.fixFieldsetInfo($fieldset); this.openedFieldsets[$fieldset.attr('id')] = ! $fieldset.hasClass('collapsed'); }, beforeRender: function (ev) { var $container = $(ev.currentTarget); var id = $container.attr('id'); var requests = this.module.icinga.loader.requests; if (typeof requests[id] !== 'undefined' && requests[id].autorefresh) { $container.data('director-autorefreshed', 'yes'); } else { $container.removeData('director-autorefreshed'); } // Remove the temporary directorAutosubmit flag and set or remove // the directorAutosubmitted property accordingly if ($container.data('directorAutosubmit') === 'yes') { $container.removeData('directorAutosubmit'); $container.data('directorAutosubmitted', 'yes'); } else { $container.removeData('directorAutosubmitted'); } }, /** * Whether the given container has been autosubmitted * * @param $container * @returns {boolean} */ containerIsAutoSubmitted: function ($container) { return $container.data('directorAutosubmitted') === 'yes'; }, /** * Whether the given container has been autorefreshed * * @param $container * @returns {boolean} */ containerIsAutorefreshed: function ($container) { return $container.data('director-autorefreshed') === 'yes'; }, rendered: function (ev) { var iid; var icinga = this.module.icinga; var $container = $(ev.currentTarget); if ($container.children('div.controls').first().data('directorWindowId') === '_UNDEFINED_') { var $url = $container.data('icingaUrl'); if (typeof $url !== 'undefined') { icinga.loader.loadUrl($url, $container).autorefresh = true; } $container.children('div.controls').children().hide(); $container.children('div.content').hide(); return; } this.restoreContainerFieldsets($container); this.backupAllExtensibleSetDefaultValues($container); this.highlightFormErrors($container); this.scrollHighlightIntoView($container); this.scrollActiveRowIntoView($container); this.highlightActiveDashlet($container); iid = $container.data('activeExtensibleEntry'); if (iid) { $('#' + iid).focus(); $container.removeData('activeExtensibleEntry'); } // Disabled for now // this.alignDetailLinks(); if (! this.containerIsAutorefreshed($container) && ! this.containerIsAutoSubmitted($container)) { this.putFocusOnFirstFormElement($container); } // Turn off autocomplete for all suggested fields $container.find('input.director-suggest').each(this.disableAutocomplete); }, highlightActiveDashlet: function ($container) { if (this.module.icinga.ui.isOneColLayout()) { return; } var url, $actions, $match; var id = $container.attr('id'); if (id === 'col1') { url = $('#col2').data('icingaUrl'); $actions = $('.main-actions', $container); } else if (id === 'col2') { url = $container.data('icingaUrl'); $actions = $('.main-actions', $('#col1')); } if (! $actions.length) { return; } $match = $('li a[href*="' + url + '"]', $actions); if ($match.length) { $('li a.active', $actions).removeClass('active'); $match.first().addClass('active'); } }, restoreContainerFieldsets: function ($container) { var self = this; $container.find('form').each(self.restoreFieldsets.bind(self)); }, putFocusOnFirstFormElement: function ($container) { $container.find('form.autofocus').find('label').first().focus(); }, scrollHighlightIntoView: function ($container) { var $hl = $container.find('.highlight'); var $content = $container.find('> div.content'); if ($hl.length) { $container.animate({ scrollTop: $hl.offset().top - $content.offset().top }, 700); } }, scrollActiveRowIntoView: function ($container) { var $tr = $container.find('table.table-row-selectable > tbody > tr.active'); var $content = $container.find('> div.content'); if ($tr.length) { $container.animate({ scrollTop: $tr.offset().top - $content.offset().top }, 500); } }, backupAllExtensibleSetDefaultValues: function ($container) { var self = this; $container.find('.extensible-set').each(function (idx, eSet) { $(eSet).find('input[type=text]').each(self.backupDefaultValue); $(eSet).find('select').each(self.backupDefaultValue); }); }, backupDefaultValue: function (idx, el) { $(el).data('originalvalue', el.value); }, restoreFieldsets: function (idx, form) { var $form = $(form); var self = this; var $sets = $('fieldset', $form); $sets.each(function (idx, fieldset) { var $fieldset = $(fieldset); if ($fieldset.attr('id') === 'fieldset-assign') { return; } if ($fieldset.find('.required').length === 0 && (! self.fieldsetWasOpened($fieldset))) { $fieldset.addClass('collapsed'); self.fixFieldsetInfo($fieldset); } }); if ($sets.length === 1) { $sets.first().removeClass('collapsed'); } }, fieldsetWasOpened: function ($fieldset) { var id = $fieldset.attr('id'); if (typeof this.openedFieldsets[id] === 'undefined') { return false; } return this.openedFieldsets[id]; }, fixFieldsetInfo: function ($fieldset) { if ($fieldset.hasClass('collapsed')) { if ($fieldset.find('legend span.element-count').length === 0) { var cnt = $fieldset.find('dt, li').not('.extensible-set li').length; if (cnt > 0) { $fieldset.find('legend').append($(' (' + cnt + ')')); } } } else { $fieldset.find('legend span.element-count').remove(); } }, disableAutocomplete: function () { $(this) .attr('autocomplete', 'off') .attr('autocorrect', 'off') .attr('autocapitalize', 'off') .attr('spellcheck', 'false'); } }; Icinga.availableModules.director = Director; }(Icinga)); icingaweb2-module-director-1.11.8/register-hooks.php000066400000000000000000000162221516513262500223770ustar00rootroot00000000000000getConfig()->get('frontend', 'disabled', 'no') !== 'yes') { $this->provideHook('monitoring/HostActions'); $this->provideHook('monitoring/ServiceActions'); $this->provideHook('icingadb/HostActions'); $this->provideHook('icingadb/ServiceActions'); $this->provideHook('icingadb/icingadbSupport'); $this->provideHook('cube/Actions', CubeLinks::class); $this->provideHook('cube/IcingaDbActions', IcingaDbCubeLinks::class); } $this->provideHook('Icingadb/CustomVarRenderer', null, true); $this->provideHook('Monitoring/CustomVarRenderer', null, true); $directorHooks = [ 'director/DataType' => [ DataTypeArray::class, DataTypeBoolean::class, DataTypeDatalist::class, DataTypeDictionary::class, DataTypeNumber::class, DataTypeDirectorObject::class, DataTypeSqlQuery::class, DataTypeString::class ], 'director/ImportSource' => [ ImportSourceDirectorObject::class, ImportSourceSql::class, ImportSourceLdap::class, ImportSourceCoreApi::class, ImportSourceRestApi::class ], 'director/Job' => [ ConfigJob::class, HousekeepingJob::class, ImportJob::class, SyncJob::class, ], 'director/PropertyModifier' => [ PropertyModifierArrayElementByPosition::class, PropertyModifierArrayFilter::class, PropertyModifierArrayToRow::class, PropertyModifierArrayUnique::class, PropertyModifierBitmask::class, PropertyModifierCombine::class, PropertyModifierDictionaryToRow::class, PropertyModifierDnsRecords::class, PropertyModifierExtractFromDN::class, PropertyModifierFromAdSid::class, PropertyModifierFromLatin1::class, PropertyModifierGetHostByAddr::class, PropertyModifierGetHostByName::class, PropertyModifierGetPropertyFromOtherImportSource::class, PropertyModifierJoin::class, PropertyModifierJsonDecode::class, PropertyModifierLConfCustomVar::class, PropertyModifierListToObject::class, PropertyModifierLowercase::class, PropertyModifierMakeBoolean::class, PropertyModifierMap::class, PropertyModifierNegateBoolean::class, PropertyModifierParseURL::class, PropertyModifierRegexReplace::class, PropertyModifierRegexSplit::class, PropertyModifierRejectOrSelect::class, PropertyModifierRenameColumn::class, PropertyModifierReplace::class, PropertyModifierReplaceNull::class, PropertyModifierSimpleGroupBy::class, PropertyModifierSkipDuplicates::class, PropertyModifierSplit::class, PropertyModifierStripDomain::class, PropertyModifierSubstring::class, PropertyModifierToInt::class, PropertyModifierTrim::class, PropertyModifierUppercase::class, PropertyModifierUpperCaseFirst::class, PropertyModifierURLEncode::class, PropertyModifierUuidBinToHex::class, PropertyModifierXlsNumericIp::class, ] ]; foreach ($directorHooks as $type => $classNames) { foreach ($classNames as $className) { $this->provideHook($type, $className); } } icingaweb2-module-director-1.11.8/run-missingdeps.php000066400000000000000000000010441516513262500225550ustar00rootroot00000000000000isCli()) { throw new IcingaException( "Missing dependencies, please check " ); } else { $request = Icinga::app()->getRequest(); $path = $request->getPathInfo(); if (! preg_match('#^/director#', $path)) { return; } if (preg_match('#^/director/phperror/dependencies#', $path)) { return; } header('Location: ' . Url::fromPath('director/phperror/dependencies')); exit; } icingaweb2-module-director-1.11.8/run-php5.3.php000066400000000000000000000012231516513262500212440ustar00rootroot00000000000000isCli()) { throw new IcingaException( "PHP version 5.6.x is required for Director >= 1.7.0, you're running %s." . ' Please either upgrade PHP or downgrade Icinga Director', PHP_VERSION ); } else { $request = Icinga::app()->getRequest(); $path = $request->getPathInfo(); if (! preg_match('#^/director#', $path)) { return; } if (preg_match('#^/director/phperror/error#', $path)) { return; } header('Location: ' . Url::fromPath('director/phperror/error')); exit; } icingaweb2-module-director-1.11.8/run.php000066400000000000000000000006571516513262500202430ustar00rootroot00000000000000app); if (! $checker->satisfiesDependencies($this)) { include __DIR__ . '/run-missingdeps.php'; return; } include __DIR__ . '/register-hooks.php'; icingaweb2-module-director-1.11.8/schema/000077500000000000000000000000001516513262500201565ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/000077500000000000000000000000001516513262500241735ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_1.sql000066400000000000000000000001431516513262500265610ustar00rootroot00000000000000ALTER TABLE icinga_user ADD COLUMN object_type ENUM('object', 'template') NOT NULL AFTER zone_id; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_10.sql000066400000000000000000000011201516513262500266350ustar00rootroot00000000000000ALTER TABLE icinga_hostgroup_parent DROP FOREIGN KEY icinga_hostgroup_parent_parent; ALTER TABLE icinga_hostgroup_parent ADD CONSTRAINT icinga_hostgroup_parent_parent FOREIGN KEY parent (parent_hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE icinga_usergroup_parent DROP FOREIGN KEY icinga_usergroup_parent_parent; ALTER TABLE icinga_usergroup_parent ADD CONSTRAINT icinga_usergroup_parent_parent FOREIGN KEY parent (parent_usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE RESTRICT ON UPDATE CASCADE; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_11.sql000066400000000000000000000001351516513262500266430ustar00rootroot00000000000000ALTER TABLE icinga_zone ADD is_global ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_12.sql000066400000000000000000000011721516513262500266460ustar00rootroot00000000000000CREATE TABLE icinga_service_inheritance ( service_id INT(10) UNSIGNED NOT NULL, parent_service_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (service_id, parent_service_id), UNIQUE KEY unique_order (service_id, weight), CONSTRAINT icinga_service_inheritance_service FOREIGN KEY host (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_inheritance_parent_service FOREIGN KEY host (parent_service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_13.sql000066400000000000000000000011211516513262500266410ustar00rootroot00000000000000CREATE TABLE icinga_user_inheritance ( user_id INT(10) UNSIGNED NOT NULL, parent_user_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (user_id, parent_user_id), UNIQUE KEY unique_order (user_id, weight), CONSTRAINT icinga_user_inheritance_user FOREIGN KEY host (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_user_inheritance_parent_user FOREIGN KEY host (parent_user_id) REFERENCES icinga_user (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_14.sql000066400000000000000000000012451516513262500266510ustar00rootroot00000000000000CREATE TABLE icinga_timeperiod_inheritance ( timeperiod_id INT(10) UNSIGNED NOT NULL, parent_timeperiod_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (timeperiod_id, parent_timeperiod_id), UNIQUE KEY unique_order (timeperiod_id, weight), CONSTRAINT icinga_timeperiod_inheritance_timeperiod FOREIGN KEY host (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_timeperiod_inheritance_parent_timeperiod FOREIGN KEY host (parent_timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_15.sql000066400000000000000000000012261516513262500266510ustar00rootroot00000000000000CREATE TABLE icinga_hostgroup_inheritance ( hostgroup_id INT(10) UNSIGNED NOT NULL, parent_hostgroup_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (hostgroup_id, parent_hostgroup_id), UNIQUE KEY unique_order (hostgroup_id, weight), CONSTRAINT icinga_hostgroup_inheritance_hostgroup FOREIGN KEY host (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_inheritance_parent_hostgroup FOREIGN KEY host (parent_hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_16.sql000066400000000000000000000013001516513262500266430ustar00rootroot00000000000000CREATE TABLE icinga_servicegroup_inheritance ( servicegroup_id INT(10) UNSIGNED NOT NULL, parent_servicegroup_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (servicegroup_id, parent_servicegroup_id), UNIQUE KEY unique_order (servicegroup_id, weight), CONSTRAINT icinga_servicegroup_inheritance_servicegroup FOREIGN KEY host (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_inheritance_parent_servicegroup FOREIGN KEY host (parent_servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_17.sql000066400000000000000000000012001516513262500266430ustar00rootroot00000000000000CREATE TABLE icinga_command_inheritance ( command_id INT(10) UNSIGNED NOT NULL, parent_command_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (command_id, parent_command_id), UNIQUE KEY unique_order (command_id, weight), CONSTRAINT icinga_command_inheritance_command FOREIGN KEY command (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_command_inheritance_parent_command FOREIGN KEY command (parent_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_18.sql000066400000000000000000000011201516513262500266450ustar00rootroot00000000000000CREATE TABLE icinga_zone_inheritance ( zone_id INT(10) UNSIGNED NOT NULL, parent_zone_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (zone_id, parent_zone_id), UNIQUE KEY unique_order (zone_id, weight), CONSTRAINT icinga_zone_inheritance_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_zone_inheritance_parent_zone FOREIGN KEY zone (parent_zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_19.sql000066400000000000000000000012401516513262500266510ustar00rootroot00000000000000CREATE TABLE icinga_usergroup_inheritance ( usergroup_id INT(10) UNSIGNED NOT NULL, parent_usergroup_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (usergroup_id, parent_usergroup_id), UNIQUE KEY unique_order (usergroup_id, weight), CONSTRAINT icinga_usergroup_inheritance_usergroup FOREIGN KEY usergroup (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_usergroup_inheritance_parent_usergroup FOREIGN KEY usergroup (parent_usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_2.sql000066400000000000000000000001331516513262500265610ustar00rootroot00000000000000ALTER TABLE icinga_command_argument ADD UNIQUE KEY unique_idx (command_id, argument_name); icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_20.sql000066400000000000000000000012201516513262500266370ustar00rootroot00000000000000CREATE TABLE icinga_endpoint_inheritance ( endpoint_id INT(10) UNSIGNED NOT NULL, parent_endpoint_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (endpoint_id, parent_endpoint_id), UNIQUE KEY unique_order (endpoint_id, weight), CONSTRAINT icinga_endpoint_inheritance_endpoint FOREIGN KEY endpoint (endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_endpoint_inheritance_parent_endpoint FOREIGN KEY endpoint (parent_endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_21.sql000066400000000000000000000007311516513262500266460ustar00rootroot00000000000000DROP TABLE director_datalist_value; CREATE TABLE director_datalist_entry ( list_id INT(10) UNSIGNED NOT NULL, entry_name VARCHAR(255) DEFAULT NULL, entry_value TEXT DEFAULT NULL, format enum ('string', 'expression', 'json'), PRIMARY KEY (list_id, entry_name), CONSTRAINT director_datalist_value_datalist FOREIGN KEY datalist (list_id) REFERENCES director_datalist (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_22.sql000066400000000000000000000027511516513262500266530ustar00rootroot00000000000000CREATE TABLE icinga_host_field ( host_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', fieldname VARCHAR(64) NOT NULL, caption VARCHAR(255) NOT NULL, datatype_id INT(10) UNSIGNED NOT NULL, -- datatype_param? multiple ones? default_value TEXT DEFAULT NULL, format enum ('string', 'json', 'expression'), PRIMARY KEY (host_id, fieldname), KEY search_idx (fieldname), CONSTRAINT icinga_host_field_host FOREIGN KEY host(host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_field_datatype FOREIGN KEY datatype (datatype_id) REFERENCES director_datatype (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_field ( service_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', fieldname VARCHAR(64) NOT NULL, caption VARCHAR(255) NOT NULL, datatype_id INT(10) UNSIGNED NOT NULL, -- datatype_param? multiple ones? default_value TEXT DEFAULT NULL, format enum ('string', 'json', 'expression'), PRIMARY KEY (service_id, fieldname), KEY search_idx (fieldname), CONSTRAINT icinga_service_field_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_field_datatype FOREIGN KEY datatype (datatype_id) REFERENCES director_datatype (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_23.sql000066400000000000000000000031621516513262500266510ustar00rootroot00000000000000DROP TABLE director_datatype; CREATE TABLE director_datafield ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, varname VARCHAR(64) NOT NULL, caption VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, datatype varchar(255) NOT NULL, -- datatype_param? multiple ones? format enum ('string', 'json', 'expression'), PRIMARY KEY (id), KEY search_idx (varname) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE icinga_host_field; CREATE TABLE icinga_host_field ( host_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') DEFAULT NULL, PRIMARY KEY (host_id, datafield_id), CONSTRAINT icinga_host_field_host FOREIGN KEY host(host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE icinga_service_field; CREATE TABLE icinga_service_field ( service_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') DEFAULT NULL, PRIMARY KEY (service_id, datafield_id), CONSTRAINT icinga_service_field_service FOREIGN KEY service(service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_24.sql000066400000000000000000000055611516513262500266570ustar00rootroot00000000000000CREATE TABLE import_source ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, source_name VARCHAR(64) NOT NULL, provider_class VARCHAR(72) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE import_source_setting ( source_id INT(10) UNSIGNED NOT NULL, setting_name VARCHAR(64) NOT NULL, setting_value VARCHAR(255) NOT NULL, PRIMARY KEY (source_id, setting_name), CONSTRAINT import_source_settings_source FOREIGN KEY source (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE imported_rowset ( checksum VARBINARY(20) NOT NULL, PRIMARY KEY (checksum) ) ENGINE=InnoDB; CREATE TABLE import_run ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, source_id INT(10) UNSIGNED NOT NULL, imported_rowset_checksum VARBINARY(20) DEFAULT NULL, start_time DATETIME NOT NULL, end_time DATETIME DEFAULT NULL, succeeded ENUM('y', 'n') DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT import_run_source FOREIGN KEY import_source (source_id) REFERENCES import_source (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT import_run_rowset FOREIGN KEY rowset (imported_rowset_checksum) REFERENCES imported_rowset (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE imported_row ( checksum VARBINARY(20) NOT NULL COMMENT 'sha1(object_name;property_checksum;...)', object_name VARCHAR(255) NOT NULL, PRIMARY KEY (checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE imported_rowset_row ( rowset_checksum VARBINARY(20) NOT NULL, row_checksum VARBINARY(20) NOT NULL, PRIMARY KEY (rowset_checksum, row_checksum), CONSTRAINT imported_rowset_row_rowset FOREIGN KEY rowset_row_rowset (rowset_checksum) REFERENCES imported_rowset (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT imported_rowset_row_row FOREIGN KEY rowset_row_rowset (row_checksum) REFERENCES imported_row (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE imported_property ( checksum VARBINARY(20) NOT NULL, property_name VARCHAR(64) NOT NULL, property_value TEXT NOT NULL, format enum ('string', 'expression', 'json'), PRIMARY KEY (checksum), KEY search_idx (property_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE imported_row_property ( row_checksum VARBINARY(20) NOT NULL, property_checksum VARBINARY(20) NOT NULL, PRIMARY KEY (row_checksum, property_checksum), CONSTRAINT imported_row_property_row FOREIGN KEY row_checksum (row_checksum) REFERENCES imported_row (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT imported_row_property_property FOREIGN KEY property_checksum (property_checksum) REFERENCES imported_property (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_25.sql000066400000000000000000000002251516513262500266500ustar00rootroot00000000000000ALTER TABLE import_source ADD COLUMN key_column VARCHAR(64) NOT NULL AFTER source_name; ALTER TABLE import_source ADD INDEX search_idx (key_column); icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_26.sql000066400000000000000000000005101516513262500266460ustar00rootroot00000000000000ALTER TABLE import_run DROP FOREIGN KEY import_run_rowset; ALTER TABLE import_run CHANGE imported_rowset_checksum rowset_checksum varbinary(20) DEFAULT NULL; ALTER TABLE import_run ADD CONSTRAINT import_run_rowset FOREIGN KEY rowset (rowset_checksum) REFERENCES imported_rowset (checksum) ON DELETE RESTRICT ON UPDATE CASCADE; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_27.sql000066400000000000000000000034451516513262500266610ustar00rootroot00000000000000 CREATE TABLE sync_rule ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, rule_name VARCHAR(255) NOT NULL, object_type ENUM('host', 'user') NOT NULL, update_policy ENUM('merge', 'override', 'ignore') NOT NULL, purge_existing ENUM('y', 'n') NOT NULL DEFAULT 'n', filter_expression TEXT NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE sync_property ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, rule_id INT(10) UNSIGNED NOT NULL, source_id INT(10) UNSIGNED NOT NULL, source_expression VARCHAR(255) NOT NULL, destination_field VARCHAR(64), priority SMALLINT UNSIGNED NOT NULL, filter_expression TEXT DEFAULT NULL, merge_policy ENUM('override', 'merge') NOT NULL, PRIMARY KEY (id), CONSTRAINT sync_property_rule FOREIGN KEY sync_rule (rule_id) REFERENCES sync_rule (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT sync_property_source FOREIGN KEY import_source (source_id) REFERENCES import_source (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE sync_modifier ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, property_id INT(10) UNSIGNED NOT NULL, provider_class VARCHAR(72) NOT NULL, PRIMARY KEY (id), CONSTRAINT sync_modifier_property FOREIGN KEY sync_property (property_id) REFERENCES sync_property (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE sync_modifier_param ( modifier_id INT UNSIGNED NOT NULL, param_name VARCHAR(64) NOT NULL, param_value TEXT DEFAULT NULL, PRIMARY KEY (modifier_id, param_name), CONSTRAINT sync_modifier_param_modifier FOREIGN KEY modifier (modifier_id) REFERENCES sync_modifier (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_28.sql000066400000000000000000000001021516513262500266450ustar00rootroot00000000000000ALTER TABLE sync_rule MODIFY filter_expression TEXT DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_29.sql000066400000000000000000000007641516513262500266640ustar00rootroot00000000000000DROP TABLE sync_modifier_param; DROP TABLE sync_modifier; CREATE TABLE import_row_modifier ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, property_id INT(10) UNSIGNED NOT NULL, provider_class VARCHAR(72) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE import_row_modifier_settings ( modifier_id INT UNSIGNED NOT NULL, settings_name VARCHAR(64) NOT NULL, settings_value TEXT DEFAULT NULL, PRIMARY KEY (modifier_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_3.sql000066400000000000000000000001531516513262500265640ustar00rootroot00000000000000ALTER TABLE icinga_hostgroup ADD COLUMN object_type ENUM('object', 'template') NOT NULL AFTER display_name;icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_30.sql000066400000000000000000000004041516513262500266430ustar00rootroot00000000000000DROP TABLE import_row_modifier_settings; CREATE TABLE import_row_modifier_setting ( modifier_id INT UNSIGNED NOT NULL, setting_name VARCHAR(64) NOT NULL, setting_value TEXT DEFAULT NULL, PRIMARY KEY (modifier_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_31.sql000066400000000000000000000001151516513262500266430ustar00rootroot00000000000000ALTER TABLE director_generated_file MODIFY content MEDIUMTEXT DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_32.sql000066400000000000000000000001121516513262500266410ustar00rootroot00000000000000ALTER TABLE import_source_setting MODIFY setting_value TEXT DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_33.sql000066400000000000000000000006051516513262500266510ustar00rootroot00000000000000CREATE TABLE director_datafield_setting ( datafield_id INT(10) UNSIGNED NOT NULL, setting_name VARCHAR(64) NOT NULL, setting_value TEXT NOT NULL, PRIMARY KEY (datafield_id, setting_name), CONSTRAINT datafield_id_settings FOREIGN KEY datafield (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_34.sql000066400000000000000000000002271516513262500266520ustar00rootroot00000000000000ALTER TABLE icinga_host_field MODIFY is_required ENUM('y', 'n') NOT NULL; ALTER TABLE icinga_service_field MODIFY is_required ENUM('y', 'n') NOT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_35.sql000066400000000000000000000005321516513262500266520ustar00rootroot00000000000000ALTER TABLE icinga_command_argument DROP COLUMN value_format, ADD COLUMN argument_format ENUM('string', 'expression', 'json') NOT NULL DEFAULT 'string' AFTER argument_value; ALTER TABLE icinga_command_argument DEFAULT COLLATE utf8_bin; ALTER TABLE icinga_command_argument MODIFY COLUMN argument_name VARCHAR(64) DEFAULT NULL COLLATE utf8_bin; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_36.sql000066400000000000000000000003521516513262500266530ustar00rootroot00000000000000ALTER TABLE sync_rule MODIFY COLUMN object_type enum('host', 'host_template', 'service', 'service_template', 'command', 'command_template', 'user', 'user_template', 'hostgroup', 'servicegroup', 'usergroup', 'datalistEntry') NOT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_37.sql000066400000000000000000000010741516513262500266560ustar00rootroot00000000000000CREATE TABLE icinga_command_field ( command_id INT(10) UNSIGNED NOT NULL, datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') NOT NULL, PRIMARY KEY (command_id, datafield_id), CONSTRAINT icinga_command_field_command_argument FOREIGN KEY host(command_id) REFERENCES icinga_command_argument (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_command_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_38.sql000066400000000000000000000001651516513262500266570ustar00rootroot00000000000000ALTER TABLE icinga_host ADD COLUMN display_name VARCHAR(255) DEFAULT NULL, ADD INDEX search_idx (display_name); icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_39.sql000066400000000000000000000003451516513262500266600ustar00rootroot00000000000000ALTER TABLE director_deployment_log MODIFY COLUMN startup_log TEXT DEFAULT NULL, ADD COLUMN stage_name VARCHAR(64) DEFAULT NULL AFTER duration_dump, ADD COLUMN stage_collected ENUM('y', 'n') DEFAULT NULL AFTER stage_name; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_4.sql000066400000000000000000000001561516513262500265700ustar00rootroot00000000000000ALTER TABLE icinga_servicegroup ADD COLUMN object_type ENUM('object', 'template') NOT NULL AFTER display_name;icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_40.sql000066400000000000000000000006001516513262500266420ustar00rootroot00000000000000 ALTER TABLE director_deployment_log ADD COLUMN config_checksum VARBINARY(20) DEFAULT NULL AFTER config_id; ALTER TABLE director_deployment_log DROP COLUMN config_id; ALTER TABLE director_deployment_log ADD CONSTRAINT config_checksum FOREIGN KEY config_checksum (config_checksum) REFERENCES director_generated_config (checksum) ON DELETE SET NULL ON UPDATE RESTRICT; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_41.sql000066400000000000000000000011231516513262500266440ustar00rootroot00000000000000DROP TABLE icinga_command_field; CREATE TABLE icinga_command_field ( command_id INT(10) UNSIGNED NOT NULL, datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') NOT NULL, PRIMARY KEY (command_id, datafield_id), CONSTRAINT icinga_command_field_command FOREIGN KEY command_id (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_command_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_42.sql000066400000000000000000000003561516513262500266540ustar00rootroot00000000000000ALTER TABLE import_run DROP FOREIGN KEY import_run_source; ALTER TABLE import_run ADD CONSTRAINT import_run_source FOREIGN KEY import_source (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE RESTRICT; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_43.sql000066400000000000000000000005431516513262500266530ustar00rootroot00000000000000CREATE TABLE icinga_service_assignment ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, service_id INT(10) UNSIGNED NOT NULL, filter_string TEXT NOT NULL, PRIMARY KEY (id), CONSTRAINT icinga_service_assignment FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_44.sql000066400000000000000000000001231516513262500266460ustar00rootroot00000000000000ALTER TABLE imported_property MODIFY property_value MEDIUMTEXT NULL DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_45.sql000066400000000000000000000001611516513262500266510ustar00rootroot00000000000000ALTER TABLE icinga_command_argument MODIFY argument_format ENUM('string','expression','json') NULL DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_46.sql000066400000000000000000000001721516513262500266540ustar00rootroot00000000000000ALTER TABLE icinga_command_argument MODIFY argument_name VARCHAR(64) COLLATE utf8_bin DEFAULT NULL COMMENT '-x, --host'; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_47.sql000066400000000000000000000001461516513262500266560ustar00rootroot00000000000000ALTER TABLE icinga_command_argument DROP INDEX sort_idx, ADD INDEX sort_idx (command_id, sort_order); icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_48.sql000066400000000000000000000001431516513262500266540ustar00rootroot00000000000000ALTER TABLE icinga_zone MODIFY object_type ENUM('object', 'template', 'external_object') NOT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_49.sql000066400000000000000000000001201516513262500266500ustar00rootroot00000000000000ALTER TABLE director_deployment_log MODIFY stage_name VARCHAR(96) DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_5.sql000066400000000000000000000001461516513262500265700ustar00rootroot00000000000000ALTER TABLE icinga_usergroup ADD COLUMN object_type ENUM('object', 'template') NOT NULL AFTER zone_id;icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_50.sql000066400000000000000000000001201516513262500266400ustar00rootroot00000000000000ALTER TABLE director_deployment_log MODIFY startup_log MEDIUMTEXT DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_51.sql000066400000000000000000000003701516513262500266500ustar00rootroot00000000000000ALTER TABLE sync_rule MODIFY object_type enum('host', 'host_template', 'service', 'service_template', 'command', 'command_template', 'user', 'user_template', 'hostgroup', 'servicegroup', 'usergroup', 'datalistEntry', 'endpoint', 'zone') NOT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_52.sql000066400000000000000000000003571516513262500266560ustar00rootroot00000000000000ALTER TABLE icinga_endpoint MODIFY object_type ENUM('object', 'template', 'external_object') NOT NULL, ADD COLUMN host VARCHAR(255) DEFAULT NULL COMMENT 'IP address / hostname of remote node' AFTER object_name, DROP column address; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_53.sql000066400000000000000000000004411516513262500266510ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN host_id INT(10) UNSIGNED DEFAULT NULL AFTER display_name, ADD UNIQUE KEY object_key (object_name, host_id), ADD CONSTRAINT icinga_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE SET NULL ON UPDATE CASCADE; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_54.sql000066400000000000000000000001721516513262500266530ustar00rootroot00000000000000ALTER TABLE director_generated_config_file MODIFY file_path VARCHAR(128) NOT NULL COMMENT 'e.g. zones/nafta/hosts.conf'; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_55.sql000066400000000000000000000004371516513262500266600ustar00rootroot00000000000000ALTER TABLE icinga_zone DROP FOREIGN KEY icinga_zone_parent_zone, CHANGE parent_zone_id parent_id INT(10) UNSIGNED DEFAULT NULL, ADD CONSTRAINT icinga_zone_parent FOREIGN KEY parent_zone (parent_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_56.sql000066400000000000000000000006471516513262500266640ustar00rootroot00000000000000ALTER TABLE director_generated_file ADD COLUMN cnt_object INT(10) UNSIGNED NOT NULL DEFAULT 0, ADD COLUMN cnt_template INT(10) UNSIGNED NOT NULL DEFAULT 0; UPDATE director_generated_file SET cnt_object = ROUND( (LENGTH(content) - LENGTH( REPLACE(content, 'object ', '') ) ) / LENGTH('object ') ), cnt_template = ROUND( (LENGTH(content) - LENGTH( REPLACE(content, 'template ', '') ) ) / LENGTH('template ') ); icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_57.sql000066400000000000000000000011561516513262500266610ustar00rootroot00000000000000 CREATE TABLE icinga_apiuser ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, object_name VARCHAR(255) NOT NULL, object_type ENUM('object', 'template', 'external_object') NOT NULL, password VARCHAR(255) DEFAULT NULL, client_dn VARCHAR(64) DEFAULT NULL, permissions TEXT DEFAULT NULL COMMENT 'JSON-encoded permissions', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE icinga_endpoint ADD COLUMN apiuser_id INT(10) UNSIGNED DEFAULT NULL, ADD CONSTRAINT icinga_apiuser FOREIGN KEY apiuser (apiuser_id) REFERENCES icinga_apiuser (id) ON DELETE RESTRICT ON UPDATE CASCADE; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_58.sql000066400000000000000000000003051516513262500266550ustar00rootroot00000000000000ALTER TABLE icinga_host ADD COLUMN has_agent ENUM('y', 'n') DEFAULT NULL, ADD COLUMN master_should_connect ENUM('y', 'n') DEFAULT NULL, ADD COLUMN accept_config ENUM('y', 'n') DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_59.sql000066400000000000000000000001301516513262500266520ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN use_agent ENUM('y', 'n') NOT NULL DEFAULT 'n'; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_6.sql000066400000000000000000000003351516513262500265710ustar00rootroot00000000000000ALTER TABLE icinga_endpoint MODIFY zone_id INT(10) UNSIGNED DEFAULT NULL, MODIFY port SMALLINT UNSIGNED DEFAULT NULL COMMENT '5665 if not set', MODIFY log_duration VARCHAR(32) DEFAULT NULL COMMENT '1d if not set'; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_60.sql000066400000000000000000000001211516513262500266420ustar00rootroot00000000000000ALTER TABLE icinga_service MODIFY COLUMN use_agent ENUM('y', 'n') DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_61.sql000066400000000000000000000001311516513262500266440ustar00rootroot00000000000000ALTER TABLE icinga_host DROP KEY object_name, ADD UNIQUE KEY object_name (object_name); icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_62.sql000066400000000000000000000000751516513262500266540ustar00rootroot00000000000000ALTER TABLE icinga_command MODIFY command TEXT DEFAULT NULL; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_7.sql000066400000000000000000000000621516513262500265670ustar00rootroot00000000000000ALTER TABLE icinga_service DROP INDEX object_name;icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_8.sql000066400000000000000000000026161516513262500265770ustar00rootroot00000000000000DROP TABLE director_generated_config_file; DROP TABLE director_generated_config; CREATE TABLE director_generated_config ( checksum VARBINARY(20) NOT NULL COMMENT 'SHA1(last_activity_checksum;file_path=checksum;file_path=checksum;...)', director_version VARCHAR(64) DEFAULT NULL, director_db_version INT(10) DEFAULT NULL, duration INT(10) UNSIGNED DEFAULT NULL COMMENT 'Config generation duration (ms)', last_activity_checksum VARBINARY(20) NOT NULL, PRIMARY KEY (checksum), CONSTRAINT director_generated_config_activity FOREIGN KEY activity_checksum (last_activity_checksum) REFERENCES director_activity_log (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_generated_config_file ( config_checksum VARBINARY(20) NOT NULL, file_checksum VARBINARY(20) NOT NULL, file_path VARCHAR(64) NOT NULL COMMENT 'e.g. zones/nafta/hosts.conf', CONSTRAINT director_generated_config_file_config FOREIGN KEY config (config_checksum) REFERENCES director_generated_config (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT director_generated_config_file_file FOREIGN KEY checksum (file_checksum) REFERENCES director_generated_file (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT, PRIMARY KEY (config_checksum, file_path), INDEX search_idx (file_checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; icingaweb2-module-director-1.11.8/schema/mysql-legacy-changes/upgrade_9.sql000066400000000000000000000001111516513262500265640ustar00rootroot00000000000000ALTER TABLE icinga_command MODIFY timeout SMALLINT UNSIGNED DEFAULT NULL;icingaweb2-module-director-1.11.8/schema/mysql-migrations/000077500000000000000000000000001516513262500234755ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_100.sql000066400000000000000000000003151516513262500262240ustar00rootroot00000000000000ALTER TABLE import_row_modifier ADD COLUMN target_property VARCHAR(255) DEFAULT NULL AFTER property_name; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (100, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_101.sql000066400000000000000000000003401516513262500262230ustar00rootroot00000000000000ALTER TABLE icinga_host ADD COLUMN api_key VARCHAR(40) DEFAULT NULL AFTER accept_config, ADD UNIQUE KEY api_key (api_key); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (101, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_102.sql000066400000000000000000000005751516513262500262360ustar00rootroot00000000000000UPDATE director_deployment_log SET startup_log = LEFT(startup_log, 20480) || ' [..] shortened ' || (LENGTH(startup_log) - 40960) || ' bytes by Director on schema upgrade [..] ' || RIGHT(startup_log, 20480) WHERE LENGTH(startup_log) > 61440; OPTIMIZE TABLE director_deployment_log; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (102, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_103.sql000066400000000000000000000005201516513262500262250ustar00rootroot00000000000000UPDATE icinga_command_argument SET argument_name = '(no key)', skip_key = 'y' WHERE argument_name IS NULL; ALTER TABLE icinga_command_argument MODIFY argument_name VARCHAR(64) COLLATE utf8_bin NOT NULL COMMENT '-x, --host'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (103, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_104.sql000066400000000000000000000011201516513262500262230ustar00rootroot00000000000000ALTER TABLE icinga_timeperiod_range ADD COLUMN range_key VARCHAR(255) NOT NULL COMMENT 'monday, ...', ADD COLUMN range_value VARCHAR(255) NOT NULL COMMENT '00:00-24:00, ...'; UPDATE icinga_timeperiod_range SET range_key = timeperiod_key, range_value = timeperiod_value; ALTER TABLE icinga_timeperiod_range DROP PRIMARY KEY, ADD PRIMARY KEY (timeperiod_id, range_type, range_key); ALTER TABLE icinga_timeperiod_range DROP COLUMN timeperiod_key, DROP COLUMN timeperiod_value; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (104, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_105.sql000066400000000000000000000002701516513262500262310ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN use_var_overrides ENUM('y', 'n') DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (105, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_107.sql000066400000000000000000000003571516513262500262410ustar00rootroot00000000000000ALTER TABLE director_job MODIFY last_error_message TEXT DEFAULT NULL; ALTER TABLE sync_rule MODIFY last_error_message TEXT DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (107, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_108.sql000066400000000000000000000010771516513262500262420ustar00rootroot00000000000000ALTER TABLE icinga_command_var MODIFY COLUMN varname VARCHAR(255) NOT NULL COLLATE utf8_bin; ALTER TABLE icinga_host_var MODIFY COLUMN varname VARCHAR(255) NOT NULL COLLATE utf8_bin; ALTER TABLE icinga_service_var MODIFY COLUMN varname VARCHAR(255) NOT NULL COLLATE utf8_bin; ALTER TABLE icinga_user_var MODIFY COLUMN varname VARCHAR(255) NOT NULL COLLATE utf8_bin; ALTER TABLE icinga_notification_var MODIFY COLUMN varname VARCHAR(255) NOT NULL COLLATE utf8_bin; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (108, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_109.sql000066400000000000000000000010121516513262500262300ustar00rootroot00000000000000CREATE TABLE icinga_hostgroup_assignment ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, hostgroup_id INT(10) UNSIGNED NOT NULL, filter_string TEXT NOT NULL, assign_type ENUM('assign', 'ignore') NOT NULL DEFAULT 'assign', PRIMARY KEY (id), CONSTRAINT icinga_hostgroup_assignment FOREIGN KEY hostgroup (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (109, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_110.sql000066400000000000000000000046101516513262500262270ustar00rootroot00000000000000UPDATE icinga_host_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_host_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_service_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_service_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_command_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_command_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_user_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_user_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_notification_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_notification_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (110, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_112.sql000066400000000000000000000003101516513262500262220ustar00rootroot00000000000000ALTER TABLE director_datalist_entry MODIFY COLUMN entry_name VARCHAR(255) COLLATE utf8_bin NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (112, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_114.sql000066400000000000000000000035561516513262500262430ustar00rootroot00000000000000CREATE TABLE icinga_service_set ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, object_name VARCHAR(128) NOT NULL, object_type ENUM('object', 'template', 'external_object') NOT NULL, host_id INT(10) UNSIGNED DEFAULT NULL, description TEXT NOT NULL, PRIMARY KEY (id), UNIQUE KEY object_key (object_name, host_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_set_service ( service_set_id INT(10) UNSIGNED NOT NULL, service_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (service_set_id, service_id), CONSTRAINT service_set_set FOREIGN KEY service_set (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT service_set_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_set_assignment ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, service_set_id INT(10) UNSIGNED NOT NULL, filter_string TEXT NOT NULL, assign_type ENUM('assign', 'ignore') NOT NULL DEFAULT 'assign', PRIMARY KEY (id), CONSTRAINT icinga_service_set_assignment FOREIGN KEY service_set (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_service_set_var ( service_set_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, varvalue TEXT DEFAULT NULL, format ENUM('string', 'expression', 'json') NOT NULL DEFAULT 'string', PRIMARY KEY (service_set_id, varname), CONSTRAINT icinga_service_set_var_service FOREIGN KEY command (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (114, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_115.sql000066400000000000000000000015051516513262500262340ustar00rootroot00000000000000CREATE TABLE icinga_service_set_inheritance ( service_set_id INT(10) UNSIGNED NOT NULL, parent_service_set_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (service_set_id, parent_service_set_id), UNIQUE KEY unique_order (service_set_id, weight), CONSTRAINT icinga_service_set_inheritance_set FOREIGN KEY host (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_set_inheritance_parent FOREIGN KEY host (parent_service_set_id) REFERENCES icinga_service_set (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE icinga_service_set MODIFY description TEXT DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (115, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_116.sql000066400000000000000000000005041516513262500262330ustar00rootroot00000000000000ALTER TABLE sync_rule MODIFY object_type enum( 'host', 'service', 'command', 'user', 'hostgroup', 'servicegroup', 'usergroup', 'datalistEntry', 'endpoint', 'zone', 'timePeriod', 'serviceSet' ) NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (116, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_117.sql000066400000000000000000000013441516513262500262370ustar00rootroot00000000000000CREATE TABLE icinga_notification_field ( notification_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') NOT NULL, PRIMARY KEY (notification_id, datafield_id), CONSTRAINT icinga_notification_field_notification FOREIGN KEY notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (117, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_119.sql000066400000000000000000000002761516513262500262440ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN apply_for VARCHAR(255) DEFAULT NULL AFTER use_agent; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (119, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_120.sql000066400000000000000000000142231516513262500262310ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN assign_filter TEXT DEFAULT NULL; UPDATE icinga_service s JOIN ( SELECT service_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa.filter_string ELSE GROUP_CONCAT(sa.filter_string SEPARATOR '&') END AS filter_string FROM ( SELECT sa_not.service_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa_not.filter_string ELSE '(' || GROUP_CONCAT(sa_not.filter_string SEPARATOR '&') || ')' END AS filter_string FROM ( SELECT sa.service_id, '!' || sa.filter_string AS filter_string FROM icinga_service_assignment sa WHERE assign_type = 'ignore' ) sa_not GROUP BY service_id UNION ALL SELECT sa_yes.service_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa_yes.filter_string ELSE '(' || GROUP_CONCAT(sa_yes.filter_string SEPARATOR '|') || ')' END AS filter_string FROM ( SELECT sa.service_id, sa.filter_string AS filter_string FROM icinga_service_assignment sa WHERE assign_type = 'assign' ) sa_yes GROUP BY service_id ) sa GROUP BY service_id ) flat_assign ON s.id = flat_assign.service_id SET s.assign_filter = flat_assign.filter_string; DROP TABLE icinga_service_assignment; ALTER TABLE icinga_service_set ADD COLUMN assign_filter TEXT DEFAULT NULL; UPDATE icinga_service_set s JOIN ( SELECT service_set_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa.filter_string ELSE GROUP_CONCAT(sa.filter_string SEPARATOR '&') END AS filter_string FROM ( SELECT sa_not.service_set_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa_not.filter_string ELSE '(' || GROUP_CONCAT(sa_not.filter_string SEPARATOR '&') || ')' END AS filter_string FROM ( SELECT sa.service_set_id, '!' || sa.filter_string AS filter_string FROM icinga_service_set_assignment sa WHERE assign_type = 'ignore' ) sa_not GROUP BY service_set_id UNION ALL SELECT sa_yes.service_set_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa_yes.filter_string ELSE '(' || GROUP_CONCAT(sa_yes.filter_string SEPARATOR '|') || ')' END AS filter_string FROM ( SELECT sa.service_set_id, sa.filter_string AS filter_string FROM icinga_service_set_assignment sa WHERE assign_type = 'assign' ) sa_yes GROUP BY service_set_id ) sa GROUP BY service_set_id ) flat_assign ON s.id = flat_assign.service_set_id SET s.assign_filter = flat_assign.filter_string; DROP TABLE icinga_service_set_assignment; ALTER TABLE icinga_notification ADD COLUMN assign_filter TEXT DEFAULT NULL; UPDATE icinga_notification s JOIN ( SELECT notification_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa.filter_string ELSE GROUP_CONCAT(sa.filter_string SEPARATOR '&') END AS filter_string FROM ( SELECT sa_not.notification_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa_not.filter_string ELSE '(' || GROUP_CONCAT(sa_not.filter_string SEPARATOR '&') || ')' END AS filter_string FROM ( SELECT sa.notification_id, '!' || sa.filter_string AS filter_string FROM icinga_notification_assignment sa WHERE assign_type = 'ignore' ) sa_not GROUP BY notification_id UNION ALL SELECT sa_yes.notification_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa_yes.filter_string ELSE '(' || GROUP_CONCAT(sa_yes.filter_string SEPARATOR '|') || ')' END AS filter_string FROM ( SELECT sa.notification_id, sa.filter_string AS filter_string FROM icinga_notification_assignment sa WHERE assign_type = 'assign' ) sa_yes GROUP BY notification_id ) sa GROUP BY notification_id ) flat_assign ON s.id = flat_assign.notification_id SET s.assign_filter = flat_assign.filter_string; DROP TABLE icinga_notification_assignment; ALTER TABLE icinga_hostgroup ADD COLUMN assign_filter TEXT DEFAULT NULL; UPDATE icinga_hostgroup s JOIN ( SELECT hostgroup_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa.filter_string ELSE GROUP_CONCAT(sa.filter_string SEPARATOR '&') END AS filter_string FROM ( SELECT sa_not.hostgroup_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa_not.filter_string ELSE '(' || GROUP_CONCAT(sa_not.filter_string SEPARATOR '&') || ')' END AS filter_string FROM ( SELECT sa.hostgroup_id, '!' || sa.filter_string AS filter_string FROM icinga_hostgroup_assignment sa WHERE assign_type = 'ignore' ) sa_not GROUP BY hostgroup_id UNION ALL SELECT sa_yes.hostgroup_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN sa_yes.filter_string ELSE '(' || GROUP_CONCAT(sa_yes.filter_string SEPARATOR '|') || ')' END AS filter_string FROM ( SELECT sa.hostgroup_id, sa.filter_string AS filter_string FROM icinga_hostgroup_assignment sa WHERE assign_type = 'assign' ) sa_yes GROUP BY hostgroup_id ) sa GROUP BY hostgroup_id ) flat_assign ON s.id = flat_assign.hostgroup_id SET s.assign_filter = flat_assign.filter_string; DROP TABLE icinga_hostgroup_assignment; ALTER TABLE icinga_servicegroup ADD COLUMN assign_filter TEXT DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (120, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_121.sql000066400000000000000000000003551516513262500262330ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN service_set_id INT(10) UNSIGNED DEFAULT NULL AFTER host_id; DROP TABLE icinga_service_set_service; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (121, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_122.sql000066400000000000000000000005201516513262500262260ustar00rootroot00000000000000ALTER TABLE director_generated_file ADD COLUMN cnt_apply INT(10) UNSIGNED NOT NULL DEFAULT 0; UPDATE director_generated_file SET cnt_apply = ROUND( (LENGTH(content) - LENGTH( REPLACE(content, 'apply ', '') ) ) / LENGTH('apply ') ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (122, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_123.sql000066400000000000000000000016271516513262500262400ustar00rootroot00000000000000-- cleanup dangling service_set before we add foreign key DELETE ss FROM icinga_service_set AS ss LEFT JOIN icinga_host AS h ON h.id = ss.host_id WHERE ss.object_type = 'object' AND ss.host_id IS NOT NULL AND h.id IS NULL; -- cleanup dangling services to service_set DELETE s FROM icinga_service AS s LEFT JOIN icinga_service_set AS ss ON ss.id = s.service_set_id WHERE s.object_type IN ('object', 'apply') AND s.service_set_id IS NOT NULL AND ss.id IS NULL; ALTER TABLE icinga_service_set ADD FOREIGN KEY icinga_service_set_host (host_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE icinga_service ADD FOREIGN KEY icinga_service_service_set (service_set_id) REFERENCES icinga_service_set (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (123, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_124.sql000066400000000000000000000001401516513262500262260ustar00rootroot00000000000000INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (124, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_125.sql000066400000000000000000000007401516513262500262350ustar00rootroot00000000000000ALTER TABLE icinga_command_field ADD COLUMN var_filter TEXT DEFAULT NULL; ALTER TABLE icinga_host_field ADD COLUMN var_filter TEXT DEFAULT NULL; ALTER TABLE icinga_notification_field ADD COLUMN var_filter TEXT DEFAULT NULL; ALTER TABLE icinga_service_field ADD COLUMN var_filter TEXT DEFAULT NULL; ALTER TABLE icinga_user_field ADD COLUMN var_filter TEXT DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (125, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_126.sql000066400000000000000000000124301516513262500262350ustar00rootroot00000000000000SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT * FROM information_schema.table_constraints WHERE table_schema = DATABASE() AND table_name = 'icinga_service_set' AND constraint_name = 'icinga_service_set_host' )), 'ALTER TABLE icinga_service_set DROP FOREIGN KEY icinga_service_set_host', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT * FROM information_schema.table_constraints WHERE table_schema = DATABASE() AND table_name = 'icinga_service_set' AND constraint_name = 'icinga_service_set_ibfk_1' )), 'ALTER TABLE icinga_service_set DROP FOREIGN KEY icinga_service_set_ibfk_1', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT * FROM information_schema.table_constraints WHERE table_schema = DATABASE() AND table_name = 'icinga_service_set' AND constraint_name = 'icinga_service_set_ibfk_2' )), 'ALTER TABLE icinga_service_set DROP FOREIGN KEY icinga_service_set_ibfk_2', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT * FROM information_schema.table_constraints WHERE table_schema = DATABASE() AND table_name = 'icinga_service_set' AND constraint_name = 'icinga_service_set_ibfk_3' )), 'ALTER TABLE icinga_service_set DROP FOREIGN KEY icinga_service_set_ibfk_3', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT * FROM information_schema.table_constraints WHERE table_schema = DATABASE() AND table_name = 'icinga_service' AND constraint_name = 'icinga_service_service_set' )), 'ALTER TABLE icinga_service DROP FOREIGN KEY icinga_service_service_set', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT * FROM information_schema.table_constraints WHERE table_schema = DATABASE() AND table_name = 'icinga_service' AND constraint_name = 'icinga_service_ibfk_1' )), 'ALTER TABLE icinga_service DROP FOREIGN KEY icinga_service_ibfk_1', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT 1 FROM information_schema.statistics WHERE table_schema = SCHEMA() AND table_name = 'icinga_service' AND index_name = 'icinga_service_service_set' )), 'ALTER TABLE icinga_service DROP INDEX icinga_service_service_set', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT 1 FROM information_schema.statistics WHERE table_schema = SCHEMA() AND table_name = 'icinga_service_set' AND index_name = 'icinga_service_set_ibfk_1' )), 'ALTER TABLE icinga_service_set DROP INDEX icinga_service_set_ibfk_1', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT 1 FROM information_schema.statistics WHERE table_schema = SCHEMA() AND table_name = 'icinga_service_set' AND index_name = 'icinga_service_set_host' )), 'ALTER TABLE icinga_service_set DROP INDEX icinga_service_set_host', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT 1 FROM information_schema.statistics WHERE table_schema = SCHEMA() AND table_name = 'icinga_service' AND index_name = 'icinga_service_ibfk_1' )), 'ALTER TABLE icinga_service_set DROP INDEX icinga_service_ibfk_1', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; SET @stmt = (SELECT IF( (SELECT EXISTS( SELECT 1 FROM information_schema.statistics WHERE table_schema = SCHEMA() AND table_name = 'icinga_service_set' AND index_name = 'icinga_service_set_ibfk_2' )), 'ALTER TABLE icinga_service_set DROP INDEX icinga_service_set_ibfk_2', 'SELECT 1' )); PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @stmt = NULL; ALTER TABLE icinga_service_set ADD CONSTRAINT icinga_service_set_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE icinga_service ADD CONSTRAINT icinga_service_service_set FOREIGN KEY service_set (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (126, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_127.sql000066400000000000000000000120241516513262500262350ustar00rootroot00000000000000ALTER TABLE icinga_command_var ADD COLUMN checksum VARBINARY(20) DEFAULT NULL AFTER command_id, ADD INDEX search_idx (varname), ADD INDEX checksum (checksum); ALTER TABLE icinga_host_var ADD COLUMN checksum VARBINARY(20) DEFAULT NULL AFTER host_id, ADD INDEX checksum (checksum); ALTER TABLE icinga_notification_var ADD COLUMN checksum VARBINARY(20) DEFAULT NULL AFTER notification_id, ADD INDEX checksum (checksum); ALTER TABLE icinga_service_set_var ADD COLUMN checksum VARBINARY(20) DEFAULT NULL AFTER service_set_id, ADD INDEX search_idx (varname), ADD INDEX checksum (checksum); ALTER TABLE icinga_service_var ADD COLUMN checksum VARBINARY(20) DEFAULT NULL AFTER service_id, ADD INDEX checksum (checksum); ALTER TABLE icinga_user_var ADD COLUMN checksum VARBINARY(20) DEFAULT NULL AFTER user_id, ADD INDEX checksum (checksum); CREATE TABLE icinga_var ( checksum VARBINARY(20) NOT NULL, rendered_checksum VARBINARY(20) NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, varvalue TEXT NOT NULL, rendered TEXT NOT NULL, PRIMARY KEY (checksum), INDEX search_idx (varname) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_flat_var ( var_checksum VARBINARY(20) NOT NULL, flatname_checksum VARBINARY(20) NOT NULL, flatname VARCHAR(512) NOT NULL COLLATE utf8_bin, flatvalue TEXT NOT NULL, PRIMARY KEY (var_checksum, flatname_checksum), INDEX search_varname (flatname (191)), INDEX search_varvalue (flatvalue (128)), CONSTRAINT flat_var_var FOREIGN KEY checksum (var_checksum) REFERENCES icinga_var (checksum) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_command_resolved_var ( command_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (command_id, checksum), INDEX search_varname (varname), CONSTRAINT command_resolved_var_command FOREIGN KEY command (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT command_resolved_var_checksum FOREIGN KEY checksum (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_host_resolved_var ( host_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (host_id, checksum), INDEX search_varname (varname), FOREIGN KEY host_resolved_var_host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY host_resolved_var_checksum (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification_resolved_var ( notification_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (notification_id, checksum), INDEX search_varname (varname), FOREIGN KEY notification_resolved_var_notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY notification_resolved_var_checksum (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_set_resolved_var ( service_set_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (service_set_id, checksum), INDEX search_varname (varname), FOREIGN KEY service_set_resolved_var_service_set (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY service_set_resolved_var_checksum(checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_resolved_var ( service_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (service_id, checksum), INDEX search_varname (varname), FOREIGN KEY service_resolve_var_service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY service_resolve_var_checksum(checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_user_resolved_var ( user_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (user_id, checksum), INDEX search_varname (varname), FOREIGN KEY user_resolve_var_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY user_resolve_var_checksum(checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (127, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_128.sql000066400000000000000000000002471516513262500262420ustar00rootroot00000000000000ALTER TABLE director_activity_log ADD INDEX search_author (author); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (128, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_129.sql000066400000000000000000000003111516513262500262330ustar00rootroot00000000000000ALTER TABLE director_datafield MODIFY COLUMN varname VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_bin; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (129, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_130.sql000066400000000000000000000003071516513262500262300ustar00rootroot00000000000000ALTER TABLE icinga_hostgroup MODIFY object_type enum('object', 'template', 'external_object') NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (130, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_131.sql000066400000000000000000000011541516513262500262320ustar00rootroot00000000000000CREATE TABLE icinga_hostgroup_host_resolved ( hostgroup_id INT(10) UNSIGNED NOT NULL, host_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (hostgroup_id, host_id), CONSTRAINT icinga_hostgroup_host_resolved_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_host_resolved_hostgroup FOREIGN KEY hostgroup (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (131, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_132.sql000066400000000000000000000013051516513262500262310ustar00rootroot00000000000000CREATE TABLE icinga_host_template_choice ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, object_name VARCHAR(64) NOT NULL, description TEXT DEFAULT NULL, min_required SMALLINT UNSIGNED NOT NULL DEFAULT 0, max_allowed SMALLINT UNSIGNED NOT NULL DEFAULT 1, PRIMARY KEY (id), UNIQUE KEY (object_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE icinga_host ADD COLUMN template_choice_id INT(10) UNSIGNED DEFAULT NULL, ADD CONSTRAINT icinga_host_template_choice FOREIGN KEY choice (template_choice_id) REFERENCES icinga_host_template_choice (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (132, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_133.sql000066400000000000000000000013211516513262500262300ustar00rootroot00000000000000CREATE TABLE icinga_service_template_choice ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, object_name VARCHAR(64) NOT NULL, description TEXT DEFAULT NULL, min_required SMALLINT UNSIGNED NOT NULL DEFAULT 0, max_allowed SMALLINT UNSIGNED NOT NULL DEFAULT 1, PRIMARY KEY (id), UNIQUE KEY (object_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE icinga_service ADD COLUMN template_choice_id INT(10) UNSIGNED DEFAULT NULL, ADD CONSTRAINT icinga_service_template_choice FOREIGN KEY choice (template_choice_id) REFERENCES icinga_service_template_choice (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (133, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_134.sql000066400000000000000000000011741516513262500262370ustar00rootroot00000000000000ALTER TABLE icinga_host DROP FOREIGN KEY icinga_host_template_choice, ADD CONSTRAINT icinga_host_template_choice_v2 FOREIGN KEY template_choice (template_choice_id) REFERENCES icinga_host_template_choice (id) ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE icinga_service DROP FOREIGN KEY icinga_service_template_choice, ADD CONSTRAINT icinga_service_template_choice_v2 FOREIGN KEY template_choice (template_choice_id) REFERENCES icinga_service_template_choice (id) ON DELETE SET NULL ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (134, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_135.sql000066400000000000000000000004611516513262500262360ustar00rootroot00000000000000ALTER TABLE icinga_host ADD COLUMN check_timeout SMALLINT UNSIGNED DEFAULT NULL AFTER retry_interval; ALTER TABLE icinga_service ADD COLUMN check_timeout SMALLINT UNSIGNED DEFAULT NULL AFTER retry_interval; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (135, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_136.sql000066400000000000000000000002671516513262500262430ustar00rootroot00000000000000ALTER TABLE director_datalist_entry ADD COLUMN allowed_roles VARCHAR(255) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (136, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_137.sql000066400000000000000000000003461516513262500262420ustar00rootroot00000000000000ALTER TABLE import_source ADD COLUMN description TEXT DEFAULT NULL; ALTER TABLE sync_rule ADD COLUMN description TEXT DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (137, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_138.sql000066400000000000000000000002551516513262500262420ustar00rootroot00000000000000ALTER TABLE import_row_modifier ADD COLUMN description TEXT DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (138, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_139.sql000066400000000000000000000003411516513262500262370ustar00rootroot00000000000000UPDATE import_row_modifier SET priority = id; ALTER TABLE import_row_modifier ADD UNIQUE INDEX idx_prio (source_id, priority); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (139, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_140.sql000066400000000000000000000002271516513262500262320ustar00rootroot00000000000000UPDATE sync_property SET priority = 10000 - priority; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (140, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_141.sql000066400000000000000000000003161516513262500262320ustar00rootroot00000000000000UPDATE icinga_service_set SET object_type = 'template' WHERE object_type = 'object' AND host_id IS NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (141, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_143.sql000066400000000000000000000014371516513262500262410ustar00rootroot00000000000000ALTER TABLE icinga_host_template_choice ADD COLUMN required_template_id INT(10) UNSIGNED DEFAULT NULL, ADD COLUMN allowed_roles VARCHAR(255) DEFAULT NULL, ADD CONSTRAINT host_template_choice_required_template FOREIGN KEY required_template (required_template_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE icinga_service_template_choice ADD COLUMN required_template_id INT(10) UNSIGNED DEFAULT NULL, ADD COLUMN allowed_roles VARCHAR(255) DEFAULT NULL, ADD CONSTRAINT service_template_choice_required_template FOREIGN KEY required_template (required_template_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (143, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_144.sql000066400000000000000000000062401516513262500262370ustar00rootroot00000000000000CREATE TABLE icinga_dependency ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', apply_to ENUM('host', 'service') DEFAULT NULL, parent_host_id INT(10) UNSIGNED DEFAULT NULL, parent_service_id INT(10) UNSIGNED DEFAULT NULL, child_host_id INT(10) UNSIGNED DEFAULT NULL, child_service_id INT(10) UNSIGNED DEFAULT NULL, disable_checks ENUM('y', 'n') DEFAULT NULL, disable_notifications ENUM('y', 'n') DEFAULT NULL, ignore_soft_states ENUM('y', 'n') DEFAULT NULL, period_id INT(10) UNSIGNED DEFAULT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, assign_filter TEXT DEFAULT NULL, parent_service_by_name VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_dependency_parent_host FOREIGN KEY parent_host (parent_host_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_parent_service FOREIGN KEY parent_service (parent_service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_child_host FOREIGN KEY child_host (child_host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_child_service FOREIGN KEY child_service (child_service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_period FOREIGN KEY period (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_dependency_inheritance ( dependency_id INT(10) UNSIGNED NOT NULL, parent_dependency_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (dependency_id, parent_dependency_id), UNIQUE KEY unique_order (dependency_id, weight), CONSTRAINT icinga_dependency_inheritance_dependency FOREIGN KEY dependency (dependency_id) REFERENCES icinga_dependency (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_inheritance_parent_dependency FOREIGN KEY parent_dependency (parent_dependency_id) REFERENCES icinga_dependency (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_dependency_states_set ( dependency_id INT(10) UNSIGNED NOT NULL, property ENUM( 'OK', 'Warning', 'Critical', 'Unknown', 'Up', 'Down' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (dependency_id, property, merge_behaviour), CONSTRAINT icinga_dependency_states_set_dependency FOREIGN KEY icinga_dependency (dependency_id) REFERENCES icinga_dependency (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (144, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_145.sql000066400000000000000000000002731516513262500262400ustar00rootroot00000000000000ALTER TABLE import_row_modifier ADD INDEX source_id (source_id), DROP INDEX idx_prio; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (145, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_146.sql000066400000000000000000000007541516513262500262450ustar00rootroot00000000000000ALTER TABLE icinga_host DROP COLUMN flapping_threshold, ADD COLUMN flapping_threshold_high SMALLINT UNSIGNED DEFAULT NULL, ADD COLUMN flapping_threshold_low SMALLINT UNSIGNED DEFAULT NULL; ALTER TABLE icinga_service DROP COLUMN flapping_threshold, ADD COLUMN flapping_threshold_high SMALLINT UNSIGNED DEFAULT NULL, ADD COLUMN flapping_threshold_low SMALLINT UNSIGNED DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (146, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_147.sql000066400000000000000000000010771516513262500262450ustar00rootroot00000000000000CREATE TABLE icinga_host_service_blacklist ( host_id INT(10) UNSIGNED NOT NULL, service_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (host_id, service_id), CONSTRAINT icinga_host_service_bl_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_service_bl_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (147, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_148.sql000066400000000000000000000003731516513262500262440ustar00rootroot00000000000000ALTER TABLE import_source MODIFY provider_class VARCHAR(128) NOT NULL; ALTER TABLE import_row_modifier MODIFY provider_class VARCHAR(128) NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (148, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_149.sql000066400000000000000000000005121516513262500262400ustar00rootroot00000000000000ALTER TABLE icinga_usergroup ADD COLUMN zone_id INT(10) UNSIGNED DEFAULT NULL, ADD CONSTRAINT icinga_usergroup_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (149, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_150.sql000066400000000000000000000006511516513262500262340ustar00rootroot00000000000000UPDATE icinga_user u SET period_id = NULL WHERE NOT EXISTS ( SELECT id FROM icinga_timeperiod WHERE id = u.period_id ) AND u.period_id IS NOT NULL; ALTER TABLE icinga_user ADD CONSTRAINT icinga_user_period FOREIGN KEY period (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (150, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_151.sql000066400000000000000000000022371516513262500262370ustar00rootroot00000000000000ALTER TABLE icinga_timeperiod ADD COLUMN prefer_includes ENUM('y', 'n') DEFAULT NULL; CREATE TABLE icinga_timeperiod_include ( timeperiod_id INT(10) UNSIGNED NOT NULL, include_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (timeperiod_id, include_id), CONSTRAINT icinga_timeperiod_include FOREIGN KEY timeperiod (include_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT icinga_timeperiod_include_timeperiod FOREIGN KEY include (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_timeperiod_exclude ( timeperiod_id INT(10) UNSIGNED NOT NULL, exclude_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (timeperiod_id, exclude_id), CONSTRAINT icinga_timeperiod_exclude FOREIGN KEY timeperiod (exclude_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT icinga_timeperiod_exclude_timeperiod FOREIGN KEY exclude (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (151, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_152.sql000066400000000000000000000003521516513262500262340ustar00rootroot00000000000000ALTER TABLE import_source ADD UNIQUE INDEX source_name (source_name); ALTER TABLE sync_rule ADD UNIQUE INDEX rule_name (rule_name); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (152, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_153.sql000066400000000000000000000025131516513262500262360ustar00rootroot00000000000000CREATE TABLE director_basket ( uuid VARBINARY(16) NOT NULL, basket_name VARCHAR(64) NOT NULL, owner_type ENUM( 'user', 'usergroup', 'role' ) NOT NULL, owner_value VARCHAR(255) NOT NULL, objects MEDIUMTEXT NOT NULL, -- json-encoded PRIMARY KEY (uuid), UNIQUE INDEX basket_name (basket_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; CREATE TABLE director_basket_content ( checksum VARBINARY(20) NOT NULL, summary VARCHAR(255) NOT NULL, -- json content MEDIUMTEXT NOT NULL, -- json PRIMARY KEY (checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; CREATE TABLE director_basket_snapshot ( basket_uuid VARBINARY(16) NOT NULL, ts_create BIGINT(20) NOT NULL, content_checksum VARBINARY(20) NOT NULL, PRIMARY KEY (basket_uuid, ts_create), INDEX sort_idx (ts_create), CONSTRAINT basked_snapshot_basket FOREIGN KEY director_basket_snapshot (basket_uuid) REFERENCES director_basket (uuid) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT basked_snapshot_content FOREIGN KEY content_checksum (content_checksum) REFERENCES director_basket_content (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (153, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_154.sql000066400000000000000000000004111516513262500262320ustar00rootroot00000000000000 UPDATE icinga_command_argument SET argument_format = NULL WHERE argument_value IS NULL; UPDATE icinga_command_argument SET set_if_format = NULL WHERE set_if IS NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (154, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_155.sql000066400000000000000000000012461516513262500262420ustar00rootroot00000000000000CREATE TABLE icinga_servicegroup_service_resolved ( servicegroup_id INT(10) UNSIGNED NOT NULL, service_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (servicegroup_id, service_id), CONSTRAINT icinga_servicegroup_service_resolved_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_service_resolved_servicegroup FOREIGN KEY servicegroup (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (155, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_156.sql000066400000000000000000000003021516513262500262330ustar00rootroot00000000000000ALTER TABLE icinga_command DROP INDEX object_name, ADD UNIQUE INDEX object_name (object_name); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (156, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_157.sql000066400000000000000000000002661516513262500262450ustar00rootroot00000000000000ALTER TABLE director_basket_content MODIFY COLUMN summary VARCHAR(500) NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (157, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_159.sql000066400000000000000000000002601516513262500262410ustar00rootroot00000000000000ALTER TABLE director_generated_file MODIFY COLUMN content LONGTEXT NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (159, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_160.sql000066400000000000000000000002511516513262500262310ustar00rootroot00000000000000ALTER TABLE icinga_command ADD COLUMN is_string enum ('y', 'n') NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (160, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_161.sql000066400000000000000000000045631516513262500262440ustar00rootroot00000000000000CREATE TABLE icinga_scheduled_downtime ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, object_name VARCHAR(255) NOT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, object_type ENUM('object', 'template', 'apply') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', apply_to ENUM('host', 'service') DEFAULT NULL, assign_filter TEXT DEFAULT NULL, author VARCHAR(255) DEFAULT NULL, comment TEXT DEFAULT NULL, fixed ENUM('y', 'n') DEFAULT NULL, duration INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX object_name (object_name), CONSTRAINT icinga_scheduled_downtime_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_scheduled_downtime_inheritance ( scheduled_downtime_id INT(10) UNSIGNED NOT NULL, parent_scheduled_downtime_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (scheduled_downtime_id, parent_scheduled_downtime_id), UNIQUE KEY unique_order (scheduled_downtime_id, weight), CONSTRAINT icinga_scheduled_downtime_inheritance_downtime FOREIGN KEY host (scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_scheduled_downtime_inheritance_parent_downtime FOREIGN KEY host (parent_scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_scheduled_downtime_range ( scheduled_downtime_id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, range_key VARCHAR(255) NOT NULL COMMENT 'monday, ...', range_value VARCHAR(255) NOT NULL COMMENT '00:00-24:00, ...', range_type ENUM('include', 'exclude') NOT NULL DEFAULT 'include' COMMENT 'include -> ranges {}, exclude ranges_ignore {} - not yet', merge_behaviour ENUM('set', 'add', 'substract') NOT NULL DEFAULT 'set' COMMENT 'set -> = {}, add -> += {}, substract -> -= {}', PRIMARY KEY (scheduled_downtime_id, range_type, range_key), CONSTRAINT icinga_scheduled_downtime_range_downtime FOREIGN KEY scheduled_downtime (scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (161, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_162.sql000066400000000000000000000003041516513262500262320ustar00rootroot00000000000000ALTER TABLE icinga_scheduled_downtime ADD COLUMN with_services ENUM('y', 'n') NULL DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (162, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_163.sql000066400000000000000000000024541516513262500262430ustar00rootroot00000000000000-- when applying manually make sure to set a sensible timezone for your users -- otherwise the server / client timezone will be used! -- SET time_zone = '+02:00'; SET sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO'; ALTER TABLE director_activity_log MODIFY change_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE director_deployment_log MODIFY start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFY end_time TIMESTAMP NULL DEFAULT NULL, MODIFY abort_time TIMESTAMP NULL DEFAULT NULL; ALTER TABLE director_schema_migration MODIFY migration_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE director_job MODIFY ts_last_attempt TIMESTAMP NULL DEFAULT NULL, MODIFY ts_last_error TIMESTAMP NULL DEFAULT NULL; ALTER TABLE import_source MODIFY last_attempt TIMESTAMP NULL DEFAULT NULL; ALTER TABLE import_run MODIFY start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFY end_time TIMESTAMP NULL DEFAULT NULL; ALTER TABLE sync_rule MODIFY last_attempt TIMESTAMP NULL DEFAULT NULL; ALTER TABLE sync_run MODIFY start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (163, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_164.sql000066400000000000000000000005341516513262500262410ustar00rootroot00000000000000SET sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO'; ALTER TABLE icinga_dependency ADD COLUMN parent_host_var VARCHAR(128) DEFAULT NULL AFTER parent_host_id; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (164, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_165.sql000066400000000000000000000002541516513262500262410ustar00rootroot00000000000000ALTER TABLE icinga_host MODIFY COLUMN address VARCHAR(255) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (165, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_166.sql000066400000000000000000000005751516513262500262500ustar00rootroot00000000000000ALTER TABLE sync_rule MODIFY object_type enum( 'host', 'service', 'command', 'user', 'hostgroup', 'servicegroup', 'usergroup', 'datalistEntry', 'endpoint', 'zone', 'timePeriod', 'serviceSet', 'scheduledDowntime', 'notification', 'dependency' ) NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (166, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_167.sql000066400000000000000000000016201516513262500262410ustar00rootroot00000000000000CREATE TABLE director_daemon_info ( instance_uuid_hex VARCHAR(32) NOT NULL, -- random by daemon schema_version SMALLINT UNSIGNED NOT NULL, fqdn VARCHAR(255) NOT NULL, username VARCHAR(64) NOT NULL, pid INT UNSIGNED NOT NULL, binary_path VARCHAR(128) NOT NULL, binary_realpath VARCHAR(128) NOT NULL, php_binary_path VARCHAR(128) NOT NULL, php_binary_realpath VARCHAR(128) NOT NULL, php_version VARCHAR(64) NOT NULL, php_integer_size SMALLINT NOT NULL, running_with_systemd ENUM('y', 'n') NOT NULL, ts_started BIGINT(20) NOT NULL, ts_stopped BIGINT(20) DEFAULT NULL, ts_last_modification BIGINT(20) DEFAULT NULL, ts_last_update BIGINT(20) DEFAULT NULL, process_info MEDIUMTEXT NOT NULL, PRIMARY KEY (instance_uuid_hex) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (167, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_168.sql000066400000000000000000000011751516513262500262470ustar00rootroot00000000000000CREATE TABLE director_datafield_category ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, category_name VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY category_name (category_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE director_datafield ADD COLUMN category_id INT(10) UNSIGNED DEFAULT NULL AFTER id, ADD CONSTRAINT director_datafield_category FOREIGN KEY category (category_id) REFERENCES director_datafield_category (id) ON DELETE RESTRICT ON UPDATE CASCADE ; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (168, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_170.sql000066400000000000000000000003231516513262500262320ustar00rootroot00000000000000 ALTER TABLE sync_rule MODIFY COLUMN update_policy ENUM('merge', 'override', 'ignore', 'update-only') NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (170, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_171.sql000066400000000000000000000001401516513262500262300ustar00rootroot00000000000000INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (171, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_172.sql000066400000000000000000000005361516513262500262420ustar00rootroot00000000000000ALTER TABLE sync_rule ADD COLUMN purge_action ENUM('delete', 'disable') NULL DEFAULT NULL AFTER purge_existing; UPDATE sync_rule SET purge_action = 'delete'; ALTER TABLE sync_rule MODIFY COLUMN purge_action ENUM('delete', 'disable') DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (172, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_173.sql000066400000000000000000000003011516513262500262310ustar00rootroot00000000000000ALTER TABLE sync_rule MODIFY COLUMN purge_action ENUM('delete', 'disable') NULL DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (173, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_174.sql000066400000000000000000000256211516513262500262460ustar00rootroot00000000000000ALTER TABLE icinga_zone ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_zone SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_zone MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_timeperiod ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_timeperiod SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_timeperiod MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_command ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_command SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_command MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_apiuser ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_apiuser SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_apiuser MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_endpoint ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_endpoint SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_endpoint MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_host ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_host SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_host MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_service ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_service SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_service MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_hostgroup ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_hostgroup SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_hostgroup MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_servicegroup ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_servicegroup SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_servicegroup MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_user ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_user SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_user MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_usergroup ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_usergroup SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_usergroup MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_notification ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_notification SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_notification MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_dependency ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_dependency SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_dependency MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE icinga_scheduled_downtime ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_scheduled_downtime SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_scheduled_downtime MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (174, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_175.sql000066400000000000000000000422571516513262500262530ustar00rootroot00000000000000CREATE TABLE director_branch ( uuid VARBINARY(16) NOT NULL, owner VARCHAR(255) NOT NULL, branch_name VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, ts_merge_request BIGINT DEFAULT NULL, PRIMARY KEY(uuid), UNIQUE KEY (branch_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_branch_activity ( timestamp_ns BIGINT(20) NOT NULL, object_uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, action ENUM ('create', 'modify', 'delete') NOT NULL, object_table VARCHAR(64) NOT NULL, author VARCHAR(255) NOT NULL, former_properties LONGTEXT NOT NULL, -- json-encoded modified_properties LONGTEXT NOT NULL, PRIMARY KEY (timestamp_ns), INDEX object_uuid (object_uuid), INDEX branch_uuid (branch_uuid), CONSTRAINT branch_activity_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_host ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, address VARCHAR(255) DEFAULT NULL, address6 VARCHAR(45) DEFAULT NULL, check_command VARCHAR(255) DEFAULT NULL, max_check_attempts MEDIUMINT UNSIGNED DEFAULT NULL, check_period VARCHAR(255) DEFAULT NULL, check_interval VARCHAR(8) DEFAULT NULL, retry_interval VARCHAR(8) DEFAULT NULL, check_timeout SMALLINT UNSIGNED DEFAULT NULL, enable_notifications ENUM('y', 'n') DEFAULT NULL, enable_active_checks ENUM('y', 'n') DEFAULT NULL, enable_passive_checks ENUM('y', 'n') DEFAULT NULL, enable_event_handler ENUM('y', 'n') DEFAULT NULL, enable_flapping ENUM('y', 'n') DEFAULT NULL, enable_perfdata ENUM('y', 'n') DEFAULT NULL, event_command VARCHAR(255) DEFAULT NULL, flapping_threshold_high SMALLINT UNSIGNED DEFAULT NULL, flapping_threshold_low SMALLINT UNSIGNED DEFAULT NULL, volatile ENUM('y', 'n') DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, command_endpoint VARCHAR(255) DEFAULT NULL, notes TEXT DEFAULT NULL, notes_url VARCHAR(255) DEFAULT NULL, action_url VARCHAR(255) DEFAULT NULL, icon_image VARCHAR(255) DEFAULT NULL, icon_image_alt VARCHAR(255) DEFAULT NULL, has_agent ENUM('y', 'n') DEFAULT NULL, master_should_connect ENUM('y', 'n') DEFAULT NULL, accept_config ENUM('y', 'n') DEFAULT NULL, api_key VARCHAR(40) DEFAULT NULL, imports TEXT DEFAULT NULL, `groups` TEXT DEFAULT NULL, vars MEDIUMTEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_host_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_hostgroup ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_hostgroup_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_servicegroup ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_servicegroup_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_usergroup ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_usergroup_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_user ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, email VARCHAR(255) DEFAULT NULL, pager VARCHAR(255) DEFAULT NULL, enable_notifications ENUM('y', 'n') DEFAULT NULL, period VARCHAR(255) DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, states TEXT DEFAULT NULL, types TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, `groups` TEXT DEFAULT NULL, vars MEDIUMTEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_user_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_zone ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, parent VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, is_global ENUM('y', 'n') DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_zone_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_timeperiod ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, update_method VARCHAR(64) DEFAULT NULL COMMENT 'Usually LegacyTimePeriod', zone VARCHAR(255) DEFAULT NULL, prefer_includes ENUM('y', 'n') DEFAULT NULL, imports TEXT DEFAULT NULL, ranges TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_timeperiod_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_command ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, methods_execute VARCHAR(64) DEFAULT NULL, command TEXT DEFAULT NULL, is_string ENUM('y', 'n') NULL, timeout SMALLINT UNSIGNED DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, arguments TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_command_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_apiuser ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, password VARCHAR(255) DEFAULT NULL, client_dn VARCHAR(64) DEFAULT NULL, permissions TEXT DEFAULT NULL COMMENT 'JSON-encoded permissions', set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_apiuser_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_endpoint ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, host VARCHAR(255) DEFAULT NULL, port SMALLINT UNSIGNED DEFAULT NULL, log_duration VARCHAR(32) DEFAULT NULL, apiuser VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_endpoint_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_service ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, host VARCHAR(255) DEFAULT NULL, service_set VARCHAR(255) DEFAULT NULL, check_command VARCHAR(255) DEFAULT NULL, max_check_attempts MEDIUMINT UNSIGNED DEFAULT NULL, check_period VARCHAR(255) DEFAULT NULL, check_interval VARCHAR(8) DEFAULT NULL, retry_interval VARCHAR(8) DEFAULT NULL, check_timeout SMALLINT UNSIGNED DEFAULT NULL, enable_notifications ENUM('y', 'n') DEFAULT NULL, enable_active_checks ENUM('y', 'n') DEFAULT NULL, enable_passive_checks ENUM('y', 'n') DEFAULT NULL, enable_event_handler ENUM('y', 'n') DEFAULT NULL, enable_flapping ENUM('y', 'n') DEFAULT NULL, enable_perfdata ENUM('y', 'n') DEFAULT NULL, event_command VARCHAR(255) DEFAULT NULL, flapping_threshold_high SMALLINT UNSIGNED DEFAULT NULL, flapping_threshold_low SMALLINT UNSIGNED DEFAULT NULL, volatile ENUM('y', 'n') DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, command_endpoint VARCHAR(255) DEFAULT NULL, notes TEXT DEFAULT NULL, notes_url VARCHAR(255) DEFAULT NULL, action_url VARCHAR(255) DEFAULT NULL, icon_image VARCHAR(255) DEFAULT NULL, icon_image_alt VARCHAR(255) DEFAULT NULL, use_agent ENUM('y', 'n') DEFAULT NULL, apply_for VARCHAR(255) DEFAULT NULL, use_var_overrides ENUM('y', 'n') DEFAULT NULL, assign_filter TEXT DEFAULT NULL, -- template_choice VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, `groups` TEXT DEFAULT NULL, vars MEDIUMTEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_service_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_notification ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, apply_to ENUM('host', 'service') DEFAULT NULL, host VARCHAR(255) DEFAULT NULL, service VARCHAR(255) DEFAULT NULL, times_begin INT(10) UNSIGNED DEFAULT NULL, times_end INT(10) UNSIGNED DEFAULT NULL, notification_interval INT(10) UNSIGNED DEFAULT NULL, command VARCHAR(255) DEFAULT NULL, period VARCHAR(255) DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, states TEXT DEFAULT NULL, types TEXT DEFAULT NULL, users TEXT DEFAULT NULL, usergroups TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, vars MEDIUMTEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_notification_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_scheduled_downtime ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, apply_to ENUM('host', 'service') DEFAULT NULL, assign_filter TEXT DEFAULT NULL, author VARCHAR(255) DEFAULT NULL, comment TEXT DEFAULT NULL, fixed ENUM('y', 'n') DEFAULT NULL, duration INT(10) UNSIGNED DEFAULT NULL, with_services ENUM('y', 'n') NULL DEFAULT NULL, imports TEXT DEFAULT NULL, ranges TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_scheduled_downtime_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_dependency ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, apply_to ENUM('host', 'service') DEFAULT NULL, parent_host VARCHAR(255) DEFAULT NULL, parent_host_var VARCHAR(128) DEFAULT NULL, parent_service VARCHAR(255) DEFAULT NULL, child_host VARCHAR(255) DEFAULT NULL, child_service VARCHAR(255) DEFAULT NULL, disable_checks ENUM('y', 'n') DEFAULT NULL, disable_notifications ENUM('y', 'n') DEFAULT NULL, ignore_soft_states ENUM('y', 'n') DEFAULT NULL, period VARCHAR(255) DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, parent_service_by_name VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_dependency_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (175, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_176.sql000066400000000000000000000004721516513262500262450ustar00rootroot00000000000000ALTER TABLE icinga_host ADD COLUMN custom_endpoint_name VARCHAR(255) DEFAULT NULL AFTER accept_config; ALTER TABLE branched_icinga_host ADD COLUMN custom_endpoint_name VARCHAR(255) DEFAULT NULL AFTER accept_config; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES ('176', NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_177.sql000066400000000000000000000015751516513262500262530ustar00rootroot00000000000000ALTER TABLE icinga_service_set ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE icinga_service_set SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE icinga_service_set MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES ('177', NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_178.sql000066400000000000000000000013741516513262500262510ustar00rootroot00000000000000CREATE TABLE director_activity_log_remark ( first_related_activity BIGINT(20) UNSIGNED NOT NULL, last_related_activity BIGINT(20) UNSIGNED NOT NULL, remark TEXT NOT NULL, PRIMARY KEY (first_related_activity, last_related_activity), CONSTRAINT activity_log_remark_begin FOREIGN KEY first_related_activity (first_related_activity) REFERENCES director_activity_log (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT activity_log_remark_end FOREIGN KEY last_related_activity (last_related_activity) REFERENCES director_activity_log (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES ('178', NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_179.sql000066400000000000000000000002371516513262500262470ustar00rootroot00000000000000ALTER TABLE director_deployment_log ADD INDEX (start_time); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES ('179', NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_180.sql000066400000000000000000000015441516513262500262410ustar00rootroot00000000000000CREATE TABLE branched_icinga_service_set ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(128) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, host VARCHAR(255) DEFAULT NULL, description TEXT DEFAULT NULL, assign_filter TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), INDEX search_object_name (object_name), CONSTRAINT icinga_service_set_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (180, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_182.sql000066400000000000000000000006211516513262500262360ustar00rootroot00000000000000DELETE sr.* FROM sync_run sr JOIN sync_rule s ON s.id = sr.rule_id WHERE sr.last_former_activity = sr.last_related_activity AND s.object_type != 'datalistEntry' AND sr.start_time > '2022-09-21 00:00:00'; DELETE FROM sync_run WHERE (objects_created + objects_deleted + objects_modified) = 0; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (182, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_183.sql000066400000000000000000000004521516513262500262410ustar00rootroot00000000000000ALTER TABLE icinga_notification ADD COLUMN users_var VARCHAR(255) DEFAULT NULL AFTER zone_id; ALTER TABLE icinga_notification ADD COLUMN user_groups_var VARCHAR(255) DEFAULT NULL AFTER users_var; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (183, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_184.sql000066400000000000000000000004711516513262500262430ustar00rootroot00000000000000ALTER TABLE branched_icinga_notification ADD COLUMN users_var VARCHAR(255) DEFAULT NULL AFTER zone; ALTER TABLE branched_icinga_notification ADD COLUMN user_groups_var VARCHAR(255) DEFAULT NULL AFTER users_var; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (184, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_186.sql000066400000000000000000000032251516513262500262450ustar00rootroot00000000000000ALTER TABLE director_datafield ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE director_datafield SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE director_datafield MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); ALTER TABLE director_datalist ADD COLUMN uuid VARBINARY(16) DEFAULT NULL AFTER id; SET @tmp_uuid = LOWER(CONCAT( LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), '-', '4', LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', HEX(FLOOR(RAND() * 4 + 8)), LPAD(HEX(FLOOR(RAND() * 0x0fff)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0'), LPAD(HEX(FLOOR(RAND() * 0xffff)), 4, '0') )); UPDATE director_datalist SET uuid = UNHEX(LPAD(LPAD(HEX(id), 8, '0'), 32, REPLACE(@tmp_uuid, '-', ''))) WHERE uuid IS NULL; ALTER TABLE director_datalist MODIFY COLUMN uuid VARBINARY(16) NOT NULL, ADD UNIQUE INDEX uuid (uuid); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (186, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_187.sql000066400000000000000000000003001516513262500262350ustar00rootroot00000000000000ALTER TABLE import_row_modifier ADD COLUMN filter_expression TEXT DEFAULT NULL AFTER priority; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (187, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_188.sql000066400000000000000000000013241516513262500262450ustar00rootroot00000000000000ALTER TABLE director_generated_config DROP FOREIGN KEY director_generated_config_activity; # Delete all entries with duplicate checksum except the first entry DELETE log1 FROM director_activity_log log1 INNER JOIN director_activity_log log2 ON log1.checksum = log2.checksum WHERE log1.id > log2.id; ALTER TABLE director_activity_log DROP INDEX checksum, ADD UNIQUE INDEX checksum (checksum); ALTER TABLE director_generated_config ADD CONSTRAINT director_generated_config_activity FOREIGN KEY (last_activity_checksum) REFERENCES director_activity_log (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (188, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_189.sql000066400000000000000000000011711516513262500262460ustar00rootroot00000000000000ALTER TABLE director_job ADD COLUMN ts_last_attempt_tmp BIGINT(20) DEFAULT NULL; ALTER TABLE director_job ADD COLUMN ts_last_error_tmp BIGINT(20) DEFAULT NULL; UPDATE director_job SET ts_last_attempt_tmp = UNIX_TIMESTAMP(ts_last_attempt) * 1000, ts_last_error_tmp = UNIX_TIMESTAMP(ts_last_error) * 1000; ALTER TABLE director_job DROP COLUMN ts_last_attempt, DROP COLUMN ts_last_error, CHANGE ts_last_attempt_tmp ts_last_attempt BIGINT(20) DEFAULT NULL, CHANGE ts_last_error_tmp ts_last_error BIGINT(20) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (189, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_190.sql000066400000000000000000000005161516513262500262400ustar00rootroot00000000000000ALTER TABLE icinga_dependency ADD COLUMN redundancy_group VARCHAR(255) DEFAULT NULL AFTER parent_service_by_name; ALTER TABLE branched_icinga_dependency ADD COLUMN redundancy_group VARCHAR(255) DEFAULT NULL AFTER parent_service_by_name; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (190, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_191.sql000066400000000000000000000005721516513262500262430ustar00rootroot00000000000000ALTER TABLE director_activity_log MODIFY COLUMN old_properties MEDIUMTEXT DEFAULT NULL COMMENT 'Property hash, JSON', MODIFY COLUMN new_properties MEDIUMTEXT DEFAULT NULL COMMENT 'Property hash, JSON'; ALTER TABLE icinga_host_var MODIFY COLUMN varvalue MEDIUMTEXT DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (191, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_63.sql000066400000000000000000000004771516513262500261650ustar00rootroot00000000000000CREATE TABLE director_schema_migration ( schema_version SMALLINT UNSIGNED NOT NULL, migration_time DATETIME NOT NULL, PRIMARY KEY(schema_version) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE director_dbversion; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 63; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_64.sql000066400000000000000000000004171516513262500261600ustar00rootroot00000000000000CREATE TABLE director_setting ( setting_name VARCHAR(64) NOT NULL, setting_value VARCHAR(255) NOT NULL, PRIMARY KEY(setting_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 64; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_65.sql000066400000000000000000000023531516513262500261620ustar00rootroot00000000000000ALTER TABLE icinga_zone ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_timeperiod ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_command ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_apiuser ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_endpoint ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_host ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_service ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_hostgroup ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_servicegroup ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_user ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; ALTER TABLE icinga_usergroup ADD COLUMN disabled ENUM('y', 'n') NOT NULL DEFAULT 'n' AFTER object_type; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 65; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_66.sql000066400000000000000000000021341516513262500261600ustar00rootroot00000000000000 -- dropping old tables, as they have never been used DROP TABLE import_row_modifier_setting; DROP TABLE import_row_modifier; CREATE TABLE import_row_modifier ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, source_id INT(10) UNSIGNED NOT NULL, property_name VARCHAR(255) NOT NULL, provider_class VARCHAR(72) NOT NULL, priority SMALLINT UNSIGNED NOT NULL, PRIMARY KEY (id), KEY search_idx (property_name), CONSTRAINT row_modifier_import_source FOREIGN KEY source (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE import_row_modifier_setting ( row_modifier_id INT UNSIGNED NOT NULL, setting_name VARCHAR(64) NOT NULL, setting_value TEXT DEFAULT NULL, PRIMARY KEY (row_modifier_id, setting_name), CONSTRAINT row_modifier_settings FOREIGN KEY row_modifier (row_modifier_id) REFERENCES import_row_modifier (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 66; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_67.sql000066400000000000000000000013701516513262500261620ustar00rootroot00000000000000CREATE TABLE sync_run ( id BIGINT(10) UNSIGNED AUTO_INCREMENT NOT NULL, rule_id INT(10) UNSIGNED DEFAULT NULL, rule_name VARCHAR(255) NOT NULL, start_time DATETIME NOT NULL, duration_ms INT(10) UNSIGNED NOT NULL, objects_deleted INT(10) UNSIGNED DEFAULT 0, objects_created INT(10) UNSIGNED DEFAULT 0, objects_modified INT(10) UNSIGNED DEFAULT 0, first_related_activity VARBINARY(20) DEFAULT NULL, last_related_activity VARBINARY(20) DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT sync_run_rule FOREIGN KEY sync_rule (rule_id) REFERENCES sync_rule (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 67; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_68.sql000066400000000000000000000002501516513262500261570ustar00rootroot00000000000000ALTER TABLE sync_run MODIFY duration_ms INT(10) UNSIGNED DEFAULT NULL; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 68; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_69.sql000066400000000000000000000003621516513262500261640ustar00rootroot00000000000000ALTER TABLE sync_run DROP COLUMN first_related_activity, ADD COLUMN last_former_activity VARBINARY(20) DEFAULT NULL AFTER objects_modified; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 69; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_70.sql000066400000000000000000000006221516513262500261530ustar00rootroot00000000000000ALTER TABLE icinga_timeperiod_range DROP FOREIGN KEY icinga_timeperiod_range_timeperiod; ALTER TABLE icinga_timeperiod_range ADD CONSTRAINT icinga_timeperiod_range_timeperiod FOREIGN KEY timeperiod (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 70; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_71.sql000066400000000000000000000027341516513262500261620ustar00rootroot00000000000000CREATE TABLE icinga_notification ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', host_id INT(10) UNSIGNED DEFAULT NULL, service_id INT(10) UNSIGNED DEFAULT NULL, times_begin INT(10) UNSIGNED DEFAULT NULL, times_end INT(10) UNSIGNED DEFAULT NULL, notification_interval INT(10) UNSIGNED DEFAULT NULL, command_id INT(10) UNSIGNED DEFAULT NULL, period_id INT(10) UNSIGNED DEFAULT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_notification_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_command FOREIGN KEY command (command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_notification_period FOREIGN KEY period (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_notification_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 71; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_72.sql000066400000000000000000000011001516513262500261450ustar00rootroot00000000000000 ALTER TABLE director_generated_config ADD COLUMN first_activity_checksum VARBINARY(20) NOT NULL AFTER duration; UPDATE director_generated_config SET first_activity_checksum = last_activity_checksum; ALTER TABLE director_deployment_log ADD COLUMN last_activity_checksum VARBINARY(20) NOT NULL AFTER config_checksum; UPDATE director_deployment_log l JOIN director_generated_config c ON l.config_checksum = c.checksum SET l.last_activity_checksum = c.last_activity_checksum; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 72; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_73.sql000066400000000000000000000025021516513262500261550ustar00rootroot00000000000000DROP TABLE icinga_user_filter_state; CREATE TABLE icinga_user_states_set ( user_id INT(10) UNSIGNED NOT NULL, property ENUM( 'OK', 'Warning', 'Critical', 'Unknown', 'Up', 'Down' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (user_id, property), CONSTRAINT icinga_user_states_set_user FOREIGN KEY icinga_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; DROP TABLE icinga_user_filter_type; CREATE TABLE icinga_user_filters_set ( user_id INT(10) UNSIGNED NOT NULL, property ENUM( 'DowntimeStart', 'DowntimeEnd', 'DowntimeRemoved', 'Custom', 'Acknowledgement', 'Problem', 'Recovery', 'FlappingStart', 'FlappingEnd' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (user_id, property), CONSTRAINT icinga_user_filters_set_user FOREIGN KEY icinga_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 73; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_74.sql000066400000000000000000000005111516513262500261540ustar00rootroot00000000000000 ALTER TABLE icinga_service DROP FOREIGN KEY icinga_host; ALTER TABLE icinga_service ADD CONSTRAINT icinga_service_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 74; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_75.sql000066400000000000000000000025421516513262500261630ustar00rootroot00000000000000DROP TABLE icinga_user_states_set; CREATE TABLE icinga_user_states_set ( user_id INT(10) UNSIGNED NOT NULL, property ENUM( 'OK', 'Warning', 'Critical', 'Unknown', 'Up', 'Down' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (user_id, property, merge_behaviour), CONSTRAINT icinga_user_states_set_user FOREIGN KEY icinga_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; DROP TABLE icinga_user_filters_set; CREATE TABLE icinga_user_filters_set ( user_id INT(10) UNSIGNED NOT NULL, property ENUM( 'DowntimeStart', 'DowntimeEnd', 'DowntimeRemoved', 'Custom', 'Acknowledgement', 'Problem', 'Recovery', 'FlappingStart', 'FlappingEnd' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (user_id, property, merge_behaviour), CONSTRAINT icinga_user_filters_set_user FOREIGN KEY icinga_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 75; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_76.sql000066400000000000000000000014141516513262500261610ustar00rootroot00000000000000DROP TABLE icinga_user_filters_set; CREATE TABLE icinga_user_types_set ( user_id INT(10) UNSIGNED NOT NULL, property ENUM( 'DowntimeStart', 'DowntimeEnd', 'DowntimeRemoved', 'Custom', 'Acknowledgement', 'Problem', 'Recovery', 'FlappingStart', 'FlappingEnd' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (user_id, property, merge_behaviour), CONSTRAINT icinga_user_types_set_user FOREIGN KEY icinga_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 76; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_77.sql000066400000000000000000000050771516513262500261730ustar00rootroot00000000000000CREATE TABLE icinga_notification_states_set ( notification_id INT(10) UNSIGNED NOT NULL, property ENUM( 'OK', 'Warning', 'Critical', 'Unknown', 'Up', 'Down' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (notification_id, property, merge_behaviour), CONSTRAINT icinga_notification_states_set_notification FOREIGN KEY icinga_notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_notification_types_set ( notification_id INT(10) UNSIGNED NOT NULL, property ENUM( 'DowntimeStart', 'DowntimeEnd', 'DowntimeRemoved', 'Custom', 'Acknowledgement', 'Problem', 'Recovery', 'FlappingStart', 'FlappingEnd' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (notification_id, property, merge_behaviour), CONSTRAINT icinga_notification_types_set_notification FOREIGN KEY icinga_notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_notification_var ( notification_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) DEFAULT NULL, varvalue TEXT DEFAULT NULL, format enum ('string', 'json', 'expression'), PRIMARY KEY (notification_id, varname), key search_idx (varname), CONSTRAINT icinga_notification_var_notification FOREIGN KEY notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification_inheritance ( notification_id INT(10) UNSIGNED NOT NULL, parent_notification_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (notification_id, parent_notification_id), UNIQUE KEY unique_order (notification_id, weight), CONSTRAINT icinga_notification_inheritance_notification FOREIGN KEY host (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_inheritance_parent_notification FOREIGN KEY host (parent_notification_id) REFERENCES icinga_notification (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 77; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_78.sql000066400000000000000000000012321516513262500261610ustar00rootroot00000000000000CREATE TABLE icinga_user_field ( user_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') NOT NULL, PRIMARY KEY (user_id, datafield_id), CONSTRAINT icinga_user_field_user FOREIGN KEY user(user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_user_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 78; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_82.sql000066400000000000000000000005021516513262500261530ustar00rootroot00000000000000ALTER TABLE sync_rule MODIFY COLUMN object_type enum( 'host', 'service', 'command', 'user', 'hostgroup', 'servicegroup', 'usergroup', 'datalistEntry', 'endpoint', 'zone' ) NOT NULL; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 82; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_84.sql000066400000000000000000000002221516513262500261540ustar00rootroot00000000000000ALTER TABLE icinga_usergroup DROP COLUMN zone_id; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (84, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_85.sql000066400000000000000000000007371516513262500261700ustar00rootroot00000000000000CREATE TABLE icinga_notification_assignment ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, notification_id INT(10) UNSIGNED NOT NULL, filter_string TEXT NOT NULL, PRIMARY KEY (id), CONSTRAINT icinga_notification_assignment FOREIGN KEY notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (85, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_86.sql000066400000000000000000000022741516513262500261670ustar00rootroot00000000000000CREATE TABLE icinga_notification_user ( notification_id INT(10) UNSIGNED NOT NULL, user_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (notification_id, user_id), CONSTRAINT icinga_notification_user_user FOREIGN KEY user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_user_notification FOREIGN KEY notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification_usergroup ( notification_id INT(10) UNSIGNED NOT NULL, usergroup_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (notification_id, usergroup_id), CONSTRAINT icinga_notification_usergroup_usergroup FOREIGN KEY usergroup (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_usergroup_notification FOREIGN KEY notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (86, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_87.sql000066400000000000000000000003121516513262500261570ustar00rootroot00000000000000ALTER TABLE icinga_notification MODIFY COLUMN object_type ENUM('object', 'template', 'apply') NOT NULL; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 87; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_89.sql000066400000000000000000000003011516513262500261570ustar00rootroot00000000000000ALTER TABLE icinga_command_argument ADD required ENUM('y', 'n') DEFAULT NULL AFTER repeat_key; INSERT INTO director_schema_migration SET migration_time = NOW(), schema_version = 89; icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_90.sql000066400000000000000000000003121516513262500261510ustar00rootroot00000000000000ALTER TABLE icinga_service_assignment ADD assign_type ENUM('assign', 'ignore') NOT NULL DEFAULT 'assign'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (90, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_91.sql000066400000000000000000000003171516513262500261570ustar00rootroot00000000000000ALTER TABLE icinga_notification_assignment ADD assign_type ENUM('assign', 'ignore') NOT NULL DEFAULT 'assign'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (91, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_92.sql000066400000000000000000000015411516513262500261600ustar00rootroot00000000000000DELETE FROM director_datalist_entry WHERE entry_name IS NULL; ALTER TABLE director_datalist_entry MODIFY entry_name VARCHAR(255) NOT NULL; DELETE FROM icinga_command_var WHERE varname IS NULL; ALTER TABLE icinga_command_var MODIFY varname VARCHAR(255) NOT NULL; DELETE FROM icinga_host_var WHERE varname IS NULL; ALTER TABLE icinga_host_var MODIFY varname VARCHAR(255) NOT NULL; DELETE FROM icinga_service_var WHERE varname IS NULL; ALTER TABLE icinga_service_var MODIFY varname VARCHAR(255) NOT NULL; DELETE FROM icinga_user_var WHERE varname IS NULL; ALTER TABLE icinga_user_var MODIFY varname VARCHAR(255) NOT NULL; DELETE FROM icinga_notification_var WHERE varname IS NULL; ALTER TABLE icinga_notification_var MODIFY varname VARCHAR(255) NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (92, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_93.sql000066400000000000000000000010401516513262500261530ustar00rootroot00000000000000ALTER TABLE sync_rule ADD COLUMN sync_state ENUM( 'unknown', 'in-sync', 'pending-changes', 'failing' ) NOT NULL DEFAULT 'unknown', ADD COLUMN last_error_message VARCHAR(255) DEFAULT NULL, ADD COLUMN last_attempt DATETIME DEFAULT NULL ; UPDATE sync_rule r JOIN ( SELECT rule_id, MAX(start_time) AS start_time FROM sync_run GROUP BY rule_id ) lr ON r.id = lr.rule_id SET r.last_attempt = lr.start_time; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (93, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_94.sql000066400000000000000000000016541516513262500261670ustar00rootroot00000000000000CREATE TABLE director_job ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, job_name VARCHAR(64) NOT NULL, job_class VARCHAR(72) NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', run_interval INT(10) UNSIGNED NOT NULL, -- seconds last_attempt_succeeded ENUM('y', 'n') DEFAULT NULL, ts_last_attempt DATETIME DEFAULT NULL, ts_last_error DATETIME DEFAULT NULL, last_error_message TEXT, PRIMARY KEY (id), UNIQUE KEY (job_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_job_setting ( job_id INT UNSIGNED NOT NULL, setting_name VARCHAR(64) NOT NULL, setting_value TEXT DEFAULT NULL, PRIMARY KEY (job_id, setting_name), CONSTRAINT job_settings FOREIGN KEY director_job (job_id) REFERENCES director_job (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (94, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_95.sql000066400000000000000000000010521516513262500261600ustar00rootroot00000000000000ALTER TABLE import_source ADD COLUMN import_state ENUM( 'unknown', 'in-sync', 'pending-changes', 'failing' ) NOT NULL DEFAULT 'unknown', ADD COLUMN last_error_message TEXT DEFAULT NULL, ADD COLUMN last_attempt DATETIME DEFAULT NULL ; UPDATE import_source s JOIN ( SELECT source_id, MAX(start_time) AS start_time FROM import_run GROUP BY source_id ) ir ON s.id = ir.source_id SET s.last_attempt = ir.start_time; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (95, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_96.sql000066400000000000000000000003021516513262500261560ustar00rootroot00000000000000ALTER TABLE icinga_notification ADD apply_to ENUM('host', 'service') DEFAULT NULL AFTER disabled; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (96, NOW()); icingaweb2-module-director-1.11.8/schema/mysql-migrations/upgrade_97.sql000066400000000000000000000005521516513262500261660ustar00rootroot00000000000000ALTER TABLE director_job ADD COLUMN timeperiod_id INT(10) UNSIGNED DEFAULT NULL AFTER run_interval, ADD CONSTRAINT director_job_period FOREIGN KEY timeperiod (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (97, NOW()); icingaweb2-module-director-1.11.8/schema/mysql.sql000066400000000000000000002516551516513262500220620ustar00rootroot00000000000000-- -- MySQL schema -- ============ -- -- You should normally not be required to care about schema handling. -- Director does all the migrations for you and guides you either in -- the frontend or provides everything you need for automated migration -- handling. Please find more related information in our documentation. SET sql_mode = 'STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO'; CREATE TABLE director_daemon_info ( instance_uuid_hex VARCHAR(32) NOT NULL, -- random by daemon schema_version SMALLINT UNSIGNED NOT NULL, fqdn VARCHAR(255) NOT NULL, username VARCHAR(64) NOT NULL, pid INT UNSIGNED NOT NULL, binary_path VARCHAR(128) NOT NULL, binary_realpath VARCHAR(128) NOT NULL, php_binary_path VARCHAR(128) NOT NULL, php_binary_realpath VARCHAR(128) NOT NULL, php_version VARCHAR(64) NOT NULL, php_integer_size SMALLINT NOT NULL, running_with_systemd ENUM('y', 'n') NOT NULL, ts_started BIGINT(20) NOT NULL, ts_stopped BIGINT(20) DEFAULT NULL, ts_last_modification BIGINT(20) DEFAULT NULL, ts_last_update BIGINT(20) DEFAULT NULL, process_info MEDIUMTEXT NOT NULL, PRIMARY KEY (instance_uuid_hex) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; CREATE TABLE director_activity_log ( id BIGINT(20) UNSIGNED AUTO_INCREMENT NOT NULL, object_type VARCHAR(64) NOT NULL, object_name VARCHAR(255) NOT NULL, action_name ENUM('create', 'delete', 'modify') NOT NULL, old_properties MEDIUMTEXT DEFAULT NULL COMMENT 'Property hash, JSON', new_properties MEDIUMTEXT DEFAULT NULL COMMENT 'Property hash, JSON', author VARCHAR(64) NOT NULL, change_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, checksum VARBINARY(20) NOT NULL, parent_checksum VARBINARY(20) DEFAULT NULL, PRIMARY KEY (id), INDEX sort_idx (change_time), INDEX search_idx (object_name), INDEX search_idx2 (object_type(32), object_name(64), change_time), INDEX search_author (author), UNIQUE INDEX checksum (checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_activity_log_remark ( first_related_activity BIGINT(20) UNSIGNED NOT NULL, last_related_activity BIGINT(20) UNSIGNED NOT NULL, remark TEXT NOT NULL, PRIMARY KEY (first_related_activity, last_related_activity), CONSTRAINT activity_log_remark_begin FOREIGN KEY first_related_activity (first_related_activity) REFERENCES director_activity_log (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT activity_log_remark_end FOREIGN KEY last_related_activity (last_related_activity) REFERENCES director_activity_log (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_basket ( uuid VARBINARY(16) NOT NULL, basket_name VARCHAR(64) NOT NULL, owner_type ENUM( 'user', 'usergroup', 'role' ) NOT NULL, owner_value VARCHAR(255) NOT NULL, objects MEDIUMTEXT NOT NULL, -- json-encoded PRIMARY KEY (uuid), UNIQUE INDEX basket_name (basket_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; CREATE TABLE director_basket_content ( checksum VARBINARY(20) NOT NULL, summary VARCHAR(500) NOT NULL, -- json content MEDIUMTEXT NOT NULL, -- json PRIMARY KEY (checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; CREATE TABLE director_basket_snapshot ( basket_uuid VARBINARY(16) NOT NULL, ts_create BIGINT(20) NOT NULL, content_checksum VARBINARY(20) NOT NULL, PRIMARY KEY (basket_uuid, ts_create), INDEX sort_idx (ts_create), CONSTRAINT basked_snapshot_basket FOREIGN KEY director_basket_snapshot (basket_uuid) REFERENCES director_basket (uuid) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT basked_snapshot_content FOREIGN KEY content_checksum (content_checksum) REFERENCES director_basket_content (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; CREATE TABLE director_generated_config ( checksum VARBINARY(20) NOT NULL COMMENT 'SHA1(last_activity_checksum;file_path=checksum;file_path=checksum;...)', director_version VARCHAR(64) DEFAULT NULL, director_db_version INT(10) DEFAULT NULL, duration INT(10) UNSIGNED DEFAULT NULL COMMENT 'Config generation duration (ms)', first_activity_checksum VARBINARY(20) NOT NULL, last_activity_checksum VARBINARY(20) NOT NULL, PRIMARY KEY (checksum), CONSTRAINT director_generated_config_activity FOREIGN KEY (last_activity_checksum) REFERENCES director_activity_log (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_generated_file ( checksum VARBINARY(20) NOT NULL COMMENT 'SHA1(content)', content LONGTEXT NOT NULL, cnt_object INT(10) UNSIGNED NOT NULL DEFAULT 0, cnt_template INT(10) UNSIGNED NOT NULL DEFAULT 0, cnt_apply INT(10) UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_generated_config_file ( config_checksum VARBINARY(20) NOT NULL, file_checksum VARBINARY(20) NOT NULL, file_path VARCHAR(128) NOT NULL COMMENT 'e.g. zones/nafta/hosts.conf', CONSTRAINT director_generated_config_file_config FOREIGN KEY config (config_checksum) REFERENCES director_generated_config (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT director_generated_config_file_file FOREIGN KEY checksum (file_checksum) REFERENCES director_generated_file (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT, PRIMARY KEY (config_checksum, file_path), INDEX search_idx (file_checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_deployment_log ( id BIGINT(20) UNSIGNED AUTO_INCREMENT NOT NULL, config_checksum VARBINARY(20) DEFAULT NULL, last_activity_checksum VARBINARY(20) NOT NULL, peer_identity VARCHAR(64) NOT NULL, start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, end_time TIMESTAMP NULL DEFAULT NULL, abort_time TIMESTAMP NULL DEFAULT NULL, duration_connection INT(10) UNSIGNED DEFAULT NULL COMMENT 'The time it took to connect to an Icinga node (ms)', duration_dump INT(10) UNSIGNED DEFAULT NULL COMMENT 'Time spent dumping the config (ms)', stage_name VARCHAR(96) DEFAULT NULL, stage_collected ENUM('y', 'n') DEFAULT NULL, connection_succeeded ENUM('y', 'n') DEFAULT NULL, dump_succeeded ENUM('y', 'n') DEFAULT NULL, startup_succeeded ENUM('y', 'n') DEFAULT NULL, username VARCHAR(64) DEFAULT NULL COMMENT 'The user that triggered this deployment', startup_log MEDIUMTEXT DEFAULT NULL, PRIMARY KEY (id), INDEX (start_time), CONSTRAINT config_checksum FOREIGN KEY config_checksum (config_checksum) REFERENCES director_generated_config (checksum) ON DELETE SET NULL ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_datalist ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, list_name VARCHAR(255) NOT NULL, owner VARCHAR(255) NOT NULL, PRIMARY KEY (id), UNIQUE KEY list_name (list_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_datalist_entry ( list_id INT(10) UNSIGNED NOT NULL, entry_name VARCHAR(255) COLLATE utf8_bin NOT NULL, entry_value TEXT DEFAULT NULL, format enum ('string', 'expression', 'json'), allowed_roles VARCHAR(255) DEFAULT NULL, PRIMARY KEY (list_id, entry_name), CONSTRAINT director_datalist_value_datalist FOREIGN KEY datalist (list_id) REFERENCES director_datalist (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_datafield_category ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, category_name VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY category_name (category_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_datafield ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, uuid VARBINARY(16) NOT NULL, category_id INT(10) UNSIGNED DEFAULT NULL, varname VARCHAR(64) NOT NULL COLLATE utf8_bin, caption VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, datatype varchar(255) NOT NULL, -- datatype_param? multiple ones? format enum ('string', 'json', 'expression'), PRIMARY KEY (id), KEY search_idx (varname), CONSTRAINT director_datafield_category FOREIGN KEY category (category_id) REFERENCES director_datafield_category (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_datafield_setting ( datafield_id INT(10) UNSIGNED NOT NULL, setting_name VARCHAR(64) NOT NULL, setting_value TEXT NOT NULL, PRIMARY KEY (datafield_id, setting_name), CONSTRAINT datafield_id_settings FOREIGN KEY datafield (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_schema_migration ( schema_version SMALLINT UNSIGNED NOT NULL, migration_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(schema_version) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_setting ( setting_name VARCHAR(64) NOT NULL, setting_value VARCHAR(255) NOT NULL, PRIMARY KEY(setting_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_zone ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, parent_id INT(10) UNSIGNED DEFAULT NULL, object_name VARCHAR(255) NOT NULL, object_type ENUM('object', 'template', 'external_object') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', is_global ENUM('y', 'n') NOT NULL DEFAULT 'n', PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name), CONSTRAINT icinga_zone_parent FOREIGN KEY parent_zone (parent_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_zone_inheritance ( zone_id INT(10) UNSIGNED NOT NULL, parent_zone_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (zone_id, parent_zone_id), UNIQUE KEY unique_order (zone_id, weight), CONSTRAINT icinga_zone_inheritance_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_zone_inheritance_parent_zone FOREIGN KEY zone (parent_zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_timeperiod ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) NOT NULL, display_name VARCHAR(255) DEFAULT NULL, update_method VARCHAR(64) DEFAULT NULL COMMENT 'Usually LegacyTimePeriod', zone_id INT(10) UNSIGNED DEFAULT NULL, object_type ENUM('object', 'template') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', prefer_includes ENUM('y', 'n') DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name, zone_id), CONSTRAINT icinga_timeperiod_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_timeperiod_inheritance ( timeperiod_id INT(10) UNSIGNED NOT NULL, parent_timeperiod_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (timeperiod_id, parent_timeperiod_id), UNIQUE KEY unique_order (timeperiod_id, weight), CONSTRAINT icinga_timeperiod_inheritance_timeperiod FOREIGN KEY host (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_timeperiod_inheritance_parent_timeperiod FOREIGN KEY host (parent_timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_timeperiod_range ( timeperiod_id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, range_key VARCHAR(255) NOT NULL COMMENT 'monday, ...', range_value VARCHAR(255) NOT NULL COMMENT '00:00-24:00, ...', range_type ENUM('include', 'exclude') NOT NULL DEFAULT 'include' COMMENT 'include -> ranges {}, exclude ranges_ignore {} - not yet', merge_behaviour ENUM('set', 'add', 'substract') NOT NULL DEFAULT 'set' COMMENT 'set -> = {}, add -> += {}, substract -> -= {}', PRIMARY KEY (timeperiod_id, range_type, range_key), CONSTRAINT icinga_timeperiod_range_timeperiod FOREIGN KEY timeperiod (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_job ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, job_name VARCHAR(64) NOT NULL, job_class VARCHAR(72) NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', run_interval INT(10) UNSIGNED NOT NULL, -- seconds timeperiod_id INT(10) UNSIGNED DEFAULT NULL, last_attempt_succeeded ENUM('y', 'n') DEFAULT NULL, ts_last_attempt BIGINT(20) NULL DEFAULT NULL, ts_last_error BIGINT(20) NULL DEFAULT NULL, last_error_message TEXT DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY (job_name), CONSTRAINT director_job_period FOREIGN KEY timeperiod (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_job_setting ( job_id INT UNSIGNED NOT NULL, setting_name VARCHAR(64) NOT NULL, setting_value TEXT DEFAULT NULL, PRIMARY KEY (job_id, setting_name), CONSTRAINT job_settings FOREIGN KEY director_job (job_id) REFERENCES director_job (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_command ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) NOT NULL, object_type ENUM('object', 'template', 'external_object') NOT NULL COMMENT 'external_object is an attempt to work with existing commands', disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', methods_execute VARCHAR(64) DEFAULT NULL, command TEXT DEFAULT NULL, is_string ENUM('y', 'n') NULL, -- env text DEFAULT NULL, -- vars text DEFAULT NULL, timeout SMALLINT UNSIGNED DEFAULT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name), CONSTRAINT icinga_command_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_command_inheritance ( command_id INT(10) UNSIGNED NOT NULL, parent_command_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (command_id, parent_command_id), UNIQUE KEY unique_order (command_id, weight), CONSTRAINT icinga_command_inheritance_command FOREIGN KEY command (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_command_inheritance_parent_command FOREIGN KEY command (parent_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_command_argument ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, command_id INT(10) UNSIGNED NOT NULL, argument_name VARCHAR(64) COLLATE utf8_bin NOT NULL COMMENT '-x, --host', argument_value TEXT DEFAULT NULL, argument_format ENUM('string', 'expression', 'json') NULL DEFAULT NULL, key_string VARCHAR(64) DEFAULT NULL COMMENT 'Overrides name', description TEXT DEFAULT NULL, skip_key ENUM('y', 'n') DEFAULT NULL, set_if VARCHAR(255) DEFAULT NULL, -- (string expression, must resolve to a numeric value) set_if_format ENUM('string', 'expression', 'json') DEFAULT NULL, sort_order SMALLINT DEFAULT NULL, -- -> order repeat_key ENUM('y', 'n') DEFAULT NULL COMMENT 'Useful with array values', required ENUM('y', 'n') DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY unique_idx (command_id, argument_name), INDEX sort_idx (command_id, sort_order), CONSTRAINT icinga_command_argument_command FOREIGN KEY command (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_command_field ( command_id INT(10) UNSIGNED NOT NULL, datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (command_id, datafield_id), CONSTRAINT icinga_command_field_command FOREIGN KEY command_id (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_command_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_command_var ( command_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, varvalue TEXT DEFAULT NULL, format ENUM('string', 'expression', 'json') NOT NULL DEFAULT 'string', checksum VARBINARY(20) DEFAULT NULL, PRIMARY KEY (command_id, varname), INDEX search_idx (varname), INDEX checksum (checksum), CONSTRAINT icinga_command_var_command FOREIGN KEY command (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_apiuser ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) NOT NULL, object_type ENUM('object', 'template', 'external_object') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', password VARCHAR(255) DEFAULT NULL, client_dn VARCHAR(64) DEFAULT NULL, permissions TEXT DEFAULT NULL COMMENT 'JSON-encoded permissions', PRIMARY KEY (id), UNIQUE INDEX uuid (uuid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_endpoint ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, object_name VARCHAR(255) NOT NULL, object_type ENUM('object', 'template', 'external_object') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', host VARCHAR(255) DEFAULT NULL COMMENT 'IP address / hostname of remote node', port SMALLINT UNSIGNED DEFAULT NULL COMMENT '5665 if not set', log_duration VARCHAR(32) DEFAULT NULL COMMENT '1d if not set', apiuser_id INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name), CONSTRAINT icinga_endpoint_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_apiuser FOREIGN KEY apiuser (apiuser_id) REFERENCES icinga_apiuser (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_endpoint_inheritance ( endpoint_id INT(10) UNSIGNED NOT NULL, parent_endpoint_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (endpoint_id, parent_endpoint_id), UNIQUE KEY unique_order (endpoint_id, weight), CONSTRAINT icinga_endpoint_inheritance_endpoint FOREIGN KEY endpoint (endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_endpoint_inheritance_parent_endpoint FOREIGN KEY endpoint (parent_endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_host_template_choice ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, object_name VARCHAR(64) NOT NULL, description TEXT DEFAULT NULL, min_required SMALLINT UNSIGNED NOT NULL DEFAULT 0, max_allowed SMALLINT UNSIGNED NOT NULL DEFAULT 1, required_template_id INT(10) UNSIGNED DEFAULT NULL, allowed_roles VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY (object_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_host ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) NOT NULL, object_type ENUM('object', 'template') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', display_name VARCHAR(255) DEFAULT NULL, address VARCHAR(255) DEFAULT NULL, address6 VARCHAR(45) DEFAULT NULL, check_command_id INT(10) UNSIGNED DEFAULT NULL, max_check_attempts MEDIUMINT UNSIGNED DEFAULT NULL, check_period_id INT(10) UNSIGNED DEFAULT NULL, check_interval VARCHAR(8) DEFAULT NULL, retry_interval VARCHAR(8) DEFAULT NULL, check_timeout SMALLINT UNSIGNED DEFAULT NULL, enable_notifications ENUM('y', 'n') DEFAULT NULL, enable_active_checks ENUM('y', 'n') DEFAULT NULL, enable_passive_checks ENUM('y', 'n') DEFAULT NULL, enable_event_handler ENUM('y', 'n') DEFAULT NULL, enable_flapping ENUM('y', 'n') DEFAULT NULL, enable_perfdata ENUM('y', 'n') DEFAULT NULL, event_command_id INT(10) UNSIGNED DEFAULT NULL, flapping_threshold_high SMALLINT UNSIGNED default null, flapping_threshold_low SMALLINT UNSIGNED default null, volatile ENUM('y', 'n') DEFAULT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, command_endpoint_id INT(10) UNSIGNED DEFAULT NULL, notes TEXT DEFAULT NULL, notes_url VARCHAR(255) DEFAULT NULL, action_url VARCHAR(255) DEFAULT NULL, icon_image VARCHAR(255) DEFAULT NULL, icon_image_alt VARCHAR(255) DEFAULT NULL, has_agent ENUM('y', 'n') DEFAULT NULL, master_should_connect ENUM('y', 'n') DEFAULT NULL, accept_config ENUM('y', 'n') DEFAULT NULL, custom_endpoint_name VARCHAR(255) DEFAULT NULL, api_key VARCHAR(40) DEFAULT NULL, template_choice_id INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name), UNIQUE INDEX api_key (api_key), KEY search_idx (display_name), CONSTRAINT icinga_host_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_check_period FOREIGN KEY timeperiod (check_period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_check_command FOREIGN KEY check_command (check_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_event_command FOREIGN KEY event_command (event_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_command_endpoint FOREIGN KEY command_endpoint (command_endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_template_choice FOREIGN KEY choice (template_choice_id) REFERENCES icinga_host_template_choice (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_host_inheritance ( host_id INT(10) UNSIGNED NOT NULL, parent_host_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (host_id, parent_host_id), UNIQUE KEY unique_order (host_id, weight), CONSTRAINT icinga_host_inheritance_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_inheritance_parent_host FOREIGN KEY host (parent_host_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_host_field ( host_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (host_id, datafield_id), CONSTRAINT icinga_host_field_host FOREIGN KEY host(host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_host_var ( host_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, varvalue MEDIUMTEXT DEFAULT NULL, format enum ('string', 'json', 'expression'), -- immer string vorerst checksum VARBINARY(20) DEFAULT NULL, PRIMARY KEY (host_id, varname), INDEX search_idx (varname), INDEX checksum (checksum), CONSTRAINT icinga_host_var_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE icinga_host_template_choice ADD CONSTRAINT host_template_choice_required_template FOREIGN KEY required_template (required_template_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE; CREATE TABLE icinga_service_set ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(128) NOT NULL, object_type ENUM('object', 'template', 'external_object') NOT NULL, host_id INT(10) UNSIGNED DEFAULT NULL, description TEXT DEFAULT NULL, assign_filter TEXT DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE KEY object_key (object_name, host_id), CONSTRAINT icinga_service_set_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_template_choice ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, object_name VARCHAR(64) NOT NULL, description TEXT DEFAULT NULL, min_required SMALLINT UNSIGNED NOT NULL DEFAULT 0, max_allowed SMALLINT UNSIGNED NOT NULL DEFAULT 1, required_template_id INT(10) UNSIGNED DEFAULT NULL, allowed_roles VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY (object_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) NOT NULL, object_type ENUM('object', 'template', 'apply') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', display_name VARCHAR(255) DEFAULT NULL, host_id INT(10) UNSIGNED DEFAULT NULL, service_set_id INT(10) UNSIGNED DEFAULT NULL, check_command_id INT(10) UNSIGNED DEFAULT NULL, max_check_attempts MEDIUMINT UNSIGNED DEFAULT NULL, check_period_id INT(10) UNSIGNED DEFAULT NULL, check_interval VARCHAR(8) DEFAULT NULL, retry_interval VARCHAR(8) DEFAULT NULL, check_timeout SMALLINT UNSIGNED DEFAULT NULL, enable_notifications ENUM('y', 'n') DEFAULT NULL, enable_active_checks ENUM('y', 'n') DEFAULT NULL, enable_passive_checks ENUM('y', 'n') DEFAULT NULL, enable_event_handler ENUM('y', 'n') DEFAULT NULL, enable_flapping ENUM('y', 'n') DEFAULT NULL, enable_perfdata ENUM('y', 'n') DEFAULT NULL, event_command_id INT(10) UNSIGNED DEFAULT NULL, flapping_threshold_high SMALLINT UNSIGNED DEFAULT NULL, flapping_threshold_low SMALLINT UNSIGNED DEFAULT NULL, volatile ENUM('y', 'n') DEFAULT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, command_endpoint_id INT(10) UNSIGNED DEFAULT NULL, notes TEXT DEFAULT NULL, notes_url VARCHAR(255) DEFAULT NULL, action_url VARCHAR(255) DEFAULT NULL, icon_image VARCHAR(255) DEFAULT NULL, icon_image_alt VARCHAR(255) DEFAULT NULL, use_agent ENUM('y', 'n') DEFAULT NULL, apply_for VARCHAR(255) DEFAULT NULL, use_var_overrides ENUM('y', 'n') DEFAULT NULL, assign_filter TEXT DEFAULT NULL, template_choice_id INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE KEY object_key (object_name, host_id), CONSTRAINT icinga_service_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_check_period FOREIGN KEY timeperiod (check_period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_check_command FOREIGN KEY check_command (check_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_event_command FOREIGN KEY event_command (event_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_command_endpoint FOREIGN KEY command_endpoint (command_endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_service_set FOREIGN KEY service_set (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_template_choice FOREIGN KEY choice (template_choice_id) REFERENCES icinga_service_template_choice (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_inheritance ( service_id INT(10) UNSIGNED NOT NULL, parent_service_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (service_id, parent_service_id), UNIQUE KEY unique_order (service_id, weight), CONSTRAINT icinga_service_inheritance_service FOREIGN KEY host (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_inheritance_parent_service FOREIGN KEY host (parent_service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_var ( service_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, varvalue TEXT DEFAULT NULL, format enum ('string', 'json', 'expression'), checksum VARBINARY(20) DEFAULT NULL, PRIMARY KEY (service_id, varname), INDEX search_idx (varname), INDEX checksum (checksum), CONSTRAINT icinga_service_var_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_field ( service_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (service_id, datafield_id), CONSTRAINT icinga_service_field_service FOREIGN KEY service(service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE icinga_service_template_choice ADD CONSTRAINT service_template_choice_required_template FOREIGN KEY required_template (required_template_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE; CREATE TABLE icinga_host_service ( host_id INT(10) UNSIGNED NOT NULL, service_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (host_id, service_id), CONSTRAINT icinga_host_service_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_service_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_host_service_blacklist ( host_id INT(10) UNSIGNED NOT NULL, service_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (host_id, service_id), CONSTRAINT icinga_host_service_bl_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_service_bl_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_service_set_inheritance ( service_set_id INT(10) UNSIGNED NOT NULL, parent_service_set_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (service_set_id, parent_service_set_id), UNIQUE KEY unique_order (service_set_id, weight), CONSTRAINT icinga_service_set_inheritance_set FOREIGN KEY host (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_set_inheritance_parent FOREIGN KEY host (parent_service_set_id) REFERENCES icinga_service_set (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_set_var ( service_set_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, varvalue TEXT DEFAULT NULL, format ENUM('string', 'expression', 'json') NOT NULL DEFAULT 'string', checksum VARBINARY(20) DEFAULT NULL, PRIMARY KEY (service_set_id, varname), INDEX search_idx (varname), INDEX checksum (checksum), CONSTRAINT icinga_service_set_var_service FOREIGN KEY command (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_hostgroup ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) NOT NULL, object_type ENUM('object', 'template', 'external_object') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', display_name VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name), KEY search_idx (display_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- TODO: probably useless CREATE TABLE icinga_hostgroup_inheritance ( hostgroup_id INT(10) UNSIGNED NOT NULL, parent_hostgroup_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (hostgroup_id, parent_hostgroup_id), UNIQUE KEY unique_order (hostgroup_id, weight), CONSTRAINT icinga_hostgroup_inheritance_hostgroup FOREIGN KEY host (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_inheritance_parent_hostgroup FOREIGN KEY host (parent_hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_servicegroup ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', display_name VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name), KEY search_idx (display_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_servicegroup_inheritance ( servicegroup_id INT(10) UNSIGNED NOT NULL, parent_servicegroup_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (servicegroup_id, parent_servicegroup_id), UNIQUE KEY unique_order (servicegroup_id, weight), CONSTRAINT icinga_servicegroup_inheritance_servicegroup FOREIGN KEY host (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_inheritance_parent_servicegroup FOREIGN KEY host (parent_servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_servicegroup_service ( servicegroup_id INT(10) UNSIGNED NOT NULL, service_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (servicegroup_id, service_id), CONSTRAINT icinga_servicegroup_service_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_service_servicegroup FOREIGN KEY servicegroup (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_servicegroup_service_resolved ( servicegroup_id INT(10) UNSIGNED NOT NULL, service_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (servicegroup_id, service_id), CONSTRAINT icinga_servicegroup_service_resolved_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_service_resolved_servicegroup FOREIGN KEY servicegroup (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_hostgroup_host ( hostgroup_id INT(10) UNSIGNED NOT NULL, host_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (hostgroup_id, host_id), CONSTRAINT icinga_hostgroup_host_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_host_hostgroup FOREIGN KEY hostgroup (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_hostgroup_host_resolved ( hostgroup_id INT(10) UNSIGNED NOT NULL, host_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (hostgroup_id, host_id), CONSTRAINT icinga_hostgroup_host_resolved_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_host_resolved_hostgroup FOREIGN KEY hostgroup (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_hostgroup_parent ( hostgroup_id INT(10) UNSIGNED NOT NULL, parent_hostgroup_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (hostgroup_id, parent_hostgroup_id), CONSTRAINT icinga_hostgroup_parent_hostgroup FOREIGN KEY hostgroup (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_parent_parent FOREIGN KEY parent (parent_hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_user ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', display_name VARCHAR(255) DEFAULT NULL, email VARCHAR(255) DEFAULT NULL, pager VARCHAR(255) DEFAULT NULL, enable_notifications ENUM('y', 'n') DEFAULT NULL, period_id INT(10) UNSIGNED DEFAULT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name, zone_id), CONSTRAINT icinga_user_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_user_period FOREIGN KEY period (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_user_inheritance ( user_id INT(10) UNSIGNED NOT NULL, parent_user_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (user_id, parent_user_id), UNIQUE KEY unique_order (user_id, weight), CONSTRAINT icinga_user_inheritance_user FOREIGN KEY host (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_user_inheritance_parent_user FOREIGN KEY host (parent_user_id) REFERENCES icinga_user (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_user_states_set ( user_id INT(10) UNSIGNED NOT NULL, property ENUM( 'OK', 'Warning', 'Critical', 'Unknown', 'Up', 'Down' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (user_id, property, merge_behaviour), CONSTRAINT icinga_user_states_set_user FOREIGN KEY icinga_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_user_types_set ( user_id INT(10) UNSIGNED NOT NULL, property ENUM( 'DowntimeStart', 'DowntimeEnd', 'DowntimeRemoved', 'Custom', 'Acknowledgement', 'Problem', 'Recovery', 'FlappingStart', 'FlappingEnd' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (user_id, property, merge_behaviour), CONSTRAINT icinga_user_types_set_user FOREIGN KEY icinga_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_user_var ( user_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, varvalue TEXT DEFAULT NULL, format ENUM('string', 'json', 'expression') NOT NULL DEFAULT 'string', checksum VARBINARY(20) DEFAULT NULL, PRIMARY KEY (user_id, varname), INDEX search_idx (varname), INDEX checksum (checksum), CONSTRAINT icinga_user_var_user FOREIGN KEY icinga_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_user_field ( user_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (user_id, datafield_id), CONSTRAINT icinga_user_field_user FOREIGN KEY user(user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_user_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_usergroup ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) NOT NULL, object_type ENUM('object', 'template') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', display_name VARCHAR(255) DEFAULT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name), KEY search_idx (display_name), CONSTRAINT icinga_usergroup_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_usergroup_inheritance ( usergroup_id INT(10) UNSIGNED NOT NULL, parent_usergroup_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (usergroup_id, parent_usergroup_id), UNIQUE KEY unique_order (usergroup_id, weight), CONSTRAINT icinga_usergroup_inheritance_usergroup FOREIGN KEY usergroup (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_usergroup_inheritance_parent_usergroup FOREIGN KEY usergroup (parent_usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_usergroup_user ( usergroup_id INT(10) UNSIGNED NOT NULL, user_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (usergroup_id, user_id), CONSTRAINT icinga_usergroup_user_user FOREIGN KEY icinga_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_usergroup_user_usergroup FOREIGN KEY usergroup (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_usergroup_parent ( usergroup_id INT(10) UNSIGNED NOT NULL, parent_usergroup_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (usergroup_id, parent_usergroup_id), CONSTRAINT icinga_usergroup_parent_usergroup FOREIGN KEY usergroup (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_usergroup_parent_parent FOREIGN KEY parent (parent_usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', apply_to ENUM('host', 'service') DEFAULT NULL, host_id INT(10) UNSIGNED DEFAULT NULL, service_id INT(10) UNSIGNED DEFAULT NULL, times_begin INT(10) UNSIGNED DEFAULT NULL, times_end INT(10) UNSIGNED DEFAULT NULL, notification_interval INT(10) UNSIGNED DEFAULT NULL, command_id INT(10) UNSIGNED DEFAULT NULL, period_id INT(10) UNSIGNED DEFAULT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, users_var VARCHAR(255) DEFAULT NULL, user_groups_var VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), CONSTRAINT icinga_notification_host FOREIGN KEY host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_service FOREIGN KEY service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_command FOREIGN KEY command (command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_notification_period FOREIGN KEY period (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_notification_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification_var ( notification_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, varvalue TEXT DEFAULT NULL, format enum ('string', 'json', 'expression'), checksum VARBINARY(20) DEFAULT NULL, PRIMARY KEY (notification_id, varname), INDEX search_idx (varname), INDEX checksum (checksum), CONSTRAINT icinga_notification_var_notification FOREIGN KEY notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification_field ( notification_id INT(10) UNSIGNED NOT NULL COMMENT 'Makes only sense for templates', datafield_id INT(10) UNSIGNED NOT NULL, is_required ENUM('y', 'n') NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (notification_id, datafield_id), CONSTRAINT icinga_notification_field_notification FOREIGN KEY notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_field_datafield FOREIGN KEY datafield(datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification_inheritance ( notification_id INT(10) UNSIGNED NOT NULL, parent_notification_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (notification_id, parent_notification_id), UNIQUE KEY unique_order (notification_id, weight), CONSTRAINT icinga_notification_inheritance_notification FOREIGN KEY host (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_inheritance_parent_notification FOREIGN KEY host (parent_notification_id) REFERENCES icinga_notification (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification_states_set ( notification_id INT(10) UNSIGNED NOT NULL, property ENUM( 'OK', 'Warning', 'Critical', 'Unknown', 'Up', 'Down' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (notification_id, property, merge_behaviour), CONSTRAINT icinga_notification_states_set_notification FOREIGN KEY icinga_notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_notification_types_set ( notification_id INT(10) UNSIGNED NOT NULL, property ENUM( 'DowntimeStart', 'DowntimeEnd', 'DowntimeRemoved', 'Custom', 'Acknowledgement', 'Problem', 'Recovery', 'FlappingStart', 'FlappingEnd' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (notification_id, property, merge_behaviour), CONSTRAINT icinga_notification_types_set_notification FOREIGN KEY icinga_notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_notification_user ( notification_id INT(10) UNSIGNED NOT NULL, user_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (notification_id, user_id), CONSTRAINT icinga_notification_user_user FOREIGN KEY user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_user_notification FOREIGN KEY notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification_usergroup ( notification_id INT(10) UNSIGNED NOT NULL, usergroup_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (notification_id, usergroup_id), CONSTRAINT icinga_notification_usergroup_usergroup FOREIGN KEY usergroup (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_usergroup_notification FOREIGN KEY notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE import_source ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, source_name VARCHAR(64) NOT NULL, key_column VARCHAR(64) NOT NULL, provider_class VARCHAR(128) NOT NULL, import_state ENUM( 'unknown', 'in-sync', 'pending-changes', 'failing' ) NOT NULL DEFAULT 'unknown', last_error_message TEXT DEFAULT NULL, last_attempt TIMESTAMP NULL DEFAULT NULL, description TEXT DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX source_name (source_name), INDEX search_idx (key_column) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE import_source_setting ( source_id INT(10) UNSIGNED NOT NULL, setting_name VARCHAR(64) NOT NULL, setting_value TEXT NOT NULL, PRIMARY KEY (source_id, setting_name), CONSTRAINT import_source_settings_source FOREIGN KEY source (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE import_row_modifier ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, source_id INT(10) UNSIGNED NOT NULL, property_name VARCHAR(255) NOT NULL, target_property VARCHAR(255) DEFAULT NULL, provider_class VARCHAR(128) NOT NULL, priority SMALLINT UNSIGNED NOT NULL, filter_expression TEXT DEFAULT NULL, description TEXT DEFAULT NULL, PRIMARY KEY (id), KEY search_idx (property_name), CONSTRAINT row_modifier_import_source FOREIGN KEY source (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE import_row_modifier_setting ( row_modifier_id INT UNSIGNED NOT NULL, setting_name VARCHAR(64) NOT NULL, setting_value TEXT DEFAULT NULL, PRIMARY KEY (row_modifier_id, setting_name), CONSTRAINT row_modifier_settings FOREIGN KEY row_modifier (row_modifier_id) REFERENCES import_row_modifier (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE imported_rowset ( checksum VARBINARY(20) NOT NULL, PRIMARY KEY (checksum) ) ENGINE=InnoDB; CREATE TABLE import_run ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, source_id INT(10) UNSIGNED NOT NULL, rowset_checksum VARBINARY(20) DEFAULT NULL, start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, end_time TIMESTAMP NULL DEFAULT NULL, succeeded ENUM('y', 'n') DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT import_run_source FOREIGN KEY import_source (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT import_run_rowset FOREIGN KEY rowset (rowset_checksum) REFERENCES imported_rowset (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE imported_row ( checksum VARBINARY(20) NOT NULL COMMENT 'sha1(object_name;property_checksum;...)', object_name VARCHAR(255) NOT NULL, PRIMARY KEY (checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE imported_rowset_row ( rowset_checksum VARBINARY(20) NOT NULL, row_checksum VARBINARY(20) NOT NULL, PRIMARY KEY (rowset_checksum, row_checksum), CONSTRAINT imported_rowset_row_rowset FOREIGN KEY rowset_row_rowset (rowset_checksum) REFERENCES imported_rowset (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT imported_rowset_row_row FOREIGN KEY rowset_row_rowset (row_checksum) REFERENCES imported_row (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE imported_property ( checksum VARBINARY(20) NOT NULL, property_name VARCHAR(64) NOT NULL, property_value MEDIUMTEXT NOT NULL, format enum ('string', 'expression', 'json'), PRIMARY KEY (checksum), KEY search_idx (property_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE imported_row_property ( row_checksum VARBINARY(20) NOT NULL, property_checksum VARBINARY(20) NOT NULL, PRIMARY KEY (row_checksum, property_checksum), CONSTRAINT imported_row_property_row FOREIGN KEY row_checksum (row_checksum) REFERENCES imported_row (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT imported_row_property_property FOREIGN KEY property_checksum (property_checksum) REFERENCES imported_property (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE sync_rule ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, rule_name VARCHAR(255) NOT NULL, object_type enum( 'host', 'service', 'command', 'user', 'hostgroup', 'servicegroup', 'usergroup', 'datalistEntry', 'endpoint', 'zone', 'timePeriod', 'serviceSet', 'scheduledDowntime', 'notification', 'dependency' ) NOT NULL, update_policy ENUM('merge', 'override', 'ignore', 'update-only') NOT NULL, purge_existing ENUM('y', 'n') NOT NULL DEFAULT 'n', purge_action ENUM('delete', 'disable') NULL DEFAULT NULL, filter_expression TEXT DEFAULT NULL, sync_state ENUM( 'unknown', 'in-sync', 'pending-changes', 'failing' ) NOT NULL DEFAULT 'unknown', last_error_message TEXT DEFAULT NULL, last_attempt TIMESTAMP NULL DEFAULT NULL, description TEXT DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX rule_name (rule_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE sync_property ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, rule_id INT(10) UNSIGNED NOT NULL, source_id INT(10) UNSIGNED NOT NULL, source_expression VARCHAR(255) NOT NULL, destination_field VARCHAR(64), priority SMALLINT UNSIGNED NOT NULL, filter_expression TEXT DEFAULT NULL, merge_policy ENUM('override', 'merge') NOT NULL, PRIMARY KEY (id), CONSTRAINT sync_property_rule FOREIGN KEY sync_rule (rule_id) REFERENCES sync_rule (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT sync_property_source FOREIGN KEY import_source (source_id) REFERENCES import_source (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE sync_run ( id BIGINT(10) UNSIGNED AUTO_INCREMENT NOT NULL, rule_id INT(10) UNSIGNED DEFAULT NULL, rule_name VARCHAR(255) NOT NULL, start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, duration_ms INT(10) UNSIGNED DEFAULT NULL, objects_deleted INT(10) UNSIGNED DEFAULT 0, objects_created INT(10) UNSIGNED DEFAULT 0, objects_modified INT(10) UNSIGNED DEFAULT 0, last_former_activity VARBINARY(20) DEFAULT NULL, last_related_activity VARBINARY(20) DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT sync_run_rule FOREIGN KEY sync_rule (rule_id) REFERENCES sync_rule (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_var ( checksum VARBINARY(20) NOT NULL, rendered_checksum VARBINARY(20) NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, varvalue TEXT NOT NULL, rendered TEXT NOT NULL, PRIMARY KEY (checksum), INDEX search_idx (varname) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_flat_var ( var_checksum VARBINARY(20) NOT NULL, flatname_checksum VARBINARY(20) NOT NULL, flatname VARCHAR(512) NOT NULL COLLATE utf8_bin, flatvalue TEXT NOT NULL, PRIMARY KEY (var_checksum, flatname_checksum), INDEX search_varname (flatname (191)), INDEX search_varvalue (flatvalue (128)), CONSTRAINT flat_var_var FOREIGN KEY checksum (var_checksum) REFERENCES icinga_var (checksum) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_command_resolved_var ( command_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (command_id, checksum), INDEX search_varname (varname), CONSTRAINT command_resolved_var_command FOREIGN KEY command (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT command_resolved_var_checksum FOREIGN KEY checksum (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_host_resolved_var ( host_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (host_id, checksum), INDEX search_varname (varname), FOREIGN KEY host_resolved_var_host (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY host_resolved_var_checksum (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_notification_resolved_var ( notification_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (notification_id, checksum), INDEX search_varname (varname), FOREIGN KEY notification_resolved_var_notification (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY notification_resolved_var_checksum (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_set_resolved_var ( service_set_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (service_set_id, checksum), INDEX search_varname (varname), FOREIGN KEY service_set_resolved_var_service_set (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY service_set_resolved_var_checksum(checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_service_resolved_var ( service_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (service_id, checksum), INDEX search_varname (varname), FOREIGN KEY service_resolve_var_service (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY service_resolve_var_checksum(checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_user_resolved_var ( user_id INT(10) UNSIGNED NOT NULL, varname VARCHAR(255) NOT NULL COLLATE utf8_bin, checksum VARBINARY(20) NOT NULL, PRIMARY KEY (user_id, checksum), INDEX search_varname (varname), FOREIGN KEY user_resolve_var_user (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY user_resolve_var_checksum(checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_dependency ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', apply_to ENUM('host', 'service') DEFAULT NULL, parent_host_id INT(10) UNSIGNED DEFAULT NULL, parent_host_var VARCHAR(128) DEFAULT NULL, parent_service_id INT(10) UNSIGNED DEFAULT NULL, child_host_id INT(10) UNSIGNED DEFAULT NULL, child_service_id INT(10) UNSIGNED DEFAULT NULL, disable_checks ENUM('y', 'n') DEFAULT NULL, disable_notifications ENUM('y', 'n') DEFAULT NULL, ignore_soft_states ENUM('y', 'n') DEFAULT NULL, period_id INT(10) UNSIGNED DEFAULT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, assign_filter TEXT DEFAULT NULL, parent_service_by_name VARCHAR(255) DEFAULT NULL, redundancy_group VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), CONSTRAINT icinga_dependency_parent_host FOREIGN KEY parent_host (parent_host_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_parent_service FOREIGN KEY parent_service (parent_service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_child_host FOREIGN KEY child_host (child_host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_child_service FOREIGN KEY child_service (child_service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_period FOREIGN KEY period (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_dependency_inheritance ( dependency_id INT(10) UNSIGNED NOT NULL, parent_dependency_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (dependency_id, parent_dependency_id), UNIQUE KEY unique_order (dependency_id, weight), CONSTRAINT icinga_dependency_inheritance_dependency FOREIGN KEY dependency (dependency_id) REFERENCES icinga_dependency (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_inheritance_parent_dependency FOREIGN KEY parent_dependency (parent_dependency_id) REFERENCES icinga_dependency (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_dependency_states_set ( dependency_id INT(10) UNSIGNED NOT NULL, property ENUM( 'OK', 'Warning', 'Critical', 'Unknown', 'Up', 'Down' ) NOT NULL, merge_behaviour ENUM('override', 'extend', 'blacklist') NOT NULL DEFAULT 'override' COMMENT 'override: = [], extend: += [], blacklist: -= []', PRIMARY KEY (dependency_id, property, merge_behaviour), CONSTRAINT icinga_dependency_states_set_dependency FOREIGN KEY icinga_dependency (dependency_id) REFERENCES icinga_dependency (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB; CREATE TABLE icinga_timeperiod_include ( timeperiod_id INT(10) UNSIGNED NOT NULL, include_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (timeperiod_id, include_id), CONSTRAINT icinga_timeperiod_include FOREIGN KEY timeperiod (include_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT icinga_timeperiod_include_timeperiod FOREIGN KEY include (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_timeperiod_exclude ( timeperiod_id INT(10) UNSIGNED NOT NULL, exclude_id INT(10) UNSIGNED NOT NULL, PRIMARY KEY (timeperiod_id, exclude_id), CONSTRAINT icinga_timeperiod_exclude FOREIGN KEY timeperiod (exclude_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT icinga_timeperiod_exclude_timeperiod FOREIGN KEY exclude (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_scheduled_downtime ( id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, uuid VARBINARY(16) NOT NULL, object_name VARCHAR(255) NOT NULL, zone_id INT(10) UNSIGNED DEFAULT NULL, object_type ENUM('object', 'template', 'apply') NOT NULL, disabled ENUM('y', 'n') NOT NULL DEFAULT 'n', apply_to ENUM('host', 'service') DEFAULT NULL, assign_filter TEXT DEFAULT NULL, author VARCHAR(255) DEFAULT NULL, comment TEXT DEFAULT NULL, fixed ENUM('y', 'n') DEFAULT NULL, duration INT(10) UNSIGNED DEFAULT NULL, with_services ENUM('y', 'n') NULL DEFAULT NULL, PRIMARY KEY (id), UNIQUE INDEX uuid (uuid), UNIQUE INDEX object_name (object_name), CONSTRAINT icinga_scheduled_downtime_zone FOREIGN KEY zone (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_scheduled_downtime_inheritance ( scheduled_downtime_id INT(10) UNSIGNED NOT NULL, parent_scheduled_downtime_id INT(10) UNSIGNED NOT NULL, weight MEDIUMINT UNSIGNED DEFAULT NULL, PRIMARY KEY (scheduled_downtime_id, parent_scheduled_downtime_id), UNIQUE KEY unique_order (scheduled_downtime_id, weight), CONSTRAINT icinga_scheduled_downtime_inheritance_downtime FOREIGN KEY host (scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_scheduled_downtime_inheritance_parent_downtime FOREIGN KEY host (parent_scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE RESTRICT ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE icinga_scheduled_downtime_range ( scheduled_downtime_id INT(10) UNSIGNED AUTO_INCREMENT NOT NULL, range_key VARCHAR(255) NOT NULL COMMENT 'monday, ...', range_value VARCHAR(255) NOT NULL COMMENT '00:00-24:00, ...', range_type ENUM('include', 'exclude') NOT NULL DEFAULT 'include' COMMENT 'include -> ranges {}, exclude ranges_ignore {} - not yet', merge_behaviour ENUM('set', 'add', 'substract') NOT NULL DEFAULT 'set' COMMENT 'set -> = {}, add -> += {}, substract -> -= {}', PRIMARY KEY (scheduled_downtime_id, range_type, range_key), CONSTRAINT icinga_scheduled_downtime_range_downtime FOREIGN KEY scheduled_downtime (scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_branch ( uuid VARBINARY(16) NOT NULL, owner VARCHAR(255) NOT NULL, branch_name VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, ts_merge_request BIGINT DEFAULT NULL, PRIMARY KEY(uuid), UNIQUE KEY (branch_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE director_branch_activity ( timestamp_ns BIGINT(20) NOT NULL, object_uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, action ENUM ('create', 'modify', 'delete') NOT NULL, object_table VARCHAR(64) NOT NULL, author VARCHAR(255) NOT NULL, former_properties LONGTEXT NOT NULL, -- json-encoded modified_properties LONGTEXT NOT NULL, PRIMARY KEY (timestamp_ns), INDEX object_uuid (object_uuid), INDEX branch_uuid (branch_uuid), CONSTRAINT branch_activity_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_host ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, address VARCHAR(255) DEFAULT NULL, address6 VARCHAR(45) DEFAULT NULL, check_command VARCHAR(255) DEFAULT NULL, max_check_attempts MEDIUMINT UNSIGNED DEFAULT NULL, check_period VARCHAR(255) DEFAULT NULL, check_interval VARCHAR(8) DEFAULT NULL, retry_interval VARCHAR(8) DEFAULT NULL, check_timeout SMALLINT UNSIGNED DEFAULT NULL, enable_notifications ENUM('y', 'n') DEFAULT NULL, enable_active_checks ENUM('y', 'n') DEFAULT NULL, enable_passive_checks ENUM('y', 'n') DEFAULT NULL, enable_event_handler ENUM('y', 'n') DEFAULT NULL, enable_flapping ENUM('y', 'n') DEFAULT NULL, enable_perfdata ENUM('y', 'n') DEFAULT NULL, event_command VARCHAR(255) DEFAULT NULL, flapping_threshold_high SMALLINT UNSIGNED DEFAULT NULL, flapping_threshold_low SMALLINT UNSIGNED DEFAULT NULL, volatile ENUM('y', 'n') DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, command_endpoint VARCHAR(255) DEFAULT NULL, notes TEXT DEFAULT NULL, notes_url VARCHAR(255) DEFAULT NULL, action_url VARCHAR(255) DEFAULT NULL, icon_image VARCHAR(255) DEFAULT NULL, icon_image_alt VARCHAR(255) DEFAULT NULL, has_agent ENUM('y', 'n') DEFAULT NULL, master_should_connect ENUM('y', 'n') DEFAULT NULL, accept_config ENUM('y', 'n') DEFAULT NULL, custom_endpoint_name VARCHAR(255) DEFAULT NULL, api_key VARCHAR(40) DEFAULT NULL, imports TEXT DEFAULT NULL, `groups` TEXT DEFAULT NULL, vars MEDIUMTEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_host_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_hostgroup ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_hostgroup_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_servicegroup ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_servicegroup_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_usergroup ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_usergroup_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_user ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, email VARCHAR(255) DEFAULT NULL, pager VARCHAR(255) DEFAULT NULL, enable_notifications ENUM('y', 'n') DEFAULT NULL, period VARCHAR(255) DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, states TEXT DEFAULT NULL, types TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, `groups` TEXT DEFAULT NULL, vars MEDIUMTEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_user_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_zone ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, parent VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, is_global ENUM('y', 'n') DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_zone_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_timeperiod ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, update_method VARCHAR(64) DEFAULT NULL COMMENT 'Usually LegacyTimePeriod', zone VARCHAR(255) DEFAULT NULL, prefer_includes ENUM('y', 'n') DEFAULT NULL, imports TEXT DEFAULT NULL, ranges TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_timeperiod_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_command ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, methods_execute VARCHAR(64) DEFAULT NULL, command TEXT DEFAULT NULL, is_string ENUM('y', 'n') NULL, timeout SMALLINT UNSIGNED DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, arguments TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_command_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_apiuser ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, password VARCHAR(255) DEFAULT NULL, client_dn VARCHAR(64) DEFAULT NULL, permissions TEXT DEFAULT NULL COMMENT 'JSON-encoded permissions', set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_apiuser_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_endpoint ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, host VARCHAR(255) DEFAULT NULL, port SMALLINT UNSIGNED DEFAULT NULL, log_duration VARCHAR(32) DEFAULT NULL, apiuser VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_endpoint_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_service ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, display_name VARCHAR(255) DEFAULT NULL, host VARCHAR(255) DEFAULT NULL, service_set VARCHAR(255) DEFAULT NULL, check_command VARCHAR(255) DEFAULT NULL, max_check_attempts MEDIUMINT UNSIGNED DEFAULT NULL, check_period VARCHAR(255) DEFAULT NULL, check_interval VARCHAR(8) DEFAULT NULL, retry_interval VARCHAR(8) DEFAULT NULL, check_timeout SMALLINT UNSIGNED DEFAULT NULL, enable_notifications ENUM('y', 'n') DEFAULT NULL, enable_active_checks ENUM('y', 'n') DEFAULT NULL, enable_passive_checks ENUM('y', 'n') DEFAULT NULL, enable_event_handler ENUM('y', 'n') DEFAULT NULL, enable_flapping ENUM('y', 'n') DEFAULT NULL, enable_perfdata ENUM('y', 'n') DEFAULT NULL, event_command VARCHAR(255) DEFAULT NULL, flapping_threshold_high SMALLINT UNSIGNED DEFAULT NULL, flapping_threshold_low SMALLINT UNSIGNED DEFAULT NULL, volatile ENUM('y', 'n') DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, command_endpoint VARCHAR(255) DEFAULT NULL, notes TEXT DEFAULT NULL, notes_url VARCHAR(255) DEFAULT NULL, action_url VARCHAR(255) DEFAULT NULL, icon_image VARCHAR(255) DEFAULT NULL, icon_image_alt VARCHAR(255) DEFAULT NULL, use_agent ENUM('y', 'n') DEFAULT NULL, apply_for VARCHAR(255) DEFAULT NULL, use_var_overrides ENUM('y', 'n') DEFAULT NULL, assign_filter TEXT DEFAULT NULL, -- template_choice VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, `groups` TEXT DEFAULT NULL, vars MEDIUMTEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), INDEX search_object_name (object_name), INDEX search_display_name (display_name), CONSTRAINT icinga_service_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_service_set ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(128) DEFAULT NULL, object_type ENUM('object', 'template', 'external_object') DEFAULT NULL, host VARCHAR(255) DEFAULT NULL, description TEXT DEFAULT NULL, assign_filter TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), INDEX search_object_name (object_name), CONSTRAINT icinga_service_set_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_notification ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, apply_to ENUM('host', 'service') DEFAULT NULL, host VARCHAR(255) DEFAULT NULL, service VARCHAR(255) DEFAULT NULL, times_begin INT(10) UNSIGNED DEFAULT NULL, times_end INT(10) UNSIGNED DEFAULT NULL, notification_interval INT(10) UNSIGNED DEFAULT NULL, command VARCHAR(255) DEFAULT NULL, period VARCHAR(255) DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, users_var VARCHAR(255) DEFAULT NULL, user_groups_var VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, states TEXT DEFAULT NULL, types TEXT DEFAULT NULL, users TEXT DEFAULT NULL, usergroups TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, vars MEDIUMTEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_notification_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_scheduled_downtime ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, apply_to ENUM('host', 'service') DEFAULT NULL, assign_filter TEXT DEFAULT NULL, author VARCHAR(255) DEFAULT NULL, comment TEXT DEFAULT NULL, fixed ENUM('y', 'n') DEFAULT NULL, duration INT(10) UNSIGNED DEFAULT NULL, with_services ENUM('y', 'n') NULL DEFAULT NULL, imports TEXT DEFAULT NULL, ranges TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_scheduled_downtime_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE branched_icinga_dependency ( uuid VARBINARY(16) NOT NULL, branch_uuid VARBINARY(16) NOT NULL, branch_created ENUM('y', 'n') NOT NULL DEFAULT 'n', branch_deleted ENUM('y', 'n') NOT NULL DEFAULT 'n', object_name VARCHAR(255) DEFAULT NULL, object_type ENUM('object', 'template', 'apply') DEFAULT NULL, disabled ENUM('y', 'n') DEFAULT NULL, apply_to ENUM('host', 'service') DEFAULT NULL, parent_host VARCHAR(255) DEFAULT NULL, parent_host_var VARCHAR(128) DEFAULT NULL, parent_service VARCHAR(255) DEFAULT NULL, child_host VARCHAR(255) DEFAULT NULL, child_service VARCHAR(255) DEFAULT NULL, disable_checks ENUM('y', 'n') DEFAULT NULL, disable_notifications ENUM('y', 'n') DEFAULT NULL, ignore_soft_states ENUM('y', 'n') DEFAULT NULL, period VARCHAR(255) DEFAULT NULL, zone VARCHAR(255) DEFAULT NULL, assign_filter TEXT DEFAULT NULL, parent_service_by_name VARCHAR(255) DEFAULT NULL, redundancy_group VARCHAR(255) DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), UNIQUE INDEX branch_object_name (branch_uuid, object_name), INDEX search_object_name (object_name), CONSTRAINT icinga_dependency_branch FOREIGN KEY branch (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (191, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/000077500000000000000000000000001516513262500241545ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-10.sql000066400000000000000000000015121516513262500265410ustar00rootroot00000000000000CREATE TABLE icinga_usergroup_inheritance ( usergroup_id integer NOT NULL, parent_usergroup_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (usergroup_id, parent_usergroup_id), CONSTRAINT icinga_usergroup_inheritance_usergroup FOREIGN KEY (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_usergroup_inheritance_parent_usergroup FOREIGN KEY (parent_usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX usergroup_inheritance_unique_order ON icinga_usergroup_inheritance (usergroup_id, weight); CREATE INDEX usergroup_inheritance_usergroup ON icinga_usergroup_inheritance (usergroup_id); CREATE INDEX usergroup_inheritance_usergroup_parent ON icinga_usergroup_inheritance (parent_usergroup_id); icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-11.sql000066400000000000000000000014621516513262500265460ustar00rootroot00000000000000CREATE TABLE icinga_endpoint_inheritance ( endpoint_id integer NOT NULL, parent_endpoint_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (endpoint_id, parent_endpoint_id), CONSTRAINT icinga_endpoint_inheritance_endpoint FOREIGN KEY (endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_endpoint_inheritance_parent_endpoint FOREIGN KEY (parent_endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX endpoint_inheritance_unique_order ON icinga_endpoint_inheritance (endpoint_id, weight); CREATE INDEX endpoint_inheritance_endpoint ON icinga_endpoint_inheritance (endpoint_id); CREATE INDEX endpoint_inheritance_endpoint_parent ON icinga_endpoint_inheritance (parent_endpoint_id); icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-2.sql000066400000000000000000000001121516513262500264550ustar00rootroot00000000000000ALTER TABLE icinga_zone ADD is_global enum_boolean NOT NULL DEFAULT 'n'; icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-3.sql000066400000000000000000000014331516513262500264650ustar00rootroot00000000000000CREATE TABLE icinga_service_inheritance ( service_id integer NOT NULL, parent_service_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (service_id, parent_service_id), CONSTRAINT icinga_service_inheritance_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_inheritance_parent_service FOREIGN KEY (parent_service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_inheritance_unique_order ON icinga_service_inheritance (service_id, weight); CREATE INDEX service_inheritance_service ON icinga_service_inheritance (service_id); CREATE INDEX service_inheritance_service_parent ON icinga_service_inheritance (parent_service_id); icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-4.sql000066400000000000000000000013211516513262500264620ustar00rootroot00000000000000CREATE TABLE icinga_user_inheritance ( user_id integer NOT NULL, parent_user_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (user_id, parent_user_id), CONSTRAINT icinga_user_inheritance_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_user_inheritance_parent_user FOREIGN KEY (parent_user_id) REFERENCES icinga_user (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX user_inheritance_unique_order ON icinga_user_inheritance (user_id, weight); CREATE INDEX user_inheritance_user ON icinga_user_inheritance (user_id); CREATE INDEX user_inheritance_user_parent ON icinga_user_inheritance (parent_user_id);icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-5.sql000066400000000000000000000015411516513262500264670ustar00rootroot00000000000000CREATE TABLE icinga_timeperiod_inheritance ( timeperiod_id integer NOT NULL, parent_timeperiod_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (timeperiod_id, parent_timeperiod_id), CONSTRAINT icinga_timeperiod_inheritance_timeperiod FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_timeperiod_inheritance_parent_timeperiod FOREIGN KEY (parent_timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX timeperiod_inheritance_unique_order ON icinga_timeperiod_inheritance (timeperiod_id, weight); CREATE INDEX timeperiod_inheritance_timeperiod ON icinga_timeperiod_inheritance (timeperiod_id); CREATE INDEX timeperiod_inheritance_timeperiod_parent ON icinga_timeperiod_inheritance (parent_timeperiod_id);icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-6.sql000066400000000000000000000015111516513262500264650ustar00rootroot00000000000000CREATE TABLE icinga_hostgroup_inheritance ( hostgroup_id integer NOT NULL, parent_hostgroup_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (hostgroup_id, parent_hostgroup_id), CONSTRAINT icinga_hostgroup_inheritance_hostgroup FOREIGN KEY (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_inheritance_parent_hostgroup FOREIGN KEY (parent_hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX hostgroup_inheritance_unique_order ON icinga_hostgroup_inheritance (hostgroup_id, weight); CREATE INDEX hostgroup_inheritance_hostgroup ON icinga_hostgroup_inheritance (hostgroup_id); CREATE INDEX hostgroup_inheritance_hostgroup_parent ON icinga_hostgroup_inheritance (parent_hostgroup_id);icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-7.sql000066400000000000000000000016221516513262500264710ustar00rootroot00000000000000CREATE TABLE icinga_servicegroup_inheritance ( servicegroup_id integer NOT NULL, parent_servicegroup_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (servicegroup_id, parent_servicegroup_id), CONSTRAINT icinga_servicegroup_inheritance_servicegroup FOREIGN KEY (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_inheritance_parent_servicegroup FOREIGN KEY (parent_servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX servicegroup_inheritance_unique_order ON icinga_servicegroup_inheritance (servicegroup_id, weight); CREATE INDEX servicegroup_inheritance_servicegroup ON icinga_servicegroup_inheritance (servicegroup_id); CREATE INDEX servicegroup_inheritance_servicegroup_parent ON icinga_servicegroup_inheritance (parent_servicegroup_id); icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-8.sql000066400000000000000000000014321516513262500264710ustar00rootroot00000000000000CREATE TABLE icinga_command_inheritance ( command_id integer NOT NULL, parent_command_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (command_id, parent_command_id), CONSTRAINT icinga_command_inheritance_command FOREIGN KEY (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_command_inheritance_parent_command FOREIGN KEY (parent_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX command_inheritance_unique_order ON icinga_command_inheritance (command_id, weight); CREATE INDEX command_inheritance_command ON icinga_command_inheritance (command_id); CREATE INDEX command_inheritance_command_parent ON icinga_command_inheritance (parent_command_id); icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade-9.sql000066400000000000000000000013221516513262500264700ustar00rootroot00000000000000CREATE TABLE icinga_zone_inheritance ( zone_id integer NOT NULL, parent_zone_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (zone_id, parent_zone_id), CONSTRAINT icinga_zone_inheritance_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_zone_inheritance_parent_zone FOREIGN KEY (parent_zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX zone_inheritance_unique_order ON icinga_zone_inheritance (zone_id, weight); CREATE INDEX zone_inheritance_zone ON icinga_zone_inheritance (zone_id); CREATE INDEX zone_inheritance_zone_parent ON icinga_zone_inheritance (parent_zone_id); icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade_1.sql000066400000000000000000000010761516513262500265500ustar00rootroot00000000000000ALTER TABLE icinga_hostgroup_parent DROP CONSTRAINT icinga_hostgroup_parent_parent; ALTER TABLE icinga_hostgroup_parent ADD CONSTRAINT icinga_hostgroup_parent_parent FOREIGN KEY (parent_hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE icinga_usergroup_parent DROP CONSTRAINT icinga_usergroup_parent_parent; ALTER TABLE icinga_usergroup_parent ADD CONSTRAINT icinga_usergroup_parent_parent FOREIGN KEY (parent_usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE RESTRICT ON UPDATE CASCADE;icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade_21.sql000066400000000000000000000007471516513262500266360ustar00rootroot00000000000000DROP TABLE director_datalist_value; CREATE TABLE director_datalist_entry ( list_id integer NOT NULL, entry_name character varying(255) DEFAULT NULL, entry_value text DEFAULT NULL, format enum_property_format, PRIMARY KEY (list_id, entry_name), CONSTRAINT director_datalist_entry_datalist FOREIGN KEY (list_id) REFERENCES director_datalist (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX datalist_entry_datalist ON director_datalist_entry (list_id); icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade_22.sql000066400000000000000000000037111516513262500266310ustar00rootroot00000000000000CREATE TABLE icinga_host_field ( host_id integer NOT NULL, fieldname character varying(64) NOT NULL, caption character varying(255) NOT NULL, datatype_id integer NOT NULL, -- datatype_param? multiple ones? default_value text DEFAULT NULL, format enum_property_format, PRIMARY KEY (host_id, fieldname), CONSTRAINT icinga_host_field_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_field_datatype FOREIGN KEY (datatype_id) REFERENCES director_datatype (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX host_field_key ON icinga_host_field (host_id, fieldname); CREATE INDEX host_field_search_idx ON icinga_host_field (fieldname); CREATE INDEX host_field_host ON icinga_host_field (host_id); CREATE INDEX host_field_datatype ON icinga_host_field (datatype); COMMENT ON COLUMN icinga_host_field.host_id IS 'Makes only sense for templates'; CREATE TABLE icinga_service_field ( service_id integer NOT NULL, fieldname character varying(64) NOT NULL, caption character varying(255) NOT NULL, datatype_id integer NOT NULL, -- datatype_param? multiple ones? default_value text DEFAULT NULL, format enum_property_format, PRIMARY KEY (service_id, fieldname), CONSTRAINT icinga_service_field_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_field_datatype FOREIGN KEY datatype (datatype_id) REFERENCES director_datatype (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_field_key ON icinga_service_field (service_id, fieldname); CREATE INDEX service_field_search_idx ON icinga_service_field (fieldname); CREATE INDEX service_field_service ON icinga_service_field (service_id); CREATE INDEX service_field_datatype ON icinga_service_field (datatype); COMMENT ON COLUMN icinga_service_field.service_id IS 'Makes only sense for templates'; icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade_23.sql000066400000000000000000000036501516513262500266340ustar00rootroot00000000000000DROP TABLE director_datatype; CREATE TABLE director_datafield ( id serial, varname character varying(255) NOT NULL, caption character varying(255) NOT NULL, description text DEFAULT NULL, datatype character varying(255) NOT NULL, -- datatype_param? multiple ones? format enum_property_format, PRIMARY KEY (id) ); DROP TABLE icinga_host_field; CREATE TABLE icinga_host_field ( host_id integer NOT NULL, datafield_id integer NOT NULL, is_required enum_boolean DEFAULT NULL, PRIMARY KEY (host_id, datafield_id), CONSTRAINT icinga_host_field_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_field_datafield FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX host_field_key ON icinga_host_field (host_id, datafield_id); CREATE INDEX host_field_host ON icinga_host_field (host_id); CREATE INDEX host_field_datafield ON icinga_host_field (datafield_id); COMMENT ON COLUMN icinga_host_field.host_id IS 'Makes only sense for templates'; DROP TABLE icinga_service_field; CREATE TABLE icinga_service_field ( service_id integer NOT NULL, datafield_id integer NOT NULL, is_required enum_boolean DEFAULT NULL, PRIMARY KEY (service_id, datafield_id), CONSTRAINT icinga_service_field_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_field_datafield FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_field_key ON icinga_service_field (service_id, datafield_id); CREATE INDEX service_field_service ON icinga_service_field (service_id); CREATE INDEX service_field_datafield ON icinga_service_field (datafield_id); COMMENT ON COLUMN icinga_service_field.service_id IS 'Makes only sense for templates'; icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade_34.sql000066400000000000000000000131131516513262500266310ustar00rootroot00000000000000ALTER TABLE director_generated_file ALTER COLUMN content SET DEFAULT NULL; ALTER TABLE icinga_host_field ALTER COLUMN is_required SET NOT NULL; ALTER TABLE icinga_service_field ALTER COLUMN is_required SET NOT NULL; CREATE TABLE import_source ( id serial, source_name character varying(64) NOT NULL, key_column character varying(64) NOT NULL, provider_class character varying(72) NOT NULL, PRIMARY KEY (id) ); CREATE INDEX import_source_search_idx ON import_source (key_column); CREATE TABLE import_source_setting ( source_id integer NOT NULL, setting_name character varying(64) NOT NULL, setting_value text NOT NULL, PRIMARY KEY (source_id, setting_name), CONSTRAINT import_source_settings_source FOREIGN KEY (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX import_source_setting_source ON import_source_setting (source_id); CREATE TABLE imported_rowset ( checksum bytea CHECK(LENGTH(checksum) = 20), PRIMARY KEY (checksum) ); CREATE TABLE import_run ( id serial, source_id integer NOT NULL, rowset_checksum bytea CHECK(LENGTH(rowset_checksum) = 20), start_time timestamp with time zone NOT NULL, end_time timestamp with time zone NOT NULL, succeeded enum_boolean DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT import_run_source FOREIGN KEY (source_id) REFERENCES import_source (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT import_run_rowset FOREIGN KEY (rowset_checksum) REFERENCES imported_rowset (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX import_run_import_source ON import_run (source_id); CREATE INDEX import_run_rowset ON import_run (rowset_checksum); CREATE TABLE imported_row ( checksum bytea CHECK(LENGTH(checksum) = 20), object_name character varying(255) NOT NULL, PRIMARY KEY (checksum) ); COMMENT ON COLUMN imported_row.checksum IS 'sha1(object_name;property_checksum;...)'; CREATE TABLE imported_rowset_row ( rowset_checksum bytea CHECK(LENGTH(checksum) = 20), row_checksum bytea CHECK(LENGTH(checksum) = 20), PRIMARY KEY (rowset_checksum, row_checksum), CONSTRAINT imported_rowset_row_rowset FOREIGN KEY (rowset_checksum) REFERENCES imported_rowset (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT imported_rowset_row_row FOREIGN KEY (row_checksum) REFERENCES imported_row (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX imported_rowset_row_rowset_checksum ON imported_rowset_row (rowset_checksum); CREATE INDEX imported_rowset_row_row_checksum ON imported_rowset_row (row_checksum); CREATE TABLE imported_property ( checksum bytea CHECK(LENGTH(checksum) = 20), property_name character varying(64) NOT NULL, property_value text NOT NULL, format enum_property_format, PRIMARY KEY (checksum) ); CREATE INDEX imported_property_search_idx ON imported_property (property_name); CREATE TABLE imported_row_property ( row_checksum bytea CHECK(LENGTH(row_checksum) = 20), property_checksum bytea CHECK(LENGTH(property_checksum) = 20), PRIMARY KEY (row_checksum, property_checksum), CONSTRAINT imported_row_property_row FOREIGN KEY (row_checksum) REFERENCES imported_row (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT imported_row_property_property FOREIGN KEY (property_checksum) REFERENCES imported_property (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX imported_row_property_row_checksum ON imported_row_property (row_checksum); CREATE INDEX imported_row_property_property_checksum ON imported_row_property (property_checksum); CREATE TYPE enum_sync_rule_object_type AS ENUM('host', 'user'); CREATE TYPE enum_sync_rule_update_policy AS ENUM('merge', 'override', 'ignore'); CREATE TABLE sync_rule ( id serial, rule_name character varying(255) NOT NULL, object_type enum_sync_rule_object_type NOT NULL, update_policy enum_sync_rule_update_policy NOT NULL, purge_existing enum_boolean NOT NULL DEFAULT 'n', filter_expression text DEFAULT NULL, PRIMARY KEY (id) ); CREATE TYPE enum_sync_property_merge_policy AS ENUM('override', 'merge'); CREATE TABLE sync_property ( id serial, rule_id integer NOT NULL, source_id integer NOT NULL, source_expression character varying(255) NOT NULL, destination_field character varying(64), priority smallint NOT NULL, filter_expression text DEFAULT NULL, merge_policy enum_sync_property_merge_policy NOT NULL, PRIMARY KEY (id), CONSTRAINT sync_property_rule FOREIGN KEY (rule_id) REFERENCES sync_rule (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT sync_property_source FOREIGN KEY (source_id) REFERENCES import_source (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX sync_property_rule ON sync_property (rule_id); CREATE INDEX sync_property_source ON sync_property (source_id); CREATE TABLE import_row_modifier ( id serial, property_id integer NOT NULL, provider_class character varying(72) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE import_row_modifier_setting ( modifier_id integer NOT NULL, setting_name character varying(64) NOT NULL, setting_value text DEFAULT NULL, PRIMARY KEY (modifier_id) ); CREATE TABLE director_datafield_setting ( datafield_id integer NOT NULL, setting_name character varying(64) NOT NULL, setting_value text NOT NULL, PRIMARY KEY (datafield_id, setting_name), CONSTRAINT datafield_id_settings FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX director_datafield_datafield ON director_datafield_setting (datafield_id); icingaweb2-module-director-1.11.8/schema/pgsql-legacy-changes/upgrade_35.sql000066400000000000000000000002121516513262500266260ustar00rootroot00000000000000ALTER TABLE icinga_command_argument DROP COLUMN value_format, ADD COLUMN argument_format enum_property_format NOT NULL DEFAULT 'string'; icingaweb2-module-director-1.11.8/schema/pgsql-migrations/000077500000000000000000000000001516513262500234565ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_100.sql000066400000000000000000000003031516513262500262020ustar00rootroot00000000000000ALTER TABLE import_row_modifier ADD COLUMN target_property character varying(255) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (100, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_101.sql000066400000000000000000000003571516513262500262140ustar00rootroot00000000000000ALTER TABLE icinga_host ADD COLUMN api_key character varying(40) DEFAULT NULL; CREATE UNIQUE INDEX host_api_key ON icinga_host (api_key); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (101, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_102.sql000066400000000000000000000005721516513262500262140ustar00rootroot00000000000000UPDATE director_deployment_log SET startup_log = LEFT(startup_log, 20480) || ' [..] shortened ' || (LENGTH(startup_log) - 40960) || ' bytes by Director on schema upgrade [..] ' || RIGHT(startup_log, 20480) WHERE LENGTH(startup_log) > 61440; VACUUM FULL director_deployment_log; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (102, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_103.sql000066400000000000000000000004461516513262500262150ustar00rootroot00000000000000UPDATE icinga_command_argument SET argument_name = '(no key)', skip_key = 'y' WHERE argument_name is null; ALTER TABLE icinga_command_argument ALTER COLUMN argument_name SET NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (103, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_104.sql000066400000000000000000000014341516513262500262140ustar00rootroot00000000000000ALTER TABLE icinga_timeperiod_range ADD COLUMN range_key character varying(255) DEFAULT NULL, ADD COLUMN range_value character varying(255) DEFAULT NULL; UPDATE icinga_timeperiod_range SET range_key = timeperiod_key, range_value = timeperiod_value; ALTER TABLE icinga_timeperiod_range ALTER COLUMN range_key SET NOT NULL, ALTER COLUMN range_key DROP DEFAULT, ALTER COLUMN range_value SET NOT NULL, ALTER COLUMN range_value DROP DEFAULT; ALTER TABLE icinga_timeperiod_range DROP CONSTRAINT icinga_timeperiod_range_pkey, ADD PRIMARY KEY (timeperiod_id, range_type, range_key); ALTER TABLE icinga_timeperiod_range DROP COLUMN timeperiod_key, DROP COLUMN timeperiod_value; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (104, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_105.sql000066400000000000000000000002661516513262500262170ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN use_var_overrides enum_boolean DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (105, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_106.sql000066400000000000000000000003421516513262500262130ustar00rootroot00000000000000ALTER TABLE sync_property ALTER COLUMN merge_policy DROP NOT NULL; ALTER TABLE sync_run ALTER COLUMN rule_id DROP NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (106, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_107.sql000066400000000000000000000003561516513262500262210ustar00rootroot00000000000000ALTER TABLE import_source ALTER COLUMN last_error_message TYPE TEXT; ALTER TABLE sync_rule ALTER COLUMN last_error_message TYPE TEXT; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (107, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_109.sql000066400000000000000000000006761516513262500262300ustar00rootroot00000000000000CREATE TABLE icinga_hostgroup_assignment ( id bigserial, hostgroup_id integer NOT NULL, filter_string TEXT NOT NULL, assign_type enum_assign_type NOT NULL DEFAULT 'assign', PRIMARY KEY (id), CONSTRAINT icinga_hostgroup_assignment FOREIGN KEY (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (109, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_110.sql000066400000000000000000000046101516513262500262100ustar00rootroot00000000000000UPDATE icinga_host_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_host_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_service_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_service_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_command_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_command_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_user_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_user_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_notification_var SET varvalue = 'false', format = 'json' WHERE varvalue = 'n' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); UPDATE icinga_notification_var SET varvalue = 'true', format = 'json' WHERE varvalue = 'y' AND varname IN ( SELECT DISTINCT varname FROM director_datafield WHERE datatype LIKE '%DataTypeBoolean' ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (110, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_111.sql000066400000000000000000000004421516513262500262100ustar00rootroot00000000000000ALTER TABLE import_run DROP CONSTRAINT import_run_source, ADD CONSTRAINT import_run_source FOREIGN KEY (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE RESTRICT; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (111, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_113.sql000066400000000000000000000003641516513262500262150ustar00rootroot00000000000000COMMENT ON COLUMN icinga_timeperiod_range.range_key IS 'monday, ...'; COMMENT ON COLUMN icinga_timeperiod_range.range_value IS '00:00-24:00, ...'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (113, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_114.sql000066400000000000000000000033631516513262500262200ustar00rootroot00000000000000CREATE TABLE icinga_service_set ( id serial, host_id integer NOT NULL, object_name character varying(128) NOT NULL, object_type enum_object_type_all NOT NULL, description text NOT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX service_set_name ON icinga_service_set (object_name, host_id); CREATE TABLE icinga_service_set_service ( service_set_id serial, service_id serial, PRIMARY KEY (service_set_id, service_id), CONSTRAINT icinga_service_set_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_set_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE TABLE icinga_service_set_assignment ( id serial, service_set_id integer NOT NULL, filter_string text NOT NULL, assign_type enum_assign_type NOT NULL DEFAULT 'assign', PRIMARY KEY (id), CONSTRAINT icinga_service_set_assignment FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_service_set_var ( service_set_id integer NOT NULL, varname character varying(255) NOT NULL, varvalue text DEFAULT NULL, format enum_property_format NOT NULL DEFAULT 'string', PRIMARY KEY (service_set_id, varname), CONSTRAINT icinga_service_set_var_service_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX service_set_var_service_set ON icinga_service_set_var (service_set_id); CREATE INDEX service_set_var_search_idx ON icinga_service_set_var (varname); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (114, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_115.sql000066400000000000000000000020771516513262500262220ustar00rootroot00000000000000CREATE TABLE icinga_service_set_inheritance ( service_set_id integer NOT NULL, parent_service_set_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (service_set_id, parent_service_set_id), CONSTRAINT icinga_service_set_inheritance_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_set_inheritance_parent FOREIGN KEY (parent_service_set_id) REFERENCES icinga_service_set (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_set_inheritance_unique_order ON icinga_service_set_inheritance (service_set_id, weight); CREATE INDEX service_set_inheritance_set ON icinga_service_set_inheritance (service_set_id); CREATE INDEX service_set_inheritance_parent ON icinga_service_set_inheritance (parent_service_set_id); ALTER TABLE icinga_service_set ALTER COLUMN host_id DROP NOT NULL; ALTER TABLE icinga_service_set ALTER COLUMN description DROP NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (115, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_116.sql000066400000000000000000000003351516513262500262160ustar00rootroot00000000000000ALTER TYPE enum_sync_rule_object_type ADD VALUE 'timePeriod'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'serviceSet'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (116, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_117.sql000066400000000000000000000017501516513262500262210ustar00rootroot00000000000000CREATE TABLE icinga_notification_field ( notification_id integer NOT NULL, datafield_id integer NOT NULL, is_required enum_boolean NOT NULL, PRIMARY KEY (notification_id, datafield_id), CONSTRAINT icinga_notification_field_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_field_datafield FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX notification_field_key ON icinga_notification_field (notification_id, datafield_id); CREATE INDEX notification_field_notification ON icinga_notification_field (notification_id); CREATE INDEX notification_field_datafield ON icinga_notification_field (datafield_id); COMMENT ON COLUMN icinga_notification_field.notification_id IS 'Makes only sense for templates'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (117, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_119.sql000066400000000000000000000002701516513262500262170ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN apply_for character varying(255) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (119, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_120.sql000066400000000000000000000146271516513262500262220ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN assign_filter text DEFAULT NULL; WITH flat_assign AS ( SELECT service_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa.filter_string) ELSE ARRAY_TO_STRING(ARRAY_AGG(sa.filter_string), '&') END AS filter_string FROM ( SELECT sa_not.service_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa_not.filter_string) ELSE '(' || ARRAY_TO_STRING(ARRAY_AGG(sa_not.filter_string), '&') || ')' END AS filter_string FROM ( SELECT sa.service_id, '!' || sa.filter_string AS filter_string FROM icinga_service_assignment sa WHERE assign_type = 'ignore' ) sa_not GROUP BY service_id UNION ALL SELECT sa_yes.service_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa_yes.filter_string) ELSE '(' || ARRAY_TO_STRING(ARRAY_AGG(sa_yes.filter_string), '|') || ')' END AS filter_string FROM ( SELECT sa.service_id, sa.filter_string AS filter_string FROM icinga_service_assignment sa WHERE assign_type = 'assign' ) sa_yes GROUP BY service_id ) sa GROUP BY service_id ) UPDATE icinga_service s SET assign_filter = flat_assign.filter_string FROM flat_assign WHERE s.id = flat_assign.service_id; DROP TABLE icinga_service_assignment; ALTER TABLE icinga_service_set ADD COLUMN assign_filter text DEFAULT NULL; WITH flat_assign AS ( SELECT service_set_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa.filter_string) ELSE ARRAY_TO_STRING(ARRAY_AGG(sa.filter_string), '&') END AS filter_string FROM ( SELECT sa_not.service_set_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa_not.filter_string) ELSE '(' || ARRAY_TO_STRING(ARRAY_AGG(sa_not.filter_string), '&') || ')' END AS filter_string FROM ( SELECT sa.service_set_id, '!' || sa.filter_string AS filter_string FROM icinga_service_set_assignment sa WHERE assign_type = 'ignore' ) sa_not GROUP BY service_set_id UNION ALL SELECT sa_yes.service_set_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa_yes.filter_string) ELSE '(' || ARRAY_TO_STRING(ARRAY_AGG(sa_yes.filter_string), '|') || ')' END AS filter_string FROM ( SELECT sa.service_set_id, sa.filter_string AS filter_string FROM icinga_service_set_assignment sa WHERE assign_type = 'assign' ) sa_yes GROUP BY service_set_id ) sa GROUP BY service_set_id ) UPDATE icinga_service_set s SET assign_filter = flat_assign.filter_string FROM flat_assign WHERE s.id = flat_assign.service_set_id; DROP TABLE icinga_service_set_assignment; ALTER TABLE icinga_notification ADD COLUMN assign_filter text DEFAULT NULL; WITH flat_assign AS ( SELECT notification_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa.filter_string) ELSE ARRAY_TO_STRING(ARRAY_AGG(sa.filter_string), '&') END AS filter_string FROM ( SELECT sa_not.notification_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa_not.filter_string) ELSE '(' || ARRAY_TO_STRING(ARRAY_AGG(sa_not.filter_string), '&') || ')' END AS filter_string FROM ( SELECT sa.notification_id, '!' || sa.filter_string AS filter_string FROM icinga_notification_assignment sa WHERE assign_type = 'ignore' ) sa_not GROUP BY notification_id UNION ALL SELECT sa_yes.notification_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa_yes.filter_string) ELSE '(' || ARRAY_TO_STRING(ARRAY_AGG(sa_yes.filter_string), '|') || ')' END AS filter_string FROM ( SELECT sa.notification_id, sa.filter_string AS filter_string FROM icinga_notification_assignment sa WHERE assign_type = 'assign' ) sa_yes GROUP BY notification_id ) sa GROUP BY notification_id ) UPDATE icinga_notification s SET assign_filter = flat_assign.filter_string FROM flat_assign WHERE s.id = flat_assign.notification_id; DROP TABLE icinga_notification_assignment; ALTER TABLE icinga_hostgroup ADD COLUMN assign_filter text DEFAULT NULL; WITH flat_assign AS ( SELECT hostgroup_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa.filter_string) ELSE ARRAY_TO_STRING(ARRAY_AGG(sa.filter_string), '&') END AS filter_string FROM ( SELECT sa_not.hostgroup_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa_not.filter_string) ELSE '(' || ARRAY_TO_STRING(ARRAY_AGG(sa_not.filter_string), '&') || ')' END AS filter_string FROM ( SELECT sa.hostgroup_id, '!' || sa.filter_string AS filter_string FROM icinga_hostgroup_assignment sa WHERE assign_type = 'ignore' ) sa_not GROUP BY hostgroup_id UNION ALL SELECT sa_yes.hostgroup_id, CASE WHEN COUNT(*) = 0 THEN NULL WHEN COUNT(*) = 1 THEN MAX(sa_yes.filter_string) ELSE '(' || ARRAY_TO_STRING(ARRAY_AGG(sa_yes.filter_string), '|') || ')' END AS filter_string FROM ( SELECT sa.hostgroup_id, sa.filter_string AS filter_string FROM icinga_hostgroup_assignment sa WHERE assign_type = 'assign' ) sa_yes GROUP BY hostgroup_id ) sa GROUP BY hostgroup_id ) UPDATE icinga_hostgroup s SET assign_filter = flat_assign.filter_string FROM flat_assign WHERE s.id = flat_assign.hostgroup_id; DROP TABLE icinga_hostgroup_assignment; ALTER TABLE icinga_servicegroup ADD COLUMN assign_filter text DEFAULT NULL; DROP TYPE enum_assign_type; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (120, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_121.sql000066400000000000000000000003261516513262500262120ustar00rootroot00000000000000ALTER TABLE icinga_service ADD COLUMN service_set_id integer DEFAULT NULL; DROP TABLE icinga_service_set_service; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (121, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_122.sql000066400000000000000000000005101516513262500262060ustar00rootroot00000000000000ALTER TABLE director_generated_file ADD COLUMN cnt_apply SMALLINT NOT NULL DEFAULT 0; UPDATE director_generated_file SET cnt_apply = ROUND( (LENGTH(content) - LENGTH( REPLACE(content, 'apply ', '') ) ) / LENGTH('apply ') ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (122, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_123.sql000066400000000000000000000016731516513262500262220ustar00rootroot00000000000000-- cleanup dangling service_set before we add foreign key DELETE FROM icinga_service_set AS ss WHERE NOT EXISTS ( SELECT 1 FROM icinga_host AS h WHERE h.id = ss.host_id ) AND object_type = 'object' AND host_id IS NOT NULL; -- cleanup dangling services to service_set DELETE FROM icinga_service AS s WHERE NOT EXISTS ( SELECT 1 FROM icinga_service_set AS ss WHERE ss.id = s.service_set_id ) AND object_type IN ('object', 'apply') AND service_set_id IS NOT NULL; ALTER TABLE icinga_service_set ADD CONSTRAINT icinga_service_set_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE icinga_service ADD CONSTRAINT icinga_service_service_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (123, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_124.sql000066400000000000000000000011321516513262500262110ustar00rootroot00000000000000ALTER TABLE icinga_service_set DROP CONSTRAINT icinga_service_set_host; ALTER TABLE icinga_service_set ADD CONSTRAINT icinga_service_set_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE icinga_service DROP CONSTRAINT icinga_service_service_set; ALTER TABLE icinga_service ADD CONSTRAINT icinga_service_service_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (124, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_125.sql000066400000000000000000000007401516513262500262160ustar00rootroot00000000000000ALTER TABLE icinga_command_field ADD COLUMN var_filter TEXT DEFAULT NULL; ALTER TABLE icinga_host_field ADD COLUMN var_filter TEXT DEFAULT NULL; ALTER TABLE icinga_notification_field ADD COLUMN var_filter TEXT DEFAULT NULL; ALTER TABLE icinga_service_field ADD COLUMN var_filter TEXT DEFAULT NULL; ALTER TABLE icinga_user_field ADD COLUMN var_filter TEXT DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (125, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_127.sql000066400000000000000000000154571516513262500262330ustar00rootroot00000000000000ALTER TABLE icinga_command_var ADD COLUMN checksum bytea DEFAULT NULL CHECK(LENGTH(checksum) = 20); CREATE INDEX command_var_search_idx ON icinga_command_var (varname); CREATE INDEX command_var_checksum ON icinga_command_var (checksum); ALTER TABLE icinga_host_var ADD COLUMN checksum bytea DEFAULT NULL CHECK(LENGTH(checksum) = 20); CREATE INDEX host_var_checksum ON icinga_host_var (checksum); ALTER TABLE icinga_notification_var ADD COLUMN checksum bytea DEFAULT NULL CHECK(LENGTH(checksum) = 20); CREATE INDEX notification_var_command ON icinga_notification_var (notification_id); CREATE INDEX notification_var_checksum ON icinga_notification_var (checksum); ALTER TABLE icinga_service_set_var ADD COLUMN checksum bytea DEFAULT NULL CHECK(LENGTH(checksum) = 20); CREATE INDEX service_set_var_checksum ON icinga_service_set_var (checksum); ALTER TABLE icinga_service_var ADD COLUMN checksum bytea DEFAULT NULL CHECK(LENGTH(checksum) = 20); CREATE INDEX service_var_checksum ON icinga_service_var (checksum); ALTER TABLE icinga_user_var ADD COLUMN checksum bytea DEFAULT NULL CHECK(LENGTH(checksum) = 20); CREATE INDEX user_var_checksum ON icinga_user_var (checksum); CREATE TABLE icinga_var ( checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), rendered_checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), varname character varying(255) NOT NULL, varvalue TEXT NOT NULL, rendered TEXT NOT NULL, PRIMARY KEY (checksum) ); CREATE INDEX var_search_idx ON icinga_var (varname); CREATE TABLE icinga_flat_var ( var_checksum bytea NOT NULL CHECK(LENGTH(var_checksum) = 20), flatname_checksum bytea NOT NULL CHECK(LENGTH(flatname_checksum) = 20), flatname character varying(512) NOT NULL, flatvalue TEXT NOT NULL, PRIMARY KEY (var_checksum, flatname_checksum), CONSTRAINT flat_var_var FOREIGN KEY (var_checksum) REFERENCES icinga_var (checksum) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX flat_var_var_checksum ON icinga_flat_var (var_checksum); CREATE INDEX flat_var_search_varname ON icinga_flat_var (flatname); CREATE INDEX flat_var_search_varvalue ON icinga_flat_var (flatvalue); CREATE TABLE icinga_command_resolved_var ( command_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (command_id, checksum), CONSTRAINT command_resolved_var_command FOREIGN KEY (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT command_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX command_resolved_var_search_varname ON icinga_command_resolved_var (varname); CREATE INDEX command_resolved_var_command_id ON icinga_command_resolved_var (command_id); CREATE INDEX command_resolved_var_schecksum ON icinga_command_resolved_var (checksum); CREATE TABLE icinga_host_resolved_var ( host_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (host_id, checksum), CONSTRAINT host_resolved_var_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT host_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX host_resolved_var_search_varname ON icinga_host_resolved_var (varname); CREATE INDEX host_resolved_var_host_id ON icinga_host_resolved_var (host_id); CREATE INDEX host_resolved_var_schecksum ON icinga_host_resolved_var (checksum); CREATE TABLE icinga_notification_resolved_var ( notification_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (notification_id, checksum), CONSTRAINT notification_resolved_var_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT notification_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX notification_resolved_var_search_varname ON icinga_notification_resolved_var (varname); CREATE INDEX notification_resolved_var_notification_id ON icinga_notification_resolved_var (notification_id); CREATE INDEX notification_resolved_var_schecksum ON icinga_notification_resolved_var (checksum); CREATE TABLE icinga_service_set_resolved_var ( service_set_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (service_set_id, checksum), CONSTRAINT service_set_resolved_var_service_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT service_set_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX service_set_resolved_var_search_varname ON icinga_service_set_resolved_var (varname); CREATE INDEX service_set_resolved_var_service_set_id ON icinga_service_set_resolved_var (service_set_id); CREATE INDEX service_set_resolved_var_schecksum ON icinga_service_set_resolved_var (checksum); CREATE TABLE icinga_service_resolved_var ( service_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (service_id, checksum), CONSTRAINT service_resolved_var_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT service_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX service_resolved_var_search_varname ON icinga_service_resolved_var (varname); CREATE INDEX service_resolved_var_service_id ON icinga_service_resolved_var (service_id); CREATE INDEX service_resolved_var_schecksum ON icinga_service_resolved_var (checksum); CREATE TABLE icinga_user_resolved_var ( user_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (user_id, checksum), CONSTRAINT user_resolved_var_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT user_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX user_resolved_var_search_varname ON icinga_user_resolved_var (varname); CREATE INDEX user_resolved_var_user_id ON icinga_user_resolved_var (user_id); CREATE INDEX user_resolved_var_schecksum ON icinga_user_resolved_var (checksum); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (127, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_128.sql000066400000000000000000000002451516513262500262210ustar00rootroot00000000000000CREATE INDEX activity_log_author ON director_activity_log (author); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (128, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_131.sql000066400000000000000000000013511516513262500262120ustar00rootroot00000000000000CREATE TABLE icinga_hostgroup_host_resolved ( hostgroup_id integer NOT NULL, host_id integer NOT NULL, PRIMARY KEY (hostgroup_id, host_id), CONSTRAINT icinga_hostgroup_host_resolved_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_host_resolved_hostgroup FOREIGN KEY (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX hostgroup_host_resolved_host ON icinga_hostgroup_host_resolved (host_id); CREATE INDEX hostgroup_host_resolved_hostgroup ON icinga_hostgroup_host_resolved (hostgroup_id); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (131, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_132.sql000066400000000000000000000013711516513262500262150ustar00rootroot00000000000000CREATE TABLE icinga_host_template_choice ( id serial, object_name character varying(64) NOT NULL, description text DEFAULT NULL, min_required smallint NOT NULL DEFAULT 0, max_allowed smallint NOT NULL DEFAULT 1, PRIMARY KEY (id) ); CREATE UNIQUE INDEX host_template_choice_object_name ON icinga_host_template_choice (object_name); ALTER TABLE icinga_host ADD COLUMN template_choice_id int DEFAULT NULL, ADD CONSTRAINT icinga_host_template_choice FOREIGN KEY (template_choice_id) REFERENCES icinga_host_template_choice (id) ON DELETE RESTRICT ON UPDATE CASCADE; CREATE INDEX host_template_choice ON icinga_host (template_choice_id); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (132, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_133.sql000066400000000000000000000014211516513262500262120ustar00rootroot00000000000000CREATE TABLE icinga_service_template_choice ( id serial, object_name character varying(64) NOT NULL, description text DEFAULT NULL, min_required smallint NOT NULL DEFAULT 0, max_allowed smallint NOT NULL DEFAULT 1, PRIMARY KEY (id) ); CREATE UNIQUE INDEX service_template_choice_object_name ON icinga_service_template_choice (object_name); ALTER TABLE icinga_service ADD COLUMN template_choice_id int DEFAULT NULL, ADD CONSTRAINT icinga_service_template_choice FOREIGN KEY (template_choice_id) REFERENCES icinga_service_template_choice (id) ON DELETE RESTRICT ON UPDATE CASCADE; CREATE INDEX service_template_choice ON icinga_service (template_choice_id); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (133, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_134.sql000066400000000000000000000011321516513262500262120ustar00rootroot00000000000000ALTER TABLE icinga_host DROP CONSTRAINT icinga_host_template_choice, ADD CONSTRAINT icinga_host_template_choice_v2 FOREIGN KEY (template_choice_id) REFERENCES icinga_host_template_choice (id) ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE icinga_service DROP CONSTRAINT icinga_service_template_choice, ADD CONSTRAINT icinga_service_template_choice_v2 FOREIGN KEY (template_choice_id) REFERENCES icinga_service_template_choice (id) ON DELETE SET NULL ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (134, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_135.sql000066400000000000000000000003711516513262500262170ustar00rootroot00000000000000ALTER TABLE icinga_host ADD COLUMN check_timeout smallint DEFAULT NULL; ALTER TABLE icinga_service ADD COLUMN check_timeout smallint DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (135, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_136.sql000066400000000000000000000003051516513262500262150ustar00rootroot00000000000000ALTER TABLE director_datalist_entry ADD COLUMN allowed_roles character varying(255) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (136, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_137.sql000066400000000000000000000003521516513262500262200ustar00rootroot00000000000000ALTER TABLE import_source ADD COLUMN description text DEFAULT NULL; ALTER TABLE sync_rule ADD COLUMN description text DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (137, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_138.sql000066400000000000000000000002551516513262500262230ustar00rootroot00000000000000ALTER TABLE import_row_modifier ADD COLUMN description text DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (138, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_139.sql000066400000000000000000000003561516513262500262260ustar00rootroot00000000000000UPDATE import_row_modifier SET priority = id; CREATE UNIQUE INDEX import_row_modifier_prio ON import_row_modifier (source_id, priority); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (139, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_140.sql000066400000000000000000000002271516513262500262130ustar00rootroot00000000000000UPDATE sync_property SET priority = 10000 - priority; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (140, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_141.sql000066400000000000000000000003161516513262500262130ustar00rootroot00000000000000UPDATE icinga_service_set SET object_type = 'template' WHERE object_type = 'object' AND host_id IS NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (141, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_142.sql000066400000000000000000000005041516513262500262130ustar00rootroot00000000000000ALTER TABLE import_run DROP CONSTRAINT import_run_source; ALTER TABLE import_run ADD CONSTRAINT import_run_source FOREIGN KEY (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE RESTRICT; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (142, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_143.sql000066400000000000000000000017421516513262500262210ustar00rootroot00000000000000ALTER TABLE icinga_host_template_choice ADD COLUMN required_template_id integer DEFAULT NULL, ADD COLUMN allowed_roles character varying(255) DEFAULT NULL, ADD CONSTRAINT host_template_choice_required_template FOREIGN KEY (required_template_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE icinga_service_template_choice ADD COLUMN required_template_id integer DEFAULT NULL, ADD COLUMN allowed_roles character varying(255) DEFAULT NULL, ADD CONSTRAINT service_template_choice_required_template FOREIGN KEY (required_template_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE; CREATE INDEX host_template_choice_required_template ON icinga_host_template_choice (required_template_id); CREATE INDEX service_template_choice_required_template ON icinga_service_template_choice (required_template_id); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (143, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_144.sql000066400000000000000000000071171516513262500262240ustar00rootroot00000000000000CREATE TABLE icinga_dependency ( id serial, object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean DEFAULT 'n', apply_to enum_host_service NULL DEFAULT NULL, parent_host_id integer DEFAULT NULL, parent_service_id integer DEFAULT NULL, child_host_id integer DEFAULT NULL, child_service_id integer DEFAULT NULL, disable_checks enum_boolean DEFAULT NULL, disable_notifications enum_boolean DEFAULT NULL, ignore_soft_states enum_boolean DEFAULT NULL, period_id integer DEFAULT NULL, zone_id integer DEFAULT NULL, assign_filter text DEFAULT NULL, parent_service_by_name character varying(255), PRIMARY KEY (id), CONSTRAINT icinga_dependency_parent_host FOREIGN KEY (parent_host_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_parent_service FOREIGN KEY (parent_service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_child_host FOREIGN KEY (child_host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_child_service FOREIGN KEY (child_service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_period FOREIGN KEY (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX dependency_parent_host ON icinga_dependency (parent_host_id); CREATE INDEX dependency_parent_service ON icinga_dependency (parent_service_id); CREATE INDEX dependency_child_host ON icinga_dependency (child_host_id); CREATE INDEX dependency_child_service ON icinga_dependency (child_service_id); CREATE INDEX dependency_period ON icinga_dependency (period_id); CREATE INDEX dependency_zone ON icinga_dependency (zone_id); CREATE TABLE icinga_dependency_inheritance ( dependency_id integer NOT NULL, parent_dependency_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (dependency_id, parent_dependency_id), CONSTRAINT icinga_dependency_inheritance_dependency FOREIGN KEY (dependency_id) REFERENCES icinga_dependency (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_inheritance_parent_dependency FOREIGN KEY (parent_dependency_id) REFERENCES icinga_dependency (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX dependency_inheritance_unique_order ON icinga_dependency_inheritance (dependency_id, weight); CREATE INDEX dependency_inheritance_dependency ON icinga_dependency_inheritance (dependency_id); CREATE INDEX dependency_inheritance_dependency_parent ON icinga_dependency_inheritance (parent_dependency_id); CREATE TABLE icinga_dependency_states_set ( dependency_id integer NOT NULL, property enum_state_name NOT NULL, merge_behaviour enum_set_merge_behaviour NOT NULL DEFAULT 'override', PRIMARY KEY (dependency_id, property, merge_behaviour), CONSTRAINT icinga_dependency_states_set_dependency FOREIGN KEY (dependency_id) REFERENCES icinga_dependency (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX dependency_states_set_dependency ON icinga_dependency_states_set (dependency_id); COMMENT ON COLUMN icinga_dependency_states_set.merge_behaviour IS 'override: = [], extend: += [], blacklist: -= []'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (144, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_146.sql000066400000000000000000000007101516513262500262160ustar00rootroot00000000000000ALTER TABLE icinga_host DROP COLUMN flapping_threshold, ADD COLUMN flapping_threshold_high smallint DEFAULT NULL, ADD COLUMN flapping_threshold_low smallint DEFAULT NULL; ALTER TABLE icinga_service DROP COLUMN flapping_threshold, ADD COLUMN flapping_threshold_high smallint DEFAULT NULL, ADD COLUMN flapping_threshold_low smallint DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (146, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_147.sql000066400000000000000000000012651516513262500262250ustar00rootroot00000000000000CREATE TABLE icinga_host_service_blacklist( host_id integer NOT NULL, service_id integer NOT NULL, PRIMARY KEY (host_id, service_id), CONSTRAINT icinga_host_service__bl_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_service_bl_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX host_service_bl_host ON icinga_host_service_blacklist (host_id); CREATE INDEX host_service_bl_service ON icinga_host_service_blacklist (service_id); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (147, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_148.sql000066400000000000000000000004231516513262500262210ustar00rootroot00000000000000ALTER TABLE import_source ALTER COLUMN provider_class TYPE character varying(128); ALTER TABLE import_row_modifier ALTER COLUMN provider_class TYPE character varying(128); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (148, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_149.sql000066400000000000000000000005611516513262500262250ustar00rootroot00000000000000ALTER TABLE icinga_usergroup ADD COLUMN zone_id integer DEFAULT NULL, ADD CONSTRAINT icinga_usergroup_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE; CREATE INDEX usergroup_zone ON icinga_usergroup (zone_id); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (149, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_150.sql000066400000000000000000000006421516513262500262150ustar00rootroot00000000000000UPDATE icinga_user u SET period_id = NULL WHERE NOT EXISTS ( SELECT id FROM icinga_timeperiod WHERE id = u.period_id ) AND u.period_id IS NOT NULL; ALTER TABLE icinga_user ADD CONSTRAINT icinga_user_period FOREIGN KEY (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (150, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_151.sql000066400000000000000000000020771516513262500262220ustar00rootroot00000000000000ALTER TABLE icinga_timeperiod ADD COLUMN prefer_includes enum_boolean DEFAULT NULL; CREATE TABLE icinga_timeperiod_include ( timeperiod_id integer NOT NULL, include_id integer NOT NULL, PRIMARY KEY (timeperiod_id, include_id), CONSTRAINT icinga_timeperiod_timeperiod_include FOREIGN KEY (include_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_timeperiod_include FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_timeperiod_exclude ( timeperiod_id integer NOT NULL, exclude_id integer NOT NULL, PRIMARY KEY (timeperiod_id, exclude_id), CONSTRAINT icinga_timeperiod_timeperiod_exclude FOREIGN KEY (exclude_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_timeperiod_exclude FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (151, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_152.sql000066400000000000000000000003441516513262500262160ustar00rootroot00000000000000CREATE UNIQUE INDEX import_source_name ON import_source (source_name); CREATE UNIQUE INDEX sync_rule_name ON sync_rule (rule_name); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (152, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_153.sql000066400000000000000000000024641516513262500262240ustar00rootroot00000000000000CREATE TYPE enum_owner_type AS ENUM('user', 'usergroup', 'role'); CREATE TABLE director_basket ( uuid bytea CHECK(LENGTH(uuid) = 16) NOT NULL, basket_name VARCHAR(64) NOT NULL, owner_type enum_owner_type NOT NULL, owner_value VARCHAR(255) NOT NULL, objects text NOT NULL, -- json-encoded PRIMARY KEY (uuid) ); CREATE UNIQUE INDEX basket_basket_name ON director_basket (basket_name); CREATE TABLE director_basket_content ( checksum bytea CHECK(LENGTH(checksum) = 20) NOT NULL, summary VARCHAR(255) NOT NULL, -- json content text NOT NULL, -- json PRIMARY KEY (checksum) ); CREATE TABLE director_basket_snapshot ( basket_uuid bytea CHECK(LENGTH(basket_uuid) = 16) NOT NULL, ts_create bigint NOT NULL, content_checksum bytea CHECK(LENGTH(content_checksum) = 20) NOT NULL, PRIMARY KEY (basket_uuid, ts_create), CONSTRAINT basked_snapshot_basket FOREIGN KEY (basket_uuid) REFERENCES director_basket (uuid) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT basked_snapshot_content FOREIGN KEY (content_checksum) REFERENCES director_basket_content (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX basket_snapshot_sort_idx ON director_basket_snapshot (ts_create); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (153, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_154.sql000066400000000000000000000004111516513262500262130ustar00rootroot00000000000000 UPDATE icinga_command_argument SET argument_format = NULL WHERE argument_value IS NULL; UPDATE icinga_command_argument SET set_if_format = NULL WHERE set_if IS NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (154, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_155.sql000066400000000000000000000014751516513262500262270ustar00rootroot00000000000000CREATE TABLE icinga_servicegroup_service_resolved ( servicegroup_id integer NOT NULL, service_id integer NOT NULL, PRIMARY KEY (servicegroup_id, service_id), CONSTRAINT icinga_servicegroup_service_resolved_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_service_resolved_servicegroup FOREIGN KEY (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX servicegroup_service_resolved_service ON icinga_servicegroup_service_resolved (service_id); CREATE INDEX servicegroup_service_resolved_servicegroup ON icinga_servicegroup_service_resolved (servicegroup_id); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (155, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_156.sql000066400000000000000000000003241516513262500262200ustar00rootroot00000000000000DROP INDEX IF EXISTS command_object_name; CREATE UNIQUE INDEX command_object_name ON icinga_command (object_name); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (156, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_157.sql000066400000000000000000000002571516513262500262260ustar00rootroot00000000000000ALTER TABLE director_basket_content ALTER COLUMN summary TYPE VARCHAR(500); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (157, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_158.sql000066400000000000000000000003421516513262500262220ustar00rootroot00000000000000DROP INDEX IF EXISTS notification_var_search_idx; CREATE INDEX notification_var_search_idx ON icinga_notification_var (varname); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (158, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_160.sql000066400000000000000000000002461516513262500262160ustar00rootroot00000000000000ALTER TABLE icinga_command ADD COLUMN is_string enum_boolean NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (160, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_161.sql000066400000000000000000000057311516513262500262230ustar00rootroot00000000000000CREATE TABLE icinga_scheduled_downtime ( id serial, object_name character varying(255) NOT NULL, zone_id integer DEFAULT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', apply_to enum_host_service NULL DEFAULT NULL, assign_filter text DEFAULT NULL, author character varying(255) DEFAULT NULL, comment text DEFAULT NULL, fixed enum_boolean DEFAULT NULL, duration int DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_scheduled_downtime_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX scheduled_downtime_object_name ON icinga_scheduled_downtime (object_name); CREATE INDEX scheduled_downtime_zone ON icinga_scheduled_downtime (zone_id); CREATE TABLE icinga_scheduled_downtime_inheritance ( scheduled_downtime_id integer NOT NULL, parent_scheduled_downtime_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (scheduled_downtime_id, parent_scheduled_downtime_id), CONSTRAINT icinga_scheduled_downtime_inheritance_scheduled_downtime FOREIGN KEY (scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_scheduled_downtime_inheritance_parent_scheduled_downtime FOREIGN KEY (parent_scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX scheduled_downtime_inheritance_unique_order ON icinga_scheduled_downtime_inheritance (scheduled_downtime_id, weight); CREATE INDEX scheduled_downtime_inheritance_scheduled_downtime ON icinga_scheduled_downtime_inheritance (scheduled_downtime_id); CREATE INDEX scheduled_downtime_inheritance_scheduled_downtime_parent ON icinga_scheduled_downtime_inheritance (parent_scheduled_downtime_id); CREATE TABLE icinga_scheduled_downtime_range ( scheduled_downtime_id serial, range_key character varying(255) NOT NULL, range_value character varying(255) NOT NULL, range_type enum_timeperiod_range_type NOT NULL DEFAULT 'include', merge_behaviour enum_merge_behaviour NOT NULL DEFAULT 'set', PRIMARY KEY (scheduled_downtime_id, range_type, range_key), CONSTRAINT icinga_scheduled_downtime_range_scheduled_downtime FOREIGN KEY (scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX scheduled_downtime_range_scheduled_downtime ON icinga_scheduled_downtime_range (scheduled_downtime_id); COMMENT ON COLUMN icinga_scheduled_downtime_range.range_key IS 'monday, ...'; COMMENT ON COLUMN icinga_scheduled_downtime_range.range_value IS '00:00-24:00, ...'; COMMENT ON COLUMN icinga_scheduled_downtime_range.range_type IS 'include -> ranges {}, exclude ranges_ignore {} - not yet'; COMMENT ON COLUMN icinga_scheduled_downtime_range.merge_behaviour IS 'set -> = {}, add -> += {}, substract -> -= {}'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (161, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_162.sql000066400000000000000000000003021516513262500262110ustar00rootroot00000000000000ALTER TABLE icinga_scheduled_downtime ADD COLUMN with_services enum_boolean NULL DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (162, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_164.sql000066400000000000000000000003011516513262500262120ustar00rootroot00000000000000ALTER TABLE icinga_dependency ADD COLUMN parent_host_var character varying(128) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (164, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_165.sql000066400000000000000000000002551516513262500262230ustar00rootroot00000000000000ALTER TABLE icinga_host ALTER COLUMN address TYPE character varying(255); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (165, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_166.sql000066400000000000000000000004441516513262500262240ustar00rootroot00000000000000ALTER TYPE enum_sync_rule_object_type ADD VALUE 'scheduledDowntime'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'notification'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'dependency'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (166, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_167.sql000066400000000000000000000015771516513262500262350ustar00rootroot00000000000000CREATE TABLE director_daemon_info ( instance_uuid_hex character varying(32) NOT NULL, -- random by daemon schema_version SMALLINT NOT NULL, fqdn character varying(255) NOT NULL, username character varying(64) NOT NULL, pid integer NOT NULL, binary_path character varying(128) NOT NULL, binary_realpath character varying(128) NOT NULL, php_binary_path character varying(128) NOT NULL, php_binary_realpath character varying(128) NOT NULL, php_version character varying(64) NOT NULL, php_integer_size SMALLINT NOT NULL, running_with_systemd enum_boolean DEFAULT NULL, ts_started bigint NOT NULL, ts_stopped bigint DEFAULT NULL, ts_last_modification bigint DEFAULT NULL, ts_last_update bigint NOT NULL, process_info text NOT NULL, PRIMARY KEY (instance_uuid_hex) ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (167, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_168.sql000066400000000000000000000012371516513262500262270ustar00rootroot00000000000000 CREATE TABLE director_datafield_category ( id serial, category_name character varying(255) NOT NULL, description text DEFAULT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX datafield_category_name ON director_datafield_category (category_name); ALTER TABLE director_datafield ADD COLUMN category_id integer DEFAULT NULL, ADD CONSTRAINT director_datafield_category FOREIGN KEY (category_id) REFERENCES director_datafield_category (id) ON DELETE RESTRICT ON UPDATE CASCADE; CREATE INDEX datafield_category ON director_datafield (category_id); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (168, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_169.sql000066400000000000000000000003601516513262500262240ustar00rootroot00000000000000CREATE DOMAIN d_smallint AS integer CHECK (VALUE >= 0) CHECK (VALUE < 65536); ALTER TABLE icinga_endpoint ALTER COLUMN port TYPE d_smallint; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (169, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_170.sql000066400000000000000000000002611516513262500262140ustar00rootroot00000000000000ALTER TYPE enum_sync_rule_update_policy ADD VALUE 'update-only' AFTER 'ignore'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (170, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_171.sql000066400000000000000000000001401516513262500262110ustar00rootroot00000000000000INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (171, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_172.sql000066400000000000000000000005671516513262500262270ustar00rootroot00000000000000CREATE TYPE enum_sync_rule_purge_action AS ENUM('delete', 'disable'); ALTER TABLE sync_rule ADD COLUMN purge_action enum_sync_rule_purge_action NULL DEFAULT NULL; UPDATE sync_rule SET purge_action = 'delete'; ALTER TABLE sync_rule ALTER COLUMN purge_action SET NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (172, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_173.sql000066400000000000000000000002451516513262500262210ustar00rootroot00000000000000ALTER TABLE sync_rule ALTER COLUMN purge_action SET DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (173, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_174.sql000066400000000000000000000072361516513262500262310ustar00rootroot00000000000000ALTER TABLE icinga_zone DROP COLUMN IF EXISTS uuid; ALTER TABLE icinga_zone ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_zone SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_zone ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_timeperiod ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_timeperiod SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_timeperiod ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_command ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_command SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_command ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_apiuser ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_apiuser SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_apiuser ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_endpoint ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_endpoint SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_endpoint ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_host ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_host SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_host ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_service ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_service SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_service ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_hostgroup ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_hostgroup SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_hostgroup ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_servicegroup ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_servicegroup SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_servicegroup ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_user ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_user SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_user ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_usergroup ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_usergroup SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_usergroup ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_notification ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_notification SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_notification ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_dependency ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_dependency SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_dependency ALTER COLUMN uuid SET NOT NULL; ALTER TABLE icinga_scheduled_downtime ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_scheduled_downtime SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_scheduled_downtime ALTER COLUMN uuid SET NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (174, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_175.sql000066400000000000000000000467521516513262500262400ustar00rootroot00000000000000CREATE TABLE director_branch ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), owner character varying(255) NOT NULL, branch_name character varying(255) NOT NULL, description text DEFAULT NULL, ts_merge_request bigint DEFAULT NULL, PRIMARY KEY(uuid) ); CREATE UNIQUE INDEX branch_branch_name ON director_branch (branch_name); CREATE TYPE enum_branch_action AS ENUM('create', 'modify', 'delete'); CREATE TABLE director_branch_activity ( timestamp_ns bigint NOT NULL, object_uuid bytea NOT NULL CHECK(LENGTH(object_uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), action enum_branch_action NOT NULL, object_table character varying(64) NOT NULL, author character varying(255) NOT NULL, former_properties text NOT NULL, modified_properties text NOT NULL, PRIMARY KEY (timestamp_ns), CONSTRAINT branch_activity_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX branch_activity_object_uuid ON director_branch_activity (object_uuid); CREATE INDEX branch_activity_branch_uuid ON director_branch_activity (branch_uuid); CREATE TABLE branched_icinga_host ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name CHARACTER VARYING(255) DEFAULT NULL, address character varying(255) DEFAULT NULL, address6 character varying(45) DEFAULT NULL, check_command character varying(255) DEFAULT NULL, max_check_attempts integer DEFAULT NULL, check_period character varying(255) DEFAULT NULL, check_interval character varying(8) DEFAULT NULL, retry_interval character varying(8) DEFAULT NULL, check_timeout smallint DEFAULT NULL, enable_notifications enum_boolean DEFAULT NULL, enable_active_checks enum_boolean DEFAULT NULL, enable_passive_checks enum_boolean DEFAULT NULL, enable_event_handler enum_boolean DEFAULT NULL, enable_flapping enum_boolean DEFAULT NULL, enable_perfdata enum_boolean DEFAULT NULL, event_command character varying(255) DEFAULT NULL, flapping_threshold_high smallint default null, flapping_threshold_low smallint default null, volatile enum_boolean DEFAULT NULL, zone character varying(255) DEFAULT NULL, command_endpoint character varying(255) DEFAULT NULL, notes text DEFAULT NULL, notes_url character varying(255) DEFAULT NULL, action_url character varying(255) DEFAULT NULL, icon_image character varying(255) DEFAULT NULL, icon_image_alt character varying(255) DEFAULT NULL, has_agent enum_boolean DEFAULT NULL, master_should_connect enum_boolean DEFAULT NULL, accept_config enum_boolean DEFAULT NULL, api_key character varying(40) DEFAULT NULL, -- template_choice character varying(255) DEFAULT NULL, -- TODO: Forbid them! imports TEXT DEFAULT NULL, groups TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_host_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX host_branch_object_name ON branched_icinga_host (branch_uuid, object_name); CREATE INDEX branched_host_search_object_name ON branched_icinga_host (object_name); CREATE INDEX branched_host_search_display_name ON branched_icinga_host (display_name); CREATE TABLE branched_icinga_hostgroup ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_hostgroup_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX hostgroup_branch_object_name ON branched_icinga_hostgroup (branch_uuid, object_name); CREATE INDEX branched_hostgroup_search_object_name ON branched_icinga_hostgroup (object_name); CREATE INDEX branched_hostgroup_search_display_name ON branched_icinga_hostgroup (display_name); CREATE TABLE branched_icinga_servicegroup ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_servicegroup_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX servicegroup_branch_object_name ON branched_icinga_servicegroup (branch_uuid, object_name); CREATE INDEX branched_servicegroup_search_object_name ON branched_icinga_servicegroup (object_name); CREATE INDEX branched_servicegroup_search_display_name ON branched_icinga_servicegroup (display_name); CREATE TABLE branched_icinga_usergroup ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_usergroup_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX usergroup_branch_object_name ON branched_icinga_usergroup (branch_uuid, object_name); CREATE INDEX branched_usergroup_search_object_name ON branched_icinga_usergroup (object_name); CREATE INDEX branched_usergroup_search_display_name ON branched_icinga_usergroup (display_name); CREATE TABLE branched_icinga_user ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, email character varying(255) DEFAULT NULL, pager character varying(255) DEFAULT NULL, enable_notifications enum_boolean DEFAULT NULL, period character varying(255) DEFAULT NULL, zone character varying(255) DEFAULT NULL, imports TEXT DEFAULT NULL, groups TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_user_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX user_branch_object_name ON branched_icinga_user (branch_uuid, object_name); CREATE INDEX branched_user_search_object_name ON branched_icinga_user (object_name); CREATE INDEX branched_user_search_display_name ON branched_icinga_user (display_name); CREATE TABLE branched_icinga_zone ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, parent character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, is_global enum_boolean DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_zone_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX zone_branch_object_name ON branched_icinga_zone (branch_uuid, object_name); CREATE INDEX branched_zone_search_object_name ON branched_icinga_zone (object_name); CREATE TABLE branched_icinga_timeperiod ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, display_name character varying(255) DEFAULT NULL, update_method character varying(64) DEFAULT NULL, zone character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, prefer_includes enum_boolean DEFAULT NULL, imports TEXT DEFAULT NULL, ranges TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_timeperiod_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX timeperiod_branch_object_name ON branched_icinga_timeperiod (branch_uuid, object_name); CREATE INDEX branched_timeperiod_search_object_name ON branched_icinga_timeperiod (object_name); CREATE INDEX branched_timeperiod_search_display_name ON branched_icinga_timeperiod (display_name); CREATE TABLE branched_icinga_command ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean NOT NULL DEFAULT NULL, methods_execute character varying(64) DEFAULT NULL, command text DEFAULT NULL, is_string enum_boolean DEFAULT NULL, -- env text DEFAULT NULL, timeout smallint DEFAULT NULL, zone character varying(255) DEFAULT NULL, imports TEXT DEFAULT NULL, arguments TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_command_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX command_branch_object_name ON branched_icinga_command (branch_uuid, object_name); CREATE INDEX branched_command_search_object_name ON branched_icinga_command (object_name); CREATE TABLE branched_icinga_apiuser ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name CHARACTER VARYING(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean NOT NULL DEFAULT NULL, password CHARACTER VARYING(255) DEFAULT NULL, client_dn CHARACTER VARYING(64) DEFAULT NULL, permissions TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_apiuser_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX apiuser_branch_object_name ON branched_icinga_apiuser (branch_uuid, object_name); CREATE INDEX branched_apiuser_search_object_name ON branched_icinga_apiuser (object_name); CREATE TABLE branched_icinga_endpoint ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', zone character varying(255) DEFAULT NULL, object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean NOT NULL DEFAULT NULL, host character varying(255) DEFAULT NULL, port d_smallint DEFAULT NULL, log_duration character varying(32) DEFAULT NULL, apiuser character varying(255) DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_endpoint_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX endpoint_branch_object_name ON branched_icinga_endpoint (branch_uuid, object_name); CREATE INDEX branched_endpoint_search_object_name ON branched_icinga_endpoint (object_name); CREATE TABLE branched_icinga_service ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, host character varying(255) DEFAULT NULL, service_set character varying(255) DEFAULT NULL, check_command character varying(255) DEFAULT NULL, max_check_attempts integer DEFAULT NULL, check_period character varying(255) DEFAULT NULL, check_interval character varying(8) DEFAULT NULL, retry_interval character varying(8) DEFAULT NULL, check_timeout smallint DEFAULT NULL, enable_notifications enum_boolean DEFAULT NULL, enable_active_checks enum_boolean DEFAULT NULL, enable_passive_checks enum_boolean DEFAULT NULL, enable_event_handler enum_boolean DEFAULT NULL, enable_flapping enum_boolean DEFAULT NULL, enable_perfdata enum_boolean DEFAULT NULL, event_command character varying(255) DEFAULT NULL, flapping_threshold_high smallint DEFAULT NULL, flapping_threshold_low smallint DEFAULT NULL, volatile enum_boolean DEFAULT NULL, zone character varying(255) DEFAULT NULL, command_endpoint character varying(255) DEFAULT NULL, notes text DEFAULT NULL, notes_url character varying(255) DEFAULT NULL, action_url character varying(255) DEFAULT NULL, icon_image character varying(255) DEFAULT NULL, icon_image_alt character varying(255) DEFAULT NULL, use_agent enum_boolean DEFAULT NULL, apply_for character varying(255) DEFAULT NULL, use_var_overrides enum_boolean DEFAULT NULL, assign_filter text DEFAULT NULL, -- template_choice_id int DEFAULT NULL, imports TEXT DEFAULT NULL, groups TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_service_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_branch_object_name ON branched_icinga_service (branch_uuid, object_name); CREATE INDEX branched_service_search_object_name ON branched_icinga_service (object_name); CREATE INDEX branched_service_search_display_name ON branched_icinga_service (display_name); CREATE TABLE branched_icinga_notification ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name CHARACTER VARYING(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, apply_to enum_host_service DEFAULT NULL, host character varying(255) DEFAULT NULL, service character varying(255) DEFAULT NULL, times_begin integer DEFAULT NULL, times_end integer DEFAULT NULL, notification_interval integer DEFAULT NULL, command character varying(255) DEFAULT NULL, period character varying(255) DEFAULT NULL, zone character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, states TEXT DEFAULT NULL, types TEXT DEFAULT NULL, users TEXT DEFAULT NULL, usergroups TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_notification_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX notification_branch_object_name ON branched_icinga_notification (branch_uuid, object_name); CREATE INDEX branched_notification_search_object_name ON branched_icinga_notification (object_name); CREATE TABLE branched_icinga_scheduled_downtime ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, zone_id integer DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, apply_to enum_host_service DEFAULT NULL, assign_filter text DEFAULT NULL, author character varying(255) DEFAULT NULL, comment text DEFAULT NULL, fixed enum_boolean DEFAULT NULL, duration int DEFAULT NULL, with_services enum_boolean DEFAULT NULL, imports TEXT DEFAULT NULL, ranges TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_scheduled_downtime_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX scheduled_downtime_branch_object_name ON branched_icinga_scheduled_downtime (branch_uuid, object_name); CREATE INDEX branched_scheduled_downtime_search_object_name ON branched_icinga_scheduled_downtime (object_name); CREATE TABLE branched_icinga_dependency ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean DEFAULT 'n', apply_to enum_host_service NULL DEFAULT NULL, parent_host character varying(255) DEFAULT NULL, parent_host_var character varying(128) DEFAULT NULL, parent_service character varying(255) DEFAULT NULL, child_host character varying(255) DEFAULT NULL, child_service character varying(255) DEFAULT NULL, disable_checks enum_boolean DEFAULT NULL, disable_notifications enum_boolean DEFAULT NULL, ignore_soft_states enum_boolean DEFAULT NULL, period_id integer DEFAULT NULL, zone_id integer DEFAULT NULL, assign_filter text DEFAULT NULL, parent_service_by_name character varying(255), imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_dependency_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX dependency_branch_object_name ON branched_icinga_dependency (branch_uuid, object_name); CREATE INDEX branched_dependency_search_object_name ON branched_icinga_dependency (object_name); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (175, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_176.sql000066400000000000000000000004461516513262500262270ustar00rootroot00000000000000ALTER TABLE icinga_host ADD COLUMN custom_endpoint_name character varying(255) DEFAULT NULL; ALTER TABLE branched_icinga_host ADD COLUMN custom_endpoint_name character varying(255) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES ('176', NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_177.sql000066400000000000000000000006471516513262500262330ustar00rootroot00000000000000ALTER TABLE icinga_service_set ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE icinga_service_set SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE icinga_service_set ALTER COLUMN uuid SET NOT NULL; CREATE UNIQUE INDEX service_set_uuid ON icinga_service_set (uuid); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (177, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_178.sql000066400000000000000000000015131516513262500262250ustar00rootroot00000000000000CREATE TABLE director_activity_log_remark ( first_related_activity bigint NOT NULL, last_related_activity bigint NOT NULL, remark TEXT NOT NULL, PRIMARY KEY (first_related_activity, last_related_activity), CONSTRAINT activity_log_remark_begin FOREIGN KEY (first_related_activity) REFERENCES director_activity_log (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT activity_log_remark_end FOREIGN KEY (last_related_activity) REFERENCES director_activity_log (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX first_related_activity ON director_activity_log_remark (first_related_activity); CREATE INDEX last_related_activity ON director_activity_log_remark (last_related_activity); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (178, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_179.sql000066400000000000000000000002461516513262500262300ustar00rootroot00000000000000CREATE INDEX start_time_idx ON director_deployment_log (start_time); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (179, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_180.sql000066400000000000000000000021331516513262500262150ustar00rootroot00000000000000CREATE TABLE branched_icinga_service_set ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, host character varying(255) DEFAULT NULL, description TEXT DEFAULT NULL, assign_filter text DEFAULT NULL, imports TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_service_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_set_branch_object_name ON branched_icinga_service_set (branch_uuid, object_name); CREATE INDEX branched_service_set_search_object_name ON branched_icinga_service_set (object_name); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (180, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_181.sql000066400000000000000000000026411516513262500262220ustar00rootroot00000000000000ALTER TABLE branched_icinga_host DROP CONSTRAINT branched_icinga_host_uuid_key; ALTER TABLE branched_icinga_hostgroup DROP CONSTRAINT branched_icinga_hostgroup_uuid_key; ALTER TABLE branched_icinga_servicegroup DROP CONSTRAINT branched_icinga_servicegroup_uuid_key; ALTER TABLE branched_icinga_usergroup DROP CONSTRAINT branched_icinga_usergroup_uuid_key; ALTER TABLE branched_icinga_user DROP CONSTRAINT branched_icinga_user_uuid_key; ALTER TABLE branched_icinga_zone DROP CONSTRAINT branched_icinga_zone_uuid_key; ALTER TABLE branched_icinga_timeperiod DROP CONSTRAINT branched_icinga_timeperiod_uuid_key; ALTER TABLE branched_icinga_command DROP CONSTRAINT branched_icinga_command_uuid_key; ALTER TABLE branched_icinga_apiuser DROP CONSTRAINT branched_icinga_apiuser_uuid_key; ALTER TABLE branched_icinga_endpoint DROP CONSTRAINT branched_icinga_endpoint_uuid_key; ALTER TABLE branched_icinga_service DROP CONSTRAINT branched_icinga_service_uuid_key; ALTER TABLE branched_icinga_service_set DROP CONSTRAINT branched_icinga_service_set_uuid_key; ALTER TABLE branched_icinga_notification DROP CONSTRAINT branched_icinga_notification_uuid_key; ALTER TABLE branched_icinga_scheduled_downtime DROP CONSTRAINT branched_icinga_scheduled_downtime_uuid_key; ALTER TABLE branched_icinga_dependency DROP CONSTRAINT branched_icinga_dependency_uuid_key; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (181, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_182.sql000066400000000000000000000007011516513262500262160ustar00rootroot00000000000000DELETE FROM sync_run AS sr WHERE EXISTS ( SELECT 1 FROM sync_rule AS s WHERE s.id = sr.rule_id AND s.object_type != 'datalistEntry' AND sr.start_time > '2022-09-21 00:00:00' ) AND sr.last_former_activity = sr.last_related_activity; DELETE FROM sync_run WHERE (objects_created + objects_deleted + objects_modified) = 0; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (182, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_183.sql000066400000000000000000000004441516513262500262230ustar00rootroot00000000000000ALTER TABLE icinga_notification ADD COLUMN users_var character varying(255) DEFAULT NULL; ALTER TABLE icinga_notification ADD COLUMN user_groups_var character varying(255) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (183, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_184.sql000066400000000000000000000004661516513262500262300ustar00rootroot00000000000000ALTER TABLE branched_icinga_notification ADD COLUMN users_var character varying(255) DEFAULT NULL; ALTER TABLE branched_icinga_notification ADD COLUMN user_groups_var character varying(255) DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (184, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_186.sql000066400000000000000000000011511516513262500262220ustar00rootroot00000000000000ALTER TABLE director_datafield ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE director_datafield SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE director_datafield ALTER COLUMN uuid SET NOT NULL; ALTER TABLE director_datalist ADD COLUMN uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16); UPDATE director_datalist SET uuid = decode(replace(gen_random_uuid()::text, '-', ''), 'hex') WHERE uuid IS NULL; ALTER TABLE director_datalist ALTER COLUMN uuid SET NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (186, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_187.sql000066400000000000000000000002611516513262500262240ustar00rootroot00000000000000ALTER TABLE import_row_modifier ADD COLUMN filter_expression text DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (187, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_188.sql000066400000000000000000000003011516513262500262200ustar00rootroot00000000000000DROP INDEX IF EXISTS import_row_modifier_prio; DROP INDEX IF EXISTS service_branch_object_name; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (188, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_189.sql000066400000000000000000000012041516513262500262240ustar00rootroot00000000000000ALTER TABLE director_job ADD COLUMN ts_last_attempt_tmp bigint DEFAULT NULL; ALTER TABLE director_job ADD COLUMN ts_last_error_tmp bigint DEFAULT NULL; UPDATE director_job SET ts_last_attempt_tmp = UNIX_TIMESTAMP(ts_last_attempt) * 1000, ts_last_error_tmp = UNIX_TIMESTAMP(ts_last_error) * 1000; ALTER TABLE director_job DROP COLUMN ts_last_attempt, DROP COLUMN ts_last_error; ALTER TABLE director_job RENAME COLUMN ts_last_attempt_tmp TO ts_last_attempt; ALTER TABLE director_job RENAME COLUMN ts_last_error_tmp TO ts_last_error; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (189, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_190.sql000066400000000000000000000004161516513262500262200ustar00rootroot00000000000000ALTER TABLE icinga_dependency ADD COLUMN redundancy_group character varying(255); ALTER TABLE branched_icinga_dependency ADD COLUMN redundancy_group character varying(255); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (190, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_77.sql000066400000000000000000000045431516513262500261510ustar00rootroot00000000000000ALTER TYPE enum_merge_behaviour ADD VALUE 'override'; CREATE TABLE icinga_notification_states_set ( notification_id integer NOT NULL, property enum_state_name NOT NULL, merge_behaviour enum_merge_behaviour NOT NULL DEFAULT 'override', PRIMARY KEY (notification_id, property, merge_behaviour), CONSTRAINT icinga_notification_states_set_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); COMMENT ON COLUMN icinga_notification_states_set.merge_behaviour IS 'override: = [], extend: += [], blacklist: -= []'; CREATE TABLE icinga_notification_types_set ( notification_id integer NOT NULL, property enum_type_name NOT NULL, merge_behaviour enum_merge_behaviour NOT NULL DEFAULT 'override', PRIMARY KEY (notification_id, property, merge_behaviour), CONSTRAINT icinga_notification_types_set_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); COMMENT ON COLUMN icinga_notification_types_set.merge_behaviour IS 'override: = [], extend: += [], blacklist: -= []'; CREATE TABLE icinga_notification_var ( notification_id integer NOT NULL, varname VARCHAR(255) DEFAULT NULL, varvalue TEXT DEFAULT NULL, format enum_property_format, PRIMARY KEY (notification_id, varname), CONSTRAINT icinga_notification_var_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX notification_var_search_idx ON icinga_notification_var (varname); CREATE TABLE icinga_notification_inheritance ( notification_id integer NOT NULL, parent_notification_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (notification_id, parent_notification_id), CONSTRAINT icinga_notification_inheritance_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_inheritance_parent_notification FOREIGN KEY (parent_notification_id) REFERENCES icinga_notification (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX notification_inheritance ON icinga_notification_inheritance (notification_id, weight); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (77, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_78.sql000066400000000000000000000015161516513262500261470ustar00rootroot00000000000000CREATE TABLE icinga_user_field ( user_id integer NOT NULL, datafield_id integer NOT NULL, is_required enum_boolean NOT NULL, PRIMARY KEY (user_id, datafield_id), CONSTRAINT icinga_user_field_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_user_field_datafield FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX user_field_key ON icinga_user_field (user_id, datafield_id); CREATE INDEX user_field_user ON icinga_user_field (user_id); CREATE INDEX user_field_datafield ON icinga_user_field (datafield_id); COMMENT ON COLUMN icinga_user_field.user_id IS 'Makes only sense for templates'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (78, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_79.sql000066400000000000000000000005641516513262500261520ustar00rootroot00000000000000ALTER TABLE icinga_user_states_set DROP CONSTRAINT icinga_user_states_set_pkey, ADD PRIMARY KEY (user_id, property, merge_behaviour); ALTER TABLE icinga_user_types_set DROP CONSTRAINT icinga_user_types_set_pkey, ADD PRIMARY KEY (user_id, property, merge_behaviour); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (79, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_80.sql000066400000000000000000000005371516513262500261420ustar00rootroot00000000000000ALTER TABLE icinga_timeperiod_range DROP CONSTRAINT icinga_timeperiod_range_timeperiod, ADD CONSTRAINT icinga_timeperiod_range_timeperiod FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (80, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_81.sql000066400000000000000000000002341516513262500261350ustar00rootroot00000000000000ALTER TABLE import_run ALTER COLUMN end_time DROP NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (81, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_82.sql000066400000000000000000000011421516513262500261350ustar00rootroot00000000000000ALTER TYPE enum_sync_rule_object_type ADD VALUE 'service' AFTER 'host'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'command' AFTER 'service'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'hostgroup'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'servicegroup'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'usergroup'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'datalistEntry'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'endpoint'; ALTER TYPE enum_sync_rule_object_type ADD VALUE 'zone'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (82, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_83.sql000066400000000000000000000004331516513262500261400ustar00rootroot00000000000000ALTER TABLE icinga_command ALTER COLUMN command TYPE text; ALTER TABLE icinga_command ALTER COLUMN command DROP DEFAULT; ALTER TABLE icinga_command ALTER COLUMN command SET DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (83, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_84.sql000066400000000000000000000002221516513262500261350ustar00rootroot00000000000000ALTER TABLE icinga_usergroup DROP COLUMN zone_id; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (84, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_85.sql000066400000000000000000000006321516513262500261430ustar00rootroot00000000000000CREATE TABLE icinga_notification_assignment ( id bigserial, notification_id integer NOT NULL, filter_string TEXT NOT NULL, PRIMARY KEY (id), CONSTRAINT icinga_notification_assignment FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (85, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_86.sql000066400000000000000000000020411516513262500261400ustar00rootroot00000000000000CREATE TABLE icinga_notification_user ( notification_id integer NOT NULL, user_id integer NOT NULL, PRIMARY KEY (notification_id, user_id), CONSTRAINT icinga_notification_user_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_user_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_notification_usergroup ( notification_id integer NOT NULL, usergroup_id integer NOT NULL, PRIMARY KEY (notification_id, usergroup_id), CONSTRAINT icinga_notification_usergroup_usergroup FOREIGN KEY (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_usergroup_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (86, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_88.sql000066400000000000000000000003011516513262500261370ustar00rootroot00000000000000ALTER TABLE director_generated_config_file ALTER COLUMN file_path TYPE character varying(128); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (88, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_89.sql000066400000000000000000000002541516513262500261470ustar00rootroot00000000000000ALTER TABLE icinga_command_argument ADD required enum_boolean DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (89, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_90.sql000066400000000000000000000003741516513262500261420ustar00rootroot00000000000000CREATE TYPE enum_assign_type AS ENUM('assign', 'ignore'); ALTER TABLE icinga_service_assignment ADD assign_type enum_assign_type NOT NULL DEFAULT 'assign'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (90, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_91.sql000066400000000000000000000003071516513262500261370ustar00rootroot00000000000000ALTER TABLE icinga_notification_assignment ADD assign_type enum_assign_type NOT NULL DEFAULT 'assign'; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (91, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_92.sql000066400000000000000000000023261516513262500261430ustar00rootroot00000000000000DELETE FROM director_datalist_entry WHERE entry_name IS NULL; ALTER TABLE director_datalist_entry ALTER COLUMN entry_name DROP DEFAULT; ALTER TABLE director_datalist_entry ALTER COLUMN entry_name SET NOT NULL; DELETE FROM icinga_command_var WHERE varname IS NULL; ALTER TABLE icinga_command_var ALTER COLUMN varname DROP DEFAULT; ALTER TABLE icinga_command_var ALTER COLUMN varname SET NOT NULL; DELETE FROM icinga_host_var WHERE varname IS NULL; ALTER TABLE icinga_host_var ALTER COLUMN varname DROP DEFAULT; ALTER TABLE icinga_host_var ALTER COLUMN varname SET NOT NULL; DELETE FROM icinga_service_var WHERE varname IS NULL; ALTER TABLE icinga_service_var ALTER COLUMN varname DROP DEFAULT; ALTER TABLE icinga_service_var ALTER COLUMN varname SET NOT NULL; DELETE FROM icinga_user_var WHERE varname IS NULL; ALTER TABLE icinga_user_var ALTER COLUMN varname DROP DEFAULT; ALTER TABLE icinga_user_var ALTER COLUMN varname SET NOT NULL; DELETE FROM icinga_notification_var WHERE varname IS NULL; ALTER TABLE icinga_notification_var ALTER COLUMN varname DROP DEFAULT; ALTER TABLE icinga_notification_var ALTER COLUMN varname SET NOT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (92, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_93.sql000066400000000000000000000011721516513262500261420ustar00rootroot00000000000000CREATE TYPE enum_sync_state AS ENUM( 'unknown', 'in-sync', 'pending-changes', 'failing' ); ALTER TABLE sync_rule ADD COLUMN sync_state enum_sync_state NOT NULL DEFAULT 'unknown', ADD COLUMN last_error_message character varying(255) NULL DEFAULT NULL, ADD COLUMN last_attempt timestamp with time zone NULL DEFAULT NULL ; UPDATE sync_rule SET last_attempt = lr.start_time FROM ( SELECT rule_id, MAX(start_time) AS start_time FROM sync_run GROUP BY rule_id ) lr WHERE sync_rule.id = lr.rule_id; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (93, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_94.sql000066400000000000000000000020011516513262500261330ustar00rootroot00000000000000CREATE TABLE director_job ( id serial, job_name character varying(64) NOT NULL, job_class character varying(72) NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', run_interval integer NOT NULL, -- seconds last_attempt_succeeded enum_boolean DEFAULT NULL, ts_last_attempt timestamp with time zone DEFAULT NULL, ts_last_error timestamp with time zone DEFAULT NULL, last_error_message text NULL DEFAULT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX director_job_unique_job_name ON director_job (job_name); CREATE TABLE director_job_setting ( job_id integer NOT NULL, setting_name character varying(64) NOT NULL, setting_value text DEFAULT NULL, PRIMARY KEY (job_id, setting_name), CONSTRAINT director_job_setting_job FOREIGN KEY (job_id) REFERENCES director_job (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX director_job_setting_job ON director_job_setting (job_id); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (94, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_95.sql000066400000000000000000000010471516513262500261450ustar00rootroot00000000000000ALTER TABLE import_source ADD COLUMN import_state enum_sync_state NOT NULL DEFAULT 'unknown', ADD COLUMN last_error_message character varying(255) NULL DEFAULT NULL, ADD COLUMN last_attempt timestamp with time zone NULL DEFAULT NULL ; UPDATE import_source SET last_attempt = ir.start_time FROM ( SELECT source_id, MAX(start_time) AS start_time FROM import_run GROUP BY source_id ) ir WHERE import_source.id = ir.source_id; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (95, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_96.sql000066400000000000000000000003551516513262500261470ustar00rootroot00000000000000CREATE TYPE enum_host_service AS ENUM('host', 'service'); ALTER TABLE icinga_notification ADD apply_to enum_host_service NULL DEFAULT NULL; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (96, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_97.sql000066400000000000000000000005031516513262500261430ustar00rootroot00000000000000ALTER TABLE director_job ADD COLUMN timeperiod_id integer DEFAULT NULL, ADD CONSTRAINT director_job_period FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (97, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql-migrations/upgrade_98.sql000066400000000000000000000004001516513262500261400ustar00rootroot00000000000000CREATE OR REPLACE FUNCTION unix_timestamp(timestamp with time zone) RETURNS bigint AS ' SELECT EXTRACT(EPOCH FROM $1)::bigint AS result ' LANGUAGE sql; INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (98, NOW()); icingaweb2-module-director-1.11.8/schema/pgsql.sql000066400000000000000000003011711516513262500220300ustar00rootroot00000000000000-- -- PostgreSQL schema -- ================= -- -- You should normally not be required to care about schema handling. -- Director does all the migrations for you and guides you either in -- the frontend or provides everything you need for automated migration -- handling. Please find more related information in our documentation. CREATE TYPE enum_activity_action AS ENUM('create', 'delete', 'modify'); CREATE TYPE enum_boolean AS ENUM('y', 'n'); CREATE TYPE enum_property_format AS ENUM('string', 'expression', 'json'); CREATE TYPE enum_object_type_all AS ENUM('object', 'template', 'apply', 'external_object'); -- TODO: can we check for an invalid CREATE TYPE enum_object_type AS ENUM('object', 'template', 'external_object'); CREATE TYPE enum_timeperiod_range_type AS ENUM('include', 'exclude'); CREATE TYPE enum_merge_behaviour AS ENUM('set', 'add', 'substract', 'override'); CREATE TYPE enum_set_merge_behaviour AS ENUM('override', 'extend', 'blacklist'); CREATE TYPE enum_command_object_type AS ENUM('object', 'template', 'external_object'); CREATE TYPE enum_apply_object_type AS ENUM('object', 'template', 'apply', 'external_object'); CREATE TYPE enum_state_name AS ENUM('OK', 'Warning', 'Critical', 'Unknown', 'Up', 'Down'); CREATE TYPE enum_type_name AS ENUM('DowntimeStart', 'DowntimeEnd', 'DowntimeRemoved', 'Custom', 'Acknowledgement', 'Problem', 'Recovery', 'FlappingStart', 'FlappingEnd'); CREATE TYPE enum_sync_rule_object_type AS ENUM( 'host', 'service', 'command', 'user', 'hostgroup', 'servicegroup', 'usergroup', 'datalistEntry', 'endpoint', 'zone', 'timePeriod', 'serviceSet', 'scheduledDowntime', 'notification', 'dependency' ); CREATE TYPE enum_sync_rule_update_policy AS ENUM('merge', 'override', 'ignore', 'update-only'); CREATE TYPE enum_sync_rule_purge_action AS ENUM('delete', 'disable'); CREATE TYPE enum_sync_property_merge_policy AS ENUM('override', 'merge'); CREATE TYPE enum_sync_state AS ENUM( 'unknown', 'in-sync', 'pending-changes', 'failing' ); CREATE TYPE enum_host_service AS ENUM('host', 'service'); CREATE TYPE enum_owner_type AS ENUM('user', 'usergroup', 'role'); CREATE DOMAIN d_smallint AS integer CHECK (VALUE >= 0) CHECK (VALUE < 65536); CREATE OR REPLACE FUNCTION unix_timestamp(timestamp with time zone) RETURNS bigint AS ' SELECT EXTRACT(EPOCH FROM $1)::bigint AS result ' LANGUAGE sql; CREATE TABLE director_daemon_info ( instance_uuid_hex character varying(32) NOT NULL, -- random by daemon schema_version SMALLINT NOT NULL, fqdn character varying(255) NOT NULL, username character varying(64) NOT NULL, pid integer NOT NULL, binary_path character varying(128) NOT NULL, binary_realpath character varying(128) NOT NULL, php_binary_path character varying(128) NOT NULL, php_binary_realpath character varying(128) NOT NULL, php_version character varying(64) NOT NULL, php_integer_size SMALLINT NOT NULL, running_with_systemd enum_boolean DEFAULT NULL, ts_started bigint NOT NULL, ts_stopped bigint DEFAULT NULL, ts_last_modification bigint DEFAULT NULL, ts_last_update bigint NOT NULL, process_info text NOT NULL, PRIMARY KEY (instance_uuid_hex) ); CREATE TABLE director_activity_log ( id bigserial, object_type character varying(64) NOT NULL, object_name character varying(255) NOT NULL, action_name enum_activity_action NOT NULL, old_properties text DEFAULT NULL, new_properties text DEFAULT NULL, author character varying(64) NOT NULL, change_time timestamp with time zone NOT NULL, checksum bytea NOT NULL UNIQUE CHECK(LENGTH(checksum) = 20), parent_checksum bytea DEFAULT NULL CHECK(parent_checksum IS NULL OR LENGTH(checksum) = 20), PRIMARY KEY (id) ); CREATE INDEX activity_log_sort_idx ON director_activity_log (change_time); CREATE INDEX activity_log_search_idx ON director_activity_log (object_name); CREATE INDEX activity_log_search_idx2 ON director_activity_log (object_type, object_name, change_time); CREATE INDEX activity_log_author ON director_activity_log (author); COMMENT ON COLUMN director_activity_log.old_properties IS 'Property hash, JSON'; COMMENT ON COLUMN director_activity_log.new_properties IS 'Property hash, JSON'; CREATE TABLE director_activity_log_remark ( first_related_activity bigint NOT NULL, last_related_activity bigint NOT NULL, remark TEXT NOT NULL, PRIMARY KEY (first_related_activity, last_related_activity), CONSTRAINT activity_log_remark_begin FOREIGN KEY (first_related_activity) REFERENCES director_activity_log (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT activity_log_remark_end FOREIGN KEY (last_related_activity) REFERENCES director_activity_log (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX first_related_activity ON director_activity_log_remark (first_related_activity); CREATE INDEX last_related_activity ON director_activity_log_remark (last_related_activity); CREATE TABLE director_basket ( uuid bytea CHECK(LENGTH(uuid) = 16) NOT NULL, basket_name VARCHAR(64) NOT NULL, owner_type enum_owner_type NOT NULL, owner_value VARCHAR(255) NOT NULL, objects text NOT NULL, -- json-encoded PRIMARY KEY (uuid) ); CREATE UNIQUE INDEX basket_basket_name ON director_basket (basket_name); CREATE TABLE director_basket_content ( checksum bytea CHECK(LENGTH(checksum) = 20) NOT NULL, summary VARCHAR(500) NOT NULL, -- json content text NOT NULL, -- json PRIMARY KEY (checksum) ); CREATE TABLE director_basket_snapshot ( basket_uuid bytea CHECK(LENGTH(basket_uuid) = 16) NOT NULL, ts_create bigint NOT NULL, content_checksum bytea CHECK(LENGTH(content_checksum) = 20) NOT NULL, PRIMARY KEY (basket_uuid, ts_create), CONSTRAINT basked_snapshot_basket FOREIGN KEY (basket_uuid) REFERENCES director_basket (uuid) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT basked_snapshot_content FOREIGN KEY (content_checksum) REFERENCES director_basket_content (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX basket_snapshot_sort_idx ON director_basket_snapshot (ts_create); CREATE TABLE director_generated_config ( checksum bytea CHECK(LENGTH(checksum) = 20), director_version character varying(64) DEFAULT NULL, director_db_version integer DEFAULT NULL, duration integer DEFAULT NULL, first_activity_checksum bytea NOT NULL CHECK(LENGTH(first_activity_checksum) = 20), last_activity_checksum bytea NOT NULL CHECK(LENGTH(last_activity_checksum) = 20), PRIMARY KEY (checksum), CONSTRAINT director_generated_config_activity FOREIGN KEY (last_activity_checksum) REFERENCES director_activity_log (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX activity_checksum ON director_generated_config (last_activity_checksum); COMMENT ON COLUMN director_generated_config.checksum IS 'SHA1(last_activity_checksum;file_path=checksum;file_path=checksum;...)'; COMMENT ON COLUMN director_generated_config.duration IS 'Config generation duration (ms)'; CREATE TABLE director_generated_file ( checksum bytea CHECK(LENGTH(checksum) = 20), content text DEFAULT NULL, cnt_object SMALLINT NOT NULL DEFAULT 0, cnt_template SMALLINT NOT NULL DEFAULT 0, cnt_apply SMALLINT NOT NULL DEFAULT 0, PRIMARY KEY (checksum) ); COMMENT ON COLUMN director_generated_file.checksum IS 'SHA1(content)'; CREATE TABLE director_generated_config_file ( config_checksum bytea CHECK(LENGTH(config_checksum) = 20), file_checksum bytea CHECK(LENGTH(file_checksum) = 20), file_path character varying(128) NOT NULL, PRIMARY KEY (config_checksum, file_path), CONSTRAINT director_generated_config_file_config FOREIGN KEY (config_checksum) REFERENCES director_generated_config (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT director_generated_config_file_file FOREIGN KEY (file_checksum) REFERENCES director_generated_file (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX config ON director_generated_config_file (config_checksum); CREATE INDEX checksum ON director_generated_config_file (file_checksum); COMMENT ON COLUMN director_generated_config_file.file_path IS 'e.g. zones/nafta/hosts.conf'; CREATE TABLE director_deployment_log ( id bigserial, config_checksum bytea CHECK(LENGTH(config_checksum) = 20), last_activity_checksum bytea CHECK(LENGTH(config_checksum) = 20), peer_identity character varying(64) NOT NULL, start_time timestamp with time zone NOT NULL, end_time timestamp with time zone DEFAULT NULL, abort_time timestamp with time zone DEFAULT NULL, duration_connection integer DEFAULT NULL, duration_dump integer DEFAULT NULL, stage_name CHARACTER VARYING(96), stage_collected enum_boolean DEFAULT NULL, connection_succeeded enum_boolean DEFAULT NULL, dump_succeeded enum_boolean DEFAULT NULL, startup_succeeded enum_boolean DEFAULT NULL, username character varying(64) DEFAULT NULL, startup_log text DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT config_checksum FOREIGN KEY (config_checksum) REFERENCES director_generated_config (checksum) ON DELETE SET NULL ON UPDATE RESTRICT ); COMMENT ON COLUMN director_deployment_log.duration_connection IS 'The time it took to connect to an Icinga node (ms)'; COMMENT ON COLUMN director_deployment_log.duration_dump IS 'Time spent dumping the config (ms)'; COMMENT ON COLUMN director_deployment_log.username IS 'The user that triggered this deployment'; CREATE INDEX start_time_idx ON director_deployment_log (start_time); CREATE TABLE director_datalist ( id serial, uuid bytea CHECK(LENGTH(uuid) = 16) NOT NULL, list_name character varying(255) NOT NULL, owner character varying(255) NOT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX datalist_list_name ON director_datalist (list_name); CREATE TABLE director_datalist_entry ( list_id integer NOT NULL, entry_name character varying(255) NOT NULL, entry_value text DEFAULT NULL, format enum_property_format, allowed_roles character varying(255) DEFAULT NULL, PRIMARY KEY (list_id, entry_name), CONSTRAINT director_datalist_entry_datalist FOREIGN KEY (list_id) REFERENCES director_datalist (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX datalist_entry_datalist ON director_datalist_entry (list_id); CREATE TABLE director_datafield_category ( id serial, category_name character varying(255) NOT NULL, description text DEFAULT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX datafield_category_name ON director_datafield_category (category_name); CREATE TABLE director_datafield ( id serial, uuid bytea CHECK(LENGTH(uuid) = 16) NOT NULL, category_id integer DEFAULT NULL, varname character varying(64) NOT NULL, caption character varying(255) NOT NULL, description text DEFAULT NULL, datatype character varying(255) NOT NULL, -- datatype_param? multiple ones? format enum_property_format, PRIMARY KEY (id), CONSTRAINT director_datafield_category FOREIGN KEY (category_id) REFERENCES director_datafield_category (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX search_idx ON director_datafield (varname); CREATE INDEX datafield_category ON director_datafield (category_id); CREATE TABLE director_datafield_setting ( datafield_id integer NOT NULL, setting_name character varying(64) NOT NULL, setting_value text NOT NULL, PRIMARY KEY (datafield_id, setting_name), CONSTRAINT datafield_id_settings FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX director_datafield_datafield ON director_datafield_setting (datafield_id); CREATE TABLE director_schema_migration ( schema_version SMALLINT NOT NULL, migration_time TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY(schema_version) ); CREATE TABLE director_setting ( setting_name character varying(64) NOT NULL, setting_value character varying(255) NOT NULL, PRIMARY KEY(setting_name) ); CREATE TABLE icinga_zone ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), parent_id integer DEFAULT NULL, object_name character varying(255) NOT NULL UNIQUE, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', is_global enum_boolean NOT NULL DEFAULT 'n', PRIMARY KEY (id), CONSTRAINT icinga_zone_parent_zone FOREIGN KEY (parent_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX zone_parent ON icinga_zone (parent_id); CREATE TABLE icinga_zone_inheritance ( zone_id integer NOT NULL, parent_zone_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (zone_id, parent_zone_id), CONSTRAINT icinga_zone_inheritance_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_zone_inheritance_parent_zone FOREIGN KEY (parent_zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX zone_inheritance_unique_order ON icinga_zone_inheritance (zone_id, weight); CREATE INDEX zone_inheritance_zone ON icinga_zone_inheritance (zone_id); CREATE INDEX zone_inheritance_zone_parent ON icinga_zone_inheritance (parent_zone_id); CREATE TABLE icinga_timeperiod ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) NOT NULL, display_name character varying(255) DEFAULT NULL, update_method character varying(64) DEFAULT NULL, zone_id integer DEFAULT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', prefer_includes enum_boolean DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_timeperiod_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX timeperiod_object_name ON icinga_timeperiod (object_name, zone_id); CREATE INDEX timeperiod_zone ON icinga_timeperiod (zone_id); COMMENT ON COLUMN icinga_timeperiod.update_method IS 'Usually LegacyTimePeriod'; CREATE TABLE icinga_timeperiod_inheritance ( timeperiod_id integer NOT NULL, parent_timeperiod_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (timeperiod_id, parent_timeperiod_id), CONSTRAINT icinga_timeperiod_inheritance_timeperiod FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_timeperiod_inheritance_parent_timeperiod FOREIGN KEY (parent_timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX timeperiod_inheritance_unique_order ON icinga_timeperiod_inheritance (timeperiod_id, weight); CREATE INDEX timeperiod_inheritance_timeperiod ON icinga_timeperiod_inheritance (timeperiod_id); CREATE INDEX timeperiod_inheritance_timeperiod_parent ON icinga_timeperiod_inheritance (parent_timeperiod_id); CREATE TABLE icinga_timeperiod_range ( timeperiod_id serial, range_key character varying(255) NOT NULL, range_value character varying(255) NOT NULL, range_type enum_timeperiod_range_type NOT NULL DEFAULT 'include', merge_behaviour enum_merge_behaviour NOT NULL DEFAULT 'set', PRIMARY KEY (timeperiod_id, range_type, range_key), CONSTRAINT icinga_timeperiod_range_timeperiod FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX timeperiod_range_timeperiod ON icinga_timeperiod_range (timeperiod_id); COMMENT ON COLUMN icinga_timeperiod_range.range_key IS 'monday, ...'; COMMENT ON COLUMN icinga_timeperiod_range.range_value IS '00:00-24:00, ...'; COMMENT ON COLUMN icinga_timeperiod_range.range_type IS 'include -> ranges {}, exclude ranges_ignore {} - not yet'; COMMENT ON COLUMN icinga_timeperiod_range.merge_behaviour IS 'set -> = {}, add -> += {}, substract -> -= {}'; CREATE TABLE director_job ( id serial, job_name character varying(64) NOT NULL, job_class character varying(72) NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', run_interval integer NOT NULL, -- seconds timeperiod_id integer DEFAULT NULL, last_attempt_succeeded enum_boolean DEFAULT NULL, ts_last_attempt bigint DEFAULT NULL, ts_last_error bigint DEFAULT NULL, last_error_message text NULL DEFAULT NULL, CONSTRAINT director_job_period FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, PRIMARY KEY (id) ); CREATE UNIQUE INDEX director_job_unique_job_name ON director_job (job_name); CREATE TABLE director_job_setting ( job_id integer NOT NULL, setting_name character varying(64) NOT NULL, setting_value text DEFAULT NULL, PRIMARY KEY (job_id, setting_name), CONSTRAINT director_job_setting_job FOREIGN KEY (job_id) REFERENCES director_job (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX director_job_setting_job ON director_job_setting (job_id); CREATE TABLE icinga_command ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', methods_execute character varying(64) DEFAULT NULL, command text DEFAULT NULL, is_string enum_boolean NULL, -- env text DEFAULT NULL, timeout smallint DEFAULT NULL, zone_id integer DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_command_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX command_object_name ON icinga_command (object_name); CREATE INDEX command_zone ON icinga_command (zone_id); COMMENT ON COLUMN icinga_command.object_type IS 'external_object is an attempt to work with existing commands'; CREATE TABLE icinga_command_inheritance ( command_id integer NOT NULL, parent_command_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (command_id, parent_command_id), CONSTRAINT icinga_command_inheritance_command FOREIGN KEY (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_command_inheritance_parent_command FOREIGN KEY (parent_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX command_inheritance_unique_order ON icinga_command_inheritance (command_id, weight); CREATE INDEX command_inheritance_command ON icinga_command_inheritance (command_id); CREATE INDEX command_inheritance_command_parent ON icinga_command_inheritance (parent_command_id); CREATE TABLE icinga_command_argument ( id serial, command_id integer NOT NULL, argument_name character varying(64) NOT NULL, argument_value text DEFAULT NULL, argument_format enum_property_format DEFAULT NULL, key_string character varying(64) DEFAULT NULL, description text DEFAULT NULL, skip_key enum_boolean DEFAULT NULL, set_if character varying(255) DEFAULT NULL, -- (string expression, must resolve to a numeric value) set_if_format enum_property_format DEFAULT NULL, sort_order smallint DEFAULT NULL, -- -> order repeat_key enum_boolean DEFAULT NULL, required enum_boolean DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_command_argument_command FOREIGN KEY (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX command_argument_unique_idx ON icinga_command_argument (command_id, argument_name); CREATE INDEX command_argument_sort_idx ON icinga_command_argument (command_id, sort_order); CREATE INDEX command_argument_command ON icinga_command_argument (command_id); COMMENT ON COLUMN icinga_command_argument.argument_name IS '-x, --host'; COMMENT ON COLUMN icinga_command_argument.key_string IS 'Overrides name'; COMMENT ON COLUMN icinga_command_argument.repeat_key IS 'Useful with array values'; CREATE TABLE icinga_command_field ( command_id integer NOT NULL, datafield_id integer NOT NULL, is_required enum_boolean NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (command_id, datafield_id), CONSTRAINT icinga_command_field_command FOREIGN KEY (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_command_field_datafield FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_command_var ( command_id integer NOT NULL, checksum bytea DEFAULT NULL UNIQUE CHECK(LENGTH(checksum) = 20), varname character varying(255) NOT NULL, varvalue text DEFAULT NULL, format enum_property_format NOT NULL DEFAULT 'string', PRIMARY KEY (command_id, varname), CONSTRAINT icinga_command_var_command FOREIGN KEY (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX command_var_command ON icinga_command_var (command_id); CREATE INDEX command_var_search_idx ON icinga_command_var (varname); CREATE INDEX command_var_checksum ON icinga_command_var (checksum); CREATE TABLE icinga_apiuser ( id BIGSERIAL, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name CHARACTER VARYING(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', password CHARACTER VARYING(255) DEFAULT NULL, client_dn CHARACTER VARYING(64) DEFAULT NULL, permissions TEXT DEFAULT NULL, PRIMARY KEY (id) ); COMMENT ON COLUMN icinga_apiuser.permissions IS 'JSON-encoded permissions'; CREATE TABLE icinga_endpoint ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), zone_id integer DEFAULT NULL, object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', host character varying(255) DEFAULT NULL, port d_smallint DEFAULT NULL, log_duration character varying(32) DEFAULT NULL, apiuser_id INTEGER DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_endpoint_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_apiuser FOREIGN KEY (apiuser_id) REFERENCES icinga_apiuser (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX endpoint_object_name ON icinga_endpoint (object_name); CREATE INDEX endpoint_zone ON icinga_endpoint (zone_id); COMMENT ON COLUMN icinga_endpoint.host IS 'IP address / hostname of remote node'; COMMENT ON COLUMN icinga_endpoint.port IS '5665 if not set'; COMMENT ON COLUMN icinga_endpoint.log_duration IS '1d if not set'; CREATE TABLE icinga_endpoint_inheritance ( endpoint_id integer NOT NULL, parent_endpoint_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (endpoint_id, parent_endpoint_id), CONSTRAINT icinga_endpoint_inheritance_endpoint FOREIGN KEY (endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_endpoint_inheritance_parent_endpoint FOREIGN KEY (parent_endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX endpoint_inheritance_unique_order ON icinga_endpoint_inheritance (endpoint_id, weight); CREATE INDEX endpoint_inheritance_endpoint ON icinga_endpoint_inheritance (endpoint_id); CREATE INDEX endpoint_inheritance_endpoint_parent ON icinga_endpoint_inheritance (parent_endpoint_id); CREATE TABLE icinga_host_template_choice ( id serial, object_name character varying(64) NOT NULL, description text DEFAULT NULL, min_required smallint NOT NULL DEFAULT 0, max_allowed smallint NOT NULL DEFAULT 1, required_template_id integer DEFAULT NULL, allowed_roles character varying(255) DEFAULT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX host_template_choice_object_name ON icinga_host_template_choice (object_name); CREATE INDEX host_template_choice_required_template ON icinga_host_template_choice (required_template_id); CREATE TABLE icinga_host ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', display_name CHARACTER VARYING(255) DEFAULT NULL, address character varying(255) DEFAULT NULL, address6 character varying(45) DEFAULT NULL, check_command_id integer DEFAULT NULL, max_check_attempts integer DEFAULT NULL, check_period_id integer DEFAULT NULL, check_interval character varying(8) DEFAULT NULL, retry_interval character varying(8) DEFAULT NULL, check_timeout smallint DEFAULT NULL, enable_notifications enum_boolean DEFAULT NULL, enable_active_checks enum_boolean DEFAULT NULL, enable_passive_checks enum_boolean DEFAULT NULL, enable_event_handler enum_boolean DEFAULT NULL, enable_flapping enum_boolean DEFAULT NULL, enable_perfdata enum_boolean DEFAULT NULL, event_command_id integer DEFAULT NULL, flapping_threshold_high smallint default null, flapping_threshold_low smallint default null, volatile enum_boolean DEFAULT NULL, zone_id integer DEFAULT NULL, command_endpoint_id integer DEFAULT NULL, notes text DEFAULT NULL, notes_url character varying(255) DEFAULT NULL, action_url character varying(255) DEFAULT NULL, icon_image character varying(255) DEFAULT NULL, icon_image_alt character varying(255) DEFAULT NULL, has_agent enum_boolean DEFAULT NULL, master_should_connect enum_boolean DEFAULT NULL, accept_config enum_boolean DEFAULT NULL, custom_endpoint_name character varying(255) DEFAULT NULL, api_key character varying(40) DEFAULT NULL, template_choice_id int DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_host_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_check_period FOREIGN KEY (check_period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_check_command FOREIGN KEY (check_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_event_command FOREIGN KEY (event_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_command_endpoint FOREIGN KEY (command_endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_host_template_choice FOREIGN KEY (template_choice_id) REFERENCES icinga_host_template_choice (id) ON DELETE SET NULL ON UPDATE CASCADE ); CREATE UNIQUE INDEX object_name_host ON icinga_host (object_name, zone_id); CREATE UNIQUE INDEX host_api_key ON icinga_host (api_key); CREATE INDEX host_zone ON icinga_host (zone_id); CREATE INDEX host_timeperiod ON icinga_host (check_period_id); CREATE INDEX host_check_command ON icinga_host (check_command_id); CREATE INDEX host_event_command ON icinga_host (event_command_id); CREATE INDEX host_command_endpoint ON icinga_host (command_endpoint_id); CREATE INDEX host_template_choice ON icinga_host (template_choice_id); CREATE TABLE icinga_host_inheritance ( host_id integer NOT NULL, parent_host_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (host_id, parent_host_id), CONSTRAINT icinga_host_inheritance_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_inheritance_parent_host FOREIGN KEY (parent_host_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX host_inheritance_unique_order ON icinga_host_inheritance (host_id, weight); CREATE INDEX host_inheritance_host ON icinga_host_inheritance (host_id); CREATE INDEX host_inheritance_host_parent ON icinga_host_inheritance (parent_host_id); CREATE TABLE icinga_host_field ( host_id integer NOT NULL, datafield_id integer NOT NULL, is_required enum_boolean NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (host_id, datafield_id), CONSTRAINT icinga_host_field_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_field_datafield FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX host_field_key ON icinga_host_field (host_id, datafield_id); CREATE INDEX host_field_host ON icinga_host_field (host_id); CREATE INDEX host_field_datafield ON icinga_host_field (datafield_id); COMMENT ON COLUMN icinga_host_field.host_id IS 'Makes only sense for templates'; CREATE TABLE icinga_host_var ( host_id integer NOT NULL, checksum bytea DEFAULT NULL UNIQUE CHECK(LENGTH(checksum) = 20), varname character varying(255) NOT NULL, varvalue text DEFAULT NULL, format enum_property_format, -- immer string vorerst PRIMARY KEY (host_id, varname), CONSTRAINT icinga_host_var_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX host_var_search_idx ON icinga_host_var (varname); CREATE INDEX host_var_host ON icinga_host_var (host_id); CREATE INDEX host_var_checksum ON icinga_host_var (checksum); ALTER TABLE icinga_host_template_choice ADD CONSTRAINT host_template_choice_required_template FOREIGN KEY (required_template_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE; CREATE TABLE icinga_service_set ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), host_id integer DEFAULT NULL, object_name character varying(128) NOT NULL, object_type enum_object_type_all NOT NULL, description text DEFAULT NULL, assign_filter text DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_service_set_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_set_name ON icinga_service_set (object_name, host_id); CREATE INDEX service_set_host ON icinga_service_set (host_id); CREATE TABLE icinga_service_template_choice ( id serial, object_name character varying(64) NOT NULL, description text DEFAULT NULL, min_required smallint NOT NULL DEFAULT 0, max_allowed smallint NOT NULL DEFAULT 1, required_template_id integer DEFAULT NULL, allowed_roles character varying(255) DEFAULT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX service_template_choice_object_name ON icinga_service_template_choice (object_name); CREATE INDEX service_template_choice_required_template ON icinga_service_template_choice (required_template_id); CREATE TABLE icinga_service ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean DEFAULT 'n', display_name character varying(255) DEFAULT NULL, host_id INTEGER DEFAULT NULL, service_set_id integer DEFAULT NULL, check_command_id integer DEFAULT NULL, max_check_attempts integer DEFAULT NULL, check_period_id integer DEFAULT NULL, check_interval character varying(8) DEFAULT NULL, retry_interval character varying(8) DEFAULT NULL, check_timeout smallint DEFAULT NULL, enable_notifications enum_boolean DEFAULT NULL, enable_active_checks enum_boolean DEFAULT NULL, enable_passive_checks enum_boolean DEFAULT NULL, enable_event_handler enum_boolean DEFAULT NULL, enable_flapping enum_boolean DEFAULT NULL, enable_perfdata enum_boolean DEFAULT NULL, event_command_id integer DEFAULT NULL, flapping_threshold_high smallint DEFAULT NULL, flapping_threshold_low smallint DEFAULT NULL, volatile enum_boolean DEFAULT NULL, zone_id integer DEFAULT NULL, command_endpoint_id integer DEFAULT NULL, notes text DEFAULT NULL, notes_url character varying(255) DEFAULT NULL, action_url character varying(255) DEFAULT NULL, icon_image character varying(255) DEFAULT NULL, icon_image_alt character varying(255) DEFAULT NULL, use_agent enum_boolean DEFAULT NULL, apply_for character varying(255) DEFAULT NULL, use_var_overrides enum_boolean DEFAULT NULL, assign_filter text DEFAULT NULL, template_choice_id int DEFAULT NULL, PRIMARY KEY (id), -- UNIQUE INDEX object_name (object_name, zone_id), CONSTRAINT icinga_service_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_check_period FOREIGN KEY (check_period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_check_command FOREIGN KEY (check_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_event_command FOREIGN KEY (event_command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_command_endpoint FOREIGN KEY (command_endpoint_id) REFERENCES icinga_endpoint (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_service_service_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_template_choice FOREIGN KEY (template_choice_id) REFERENCES icinga_service_template_choice (id) ON DELETE SET NULL ON UPDATE CASCADE ); CREATE INDEX service_zone ON icinga_service (zone_id); CREATE INDEX service_timeperiod ON icinga_service (check_period_id); CREATE INDEX service_check_command ON icinga_service (check_command_id); CREATE INDEX service_event_command ON icinga_service (event_command_id); CREATE INDEX service_command_endpoint ON icinga_service (command_endpoint_id); CREATE INDEX service_template_choice ON icinga_service (template_choice_id); CREATE TABLE icinga_service_inheritance ( service_id integer NOT NULL, parent_service_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (service_id, parent_service_id), CONSTRAINT icinga_service_inheritance_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_inheritance_parent_service FOREIGN KEY (parent_service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_inheritance_unique_order ON icinga_service_inheritance (service_id, weight); CREATE INDEX service_inheritance_service ON icinga_service_inheritance (service_id); CREATE INDEX service_inheritance_service_parent ON icinga_service_inheritance (parent_service_id); CREATE TABLE icinga_service_var ( service_id integer NOT NULL, checksum bytea DEFAULT NULL UNIQUE CHECK(LENGTH(checksum) = 20), varname character varying(255) NOT NULL, varvalue text DEFAULT NULL, format enum_property_format, PRIMARY KEY (service_id, varname), CONSTRAINT icinga_service_var_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX service_var_search_idx ON icinga_service_var (varname); CREATE INDEX service_var_service ON icinga_service_var (service_id); CREATE INDEX service_var_checksum ON icinga_service_var (checksum); CREATE TABLE icinga_service_field ( service_id integer NOT NULL, datafield_id integer NOT NULL, is_required enum_boolean NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (service_id, datafield_id), CONSTRAINT icinga_service_field_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_field_datafield FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_field_key ON icinga_service_field (service_id, datafield_id); CREATE INDEX service_field_service ON icinga_service_field (service_id); CREATE INDEX service_field_datafield ON icinga_service_field (datafield_id); COMMENT ON COLUMN icinga_service_field.service_id IS 'Makes only sense for templates'; ALTER TABLE icinga_service_template_choice ADD CONSTRAINT service_template_choice_required_template FOREIGN KEY (required_template_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE; CREATE TABLE icinga_host_service ( host_id integer NOT NULL, service_id integer NOT NULL, PRIMARY KEY (host_id, service_id), CONSTRAINT icinga_host_service_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_service_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX host_service_host ON icinga_host_service (host_id); CREATE INDEX host_service_service ON icinga_host_service (service_id); CREATE TABLE icinga_host_service_blacklist( host_id integer NOT NULL, service_id integer NOT NULL, PRIMARY KEY (host_id, service_id), CONSTRAINT icinga_host_service__bl_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_host_service_bl_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX host_service_bl_host ON icinga_host_service_blacklist (host_id); CREATE INDEX host_service_bl_service ON icinga_host_service_blacklist (service_id); CREATE TABLE icinga_service_set_inheritance ( service_set_id integer NOT NULL, parent_service_set_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (service_set_id, parent_service_set_id), CONSTRAINT icinga_service_set_inheritance_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_service_set_inheritance_parent FOREIGN KEY (parent_service_set_id) REFERENCES icinga_service_set (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_set_inheritance_unique_order ON icinga_service_set_inheritance (service_set_id, weight); CREATE INDEX service_set_inheritance_set ON icinga_service_set_inheritance (service_set_id); CREATE INDEX service_set_inheritance_parent ON icinga_service_set_inheritance (parent_service_set_id); CREATE TABLE icinga_service_set_var ( service_set_id integer NOT NULL, checksum bytea DEFAULT NULL UNIQUE CHECK(LENGTH(checksum) = 20), varname character varying(255) NOT NULL, varvalue text DEFAULT NULL, format enum_property_format NOT NULL DEFAULT 'string', PRIMARY KEY (service_set_id, varname), CONSTRAINT icinga_service_set_var_service_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX service_set_var_service_set ON icinga_service_set_var (service_set_id); CREATE INDEX service_set_var_search_idx ON icinga_service_set_var (varname); CREATE INDEX service_set_var_checksum ON icinga_service_set_var (checksum); CREATE TABLE icinga_hostgroup ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', display_name character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX hostgroup_object_name ON icinga_hostgroup (object_name); CREATE INDEX hostgroup_search_idx ON icinga_hostgroup (display_name); -- -- TODO: probably useless CREATE TABLE icinga_hostgroup_inheritance ( hostgroup_id integer NOT NULL, parent_hostgroup_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (hostgroup_id, parent_hostgroup_id), CONSTRAINT icinga_hostgroup_inheritance_hostgroup FOREIGN KEY (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_inheritance_parent_hostgroup FOREIGN KEY (parent_hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX hostgroup_inheritance_unique_order ON icinga_hostgroup_inheritance (hostgroup_id, weight); CREATE INDEX hostgroup_inheritance_hostgroup ON icinga_hostgroup_inheritance (hostgroup_id); CREATE INDEX hostgroup_inheritance_hostgroup_parent ON icinga_hostgroup_inheritance (parent_hostgroup_id); CREATE TABLE icinga_servicegroup ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', display_name character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX servicegroup_object_name ON icinga_servicegroup (object_name); CREATE INDEX servicegroup_search_idx ON icinga_servicegroup (display_name); CREATE TABLE icinga_servicegroup_service_resolved ( servicegroup_id integer NOT NULL, service_id integer NOT NULL, PRIMARY KEY (servicegroup_id, service_id), CONSTRAINT icinga_servicegroup_service_resolved_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_service_resolved_servicegroup FOREIGN KEY (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX servicegroup_service_resolved_service ON icinga_servicegroup_service_resolved (service_id); CREATE INDEX servicegroup_service_resolved_servicegroup ON icinga_servicegroup_service_resolved (servicegroup_id); CREATE TABLE icinga_servicegroup_inheritance ( servicegroup_id integer NOT NULL, parent_servicegroup_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (servicegroup_id, parent_servicegroup_id), CONSTRAINT icinga_servicegroup_inheritance_servicegroup FOREIGN KEY (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_inheritance_parent_servicegroup FOREIGN KEY (parent_servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX servicegroup_inheritance_unique_order ON icinga_servicegroup_inheritance (servicegroup_id, weight); CREATE INDEX servicegroup_inheritance_servicegroup ON icinga_servicegroup_inheritance (servicegroup_id); CREATE INDEX servicegroup_inheritance_servicegroup_parent ON icinga_servicegroup_inheritance (parent_servicegroup_id); CREATE TABLE icinga_servicegroup_service ( servicegroup_id integer NOT NULL, service_id integer NOT NULL, PRIMARY KEY (servicegroup_id, service_id), CONSTRAINT icinga_servicegroup_service_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_servicegroup_service_servicegroup FOREIGN KEY (servicegroup_id) REFERENCES icinga_servicegroup (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX servicegroup_service_service ON icinga_servicegroup_service (service_id); CREATE INDEX servicegroup_service_servicegroup ON icinga_servicegroup_service (servicegroup_id); CREATE TABLE icinga_hostgroup_host ( hostgroup_id integer NOT NULL, host_id integer NOT NULL, PRIMARY KEY (hostgroup_id, host_id), CONSTRAINT icinga_hostgroup_host_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_host_hostgroup FOREIGN KEY (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX hostgroup_host_host ON icinga_hostgroup_host (host_id); CREATE INDEX hostgroup_host_hostgroup ON icinga_hostgroup_host (hostgroup_id); CREATE TABLE icinga_hostgroup_host_resolved ( hostgroup_id integer NOT NULL, host_id integer NOT NULL, PRIMARY KEY (hostgroup_id, host_id), CONSTRAINT icinga_hostgroup_host_resolved_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_host_resolved_hostgroup FOREIGN KEY (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX hostgroup_host_resolved_host ON icinga_hostgroup_host_resolved (host_id); CREATE INDEX hostgroup_host_resolved_hostgroup ON icinga_hostgroup_host_resolved (hostgroup_id); CREATE TABLE icinga_hostgroup_parent ( hostgroup_id integer NOT NULL, parent_hostgroup_id integer NOT NULL, PRIMARY KEY (hostgroup_id, parent_hostgroup_id), CONSTRAINT icinga_hostgroup_parent_hostgroup FOREIGN KEY (hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_hostgroup_parent_parent FOREIGN KEY (parent_hostgroup_id) REFERENCES icinga_hostgroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX hostgroup_parent_hostgroup ON icinga_hostgroup_parent (hostgroup_id); CREATE INDEX hostgroup_parent_parent ON icinga_hostgroup_parent (parent_hostgroup_id); CREATE TABLE icinga_user ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', display_name character varying(255) DEFAULT NULL, email character varying(255) DEFAULT NULL, pager character varying(255) DEFAULT NULL, enable_notifications enum_boolean DEFAULT NULL, period_id integer DEFAULT NULL, zone_id integer DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_user_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_user_period FOREIGN KEY (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX user_object_name ON icinga_user (object_name, zone_id); CREATE INDEX user_zone ON icinga_user (zone_id); CREATE TABLE icinga_user_inheritance ( user_id integer NOT NULL, parent_user_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (user_id, parent_user_id), CONSTRAINT icinga_user_inheritance_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_user_inheritance_parent_user FOREIGN KEY (parent_user_id) REFERENCES icinga_user (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX user_inheritance_unique_order ON icinga_user_inheritance (user_id, weight); CREATE INDEX user_inheritance_user ON icinga_user_inheritance (user_id); CREATE INDEX user_inheritance_user_parent ON icinga_user_inheritance (parent_user_id); CREATE TABLE icinga_user_states_set ( user_id integer NOT NULL, property enum_state_name NOT NULL, merge_behaviour enum_set_merge_behaviour NOT NULL DEFAULT 'override', PRIMARY KEY (user_id, property, merge_behaviour), CONSTRAINT icinga_user_filter_state_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX user_states_set_user ON icinga_user_states_set (user_id); COMMENT ON COLUMN icinga_user_states_set.merge_behaviour IS 'override: = [], extend: += [], blacklist: -= []'; CREATE TABLE icinga_user_types_set ( user_id integer NOT NULL, property enum_type_name NOT NULL, merge_behaviour enum_set_merge_behaviour NOT NULL DEFAULT 'override', PRIMARY KEY (user_id, property, merge_behaviour), CONSTRAINT icinga_user_filter_type_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX user_types_set_user ON icinga_user_types_set (user_id); COMMENT ON COLUMN icinga_user_types_set.merge_behaviour IS 'override: = [], extend: += [], blacklist: -= []'; CREATE TABLE icinga_user_var ( user_id integer NOT NULL, checksum bytea DEFAULT NULL UNIQUE CHECK(LENGTH(checksum) = 20), varname character varying(255) NOT NULL, varvalue text DEFAULT NULL, format enum_property_format NOT NULL DEFAULT 'string', PRIMARY KEY (user_id, varname), CONSTRAINT icinga_user_var_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX user_var_search_idx ON icinga_user_var (varname); CREATE INDEX user_var_user ON icinga_user_var (user_id); CREATE INDEX user_var_checksum ON icinga_user_var (checksum); CREATE TABLE icinga_user_field ( user_id integer NOT NULL, datafield_id integer NOT NULL, is_required enum_boolean NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (user_id, datafield_id), CONSTRAINT icinga_user_field_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_user_field_datafield FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX user_field_key ON icinga_user_field (user_id, datafield_id); CREATE INDEX user_field_user ON icinga_user_field (user_id); CREATE INDEX user_field_datafield ON icinga_user_field (datafield_id); COMMENT ON COLUMN icinga_user_field.user_id IS 'Makes only sense for templates'; CREATE TABLE icinga_usergroup ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', display_name character varying(255) DEFAULT NULL, zone_id integer DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_usergroup_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX usergroup_search_idx ON icinga_usergroup (display_name); CREATE INDEX usergroup_object_name ON icinga_usergroup (object_name); CREATE INDEX usergroup_zone ON icinga_usergroup (zone_id); CREATE TABLE icinga_usergroup_inheritance ( usergroup_id integer NOT NULL, parent_usergroup_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (usergroup_id, parent_usergroup_id), CONSTRAINT icinga_usergroup_inheritance_usergroup FOREIGN KEY (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_usergroup_inheritance_parent_usergroup FOREIGN KEY (parent_usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX usergroup_inheritance_unique_order ON icinga_usergroup_inheritance (usergroup_id, weight); CREATE INDEX usergroup_inheritance_usergroup ON icinga_usergroup_inheritance (usergroup_id); CREATE INDEX usergroup_inheritance_usergroup_parent ON icinga_usergroup_inheritance (parent_usergroup_id); CREATE TABLE icinga_usergroup_user ( usergroup_id integer NOT NULL, user_id integer NOT NULL, PRIMARY KEY (usergroup_id, user_id), CONSTRAINT icinga_usergroup_user_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_usergroup_user_usergroup FOREIGN KEY (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX usergroup_user_user ON icinga_usergroup_user (user_id); CREATE INDEX usergroup_user_usergroup ON icinga_usergroup_user (usergroup_id); CREATE TABLE icinga_usergroup_parent ( usergroup_id integer NOT NULL, parent_usergroup_id integer NOT NULL, PRIMARY KEY (usergroup_id, parent_usergroup_id), CONSTRAINT icinga_usergroup_parent_usergroup FOREIGN KEY (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_usergroup_parent_parent FOREIGN KEY (parent_usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX usergroup_parent_usergroup ON icinga_usergroup_parent (usergroup_id); CREATE INDEX usergroup_parent_parent ON icinga_usergroup_parent (parent_usergroup_id); CREATE TABLE icinga_notification ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name CHARACTER VARYING(255) DEFAULT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', apply_to enum_host_service NULL DEFAULT NULL, host_id integer DEFAULT NULL, service_id integer DEFAULT NULL, times_begin integer DEFAULT NULL, times_end integer DEFAULT NULL, notification_interval integer DEFAULT NULL, command_id integer DEFAULT NULL, period_id integer DEFAULT NULL, zone_id integer DEFAULT NULL, users_var character varying(255) DEFAULT NULL, user_groups_var character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_notification_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_command FOREIGN KEY (command_id) REFERENCES icinga_command (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_notification_period FOREIGN KEY (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_notification_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE TABLE icinga_notification_user ( notification_id integer NOT NULL, user_id integer NOT NULL, PRIMARY KEY (notification_id, user_id), CONSTRAINT icinga_notification_user_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_user_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_notification_usergroup ( notification_id integer NOT NULL, usergroup_id integer NOT NULL, PRIMARY KEY (notification_id, usergroup_id), CONSTRAINT icinga_notification_usergroup_usergroup FOREIGN KEY (usergroup_id) REFERENCES icinga_usergroup (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_usergroup_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE import_source ( id serial, source_name character varying(64) NOT NULL, key_column character varying(64) NOT NULL, provider_class character varying(128) NOT NULL, import_state enum_sync_state NOT NULL DEFAULT 'unknown', last_error_message text NULL DEFAULT NULL, last_attempt timestamp with time zone NULL DEFAULT NULL, description text DEFAULT NULL, PRIMARY KEY (id) ); CREATE INDEX import_source_search_idx ON import_source (key_column); CREATE UNIQUE INDEX import_source_name ON import_source (source_name); CREATE TABLE import_source_setting ( source_id integer NOT NULL, setting_name character varying(64) NOT NULL, setting_value text NOT NULL, PRIMARY KEY (source_id, setting_name), CONSTRAINT import_source_settings_source FOREIGN KEY (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX import_source_setting_source ON import_source_setting (source_id); CREATE TABLE import_row_modifier ( id bigserial, source_id integer NOT NULL, property_name character varying(255) NOT NULL, target_property character varying(255) DEFAULT NULL, provider_class character varying(128) NOT NULL, priority integer NOT NULL, filter_expression text DEFAULT NULL, description text DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT row_modifier_import_source FOREIGN KEY (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX import_row_modifier_search_idx ON import_row_modifier (property_name); CREATE TABLE import_row_modifier_setting ( row_modifier_id serial, setting_name character varying(64) NOT NULL, setting_value TEXT DEFAULT NULL, PRIMARY KEY (row_modifier_id, setting_name), CONSTRAINT row_modifier_settings FOREIGN KEY (row_modifier_id) REFERENCES import_row_modifier (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE imported_rowset ( checksum bytea CHECK(LENGTH(checksum) = 20), PRIMARY KEY (checksum) ); CREATE TABLE import_run ( id serial, source_id integer NOT NULL, rowset_checksum bytea CHECK(LENGTH(rowset_checksum) = 20), start_time timestamp with time zone NOT NULL, end_time timestamp with time zone DEFAULT NULL, succeeded enum_boolean DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT import_run_source FOREIGN KEY (source_id) REFERENCES import_source (id) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT import_run_rowset FOREIGN KEY (rowset_checksum) REFERENCES imported_rowset (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX import_run_import_source ON import_run (source_id); CREATE INDEX import_run_rowset ON import_run (rowset_checksum); CREATE TABLE imported_row ( checksum bytea CHECK(LENGTH(checksum) = 20), object_name character varying(255) NOT NULL, PRIMARY KEY (checksum) ); COMMENT ON COLUMN imported_row.checksum IS 'sha1(object_name;property_checksum;...)'; CREATE TABLE imported_rowset_row ( rowset_checksum bytea CHECK(LENGTH(rowset_checksum) = 20), row_checksum bytea CHECK(LENGTH(row_checksum) = 20), PRIMARY KEY (rowset_checksum, row_checksum), CONSTRAINT imported_rowset_row_rowset FOREIGN KEY (rowset_checksum) REFERENCES imported_rowset (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT imported_rowset_row_row FOREIGN KEY (row_checksum) REFERENCES imported_row (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX imported_rowset_row_rowset_checksum ON imported_rowset_row (rowset_checksum); CREATE INDEX imported_rowset_row_row_checksum ON imported_rowset_row (row_checksum); CREATE TABLE imported_property ( checksum bytea CHECK(LENGTH(checksum) = 20), property_name character varying(64) NOT NULL, property_value text NOT NULL, format enum_property_format, PRIMARY KEY (checksum) ); CREATE INDEX imported_property_search_idx ON imported_property (property_name); CREATE TABLE imported_row_property ( row_checksum bytea CHECK(LENGTH(row_checksum) = 20), property_checksum bytea CHECK(LENGTH(property_checksum) = 20), PRIMARY KEY (row_checksum, property_checksum), CONSTRAINT imported_row_property_row FOREIGN KEY (row_checksum) REFERENCES imported_row (checksum) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT imported_row_property_property FOREIGN KEY (property_checksum) REFERENCES imported_property (checksum) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX imported_row_property_row_checksum ON imported_row_property (row_checksum); CREATE INDEX imported_row_property_property_checksum ON imported_row_property (property_checksum); CREATE TABLE sync_rule ( id serial, rule_name character varying(255) NOT NULL, object_type enum_sync_rule_object_type NOT NULL, update_policy enum_sync_rule_update_policy NOT NULL, purge_existing enum_boolean NOT NULL DEFAULT 'n', purge_action enum_sync_rule_purge_action NULL DEFAULT NULL, filter_expression text DEFAULT NULL, sync_state enum_sync_state NOT NULL DEFAULT 'unknown', last_error_message text NULL DEFAULT NULL, last_attempt timestamp with time zone NULL DEFAULT NULL, description text DEFAULT NULL, PRIMARY KEY (id) ); CREATE UNIQUE INDEX sync_rule_name ON sync_rule (rule_name); CREATE TABLE sync_property ( id serial, rule_id integer NOT NULL, source_id integer NOT NULL, source_expression character varying(255) NOT NULL, destination_field character varying(64), priority smallint NOT NULL, filter_expression text DEFAULT NULL, merge_policy enum_sync_property_merge_policy DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT sync_property_rule FOREIGN KEY (rule_id) REFERENCES sync_rule (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT sync_property_source FOREIGN KEY (source_id) REFERENCES import_source (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX sync_property_rule ON sync_property (rule_id); CREATE INDEX sync_property_source ON sync_property (source_id); CREATE TABLE sync_run ( id bigserial, rule_id integer DEFAULT NULL, rule_name character varying(255) NOT NULL, start_time TIMESTAMP WITH TIME ZONE NOT NULL, duration_ms integer DEFAULT NULL, objects_deleted integer DEFAULT 0, objects_created integer DEFAULT 0, objects_modified integer DEFAULT 0, last_former_activity bytea DEFAULT NULL CHECK(LENGTH(last_former_activity) = 20), last_related_activity bytea DEFAULT NULL CHECK(LENGTH(last_related_activity) = 20), PRIMARY KEY (id), CONSTRAINT sync_run_rule FOREIGN KEY (rule_id) REFERENCES sync_rule (id) ON DELETE SET NULL ON UPDATE CASCADE ); CREATE TABLE icinga_notification_states_set ( notification_id integer NOT NULL, property enum_state_name NOT NULL, merge_behaviour enum_set_merge_behaviour NOT NULL DEFAULT 'override', PRIMARY KEY (notification_id, property, merge_behaviour), CONSTRAINT icinga_notification_states_set_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); COMMENT ON COLUMN icinga_notification_states_set.merge_behaviour IS 'override: = [], extend: += [], blacklist: -= []'; CREATE TABLE icinga_notification_types_set ( notification_id integer NOT NULL, property enum_type_name NOT NULL, merge_behaviour enum_set_merge_behaviour NOT NULL DEFAULT 'override', PRIMARY KEY (notification_id, property, merge_behaviour), CONSTRAINT icinga_notification_types_set_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); COMMENT ON COLUMN icinga_notification_types_set.merge_behaviour IS 'override: = [], extend: += [], blacklist: -= []'; CREATE TABLE icinga_notification_var ( notification_id integer NOT NULL, checksum bytea DEFAULT NULL UNIQUE CHECK(LENGTH(checksum) = 20), varname VARCHAR(255) NOT NULL, varvalue TEXT DEFAULT NULL, format enum_property_format, PRIMARY KEY (notification_id, varname), CONSTRAINT icinga_notification_var_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX notification_var_command ON icinga_notification_var (notification_id); CREATE INDEX notification_var_search_idx ON icinga_notification_var (varname); CREATE INDEX notification_var_checksum ON icinga_notification_var (checksum); CREATE TABLE icinga_notification_field ( notification_id integer NOT NULL, datafield_id integer NOT NULL, is_required enum_boolean NOT NULL, var_filter TEXT DEFAULT NULL, PRIMARY KEY (notification_id, datafield_id), CONSTRAINT icinga_notification_field_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_field_datafield FOREIGN KEY (datafield_id) REFERENCES director_datafield (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX notification_field_key ON icinga_notification_field (notification_id, datafield_id); CREATE INDEX notification_field_notification ON icinga_notification_field (notification_id); CREATE INDEX notification_field_datafield ON icinga_notification_field (datafield_id); COMMENT ON COLUMN icinga_notification_field.notification_id IS 'Makes only sense for templates'; CREATE TABLE icinga_notification_inheritance ( notification_id integer NOT NULL, parent_notification_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (notification_id, parent_notification_id), CONSTRAINT icinga_notification_inheritance_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_notification_inheritance_parent_notification FOREIGN KEY (parent_notification_id) REFERENCES icinga_notification (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX notification_inheritance ON icinga_notification_inheritance (notification_id, weight); CREATE TABLE icinga_var ( checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), rendered_checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), varname character varying(255) NOT NULL, varvalue TEXT NOT NULL, rendered TEXT NOT NULL, PRIMARY KEY (checksum) ); CREATE INDEX var_search_idx ON icinga_var (varname); CREATE TABLE icinga_flat_var ( var_checksum bytea NOT NULL CHECK(LENGTH(var_checksum) = 20), flatname_checksum bytea NOT NULL CHECK(LENGTH(flatname_checksum) = 20), flatname character varying(512) NOT NULL, flatvalue TEXT NOT NULL, PRIMARY KEY (var_checksum, flatname_checksum), CONSTRAINT flat_var_var FOREIGN KEY (var_checksum) REFERENCES icinga_var (checksum) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX flat_var_var_checksum ON icinga_flat_var (var_checksum); CREATE INDEX flat_var_search_varname ON icinga_flat_var (flatname); CREATE INDEX flat_var_search_varvalue ON icinga_flat_var (flatvalue); CREATE TABLE icinga_command_resolved_var ( command_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (command_id, checksum), CONSTRAINT command_resolved_var_command FOREIGN KEY (command_id) REFERENCES icinga_command (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT command_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX command_resolved_var_search_varname ON icinga_command_resolved_var (varname); CREATE INDEX command_resolved_var_command_id ON icinga_command_resolved_var (command_id); CREATE INDEX command_resolved_var_schecksum ON icinga_command_resolved_var (checksum); CREATE TABLE icinga_host_resolved_var ( host_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (host_id, checksum), CONSTRAINT host_resolved_var_host FOREIGN KEY (host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT host_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX host_resolved_var_search_varname ON icinga_host_resolved_var (varname); CREATE INDEX host_resolved_var_host_id ON icinga_host_resolved_var (host_id); CREATE INDEX host_resolved_var_schecksum ON icinga_host_resolved_var (checksum); CREATE TABLE icinga_notification_resolved_var ( notification_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (notification_id, checksum), CONSTRAINT notification_resolved_var_notification FOREIGN KEY (notification_id) REFERENCES icinga_notification (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT notification_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX notification_resolved_var_search_varname ON icinga_notification_resolved_var (varname); CREATE INDEX notification_resolved_var_notification_id ON icinga_notification_resolved_var (notification_id); CREATE INDEX notification_resolved_var_schecksum ON icinga_notification_resolved_var (checksum); CREATE TABLE icinga_service_set_resolved_var ( service_set_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (service_set_id, checksum), CONSTRAINT service_set_resolved_var_service_set FOREIGN KEY (service_set_id) REFERENCES icinga_service_set (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT service_set_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX service_set_resolved_var_search_varname ON icinga_service_set_resolved_var (varname); CREATE INDEX service_set_resolved_var_service_set_id ON icinga_service_set_resolved_var (service_set_id); CREATE INDEX service_set_resolved_var_schecksum ON icinga_service_set_resolved_var (checksum); CREATE TABLE icinga_service_resolved_var ( service_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (service_id, checksum), CONSTRAINT service_resolved_var_service FOREIGN KEY (service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT service_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX service_resolved_var_search_varname ON icinga_service_resolved_var (varname); CREATE INDEX service_resolved_var_service_id ON icinga_service_resolved_var (service_id); CREATE INDEX service_resolved_var_schecksum ON icinga_service_resolved_var (checksum); CREATE TABLE icinga_user_resolved_var ( user_id integer NOT NULL, varname character varying(255) NOT NULL, checksum bytea NOT NULL CHECK(LENGTH(checksum) = 20), PRIMARY KEY (user_id, checksum), CONSTRAINT user_resolved_var_user FOREIGN KEY (user_id) REFERENCES icinga_user (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT user_resolved_var_checksum FOREIGN KEY (checksum) REFERENCES icinga_var (checksum) ON DELETE RESTRICT ON UPDATE RESTRICT ); CREATE INDEX user_resolved_var_search_varname ON icinga_user_resolved_var (varname); CREATE INDEX user_resolved_var_user_id ON icinga_user_resolved_var (user_id); CREATE INDEX user_resolved_var_schecksum ON icinga_user_resolved_var (checksum); CREATE TABLE icinga_dependency ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean DEFAULT 'n', apply_to enum_host_service NULL DEFAULT NULL, parent_host_id integer DEFAULT NULL, parent_host_var character varying(128) DEFAULT NULL, parent_service_id integer DEFAULT NULL, child_host_id integer DEFAULT NULL, child_service_id integer DEFAULT NULL, disable_checks enum_boolean DEFAULT NULL, disable_notifications enum_boolean DEFAULT NULL, ignore_soft_states enum_boolean DEFAULT NULL, period_id integer DEFAULT NULL, zone_id integer DEFAULT NULL, assign_filter text DEFAULT NULL, parent_service_by_name character varying(255), redundancy_group character varying(255), PRIMARY KEY (id), CONSTRAINT icinga_dependency_parent_host FOREIGN KEY (parent_host_id) REFERENCES icinga_host (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_parent_service FOREIGN KEY (parent_service_id) REFERENCES icinga_service (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_child_host FOREIGN KEY (child_host_id) REFERENCES icinga_host (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_child_service FOREIGN KEY (child_service_id) REFERENCES icinga_service (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_period FOREIGN KEY (period_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_dependency_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE INDEX dependency_parent_host ON icinga_dependency (parent_host_id); CREATE INDEX dependency_parent_service ON icinga_dependency (parent_service_id); CREATE INDEX dependency_child_host ON icinga_dependency (child_host_id); CREATE INDEX dependency_child_service ON icinga_dependency (child_service_id); CREATE INDEX dependency_period ON icinga_dependency (period_id); CREATE INDEX dependency_zone ON icinga_dependency (zone_id); CREATE TABLE icinga_dependency_inheritance ( dependency_id integer NOT NULL, parent_dependency_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (dependency_id, parent_dependency_id), CONSTRAINT icinga_dependency_inheritance_dependency FOREIGN KEY (dependency_id) REFERENCES icinga_dependency (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_dependency_inheritance_parent_dependency FOREIGN KEY (parent_dependency_id) REFERENCES icinga_dependency (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX dependency_inheritance_unique_order ON icinga_dependency_inheritance (dependency_id, weight); CREATE INDEX dependency_inheritance_dependency ON icinga_dependency_inheritance (dependency_id); CREATE INDEX dependency_inheritance_dependency_parent ON icinga_dependency_inheritance (parent_dependency_id); CREATE TABLE icinga_dependency_states_set ( dependency_id integer NOT NULL, property enum_state_name NOT NULL, merge_behaviour enum_set_merge_behaviour NOT NULL DEFAULT 'override', PRIMARY KEY (dependency_id, property, merge_behaviour), CONSTRAINT icinga_dependency_states_set_dependency FOREIGN KEY (dependency_id) REFERENCES icinga_dependency (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX dependency_states_set_dependency ON icinga_dependency_states_set (dependency_id); COMMENT ON COLUMN icinga_dependency_states_set.merge_behaviour IS 'override: = [], extend: += [], blacklist: -= []'; CREATE TABLE icinga_timeperiod_include ( timeperiod_id integer NOT NULL, include_id integer NOT NULL, PRIMARY KEY (timeperiod_id, include_id), CONSTRAINT icinga_timeperiod_timeperiod_include FOREIGN KEY (include_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_timeperiod_include FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_timeperiod_exclude ( timeperiod_id integer NOT NULL, exclude_id integer NOT NULL, PRIMARY KEY (timeperiod_id, exclude_id), CONSTRAINT icinga_timeperiod_timeperiod_exclude FOREIGN KEY (exclude_id) REFERENCES icinga_timeperiod (id) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT icinga_timeperiod_exclude FOREIGN KEY (timeperiod_id) REFERENCES icinga_timeperiod (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE icinga_scheduled_downtime ( id serial, uuid bytea UNIQUE CHECK(LENGTH(uuid) = 16), object_name character varying(255) NOT NULL, zone_id integer DEFAULT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean NOT NULL DEFAULT 'n', apply_to enum_host_service NULL DEFAULT NULL, assign_filter text DEFAULT NULL, author character varying(255) DEFAULT NULL, comment text DEFAULT NULL, fixed enum_boolean DEFAULT NULL, duration int DEFAULT NULL, with_services enum_boolean NULL DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT icinga_scheduled_downtime_zone FOREIGN KEY (zone_id) REFERENCES icinga_zone (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX scheduled_downtime_object_name ON icinga_scheduled_downtime (object_name); CREATE INDEX scheduled_downtime_zone ON icinga_scheduled_downtime (zone_id); CREATE TABLE icinga_scheduled_downtime_inheritance ( scheduled_downtime_id integer NOT NULL, parent_scheduled_downtime_id integer NOT NULL, weight integer DEFAULT NULL, PRIMARY KEY (scheduled_downtime_id, parent_scheduled_downtime_id), CONSTRAINT icinga_scheduled_downtime_inheritance_scheduled_downtime FOREIGN KEY (scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT icinga_scheduled_downtime_inheritance_parent_scheduled_downtime FOREIGN KEY (parent_scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE RESTRICT ON UPDATE CASCADE ); CREATE UNIQUE INDEX scheduled_downtime_inheritance_unique_order ON icinga_scheduled_downtime_inheritance (scheduled_downtime_id, weight); CREATE INDEX scheduled_downtime_inheritance_scheduled_downtime ON icinga_scheduled_downtime_inheritance (scheduled_downtime_id); CREATE INDEX scheduled_downtime_inheritance_scheduled_downtime_parent ON icinga_scheduled_downtime_inheritance (parent_scheduled_downtime_id); CREATE TABLE icinga_scheduled_downtime_range ( scheduled_downtime_id serial, range_key character varying(255) NOT NULL, range_value character varying(255) NOT NULL, range_type enum_timeperiod_range_type NOT NULL DEFAULT 'include', merge_behaviour enum_merge_behaviour NOT NULL DEFAULT 'set', PRIMARY KEY (scheduled_downtime_id, range_type, range_key), CONSTRAINT icinga_scheduled_downtime_range_scheduled_downtime FOREIGN KEY (scheduled_downtime_id) REFERENCES icinga_scheduled_downtime (id) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX scheduled_downtime_range_scheduled_downtime ON icinga_scheduled_downtime_range (scheduled_downtime_id); COMMENT ON COLUMN icinga_scheduled_downtime_range.range_key IS 'monday, ...'; COMMENT ON COLUMN icinga_scheduled_downtime_range.range_value IS '00:00-24:00, ...'; COMMENT ON COLUMN icinga_scheduled_downtime_range.range_type IS 'include -> ranges {}, exclude ranges_ignore {} - not yet'; COMMENT ON COLUMN icinga_scheduled_downtime_range.merge_behaviour IS 'set -> = {}, add -> += {}, substract -> -= {}'; CREATE TABLE director_branch ( uuid bytea NOT NULL UNIQUE CHECK(LENGTH(uuid) = 16), owner character varying(255) NOT NULL, branch_name character varying(255) NOT NULL, description text DEFAULT NULL, ts_merge_request bigint DEFAULT NULL, PRIMARY KEY(uuid) ); CREATE UNIQUE INDEX branch_branch_name ON director_branch (branch_name); CREATE TYPE enum_branch_action AS ENUM('create', 'modify', 'delete'); CREATE TABLE director_branch_activity ( timestamp_ns bigint NOT NULL, object_uuid bytea NOT NULL CHECK(LENGTH(object_uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), action enum_branch_action NOT NULL, object_table character varying(64) NOT NULL, author character varying(255) NOT NULL, former_properties text NOT NULL, modified_properties text NOT NULL, PRIMARY KEY (timestamp_ns), CONSTRAINT branch_activity_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX branch_activity_object_uuid ON director_branch_activity (object_uuid); CREATE INDEX branch_activity_branch_uuid ON director_branch_activity (branch_uuid); CREATE TABLE branched_icinga_host ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name CHARACTER VARYING(255) DEFAULT NULL, address character varying(255) DEFAULT NULL, address6 character varying(45) DEFAULT NULL, check_command character varying(255) DEFAULT NULL, max_check_attempts integer DEFAULT NULL, check_period character varying(255) DEFAULT NULL, check_interval character varying(8) DEFAULT NULL, retry_interval character varying(8) DEFAULT NULL, check_timeout smallint DEFAULT NULL, enable_notifications enum_boolean DEFAULT NULL, enable_active_checks enum_boolean DEFAULT NULL, enable_passive_checks enum_boolean DEFAULT NULL, enable_event_handler enum_boolean DEFAULT NULL, enable_flapping enum_boolean DEFAULT NULL, enable_perfdata enum_boolean DEFAULT NULL, event_command character varying(255) DEFAULT NULL, flapping_threshold_high smallint default null, flapping_threshold_low smallint default null, volatile enum_boolean DEFAULT NULL, zone character varying(255) DEFAULT NULL, command_endpoint character varying(255) DEFAULT NULL, notes text DEFAULT NULL, notes_url character varying(255) DEFAULT NULL, action_url character varying(255) DEFAULT NULL, icon_image character varying(255) DEFAULT NULL, icon_image_alt character varying(255) DEFAULT NULL, has_agent enum_boolean DEFAULT NULL, master_should_connect enum_boolean DEFAULT NULL, accept_config enum_boolean DEFAULT NULL, custom_endpoint_name character varying(255) DEFAULT NULL, api_key character varying(40) DEFAULT NULL, -- template_choice character varying(255) DEFAULT NULL, -- TODO: Forbid them! imports TEXT DEFAULT NULL, groups TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_host_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX host_branch_object_name ON branched_icinga_host (branch_uuid, object_name); CREATE INDEX branched_host_search_object_name ON branched_icinga_host (object_name); CREATE INDEX branched_host_search_display_name ON branched_icinga_host (display_name); CREATE TABLE branched_icinga_hostgroup ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_hostgroup_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX hostgroup_branch_object_name ON branched_icinga_hostgroup (branch_uuid, object_name); CREATE INDEX branched_hostgroup_search_object_name ON branched_icinga_hostgroup (object_name); CREATE INDEX branched_hostgroup_search_display_name ON branched_icinga_hostgroup (display_name); CREATE TABLE branched_icinga_servicegroup ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_servicegroup_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX servicegroup_branch_object_name ON branched_icinga_servicegroup (branch_uuid, object_name); CREATE INDEX branched_servicegroup_search_object_name ON branched_icinga_servicegroup (object_name); CREATE INDEX branched_servicegroup_search_display_name ON branched_icinga_servicegroup (display_name); CREATE TABLE branched_icinga_usergroup ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_usergroup_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX usergroup_branch_object_name ON branched_icinga_usergroup (branch_uuid, object_name); CREATE INDEX branched_usergroup_search_object_name ON branched_icinga_usergroup (object_name); CREATE INDEX branched_usergroup_search_display_name ON branched_icinga_usergroup (display_name); CREATE TABLE branched_icinga_user ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, email character varying(255) DEFAULT NULL, pager character varying(255) DEFAULT NULL, enable_notifications enum_boolean DEFAULT NULL, period character varying(255) DEFAULT NULL, zone character varying(255) DEFAULT NULL, imports TEXT DEFAULT NULL, groups TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_user_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX user_branch_object_name ON branched_icinga_user (branch_uuid, object_name); CREATE INDEX branched_user_search_object_name ON branched_icinga_user (object_name); CREATE INDEX branched_user_search_display_name ON branched_icinga_user (display_name); CREATE TABLE branched_icinga_zone ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, parent character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, is_global enum_boolean DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_zone_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX zone_branch_object_name ON branched_icinga_zone (branch_uuid, object_name); CREATE INDEX branched_zone_search_object_name ON branched_icinga_zone (object_name); CREATE TABLE branched_icinga_timeperiod ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, display_name character varying(255) DEFAULT NULL, update_method character varying(64) DEFAULT NULL, zone character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, prefer_includes enum_boolean DEFAULT NULL, imports TEXT DEFAULT NULL, ranges TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_timeperiod_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX timeperiod_branch_object_name ON branched_icinga_timeperiod (branch_uuid, object_name); CREATE INDEX branched_timeperiod_search_object_name ON branched_icinga_timeperiod (object_name); CREATE INDEX branched_timeperiod_search_display_name ON branched_icinga_timeperiod (display_name); CREATE TABLE branched_icinga_command ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean NOT NULL DEFAULT NULL, methods_execute character varying(64) DEFAULT NULL, command text DEFAULT NULL, is_string enum_boolean DEFAULT NULL, -- env text DEFAULT NULL, timeout smallint DEFAULT NULL, zone character varying(255) DEFAULT NULL, imports TEXT DEFAULT NULL, arguments TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_command_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX command_branch_object_name ON branched_icinga_command (branch_uuid, object_name); CREATE INDEX branched_command_search_object_name ON branched_icinga_command (object_name); CREATE TABLE branched_icinga_apiuser ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name CHARACTER VARYING(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean NOT NULL DEFAULT NULL, password CHARACTER VARYING(255) DEFAULT NULL, client_dn CHARACTER VARYING(64) DEFAULT NULL, permissions TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_apiuser_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX apiuser_branch_object_name ON branched_icinga_apiuser (branch_uuid, object_name); CREATE INDEX branched_apiuser_search_object_name ON branched_icinga_apiuser (object_name); CREATE TABLE branched_icinga_endpoint ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', zone character varying(255) DEFAULT NULL, object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean NOT NULL DEFAULT NULL, host character varying(255) DEFAULT NULL, port d_smallint DEFAULT NULL, log_duration character varying(32) DEFAULT NULL, apiuser character varying(255) DEFAULT NULL, imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_endpoint_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX endpoint_branch_object_name ON branched_icinga_endpoint (branch_uuid, object_name); CREATE INDEX branched_endpoint_search_object_name ON branched_icinga_endpoint (object_name); CREATE TABLE branched_icinga_service ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, display_name character varying(255) DEFAULT NULL, host character varying(255) DEFAULT NULL, service_set character varying(255) DEFAULT NULL, check_command character varying(255) DEFAULT NULL, max_check_attempts integer DEFAULT NULL, check_period character varying(255) DEFAULT NULL, check_interval character varying(8) DEFAULT NULL, retry_interval character varying(8) DEFAULT NULL, check_timeout smallint DEFAULT NULL, enable_notifications enum_boolean DEFAULT NULL, enable_active_checks enum_boolean DEFAULT NULL, enable_passive_checks enum_boolean DEFAULT NULL, enable_event_handler enum_boolean DEFAULT NULL, enable_flapping enum_boolean DEFAULT NULL, enable_perfdata enum_boolean DEFAULT NULL, event_command character varying(255) DEFAULT NULL, flapping_threshold_high smallint DEFAULT NULL, flapping_threshold_low smallint DEFAULT NULL, volatile enum_boolean DEFAULT NULL, zone character varying(255) DEFAULT NULL, command_endpoint character varying(255) DEFAULT NULL, notes text DEFAULT NULL, notes_url character varying(255) DEFAULT NULL, action_url character varying(255) DEFAULT NULL, icon_image character varying(255) DEFAULT NULL, icon_image_alt character varying(255) DEFAULT NULL, use_agent enum_boolean DEFAULT NULL, apply_for character varying(255) DEFAULT NULL, use_var_overrides enum_boolean DEFAULT NULL, assign_filter text DEFAULT NULL, -- template_choice_id int DEFAULT NULL, imports TEXT DEFAULT NULL, groups TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_service_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE INDEX branched_service_search_object_name ON branched_icinga_service (object_name); CREATE INDEX branched_service_search_display_name ON branched_icinga_service (display_name); CREATE TABLE branched_icinga_service_set ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, host character varying(255) DEFAULT NULL, description TEXT DEFAULT NULL, assign_filter text DEFAULT NULL, imports TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_service_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX service_set_branch_object_name ON branched_icinga_service_set (branch_uuid, object_name); CREATE INDEX branched_service_set_search_object_name ON branched_icinga_service_set (object_name); CREATE TABLE branched_icinga_notification ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name CHARACTER VARYING(255) DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, apply_to enum_host_service DEFAULT NULL, host character varying(255) DEFAULT NULL, service character varying(255) DEFAULT NULL, times_begin integer DEFAULT NULL, times_end integer DEFAULT NULL, notification_interval integer DEFAULT NULL, command character varying(255) DEFAULT NULL, period character varying(255) DEFAULT NULL, zone character varying(255) DEFAULT NULL, users_var character varying(255) DEFAULT NULL, user_groups_var character varying(255) DEFAULT NULL, assign_filter text DEFAULT NULL, states TEXT DEFAULT NULL, types TEXT DEFAULT NULL, users TEXT DEFAULT NULL, usergroups TEXT DEFAULT NULL, imports TEXT DEFAULT NULL, vars TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_notification_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX notification_branch_object_name ON branched_icinga_notification (branch_uuid, object_name); CREATE INDEX branched_notification_search_object_name ON branched_icinga_notification (object_name); CREATE TABLE branched_icinga_scheduled_downtime ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) DEFAULT NULL, zone_id integer DEFAULT NULL, object_type enum_object_type_all DEFAULT NULL, disabled enum_boolean DEFAULT NULL, apply_to enum_host_service DEFAULT NULL, assign_filter text DEFAULT NULL, author character varying(255) DEFAULT NULL, comment text DEFAULT NULL, fixed enum_boolean DEFAULT NULL, duration int DEFAULT NULL, with_services enum_boolean DEFAULT NULL, imports TEXT DEFAULT NULL, ranges TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_scheduled_downtime_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX scheduled_downtime_branch_object_name ON branched_icinga_scheduled_downtime (branch_uuid, object_name); CREATE INDEX branched_scheduled_downtime_search_object_name ON branched_icinga_scheduled_downtime (object_name); CREATE TABLE branched_icinga_dependency ( uuid bytea NOT NULL CHECK(LENGTH(uuid) = 16), branch_uuid bytea NOT NULL CHECK(LENGTH(branch_uuid) = 16), branch_created enum_boolean NOT NULL DEFAULT 'n', branch_deleted enum_boolean NOT NULL DEFAULT 'n', object_name character varying(255) NOT NULL, object_type enum_object_type_all NOT NULL, disabled enum_boolean DEFAULT 'n', apply_to enum_host_service NULL DEFAULT NULL, parent_host character varying(255) DEFAULT NULL, parent_host_var character varying(128) DEFAULT NULL, parent_service character varying(255) DEFAULT NULL, child_host character varying(255) DEFAULT NULL, child_service character varying(255) DEFAULT NULL, disable_checks enum_boolean DEFAULT NULL, disable_notifications enum_boolean DEFAULT NULL, ignore_soft_states enum_boolean DEFAULT NULL, period_id integer DEFAULT NULL, zone_id integer DEFAULT NULL, assign_filter text DEFAULT NULL, parent_service_by_name character varying(255), redundancy_group character varying(255), imports TEXT DEFAULT NULL, set_null TEXT DEFAULT NULL, PRIMARY KEY (branch_uuid, uuid), CONSTRAINT icinga_dependency_branch FOREIGN KEY (branch_uuid) REFERENCES director_branch (uuid) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX dependency_branch_object_name ON branched_icinga_dependency (branch_uuid, object_name); CREATE INDEX branched_dependency_search_object_name ON branched_icinga_dependency (object_name); INSERT INTO director_schema_migration (schema_version, migration_time) VALUES (190, NOW()); icingaweb2-module-director-1.11.8/test/000077500000000000000000000000001516513262500176755ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/bootstrap.php000066400000000000000000000007161516513262500224270ustar00rootroot00000000000000=0.3.0'); $this->assertFalse($dependency->isInstalled()); } public function testNotSatisfiedWhenNotInstalled() { $dependency = new Dependency('something', '>=0.3.0'); $this->assertFalse($dependency->isSatisfied()); } public function testIsInstalled() { $dependency = new Dependency('something', '>=0.3.0'); $dependency->setInstalledVersion('1.10.0'); $this->assertTrue($dependency->isInstalled()); } public function testNotEnabled() { $dependency = new Dependency('something', '>=0.3.0'); $this->assertFalse($dependency->isEnabled()); } public function testIsEnabled() { $dependency = new Dependency('something', '>=0.3.0'); $dependency->setEnabled(); $this->assertTrue($dependency->isEnabled()); } public function testNotSatisfiedWhenNotEnabled() { $dependency = new Dependency('something', '>=0.3.0'); $dependency->setInstalledVersion('1.10.0'); $this->assertFalse($dependency->isSatisfied()); } public function testSatisfiedWhenEqual() { $dependency = new Dependency('something', '>=0.3.0'); $dependency->setInstalledVersion('0.3.0'); $dependency->setEnabled(); $this->assertTrue($dependency->isSatisfied()); } public function testSatisfiedWhenGreater() { $dependency = new Dependency('something', '>=0.3.0'); $dependency->setInstalledVersion('0.10.0'); $dependency->setEnabled(); $this->assertTrue($dependency->isSatisfied()); } public function testNotSatisfiedWhenSmaller() { $dependency = new Dependency('something', '>=20.3.0'); $dependency->setInstalledVersion('4.999.999'); $dependency->setEnabled(); $this->assertFalse($dependency->isSatisfied()); } } FiltersWorkAsExpectedTest.php000066400000000000000000000005651516513262500336670ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/ApplicationassertTrue($filter->matches((object) ['a' => '1']), '1 is not true'); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Application/MemoryLimitTest.php000066400000000000000000000031261516513262500317700ustar00rootroot00000000000000assertTrue(is_int(MemoryLimit::parsePhpIniByteString('1073741824'))); $this->assertEquals( 1073741824, MemoryLimit::parsePhpIniByteString('1073741824') ); } public function testIntegersAreAccepted() { $this->assertEquals( MemoryLimit::parsePhpIniByteString(1073741824), 1073741824 ); } public function testNoLimitGivesMinusOne() { $this->assertTrue(is_int(MemoryLimit::parsePhpIniByteString('-1'))); $this->assertEquals( -1, MemoryLimit::parsePhpIniByteString('-1') ); } public function testInvalidStringGivesBytes() { $this->assertEquals( 1024, MemoryLimit::parsePhpIniByteString('1024MB') ); } public function testHandlesKiloBytes() { $this->assertEquals( 45 * 1024, MemoryLimit::parsePhpIniByteString('45K') ); } public function testHandlesMegaBytes() { $this->assertEquals( 512 * 1024 * 1024, MemoryLimit::parsePhpIniByteString('512M') ); } public function testHandlesGigaBytes() { $this->assertEquals( 2 * 1024 * 1024 * 1024, MemoryLimit::parsePhpIniByteString('2G') ); } } icingaweb2-module-director-1.11.8/test/php/library/Director/CustomVariable/000077500000000000000000000000001516513262500266235ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/CustomVariable/CustomVariablesTest.php000066400000000000000000000036201516513262500333000ustar00rootroot00000000000000newVars(); $vars->bla = 'da'; $vars->{'aBc'} = 'normal'; $vars->{'a-0'} = 'special'; $expected = $this->indentVarsList([ 'vars["a-0"] = "special"', 'vars.aBc = "normal"', 'vars.bla = "da"' ]); $this->assertEquals($expected, $vars->toConfigString()); } public function testVarsCanBeUnsetAndSetAgain() { $vars = $this->newVars(); $vars->one = 'two'; unset($vars->one); $vars->one = 'three'; $res = []; foreach ($vars as $k => $v) { $res[$k] = $v->getValue(); } $this->assertEquals(['one' => 'three'], $res); } public function testNumericKeysAreRenderedWithArraySyntax() { $vars = $this->newVars(); $vars->{'1'} = 1; $expected = $this->indentVarsList([ 'vars["1"] = 1' ]); $this->assertEquals( $expected, $vars->toConfigString(true) ); } public function testVariablesToExpression() { $vars = $this->newVars(); $vars->bla = 'da'; $vars->abc = '$val$'; $expected = $this->indentVarsList([ 'vars.abc = "$val$"', 'vars.bla = "da"' ]); $this->assertEquals($expected, $vars->toConfigString(true)); } protected function indentVarsList($vars) { return $this->indent . implode( "\n" . $this->indent, $vars ) . "\n"; } protected function newVars() { return new CustomVariables(); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Data/000077500000000000000000000000001516513262500245545ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/Data/AssignFilterHelperTest.php000066400000000000000000000056161516513262500316670ustar00rootroot00000000000000 '127.0.0.1', 'vars.operatingsystem' => 'centos', 'vars.customer' => 'ACME', 'vars.roles' => ['webserver', 'mailserver'], 'vars.bool_string' => 'true', 'groups' => ['web-server', 'mail-server'], ]; } public function testSimpleApplyFilter() { $this->assertFilterOutcome(true, 'host.address=true', self::$exampleHost); $this->assertFilterOutcome(false, 'host.address=false', self::$exampleHost); $this->assertFilterOutcome(true, 'host.address=false', (object) ['address' => null]); $this->assertFilterOutcome(false, 'host.address=true', (object) ['address' => null]); $this->assertFilterOutcome(true, 'host.address=%22127.0.0.%2A%22', self::$exampleHost); } public function testListApplyFilter() { $this->assertFilterOutcome(true, 'host.vars.roles=%22*server%22', self::$exampleHost); $this->assertFilterOutcome(true, 'host.groups=%22*-server%22', self::$exampleHost); $this->assertFilterOutcome(false, 'host.groups=%22*-nothing%22', self::$exampleHost); } public function testComplexApplyFilter() { $this->assertFilterOutcome( true, 'host.vars.operatingsystem=%5B%22centos%22%2C%22fedora%22%5D|host.vars.osfamily=%22redhat%22', self::$exampleHost ); $this->assertFilterOutcome( false, 'host.vars.operatingsystem=%5B%22centos%22%2C%22fedora%22%5D&(!(host.vars.customer=%22acme*%22))', self::$exampleHost ); $this->assertFilterOutcome( true, '!(host.vars.bool_string="false")&host.vars.operatingsystem="centos"', self::$exampleHost ); } /** * @param bool $expected * @param string $filterQuery * @param object $object * @param string $message */ protected function assertFilterOutcome($expected, $filterQuery, $object, $message = null, $type = 'host') { $filter = Filter::fromQueryString($filterQuery); if ($type === 'host') { HostApplyMatches::fixFilterColumns($filter); } $helper = new AssignFilterHelper($filter); $actual = $helper->matches($object); if ($message === null) { $message = sprintf('with filter "%s"', $filterQuery); } $this->assertEquals($expected, $actual, $message); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Data/RecursiveUtf8ValidatorTest.php000066400000000000000000000022051516513262500325100ustar00rootroot00000000000000expectException(\InvalidArgumentException::class); RecursiveUtf8Validator::validateRows([ (object) [ 'name' => 'test 1', 'value' => 'something', ], (object) [ 'name' => 'test 2', 'value' => "some\xa1\xa2thing", ], ]); } public function testAcceptValidUtf8Characters() { $this->assertTrue(RecursiveUtf8Validator::validateRows([ (object) [ 'name' => 'test 1', 'value' => "Some ðŸ»", ], (object) [ 'name' => 'test 2', 'value' => [ (object) [ 'its' => true, ['💩'] ] ], ], ])); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Form/000077500000000000000000000000001516513262500246065ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/Form/IcingaObjectFieldFormTest.php000066400000000000000000000103501516513262500322670ustar00rootroot00000000000000hasDb()) { $db = $this->getDb(); $this->testDatafield = DirectorDatafield::create([ 'varname' => self::DATAFIELD_NAME, 'caption' => 'Blah', 'description' => '', 'datatype' => 'Icinga\Module\Director\DataType\DataTypeArray', 'format' => 'json' ]); $this->testDatafield->store($db); $this->testIcingaCommand = IcingaCommand::create( [ 'object_name' => self::COMMAND_NAME, 'object_type' => 'object' ], $db ); $this->testIcingaCommand->store($db); $this->testHost = IcingaHost::create([ 'object_name' => self::HOST_NAME, 'object_type' => 'object', 'display_name' => 'Whatever' ], $this->getDb()); } } public function testFieldSuggestionsWithoutCheckCommand() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $icingaHostFieldForm = (new IcingaObjectFieldForm()) ->setDb($db) ->setIcingaObject($this->testHost); $icingaHostFieldForm->setup(); /** @var array $suggestions */ $suggestions = $icingaHostFieldForm->getElement('datafield_id') ->getAttrib('options'); array_shift($suggestions); $this->assertEquals( [ 'Other available fields' => [ $this->testDatafield->get('id') => "Blah (dataFieldTest)" ] ], $suggestions ); } public function testFieldSuggestionsWithCheckCommand() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $this->testHost->check_command = self::COMMAND_NAME; $icingaHostFieldForm = (new IcingaObjectFieldForm()) ->setDb($db) ->setIcingaObject($this->testHost); $icingaHostFieldForm->setup(); /** @var array $suggestions */ $suggestions = $icingaHostFieldForm->getElement('datafield_id') ->getAttrib('options'); array_shift($suggestions); $this->assertEquals( [ 'Other available fields' => [ $this->testDatafield->get('id') => "Blah (dataFieldTest)" ] ], $suggestions ); } public function tearDown(): void { if ($this->hasDb()) { $db = $this->getDb(); $this->deleteDatafields(); if (IcingaHost::exists(self::HOST_NAME, $db)) { IcingaHost::load(self::HOST_NAME, $db)->delete(); } if (IcingaCommand::exists(self::COMMAND_NAME, $db)) { IcingaCommand::load(self::COMMAND_NAME, $db)->delete(); } } parent::tearDown(); } protected function deleteDatafields() { $db = $this->getDb(); $dbAdapter = $db->getDbAdapter(); $query = $dbAdapter->select() ->from('director_datafield') ->where('varname = ?', self::DATAFIELD_NAME); foreach (DirectorDatafield::loadAll($db, $query, 'id') as $datafield) { $datafield->delete(); } } } icingaweb2-module-director-1.11.8/test/php/library/Director/IcingaConfig/000077500000000000000000000000001516513262500262235ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/IcingaConfig/AssignRendererTest.php000066400000000000000000000073521516513262500325160ustar00rootroot00000000000000assertEquals( $expected, $this->renderer($string)->renderAssign() ); } public function testNegationIsRenderedCorrectlyOnRootLevel() { $string = '!(host.name="one"&host.name="two")'; $expected = 'assign where !(host.name == "one" && host.name == "two")'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); } public function testNegationIsRenderedCorrectlyOnDeeperLevel() { $string = 'host.address="127.*"&!host.name="localhost"'; $expected = 'assign where match("127.*", host.address) && !(host.name == "localhost")'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); } public function testWildcardsRenderAMatchMethod() { $string = 'host.address="127.0.0.*"'; $expected = 'assign where match("127.0.0.*", host.address)'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); } public function testACombinedFilterRendersCorrectly() { $string = 'host.name="*internal"|(service.vars.priority<2' . '&host.vars.is_clustered=true)'; $expected = 'assign where match("*internal", host.name) ||' . ' (service.vars.priority < 2 && host.vars.is_clustered)'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); } public function testSlashesAreNotEscaped() { $string = 'host.name=' . json_encode('a/b'); $expected = 'assign where host.name == "a/b"'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); } public function testFakeContainsOperatorRendersCorrectly() { $string = json_encode('member') . '=host.groups'; $expected = 'assign where "member" in host.groups'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); $string = json_encode('member') . '=host.vars.some_array'; $expected = 'assign where "member" in host.vars.some_array'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); $string = json_encode('member*') . '=host.vars.some_array'; $expected = 'assign where match("member*", host.vars.some_array, MatchAny)'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); } public function testInArrayIsRenderedCorrectly() { $string = 'host.name=' . json_encode(array('a' ,'b')); $expected = 'assign where host.name in [ "a", "b" ]'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); } public function testWhetherSlashesAreNotEscaped() { $string = 'host.name=' . json_encode('a/b'); $expected = 'assign where host.name == "a/b"'; $this->assertEquals( $expected, $this->renderer($string)->renderAssign() ); } protected function renderer($string) { return AssignRenderer::forFilter(Filter::fromQueryString($string)); } } icingaweb2-module-director-1.11.8/test/php/library/Director/IcingaConfig/ExtensibleSetTest.php000066400000000000000000000100761516513262500323560ustar00rootroot00000000000000assertEquals( array(), $set->getResolvedValues() ); } public function testValuesPassedToConstructorAreAccepted() { $values = array('Val1', 'Val2', 'Val4'); $set = new ExtensibleSet($values); $this->assertEquals( $values, $set->getResolvedValues() ); } public function testConstructorAcceptsSingleValues() { $set = new ExtensibleSet('Bla'); $this->assertEquals( array('Bla'), $set->getResolvedValues() ); } public function testSingleValuesCanBeBlacklisted() { $values = array('Val1', 'Val2', 'Val4'); $set = new ExtensibleSet($values); $set->blacklist('Val2'); $this->assertEquals( array('Val1', 'Val4'), $set->getResolvedValues() ); } public function testMultipleValuesCanBeBlacklisted() { $values = array('Val1', 'Val2', 'Val4'); $set = new ExtensibleSet($values); $set->blacklist(array('Val4', 'Val1')); $this->assertEquals( array('Val2'), $set->getResolvedValues() ); } public function testSimpleInheritanceWorksFine() { $values = array('Val1', 'Val2', 'Val4'); $parent = new ExtensibleSet($values); $child = new ExtensibleSet(); $child->inheritFrom($parent); $this->assertEquals( $values, $child->getResolvedValues() ); } public function testWeCanInheritFromMultipleParents() { $p1set = array('p1a', 'p1c'); $p2set = array('p2a', 'p2d'); $parent1 = new ExtensibleSet($p1set); $parent2 = new ExtensibleSet($p2set); $child = new ExtensibleSet(); $child->inheritFrom($parent1)->inheritFrom($parent2); $this->assertEquals( $p2set, $child->getResolvedValues() ); } public function testOwnValuesOverrideParents() { $cset = array('p1a', 'p1c'); $pset = array('p2a', 'p2d'); $child = new ExtensibleSet($cset); $parent = new ExtensibleSet($pset); $child->inheritFrom($parent); $this->assertEquals( $cset, $child->getResolvedValues() ); } public function testInheritedValuesCanBeBlacklisted() { $child = new ExtensibleSet(); $child->blacklist('p2'); $pset = array('p1', 'p2', 'p3'); $parent = new ExtensibleSet($pset); $child->inheritFrom($parent); $child->blacklist(array('not', 'yet', 'p1')); $this->assertEquals( array('p3'), $child->getResolvedValues() ); $child->blacklist(array('p3')); $this->assertEquals( array(), $child->getResolvedValues() ); } public function testInheritedValuesCanBeExtended() { $pset = array('p1', 'p2', 'p3'); $child = new ExtensibleSet(); $child->extend('p5'); $parent = new ExtensibleSet($pset); $child->inheritFrom($parent); $this->assertEquals( array('p1', 'p2', 'p3', 'p5'), $child->getResolvedValues() ); } public function testCombinedDefinitionRendersCorrectly() { $set = new ExtensibleSet(array('Pre', 'Def', 'Ined')); $set->blacklist(array('And', 'Not', 'Those')); $set->extend('PlusThis'); $out = ' key_name = [ Pre, Def, Ined ]' . "\n" . ' key_name += [ PlusThis ]' . "\n" . ' key_name -= [ And, Not, Those ]' . "\n"; $this->assertEquals( $out, $set->renderAs('key_name') ); } } icingaweb2-module-director-1.11.8/test/php/library/Director/IcingaConfig/IcingaConfigHelperTest.php000066400000000000000000000126241516513262500332610ustar00rootroot00000000000000assertEquals(c::parseInterval('0'), 0); $this->assertEquals(c::parseInterval('0s'), 0); $this->assertEquals(c::parseInterval('10'), 10); $this->assertEquals(c::parseInterval('70s'), 70); $this->assertEquals(c::parseInterval('5m 10s'), 310); $this->assertEquals(c::parseInterval('5m 60s'), 360); $this->assertEquals(c::parseInterval('1h 5m 60s'), 3960); } public function testWhetherInvalidIntervalStringRaisesException() { $this->expectException(\InvalidArgumentException::class); c::parseInterval('1h 5m 60x'); } public function testWhetherAnEmptyValueGivesNull() { $this->assertNull(c::parseInterval('')); $this->assertNull(c::parseInterval(null)); } public function testWhetherIntervalStringIsCorrectlyRendered() { $this->assertEquals(c::renderInterval(10), '10s'); $this->assertEquals(c::renderInterval(60), '1m'); $this->assertEquals(c::renderInterval(121), '121s'); $this->assertEquals(c::renderInterval(3600), '1h'); $this->assertEquals(c::renderInterval(86400), '1d'); $this->assertEquals(c::renderInterval(86459), '86459s'); } public function testCorrectlyIdentifiesReservedWords() { $this->assertTrue(c::isReserved('include'), 'include is a reserved word'); $this->assertFalse(c::isReserved(0), '(int) 0 is not a reserved word'); $this->assertFalse(c::isReserved(1), '(int) 1 is not a reserved word'); $this->assertFalse(c::isReserved(true), '(boolean) true is not a reserved word'); $this->assertTrue(c::isReserved('true'), '(string) true is a reserved word'); } public function testWhetherDictionaryRendersCorrectly() { $dict = (object) [ 'key1' => 'bla', 'include' => 'reserved', 'spe cial' => 'value', '0' => 'numeric', ]; $this->assertEquals( c::renderDictionary($dict), rtrim($this->loadRendered('dict1')) ); } protected function loadRendered($name) { return file_get_contents(__DIR__ . '/rendered/' . $name . '.out'); } public function testRenderStringIsCorrectlyRendered() { $this->assertEquals(c::renderString('val1\\\val2'), '"val1\\\\\\\\val2"'); $this->assertEquals(c::renderString('"val1"'), '"\"val1\""'); $this->assertEquals(c::renderString('\$val\$'), '"\\\\$val\\\\$"'); $this->assertEquals(c::renderString('\t'), '"\\\\t"'); $this->assertEquals(c::renderString('\r'), '"\\\\r"'); $this->assertEquals(c::renderString('\n'), '"\\\\n"'); $this->assertEquals(c::renderString('\f'), '"\\\\f"'); } public function testMacrosAreDetected() { $this->assertFalse(c::stringHasMacro('$$vars$')); $this->assertFalse(c::stringHasMacro('$$')); $this->assertTrue(c::stringHasMacro('$vars$$')); $this->assertTrue(c::stringHasMacro('$multiple$$vars.nested.name$$vars$ is here')); $this->assertTrue(c::stringHasMacro('some $vars.nested.name$ is here')); $this->assertTrue(c::stringHasMacro('some $vars.nested.name$$vars.even.more$')); $this->assertTrue(c::stringHasMacro('$vars.nested.name$$a$$$$not$')); $this->assertTrue(c::stringHasMacro('MSSQL$$$config$')); $this->assertTrue(c::stringHasMacro('MSSQL$$$config$', 'config')); $this->assertTrue(c::stringHasMacro('MSSQL$$$nix$ and $config$', 'config')); $this->assertFalse(c::stringHasMacro('MSSQL$$$nix$config$ and $$', 'config')); $this->assertFalse(c::stringHasMacro('MSSQL$$$nix$ and $$config$', 'config')); $this->assertFalse(c::stringHasMacro('MSSQL$$$config$', 'conf')); } public function testRenderStringWithVariables() { $this->assertEquals('"Before " + var', c::renderStringWithVariables('Before $var$')); $this->assertEquals(c::renderStringWithVariables('$var$ After'), 'var + " After"'); $this->assertEquals(c::renderStringWithVariables('$var$'), 'var'); $this->assertEquals(c::renderStringWithVariables('$$var$$'), '"$$var$$"'); $this->assertEquals(c::renderStringWithVariables('Before $$var$$ After'), '"Before $$var$$ After"'); $this->assertEquals( '"Before " + name1 + " " + name2 + " After"', c::renderStringWithVariables('Before $name1$ $name2$ After') ); } public function testRenderStringWithVariablesX() { $this->assertEquals( '"Before " + var1 + " " + var2 + " After"', c::renderStringWithVariables('Before $var1$ $var2$ After') ); $this->assertEquals( 'host.vars.custom', c::renderStringWithVariables('$host.vars.custom$') ); $this->assertEquals('"$var\"$"', c::renderStringWithVariables('$var"$')); $this->assertEquals( '"\\\\tI am\\\\rrendering\\\\nproperly\\\\fand I " + support + " \"multiple\" " + variables + "\\\\$"', c::renderStringWithVariables('\tI am\rrendering\nproperly\fand I $support$ "multiple" $variables$\$') ); } } icingaweb2-module-director-1.11.8/test/php/library/Director/IcingaConfig/StateFilterTest.php000066400000000000000000000103041516513262500320200ustar00rootroot00000000000000assertEquals( array(), StateFilterSet::forIcingaObject( IcingaUser::create(), 'states' )->getResolvedValues() ); } public function testFailsForInvalidProperties() { $this->expectException(InvalidPropertyException::class); $set = new StateFilterSet('bla'); } public function testCannotBeStoredForAnUnstoredUser() { $this->expectException(ProgrammingError::class); StateFilterSet::forIcingaObject( $this->user1(), 'states' )->override( array('OK', 'Down') )->store(); } public function testCanBeStored() { if ($this->skipForMissingDb()) { return; } $states = $this->simpleUnstoredSetForStoredUser(); $this->assertTrue($states->store()); $states->getObject()->delete(); } public function testWillNotBeStoredTwice() { if ($this->skipForMissingDb()) { return; } $states = $this->simpleUnstoredSetForStoredUser(); $this->assertTrue($states->store()); $this->assertFalse($states->store()); $this->assertFalse($states->store()); $states->getObject()->delete(); } public function testComplexDefinitionsCanBeStored() { if ($this->skipForMissingDb()) { return; } $states = $this->complexUnstoredSetForStoredUser(); $this->assertTrue($states->store()); $states->getObject()->delete(); } public function testComplexDefinitionsCanBeLoadedAndRenderCorrectly() { if ($this->skipForMissingDb()) { return; } $states = $this->complexUnstoredSetForStoredUser(); $user = $states->getObject(); $this->assertTrue($states->store()); $states = StateFilterSet::forIcingaObject($user, 'states'); $expected = ' states = [ Down, OK, Up ]' . "\n" . ' states += [ Warning ]' . "\n" . ' states -= [ Up ]' . "\n"; $this->assertEquals( $expected, $states->renderAs('states') ); $states->getObject()->delete(); } protected function simpleUnstoredSetForStoredUser() { $user = $this->user1(); $user->store($this->getDb()); $states = StateFilterSet::forIcingaObject( $user, 'states' )->override( array('OK', 'Down') ); return $states; } protected function complexUnstoredSetForStoredUser() { $user = $this->user2(); $user->store($this->getDb()); $states = StateFilterSet::forIcingaObject( $user, 'states' )->override( array('OK', 'Down', 'Up') )->blacklist('Up')->extend('Warning'); return $states; } protected function user1() { return IcingaUser::create(array( 'object_type' => 'object', 'object_name' => $this->testUserName1 )); } protected function user2() { return IcingaUser::create(array( 'object_type' => 'object', 'object_name' => $this->testUserName2 )); } public function tearDown(): void { if ($this->hasDb()) { $users = array( $this->testUserName1, $this->testUserName2 ); $db = $this->getDb(); foreach ($users as $user) { if (IcingaUser::exists($user, $db)) { IcingaUser::load($user, $db)->delete(); } } } parent::tearDown(); } } icingaweb2-module-director-1.11.8/test/php/library/Director/IcingaConfig/rendered/000077500000000000000000000000001516513262500300135ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/IcingaConfig/rendered/dict1.out000066400000000000000000000001241516513262500315450ustar00rootroot00000000000000{ "0" = numeric @include = reserved key1 = bla "spe cial" = value } icingaweb2-module-director-1.11.8/test/php/library/Director/Import/000077500000000000000000000000001516513262500251555ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/Import/HostSyncTest.php000066400000000000000000000201041516513262500302750ustar00rootroot00000000000000runImport(array( array( 'host' => 'SYNCTEST_simple', 'address' => '127.0.0.1', 'os' => 'Linux' ) )); $this->setUpProperty(array( 'source_expression' => '${host}', 'destination_field' => 'object_name', 'priority' => 10, )); $this->setUpProperty(array( 'source_expression' => '${address}', 'destination_field' => 'address', 'priority' => 11, )); $this->setUpProperty(array( 'source_expression' => '${os}', 'destination_field' => 'vars.os', 'priority' => 12, )); $this->assertTrue($this->sync->hasModifications(), 'Should have modifications pending'); $this->assertGreaterThan(0, $this->sync->apply(), 'Should successfully apply at least 1 update'); $this->assertFalse($this->sync->hasModifications(), 'Should not have modifications pending after sync'); } public function testSyncWithoutData() { $this->runImport(array()); $this->setUpProperty(array( 'source_expression' => '${host}', 'destination_field' => 'object_name', 'priority' => 10, )); $this->assertFalse($this->sync->hasModifications(), 'Should not have modifications pending'); } public function testSyncMultipleGroups() { $this->requireGroups(['SYNCTEST_groupa', 'SYNCTEST_groupb']); $this->runImport([[ 'host' => 'SYNCTEST_groups1', 'g1' => 'SYNCTEST_groupa', 'g2' => 'SYNCTEST_groupb' ], [ 'host' => 'SYNCTEST_groups2', 'g1' => null, 'g2' => 'SYNCTEST_groupb' ]]); $this->setUpProperty(array( 'source_expression' => '${host}', 'destination_field' => 'object_name', 'priority' => 10, )); $this->setUpProperty(array( 'source_expression' => '${g1}', 'destination_field' => 'groups', 'priority' => 12, )); $this->setUpProperty(array( 'source_expression' => '${g2}', 'destination_field' => 'groups', 'priority' => 11, )); $this->assertTrue($this->sync->hasModifications(), 'Should have modifications pending'); $modifications = array(); /** @var IcingaObject $mod */ foreach ($this->sync->getExpectedModifications() as $mod) { $name = $mod->object_name; $modifications[$name] = $mod; switch ($name) { case 'SYNCTEST_groups1': $this->assertEquals([ 'SYNCTEST_groupa', 'SYNCTEST_groupb', ], $mod->get('groups')); break; case 'SYNCTEST_groups2': $this->assertEquals([ 'SYNCTEST_groupb', ], $mod->get('groups')); break; } } $this->assertGreaterThan(0, $this->sync->apply(), 'Should successfully apply at least 1 update'); $this->assertFalse($this->sync->hasModifications(), 'Should not have modifications pending after sync'); } public function testSyncFilteredData() { $this->runImport(array( array( 'host' => 'SYNCTEST_filtered_in', 'address' => '127.0.0.1', 'os' => 'Linux', 'sync' => 'yes' ), array( 'host' => 'SYNCTEST_filtered_out', 'address' => '127.0.0.1', 'os' => null, 'sync' => 'no' ), array( 'host' => 'SYNCTEST_filtered_in_unusedfield', 'address' => '127.0.0.1', 'os' => null, 'sync' => 'no', 'othersync' => '1' ), array( 'host' => 'SYNCTEST_filtered_in_unusedfield_propfilter', 'address' => '127.0.0.1', 'os' => null, 'magic' => '2', 'sync' => 'no', 'othersync' => '1' ) )); $this->rule->set('filter_expression', 'sync=yes|othersync=1'); $this->rule->store(); $this->setUpProperty(array( 'source_expression' => '${host}', 'destination_field' => 'object_name', 'priority' => 10, )); $this->setUpProperty(array( 'source_expression' => '${address}', 'destination_field' => 'address', 'priority' => 11, )); $this->setUpProperty(array( 'source_expression' => 'test', 'destination_field' => 'vars.magic', 'filter_expression' => 'magic!=', 'priority' => 12, )); $modifications = array(); /** @var IcingaObject $mod */ foreach ($this->sync->getExpectedModifications() as $mod) { $name = $mod->object_name; $modifications[$name] = $mod; $this->assertEquals( '127.0.0.1', $mod->get('address'), $name . ': address should not be synced' ); $this->assertNull($mod->get('vars.os'), $name . ': vars.os should not be synced'); if ($name === 'SYNCTEST_filtered_in_unusedfield_propfilter') { $this->assertEquals( 'test', $mod->get('vars.magic'), $name . ': vars.magic should not be synced' ); } else { $this->assertNull($mod->get('vars.magic'), $name . ': vars.magic should not be synced'); } } $this->assertArrayHasKey( 'SYNCTEST_filtered_in', $modifications, 'SYNCTEST_filtered_in should be modified' ); $this->assertArrayNotHasKey( 'SYNCTEST_filtered_out', $modifications, 'SYNCTEST_filtered_out should be synced' ); $this->assertArrayHasKey( 'SYNCTEST_filtered_in_unusedfield', $modifications, 'SYNCTEST_filtered_in_unusedfield should be modified' ); $this->assertArrayHasKey( 'SYNCTEST_filtered_in_unusedfield_propfilter', $modifications, 'SYNCTEST_filtered_in_unusedfield_propfilter should be modified' ); } /** * @param $names * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\IcingaException */ protected function requireGroups($names) { foreach ($names as $name) { if (! IcingaHostGroup::exists($name, $this->getDb())) { IcingaHostGroup::create([ 'object_name' => $name, 'object_type' => 'object', ], $this->getDb())->store(); } } } /** * @param $names * @throws \Icinga\Exception\ConfigurationError * @throws \Icinga\Exception\IcingaException * @throws \Icinga\Exception\NotFoundError */ protected function removeGroups($names) { foreach ($names as $name) { if (IcingaHostGroup::exists($name, $this->getDb())) { IcingaHostGroup::load($name, $this->getDb())->delete(); } } } public function tearDown(): void { $this->removeGroups(['SYNCTEST_groupa', 'SYNCTEST_groupb']); parent::tearDown(); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Import/ImportSourceRestApiTest.php000066400000000000000000000020031516513262500324440ustar00rootroot00000000000000 json_decode('[{"name":"blau"}]'), 'objects' => json_decode('{"objects":[{"name":"blau"}]}'), 'results.objects.all' => json_decode('{"results":{"objects":{"all":[{"name":"blau"}]}}}'), 'results\.objects.all' => json_decode('{"results.objects":{"all":[{"name":"blau"}]}}'), ]; $source = new ImportSourceRestApi(); foreach ($examples as $property => $data) { $source->setSettings(['extract_property' => $property]); $result = static::callMethod($source, 'extractProperty', [$data]); $this->assertCount(1, $result); $this->assertArrayHasKey('name', (array) $result[0]); } } } icingaweb2-module-director-1.11.8/test/php/library/Director/Import/SyncUtilsTest.php000066400000000000000000000054071516513262500304710ustar00rootroot00000000000000assertEquals( array( 'var.name', '$Special Var' ), SyncUtils::extractVariableNames('This ${var.name} is ${$Special Var} are vars') ); $this->assertEquals( array(), SyncUtils::extractVariableNames('No ${var.name vars ${$Special Var here') ); } public function testSpecificValuesCanBeRetrievedByName() { $row = (object)array( 'host' => 'localhost', 'ipaddress' => '127.0.0.1' ); $this->assertEquals( '127.0.0.1', SyncUtils::getSpecificValue($row, 'ipaddress') ); } public function testMissingPropertiesMustBeNull() { $row = (object)array( 'host' => 'localhost', 'ipaddress' => '127.0.0.1' ); $this->assertNull( SyncUtils::getSpecificValue($row, 'address') ); } public function testNestedValuesCanBeRetrievedByPath() { $row = $this->getSampleRow(); $this->assertEquals( '192.0.2.10', SyncUtils::getSpecificValue($row, 'addresses.entries.eth0:1') ); $this->assertEquals( 2, SyncUtils::getSpecificValue($row, 'addresses.count') ); } public function testRootVariablesCanBeExtracted() { $vars = array('test', 'nested.test', 'nested.dee.per'); $this->assertEquals( array( 'test' => 'test', 'nested' => 'nested' ), SyncUtils::getRootVariables($vars) ); } public function testMultipleVariablesAreBeingReplacedCorrectly() { $string = '${addresses.entries.lo} and ${addresses.entries.eth0:1} are' . ' ${This one?.$höüld be}${addressesmissing}'; $this->assertEquals( '127.0.0.1 and 192.0.2.10 are fine', SyncUtils::fillVariables( $string, $this->getSampleRow() ) ); } protected function getSampleRow() { return (object) array( 'host' => 'localhost', 'addresses' => (object) array( 'count' => 2, 'entries' => (object) array( 'lo' => '127.0.0.1', 'eth0:1' => '192.0.2.10', ) ), 'This one?' => (object) array( '$höüld be' => 'fine' ) ); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/000077500000000000000000000000001516513262500252745ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/HostApplyMatchesTest.php000066400000000000000000000052161516513262500321010ustar00rootroot00000000000000sampleHost()); $this->assertTrue( $matcher->matchesFilter( Filter::fromQueryString('host.name=%22aha%22') ) ); $this->assertFalse( $matcher->matchesFilter( Filter::fromQueryString('host.name=%22ahaa%22') ) ); } public function testWildcardMatches() { $matcher = HostApplyMatches::prepare($this->sampleHost()); $this->assertTrue( $matcher->matchesFilter( Filter::fromQueryString('host.name=%22ah*%22') ) ); $this->assertTrue( $matcher->matchesFilter( Filter::fromQueryString('host.name=%22*h*%22') ) ); $this->assertFalse( $matcher->matchesFilter( Filter::fromQueryString('host.name=%22*g*%22') ) ); } public function testStringVariableMatches() { $matcher = HostApplyMatches::prepare($this->sampleHost()); $this->assertTrue( $matcher->matchesFilter( Filter::fromQueryString('host.vars.location=%22*urem*%22') ) ); $this->assertTrue( $matcher->matchesFilter( Filter::fromQueryString('host.vars.location=%22Nuremberg%22') ) ); $this->assertFalse( $matcher->matchesFilter( Filter::fromQueryString('host.vars.location=%22Nurembergg%22') ) ); } public function testArrayVariableMatches() { $matcher = HostApplyMatches::prepare($this->sampleHost()); $this->assertTrue( $matcher->matchesFilter( Filter::fromQueryString('%22Amazing%22=host.vars.tags') ) ); $this->assertFalse( $matcher->matchesFilter( Filter::fromQueryString('%22Amazingg%22=host.vars.tags') ) ); } protected function sampleHost() { return IcingaHost::create(array( 'object_type' => 'object', 'object_name' => 'aha', 'vars' => array( 'location' => 'Nuremberg', 'tags' => array('Special', 'Amazing'), ) ), $this->getDb()); } } HostGroupMembershipResolverTest.php000066400000000000000000000233141516513262500342610ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/ObjectsgetDbAdapter(); $where = sprintf("object_name LIKE '%s%%'", self::PREFIX); $db->delete('icinga_' . self::TYPE . 'group', $where); $db->delete('icinga_' . self::TYPE, $where . " AND object_type = 'object'"); $db->delete('icinga_' . self::TYPE, $where); } public static function setUpBeforeClass(): void { static::cleanArtifacts(); } public static function tearDownAfterClass(): void { static::cleanArtifacts(); } /** * @param string $type * @param string $name * @param array $props * * @return IcingaObject * @throws DuplicateKeyException * @throws \Icinga\Exception\ConfigurationError */ protected function object($type, $name, $props = []) { $db = $this->getDb(); $fullName = self::PREFIX . $name; $object = null; try { $object = IcingaObject::loadByType($type, $fullName, $db); foreach ($props as $k => $v) { $object->set($k, $v); } $object->store(); } catch (NotFoundError $e) { $object = null; } if ($object === null) { $object = IcingaObject::createByType($type, array_merge([ 'object_name' => $fullName, 'object_type' => 'object', ], $props), $this->getDb()); $object->store(); } return $object; } protected function objects($type) { $dummy = DbObjectTypeRegistry::newObject($type); $table = $dummy->getTableName(); $query = $this->getDb()->getDbAdapter()->select() ->from($table) ->where('object_name LIKE ?', self::PREFIX . '%'); $objects = []; $l = strlen(self::PREFIX); foreach ($dummy::loadAll($this->getDb(), $query) as $object) { $key = substr($object->getObjectName(), $l); $objects[$key] = $object; } return $objects; } protected function resolved() { $db = $this->getDb()->getDbAdapter(); $select = $db->select() ->from( ['r' => 'icinga_' . self::TYPE . 'group_' . self::TYPE . '_resolved'], [] )->join( ['o' => 'icinga_' . self::TYPE], 'o.id = r.' . self::TYPE . '_id', ['object' => 'object_name'] )->join( ['g' => 'icinga_' . self::TYPE . 'group'], 'g.id = r.' . self::TYPE . 'group_id', ['groupname' => 'object_name'] ); $map = []; $l = strlen(self::PREFIX); foreach ($db->fetchAll($select) as $row) { $o = $row->object; $g = $row->groupname; if (! substr($o, 0, $l) === self::PREFIX) { continue; } $o = substr($o, $l); if (! substr($g, 0, $l) === self::PREFIX) { continue; } $g = substr($g, $l); if (! array_key_exists($o, $map)) { $map[$o] = []; } $map[$o][] = $g; } return $map; } /** * Creates: * * - 1 template * - 10 hosts importing the template with a var match_var=magic * * @throws DuplicateKeyException * @throws \Icinga\Exception\ConfigurationError */ public function testCreateHosts() { // template that sets a group later $template = $this->object('host', 'template', [ 'object_type' => 'template', ]); $this->assertTrue($template->hasBeenLoadedFromDb()); // hosts to assign groups for ($i = 1; $i <= 10; $i++) { $host = $this->object('host', $i, [ 'imports' => self::PREFIX . 'template', 'vars.match_var' => 'magic' ]); $this->assertTrue($host->hasBeenLoadedFromDb()); } } /** * Creates: * * - 10 hostgroups applying on hosts with match_var=magic * - 2 static hostgroups * * @throws DuplicateKeyException * @throws \Icinga\Exception\ConfigurationError */ public function testCreateHostgroups() { $filter = 'host.vars.match_var=%22magic%22'; for ($i = 1; $i <= 10; $i++) { $hostgroup = $this->object('hostgroup', 'apply' . $i, [ 'assign_filter' => $filter ]); $this->assertTrue($hostgroup->hasBeenLoadedFromDb()); } // static groups for ($i = 1; $i <= 2; $i++) { $hostgroup = $this->object('hostgroup', 'static' . $i); $this->assertTrue($hostgroup->hasBeenLoadedFromDb()); } } /** * Assigns static groups to: * * - the template * - the first host * * @throws DuplicateKeyException * @throws \Icinga\Exception\ConfigurationError * * @depends testCreateHosts * @depends testCreateHostgroups */ public function testAddStaticGroups() { // add group to template $template = $this->object('host', 'template'); $template->setGroups(self::PREFIX . 'static1'); $template->store(); $this->assertFalse($template->hasBeenModified()); // add group to first host $host = $this->object('host', 1); $host->setGroups(self::PREFIX . 'static2'); $host->store(); $this->assertFalse($host->hasBeenModified()); } /** * Asserts that static groups are resolved for hosts: * * - all but first should have static1 * - first should have static2 * * @depends testAddStaticGroups */ public function testStaticResolvedMappings() { $resolved = $this->resolved(); $this->assertArrayHasKey( 1, $resolved, 'Host 1 must have groups resolved' ); $this->assertContains( 'static2', $resolved[1], 'Host template must have static group 1' ); $hosts = $this->objects('host'); $this->assertNotEmpty($hosts, 'Must have hosts found in DB'); foreach ($hosts as $name => $host) { if ($host->object_type === 'template') { continue; } $this->assertArrayHasKey( $name, $resolved, 'All hosts must have groups resolved' ); if ($name === 1) { $this->assertNotContains( 'static1', $resolved[$name], 'First host must not have static group 1' ); } else { $this->assertContains( 'static1', $resolved[$name], 'All hosts but the first must have static group 1' ); } } } /** * @depends testCreateHostgroups */ public function testApplyResolvedMappings() { $resolved = $this->resolved(); $hosts = $this->objects('host'); $this->assertNotEmpty($hosts, 'Must have hosts found in DB'); foreach ($hosts as $name => $host) { if ($host->object_type === 'template') { continue; } $this->assertArrayHasKey($name, $resolved, 'Host must have groups resolved'); for ($i = 1; $i <= 10; $i++) { $this->assertContains( 'apply' . $i, $resolved[$name], 'All Host objects must have all applied groups' ); } } } /** * @throws DuplicateKeyException * @throws \Icinga\Exception\ConfigurationError * * @depends testAddStaticGroups */ public function testChangeAppliedGroupsAfterStatic() { $filter = 'host.vars.match_var=%22magic*%22'; $hostgroup = $this->object('hostgroup', 'apply1', [ 'assign_filter' => $filter ]); $this->assertTrue($hostgroup->hasBeenLoadedFromDb()); $this->assertFalse($hostgroup->hasBeenModified()); $resolved = $this->resolved(); for ($i = 1; $i <= 10; $i++) { $this->assertContains( 'apply1', $resolved[$i], 'All Host objects must have apply1 group' ); } } /** * @throws \Icinga\Exception\ConfigurationError * @throws \Zend_Db_Adapter_Exception * * @depends testStaticResolvedMappings * @depends testApplyResolvedMappings * @depends testChangeAppliedGroupsAfterStatic */ public function testFullRecheck() { $resolver = new HostGroupMembershipResolver($this->getDb()); $resolver->checkDb(); $this->assertEmpty($resolver->getNewMappings(), 'There should not be any new mappings'); $this->assertEmpty($resolver->getOutdatedMappings(), 'There should not be any outdated mappings'); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/IcingaCommandTest.php000066400000000000000000000117601516513262500313430ustar00rootroot00000000000000command(); $command->arguments = array( '-H' => '$host$' ); $this->assertEquals( '-H', $command->arguments()->get('-H')->argument_name ); $this->assertEquals( '$host$', $command->toPlainObject()->arguments['-H'] ); $command->arguments()->get('-H')->required = true; } public function testCommandsWithArgumentsCanBeModified() { $command = $this->command(); $command->arguments = array( '-H' => '$host$' ); $command->arguments = array( '-x' => (object) array( 'required' => true ) ); $this->assertEquals( null, $command->arguments()->get('-H') ); $this->assertEquals( 'y', $command->arguments()->get('-x')->get('required') ); $this->assertEquals( true, $command->toPlainObject()->arguments['-x']->required ); } public function testCanBePersistedToDb() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $command = $this->newCommandWithArguments(); $this->assertEquals( $command->store($db), true ); $command->delete(); } public function testCanBeLoadedFromDb() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $name = $this->testCommandName; $command = $this->newCommandWithArguments($db); $command->store($db); $command = IcingaCommand::load($name, $db); $this->assertEquals( $command->object_name, $name ); $command->delete(); } public function testArgumentMotificationsAreDetected() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $command = $this->newCommandWithArguments($db); $command->store($db); $command->arguments()->set('-H', 'no-host'); $this->assertTrue($command->hasBeenModified()); $this->assertTrue($command->store()); $command->delete(); } protected function newCommandWithArguments() { $command = $this->command(); $command->arguments = array( '-H' => '$host$', '-x' => (object) array( 'required' => true, 'value' => 'bal' ) ); return $command; } public function testAbsolutePathsAreDetected() { $command = $this->command(); $command->command = 'C:\\test.exe'; $this->assertEquals( $this->loadRendered('command1'), (string) $command ); $command->command = '/tmp/bla'; $this->assertEquals( $this->loadRendered('command2'), (string) $command ); $command->command = 'tmp/bla'; $this->assertEquals( $this->loadRendered('command3'), (string) $command ); $command->command = '\\\\network\\share\\bla.exe'; $this->assertEquals( $this->loadRendered('command4'), (string) $command ); $command->command = 'BlahDir + \\network\\share\\bla.exe'; $this->assertEquals( $this->loadRendered('command5'), (string) $command ); $command->command = 'network\\share\\bla.exe'; $this->assertEquals( $this->loadRendered('command6'), (string) $command ); } public function testSimpleSetIfIsRendered() { $command = $this->command(); $command->command = 'bla'; $command->arguments = array( '-a' => (object) array( 'set_if' => '$a$', ) ); $this->assertEquals( $this->loadRendered('command7'), (string) $command ); } protected function command() { return IcingaCommand::create( array( 'object_name' => $this->testCommandName, 'object_type' => 'object' ), $this->getDb() ); } protected function loadRendered($name) { return file_get_contents(__DIR__ . '/rendered/' . $name . '.out'); } public function tearDown(): void { $db = $this->getDb(); if (IcingaCommand::exists($this->testCommandName, $db)) { IcingaCommand::load($this->testCommandName, $db)->delete(); } parent::tearDown(); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/IcingaHostTest.php000066400000000000000000000525011516513262500307000ustar00rootroot00000000000000host(); $host->display_name = 'Something else'; $this->assertEquals( $host->display_name, 'Something else' ); } public function testCanBeReplaced() { $host = $this->host(); $newHost = IcingaHost::create( array('display_name' => 'Replaced display'), $this->getDb() ); $this->assertEquals( count($host->vars()), 4 ); $this->assertEquals( $host->address, '127.0.0.127' ); $host->replaceWith($newHost); $this->assertEquals( $host->display_name, 'Replaced display' ); $this->assertEquals( $host->address, null ); $this->assertEquals( count($host->vars()), 0 ); } public function testCanBeMerged() { $host = $this->host(); $newHost = IcingaHost::create( array('display_name' => 'Replaced display'), $this->getDb() ); $this->assertEquals( count($host->vars()), 4 ); $this->assertEquals( $host->address, '127.0.0.127' ); $host->merge($newHost); $this->assertEquals( $host->display_name, 'Replaced display' ); $this->assertEquals( $host->address, '127.0.0.127' ); $this->assertEquals( count($host->vars()), 4 ); } public function testPropertiesCanBePreservedWhenBeingReplaced() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $this->host()->store($db); $host = IcingaHost::load($this->testHostName, $db); $newHost = IcingaHost::create( array( 'display_name' => 'Replaced display', 'address' => '1.2.2.3', 'vars' => array( 'test1' => 'newstring', 'test2' => 18, 'initially' => 'set and then preserved', ) ), $this->getDb() ); $preserve = array('address', 'vars.test1', 'vars.initially'); $host->replaceWith($newHost, $preserve); $this->assertEquals( $host->address, '127.0.0.127' ); $this->assertEquals( $host->{'vars.test2'}, 18 ); $this->assertEquals( $host->vars()->test2->getValue(), 18 ); $this->assertEquals( $host->{'vars.initially'}, 'set and then preserved' ); $this->assertFalse( array_key_exists('address', $host->getModifiedProperties()), 'Preserved property stays unmodified' ); $newHost->set('vars.initially', 'changed later on'); $newHost->set('vars.test2', 19); $host->replaceWith($newHost, $preserve); $this->assertEquals( $host->{'vars.initially'}, 'set and then preserved' ); $this->assertEquals( $host->get('vars.test2'), 19 ); $host->delete(); } public function testDistinctCustomVarsCanBeSetWithoutSideEffects() { $host = $this->host(); $host->set('vars.test2', 18); $this->assertEquals( $host->vars()->test1->getValue(), 'string' ); $this->assertEquals( $host->vars()->test2->getValue(), 18 ); $this->assertEquals( $host->vars()->test3->getValue(), false ); } public function testVarsArePersisted() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $this->host()->store($db); $host = IcingaHost::load($this->testHostName, $db); $this->assertEquals( $host->vars()->test1->getValue(), 'string' ); $this->assertEquals( $host->vars()->test2->getValue(), 17 ); $this->assertEquals( $host->vars()->test3->getValue(), false ); $this->assertEquals( $host->vars()->test4->getValue(), (object) array( 'this' => 'is', 'a' => array( 'dict', 'ionary' ) ) ); } public function testRendersCorrectly() { $this->assertEquals( (string) $this->host(), $this->loadRendered('host1') ); } public function testGivesPlainObjectWithInvalidUnresolvedDependencies() { $props = $this->getDummyRelatedProperties(); $host = $this->host(); foreach ($props as $k => $v) { $host->$k = $v; } $plain = $host->toPlainObject(); foreach ($props as $k => $v) { $this->assertEquals($plain->$k, $v); } } public function testCorrectlyStoresLazyRelations() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $host = $this->host(); $host->zone = '___TEST___zone'; $this->assertEquals( '___TEST___zone', $host->zone ); $zone = $this->newObject('zone', '___TEST___zone'); $zone->store($db); $host->store($db); $host->delete(); $zone->delete(); } public function testFailsToStoreWithMissingLazyRelations() { if ($this->skipForMissingDb()) { return; } $this->expectException(\RuntimeException::class); $db = $this->getDb(); $host = $this->host(); $host->zone = '___TEST___zone'; $host->store($db); } public function testHandlesUnmodifiedProperties() { $this->markTestSkipped('Currently broken, needs to be fixed'); if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $host = $this->host(); $host->store($db); $parent = $this->newObject('host', '___TEST___parent'); $parent->store($db); $host->imports = '___TEST___parent'; $host->store($db); $plain = $host->getPlainUnmodifiedObject(); $this->assertEquals( 'string', $plain->vars->test1 ); $host->vars()->set('test1', 'nada'); $host->store(); $plain = $host->getPlainUnmodifiedObject(); $this->assertEquals( 'nada', $plain->vars->test1 ); $host->vars()->set('test1', 'string'); $plain = $host->getPlainUnmodifiedObject(); $this->assertEquals( 'nada', $plain->vars->test1 ); $plain = $host->getPlainUnmodifiedObject(); $test = IcingaHost::create((array) $plain); $this->assertEquals( $this->loadRendered('host3'), (string) $test ); $host->delete(); $parent->delete(); } public function testRendersWithInvalidUnresolvedDependencies() { $newHost = $this->host(); $newHost->zone = 'invalid'; $newHost->check_command = 'unknown'; $newHost->event_command = 'What event?'; $newHost->check_period = 'Not time is a good time @ nite'; $newHost->command_endpoint = 'nirvana'; $this->assertEquals( (string) $newHost, $this->loadRendered('host2') ); } public function testFailsToStoreWithInvalidUnresolvedDependencies() { if ($this->skipForMissingDb()) { return; } $this->expectException(\RuntimeException::class); $host = $this->host(); $host->zone = 'invalid'; $host->store($this->getDb()); } public function testRendersToTheCorrectZone() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $host = $this->host()->setConnection($db); $masterzone = $db->getMasterZoneName(); $config = new IcingaConfig($db); $host->renderToConfig($config); $this->assertEquals( array('zones.d/' . $masterzone . '/hosts.conf'), $config->getFileNames() ); $zone = $this->newObject('zone', '___TEST___zone'); $zone->store($db); $config = new IcingaConfig($db); $host->zone = '___TEST___zone'; $host->renderToConfig($config); $this->assertEquals( array('zones.d/___TEST___zone/hosts.conf'), $config->getFileNames() ); $host->has_agent = true; $host->master_should_connect = true; $host->accept_config = true; $config = new IcingaConfig($db); $host->renderToConfig($config); $this->assertEquals( array( 'zones.d/___TEST___zone/hosts.conf', 'zones.d/___TEST___zone/agent_endpoints.conf', 'zones.d/___TEST___zone/agent_zones.conf' ), $config->getFileNames() ); $host->object_type = 'template'; $host->zone_id = null; $zone = $this->newObject('zone', '___TEST___zone2'); $zone->store($db); $config = new IcingaConfig($db); $host->renderToConfig($config); $this->assertEquals( [ 'zones.d/___TEST___zone/host_templates.conf', 'zones.d/___TEST___zone2/host_templates.conf', ], $config->getFileNames() ); } public function testWhetherTwoHostsCannotBeStoredWithTheSameApiKey() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $a = IcingaHost::create(array( 'object_name' => '___TEST___a', 'object_type' => 'object', 'api_key' => 'a' ), $db); $b = IcingaHost::create(array( 'object_name' => '___TEST___b', 'object_type' => 'object', 'api_key' => 'a' ), $db); $a->store(); try { $b->store(); } catch (\RuntimeException $e) { $msg = $e->getMessage(); $matchMysql = strpos( $msg, "Duplicate entry 'a' for key 'api_key'" ) !== false; $matchPostgres = strpos( $msg, 'Unique violation' ) !== false; $this->assertTrue( $matchMysql || $matchPostgres, 'Exception message does not tell about unique constraint violation' ); $a->delete(); } } public function testWhetherHostCanBeLoadedWithValidApiKey() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $a = IcingaHost::create(array( 'object_name' => '___TEST___a', 'object_type' => 'object', 'api_key' => 'a1a1a1' ), $db); $b = IcingaHost::create(array( 'object_name' => '___TEST___b', 'object_type' => 'object', 'api_key' => 'b1b1b1' ), $db); $a->store(); $b->store(); $this->assertEquals( IcingaHost::loadWithApiKey('b1b1b1', $db)->object_name, '___TEST___b' ); $a->delete(); $b->delete(); } public function testWhetherInvalidApiKeyThrows404() { if ($this->skipForMissingDb()) { return; } $this->expectException(NotFoundError::class); $db = $this->getDb(); IcingaHost::loadWithApiKey('No___such___key', $db); } public function testEnumProperties() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $properties = IcingaHost::enumProperties($db); $this->assertEquals( array( 'Host properties' => $this->getDefaultHostProperties() ), $properties ); } public function testEnumPropertiesWithCustomVars() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $host = $this->host(); $host->store($db); $properties = IcingaHost::enumProperties($db); $this->assertEquals( array( 'Host properties' => $this->getDefaultHostProperties(), 'Custom variables' => array( 'vars.test1' => 'test1', 'vars.test2' => 'test2', 'vars.test3' => 'test3', 'vars.test4' => 'test4' ) ), $properties ); } public function testEnumPropertiesWithPrefix() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $host = $this->host(); $host->store($db); $properties = IcingaHost::enumProperties($db, 'host.'); $this->assertEquals( array( 'Host properties' => $this->getDefaultHostProperties('host.'), 'Custom variables' => array( 'host.vars.test1' => 'test1', 'host.vars.test2' => 'test2', 'host.vars.test3' => 'test3', 'host.vars.test4' => 'test4' ) ), $properties ); } public function testEnumPropertiesWithFilter() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); DirectorDatafield::create(array( 'varname' => $this->testDatafieldName, 'caption' => 'Blah', 'description' => '', 'datatype' => 'Icinga\Module\Director\DataType\DataTypeArray', 'format' => 'json' ))->store($db); $host = $this->host(); $host->{'vars.test5'} = array('a', '1'); $host->store($db); $properties = IcingaHost::enumProperties($db, '', new CustomVariablesFilter()); $this->assertEquals( array( 'Custom variables' => array( 'vars.test1' => 'test1', 'vars.test2' => 'test2', 'vars.test3' => 'test3', 'vars.test4' => 'test4', 'vars.test5' => 'test5 (Blah)' ) ), $properties ); } public function testEnumPropertiesWithArrayFilter() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); DirectorDatafield::create(array( 'varname' => $this->testDatafieldName, 'caption' => 'Blah', 'description' => '', 'datatype' => 'Icinga\Module\Director\DataType\DataTypeArray', 'format' => 'json' ))->store($db); $host = $this->host(); $host->{'vars.test5'} = array('a', '1'); $host->store($db); $properties = IcingaHost::enumProperties($db, '', new ArrayCustomVariablesFilter()); $this->assertEquals( array( 'Custom variables' => array( 'vars.test5' => 'test5 (Blah)' ) ), $properties ); } public function testMergingObjectKeepsGroupsIfNotGiven() { $one = IcingaHostGroup::create([ 'object_name' => 'one', 'object_type' => 'object', ]); $two = IcingaHostGroup::create([ 'object_name' => 'two', 'object_type' => 'object', ]); $a = IcingaHost::create([ 'object_name' => 'one', 'object_type' => 'object', 'imports' => [], 'address' => '127.0.0.2', 'groups' => [$one, $two] ]); $b = IcingaHost::create([ 'object_name' => 'one', 'object_type' => 'object', 'imports' => [], 'address' => '127.0.0.42', ]); $a->merge($b); $this->assertEquals( '127.0.0.42', $a->get('address') ); $this->assertEquals( ['one', 'two'], $a->getGroups() ); } protected function getDummyRelatedProperties() { return array( 'zone' => 'invalid', 'check_command' => 'unknown', 'event_command' => 'What event?', 'check_period' => 'Not time is a good time @ nite', 'command_endpoint' => 'nirvana', ); } protected function host() { return IcingaHost::create(array( 'object_name' => $this->testHostName, 'object_type' => 'object', 'address' => '127.0.0.127', 'display_name' => 'Whatever', 'vars' => array( 'test1' => 'string', 'test2' => 17, 'test3' => false, 'test4' => (object) array( 'this' => 'is', 'a' => array( 'dict', 'ionary' ) ) ) ), $this->getDb()); } protected function getDefaultHostProperties($prefix = '') { return array( "{$prefix}name" => "name", "{$prefix}action_url" => "action_url", "{$prefix}address" => "address", "{$prefix}address6" => "address6", "{$prefix}api_key" => "api_key", "{$prefix}check_command" => "check_command", "{$prefix}check_interval" => "check_interval", "{$prefix}check_period" => "check_period", "{$prefix}check_timeout" => "check_timeout", "{$prefix}command_endpoint" => "command_endpoint", "{$prefix}display_name" => "display_name", "{$prefix}enable_active_checks" => "enable_active_checks", "{$prefix}enable_event_handler" => "enable_event_handler", "{$prefix}enable_flapping" => "enable_flapping", "{$prefix}enable_notifications" => "enable_notifications", "{$prefix}enable_passive_checks" => "enable_passive_checks", "{$prefix}enable_perfdata" => "enable_perfdata", "{$prefix}event_command" => "event_command", "{$prefix}flapping_threshold_high" => "flapping_threshold_high", "{$prefix}flapping_threshold_low" => "flapping_threshold_low", "{$prefix}icon_image" => "icon_image", "{$prefix}icon_image_alt" => "icon_image_alt", "{$prefix}max_check_attempts" => "max_check_attempts", "{$prefix}notes" => "notes", "{$prefix}notes_url" => "notes_url", "{$prefix}retry_interval" => "retry_interval", "{$prefix}volatile" => "volatile", "{$prefix}zone" => "zone", "{$prefix}groups" => "Groups", "{$prefix}templates" => "templates" ); } protected function loadRendered($name) { return file_get_contents(__DIR__ . '/rendered/' . $name . '.out'); } public function tearDown(): void { if ($this->hasDb()) { $db = $this->getDb(); $kill = array($this->testHostName, '___TEST___parent', '___TEST___a', '___TEST___b'); foreach ($kill as $name) { if (IcingaHost::exists($name, $db)) { IcingaHost::load($name, $db)->delete(); } } $kill = ['___TEST___zone', '___TEST___zone2']; foreach ($kill as $name) { if (IcingaZone::exists($name, $db)) { IcingaZone::load($name, $db)->delete(); } } $this->deleteDatafields(); } parent::tearDown(); } protected function deleteDatafields() { $db = $this->getDb(); $dbAdapter = $db->getDbAdapter(); $kill = array($this->testDatafieldName); foreach ($kill as $name) { $query = $dbAdapter->select() ->from('director_datafield') ->where('varname = ?', $name); foreach (DirectorDatafield::loadAll($db, $query, 'id') as $datafield) { $datafield->delete(); } } } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/IcingaNotificationTest.php000066400000000000000000000151011516513262500324040ustar00rootroot00000000000000notification(); $n->notification_interval = '10m'; $this->assertEquals( $n->notification_interval, 600 ); } public function testCanBeStoredAndDeletedWithRelatedUserPassedAsString() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $user = $this->user1(); $user->store($db); $n = $this->notification(); $n->users = $user->object_name; $this->assertTrue($n->store($db)); $this->assertTrue($n->delete()); $user->delete(); } public function testCanBeStoredAndDeletedWithMultipleRelatedUsers() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $user1 = $this->user1(); $user1->store($db); $user2 = $this->user2(); $user2->store($db); $n = $this->notification(); $n->users = array($user1->object_name, $user2->object_name); $this->assertTrue($n->store($db)); $this->assertTrue($n->delete()); $user1->delete(); $user2->delete(); } public function testGivesPlainObjectWithRelatedUsers() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $user1 = $this->user1(); $user1->store($db); $user2 = $this->user2(); $user2->store($db); $n = $this->notification(); $n->users = array($user1->object_name, $user2->object_name); $n->store($db); $this->assertEquals( (object) array( 'object_name' => $this->testNotificationName, 'object_type' => 'object', 'users' => array( $user1->object_name, $user2->object_name ) ), $n->toPlainObject(false, true) ); $n = IcingaNotification::load($n->object_name, $db); $this->assertEquals( (object) array( 'object_name' => $this->testNotificationName, 'object_type' => 'object', 'users' => array( $user1->object_name, $user2->object_name ) ), $n->toPlainObject(false, true) ); $this->assertEquals( array(), $n->toPlainObject()->user_groups ); $n->delete(); $user1->delete(); $user2->delete(); } public function testHandlesChangesForStoredRelations() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $user1 = $this->user1(); $user1->store($db); $user2 = $this->user2(); $user2->store($db); $n = $this->notification(); $n->users = array($user1->object_name, $user2->object_name); $n->store($db); $n = IcingaNotification::load($n->object_name, $db); $this->assertFalse($n->hasBeenModified()); $n->users = array($user2->object_name); $this->assertTrue($n->hasBeenModified()); $n->store(); $n = IcingaNotification::load($n->object_name, $db); $this->assertEquals( array($user2->object_name), $n->users ); $n->users = array(); $n->store(); $n = IcingaNotification::load($n->object_name, $db); $this->assertEquals( array(), $n->users ); // Should be fixed with lazy loading: // $n->users = array($user1->object_name, $user2->object_name); // $this->assertFalse($n->hasBeenModified()); $n->delete(); $user1->delete(); $user2->delete(); } public function testRendersConfigurationWithRelatedUsers() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $user1 = $this->user1(); $user1->store($db); $user2 = $this->user2(); $user2->store($db); $n = $this->notification(); $n->users = array($user1->object_name, $user2->object_name); $this->assertEquals( $this->loadRendered('notification1'), (string) $n ); } public function testLazyUsersCanBeSet() { $this->markTestSkipped('Setting lazy properties not yet completed'); $n = $this->notification(); $n->users = 'bla'; } protected function user1() { return IcingaUser::create(array( 'object_name' => $this->testUserName1, 'object_type' => 'object', 'email' => 'nowhere@example.com', ), $this->getDb()); } protected function user2() { return IcingaUser::create(array( 'object_name' => $this->testUserName2, 'object_type' => 'object', 'email' => 'nowhere.else@example.com', ), $this->getDb()); } protected function notification() { return IcingaNotification::create(array( 'object_name' => $this->testNotificationName, 'object_type' => 'object', ), $this->getDb()); } protected function loadRendered($name) { return file_get_contents(__DIR__ . '/rendered/' . $name . '.out'); } public function tearDown(): void { if ($this->hasDb()) { $db = $this->getDb(); $kill = array($this->testNotificationName); foreach ($kill as $name) { if (IcingaNotification::exists($name, $db)) { IcingaNotification::load($name, $db)->delete(); } } $kill = array($this->testUserName1, $this->testUserName2); foreach ($kill as $name) { if (IcingaUser::exists($name, $db)) { IcingaUser::load($name, $db)->delete(); } } } parent::tearDown(); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/IcingaServiceSetTest.php000066400000000000000000000131041516513262500320330ustar00rootroot00000000000000assertNull($this->subject, 'subject must have been taken down before!'); if ($this->hasDb()) { $this->subject = IcingaServiceSet::create(array( 'object_name' => $this->testObjectName, 'object_type' => 'template', )); $this->subject->store($this->getDb()); } } public function testUpdatingSet() { $set = IcingaServiceSet::load($this->testObjectName, $this->getDb()); $this->assertTrue($set->hasBeenLoadedFromDb()); $set->set('description', 'This is a set created by Phpunit!'); $this->assertTrue($set->hasBeenModified()); $set->store(); $set->set('assign_filter', 'host.name=foobar'); $this->assertTrue($set->hasBeenModified()); $set->store(); $this->assertFalse($set->hasBeenModified()); } public function testAddingSetToHost() { $host = $this->createObject('for_set', 'icinga_host', array( 'object_type' => 'object', 'address' => '1.2.3.4', )); $set = IcingaServiceSet::create(array( 'object_name' => $this->testObjectName, 'object_type' => 'object', ), $this->getDb()); // TODO: fails if db not set here... $set->setImports($this->testObjectName); $this->assertTrue($set->hasBeenModified()); $this->assertEquals(array($this->testObjectName), $set->getImports()); $set->set('host', $host->getObjectName()); $set->store(); $this->prepareObjectTearDown($set); $this->assertFalse($set->hasBeenModified()); } public function testDeletingHostWithSet() { $this->createObject('for_set', 'icinga_host', array( 'object_type' => 'object', 'address' => '1.2.3.4', ), false)->store(); $host = $this->loadObject('for_set', 'icinga_host'); $host->delete(); $this->checkForDanglingHostSets(); } public function testAddingServicesToSet() { $set = IcingaServiceSet::load($this->testObjectName, $this->getDb()); // TODO: setting service_set by name should work too... $serviceA = $this->createObject('serviceA', 'icinga_service', array( 'object_type' => 'apply', 'service_set_id' => $set->getAutoincId(), )); $nameA = $serviceA->getObjectName(); $serviceB = $this->createObject('serviceB', 'icinga_service', array( 'object_type' => 'apply', 'service_set_id' => $set->getAutoincId(), )); $nameB = $serviceB->getObjectName(); $services = $set->getServiceObjects(); $this->assertCount(2, $services); $this->assertArrayHasKey($nameA, $services); $this->assertArrayHasKey($nameB, $services); $this->assertEquals($serviceA->getAutoincId(), $services[$nameA]->getAutoincId()); $this->assertEquals($serviceB->getAutoincId(), $services[$nameB]->getAutoincId()); // TODO: deleting set should delete services $this->checkForDanglingServices(); } public function testCreatingSetWithoutType() { $this->expectException(\RuntimeException::class); $set = IcingaServiceSet::create(array( 'object_name' => '___TEST__set_BAD', )); $set->store($this->getDb()); } public function testCreatingServiceSetWithoutHost() { $this->expectException(\InvalidArgumentException::class); $set = IcingaServiceSet::create(array( 'object_name' => '___TEST__set_BAD2', 'object_type' => 'object', )); $set->store($this->getDb()); } public function testDeletingSet() { $set = IcingaServiceSet::load($this->testObjectName, $this->getDb()); $set->delete(); $this->assertFalse(IcingaServiceSet::exists($this->testObjectName, $this->getDb())); $this->subject = null; } public function checkForDanglingServices() { $db = $this->getDb()->getDbAdapter(); $query = $db->select() ->from(array('s' => 'icinga_service'), array('id')) ->joinLeft( array('ss' => 'icinga_service_set'), 'ss.id = s.service_set_id', array() ) ->where('s.service_set_id IS NOT NULL') ->where('ss.id IS NULL'); $ids = $db->fetchCol($query); $this->assertEmpty($ids, sprintf('Found dangling service_set services in database: %s', join(', ', $ids))); } public function checkForDanglingHostSets() { $db = $this->getDb()->getDbAdapter(); $query = $db->select() ->from(array('ss' => 'icinga_service_set'), array('id')) ->joinLeft( array('h' => 'icinga_host'), 'h.id = ss.host_id', array() ) ->where('ss.host_id IS NOT NULL') ->where('h.id IS NULL'); $ids = $db->fetchCol($query); $this->assertEmpty( $ids, sprintf( 'Found dangling service_set\'s for a host, without the host in database: %s', join(', ', $ids) ) ); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/IcingaServiceTest.php000066400000000000000000000200451516513262500313610ustar00rootroot00000000000000service(); $service->display_name = 'Something else'; $service->host = 'not yet'; $this->assertEquals( 'not yet', $service->host ); } public function testFailsToStoreWithMissingLazyRelations() { if ($this->skipForMissingDb()) { return; } $this->expectException(\RuntimeException::class); $db = $this->getDb(); $service = $this->service(); $service->display_name = 'Something else'; $service->host = 'not yet'; $service->store($db); $service->delete(); } public function testAcceptsAssignRules() { $this->expectNotToPerformAssertions(); $service = $this->service(); $service->object_type = 'apply'; $service->assign_filter = 'host.address="127.*"'; } public function testRefusesAssignRulesWhenNotBeingAnApply() { $this->expectException(\LogicException::class); $service = $this->service(); $service->assign_filter = 'host.address=127.*'; } public function testAcceptsAndRendersFlatAssignRules() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $service = $this->service(); // Service apply rule rendering requires access to settings: $service->setConnection($db); $service->object_type = 'apply'; $service->assign_filter = 'host.address="127.*"|host.vars.env="test"'; $this->assertEquals( $this->loadRendered('service1'), (string) $service ); $this->assertEquals( 'host.address="127.*"|host.vars.env="test"', $service->assign_filter ); } public function testAcceptsAndRendersStructuredAssignRules() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $service = $this->service(); // Service apply rule rendering requires access to settings: $service->setConnection($db); $service->object_type = 'apply'; $service->assign_filter = 'host.address="127.*"|host.vars.env="test"'; $this->assertEquals( $this->loadRendered('service1'), (string) $service ); $this->assertEquals( 'host.address="127.*"|host.vars.env="test"', $service->assign_filter = 'host.address="127.*"|host.vars.env="test"' ); } public function testPersistsAssignRules() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $service = $this->service(); $service->object_type = 'apply'; $service->assign_filter = 'host.address="127.*"|host.vars.env="test"'; $service->store($db); $service = IcingaService::loadWithAutoIncId($service->id, $db); $this->assertEquals( $this->loadRendered('service1'), (string) $service ); $this->assertEquals( 'host.address="127.*"|host.vars.env="test"', $service->assign_filter ); $service->delete(); } public function testRendersToTheCorrectZone() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $service = $this->service()->setConnection($db); $config = new IcingaConfig($db); $service->renderToConfig($config); $masterzone = $db->getMasterZoneName(); $this->assertEquals( array('zones.d/' . $masterzone . '/services.conf'), $config->getFileNames() ); } public function testVariablesInPropertiesAndCustomVariables() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $service = $this->service('___TEST___service_$not_replaced$'); $service->setConnection($db); $service->object_type = 'apply'; $service->display_name = 'Service: $host.vars.replaced$'; $service->assign_filter = 'host.address="127.*"'; $service->{'vars.custom_var'} = '$host.vars.replaced$'; $this->assertEquals( $this->loadRendered('service3'), (string) $service ); } public function testVariablesAreNotReplacedForNonApplyObjects() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $host = $this->host(); $host->store($db); $service = $this->service('___TEST___service_$not_replaced$'); $service->object_type = 'object'; $service->host_id = $host->get('id'); $service->display_name = 'Service: $host.vars.not_replaced$'; $service->{'vars.custom_var'} = '$host.vars.not_replaced$'; $service->store($db); $service = IcingaService::loadWithAutoIncId($service->id, $db); $this->assertEquals( $this->loadRendered('service4'), (string) $service ); } public function testApplyForRendersInVariousModes() { if ($this->skipForMissingDb()) { return; } $db = $this->getDb(); $service = $this->service()->setConnection($db); $service->object_type = 'apply'; $service->apply_for = 'host.vars.test1'; $service->assign_filter = 'host.vars.env="test"'; $this->assertEquals( $this->loadRendered('service5'), (string) $service ); $service->object_name = '___TEST$config$___service $host.var.bla$'; $this->assertEquals( $this->loadRendered('service6'), (string) $service ); $service->object_name = ''; $this->assertEquals( $this->loadRendered('service7'), (string) $service ); } protected function host() { return IcingaHost::create(array( 'object_name' => $this->testHostName, 'object_type' => 'object', 'address' => '127.0.0.1', )); } protected function service($objectName = null) { if ($objectName === null) { $objectName = $this->testServiceName; } $this->createdServices[] = $objectName; return IcingaService::create(array( 'object_name' => $objectName, 'object_type' => 'object', 'display_name' => 'Whatever service', 'vars' => array( 'test1' => 'string', 'test2' => 17, 'test3' => false, 'test4' => (object) array( 'this' => 'is', 'a' => array( 'dict', 'ionary' ) ) ) )); } protected function loadRendered($name) { return file_get_contents(__DIR__ . '/rendered/' . $name . '.out'); } public function tearDown(): void { if ($this->hasDb()) { $db = $this->getDb(); $kill = array($this->testHostName); foreach ($kill as $name) { if (IcingaHost::exists($name, $db)) { IcingaHost::load($name, $db)->delete(); } } $kill = $this->createdServices; foreach ($kill as $name) { if (IcingaService::exists(array($name), $db)) { IcingaService::load($name, $db)->delete(); } } } parent::tearDown(); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/IcingaTemplateResolverTest.php000066400000000000000000000074451516513262500332670ustar00rootroot00000000000000assertEquals( array( $this->prefixed('t6'), $this->prefixed('t5'), $this->prefixed('t2') ), $this->getHost('t1')->templateResolver()->listParentNames() ); } public function testFullInhertancePathIdsAreCorrect() { $this->assertEquals( $this->getIds(array('t5', 't6', 't5', 't5', 't4', 't3', 't5', 't6', 't2', 't1')), $this->getHost('t1')->templateResolver()->listFullInheritancePathIds() ); } public function testInhertancePathIdsAreCorrect() { $this->assertEquals( $this->getIds(array('t4', 't3', 't5', 't6', 't2', 't1')), $this->getHost('t1')->templateResolver()->listInheritancePathIds() ); } protected function getHost($name) { $hosts = $this->getScenario(); return $hosts[$name]; } protected function getId($name) { $hosts = $this->getScenario(); return $hosts[$name]->id; } protected function getIds($names) { $ids = array(); foreach ($names as $name) { $ids[] = $this->getId($name); } return $ids; } protected function prefixed($name) { return $this->prefix . $name; } /** * @return IcingaHost[] */ protected function getScenario() { if ($this->scenario === null) { $this->scenario = $this->createScenario(); } return $this->scenario; } /** * @return IcingaHost[] */ protected function createScenario() { // Defionition imports (object -> imported) // t1 -> t6, t5, t2 // t6 -> t5 // t3 -> t4 // t2 -> t3, t6 // t4 -> t5 // 5, 6, 5, 5, 4, 3, 5, 6, 2, 1 $t1 = $this->create('t1'); $t4 = $this->create('t4'); $t3 = $this->create('t3'); $t2 = $this->create('t2'); $t5 = $this->create('t5'); $t6 = $this->create('t6'); // TODO: Must work without this: $t1->templateResolver()->clearCache(); $t1->set('imports', array($t6, $t5, $t2)); $t6->set('imports', array($t5)); $t3->set('imports', array($t4)); $t2->set('imports', array($t3, $t6)); $t4->set('imports', array($t5)); $t5->store(); $t4->store(); $t3->store(); $t6->store(); $t2->store(); $t1->store(); // TODO: Must work without this: $t1->templateResolver()->clearCache(); return array( 't1' => $t1, 't2' => $t2, 't3' => $t3, 't4' => $t4, 't5' => $t5, 't6' => $t6, ); } /** * @param $name * @return IcingaHost */ protected function create($name) { $host = IcingaHost::create( array( 'object_name' => $this->prefixed($name), 'object_type' => 'template' ) ); $host->store($this->getDb()); return $host; } public function tearDown(): void { $db = $this->getDb(); $kill = array('t1', 't2', 't6', 't3', 't4', 't5'); foreach ($kill as $short) { $name = $this->prefixed($short); if (IcingaHost::exists($name, $db)) { IcingaHost::load($name, $db)->delete(); } } parent::tearDown(); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/IcingaTimePeriodTest.php000066400000000000000000000127101516513262500320220ustar00rootroot00000000000000skipForMissingDb()) { return; } $period = $this->createTestPeriod(); $newRanges = array( 'monday' => '00:00-24:00', 'tuesday' => '18:00-24:00', 'wednesday' => '00:00-24:00', ); $period->ranges = $newRanges; $this->assertEquals( '18:00-24:00', $period->toPlainObject()->ranges->tuesday ); $period->store(); $period = $this->loadTestPeriod(); $this->assertEquals( '18:00-24:00', $period->ranges()->get('tuesday')->range_value ); $this->assertEquals( '00:00-24:00', $period->toPlainObject()->ranges->wednesday ); $period->ranges()->setRange('wednesday', '09:00-17:00'); $this->assertEquals( '09:00-17:00', $period->toPlainObject()->ranges->wednesday ); $this->assertEquals( '00:00-24:00', $period->getPlainUnmodifiedObject()->ranges->wednesday ); } protected function createTestPeriod($suffix = '', $testRanges = []) { $db = $this->getDb(); $name = $this->testPeriodName . $suffix; $this->createdNames[] = $name; $object = IcingaTimePeriod::create( array( 'object_name' => $name, 'object_type' => 'object' ), $db ); $object->store(); $ranges = $object->ranges(); if (empty($testRanges)) { $testRanges = array( 'monday' => '00:00-24:00', 'tuesday' => '00:00-24:00', 'wednesday' => '00:00-24:00', ); } $ranges->set($testRanges); $object->store(); return $object; } public function testIsActiveWorksForWeekdayRanges() { $period = $this->createTestPeriod(); $newRanges = array( 'monday' => '00:00-24:00', 'tuesday' => '18:00-24:00', 'wednesday' => '00:00-24:00', ); $period->ranges = $newRanges; // Tuesday: $this->assertFalse($period->isActive(strtotime('2016-05-17 10:00:00'))); // Wednesday: $this->assertTrue($period->isActive(strtotime('2016-05-18 10:00:00'))); // Thursday: $this->assertFalse($period->isActive(strtotime('2016-05-19 10:00:00'))); } public function testPeriodWithIncludes() { $period = $this->createTestPeriod(); $include = $this->createTestPeriod('include', ['thursday' => '00:00-24:00']); $period->set('includes', $include->object_name); $period->store(); // Wednesday: $this->assertTrue($period->isActive(strtotime('2016-05-18 10:00:00'))); // Thursday: $this->assertTrue($period->isActive(strtotime('2016-05-19 10:00:00'))); } public function testPeriodWithExcludes() { $period = $this->createTestPeriod(); $exclude = $this->createTestPeriod('exclude', ['wednesday' => '00:00-24:00']); $period->set('excludes', $exclude->object_name); $period->store(); // Wednesday: $this->assertFalse($period->isActive(strtotime('2016-05-18 10:00:00'))); // Thursday: $this->assertFalse($period->isActive(strtotime('2016-05-19 10:00:00'))); } public function testPeriodPreferingIncludes() { $period = $this->createTestPeriod(); $include = $this->createTestPeriod('include', ['thursday' => '00:00-24:00']); $exclude = $this->createTestPeriod('exclude', ['thursday' => '00:00-24:00']); $period->set('includes', $include->object_name); $period->set('excludes', $exclude->object_name); $period->store(); // Wednesday: $this->assertTrue($period->isActive(strtotime('2016-05-18 10:00:00'))); // Thursday: $this->assertTrue($period->isActive(strtotime('2016-05-19 10:00:00'))); } public function testPeriodPreferingExcludes() { $period = $this->createTestPeriod(); $include = $this->createTestPeriod('include', ['thursday' => '00:00-24:00']); $exclude = $this->createTestPeriod('exclude', ['thursday' => '00:00-24:00']); $period->set('prefer_includes', false); $period->set('includes', $include->object_name); $period->set('excludes', $exclude->object_name); $period->store(); // Wednesday: $this->assertTrue($period->isActive(strtotime('2016-05-18 10:00:00'))); // Thursday: $this->assertFalse($period->isActive(strtotime('2016-05-19 10:00:00'))); } protected function loadTestPeriod($suffix = '') { return IcingaTimePeriod::load($this->testPeriodName . $suffix, $this->getDb()); } public function tearDown(): void { $db = $this->getDb(); foreach ($this->createdNames as $name) { if (IcingaTimePeriod::exists($name, $db)) { IcingaTimePeriod::load($name, $db)->delete(); } } parent::tearDown(); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/000077500000000000000000000000001516513262500270645ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/command1.out000066400000000000000000000001161516513262500313120ustar00rootroot00000000000000object CheckCommand "___TEST___command" { command = [ "C:\\test.exe" ] } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/command2.out000066400000000000000000000001121516513262500313070ustar00rootroot00000000000000object CheckCommand "___TEST___command" { command = [ "/tmp/bla" ] } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/command3.out000066400000000000000000000001261516513262500313150ustar00rootroot00000000000000object CheckCommand "___TEST___command" { command = [ PluginDir + "/tmp/bla" ] } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/command4.out000066400000000000000000000001351516513262500313160ustar00rootroot00000000000000object CheckCommand "___TEST___command" { command = [ "\\\\network\\share\\bla.exe" ] } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/command5.out000066400000000000000000000001451516513262500313200ustar00rootroot00000000000000object CheckCommand "___TEST___command" { command = [ BlahDir + "\\network\\share\\bla.exe" ] } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/command6.out000066400000000000000000000001461516513262500313220ustar00rootroot00000000000000object CheckCommand "___TEST___command" { command = [ PluginDir + "/network\\share\\bla.exe" ] } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/command7.out000066400000000000000000000002411516513262500313170ustar00rootroot00000000000000object CheckCommand "___TEST___command" { command = [ PluginDir + "/bla" ] arguments += { "-a" = { set_if = "$a$" } } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/host1.out000066400000000000000000000003601516513262500306520ustar00rootroot00000000000000object Host "___TEST___host" { display_name = "Whatever" address = "127.0.0.127" vars.test1 = "string" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/host2.out000066400000000000000000000006321516513262500306550ustar00rootroot00000000000000object Host "___TEST___host" { display_name = "Whatever" address = "127.0.0.127" check_command = "unknown" check_period = "Not time is a good time @ nite" event_command = "What event?" zone = "invalid" command_endpoint = "nirvana" vars.test1 = "string" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/host3.out000066400000000000000000000004151516513262500306550ustar00rootroot00000000000000object Host "___TEST___host" { import "___TEST___parent" display_name = "Whatever" address = "127.0.0.127" vars.test1 = "nada" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/notification1.out000066400000000000000000000001471516513262500323660ustar00rootroot00000000000000object Notification "___TEST___notification" { users = [ "___TEST___user1", "___TEST___user2" ] } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/service1.out000066400000000000000000000005171516513262500313410ustar00rootroot00000000000000apply Service "___TEST___service" { display_name = "Whatever service" assign where match("127.*", host.address) || host.vars.env == "test" vars.test1 = "string" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } import DirectorOverrideTemplate } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/service2.out000066400000000000000000000005371516513262500313440ustar00rootroot00000000000000apply Service "___TEST___service" { display_name = "Whatever service" vars.test1 = "string" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } assign where match("128.*", host.address) ignore where host.name == "localhost" import DirectorOverrideTemplate } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/service3.out000066400000000000000000000005761516513262500313500ustar00rootroot00000000000000apply Service "___TEST___service_$not_replaced$" { display_name = "Service: " + host.vars.replaced assign where match("127.*", host.address) vars.custom_var = "$host.vars.replaced$" vars.test1 = "string" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } import DirectorOverrideTemplate } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/service4.out000066400000000000000000000005241516513262500313420ustar00rootroot00000000000000object Service "___TEST___service_$not_replaced$" { host_name = "___TEST___host" display_name = "Service: $host.vars.not_replaced$" vars.custom_var = "$host.vars.not_replaced$" vars.test1 = "string" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/service5.out000066400000000000000000000005171516513262500313450ustar00rootroot00000000000000apply Service "___TEST___service" for (config in host.vars.test1) { display_name = "Whatever service" assign where host.vars.env == "test" vars.test1 = "string" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } import DirectorOverrideTemplate } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/service6.out000066400000000000000000000005701516513262500313450ustar00rootroot00000000000000apply Service for (config in host.vars.test1) { name = "___TEST" + config + "___service " + host.var.bla display_name = "Whatever service" assign where host.vars.env == "test" vars.test1 = "string" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } import DirectorOverrideTemplate } icingaweb2-module-director-1.11.8/test/php/library/Director/Objects/rendered/service7.out000066400000000000000000000004731516513262500313500ustar00rootroot00000000000000apply Service for (config in host.vars.test1) { display_name = "Whatever service" assign where host.vars.env == "test" vars.test1 = "string" vars.test2 = 17 vars.test3 = false vars.test4 = { a = [ "dict", "ionary" ] @this = "is" } import DirectorOverrideTemplate } icingaweb2-module-director-1.11.8/test/php/library/Director/PropertyModifier/000077500000000000000000000000001516513262500272065ustar00rootroot00000000000000PropertyModifierArrayElementByPositionTest.php000066400000000000000000000073741516513262500403470ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/PropertyModifierassertEquals( 'one', $this->buildModifier('first')->transform(['one', 'two', 'three']) ); } public function testGivesFirstElementOfObject() { $this->assertEquals( 'one', $this->buildModifier('first')->transform((object) ['one', 'two', 'three']) ); } public function testGettingFirstFailsForEmptyArray() { $this->expectException(\InvalidArgumentException::class); $this->buildModifier('first')->transform([]); } public function testGettingFirstGivesNullForEmptyArray() { $this->assertNull($this->buildModifier('first', null, 'null')->transform([])); } public function testGivesLastElementOfArray() { $this->assertEquals( 'three', $this->buildModifier('last')->transform(['one', 'two', 'three']) ); } public function testGivesLastElementOfObject() { $this->assertEquals( 'three', $this->buildModifier('last')->transform((object) ['one', 'two', 'three']) ); } public function testGettingLastFailsForEmptyArray() { $this->expectException(\InvalidArgumentException::class); $this->buildModifier('last')->transform([]); } public function testGettingLastGivesNullForEmptyArray() { $this->assertNull($this->buildModifier('last', null, 'null')->transform([])); } public function testGivesSpecificElementOfArray() { $this->assertEquals( 'two', $this->buildModifier('fixed', '1')->transform(['one', 'two', 'three']) ); } public function testGivesSpecificElementOfObject() { $this->assertEquals( 'two', $this->buildModifier('fixed', 1)->transform((object) ['one', 'two', 'three']) ); } public function testGettingSpecificFailsForEmptyArray() { $this->expectException(\InvalidArgumentException::class); $this->buildModifier('fixed', 1)->transform([]); } public function testGettingSpecificGivesNullForEmptyArray() { $this->assertNull($this->buildModifier('fixed', 1, 'null')->transform([])); } public function testGettingSpecificFailsForMissingValue() { $this->expectException(\InvalidArgumentException::class); $this->buildModifier('fixed', 3)->transform(['one', 'two', 'three']); } public function testGettingSpecificGivesNullForMissingValue() { $this->assertNull($this->buildModifier('fixed', 3, 'null')->transform(['one', 'two', 'three'])); } public function testFailsForStrings() { $this->expectException(\InvalidArgumentException::class); $this->buildModifier('first')->transform('string'); } public function testAnnouncesArraySupport() { $modifier = new PropertyModifierArrayElementByPosition(); $this->assertTrue($modifier->hasArraySupport()); } protected function buildModifier($type, $position = null, $whenMissing = 'fail') { $modifier = new PropertyModifierArrayElementByPosition(); $modifier->setSettings([ 'position_type' => $type, 'position' => $position, 'when_missing' => $whenMissing, ]); return $modifier; } } PropertyModifierArrayFilterTest.php000066400000000000000000000064221516513262500361540ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/PropertyModifiersetSettings(array( 'filter_method' => 'wildcard', 'filter_string' => 'www*', 'policy' => 'keep', 'when_empty' => 'empty_array', )); $this->assertEquals( array('www.example.com', 'www'), $modifier->transform($this->testArray) ); } public function testRejectMatchingWildcards() { $modifier = new PropertyModifierArrayFilter(); $modifier->setSettings(array( 'filter_method' => 'wildcard', 'filter_string' => 'www*', 'policy' => 'reject', 'when_empty' => 'empty_array', )); $this->assertEquals( array('example.com', 'wwexample.com', 'example.www', ''), $modifier->transform($this->testArray) ); } public function testKeepMatchingRegularExpression() { $modifier = new PropertyModifierArrayFilter(); $modifier->setSettings(array( 'filter_method' => 'regex', 'filter_string' => '/^w{3}.*/', 'policy' => 'keep', 'when_empty' => 'empty_array', )); $this->assertEquals( array('www.example.com', 'www'), $modifier->transform($this->testArray) ); } public function testRejectMatchingRegularExpression() { $modifier = new PropertyModifierArrayFilter(); $modifier->setSettings(array( 'filter_method' => 'regex', 'filter_string' => '/^w{3}.*/', 'policy' => 'reject', 'when_empty' => 'empty_array', )); $this->assertEquals( array('example.com', 'wwexample.com', 'example.www', ''), $modifier->transform($this->testArray) ); } public function testGivesEmptyArrayOrNullAccordingToConfig() { $modifier = new PropertyModifierArrayFilter(); $modifier->setSettings(array( 'filter_method' => 'wildcard', 'filter_string' => 'no-match', 'policy' => 'keep', 'when_empty' => 'empty_array', )); $this->assertEquals( array(), $modifier->transform($this->testArray) ); $modifier->setSetting('when_empty', 'null'); $this->assertNull( $modifier->transform($this->testArray) ); } public function testAnnouncesArraySupport() { $modifier = new PropertyModifierArrayFilter(); $this->assertTrue($modifier->hasArraySupport()); } } PropertyModifierCombineTest.php000066400000000000000000000030531516513262500353010ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/PropertyModifier 'localhost', 'service' => 'ping'); $modifier = new PropertyModifierCombine(); $modifier->setSettings(array('pattern' => '${host}!${service}')); $this->assertEquals( 'localhost!ping', $modifier->setRow($row)->transform('something') ); } public function testDoesNotFailForMissingProperties() { $row = (object) array('host' => 'localhost'); $modifier = new PropertyModifierCombine(); $modifier->setSettings(array('pattern' => '${host}!${service}')); $this->assertEquals( 'localhost!', $modifier->setRow($row)->transform('something') ); } public function testDoesNotEvaluateVariablesFromDataSource() { $row = (object) array('host' => '${service}', 'service' => 'ping'); $modifier = new PropertyModifierCombine(); $modifier->setSettings(array('pattern' => '${host}!${service}')); $this->assertEquals( '${service}!ping', $modifier->setRow($row)->transform('something') ); } public function testRequiresRow() { $modifier = new PropertyModifierCombine(); $this->assertTrue($modifier->requiresRow()); } } PropertyModifierListToObjectTest.php000066400000000000000000000056331516513262500363000ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/PropertyModifierassertEquals( $this->getOutput(), $this->getNewModifier()->transform($this->getInputArrays()) ); } public function testConvertsAListOfObjects() { $this->assertEquals( $this->getOutput(), $this->getNewModifier()->transform($this->getInputObjects()) ); } public function testFailsOnMissingKey() { $this->expectException(\InvalidArgumentException::class); $input = $this->getInputArrays(); unset($input[0]['name']); $this->getNewModifier()->transform($input); } public function testFailsWithDuplicateRows() { $this->expectException(\InvalidArgumentException::class); $input = $this->getInputArrays(); $input[1]['name'] = 'row1'; $this->getNewModifier()->transform($input); } public function testKeepsFirstRowOnDuplicate() { $input = $this->getInputArrays(); $input[1]['name'] = 'row1'; $modifier = $this->getNewModifier()->setSetting('on_duplicate', 'keep_first'); $result = $modifier->transform($input); $this->assertEquals( (object) ['some' => 'property'], $result->row1->props ); } public function testKeepsLastRowOnDuplicate() { $input = $this->getInputArrays(); $input[1]['name'] = 'row1'; $modifier = $this->getNewModifier()->setSetting('on_duplicate', 'keep_last'); $result = $modifier->transform($input); $this->assertEquals( (object) ['other' => 'property'], $result->row1->props ); } protected function getNewModifier() { $modifier = new PropertyModifierListToObject(); $modifier->setSettings([ 'key_property' => 'name', 'on_duplicate' => 'fail' ]); return $modifier; } protected function getInputArrays() { return [ ['name' => 'row1', 'props' => (object) ['some' => 'property']], ['name' => 'row2', 'props' => (object) ['other' => 'property']], ]; } protected function getInputObjects() { return [ (object) ['name' => 'row1', 'props' => (object) ['some' => 'property']], (object) ['name' => 'row2', 'props' => (object) ['other' => 'property']], ]; } protected function getOutput() { return (object) [ 'row1' => (object) ['name' => 'row1', 'props' => (object) ['some' => 'property']], 'row2' => (object) ['name' => 'row2', 'props' => (object) ['other' => 'property']], ]; } } PropertyModifierParseURLTest.php000066400000000000000000000101551516513262500353630ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/PropertyModifierassertFalse($modifier->hasArraySupport()); } public function testEmptyPropertyReturnsNullOnfailureNull() { $modifier = new PropertyModifierParseURL(); $modifier->setSettings([ 'url_component' => 'query', 'on_failure' => 'null', ]); $this->assertNull($modifier->transform('')); } public function testMissingComponentReturnsNullOnfailureNull() { $modifier = new PropertyModifierParseURL(); $modifier->setSettings([ 'url_component' => 'query', 'on_failure' => 'null', ]); $this->assertNull($modifier->transform('https://www.icinga.org/path/')); } public function testMissingComponentReturnsPropertyOnfailureKeep() { $modifier = new PropertyModifierParseURL(); $modifier->setSettings([ 'url_component' => 'query', 'on_failure' => 'keep', ]); $this->assertEquals('http://www.icinga.org/path/', $modifier->transform('http://www.icinga.org/path/')); } public function testMissingComponentThrowsExceptionOnfailureFail() { $this->expectException(InvalidPropertyException::class); $modifier = new PropertyModifierParseURL(); $modifier->setSettings([ 'url_component' => 'query', 'on_failure' => 'fail', ]); $modifier->transform('http://www.icinga.org/path/'); } public function testInvalidUrlReturnsNullOnfailureNull() { $modifier = new PropertyModifierParseURL(); $modifier->setSettings([ 'url_component' => 'host', 'on_failure' => 'null', ]); $this->assertNull($modifier->transform(self::$invalidurl)); } public function testInvalidUrlReturnsItselfOnfailureKeep() { $modifier = new PropertyModifierParseURL(); $modifier->setSettings([ 'url_component' => 'host', 'on_failure' => 'keep', ]); $this->assertEquals(self::$invalidurl, $modifier->transform(self::$invalidurl)); } public function testInvalidUrlThrowsExceptionOnfailureFail() { $this->expectException(InvalidPropertyException::class); $modifier = new PropertyModifierParseURL(); $modifier->setSettings([ 'url_component' => 'host', 'on_failure' => 'fail', ]); $modifier->transform(self::$invalidurl); } /** * @dataProvider dataURLcomponentProvider */ public function testSuccessfullyParse($component, $result) { $modifier = new PropertyModifierParseURL(); $modifier->setSettings([ 'url_component' => $component, 'on_failure' => 'null', ]); $this->assertEquals($result, $modifier->transform(self::$validurl)); } public function dataURLcomponentProvider() { return [ 'scheme' => [ 'scheme', 'https', ], 'host' => [ 'host', 'www.icinga.org', ], 'port' => [ 'port', '', ], 'path' => [ 'path', '/path/file.html', ], 'query' => [ 'query', 'foo=bar', ], 'fragment' => [ 'fragment', 'section', ], ]; } } icingaweb2-module-director-1.11.8/test/php/library/Director/Resolver/000077500000000000000000000000001516513262500255045ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/Resolver/TemplateTreeTest.php000066400000000000000000000172621516513262500314600ustar00rootroot00000000000000 'o1', 'object_type' => 'template' ], $db); $o2 = IcingaHost::create([ 'object_name' => 'o2', 'object_type' => 'template' ], $db); $o3 = IcingaHost::create([ 'object_name' => 'o3', 'object_type' => 'template' ], $db); $o4 = IcingaHost::create([ 'object_name' => 'o4', 'object_type' => 'template', 'imports' => ['o2', 'o1'], ], $db); $o5 = IcingaHost::create([ 'object_name' => 'o5', 'object_type' => 'template', 'imports' => ['o4'], ], $db); $o6 = IcingaHost::create([ 'object_name' => 'o6', 'object_type' => 'template', 'imports' => ['o4', 'o2'], ], $db); $o7 = IcingaHost::create([ 'object_name' => 'o7', 'object_type' => 'object', 'imports' => ['o4', 'o2'], ], $db); $o1->store(); $o2->store(); $o3->store(); $o4->store(); $o5->store(); $o6->store(); $o7->store(); return (object) [ 'o1' => $o1, 'o2' => $o2, 'o3' => $o3, 'o4' => $o4, 'o5' => $o5, 'o6' => $o6, 'o7' => $o7, ]; } public function testHostWithoutParentGivesAnEmptyArray() { $db = $this->getDb(); $hosts = $this->prepareHosts($db); $tree = new TemplateTree('host', $db); $this->assertEquals([], $tree->getParentsFor($hosts->o2)); $this->assertEquals([], $tree->getAncestorsFor($hosts->o2)); $this->assertEquals([], $tree->listAncestorIdsFor($hosts->o2)); } public function testSimpleInheritanceWithMultipleParentsGivesOrderedResult() { $db = $this->getDb(); $hosts = $this->prepareHosts($db); $tree = new TemplateTree('host', $db); $this->assertArrayEqualsWithKeys([ $hosts->o2->id => 'o2', $hosts->o1->id => 'o1', ], $tree->getParentsFor($hosts->o4)); $this->assertArrayEqualsWithKeys([ (int) $hosts->o2->id, (int) $hosts->o1->id, ], $tree->listParentIdsFor($hosts->o4)); } public function testMultiInheritanceIsResolved() { $db = $this->getDb(); $hosts = $this->prepareHosts($db); $tree = new TemplateTree('host', $db); $this->assertArrayEqualsWithKeys([ $hosts->o2->id => 'o2', $hosts->o1->id => 'o1', $hosts->o4->id => 'o4' ], $tree->getAncestorsFor($hosts->o5)); $this->assertArrayEqualsWithKeys([ (int) $hosts->o2->get('id'), (int) $hosts->o1->getProperty('id'), $hosts->o4->getAutoincId(), ], $tree->listAncestorIdsFor($hosts->o5)); } public function testTemplateOrderIsCorrectWhenInheritingSameTemplateMultipleTimes() { $db = $this->getDb(); $hosts = $this->prepareHosts($db); $tree = new TemplateTree('host', $db); $this->assertArrayEqualsWithKeys([ $hosts->o1->id => 'o1', $hosts->o4->id => 'o4', $hosts->o2->id => 'o2' ], $tree->getAncestorsFor($hosts->o6)); $this->assertArrayEqualsWithKeys([ $hosts->o1->getAutoincId(), $hosts->o4->getAutoincId(), $hosts->o2->getAutoincId(), ], $tree->listAncestorIdsFor($hosts->o6)); } protected function assertArrayEqualsWithKeys($expected, $actual) { $message = sprintf( 'Failed asserting that %s equals %s', json_encode($actual), json_encode($expected) ); $this->assertTrue( $expected === $actual, $message ); } protected function assertSameArrayValues($expected, $actual) { $message = sprintf( 'Failed asserting that %s has the same values as %s', json_encode($actual), json_encode($expected) ); sort($expected); sort($actual); $this->assertTrue( $expected === $actual, $message ); } public function testChildrenAreResolvedCorrectlyOverMultipleLevels() { $db = $this->getDb(); $o1 = IcingaService::create([ 'object_name' => 'o1', 'object_type' => 'template' ], $db); $o2 = IcingaService::create([ 'object_name' => 'o2', 'object_type' => 'template' ], $db); $o3 = IcingaService::create([ 'object_name' => 'o3', 'object_type' => 'template' ], $db); $o4 = IcingaService::create([ 'object_name' => 'o4', 'object_type' => 'template', 'imports' => ['o2', 'o1'], ], $db); $o5 = IcingaService::create([ 'object_name' => 'o5', 'object_type' => 'template', 'imports' => ['o4'], ], $db); $o6 = IcingaService::create([ 'object_name' => 'o6', 'object_type' => 'template', 'imports' => ['o4', 'o2'], ], $db); $o7 = IcingaService::create([ 'object_name' => 'o7', 'object_type' => 'apply', 'imports' => ['o4', 'o2'], ], $db); $o1->store(); $o2->store(); $o3->store(); $o4->store(); $o5->store(); $o6->store(); $o7->store(); $this->applyId = (int) $o7->get('id'); $tree = new TemplateTree('service', $db); $this->assertEquals([ $o4->id => 'o4', $o5->id => 'o5', $o6->id => 'o6', ], $tree->getDescendantsFor($o2)); $this->assertSameArrayValues([ $o4->getAutoincId(), (int) $o5->id, (int) $o6->getProperty('id'), ], $tree->listDescendantIdsFor($o2)); $this->assertEquals([ $o5->id => 'o5', $o6->id => 'o6', ], $tree->getChildrenFor($o4)); $this->assertEquals([], $tree->getChildrenFor($o5)); } protected function removeHosts(Db $db) { $kill = array('o7', 'o6', 'o5', 'o4', 'o3', 'o2', 'o1'); foreach ($kill as $name) { if (IcingaHost::exists($name, $db)) { IcingaHost::load($name, $db)->delete(); } } } protected function removeServices(Db $db) { if ($this->applyId) { $key = ['id' => $this->applyId]; if (IcingaService::exists($key, $db)) { IcingaService::load($key, $db)->delete(); } } $kill = array('o6', 'o5', 'o4', 'o3', 'o2', 'o1'); foreach ($kill as $name) { $key = [ 'object_name' => $name, 'object_type' => 'template', ]; if (IcingaService::exists($key, $db)) { IcingaService::load($key, $db)->delete(); } } } public function tearDown(): void { if ($this->hasDb()) { $db = $this->getDb(); $this->removeHosts($db); $this->removeServices($db); } parent::tearDown(); } } icingaweb2-module-director-1.11.8/test/php/library/Director/Restriction/000077500000000000000000000000001516513262500262105ustar00rootroot00000000000000icingaweb2-module-director-1.11.8/test/php/library/Director/Restriction/MatchingFilterTest.php000066400000000000000000000027251516513262500324670ustar00rootroot00000000000000assertEquals( '', (string) MatchingFilter::forUser($user, 'some/name', 'prop') ); } public function testSimpleRestrictionRendersCorrectly() { $this->assertEquals( 'prop = a*', (string) MatchingFilter::forPatterns(['a*'], 'prop') ); } public function testMultipleRestrictionsAreCombinedWithOr() { $this->assertEquals( 'prop = a* | prop = *b', (string) MatchingFilter::forPatterns(['a*', '*b'], 'prop') ); } public function testUserWithMultipleRestrictionsWorksFine() { $user = new User('dummy'); $user->setRestrictions([ 'some/name' => ['a*', '*b'], 'some/thing' => ['else'] ]); $this->assertEquals( 'prop = a* | prop = *b', (string) MatchingFilter::forUser($user, 'some/name', 'prop') ); } public function testSingleRestrictionAllowsForPipes() { $this->assertEquals( 'prop = a* | prop = *b', (string) MatchingFilter::forPatterns(['a*|*b'], 'prop') ); } } icingaweb2-module-director-1.11.8/test/phpunit-compat.php000066400000000000000000000002051516513262500233530ustar00rootroot00000000000000