From 8124abec06cfa31577baf83161f1ec46fefdcadd Mon Sep 17 00:00:00 2001 From: HTY Date: Tue, 2 Sep 2025 21:50:47 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=B7=B4=E7=BF=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重新練習 --- .babelrc | 10 - .editorconfig | 13 - .eslintignore | 2 - .eslintrc | 19 - .github/ISSUE_TEMPLATE.md | 68 - .github/PULL_REQUEST_TEMPLATE.md | 23 - .gitignore | 10 - .npmignore | 21 - .travis.yml | 17 - CHANGELOG.md | 565 ----- CODE_OF_CONDUCT.md | 74 - CONTRIBUTING.md | 45 - doc/api.hbs | 19 - doc/api.md | 3067 ------------------------ doc/experimental.md | 28 - doc/help.md | 151 -- doc/tutorials.md | 12 - doc/usage.md | 269 --- examples/game/game.html | 140 -- examples/game/game.js | 53 - examples/polling.js | 92 - examples/ssl/crt.pem | 22 - examples/ssl/key.pem | 27 - examples/webhook/express.js | 39 - examples/webhook/heroku.js | 35 - examples/webhook/https.js | 30 - examples/webhook/now.js | 32 - examples/webhook/openshift2.js | 44 - index.js | 13 - package.json | 74 - src/errors.js | 68 - src/telegram.js | 3838 ------------------------------ src/telegramPolling.js | 202 -- src/telegramWebHook.js | 158 -- src/utils.js | 3 - test/README.md | 31 - test/data/audio.mp3 | Bin 52864 -> 0 bytes test/data/chat_photo.png | Bin 14399 -> 0 bytes test/data/photo.gif | Bin 20660 -> 0 bytes test/data/photo.png | Bin 14399 -> 0 bytes test/data/sticker.png | Bin 52821 -> 0 bytes test/data/sticker.webp | Bin 92312 -> 0 bytes test/data/sticker_thumb.png | Bin 14521 -> 0 bytes test/data/video.mp4 | Bin 199611 -> 0 bytes test/data/voice.ogg | Bin 105243 -> 0 bytes test/mocha.opts | 3 - test/telegram.js | 2101 ---------------- test/test.format-send-data.js | 139 -- test/utils.js | 230 -- 49 files changed, 11787 deletions(-) delete mode 100644 .babelrc delete mode 100644 .editorconfig delete mode 100644 .eslintignore delete mode 100644 .eslintrc delete mode 100644 .github/ISSUE_TEMPLATE.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .travis.yml delete mode 100644 CHANGELOG.md delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 doc/api.hbs delete mode 100644 doc/api.md delete mode 100644 doc/experimental.md delete mode 100644 doc/help.md delete mode 100644 doc/tutorials.md delete mode 100644 doc/usage.md delete mode 100644 examples/game/game.html delete mode 100644 examples/game/game.js delete mode 100644 examples/polling.js delete mode 100644 examples/ssl/crt.pem delete mode 100644 examples/ssl/key.pem delete mode 100644 examples/webhook/express.js delete mode 100644 examples/webhook/heroku.js delete mode 100644 examples/webhook/https.js delete mode 100644 examples/webhook/now.js delete mode 100644 examples/webhook/openshift2.js delete mode 100644 index.js delete mode 100644 package.json delete mode 100644 src/errors.js delete mode 100644 src/telegram.js delete mode 100644 src/telegramPolling.js delete mode 100644 src/telegramWebHook.js delete mode 100644 src/utils.js delete mode 100644 test/README.md delete mode 100644 test/data/audio.mp3 delete mode 100644 test/data/chat_photo.png delete mode 100644 test/data/photo.gif delete mode 100644 test/data/photo.png delete mode 100644 test/data/sticker.png delete mode 100644 test/data/sticker.webp delete mode 100644 test/data/sticker_thumb.png delete mode 100644 test/data/video.mp4 delete mode 100644 test/data/voice.ogg delete mode 100644 test/mocha.opts delete mode 100644 test/telegram.js delete mode 100644 test/test.format-send-data.js delete mode 100644 test/utils.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index d03285da..00000000 --- a/.babelrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "plugins": [ - "transform-strict-mode", - "transform-object-rest-spread", - "transform-class-properties" - ], - "presets": [ - "babel-preset-es2015" - ] -} diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index e717f5eb..00000000 --- a/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# http://editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 417342d6..00000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -bin -*.md diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 89f049b6..00000000 --- a/.eslintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "airbnb/base", - "parser": "babel-eslint", - "rules": { - "new-cap": 0, - "prefer-arrow-callback": 0, - "no-param-reassign": [2,{"props":false}], - "max-len": [2, 200], - "arrow-body-style": 0, - "comma-dangle": 0, - "indent": ["error", 2] - }, - "plugins": [ - "mocha" - ], - "env": { - "mocha": true - } -} \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index e447b5ee..00000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - -> Bug Report - -I have read: - -* [Usage information](https://github.com/yagop/node-telegram-bot-api/tree/master/doc/usage.md) -* [Help information](https://github.com/yagop/node-telegram-bot-api/tree/master/doc/help.md) - -I am using the latest version of the library. - -### Expected Behavior - - - -### Actual Behavior - - - -### Steps to reproduce the Behavior - - - - - - - -> Feature Request - -I have: - -* searched for such a feature request (https://github.com/yagop/node-telegram-bot-api/labels/enhancement) and found none - -### Introduction - - - -### Example - - - - - - - -> Question - - diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index adc2bcc8..00000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,23 +0,0 @@ - -- [ ] All tests pass -- [ ] I have run `npm run doc` - -### Description - - - -### References - - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index bd74acab..00000000 --- a/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -node_modules -coverage/ -npm-debug.log -.package.json -package-lock.json -output.md -output/ -lib/ -lib-doc/ -.DS_Store \ No newline at end of file diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 4bdcd350..00000000 --- a/.npmignore +++ /dev/null @@ -1,21 +0,0 @@ -# lcov -coverage/ -*.log -.package.json - -# artifacts & source -README.hbs -output.md -output/ -test/ -examples/ -lib-doc/ - -# dotfiles -.travis.yml -.eslintrc -.eslintignore -.editorconfig -.babelrc -.gitignore -.git diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 097239ee..00000000 --- a/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: node_js -node_js: - - "12" - - "10" - - "8" - - "6" -# -# create required bash scripts to run builds on pull requests in the future -# -#script: -# - 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then bash ./travis/run_on_pull_requests; fi' -# - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bash ./travis/run_on_non_pull_requests; fi' -after_success: - - bash <(curl -s https://codecov.io/bash) -cache: - directories: - - node_modules diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 04ca7989..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,565 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). - -## [0.68.0][0.68.0] - UNRELEASE - -1. Support Telegram Bot API 9.1 (@danielperez9430) - * sendChecklist - * editMessageChecklist - * getMyStarBalance - -2. Support Telegram Bot API 9.0 (@danielperez9430) - * readBusinessMessage - * deleteBusinessMessages - * setBusinessAccountName - * setBusinessAccountUsername - * setBusinessAccountBio - * setBusinessAccountProfilePhoto - * removeBusinessAccountProfilePhoto - * setBusinessAccountGiftSettings - * getBusinessAccountStarBalance - * transferBusinessAccountStars - * getBusinessAccountGifts - * convertGiftToStars - * upgradeGift - * transferGift - * postStory - * editStory - * deleteStory - * giftPremiumSubscription - -3. Support Telegram Bot API 8.2 and 8.3 (@danielperez9430) - * verifyUser - * verifyChat - * removeUserVerification - * removeChatVerification - -4. Support Telegram Bot API 8.0 and 8.1 - * savePreparedInlineMessage (@IsmailBinMujeeb & @danielperez9430) - * setUserEmojiStatus (@danielperez9430) - * editUserStarSubscription (@danielperez9430) - * getAvailableGifts (@danielperez9430) - * sendGift (@danielperez9430) - -5. Support Telegram Bot API 7.10 (@danielperez9430) - * Update: `purchased_paid_media` - -6. Support Telegram Bot API 7.6 (@danielperez9430) - * sendPaidMedia - -## [0.67.0][0.67.0] - 2024-05-30 - -1. Support Telegram Bot API 7.4 (@danielperez9430) - * refundStarPayment - -## [0.66.0][0.66.0] - 2024-05-03 - -1. Support Telegram Bot API 7.2 & 7.3 (@danielperez9430) - * getBusinessConnection - * replaceStickerInSet - -2. Support for updates: (@danielperez9430) - * business_connection - * business_message - * edited_business_message - * deleted_business_messages - -3. Minor fixes: (@danielperez9430) - * getUserChatBoosts - -## [0.65.1][0.65.1] - 2024-03-09 - -1. Support for updates (@danielperez9430) - * message_reaction - * message_reaction_count - * chat_boost - * removed_chat_boost - -## [0.65.0][0.65.0] - 2024-02-20 - -1. Support Telegram Bot API v7.1 - * deleteMessages (@Sp3ricka) - * copyMessages (@xjx0106 & @Sp3ricka) - * setMessageReaction (@Sp3ricka) - * forwardMessages (@danielperez9430) - * getUserChatBoosts (@danielperez9430) - -2. Minor changes: (@danielperez9430) - * Refactor methods order - * Fix copyMessages & setMessageReaction methods - * Added missing tests - * Fix tests for methods copyMessages & getMyDefaulAdministratorRights - -## [0.64.0][0.64.0] - 2023-10-25 - -1. Replace `request` with a maintained version (@danielperez9430) - * Change `request` to `@cypress/request` - * Change `request-promise` to `@cypress/request-promise` - -## [0.63.0][0.63.0] - 2023-08-23 - -1. Support Telegram Bot API v6.8 (@danielperez9430) - * unpinAllGeneralForumTopicMessages - -## [0.62.0][0.62.0] - 2023-03-19 - -1. Support Telegram Bot API v6.6 & v6.7 (@danielperez9430) - * setMyDescription - * getMyDescription - * setMyShortDescription - * getMyShortDescription - * setCustomEmojiStickerSetThumbnail - * setStickerSetTitle - * deleteStickerSet - * setStickerEmojiList - * setStickerKeywords - * setStickerMaskPosition - -## [0.61.0][0.61.0] - 2022-12-30 - -1. Support Telegram Bot API v6.4 (@danielperez9430) - * editGeneralForumTopic - * closeGeneralForumTopic - * reopenGeneralForumTopic - * hideGeneralForumTopic - * unhideGeneralForumTopic - -2. Minor changes: (@danielperez9430) - * The parameters `name` and `icon_custom_emoji_id` of the method `editForumTopic` are now optional. - * Fix add thumb in sendAudio, sendVideo and sendVideoNote - * Fix getMyCommands and setMyCommands - * Suggested tip amounts stringify in sendInvoice - -## [0.60.0][0.60.0] - 2022-10-06 - -1. Support Telegram Bot API v6.3 (@danielperez9430) - * createForumTopic - * closeForumTopic - * reopenForumTopic - * deleteForumTopic - * unpinAllForumTopicMessages - * getForumTopicIconStickers - -2. Fix test getMyDefaultAdministratorRights (@danielperez9430) - -3. Fix parse entities - (@toniop99) - -## [0.59.0][0.59.0] - 2022-08-15 - -1. Support Telegram Bot API v6.2 (@danielperez9430) - * getCustomEmojiStickers - -2. Support test enviroment (@tinsaeDev & @kamikazechaser) - -3. Remove dependencies: (@danielperez9430) - * Remove *bluebird* => Use NodeJS Native Promises - * Remove *depd* => Use node native deprecate util for warnings - * Remove contributor dev dependency and add list of contributors in the readme - -4. Remove legacy methods: (@danielperez9430) - * getChatMembersCount - * kickChatMember - -5. Docs: (@danielperez9430) - * Update the docs of the methods - * Order methods follow the Telegram bot API docs in src/telegram.js - * Update README - -6. Fix: (@danielperez9430) - * addStickerToSet() -> Allow to send tgs_sticker + webm_sticker - * Remove mandatory param “start_parameter” from sendInvoice, because in the docs is a optional param - * getStickerSet test fix deprecated response value "contains_masks" change to "sticker_type" - * Fix some other tests - -7. New Test: (@danielperez9430) - * deleteStickerFromSet - * setStickerPositionInSet - * getCustomEmojiStickers - -## [0.58.0][0.58.0] - 2022-06-22 - -1. Support Bot API v6.1: (@danielperez9430) - * Add method *createInvoiceLink()* - -2. Support for setStickerSetThumb (@elihaidv) - -3. Add new test (@danielperez9430) - * createInvoiceLink - -4. Test fixes (@danielperez9430) - * sendVideoNote - * createNewStickerSet - * setStickerSetThumb - * getChatMenuButton - * setWebHook - -5. Bug fixes (@danielperez9430) - * answerWebAppQuery - * Support for send thumb in sendAudio - -## [0.57.0][0.57.0] - 2022-04-23 - -Added: - -1. Support Bot API v6: (@danielperez9430) - - * Add method *setChatMenuButton()* - * Add method *getChatMenuButton()* - * Add method *setMyDefaultAdministratorRights()* - * Add method *getMyDefaultAdministratorRights()* - * Add method *answerWebAppQuery()* - * Renamed the fields voice_chat_scheduled, voice_chat_started, voice_chat_ended, and voice_chat_participants_invited to video_chat_scheduled, video_chat_started, video_chat_ended, and video_chat_participants_invited - - - Tests: - - * answerWebAppQuery - * setChatMenuButton - * getChatMenuButton - * setMyDefaultAdministratorRights - * getMyDefaultAdministratorRights - -## [0.56.0][0.56.0] - 2021-12-07 - -Added: - -1. Support Bot API v5.5: (@danielperez9430) - - * Add method *banChatSenderChat()* - * Add method *unbanChatSenderChat()* - - Fixes: - - * Tests for support with new invite link format - -## [0.55.0][0.55.0] - 2021-11-06 - -Added: - -1. Support Bot API v5.4: (@danielperez9430) - - * Add method *approveChatJoinRequest()* - * Add method *declineChatJoinRequest()* - * Add support for new updates: - * *chat_join_request* - - Fixes: - - * Method *editMessageMedia*: Now you can send a local file (`"attach://" + filePatch`) - -## [0.54.0][0.54.0] - 2021-06-29 - -Added: - -1. Support Bot API v5.3: (@danielperez9430) - - * Add method *deleteMyCommands()* - * Add method *banChatMember()* - * Add method *getChatMemberCount()* - - New Test: - - * deleteMyCommands - * banChatMember - * getChatMemberCount - - Deprecated: - * Method *kickChatMember()* - * Method *getChatMembersCount()* - -## [0.53.0][0.53.0] - 2021-04-26 - -Added: - -1. Support Bot API v5.2:(@danielperez9430) - - * Add support for new messageTypes: - * *voice_chat_scheduled* - -## [0.52.0][0.52.0] - 2021-03-20 - -Added: - -1. Support Bot API v5.1: (by @danielperez9430) - - * Add method *createChatInviteLink()* - * Add method *editChatInviteLink()* - * Add method *revokeChatInviteLink()* - * Add support for new messageTypes: - * *voice_chat_started* - * *voice_chat_ended* - * *voice_chat_participants_invited* - * *message_auto_delete_timer_changed* - * *chat_invite_link* - * *chat_member_updated* - * Add support for new updates: - * *my_chat_member* - * *chat_member* - - New Test: (by @danielperez9430) - - * createChatInviteLink - * editChatInviteLink - * revokeChatInviteLink - -## [0.51.0][0.51.0] - 2020-11-04 - -Added: - -1. Support Bot API v5.0: (by @danielperez9430) - - * Add method *copyMessage()* - * Add method *unpinAllChatMessages()* - * Add method *close()* - * Add method *logOut()* - - Changed: (by @danielperez9430) - - * Remove trailing-spaces - * Fix Bugs in Test - - New Test: (by @danielperez9430) - - * copyMessage - * unpinAllChatMessages - -## [0.50.0][0.50.0] - 2020-05-2020 - -Added: - -1. Support Bot API v4.8: (by @danielperez9430) - * Add methods: *sendDice()* -2. Support Bot API v4.7: (by @danielperez9430) - * Add methods: *getMyCommands()*,*setMyCommands()* -3. Support Bot API v4.5: (by @danielperez9430) - * Add methods: *setChatAdministratorCustomTitle()* -4. Support Bot API v4.4: (by @danielperez9430) - * Add methods: *setChatPermissions()* -5. Support for poll_answer (by @JieJiSS) -6. Add request options in file stream (by @zhangpanyi ) - -Changed: (by @danielperez9430) - -* New message type: *dice* -* Fix Bugs in tests -* Fix regex compare (by @ledamint) -* Fix listening for error events when downloading files (by @Kraigo) - -New Test: (by @danielperez9430) - -* sendDice -* getMyCommands -* setMyCommands -* setChatAdministratorCustomTitle -* setChatPermissions - -## [0.40.0][0.40.0] - 2019-05-04 - -Added: - -1. Support Bot API v4.2: (by @kamikazechaser) - * Add methods: *TelegramBot#sendPoll()*, *TelegramBot#stopPoll()* - * Support events: *poll* -2. Support Bot API v4.0: (by @kamikazechaser) - * Add methods: *TelegramBot#editMessageMedia()*, *TelegramBot#sendAnimation()* - * Support new message types: *passport_data*, *animation* - -* * * - -## [0.30.0][0.30.0] - 2017-12-21 - -Added: - -1. Support Bot API v3.5: (by @GochoMugo) - * Allow `provider_data` parameter in *TelegramBot#sendInvoice* - * Add method *TelegramBot#sendMediaGroup()* -2. Support Bot API v3.4: (by @kamikazechaser) - * Add methods *TelegramBot#editMessageLiveLocation*, *TelegramBot#stopMessageLiveLocation* (#439) - * Add methods *TelegramBot#setChatStickerSet*, *TelegramBot#deleteChatStickerSet* (#440) -3. Add methods: - * *TelegramBot#getFileStream* (#442) (by @GochoMugo, requested-by @Xaqron) -4. Add options to *TelegramBot#stopPolling()* (by @GochoMugo) -5. Add `metadata` argument in `message` event (and friends e.g. `text`, `audio`, etc.) (#409) (by @jlsjonas, @GochoMugo) -6. Add forward-compatibility i.e. support future additional Telegram options (by @GochoMugo) -7. Add support for Node.js v9 (by @GochoMugo) -8. Document *TelegramBot.errors*, *TelegramBot.messageTypes* (by @GochoMugo) - -Changed: - -1. Update *TelegramBot#answerCallbackQuery()* signature (by @GochoMugo) -2. Improve default error logging of `polling_error` and `webhook_error` (#377) -3. Update dependencies - -Deprecated: - -1. Sending files: *(See [usage guide][usage-sending-files])* (by @hufan-akari, @GochoMugo) - * Error will **not** be thrown if `Buffer` is used and file-type could **not** be detected. - * Filename will **not** be set to `data.${ext}` if `Buffer` is used - * Content type will **not** default to `null` or `undefined` - -Fixed: - -1. Fix the offset infinite loop bug (#265, #36) (by @GochoMugo) -2. Fix game example (#449, #418) (by @MCSH) - -* * * - -## [0.29.0][0.29.0] - 2017-10-22 - -Added: - -1. Add Bot API v3.2 methods: - * (#429) *TelegramBot#getStickerSet* (by @CapacitorSet, @LibertyLocked) - * (#430) *TelegramBot#uploadStickerFile* (by @CapacitorSet) - * *TelegramBot#createNewStickerSet*, *TelegramBot#addStickerToSet*, *TelegramBot#setStickerPositionInSet*, *TelegramBot#deleteStickerFromSet* (by @GochoMugo) -2. Supports API v3.3 - -Deprecated: - -1. Auto-enabling Promise cancellation (#319) (by @GochoMugo) - -* * * - -## [0.28.0][0.28.0] - 2017-08-06 - -Added: - -1. (#361) Support Bot API v3.1 (by @Lord-Protector, @kamikazechaser) -2. (#332) Support Bot API v3.0 (by @kamikazechaser, @GochoMugo) -3. Add *TelegramBot#removeTextListener()* (by @GochoMugo) -4. (#342) Add game example (by @MCSH) -5. (#315) List 'bot-brother' project in community section in README (by @saeedhei) - -Changed: - -1. (#367) Update *TelegramBot#answerCallbackQuery()* signature (by @mnb3000) - -Fixed: - -1. (#325) Fix global regexp state reset (by @Sirius-A) -2. (#363) Fix download file path on windows (by @kucherenkovova) -3. (#346) Fix anchor webhook link in docs (by @Coac) - -* * * - -## [0.27.1][0.27.1] - 2017-04-07 - -Added: - -1. (#287) Add Express WebHook example (by @kamikazechaser) - -Fixed: - -1. (#291) Improve docs (by @preco21) -2. (#298) Fix running on Node v5 (by @jehy) -3. (#307) Fix badge links in README (by @JaakkoLipsanen) -4. Fix defaulting value of `options.polling.params.timeout` (by @GochoMugo) -5. Fix typos in Github issue template (by @GochoMugo, requested-by @GingerPlusPlus) - -* * * - -## [0.27.0][0.27.0] - 2017-02-10 - -Added: - -1. Add constructor options: - * (#243) `options.polling.params` (by @GochoMugo, requested-by @sidelux) -2. Add methods: - * (#74) *TelegramBot#removeReplyListener()* (by @githugger) -3. (#283) Add proper error handling (by @GochoMugo) -4. (#272) Add health-check endpoint (by @mironov) - * `options.webHook.healthEndpoint` -5. (#152) Add test for TelegramBot#sendDocument() using 'fileOpts' - param (by @evolun) -6. Document `options.webHook.host` (by @GochoMugo) -7. (#264) Add Bot API version to README (by @kamikazechaser) -8. Add examples: - - (#271) WebHook on Heroku (by @TheBeastOfCaerbannog) - - (#274) WebHook on Zeit Now (by @Ferrari) - -Changed: - -1. (#147) Use *String#indexOf()*, instead of *RegExp#test()*, to - find token in webhook request (by @AVVS) - -Fixed: - -* Fix bug: - - (#275, #280) fix es6 syntax error on Node.js v4.x (by @crazyabdul) - - (#276) promise.warning from `request-promise` (by @GochoMugo, - reported-by @preco21) - - (#281) fix handling error during polling (by @GochoMugo, - reported-by @dimawebmaker) - - (#284) fix error during deletion of already-set webhook, during - polling (by @GochoMugo, reported-by @dcparga) -1. Fix links in documentation (by @Ni2c2k) - -* * * - -## [0.26.0][0.26.0] - 2017-01-20 - -Added: - -1. Add *TelegramBot* constructor options: - * `options.https` - * `options.baseApiUrl` - * `options.filepath` -2. Add methods: - * *TelegramBot#stopPolling()* - * *TelegramBot#isPolling()* - * *TelegramBot#openWebHook()* - * *TelegramBot#closeWebHook()* - * *TelegramBot#hasOpenWebHook()* - * *TelegramBot#deleteWebHook()* - * *TelegramBot#getWebHookInfo()* - -Changed: - -1. Use POST requests by default -2. Ensure all relevant methods return Promises -3. Document auto-deletion of webhook during polling -4. Deprecate support for Node.js v0.12 -5. Fix consistency of methods signatures -6. Rename *TelegramBot#initPolling()* to *TelegramBot#startPolling()* - * Deprecate *TelegramBot#initPolling()* - -Fixed: - -1. Handle error during formatting `formData` -2. Fix ES6 syntax - -*Credits/Blames: Unless explicitly stated otherwise, above work was -done by @GochoMugo* - -* * * - -## [0.25.0][0.25.0] - 2016-12-21 - -Added: - -1. Supports the API v2.3 updates (by @kamikazechaser) -2. Add *TelegramBot* constructor option: - * `options.request`: proxy extra request options (by @tarmolov) - * `options.onlyFirstMatch` (by @GingerPlusPlus) -3. Add methods: - * *TelegramBot#sendVenue()* (by Tketa) - * *TelegramBot#sendContact()* (by @GochoMugo) - * *TelegramBot#getGameHighScores()* (by @jishnu7) - -Fixed: - -1. Fix request performance issue (by @preco21) -2. Fix typos (by oflisback) - -[usage-sending-files]:https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files-options - -[0.25.0]:https://github.com/yagop/node-telegram-bot-api/releases/tag/v0.25.0 -[0.26.0]:https://github.com/yagop/node-telegram-bot-api/releases/tag/v0.26.0 -[0.27.0]:https://github.com/yagop/node-telegram-bot-api/releases/tag/v0.27.0 -[0.27.1]:https://github.com/yagop/node-telegram-bot-api/releases/tag/v0.27.1 -[0.28.0]:https://github.com/yagop/node-telegram-bot-api/releases/tag/v0.28.0 -[0.29.0]:https://github.com/yagop/node-telegram-bot-api/releases/tag/v0.29.0 -[0.30.0]:https://github.com/yagop/node-telegram-bot-api/releases/tag/v0.30.0 -[Unreleased]:https://github.com/yagop/node-telegram-bot-api/compare/v0.30.0...master diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index c845c46d..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, gender identity and expression, level of experience, -nationality, personal appearance, race, religion, or sexual identity and -orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or -advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at mugo@forfuture.co.ke. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index ab5b29fe..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,45 +0,0 @@ -# Contributing - -> If you are willing to contribute, first you should know that -> I will love you and so will the Telegram Bot community. - -Before proceeding any further, read the following documents: - -1. [Code of Conduct][coc] -1. [License][license] - -## General Information - -### Creating a Github issue: - -1. Ensure that your issue does **not** already exist. [Do a search](https://github.com/yagop/node-telegram-bot-api/issues). -2. Browse through [StackOverflow](https://stackoverflow.com/search?q=telegram+nodejs) and other similar platforms. -3. Should you open your issue, ensure you use the English language for - the wider target audience. -4. Be patient please. - - -### Updating API Reference i.e. generating `doc/api.md` - -Run: - -```bash -$ npm run doc -``` - - -### Running tests - -Please read `test/README.md` for more information. - - -### Transpiling ES2015 for older Node.js versions - -We use babel to transpile the code: - -```bash -$ npm run build -``` - -[coc]:https://github.com/yagop/node-telegram-bot-api/blob/master/CODE_OF_CONDUCT.md -[license]:https://github.com/yagop/node-telegram-bot-api/blob/master/LICENSE.md diff --git a/doc/api.hbs b/doc/api.hbs deleted file mode 100644 index 2793b2ef..00000000 --- a/doc/api.hbs +++ /dev/null @@ -1,19 +0,0 @@ -# API Reference - -**Note:** If you are looking for available [events](usage.md#events) or usage of api, please refer [`usage.md`](usage.md). - -{{#class name="TelegramBot"~}} -{{>header~}} -{{>body~}} -{{>member-index~}} -{{>members~}} -{{/class}} -* * * - - -[usage-sending-files-performance]:https://github.com/yagop/node-telegram-bot-api/tree/master/doc/usage.md#sending-files-performance -[setWebHook-v0.25.0]:https://github.com/yagop/node-telegram-bot-api/tree/4e5a493cadfaad5589a8d79e55d9e0d103000ce4#telegrambotsetwebhookurl-cert -[getUpdates-v0.25.0]:https://github.com/yagop/node-telegram-bot-api/tree/4e5a493cadfaad5589a8d79e55d9e0d103000ce4#TelegramBot+getUpdates -[getUserProfilePhotos-v0.25.0]:https://github.com/yagop/node-telegram-bot-api/tree/4e5a493cadfaad5589a8d79e55d9e0d103000ce4#TelegramBot+getUserProfilePhotos -[answerCallbackQuery-v0.27.1]:https://github.com/yagop/node-telegram-bot-api/blob/v0.27.1/doc/api.md#TelegramBot+answerCallbackQuery -[answerCallbackQuery-v0.29.0]:https://github.com/yagop/node-telegram-bot-api/blob/v0.29.0/doc/api.md#TelegramBot+answerCallbackQuery diff --git a/doc/api.md b/doc/api.md deleted file mode 100644 index 1f530d4d..00000000 --- a/doc/api.md +++ /dev/null @@ -1,3067 +0,0 @@ -# API Reference - -**Note:** If you are looking for available [events](usage.md#events) or usage of api, please refer [`usage.md`](usage.md). - - - -## TelegramBot -TelegramBot - -**Kind**: global class -**See**: https://core.telegram.org/bots/api - -* [TelegramBot](#TelegramBot) - * [new TelegramBot(token, [options])](#new_TelegramBot_new) - * _instance_ - * [.on(event, listener)](#TelegramBot+on) - * [.startPolling([options])](#TelegramBot+startPolling) ⇒ Promise - * ~~[.initPolling([options])](#TelegramBot+initPolling) ⇒ Promise~~ - * [.stopPolling([options])](#TelegramBot+stopPolling) ⇒ Promise - * [.getFileLink(fileId, [options])](#TelegramBot+getFileLink) ⇒ Promise - * [.getFileStream(fileId, [options])](#TelegramBot+getFileStream) ⇒ stream.Readable - * [.downloadFile(fileId, downloadDir, [options])](#TelegramBot+downloadFile) ⇒ Promise - * [.onText(regexpRexecuted, callback)](#TelegramBot+onText) - * [.removeTextListener(regexp)](#TelegramBot+removeTextListener) ⇒ Object - * [.clearTextListeners()](#TelegramBot+clearTextListeners) - * [.onReplyToMessage(chatId, messageId, callback)](#TelegramBot+onReplyToMessage) ⇒ Number - * [.removeReplyListener(replyListenerId)](#TelegramBot+removeReplyListener) ⇒ Object - * [.clearReplyListeners()](#TelegramBot+clearReplyListeners) ⇒ Array - * [.isPolling()](#TelegramBot+isPolling) ⇒ Boolean - * [.openWebHook()](#TelegramBot+openWebHook) ⇒ Promise - * [.closeWebHook()](#TelegramBot+closeWebHook) ⇒ Promise - * [.hasOpenWebHook()](#TelegramBot+hasOpenWebHook) ⇒ Boolean - * [.processUpdate(update)](#TelegramBot+processUpdate) - * [.getUpdates([options])](#TelegramBot+getUpdates) ⇒ Promise - * [.setWebHook(url, [options], [fileOptions])](#TelegramBot+setWebHook) ⇒ Promise - * [.deleteWebHook([options])](#TelegramBot+deleteWebHook) ⇒ Promise - * [.getWebHookInfo([options])](#TelegramBot+getWebHookInfo) ⇒ Promise - * [.getMe([options])](#TelegramBot+getMe) ⇒ Promise - * [.logOut([options])](#TelegramBot+logOut) ⇒ Promise - * [.close([options])](#TelegramBot+close) ⇒ Promise - * [.sendMessage(chatId, text, [options])](#TelegramBot+sendMessage) ⇒ Promise - * [.forwardMessage(chatId, fromChatId, messageId, [options])](#TelegramBot+forwardMessage) ⇒ Promise - * [.forwardMessages(chatId, fromChatId, messageIds, [options])](#TelegramBot+forwardMessages) ⇒ Promise - * [.copyMessage(chatId, fromChatId, messageId, [options])](#TelegramBot+copyMessage) ⇒ Promise - * [.copyMessages(chatId, fromChatId, messageIds, [options])](#TelegramBot+copyMessages) ⇒ Promise - * [.sendPhoto(chatId, photo, [options], [fileOptions])](#TelegramBot+sendPhoto) ⇒ Promise - * [.sendAudio(chatId, audio, [options], [fileOptions])](#TelegramBot+sendAudio) ⇒ Promise - * [.sendDocument(chatId, doc, [options], [fileOptions])](#TelegramBot+sendDocument) ⇒ Promise - * [.sendVideo(chatId, video, [options], [fileOptions])](#TelegramBot+sendVideo) ⇒ Promise - * [.sendAnimation(chatId, animation, [options], [fileOptions])](#TelegramBot+sendAnimation) ⇒ Promise - * [.sendVoice(chatId, voice, [options], [fileOptions])](#TelegramBot+sendVoice) ⇒ Promise - * [.sendVideoNote(chatId, videoNote, [options], [fileOptions])](#TelegramBot+sendVideoNote) ⇒ Promise - * [.sendPaidMedia(chatId, starCount, media, [options])](#TelegramBot+sendPaidMedia) ⇒ Promise - * [.sendMediaGroup(chatId, media, [options])](#TelegramBot+sendMediaGroup) ⇒ Promise - * [.sendLocation(chatId, latitude, longitude, [options])](#TelegramBot+sendLocation) ⇒ Promise - * [.editMessageLiveLocation(latitude, longitude, [options])](#TelegramBot+editMessageLiveLocation) ⇒ Promise - * [.stopMessageLiveLocation([options])](#TelegramBot+stopMessageLiveLocation) ⇒ Promise - * [.sendVenue(chatId, latitude, longitude, title, address, [options])](#TelegramBot+sendVenue) ⇒ Promise - * [.sendContact(chatId, phoneNumber, firstName, [options])](#TelegramBot+sendContact) ⇒ Promise - * [.sendPoll(chatId, question, pollOptions, [options])](#TelegramBot+sendPoll) ⇒ Promise - * [.sendChecklist(businessConnectionId, chatId, checklist, [options])](#TelegramBot+sendChecklist) ⇒ Promise - * [.sendDice(chatId, [options])](#TelegramBot+sendDice) ⇒ Promise - * [.sendChatAction(chatId, action, [options])](#TelegramBot+sendChatAction) ⇒ Promise - * [.setMessageReaction(chatId, messageId, [options])](#TelegramBot+setMessageReaction) ⇒ [ 'Promise' ].<Boolean> - * [.getUserProfilePhotos(userId, [options])](#TelegramBot+getUserProfilePhotos) ⇒ Promise - * [.setUserEmojiStatus(userId, [options])](#TelegramBot+setUserEmojiStatus) ⇒ Promise - * [.getFile(fileId, [options])](#TelegramBot+getFile) ⇒ Promise - * [.banChatMember(chatId, userId, [options])](#TelegramBot+banChatMember) ⇒ Promise - * [.unbanChatMember(chatId, userId, [options])](#TelegramBot+unbanChatMember) ⇒ Promise - * [.restrictChatMember(chatId, userId, [options])](#TelegramBot+restrictChatMember) ⇒ Promise - * [.promoteChatMember(chatId, userId, [options])](#TelegramBot+promoteChatMember) ⇒ Promise - * [.setChatAdministratorCustomTitle(chatId, userId, customTitle, [options])](#TelegramBot+setChatAdministratorCustomTitle) ⇒ Promise - * [.banChatSenderChat(chatId, senderChatId, [options])](#TelegramBot+banChatSenderChat) ⇒ Promise - * [.unbanChatSenderChat(chatId, senderChatId, [options])](#TelegramBot+unbanChatSenderChat) ⇒ Promise - * [.setChatPermissions(chatId, chatPermissions, [options])](#TelegramBot+setChatPermissions) ⇒ Promise - * [.exportChatInviteLink(chatId, [options])](#TelegramBot+exportChatInviteLink) ⇒ Promise - * [.createChatInviteLink(chatId, [options])](#TelegramBot+createChatInviteLink) ⇒ Object - * [.editChatInviteLink(chatId, inviteLink, [options])](#TelegramBot+editChatInviteLink) ⇒ Promise - * [.createChatSubscriptionInviteLink(chatId, subscriptionPeriod, subscriptionPrice, [options])](#TelegramBot+createChatSubscriptionInviteLink) ⇒ Promise - * [.editChatSubscriptionInviteLink(chatId, inviteLink, [options])](#TelegramBot+editChatSubscriptionInviteLink) ⇒ Promise - * [.revokeChatInviteLink(chatId, inviteLink, [options])](#TelegramBot+revokeChatInviteLink) ⇒ Promise - * [.approveChatJoinRequest(chatId, userId, [options])](#TelegramBot+approveChatJoinRequest) ⇒ Promise - * [.declineChatJoinRequest(chatId, userId, [options])](#TelegramBot+declineChatJoinRequest) ⇒ Promise - * [.setChatPhoto(chatId, photo, [options], [fileOptions])](#TelegramBot+setChatPhoto) ⇒ Promise - * [.deleteChatPhoto(chatId, [options])](#TelegramBot+deleteChatPhoto) ⇒ Promise - * [.setChatTitle(chatId, title, [options])](#TelegramBot+setChatTitle) ⇒ Promise - * [.setChatDescription(chatId, description, [options])](#TelegramBot+setChatDescription) ⇒ Promise - * [.pinChatMessage(chatId, messageId, [options])](#TelegramBot+pinChatMessage) ⇒ Promise - * [.unpinChatMessage(chatId, [options])](#TelegramBot+unpinChatMessage) ⇒ Promise - * [.unpinAllChatMessages(chatId, [options])](#TelegramBot+unpinAllChatMessages) ⇒ Promise - * [.leaveChat(chatId, [options])](#TelegramBot+leaveChat) ⇒ Promise - * [.getChat(chatId, [options])](#TelegramBot+getChat) ⇒ Promise - * [.getChatAdministrators(chatId, [options])](#TelegramBot+getChatAdministrators) ⇒ Promise - * [.getChatMemberCount(chatId, [options])](#TelegramBot+getChatMemberCount) ⇒ Promise - * [.getChatMember(chatId, userId, [options])](#TelegramBot+getChatMember) ⇒ Promise - * [.setChatStickerSet(chatId, stickerSetName, [options])](#TelegramBot+setChatStickerSet) ⇒ Promise - * [.deleteChatStickerSet(chatId, [options])](#TelegramBot+deleteChatStickerSet) ⇒ Promise - * [.getForumTopicIconStickers(chatId, [options])](#TelegramBot+getForumTopicIconStickers) ⇒ Promise - * [.createForumTopic(chatId, name, [options])](#TelegramBot+createForumTopic) - * [.editForumTopic(chatId, messageThreadId, [options])](#TelegramBot+editForumTopic) ⇒ Promise - * [.closeForumTopic(chatId, messageThreadId, [options])](#TelegramBot+closeForumTopic) ⇒ Promise - * [.reopenForumTopic(chatId, messageThreadId, [options])](#TelegramBot+reopenForumTopic) ⇒ Promise - * [.deleteForumTopic(chatId, messageThreadId, [options])](#TelegramBot+deleteForumTopic) ⇒ Promise - * [.unpinAllForumTopicMessages(chatId, messageThreadId, [options])](#TelegramBot+unpinAllForumTopicMessages) ⇒ Promise - * [.editGeneralForumTopic(chatId, name, [options])](#TelegramBot+editGeneralForumTopic) ⇒ Promise - * [.closeGeneralForumTopic(chatId, [options])](#TelegramBot+closeGeneralForumTopic) ⇒ Promise - * [.reopenGeneralForumTopic(chatId, [options])](#TelegramBot+reopenGeneralForumTopic) ⇒ Promise - * [.hideGeneralForumTopic(chatId, [options])](#TelegramBot+hideGeneralForumTopic) ⇒ Promise - * [.unhideGeneralForumTopic(chatId, [options])](#TelegramBot+unhideGeneralForumTopic) ⇒ Promise - * [.unpinAllGeneralForumTopicMessages(chatId, [options])](#TelegramBot+unpinAllGeneralForumTopicMessages) ⇒ Promise - * [.answerCallbackQuery(callbackQueryId, [options])](#TelegramBot+answerCallbackQuery) ⇒ Promise - * [.savePreparedInlineMessage(userId, result, [options])](#TelegramBot+savePreparedInlineMessage) ⇒ Promise - * [.getUserChatBoosts(chatId, userId, [options])](#TelegramBot+getUserChatBoosts) ⇒ Promise - * [.getBusinessConnection(businessConnectionId, [options])](#TelegramBot+getBusinessConnection) ⇒ Promise - * [.setMyCommands(commands, [options])](#TelegramBot+setMyCommands) ⇒ Promise - * [.deleteMyCommands([options])](#TelegramBot+deleteMyCommands) ⇒ Promise - * [.getMyCommands([options])](#TelegramBot+getMyCommands) ⇒ Promise - * [.setMyName([options])](#TelegramBot+setMyName) ⇒ Promise - * [.getMyName([options])](#TelegramBot+getMyName) ⇒ Promise - * [.setMyDescription([options])](#TelegramBot+setMyDescription) ⇒ Promise - * [.getMyDescription([options])](#TelegramBot+getMyDescription) ⇒ Promise - * [.setMyShortDescription([options])](#TelegramBot+setMyShortDescription) ⇒ Promise - * [.getMyShortDescription([options])](#TelegramBot+getMyShortDescription) ⇒ Promise - * [.setChatMenuButton([options])](#TelegramBot+setChatMenuButton) ⇒ Promise - * [.getChatMenuButton([options])](#TelegramBot+getChatMenuButton) ⇒ Promise - * [.setMyDefaultAdministratorRights([options])](#TelegramBot+setMyDefaultAdministratorRights) ⇒ Promise - * [.getMyDefaultAdministratorRights([options])](#TelegramBot+getMyDefaultAdministratorRights) ⇒ Promise - * [.editMessageText(text, [options])](#TelegramBot+editMessageText) ⇒ Promise - * [.editMessageCaption(caption, [options])](#TelegramBot+editMessageCaption) ⇒ Promise - * [.editMessageMedia(media, [options])](#TelegramBot+editMessageMedia) ⇒ Promise - * [.editMessageChecklist(businessConnectionId, chatId, messageId, checklist, [options])](#TelegramBot+editMessageChecklist) ⇒ Promise - * [.editMessageReplyMarkup(replyMarkup, [options])](#TelegramBot+editMessageReplyMarkup) ⇒ Promise - * [.stopPoll(chatId, pollId, [options])](#TelegramBot+stopPoll) ⇒ Promise - * [.sendSticker(chatId, sticker, [options], [fileOptions])](#TelegramBot+sendSticker) ⇒ Promise - * [.getStickerSet(name, [options])](#TelegramBot+getStickerSet) ⇒ Promise - * [.getCustomEmojiStickers(custom_emoji_ids, [options])](#TelegramBot+getCustomEmojiStickers) ⇒ Promise - * [.uploadStickerFile(userId, sticker, stickerFormat, [options], [fileOptions])](#TelegramBot+uploadStickerFile) ⇒ Promise - * [.createNewStickerSet(userId, name, title, pngSticker, emojis, [options], [fileOptions])](#TelegramBot+createNewStickerSet) ⇒ Promise - * [.addStickerToSet(userId, name, sticker, emojis, stickerType, [options], [fileOptions])](#TelegramBot+addStickerToSet) ⇒ Promise - * [.setStickerPositionInSet(sticker, position, [options])](#TelegramBot+setStickerPositionInSet) ⇒ Promise - * [.deleteStickerFromSet(sticker, [options])](#TelegramBot+deleteStickerFromSet) ⇒ Promise - * [.replaceStickerInSet(user_id, name, sticker, [options])](#TelegramBot+replaceStickerInSet) ⇒ Promise - * [.setStickerEmojiList(sticker, emojiList, [options])](#TelegramBot+setStickerEmojiList) ⇒ Promise - * [.setStickerKeywords(sticker, [options])](#TelegramBot+setStickerKeywords) ⇒ Promise - * [.setStickerMaskPosition(sticker, [options])](#TelegramBot+setStickerMaskPosition) ⇒ Promise - * [.setStickerSetTitle(name, title, [options])](#TelegramBot+setStickerSetTitle) ⇒ Promise - * [.setStickerSetThumbnail(userId, name, thumbnail, [options], [fileOptions])](#TelegramBot+setStickerSetThumbnail) ⇒ Promise - * [.setCustomEmojiStickerSetThumbnail(name, [options])](#TelegramBot+setCustomEmojiStickerSetThumbnail) ⇒ Promise - * [.deleteStickerSet(name, [options])](#TelegramBot+deleteStickerSet) ⇒ Promise - * [.answerInlineQuery(inlineQueryId, results, [options])](#TelegramBot+answerInlineQuery) ⇒ Promise - * [.answerWebAppQuery(webAppQueryId, result, [options])](#TelegramBot+answerWebAppQuery) ⇒ Promise - * [.sendInvoice(chatId, title, description, payload, providerToken, currency, prices, [options])](#TelegramBot+sendInvoice) ⇒ Promise - * [.createInvoiceLink(title, description, payload, providerToken, currency, prices, [options])](#TelegramBot+createInvoiceLink) ⇒ Promise - * [.answerShippingQuery(shippingQueryId, ok, [options])](#TelegramBot+answerShippingQuery) ⇒ Promise - * [.answerPreCheckoutQuery(preCheckoutQueryId, ok, [options])](#TelegramBot+answerPreCheckoutQuery) ⇒ Promise - * [.getMyStarBalance([options])](#TelegramBot+getMyStarBalance) ⇒ Promise - * [.getStarTransactions([options])](#TelegramBot+getStarTransactions) ⇒ Promise - * [.refundStarPayment(userId, telegramPaymentChargeId, [options])](#TelegramBot+refundStarPayment) ⇒ Promise - * [.editUserStarSubscription(userId, telegramPaymentChargeId, isCanceled, [options])](#TelegramBot+editUserStarSubscription) ⇒ Promise - * [.sendGame(chatId, gameShortName, [options])](#TelegramBot+sendGame) ⇒ Promise - * [.setGameScore(userId, score, [options])](#TelegramBot+setGameScore) ⇒ Promise - * [.getGameHighScores(userId, [options])](#TelegramBot+getGameHighScores) ⇒ Promise - * [.deleteMessage(chatId, messageId, [options])](#TelegramBot+deleteMessage) ⇒ Promise - * [.deleteMessages(chatId, messageIds, [options])](#TelegramBot+deleteMessages) ⇒ [ 'Promise' ].<Boolean> - * [.getAvailableGifts([options])](#TelegramBot+getAvailableGifts) ⇒ Promise - * [.sendGift(giftId, [options])](#TelegramBot+sendGift) ⇒ Promise - * [.giftPremiumSubscription(userId, monthCount, starCount, [options])](#TelegramBot+giftPremiumSubscription) ⇒ Promise - * [.verifyUser(userId, [options])](#TelegramBot+verifyUser) ⇒ Promise - * [.verifyChat(chatId, [options])](#TelegramBot+verifyChat) ⇒ Promise - * [.removeUserVerification(userId, [options])](#TelegramBot+removeUserVerification) ⇒ Promise - * [.removeChatVerification(chatId, [options])](#TelegramBot+removeChatVerification) ⇒ Promise - * [.readBusinessMessage(businessConnectionId, chatId, messageId, [options])](#TelegramBot+readBusinessMessage) ⇒ Promise - * [.deleteBusinessMessages(businessConnectionId, messageIds, [options])](#TelegramBot+deleteBusinessMessages) ⇒ Promise - * [.setBusinessAccountName(businessConnectionId, firstName, [options])](#TelegramBot+setBusinessAccountName) ⇒ Promise - * [.setBusinessAccountUsername(businessConnectionId, [options])](#TelegramBot+setBusinessAccountUsername) ⇒ Promise - * [.setBusinessAccountBio(businessConnectionId, [options])](#TelegramBot+setBusinessAccountBio) ⇒ Promise - * [.setBusinessAccountProfilePhoto(businessConnectionId, photo, [options])](#TelegramBot+setBusinessAccountProfilePhoto) ⇒ Promise - * [.removeBusinessAccountProfilePhoto(businessConnectionId, [options])](#TelegramBot+removeBusinessAccountProfilePhoto) ⇒ Promise - * [.setBusinessAccountGiftSettings(businessConnectionId, showGiftButton, acceptedGiftTypes, [options])](#TelegramBot+setBusinessAccountGiftSettings) ⇒ Promise - * [.getBusinessAccountStarBalance(businessConnectionId, [options])](#TelegramBot+getBusinessAccountStarBalance) ⇒ Promise - * [.transferBusinessAccountStars(businessConnectionId, starCount, [options])](#TelegramBot+transferBusinessAccountStars) ⇒ Promise - * [.getBusinessAccountGifts(businessConnectionId, [options])](#TelegramBot+getBusinessAccountGifts) ⇒ Promise - * [.convertGiftToStars(businessConnectionId, ownedGiftId, [options])](#TelegramBot+convertGiftToStars) ⇒ Promise - * [.upgradeGift(businessConnectionId, ownedGiftId, [options])](#TelegramBot+upgradeGift) ⇒ Promise - * [.transferGift(businessConnectionId, ownedGiftId, newOwnerChatId, [options])](#TelegramBot+transferGift) ⇒ Promise - * [.postStory(businessConnectionId, content, activePeriod, [options])](#TelegramBot+postStory) ⇒ Promise - * [.editStory(businessConnectionId, storyId, content, [options])](#TelegramBot+editStory) ⇒ Promise - * [.deleteStory(businessConnectionId, storyId, [options])](#TelegramBot+deleteStory) ⇒ Promise - * _static_ - * [.errors](#TelegramBot.errors) : Object - * [.messageTypes](#TelegramBot.messageTypes) : [ 'Array' ].<String> - - - -### new TelegramBot(token, [options]) -Both request method to obtain messages are implemented. To use standard polling, set `polling: true` -on `options`. Notice that [webHook](https://core.telegram.org/bots/api#setwebhook) will need a SSL certificate. -Emits `message` when a message arrives. - - -| Param | Type | Default | Description | -| --- | --- | --- | --- | -| token | String | | Bot Token | -| [options] | Object | | | -| [options.polling] | Boolean \| Object | false | Set true to enable polling or set options. If a WebHook has been set, it will be deleted automatically. | -| [options.polling.timeout] | String \| Number | 10 | *Deprecated. Use `options.polling.params` instead*. Timeout in seconds for long polling. | -| [options.testEnvironment] | Boolean | false | Set true to work with test enviroment. When working with the test environment, you may use HTTP links without TLS to test your Web App. | -| [options.polling.interval] | String \| Number | 300 | Interval between requests in miliseconds | -| [options.polling.autoStart] | Boolean | true | Start polling immediately | -| [options.polling.params] | Object | | Parameters to be used in polling API requests. See https://core.telegram.org/bots/api#getupdates for more information. | -| [options.polling.params.timeout] | Number | 10 | Timeout in seconds for long polling. | -| [options.webHook] | Boolean \| Object | false | Set true to enable WebHook or set options | -| [options.webHook.host] | String | "0.0.0.0" | Host to bind to | -| [options.webHook.port] | Number | 8443 | Port to bind to | -| [options.webHook.key] | String | | Path to file with PEM private key for webHook server. The file is read **synchronously**! | -| [options.webHook.cert] | String | | Path to file with PEM certificate (public) for webHook server. The file is read **synchronously**! | -| [options.webHook.pfx] | String | | Path to file with PFX private key and certificate chain for webHook server. The file is read **synchronously**! | -| [options.webHook.autoOpen] | Boolean | true | Open webHook immediately | -| [options.webHook.https] | Object | | Options to be passed to `https.createServer()`. Note that `options.webHook.key`, `options.webHook.cert` and `options.webHook.pfx`, if provided, will be used to override `key`, `cert` and `pfx` in this object, respectively. See https://nodejs.org/api/https.html#https_https_createserver_options_requestlistener for more information. | -| [options.webHook.healthEndpoint] | String | "/healthz" | An endpoint for health checks that always responds with 200 OK | -| [options.onlyFirstMatch] | Boolean | false | Set to true to stop after first match. Otherwise, all regexps are executed | -| [options.request] | Object | | Options which will be added for all requests to telegram api. See https://github.com/request/request#requestoptions-callback for more information. | -| [options.baseApiUrl] | String | "https://api.telegram.org" | API Base URl; useful for proxying and testing | -| [options.filepath] | Boolean | true | Allow passing file-paths as arguments when sending files, such as photos using `TelegramBot#sendPhoto()`. See [usage information][usage-sending-files-performance] for more information on this option and its consequences. | -| [options.badRejection] | Boolean | false | Set to `true` **if and only if** the Node.js version you're using terminates the process on unhandled rejections. This option is only for *forward-compatibility purposes*. | - - - -### telegramBot.on(event, listener) -Add listener for the specified [event](https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#events). -This is the usual `emitter.on()` method. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**See** - -- [Available events](https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#events) -- https://nodejs.org/api/events.html#events_emitter_on_eventname_listener - - -| Param | Type | -| --- | --- | -| event | String | -| listener | function | - - - -### telegramBot.startPolling([options]) ⇒ Promise -Start polling. -Rejects returned promise if a WebHook is being used by this instance. - -**Kind**: instance method of [TelegramBot](#TelegramBot) - -| Param | Type | Default | Description | -| --- | --- | --- | --- | -| [options] | Object | | | -| [options.restart] | Boolean | true | Consecutive calls to this method causes polling to be restarted | - - - -### ~~telegramBot.initPolling([options]) ⇒ Promise~~ -***Deprecated*** - -Alias of `TelegramBot#startPolling()`. This is **deprecated**. - -**Kind**: instance method of [TelegramBot](#TelegramBot) - -| Param | Type | -| --- | --- | -| [options] | Object | - - - -### telegramBot.stopPolling([options]) ⇒ Promise -Stops polling after the last polling request resolves. -Multiple invocations do nothing if polling is already stopped. -Returning the promise of the last polling request is **deprecated**. - -**Kind**: instance method of [TelegramBot](#TelegramBot) - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Options | -| [options.cancel] | Boolean | Cancel current request | -| [options.reason] | String | Reason for stopping polling | - - - -### telegramBot.getFileLink(fileId, [options]) ⇒ Promise -Get link for file. -Use this method to get link for file for subsequent use. -Attention: link will be valid for 1 hour. - -This method is a sugar extension of the (getFile)[#getfilefileid] method, -which returns just path to file on remote server (you will have to manually build full uri after that). - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Promise which will have *fileURI* in resolve callback -**See**: https://core.telegram.org/bots/api#getfile - -| Param | Type | Description | -| --- | --- | --- | -| fileId | String | File identifier to get info about | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getFileStream(fileId, [options]) ⇒ stream.Readable -Return a readable stream for file. - -`fileStream.path` is the specified file ID i.e. `fileId`. -`fileStream` emits event `info` passing a single argument i.e. -`info` with the interface `{ uri }` where `uri` is the URI of the -file on Telegram servers. - -This method is a sugar extension of the [getFileLink](#TelegramBot+getFileLink) method, -which returns the full URI to the file on remote server. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: stream.Readable - fileStream - -| Param | Type | Description | -| --- | --- | --- | -| fileId | String | File identifier to get info about | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.downloadFile(fileId, downloadDir, [options]) ⇒ Promise -Downloads file in the specified folder. - -This method is a sugar extension of the [getFileStream](#TelegramBot+getFileStream) method, -which returns a readable file stream. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Promise, which will have *filePath* of downloaded file in resolve callback - -| Param | Type | Description | -| --- | --- | --- | -| fileId | String | File identifier to get info about | -| downloadDir | String | Absolute path to the folder in which file will be saved | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.onText(regexpRexecuted, callback) -Register a RegExp to test against an incomming text message. - -**Kind**: instance method of [TelegramBot](#TelegramBot) - -| Param | Type | Description | -| --- | --- | --- | -| regexpRexecuted | RegExp | with `exec`. | -| callback | function | Callback will be called with 2 parameters, the `msg` and the result of executing `regexp.exec` on message text. | - - - -### telegramBot.removeTextListener(regexp) ⇒ Object -Remove a listener registered with `onText()`. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Object - deletedListener The removed reply listener if - found. This object has `regexp` and `callback` - properties. If not found, returns `null`. - -| Param | Type | Description | -| --- | --- | --- | -| regexp | RegExp | RegExp used previously in `onText()` | - - - -### telegramBot.clearTextListeners() -Remove all listeners registered with `onText()`. - -**Kind**: instance method of [TelegramBot](#TelegramBot) - - -### telegramBot.onReplyToMessage(chatId, messageId, callback) ⇒ Number -Register a reply to wait for a message response. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Number - id The ID of the inserted reply listener. - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | The chat id where the message cames from. | -| messageId | Number \| String | The message id to be replied. | -| callback | function | Callback will be called with the reply message. | - - - -### telegramBot.removeReplyListener(replyListenerId) ⇒ Object -Removes a reply that has been prev. registered for a message response. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Object - deletedListener The removed reply listener if - found. This object has `id`, `chatId`, `messageId` and `callback` - properties. If not found, returns `null`. - -| Param | Type | Description | -| --- | --- | --- | -| replyListenerId | Number | The ID of the reply listener. | - - - -### telegramBot.clearReplyListeners() ⇒ Array -Removes all replies that have been prev. registered for a message response. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Array - deletedListeners An array of removed listeners. - - -### telegramBot.isPolling() ⇒ Boolean -Return true if polling. Otherwise, false. - -**Kind**: instance method of [TelegramBot](#TelegramBot) - - -### telegramBot.openWebHook() ⇒ Promise -Open webhook. -Multiple invocations do nothing if webhook is already open. -Rejects returned promise if Polling is being used by this instance. - -**Kind**: instance method of [TelegramBot](#TelegramBot) - - -### telegramBot.closeWebHook() ⇒ Promise -Close webhook after closing all current connections. -Multiple invocations do nothing if webhook is already closed. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Promise - - -### telegramBot.hasOpenWebHook() ⇒ Boolean -Return true if using webhook and it is open i.e. accepts connections. -Otherwise, false. - -**Kind**: instance method of [TelegramBot](#TelegramBot) - - -### telegramBot.processUpdate(update) -Process an update; emitting the proper events and executing regexp -callbacks. This method is useful should you be using a different -way to fetch updates, other than those provided by TelegramBot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**See**: https://core.telegram.org/bots/api#update - -| Param | Type | -| --- | --- | -| update | Object | - - - -### telegramBot.getUpdates([options]) ⇒ Promise -Use this method to receive incoming updates using long polling. -This method has an [older, compatible signature][getUpdates-v0.25.0] -that is being deprecated. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**See**: https://core.telegram.org/bots/api#getupdates - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setWebHook(url, [options], [fileOptions]) ⇒ Promise -Specify an url to receive incoming updates via an outgoing webHook. -This method has an [older, compatible signature][setWebHook-v0.25.0] -that is being deprecated. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**See** - -- https://core.telegram.org/bots/api#setwebhook -- https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - - -| Param | Type | Description | -| --- | --- | --- | -| url | String | URL where Telegram will make HTTP Post. Leave empty to delete webHook. | -| [options] | Object | Additional Telegram query options | -| [options.certificate] | String \| stream.Stream | PEM certificate key (public). | -| [options.secret_token] | String | Optional secret token to be sent in a header `X-Telegram-Bot-Api-Secret-Token` in every webhook request. | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.deleteWebHook([options]) ⇒ Promise -Use this method to remove webhook integration if you decide to -switch back to getUpdates. Returns True on success. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**See**: https://core.telegram.org/bots/api#deletewebhook - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getWebHookInfo([options]) ⇒ Promise -Use this method to get current webhook status. -On success, returns a [WebhookInfo](https://core.telegram.org/bots/api#webhookinfo) object. -If the bot is using getUpdates, will return an object with the -url field empty. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**See**: https://core.telegram.org/bots/api#getwebhookinfo - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getMe([options]) ⇒ Promise -A simple method for testing your bot's authentication token. Requires no parameters. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - basic information about the bot in form of a [User](https://core.telegram.org/bots/api#user) object. -**See**: https://core.telegram.org/bots/api#getme - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.logOut([options]) ⇒ Promise -This method log out your bot from the cloud Bot API server before launching the bot locally. -You must log out the bot before running it locally, otherwise there is no guarantee that the bot will receive updates. -After a successful call, you will not be able to log in again using the same token for 10 minutes. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#logout - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.close([options]) ⇒ Promise -This method close the bot instance before moving it from one local server to another. -This method will return error 429 in the first 10 minutes after the bot is launched. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#close - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendMessage(chatId, text, [options]) ⇒ Promise -Send text message. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See**: https://core.telegram.org/bots/api#sendmessage - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| text | String | Text of the message to be sent | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.forwardMessage(chatId, fromChatId, messageId, [options]) ⇒ Promise -Forward messages of any kind. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**See**: https://core.telegram.org/bots/api#forwardmessage - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) or username of the target channel (in the format `@channelusername`) | -| fromChatId | Number \| String | Unique identifier for the chat where the original message was sent (or channel username in the format `@channelusername`) | -| messageId | Number \| String | Unique message identifier in the chat specified in fromChatId | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.forwardMessages(chatId, fromChatId, messageIds, [options]) ⇒ Promise -Use this method to forward multiple messages of any kind. -If some of the specified messages can't be found or forwarded, they are skipped. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - An array of MessageId of the sent messages on success -**See**: https://core.telegram.org/bots/api#forwardmessages - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) or username of the target channel (in the format `@channelusername`) | -| fromChatId | Number \| String | Unique identifier for the chat where the original message was sent (or channel username in the format `@channelusername`) | -| messageIds | [ 'Array' ].<(Number\|String)> | Identifiers of 1-100 messages in the chat from_chat_id to forward. The identifiers must be specified in a strictly increasing order. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.copyMessage(chatId, fromChatId, messageId, [options]) ⇒ Promise -Copy messages of any kind. **Service messages and invoice messages can't be copied.** -The method is analogous to the method forwardMessages, but the copied message doesn't -have a link to the original message. -Returns the MessageId of the sent message on success. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - The [MessageId](https://core.telegram.org/bots/api#messageid) of the sent message on success -**See**: https://core.telegram.org/bots/api#copymessage - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| fromChatId | Number \| String | Unique identifier for the chat where the original message was sent | -| messageId | Number \| String | Unique message identifier | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.copyMessages(chatId, fromChatId, messageIds, [options]) ⇒ Promise -Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. -Service messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. -Returns the MessageId of the sent message on success. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - An array of MessageId of the sent messages -**See**: https://core.telegram.org/bots/api#copymessages - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat | -| fromChatId | Number \| String | Unique identifier for the chat where the original message was sent | -| messageIds | Array | Identifiers of 1-100 messages in the chat from_chat_id to copy. The identifiers must be specified in a strictly increasing order. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendPhoto(chatId, photo, [options], [fileOptions]) ⇒ Promise -Send photo - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See** - -- https://core.telegram.org/bots/api#sendphoto -- https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| photo | String \| stream.Stream \| Buffer | A file path or a Stream. Can also be a `file_id` previously uploaded | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.sendAudio(chatId, audio, [options], [fileOptions]) ⇒ Promise -Send audio - -**Your audio must be in the .MP3 or .M4A format.** - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See** - -- https://core.telegram.org/bots/api#sendaudio -- https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| audio | String \| stream.Stream \| Buffer | A file path, Stream or Buffer. Can also be a `file_id` previously uploaded. | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.sendDocument(chatId, doc, [options], [fileOptions]) ⇒ Promise -Send Document - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See** - -- https://core.telegram.org/bots/api#sendDocument -- https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| doc | String \| stream.Stream \| Buffer | A file path, Stream or Buffer. Can also be a `file_id` previously uploaded. | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.sendVideo(chatId, video, [options], [fileOptions]) ⇒ Promise -Use this method to send video files, **Telegram clients support mp4 videos** (other formats may be sent as Document). - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See** - -- https://core.telegram.org/bots/api#sendvideo -- https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| video | String \| stream.Stream \| Buffer | A file path or Stream. Can also be a `file_id` previously uploaded. | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.sendAnimation(chatId, animation, [options], [fileOptions]) ⇒ Promise -Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See** - -- https://core.telegram.org/bots/api#sendanimation -- https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| animation | String \| stream.Stream \| Buffer | A file path, Stream or Buffer. Can also be a `file_id` previously uploaded. | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.sendVoice(chatId, voice, [options], [fileOptions]) ⇒ Promise -Send voice - -**Your audio must be in an .OGG file encoded with OPUS**, or in .MP3 format, or in .M4A format (other formats may be sent as Audio or Document) - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See** - -- https://core.telegram.org/bots/api#sendvoice -- https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| voice | String \| stream.Stream \| Buffer | A file path, Stream or Buffer. Can also be a `file_id` previously uploaded. | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.sendVideoNote(chatId, videoNote, [options], [fileOptions]) ⇒ Promise -Use this method to send video messages -Telegram clients support **rounded square MPEG4 videos** of up to 1 minute long. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**Info**: The length parameter is actually optional. However, the API (at time of writing) requires you to always provide it until it is fixed. -**See** - -- https://core.telegram.org/bots/api#sendvideonote -- https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| videoNote | String \| stream.Stream \| Buffer | A file path or Stream. Can also be a `file_id` previously uploaded. | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.sendPaidMedia(chatId, starCount, media, [options]) ⇒ Promise -Use this method to send paid media. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See**: https://core.telegram.org/bots/api#sendpaidmedia - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| starCount | Number | The number of Telegram Stars that must be paid to buy access to the media; 1-10000 | -| media | Array | Array of [InputPaidMedia](https://core.telegram.org/bots/api#inputpaidmedia). The media property can bea String, Stream or Buffer. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendMediaGroup(chatId, media, [options]) ⇒ Promise -Use this method to send a group of photos or videos as an album. - -**Documents and audio files can be only grouped in an album with messages of the same type** - -If you wish to [specify file options](https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files), -add a `fileOptions` property to the target input in `media`. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, an array of the sent [Messages](https://core.telegram.org/bots/api#message) -is returned. -**See** - -- https://core.telegram.org/bots/api#sendmediagroup -- https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - - -| Param | Type | Description | -| --- | --- | --- | -| chatId | String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| media | Array | A JSON-serialized array describing photos and videos to be sent, must include 2–10 items | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendLocation(chatId, latitude, longitude, [options]) ⇒ Promise -Send location. -Use this method to send point on the map. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See**: https://core.telegram.org/bots/api#sendlocation - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| latitude | Float | Latitude of location | -| longitude | Float | Longitude of location | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.editMessageLiveLocation(latitude, longitude, [options]) ⇒ Promise -Use this method to edit live location messages sent by -the bot or via the bot (for inline bots). - - A location **can be edited until its live_period expires or editing is explicitly disabled by a call to [stopMessageLiveLocation](https://core.telegram.org/bots/api#stopmessagelivelocation)** - -Note that you must provide one of chat_id, message_id, or -inline_message_id in your request. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned. -**See**: https://core.telegram.org/bots/api#editmessagelivelocation - -| Param | Type | Description | -| --- | --- | --- | -| latitude | Float | Latitude of location | -| longitude | Float | Longitude of location | -| [options] | Object | Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) | - - - -### telegramBot.stopMessageLiveLocation([options]) ⇒ Promise -Use this method to stop updating a live location message sent by -the bot or via the bot (for inline bots) before live_period expires. - -Note that you must provide one of chat_id, message_id, or -inline_message_id in your request. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned. -**See**: https://core.telegram.org/bots/api#stopmessagelivelocation - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) | - - - -### telegramBot.sendVenue(chatId, latitude, longitude, title, address, [options]) ⇒ Promise -Send venue. -Use this method to send information about a venue. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned. -**See**: https://core.telegram.org/bots/api#sendvenue - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| latitude | Float | Latitude of location | -| longitude | Float | Longitude of location | -| title | String | Name of the venue | -| address | String | Address of the venue | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendContact(chatId, phoneNumber, firstName, [options]) ⇒ Promise -Send contact. -Use this method to send phone contacts. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See**: https://core.telegram.org/bots/api#sendcontact - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| phoneNumber | String | Contact's phone number | -| firstName | String | Contact's first name | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendPoll(chatId, question, pollOptions, [options]) ⇒ Promise -Send poll. -Use this method to send a native poll. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See**: https://core.telegram.org/bots/api#sendpoll - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the group/channel | -| question | String | Poll question, 1-300 characters | -| pollOptions | Array | Poll options, between 2-10 options (only 1-100 characters each) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendChecklist(businessConnectionId, chatId, checklist, [options]) ⇒ Promise -Send sendChecklist. -Use this method to send a checklist on behalf of a connected business account. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See**: https://core.telegram.org/bots/api#sendchecklist - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | Number \| String | Unique identifier for the business connection | -| chatId | Number \| String | Unique identifier for the group/channel | -| checklist | Object | A JSON-serialized object for the checklist to send | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendDice(chatId, [options]) ⇒ Promise -Send Dice -Use this method to send an animated emoji that will display a random value. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned -**See**: https://core.telegram.org/bots/api#senddice - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendChatAction(chatId, action, [options]) ⇒ Promise -Send chat action. - -Use this method when you need to tell the user that something is happening on the bot's side. -**The status is set for 5 seconds or less** (when a message arrives from your bot, Telegram clients clear its typing status). - - Action `typing` for [text messages](https://core.telegram.org/bots/api#sendmessage), -`upload_photo` for [photos](https://core.telegram.org/bots/api#sendphoto), `record_video` or `upload_video` for [videos](https://core.telegram.org/bots/api#sendvideo), -`record_voice` or `upload_voice` for [voice notes](https://core.telegram.org/bots/api#sendvoice), `upload_document` for [general files](https://core.telegram.org/bots/api#senddocument), -`choose_sticker` for [stickers](https://core.telegram.org/bots/api#sendsticker), `find_location` for [location data](https://core.telegram.org/bots/api#sendlocation), -`record_video_note` or `upload_video_note` for [video notes](https://core.telegram.org/bots/api#sendvideonote). - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#sendchataction - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| action | String | Type of action to broadcast. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setMessageReaction(chatId, messageId, [options]) ⇒ [ 'Promise' ].<Boolean> -Use this method to change the chosen reactions on a message. -- Service messages can't be reacted to. -- Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. -- In albums, bots must react to the first message. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: [ 'Promise' ].<Boolean> - True on success -**See**: https://core.telegram.org/bots/api#setmessagereaction - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format @channelusername) | -| messageId | Number | Unique identifier of the target message | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getUserProfilePhotos(userId, [options]) ⇒ Promise -Use this method to get a list of profile pictures for a user. -Returns a [UserProfilePhotos](https://core.telegram.org/bots/api#userprofilephotos) object. -This method has an [older, compatible signature][getUserProfilePhotos-v0.25.0] -that is being deprecated. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Returns a [UserProfilePhotos](https://core.telegram.org/bots/api#userprofilephotos) object -**See**: https://core.telegram.org/bots/api#getuserprofilephotos - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setUserEmojiStatus(userId, [options]) ⇒ Promise -Changes the emoji status for a given user that previously allowed the bot to manage their emoji status -via the Mini App method [requestEmojiStatusAccess](https://core.telegram.org/bots/webapps#initializing-mini-apps). - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setuseremojistatus - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getFile(fileId, [options]) ⇒ Promise -Get file. -Use this method to get basic info about a file and prepare it for downloading. - -Attention: **link will be valid for 1 hour.** - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, a [File](https://core.telegram.org/bots/api#file) object is returned -**See**: https://core.telegram.org/bots/api#getfile - -| Param | Type | Description | -| --- | --- | --- | -| fileId | String | File identifier to get info about | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.banChatMember(chatId, userId, [options]) ⇒ Promise -Use this method to ban a user in a group, a supergroup or a channel. -In the case of supergroups and channels, the user will not be able to -return to the chat on their own using invite links, etc., unless unbanned first.. - -The **bot must be an administrator in the group, supergroup or a channel** for this to work. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success. -**See**: https://core.telegram.org/bots/api#banchatmember - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.unbanChatMember(chatId, userId, [options]) ⇒ Promise -Use this method to unban a previously kicked user in a supergroup. -The user will not return to the group automatically, but will be -able to join via link, etc. - -The **bot must be an administrator** in the supergroup or channel for this to work. - -**By default**, this method guarantees that after the call the user is not a member of the chat, but will be able to join it. -So **if the user is a member of the chat they will also be removed from the chat**. If you don't want this, use the parameter *only_if_banned* - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#unbanchatmember - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.restrictChatMember(chatId, userId, [options]) ⇒ Promise -Use this method to restrict a user in a supergroup. -The bot **must be an administrator in the supergroup** for this to work -and must have the appropriate admin rights. Pass True for all boolean parameters -to lift restrictions from a user. Returns True on success. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#restrictchatmember - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.promoteChatMember(chatId, userId, [options]) ⇒ Promise -Use this method to promote or demote a user in a supergroup or a channel. -The bot **must be an administrator** in the chat for this to work -and must have the appropriate admin rights. Pass False for all boolean parameters to demote a user. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success. -**See**: https://core.telegram.org/bots/api#promotechatmember - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| userId | Number | | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setChatAdministratorCustomTitle(chatId, userId, customTitle, [options]) ⇒ Promise -Use this method to set a custom title for an administrator in a supergroup promoted by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setchatadministratorcustomtitle - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| userId | Number | Unique identifier of the target user | -| customTitle | String | New custom title for the administrator; 0-16 characters, emoji are not allowed | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.banChatSenderChat(chatId, senderChatId, [options]) ⇒ Promise -Use this method to ban a channel chat in a supergroup or a channel. - -Until the chat is [unbanned](https://core.telegram.org/bots/api#unbanchatsenderchat), the owner of the banned chat won't be able to send messages on behalf of any of their channels. -The bot **must be an administrator in the supergroup or channel** for this to work and must have the appropriate administrator rights - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success. -**See**: https://core.telegram.org/bots/api#banchatsenderchat - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| senderChatId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.unbanChatSenderChat(chatId, senderChatId, [options]) ⇒ Promise -Use this method to unban a previously banned channel chat in a supergroup or channel. - -The bot **must be an administrator** for this to work and must have the appropriate administrator rights. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#unbanchatsenderchat - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| senderChatId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setChatPermissions(chatId, chatPermissions, [options]) ⇒ Promise -Use this method to set default chat permissions for all members. - -The bot **must be an administrator in the group or a supergroup** for this to -work and **must have the `can_restrict_members` admin rights.** - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setchatpermissions - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| chatPermissions | Array | New default chat permissions | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.exportChatInviteLink(chatId, [options]) ⇒ Promise -Use this method to generate a new primary invite link for a chat. **Any previously generated primary link is revoked**. - -The bot **must be an administrator in the chat** for this to work and must have the appropriate administrator rights. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Exported invite link as String on success. -**See**: https://core.telegram.org/bots/api#exportchatinvitelink - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.createChatInviteLink(chatId, [options]) ⇒ Object -Use this method to create an additional invite link for a chat. - -The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - -The link generated with this method can be revoked using the method [revokeChatInviteLink](https://core.telegram.org/bots/api#revokechatinvitelink) - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Object - The new invite link as [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object -**See**: https://core.telegram.org/bots/api#createchatinvitelink - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.editChatInviteLink(chatId, inviteLink, [options]) ⇒ Promise -Use this method to edit a non-primary invite link created by the bot. - -The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - The edited invite link as a [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object -**See**: https://core.telegram.org/bots/api#editchatinvitelink - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| inviteLink | String | Text with the invite link to edit | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.createChatSubscriptionInviteLink(chatId, subscriptionPeriod, subscriptionPrice, [options]) ⇒ Promise -Use this method to create a subscription invite link for a channel chat. - -The bot must have the can_invite_users administrator rights - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - The new invite link as a [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object -**See**: https://core.telegram.org/bots/api#createchatsubscriptioninvitelink - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| subscriptionPeriod | Number | The number of seconds the subscription will be active for before the next payment. Currently, it must always be 2592000 (30 days) | -| subscriptionPrice | Number | The amount of Telegram Stars a user must pay initially and after each subsequent subscription period to be a member of the chat (1-2500) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.editChatSubscriptionInviteLink(chatId, inviteLink, [options]) ⇒ Promise -Use this method to edit a subscription invite link created by the bot. - -The bot must have the can_invite_users administrator rights - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - The new invite link as a [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object -**See**: https://core.telegram.org/bots/api#editchatsubscriptioninvitelink - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| inviteLink | String | The invite link to edit | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.revokeChatInviteLink(chatId, inviteLink, [options]) ⇒ Promise -Use this method to revoke an invite link created by the bot. -Note: If the primary link is revoked, a new link is automatically generated - -The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - The revoked invite link as [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object -**See**: https://core.telegram.org/bots/api#revokechatinvitelink - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| inviteLink | String | The invite link to revoke | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.approveChatJoinRequest(chatId, userId, [options]) ⇒ Promise -Use this method to approve a chat join request. - -The bot **must be an administrator in the chat** for this to work and **must have the `can_invite_users` administrator right.** - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#approvechatjoinrequest - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.declineChatJoinRequest(chatId, userId, [options]) ⇒ Promise -Use this method to decline a chat join request. - -The bot **must be an administrator in the chat** for this to work and **must have the `can_invite_users` administrator right**. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#declinechatjoinrequest - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setChatPhoto(chatId, photo, [options], [fileOptions]) ⇒ Promise -Use this method to set a new profile photo for the chat. **Photos can't be changed for private chats**. - -The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setchatphoto - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| photo | stream.Stream \| Buffer | A file path or a Stream. | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.deleteChatPhoto(chatId, [options]) ⇒ Promise -Use this method to delete a chat photo. **Photos can't be changed for private chats**. - -The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#deletechatphoto - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setChatTitle(chatId, title, [options]) ⇒ Promise -Use this method to change the title of a chat. **Titles can't be changed for private chats**. - -The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setchattitle - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| title | String | New chat title, 1-255 characters | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setChatDescription(chatId, description, [options]) ⇒ Promise -Use this method to change the description of a group, a supergroup or a channel. - -The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setchatdescription - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| description | String | New chat title, 0-255 characters | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.pinChatMessage(chatId, messageId, [options]) ⇒ Promise -Use this method to pin a message in a supergroup. - -If the chat is not a private chat, the **bot must be an administrator in the chat** for this to work and must have the `can_pin_messages` administrator -right in a supergroup or `can_edit_messages` administrator right in a channel. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#pinchatmessage - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| messageId | Number | Identifier of a message to pin | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.unpinChatMessage(chatId, [options]) ⇒ Promise -Use this method to remove a message from the list of pinned messages in a chat - -If the chat is not a private chat, the **bot must be an administrator in the chat** for this to work and must have the `can_pin_messages` administrator -right in a supergroup or `can_edit_messages` administrator right in a channel. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#unpinchatmessage - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.unpinAllChatMessages(chatId, [options]) ⇒ Promise -Use this method to clear the list of pinned messages in a chat. - -If the chat is not a private chat, the **bot must be an administrator in the chat** for this to work and must have the `can_pin_messages` administrator -right in a supergroup or `can_edit_messages` administrator right in a channel. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#unpinallchatmessages - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.leaveChat(chatId, [options]) ⇒ Promise -Use this method for your bot to leave a group, supergroup or channel - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#leavechat - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getChat(chatId, [options]) ⇒ Promise -Use this method to get up to date information about the chat -(current name of the user for one-on-one conversations, current -username of a user, group or channel, etc.). - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - [ChatFullInfo](https://core.telegram.org/bots/api#chatfullinfo) object on success -**See**: https://core.telegram.org/bots/api#getchat - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) or channel | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getChatAdministrators(chatId, [options]) ⇒ Promise -Use this method to get a list of administrators in a chat - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns an Array of [ChatMember](https://core.telegram.org/bots/api#chatmember) objects that contains information about all chat administrators except other bots. -If the chat is a group or a supergroup and no administrators were appointed, only the creator will be returned -**See**: https://core.telegram.org/bots/api#getchatadministrators - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getChatMemberCount(chatId, [options]) ⇒ Promise -Use this method to get the number of members in a chat. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Int on success -**See**: https://core.telegram.org/bots/api#getchatmembercount - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getChatMember(chatId, userId, [options]) ⇒ Promise -Use this method to get information about a member of a chat. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - [ChatMember](https://core.telegram.org/bots/api#chatmember) object on success -**See**: https://core.telegram.org/bots/api#getchatmember - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setChatStickerSet(chatId, stickerSetName, [options]) ⇒ Promise -Use this method to set a new group sticker set for a supergroup. - -The bot **must be an administrator in the chat** for this to work and must have the appropriate administrator rights. - -**Note:** Use the field `can_set_sticker_set` optionally returned in [getChat](https://core.telegram.org/bots/api#getchat) requests to check if the bot can use this method. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setchatstickerset - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| stickerSetName | String | Name of the sticker set to be set as the group sticker set | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.deleteChatStickerSet(chatId, [options]) ⇒ Promise -Use this method to delete a group sticker set from a supergroup. - -Use the field `can_set_sticker_set` optionally returned in [getChat](https://core.telegram.org/bots/api#getchat) requests to check if the bot can use this method. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#deletechatstickerset - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getForumTopicIconStickers(chatId, [options]) ⇒ Promise -Use this method to get custom emoji stickers, which can be used as a forum topic icon by any user. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Array of [Sticker](https://core.telegram.org/bots/api#sticker) objects -**See**: https://core.telegram.org/bots/api#getforumtopiciconstickers - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.createForumTopic(chatId, name, [options]) -Use this method to create a topic in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. - -Returns information about the created topic as a [ForumTopic](https://core.telegram.org/bots/api#forumtopic) object. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**See**: https://core.telegram.org/bots/api#createforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| name | String | Topic name, 1-128 characters | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.editForumTopic(chatId, messageThreadId, [options]) ⇒ Promise -Use this method to edit name and icon of a topic in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have can_manage_topics administrator rights, unless it is the creator of the topic. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#editforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| messageThreadId | Number | Unique identifier for the target message thread of the forum topic | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.closeForumTopic(chatId, messageThreadId, [options]) ⇒ Promise -Use this method to close an open topic in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights, unless it is the creator of the topic. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#closeforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| messageThreadId | Number | Unique identifier for the target message thread of the forum topic | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.reopenForumTopic(chatId, messageThreadId, [options]) ⇒ Promise -Use this method to reopen a closed topic in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights, unless it is the creator of the topic. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#reopenforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| messageThreadId | Number | Unique identifier for the target message thread of the forum topic | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.deleteForumTopic(chatId, messageThreadId, [options]) ⇒ Promise -Use this method to delete a forum topic along with all its messages in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have the can_delete_messages administrator rights. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#deleteforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| messageThreadId | Number | Unique identifier for the target message thread of the forum topic | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.unpinAllForumTopicMessages(chatId, messageThreadId, [options]) ⇒ Promise -Use this method to clear the list of pinned messages in a forum topic. -The bot must be an administrator in the chat for this to work and must have the can_pin_messages administrator right in the supergroup. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#unpinallforumtopicmessages - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| messageThreadId | Number | Unique identifier for the target message thread of the forum topic | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.editGeneralForumTopic(chatId, name, [options]) ⇒ Promise -Use this method to edit the name of the 'General' topic in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. -The topic will be automatically unhidden if it was hidden. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#editgeneralforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| name | String | New topic name, 1-128 characters | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.closeGeneralForumTopic(chatId, [options]) ⇒ Promise -Use this method to close an open 'General' topic in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. -The topic will be automatically unhidden if it was hidden. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#closegeneralforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.reopenGeneralForumTopic(chatId, [options]) ⇒ Promise -Use this method to reopen a closed 'General' topic in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. -The topic will be automatically unhidden if it was hidden. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#reopengeneralforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.hideGeneralForumTopic(chatId, [options]) ⇒ Promise -Use this method to hide the 'General' topic in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. -The topic will be automatically closed if it was open. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#hidegeneralforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.unhideGeneralForumTopic(chatId, [options]) ⇒ Promise -Use this method to unhide the 'General' topic in a forum supergroup chat. -The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#unhidegeneralforumtopic - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.unpinAllGeneralForumTopicMessages(chatId, [options]) ⇒ Promise -Use this method to clear the list of pinned messages in a General forum topic. -The bot must be an administrator in the chat for this to work and must have the can_pin_messages administrator right in the supergroup. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#unpinallgeneralforumtopicmessages - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.answerCallbackQuery(callbackQueryId, [options]) ⇒ Promise -Use this method to send answers to callback queries sent from -[inline keyboards](https://core.telegram.org/bots#inline-keyboards-and-on-the-fly-updating). - -The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. - -This method has **older, compatible signatures ([1][answerCallbackQuery-v0.27.1])([2][answerCallbackQuery-v0.29.0])** -that are being deprecated. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#answercallbackquery - -| Param | Type | Description | -| --- | --- | --- | -| callbackQueryId | String | Unique identifier for the query to be answered | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.savePreparedInlineMessage(userId, result, [options]) ⇒ Promise -Use this method to stores a message that can be sent by a user of a Mini App. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns a [PreparedInlineMessage](https://core.telegram.org/bots/api#preparedinlinemessage) object. -**See**: https://core.telegram.org/bots/api#savepreparedinlinemessage - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the target user | -| result | InlineQueryResult | object that represents one result of an inline query | -| [options] | Object | Optional form data to include in the request | - - - -### telegramBot.getUserChatBoosts(chatId, userId, [options]) ⇒ Promise -Use this method to get the list of boosts added to a chat by a use. -Requires administrator rights in the chat - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns a [UserChatBoosts](https://core.telegram.org/bots/api#userchatboosts) object -**See**: https://core.telegram.org/bots/api#getuserchatboosts - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the group/channel | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getBusinessConnection(businessConnectionId, [options]) ⇒ Promise -Use this method to get information about the connection of the bot with a business account - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns [BusinessConnection](https://core.telegram.org/bots/api#businessconnection) object -**See**: https://core.telegram.org/bots/api#getbusinessconnection - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | Number \| String | Unique identifier for the group/channel | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setMyCommands(commands, [options]) ⇒ Promise -Use this method to change the list of the bot's commands. - -See https://core.telegram.org/bots#commands for more details about bot commands - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setmycommands - -| Param | Type | Description | -| --- | --- | --- | -| commands | Array | List of bot commands to be set as the list of the [bot's commands](https://core.telegram.org/bots/api#botcommand). At most 100 commands can be specified. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.deleteMyCommands([options]) ⇒ Promise -Use this method to delete the list of the bot's commands for the given scope and user language. - - After deletion, [higher level commands](https://core.telegram.org/bots/api#determining-list-of-commands) will be shown to affected users. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#deletemycommands - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getMyCommands([options]) ⇒ Promise -Use this method to get the current list of the bot's commands for the given scope and user language. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Array of [BotCommand](https://core.telegram.org/bots/api#botcommand) on success. If commands aren't set, an empty list is returned. -**See**: https://core.telegram.org/bots/api#getmycommands - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setMyName([options]) ⇒ Promise -Use this method to change the bot's name. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setmyname - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getMyName([options]) ⇒ Promise -Use this method to get the current bot name for the given user language. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - [BotName](https://core.telegram.org/bots/api#botname) on success -**See**: https://core.telegram.org/bots/api#getmyname - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setMyDescription([options]) ⇒ Promise -Use this method to change the bot's description, which is shown in the chat with the bot if the chat is empty. - -Returns True on success. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setmydescription - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getMyDescription([options]) ⇒ Promise -Use this method to get the current bot description for the given user language. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Returns [BotDescription](https://core.telegram.org/bots/api#botdescription) on success. -**See**: https://core.telegram.org/bots/api#getmydescription - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setMyShortDescription([options]) ⇒ Promise -Use this method to change the bot's short description, which is shown on the bot's profile page -and is sent together with the link when users share the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Returns True on success. -**See**: https://core.telegram.org/bots/api#setmyshortdescription - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getMyShortDescription([options]) ⇒ Promise -Use this method to get the current bot short description for the given user language. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Returns [BotShortDescription](https://core.telegram.org/bots/api#botshortdescription) on success. -**See**: https://core.telegram.org/bots/api#getmyshortdescription - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setChatMenuButton([options]) ⇒ Promise -Use this method to change the bot's menu button in a private chat, or the default menu button. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setchatmenubutton - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getChatMenuButton([options]) ⇒ Promise -Use this method to get the current value of the bot's menu button in a private chat, or the default menu button. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - [MenuButton](https://core.telegram.org/bots/api#menubutton) on success -**See**: https://core.telegram.org/bots/api#getchatmenubutton - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setMyDefaultAdministratorRights([options]) ⇒ Promise -Use this method to change the default administrator rights requested by the bot when it's added as an administrator to groups or channels. - -These rights will be suggested to users, but they are are free to modify the list before adding the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#getchatmenubutton - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getMyDefaultAdministratorRights([options]) ⇒ Promise -Use this method to get the current default administrator rights of the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - [ChatAdministratorRights](https://core.telegram.org/bots/api#chatadministratorrights) on success -**See**: https://core.telegram.org/bots/api#getmydefaultadministratorrights - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.editMessageText(text, [options]) ⇒ Promise -Use this method to edit text or [game](https://core.telegram.org/bots/api#games) messages sent by the bot or via the bot (for inline bots). - -Note: that **you must provide one of chat_id, message_id, or inline_message_id** in your request. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned -**See**: https://core.telegram.org/bots/api#editmessagetext - -| Param | Type | Description | -| --- | --- | --- | -| text | String | New text of the message | -| [options] | Object | Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) | - - - -### telegramBot.editMessageCaption(caption, [options]) ⇒ Promise -Use this method to edit captions of messages sent by the bot or via the bot (for inline bots). - -Note: You **must provide one of chat_id, message_id, or inline_message_id** in your request. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned -**See**: https://core.telegram.org/bots/api#editmessagecaption - -| Param | Type | Description | -| --- | --- | --- | -| caption | String | New caption of the message | -| [options] | Object | Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) | - - - -### telegramBot.editMessageMedia(media, [options]) ⇒ Promise -Use this method to edit animation, audio, document, photo, or video messages. - -If a message is a part of a message album, then it can be edited only to a photo or a video. - -Otherwise, message type can be changed arbitrarily. When inline message is edited, new file can't be uploaded. -Use previously uploaded file via its file_id or specify a URL. - -Note: You **must provide one of chat_id, message_id, or inline_message_id** in your request. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned -**See**: https://core.telegram.org/bots/api#editmessagemedia - -| Param | Type | Description | -| --- | --- | --- | -| media | Object | A JSON-serialized object for a new media content of the message | -| [options] | Object | Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) | - - - -### telegramBot.editMessageChecklist(businessConnectionId, chatId, messageId, checklist, [options]) ⇒ Promise -Use this method to edit a checklist on behalf of a business connection. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned. -**See**: https://core.telegram.org/bots/api#editmessagechecklist - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | Number \| String | Unique identifier for the target business connection | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| messageId | Number | Unique identifier for the target message | -| checklist | Object | A JSON-serialized object for the new checklist | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.editMessageReplyMarkup(replyMarkup, [options]) ⇒ Promise -Use this method to edit only the reply markup of messages sent by the bot or via the bot (for inline bots). - -Note: You **must provide one of chat_id, message_id, or inline_message_id** in your request. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned -**See**: https://core.telegram.org/bots/api#editmessagetext - -| Param | Type | Description | -| --- | --- | --- | -| replyMarkup | Object | A JSON-serialized object for an inline keyboard. | -| [options] | Object | Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) | - - - -### telegramBot.stopPoll(chatId, pollId, [options]) ⇒ Promise -Use this method to stop a poll which was sent by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the stopped [Poll](https://core.telegram.org/bots/api#poll) is returned -**See**: https://core.telegram.org/bots/api#stoppoll - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the group/channel | -| pollId | Number | Identifier of the original message with the poll | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendSticker(chatId, sticker, [options], [fileOptions]) ⇒ Promise -Use this method to send static .WEBP, [animated](https://telegram.org/blog/animated-stickers) .TGS, -or [video](https://telegram.org/blog/video-stickers-better-reactions) .WEBM stickers. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) is returned -**See**: https://core.telegram.org/bots/api#sendsticker - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| sticker | String \| stream.Stream \| Buffer | A file path, Stream or Buffer. Can also be a `file_id` previously uploaded. Stickers are WebP format files. | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.getStickerSet(name, [options]) ⇒ Promise -Use this method to get a sticker set. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, a [StickerSet](https://core.telegram.org/bots/api#stickerset) object is returned -**See**: https://core.telegram.org/bots/api#getstickerset - -| Param | Type | Description | -| --- | --- | --- | -| name | String | Name of the sticker set | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getCustomEmojiStickers(custom_emoji_ids, [options]) ⇒ Promise -Use this method to get information about custom emoji stickers by their identifiers. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - Array of [Sticker](https://core.telegram.org/bots/api#sticker) objects. -**See**: https://core.telegram.org/bots/api#getcustomemojistickers - -| Param | Type | Description | -| --- | --- | --- | -| custom_emoji_ids | Array | List of custom emoji identifiers. At most 200 custom emoji identifiers can be specified. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.uploadStickerFile(userId, sticker, stickerFormat, [options], [fileOptions]) ⇒ Promise -Use this method to upload a file with a sticker for later use in *createNewStickerSet* and *addStickerToSet* methods (can be used multiple -times). - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, a [File](https://core.telegram.org/bots/api#file) object is returned -**See**: https://core.telegram.org/bots/api#uploadstickerfile - -| Param | Type | Default | Description | -| --- | --- | --- | --- | -| userId | Number | | User identifier of sticker file owner | -| sticker | String \| stream.Stream \| Buffer | | A file path or a Stream with the sticker in .WEBP, .PNG, .TGS, or .WEBM format. Can also be a `file_id` previously uploaded. | -| stickerFormat | String | static | Allow values: `static`, `animated` or `video` | -| [options] | Object | | Additional Telegram query options | -| [fileOptions] | Object | | Optional file related meta-data | - - - -### telegramBot.createNewStickerSet(userId, name, title, pngSticker, emojis, [options], [fileOptions]) ⇒ Promise -Use this method to create new sticker set owned by a user. - -The bot will be able to edit the created sticker set. - -You must use exactly one of the fields *png_sticker*, *tgs_sticker*, or *webm_sticker* - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#createnewstickerset - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | User identifier of created sticker set owner | -| name | String | Short name of sticker set, to be used in `t.me/addstickers/` URLs (e.g., *"animals"*). Can contain only english letters, digits and underscores. Must begin with a letter, can't contain consecutive underscores and must end in `"_by_"`. `` is case insensitive. 1-64 characters. | -| title | String | Sticker set title, 1-64 characters | -| pngSticker | String \| stream.Stream \| Buffer | Png image with the sticker, must be up to 512 kilobytes in size, dimensions must not exceed 512px, and either width or height must be exactly 512px. | -| emojis | String | One or more emoji corresponding to the sticker | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.addStickerToSet(userId, name, sticker, emojis, stickerType, [options], [fileOptions]) ⇒ Promise -Use this method to add a new sticker to a set created by the bot. - -You must use exactly one of the fields *png_sticker*, *tgs_sticker*, or *webm_sticker* - -Animated stickers can be added to animated sticker sets and only to them - -Note: -- Emoji sticker sets can have up to 200 sticker -- Static or Animated sticker sets can have up to 120 stickers - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#addstickertoset - -| Param | Type | Default | Description | -| --- | --- | --- | --- | -| userId | Number | | User identifier of sticker set owner | -| name | String | | Sticker set name | -| sticker | String \| stream.Stream \| Buffer | | Png image with the sticker (must be up to 512 kilobytes in size, dimensions must not exceed 512px, and either width or height must be exactly 512px, [TGS animation](https://core.telegram.org/stickers#animated-sticker-requirements) with the sticker or [WEBM video](https://core.telegram.org/stickers#video-sticker-requirements) with the sticker. | -| emojis | String | | One or more emoji corresponding to the sticker | -| stickerType | String | png_sticker | Allow values: `png_sticker`, `tgs_sticker`, or `webm_sticker`. | -| [options] | Object | | Additional Telegram query options | -| [fileOptions] | Object | | Optional file related meta-data | - - - -### telegramBot.setStickerPositionInSet(sticker, position, [options]) ⇒ Promise -Use this method to move a sticker in a set created by the bot to a specific position. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setstickerpositioninset - -| Param | Type | Description | -| --- | --- | --- | -| sticker | String | File identifier of the sticker | -| position | Number | New sticker position in the set, zero-based | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.deleteStickerFromSet(sticker, [options]) ⇒ Promise -Use this method to delete a sticker from a set created by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#deletestickerfromset -**Todo** - -- [ ] Add tests for this method! - - -| Param | Type | Description | -| --- | --- | --- | -| sticker | String | File identifier of the sticker | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.replaceStickerInSet(user_id, name, sticker, [options]) ⇒ Promise -Use this method to replace an existing sticker in a sticker set with a new one - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#replacestickerinset -**Todo** - -- [ ] Add tests for this method! - - -| Param | Type | Description | -| --- | --- | --- | -| user_id | Number | User identifier of the sticker set owner | -| name | String | Sticker set name | -| sticker | String | File identifier of the sticker | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setStickerEmojiList(sticker, emojiList, [options]) ⇒ Promise -Use this method to change the list of emoji assigned to a regular or custom emoji sticker. - -The sticker must belong to a sticker set created by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setstickeremojilist - -| Param | Type | Description | -| --- | --- | --- | -| sticker | String | File identifier of the sticker | -| emojiList | Array | A JSON-serialized list of 1-20 emoji associated with the sticker | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setStickerKeywords(sticker, [options]) ⇒ Promise -Use this method to change the list of emoji assigned to a `regular` or `custom emoji` sticker. - -The sticker must belong to a sticker set created by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setstickerkeywords - -| Param | Type | Description | -| --- | --- | --- | -| sticker | String | File identifier of the sticker | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setStickerMaskPosition(sticker, [options]) ⇒ Promise -Use this method to change the [mask position](https://core.telegram.org/bots/api#maskposition) of a mask sticker. - -The sticker must belong to a sticker set created by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setstickermaskposition - -| Param | Type | Description | -| --- | --- | --- | -| sticker | String | File identifier of the sticker | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setStickerSetTitle(name, title, [options]) ⇒ Promise -Use this method to set the title of a created sticker set. - -The sticker must belong to a sticker set created by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setstickersettitle - -| Param | Type | Description | -| --- | --- | --- | -| name | String | Sticker set name | -| title | String | Sticker set title, 1-64 characters | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setStickerSetThumbnail(userId, name, thumbnail, [options], [fileOptions]) ⇒ Promise -Use this method to add a thumb to a set created by the bot. - -Animated thumbnails can be set for animated sticker sets only. Video thumbnails can be set only for video sticker sets only - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setstickersetthumbnail - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | User identifier of sticker set owner | -| name | String | Sticker set name | -| thumbnail | String \| stream.Stream \| Buffer | A .WEBP or .PNG image with the thumbnail, must be up to 128 kilobytes in size and have width and height exactly 100px, a TGS animation with the thumbnail up to 32 kilobytes in size or a WEBM video with the thumbnail up to 32 kilobytes in size. Pass a file_id as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one. Animated sticker set thumbnails can't be uploaded via HTTP URL. | -| [options] | Object | Additional Telegram query options | -| [fileOptions] | Object | Optional file related meta-data | - - - -### telegramBot.setCustomEmojiStickerSetThumbnail(name, [options]) ⇒ Promise -Use this method to set the thumbnail of a custom emoji sticker set. - -The sticker must belong to a sticker set created by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#setcustomemojistickersetthumbnail - -| Param | Type | Description | -| --- | --- | --- | -| name | String | Sticker set name | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.deleteStickerSet(name, [options]) ⇒ Promise -Use this method to delete a sticker set that was created by the bot. - -The sticker must belong to a sticker set created by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#deletestickerset - -| Param | Type | Description | -| --- | --- | --- | -| name | String | Sticker set name | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.answerInlineQuery(inlineQueryId, results, [options]) ⇒ Promise -Send answers to an inline query. - -Note: No more than 50 results per query are allowed. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, True is returned -**See**: https://core.telegram.org/bots/api#answerinlinequery - -| Param | Type | Description | -| --- | --- | --- | -| inlineQueryId | String | Unique identifier of the query | -| results | [ 'Array' ].<InlineQueryResult> | An array of results for the inline query | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.answerWebAppQuery(webAppQueryId, result, [options]) ⇒ Promise -Use this method to set the result of an interaction with a [Web App](https://core.telegram.org/bots/webapps) -and send a corresponding message on behalf of the user to the chat from which the query originated. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, a [SentWebAppMessage](https://core.telegram.org/bots/api#sentwebappmessage) object is returned -**See**: https://core.telegram.org/bots/api#answerwebappquery - -| Param | Type | Description | -| --- | --- | --- | -| webAppQueryId | String | Unique identifier for the query to be answered | -| result | InlineQueryResult | object that represents one result of an inline query | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendInvoice(chatId, title, description, payload, providerToken, currency, prices, [options]) ⇒ Promise -Use this method to send an invoice. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) is returned -**See**: https://core.telegram.org/bots/api#sendinvoice - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| title | String | Product name, 1-32 characters | -| description | String | Product description, 1-255 characters | -| payload | String | Bot defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. | -| providerToken | String | Payments provider token, obtained via `@BotFather` | -| currency | String | Three-letter ISO 4217 currency code | -| prices | Array | Breakdown of prices | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.createInvoiceLink(title, description, payload, providerToken, currency, prices, [options]) ⇒ Promise -Use this method to create a link for an invoice. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - The created invoice link as String on success. -**See**: https://core.telegram.org/bots/api#createinvoicelink - -| Param | Type | Description | -| --- | --- | --- | -| title | String | Product name, 1-32 characters | -| description | String | Product description, 1-255 characters | -| payload | String | Bot defined invoice payload | -| providerToken | String | Payment provider token | -| currency | String | Three-letter ISO 4217 currency code | -| prices | Array | Breakdown of prices | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.answerShippingQuery(shippingQueryId, ok, [options]) ⇒ Promise -Use this method to reply to shipping queries. - -If you sent an invoice requesting a shipping address and the parameter is_flexible was specified, -the Bot API will send an [Update](https://core.telegram.org/bots/api#update) with a shipping_query field to the bot - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, True is returned -**See**: https://core.telegram.org/bots/api#answershippingquery - -| Param | Type | Description | -| --- | --- | --- | -| shippingQueryId | String | Unique identifier for the query to be answered | -| ok | Boolean | Specify if delivery of the product is possible | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.answerPreCheckoutQuery(preCheckoutQueryId, ok, [options]) ⇒ Promise -Use this method to respond to such pre-checkout queries - -Once the user has confirmed their payment and shipping details, the Bot API sends the final confirmation in the form of -an [Update](https://core.telegram.org/bots/api#update) with the field *pre_checkout_query*. - -**Note:** The Bot API must receive an answer within 10 seconds after the pre-checkout query was sent. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, True is returned -**See**: https://core.telegram.org/bots/api#answerprecheckoutquery - -| Param | Type | Description | -| --- | --- | --- | -| preCheckoutQueryId | String | Unique identifier for the query to be answered | -| ok | Boolean | Specify if every order details are ok | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getMyStarBalance([options]) ⇒ Promise -Use this method to get the current Telegram Stars balance of the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns a [StarAmount](https://core.telegram.org/bots/api#staramount) object -**See**: https://core.telegram.org/bots/api#getmystarbalance - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getStarTransactions([options]) ⇒ Promise -Use this method for get the bot's Telegram Star transactions in chronological order - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns a [StarTransactions](https://core.telegram.org/bots/api#startransactions) object -**See**: https://core.telegram.org/bots/api#getstartransactions - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.refundStarPayment(userId, telegramPaymentChargeId, [options]) ⇒ Promise -Use this method for refund a successful payment in [Telegram Stars](https://t.me/BotNews/90) - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, True is returned -**See**: https://core.telegram.org/bots/api#refundstarpayment - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the user whose payment will be refunded | -| telegramPaymentChargeId | String | Telegram payment identifier | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.editUserStarSubscription(userId, telegramPaymentChargeId, isCanceled, [options]) ⇒ Promise -Allows the bot to cancel or re-enable extension of a subscription paid in Telegram Stars. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, True is returned -**See**: https://core.telegram.org/bots/api#cancelrenewsubscription - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the user whose subscription will be canceled or re-enabled | -| telegramPaymentChargeId | String | Telegram payment identifier for the subscription | -| isCanceled | Boolean | True, if the subscription should be canceled, False, if it should be re-enabled | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.sendGame(chatId, gameShortName, [options]) ⇒ Promise -Use this method to send a game. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, the sent [Message](https://core.telegram.org/bots/api#message) is returned -**See**: https://core.telegram.org/bots/api#sendgame - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) | -| gameShortName | String | name of the game to be sent. Set up your games via `@BotFather`. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setGameScore(userId, score, [options]) ⇒ Promise -Use this method to set the score of the specified user in a game message. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, if the message is not an inline message, the [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned -**See**: https://core.telegram.org/bots/api#setgamescore - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the target user | -| score | Number | New score value, must be non-negative | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getGameHighScores(userId, [options]) ⇒ Promise -Use this method to get data for high score tables. - -Will return the score of the specified user and several of their neighbors in a game. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns an Array of [GameHighScore](https://core.telegram.org/bots/api#gamehighscore) objects -**See**: https://core.telegram.org/bots/api#getgamehighscores - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.deleteMessage(chatId, messageId, [options]) ⇒ Promise -Use this method to delete a message, including service messages, with the following limitations: -- A message can only be deleted if it was sent less than 48 hours ago. -- A dice message can only be deleted if it was sent more than 24 hours ago. -- Bots can delete outgoing messages in groups and supergroups. -- Bots can delete incoming messages in groups, supergroups and channels. -- Bots granted `can_post_messages` permissions can delete outgoing messages in channels. -- If the bot is an administrator of a group, it can delete any message there. -- If the bot has `can_delete_messages` permission in a supergroup, it can delete any message there. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - True on success -**See**: https://core.telegram.org/bots/api#deletemessage - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format @channelusername) | -| messageId | Number | Unique identifier of the target message | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.deleteMessages(chatId, messageIds, [options]) ⇒ [ 'Promise' ].<Boolean> -Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: [ 'Promise' ].<Boolean> - True on success -**See**: https://core.telegram.org/bots/api#deletemessages - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number \| String | Unique identifier for the target chat or username of the target channel (in the format @channelusername) | -| messageIds | [ 'Array' ].<(Number\|String)> | Identifiers of 1-100 messages to delete. See deleteMessage for limitations on which messages can be deleted | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getAvailableGifts([options]) ⇒ Promise -Use this method to returns the list of gifts that can be sent by the bot to users and channel chats. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns a [Gifts](https://core.telegram.org/bots/api#gifts) objects. -**See**: https://core.telegram.org/bots/api#getavailablegifts - -| Param | Type | Description | -| --- | --- | --- | -| [options] | Object | Additional Telegram query options. | - - - -### telegramBot.sendGift(giftId, [options]) ⇒ Promise -Use this method to sends a gift to the given user or channel chat. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#getavailablegifts - -| Param | Type | Description | -| --- | --- | --- | -| giftId | String | Unique identifier of the gift | -| [options] | Object | Additional Telegram query options. | - - - -### telegramBot.giftPremiumSubscription(userId, monthCount, starCount, [options]) ⇒ Promise -Use this method to sends a gift to the given user or channel chat. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#getavailablegifts - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the target user who will receive a Telegram Premium subscription. | -| monthCount | Number | Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12. | -| starCount | String | Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months. | -| [options] | Object | Additional Telegram query options. | - - - -### telegramBot.verifyUser(userId, [options]) ⇒ Promise -This method verifies a user [on behalf of the organization](https://telegram.org/verify#third-party-verification) which is represented by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#verifyuser - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the target user. | -| [options] | Object | Additional Telegram query options. | - - - -### telegramBot.verifyChat(chatId, [options]) ⇒ Promise -This method verifies a chat [on behalf of the organization](https://telegram.org/verify#third-party-verification) which is represented by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#verifychat - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number | Unique identifier of the target chat. | -| [options] | Object | Additional Telegram query options. | - - - -### telegramBot.removeUserVerification(userId, [options]) ⇒ Promise -This method removes verification from a user who is currently verified [on behalf of the organization](https://telegram.org/verify#third-party-verification) which is represented by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#removeuserverification - -| Param | Type | Description | -| --- | --- | --- | -| userId | Number | Unique identifier of the target user | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.removeChatVerification(chatId, [options]) ⇒ Promise -This method removes verification from a chat who is currently verified [on behalf of the organization](https://telegram.org/verify#third-party-verification) which is represented by the bot. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#removechatverification - -| Param | Type | Description | -| --- | --- | --- | -| chatId | Number | Unique identifier of the target chat. | -| [options] | Object | Additional Telegram query options. | - - - -### telegramBot.readBusinessMessage(businessConnectionId, chatId, messageId, [options]) ⇒ Promise -This method marks incoming message as read on behalf of a business account. - -Requires the **can_read_messages** business bot right - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#readbusinessmessage - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection on behalf of which to read the message. | -| chatId | Number | Unique identifier of the chat in which the message was received. The chat must have been active in the last 24 hours. | -| messageId | Number | Unique identifier of the message to mark as read. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.deleteBusinessMessages(businessConnectionId, messageIds, [options]) ⇒ Promise -This method delete messages on behalf of a business account. - -Requires the **can_delete_outgoing_messages** business bot right to delete messages sent by the bot itself, or the **can_delete_all_messages business** bot right to delete any message. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#deletebusinessmessages - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection on behalf of which to delete the message. | -| messageIds | [ 'Array' ].<Number> | List of 1-100 identifiers of messages to delete. All messages **must be from the same chat**. | -| [options] | Object | Additional Telegram query options. | - - - -### telegramBot.setBusinessAccountName(businessConnectionId, firstName, [options]) ⇒ Promise -This method changes the first and last name of a managed business account. - -Requires the **can_change_name** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#setbusinessaccountname - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| firstName | String | The new value of the first name for the business account; 1-64 characters. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setBusinessAccountUsername(businessConnectionId, [options]) ⇒ Promise -This method changes the username of a managed business account. - -Requires the **can_change_username** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#setbusinessaccountusername - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setBusinessAccountBio(businessConnectionId, [options]) ⇒ Promise -This method changes the bio of a managed business account. - -Requires the **can_change_bio** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#setbusinessaccountbio - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setBusinessAccountProfilePhoto(businessConnectionId, photo, [options]) ⇒ Promise -This method changes the profile photo of a managed business account. - -Requires the **can_edit_profile_photo** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#setbusinessaccountprofilephoto - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| photo | String \| stream.Stream \| Buffer | New profile photo. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.removeBusinessAccountProfilePhoto(businessConnectionId, [options]) ⇒ Promise -This method removes the current profile photo of a managed business account. - -Requires the **can_edit_profile_photo** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#removebusinessaccountprofilephoto - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.setBusinessAccountGiftSettings(businessConnectionId, showGiftButton, acceptedGiftTypes, [options]) ⇒ Promise -This method changes the privacy settings pertaining to incoming gifts in a managed business account. - -Requires the **can_change_gift_settings** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns true. -**See**: https://core.telegram.org/bots/api#setbusinessaccountgiftsettings - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| showGiftButton | Boolean | Pass True, if a button for sending a gift to the user or by the business account must always be shown in the input field. | -| acceptedGiftTypes | Object | Types of gifts accepted by the business account. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.getBusinessAccountStarBalance(businessConnectionId, [options]) ⇒ Promise -This method returns the amount of Telegram Stars owned by a managed business account. - -Requires the **can_view_gifts_and_stars** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns [StarAmount](https://core.telegram.org/bots/api#staramount). -**See**: https://core.telegram.org/bots/api#getbusinessaccountstarbalance - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.transferBusinessAccountStars(businessConnectionId, starCount, [options]) ⇒ Promise -This method transfers Telegram Stars from the business account balance to the bot's balance. - -Requires the **can_transfer_stars** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns True. -**See**: https://core.telegram.org/bots/api#transferbusinessaccountstars - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| starCount | Number | Number of Telegram Stars to transfer; 1-10000. | -| [options] | Object | Additional Telegram query options. | - - - -### telegramBot.getBusinessAccountGifts(businessConnectionId, [options]) ⇒ Promise -This method returns the gifts received and owned by a managed business account. - -Requires the **can_view_gifts_and_stars** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns [OwnedGifts](https://core.telegram.org/bots/api#ownedgifts). -**See**: https://core.telegram.org/bots/api#getbusinessaccountgifts - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.convertGiftToStars(businessConnectionId, ownedGiftId, [options]) ⇒ Promise -This method converts a given regular gift to Telegram Stars. - -Requires the **can_convert_gifts_to_stars** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns True. -**See**: https://core.telegram.org/bots/api#convertgifttostars - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| ownedGiftId | String | Unique identifier of the regular gift that should be converted to Telegram Stars. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.upgradeGift(businessConnectionId, ownedGiftId, [options]) ⇒ Promise -This method upgrades a given regular gift to a unique gift. - -Requires the **can_transfer_and_upgrade_gifts** business bot right. -Additionally requires the **can_transfer_stars** business bot right **if the upgrade is paid**. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns True. -**See**: https://core.telegram.org/bots/api#upgradegift - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| ownedGiftId | String | Unique identifier of the regular gift that should be upgraded to a unique one. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.transferGift(businessConnectionId, ownedGiftId, newOwnerChatId, [options]) ⇒ Promise -This method transfers an owned unique gift to another user. - -Requires the **can_transfer_and_upgrade_gifts** business bot right. -Additionally requires the **can_transfer_stars** business bot right **if the transfer is paid**. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns True. -**See**: https://core.telegram.org/bots/api#transfergift - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| ownedGiftId | String | Unique identifier of the regular gift that should be transferred. | -| newOwnerChatId | Number | Unique identifier of the chat which will own the gift. The chat **must be active in the last 24 hours**. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.postStory(businessConnectionId, content, activePeriod, [options]) ⇒ Promise -This method posts a story on behalf of a managed business account. - -Requires the **can_manage_stories** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns [Story](https://core.telegram.org/bots/api#story). -**See**: https://core.telegram.org/bots/api#poststory - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| content | Array | [InputStoryContent](https://core.telegram.org/bots/api#inputpaidmedia). The photo/video property can be String, Stream or Buffer. | -| activePeriod | Number | Unique identifier of the chat which will own the gift. The chat **must be active in the last 24 hours**. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.editStory(businessConnectionId, storyId, content, [options]) ⇒ Promise -This method edits a story previously posted by the bot on behalf of a managed business account. - -Requires the **can_manage_stories** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns [Story](https://core.telegram.org/bots/api#story). -**See**: https://core.telegram.org/bots/api#editstory - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| storyId | Number | Unique identifier of the story to edit. | -| content | Array | [InputStoryContent](https://core.telegram.org/bots/api#inputpaidmedia). The photo/video property can be String, Stream or Buffer. | -| [options] | Object | Additional Telegram query options | - - - -### telegramBot.deleteStory(businessConnectionId, storyId, [options]) ⇒ Promise -This method deletes a story previously posted by the bot on behalf of a managed business account. - -Requires the **can_manage_stories** business bot right. - -**Kind**: instance method of [TelegramBot](#TelegramBot) -**Returns**: Promise - On success, returns True. -**See**: https://core.telegram.org/bots/api#deletestory - -| Param | Type | Description | -| --- | --- | --- | -| businessConnectionId | String | Unique identifier of the business connection. | -| storyId | Number | Unique identifier of the story to delete. | -| [options] | Object | Additional Telegram query options. | - - - -### TelegramBot.errors : Object -The different errors the library uses. - -**Kind**: static property of [TelegramBot](#TelegramBot) - - -### TelegramBot.messageTypes : [ 'Array' ].<String> -The types of message updates the library handles. - -**Kind**: static property of [TelegramBot](#TelegramBot) -* * * - - -[usage-sending-files-performance]:https://github.com/yagop/node-telegram-bot-api/tree/master/doc/usage.md#sending-files-performance -[setWebHook-v0.25.0]:https://github.com/yagop/node-telegram-bot-api/tree/4e5a493cadfaad5589a8d79e55d9e0d103000ce4#telegrambotsetwebhookurl-cert -[getUpdates-v0.25.0]:https://github.com/yagop/node-telegram-bot-api/tree/4e5a493cadfaad5589a8d79e55d9e0d103000ce4#TelegramBot+getUpdates -[getUserProfilePhotos-v0.25.0]:https://github.com/yagop/node-telegram-bot-api/tree/4e5a493cadfaad5589a8d79e55d9e0d103000ce4#TelegramBot+getUserProfilePhotos -[answerCallbackQuery-v0.27.1]:https://github.com/yagop/node-telegram-bot-api/blob/v0.27.1/doc/api.md#TelegramBot+answerCallbackQuery -[answerCallbackQuery-v0.29.0]:https://github.com/yagop/node-telegram-bot-api/blob/v0.29.0/doc/api.md#TelegramBot+answerCallbackQuery diff --git a/doc/experimental.md b/doc/experimental.md deleted file mode 100644 index 0dad2d63..00000000 --- a/doc/experimental.md +++ /dev/null @@ -1,28 +0,0 @@ -# Experimental - -Experimental features are things we are trying out. We are **not** sure -if they'll become stable and move into the `master` branch. -Try them out and give feedback to support stabilizing them. - -* [Features](#features) -* [API Reference][api-experimental] -* [Installation](#installation) - - - -## features: - -* Support API method `deleteMessage` - -Open issues tagged `experimental`: [link](https://github.com/yagop/node-telegram-bot-api/issues?q=is%3Apr+is%3Aopen+label%3Aexperimental) - - - -## installation: - -```bash -$ npm install yagop/node-telegram-bot-api#experimental -``` - - -[api-experimental]:https://github.com/yagop/node-telegram-bot-api/tree/experimental/doc/api.md diff --git a/doc/help.md b/doc/help.md deleted file mode 100644 index 82172fcd..00000000 --- a/doc/help.md +++ /dev/null @@ -1,151 +0,0 @@ -# Help Information - -* [Common Pitfalls](#pitfalls) -* [FAQs](#faqs) - - -## Common Pitfalls - - -### Failing to receive reply with `ReplyToMessage` - -The user has to **manually reply** to your message, by tapping on the bot's message and select *Reply*. - -Sources: - -* Issue [#113](https://github.com/yagop/node-telegram-bot-api/issues/113) - - -## Frequently Asked Questions - -> Check out [all questions ever asked][questions] on our Github Issues. - -1. [How do I send GIFs?](#gifs) -1. [Why and When do I need a certificate when using WebHooks?](#webhook-cert) -1. [How do I know when a user leaves a chat?](#leave-chat) -1. [What does this error mean?](#error-meanings) -1. [How do I know the selected option in reply keyboard?](#reply-keyboard) -1. [How do I send multiple message in correct sequence?](#ordered-sending) -1. [How do I run my bot behind a proxy?](#proxy) -1. [Can you add feature X to the library?](#new-feature) -1. [Is this scalable?](#scalable) -1. [How do I listen for messages in a chat group?](#messages-in-chat) -1. [How do I know when a user blocks the bot?](#blocked-bot) - - -### How do I send GIFs? - -You might be trying to send your animated GIFs using *TelegramBot#sendPhoto()*. -The method mostly supports static images. As noted by the community, -it seems you need to send them as documents, using *TelegramBot#sendDocument()*. - -```js -bot.sendDocument(chatId, 'cat.gif'); -``` - -Sources: - -* Issue [#11](https://github.com/yagop/node-telegram-bot-api/issues/11) - - -### Why and When do I need a certificate when using WebHooks? - -*Not done. PRs welcome!* - -Sources: - -* Issue [#63](https://github.com/yagop/node-telegram-bot-api/issues/63) -* Issue [#125](https://github.com/yagop/node-telegram-bot-api/issues/125) - - -### How do I know when a user leaves a chat? - -*Not done. PRs welcome!* - -Sources: - -* Issue [#248](https://github.com/yagop/node-telegram-bot-api/issues/248) - - -### What does this error mean? - -* [502 Bad Gateway](https://github.com/yagop/node-telegram-bot-api/issues/377) - -*Not complete. PRs welcome!* - -Sources: - -* Issue [#73](https://github.com/yagop/node-telegram-bot-api/issues/73) -* Issue [#99](https://github.com/yagop/node-telegram-bot-api/issues/99) -* Issue [#101](https://github.com/yagop/node-telegram-bot-api/issues/101) -* Issue [#107](https://github.com/yagop/node-telegram-bot-api/issues/107) -* Issue [#156](https://github.com/yagop/node-telegram-bot-api/issues/156) -* Issue [#170](https://github.com/yagop/node-telegram-bot-api/issues/170) -* Issue [#244](https://github.com/yagop/node-telegram-bot-api/issues/244) - - -### How do I know the selected option in reply keyboard? - -*Not done. PRs welcome!* - -Sources: - -* Issue [#108](https://github.com/yagop/node-telegram-bot-api/issues/108) - - -### How do I send multiple message in correct sequence? - -*Not done. PRs welcome!* - -Sources: - -* Issue [#240](https://github.com/yagop/node-telegram-bot-api/issues/240) - - -### How do I run my bot behind a proxy? - -*Not done. PRs welcome!* - -Sources: - -* Issue [#122](https://github.com/yagop/node-telegram-bot-api/issues/122) -* Issue [#253](https://github.com/yagop/node-telegram-bot-api/issues/253) -* Issue [#766](https://github.com/yagop/node-telegram-bot-api/issues/766) - - -### Can you add feature X to the library? - -*Not done. PRs welcome!* - -Sources: - -* Issue [#238](https://github.com/yagop/node-telegram-bot-api/issues/238) - - -### Is this scalable? - -*Not done. PRs welcome!* - -Sources: - -* Issue [#219](https://github.com/yagop/node-telegram-bot-api/issues/219) - - -### How do I listen for messages in a chat group? - -*Not done. PRs welcome!* - -Sources: - -* Issue [#304](https://github.com/yagop/node-telegram-bot-api/issues/304) - - -### How do I know when a user blocks the bot? - -*Not done. PRs welcome!* - -Sources: - -* Issue [#273](https://github.com/yagop/node-telegram-bot-api/issues/273) - -[questions]:https://github.com/yagop/node-telegram-bot-api/issues?utf8=%E2%9C%93&q=is%3Aissue%20label%3Aquestion%20 diff --git a/doc/tutorials.md b/doc/tutorials.md deleted file mode 100644 index 90b48a5f..00000000 --- a/doc/tutorials.md +++ /dev/null @@ -1,12 +0,0 @@ -# Tutorials - -* [node-telegram-bot-api-tutorial by @hosein2398](https://github.com/hosein2398/node-telegram-bot-api-tutorial) -* [node-telegram-bot-api-persian-language by @saeedhei](https://github.com/saeedhei/node-telegram-bot-api-persian-language) -* [Node.JS: Делаем своего Telegram бота [RUS]](https://archakov.im/post/telegram-bot-on-nodejs) -* [YouTube: Пишем Telegram бота на NodeJS [RUS]](https://www.youtube.com/watch?v=RS1nmDMf69U&list=PL6AOr-PZtK-mM2QC1ixyfa5CtJZGK61aN) -* [Node.jsでTelegramのチャットボットを作る - Qiita](https://qiita.com/neetshin/items/0e2f6fa3ade41adb77bc) -* [Guía: Creación de bots de Telegram en Nodejs [ES]](https://tecnonucleous.com/creacion-de-bots-de-telegram-en-nodejs/) -* [node-telegram-bot-api-tutorial:a telegram bot helper to send templates by sms](https://github.com/vito2005/chatManagerTelegramBot) -* [Telegram bot using blockchain services](https://ilanolkies.com/post/Telegram-bot-using-blockchain-services) -* [How to set webhooks using express local server and NGROK](https://github.com/leobloise/node-telegram-bot-api-wb-tutorial) -> Send a PR with useful links **not** listed above diff --git a/doc/usage.md b/doc/usage.md deleted file mode 100644 index 8aa5e279..00000000 --- a/doc/usage.md +++ /dev/null @@ -1,269 +0,0 @@ -# Usage - -- [Usage](#usage) - - [Events](#events) - - [WebHooks](#webhooks) - - [Sending files](#sending-files) - - [File Options (metadata)](#file-options-metadata) - - [Performance Issue](#performance-issue) - - [Error handling](#error-handling) - - [Polling errors](#polling-errors) - - [WebHook errors](#webhook-errors) - - -## Events - -*TelegramBot* is an [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter) -that emits the following events: - -1. `message`: Received a new incoming [Message][message] of any kind - 1. Depending on the properties of the [Message][message], one of these - events may **ALSO** be emitted: `text`, `audio`, `document`, `photo`, - `sticker`, `video`, `voice`, `contact`, `location`, - `new_chat_members`, `left_chat_member`, `new_chat_title`, - `new_chat_photo`, `delete_chat_photo`, `group_chat_created`, - `game`, `pinned_message`, `poll`, `dice`, `migrate_from_chat_id`, `migrate_to_chat_id`, - `channel_chat_created`, `supergroup_chat_created`, - `successful_payment`, `invoice`, `video_note` - 1. **Arguments**: `message` ([Message][message]), `metadata` (`{ type?:string }`) - 1. `new_chat_participant`, `left_chat_participant` are **deprecated** -1. `callback_query`: Received a new incoming [Callback Query][callback-query] -1. `inline_query`: Received a new incoming [Inline Query][inline-query] -1. `chosen_inline_result`: Received result of an inline query i.e. [ChosenInlineResult][chosen-inline-result] -1. `channel_post`: Received a new incoming channel post of any kind -1. `edited_message`: Received a new version of a message that is known to the bot and was edited - 1. `edited_message_text` - 1. `edited_message_caption` -1. `edited_channel_post`: Received a new version of a channel post that is known to the bot and was edited - 1. `edited_channel_post_text` - 1. `edited_channel_post_caption` -1. `shipping_query`: Received a new incoming shipping query -1. `pre_checkout_query`: Received a new incoming pre-checkout query -1. `poll`: Received a new incoming poll -2. `poll_answer`: A user has changed their answer in a non-anonymous poll (Only polls sent by the bot) -3. `chat_member`: A chat member's status was updated in a chat -4. `my_chat_member`: The bot's chat member status was updated in a chat -5. `chat_join_request`: A request to join the chat has been sent (The bot must have the can_invite_users administrator right) -5. `polling_error`: Error occurred during polling. See [polling errors](#polling-errors). -6. `webhook_error`: Error occurred handling a webhook request. See [webhook errors](#webhook-errors). -7. `error`: Unexpected error occurred, usually fatal! - -**Tip:** Its much better to listen a specific event rather than on -`message` in order to stay safe from the content. - -**Tip:** Bot must be enabled on [inline mode][inline-mode] for receive some -messages. - - -## WebHooks - -Telegram only supports HTTPS connections to WebHooks. -Therefore, in order to set a WebHook, you will need a SSL certificate. -Since August 29, 2015 Telegram supports self-signed ones, thus, you can -generate them: - -```bash -# Our private cert will be key.pem, keep this file private -$ openssl genrsa -out key.pem 2048 - -# Our public certificate will be crt.pem -$ openssl req -new -sha256 -key key.pem -out crt.pem -``` - -Once they are generated, the `crt.pem` should be uploaded, when setting up -your webhook. For example, - -```js -bot.setWebHook('public-url.com', { - certificate: 'path/to/crt.pem', // Path to your crt.pem -}); -``` - -**Note:** If you encounter an error, like -`Error: error:0906D06C:PEM routines:PEM_read_bio:no start line`, -you may want to proceed to [this issue][issue-63] for more information. - - -## Sending files - -The library makes it easy to get started sending files. *By default*, you -may provide a **file-path** and the library will handle reading it for you. -For example, - -```js -bot.sendAudio(chatId, 'path/to/audio.mp3'); -``` - -You may also pass in a **Readable Stream** from which data will be piped. -For example, - -```js -const stream = fs.createReadStream('path/to/audio.mp3'); -bot.sendAudio(chatId, stream); -``` - -You may also pass in a **Buffer** containing the contents of your file. -For example, - -```js -const buffer = fs.readFileSync('path/to/audio.mp3'); // sync! that's sad! :-( Just making a point! -bot.sendAudio(chatId, buffer); -``` - -If you already have a **File ID**, you earlier retrieved from Telegram, -you may pass it in, for example: - -```js -const fileId = getFileIdSomehow(); -bot.sendAudio(chatId, fileId); -``` - -Some API methods, such as *SendPhoto*, allow passing a **HTTP URL**, that -the Telegram servers will use to download the file. For example, - -```js -const url = 'https://telegram.org/img/t_logo.png'; -bot.sendPhoto(chatId, url); -``` - -If you wish to explicitly specify the filename or -[MIME type](http://en.wikipedia.org/wiki/Internet_media_type), -you may pass an additional argument as file options, like so: - -```js -const fileOptions = { - // Explicitly specify the file name. - filename: 'customfilename', - // Explicitly specify the MIME type. - contentType: 'audio/mpeg', -}; -bot.sendAudio(chatId, data, {}, fileOptions); -``` - -**NOTE:** You **MUST** provide an empty object (`{}`) in place of -*Additional Telegram query options*, if you have **no** query options -to specify. For example, - -```js -// WRONG! -// 'fileOptions' will be taken as additional Telegram query options!!! -bot.sendAudio(chatId, data, fileOptions); - -// RIGHT! -bot.sendAudio(chatId, data, {}, fileOptions); -``` - - - -### File Options (metadata) - -When sending files, the library automatically resolves -the `filename` and `contentType` properties. -**For now, this has to be manually activated using environment -variable `NTBA_FIX_350`.** - -In order of highest-to-lowest precedence in searching for -a value, when resolving the `filename`: - -*(`fileOptions` is the Object argument passed to the method. -The "file" argument passed to the method can be a `Stream`, -`Buffer` or `filepath`.)* - -1. Is `fileOptions.filename` explictly defined? -1. Does `Stream#path` exist? -1. Is `filepath` provided? -1. Default to `"filename"` - -And the `contentType`: - -1. Is `fileOptions.contentType` explictly-defined? -1. Does `Stream#path` exist? -1. Try detecting file-type from the `Buffer` -1. Is `filepath` provided? -1. Is `fileOptions.filename` explicitly defined? -1. Default to `"application/octet-stream"` - - -### Performance Issue - -To support providing file-paths to methods that send files involves -performing a file operation, i.e. *fs.existsSync()*, that checks for -the existence of the file at the provided path. While the cost of -this operation *might* be negligible in most use cases, if you want -to squeeze the best performance out of this library, you may wish to -disable this behavior. - -This will mean that you will **NOT** be able to pass in file-paths. -You will have to use Streams or Buffers to provide the file contents. - -Disabling this behavior: - -```js -const bot = new TelegramBot(token, { - filepath: false, -}); -``` - - -## Error handling - -Every `Error` object we pass back has the properties: - -* `code` (String): - * value is `EFATAL` if error was fatal e.g. network error - * value is `EPARSE` if response body could **not** be parsed - * value is `ETELEGRAM` if error was returned from Telegram servers -* `response` ([http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage)): - * available if `error.code` is **not** `EFATAL` -* `response.body` (String|Object): Error response from Telegram - * type is `String` if `error.code` is `EPARSE` - * type is `Object` if `error.code` is `ETELEGRAM` - -For example, sending message to a non-existent user: - -```js -bot.sendMessage(nonExistentUserId, 'text').catch((error) => { - console.log(error.code); // => 'ETELEGRAM' - console.log(error.response.body); // => { ok: false, error_code: 400, description: 'Bad Request: chat not found' } -}); -``` - - -## Polling errors - -An error may occur during polling. It is up to you to handle it -as you see fit. You may decide to crash your bot after a maximum number -of polling errors occurring. **It is all up to you.** - -By default, the polling error is just logged to stderr, if you do -**not** handle this event yourself. - -Listen on the `'polling_error'` event. For example, - -```js -bot.on('polling_error', (error) => { - console.log(error.code); // => 'EFATAL' -}); -``` - - -## WebHook errors - -Just like with [polling errors](#polling-errors), you decide on how to -handle it. By default, the error is logged to stderr. - -Listen on the `'webhook_error'` event. For example, - -```js -bot.on('webhook_error', (error) => { - console.log(error.code); // => 'EPARSE' -}); -``` - -[update]:https://core.telegram.org/bots/api#update -[message]:https://core.telegram.org/bots/api#message -[callback-query]:https://core.telegram.org/bots/api#callbackquery -[inline-query]:https://core.telegram.org/bots/api#inlinequery -[chosen-inline-result]:https://core.telegram.org/bots/api#choseninlineresult -[inline-mode]:https://core.telegram.org/bots/api#inline-mode -[issue-63]:https://github.com/yagop/node-telegram-bot-api/issues/63 diff --git a/examples/game/game.html b/examples/game/game.html deleted file mode 100644 index 0158133d..00000000 --- a/examples/game/game.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - -

-

Use the ACCELERATE button to stay in the air

-

How long can you stay alive?

- - - diff --git a/examples/game/game.js b/examples/game/game.js deleted file mode 100644 index cd7a9d23..00000000 --- a/examples/game/game.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * This example demonstrates using HTML5 games with Telegram. - */ -/* eslint-disable no-console */ - -const TOKEN = process.env.TELEGRAM_TOKEN || 'YOUR_TELEGRAM_BOT_TOKEN'; -const gameName = process.env.TELEGRAM_GAMENAME || 'YOUR_TELEGRAM_GAMENAME'; -// Specify '0' to use ngrok i.e. localhost tunneling -let url = process.env.URL || 'https://'; -const port = process.env.PORT || 8080; - -const TelegramBot = require('../..'); -const express = require('express'); -const path = require('path'); - -const bot = new TelegramBot(TOKEN, { polling: true }); -const app = express(); - -// Basic configurations -app.set('view engine', 'ejs'); - -// Tunnel to localhost. -// This is just for demo purposes. -// In your application, you will be using a static URL, probably that -// you paid for. :) -if (url === '0') { - const ngrok = require('ngrok'); - ngrok.connect(port, function onConnect(error, u) { - if (error) throw error; - url = u; - console.log(`Game tunneled at ${url}`); - }); -} - -// Matches /start -bot.onText(/\/start/, function onPhotoText(msg) { - bot.sendGame(msg.chat.id, gameName); -}); - -// Handle callback queries -bot.on('callback_query', function onCallbackQuery(callbackQuery) { - bot.answerCallbackQuery(callbackQuery.id, { url }); -}); - -// Render the HTML game -app.get('/', function requestListener(req, res) { - res.sendFile(path.join(__dirname, 'game.html')); -}); - -// Bind server to port -app.listen(port, function listen() { - console.log(`Server is listening at http://localhost:${port}`); -}); diff --git a/examples/polling.js b/examples/polling.js deleted file mode 100644 index 3d6aecb4..00000000 --- a/examples/polling.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * This example demonstrates using polling. - * It also demonstrates how you would process and send messages. - */ - - -const TOKEN = process.env.TELEGRAM_TOKEN || 'YOUR_TELEGRAM_BOT_TOKEN'; -const TelegramBot = require('..'); -const request = require('@cypress/request'); -const options = { - polling: true -}; -const bot = new TelegramBot(TOKEN, options); - - -// Matches /photo -bot.onText(/\/photo/, function onPhotoText(msg) { - // From file path - const photo = `${__dirname}/../test/data/photo.gif`; - bot.sendPhoto(msg.chat.id, photo, { - caption: "I'm a bot!" - }); -}); - - -// Matches /audio -bot.onText(/\/audio/, function onAudioText(msg) { - // From HTTP request - const url = 'https://upload.wikimedia.org/wikipedia/commons/c/c8/Example.ogg'; - const audio = request(url); - bot.sendAudio(msg.chat.id, audio); -}); - - -// Matches /love -bot.onText(/\/love/, function onLoveText(msg) { - const opts = { - reply_to_message_id: msg.message_id, - reply_markup: JSON.stringify({ - keyboard: [ - ['Yes, you are the bot of my life ❤'], - ['No, sorry there is another one...'] - ] - }) - }; - bot.sendMessage(msg.chat.id, 'Do you love me?', opts); -}); - - -// Matches /echo [whatever] -bot.onText(/\/echo (.+)/, function onEchoText(msg, match) { - const resp = match[1]; - bot.sendMessage(msg.chat.id, resp); -}); - - -// Matches /editable -bot.onText(/\/editable/, function onEditableText(msg) { - const opts = { - reply_markup: { - inline_keyboard: [ - [ - { - text: 'Edit Text', - // we shall check for this value when we listen - // for "callback_query" - callback_data: 'edit' - } - ] - ] - } - }; - bot.sendMessage(msg.from.id, 'Original Text', opts); -}); - - -// Handle callback queries -bot.on('callback_query', function onCallbackQuery(callbackQuery) { - const action = callbackQuery.data; - const msg = callbackQuery.message; - const opts = { - chat_id: msg.chat.id, - message_id: msg.message_id, - }; - let text; - - if (action === 'edit') { - text = 'Edited Text'; - } - - bot.editMessageText(text, opts); -}); diff --git a/examples/ssl/crt.pem b/examples/ssl/crt.pem deleted file mode 100644 index 1a657635..00000000 --- a/examples/ssl/crt.pem +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDmTCCAoGgAwIBAgIJAPz/mOxHHCRKMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNV -BAYTAlVTMQ0wCwYDVQQIDARVdGFoMQ4wDAYDVQQHDAVQcm92bzEjMCEGA1UECgwa -QUNNRSBTaWduaW5nIEF1dGhvcml0eSBJbmMxEDAOBgNVBAMMB3lhZ28ubWUwHhcN -MTUwNjI4MTk0MjAxWhcNMTgwNzA2MTk0MjAxWjBjMQswCQYDVQQGEwJVUzENMAsG -A1UECAwEVXRhaDEOMAwGA1UEBwwFUHJvdm8xIzAhBgNVBAoMGkFDTUUgU2lnbmlu -ZyBBdXRob3JpdHkgSW5jMRAwDgYDVQQDDAd5YWdvLm1lMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAw9YiYXN1s5KcoZy7UZyiXULpTrYPhlPhzlyJJdwg -e61C/swbqtnh/+fPZp8g8a15ond9ShUvWLcxeoDBzxn0hJIEe+DlNNHUAdWoTWUx -OP4hHDA6wCFepHWBlw10AoKAjoQA+nCX6NrdiFTpbodkEK0H4uOSCt37H616kdKU -wRgXlca2Kw88UQ0qhKteb5hYD5tm4aCv6eRCqwYdYKUG+D1uJuJ+YZmaaIXp/5QZ -q3a6mFsKLtUC33bhZZPr1qjh3zwF2JTZX1WFAxUHNxY5NVchUYDHjw0djXvw85il -iwWKFjFXfvk8WTfW3Ge3754BhYSt92Qj6BROD2AODhI8jwIDAQABo1AwTjAdBgNV -HQ4EFgQUpgp5hovXcW+eIb3xRkF1KSJb/rwwHwYDVR0jBBgwFoAUpgp5hovXcW+e -Ib3xRkF1KSJb/rwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAjnKW -+3lHe92Ut9XJdqGJsuRV5OUh8suOicz+AXtqUdoG9xbkv5N6Ynt+r06NjnYgTIzk -i+9fXBZLrXH8qNT2PTzErs0LMXPWxWbiZwY9mI2z/xW/K6CFjb1h33hk+ypwTr1J -Q1Eqy77FXKfQ2Y8kNLARSkvUEMm7UnVbUqRbA8AlWk9HZmoPHYfKPRGRVeIugH76 -b6Gm3ztmIgTZQ88+DxfedIjPib3LPsHIXrA2Qd8yrIaYDiE2HMMJ5q3SYdRY4yYB -2a3P7jCPZfKVKpRE0J0yeNH+wQL0bzCMbl2wBUhivXD+sM00Xe3a22eAYbNgLdEg -4Hvd/YIKm9yOjRolmw== ------END CERTIFICATE----- diff --git a/examples/ssl/key.pem b/examples/ssl/key.pem deleted file mode 100644 index 427ad656..00000000 --- a/examples/ssl/key.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAw9YiYXN1s5KcoZy7UZyiXULpTrYPhlPhzlyJJdwge61C/swb -qtnh/+fPZp8g8a15ond9ShUvWLcxeoDBzxn0hJIEe+DlNNHUAdWoTWUxOP4hHDA6 -wCFepHWBlw10AoKAjoQA+nCX6NrdiFTpbodkEK0H4uOSCt37H616kdKUwRgXlca2 -Kw88UQ0qhKteb5hYD5tm4aCv6eRCqwYdYKUG+D1uJuJ+YZmaaIXp/5QZq3a6mFsK -LtUC33bhZZPr1qjh3zwF2JTZX1WFAxUHNxY5NVchUYDHjw0djXvw85iliwWKFjFX -fvk8WTfW3Ge3754BhYSt92Qj6BROD2AODhI8jwIDAQABAoIBAQCga6gMNh2DtSTT -imUzrGCgjvA5RxAelFYTyl+agOCnDz4jJKXBZewoygZuZQoCj31lJgafCg2X2bER -Tan1caiIdGhx5b88bmoB+rh8ddlFe3857RQjUPKLO6qlRyLx719J3z5B6Lu3xpnU -VOJHZWcF9gfQx2RZvI862svd6idqqFfKRVr7jxur1VuTQpk6g0xi6GnFk9s6sPw9 -ChT6ykxzx+fQmYzeEW6SbWilOnm9BGuAEI2G7/mDQ6NFGFvFdPivI908vHPGbhFz -Ifdwt5F9NwQrSzYaDnYzCWrEmqSz9uRmX5DD9FwFokjN2d6o3V0/+1BrWLKDBDj+ -jYcOV5IBAoGBAOFLTbfRLPP0z4vgTX8FeaZXreJQPblHmJQNwvJEYiiug4aDXCLv -uBEVR+H1Y/Pm1U4s5LNESg2pOC0IZOElvAck+SY/K1KZFI9EzBLa0aybFOuLaHY1 -Z9cZfc1Cg3Vmpqnkyqahi+Tt1U/nayL3DFNcIwI30DweS+KLUmjIxxMBAoGBAN6H -ByD0+d3pfqkusTI3GT1NfWMBwS+usCayLP1gMpA+0tT+/lnYLLbmINaD6hoztWWD -OUZ7PM3HkOXKly2bfKxlT8Bi3b0QpNyd54ybj4/60JLRAO5OU773an8MMsov+q1V -xWYGVMnNihXFFVGaIK8dG/2mYomHjbzx3az/EZ+PAoGAJs3pnPeSXpKUDOudbXtr -8JK5iHl5qCgEx7t3EHNm1Mr6LHkDraDMe2TG9MxnYuMnakehPJ9OgfvbiSYg+gad -1D0yDLxkod1sBSE8ZSL7aldrywY//9xC/nGNkYUbT2VW33xgy0KX7d5pF1IsyeDz -ZohAH2mtnC07tNF6aEHsyAECgYAJ3EHcm/5WbvpF1OPVLcvYg46CzJka28rCbDLC -J3kWGzKMbaAnqwSQNjJOTxoYfyISlXX8QYm4NJefFxML2k/z86lNBRR+RDaJ8BVK -jboWzy5e0xQPezkKxTva1VeKzgV1mM9ebflj18++lzUSoJnCKLAM1UqYfYEyViVU -fRjy0QKBgQCopUy7KDdKngBrSQwI9lMi1/bZJTXw1WktLZRma3uIw8uBKB2Fyf4/ -7xFo49Ha7l1W38PfkqOS+539V8cJSyyJKq+PgBQ8fuLCplCDeZCieSiYm+FkpIr0 -4V+hEMIkVuUBDwCbyMM5mUH+sBVtmzNYDRgYa5QN4FIBk8VcBgsIhw== ------END RSA PRIVATE KEY----- diff --git a/examples/webhook/express.js b/examples/webhook/express.js deleted file mode 100644 index 4978e3ba..00000000 --- a/examples/webhook/express.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * This example demonstrates setting up a webook, and receiving - * updates in your express app - */ -/* eslint-disable no-console */ - -const TOKEN = process.env.TELEGRAM_TOKEN || 'YOUR_TELEGRAM_BOT_TOKEN'; -const url = 'https://'; -const port = process.env.PORT; - -const TelegramBot = require('../..'); -const express = require('express'); - -// No need to pass any parameters as we will handle the updates with Express -const bot = new TelegramBot(TOKEN); - -// This informs the Telegram servers of the new webhook. -bot.setWebHook(`${url}/bot${TOKEN}`); - -const app = express(); - -// parse the updates to JSON -app.use(express.json()); - -// We are receiving updates at the route below! -app.post(`/bot${TOKEN}`, (req, res) => { - bot.processUpdate(req.body); - res.sendStatus(200); -}); - -// Start Express Server -app.listen(port, () => { - console.log(`Express server is listening on ${port}`); -}); - -// Just to ping! -bot.on('message', msg => { - bot.sendMessage(msg.chat.id, 'I am alive!'); -}); diff --git a/examples/webhook/heroku.js b/examples/webhook/heroku.js deleted file mode 100644 index 87953ef0..00000000 --- a/examples/webhook/heroku.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * This example demonstrates setting up webhook - * on the Heroku platform. - */ - - -const TOKEN = process.env.TELEGRAM_TOKEN || 'YOUR_TELEGRAM_BOT_TOKEN'; -const TelegramBot = require('../..'); -const options = { - webHook: { - // Port to which you should bind is assigned to $PORT variable - // See: https://devcenter.heroku.com/articles/dynos#local-environment-variables - port: process.env.PORT - // you do NOT need to set up certificates since Heroku provides - // the SSL certs already (https://.herokuapp.com) - // Also no need to pass IP because on Heroku you need to bind to 0.0.0.0 - } -}; -// Heroku routes from port :443 to $PORT -// Add URL of your app to env variable or enable Dyno Metadata -// to get this automatically -// See: https://devcenter.heroku.com/articles/dyno-metadata -const url = process.env.APP_URL || 'https://.herokuapp.com:443'; -const bot = new TelegramBot(TOKEN, options); - - -// This informs the Telegram servers of the new webhook. -// Note: we do not need to pass in the cert, as it already provided -bot.setWebHook(`${url}/bot${TOKEN}`); - - -// Just to ping! -bot.on('message', function onMessage(msg) { - bot.sendMessage(msg.chat.id, 'I am alive on Heroku!'); -}); diff --git a/examples/webhook/https.js b/examples/webhook/https.js deleted file mode 100644 index 418c648e..00000000 --- a/examples/webhook/https.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * This example demonstrates setting up a webook, using a - * self-signed certificate. - */ - - -const TOKEN = process.env.TELEGRAM_TOKEN || 'YOUR_TELEGRAM_BOT_TOKEN'; -const TelegramBot = require('../..'); -const options = { - webHook: { - port: 443, - key: `${__dirname}/../ssl/key.pem`, // Path to file with PEM private key - cert: `${__dirname}/../ssl/crt.pem` // Path to file with PEM certificate - } -}; -// This URL must route to the port set above (i.e. 443) -const url = 'https://'; -const bot = new TelegramBot(TOKEN, options); - - -// This informs the Telegram servers of the new webhook. -bot.setWebHook(`${url}/bot${TOKEN}`, { - certificate: options.webHook.cert, -}); - - -// Just to ping! -bot.on('message', function onMessage(msg) { - bot.sendMessage(msg.chat.id, 'I am alive!'); -}); diff --git a/examples/webhook/now.js b/examples/webhook/now.js deleted file mode 100644 index f492e664..00000000 --- a/examples/webhook/now.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * This example demonstrates setting up webhook on Zeit Now platform. - * Attention: You have to use webhook with Zeit Now only, polling doesn't - * work. - */ - - -const TOKEN = process.env.TELEGRAM_TOKEN || 'YOUR_TELEGRAM_BOT_TOKEN'; -const TelegramBot = require('../..'); -const options = { - webHook: { - // Just use 443 directly - port: 443 - } -}; -// You can use 'now alias ' to assign fixed -// domain. -// See: https://zeit.co/blog/now-alias -// Or just use NOW_URL to get deployment url from env. -const url = 'YOUR_DOMAIN_ALIAS' || process.env.NOW_URL; -const bot = new TelegramBot(TOKEN, options); - - -// This informs the Telegram servers of the new webhook. -// Note: we do not need to pass in the cert, as it already provided -bot.setWebHook(`${url}/bot${TOKEN}`); - - -// Just to ping! -bot.on('message', function onMessage(msg) { - bot.sendMessage(msg.chat.id, 'I am alive on Zeit Now!'); -}); diff --git a/examples/webhook/openshift2.js b/examples/webhook/openshift2.js deleted file mode 100644 index 72ffaee6..00000000 --- a/examples/webhook/openshift2.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This example demonstrates setting up webhook - * on the OpenShift platform. - * - * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - * NOTE: - * - * Openshift 2 has been shut down. - * - * This example is kept here for historical/educational purposes. - * No changes are expected to be made to the source code below. - * - * See https://github.com/yagop/node-telegram-bot-api/issues/426 for - * more information. - * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - */ - - -const TOKEN = process.env.TELEGRAM_TOKEN || 'YOUR_TELEGRAM_BOT_TOKEN'; -const TelegramBot = require('../..'); -// See https://developers.openshift.com/en/node-js-environment-variables.html -const options = { - webHook: { - port: process.env.OPENSHIFT_NODEJS_PORT, - host: process.env.OPENSHIFT_NODEJS_IP, - // you do NOT need to set up certificates since OpenShift provides - // the SSL certs already (https://.rhcloud.com) - }, -}; -// OpenShift routes from port :443 to OPENSHIFT_NODEJS_PORT -const domain = process.env.OPENSHIFT_APP_DNS; -const url = `${domain}:443`; -const bot = new TelegramBot(TOKEN, options); - - -// This informs the Telegram servers of the new webhook. -// Note: we do not need to pass in the cert, as it already provided -bot.setWebHook(`${url}/bot${TOKEN}`); - - -// Just to ping! -bot.on('message', function onMessage(msg) { - bot.sendMessage(msg.chat.id, 'I am alive on OpenShift!'); -}); diff --git a/index.js b/index.js deleted file mode 100644 index 86e04808..00000000 --- a/index.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * If running on Nodejs 5.x and below, we load the transpiled code. - * Otherwise, we use the ES6 code. - * We are deprecating support for Node.js v5.x and below. - */ -const majorVersion = parseInt(process.versions.node.split('.')[0], 10); -if (majorVersion <= 5) { - const deprecate = require('./src/utils').deprecate; - deprecate('Node.js v5.x and below will no longer be supported in the future'); - module.exports = require('./lib/telegram'); -} else { - module.exports = require('./src/telegram'); -} diff --git a/package.json b/package.json deleted file mode 100644 index 550f3281..00000000 --- a/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "node-telegram-bot-api", - "version": "0.68.0", - "description": "Telegram Bot API", - "main": "./index.js", - "directories": { - "example": "examples", - "test": "test" - }, - "keywords": [ - "telegram", - "telegram bot", - "telegram bot api", - "bot" - ], - "scripts": { - "gen-doc": "echo 'WARNING: `npm run gen-doc` is deprecated. Use `npm run doc` instead.' && npm run doc", - "doc": "jsdoc2md --files src/telegram.js --template doc/api.hbs > doc/api.md", - "build": "babel -d ./lib src", - "prepublishOnly": "npm run build && npm run gen-doc", - "eslint": "eslint ./src ./test ./examples", - "mocha": "mocha", - "pretest": "npm run build", - "test": "npm run eslint && istanbul cover ./node_modules/mocha/bin/_mocha" - }, - "author": "Yago Pérez ", - "license": "MIT", - "engines": { - "node": ">=0.12" - }, - "dependencies": { - "@cypress/request": "^3.0.8", - "@cypress/request-promise": "^5.0.0", - "array.prototype.findindex": "^2.0.2", - "bl": "^1.2.3", - "debug": "^3.2.7", - "eventemitter3": "^3.0.0", - "file-type": "^3.9.0", - "mime": "^1.6.0", - "pump": "^2.0.0" - }, - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-eslint": "^8.0.3", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-preset-es2015": "^6.24.1", - "babel-register": "^6.26.0", - "concat-stream": "^1.6.0", - "eslint": "^2.13.1", - "eslint-config-airbnb": "^6.2.0", - "eslint-plugin-mocha": "^4.11.0", - "is": "^3.2.1", - "is-ci": "^1.0.10", - "istanbul": "^1.1.0-alpha.1", - "jsdoc-to-markdown": "^3.0.3", - "mocha": "^3.5.3", - "mocha-lcov-reporter": "^1.3.0", - "node-static": "^0.7.10" - }, - "repository": { - "type": "git", - "url": "https://github.com/yagop/node-telegram-bot-api.git" - }, - "bugs": { - "url": "https://github.com/yagop/node-telegram-bot-api/issues" - }, - "homepage": "https://github.com/yagop/node-telegram-bot-api" -} \ No newline at end of file diff --git a/src/errors.js b/src/errors.js deleted file mode 100644 index 8f1c597b..00000000 --- a/src/errors.js +++ /dev/null @@ -1,68 +0,0 @@ -exports.BaseError = class BaseError extends Error { - /** - * @class BaseError - * @constructor - * @private - * @param {String} code Error code - * @param {String} message Error message - */ - constructor(code, message) { - super(`${code}: ${message}`); - this.code = code; - } - toJSON() { - return { - code: this.code, - message: this.message, - }; - } -}; - - -exports.FatalError = class FatalError extends exports.BaseError { - /** - * Fatal Error. Error code is `"EFATAL"`. - * @class FatalError - * @constructor - * @param {String|Error} data Error object or message - */ - constructor(data) { - const error = (typeof data === 'string') ? null : data; - const message = error ? error.message : data; - super('EFATAL', message); - if (error) { - this.stack = error.stack; - this.cause = error; - } - } -}; - - -exports.ParseError = class ParseError extends exports.BaseError { - /** - * Error during parsing. Error code is `"EPARSE"`. - * @class ParseError - * @constructor - * @param {String} message Error message - * @param {http.IncomingMessage} response Server response - */ - constructor(message, response) { - super('EPARSE', message); - this.response = response; - } -}; - - -exports.TelegramError = class TelegramError extends exports.BaseError { - /** - * Error returned from Telegram. Error code is `"ETELEGRAM"`. - * @class TelegramError - * @constructor - * @param {String} message Error message - * @param {http.IncomingMessage} response Server response - */ - constructor(message, response) { - super('ETELEGRAM', message); - this.response = response; - } -}; diff --git a/src/telegram.js b/src/telegram.js deleted file mode 100644 index f2e41efe..00000000 --- a/src/telegram.js +++ /dev/null @@ -1,3838 +0,0 @@ -// shims -require('array.prototype.findindex').shim(); // for Node.js v0.x - -const errors = require('./errors'); -const TelegramBotWebHook = require('./telegramWebHook'); -const TelegramBotPolling = require('./telegramPolling'); -const debug = require('debug')('node-telegram-bot-api'); -const EventEmitter = require('eventemitter3'); -const fileType = require('file-type'); -const request = require('@cypress/request-promise'); -const streamedRequest = require('@cypress/request'); -const qs = require('querystring'); -const stream = require('stream'); -const mime = require('mime'); -const path = require('path'); -const URL = require('url'); -const fs = require('fs'); -const pump = require('pump'); -const deprecate = require('./utils').deprecate; - -const _messageTypes = [ - 'text', - 'animation', - 'audio', - 'channel_chat_created', - 'contact', - 'delete_chat_photo', - 'dice', - 'document', - 'game', - 'group_chat_created', - 'invoice', - 'left_chat_member', - 'location', - 'migrate_from_chat_id', - 'migrate_to_chat_id', - 'new_chat_members', - 'new_chat_photo', - 'new_chat_title', - 'passport_data', - 'photo', - 'pinned_message', - 'poll', - 'sticker', - 'successful_payment', - 'supergroup_chat_created', - 'video', - 'video_note', - 'voice', - 'video_chat_started', - 'video_chat_ended', - 'video_chat_participants_invited', - 'video_chat_scheduled', - 'message_auto_delete_timer_changed', - 'chat_invite_link', - 'chat_member_updated', - 'web_app_data', - 'message_reaction' -]; - -const _deprecatedMessageTypes = [ - 'new_chat_participant', 'left_chat_participant' -]; - -/** - * JSON-serialize data. If the provided data is already a String, - * return it as is. - * @private - * @param {*} data - * @return {String} - */ -function stringify(data) { - if (typeof data === 'string') { - return data; - } - return JSON.stringify(data); -} - - -class TelegramBot extends EventEmitter { - /** - * The different errors the library uses. - * @type {Object} - */ - static get errors() { - return errors; - } - - /** - * The types of message updates the library handles. - * @type {String[]} - */ - static get messageTypes() { - return _messageTypes; - } - - /** - * Add listener for the specified [event](https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#events). - * This is the usual `emitter.on()` method. - * @param {String} event - * @param {Function} listener - * @see {@link https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#events|Available events} - * @see https://nodejs.org/api/events.html#events_emitter_on_eventname_listener - */ - on(event, listener) { - if (_deprecatedMessageTypes.indexOf(event) !== -1) { - const url = 'https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#events'; - deprecate(`Events ${_deprecatedMessageTypes.join(',')} are deprecated. See the updated list of events: ${url}`); - } - super.on(event, listener); - } - - /** - * Both request method to obtain messages are implemented. To use standard polling, set `polling: true` - * on `options`. Notice that [webHook](https://core.telegram.org/bots/api#setwebhook) will need a SSL certificate. - * Emits `message` when a message arrives. - * - * @class TelegramBot - * @constructor - * @param {String} token Bot Token - * @param {Object} [options] - * @param {Boolean|Object} [options.polling=false] Set true to enable polling or set options. - * If a WebHook has been set, it will be deleted automatically. - * @param {String|Number} [options.polling.timeout=10] *Deprecated. Use `options.polling.params` instead*. - * Timeout in seconds for long polling. - * @param {Boolean} [options.testEnvironment=false] Set true to work with test enviroment. - * When working with the test environment, you may use HTTP links without TLS to test your Web App. - * @param {String|Number} [options.polling.interval=300] Interval between requests in miliseconds - * @param {Boolean} [options.polling.autoStart=true] Start polling immediately - * @param {Object} [options.polling.params] Parameters to be used in polling API requests. - * See https://core.telegram.org/bots/api#getupdates for more information. - * @param {Number} [options.polling.params.timeout=10] Timeout in seconds for long polling. - * @param {Boolean|Object} [options.webHook=false] Set true to enable WebHook or set options - * @param {String} [options.webHook.host="0.0.0.0"] Host to bind to - * @param {Number} [options.webHook.port=8443] Port to bind to - * @param {String} [options.webHook.key] Path to file with PEM private key for webHook server. - * The file is read **synchronously**! - * @param {String} [options.webHook.cert] Path to file with PEM certificate (public) for webHook server. - * The file is read **synchronously**! - * @param {String} [options.webHook.pfx] Path to file with PFX private key and certificate chain for webHook server. - * The file is read **synchronously**! - * @param {Boolean} [options.webHook.autoOpen=true] Open webHook immediately - * @param {Object} [options.webHook.https] Options to be passed to `https.createServer()`. - * Note that `options.webHook.key`, `options.webHook.cert` and `options.webHook.pfx`, if provided, will be - * used to override `key`, `cert` and `pfx` in this object, respectively. - * See https://nodejs.org/api/https.html#https_https_createserver_options_requestlistener for more information. - * @param {String} [options.webHook.healthEndpoint="/healthz"] An endpoint for health checks that always responds with 200 OK - * @param {Boolean} [options.onlyFirstMatch=false] Set to true to stop after first match. Otherwise, all regexps are executed - * @param {Object} [options.request] Options which will be added for all requests to telegram api. - * See https://github.com/request/request#requestoptions-callback for more information. - * @param {String} [options.baseApiUrl="https://api.telegram.org"] API Base URl; useful for proxying and testing - * @param {Boolean} [options.filepath=true] Allow passing file-paths as arguments when sending files, - * such as photos using `TelegramBot#sendPhoto()`. See [usage information][usage-sending-files-performance] - * for more information on this option and its consequences. - * @param {Boolean} [options.badRejection=false] Set to `true` - * **if and only if** the Node.js version you're using terminates the - * process on unhandled rejections. This option is only for - * *forward-compatibility purposes*. - * @see https://core.telegram.org/bots/api - */ - constructor(token, options = {}) { - super(); - this.token = token; - this.options = options; - this.options.polling = (typeof options.polling === 'undefined') ? false : options.polling; - this.options.webHook = (typeof options.webHook === 'undefined') ? false : options.webHook; - this.options.baseApiUrl = options.baseApiUrl || 'https://api.telegram.org'; - this.options.filepath = (typeof options.filepath === 'undefined') ? true : options.filepath; - this.options.badRejection = (typeof options.badRejection === 'undefined') ? false : options.badRejection; - this._textRegexpCallbacks = []; - this._replyListenerId = 0; - this._replyListeners = []; - this._polling = null; - this._webHook = null; - - if (options.polling) { - const autoStart = options.polling.autoStart; - if (typeof autoStart === 'undefined' || autoStart === true) { - this.startPolling(); - } - } - - if (options.webHook) { - const autoOpen = options.webHook.autoOpen; - if (typeof autoOpen === 'undefined' || autoOpen === true) { - this.openWebHook(); - } - } - } - - /** - * Generates url with bot token and provided path/method you want to be got/executed by bot - * @param {String} path - * @return {String} url - * @private - * @see https://core.telegram.org/bots/api#making-requests - */ - _buildURL(_path) { - return `${this.options.baseApiUrl}/bot${this.token}${this.options.testEnvironment ? '/test' : ''}/${_path}`; - } - - /** - * Fix 'reply_markup' parameter by making it JSON-serialized, as - * required by the Telegram Bot API - * @param {Object} obj Object; either 'form' or 'qs' - * @private - * @see https://core.telegram.org/bots/api#sendmessage - */ - _fixReplyMarkup(obj) { - const replyMarkup = obj.reply_markup; - if (replyMarkup && typeof replyMarkup !== 'string') { - obj.reply_markup = stringify(replyMarkup); - } - } - - /** - * Fix 'entities' or 'caption_entities' or 'explanation_entities' parameter by making it JSON-serialized, as - * required by the Telegram Bot API - * @param {Object} obj Object; - * @private - * @see https://core.telegram.org/bots/api#sendmessage - * @see https://core.telegram.org/bots/api#copymessage - * @see https://core.telegram.org/bots/api#sendpoll - */ - _fixEntitiesField(obj) { - const entities = obj.entities; - const captionEntities = obj.caption_entities; - const explanationEntities = obj.explanation_entities; - if (entities && typeof entities !== 'string') { - obj.entities = stringify(entities); - } - - if (captionEntities && typeof captionEntities !== 'string') { - obj.caption_entities = stringify(captionEntities); - } - - if (explanationEntities && typeof explanationEntities !== 'string') { - obj.explanation_entities = stringify(explanationEntities); - } - } - - _fixAddFileThumbnail(options, opts) { - if (options.thumb) { - if (opts.formData === null) { - opts.formData = {}; - } - - const attachName = 'photo'; - const [formData] = this._formatSendData(attachName, options.thumb.replace('attach://', '')); - - if (formData) { - opts.formData[attachName] = formData[attachName]; - opts.qs.thumbnail = `attach://${attachName}`; - } - } - } - - /** - * Fix 'reply_parameters' parameter by making it JSON-serialized, as - * required by the Telegram Bot API - * @param {Object} obj Object; either 'form' or 'qs' - * @private - * @see https://core.telegram.org/bots/api#sendmessage - */ - _fixReplyParameters(obj) { - if (obj.hasOwnProperty('reply_parameters') && typeof obj.reply_parameters !== 'string') { - obj.reply_parameters = stringify(obj.reply_parameters); - } - } - - /** - * Make request against the API - * @param {String} _path API endpoint - * @param {Object} [options] - * @private - * @return {Promise} - */ - _request(_path, options = {}) { - if (!this.token) { - return Promise.reject(new errors.FatalError('Telegram Bot Token not provided!')); - } - - if (this.options.request) { - Object.assign(options, this.options.request); - } - - if (options.form) { - this._fixReplyMarkup(options.form); - this._fixEntitiesField(options.form); - this._fixReplyParameters(options.form); - } - if (options.qs) { - this._fixReplyMarkup(options.qs); - this._fixReplyParameters(options.qs); - } - - options.method = 'POST'; - options.url = this._buildURL(_path); - options.simple = false; - options.resolveWithFullResponse = true; - options.forever = true; - debug('HTTP request: %j', options); - return request(options) - .then(resp => { - let data; - try { - data = resp.body = JSON.parse(resp.body); - } catch (err) { - throw new errors.ParseError(`Error parsing response: ${resp.body}`, resp); - } - - if (data.ok) { - return data.result; - } - - throw new errors.TelegramError(`${data.error_code} ${data.description}`, resp); - }).catch(error => { - // TODO: why can't we do `error instanceof errors.BaseError`? - if (error.response) throw error; - throw new errors.FatalError(error); - }); - } - - /** - * Format data to be uploaded; handles file paths, streams and buffers - * @param {String} type - * @param {String|stream.Stream|Buffer} data - * @param {Object} fileOptions File options - * @param {String} [fileOptions.filename] File name - * @param {String} [fileOptions.contentType] Content type (i.e. MIME) - * @return {Array} formatted - * @return {Object} formatted[0] formData - * @return {String} formatted[1] fileId - * @throws Error if Buffer file type is not supported. - * @see https://npmjs.com/package/file-type - * @private - */ - _formatSendData(type, data, fileOptions = {}) { - const deprecationMessage = - 'See https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files' + - ' for more information on how sending files has been improved and' + - ' on how to disable this deprecation message altogether.'; - let filedata = data; - let filename = fileOptions.filename; - let contentType = fileOptions.contentType; - - if (data instanceof stream.Stream) { - if (!filename && data.path) { - // Will be 'null' if could not be parsed. - // For example, 'data.path' === '/?id=123' from 'request("https://example.com/?id=123")' - const url = URL.parse(path.basename(data.path.toString())); - if (url.pathname) { - filename = qs.unescape(url.pathname); - } - } - } else if (Buffer.isBuffer(data)) { - if (!filename && !process.env.NTBA_FIX_350) { - deprecate(`Buffers will have their filenames default to "filename" instead of "data". ${deprecationMessage}`); - filename = 'data'; - } - if (!contentType) { - const filetype = fileType(data); - if (filetype) { - contentType = filetype.mime; - const ext = filetype.ext; - if (ext && !process.env.NTBA_FIX_350) { - filename = `${filename}.${ext}`; - } - } else if (!process.env.NTBA_FIX_350) { - deprecate(`An error will no longer be thrown if file-type of buffer could not be detected. ${deprecationMessage}`); - throw new errors.FatalError('Unsupported Buffer file-type'); - } - } - } else if (data) { - if (this.options.filepath && fs.existsSync(data)) { - filedata = fs.createReadStream(data); - if (!filename) { - filename = path.basename(data); - } - } else { - return [null, data]; - } - } else { - return [null, data]; - } - - filename = filename || 'filename'; - contentType = contentType || mime.lookup(filename); - if (process.env.NTBA_FIX_350) { - contentType = contentType || 'application/octet-stream'; - } else { - deprecate(`In the future, content-type of files you send will default to "application/octet-stream". ${deprecationMessage}`); - } - - // TODO: Add missing file extension. - - return [{ - [type]: { - value: filedata, - options: { - filename, - contentType, - }, - }, - }, null]; - } - - - /** - * Format multiple files to be uploaded; handles file paths, streams, and buffers - * @param {String} type - * @param {Array} files Array of file data objects - * @param {Object} fileOptions File options - * @param {String} [fileOptions.filename] File name - * @param {String} [fileOptions.contentType] Content type (i.e. MIME) - * @return {Object} formatted - * @return {Object} formatted.formData Form data object with all files - * @return {Array} formatted.fileIds Array of fileIds for non-file data - * @throws Error if Buffer file type is not supported. - * @see https://npmjs.com/package/file-type - * @private - */ - _formatSendMultipleData(type, files, fileOptions = {}) { - const formData = {}; - const fileIds = {}; - - files.forEach((file, index) => { - let filedata = file.media || file.data || file[type]; - let filename = file.filename || fileOptions.filename; - let contentType = file.contentType || fileOptions.contentType; - - if (filedata instanceof stream.Stream) { - if (!filename && filedata.path) { - const url = URL.parse(path.basename(filedata.path.toString()), true); - if (url.pathname) { - filename = qs.unescape(url.pathname); - } - } - } else if (Buffer.isBuffer(filedata)) { - filename = `filename_${index}`; - - if (!contentType) { - const filetype = fileType(filedata); - - if (filetype) { - contentType = filetype.mime; - const ext = filetype.ext; - - if (ext) { - filename = `${filename}.${ext}`; - } - } else { - throw new errors.FatalError('Unsupported Buffer file-type'); - } - } - } else if (fs.existsSync(filedata)) { - filedata = fs.createReadStream(filedata); - - if (!filename) { - filename = path.basename(filedata.path); - } - } else { - fileIds[index] = filedata; - return; - } - - filename = filename || `filename_${index}`; - contentType = contentType || 'application/octet-stream'; - - formData[`${type}_${index}`] = { - value: filedata, - options: { - filename, - contentType, - }, - }; - }); - - return { formData, fileIds }; - } - /** - * Start polling. - * Rejects returned promise if a WebHook is being used by this instance. - * @param {Object} [options] - * @param {Boolean} [options.restart=true] Consecutive calls to this method causes polling to be restarted - * @return {Promise} - */ - startPolling(options = {}) { - if (this.hasOpenWebHook()) { - return Promise.reject(new errors.FatalError('Polling and WebHook are mutually exclusive')); - } - options.restart = typeof options.restart === 'undefined' ? true : options.restart; - if (!this._polling) { - this._polling = new TelegramBotPolling(this); - } - return this._polling.start(options); - } - - /** - * Alias of `TelegramBot#startPolling()`. This is **deprecated**. - * @param {Object} [options] - * @return {Promise} - * @deprecated - */ - initPolling() { - deprecate('TelegramBot#initPolling() is deprecated. Use TelegramBot#startPolling() instead.'); - return this.startPolling(); - } - - /** - * Stops polling after the last polling request resolves. - * Multiple invocations do nothing if polling is already stopped. - * Returning the promise of the last polling request is **deprecated**. - * @param {Object} [options] Options - * @param {Boolean} [options.cancel] Cancel current request - * @param {String} [options.reason] Reason for stopping polling - * @return {Promise} - */ - stopPolling(options) { - if (!this._polling) { - return Promise.resolve(); - } - return this._polling.stop(options); - } - - /** - * Get link for file. - * Use this method to get link for file for subsequent use. - * Attention: link will be valid for 1 hour. - * - * This method is a sugar extension of the (getFile)[#getfilefileid] method, - * which returns just path to file on remote server (you will have to manually build full uri after that). - * - * @param {String} fileId File identifier to get info about - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Promise which will have *fileURI* in resolve callback - * @see https://core.telegram.org/bots/api#getfile - */ - getFileLink(fileId, form = {}) { - return this.getFile(fileId, form) - .then(resp => `${this.options.baseApiUrl}/file/bot${this.token}/${resp.file_path}`); - } - - /** - * Return a readable stream for file. - * - * `fileStream.path` is the specified file ID i.e. `fileId`. - * `fileStream` emits event `info` passing a single argument i.e. - * `info` with the interface `{ uri }` where `uri` is the URI of the - * file on Telegram servers. - * - * This method is a sugar extension of the [getFileLink](#TelegramBot+getFileLink) method, - * which returns the full URI to the file on remote server. - * - * @param {String} fileId File identifier to get info about - * @param {Object} [options] Additional Telegram query options - * @return {stream.Readable} fileStream - */ - getFileStream(fileId, form = {}) { - const fileStream = new stream.PassThrough(); - fileStream.path = fileId; - this.getFileLink(fileId, form) - .then((fileURI) => { - fileStream.emit('info', { - uri: fileURI, - }); - pump(streamedRequest(Object.assign({ uri: fileURI }, this.options.request)), fileStream); - }) - .catch((error) => { - fileStream.emit('error', error); - }); - return fileStream; - } - - /** - * Downloads file in the specified folder. - * - * This method is a sugar extension of the [getFileStream](#TelegramBot+getFileStream) method, - * which returns a readable file stream. - * - * @param {String} fileId File identifier to get info about - * @param {String} downloadDir Absolute path to the folder in which file will be saved - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Promise, which will have *filePath* of downloaded file in resolve callback - */ - downloadFile(fileId, downloadDir, form = {}) { - let resolve; - let reject; - const promise = new Promise((a, b) => { - resolve = a; - reject = b; - }); - const fileStream = this.getFileStream(fileId, form); - fileStream.on('info', (info) => { - const fileName = info.uri.slice(info.uri.lastIndexOf('/') + 1); - // TODO: Ensure fileName doesn't contains slashes - const filePath = path.join(downloadDir, fileName); - pump(fileStream, fs.createWriteStream(filePath), (error) => { - if (error) { return reject(error); } - return resolve(filePath); - }); - }); - fileStream.on('error', (err) => { - reject(err); - }); - return promise; - } - - /** - * Register a RegExp to test against an incomming text message. - * @param {RegExp} regexpRexecuted with `exec`. - * @param {Function} callback Callback will be called with 2 parameters, - * the `msg` and the result of executing `regexp.exec` on message text. - */ - onText(regexp, callback) { - this._textRegexpCallbacks.push({ regexp, callback }); - } - - /** - * Remove a listener registered with `onText()`. - * @param {RegExp} regexp RegExp used previously in `onText()` - * @return {Object} deletedListener The removed reply listener if - * found. This object has `regexp` and `callback` - * properties. If not found, returns `null`. - */ - removeTextListener(regexp) { - const index = this._textRegexpCallbacks.findIndex((textListener) => { - return String(textListener.regexp) === String(regexp); - }); - if (index === -1) { - return null; - } - return this._textRegexpCallbacks.splice(index, 1)[0]; - } - - /** - * Remove all listeners registered with `onText()`. - */ - clearTextListeners() { - this._textRegexpCallbacks = []; - } - - /** - * Register a reply to wait for a message response. - * - * @param {Number|String} chatId The chat id where the message cames from. - * @param {Number|String} messageId The message id to be replied. - * @param {Function} callback Callback will be called with the reply - * message. - * @return {Number} id The ID of the inserted reply listener. - */ - onReplyToMessage(chatId, messageId, callback) { - const id = ++this._replyListenerId; - this._replyListeners.push({ - id, - chatId, - messageId, - callback - }); - return id; - } - - /** - * Removes a reply that has been prev. registered for a message response. - * @param {Number} replyListenerId The ID of the reply listener. - * @return {Object} deletedListener The removed reply listener if - * found. This object has `id`, `chatId`, `messageId` and `callback` - * properties. If not found, returns `null`. - */ - removeReplyListener(replyListenerId) { - const index = this._replyListeners.findIndex((replyListener) => { - return replyListener.id === replyListenerId; - }); - if (index === -1) { - return null; - } - return this._replyListeners.splice(index, 1)[0]; - } - - /** - * Removes all replies that have been prev. registered for a message response. - * - * @return {Array} deletedListeners An array of removed listeners. - */ - clearReplyListeners() { - this._replyListeners = []; - } - - /** - * Return true if polling. Otherwise, false. - * - * @return {Boolean} - */ - isPolling() { - return this._polling ? this._polling.isPolling() : false; - } - - /** - * Open webhook. - * Multiple invocations do nothing if webhook is already open. - * Rejects returned promise if Polling is being used by this instance. - * - * @return {Promise} - */ - openWebHook() { - if (this.isPolling()) { - return Promise.reject(new errors.FatalError('WebHook and Polling are mutually exclusive')); - } - if (!this._webHook) { - this._webHook = new TelegramBotWebHook(this); - } - return this._webHook.open(); - } - - /** - * Close webhook after closing all current connections. - * Multiple invocations do nothing if webhook is already closed. - * - * @return {Promise} Promise - */ - closeWebHook() { - if (!this._webHook) { - return Promise.resolve(); - } - return this._webHook.close(); - } - - /** - * Return true if using webhook and it is open i.e. accepts connections. - * Otherwise, false. - * - * @return {Boolean} - */ - hasOpenWebHook() { - return this._webHook ? this._webHook.isOpen() : false; - } - - - /** - * Process an update; emitting the proper events and executing regexp - * callbacks. This method is useful should you be using a different - * way to fetch updates, other than those provided by TelegramBot. - * - * @param {Object} update - * @see https://core.telegram.org/bots/api#update - */ - processUpdate(update) { - debug('Process Update %j', update); - const message = update.message; - const editedMessage = update.edited_message; - const channelPost = update.channel_post; - const editedChannelPost = update.edited_channel_post; - const businessConnection = update.business_connection; - const businesssMessage = update.business_message; - const editedBusinessMessage = update.edited_business_message; - const deletedBusinessMessage = update.deleted_business_messages; - const messageReaction = update.message_reaction; - const messageReactionCount = update.message_reaction_count; - const inlineQuery = update.inline_query; - const chosenInlineResult = update.chosen_inline_result; - const callbackQuery = update.callback_query; - const shippingQuery = update.shipping_query; - const preCheckoutQuery = update.pre_checkout_query; - const purchasedPaidMedia = update.purchased_paid_media; - const poll = update.poll; - const pollAnswer = update.poll_answer; - const myChatMember = update.my_chat_member; - const chatMember = update.chat_member; - const chatJoinRequest = update.chat_join_request; - const chatBoost = update.chat_boost; - const removedChatBoost = update.removed_chat_boost; - - - if (message) { - debug('Process Update message %j', message); - const metadata = {}; - metadata.type = TelegramBot.messageTypes.find((messageType) => { - return message[messageType]; - }); - this.emit('message', message, metadata); - if (metadata.type) { - debug('Emitting %s: %j', metadata.type, message); - this.emit(metadata.type, message, metadata); - } - if (message.text) { - debug('Text message'); - this._textRegexpCallbacks.some(reg => { - debug('Matching %s with %s', message.text, reg.regexp); - - if (!(reg.regexp instanceof RegExp)) { - reg.regexp = new RegExp(reg.regexp); - } - - const result = reg.regexp.exec(message.text); - if (!result) { - return false; - } - // reset index so we start at the beginning of the regex each time - reg.regexp.lastIndex = 0; - debug('Matches %s', reg.regexp); - reg.callback(message, result); - // returning truthy value exits .some - return this.options.onlyFirstMatch; - }); - } - if (message.reply_to_message) { - // Only callbacks waiting for this message - this._replyListeners.forEach(reply => { - // Message from the same chat - if (reply.chatId === message.chat.id) { - // Responding to that message - if (reply.messageId === message.reply_to_message.message_id) { - // Resolve the promise - reply.callback(message); - } - } - }); - } - } else if (editedMessage) { - debug('Process Update edited_message %j', editedMessage); - this.emit('edited_message', editedMessage); - if (editedMessage.text) { - this.emit('edited_message_text', editedMessage); - } - if (editedMessage.caption) { - this.emit('edited_message_caption', editedMessage); - } - } else if (channelPost) { - debug('Process Update channel_post %j', channelPost); - this.emit('channel_post', channelPost); - } else if (editedChannelPost) { - debug('Process Update edited_channel_post %j', editedChannelPost); - this.emit('edited_channel_post', editedChannelPost); - if (editedChannelPost.text) { - this.emit('edited_channel_post_text', editedChannelPost); - } - if (editedChannelPost.caption) { - this.emit('edited_channel_post_caption', editedChannelPost); - } - } else if (businessConnection) { - debug('Process Update business_connection %j', businessConnection); - this.emit('business_connection', businessConnection); - } else if (businesssMessage) { - debug('Process Update business_message %j', businesssMessage); - this.emit('business_message', businesssMessage); - } else if (editedBusinessMessage) { - debug('Process Update edited_business_message %j', editedBusinessMessage); - this.emit('edited_business_message', editedBusinessMessage); - } else if (deletedBusinessMessage) { - debug('Process Update deleted_business_messages %j', deletedBusinessMessage); - this.emit('deleted_business_messages', deletedBusinessMessage); - } else if (messageReaction) { - debug('Process Update message_reaction %j', messageReaction); - this.emit('message_reaction', messageReaction); - } else if (messageReactionCount) { - debug('Process Update message_reaction_count %j', messageReactionCount); - this.emit('message_reaction_count', messageReactionCount); - } else if (inlineQuery) { - debug('Process Update inline_query %j', inlineQuery); - this.emit('inline_query', inlineQuery); - } else if (chosenInlineResult) { - debug('Process Update chosen_inline_result %j', chosenInlineResult); - this.emit('chosen_inline_result', chosenInlineResult); - } else if (callbackQuery) { - debug('Process Update callback_query %j', callbackQuery); - this.emit('callback_query', callbackQuery); - } else if (shippingQuery) { - debug('Process Update shipping_query %j', shippingQuery); - this.emit('shipping_query', shippingQuery); - } else if (preCheckoutQuery) { - debug('Process Update pre_checkout_query %j', preCheckoutQuery); - this.emit('pre_checkout_query', preCheckoutQuery); - } else if (purchasedPaidMedia) { - debug('Process Update purchased_paid_media %j', purchasedPaidMedia); - this.emit('purchased_paid_media', purchasedPaidMedia); - } else if (poll) { - debug('Process Update poll %j', poll); - this.emit('poll', poll); - } else if (pollAnswer) { - debug('Process Update poll_answer %j', pollAnswer); - this.emit('poll_answer', pollAnswer); - } else if (chatMember) { - debug('Process Update chat_member %j', chatMember); - this.emit('chat_member', chatMember); - } else if (myChatMember) { - debug('Process Update my_chat_member %j', myChatMember); - this.emit('my_chat_member', myChatMember); - } else if (chatJoinRequest) { - debug('Process Update my_chat_member %j', chatJoinRequest); - this.emit('chat_join_request', chatJoinRequest); - } else if (chatBoost) { - debug('Process Update chat_boost %j', chatBoost); - this.emit('chat_boost', chatBoost); - } else if (removedChatBoost) { - debug('Process Update removed_chat_boost %j', removedChatBoost); - this.emit('removed_chat_boost', removedChatBoost); - } - } - - /** Start Telegram Bot API methods */ - - /** - * Use this method to receive incoming updates using long polling. - * This method has an [older, compatible signature][getUpdates-v0.25.0] - * that is being deprecated. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} - * @see https://core.telegram.org/bots/api#getupdates - */ - getUpdates(form = {}) { - /* The older method signature was getUpdates(timeout, limit, offset). - * We need to ensure backwards-compatibility while maintaining - * consistency of the method signatures throughout the library */ - if (typeof form !== 'object') { - /* eslint-disable no-param-reassign, prefer-rest-params */ - deprecate('The method signature getUpdates(timeout, limit, offset) has been deprecated since v0.25.0'); - form = { - timeout: arguments[0], - limit: arguments[1], - offset: arguments[2], - }; - /* eslint-enable no-param-reassign, prefer-rest-params */ - } - - return this._request('getUpdates', { form }); - } - - /** - * Specify an url to receive incoming updates via an outgoing webHook. - * This method has an [older, compatible signature][setWebHook-v0.25.0] - * that is being deprecated. - * - * @param {String} url URL where Telegram will make HTTP Post. Leave empty to - * delete webHook. - * @param {Object} [options] Additional Telegram query options - * @param {String|stream.Stream} [options.certificate] PEM certificate key (public). - * @param {String} [options.secret_token] Optional secret token to be sent in a header `X-Telegram-Bot-Api-Secret-Token` in every webhook request. - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} - * @see https://core.telegram.org/bots/api#setwebhook - * @see https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - */ - setWebHook(url, options = {}, fileOptions = {}) { - /* The older method signature was setWebHook(url, cert). - * We need to ensure backwards-compatibility while maintaining - * consistency of the method signatures throughout the library */ - let cert; - // Note: 'options' could be an object, if a stream was provided (in place of 'cert') - if (typeof options !== 'object' || options instanceof stream.Stream) { - deprecate('The method signature setWebHook(url, cert) has been deprecated since v0.25.0'); - cert = options; - options = {}; // eslint-disable-line no-param-reassign - } else { - cert = options.certificate; - } - - const opts = { - qs: options, - }; - opts.qs.url = url; - - if (cert) { - try { - const sendData = this._formatSendData('certificate', cert, fileOptions); - opts.formData = sendData[0]; - opts.qs.certificate = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - } - - return this._request('setWebHook', opts); - } - - /** - * Use this method to remove webhook integration if you decide to - * switch back to getUpdates. Returns True on success. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} - * @see https://core.telegram.org/bots/api#deletewebhook - */ - deleteWebHook(form = {}) { - return this._request('deleteWebhook', { form }); - } - - /** - * Use this method to get current webhook status. - * On success, returns a [WebhookInfo](https://core.telegram.org/bots/api#webhookinfo) object. - * If the bot is using getUpdates, will return an object with the - * url field empty. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} - * @see https://core.telegram.org/bots/api#getwebhookinfo - */ - getWebHookInfo(form = {}) { - return this._request('getWebhookInfo', { form }); - } - - /** - * A simple method for testing your bot's authentication token. Requires no parameters. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} basic information about the bot in form of a [User](https://core.telegram.org/bots/api#user) object. - * @see https://core.telegram.org/bots/api#getme - */ - getMe(form = {}) { - return this._request('getMe', { form }); - } - - /** - * This method log out your bot from the cloud Bot API server before launching the bot locally. - * You must log out the bot before running it locally, otherwise there is no guarantee that the bot will receive updates. - * After a successful call, you will not be able to log in again using the same token for 10 minutes. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#logout - */ - logOut(form = {}) { - return this._request('logOut', { form }); - } - - /** - * This method close the bot instance before moving it from one local server to another. - * This method will return error 429 in the first 10 minutes after the bot is launched. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#close - */ - close(form = {}) { - return this._request('close', { form }); - } - - /** - * Send text message. - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} text Text of the message to be sent - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendmessage - */ - sendMessage(chatId, text, form = {}) { - form.chat_id = chatId; - form.text = text; - return this._request('sendMessage', { form }); - } - - /** - * Forward messages of any kind. - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * or username of the target channel (in the format `@channelusername`) - * @param {Number|String} fromChatId Unique identifier for the chat where the - * original message was sent (or channel username in the format `@channelusername`) - * @param {Number|String} messageId Unique message identifier in the chat specified in fromChatId - * @param {Object} [options] Additional Telegram query options - * @return {Promise} - * @see https://core.telegram.org/bots/api#forwardmessage - */ - forwardMessage(chatId, fromChatId, messageId, form = {}) { - form.chat_id = chatId; - form.from_chat_id = fromChatId; - form.message_id = messageId; - return this._request('forwardMessage', { form }); - } - - /** - * Use this method to forward multiple messages of any kind. - * If some of the specified messages can't be found or forwarded, they are skipped. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * or username of the target channel (in the format `@channelusername`) - * @param {Number|String} fromChatId Unique identifier for the chat where the - * original message was sent (or channel username in the format `@channelusername`) - * @param {Array} messageIds Identifiers of 1-100 messages in the chat from_chat_id to forward. - * The identifiers must be specified in a strictly increasing order. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} An array of MessageId of the sent messages on success - * @see https://core.telegram.org/bots/api#forwardmessages - */ - forwardMessages(chatId, fromChatId, messageIds, form = {}) { - form.chat_id = chatId; - form.from_chat_id = fromChatId; - form.message_ids = messageIds; - return this._request('forwardMessages', { form }); - } - - /** - * Copy messages of any kind. **Service messages and invoice messages can't be copied.** - * The method is analogous to the method forwardMessages, but the copied message doesn't - * have a link to the original message. - * Returns the MessageId of the sent message on success. - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number|String} fromChatId Unique identifier for the chat where the - * original message was sent - * @param {Number|String} messageId Unique message identifier - * @param {Object} [options] Additional Telegram query options - * @return {Promise} The [MessageId](https://core.telegram.org/bots/api#messageid) of the sent message on success - * @see https://core.telegram.org/bots/api#copymessage - */ - copyMessage(chatId, fromChatId, messageId, form = {}) { - form.chat_id = chatId; - form.from_chat_id = fromChatId; - form.message_id = messageId; - return this._request('copyMessage', { form }); - } - - /** - * Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. - * Service messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. - * Returns the MessageId of the sent message on success. - * @param {Number|String} chatId Unique identifier for the target chat - * @param {Number|String} fromChatId Unique identifier for the chat where the - * original message was sent - * @param {Array} messageIds Identifiers of 1-100 messages in the chat from_chat_id to copy. - * The identifiers must be specified in a strictly increasing order. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} An array of MessageId of the sent messages - * @see https://core.telegram.org/bots/api#copymessages - */ - copyMessages(chatId, fromChatId, messageIds, form = {}) { - form.chat_id = chatId; - form.from_chat_id = fromChatId; - form.message_ids = stringify(messageIds); - return this._request('copyMessages', { form }); - } - - /** - * Send photo - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String|stream.Stream|Buffer} photo A file path or a Stream. Can - * also be a `file_id` previously uploaded - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendphoto - * @see https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - */ - sendPhoto(chatId, photo, options = {}, fileOptions = {}) { - const opts = { - qs: options, - }; - opts.qs.chat_id = chatId; - try { - const sendData = this._formatSendData('photo', photo, fileOptions); - opts.formData = sendData[0]; - opts.qs.photo = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('sendPhoto', opts); - } - - /** - * Send audio - * - * **Your audio must be in the .MP3 or .M4A format.** - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String|stream.Stream|Buffer} audio A file path, Stream or Buffer. - * Can also be a `file_id` previously uploaded. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendaudio - * @see https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - */ - sendAudio(chatId, audio, options = {}, fileOptions = {}) { - const opts = { - qs: options - }; - - opts.qs.chat_id = chatId; - - try { - const sendData = this._formatSendData('audio', audio, fileOptions); - opts.formData = sendData[0]; - opts.qs.audio = sendData[1]; - this._fixAddFileThumbnail(options, opts); - } catch (ex) { - return Promise.reject(ex); - } - - return this._request('sendAudio', opts); - } - - /** - * Send Document - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String|stream.Stream|Buffer} doc A file path, Stream or Buffer. - * Can also be a `file_id` previously uploaded. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendDocument - * @see https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - */ - sendDocument(chatId, doc, options = {}, fileOptions = {}) { - const opts = { - qs: options - }; - opts.qs.chat_id = chatId; - try { - const sendData = this._formatSendData('document', doc, fileOptions); - opts.formData = sendData[0]; - opts.qs.document = sendData[1]; - this._fixAddFileThumbnail(options, opts); - } catch (ex) { - return Promise.reject(ex); - } - - return this._request('sendDocument', opts); - } - - /** - * Use this method to send video files, **Telegram clients support mp4 videos** (other formats may be sent as Document). - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String|stream.Stream|Buffer} video A file path or Stream. - * Can also be a `file_id` previously uploaded. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendvideo - * @see https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - */ - sendVideo(chatId, video, options = {}, fileOptions = {}) { - const opts = { - qs: options - }; - opts.qs.chat_id = chatId; - try { - const sendData = this._formatSendData('video', video, fileOptions); - opts.formData = sendData[0]; - opts.qs.video = sendData[1]; - this._fixAddFileThumbnail(options, opts); - } catch (ex) { - return Promise.reject(ex); - } - return this._request('sendVideo', opts); - } - - /** - * Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String|stream.Stream|Buffer} animation A file path, Stream or Buffer. - * Can also be a `file_id` previously uploaded. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendanimation - * @see https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - */ - sendAnimation(chatId, animation, options = {}, fileOptions = {}) { - const opts = { - qs: options - }; - opts.qs.chat_id = chatId; - try { - const sendData = this._formatSendData('animation', animation, fileOptions); - opts.formData = sendData[0]; - opts.qs.animation = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('sendAnimation', opts); - } - - /** - * Send voice - * - * **Your audio must be in an .OGG file encoded with OPUS**, or in .MP3 format, or in .M4A format (other formats may be sent as Audio or Document) - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String|stream.Stream|Buffer} voice A file path, Stream or Buffer. - * Can also be a `file_id` previously uploaded. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendvoice - * @see https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - */ - sendVoice(chatId, voice, options = {}, fileOptions = {}) { - const opts = { - qs: options - }; - opts.qs.chat_id = chatId; - try { - const sendData = this._formatSendData('voice', voice, fileOptions); - opts.formData = sendData[0]; - opts.qs.voice = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('sendVoice', opts); - } - - /** - * Use this method to send video messages - * Telegram clients support **rounded square MPEG4 videos** of up to 1 minute long. - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String|stream.Stream|Buffer} videoNote A file path or Stream. - * Can also be a `file_id` previously uploaded. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @info The length parameter is actually optional. However, the API (at time of writing) requires you to always provide it until it is fixed. - * @see https://core.telegram.org/bots/api#sendvideonote - * @see https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - */ - sendVideoNote(chatId, videoNote, options = {}, fileOptions = {}) { - const opts = { - qs: options - }; - opts.qs.chat_id = chatId; - try { - const sendData = this._formatSendData('video_note', videoNote, fileOptions); - opts.formData = sendData[0]; - opts.qs.video_note = sendData[1]; - this._fixAddFileThumbnail(options, opts); - } catch (ex) { - return Promise.reject(ex); - } - return this._request('sendVideoNote', opts); - } - - /** - * Use this method to send paid media. - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} starCount The number of Telegram Stars that must be paid to buy access to the media; 1-10000 - * @param {Array} media Array of [InputPaidMedia](https://core.telegram.org/bots/api#inputpaidmedia). The media property can bea String, Stream or Buffer. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendpaidmedia - */ - sendPaidMedia(chatId, starCount, media, options = {}) { - const opts = { - qs: options - }; - - opts.qs.chat_id = chatId; - opts.qs.star_count = starCount; - - try { - const inputPaidMedia = []; - opts.formData = {}; - - const { formData, fileIds } = this._formatSendMultipleData('media', media); - - opts.formData = formData; - - inputPaidMedia.push(...media.map((item, index) => { - if (fileIds[index]) { - item.media = fileIds[index]; - } else { - item.media = `attach://media_${index}`; - } - return item; - })); - - opts.qs.media = stringify(inputPaidMedia); - } catch (ex) { - return Promise.reject(ex); - } - - return this._request('sendPaidMedia', opts); - } - - /** - * Use this method to send a group of photos or videos as an album. - * - * **Documents and audio files can be only grouped in an album with messages of the same type** - * - * If you wish to [specify file options](https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files), - * add a `fileOptions` property to the target input in `media`. - * - * @param {String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Array} media A JSON-serialized array describing photos and videos to be sent, must include 2–10 items - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, an array of the sent [Messages](https://core.telegram.org/bots/api#message) - * is returned. - * @see https://core.telegram.org/bots/api#sendmediagroup - * @see https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#sending-files - */ - sendMediaGroup(chatId, media, options = {}) { - const opts = { - qs: options, - }; - opts.qs.chat_id = chatId; - - opts.formData = {}; - const inputMedia = []; - let index = 0; - for (const input of media) { - const payload = Object.assign({}, input); - delete payload.media; - delete payload.fileOptions; - try { - const attachName = String(index); - const [formData, fileId] = this._formatSendData(attachName, input.media, input.fileOptions); - if (formData) { - opts.formData[attachName] = formData[attachName]; - payload.media = `attach://${attachName}`; - } else { - payload.media = fileId; - } - } catch (ex) { - return Promise.reject(ex); - } - inputMedia.push(payload); - index++; - } - opts.qs.media = stringify(inputMedia); - - return this._request('sendMediaGroup', opts); - } - - - /** - * Send location. - * Use this method to send point on the map. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Float} latitude Latitude of location - * @param {Float} longitude Longitude of location - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendlocation - */ - sendLocation(chatId, latitude, longitude, form = {}) { - form.chat_id = chatId; - form.latitude = latitude; - form.longitude = longitude; - return this._request('sendLocation', { form }); - } - - /** - * Use this method to edit live location messages sent by - * the bot or via the bot (for inline bots). - * - * A location **can be edited until its live_period expires or editing is explicitly disabled by a call to [stopMessageLiveLocation](https://core.telegram.org/bots/api#stopmessagelivelocation)** - * - * Note that you must provide one of chat_id, message_id, or - * inline_message_id in your request. - * - * @param {Float} latitude Latitude of location - * @param {Float} longitude Longitude of location - * @param {Object} [options] Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) - * @return {Promise} On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned. - * @see https://core.telegram.org/bots/api#editmessagelivelocation - */ - editMessageLiveLocation(latitude, longitude, form = {}) { - form.latitude = latitude; - form.longitude = longitude; - return this._request('editMessageLiveLocation', { form }); - } - - /** - * Use this method to stop updating a live location message sent by - * the bot or via the bot (for inline bots) before live_period expires. - * - * Note that you must provide one of chat_id, message_id, or - * inline_message_id in your request. - * - * @param {Object} [options] Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) - * @return {Promise} On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned. - * @see https://core.telegram.org/bots/api#stopmessagelivelocation - */ - stopMessageLiveLocation(form = {}) { - return this._request('stopMessageLiveLocation', { form }); - } - - /** - * Send venue. - * Use this method to send information about a venue. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Float} latitude Latitude of location - * @param {Float} longitude Longitude of location - * @param {String} title Name of the venue - * @param {String} address Address of the venue - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned. - * @see https://core.telegram.org/bots/api#sendvenue - */ - sendVenue(chatId, latitude, longitude, title, address, form = {}) { - form.chat_id = chatId; - form.latitude = latitude; - form.longitude = longitude; - form.title = title; - form.address = address; - return this._request('sendVenue', { form }); - } - - /** - * Send contact. - * Use this method to send phone contacts. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} phoneNumber Contact's phone number - * @param {String} firstName Contact's first name - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendcontact - */ - sendContact(chatId, phoneNumber, firstName, form = {}) { - form.chat_id = chatId; - form.phone_number = phoneNumber; - form.first_name = firstName; - return this._request('sendContact', { form }); - } - - /** - * Send poll. - * Use this method to send a native poll. - * - * @param {Number|String} chatId Unique identifier for the group/channel - * @param {String} question Poll question, 1-300 characters - * @param {Array} pollOptions Poll options, between 2-10 options (only 1-100 characters each) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendpoll - */ - sendPoll(chatId, question, pollOptions, form = {}) { - form.chat_id = chatId; - form.question = question; - form.options = stringify(pollOptions); - return this._request('sendPoll', { form }); - } - - /** - * Send sendChecklist. - * Use this method to send a checklist on behalf of a connected business account. - * - * @param {Number|String} businessConnectionId Unique identifier for the business connection - * @param {Number|String} chatId Unique identifier for the group/channel - * @param {Object} checklist A JSON-serialized object for the checklist to send - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#sendchecklist - */ - sendChecklist(businessConnectionId, chatId, checklist, form = {}) { - form.business_connection_id = businessConnectionId; - form.chat_id = chatId; - form.checklist = stringify(checklist); - return this._request('sendChecklist', { form }); - } - - /** - * Send Dice - * Use this method to send an animated emoji that will display a random value. - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned - * @see https://core.telegram.org/bots/api#senddice - */ - sendDice(chatId, options = {}) { - const opts = { - qs: options, - }; - opts.qs.chat_id = chatId; - try { - const sendData = this._formatSendData('dice'); - opts.formData = sendData[0]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('sendDice', opts); - } - - - /** - * Send chat action. - * - * Use this method when you need to tell the user that something is happening on the bot's side. - * **The status is set for 5 seconds or less** (when a message arrives from your bot, Telegram clients clear its typing status). - * - * Action `typing` for [text messages](https://core.telegram.org/bots/api#sendmessage), - * `upload_photo` for [photos](https://core.telegram.org/bots/api#sendphoto), `record_video` or `upload_video` for [videos](https://core.telegram.org/bots/api#sendvideo), - * `record_voice` or `upload_voice` for [voice notes](https://core.telegram.org/bots/api#sendvoice), `upload_document` for [general files](https://core.telegram.org/bots/api#senddocument), - * `choose_sticker` for [stickers](https://core.telegram.org/bots/api#sendsticker), `find_location` for [location data](https://core.telegram.org/bots/api#sendlocation), - * `record_video_note` or `upload_video_note` for [video notes](https://core.telegram.org/bots/api#sendvideonote). - * - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} action Type of action to broadcast. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#sendchataction - */ - sendChatAction(chatId, action, form = {}) { - form.chat_id = chatId; - form.action = action; - return this._request('sendChatAction', { form }); - } - - /** - * Use this method to change the chosen reactions on a message. - * - Service messages can't be reacted to. - * - Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. - * - In albums, bots must react to the first message. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format @channelusername) - * @param {Number} messageId Unique identifier of the target message - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setmessagereaction - */ - setMessageReaction(chatId, messageId, form = {}) { - form.chat_id = chatId; - form.message_id = messageId; - if (form.reaction) { - form.reaction = stringify(form.reaction); - } - return this._request('setMessageReaction', { form }); - } - - /** - * Use this method to get a list of profile pictures for a user. - * Returns a [UserProfilePhotos](https://core.telegram.org/bots/api#userprofilephotos) object. - * This method has an [older, compatible signature][getUserProfilePhotos-v0.25.0] - * that is being deprecated. - * - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Returns a [UserProfilePhotos](https://core.telegram.org/bots/api#userprofilephotos) object - * @see https://core.telegram.org/bots/api#getuserprofilephotos - */ - getUserProfilePhotos(userId, form = {}) { - /* The older method signature was getUserProfilePhotos(userId, offset, limit). - * We need to ensure backwards-compatibility while maintaining - * consistency of the method signatures throughout the library */ - if (typeof form !== 'object') { - /* eslint-disable no-param-reassign, prefer-rest-params */ - deprecate('The method signature getUserProfilePhotos(userId, offset, limit) has been deprecated since v0.25.0'); - form = { - offset: arguments[1], - limit: arguments[2], - }; - /* eslint-enable no-param-reassign, prefer-rest-params */ - } - form.user_id = userId; - return this._request('getUserProfilePhotos', { form }); - } - - /** - * Changes the emoji status for a given user that previously allowed the bot to manage their emoji status - * via the Mini App method [requestEmojiStatusAccess](https://core.telegram.org/bots/webapps#initializing-mini-apps). - * - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setuseremojistatus - */ - setUserEmojiStatus(userId, form = {}) { - form.user_id = userId; - return this._request('setUserEmojiStatus', { form }); - } - - /** - * Get file. - * Use this method to get basic info about a file and prepare it for downloading. - * - * Attention: **link will be valid for 1 hour.** - * - * @param {String} fileId File identifier to get info about - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, a [File](https://core.telegram.org/bots/api#file) object is returned - * @see https://core.telegram.org/bots/api#getfile - */ - getFile(fileId, form = {}) { - form.file_id = fileId; - return this._request('getFile', { form }); - } - - /** - * Use this method to ban a user in a group, a supergroup or a channel. - * In the case of supergroups and channels, the user will not be able to - * return to the chat on their own using invite links, etc., unless unbanned first.. - * - * The **bot must be an administrator in the group, supergroup or a channel** for this to work. - * - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success. - * @see https://core.telegram.org/bots/api#banchatmember - */ - banChatMember(chatId, userId, form = {}) { - form.chat_id = chatId; - form.user_id = userId; - return this._request('banChatMember', { form }); - } - - /** - * Use this method to unban a previously kicked user in a supergroup. - * The user will not return to the group automatically, but will be - * able to join via link, etc. - * - * The **bot must be an administrator** in the supergroup or channel for this to work. - * - * **By default**, this method guarantees that after the call the user is not a member of the chat, but will be able to join it. - * So **if the user is a member of the chat they will also be removed from the chat**. If you don't want this, use the parameter *only_if_banned* - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#unbanchatmember - */ - unbanChatMember(chatId, userId, form = {}) { - form.chat_id = chatId; - form.user_id = userId; - return this._request('unbanChatMember', { form }); - } - - /** - * Use this method to restrict a user in a supergroup. - * The bot **must be an administrator in the supergroup** for this to work - * and must have the appropriate admin rights. Pass True for all boolean parameters - * to lift restrictions from a user. Returns True on success. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#restrictchatmember - */ - restrictChatMember(chatId, userId, form = {}) { - form.chat_id = chatId; - form.user_id = userId; - return this._request('restrictChatMember', { form }); - } - - /** - * Use this method to promote or demote a user in a supergroup or a channel. - * The bot **must be an administrator** in the chat for this to work - * and must have the appropriate admin rights. Pass False for all boolean parameters to demote a user. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} userId - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success. - * @see https://core.telegram.org/bots/api#promotechatmember - */ - promoteChatMember(chatId, userId, form = {}) { - form.chat_id = chatId; - form.user_id = userId; - return this._request('promoteChatMember', { form }); - } - - /** - * Use this method to set a custom title for an administrator in a supergroup promoted by the bot. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} userId Unique identifier of the target user - * @param {String} customTitle New custom title for the administrator; 0-16 characters, emoji are not allowed - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setchatadministratorcustomtitle - */ - setChatAdministratorCustomTitle(chatId, userId, customTitle, form = {}) { - form.chat_id = chatId; - form.user_id = userId; - form.custom_title = customTitle; - return this._request('setChatAdministratorCustomTitle', { form }); - } - - - /** - * Use this method to ban a channel chat in a supergroup or a channel. - * - * Until the chat is [unbanned](https://core.telegram.org/bots/api#unbanchatsenderchat), the owner of the banned chat won't be able to send messages on behalf of any of their channels. - * The bot **must be an administrator in the supergroup or channel** for this to work and must have the appropriate administrator rights - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} senderChatId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success. - * @see https://core.telegram.org/bots/api#banchatsenderchat - */ - banChatSenderChat(chatId, senderChatId, form = {}) { - form.chat_id = chatId; - form.sender_chat_id = senderChatId; - return this._request('banChatSenderChat', { form }); - } - - /** - * Use this method to unban a previously banned channel chat in a supergroup or channel. - * - * The bot **must be an administrator** for this to work and must have the appropriate administrator rights. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} senderChatId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#unbanchatsenderchat - */ - unbanChatSenderChat(chatId, senderChatId, form = {}) { - form.chat_id = chatId; - form.sender_chat_id = senderChatId; - return this._request('unbanChatSenderChat', { form }); - } - - /** - * Use this method to set default chat permissions for all members. - * - * The bot **must be an administrator in the group or a supergroup** for this to - * work and **must have the `can_restrict_members` admin rights.** - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Array} chatPermissions New default chat permissions - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setchatpermissions - */ - setChatPermissions(chatId, chatPermissions, form = {}) { - form.chat_id = chatId; - form.permissions = stringify(chatPermissions); - return this._request('setChatPermissions', { form }); - } - - /** - * Use this method to generate a new primary invite link for a chat. **Any previously generated primary link is revoked**. - * - * The bot **must be an administrator in the chat** for this to work and must have the appropriate administrator rights. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Exported invite link as String on success. - * @see https://core.telegram.org/bots/api#exportchatinvitelink - */ - exportChatInviteLink(chatId, form = {}) { - form.chat_id = chatId; - return this._request('exportChatInviteLink', { form }); - } - - /** - * Use this method to create an additional invite link for a chat. - * - * The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - * - * The link generated with this method can be revoked using the method [revokeChatInviteLink](https://core.telegram.org/bots/api#revokechatinvitelink) - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Object} [options] Additional Telegram query options - * @return {Object} The new invite link as [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object - * @see https://core.telegram.org/bots/api#createchatinvitelink - */ - createChatInviteLink(chatId, form = {}) { - form.chat_id = chatId; - return this._request('createChatInviteLink', { form }); - } - - /** - * Use this method to edit a non-primary invite link created by the bot. - * - * The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} inviteLink Text with the invite link to edit - * @param {Object} [options] Additional Telegram query options - * @return {Promise} The edited invite link as a [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object - * @see https://core.telegram.org/bots/api#editchatinvitelink - */ - editChatInviteLink(chatId, inviteLink, form = {}) { - form.chat_id = chatId; - form.invite_link = inviteLink; - return this._request('editChatInviteLink', { form }); - } - - /** - * Use this method to create a subscription invite link for a channel chat. - * - * The bot must have the can_invite_users administrator rights - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} subscriptionPeriod The number of seconds the subscription will be active for before the next payment. Currently, it must always be 2592000 (30 days) - * @param {Number} subscriptionPrice The amount of Telegram Stars a user must pay initially and after each subsequent subscription period to be a member of the chat (1-2500) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} The new invite link as a [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object - * @see https://core.telegram.org/bots/api#createchatsubscriptioninvitelink - */ - createChatSubscriptionInviteLink(chatId, subscriptionPeriod, subscriptionPrice, form = {}) { - form.chat_id = chatId; - form.subscription_period = subscriptionPeriod; - form.subscription_price = subscriptionPrice; - return this._request('createChatSubscriptionInviteLink', { form }); - } - - /** - * Use this method to edit a subscription invite link created by the bot. - * - * The bot must have the can_invite_users administrator rights - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} inviteLink The invite link to edit - * @param {Object} [options] Additional Telegram query options - * @return {Promise} The new invite link as a [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object - * @see https://core.telegram.org/bots/api#editchatsubscriptioninvitelink - */ - editChatSubscriptionInviteLink(chatId, inviteLink, form = {}) { - form.chat_id = chatId; - form.invite_link = inviteLink; - return this._request('editChatSubscriptionInviteLink', { form }); - } - - /** - * Use this method to revoke an invite link created by the bot. - * Note: If the primary link is revoked, a new link is automatically generated - * - * The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} inviteLink The invite link to revoke - * @param {Object} [options] Additional Telegram query options - * @return {Promise} The revoked invite link as [ChatInviteLink](https://core.telegram.org/bots/api#chatinvitelink) object - * @see https://core.telegram.org/bots/api#revokechatinvitelink - */ - revokeChatInviteLink(chatId, inviteLink, form = {}) { - form.chat_id = chatId; - form.invite_link = inviteLink; - return this._request('revokeChatInviteLink', { form }); - } - - /** - * Use this method to approve a chat join request. - * - * The bot **must be an administrator in the chat** for this to work and **must have the `can_invite_users` administrator right.** - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#approvechatjoinrequest - */ - approveChatJoinRequest(chatId, userId, form = {}) { - form.chat_id = chatId; - form.user_id = userId; - return this._request('approveChatJoinRequest', { form }); - } - - /** - * Use this method to decline a chat join request. - * - * The bot **must be an administrator in the chat** for this to work and **must have the `can_invite_users` administrator right**. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#declinechatjoinrequest - */ - declineChatJoinRequest(chatId, userId, form = {}) { - form.chat_id = chatId; - form.user_id = userId; - return this._request('declineChatJoinRequest', { form }); - } - - /** - * Use this method to set a new profile photo for the chat. **Photos can't be changed for private chats**. - * - * The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {stream.Stream|Buffer} photo A file path or a Stream. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setchatphoto - */ - setChatPhoto(chatId, photo, options = {}, fileOptions = {}) { - const opts = { - qs: options, - }; - opts.qs.chat_id = chatId; - try { - const sendData = this._formatSendData('photo', photo, fileOptions); - opts.formData = sendData[0]; - opts.qs.photo = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('setChatPhoto', opts); - } - - /** - * Use this method to delete a chat photo. **Photos can't be changed for private chats**. - * - * The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#deletechatphoto - */ - deleteChatPhoto(chatId, form = {}) { - form.chat_id = chatId; - return this._request('deleteChatPhoto', { form }); - } - - /** - * Use this method to change the title of a chat. **Titles can't be changed for private chats**. - * - * The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} title New chat title, 1-255 characters - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setchattitle - */ - setChatTitle(chatId, title, form = {}) { - form.chat_id = chatId; - form.title = title; - return this._request('setChatTitle', { form }); - } - - /** - * Use this method to change the description of a group, a supergroup or a channel. - * - * The bot **must be an administrator in the chat** for this to work and must have the appropriate admin rights. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} description New chat title, 0-255 characters - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setchatdescription - */ - setChatDescription(chatId, description, form = {}) { - form.chat_id = chatId; - form.description = description; - return this._request('setChatDescription', { form }); - } - - /** - * Use this method to pin a message in a supergroup. - * - * If the chat is not a private chat, the **bot must be an administrator in the chat** for this to work and must have the `can_pin_messages` administrator - * right in a supergroup or `can_edit_messages` administrator right in a channel. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} messageId Identifier of a message to pin - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#pinchatmessage - */ - pinChatMessage(chatId, messageId, form = {}) { - form.chat_id = chatId; - form.message_id = messageId; - return this._request('pinChatMessage', { form }); - } - - /** - * Use this method to remove a message from the list of pinned messages in a chat - * - * If the chat is not a private chat, the **bot must be an administrator in the chat** for this to work and must have the `can_pin_messages` administrator - * right in a supergroup or `can_edit_messages` administrator right in a channel. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#unpinchatmessage - */ - unpinChatMessage(chatId, form = {}) { - form.chat_id = chatId; - return this._request('unpinChatMessage', { form }); - } - - /** - * Use this method to clear the list of pinned messages in a chat. - * - * If the chat is not a private chat, the **bot must be an administrator in the chat** for this to work and must have the `can_pin_messages` administrator - * right in a supergroup or `can_edit_messages` administrator right in a channel. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#unpinallchatmessages - */ - unpinAllChatMessages(chatId, form = {}) { - form.chat_id = chatId; - return this._request('unpinAllChatMessages', { form }); - } - - /** - * Use this method for your bot to leave a group, supergroup or channel - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#leavechat - */ - leaveChat(chatId, form = {}) { - form.chat_id = chatId; - return this._request('leaveChat', { form }); - } - - /** - * Use this method to get up to date information about the chat - * (current name of the user for one-on-one conversations, current - * username of a user, group or channel, etc.). - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) or channel - * @param {Object} [options] Additional Telegram query options - * @return {Promise} [ChatFullInfo](https://core.telegram.org/bots/api#chatfullinfo) object on success - * @see https://core.telegram.org/bots/api#getchat - */ - getChat(chatId, form = {}) { - form.chat_id = chatId; - return this._request('getChat', { form }); - } - - /** - * Use this method to get a list of administrators in a chat - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns an Array of [ChatMember](https://core.telegram.org/bots/api#chatmember) objects that contains information about all chat administrators except other bots. - * If the chat is a group or a supergroup and no administrators were appointed, only the creator will be returned - * @see https://core.telegram.org/bots/api#getchatadministrators - */ - getChatAdministrators(chatId, form = {}) { - form.chat_id = chatId; - return this._request('getChatAdministrators', { form }); - } - - /** - * Use this method to get the number of members in a chat. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Int on success - * @see https://core.telegram.org/bots/api#getchatmembercount - */ - getChatMemberCount(chatId, form = {}) { - form.chat_id = chatId; - return this._request('getChatMemberCount', { form }); - } - - /** - * Use this method to get information about a member of a chat. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} [ChatMember](https://core.telegram.org/bots/api#chatmember) object on success - * @see https://core.telegram.org/bots/api#getchatmember - */ - getChatMember(chatId, userId, form = {}) { - form.chat_id = chatId; - form.user_id = userId; - return this._request('getChatMember', { form }); - } - - /** - * Use this method to set a new group sticker set for a supergroup. - * - * The bot **must be an administrator in the chat** for this to work and must have the appropriate administrator rights. - * - * **Note:** Use the field `can_set_sticker_set` optionally returned in [getChat](https://core.telegram.org/bots/api#getchat) requests to check if the bot can use this method. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {String} stickerSetName Name of the sticker set to be set as the group sticker set - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setchatstickerset - */ - setChatStickerSet(chatId, stickerSetName, form = {}) { - form.chat_id = chatId; - form.sticker_set_name = stickerSetName; - return this._request('setChatStickerSet', { form }); - } - - - /** - * Use this method to delete a group sticker set from a supergroup. - * - * Use the field `can_set_sticker_set` optionally returned in [getChat](https://core.telegram.org/bots/api#getchat) requests to check if the bot can use this method. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#deletechatstickerset - */ - deleteChatStickerSet(chatId, form = {}) { - form.chat_id = chatId; - return this._request('deleteChatStickerSet', { form }); - } - - /** - * Use this method to get custom emoji stickers, which can be used as a forum topic icon by any user. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Array of [Sticker](https://core.telegram.org/bots/api#sticker) objects - * @see https://core.telegram.org/bots/api#getforumtopiciconstickers - */ - getForumTopicIconStickers(chatId, form = {}) { - form.chat_id = chatId; - return this._request('getForumTopicIconStickers', { form }); - } - - /** - * Use this method to create a topic in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. - * - * Returns information about the created topic as a [ForumTopic](https://core.telegram.org/bots/api#forumtopic) object. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {String} name Topic name, 1-128 characters - * @param {Object} [options] Additional Telegram query options - * @see https://core.telegram.org/bots/api#createforumtopic - */ - createForumTopic(chatId, name, form = {}) { - form.chat_id = chatId; - form.name = name; - return this._request('createForumTopic', { form }); - } - - /** - * Use this method to edit name and icon of a topic in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have can_manage_topics administrator rights, unless it is the creator of the topic. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Number} messageThreadId Unique identifier for the target message thread of the forum topic - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#editforumtopic - */ - editForumTopic(chatId, messageThreadId, form = {}) { - form.chat_id = chatId; - form.message_thread_id = messageThreadId; - return this._request('editForumTopic', { form }); - } - - /** - * Use this method to close an open topic in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights, unless it is the creator of the topic. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Number} messageThreadId Unique identifier for the target message thread of the forum topic - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#closeforumtopic - */ - closeForumTopic(chatId, messageThreadId, form = {}) { - form.chat_id = chatId; - form.message_thread_id = messageThreadId; - return this._request('closeForumTopic', { form }); - } - - /** - * Use this method to reopen a closed topic in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights, unless it is the creator of the topic. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Number} messageThreadId Unique identifier for the target message thread of the forum topic - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#reopenforumtopic - */ - reopenForumTopic(chatId, messageThreadId, form = {}) { - form.chat_id = chatId; - form.message_thread_id = messageThreadId; - return this._request('reopenForumTopic', { form }); - } - - /** - * Use this method to delete a forum topic along with all its messages in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have the can_delete_messages administrator rights. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Number} messageThreadId Unique identifier for the target message thread of the forum topic - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#deleteforumtopic - */ - deleteForumTopic(chatId, messageThreadId, form = {}) { - form.chat_id = chatId; - form.message_thread_id = messageThreadId; - return this._request('deleteForumTopic', { form }); - } - - /** - * Use this method to clear the list of pinned messages in a forum topic. - * The bot must be an administrator in the chat for this to work and must have the can_pin_messages administrator right in the supergroup. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Number} messageThreadId Unique identifier for the target message thread of the forum topic - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#unpinallforumtopicmessages - */ - unpinAllForumTopicMessages(chatId, messageThreadId, form = {}) { - form.chat_id = chatId; - form.message_thread_id = messageThreadId; - return this._request('unpinAllForumTopicMessages', { form }); - } - - /** - * Use this method to edit the name of the 'General' topic in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. - * The topic will be automatically unhidden if it was hidden. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {String} name New topic name, 1-128 characters - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#editgeneralforumtopic - */ - editGeneralForumTopic(chatId, name, form = {}) { - form.chat_id = chatId; - form.name = name; - return this._request('editGeneralForumTopic', { form }); - } - - /** - * Use this method to close an open 'General' topic in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. - * The topic will be automatically unhidden if it was hidden. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#closegeneralforumtopic - */ - closeGeneralForumTopic(chatId, form = {}) { - form.chat_id = chatId; - return this._request('closeGeneralForumTopic', { form }); - } - - /** - * Use this method to reopen a closed 'General' topic in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. - * The topic will be automatically unhidden if it was hidden. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#reopengeneralforumtopic - */ - reopenGeneralForumTopic(chatId, form = {}) { - form.chat_id = chatId; - return this._request('reopenGeneralForumTopic', { form }); - } - - /** - * Use this method to hide the 'General' topic in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights. - * The topic will be automatically closed if it was open. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#hidegeneralforumtopic - */ - hideGeneralForumTopic(chatId, form = {}) { - form.chat_id = chatId; - return this._request('hideGeneralForumTopic', { form }); - } - - /** - * Use this method to unhide the 'General' topic in a forum supergroup chat. - * The bot must be an administrator in the chat for this to work and must have the can_manage_topics administrator rights - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#unhidegeneralforumtopic - */ - unhideGeneralForumTopic(chatId, form = {}) { - form.chat_id = chatId; - return this._request('unhideGeneralForumTopic', { form }); - } - - /** - * Use this method to clear the list of pinned messages in a General forum topic. - * The bot must be an administrator in the chat for this to work and must have the can_pin_messages administrator right in the supergroup. - * - * @param {Number|String} chatId Unique identifier for the target group or username of the target supergroup (in the format @supergroupusername) - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#unpinallgeneralforumtopicmessages - */ - unpinAllGeneralForumTopicMessages(chatId, form = {}) { - form.chat_id = chatId; - return this._request('unhideGeneralForumTopic', { form }); - } - - /** - * Use this method to send answers to callback queries sent from - * [inline keyboards](https://core.telegram.org/bots#inline-keyboards-and-on-the-fly-updating). - * - * The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. - * - * This method has **older, compatible signatures ([1][answerCallbackQuery-v0.27.1])([2][answerCallbackQuery-v0.29.0])** - * that are being deprecated. - * - * @param {String} callbackQueryId Unique identifier for the query to be answered - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#answercallbackquery - */ - answerCallbackQuery(callbackQueryId, form = {}) { - /* The older method signature (in/before v0.27.1) was answerCallbackQuery(callbackQueryId, text, showAlert). - * We need to ensure backwards-compatibility while maintaining - * consistency of the method signatures throughout the library */ - if (typeof form !== 'object') { - /* eslint-disable no-param-reassign, prefer-rest-params */ - deprecate('The method signature answerCallbackQuery(callbackQueryId, text, showAlert) has been deprecated since v0.27.1'); - form = { - callback_query_id: arguments[0], - text: arguments[1], - show_alert: arguments[2], - }; - /* eslint-enable no-param-reassign, prefer-rest-params */ - } - /* The older method signature (in/before v0.29.0) was answerCallbackQuery([options]). - * We need to ensure backwards-compatibility while maintaining - * consistency of the method signatures throughout the library. */ - if (typeof callbackQueryId === 'object') { - /* eslint-disable no-param-reassign, prefer-rest-params */ - deprecate('The method signature answerCallbackQuery([options]) has been deprecated since v0.29.0'); - form = callbackQueryId; - /* eslint-enable no-param-reassign, prefer-rest-params */ - } else { - form.callback_query_id = callbackQueryId; - } - return this._request('answerCallbackQuery', { form }); - } - - /** - * Use this method to stores a message that can be sent by a user of a Mini App. - * - * @param {Number} userId Unique identifier of the target user - * @param {InlineQueryResult} result object that represents one result of an inline query - * @param {Object} [options] Optional form data to include in the request - * @return {Promise} On success, returns a [PreparedInlineMessage](https://core.telegram.org/bots/api#preparedinlinemessage) object. - * @see https://core.telegram.org/bots/api#savepreparedinlinemessage - */ - savePreparedInlineMessage(userId, result, form = {}) { - form.user_id = userId; - form.result = stringify(result); - return this._request('savePreparedInlineMessage', { form }); - } - - /** - * Use this method to get the list of boosts added to a chat by a use. - * Requires administrator rights in the chat - * - * @param {Number|String} chatId Unique identifier for the group/channel - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns a [UserChatBoosts](https://core.telegram.org/bots/api#userchatboosts) object - * @see https://core.telegram.org/bots/api#getuserchatboosts - */ - getUserChatBoosts(chatId, userId, form = {}) { - form.chat_id = chatId; - form.user_id = userId; - return this._request('getUserChatBoosts', { form }); - } - - /** - * Use this method to get information about the connection of the bot with a business account - * - * @param {Number|String} businessConnectionId Unique identifier for the group/channel - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns [BusinessConnection](https://core.telegram.org/bots/api#businessconnection) object - * @see https://core.telegram.org/bots/api#getbusinessconnection - */ - getBusinessConnection(businessConnectionId, form = {}) { - form.business_connection_id = businessConnectionId; - return this._request('getBusinessConnection', { form }); - } - - /** - * Use this method to change the list of the bot's commands. - * - * See https://core.telegram.org/bots#commands for more details about bot commands - * - * @param {Array} commands List of bot commands to be set as the list of the [bot's commands](https://core.telegram.org/bots/api#botcommand). At most 100 commands can be specified. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setmycommands - */ - setMyCommands(commands, form = {}) { - form.commands = stringify(commands); - - if (form.scope) { - form.scope = stringify(form.scope); - } - - return this._request('setMyCommands', { form }); - } - - /** - * Use this method to delete the list of the bot's commands for the given scope and user language. - * - * After deletion, [higher level commands](https://core.telegram.org/bots/api#determining-list-of-commands) will be shown to affected users. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#deletemycommands - */ - deleteMyCommands(form = {}) { - return this._request('deleteMyCommands', { form }); - } - - - /** - * Use this method to get the current list of the bot's commands for the given scope and user language. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Array of [BotCommand](https://core.telegram.org/bots/api#botcommand) on success. If commands aren't set, an empty list is returned. - * @see https://core.telegram.org/bots/api#getmycommands - */ - getMyCommands(form = {}) { - if (form.scope) { - form.scope = stringify(form.scope); - } - return this._request('getMyCommands', { form }); - } - - /** - * Use this method to change the bot's name. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setmyname - */ - setMyName(form = {}) { - return this._request('setMyName', { form }); - } - - /** - * Use this method to get the current bot name for the given user language. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} [BotName](https://core.telegram.org/bots/api#botname) on success - * @see https://core.telegram.org/bots/api#getmyname - */ - getMyName(form = {}) { - return this._request('getMyName', { form }); - } - - /** - * Use this method to change the bot's description, which is shown in the chat with the bot if the chat is empty. - * - * Returns True on success. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setmydescription - */ - setMyDescription(form = {}) { - return this._request('setMyDescription', { form }); - } - - /** - * Use this method to get the current bot description for the given user language. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Returns [BotDescription](https://core.telegram.org/bots/api#botdescription) on success. - * @see https://core.telegram.org/bots/api#getmydescription - */ - getMyDescription(form = {}) { - return this._request('getMyDescription', { form }); - } - - /** - * Use this method to change the bot's short description, which is shown on the bot's profile page - * and is sent together with the link when users share the bot. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Returns True on success. - * @see https://core.telegram.org/bots/api#setmyshortdescription - */ - setMyShortDescription(form = {}) { - return this._request('setMyShortDescription', { form }); - } - - /** - * Use this method to get the current bot short description for the given user language. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Returns [BotShortDescription](https://core.telegram.org/bots/api#botshortdescription) on success. - * @see https://core.telegram.org/bots/api#getmyshortdescription - */ - getMyShortDescription(form = {}) { - return this._request('getMyShortDescription', { form }); - } - - /** - * Use this method to change the bot's menu button in a private chat, or the default menu button. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setchatmenubutton - */ - setChatMenuButton(form = {}) { - return this._request('setChatMenuButton', { form }); - } - - /** - * Use this method to get the current value of the bot's menu button in a private chat, or the default menu button. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} [MenuButton](https://core.telegram.org/bots/api#menubutton) on success - * @see https://core.telegram.org/bots/api#getchatmenubutton - */ - getChatMenuButton(form = {}) { - return this._request('getChatMenuButton', { form }); - } - - /** - * Use this method to change the default administrator rights requested by the bot when it's added as an administrator to groups or channels. - * - * These rights will be suggested to users, but they are are free to modify the list before adding the bot. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#getchatmenubutton - */ - setMyDefaultAdministratorRights(form = {}) { - return this._request('setMyDefaultAdministratorRights', { form }); - } - - /** - * Use this method to get the current default administrator rights of the bot. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} [ChatAdministratorRights](https://core.telegram.org/bots/api#chatadministratorrights) on success - * @see https://core.telegram.org/bots/api#getmydefaultadministratorrights - */ - getMyDefaultAdministratorRights(form = {}) { - return this._request('getMyDefaultAdministratorRights', { form }); - } - - /** - * Use this method to edit text or [game](https://core.telegram.org/bots/api#games) messages sent by the bot or via the bot (for inline bots). - * - * Note: that **you must provide one of chat_id, message_id, or inline_message_id** in your request. - * - * @param {String} text New text of the message - * @param {Object} [options] Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) - * @return {Promise} On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned - * @see https://core.telegram.org/bots/api#editmessagetext - */ - editMessageText(text, form = {}) { - form.text = text; - return this._request('editMessageText', { form }); - } - - /** - * Use this method to edit captions of messages sent by the bot or via the bot (for inline bots). - * - * Note: You **must provide one of chat_id, message_id, or inline_message_id** in your request. - * - * @param {String} caption New caption of the message - * @param {Object} [options] Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) - * @return {Promise} On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned - * @see https://core.telegram.org/bots/api#editmessagecaption - */ - editMessageCaption(caption, form = {}) { - form.caption = caption; - return this._request('editMessageCaption', { form }); - } - - /** - * Use this method to edit animation, audio, document, photo, or video messages. - * - * If a message is a part of a message album, then it can be edited only to a photo or a video. - * - * Otherwise, message type can be changed arbitrarily. When inline message is edited, new file can't be uploaded. - * Use previously uploaded file via its file_id or specify a URL. - * - * Note: You **must provide one of chat_id, message_id, or inline_message_id** in your request. - * - * @param {Object} media A JSON-serialized object for a new media content of the message - * @param {Object} [options] Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) - * @return {Promise} On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned - * @see https://core.telegram.org/bots/api#editmessagemedia - */ - editMessageMedia(media, form = {}) { - const regexAttach = /attach:\/\/.+/; - - if (typeof media.media === 'string' && regexAttach.test(media.media)) { - const opts = { - qs: form, - }; - - opts.formData = {}; - - const payload = Object.assign({}, media); - delete payload.media; - - try { - const attachName = String(0); - const [formData] = this._formatSendData( - attachName, - media.media.replace('attach://', ''), - media.fileOptions - ); - - if (formData) { - opts.formData[attachName] = formData[attachName]; - payload.media = `attach://${attachName}`; - } else { - throw new errors.FatalError(`Failed to process the replacement action for your ${media.type}`); - } - } catch (ex) { - return Promise.reject(ex); - } - - opts.qs.media = stringify(payload); - - return this._request('editMessageMedia', opts); - } - - form.media = stringify(media); - - return this._request('editMessageMedia', { form }); - } - - /** - * Use this method to edit a checklist on behalf of a business connection. - * @param {Number|String} businessConnectionId Unique identifier for the target business connection - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {Number} messageId Unique identifier for the target message - * @param {Object} checklist A JSON-serialized object for the new checklist - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) object is returned. - * @see https://core.telegram.org/bots/api#editmessagechecklist - */ - editMessageChecklist(businessConnectionId, chatId, messageId, checklist, form = {}) { - form.business_connection_id = businessConnectionId; - form.chat_id = chatId; - form.message_id = messageId; - form.checklist = stringify(checklist); - return this._request('editMessageChecklist', { form }); - } - - /** - * Use this method to edit only the reply markup of messages sent by the bot or via the bot (for inline bots). - * - * Note: You **must provide one of chat_id, message_id, or inline_message_id** in your request. - * - * @param {Object} replyMarkup A JSON-serialized object for an inline keyboard. - * @param {Object} [options] Additional Telegram query options (provide either one of chat_id, message_id, or inline_message_id here) - * @return {Promise} On success, if the edited message is not an inline message, the edited [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned - * @see https://core.telegram.org/bots/api#editmessagetext - */ - editMessageReplyMarkup(replyMarkup, form = {}) { - form.reply_markup = replyMarkup; - return this._request('editMessageReplyMarkup', { form }); - } - - - /** - * Use this method to stop a poll which was sent by the bot. - * - * @param {Number|String} chatId Unique identifier for the group/channel - * @param {Number} pollId Identifier of the original message with the poll - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the stopped [Poll](https://core.telegram.org/bots/api#poll) is returned - * @see https://core.telegram.org/bots/api#stoppoll - */ - stopPoll(chatId, pollId, form = {}) { - form.chat_id = chatId; - form.message_id = pollId; - return this._request('stopPoll', { form }); - } - - /** - * Use this method to send static .WEBP, [animated](https://telegram.org/blog/animated-stickers) .TGS, - * or [video](https://telegram.org/blog/video-stickers-better-reactions) .WEBM stickers. - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String|stream.Stream|Buffer} sticker A file path, Stream or Buffer. - * Can also be a `file_id` previously uploaded. Stickers are WebP format files. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) is returned - * @see https://core.telegram.org/bots/api#sendsticker - */ - sendSticker(chatId, sticker, options = {}, fileOptions = {}) { - const opts = { - qs: options - }; - opts.qs.chat_id = chatId; - try { - const sendData = this._formatSendData('sticker', sticker, fileOptions); - opts.formData = sendData[0]; - opts.qs.sticker = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('sendSticker', opts); - } - - /** - * Use this method to get a sticker set. - * - * @param {String} name Name of the sticker set - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, a [StickerSet](https://core.telegram.org/bots/api#stickerset) object is returned - * @see https://core.telegram.org/bots/api#getstickerset - */ - getStickerSet(name, form = {}) { - form.name = name; - return this._request('getStickerSet', { form }); - } - - /** - * Use this method to get information about custom emoji stickers by their identifiers. - * - * @param {Array} custom_emoji_ids List of custom emoji identifiers. At most 200 custom emoji identifiers can be specified. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} Array of [Sticker](https://core.telegram.org/bots/api#sticker) objects. - * @see https://core.telegram.org/bots/api#getcustomemojistickers - */ - getCustomEmojiStickers(customEmojiIds, form = {}) { - form.custom_emoji_ids = stringify(customEmojiIds); - return this._request('getCustomEmojiStickers', { form }); - } - - /** - * Use this method to upload a file with a sticker for later use in *createNewStickerSet* and *addStickerToSet* methods (can be used multiple - * times). - * - * @param {Number} userId User identifier of sticker file owner - * @param {String|stream.Stream|Buffer} sticker A file path or a Stream with the sticker in .WEBP, .PNG, .TGS, or .WEBM format. Can also be a `file_id` previously uploaded. - * @param {String} stickerFormat Allow values: `static`, `animated` or `video` - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} On success, a [File](https://core.telegram.org/bots/api#file) object is returned - * @see https://core.telegram.org/bots/api#uploadstickerfile - */ - uploadStickerFile(userId, sticker, stickerFormat = 'static', options = {}, fileOptions = {}) { - const opts = { - qs: options, - }; - opts.qs.user_id = userId; - opts.qs.sticker_format = stickerFormat; - - try { - const sendData = this._formatSendData('sticker', sticker, fileOptions); - opts.formData = sendData[0]; - opts.qs.sticker = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('uploadStickerFile', opts); - } - - /** - * Use this method to create new sticker set owned by a user. - * - * The bot will be able to edit the created sticker set. - * - * You must use exactly one of the fields *png_sticker*, *tgs_sticker*, or *webm_sticker* - * - * @param {Number} userId User identifier of created sticker set owner - * @param {String} name Short name of sticker set, to be used in `t.me/addstickers/` URLs (e.g., *"animals"*). Can contain only english letters, digits and underscores. - * Must begin with a letter, can't contain consecutive underscores and must end in `"_by_"`. `` is case insensitive. 1-64 characters. - * @param {String} title Sticker set title, 1-64 characters - * @param {String|stream.Stream|Buffer} pngSticker Png image with the sticker, must be up to 512 kilobytes in size, - * dimensions must not exceed 512px, and either width or height must be exactly 512px. - * @param {String} emojis One or more emoji corresponding to the sticker - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#createnewstickerset - */ - createNewStickerSet(userId, name, title, pngSticker, emojis, options = {}, fileOptions = {}) { - const opts = { - qs: options, - }; - opts.qs.user_id = userId; - opts.qs.name = name; - opts.qs.title = title; - opts.qs.emojis = emojis; - opts.qs.mask_position = stringify(options.mask_position); - try { - const sendData = this._formatSendData('png_sticker', pngSticker, fileOptions); - opts.formData = sendData[0]; - opts.qs.png_sticker = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('createNewStickerSet', opts); - } - - /** - * Use this method to add a new sticker to a set created by the bot. - * - * You must use exactly one of the fields *png_sticker*, *tgs_sticker*, or *webm_sticker* - * - * Animated stickers can be added to animated sticker sets and only to them - * - * Note: - * - Emoji sticker sets can have up to 200 sticker - * - Static or Animated sticker sets can have up to 120 stickers - * - * @param {Number} userId User identifier of sticker set owner - * @param {String} name Sticker set name - * @param {String|stream.Stream|Buffer} sticker Png image with the sticker (must be up to 512 kilobytes in size, - * dimensions must not exceed 512px, and either width or height must be exactly 512px, [TGS animation](https://core.telegram.org/stickers#animated-sticker-requirements) - * with the sticker or [WEBM video](https://core.telegram.org/stickers#video-sticker-requirements) with the sticker. - * @param {String} emojis One or more emoji corresponding to the sticker - * @param {String} stickerType Allow values: `png_sticker`, `tgs_sticker`, or `webm_sticker`. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#addstickertoset - */ - addStickerToSet(userId, name, sticker, emojis, stickerType = 'png_sticker', options = {}, fileOptions = {}) { - const opts = { - qs: options, - }; - opts.qs.user_id = userId; - opts.qs.name = name; - opts.qs.emojis = emojis; - opts.qs.mask_position = stringify(options.mask_position); - - if (typeof stickerType !== 'string' || ['png_sticker', 'tgs_sticker', 'webm_sticker'].indexOf(stickerType) === -1) { - return Promise.reject(new Error('stickerType must be a string and the allow types is: png_sticker, tgs_sticker, webm_sticker')); - } - - try { - const sendData = this._formatSendData(stickerType, sticker, fileOptions); - opts.formData = sendData[0]; - opts.qs[stickerType] = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('addStickerToSet', opts); - } - - /** - * Use this method to move a sticker in a set created by the bot to a specific position. - * - * @param {String} sticker File identifier of the sticker - * @param {Number} position New sticker position in the set, zero-based - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setstickerpositioninset - */ - setStickerPositionInSet(sticker, position, form = {}) { - form.sticker = sticker; - form.position = position; - return this._request('setStickerPositionInSet', { form }); - } - - /** - * Use this method to delete a sticker from a set created by the bot. - * - * @param {String} sticker File identifier of the sticker - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#deletestickerfromset - * @todo Add tests for this method! - */ - deleteStickerFromSet(sticker, form = {}) { - form.sticker = sticker; - return this._request('deleteStickerFromSet', { form }); - } - - /** - * Use this method to replace an existing sticker in a sticker set with a new one - * - * @param {Number} user_id User identifier of the sticker set owner - * @param {String} name Sticker set name - * @param {String} sticker File identifier of the sticker - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#replacestickerinset - * @todo Add tests for this method! - */ - replaceStickerInSet(userId, name, oldSticker, form = {}) { - form.user_id = userId; - form.name = name; - form.old_sticker = oldSticker; - return this._request('deleteStickerFromSet', { form }); - } - - - /** - * Use this method to change the list of emoji assigned to a regular or custom emoji sticker. - * - * The sticker must belong to a sticker set created by the bot. - * - * @param {String} sticker File identifier of the sticker - * @param { Array } emojiList A JSON-serialized list of 1-20 emoji associated with the sticker - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setstickeremojilist - */ - setStickerEmojiList(sticker, emojiList, form = {}) { - form.sticker = sticker; - form.emoji_list = stringify(emojiList); - return this._request('setStickerEmojiList', { form }); - } - - /** - * Use this method to change the list of emoji assigned to a `regular` or `custom emoji` sticker. - * - * The sticker must belong to a sticker set created by the bot. - * - * @param {String} sticker File identifier of the sticker - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setstickerkeywords - */ - setStickerKeywords(sticker, form = {}) { - form.sticker = sticker; - if (form.keywords) { - form.keywords = stringify(form.keywords); - } - return this._request('setStickerKeywords', { form }); - } - - /** - * Use this method to change the [mask position](https://core.telegram.org/bots/api#maskposition) of a mask sticker. - * - * The sticker must belong to a sticker set created by the bot. - * - * @param {String} sticker File identifier of the sticker - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setstickermaskposition - */ - setStickerMaskPosition(sticker, form = {}) { - form.sticker = sticker; - if (form.mask_position) { - form.mask_position = stringify(form.mask_position); - } - return this._request('setStickerMaskPosition', { form }); - } - - /** - * Use this method to set the title of a created sticker set. - * - * The sticker must belong to a sticker set created by the bot. - * - * @param {String} name Sticker set name - * @param {String} title Sticker set title, 1-64 characters - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setstickersettitle - */ - setStickerSetTitle(name, title, form = {}) { - form.name = name; - form.title = title; - return this._request('setStickerSetTitle', { form }); - } - - /** - * Use this method to add a thumb to a set created by the bot. - * - * Animated thumbnails can be set for animated sticker sets only. Video thumbnails can be set only for video sticker sets only - * - * @param {Number} userId User identifier of sticker set owner - * @param {String} name Sticker set name - * @param {String|stream.Stream|Buffer} thumbnail A .WEBP or .PNG image with the thumbnail, - * must be up to 128 kilobytes in size and have width and height exactly 100px, - * a TGS animation with the thumbnail up to 32 kilobytes in size or a WEBM video with the thumbnail up to 32 kilobytes in size. - * - * Pass a file_id as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram - * to get a file from the Internet, or upload a new one. Animated sticker set thumbnails can't be uploaded via HTTP URL. - * @param {Object} [options] Additional Telegram query options - * @param {Object} [fileOptions] Optional file related meta-data - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setstickersetthumbnail - */ - setStickerSetThumbnail(userId, name, thumbnail, options = {}, fileOptions = {}) { - const opts = { - qs: options, - }; - opts.qs.user_id = userId; - opts.qs.name = name; - opts.qs.mask_position = stringify(options.mask_position); - try { - const sendData = this._formatSendData('thumbnail', thumbnail, fileOptions); - opts.formData = sendData[0]; - opts.qs.thumbnail = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - return this._request('setStickerSetThumbnail', opts); - } - - - /** - * Use this method to set the thumbnail of a custom emoji sticker set. - * - * The sticker must belong to a sticker set created by the bot. - * - * @param {String} name Sticker set name - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#setcustomemojistickersetthumbnail - */ - setCustomEmojiStickerSetThumbnail(name, form = {}) { - form.name = name; - return this._request('setCustomEmojiStickerSetThumbnail', { form }); - } - - /** - * Use this method to delete a sticker set that was created by the bot. - * - * The sticker must belong to a sticker set created by the bot. - * - * @param {String} name Sticker set name - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#deletestickerset - */ - deleteStickerSet(name, form = {}) { - form.name = name; - return this._request('deleteStickerSet', { form }); - } - - /** - * Send answers to an inline query. - * - * Note: No more than 50 results per query are allowed. - * - * @param {String} inlineQueryId Unique identifier of the query - * @param {InlineQueryResult[]} results An array of results for the inline query - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, True is returned - * @see https://core.telegram.org/bots/api#answerinlinequery - */ - answerInlineQuery(inlineQueryId, results, form = {}) { - form.inline_query_id = inlineQueryId; - form.results = stringify(results); - return this._request('answerInlineQuery', { form }); - } - - /** - * Use this method to set the result of an interaction with a [Web App](https://core.telegram.org/bots/webapps) - * and send a corresponding message on behalf of the user to the chat from which the query originated. - * - * @param {String} webAppQueryId Unique identifier for the query to be answered - * @param {InlineQueryResult} result object that represents one result of an inline query - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, a [SentWebAppMessage](https://core.telegram.org/bots/api#sentwebappmessage) object is returned - * @see https://core.telegram.org/bots/api#answerwebappquery - */ - answerWebAppQuery(webAppQueryId, result, form = {}) { - form.web_app_query_id = webAppQueryId; - form.result = stringify(result); - return this._request('answerWebAppQuery', { form }); - } - - /** - * Use this method to send an invoice. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} title Product name, 1-32 characters - * @param {String} description Product description, 1-255 characters - * @param {String} payload Bot defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. - * @param {String} providerToken Payments provider token, obtained via `@BotFather` - * @param {String} currency Three-letter ISO 4217 currency code - * @param {Array} prices Breakdown of prices - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) is returned - * @see https://core.telegram.org/bots/api#sendinvoice - */ - sendInvoice(chatId, title, description, payload, providerToken, currency, prices, form = {}) { - form.chat_id = chatId; - form.title = title; - form.description = description; - form.payload = payload; - form.provider_token = providerToken; - form.currency = currency; - form.prices = stringify(prices); - form.provider_data = stringify(form.provider_data); - if (form.suggested_tip_amounts) { - form.suggested_tip_amounts = stringify(form.suggested_tip_amounts); - } - return this._request('sendInvoice', { form }); - } - - /** - * Use this method to create a link for an invoice. - * - * @param {String} title Product name, 1-32 characters - * @param {String} description Product description, 1-255 characters - * @param {String} payload Bot defined invoice payload - * @param {String} providerToken Payment provider token - * @param {String} currency Three-letter ISO 4217 currency code - * @param {Array} prices Breakdown of prices - * @param {Object} [options] Additional Telegram query options - * @returns {Promise} The created invoice link as String on success. - * @see https://core.telegram.org/bots/api#createinvoicelink - */ - createInvoiceLink(title, description, payload, providerToken, currency, prices, form = {}) { - form.title = title; - form.description = description; - form.payload = payload; - form.provider_token = providerToken; - form.currency = currency; - form.prices = stringify(prices); - return this._request('createInvoiceLink', { form }); - } - - /** - * Use this method to reply to shipping queries. - * - * If you sent an invoice requesting a shipping address and the parameter is_flexible was specified, - * the Bot API will send an [Update](https://core.telegram.org/bots/api#update) with a shipping_query field to the bot - * - * @param {String} shippingQueryId Unique identifier for the query to be answered - * @param {Boolean} ok Specify if delivery of the product is possible - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, True is returned - * @see https://core.telegram.org/bots/api#answershippingquery - */ - answerShippingQuery(shippingQueryId, ok, form = {}) { - form.shipping_query_id = shippingQueryId; - form.ok = ok; - form.shipping_options = stringify(form.shipping_options); - return this._request('answerShippingQuery', { form }); - } - - /** - * Use this method to respond to such pre-checkout queries - * - * Once the user has confirmed their payment and shipping details, the Bot API sends the final confirmation in the form of - * an [Update](https://core.telegram.org/bots/api#update) with the field *pre_checkout_query*. - * - * **Note:** The Bot API must receive an answer within 10 seconds after the pre-checkout query was sent. - * - * @param {String} preCheckoutQueryId Unique identifier for the query to be answered - * @param {Boolean} ok Specify if every order details are ok - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, True is returned - * @see https://core.telegram.org/bots/api#answerprecheckoutquery - */ - answerPreCheckoutQuery(preCheckoutQueryId, ok, form = {}) { - form.pre_checkout_query_id = preCheckoutQueryId; - form.ok = ok; - return this._request('answerPreCheckoutQuery', { form }); - } - - /** - * Use this method to get the current Telegram Stars balance of the bot. - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns a [StarAmount](https://core.telegram.org/bots/api#staramount) object - * @see https://core.telegram.org/bots/api#getmystarbalance - */ - getMyStarBalance(form = {}) { - return this._request('getMyStarBalance', { form }); - } - - /** - * Use this method for get the bot's Telegram Star transactions in chronological order - * - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns a [StarTransactions](https://core.telegram.org/bots/api#startransactions) object - * @see https://core.telegram.org/bots/api#getstartransactions - */ - getStarTransactions(form = {}) { - return this._request('getStarTransactions', { form }); - } - - /** - * Use this method for refund a successful payment in [Telegram Stars](https://t.me/BotNews/90) - * - * @param {Number} userId Unique identifier of the user whose payment will be refunded - * @param {String} telegramPaymentChargeId Telegram payment identifier - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, True is returned - * @see https://core.telegram.org/bots/api#refundstarpayment - */ - refundStarPayment(userId, telegramPaymentChargeId, form = {}) { - form.user_id = userId; - form.telegram_payment_charge_id = telegramPaymentChargeId; - return this._request('refundStarPayment', { form }); - } - - /** - * Allows the bot to cancel or re-enable extension of a subscription paid in Telegram Stars. - * - * @param {Number} userId Unique identifier of the user whose subscription will be canceled or re-enabled - * @param {String} telegramPaymentChargeId Telegram payment identifier for the subscription - * @param {Boolean} isCanceled True, if the subscription should be canceled, False, if it should be re-enabled - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, True is returned - * @see https://core.telegram.org/bots/api#cancelrenewsubscription - */ - editUserStarSubscription(userId, telegramPaymentChargeId, isCanceled, form = {}) { - form.user_id = userId; - form.telegram_payment_charge_id = telegramPaymentChargeId; - form.is_canceled = isCanceled; - return this._request('editUserStarSubscription', { form }); - } - - /** - * Use this method to send a game. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) - * @param {String} gameShortName name of the game to be sent. Set up your games via `@BotFather`. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, the sent [Message](https://core.telegram.org/bots/api#message) is returned - * @see https://core.telegram.org/bots/api#sendgame - */ - sendGame(chatId, gameShortName, form = {}) { - form.chat_id = chatId; - form.game_short_name = gameShortName; - return this._request('sendGame', { form }); - } - - /** - * Use this method to set the score of the specified user in a game message. - * - * @param {Number} userId Unique identifier of the target user - * @param {Number} score New score value, must be non-negative - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, if the message is not an inline message, the [Message](https://core.telegram.org/bots/api#message) is returned, otherwise True is returned - * @see https://core.telegram.org/bots/api#setgamescore - */ - setGameScore(userId, score, form = {}) { - form.user_id = userId; - form.score = score; - return this._request('setGameScore', { form }); - } - - /** - * Use this method to get data for high score tables. - * - * Will return the score of the specified user and several of their neighbors in a game. - * - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns an Array of [GameHighScore](https://core.telegram.org/bots/api#gamehighscore) objects - * @see https://core.telegram.org/bots/api#getgamehighscores - */ - getGameHighScores(userId, form = {}) { - form.user_id = userId; - return this._request('getGameHighScores', { form }); - } - - - /** - * Use this method to delete a message, including service messages, with the following limitations: - * - A message can only be deleted if it was sent less than 48 hours ago. - * - A dice message can only be deleted if it was sent more than 24 hours ago. - * - Bots can delete outgoing messages in groups and supergroups. - * - Bots can delete incoming messages in groups, supergroups and channels. - * - Bots granted `can_post_messages` permissions can delete outgoing messages in channels. - * - If the bot is an administrator of a group, it can delete any message there. - * - If the bot has `can_delete_messages` permission in a supergroup, it can delete any message there. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format @channelusername) - * @param {Number} messageId Unique identifier of the target message - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#deletemessage - */ - deleteMessage(chatId, messageId, form = {}) { - form.chat_id = chatId; - form.message_id = messageId; - return this._request('deleteMessage', { form }); - } - - /** - * Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. - * - * @param {Number|String} chatId Unique identifier for the target chat or username of the target channel (in the format @channelusername) - * @param {Array} messageIds Identifiers of 1-100 messages to delete. See deleteMessage for limitations on which messages can be deleted - * @param {Object} [options] Additional Telegram query options - * @return {Promise} True on success - * @see https://core.telegram.org/bots/api#deletemessages - */ - deleteMessages(chatId, messageIds, form = {}) { - form.chat_id = chatId; - form.message_ids = stringify(messageIds); - return this._request('deleteMessages', { form }); - } - - /** - * Use this method to returns the list of gifts that can be sent by the bot to users and channel chats. - * - * @param {Object} [options] Additional Telegram query options. - * @return {Promise} On success, returns a [Gifts](https://core.telegram.org/bots/api#gifts) objects. - * @see https://core.telegram.org/bots/api#getavailablegifts - */ - getAvailableGifts(form = {}) { - return this._request('getAvailableGifts', { form }); - } - - /** - * Use this method to sends a gift to the given user or channel chat. - * - * @param {String} giftId Unique identifier of the gift - * @param {Object} [options] Additional Telegram query options. - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#getavailablegifts - */ - sendGift(giftId, form = {}) { - form.gift_id = giftId; - return this._request('sendGift', { form }); - } - - /** - * Use this method to sends a gift to the given user or channel chat. - * - * @param {Number} userId Unique identifier of the target user who will receive a Telegram Premium subscription. - * @param {Number} monthCount Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12. - * @param {String} starCount Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months. - * @param {Object} [options] Additional Telegram query options. - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#getavailablegifts - */ - giftPremiumSubscription(userId, monthCount, starCount, form = {}) { - form.user_id = userId; - form.month_count = monthCount; - form.star_count = starCount; - return this._request('giftPremiumSubscription', { form }); - } - - /** - * This method verifies a user [on behalf of the organization](https://telegram.org/verify#third-party-verification) which is represented by the bot. - * - * @param {Number} userId Unique identifier of the target user. - * @param {Object} [options] Additional Telegram query options. - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#verifyuser - */ - verifyUser(userId, form = {}) { - form.user_id = userId; - return this._request('verifyUser', { form }); - } - - /** - * This method verifies a chat [on behalf of the organization](https://telegram.org/verify#third-party-verification) which is represented by the bot. - * - * @param {Number} chatId Unique identifier of the target chat. - * @return {Promise} On success, returns true. - * @param {Object} [options] Additional Telegram query options. - * @see https://core.telegram.org/bots/api#verifychat - */ - verifyChat(chatId, form = {}) { - form.chat_id = chatId; - return this._request('verifyChat', { form }); - } - - /** - * This method removes verification from a user who is currently verified [on behalf of the organization](https://telegram.org/verify#third-party-verification) which is represented by the bot. - * - * @param {Number} userId Unique identifier of the target user - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#removeuserverification - */ - removeUserVerification(userId, form = {}) { - form.user_id = userId; - return this._request('removeUserVerification', { form }); - } - - /** - * This method removes verification from a chat who is currently verified [on behalf of the organization](https://telegram.org/verify#third-party-verification) which is represented by the bot. - * - * @param {Number} chatId Unique identifier of the target chat. - * @param {Object} [options] Additional Telegram query options. - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#removechatverification - */ - removeChatVerification(chatId, form = {}) { - form.chat_id = chatId; - return this._request('removeChatVerification', { form }); - } - - /** - * This method marks incoming message as read on behalf of a business account. - * - * Requires the **can_read_messages** business bot right - * - * @param {String} businessConnectionId Unique identifier of the business connection on behalf of which to read the message. - * @param {Number} chatId Unique identifier of the chat in which the message was received. The chat must have been active in the last 24 hours. - * @param {Number} messageId Unique identifier of the message to mark as read. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#readbusinessmessage - */ - readBusinessMessage(businessConnectionId, chatId, messageId, form = {}) { - form.business_connection_id = businessConnectionId; - form.chat_id = chatId; - form.message_id = messageId; - return this._request('readBusinessMessage', { form }); - } - - /** - * This method delete messages on behalf of a business account. - * - * Requires the **can_delete_outgoing_messages** business bot right to delete messages sent by the bot itself, or the **can_delete_all_messages business** bot right to delete any message. - * - * @param {String} businessConnectionId Unique identifier of the business connection on behalf of which to delete the message. - * @param {Number[]} messageIds List of 1-100 identifiers of messages to delete. All messages **must be from the same chat**. - * @param {Object} [options] Additional Telegram query options. - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#deletebusinessmessages - */ - deleteBusinessMessages(businessConnectionId, messageIds, form = {}) { - form.business_connection_id = businessConnectionId; - form.message_ids = stringify(messageIds); - return this._request('deleteBusinessMessages', { form }); - } - - /** - * This method changes the first and last name of a managed business account. - * - * Requires the **can_change_name** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {String} firstName The new value of the first name for the business account; 1-64 characters. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#setbusinessaccountname - */ - setBusinessAccountName(businessConnectionId, firstName, form = {}) { - form.business_connection_id = businessConnectionId; - form.first_name = firstName; - return this._request('setBusinessAccountName', { form }); - } - - /** - * This method changes the username of a managed business account. - * - * Requires the **can_change_username** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#setbusinessaccountusername - */ - setBusinessAccountUsername(businessConnectionId, form = {}) { - form.business_connection_id = businessConnectionId; - return this._request('setBusinessAccountUsername', { form }); - } - - /** - * This method changes the bio of a managed business account. - * - * Requires the **can_change_bio** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#setbusinessaccountbio - */ - setBusinessAccountBio(businessConnectionId, form = {}) { - form.business_connection_id = businessConnectionId; - return this._request('setBusinessAccountBio', { form }); - } - - /** - * This method changes the profile photo of a managed business account. - * - * Requires the **can_edit_profile_photo** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {String|stream.Stream|Buffer} photo New profile photo. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#setbusinessaccountprofilephoto - */ - setBusinessAccountProfilePhoto(businessConnectionId, photo, options = {}) { - const opts = { - qs: options, - }; - - opts.qs.business_connection_id = businessConnectionId; - - try { - const sendData = this._formatSendData('photo', photo); - opts.formData = sendData[0]; - opts.qs.photo = sendData[1]; - } catch (ex) { - return Promise.reject(ex); - } - - return this._request('setBusinessAccountProfilePhoto', opts); - } - - /** - * This method removes the current profile photo of a managed business account. - * - * Requires the **can_edit_profile_photo** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#removebusinessaccountprofilephoto - */ - removeBusinessAccountProfilePhoto(businessConnectionId, form = {}) { - form.business_connection_id = businessConnectionId; - return this._request('removeBusinessAccountProfilePhoto', { form }); - } - - /** - * This method changes the privacy settings pertaining to incoming gifts in a managed business account. - * - * Requires the **can_change_gift_settings** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Boolean} showGiftButton Pass True, if a button for sending a gift to the user or by the business account must always be shown in the input field. - * @param {Object} acceptedGiftTypes Types of gifts accepted by the business account. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns true. - * @see https://core.telegram.org/bots/api#setbusinessaccountgiftsettings - */ - setBusinessAccountGiftSettings(businessConnectionId, showGiftButton, acceptedGiftTypes, form = {}) { - form.business_connection_id = businessConnectionId; - form.show_gift_button = showGiftButton; - form.accepted_gift_types = acceptedGiftTypes; - return this._request('setBusinessAccountGiftSettings', { form }); - } - - /** - * This method returns the amount of Telegram Stars owned by a managed business account. - * - * Requires the **can_view_gifts_and_stars** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns [StarAmount](https://core.telegram.org/bots/api#staramount). - * @see https://core.telegram.org/bots/api#getbusinessaccountstarbalance - */ - getBusinessAccountStarBalance(businessConnectionId, form = {}) { - form.business_connection_id = businessConnectionId; - return this._request('getBusinessAccountStarBalance', { form }); - } - - /** - * This method transfers Telegram Stars from the business account balance to the bot's balance. - * - * Requires the **can_transfer_stars** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Number} starCount Number of Telegram Stars to transfer; 1-10000. - * @param {Object} [options] Additional Telegram query options. - * @return {Promise} On success, returns True. - * @see https://core.telegram.org/bots/api#transferbusinessaccountstars - */ - transferBusinessAccountStars(businessConnectionId, startCount, form = {}) { - form.business_connection_id = businessConnectionId; - form.star_count = startCount; - return this._request('transferBusinessAccountStars', { form }); - } - - /** - * This method returns the gifts received and owned by a managed business account. - * - * Requires the **can_view_gifts_and_stars** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns [OwnedGifts](https://core.telegram.org/bots/api#ownedgifts). - * @see https://core.telegram.org/bots/api#getbusinessaccountgifts - */ - getBusinessAccountGifts(businessConnectionId, form = {}) { - form.business_connection_id = businessConnectionId; - return this._request('getBusinessAccountGifts', { form }); - } - - /** - * This method converts a given regular gift to Telegram Stars. - * - * Requires the **can_convert_gifts_to_stars** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {String} ownedGiftId Unique identifier of the regular gift that should be converted to Telegram Stars. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns True. - * @see https://core.telegram.org/bots/api#convertgifttostars - */ - convertGiftToStars(businessConnectionId, ownedGiftId, form = {}) { - form.business_connection_id = businessConnectionId; - form.owned_gift_id = ownedGiftId; - return this._request('convertGiftToStars', { form }); - } - - /** - * This method upgrades a given regular gift to a unique gift. - * - * Requires the **can_transfer_and_upgrade_gifts** business bot right. - * Additionally requires the **can_transfer_stars** business bot right **if the upgrade is paid**. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {String} ownedGiftId Unique identifier of the regular gift that should be upgraded to a unique one. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns True. - * @see https://core.telegram.org/bots/api#upgradegift - */ - upgradeGift(businessConnectionId, ownedGiftId, form = {}) { - form.business_connection_id = businessConnectionId; - form.owned_gift_id = ownedGiftId; - return this._request('upgradeGift', { form }); - } - - /** - * This method transfers an owned unique gift to another user. - * - * Requires the **can_transfer_and_upgrade_gifts** business bot right. - * Additionally requires the **can_transfer_stars** business bot right **if the transfer is paid**. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {String} ownedGiftId Unique identifier of the regular gift that should be transferred. - * @param {Number} newOwnerChatId Unique identifier of the chat which will own the gift. The chat **must be active in the last 24 hours**. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns True. - * @see https://core.telegram.org/bots/api#transfergift - */ - transferGift(businessConnectionId, ownedGiftId, newOwnerChatId, form = {}) { - form.business_connection_id = businessConnectionId; - form.owned_gift_id = ownedGiftId; - form.new_owner_chat_id = newOwnerChatId; - return this._request('transferGift', { form }); - } - - /** - * This method posts a story on behalf of a managed business account. - * - * Requires the **can_manage_stories** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Array} content [InputStoryContent](https://core.telegram.org/bots/api#inputpaidmedia). The photo/video property can be String, Stream or Buffer. - * @param {Number} activePeriod Unique identifier of the chat which will own the gift. The chat **must be active in the last 24 hours**. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns [Story](https://core.telegram.org/bots/api#story). - * @see https://core.telegram.org/bots/api#poststory - */ - postStory(businessConnectionId, content, activePeriod, options = {}) { - const opts = { - qs: options, - }; - - opts.qs.business_connection_id = businessConnectionId; - opts.qs.active_period = activePeriod; - - try { - const inputHistoryContent = content; - opts.formData = {}; - - if (!content.type) { - return Promise.reject(new Error('content.type is required')); - } - - const { formData, fileIds } = this._formatSendMultipleData(content.type, [content]); - - opts.formData = formData; - - if (fileIds[0]) { - inputHistoryContent[content.type] = fileIds[0]; - } else { - inputHistoryContent[content.type] = `attach://${content.type}_0`; - } - - opts.qs.content = stringify(inputHistoryContent); - } catch (ex) { - return Promise.reject(ex); - } - - return this._request('postStory', opts); - } - - /** - * This method edits a story previously posted by the bot on behalf of a managed business account. - * - * Requires the **can_manage_stories** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Number} storyId Unique identifier of the story to edit. - * @param {Array} content [InputStoryContent](https://core.telegram.org/bots/api#inputpaidmedia). The photo/video property can be String, Stream or Buffer. - * @param {Object} [options] Additional Telegram query options - * @return {Promise} On success, returns [Story](https://core.telegram.org/bots/api#story). - * @see https://core.telegram.org/bots/api#editstory - */ - editStory(businessConnectionId, storyId, content, options = {}) { - const opts = { - qs: options, - }; - - opts.qs.business_connection_id = businessConnectionId; - opts.qs.story_id = storyId; - - try { - const inputHistoryContent = content; - opts.formData = {}; - - if (!content.type) { - return Promise.reject(new Error('content.type is required')); - } - - const { formData, fileIds } = this._formatSendMultipleData(content.type, [content]); - - opts.formData = formData; - - if (fileIds[0]) { - inputHistoryContent[content.type] = fileIds[0]; - } else { - inputHistoryContent[content.type] = `attach://${content.type}_0`; - } - - opts.qs.content = stringify(inputHistoryContent); - } catch (ex) { - return Promise.reject(ex); - } - - return this._request('editStory', opts); - } - - - /** - * This method deletes a story previously posted by the bot on behalf of a managed business account. - * - * Requires the **can_manage_stories** business bot right. - * - * @param {String} businessConnectionId Unique identifier of the business connection. - * @param {Number} storyId Unique identifier of the story to delete. - * @param {Object} [options] Additional Telegram query options. - * @return {Promise} On success, returns True. - * @see https://core.telegram.org/bots/api#deletestory - */ - deleteStory(businessConnectionId, storyId, form = {}) { - form.business_connection_id = businessConnectionId; - form.story_id = storyId; - return this._request('deleteStory', { form }); - } - -} - -module.exports = TelegramBot; diff --git a/src/telegramPolling.js b/src/telegramPolling.js deleted file mode 100644 index 9e6cf904..00000000 --- a/src/telegramPolling.js +++ /dev/null @@ -1,202 +0,0 @@ -const errors = require('./errors'); -const debug = require('debug')('node-telegram-bot-api'); -const deprecate = require('./utils').deprecate; -const ANOTHER_WEB_HOOK_USED = 409; - - -class TelegramBotPolling { - /** - * Handles polling against the Telegram servers. - * @param {TelegramBot} bot - * @see https://core.telegram.org/bots/api#getting-updates - */ - constructor(bot) { - this.bot = bot; - this.options = (typeof bot.options.polling === 'boolean') ? {} : bot.options.polling; - this.options.interval = (typeof this.options.interval === 'number') ? this.options.interval : 300; - this.options.params = (typeof this.options.params === 'object') ? this.options.params : {}; - this.options.params.offset = (typeof this.options.params.offset === 'number') ? this.options.params.offset : 0; - this.options.params.timeout = (typeof this.options.params.timeout === 'number') ? this.options.params.timeout : 10; - if (typeof this.options.timeout === 'number') { - deprecate('`options.polling.timeout` is deprecated. Use `options.polling.params` instead.'); - this.options.params.timeout = this.options.timeout; - } - this._lastUpdate = 0; - this._lastRequest = null; - this._abort = false; - this._pollingTimeout = null; - } - - /** - * Start polling - * @param {Object} [options] - * @param {Object} [options.restart] - * @return {Promise} - */ - start(options = {}) { - if (this._lastRequest) { - if (!options.restart) { - return Promise.resolve(); - } - return this.stop({ - cancel: true, - reason: 'Polling restart', - }).then(() => { - return this._polling(); - }); - } - return this._polling(); - } - - /** - * Stop polling - * @param {Object} [options] Options - * @param {Boolean} [options.cancel] Cancel current request - * @param {String} [options.reason] Reason for stopping polling - * @return {Promise} - */ - stop(options = {}) { - if (!this._lastRequest) { - return Promise.resolve(); - } - const lastRequest = this._lastRequest; - this._lastRequest = null; - clearTimeout(this._pollingTimeout); - if (options.cancel) { - const reason = options.reason || 'Polling stop'; - lastRequest.cancel(reason); - return Promise.resolve(); - } - this._abort = true; - return lastRequest.finally(() => { - this._abort = false; - }); - } - - /** - * Return `true` if is polling. Otherwise, `false`. - */ - isPolling() { - return !!this._lastRequest; - } - - /** - * Handle error thrown during polling. - * @private - * @param {Error} error - */ - _error(error) { - if (!this.bot.listeners('polling_error').length) { - return console.error('error: [polling_error] %j', error); // eslint-disable-line no-console - } - return this.bot.emit('polling_error', error); - } - - /** - * Invokes polling (with recursion!) - * @return {Promise} promise of the current request - * @private - */ - _polling() { - this._lastRequest = this - ._getUpdates() - .then(updates => { - this._lastUpdate = Date.now(); - debug('polling data %j', updates); - updates.forEach(update => { - this.options.params.offset = update.update_id + 1; - debug('updated offset: %s', this.options.params.offset); - try { - this.bot.processUpdate(update); - } catch (err) { - err._processing = true; - throw err; - } - }); - return null; - }) - .catch(err => { - debug('polling error: %s', err.message); - if (!err._processing) { - return this._error(err); - } - delete err._processing; - /* - * An error occured while processing the items, - * i.e. in `this.bot.processUpdate()` above. - * We need to mark the already-processed items - * to avoid fetching them again once the application - * is restarted, or moves to next polling interval - * (in cases where unhandled rejections do not terminate - * the process). - * See https://github.com/yagop/node-telegram-bot-api/issues/36#issuecomment-268532067 - */ - if (!this.bot.options.badRejection) { - return this._error(err); - } - const opts = { - offset: this.options.params.offset, - limit: 1, - timeout: 0, - }; - return this.bot.getUpdates(opts).then(() => { - return this._error(err); - }).catch(requestErr => { - /* - * We have been unable to handle this error. - * We have to log this to stderr to ensure devops - * understands that they may receive already-processed items - * on app restart. - * We simply can not rescue this situation, emit "error" - * event, with the hope that the application exits. - */ - /* eslint-disable no-console */ - const bugUrl = 'https://github.com/yagop/node-telegram-bot-api/issues/36#issuecomment-268532067'; - console.error('error: Internal handling of The Offset Infinite Loop failed'); - console.error(`error: Due to error '${requestErr}'`); - console.error('error: You may receive already-processed updates on app restart'); - console.error(`error: Please see ${bugUrl} for more information`); - /* eslint-enable no-console */ - return this.bot.emit('error', new errors.FatalError(err)); - }); - }) - .finally(() => { - if (this._abort) { - debug('Polling is aborted!'); - } else { - debug('setTimeout for %s miliseconds', this.options.interval); - this._pollingTimeout = setTimeout(() => this._polling(), this.options.interval); - } - }); - return this._lastRequest; - } - - /** - * Unset current webhook. Used when we detect that a webhook has been set - * and we are trying to poll. Polling and WebHook are mutually exclusive. - * @see https://core.telegram.org/bots/api#getting-updates - * @private - */ - _unsetWebHook() { - debug('unsetting webhook'); - return this.bot._request('setWebHook'); - } - - /** - * Retrieve updates - */ - _getUpdates() { - debug('polling with options: %j', this.options.params); - return this.bot.getUpdates(this.options.params) - .catch(err => { - if (err.response && err.response.statusCode === ANOTHER_WEB_HOOK_USED) { - return this._unsetWebHook().then(() => { - return this.bot.getUpdates(this.options.params); - }); - } - throw err; - }); - } -} - -module.exports = TelegramBotPolling; diff --git a/src/telegramWebHook.js b/src/telegramWebHook.js deleted file mode 100644 index a8a8f8ba..00000000 --- a/src/telegramWebHook.js +++ /dev/null @@ -1,158 +0,0 @@ -const errors = require('./errors'); -const debug = require('debug')('node-telegram-bot-api'); -const https = require('https'); -const http = require('http'); -const fs = require('fs'); -const bl = require('bl'); - -class TelegramBotWebHook { - /** - * Sets up a webhook to receive updates - * @param {TelegramBot} bot - * @see https://core.telegram.org/bots/api#getting-updates - */ - constructor(bot) { - this.bot = bot; - this.options = (typeof bot.options.webHook === 'boolean') ? {} : bot.options.webHook; - this.options.host = this.options.host || '0.0.0.0'; - this.options.port = this.options.port || 8443; - this.options.https = this.options.https || {}; - this.options.healthEndpoint = this.options.healthEndpoint || '/healthz'; - this._healthRegex = new RegExp(this.options.healthEndpoint); - this._webServer = null; - this._open = false; - this._requestListener = this._requestListener.bind(this); - this._parseBody = this._parseBody.bind(this); - - if (this.options.key && this.options.cert) { - debug('HTTPS WebHook enabled (by key/cert)'); - this.options.https.key = fs.readFileSync(this.options.key); - this.options.https.cert = fs.readFileSync(this.options.cert); - this._webServer = https.createServer(this.options.https, this._requestListener); - } else if (this.options.pfx) { - debug('HTTPS WebHook enabled (by pfx)'); - this.options.https.pfx = fs.readFileSync(this.options.pfx); - this._webServer = https.createServer(this.options.https, this._requestListener); - } else if (Object.keys(this.options.https).length) { - debug('HTTPS WebHook enabled by (https)'); - this._webServer = https.createServer(this.options.https, this._requestListener); - } else { - debug('HTTP WebHook enabled'); - this._webServer = http.createServer(this._requestListener); - } - } - - /** - * Open WebHook by listening on the port - * @return {Promise} - */ - open() { - if (this.isOpen()) { - return Promise.resolve(); - } - return new Promise((resolve, reject) => { - this._webServer.listen(this.options.port, this.options.host, () => { - debug('WebHook listening on port %s', this.options.port); - this._open = true; - return resolve(); - }); - - this._webServer.once('error', (err) => { - reject(err); - }); - }); - } - - /** - * Close the webHook - * @return {Promise} - */ - close() { - if (!this.isOpen()) { - return Promise.resolve(); - } - return new Promise((resolve, reject) => { - this._webServer.close(error => { - if (error) return reject(error); - this._open = false; - return resolve(); - }); - }); - } - - /** - * Return `true` if server is listening. Otherwise, `false`. - */ - isOpen() { - // NOTE: Since `http.Server.listening` was added in v5.7.0 - // and we still need to support Node v4, - // we are going to fallback to 'this._open'. - // The following LOC would suffice for newer versions of Node.js - // return this._webServer.listening; - return this._open; - } - - /** - * Handle error thrown during processing of webhook request. - * @private - * @param {Error} error - */ - _error(error) { - if (!this.bot.listeners('webhook_error').length) { - return console.error('error: [webhook_error] %j', error); // eslint-disable-line no-console - } - return this.bot.emit('webhook_error', error); - } - - /** - * Handle request body by passing it to 'callback' - * @private - */ - _parseBody(error, body) { - if (error) { - return this._error(new errors.FatalError(error)); - } - - let data; - try { - data = JSON.parse(body.toString()); - } catch (parseError) { - return this._error(new errors.ParseError(parseError.message)); - } - - return this.bot.processUpdate(data); - } - - /** - * Listener for 'request' event on server - * @private - * @see https://nodejs.org/docs/latest/api/http.html#http_http_createserver_requestlistener - * @see https://nodejs.org/docs/latest/api/https.html#https_https_createserver_options_requestlistener - */ - _requestListener(req, res) { - debug('WebHook request URL: %s', req.url); - debug('WebHook request headers: %j', req.headers); - - if (req.url.indexOf(this.bot.token) !== -1) { - if (req.method !== 'POST') { - debug('WebHook request isn\'t a POST'); - res.statusCode = 418; // I'm a teabot! - res.end(); - } else { - req - .pipe(bl(this._parseBody)) - .on('finish', () => res.end('OK')); - } - } else if (this._healthRegex.test(req.url)) { - debug('WebHook health check passed'); - res.statusCode = 200; - res.end('OK'); - } else { - debug('WebHook request unauthorized'); - res.statusCode = 401; - res.end(); - } - } -} - -module.exports = TelegramBotWebHook; diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index a2d36ebf..00000000 --- a/src/utils.js +++ /dev/null @@ -1,3 +0,0 @@ -const util = require('util'); -// Native deprecation warning -exports.deprecate = (msg) => util.deprecate(() => { }, msg, 'node-telegram-bot-api')(); diff --git a/test/README.md b/test/README.md deleted file mode 100644 index fa6f19f0..00000000 --- a/test/README.md +++ /dev/null @@ -1,31 +0,0 @@ -Running the tests: - -```bash -# Token to be used -export TEST_TELEGRAM_TOKEN= - -# User Id which you want to send the messages. -export TEST_USER_ID= - -# Group Id which to use in some of the tests, e.g. for TelegramBot#getChat() -export TEST_GROUP_ID= - -# Game short name to use in some tests, e.g. TelegramBot#sendGame() -# Defaults to "medusalab_test". -export TEST_GAME_SHORT_NAME= - -# Sticker set name to use in some tests, e.g. TelegramBot#getStickerSet() -# Defaults to "pusheen". -export TEST_STICKER_SET_NAME= - -# Payment provider token to be used -export TEST_PROVIDER_TOKEN= - -# Run ALL tests -npm run test - -# Run individual tests -npm run eslint # static-analysis -npm run mocha # mocha tests -``` -Note: The bot must be an administrator in the chat for this to work and must have the appropriate admin rights. \ No newline at end of file diff --git a/test/data/audio.mp3 b/test/data/audio.mp3 deleted file mode 100644 index 11cd7852e35845033b215306e50a20a2da32f926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52864 zcmeGDbyU;uA3u!0HU^AQBc&NII;Be*q`OPH1f^49ba$6@hk%R}MMX-HkZuu?R+JDB zxwrS{`~Ca(_wPRUbZZ(XB z|L;~`_3r=O8Y*l3->rqJ;s4oU{``OI|6dunz0Pp@|Ml$V?vGqC-yy}kz5u|73jhyF zNCGFPqM>I(u(5OU2ndOYNlM?7S602Rp{-|NWNL0{W9Q)H;^Fzo$3H0KNkn9HTw-!+ zdRA_JVacyMO%i*Xf_DzyC15#iXsM zqbedGCFKh#!9F6N0|1C2kho8D08lITIbw&K60jfqzk1zX4`KuaS^^flAOH*_g`edB zh(tfr;xa!An8|4D2HSx^C@W z8U%=L|9sgS#C%E?k69={IJZetjHeH&F^&?#{P#5~v9^KE*@&dJda@$C+NHn3p1S{E zMT;h+TIPKYqPk5Uhe*_(pr>3UN@=`-hKR5#m;B6zEL9K}U(Ap|T_6oDTnKyMY-Ufz zOg(%MZ1uwG`x|9`jVRS;^mvQWKUejGFN zHaw83QDb_h(sdQQ>MZ^@TrvHtjJE>&84*LPcwL|$T}Dp=hlpO>bUC&9{-pm;DK)0a z8f9Y@8SlV|myn=(Ds`&Rq~JQLw>D&I3u z?Z`LwL5cdG1Ixffc0b#oZkhX%I}uD`6XQHQ>TmGyV_=A3$xnHF(`stBVTYO31r#Oa zNE3;s*~+P>+85M`$6n&$2l;_zG|HdzEkU$>?txa;o`XW3{xRdMfQqJlWWAgk$78bC zH|Qjifrk|;ln+Bj*6CLbL!{FfU))~zYv#Y%D6M)uS3S;_P!9q? z#&b(op)3g>q<@4Rg{B#G{d^XKHbk?F~G zW{I=hpig=?_)K3J*6d~v8WU9LP57pa>5)Vg&<-v!`xf#x_UNtKYdfcX0IWr`5OEIyW45Dvxe0)v=G+f< zki+FEagCku6iI=*O=^{LT{610XN%Fv`c4$QerCVP)-sY^So@7!toKZc&z@J9*(dHv zj#g5?bIE(}W>yGf1U!bRs314XHm}F6dz@^oZv8e~`gVTZE?j;%y8S0~8AHA?dE4=K zIeS&*gRr?K!L-8V6@wf&8z#M1P9bkB{wCipwb%-`EG(zh`PZ*G^i%DXe}9w8UO(#G zqO^U@CBQ6Ua^f-7S)cl8w}7y%vBAbdp^XwYWalO8?hpR6 znFOFf|InhTIpF$X`z0YcJoPjpi;P;eC^69J9-Vi% zKD~R0Rst)5k2IjCM(e2Nr}Lt4ZD?MO)!RtZxH87Ufg6%q{gp|^jh7~|VeNeBIIvr# z+K?Ck5km_zA{9&_n?5eA9`T7E@ysZ@BXgdwIox9&ue!850w)9q#i-99GeiR!N%g+` ziIWiV{a#x~lFN;2ZwFeU?Dy6k+kTLQyksH3l5m6qo6F6gaKr6*>ymyzSf8nTPTFs$ z=mFIzUMvaGZxo$lb#3W%`;$d{d1q@M?_JTiJ>*V-Mv6PUJ1w*vtX^J{zE_-~ksi?` z+xq^;?|B1#3guZ5)=ytEKu4M7uaa;CSb4kDr6qOSrIYI&3VYwN)OB)PCi_?mR$?xbs?{b;ED^*y?2xc2qh^<@D;evq|wQ=7Rx2p0wK0k4?i{fo_z%?i6cxj!foRy zJ%2NjpjiSt3OC0;GYIf>dJyo|jP@)70G5P90L&}95W+$=g)E2NVo>9+DqD82m%U9|o9 zrP&eysP4T$;Q0ADn?yT$%KfESqWBGbJB&{3t8Zu$ax1iiI!GeQ!Y ziWS{W)ii8Ni_cf&(`y)w`iSV$eC0+?(vKs~4z*tW{e0?5MjHAf5e)}e_K5j^n7D%8 zB;hADxlDX8npxGfM{`TK9YCl<3U06Uoz799UsUs#hqUSlJ4;UpD*&|%usKA!mS^B` z`(tcEzRh{tOdxp(-&00LQO$OTt~~w$+Fiwp*1u71PJ0<`MUzT~`<|j_aRuy^38)!E z`B_fWSvV5CLYztwoHGmMiApvYs!>YqMgK4?v-%}&G3q}Da2Dm~nZ4QoWEt7e@3!t9 z>YB7|sYadflSz(y6HUfAwzpKpGLCY`19*_g9*(ILXu$R}!yOXGjGmtEU15luX)NbM zZ-DZQ1^-A6*4v^v(P?5|m|uex>K+R8lWsBOkglFxf$k~BOGAwl?RSU_xI$1KrvLz{ zx9je8J3EXhKyVZ`>5 zg9lrcf3hw;Q`3Cqtw*Y)pWFCqfgonE-GO&(Jpu1i3nWy74^V24!lV6_RqCSw_=7*^ zAN=?`LmLrxHXq4K7f>3&3JFP$MzpS@kU8|w<5^T+>MA><}+LbFEz}jqxa=DU=iXy86gQAp} z;u$Mx{D*XPm+BqU4)d3Sh#Xv=sQstvnlb+7YKz(|beRFN#~*02M(>n(qF!$4XOFBq ze34k`(0YUbRHEMDK$Wh3KUWi`jOKgI+an@N}ra!xB}XNB^Pf9yPj8^rQIJj?g?YTh$AsgnQk z>+)9AWA@_3aG}B=9Ydn#DuDA=yjwd2(UG)%uij|!T95R`=%LH1hk{AIn*%q04gg1q zB|Ar1Jeh0%;y)6As}_hn3Uk$(=rPuM>X9Dtx$e;bz+-drW$TNllt2}2lR2c^dP%1n z0CPM%ucFB_ZoQr2xGGF2+e@h?nyV;;!rT>rCt`P^l`Yqr^CC%bxG(|l(0=9t_s<*P^4zYk;0>Fbksa0aObFO(w#;ubYS+)Lh&;8e7 ze44$Eb9Vhks8=X()Al0NA>Raa3bG z-<;W<{jnZjsmfq#a7N~*tH-4Z9i6r=Wmj=zg1YS$wEq~^<*g{PYFGC)rwUkI6rkx) zG8sbwYvnXFLoHf%t}k|)Nfh1aJ^*N+2^_kzbpW`yx+GsS-J#(ujN;xwenzo-SUd+P z&`UOqac%jj9E zq`z?NwCo!kh`$1oJV6hhYTm>#`^V;Yvy(GoACHL9?os%(X58I3bHpGEJtgPQtul}R zV_>S`7ycXk<-Vz^lxIIuCtl1CUGzR`zm}ioLZpeK0uXpCLIg_8SUleW&sp3BB=?kcCou7{2+VPPvPPKREs+w-MIISPmh z+!foA!~rCG&FurZ<6kVgQnznKz6EcWu~Z_esByN3Mp#Zae3x+TyIp}?yx@@Evu%$u zUG@I4$kI^wJtJ+KdeWbjRB$U7SVg7dJw^aWl@HV`#ymD@#4#_(RTck`DTMH=VyX9` z&LS}wP9$JCYn)`|RwDoQ?$c@I^ha)3z`sSaR>6;&grjGq*h7cGv&LxbvqMkEJV>XF z)i;_{iyb2U-N^spK{DSTV@NT0c1tT^%R zeN9$l^46=7%&*;J=F^34r`8Q72yi@GH*tvZ%-iEy=2cSR$1crL*4~QD9=S@aV1Y^% zwp4nWXb;N1u8YamfJW=LKTNt=4=>Q4q#iUZMJ%isGOvv-f18t%h&3&ZB$9N_4w}F~SJOfZ> z)mt+Tf^2?KB~Pdp`N|quvPqza`$^f6e^4Q#$srS#gc|@1W}LO(qpL@h(|KY@fC>H9 zbD{BZ`v}|n2~UxA4YmE))iTd=KqB_`=#G$v=!1l^nHJI7n^3Z60E_-))* zaT42(;6cr4GIOq<3s3NbW|WyduMVy%iBBBVf+f-_UJMs{c&LRmCYYKI3JB2+7OND# zKTBjIFuWl#{vy>@fV9byCEt<2R~|3Y@Z|mj$C7Y`iGCRt{v6VT3T`z%g|JCNJIAcP zSKmkF10H`cfuF7@_)ATx<&3i+E;$w9)(*7`1LRbUOX4e)r5(H3!_pEfZLTC}Z&d z@D;CU9%?mJ+$GLi*jNfk|5dSM){)v2O9pXEj(09fx~qWHl_Vg=L2U=w4&mFz9HH0c z2kf5}5GmYNWfD2gRmvrEC)rq>mR!@((GgN1OU>7D&R)9?h7r96$J; zQ!CT`>z)(g#awS(`C9{c*KQFRN=XA=pM*zL^5Tp@wc-0xbQghm?!w2W5TabC4O0RfZuif^}o08!L zd$`I6zCuYKP5*X4ap2K!P8eR%30ux{)<qS+hHz>*BcVlxzYYMR?O~I3vVSp{{zBHDEa}-#Rdj4{ULWs2-_5(}8&sdBmI4k7; zXR`re!n{njs7I-R-sc=npVxn9RUKW7AEArQX3l=>QUNAz!m!g`o`o@@y%&35w;d|k z$riKOx3ceBpta~yBswKs)mNI zd~8N{e1a&wb@H-i3N`hhJ0V_ghiX9U$q_q3J+3)GZcV^OYV!5Bbw9q%B))wAsTj8p z0`|;7gCN>G^dv!~YApUPEMxjJ*3kb2z|uVCA(4#gEG)|<04ou`Ta#5BLVGh6kLMI) z6M{BKBX)Lm&J)1end~Ph-gSV5G~0#>$SZN{Zd}~oP3d+?q^h0g^YQ-Zh$y^y6>@!h zS<^Xo5FwHF6J=}byYltsvEBWPBu>P5QmRlj?eZ1ieM->qX^G_Y#}$pUT*$%?mgT5q zOw1iB#?J!)kAG5w16NbQ01Cii1Lendga4*hN8`)dc+cj)5DQR`vSCZi^k(?nn6x#Q zQn4I+p=&4o{sP2L-B6FgW9M`n38to8x;(U4DXbtF4`$c+R=%0eMO+zLwtC#-_OEU8&hFto? zC{-Ot$GCWk?jX^0j1^K&((PnyoCpbh$@+#R||fW4+x^d*{yI09P8cIXn&lX|LMakf0kE zKFV(d5J>a8xT61lN-{h-V7+S(S2U~gp~SaMGb5!4agH~*&Yk1047xdzv-FRq<~vOu zAb6ZqY9ClCx_zm%1MC|RpcN?94Ov7!ECR9B1?t&%o7+diu8t`WRF;ig*61ShmjVD3 zdlHV=D?3EuW_bLh0AKkDNvV&U@?2gdoc&%KzdWvrK`J!|A1>D&STR95Y3%s(mCrTl ztXX4PQgwI%x7R4AZzu?@#KI$22uf?av1Q~XfDb6Tzsx})k^#OT6aWcR>8~wW_yZvG zIt}>MPMO>>%Mi#e!K>q>Zl7i2wUu6Bv=Fv@Tc==XgytY?cG*f?fJ~n!0lnUXk8L6Zt zI}{~v=`SKVC;YPeH0eBR;|BmEx-W*79akoKG9fTus^1T~vR{>BL|4taNX3DB*W zI)GLw?RefAhmMMVBH>%kQTwWB*Mf2@F=i#T? z^!_Uw?{5$`sW>CO*M9+4&{QC>siXh>o?Cs0zX+|N)#+L+pqZzob;I|vs~|Z1$(~TJ zx(;iC!mHr{uS~Cevx7E(*jz`+GMCD0v$PXmkL&XxE~BfjwK>!{bPpVip+ zPK7pu;=ZhN2g!}Pg|YwGT4e}k9^E6|2sz&KDtR&f&`6&)^xhr(A=Nhl z-FNbp#E>bSSttPFK?HBT4&L%jKO1x z+a34wLvDSS(BK9bfJ{j27FS~Po2hspyB}m`Pm^>pFAyI;2D;n3@Q_;mU3IO-vnsG! zC+oYo&A!ye8Bv;c=!2%8C1Zd86xK%zJ_=RjPP_xF>JBF{SoY<&QsjiWQ@jmm@0Myp zV}*K!0u2yZxE%_av#{_IL)ZxMiDGSPiF9{EP`ucpz+;nn)mT%zY&qwK`|qvYq$o#0 zkquiDT)oyv)WY0t7zBOqi@Vo25*+nz0r-$%DFq}dFcEUjRt9<8v<4_->;N_mW zu_CXaf+F)h#iXZIyk4Fj28Y~*S&sh6R+RJo&lpk|doA|l-WB`NBRX2&JU*PQJr=>@ z`GX>R!MYT@N8`qdpliVj6_RRIonpY{h2p{D5vJL7!Y7OthY_guM)Q|LlCpfM=K6j!%TJOSJLYRzW8 zkxrTppp(Mj!P`zWs>2jH+yM7Z44&tr%JYSPz85RMef###Ni82P3yP-jv2*l&ItChn z-2y%sP`f?MzZ_sY1oiy)eqA*N9_d!A*RlaHQDjp)k`v7DF$sn=T0*~)on@=>JxSK; z0;}*{N7;KM5scu15i;LmA)CwKJZ&E4N#5%(>QIyQJC~dQF1e#QUx$Z~*MSw~;0mwf zW$1UbVev6x1;+z#dvoB81EZ+#CeYAkP&{1XKu8Pv8lO!w{RxZbFN&;}V%9y5PME12 zhD|k~r};+lZLV&Saqdo-u%eFaqQ`*Ra3V1={1dfA*_-Fxxt-&Dsg?0?>->GM{daYF z2u1h!bf;i|@@pN9x*9PQmc%;9L*o}vY;^u>y;^*RrwWlBoa^Ph3Xtu6wcUQJl#B~D z{^M+1&`y2&2VUT2d&|qBEF+vxI-gQy`#kJ}bHKO=?y}v@1jmxkV3e1uh8jSd-Rt(7 zZK!l03e!62`GSppW%Zxq=gsp%e{kR}osZvi;) zp+J!R_ZlL*2yoM1pqf%IqcsL^HnsFzIo0@XgVMn}wo8XgZwJ=abULn02a~EY%_Z{6 z410WPkHG1XLGXoW7Az&1NIGWT{^O4^7N&n`RSUCEAs&$+`=A>0)dJv-%IVKB=_So# zA3+V)^K{-Sxoknl;X*R07jEqd1MmK3lvjb z+JDFBTkL;500b)Q!qoht)4~>JuZ?KEve3Pxmyw7jHbU!7Is09oyWj>{b-lu7PC5JM-!&Q6*ojP_IFtS$2z%uN0$9QJMn~HbJ~Lcjp}% zPee4pi;Wdo%WmYaEtHZau5ooDUre-xD*VE0wnN#7@V#_PnUCQNISS-ipta;j>;Rcg z98a_BM&C;gA~>Ht7Q60pJ(`XB*wRp8N)l*(wcz|KVPpB@FA5>ez<#E zd&bB?xAjcp(`viM=|5u_l3+sDb3&U7i{}ymt+Shjd|{AgLC|4(8X$c5J^Sx%?-5~u z$0;0u9HOaynulk09%t<|-58wYk~GQ<%TM(CYD5HhX`T8iBx&Okj&`vL;s=0shMvREHv@tJtQnMI;A+i`un}dYp`Eeswb}57+BVU#srKqA|}W2tR{F7qW^JBIQj> z5cNgffzpD_JrC_=^i1T4_+zh!QeO#c$Xrl7#So#ocF=P2(^g?k2;Mzccg1f5f?jVg zubJoC&zbuN8a?b()8*vNPN#YU0`pvL$Z;hhNOEO6jrNg5-30A&S}HQtoS%ovJn#8Y zH~cDSL{Qy{)Q-~VyUb@vF_Dk4B>Y5y`AO#XQtk?KgRW8`93)U{E3;apD^Q)lBMMLG zDU+M!6UgT89fm&>SlE_(n|xqe5RYGfO$Qtx)1CH1bOO8gX6(4Q#Ldt4jb_-G zM@7({hi4-5NN;t0S&{)=A(6SH(AvBp%Q0vVNC9qGuE7*tVaP+|nLuTA#{@|#TvGsh{Y8uR$;xf+gWM3e3Vd9}-P5$Ylq^xO)H!;WhhSJqlz3JeZgiSW?Za z=CzNE5|#)$VRrbLS9^}qhrAS#w?hH+O%C+P3J8(Q3!7(OJ$rWO$2Zz-8X}$&NLm_O{`3uw#Kb{Gl zT%kTnza6fdA1TE(K3hVkR4Qr$^^Qm_^mLSDdQH#Al$lm~r!Q@xlu1Tf735uN5!{B4 zf2ygpdfd;x{(dpXP^*n4;Ti>2VKKc-q|-+Nu-6#W1SJ!gdWGU(BYu3l4AXl3etTutIY1;7B$~Z*6&59<`ZtdhuKdpLwEN51Q$W()Ad& zs@oc4NJS~6**sF)AWbN}7tMCZqsLP-fMU6IKok2ccsRMpgaA$WlBTm>|l;qm_LP}$sk1M~6kQy4ynrg40s6uDmG98w@TX=Yh z{%Geaqvad`d4nb43IMYZErf7r0$iJPSjPp`*0I4jF5m?|uPl(@&D>AB%P(*}z76w^ zSKGM$TmHi9eyBwC9@@}99cCwZUBw&g*w%l{>JM^ra0Jg;kKpEbcjl>v~zr*GJizCF932puD*TA$e<6_ux z^Se-U{Vc(kBFQeHv2kN85Ku`o9M93#RJyb_CMWKQ3#jq%RhLj*a}Liqclch7Ae^|z z_V_0xasShkmNyg1?|viSjhk7dtFMUfC`O62gNoz`E=+RA4=!_OU6rg_&{NfrC;gw2 zPa2m9l*QU76o~9E?jBRaOcdiwShGmF7y4c+uQ-0R`j#M}$%90F)0A=k3qn$oe|sN5 zWnHH95pQh&tLo^LsyRmzSwF3#LMBTN7fTLptlQ-#EbREf4G)*X69U;|EjJWT9AE## zdw}SYamD}9gkb6UYc@(A!APEG_ylZFPb=3$p~mt=$bmm)NlJSAuOKNN)=kFdBqoF8 zz$eZDx0cVt3*cnR>{$;Kh;cyks}La~jYxx&O7)qmnoaJNOm&qan6x&@={HC5TY7lB zZ`PcD&kTw0#_h^i-j%g)q4N%W$yVrbOZ{x3*wUv@V*;fQ%oi34z)8f!2d+V~U(eEU zqYK;no&SI)RcrXu`pCWYr!*@p-)jd_a4aix8ZAtHC3`Vaq`tjT);r5OwVOSlQk&j0 zbT?MH^IG{!KxCpZDv6P8;t$|R=N~*9o#3l@zr-+C4?j}*{b24qxd(-;vN#fv+wSIM zSe=K5b@_h)@Eyq|_dRkqj!j-cD8}VWPPo=W4C<5rm#l+wO{DlYPjSYg<5dQIw&3

%cwLFt$+VeMq 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 z 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 FV1mOX03!eZ diff --git a/test/data/photo.gif b/test/data/photo.gif deleted file mode 100644 index 1dfad4e71a1f3f90fc991ce155ea51cff82bbd48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20660 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 YDzEmcul_2q2CJ|RE3p>qlY{^OJLT4!n*aa+ diff --git a/test/data/photo.png b/test/data/photo.png deleted file mode 100644 index df5c81da9b26a8d8ad17c2bd3603186718657c88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14399 zcmV-FIKan=P)Px#KTu3mMd8`a-`2_R>*f3V`RL)+Mm;Cv+s{fsD*ylg zKsF!s^YE&pmx_aPR7^I;z_!!Q#9~-QZe~<^b78o$r<#+6lR~^W001BWNkl;iZJyZ~MRFS`I<055ZyWS@)Hz8f&~17r;Aq(Kb_VPt8?8kzW8iD}#BRUGJAbu`%)j zc$3jqg(|k0vqAi?0m}DXZ|R72EdQ?nchl>v_N5U2JAgbMLyu&-@%+s4<^+JOt%?Ip zJ0tU4o(1vS088H#2b)qh&lzLqF#ImS($vNArgS1m4F6?-+*HM9OdH8MlU)3x06&Kh z0M=Q~2K#C#e+!_9pTh@1?7U*_l7R8AGKOe}S1t@%_z5~!d0?0lrCm#jKt@;YT zrvT9l#a{`q^p!4(UjPWHQ2ccOh5VNLy#VloYQjF~eqZDF0>F=@LiQ>5D|Au(62MP6 zA^VK`)n9bKN1e!b#N-121vgHA7hj>wD*&?(IN|XC%g}t={ayw5iA;DnKpv}ayC2$% z0FTdv2Lmj>S-foUz~h~e{q5?}jilR`0UoR+>@Qc39-w^#;GtoBAV9&+3EvK2{szIk z{6T7q$c3Ly+yM z|D?B7p*4M=QWx%TEChEG+zwF4ymiz8rw^p6lY0@f2jKRuZZkl^bBp-22H$h=*U6p8 zK7iW^vMr$-Vrz}5318KE#<}#3R)1+BxNkPY-f}wTjcw9L$`$&YuKZ8}m~&(J{gLW1 z6V}%NmK>d~UdRM6oIc&3JW|c}0o+LN4&eO5qcf*l(sOm3J@sP*N##46o}qAD9kX4E z*=$+OSXe{N$&@^B@Olf+y2+b(nL*N zLAiQm!9zEr>*6$86%^3r_O)S5bMRgk$aRD$r>!QoEM2b5%(#_gZymES4R!z{;d1!f zgKAVdC2eqpHbScNYNdG}+&vI86;c}1TOF^c8hCdC_p%y*Z<>B9?Cv^d8^HvSJNoE+ z&qUS~MIm{#@XZRqVmP*iDFmE9AcpgI(;!h}2qdn2m+0vS zixATvGmJDCIy>I#cU-Ts5yN&@=9eA8cmTk+gP3&+G7*K5ORXNy2(%>!jn?$<$WXu` zmA~kM7`QFE-rm5=WFVD$YmeYz)gUA3oJHhdPv--=#%DIYiS< z)d%UVbtCg50KON*2+$*rm1jLAK{6a^pk;5P0PCt#<>#U6Y|P~`4ugq{T<{nbc{hkz zl8`O~G9SbEy{Fks6|6%{zL;u2Kx1zFc`c|QbV1;IZ^?Sk%Xavn#1*Y$ROHHO(?A=+Rr>4`2bH8EO(c2l!l1={eHY7Ww(QYPvd7^4t0nF~n{InJ<6hb=j^Y zIPXQUWu{qNjaQ60ckYw-hFy1O97oDjjCNbt^N^0t1*E)!= zNWO{%u}m{DzB-fve6!fi4vXJ02@abC2}Xz(y7)9fgg9xs3<DZEC>& zr&UH(GXglKz?;NXHr6`O(y|ZfdvdyfmcNaBR`3j^HP85(>uLoTu%6?yIlXKd)Gqm}i#ve|me81eM`ZW)OExRp`4SR#yS| zN~^SbY-`{Y9UqL7$>=?v&`h&P3S$8PJzaWS$(8Ses%MwOj!y8(G z{8$bTlx`L~1|5jNWj^I)$S|&-JnILhhBXk3mShlVINEO-yRgQoex|6NY^3hGzF|hJ zmT`$1i-T|+=srJcfp#@lf>9amZ=7Vz1=|K>YyZ^F@Fuxt1eF&!@-hKeps+KY2fubL zO_no{>w4AjE6?x0dMNnw2wUP-x_{`E23$p%N`Gep1w=?^rYC0yFMs0{$1+J}U?9Q@ z0#=|8>DWTJ$q@e7%!p23Fm8D+p|~u$Oo_jomXKQ6z%eaRR(j?h?{DgT{MF;ii}rHs zYIy|phDmT6I^4H|9LKd7fVtl$#V(kynL#rre()E?C>#qgHiHg8w&8PbBlCUI0_kq0I zhz?+w4pSpOtDkJybnW*!zt{SHrZ55=_;oS-Q}o6=eoKXeT9c`#mCe9H*E~g8%TgKG z?JX!FKCSFW3F<*HPWuEJOG{0-xHJIFCSwe%i=VX40n^NFrG!!wa*yYkw(R;Z!(v(_ z=dse^g>s&1hYOCiT;5z9nah*fo9# zGS5s05Lz%X?w!nUVw@zX%Hy%FORdLhSylWd^1A@0zFPgR1CoF$ZP~KJ@N`B!)UMzr zp_3Go<_irL@U+vUyUc(W$XGYbk{MKSs5c--IaDNK0#H}$S`K#++qYE*94f`1bU>;R z)N&oNj1_sFuGsoGRotz3KqoQ+1Q#0WIcR9d5MEs{Nw0t!Jg$ztzM^v8ry=;QU&=9y z-pX_f;KM4}A4);2$)N{sCji;B9EpDf2tNT0@Hl0edEg%w1kQ9o8ayoeg#jO62`_Ee zMF(?|PAJAWTmWR55W}kGSSK#ljiGI+xiR@F!0=l+u-kMdyGx(D*@$nx@9c@8e<*t! z0p6`v5Ay=76U()aLvg2+vk=B|Z8fX>DHTz!?njo?EvT@L4}LJ?ot4Q%XNzmcXRrhi zUQF~0J$+A08O>YJc0~X){$Qd2MR_e(RQR`4M0H)9@5+N|0*tfGKf3K(`z#yA;`um* zI#gnlNy@5z|7X1fz)q@czCYKK$<8LbmUM`Y19%nvhC+mu1p|*(U^q~m z3BVvioP09w^gjcDs#RiNlhM2CiQxYafKvXj>jZMQ=-f{jTW#9Zhj`I;$Li^{P+bP! zt^|;hGi;#&?F0cV^0X@3h`gu*#u{=7HHP^hlSS2i#{KYR<-@9hBF>n==Iu||-)1N{E5 z!XesN`UyaMY&mUvpyH36MjbSG$D(D6`~d7hekc4BIwjaRYh1tcaf^G4U1HsXIu}cD z9&Pt^e`0}{kfko42%vkz9)LSCrR5X>Y!P%3m9*}!blvz4g5Lm$*kO}2QOZSg>q;di zK?W@jJ5Zv!`hMLQ{3NqYD|;TrAWk2{BoD&omiy>#>w&3`3Vb95j&WcGpn(Q-OooB1 zFgEonFJ$_+WR5t9AXDQdPY{WzM`YvwX>DCW&LBL8qFXGA;0Zc{kSS5$efg}|y;@29 z+B2QDdAYouv8TWuz%zs~COHw`04xD??@~n65aS%cu=U=b-hvwePJ8bXJfIr%Lqd5C z-PnKK3PclcsC-&VPxC5ptqmBW%}@^FETJmJ54wF{;<-Oqz*>PnAs4Oyba;t0+mHc> z5T?f80A57F;;bb5f(Zyg8S9uMpyMMaT9vR7n+01FA^t}q84FVnscH2{^2q9#$4M6= z4gO)&0QIah-_%EvXO|(4rW9<&G3Svr3hW@DdSC~@w8z9rXx=v(;iF=BDBJ_B5iN_2 z$qePvr+(l>BPL2b#RYqEZHSHlfcySNT0Ffm^;LOC{-c4rkD0Fw`JPDYHK%tm0a ztnEk*q&KO16 zQ-Ao-H@09?UYEruuG%M70@)8!9!rOh>jPPEK_DvMS4LLMHP^Vtkc?7P;5|axlN9B6kP)%(fzAs{fs?1Mo%jr_vT~PcPtlE=dkRd$hL+lV z$p;CnULdDkqCF;R<*|LgG9%7~*yZly9|3(+*Q&4d7YB~NOYK#ptlQmLE`mG2(-}K# zT`-1)46=eLH+G2$tZXjYZRBGqviJFRUd^SV8UFXuRbW3ayu*D9o~-gg0yu;P+fp~U zrFos@cDQgSc~Q?AJmT(!O_O1+J@d*F%rRr6-L;osg62Asg)>Em|M zT#3EG#?yv)>&tQv?Jfq?Gwg4uP~MV7QLe2sn>^}M-XZvCjgtb)-{sN?i>~emt8NtR zNdReu#8!=46_UXq1+2yS`EOwYP5iEzsGc_R3?L_SD=KF}HSnKK)ZEl}O=-p)2P-LQ z*D2-aJjHb5vDb&U@hsufuzSpSj+h zwPc^<{dGS`(LT;LV&m{Q&`v6<32>-Ir+sNkTzsAlk||y|VLn2!ZW{72XP2I06(ZE( z@_00nI)UX${w1q&IUSylaH!(dS$bGCCLQBRRdaRq zwLSvSUq(bP;sC__0p6L5n^qZj>LBpQ9sFyH} z3vIm&W8ZH9TnYh0x8n>g%fgJg2=@YjYKg>g@>bPB26##?}eYnr$j3^bf z2jE$%aMZ|6hbaQ|Z`5fEQyS+H@D)pc=dO;xe?+v@L}G1d7;!5I z4uV3^9bNV#aD?FwzmK#1&!q!o+1tO!luxWF)oZ*tLV{L3;=ewlk|k% zO8||h`lhgpt4qp~oIn2#pu$!=hogtk6Z7jw0A@n7+u+a_SfrsSaJ>OAn2InQy>vA=a{ZRq0J7G(Vk*LTa0zuP(giSI2hm+J>H#dn z7*ZnO$;CjLrHrG9W5|od=$2C^N86{QJ!F``zW^}J9w6lnWn7F6!y~wm&dl3u0DUSV zcwjKh?*N=$0LUpCIZFAD)no63%VJk}Osp1U?pe^B8k)v44aJ$ErES6&lkbtZ(BP4X zLJcY5uK-di@=-pj`|10wrRom=Voe|~Sek-Y!AahWf~JaBDe7RHcCS$Z)Ml48AtcV| z>w=k*@Lg(fn#5M~weP0po zF|=Y=>3}WP=9EaP_=Z+b z!fUoGrvc0Jg5BYlAnS{Xl$Tr%NDL;{&6#gp$R7bjPZ5k`=;Bm`RqYeXCfsMQMdoGc3sPj<3JFR62UC$|G(9kfJB0%XvtSwb@y;RR?EeFgFrZKc9m>XsvY7D8?T2qXzAMX=6-MY)qw#ODd`q|s+L0BW@%N-Ig# z(t&ip-Q_@8W-OzlL)x&3bheI1mblK8{mFzJF`*eDmO~b!8Yzn;nnTFJTW|+JE=9r| zs~jtB_YJ1^Vgs3bT8p8t0RrzZ_g(HEVVdb!z}xQo#Hx7ar&l4DI*f_{q=W0~`#F;T z0j{rrzG^#6#5~JonK^{m11*mu0BfC6Dn*`wt9Dq5;BkgQ4INYw=3qqE)8QN5`PbG0Ex%xk=4Wp$Bwn0%wsy5?h;g%JPTtFNyxmm>c8Zgea~cJSe9$Ad)Qr(6RC0qokAI3z$nwMhBN z5S*6UYOpkqa%PT_ZV{0a~4H%9%9;^o8N*)`>+|vf6>c)4Iriq zy!NGQr3etafaGoIQ*>Er3k)?9-?ug52ki=J>|RGCXG>`hTz(rnW`~ zIfyzsb?EcmMf_UvSw@o+e%#)F{F{0too7=L>q743RAd%pov!-k~U0q?h1Ms!q0?C_Nm=hu)ix&@J8O=;9 zUueo;p*QjJCD#uCEK89vR`Soz$R2}5;Gq6621{aCtPmwvlXL?V&UMQz03fEo&$aK@ z)uZsHaFC&a*k@KJE_18fuEP7|43sb6&P1*myouRP>|2g-PQC{aN)cFU;?cTZuoO88 z9C&vnt(j?D{e0ohUp^!DVAj|ad{$2TP-+XBs9j<9M>xv^#n^SDDE`KWhLy*+$zCG;~2cmUuz*V323{*h_tf0%+gS+^sR#R=?+vbi{Wp_)T3 zZ`omFD$WcG9euYIB>4tFDn*)xK!DG<4DrDgmBR<2%XG0u1D&$QV;ds_mB8)vUjPqO z6e55mcA9ikk}BIyku52i8Xh4aA2+QO-vdyI<5I*-beuchve^X=K76<$I`vtr4uutP zRf8{tBT8BK1%Nwyp>zU6Gq56GcQnYw;v=x>M6tm60|0Si8-@bTSU zm%)y~I);KM#xdMIyVD%6(owIKb=OI^*DpQKL{q`RK$X*EkM7iLEYuhCc9H9#L zcUPCfhMU#lfS>`Ev;D^-=;XFJqB9$g3k@*IICLcpr0Bn8%APy>nN^plsrq~@m z5uQF<+1%V#TnZBzdq0Y}Q<)dKEVoWz0bu0{n_mHlGV&2Y*bviM6B6(4Go$Pmdx^a% z4+;YKZcn@YCm&GOazL5bK=%O*B6X0sZUKDW0<11@2<6OC-2<>X*F^P(@I++UWizsV>3W0Z0p0Zl2}`CC84@LcXwsVOT%v zI{Z6okoRls)#c-HuE}vkicblRksvMzAl!6u+-VU?n(bSEh z3joz`0CY8S44xsFoncd%-~T*vQ~?Z&M?n1sL8+3&8tS;Ir}m8{x!S8LEI(FAh|;bJ2gqoD5^%RVXpOpCjwJT1&+TouS(te$_OuqB9S`)pSJ;g zHr0+QQi6IA>a+Mz_dDPDy!WsHkc5cAEF8W@_}kh-PDzi^O)_Y9i-YML?z5vG_!#F} z1L>A`xYgw5xPoKkVc92R^#)7pB1~({CJL*60H|tB{hmTbSV&Lus8s;l4S+09gMGog%~MwO<~5^KH;AXTP>SZZNuvKCjI6J%emQ{AI0enMk|e z07&{KHmNX=CwmTb0;dANC#qmuvag1JS!%yp!Z688p`GBou+KTVhNJc#8$R1WLc+I! z)-hf|>7(O0S0>;svql2`4}12ATgqDac;8t(Z$uFygZAvTJospNOp%5`;$m?wmIH_$ zGQsA&eY_8u8zVZw=T?_>ua+nYP4I!#PKdrH+aJ@Y3Kgepx$t}i8`nqivWqA13_yKE z-}S$JI1A(9;}`tYXObW&0ECto{|4s%w2P$`(2TBqv584#s3i_kMKEaq&3^aVi21}m z;Kh`aXFpjlLH!57=Lvz_92i*;c5+%fxL!=n-T(-V0I){>C}CC;%7C<09O+aJuPlq2 z*kcMF&w1V(@O|J0u1JNcDCFF~094|}7ZD|z2?Q>2vy(664rQvkL33_JhYb#J(6@z~MT0xR|(0(kg) zHk;-iga_(pQJd${Uz9b@L$|(BG??Lg^zwst{uO{%cetS|3zsW9b}@BRnmE-@BYp+o z?j~uMFLlUF(i0nP6{Y30?;(M=?#pC8d2l^1pr@8cWwLFc!9@3wXI0Qf|xy6cNF-YNjQu9UEi2e zFOU4nk}DB^FAkm<%jC}hbmGKtDet%#+97x~MvoQqv#KAxMG<=+()a1vS)W&2c07(A zzdq2}QFc64{)C;4&afuXW`A*o)wQV-Jz8Wai27Uappk3qeu_c26Ar+ddlr521YQ7m z{0O4(EE$}EH=NmFhe<}V3j9?RalAlu*jo-0XMBIP@DX_)LRFoSox%|WaZa{QpOBZ` z)EoZ)1n}?kEI!SV zZU?pxDWs62VsmJRaXP6H&wt%v!;|}HRpYNrfgPqdq!7yu8#c1~1&UbMiUX2#m~B#b zo0?+beQ^Q8rE63!SAH5T)fWJ&qZbf5MsJn(T4%Tnj9r6nF^!sN<~y<>75Shkchk)4 zicz}hPC+i+^YiRa-W!bUqTYKLz}mTMJ~UN4SDq8kf8F6AsG3;VJ|&cNof|%FaM(z{ z&(81BFGmR`pdUTof}ESEQuk-6G`nVeL$ zNdfu)@-@-=#vH(g?tTFtUkT9W>G~lp(_h}>i}c|NzQu!4<2SCcP zvQg1Yp13l5!mAtPNTNDUo0DO#0B4wY=y~z?fe(}pURb#UlfQWg`|>p2dCQAK=)ME6 z9!9WRZ%4J-NBAIpb_$KKVW}THgx4|obfpG;uw|Y^X~$eb+K48Y;pXPepma+fCkwiW zWtuw_b<@Mg&xstBYw~aY{|&wd@PLDYWiD6}^j$wNgkz!=Eg&DCJcLby z^2k}iZbOTd64^iQu4_A1T#14Z!sPh>-#V(Gi0FoH@bSHVnl;PEVY^C|_qM|hAWhFR zpHc$?`Z)R`*B#1++XC1BlJra%6;nwvfJMfw?UF@=Ijf=OYh7(he(b^T0ZfMxNt=~< z-@{hPM%Vk5g-|JEkLO366z}nYCr2xj+Vlv76Z~FKUtND#L2$n%;Mf1`kCa3i4Oq@w zimas>4mkwr;0kjGI?yi2a!kPVR!HVOfQS3~y3CawlZYoE471amM0E>bn{Ves(k`RIL%h;4K8of1Z`lYrnG! zPIwJ?ATQjV0Z@lBT#G~62v^}K`BHq@C5VO43E@!~Inl&Cb>Sio!te}>`ePk3MRKto zLpbV}j@q} zrD{-$seO2rQFMLPZx%u*N!1x!Al6S0JDc_n(_8)68ikHB_T*F+5P7W}wxzcTVsuJ> z%>YjV*r-Gprn{K{zzl`XVP{QnMD7nZxX2a=yoTnZA$E%{$4hag_<$cV3Wo(E6zXo&|9K3Ysunm>@EEdf^mNGVFK2 z4U!L`8xxCQ6R0*LzT68m^oeU#zY{TbzYv(dYX_R8U95@gU~U7iG6~QHi$s@Rz|#Qk zO^|q?WF{z$0rDJaC$BZ1Uvj^r?4p(tWIyXd3n4Z+jIi@_-LZd-prh_7cs)%&jG5$r zZfjz5KMj-u+Os&Cco`bB=+&9QY|d8*7muK{c(GXs>Te>5Lql00l0mO+x;vPG17J2*zj`px*M7a0J z_|-_(LKXlAoum9Xf?NYIa$*#z>c{K=z}53Q%rXi-M&(&-o~7^ClGx$eQu!*Amd*nZ zz)VN@AUTP92$jh{+ix8B8h~LOp@Z~6$wLcl9B<%eT3tbTmuKm|%nrMEr3gNI7C?A^ z;b7Qg$9@k%j67uGmUlXZxj;T}iLj+fg<*O42D<-YMZCGZv(Y3EPOq>plftgtH~7ms zjv-_1%u%~D86bJBFg=91H`NGCh69!Ej~w_SfQ3keVf)_3Q8>s8O}CKCyRsYQQD26z ztAp9eysd+uCBceA85JT;Z=z`KCVQ3mkwyac%0qw>yzlql-`{ytb4FVI8HxMK&kPHliHX!zPb8+DD;02 zTkB8Zd2PkJg1GD;Nlc;r(t$4n=tp84ZC3hESnQ(+1mVqprMOs?-2%c-TUA>wH^GZ5 zuFJc1vpHy3!{oh0rVoV zi6XfeHuNE7eHO{Ex?NgB#VXXQnH^_?4rXVJq{Plb8`XGVE|d{1gAn6_)F$(Y_w5=O zpH_JsMkLLlKaS|k=-I8AP%8LyEQfND#_KYGO*Gn^_0Oe$f4p1``+@T=PO^^ymUzW9 zVU>Ur&#I^W47R$^FtjVOD1{C_LSjx1dGf)J2rX=iQRC{*vHUH;48?vEDa_Stg6q6< z!hZyjg#+2DK=dQ%NEdqmd7W@#4iu9^v|VR625B~&x;w(_O9(znNTiw3-!f?}-rHu+ z7W^$i4l3ysMi!3)=$x2nk+mPl4qAKKsj?oMe3SS|0ca9y3YxIzKS+B%uGCRxt$!z! zfmm7!KGP}%@O!{FN*rPi>=sdF6K@Gt$rMIi=Ha^zpobt`i|8Lj0A*EOZUs)|I&y<0 zegjRWOLa--=@Y9rLpx&g6TmFPGXkLi!g?cB0C3bwt*hkmUbtrjwfTS~pIb z%A_>y2j^6u0O+1ULJ+bF0dyYlvWFD4L4R=b0R(oYDPelynnGi)rx|Re*16;vfe<;| zGl(dFU@zY@JU0Zk8>|A<&J(hhviKzcy=M>zzc4x~0pkylbh9OgFA)mLq5**0zK)7k zJQ}+n>8%bZne$WFZ@G~9I`|i4u&P#TsJRAd`~r^Wm_Rwaft&9pnM!?fwDJ*vel|#& zc(AK2U=r-57mZ)7cAiPX8z`$V3P$TOX4G!Sd@kixad5iVy_{6C+991r%PN29VDI^owEze^4SZ5?G|!(!eW4kmuNR8;GCI8X!LOGO=1z zx-N{L@+#1f>%B2cE(atSfP0=AEDM++CpQA7L>ju8({ zW~0W&{J8N`i;*7w6kxE z+0-wmR^Ei)#{dTHX>AdhSWViESIji}!8buOw(X4CAP&Pe>26?g9gz8Wy!-dOND&f~ z6|O`VNDxYJ*uJ0a#lmXpHw15J-4x$DBMI;;ei^_3L8V$Wh)TOLzKN8eamUGu?`8B! z65CBW3i7~m;QJvTyA{e|=)y3WX<|nf0y0CG@yU`KT^iL^4c=zJGk=!UnWp^o>hW^` zgYK##g<9b6ql89B6^WWH@QPW%ngKj(u*sS((u&rwJK4nx#EyQ)!m!P!k5#gDt{jBH zWd(w#-@Ms^hhN)$>6`HT0>G$0twvl`ivibQ307gS5sgQF@7jz1=nd`JDtEslk zLfIU&VeIc`xe%e+ex>AYAVgM3IN#6t^w6H5R6VR3X4FT`?#Ayc0OK*8^}y=y26XFvbJ%&>KD4Dc)0_izQFH00OM^15NEZ# zmY7xd3FfcXf7O&br%O#Wr}EVuR$ztRNf@;YrZeDui{G~ZMk`0eB#tSegs@W9d&M)D zJ$Xizr`iX0GFMiwblfwa#CNu~SGkG6iS3*3@cS0P*aj7=os$MGaP!0nV!7YRMC--S ztWy8LOw-f5Qwd5#WZv7l4z4M3CFQx*rEl^39>5(TwxWp<#1e@GRp`YlmHScqAcY-^ z(hR2n%)A@pcRVI{#gBUc+-+?s!^jS+(V$ozm>}lGtK78@8k4iRi7*jRZZdoD<7@ox z0I(2yo?1)^bzP#3FrfN$4jid5r4brZ8XQcLV>=9RMa4sC6tUIibO2c(E*7+it+ckDW{)|996l!8D!T zG2DGTI->kT_}v8HkJxo5l`+DBu zWmr)Mq_@}hk>Ndw-QDi{0Dvhs2EDS`P$ri?69V_`%pu_O;N9%Lj{um6#?WcSGibLZ zZhM};W_Wi;-{$~K8les*-g;DBnN?o(i{L$Aeh&fo)1-_LW9~9z?XmJg>hEFqjQKqU zVA2S2*iE|}*Lt3R*!-RYFd2?BCiBex#fL1O`9+@s@W2TF)rS-h;rAebKgFMcP(23U zqW~WH@vnb82;aj1{s{;liM_uD;6H~@HpS2XHh_>7s{dQ~eg(jPW`(~1-+%4h(F%hw z425B6Mv=V#1CQD2b|*+ZCxbuu0Le#Er63Ujjx{vmH?M?G2Ph`&Ei{Fx0Oxn1>dr;R zCj}Hua&H;JlC*&PKB-6V>y^!C0ep0n<$4~#G0J^??`0TD@c?dfFYCHp?~ z`IZCxw*U}8009J$01!X`0VDtf5I_J4009ILKmtHbya9WF2+yh8sQmx{002ovPDHLk FV1mOX03!eZ diff --git a/test/data/sticker.png b/test/data/sticker.png deleted file mode 100644 index 971ebc13ae79494b5c7c2e8e7d47d00fe6b4cda4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52821 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�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

kvjzp#Yt3ZCyY-T~#2?UM)MO7Dgf8!qZej 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 diff --git a/test/data/sticker.webp b/test/data/sticker.webp deleted file mode 100644 index ba3944709274324e04c945bbf68ba757cfeb9729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92312 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 XFgh?WJzwl000000NkvXXu0mjf)QLJt diff --git a/test/data/video.mp4 b/test/data/video.mp4 deleted file mode 100644 index 8b2dbd80e313117ffca1eb6e0c53f18c1f79f394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199611 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 Q!EY_uT>hlv|{Q4MAdQM59b<)ZT zNmH%)CPCQG)9xM<|a_uTB8d{J`x%U7bqAxUi*HR&99_>$2c$ckxDejEedE^lelEcKAxHo+Uq~J4o27clE=zK>Af1t30yL{!L`7$ZF?>hnX>S3#PHD- zvFmc!U|u$Z^=9FjlFFE)Bp}ns;T-P9 zdC4JBddiF+@wm}4NI&X7Y-Cqs7UCdGEqW*#RbZqFw|{aedjn^{3nasT-V)z=^Uj|j zqG9GdOhg4~VtBl$*l%&-?Y)`Xb zhG5FG(4V5Armx?UQUaV{sT3fqt-mh1yY6v2B&W_(JT~|uZx@r z8u@#9CAm1iFfP646xOv&JA!HB$rIK7;^ad7GS+g68lxOb zzKLIC+yqV!s1UVHHont;J@ApBqcSNw$Xaw=RH1Gt7Dtu@irW@D%!l+GDhepZRJGFN+5qG#{6JFJ*NXE(u5`>$;AjiB zY_ZBNL|#cy@edLTc}zpWY5JYJ;8;Yb+WK>*b`d-aclmm4vfcsS79AhbC9#7oAGapjgBM1IF}`}``? zw?CLtB_8%u4}R9X)`$pllSd~{lWrIukScHA6`4YR^83?bFXC5)0+K#m1nvuxh?WjY z6+4Up7E8{>Q6KzZ8ABQG>Bp3difMEa2UZj_=kGD{reFwy;;u8i81ytvC)1W1D{;(i zIJWyMm-XcKW6x#-#z$1FKk?hra8SPyGaRDr6zHTv8=?znc8l1cv=?T?Ebe4+6-~JD zz%xlvD#Gc7H7n%*iujejP$E8PtX9nO4I}8==kxe*cFB4Py;BL8_3Fy@Zh7^WV$NKj zjq;~ZllgVc^W}(fCr5L1llJPqBkuKiw`V@`+-pjTSN^{Cl%3Dqe{>zr*O4KkS7T1umZ{wBUqd9wOr{Uwo_Hh=hx$#W4-29rKYmG8 zsvFs##46>Wmg>a+9yz9YiWqj>SVhLYDd0Pp`HA`H34`82kp}G(=WhiLOHjS$jh(Uy zbDI6ull8Y`LZXNspPR&ZiSjfX5Vh(*Pi#-O_;xHSMm!T~ZDqh1O(k@C;gtRP6I!#~ zOR}dd#4Q=+ET*FBG`?fP!XeIj@AR<<40K|m3Jd(otqLB^TXWWunK#{qaQ$SC+D~(z z3xXN?Y6sjDb@pY3;t!P7eIwbeu3|GIO320@5Gu#igSuKs`AyJdNAAvIP^hMC!Ux-q zA@xEZ&pk(Wvdh>LupY1K-E!QA8D-Rr;<;|L$3$%oe!Wb)2F_6 znth)b#2L^`aLuIhoTVw$r>geNI}nkuiLZ-u(#Wf=u+IBfHWE$-w~mT^tuSBl#lCtM z(}k7rQff@)sR74V?72_$r`P@~>~{RtQ54jG}1Gx2%B+w(64oMB%5;&XTWKG~Cb2>TW8wHw}X zzIbHcek`@K$y8|_k3Z&lJ3Y?s8xV9Pqa4MBz)ESrc@`%!xmULb53{Z5-lMJcmmUl& z2B^j%9(Pxp9W`xZLe^oQE!4?7$scn3z}~g7B&P++CR%Q5_Ys z;QVvbac|l1a+gm>SE_Z)zk6hDwWKhyp(}JI3EnRk_sE~JHZ=Y4?)yQ`T)X?or?%l> zAnEr-72Wdtw#a!hmIIHFeS#|L112G2fhtA>(ab&#={+y=EjzZPYYQJgH-q_V~wldiRvyjjH~;{VNX89(JAn(Uaw|+4s}7D#-b)>?h*Qy zYn06LDCdklVKuQ2dEnOV1JUMz(?CTAW5%=6V^6csJMptmi;|jFeoo2-TW&QljBANJ zeD_s+oFzfJB21e%loeO6`UBBWsfJiQ6jI@scrzr_8Tgnc?n4=y)EtqH0h95Zh|`A= zVgg;>Tznp)SPPAdK26Gyz0Is6OiBH|5|0lJm;>|9j4wv40}FP4ZG5zzT%JOL8IVAU zKR~AYzPWKNl6i0JVxUKP_HB;!JAZF?_T;gC%Ch;~q}jCD#v9SSNqv?t$5t-cr>eWl zu1&%kH%-B7{3h-rZHG<^jm9;@R%!Nyu)n`($Gg>euTI$zsXaz{xr7=tETd>KhOM3D z$a>G*Fm~010_5tG1{pM5q8M_1igYB)KJjslO5Hp!eU!t6 z>1|rn=Hcs&;ladU+CA7OM7&CexHH~>iPkh#u6-yG&Dgk|O!8j9MF}dM{#Z?Yca&#D z*TvHnjTyW1ryiy3ICq+4;ryfHbpSgaopW2UUa6yx@WIdqJy%uOVd|Fl)5f#hS9=oQ zFz6`h!bP2Wg9G^|j{<%Y|IRp4!K-Y&6xG>;zEEyY(YL`cGDf}rb+Ujl?$Hy&WNBPD z^ou41;217@mt|7+-2c)GAcY%++C`H~XNM-oCA-@BiLM1}T*!WmJ^o689W1<_Ki9m$ zUvNfKaoVixJ9*=av)_a^gSm$CC8*q+dh4?65{pzI#FT{|$!q6Z>ZSw^U#lkmDZu>1 zm&4Sz8&zj97M)a6@zXDR$x{yoO(zs-qE5T|fk64un)+?HCrbMR8N0B(dA>Kc&+R_* z2OylTI-`czMZbw*)vHZF`njno136qE;HrGh;GFIYU6-{S#LrVBVAZm63NU7l>DLwi z_0e>V@Im?NM|+Bv8OuQ{l72EyGs*OkjI(@g4chhFUl`(0#_^miUQ<@bxZ*m3u_JyX)&XEdG%pC9*{D~NwZPpb3PoN<*`qtV#WzJ0MZ zQWD$|+cecFNN^?|c7P})AUj`ajg8A+_HyugJve3fZA0oiAAN6VYsKQ}C*qs|oIo*4 zlT8e6zwIVf!pL@VFMW)lIP87KEh-x#CJm(0b+x5|rXYovv!1hW1}=9W_92uC&Y6fr z-)#7@6!sj2AUab$yJ7SA={a1}(pWJXfhRghpM%)EgKZ#~i&;ZP@yn3w>S6xXw1fP! znl!kz9Ca|mw>9|Uaqn)QzaPfyFJa%{o{Fz-af`8WprYJux$2U4L<#G9TKJ6OqVf2H zxph9>T`W1K(^&OCX=V8tw*#zp<1WKF{Yg#rlufQo!dXvRS5S^}(^eJ9QjdwyYYWE% z&6i3PyX;GmQ&Zx8p~{&>Dqt3F$4#BP>kiDjBt<2T(3f`07eh+$w&S8&zZ&(PoC#%< zt|Keas)+p19)O&$r6!+I1Q-{;qr>rqEv2RYu6~Xm#*-*I`t6lL{nLSgTxd9h(XSHZ zEA{n?Zi3G*kkwkd4qz4$g|xi4IU|J6^SYa=%~`+FL@_p7J=+Wus1P7Z;*N?==6ev_ z_NH-JS+F&;UyCf?_r2|C6_8HZ2v>ZF8ZP>Kk9I6w#kxnHFR_85pg&ThSIhCU{GP~{ zaie!qC(rBVgkNRpraz3o^U9H*R{|*TZ)VX2YMe@0#SW3|xJ)8BqKY-OX9h|QZ1ZQ} zr}i`irnGF!fzfRzF5B&-tV^^D=`hT)_rCv&u6K;Ctm(QyW81cE+qP|;Bputfla6iM zHafO#b)0l`^St+dKkq(&_8B$ys5SShT60zHs#)F(2kG{VbMcxsgThXBA<=24UQMjS zcL-+8arx`;IhI9o(d%huj@Ht--_It5H*_^YD}&RO>lU5A=jlj!r9+t2o=5WXmk?PG zgoCVAv4Q<2;fMZ0K|%8banQESk8K#JLzL9i9p)X4%SDf7_{v)%>PhXa@F3*G63~S z7kBm3TZ;(na2O02$*^|q_#|`_E3(IwXJ%6~ZkiFGB1p`@Aj&Q)9joAvg~gt#J6fv% zBwB&+m&mD_R#%G&H43iwrTfSqSxdtwo>5Kk8yX24e8pG8#^~UrodQbTD5o96J3GfR(F{L$|aL)7m`aBVL)yVOuO3)zRR?HjD9O*F5)aUMZO& zF)fUvvoAkmjM(fLtvrgti%d&jb5xddQ`}TWp?N#?RQa`cvG|yp_SmXef4v1${Iw4x zSeec9*K>=EF+47h=iq3HxZgx-zD){Fj(HV&at zA{xqh)U!eE$#+0Z2_VEKo>!~b#qyc&WI(?Z-*?{w1sdi{X0@e34Z6dr|I?v@$MW9h zJ_^f@UeW+n#psUDR{e$v0flU|>apwX4>waUx^PgEJ%5f4F?(p8_BJcKY93c|^bt3O z0W;#R51t#}LX?XPwzhh6*!z+MS6s8zkqVsOY0oo_ENq#mYfhT+}UB5wg8dR!ctlv!8?a>%}*)9SOVhQHhwMn!z`3iY3}@_~}RMWZ_!rmaG{DMf-HPUh6Yfg;-%ktO0aHzOu49xL(H zjcbLg5+S5({VI0_>m|nQiO6xVq?QbXWGySMY<(UHIsu~7A(HK8H%71Vx;jtRFoJP zt3xilvL;s3Zz7o_x9Kmn=k7JonUQlo+@Rn9M4`rTxV=oK*74g@7=Y_g!r6`1f7?G1 zaZV`un}<=?|23X^e?rwJl!Ec^ZX!ti=G7VLCqmaQlaf4_F)bodN~2$DBYmcoF~e9d zskGa`_vDS_6o0He?g~P|P%?BCAbpIS-{r zra-9+leSQDZcBEAH*IEweSMn7%$b{Ucq6fm*94|jRsd%R_-#ErxATWb;X&bz1KXLa zRaMu=L?V!UYK#VRFmPH*NUxo5-0-` z)o=$ArK^wiKumx4I#fFug+x}d@pEmx5)|ieXbISa%nlKF3}b>kiOb21j#%Hkc-MDB zS751pWa~<8%m--s?DT{WW$xM(AzXYU`6y_zKxfZyC*PnWT-N97Tb|&c&r1*U(181@ zIlZ^M&vYt`2EyE60=imr$RRk=+~iH!-|(YcuE0Y zXTYUQp5lJ(f zWvg;n@kj0w?WM1`naa<;h+$^IhVe3bb?HRdB&(`gl=qs$e+XC&8}{~jMzV(!a&W~! zyD-vf+UgLBdh9c$gRB`KH}Jtf`@VOY2a)1t8;-9}uQnZm*t-%iuk)e&EGuCao*DtM zDgk)>Ag{4_bM`xyBEAEGQ!oPX$HRLxz+ony9t> zf0+pZ?0EoWl_sk;}TgD$j8EAHJHMW)VtWfvL_F-Y@CWk zkiInnee-X(Fm*(kOGGvqv7)JO^t1(8t%!?=*jP7j*u!E;Jc1u!w$?di$4&@1{u{b+ zINH^hd9mHuQ4H|@25V2Gfnc4+dG#ZKa#Jm8b#32MjFGUQ7csX}g$%yAq5;%|5?Ye} z+SLaXVeoB$GU&Kf+~vYqTDwxUZUAVhe(k@b`id3qsmeX{49R@JSunYC z;V!>k;nh0H&lTw78E%{_$BuiVJWX@IPT@HzdP&J;iBonc z9sQ2}%CgcX@=6?Z!4`*o$#xJX5H?XI^m=Ak%CKfaeQFm(fKJBgC}pk~+oc>-M%fII z!-_$5S!1PzDZ3MW?~c9!kuy}z>HV*l-?K;@-VdmV3uRxY+>Vj_BWh($ySqZw*IQFi zS`DM+poOF=C`sHwKMMe?J5V*mc_-$8=as%{oBX#}RSOa6&6Jk{UV0sinQqAx@(oaE z)UbRJfIYxgFE6{Ix``O2uOnrKAl>Pg@e`uzUR=yM7psLQO|`};PD@3Yz_8#zdKcMs`z#51d=OaU5KRAJ@% zvZm5W1^$E@gjH}T#qzG$K*bKJK+LwR*+{m2VOH5U&_HW_L-VWNk{45CFXJ=#k=%3k z>~}R#p(?9}RM>T(&q&<1GTcc-UdrBV`Y-PI?U~zYxy+ooH*ATHbJaaBdBiB+w(VV) z81cBfrK8c#4y@XkB|`k2<4yw5aSzV*sGxlmeO3kEP$1aM&&nZG5_7MAx#1`+R*QHEbQGjIfxBeqw*G}E z0d6%k{Bz;7QS&INi1hDQ;W285z7XgC`ll`g>%`Mz&vm;>p??eSsrWQUoIy5;BO2t1 z5M_WVBPED9+tVg=juYqyBmYB3;D?I72}qc}QHBsNyDMjkoCU&6kar_(*0;0ihfzhC z{?ujRjIxs|iTcQ*M@X1@|C3^_QAwoX!&qv+iyHvwdF!O@z(a!k!!5hv+*Z4Dz(Ey{ z)2@^xNMcj-Uh#qNDoR(30~2o-{pmRg*3}H622L-R(#xXn zc*9H{mYSaYzo7o6jvmnhwc|~7u_xZ<`;s#xV~|RomE7|ypy{!%gb-htWo=z-i|!7t zOMhMRBd1A8n98dDso*!x;A2t>gHrN=@J%`-FRp`$h;pwAK0J_qA!cP?c+QU^lVa7b z7+f2YZX=Vl71tnnf~It6E|}K(6f&}1N+Tpw=Es$OP8qLhcn0{QilJrQhF*ca(S$;p zdo@=Bu|6O@N(VePzOA_=TR3;dxE#`4j*G)eXTVyro%g##z^_Hl3u8h+zbv8Hh%3ri z0^!R*=sS~o9nroL4+?q*=&i_@E$?1Rvs`~t^B*kU&p20YQZq~ABrDuiesgMT^Cg#5 z&7;uHd7~`FFDAz?SOPa7uUqSP{JRLfBSf)Hh*c%?9!gs%MXW)}2?u=L9}{ux&<$A{ zGXqICZ<-9)ogxi&lwB_S+x8o`527Iq)M3GkC_o`j9LTsW><_7(%3}U2$+6%sd z0m~2V*lhmlU6j%pfX4#ArUL`{O6L1fEJ{60_YV;e{|DcD&6|Uh)Ow|Fqg7)ZU@5rj z{o!9AIo*q2?iA)c9NR-B^%klu*I7tti?#YoVd*R!^vzC_=}rL=N*C?~_wO3+hAt?W z{+fYC1V!)|?-4z6Ec4c(m!i3&#IPm5SkacXN6*Xv|Lw1>`;vla5>U+9ts|ISTHTl6 zaDCQ`NKbl@DD&Dmswb@cHu1`R2a#Bd0W`E!BpsP~FG(`7b z9N$ZGdXHb$P}!mue&{`)ZnY2FN0QF2V1*EtgNsvREoQe26Q3toV2{(AB!9X$S2)R& z%T6Kh@?weU6){K09BLHU`)-w<9+);Mc-?tw=}eWa16j*U^jW;$dKS{8V6fvI1BIET zRvO^bw>br48V&s=Ah*%i?0Be@Tn9j#=Znwu+i6?tQcp8s&e&r2-&XeSKkP1G_!!SH zp0XooE~8%w%b3IPIX&tH3x6A@WRoW$M@M(SC^B~y)etm=-T%_!cAXoo4Q9t~n6KAa z>q7X8+ER7tRbMP7Br*F@))OO9Y}n&FWbEqd^-Skj+s6hKzcfXYZpfZU=tFqf8*z{_e4Yx zh(MIS#lFZOrdC~N;C^$Y8&QB(q{~EUNA#&7q>0s)d}g1en$VVpct^NyB@F_2W96y& zlvScwFwqRHkZQzo`uixp3~1@9nJaQb z@kF_w2GIDXH#OKOO9XYyDji+0c`5vdC2RVQ&iCu)`KdAsV5#_B>`{Nqc;J#ijrjAc z08FRibKxlY0xu5*^zYM;{FPX@?-y~`mUc>HkKHnFa*+NtbQ~1yg3w%|6G_7OSv{p>J0vklihrNHzdk3g70sl&EnXRCidWM7g|8PJy^0 zp(|nURA4rjBU{PF*>yu34;a9%hU&6NdA4p`k{2~>7;;wLvVm!REy=tyrwaObnfjwY z=P#nC7p6?{V{!4br%u8Yj{ zJl5li3)zg2WOg@U&cbEt=vVSTyPsVxo1uv`Q=Z#4gnU?7DdS#eX@Fbr@G&0%9Rl^b zm?UST>@m7|bL#k|IO{?%)#wExfwur%_Dho%SR7*_`ukdjDb8Sd6gzi+z1M;qk4b{@ z6?2Z@DbRP|(knN#X`P0?0qzRX*c40+QangcafOz#_Qyx?m-w8yodvP%Px!q=D^3^x zD1-yk3g?P=^d0KXA~4CylPhUX)Q+}KZW_~&2t({@dbDrvVnUYCU_3!urJyP-U`CqX!p+@31 zEHC16D}zkr?;G*J>zuGw!y7YAlV3rBVl`xH#RZn#`|O0D%7`sP=^BlCmcI^ilTBHb zugcSLS0-L?HD!5Ko=RNjEEnX3;xmQwh7R(Tah|(|OARQ8V1_zm{T*wFGIIi7-b!9{;wPpfwQn8;2p+uYBMk|e{qvr0ekLAQuRXk`!irzO82pFgb}KZToi4~D)Jjf`PB?AiM{ zd--b3?FN{~u}KE{wpJa4PZb|N$O)d}K*P)AsYg-OFO z7b>Bn`{w9MgA+8v6tCQYd)oyX*+eyo982w5uiWyuLVM0?_fGsaZbYB^upG*jti_o! zYf&Oo03UI4JyFuwAIXiCtwg||BCQon&hp8~QfX7NaS;vixLU|4A202|j#7EHGv;-c z<_-Q5XH16E>T5H+ECl)}O(b@dT`9Gs41nE`ndhH1%j%3WFXLAGEcHwt$L!G!6pHO` z1Qay;uvjW~kw{ysiUKzFN}DN}%T6&^roVV>B2BwGa_z~EO=CaWra;xexyCO3hhF;} zsK9yEJrr0`dkRn#ZppY>=X}dIR#rY)u&(?LQM(2lgV`=B|i3j z4smwdm0HXxSg^YJA=vbXMp32UiuVTZc&ll&QG`Ik?2Q)-p1O#~rf~WTk>v z`EFSu*>q5dwDkYrm%*0|4qzRqC-ur&wDySJDc8$PNub)Gu#&L}iE!#o@^OHe_Gh}R zf|Bnr`iR!FbZ&vS*xL2V_r~@C3?;T!Zw=XNyl!s2x3_KWT6gKAP3<23`{}&3uJro6 z)d2Q>yb%DLYii?fDQG*1I1a;?LspIf(hz#QNH_Q3S&^D7F_z#Z%M#(H1igWVdikUb z&z(1zaghjBh#}tEJbS_7mJpOm%6YluOJiOFpuSvQQ9f7HO4gTb;7CX7NwBlLho1p< z1z_}zIu`7ptr~LgHERyf$-)f)^<adH7icqOi7eZ$U{n+$#fk)^o z&l@%Wre}{<7E#o4OQ(CDR900|YQ-m4kCi_}_b6VWSD%s|OfeeKW>=S!SH)6m(PD;x z)@E5%3)%KPY5BW|bZKg5YF87VCk79;131M!X{pP6tBHIirVyIuqmONAXtfdW>0|@6 z)FmrsuJi&E21Js2tOsAqY)+-+44Ts{4#89bb&v7TO^YT`M(W8H z+IJ4RPS;8~l-jHj>7@3+Yd6QUHE&1!8PMU^!Oea>#|clG*EhzGPusj!rwgaww_`Dr z$V~NjKSTAM#)QVOR#YFK$Oa*fb!DQ{~ zs;OxSY;EoJX=Q)6tIPWJ|Ds#T_0FHUMrh?&S@}VCzqUHv+H2SQ|DxN8{p;1-HMq8^ zn*}gEoia7#*m!IGX(1=Q0HOaJBqlB<#v-vL%_gmlY(o+jR$*in9%Wk?BUcv7^m~de zXqN>Pjw>D3V^NlAd?KMprg))@!YS&9A9`-RyJ~)7e=EoC52EixM8~q`(Rso;?y(yiy8b8@m;{V_#Os;vi z?qWwsY}!(J{lLAK*<@$cCI3e+`X5|4_6B>qUJKP9xRRkiaL)$H@HAT1R`RwYQ@Hp_tM*MGejePsf^^{thRW79&6bN0uvCzaD#^}6j&qn1TbCMq;`GsY-A;HP1ylM(5<3&OZMj3yF6 z=&l1Q;i8lHDQFZq-)vHoh2tpMxAUvp66tBHz7FUfldJSc`SVj~9_j(toL`e?wPE&m zfav=f7(W`bdb^dF<+x5t?+%n060uWfoeFd(Wb=-2p4RVLxIrE6KUa6Ael`ms9sLNy zkS$|j`Hrz@#-x(L>-5=W`{Le7nbt$$txJh-rUE?ZBIr(h`0f+(<^{D{N*48*oz3}i zwzK60OMPGbTrPhnt;Or+?UgEp#szyR5IA+Njram@`_EQ3MlDil@LF!5i%#Z+!t?k4 zK=mK0)*U5(Qq0>aY1xCDCkO+!{Rm!zUN_R8#rwR5SNPyE*AEyji3e1%`Giag7&2T_+;_@heUk8^J z45=gapc#5o^--I$Wu?5P^+uFvm%!wN^B>D4j>=O5jm!%jSd?*cs~mc;Ck6c&71WpH zlHN~G&=&UfW6teXf+<~M89y31=rF^{N+i!&wR}Lo9jK@X#Up;>izuT%e5_w#Mf&6D z;@P5{C9A{n#{9xN(xgg;!q|H{B^AZ_#6^uoHXGi9ly1mMG(T`x-@xz^C)0RPTM_3z zua174XfGc74%(R3gqWVPDf4A*Jn6N8z$LeM1L0)2x&9({GIk+Der(M~$r=|DAs}L< zjm?c^CR@|8sun_8l|6RWQ-RQhXGnHTf6mNNW6hT*jRILq;LvX}YE9*iXdbyvFtUB2 zuT+JUKcWC7ycbrtugpWU(A&dc_syyy;V zcI)kCNxZjO7u}?0yJ8#@4d~QQT8-qMV+4SvK?Uk<ad2_V9D$JJY7O~^4(%3FJU62a*OdAas)&}6*a+C}2n9gM2%t=s>R2)mf5szj1F zo3uI*AKZT|53=M_iq9RC$sR7JeyCwbDQiHA=JT7FJw4t4^hePnmws&CLUc1_l$6<8 zRz(#n;kbldJJvo}J-hkrKW^Fn35mKGqnll=E2EpIvw1%$)_>Ge<6Zd5{{L5ID2i-B zMZl4QyA282OR+KJ>^>SRY54>KN(2SNojZIpb*1@Dy}rxqSp7rA|rw{^?y$Cm8>vn6=% zyw^UBURzgVGPIU`M|x#TG?-PD5>+e?umwF{a$iG$wL6{TG1-&9uz^O~+vI0a~s6pJN!*YjqQ<86YRJ}xZ-=WBW( z{Xpnsv(dj&f}N9&qu?HovioGvpZgxfLM<=(IK;@$_0mT|HaU#{u-KOy8|F0As^Ge! z%({;C+L<>W(h>=Q{H!K@!J!!s-_M+pjDO*?+S zH)?|J(Dz%@Iq^IdaFHVveobS$eE7GWC8DK6+?1s=B=hBI|Xz?^$XMp|OIBwA8cji zI?4k~Mcdl7i{B*1JOM3-7i17;8b8+} zOgKu|`mD7hs7U7*NX=4~u)1HT%9WKSONdlufs$PWr7pd*yjvnxSwVzx>9Q`qu9d+^ zuCu4o;v`2Bga_-7hYg)wk$iHpA_(w;jo z_dL63{&69JRfUmp&)94PSnLeb9~@Vf0y9^?CyPtFaZEpMBSAf4ZMhS-MgI)Fjv(Bx zJ|_P(q>uAo_;#(ctsl{#xf=#8L)~gZ+hqS-a(6@>ae|e9Dme$vEwjPY+WESdE}<0~zXq2AqxT{ieIa)CKsk1oH+Zi!>Cm{Y7`_}_ z&hs7IMFL6#uI4q7E|eu>8LKZYJ~JO`xY5qy*gNQKyG_$|q3z^^vUISF@?|eI*6oy1 z+n=Q(LE|SE1{jA|Q<2K%>a=b8LNa6}^-}q^RBmRRoU7Q#cOp43ZVI>n*Xz;y`egEdx76^}F$je7M zk^&{jP^gI>|FpT^DQ%Wc(pxFg9}VbM{eC^3p%KWyJa{Ci`9Sg2HOX3x!aM-AjG2u5 z&35WI-RykX_$|E}9k>I`?>y6v^pr)Ht!DRStCO{v#yNiTwi$`BjL>>bV4=c}ZfKci z^$Z^oP^3`wyk>e@t%q`2yVO&?=Z_?#(dr|a2!(jT)YiluC%@D^2D|iqE zx++LlzK%LXNi>^89|;nvV~U1cy-&(#M}@}$`ao_8vdkhz^6OPT$f!>$W4hRL8r}9b zSzou22UcssHyPXd^;5#^Hk)70+!ncfu+KOn?vt}M&M2-bWyGOjFGKko|!;=w;%xcIb$T=bTu{R|+b(U&rcWos79lz}C zI8ZXH_y>b{Stj_Na~vKY9)JINl7oCw6(qAD&g0z>=@7vcEs^xn!CmZH_;=~s_Uu6P zRo6`~am}Y*bJvd6d3f=JC<9$zO?4qe4K^E&`#V8`1A%LT{$$LlLY&GpK{-n~;Q;#? zWSysjQgF3Tamd4sB@B`c*t~KlVq+MXw%9;J40!AoKY@&PPa!g*d(hNlNc#@16i=_W zKNZsKifvsF@V4bLajs&-?$P{&&HEi*q5^e(RqQI3eDe0Q!v#2W@7PQ2sp+AOaE&<- z>N(TMjO-}7YX@JR2q{Nq-%V>?OWgi#X^fs)IOg_M$FD{AF5hU=*lOvb%W@~&@-6`- z@&g18Yr^5NNMN*L$nafk5xoE%=FP_6k0y9FS#-!5Z$mA)yG3h@;2xkmD2`CIP;%3& z3C8Qu;(T@Tqy}wTdTnQ$xF%ZjO1mSf0_I1eglyJ?@__1eCBFpUWy-^)Ph(BB&OAbz zH0fFOy<-{dllJ{0(cxqjq#4|b|;xz$#tKGGO;Q~P4;K` z#;+TM-!*kYvs1Q3hZ9`KU8YB-`-z;==9$cP_$%0IxY1JCZ6yOPa&yKSXd@J z5K5!aQe3;+nc}j_jnRgfXtCkRdIq+OtFAh>%!PInxC8taDBzb_dnTIi#8||Tmm{Xx ztY<3aAx!qkyhs(rlg%U!zfzjYhz**@kR_Nn^+IzjW@mo&uy6K14r1lfC~vutt#7hZ z6oVLW5b;{6$oJEk?1$6W_+Fzc=6m>#A^m)=*8ZERXGo;@DbyJ;waajgd0K~|C2^+* zXvQ*d6e61gFGfo?;{Vc@*Dgw?uck$<;Og`^*nT3i9|CdAw*AE}P&BRS{_5nqxe;gP`~ z!E~&mlRC!&STv;v)GdWm9~A4wGL`ZALHMf}yqA4x+P=?z3fo*_w1kIhh)F1FE~ep> z=#?G|1r4blKoB|Pa_vLHJiKJ(a-_qL{^52?koV|LIQ!K=K`AZx0(No6^Rve<=8S_j z^SDzqY!$LJ055tDapUgm8qj}>6?)(c9R72X9C)d4=HLJ076%|Y^vSK+>x7eH`ZbCi z`_}0Sz3|T!;RWLxOlnI&1FZO;TiOEP9R&Z|k72EfB6udN%*IcX-e9>hIZBg%r~vsb z^KO}56ocqWJg5>Z0v~_HHeCEt@SKLl_tcZa)K*=*iU|Zva2*SoN^Q9psjP>*guB-s zGw57nHztDn@w<1Arc;-+x|%vTs3w2g26tpo zkvgHsHdzP@MkYVbOz*yYO)Q{+aP8gi6%>XIL9PKr14&}#xHbB(fqET$!X+2|nE%bu z6H@*LUx*M~*SV6OQCQ!>01g1FI?DN1CY<%SZCTWUD)dN3hQ3yV?vS4^v3Rd?Mc3

Z@~d(0thAty&BK`Y=8bzcR}RKDzd!dzjThWB z%jTE0nsBy*PCYiy$hFB`I;TFu=rr&7rc4I<3{Q7gF&|pb8NfDRLOb)DtY$Zb7!V1y#1&bT5=&M z#aDWPMfQj__~UYm-IKZ*urNKPTIgRr7#*K}G%gP--!?Fbk4Q+&>Z?yYNijJ|F{OUh z#K-+XbY1`I<4)SJsLLG4$*g-9yHEeCR*i_lU&>}`GE995lof=GXrYsYHGe(~6Fy;1 zL$w0R8+t=x)-Ja)7@vEq)H46+x-T<9DNJgzh!d>(F=l{jlY~*Q1NKT)K7q001OimY zFi`dfCl+2!Wd@0KxKmtb#zHr3f6_yn#5ms42bI;^} zP9DEROjFgHtljrwm-6xFhZ3Gw0Kyt7)5>IK4BSgh1g@V!Q zr)qG14k@Y^CS(l8ns_V0gxJrqnwHGK*&e^YXsoOlm4bNdm$Werx_*Go&lzlLJQIEo z$Ov87{k1A8=B0_k+rv98*IjgFs=G~BNW0boDq!nV4;ahlmp_n3oJY4WG0|^_4@IDD zT&3t=r|#~Y zMK1b6BspqN7K28yXhdDWY}luVo_L0?wM68x+4($S_`-dT{v*tC;d#jW+ZHElq!2V# z6A?I=zw_>~q&{wVZvwL)f;xUkV_!HA;XmTeq@X=Rk9`8UJ92xZzj0lSQHEV;dYc5* zSQ71rw@FgS{*#24A%aD)RyQJCqEVO<*xV{`h zr-?hOp+j}~0Zo5w`I^UIm2hVUMtGd{lELT}v1LJ>*x)NwS*%5JBKQE7+B@T&f7fP&uwhRNqqkkBzg~{*R5%DX6AlGQ;z?JE;Mb zR;P_ssw@Zw9DD&BhAuS;3!v3LU5Isbrz zRx_@-nBEJ~`JG=uC*hmRIwOGUCFxkk+6j(}iH7;Es;K)6_BxIcY|eOpG*;2d%I((rNZ($@?@;!45z21r+yFXMO!HuXZ#W;B4*6qi$RxB8*%+_D5T~@c!WE@m+%#i#Q6-QdIa0Jy=DP!9sRu=TT-}B4g1d_R!8Qhg zGvPXiW?n9$iUrKvH@MLK1=r+iW%??mVf_p+XI9klxvj#um0xlfI9Q)}O$_v6HD7h< z5OARjP8(BS3wkJm~737jxI!J;dWu9%B{} z+8Og)KPx9jsnzSQB2z+UlSzkkG+Xks(zN)QY|tPA;!c=DbH$Xq{z)B|(1HToawiMa z@tJ8%S11WXU-+S7W&ipba>TAo*1Ed$Gq&rXBN_u-OT_n8^HSb*ao0A#@@iZ-r~*8&nd)q|v?RLoMCd(m0S0Rd%v*2i9MR&-;xC{WT(%TiX z_ni`(E69RLNHHOXyI_b9+^tJ>U@gpOzf18McsN?~`#>?*u1-*JU#nkV{yn3N5gV@$ z&MwiuZF6pvLGc!E`$V}@hB{Ye7*nJ>{z7dT5^={pe#}AUrKS95-j!pPUgbTfzV@^p zzI-pc^1@nZ47pPm#KoWWAaMm3Z$`*~^|8e&BNa^CNzMf;w!RzXJK=0S zyt6bGZzOhMInOO=w&_2|A|*1{UZ@N@ryMeDC&%R35;+?h3|+8pdVj?{OSqOhJV zkQCzy-JwhR*=_q6R7+;mp71AkjzR9~eTQz?g&xvg?u?HR*p_&pyjZdjmVLH6zTq|f zfUseg8f^1t%h;(A8XHsp`gBQbj++aBJKgtfLxTZ5bJv_xM)=)uf^$&BxrgI}0_BK! zb1s2@e)MKFbCY9uhrb%%(Q>4wFU5z=uLbB4sYr(g@-2YiSrIJ9t@H9i-anrP>z|d2y6ntwAKi3>=hC16v=7n zcRU_jz9Hy7&bPPfGN_P!rA2fV+~*SeAX;omDCDkZ%@Dw;9%4MW`J~-8WO#p-b-)OaP{Fc<#z~JMk&OiB=GFI?B!!BDLz~akOTLdBGd^?&S$l^m-eVpI_YW36 ztny1xFjOz>%=wa%%v)Ke)Cv8oTWbeK6hQ=RL!qktR>p8*c z6OqmFvpYV-RZ|(5Fbug3ITM z*-C0vO#JRzMeeo3;NnP#!L=`W=>{6nrqn6auG|>eknIGhe!IoTbYtkW5Oocd39I26 zwlh-RtilL5d)@V%axWHwM$L(y#rj$|e+b#FT!g1_wg*d_gQNUP)cA`P;liZq?cP-+ z)krNV$hij92vy}o2aeBIxs$Q?!xx*vc`E<0@z)$kV?h>S#$z}OWJYjD)kc~mG5VO1ulQi~b1+*$2#uO->GmZ~3*+|ZI-wJxrSkK4~BTE8ur9L_LzeY zgu88XHF)^kLT6Qhm3ovMWg7{mcZXjOmWs7WvsoEj3Ppv9*k9q;m&AIyvjjUoB4^m! z^rE#1wuH&4ArPd$5V#UHkRHY~zDT`G9sXwOxsBv6URC?hm|p;5f$qAP-WNOoLxnXBwtGxiuz^@CI9*O)n|^TMws3-c6%B48lxzX2q&)!H(N{ z;$MGeR>Os}JpPYw?TK2TC2{~IYXEh?sl)pdWZg^Re&i8(HcG;Wek2e6ZoQUPO1{^n z2E*^(BI_FT-ag8?m(Y+>Vl+J+q%h71mPQR}7*@<>{b6&Sij(LfgWWHI>mV`vJ8f#| z=trweRlmX%rtne38uqMk>3=(msuw}&<3*WkF5mjpC&A!gZ*c*2k#|N42BpTMQ!-%* zsxR%Z>MdL>5g5wOz&S1D2l5Go1li4YnHduJ<$n!bbly_95|fgbecKDF|B0zZvfozyFmZ*lkKa>plU?k0M zxF9h2m8_d-dGKr8t;#mjUlMJkdDA-to#xq5o}!WV3Ry5XkY9&egvnJ&uKzuDNd%zV zPGJCOB}bHgcC|X;ed|Bb;~KF`D=af21plpP^Gb`LyXfwd&i4{$i*?q zt&AH8dqKGddye#6Uq{RKYCnk*g$3kwlpXM9ac9^n0>sV=%?~&DSdtv>mz9R?0w?49=c z4=IZ7l4!zsX{0-|ymM80nk3-?U|@rs=0km|uzB1r1QqCc?1(fSboYIJ`zgKG0sWVb zEF$E#m(HHOC7It06!DT*9}oX%$bF7=bzj4fR#Bw2XC%OLCsSlp zeLf)4IJjQKF^ExII}>7>~z37(h({)X@a0Z4vx=JJqNfcwNnolR)g=`5Y%$Zr6NH^ z-OmklM8nAY80a;Y8I_XrKEhMnDQ6N{mhMt_Us52t@DjcpWX*qH0e*bIz_HG7P4@@q z;E6}L;7_K-OU;+uN{e1VuEcTJ-)+IQ*G8C-3(7x!cd=MigDJ08;o=i0r?&;Ga0yl8 ze%|`x2bv!S8v;{cr!BY$dE`NIzfJ#_oMgkyiYv!Etmaqn_EmTcmL6}9!*H3cNG!?U zP*jjDXrl{&rB*~#c>L0c`2BjJq-rkWN>c_9Q$SL55}e@E+w0-P1X zm=XNl-$-g@xGAd86Yhcp5Gj$lma~3BZ4m{J$Xc<|ryA|=5$eEg)OEw{j&#VhI0bbF0A5@-MnXISLMmLYOmVjDNxF>4q(mJ*QusnG z5D=Bn(21q;J{j)&tdOn0+$ImfUnhO*TIm8*Ej%)imT$F@t;53`tHj|uKsi;y+Xv`0eIu1Z@K zTRsAhHFa)T^I-0c6@+Vny|kURvnb5uIS30_{)vq|lHUGU@AnW2bNYH*!;b^p>UiQ41U)YM(|JT3 z_^DL$-k;h?n{fjdaqwCxXnRMHdPg)oP5Zt!GIw|IafO=YpnEV8Uc-TJbR6pb`SN~> z778ng?P=CE{)b~C%49W5pT0WG5ePk24dnj5`w4JAaA9ORvb8CcL=>)N%_JdexvV2^ ze$`dwxSZbSUY*2<$?o~wymTOeNrMZmrr2(yoMGKbl=Ia44qR|YEtWvV4EAUE29?wy z6GZf;RaCbOH@pDZ-;Mc5t0sA3!1J$UR~(B!l0^U4skn~r9pSR^XTG!{1E#DS5-aR+iZaxhjF#f(jXDjoT?&hR_amM+r(eMb9>`*FLk> zu5+?lrsI9euw3qpdE;#h#@4AOX+?-Av--)(Y!K=2)>?g|~oVSQ5)q#E8bH^*+od6=$H<-V}^H%HsG<^NJ%tEWu%c>?I zeI>#X9z&y1KUxs%@nXg2&mNK}-_hk>K;ah76XUXQa|5lpSKS9>$otI~t%AAh|E=9; zo{3D2Ye|z4;GFm!oJlv)LaN4skE2mEfrCX6lPzHfQ(mvd`)D8Sb*5lYV9U1{AU0a~g>|i+Z)8I_`!p*OtK^Kx7CSCu$)sH$mb!?xu z#fxM1swov=u{|q@2Z9mBId-GntHLdVBrPm3kI(`U8$BoRzaXeDfDSvN;`NErK<+ke zbUiegk-8Zqf`=78qj%ip#d{uBSuP%w(rohYVj6U0nyTn;gi|LYT) z0eUpzDf0-Gp#DX))R3};?XbrC+*;sy+uJ3;K0(nKBu$CSQMQL+DG`LOt(n@5lEynT zjE%ZKItGxCeN`~tulRezem>|5SoO$y&c+2wOxs21q0T>d)`(p!tt$5~>ZEBx&#)`) z*iJTutlR;t@w}Mvr{js(DLeOfI&b<~z2SHSfGLJo{h;0yLIdH=u&&inxpGu$Sf+M{ zkd~2Br`2Nry$q%rSI%{4j<4Ld=Re&z!AP=CcBf5hn{QUDqmM6})8*31hYRI9MfWGp zh~o99$EFDW#zw7R4xT6~{m->OGBcTC>-df48GmmcOf-+*L<_b$%ACJs()Oy{eTEbn z7CM{Pb9u96_j}(s8fsN1$34591}I1zyGy8Te&hFxhs-HsjGmEK2K~dQKB)RB6LY?# z5M$%2!hAh4!7M}2^k&UzJq)Ng7t^g_wZE&`5bvI#s$vI0#fZiPASH^3)q?3sD0jBK z`MK4b97PG_5MsXP&)*=`q7VDL?pK=6s^TgSnm)JRIjaEX@H+WUZQ6gaZ0&B!=_2vM z2fpV(@%g}-=AxEfEvbYi!M0lIbsv}Y6XGs90wlA^ z+-roxs}tpIqwgAkoCo>+URV(@hu^~YSRx^T6E>;yLOeufuE_mSHC6X{kIba9OZqda zhYfR=j-PZjp)rBx3qd`&da%44M7oP(D+`gCm5~amc^l5XCamOP_qRANEp(a!%?kY(gDU6h$edgSB%HFXB{ zJ}H)bABUyRZ(6L{!h$6EAe3~yi4`cr=0VSn|4~JoI|K4I@7$wKm&vBO_4`t>J?PlY zpP9dve;H%0v}56ran?Ydp*e<-CNj1eY7qp9R%4NIWxs-k644M?M4n2I7G$!3@mR_Z zyM&W9=swAs=AsIIVP)ueOpk6*q-w^QnotlRz}}qFO9JU^Kw-?6E3ByH5u?Cp9mupQ z*f=cYSMHCf@|6%0OWMveox-AtTSI@ss)-r2G&)F;CZNnE3+u$K9!$labcWPZZhvQs zxtzUiN?Q8Ys6T(9mdoij{-X-dt|Q~r34TKGGypzTvhva;$&{+IsMht}v}2-E-*Fn4xCI7L4eJE2 zNt^io7fVKvGZsnX%iABr!bLVg6#-)F(L6Tb7D%%qNnmIpzM(*~L`_cvS%(EXyw@~b z+Qe|o@#VUG%}x;0?JNmC)IU@gVU>~i-ULc>SMfU=s6THNEQsQ}@JyQia+}&?=*O3r zOSz%^kv?nZ5Cn_2&#BAg6!B`AAfyZLCnP14n!mM#mizF@y`{H`yES{jN1Q^i>*3<#V* z<)m7H^#U6}5EMF*tg--gd9Snem$o+C^WwowdAZMtVrxQ0WWe1ER zhhx*x36`&m^^d3f8xD2Rq#4JZm382RJJ;B_Kn?;$$Cx%0Ld%)tHxS=CsUST@5r8~m zk1sne`1|LpHNM5abJY8<{xGh|!-lTlzQ`W_72e+Ee9v^qU->8YqDaM`?_q+{ia+X&Ht;B`7i9)E=b)l zG50ZMy79V=&xPgwsq{2c(ZInD#3i~b$`W5D={C9Dl4-&$+VBpfH1N$xCiIsxrhcAu zMWN_68DjuHm7uNZAQ3w`JCRlNHZVq>t?K(Kl|#`y`)R*W>1}Du)(asB&qB|=(9@)K zQ2|bK1UA9;^#HKmvn$9Gba&ECONJ{(IOH+dI4JlqQ#I0%p=uGjk=?JZf3ulr z81f{<=FvFzYT97ic!&ADd(~u4Xt!Izgn*2N-{)z(;Zzh4S|GUl2Jt}z1bVn4AldhE z-5Ic1B+XwB=Cz)^!U)%I;`xh!g7@bTH{|J-HEL*=LT)gc1mm?Ysz2hDh?C{(7+E9v zCW{za2q^s_o81#8$?*=D2|)w=yb>2fniR+B*vFa;de z*12JeHvp;GzO^=95``gkrGxaKsepb0p&+_*nOA8x)?TQtgI5SX6A@Gh>h$C!ei|dr zs1(-y@6!L}TQd9T20c#c_pQzO4?X`Iy>`)G_gltV1(CLMarOS-!xW|@y2rW5Bovn* z*oU*E{#fLl9SfR_wElZ?fkd2PHvvzB1b{#cyr9?y<*gUu_SZtS7QvpT=|;GoSfCtu zG6bb~3kA6%2S?nXVzUm?Pbx3cj%=G1DkQ1z;>An}pXl#XL0#w7!B0YHpzD9uQKeC^ zEQskqdeYfpJTLgOtY#BL&o~19Q{h|xm!B5v%>lxHqK9{~%m7TEPS9{IiA6n%@QT8Y z#;YWqq$#otgnviFSqErize5ipg76Qm<~QfRiJj|T*cD& z)+mFFW}cB~`SbKnpDlrI>I5e+V}&hMJKOg=p!|PWYG1ZzdQLDMN@UQgwb|Az_uzV+ zFh*k;Xi#H;itw!BT5l%5cgwp4O#Hn47xLyj@0|kQ<5kf3D}X<^9VH!#o$QDKt*U{{_wEMOPyL$_6%r)t>3MK|ZH@S|)kFik(XC%a$9%^%V5ZN@~{t7q6;| z&y;zZxsST^m!E>v$P*^*i6HjM(tlEF4o<$%?QKU(3)p!7ZLXfX#p)aX2mWME)=$Xj zO}3C7G?8u#&wMU#Q7Q*roWhTf=j1g3DbS2&)^wY++}G1jnf08PKj5GYe;u7T{&b13 z755_a6}WmdTerc*A3Wh(v|uuEZW_mL&>` zxeU<#YMs7P9ss6P2LAhs7+8+lq^%ods$!qnA8!Tzb;ZNBY(IloTdD-4)8 zvX=HZOoH>GVpFjM2vBCaOm$8c`%?^~DsKOAcKa`7AwP^ zqUbD^1s1(N<5}k*P;Mj*y!P=QS%>rZ6%=*K4_O(8kM!Vw-c2^8GhkO~a6_({@J|2O zgsqXZit0u%^Ew5vkc`<(sN7cv5LK@h2q%kCk2x;B1mqw#{(c?;ED7# z!Ts53YCAs$aqHv29bCQ7taNu#U#Es24%fz+uE4^`MRypBSa6O@rjJG%wljVgqG1uV8<9Lt4(PovXL9ADDbsxu$@cMR{h|@{hV2U z=5W$1@N97?Ebq0lOk}35%#%)^k6t?^_0V7-Nj~$?yrvbx_q1OJ4G^{ekK?o<$oE(b zwgz1MJJw6&K4IvxP5k|*n&K>e-Zei^fnHF8VBGf)q=#=vSzr|-PJ&Eh&F`l=em z?d9yOOT#qbP`hGzv@ z3%E#6Ea)TyO>imFMLoRc*paNp;|h6ZvF5i`i-0yJn2Q5Qc;gyqn-^Q{EZTJ|sQd2s zUqC3tV-+Pl?#w5_5A=T2K-(bRF~$(?r=5}EHpC8wRE^_Z93*$IHHD?oC0@HRe?UCN z+bRu`NqS43)jX+f2xzb}5_>tt!FH4^@m>1d^E#ogNwOkRX!jKZZqR<9_Fe5bpl2|y zpvrJfHJA1Z!quvdkfJvNU$PH(H|t~9d$jC@l6w~ly$3>CVVytjWARrpsBsS`8fIxENF|8r-%tB}zmfZM60#6#DXsSa*OdypHND`F#Fm zJ-r40$d6pd%T^c*DWi9SmuNh!_GNP+Rs3ZaBsK?N%DGaXh4#L(DBO1VmO;*4AAb)N zf1VUKfX3de_-}}FA0qG!1McdPR6oBDra)=ePR3cM8M{9F5Oo`5BvRd_D8N09;Ls=SGicJXj<}}sWI-_#D zWX3AcN%Lhu{d3ZD)kr(;agAE?4ZBXNT8--CA%bMMpSm5CX+KDQOPZi&?z4s>pYF3e z7|(q(<0QzZEbuEXo&O{3hvMHd1GIt?laT0OQ=>{gW$No?+4^fWqj%SJW)9(qMq|$S zs3_-fMBlL%_K0}JtrVZZa7S~OCE|%9c;Sg-x41tbQ{Z@|$^fkEBk_uHD~?0+@k5Wc ziTl?}f-8&rQwTHbf*Xt1_2teJ!tEk|IGEhsa65iH3_tlB+EgdT@;2TVV5o>kFI+I% zZiK5NO@lTQ{v*S7Fh048S1Ksw82NNUkzw$iWPiR>ysJ81qGL71=_gBvPk+9+NI2Vf z;gA~0y38*T>sHfWa;R>STF@bpE1L0+69obwpORnnwLrn0jwl&{EEJBe@@eU?%ols{ z0#F!~7N9gNj0tg11FS%=0~TYP+$)iP1m#0s0ZLjKvas2Bk63z28rZ+UBWXi9O4){+ zxLUJFB~e2LtNfDI4bl@W7uF8_rg=v{GOd@7?|v}WeJ?%AjBIDuC*=!2S$8F|^S2-7 z6LtO1F~k5%IK8EVD*foq+zpc29-ks2CU5b~sHkv}1;V006G!ujoY~{ia^?6j4ei}B z82L=f32KbD3+3&@z!WAbK@P)ouNu0N+X(A+=DPuw95^uFE~q|H&@7`)A% zhD%8%4KeG}jM|_uTeST=Lpm0fs^a*oCI4uq`7JmEUt4UsVo;kF1N_S~J>pv$ypbS8 zDEg*JBia&o+5otJz4>hE*nm7>_0#bC!(4)oA!+J%h@dvRRUkos~3;rm|A1@5$aO<(M zWr+se3T#5(-6q4Ej_+ha!VoL6?01bu{{atumD;4cUOpxhfMFF~WC;*A!-m%}*Cjph z+>9^)HHarvxQLx8isg?F_PC)E+H=2GB*?K?P+KfhY#O3a`7or zw((^KLrKvn_i^s#5cLKw{*QbaxC#Fasqu)I;gZQ)&%0HIlh1hf!#~3@-6}U0++=2y zI7*tld%M}rx|I)~i~+2PotGb-n3uFG#m8-}IYyTj*mP%3X?gzyk@phNqX8Q_zE|`# zs}e~np*1uL004qg@c%J~wm%Dph<4H3DYc5y)dA(o6dLFDB~6!I5Hxf*<-BcaY=}s*PU(0o4fv#1*bpaH2-t-7ejI1P!uzzo zc+W`fA!b~&dw?@GjQ&kfv|i66E=2;6F6_2A{x>m?I)Bhm)Ph*fo&B2ZiwvgR9RnM! z_Oi&-AYyrImfw*gd6tLJNz3v7sx0>#`T@gw8647W%;J|YQ9nd1Ju=cu9h`IHG|P=b zU#@D(5T(3qUCeJiVfEr4B>BV9!YWTPEmZ@iLS-D&ZW~M)hnzp~1r}Rn>2sWMXVd4- z^LPeUn#CAtO3~ULBOW29)Z=bN2w^=;_?l7_ zxN$gIhq8%u`i})lWRn5g6?KJkwt2GR?XCcX_QYR&sA$yV$a$3Zf|tYtBjJ9n^4Jk9 zS7Jb$6|Agm)Jk^ z9+Xl6&D<-T6VJus1bVoRl?ho;;_8d_NRTFI$ZH%B^I2l+7vQw)Zl+}w>;v@>fnsk7 zr-nfCrzP#XU=Qz>u{Bg8nfQYjivA%gSP3`fr~Cu=f#5#MQ=#>4!0q8+j2SR*n9EF0 zCh1LCcfx<48Kid}tg%mMHDBhBsGK6?2zOwOA|6i?BGnG`>qS}HYCH@~8^0*u}P)__YAkP&q z$ClK?x@NE|Icz3Ts{?P7PDr9N8aS?V4_|OSTQ%;?WFT%&bT9SOv^~!qRGuYtZ3WC= zl9->7AlSS9ky8oQ3#@(e7pKAK;r5_XApgB0^hp@d71TV0Jy6J?;kNUwT~XX z4b7R(TY8(=x_x~P8dVFv3t?f4VT*B%WBq6DeW&ZxdB7pEjGH&Lp}kN@T1Y$4p17|b zuoyo?jhiOa%M9n#IwsT-n)LCZYu}a;_Xn4p=KE52N$f1M{at8w(5B>tw0bjmC2TZOhBWV$p`o9ISk}6IQ z>}DB12x#790y~__m6y@B03~H0S#{RFVXIc%%w`UG$jlbK@{_W?mzc3s!_0WTzc!O? zD2^kFRqO2dE&y<9jO;>ftYOB{duJt4gLFRpxO#I$`G~VMzok9o3p>O?s-bSK^TX;Q zZ&7@qWe!jNF0|Zntr~=3GA*MLqq|`vK)?uZopSA+5QjAF?=r2s`$KVkEH;MDn zeT`%{p7!ZL*1E(ERJVf?0_7l0kMCXI7Jf9=>+}qvM1`K-RpQ|@{Q;&6~=9) zoz-~a)u8d}^s0gsWn<<%ghqqua=R$n&Ak)EBIMUfF&4B>{rw(D#SwoTgy$?bRI~w} zAYM~q653Ow{@oI#Q_r%DLv9=5Hi-bUaZteNF=*#MxMpcCt2K6c!i^Qp zm^EH(A-prWMk=XiS@s4r=BhwEr+>6mOVKHmYsf@PVemvwe*1S%ARA?h@h|#+0#VP& zdua69ld`#NtIkkVpR>D=`&|H#LI%P=JDOm7PtlXML zHhm7?@uV#s_gK@tyU>AVV9UP)D0o^gEoED&&h1@CGiG+ z8N5h&VPiRsj$;q5x;$KVw*0H!cyy!z!mrco;Bv}e893va7LvC?>k%VWCI2{9+8@U5 zi!3`37IQSxmTO7LO6qQ<6$IdwOG+c&7X2bP-m{k%4sEko_$=AQ55@c=tevsamnhMk zbwd`xeo*k9QqsuokjSmQ;qDb2Zr_A(v?n-ln97I1E3j)JO6>)xyb+44dPM#V>F9YEYNc zX#(tEc*2ixn9XDkeK-~tuX;DUqqxVpqBzO=O7rL?7=?r&KlrK5!mVhoUHkd>+G98C zgd#=OgIE!gh!>2lBa9E>d{@vaUE6Sjon1JpO2-;==bkNAAfKf2FSc-76Ut0}iil3W zaO_yX1u86?I#K8|)?8RBCuMPvouYf0W&HkJxkBezITe;*z0)F7bh}95D+SFn8Uu^z zxHN)(4!TntqHjg93TU50bmddO3slKJgO*78?xqFh80H{0o%;l)O~8c(4h)qC5F|snE{(`#LR{?rU8>wZ5*7Z~781O@e`H*j7ZE+$| zJJ?Ql`V;!I#+>%z94+BuyEx6 zV{HF)n+X_!L?dcG;*o~@@^gBEySJVE^gfKUJ&%A1|783nZeB20OnDLpyg2>4G6;Ro zMFQm_L8@Y`1l<`UT8VjE)9e!X7LG~o{uJnGGykyNe~#_)DIZsjK9ceM z(8P4u3g{frn69Uvn&cHorO%Ma5Sa>)PoIhEGhQ73V!~1UXCCK(X=_MSjVq zrFWfl&?k=hx}n0aLfL~r(ept2qDU+CVt8-sT>!!xXJM8!(dt*ul#Nbr>V@$3L>2y7R_oeJ|)S0KlBpDlEUrh1N;j2Xm>dDSp@dh9Tb7%C(=Az_ z-PJWUN11=!J(6S0+st8CAMAsFAE8m9FO6!u|Hx+3Y-?pO?NZ0AuKwN9|xl#|2B&O%n|gaxz3y zL>c+tj?!xd>bT&ibWzURK?Z0Cz8DOqipOd#hr>I|?lOp(M-@8LIqwxf%U%$Bp@mJZSan|KP39{RBWamN|8b}5+v-h5ZPDyAMuhP+vV>G z^^mQIpMY|HNca?T=7mnbgkW2EK}~(}5Hf;1IXi-d60$KD$=E5QwL=>r@g1Kr>=LFQ z`;>J4**Y=>F2qVu|0#Y66@L|^+ah5TOnaYa#oTeC?nxPV3VrFpjKKz9hUDRB;G~De zN5&PN$9;x<-mA3LHdzHz$Ynv6J;HG?xpiKZuv6NL&4`4B##y!-<5X(6i>(B4B9ytr z4BG}%h>HC3a@wY+!>w( zA-GBu^GN*3|Jo^*vM{A5< zR?OdsoOk_ZGSz#eia_mrC#?+!@0Rdq29!D&2GpT^;fLDInakPYL9SeLqgpQ)NQ`1D zikWE|q}dsg|HJ;MK$b5h_DnDiTAhlN6 zIMmV`kGK0#xi)(dO2LCCg^o1h4Co{CHu#=*Z%nYvRw2|EzgSMJ$`Ksl+4LLm*Cto=o{M5nhx$K z+hZ79?$JJaqKe>xA6zqrF5k6Gjw9-sZOm7doLp9Ec2_Qv+${a=2nB~=pL3$NgOdNm zG6ww#=i6;V4o0dx@HNi9BMR0dcC|E@30>!p%7n8g_bViFJ#U5n6RbqD`C&&I+?S(d zQlmOxuxt&OYo8KRHe`ik>BE60Dqo!VK>tqnIHUYZ3?W+52>jw@7GJ%JWN*<$zkJ8YO;rAmC z<8z93p#hS|E0?SSY!->a!c_a)#*K~puy@$=~=uT+8Le$muu)u~z z>3|9{72k~b&Brce1*Ztv3>GD!k;m)SfT=rTtF+@?6RtBOLhBf*xm@T&%zC00;;$}p zU1sdh=rhIxS|gzxyLByGk7IaL4+WY@cPAm_CW7_F-WiNTP0j}%{OFA*g27x##a`#T z#eMP!cIGj5Ug;YY;C7i&VF4-#~Jo&1=G^f8F~j zf|QIyqZtEFDyKMsOr1VDhSpBx+#s_6RqS|6GJ{DH6OLR}md}~aY2J9fp>L?smwZw6 zXXJ+!L*hNF7!BQfH0dQgV${4zC-ll}s*Wu9EQp@{`QVh-4L(S<{5RcFOR9Nu6n^WE zpHMA0{Byd~Sg&Xjl(xrlHaB^mh4H4WX(K+(L&ZAaVq8EmkDYTYJ9l}Vk=vYS!I z=Q5|E3?CKbD5yP4Dn#z!3@LGo3C@rJwVZ<;Khkm`4|*4T2i!R9kmp;;1pi{s(tdt% z=orFHCaWzAsi7Fdch7SBX75$O#ZavFYI}>TsJ3=iSoED%xKCdQiNd&ddpv>Hf&v%_ z5i0l}uH>Lv7e&pm4fk+`JIC=4e)|kCh9EkPk0)wp3DBW#0mOsrKY@q{F#ob$P>+S8 z4}iW!@;qIA^z1(ArjzKWhYwYvHP{@8ga0`yg&anKtQ8W|?Wq zX`Kn)E06+zlC(A-D!XIylqD**x*43Xhi4~6*vJ4<=^C-$mf&7nwbJxvjsMYBiH_=j z>&cpulkWZJSP_%@I0Ep7#_9Yv9X(rN>FgK9c4?HcFhXH2!Q*lK5YiZ8hlzqEhH4ow zwzJplhwTcs=%kYeq= zzo49?m}GQ*Z|5nkS$}#k^Vpvx*it5E@b|{V639tH+r$qk0Jh#h$()Hg`=7fORMNML zNL5Dx>5Mb8Tp3*`HMTBgy44fJ>oz+3t`Y5B8|!?V772Fq`hl7lz#Zc_jIoy-4zRth z9{kG&?6+G2B3F>)U!gIZ!%tqfWYTc&npwz$*R~{adzfqoJOB=Wk+;F2vaB>j%+a26 zi*30>k@NyGgv2}nGBp)L;$i$InssrPkEZSMX_(fG989_e>bt=<*$V`YR)6=KJk_w# zpA&Lyp;}2)6?#B_I6ANSuyWOFua*+F$yH<@g}GK(&-E9nT0VEOXJIEpg6N z^6HVQQGOpfdg|lXfjK6P=hd`d-`H0&%qE734rZjOZ=e3vq2T*(%$F z$oR2Zm>s|El~gW9u4=Zq71~utB4}=Wk6!P#Sj%fX0Snr|FCiG`gdXg6jna)zDF!-viuJ# z4N7QxFm8w$OO2yoq)g)55k|P1w6b^1-=e;UgTXJPe~=>Uu|H8#x@nu41+=5rq@iex z$3A-+Q)ugyz`PPfRx7lEe!}?WYcHKY2-UFuL&11HBdgX=umV_(O#tP$m2f`Uf`)h@{-i*dM?U4*Si-2rXd3vryf*m28x`n2|JL=w@QB&zM_J2 zMs3^0%CEqwXyd&=GeFr{sLbg&3#f}YnNh(?E8a#x?o+@|UUpkEsZr7HlsGHEug;~( z88FFF0SPZf=OGYLuB_{vdm@3%pn52rVWmzt@r|FA|1qGDXLz6tkENAE_zG&(AaW6iJfTMg*4_nAvE0sz3! z3udI_axBuA-huVuWjiQ;0V@5}z+I%Pl zJqmCcUv+g5o_E((7u#F6+5S;5w}!qlsbg0?CgJQCD{wdkE0g8!*HNjGgt9#Ms)zaMWnO zsQeOV!d)(^p#=0bm~uIEDxFS&oR1hQfDK}F{5@GSPzk)gC{qmq{@SH9sz?=WK=+q| zs5Rw+o)Y*ZrJ1y&P(#{L(+_rzLN4X1GPU3Sh00_!28x+g2`K~}MGH`mM!$|ryLL}w zQ_d@;5b;omebgFN_s&K!y?$JGFn;HjgL_)jvK4kY>&_JsS{(okmoU4o*6~IwVVDO_ zP*XAs)a$}~4(-wBn2kaCjuDzyzlc(}_a*IqUKjUn3KMI+GxInqBabdG2%@;--bPOg zE`TtU<b?1Ojka#Hgg~MVP$x9>Ko_dP2FZX2g<#l;PS% zjaak|BG|uGk$6&4O>euAL}>&Eaz~2dbi-PpfKI&tK&HM9wDC*Q0l0;7ihM75 z@yqar#;{XvdNzTb->mPmDUC;gv%gA#d%jj3>{-|fs4gIZcpRArkg>k8^+bv%HQ3S} z0wsT(HgI3X%uAwprIV+0f!D${cD{qi9KHcSW`3hww+%~AXW%6E;xufHbeC-~!X2s~ zZ6!f_)-y62Co}!K4}HCC@9CM>r9)t)-f%<}M_!(#NBW%miVT{IQ*RFLQUsb9S-H+4 zUW(mr$GKEt9pRlegdJApIF2XC`A@4v_JK`zG;pO`OS~znj0AzzC5K4{D-^Hra38@s zAgyC-!5{|7#aT|oz!t35?L~@OeDoj^^=}NmyBWU3PNzv-T;CvV^GJRAMEBRW_>V=> zv1Lj>S|`2~eYDx?dLua@ydQjP{2*kxA^qwmAg6Eht?uNocQ7?(iI|S4r~+g%RKcUV zlF*nq&aOWvppUePb$h*KsbDN#U!k(cTn6whWp>Vy=Q$c`+tq^gS-DEPdrtV=^ z?g^#y3$vT%7so8kzfU!MQ27#=q9;+;E)dcTVN2ulsvg3RB~ugND>O4}hx6-MKF=aA z!uj(ZJA)lKn1-qF6GO%$m)t5W?{{$jYUSrpokdfp36>$t)9ks)tot1*HE7zV;t3Qy z#)vcwBOl~PZ)%^Tf>mX_l>J_seDluL<;o(VY$tTc6cQ!C5 zuAqMgL^B{853kdsgI@zd&1OC)*L@-->&Y^4F9?$M5cxC}6}G?0I{2&EHnyrx&5-Gt zYqUtFLTR{Rat&?eVkP5a^7t@WKAR-m# zM(!v0hn9+_4K6(`oWPi?_5~AF#gAW%s%dVLLg#_*Pz*EfPP0@20tpOr{UU~PG$I?* ztlmEjVQ69uGaL|ekm}&smJ#Y8P57v}!j4B`G>oo9hMC7)aGf2Oe0+v*4{tY&#?15AKO#`=k&Oxu#VA z>Arls2Av2^50yTiKE>{6w+*eT^!IaMd*E6M@>kCyIqMi@83QEZ9nzmzj7BT>H5yIy z9{1%?l=YGx?YO~HAJxS;L^gIR&fhd?BldLWMaM~G)iAqHPdi_N#V^(8{tp0TK%2i^ z<&mQoM871q9m3iHoHeBb#my{uu#fT#r`+G@zOCtB23-GAo>ia$=$1Z+pKB_ZiKf~q zQYEE?e~T_Eu;oq1#MIAI+lCFuQfo6Rb^+w8@;MD6w#l1z_&HrcG&VMXq3yInv9Y*p z$?Ax8kFaFv>YGl4ZBiW1+pMG#NK;lK$@-^V-atG}cHGRDy%72_j{q8zeOfK5N^bSr&8GJtwiZ^0g&wcIA(DF|D&9?I@^P#>a4*V!Zm}HCsr479~Cp0_R#!z(M}`1CxBPv0LGk~gx&g?t>XCG8944nBuq>QN^W=6s?z5nmQf8D^+)T;ieJiwl+OcGhzc>aNB?NS5SPVD^x#A}?$nayF* z_kwIYPfR;xK&@s(DV@LRXrvnRCx0T(Z^psQqbs*4bojoL(1%wQPX#?au`4M{m{V@1 zw)d=<*aYYyO)A_4)Nrv*nF-+k&I*gHWvHdb%ZjQ&*5v0li9GXO%zY*e!H_$g_>Jw; z@c@2&{0rx`qJ9%tIU8LGkQq)>Hr@+&e<^uUd2$&7hOim^VxMnh5N$2I$w5<2*V-kR zZ|=qnMhm?viZ8hl!opExG_@x;IA-6bfJNu{pwFMdS7pbYz;gH>Mvc>fAiyBNL|$CJ z4Ol}udS|wLhz1!ku=_WP^QxqfYD97aZ7A{%^SuUm6C}C(S5R0$Eg)6o3V*{HGu`FV zwCW}}{p5rVHMPeR7$OeO+imP;fKy;mKSPpk+)clTV$uP2*!zf~(&r>^1Ilc`aHN^b zLR)puIz$_wr@9r|Ffuva?+9YzT*~_IKkAXx1V+m|oUOFQH%0B^_iI)`*CyH+BsvDI zT-idR;zNPFodbwB!Vgb1}F zBzyYqCSO7bMn6n1k8VImBC*wGgf2Fvf9AsGOSnv2rthEq>pryXFs4m^&to zq(p^7;&dDLn!Q%5YX3?~k>!7$pw0?^{n>NYVEpOSrOK3XHCsjKP_|jAuxuKIC7ox> zgCr(y2jVkE*C;wl+I%GomyCS*ErI%A?aM*3dz7X5w$AXEr)$0!IUY z_2pRr00PWGpV>qIXfXp8C<_u$?s3P0P`ag2wHG-ceZVE}wC-}O4W`Uj&qf~kltuAi zp4oo7Q}3^2LP0|;vPy$IErEP2}q^>+NzY@1Xm7&{Nw>3=# z1h6mNOpR3L#R;E@#?1qbLm06I+FNKXYKra!%kQgKVMM|ooInL01fL$OrZBiO6ml!I zO5f8Rv5=nC>(K|vnwj0#{IjOsc3lSJpZF}fZC}U>y#re0n3`VXzyjGag}&BxXp2E8 zz^7Aa9iUE6)Hg?0|CkO08%<4sJX>rm(ptclXA`O!?{W9QO^BU2IGCDjl*``(pjKnJ zBEpvC2H=#SF@(;b-I~Is0Su>yOi|QRWU3Bd`fL~(3H?pBueCGB$t#2d`y+y>ID5wM z_K8xt$_KA`#|Ze(01@6?3~Z#x*(9wJ5H+BkOD3_3tMqkp3l7zmw-`{BqQ+V`llSf| z{t(49+Uyq3j~hVJ@)>VQq$dp@^7A}WR=GBtSdFgZi;F+ORDV93vr*l;Hklm;eh3s9 z?r&<=?aDfkVpds{`{5Op!(54fQ{}X;C;v)rkK8hqlCLXlxRg<3TwjCo+szpE&ATH^ ziFaexc?$-~L*E!5Lqww2toUz@zyWt(HLYa5iFKb%k`g$rbL*t<^>`3K#wNdlHx?^G z5c_!PoDcfTc#&&+x^m}mEi_ehdBo8r&a)66WNUl%%Vb_@(x&!*S5EGI~zVxT6q3376%Z)KfYKanI=oZ;=D^s>Q$n00JTb zpZIAX#*bQPyY}WrqV0m0x!-No z6!40sv4IDz3)XA*$@-*c-;KFZQV2{i5O@f?MU$ao>rS1JaH>Y*^TSRywCcL2Y)g?? z)qdMJ)tV@`+-tiHrfjy1s!FGwFVIMt zG^j}|-3gWrHI`2V6k(0#@k!DJO6B>FJmPHY_-NitAYBxq)H(~(ee){Ndg&;QogI45 z#=79^`)9$0BT{#ZdlP@k`}l_IgeB~oV;1!)b;ksR*HUaBna#A6bL!2UqL}yG^3@_b z?p;#aMnbI>plL+7DNsC-vYZD==O*rgtsVqpI1@Y(o*4l=L`xt$E)H!&R*EPdW526L z1ngt_&ZEy=bXds=p6rpaV*($OS+gvSosWoS*&@cOrg@JI;B)f4kl3HVhrX^Y0&kV8 zJ#LB@6g3#b1c_$!T3i1EEM(+7oCAn*N@q*%$j)3@*Lsq$k4aF0Q2h=^Ej!I^Ma#J$ zt4E{Ul6*+;V`FfC813l?=Kby_8RRxqLjSfM6`=K43Pq%2J1(ME8J7NgCb`EDfRYG; zXK3z*$zojR3wKiz)oW8%IBk;lFNgbfZB~9jnln8fD`kV90IGd7%!Q}`$$Y})Uudh( z*Gt99?u0NPt`$ZD=^A%y!pWreYbb$6E- z)2r%~ow1UoL_;93_bSTn^!n|fc4E9nZDKC~gpz#G zG=wK=6AZuXYUE-~$*r*JqDMO@EuFbHP|lz@KzxLNTk$h%V*Y3GOMF_u z3cq>uu)7s#XbYLws=#7c(tf!Y_yH10@q-Sur?t)SngMB@2m-mhQ*1rATI zjQ(-vNXMC+61(};h5QB8c-zD0$`hmz{IpN(rrEgc^O3N|Z;uW%_hcyL2#Se61_erkihOQ=96QLkFkwd?S|6M?j$-F&}lUI_Cu zD$%?t%BYxA8eY{vI@V)c$;@yWaCmu$h4pXolf87vR#iJMOEw@2YVzE-(S%B?oAu!OoeIpdyv=da<>_C&^;#xNi5@1Nj+TgY zN4X?<@%OB54)hoHx1Jtgx`U{{4I3Q~rx=+YG8p`Bz;+<)^B}hYfEz6U$ z0o*PzT659g>0v9#(9fkm3qOc!NVcF#7lw$FV)(CSA!$2NSSr)eR5DQPMCREp3?j77 z%-N?0YHXwN=vsqVi|9R;XT@Ef6_pp?-%pAzKmZ5i?^WB~eg3YT&r?9LJl8}edKwSN zl_zJQ2*z2v^POca@nz&xaE!^k#sem8wKO2rKn%0HvNM2llsCKj>y1M7= zm6)e#Pt1?dnL;bMvcXyoO95SLP!kTEyib9w!90NeRt5O|ff$T`ztEQ`LjH)S051O7{ ze*X@;I_#g`(9cQ+g)@Xp>-k(9!YMh(gGXbPaz;@jW6WdZQJII5;*Zz8 ztltnLvw@3Se=|k1y>&@Fg3yxeCU}$fczz~=<1vt0%q292I84%EYfI;|l3v;@dC5me z)qH$~s}ud>Oby}dyOvFBDSU)(kgCrD^-goU9Y;y#53{c3-pFf(v1zD4k%l<-0eF-! zzaTu=2yw-)O+j!R_x<$k=z^C9mc5Q-)we}};<@Gd2cAhM6D0OSHb(N4Djh8);>FbT zdxAF~Dm0Rh1&A6*Huu zw$k0$8J)Ke@$jzJ9Nqu4F%>o-o4%Db5uuTs+*TP?M3du6En4Ng%E*mX1sm6}KNjIZ zih~xzI7=yb4qFpbF_+cL&<(68LH67aJVb+J%0Gp{=Qxy8e>zDM zV>L_zok>nvTm&$pBkzkU{lxMf7Uh>b5(C0;h60S!awnHeC3F+KpyzUkufyAxl03c_-bci2p_J_#G#Gn zMv%Lm;La2T@JDPXV8sIBwUO6*N@eY=d!L4yE=B>A(_7E*7BCs{WAC{8b%WvS`x9wG z5ylWlyy`;_^t^2N9Mxy>i>8OW8Lycs{}6y`d0Da-CkT}L7oJ{iNN9_c`?1Y!dHWNw z0NF_-8H)E=A31OP9QnGD(7*S-d^J$sfQYe0@$e(N2U>i4;m&DhecXf1>kk`#q6L{Z z)6uo;=>(8V_Clv~lk`CQgTLOA+jiP|&9Na>{}SG{N&uHCE`xO9es`Hb;FMSO3*J01 z22oBD=?k}KlJ9(=_6Z!FH<{d0`VXEM`9Qwk0oPaasvZ+vu#c^XzSjyBsYyc5L&BJr z4OxnBS=raUK1;xyUE4m%M)}OFi8#&{59?zQa?1I2M(7CcYMU(TP~)K=>RNH&&6CnF z{dsFO@%#4{sIOUKWSDggm|~fqy5-74x5$U>q|^Cn=NaLDKE0j zig0Fg;z@pn@KhG-6Ie|lOZNBffn3Jf z85ROW$ypK?Whxh&fN5z?5Ejj6^i83#xynZK+4$-1=z99^fl8JFYn>!fqGXje8hL-J zsSy^$2n1iDAD2?8sXk>8sKTIT5Sl=c#BT)$41Vnm{+lE6iZ|Mp;OBkt9By7?7)3`Ar@?@Pl}K|7EX_% zvXIt_h!YKZ?WKlfMC_5d!J9houz&^N%Ae(!9C9oqAJcFBxH@^&YWP>b=;UUV-W&Wp zcJ*7zh6tqR5x6y(7~gn;35NjjqjE30Q9wNoQMjO~Z{;*kuZMQ;jW}jJlA4X2 z!5bFZu9l`xEK%tlB^P#fFSaJhW94;VI&{$tPi{5=+9f4u$0I3Ls8}#$-sK9UJCbZV z+CJ6<$BF^7Ea1xpc8s%?buH-bNDUSwDQKP+hpSDi{vZx9{$?nC2kkQCJhaoc_=}VC z0G}AtslxF61A}VK<^F9l!Yuo`(U^I{mAp5}5tYf8XKnZeaupGkH5pq%`0{x(ZrWnv zGM=gJ=ly8Te*>uh*;t6E&z^yGvHD+M&Kk40+dD7d8WeEy^^5pQYE~3r%R?JUyl&W` z+mdt)L$|7myT&9;rwe>q1%pj(w*O)&yXCe3j zI9K0qw!f(Q7BozL#w9Rk%q$$cKG4P*SB0BsPMlYEq>VGnEuj$(ODBUuqI!|r>-5p6 zTVAPK#OTRudTkvSWa#1Mm8dA#5H;}26hpP9SE;$dW=V~owWs-`!4%rK$y1}F>)*}-seh{QO512^VRpm_kJ>ZWFQ=B||;jh*qaIRs@?`nc&uy5&wx6k*?+xLT8i=mr-}Ny%YsJVlN9qtZ0RyZFs!%D!~a~Q0!4S&(OScuvFTKO%MWiH$w#i+G}4b z7N^gc6CLDwhfzBxOO4ntJ%+}}h#U7T=o-?tHE&7?vR1*VIa(pl5ZHmEr&UNy4x{$K zX!jyLg}wGg1&42H(3cI&=L0NrE2*;(8nYWoL~WAXC4qK@>yv#p46&UVi-ie;1xV3J zlk!!!C{y|y1lK9f?6wiGcx(=>U1Xe(F#NYq`13W>V97F$T zFR==*5`EjubV&f6A%(Xn6r^A&C6c5!_=I^(AIYWzBTBj$`*f=S>J1#Tz8< zJ<13@C`2FJAa`yJ!0K{^djduKBq6XX>GTNlqNI$zvE!GMR^y$Y+00Xf#b+; z3XHTWAlYaMD{nSFmgy%wEv_JxC<2e`mxYoh^md0XV3{c;b7Min;ePpOi098`K$9^C zTwq=keX&^lF-xM&RG?6go9kVnnVEI>4LxLPW_G|KXMkxKUb(Q|mFe0rMA-x^r>EaV zm0e#TusLrcqxxNHnh;YUiVUA>y$RkEf80ih4{X^i-a8NOVdCh3Nb$qWCtUv_cG!uF za2pZrM0!o}AnbGTSL+q2Jf~eC*m@{H@?#|chhq+7FuW4M*-C5k!!MtylKy@P&*SQb z=CNhr$|DOF%qJ4xZQBv#%%QP!8=RN25)8TkT?~->a2a5<%ga(!T2UCs144}F37Rk+ z|9~2%ZTkAiRMA*^EXZiFE^0(jNWov+euRwEM;e*hcum_qMmsgqZrEnNHG$}pa)WOI zhUR4dWJJOyKLIT5PY(zI3pA6HK?3>v9}__l6N-rNS?6f0aVwVQZ5zyMKM(34EO8|qHROQxoqxZQdX7TOql!2e#$!PcJ%@qr+dGJb&);Mz96 zp6;U>D#O@vmD}iQK_rW;4~uKE>PSEl`)8^`6hY?_`edkCgJueXv>UzYE&9wp`5gGW zQ|WBdhAJX(s7ayy>M)WmzHGteJMrdqaVsmyK=pkOtAa9LPSjjSbJqX>0=@yBJ82(9 znfq&d1fje^o9a*UG4hKD9N??eDYKp~Lj^5cBc~3; zqM@DnhV^p8*FL?#xWr&SSl6lnw`%mXl4f(Z`kTR{WkUtrZjPFb8|AO_wEi)aE^<-| z&WwVa5V4>qB-?;#A;hb7qa&V;+87D|J>kP14^GTK7ENjvL)mqZy~FCDxqqx1o83?l`-*gxzk z*obm3E4PaTs~#q%weVN(p zoRw!pL?ej$c=1`LP$uKAo;R}c%FqOAUa@6RP-bA3Ue%r~j5$HXHx0_zNf&3@YT^Oj zc_6U?IrEW7EBJ@S9)#jN-5yARlXQ|1%%`hPG$wZbeX9M_YLJCI#G-XLvM963AGM+Jqkvjxiw4M#DUjL~_(Uem@q{ z$JX%%Wh!MQeDKpD|J8DksTkpnY1lE^4TF-i-5sDB&+fL|-O`g9ERu92n4j78?;W({ zkL-6^hTIX0S*P;m9FpGH*uc;C(;{co^Fv4$`L2VhCMhGk7sLIw{mhQ;)90SgF|E`a zeq_u$7iC~NQhvo_#&nLZCiUxXbZ`(f#;>*PN9f9Yqsj}Q&a|VU5VkgyGVF!ru#fU+ z@0m7R0Q_}s%KLTUJ8ApWc*w1%000WmL7F~Es6lL*ObDOv(7KN-af+_s*!s4}50sKn zOG%pXU6!ssSPMRTH0co2dOgWe)H$#(Zp_FkF zMJ4mRlf_5eQt6SzP_M77MLSRl(pszPc8bHZ`85~Y7&+-_*^b_HL}FtT&SY^dxmRis zt4)Xk36VyV*q@$U9sU^O5dVHD!GewtuOAUAQSXbdo8Z>7KFcbTiNV^(RNzCfOCHI~ z8p^koVfa7ZF&CD%*B=;r>7H~4O0${3Nlc_ig!xg!V~|Rt;y$~3!2w|{ku^b_b=gcD z=~c-$2Is-OYFMTa@yU+ldsegN>){$1P%4r8pAiQ|z1)1H;fW9Ea$Q+RDS<_p7ls%b zhhrm!JPy4f_Ki{)W!6lf0#9G-*oO#&05uR6Muv&v%gGDuh4^K> zUaPZFay(g#A1ru;bo6X50wIEm40m}IL~k!}cUX#r2LW;Hfp|Mi)PF;LB})g1lHt?# zGNN`nJO6aWTIhCNcRoe_3^EQ~p_NwNPpBhOn@u=947~i*vn)818FFadA z;mkUTgt>kZ^riGSuU{|A5-4j|xjzFVe{ec?LM0RC8y;pcM^LTCuMp4n zjdT^2pUjHixYeAw$&v~EM?!?&c@L}=&mFdb40D5fNYc^rSda8)1#W!U*_`OM0lKG_ zn|O8^NBFk!wh65_Fj>t^=4NO>u>c`(=XTOC^3KbolrR)MS}fr9VTQqJ<)&|Li2y%n z&QMcu5ELV0I-~7yxf`IDkutXLy!jS0WQDmD9k&`^qci#suu$d*r@I|1f*k0YF||bO zf{TCZukJUe5d2g_0^G5C{JYLvYGc#Gl*1G7NGW9WAdFZY(hDWtX6P(9?yvccd^JDK zQf?fwz7uImjc~+ek*g~chaMAXLJ)5#CN_5Em|BsYzU#V43cETNr*CDTQXQiJUeaiV zYfcY!avd14GNnc`?l^}z)sF=e|INEGr$>N}2*$y|+8L{k8c#^` z^MaijX~HFefd&>Kps+mLw+AiGZU~z*g9`k<>~Yc%sY$weDM_C%rrBq-{J7>WI|UJP zoeW2MW`0PNG;G9zn-(L{S8pUBrHgyhv@>i`~qG(;-Jrr zm)c05I1LwwP;0+zgN$T?imALTa8}cvygg(tv5t9q<}xx`GDr zVg1CqxOdd{Is&;MB)eKaJ(?RNs@3{e7YQyRJSL+TXve)<$pg8i!whrw@LM9iQ9h`->NzLA2?vFmUB!56iA-YCOE^GG5=(6q5(a|f zd`$aq!kQ)aH#syC9jRBV?-l$hpTh3-#}HvY73KWg!CkF@#&EiQoBprb1d;!T3hep4 z&q0fD-}YF+RG;#ak6CM!C=|wJn5=#2Uxu%+Rf+Qib^Ezn# zWQyJ)`QoPzIpusBIt3L++Ar?=`2Y#KKCHC89bCWlW0P3M-ymTzwB;h^Qc}13h;)$K zMb9_3w-cUO{=Z1q_6;p};48pWB5z+TR+^&^?UN5Y}59P zij+!~FbJu(CPw=1X|jtZf=Gj<=kR*E9nh$jJm>?nMzDZ;oTjin`@4Br@~#$Mn-iO& z{)*zz_}1+naI4P@*L*gH?JW z6BH?z}CanUedS3f!4*_TYM*39f} zs$!6U$v{&dGS);u=FDNk>cq=4em6^RCB(Ksq0~>ChL&{c;SO{-L+WvUdyI z>F;>uro@S<4S*+@kjJ)*Pa5OOTkA8M>c&TC5z5nZYv2KFbqRK&HPe8x%xs)epS~;+ zd&apE75p#oX#Wk)_ZGs-Er9#!rT(U3NQ8cgO?BR%57?#7l%$XfKTT?N7bFB^nTb5q z0Q2k~)L9gw6LEK+Lrj)k&EAE2$(mV79~7;~={ zxkz`}mesV;l1Sc}hS2@FC2kZcxF54NVC#44csVsBF!Jj*8r2BSrhruQ-7Ov~M4+{g z)KKz~&zKC0(}?fQPM*FUmH3eca4a z^{N2xGi{rzuRk;ZOFJh{qgsX!d0~`CU^tLbcWp$s!Wf#UAYFn@Mj*wR<2KECzT_7d zJZ3cG*07Ty)S?O$7&!i@g7#Y9#x_|Dv4M}q4jTcH9bT9~000dhL7GBI;R;e^Fd~0n zVjs~9+a5Jl+YB=+YGLGZYiULP=Ru&m!VOlw%n}I|$VlLf^W#d#?1KrkBvI1}z$Z2S zg;N{(d?%XX;ykr8T{?$a-d~N~zN~x{0?sv>1R7P|P(2ene)!WW`dsne6hb>iP9tKz z6ex;H-Vo0rDI+-k?fNNmBo&P8k+t0`*exzacWc2pKOI+S|A&mk07jT4*0YMKrQ$Fi z7O!HD*8P|G8YuTrQD7VQ2we)&Ogm}@Ns9htyxjExUS(_Lg*v)M>JgPb9}iZp>o;`V zOlqc9em`Wg%%*$!YbAu3E2rZKf4L17MI2TM)D7#=nYa*FiQyw|xNX(xuBP6(CLQrT zT{rN~$N`#CxdVEUxZhM}=eN0vWl_zQo1`>hu*R3jCpstV~7ixAe zQJp(Cc2;}^3Z~+b2unrfP)of>keq;fHMGEso?8U0e`4!(iG{GyrI{ll$kypaV&oF8fLI8l?J zrGkXR%oPg(<+}BlUb%4=6eO-P&e)xh-Y@Gm?uKt31iF+CvTB&5`Vc+rx>$Y-6QRCH z_gWa{8Pfat&Lb&I;fsCS%}3tlO-aY=bFpFx-1p zr;iZqM&iNb%^4oi6&pCf#nQW6(2$rBOLSF%&j`1RB zBrZZQ7$PUQFyTd$I1i?o-HMPz!IXv*CK8XuDzpJZ)^g}5A zluOX(s3L_ZBNTn@o}cl{wb7D>t`5i&Ze%KuU0Yk5raeSju~>&e%EM2m$;*lR=sV}w znoxdr()e81ZI(v~ZtX{rLKaL?>;%?>iJemcxnZ_qO!}Kdv4|~TzNPlIu2sQt*eWahRR`Ali=c@?HxAeA# z{8i4wcq%UEWb<5}?vdi$~?s&505AX)h1w5xGN*%0;^5YZD^82eCYIc4+ZQqG2ZQkHs`O zt~U~4a9`;Wjm{0Exh>Ps4S*G^i4@wOl}`GZIO97V|VSa2l3k)2IS~qeF$P;*4D9+3`OMT%K_0>j!U;u_r4i z|J@xOWirJ~t`$Bk$1LNc@90(E>w=MabxjNivD|)Z*$gM0c*G@x)U}_DxRwh{G@Lqo zR;HXGPO?c1Oyu90i4p)0xq)nwZ$kw6$?t6!@g7%_eRLFw6z;C<(yq7h1xHqP%Xn`r zKf&&&rV#_C@yi&1c}Y$Sk?>D|bcS4W&Q6)$p6_Vmw;DnXkX9v2On}3;anX9nuQm1< zvTvqLWc-2*6eZ_6hXj{4SN zf3a36E3L!Tc9r6j(7g;mSf@ocTZ}7}nv!8O&66x$Y!Aarf*;Th$!rzX0$Yl#IM=H061{y2H7^f^;ux^DIEi*+= zgeO<7He#}l$o56mvXfI2w|pAPQG&^RMR)!)HuMS`r>v+(O0ZNc?Q8l|w%~?GF0)hM zS6a-Q)W0VPaPev;atHw{vnQy&o8Zn)90h@k#50{uuFe!0dm}z(imWLXFZR$NN7 zR^5tGV2IuxrAY0RnfOP6!D$?c{u9aBrwP9JJeqAP%&>ii{X!3Ce;Gf#Ea<@oxhze= zTO(>=%B|`6qb_6-5RTJ}ypT~gU4rRzET94qh|VcS2^sC$L{yjrJH@SRkR1@Lkh`q{ z;n1*gmd9)*HpWkiq3Ui*baCMe22NyycaYI8@HFWBuriSv6D$O;@6jkUfVS`KERi;l zSiJC1Yhhvo04xv``8DN8d6$3yZ|S<(xRc21phWzYTW?{M%)LLtJ(7U;jXCvUaJ`~e z>-=ex*+U>x?FJ1D`qokiR7c_$8nhf%-e2H=OD+l?wQFfnAD<-a+EYuQ?c796^zj{q zlI?zh#_orlp`{;;)!_grfV1EF9;)o|oy2Qhhejo6(E}6BtCE?E!K15iM;D*K)Oa+`^!G<3s@p_<9YH1* zKSPyY1fuEfMjWJ*Oo0gP*Z|$8lqjCn{r6!j+QFLXJTha>`9t~-@ zTkjKzdlMi-;1=dZV~^-On7DTF5{79DAq)rF4PVaS6T-cMl1K*TyBD;;acOg-jtpWb zrEfXB6iBPS9Nn+X|8Nz~;@Guy&wSZc((Jv|QU_`)WNvhu9x(-$4;gyZ_%)Z$H@EuO z-mi4Co5g&Cw~4G$;^^bS0~|xWg&CGi zk{wl?-*vU8fInA*AD|ve1E_33eRoBKz}~|DqfbcOd%y;AX2g8dj}8bL5zXm78LoK> z(#9Ojx01rk;WtN#HK?zFVbaAbPdpz@6!qF`ZZ(@#vQ(edc{o+9n8jn#d8$S-n^Av~ zUMvGrQRKi^rn~^faDJMZOwa#wis}TF`5R!tR4qO#2G9SPou9oW9rpv#xR$np)W+kT zx0=w{a`!=cA4sU;ezP!ms+r3PQ)9emMIDO*rOSr~26ZGW7pP?)vm?rPYL&|I>h&N_pZ~HJxOc z#(*RWSOPGSxtP{~d_u(iQsYT*0_MwT*Y1E$3T7aFEwG95IfXHcfuA-Jvr4Cn&uL4a ztZlZ=cGg5f-L>m3i%P@$9j-IdOK|Wy&Bc!&S9M_QkkdV#!y)ss=$zwT`|u=iQ`akld<(#Q#fjZF^O;sq zQ}B!^MCN_}E@_Lw%7lS`gxYdpq4-MQ2p0YBhy~=o`9Um|MKh^YN0cZUAR+n$0B8$a ziyQ1SiKrm>HRj<4Jcy2Wm_DflR8d^4T>w8>WgbE*PaZ$WS^U_HPv&6SVU1|**2n`I z?S@NxT$A~ulIWQO0r{Rj^d_v*vu-tOyOR&&pW|;Ob`^qdk{w>*|2TPP{iL>z8J<8n zH7gFG;N|P4oAf0@7%L4Uz{gC=1(}glbt`Zzb6Nl!&4EAV$v|i zR7#V$|Ipo!DwI5p^7>kH7^j2TT$sS7D0^Tgyf+CjhXQ5PSC#@`jlBEe&c_u=HR#d@ zij8^JraUL;^}65T5Gtx$Uy5GNY;!K`;-I6){0%vFcZJEL<;=02;>E$-Luh7mIDu|k zK{$m#z&u-e-HjJT!*9uHR4@Pl1Z6>4vadWwZ-(4KKET|0VX&UotzcGXm2l!>OQD%FI&5YK zf|yX&5E{P!1b#!zNJdr%$prh7u#l7$`cn=idBWx_H9(sqo_y_m!*en0z$a3BmOH0t zz#X1Ph#V^IDyPAyW472{ryh4^H3IV1T}zc2@aF&c4%h3>f!Ms>%sSQ<(32>m%aBg! zLu7zItwW6MzR9}^1%$I)d3s`n3z_^$BVUc=e~&S_Wsv*#m-6Y2{S}<-<0)|g=Wcvj z0!odugf0mGSezct-j7g!{KbDMkj5WG@%z)|@{2@3C>BDqxEc0W$!xEjQsNjZo;i&P zw(dJ^V>bryx_ZNa0WVLYggi&<4{`xU5EXH=xcH>G0Ce|Zk=mAXWFP6C9t~8_^9Rwp zKiPpX+eZssH4uxyKXE5=7jHMFoG^wVj_RiwadD@v^LLrMIRDqN#xlbO%5t4^HM4!{ z$U&n~y9>isj&S^l(oYBrC6IsE)|3GW_SPovhI|g`d8NUmxe9+3avit2?@R*}ttXrR zU}CW0|6y1yDS5CmAQdyI+^sHx`Cu}QN&%|M)5Y?0Xu1&DFtmZ#RX*h59bHrvg@pN6 zw3$u+ub0Eo74(<+2qf>SHY&mxgY&NAnc2^mIH=*xA#psNN>VWo27$)EWcIks)nE!P zXZ}^-A{{EZr*=7IVQ{tZDvEo&zMc){I%IZoyx=NhQ!cVrIzKA*=@Nl{(~hE@_-H5! z#scP%#%nE`4~71>{M4#b*o1ZQk$YU~^{I_0ceu_j!~_2^#SbpdvF)xoxkF0yzX8RT zpKSkcK8uc|b+8Z`G|xcuN}^)Z%`scFQgmoEJ^rKw`0K+MGnf663K?k5g!ml>%&4T8$3mc*P=|<1BtY%d8<3D zI5PNG8-GeFN2*a}6Gt!?4~GM)i*!ncW&~UFa`4gawUs>TXwYZP!y`&Y6$EvguQ5b= z1NWJC!e=SJiXpQRRfIN-R)Pe-pnWtHQ2hnAxXaoZF~9Mpun2(ft2c?9tJ2B6;D#a#@gT-8ls~T3L*> zg7&d5$7f-tLy?$FuBE)*M{f3mL+?GI>e9v}94WYjJ5t@y);cQm?b{aiuxNe|Vpp|Pc6If*)+rk#uP~d=4Kko*5>N+{!Pwx)>)_-pT3(e?45q@9W&d9ougJew zVbLfGvP4z7?6b7axh9l(uH0Tn5>7t4`MQW5>)UlNmv%MRswl^ilU-<>rUvoRivOKi z1;45XLr$gk^UQVIWzyd)pdy+5qLe?DyUHIxl4P+YZ4p7RTW1^74jB9*WvnY;Vgqs(kn%G8l!Z0vTA56dt|$;Wj&FcDio@#(kT9&8DuN6x5mo? zZj&&wg818TN1&=A(Zd3WrA-B#>^o`s4ytg})1*=46;8aB4-Iw~)-r5W?mx&>i!x?u z&_o|V*qfshOqkb5%{No{N%gd$c}wFe>RP`?6?4&*eV}&9A}ub`96;poG^Bt4Nw$#u z2|H#Rle=_zhU4};=l49wJ2_Eq!zr8&8z>_6qvl%1`+`mymr}c4TF?!xdm|5d=|g7% zQrPyuh3o&*>V86-P>^2kwfBR8;8(}XvBcO`_x(x~dVw$*S}P(GSY;>@v3uGio!ZwL z^4+DzX&<1ntiPLGhTu__=se}&$_q66?8}P9W7^~Uy&6{2QU|~Q00LkEo`GtAFB2G6 zB4-adXVQsP{al9r#?_H(0Rp3vBV!I_HdZ+Ld%+k0VUP9j3?45v;yMc>se@R_>F)(U z;?zD*={fHj&Seh8pUZ4|*JiQ&#QMwU1YWPDoV6RRs!}64FPDl8@BU@dF&17P=ZEy> zzfmVM`G`|yWPY#V;t876G(ltRI=SW|oj=*bVMMthvvh;Vf}{}ec9L9yk8q#fP6Ct7 zvUVQ=5dZ0F5R=9bV)=weH^b9=Y&MU_M@r95}?PSs7Rrd-u7!?4-YtDyaii;y1iO~=w;(nBs;=VZ)qb@39uKcpfX(a=Ri{> zb_MC{0P2VK=#*FHP9+bNX9fW;W1VE~rf^rYsp0&x-Tot77uhqh6M_|*MTC3cU?4b_yK+3VTR>I=pxmv z!x~S+`OAyyHfsoN*4p{kTNDL&VEl(vUj=vyX&d|P_n=GIx3>zGECxm~*pT;BaZ)Tl zlZFF14`7VY{T7cA9XbFq95>?TtLa>vNX12*#!R?4r=mM%qc7s&7p9cE_e2E$Xf*vp?p5Zz{%=^p8K(6<37O;5f82Sz|;KHD%4j}Q-+0quio(IHxN}m zeN!tM3CP0;Mv$(a1lp^Evw3IAx2k!01y8<(+j zZQRazP0^a$yO#t5OB&wbIq6N&5rZ=?Ix5GA#m&9keD8eNw+FhkY1;ta9C|T()iE6a zYe1C0ZRDne#2+@gH880`Ll+wR_-&ewyBmwLIZqKWj&K5_ODDRTZYRGp_6O1KZ8|Z{ zH+rYh1XMW=uNctaD$K?YX_Q1V#SSC)Kgs{l-6qUJMOal zl6f)QiMiooc`uq-M1L01D(VC^22zu1b&5CLF{lOUemy!3nwk?%)DvOjGo(gr;m32| zAx~Te_XtW@GjFSDgVU%&-B>I$j46YJpO6C9z;Gs>&oq-b>))G z=1pm^jDNw@ufkEU(FEhJ=DW`3Lk5SKLWRl|4;oMX5*AZ%2As2~52P8*?ZsRN^BH9r zFP@y9h~5D`-7vrjs?_U~Y3Z5GfYdbJpf{&)qb@FXll5*c+O}Bt$Y6_ zL1)N_0S~Er*+7YXN%d-ZBD8%B7gvD{2JE>orHax^R>k{K3G*z`C8pSB3y z6@h*kmL?WCi#P!iUX%)PcOB05>|7lZitgUiJ{_yDZlJy0+T7g z8;cbLJQ`a2QMa~uW&;?KKUDAt()z8I{*7ZDG0};-ByEFrd}AQ)sm)sxt33z=|qc19<6hY8{OPjHk?u_)HXM-raoS}&y8{>WF2VK7zk!Y_QrO%^}96*eIcPn9(cTm%dKY4_DOLV`-W+2%%3ph|0XouDs1K^&tEZ* zoXHISt-kvWiG3oSc8_E-%p(lHkHiF+8foT0&AXp#YDUmd;FD;Q!!>y24&~0G$+bRc zE@fkCbRd}u*VRLnCoH^{hj)5?ia}5GTMH2g5%h?8&`0sG7<1BBQcn$htR>RVp?ok4 zbY#F>U_tzf1=Hv+9ukdr7SdLbcE&8sqN?mQ3`tgP%oMu%dIuU6h6>;kPH+DIoF zT*m?;QO7l}leeg`4X2REjCsfKt|T-CFlqK+%(dd&)*_>nxuCG?IQlJPI~B8>UUYZ- z!HK7?a?o`TSTb##Xe4y*0J-SM={r$4`G%M$D#iC6@Qy7f4nxqGeNEx^Os5soK^5sJ zgRV`fWRZ<5vZcrX*E9pw0+`0QLJpcHZ6Ioyjj|PT8h+TUF&88)>Ebfjk#fjCWe&(e z3X}OQN`vbNhsFaMXrU8%i^^j3lZkH3<`ar96d3^LnqYS zS^e&Vklg3a19=dO<|9V~XqEs`a^vXD*2AM0ygZkT-H4z?A=ta^9e4-(?9kThQiaL* zgE=R$Pjdgkp#IL{@g1p{ckUAv9IPy%$7P03{3#*`?{dP9TP$mfs(ZboeFj(2sv}`d zm;@-1sRh9_4||7jtd!105?!)vPfiY`6cgb_#S>#t3rk##vprU{=hhXj4WJ(=o|@qG z3Zd7SD?EMx)HCGSoKMWvGsn{8I(%2}XQtgDm7vEaPl}71xbqMVor^50m z)w>Fpf$L5hZU>va6kaB&F<@jL)ERxf)?P~ff`FXANCP%B*t~);3yUd!!YW4#XrEf) zjoSb4oj%DEe}fvNoz1;NszUFXA0|4SQW*RXdPGWtmUsl3TtNp~^)Bb&z@)CQU)f3V zxn0t1?zdJQHpA;?xWr~bbA+&Q3*%dE_Jf)LOaVVd@ox=w9#NIP zg1x*UlWTJ@fki&JL+rSBG>`w0n?d%qST1338s(CNS^>+wVMEj0HgzEX6n7E3V~emP z{=2eg4LjQV9BU<{%~E~I{OuWfml2{{BQB>oi(T(LH>M36QRNR+Y9^y`gOPPt+u*clr&E2D3D7-tQ_x6Hm ziZ1!|^=DaX?ac-`664XchA(!TUsmF`?UQ~)p12$_&ea!7q9Y(ylKQ^aG>t8e zXtPlbH)VO_d_@f81c})~)O=BY!DVnmA9WwD1pT z{=X4vIM8P0`0UmABP4d~67hJwiIcDFvp?tKYc111*2pcONBuSpYTKGosHmszds8ov z22+HtFBkOC{2`jyGAdN9R18-WxQ1XLEmPa>`z=w1Z2-F?SJ2M`M=oi#f)%vZ4}8#n zxgz+B(KRMbSTH8%G-c8BG52j9K3Haeo9WDs(@~BRRr?^Iudnw7K*Ukcy&s_EwspV} zu#jS4gk`##(>irby&sh`O7qE3DHN+NG={$DAIe3{2-_v6l*jv&u8DnY;3(0P>&Fna zeu@Ql5-U8uRSsN*CbxtlbM(x5k`!qOg1 zdKp&ua{AfPmnqhJhamTX4EIc1m}K}YT|h8#jGQZ7!YWVRu-)`#rzx(;JXB=lLqYx$7SN$w*(|9{ zS0O0z`d^%HB-oRqB&g0Q}KZH!+71|X5yX4HbhS;U}oMTvnlb#Um ztzF_lZsFoiUv4NK$h(L$=nM^r2`AL3s$}5_8o!=>?I<+*G_UWgx^mSgm8R!NbwDTv8f=V>?M)3WxY# zW6Ga9lU~=gLtA_zX0T36hc7wi7Rm;32L8 zp29kp<~!La@kwFZdg^KZp2`V(k0Q}~-;K)f$&nmg<7uCavAUVi!I4p+%)P-j>GCcf zw-kDqX@ur^z0fXG=5fOeJq*K`? zW^ow~i#JnO(@HAme!z@=v$NW!`!Bf1KPHevqA7kKjT!kt=!rvLN=p=;ZqOGTzy_3k ze2Abhkxp2NkB^?3rwFif2llkphh!0#WV9*Q4uw0|t70sr_E4GNV|A{-GOH30C(38I z%sW-4%s`HS0|;xa`ofJ|U|Q_HJ%nMf5cwtR46w2 ziy-k)B4P_rAC4>*<7b+8!M=?+(2HXpmG>|Bi2?FaTfA+Fw&Xby5iKP{2}jj262F@l zb`v2u<-Eq%_OL^0h-E@ncctzK?}wLU=O@u`ZXxLa00R*Lp2Kv1O`t4|6TeP|d-YiU z)xRe~z@7GXqZ)5R3~Dip3VF`yYxu`@?`G(_J5j#1+&R{Y%xjV73xRXp%wZ1FBE3Jd zEx{;JvCk;(J{K+3eb0J054@|>`Ep7H9RPv=M#U}QGaN=?=nt4gG%=JkPwUdcwb>qM z^yPpe3a5JCqe$~9bIh0#EtSV9zy6A4@v}GA$YJG0O-t3irz#`;?S}s_-P*7V%>TQ9 z3E*!+{a7h@Vof?~`-%lK^a4w|xgwQ8&`2pQsuT^bAb{`!dL$vMA4e7bcMLWBKh-dl z>74?7;2mkyp_oixWrWTJVFy+w;_)Sl#L^=*QbLm_6&ET1FpZ?-*x3v*~ZFD+#7f8*YD z@%1%4)e7sbXc$^`$+{jK9-5?IQ#*7w1VX-Tt0buZg$8#p(?Wz zz)eiYr=npKL&Nkp9H+o_W=38uol0)?wYV}xsJf>TJG^9#ERfW50007F0iMNbe=hWx zkvfj}Bwh!+ZB~&01gq>0?<8pZc?peX^Y#nGKkw>i1nz)e=F-f$__s&Cfh2mA@wh5F zBWo+w9mjNc3H1CtPF}qATSV}rnoHt~#8i;zO5pqD6O>=_7ROCAcIUnb4V{(-u29D6 zB(_7Nal1M(E%8h4;P0A|iLEn9@vLh5zb3B3Q%#|$=|yv+Jl?%b$pPT)uGG*8v}jPo zV*v#EoiP`BI9kTz z5)L#+AXZ7s~j3nRaz)9~de+&CG&u`P{CQ0)< zJA&AM3SXH5i^PxZ6S>fzgov||$1?;fdVCcgozVaQ3&TO0%1Nj}Y?(|6e@cbH&y?;@ zD!%Knz_L-qS=ef6-1>&|4(Bv6hSroT2e~&4F9}qwa}{dFLB$ZDO|ia@QGv2htE=dl zd25m0`d=Pq#|Io4R16fML=l5R+F7vD3)Bg(ob@@jxAP6N3RAe&fH6vdLxFIyAAv|E z$lC0G1KG-ff_JK>+AxjpQVzH{kDy7#VR9Kz-^M2ppb=_g#NgyyKj%rVkiSm5GN7;= zzGsbPcuZB4y8!`W)U-<>|K?VXJR?d@k4SVMp^7754OL|&-qbN4UJ~+|8wt(eFq6c| z+~J2(l_NEZ!&Uu-rP-|_&0)4WT~7_rjjbHL#$(a`q3LEMs+Q%0L^hC1YR(Ht>uzCF zJN7n^^E5mka#`iJd661YnEZ&VS|(KX>T6d_Wst-}F7wNL&Mpip=;KZ9ir2s|=wq6V z%jC@}l39b^e7TWNa%GwO?mvv#1&zS~>?GD%hl#oU^hk0i#={HlmNPjc;OMT+Ft0^( z8X!rp80K%aiHlY^NiAJ}Zij4giKPzzDke+E!M$>*lRsCJEJyPk38;~j9%V@=HWh03 zR*de*zw40?-STH{?@F4w39#}6NTRy7Vo}zv1VR$fgg@w*pLC3r`yjy^UgtJ>-`j_F zK}cm_E%yvu$qLNZ;D1S-(9?c`QWL5jN)n#|mGT^JN^*wKlQNkz zD7vw6eWRxQ%)`({m^mjo*b#>};8a8YqiD`p8~xgvTa^M5(1d27jepY1Zs*TdQS z5EJ=q0HQNH@_rC}l(AB_)X~a5&;{fV?A_M!sM(^Wf6UYOuNYfQ(2?Ww3q)6L3QKj8 zFn}Qr+m1nN2p1e|58l@-x?SIbh zz0@f5#vGhv0}Vewj;-+HOSK=?u0lB2b?rEqynd^0QaC#;vBAyPIA->#t zuFK+xX*sS;DM*>5+7^__g)f?J(m()T_<|g|=cUoRJRIJ&3!9%#AkDw}v%Vj-rX@b`SNd{dcQ)XwrZaIlc2X>|DL*|kVh$vXYCd;XHN2-;8Uwd0F z*fG3wS)Q1{GbLZRW0=Txam%IqQQ*W_BNk4$h!X3B_c%wAvlq0U7ot+JLI1V9Ccn|- z$G%FSQ^z?8p2Dd3_fN{xbNVC4jWst={ijyX{AF}7kBvy^)9G=J?`VgmPueQT>do!v zEl7|_4;mZ6ZmTp0e!6X2IM#j7rE`)80{sf~aN)8QrIIZKiD=?s=R?F8*QD+`N=4#T z%5lHikvW`qe$Oky$UW^^)JbQPyMb`}mF;w&MDMT3R-$sG@I5-MW~ZnzsvZ#``rj`M zftSeKS6`A`A=&P3rzhZU9Y&P8@1OPwIc{Lxq6sK2l=Xkv)t9muxkq^iIpmhQ_x zLJvXW)`rNcY3PEN(Z19?F3tv{?oBYm>=_<3(~9}35UC-Lrwvxs0$owC+;1RT7O^m( zTQ9U0=AniShcTO>S%m(DNP5)uiZa3$`WVQsHS*j8-RC)L0OoGJ?j&U8v&5tZ$TG|T z@5;}HVwC9I{p!X{9v3V43y4vv<-NyD>OLmc&YLluCD~z3{WK{DH?0)BRw)4l1@YyX zj)9;fotummJ#Z8ry+A7pM|%`G#FeAIgcB~;4S)h=%Q90sO+?U?XDOW#?t$!(Z03kX zz#M6Qk_HuX7)ee}B_e`s<*PCSw8jdO`^|f%-k*DTzZ1CS;_X3|swkHBYv@&HR~>x! z()Q99*yZL%E5AtdIfN$ZJW=!)3Ei2n%Y+0vP#)^qa96aSCrRG3xaPe+zHLC;*jXvQ@m3nI2cld?ymk701 z^-LU;HVSl{ajjkk&69*EIKyKwl{Qmo2HT$7-*ZQ3{&vjiFEN_;K$`;8V-R>C1^j`O z9v;T<_Z312p5KZJX0|HVJLyHPMlzuOr7BQ#M_1k5SNs2c91IQ%9#xk6jOrbs}#`rp&N{0c|N{L-=}gdQrSPvup4 zH#2?LjEy}?z-NB8dB3KgxD-i(?j}QRZlWuV^Bz4N+h)9MN#eX!(u4lqS(HeQB_3eL zb0naY(l#BHjR@E?YDcLK3?s`1qf5nLkeku)T|O+KK?e zU{`bpE@`spO+PH1?xciw=s$em3++xaN~+VV)g^tel}4UuB~mg9$tqKcr-RGSWD3Te zoul@;LT`nmz{RA{4huFjgaCl0@;m0|VDlq|mPus_;k}uf@Tb43xd-z@WE#}Ho=Vc>(_o*wF`&pWgwkld<-qb&0k{-MU;6rLSX zr6s3pP`|$DmF!*;rk6Dju=|E^P827WogB<`gkuh?6DG#ocGtwQ1H+<8??6RIM$kv2 z74QyahXxep^yo3X`h=&7ZAhqKX^TO&%3NPLHTS~yi(!A)AcD}K-f5PP3LY*e~m$?VUl?6a$jmvA~ETONc+&A$E7BM15vQCv~n(U zTuikolpVCOMqwqjMLB-2tw?a`!VJmR@+tZ|Y>8uPhOjfPn1b)gG5NwlYsOK^^W;9C zJMBQqLc^gXdwU)Nsak`U&v$DXKCEgCdsqi`3tXvvr7OL+IBq-Docr|Xm+2><{BdO@D(MHMaog8Um!v-Dx-JrPct zzAE_hd8)XPS}C$T(gIRToP39wNxq~?Mkd9}K?PUjo)fbiy0-6U^IB2n*ip#K9lRT| zG4gTDFy%o#&4w@bSBm!uAa5!7ZwCBYUYkJ3_#jI%k(jHFl-40&#bjiu&+n^-z=PxA zfbii5E2kH_aFtV;7w_&&eD|b8TlZlW?%kePSa4CCPkPJ1hy}3JWtz_0K??KJj_(-m z@>>_^1jsDo0Q|T&?@C+Zzv=YRU z)@;A~pRN#EB6H&ZmTXBJ=imFtdQV8(0VwPSfx2M}WBw4DBIvo2_2^_z1gB@0M+Xx@ zq#EF1zUT>+N8Pt7g%Lp{aj-nhLLO@uZ@wUQVP%yyJV$(2<(^2Xc=QqwZ``RunV);4C7kYNie=bNij8Z1|33JEV!mnTup+u(v6 z7nugm>QNYhp^-;RM4EHH3t+swJc)qRTm!5YB2^Q6IYJAY3;8*!mCx51S5zW$9KF3G zkjOW%kX(yXQdePWxE!h%#a^mfrrr5uq`mac(JL8XqQ@z57NPx8uLtfrs2Qy z6QKQns@VbgyQ7HkzFg#woK}%aSbY1AaGq$Y)gDybIh5=59x#^TQO@9x4_%U4@~d}I z_pp1t2d{wGrD9C)JFlu)>c5ug?e=&hJg6xcuz|tML1!UL=yzFO@o}6000B+`p9ge* zTix>w(_Z7ky7SN^1Bot;6bOl(duc;FSr;oe=G3IhXf88ozU_0yxc+t)Mkrw1G~~rs-_qv zxIfM%!34uhtdm*w-uq@8=caIG!m7Xa#I!#}{Nc(SR&VFPp1i82@8I8C{aeUL+B-PH zAw<7+B%Pml?4@d7N8fuJ;r^henvX%B@%NB^1-ep+8PZqbm@NgiX;3J*2q~Fb{PqDp zrHoaUNhyZ7!!klTcV#WeoR_*9t7_OaH{dv1z4ZeWiD1JRJ2wn=ChZnaHH)l&Mlg8k zlLbYBZ7KF(qtzPEH&pirYs87s*=D#9)(ZLif28r15k)sJ*=nApci9|Wz;t|Y0wv*& zmMS1hw3~3_h94kpsMT}^*8l(j>j9q$YJVbCmBkNd>Vb zho7q)@~Cj%cct${D6=z|+e64xWx3Nn3M$*m*!~wq!ZDVA&#V0jwpv(Z4-IEDovZil zL{}5FS+rAlQO5$?>_3)g+bE@+X#1RZPxUX@(7nbvhih-?gh3MyVFeUqK0Vn-fVkEb0Gunr++?&q^zKTj(^JWzkqtR*U z?kT{9a;TEP7~O15xAN;1+n`!Noe<<{@M3|lXpdY$@@McBb=WOHijv7E;g*u8000K0 zL7NLns6lL*ObP#Ld5^x*wWi?Xvn58+f*T!_twnd<)5Kl9=Vdwr%-^ z1`x2{wbi~xHTehiZ@uu{f*caExHl8gVHP#iaY^|(TKu37+@{oPU*Jm+=a^)#?8z9M zbYke<=N2uwAlC5V|0jC5{?;4wzN!>{S`HL;Wry=EW$WFEuH}hXuLMu?%aAvkb~&=aWo4JwT2IO9ozz$J|3abgr#Pd*c^E2 z8u6#~n4e8JK9iT2nAIm&Cu)?Fy860Sfm47Qwd0M$|0AsFP)1GT@taRaK?TWBV$St3 zb6X7Oc3KV$1|77dbtP}nP$~TPsp36IB{n_{CleNcA;fI+~&x7$}OT z=IM(`i+wO92Tm<0IPt27MKDfeC2sLa6kBJ8O?_rAR)nowALTmu>Rm`I&>@PXI4B_BABa?pMSy z^F=$`uO7N<0>cz(GV@?r$S6T@)jP>Ot#%O)rv)j{j{n2`!2gKyP>WQ%U`veQ{X!15 z%LS_~7F3|YO{TJ|W9hE6K1%Y3>?xEVK8Pdeig3|l^5uY>_5iI~s-W^?6evurVVOu@ zKM1*zsVt@n#HH>zvsjf0G1>ttnKVtsX7=VN>BBXM~auNCq@?Tds@y(ZCGdED}C(d{yC(YHhC0W;q8kSLqKbGGo*pXfO zjWZ&XG>*gA4{^>cGv&UFr@!MG+x&4FUS_89D#m~UTZk02z;TG-S01D;NAilPEr&le z@ek9k4Og=6UtY6fX&%ZL^VZ}s-l8UM=Kk&!PBF-d3z}tH-j;@NESc6mBI=8z|&}9IHj5)hDw~H&Miw1WyBLe8M8eR&2vyE3s zPXMYGy6Y%iEv@wRVv}~SQ)l6+2(rNdm_2vV))aa&DvzjI$WVkDE-ijI0X9jGZ^bRe4#I%26`$m;pdVi=-iqpK(MI?GO83l8tPEt0MUM- z>YY?q#G-BN<0?}HOJfg-jA)O0k2zdgE2zU8^6%te-jp0z2#4^%>1?8$!zOIvjC;(u z18JV>wbb4mgeH|bX(i`(OVqgJ0&hG%E;|6g(yb93Ii{WerlRH{5RZwx2wmrkBlxP| zZ~gYVPOtgB>J-q9#-)Srdo4f|IgB%7B`ySLO&QmN>Yb*{F=k=Zp2nbROm)}m2DHgO z`*c6~71vhF=)1TGYYppLXz8v~ig39q6TeHaXlg&`RQ56MgUD16uWIj?wrVw_;1{_l zPVY_XTxBJ)9R>J|LNONa2or9u&3?CZ+f_x!QCNd!uLsrkPWa4~CR;G52|CdjQN4zjdf1KF zY1F-mSn|Gvyw-aU4;}e-;?oVWY<+(?Q@@sba@1DKU5og_Ho0sFG7y4yo>}q~HO1ua=doFE zqTWkaJTlZ1Zd9WmLg+qH9}2t}HyB#t9!@YWtF$=Hv(t8EBeG(`O#$hpr9SD>8+Zx& zQ-rGulO|5Uu9ppRALV`tH_UN(4?uk4rYu4v{;$Zv-QCsiOrGpVD%DWeujX&Yn{a$4 z^SI2iK`|e$UgS|Lko49fEO8yg{jAS#8lTw-G(0UFN2+=FeH~q47xEAk1&u7fu&R2Q zMfaR>7+~^VsYaZIkX|cQ2D}LL^4YF5EG#fM_V&W1{T&DlD(NaXk1xl1*lKy;Gjo~> zR;qqWw-7} zg)T%`vpp=E4ul2~GTsUss_``~>drUyS)`NWQO_ng-6Cxr#rmJ{o*xWZpEI8Jmz^q= z`JMZJ-AaT>HLt?@`o8;%Jq!8rNxL!36Qa41e9UfTSWB4|D9Nyls<>hCpsAaBp=U%! zJi1TC=u1nMI*hU2-S5pQylMI~`~xNPE=Z3U zp{h>BZAemxrfS^)&75Gteb`XJ9?^YddSYm$`*XoCFt07?p=~w${Qrg<+3U(XNpf`y zF`%aTLcGUM<#*wa0TwvMsCG+aDFL_vw(UuUkJNGd%rpQ112jRKO-bPniIl*J|8M{> z7QZ(raS!3BHx7z<-rW{-76fCZt83PwxgDYBptrF_5jGMy+O*CnNT`S3A`f4i=qpXdjEe0VD=S74G z5-c86K_0<)T(#gm8gN@55>kYft3;dx3$OZ3RI1qk_%;Qi+z z)<7XcDu+qu_`f*5_ztnXs?wm)r!Gin9=Af)_UV4sy^c9!jfdvB9P00LV_q`Ndgj69 z6k01H*IJ!=EnIYYsn%O3fepUlwqoh_my?Ze9<6H38)v7ut@GJdi2ZDg&EXtm~H30-Hc+nAw}54UHa%K0roCu>QjM^ZTTTVIFS7+S4PxLoC7;JQHTj3l`Z+ zS%veZTTY@6?!_e0X7^I{1L@X5%WDqeepdz%4oBNr`McwR@fgXNLD2S5xo<8Xve5TZ zeTRKIIpRYOtBg0BfzG_DkrGgC5Oh!m6JaWK;&>$^M}WKRAa`O?xq-Q4a)?+Odi**t zAt@JDFKLgwfTnB`Qkk?RBdldIL?a(jyuLC_rE(nO06y5E zy3DB{sHmuwC2jdIPoHD%f_q0mNMF^qUH5n)wmtCwVA`0-m=@a$Y7}eM@G;`>bd!ri zF!}^Lni=%5jgq3%Mk2fM$DAkTn%tV$7PoTf*{Fhyy1cvv8FIUre`;#neo4wD(l>&2 zVQsvGElcD906J=rCBr%X4-?ERGbCM~mXIoM9s)qp(p6oJwXpq!P=#~AH!2i$R{DACk+yMZ8JPW7hFhyf2cS)^Hf@pg zxz&4o4N8a!P968(HkY|hdH8W6t#7gqo!fIZdAh!GE>7MkeA*I`iAm6{>jTtd@?3{8 z9Rb=7x**d;c5iGsCvu9cm}WY3cduA@FWxV(({i znRv5*MOz`(>B4Hx#4%rCxELLu+u%vf#3<`CUiiU0m(|{c@qB6nR@?al6`+hca~(E? zaCn^M+iewd4bVw73*ezA+yIRXtu51~^I#oQz{W|ws(%!MnHz{UUKgw=vsW48UhIbM zDa+HGG#!S<=6y2fI^4Z@Nzo`8&<(Jf29<2QM#pqy+txc0$m`44utgZM?*=WpJb>;9 zgRC#M@L+ve89S5Q%8}wO4Gz$a^$XV%C(5Z#5!~k#^lx*$pFWAT0=q*e>Fp54lURh~ zX1wv0E!gl64ikd9yE3_HewzhNF3tH;r7Cl_U+#9R7v8&;R^jZrK>31Q@mm8)-~oX0 zim$UCfEi?#CI*t_Cq|w~YgPpFey)X3~Q9(NESGPt%G>Cuh$Vc|WzHajtrkx@;#Rgsc9&xZttzmysO9X!*n0!EhEB zZ<}C&TiBt3{>o}#lxXEL#EJiUd2ov6ci)c&QbM?U%n`6cTx)YbT_|!(duhh1Yy4ji z&TMEBP3K=o&TZO({AIwv`N!)l?qyY)Da9n$mlVi?gSNRLFnHF-FN#uPXrm5zF{f4? z18tH1xe9nJTQqCsTZs`CtA~cvL-F7b0#H%kCdYjUBv*hS;o@GG03go4kO5zu-~WSd zF)APGcTa>{r1H73EC7xQWL>~j5|&kONRAAtgngn&P8_6#6Ik4Y%o|5u8 z+8nsY6}%}B~s zOONPX-srX0vSMTqZon(l0iT_8(I>#c@Fa0%4$vXkG;ttUY||H_Lg;~e71nE~=IvB# zY@jIj%fnOhM^x&Cs<52uKAu*o`|R284M@*qTOELW^bvJoMdQcW91)9l>6& z31=Vx{HbD>eWWDj4h7Wgl??+g9PC7xWzv=h`kj}qrlSbV!PrJ4?^r5H>hhl`D%X&y zAuA(|zH#_$Fkmw?=uKhSY&6z2|FeDXr*h#B`n!!ivpnGNb1*E!qC$qB{n8@9!xd4d z5^IXoP41hR+~7<977Jk-gm2C}5**sqVjxrS`9>m~b$uh&uvxJo^u@L z2wkWB!m6Xu9(?MfI3p#Ij}>ENAkF>f6xtYGAKBy5~w zkS&@Qi1x44eDs}(>;b5XiBFjN+LsIj3YmRuBG$+({TZa$Tb_ANb~rH8mI0Nyn`E6%?KoZ^FZHyUMvzrjs;q_y38Yb!G{ENLA!M}bi|GOogV zdr>A95=CRH$yN~qDQ{O9NWwn73!jLM#$v;KKJJAQT=RYOnWQGI$6|$V z%KZ|paX+q9*Gp;DTHwd}_z~1hAp();MLC!@y0Gl;(F35nsV?-|mnUqtlR<*q8Oe={ z{1$k_54*PZh#Yn$v16T3@kjS&Qe;vN{X;W!q!|pG62<{E-MlV+v!CHcT`NvVk&-59+URIh zgT=wJ@vO6IJ?yG8g-Z}D8P(YLn?nc4AYvbQl~=d;-!|GQrW#vCAQY?I^y|9wQm*LK z*YJUugB=xQL->I>O$1=j;UuvCwMhtS7owI{nt#l;#U4HKAHuQYnse~Ldd8RxS*1L# zmvExa6y@+VvG8jb6cGvDP#1LNK_UXMA{Bfbw;Y9#w;Q_=M_NnhAK$$S;&WXA$DVoQ z-YpWNIUn?A#X(Vj-3cgJ4%_jWyU2c;1$WusGs%9vw&-Jxx zOQ|O$sz|>-LoaR@gyC35#ET*|Am1?PW6iX5C&S~o5$(#bb}|cIlS5scre=E_Z7ywn zvo^0+_xJn@t3Oc3u2VN3(?k+Y7<)QuFvlM3Htqe(cn-JZ$?r)e~goY$kCD!>(UD!C{>phAmc* z(EWoY-fVf!8(T#HZa|U0%%_jHUnKKNV;`{q005!^pRRO&Q)5ftZOjEp5a2duwT@%Q zAEQD!z?5H9>@Q^?KaEZfP9AiqLDZ+iaD;in{*5$Rz7e+rsVsQM9)|c546tDjs{YfDjGH-UAhfm*%DBJpw{bMq5uE^0|B3~YJZTosPM0D zI86lmQvU}d^p#`t@}nO$&2*;eni8!}3QK6tqjdLM5e~v>+$|akKN4Q?>;C3GCgLcVwa3KKpfo+v9*8wdzasg5$LI4*p2qoyID7@4 z*MaV}E(19olhQ3GmpsmP7c9G?t3l(~*e?|3+nFG-~ox9c8>@6 zMP0cHG8I7))gEEguv zxA~~J2krm?nPPwoPfYDLyd-W~)11rb#0|HD26RZm za7_==Dz@JXRmrMaqd05$z*~hLaD{_30t>XRgNZy=%~sWPE41{0XXfsBK`^kbvFXDg!w`6 zCby%B_i~)DR8g@`H?-X%19%^3)Av#_yuru_s@wNj>Vd!wSA4=n_Ua-Ndo=H7nqzY- zE!77M3;vO_D-{S$3kS(t zK1XxW^%yuYtig5>^Ymv{>@VAdF!GAMJ{8GMZie{sIGF!JCF~tibA#Y6n1H7x&?_&# z;rlFH%IO^a?s(Ex9H*_za6Oo)JLW!lxTPo9D{3-&XT5Yix+Psk;5O*IST-$Z`Jl;P4&4{|(eAhoR!c|8H_G*10-A2|y zCy;>@h+te@WUS%}jMh=G5yqvaCnj6jliIAq~S)Q4LB{BfHf=i zn^<3tgCG!$ot*KdMz{g(qI4HXP+m6Ka;FahhCAhtt&utf;MG(@s91h8D8uZ`lL6|> zI+CO2XBm@{^NM)B2)I17s(MQ^1wN4^yXnvOR?cRdI!&UpXLfo5WB6NpJ6v_{@GPV<7Oov9Go_tP4vX$J&kfmbb6P&;nyl643GY< zkds7p!9nRB1~cWo!0mX@374NLq$zAe?jFq9G9su(tkFb<{w5#CX3P5Rs7bVMpY`AI z-g@~XNx<|ZS5yYk-2SK+ceZ1Pu3+Y8_HO=q3T)m<9HvzRc2I>=%URJll55Y6 z+m{TI3E)=X{9@%JVPHApB+>P5%E@GSNp#6#3(PC|=#v(=lKNo{Hh&{>SMuhxBV1U) zmS}30dY}=PX5V-ZR_Ea4 zzDmzc;B1ajFixc84~~X_s#xfHJkyir>s|ZwDL0sInZK&7s(wRkfhL+$G@B!P^lKb4 zH4yivDkfJsDEH)(gZAbo|8Zv@z^&RaC#zaZGuw$TJ*)-|pOYp2sLO1Y-7y2AOSi3v zW8N#CUue>V5;J$LaITT6ad~Ze4{gliFE z)9kQ{{DV$g3ic9^=o^GL>YEey9Pnbf!E+fD{%J&++Hpsj0>ePO`2E3S^Nq{xLa=f) z(M)QG3;$`F!n(W-DUjp6aY{Q2V#LBUcehMui>=-yIa?hjpyR&hvT-Uc>T2G=*d5@) zXojy1;Mp_Z0=EKQAyxG2tneSOWtDlFTb*wy89@pv+BiW5VX&+CS*Jm*Nd`>nVeFMU z$X1k{tymQC+q|?0rFwdw$k!GZc*R9pxObMxWxF2=DIU;HBafB9Dxb_bEdhYqg!~}6 zJBa-)a8iS6;+2~QHE{aTuuq>wLnflW^@$~ZhG$AymR&JObAu19OpfJ%mY2Ng*Rq5i zZGa-QSbd9_u2W;*h82)x3O(b|+ux4(;Qvf0ipz;U#>+$5b9QKCp}UntuQqzp;OLtR z0C?ZBoXK=O{wrJWdbmicP>H{)vg}2e-VMXFs%mW=>`#Jwwny3PkOYV1#)ryG5WF*0 zI~G~u6cVR6o?V`IK_r#t<`Txi2OSqvB#i~5YE$2ClBCQqA2L|eG22#yx>m;ZvN9M` z7Jv^YUmLWDV55~wlE20v*Q%ZTQ6TC22%Vp9dP3&A$xBXLG`5a!W}Nb9uetu4ID(WN z!6t1x=G&!c!@IW)M5(8?jeGg{Ek27)M&jjgiHN2Wvo|8o76>wL{RRLxqnRK8=eJJh z?=VKN_BGy|ta>9uCupP2VL`|41PjW;wh|Abi*wdg(S$AQQTJg5>`#tsmmfu-AeTHW zR3+LZK9qLfC2%rgYkofa))_=?kKDCQ;9e~|M2$OiNQ_7^x%Lkn6RaHl_BJ`tlSk6i zGvyi=FHG$YvFD zwHZwwe6<|Hl6gk5k{790nliQJ7v}lGVn9XV^PXYJX0{c#`RH})U^FteC27mzvDeqZ zzd2A{+8-PyFCr7rAdR^+cU)Rw;ZznSJ{fmS=%X1{4^ z4Rs86^TIO5TfTNV+9H>6!0&2u$q467RQ$;FM6EhMn(@80lgIWix&EK|S~wd!r-^E5 zNeS*@3+ST7%UrXB(yL4Z9Ie*dmMR%OWIQ}m5+41(UY!*Z+~d4H0Pkb?YW-Edjcp$Z zpTa@G3B~oX*2@@g`lgXj^PI6r$)Y8{a5%BTixe<}hV9_!xI>lg;$vDjk?V^}4NN3l z(V(w^-XpX-M>hpH$-SfJa370c?Ayr0{&Qn0{raeS!^6cM*?IDFSsCMfJce4&3 zhb9Xf%(>QHo-=XU#t*2ac7B0tuFf7{F+)9sAaEz7Vk1CbM|TrbrX8s1K@(spiCv38 z1S-Fmc(44&7+F8$Y64p}Q_6>n^eRQ^zFk)o;2vytrYVVPFKpc|QcmyHyQkZdYXlbA z+iMWs(1Hh^sibEdc7~&zqdK;uO6G?jW72b37pL?GXTLcy2T}dyW<1?f!c`_A!R24L zKyD7+`_&8t=3n2vilrZfUwguV891=`%3g;3+g4O)3+X)6-y+}N7W{!Kg)>SQct3)q zIgD#0pAZ|i9fXrp>ecQ_n)2~MKRl970o9x4RM=&GrTajZ$?fzpY$h74i#c2=-#h5* zeazMSgp|mWsCi80lF=&)C);z&A05y?!R^t19SCJDKV7x3&FSlj-VQ;o|8Juy0X%6U z7{zj-o~f5ZhmF>ckcLOmxOUUrIqpg^XGCRzL{r0301WF?juiyGty|XnT05cO5OB!8 zIv2$poR>Y`GSX?S5jyaoWbbhpds-M|@BTTPSwy8z{YqVa?JfCI&<01;Ab_m1BM>rZ z47JiMs4L4&^QM~UMet*38rA;R=qFMn(btRf;I7M~7QXW@j{E!s{X`3rOwhvPy%4f< zZ%!3SkKs(;6as$y@ULM5;pE_HT^8lhv!({J&Mq>PqXlw)MV*CW`C8T{UC+9AJtq8I z{_*cH#G-bO331?ia3S)HQ5wKeP0OltclJ)Cu~<}XE30p5M#F`ubT81(K%+BE>lmaD zN1@gHg|KzkSLjzZqAGHXBcyi~ke$|MlRm7bRGotcrqG_1f2H@GsElx1xXVfSTlpQTn+I4#a8 zd|f4wyff-Jbw7Mz_(1VPKLIVkK=i*O?%QhUkduNx4SqAS=TTo*C-$c;>qlT&QzH_V=_uvt&_QeuICE&8~F9xB2_f9t?cMoX$VVv>s$+wdhcck zW`8?TNCq~+<{!KndF$QfSht9o6P~*}L=lutdil#y_PC#EnV;mfcFnpt*6Q8N2HN*r zNH5Em+P&K{NJ@g(p);bTNhck{IpE3aN1(T_?996e5nMdkjpdz$>x$5|X#|zpc>(@- zMBuQ1*Kkpr`+V!}Dfl~}w3=+F^g0 z(qhV*!?>CMh({KiZBn@6`V{Yt000C?L7&q_5iS3IPVL-AT?^tsWEz{oGq*s2>+TX# z|ALz*efm=@KjvF$uGoad;=a}c4}2h9=#wVUMRHTo9q@5a#W?JloIMU`R!&+@f{(&1 zG@+W#$-UQ}w2P-qOy^`UCEQ8N;}AuTxwBtWcB2Hc>pj5vi&`h=s8@l7S~=V$M}a_e zd(xV?q?aG4<7uRr=dKXqJueN`H-2rmm`4bSyGFdJo)Dp)kpvrQANM#dprAM-Kz{tF z5m}(BR^#C^T@PT;r_}#Vq9(S=|6>o1 zHkvd!#o#`P(Uii-rNFGIgkGu7HQ646^Oq)eqgI)O3aUfklSCSzYE;A&`@Js)qx7C8 zVOOOG2XfQqNWT`+1;KGCo9I8J^L`FaJ2JlrMK97IJtblRr+L-|1DsvTkZj9urm{P52}41 zD|q2UfDb}H?b%!1tN#G?%gzErw?XDiAe~sMwUh~Sre&xAf;KR>u9-XZ;4J$_C*80y zB>U4e5FhR9O}H9`G8v2OqOhBKHjOZzV{TBRIV31d=l!Niy1bqW)-7SpJ9ioftlIif z{&$g%_6)h^n}D68?X1D%m-WtS9oe5*x)AWM4jYpCb+lw+3TSp(!VWJH#@I5ixXxL^ zN50KS4&x?rKb(lOsX#Yu3#fe&TVyXsIr@-{j<^<(2F0mMifokQlXo2@%H)pEot`)> zP=vjqC3f54CsS(~Ex6V;zrf7&Q_QXEOuOTA>u>&4B*M-y576J`PTgnZ7m3Z*nX z`TuaCuZY8Ap|K9ecCE@!oD}2ez-v>dQ_SIO2e(0n&x0oT%r2@UbE- zIW0K`8Q)!|VHO%RA&pI|wt4W+L+vPA`ouyIk)n;xcSzc(M~=o7s0VXJMAIQywy;hl z_~3|gTaa-lQv3tqx-ZHakbTsj^d5~LR9K7L2mE4^r7Z{y`$^$KW~59@Cu1F@$2l^A z>+ z^L@1`r-`s_8d7jcd=Zq&C|nU3vbE(sYU~GnBXZL|MoE!w!54JFC@imZOgQWnOb+S0 zx2K%ZWT&fM1Q$j#ERYtGO1>b30M*nR#fF6&B zDKD)M`vt+mLCwQXKaK}Ol2Y9+m*~kTxotxS+IhS{KpM3S=nheILUW*Z|~4t{9Nq?d-v`qaa@4j71ekJQ%k$r>kKNGaV<@ z8hutn6hqwkJ)baSoFbq&5S>rXB>&NnP?I0Dt8Ebr&movnmhIou(j!4%=QCCj^M|ca zWKk2|?LBQ2=s}T1lhl!%d0JH>Q{9Ne9FK!1-Y^%E-zKifDob)Kqj$@zTagz>boXYO z^|<49PWPv(s#$5&g$~FkLl{kji{*sP2q8{n48~`f)9&IlVK7g3lvGzTBs{n~;$Z@AYG7Q7{<*R)Dyt{< zST>|~%RM9V^~i7rL3~TzHHUfSU0jMB?^Hr{aNQqF>`%qk<4mpH4ib3PEIL8HufzR+ zR?4Ul+YEOhjT?8Um!Qf#zI7d}4oGP|rUKjxK(tPcN7f4?)dyHw$ifSYIExaD{RGeD zy_`e_%)1QRDtUa-%(iS}EJ(_J!y4}D*T1j&5ZMBn=H{jFKcC2|R`eDen!|xot#j+Z zJI>P-gz0+(IQUcl7s%H`+49?@-Xnv@K&!0_YXv{2BtuUMdV2tNrrrciG{K=8hSIsZ zYNR(t->(G`4FyTiYkXKOo~}h<$4=7DIRUkxFn;6+T`(JYXksrHZ;)-{5Y*v4Kt#@JV;vG zoSDT`vr}wYiFAeA*TT6DRpR`PVO|^AZ?d`Sj$q2LIV!!RE+p(@f~H+Nv1;M&-L%yt z;|8_T*3S-mC_qSGypF_`I1)WbiPX+#x!Le0dba0};c*=Q-YTxGgS#>Zmqpe8@eg30 zw`rDmjHJi$d_zM_{aM%(JP7Y1jYalLc6LR#Mn%uXqQt406Lokw;B!0HV_?e`ZhDN> zPc>31-snexQTas*Vh{7OO+~LGDarWgU10^#RJ4?2fbHnrZ7k|*m+ZFw=Ap0$ZF8Yj zDWsrrdUq>`fV@QHUe@}CZ{4_HW-MN+`JXmj0mY*3I(-E}9;TVw4G@tvi|D(hEfBWp zwDU)F$l?Af!pVovBzS5Q6=8T`000XXL7VwWs6lL*Obh=Nrx7+p>VNKnZsfEjn(>KF znnq%Am#zg#etghNVJbD)BB5rFuESFV8BqK8I3?cwhZuq`#0pcZ8LvTBqQuF$KbZ-G;5+?)^T3eeDSB=aGI1!?ytq;v zt?&Ez*$p@iAky#+%i3T}$Qr>J-Y4$omI*Hof-3o=Q=$dWTd`fu5wh}9jgXwM7}Dad zy8VbUhIr9J<)Y6w8vdtB_FN)C#%kCs__Udmt?b}aIzEk>BWc94YPTic9=A|)B*%U( zq&I0`MNC@K_m~v7!xp~$!84i}0dsBC8amaTe3>qmF@@$T$q?l!M-9fmU}GU!*C>^m zrZOG@3(v0_Ktp>BIZM8sU_!74!D#%dqr1J{HjF5pE%yrD!$vExEJNVe>GCMFY^DsS zHV^NfPaO;5mIS@AftBz6chd}nwMjt7vvIE7S@}aR`;aj3x6qHmw_YO|c`9$v3?@=i zNWro$m|59cS|--4Ed<{sE-;XH+d^HbBnDk8->!3(?+F=?nE^IOo!-@GAF1rm{j zA_uN6hKv)X3hMIW+=b*}m#?M0efZ#X!dkVML}|2%=S4IaYs@x0!n|4NwA#?Wl`D>zOY^%&C6B*<<;#A_WW0lQov zVL0+^T=L2c4D;rxxOve z5pdU5L>5|AY*wrsXZ4(CM>xtg#MN#;646ll#ZurJCs}C;N|kKl~C$_75 zZ?m_7d&p$Y6#h<7>(m?^4+CO;aSRpm|CY|;e^sBHk)^Wl2VF=$~a4F zqVRuGFd7>WXb<(h5aXQ8Tz8U}~81V87;+A?{ z#--L~raO*X(UJ0Q<4quHGJ=^RrURI8vI}tL_8LPO3T9XoTRzUNTrgz<){sgqy5uQKPFaMn_b`(BYeR`w zbXRE`Zk=zH-jLjVrHxMvCEk{k>)|nmF2EEGp2kOAR~V$FK( zqd9mivgRU&uB@*m_LsC_n~ryjN$sMhd!kw-euC@94g4RcG&}WGqKNXT!>7a{n7wb- zD`JXCbjUs;>YhAFv?8lB$2_1`MPf6#|iX2vQs zMj1FD_*@K0gW4E%aExF?smNDvOSZRrq}k{H+;T?%>tz|AvNk$Fh$+HrDXVx9N9=gu z@)bZgZ?}jLWM1S?Y@P%j<$%_-zN@_m%{NynVX<=8KBs6xkQH+WmwOe#w1k=C^+Q^) zlCSZ@M&RwHWqKu;Q|avSsGNZLm=Ad{HYX=oW>df*YW%Q4F4;@T@%9$K_X1>d%RO(X zI}!I5J7$Z+hqnP!3ngu#GhIny_^h)UK^53v|7PtTrMW0Qbg$=H`UZEoQ-gJ922OQ{ zw1CWEzsUr$NTAZ;eW1O62p;l>IDt=ptjN|XKfL1Hj*+O4BRAmbAB95+RMNqY?2sa? zt~hwT=O%C@=gvOj^k}a+)l+o$BlsUUnDbb6ehzod;Ul>V$NASAw(?a(VZ>6H>*%^^ zl4KRYB+|;uy*vWjh_oo(F@dRn=%MQXkB`qZW+<<^6n)z*_il*3h?=!^F4%3qVgR0& zgEmd*^=_luZj$`WnQnsPAqz`J&Sb(-A!3oR1j1PA5Yb z@C+uitcXZES9?W@QzEUp-!a5l71{-uAfjPLG^o_cQ^6TwxXne{qe9Q+Jg&QBxJX( z1-IDf+sf~s4Uu-b{o)LU+7C&6H8w?i9DxTOx3Pr}aAlF2f_5!g0{b8g>?)7C*5^y8 zE0{%qWluQOjO6n+m+z9FKU$UfbbDb_7V(CS-9mm5h}K6(!*Px~;8~jfN0xBwXN>$C z$I>t2cJ>eTJ&n0F@juiKN%tY7)}UO^z`n>U<@jpy3B^g$O^Y1jHu(@}{_sLCQqZ9e zd{&^!1xrTV-e$aY?NEb8<%;-2fZy3JW1)2cb)8k6_=SZGva}anb;0cH;g6QN5z`X- zm6i=IbLY{V)~r)dZ$vskNb<1+O-$qY7Fw7uO+p}}QC;!a(*gL&B9bcX;?HZP2$-|> zDRNITh~)t32YA%k1+K3`OveUU9I<&BT{pQg&Gz=#v-aYR(lZ(AK{XJB?LM&ES$Kf) z)#TG|-}pM)M0=3Zx4cU3dLL^@FeE4ls*PO!DB%*%enpxt_Iz1us4qzX#9V}4Z+^M- zvBn*(VgTbOcySm9{U*|HVX?|(c%bIjs$J^;ZrmUO`st||rZ%N}*3VFv8U9~3nLJ+z z$Je|r_VCCKb1@01%k_VVAlh&bB!K&PIc+;*obHD27T)2xQ7k0F{ca)8W2ae9jI7R> z@|DpHB1k6go;Z9~EuSj+%OHjKP!Q)fILHH@P}xWomEJ*9JUh8GSqso@Sx8cSCL!nS zEd>*BT6e)Q7?#c}7pRL0#h;dkDbM zlU5cA$EPLKL+5%*5HRm^Udz>4{|alsb}5yRbjYokF9U^^AFp^}pahn*K)egQ=aAzl z2>{e{YeE@y2Rn2*voo`L>|3junADD-Dz{BDW{6w3qgLOM1V~4;G38Of3yVbm+K24n z@3Z%Y%tcRhtC*tv5OAS^LEbBoAlgLH#yOE$calDno7*zjlDYBy3dW@?o1a@8rlP}G z4}`<3%?40RhJyF`{(_4L%}Tr+u^zDSN}5Tfd!9hWb1vpn&mPlFdH=2M9jNpR#FgVM z)regPbp9<2F7?hJhC?YEOW`yBLX28iMLi`w=5WTX>QOv75!t2B9>%997q}isBo>VT zwG6OKHKhIqhdq+3gIO6}7H+76(1rSlB2552+zwL-Zd_FSDf;y;Yh@Mm!T~1<;0W-B zW$RAi5puA2^VH}#={!r=c5s#!_v=+4>II+lV-rz^Lx5i%DQ_NDr<`(2yin{GtelL@ zjC|@)Z$9@etqUC6wGzexIUjR--WYi{wjw6%@Hp1E1b`&N>ZK+L$!P9LIQb10p!H-9 zI8wJ4@eV(vgWU9%<)k&2zim{H^8}54!=HA~%un;G+Ocjxt}zLNUIO{s6aE9!im>xu z5Yx@QGnu38qb4F;Q9TMHi;vYoOtXw;z|XgKuGI@PwQqVr6KSUuGH3e)j(rVUVN>K`{pi` z)d45%h%=W`JeCe;;%S^IRY+FG%>(!JZVNj;fLw7DaP^$Ym~EFd`0cicrW*m@5TEJ? zUZP@9w7LC%^=u*}+hwf)iF0QYj@M3s<_tZCG6-~P)?16%l4x|IZtvXg47Y^gzb7Js zBg(`^lIOFqUKImhI&#V5BD}D-P%mH|rn-vXnQI!*m+8P~KtIS$#ZmaS#9PG5`vYe;qLXv3OCTHA1la^GVY<5#;A>LTd>eR z&fs)(HVIh4Z~Tz)#FAFF(10P%Vm2|QE6ollQ1%#DG@-bImlwlyHJp9Ie?)+?3;BJe z;uLEG>^ScAxxV(aWMP{({T`Zn2T?;yw)&1Iqy7s=mUY$mx6&QetNBBp%D6b>mNIRk z&6LJ#No1_iRL*3gZ$I=jTD zyPRt`*tIE0JcHfNE3s%Q70Qc5V^hUwDGROv!2WC-7+kbxBI`Q})Eu~Np7VcVx#Rn| zus+9!Xk_xvbVODWFy~~&Cvr@icEf17UvMT<#ZMqOmb&~Au6%o{Uk#NdTc&kGE%tnU zvy`5Zt(UgI9Cz@QDf}kg#3IYQo`P|&G-YaT4XeAE_K2dRw=2yIUwZ{bB7qrJu+>gj z*hP_l36fNMAj7xM${m_f{E*xSB(xFe*)7J96o=DpWw89vgf0oe7m3#=CKjfQq`-b*uydo<^=DCAcZP?Ff}>G9kc zwr1lFbKQ!C>%f%V?I?6@E$vGaaw|W*1hCx`f1bShH>&8%hV&0@@SwVzKJGR!F#Ma; z38YkZ-T6ZdOY`M%AP?|r4@i55I;4(HPG6b&5NT0N3@hFTrHKjb2baeNd1f(FV$e7- z7wsj~yk^^Igr#C2`My`bfm!3{up`ntMJUTs?gr@p2=7~M5uitVvEQ|YEcv~mb?(!; zk4fryX3j6;c~Fbw54&da*$_ql+K^V8^-ik7qiTt`!8~+utHZ+5<->tQqz#-Ts`0hG zRGOdo>y)$psYTo8sh)_j3WBC@dbeB0A@%S^$amFvX?{hLoMKo|&R;&4mPQ(rQYF7` z1&UY2>*%0(mNTfVniwpc%nUn=~0=3E?k9?mZOz|SRd zQ6j-+g;@sMEUGUDn|(T5{|~;Vp#S7Wh$&|Yt-eFZE`(wCxBxiFTs~V$BO;-&WJZDl zTs1@7fr;a8*>EaAB--1kbknDMDY{-lJ`bK(hlz+3K^mK_htaMuKT7#^}j0KN8RXTb>$@36VD2kQvUn%(bp?_sy552b$R#3}{vH{%pG%o}Is!lm6UpD}H%IyOr z8aLe6fF|=R*jp;$7AcC+QlUl7l!xWMSQ6H|LRTXAj`~f$}InIfP5~(GDj4!%1+ZYGw&GQq@G6$F6 zfxfPXs!{Q9g+TzxmU>X5z$`KWmud>zG*Tx-Rquy+c(7{-5NC-q6cT6FcMq8Bs;|z6 z!Iil1)!YEicJ*3#WHF3o?QTlhmU=I>*eloidKnTCpbCntyGmh&%#l4rd*^r&_I5A& zqVV}QtgCuw-ZM1yj&1Q(hFVu3q4E` z2-q%^6zY2I9a(OLh`jrZVb0x^cp3{K3f_A^?A}dyc|ewlIPo(D6`u^(t+NmL1>T!a zT@8~*j?{fAD}#+w$sNXKhZ<<~mZk*?zb4L7ThHcRWo0a)flu(E#a($U8nO|JO#!JE zBTz=?Si-Z>EnpTsdO#xGP{{ygSP$7UWo3lPCdWQqugaCzl*FTW zfQ{YJN_3LDIEGQj*R8exc;W(+VK$;C+jrK-y82z|Uv&)7{C$}7574kh)s)FA8znpR z1>@JFHnfhUj*uMJ}u^5%?#!z$gdFaQ7zlR=t1 zNvJ_=nM?_PPFly30Z8ZH^OQ;X+I|gH-yHpiJHS_0Rjwh!qrg4pz+y~cZJ9#3#fR@m zhiHBxE^cv*y5y9~`cAAS`WZKU2xv6b>!loh@fDEE%@;x&$eaqbmPcV+4lAY$FL2ao zZNxwAd2@avGq~M7Ut`AI?ACZ)i(TvJe|7|UR`GAEh=@QbDt2CC^vT}PI)c;b7w$pL zOJfojnpFA(u3s!p0aA-2Zo#tt8f+9PhRH62**Fu}l)Si)40CeIu9mREw+8*YCtM&G0X*rCE|+&cLq@aws07=Z zm`WwskyHMPN3z(dIKD4|j%5W;YDc3=4b1opPlyrMIEvE|vq6Dd3C!wQTy88F+wJe( zj+9gP1SQyYTPZ$K?Eg=H55MV5`R+j6p!gBAzF_=MAN};|)FXaOPFYZDOk!^uZ~@Cg0aM|v%LfiTqb+p+N{zXf@6k`eJc z7|Dg+BI-!7T`4#9ZCgwMnE&?9bV+)j^xH^Xaia<;=Me9S)lRdChDsJlI3O~RS;((X zQV_&j}iyPI;*~vk<=>Rng@uu;<1Ym2jJ-Do*quE}u zBQL%M_tF^a3)c^#++H2g;iux^Q+)H*n&k)920-KAqf z@8g4(EbI3Rpy^LeSM!k(y(oTc(5VkOsQ_vOQTbz8`Nvhi=n?{o)CcW?x^D}ZxWI=a$FYUs~g!KGU<`zoPsAnxGbNJT!$oM3I-xh!5N>&omcS)O_9>P=QIxax3Z z6@6YBlzv8gIHE-Lv?bF*dN?+m`v+KDqaNB`fpgeZ{Iu`Phc9=8N{qVBQi#H zSjItwKrRfnw*i+Im&akBE;no{RyecQK4WloRmg3eu?E6FnFgJW#87zxy!XpIS>Aa) zkc)NvIX6%n`y;a9R&|0IZmhpy7yjS=t*HjgPjBGWk1Tol6X^c$ed`g}YSd7&rQQeX z&`@Z`c_#koE0R?%Zm6fe%FYB!FiLq_?@&UP?m$nSZnw_o=Np`S+2vo!6^vqgxZ~>Y zHo1s?E!08H9+wYT%W4c9XZVO`B0NE|_i{enh%!b$XR3cb|910#LxIaO*S&UQfz!<` zv&3-)*T;TXh^&#C^1skaUf^%ZCF!0h$44`)FKF+FwKkIT?@)`-af#z4x9W}f9yXv@ zl*+Uo4;f(8h3wcJ$Z(JKsa*lh50^%%2^gDy-#xz}?~)S3UO2-H2c$S{U+hw4PF2^dj}e} z8MBkqKKWFoM)XMI%^&f0uqm;RkYx!O}gR@zpzwsFX_|M55X&znv`vz<{un-O#=vRI`s4#Whi z2JUzQhf&qc>npPg%kTjq*v`2CyZ&TT9_S^}o3u^D$+ii+OS!EK3A$jZ00^5AT}HAT zZhg(>KadOTR_EK$JWbn59$XugW($iuh+s(pq+e7y!&FIK7tbFh_(<39&3>$Qg#*Np z^+X;$dxkIvlggQLq{GIhogyN%IU8kfzEZh1TUn{do+HPzbI4{pOnkxOz&!n>>s z@+@iNg|p)aZNfqj>syr%j>mer)oH`-&Qa0_RN&R@MY%aR|I18h%Ksw3O@hVzoSm9s zG`v~|9O7dm*plbAnH31YnMY{ml3~R{V*e=DngAIEEI*vta@{+ zUBAbM)pX^FSI=$;)&NZy0!wOv3VL|}%7gytj}G3jfMplk6pc=YM>!t!ObUL^^#Vv- zdg)oO;jEFsKTvz4ye~==Pt})KDNYz9gb3BF!@QyPunT9|0=&2bu*YdFz-Fo^?=dpI zCUK1%{0PplII}0+fEf57!h}}_?m;RbjvCwiinSO!{llUukyi)CEGaxm`g=-p*{q7* zfda;=6Q6=M!Xzs9)8J_}jCv5yZ`SW&ZR($vN+=M*V%Fl7_azv+wm#Bmmhw1vS!Y zIv;+?txPxa6<_2TVS>2_y`!2HzVfvtcCBc_{znV@TETo6EDP+u)tLXz59-tVw5B}? zN_su!A+l$7MWB-e`!|F-;(_e0voILi)Fydg>dwwe$&b)_U8PivroDlDZW0Oat8Lr* zjK;K!*kb>08fn|l&ez_z>y6&C_J?5p`r7t2167zuyqa4jj?UfRh1unT#TW2tW(AP~ zNcgFHD)@&?s1seZI(Wc_=Q!GXvPG7b@n_03_On2#-{<&(wdF9w9~$WUylOgXLO%;c zjis)~^!2wzP|`0H5=Nl*RsoOw;`F;{#;%gLsPCMBzpqI+@aTutz+;wq0H!c&2HM7A zSC|{Xv`jFZc71e5pEt)9fQLDa5_>dbqa4(9;#~)o$_i19pH^K6dF}tYWSMKw>gfHg zNBZcSL^va6UBV{HvlJ_sX%WTXjLalmWQ0Xb++OdjbmV#D-Fx!DEa>fAVIr9a9xbCM zz{{tyI(mMsc>wrGDyO0CiBNfX-CDd+ts6gyhL$O*rV>Q6j|i8;2IW|E7qz-b@h-%V!;UM`9zb4 zxMIjeWOy|{C7XJ_XKGdU#fhBlQYF>lp*p4%C^H!3Rw;AEiC4T!*IEsymwfkc_nmWs ztPi(fo(G^f0~|+$r^dByXb^^0lxD53PEuVbUKcRPV^W)py8W9Xgeeg(Q++JrbEE3T zs6z-K{7sK!Tx`wspfU6i(7;X6EbAE*aMq5GxUw%MFFU(TV{(GASnIx$mqIU8zaVfXmo&6IwL3F@IOR5eKLzF?c$xfLCji zLX`8m3ES(iAv<}@mGH*c1iDI}MdP+x1Yk79mveku%}{7DHK}f0WSBf&3+;3C#$F}G zep-FrC(_$K8NpgOp}vIgMq*_sr+u-tEP&3gs?CQ}|0i-dg-3p$O%VeicaKK;yd^2K zFDG4i{VnZpxIbQ%`%-+<=;JQaen*p>4xtQB?J!v>uG8tsP)cGVh&B3Wuy8r1QC+L( zo427*_R`>P#F@@rr|UC=f^g4!+M4?R?)!;PCU^;unNcl()v4_t-*@hy1FrZ=>t6amMR#pdms63o(*i?WLW|HzB?>~*DPOacQIT|00090L7rPf|5f@a z7u>wT#kmNUkhR3k43GI7VHN(N4eF$97wb}_-uqCh(Ho<)VrSq|xnT#`Zl3T>QC=or>DTop_mN=1|B6;gcR^x`O4O znxh?P5Cndq#}H+jV8ckxD$cGK4a_nu>5n>hOllI#Xp@Chr_Xva0OeP9RlW(v5U-Di zg-AlcBoaDS~>rkCsS&H?oI}%L;wD3I=6*(i_cau+(N30QytLwwGXz4oTBGOhyNjU>`F4Z3{$o;U4 zlYiR$Rxb1ddZRHZJlOZKO+Ne!E+rltzdh3=+n^nydHa(OnfxjVjI9td^gY#0+#8?BsZ#-io_ExBu90Syuw|wr@GCJk=f`13j%*CF~yrb<*K~*eF-mJv}&S4nOvV=Qu2p z<5))?!;Xo)%5kDc(T43Uf>hq|Bffw2@cxcIiB2$CmE-3hAg}TeKlyKzcE<-Lsvq9b z!G2=u>-A^ zAd$&5n5?Qyr_#lHaYTDxAg6)3Ozv$HyT8qpxBvhHp8=kFX&-e}7aFmESxRg$1$x}t zbL(!x5Quf3h=iUrX0MTEsM;BrEmcx}U*p)){*qIxyjXn^3K-#5XQ*IaP`FqR3U^}< zRvU7|ddyn?5}Yu}rjR%rrL;U+jhlVa>l>-fcuvV<|7($n1{b%Qte_(S*~}c(lQ}dz z-#|#7Vkgp(&GO+r8~(t3>;98@LJp&;r);E3ojE%;iGP|#O^Uw&W<{7r&>hLKofzGc zUun0&lu#*Mzl|D{P;8*KHKUKmbwBM0udzU@CM>s(C zfLjjO3mI)V?9H;R!u$)C8+?4-927#LFiiX1cIE%G|$j3it93gSfLP-E)K%Bq$wqI2i3oPGWDz`Pdx3D3_{FJ1O z1W?}8x+I{~meM6KFFjaCq7QfXheIq_bE;i2Je&qP`E|OK>GKCdM}f6()D6P7awd4I z3}ECv$tB3#E!DZ0A)D1cfwxC!KK=Ssb_0gO-u1Gbi;y!Mo#@TV9Dla20V5Ym!Pv8e z2cwzX*R$4=S%TTV#&l-gb&=t~K%;@8Lbz7^^0MgBu+aZ+#NsWM{Bz@1`w}7VXAqEx z#vx@>T|&*WEq|+5krWnR63k&3uIOK|@>+D1L+eV>eminSMt}|w_z!;1yY+d+950$O z?jFzsh@J@R=PdmK6*&hj=8aB|?)zFk4Yp#+Fq5!Am7=?2bs%+9+`T(x1yT_u3b@MT z;xEoL4}dv;X=?)6BpaXb2c5))mwB$}d#8xWjr|8E;X3E*I{ z!kj(PhlPCgR-d3Ar0#QH6gCv(Xt!8mQjIY6X1pA|<r1m*l69K0oxyjY;k_#31120zIW)+%u{MH^5s6EMy76&zyq7I zTkT^Z$Gk4~RrVKR7zy8L44%q1FsUp<^2^FgAl}C!DkZu7{M<0mdL_I?$)G_p?iy1z zbte_dnC@U(fhNIp7|p!wQ%j#_+H*L3X1Z|>0tUaSKngf@gzLtEKvFyXpRQYz<8KRaV2fiEc7QH7*@JjchMN$5!e%x~Mgqzjb1R!Tl;iu#T|9-f$7bYK|$ zA=QcUs?$%fX;sgSA7>G0FfkdJo*^1VtaDL*5r7oNIJ;Ij|Kzn>Kz;ss^*UK< z(|^We={L6dyfU&Ar>rMPsoW78Yer6z`CK61PFiL)s4F=`0_y!Gso-A0a^g&&rHWi_#b-I;efM)32{K#Lpox`gvl!rf-ob!(2aY@4 zKL*i;r^7|~90QVei@$xhN$2{Pp6BAM!yC4$5OAYV#&xIw*Y|?(l z{dIfvmOl+0BE<2foA|%0w}A94MEiTy=*?jlAlb!x8so_RCjUl0U?`}}oKa2s99S5B z=YpQk(QQga>POt)i^~1WWym27X{RrbcTgO{5 za!BME&*9J$3!1s-BC)@@Ji*V;2Z&>dBVyL?Kq~u2O}C59dAY-x--jL2-Ui4R5|!;ym9ec8VUxz zNb*)dV+TOmzSF_>5*~3|*^wF)PGFcB2T=C;!5nuHxI1kV(EF1A`XYr##ROxNIz}_)qx8%Ig z_|eud7B>ffZN_)44QE0e2}y7lX%~E!!W&Hmuk`Qa_?Q^EH$E)JpX^wO{}SBdvU=YZNDC^#1QbE4#}-yD0(@wuk@aUbg z#*l0NGM6#R`u5|K>!fLKbm$<+7r|j;Ezv3FrgWq_shSdmQ$Ty5y@A`kKV-lcravh~ zSLo#|8zdd_CJMkfhV_;pKayyHR5T=wLmJB*en05P>_(&aCCxVR6AjJaY2>zHCU?1? z-(%_bBz)ZHD^qZlD)&@Vu^t2DtLFIO(0Vxc8RC?cjL4fk8(Kf}L%2a$sq?i-jPMIdS9u#v zj8Nku83c}RVY%w0blM2dg*xVN3?8fZ#P0h!DzK&I__Q=UCR=unH@ndB4Rzy| zDuS7ygbS(1`gV;t73v~PbCn#Su~m+zD`?+Blu!BHBC;g9Y{$ulkA8yZ^DAW0r#y;B z?X=X$`Xo(`!#fR8yH{oT;&Zy|Y;yWAy72*_{`Bl#Nn%sVYPeFIjU3wz2|-Toh|dhz zCd0V^-to>kk%?3Jc@L+VOpzmscQb@8Vah zE5Tgg4Ce0vW1(wR7~}n zs0Gdt5tGYZ8^pKxEeM-=zR?HBlynGl8|!#i4nAww7g|fuEzOBjf!JPz8j=e|$NLX8 z(>Y}SI=~BiDd?6?Q2b{PT=0lM7)fhwUq>GA>aWnN7uyD?)=ld)KHf{10MY#L%Y80M zMWvSdD=02(Eyzdq9_~TLEyKJfOUqm?Fs>cdPHFJNrzh9;6YHFBx!L|F((z8jiPded z6wB}94w_;ZGXe$Q`$y;=edg7!d&){%vnJQvt?NWhuFHusF#8~=_K{d6$Pq$b*Q$JF zPIrXQA!pwPO7NoFV9O?%W2uVd`}2;1)CRsGDa-rwTN*nToT;wz9Zr5 z0}`1bf85pUeHfrP0BOI#x&9LLL>&X?0Dn}$IrA*(uIAfN=XcbP)c5e-xSC%%-9}V zn4^&7QT~tP-3sq5M`0IqZ6FauM&K{Y&(RMGT%q{&gLet|gV|WWtoD~N zl>_*z6IBEjO4P+7X`;sV&@hj`^@vhmwVzz(%gMR%J`VzNOh+G7q%4aC1GJg z>51e4d6kX-AH+m>v4ilA1dnZJ;R-0T+Qw!P)=lN40#Yrv_8dwWv-|~hQ)rq|^O9Rj zQ~@(!b(H@&<(S3Y@9yI$T8vM=nvBtY>qOp7B6m&mA(HSKCJ!1wjisZh6J5N<1Yzf% z6UaH;5jBmxdGi1;X;t@nHdi9DqDwgy)*kzbO2h%U9O z@5Qqsr}aR$?HQjt+wpwiA?CYDJfuKk|FrpC%~z|BJrBsb4sd>6KLqG}Vk#l&*H|*x z$eQ<~jC0Kl^|V`4kzn&1}hC=T17L{J^2O0me(vNx~fF^dAacUn}nTkn|OCw4Ms{jMkVR z_y*~SyURQQXA=k~3oCF!g{s^ey87ik7x}H*hcCtrsPefVp;#e`yK!`^?C8}pyWRRB z>0kX?np${s+~I60cb>H6Q$5BP)%okldqf-@d?-yjhiG)82BS*DYDa+JRaKIhUyABpeeyYCF@hL@K9y6A!Sk5%mJ((7j>3h7l z0>yw+ldAc!EJ*P(TJLGac+pEnnbCiMiO#uQ`tv-K`>rIKWXfdGdqN8t60U7+fa@gN zal7${Zqe<+cuTrHFpE) z4`vxa&6!i6Mu`G=3PGwgF%) z1p$hA0{NB%Q6kovne$}nNzza@3eFTP8){3w|MMfwK#Mc~m&M4xEum1;7~AjYK$twJ z6bk>jXGvQgjMR@8Q~`<)SJ^SV;F;*$84A4?|4!2(a z-G>thyk@9O@y@h8O*`^1YQEwgmOy;`O+WZ|kobH`%Tehv&OU{nz6-zGHk!#qPsX2H z-M0W_XS92CiIk5N_WvuBSK>@pf`E%pwyMlNFnl;~4dy_wyC-!c;bGYm|6EGV9X4^lMl`LPiILJibzkbM4srlkf4ybuQ17_>fxG0mtlEDPu5F z-J#^Y zPx9LPka38sc?mJ&3xWIu74!zq@GyE(p`tJnG2_6qVy%E&tP|=8Gi* zZfyc`YZJ_l=jNKWthXwLeo`BGb}(3fj>+QMV*=S+U_i%K4;e#?V&x0RGgN3o^|i? z`&?e7%&wy~t)7qyg}RsWKBo;uMX3cDZD>e(V-YvBJX}3D{-A&XxDx^D?XbQ;Cxma{D?D)! z54klL`$jvRG=nMC*I)Y1taaw5O`eRkxUGBSZai`Vje|yUa!kt#R-wDn!H6BYt`a-; zbRpqo5byv10+a!sy>x#hol*5wl{BR54MRE_pfa%>qX0Z`^so6CXA*8mo`ih8W4~Y zbZ{TLTg`<3Kl7U*vMjEe(JMc)!q+La^X>PP{|#!Dakp=JF%;yi{X7y0vzVf|;f+7= zHEqnU3l%#oS@jYUTwt`0zR4u~o-r~Q-#GxXl|jylo1kTrT;jDbuRJE@QDO&tr+%+$ zHABb{>nof6)37(Sehp*$q8UvrLdPJxYQal+6mIsaY^{cNSOoZ+c0M3s8%~6Bs+}a2 z@>C?t1P6P0lTdCelQ8<2J?HV1p2*XkaGb4@0~}Y3EA}f3ItQLr8x(lyc{ff#VHO1IqQKJ!y+j@dLf6$6+o)tSDw3C_adnFOnx3d&-F^8r@Je0?SpNwdrMj7lqdm`lx1YhT z6cZbi9+#yy5><2x6RSS=U&aK8jV3rHma*;Vp)ymtD2it+nGLx2<=VF^v6A@Q?Rckt z;d(Z75w7}I)h$Yjg242LNc+MFngN_#3XQaWxU(8m4OS(lQh^3QL&#|%D&PPB1115U zziNLZI3*-=ZrgiTD(=IGqL3_)U?UBAYOA@xj!^=p9^_qDtp?cKC;Q#KF^9DDD2YvK zimMsBsrEQp^~vX#yLrg$YNLlSawmvb1w)q)rW0Tr$+(`_Y=wV`TG zzV1_|Z&Y~t=~cgchD}on81j|2_)U~Q2CrF6fGr4>*61o!jpex;D?jdi%GCUpB`jHm zf%rmxw5X3FT97{^>n`ZvI+AWtwUuQ0Mq^oeM7b-66-qYf0_pC;W)!*^d~Nq;fi>|Q ziXQ%Zj(t|&$zyY;7lax7SdFP2SkHjd0w5U4ilbcvcK}j&u4i$5X6p}quIh%q3wG&a zodt!+_+D|GtQMCUZ<)otAYsAx6pR^$^t}q7PYU)h3)#Y~-EJir(~!_NHdCj7gz>c7 z4ZRi${LcU1%tkU&Tg`SmWMJ-TNpiI7C*0Ld&t_&-NQwOz0}3n$$t<~SHmQ9zE%Jze z*lIY6Q8{Cy0ffs@a_ly@absvBB^N5er-z2bgli7S3{z*Qa%I*QiBFf--csIX#n@i` zKVvIiXNN1Wmj2}k6E!Vhp4BUFFGY*)NVp@nC@K;j`8Tmx_tEp@7E0o#$zwc_)B_U9ws=Z6CuZb)+@$L;+wS>SIf-{L~*U11PFAz<4w+G==0#qD2*09Gl-~<>4C{{m~c$++mw*we(W^Z#_g$8 zXg7@(2C-@b`?d{m=)*3G*!>P9dEo&xHMOkfv9Pm<;6|ZR_Zev=%C-pI@&K&CP$%vm zgO5ENUSB&^cy~-8Fudrc+AqE`AwbN*000iLL7JmUs6lL*ObAE+`mMg1S;ElfvW}nc z8575I-FZ#s_VjxahxC^+N=u8E^-M{vNL32uhb>YJouMtYI`QNE5`&x7)C0Ak-)Th?b!zMG&)GYkS z#>j*q*7)0iiCumk;cf2YYxq|!LF{l1F?PC-qiO*o2%J6KsUNxYz&iLY%uoE-=j&HL z@=hGW*xBOeA=}?|pwC-_a^pZnUuN|pB4*|;QbRzbc?zRON>MD#Cb7A5F3AhahV$UU zL-yBV$Won5y$@&1E|0jfnX|V;EKJ*2rnniY=WG+tpC1kkms~t$ZMV2g#owL^r@`Ew zjN`?x>WFvvxGeC;8VLR3!&5jJ2jb39m+aNK3yz{pCHu{cBG<1RpCtg>bz1m_@?Cz? z+etQ~l~pB};y+TVPmHZekv^;dNia0>*}n80T-82MK_ye^s^Dm7t=qWvE{BFStB zbtp4S{^$O!eCis4p2coNEV@u(CVXZM!5&q$J(Vm1WZLWluv8X|Wezz|p$-216Z?6g zn*$)-U6s|A5|~aaSJ_Zpmo|E+ktaHRv~iP5%|?;t(~JJ(pCwU?yhH?gI@sUD#LBXN zb$hlX8j3Q4LyWteJ@ZH`x*Ws;CElHNoP1n$`C01`rbh~+utm>HRcbK3?k-{zNVT1k$8}+n&@DXL|c)K7}qSy zRZuYz^Rd}H&rkyx{nIpl&2D<@M5XDng}wJ6YJYP>K=Y%|H6=ZM33pvc43WL>+507(ZceQPQ`On+D!Ft{ zE-M*(%P&Og&?Bo->LeWa3Fz&v&x}8SMWC9dizU^nW*YTm7)>gKYfbK z8+L`bbWNQAfn&eP9OBi^^6aKrn{^07qGE=>_z}dqu7WJ~mS*cu|!uN0AuOFKniyMZZP-WYNEZ zcj&x57UyJ)F=dh9SoDZDW8R~eo~QpbQML)AN7Lt;EbvIdkos3lXvjtia;4TsftzMD$lNu;WX%W zdgSLhF25?aCwSxFCJQ3B2LZOYR*+w@Z!Y1vUE{V#<;j33B~5lV)ptJ^qmrG#Q$*C? ztEk}fWC&2KGSTe6DNl3Dvh*xj3TeL?mf2PgwpiFrxpxSG|8^>@k$~NCiUROG-JSj8 zotvgY0cQ8JjN}L5oZVY8qzAHe?k6LEK}q^PGP;xaDJ14FhF4Qv;CsZ=$vY7S&_wC6 z$U*f)IYz-HGfQ&_C^~+O?>UfYD$3d8OT!Upv_e@2uRVc+zU17}Tx!oF(m)9Ag@z&n z$vVc~aR{2u!^2jHN*RuF;O<6T$O#vJwjR`72$GctWr&kGEwtyxa0}s-aIOyX2;L&C z7ig_m@zibBgrAJ~sjp{57OCSK+84b<`-i^&8T+Z6N?4lik75_=AJVKAqQga!#&>}j zh&kEwA3M!_dq&C}G{E?vS9Qj4e zCjyII#u0dvLaf$VePu{wyW4M$ii{33>q2Q%N@FD01{Aiy7W(st1qVM_y+&@p8GDl5 zO2e3}Q~nX93{CL{L3aq+OcHykzVo`3_#Yfph@|KfW{$*v=Fpc~hktz`h3;s`mm+>M zm&ePk76xA&BXJQ+>(ano6_AI~J4zBsd;A3ORUCxVqQb?osl3W1D7R@$z%f}IdggV7 zR75+HfDvW6qhq%koM91oQQGT^LD1O!jMiwB0>dJQ3&Tdt0&4H&ttxL++q}6HSKL(xJBVx;1cIlZV*3S-94 zb)p4zUHN798mFA96e8KX)T@4xiqk3q3cyNf(lz{wMvSmvlGq6K;LA5TLX`@irQZ)g z+o*Wuz7bL_y@js&E>xk$q#0z)rk&Vmf@JGb{UU8TF7M*qGFY1xm$&w-t-CEw9=wfJY^m?0DFg6 zhL!1w(ZZ~{6^N!{@meV;j8U5FO~iqMhF`o$mN~mXg+e+|c5tMG3WtA}c4lssS<0*Z znZUFJ7=W;K4gX-4X;hva`qVrq_k*Jc)THAmWxyu+BOsl)&#}AY9T*aisHekKI;9>{@Fiq^N!mt=pJ-7;@)izj+}BVe(Tt{R`ymk$ zeQG(4LpFx9?D$fq>h$LQh6}Xxr;`j3|;&VhUT6uF84Tg74Jm?LY= z3-sPITC<7LOC)_07x(Vm4hrGZ+~DsZFyi(12J3`H$7zM62n*bIo@k#vfG6<}#hXkM zUd@UrE}+U6PCHn>c3bM>cZs%=o>XL_sC!Gh;=7Q2t2mqLa#uNBZQ^N;8a~9ql_590 zk#n2{MFyHVT_#4Rr$h`9tuF}8NB?d}*T)958kJ$G3S2=|pcmF?Ucxtbsxcs*3RW%%_X zTSE4~Es*W82-0=Fi(9H< zOndA%;<#1(VHW5+dvWRe7$+Dtl@o{MZ{)N<;`hf1E1ueTtJ-;KfyTGpoTUGaAcLsi z(YXT6AY3q~$)$8(q|pZ;*A?JfF3_32#JP5YpGj;i3XJA{WQGZ)lu(*rw-p zETtKyrKuF>GD*&8nAp+UlAEtcqQ8nsgyrI(jUITYR%(vTiW$&h?>~?_sTkIh4hny8sl^AC0x>SMygg4Gc&P(@~ zT@XuI)&?3oNC++h(_Tf;74mg?5BspXf)?TM?W24SUeOXmw<6{cc}UPUK2F|cZ}-7# zZq=sUbW=H%Io8F{c%rgWYwMy{EYEC&^;~n5(tn;w0&3hWGc{cEec21nk%RvJhWC$qs9X}ztEEOuM zS*V-d2{guojP`9jyHn=Lx zWjxo57CXWnPMpPk^|*8w2a8x0ws^B>!j(+|)|8Y1k%m~-5x+h(gZPs_vGAlVzKCsBU@QHaUzC>tu%`n{ zs>odb8X0bTbErPzkFi+ibninOENGM}+9?cikCnIJ@eB&=_42*b!vE+=!*lbn>aY0a zRC9eRj;!-lhDu-IXnAAQ9rm?DGTna*-a$=#%a=S_K!|SKHd+QmzjGCg%8m82-{#_f zVHiY-?{_BrPexCz&2y%VQriMDMXql+!f0*h%G>BBx?2?@bfP9+TA6iy{MU#L&{dNsqBzNVrG|CbfXKc8DM7KO;TC1D$Ex-9TpiNH!oIbD9+Exe8s+rMYWW%*1 zAH_=KMgKu>q`9JNFw$KM&_ukfqTjwlr1Qp8^?0tU(QW^mX+7JbRWk8Non*E}B@sj| ztZj+V0sPWTx5hSS;mvW2Oew{EV3-0{?j!tfE3HeM(4sGhjOn+B!lZ|NTJMxdmwLC* zOLO|4FbLMW@L1yTPYq&V)UGAvSsQ_@y{3}HXM(i(tpn2Fr}MkX*{QM|nlGj#Ry~>6 zof@Q;OW3CJWqzof_aw0P20TeRp=UcGIRUal-$Y2P=&@#TXP2SVH}*`{ow4Bv)<#-L z$Fa?Zo162W@;b|Y6K>Ee*NcVsXBkGJ~95b8j=n*IT-4OhoUmrMxE4A7-KnYR9(`r)(#ko)4vYZh@~fZe0YNe{Eo|H%D6k0tC92SI*h-S5ue z?>!?HLan_7j6Gs!#fQK2!WKg;%}v{u3yXyG)xaVoWSpsn*)tmiVsGG33rYG#`_L^N;F@}1RDxv&_rFr1wcO?S3`A7UWTx8@4 zr>gp*K+DvyzaVGA#&8U>#i#W>TIonnlfsznM`m@4(jA`m407hr{4lVm=d0yPNnx!G`!Af^r+&YfaS=ehGq5bV|3jD}ty$-^^ zYqexEcwJt_@rW5qZKL5Q-uvCRJd^E2br81RK2Su_7UrN;8CBYPG6uX9wXWzAZgaxy zF^Y$r2+t(bLr)j1Vu5f@$2%IRJc;=_;WI6$jSdvfKH1CiPFOzYcnqt-D;EyjcT`SL zP+_~XOk>14H;4YK1eeKka*w31d!Qr3<>$#BNvTF2+?^lHBZ25$hOmUo7H`?& zQ8brbIv48GOID^kjdVnZ%|WN*0`)e+uLo+;{kUjHnGA1bMgL%>noWxg zcOBb*DI-)r`@erL{V=L*n{Q3FnB|Rpy4Gq{&uhxOZb51eH1)POIYoWzuC0;i69-ia zuSdgLug0tyk2wW%jLIiAo}Iy{60%feFdb>tf!}2Fv+U507_BB>O$G|#Up|WDZUZk9 zPDRl-pF~Jp%e~4Zetg^}3=A{Ufbk|{<(qZMNA3g~wn$Ys{5D>_mSdG;;1pjcmX+{~ zkvy5P7g<{bQde~DDTjqCl$cFK=N0MRrtv3o?`TSTyY4>4k#uD2{Zr&NE_tmG7DRkP zFF7n09(<$vTU|YGNg4?}*+6N*RXsLdCDB!vZ!2T+CQTS`N zbDISB7Y%0YL?)gWF*df2V5>uxI2VAnJe_bkwzQCvHPAOU0yI8xcd8w> z0kX@Q2d;SZuJDBzbdz3#ly|@!OcieAAWQJxDku9Jb1y}m=TE7@&#_@wNr!~OoKf~( zXYtCSGt3E09d>Q8UsZ@L#Hwi+2|=H^cv0G|0s11VoE`Bdu& zSb)Cr-4>mKlWog47?>og^pV^-I8N(D@;`70-^HR7K1K?V0wHDPpnzPoI*5uq1r1$V zF6492#k*J5XGd}uJ1NRGL8_hAY15WK;)WJe=U0-8<;=%SgE^Ql;-Kx>kBH;BYVwf( z{2~!%{+RId`=(vLVuHY?75@e3x+hWzg{>{MEQ%%<;{FZV!{F2@2F}H?;;r>F8JPRx zlM1v0+3CfUkQo<8$B)fKip(X|I=jj>I{prFdiCYU?N5OSc6#t91xjubyFi`D~Kga#=gEcyI){+)VxkaL6Z+e! zT>X8|s}YN#*$o#)QuFxbRoNi3>?rv1=h6SMnO1iunt@N(u0jX0cA&^*cmzum=+H7P z?kVm_;Za`Y`J{>^QFY8w%1y^;GTyAcYtAkb8bV#|yj{?TRTWyzZP+#0iinGaoiXGu zs!rohYzLR-O#2Vw48XE_0Ls-7J%YW4^l<3<4p^-5N!R|2D!$2ET=b*ozn}g^os}^< zT}@v5KRDPK8_T!GQav%WRc+K@JC>nB+K%}XL*i^d$-H-8Zjl0|ITj3zeU`8`Q_-@A zs4&8mi#d1bGp8_!pxR0s~*IeqTY$qZ0Tl8MIVRiwK1 z&1-sk$v`NPsY9?~uX6F19~3Sg-15zR8u!55gJ$c{i<7T(O{@EUv7gP(`7uBIpdd^Q zWI3Dj)_Q?{=TLThE-=i6W0sea{MV+?WF1k)g4VBMX$Tm2h81Mw7$al_;g7@qNF$U{ zhLm&^uPQZbwHu7_=O#5m%8xmU}KM|cvNWct;wbVb2UcXu0(+3i(0i~>0dv7ziO+O#RkTMXyT~zI6 zy$O40&1R}Y+A_@a0m}j_Ves@j#b2+aj!#C8ma5%X~16lSkqLdNJibB?L46rL{3QGCL!yK=HKZ ziCF-OH4?Z}@DlT4!SR3+t6e+L0x%oTe#tAtp9WxC4ZcuBU765-H;m&x)0utgw4P1O zkt_wq$gFei?C!OaPwWO2PmwiW5zFM(&vI7%Wg8<^iu_c^Y)4G^)Nell=&yT_1PL14&z0x3X3dTz^UoStpv`~$o`c+yCF+XdzNIZob zT`TF*0F8QAS0-jCI(Q0ox+By-7;ye$)%k!vSNFWd)U=!Y>Pw9d6u|6R1S4qsA*Pik zd3e0@7ufS};iN_eg8D5nsy?*wBt?Uh)0c9O&j2_uma3TX=0T;-g4mDc!|p?0=sOUB zhx*pQ?!#;x&)8aarOq|<4~&MDx_pqiB5GXYNJ|UT;?nLR5`HE@^TiRHmJ4GBl|Nde)~g;>@^*%p z!Ech3E_VN%SwACmPNTyz_92UjBJFr^U+8TJ?C*IK1G~IV?&I^opsWl&@d&Jvz1L_Y zX0-lpVwC&Leo`!*B>|GiVdi(h41gMg&HoZ-a1OTY@54?mw>Ku(NvE$94+M;P94vK& z(Pi&Bqt#ri^u3VE=)>MS;UZlWIU@Sl|E_H==alpFN7%zZ+cZg6@obP0wr>2AYu@Fl z02#f*GSg*@ot@ma{9i-zjmhf2@eK_DaB}wg4ldm@qkN#tR_8&-uw=hIdYmoNgTN}I z6>l7pyMu}m0GNMOiCY|`U*1!vB%kbO7MJ;;jYA$il7V(cp>&LnS(>gx?70B0aP?aSBF3=kt0@^Bw zy^Gv=AkB~26?@F{+rN|DyOqlUF|K57U&&*R0qB1Mx^T*`?5@GK{QZ>l zt}N&Pu1RKD9BGbm9d7|kn+;Jr3kJybN4smv3MgP3f;=2f1Njax#Be|*xeN9-5hIVN zbKo*dYK!G~BiRP02ulRlJ1p%SU@yK8kdkd;aw6W+!xI^&0mxhaaJVQ)C$tsX?6_!mp5YwGJ1avf}c&W3uw%{YArff z6(#YAXLxIF#de@;-+)ln+xZ8X>PLLgPZlwQQJ)I)E7%;WpY?z$D*K)R!P8cuxKMLK zofFsZ;khOR2;2hZ_JoSP7+1VAPP*DHQz@l6>Eo}@f}Fao0oTB`cu1pynTnY?!IhiQ zxTZE%m5RmWKTVqzv;*<8ep2GxL`J%&gcuutkpZ0D7$CU17@`%Jn6#maYXC9+<84{h z`VSN8bDL_Re-Lwbbfj-sC3KF3J+;qTl}Cvyf0U9wwl9OEB^Ji6`Ml!y(?tSBh7SlV zl$1$Z$wG2}sxnH=u!_26@P(^P4qQ>8=ydTHzLz-nQfWQ|g};Ss@h{=>?miZoYSqIN^BQ2+(^WvyooTcl=I{?@ZK|M{0qp|*#7(K z(J*{HN_CE2cP$=`c1L8OU}Yq6{r;beBLuXl5*(kc1>5h(^HWL( z{I3EouOfcYkLB4GrDo{C3$>kARZ-vb{{{Lldww{wh?vc&+W^XYH@0e)rQ4O}f&T|d zsbT6AIg5cEhQ{`K<&=t(3jPJ8s?|0C++dP~y7?5dlNKJ<_A|cIMKBLR9b5Mdw(CN@fjp@k za0X1rT(Y1{kYn>WDjEtAX4dLn4ABkoE0KAZCm|Rtuu*tTAEWb=)M?Q4k&`fd^0F8i z6qcqaJ)&p$o>cfF_;8ZJ%7AsWn8nX4zf&k>A{POViI5N0#Tf=Q?80f0HAi9DL*#}x zA^%-S8(Uxbu`njSgig8WfH9~TT(UcoEw@;9V@3O_c2N1)!IER5lo`Z|Q3^6_S6>X~ zMH+^R+fW03P`LCrBCr|vkUmtKh3>cvyIg=nj2Q8w`zvaRZhIasc9;-=8NKI%SX@$Z z%$F(Q^f}mC@0y?-3 z_bMt5r!8|KIg4=rl?Afi=gw9l8?u)5r6aG33iY~GTw4#@4T^WCB2plqR@mTZh>gz`@m39Cn zj`3);oz~O3C4R6$oGDFbzdwmpo&CzCw9?p_uVcce`S6yw8P(|W@`-j|?P+(J!E!No zlKS@Y}~xI+jIjXS}T5CSA2Oq1X9yziPd|1}?`;X|*kuD*3{ovPYr?^AUboyAZ7 zmXk!pq-wD^32ElZ6Q#IxCw%oCArg=*e!uH=t784*#y*V06i3l}pQ|b7J(f+qJ_dDX zl4CHlJd%||Q3u8k!|;IXB&KDXaNWM&!Mtq!H=0OmMCQ39r14yV)<9JAQlV4Podiks zuodHOe<;`x9yQW%$}{OLtu$1P-8qagBs4N$RPr`V#(;`U5}`K{qB!ZYR${-7VKVwX zVUrSA)J~)dp8*5jQQml@vi7-g_c)7__#(>9S)&H+hhr5z_*j+Gl5%&LkKI+S^U5W1 zIQV3fM%Et0jhJi$=uIp_>oq?2VIV1A@Js)3eu5m8(k>_IiB%*2*{mNk^ffw9jQ`}YeO#_Rd zxtU=XqOH=-7b_%r56Z+M;oZ>hxz?_g-*p_~QlYN`PaTG_Y(F3;Or}{Z94*uez)4~; z@(P@Pc0WFt(y&}Hfv)(RIUp=~{Udq$K!S8y1$pS5mJy<>sq(I=G{TQH&V*yF6xJM# zbs6UT4c4ldt&ge)X%j177Za&f*EM7qx|+hsrE2ej=O(iqEQCNW7^N0>Cz z)uAe|?VPO`A%D=qqW3s+9iZIToBRHe2_2S@_+v^M=y6ur>$C2kY7ZU4b+;{gkyps)++lSD?k-=^QtFGm?puIWO8OAXFLrk<~lGRw)m zpHBoOEs_X*E_}YvBVjR*!7ijKH6BX%9{zr}k{Kel1v!gl@Ws&Y2I}#?O8gS-S3Q{G zLz|j(sfC{?j2h#3=f}T1aA)g}PC5N3dfdg!W#KCD11*1WYo%^LL@RU{qBtgAm7|eU z={uX?uNBuLAqe%HP}2v0+&VSQ?PGCl*1{djn%TM zy$djSpy0Y~jYQy-{Dzzu!sL&X?$h_FanJe_06x4z89a?Csyt=dcAJ`dMFV%J2+mTpV3dwUn z6b-x^1L`c`8TPzk$-^Wu$Rxi|%q3?d$ez%IW?Vm;P7@U=*$cWyqkt&X2Gp*oY5$l6FiRqhXDJJw-4Bp#U{G(fjaC=-)D|PR;un zl*KM%*3zgFXX+gd)1(mufg7FC)0eX%DXT^LXxpRjp?^zfmcB6RmRx&*g^UuwwMB`_K%SQJTQP?O>h_IS|GJIg!HesG}I=bSbij9dI(jL78 zlKV@SJb|jnv={rgiT$5NU3bIeRt7=~CH;z?|LEy21^6YrDv8hy3b{s7mod7Ftd(`z z2WeKc`#Tq##Wm2MXJU!*3$LPqLhr~Ew7c7W%ltzBLNwQp_i|Srxor+!C7~n9k15EU z-1o-IW39%t&MQ4uu1#Y4(yY3WB{eIWz|6b7+1%&SZAoDK8d+8RUSyK2DBdHFuH~i4{^_ zD`wD2_fG-CvV_if{^3g;8lN0rm|izi4YH$1mOVCuu2OXQ7H0^WGb_AL-r4Nf#H(M9 zC6VRI6}kdIIkX1og+s$A?;aWMg~Wna$hD3SXKc(R;Ls58&3j@=Y1M5Mm^*M;sp&zH zQH1R8UYjo*hW80wWUwtk5(sO}elZ%l+$TWMi1(!KY}KG|PfWaK&;=O&E{7^dhKV6*`)SVVX|DkBz@ZDa)zi|-A< zFcUEtw9Tuznmkn!p+ zb8fPp;#@wNja?1WHVpx_AKE|M<;gf=PXJmPcypojZQ8_F(J_Kf;{bNi&hWogfnNc-r+?s>eTx@DSxO>iLDvtZ!oEcG3aMz>kt3m*XV&%QY<+tT|Dup#% z>(layU|OO(uP@2`rwQ2!=K6jI%O=wg^{mSA8L9v}fplQ-dZ%&7L7roXW<7}~5Ln*8 zp!E(JW(n_j$i;YL!NtL3p}juB$(TADXSG(?Jg?F(hIvel_pA$2vFk2q@6q3ceAg8K zOtb;q13>Fw3xR!!e-+K2#qa!m+jc*LwzBp>`vPD9pz9v+;PxwN!%X(w*F4q?#!A);(f&}(JU;sPhiueDT+WY_7)W^Yp zOdJG4jQYU;=|h3GDYAh(>v&nsnAT3Y-i1Axs=?kdQ4gSt zI^4KB{G}$Rqw~?4Edi?OKIb5Zdngia3V3)H9qeFB3)@S+mbuaeR_YMkYxo`E9bh*%dihrFi$R1M3HA^?#FkZ=H`mlzPuh22qwV*R})eI#A!eqp9El!@Jj#QzxU*LBrc^qgygn%xEhQ?2F5 zHze9?I;;?iAtL7y*~k>@Tn%qL@Qn(d4l0j?Q#%ekP{ zUollusUm+3!aS;oy8i076@#5ph@Pxoq3#tl5Y!jl&{jYSd~CX_&CBm^kaLBtBj&B} zVOl>b(G(V}E6|-azuq#UyRy^^10{R}R@vD<_B}mO!X!gko@lj(`hFwYG2HgsUr*5x zb+23B&7aKs*4TM#5NT0aU~QB$tbF?gd7RV2)i4J*i4dhCu^~;AfLv3J?0dLU=vm=> z3Bw0A%1jFDDR_iS`Wt0)k9@v+b+S8^c^$Z6qUZ+hZ$rx`Tey=_r`ByNRIh;5!}upkbCu{glM;VpTvuO@rx12xsG`Ocbldi5E_q95=Cvh-11E4 zynTsro1S0+%n4A<&zdiPH|yJM8TBg>cc94(>!c^F8qqQ20&)ts!@~=S)NV8}RNp<- zMU>fbi)T`N`s(O5|()f8s#Dy3U z?AL6kJ&h^rDduXroMWUKi@-1i*ThVtO4Ea^kMfr;m4E72Ib4O$NN-Y@q{zjk&0<1B zf0u`s;X10pzPRzKV6ex{73-#k-}Yzx#IH#e3} zxjbi5^{@(jDOqtEc%gvdb7+~i=AQji3KlC69Nut8 z2Q>)8ft$8V^~i{gfSQckh7~j_u6aWS3GYpb@}?qH3Tg9Sg9tRKsxzP?%4;fPIsG-0114r$*AI!71@4D?z9!1PrCGJt!>AFm$?>UAehO)bJE~=T3~~nq z8jWrjsJ8vy)ohVQdOan04^)_EXo-MwL0wPd#tePSr&1oOufNKg2<5SOTbqVO0z~)Q zC_eAUz@Lg`*-h)!hvvX(QsN4fmzpFYU4D}D339DC-SG(peIf``f?4~{Keb!;jA-vH zEb0cEVfE3X_kCTBlvg)9OfR-MUrD{kh_5y_r(9*{*Fa!-HIAoykTOAa-V~pcso3Sc z(w^uygi#N{7zLJ;>W9QX%eQw;=FO*>BF6^yeEJ~(T%PpB4~uOqApxc0(M4jRed-|g zzF;#zgz@Ti-)0HRfeZ}q*zeSdi_liRV2qz_{Hc5OPyqPPjNziT-z(YC$>r3YR)5?l zHJ-VB{>^BEMMCQ|+23iGe>3{4u7tsWNYz1~0@*&kg)R1QeG{%KY=@ywXSdnR#YLHA zgYU7ag2?%PR}<&lR)4P1raUSwjB|=@1R2r!_r?eBCOGv?%uKwD&i7xm5cuRs_RXI~ zxG}#aaRJ4uQwe^i>7UY=2)yRgzEC+MY%PQ%K7KL2V^LPJ4RoH*S68jxq9>cOS}qbt z9eKncA*@Ezh^(untx7jjo*UWRyPGFm?XMWRSc1#+`xF*F)0F}9BkM&^-G+I<(OjCG zW1#XpK4v~uSpN3Z%?8D^I#>9dtsPq+5qH(Ba(u}R`)Ea!TH{!w3REX`k98D# z?Lc=OyKc}hMJ#ybkmP3s^pe~AuzHiHDMch9Cm-KW01+l_ec@k!+$+a?y!v-o*?K%5 zCB9EzONc@bJb&tXv<%N^L?--0zmA!)G%UkumK;!3>y~#8!<6X9_L=f42Kkp156U*~ zeZqjJ^&&bc-01ee+TNRWR1#~>sTd4mpSYOhcrmb@KjVISY>;hzb@Ci7Oe1C-h%5Bm z`rIt^;lm=p!y)C#MWKVc6Hn?UClHn$+rg^T?~h?F?Uw?P*gfs`MAV!{s&?PZtry!Q zfZ-GO`euq3wkueNPG7y_Fw8pxa%}BlFLsi8)6;grUe?E6%$-uGK^7HLPezEd= z$U8M%dO-?CeSTK9s4Y3cIb_6+<(h+)#Ci6wYZPKpV8Wa+PIJ0+0K^XIm!B z;L)CA@qB&P`2^4|I2z{BAbEvbk5}TWDIBSk2aAhAmoaIS8azv^5B#OK6wZ2ICLU@G zU>$rv?Rq?ygNXyLZ0`ZLnO;=uHz4xZd<-*7Uj@kkLa)3)pHii%RPGlOc@lTn&bV3b zMdt77r|0}i+l(R_tkDCWbeZP6li0ddUpnoe6vmf#r*tulv(Zrnv$Je;bYAb!04Xt| zFEw&+v&$pS0b4>{DJ}G;?4r%pqWFl5AcR+^$FfbN654bUXX)G-J?mppZrw7};c-Js zhs%pbSy<##)DbdvS!}A;1dL3m`b=S*qy5H^;S{*ue05HXnt(@1j`srB?}IGY454AO z`SFBP>E|5kv1U5_2FHq80<8ArmI^<$*cihJe6P(o0hfp=Syf5J48_> zVIvzvr$Fk{v%CYvE4=6~QaTRr@{Aq}D(Gz{$pB%2z4b&}<|hV%4nG6gGMTW0lhGPx ztaya&FgGmH0!OHHJl26V+9T7UZ0}R~FSxGbtWH&*GzWy?ekn@2z|l9K`fmvw>oemx zSk${96=e^On0@$t`lXv{U6yTvbFnYqxMuGLz=2OBtzRlK`KMA^KwSd>ou6xQ`h>kZ z8FZv4Ao;4U5tFzy@s4KSQWFlW5)tPlX@b23<2i+GX8O_~*k+wtU{hzk%|+0l?QIK8lPK96^#Ix(Ow_Eq5F)&|4sGsom z=6431?lcN=9HEL2hqIO&?VN~<8(tKhLEaLG*6daE$&ViBW#l*Nk{phwt)-U?$YKhu zmdA=Cm{Ao6z~{ns&F^3}qSTp*-5)2yStO(h3&Tp*27FE@oE&S?q2u+-4w3@~PC~Nx zshf1P7d!m>V`Y1#i?3SO{nBo?TQLtZIekZ?Dc5;ecXv#zgep}EZPEL0542>mB_1VBiqei zk9}zoe);m;h_I0#=nq;=&EtqVVXLaqiah&yNi_TWdiTa?n2X+;ab4ftzHM~uVksDO z#|nT)NNX8?n=xxI1?V~}&b>6lxTvl$sQ+dkYhX<-_gI#_wBqJGyj(y3A{6hicd?CN z&XUzUQOc1V)llbuS^N!u1Q?Cd6$A`S;Gmc5#`m0;toXk+0<_m7VZE`eW~ zz3dxGZfA=W9iq8IMO&xn_i}x9CG&VqjPM4%h<1I0a}hH>ewR8-!Qf7+X4xP{tQWh+ z?fC|swQfN?auOLp<)*r;X1NC2}&lV|oiMHcm zXW|wTc4_)ppH;j4$Y}NHsbuy{*J4iX_e`}eWvejQoHeyPsKkEokao2$aR??tCPcQ-yzkwkzE`RPyYzj$ZP<_ z`ap5LpOP<&gJ;Cb_g_6`j^#eB;M_ql!#bPE-p|+SE2&Q4mqDG87k-aw1gCiH>l>|B zL6f^eH0u(lK81NTFMexhXn?13F5D%}&3YJZZ?l^_CCow=ZfHOwEGXU7g5_i0_m|AG z&uEk4#|x0fGtAuRK_UOEBdJ_J7Wy?z-pN$65=D52ZAa-vh=DMp=Fn?~qHk;c_rQb~ zQyU!Kt<*gnRM^&i7&$Z}3u)^>@gIXYG&-9^#Srqpj}9ML+fjIyu%pv@ zf-~%^MbijTGhVDE2OHZW54UNWRdgaPr&W^9NaMt*a;BytrSi3z2?ZO58gvGD8pgI- z7F9ePEmbhSgFgk`)NUj9ufAhbifo@|8)bU`uIqy+P1M&EOvWig9aFc0Ytg~#pCPsA zubd9pzx(1Zq_kFJ8KG&1s+F%0eZ5mleBAOsPwU>1Q0)!PnX4^SIV>y^b|;dp_YX2| zesq3EmU$UPq5YweK!N=>X0o`vkySO_=?^*z$u3WO7F*DQJ*UQxt3OTlYIjpTM~X>5 z;(h{Mz-)gW&USJtEC!!~`fOghZdNv`YfXm<#sBJTlZp|0@XTF#oSaH{F-v!t|M4iq zyi2>&TY>c$i!&zvluN79)#E9o@)Gu!aDZf&zx(dB*YU+)^ZQTnM4L+M5;S2Z4Cp$_ z3%6NCZJhC4CX>$w`?1ToDN7M1l&VL|(Bdyk`Inx>zvS)5r?;j;4*2gh1V6M6+=!n~ z-*I)i{-M;kiXbrFCC5#fOePV@IBwfn%CxAv{jh7+-C4g~>u0*q8;d%Xe-pY^;pq)q zTOiK<$sq~QSOb$?+E64WXV0|5%!@gssuyr!G7;L%shW)cVzQXxz%8v~oqyoU8uII; ze9=!Jm0!>;xUFDPpm%j(4ph3zM|5yqf!YJPuCsW5-_Vt7AP zi&O!N!lKJ&)F|WqO`;g5EgHO-2G{V}D(K@<+N&DdO_TahNgK3ig2aquk3RBuI`pSa zt2I^#R;3k6*mR|q!Sk}~blQijdR!~}R&aYJ?@RYYII3Jrr8Cv-xXMBZxa^cyd((^5 z?=>CtR|SaOaPJCt06#1RI;l2=qXQ5oTVCp*ZW8C7kMtkkdj&?sq1f0+X6WYF@6B|Q zu79MLGP1f|1`aBzuEu~#|30$l#ysT~YG$@;$=R*S{WV%$NZ&D(Y3(hPiddBhh2jNJ z?+e}ZB=Hrt2v?$IapNgzk(>CUJbr1}m2Xj2`RcG5{H^&nzvxE|@k zwko>Q+$o19+9u}Lt&WWx(}*IU@M$ivIT=f|GwXDrCy=#9;_==4?EKioFW>f~mizt7 z4~t!Yjte${q_L>){QlG+V#{MFn^LexWOj<==-kIAyLpjLXOL+Zg{>AxR0*|Y63a&3RcB|VC`WxFQ%P+^rE09TFrJOG( zrIc5#C(j^P8}AxP!b~tL-@e0*FfYKX95<#Nd^8{Mq#C!Gl+=rs*JaP4!^Czu&k{lL zDB9oO-v{BE*CDhc2ps$jS_eUBa|;QVv#yq)-M1HnjCA?O-$D3B7ZdkV{+3eyd*iLt zRF1FOVdB_MlL zCTO2Tr4Ib6Tx8*RQMr=gt)LDACYHRMwbUAaO3XdZ29s^{LM~ap-qi+zuz!#ioiBj8 zK+h1?@ZN$S2;o2>uPX?r_#Z(Eq5X^@Z3YHEL+CvSa}IggwLv6+cLlA~E z7{Z`xcP%i?sa{Q|46M&L0-C^5&)udqlp_NhiKYzIePU(Qd7gwIlaS%g05(8Xc)R6x63uP>Lv}DItWE9^1ZN$ z5IRY4JRwZWe%Fs#{1docH5N9~1Dp?7s&Td{FzuMZtD0r%US)0q#*#c>c zm+O&z*UGup8&(aDC4i?y&p)M4*G?a7f9hF`_tb`CoK;x`t_dPi2y?ixHa^^HS9YJk z6jYaIHz>+_;=i*xJ&MND%8U!A{u$C3y?f~DFYYnMtViQkT2+XEffv%8p@b8dYyTl< z!byv>fy`rJFwTu&nd#>bo(=+uE@1cf1=A>}1a|{nPki>QLmXO$runMFZlI?TzR{pu z$b0H-6noz(3LOS|5?UJS@b(x*%+_?$D5dpu0|g+UyX}xJ&{-&eY-Kpc1K&mGUA=f~j{0YdkyQV`ffy%eDNnYs4RxUAks&Nih2K8u(mITZaLAn~)=H zcHAS{?{dx}$mg+|uDr@GI5?;&jL1EZ5#m3`e}y%t!D`0Fpt@4^b&SBNOv$=ogV|gD z?cxn}V_^=X!A($N^dN?*(Y&!_E}E2l8YFp9Hxqd2>{Bu@PhIbHVOsZHU76`w$CJ4Z z+|7SE{p8oDI;&!j%}Gw9fNNavE_72PE+e`uV;s4pf~Dx6CLycKBTH8xUnT7%^=32_ z6k;xWb(|eek>yz${TfQR4W;5!i2wp>hz*6|2AKT;-PfkXbUKemJ|S6$R<&o9M-MGO zlEE-vpTSS1xSf3c>vW%#Grr!2gO*ydS{u!^Q@9BWJb(M{r9W4B0{L=Kl2-;7`SK`L ze#KD<9ngl~nU|mTh+<7mx{cLm3?PJTRtz6_^7J>3We7-GFOG)z69WU zC0GDp7LKc_n^5nM@)XimEO}H*3))$QNO+)UZ^(##h79euc?dG>fl1^@!gs+=yO8PY zL>}__8DzqE8}wcGXCO>(JHnBhT7MH#jiP|U^EEJ}&f8S7@u^^a8avPMppCk3)H1!A zco~|@k#pXUQ}b)vLJo$N&X}f41G?R%n4w6mCDJ!)>|NDm^Kf%)?UyQ~Y7Q`X1iQqj z(QJc4;R|p3=P8fCjfPR;UBkA!V5(>N8xZ7j?m3g-bBLPp|GOMS4ut5FAjn(_7=jd+ zO1w1@($cqiRtnM^7tp1SJ_eK{WzEg)^F!0}S3g(iHKa09PahuNVYN2tWrab{x#a5k z;U{ENN;owKYCA<(9{=6dg^k-IBnU8&li7F2azV58b`;9p%@rdG2xH61{xYs%Yd9u? zV#wGV>_#Z%u2ghG8v;1&%^_v|kQDOe>dW^Qdu8sKjQ*C@c+4;t6 zEqn&JVWw8$@*72Y0(gCv0b4IAl8|^Lg>h<*Kh50rO87kHz~OZ36f@V{l|ZF&1APW_IrK@&h!vmEV3vPc_p)SzTr~nUsoC zw?s}h7Q)S5@q4X|TuHt$dvQjy{t)ev$0qsBYHYG5<`&*eipa)DSK*ydC+091^vg||T zv-LNL8OjE_)YeiR;pwhZG+t2TM@YR4gulZ9X`d2!IM zf(V@w;j--j7-6(-iwTPuhN%W7y6!*PO+A9>8t6N?%uHv-A&EZ_Fv3x6VkpLk(&{5Z zLaF{i7d|;YS;ZCRPVH=IOYI2xdW5oACD$x;*P}i5?-ooKsBE1U>`1EY%PBq^b5Wyn z95U)zne;5y3v8VX|A4?-pT9|^Z-OYqI7s*3TS!2LeoHX7EijR9 zD?Yd3m^=kzqWol14Y4Z)`G$#zqkTyOG#d5ZY88q8iIH%DWZv)>tv_4B2xb#bjnM~K z!5JG5-fBTNkipM0wZMb{Lzee~&V|*fOJu8~np5Kl&eYkz7{Vt90k~?Y;WZxP2twW7 z6M;R<-4rzvljevLF5-Ziegc z&g)NG_Tqtl>W@1&mlUkhX(qGGoIk4=eu#g+uKV#+6K3q4kp$@V{dBiaZ>B5C&7oAG zzgQ9PbbPYSz=WtiYkZGd)=1n97J3&1A{m<{gqaj}JtL|r%DSQHpO}@bB8yqbdmpG% z==2S}V1Mnb?XVC2Q}q+tJL;x*bjMf$FOlnKNinG2>-$>eyEXm&m=Dd(IqDqR7h2|` zLLOkNkDr=s>Xb|Ftrs8KRhVsMf)Y~%%g-S#Uw6%gqdPiH7d;U? zUz*DcY7b1BX=yTK&+J*Jp`b~< zExRBuZL+@o6L)MLkSV0K`y0_Ljk0di=Ge2(bIsD3*;+g$(}sfbpn{Uj$T?!^uSC5a zz8eee`2E+>G3lKyw4uqbRuSBta8~W%jD{W|V%(yzQW*T#^Wp23Ha&EXTr!`jK9Tyz zD9P*^#3^#XB>!*{{JcGF*(<^)c*Nv=R7?Oru}Tnv-ivbJeGT1O6^$*&rHf78K&Znb z{CAC8lA)1C4(= zrwIvyQ*G0{X;HWHHBYzjwifsH+~v4C0eSvV`oa~>mhy7?E!(iKB@12(K>YH}O{zT6 z_Z5#)V1S-0Lv<+pEDY(nT(AD4RC*n|MH;H>u#Q8Uz+~+?^yw&5U z_v-Zs2Nl1MIiyJV(<~Im+iI|XPOtzZ@pWvp`WXf*nPJLl zes19zEnm(3Ap7#w8^s~5LlgX~)4cn+tvMV>PU-1Wlm|CwwCC27*F?cKaa__u==u>2 zt%a9yqfJ@BBd7`##wRLFnqRLZz0XRcccV>~b1DAxyGiLOScAd0Z&X%2jjbm;t-6)% zMV@qFE`M*xgm=}q$kVbqg(|bB%6GE!Y8XzSXhu;=R}ykuvfvrUKo=W@XRV&{&NoY5 zZloT)4+U3tP8w|r_Ihb(u9*wTWAnD(Tq%+c(i;_X>nV0$dSeae+q-C8*wTTNnk1fz z3~57!>cm73!hgW}dW-YM+P#*xWZ)%B$B8PgUe04DB;XA~g3QA8aFI%}cnHfHDTp8N z_xIoS!cGO<+g{~hi=wJ$x1On0<`98=WrGuQauDcdY}m5O!llrXYkPwW`y zb{bh9f8O$$@$&?|hYZY!WJBn|kmz$9)z^B+qntfOHj>c9XUfj$ht3PyPqKffJ~v}U z{0914$psXj&RcckpLvSaCt^v>q?IV*??aCT`F2#)4#)R;PwLsjbADc?m8nU3e-Qx1 zAde{%fGn8f^XNeYKM^b_i#>L3j&E}A?sDF!#`PcU)8*9_Fj1;N(Swt`hx!8x1xw=N zM=xL**)@&o(yMDW3Tot=nU+9`_cZ3yIS7f$At+KO5r&dxh)ir(6}H^oSV8t z`HjrHrna)qCqZFVm1*&mNZV5hrgZ53CQ2MCI2o z3xM_d3{6m@jrdVHA*o0LZz!ZaiRk?t^GY@rOgz(KqYZ%H^{THh2fRK4L1Eq2Ny&_i zv@FFP2{mW7%yFZu`6_f!U@abWvB{;g#!*7GB-O-Gc)1F2d5R*ws*(wGrgz>3YFCkh z5VS4x=XoXVwAq}RoaSEBId_qhAKs$Ir_HRlGpEz?lNFe7y=gk?*HNlE4BpJ#l&PFR z)71`dskaW|<&~G?7bbNA&80zO%i+OG>v`0Y&_|M5{#*#|F5CZ3Gtr?O)w@0d z>1!4*HU_Y~yMU5KX^qIQFxkW=QL$22V|8l?wTXB3VzH4wY_Gt9KEU}%j^ok17&njr zTG^UkP!bq3e=bV!rn{^8u0$xsAOCy)1+*)QsFQAV`$^d^-ez_~y{Z;yuE|n;k zYywC~%_pS>G13}`A1v$-Rgn1Bp1Y4YbwkwfDX+3nls#E~iSMa{j>mL(mL?lZ-96aD zWW8t0Qw4>!0`>H#^V~z?4pf@D#G>HEu^GODuH+tf&w2UY*Z&tX@bU6888fvj=^2Qj z@j?y%;R4f_&sk0;xQ?4M6QW9w?z0mnN+0cUR*a(%GF-`_xqR5r4$ z=FD4|s^D0~7UTrM{tRA5a_UM`Xl0gPWGt_NbGQU0x{A;b_k}Fie8M?d#*=H4okGh7 zY+77fYm*_Q9%>ls9~HJwsEw#Dx(+_TMK>Z=IXy6R0g*+c(UxPc4AnU7RvB2-z0H66 z$Gk<&5Z48PPuqaq3lKg6l1K_MZ)5O{Vui#_kP<-moQ(-24grGRN+6Nd8zcM{HNRDZ zupFR${(BR^TM6(Vj}Z=C+T`;gt(z<={PyeKMca|08nB(P(UqktZm2{+t15iSUH)i` z9uL+)D~f_71RE=^+itA#H!Am-|GQ9_j{IT%UveIY<)f^g>R9PgfYv4b$y<_aIhSK) zNk!bT;OS%Il8wv^L*fQ~UPP*$ddtLhbg$R$$h*cF&+K}A8-{4jDTZlsEKE?pXScU=dL7Y>qv;JoC}5|-&UIO)k5Bs@zo{qb)Yhhp>kL&g*@&( zLg?@}dKuDB&!Dw7(8fad!heDD#(wx)N^5c_#Q1+fCFEOgD^C}MeC`5z1@7(fu@%&% zk^=gQd$@bnfxBtf`2_TFryxi5rRo$;doRs&%^EEXGJb0kY-2u6IA6J@`eZn3;ck5i zgP9+R>qn%ENm>N5lDzzMj9S>eOo6q0E4m%oby>4Oc_|h6G!|V?l2p}gg?Ns0j+Tg> z>?7TU2`h)H^UA*MV?%1!u2?~snl*sH1$#Hph8TOn+jPnz7Lw}G#Jg;)EZtpywV!JkZA$&Bl;L11REH!;x5)frvwKU+_MA&+Z1R2@3j z?xcW@>~3_NrGki!cENvDT}d|fKV)$ve+Eu|27wbu{rHlN_i#fp{;Rt1mV&DbUE1ty zki@VOZ1ZGWsCVDY^Ih>gRHis7n@&+npj6Eqv&5hCR}b}XxH1i+>PG9B&P|k2=lzgg zC83<9=TYXXUsesvb=#<2=JMPsQZz@z9;2T_-a6hE!YJ@6WHNUuF~LD{<+Jdxkfjel zJ9cieogs@KV+M5Wu`{9@T;y?c2O@tT@ejMEW-1SB-06>s(2phSv0D@#6Lue;7CiPm!h;y zq1CL10Xj*F>^jY1Z7Qm(dn0hzn`m8>YBcmhd@JXT&Vaz0|N9mBe?M_~Z&UxDn`$W@ z`XoXAf3CN+SWcx36qj{jv8eA6V%E2=y$xw^#t|Kw$wq#kRRNtw22 zres_F7^o=^aD^L9VoriG^bp7oAAiSQ>hvcW^?GN#d^lY{lt)F$hRcRTsEfwzdlp@( zaq-8WDjYaG*v{AxcV|Yn?45K|33$3m*OZ%xEdYzcwQ{;32&%B05 z^X7bAsoT-plIziVie*A<(L*q~h5tTn3$5k#mo6Bk93U&ey->7Q$kIYOB83vS>+xL{ zo*uSs5Mf*UC9T1+=gGP9M3qff={Rdkf` zxlP5hl~V~X_wi7sbY=Ni-E^Mnn!mao)IP)AD=+)x&8`kwIe4J>xYU9ik$GR027gCR z-7CEYZEtskdVDMg)vA^sdUuXDX*xTq*pp(h6l@b0sbA1`&o-Q5zb^6Oh!=)&o2gibk&VYAnv>O+eg$de? zMuqKDjwM*I`%TM*T!_jma`7oy_8^jmV0V_dI`&pMCAJNw=9LZ4b4B zp%eR{BPr336yfO(KWvuJmB)QNt$S%IL73!UVj=m1a?ZWMJb(`Vcl)F{=e064t_()X zTDqbf3X|cx(}D{OvkXd2RMHMPcNL0n`3RYYKe>vNzD^7yY$P>(X}E#5iQ;hN{`LE# zPh^fMX-1>t&%|jY1>FV9GwjQa(w}2B3jrj^*mT#$t9*_jKd!=ZgyM?Kb^Fa?)oXdZ zVYll)4}4j13L4&(A-a{4lcKP2mfxkJ%&U2)G?zWUI3J3(L_O0U;kNjGsfLZryG{QBrNI161`+>i4fyfBNEp7>BO3ww8L@`C z-?HMYaN(M9RS=c(|+IH3VIfkcKDC8&oy~X(_F`C z9H;>9@Wb;7|J{b+!|r+e)%9kvpLRv-WNy&r9m z{CTY|upm^RmeB%dK5^eZc`6a?i}fd@N1loe7L{hIKfBW1D=_u2jf68U9j!!Me)G-Kq&QCC8@!I;m7V0bNc|_^YR1RdHRTZty z1ah{G3f$i(c;SD4fsx);D>(%{d5ALXIYSHu1JQ*WT53(5a>>Kb_aV>E4BRMrPgI^l zbetXRYmrxuSn1n9ZTZvM#X#ZPJ-|4>*^@m%R&CNOqskLJKEE)tpsMd}>1Vft@I#av zXPuFYUNfYjmszXUH|xb}Wkm(PcdNbx7gzrCp{pyy{O5VJ;|gtkf|GQCS^^AY3STvi z>iqZl_34A*5p{uidb)ZIs3ICCEyU(>V8@}-O-r!jO>JJCeFZixfG&1m$2h39F;%+a{4r4^utq0QgM8faGHtcFb)Zs#>mFuZo=Ato;68ErUGfdjD3{z3X zRkf4_8546UrP&L!c{csSk^FMJypWw-c*st0pD>3pxzMK2sh3H`K+^%W$;>C{QB#S* z-Kp&N$^pwoQr$}&u$DY{sBurpG>odrxD1+?iRmz>9KI;rO=Ss^s$#93E)D0bAX<`q zg$OxV9WH5h+ep%awB)Ra?7Cx^IAK!Gcj(RaBue=e-wS)wfqlcY2b`wg>dOLnP52cRN(-$05<7@?Z9+#~Cxrkx*W$`-RmA4B>whS=AF}!C zU)si7xB&*Vyd`Zwl+TU*H%$01<>TMyZ>5lZS&-xkh?*LTSn}A>@qezkorrrxt+*5;%Xm& z6(!0ivbQI82AD766gZB@Tm8viG;-|qycGQgxc|R2^{sX}f1Xh^&lO((F}z2ht^7MRCoJ=$m3VK&*8OV~0XslxMewF@k`%8nTnkjs|hLqr#d z-10Bhc@v2s$}-Reax2~x8SfH^z623${>vu0hulEOE;1k_Ee7bLdxLG4GhFQIZj#)g z2DyPlZe8E?ArKI#yx!Fxz5>UrlptN~Zp!qIot4Nlmr#$Z(PqzX^gw}CMlop}JM6>g z7?Y5;48ci;XPa;@fhUG3xz_fe<@gL+RswN`$%#MbtXw|4wR%re8&UCl`$B-FC^m^| z{I`Nw0SdCu1aTsB$X}CtQ;@j3iG&BZ=&S@x5!=x|(}rqT`t^&8DM_%GAvt%D$;*c;C7YPnNJd79q?zUa;_Iu!qU^qQK{}-yq`P4TkdW?@B2I7`Of*SBV7EmeP(t&Yp=ELd)<3vn;IR9<@=$t{>RoD z_mZ#df42n;W;i45kNPeg*4yec5j);fkUcM?_dGO|-eOA@=0JCNSAqQh?QrNO0u}xL zza55Ogl(Jld@5!@(mhaJWkI0L{XiU3KqFLge8Gd~4X?vF!ftCi3;l;c6fv%=kyUK^0I;Ex6Qf0z8^W6bj(aNlmVE&?aQ) z$#hy^ zDkj}G1>po}O4I5<_xpInLEi(_NDC^#+Lcz`2kMQc^3LgOmb+3{hYKeQm-DHt6LwJIJ<({ zD>pV^Tc*h&f_&P+$MG?2~B-hkz)HSPk8#j9&` z!_kXH^DEg+Ts&tXHr2frG5QXNb{Y?E$L?re%=vrj4f&i4_t+W+XwJGxrP5+^ve53{ zATc1Om0SZr@@g~%12i-P6=U0%cq$nBGH^ZZVS>PxHIbkR^K{yP5i2kbk=y*b>ve(b zRgoypWccz}q!^1R>o(6!z{7TnItm*V$sY!=dg>7F64#$It6W$@i*reVA9TH$JKD+~ z<+Gy?Tdr*%E*bo+gOs_7{s0BrpX2E1JGNVm`X}yz42~@oEo}KbUL{5HC+c5z$yu2t zoX{rm)C}vU&=Vn5T3gMMuxGj7)MI#g)~e!K^`EAVQ4Pl*$TkRLEvbOn)0WOuC!3TM z?nf=vQgpO151+k48Yfr25@(e(5Mm=4)(S++rKg*rWUaW7gN!e9@R0U9em4Sp9Szcy2sjgP!*>sz0mu-Qpj}O;Bu~+}Nq!?XR&%HM&Ykd*5xfpLyeuw*`31)xMD!$y!gHpo$LS}N#0#-VoBb-#%V*OE*5{YxIOyxK3WU}YsiWLmWPkD zQ3;adcS+Fb@;DNhee1t@Bga@8S8<2V-zCL>eGQnS#v-|}@2CY*5m#0c<4osa)i9CA z0FoPoXp@mi`VJ%lnD{F8i`<9fDlM~)WjP|)Np3B9ZoV(?T=3WI{P&^aFTQhRH2eC09gx_TC}<8|Fok07nWcF9LI>oYJfilzXI4(sK(IE z-`*9>83;iDL;+3$22?)gj#PnSv!E8p7=&^XEHx@MofJ#)-8t;t)LZby%Qck|x&rA$ z9Dea4WNZ8tV?I?$Ksu0TSBsaNRk8ygaG}17%W??BkNxWbSl%H?c~Fl-pyK}bec8*P zj0#JZm~W`e8WaJ1Gs@X4HoY-)b?-v3%e%f3_v*!6E{g3kCd2c{zaq3FJW$ zonRzX2XUU~Cl?Q%&f{qIxahr+-Poz{bVLp#y_x}EGZG3Y<%U(dJrG|bn?Ws*kvQNZ zfQ>lH6;1Tf&>l?yFHt2uk8^@XRJQ97Jr8!AO23}%khy@$xPIHX_K=o_zY&Ns!C-*Q zr<_5=1<$%=!Dq2hL`~D6Kh>v#>DkT3M!_ubz5=_!1K1LP4M6dSQBIx3uNmoX>H0gT z?rsVif#n3I2qmF_pv4SuNkaReZ$7*R#UgdWig}nD#GsJ0oM#qoXrR9PLr++I$iCR5 z%$q)Z+?(7fGh(_ehg*2;vNOR=Wi2pZ@jH{Y8ZGWO@7E#@vCwUmyo}7w6iAu)TQT`H zSR7(qht%1W`A2_H<(6D4YD>E~yBG&M3fQ9(&GbP#Zsyuh0RYFm(|YLk7d;~-DZK-h zxUF`|7#H#AkYPV()_@1sPjvPdN5JL|&MNL>p-(%}kR~80(j^-NWy_jLgIG-Khtn@M zP^boNWnDZyve<}c^t9LMR1;KaX`Z~2uvszm2`e?D6#omW@mUFrIN>Q_O??@Me72DA z{f2~nUnNp=Hm7!GCxucb-^8MRsz zg5IJW>`5Q9VCB`{Btfa#4qUT7*-#qaFlvZF;E$kKmzw>I8eO>gLvE3-sk{ink&6+Cs$hy4RIA%)GHE0s$ucRhu<)TG=z453XfAP%&`~mAy{n-u3DAM(y-*+nC zky}9u;+rt5>h;NXd{O(OQGw&Ei)J9_1ol2jRx@2MH0Y2pbY*XJ-WR7y#4Ypww`g;! zg_g>9;-^S{^_Aom#B3<*VxT|`l_D{@u98fD^D8boT~MtA74q@m%5~=?&|f*vWU*d- zVfrj=6}u(ct`tz6A)@_WO%;LoorzNtHx?6@OxI|^GdKEuC44I*{AVr?lx`*hL_e?M zgLjdjjCj{!4TS&#+hKgGc7o`B8=kAj{Kp9o$!$S2>Yy)WyrRB*0ot(qB-cqTN8uB% zW4q;6s!EZOXx^rkxw<|}d6)8?e2;44wjlQhI8OHz2X_}DKCsgrBBZ0_L@1@`;`prL z{?v-RY%ud_-G~a$0?3Jy&o{d*L)N?` zaI$t+M6SHLAbakUZv0t;-oEnou9WObREAm#_!Mf!Z`ydDgooFwN^Ql2Nav4Hz5K!( zQIBtIFg%vYV#7K^fy1)vI;_pFiD~OB^|59LniZI$O0NN%1HrB`kVhZdkY>XI^8hGz zd453v__#^H;RHCjC=XW-=-D0igDO0DWr@-rx-&VRs4xP;q0-?9wncJ>z= zC%E_$r32fRr@+(t>D-juXQfod7Tiw*Z8I$+q^0ug$J!6@MAGWP)a! z12+4ZR+521;yrh(@0o-M0>?Q+(W{Tf8_NoM&{YnPBAi~voed{TBM;4mJZL3K8tEB5 zwAbJ2571#?th?+1sIe{=&K5^O%bp^}lMow+Lyg5?fZ1`=b5rdEjMc~A%q>jt-UdAC zNe4W7cLo`&C@G17^La`&jrCbm+|{vpWBnP~ukra0$Hhl=RQB%2u4wTOJdmtPmT6Dr zRZ30yK_vVGpTB?XpPYpZm(<56myMG!XPaVj zh6GavVa=MV1h08sa(~4=?v=g1#GU(*Mi76~HaAaYR~a^Qb+X z)-EKyB_HsefV&Dth+IK`p;WXiRvtXNOhAcc(W8z>pm7VR{pkh3=zqA+7yTkYLzFb}o*^F!~@4uIOwudY1ogg`z^o{end$u#W>*+`jiQf>79L#W1rr@P>6D zz{80t?3%#JxQW5S<`=PZfR+8n#G%3*?D^zi%l6O{fi2jRGYopS2Z2 zuxvCAm^Ahu$8pVseJ6?ics~`_QBK^+P{mb_&bnlENrWCq2B5eaDA(t1XuyKpty1^I zL@6wxE(Ce^AMVmUdw@fC7s0|T*98jn>#GvA$K;EAoVCXl3!6n1sS9yQmNP!6+`ljA zg}n)6*^)fX0P~fEK!^h~hC=87P`K@KQ2qo`y=v~6HNxTcBz}K(9?f5kT;-k+R$KwL zzC!74%fidHQ;l+@Xbv~~YF&T^mtS)#xEpH3y7IKHr!yEiv_zP?OjL$WV&P&E18`+b zvw95gxzoKdPaCZ!G__W8hFgujpe9pK;n(a>6Z$|6lbAHJJ-0j58I9z)PFutp&4={6 z>L_HB>zK08#~E*bva0W9<}XjUVm;ML8Ol)HgQm8y@#4M2m0(x~35aMK8nr8ekjaOc zdB3e%6MToeA69T9reZ3wY}6?Oa+8$1+!DswlZjRHJ-X90bNY>HxHVOcV5|XJDJUmF z3BcTysM0yw@MB=#7wOCYbBD3WvpcBwTA<)_q3)x=dB6pDQ^Tv!u3(s(ZWx+|r<4WZ? z7|RV0;%XXwJ7TQnBq%f;ot~wa&KdT&`6EN~S0LRvbNVz{UV_d0e_LZPU&Y+}1bG=U zvvkcF%;$uTS;gG5G9zTHi%*6oo=dLC2hAR(iBMg!U6Y%df!BGsOG5OiB^`3S9!L={ zmB(GV{{d1M&13Gh3lQ}akzykLl#(F^$(b6+8xud!)y<@bEo{9Xg2*yAY>BpLiPKqb zT4BlblbEnP_Rd{uUs%XJvJ{BFfw=VH4Jr<0wDmZH10np4sf&C!Sft#3I_VZ zfRByBW35?9CE?oU_DlK|)B+GKg;o+PxS2>$oPl3Pz`(iyPNK#hO>l*k0JfI-T%J{1 zo=6sfNm`a`8-)AX&N;=9On!9MJTOhpY!3=vrxeKJMOhJm1OvaPudxQn-f2+X4@&|V zOl>eYPbG>d0fch8BD9B3847s2h`Je}DiT)SDM2rFseTdx55n#zybe^Bj<8>{A4!Ui zRgg%nv+x@Tw$zX+^pCk$JSyc zJTA4RZC2v51dHy|z~IFAE%@tj`>n@iX=&vYC+=9Jv5CSs>y9-psl>oRQS7%T|--M?mhCKok_m#SU;TT6cG5?Xa=Kx-C zd!l6agvcIg*g$*)IWrgoFM6&-lyy2hot=5~11e%=Q@jfr?hH3zgn$Zze{-VmFlNF8 zO@IUNAEOSOnka7y_8Kt0Fb_u?7yaQkNiiaL1d65%_SJQx>pOPRlw|XgmL8-^@-MOY zGSRbR95@7Q`%3(#tA)NR8zQI-ibVPN#|*-_7Xx_2vOHZpAn0N+aeiqw`VUnxs;c1~ zR0igyUNP21U}nUy8hFrC{p`)!6GT()GNw;}{xUE13P$A?{y9>s;97)3~x@rzaI%AJ}I~qU3erC#ztkUF$ZFl*@Mk<_a7#y{BuAVx=tLju2d?rj*|&Co964r2Xox&C`w@%06AY~ZlG!};V&mKE{zB8Ip@ z+b7x)1C`)3T#ySiS8yqG+a9J#ony8ToE(ZCx`bu{MUGa2^|j)c_2laN+ppBwbY2iWAlc)ILHWO zq=YVI54Aw*qdV$TkfNivW=Iajo0n0@Ms50X(ODmnKE);WEvE}qoerU}Go&Go*eiL) zZIH~)7H7_;(pc2W85b4p09oec{9v)xVT;kW=go7OX5yO}xGL?JL(nzkR|g_!A`D1) zY*IB=s!l#yK}Nc=&hqMsh4o@B)*Yz?ee?1uV*&J-SD2z*#c@s63ZMcW&b z^pb_nx(LnG4_z&016OrlGg-%$&Im~IG!@s5X@iHEmwY}HkF9y)stTk54Qeidv2uvno$M1epBSr5QS z?}CjD)Qf2GRaaW72Y}>I84^nmAmn+S2W_7^KR*LrQrOeCSufY^zNL@`MusO#6Xo;# zK8us6jEFf@Qs}uy_(_Raz3IZ|2fSG|Wls3~?6>i%E=BjeTrwb9DgTd&1E_hNmMCpZ zYN1EB)3>+3J5MW5ox~C; z@@;%24>d(l9p?E3aX%YTD@O{+U@H-RR9u$mw7X)DEj|n#v^u(8L#i|YZSj(&>@2H9 z8iB{(rp?J;ua2u9f^N2=HhAk$4lyeFJ49OkpURs@d!hM_1eX7EqaINj;-tyrgM&Xf z84-_|%ukY(>zdPY4m46!nv1#OGB#e46rhSO`gp{cnPas8?(Us!tCS6b#g~;z|N1zA6}0VtXhhZi4J#DQqA14xuPdaYF{tIt*QlS|{QCY?*Genf!>K-h zJxM(c2MpSe$=1kev);w4V>vKe9C3c^fJ|-#f4JomlITBZjpRD`ZP`ciJlVEK@+el^ z3xP3_tyuOjdHv0fCGY9X&^S#SL8G?*Y~#`@w^oz-g&y4!mvy`eAg59PkaLr_EycKU z!pG+Yn53dGM#MLGalgue{NQI-H0Wg8sDqR4bK7)ix4-%nKZ}dYvqR-alonMV6>qP? zpI8SqatjsygK&k0Eh3qxEWxoXK6oyd zdpJS(yB7Og5r3JraOtSXZXzqr*0bs7%F@zzrG@{7NOE_+6e>h|c5IDP(%KEai^#$M z99@UNIS-tqjk$}T9}?_-c_@u|telUV=hTtv4GyBpjp$&6wL*QH-X<2P#?D%*?nr(R zr(VzM7^{nCY!}ZfXX3OV!iDTLNNBYr3gY$pmexuINv3a7Pk(68I#IK5%T; zS1!w9#Ev)i$6dfztmn}BB4J#E1g-h1Vb*I>*|(H+^LSg+s~aX&vQKu*D%(OUKTleo zoYlrHZy!ydUT0Ja;s5S1zy^5fmL}cpxnX8?UmD&{?+xDSO^3ESHF{X0mp!|=;_Y_m zMj$ygI@$&3UGwRo(x1S{P-G1JE!~r?7YVAhO5M;*2&G0G4}#YoJR(;IRO;7zSY$Rl zyV=joG3rJvmT$J=@FStTNNwT60FnBxL#qF0hc=ITR+$g}t3#asSK}cmus;9x)(iaK8cz=yt0#y0DDCx=B84 z&*0QliDU;FkLRMZ`P!q`l_5qJm3=j#o1sCJsT|GNNN^VLu}Y=mB}n!yvl|aT@XHcZ zbP$hTbQxe8HdKEo#?1JxFsL!l_g6!otiNA<>+|ncZ&Z0cc&<3xD=8z>t_52w;@0Ag z*sw`G(KPem&4R>CR9Z-a1PE=!6Un|ukG+ar0&RV079-b133;dtY4HAlS@ z;l;xzFz?8w51#9hkt84`pc=Zb3FDrew=C_B){cz zF4N=LlfHMDCQbG^RY0T=ncCpzZ^zvI#TtQYZiXN*{ZTiF0Nn{OgI!bQKvkQ)w~m(+ z)o~?bph3(j^aNU+GfH*Rkhb*Q=EN`r*90nHZha!aVZPc~V-M|iYd7kzF>t%?)HE<9 ze$sM%Jjh+lrldmnA;K)aL29-Qp+Wu}lFZ$wcs)cnTkU-M) zPQkyt#q<_?3)|MD20FF&<1{KsEWOB3>7D4MfSb9)gZ|r?jq?d*O@*pI-!}!VSBBM8 zbu6$=s_cTgm#vgw?pMLglI9jTv1|7WRi9&Zy540NK#F2woDP8d?WRHjK;ghYvkFr7 z-DQrKgxZT*zW#Ke3Z1|xE8C@PP$dD>Z_OC7z>5_h7g^-GY$}SS{nTN{@w=HQMAQ~9!Le*AvDFjj z;#@swo)$W4E-Sj%8RK&rWJmE4z0|6OsA<^{LR_z*#PfsbBaokSBZ99$QJ(CLqyzJf&QS6Bc7J1F4* z9I!&(&41Y47j-FrAT!2B(a#+WV_Ox2X5JPnL@!HmucjJ96mO^1?Qchfs3Ma5hjLl| zG($9K^wBE*u)JQX%lop_Qc8xurA6y=mzwZCBz=Kso0>HOp? zxgwqcJI|(9+)F4rnO}QIS{^Ya{phT;Xx>M5NtL9iv;A~5+m5Cf;^_RMuN`>NhY7>N z{c4PpO1`mllcRl7^gnZ|JJhPwZOngi};b*mi=TajSZRK39b#X=_Yla>bI5=l={JnW$ zGthYdXti`CRcpx&jj8)P`t4}Y3)($hH@9Brg`9J9(3$|rsO`_kJ2Jz57^%Fxx{nWj zh$oc9J@DgQSUoS^QILp4FG}WfYr;(_Bm0g(j~*9)t<;uNnAuJFSy0#Z3gKvfGoxp# z4WDV>QQZlTd#eS{-~c%=jX9~zzHI$*L=4m5qm{bJ$7gRCA^9!TE?5|YhX@( zzMX6idy9LD@}Uwp{_gCBReB5+9C)~_Y(W_X4B_>2Ubc?!E&59rF}jyAm5m-cKtscG zhqsT~=n>!}bOpLznJ@dFHgAtSz4>J{mqpor;01s<;gfJ|t!c@>1$>iMS;kyFl1z14 z83A@-h)Ceh?FvxyyQP+2fgF9h5ZM#WayOBZ&*Y?a95|jbFG$qL1v^#<2KU6T2SL)x zPIO1_ucg)UCy7hkFpj^sHpi~nYI`~sP>)v!{8SB6dNry53(^d$)M3DKHTcC_vqPHb zG}L1!R(MZ3i}!^Y%?DqH3)Y1LF~K1gO&ZyKe_^GsWOd)&IJ;L<+|{^j2j5GDuMyc8 zpY)EaDb?s4J6bE7L%&9oSpOYb!*urVqrpA+;Pd=h&ofOdLzwEdk3vjpyK=<77%whf zFWwMw=KyQi$t|QF=65-q`Z#SaDxjr>f~N+28=hV{&YO8YteNG0LaXpsfys}rR#7qH z_L722i|pb%U+rgW!bj#-vHOIgZ}_`y*C}vCM*iek7vpVm>N{fM1f;dJ#Kdsb%tfo+ zB>vWWC3P$LE^C0Z@jx*pzI5N%~Br1^7CNSemfYh?edVZ}?g##|dWY19+A zjQ0NDOww#w+=p67m0-^fYSKN2wFAjkP2%gTPaa#>9KV!4&I~f7DSA=$VQ2)NJsRQ~&~daz zy9yU%b~XP3eiE<_zsak4?E78syP!vMD5Ax>+%xUB`bz!~^Nrza4A>ApRH5Qz*efz^ zPd--0wN|p-p5hBh!P71t-)$C~@9)l66U)D6pSIvNDzjP9bsob$s+FI6 z6uldtuIPV%q&4p;?Rrb}LPJC>e()Q|-^y!Jt}TTf&6|w8zrPyyv;3kubyd%^`@i`9 z_!<-#{ridf%BSPK#xCK*5#*vw64fNSmuFSnd z8DoQ+TR6^ZuEMX5WQ^`}K$^uOqvq1ga6dA0niZoD2H^Km(=RGbajQMcw3*&z(!LQP z3&O%*R>o%$;v3FNq4kojEYWPq7A6-==>56)=}lP+9bX$iAn0rsQAfC!?Vyn?_9fA7 zON_W;tyHA@H2Wx6kmYMk?Z@&VV{g0;vXX_Lf{!nB^=|FIRTcVurI!kq{%AsXawzhb z?e=DH2!vZO>F?EO>XOGQTdT9omRRrKR6$`b;Udwp%H8dO|3Zv3%tMJc)=HKyPb!WXw<7>&4-3lCiKOe>n)Z(}O z@PW~>$wv@B;EB~|EFS2=?Gu1MucYz*8Dud2D0)>if%XMU9LC(*b9|StYL6SnQ#!@Y z!_!MBU2t_xSn4Fv2b>3Aj~4v;q&0q7^lWN4aPjZ^BWcKe(r|jGJ_tbb=5Hw+Q_&+b zGai!v@$M-GTTU#&l%lPm$Y&i~_rXR|&abJzrOZfw3FVei4!!vOWXG6qK{(IiJ0z)E zfc;(MF=R~SY1GfgBj{kuw@`V*Cw^ov1l_M2<--z~Q_)i52T7XVqg)$haTB06ex9QR z&rBJO89$sG7gJNaIaQ`SgC|i zc1TY;*$Rj?)A(EOKsa9M28-#kF1Y9EtTxk@dpN%)u)p>+lIJfmd_Qy6T-Q-;5I(F~ z8-6|SylUe3(W|B9i~s35cbp3}Qp|#h9y%sJ+3(@pu$0(Tp2qWLnjDTu%n~GrQG)RtkeJ_)sUif*M@9M*Jo{I<54A+eiuhXq z5?MUJBU5B84c)?(-N+j00WeiyQtu!E1VE#{yOIRZDq_BFom;u-{1^KQd~K9`<|+#g+=3eKGof{H=;IzQW!3D`#)Vst|!a$+4mf-%iuj?a=+ zqisFqA+(-)6&|3&9miI;eLo^GM-G9pd&Gep$)MAhf|^o67WF)lp=qQHQ^O9a$DfpE zp|AW!D(#CzMf`06#5y>z`66Tms69t@81VNRQB#8Az5~p7fMkY{z4#B50Kf=v6e02s z&>rpboD5!ikJWaPdiSIceK2C(7kn*JSGrU%R-bY#L$|V>4F2b1z5Jo2%MCHB-R*L@ zOEs6cE}Bm)iKr{j@1BHygO29;wIDr%ViMF9&z5DpdB>gdKlWgwIt1-bYR?NcMm{l{ zId{tq2Lgd^g+fYH;wrN*M4vX(VsDmCvlgev_R8D@VTi$MR7V|AeUMzZ#ZhgL+u;-} zkr4ns=Es~{bXzUDK0W8A{99h?s()R6>wc*7lC#(9?KklSQ}G|dUJO4dW%tHS`7LzW z+eK3btm>-|$R2G{oxC6^SbfCO_#o(oLE5cazo#1|%e9@7(O?*h z{lFdxQI&j^X=i=^?C$||z0VsewZ!0iS0{94f|7&Koh9?PH-Z0_EGvtlG||fOa?~&| zZl@=HUsh^Zi ziYkP!PNPCui;0#he%sP z0nSv|5*V~oa(F_3Op9wn`tW)5lSC#41KvxYDYM(q8aKFBA`WK}!s4%c$ryOk+PCYG>X{Eu{U!0mq`W zWB6(5_*H>7xQ?9Nn?`Gm!SE%7w1Wa1zB+`$!zLtAO$MR`WwGV!At z2Q}V>E|bqyzx2H*n6nJo*$2<;JP~3hZ36tX^{jVUOe1j>M`QJPjkX+HbbVt$ z${*7#BT0MM1cV?8Sl04fS`#Rva~v*_3Is&zOh86dpeH&$hxD@Zg#pW(D*Lvc< zCnuI(#?y`sqsdH&P2UpvPMG;EG9&OoX>-Blj68Gs!Z!pyWi}#d zQ&s~=5&!!>?F3;N05HrfNVd&;uY~(JUXHBSIpzSl54VF9GeQt>5_>pP*RaMqjJnyD zKgeH9!5`*p!h%Ph2si1(S0gveuZ6hK<CVNfm(xs-CxPEHo%a-evjt#FmQ<*U^?z(RfbBj8 zux^yX;5&NVFK5_>CrK!E9w=hfo6xJG1+v3GN7!niZ2ZxJR*_CT%K7I2VPsoeJU>tR zMft29^R0tP9)_xAV4caX%+#x-dr;bRUlptt#h+QphK(_2=~QPFM>f&dj?J_JB(BFC zL%W?PNLU5Sgx_9&tCe04@#T4QnMcci9cPCqnMBlS_HqSS-mIax{|$_zDpP=?A9a{D zD1RCN=!ts*3IF@t29z)WR$pW8olYV~mqM=OfASq4Lu2U1-h)TYneM@jQkJvT9<(|Z z{B*)A80_mO1OUxu&t~+ z3h5RRuXv)iB2ycF{?&NH8^MEYE&RSy8PcFrIvV{FKV`Y>v|ZY!+`Mc2X+9r9xj+2# zZ5j`kP|t^=1pR`aed$A_-@cbU!9*&yxa$qM{KUpv^=IfXzt(8YkxAOwc;94R9er3x z^=aM8U9`+&msd^j1m~&gIYmutZE;QjS*iQx_)|=5w$M2XQsV|k8qgZV&y>tesCN4L zQan#(SL;)F+mvZ?Lia zf~)t+qf%oKUA6}I39r@`LE&EWed!m6ursRXE5X<3K9m!=uWZK%igZ#xpMCrI&5sa@ zCEuS|O+u!2X7|iNAKd(<^2xUz>c2Iy4J!)r)+1T_3POBeF}`ghet96)-_lKOFg)44 z)T}*&?T#+vNZtG;HGBgaks5uU$$xF;zsftPbV~lFOucjimTg7*RB7=mzLQ=NwFKI; zVGqOohj|p2#+0|+FtqB2CrnSkB4fRmbg$bioAsi!nH;0cx9;($Qt*0LTuVOjp?to3 zZd5I<&4uST*kD;SS(rj_)Nm#K`D3@_@{P)&@Sh;6iof4%HM$L_K5sCKPX<4C8(a&L zG=ZCpLN3z3%RG`xtq6lph$AL{!046VWyn*e+U=OHie?)b1o^L~cjd3WYEG~kfbq;Z ze7X92YU!baPgG-0A_ms9JMjF=*{;`PNIJXxr|uxb5AUonr?G&2C6E4ZCsU^C^SHlz zXR04x|Ni35!~Xjj{zHYD#O7S;3ey5h_q+)|k&|);o46_>f0>ADEdTn#X2aE|B{9eT zVE+X9{+jdoIL$FanM0M~4*jfX0y}v*-M~3bc_R5=%yqwMBxQv6uT?S<7T}kueprxn z@qX@AGv+9<$3pSn^{yU}bbbkkclrLMasScZl`kO?~! z{C=e4*PGS96IfVTyuS?i7%=Uby;^OOW?IbzI=8--Qxyxl8LaCS8la z<=>txChCnKmv^e2lHJjo_903Zb&QkHvv^f+1SzJOV^#V2+WJ&2<@QaL>XN+u{eNOE zV{v22Tpn=)3+!U%(p*>0SidplLjtJ`e9x9?Kr4hB00{e&0{SPzOJ56$X~gy)3YTeS zWcOSGbrf`WnzPbfC}#3qr5jLZgi7Vw+;kB=350E+G;;1plqiFOy4Mi!z>X#Zs%Pzm zh>nyoms&j4i3KuJuiWWMI{kW0t+bDMxb4!?J3csXRlE#!zlZ+R43hu2=2Yy48IndddWo4Q;e z*u}d>w(z?EhcrxMLs7*%o2K&dz9;t{8y+aLM>ndFlXNijh^Mg#J{@X*^u&?{#a~T1 z2l$aAKv4*a!3>x=pdO*;(tl&UDL=*u;baUXe0jFOBcLyb$X!!lv=}xwo##QWyfcQC zNC(1k2WWQ~avL?;JZP844m5Q0yX?j+IT?gLh_)1#)S+?(t$S<;?KP%?H>LpPlH1>3 zxesnQL%aCL5a4l~$##Kffc$7A61%tIKLDX9AmgK{tf_9yS%=Arg^n4ODqexlAx6yq zWmkOs(`fS(MgGDG3OpD={LYv8&~!1%W&35zQ6GRcTEGnc$viu~9Y8Z(kq&3Y& zsUp>Xe0t6>q_$-Z<6@9(CO(e?C?bGBRONwkd}q7US5Z+Z4`K5w&0>H(Sgeq1rLlu= z=p@W`>(&4IC_CqXJn{=e41arIZC_4~2R5eNjzczxZ(r@RQ(Ylh!!sVrrPq&#yqqSn zvijeZ$cT}?;tcDkBz`;c)$HI=_qmT>(u4eEYKcNFRSOwrOl^Nd+vnYiA9jnx;)w+a zsq`swW*Vt|uQLu?zgbS7o$mN|O!;;Wekn3B*}B+RV(QWHUBDjbyDgAY%To*>)_xUG z3}N#x+(xH}{33taF79M2={Ky@7!^So@6N$1hkQ&wrP>^i+xbO_LLmN~>Fe4lNi-Mi z7UJKNN-9R|4h>dDDTssXl7VE~tWQ-n=>_Q-8w%bRx2mb@Oow#k;91I{r*V!#B&MpO z1W&NCJ^sqx4}9AFCj7AWZ+OAk{f{NTD0AL!P6&lLM#W9Ol>BVwP@IW$kuqLYh@p1m zzt7?czD)L8RrSHZ>Rjob9{LkjXZ>97O{;8tx|`+f{&}^^+1T8*_e4)>ZhBGT3gb(o zWDdWt77|B{^3RVOOEL{!(TFC_tOYr#=Cb~MaQ#Pi$ePsSflvlImqt_itX{J~#&OPZ zY@tR@zGvAY&AHVjlehfEXIILQKV)s}a4gq)hHOYHRa%m zg_}cxErsG~YVgZSv374Cl9|37dG)MMrpju|FRYwMW8J}P2b@+!djppx3%CkXUz)yc zH5FFxVtsmAJ8@=oJpR^NaUY2$5^A-aDU)*E_DKb!kMUS|D^jz}G1%kw!Nl^*HUE+h zOa3U&ptH7-vPlyvxs{-`3k4H2iXF_4tt-;@wr;)msbAN`y;y+yBg4YBTkvv^)>)Hl zb(SpN=@oJ4VlbzGR^OeU=7to$_xi=n=Poj87d%}t{T8O8y>+vLmGCXD^O}dRGQCl$ zLGhkX?3_G@?FM`x4d51Gv8V?{JkWXRkA?!$uoqvEQFXNznr3?FZg&OU3we!lmSNEbO( zrBiyaN4mSn!#-6P{&Rf4hetdvucnz?O61{04K!Zdj_^+pcA1 zmYS3BVppwMfeP03K?P6K^?6QHS`uUPu`-CH<-kq3<+HSE&P(izsH5?#W7p7z{qNGBm2$G_BHv(8DQ#u1C4sTa`SzVHFD@Pn$8FY+ir# zGOVAPCy+09UWk_qc#o+2jDMM46!P-)f?lI*7&LN!Z*Io}%q8->KxEKKESZ)vmcxg1 zy8eK_I3nV2Z}V*G&$nj^r-mG3w1FBity&~TY=4McI37IK6TYQt7Hv17Z6H&)aT8uP z+U9Kn`^xyXUexoi)4aAbXBoI8yu{@gMHDd2z5E*QLhCg1R6~^JgNb|w9zPyZ@PJ(QVg?Wqs(N#g8HX)2D?)oXejDo4_VNBM|vsi^f6 zrDWf=kl2)ZYFz?!ktaYBojmnN-?R<=VNrIJ!P+A=_PX=V0=j0s_BSk^R%^`(r?!$a znATk9yQA=hR{in7<}Wgl+u_nfmrq+otKOSw+pfAw(uVa!Q4PlKGty5$>E9i`6PG3# zlEY(>>9b`ESG4*P`T2}oA3CIbkE_|2)tv#^AWaacK;Dzi#f~Y)p-cSE)e>)A={w=P z(G1>~p{ydur>j~#T5`!NBcjBI6V9Rd9%qz4YAI`T#pxpzUwyr=7TfQG@^Ty@CMr%+ z?CRxl@)+G0pK9x1nCa?Y(+pHHbOPR(#N^l=TDXmD1gQ;+{$$nNTe zW%PB>+(dNi;n@h%KY8H>fA*mJUR}Np`w-7y)!K8G`1TZc*_RXrxE{}WSX&uCh0HB+ z*w}ExC!E(VtkEAB64r@gR(E7AKRfQnU*y%zh2Fd8ko9FVR?r3qeNcrak zM8zl9tIy#~gk2Nmu97I}G$k9yuddB@mc^g^8dgnnHYkmT8(vk$5&>z4}7lMm&-$2mGZ}5Ft><7d%CzCE1iDyL-iy?7pFL@Fs8ZpsMN-PZd(AF5k%?T1KsX`Yv=ke7wzBM7JvuccO~&(&GJ9>2CG;m zJCjH3S;uQJ@*mwZyJivdDix%r^^&<(?`R^Ndd*2@r2GbMr>JO0AcRM@Y+tx5YKoPg zWoSWXDwe^@7_?_=Ivd4C1Bd$C9(BJ}y7OKUKpi6T4zK|HL{u;Txd;ixdjsh7sB}5t zkKc*fpaubKxlHuJoB-35c=nesn7o}RMoU@TJ{;zgaQHv)VAA=xyKU7YTpTj-Q=YHF zNOs+Z#PjQ5701H%9F@D5X95P zasD^21=Nxt8m_#H!j1y>}jwSNxB9V5FB9 zVpF0^z*u$@oZ>z^eKA0dbQd*J8nCZR7V?pws+WGQgnhPo4Si*nZOAm( zw=A%;hg9kAlI|1^T@orG-QC@theoq5AXYXzI*TY-HVU^u%FFY zYoEQ=nsdxC$B4`Td|-eS_rHK7uo{5%QU^5f3czx5;F(DLgymh&3kIls0?%y~sGI;; zCBSQfVi`4+^4F)te{j`eQ+FfB1y_AmFmKM@=N8RwZ|NB3Tn}qe7&pbwU+%Y`N^Zoq zN^D$oOQjaX#_B}QakJsEtg0rQ6^$mL3et6aX9L|MKnvGToByq@6}ni7W8v#7^CT=Dsl6`@M>zVd~%jkPt%G(ohU>4I$UzHnWSR2^Rr`Y2JDy{q~Ob zK!ysS+)Qls8_+EoMaK_>klgz`1aDUjM+K5GSjr4tD>gQKR|L6LNX=IPKWhnrz`)KA zHehR0OhEU%LV* zK+6@R6xtG(+kUNuigcyijU6=b9*HY^hK;&v4CuaH_JVht?6n*gUv?^xW!8;3VCJ(& zNJu%#Vt4uevuzD-9VXPEs+2qYPB6l%WkkP>jYQK8Drm`qQPUex@0L=RRZv-&yiw-^ zWw36>EV8R&EKGV&Fus?Jsf7Q>RDg4Lysw7QB7qV^G`@M3&uDQ#m&ZEE=uCPxUDcC% zMk6btZ;Vk>q_N10(~7lnByxCMTSz(hxL$|8DI^bLIyrxLQKtw(;hMi@pQQPFgwmYu z2YY2mrl;3-V-#}-x5b>UwH%{?e1|!dsZ86(x`uZL}1sLdg)!u+mbp6^6XQ;SwlKnA}uE!T$E5rP;*b`5jp77 zREIph2;z&&*(-nH#c?=*ef3k`-5++GEpiS}qCWVGy{)SN;rp|z zw9L@lTx8G`Ul%I!I{#MJy4}aQ335?WmwuA7_DRs`pIb$ur&ZgrJXeuKliS_;DPr?( z<<-azLxDw9SxAPhzD8wuN91JOr?!xH!6pujv|78GJUq<0k97$Z8zGCSl`}r-4|`bnL=S&oS`KS# z2*hr@yOkEjJQ2lH#_Nx zp_UOkn|xs}lEQ4}m;PwE#}2CuX)UAI(Strq!Dkn~FU(p|v!hzYQoN?XKl{bVr4=H` zE<>-S%~nH?xq3a{a~6W4iH|IOBjo!6DX*-@?g z*F5^M=wS;dN^fSw7PZI9j~y<5vh@*Ia}+XPR#;WsN*tfF?7hE+dy%(_s*P3mlL;@P z?~_)={;%`(LXjgW1V#S8Q_5NQF~&@8WQg^>%WnL{F}DU#HZhb*i=OZU3N^xJWgPMJ z*L&mEud~c6Z;jw&>x;Y|=I;XT9w}%vkTR+92gY~cKKNJepc2`aH*y**VKz+>9YT2L*!_y&8%a88S8Lv)U@oyM%^W&4#sdlt(elvZ2^=GyHvTjsw)d0?HIEz~v}a}&5@PTwg_?ZmZfdk^*}SA{8Z_G6q@Je~ zYe{)*_%a-F8N-;SKZ3M&xaCv)JLl8A9U0RN{VTfVmjw#3t3wS3>xhzCv0Jmge!w(y z&nePjVgBxDB;gZQ_}}Y9e`*B5`wc!XJ#k!ulor&8 z4O%@t%=5n-`X^-6lDHa4DqU&D<@9?f2@B6BwKVVp&SC*+S;6CLXya?B>(bjOT9q0D z27!Et#-B!}JVtO`?l&Y_0hbS>S2yO|d|Tn8(eY!Lg;GV?D_GQ#Yeg!J>+f1e33c>q zYd=}rGN9aIEoV{8u^eL03J%yqIu=8?VhrO@Ne^W=H9t!X$|ibNyDl4Cz6>upS%VYj zZ(=ZHpi0H)M7bxgXY*Z$5a`S^#q>EUQK=20!4=tyf=zRG+G38Tp~9XMb-`n4f}AgL z%^t7_+k)e@)^;1gv2xj08!9mzX56IaZO2Y4Hx4b4fk~KxHj2v<(7^JYW2S@}apDMc z^AXf3ng|)$N(FDDLgZ$?R1p=S9XoTkYC|f|oZ8iq#okWu4bOfDtTd!}6_lDoA3-Uw<%!VG^ZfNA3f@HL`Lf7q)HcF^&FH>jenqzO{V<J`ARycAZ)q``g3zF z+K6CP8kFA3#Tb{s@x)Dk`Kx^q$4<(>O_A`D@?5Jz?eOUZL_Lqx6oDFqY$_V)#5( zPxMa<)sPd^$KjzTntPAGmhtlcxcp@Qcxbxn6Xu~+WnJ%S9DgSy{;aC4CGcT&F4cUx z>&=Uf=r0}p%x#b+)hUv3K^Y1XFU&Kc!;X+vCx)FD_{L{j4a-bNGnmVSYIvEm=I zo6xjlbH~3&&D4BOr%9MovEGdP&6(t=K)ED1B;&1mb?_2?WJOxAg(h*NpW{CFN-i-p zam)2B(zx%}73!#+pVi;O<9%%&?>_du9pR&O@x=Y9Yt1-JBN-~#&q+aKkf;3J+H0QN zPaC}r=`!6%y=})(Y~pn3?EU0@6S&M3w;y$S1>V=653J~h-NqvuN|{tf|M}AM-6r$Moy+OnH=V!k{i#*86Ekx^Z?^v| zI0Su6v9EYZewr`~!7i*oEh`n1=40H={oJ2Pfyn<-c0^@K0FqaY)FVeI%W>Bsg^rtG zz;&%k`hsNQA-Js+FD{v@!MKkik$r$Ray{vX=S}p}@uZRVY~Ht)YSm&by)hx1Axyfg zxmoVoUqC*|ODV#m=MbEV_D0%!`MZKX_kke6u%vFpej0rT!$;h?6z&b;(9+W$IVGn? z65YJUM9g>zr~7ML3wjpoFLc&OOT< zeO>>{LC@yR62~u=k5Z^NFV}r+`EiS5mm#kVV_mkl4U9kH-nL z>)4|>uLgCG02NKX)fqcR{YN4?g&+3oQyd>U{b3 zQ`HKINbe19S0d}AEdD3qKw4;qe{r0FuMwH+(?0Rkw@3-qi)vNN@zl6iXen|%pdYkF zSDR55%qSZV66Zg;iV0Nvn$|5yjOm?C5S>|!NWu1g-fCsP26$4hRcMD4#B`1=y-UL^ z;&Iw}s1~0-KCyh78kkrWnK9?3UCbCG;qtAl7CH6%?KS^xY=#`OpH{?WQ(kY00Rvo& zOdtC8D1vjt$x>clyK8K329xav**y)$s~?_tHpG__I2pbxNx%R7y5HxFgs)>h-VAg> zf3aU!&^q#42$Xk5YX0}K>j{MSgU?jzjT7~kOZ!bnMStsK&S#JXrliA?%?5br5I%~* z!41H{yDqW?t@F+%_$QeQ&(Sdp#+V=y`!{8?E{@C0p?eJM@cdE?Pcmjb!isO+<`q&_ zx%%qUyv6!UL6mOt6&c^G6N7+2eY`WFtqmU?CI z61cXKyxwJKsSh?-tO_e7Rk5Nq>-rh?ipP$2p*ce20^?MmMHdF7p}K1H3B69ucpru3 ztb~dj9ffNpAn&8c+Q6vR(L{QpN#9mPqedt zxdSHY3$X{rqVm7S0u;BO6}JB)_xt}G=l|ceXOLx4B6kah2>+W#SXEQ~o8puBN_c|d zB5nKKFrzaEhJeSLG&OE_Dz(oLS)+pt!p*;93a}DTR7U*HXZG4kq#fFsqOtpwSjLcxwRs%mM30$G=&i{kzOP*5uQ%>*+u-y|7 z$}q_=0);zfd?ma9xjGMzD&K?H18pD7ok}^LZiOM2FzodtPW0u%WZl~^Y!!w3FvH>x zn39xut=yI84PY3Pe(z`6=wSizG76i()A6G?gu z(c&@}SM;F0aL;>#jI<=bbOswAdWnn}4;+;^92`{fm8Lou!Ghg^KCipB{~#^zTXdCc z9iRD4HdHmcB`lr2JT}&7RffcnMMf@kC0#B3@a6($as^piz(?wr1WdUOhC;&>^8k<$ zhD5)Hc}!j4qY3ZA5V`;T+8aUv!bo8vZ;>*xhF}!#c3zsv-%1~a&0z>oe@>tHw6)?NxRQ4 zhk1+N9xhP&uc^SsvS$0g#&UU?AxTepTLVbq#QeXmb>OQn)b0?-ELi?`oNI#rbKkVy z9KGQ2astcmk3?23E0WA@r)$B;sZ2xZ4)UAajv4}zJ5}>J7;+jixz*|+mHX4HsSdd% zlzgKVeRyU3*i;YiJyg>(n()u6w7)K7wH4C#E2AxG{D`s54N_(hpP1YI_A;-bz{`2^#QC&7$(CbdR|Kl(SWnwToLBTsDmVH{Kl_j0Yub^UKbm60q zRJL84GMzSeX$N=zkvM~o_Ny1Bv?QMh#aDy1|4t3d8ZX!(owM%j$}%|JT%Zc3i@>*z zHe)cef4(rR6h0fdIC)1{cw&aZ&A+Dqhb`0NJ+i8EI649B0( zi&{=bTUvoxMK(bkp|az!GIPvh=2glnWQ5wjY{PXi$CoT8;8$*_ym>+UmQM3YL1ihK zj^VPgS9n2W1C)?`el})pcM_CS!`{rZtjXcuk*25@9_(2Ytlsjj*6{EYkME#l)^2KomIhM)|R2y69f)^PHpfl#Y zaAei0mtI*9sj-l!Hc*IDJs?)_*7Z;ja;6-mx0Er?;Ad<|qWrJ}i4`mg1>L=2VODGw zYGSYmH2c{>E=fZhX*fY*Y$bPR27N_kb5cex~W7Uz~Gh6eh)JEG#kIL%5K*pCx0>s6AQigh+kP zOQ3mN#QEWGL5qP|r)OOCZMLGXrIkIdYz~?*r=p9$qJljl{PCxqgkt-jOY$GPBkqddbmhhZ}g+TRAN z{Z3-|X@V&>ZgnI@|A1f0P?7nHQz6@vy z;fud!p>rD1Vz{bFK}W~n*|qge*#TEQ<5xPZTO|eTMFGMN84x&=tytb#Yp|F9>FN5F zn=U;OrdTO9bCQwth$?;2q%k73K!2>uaFq7oSG^G>kEJNb(#TJ(Gt7HtT&S4g#lswC z7&&JoyVhr2!ddf5af#Ldvv>!U(V#-n!Q!swI079{OM%-Dr^t{(OEjXnrjA8Cu%?CK zRm~d#^=tIS{$~4^)h(VbXr&p)42>ug-d21wg`qM(-5SW`2;u_)c}1Ke7WEw^`p~7J zAR{hEJ&~+5Kv{AnKL)0%1_)s+t^tLk8-Vf$Y+}F(18}y^eY6As>RjyknxP?3g@b|8 zu(oc1Tx?Ic)>$LEC_YpiS2?qbH>FE-HV{PN-f^liNFl$aOte`zDDD5F&|o!c-2oVBAEQEK?m&8ocmZ|K$yVnVOxS!IUw8 zfi3|hGT5nO0BkOZUJ{uH|HX&po*a;zhb#_dm@Lr!NPqp4{a1O`c&0S1nrS=Z^kYBJ z&}HVyA50Ln0y1Gzc{RCk0RV)SK0SSDU{CYxh2ow>p-k#7%VR*+WgJW+o`m z+1^L;qy{VhaXHPVz2e1l;|QUMR)mTN-IumT1Qd*5SUA6XWQ!1m-iR!`VJ=F@+&TP5 zB#+A0us$uVfHsk|^nI|KNE_MtXCn366okUQ8QDaGv{#wI*I4kguGVyv`ft8qS1~@E zdy1=n;`O2kq-wah$gR1__)SMZcCS89k)`amTBv{uw$SpDbZ7Kmt)|E4FZ=WHc2RB6 z+3coe_YbC9Ttr3y7w!8O0`#NEmnU2@riaZdZw7*L)w{7VT&ozJ9N8R3R6BR|S)Y95 zYUE=}4w2oz|JyR3li?y{`Of6y^;$&td+>cs_U@_Oo-&6v^N*tD3ENA=e-5`pNnV+llrUn%%Dx`S8ARaL3OyZtI75pXe@b!!A{R$u0P~>Gk8KP2vep8$D9@k;pe(f^XOa3yz%?LSV3}3Zs1l7*+p21PHv7S2>wh|s+!KFze`5Wz4_9B_tVyJHR7+rIDH~hT+C=a zh+!!n@!$2ooKccogNiP1!ft(4syFzb7_DN7_`gX7yK&sqFU&j{%nRct zh8vQKn*Y(_SE-uU26t9e2qRsp<$MjF@7Hwn%}=91zG<`Vkp7;9|8=g6yYd6&MB9&l zeuAyrOc^v1^9`uVAAS(e1?v##YmlDxcUEXO(fc%Sct^l{aJ*T$-My=EoRJc2v5LQ2 z!LG6bsfSLy8b1qX?h6G=Q+LC*Mww@)p)8>N%RpAMypjP9%`9P&Su0YxFp3RfgR==s zybM!pIFj`Ums=~+e>P974VRB#nz`ScGs(nn^UsB7C+L|A0MssFg*%|V5U5?kBqHkk zwgT?GZJ%kSu#3R%1z?M?MGq60xNyXg{>g@{70L~s9qL+lEpY{p8Mn~}qLr=}%NX(d zBjTn$Wb13tP2wYJiGhnf z#Xt@rx5965*rN;(CL&Xeaf5(R6}rX&UW2sG4zHPlRw^N@OJ8AIBV4;g9-<6B*OO+? zLx%X3d)m&XTOQfOHyhm{7W-wfU!TLw`p#u*CrvsIQu9+bBeOO*BpX(e=T`}~&E8U90A$Pn~{@sNAZH)Be@=G==+OP=&`_v4!5qmMOMY536 z&#pLq5tf%m4S(nPXZ*`3f0-d+J12`MZ(FMeVhLaLDLYlDC-)$-Hms zDd=a5<5IhUhx$=Br~g$_GWjPtP4oX8yfA_N6@_LDef4m5B+2rSPqSonMY^D(x10x) zJOfdm2G;lpqa0JGWCjR5<}g?X%~=Nyxuq4N`{UwgZT#{9$ICUD=jRGgCxC|sygR_- zH3b?A7dvqL)-Ny(o@FOthsuA7=g-^;ptOD_3>PZ^A#k6?X4!Ddb!Ml?*gh!Ub(0$m zV_A+mzAx-7N0fYLvra;Ad`8Pn_7I^jthv>q-O8_2#jR=-@ z0OvC7oVy23b5SUOw*$Xk1PC%fuK0Zl0Nw!}h(JyB8fqV*;V@Gc@N0J}cC_S1{Uq2# z^T3B$2s6TdTjf;-AD+NK`zgxQCtIXbYG5%vd`m*bW(@n({mnk5q1o9Gn12Z+%GhO5Ajui!B8tGP|4Xk0NF$j*1h2&tMUs*1-5o$$cA%Ak?VK<;bAJU+r5NhB*-M!MvsVmrI; z%QHi7A0I556!61=m$`8oM!y=WD)c~~dKhJorAd#A=m!4BYL4MY>LMh7sAnhx7MYF?4- z-t){#x!qH>R|9#9beyC5H@yvfpzIRfDOz2GOa`HAj1X zfTlX3^`*h0K#g8;pRAjuVziKReQoi4Kn$z+0l%1b7-$KTH$GtDm$i=lm&yRA=J;#Yhk081FBH z3>_il^&pO*Gs)ispCNMdMp$#XDcN&qz}70v41*86X3e0eC!>QTqk{(z->Ac;sm1GV zXjQiUYR=SUNi$%OT4unItACAckKSh#D`Ky}=V%A~VltD7QABIlBq?a+t%HaU%0flx#51K3 zFSOMWWUFSx)h4tHKw2pwov#%aSAdR*nvXmJ+sHF!KJ3Itl2~?X z@)X$X`B^1<1p+oxTn1)AIvX1f`l-t%PO?{JgeuToSE!ipciz1X_^5zi)PTb^fJ*>- z0PH0F?-l`U4|SQalfVK#kLlgpkI^}5BCbJ<2nG=rcNQ%_F*Qjm2Ay_jKB`*VrHb1K zT0g$oQpwtA?D|*A*huU?LWqUT<;^ZFXh=$`QhW5lM}&wK1LLJm!lSqTPU3u;?8xj- z^*6mjd{O5=L+Ss!WlKu2XelsA=&J*t3jDw)Y8ZLw@LEMl6fQZI7_-^L$P~``K*@w< zFpb>_?3$L@Y!qeOQe1|}dG3@|+$lVY^LYiMB?;6%HLWn0jEOyHpR#$Il37`I)g}P` zZmSQV+iRfp+h88s!Lh2oGkn%=OnYmDt4jD9Qkm(z#SFv`fX7?2aTNAKIGw_w460k& zFcozBfaNnx_}UO@-@#r|z)nV@wjCm4B#}B9oc?KJJvitj5h=BwK>s{x?}dWwlAf?- zC=`6#i9kK!3OA98PO&uTU_8{D#A6+}Td_12<-uiRH)H6$CH%@4Dy{5AkYT*etH-+C z3<+}lijpEA0qHP!r+-I1xp=SZuGg5fF4NENn$p$S>|V+fNBET%{@qADx0{U6OP}&h zk8+i@(BXLTpBhiGEB;Af)^7s&d5j9}}Y<+dv&VX|hFgJkP#TC4M znEu(I1puL-vRkaHzrnwsU4?+hVoU<%2?)ccG&Zt@?W8evKp*{oZ-arf$g>hzZ2#^3 zlzZ|r5eds#uauVhM*fC)wbCY?EVn#oH1LDSae!PR*~^h-ASN)KHg4?Jn8@I`r6^_L zIyn+I!1aIA)(>^ zu_X1slO;D6k>%VHgV4Riax{@qS|e>l1r2CiyarQ}Qr!ctptPa#+H(M>Jt z3zk@Y^D_s9LSI*bai-`rRW?;jZ!%eq`^TwGk$2c>x@0R18xV zZKo@|LmZbr0=WLe-8D%WlklSPc&={{JWwcq*x-~0EG#CW+4YJHC#s#W_t11? z{;R9NR0LPX8J9OPf|>q8uwiZR(4V@qwVfC(2Xzt#bN#US8#U)~8LtY_7N^XfAF^6taJnP6Gf#jb!T$i&?bT^V+J~L&%ekN z`re@F*%Q$p*E0*)SsgEAHdHyEMjNg+UQWjpMt`VHg!>r7qc(Gas39_O^yO^S;2u3^ z)oKKDY`FV$hLKsZbHfhriSI=)BDVBiW8u+JOe!nKN0t86H=b$wH{xYJti(FE-2sO< zR(jzp@sd_K$RMoW6E0>y36J6*R7D|@iVNjm5>c)J{k*hQ%MnGUlr84^Z$j9}_z50+_ zK8p^YVy=CH?`&%_yL0vz5=4s~KF6yQ=i#&XPFlfZb2VT1jOIi>)Zt0GROqeJOY-Bx z!u4UpVwY8acyz3*?5|&KZrSKmVnOKGlQL-Izd?*wd(Jjz@!ipoP~?dTbws5^_Mzh2 zb`JCeos+Qw>NGIZ-H$s)ZBV+!cyXIJ=SEi693gcK zd~w^lj$JGZWWuj7jge9)GO2gdnB?(&o_^Fk9&1a5?h$298(Ew01C_&tN#}681*(T< zNoy=Kr=$K0ZjLp#XbI$MCriZ`_Mmfw9IF0YQt6*+c4b67xG;mVwIeSh>%?N){z5s z`K`76+GDa>-E^pV6^EJAV6oe{)_l*-O(eS-GkU@QWJ(|qOy(z|T(;1_z&xBCtse_i ztiY9&!&BBEJSW*Odo@5T zB6F$ln?LmmBfw~d`4~|GnFw?ZmaPEEdERS>ci#QO7RbNeqcPYsx*$^FOZGUb;TwcrCJn2MmfWB zvdShft^XK2Hr7nf-#ELFEm@}$@0-JvO-PLP)h8!xg#Zq?@Nx$BDj7VxvGYw%CpOB%9fDUX_j?I=(1X+eqEjsz_fpL;q8O% z$dig`>4X~r-qJC24_(vfSwHLvFgXKA&p@I%)Zi2e6i$COuLV>=4j3Vn~o|~agO9O6q6Ce7gU3<=w*K} zd;2B%{TXE9o8<`edt+3R*>HeX$)}dmLrcUZD3YLH|B&+nn>MTrX?k%K3!xj$s@_!X zpY}z;ZCoX}6b=0R80LF|*3x2yQI^k)wFynLBNVTw_;#2x)s;oIcT?J3zyr+YN_PJu z#~4$m;Sn)v1aXhpH5S``js~O5Qs|_`W~~|4jR$TJ-4h4?C$5u{mXe*}ELG5!dwd+g z0^&O45$z#N@u3V}_jKL?GMBq(<0f6JmMQ&YQkTO?`?s@76A5v!V2YU zpI=rjC?eBXB1?Y2rLRie3o~?F(;zvLm*?QpLii*iHW@@~@fKofuwt`1Do4|@5Rn_3 z6hx6OT_e7`7h4kl^h>1pmSo5`097+TS zp|f6k(m%M$lzHkQ`t0HC%m-a6N~#m#Qw)X_^G@Ul)()u~`-QEH&BkQItn9mWmjc%E z5^DYpp1T6~PW{B#=3;HZ6gV?c6PM@FwDMtKO|n0Q(rB^g4J z07*7bC?-=Fq*l1emqapEWu||PjvalZVjz%Xew=3Pm2S5!;lN9kp`W}q~@uKDm3^>{2W+b*>{G&?)5SJ+QGl>Lc)VU@X zG?|k$Z<~#9K=@w|iWCP1>5~!`omG&G$_!&lCrI=rLPaW#hFEp4jZjkZ#Lu$`k5{UT zm4AmE&nQt1Y-4e7f`5&~ zje&n{7OG&u^Au&dZdxxc{~t9 z&R`hGP%Ew6#h`h+?HVV@gAH!dCx)^=Eibb>;R&4*5FEKZ88~K7<=E-Dy(eHwdP!A) zSzwihZo$6&u*C8+@R;%IJ;BvIboWXLwrXM4MocWLGKGrv>Q4iYKu_BnqoR3gOAX${ zbik^>tZ7ZSh=QxgK&&*0i}HorA$wJ&=t zTcX>Qsc^ey9OR;}#`j&;A4S1KGxIR@N)Zw5KzE&?rb(fA* z=a(u{*w@7JtXQxJnB;1HE3lCQuqy}iim`HRMU>&9n|a^gOOkq7zH<>{D?7lA@{27S zoA*s(&)x(8AOt{JfFziqGpyhP+-SUW;omq26RH5z5nw%Jz=`x9)&%g07I|3wYv6Xb zP^?YFpi*hiVcK#-&jCy<(E}BGkwL}sdx=6qLiw9P!7)B8ItlgNlc0TVo2&u6o?8pj zbSdH|w62#n7V)LBQwuW1oXUwOL(@L3LYXu#{W|3r7guN3K0sgB{Pz>99S*;II(#1L zKn!fR`rn6YLJbgVpsD}Ip~BKJKlnVmcOOk-eZR$wmA_b^d@QC~PGl>r9Z5W68^kQgpdm1C^<;He=W|es#QBWo_KzNuuU#!sTilXGi=6 z9G9!yFcL7ZOT+qVfPX*|3d>L(OnZIryLa-x!}!549Kty(?l}#GrR|GQ!ei&6^o45w zmqso22Sw<;2WAItv->L;VKz_*qx7)<$2S&?t&=zqH9#{*BWd7UW3c(K&B2IgNor{O z#G#{N8TXl6PkbQ~PW>5;^asRvFUq7(#lvS@i8cyC`~uW^;t_0@mCDD2Gr5XQ6PZ}W zsnsgy*X%_r^U1R{r|;YF$@aO3?K0$BX+R~ntFbuYN_tUr5})pSsMkfps(OPVDf?XzJ>aI z_gyoh0tN-4HbVudMZ{X?rh}~6f%`rb_#GiUcU5+h3nU{ zruvU9ry2J|$vO!Q+xUY;_+~j`0)pL*k9wxQ3(&8Hr#APyb2Qy+LxZ(OV!3;!2 zag&|Y`obHmFBl;?eH6AoCZ;Hbf{f)=h#Q5U5?SmIC?pP6CV)NvS$Q-Z~ z?>*$c!_}E7U*YxE#Ce@wF#3;{2G~(r?Y=%uWa;&Rfm|LC}vN*UfO2oJC?=9$CAOJzYUSux;KZOO>Y_Qa2Udfzig!F^IK?UQKL?T=X~GE z3Q0+dlF1f2K&GVad+Mvz&Vm0*wA@{9s625i(AW>QCW;JR2zaN)%wkU;mKQNH`Bqh3 z5CiWQQxXB#O|TuyKz`xz@exCP5_=>YzT;IJrLgX#E{lQ1BYlgf-+++snSl?aflfkY zhDfaYg}?#9wYp>zMM|L5$akf8LAOa26Yg9&uAQG+gU007da}-soOFb+0(&^SM!%fl z(l)^Fm-na*u*bB(o!1o#G7-MQQnCMYRGE_&cfN&tsQQ4!*e=G>c=IZyomX74UO+s5 z?O$a?a`|B|iD7Z5X|G_NDEHl+r)|!YWQ04hea3rFUQA>GCAlEdE#`?$1m{C9oKr5F zg^G#^ET3)eU;GK3WO`7dwh52CeVgDSB)n0MWYYi$tKTaJwLt`KnhyohWwYA7__pQO z9nCyPHRXDs{5A?QnHR5hd#h@@aa^r$LxK_x3$F0~UF55#m)71OjRZU<;<->)PEs+v zTnv*rc~qT8sWqE>b3SDM?m#)ABUWIlfGP~`$$$L|R&l=eYw0tbKOka;+}?8p?y~$Z z)0$y>?|DXyBuV5&0 z`{G<#Dk5Zw+E|q-b7j*|4Hv&-ZD6PSRiwKVhpIpHmhs!6nR+5R5j#naii_`x)9+6= z{Vf@+#g~BYUsv_0v&vm_n@bRVW$qDt(!&gaLodna`4<&CAL$?69TK)Qn$l9|^hOO9 zdl38oPM?4Whb@@9?4lK_eqGrp(os_GI~zX`Lp8C6xYJ~vciFT*z&R>gqUd~f>J4XF z+g}-A;~FJLI;GT!C+DRj`H1i%FRhyjd_2Q@t?#-6X?#( z;({tzi>F6~!y!<}CmGN|vA9^iF{4a!6)C?e!jeh+W;d`RfTHxO2rr~*oAn5r=NEQ# zV^qk%7Ta?QtxvrHl%}3(E8sN*Qgz(9_=%0=4b}k+Qx*T@Jyff}5hqlhv8&^Px3**rMg8>F)|2!ZlPB74)>r6xa ze;(~~^X^X0|LJ0DeADKGzcH=#rRJI|bO*d4OsVQ7K?RYm0EActwB0w4Ym8kZu2|OM zzz^UB( zRB~;%rVibLZk{Nmt}0VGflFfoQvYK?tSx6PC9T91Q?4M6Q1zp-w6LONQ6+T4euUB< z`qn!2t$k}jK-qRA8N-{1;MI2q!qe$1ZSyHH%*yf_j*JG(0iZSi;Or?!wr2ef%)AIe z$_|E5YXapNE_5Ml9%SG3HI-t|Fmn?HJ1>h~*+X0PL!5eh)>>yQ(Q?-?@lU^EijSdq zW1B|YUJZU0D%W6wQg?~oKt`9A&en6jb$O_=J?RY2Ui0#&Qju6j&=}*;SXd&lu5Kx_ z#sH7Eagd52Tgo9x^**m`cmc=GN#~9YjsvHJXmo6qrJZqacxuuvvlphPQ{kjb4t+0I z&2;@Ky3Xeo4gOSnLir7E1~17Uz1{8`SlI1gk5w@?5_HouGcBKeEk!xxtQbgJ6SnbG z=7Q3vA&2erO!lKh(Ki*)l_|CqdrJFvH%Ak#cLF>;hwjuRU9!KtVOctl{91T!A zr2a@bF7w5xv1u4KVQIcs+J{8?s8&4b_R?4#0Trnz% z(s0kv8=i74$~78ZVjEToNHVlKoG@C%w02uJN?m?69P3(WYSp^Je5)9fm=Bn>aI+`} zChj{n2k|9{5(kS5Db~NzQk&DH8%t5Q<)u4Zh?!3>9iy?98Y^;A;PkZc;EH$s(eh`u zqH=L+&e$ezRKG-h!|IN^Ya1aafAF11QROixrBuAx9G>mUzrem!N9DwAl*w5q(={?a z@dIzZx?W7FY(j$vRTBF>kL;Rk3&nB@V(F~>LF<5a#51|iA^SvRM6tisQbUkrf0TLNy`Kjy9LS`GG7CiaNy4gh4~3-}_EkShxau36Y~88t2QP zaNWc&;LjCE(795lr|DJQ$+4BU?SOT{k(iBoUYCj;~?K6`YQ^X`aU z6^%xkb^VyBJgm1rZ2;5_M4Q?nj)0yjV4+@D1ccmMyb;iry7fhX{<8tN`aP3200(t| z@CU2=1N{=P^aA)U;M(EyDm^}We+{Y;cYFLCpvkaAYi5H<F3t49XKIvW(2Gmh!Q z9bph#WY9XHZ>B(m<3-EomFF*Ef0>{E2lEwWJwx{H=cwJSEt5J`^Aei^!Iic^jLvml zD%5T$o8G{N@+1!d!U|Xd`r2LbqfJ!HuIbhyJryRQz?!btsRPLL+$e%{@BCn;8gbC> z{RazaM-95H?^P^tzi6pt`MnYNjb`xtD>b=ze~?~YKs{%b8mQlZA1-d6wT+~JTDc^k znh%oK`JW=G+gs@rJuVqc9flO;&-lzb3g&?e+AYa!rC2%)>C!{XTq(-dn#;;ViEPP{ z#)aw1rG#8ek-7+J%Eh{D(rEfbVjzN*bXYF7%J3U{>h$`33y^YUF1B(x*mX9woN_wA zGO?OC11FZX9}Y$-P{6m=Xt70DS+sLi2qtMe3vAm4kk>lEZEDqv%~K9G=3;OyZ*{~& zmL2uY*U>^R$5d*Ds-+j{$u0C(#QKzr7RiswsG!5dx+d)71%}hef+}aLb@k;|ju8W7;eAOnw`FJ=c_SCJp*2%Fp}~OVaNwT^G~rOE6X0)>Blpbh6E6q*mAz!yU~sHce|8R2z| zHbtFSSE`>dSYBhVan67U=(sIX+{pu!QUFUl^*b5pH)v?B6k1)rBU+1j6)RG~6bGY# zIOsFajStjT87$8!6xmlzu|{PIj2{X;-v&#&;Jo1Ts^5J~wYPo+`5`ru{RU`jk8Z9~ zW+*T%kL$%xHAwChVA6<}fC`dAl4Zdov+y0a6JN+?BBnn2#=ZSJ@6qkLwW=m^PrRb* zwwz|lN^B`Y6_<5uK`r!?lN>*`t5}lbk-LhBp}^eF^tz+!4?+_j(%UfC`{!^3Ak=}t zt8D!e`q~wRRw3mX;h@lQP~$33lA=*zIujH_AxM?YQcsw9l4(HUQ;`K{xFX%i7^oaD zmBW2jF9u-z|JvmN8We!a#Itugj6U?-*#m?p|6x19__dC}a{{{C^}TDaOUVFL6-KRpBGE7Qls22)J69a*viZbdeL0 z5%Lj9q)W)I56z2!NYElFq1We!4McX=m3X2iV+P}hbU3o=p^2t@Ui|zjNNla7SG*BM zCJpf2y6*702J|zyKX7rKtQeTAlJ4voqdu|1rN3xrrz8|S1*y+~?x}!pD;R;v8lvnt z7^b(^12U)^C(I4d5=awQE9DrJFB8~ljAjLj9G6#a{WdRf&i~cKG-NqWKr+m^TKlxu z3@Hvv>N86}!NH-tl*nrMpNxFc1ibY|-zRKI{+cy4v4Y1Xs3@OjSwa3 zy6K8^^4mo)E!hmS!heX)xP%Wj`l)%o?G^Q{h0bHr?*F3eEraTawlzT9A-KDHaEIXT z?(T4Kx8M%J-QAr-fZ!5>1$TD~5C{+;3Da=jeKk{4FTYZ?i^JJ;_wKd6^+^Ed$NAv) zw!^5g(s$x{+5?R<+k_OU$3xc(ev_j{9T?vuy6e~^QD6SL&VG@*+U{~YYnc`l68%}{EIj(#rok|xf=L7}YDLw+(X z=|-9KtHP^%OdBt;{N1vb!DS$BhBIq^H8ezC18*eqm>8GNS}bITgRh+5(#pQ3Me~mN zuNQ-3lr_o$k?6il8;?=D{nzq}Q@w#!et1eG`T^v0okOLxp5k^a)}gZBObUqKtB8;# zo;@p4QGVWg{9qt~H_^68d$Bl}95E(y`q)Lj*Xmv*lZvN);Xb)_hr` z1z}{4tL`bbwGB;3GtcDJQFt9)I#O4HlZFkv3PR1`8nAj5S)#d`S9qXD zT(zBOF4d0>=?T2v=eI@u=YsM(@EnKEK0C2`Nsqt|^XI>qO+0e!)cBWA`?xa`{aNT3 zrpeXA#zh%Iuxp$XUxl^Cap;WS96;l2{CqN?ZiLLgLl!T5*(&*g3bya zd3O$H+WT_be3gn@Gvbx%6(QG6G>S60TbWh_1)_>cB&)hus2 zEtLwdI%fXqMj_*SHAV0Fxtr17hT2Padg3zPgT}XRFWyK0Yc8B8KFo8D@<@S1upQN| z^Q%QyQmSav=X8M-Vvp<^h!^=Zv=38C{cYNP2ltm%fWu$N!3O@vw)U9Sr0G9Vt=6@Y zEU6#z@dMe8_p70(KkhC6g zW_D;fiO>a(Ze~ep$kpd2`^TJCOVtaq_&K(kjRW59}RiKRS{eDTeurJe*D7a!HfHqPiSK%2~ zjEO@tt_H1@+HcSLbENds7fRe7fWBbzLNWbocq<_a&tAyVt<+B2B@1~uN-KOSg4?oj zW6Y_$r_6GqggQ(n>|4bB)8hL`l6)f)!=vv`-zJNsI5KU!gkoBuXu24yyEtjOWW?^R zqz$d_b3(#DU&sob8$Mdhy+Zmh1cL@-S--x#fw2^zB{d)f{_~#~_=D7m(Q7JpeZrd+ z2l(-3WeM=)0E(bn{e|Bcadne|O-q%&t;Ot?2_ezU44=cm_2$-VHzmT~1AW-2V#ysS z-qYTcVbu>LfjfAPaoai*0*<+|F=ov%AeAW@kfCbCS}r3ny=kC6Q&iBRc}6$03zsLy zxcTs;!{>vpUEA`jNPrn;uU&hMzfya>P|mhOsUk-wzHKcdRyh%o79yiL>a9{kJke~u zW8Oq&148~`8#tWGz^-a#k$PsI=2ME2wZ2FVDDM#DV8;$^S0%@RQ4a;%!!%f)S5vou zhA(}MoNFc5(W@@y2Aee{Urb(|HrhF(dQwxw>ekwZVx1v>GNWiv-dQ#SOljp1%ecmK z=E}|_Q0c`9+r|f`x@i?xRV|pvn@9I_*JJp1Qj}VX>Ak=xa@K5bvr`LdbuJBASsG07 z9S8^yVpl9#n%rQ!NVQGSFlmT+4ov2NPd-dGn5rPQm+XeO7`S+F~hOZ8n zgy)**Qm5@3^4-EGb9-EE7^#u|G}@fzW!J68=;vtj=DGBp1g+t-wit7@nFoE(R?sLHav1RG)4K-6b9F-D1XuWrITigw7_DL zsG-rd7P+*uQrL|0KUcImN_>x%R_qTNKDK#jU)dkcR zD3M^LFy;2hv~X-98M;rtnyXIhyydk&%%2dReje!yd0CiZuzSJQ||-9a-KQ4 zw3t}<+ab;mw-6)anjVUVp{v{$_*@mrEG6sAM~b$?_$;YdmW#2r;0d3TM3%tp|B>MnmtoCXV#{tDwD3qC(>}On=2J8^#Lv96iC-wbh9Gg=X zc_a7a3_OxVLn;%R*wt9>4Mz6Z@+f;eqEzmSs+-O~Fleb7`yR0Y*+toKz4alud+c$x z>j`5lkp*n{iH@sCm{cY0=f_vCG1W&vG|lUg^H#fWivardS1-ozh1}N$TgQ&xRtew) zut6N4yVz(*zw=rp6LC;q4p>vA4?PsHd*>+X!qJrJXgQH8;hM)CMr8DRN}!G7$HJ5N z;t^y*Mosb<(g+&QAbSz7eUf0>c5nx1R+aCo+zLJ^O4cwOBv~;Z!VmLu@`@9*1NuXK zt!cosKMPO`Re-sGTHc9oJsKeVtec2fmHYs&{FBEyziL?X5OyJfFhAg}U!lc)gs{AcP3Z3AV!IGNy`~M6N_-xV- z`o6fFbta5Et`Vid$VIEnnf{d~ob9JF`ndD2dMjRPM+fRzDfv74j!5;^z*xKpa?2+R z3fiL#+$(I4ge$fzq>gJJlBV75CDL|K#yq#%#u~3H#4hm^9VCiHw;m#G(^7*eeg*n$&iZc$inVx#xW zXtAP09=82=mc;<7`5Q0%jo}4s-2t%Q2ln3BgS@peFk!y3^`=XDHTMTbo_K`@R`KxvS4O&+|*Tr&O0`<_~L6n0RhKRC&W8G03-yZ=qOc%wu;s`p!inLwkuv*x{OcsylcCbc38+$7#W;<&vINA2m&?d@Lgm}ivFnG34@ zAUnZ9D*{RkW}F0cZ63(IVTuc;HE-qs_gP^SWrVrbIel@Hx9U04nRkI_Dbe{IQg$I| z$)LT5%vr~~o17a`2+qRb{CgfJ;hzHTBNL*$d-tm|F0Rm#=4*nYlz-)D?u!2f3?zBx zZPOGmRISiq*dRnP6>TGw8Bz&>`@wRUn4LFPtn{7ZXslRRis9jeu=$MXp}v?7iqg=W zOUE~{d5nOeZTc0&kk>f|=Nm5z3=rsmp#eaW*?tvD0cAwbjQ`rB)8&8u=)isQMg;_( z5P*cIzi5SymupQsaMzsmOVVH|H=+{t^LoSTkcI&TDEF`vM{zAAq(DX3k_Ylf{2bf2 zWM;xRM`+90lz0SqV|4uzFHNnzm2a+A+-7`49jc%_+6AS{ET>u z_yeykb)a?;deuh2l-YHD+3U%v;xQHn0}M_b548!{qPM#zNjW*<~Nw6J4Q%Q=-6tCzdcXNgX1b!PM2}C~+Sa z(ts%Gwp@3bgJA(Kx4r1=1+v!Cl9c492DQY9Le^K;nRjq`^`61lriX3F-(WU0DsL}M|_Nh%c5M`W`~>d#Gy^9rhbv9T=4*emvftr)|-t~pp}><>!Ck=HfhL~}P% zOe1Qoeb{VAezh<-kLO}grq&ur6)DHXE7tS#A&Pl{`ipi@=PDJXBVvNG!eRakviNUB z`X_-uBk@S;wVFTU)jXOT9)g^*iULu)iFPa;O5$@H%@PQn%l|fZ+t7OBOO!$QxA}+s z!#(tNNsas2DJ1l*|7f5z)+>j;!9YXR%;8}@kayAm&S19^n6L0ux@v^J^qE>zW!euJ_L(KFEiR#Yf*_0-#*swPm8I@T+H29^z7gy@GJ}4V41#3V+g; z)IQ8hT4P_P2Qon*y&?FrGN6#BX*LrYlaS4NZ52KP_=mD^IFm z!Z&O=viWVSeI?_GG|^2LgUI7ohtUq}Jc-dKpS-CX(7_&b@!sOX$k$JO+Sdj3yhmYd z|4?12gOeh-zc`2nly=~jq_X^)8Dx}Q6{Jf11xIX0U7${^iG%Uo)Cau={>3LA`QPEr zmyWe(HZ{cT$Wct0jIoNo&jMy6eV`i=wQ^Cdg557i$tTk`&l~eN6<~RdN2$4BwEeOC zzqQj9_6hy=F<(@)bJ1r`KY!lTW8tEr)gSq2ICBVgvdy4`^6P8RaB`jUemI6+@lj~C z0d;dvT2Y8*;X19e*OB|t>N7mF6?}$8x5G1bDbk|I&I_y=H6fJkC-2up{h6JZG*=|@AE=WLv8(C`Q!_SHa=3mDal2$usN|&@ zG=+Y7k64THg745s#)W*v6If7iysj??b0M_8D3z`)Iz2xCW`eAM=xnY`aY%Yenqsjhbghe^OPz_wXR{MQlHEBAqw~C zT1s-gy(N_Cf9eqFG!&D2YBH>lq6*_dNk3Y@Lq`N35W-qzFU%s}Lh2!{A{v(5P?ERd z|Jz(k;=@docFDh#xBF8EMMpkq@T4pokXsZllD!Y-JsMD}LQA(|rst#kz1pbmS28GL zG7!OSfd{059s6;7b{bhoGJ2z9V`jKO`nSq`Z8xSC|Fdh(8-$kM+GE5XxeMhA zlwB&n-fuEo-~Yn+p{p)$N(H|-?WSy5+o<07lSPL(WXwt@K7iC5?#@Y=Ru5KOx~;l@ zinM0$=!}0(ZY}5mTRRbI->*nZtuMZ*Z;hd(&VzgV{kZ^g;eSgYYMxvvOgSrbDhP=F zeh5g5SS=`2BP@LG@OU#$BEt?$?zV9|%ni+@4EEGqZa7SKk2uG#Gu%rFz8a*W9qQb_ zrUK0iWye$)vE{IhESd=i>~xF|8pt_XZI=r8*gV#Gk#sAWOgA;v64P4<_I*Nh!^zR_ zS2ddw_tLbNAlg_;4yk|3PUA$Z(duFQl^OCnrQ5Dj)(X}qb7TMnZ4?W9!Eo?xg8gkP zdJ~c&!ST1Y4VfL-7Tk6Q?BkxF;cjZixL*mtB>~Mm`_4cH*^hvApauu>WZn09%QU)x z@;spp@C_RU#15|`lDCnL5&UR#h7Mp3e~|ksi*|i0*KSSUdh)J;kWL&dVxjrTNcw(l zp%d~$N9zwz#>4GlE8#7g!cCqtWzr`#-Z9zz*y` z)#2-038)Zf0HHvbSOL~+`yTqjHQ22M8*#8AM|}o8l96}F{=;mFb8NaAFAu+5cwJty zQb&g10HMySRyptZ?#te9s@V>)1qzptA%_fHm#&H(LGQ);oRo@HtxM58lQg@dDG^<% z^{Of{PlAcG)>Nkftfa>)Q3`={zXoag z=u~$)IO-T4!KyaL`Dm^~5ypjeIAfgt<*k*om)J&%?8=qrBCaF{u@k$Sq& z%&f}~YYW~nb`|9dJIgtXmw0~vM&vAmyONlK=cKwSd&vtP9XtKfd3Q-MuG+10r+QqS zxY!31QFhbv=?_+YusRcrOat)_WE35JvwXv|w*h0%7ow@>)GT-$r@PivyMXZ7u`CU?&7gbm1#G=3&S_?CD! zHDa_B6V-?SeLnX+Ytfgz;1{KrA4+7!BaF9vICQ+yleKd4@JQE%lIK z1SBK~YWlEmqJvs2?(Z1FVlC&gg}_M+tr!g93c5FGY^~!iH~Gx1aYk4;eC?kY!X|!<#55=XI_MxD;$2y8;UUIP{89@@&(ty}Aj!tu6OVPk)QE z@O!n$-?szk!s)Nd4nW`m{M^z)ogeOwwM5nV+&dw1cI0Rk1u5B(0ZaM=6exfETQ8E* zd0jJ0$ZM8Uk~CZfD^z$mxsy>h1Y7;K&&nYbcWG9}RpAttvF_2j(cu6f;d+AS&|ZlG zrX$WEA<{@c#igNkvORA|1Ao(zy^xJJ?H5S-!IaJFo$9G&39uq8K%@IXscsq$XX~J6 z%rf8$5kClaI_N+-#N$v4i6oMxrYy>DoQMx*-YZnH+sU6$K~jr9k`FD1dRp=7QN9MsI_Pt z74NkN!;L6qupI_FwsK*Ml#l6eN(W9pBE*6vb2L(}LvV z(DykquLPRPGP`39_p~)-V%}a>cI8J;qJ3UX9}S}1p1mh*DM#DhC_nq?ullB9^@ng3 zU)VLQkD#P^xK+FWTgUH2hdr^Sil$({w!YJ<#XmA4B2c83+I8Ylen)BK5Uy*qs}=U> zWuJ5t?mbc`C-{f`XXoFhPDLJ-nhfH3mMXq(z%%)N({icO4WEpD-p^7DBp6k(x2*sMJ69&kIBr z7|7mpX{lv*(v;#eO<>vJCP=#%Z+XTeVK0*VQz?}sn8j(Rqpz`}#H%Vu*9ec5j;M)R z+65u%Ab63|ER|Q=>z+Gj%C0|1uRBXP=Z%U$KX50m|ml_`TFiYXfYCn776a~3ku5qRAy z*E!j1mFcK0Q3|Ay>%5hXS!j8n27V-P5dnU*6Z|-3SKQ;^{=uR;l+X*bByff3hUu`RdJHIQA_9iq~g z@oQILV8mNRIWwjy{ie@cU^VdvZhO9d;F76H zTy|5*aSJ1MD=L08zmhNdeq8Z9deDTf2sAer0Yz9&^~>Y8bSG+ON9iNCIGh@(5J*` z>1@BeeE9PMfoM29qehErJNnKHPR;RN)pAtDcFB<49gih-U3h4dt!&-KL}(|=J00HOf+3jitMKPMRwapFNMy}9cMSgMRPx2*%00#FgWy(yR4 zf59LxLdtG@SL^zwKi6iHWbmE{CBJCq0KrWP3CX>BQy&j5${>#z;P!zsR-R{^*V$4@v2J3r0#q+yofrr|S~nlePh3ak6}_~8|qC^MzEna5UrB|)qAot?%9 zhKl8wqIn5UMLEr2O=_S_B#uv}nFc zww5!}0rpjL!;Ge}+={G8Lou7xc3lXb^w)>-bcFTVvzj#|=`JB4`S0=>;>ZRKDF%w| z<0BQ#Y_Y6hX1F{csoWj^Vgj&^1+dU{Z!aM7>lXBib^)Mu$CMXb$?C9?$25+3+dIJm zn*OccvlR``v9%q}FdGAZ22r=COj4J&_V{dGQ0x zG_hDS$mV6tn5vVOoxxR4TCCn8ojoC`chl?mIZ>avyT#ikHzfX?QpwoKxSdrS$`vDA zsH{`7lupXP3mAu%Hu{CH1?er z`0!rts+4vHcorwv+YJAhQSBXY&^_5PJqF^zn>nVLadMZ*CNMNAhWHq0ySA3b)L9c? zSbRCLnMC{6xm_C}sgBSAJyUA68w8v5W4PZ^dRx)~o%4v0HlY_1zz9f3$0+Qyy)D zm!_a&xsYk~NmgiS%4TNG6h0FSPA|&K^T`RsHGuILzc6-+gavKb9A#hFw^~7ye|Yi) z`+wl;p0mWNRy8h&Iii2m*Du9lo;=5RhPXZH5{XJ}Da{D)Wp`UZ4`;lxu&gHOtBEFP zh6%$JODSf4hPEZ8wFf&N_I+sBh;HSU0(X01kqeg) z(O})l?`Qn;haN=5aNT{qn-^d18A{Ag5Q28mB@rJ>n<;h@oVqKKh|Ixa{?WYBR)KVt z_#`m9#7;Zqq6y8r-{)7Fuvz10IgeYSxk}zMt|JM)_;TEXvkpc1DH_ zw9sZn66%lpHX{Ezp?^I8`L{~=yVi6O`es<1!oZMpi?#}J79!S&kfo3*G_Ql%NVHX| zFwlTm=1|LbCWRjD-|?#HIYb2F*?!^UtZj5AbnEeL=5r7%kli<9TKe|#own;RmpQG${9VU&Ttc0lz2#GmFD7v^vCOM`}qb z8~gniA`a8{`;Fl$=|1+_Oa>zP>dCQY@%T9UwuoJ|%W~j5u*#=NvM~s8{_aQ7sef_Q z1B3qx&9NYn;hP*FRyx8O+bHFLsPcy%UzP%j%V^vcqK>t2F8vjU#L;>iOn+r_a~+a0 z8WjaG^|F^Iymu32H?eqvoGO2zsVC82UhS4H9??GFvIw+|Buf&%5+_MtgHKmK98-~^ z^3WG1(ty=mtEXcz^ueX{_dLD7acy#*7gTvn@oqG>HD5Wr;2hXZObj2yc*g$q zr48En)6lwP1vx2-U>j;;3)v$c`Hp_jtJkON(1&Xf@)WmSHlQ<7$a$RfqG@xEb# zg8f1{$ld-*#j7lL+Ht{hGK7S-)p2Cf=EAXhG_I37#7~ZR_!eZ~uCqn$>CF9)IM9d6)*lvR1(A~ zY+XWLY-nluh-%*Ez(p!b^x;bfM4U@zzDY$~<>y1sAVMiYbL7%+y~n73%+V?{O?kg2 z(?w=@9iNWF{9fXZT{;*N+f8*$pl}WlR%X2@f67GV)An{ZTX7Z(lCq1BCrPRF%W7>f zi@Iqg>A{w;M0Ozk(N$QDa*dnF&#JZDv+xPDOYwHy+On}TaaM>(B!V9$M~|6b7&+;@ zD@q7NuNB=^$I0q9AjtGIl$Wwx01*M#JPlY>OY;Tg z4>WW?WO9OHgq$fj!Ek|y?S9fFb%VVnhkY>Fv7Ly4XHu-xhy_nU9ZD^rDn7ob4BHBdl;hCDuKzHJ$d5Eu_Tt@CM;ez#Hi6C)hSJD z`L?FLih~8HquUf(K@EbXR?(@eQ=gh5!hW0d%sJg z&2Vi!LCCIUmfS2U8Eo!@75@!^!(%pDPL~b`GdrCjuOv*am|i>dlS9gGt6ff*6Otb- zjDtaft{X2GHM1QlLuKb0BDR!>quxk9xz@F+yxybZ>=zt%%=%yf)WvCk^53H}Mc&?C zuO=jK^Le1bTL*kUcwU)L?e&2V`J21IxUvHHa<7=wE9nUU9@bs~2a~{KZ?FIOhXNh` zt2}x5)zKdOiZ{HXQVn7SI&Y+s)+VQW(qfbLe*;DMc+#YJb?s-gGyA459txuiFz*IV zu!###?hB2pdDAu82kkM;r+!Hh;iNugQ@X{GB$oMWvFl=83|(mltI7rWTADXOWF!cb+48+p50Su&Vz?Z_rdK$4;d7UWD9=u!wBn73V*tJV@)oPe%`#haQXR zE1zBQ=W^!rps&${3Y;)<)QeM=p4dnFy|@|}{VQnA*nl3hzW&R{pY6Y}*oQJ^IbS`j zLMeAN!J3=4TeL>h^q3hHjwITz3-s)ye|h`XtHa4S+17BTEx6?lS4n&oCt(b1bs<$c zWB$pXBmE{zPt#1=2-AhkH?VLl6|SXgLjujQ{11{K!Nq4F*CuB#8eN@3i*H{Rx=uc* z!nU_c--_Z`vcWtb=h%|XR%*-&HN^*K_$52Ha~bPPq^WH?QyslKe4zi$p;FW zkGAD^!9}N|;h{4!1MHJDzW1o4OOs+cW1M#SP4zvP82uq>CpT!Szft^Z6yiz*cJ-w_ z+a1*w0N%>h!W!s&odoo(Kgu8Q*dX%U-6{`+O1w!r5&%y8t7Fd_k_NCLOzgb9m!z6! zf$ers8qhFV7$~(}r6hGsxdYq%!FrE&+0A4H2Da;j2^P#44F$FfGw?na7ufEc?-R*J zqW16z@U*Q+IV!UxWPnFS#IXy}K!6`m-6B+XAANmX6+i>%z+6=|AkqW%1;hsTh7m4* zFGL5L1Bg4w0xyq`c4W`8Ob-$tX<9=6Q08@rd?hP;_&aCIcLwUpu5J=g7CnaumqV29 zdzQDqW%1f-SDr`l8brTWoSo$G$a&{^!SANV?pE6nK_C3H(&=}^M4%kXl=!)_D?tt! zB<7zz!!}_8TGrbZhQ4UMA}=B?KgPAPxqtpd?4`RY=}GqZUqd3&(D*uU=@bnSwP@lf z%H@31pLH3&e8CCp`hH_18QMt{CHi=CuFZ{q^jK|qi=oz*Oi}e!!s!r;lfM{YW;;b! zj?8nt{yaFyl)S%c?YK)m2X9y(#>E4feDEw(FX!E1tnWxg*e|$_>!C z_^=pC$&RIK++nzm3;O(3$VRu>;fuxW zypv`(Y0)El+_G`flndc)2NVbZ#M&+SKN%YU-xKh-08ESkG97ToF7;e`duanO{AYlM z0UT>U3WWo3>a_zrjrRJKy&Ki&hqRK|D&M9AKCz0BubHURxb3z5AyakANQUq0I@6ml zGR-R5AF(C}zxBxa5)h7ZGTAaIC44~`6Dn@D&ZQ^f;dDa#Ow??@lbsw47GQQSc<^4r z)ipwjjsvv;9#LPiXB|6nAxw5?kT0;({1;&n;`^ZLyKk&NBZ63WB%VKpoK>d}njHmxA~ zWuDUVd5fP}j$wz$=wA)aEj z5dPj&3yY>}&RxtlQH_8`I)&BWL@hZMvZVb(R#?fOZc;#qyHD z$zoKTsv}1F{&wFF(mVDAyra|<3Jsv%|-aVhh@wF(sW~n5<)zL1&GQbFaCeyRem1kTpmkY28T}mFU0a5%s zJtMp?&@}Gsijf11G|FF>$*gz1X9TMc z+B)oOI7Kb$UF6+xybq+Bz?0JIi>c+d3JsDx?JTfbNSNYQ{o{h z<_QsAwp3x-#5_uSqh4v`(=9^OdLuk@w0J4y+KafEIJZAA)nc7U{bP_XZpZ5@d8((+ zy85piV+hjK|MZvnrE^J*;*U6!@7r(<**@rR%=;xp|Q#&khR!U9tlK`oy>?>;xWJx-EOYR5Ne0vRCBl>P>Mx*590P|eN9PvSk zA=Pb-_^y<1$DUw5d3sFA=&CpaI5zua^jZs?R>m@|3iGcO=gw{S#n!*QkwmPSCEv4K zN-t^JNGq2%&a+2eCU_)2{Es$$ybSpf-JT25NVs+4?qGoCw|g@$BJatxeC zbo_3zb_S4o+?^4k{-;leTXClbT*5 zRx~wvuvnxO(w}4!K|X%zyL+8>f|M*X(wGr7=o7aE3HYvyikY$)ij<{_`h!|C?z?b4 z0NxFpQLk()0HX)2lK|_u*D2%*|CRe@zT+D>1+cUL^5N0C0l+W>4zXSb!zZyRThD~e zbp?w95O`gV2pD_5lKFtz?6Dq~tLZsaSMV5GMV#<1b}COxz}%{oR5&U|ear*XAH&CD zMRn(y_E5Y!4wYP3ty>q5O_S4YB|Tl;EBo62&`PV!Pk;DO5AY`lBgS7(b;c(*5O+v@c;gm9>fp5M%rHi3jL=HKtT7J(bW$4*}Ou!N3S3`;Io+%_&>N; zpEDoMa%%Cxb`bv2fn+qs$v@tm^`tRLmxa@6wxudI7G`G{115oJCw-Sb2dw@n6gFu$ zmW~;4TubOuXzq8ra>?ftiw@$LNwEZ-%yd@@DTNe*dH!sQ^#(Aeiwgnn-Om zQ{A#bq)SHd4D_cLda;-)%t=dU2yY3#{gt7XHFj$g_CGeYjr(&XW#v&(_@}1qrzG;a zupI73Rq1mkruX|dya&c?IsvHalN*F`KZP*<_7=5L^Pn;NHK1Hg9PTD;&c>{ws`QcQ z4Y)4SX^cG6dE!|LjWtww&y4lYc;83a{~Ysg=v%ij)IbYv%x}IheHL)NR@+wG&^@=1 z82=5@ChAJB?9NA?Sod|U?s{*Ol^plQ9rO3YSfVPASl<`bXZ4A%=z+>Mt3bL?H1 zYQWYg0@@fJsmZzq$;*jl5wy&mg2~)=4tfXYSMlr|lK1czn|CywDj(#Lpit_ zSr!o*owg-dY{b7He%JD)Ow$Nmvf!-NG9#Rj_?urRRd6uRudKOC%rwbwrCG3K;7%>* z)Pta`?a#XP=KvHg^zCz^3o;>mS6&9;cU#J!0$~(u%ZYxsepRSyKBBat!=4LD`$f!d zcU0qn0kCYpFerY-fMiPp;ri0&)2#m`Dr!; zxAjj=9*u%>6}m2;mQynd!vxMj3WL@Dv~P!kE}6QpsgP9P)kna)Ni|DPZ_oJ`|FA}p z=9>M{Ne69-A%RN>-}c{>^gpp4l8}e6ZoY)-NS2njPkMFGLTJj{iO@1j->(Ow;IjMV z{RN1LueHB@?!u!N=r0P0TzgD*k%(-4I(39SLjH7mflVwC2Q6_e>dpO#!v1iI=c+5! z%NZN=Vw{;d6ymUavrRhA=``F<6Q5W-t3%SChh!r? z5^kS3sIG_l7<<~k=BG z@eCT`)*d^}T`_oMP3y^rrjIB@AW0HS+7#cFy(Q%Kz0!*34;%M5$Ccz)DR=nO_p8hj zrT)6&%q5?q+Q#j%NTJyiJFEDX5}ymQuW25;J+TVgnC|=9*dQ8w7QR;5SnVy(Z`EAXMP@XNmzZ*r3bzcn^XjjgtOx}Bh>HDsp+ z>uHZ(GL9~bsT=30%@a5b^tjQdTpIZ><|fYyhV4w;#D&DM#?R}n6ys~mfxc#Xr6E8l zY{4D(`}m7a0TtqlA);kxN32rgjl4EIV=2X9q-%Kjec@HPEFC2-16SSPd6p>K6w?YC zxV3HDK=fj%CTUy@h-gwO!Ng}q2BttCH~ZQBj(RIH>tch`zP4q`0ok zylR|=I_wA}UaasYd-6!nPI{0yIT)Qy%@Ji-^dgv1KZ^?uOjT&{xsOEH9y?JVS?kTu zGH%;K>jcLTvCEdEQKl~}Ihlj(^A}Uw;5~C^Rt}(RU5B0>QYa(O2G)KF_-T&a( z%H5JTag!bsKi{xp3Y4rpgo1Xe3R~R-{=G6GfVL6<9sb)?0<0K7ju1eQ|9`FuH-Si2H}e;P z`Jp71Ys;1+c-;_=msp5d`r5%!nf;1~is6#+sUERF6iY1phf>$Aw;ncm&Yj~zK7z*d zxRusL13`fw%0&5Ww=NcDIf`6|_N5qU1!KJZehw&)%xuSM7mDdTGEGZ*-K!#@!e7L}R*!t@l_l1}bP$Bj1e@l8CX@WV%2ReYLeqZk+Z#gjvvE%yV17k9w=U>CQ&2F7W-^srx z5IWmsGaBJx#i$J|aMw8b@gFgTsqX2MRl9vrke-r<62?!tX(7CHr;ZYg2FU5(Yf&g` zq(0JNdGxV{>|!>g`(JuHm60XW5;wR!*6S7%Z9dYuAv$*PCt(lI3$-v(Q5qUt<$v6@ zB(GDAc~YC+j+bHn-pC2*GJ7ahbn^Ql)R6s!k@-@{9KEIJJEpXY0B?slD)NI{+@NCD zCu67jn}6f3?w7%|_sSVhGax*)P4r|bx@vT&KOC3L*-3jKTW1*GqbImt6td@f-uD@A zPlA+&6er)jQkk3`WJyiADWY^q4*d|O?qD2w%LGHHF1uTtaA<;VX*Sz~0{c9v>{msf z(AWUd-{OFGVmF`&^Y#Ls1Mq7U2LP`W0;HGYDgT0pUX1_G>N!9f`tPcvFKi7ujF?au z$>&O z_0B*0e^-BsSMcoequ80ydjYF0<$%d>;KKiYvcE1F_$N&D1{t@q#_<#<;c+i|H0*y@ zJ5YJncn)Qk63E0^!`_rie<2IHJU-@q@E3TO=}uM~(sS(Xd*n%*-L3Rhoel3+NS1~1 zx83=y54%}g2af=Gi7Gt0=@(ZCKXFI|PGJl|NziF+1-(){t3JWhSq5*ohHrr0&PgPu z7V=BDA`IEc{W2WA7>5@{T3Mln{+1!oiv6_`b$e!LC+ zJd^P_?6@oR0GUzkXpE$dBP7`BU3 zYBURCKn(ffq#gV_$A@^2uST0|BozOl7y;%Ox1iA_AWzfbcm~0F=lk~`-d-8i)^|kC zYQW*swongV2VgW%W8sG{J+ohmx!+gOMP$QS?W*I-M?&7z>n2Y>e&S|Zs(l({+R@33 z(zUVEUs|jODYdOTegQtb5y-E2ys!@li$_Ctxm4o7F$ZBRu7JmtxB`^QqZ|Cz%n1wB znm*fw#f9)y$?6CbLTBTNVJyhnTH)-uYb3Fg3BpWERCEsC@7_3R?`^DeXkfyu6A);` z59+hq$OKdQu? z6sxTylgNkoPm`-D$;me-MX6^CqoyVaAqgRa&)}BMZk=d38fREx$ex@XC2Q1hKPriE9?wXosKmc5+TAuH>ma}X#(9C6;n@a9Hs zVKxn+`n?dVXJy_KS&pN(7Q$$MvPS)5-igmiKfzFjHs?$TllflwtG^D}EkrwHOCYZorPL*;#vQB_ScmrcF0w0hRw5O?XP!XZj!Ormh3bQu~aD?J>8 zTv?W^GM~;W0jKPAj)09H4qpk+-sOewMfn|r zlsvp8=$hP*l|e@7!OQeU2`7&aW$Bdu!#g-PkF%-CaOrd7J*gCiVZ+ z_0?fbz5m~INl3TSGGsKP6v@%jF}iz5BOre02I&}GqniyBK|;D~AR&m9D2O6qfWI^R zK7T%N@ek)3_c_;jbHC$$#j0A((N!;cjw9LqIa%96FHQF!Ui0V(I(#vGB!BMbTj`Uc zikswe)EqdLcwXDmrNM^E&%@{VUrlrd{gN!ePr6Trm;5~g*YGUPHf+CDHX@d!rP`m+ zTw##=)9t*P6z!V43Xfm9VU9HQ3D__N1lbn5}Z_UZ~&)qavaM{Q&Gurm>-?v zkOhcA&8}?Tvx5c1_tI?=)n9892c!5P03Wtm%Q7HMBDVdGuikr##Og7 zzy=o-ZSnNT4>?5*NrI|Q<+XUR=iUg+OAmoBcRH30j{XP^<+H#VpxrGh$U&*vQHT zq`$^{*Z3L7m*e9EqYrW+YntouL4j`doLI3LgqA!nVkwq)#9)+@$g-+7yQM9_yYj(u za&sD}nZH41yvMQaVV(%%t%kc|kC@YwUne{TE_8P+ zNPoO}Uu60%TqUxfS4J8CNZ*UjAbGctV$7w4(tB4K+F{kuljIdpX5bnikT`Ft{lTP~ zd;NLNYqlQy%qEGFYsxW)6nY^=aB`;hR9ajJbs*U;%haokJC1Ej-uIlOeFW2qC?h0V zKgTh(byO61JL+16 zNXDi`LjBH7p+%(GU2UWBKQD%Db3oy+4Ussgw@au%Yiq$DrU~^4x`uZ8b#q9ico* z*SuKkY2=+~r&}pRLze=Up%d;7ve0*Psf0U}7bSQ1H#s9XFeLmeu-8c?C7%^q77IiJ z%UzO)&9>7VWguTV?gWYrg4$L8a~J=$m9J@^GkfM?J%!7Cg_6P4dbnKYm8VWeJDb}- z^|ep8>5nJCwdZoJwvuZY$YNr1E?3~0=}9PH?jwM+M2qU_4&oLU+HS@?lTikr+#YRM z4!IzYcl4ORtHITuNrkm!tb8LUP9vlezn{2WOly&SiO-h@vWl8j6JBOli`!{&`(QVn|fCE6+Ia^q*^qkg8Rxp9;HtA%xXx?5<*tlr6d7Dlq`NXDbA z%lkXS(&5yS;f#4?@@Gl^9E*;9_sY zxooLq;~BiXDG`8!G;v4)xGl|z&fY99-i$Br`?9E^7H4FFXKW(ST7cRnA7)I0qsSim zF@rx+@@|uRm*3@xECn4$Z4w6oCu9E;Kf`*NV1SMT&?Eph9P5jhQ%~dmNAm}M3v?Mb zGOagTPRG?+jPzRIflNnA$9g0G+ZcQSCk7?`Whu!o*_FJ-rbPsCW{_HC$pWz>OU-53 zAyw`94=^$agxxczZ!Sq>S|ON(DKB$WC<23sF$UH8AEk}4oU%x&aVg)9!sxAd3ZEDy^5^8WDOQGN00< zIS!YNA8QJ_xInYpa$3+wIxlIx2A^oo*Xr#pH?NU4a=Tlr1_njPS~%d0O?ALmyDAOnw$SZY<2#RFOvHCoccJv6WkwWQphFn1(w!>h4${o^II$U zsBx6?KIxg%yL7}HJ#)w1@Q67mBM;uJiCOJ0-sQC2%m1*x>O3Y2B53*Ua!^j*nmt@l z6at&R%2gxvOYm}^lS<1Jdnb-Nu`yA>?Y-UF@i+Wm_BWIehh(@R74vVO;86X+!ND`| zMopP574QZo+O_34R;@_}rNY`7J<$}lXH>Q*9atuv|I!*Lh#Y>(@HE>795nVA&nz0v z<%)=9ABKL z7^RHsTI`yO+%2PlvZH5DV$tdS@`i)T2x<=L`QP;TEQ4z7sPv{_HHxq2=aAYgKG4z=A7^ zpU7rwxd$Ox9`{qm*Mjb~2#Nhf@1mhti;Uw?op$~v%pdBybQoL15S8; zHio2ubywX=-MM*qMRc(CC4~KwkfC{+vcl`VTs!_pIb!d72&JYxcFPd=Z0G#N>^B*3he| z0I`x%)60Uqn;}5@U&SrH_BRzN7o<)}uqWA)c>LvSx9?EMtZPh$k9yp3GkyCiCx1^4 zDSqru!ZAzF5uOtB9*>uD((JD{BqLnSS8v`_b!Cm|ay3h3miFv^i>I~w_}q3{U4&AS zQQ6QY3LgI}Ui7%rIA81@ZFH0RV6pSpRB-W&^T){h+#E!@ck*AbT<)BcnF(1tu0oOw z`5(C`!6=1J(>rB_pV9G$GhgQ!)0jSN?<`L0Z~lrF_{>ZioSNDM-m;21hF@mB`lApn zMCGPtCD0`QNd1xroRHDpt5IWByhX{?ta!5lLY2OlEYK*k7gQZI=5_79e*gv&JBj>?QBXmgj>F=)rm%gG^JWq);$qr zYYB@3i6=;AqbXrZruQOPSgGq%++cR6bs9AVvhUQ2sOljU#bcxQ`L)q+BknAtG-i`E%wIjoa2GC7NPRV$zTTL1j2 zKeTkk`_M2shjw4FA=H8dnA5yJ#wu6ze7%t^F$dUYfL?4EL(dT~c~ble3=eOve#R=E zc-UYe6ZfPdVqaF4gfobeL^DSGF>BXGn?LfXs z(n(*<+6F$I^cAxw={(?U76ro#zqZgV!2Zz}*dNf0`KjmaeTA%2^)!FZ^jECBmfaH_ z-9~>_KKuFE994d9>fCO1XrbB~;8WQxLti4%u&=$2^~L(x7=Df4-7aI-MJiQH$1-SjQP77E7)X$XB|W;6^*Q=sNT$cZTFNQQ*;^ts{smV0^MC9H zcrWlqv2z)$j>pea^Q+$%*ff7bqXH5+_yu;Rf+ZPZ9~9Uh>T!#=+)cGenPBVLn29uX z^1}!=i^M2?_SY(R6Ymm3EsuN9W)5xm;j+K%pNp`E6MSu)IeBW@TOKF~vT*$*%mMRz zWN)`T=b{2BkCvDE)>}6_clrBysR2Ufb8K?AH+;f2z)aR91U>@M!r$MQuf!REQjp(& zUzHN493vhSpEkBnIsR0EebqT8@NlE~%RYV_l%gTyRO+#?lQ1tXm1Rrp1G{D|w;#it zTQ~6}t^%AeWV%UcI4RXIN0uruG5Kmr&*w;^Nxa(%c)k}Xpfv^CN%g)LfakRxzi%mw zkn?Wa^0&U1?!4unM^yq0SFwsM|Ln2=?__`kf<**jrILSN{*#RR-#NrOAknl6`~dY3 zz(;x_8(Q_YD*2+=WH`EM%XK2-#6UEU&(q~0@-cyj@%>R6X?+HhFN9pO>*LD|!rG zW5|VP$n|$ZdO>wZ7RE!Mcn9WK!iwN3W(F1=S~$CByNYDytMi%*r#?T?m)xsVYHXyk zDVU=~%<$lklf$QA0UNQ|)N2d>NrfpRtK8A~FO~Beclv!grry-ava-D6#oty8pFY7F zK?6v=8ma^IrsVujO1P!RzO%&@}@!Ae@$1t9<3c3RmDs zHhs^4U|aLiCI~~ngAD2b*g#(pEx&)>B3cWJ6UBE_MC|_SHc9`!f|cf_m}S3j-XcM9 z)*)Wz?`~Zbyo+ZOzH*FmY92-ia{uM-s~&(S-ge%QKq_CHDIt*@#SXkfxto+}^R(p& z`ai0KU*^qO!-myrbXrFfwVe3UY&L{yMKx#aiT9Xgq0UjDuO4p8gklVYk97&1CGZ22g=NHR$^3y-MeGeLtGZY1s1~$bZC^|sCi$Uy^J%xR( zG|ZERGk~5p0`DyO)qrppW$AAp_eTMmWs+z6$1gp8$V|tHa4}I!9d#iTb0?Q%roJ)_B!Xurg`$CPl z{o9LDvSV&@{Wm}5s&744<@}6y7})V#q^f4^cj?EF{vR!6O2wiXJeu%kM$2b3{?MOO z2OqY)-rcSaBC&xn^b?SviuB8uZay-m{fJdUiQz zyydn!X(%q9J@@Zu-nv4Y5WhW|5G8bL0KQd&^^|ME1r25Eack>U!)TH-X!bOH&j3=(p+2*o_eRQ>Xxc=gi zjBxntq{OFi!X14Cj39wxA%r9JVnjB6M8k0NZ`c;w;l~9=*9YYTf0K({IX%>iEcaW` zoxf$96~#-Ng8!ouRD$wcmeP7ZG(9OxKHH-@&Sem$8=ACC5qWa?G-#biU=R1#PSfY) zWfbS>dy@eTl0Nf_SxjP7D0U+>l2B3Mfmndh8rh1q%ytBTQ!i3ou$`5c_?AE5QZ_IR z$~5Q4+V^)72H!wwYKbX4H&M}a7P{{;USipk6m*O1gkMQ9FUZ^o)FUfbVz#iqd=Fp=fhIMyXq&>&-#Z3QeU&3q{O($ys*yt z(A9c$T$7q?yTeC#;El^UiB~<8tz8wP&~%RLR9Z#taSwx5$`p>DUgcG`9QgX`d|EX~ zzOYd<+s-ZPNL*#^-Vlr`>gwuhkhL*JFyty6neP;kXBA^+mCNC?Y&H4c zt@^gp=EepaM2@kAacP$i^~-(-&pZRwwwgV1kH=1uq%#6`^H~=Da9R~;~0&vbb`QbXEVfw;ni@2f0NBb5_0=s*D<90}Gj;deIuZ!Ue6?O}@ zD)U(NXIFPNTY}>}K@{6XodRS{26f&!K5*z`bvBq&7;lwBEIFNb7 zzI0j;>4JB7B_}iaXsrdCeGd;|m8OJOiIK)`RbbC^ zw2&#XQ;44@k9=9hJ|3nSJP)t#u1a@8=0JiNy-b&TD-DlEU|DuKI^7m?Jwtt zNkcals$-%iBY)x7AgiM`smv~rp$?DI;tL4aRo-hMpWXQn9ia7mX>R9=S#d$|TLwJ6 zMX+W>!^w?FHP-onZ#jCejK%oi`bp#<*hO;Pl*j`ybX7`I<^zh}NA5n2LIH#MJIpN_k7h27lN3Rne1Uy75L{}si>%hlR=*RWHMsqNM$0Vn^GWa$n^!gvavzvacDsGM`1bbLs^8Or*{s=8j;D(>NGmFa5 z&fo1~kZkhs+C$&=1LcSwc03^huo_HP434RmY4e#27DTmy9`@79W820OI5GZp4)wQC z#>l@3Y%TO=oULQ|Q&~DjXVT`*NUjW#(8}M^`7gY)wLyRQ7}6_wR@Uf+B5dfCXw`-d zL`5Y6^hf9y#AwXFC+n!A^@OYg#@ece8a9ok4s&=LDD`-ar>R-`U&CVR$M`7ZL*S8Dl|EQQ$;H84Q$fzftyKqP1A<6T&RuzHdR41vF z2iNo2Ii)Hyrl(UU*Qs?GRICasAF3LrZ1YNv2gdtl3ZNNa5dve4u*3PVV86?!D>Ixp zaI?-CFmu3HeZnq}+;Ch9*~!=)_ZLkyy#;Tz_I2I9?djg_zm;3MYt-P{O+bIhIxFL~ z5Zxv64zXy3GaC6gFhDuPg8ejXkvbsXN$JkVLii-%?ZxUf^ZIXXfmX*flN@gFZ@@-!y*Ib7DBz z$W;t(Hob4e=W$Gd@|$xC#Mx-syDx7U1ClF`3+SH$HSWTescXCX!Tkh0D_yhU!2Yc< z_tIcAm;JleayFlK70=}EsYl^d2+n?RXPsY9z13cx_N?pXBT1`vymhMBc2~X0z_D0y zv9HqA`)8-aF9MS;&rl5U2cayO^n(S{ni)xspn4Eoyg<*kKmLR$CM>Q_rCrSa=^w}2 zh}z^M&L7{({g0Ir!tKPRBW#)xUv?$(YQ$+dd|EWs$4*Rx&GtN3YRBibyLZ>AYXbxM zXFbVvpAXW|`>R&S%!1+j;6lF=6KgxL!C7(TUe)i#WK=_3QEQfw&!?2OE)6SJvOl7) zvXZk-qPCmU$hyKm>ZpEUs_VJ=R{_Lh04ykP2MwR{2@as+-*?NgN=s#N87w&o%Vcm| z%I6JCwjHK&-O~cZNz8U9^)s@c)|7xdQ=X!?9zG@Y;<5+>LTo?C;zqsp|3O2sHug8x zxy!GFL#_S|;{NGW17V121jv0@=!fCL1Ga=L_+~v$xsEP#R+{r*O3pgU()^Nx*?Y&& z`fMb9F{qk=u%zxoG#vAHTmWKEi5Q*8Di)A+sGD7{er zMWUseoqH_$Cgh$4Y5anId?yOQI}Z&xy*3!~HKjL9;soW&Lux;&TC~QFyOcenmsV@w!gVL&<|@t5&0)&o+&^rWzfQS%!iP8lT4OM#Y0@6E5S3nTyy>|pr zKu|;x6>P6;(D!S*d(M96{QliJ!!YH}otax^?vy9SE-q#O82H;w45;azM!kYQse-sc z0oQ%-Zoa1(V2#?-e*i${{Rj9l$oRD8Kiz3f5Gkds>Z(pJaq_=8vOk!(NC1{@UapeH zJ}wAPH@wAf{0Loyw3L*zlsr=Y6dj2C53mSE-2wzaNjXRZ;XdM2G7bRf005CKN9R$| zvS95IRvKXKQGFT{Y-zRjs5_1QGjKr2Ix+zO1V9VxF*G}34fI5u5ZZ}8TZ%d(LS@3* zl=xSQyQ*ItJq*iBw=Ns%i3mVxtjI|N1<+8Q2s*3|PbB8r|}{GB!h%0qw1`T=B%vYEQ)}; z;g7rIKW{VIYNKm1xN;rGxHAfS*>G53{7F`oUwE2V1kh^SgH z;CM=sLRbNhXtAJs@oTq&ouGgDGrvIq5DDbe6}sh?{~zAjD%0uz?a{77q5zsi%Rz5` zZ7jbgmVeMk{LF6(4*?{eqOs!rSlK~e6>UF_K|cfC4D;a(o6!~?XlkC8r8WykRHBbQ4o4B$nq$r7_raVa4Tw|G@XHF#Rm%ceS>aG!NC^F}9NQ1Koe2 zI*pC|5g#-F5WN?K?-r-+-tvy}DHqWZO&9dLo?5b{I9%8KJnveMV#PhPiEmqZzG1&d zjsSpvmtt%*PZX=qkVr*g7^P@cX>qJ*b#3FA^r(2#-@#rjNuH@hB2qC_b@Qwq@eT9q zdCe$ok^DcMo>1J$`=e1LrXomEOu^;^Cm|(C@rX!eX)5KvGmcJR7RfbD&ooU>3Qzsy zM^0k~f$2kWQyEn=l04&_E@k>JXA(#Pd^sy*^^yN-YslJC!V87O&42R_|I{1+L(<9L z>X?p?MeY=a(_uvZF!*oH(e#E7rf}+}^6NK>kI#@=kTw3SG5OhilF4bBnK1dqbNa}} z_=~wQ6V42EWfpg;GV?emTmWIU_20eIziCb?uShDdVj`bnD&*fZM>zJCLgJQXs(@Rn za89OsTkg9z1(I)zY5!Am?4qMwqZ3_Ya)o1y|2zLrCH$x6X#4OFV#P_C)Bhiu(~aa* zCuvioxc;o{BiX7F(saoF$wQca!2n*_?nS=l z;k6BpI%?Fd3#mN){AWnh9uz2I184_9oa10leKL~fojToFzz_}^XFOdkNDe(Ci)K_s zGiv@x{?9^ALo(TEGFj6<6BuyX(6l*dTK4a@x*1fvWi-*Uq?P1g~%HJqb>c< zfGG-O{ExOsBSOm>qRkEe=Pmtz4F8`3|4#~#L>xp*`eViv@rZ$m3LxO_W_Kz=cS@G% zpnD)2$gM%Yp~EbDHuuawwS%O5hol0Pv*oaQ*|P;_Cd1wSX$b;$LF_7|yjh54E~#MW z*+1l()R8F-`f}K8gd14aG{UV%);{&^%>tbPhyddV`k#F&v1A4Sg+vD{0N7AS zbpioIC#zfv0LXN5WBEC06KDD!-R8qM%HvoA+yY_c*vVH%W9-Jx#jNU2+EFsGGNSo9aIh* z|D-Y-L7LXxz^1Z>B(jsAl3mVKPn_1obx03D@B`g16*9MjNK=1#RrP~WZ}HJjq*>a~ z40k1K(=u}>rdT+)yt-X-bVhcP(QwurH}8MNmDEJJTXpqbyQHikoV0$OX0qhIjv-lK z)o0NtAR!^8ttd9yNjMtCNsQ(r{%Xl*91x0RU%jk z<)vYjNO=<^JIId&Qkss%>~i{%+RZ0{fB^I#YR7sSNimrJCN~q%y>UwJ0-@M)H{I0o zpi^47xu=%8o#s?kt4#h)eUhd7hxFJhq-AiLL@0rd;@>=~rkp-qL~)lQ-AHUDaRHM_ z;udbv-+q;ZfJC-#|KDVO{GggdQ7Qm1_5uLWdVBwfwBm+t(n1G5T`wb$P!W>NMZr@_ zhtUyWW-^|K?75v-o;y(<^e?k10F@SX< zk_>GXkswpcpU;#?!NT6i06<}d zt;{?m7Fa#rx3QKuP)YP#`_^?bJH&e<2P}QZ6?gFQ^sW8ommi>xZQ|**SlB$qT6Q+# z=m&P~90)BW5khJ~9XubjEZ78}9bn~)m_WYHc90Ch=&=2>pe#KVJMzy0VS%za#U0Mm z8mGk9t0L7nLqc`Ro^sUcGG zca75#{jMzfCrR4gk)6(de4-M4Mlugnz}j$W1N3j5CGF7Y$Wi?Z)-_O{5nXqbh8FK@ zM9Y#cv}l{#AQGWAqASJ~4iyoqibxbK%TCM0yvxQ?W5pFC;*mma5FBQZl{96Ck&X)J zr5T}cbZ96wpn%p%1_P8-)LgxqXtX3xNq3=_fr3!J8~~_A|2{|nbqoHP=uZz4PFEqd zJLd_kDVMEJ+)wOId{4YjuAKy(+&sB`5^!?;WQ;B*x*vfoViy)ICnNTgN8JL3rj~R% z9upd5d#4cMrY- zFnTr~5u~CT{qJHl@RhVJ#1f;UU0*9Gsa!x~G_-W|42(=j{Q~_q_s{?c3jMQ3JxxQQ zHlVvMY!$N!A4L`B{PITb*524$zhiS=rhhI_W6MQM{=UuXz|-a4!pn1nj!CE2f%kr> z_F-=1@60OKcu0J({Vsd-tN!6G=fU^yw^48Ei`)Yw$4_SO@*m05fo;A;rBx}5Fk5wW zyp=E#1a}s#kG$pOPqU4}SijZ6A<3U_j(Unb>`Zwt>FzIhg0n3V>T2%GB?<*7y=auU zzxv_l8-cRnxB^3!uW12q>IWx3Tum)-{?I4|`L0RbaoYf-7EV0IoyKU@$WAWf%pFb5 zSt5DkD(juu_9&^u9RkL-_L^Q>$x7zr^pOJ=xY~B8g-Oh^VD-CqP1Xbn=LyqJhhkRU z-l{0KSM5>rJy?2u(>RmqY2CnrZ`zjDBWZ>d5KU1{xCXmRm!5QPe^hBQ8GzT{Kg-bs zGrecer-f+Bb&|F8ex*6(Zk)4oyl-^u&?BO`S^ZfmDh*; zkh@N3{%JC$itlntah6mPCbXF<~_xBwQM72x}8pOFd4VQbG@FmxdyU869+( zOAOL#JY^4ysn3%iHaU+0-6`SvaNvUW)^j>|7)@6@@6O-`o#(;T%EiHz9@C4tE6(Ez zanb`$HpKuyjcX|HofAK@6pu1&GN+-M?4#(F9q=4)w|^OlL(Ng*w=7hBS-K$#ZT&K5 z&{W_f6)VT6J&tTpCReVBBsp?gBuKvh5{QjN9cX8)Is3HFwc zQg4g7muARn~m{-l{F3q(M^3lcT zaRrY{>dZS*_QyxGSH=*{S%g<}xUP3I?0VC{Qad+`a*@iH>k z#uQ2bK=al7+x>dMr4_o~7mJt#s4S9P2amqn;e%YjkmqesSh=ej{o` zFIGxplb6B);8OJV)hkIJ5lWaiI6_wxLAfR*sDD@&I zqA2I=-^rUG{BhrmKZ?!{KKSLP62HP_Stwr+|Tiiadq z@6#&_`zV$*Y3U#Ddwow2{^tMQ)G3Xv{V9t_d4Bt*IU6xouJfmV<3YY)zpd7llIwZ6 z33kOI+x|57RFIO~m0z}&EclmmY`44e>SwQvsuj=;wQL7xdg&4d(tuYcnVODurRE05 zj+VXDt}iHHYC;#?#V#V&FA2N3{Y5wO(35Zascw4&U2PgR3~?f7>KYSqld2~P>4D4m zwXRVnZZ2wfF&e!ZAxjNfzgwy|UemaqHS~l%=#Ea&+$;LiL?g?sry#&WRi_mta8Wre zsbQck1{oJm(g30`5&Gpzs~oK$Yvr3=SxWZd8u{nhwY;OjYZ3uUOBG$JB|>|y`xh10JzHNC-X@4 zpGo|!p#_Jpgn|RlXWYead=7l`D1UaOqWU1}HE>l&xXF|<@bd34es$cNRiyRz)U#uX5!HQbA3i!Tp z8rlo1)hRm$rYHkwT}4ZQUpFAN;+KYELvhC+bfzwJEX9J>&yf}$yL)ba0aZ!83Wjk= z=do-J5MaWFp=cx>;Dc_5fL=tPn`bzlB1V<+%KpOA-B(Eu8(o6pg_q?jHCuVYGl-iB zlR<*l!$-g?T2Y@=7Wb;X+xj8W6y46?Gf+n?0r!r9iXoEF!vyerrfeBV8OQSweJ(BA zf)Wnm1<$BNuEeUp0zI(_H(d$rAiA9o&Ro)s)7{>mXw567(}zLcqI4%qvs22H7fcRq zZ@*WPv}(FOW+IZKd_zf8D9zA{9G*Y!V^;nScyvFhxHD3xxPo2K`n~u<(niypjOCw{ zVo<69>V-WySpN*e=jmC|>a)4J76yuuip?^|XPl!Ie3N9=yS$)9VG zkFzcjGLSAgT9jFC(oJpNiOpnh`Rl#@U-4_Ln|B{oWXiQH4nGJa4_@m@Q!`H8KjvdN zK2+kQRt))W{j-rvVW2+$>X56OpqcUXmM^91nK^)y@zIYj&pCvo&4HwRA@17m+BB6G z-M>c95u}7dYz>`X`E?TZ`qFN`zr*`Yorqi#Ma&Yveu%+-N^aTL0E~Ve)3KfipeZQ2 zwZ%@<9VloCh0LPg9<0-f2Huvq_@>Wb_KFSbTMGbMpv^Cp)i`W#JlCnh+hfxscvsOh zg88iDhz51oU<44X6|a}9l-G+f)dmXG~BOQaFvpLnTS?HMTZBh?iq&=@KR0%di5 zPRko?&E6aV(?W^#Jd-I2(2D>i`rn9L20ZweThGr}6-+y>3Bf!jS>-LY*4CP_h2y4)ch9r5Du;H3`3kYJt170p zIWpm@<}7>bTxL3WifjWwx}*L@KIidYt;lPryA>mHtnK%M-JP9l?lK<0f%q6OqP(U7Y1cRKx^JNy zjx>-D$$bgbc|o``zDGo}6f_XcCAR+s7p zE-r`mdvA*ko;WX}wJjeCZA9;nOloDIOa>wr{X4$MXiQ2it8XqiEUm5^Nd$8S1YZ=d zUuF8`7If_%Qs`=8`*1*^Lvr$yddnfLB#>u6Nl2tOp6XCg{+jm3xsM)GZD`y+lvuVR zlYRnimRtOg^Xj{3x))fOTp`ec*2|tETKHMti8!6rnAq&W73;v`kW%z)Wb{?$bf__Z-YaH_25ppC2jYLvVhi>q5hmP8Od0n zkkvuB(OUoQE);jqGB+2wD$Rz>w5Vkx^yBNtCA4!Y-KrL}6GO`oLr`I?MEK#oyO}yO znM(t-rnBVclC-h3Y;0C|#;^qHm{v7aHFXLjM`g>{)LqI9{rHl8h~}UI=Oz@VVxCPH z2~@8ap<+R!ru&Y{e$<TU7p0>Al#M}K_`Lm`lGP%k_9%V-Lc2=f1m!15yVndZ zw?YFDWj?_k$0DSja(nF{P@^~t_!|)hgVRfJ^4oI zgTOo`oH|WlV;%4JevgU7i7m#bx)$qXX{x;%YsoahpmtXWCfmq*`cw$7f@ySaUUdrp zc?(k`cS%EuneHr4Mb7T3JTwI2@RA<{(m;{K)6cS(h~>Ft9zm za}}%LBUbm5p)U+Fbb^*hbRe6&Om~zaCfHzn>- z4L4kT+hJYTLRlJC=~c{*h$$s-JjFKh=@B=~}X`pVpoACEp-zs?I*@_ux$d9JPB`fgp-HC)`I&zeysD?~R$`3fN~&6sk7 zr7`_7M!9mTNPL%aSAJR4zNcPRtzK5TF}){Z&+Z<*lcQ7{050u!HDjaTYC4mr`^ryC zjf`HcUpYD=_bZ-U(QJsDXP#YzN_r?-BLhp5Omr7CHRg|Ymn!NRJJh%_ArL1Jhy2#a zY8f@!HfDA3#krz~rfU4HnJKVau#$2}jWM+P%-$!+t)qw$C{8r8D6fB2lh3ysBMSOZ z*|8cVTz>afpr}yj_}}Ln79@L(mS&)r%Nq9F!^DEY&ReMos=BSeUsAvG{Bu6T5Gy z>2j8e9!Mguy4iqnxACI=>k2j;<=Y_$pBp2LA-hr#luDu6{4(Sa34sFZmmH@IA7$LW zN@)=iqDk@GkK@fmwcTd0y0GYQbgVV@j{S1Q{VGF($3RY>qik9X0C;GM7vnW)n5Shq zXcuBcoo({xo9mldz1Zx9q9U`|`exql_VwtAq*l9TM^H!}%1QT%Q|`*}QBzXNJTW?J zS{?B+!gMtS2whRv8hAE3XF%r~PLX@0!Jt+fdubVMmBRvW?J&RGz@$#kQDJVkSk3D0 zejb{ti^zdD)6<)%OZIm<&+VtP%V1gsyBpZPK#cQBz8Vhn+MsY^ZOh~ossP6^*Gu?5 z6dEhMk8N!B0>i+1Am1~HY1KRC9`@Sf28I0Rb%u?nKa7ZWZ+3<AMsdV}R_gM`4s+;j?OB?&yf6tSpMVG8+`!JaXGFhwbGbUnE_o znwshiVHy&0v>aAm)ekut;NxW`NXB|HNVGJQ5#MB5WYdz*lkOD6rJ_=Ji!))M&uG6k zm?Jw^Zx=cWgvw70?-)2=aLIYy+Y619+PU8kWkUn|H|U8lnV=$a(d*ex`=HrZ>BQXD z=QRU&>x$6&#}W89#ZF`#Dtxp&wrTpw>f)$y)yC=bdC)yOD{wRhYTfysmr(}+2D2=He&Q9!iwNu*P-iFenrP3spFGS z{oKpZAFSO#P2Jb-h1I!}38sg#u>u8wj_fW!yqccrt4Px{^&R?9JiiVA%i2rYE-tII z*Bb`df^xjmNH2d zO!z3saAZZ|ADPdin}<#6qXMaEaYs@_gQ=o~d2$WxAe^GKj4qykK`Q?Zr&ps4ps#U{ z2p9hd*s>?NOk>|qH3bT4kIobfNv%H?J6y}i^7Xl<$g$)mV(m1A^~+!+Pe=rf5B1u_Ren4`|9so<*evkZW1NpJl@JV zpiGAwui*^SMr3BI+?M9Zndku*%8=~Iw1_%T+8hd6#YFUsKWEUI#q*<+J zDTI1JJW^h&OPS&TT9{+H%Y)PH?|W&%S#I8di5+$|L((j797n{BNt8Be%?54k3=eg?KoKj+Ievr4J;gPDB1w}h6UG>NL zb^^eq&)Y5^coBCi(X93yO&-qa#Z$*9o+9a``G}oUcJuHg!y4!WsEmKNl7vhHF}J; z5;8z1oGHlxy!tlOU$63S^SAKx>R-0beVv_eHJW>zJ|x53<_!ZNnqy5y*i8j3=@oqW zk(qw5drHQ#uDhErJec`tUb2LPkW!^-=Q;^VxiceVLSz~#0%lwk$Ut+Vf?W$13)IS7 z(iKOZLm+@aloIfofriFb(zpjB$btHZ*t=7xE6hQmgMwy-7XI*7Q6?3G^<0?T%X#M? zzLUW}d%Dq1%YEFeI8gdsewOUVE%xbat*hp)_wmd3 zO4(|!U@!VV@8S2|%FE@PRu@L$0t1g918760cLa%}Bj%KBHHs{gO@Ja{JP>X|Y0x`W?4&+g@S4}LCF8yu;42qhwn+b=1mM7DdI>n=*6J5`rk z+G=|mlX2yk7_GdI8=wzz2cIbF+K#_)l>L&;qJMpj2m0Vn+%Qp%_?`f~Uj-z{`a4s` zbIHD~8p;x8iHaUqu9|J>eRBJHi@~YrK*3*lN-H#_dlGoL1iBpvms-@19*-!zL5j`y zCiFr+Z~%4|VIKC`iBWtBDeR*O-jd!%_cQ=tNEBhYUuPL-&+fj0chC>JT*WfmtXtm% zU1x@*U&^Lyu(?gUSV7deR1i&Up(|1jM^S02nMBJC(c0K6VORmjd!Ho~DDu)udUVSW zeHMc+rD7;4J45DnH#x|hAL@3=6S3+&u)Ds+DzS#fk@sy)TlI|mEL5LH*@%S zpuM7~#`Af5LXEU#IC+&uCb}By>^?3hwZA`7HuSiyoRB&uFo8GJIhYHa#BE+tuO6Jg z0=KaLf!z+xcoXW0Mls@^;&raN6kI5vM{!qv+v|YL4Mr#Z_PNj_ z;5KOEDFl;UO~WI|GpK_`N6t);shjEm1(k5TFmK*CAY>|{aX;Elru!So*qBco6u6^?6VGr>GV|?mOaGedI+nY`F=&6D=N;7(W1o19 zR6Q}y%-PI3y6z#?WpGiRYg*?tXbw|I*LvCAqeho5nKekBh6v}aqHIY9$WsKm7?IK= z4Pkf?k@hNCa&r}VN@K^=jV}4>{8~{zGH0Gp;&pmp{jr~qPOy|N-ExBd!%;uQ67a+(hXv`{j`?0gQtq;2a-WG-FpZW|zfOrJUmC%Y%$fNchbLXO>)61({*v0iCa5h&Ic8*6 zndt!u27ry=={PV|sb=jyCnh%ZIrmDdn>s~xy?@5_Y2S8yRNC5X;`(#p>Vw$iKc660{kT|*|qYo0Cl3B)`rF6mHus&%L}D5ffYqL#P$ugk)dFwX2{cA^OfKWabn z;}BXu-3fU6Vv8x`%^V&xf=a1X-g6Ej@t-5M6AtGR994#6fIuuHfvj2*!{&Zd~K zY(8LK=%ZpRePXMs*0$>-IlEpdA1E)_TejN~?-W>K9vcx8F(i{?DkQ=q==#BS)+2M# z@sL5)sPuiHw5!Z=Nr2(;4JKbz#?PN`=1%M1Rgj2!rG23YjP5 zr|vLG=@eA<`Mq_B_#(@3Hm{Gr-0WO$T?Jd<#!mo{9?f-f)}y-@o-mz){Vb!knddDd zNMXEd=D4_4JCj&d0<Xcq?kemvE8p@^&H6oH$8vdq|^QY8-dtSip-XOg!vMJJ=>#0DU$$^y(h?VeJ7tyaGI{FQKB zB~^DaNRn`)4LYnf^FehiY}Ug>M8xECty-ROAil@;QApQ&TryjIp0xQmzFaPNp^H@t zk6h3(q$y-9k5ev(_jTrp>v^41&2qP7RO}eZ%-65!eYk0Z!|fTZe&;stoaDQm*HU$O zEzNNJJE0vuc+v0Dnq+KFPFs-7``Ms(Tmkq}x=qzO6G5~T|BhI?0}NzXc1vTpvye!g zPI)Uo9lR_p>L3LBa77)`4Bkv-g}MG}ajq)@a3|V4vz?f1zRw+^*99wRhR+IbcW5&; z*RsE!2AhNz(QyKQzPdmYNfJ(Sr-uor4-gbHj#*hxB1x|#Zl8FZ+_1H=J4rgZMal># z9VcAK-uj4r=fuju{rHY96?K10kCSU~aPx=X)6+eN#5ZQ1Bbk>!zs}haB<=Q1gr9|a zc|ibSC;0Iu8xu%p)`}*;J=N=x%ga|T5S)rQQj}^h3K69#9N;)m5cx1aP4~53j8e}% zr!cB)nch)}4bg6V0euizsUtCmz3hA?Zh#rFY`2AdTlQ1tbsgLJyN+bUhnGu=JqA| zx4#0~l^1MiJHB+I#x5zs?ar%c=6nesE1OSXcOMG+E)6+DbHY8<=V^^(FH}S>jr?LK zZ*2skr!tXUQxX7>PE`Hg9}S||eP5R+DJ-PN6C$GSO!hhWnZb-ji(xfo_c#2^>C-8wLOn(BMx`0T59F=8(I084T5)a&lV;@2O`&X%%Q+QZh$~ z@y|Z17SOe7pxfhLxwg{RrP@Ge*wo)M(c0t5NZG4yx53npi4xH0$y38)2YvMI$oe%v zn?SKHD+@=C_*5j!F;5(b5oD+41G{hlTJ~T;gUWZ)`6pX?P8M!fZ$Ax4(0iO+u03=O z`q@_^z4gk5Q{|;??&~*r=Jw#5EAeMmuK4+@td+3y_|P{t=XuqP!Z0+=O{RNMo-X%; z^K0wuQ$0gov=%LzU%aH*akxVheLIBB(dir`*PciG#ax+vNcYp{_1|8)xVe42S^lvs zRL!8Bd~GJ_CJlkB2(~#l2i^u=4#iPeDfEtRX(>PX_T@%o(ogAT82K9)bhU)~ zYuVeN=Ze|^8P z#QJGXr%qP1tgNsDQ(d)7eJfU%FC9X~$E_FrfBlYa#^`(foEXb9tl_c0BJCQVA8D2!}&sRg%bPsv> zBbQ$?y|&vGHXg{#9_!Xh*3q{&sEe2Gfmu}aIaWI=oq6&!QZ+8C$A`$?&-fXFGVc$B z3FX;8cpzoGyf^k0<6%PdHu@Y<(a~s+VVEutJQ(AcpA+wFE+H)gDeSTA#oKdR0*X92 z+g*#EI~?@>_8Fh5^jex0`xL7huZ<*wlU~*2lwDU=DrXgT$-3{cxqW`k{UUC;<+d#K z&~WPJb{Dxi|C@W#k`TkUv_vrPl{RRHr^q*dbEPg75fFNhTC6JWmOsZM#To&t;L zJN!zWqu-q~NMC?Gb>Mrlj~%(AbP0WtcP8T))-nuF<%dgox@d4P7R$mrAx@;Pdwyw0 z;EA#K4arW<(Z|w@-liqLbw0VJe5{!ID19Ym#PRx7~*{NdBQ_}$ceE@T$Z3#pOzD^-PSFzjxDRpw!CS?8nu^8sci?Bk%~^fRd#q* z2h6FqBkj#d1s=noD5cC@l|f*s!hQfT?TXCqkv0k!VaJT7U(V#4${F^fbPuy6@7tq$ zs#aCr8)>l$*Rl6Fdy;MsNepl<&S;{ED*z=XLSa+__{ru0q=*GFJoyro_9{i#L zUZpGIP^7!6r$x{&-mTBE@%d%gZCuA_TH9QePpZrKtN7U5>2Asa>9;Q|13Ff_Cvc_( z`kF|XxIx_0M;6@R>D27Yr5P6ZB`YQgVsv9N*zm?PZFa)vU=df~*3#j{$>g&DB7N3d zLLgm{y5_tNb7%@ggY%%P5rZ>{_$KM7M&yV3M%p=+d#X&EZD2-%5kxQopk%(ZwFc)5 zgZ+BU`=NY;&fwrL05Ct(C>_V(ljGo5F1zabBoCR3^p=za04qfk4dp`eLGZmPWKAIY`f z@6w{#H!No78QB;vds986Lh0_ox(4Cv!=~f$Nh{cpgyq^`xx!X&?Kh0QH}hc~9kr?) zuj!xO9A+yt91K#a+BRRS5o)6FdrD96duz*N?9V28D<`H=sN>+m-uzU{dxM}W*FCQ{ z_P()~H=3SY|LAz|7T8qoyt0YkTw+buwhJN#h7%9>tjjbnCkGx%aO@ej6u!KzsC1Eu zamw|8oehz6F_Ao9Irk?1b}G@5OH|{Uij&ELC@SJy(H_{2TX&hLzq33Y0EW2kfD zk;wl1+h-)$|9q-(Lkt)~kEBp+6CH8gA;hW5Qmn~ua+~Cuivg4E4GZP;^MbYez3v~n3zbrFe z(-?&fJM5Jyyd8YzOV&~OuJz|9 zj^I+3#f;Q~ost*p*WwxTzim_*e%O5Z<;EK1=sB=rL7FJ7TrM<|y|A8+;I;nE|y9?y3N)LbgV@R->O2%nX971-JBw+JT4hk_S50q^A=>=g&0UI=XPjv{lp z7TB(QvXvrSPDhe_f^@I1Q<~H7>+(6C_F=tFQ?${5P4o22ALzN-#L~?8QbCPOddLqQ z8I*Ek!flPKC5kdgXBz-9V9im>nue=YgNRkn%(?f8vI&%+IQr{LwXGT zS!Gh69Q7SJ&N-`v^Vl#t$WAllg6I-gh7jaf$IRj(DJJsabPzC&5Iu-BWKVwetX;h- zx(;zY-^)s-%-T%9(GSAt7t3_cGjNeK)w@X`roxaIaIYSd`H+T&6arWde)o*#v}#|RoFu4)j5 z^u$=k<$UneY%LrVb6A=ln~aFEGEqwA6c^_=XA`7fQcEGoB#=W@nP;RE#XI7iStZ1{ zRpM2k$qDs8m^R)t+XcE>_SabQrGsii`E`NNFdvG~`^DPk!eJfw3ZX@rD-?eGo_*`i z2AI!%rv6MJFO1d_$FZgywbe@|&S!AybCE-yb5}MVgKPEu`sY02F_d!Zuf&Rj2_d=*Oz(7@6;9YKEvNbQ~eZ`Oqv zR*NqoadPM=cx;jjHA|adr$HV1c_h3p0$R>^i!H*JVF;#ksjja31|;MhkSep71d34u z-M*wjUEw@o+uXBq;}Sos{tjN8ec>1Bs>oliwim#f&8~d^uH|ugGw&WhX>}wA$x1ew z&Nf%cYwnMghGaEcSYwbTE!8G^Z5offZof=tI(`r?MabUGo&(S5%-^QdixY~5^=f>j zi(+F%IH5NX&6hf;O%h$;)&y7v6K`X@h=cRAAme!lK2dHgd7G>TKU-Drm=l<4+AqgP z#ZYlLaLgc*mF<^j%J#ek*3_KRiQyUgAuL|IkX7C|ezn-9sgLm*ijXobld6L)eE*e6 z>E%SBzA?p-O2zp~8OK1)t!|XEExd`MHjAa zK;CpO+KD?{&J1#5a`r0(eUGEpsrWSm>ITq@;?inLTvJy^QS0q3*p0m=b1%e8 z#PaDal|I=7gUb*YYTl1Y@XnNH+ktkSg%z7_3IJdX>G*o-Wa2QZ;dNl4=BzPRCa)1G zsh9KBe&&2!{mplycn{C9O27uBKonfI8#U}%mD5yj7^pPV6*6)bIax38N@nyMkq z@M#*OH#<}uL1E>;kH*AeBN`#5E%%@4HMuF2wDjJxa~>Nbz0w6L&54jQFl1?`G8%PJ z%-w}2C%eFsQiWoI;!PE(bnl+6iT`&>lx00icMd*m&bE9?K zXK}nm9{5hvW=4Si;94j~pbfA~!!SQ@)Nxd4#4xQ=qYMO1dIuR3X|R8%%lhl5k;v|Jx4t>Y%phZRh7iibuIbxXp>C5xT0QSq&H?q2 zE+Hny0NEKS;MXoc+Uoufz&@4bB9)2~h;`3b90*eUeOB;@R}F_=AWQCG2n;nCieX;e zUHLARIg6BD8B^gSjWI=F2!bLS5KCg;4CCStxiskOnuJB4QD%;65E+tyx3St*Z<*4< z?@>lzEh<^_#97SKEqUMvDUz)EkTUaNy=acYMhB-TMU=C`!X-x29tc953DIk9EsFF( z!JebELSwW5yV!jm^t-7CCi9wcg*>hfQw-{_H`w}{UZW=^wfR(5MR#108s5&1==KMhZ%bk)Q{8x+L zerkmD9ki4ZdI)ju89y*VNF)bOz=12G!1~hGl zBS&cMk^)boQ8fzO1f#f~-n=7~;rx(vL?|L`AGt+G%T0IT5i~qGQMNgHdNb^9 zXoO|r<;RfB8a7_ba0w|CF`|kxXh3ZqcCWy>@0Bqf1vqnP%yKgnITciAwQJ~VnVQN7 zMEBZnsrjjSRjV}FXgHTAz3>zatPRAjmp0|CjrM$BDzgAFoshjAF#tJ9|1gxg;@|PQ z;d^Z{hyQGbwYx0k;P6rNkz5eUGvGy9<8aboX{P=Qo~)g1A#3BGTJG7Nh<@(4cPpJ) z_g3>Ig^EK^h6zLtxueWT$Pc7cV=1F;sp_X^Hc1KeQ%zbJ4eFQ5P_5$&nTepPsPa!g z4uW!P;DysTlLY&3=`UE8Gtpo&;tL2};kGT@mAixIzN+hN?sc^@H?9znsP=E+;}%2AgD2)D)v*Kn5N-D_{i-v z`|h#TeD(sxFWMZJhT=XIN#@8J{4dX;kFV&+bO$F&*e|V2DH{n0Zrjf z-H~zT+n4q*sSVs4va!g1ieeT-Vt4l`W{td~1gXvD?h7a*9UuB!nw;Z`b7=#z79 zqA>K;-~(p#UP{b+487FrH_HCnPsrHqy};VS!ocmv&EFI~EbY&0!FQU#muBktK`)3<5x{-Fk=21)5g zK^g=}B^4C`74_No_dLJXv%U5@=kL!sJD>Z!@9VnmD&N``3x>yddE(&oGyNb!SU*%8YMIM~tXP<;5Sk)&47RQQrk-Rh#e+p;4 z^D#oFfOhbGH6m}d9Q+psXf8B2}-KJ5P;zz*#s{cV8DQt z*WeLcy_ua6m$Q)u91Ieg;%u_I|I<#~(V*UeI?hTPJPgDA`3J_Q8F+9uL}V5MOf61a zA9rAGMj_4QG^92(^6eBw72}}PO+Dhv&>waaS6Sc1cEVj!UZ3^M0@adR5T_9m{62;t zYAREM7&((;AGbRHPA{JsU-ltht3CU=wubJbD19sve1t;K7$y{#VA%1)@kLE|5M{(K z5Pf@IijUjxpH1{PHy^o|OI65h6gbBFBsTP}LADHhjd!C5^{QX}peqCC)puFUU0M+Z zzGPt`p1@p-Ow9AHaWX66OLY{wZBXa+*%hCfY&Ql-pDrVs?lL(zv`l{=+iTIf77D9M zm_8M)?JlTF1pD2tz7#O|oK?C9nj9Gf2)v#WVZLlcWlWUJ&a*gp%>5+#)9Ah7RFW>M zk$vv~?47~h9fDU9E9g?cqg1_dxwfzPaa3s!f;)!J*;m0Ph(;|H-%4e ztjP;Dl8+u1;WSTx6)@H5wUnLL;5G4~co(@B{W0Udat_7g9_U*u#LvS{>ZFT_)%U{# z>uAfa4pCCE`e`N#j`kM1teiM0O_=D~cyJ>|lr2@zRW-qZ=3Q|OJ6dgtCXSpj8wEhu zjg3^r!|lN{wH}c?gHQ0qlSl+Odp#-&+-xL(*<*w89eSjyg(Co` z@Sig^LR!=aj*_oi;NiHsApn0K!>;Wf>y2sgG70qm+gS#vaj%eeJUz*f_WevH4uoe# zSfh%VVToVgJ|>n(9uG1O>s#*1>+@A9j+@}~7-Hof-q(H*JP5^T zzcXPl?I_z2C0~&CsJps#py6m_HQO7^L11--BUtQ%F3MictJ`!Of#iqgX}K_*vGIP|Q5I zuX=<;6EO5wZcj+c32mLpJhaIAMGWdDybH|C=Y>Yp^-k?Oh0TsNKu^Q%v-9%-U#U{Q13fvOnSC{<%Xhc+T6 zb)HgcuJr=|69gUkn5yyou@^D;^p6PqjM7g#veq=Iy8X(( z7_kM^iVh%x0T?k42fx0iu`2VrC#3}ugI4m!5~jOAbTFq<=sqv3nb={&rAf!&)AB`( z`;(WAqNBx0*p6eSXpc|>O;wWRn6p`EO_hN(5HJ?@tvGLrvTANn+s(y(E{4fK_-f{S z$g|x>vrCCqZVIS9J!ZPBDBCht7mF@HAz(P?Rzm&2w=Nxmvo#6Tds*{-K09S1q_(6-hFXj#F^FVS&3yYXUndzxMdj&mcFMrYI*=^oQg2%`WXw|_8@6p*zvph|H zL5c8bc5*yR+O*L#JMBe=JuTQuozL3TyUHc(w%ad(I>UzFpH7n>M@qiGa=vPqe_#D?O~GWC?Mx(cL@#gx)ykFu|ns zQG9X_scdCgB7BpC$))!<`Kq3=UShr{UtWG7b;4D1)#@djF}}ds>OaNPB>_;rhpWo54J{aV}g41x{{5CAL-MTyN<_Rsz89fnpPA z?^N#TiboNLNC2SnwMIRflaZNb1BHjjuBYa)qR_lKlgE&{dS6OnoPPek7PCcrjf+F{ za68|U9o;1@G}U60Exe}h?AXsIQLa$@eTi_XE4TIg#X~7E&yZ}>qo{h&0X4-TDB=yR zyGrs#0*`5u_K{AhoGrDymH2UEI$LGmrDFr^Ex*8c|`-s6g5+~+^&fJ-(4s@=1t?*!qL z8BcJ~!5ioE@cZZX?>R2T!snmIciJUp6t#aVKA7R-zegQzFS@BA&7aO^tTRRxyFkr; zKf^5P@?uyZJax!2C*NBgTl#6S!)H`PgrT)xKvVQ+CCt}JhcB3K%9ZHSAzoXw#~$ST zL*O9b`;L7w00Bs?+BiOBRXQ*76$=g00xu0=FBk%=xsDqI(^GCuuhWIUGlQ!ZvrcC{vo2`Wl%Q*$;~vk_-jfu9+3srqT}S9d=;x{O+5B28Wv%=p^Ogt;ODBp=vz_q z^38Lxk%Ib~F(mUbWQOTGlCl@1E$fpN4x|e5IB?X;Z~B?Qs>J3%wNr7k+>njtGxzM8 zxz+5$Q?dHaud12AGYPv4IZ0A_|Hn&dfo$_c@%(Q$0a!`lpf zvMCWi>;xce5B;mHU#Q)Fo65UpH8Pg4MZW0_og6&&>k^au;$!qgs!Xn2Qz@~F;)6(X z<+<~wXj`99@AGe0Q(%}zqL#hd2M7iqA)51`k!g6!6cWnLDK!yPp~^h3#K8dEY5@%D zzPV&#h7XLaA%F-wmf?qt5XqbshN)!L9yNB0yAuWpT1=_nFO`*;%tpTy394#G#i)1;D29 znpx&E`DtPVT zz3lE6q_XSGP4ks%*Lq|!8v4-bYsafLK>Jj1j7%)NC$y% zke$WBnHXr)mvdd_f6u0_(~(Qo^d&iHb%R_l1a+;e|HWJ)#W^r3CAXwPAJGA>9}8UQ_rK0=F@t9 zjnSE|dy|>uR&(EMJ*xaQE5+Zqy8jEkrt|f|l02I%iZ#A=(KgHU1&@f~z|F>>l}_v7 zzrOFEmA-u33jO=NscS|;f|AGY1=G}OWDhl0&_(>UAKxvdw~D*BoG~@A$Jr0?H#a}I zw8^{c&fP<{^$}rvaWAA9&MhFUQ-Rb%?B95XuPAtXLEiw%zApt>-n+5VNl}fG{Ome^ z90U+NVN36Udvr&l;}|fmyi~{FQ`uvhQnWKTQX+}AZQ%TMB$HUEdFz`zbteB5StqZ~ z1ud!~F^NodU@*Sy=E#zYuck+R5$XBo($s{jMYG>DDnp*NbCkKNj7a5^^Mbvhcpo?x zBAY&Ul1U_D#%vEm4bmYOq54VCQCC!${FL72tKP{y zjjs45th>;}dMb-8ceIithrgGiw;X!OdC$Iz1ral#p@%9ZXl}{BXl#BY#jyXwM2#PR z({y?Yp<)16S=_=$i9WU&zt?Y2HBFOVBaV*ZK|hxBlz#Gf!uz+it83=F!{Qg7`)duG zi(9DTwKfUs9MgfE>ek<3ZHkhj7E6~(w%j%E;fL0QwC9_X1YTa8e+FEB`A$EJGmGKs zFS=tfRf^B3B0-l3nfhkgdCj?Z7t>1z=;x>Fs&f1}-RJ=~zzze+cAqgLvBwpnjL_r1 zVrEspF2ug8>=Dx9B8qT^V$l>&4B3Dz2jQdpvJ5++C8>0jV=4xNatwK_KCb#L4P!Za z`blE@w7_V-wCb?^qOxmToVR$0nB)GAhLBEjEtBKg#;Ti*nnnYN?4?^!lsJvDNZMOf zHA8+1Dq8yKsg8Wnw|4s~gW79{D25qvunJ4NUpw8y%=~Z=Jh#U8qemo5B{-Tdy9k`v z`I$Xn@!9;D9K?$@-Aw#r^BA17*N2 ze5`rrrPGef!ynQMrc&$U>t74kcMbQQO_n8x;y*m=XdBMTfmBt^0JA@6HF$_>u8^6w zKS$esFpIRE(}v_HjvQ*ptSnuVJTEcsWB$ zz0vSN?Opt!Ft0Rft72OQ6;)8n>(M_wbU*q>wI z%Ay$`mBccT9F)L-xfv{JlBGRn^0m1cJE`;_3-n*L;~*H2b+UI=a5XJ-yj&RN-G48O zdyIGH5QIWn8roXGXbN6x*c)}y5plYtEcFJfs5qUPf$9g;FCm!J*m0+}o>!TW%mXyU zi@}*s@{tgCsWjXy&rzVbgQ&weMEtQ{G^u7I(k}8uRBAzWy5fwgf=g$d6M`_97n2@D z?C?pTlKYTfg+29RpG12EJJKkk)=$cM#mfkgAb_9P-&O9`5^C2~{O*U`scYz`cVC$g zh|Wig@`(L&nXgQE4zm3z@~!!&vef7Gj9HtkU=JvGT#IGby9r;)unLHtI2mBhrjq0p z?i4w&to$Y5E({Q!2+H^tIx)StdmGRb{Q7UT*X>)@@XIF`KMFhH%!Ok4_F+6)f9?LZ z3;HF|HZgcHI5Z5kx7&qjtM1Su*arduZgH^;_h~%zQvo`A=Ngc%z|%%XPqn{|zdmTk zkLza9)n*w8sk5!^@=yZ|Fx--hQq8fDLQgvBqAQdWu^!gsqg+Yiq+^5uFW+q6LPIX8$@W;cl zj@1n>e+Hk{GYzSeWa8OEQRAm@ejD%a97k=8qOm}Uu%bdOk#)4=wFfC{e*T-f6jNQ+ zYu1k@+Yt-!a_g@<^)jL25@>XRPMjNWs&$|?`v7~zQaMMZGH&xJ(EGmqdzXdndMP2( zIJ0a(+VK1%;lLdht+Pk<`tV$lDjq3K^n+ZC3E#Vd*D|NES$xLKq`B}qDlf)D7qaYw z{w$aulvthN|?6RY)urr4gu<0(Jq0~!lzy@g?qOMuba7DN05sD)))O`*`?+qptdT9j+2FQUX;TI92h`aP8bio6dMkI|Emhfu@z^MpSxLdTNg1 z<}hV_Qo@^eUR125Xb+9AzEzjYSTZk`m?mwnC>3pOEGZ>@t<)Iwf^yV3nk}E0uIg-* zZzkc%kTKb0xJK`NpN+e&)ue^GAagsDLi?-}Da$mBDeFUDyqeQW3CALp)`iyM)AZw@ zG8#LQgbtqv2COgkTFm@Tj>@=i#uuy>Jq&(_I4<+jAMQ4tU)CflJWpn+aZn!_6g0M! zZ|c<)ywfY7@cgtDt^MkO(RmBw1QTnW+4`Fl|1WOdXy7yn^SV(^D#;`Dys7Tly(h9y z!D)XJT^I%H>`E0tM@G&XI*Oj-mh1!!dv3DtD?amq1s838M=ow{Vqn9o2X}NNgZ{n1 ze6jmJy`}y{=>h*olj(~|oyaivti8!UYne&B0Df4|QfZz8>w`VS^oD}si7&4A{FE4< z@A%r)|Cg(S#6b>cWk<`1mYab%jrTa0F|HN0W<~1R&oDJT-uQ;wxFsijlhToW2;1gJ zRTWRQ;@yr$WiI_%5ml$WBr+KY(n`;NN}lQdJ?h?fhEVX5fN^q>EKXk(no;Jvce+BUo8l13rl?5jbGDEq`?1HVSdP zOi0kypr+%^ihkQeX)O^V{@l-QA=>0@V5+j2Urx=fz6rBx zR}?vWrFhBqW~Y%45x|cx-4Y+6$+vb>&N_3ZzX5Uku-e2Dp57 z&^mnN{@eK--h7^8I|KY4xQ-O=jT9dU;;#!#2WF)YW6PZw z+#EBkl8QJ0072&r;3F~AfHsehl%_tHF*_1`vUu(P!z4!cFN0MPbp?sPSk~!t=P=>e z!_`bFE*o9^wi`@o{X@QoODsaxwdLL#XW&I`Vp2q@=!iYLi8`W3I(!&GXU%&MWgIJR zs7WvkuN>3S)XO7b%O)D3+n*|FSflBf$sFnrIbzaW309-sqEBqaxY$zkUKyuDyu(LH zjAVRE2zd^^6LduKzRk4|31J^EIv3LRyDMHhb!9Ree}rUXaAlyQ*Eq+IDbUF)0eIvu z@2~c1PkjBTv~Wq)o3P)=|Kz^8^x+omIiTmI;3gqw;npNK&iDOs@URWLA%*noCxd=) zcjB>V@_z#Bvy(;OPZ-Vtfu+g4oq;L-UKR_sc(JWkVP<7IJV)K<)EdOmQ1im3A%c9P zJ|6Rr3i8sxWnfg2B;PM~9t8UmMS~bAF>dM4SjsT69v$nUX+-r*>R^KB(*ORua&{e_ z&Xh#rFHSKjVy!hT3s0HnUgbYB27oj=5H%DDtv`mV^w%OMCM)w{>2&dNuvTymweo{L zYKZE62VE8axTJ}1l+s@oJOpEiwWJn1kyLNtS}3X@6+9CcogN|IBn<}c;Wt1jtt#4x z$|cOIfYE+|-XPh$p{`|mh3Klpqyfh6#;Cns!9^oHTJAT~Z!VlwlQ1H6A>X;Km?h14 z9}}V1dAOO^psR7hc09X(`09eTJ7ERR?gDZStqaW3d&zX*XD$tsBD;oyaOq0@imql- ztlVyILMpK`vSgf0k848tjru<8FW>*uOST`N==|1+;Og^__N3>;SN@ihztA1ca#yjP zf-_#W8H2K$G^|P=>HfBLvt_80!4SSmYtUsN>+6FjQb|&7+Do*$oG$Fv2NJPn(ep7K zWs3fKGc_7?Q4c?GLA}Ae?E1HNvJ6bIv+;~2QO>^`=bs|VkBWTXcXx-KI}OT)smjq3@O4VNy5eO4)Cn;>+qdQ=Rs!K?GWKMoS?+8zgYlJTG=u5}1popGP6+E? z!MqZ@Q3xt+`M0pI_Qx%w+J40*yVf8~O$@5^>6-WZmh`Rn-g+t!y?(wL3l--2-oe&g zVf2?uQvb=?VYSo)Vw|i)#`iIObOjx zDIh=7FZlL@U^8YX&Z48!D4a*lZxK{Tpu>+O+EvhtxAvrv;^ZSMjeRG|e_PHCDs`ef zOa1uLgoa%bq5KiUy%R<8VNNJ5%`DCI>Iej3AO!|u;q~mV5EQ$cvG8oZD8ToBu7ZW7 z_7g_s`)=*z65|X`Num4yT?D;2eWWTaCQv^?Hc8JeyKafd6D?gswA1EC|Bp4WNOs-Y4tzVEGMFSR2tW+UjJd&UsBE z2`U^vfhR@PS~Tyc9o}0GTj9flMqy~J1i0Z>`c0TbGd+z^j+&Pe0dX6jsrgSb7dRY~ zWgEX{qZ7uV}QX^9K(VkRFL^gpLX^Xo^r6$*qkiJs1cpqUHDdwJmq- zUP)u+_EjrZoJQs=1$1Y{U#^Qf^aL#l~6ip5XAL?gK*OtRehP;3W^)c8+; z^`!?z)2ae59r#{@VVYo&8RTgRTN*G(4h&epho33N8N{Bvy0%b9Kj>c*$AbIomWaZt^z-YhBNx}L%}b}pM6E=1 z8CHE84#v>!vL%r;)TwBL$#IAyA4m5ASjkJBb=+E3+aFnLLVm=uDT% zXm+c4E|~hB#S}Ft?>P(~k+fYZ^z*9i<7_nm#qgx$MtfiQ4dyNU+|EAS3f>Ae!-`y` zGD?>j+_aRW{7Vd6iJN$`VwRsC78KG3TJM%@4+mj#*(XS3Xf1hs(BUQwKnx7#j6}0@ zk#s92dnuPdco)KnwY@L}xfx%G9l-!d>-MvXF4Q@NdYpEi2lnjzsrxt2KF0g9sop|KdlwrkfUXJjtg?u53~>D#@EiOrJ$HB#@B$7-nX`!lIm-&?lRP$O4Vb z>{k2)lgvKJvw!N6cLZf2=pcajEfAc4psellvj=I#{Jb7ZTE+H@^Diw!nF|TXznP{D z_oq$L$nHx~Q@h~%$y&$pGYZ<-H|_9oZ4~;pTrf3cs*GZ(){FJr>1pjaj9n~@uL@7B zQMDd*Bnir&*VL}k&L!)Qh4RwR83Td>?E-^kPyuqe=(b8b-vL59b4v+FWsVw8gU41v zmv3)+dz{`n65c*`GOB&6zJ=QUKHB*2ol{f#w!-pmT^@smNKFLlUi`B=kMZO`y~ zQ9_Y`cC8LOe}^2F@zQh`7+ksI1mcYazx_KoDUIhn3wLd&)2fS~2R)j8uJVVRGh4s( z3mHN#2kW|KMtW3A%f{mX5QVu{Jg%j3&xfDwZI`A`*O-^MP&eQG_xHaC`f7yEPn*R{ zr**X2H&SxMyrmE)X%z{20M(}qw{ua)|%g!xf({zt-kq?+z`n81NiL9Km>rFdX zmDev$u`KQ|fJ$FjvXXgQUGF-`b4X|$WlIrqqg$f&18SVWaUj*TrY8 zFWwedm`d2{yBeMIu)Q|+UeQzMSzgur5 zqDv3JeIux6&BW35A5t}OkM9c;gWq$8k>(6Ua%V;4B-I+UBy%Zu$#am?r)Gt`WjO_) zIeVzL@e`k34;4#*T^dyO6R~9G6RAKpnw>vpv594U&C1%moQ+TCTwT}X_ z<$d*R^Grp<>=rfr@@MTuCm98=nTS>^@cX^3#C^nuO+1g;uUn_p?yyqWUdcwznx2c7 z{hs&fc5V3V*yeentZ!UMq!9YvK{~XyHIb`xqONY+?pVR-EM*K!AZ3kHn`A^KRIkpg ze+7Od{5VnMEORn>LhbGUx+^6pB~wUzO4;*LVAag3(iL;2L%i4xyzHRApA>AhgEPFg zD?ynu;1P~jH_4jy%;|dJ}$9)VRGS z2h!Z|*>!(K=|YL|K&fdr+3!G7DA3p;LV-VWK#rRbK!D2~FPn7-Gd~U2fLV__HV<9X zXBnHjAn`IByq~nU{V;s+!By$gY@Up80vIzUStwR3T?3C&qCuiCP?#1Rt0(!W3@$L8 z^RF>3FOi^4hl}RV00_WqTgzP_zqj!#-K1PLw=bRqz;&KhR^m)Wz8aUkNT-byCq1On z*OpD)r3Q&Hu8GoHRYkkz3lVUBYeqXLO)1LInv!LUlHIeXo{wSh>}CfxuxjZlFD3LG z4A1ZBAnvpb)n`ub;@M`DaY)j=lVA|5k>YSiOw#xp2N0CaX&>sWc1{=%o#eQ0logSn zQbsQ5os0?#toh%htm<&9IBR(_DE2K>{EAY6prwjcvPldAbG4*0f$gD))@s7-hM2F@ zCDnQQ1cEtb^B{%X&prD(CUH|#q<71|AIwB6{Z?P?Hn^_YkMAk_eQ~Tr-J-We$RGBJ zbE=W?#q`y<#Mb3cO;>I1ia)3IM}O9+lKQ%eA9|SuJkm=#baMty_Jzt~4}U%l6`TCF zEY8pj;Qh>d$DcuZ`Az6Bu#y0ZPYHa%hk3}szR+u=;+^TeXmRC*7j~tg?hXU;Tu=^5 zO5%7R6~cPSg^g zPln4+CgpEOZcgs#5*znjm@hLVmyl7G`Y_X(34ew24_d&W2`Mj{2}Xd#g4!iq-N8^+ zEV1B7x}K$!4=OYGAl;4C!iHF(2@^MDEC9W;{!$Yu7biM3VV?1&Be93B3WqV{nJt;r z*;2Z4p=HyJL-}ObHS0x%lWFPl;csN3M$d@x@$UqLMcfsD%!F+?thZdx<{mx~Ge>ov z7KL8?Sg$ra3t;@#E#$mSv85Vnm$zO)YD@L9O$qN`XYcIg=qg8i>UfyQhs5y{NOsX; zQ4xW<=lr{NzWtIIOrDR@w_OH0rl5yE_C#myC96v7;cZkwK{OpS!8b8m<&;kWmCV>B zC?$Yf@n#(%2d=?YbF)%CK?jxbz!tC_9TetL;9bDFFwyDBDKVb^Xuk}wBvIXS}X<}{(Wh+*lw-btM$bOycz1_x?}pu#7 z9jp{7cA8YZy))0qGNp=6Q_?HCOPg$zc#9G2xbsZ&;M>y&{pngUr@8keo^9Ts7 zh{1R=*?#Wi7_+|aZ2RmF?>dsk(=pQ0dkHP(NFPG|(tgAGm$whkTJ(zs+l)14 z8~^ML-0Vqv!Wt$|?Xx&OjU-Vscz(lBNhgYb_jsdVVBCFh*iym= zpI+B51fv#nGLNU2PX6@`{dvAp*NQ#%&~gi0@vo}dPmSGB@@~dE>g(Y@;&;RUDBmk~ zKFY!KqbVXHfEgn(`8&Mt6V)*kmZxgMmDv&{r;z<&I|4+@W!uJxS4=tWKFRc<>5e$) zp2mX74fL)Gb<{r_xp4E6-)idfpJyPN%hMn(5L+DWn9#UrReZ8coO84?!R`udXMnxc zbvjNwzxmy$a!&dSrZIjN5<4G%gLcewjl@=R=K;-^Rvb1EJy<0r)+*;)A<8*TT+vp^Dbj||tbb}YD4dZA zPlXvMZA5vSOlayK6*yD(UaPCVg$Am(9E(TzY^A(r^tCP9T6Jj_M~}TOGi$up*=>Pp z;J`;WPvjwObK0r4>Cj)cR{cp*`Mg?JLk{uiu4fQ;2Gz5T`ane-1~O;b8gySVN1;dq zH5W+7$EekPj)YqApg>!-(C2US&nA<8Odf{Qt)b_b%;u$XwHZt7Ek0EDk;-flp9`H@ zbJlWf1w%1WCnCR}3%$F3KQ;J~PXsdu9P#Dr93dQN7)3FS=}U-+VRIp;)_qWh0l z@NFz5Ag)@<)bZoz2Sz?{+ClD%LOnuGe0kHne5Cdg7Gz^g3jAHIC@m;afqE5S4WAp( z`w$hvc+Jc6f67rAd!|#Na05kyIN42N6g5AB4d&k5{yLhqMz|(1OVHfG2SiH_TA1s) zm46IMzJgy&@{Y{=+->a1?n&IRBX zU3@kWa#N)uE=zf6P-`LJ6m31Hpa0nmUQBCf;9E3g)pkm@v^^s~Ocbkdbrd7Lo|*c= zPJ;RD2UkZ>&co09YyH*%*Ves&y!Cg*-L2}JKA*qX!v6c5Wmkq4+C#0)+qcJ!9V{Z( z5ne^ZhTvS{1i>969`@{-`)(&hrBFj2?@E0o}3cE!G zm`YP}?m}Q`wZsJW0NdK=N|vaQiJ#f|*5NNU<3IH)2He;PukDXn6~Le{Q-F4@k`6F7(6%$v>Lv zK22$N=Z>J~9@WLq`|FbUe0+GD2pCnlWBVQc7{KemnGcdp_;JpWl7P3OQ<_b28WuCm zP?y-M)xzVMEjlv&96dv{0uZ=zntp0Qy9^hT+EHH@+@vRJNs60zo6$w&W6$8xq50bw zXSa|dv){HtO{XpSbG@1K%Ye~vUCI^#tP_NoL;YrU>F%%kdSu7bO+T?W~3q^aLbugEm76-CsXf_i?Be!D&_+&@&{p$&PkU>E71%ZJ&M z^t+QXc!P=z*ji#up7P(Q!r%c#+=lk&gR5(^ALS*S*H^-zU#VlgKd2 z6u(7o=3m^>_axB*2MWmqO0{)EVZb2pU&l&FjqF8QO-0kW3U_Iv$8J=LHrKO`m+YQq zCD?o%>){q;sIlF{N+h{1%qB6)Xd(eXJt^BKsfVhr09F#Gey29VSSBA`^PN80Fh(?o zDQ2YRl}EHPmDH#xnILWYY*Xt(+S@^AS9@ZlCW$2-SUNx!Ov@0bMN8*R=gLNq!X%ER z62#XY_Y|krTj!%NS4`|N$GHobtXymyJJ(m>zqd54>wm7X33)`iYjq`uzL=dSWc@2qeF7asz4$AARgPAPFuf#{OcDI-qXpq zuX7S|o?Hbmuk*aj9OHIr)W?MgFy8O$W)A)1?KRMUvv}@J;j`nhXJThG@J~`%({NXh z42UzF+V`!aMDZ~kspf0ibm%c=b7O@>X)?mYJ^<}0;n@)9HSRe)qBeQtFV3d}i}|g= zCO@H^HGW5-4xiIi2mWEe9>{^}A)(VGZL`5;Lf~(;I$CcBqoSJsyITDujgp*W^rf4M zi#a=b3RnFH5&-&*Z5}f(w@p^8CGr`s^>G>8w4QzMvJP6MmtpV42NUF z#2|-8Qil8n(IOaTJtGqfS_F%z>ep}5h;9MRb2CB&akwI@lBR?U?5`-Q@v2_8`${!U zYAE9XpB#Qv^B7FJqxeD}rx_$~zICk6)T^CJ zV*8Ym;w^9+^8H}=&~4{JRCs&4^VtVAj39c`YFlE3xNB%ASFP{SAaN-0*4tHrG~OOB zDeYF8>?cMGH+X2gb4QG8kjQFh{_hj;sM@6Al|= z+g@fvAq`!DDN6a{r@3u01m%#}v64GGn- zul7>OsxBaSWc39{bYAd^^Lb8jJi`YV+Fm&2Rl0l6CFP6#2Q`WEDN!2mgaYNL103AE zFd63h<%okKGN4-8cb3E^gj$ijDtM%;uf`_DHH5a1Q%svxwRvxWCj_oKyn|pT0rM%6 z7qL`1sGo;KcM8X5nrCOZL8%q?eEUSTb&kwQhw~92QDJNa@#hn3f!d`?Q;MyTio<9~Y~;C(!Vh0?d_A>{r` zdMVDuz+n64H0RGhoa6|s9;AU7^(Lr4EHkjen27?GI$Rzqz7)P`%!@>rm;%KGC9m1c zOXvVL9cQW)%&JuX$}(u7Dz)8<_;rjjXBqJyL%0b<*-uRnNVq7*XuQ&u8RCi2`vjga zFu~Ub>;mDcF1pl{phr!gwWFr9U}=zdHPpXGnKIyDYDRv?CU`}>F%;UpNvl@AeSRxUq;XF_;7CGT>)3;FFde= zm1PAb5hy5)s)X}iArg_CISiv!i6uyd0~;@?X-eivb&43^gT*^`@e`XqAbwylk5rho z)Ov(V-qz|`XuDA_(^w?LIUl}{L3?k3g6^1R6?RT`XWZJV8e z5I#vI!bI{Irp`gW)Lq>uv_9D4)WIlWoQG9-hFvVs9bGfgiy?mkOehdSbTcMAL!p$` zDss`2f7sISOTK@_^!zCc=JF{fr;bl&DO1ZAhiq>ef5LfR7vGQc0jTSK8S6-XXY>$OQ?aXQ#f;jw_ z)z5_oN6S+J;bmO@(iaD4?Q9y4A9`@mj>n^*v($0gO=D3iPDM( zEI;D^JYq4t?D;Zei1QS>Jmljv6>Odi-ERh+lh6sa_I@#PT3`fnqCShSbvpI_u@)4v zk%w$kff=0un|R5cKr&lBMz!Kk=A@7NCgbz~dL&kYIOR<6HTNakhsQ*C(}CyqL(uqk zXj|1N&rdjK_R3>a*HS15*8uw03xBia~@V@ zp@&fmJNNnZMQx*w;rwoDFD$_a6L=+xwfT12QcFN}M? z`)ouu2Im(H59k|K_mr%V*(oh@&YC%o+A#j~D8HM@#L$F>m4y58@a!^zvApceKeX#f z&EAc)4rgjv{A`}tS+7sM&AMskmQ*IGV(`_i-{8Id<9dk!k+PE9ov#Rt8m07ZOMEUz45ERkSt#W-n4eih)<$DP7Sy$hBsQL()zVd z;PDj$%N`20e(_w~*;pd8o|HpxdJj9gpwZmTJoR?Gb0J95N8Hsli3YIuqFj|O=XYt@ zyVVaa_3#~Kip+1Q<*c_ZDDalxM1*(6G>Schvp+Q8!&1rv;M4r&5#5Jimg4-ucV^?{ z8|#PRq7bCRMii05{K|Z3)f~HJs;#hT26zx)Z5oOg+z|P)EtKxiE9hUJXk{l;ip~+2 zGQPv=8XUpoR%_g(L&oTrJA$noYu(Fq_oth zrad4Z{%!g~cw9}owk9`qC#-zB_(!=XN7*OjrE|j9t=FKx(RE)1W){ExT@HOe!^d*b zRYl=tDuN*!1$2naWF;$8@WXG+GNp~ibvh^K>(P*Ax{^=^9V~>3>zs=E=INK52?8W) zR^_`B=9YDZ3|bmp^5=&xB9D*IsoiEkYiv%*Q?EgjOIW$@lk2*)F zMY9DDGL8}yP_bqRRk#=cOKbp|jYO5ve=JL7zHPuO)~joa(CNC`Ot?7BU@nd;Wdu9s znEIzDu46_2L%wEgv_*8cWo*!cbpF{5Fi#iAFQJo?&ghZwM{C&XD#r-URwGmyTh*%2 z<3Z;CA>0l+s8k-5@O?AQGa4poD??+xI!Y=R7-SXWO6qe0J{pz3aZN z*Y!~$e8^}H2?ZuieoWMoW*pUPyfeXD>*>-w!XDa6u=)KZA$6=49O2OzTHnk z6;mGb_cK}MgNz(jb07pj^xAS5emgg90CV=wk_ld#mZlzg7SZY)+m?2fnmS+IfiCj% zlSL!!0FE$^ryfnv>&8HfET?2gPqU_WvyC+G-N3eo=G2Qi%kf^6qOtToGaB$^vf;#Z zOQAG15HP*h7z6D$Rke#6?AM8t6e#Ie~d1cl`Zhkt#m#-G6)LDKE7_S>^`&LFnK_}jvjq=PWi{aER!9lJke~CmBTX2kw=q? z^THmaKO3evph|(Iwesp8k}h5xyD$&iW*dcTI)7@qMBde8g{oxyLjHJ%qCR3y*XI|` zuuD|Pv~Nf6sB%{rQ`C5=c#q>-i|(@b8-Mo30emJ1=dQ#@;*Y#^FDh+qIzhOYv9iWu z(^M#pjecBHBDgJi23t3(Lm_wn&cvj{=U4qdkR9pGEubDc&6=vA?<@m%G4%Xu9H z$?(?&MgjY8f(+3kCDaf1@kV|M;K}>YLr$qqdbPCUrni;vtaL}#r6^z8&=`Oe&$CE! z@?5XSIC;|d$W3;5NFOzJXt~}uWbrVkp5YLVN_TzKC=E_vW74wfWZCttl~B!a@|5_1 zpk`}}4#_c|A@gkR17X%Xn#sEr9@t9Q3#?OhApmP_vBX46jba!Qa|wfGiV!7zhYoq2 z{3KJ75-~#0C!Fn$!27<*TP=g3m*R8kFDLmYZ6vKHyO13!B%<7@2Kb6PJyLJol&;y8 zDh0R77^FlBMd<4GnEJcQ#QC3NuF~dX0kufixt&wH%o^yhJa%(;0^cc68~KvjkTRLs zw7WNKW{*LW*JGpd&) z$8&u(^Z)xoylmhe@bFbezuTVumVo#`^h!(n>pQp{K(x66c|b11H#6B^cbSx$DGq-8 zi%WxkoO+EVXw)UP$DRbH=_Uw1s5^qxCG+DZJ zwTO%<-3C|fV?|rH3idm*dD1S)lz?H5%XN5)e4V>ooxQPoN@BB1$4@e1&#Ihc1#vO4 za3Jt|*zR<%`N8CKQU$>H;43LcIpU_+a|-vSydh-C1a7yiseF`1R+fnIQU`Bg?wv!% zxaqnh=IY`>J(gL1B4&I{PqqdQ{T2C5YWdZ70rpQ1$_LR2C#Y9qu6#>6HqN2t#ALGt z8QsC{y%Lb#dYJ|T;?D(D4{4>yGoiPh|4Qy`*}Wr;dhBc@aWa34rX78j6}R8x$d&ug zZE7o;;_~8)qS1-E}{NRSFOajGSc6C{;n7{R`Hi-Ex8NZpYMeX>Csy@vQhV+rN|kShg$5bsJs1a7*5B8 zKLb39@xWM^!4MB_Vet2oEs1{YYk|zCF*HmBB~lwaEL9T4#St4G0gqxET^ycKhrNCY z0Q}|}QbHf)YB94ei}KbU4wgQNmAcVC!jay8e|gH*nd49Z9E$BWs>CO>HG zEkrVIA`9*FiSpvWOSKN9^U?v$T6%#qa08>c%%s+QD5t8iXn*KTuzb!Vfl$S}TXTXA zX4DEgHX_#{PgK_<>>ER8Q;&U=mTMzF4 z>=Uz@t&}`Z~!JyCl5%c0Mt%hVSMrPxP`8|UFeyEW97uQcVDXOb7m21h?VHI z@;0BGM%nf|5VG3<7GJxq@Bftj+GseuhM$v&5j4nEK~4$#Px`Wgez4;rnx{fEM>Oet z>{4WLUS%8kOUooLVxq-^L=>dgF(#r4*Q5)y`dWt+89z-Y9}t|X;N4dq%?d&m(_W014!|ns(_WA)`p5)0C?U{GCwsE#>`QI3-hK!B$l@qAEWg_2qe+}Bz{5WhFR;9X zNBe2adnXomJKt%ER2mt`pik~TF2W0NVw*pT!>HR|E0JeTUEurA>>YD!)LBl}GKn{v z--s!Wh9$k!TbqiQU)&8ZO*2xxQ0^D=V~|JL+MnhP{x%g^Kei82eij~6r`kh$^o*E* zHft&*O^L#p$%x>@w0}#6^Aq!OCH!5Eyc@AC$U{vO!nYRz>-qf0Rg)g%xcUU8P2Ols z_AH>uXJ1Q%=kP!uLP<#E0Br7(1bTH=FntczAU?I)_!|w30p7I&dr3Tx<@&E$K7MxG z<>o!re~@ht3vym;yv_#KC0|O=$}8zzncerV2)0xJ`BR$;4m+_en=y>Pq8Ge$$P~z* zo7>`(IjvyY-exNBAF6`|*g5%_a`x*P%waOK6N~`x3C=kKGNb`Eypk7$5I19^6gwaV zlEyYTXYz>`HfSu$2sEKo_R3)+Qcp;&FYTImCJOqnqoc+*sj(cHV$uT*fzrS)`32Uph7Acjg zLrN#PvI2Bph2MNV9{W?$HC;Zm0_DcF2&~m|bbJIVlAuk6=6*}xI5_;8Mulhfgg$+TXCVi8!7`h&b|)xl zrJkv&ZpJ>WC@c3!60VNP%Kwb1&FQdM7+r9vGo_1z24R`O`<-+X@C-=I>m06(E)Ur{ zr%)(rrLeiV+B=*&Wx}?_FiL-zLU_p>jq4=Ixrm5cHAh`AS(Y zwC*S&P7AyoW5^YjqHNYhX8;fLVBUP8e(O7@PfpJLH zDSJOfDYaUvwqcd%^2eX+LW+w6o&+l>|52U3ZVM0PV*dXSiM0QdLnsJxNOEixFYDv~ z(Le$TxeaFmw=$5BDFQug}^oV!+W?UM~u7bpkD8ot?y@UHDRUA8> zy&Wnw74H?bzIv}~{mp*Lko=HqFj<&mqB`n}pf;#FbDc7LElo5L-FiZl&&TP#6WUg# z9a+z)!=n+uvO@Hzy`Jm@AOwZ&$<&_SB3&fr0R7b-cE(;kp8-F(P2WTx`^HP*M=7I+ zMVT@sAwn7E_C=?{V19b~6`b=q;b_}k=OK6f)!If zo`$0g28lKI{54y@u8~$5#IADY?$7I#tx`?$H7SLDRnuv)y}GsbbDh*0Vg)whnL#b0 zI$C9Wn0$MFvh7YrOfa*=*f_%{xH@0?s8agU)JXw;!$k6YdY0U9?b0JO+pp1h3H4SM z)id?fNLo+1x`tZbdo5`;mbm7~hj1a%2GA{3?K!7D z6w1%IcW8yb8z#+Q+iQ{(!#cXUtFNLugCOS`E1;el?&Zgi5qkI*gP<#^wet_`MNeP8 zwXYx*w?85YJT6Ej{U*`v`dE!~O(Xk)r=!k5E{dYJWm_Cyu5_6WY9V5dg=6I*Vq)9@yN>D!Ou#ux24Y9v;0g4312^(2? zy5(-4p}~9{fg>Hu)hF~a7K&7|zf(7@=t-P^!n)yY`-*2t?6&ZI zJu?XRfp1s&6HBHqd|R!Kw0)k6jXhcK7F$Ot-Jb&W#cvJ*X$FocFG|izp4XpH6veuPYbUG2Q#3Y;LuG>mo z-J4qg(utN5fPLP+trq`0pzZ7y5E^ZK*oP8->sMU!NzTO1_c6t72rnVF=3t5ZAuNaT zVhj(|EaBuMTIe8Y{)*n`oxd#|R&Y{)e)s5{C;&2F`FLylb_?x?nk@nBwYYbq$9R(xoyTG z>0zNG+qpyW>MDbvymrrI6EB`uOF7S~oy#kY-lDO}8S*MIOE-@~85s%BN%{?B2NCt# zMkkRP$Kq4I7cGl<5X~Qr*U_-&<6J6Q6bhMSylRdZhqADC6vMEwrl#qQn3qAU5@@Fx zuwaplX$3AgE7P_Fo}IEjmD*4~?_UzK)F}&w|yTDu03rlqEHMc`KlYun@ zE>lro9__uKlI9l1ydNnQ;0MaUfPaUs3P;mu9{%z$xHu?@!V{_Ks_E}AbCMji3~f_sJ? zPr$ncDaYFd3TExZi>DSsJwnY%#LKkayrRZ`wA`J{UTF%lJW4XlRjb5lolDhDQ*n$> zbKlRE+%@$!$)?0bD{nFvkE8i#o+&7_D}^rPocyp&cSPr{wQj-XnskQ&wyoappK%c9 zh=w%}tYLf<8^ z7@bZwA&ivGB3m}mit!)u?e4TJaemh&7@Og_R}1kkJ8!4l_#r51zH6vY)`ALJ;jYBl z^xmqLegKru?oD#9-2D`MPa{>nHoiQHF1dk5jhSN3c_3b)iKJ7_11aFC9t;uD=}qYH zdD=BYHEB;DTI^Q-`rrlt6!u)uJ%(N@dYbLcODRy*C zUQG=O2=n8VJvK9#s4fPyF16!(g04_1x#iv}8^Q55=0TaoigD_1inu~D@7d>2|9EXn zw<0O|mNBfSOgb)BUW6!h7OF93E2Ho}Pp~Y*S_=TM13fGLuBcOnG1&cGT75_JKmmX& z*~{>n`$GzI2MC)o2Nb1>!_~8#SP~vskp1#Z{nnR}2@BFun9-)X_f zGzBnD3cx+S6q!`%d!f*kmAf2)VEm)SV*1NnOMEeC^@zZL5Zt#1djmha=twbsPf>o;Dfw^8*$N#!0M4O z34Z=6wWoBUNDVq$|HJQe5Jr0lbA_xhkEl1nX>-mIZE@LP%uLCOA#~$7R10``!0Q@f z$;EJqc^o4+8(@Ek6-v{=HDYRRw+GJLo{_=Pr1lDSkLU%u<2Q#6RsTn*W(Tz^9d*u* zt7b|O-1MZ%w}i*0SJ$+*z{~W6KEN+-30Gr^sIKNHLa@AKH5kjBt_q3&`rt**z`rfK z#nT9^>9xI~fG%M4gAb9T@{Te1iB$_?g_K5#3*~7lmyA4T_;+T~m=U!_>Vo2Bp?Uh%*FgZ_34eyo8j^eaOHn;8jG>?-cJRPs&`-EuujD8a|-m zQ%`m8B*}%&ILV?he9Sm8qu*H10`}nFGz$aw#Kvt}Z=K4Q+PLGrr~E~8LgDb&adina zxW83LV4?H_?LWW(EtuZqWUyvA^ibogXrt>7pw+nV!S?;M3>+avS<(rme2f-(uW@jg z9rP^+4UO`aYKrYZNhaz33b$d+c28cj|jIKuEz;Mrn0 z_BY+pgN;rF3$x{RGI#z#UvhpL31+Y*+e_n|^@on>d>#d!9+6IJCS2=508qGi5x+1> z#!G{Cg_mA&7`rwaQmLijuF-qG>Yi>TmOY1d7!xDT;@~aHz!D2wL4`%)8-;SNkIOlG zD0(wlx;b%fl+Y1A*j8k*#qCC!r3w|H}KL59g{=GVSs|{$}FD#g|L&+7yPFurv z{d97la%#KGNUn{!M?dGmi0zLET>uGrx(Lt1dDb+7>4p1Hr$4{;_GH)`U^WE^u$$R8 z@HZ#=p!UnnmT#J8+gm?Z8DMH4;Qj}yl$i&V1)U|e)Vap69FS7!5KO1oD=s*M?1#zR z%{y$+ZR-SR>;Wmi?C<}m zsn<2wH26K2HpszSWe-TM0%v_AXPjXWnKa`ho7$meBK=W7|GAj;Y*I>tdA+1RR>}rb zeL`1zezqWP|4rag3 z0Y&tm{{=^X=DH5ruyFgS9%P>L?B;cR_KX<}=UxH}i z_3yDmJa&?8QYw48Y`rPZHXi$hDbUG75lM6^3tusfY`_}=0Hj3I#~8N21QzwmzP;@rYm%C*-uxN8WT*u5>_x+6A*fWJC3W z`&(ut{6I5m(1f6TNP~yCrKg9KXPh(NQ>~hqz0tN68!Vz zu0_O&+^U-$AWqs@pGE#9t$q35wYt75NpYvv#%0b7fz;-z%h!7BNLa3!(eaKQ#Z;|} zfxFAQOJ{~<<+)F54=RVQm}`Y;>`|86Z%J|#kAoily_oYsGXs&_x<5?swo9fzuX3Sl z#{`l`0UV>x#|Azc|7c;)216Xp^z@QJ|7ht}-jXl_aNF5h?0{dSbK7N{uC}F#0fImO z1ml*O_%<3rWw3BZjD~SEo2xsJh&u%OLum_ZNhEm||5F+?O43W%Av7CZ$Ax&fs%a~w zl?gR9pJ%jP-Yec2B?AFqLOi?)=^=#Vax2zpNBJ}fEybM&@sV@$@HD1CD}r3)pPPxHT4|=z7Pobvc=3A&xljPk(Yl;>V%X99@MeqDm2lbFLb81Nc zzm7A0=5YlG-~57PBaxiT!x`P@_WTVwn%zB~&8H7|Fx7g)mm+cfS=(&p_|3aG0C}U`?48&b9)*U1A^Uz3 zX=Lvs0AQ+aR|+F-`iaYXhM=5{6euzR0Wf)p(~PO*@aU)?FH2SRNWiVUmc}XwP;w2a zM;=bm=aZptHJBL_*Bn=1MK4;guBaoSQ12)8trY-@^G+KkW5I3^L5ayBNT#b$qv=fXyOK_U=|J!2d}p6$r~KM` zLK>`I zGg$lNV*%st9c@9b?EGCGhr3 zvH<4fkH5Snpfq3<7qTB{f$?|g0Q>Lg(Kx1+26MfK4+3tCzsZe=`qBmP__Jcq6#;+U zhC>jFQ9$5!DgCZAJss6q1Q7sM@Hay%kxyP;>#O-F;o?In05A(Mcvws!Rs=n>HM;Ve zrwKO~;2tUkzTu^&UBkG|e(JgkU;p?d$NT<4jt7qbUN6ss)*rSWiTyfj$DRe8>p*Aa zHs0lNli^8QR1i)yF?mY4PF`c9f)Jd1GCnG zMs<5nUFCp@mh(H^>V7%qUd6hsRcj|1F(qy(IWlWIsUB_{OFx(sx04HKUUDyAtoz*$ zvD9QOrW~7LrWOvcdlDhmmG#3K?@~DKc&*>Ee4+ z%1x3v{!3k<5#-$P^=;_8-tjPgUUH7R8YQ>i0d@eI6S%G$CsPbv0waVD^K2oXl;wJI zV8HLcHrNJDFlrH!@e`C}l~a~B1NcW;hBvtd*94oG=y=5SLwh#pRkS=fXPo(DXO-MC z0R8b7bv?!vqjly-?*2=!x5PUhc$TlaZt!tdh>44f`_nh0@2?!D3pp#rE9PY9oV_Fx zYp3X+6nh2cZc&ruVb+R-jwtenQV;5CSnmkMd^Hv~N)&|Zcnh7-%W6_rojGYgGdTx_y7SNbaZG1%2kLfJPHA^Z~1wP){ z!#w%9)vUUo)!DiK?*6{Yd(gqAM{b!ozwCZa`At?sdzh61AXd^d zN6A8mi2su=tEnOp95fk{O*#gY>Qp2JknKLIR;nRF@o_+9kkv)Xd+2ELJmEUGNiTb_ zIVY|YAQbrwttn=U1xzCwHg#f@(j%q}l)o(=b4m|1ehtccSed~aD-xSqM~?XkobHs< zkjcaHK7GxPPH)dH?I_WG&#c=uKD~kcK#dk=W(Yws#hERx#*t8y1t$Uiy- zv&Fg1&9U!qUf_&&@{6fm(@Hi})X`UVWE*ZH9olz2)W|uiJ^KWhU^ZJs-q&;*T)zut zKDVYP%v=DfBRxQoB}||dZ_p@OgN%Z~T~ApDzCNrqwPzgBCyt^sRy^^aHooAw>-b+~ zf|b6cfE480Ci9c|8Wu)2GNvbYD9Ps@Ea*H-Jv39{AcWEho2M`!Ewny`&?#N#lsGbL zv9$8gyGhnF=={>c%fB}Q8~1%=?>awX7gb4Z4YAhCU(?DFe!23+H$E%rmefXng|HdW zrc%+64U_MS^EPh8R_HkJEtYBL%wQRe3z>RebVOxY<%VUcb@<}=)3rxpr?&H8ZP#QX z0rCzZDFX4}VF6C`;D}TqRn!>AN`zEoe!h^Ek8GQt)>DShl+?ffZe8ehh!#T`IhLC5 zu&yyyvejyB#?-#;^k$ZS%o$teJeJ91@0pRlB;<)L_;##tc`&=yC2RKfFQ&_t!VyIx%-JD+~ddAAptZ;Ry;Nju`e1wj22vpg)hQcOl#uxCe zCiY|1ou~i`l8j91@MP1y@`Ohmj4u#<&Wo|tRH?R%*QOGKoK!+1%*J;t9_aw+B!cs5 z6UP{{3eeK>9WQ)#d4=w^EiVe1+>=D5Y0 zyTqgfuZQdKX7BqJDm`EuX?VJn?zd)G9cCh^m($&J&mXpuwkP~-lx@~KXo<1?wRvmq zr`f;1x^@jbYLS+8Mz4CjS~h++_Ys=u(%u=RACG*v-gRpjOGxWw%mT>cQ9ViOk2;o}~D6#;XH^zoN%xvU{ZF@C`k#x%kM34zt9YLX-k@@{CW0IULWRC6Hu**KB+;9HtWPYU!x zE%{_Dqr`(1zpgN`L8#U5MmvWM?>}S(OqRoydEoBuFXqe2N_IOhYqIovEXhmM3JY2V z0$*kd7L~cP$}ORgsPB}zisxhwZ`Y)1I@V5}_B8q^H&9yNdB&*p_x{b*NsF|GMiTq2 zNu4>CWY;U_=(Vw0Y}pgKCowlWO45(96RHQl&li(g0Ah5R*BpV!8*Vs8UP_DB=oF zt4aA}&R1v+!NE~~UPpeFy(U#%`_Z-mPZII<#=OLRdC3kjDu&+pMn^UUWmVlNmu0{# zhgP%L)DWkNyclah3bigp2C*e8%26e8P?tgXj^WhA$3c{+V8Aw!B6|wtZTGPJG{bHm zat!gMAHZktJKly0|{SERb#`VQAc zwB)0!)Q|g=8NX2EBCJJkICen2fSfQYu%Qo%Y|!GZR3bljf${PjB`+y-n_Xi^`IP;&tJ6* zIVP!uxk55>A;j}(v*lNu8W%P1g%PBB<&2#ABme;L**z%iiQM{)Mm|rwiSk-flkvO( ze?Gr@p}SxvX*sh#1t78ZGYJ$n=6dwpcaN&?p z68S`iY;$4&!0p#V>Cp?m6a{M8-O+|oUO^!MfLE)*Gv&ttO1fMp4I)+C_2QwYXLG>> zM;%SNJo%4=$XLZ(W%f?@F34gCnzJ-q$i!Q98e2ro4&h4}FmC(FYxGUE@Kp+ZyZK4F zG~15eyj7wfu*2@pj$dzynmV6t6{V0+&#lx$U$z~dW?k`X;H*WP6GlXSx>A*1Rw?nM zY8vdcI@t0vkwd!0`lg1X-E~syTv-?r?NDK3Hlic0)>-_)M3uL&`m_H^fB{-&uAZv= zbNQ}1-y?$6b^OEe&hoE8<@Ji+f36ObA3X0kDvjI@ThEv{P%K@2)+$i*Sn~MvP4LR* zQHVXK-KqH3bKZ+3i{%EK-ya*tzFJh9v0)uzfXw?u1JKt` z&;f4xLEs+R4{u257-Ec~jmh-;C?_@C^U_}fATU#2XH?1qFbBuyTQRqN0R)cgFfycO znLf>#+soNsq<7IHnrTrMZ{k@kSbvGS7J1rq~| z>E7eC{52X(*@a*p7K7)bhbq<;B-ox&VG}xlWUDWE6-DVutKBch|L<*ENAk}vBd zHSQ+S?P8Uw)O5UcOcaX%^kO_;Xv{EFP3SrsquNRf%zsEx)@Tw8KINFna(>gK{7>(PBwWzS?_E5o7H+Lu)p zJM0M(D{4@cD*66Q_JxBXiIpM1y&kulE#k(Bj6S_%6YdxDE35Rmo9@@=^|jv@BW@L2 zRz;JNiv1(zW5#^E0{k6AS+HNDsF*d?e?OmSxcfq#6F2_9*w#Ex3Ch(x&pz4h z@TnB`Old;5G7dWqw;-If03cJanDcdsEu^Ll$kodD9)T-a2JZn7KQ9e;<@bH{#UqN9 z?(I+%-8Lx8^vjpkCYq;GC@JGyLbP&uBd_Xr2PUO zWFpd>$;b}_TEN+lJ-u-!xkf$}fR}~B4!idYx9zii7=NB~oZ397Q)qUhKFzehB;NS8#h5emD&=It(d=^L+dzcw zYb?c4uYXX4uzvMhY7E`gIL4bNAjAg~PQi&qkeBht-UQ=77v#N<%57P1ev}PMIe*~$ zN(^9sDk;qUwc6F%?FX__!0Z$^>MDG5{sY<2FPh;Pk4lW&L) z-p*)UfwQMZD)s&&tYCmU@ogX-HDl6e#hzZ1HePfyR(k~38X=ykN5+rBWR=U9*JB&v zAl1ugMQ!@#0wEun*qo)SHS0T?GPn{_F{jI6e!DvUTsJwggcrS{ajuO1zkOvO$2xcc zso9{YbkYw%3L<&MrZ!wbi>|$xpUwC5Eo%30IZK5{A+|Ft>LRH== zPNwMe;gY;kt^lvFo7qypd~2RA$@rL59#7bU;q70`6f63(g5MZJHc0g+atwvg=Yi_t?Xji>cRKWsJ0tZT#5aFiap zQxoIU>hU+<7c~wfD0!-M3sc*y8D($&rqSKI;E0j=)kO;d3O2Wt!?^R!h1zl5+U(ZE z>01fz%4G^TB2w;G*e_N=;J8@fL$E}oa<=^}$~mYc6KTzkpCuUR2pxhR7G%)=e6=Q+ z-J-k8N>MteETtkLqXrno4>%*|P5f~byg)jf4ze(SnTlQ1;=b{lpv;jZFjJzjxAW4h zKHJM<5SI8ndou~-US2Ju{pBT=F4k`H{vJSVze8?om85^rJ#%n@d3Ka-Hx;;yGo5Q# z63Ry9evsxC;1rO*{K6KbC!W?8v-vVJe4u0<;u+X7H^TCCj%R^+<3B5l}slr!}xNZXkYFT);Q72BQ&Ldf~LD(&9bvK zshSE>H~Y*_d`h};?cPL>e}rk% zEz>P)YOT<}(p^*s$f_*5+up8tUZlC3oKI-ZtVGGDH`a*{==rYRZARyv`zcr<5}s7C zU9z+;d8HgM8H;K`@7C6pm)|w8`+X~(c>ae?$fA38F38KE^ga!{HMardeMe^R4*81g zk=vsTKWAYXEyunDCmR*D)mTP#dHTMou)vRturz%+a4-nmrzN7zU)fsc4>YZ%30`8% zdN*<94t8zNEi7P^*=JYYQtQi@Mm@oV?hC8Dog7aTZdpsGSTAuop7j6WbR`S%V>)aRX;B~ zWp>OX+KU2#44pPiXk+j+DLJ?r?ga#F12KYS>6y*(uxwKT2NL{)KJhXBkw$?8So)i1 z{w$v~1Cr+lJ^$RdcVXk(@ZYvFzv30JBX`Uz7c2dU%OJj<7a#p0TdC zkZP9myWxx}pNA})dA)3~n%6^0?$L*}l&w(u&rd_$TyeX;G8@UK=2H1Rs7_ z#=oqhtV5@q=R`0{-aOk#wwja={pE7%WhQzIfGt8ut+dg7Q||1NURrw3_;6kB>?zFE z9FoWj|4+oEH|By$sTAC*@NQ$vXV3L>At-Bjn_Alw}qZ~He=+b z*UTjKqO2uCT2{r@yojEYR@5kiTxoLsBiW##@NB^dbIa0}v-#Lw6KEvDzl>ZV z%-i1uLe7xKcBk_Wz1f-u#-5c|WVdjwDi+tZAxY``c=2+xi*ZC{s^1og+rGcu3#lo2 z`~AvVo4}2&nXY%(Q?sqm)+>@^knAbc;dJK5>%LcG$@u)^NeQkhvW0K_Y5bhV0`tH+ za%~6R=W%rHw(-N~xsq8}2I9y$hD~zx_&H8N?~a6s_10gck0>lTIfJG`K3G^+N`S$0 z8z>Tv{d;~yOL6(j@t~Mq<5W4$Ls`WgAO+t6Y}HhLG4_(5f;x&FUI>>dvsmW2UV~`L zaNqw!xGMHL7c-_AJeyrZiGLb3ka_eUgqwIAD?ekS^5qwkNhIni< zmurPk_u0Y$yn10CX*z!armf^2sLZMG3^tj*7uNLd@~WkQ$Eol{KRfP)ueN;!$H)<; z*UX~UvmZ~gNz_&h4|1)geKhzolJV)!qc2OWH;`XHTc&3;Yw1HAPe$DN&g=XTt(wjzn@K=tQfE+!KdA zxyRor`m(f?D8<0;O6fpPz{gP(>`A!x175VJ&%`p1r&ePJiu*9*f0kz7M;f zl)Fjn0dXjsO5i#7>F%!!!3mUxV9Ke|)S}qyR@8J2S%#pBNsRX;&J8dB931am{Oa3! z65;RGr}Qhc6WH(UmiQ4S`Eqc2 zqznMV1NjhVB(dY6r#!Ov?Fasq1`Vsm2z!o9NvMvsJVLZer21jBQ>0hI&lo}3+TP_) znqV=W4_Wm3@jS$HlMmioK781DX=R9H zly2PzCIhQo>N3iblqDV{N9A^Q9&5o3OkRCXWD-BgAMko2VC3$OuB~1+07d0Lk=|C9qh&N(B-?v3WGXte4W!D#jaN*+r~Vl1U2zi;4J zAR-WmX(5DcTGxIYLKf|yO9gH({oKPrgeA&{U~K4dqrKW3gr_GthvirW=#wg|= z)i;M*2APv8UMX;f4euZ92Deb}qgvEzPopO}XVz5B4+Gb8`F?ojO})FxW0AE8C@M7_!MOUpL3_inyt`n<4;InFLMCZ>`bP>u-s z$PzXAN}Pn|G3?G~QXydLh`a2VZpUF%Tf zhn^+`#v!0Y^ZEs;75qp6o7u?xiU(VsuD&O4tmbMiqPbSB(lm))B+*Il`JhGyKaIQe zSrfdcvW}^|E)m|Tw9zmp(BEX8BQp6YufK&@K+||u$D5pyf~s6zNNr_sd`P;Joi57k z3eM&mBK=!63gJBANPn)ZtH>1NJmz^5%ZiUh&esHO32t(WOXI3UC#LNjEWSSU6m}fk zKfaBujcpU`J~n)B(G=V+&bXo&vo3P@`dUq}FrwC^6*(rEY3Q%ib#u#QuQI7X@9QkL z-(^1;TDhck_O<@o>niTx*b}l#D9mV#^K987TKmEYRsA)X7jv>7uOEd3W;4mME&=`g z04c8#`0{KUKE)uBtyP7$x@#bh;UiKAjbbibvOv~#D6tP4(lax*l6;bV!tjluvgNcc zQJ4Y*iPCf=d*_}o6ezY=G71&2=52+NOO#YCman_R^ucBNxry3q=|VXzQmGgPGWNeH z;rph+?Bpey(PiHhA~XdZ_1oD0A;UDRz}2`7kW#)VR)R;XrXe+*u2_v z=_w*+f3BbadlAFCC78foEoxgBAruzF zNF2pxok+I1E+EsC4Oa31Jft^+?dW3+N&Ky5bb;yhoigE;O#7DmN}x5{EzDgPMY3l) z0Hv&0jqQZqWM^wiO#lTGAux`tiq}!EFcjFfozLLqB~DSz3)jwC2CAdhKNYR9e~Py* z4XHr#5z2^_yAg}ie~s7%=fGS zj8u&Y0RC{2*??-N^0DaYSafHCOQ}n^5F)^n(tEVZUB~4jYSG|?VLnGCrbhTEKeK1> z+_xgdEmzp_zI&}DD38bI%V|VU-IY&gf@Aj@>hx_~3(v{7 z5}ygCqiPu%cR_G)qV%Ufns~qGvi*pqia~vMxL$vFBNe~uDrV@W4jR0<5#W4Bii96^ zo7fSZgc2$4BYOjulgV#zL|7x(V}G!GO^LiLfNB$jm*`7|gQI9zu|pMN#hgBU#c}LZ z#qmLa@?yllV)7EwmRr#dPxTm8MlT8B@iGl;-SaC6O874>zYR0JAVH`dnTW8GKn z^qVGi>ZIxns$gnrqf8kewL##5pPqbqP98cWqC|?!#QFwFy`K1d)#R$?_LQox#A#d6 z#FI*^yg0#;tYyT4v$!*?Bip3r9QdLU{H=p*e6E`O!<0mmvAost#oF8v2J{xzx=U6J zmCIb(G>L8@YIgDSFBNQ1)6|8#E4*~U!6kcV$@sqa5_-v5=Q<(S{GbjFgLX_srec=w z{5RM~yBCIp%*y7!s!!jUdt$VWZHaL^7b!imQFZz}dpF-JU&MzrzK379Tj_EgFMFo?7WD=wD1N|}>9X|KVWmAz#eKJ2YEou}serGDh8j(lc z!3Vi4R_1R6bbRg}K%EE3{nq01BG=DwX`b2nE6`DOmw5>mf8XWswN0Lg^?&|`>iyDUt zX^kUJ+zo^nXxbGBUSy}0vnJ}oETRbLJ|>7v)|q-txIjEwiH{{!l?WAIK&fI?D0>YE zag1a1o%I)P*ZHK`o3!edUS!j#Y3*t2Af2Weil~%zj3UL)_X!b3BhN;4l~RudsU(#S zwEd00iP~oW*)g`9DYL0RHu7!2fk0uHxPa-(^)8f=P#W>vT4nFHV*i>&PIc}jIK^54>IWXe){?G4#veq2d^{o z`s}TqddsJJaUT@j3=0|FEQFY{c+Ah8ZLAEstk_3D?(cmY==kdt+x&k=mg&aOXRILJ zm`;ssq=D!skS3M03$jF(;XRq-Y9nhgL>>bgraSmh43Jnz3~0-wRfTkV8{JUvmOzUa z!5I20-9^sAgV7OZq;ot`0}KqhcvT5{j-|%sN_oVanH|BrBBHXU%#x$r#Z7bs@CJAe zDMU(~qBBGXYQLxDpNB&u^hXr!BstK{Lg`L0AmVbFKz8vfVSWEFQjgBr!i;lL7ee1k zQ|r|i-@{EMk>ucssafJPV69%KY2f=}a4g4I<(mbf7gf65-`!S}ACNCCzFk6fXl@ zNit5>6Y`AuMdfVB}MH?N==7V`toczKVZ9p{S^n}5!DYUV$O2$ocmpDEC8kzh7Y zx!|Ky#I{Ykz@Zox~$D;@GA38CJ?aZ(LvWL~ySgeRo)2GCw1((Q94LH)9@bjFViqSVm|K zar(e0B4zwyb?ov+c%l7arU#UHI{8@d((j$xv^-9C_X07fqWpVq-jsEmxAZ%l!wzuP zQenfo#C017{p5AUhlEz)Txnq@PleN@W;kT==oCN+o=g| zi#8L9Uhio5otzr`BCw^bOdFkf5%jFuaN$J$0};!A>4D)`JO#iKSaFhy97yv4@IUr( z7{)|WCP(g|?{I*zX0<4!lcbn~)^k~Pbs^_z@ZRoJqAxcH8@EEcx2Pw`4Vz6+OmJm> zuLeJffi4|Z5=Xn+FZ55qq#W0$az&^=0rY$^8xCM4|6FXC?P0q^L>id52||j;Vt|OB z(BgiN1{CRA^G>Om0|&c?Uyo-GuP^pN?-ql+$hq4G}@7 z603SX8Wxd5gV4>Kq@t_v7tn7We>zslAZS0Yci9~7f;Z!}6iTKVIwq9+_YDd`n z1VAU&vT`pHH`hm(ug7Tv?q{z!FAAE!-ngU{;Er@+{UMsrqhik7CQE@Hm4=dBHzc{E zs<|SV<+W_5;2^mdF$UMkXn{PT8RcGg+dwqA1ISm zMbUGAx>4Z$pQav8Of3E=N6IL`-O-h)N?O8U;d&>MU6*6SB&$V&P0 zCX20c7;Cf?$6o(H1NHXPfk)xZb2GogMMf!`3(HI-GA+1B@;SOQFt(M_(1s=wPWqmr9TDF}!89o>jR?aW8W;eEj0fc^K6^ds%< zlDm63#>tLpd2_?R{GaGyw0#ta@59eE>Vm0mn7GRnm>Vk@mqh~Ra84(3{WjI4_mSj> zl48+h`8vO3s9L!n;g{i296q2qcxD!bP6th!i`tiTSddjp6yJ%#)f~XI-DOxN85KRD z>{t2>dI@6hR4q%zuLSXoiV0mGa&MQrtw%XNnPd?(^53$jWGLW}8td!D5K^U`967XD zB{I6MHL;blGt#Jzp2}EXaca~qYq869&SVzB)~Wn`N1I-YxOt=$pt#X?YQ~f7#2%z1&~X%;w!uTYt^+Vl8(*n7UADt^@uV?=}uq1dG8psMv_x)xd+3V zFRiyM@v?2R&mm+!8fbi+ip7l8$~!|KUDtf*Sz;yU{Rb8tn$)LutCTAnT>6Be)mjA4 z1>AV@EGGb@So)pnkK__CH$#*>EG+8J+ymj)r>}i*fWmUMaH>Qcq>UNGYVATtyFE_O z6ao3XcoD5FrLu)zR=Z4YPT^#3&1r6or|+TK3ld`=KS^bEUU^qDIFNrg2lH|%%u@jY zl6HzDYYvGFj;)NN7E6RSMvK*nO>1U*=cy{@7RvgfH2zxl5NtPczY;`ku8#HTJE@rr zwmh^v>*B$VvJt*|qW>@A-LJj@%M3!autlz{IVk%h!ma`L^-M)cRteZ-ow}Kglb8hW zj4VCoSdlZLo35}mDlEo-^yzsGad{QDMJ;nt4{{tq#N|5pO-_#%!=XK=lBETT1G>F_ zfQWznb<`Gxx$2~Y)g|+}zUS@+ze|w4P8T{(`@-P6eDtdP-NfLEOle&-=Z1k@8vu#; zb(4K4SshZq^JcE)0l_T&EVeYu0v(X@7O&Wm_8p-9Nko18peVQ=x z*_iEU(3l;L-EnnhmK71G2t3dLkbx%jG|))P*{BL8f+r=a6;Js=n2$sUv|-6#aY~-J zWy*gqqIp0FNMpnO5I^B%G!q{9nuM0ZS`2Uhsf*g>KSdRxrLnh4swNyQ>`;0-yJ^wg z!oiNYZhG;VMEX7KD`6zo7-^i(;ON{)dtl-r`R;_)GQo?PJ33x9V&`(^Te3F3R!5%! zF^8marm7e@L^0uuc6NeiU#cC+9)KZYq!wYP>*G(Y5fnPWO&ODgP(`fM^Bw=7^de|H zlzCzL$4oaq-jgH+eb;-s^pH`k*Uu?!t~gmTvp(7h3+v2A;G5UMk(hiC8W*^gAK7%)XGT z(t3?#gpj0#sX>;l8p*&AS(REo+8Q>Z)hm#8Aa+|BgNSNkpZkI zzKFMpDirO>bB{(4k}YE}>Agfz4FHIbB!-ohOL0nK)<5$q)6c~Ih5Fx5b=YR_%!SVO z8^H!o5SEj^9-wS=nys))I@_DU60Yp(W)cX37fR)n+ClG4SM2WOfj5TMnL9_=ZE?R< zbQXhVq~WSIocLrNfI^JSD%^x#m`ALLSi7RXG;u748QKJASh$hZCDnC{`>W?_J4?~% z8f6Ten!Ml0D9w&wSn1fNoTkb*A81ASNJ-XDR0`&(1zZ*MVLn`&=e>w2@SMg3sU%~614(HqCoDI8_gVHV>l#Ozv(CRnd&ekRJ%Yy!!dM?f_j6L58Q%mBSt3Fp?+v=R*Kg~w)2X`c`Uisur zt>#)|6qJwUr`u^?)bOQSaMKg(46|#|`ZK1OGDx0wwQfjl^TsL>9n>|(B}!Nd;8j0* z@(4#Aimc*o{6hSn1J=CAie5#hIl0O)@o;jm#b@iAu061~fS4=l@3b{$ok-b(`*#T@ zs6HCt)Hw_f9s5%!qsE9|d2IC3As@F8$gHSlO~6z<|PWB6!%oQ|s8Lc{+Qz zllk+1&d4a*Y@CtUoV@n`6GXA}(=+>fvue38idkaQo`qo&-PF`G3g#U-9vQg5nct*F zgqN|J=rrL(tM!e65swHsSvUCJjnGn}PQ)p{jyHIcqnpWrdj_2J)yy}r%;Lp3hD@>i z+RLO+PL+~GO9wM9OKy!J#61oY`Oz)@+K|hYv&=v8(FuWpYJomw4fdE(nMm~(J!Vtv zqcekOzHt@VDYcXQ@v=mWABjzs>&L|tXz1$~72;I13QM`3(uwaCYE9+lae~o0B0qF8 zTawt;p)O*3g!iqh$xW z)ENucic0!Lgcdz_YF9b=Pn#AmWs{BEC?nq4;Uw6?5-hVB&0~6OCV%)v{B6c_5q1y% zCF`EgLV78@Ir(t6?-&nm240ckGdu%zp|CWI6i~m};*hG#;pt{d$x5L>7K(V{rXiV&swpp}l zOXS#SnMjb|DsPXrb~$>hZ^3YF6TfB|p>KkxN6_iAYWY^9j>{qVYj2PE1gf`?a*V757PiaYb+1a!ce%}Hm16(Q!pz6@HAH!jXx90?}c zQbkP$KD0h{nq`X~o@8#w&&&s-Jx!M@;zxtoRck&ZWW_Ikr7EA==zMLrDtkh;rymcM zRInW>3rRos3c7&GeRf;4UTDq3@OYV8vTWT^Zm?YlKb5_moblTX$JdUd+i_m#+wK|i zD*Wc)b6i&g5i4NGYN-6+e&KoH*RFc}d8I)6=1(1v*w+sE z3CjRhU;Wot;g;2XcnsB~`@$_dJ58<%@H%w{_gv8YP_@WrGh$O@JH8-nBft40C^{~D zUl@1Nf~hf{CL9WY%c5pKGPqFp!LeI^{|DPAS~rG%bMHpPrDJdZdrs(UvJ;bh6^)77 zW~5P(q0-x;Bo604i6*oh(j)Xlxlll4NklNtL|G`FFPhzAJ>qy8C9=>;iL3swEO{69 zIr1q95G~fr>e*9xW-n44xoggaxS`A+PS?z|ALFWuUE$)KVl|qjjl|Ifp?JmV#*O}_ zS}d#}Dbk`gb%qIQ+U<1IRplav`AuOdJQ!^#v+fTH>nlFrW1+tV|A`qp%WjCIrSim= zp)n!{6fm(6me)!$_I~_jd<6=t)|pw;!fB^+?oYhS6=Y^sgf@-&86v_R}Bk(}a=jXGC4;K-)vs)w~HK115rJM-* zdnSgV=Dh#Ery}Umh8+mt^Z1D)f#;$jAepi+NB=Ho?QJ1^{GnDW0mF;RHUlx1`7(XL zI+RBCr_<_sDJ67azv4`!H1-=I7pF ztnNOZZae?zo68n_S?K`=iMSqGO?|TueBeSZO2|A#^ zf(9w#Aovrak)moe!9W8ApU_#d!RP^l!#WSkZ$n0 zbt_1|BKxF_2OD-K#3x@^vvt2*yxP@0zTGB)xOFv)W6rEt?~sw7E;3A1T`eQ1Z127s z`CV)KReiOPshV6n_+^x1U%nG3IyIvqqI*j!Qlh}PF4r-3*xqqg1px<6&1A06MRYqi z&h;F~|Fz-KU%$YcaFt|Ld_rU4*VeT0S&Ab_%REDbBLvRJ74u6z4!30YC;;cnUoRaE zZ_SLKP{rr7ui@}7T0A|8r00ujuTjb|=0CfuA&kh(bX$L~eU0E$m zRL#0hGm4Vy`?iZhHfsH=ftm}J_#Y8PL-g} z1)A3(KBzdY@;N$<^}$mu*~1Ort2oENF`u(Y>x{P?n$;7+x|4&`;`M>JI|41Hr@3@%g zQnA#Cuz#*thJ*)JRX|~}m%;xW|GC`uwi==%L6q5lv9+>a4Vt5z)2A9rE&`LEerNE zK>)T3BZeEm>owi~Aw~=tWGy_ni!YoXU>DJG>huQC)WnCfta9t379Umqn_iZe#^R6_ zK>#iSHZoFzYHaF1ah-oZ@%R&e71wI|FiNr+{pR3`FLOsm=Ke1)u6NSI0rFhWr5}QJ zKKcb3x!L>(F=7v%XIk_%w@Mv9aKcOQCd8PzpS^e#o1ti9j!)$1AJwwT5LPwqkQ!E* z=v>0VI6feR%X>+H|3*1H_xLE1expFd=G33#16eSS*6)?dxMzx+zDCE|1ja`l=M~D@ zbgBC|^g@74%7?G%Mx7FX@)t(x#-tg)191LU(eO+1gID7*mD%Mh!NX#*w)tCIx`91_ zfhvhx$}rvM(#z(NryulKIA}XOwi-GPHjbRzoYB|UE#&)qAAvna*MBEut7q!cY}`opyJ{%H+2)498}-rgXx)1fv1itdDz@H<57k{0?c-jyXm=hdv2 z(s*4+xYlA5`X<~;I>8rdUODqOyjk)pxz$U8dgW#bFtOmY$j#{U-HN(eBmJ>~SO}gUj!vyyPv~+E5X0QkdM^ z=31_C)^?Lc1nvUVSPZI+kL1-hQ%Y1Rsik~Yb4i8TAvHCMR4mLMPyT+QH>KuP zGps@c@Ajxva~-ZNQ&5SYDWq`=j5ws$8_i4?8Fxnxd7QND+P?fZ^&jrg+j&0HcJ4jp+!(+Oz4X)ArkzfT zkhn=lOp}jg!enI&^BabdI(8llhvPXXy80sd2jg+$sC+cpFiuvPUGR%AhZb&)?761A zlKd9D(UI$R8fmL8ha2n8uCxc#q18IZIsRYXq@t!TWfN+idWtr?Zh4x;6O3UtA{#_9 zlkTo%K1}ww^yt@`KKk$r^V_rW59(#pS9>K_%p(u}wXRTm(j40)l5+CVN#CaTGLhft zVZ$Fl=$sy&s)!js#n%siY@PjNi&W@TvwXuoAik2+M?9gOsHz+NjdDHm2J?p%%^QOE zF6`;?_T+_gmDxC*Y`;}_+*5SFIYPN4;$keID~iyb7L5TET}%NSkd5j76g5*g~~ zd7XZ?_x-Q!Zd!^DN$rwfR7oufTG&|?`qCdlfK~G(SzC6`y>khPRr(jCBc4+el0!g- zQGMb#`E$W$?Lo?g)~BR2A~!oVIw<)2ByYaK#>^o~M;$6O8@zqIgf>M@YR5s^jv~-J ztA;>q)}cB^(kzj~HJt@AooA;vMxA?PTyYPZ$;`d7V{wD>#j6l|S)rI6}Im$<&T zmOS6YDd(>uA&RU4ZoyrlWkh~o9;kDurkVA`3Ki+Riyg&R;$85{crV_T7#0W9bxp>1 ztfSouJSPV&|KWPqx(bv0BCvn7*tKMPxI0yh+bb2!D5q<)974?$6twlbB}C_8Vc}|L zKq^5?PKfmEe+m;OW9=#`&)^SJ=9i%GJ76r$wHZ06-!Q&|MxteN3o25Q$)8w1RO1`e zPIqgUZ+m&3z^iuyeZ`f@-OpC7RQB`n)*Jr#bR;>4@=rgUMkVsA;+g3*I`SUQ#Xf-=~X;n5)UPIyS%_H1q=Z&ci zZ(Ch;i+A6wa&X^NA}+ANUVY=K^`I&FPo9#>*Qpr~BAf0jq%`)yK)b(nKjq?Pv^^}= zGwXqDqydcbE_^K3)GBDI1ViAO3`UXlt%QX6E0>HzgXt2`3h&sEDlz^i` zAEuVgAI0q_+6^)#$J)RHH~YPS4Q{;HU1M^x8cidbtSq{p98XyOdMWL?TJjtD=tmX> zhp$gKv41t_DlbRw%+txrHv7x1Kb}|^7NnEnFaH#_Fi=JCk_#{v?yZPFsoh+IsGO{> zac}D5S~vAP?JTZ%QH^|#q2bXp7S^jbWW2b0W43kKP<7E2~C<-3Ni}YU>^19{AOqJT?MxjppA>mW@uY`Zh2qo_dY-VzJ~CH>b4@*_yzNaM=WZhGMmyfCayyb;g`>2wb7lXdu6{ zF!#F!X?Y;Z>?v9K=+sh%R;U8b?CeX23%j2){ht5k!qae>aJJqb&_3$TWCliNAPZ=c zJFYP$r4FIBNRCSoUmS7Q74<^v&coL`l1wY>{#D` z&rD20HIr-x5xAODUla^Ld`2x3WB&joYs^n3{BZeO+6lUL$!RLo9LFFdG8yCZSTsx4IgHQ<HT7A_Hxj0`24>2$m9H4CK}<@&WW#nGg$Yfzm}wKm9afU35`a+2D(O zdp-Y^+ArPWKt~SL{m$k`lYPsH4C4RzsN9CbSgba0oF!@5 zuH3|x(YRHj|M`HE#DEbWvyIK$awV-%5q*?OO8R!%%9v4k`!mzD_sfNtz|+&APDdw~ z9=VJ~>kheIrbi;1O}rV%O;;VswI$3iBc^X(BXh_9jx?3(4G;DT3ss}8f69K~W<%x5 z<1O9Ze&-wU69aG4;O%rns$6UV1FPiEZq>PZnp_o$X;3v?N>++q5*U0|jW#)-=s_t? zP;70a18Lfwjt*-Bu^$m4N@+7QDfGdtQjyZf5>ZwozUM0?Uku+`TTHL?9p5isKy?vQnHD}?uf!0bF^-c%i^}eV$WP-hg zr}n6f+%WgnOq+Dlgv65eXe3)iR5IW=WI@az8w|6zHmF0*kE2)(ry5g<_04f_X-M;? z6b+$L&T)Vs@WG3oQ}RSaVH9oo|O?7jxSbRVBum3CEO8yx1L&ESq?BNU7n6(O&}kb}x_5g$`Q#wp2fcmQ5I) z4vEKA@XhO~O^E7m&@}9H(b;MR_^ zQ`XNbZJgF1An5Dn)Kg+ud9dOr>&!U=9F^UE5{tA!CD77c9TZ!n_J!!AsaJe3o-aMb z{X1hZLWVIeO?YWn5Jd)|CM>B-B()QNaD+h&Ai(5mv|?$2>Y|D2X$(wgFxIzPma<8z zhAuE6c1X0w!wdYC-Mp6Ua>~d!`TqTTbL=#`5yiLc)rxgAWpG6&Rk?F5PBojCdP+@J zEuU4xuu$qvwXFX9FpPTzecuE47QaF9)S(Dl4P463J)v?OGEm~1_GH%KJ=kbWnSy42qsV9<8WB2m*Pu)BZvd-15!II&oLdx; zzzz*=Di|69TU<6jxc!H=Y^2IDmIODuCi_E7_ zwwbi`nR^(0!fs&@wx8E?NX>JpuD+<050m6hBhKjH+iF15^2|`Z?vWid8}U@3sh{** zWxAgocd(YJYtUGc4K(K>nTo@p7VF;WVSod~LwTvV`G*Ig;hO4N#DcIsH&I=mPo<+F z97Z}x4OUL*90jp6TDLjMyfua;$U*;FHiHmNL!gxa!6w~lYTh@C)`Nkj1{SVnx2`=6 z?l9rE*PJt?&vWzN(x}Z~6yADgYT`BPjQ+(BkjnVZeNZ^QP$Z=8jANY@85D2(sr{if z6W-d7a!~GB=#NJ&HS~bR%J2f1?1TY8*_G`jbz!RV5(JLFS-|%+809+=s>GARFSNc8 z*QiMv+|25YqICLzgP%lmqjqfT)SP}AVI=!n00-`oGFWl<<%EW&gdHZH0R97U_ZodR z%_BlPZDBl>igS;#M!&dPsrBLod|n|IootzswebRDR1`_SL&sbkuD4Q$Rcd&{Q>ipY zvR&j1Hr#2abA82GM6f|)(fGVCW;|=0;pIIGttm|Pv;`8vTO(4+>ROC2KilF zz+md?bqYzvdU2UJ2FYB1W9p3)uCZoQ&qAt4a4jxzO!PK+Olgmt*-32TY9bweCp z#Hcdi5~o(7mN>zzU;SK@bb*G!$eg=)8#k<(ZRy-fQ*w<d7Hh3rvB?mC zUg_J@v%7rW!pta?fXaA)9p}6}7biTY>xwf9pcLxVQ5r%(DrzpRe{m?^GlpGvG>YQk zOvSvnYX3Azt%e$`RwYkWgYSJEWF`EK#^NT-B>a?2|J)Bk{yENVm#&gL(k3zg>q0eu zQsLyuye4XZIxY9U8KKX~;{=eUnxVN~h~+b@)W0J(q1~KS-)p6o@qU>#(UuR-uS2y2 zUT~0LzZ~fp55*&S#HpMk#Sv^YWng-ruV9SO@Hd>m89Whf2%fSg?s6IQ)1dgoYr_!t zIe0ODflm$fnp7Dft5Vcnnp)RL#iv(m`~_TMj7{7IF{fPqQFW-;Vi5zK1498Es?irZ z1rsv}eQKHeVH;iHxq5d7Ye%`Y3~iqe-O0&yCNwXZs7U|~;i!Be@<6pMt)On>pRiLo z*9U|VcQt8C@>yA0Zx+D6Ub0rYf3#EuXDm9629XhGIA17qXyZ)omi60mIE8AIkzgVL zKgUxkR-oINCr|({kz_6?yBbGBXyv|K@hW;f$qzX2u+Y~OqGq$MAgo8E_M7(Q++i6X zH-GTOoqEbGbAO!vlHvlB$3{oqmAG_$$M+-jtP9S%Hav-*m&NLYkIjaH-_p#Mt&!i5 zP=*x-lejf`X>Umb@J-KcRCv2MP7@iAoCqz^$PgLy=0cDd@y%qpBUY9}~39;sbsQGZ!q5+#7GIEK+= z@k1yDRjd1UWI3p2MEWrT`i!RUNh^3wV@20Y-ecM7vKwqM+~DJGkz44jR!k1F^Gc;( zJTs!QE9Loi!BN>Sk$4lo2S?b~*jn$m0G5#*Q^6E}%PScLbJ8!xhV6CNsP9SHa*4Gm zpfNGSy|CnZ96x#Mkhp*qY$uYnaY1V#dAdjG+;JJ@YQRIm_ws)+@^oveS@=KHgEE-O z&U_zs7hCl9UMx(KJ!z2pP2I{_+3_zx2XrX&m+%}6WIy4A0GSWyoT+SNC`&5zre?cp zOwMiW&)p4M73;38pKN#-C*XO#CX*~s>6){7%!YgthaA7Jt#t@*0rF$g`~IiJJ7`Ng zA^W7woSHuoA|?q5aYH{v#+Pdv5n)H$h0%mqo3i)f*8_%|C)s36 zU0++J#K&^QEZ5!#mQ}*Ng0fS`KZpmYTidQI`&tSPl~zVJMEwfPW?w=vDM;pPt$8f! z2yd3>Gi(??k1tq0zs<(R_iBAsU>{8{U$&@c_As`5^ZfY8Ygc;1T6y%Lc3Mj43O_E&q&iYULI z2dtq&Q4nSWh$894`Jqr&YR;;>L+xM9*5F|_lM`Uw+9Ww5wthA6j-HkKqL1_r6-ppO-Y zGqLHa9G^%xx@nwuXd>aucV1K!P2rJo_DdwYz3GJXq@NniPEjsPR6ZhWV|Wm=dtn_V zI{I{tZLsIYPM}>JkH|<9G)> zY754Qg<1-4pZ-G8T{#n_7iMvO6pkC{N+k;7U%UX7K40}Wf-6Aw&}n`nuC1pjHCxKm zA~^=0eBMg%(_i<$vqFR+9vu7%oI4SDOh70PayVR1Jr(_ffEUUN{52hN(Z*M)F73Nh z9|}g`a~k8~?%e$^Sid?*A!mrP6knG=+;y=k1Axph2p0li-6o{lEjq0*+GYFwj`^9d zdG<5`*?6!olp<4de6iMFT~$?S$;jiB!&*gRqn)!u0@;G{L7OUy)wU|)0_67cm&?s8 zt}Y&pJr2~#aH*;NDW{6c0mV_nEQ@>pVI(P!ZyuzJscosXvdS}ST<+)kf5K#y1Hw{y zy~)d)sx-k92hUa@dh*WS90Eqw>I8}DiBK!b&cWWob{}lR$~Lgrl=F=B~9)1Mt zXpYnKVrjSzLy14~v@icqgux0ZQl}%g?-bSQx#%S)E7Vlk*^#Pe;;;Q?*0}%U7VvV} z#U@$NW)T$n9Q`o;e~A<{Z?lf%hgutJ-18msQ5=Z&j<(Md+C*AIV;ZeoI6S*R?r(zG z^HMzJ=C2ZRYSMlfhZ6$L#mpgkM)}F%$$^q+{ffj`TKQ-57P3{^dScC3lor2#lFrYM z5yCbf&e~&`H?=6I=OrYa=W55Vn5BG;LSmsbABztevYu>Ybzh>c$As@fhXisW9F3zb zn3%fo#Eg-6UCTwCHt8*lxzL{$g_0xi`nTq%iKz>psb@B3_LiwhuHM`|)D38OIWc)( z9D;Lq4h^vC(LQwV;`uP4{Ma>6G*P;DYe8Ux(6?J_#;6LU`LlYQl%#P^0SbW3fC2N@ zZ1`JGI0*X4iRTFK2{gUjhHe%vPFk{CTk-CTH9g?in7;XZvC!s6O5|8Tga(+~*bTl< z>dVVzA8m*33ImE=vF@3AD1*vJd5+zfR?2wL+#NBhK5opy5CA;w{~i_Ac-?&N9_M_T zm;eSGn}#xl*jOCvTl*jwH$8GbhGA^7E3ssJ0%_c#j`pyByVj8l~W`%@e zUnn(Vs3urx67M1%nBEyhqvs$RNFDV-q1F24_0PHqaVA8iR*OyR785nSj_zydrYim} zkcQ4^otrCTozG)70le%oqWt1wZD!PBZ?Kk?weoib#g620tc{*bXK}KqjZR&QuC2G` z@rZcL7WreM74LfpBd1eN08W>yYfyi^XfjMK45roWoTkv5Le*|{KZbtz2n2*HYK#%` zzD)VyyoNMIQ?+njMsU)gJANzVqQynh>E%4s&Sb2ulh+T@Tsf{4(UV#qdec-KLg0%+~u zsVTmBZm^0MmzQ=0U3UUjd3%3ET!{s3vrj%6#jSwwvs3ej-Nr#@LPr)E`cH73=#Up}nHW&l2l$U-8rT|-eK946 z2VW`UCEiu{zq`mm8zFZuYgI$`TO-LBl66-;M@@La8s=k_=j(@V$XdcM5vc`qYwhPK z${HP<+`fM#v_6S@BK!{^6osJngKaGOITo_NXvH?eUYe!U9fnYunKs_NA+#tXzxbaA z+pb`(h^0-cD%fQt=%(0L7)$jBtFpELKs4^b&JG2r_Ime9tFzF~yU28ddoH1A-Q3%y$=oP6-a4XSLip z{LFG2Z@(A_TW7u!Jgw_S5-HY4fPPo4&z06G#I>|9Vu(ui{5g=*ZemzF2h3P1)o+T| zX~)Ss=uh!k@A=V8zPOfXP?y}we(z#Xk;2j5_));8%0rI}#H2#TZsdn!OJKxMEc*{P z9&G$4{7uPoO-hv#PF`!Bvx5{MR)ufeaMS3cq068Bl65}%$RGQ7IQI+@aKaj7?0n>W zXB3GY5PD24)*&Jm{X=<-((Gt9!9ByIG7b8egpMZ^{ZuC$Ttnakyi(tv%O!RD+1Ld6 z`z@A`L7dRyiKk%LmO44gh&`UOxy+@47}5F3|B6HMelhC#fd<tV z8y=;`G&CGd@@e0^we%tbB>%WHnCkt%29Caw|Erf!VE0{!NdS}u zjTK2E5E^PK7M4~B6@<2<9hRZthy8hCRTIA(>v4$Pb?0PI_XAr!5b#_<^6qx%PfjnP zWmsY6yrdep-ZeNgY8h7~eJ(?6Zpxy?D1w*q@h%CP=fNb}t+ekDAx4d&`hx$o9<8HueP zOq^CICRNQWcXjKu@&gs68*zeF9DoX_!T7P%-^4}MOm3KeQI zUCzbrsHH=`k||H(=TOdmR%67%R&FV7EKUMl%KC_Cg0z_9ISIj`yae-JlhB|+{JFl@ zXTiD_5f+N+Cdu-eqBCx*TIr3f2Pu4xmyn%G;)eBWQUrJ7TjH5~-JrYE8fo*>nsF9n z{Z@v`Cxl*ivyDP0`isDkEwLZ*thI4xYX)Hlf6hD4LXy6B(yr-{Z%cCGVbs<%-qBNT z^qmXQpa5`R4+?>B#s9XD+o}gk*7wpw5LvnEKcD3U}4Zi=RF{I zA>r)B=K!5+u=v=yfGNQcS`)!-J{hOkK054;DE5Z+$1fc0@>`|#P0b{~X#M{A7Ys55 z+jF1>!SPhsiP(vNR1rsLG+XwWm(e1tRq2p&h1nbV->;bI+07r%DV0lvUWp6FpqhRc z|IQSwd+HR|<}XJzJ%ItSHIIqoh*SN&VRI9YWYhTTLmxKb)XanP{}A<-QBi*H`}REy zokKTL(jYZRD&0eONew-eNQmIjjdX)UcbBAecS(Z+iqc9bAU^Z?uK%-sycyP-clX?D zuf5NGUdI6^d`E43^o5AhoK`s7n*D7Gi;F53PdFc-tPsmwP@!y=@pFK~_4IzNIz9$t z3}8+{i%)zo^{*ny5u5bpk zsl+4cC{wpw4g4JhV#0}^6bhW#hw4@5eieV`e3KI-oyy}OaAkFw)*K>GG5#9E6ZriE zz}`Js(mq#lZJ&&@_ZR-+UxzI#nE{f-bxoV>{pLgd=wR zUey3l$Ap3&qx~HJC!ffbKPA0=hF5ciPb6+4DB#*74}d-v%8$}PHFoz>rW$(fhD_eA z0Bo&Z0=j+_TW>x|D(r-YZ$Ulst6eb9R3bkchtx_;#5>z-w5^bUp+Ni}{Qh`QSd!$| zxUg*yQAhVj8!|OA8}X%=@oOuFK>-}-!Dlf+kxW#RZuh3>L_9mylTz$ov3KvZxV!5u zxqfrI7;zynO0FWMcC8C*t|BEN)~GZ~BX0e06=C7wj|zT-w%FT+%5FnO)Uhe{a!qa z)PCfAd2shHItdv1Gl56*=&9R-#0xo$qeYxx%CmV>tocP#F5j8)Sd&mzCjU3vKct7< zHGW_7P@Fa273sj&d~etD52Ck*7nMqpswO>;(Cw}$o6$w~d|O#PCStww1U7(KEv2qZ{#|p4GI;JYJox$4 zPl3zVg!%uX2urRe@BnOev-*9|ZaCgn%|tw5lLa%qvKULX$yIvPl93Wlk)H0gdH$ep!D&~qR9xg(2?mp|mB8#Hp_SWoaIEa)7DbAp zjcvkdU&-^oMmy6LJyhyZ2mH+p)9)Jr*q)emGdz zg5=Hp_vl^b;$R2=GtMDA_)665IHS)CMWNYW?ngI>9c^O@rT%8=*_*tV8xMVt9tDU$ zvdWlTITm;VHvfJhH~s=sE`TK#wv3Rv!wP?n$F4K_t}y2j|iWj=U~ zIA);|9D)l`G-Y^bnC9TF4r|jV-ia3#PB2qPX4P8FDGg)imB?D=hBS?{XBJJ6w|e;; zo8lk7CKuv{YGPnZ20QM%Enmj8$I8Pb2*xa&9QB){UcHCTIT=v$^d|P)B~*DxCD#{x z?PKb)y9w1GZA(aCeC0P^F|OGJ@|MWEn+6SyOFozys$vws&;&VUm?vmOmIIRjvzI(! z_z{NuSR1Ablhe`-tAc$NW(#xeXI8uLU|jKCxYDA+M}TMGCPhVQI8Q1?O|bHuNtLDe zz?8r!CzcxnqOP0_#=_dx0gks_8HC$4J zf{o(5eDo|jv|fEikmmK8&l$@dK;kivq5wq(S7ie0hW(}nyS{1dnk$2;06T#L(nS&C z7*HY%t>6t4c-NfYH^wn&9Wl@4UB9@^Ze=1SbHN2}otUC8B}^rd;UOUuDGsD!Du-Aa z35*`}y9&ohXDXIKI2ojaqL?@`)jJPYUA2gRC(P)W1F%3C(mSe)Lm%N-EJAp^>jNV> zin0zB;84>!`9uKLpbR2m;?Vc^_qZ|<{YdEN03H(Yzot9%;h* z(;Qm@9tERsmh}u#9Qw{D7RX(;LLwo|hIU{M;e~9%6ItL0RYmF0E8^84dvQY7&tg9R zy?7asob>iUJn<*?s2~bR`0D8OMI@GES-qnB&(6!q$2T11+iym ze-2pj|6MXbQ4d=qXI>~agUYEB33If_)$ru?gifSpGMctMz7SsGb3dH38-L2GW@6PZ z95XP)LOZ`=x8>XF*=WRK5W6@V%t&!Pp4_ln6ktfCK)Yc~McCI|2p zZNIOyUpzzNzt6|BfKq*& z?N0cGhzTf2b9dQedn}DA&B|7^m#u);Q8(AbwZJ_W9e7HK!!@1Vh(Vpe3P0KiNp;Q{g3!p>PiAxc@JPAsXQ-g*GILvO5wa^6hy zy&j3D|AsCv0!gO8z-OBXA$eL^6Qktr6vIa6HcF}fs#gT0gH@%5xzW(T4jY6))(ZV_ zRjdhmMAh~MrvBq>?YS%owOk(>RWShLUysK{13P04Co6mnY=}?I*qGBGqmd~<#;B3b zNnvW@qubbTofp9&P8lW{IksYB;Rah5aWi4lfmd;&UT6H6P#RrQ&P9~A``8Yr&XWc9 z-M>3v2yo`%Iet}{bHH>^6sVE!_&AqN+43k+Z|3JEVk5w)X)jr7bAQ>st`q-`_!sZB z!{!YC`r3~PN8hUcw|{Evr_y1DXhZSnt0{4)Hsp2{`)WT=ey4L5PiQwM-F6t{pF(}b?Ek=pog}fMbaCgI zDwt*Q2C8h0xWP|C$C#T&hLSfJD%lds%zC(m?QHYVfRq~M933dfcA|-W3-s6&(>G(K z#%#RFl%9~k+NAmYs%Rt4v2%4h^l$+;YdiKi-ruj;Hd!eCLI2$`c74n&cDMYgeh;w} z3uZZohD+QSLI#!$y?VJd7`5Spp;G26(t2)5Qqdm;PAusl9w+=Kt$B8!@@^;eh)3kl zB|4?p&V2HKJdM)Sso(v!l?QaW0&GpI>P*`u*v-oxvL(J5-}F*ST#D?}wHx#5>Z&@+ zPbfzfhIyCp?Wte>$ZpA&XuK=XgIme@`T149`cPhe(lccG(sFEj;@!Y?+*YTswM)yDpyP6_Hrb0o^*v+y^QxwglOp% z7Sa3IeNl6{SL`Saxr43-X*^L_zKD>O&c=NC=NYOR{~!q1LBD^6OdLAQasciB-`qI< zza)YTeVi1lyvbqs_wt{=s*;A9vYM%dvAHSQFB1R17~&23i(uvB*ca<&Q`3>Ve#*yF zvk14Zf(>7~YVGw@A_+HW7H8MWKD$zR&LoJWqG{UsJ*kdzgINLKp$BS7y{XC$#P zIOQ?NVmeISlF?kZ^YKq|+Ian3?jFxLF78pAEXC}SPM58W&XaT2u5(VM{ZiK3flfh< zN;?{{R19p^<_+#>)(K|nv*;2#^U@|BY89Ao7P6D8iQho?G1{xVzH2ikW^TVkRGHWv zn++EU#hhHxB`r6BU)g-6hpR)P+2 zMA3=f1Hr>e@LLV;M@ihM2z9#y{2E!kkR^xBhos<2$RbL4g#AbgI=Y z*;q)7_Tt;l-F;oW)eFzIv1>~%FC#>20vCS;aLDQfD&xn?la67~*3A5Zl3}C78N+$P z4Fia1ZWacxDx9NZ$Q!=krlU?;{AVc4Sg`hOg``#(#wfx#Q%KvRL#Fvdp*^q zp3c-tqyle-hk*k7yZq613&F7lY;9u+IWFc?(_g(x|33WWfP0xok4k4qx&I5(6PL*i zspq*ZxI=J%*60~z-R;k#|u1XW;w5PawQMddlMv8< z=VEdlI!=SU5&AmW4&sVi(5^eXt|ANaMR0JimCg$BV{H_Ws^@PEcgSEoHN&Z1%q+*a z$}WBL+?RO=`}wTj`@@$BEUy9d5snccOl#Vf$HCxBld7D+)wEYDqB*`~kE?Iz_#WSw z%W>$|#W{JdI4yA_edBiEEwrsa<05@s>iO?rvX)!KC1nfbbCvOWHy*c59d`1C-w&9x zPBC|Vm7yk(9B)I@rjx}P{YPNr0}`WXLe zY9AjKdRQy}SuDYFKjbwRacj=U%QO+=e)GyIpsT8ZD>!5$>*%V_zzKDKOhC1A#>a`b$(T-ZuJMgqpHl{I98&J@RQD<{c_s5w3AfYR8QKTp~2*+l?)n}40n9*^O^Jni%$;|=DM}J#@zA5)N zAG>nnVbfg`Hgut%olHDARXgjQpF2BorbW}a2YoL<=cClwKq5!zp9 zz$?J)IyN>|)k-g6X?toHsB;8ZWVY1~6qs-_PRHuTwX;keCk#M=k|-Vpmtg zP1}vDSOW_91>HXphM^TGtTma+U=6;+ zS5SsJKDf%kDDRx8^eu`=^g}gOajD4od*hMwYeyIuGSrj$b40Mm<8<;2;a$-8`D7{i z!S6R6C&g3^<}NPzA`-928mYg6`uv5(6IVZ1^Q_OCzEm6y3~#`+Eq;EgbJ4n)fWy5>|eH3fp_gpRCNc*mM8X8ho!aFx{ll*sa z1zDJEkL23XxKcm;t8pR|8aaob|Fa~?)1JZT(7q(`aX6h%H+3kbyl#?w1N^>_iaF`Q z>OoU+`m7lvwIg?z42Z%g_(WK&f5+sUJ)RpBk(y)JQ7gCK3tEUuqbAVZRuRdGS@w4)7M}vF2Q%% z!kBDxj36AbCM`Nq=0==+4r`+f`#@A;Z(Z3?+g_znM8sN@5>AkjD7cMCbn{%Q^sR9C zF8)<$wWZQuBsB7vvQJddjLOxS-?G4>YM@oVVTT#PR*KMf%y#kK>DsJzJewhSr!mbT z5=EGIdg5L#@Jl()5q7O7qT5aEk*4dHY)qk+l)}?>RU?h+g7+^6Agwa$sS{adA&L4j zw4z(ECHPqBkz-wj9Op%sClY|Iq|fIR!e$8r7j zr0E#o`P$)-Wina5D4dFQjIQ~l*)IX625VA|QW*wk;^Na7Bhn)O8N+}y=B6gGe(@Yd zrCYS_P}&;q026pj49%WEJnpj%cMS2tR;W#6V&8~$PF}~+z2m9VL7{pEWIu$mk7s3_ zlSPfAeKiMa-m&dbwd?z~b|X1NCLXYiltx303^Qm>OsFubv@*)lnbxu&`?i48md~EC@z$ zr%q8+5(Ti($Q+FKbu%0FV-QI3C7^7C5c3@-kJE{whn<#xvjWyav<6O}6)oAof^swg zIyF@x9l^qc^{$HZI>cVSQmtXJ&DcI)csNo~8wS@)_CcZ)qE`+}ft%~z-UCKL-q$`p z%A%Whl-nP-7hl0R3`A*~gRuOc)BWP+nn>+CzVzv)rAav5Qj-665!|x_9lg1tV(Plh zYxS#r`{toa4cmI`YuAl<82x^iFR`WT^o{}pNr87ZhEGZ?`Qc{H;^JH2BW7a%O<<@B$k7N_1 z4L`e^pdF2)*HfisQx%alcsFnH2hgTZT;qY5hS(X*h zEtPF0MTEJ^Ya^SI$VAT~ut~y{wV1u`44-trC3y{g-{Zz{{upxxT}4KFV6Y#;&MrB} z@}A7MFgt?LeP{smtYUv|q5C8QHu6C#YrjwL8KRD{FBW}~$jnnkMvC_hD{F=#Q}?V` z#Ct?S#Qm8%dW|o^U`?Sr>Y*l8>LzXUA~JVFEX(S(ijdJ_Bd=HC{hrdptIT100anNl z_j-Y1dVgfV6XC1xpq^c85&@R#lnNeY9%k_d#b{StGAi#g||cwvK7XZWeomN)>r z7$M|Ii5fRVZRf~@2kToOI5|^^a4WU&L}1_mb3CqI?B9EImY!Ony2i%OZHk%BcWOrd z>bcj!0=#e_P2=pFgMfhWF{(LV*U|GM0q4;ojM0Zukw|T{Dn27LO|rN&%<<;8<1WoA z_9{J6#>4*P(}uSYRq)U1g51LgC!Q`DaB&Flq|Y0f+X)|8;kC;C6|2H9K;^qU) zIfhjwQm_jRn+gx35z2eKkp|`s%Q? zrIkRtqUORBU%+!r*(fuw5}J6f#jT{J;_) zi0v*1Wt=ENL3h_b%E8Nh)3LmDI zg+%`MBs{Ly1Kty{O_cFVem>f)9JvBk3E!>372yQ=TQ7tl_DW#Nl0CnC!VKG%##DG=b1N~p`5Kl#yPq7P^rw^I81e;8oq23Y>w&NOqO&qtLY z1yh+6+vw0jpuq1~(L(#*=xxtIfkgJPxzu*j!h7fvXrDW^5ceniBXKDHI0Bd>c9$j?asTRtoPd6X2$@SV_1t;ocj!*3QISqc9<74Mu z7F+6#*1(V`l{LG;x_DN@)6~>0A{XGSTtUw<5lq`R560s8*u>ejQuC_mBwN$_dn8lE zJZV7J!EnO3fRq?k@xWRsIhsP2u9)DM7^m-5Ksub+B(qh1D^Cvwmgw^Z>ZJlbQ;78V z09r_UVJt2A898Pj{Z)k<@1s3q46focAjP~0rs(RxYLBBzs4!vG#L1#O;s=n^ewSzF zTVr#?IPAj)oeyKjNG6S)^^m@22UFx1*Qo3Cp@3k2_OWHMTanpKN3iJtz@Z*i>>bTg|CsOVeYuw5l0!(N^N!u z?a)BZ0gB_RwT(!nS~V4}Q*ideHsyqMGY|+l+ zn6^WsDu=ukkt=?d`4Kzry84QaxlQD{*WaYRe|;IdRwUWLbm@|=HP(zA-{3S$+*LKJ z+K_uC{=_pdmfV|!Af`6&-E)Zz%O1zjUw*j7O=@z~0j+K>sIn(@Ydv~FLVcyyZX5c~ zuw)hdpuW5 zm-+{YA;lp!of>?mCwYss17etlzkY|?#KSr+42PeZl}vEyG`vf`Z);-|@)psee`@!o z2#~Fzvy-xgv_k{0K8vkA-$}S#5SDp)#5OGd3c@DZ$Pu7yuCP1+G1N6=*Wk>?5Dy@C z+3y>1d51ZaAfH^DI93Gpl-g)&AZ5aIMXERvZScEtz1X00qm`Cx?!}UIu&%7GdW;xq zNl-4=eQe*ou5oDCb6In?wDSZ0XMPD>=kjoL|Lm}gIoV4*R@4s2;@^e&{Gfm} z&(Q^{^jG&+$e0uTuz8ZIkU418<0U9q>2RA8SW-rY6X%C$F6s#_A^di(JhF*s!kO)pl2CIe z$jGcnERTb-m`jGFfP21%>H6_$1r1$*gCj<&uA|fj9)y3klKa=D8(xK*Lz|ZL`2M#0 zb<~*?YSzd*_s5qxOvKO^_>UA~G_Cv6IP+xt+E)51H6wyaxx=49aj;Xfs+ZHa&Ge5W zLDLGA>?Ayax<*KjnvxS(LE*d(K*@WJvXLP8e{b%PDs?5%g48UyBAi$WBq;h zs4?qJT!_Z|j)7qr!MLf0#>TWL>VOkRN;cEBC>x}|Z5&=RBQr~D?f8#%yHp+|lR-5X zo9u;VnSsI=JP4jrJZUogZEJPLx~qUFvZg5RfGI4Mu&ON5*;PoXd8pE-f~EVb`8V}K z|8t*iNru_p_p4`BG-Qm7?+OSdv9KxbKcdR`&EGei|Kw*gE$rTG%+B@=q_z%RW^uL*=RmJXDh#=9e^b{zA4pgFTrY zh4(sJ1Ab67_MlAB1C!5(Tp(1hF?)r!m2X*(5+lWgHXA7jV~!2a@#-uXD&4wWQEnHJa~u zf#6y?JX!Ch=(Lexj&;pL1RJ=31F(h@y^^8V!D8%sYs%9WdI)P65IbWcCa^pR$mgd{ znhaR>Hn=R<$R{6a%Ep9xD+Yeddp#XKUT0QZH6D3vvpa>MnNj&Ph0ePp>Ntn-72GfV zJH4KS&3D_cKCziw!mc{g(E^;YJ8R<>E?JsD-tK1v!rF5)cb78DhCr46*V5^%)WVy0 zWONq$XKfb3njqHC@HOdFGFFSyX3XlJZANpjW>a%nTUoH~ z!+J`VSoLnSTP8Uue)QS3fl?3{a!7qPK6O4a#hnVM7s-|!uBt@=TEnhOOD=tYP>EZJ z5?j$}Xj&>7nGkpV7~j9h_yx(Q@@wbAGfi%TbT7SF$AMpeH`_J_ez&emEuZqXE{C^H z5SW|snF>hP7$xhTr!^CJfb!$0UX!8JUQv&t2O~1|RH6j_o)+z~%zF>KQ=JwnkVZU# znW_XlWK@b1Znt_&GFrSqaE#B?6;)h`v^Q?=e&7C_mJ5HnySDLJjj&knC6H^(aN;0? zr^J@2y*U1cY%P!Su9b%5u{sz1`z0XasFF_o-Wu9V41t6|C79E6g7FcGkhdW;xRQAI zg(%Spzlj$h^};G(LRJ2X!Lz>))N5SQL`WuwJltTDU&8^(g`D4E1BY>xs~Jng-<-_j z^2Yb!4i*>yiVh%_v|XoLt4iUcDI}qRmX-Y|e9O^0m zbM@p@Pq(*)qJ!_0|NZgz<&m3dkzR(?MB-+NNTF)-R%IZS3ZV`Ugkcm~Gg560&Eok`@<<+LkCJs2)@tiMeg8=tT(X$A0mMbclr_6mMGt0#9IN8;=f(_l=*wbt;$? zf4b*DrUXEEO{$|Qi{X#;7nKKf0>xS#Z48G+5jpX~x<`>>WmTn;zGAF+k)YCib29L( zX1s+BZ6aSYHr7B`22>|4a-7EK6(~Fnv7!68$(GlOEhbUMf4OQEAYkMW95}+f`C(99 zc*3qbLTYMyXUP|DAQ;jy5zd7PdO}5_)Nmt+dQ82VQ zK+2prKlN^?7nMt8(L@^6lfP#zIZVHX%STrs@v7FZ+3}A%=3sLMDquHRo@)m*py^Z8 zWK1U;PK)^(e@L|w7LSd@OiIF#kLP=9rrK3xw&Pbjl*)xj)+-nG#P0 zfH>|A3C8fjCA~ZEDIw0UmO9*s{UUbL4l4VY#8;9ssGuc;hC@h`JodDZ*&$Bh;BXjqg5Sf zGtxAT1TNt@I(QQaIez4J{^HQY0+eOvTPCCz6d$jYEuHCwE@3J0mqjN$-q@fq;d5|V zuZ+eLw5=G9Js8tm8i;LET5Er{fITjfSQuU!$78KM@jNy+E}NxqfipdXrBiuzY?u^E zJcxmX$YbS*Amp&Lr&7d~3nifiBcqZdsNAF^3svGxmVJyt{%sDP+3>6njz<;oP#9%x zGqsxb@lU=HHa8gD(^;~~%yJP<{|c@ht0r4+D{XKUQMMmL+F-Tw1%I_Q-6W?V$3}U*rTPb(WZ3A;HbI^(t-nYjb=ab! z3;qrzei$aO>B0KxdEvi|BH4l8G}a>dQL!1d9|2DcwnDWm7gErn{5iYYdC1IO4zM9l zHlh5T9C&8KA&VS{!+I-*lvTH6X7D0POeP{yWd=ZKS?OO23^WhXLuvS3A+tE-@Z*B@ zngjhehROto`79xKhxnJFfVG_+rS6c{Nkh8`q9#WS>XtTd=a)_a< z=D8&1+JjCKaZC+!Q*;?AXN3P+nPle3r#@Wp+JdifD^*X_H5S%#2Fi3q3M?}{r;p;y zHBVIdL@-+h+furcIG|T-`Jv}!YJN&+f-U@ocI+b6&Pv4Sl+u5bzyv&JrVmzYo z(WH@4YA-H8h5Vce&QzOL>?sz>cFfwZEbBT-8$4sY_MYD=#|bpnKE3PPsDw{*^L0r~ zVk24$Fk}H$BwUT1mEtn6E+SD+%jY(aO)lnLp9ygZ0U$pO?`7!zmKl|Q7x+;{LH*<# zM!N7@V;%WOSqJ^5K5Z!>Fh2mpEt}F$kY&#(h2;aJzSs`(^uadRT&VxO-a{TmA!oG} zzlA6;$=}?tHelE~ycjvu%s&zQl`JIUwHJa5MEhM{B+{+X6}7sQ**J(b8hM!T=~`HX zcFKGkh>UkgiOH_=c&BH8HH-y_*>p=Mv6Z-m zDqBqShX@=5 zPjNTLk(Q^Jz&mv;lO*l6s=~PSzg8Fr7|om86OMG2?*^=!7JR&lrIF=CLAjySCJtTe zLGqo*%*A(Z^r@YdDS1N_6U?7@k)U`;eBL`!1iJE?B~0taPNv`_j4w~>AA0#rYmzi~5t8*IaXJrGtU`rGnX8yxvewK7z!2gRS|O0MH5~!TxVi znWorNWs^IO&{>RHDH)l8t`ERON0GWy9|Ob*<@%o+X$S&dBrAK5>6 zj+33xF$(=!sZrc|oriB`kagfK0M!V|@UYlYBv>-|P}ltB5bt>?;p+}#WoTs`Z8!aw zt!9H4PvQq%dLj^O%GY)ha*W#aSv3ab!v6d&`Tea9#rlgS^&biN35*+6KEY^t250PC zG)CL}5dC~l2p&mX{kB0@jOuQlywl^sg^CInr@M zU(eEt%no;;>zqnMkE3;~S7IAAx-bU?k5Ab2AICP2x241_D;gxsSi>4I3UGb~Mmmmh zw~V2Tg=Lv`$g(|?$QqE!L-D7v_b&X5xx$1@P?I8CJq*m%vDUI!V*OQD$%Bh3IyDy_ z27aup487gEyUon=ACGv>dupaO!ZcF8t54ffQAiWViVf1|baloJgk58^@^y>zW4E|o z4t<_$wbCo&QJToKrdSgt`tfY0@w>ks7SED_?|TF+*69WF75ci)p;k)Hk}bvU=(>e| zdA~F#XJvNjyruXP^T>tmlyO+cOip;X^q{`X+{k1f{uAt~r%!A+Gi99=aIen;`7UMj zP;b?BOi=8P@Oy}`0oi9i{VZMG5APHJ3=rxSSoC)rw(f&TY7-=0#mGS_wPgB&H01Hw z3ce2>bKgykH1-I(QasqJ0|o&FCib2+Zwn7*IAY(#C}EG@Vws(~ux7IEOyetXN@Z=f z3rXp@FbLf`Ii#QyK~4amT-_CrYVhO81Mt~AY=0yUKfQ05MxswEaBoY ztY4}b9AYHZr=oDu$<9r2m6hmd1Bzsi2$BPPQV|+&TfaHC>|=O-U-D2)8oC!bsY}e} zN=+73%T2;01GYbMQ6xqFRutrdplkV4?CQ6J0wI6Scv&6v5VyH9yHb~T)+dZ7o-22& z6p75%Uz+-|FoCwZT5(%yZZD(m4^@%q(0r*1st;X-qc&QmydiXx{R;z+iLnAqI z?YTxT^3E(TC6=+Sryf>`w?^ID%`*}*9KZkJ{M+>{rNFecbtCoaMoJ^gH+w$l@4Z+x zkHTer{H=jux})849L}7?e)e8JcEfGf!ppY=bvnJ7lB+zaNXdJ?IXt~V^FVG3jhGu4 z77DiW_Wqa%CkVlU+)Z7I#Rc6%`ps}6boxXa(YOQv6s*EdqlIuNw)Q)V#SDw#7gPV@ zLy}5xY}e8}JtFz7LMe49VG{k=v)E4v%|)C&)GelqjB0JS%2otxHsTG1C|g|yahD*B zV5!G7ceskpQ-xc?LMmpHKRw=fF?gx{oLZv`$*1EsiDeSYRf|-N`&`Qg60Y>W(&23) z8o)*2$qJI0;e)mG#!%u1EK*Z#DzFfb`BuJ~^zPSosjX_Q$&B@%Y$*{Ywjt%ll%J=N z{YRy!@39iD0)`{x{Dz+o3j`Xw-3M|ST$dPqJ9kBwpsCqOwi%Kic$iDYziio4A7FQ8 zsb-%XN-%+pCnoVsIBpY+5Wx;s&=?e_V1Et+~$VA%)4RrOXi@p1kwdr{ru^l}PP zYf9AaK-*ED_R3E@P0)zKSm#%r;2g;1ofheD)eP)s12PLW3?=X4-6SQQguwfFXzjWR z`(xUU_>hphQBnz*qPrc+=HE?I(m+a$OhTHnN{ye^SvFQmw-*{$F@#lJ+ruAe+Fo~^%r>y#Ta7S$$C8*E)kUF(IcV)S)+v0=Nq{($?Jd95~z1(a61Ve z_#1%d^(ggZCv*dJsIvq;7MYgj>#F~WS&D_aMWR}l_@Hcx^^%Lwsr0Gd^+0vy(Eiku z#Qd#`+`$Uo+;Yi>Ua1Dkc}AMU5^Ho79y^`o1^@Tj+I{XqiW zuK#VpHX#4D-1^LQdxsx#SozZwtAmP8<$Xo-mMXI2=|gw*WuT z9uewXOvzgo4TI%UR@*E$I1F>FjM(qE6xycf!s74=8YQD03Ur6HPF!;;c?7=Om#opX zj195VVi=ZSVHzlD&g$T*wxWfF>snAaVG6U)!(6Llb+>h`n1tL=37?mMkLeGA4e@10 za#h^icH5tAdqQ7k2hG1+&@XYdqGA;$(q)8ODuj~ftH?!_BvJmbV$6Mr<^t_j!&R@4o7G5c}&;hAII|bqTol_ z+QerE-{OC)+;k;MH%$E^j&bVgZ9e*Q;_gA&NB=6L7wgC?sbVhPjTUcg8&S9;I)==! z3s3km2?53+LH17-i3@c120#HsmVP_V<1El% z3@`LvQXh|a zQ9E0^4=*KUViz?wT`|Jy&;DO|!{`6f5=wMh@`ofAm+C*y$gBSaByZ7-&nPsf!UtX9 z(2%FLjM=yoKEAEzw3B%k=<%l^oJ)Zv%H0Vg7n!JHG;M%Lq9dXG8Bv3Ort+0p`Aawz zo;4|`%nF3Vj3M|kfu}SSweUayyf1+XmY~~=<*1>CxaSg8Nrp~D&r}i1evr`64-7!C z$r5U%cK`O2GWsD(k;tr(!g7Zq`i%#Kl2UklsuG8nzq$D3O8G6egIwQ-|J^Fhm+74q zrwh50-&Hle^YdweG*>^Zz0U3h=wC3*KAL;?t)YQsvSP^qc0#7s@TeJ**1t=ZjuUR9 zlk6BaE)i8-Rzc|*y5wuXwiMyXHApWaZ6H)dFj+k+M&6sG*IIa(Ll{n&{8|=~qPr%s zn}pB^uxv^$zo2x{Nhj@Ej?JF7A9)8=bxOr$2Co|%*V2l{zLbDg568vZ zKtdD)@!9` zoMXv(toYXXzL*P^2I4W%C?bAS-u$!l(}o-=cC0t%VaKO;fy{WcpC16^j_fY9Ndm(P zYO)LH+c$VqOmy~$rx-;RK${(7nFPh$(`tqk zPKN3z6$5m|k&TOw%>l`<9OTi`?s`N)oN_ZXXJ{pY!1M^95vUhvot|%HspXs`Rjz}V ztP;bqTozG$WEvS=a+>K)f=1?nf52A++_*2UB>38dRP`uyki(vGs*bjb0{(|zKH@`` z4ebS3=5*lCs$G=)TL_|c{9E`Z3Vtw&&wDX5zdOY5oR?m=xl8-Lg0Y@e%-MhLmJ_k= zU*KV_qNMry{_4frWu%kY6Ux4E(wP7&iSjbrYcnUe$vSTaiIy4CuKg^oF1+9EmbByB zR2&d)>XH?!WPk`*yjh6~N#p%357IWO(D%S{XyUn5-}E71!Dn9FUH&SqQKS z3rmy@exC=)l#wiELl5^ss+<$u9>F@Ts)0O#Mz#L0aY@REqkM8*OJ)lQn2^RklWROK zjKU*aqNAS7)SXX>KU|MmYo_A6@7i|h_SXG5cUgk!RG#|OfL)H1Zu5Zf)s66XHKFJ> z_Mx!|bXR`y8R0A~$~}(7P`L@OB(R2Iw`*QUX-!6wNM3S<*pVc*C@+^U59@_n+)IVt z5^Sg&l#9B;0A@B|>{bUlRxi!Dw{8TvA-M{3JGt0)__zRTH1UwuF9qA6$SnHR@CniG z^b5D;Kq>n6CzyDDQ5jbWwPj3`JIih)W?8@nCBU=bdvkHq3>xd*SKzF zB~&Tji|J_p8ZJRu&4q&zZ%xoIJBTh4G!@!xZo(UaPa*T=)Ed&57|>LpX|AZ%>iC2o zn+D6f4|G#|2~Iqf$6ZGb!MYXDr(Za>3=}nARjQ$tcnjxQMg9!$-O4`nFnt_(zU$@t z_G79!fz)Tvm%|9q%kD)7LN=~QP!hx2k9z!Zi%K_cHtI_L0Nq}fpQicddn)H&Sez6= z+vBk1ACZO!1K{m@PqD~>u0*Jff=@p^(OYp9;l7N@B+QY56)M5f_-c3*bhtgN$rAzn zH&M-N(zn8Y*DMaA%FXhIN~RM&C7RE`=U)sPmTWrdyTDaVRxs>!>*7e_YPMb#|9o)U zm^KF=pl`I~UuALYf#i2g0#rb-p6DZ9nawmpB^@z?1(6MWJNnIYc!-lvCBIFZn1Lg=?x{6gqKllVPgBb8P?RI}sX^)v2h^Ke#h^cnmOBXBy)qY^3E zb`x=0MGL@Fs)R`a;#1uJTrqKF&t5i^K6j##v9q+|xiAwD_pfXj{6K$Ra#rcc!GWK~ z@J@e(n7y0IhK2qji4O(GaAD266?YF$F4*_+LEFkDxE~K+=G?P_ae5!>vy@I{8%LoN zsNqUc+`ffFzO8SThvka10!G{U0CHoOdNt7^wgzd&IA!sW$NUe}M4-Sgkd#&==m$M5 zl5tL^ohE$%6igl~R$Y&^PT%GU|8;`HtE8);Sc5fB$*Y@%#UOdY0kOm$p_FZS8zeL# z+BlB~7&)57jn7E>bAWr1x$;zDQ?@+D=@uf_T&I;(U&qo)pZgW1@}k#wk%=GR3%xRy zP9NPlEL^+;U86sFR*N)JEJQR-lw?~_rRPa#*FA5ndb)q60d(%skj*+y80UYObYnJY zB~9``v0CiX&eo+SnUvTaaoZrc0{FbK*@;(P!dZ>v0+*J8?7dv+MT+}EWQd=5C3}T+2Bjc zqPtK26{6zns1HXF0;nGTW@&Xpq&N@ef37-;N!QY_tEd_+(c9BtJUN|v_1z(ur5m|9 zUFn`3#F2(y&@bc1FujV9&^@vIsLS4qo|{Omrob$T=_ILq=#B1kE4{)ARfbtp-*0m zT6^;|N>PUut%(1jRd;0z@8o0YL{t#dZQOtQk$d@>ifn#iGL^#3D}(e4z6A> z+0wgCWB=L6#kFf!l0kVb7+&ASZes;YD(K7k{sB|{w&F} zL6ODa8=n9oY+RwULy*U)GKsut$zm4xl-qdo!a(*3XwmAhW3V*Jzvtsq@V(3pZ%F4` zX&zsRxbH|W=`w`+^x@uNteEJfmt4N^o7j}BSHQP+7-_UICa zFnw&7l3EAr=>+eH9ZdC*Tz8<@T z8CMlDY{RQTIQTIbQf0hw|8COm=nlzx0{%4|UB>V_3T}hb4$UjjW zGe|elG!ht7bn8)Lz=YGcViV*fis2Ksq(RvD*mE)kzYhH`*Z`n%ahfZbJlkoBTtS$E zn@xP6oaaRmpFZv;Nd>?PJJ>aNN;l89LqZ$SP5XyKZN5J+$ri1dwL~+vzm`61pPLWsFvFY5hC{_^zFD&4Q z!gW;BOe^Kuri9o8tJ#^*TB>7Qo(rm<-k>V@fEeUy96y`p)^b`6c=^Ks+2y!w z?UGUc$#cXda*cI4_e_MbUmD9QwVmY9{LR%QZ)CW}qGOqi?;A<@XY3vXgXx&~lrnS9 zMxfck<886CuY3ZDVE?_ep}`HNZsAWd7m-UhGLql^&g+ZoTW;R^ym_`8I8(wE?RmB( z!$5rb`ETtbazZQy1;7$m{l~@0bq~@P>gj#}R9LbP5*ESUKCq)LdI;D6v~AW*u&CEz z4OwanNaq#2oxpuQo@_i=Kjw0k+D9l-S$CnH?uLd|EDsFwiU>|G_(#ISRiw?~6+WWy z;VgSy^3{H@*gjYcBOTRlM1FE;n4uib*>heuJ0o%BK4FX)F={|qWS5oNE-f{Sgtky* z;DxH&3HIiomHDIgq9ZoJsha+`aViM;&8+kBbXo{6Lpzo48>CbREvAOvM!6V|a4#r^Srg>t zsG^c)0rP=2s*s@9HTvk__wXM^}_9++= zr^T^>(M|k|7I_jI*a{T+3_V4jAd0JwYKaa?)fZ|?u5K944muTaM@istwi%IwRUFxk zY|~Kuli<(*h+TAevQs{ojiYjan7qK|%1-E$ND}|L!yKY&4A*G`<_^;E&&uZ#Me`yd z{BL|$LR{JC1TzeE%Z~`n40>_LvKWm0ecK@Kns@{dC+_7T6Ek?ezqUKh z1II+WlP%KYveD{jx&DH{>DriyNqY#{vxnA2jF-;*`sW{rHI&{?-D}5aJ)WT6tsT?jEdj7>dfM0}( zHWGm8C9{D>!VJQ3wjzPwg5h5o^>(u(qZKnVE8kV{-bBb{AU?Y{>Sa zELH^ot8Yi#%=uyMY(hjjq@fZmFk!cvic$?br^+Wbcoui}HXR}k`ME~cvmIj)Hf)ta zhU-gFoFfkPn1nlfWL>awRf8OsRWpQ~-jZF(%GrELqWOU|<3w8f$jRXjiP~=%+xtqC};{(x$Ubd~S)%j6agwHR@c5f{OA? zyP^WCQLTBP_?j<&?oq92Jzd$#si)-Tqz;`Up23F-%m<>}L+^`u-PvCBhIgm%d*VA^ z*Zj?^#;a~NPJ%8WUZPK~uLv(nL#SV`6{l2Q=8eBSaQV|*`Yr9<`s@W&bg=dUE`x@d zAhbiNKNR`P_Oe1z@OLd`8slddR7${?60MSJb{g`}(8APNF{9vnTf{wu*3)-vqD#&X z6J&a@i4|Za%~OO9DQwpywERr-SXttieTCI2U`^`hY%f1&<~?tYr!~Kc6Qj+m;T0&xrTpa>)sjdy0FeJ9%i4W@ZlTmEiSyI58Ec;KxS87NcoLO?-`?f5%M7 zVU3cHf|50ohy?hm8=(mynndrwQ`L8=Y|p8R!pn%)nyqksv_I%pIBVD_h0A_f)wHzZ ztXTX)vtZRmWF^)1m&5!6t5GxLsV2^0kxnJCD`G>MBE?U3$p{@nZ6;yZwCJ!$?LRg% z^CR1cPG9$V#Z>QRkbVrzKn)oIMUIJdRaTN|fCXe`XV;Q>#d#f{8)pE(!jmsL>D11~9Xcp|tVBZ? zin}1NrBTgl?)J(Nrorf}IQ0bo4f;g326@j90Q!L_=F1)wUeIGHhqdafgKG*i2Jhm4Yjj@jH`W74c}8(?1Cm6irnO z{0Uqrh9x)dQn(u@|!1^V0lzu>W@_E0mRS4i0UAXydHNdr_HkTMs8q8O?! zz`$zshtB{PO@a!zi3*J5d;j$WA&j0%Yb)3~9!_lx?EYsh3YC`4=h28@+9m?8;!4 z;~TEag#u*OFwAYYp90nLWD)%cKOyuf+rcf#rl!X8ZtVUodd{Hag0;Bg+2b_EOhFo? zF1T8>Gc6 zgIH!AlA3}pi9O*Y+R$I4WQw*c9K{Rghp};~6v=Dvq*b>L0J~EqMsaeMR4r9pK^BO~ zj=1ZwpKHqtcFYp_8q!Ryyne6W_qMxJwGVNIUvxKp70D>`y}f*@Q%wq88iBF$uJpFtCDP>ZWwc>iLFlwP-7By%Sg5( zi4$|mC^Yes9h%p)v9*sNr=YTRDW+$TD zKg2|7qGU`c#LUnJB)VROH5P}|_23fZFbkmyxpEfBj?+*a95~Ehr?{KV#b-*NZm4CB z0F|#wlIf@RxNo-v7drQC;K-oahgr(9;dtSN%Nkz%F%(+WcIz(?(d@Wu#o1rIWaQUQ z6FO@e2XQV~GfM}n%=gwR*_nXOEu6+lZHVh(XoBwrt8rjem($>vUya%9Ipg#4RyJdJ zJpB6H-gbqE=`c69!t9g=jNkwW%LG$$P_?B~d^o_~AM_iEOOtl3#d9tBPFsXU;I+o6 z{OTFaf)I>-4L7{imYHDJ*ilVQ=wj$PH@mB_McG8<_C zcm4HRD&xZ%o5|Mb+{<$!Jh*>i_`G3=x%YKIkm+|uI05tOuVHNx0FC~;V4{v?4A~=e zINt#1iBW$dZ?O(EBgXOgJ$)3&IiP=8-$FKKT$h2pF^ukWLj~XQnyc^$NrE${^Di8} z;9CIb!ycV&3BI_bdInRR>j@#Fwl<>l3K`S@h3tE_~vRmc#wx{vF+I9|b&_ zBb8b#OK>e`ox$)X{-~#6Oz71NCSgi`zRcBNS4>e|Q_*_$gSNplZ33x*Hdh>0(vVO? zSm%{44+C zu~9p?mRlzAV5B}xhJ!*RQYUTeK%cRn_-HPOu6!vitro8jEqm4^Ss(!3w$FyRrT z+k0ddeNQIC&X?>sq0azrjo^%5n@f{;_TgHg0RjEu;jx0?< z^JSQALP^TGL9U8pEFuTOQWpCkRzb|AK;M{(13vBM`_Pm1_7=*ZAm4h40DqDm28-05=!t)^h89> z4ZV3~A}Py6U%6+ysvIw9^#{3YS~^(QB$h@p^&(4lWSZUW)mnFCI+^UqiwNc)N7F>u zcoPSPWBuHss7OBcm>fM2w2?~rFMlv?C}lhyw9qaqzl-Bi9lKTZyicOGFzhLhexdPh zt|HE$kZ}C~nWSP|*fVqMh4)H0#@`~DhUs7ug@AM}@t5fBTqp>Kj}_KDwwdt2Ak*wS zE~T-1+d>32k4exI0Hs;sWECm`(2 z$ZPc#Sa*fw2ujJBtFvfV*=@^~Au75^F{CdQ#W1yy>*NC8btL1Z$$KXiEO{cU*tC9_ zW1w}BNS}bY5`(Q6K_)Iy6UEGgJqJO0o*Jq%soXxcbVA`=w&R^)K7z;SkH>(0@%Kfw zktXy8c=NpevRpmy;=*pXg?NYuw=>WiSN~lnvv8?*Bx`2T2LoEyLf#**`2F1tF{U3Q zDhYlcJ^?1=W*pi!k&Z;W(!gR2!LL`@=YlY7nR((rc%w>v@w`<}_K#jU_T->X?)v>{ z{b10mxB%bV>n&S^?BC7kd~h$Ls~~?9RfJcOCvbSNVH{oVWW^Ver_Y0Xs)#kFe{@S= z^ue^!8vXhfpM;C^dr%Quo)5ct1Yr`57DhJ@<*KVZv{~zW(*Cdwz<wBX zCSoka!}%|tL`+q_*Toh}cNa8FF2lLC?{pb*p^R3Q;O8qMHkRNlOiB*SK4<1kP`i+a zjLMVI+fxEj;^WI`ix!ifBKZfZMoo3Dcd$U(GTSIy+qCblMAZ%(NsgIrwwa-s0s^hP zqE$)Uwk?fU43c1FJWnD5mt1K*yiBMKILnSxZZO8Q4pr78)is2LpQ{9-A_F4>jX1(T z+17V*SU#3LWp=Qu(*7V#I*;}hqO;HP7yoIY#6wpw zik(_f*3GjO^y+xFuOv=2LMJfBv1Zr6A#}orZfe^m{u0d?cl!;u+F0iczc9Wno&^mQyhBFJ|LrXiKQ1;L#Qo1Q z$GJ&OrDXd>37KL+*u0y-0rD3iNxwRZ95u62Jr0;!HbJ`gUNq*zqH6*Rx{UX|y;S@DOW{ReeRPTkUB54&2PV zMR#4Y9t}d%LHZ?2_UUd8{D6~kzXE&4n^u5ojgE zm$P24@UGa4UgDkdYs@^04#`F@=b|uYLR#H^%z8Ir?3Sb&rXJl(U8S^6@da>YJGt%G zPi~)g@AahBjk2-qM`ycsvJEsPK;BEaoJMEWuKti&lfdj-Te6MLwHx;nzrHHozxrxO zb`fuQv`6H5{ymUYTPKAi*S}wC03d>0FUjEw)M>)_j*ww-;U{(@-j(O7g}=Yp_1z5y z@(M&NIzw{+-8XmbMdb8X5WtJ^WYLq$(fC&!ac?p7pC&h3vli9E&@4>Bg%ZJ=RS{hZ zQEX25?;!C@Y_^|s;1&lIpkUg3nI@Lxxwi9O(85QPY|M=LvX4Mjf+3kpl6`FycAmM` zN^3sd?m60_LJm~J;T~cpB$_J16*-h^qq6!qffP(}pPHMeW?CaH4OX*aF~S_LSrQe7E25!1BTWk#&f6@=G86a?=4a>-(ui3M zCn@;cmHt~H_%=E0OJn=*q6Kd5%S1dNl7S!ygCM?GQKD?cnyoVzWO2-L+RuPj#yO*I z*~ydIzV}Mf;GS@AJ+v%7Eh+i1g9QR%PUTMk_!E)GKfgrDo$q6LuF>PXrSq+i7n7Z5 z{ysFdfXI#Z-p?%n=p{`Swy2fs(V1mSj1k6yk|Sdch$e(3gJWf>tr*9sO?^tZ@$mR( z1`CdVc-t8xl9E!knfmIq613MU&^Wit?bb{xdNqq}p+*@;;Y-lAPrV zO~NW@G(>i+%|CrHdiD28x@xbBysAD z{ZwAd-wR7J<+;vUf5;?7!}c82S+_-sR;b}$v&}Ej*)MsuSDK&ewSF<`Rvp;0W_rpm zp(Qt4+u&3bYH{1;{a%=HKMJ8T?VL}Q_%eTW^J;dRS#aAXcQ7!bk9Qx4&`4nWlH3w9 z@*Nlj5-P^8LS3b>3z&nDJW00|I0JPwBq;PQO1~x-UH;-{zJMZK$brI9pPi^E*RfO` zMDz8Z=Y^}AJd|vF!S6vv;fd1E*wjJ>HTZBT0ZiTo{_s(WFloZ!TR{PvD16w78}so?cVf-t8PS5&+ReVO7zqF zeG53MA?`5ypcV=pG@xoW6i`ml>YhNOB`^rYD0%ILilVfjOAjs+dAccC|G4O^r(e9= z%hs#_S9yYt34tn9?+V(i$mX+^1JdfuipJPgC$HRH$)WM8YS7%=GAZ)yV+MWiFULWF z4HU7S{#_G+sf=ii&C_rq&sXCw--n=)w>KM{I6l(`6&%5gt6Dlr@OJ3qzB^FkW;v5S z58&SF>DP?~IP{)8N@g4cYQHB(wfaseI)%8F=@9Vs4G$09LKMpj*x1L-jv=ofuJM%x zDMY-iM?C9_N4W4{RvDgX#^m?oNOhUWx{sR@0| z7h*n9`GRL7E4W&4iBu1E2ril|s+g@>OphxG;|Xw}7P=J(MaDDsE2orH6R#T#)+5=fe?9T+wt?Ye`J~V@>-7NQW&&yP zQ=*lQ(mO8-?2E&$Y_)JyE-^WrAA$-fs5UT$a2_O6lqLg(R`{3DK^$Pr|6ldfUOEas zKxo}(QRNMadM}7=mO8|l17BhDChCqN4DT3IzYD5{atsv$SeW2}t9t^f`_qoBkb#VZ zI{PE0?gxLV%MdhRHsz!I#$wJIU((ooG1loghz1UT&tY~pEPhUfl=S;i+b|k}D`sX- z#k5o@&+y#L&E~y1d2q&qT;gH@kN`Jbr!EYuilHnlquhfqjH-6WKhn z{+jkyuFT$+VGf~UvF<}C_iKxE*RwKgSgS!5&KghM|4X@~24e%qsuwK%fRSm(kX&bndn^`04tT8B}o$tR8kI5z7G!~qKIxgv_%sGnHLHfFwZdi{vN0;Eq`qMdnS5`#TL8`i>pkvU}P7cvN6(~#3}&*S`*?0il~Rg zm*F%+{y2LNNM3(TUs5$%oN5%BNLs>BNcC$8;*p6GGXdf}hW+jMfIj?bbxMd{JD&m2 zzs#i2C)14vzF!~aL|$iRMMlJ@2p0>fvQIi;2~YppQ`@HsV^1a)IIwN5iQ-e{V1p*b zQj-f|L_+kG1nY{?t#QQ$<~fh|si!rAkjnDU!7vN09REwm|X-=sn#crEHv7z=A z$E&n%(gvwo#v+ccFE{h9PQypQMWDXafv){C+bL~i;=&i~QS((RHPu_0I-BtW6?w&6 z{e{IFL(TR-Zy<{j$j-rIqY*)6I%C_`;Cq%wL#p2X(z865R$BHWOo89gKp{2(HdrP}hl%(MPY;^hFJb38oElq7b zwsRl3r$(3ZkZ@&T_c#K7L-Rk`{7*DG)`?j$^~MU8jc-&f`b5?MgpaXOE9zm3r!`tj zpNQ*=e)ji)Q!A+{&a1>kTcl>Um69fNW|m$^IYdhgycS6Fia&Z?N3glo+MO;>BK3Y< z-V%C`-9Zg>U*VBZ4{)q#d-QnWvLEoca6IhibeZPE+4(}fXjfoU51*2gNlO)el)Gaa zlwhi#HGa&0as0}8@2}P20RG*rRS!t(jngD<^{)&@{YH|;{VWeLF)Q+OuE52-5u$eGsF3C3}wXb)-y^g>Z~-PWmlPIbaY^FAdvt)XLf@!w?PUfjl ziGGwlIy@}@V4={|+(ueMZKC}dpGBUNNeww5PCw?z%$Wfik$EgESxl#f?kpipMuA|? zP9G2sxh9TXO}rniUj4GE>eQy&?uC^a#Lox3^P5%eAmaH#U|l8bFYKXD2Nh{>c5*yt zO@^1x8hBJjU7P(;$Q37KQkx-W-uxCe`zSEzRbAV8e8M{^DVeoJ>rY8`p97PJ92yWL z{#$6|bS;a2VuHFAYVn&{!s{h>>~uXb`NWO6!mY6U50$RPJBKbGX8Yeki(cCmT-aj6 z_B15jxP4H!1le^DTlM?R4mhKE4wlV|eJL6hLfFb=DZb=fR$sI%`eqJ)I|N8jO+@y* zcE9hfam2~D)a^x*O`!bW^|y%dkCw3t+`w~=MD*d9IG&3Cc-QPTyW-6=A*D`Qy~4vB zyxj|u7)G!|7KPv``Q$3%16r>p01`XuY;Q-2%N85+oI|Z3SzD6jrnObFjL}S|3(vcW zz$!52mwhiPA5?2nHuYeLS+tS+@dJ3tb)8phh#WNlpB3Og2GbOxv)ehE~Hm@C#Qvht1x6=cw~<^M7<$5cK>C8JNcc z^M7|ytCL#N_!rNi90i|~M7^plm7g3b1>b@wwJ((>J{S zTY5{w%WhPm2c46HD@7-;8p==6Oq;|97bx`6#4}^DkzrTI6{X!FQ$X3eyd@b&MnH{* zf-?7DccG0Yg{R7=5BhcI)hOe}NC?FYk_1i)$m6&O4p`UAbiQ!hIqx{XISHjBXB)uk zjXL=P_3ED=Og5$|sanXbL_>ZFhP;nSy9Tq^(3!uSH12ZG%tqovjpp;l@Bpdo;jN0rb zocAAhil9fFr$i4p2G6xsy+U;@XPQf>Cmfkxpf^&?en@RV=TL{1`s$BEQn4T58_Y5p zf6}E^l3|FA!^^ykwNLd@VGTEHqF^Iu?Oo?@>$P#A$U*FxkhLs{RJd|h+5h4ezyEI- zLXUanEd+jCw2}Y(Fvd*}OmxE&Qz;tqFAC$gc>Axa`@)K|lSg`+^4QO>+fc&cLn2QGK{%$h1t+)}&h=rSZP?-bfBN;+<$ z<`!Q|g-x4I{pgo%ZY-a2IEwIiU8~I>T6u>o7>t>)Z#C%vYAP0_$_FFAz(+x6J#4hG&tJwDWb7&& zKF`#D!%(2+QxjM_WBm{Qn7|5CUMufd>-&jUT%BQa>W}Or;xlTTly+jtW6TbE9MyMY zZQh3S<=^iv-9wd<82{VThs0QwB>*89Y#L6fqmk5}Z@8R#qk%<5fK3yeqSCLoCX+%> zz##lNmuw^V5nv;QCjA8916%$FBi8SyGXjb58aDh74&m=(g`J3!)HWXisOs8UO%>F% zTefH1?v2i2u2cLR7*WKBaq)+RNraMUbmM0@6Bkm;y;8lptbdB}W;r9YiHGK`&DtcY z53-U!U8rK3`W&9K=5PO5)VCxHOnV$N^(`=gi<`@rL6*3w$G2%MA&}jG#HMU;Y=o$& zRPI^D9fsUvW7fcRn>gfBT~4#u@NL$-65s?c&(^_UzOwIMY}X89ZwYyBJ)aZn$G@v2 zju95yP!8VIWjKq^4)o&ZG2|Eftjqp5%K@jn>kEZjz#yzcuV#N3qQO;rmT*h;*}Mr@ zLVJ8}U~~%oDlNjq3(0CsOg#LW(e}THVq2kg!i4H4OVux!Iuf5C15;`?|l2btbm#Orb zprhdIZwXPorNP^&m%`MUV%!DL`?-3|mGprz6wBJ#XeZ;;X3|Q$TFtr;9vt{}I^#bC zvX9ImenQ2U8eAnv7)I>i`kd#9y6Z-^=XfSA0z-7`3*wc>qRU*1>xb>Cqf|8;kgxEF zwBUk%c5c2cgpP#N{rX`5Y+ZR_!;|?GO6jrR;>wIEc;)v>+RV68; zOdRO#?12bg`a2154WT+g6aMbWS$2Uor*}ii@k!}fD|c&U*)sJRRzk((_D>5{k!GQ# zt0?YeodqhP8Yuy9W@f3~*plI*F}wYjEiy~t>KofxjtQ_s4} z06RitW>CdW*dIz{cJ??$9&avACvwb5#zjwMA*c&+n=O7b=AGA;ry8$2M)a-sf<{-m zxjOG4LJn6B6%w)Gg(C7?oK0iP6O+zfc3x91CY9y;$P#zwP7o5NQd&wbn&STRN|0C$ z&kKNZ^g%VMl_aYo@Iwf=@p1NK2mj#NMx~I$0Bac6vDv2w-jIG%%%e0Hs>f6zeK{4e zbI+1mv(}~6o285BAhj@W#8Ya(M%A^ZgEVeORfsgkHhpmmC&$&v$?{!Xg_=EMhgqC0 zw*&*H_*>0;0LDoZMf2cjf-JL!UtA%ToH|ArBX7e?$o*`$CWu#JUl9WS;t#Wx#ilBo zARt!-u^|I-=y@5qT{LafRz_8;IwgB`w_99{1H_H2O;@T1N_o?Cj!SM@k}^D--)*M1 zpTZ-bxOQh{Upo+1H?FW7Dz)WFOnr*D8WtNR?fQE?K4!l0Q~RBlQQqUGujRAfZQW9L zz2ql~d^f+1+$Sa%|6E2w zOWyezX+KU6)~!df)1lJV`C&@UwZI`7fG%=!H4=WpzD~N4Kw%U~Ao3Wdcw+D!z(&)Q zZN$!yz^xZ~0sNh;Y>w8Wyu+Oiyy_~Ofy+y9F;|u{51!UZzhnwH&90at5u?L1AV<%n- zkuRS#?n?z$+sehu8dcaa%llAKh=nemx#8I|U`_4e=XD9m zbVBkI6Jm@6dVBe6XEN`Y>#{$pY_wLZa-GUe>bzn3c$1WxHZ9(gWmR>;_%EU-J~S1J z>NP7TAcO_-TBIfPNvM*VYG3#p1TkqMs9%b`^zd4paAo zE+YZC8En)yCuh{fFwBC$`7uV&qjXhQCv!cdK9=5 zSFX*<-o~Onk{{n;VSYVZ#Zw+aM&>YRomA?$_kXqa1e5}}T!5$?P2fTwS>8#sCHK|^W)bvvrofOj+_%ka*>bfRWni` zqS$rHbuoMs}+tq-8ogXKJ~Hs65wVZw-ru!q?R&z7gXV>|g}=&eklo zYajX**0roDNEH<(XG~0$5>=c8_jJen)5>Bb`4x8@IKAG3sCjN6>s)Zk9r(mVPFx;6 zUdpyMQ`^6b<||RC9}6;(Hw!1wf2NEar(u$v%;(Ci(C3vD zzybXqp8W$D^qyYdWXlb0SU8WT`NWBF%Q8j+ z(d;mX3GIoFnqi5z85mp$j8{pxml%mt5eH^v(*Bs%UJ`E*FDj_$LG@;O%KA)1 zb4Bu~Ry8@hh~RN(FofHNhR`(y45qwoGhuCRdZ)Oqwvd%jIIO~-5(g~ zRI0HZ$4oEo|8Pvr@O>Deh%4hnQB#h${c$ypLrB(7kDBJNCQ!ZkrCnSM#-*9ZAaqr^ z=r)Jg$~$!6Nm?N)cAW-GNl0kjX_5d5>)go?Mjs{F6-AsC>2(LZmDy?vEJL#Br@tHu z36x*6);;%p8t=4M9XYOXEU+@XUB3IHF$sy59xUNC2KvX7mq3=|+&DIjIG}&HY*PTt z3%^u+$=sTJI*;U8?>;;Aff5;^sqU+Z?vf>O%Sw^r0v<##w37+~H-~q)UJ~+;y zFRrFst3I%#OrJ#Wv|8(U>$xM^b(62)qSdya8wpzcsTXe$+%0BBvTt7u_#!vo^q`5E+A68#ou=BC-pG!O zFA~V1hP|hs4VXL{H-9V@=e;{4Ib@FTE}u+&isZF&u=-$bd1>@v;k0x;U8v<#?;C}S z(lmLNfTw1))%Mt&h2=sQI7)6AI0QVx;i%b25jiRLV*BSBYMOSmd$Qf{^6B@MEGC_M zvlVmjR0x5rd*m;6%;6&39RCvBYxy7n>#4$HeiemZTj9>he0`}}(`05=mHm8vk)SvJ z2kk>Kbmot#On2C~cj1R3CY@`IS>$_N(bN4Z{jD#ret9>K|6zp8WRBDSM?oS9X(0o4 z6qI%*Ohxb^(N?o_rZ|V`7cLAV^Ytwe;ibYzi47&t*te%^V1*_Udi=0#mafN=b> zX_j{}?>N{AsQbb^svUow>G=9Ep+SD@!)RWQF;zU$Rae z9cqp40mgukAB!2;2~HvgVlKLbyFF6IQcLKHN`Hey-BWvzgRzHJV5qx;u6l|6mO>ZsY&cwZ)? zou0U}4BC_rQW&PjoZidwSXEtE5359uUz6$I^DuEALc)j2_!eCKq{2_GHTX1B1TQx~ zGaNsl_AAI%CxjY_@%=|1s4UNJt63PoU?se{pdoNM+eW1c6(TWF14lF=F1xlL-Uj`+ z^atj=xws?kDJdsyN&szBoo&-75i(-OsMfcjTivQwG-63S6k~?L4}>QHqH1G6Q15<8 z8uF3IF+Xcp$e^R2oudWML?7)CE6IVh;;4!jglLN4Z^UfCB9=U64@I#b1jbr*yKVdw zm>3-$M?;SI-Q19&Ut>2r)V%0UyW}?3mF>n#g#|kUtL^w zNNWPI;qXXqPsQ}DLTd)g=WnMvzC?ejPlSL)+(7HL^2hlZpT`al*}L8pCv`Q~r@vu{ zLU6%9TA)y88(`X(9MEr?^Yu=N_l=-g@fAOEdG-hRgD~8h^NRcZF)*d3!obBoFKV_8 zY9L-PtIkGR^Uni+45mPk@L)r;tg2&-$%YdO0$9y({Kr`Fv+Yu@9?)XtH4=t|BwxfE zu~ejiQtMmY7Nw713R%DCi=8Mx$9ZDTb&Q z;kelUR$bu z&L-IJVbRbTb)9QQqbEGOa=Ds9zDQ^BFrmE5x!H`ARW>k+P;|#ks4cTjgM`7k!q4v~ zR=weEeW?e`ADhB5tD3-Pm4vg@id<~gj3)ayLa{|QtJtMp4f03{eHP)$IBL;}87B;=541Ot|x%JEvqaaNCqX83J)D%k*+v;=aBS8okO+a8H0BA4^eG90)6jN4>t9yn-es3T!gTWV6>6ie;dlaj@7CV+9Uo}JA|hBCc%U#d1CXfe=e2-_@?n!6|^ zEoWjo;bIeZJPb*uJd0BWxMflNFg2o^G85FM<0;BsF%@2mvj(Vm$fc$!D#b)+&8X>k zDq+oJ#xuE8jiN!MyGEyD-CwTL~4nSCz)%42zQ~TV72yAYfBUFhm3R++fX=SWi%yScOeu4ekh5g(}502KD;+eKm{ZKQzn9dLjj&wL~MvVvKippDizQjqG{tH~P1|I=nD#UnsXbO{NHFZITUQ&c zS{19En}%WEGz<$B(^_r>CZg68gMs#68~42zmeZB(%KmHF^9iLCQX$Ng zNvJ@{=@ifc3PA!0j4YEpKpBc^NIUTK;jet*r{pQ+t^twE|sOIopq~*DVc4vU}2h8EXA~f zXDL|PP*$_;iIIi1RMbGllpFzbv8}Q}DZtDhl1_%nC=6M4#?4_SAulScEdzq8(1csy z44j(9VHVZ|weD1_g2z%}sey4KkQ_+urPRF~YusBrD%xbNOBV>~uq?4 zO(SY0&x++BRy-=oOYKgd?xGviW}jWMK`7o)Gns0_SFyJk+B141dKOPMzIt?wQH+NB zN7j8>ct9tnb7|(yl;=&)uq!KTy_T*i50hlVn910lk7M$WZW#CaC|GoE9^(Vt-feVQ z)-?$^5O`{7kok!KkO70eLKU(=r&Ixca0=at5Dr=u01AP}cGs{%1d#`a+5B=jsFlYE z^m{@80E0gcfD@4S(?Y6rBqW7K{0IP^hM zh&45hwy?wk5z10vi{EHZU|NEu-6^sSK-n6gJXFRAF#$FL3k;U>#=`c}Q5)5%ZlzHr zkL^qAcmScr(~wO;5aFGc_D+i39OX@*JAdNNo83jkrpv^H3q@O(w+Ac9cxj<)JuRRm zN=56u2kKm^3_8kVUAK=iCIoua-8J4F&vR6s;zzL@ZAn9l9W}L=np!b^DrOWfx8rr4 z?0QxB5^~fv!8bPX)O1Z!kbS=}38?oNX&mDNofro%Cm74iqc6sEoN#KFXZ?AjPqYEy zSu3a20F(tzKGDQTvOxf)K(_k#DTx>PZC;-o0BLQD0cH?F0Qr?6-&G;=(-s<{o6gDq zyRFQ*ZkGxlS`sirgc;}tdSQUk(NqHfURNa30H%J>z*ko!;}8mh2L5{)fC(G>7_n;_ zvyJ9iWL##9OPrtpkS1bgd#S@7B(<-zSS(g=Z!Pv#t4)2P)%wVhs-{{oEV5F?dZKDA z3&9PM(YA(I@#HhG$Um4vifzIXfZ7IPn^YkXTFNU>aul?&Cjz@dtGmN&RGSp#DmGF< z3IJ+VJBb8sdD>R0?TuQWO$oKj9wyr}lS0mA4T^XeC}_&Fcv&l7U=KpE5&2iUp?QhPekPi^JQvjp?xN#l6gbOg^`PW*L*EjaIFh)-4SivxN-S)U=kPSg0W+BLZ$@9)PQ@UdFd#jq|TH zV!>=Pfz=)%i@~xbW?qW2lu$WkAx1!lID)|P;sAu3C@_$uh{|o(sF$(`o;buwO5MPu z+S(!uym~^ut3_|nrApO+-$*QwxI#Qp!>qd3Qg=2gn>8~txaexECwI*SM2Z}h#m+!) zI^ziQ&8X=bm813y16`!Z6HeIVa!DcPaadmGf8mpPc-YPTiAVq96UZUK_T3H^k^cTm(+GdeOqBQWOe${~y- zh?#I5brJ>&FEHLlmDfJgBgW2|5Oq#i+ng z<#n$9u<^FratSkxS{;v;YC9LJr{2Ic9j9f_V)C{>Yt|l*tqCgL8I*oQ~1BYsI~yq z>(z|m)Dl3~tFAR00Q|uLunc?G*keEff=HeOfOQI;L;*2;N&zSlx+^W?rvPsOfJF>x ze)>9A;C-dWNUp_(0Ifl;yhn(|DX7TrJBUDJhm5BHQV0SI&;k5OfRmJ3L8hnyZKD7l zX7uHJ(*tN>i3>BjHs3V{1TCz9xPukbSz(`TM;l|!e8A0Q#wh{-09do7esb0v4>N1n z)YZ&*F|AmpHrUjf*f(}$ejiN(oJc4 zI^$qHVJyB@&>z25=q+n!9IO?sEmyQw5Ox$UI}X+ph0B!O8EZ;|0NiQ7o$<0u?x`qz zt~hv46fRRyxa@eD&XPN=DeXT1nC>i1$(>$y>EGfb?G1p^l-%jw@v`seJy-bbdwI|0 z-f0g&`l|RypI3S;rS~6zWqV$_xGFx<=Mj(edFOS}1^}tFZ@njS%K!jy%Y5U2T-MR^ zst5g}tf}dO;#cW^S9;`}>tn_9f5oo~|GQF6aw!0`zgbL> { - return utils.startMockServer(pollingPort2); - }).then(() => { - return utils.startMockServer(badTgServerPort, { bad: true }); - }); -}); - - -describe('module.exports', function moduleExportsSuite() { - const nodeVersion = parseInt(process.versions.node.split('.')[0], 10); - it('is loaded from src/ on Node.js v6+ and above', function test() { - if (nodeVersion <= 5) this.skip(); // skip on Node.js v5 and below - assert.strictEqual(TelegramBot, require('../src/telegram')); - }); - it('is loaded from lib/ on Node.js v5 and below', function test() { - if (nodeVersion > 5) this.skip(); // skip on newer versions - assert.strictEqual(TelegramBot, require('../lib/telegram')); - }); -}); - - -describe('TelegramBot', function telegramSuite() { - let bot; - let testbot; - let botPolling; - let botWebHook; - - before(function beforeAll() { - this.timeout(timeout); - bot = new TelegramBot(TOKEN); - testbot = new TelegramBot(TOKEN, { - baseApiUrl: `http://127.0.0.1:${pollingPort}`, - polling: { - autoStart: false, - }, - webHook: { - autoOpen: false, - port: webHookPort, - }, - }); - botPolling = new TelegramBot(TOKEN, { - baseApiUrl: `http://127.0.0.1:${pollingPort2}`, - polling: true, - }); - botWebHook = new TelegramBot(TOKEN, { - webHook: { - port: webHookPort2, - }, - }); - - utils.handleRatelimit(bot, 'sendPhoto', this); - utils.handleRatelimit(bot, 'sendMessage', this); - utils.handleRatelimit(bot, 'sendGame', this); - utils.handleRatelimit(bot, 'getMe', this); - utils.handleRatelimit(bot, 'getChat', this); - - return bot.sendPhoto(USERID, FILE_PATH).then(resp => { - FILE_ID = resp.photo[0].file_id; - return bot.sendMessage(USERID, 'chat'); - }).then(resp => { - GAME_CHAT_ID = resp.chat.id; - return bot.sendGame(USERID, GAME_SHORT_NAME); - }).then(resp => { - GAME_MSG_ID = resp.message_id; - }).then(() => { - return bot.getMe().then(resp => { - BOT_USERNAME = resp.username; - }); - }).then(() => - bot.getChat(GROUPID).then(resp => { - CHAT_INFO = resp; - })); - }); - - it('automatically starts polling', function test() { - assert.strictEqual(botPolling.isPolling(), true); - return utils.isPollingMockServer(pollingPort2); - }); - - it('automatically opens webhook', function test() { - assert.strictEqual(botWebHook.hasOpenWebHook(), true); - return utils.hasOpenWebHook(webHookPort2); - }); - - it('does not automatically poll if "autoStart" is false', function test() { - assert.strictEqual(testbot.isPolling(), false); - return utils.isPollingMockServer(pollingPort, true); - }); - - it('does not automatically open webhook if "autoOpen" is false', function test() { - assert.strictEqual(testbot.hasOpenWebHook(), false); - return utils.hasOpenWebHook(webHookPort, true); - }); - - it('correctly deletes the webhook if polling', function test() { - const myBot = new TelegramBot(TOKEN, { - polling: { autoStart: false, params: { timeout: 0 } }, - }); - utils.handleRatelimit(myBot, 'setWebHook', this); - myBot.on('polling_error', (error) => { - assert.ifError(error); - }); - return myBot.setWebHook(ip, {}).then(() => { - return myBot.startPolling(); - }).then(() => { - return myBot.stopPolling(); - }); - }); - - describe('Events', function eventsSuite() { - it('(polling) emits "message" on receiving message', function test(done) { - botPolling.once('message', () => { - return done(); - }); - }); - it('(polling) emits "polling_error" if error occurs during polling', function test(done) { - const myBot = new TelegramBot(12345, { polling: true }); - myBot.once('polling_error', (error) => { - assert.ok(error); - assert.strictEqual(error.code, 'ETELEGRAM'); - return myBot.stopPolling().then(() => { done(); }).catch(done); - }); - }); - it('(webhook) emits "message" on receiving message', function test(done) { - botWebHook.once('message', () => { - return done(); - }); - utils.sendWebHookMessage(webHookPort2, TOKEN); - }); - it('(webhook) emits "webhook_error" if could not parse webhook request body', function test(done) { - botWebHook.once('webhook_error', (error) => { - assert.ok(error); - assert.strictEqual(error.code, 'EPARSE'); - return done(); - }); - utils.sendWebHookMessage(webHookPort2, TOKEN, { update: 'unparseable!', json: false }); - }); - }); - - describe('WebHook', function webHookSuite() { - it('returns 200 OK for health endpoint', function test(done) { - utils.sendWebHookRequest(webHookPort2, '/healthz').then(resp => { - assert.strictEqual(resp, 'OK'); - return done(); - }); - }); - it('returns 401 error if token is wrong', function test(done) { - utils.sendWebHookMessage(webHookPort2, 'wrong-token').catch(resp => { - assert.strictEqual(resp.statusCode, 401); - return done(); - }); - }); - it('only accepts POST method', function test() { - const methods = ['GET', 'PUT', 'DELETE', 'OPTIONS']; - return Promise.all(methods, (method) => { - return utils.sendWebHookMessage(webHookPort2, TOKEN, { - method, - }).then(() => { - throw new Error(`expected error with webhook ${method} request`); - }).catch(resp => { - if (!resp.statusCode) throw resp; - if (resp.statusCode !== 418) throw new Error(`unexpected error: ${resp.body}`); - }); - }); // Promise.each - }); - }); - - describe('WebHook HTTPS', function webHookHTTPSSuite() { - const port = portindex++; - let httpsbot; - afterEach(function afterEach() { - return httpsbot.closeWebHook(); - }); - it('is enabled, through options.key and options.cert', function test() { - httpsbot = new TelegramBot(TOKEN, { webHook: { port, key, cert } }); - return utils.sendWebHookMessage(port, TOKEN, { https: true }); - }); - it('is enabled, through options.pfx'); - it('is enabled, through options.https', function test() { - httpsbot = new TelegramBot(TOKEN, { - webHook: { - port, - https: { - key: fs.readFileSync(key), - cert: fs.readFileSync(cert), - }, - }, - }); - return utils.sendWebHookMessage(port, TOKEN, { https: true }); - }); - }); - - describe('errors', function errorsSuite() { - const botParse = new TelegramBot('useless-token', { - baseApiUrl: `http://localhost:${badTgServerPort}`, - }); - it('FatalError is thrown if token is missing', function test() { - const myBot = new TelegramBot(null); - return myBot.sendMessage(USERID, 'text').catch(error => { - // FIX: assert.ok(error instanceof TelegramBot.errors.FatalError); - assert.strictEqual(error.code, 'EFATAL'); - assert.ok(error.message.indexOf('not provided') > -1); - }); - }); - it('FatalError is thrown if file-type of Buffer could not be determined', function test() { - let buffer; - try { - buffer = Buffer.from('12345'); - } catch (ex) { - buffer = new Buffer('12345'); - } - return bot.sendPhoto(USERID, buffer).catch(error => { - // FIX: assert.ok(error instanceof TelegramBot.errors.FatalError); - assert.strictEqual(error.code, 'EFATAL'); - assert.ok(error.message.indexOf('Unsupported') > -1); - }); - }); - it('FatalError is thrown on network error', function test() { - const myBot = new TelegramBot('useless-token', { - baseApiUrl: 'http://localhost:23', // are we sure this port is not bound to? - }); - return myBot.getMe().catch(error => { - // FIX: assert.ok(error instanceof TelegramBot.errors.FatalError); - assert.strictEqual(error.code, 'EFATAL'); - }); - }); - it('ParseError is thrown if response body could not be parsed', function test() { - botParse.sendMessage(USERID, 'text').catch(error => { - // FIX: assert.ok(error instanceof TelegramBot.errors.ParseError); - assert.strictEqual(error.code, 'EPARSE'); - assert.ok(typeof error.response === 'object'); - assert.ok(typeof error.response.body === 'string'); - }); - }); - it('TelegramError is thrown if error is from Telegram', function test() { - return bot.sendMessage('404', 'text').catch(error => { - // FIX: assert.ok(error instanceof TelegramBot.errors.TelegramError); - assert.strictEqual(error.code, 'ETELEGRAM'); - assert.ok(typeof error.response === 'object'); - assert.ok(typeof error.response.body === 'object'); - }); - }); - }); - - describe('#startPolling', function initPollingSuite() { - it('initiates polling', function test() { - return testbot.startPolling().then(() => { - return utils.isPollingMockServer(pollingPort); - }); - }); - it('returns error if using webhook', function test() { - return botWebHook.startPolling().catch((err) => { - // TODO: check for error in a better way - // FIX: assert.ok(err instanceof TelegramBot.errors.FatalError); - assert.strictEqual(err.code, 'EFATAL'); - assert.ok(err.message.indexOf('mutually exclusive') !== -1); - }); - }); - }); - - describe('#isPolling', function isPollingSuite() { - it('returns true if bot is polling', function test() { - assert.strictEqual(testbot.isPolling(), true); - return utils.isPollingMockServer(pollingPort); - }); - it('returns false if bot is not polling', function test() { - return testbot.stopPolling().then(() => { - assert.strictEqual(testbot.isPolling(), false); - utils.clearPollingCheck(pollingPort); - return utils.isPollingMockServer(pollingPort, true); - }); - }); - after(function after() { - return testbot.initPolling(); - }); - }); - - describe('#stopPolling', function stopPollingSuite() { - it('stops polling by bot', function test() { - return testbot.stopPolling().then(() => { - utils.clearPollingCheck(pollingPort); - return utils.isPollingMockServer(pollingPort, true); - }); - }); - }); - - describe('#openWebHook', function openWebHookSuite() { - it('opens webhook', function test() { - return testbot.openWebHook().then(() => { - return utils.hasOpenWebHook(webHookPort); - }); - }); - it('returns error if using polling', function test() { - return botPolling.openWebHook().catch((err) => { - // TODO: check for error in a better way - // FIX: assert.ok(err instanceof TelegramBot.errors.FatalError); - assert.strictEqual(err.code, 'EFATAL'); - assert.ok(err.message.indexOf('mutually exclusive') !== -1); - }); - }); - }); - - describe('#hasOpenWebHook', function hasOpenWebHookSuite() { - it('returns true if webhook is opened', function test() { - assert.strictEqual(testbot.hasOpenWebHook(), true); - return utils.hasOpenWebHook(webHookPort); - }); - it('returns false if webhook is closed', function test() { - testbot.closeWebHook().then(() => { - assert.strictEqual(testbot.hasOpenWebHook(), false); - return utils.hasOpenWebHook(webHookPort, true); - }); - }); - after(function after() { - return testbot.openWebHook(); - }); - }); - - describe('#closeWebHook', function closeWebHookSuite() { - it('closes webhook', function test() { - testbot.closeWebHook().then(() => { - return utils.hasOpenWebHook(webHookPort, true); - }); - }); - }); - - - describe('#setWebHook', function setWebHookSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setWebHook', this); - }); - it('should set a webHook', function test() { - return bot - .setWebHook(ip, {}) - .then(resp => { - assert.strictEqual(resp, true); - }); - }); - it('should set a webHook with certificate', function test() { - return bot - .setWebHook(ip, { certificate: cert }) - .then(resp => { - assert.strictEqual(resp, true); - }); - }); - it('(v0.25.0 and lower) should set a webHook with certificate', function test() { - return bot - .setWebHook(ip, cert) - .then(resp => { - assert.strictEqual(resp, true); - }); - }); - it('should delete the webHook', function test() { - return bot - .setWebHook('', {}) - .then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#getWebHookInfo', function getWebHookInfoSuite() { - before(function before() { - utils.handleRatelimit(bot, 'getWebHookInfo', this); - }); - it('should return WebhookInfo', function test() { - return bot.getWebHookInfo().then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.boolean(resp.has_custom_certificate)); - assert.ok(is.number(resp.pending_update_count)); - }); - }); - }); - - describe('#deleteWebHook', function deleteWebHookSuite() { - before(function before() { - utils.handleRatelimit(bot, 'deleteWebHook', this); - }); - it('should delete webhook', function test() { - return bot.deleteWebHook().then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#getUpdates', function getUpdatesSuite() { - const opts = { - timeout: 0, - limit: 10, - }; - before(function before() { - utils.handleRatelimit(bot, 'setWebHook', this); - utils.handleRatelimit(bot, 'getUpdates', this); - return bot.deleteWebHook(); - }); - it('should return an Array', function test() { - return bot.getUpdates(opts).then(resp => { - assert.strictEqual(Array.isArray(resp), true); - }); - }); - it('(v0.25.0 and lower) should return an Array', function test() { - return bot.getUpdates(opts.timeout, opts.limit).then(resp => { - assert.strictEqual(Array.isArray(resp), true); - }); - }); - }); - - describe('#getMe', function getMeSuite() { - before(function before() { - utils.handleRatelimit(bot, 'getMe', this); - }); - it('should return an User object', function test() { - return bot.getMe().then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.number(resp.id)); - assert.ok(is.string(resp.first_name)); - }); - }); - }); - - describe('#getFileLink', function getFileLinkSuite() { - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'getFileLink', this); - }); - it('should get a file link', function test() { - return bot.getFileLink(FILE_ID) - .then(fileURI => { - assert.ok(is.string(fileURI)); - assert.ok(utils.isTelegramFileURI(fileURI)); - }); - }); - }); - - describe('#getFileStream', function getFileStreamSuite() { - this.timeout(timeout); - before(function before() { - // utils.handleRatelimit(bot, 'getFileStream', this); - }); - it('should get a file stream', function test(done) { - const fileStream = bot.getFileStream(FILE_ID); - assert.ok(fileStream instanceof stream.Readable); - assert.strictEqual(fileStream.path, FILE_ID); - fileStream.on('info', (info) => { - assert.ok(info); - assert.ok(utils.isTelegramFileURI(info.uri), `${info.uri} is not a file URI`); - fileStream.pipe(concat(function readFile(buffer) { - buffer.equals(fs.readFileSync(FILE_PATH)); // sync :( - return done(); - })); - }); - }); - }); - - describe('#downloadFile', function downloadFileSuite() { - const downloadPath = os.tmpdir(); - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'downloadFile', this); - }); - it('should download a file', function test() { - return bot.downloadFile(FILE_ID, downloadPath) - .then(filePath => { - assert.ok(is.string(filePath)); - assert.strictEqual(path.dirname(filePath), downloadPath); - assert.ok(fs.existsSync(filePath)); - fs.unlinkSync(filePath); // Delete file after test - }); - }); - }); - - describe('#onText', function onTextSuite() { - it('should call `onText` callback on match', function test(done) { - const regexp = /\/onText (.+)/; - botWebHook.onText(regexp, (msg, match) => { - assert.strictEqual(match[1], 'ECHO ALOHA'); - assert.ok(botWebHook.removeTextListener(regexp)); - return done(); - }); - utils.sendWebHookMessage(webHookPort2, TOKEN, { - message: { text: '/onText ECHO ALOHA' }, - }); - }); - it('should reset the global regex state with each message', function test(done) { - const regexp = /\/onText (.+)/g; - botWebHook.onText(regexp, () => { - assert.strictEqual(regexp.lastIndex, 0); - assert.ok(botWebHook.removeTextListener(regexp)); - return done(); - }); - utils.sendWebHookMessage(webHookPort2, TOKEN, { - message: { text: '/onText ECHO ALOHA' }, - }); - }); - }); - - describe('#removeTextListener', function removeTextListenerSuite() { - const regexp = /\/onText/; - const regexp2 = /\/onText/; - const callback = function noop() { }; - after(function after() { - bot.removeTextListener(regexp); - bot.removeTextListener(regexp2); - }); - it('removes the right text-listener', function test() { - bot.onText(regexp, callback); - bot.onText(regexp2, callback); - const textListener = bot.removeTextListener(regexp); - assert.strictEqual(regexp, textListener.regexp); - }); - it('returns `null` if missing', function test() { - assert.strictEqual(null, bot.removeTextListener(/404/)); - }); - }); - - describe.skip('#onReplyToMessage', function onReplyToMessageSuite() { }); - - describe('#removeReplyListener', function removeReplyListenerSuite() { - const chatId = -1234; - const messageId = 1; - const callback = function noop() { }; - it('returns the right reply-listener', function test() { - const id = bot.onReplyToMessage(chatId, messageId, callback); - const replyListener = bot.removeReplyListener(id); - assert.strictEqual(id, replyListener.id); - assert.strictEqual(chatId, replyListener.chatId); - assert.strictEqual(messageId, replyListener.messageId); - assert.strictEqual(callback, replyListener.callback); - }); - it('returns `null` if missing', function test() { - // NOTE: '0' is never a valid reply listener ID :) - assert.strictEqual(null, bot.removeReplyListener(0)); - }); - }); - - /** Telegram Bot API Methods */ - - describe.skip('#logOut', function logOutSuite() { }); - - describe.skip('#close', function closeSuite() { }); - - describe('#sendMessage', function sendMessageSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendMessage', this); - }); - it('should send a message', function test() { - return bot.sendMessage(USERID, 'test').then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.number(resp.message_id)); - }); - }); - }); - - describe('#forwardMessage', function forwardMessageSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendMessage', this); - utils.handleRatelimit(bot, 'forwardMessage', this); - }); - it('should forward a message', function test() { - return bot.sendMessage(USERID, 'test').then(resp => { - const messageId = resp.message_id; - return bot.forwardMessage(USERID, USERID, messageId) - .then(forwarded => { - assert.ok(is.object(forwarded)); - assert.ok(is.number(forwarded.message_id)); - }); - }); - }); - }); - - describe('#copyMessage', function copyMessageSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendMessage', this); - utils.handleRatelimit(bot, 'copyMessage', this); - }); - it('should send copy of a message', function test() { - return bot.sendMessage(USERID, 'test').then(resp => { - const messageId = resp.message_id; - return bot.copyMessage(USERID, USERID, messageId) - .then(copy => { - assert.ok(is.object(copy)); - assert.ok(is.number(copy.message_id)); - }); - }); - }); - }); - - describe('#sendPhoto', function sendPhotoSuite() { - let photoId; - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'sendPhoto', this); - }); - it('should send a photo from file', function test() { - const photo = `${__dirname}/data/photo.png`; - return bot.sendPhoto(USERID, photo).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.array(resp.photo)); - photoId = resp.photo[0].file_id; - }); - }); - it('should send a photo from id', function test() { - // Send the same photo as before - const photo = photoId; - return bot.sendPhoto(USERID, photo).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.array(resp.photo)); - }); - }); - it('should send a photo from fs.readStream', function test() { - const photo = fs.createReadStream(`${__dirname}/data/photo.png`); - return bot.sendPhoto(USERID, photo).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.array(resp.photo)); - }); - }); - it('should send a photo from request Stream', function test() { - const photo = request(`${staticUrl}/photo.png`); - return bot.sendPhoto(USERID, photo).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.array(resp.photo)); - }); - }); - it('should send a photo from a Buffer', function test() { - const photo = fs.readFileSync(`${__dirname}/data/photo.png`); - return bot.sendPhoto(USERID, photo).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.array(resp.photo)); - }); - }); - }); - - describe('#sendAudio', function sendAudioSuite() { - let audioId; - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'sendAudio', this); - }); - it('should send an MP3 audio', function test() { - const audio = `${__dirname}/data/audio.mp3`; - return bot.sendAudio(USERID, audio).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.audio)); - audioId = resp.audio.file_id; - }); - }); - it('should send an audio from id', function test() { - // Send the same audio as before - const audio = audioId; - return bot.sendAudio(USERID, audio).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.audio)); - }); - }); - it('should send an audio from fs.readStream', function test() { - const audio = fs.createReadStream(`${__dirname}/data/audio.mp3`); - return bot.sendAudio(USERID, audio).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.audio)); - }); - }); - it('should send an audio from request Stream', function test() { - const audio = request(`${staticUrl}/audio.mp3`); - return bot.sendAudio(USERID, audio).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.audio)); - }); - }); - it('should send an audio from a Buffer', function test() { - const audio = fs.readFileSync(`${__dirname}/data/audio.mp3`); - return bot.sendAudio(USERID, audio).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.audio)); - }); - }); - it('should send an audio file with thumb', function test() { - const audio = `${__dirname}/data/audio.mp3`; - const thumbImg = `attach://${__dirname}/data/sticker_thumb.png`; - - return bot.sendAudio(USERID, audio, { thumb: thumbImg }).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.audio)); - assert.ok(is.object(resp.audio.thumb)); - }); - }); - }); - - describe('#sendDocument', function sendDocumentSuite() { - let documentId; - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'sendDocument', this); - }); - it('should send a document from file', function test() { - const document = `${__dirname}/data/photo.gif`; - return bot.sendDocument(USERID, document).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.document)); - documentId = resp.document.file_id; - }); - }); - it('should send a document from id', function test() { - // Send the same document as before - const document = documentId; - return bot.sendDocument(USERID, document).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.document)); - }); - }); - it('should send a document from fs.readStream', function test() { - const document = fs.createReadStream(`${__dirname}/data/photo.gif`); - return bot.sendDocument(USERID, document).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.document)); - }); - }); - it('should send a document from request Stream', function test() { - const document = request(`${staticUrl}/photo.gif`); - return bot.sendDocument(USERID, document).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.document)); - }); - }); - it('should send a document from a Buffer', function test() { - const document = fs.readFileSync(`${__dirname}/data/photo.gif`); - return bot.sendDocument(USERID, document).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.document)); - }); - }); - }); - - describe('#sendVideo', function sendVideoSuite() { - let videoId; - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'sendVideo', this); - }); - it('should send a video from file', function test() { - const video = `${__dirname}/data/video.mp4`; - return bot.sendVideo(USERID, video).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.video)); - videoId = resp.video.file_id; - }); - }); - it('should send a video from id', function test() { - // Send the same video as before - return bot.sendVideo(USERID, videoId).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.video)); - }); - }); - it('should send a video from fs.readStream', function test() { - const video = fs.createReadStream(`${__dirname}/data/video.mp4`); - return bot.sendVideo(USERID, video).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.video)); - }); - }); - it('should send a video from request Stream', function test() { - const video = request(`${staticUrl}/video.mp4`); - return bot.sendVideo(USERID, video).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.video)); - }); - }); - it('should send a video from a Buffer', function test() { - const video = fs.readFileSync(`${__dirname}/data/video.mp4`); - return bot.sendVideo(USERID, video).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.video)); - }); - }); - }); - - describe('#sendAnimation', function sendAnimationSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendAnimation', this); - }); - it('should send a gif as an animation', function test() { - return bot.sendAnimation(USERID, `${__dirname}/data/photo.gif`).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.document)); - }); - }); - }); - - describe('#sendVoice', function sendVoiceSuite() { - let voiceId; - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'sendVoice', this); - }); - it('should send a voice from file', function test() { - const voice = `${__dirname}/data/voice.ogg`; - return bot.sendVoice(USERID, voice).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.voice)); - voiceId = resp.voice.file_id; - }); - }); - it('should send a voice from id', function test() { - // Send the same voice as before - return bot.sendVoice(USERID, voiceId).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.voice)); - }); - }); - it('should send a voice from fs.readStream', function test() { - const voice = fs.createReadStream(`${__dirname}/data/voice.ogg`); - return bot.sendVoice(USERID, voice).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.voice)); - }); - }); - it('should send a voice from request Stream', function test() { - const voice = request(`${staticUrl}/voice.ogg`); - return bot.sendVoice(USERID, voice).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.voice)); - }); - }); - it('should send a voice from a Buffer', function test() { - const voice = fs.readFileSync(`${__dirname}/data/voice.ogg`); - return bot.sendVoice(USERID, voice).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.voice)); - }); - }); - }); - - - describe('#sendVideoNote', function sendVideoNoteSuite() { - let videoNoteId; - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'sendVideoNote', this); - }); - it('should send a video from file', function test() { - const video = `${__dirname}/data/video.mp4`; - return bot.sendVideoNote(USERID, video, { length: 5 }).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.video)); - videoNoteId = resp.video.file_id; - }); - }); - it('should send a video from id', function test() { - // Send the same videonote as before - assert.ok(videoNoteId); - return bot.sendVideoNote(USERID, videoNoteId, { length: 5 }).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.video)); - }); - }); - it('should send a video from fs.readStream', function test() { - const video = fs.createReadStream(`${__dirname}/data/video.mp4`); - return bot.sendVideoNote(USERID, video, { length: 5 }).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.video)); - }); - }); - it('should send a video from a Buffer', function test() { - const video = fs.readFileSync(`${__dirname}/data/video.mp4`); - return bot.sendVideoNote(USERID, video, { length: 5 }).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.video)); - }); - }); - }); - - describe('#sendMediaGroup', function sendMediaGroupSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendMediaGroup', this); - }); - it('should send group of photos/videos as album', function test() { - return bot.sendMediaGroup(USERID, [ - { - type: 'photo', - media: `${__dirname}/data/photo.png`, - }, - { - type: 'video', - media: `${__dirname}/data/video.mp4`, - }, - { - type: 'photo', - media: FILE_ID, - }, - ], { - disable_notification: true, - }).then(resp => { - assert.ok(is.array(resp)); - assert.strictEqual(resp.length, 3); - }); - }); - }); - - describe('#sendLocation', function sendLocationSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendLocation', this); - }); - it('should send a location', function test() { - return bot.sendLocation(USERID, lat, long).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.location)); - assert.ok(is.number(resp.location.latitude)); - assert.ok(is.number(resp.location.longitude)); - }); - }); - }); - - describe('#editMessageLiveLocation', function editMessageLiveLocationSuite() { - let message; - before(function before() { - utils.handleRatelimit(bot, 'editMessageLiveLocation', this); - const opts = { live_period: 86400 }; - return bot.sendLocation(USERID, lat, long, opts).then(resp => { message = resp; }); - }); - it('edits live location', function test() { - const opts = { chat_id: USERID, message_id: message.message_id }; - return bot.editMessageLiveLocation(lat + 1, long + 1, opts).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.location)); - assert.ok(is.number(resp.location.latitude)); - assert.ok(is.number(resp.location.longitude)); - }); - }); - }); - - describe.skip('#stopMessageLiveLocation', function editMessageLiveLocationSuite() { - let message; - before(function before() { - utils.handleRatelimit(bot, 'stopMessageLiveLocation', this); - return bot.sendLocation(USERID, lat, long, { live_period: 86400 }) - .then((resp) => { - message = resp; - }); - }); - it('stops location updates', function test() { - const opts = { chat_id: USERID, message_id: message.message_id }; - return bot.stopMessageLiveLocation(opts).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.location)); - assert.ok(is.number(resp.location.latitude)); - assert.ok(is.number(resp.location.longitude)); - }); - }); - }); - - - describe('#sendVenue', function sendVenueSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendVenue', this); - }); - it('should send a venue', function test() { - const title = 'The Village Shopping Centre'; - const address = '430 Topsail Rd,St. John\'s, NL A1E 4N1, Canada'; - return bot.sendVenue(USERID, lat, long, title, address).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.venue)); - assert.ok(is.object(resp.venue.location)); - assert.ok(is.number(resp.venue.location.latitude)); - assert.ok(is.number(resp.venue.location.longitude)); - assert.ok(is.string(resp.venue.title)); - assert.ok(is.string(resp.venue.address)); - }); - }); - }); - - - // NOTE: We are skipping TelegramBot#sendContact() as the - // corresponding rate-limits enforced by the Telegram servers - // are too strict! During our initial tests, we were required - // to retry after ~72000 secs (1200 mins / 20 hrs). - // We surely can NOT wait for that much time during testing - // (or in most practical cases for that matter!) - describe.skip('#sendContact', function sendContactSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendContact', this); - }); - it('should send a contact', function test() { - const phoneNumber = '+1(000)000-000'; - const firstName = 'John Doe'; - return bot.sendContact(USERID, phoneNumber, firstName).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.contact)); - assert.ok(is.string(resp.contact.phone_number)); - assert.ok(is.string(resp.contact.first_name)); - }); - }); - }); - - describe('#sendPoll', function sendPollSuite() { - it('should send a Poll', function test() { - const question = '¿Are you okey?'; - const answers = ['Yes', 'No']; - const opts = { is_anonymous: true }; - return bot.sendPoll(GROUPID, question, answers, opts).then(resp => { - assert.ok(is.object(resp)); - }); - }); - it('should send a Quiz', function test() { - const question = '¿Are you okey?'; - const answers = ['Yes', 'No']; - const opts = { - is_anonymous: true, - type: 'quiz', - correct_option_id: 0 - }; - return bot.sendPoll(GROUPID, question, answers, opts).then(resp => { - assert.ok(is.object(resp)); - }); - }); - }); - - describe('#sendDice', function sendDiceSuite() { - it('should send a Dice', function test() { - return bot.sendDice(GROUPID).then(resp => { - assert.ok(is.object(resp)); - }); - }); - it('should send a Dart', function test() { - const opts = { emoji: '🎯' }; - return bot.sendDice(GROUPID, opts).then(resp => { - assert.ok(is.object(resp)); - }); - }); - }); - - describe('#sendChatAction', function sendChatActionSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendChatAction', this); - }); - it('should send a chat action', function test() { - const action = 'typing'; - return bot.sendChatAction(USERID, action).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#getUserProfilePhotos', function getUserProfilePhotosSuite() { - const opts = { - offset: 0, - limit: 1, - }; - before(function before() { - utils.handleRatelimit(bot, 'getUserProfilePhotos', this); - }); - it('should get user profile photos', function test() { - return bot.getUserProfilePhotos(USERID, opts).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.number(resp.total_count)); - assert.ok(is.array(resp.photos)); - }); - }); - it('(v0.25.0 and lower) should get user profile photos', function test() { - return bot.getUserProfilePhotos(USERID, opts.offset, opts.limit).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.number(resp.total_count)); - assert.ok(is.array(resp.photos)); - }); - }); - }); - - describe('#getFile', function getFileSuite() { - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'getFile', this); - }); - it('should get a file', function test() { - return bot.getFile(FILE_ID) - .then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.string(resp.file_path)); - }); - }); - }); - - describe.skip('#banChatMember', function banChatMemberSuite() { }); - - describe.skip('#unbanChatMember', function unbanChatMemberSuite() { }); - - describe.skip('#restrictChatMember', function restrictChatMemberSuite() { }); - - describe.skip('#promoteChatMember', function promoteChatMemberSuite() { }); - - describe.skip('#setChatAdministratorCustomTitle ', function setChatAdministratorCustomTitleSuite() { - it('should set chat permissions', function test() { - return bot.setChatAdministratorCustomTitle(GROUPID, USERID, 'Custom Name').then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe.skip('#banChatSenderChat', function banChatSenderChatSuite() { }); - - describe.skip('#unbanChatSenderChat', function banChatSenderChatSuite() { }); - - describe('#setChatPermissions ', function setChatPermissionsSuite() { - it('should set chat permissions', function test() { - const ChatPermissions = { - can_send_messages: true, - can_send_media_messages: true, - can_send_polls: false, - can_send_other_messages: false, - can_add_web_page_previews: true, - can_change_info: false, - can_invite_users: false, - can_pin_messages: true - }; - return bot.setChatPermissions(GROUPID, ChatPermissions).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#exportChatInviteLink', function exportChatInviteLinkSuite() { - before(function before() { - utils.handleRatelimit(bot, 'exportChatInviteLink', this); - }); - it('should export the group invite link', function test() { - return bot.exportChatInviteLink(GROUPID).then(resp => { - assert(resp.match(/^https:\/\/t\.me\/.+$/i), 'is a telegram invite link'); - }); - }); - }); - - describe('#createChatInviteLink', function createChatInviteLinkSuite() { - let inviteLink; - before(function before() { - utils.handleRatelimit(bot, 'createChatInviteLink', this); - utils.handleRatelimit(bot, 'editChatInviteLink', this); - utils.handleRatelimit(bot, 'revokeChatInviteLink', this); - }); - it('should create a chat invite link', function test() { - return bot.createChatInviteLink(GROUPID).then(resp => { - assert(resp.invite_link.match(/^https:\/\/t\.me\/.+$/i), 'is a telegram invite link'); - inviteLink = resp.invite_link; - }); - }); - - it('should edit chat invite link', function test() { - return bot.editChatInviteLink(GROUPID, inviteLink, { member_limit: 3 }).then(resp => { - assert.strictEqual(resp.member_limit, 3); - }); - }); - - it('should revoke chat invite link', function test() { - return bot.revokeChatInviteLink(GROUPID, inviteLink).then(resp => { - assert.strictEqual(resp.is_revoked, true); - }); - }); - }); - - describe.skip('#approveChatJoinRequest', function approveChatJoinRequestSuite() { }); - - describe.skip('#declineChatJoinRequest', function declineChatJoinRequestSuite() { }); - - describe('#setChatPhoto', function setChatPhotoSuite() { - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'setChatPhoto', this); - }); - it('should set a chat photo from file', function test() { - const photo = `${__dirname}/data/chat_photo.png`; - return bot.setChatPhoto(GROUPID, photo).then(resp => { - assert.strictEqual(resp, true); - }); - }); - it('should set a chat photo from fs.readStream', function test() { - const photo = fs.createReadStream(`${__dirname}/data/chat_photo.png`); - return bot.setChatPhoto(GROUPID, photo).then(resp => { - assert.strictEqual(resp, true); - }); - }); - it('should set a chat photo from request Stream', function test() { - const photo = request(`${staticUrl}/chat_photo.png`); - return bot.setChatPhoto(GROUPID, photo).then(resp => { - assert.strictEqual(resp, true); - }); - }); - it('should set a chat photo from a Buffer', function test() { - const photo = fs.readFileSync(`${__dirname}/data/chat_photo.png`); - return bot.setChatPhoto(GROUPID, photo).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#deleteChatPhoto', function deleteChatPhotoSuite() { - before(function before() { - utils.handleRatelimit(bot, 'deleteChatPhoto', this); - }); - it('should delete the chat photo', function test() { - return bot.deleteChatPhoto(GROUPID).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#setChatTitle', function setChatTitleSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setChatTitle', this); - }); - it('should set the chat title', function test() { - const random = Math.floor(Math.random() * 1000); - return bot.setChatTitle(GROUPID, `ntba test group (random: ${random})`).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#setChatDescription', function setChatDescriptionSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setChatDescription', this); - }); - it('should set the chat description', function test() { - const random = Math.floor(Math.random() * 1000); - const description = `node-telegram-bot-api test group (random: ${random})`; - return bot.setChatDescription(GROUPID, description).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#pinChatMessage', function pinChatMessageSuite() { - let messageId; - before(function before() { - utils.handleRatelimit(bot, 'pinChatMessage', this); - return bot.sendMessage(GROUPID, 'To be pinned').then(resp => { - messageId = resp.message_id; - }); - }); - it('should pin chat message', function test() { - return bot.pinChatMessage(GROUPID, messageId).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#unpinChatMessage', function unpinChatMessageSuite() { - before(function before() { - utils.handleRatelimit(bot, 'unpinChatMessage', this); - }); - it('should unpin chat message', function test() { - return bot.unpinChatMessage(GROUPID).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#unpinAllChatMessages', function unpinAllChatMessagesSuite() { - before(function before() { - utils.handleRatelimit(bot, 'unpinAllChatMessages', this); - }); - it('should unpin all chats messages', function test() { - return bot.unpinAllChatMessages(GROUPID).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe.skip('#leaveChat', function leaveChatSuite() { }); - - describe('#getChat', function getChatSuite() { - before(function before() { - utils.handleRatelimit(bot, 'getChat', this); - }); - it('should return a Chat object', function test() { - return bot.getChat(USERID).then(resp => { - assert.ok(is.object(resp)); - }); - }); - }); - - describe('#getChatAdministrators', function getChatAdministratorsSuite() { - before(function before() { - utils.handleRatelimit(bot, 'getChatAdministrators', this); - }); - it('should return an Array', function test() { - return bot.getChatAdministrators(GROUPID).then(resp => { - assert.ok(Array.isArray(resp)); - }); - }); - }); - - describe('#getChatMemberCount', function getChatMemberCountSuite() { - before(function before() { - utils.handleRatelimit(bot, 'getChatMemberCount', this); - }); - it('should return an Integer', function test() { - return bot.getChatMemberCount(GROUPID).then(resp => { - assert.ok(Number.isInteger(resp)); - }); - }); - }); - - describe('#getChatMember', function getChatMemberSuite() { - before(function before() { - utils.handleRatelimit(bot, 'getChatMember', this); - }); - it('should return a ChatMember', function test() { - return bot.getChatMember(GROUPID, USERID).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.user)); - assert.ok(is.string(resp.status)); - }); - }); - }); - - describe('#setChatStickerSet', function setChatStickerSetSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setChatStickerSet', this); - // Check if the chat can set sticker sets - if (!CHAT_INFO.can_set_sticker_set) { - this.skip(); - } - }); - it('should return a Boolean', function test() { - return bot.setChatStickerSet(GROUPID, STICKER_SET_NAME).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#deleteChatStickerSet', function deleteChatStickerSetSuite() { - before(function before() { - utils.handleRatelimit(bot, 'deleteChatStickerSet', this); - // Check if the chat can delete sticker sets - if (!CHAT_INFO.can_set_sticker_set) { - this.skip(); - } - }); - it('should return a Boolean', function test() { - return bot.deleteChatStickerSet(GROUPID).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe.skip('#answerCallbackQuery', function answerCallbackQuerySuite() { }); - - describe('#setMyCommands', function setMyCommandsSuite() { - it('should set bot commands', function test() { - const opts = [ - { command: 'eat', description: 'Command for eat' }, - { command: 'run', description: 'Command for run' } - ]; - return bot.setMyCommands(opts).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#deleteMyCommands', function deleteMyCommandsSuite() { - it('should delete bot commands', function test() { - return bot.deleteMyCommands().then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#setMyDescription', function getMyCommandsSuite() { - it('should set bot description for users with a specific lang code', function test() { - return bot.setMyDescription({ description: 'Bot description' }).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - it('should set bot description for Spanish users', function test() { - return bot.setMyDescription({ description: 'Spanish bot description', language_code: 'es' }).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#setMyName', function setMyNameSuite() { - it('should set bot name for Spanish users', function test() { - return bot.setMyName({ name: 'Spanish Bot', language_code: 'es' }).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#getMyName', function setMyNameSuite() { - it('should get bot name for Spanish users', function test() { - return bot.getMyName({ language_code: 'es' }).then(resp => { - assert.ok(is.equal(resp.name, 'Spanish Bot')); - }); - }); - }); - - describe('#getMyDescription', function getMyDescriptionSuite() { - it('should get bot description for a user without lang code', function test() { - return bot.getMyDescription().then(resp => { - assert.ok(is.equal(resp.description, 'Bot description')); - }); - }); - it('should get bot description for Spanish users', function test() { - return bot.getMyDescription({ language_code: 'es' }).then(resp => { - assert.ok(is.equal(resp.description, 'Spanish bot description')); - }); - }); - }); - - describe('#setMyShortDescription', function setMyShortDescriptionSuite() { - it('should set sort bot description for a user without lang code', function test() { - return bot.setMyShortDescription({ short_description: 'Bot sort description' }).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - it('should set sort description for Spanish users', function test() { - return bot.setMyShortDescription({ short_description: 'Spanish bot sort description', language_code: 'es' }).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#getMyShortDescription', function getMyShortDescriptionSuite() { - it('should get bot sort description for a user without lang code', function test() { - return bot.getMyShortDescription().then(resp => { - assert.ok(is.equal(resp.short_description, 'Bot sort description')); - }); - }); - it('should get bot sort description for Spanish users', function test() { - return bot.getMyShortDescription({ language_code: 'es' }).then(resp => { - assert.ok(is.equal(resp.short_description, 'Spanish bot sort description')); - }); - }); - }); - - describe('#getMyCommands', function getMyCommandsSuite() { - it('should get bot commands', function test() { - return bot.getMyCommands().then(resp => { - assert.ok(is.array(resp)); - }); - }); - }); - - describe('#setChatMenuButton', function setChatMenuButtonSuite() { - it('should set chat menu button', function test() { - return bot.setChatMenuButton({ - chat_id: USERID, - menu_button: JSON.stringify({ type: 'web_app', text: 'Hello', web_app: { url: 'https://webappcontent.telegram.org/cafe' } }), - }) - .then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#getChatMenuButton', function getChatMenuButtonSuite() { - it('should get chat menu button', function test() { - return bot.getChatMenuButton({ chat_id: USERID }).then(resp => { - assert.ok(is.equal(resp, { - type: 'web_app', - text: 'Hello', - web_app: { url: 'https://webappcontent.telegram.org/cafe' } - })); - }); - }); - }); - - describe('#setMyDefaultAdministratorRights', function setMyDefaultAdministratorRightsSuite() { - it('should set default administrator rights', function test() { - return bot.setMyDefaultAdministratorRights({ - rights: JSON.stringify({ - can_manage_chat: true, - can_change_info: true, - can_delete_messages: false, - can_invite_users: true, - can_restrict_members: false, - can_pin_messages: true, - can_promote_members: false, - can_manage_video_chats: false, - is_anonymous: false - }), - for_channels: false - }).then(resp => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#getMyDefaultAdministratorRights', function getMyDefaultAdministratorRightsSuite() { - it('should get my default administrator rights', function test() { - return bot.getMyDefaultAdministratorRights({ - for_channels: false - }).then(resp => { - assert.ok(is.equal(resp, { - can_manage_chat: true, - can_change_info: true, - can_delete_messages: false, - can_invite_users: true, - can_restrict_members: false, - can_pin_messages: true, - can_manage_topics: false, - can_promote_members: false, - can_manage_video_chats: false, - can_post_stories: false, - can_edit_stories: false, - can_delete_stories: false, - is_anonymous: false - })); - }); - }); - }); - - describe('#editMessageText', function editMessageTextSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendMessage', this); - utils.handleRatelimit(bot, 'editMessageText', this); - }); - it('should edit a message sent by the bot', function test() { - return bot.sendMessage(USERID, 'test').then(resp => { - assert.strictEqual(resp.text, 'test'); - const opts = { - chat_id: USERID, - message_id: resp.message_id - }; - return bot.editMessageText('edit test', opts).then(msg => { - assert.strictEqual(msg.text, 'edit test'); - }); - }); - }); - }); - - describe('#editMessageCaption', function editMessageCaptionSuite() { - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'sendPhoto', this); - utils.handleRatelimit(bot, 'editMessageCaption', this); - }); - it('should edit a caption sent by the bot', function test() { - const photo = `${__dirname}/data/photo.png`; - const options = { caption: 'test caption' }; - return bot.sendPhoto(USERID, photo, options).then(resp => { - assert.strictEqual(resp.caption, 'test caption'); - const opts = { - chat_id: USERID, - message_id: resp.message_id - }; - return bot.editMessageCaption('new test caption', opts).then(msg => { - assert.strictEqual(msg.caption, 'new test caption'); - }); - }); - }); - }); - - describe('#editMessageMedia', function editMessageMediaSuite() { - let photoId; - let messageID; - before(function before() { - utils.handleRatelimit(bot, 'editMessageMedia', this); - const photo = `${__dirname}/data/photo.png`; - return bot.sendPhoto(USERID, photo).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.array(resp.photo)); - photoId = resp.photo[0].file_id; - messageID = resp.message_id; - }); - }); - it('should edit a media message', function nextTest() { - return bot.editMessageMedia({ type: 'photo', media: photoId, caption: 'edited' }, { chat_id: USERID, message_id: messageID }).then(editedResp => { - assert.ok(is.object(editedResp)); - assert.ok(is.string(editedResp.caption)); - }); - }); - }); - - - describe('#editMessageReplyMarkup', function editMessageReplyMarkupSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendMessage', this); - utils.handleRatelimit(bot, 'editMessageReplyMarkup', this); - }); - it('should edit previously-set reply markup', function test() { - return bot.sendMessage(USERID, 'test').then(resp => { - const replyMarkup = JSON.stringify({ - inline_keyboard: [[{ - text: 'Test button', - callback_data: 'test' - }]] - }); - const opts = { - chat_id: USERID, - message_id: resp.message_id - }; - return bot.editMessageReplyMarkup(replyMarkup, opts).then(msg => { - // Keyboard markup is not returned, do a simple object check - assert.ok(is.object(msg)); - }); - }); - }); - }); - - describe('#stopPoll', function stopPollSuite() { - let msg; - before(function before() { - utils.handleRatelimit(bot, 'stopPoll', this); - return bot.sendPoll(GROUPID, '¿Poll for stop before?', ['Yes', 'No']).then(resp => { - msg = resp; - }); - }); - it('should stop a Poll', function test() { - return bot.stopPoll(GROUPID, msg.message_id).then(resp => { - assert.ok(is.boolean(resp.is_closed) && resp.is_closed === true); - }); - } - ); - }); - - describe('#deleteMessage', function deleteMessageSuite() { - let messageId; - before(function before() { - utils.handleRatelimit(bot, 'deleteMessage', this); - return bot.sendMessage(USERID, 'To be deleted').then(resp => { - messageId = resp.message_id; - }); - }); - it('should delete message', function test() { - return bot.deleteMessage(USERID, messageId).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#sendSticker', function sendStickerSuite() { - let stickerId; - this.timeout(timeout); - before(function before() { - utils.handleRatelimit(bot, 'sendSticker', this); - }); - it('should send a sticker from file', function test() { - const sticker = `${__dirname}/data/sticker.webp`; - return bot.sendSticker(USERID, sticker).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.sticker)); - stickerId = resp.sticker.file_id; - }); - }); - it('should send a sticker from id', function test() { - // Send the same photo as before - return bot.sendSticker(USERID, stickerId).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.sticker)); - }); - }); - it('should send a sticker from fs.readStream', function test() { - const sticker = fs.createReadStream(`${__dirname}/data/sticker.webp`); - return bot.sendSticker(USERID, sticker).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.sticker)); - }); - }); - it('should send a sticker from request Stream', function test() { - const sticker = request(`${staticUrl}/sticker.webp`); - return bot.sendSticker(USERID, sticker).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.sticker)); - }); - }); - it('should send a sticker from a Buffer', function test() { - const sticker = fs.readFileSync(`${__dirname}/data/sticker.webp`); - return bot.sendSticker(USERID, sticker).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.sticker)); - }); - }); - }); - - describe('#uploadStickerFile', function sendPhotoSuite() { - before(function before() { - utils.handleRatelimit(bot, 'uploadStickerFile', this); - }); - it('should upload a sticker from file', function test() { - const sticker = `${__dirname}/data/sticker.png`; - - bot.uploadStickerFile(USERID, sticker).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.string(resp.file_id)); - }); - }); - // Other tests (eg. Buffer, URL) are skipped, because they rely on the same features as sendPhoto. - }); - - describe('#createNewStickerSet', function createNewStickerSetSuite() { - before(function before() { - utils.handleRatelimit(bot, 'createNewStickerSet', this); - }); - - it('should create a new sticker set', function test(done) { - const sticker = `${__dirname}/data/sticker.png`; - const stickerPackName = `s${CURRENT_TIMESTAMP}_by_${BOT_USERNAME}`; - - bot.createNewStickerSet(USERID, stickerPackName, 'Sticker Pack Title', sticker, '😍').then((resp) => { - assert.ok(is.boolean(resp)); - }); - setTimeout(() => done(), 2000); - }); - }); - - describe('#getStickerSet', function getStickerSetSuite() { - before(function before() { - utils.handleRatelimit(bot, 'getStickerSet', this); - }); - it('should get the sticker set given the name of the set', function test() { - return bot.getStickerSet(STICKER_SET_NAME).then(resp => { - assert.ok(is.object(resp)); - assert.strictEqual(resp.name.toLowerCase(), STICKER_SET_NAME); - assert.ok(is.string(resp.title)); - assert.ok(is.string(resp.sticker_type)); - assert.ok(is.array(resp.stickers)); - }); - }); - // This test depends on the previous test createNewStickerSet - it('should get the recent sticker set created given the name of the set', function test() { - const stickerPackName = `s${CURRENT_TIMESTAMP}_by_${BOT_USERNAME}`; - return bot.getStickerSet(stickerPackName).then(resp => { - STICKER_FILE_ID_FROM_SET = resp.stickers[0].file_id; - assert.ok(is.object(resp)); - assert.strictEqual(resp.name.toLowerCase(), stickerPackName.toLowerCase()); - assert.ok(is.string(resp.title)); - assert.ok(is.string(resp.sticker_type)); - assert.ok(is.array(resp.stickers)); - }); - }); - }); - - describe('#getCustomEmojiStickers', function getCustomEmojiStickersSuite() { - const CHERRY_EMOJI_STICKERS_ID = ['5380109565226391871', '5431711346724968789']; - const STICKER_EMOJI_SET_NAME = 'CherryEmoji'; - - it('should get the custom emoji stickers', function test() { - return bot.getCustomEmojiStickers([CHERRY_EMOJI_STICKERS_ID[0]]).then(resp => { - assert.ok(is.array(resp)); - assert.ok(is.object(resp[0])); - assert.ok(is.string(resp[0].set_name) && resp[0].set_name === STICKER_EMOJI_SET_NAME); - assert.ok(resp[0].custom_emoji_id === CHERRY_EMOJI_STICKERS_ID[0]); - }); - }); - it('should get 2 custom emoji stickers', function test() { - return bot.getCustomEmojiStickers(CHERRY_EMOJI_STICKERS_ID).then(resp => { - assert.ok(is.array(resp) && resp.length === 2); - assert.ok(is.object(resp[1])); - assert.ok(is.string(resp[1].set_name) && resp[1].set_name === STICKER_EMOJI_SET_NAME); - assert.ok(resp[1].custom_emoji_id === CHERRY_EMOJI_STICKERS_ID[1]); - }); - }); - }); - - - describe('#addStickerToSet', function addStickerToSetSuite() { - before(function before() { - utils.handleRatelimit(bot, 'addStickerToSet', this); - }); - - it('should add a sticker to a set', function test() { - const sticker = `${__dirname}/data/sticker.png`; - const stickerPackName = `s${CURRENT_TIMESTAMP}_by_${BOT_USERNAME}`; - - bot.addStickerToSet(USERID, stickerPackName, sticker, '😊😍🤔', 'png_sticker').then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - it('should add a sticker to a set using the file Id', function test(done) { - const stickerPackName = `s${CURRENT_TIMESTAMP}_by_${BOT_USERNAME}`; - - bot.addStickerToSet(USERID, stickerPackName, STICKER_FILE_ID_FROM_SET, '😊🤔', 'png_sticker').then((resp) => { - assert.ok(is.boolean(resp)); - }); - setTimeout(() => done(), 2000); - }); - }); - - describe('#setStickerPositionInSet', function setStickerPositionInSet() { - before(function before() { - utils.handleRatelimit(bot, 'setStickerPositionInSet', this); - }); - it('should set the position of a sticker in a set', function test() { - bot.setStickerPositionInSet(STICKER_FILE_ID_FROM_SET, 0).then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#deleteStickerFromSet', function deleteStickerFromSetSuite() { - before(function before() { - utils.handleRatelimit(bot, 'deleteStickerFromSet', this); - }); - it('should delete a sticker from a set', function test() { - bot.deleteStickerFromSet(STICKER_FILE_ID_FROM_SET).then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#setStickerEmojiList', function setStickerEmojiListSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setStickerEmojiList', this); - }); - - it('should get the list for the given sticker of the bot sticker pack', function test(done) { - const stickerPackName = `s${CURRENT_TIMESTAMP}_by_${BOT_USERNAME}`; - - bot.getStickerSet(stickerPackName).then(resp => { - STICKERS_FROM_BOT_SET = resp.stickers; - assert.ok(is.array(STICKERS_FROM_BOT_SET)); - }); - - setTimeout(() => done(), 2000); - }); - - it('should set a emoji list for the given sticker', function test() { - assert.ok(is.equal(STICKERS_FROM_BOT_SET[0].type, 'regular')); - - bot.setStickerEmojiList(STICKERS_FROM_BOT_SET[0].file_id, ['🥳', '😀', '😇']).then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#setStickerKeywords', function setStickerKeywordsSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setStickerKeywords', this); - }); - it('should set a keywords list for the given sticker', function test() { - assert.ok(is.equal(STICKERS_FROM_BOT_SET[0].type, 'regular')); - bot.setStickerKeywords(STICKERS_FROM_BOT_SET[0].file_id, { keywords: ['house', 'cat'] }).then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe.skip('#setStickerMaskPosition', function setStickerKeywordsSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setStickerMaskPosition', this); - }); - it('should delete a sticker from a set', function test() { - bot.setStickerMaskPosition(STICKER_FILE_ID_FROM_SET, { point: 'eyes', scale: 2, x_shift: 1, y_shift: 1 }).then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#setStickerSetTitle', function setStickerSetTitleSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setStickerSetTitle', this); - }); - it('should set a new sticker set title', function test() { - const stickerPackName = `s${CURRENT_TIMESTAMP}_by_${BOT_USERNAME}`; - - bot.setStickerSetTitle(stickerPackName, 'New title').then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe('#setStickerSetThumbnail', function setStickerSetThumbnailSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setStickerSetThumbnail', this); - }); - - it('should set a sticker set thumb', function test() { - const stickerThumb = `${__dirname}/data/sticker_thumb.png`; - const stickerPackName = `s${CURRENT_TIMESTAMP}_by_${BOT_USERNAME}`; - - bot.setStickerSetThumbnail(USERID, stickerPackName, stickerThumb).then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe.skip('#setCustomEmojiStickerSetThumbnail', function setCustomEmojiStickerSetThumbnailSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setCustomEmojiStickerSetThumbnail', this); - }); - - it('should set a custom emoji sticjer set as thumbnail', function test() { - const stickerPackName = `s${CURRENT_TIMESTAMP}_by_${BOT_USERNAME}`; - - bot.setCustomEmojiStickerSetThumbnail(stickerPackName, { custom_emoji_id: null }).then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe.skip('#deleteStickerSet', function deleteStickerSetSuite() { - before(function before() { - utils.handleRatelimit(bot, 'deleteStickerSet', this); - }); - - it('should delete sticker set', function test() { - const stickerPackName = `s${CURRENT_TIMESTAMP}_by_${BOT_USERNAME}`; - - bot.deleteStickerSet(stickerPackName).then((resp) => { - assert.ok(is.boolean(resp)); - }); - }); - }); - - describe.skip('#answerInlineQuery', function answerInlineQuerySuite() { }); - - describe.skip('#answerWebAppQuery', function answerCallbackQuerySuite() { }); - - describe('#sendInvoice', function sendInvoiceSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendInvoice', this); - }); - it('should send an invoice', function test() { - if (isCI) { - this.skip(); // Skip test for now - } - const title = 'Demo product'; - const description = 'our test product'; - const payload = 'sku-p001'; - const providerToken = PROVIDER_TOKEN; - const currency = 'USD'; - const prices = [{ label: 'product', amount: 11000 }, { label: 'tax', amount: 11000 }]; - return bot.sendInvoice(USERID, title, description, payload, providerToken, currency, prices).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.invoice)); - assert.ok(is.number(resp.invoice.total_amount)); - }); - }); - }); - - describe('#createInvoiceLink', function createInvoiceLinkSuite() { - before(function before() { - utils.handleRatelimit(bot, 'createInvoiceLink', this); - }); - it('should create an invoice link', function test() { - if (isCI) { - this.skip(); // Skip test for now - } - const title = 'Invoice link product'; - const description = 'Our test invoice link product'; - const payload = 'sku-p002'; - const providerToken = PROVIDER_TOKEN; - const currency = 'EUR'; - const prices = [{ label: 'NTBA API', amount: 12000 }, { label: 'tax', amount: 10000 }]; - return bot.createInvoiceLink(title, description, payload, providerToken, currency, prices).then(resp => { - assert.ok(is.string(resp)); - }); - }); - }); - - describe.skip('#answerShippingQuery', function answerShippingQuerySuite() { }); - - - describe.skip('#answerPreCheckoutQuery', function answerPreCheckoutQuerySuite() { }); - - describe('#sendGame', function sendGameSuite() { - before(function before() { - utils.handleRatelimit(bot, 'sendGame', this); - }); - it('should send a Game', function test() { - return bot.sendGame(USERID, GAME_SHORT_NAME).then(resp => { - assert.ok(is.object(resp)); - assert.ok(is.object(resp.game)); - }); - }); - }); - - describe('#setGameScore', function setGameScoreSuite() { - before(function before() { - utils.handleRatelimit(bot, 'setGameScore', this); - }); - it('should set GameScore', function test() { - const score = Math.floor(Math.random() * 1000); - const opts = { - chat_id: GAME_CHAT_ID, - message_id: GAME_MSG_ID, - force: true - }; - return bot.setGameScore(USERID, score, opts).then(resp => { - assert.ok(is.object(resp) || is.boolean(resp)); - }); - }); - }); - - describe('#getGameHighScores', function getGameHighScoresSuite() { - before(function before() { - utils.handleRatelimit(bot, 'getGameHighScores', this); - }); - it('should get GameHighScores', function test() { - const opts = { - chat_id: GAME_CHAT_ID, - message_id: GAME_MSG_ID, - }; - return bot.getGameHighScores(USERID, opts).then(resp => { - assert.ok(is.array(resp)); - }); - }); - }); - - describe('#setMessageReaction', function setMessageReactionSuite() { - let messageId; - const Reactions = [{ type: 'emoji', emoji: '👍' }]; - before(function before() { - utils.handleRatelimit(bot, 'setMessageReaction', this); - return bot.sendMessage(USERID, 'To be reacted').then(resp => { - messageId = resp.message_id; - }); - }); - it('should add reactions to message', function test() { - return bot.setMessageReaction(USERID, messageId, { reaction: Reactions, is_big: true }).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#deleteMessages', function setMessageReactionSuite() { - let messageId; - before(function before() { - utils.handleRatelimit(bot, 'deleteMessages', this); - return bot.sendMessage(USERID, 'To be deleted').then(resp => { - messageId = resp.message_id; - }); - }); - it('should delete message from array', function test() { - return bot.deleteMessages(USERID, [messageId]).then(resp => { - assert.strictEqual(resp, true); - }); - }); - }); - - describe('#copyMessages', function setMessageReactionSuite() { - let messageId; - before(function before() { - utils.handleRatelimit(bot, 'copyMessages', this); - return bot.sendMessage(GROUPID, 'To be copyed').then(resp => { - messageId = resp.message_id; - }); - }); - it('should copy messages from array', function test() { - return bot.copyMessages(USERID, GROUPID, [messageId]).then(resp => { - assert.ok(is.array(resp)); - assert.ok(resp && resp.length === 1); - }); - }); - }); -}); // End Telegram diff --git a/test/test.format-send-data.js b/test/test.format-send-data.js deleted file mode 100644 index 97828427..00000000 --- a/test/test.format-send-data.js +++ /dev/null @@ -1,139 +0,0 @@ -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); -const TelegramBot = require('..'); - -const paths = { - audio: path.join(__dirname, 'data/audio.mp3'), -}; - - -describe('#_formatSendData', function sendfileSuite() { - const bot = new TelegramBot('token'); - const type = 'file'; - - before(function beforeSuite() { - process.env.NTBA_FIX_350 = 1; - }); - after(function afterSuite() { - delete process.env.NTBA_FIX_350; - }); - - describe('using fileOptions', function sendfileOptionsSuite() { - const stream = fs.createReadStream(paths.audio); - const nonPathStream = fs.createReadStream(paths.audio); - const buffer = fs.readFileSync(paths.audio); - const nonDetectableBuffer = fs.readFileSync(__filename); - const filepath = paths.audio; - const files = [stream, nonPathStream, buffer, nonDetectableBuffer, filepath]; - - delete nonPathStream.path; - - describe('filename', function filenameSuite() { - it('(1) fileOptions.filename', function test() { - const filename = 'custom-filename'; - files.forEach((file) => { - const [{ [type]: data }] = bot._formatSendData(type, file, { filename }); - assert.equal(data.options.filename, filename); - }); - }); - - it('(2) Stream#path', function test() { - if (!stream.path) { - this.skip('Stream#path unsupported'); - return; - } - const [{ [type]: data }] = bot._formatSendData(type, stream); - assert.equal(data.options.filename, path.basename(paths.audio)); - }); - - it('(3) filepath', function test() { - const [{ [type]: data }] = bot._formatSendData(type, filepath); - assert.equal(data.options.filename, path.basename(paths.audio)); - }); - - it('(4) final default', function test() { - [nonPathStream, buffer, nonDetectableBuffer].forEach((file) => { - const [{ [type]: data }] = bot._formatSendData(type, file); - assert.equal(data.options.filename, 'filename'); - }); - }); - }); - - describe('contentType', function contentTypeSuite() { - it('(1) fileOpts.contentType', function test() { - const contentType = 'application/custom-type'; - files.forEach((file) => { - const [{ [type]: data }] = bot._formatSendData(type, file, { contentType }); - assert.equal(data.options.contentType, contentType); - }); - }); - - it('(2) Stream#path', function test() { - if (!stream.path) { - this.skip('Stream#path unsupported'); - return; - } - const [{ [type]: data }] = bot._formatSendData(type, stream); - assert.equal(data.options.contentType, 'audio/mpeg'); - }); - - it('(3) Buffer file-type', function test() { - const [{ [type]: data }] = bot._formatSendData(type, buffer); - assert.equal(data.options.contentType, 'audio/mpeg'); - }); - - it('(4) filepath', function test() { - const [{ [type]: data }] = bot._formatSendData(type, filepath); - assert.equal(data.options.contentType, 'audio/mpeg'); - }); - - it('(5) fileOptions.filename', function test() { - [nonPathStream, nonDetectableBuffer].forEach((file) => { - const [{ [type]: data }] = bot._formatSendData(type, file, { - filename: 'image.gif', - }); - assert.equal(data.options.contentType, 'image/gif'); - }); - }); - - it('(6) Final default', function test() { - [nonPathStream, nonDetectableBuffer].forEach((file) => { - const [{ [type]: data }] = bot._formatSendData(type, file); - assert.equal(data.options.contentType, 'application/octet-stream'); - }); - }); - }); - }); - - it('should handle buffer path from fs.readStream', function test() { - let file; - try { - file = fs.createReadStream(Buffer.from(paths.audio)); - } catch (ex) { - // Older Node.js versions do not support passing a Buffer - // representation of the path to fs.createReadStream() - if (ex instanceof TypeError) { - Promise.resolve(); - return; - } - } - const [{ [type]: data }] = bot._formatSendData('file', file); - assert.equal(data.options.filename, path.basename(paths.audio)); - }); - - it('should not accept file-paths if disallowed with constructor option', function test() { - const tgbot = new TelegramBot('token', { filepath: false }); - const [formData, fileId] = tgbot._formatSendData('file', paths.audio); - assert.ok(fileId); - assert.ok(!formData); - }); - - it('should allow stream.path that can not be parsed', function test() { - const stream = fs.createReadStream(paths.audio); - stream.path = '/?id=123'; // for example, 'http://example.com/?id=666' - assert.doesNotThrow(function assertDoesNotThrow() { - bot._formatSendData('file', stream); - }); - }); -}); diff --git a/test/utils.js b/test/utils.js deleted file mode 100644 index 78dec279..00000000 --- a/test/utils.js +++ /dev/null @@ -1,230 +0,0 @@ -/* eslint-disable no-use-before-define */ -exports = module.exports = { - /** - * Clear polling check, so that 'isPollingMockServer()' returns false - * if the bot stopped polling the mock server. - * @param {Number} port - */ - clearPollingCheck, - /** - * Redefine a bot method to allow us to ignore 429 (rate-limit) errors - * @param {TelegramBot} bot - * @param {String} methodName - * @param {Suite} suite From mocha - * @return {TelegramBot} - */ - handleRatelimit, - /** - * Return true if a webhook has been opened at the specified port. - * Otherwise throw an error. - * @param {Number} port - * @param {Boolean} [reverse] Throw error when it should have returned true (and vice versa) - * @return {Promise} - */ - hasOpenWebHook, - /** - * Return true if the mock server is being polled by a bot. - * Otherwise throw an error. - * @param {Number} port - * @param {Boolean} [reverse] Throw error when it should have returned true (and vice versa) - * @return {Promise} - */ - isPollingMockServer, - /** - * Return true if the string is a URI to a file - * on Telegram servers. - * @param {String} uri - * @return {Boolean} - */ - isTelegramFileURI, - /** - * Send a message to the webhook at the specified port and path. - * @param {Number} port - * @param {String} path - * @param {Object} [options] - * @param {String} [options.method=POST] Method to use - * @param {Object} [options.update] Update object to send. - * @param {Object} [options.message] Message to send. Default to a generic text message - * @param {Boolean} [options.https=false] Use https - * @return {Promise} - */ - sendWebHookRequest, - /** - * Send a message to the webhook at the specified port. - * @param {Number} port - * @param {String} token - * @param {Object} [options] - * @param {String} [options.method=POST] Method to use - * @param {Object} [options.update] Update object to send. - * @param {Object} [options.message] Message to send. Default to a generic text message - * @param {Boolean} [options.https=false] Use https - * @return {Promise} - */ - sendWebHookMessage, - /** - * Start a mock server at the specified port. - * @param {Number} port - * @param {Object} [options] - * @param {Boolean} [options.bad=false] Bad Mock Server; responding with - * unparseable messages - * @return {Promise} - */ - startMockServer, - /** - * Start the static server, serving files in './data' - * @param {Number} port - */ - startStaticServer, -}; -/* eslint-enable no-use-before-define */ - - -const assert = require('assert'); -const http = require('http'); -const request = require('@cypress/request-promise'); -const statics = require('node-static'); - -const servers = {}; - - -function startMockServer(port, options = {}) { - assert.ok(port); - const server = http.Server((req, res) => { - servers[port].polling = true; - if (options.bad) { - return res.end('can not be parsed with JSON.parse()'); - } - return res.end(JSON.stringify({ - ok: true, - result: [{ - update_id: 0, - message: { text: 'test' }, - }], - })); - }); - return new Promise((resolve, reject) => { - servers[port] = { server, polling: false }; - server.on('error', reject).listen(port, resolve); - }); -} - - -function startStaticServer(port) { - const fileServer = new statics.Server(`${__dirname}/data`); - http.Server((req, res) => { - req.addListener('end', () => { - fileServer.serve(req, res); - }).resume(); - }).listen(port); -} - - -function isPollingMockServer(port, reverse) { - assert.ok(port); - return new Promise((resolve, reject) => { - // process.nextTick() does not wait until a poll request - // is complete! - setTimeout(() => { - let polling = servers[port] && servers[port].polling; - if (reverse) polling = !polling; - if (polling) return resolve(true); - return reject(new Error('polling-check failed')); - }, 1000); - }); -} - - -function clearPollingCheck(port) { - assert.ok(port); - if (servers[port]) servers[port].polling = false; -} - - -function hasOpenWebHook(port, reverse) { - assert.ok(port); - const error = new Error('open-webhook-check failed'); - let connected = false; - return request.get(`http://127.0.0.1:${port}`) - .then(() => { - connected = true; - }).catch(e => { - if (e.statusCode < 500) connected = true; - }).finally(() => { - if (reverse) { - if (connected) throw error; - return; - } - if (!connected) throw error; - }); -} - - -function sendWebHookRequest(port, path, options = {}) { - assert.ok(port); - assert.ok(path); - const protocol = options.https ? 'https' : 'http'; - const url = `${protocol}://127.0.0.1:${port}${path}`; - return request({ - url, - method: options.method || 'POST', - body: options.update || { - update_id: 1, - message: options.message || { text: 'test' } - }, - json: (typeof options.json === 'undefined') ? true : options.json, - }); -} - - -function sendWebHookMessage(port, token, options = {}) { - assert.ok(port); - assert.ok(token); - const path = `/bot${token}`; - return sendWebHookRequest(port, path, options); -} - - -function handleRatelimit(bot, methodName, suite) { - const backupMethodName = `__${methodName}`; - if (!bot[backupMethodName]) bot[backupMethodName] = bot[methodName]; - - const maxRetries = 3; - const addSecs = 5; - const method = bot[backupMethodName]; - assert.equal(typeof method, 'function'); - - bot[methodName] = (...args) => { - let retry = 0; - function exec() { - return method.call(bot, ...args) - .catch(error => { - if (!error.response || error.response.statusCode !== 429) { - throw error; - } - retry++; - if (retry > maxRetries) { - throw error; - } - if (typeof error.response.body === 'string') { - error.response.body = JSON.parse(error.response.body); - } - const retrySecs = error.response.body.parameters.retry_after; - const timeout = (1000 * retrySecs) + (1000 * addSecs); - console.error('tests: Handling rate-limit error. Retrying after %d secs', timeout / 1000); // eslint-disable-line no-console - suite.timeout(timeout * 2); - return new Promise(function timeoutPromise(resolve, reject) { - setTimeout(function execTimeout() { - return exec().then(resolve).catch(reject); - }, timeout); - }); - }); - } - return exec(); - }; - return bot; -} - - -function isTelegramFileURI(uri) { - return /https?:\/\/.*\/file\/bot.*\/.*/.test(uri); -} From a5703624cbd54ea39a6ff3197d2cd1a0ed73bcd6 Mon Sep 17 00:00:00 2001 From: HTY Date: Tue, 2 Sep 2025 21:51:08 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=95=99=E8=91=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 練習對象 --- LICENSE.md | 21 --------- README.md | 129 ----------------------------------------------------- 2 files changed, 150 deletions(-) delete mode 100644 LICENSE.md delete mode 100644 README.md diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index e952ab9c..00000000 --- a/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Yago - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index ee46fe2e..00000000 --- a/README.md +++ /dev/null @@ -1,129 +0,0 @@ -

Node.js Telegram Bot API

- -
- -Node.js module to interact with the official [Telegram Bot API](https://core.telegram.org/bots/api). - - -[![Bot API](https://img.shields.io/badge/Bot%20API-v.9.0-00aced.svg?style=flat-square&logo=telegram)](https://core.telegram.org/bots/api) -[![npm package](https://img.shields.io/npm/v/node-telegram-bot-api?logo=npm&style=flat-square)](https://www.npmjs.org/package/node-telegram-bot-api) -[![Coverage Status](https://img.shields.io/codecov/c/github/yagop/node-telegram-bot-api?style=flat-square&logo=codecov)](https://codecov.io/gh/yagop/node-telegram-bot-api) - -[![https://telegram.me/node_telegram_bot_api](https://img.shields.io/badge/💬%20Telegram-Channel-blue.svg?style=flat-square)](https://telegram.me/node_telegram_bot_api) -[![https://t.me/+_IC8j_b1wSFlZTVk](https://img.shields.io/badge/💬%20Telegram-Group-blue.svg?style=flat-square)](https://t.me/+_IC8j_b1wSFlZTVk) -[![https://telegram.me/Yago_Perez](https://img.shields.io/badge/💬%20Telegram-Yago_Perez-blue.svg?style=flat-square)](https://telegram.me/Yago_Perez) - -
- -## 📦 Install - -```sh -npm i node-telegram-bot-api -``` - -
- -> ✍️ **Note:** If you use Typescript you can install this package that contains type definitions for this library ->```sh ->npm install --save-dev @types/node-telegram-bot-api ->``` - -## 🚀 Usage - -```js -const TelegramBot = require('node-telegram-bot-api'); - -// replace the value below with the Telegram token you receive from @BotFather -const token = 'YOUR_TELEGRAM_BOT_TOKEN'; - -// Create a bot that uses 'polling' to fetch new updates -const bot = new TelegramBot(token, {polling: true}); - -// Matches "/echo [whatever]" -bot.onText(/\/echo (.+)/, (msg, match) => { - // 'msg' is the received Message from Telegram - // 'match' is the result of executing the regexp above on the text content - // of the message - - const chatId = msg.chat.id; - const resp = match[1]; // the captured "whatever" - - // send back the matched "whatever" to the chat - bot.sendMessage(chatId, resp); -}); - -// Listen for any kind of message. There are different kinds of -// messages. -bot.on('message', (msg) => { - const chatId = msg.chat.id; - - // send a message to the chat acknowledging receipt of their message - bot.sendMessage(chatId, 'Received your message'); -}); -``` - -## 📚 Documentation - -* [Usage][usage] -* [Examples][examples] -* [Tutorials][tutorials] -* [Help Information][help] -* API Reference: ([api-release](../master/doc/api.md) / [development][api-dev] / [experimental][api-experimental]) -* [Contributing to the Project][contributing] -* [Experimental Features][experimental] - -_**Note**: Development is done against the **development** branch. -Code for the latest release resides on the **master** branch. -Experimental features reside on the **experimental** branch._ - - -## 💭 Community - -We thank all the developers in the Open-Source community who continuously -take their time and effort in advancing this project. -See our [list of contributors][contributors]. - -We have a [Telegram channel][tg-channel] where we post updates on -the Project. Head over and subscribe! - -We also have a [Telegram group][tg-group] to discuss issues related to this library. - -Some things built using this library that might interest you: - -* [tgfancy](https://github.com/GochoMugo/tgfancy): A fancy, higher-level wrapper for Telegram Bot API -* [node-telegram-bot-api-middleware](https://github.com/idchlife/node-telegram-bot-api-middleware): Middleware for node-telegram-bot-api -* [teleirc](https://github.com/FruitieX/teleirc): A simple Telegram ↔ IRC gateway -* [bot-brother](https://github.com/SerjoPepper/bot-brother): Node.js library to help you easily create telegram bots -* [redbot](https://github.com/guidone/node-red-contrib-chatbot): A Node-RED plugin to create telegram bots visually -* [node-telegram-keyboard-wrapper](https://github.com/alexandercerutti/node-telegram-keyboard-wrapper): A wrapper to improve keyboards structures creation through a more easy-to-see way (supports Inline Keyboards, Reply Keyboard, Remove Keyboard and Force Reply) -* [beetube-bot](https://github.com/kodjunkie/beetube-bot): A telegram bot for music, videos, movies, EDM tracks, torrent downloads, files and more. -* [telegram-inline-calendar](https://github.com/VDS13/telegram-inline-calendar): Date and time picker and inline calendar for Node.js telegram bots. -* [telegram-captcha](https://github.com/VDS13/telegram-captcha): Telegram bot to protect Telegram groups from automatic bots. - - -## 👥 Contributors - -

- - - -

- -## License - -**The MIT License (MIT)** - -Copyright © 2019 Yago - -[usage]:https://github.com/yagop/node-telegram-bot-api/tree/master/doc/usage.md -[examples]:https://github.com/yagop/node-telegram-bot-api/tree/master/examples -[help]:https://github.com/yagop/node-telegram-bot-api/tree/master/doc/help.md -[tutorials]:https://github.com/yagop/node-telegram-bot-api/tree/master/doc/tutorials.md -[api-dev]:https://github.com/yagop/node-telegram-bot-api/tree/master/doc/api.md -[api-release]:https://github.com/yagop/node-telegram-bot-api/tree/release/doc/api.md -[api-experimental]:https://github.com/yagop/node-telegram-bot-api/tree/experimental/doc/api.md -[contributing]:https://github.com/yagop/node-telegram-bot-api/tree/master/CONTRIBUTING.md -[contributors]:https://github.com/yagop/node-telegram-bot-api/graphs/contributors -[experimental]:https://github.com/yagop/node-telegram-bot-api/tree/master/doc/experimental.md -[tg-channel]:https://telegram.me/node_telegram_bot_api -[tg-group]:https://t.me/+nc3A9Hs1S81mYzdk