From 2bf44d8d28035eeb8c6f5f69fd71097367967535 Mon Sep 17 00:00:00 2001 From: Nikita Korotaev Date: Sun, 14 Jul 2024 13:00:59 +0500 Subject: [PATCH] translate /config/dns.md --- docs/ru/config/dns.md | 344 ++++++++++++++++++++++++++++++++++++ docs/ru/config/dns_flow.png | Bin 0 -> 674622 bytes 2 files changed, 344 insertions(+) create mode 100644 docs/ru/config/dns.md create mode 100644 docs/ru/config/dns_flow.png diff --git a/docs/ru/config/dns.md b/docs/ru/config/dns.md new file mode 100644 index 0000000..9ce7815 --- /dev/null +++ b/docs/ru/config/dns.md @@ -0,0 +1,344 @@ +# Встроенный DNS-сервер + +## DNS-сервер + +Встроенный DNS-модуль Xray имеет два основных назначения: + +- Разрешение доменных имен в IP-адреса на этапе маршрутизации и сопоставление правил с полученными IP-адресами для разделения трафика. + Разрешение доменных имен и разделение трафика зависят от значения параметра `domainStrategy` в модуле конфигурации маршрутизации. + Встроенный DNS-сервер будет использоваться для DNS-запросов только при следующих значениях: + + - "IPIfNonMatch": при запросе доменного имени Xray сопоставляет его с доменами, указанными в правилах маршрутизации. + Если совпадение не найдено, встроенный DNS-сервер используется для разрешения доменного имени, а затем полученный IP-адрес снова сопоставляется с правилами маршрутизации на основе IP-адресов. + - "IPOnDemand": при сопоставлении правил, основанных на IP-адресах, доменное имя немедленно разрешается в IP-адрес для сопоставления. + +- Разрешение целевого адреса для подключения. + - Например, в исходящем подключении `freedom`, если параметр `domainStrategy` установлен в `UseIP`, исходящие запросы будут сначала разрешать доменное имя в IP-адрес с помощью встроенного DNS-сервера, а затем устанавливать соединение. + - Например, в `sockopt`, если параметр `domainStrategy` установлен в `UseIP`, системные соединения, инициированные этим исходящим подключением, будут сначала разрешать доменное имя в IP-адрес с помощью встроенного DNS-сервера, а затем устанавливать соединение. + +::: tip Совет 1 +DNS-запросы, отправляемые встроенным DNS-сервером, автоматически перенаправляются в соответствии с конфигурацией маршрутизации. +::: + +::: tip Совет 2 +Поддерживаются только базовые запросы IP-адресов (записи A и AAAA). Записи CNAME будут запрашиваться повторно до тех пор, пока не будет возвращена запись A/AAAA. Другие запросы не обрабатываются встроенным DNS-сервером. +::: + +## Процесс обработки DNS-запросов + +Если запрашиваемое доменное имя: + +- Соответствует сопоставлению "домен - IP" или "домен - массив IP" в `hosts`, то этот IP-адрес или массив IP-адресов возвращается в качестве результата DNS-разрешения. +- Соответствует сопоставлению "домен - домен" в `hosts`, то значение этого сопоставления (другой домен) используется в качестве текущего запрашиваемого доменного имени, и процесс обработки DNS-запросов продолжается до тех пор, пока не будет разрешен IP-адрес или не будет возвращен пустой результат. +- Не соответствует `hosts`, но соответствует списку доменов `domains` одного (или нескольких) DNS-серверов, то запросы отправляются на соответствующие DNS-серверы в порядке приоритета. + Если запрос к DNS-серверу завершается неудачей или `expectIPs` не совпадает, используется следующий подходящий DNS-сервер. + В противном случае возвращается полученный IP-адрес. + Если запросы ко всем подходящим DNS-серверам завершаются неудачей или `expectIPs` не совпадает, компонент DNS: + - По умолчанию выполняет "резервный (fallback) запрос DNS": запросы отправляются на "DNS-серверы, которые не использовались в предыдущем раунде неудачных запросов и для которых `skipFallback` имеет значение по умолчанию `false`". + Если запрос завершается неудачей или `expectIPs` не совпадает, возвращается пустой результат. + В противном случае возвращается полученный IP-адрес. + - Если `disableFallback` установлен в `true`, "резервный (fallback) запрос DNS" не выполняется. +- Не соответствует `hosts` и не соответствует списку доменов `domains` ни одного DNS-сервера, то: + - По умолчанию запросы отправляются на "DNS-серверы, для которых `skipFallback` имеет значение по умолчанию `false`". + Если запрос к первому выбранному DNS-серверу завершается неудачей или `expectIPs` не совпадает, используется следующий выбранный DNS-сервер. + В противном случае возвращается полученный IP-адрес. + Если запросы ко всем выбранным DNS-серверам завершаются неудачей или `expectIPs` не совпадает, возвращается пустой результат. + - Если количество "DNS-серверов, для которых `skipFallback` имеет значение по умолчанию `false`", равно 0 или `disableFallback` установлен в `true`, используется первый DNS-сервер в конфигурации DNS. + Если запрос завершается неудачей или `expectIPs` не совпадает, возвращается пустой результат. + В противном случае возвращается полученный IP-адрес. + +## DnsObject + +`DnsObject` соответствует полю `dns` в конфигурационном файле. + +```json +{ + "dns": { + "hosts": { + "baidu.com": "127.0.0.1", + "dns.google": ["8.8.8.8", "8.8.4.4"] + }, + "servers": [ + "8.8.8.8", + "8.8.4.4", + { + "address": "1.2.3.4", + "port": 5353, + "domains": ["domain:xray.com"], + "expectIPs": ["geoip:cn"], + "skipFallback": false, + "clientIP": "1.2.3.4" + }, + { + "address": "https://8.8.8.8/dns-query", + "domains": [ + "geosite:netflix" + ], + "skipFallback": true, + "queryStrategy": "UseIPv4" + }, + { + "address": "https://1.1.1.1/dns-query", + "domains": [ + "geosite:openai" + ], + "skipFallback": true, + "queryStrategy": "UseIPv6" + }, + "localhost" + ], + "clientIp": "1.2.3.4", + "queryStrategy": "UseIP", + "disableCache": false, + "disableFallback": false, + "disableFallbackIfMatch": false, + "tag": "dns_inbound" + } +} +``` + +> `hosts`: map{string: address} | map{string: [address]} + +Статический список IP-адресов, значение которого представляет собой набор сопоставлений "домен": "адрес" или "домен": ["адрес 1", "адрес 2"]. +Адрес может быть IP-адресом или доменным именем. +При разрешении доменного имени, если домен соответствует одному из элементов этого списка: + +- Если адрес элемента - это IP-адрес, то результатом разрешения будет IP-адрес элемента. +- Если адрес элемента - это доменное имя, то для разрешения IP-адреса будет использоваться это доменное имя, а не исходное доменное имя. +- Если в адресе указано несколько IP-адресов и доменных имен, то возвращается только первое доменное имя, остальные IP-адреса и доменные имена игнорируются. + +Доменные имена могут быть представлены в следующих форматах: + +- Простая строка: правило применяется, если эта строка полностью совпадает с целевым доменным именем. + Например, "xray.com" соответствует "xray.com", но не соответствует "www.xray.com". +- Регулярное выражение: начинается с `"regexp:"`, а остальная часть - это регулярное выражение. + Правило применяется, если это регулярное выражение соответствует целевому доменному имени. + Например, "regexp:\\\\.goo.\*\\\\.com\$" соответствует "www.google.com", "fonts.googleapis.com", но не соответствует "google.com". +- Поддомен (рекомендуется): начинается с `"domain:"`, а остальная часть - это доменное имя. + Правило применяется, если это доменное имя является целевым доменным именем или его поддоменом. + Например, "domain:xray.com" соответствует "www.xray.com" и "xray.com", но не соответствует "wxray.com". +- Подстрока: начинается с `"keyword:"`, а остальная часть - это строка. + Правило применяется, если эта строка соответствует любой части целевого доменного имени. + Например, "keyword:sina.com" соответствует "sina.com", "sina.com.cn" и "www.sina.com", но не соответствует "sina.cn". +- Предопределенный список доменов: начинается с `"geosite:"`, а остальная часть - это имя, например `geosite:google` или `geosite:cn`. + Список имен и доменов см. в разделе [Предопределенные списки доменов](./routing.md#предопределенные-списки-доменов). + +> `servers`: \[string | [ServerObject](#serverobject) \] + +Список DNS-серверов, поддерживаются два типа: адрес DNS (в виде строки) и [ServerObject](#serverobject). + +Значение `"localhost"` означает использование локальных настроек DNS. + +Если значение - это адрес DNS `"IP:Port"`, например `"8.8.8.8:53"`, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов. +Запрос будет следовать правилам маршрутизации. +Если порт не указан, по умолчанию используется порт 53. + +Если значение имеет вид `"tcp://host:port"`, например `"tcp://8.8.8.8:53"`, Xray будет использовать `DNS over TCP` для запросов. +Запрос будет следовать правилам маршрутизации. +Если порт не указан, по умолчанию используется порт 53. + +Если значение имеет вид `"tcp+local://host:port"`, например `"tcp+local://8.8.8.8:53"`, Xray будет использовать `локальный режим TCP (TCPL)` для запросов. +Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания. +Если порт не указан, по умолчанию используется порт 53. + +Если значение имеет вид `"https://host:port/dns-query"`, например `"https://dns.google/dns-query"`, Xray будет использовать `DNS over HTTPS` (RFC8484, сокращенно DOH) для запросов. +Некоторые провайдеры имеют сертификаты с IP-псевдонимами, поэтому можно использовать IP-адрес напрямую, например `https://1.1.1.1/dns-query`. +Также можно использовать нестандартные порты и пути, например `"https://a.b.c.d:8443/my-dns-query"`. + +Если значение имеет вид `"https+local://host:port/dns-query"`, например `"https+local://dns.google/dns-query"`, Xray будет использовать `локальный режим DOH (DOHL)` для запросов. +Это означает, что DOH-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания. +Обычно этот режим подходит для использования на сервере. +Также можно использовать нестандартные порты и пути. + +Если значение имеет вид `"quic+local://host"`, например `"quic+local://dns.adguard.com"`, Xray будет использовать `локальный режим DNS over QUIC (DOQL)` для запросов. +Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom. +Этот режим требует, чтобы DNS-сервер поддерживал DNS over QUIC. +По умолчанию для запросов используется порт 784, можно использовать нестандартный порт. + +Если значение равно `fakedns`, для запросов будет использоваться FakeDNS. + +::: tip Совет 1 +При использовании `localhost` локальные DNS-запросы не контролируются Xray. +Для того, чтобы DNS-запросы перенаправлялись через Xray, требуется дополнительная настройка. +::: + +::: tip Совет 2 +Разные DNS-клиенты, инициализированные разными правилами, будут отображаться в журнале запуска Xray с уровнем `info`, например, `local DOH`, `remote DOH`, `udp` и т.д. +::: + +::: tip Совет 3 +(v1.4.0+) Можно включить ведение журнала DNS-запросов в [настройках журнала](./log.md). +::: + +> `clientIp`: string + +IP-адрес, который будет сообщаться серверу при выполнении DNS-запросов. +Не может быть частным IP-адресом. + +::: tip Совет 1 +Требуется, чтобы DNS-сервер поддерживал EDNS Client Subnet. +::: + +::: tip Совет 2 +Можно указать `clientIp` для всех DNS-серверов в [DnsObject](#dnsobject) или для каждого DNS-сервера в [ServerObject](#serverobject) (настройка в ServerObject имеет приоритет над настройкой в DnsObject). +::: + +> `queryStrategy`: "UseIP" | "UseIPv4" | "UseIPv6" + +Значение по умолчанию - `UseIP`, запрашиваются как записи A, так и записи AAAA. +`UseIPv4` - запрашиваются только записи A; `UseIPv6` - запрашиваются только записи AAAA. + +Новая функция в Xray-core v1.8.6: `queryStrategy` можно настроить для каждого `DNS`-сервера. + +```json + "dns": { + "servers": [ + "https://1.1.1.1/dns-query", + { + "address": "https://8.8.8.8/dns-query", + "domains": [ + "geosite:netflix" + ], + "skipFallback": true, + "queryStrategy": "UseIPv4" // Запрос записей A для доменов netflix + }, + { + "address": "https://1.1.1.1/dns-query", + "domains": [ + "geosite:openai" + ], + "skipFallback": true, + "queryStrategy": "UseIPv6" // Запрос записей AAAA для доменов openai + } + ], + "queryStrategy": "UseIP" // Запрос записей A и AAAA для всех доменов + } +``` + +::: tip Совет 1 +Глобальное значение `"queryStrategy"` имеет приоритет. +Если значение `"queryStrategy"` в дочернем элементе конфликтует с глобальным значением `"queryStrategy"`, дочерний запрос вернет пустой ответ. +::: + +::: tip Совет 2 +Если параметр `"queryStrategy"` не указан в дочернем элементе, используется глобальное значение `"queryStrategy"`. +Поведение такое же, как и в версиях Xray-core до v1.8.6. +::: + +Например:
+Глобальное значение `"queryStrategy": "UseIPv6"` конфликтует с дочерним значением `"queryStrategy": "UseIPv4"`.
+Глобальное значение `"queryStrategy": "UseIPv4"` конфликтует с дочерним значением `"queryStrategy": "UseIPv6"`.
+Глобальное значение `"queryStrategy": "UseIP"` не конфликтует с дочерним значением `"queryStrategy": "UseIPv6"`.
+Глобальное значение `"queryStrategy": "UseIP"` не конфликтует с дочерним значением `"queryStrategy": "UseIPv4"`. + +```json + "dns": { + "servers": [ + "https://1.1.1.1/dns-query", + { + "address": "https://8.8.8.8/dns-query", + "domains": [ + "geosite:netflix" + ], + "skipFallback": true, + "queryStrategy": "UseIPv6" // Конфликт между глобальным значением "UseIPv4" и дочерним значением "UseIPv6" + } + ], + "queryStrategy": "UseIPv4" + } +``` + +Дочерний запрос для доменов netflix вернет пустой ответ из-за конфликта значений `"queryStrategy"`. +Домены netflix будут разрешены с помощью `https://1.1.1.1/dns-query`, и будут получены записи A. + +> `disableCache`: true | false + +`true` - отключить кэширование DNS, по умолчанию `false` (кэширование включено). + +> `disableFallback`: true | false + +`true` - отключить резервные (fallback) DNS-запросы, по умолчанию `false` (резервные запросы включены). + +> `disableFallbackIfMatch`: true | false + +`true` - отключить резервные (fallback) DNS-запросы, если совпадает приоритетный список доменов DNS-сервера, по умолчанию `false` (резервные запросы включены). + +> `tag`: string + +Трафик запросов, отправляемых встроенным DNS-сервером (кроме режимов `localhost`, `fakedns`, `TCPL`, `DOHL` и `DOQL`), можно сопоставить с помощью этого тега, используя `inboundTag` в правилах маршрутизации. + +### ServerObject + +```json +{ + "address": "1.2.3.4", + "port": 5353, + "domains": ["domain:xray.com"], + "expectIPs": ["geoip:cn"], + "skipFallback": false, + "clientIP": "1.2.3.4" +} +``` + +> `address`: address + +Адрес DNS-сервера. +Поддерживаются два типа: адрес DNS (в виде строки) и ServerObject. + +Значение `"localhost"` означает использование локальных настроек DNS. + +Если значение - это адрес DNS `"IP"`, например `"8.8.8.8"`, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов. +Запрос будет следовать правилам маршрутизации. +По умолчанию используется порт 53. + +Если значение имеет вид `"tcp://host"`, например `"tcp://8.8.8.8"`, Xray будет использовать `DNS over TCP` для запросов. +Запрос будет следовать правилам маршрутизации. +По умолчанию используется порт 53. + +Если значение имеет вид `"tcp+local://host"`, например `"tcp+local://8.8.8.8"`, Xray будет использовать `локальный режим TCP (TCPL)` для запросов. +Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания. +Если порт не указан, по умолчанию используется порт 53. + +Если значение имеет вид `"https://host:port/dns-query"`, например `"https://dns.google/dns-query"`, Xray будет использовать `DNS over HTTPS` (RFC8484, сокращенно DOH) для запросов. +Некоторые провайдеры имеют сертификаты с IP-псевдонимами, поэтому можно использовать IP-адрес напрямую, например `https://1.1.1.1/dns-query`. +Также можно использовать нестандартные порты и пути, например `"https://a.b.c.d:8443/my-dns-query"`. + +Если значение имеет вид `"https+local://host:port/dns-query"`, например `"https+local://dns.google/dns-query"`, Xray будет использовать `локальный режим DOH (DOHL)` для запросов. +Это означает, что DOH-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания. +Обычно этот режим подходит для использования на сервере. +Также можно использовать нестандартные порты и пути. + +Если значение имеет вид `"quic+local://host:port"`, например `"quic+local://dns.adguard.com"`, Xray будет использовать `локальный режим DOQ (DOQL)` для запросов. +Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom. +Этот режим требует, чтобы DNS-сервер поддерживал DNS over QUIC. +По умолчанию для запросов используется порт 784, можно использовать нестандартный порт. + +Если значение равно `fakedns`, для запросов будет использоваться FakeDNS. + +> `port`: number + +Порт DNS-сервера, например `53`. +По умолчанию используется порт `53`. +Этот параметр не используется в режимах DOH, DOHL, DOQL. +Нестандартный порт должен быть указан в URL. + +> `domains`: \[string\] + +Список доменов, для которых в первую очередь будет использоваться этот сервер. +Формат доменных имен такой же, как и в [конфигурации маршрутизации](./routing.md#ruleobject). + +> `expectIPs`: \[string\] + +Список диапазонов IP-адресов, формат такой же, как и в [конфигурации маршрутизации](./routing.md#ruleobject). + +Если этот параметр настроен, DNS Xray будет проверять возвращаемые IP-адреса и возвращать только те, которые входят в список `expectIPs`. + +Если этот параметр не настроен, IP-адреса возвращаются без изменений. + +> `skipFallback`: true | false + +`true` - пропустить этот сервер при выполнении резервных (fallback) DNS-запросов, по умолчанию `false` (не пропускать). + + + + diff --git a/docs/ru/config/dns_flow.png b/docs/ru/config/dns_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..5dd8caa2a8fe9f5c36da98a0bb2e283afd12d555 GIT binary patch literal 674622 zcmeIb`;%5hnl8%z?Zo*D&a~4AoQ6G(?flYlCeDdCabjXe%-K6)$KKnRm}Bf66Fsxr z?xAVL9tTBH6sP5)0)>jAauXXBLD6PV5ka82Uy4g{rzncTDlT=SEUHlOexBl$mo(S< z*0;WI<+?vB=+$q&`R1E%KAHKLmET$`|HFUzfBy6TI&A3rEBx;-@V^89ZrHF3_}{-9 z_P-6Ohy5?#=U-2JfBTLX5g-CYfC$8lz_4L4S3vhffCvx)BJdr#mVOQ5g-EOT8;rCKm>?D{0NY14?KM1Tm8YdHpp01+Sp@gqR4jUQvyKm>>Y5g^xc3=jb# zKm_7PfLt3t#;kz|5CI}UuH_gY0z`la#E$^EHhzp*0}&tsM1Wk&F+c=}01=2E0dj5p z7_$Z>Yxt3#q2oM1x5I+Ls+W0YM4Mczl5CL*6#{dx^0z@Ew1jx1VW6TP^gjcdR7;)@FxE*v>>Wb4+g8#iuTyLRpB)vMon>#f&ce|_=d#V@}2 z;gwz3 z`|PvNaEA;H^vHz`EMbpQC<_np18?vN&+w00P#0=My{H{AAQF^9REVti&OP4M+H8s8W-g_^-^wRX{)3E>r&tU-y&U^LMSJ$jrvu)e9W5vo42T5rAS%R$2oWcuh5q2dgNWZ#EEF%e*0~+31|`8h1L~tsIW;yfCxlDAVIF}>FL4W z?8}xd!=L99Cr*6+`RB1k3T8Tg{(K#5m$f2j#ooPp(IT`9t;6ycEk%3L>ImJ#qC|iQ z6a;~ox%S&{zs2uNZ@&2^ex{lmTDNZ9sZ*!2#+1(EK^xIhv=>Wuv>gZl2cS`q zVZ&w+0U}T%0`YJy{)ook*VxX)umAYP9~-ePEiKOZEH4hxb|3&8fCexDGTdaSahTGa z2;?3Cr(FBZH{a~pvj=}fgH&FA`DOfYkDvbY!iWjP2{iE71CRkeKxy~x-9Rk&Lx>F^ z0z@DL0*<&AKNS7p4}SoKJonslpp(m&FDF1<`KPGKo1z=&wv~cB!*4|h(I6$^>Qs<4Zv^i_`&^! z7hb?i0jUsGkt#iK-~f;WoTLm@Ko!^mVc?v<;lzlE01>EwKrLL0A9C;q@4ffl3qIg>L43pvY=JOve*gXV`IuOR zflDp>?OXH$ zK7o^)am7H101@~h0)bq+a^*@as*WB#T8RUwPYeO{0=_JU9{FMaF+~K3Kt2$tz_nMe zUd1Cw^XJdU+oXxn2`dUl0DXZEETCV|JNX!0jFJctfg1?;acysJ@9%&A`{m1*2Ty(G zrh>qV6)Vs?=%X85$p0q-L?8zUc)0fS&p*e$0lt-z3X!nVFbJS`&`0R091JjqNCb$$ zbp$+I+tAQ}O~EiTo;E2WfbXiKr#Og-01?Ow0zc&1B}gZ^bo#)k~)9X7r@Vd z{&Oj)0+Nu;qIw@YGXJp$EO=WpHqC&YU^;mV!5n z8X`ah5=P)U*WwtK4I4HjzzSv+*QxgATK4ea!(c4jVFN+9R+O+5PQ@K`t4?5}Bxeec z%}eb?K$cXYcQvp|nMo<7mLjNurB67CzC#b10|zXNC&ETtzf3)4B0vPvLf|^r&YnFx z`EPhxTnm1}UV%_4I83+}Hdxo<()FuJW5`7j(I^+HVCl_*!jaHe#=aV}pvY3(_wF@L zK!ZgsdQe7?uPaynyR-1%M3{|5J7WA5LarWuGCBo#Ku>z$^?Y=_I7Nyn=A{W#Wi;9SgW_0 zBmzVrEd;J}?YME{aN{xz`4{rqV2;dQoapotvJ$ zel*uAsQS2t&d$!i{_DRUJ$m%5x85o&%R3Pu0;d8R{C_VSwrJ5JZx%H~ zfCz*^z%|#RPHfrY4WyXJfNtYM0B`%D?*c{*-x~`6hgn1*7=akLHt*jy%N?wQ|1 z2%amDR|v$+wFvX-)vGVO@WTB0^FRIcQzr~TC(#i=U%dF@ zi|7~hj;og@{Wi>q zpbZfq0&yUa64y#oa9R$wZ^w@x4?f@;*Da$1PoN5HfiQ56W9-l;5g-EL5lEG5CCt9Q zzSXN&Pnb=-wz~#Cr|~p;l~0ki2xCZ4}lDDtu}7UmM!@4X2y&e z_=A@l3$^}N0*HO^!3RJO7y?N}l>!kU0$D&HOI#~>96x>>pF+VF<8#kF2hO;B`EsqS zQ!0Dl1C($W7!U()Krai!iZKuYB48nqJ+74i@#ER<-Mc{{6DCZ+Az`4CuCA_9k!WyZ zfySTy^rr<2766~;pMQSOo;^U!>RTp>01?Oz0$Jr+MF?+`;=%iuUV7=Cd+wPvYZkth zf}>i3d8oj-Xgd%94nPB#02$z;SWzGXL?E*WWS(mkIXtp-oSb!v4~wO9u}g#HJ>GQN!1)?!W(jY;9s`_{=lUy!z^^Yu2pUwr$(7 zW5+IDyqGWtqej$=+7SaHK|F{Gu^~dliD(gXQ&SV-w_3y`5g-BuK%j73>+KVq>wE6p zxx*tJ@%Mz@EdQufu%4`TgM}+8#ZjfV-NV79WMo-)X9@4 z+uGVXIy&&vKVA(ud-g2ukfDJdxv+sH>`@A3;Q@Z&4L+AHT?+rG1$CiD)Qj2?10q2w zM1|PA0aHT+h(PfWC;``2>NK3sjpzUIJJZ&!TQ_dph!-fZMT$SWM%}5GXO%*3rX*gM+u+atrQtlw}bjKm^K+0J*l7-k&*h=E#vFaj&HiZHWL8AOhc! zYeNqLEN4fJ8U?^Ww_MtWhK+_qfCvmBK&}lv4zQdZGiD3`8!=);NtU+5h7D7AAbT&# zgNP!h2E`#sy7A8hDjn2i~zYd7@r%tx~K(U zxXQD%1-k$Px!(Z8{(qB!ys}sadyp!8%Su7Ln>JP)Vq+g~r5eSI@xwaZm0|Ns%=Uc5z zz`(x9)vTfl!Y;}&RuZkYvg*^oiTV)_lJqKv?5k{Vd@XORV0<$RqjU&ZUNAA4OeqJ!s~k}f9K5xt27<~8nrM8(FuC@6(VI8CS#5cc zJYPS)O08G@P#^+f5O7ExDGMm45j7BNeiHiCg_%%mvIyEj)gz8;Wk za;^E>nEq6Tf_lN;lqG2@k*i8m51AJc2#)}{Hau3>Egb?@W6dd>DLKVQxtfF^no3-I=+Ggxfu+hK=w0=ujd=FeXch$`5P$%=HUJ#I zEQf&kxzD1`Bq7L>Gy@f7rMp;G$`w6qd<{&!`Vm3zD5$asCf8bSLAPpb6||CK=2dz% z>W~5v2tdFgb$Et+K(+bJatK&1K=7p&DCJ6}38>nv*GigM!Ln7*N=jL;(yIxsg}FpP z5O7ExKb!$Y1=t~AMTLm%A_7Ffi-1GwAlG`~rG^L)0U~f60dj4P1HmC+HP%dXB0vOk zjDSPx;JP-)j&-dowCINjL`T5k z^o<@2Jp?1*u(Qau!B8`o2)IVT;q-MK8vWS_IP5HPtqm^IL?B)S98TYO1Eu#HpJR1` z1i97;jC4W-LL)$~4GmTLh7LQ6T$_G(GJ#(!PwP|!9>nt+@4ySLK zVN9m&4m*onn@pFn79wy10f*D~hD-i`TnISqEOKpJokYJxz#jpJ)7QTOYTY5=u(Qau z?z)AZh(H(w98TXb)zKyj0uDQiTpOh$Se6LXj)24ITYKd!Q5ymdJBwUf8}zg$0#Olg zIDMmr!t&J+aM)So+G=1kp9r``z~S_D8yLNL5pdX9##{DI$<80uHBdvVoVeHiw->t}WvLVw=-Mz~S^wvl->6+hJ#sYs)cY*vjl6;Bfk8 zr%^?X#9?QVYl}Ka*siQ1;Bfk8wTZ=v%VB4cYl|~1*phr8;BflpqrrKO(qU(jYx6u1 z7<(QOa5#PQ*!+CO?69-QwfX9LMw@>G98TZ-gOT+XIP5HPZPq)R@f8gLhts!c&}6SY z4m*ono4xL3M8!tH;q)ywP+4f5!_FetW}!nFLzxh8IDN|mTRLrZ*jeP-bh?nWmKOns z)3>}JCe?C>ot1g6?fty}!rPDHcmCb>EBFTiNhpz33J7xB$P#dE|FyySjVq>YS+J>f zN3HBadtU^AB=DTyxDwdrcIf9R@b1sQT-DNZ&*szjZ*N<8^3u*vzuq_So&G}-N@T&{ zty4WP&Qse;6Ke^$7L>5`z$#zPpfU;qKo$QHE6r3%r=hzq4m`Q9;}`2sKGk&by$e^B zUws7_Jl%8=#wdb<=|s$0D^@7mBj=TO&&7q6KlTC0rW4Trnn>WMw=aO*Hgx~c<#LUS#CF~<)% z5$S}*gAo||xv^z?9Yc>rOaxl{uP!~-`OA-+AKBghdh6v{X*Jj$4yWvHhx5fpJ5iBY zFXhA#C^Xj&J)m@IQ!rI9HzEQ+7&s?3U<+2!7hiw7p}p^soo&C_)bi}n?)6OruskCZwAPk%{KFl*1-if}?796?o z_v=nPzW3aUwt*-lT5DNUhe}cPi-#{Dj0}QP$dC%nwRl#)Dpk-RIs(ACkdq^hMh$-X z^#^U2CT%}+@0Qm2$9p&Td|4|~y0S;rFP-R}@TXP;^WK?D2rQ2F(x)OouH{P&kr5!* z>U;_i4)t7luIc=pYmZOge|}Z_6<3rQ-4B9!V*gNJ&o-S$kO56#RulxtwUL=7`noXh z9>}!;Q?U2ymw1i#pSQH$x9!Z!CogU9`@w4n(V5bf2Ly)j5ajQ+w7z?~7hwl9idl6a zK&~a%Mn-^K>pSxrI|pX(AKDh3dEmn8bDy~)#kl<-)F%%NZ6qUjG{LuNRMvq2xi&J> zPDl?Hd3ww z0dg(5HZlU_TA6t}E?l0rxBZtJnx8({`F^$cY2zTsIDDcZvzj{5sOfv#(ZD)5hD8Jc za&2U$iM}q(yN8lHatfFAF}=v?;sV(adEhy3k}YXsrlj ziEHEdzHHuUEEn;YlWXxRz~+wr$9A9nr;ROhk94o=jPyQj7T7dQ3~1&vN4nAEsk_f^ zZ13m$5aAg&Gh7?T_hrEWx!|h22U#|*ZRx+dEac7&=VG1`S8^ z0m8zg7Xe6k$|FlVS0aaP8+`eZB7NrH6L3{dV)|c}IITruP~`GHe>A z7J%@=v7YgpPXm^xIYrUp&#fwfC#CF=(yr z1w;S}uOHvHwUq~R!-Nqbh^zwiqA>-_Sdykvi;JL1)6%UB zoXs(nN4chBy#gr5#M~>RAe2^d)rh^78;~6J)7z%bUlL%Doh%-NhDnhs*T(&Q*<5ff zXb+Q2$x@S|)GXDDrD?AkHMYvCUM<}U`Q_Ru$9nlP8KCyns}cs@3%OA0U5$f<9C58Q zq~r&orOLH&b76e`$KCfEbH*U4>;?V1oBpWDpZxou{KxBLsDo}h*qf%N~K%ah+YKmT}!E@X|J-CYnG~%r8ZH7 zw77QBqD2i24TFP&;dd=!J=P2K1Dy4)Yy_oTl650>^Z%_PAWq~-aj>aSAnrn_&bbfRa}`| z3%#|j6^`_BEi@))qek6BxL*JFH(ejAL3|Wzc`oWfXc(g5H@ku@hYbtP_vT`bI-mEZ z!}$DTRf>ORUDmo*lghQSrGSxZmJ-<<wm)dRk z@Znnb&j89Lw>XAT$UfM0U03$8WERR*>E zP6k#}ij`dj)nnnSD`ON9{u4oyP^uh|rQ8V{y`-#}R5Ry7id>8RTC8JDmbKP8x?hXW z#$Y=zR+4~o04`N{1+!|&RU6InYBbBCU@|vq^yONRw~(>JdaJrZ2cesA)Y-x#7tnE5 zSLQuQuC14AF-Y~&Rje?ak|>hOwUA{kE2T^u^#egXSQ;q3da;o#H82J7CIwA1=W>c% zi-jz>w(65#@*KjHoo&C_)biZXZv60Fb>7!!V0N5WhEJ~&8dG0iy)~7p#I;szHTjHU zjP7{$Xg9hB9kijn51o~FTJ?>eTw52{I;X3U4lx@7EX}zBGbOC4z~>z5x@$x8v_0*3fv;ekTB$kYT5@e<1k&Q#N`pGQ z9^XTFqj~6j@rQPv#o2{;VLv=!(6Uwp1)?0WzRg*h?jlYss~d5hwuH z%B08lYu`H6Ghy@T`?t3(ZoY)iuLe^HbAu5uzhAqmr3dhqid?P6l4~O~O^z0zF@;(f zuGPtba~YmFICOf}%>Cza#6U2kFxQI!K%24u{C{6}V(x)+08@c2vp}vT*G5L5cw8%# zAm@!u+}irPt*tNfys?4mo7r;S7>;NAm#wX9&h!GnGLx&-c5-cGrip2>m?O7E)p^s>e|7P( zi+E_^vArG3&&2-TZ#MZG4M+0S_p%Mb*T5@e<1j@#>GMVru>E@39sk_gP z+t~8Vk?wV!rFbC%&76Cr8%;*T(foqGPFsmCBk9Stk(nl@#bS=!mXm9B-hDD~ZP|&g zUw_>E$gXz05RuJgX!NMiv?;sVfAw+mYbUzUWNki$kO+`#$+eLYC^^^aRNHak^7Os! zzueF~yQ%a2qP!4+hCF?+6OEd&w;c`C#!{#i0dj3*rpeI)G^S9=wdSbdg#q4PLB3ooy(%F=tk2xj{Jp}?MNI*%a3w1qZxAV98-%rrS#fW{OmxigKRmUGq!=p#K=`R`uVi+BXFRaP4nhOhmgHEk%=UPpx%SnA@6O-5JXWTm^OqY} zeAu!*vjaRYfyH_dTB(lp%50ApnrnBqH~#j68Jk*nkP%}-0NCEWc1G{#WjQh`fq9Jc zw|>8;9cOVxKM1Xy$9g5uNA*=vXs!jptT^)i?>D~~6VuS`v@Hv^ezL#5p~q4I2t+vu zt>njg1)!R4R?)c@bU17KlBEY$kr$mK095BUu1t6Q7QXhH4npIxURfRwCE(gU9s5DI zSlx0n!4=&CNvvq+H?HWv#^X(rnBKt$q48L+B>Et79VOseAsB2XVDA<`mEm`DJ_uGH z=>j*PhabbRN6W2)$aAkA2i8GoJl3lo5K}5s8mDzah2YW0M_Z40m)n*Anl524nP znQ?nv)Lv&>E^Ra3UEhaCuI0KmA0w4f-b6qawSV?!e}+Zvs8OT1w7m&Uh9z<>xi-VY zlc9MLz@qk+TW%RMX3XFH-QQvQ-f_nrfAJT8fgj1ZYwN`-Q<_w{7SC()wSu^}AozXR zOij4x!Azb!`LF)!ueNU=`nH-(U&zor^w2}mozp{n2&BrjLl4ID`?4`FtoeP}_-0S? zp0RipmX)f_=?guVw#oNM_!`a53SY|Cvi9G`@CFiI_>6mDS91USzO3(PEr!zJ^eqM; zS#E{H&Z?bj@v0}@tmh|T;`^@wzb~8R$rn8~htoHDF!T_NfWywJoof*qK4F3{M#V=q zCHKtl%LWhsyyrTczIlft`|&&Mth%@s2;tLw{Jv})|4rccWwSs3B1Y(N`bLa|#j7IV zu(RsrT6_Z)pPa@DjGGCr7?B376Xthx58m()yuU44>l99cRTb$4!z=%cX6xr$t^`=WzPwrOEk?(_v>7oolh2 z#RoqC7(T1SrEPwPe32q|IDLx*OE%l$u(JxywYsPUV7R!n&E{|}TT~c|WovSN+v~8i z3eB~;s2x6hI56YVHorr@NRd07zD0s1n{9E}S;ggAENVfnqeqV(J9aDpyZ!dtv6*n| zt+#U5Hk*UGJW)BEzU2Wet(H3Mtm1NQLqh|86TMBG;`+6Nvq#jFA>nu zNGNiF0J*kWHw_F7ELyZktxUkczR1-q3Pd1b1kBNxaMi4?Rs)QZI+6936#-1&TwkT?H}sUN_L6H|AxS?(pacjwcv z+FbNFgCqjkK)@mQWTQb)=)Kc`CgrJtH^lHScQducjDHr;c05e&^lEeEHOBB~4DtiUkSV~QrSze!B=a#+c$JbbuDp*CVq?$np z$TH0;$y!_mwe)HK_6kW>%QA3AhMlegV= z+nsmbDarNg*J~+NswIW^5U{3Fd=+KHv%~h1YmGh?VlWg{$Oe{X5tS`Ll9le36Dz5% zRPXhJEbB5$Sy@P0xmMD&x3Yqh0iMl*BC7`EYVs?HQI~$UX4|>Cm&o_Lh}vF>!q_vzNrc)R?jsS0yweTY@Aj-BAQt0hi?;mQqCTYM_GH zXwnii*Q(SqLsBgz%bT=3cn!P-#YQc!Q|-;QY)3~2vT&E$g=<9#OW{=9LAT-=ci5;m zRZ@rv0f*cZQ-p5aI&AL^dT<+H*1XjR7-n$QNvt*^n0J66#e?r^rl5(vCRM29M-5a6 zD&V*Gig|YL*ICF7(!A8F=G? zJ(O~XP?c+S*=lhucvq`7E2SJO0uH$+);L``ci7%&OyjCSar-d=lL@Ld>ZBKql~l7z zf@SZU6s38$>at2%xn|X-r74>>kdb9wrU9}7lHM%KUj3`3X(07lHkN_pO7W^(tIJ&F zTG>)CeQG2W;zq!nN^#ef1^*7)`@?CMg~r7ZgBLK9612vermuML^#h0E%J*&+G>y$H zku^3E#GzLXFf+5XxCl~(c{hzAtG%U{q~>}BwU;d1&CB#`ajmsqi^VH0@upm>g6OTE z%Cu?&J+TGtU|4wjDn^sUq%rd)6%L%vn;(gXrFxvaEXTi17ulY_!^51 zXwuBpRjkxvlBjYmvSckQ1x*|A$$NYV1Wcv)DoxR|!}i{o7AdwSfvQcw%$e;g*Ax#t znD$oEn`PB#8mL^=iCBg-Q@5s|WmPb9Yn6SSm`YQw)j91mg@8GgG8I@%!8mO152+%i zcvE-l5U|wS!T^XsiU^c#DmiQ~xi-ad%c_Y$-VkueJ-KMQ!}gMEbJ61rk_co20f*d^ zjRsYT!eM*KwN2o3kbC^xXHMs^z2w@=^)3S<0@+2tA@^jrkw#<=+e@xBaHU8Dh(Is`4!I|| zqKxD^Y%jSsBYny+h(I0?aL7G*Xzq6o+e@y^MUOK`B9ILP9CA-K8dN0;hwUZTR>7Lt zM1Tm~M8F~U+;o~@$zglRwHfYbhDHRkhJZuv$y(EV<8j#DqH}HkwXfEk>HYtfZ~65H zO{-gbk@Q8BN+OT|0==L2f7r79sco-JT0eK(dr$CRk_Z5EAP@Y}3*q~kTpI$b1KooS z2hRPEbtk6pJO6I`75syMB$UVs;eaMYz$F4(KiPlx+8Hl5uK4iOrrquPj&>g7za$X= z=0G0!qZiN@A-k4bTN$YC&%a#N(sR$|)Aw(0TX^!)&QHJIH}IYQLlR14!Qib^Jut59 zi8(~T4Fdhw2In`fn6_oXrq&%vvJ30-MF72kzL?**68%!OgUPji5beG=@Z`RZU#vg* zRMW-xE?iZ9^%Y?7bkju`qX-K6`J;{qxIqBZdg*~xzVn{Sv=Bg#;6H#>JD6N+K-4jK zZFzI|xQ#6j?L51*rGM|`o2yt~mNk_yMiCT5@i&^g;mUAKkq9_I0DrDx6_pmFu-*U! z&@WXt6UepK=fIY8{lDMSe%FTPIfuGFym-wd(OP8`Z#diqS5NF|hg%0zj4p`4ci-V> z80-#m>mY#eQp`fXpm&0QDl0eFw)S6LdaU!8A2&a;yZ!an%eB&Kuss}3+1(E3i;s4q zBJu?hh=Krq^~R4eDbfk64n|<;r^=S?0bN{5uKnWcZ#T5}J+iayH=A0XJ=(p#>x*F4 zjFJoI&mHX^x2fgPooyd|(ub-8dV^U+pb`Q@4;h`>6g=ITn<4_}9rRJ9?t{K$TzjJL zvjs;k{QbHUkMBLVqHQ1wiPl;c)uB>U{o>&Z2qU0Rm_-D<2;iAcKHilgl~%19y@NjT zcARR;!L@^5e*Hn)rAgb*+`FZ9{_)<;Jzv(!l&K?zTWzvqe#i#mqfBJ3Q>==iCgpJ_Q1Tw*?P#Dm z=O~vG0dj4+JQ}9ZRx+dEac7&=VG1`S8^0m8zg7Xe5K zDW|keCf9~xyL4@G&b6O^_4T^5mmb>D_S?;;=N;|YnBHp$$*^gdS^&Ze$9l$ZJ`Gsb zwp{{5rDdS}vRLqcV<0W6O<4jmXVujxGC zDi86Lu%+bMFl?8uP2RXxj`jMNt*v;x|HTu%TYJAM8-v!`UO)t(@cQw6TU&V$T2X13 zT$?VBhN(S2Tx%WcRV(Gto(G{7m1xl}a%~v4OV=jzTpN6>7a6ox1b7fyAsLrkn=X%r zsXfD7Thp;#VJK%<-~|uJxBRF^idwn3PVykMB9U$ZxE51P7)$0FWEDi#ToE*>1ywHv zwYZg3vxJ50acz`iy@JUPkXJP@yG3Lak%Co=2RqMZE)PO02ICfhYr%Y&V#0qSc<*Me z$&^~qGB7ski`+oENpuhfqNGfST@$RNSYVs%l{wM$Ozy2plE?T)rOQ{lBP>O*FR#IJ= zmZrTLsB`tB8nsDY$N<;IdaRd8MZgLdz`aE?Tsxp`l@LaL^lJid<{*D~MB*m_f?5)1H}z zq|mAmtx_G7O1H2Py$IgBmQqX8US%uSELAB>ZQ>Ks-u|0t_zQth?4tYwh|O+v;$wF$|!C@cQuUUgjydr+(x%K}$|iTloj z(6T_W8pFbc3rCM04Z0mUa-_+)8R1$`7xoH-N-cY={_A{JKh0A2z%yO+RTP>~y@5-FQUAawV5j1HUs8R*VMN%{( z1l-kI!a{;vi_^34lKuW^W?6C$ph74Rf>ORz1F%`lghQSrGTknmJ%6Cy`X_CcM;THY$_#HFM?Ut zlr6Iak_mFHxvs@&vB@7-3#5fSyn^bHWnIcQ(5oze&V&DSjVpvIWyMT(WYtpk8DOA0 z04T0?NfGfT6prGOEB2;;^`P;@Eugb-!tjJGLkIlg%wZnzo8szr?AWnFv}4AM!S=2E zT9%P@t+ii^#jEZcDA%eW^k)84h5>I9q$Z&>WwntBBFRd3EvP~z%eeIka;*+e-LJ)G zW3U|r(nOl`2~dZ6(z#VIc!tt3z1d8*4b+h1ZzkAQJklga81abExaC z4b9W`w4)=mQz&EyfegMkmM~rAy1FcJtqf{>58;jGq4UKb+Ibdd7vhEeO7uW|bOhvk z2$Of6{msUf<;~pyKReXINWvpfwsmbDNjH03tK$pb`Fd*K(CJyTnl9p_RMB~b9!vxP z=~GP?f3f}~KnBzbJB2(VK(5U``(~JHWys_EwQrs3nXviv{oC6XH($c%S53m8Tq^?R z_iIV7?0?uW4=HSrjSu^*a#}Nayat!SO+Km0@|NFWV za}S&Ym^JkReqB&|^OpvdHMgpuMSKM*E?JP(rjlL_EFmBabsk_NRjUDth-{WMWwlI8 zAlH&>b?n_3t*WR`kn_eS;=Hk~tuOPuu@Im7lJmxJJR1&aTXUut0M>`R@Qrz|&kst8 z6RWtT^d>EhRopkJMO08T)j+6pd5xigv9Dg0sR-m+a;*+LV}zgoUqPIjL|Nt9B}nz0!5oqSzBi(2+8jj}2@j5LyAo$X*6f;fw3b66&Ev4nh%9Y|?rKQm%1oJ|1 zB)u`18q>fmD|+)Tr7W(65_<(gr7#w*g$>rVxO~^I$VCw|hVU}EmRzf&rP|O|Lnp!~ z1J{?%l>e8fHwUU|Us-R}7 zF$K+q0KFttP^GCci>PcGcxBO;`l?*3%T|kP!MpGym)2gZK&~a%>X^AP>Q#}9u;aqz z>3iFMxuJP>Q|J3dc_9J~dHP@{8Z~2YI~te_lBnedBmCh1>!=;&y`?OrnH1U5SV?sV zy=18%k(&mlM$CNgW)aiC)T>;TYjv5cTq|1&@T^Yi7Ra^aS{*zt29!FhRk(2FixsE3 zf4iyWfgNqHwDj%%^jn9E%fwtE?8T@09^BD}7noO`>PDk##UY}-mleF4FjbhmWy(_4 z(wJ44GK@9p6*LUV!ri>gvT9jLX&MB`7S~$)wOG93lH$s>Du~|tsVtx_Zx*?hT&trZ zRj$=28aoH(>>v6X>#TzpR-gMUF`A565kh_Pzy*Yj;L!waPQrpoS1Lz|0Zu9vmn^Nt z6wD%O2BpYmuE@T6Q>n675Vz0=TvCh0wI;brS^1p|#!9iWtDt%;eBngA)p{q_l52I$ zRGw98l9-j!^8BImI6Vt5udd3{d%p-~`u?H7o@+XfAX9|MtlH!fl}&?M zWjLu+#LO~fUwdBzQ)$Y+9z+>n=FReI0zAi^MXn{+>KLm$tJEYdA@zgMbccb*dZjf6 z@?I~wmRzf2IKy14F{X788n~9ndTB3Er~`pX>*wxn-Lg1-wuY7oFQ)!tj`wd6$ppPnbAM~ZqKV#$&w{RSFIf=>5F^?zJ;EweBb_nPs`* z=oj=3`Y52s$+ZSJQ4T`mv0es{6k|bP>nHoCZCQ|I$|-GZ=oj=(aIceV{qU*jAT%E9 zqKY-|$s$EX5tqRe1-&qHtMLE_hL~S%70#y*epR3p%9QrZl)FwU%mOSYK zb081=(F;|#4zw@HwF*TwK@URv)%ypd9P3rB9_AB)>ImRx82svuhm7z{Cth>lza$X= z=0lI*wQLXmG0f^ka;*hOwdCO7;ONn#aj#~`d?G*uh`>z*$h9}I2qn#&IdkO5k+_Gl zrV$Y!0z}|C0_56S1_G9|qehJaW}sUxZEHb}wnU)p2#{-Q839<%ju|rsn2i`Qf=k<4 zkfSXTC_4h=+R!6F7q!3)7nio7k)t6IAOa=-9zsn6Ko_;chYttWa%o!=dNd{iB}V|H z;R=ELeCMl<7GqHha>Ww}W501=3W0J*ky{2XFdd*v)a1c*Q` z5pc*GT-WAu1TbhKKm?LNfLvQU$__EBy>gZy0z@E}2sq>ou4{8S0vI$AAOcAsK(4JF zWfQYu75)oTNnd+yEI|Z_KoJlyc_U(bDzHvOuNf?EVg^pFbY(DdhC~F2Kw1cxyb&>m zvU062Y#?A?J(Wa&2$T~6a&7JXZemu6Q!D9fuZ<;$01+qx0w!-nY)@%cawcY#HW0|Q z5l0h?6M=#uVDd)9rj?RwBVxwlM1TmC1Oakw?HyeSGp=Q8$C4$8Kv@u|#2aYk3b+ppjs1SDTO*@diXrI}9zhyW27LV#Rbc^owL zT$#16;~&>IHyrNT(DlW>f$#Jml5-DtAqxgDtL%e0M1TkofguFQwVrXH+XeS+J+r8} zZ%_ZXO0kxJEEvEHdkY_)?c>IR2TLl501@~e0dlP|6s+w6i&+Db+*mMBq(}safDZ!X z+UuYMY!?Jjtd+%$1)l*%6%il;*AXZ;*M{FNuxK?P$&Ce0Eh0b!ya<$)YwO-F2w+(& ziyI5x;YJM+C@liz<60-%1s1IaB)PFr+PTGs69E%}(r|4Y+XVp>Yh`g`!5nmyi9iVv zC;`_duw7s=Ye1443niRnY%&o50)^(6oqRuyIo+>YCw`33niIzY-TwT$T`>M zWxF7NVy!H0ER=I1veku0Ah%qb)9nI_Sp$;XSSbADV*^WtKn}UK0NVut6l-O1W1&>j zk&P`d0{P+E;%ygLv>K4)#zKLoAe&Ya1oFVOh2Jg+U|B1R8w(|wmuzP75Xd&ymTJ4e zqSb&THx`OF5!s@`Balh1E%SCk0L5Ba+*m05>|_Irgh0l)mfHmup@vCvW1&bhl5Hs} z0-533Shov?1zzAYd>vn-JO9@%ZT@8fuG)t2zz*2Ih zh%eWIJB2mDqc9dWg{2fh7Bu1q!rBuZ>JSChOpN2Wb7LXbvy;IW34sK;Hks`LU&a!K zQ=Sv@6H9MaCA}}#f=zWfYc6)hiN&>|lzTE>rs7AIv(|ns za-r9s(7byH>LJNJ1ZjnJN2g3}JckZKH=(o4zAL$mK2iiAdoRtcDtOD98YwOs$eQKV zYei~f3Tm%rmH=Z*6FzBHj3LdO1**^jO40~W{Jk!L(r^{0zAkbLP-0V%m6;R z03GrA$u4w?*+-Nu1kh!oQNc1mG9XKhVdHzLf$2vqB@41;qZ$>gvZlQ$tNoPg7qZr` zUw_+ex0yDk40|aecg-@BLl)N~lsjxxP04cRuJx_d*QXVdX+t?C1a6GYs_rwgvEZfT;%T^DP<1p`HBc_`S|TeTSM0^cd$)3t z^xBxtMfPemD$RnRm)0Ue6s{GYzSUW^s11df5D3k+Qh(|j3&mqrvqju4sC$?zQB@Mu zvqe9uHwD<3Ns%q3<;Ti3i)fYznuLwY0YVh6HLEaXZ*>wd@9`nvH>RrAmg2^O$xMZj zxm{3o$R%t5D)PO|FkpaWu$kJ3r4|>xsSMDVTx(U=(a~Y~6a!z+zDliE{ZNPrfx5U> zW8ua^M84;CfsQ37f<;A2JheLaWgtswCPlV1NQy@8W(=w^1;}!VC1epyt~Gxf)1S(2 zlpFeg6w##VN0n-$xsoMG-s3~yMt?@Bfg1~TFfO+Xq71o8Wrax0T(8E=tt1Qmc<*9w z>Y*{KFlBXa+N-Rt)XWmpRVA*4J#2JotM($`u7Y|NjT986YSe~8ObEE(S_zFC3t18&X(Byc#tKlU0dp4;>o%a+24TDE01Z<1M8c3NayI z^p&d`xUt|%y4)^sHNXP=n7krpUQIx8ErL>&E-elNl_6M3btPHq%`9SNsf`L^Y;vt; zi2%A)htQ}jp3S7lmQ5uyZ$WCJBk;riiSAE5aAQFkm)iw8D&iI_Dw1TBO1lpP`v8`nyVW!_lec7eljN>@Z6?+C=qwF*zEHWs*D zp#4sP2oM25ASteu+6uq1!0iG~EFwSzd=W^NYbAu@Z7guRz;|#_Nd$<1B9I2xYUKsk zSm1Vn_9g`)Km-C1NR?|PuAFWxaJwL2STTzT5CIE;3~;SPl$VVKZWmZ1h)E(q1i~PY z8Lrh}GrO_C?E>v13PgYi)QUj%xK>(_sf`707t}heXio%)fQ3L-xmLnVcVmIu1=e6; zk_Zrix)I1W*J`s8-dNyvfg(?V2oM1$2;_uorL75UEO5KP$*`gmB0vNz1aif-5_=pQ z3*0WS#s!l^fC#unActJ5065uL;C6xHNr4Cuf%p)}GuH|#b#E+iyCA+{MbAWl2v`W@ zpKGN-;WrkzU0@9XCW!zMNC1JNaIHcWu(81H0!4`e5g-ByBTzW575uD?1#TB4Jgit9 z5g-B<0tMw-X{Bx~{QAB9AAQn?q}6&Ri2xBG0?8myXs#6q2L}hoj2VM_GKjJkB0vO) zfER%haP7>QGe?dbiMzM;)DQt8Km?LOpy*tS6Z&|IsFT5v5cE^U(;Q>=vu5CJa&h2~ma)D9m$ z99+w#t+)TFAp%4o83c;UwOG`GTt|-{J$CF^5bf=^-;T|MTW`IUySB-UEY?B~!uK5yPUXy(kBV*)^#2oM1xkN^S&<=TOPfklfJDSpDWk_7uA zSFK(0*y zWL7~0h(PHPAlH_D2oL}wKm-y%fLxmZ$gF}05P{MoK&~zQ5Fh|VfCwaj0J$~+kXZ#0 zAOfXFfLvSpAwU3#01-$40dj2uAhQZ0Km!|1c*Qa2#{+N0GU+~0U}U(1jx0e z9|8n`2oQk;5Fpnk05Yo}0z{zn2#{+_KLiK>5g-ByAV9870AyA{1c*TC5y&&w_V)HR zH#hItvE#k>-h1brca|?-{_3l*E?BT&-n@CUXV0E7W5(l;KR$W#AObEC$OG42zI^%2nKOI$?p?cf z?Q5^SHh1paDO09^J|BGW!Ka^odhz1Lt5&T7-G21ZN1Hcq-oAZ%V`Jl?Lx)bBIMLeL z+R@R`)z#J4*Z0|HpWzM}8t9P=8(6{~rBD_g;0NB|6Q1E8wV zCHVA31c*Rs5XdCge)G*Yr%#_=zkdBoFTDiXyZ`?Cu?&U0a^*@W_wV1|*475v1AWGK z!9Qw2U8wP`x86eShyjrx9?0NkM2I*`Gf>!2B0vNpA&?oa?eFggvAzBF+gMg&O*wt~ z^w(d1ecQHe?d|RH5o#Tt5f7q5Y={tXB3i_Z$Ps^}j$mOTKm-bnK&o8(_19k?Ja}-~ zvSp7v@(6ZPv3t6D_3EakrcXcpvA9L`!S#5f&f()K`=%dr7O~Y^cot>RoV8jGsKughH?ChfLAAa~DaHyecXi5Z#K!Fg5nQQT& zDt9_a7cfb4Ho;`b#VWYy=0wjSaP|fFHV$?){ z2vkHM0@vcpD|j91A#Km@LR<&{_PPFRvW6kONO zfBthZPytEEW>P&=(n}FF6T$MJNf9*ZTh?+FCW&{;@RC^$2NOdk0z{x90`+n&z8pAp z>eMjIk(doQPiRl>TCbI?q&Lk>8TM9EHKNDeywrab0oVfJioM1RB0vQ4hCsbs`@|DZ z?Ao;}3Z0-VoR}G;9Rlem_Y=HK&}v|i)(TI7C5hN z7SV#&srDw<9zJ{+?1eiFAPCor5|+ZLxSLhOMhH)eh-YZ5OKVgEwTGpZYub2aEvSO& z!IY(J-S>CjeHS?AYA`WaB0vNxB2X9C&YCq#7_n|5k%AW2LW#Wsp;C~Ra4l@GuEnM6 zSF=*&qKIge=TxxtW^w*FOC4 z!{^VRkH{q`UX^Qg*=lhucvtC7!|-LkN@ge}St6(t6~vn)P1)3V^~m*As@w1ap0Wkb zxf)CimIx4miU`!jwd2N(yK?19c-p9BS(R&bnX6nYTMAx2gT_)?Nr}N!4i&hufuMqh zYHCc`^doxQtxKIm5e5ebfpf)uCE9upV+FO>Uf7qD0rmV&56M!(jkdUjv#9)a45vYhjU0jQO zMC>NkM7}b!WI<_?sB$f`WGySDOdDvVpgJ@KWLcNk zi_((Kf~IVGFpEHMB~8ovWIl(G!|BA3i9kgJ>f%~g&)3#RLcXQEROi)L1=Tq zU%PSR#{9Bc1|!G!Yq3+y@7MZ_RjPZt__ z7WDM=L?@n7c>rR-?a3#f1cp^Qi`hhg2;>$4M_eoI#~WRfCQaJ0V@IjTGD>5C6%Ye% zxg9_ZoCpwsPzX5XTGV*-=utcyidSk|TU(=$P~po0AD{%RfLN%Wq7e}w0(nNjHP;Fj zAAIn^gb5RtFJF$oiwn=1wKfo#y!qyvz-R5+wRs*ojGYJ&ff^8qhiehQz`($Y6)Wz! z=N|BilMgV~N@*Fi2M+k}4=@2Tz^8_8qA3v|0y#$@Hm((1u!h51P*}q)S+eB#@#7if zzhpu}+kpUZc>C?Q`5Rcy=M2Lq0`(veGuKK;SFc|E@WT%ud+f34)2HJP=g!W~WEd{> zTF_E#r%anR4X=W&Tel84)YC^SLj;IG{t-xoYZazr$Bw=F>Z|xp?fm)k@zw9{?(Wp- zFpdDwF0}5&7hgn6(O$G#5uiW>h(I|JNS12_<7?Nh?cBK&zrthZa?YGNSn?L*p#`)8 ztM-P52DA&ULmSc3at#y-`#%0TvO_?%f;>3yb=FMBZdNnlo z@=6@bP3JxlC!$5nh#c{w6==)Bg9p(rZ6gIDKm>>Y5J;74%^v9Q@87?FKYluT`st^~ zj~|bn-Pd1#ecQHeS$l>7@gOS1h6oWSqD9Pz9PyjYp-cpb01+?|$PCw-L4EVhH~7ZF z`t|Eydg-Ny9(w5h`|qDIV+LfLa|R`d4TtbtzI@sFI@NRt|EL9Zp~jUfSE6>rfJh#E z@ImYkK#2$urx`Y7B0vO)KqUk+$+cFnpuIC^&g|X07rUYOBYp1Nx%gQhYf8`_mX(Va zFUC8r_;$-jAAN*hq_%J0-q_fPLugN&IDrk+j*gD5uCBhmKJX~+kfDJdxv+sH>`@A3 z;Q^1Q!5e(SGyG#u0Cm0g+H0s6wIc>ZV#UTJ5g-CYAPfR|;Mz*Si&BqP*w;V z-r$puz*fSXdLlps>O&yUTw7m@S&9e{0V0q*0>g%_S+gejYFT5k5x}6rMop9p9`Kk4 PFCvhA1VYZ`VZ;7^fdDse literal 0 HcmV?d00001