From ee6079d7678b7ea645dd75f9d5cd4bb769828ebe Mon Sep 17 00:00:00 2001 From: thegm445 Date: Mon, 9 Oct 2023 21:14:10 -0300 Subject: [PATCH 01/11] docs(installation): add instructions on README --- docs/source/index.rst | 1 + docs/source/instalation/guia/guia01.rst | 29 +++++++++++++++++++++++++ docs/source/instalation/intro.rst | 20 +++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 docs/source/instalation/guia/guia01.rst create mode 100644 docs/source/instalation/intro.rst diff --git a/docs/source/index.rst b/docs/source/index.rst index 2063601..2df465e 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -48,3 +48,4 @@ Explorar reunioes/intro scrum/intro + instalation/intro diff --git a/docs/source/instalation/guia/guia01.rst b/docs/source/instalation/guia/guia01.rst new file mode 100644 index 0000000..ec4aad9 --- /dev/null +++ b/docs/source/instalation/guia/guia01.rst @@ -0,0 +1,29 @@ +Guia01 +====== + +:bdg-info:`HowTo` + +Resumo +------ + +Para a instalação e a operação corretas, deve se ter instalado na máquina: +- Python versão 3.11.5 +- Poetry versão 1.6.1 + +Após verificar quanto aos requisitos acima, rode estes comandos: + +- ``poetry install`` +- Se necessárias dependências de documentação, ``poetry install --with docs`` +- Para instalar Git Hooks: + .. code-block:: bash + + poetry run pre-commit install \ + --hook-type commit-msg \ + --hook-type pre-commit \ + --hook-type pre-push +- Gerar o arquivo config ``poetry run ./bin/create-env`` +- Para finalizar a instalação e conseguir visualizar a página: + + - ``docker compose build && docker compose up -d`` + - ``docker compose run django python manage.py migrate`` + - ``docker compose run django python manage.py createsuperuser`` diff --git a/docs/source/instalation/intro.rst b/docs/source/instalation/intro.rst new file mode 100644 index 0000000..fcec217 --- /dev/null +++ b/docs/source/instalation/intro.rst @@ -0,0 +1,20 @@ +Instalação do projeto +===================== + +.. rst-class:: lead + + Aqui você encontrará instruções e informações necessárias para a instalação + e execução do projeto. + +Sumário +------- + +- Guia de instalação no Linux (ambiente recomendado): Guia 01 + +Guias +----- + +.. toctree:: + :titlesonly: + + guia/guia01 From 42b75d3526915a992e969818d9d872a213d2b0f3 Mon Sep 17 00:00:00 2001 From: thegm445 Date: Mon, 9 Oct 2023 21:16:36 -0300 Subject: [PATCH 02/11] docs(installation): add instructions on README --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index a11421d..e0d2249 100644 --- a/README.md +++ b/README.md @@ -1 +1,27 @@ # 2023-2-Squad06 + +# Guia de instalação + +## Resumo + +Para a instalação e a operação corretas, deve se ter instalado na máquina: +- Python versão 3.11.5 +- Poetry versão 1.6.1 + +Após verificar quanto aos requisitos acima, rode estes comandos: + +- `poetry install` +- Se necessárias dependências de documentação, `poetry install --with docs` +- Para instalar Git Hooks: + ```bash + poetry run pre-commit install \ + --hook-type commit-msg \ + --hook-type pre-commit \ + --hook-type pre-push + ``` +- Gerar o arquivo config `poetry run ./bin/create-env` +- Para finalizar a instalação e conseguir visualizar a página: + + - `docker compose build && docker compose up -d` + - `docker compose run django python manage.py migrate` + - `docker compose run django python manage.py createsuperuser` From 25b5a06ca998dc6b23f588209c66bc9cebb255ed Mon Sep 17 00:00:00 2001 From: kyomi Date: Tue, 10 Oct 2023 15:10:56 -0300 Subject: [PATCH 03/11] docs(installation): fix documentation structure --- docs/source/conf.py | 5 ++- docs/source/index.rst | 2 +- docs/source/instalation/guia/guia01.rst | 29 -------------- docs/source/instalation/intro.rst | 20 ---------- docs/source/installation.rst | 50 +++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 51 deletions(-) delete mode 100644 docs/source/instalation/guia/guia01.rst delete mode 100644 docs/source/instalation/intro.rst create mode 100644 docs/source/installation.rst diff --git a/docs/source/conf.py b/docs/source/conf.py index 0fa1244..d4cd0df 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -16,7 +16,10 @@ # General configuration # ########################### -extensions = ["sphinx_design"] +extensions = [ + "sphinx_design", + "sphinxawesome_theme.highlighting", +] templates_path = ["_templates"] exclude_patterns: List[str] = [] diff --git a/docs/source/index.rst b/docs/source/index.rst index 2df465e..0d84773 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -46,6 +46,6 @@ Explorar .. toctree:: :titlesonly: + installation reunioes/intro scrum/intro - instalation/intro diff --git a/docs/source/instalation/guia/guia01.rst b/docs/source/instalation/guia/guia01.rst deleted file mode 100644 index ec4aad9..0000000 --- a/docs/source/instalation/guia/guia01.rst +++ /dev/null @@ -1,29 +0,0 @@ -Guia01 -====== - -:bdg-info:`HowTo` - -Resumo ------- - -Para a instalação e a operação corretas, deve se ter instalado na máquina: -- Python versão 3.11.5 -- Poetry versão 1.6.1 - -Após verificar quanto aos requisitos acima, rode estes comandos: - -- ``poetry install`` -- Se necessárias dependências de documentação, ``poetry install --with docs`` -- Para instalar Git Hooks: - .. code-block:: bash - - poetry run pre-commit install \ - --hook-type commit-msg \ - --hook-type pre-commit \ - --hook-type pre-push -- Gerar o arquivo config ``poetry run ./bin/create-env`` -- Para finalizar a instalação e conseguir visualizar a página: - - - ``docker compose build && docker compose up -d`` - - ``docker compose run django python manage.py migrate`` - - ``docker compose run django python manage.py createsuperuser`` diff --git a/docs/source/instalation/intro.rst b/docs/source/instalation/intro.rst deleted file mode 100644 index fcec217..0000000 --- a/docs/source/instalation/intro.rst +++ /dev/null @@ -1,20 +0,0 @@ -Instalação do projeto -===================== - -.. rst-class:: lead - - Aqui você encontrará instruções e informações necessárias para a instalação - e execução do projeto. - -Sumário -------- - -- Guia de instalação no Linux (ambiente recomendado): Guia 01 - -Guias ------ - -.. toctree:: - :titlesonly: - - guia/guia01 diff --git a/docs/source/installation.rst b/docs/source/installation.rst new file mode 100644 index 0000000..76b94f0 --- /dev/null +++ b/docs/source/installation.rst @@ -0,0 +1,50 @@ +Guia de instalação +================== + +.. rst-class:: lead + + Aqui você encontrará instruções e informações necessárias para a instalação + e execução do projeto. + +Ambiente +-------- + +Recomendamos o uso de **distribuições baseadas em Debian** como ambiente de +desenvolvimento do projeto. Apesar desse projeto provalemente funcionar em +ambientes Windows, não damos suporte a esse tipo de instalação. Os comandos +abaixo presume que você está usando um ambiente Ubuntu. Caso esteja usando +outra distribuição, adapte os comandos de acordo. + +Para rodar o projeto, você precisará instalar Python 3.11.5 e o gerenciador de +pacotes `Poetry `_. Se atente em instalar as +versões corretas do Python e do Poetry, pois não há garantias de que o projeto +funcionará em versões diferentes. + +Docker +~~~~~~ + +O projeto usa Docker para facilitar a instalação e execução do projeto. Nós +**recomendamos fortemente** que você use Docker para rodar o projeto, pois +isso facilitará a instalação e execução do projeto. Para instalar o Docker, +siga as instruções do +`site oficial `_. + +Instalação +---------- + +Assumindo que você tenha instalado o Python, o Poetry e o Docker, você pode +instalar o projeto com os seguintes comandos: + +.. code-block:: bash + + git clone https://github.com/unb-mds/2023-2-Squad06.git + + +.. code-block:: python + :emphasize-lines: 2 + :linenos: + :caption: Code block caption. + + print("Don't highlight this") + print("But this!") + print("And this is unimportant again") From 9838941a6be4137a2d7e5ce48e23851ce812200a Mon Sep 17 00:00:00 2001 From: kyomi Date: Tue, 10 Oct 2023 15:36:54 -0300 Subject: [PATCH 04/11] docs(installation): finish installation guide --- docs/source/installation.rst | 97 ++++++++++++++++++++++++++++++------ 1 file changed, 83 insertions(+), 14 deletions(-) diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 76b94f0..4b98b87 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -20,14 +20,15 @@ pacotes `Poetry `_. Se atente em instalar as versões corretas do Python e do Poetry, pois não há garantias de que o projeto funcionará em versões diferentes. -Docker -~~~~~~ +Docker e Docker Compose +~~~~~~~~~~~~~~~~~~~~~~~ -O projeto usa Docker para facilitar a instalação e execução do projeto. Nós -**recomendamos fortemente** que você use Docker para rodar o projeto, pois -isso facilitará a instalação e execução do projeto. Para instalar o Docker, -siga as instruções do -`site oficial `_. +O projeto usa Docker e Docker Compose para facilitar a instalação e execução do +projeto. Nós **recomendamos fortemente** que você use Docker para rodar o +projeto, pois isso facilitará a instalação e execução do projeto. Para instalar +o Docker, siga as instruções do +`Docker `_ e do +`Docker Compose `_. Instalação ---------- @@ -35,16 +36,84 @@ Instalação Assumindo que você tenha instalado o Python, o Poetry e o Docker, você pode instalar o projeto com os seguintes comandos: + .. code-block:: bash + # Clonando o repositório do projeto: git clone https://github.com/unb-mds/2023-2-Squad06.git + # Entrando na pasta do projeto: + cd 2023-2-Squad06 + +Tendo feito isso, instale as dependências do projeto com o Poetry: + +.. code-block:: bash + + poetry install + # Caso você precise das dependências de documentação, use: + poetry install --with docs + +Crie o arquivo de ambiente usando o script do próprio projeto: + +.. code-block:: bash + + poetry run ./bin/create_env + +Por fim, rode o projeto com o Docker: + +.. code-block:: bash + + docker compose build + docker compose up -d + +O site estará disponível em ``http://localhost:8000``. Entretanto, é necessário +rodar as migrações do banco de dados para que o site funcione corretamente. +Você pode fazer isso com o seguinte comando: + +.. code-block:: bash + # Isso criará um container temporário que executará as migrações. + docker compose run --rm web python manage.py migrate -.. code-block:: python - :emphasize-lines: 2 - :linenos: - :caption: Code block caption. - print("Don't highlight this") - print("But this!") - print("And this is unimportant again") +Desenvolvimento Local +--------------------- + +Git Hooks +~~~~~~~~~ + +Para desenvolver o projeto, recomendamos usar as ferramentas de desenvolvimento +do projeto. A primeira ferramenta são os Git hooks, que são scripts que são +executados automaticamente quando você executa certos comandos do Git. Para +instalar os Git hooks, use o seguinte comando: + +.. code-block:: bash + + poetry run pre-commit install \ + --hook-type pre-commit \ + --hook-type pre-push \ + --hook-type commit-msg + + +É importante instalar os Git hooks para que seu código seja formatado +da maneira correta e para que os testes sejam executados antes de cada +commit. Caso você não queira instalar os Git hooks, você pode pular essa +etapa, mas é importante que você execute os testes e formate seu código +manualmente antes de cada commit, caso contrário seu commit será rejeitado +pelo CI (GitHub Actions). + +Django +~~~~~~ + +Quando você rodar o projeto, você talvez precisará criar um superusuário para +acessar o painel de administração do Django. Para criar um superusuário, use o +seguinte comando: + +.. code-block:: bash + + docker compose run --rm web python manage.py createsuperuser + +E para criar migrações do banco de dados, use o seguinte comando: + +.. code-block:: bash + + docker compose run --rm web python manage.py makemigrations From fadb0215a7a7efafad0e372fa0af3b5adcc2d0c3 Mon Sep 17 00:00:00 2001 From: kyomi Date: Tue, 10 Oct 2023 15:38:44 -0300 Subject: [PATCH 05/11] docs(installation): capitalize installation guide title --- docs/source/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 4b98b87..f5a4cc9 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -1,4 +1,4 @@ -Guia de instalação +Guia de Instalação ================== .. rst-class:: lead From 193dfb122d97770d7ec8fd917aaa00c81f09bff4 Mon Sep 17 00:00:00 2001 From: kyomi Date: Tue, 10 Oct 2023 21:20:31 -0300 Subject: [PATCH 06/11] docs(installation): add some notes and fix wrong words --- docs/source/installation.rst | 69 +++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/docs/source/installation.rst b/docs/source/installation.rst index f5a4cc9..64d21a2 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -10,7 +10,7 @@ Ambiente -------- Recomendamos o uso de **distribuições baseadas em Debian** como ambiente de -desenvolvimento do projeto. Apesar desse projeto provalemente funcionar em +desenvolvimento do projeto. Apesar desse projeto provavelmente funcionar em ambientes Windows, não damos suporte a esse tipo de instalação. Os comandos abaixo presume que você está usando um ambiente Ubuntu. Caso esteja usando outra distribuição, adapte os comandos de acordo. @@ -20,6 +20,13 @@ pacotes `Poetry `_. Se atente em instalar as versões corretas do Python e do Poetry, pois não há garantias de que o projeto funcionará em versões diferentes. +.. note:: + + Apesar de não ser obrigatório instalar o Python e o Poetry (já que o projeto + usa Docker), recomendamos que você instale-os de qualquer maneira, pois isso + facilitará a instalação de outras ferramentas de desenvolvimento que serão + mencionados no decorrer do guia. + Docker e Docker Compose ~~~~~~~~~~~~~~~~~~~~~~~ @@ -58,22 +65,74 @@ Crie o arquivo de ambiente usando o script do próprio projeto: poetry run ./bin/create_env +.. warning:: + + O comando acima não funciona em ambientes Windows. Se você estiver usando + Windows, crie o arquivo de ambiente manualmente usando o arquivo + ``config/.env.example`` como base. + Por fim, rode o projeto com o Docker: .. code-block:: bash - docker compose build - docker compose up -d + docker compose up + +.. warning:: + + Caso você esteja enfrentando o seguinte erro: + + .. code-block:: bash -O site estará disponível em ``http://localhost:8000``. Entretanto, é necessário + docker env: bash\r: No such file or directory + + Isso significa que você está usando um ambiente Windows. Para resolver esse + problema, olhe este `link `_. + +O site estará disponível em ``http://localhost:8000``, no entanto, é necessário rodar as migrações do banco de dados para que o site funcione corretamente. -Você pode fazer isso com o seguinte comando: +Feche o servidor do Django pressionando :kbd:`Ctrl+C` e reabra o servidor +no modo de execução em segundo plano com o seguinte comando: + +.. code-block:: bash + + docker compose up -d + +Desta vez, o servidor do Django estará rodando em segundo plano. Para rodar as +migrações do banco de dados, você precisará criar um container temporário que +executará as migrações. Faça isso com o seguinte comando: .. code-block:: bash # Isso criará um container temporário que executará as migrações. docker compose run --rm web python manage.py migrate +.. note:: + + Você precisará executar esse comando toda vez que você atualizar o projeto + e houverem novas migrações. + + +Para fechar o servidor do Django, use o seguinte comando: + +.. code-block:: bash + + docker compose down + # Caso você queira remover os volumes do Docker, use: + docker compose down -v + # Isto removerá os volumes do Docker, o que significa que os dados do banco + # de dados serão perdidos. + +Para executar os testes do projeto, use o seguinte comando: + +.. code-block:: bash + + docker compose run --rm django python manage.py test + +Se você precisar olhar os logs do servidor do Django, use o seguinte comando: + +.. code-block:: bash + + docker compose logs Desenvolvimento Local --------------------- From 03352a42e24b9c4ad0387e36de7a2d0419ed5b62 Mon Sep 17 00:00:00 2001 From: kyomi Date: Tue, 10 Oct 2023 23:08:06 -0300 Subject: [PATCH 07/11] docs(installation): improve documentation cards and add images --- docs/_static/initial_screen.png | Bin 0 -> 68996 bytes docs/source/conf.py | 2 - docs/source/installation.rst | 116 +++++++++++++++++++++++--------- 3 files changed, 84 insertions(+), 34 deletions(-) create mode 100644 docs/_static/initial_screen.png diff --git a/docs/_static/initial_screen.png b/docs/_static/initial_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..9361bcc1be79b362ba492afe858473a2f9c8b718 GIT binary patch literal 68996 zcmeEuhg(zG);Cks83a)g5u~VqNLPACMY{CfRcZ)G?K~_1xJ{mmFeW-x~k;@hg+mxa(?-THLM9^KpjnBQ4JTE`09y z6w#5ynMRU0aR$d-*SF>r=yGvtI_=XSmCPP6(2UQdW<3;uC~n$1^fj$R=QMj$#8`pJ z{P5u|pdC=OBd?;pIl49dg`GxEMouCvX3DjHdZ0l2;A}x|IK$5CaCD#shRa@?Q% z>7ix-6|0;PdG*}0qkaGTC!ud!BU`sCk%4E?>hI5wzH3%){9Z4h>a#@0c#L!kiUf zjD5~q{c(JVk8?>~*}5G!^N%xyPE%by__XVr?-IwFJaNQp!sb3F874*^=gbpFM@`tn z&*CQ8Ka+SDlA^M8qqctT&gCALSw7*|D0EMPVmGRbAAYnsb)51iUKYmF?UxxXd0e>Y zc==Re#xuW6dY`vF&VRa(4>g_h!N)s$($s@e&VbI{`v>uYiN|U#O(fl+{B$UMe0$oh z)Qj#ExD?+Q+IvJK>@r*O5k?*R>%>o|@FUCB-w&*aKvM1RbY2N`5+P{ zFtnYyBr}^+JCd4o z@eDEjK+t8NxSXAJmL|pz>-taf*6X`BzH5%wSA%8EjESvaaN`_ovZ2Zoh(N zREFzmZ_r5&T_Udz+dh3@fP=K(8ZP=_!GB$4Q(OuPN6jj*u(0qUljIZMyeW8Wi*md3 z_;J1tNRmM<{kC=FxnLvvN+Oz%Uzja>Lm~8nn=i7miko93n05w_>Rh&-8KzwvpJ}l< zA?VMX!mB^LqKeel?SY0Eyf4;J?_%4mPO-e3d-nE$tjoM51?v#638SZ{m-PBR^jvvv zf%UNHp{jloZ}`@_q;22<_e#C`4^u3SYYPtne;HyPt5H2wR8j(_LOHD(AGa1qe9zmb zrC%nb7ncRwL-H~+Ipm-P3TsH~>b7n5-^}cG;B6c92e=oP9WO;Tcwpgq9s0U{T5-<` zG?`s1xatPa1>6Q%tC)ePhQk7oF7K!dPa49Bw$sn}1f0h2t*o7#oE(g|x0T$!hhXSP;6->~ z)l0HMqMgH}CElA#oq+-h;+obHB?-Cij|sBhylSL9ekX@{#VZ?}Y1DGZc^J9$MHmaO z92_(qh((X?qnQ_M4|Y_AF5NDGrLq0_XIE%padEj*??rY9O}0OiRuh?{C_G$*LFLar zdU-c*N%rg?XCr=4KSK|=!gudXhYs3GMdlP~mhLSToOB&Xts8BJv zjY{Wp0fq;8adeSOp`i4TZ_O@J&RfllHntt~FYh8rPoqo#_P4YsPOsxb&)c5=J71r0 zzh)|FE7I2EAreAGVY`b=0xgZo7JNUeA)W%9CBtFy7dc*hGB%+;R3 z3vE(Ye(M{nkq8x70?(yyJ`S!PSozH>=#Q6o^t(wT6OxI8p_*x?+5yTvYbEn=wm<#m`XWWF<*D%J{xPkR%NnpL|jQf5RapD=B&=cdC(vqemDuLfm+aI z`$cfR0ClE`iST>}FecULidb#qK`^~EXReo3D4U)|8CE5Qe8Bs1GA@Zh2X?`2q{r4A zTQ}dmWad4Xj}SlIE~28Sn>Su!Y9nOFU-uw*3gcE1_-493|0T+0C$ow4h6v_Ys7PI1 zji7fTCwmliPc>R|9ZDCiz7>%WGxu3-+R;Aglxe3S&-t90hQO#I##`e zbDxdhuMd8{Wo!$MyPaLBODg@k6a}uVXu>YQYdon8MGG`#BYky!bEP(0`x_oJQc~Fn z`*-LdmcRowwK$!}$%tTW1emy`C&;y%^ep-A7gN83oHrWtCz2>0j4-QpEi>t#WLZ;Uq69}_w-t888^@!$4(_O~M}tyN^3 zW}R*f%?YyX?CK_y#2|HZ`GXSXDk7vw{DpxP0xf%D`}N30z0&n9ugyDxMBg`rK~t7+ zPt(c8zy<5|+zWzApD9fGkT$$s++_uIOUpD^VZlibHsA0;u4$>QkIa5shQB#l3Q(M9 z!jAR`(7|wT{S4_U|EZcTZJ4yjOywt?YuufmySsWy#{>kr(S+ljO4|?r9kX|*7 z+S$*=B&Da9OXw*`$=fwXw6@uv`*Uz-ZA?cAsX>EU(1`TrjRZ=0U0}5xd+>JJ%5W=+ z7qkxJqxex=hC{ifzH0if4&8xCs>qmQ8%eTTtW1BGhbznVpy}(BF!W;oSY(b6YGGVK z60EM)=?z#n+h3OQ__K2}i*@<5>e_dW)YR0Zvi*BreFKE#ia&8gZSTa1o_^cHc$Ku` zmi_%D@>ad1)=2%b#DzahBsGb+_8g?&3a{4DTBJQEu4%2zRAqER<;)K#+ryLogd~(# z4X{R$cAS01&fIMgD@jbko#(t-*ap(jvnd-4`5Qlzv9mhw-1c(pVE)b#D#%h;;Xt@e z7~$X+d7g{?7>w^Cml0!J8lQ$yhhy#nb{F~U0Vx)`97gZU4CEZzgTj_*=>! zSVg@hxO*D2a2(`{*M?wdUg(OErx0Vy-iO|)7s)MpWg_}8&oN_!vhwJ1iQp2%djDml zMiHl&!Mjhddv&k6?0rrJ#yw*rw+-zPPWD8DNL(Z9< zcz$QvYwlk7uHhKd#r-uT*l%4ek;&S98mU{*2}Rd4;mmteL~ID6ZA<(<92$d4hxuGV zOVv?ZRz}9gQgd&Z#^AQtr750xrE`q8RrbGzuV7?G_9Djd_DdT=@bX4^>v~tX42>F% z3|O8`=LVz%89W=8PTpfh(wLaHws2hWXFc2(?>}(1^CP~ASIQsA;`wDMu;l*Ocv5)RGJOOmbu$!VF3^Rn#;@-)OwfzN{1EN+Xu%%mEE4eQH$kE znY>xvA%&pD@ha?Ag%EsnMGDM>gm!i&%xj9r9SpKRL6B83vH*Mv2q|fz?sE_qub!@Brl{aK*DXGcZM6H~;t!+Xekq*|B}T-Jye>l|6{EG2gz8rM7l- zcF624TkpND-!Zz)R$0;YFAQQ0E%gsPit;+6Lwh*VU6C5K2I%rV(~!$)xi-`7{! zT)mS+RwdL6>u}!>F45j?u06+}Q&>i72_8cH;P<-Pn8B@B!Xxetasda^dP+$rRRlfd zxd>X5*)*}S3BL%xt`zEr**pv@*4_X?zqy4zQ$GIOf8cZ77K#A(ewiZ##=xtTGbxYjRky#nLna4(IJ#YP&kWHge{S?` z=&@pq*E@lYH(e>`2hTXX6$Gn{NF^gdMp>!OCpVI52atsc1^w)23qFb<@zp2uFUD5q zo(}uJ5_KwhnErfr6QId!GWb`Q~j~w^`3*WFw!Y7b6`T5xxHMbu5Yikn?)m71y8Jqrzo!&`B zwc6*fWVpfRdwRc1tX0<0ezn^>ZFkCgN%5gMzy>Ego|#d^AoMsD-1bk*Bo~M6&OGY$je=%ig0ScaC7KdtGyVFnrua^CdlKm_mM)1oM)mC z0Yv%!LEBOQ;gxyj%xLTC#zn{qGwPz|uckr5*iyIK=K^vv-CS$-?8zG-V| zC0+=Q&k36~JlL=8B~(ERziNu}>O{^<8k};~(mtU1o8KJe=BMLylQV&)v2$8e1A6=H ztxBYhc69MjH02wPB}?M&I<|^GdV0$h6MBumGILM^wGuDP(2e@W;*{!P_WrNv9od9w z{o0Wt1FhdoGhbBtv5;HFr4~f23i_(W$~M~G@)436z6Ne^tShkWG?klmrEa0>dTh|1 za9DF-Td26j4bqBBl5K}%PQ8>7DJ-;<`fKab`5`0X}`a@DCSkg7PMNEzBMT{ ze0J-t@8EDnb*tf=67T~ljII3wcQXOrtj+v*x3y3+Y5`o`W+a0P37x_`uuM_j`>F(3 z`l}(dszzK9hF=$ol1Wjm@|}%?m>fog7tCd$0zgaMC4w9Qfdhw_ItZq$BzE_X)UW^9 zf8dK|M0G1I5>D%9>FMc7y3nntv@!Hs$oIB(SHKGa5Cuc);Wv%R*3dzwHVnjmuW$MU6xkB5WLkKAcYH+Y;ME(dv~&I0e__=OUeiU9j^w`ip#XB4>Y>CeCrD}>8LNR zJ|~kin^nG=eryPsme2AZxHQqgnbixLG?6HQoDYwWV&F3I+|g%W(9P-pjEU5_9U1^x zpl3Z5?&0XNUG5#8+YyBMVvd>4$$D4Y#%?dAnA!I$DtY~&VpwDQ!)1qYPvTnvFzzuX zlL)rQnO;W#$GPIgD>UAoS>i%Aaz(3XQS5bSLssyMySi3Qi{hy`bE$os*NEU~@$q(! z9e2xRL2xh(EEqbhyY_wamzIj0#73_ou;}RG>h6v_Ls4<@$^h1Ltbj@7Y?d#F2BfWv zQyBs{KCS=fCJnQg+gkGhp!u|qFL}BrntRwwJ(K(4_wNPq=F~rPN^*kDf`eH&OGEwQ z4;{FKdq?V-O4Jnu08IWTvnTESH$1ly{v~TBcR1G{ze_H*tebuSJoHbd7`JH(S*1zu z?>k1k??b|SikJo>L6#(nPyT5fHE79tjs07av7o z&JC~c;5;kON2FY9F81xp7Hh{r4Dj)6GBYd@DZJPQf3ko38{@Ly)(tfnWk2_Ts|yS7 z6?A5j=v8!#>>}FM!oR*>`Xbr?{7jIHS@GPB$@lelWE(~rTjtW~1LWH&2bw z2tHPdOLnrfLVDRHcl9j9ARaB>wGCM26W5hM(xwHBEB5EM7O|wIwf3nJ)S*uf06J~w zTF0v@{@4gu8x?T26>Hyci^HUdR4?702EsCL@j;4Q;TzvVS4N8J3N?54kOa>mlyPzA zl(}`3k&Cl)ak`A>Mb36*P;J0k`JO5p#wPH9sqzQ+{JEAdILr@*4LX96%|R@;hMaSx0*48 zxZrUOlD;8E)HZ+a2)!xO9IdKWUf~T0s}lt%@U;0MRemwttlHArBhd8+Nsr2D4c%GE z&#^6^)0frKSKO-y5R9qA+s5Ec=a7XWywsy0Vyz{NS~39~B()d^{EBkS@P*CW;PJ}1 zU?njzF^ZyyNb3<7Ez*SBaiksxCr8IoYtHVEKD=dD6>jT@$CwKh`PDrGaq?>EX-BR) zclAu6{z44kyfeY8SlO~Qu)u@?-sSqUtYOu>#pm<8lb`jvQyiRn)}6Z>#1|~m=!?77 z^r#LFC635W=l9W8j~N7t+%ulFrK7eYGwOZfjOkOxkfK76*P}ib{f#@#gQCQn>d;0| z)gW&0mN8#P5{Ck9w!`4z!$du~Id_bT@>uh?op$u+xg=Em zkka}*8dfOnVMTc6jR&p19R^S!xIU&1h-1-m2A5V19qQ%v=qzDCV3RZ4&cfnCVEEbx zH6MnYY!PBIjE~Ns|kD=V|SlS)7M)j@)VL8TZND8mi9*yw?_5Lg90kNyw zT#haaRutYJWfGh94hYgpJ$TtYsO6DY8_@{1uXvbvTga^o{c+6F2G*A^g_wEF5_VaF zj#xO);kDgkmE&=-^UR|tczV%ojg@`1LOZ&o(%EkUe>by{BipxpQJ-!gTS>C@(@Q zJmvSli`bQJ4_uon0HQ0iBNi<=z3=HC;EP!E*~B_-O0Kokge+CZcPe#pm;Q0JB*=Ic zuCJq0VY@Yu6w2lk@i-j>wFL}>lOUE)B1?GADGK7Fc`rbpbvnoIUH_rg92ZY`c7N2qLUi^3DR_&tt}B z!MoQZ@E+z;WL~=xO*76VOqR@PzAJZ$!EK@3G+jD8l18QQDv@^}OK=ovjKX+%WwXdc z=n@0+8Fm^OFg6#jIQrG!B;YI6Yf^yc5xh}YXJW#CxAli)Tdtus!VNLNE~TDla6>+D z8|Q81xov~_dAGr*?siiBxi zN{1tH-v(wf{_R)H#%P?UWYFtwK_F4E5r3#Lc3RIupvc-WIYNvlK}^Er29Lp&6Z9sd zq?AZ8Ny`(bryM$XP+GlKfvRVmw_}5+w@9!Np$~NdXxhktB|-tU{N#(vscmgtDKaY{Nt}R>FrlA2vG$E zohoZnzsYQ6hhq31kxU=eVLHHZYt|8nV-(pDl!unQ=Mcf07yA#~8URqkr{$oYQxUw$ zx-^D4zqvDy^e5P=oS)r7>&0010>{ya`g z9Vco7B1BPIIwyei3_k8bjUozvJ^v%p>7!?rs8&N`a37(l)zgm~Oif0tKDM+j)`r>= zx$HOROvV>uC&wn9WNO>CgBxecr{z8MVq+Q@u%wktqT@EqjqS-9$8Bivv~fd+)ETE8 zbB|DwsM`40@CHapAy59?sEF}`?M|48eitM2lzwaT{9P6-+KhL=$#_-$vFj5?`>YL|@2k`EZ=VVcGb@%?~8U2i+6$B)E8_Er5_ z9(|&(va6F`YYXte-pgTSVI5nsLl+Mk+_(U9QrmbLi1SC$cE}taQ}ty%liv8aVM~`x zy9(dLOb#s{jx_OWprw278uU{$qv7RFRT`Sk<#&mlP2)wL5!MTQGU97DeM+@5*vFe+ ziX%tEhUbj0)J1{Im#6Fjhpq^4)p<{3a2Z#G9$qm+u2#+rN4=R8UrRA?tN87D&m+&9 zibh3WeRMyt**e%Y?uSkj>K;X<3rQFEYIVPA=5-o0hp)FScJ*p`7P=}@CZgfC*0!>=Fid)1-DEIN`2e& z_355u3Yr+G-c<}*A)DKqIXgSwU15SoM8eGhgs{_G2BXcFJFmtP zWi7t4M~+N(stn#Y{r=>MuTw*H7IpjmqqN|dM_eH4q`)X|1l>*)y&o-YBeIn(Jc+SM zVf!T7n(w|lCD6>$`S%!G2P|uQRrpPp2YrMx1()W|r{g7^O2)9e9p{S+x!+;8joQo7>H$vrNp_d&)*BG^n-b>j1-)!fwwt&hWMM zpsl42CL~;EWOuV`xd?w~dHAXG7HGp7F4_xH&Y1}(#Jw052XEs;mJ+-29ng~gSP>b} z`m<)MHd%9_RIzd9c;(92*v~n81~-xt`$Lo1sA{%pDJ zAr@RcK98~Y?^oLXXpCsXaYEWO05|Uyw63mhYm_-2G}fq7ALb3eIFM10!9Q~YEy;2w z$|3WGBaqGJ==M85Wg+K}=EXGCV;JepR-XJTOV*7%2^YK=nCgTz_ceDxw_}eO^3po< z(xx9|uwwq>ir4Dz)2h8C8;YU*E&-@(i)7?%xBV=8Dnj;_bK~OeuG1B1ebwSlC#I&; zpJ$1_veanWTTgu8#UOxH_KrKyJ#}N$?OvZ!?TE=2e99LvuYk!l+%_A$?6xyg@|mF9 z;(g@=C0!HACAo>2V(<8d0Lb!6`s2`y@~tI}+0;?W1)`jb<(8r3DzPc_jCn?*`*4Yb zatsuWMoX=CsvzO1NlEv*@Nt|~rZ~~z`uG_P)p%xn<5P3U($i2U-g1B1FW2w4Sc1pR z_BkgII;=|TU+kHUdR4N+^+>wm?L94nn2+R$*8LoFgj4T$r0@?J{oB7$54b&nK!Bqt zDquN(usFQ%<>um2M;U49D64BJp*$SedvQ4)(lnEN>nJdNaek3&^dKT&Sq$M%kj7*_ zytJ{Gey!g=PJB`x|1cnH4+n{sq`giIU%D2Sb9KQ)Z4{jt*K;+E7JQN>XKs^jh!@8 zioU+yWW*q+f!L+p7XUmpZNJK=qsG7AsNJ=azMF!ZqZiaMvP9J-2TtNQc93>?daMGY zpqBjuT4Ae8SkY~>9IGrLg~Iwc&*ni7-}L=(&+=fMx;c}eScS70NMgt2H0h>4TBH%F z{KJeIUtRPf|OhhYC;va%QWy)E0=L+=-H^uhLv~_d}=7tLf zhWS*epu28+9WP!}dc&Dq0pA5448*yddd+Mpz4inEo9JqK{GgTC2lh`i%g?R)Ca0#d zW=Sxp0=dYQ>59}yMkPbQI3!^R{zU7#fGpAdWxiA4?Ow8#5`%12=JuhgMNUp|aGrr? z^J!MlZkdbQV&z2C_OpZwJ)48I3WuaUMv;=k^RZ+pD4ti2VYMY%RHO-dWDSAVATJkjeTn>#gI1^IEqHeV!dA)b@i-VUZ!*NLn_cV)AfWbVyfp3M>3)` zh|>wE?oizFFM1qeZZ@nfS6pPUd1vfoYwKnE>TL^PUV=nf_@fWsZ;<8#lWW#a1aA+d zF5`F<3Syr1pDe3)SX~=3gjU6VVop}sJ+afQY6tVgy9dj(3ZUD~q5P(K7x_yI31W`| z7nPrU!&R-SF`IhDq7>?g9_$kH+07IX5Y-Z0oM=mim|CKIZ62=9ilzz|7V;(F)J#X7R~+Wi800H| zjG+DLsEWf;LvQaIQOZP7`o^|nn)AG`NFXj4HIqSk8XX;N^Ki}J=KQ3!xxd-=2OTlO z%T&7*UIYkjm1j_@ePuFrF-BQ`OaIyrvSXk!?)fG6y=oM}evoF%&v@C2FUHhTOY3!Z z7=`U%(_YLZwACk~+$W{176>y=N8oe(sacSet~o=(c$JBfQU0@MAC}nBlD7UFZ(o*Y z7L;eUMw=VoFbUU{Dhq3{)s?RFxhQJKnT$F4+bMGmhdEgwM|~-LCaCLXAz-cfD=%R& zdch_4E5u1yB@GbH#*pe;OS$3sWqzrtJ6ldWhcIJ5PC8?*F~9nf+0lbqxV`gP&MKIH zzoe7UMwCcOp;Cd84ck!tEP*cV3bK+>v`o{p-id$bI@K6;<6}n+bX^u!E;ZN-e7bz$ z^9oBASbm2-c)Ra4RF$)|1 z&}X2cfD~jDjR9&#MCA3b8&AVxDgv~Wzf-Sr@t6qWplO00DuVK<;r+fjI`%WJ`kgr-=Q+w8jY;)rI%{C6)H5Sob~cAgb%E+=q#+?Yl9pDScF1V zp;?lSg&#SpF%>lq17lBU2V+QouvX&G=D3Ho6!{>23&1~7VFBvukw(HoKF*-BU!UHN z1IJ$us=VH6miQZ|xL;Gi+NA&I9rcbCAoDoCN}|j9x|ZQQVFqNaZzPO$Ns*>^)t?EL zr=>M&f~kpPDJ^n~8UET+SInDYlHubyFyv}%M2}qew8&Y#m)eg#C8StSeI}ov- z6(ML!e;dQv(XL~8+SBBHO*}?ElOSSKRR2k)%jQkPlKKSyzWE({Y!e=cEE>L%Iy89i z4T(pMH|{@93wRxkq6w~9b!=BGw+OMghg(e{sK7QFZZ7i+3@sS31U8S3AuI)%OgyRg z+LGh7pDIrDLo3Fb7iac*_BQx?xHm|GF5?!EcNV&=`zhZyuUaHzRGesTel5yVrsRdQ zmkb$|gI&vcB~N?t#zqC1U#r0#ag#kFrLY;-=b6C%15n}B1Cj{yGPv=1nF>!?ifY)# z`%oYp9mfj-qEGDNenD|yZYn`_82`=d?RQ@X$D`u7FN1-%zf8P4s0|oUY*KX(e1!YM zT=#p%z%Rbvo|EQRtbHoP+rtgU+olm#o@-gvnU)3fSUFUulmHO%lfa7?!6_Mz+y=%{ zQt2;oWy`D%^H}oBSOapF8M+}X*EuIkbTB(u{ETeJJEk!1*;uA$2!~=H=PVK2n%pf6 zTZ26t!OmdOe6Hxh!#>1fn{5vztX{kgV%qtXG)UXLThwD0kSb0Kd>!kRMxA|H-3S|H ziNE18AeM{_yb}i=k!~$>me5N~Yb;$k0GIL$9tG}8#(=6gH(IxM&t6!ik8@7JBKl<6 zME#u&kycy!d(ZM4su7{p#)zte2RInoH#~?r`0G zE4U&>guK_M@4vv3TH%Y=gYg2<+ch~JDSX9*8?MdPkJx9KBNJ4$`?SZ`t#fHp)XVXb zRfBu*GaV6L>q7QlyJ5USwgJxi6KxGfK{@vi?b7%Nb0?q7)nwGe zvc{~%h0}_xueo&oaUgv`q4mvbrSg&HU-b}8OHp*PcDh&vLlAts&v5SNMQQ{%S8G~) zdFS|hjN^rBz#6T0oZgmB&KkE2aP!rISpsER%aL#I%p>PXp>Lv5Htd`(Kz5@Hr({&o z8sG*NsLEO$y$HLor+j1jER}k$RJFQgt0gi!=x%awm$&03_2j*y#O^X*`_PC}FMGb? z51fgr0pQvV1%-;977wg=fBC^POqG50rf8Gqr%#_44Y^i6Cmv9NGQ?OenVH0UbnK<7 zFFRC{Vx!w{N?f!Nt8+D7)t%uWa<0GT5E7A3Ze10%yo{@?7Jn)q*yRBkaZ0r_^7z_Z zD`MT?2GmOT^bUIF_WUqD#{du`-H8<4 zw!V=780j?$Zq!dTY)}9qZ!WPpzDyTe0GAlWO) zprx1J`^y;>&}Oyqc5Nsxf0zL^OhLtbamrr1p*@2Bhvm}IxxV1gio9y+nDdn4;1Q-O zhjIqn=U89plT*(dbsiJ*`>;WzS(Op&Q(Sfq*&8%}obeO&58fP>M!bJA=0?1A!X^Xu zb>k_YLRH0T-(whqfXy{u+~c%QU_OO}p&xxWIyzX|)$YWrLL0x|e*R7s2m<#C+hr|j z|JXepJ0IGRm+=R0*P~^aGuGI7}4;3?X=lxtx?`Sr&H4z)e_sjA5 zUfD~7@~}lFF3JCGkbix>BCR3LsOrNZ|4)_ZJX$}mFJYCTJBjBUZg+SD{O2FBDuOB29Gy^W$|c1d5qQ7*pG9D4wiTokd|J9;C~<` z8FPh5bB_E&cjtmFUjG;pKN@oOR!@6+0B8&x)KG{ zU_bShP#L>nudA9E@H1sK_V&#s%}95wo}b9^^%#htZvyf1j&EN1KZ*2{FGqFeA&M!y z{57ABH@qzj!_SG1Rw)`#4}K)a@s_1&bDwYWN^sEk&aLzQ13A$H zd!(-Js{)my$2X1lR)-|7Rxv2OmXrVe!ttJO_cIhI(s9zibh0#i)_c6|lXN+~c~*3- zB2W}a@;zVD}Wyk`R*4VdF+KMoD9Uw`5+>r z4Cq5s@0*uJB=6CfQL6tm=KOjPuWIe;I}z2Bwm&ac1lzFirQv>uJ6MJbDGYw94T*>+>TSPTvr9OdnE6yi|NY9;E&I&&*QjN(8+v=IGM%6F9zBg90yEVJ&eFY|0#O(@(1F)q6=@ zIar_OWmleI^6{p(;}p4!fl7HvC9aA3pR7v4M_}vXK|MYk){(r|ewK`69*ux6Da*33 zWkAxoj`v-f`0%YbgX)nqdngQ(zaCDYHg8@g9LCR8QW#KNI>lcwi|>RV($1>%HIwA-e`Z(Yu2LMic_y-|348qv|vZK`Sx!7Bq3fW6~?zF{5bGAZa--U zSqaM&;4;+m4%N{zt!Cio#qNbEcPH#OIQ1snVg0GKi|~K6!zT4n)(?fmN1N3ou4^0# z>hZi(?A{CYSN>`LdKyIJpn#I*;~$?mPJF@-D2F{pt^D8rfyt5#Y{dfTtvz10f0{E; zHqu+`1azAN>Xhd`-m#a{rAUsh6dYb68D#lS%>munEce^iD(v#v>sivH6d@ zOjFKb=tx?Y(0%>u&%BcVKji@R7d$?tuRXQGfYbnnjKA||Mw~)RE@+C!H$0X8Cl+t) z-Is&%0K9NS|N0M{YH;7XZyW*WLd}0*WLi%m54P4x9_mO5`)5uFble0qya2Yr;h%Q* ze+T#9JNdtZ`!|XH-@*MqW<2@d!TtYY@jr|E|2aYTe-;-<+Uc$p=L785pSf*MfGb)5 zelGyJI6B^z_#g^P772WJ34cD$8plAUT~uC{41)m-K{I<3%X+ajex3J?l4(h5iyiW+-0fQJ7$O0ZRzc| zN%w=yV=jt8-DrK5byB|L?tCA+2<8U?(FY$fyyy?6@c zQ2Ke)8T6{yqN7}PLPGAJbGYa`>Mjkq5TZg3NzCROy!?!6((gPpn*k52T%g$=b5@T+2W*=O+3eNa;&W*E5vhF zLH=;xC%9p-{e2|kWyHgd&V;T+Qwo$5PU>$9r~VB}?s7Y^M*@x>4!{}Mh8zEW*};7B zV_VW#Y+Bs~hLig8c6I9hw*G1rmz>BX|K0Bo$x9PLtF!pdIQDYCG9zt~v~u4;C3ETy z5xq?WrBfGDCoV3X1TH#FwLMp+c?qhO{bxyZ8%a)BaSqjp-rD({y`&?Q_U94tyI68& zQehfeW!QSI3ryXX_S_W+FeVuK=kLEF4;r?S8g_ z!!2s^SJ2cvi<0%~ojH9K@aPgoscW>#*jn{ed;W))r(IAp!A?D{`xy>WZd-&9|9LQc zZm}<`gij}>{PDE>IsD(Ee&22aAq@dzamSDH{~k2K0djcINZBIdl9u<6*w=djQ!j5``SJM+|sOn z*rARInp0<#avbW77BaX}P9}`D-D6VrY6piAC;cf4srCg{e_L{`10_tH!8jrZ1iTYO zPOsAU=sbS6|4=L3Pu&o*OiAVo=>CLAN=Wb;`NF5uK9(-k4(=zl6EOA=phO8}g7gze z7PYnF(qO5o2)ca$lJ*JVS8PXmpyva8VZMwU=1r1x8*rnZb zW5nP9NMGz}i#o$O(jwMA0^HE52lR~xa3SKd%wwax4=h`MfyysC#u=M<-^L!?#Z9XJ$#l&xWVr}|KLHEJE z_Cs3KINUmQVYeBdU4is>yatEjSWbi-~Fwe@w(-MURo%MI?}bL{mN zdQwc|*vCw-^nAbpH{*&xz^yyixz4!B`rxBvsBjLhM4LsZ^wG=ca)Z2<6<}L{OY>cL z4tYOK`+obgKCSAEmxBUKp&x-9r^PZdz?CtM%?&XY;3~%rUDhwO|48({Dfy|6+3kxKorOdSIqfX;F5xs?8LU$$C)T#zJoij88|9ujoZI z!2ahUWRohZv3KKr19=@$2=@t}@Ye5_Jtk_^6arR<2C`7RTA!j>OdmbU2W}ybl|KB< z*2i09VK4{h+j>+CMP8BW%85eSaY(q#C<5hq%Y_asf=L+Q+`LGp7VBozf6q{}YW7JE zSe+_6x|%}DZWT0XO3=O_mY1)_Y*OXMA_W?;C=(EPSoJS$aHJ8Qpg(&%a&*^oU>i#R z6%ZY`35eOqg1H^D`1oEnbY%?PdK%1obQHOiLSM$VexH&+Zl_n&ao}2o%{!BcLVz@`I#ztgxKpV)HlR|&qEsA;gx?f^9zV5DOJk- zxxS8EE^b%}!eq%4D(mtm0}mn@)5XcZ>1J;{efIu=g|A?eST%MMmoHT9%Cg;-6DDsP zzZEL%xVp)f0~`;dbcw+1?BMM^cY6q61Ic~p-vHArtm965R!#mgr{8q3DZ3P$I z&}mRZa6>lAD9V(er70IZ^D-D;9S3Az<$(OYKE9Si|5ZHZ!wGw?L2{A#Nf2?e@>5lb zpgFwKE`-)x8bieF(@>pp5Dm04MHXArt)<1jyJhTV(4Nf;TIexFHit(gIN(AY`n1%V zhUNX165MQTx};`+${v40h$nO>v9Q~?xctyqKPq;t($E&LRNUk8xbVZ)nNUcyb6+OQ z_KYsO%t*fs!Wd9DN-?|o7h-&ukp!$8Ib90AzRJKYZ;{&Ix+b^y_5E{-d*}Vu^>Nw3 z0UST_`v+}gL5GK%e{ipR3`})zb5I4)otNSu)U0>--+%pOI;2;3Wn_;FLzs>cYtL`& zY~}P;?wXqUCQS~Ve>ix{UTj~znt}cNFy08E?W8nhfd$+I$bBo_brB!mKXcu>-5 zvO#zK=xs7jY@94pvO~Y|AzGKm0R_tk`X&?Oho8=pbX@Y1Gu-EKT5iNG1NURcd!I+X zu-zBt6iMfjbE}7=+Nyvfe{D7#m!oKEZZ~b^85gRsI_shZyka4ahCURS9$Is*vTj$N z4Oa~YPhnSv>&z{xAxFJ0NL7)^A3UMl*hbGBuGNEgNI#TVCD4?eJV`*#t?5nHxp9uKu%pl9sc6KHX<^czr_uq zST;^alw=3_JUPRyoT>3&gm=ZJ7}S&K*yHWUu3ou$gjl|dZBX9IY;7wr=cg-#^jRp$ zJ$P_W?IklVt5AWomQ-*T-EZAc8Xl#vwY)X>fgMu$WV8F1Jk-}na7SbuawVN0890+F zXN5;EOKi>dR^OB4zr;`u05tI7)8Al){HGMF((0TwT6SukddEsURe+mi>r<|AToPs- z_MB{EQx7}r$C}o^1*V7lP6d&dsjeoWx`*zO*&H`-mNzF-!nRrAH5dES1w}1I``*g+N|}jEnLfRJrP5y=%3cMSq9CXx z>TyWoF`s6#Y34)7(@3HC(DU(GNs#m ztf5fGlg~p|mR%IPT9mhS2ZP20ll}EeP~;E3gRb9&#FoF!Fs*zzEffss<2V^T`HS|2 znqNq%Nn|ARUrty1ovuP}0aFPy}M#Nc;pJX^}@{dP$I z4Kr?}@Mxqsb(4VX!sa@^;?ZHAe;vuVQqkL*W!g$n+eju2j(#;k(b-)Gn*2OH> z4YuaqDo_oS9_Z^c$!UuZS+lJ$(>;3qQ>smv&o5s)<1)6UPK&t#mQZ!z^vUPxyKA8< zlSRHM7FJg26cutkzD=ePT!C6^u`SY0mXGLb@DSMz$%|~4H)`MC0DlffNr+26_$tA^ zwV{(u2nF1LkV+g6GJk9#Iwl64$fL1^U6DGnME|lhnBZI&rm+fZ^JK9~;C)5)5eFwl z4z{h84*GoIzJQ;%ge}6A&wxZ5h#{UX(?K0%LBsqe-tJmq0QQ*js6$7#2A!J*s1GJJ zkkz5)eEj@Tu}o~zcY!%5?zAl|X837DVNH-*hmi3j*Q05j>uY)_hfF_>_m0vCnkjYLW<*7zV66f@{Rw@c?RN_zAi;af9DOpO% zm|VEgHKmwpcRARn2P9W0nE9 zQ)Zni+I2cr!N0{Cz(e7Rw6($=n`#+uy->h zmA)m=kV0I6RqYlw!I!^{n$5K`CV@Tpmvee_RuiZ|l$^o(DCy+zCGY6?{?%@tGs6Vx zTQV#+t?ShK{()J)j-d5iF-6kdjV7OZ==CKdq} zQ9D(%2%`=)Af4j&$~x?{p1XT72^uc3weDaSMzbVCX4l^U*1lU(SIT3=g48BqcLYe} zAwYp}cD0a#XA3QT(gtG%pm11W*xp7NfUH-rC5<6|q>JP19Z_e-TX+175ap&oBnAkD z_aqBdSbH{G0)*{M)J7L~!GIFGnBrmO8fo|-2(aBi!US-Iw8dJ#XJ&KC{^d)fkT2im zIy{0m%dI;~c)g&|% zUU<#zE4i;pv1p~NwE?3_PFB_u>&I>-WpDU{1Dqn9hR$-z`S4QqHa;&vHBgtWvtGwrRG2jMgg?iiy=^UPMkAIXyskT?e~lC6`50rCMOuCf@J~LZAGNqr zvGox$rC@frjrD}rOns+vLz+76F3Tx80-f+(zla`sU)@C8`G0JE2UJtp_w~#;>Wqqx z1(7DAAkvj0QUWR<(xpouq<85;AULCdh=3qPKoaRabR<+2r3#@(x=JT>2%+zI)F-XP>?Ioh+ZLCI&AfH*xpz$KD#Glg3;ZWpe7D2Eyy=57L!hQ!wwS zOwYpAug_I%MIq(u^R*>u59^hw+TLvI<23gc1E0!za)1?xxEn=F$Nvd9o@^~IHM}Ru zg)p_rv6Oq9@cFVJ=hob%<2kGQ^6Jkt^veYh9jC=C#>NX#q`QJE6q0M3Y?s0CK-nN! z*PB;<4-V7l@*#ycmb`s>z;Jldda{QjR&jl0GRL;iv$_xNFb!j;N3dgmh3LovETv@w z>cH>AT3Hq}#7mT^E|k4&Yq|TJdoV38!^STY#=cw4g)R%?!-JZBi=!ygO%;{yRgs~) z!TTRvJaZl4C%4T%G)1JN%Dx zAwEU3JtK6Nk>PgMCpeqCk>Wib3SZ{D)K>V?9rnNiralmGR&Cl;kzatSyXiwJa!V~I z_E4#JgLm#Jhz!41j4E^Y#owx`=q;|i)Q3t*GBjuLEyCG)_ZEek$*x9w*>q)Q?4yv) z#qnx2`>+dSeC7E*;VDuMnL%+V|6Jc1Apt-$x4M~xpyR5eU29&$wXL#*rK-(Fw-#jg zxj~sSnK8^Y8n8QP>mq%_AH9F#;p(cykd(Nfh0iPlxpiAxD^v4Qw%f7eLC6+VHYaFm z@s2P`Aw=j)x_H_{RWjwRnwCfMOeWUg^Ltzhj2xlIW>_~jR4vuFag;P5gSM*Uxtg$lbZPDF zXfW)Q zS)BOLU#vL($jGJGMoX*O2n7@1ilUvz4S#LCK}xLfTke9$?kEV zo{3{+XAF0F<{arGDqieHQFo5WP;#`<=@SAg4a>ykPK_;EotIZXl1E2j;GhmD-VC5+ zHMQ?83YnmsXFs3m5Z{Z$T%LSLDl^EH@v34`&!10}b?1G~&9n$+;4Iytg;kx?nkzR->9Z=<;%wE(k5_)iuLk7rVBRbWi)JObTt(K_tPeRb$aQ zW+KY5Le9amy~-swp1*HTK|QXq_0yFx%=`0NB&P->tDY%0C_!&e$MG9iJv%U=ia_2x zbroftIyvgPfr0Pe4(f+1MDk<+R4OOLp)Py;n1LxQ*_MvVLYGfhZ^52>y%u6bHpI^x zMMee&FZ6^Q#~6mfu&3L+JU#hFqlSDvs#k;@yM?|`VhJC5Kz|-(YBWSCT6RS$xM2DX zi~8%sx3g~N|7~kGk`DUkq_i>qRXsrGsMa42{4*BtS@g~+XSOw94+w;sop$_vw@ED8 zHnkW9wSn)uC5FrCxs$l&-{_k@x;S5(f-LuX$g||$XalB&LD*y<3u$ui2Uh{<)45t% zsRwAePApWp*?=6YFW<#d#x|0Z+2~q<&Z~}N?2iK~jS~uqhtYOM7Ys`8$_y(;a%B`< zJZMUtcH_VA(95>?3tHZ0up$G*@yEOR@3P%Hadoc0n47plBL}PSXZNBx%LnTeq&i|X z75A74Nk8aqgjFP%N7q@d_D)_h#)~`Qdbqf}CT)z17 zIFEb=`v6gcpB>dQ*MBRyo`BC^F6z+FMrX#C_aA(zp{^iPY!P^DcB$gApK2rt3bLNj zh0|rUf6G;pW(O3MC&WZw-{WEl#gb zr{3{9U<0uNfqIBeZ~nZ6SnNT6A(SP{I2Sub%FU_;t@YmrTZm-M|I(d5&i9p=KTky% zBO04Xq&gG*u8uCyW)Q5JhZ)3+&vfN%*r+?JYoY_rovW$j&eNe9@>`-^)l{UKnJpG} zRCr6J!bqM|?2?j_y{>P=`Hdw>U)qb7mmfX;+oew>)M0EKOExNm_)<(e^a|3^Y<)z6ZS2?$=(=WP22UP z7j%IdiJ4rMl~{Kj({P%=NYFhnr(Bx7Br| zW?o-gRLk9Z6VTy0+La@`5-g(H*SzYq_kh(jIX46Sicc*!AE0p5`s#5TbVp7vtav_) z|2Qu9Z!&Kj%!Njpn;zyUl7*fTaB|vfXbRePLW!!^`r%Nfv-}p@OGF>FQKvt5ekOe+ zjGvI4BpX&T(nI0Luu zo4xCIr#2Ww@7&fjj12WOpTC9L*bGu5hDH#_JA4MpY_=;zr#crL*kwFJvZ47RQdAyu z_CMOm{Zr0BCfdYQtICC#oz8uPq!f28ZeED}!~l#BTl`ERSVNI+JF8DzH{~z)m`8AOStX_aaK?uQLiKGw#21NmokOJTox8&4NTjx zL!O=vr(HaonuN@!_OqH6RzFYL+J88`wa0S2(FlQr#N1~SUn*LDiEOGCA50;n*A?5T zMu_mMk=4R6pK3co z)ea^GiE}GP2rdNmbEaous^|wXZ`c`@Z^7d0Dh$xhHA<3IjIsiq`T9!voFQ>k0}@Nh zH05ck&&8OX=&yOz9)GsFr<(|wN?A1IIQa#P&QC91TgGz5#AX86WEKb-^BelF95fUZ z0-0t^bfYYMFVzWS!N7MRR)BXp$O>Ay_eg4Sw#dwXJ|IFkbo1oGP_y1bw* zJ0Pr`eY-8aTc+hbofH3kqk?7q;%Z9NBa%UZtF?;y0mT_bKJ7Dq+~pl%qV!r(Cbw?k zr;!T5kecDs@V*W(ILf=%2@QCviU7Aaas1I|Zs%Gh3 zlj5?96g|U1_4c-qL8+b1AO!jov}kVcEhbBht9nx_JM@0?d14(4xN{;TIq4xD13>60 zHW|LLwK}Y-H&40V3@C}qHuPSWYaT~t>L#sQH-c0BzYkD`yI(dF3podDsw=yE=!AQ; zS5$GA&ef59sRLB(K+y4HUkpthFq@N>GavH>zjzw+uJ#IRk3{_4dFOq;ic-g7>rz47-m_l_VB_6xm#P;Q5^c;SO9xF6Ga@vu zNY8ch=V6kamL1{N#)}2V+~d|ve+sfR@Q(G#^_)p&&j=8^IPf^%>2(pQN^f{E#W$v@syn$t~~t3%4iwKnkJh zS6gRhVPR80e-ytEE1cOhz9d_`BFEx;tZfx$7BV;S3kO^HJ=&M_ifzh5;D7sJKwCvNPgE~pQE3P<-~foc3Kmpbx%Wl^N7mdfB08G z#;SNifu3kb&4AfdTY2e*d1Hh-bD=G1_R-Q2q!n3TafIovlt*Y_P>@Dl`CR)F@vtj% zq5Z~6ztY#vrAYygB5;xs4n)CD3N6gE`yF%Zmq~rl&#-9P=&F_V+cSgA7}lW?PL0SY>}dgQfShRgjU=XvpKkC~77=Wx3FF3{ z+glqodX|va`yXP&>RX#Iy<~MYXpsagt_1({JZQ4uK>Ob!9kbGRaXKRVSDw%;bwZ>rBq(FxY9&JEU+ZUlTNw+?D@ zooG$STOlky*2d>sRexnM)YIdL9Q5JV`Xz_9s9VkmAz{_{X>9lxz2)=rLl|l$(s)RG z+jmYbWa53aaU0om@GkT5-+t{(^h5t_b;V1noj?1ReAQInRDjCMYxRX3qeh<-$2H=} zc(?ea4~0bA@fO3L*-GCX3~F#ko^+2Aq{4S!64(RKYqG1)hg4_}&POu)?`1bK$+q>W z34Xyg*PZ|5yUDiXunj8TsY6rS`%iyZ*&GC)?K0|wr`|z!A4wc`X+n>ixl;ZUK7=aM ze+@I1O>~2fj6~fsxlgXjcYCBWu;M^tGz7FcrRS&I4@14}5^OxUSdiBp=(oAHR9-8v zGTq?59jRmVnE|~lwN*1!&m*6uy_F8wmERLX=Y{tis3X6&I9K+VeJP)7D45Ax*)*MD z!RIHxd-t>sSq)+w1EXVM$0P3&0@=VnXXOQf}jw0b(rnuC!H3&dHfBqt;x7;D*32P8Y;RjsGTYz0seb{p~D zp}Hk@1Y}!;9(TYKu-FKkQ)xfv!$L7gb4v1O4Mn@17=YenuSaQ3A@>xtUMR0094UAA z<%6DHqs|4~=qi-l1U$g>Jzk&Q42s>Ge@T80lpC!X2ZuS`6X?klUIWuBD20d%cnjsY z(%Mkkqq%w%)B072x)UuS)O+r_L~bN8tf^#KW?BL^LzeuKqVRmrII5bX#NHOVf>ZZY z=};fbL&sy0S^#>Wztbx|3O(W}SaXS3IUip8#7CnTKu`Ms9vovK-dn>T->&(hAxL?H6>RgCLCJ#hEZ;kl7|nr_}*%_jEIx%oY@tX^Y^9D*<>o zw<WcXtH4R;_O7~z_qXQ)cX&z4~zJ36d;6(gIajo;{@pyy_O8x$HIG$vcH29XdS0~+pm`agG#Jy_GV)>KC4_8q zl4rHI@TnI-{ty~$WYDBs9aZHxp~Lh`8(Ywxw{-0iCJ|bW?0di^&jI1ZSmKn{Sac|*^7vQIqo7Hs&b#@=~)IueCgEU!c&5Sv&{;0g4y@w{6qOVzm0*cQU!!d_ewip6WCQy#X2agC zMC2f{q7)*zMn(V2+02-02*!e zJ9k35C)+CHz#|}J$+HbLgG^Az*RJe_d+Us0i}`VdlXcjTN730@eb{L{ClO1qtIS@3O>5 zDuMCPzGCN5F5VpzKa75SaceaIxMeF-Sp|ls@cKd!k~lWZ8zh##m;~y8u>F+TfD<~vz_=V!=@q-(Ak>v^gsQWp<;P|pmEJ#Y75u8U zYIjqxokjx5vTCa5$#%ai1403VpjQOoSrIcIFO!P9Kaz}_BJa#WH_*0mV=mLGEm73y zAOX_h$;qEpGnY`zNwK&;SaOfn1Wfe1v^0!zGUG>**_5Fx1L*WlnD-U%=%CkQ z3l@z*gYg%Qbd251LrAbmlb}yCQ5<#-SaZh~ylXCYBEyB6>Pi=<-~Y?cG+t}6NJR0L zG}g3zcl}vyuq!~~FnFx2*Bl|2pK+{YpAyDbO(`_5PiqugwMk?zz>Y$KN+|;-gW8-f z^edtBrTq#|^%s`Bl>Z#->;7lwhP<5PoqMp9x^f+HOapoC_?h5XG0$*7m`5&r)!&Rf zF*yY)H4KiZnQH$2A7ReXbp5mvi{@2LFve^D5Q8Jvgi2~76k$l|irRr~lK_2*jH`eB z;u&t5qbE#h+pn<Y+)KwoDW zMffqlI@@&RmoHxoO!rFM;SfMM+^6X6Xgc^kw2XJterH=p`x`U&J?%G7>kiVkR7rbu zS6t84%KLL-I04{g&E`1aE(q7cOG`ZfIVEkcnu5e1ECk^mYp*Six?u>;Wfh|-Tt*eE z3j}g^u7}~PKYyJ=t8}It86v}7a|D%c&ElKwF&L8$8?s3=&9A@Mc=n{gADL%DEr>S| zVGyxN&mHqgSOZ7G$_5RDJJ-{ap_^2Oq#=NNpHw?+*-q%(39NH#7SVASR@w;ogDy1+WSXT9!N0d2X?p>i*QlT`{ zJNSoFn#;e-3K#-3H5b`p1VH!|Vz29bC;lirb3a`-Dy1unWCgAxy#$vu_u2lGCn$QZ z+j%bm!+K21n+aP1#E@SN?{4oE+nAmx|5KrTj90(2pi7I@lz5owC4?Nw$>+mYdaF>% zwxpa6KtCe#Iiw-(fwQ@mLf|nj7o!-1ohBiKJpqsd)PeZrW!IUWLY-9W^grMHt)Qf& z30w<6NFvA^vr>1j#_jZoz`;AfqB^imiH6ysDIuyW-yjdaal$un-1uFAeT@GCQL0E9 z{iWe&fP^1B&0hnzic9&ojZ(%N3+!ilixsW=IwIgd&GdB?p?H<|4u3HdF9|<(JQCR5 z@7~F1Wq6x(if}wcsw-gW$Cad|aPsmR`m>r_SY*N`4(1N(3V~k~R8(3zm{d6GoQgb~ zPTCJ)Q=xdUCgBIbA*4ier2ni zIk|u8E)#t!>o64aA;8WPkJz;r_)Rr=Z|iH{IH(?>urYr41QK^` zTDZ}9Bt*TSx5qr0L!#~~s?Zv6p;X)-1fkT1&{y|pRh>$S&@znX}Q zHhOd+boh$bW<#39up8Ov`qDQC*O~c|8-QM9)n&_jT zBL91w=`h&pqlx9k_ZrlR!iIAd=lZ_!Kzh9+Tw<>n?j16G@t-pn@B3cau&XZX@6~-K z_2QU-|Ft5~l1k5#)ZytrSR*dE4<$LoMJbc!=NG8N|=>CF9wYym3 zH*ar;4U~lni_DCB?CTQ_?y`FBKihYBA{Td(PxH=~lSJWzbiD0vWrGSLeLuG9n8#SS zH~p6-|8#%Hg{MjLqE(X+Z_t?K?)%#w%`R+dCnp(cOg?;QKty4t$z^%ndkNUD$j?vP zO-y}Z=CJ~Xq_CqiHoJdTACReu&$h;4lD(o0W4YImY|LW_qX@yNA@UnV@Vsvzw+^U7 zTn!tFvaLwFmvXi0gnr_~L7xrYU`9bbVcYI{?Zc1)qTxsxI-GB66WK7TiT10y1D z{q<)4`x=7=I{vIN?yXVgx@~-4XUf0NN`TOm6p45NT>MV?d{xroxj!3_Y&1g1HwaAs z_nPJ{PSr8Kd~i))635^8ooT{-5fWm-Un~~y|3TC0QSkSu~MJAS*%6TcT)bJ zRPk_%=VTe4hvDUa9k+k~c*K;$Uos9)K0WvSIg^_WCHC~;N;qP;{r)7w@082;0H73L z!TFU(U$8QBdd`^7IruT!l1JmN7a!jhZyg=fQE}2=bWTw8zUO&qEM)`M2 z|9LoK(0~+1EKu5OFW&o|$-sS%-A$QY`bJUK{~gEs7n%B^Mj8+8dr()N@PD5?<14_c z2y3cHNh9(5S%DcZ6QJpcAd9u}?fqs1cfXYYKusRFLt!vs{_ha~^jnRPG9mnfsp-q$ zAI%7!rU-JGfO1oK&2Rs;y#Dw4YtK!^3t;$3Ze}+VzrT5y(Z)!)uZB7Tyxcz?2M~xW z!3w+b!+YnCEX^|fIXDaT2lv1^-qeQ(yK@`lsh7Z%hbMK?G^O33;QPiY>fhCm9yyouJnIjKQ+6B`dspnRDAR2#UG90 z@G4zL33E&;{g0Lhx4ZxhA$QQfo9h2w6TYr}3``)VlFNQL(F*Lr;-X``(5&x=QG%xl z3>n8ih8&_-`rc5)5s6(uIZtJ6vXuSN>e%%$AzoAxEjj+9OCJ8{47-lKzQYfeN8TZN z{}Dm9z>`0iiq@wf5~Nz|hClhyG`6b?vlmB9LCj;@@ZZN^NgSR8X>ibzSM8HFcA1zZU zQv7~8A<2kRozqB}+7BYvMP&^<+tSBVR_A^+Bbo$|J*%T&BFtQzj=UhjeZPKg1x8d@ejvA2}Y`8x0U;&dk1AFdkmgjfANR+z+n9LP@#37dy(z` zeY^MPLyq`>^$15pu*0Qq26y+{KSIcjPm#80^!7i=&o{rY2IfPN;HeO0P#5U_qordG z{v!MBb)#r!{(mDtc#YT3VBahw*jS*!$hl*y`FJKubWMi zKy$}!_HSklf@PKp0Omi{_%!55B$AvxRb^vm&uH$NaTZP+n$rnbAx+L=QJMv2-uST_ zv!Y(h>8Z-N1S*FQ6qCH7jcz762bVv5O4CfbK{3euW&+%w$WsC*min7Vdhx?oIHa@@ z?dR3)yJ8G4Rp&Rh7`A%v3R~UUDH@SmLC!J)K}zdm&}s-flFDaqRZCWmQa4WKQEOH4Aj3q zD0hRi+}(5A?l9AptKXRE-8V2f<`{*eB z^2g)r)6X(8Z|C1}hzj7j3Fr2euJu5<0N5=2FtIV3JMH=N>k5i}S?_rDh2YJlq^9@{ z>@?+8XL#T+UUTt*AZR71efIndG|~U~0(|S8D&YW1S6m6UF<2vbop+ z;g>r;CL|__d$$;Uhmwz;le1o1q{Whfe{JNwrWMSx;pGq=_}j;jB%mV*bhxD)Kh~M% z!EZ>K)qDT$-9rPx)rPuavj%mP&_r8aa4S$I+Tj-y`ChrVxDWh0+{l*^;f{ik9g+}x z&7*%3184oPv$C4haIx6s**=C#c8_4DkN2)gZKlVIdyJX5T`^e<&?veynwe+oJWCh%4{dQ*`9 ze?|FF&8@!6IiODAHX$kF7GzIrJv<&B9u6lG=lUB8-o5HeI=-Ckj!ACWw)=ID34#y&`7 z?+afB-_N(Tb927AAPb1f>4&PVDJQ-Q4mFY>DQ(|<43f{1#c!&qrzEA02<`?CyF*2+ z0er{?{7GtV5aT1{Q#;OT8Yi-IR4pXJuzYzq^dJli7pyrhcJt^JIPeIV;8~j2IU~8~ za}~xl)t{XYc5RcTYY=E=>ar6L0Zw@ui?6}UArbrbSwL>M;T+8E4afI&b=<585eiW} zK;!1u0bCc6yyvYk)wNa3jdP<=sE$Gr(DuX(wTO)x{ftv>))yi!P@#&k@Sa7vm8++? zbXJlLMa87U*C{hOx~%BDxlK?QYR0-KFpqLa z=mgtzxk7oZnc{5Tm7$^UcYyW)dJFGvG2)jXNIR`Eq*{6x_GjhOh>t zE{M-?!k`VD$YZGg%3edgU7Pm8t*f+Lnzw)!uZ8HeY+A3<8M>Othzb^Z%t<1A#-L~( zEm(gm$uPj8qY)(g$VRQs3Qr9Xvr7A$JZz>~-bn?C}nC0^M1b9yAla#!)V1_^hTW5%n{F z{6=qF^k>y$I{woFCEjZXXngIHwX+Rq7d$c5#+6>KBttkv1^hoOGP*$^22Ik`OQv<) z!o0j+eC+#*x~2E9%-dBA0J~yJ#3nXHZ`=OOk);!KjB!a!2(+H_YG9Jy7a~ihM^B2V z*zm)@j?lD|h8|+)eN=}er%10nWIQoOB}y7n>+b}0E+Ab;TU?9^FzE< zm%wx^Kr543xz%m&JO;Jye2IFr*qyB_?Jn*X4A0<6y+gcdMAuZ4`A1SFXC{C{RIB*+j>!_qYv5|zPxrsD!DAW zv%%f|e}n(iPmBB=7op@;BDtNw;EyAtzjL7GqGrz28g?PVSLrp1^^f1ITF-?}mWY>I zWUQ^d8-#e7u|>mNJQi(yZV;Imy>6w~h>|;ZqGE9=rX8O8#SU3V(v+Ipt13=9aJj(P zxa6$qhOe&>`UFoln0f)KilQtRmJQ=)b!{+FA;MhLNsruF!W@QK;@(9?w6qhGoN1l% zt+^_yj6|{b(wLNMjk1Vs|3i@zIU+y7Jj>XkFjGc8S)O$OuWsmDTSG6D9D*N+jE!Yj zfO1yYV)~w82VNSkhn-WDT{cuo^fo9)wZuJUKeP|_&r^qd$=Hoqo!mj6!v2VD*iYci z&9-X*#RGUhFH#SDO=@IwENfv&(s^?5}fLuHNw( zrFZlhr6qV7MK(rKTHcAcEl;!^$}cd#uG%QcYEI&#uw1;ArIXvBMzd6f%Tm_3m)z>37pS{bPNm(LY!r%=BjtJb0xQ&H!WK@a4H=@@)Gu* z$SUCBj?VlVvH!65H&O6E_iYU^5~dt?8D0Bj_>L+8W7V1@>L9a;xCq#SNDJ!($0B;n zVMHA;lAlwejk`8kFdrff2-Z8>drYe9YJ(X^*JB{|rKKt}Sgs;aq68Juv}5E*Od?Xa zyV*y#FGF`gTz^BOqaFB*&zZU|x~|&xR`zX(KJV+!UXy(_)Ws{;OypooOHOZ^@$mDZ zk#DCn#zYQ}jUO*@=u4H{nr$xJ8TtgBo#tXG7YiQ|{oG(Ll#cV)dtA?QsOBkm!+2Rs z{y|c(yE1Z*RSIhYj@Xh*?6GhnxFU9Q>&tsZAo{iCBFk1&}qSv&xOUtPSI!S7WyB9wz%4M|Ke2Z zXA_pt<0_pMmc-Lri)2R=(!O7QMv1OkL)ubysHQ$rYztGZ5cNa{i6Gsfpq3{}Q9p1} z6{1yIOJ@31GX(oRceImlh8?0Jw3%z6D6BP#hEeF&`varq;vpq=J&7q&{7VK%+xCMC zzZK*JtivVtWD2Q9wceqtz>lx=Wok=~ru^jOq=G_kCZ~qfqW8=;TuCg-a+dR1gQ;S~ zmC^C1x(}$;z835XCy06Ht;yQT8+KkFB}9yd!2H7(+Ze^0wP*iftATZz*v-!;h!jU< zZ+%0DN?C|$Z^!l`cVPE%*WxY$6iI?GK)322VBpLVo>l7vOCG+<+LA*%JLPXCE)6P2 z&^AUxJCH^*Xsp>xx4U5jPoC=29h!{P3E&cCXCD~^wQl0+f%3`eLcz;nm@DR)<1sqL z_BodOq#_gAmb+VCO}r|$MRCYE4sHej8$})hdl(z^c5WZUTq({kzmXFpjrEkxioyn` ziXO$wZzk#$J8xA?uVS{3fHFiCH4K}N2X#6jPTWniEm2l=P|ABXFV%P3ul5Q3_?pl5 z{O~WzTdT+2st6h(Hq$O1{B9Ks`yzSuZ?xx+4MCHNOvxW!9)R0slvRdLMDI|b~6xkqC*Dc38Lv z368+ci(Q-HDYowrleSw3Pr)ja;qq$yE1VaL=T!&F2U5b4j7e~)%z>@SinVS|npS9< zYe0Kb#mE(7$VQ6v%wCI`L_CLI`wjp{eR)}s=vhndDqkL%+kt!x zvK_9GGKI*Nwg8rjG;Y0OiIg>6u@yBzWT)N_zB!)AsS9NkvOvFwp$^2s-wA0TWdL5o z&3exAaMx?iv0kPX9yKdd!U;<^6ia_^by{!&pXygS{)Z?}KzgK%UB-K@Ot>p76|zC< zp1#x^zdTu|0d7yCSW$l(UuBrYJ-KtEbZ$eHTPjGNZLTXe{^BviVxywh!kT5xEC^EH z+2NQ24a?n;9Y|srB!r2lJy+j6?Wh7(VwNQiqYx^&m^Z#nstY;jDRt>mn+vf}Rf@I% zc_*c)%}-YiyDpn*6z`fQJP*H>6Wz6)%(`I70CiMP-nJy{86h1<~;~7Jh z`DS;vJVlCRZ2C*~^V*XG3HZX}M5RkC>ACIvw=7qO*=jgMz zJ1-=A3~7Uaw`S~uVOh~28l7k<0ee3*b9yr8!U9-2-AG2q-J2=Qy;;D(#4hmazp@}t z-)zPT)(Lh)eN^0(jFE>EbosC}4UoDgG{^1K-}P;ZVk3Hg#++`?7rD4R)l(z5y^-2% zLLKi+ZBAIy$xsL1s)2+Pyn31*1D@#mk5gT?W_|7<_ZVrL%i@;^u6+22sJ2?XV=Fe6^5-b7%rRnWgQ=lZ3-XJdnXW#r0ZIhX! zO3#~C-+j}4z&_pr%6131Qwj8k1_m~$8U7m!;mhJt5`fr};#N%sJU!4R3rC)kv08f^ ziPZ=`!gS>&ue^RSyLC|a<{})CU>s&$h4DcHe)5b24d(8LPNvS9!-R3|#V31bo+!sI zI5}a-mfqWby+u{(z{Q|JTR=tBne3GG8~2mb9m|+KnQ=!X6D`-5>9P4(RGB3wDd$!H zbk9#)u$fNASnlIay_N82skj<%_|CRQ*k)(V^3FTY0tmRWP!b=YFW+8Y(Ot(JSBO;K zY9d=hAfmrhIQ~HkSFUP*U*$slrx@h8qP9mS(xA@xoM&0J{MO|tDLM{eBj!NFFU7&O z3R?UrY?Y7ML(e7m7y)x3uaQR`x?j&Tx_<$Vkp}Br%jf<~u}DkczF_0xD7UL=n!YnT zshDJt6CyJBl$)@P?5DbVj=E8qS~;0Cj3WL|kfam2+xW^A2E*Irzw?5ht{FD0hGX;L zwA?Whc6yL%UCppg;LtR_P5uRdFI$W}63%>9&v(WtX1PwCb0znU{KOdyadKt$nWBJJm@D zDjRT1L-PL)>sHSkFNzIowW>UWxWnJDD0Ab)2a=&uB`)H=0hP8HpA7G*^G>zq8aRw? zYu;Tc1!+*50zFRE%+uILFBWQi*H5pnF<*fafA25r~hql=In!dEqa9f+x)pR9{3dsk44$eo?7&2^sa zyu4k4-4(ipcB6Kkd4E~%S)N5@=-S+GvFUICORMXbui{jIf4cA_7&o8#_ylKoinpNT z&e@SIQ0GHF#eM$#*hnP^e;ekgpn`nZU+B5S0+fI^$cIgTdICrc@HWQY`8I~PG%(dt zif*GNE2QEM*r^tu5H~PYQ1=+aP6pJ__7per)R!QB#Bcym+{HZgudAf(4g?IH#k~(o zKtE{*9f949Zt)frB9!(ZqFm?ly-%-y<~7b&SM=T1mEv2KhiK)bXH)ih{V+($CX9lj`iE&<-2^jDR@@W_%EIuA`SZO=AlZ4H-$dhHknZULZpJZ;x*M!CkzKB3JjEg zO7qj3?|A!+1Q8lU)ij+I*2lZ>KKVRNja_I24~ZF@zWk^7TM6FQK&hO3}!>w zuZBET5o^e2Wq`yAxi8-w=qZ+qN?n13vU$@z$^wJVW-Tyzun$nmxG7_!IoHV8b52f! z$6xvymGB(lZa|V+Y(4--mfV&Lciu~w>RR8I)Off-KUM-uD8BtCUU`xsI{4U*QfKM! zj%J)B;2IUV&xlnDFWAGVy3Kh-iw(7N_JyL|B~~WRAm(>~LqOf=7j)A4bD}I#>T+p` z$stuevXp<>yIA$}*M{xuNzpMo>R7tovW#b;U*Ti6QD>lt zG91d+zzR#@Zsp&RZC;%|UR<^K*lzrGsZ|&_Rc7oz?S0dCi?;s#l(U>cHucvDfQS`( z%Y=_)iFSbvii9b^E{)nP04aFYg8DZi=fzr&@n03_7SYqVF;~bNmV1GCsC@4Tu=1@s z$)>Kdaaoj_(1XtEccR{%;7Wcqcq$jdu%);hP(_f_EXyXx^oz|E)%mo)cCya&8h|f3 zj$F2=8};|;9V&{(DNqEv{=oi4DBs(K}dKwiSX0w!FSd z(}yUKa$Ao)GJzwfD+hgi!x7?4PvcVa2i@NABCTf}m1)oIF3({P!=|Y<`S4dFC+XnH z&18M?q3|rrmJJN1eryadsj0++w(%8*MP{hrLDnO-@yXcNvsU4u^*$*LTK-wog4iov z$tJ<>R7xb`!IMf{HF%b$)HMbemZ&eJX#+m%*6;FI;h-Kj6@}pE=DKBRjx26dAJv|n z_f4Pdu)F{mOq1tjyZ&@W@qt8Z7S%4%aZL%D$giZ6dRtH@IK42XY5li*_>{fU%Ux&A z2&JmO{b~p!(lIt(=EkqqJk_N|0O}RLwvz1Q6KY|F#O@y1mhPVILM@Q_8ERLXgiNKY zC6ytZDsK{>Z0I%VCq2(UTg+2QulY5K#wSoKdB8oX5 z@(i0#_qQ2ZcZ}?TfqsyVzZ-V2qUCY(12R|4#X&8;bN{bc$(dn;4Z_!~=+SA|AsPH3 z!m;-qR`|m53sTSC+@Q{p06n5SL4=`4XuPk&zJEBbuI0UI4Cn2Q`MfgG34VIzCMHwMcOhssV~YvJcXrcZHmrq1#mPAdNu^-?g>)e zz1pd+^63b2=|!3bD1V9FYoH=qeiHd4l&IaZ$-}2~d`%u%za_kc8O*8hXDZ|r_TZqj{)T@ zlL~2e5qQe>^N>&MJ$SNHmae`oZLfbw%yJC1#K@+o zi8uRakCa<3d|~(0+|`cmZfEy98l0G*?FYOBUCDn*81*1N8k(gigZ0jV6Bqta!_qMN z659y~TNAQdfz8Lszn7Xd+(YevgJYF6nkWo|Zk~ayXvGf*WAjHMP6X47u+~{VVG`~Y z9HVY%Wp(dO>*v1p@;)%L*hbbni-dCYD#aAX9ecu)X&9wd?<0mNU?&li;%)i&LB8}! z`i8qmecpbnw?T$)$x2YoM(XaZGP zmul?0S73ng`0*qFs-{Nia8!dr)A5#mp0BL8s}aw?YgVqk!**&CZ)d27iDY3euGR3w zqjjiQJ?1-N4q&B78GGn-bkxe%P#pRjp7poSJoP*`TAh-XX6dP_?OK+RG>G2WL+l-l zy_Zc-`DE2);*g)Wt06R*b6Rh&NF4AP=B&$gDLE2r(N6yP> z)`E{nL(#(K*I}8m|GaogjoG$)^B5Gw;e6%G z?Hc&w3TUaiG@r}o5|`}yx)I-}T1bn=3H<$Ls}T_qNpUF~{H zqd}-57x8t;U&UC$$wW&ZKXCm+0Ao6iSDSwyZKP)N{P#9cS*jk!oF8E$eK62_g}0mz zlVc%)N!Z(21eTH9uq(4f&PT`Q13GtXaT~TUDCa9% zU$qqi-OW#g+4-<@>kcbShUftbN17bk^V9Z*X2rdQr}?EH!CblLt;?KZ?xD6g$4cJ1 zg>50^fH~ahd-Ep5Rlj1sTajFmHQlF_jcC@wi)=|mY(w&S6%m@667FiABh`I z^9$8|17R$#$Bsu5;2d#|b#tFH0Jq6f&^V1#gb~0Ap z)1hmzKC^y#&CO6@8+i-N2ohJ}Z_V|-j@A85qR=5YzoesxN8WN!?lAJq6;!59))>8_ zio9B#N<3w37S%sC5Uo8bW3M(_Fgk-H$xnWoo=09dv%kplC-$xYQ~Pa3&Q z4}OFv-%SD&^H)zdxPgkQ05%;lQU)#~!>W=g(9rbfm)w7-rd3c?YP6@+>pG+et)Fuz z7yXqxi_xm6rRk;E)fI6B{zEJ#xAq^>j4z|O4s9JV6T7q#E>_$%nHpk3lGvVjnJ0`i zdGG}M10?AHD_I9A1`XV4|Tce zt}kfMyoQ?tO{lf+Yo|7sh#G)If^1WTm^$vuus+pP2KHqV!^7t*64a9F9yY513dW^X zkgU|v`Mm8Mq)wleh|P~7zs&NeMi*`te#k_6MuCo%31=;F@sqv$+tieOsP%hz(#45{ z{ot?l3SEo4=bQ&|FzhqNz%Kjb=0$!*OSicmec(ek-mM-qkDjXZsKD7aMe&lrAoXBe zx$E`6K{wAqa#~(Z3Qf0YW=MNyNYa8vOfeKex|yPaP~Ndr?5Na>a3`mxW;zu{#f+r` z{M{JAmjfyU`~KB(%OuM0kzDaf{8Bi+rh@CWa6Y=5TD+oQ&PK&jCfkHG@W1}y0@MpA zBPgrkPOila3*Bb2QRRk3Y?5Br5-kf$F0#)VSF?7Il%T^t74t^b-|*{#`Sjt>T@t9Z z?)hc}cKb=CEz6Sns2enW#IYJi$5P3r@s){gEm)$eHc`p&TF9}I2t=#4q1dv|{ILy-G>Z5JwWo_uQGAW1Exa%SfWc1~3#^H0&2umjS8pb8a z3#WlDCAH6SE<8(AH9!x72PBGlw!p@L)yZji*!#AX8$!9>l?19aQ9%yG`jivYUPxkz zEr+^vV$0(^B7f8Er6N9@kP{Qsr2&;jFdrqB(9JWDR;!M`?flf9qDWqv#7#kva7o~r zq=cPw?MeB}!8-)LlRaKro}T33g|do4^B6pO#e-q^)6!t6m* zYCvo#EZ%vzfB)gubdvur7S>Ij98g5K^=&bPg!&#!+vRkU(4CJ@4Xk4;f!_~FyeR;} zuX&`R+Vee#D-(mt$7_QdR@h8ohy5&VjDYAhDo0x!5jmv3*g(Xv1h9L&EWgBwdZ`$r zo4aDyx^}=Qw&_u~2cfvIHq-}6REaAw6uxrJjx?Wautb+Bs?y8|_gZ^DUg(2m1F;Z@ zV6){|Jg?{zNyo(oI@NF(30YwFHmkup`QKv^j@pCM+PtF>TYG{-k?pRn{gJ&jLbF&< ze|oA*1B=8>K3>cVT#PC2>5RFAd7EAA0e)DXmp+mX6Cj+e&PjrVr9ED?4e8KiVBKk8 zt~hjdhDx?&>kj#$HlUE_%Ce8^p7M6#0M`cdvTfV}I=<}CG)#JK)%K0tDlwtNB^A0R zp{^2TTj*TqFftF%drrTd144#*Qe8<#BiYnfW+j)?R z*$jjP{bC0SN`oA@UD|L&u;zugH(ce#vhGfd%Y`M%o^5fuZW3w`R^`7>it@0xxLiB; zFmozssm#_kj~_V6lg@D(ErUP}%S0(svi!4iULnO+kjku(v!E=oT>Ahv0qNJanuL97 z>7c#xO0UAqT4n=p)2Bx&woMyrj6gbijw}&dJq;VbY`ksOYw9UATKk?hD>0H||oS@v%meS=O=LemrG@v#bH%%aK(eUP*8?OvP{?p|T4zCtnpISZrq#G`LoW2R zmVrSwm>eV^h_hXf0Ks_>Hojsv@@4y>eCa-q>08iHSefZdE46JZSCL&5<6E{uS9a|Xm@35qh@f+g=p$&u(OdCe}?b` z&(=HzYZ6c#CV})ll3V`<(#OgX9$_cBK@NHupm-n@x?2&kn)2Z@AK`q1hak7fe5jss z7O5yo*w{JQMP(Z}>o5QitsSJ(23S!u;riZ4E?ohgSd!`$uyH`pZS{`!A`xDseN(_J zxBdUx`}U|NkFMWXtJP{%D%FY#6%ma$R74DyP!&W#Lj{2vxoA}oqCklOAq1jQK&e;> zh$tkYTnZR2LPP=q3Mzt_$SqMIfN}{CAZUOD2yo`1_Tzc@-apP-=e*yyzH`EIt;q0X zo|!$ry=TvF@0lqJdj8_}Py6>@+5U*MFVi?*CTYzAL1{vJ$`P<7%>MkfZ@>O>(jKrs zcB#JoTaP$egHtNOO&`#;FMz135=qg^=#Vzmhb6#=FDk|vr_4r;fLlf!NIs=YqD zg`}S8Lu~$08|d?on+e}vKT}0IyKCKloVNe@?_jIP@f1fvj644J8twmdIqb`d>HR&Q z3NqIp_;%ZW-n#sMUUE9S?GY!1fE z8K3_K;;|HGwPTWam{sGjEZ??RyR%V4(nr;p{F!ZyC{)Yqq|H4O?~W6M+!-ebb&15S zJY3rl(+*1{L=BdwZ?UKqCg>6|Gh`X6&8fi;H8I*}#6uPft4r#5xgaUfQwHl-QM#mu zW6d7-omoSnN;52?js>_rUVMM11yqfZsX7roP6EFdw@tsFV{0+yZ$C2GJTUVt>Jp1@ zx!IqKO^eonja@0vKy-#{;o!i}MK+;#;Fupho%>FNYy{EQHL8W|<|%+RSCM8DV-%yM z4X<{oIQ^I(TVQFEPli3|+)sQg1ABLK*FLQIoRyY@`hE8M?YX&RZ%L!CuuCmOy#TmR83f`*u0J*x`t_8)N8jEkTIvLPJ{m zML$tIu@H_1I|yaf7Iw&I^+c@$1+td>6R?&|j!?#$3C0#(o--$*qDoy{ZJ`2Dc0TT};8e6^O769x;{a+62wC@rB7qZ^CBz8&SO zHw+$EYJ@C)tuUN0+QQ(?0>~J>Wjv`6IlOnZERsRe916Akwssn+U6ea4TS&n`IgM#7_5!V%ek#yErjKt^wjwDL!ji(?7)4W&4EUiqhs;%Dlgfq23V1@8aYw{x;`*Z^id-+^Angp+tG7NP^zW;H=CP+xg;P^!WdlgsU zIOF%D2EzupT0OyD_h-p~WuQwNVEGgw^x^HhjTwf#YKsj!;X5&c8qWBPSn#ws{8?Q{ zNVoL!<6@8+YzI)ri$B(Ye3m%bPbW(#g)@mTs5Y=heD3nGQ5(Cx2PHA+No-PChl+x3MgrM|vffSUUE)as!(*;6M(hHCfP^C(G zVOkEC?3DBZsz^yMKwwZP=>;XHJ8c#IC(;X3Im8NnX2*_Y^H#TYXyhDv^pVwN6uT>Z z@mqZ=_Ry{#o=EC+0LFVMQk=KgB{&PO&4IR8eEt~}yVf=ReQG*m;2p+zmAI~_A& zWVrl*pIg*WiT;~eBp*H@&O(OAI3sA$zCKz*f?HQo)E#(niN`L?c#>O`^DO2q9cPzZ zXef$rnu*AuP+94lX-RIl^j;)WiJ9`{ab(59&l#m3>do){lM4WKX)s?>Cvp~B?D9MP zPZz=Ge=+N&Ix-*4?uhMrxoPSq*6Z}*XiK|V_&}82umZxauSyU0A{Iz>}t3JX{ zb&{WIh|%g9;Kmii!^Aw8*=tCh4D_Xokj0)|tv#aS;6^+oIoKc@YS}2HAc<2gi_ONm z$LAxW1LIRYL|(PuH!wPP@ZLyEniimx$-zkC7Ejm^W8}s-R<#n&kh&!hcZrfRwup}- zn?UkQH?+1B^&tuO28^LDh&$-!&m8*>1bHmYl5UBl@xw@V>4rkWhBV~xjbPr5C&^ll z3z09gvvbAKSq2OalJ8DW*Gj-`CKbZMQEf}zBwDmdaO0UC46vnMy)2uCo`!_)5yZ4VH7U$A$i` zxXsrV!izJsX}Q(`+C40!(9?U5*|7_W+yWsS4e0=70bNPy$Y<|Ly=2W~NfSIY7d(!o z46x{0M18mrbad08PQ0Ct5r6Jo$s?c|fb-`TB*0(gscmN=;c@X|U)X6Ur5Qw=YgA_D z8Vy7g%-+c&YG5Ef?iB+2>BV!qd2S+qID>sQTdT;PVqj&}fdUwuQ6=t@1j|}p?qk`kU!y_n2t0) zc7CaB=`j*_mQE$)>e4{mfrvnpbxe9knii7A|Jfm#UB|JHVk3skgF)k1gOf)ZkXi{M zP+c9zGo=heD2*;81*OrQ7J|~~PK&`=NiRThC{of3C?&lBO%Y0Z z0Zb78gZN!Yd;j0_bO$vI{m%DWE}45Ydk$_=CE}Ud6cgivepp4N%@%=vSyH7 zC;9)qv{{Cw-KS$n8sFqmhK&#;d0QZJv01#zmW>=4x3?IsZpJGaAA z?E`Csaa!QazKgS3YwzY-%dwAK2@`MWQp52xBvBkD4Vjsrb@wnA+Y^^0K=Op?>9%%& z{>RK>Fw?8Fdg5s5$Y(vcB|@Tvz4dWU*(h#e>{`n1e}>i8z~KR5uNStBhLQCQKLE+1HUr*x$-!J>Am z5`EeX}tFtAO`jg`$e;1NRC|I*z-t*9~SJAb;!2OjMxj0;X> zxPjB6kQ;gIf>UMKo>{}IZDG?BSGkJ{3%4kZ?&m=cQX1WV-|ir#(S`E1|F0We2O|>@ z|NZ-1fWKkfrmr->|Gw>+N&}1nTSS#!FVMBp45inr^m>&>_p|r(Z`>2FG`dQo`x#|Q zql;=&8eOH)RT|y@gS1E`zl$pU-{p5pgZqVrQChD_8iTasW=`iUKcOx!R$0;c)0c;= z^OE1t!d2>Z2Qh;yvQ1sSHbbeO-4wpXZ0>EXmCpt)x>j|^C7f{Z6S6Y`x?~X&@w>Dt zBNE&1MzKN!9aBmNVN~XhKly4* zvyN!nWAH0CscWq;W~QcGjQNEN?Y=WjL4_s{eNV-%u^gh5{Avg*FUK3UbQDWIc<()r z?9b38npN5@VhelbY&H~i-!@H6n+`ty;uml_KGOIb3YW>M*bU3RF2%;!XquT0jBmHZ z%&Iw4tZ8HFVs%5cQWci=elp*KS>tgd-sgIz1FHnJ3Ug2YT%O^6vaJyzLe`4lg)Z)#ogJ?Y;^agf( zKJulOXnaPEpHt)k^a&YU?3l~U!j65aXI ziK~JTSPN?frgIImfq4Qx(8nyVg+s95?-_tmoo&Cz69M8XcD`{J2f^MrpX3zD$9FW7 zj^2PXqrQ)Bt2uFN^6l4~g)D%LN4CQ@e7(*3{1vwfJ(2Y!N3Ty-#fa9h_{?#5bE0jo zuTUvqsiBjR<@LQgW${)(DzK1_cT4*lQ8S5Rns?zItd6~@tV1fd2+W!e*bUKCV=FY? z6kzT_1Dk||Vnnp24<@>s?J0&scYXu@AuAjJ!{ZBhhfbqY!^2-}d75 zZ^8~-E0*Yc!eR6?q2gY%%xTS%Fl2wC)xCTG1h~jy{u5}?^=5no4j#>Vo0FQzD`1V> zfgf}8Hr2*5Df}g+)eJqW=6aHo>Gf_x+AYmE_%S?v_DnrI^Oh~HW>|;>V-?1{3Nse% zQ*Sd1jLZ%Ah?mLH=T7*+py+LXJz8^2Rb?Hb@}F^N8}2Qlz|6D}sk+JhP00s=w!})2 zFSSIQ5%k6~U;Vo2>}+6YYMMtLy7dGJN4%wJ-pjD^_dDTXqipK}v1am`f>)UR2!R#y zHB;jsve=|8Fz8;jM5|20qVa_gRvdqe7`Z}abnkqFS*A7fRSiA@=x(|S!s;~GJbZ;2 z<9j59FN1GF7)dvazWTJAiq;gxKjhD{BQ}ub1sao_hqNzv<1RW8eOBxY zYb2MvW-Pui^Je&y3$RT}C{f-Dw5AVJ@2&z?n(c-*iwFmp%LA7IAfb56#&mnww@#pi zaOmF06Y^F7U>rSyQ0c9mswygwhO%xTW`^6fr%_|xn`&eeFZy9kTukV{L>n)TD1V=g z>`!g`k?qL`x&FvuW`&0zx^;q3vk<;f$8co#5GJ3mUI&vnY8+T7Rh0rs;ik@6HM27# z4yjPK>Dg$(??k2w(^&^I^n9w&?BXUQ7%`$l7;}bAB)%63#&nh`L8T!2+Y4e(SdX}t zKwb<@O;h;Zn6pxU0e1MIS*lyFmRt|CrQ2uLKc*s0Q9TKRCqTNZ2fuFoZ4Tb!BF4NGe?wJ86E+^D&a87st!^~q zO$XS>dZKM2qis6kiS_tdb_7gnrX4_IqG!#p85PY$7t3pz;=iA7yXsNX$OpUpypL2I zKQMm@WYQg-ELE6h!HZ4CRUyc>?KF|%@P%JO*Fi7RFvFoW z%{qKG)sQ}$$48IM2uI|rP*iKlsDF;=1$d~GlEFGiP@zr8qCQG9C*g>s&%89-yu>it2#xQ_pEC<={TmE7!cdVF47`ZMF<3>VaIPpg>#b1t%9?7M<$v0iFt$ zIy4q~DZX^~r&V5`-a>uTUDN7+s3xEPK*HV|{rFcaP*gfG*7ui)7c?~og=LJ4x&Coq z;%>*Iqf_MYDi9b_7Ag?4_-g>HPpMovX2Q@ z$kp=~?VgJoT*aZN2WBmg;Tbc6xd&TYC!m`6M+rCV2}9`Amzaw8KRp?Mj@EqZSXlTb zw-ngABEP`9ikqoT7wScQEL8}B=;{AON{!?_wGiO zdgclAGYahnRZbiW2T)$%|)Sc5hb9zo3_H1cC)@3~MC3wd1HZd|hy!h3qoEwUQ z;LyyusTNc`G2!7w1ge{zZcB@^_BY9s2hi?ieHR)u8W^PWS3AGaGXO%fw#T;G^29uR z#Pp=sT)-^j37!sI7SnNEg z<=Ty!iXy&V*1PdNiG!RknR8HYZO9ZUmo>Mx|2gYs>~WES4&!vzcWRzYCsOT@Ts>qO zIO-RjBFhs^1NKJSgS8s8v^g2t6dEX4B+G2{Bk14#b8GWrROtmr-5)q2H1|ZRRx#En&)#cz-#So~eY+`yAy_<-c~soEuERJazNymW3zYX<_rZHk#|i1u zyLE{-lkK}L7C=U5@A~9$`x8T8y_UIXdWLKZax_#Fc}^rJeqbG_JP{h-1fiqv=xT*) z6anWQd8x1OIjwQG6z?V8nkoC4Ffb|5d$Le7pFiD=lNB~qDrpB9#7MmOZ)~o2(o;0^ z72A$lU3o#iXG9rQy8=wAk$aZce5T&z0!{%x3iYWefaqb|@8UC6JTGx&{T-|6rj2Y# zR@Kw26@-PYxb?S;mN@Dvid_2(SoS@q8kYGz!| zY8_sHYBDx+Q|qM;C6m*ANNS3nyB9H1now8654125aB3Po0EU81poem<}qUuFO;m zqT2-rWy{%riN5=S=MdMo^({bQ?$DU)sRSTxaaf|)uQv+Fx0hW33q$G+)(W)fkc);o zK7%YDW``Q+95fjp~qT} z0*CMCF0295VkLe#-KD|tCokNlfPg`HQ%vTYS5F(WWR6o(+#JXdzP0C~@ezkg#y_!0 zPAik6nPf1JfXQ3!y{JGhOYKha!5;%`gfSzW?V20*ttF#Si}@C&`;NT*rp7IsJ-=hH~Db{Tv$kI7V*NIp!c9o_OJY zs_$K6zD`*^3e`lGEySxC|>9X?nxi4q|@oO$Q>vnIgUW^)y+m;021{d1Ca96HuRdJ)Y&fj3Y$#RePQNtA_f9 z3H=Fvf7MucTqXdOxvP4_xIn(=J-^_6_whRV#=hf(>r#34P<}&(qu&jJ<3ni8aB{7a zz>KLk<||#=3x1_;l&J-&=lUkJN#D9xFHhOSyR(3ju#nr|NdYJx-@iAYwvo_Rl9G}1bPnnX z>(iN5!d=~h(WaIyM~u}CSB-wi6R}eE-E@={o#(bcRRTp3c)w3ED3xRRcgBivgZ}=d0hUZ#a%Sv?AoYd)95obmB2Kr*|Jdtm!zrP`6<_*R z%uC542Yq6h4I)tB%gr{-ia;NqdiY#t6M3p=wgeD2HTfyx1qJV+wZMJw$9C5~*1biz^Hdu6p`!E$}qT_s4IF9{1 zVE_cP_=lE;)#8~)W#i+=LEUZTaV9zbOniG8Cn6Q=vS1A(%j7|Y)#a|5%OcLZTT*E!xa8=HBdbPcXh?I67#@}z}KvW@PbaZGr0t<8n`FKBsr^$ z7jc!hlB=`uh)ZwqgvA?OzJ@+!{Dad<0H=+d;`C~T?jefr5Dz^MC1c_2VVI2H&@|#x)3!qT+Yiaf9;U4!uV8~v?E&@-%}$J zC&<4*mEPc}%Zq|ul04+TePhorcj%7utOK2QeKV#QwHhvA`fuOUs5ZxS+FyB^upO-3 z%%B;Rpf`QYhUd8(g7^1A7;a(FJSXx%K{72#N5F89PUsy5>vFkc7cQ9o*sG^Q^y|1_ z$$p(hm_^eI1eFTG`yM}+;wLjMR%z<5>be z52{U;vjumSMXImv<`|tFtuD|Ne4kF<Yag~Vk=5Z&;*fQDt#HoC5?-=^Dt=%NVyS0{R1 z?;=6q)I1b*OH=2NNQIy?k0QdI#*zjC|MVBSzsU%>ztNaan0LRzWjUzrP9h5kcC4b6 z;_k#fDi{q}0t%m=w0|LR(O z_-gSQx%%=e^koNKHhj5l`Va|06cLNN90Z}_TKLaBf;?#Hkh=976YGWTkp=vY`yV@u z4@}UpLBsclK6Z?HfBbWqG~}nD2vg}qNx#pO4D{4N_MLXZw?07}xAU6(r!7(#Kp62}|cyIj=p~d(_~) z$i41?V1Z@U@+Xmt61((LOf>|rmtyjFjIKhREWs_kOqW$Q4lR5m61-lt+ke%p*g$}4OTm5hheMXp zp9zXCMef7I`$XWg76p0tOWC$_T1Fo5o7Aj%8Lb23z6#;kX{Id+r%pa0%X!%}D5;#7 zOJE2X2I^qtlUS0UNYTl{j4*h~c+iT{Jpk$?Owgp1VLp}1m~g63)rZoSsdh}2Ai8&s zij}8Ekowwl^kq@>ypig$2+<21m9Ba{$SHV&3f34EJ_gjHfX<^WVL4xwJnv}vy~S{|rfWc2;d#j2O+-~Jrr z{It)dY|rUCzdfEq<*-|pb-#*f4a>1MA>7?HC*b_1F~=VQc05xI$gg>SY7ey~SgWtT zyPLAEIWTDdkioicv@KmnsQ<~DKk+VsK*0Z5~8+&S)?vK z+0oIqGiJqMUv*-TqP{CUXP;<;Eu-Qq@b6I=VX>efaKQid5Sq)YJh$&OiaI`I@RiZ_ zO@^wz*n*KVcA~VrqJl|T9iZ;0|D>go)E=2&GC7Hl9r@jO>Vi=Eo3={)w3@vHYW7TH z^1X&>FFSLBF*QE*K^8p4sHig0g;w>9w+3^%f30KiTnHX={~eo*c7+&`%cS3xy{S9E zTRGV>U(CtUHEC|f0S#=Mk6Ri-pBjDl7S(@;B$`{2%G>s}F~eYwZgr8?kH&c;&0|Dx z=@^6U$)td)OWiS|bIj*n!Q)MGhpA64rULx9STZS=JYO0tFF%C#-wD~2El-`~qh+j= zP)7U3QolY^kxcB0qhP<=?d)^@&)D1wUPC~O;kND~t?xO%qmxmlG=|}q8ITD_P{VboHI!V*r1YW zHrD~O$^T$(GImt)x>X@Kq*624VLj=j=twnLJMq_M&?xT~wX7WThNsKktWDq9DeoJU zKDsZhE*%QNiq@7~9I#uj>r=*Sr*jPFqOx_YQuk-6T*CSV?bs3cLH^*h{^ElSy#B?$ zzK@q1PxD;Tga4KWfywG-Z^sipih@VV{G^W#m%q!Fo1dZCPWT6 zAo|;>&aBDJfHa+y1zAt)%AVZ@M#k$EMtP!+vCF4vSF62bc_Xf`n@MJam4Idl*ak^$*c5@OI@1v zlV3EBgSJ!MfZLg&r-@f|22Z})lx+IU1cRdnseLoiIypWSuAykNUatu_r)2(-dl2Z! ztTSH>4X2ne=;w?A`meo_JRK~TOIlq{KU3|tJ=H;*(|L`S_?3sFkt}7TDDAa2Akfac z_i2f8$5-Mm)Aiwy0R&2MnFWx;d`a!0fVy>ic2O5!M8}oCp|ZfJqNy|eYR1w!G=x7n^h@$O37o* zl~k$pnpE79i7D_>$YS@`obGjMfBTcp>5&`4U|&f!q;rFD#^3m5vJU302p%$@(hic| iYc;i;+Nx=z2re9DuWNd}rVl)YvM|G$X6`?E<$nPi8rNU| literal 0 HcmV?d00001 diff --git a/docs/source/conf.py b/docs/source/conf.py index d4cd0df..5c209fe 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -35,8 +35,6 @@ html_copy_source = False html_permalinks_icon = Icons.permalinks_icon -html_static_path = ["_static"] - theme_options = ThemeOptions( show_prev_next=True, extra_header_link_icons={ diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 64d21a2..2c80d89 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -10,16 +10,26 @@ Ambiente -------- Recomendamos o uso de **distribuições baseadas em Debian** como ambiente de -desenvolvimento do projeto. Apesar desse projeto provavelmente funcionar em -ambientes Windows, não damos suporte a esse tipo de instalação. Os comandos -abaixo presume que você está usando um ambiente Ubuntu. Caso esteja usando -outra distribuição, adapte os comandos de acordo. +desenvolvimento do projeto. Se você estiver usando Windows, recomendamos o uso +do `WSL `_ para +virtualizar um ambiente Linux, e caso você esteja usando alguma outra +distribuição Linux ou macOS, adapte os comandos de acordo. Para rodar o projeto, você precisará instalar Python 3.11.5 e o gerenciador de pacotes `Poetry `_. Se atente em instalar as versões corretas do Python e do Poetry, pois não há garantias de que o projeto funcionará em versões diferentes. +Docker e Docker Compose +~~~~~~~~~~~~~~~~~~~~~~~ + +O projeto usa `Docker `_ +e `Docker Compose `_ para +facilitar a instalação e execução do projeto. Nós **recomendamos fortemente** +que você use Docker e o Docker Compose para rodar o projeto, já que eles +criam e configuram automaticamente o ambiente de desenvolvimento do projeto, +incluindo o banco de dados e o servidor do Django. + .. note:: Apesar de não ser obrigatório instalar o Python e o Poetry (já que o projeto @@ -27,15 +37,9 @@ funcionará em versões diferentes. facilitará a instalação de outras ferramentas de desenvolvimento que serão mencionados no decorrer do guia. -Docker e Docker Compose -~~~~~~~~~~~~~~~~~~~~~~~ -O projeto usa Docker e Docker Compose para facilitar a instalação e execução do -projeto. Nós **recomendamos fortemente** que você use Docker para rodar o -projeto, pois isso facilitará a instalação e execução do projeto. Para instalar -o Docker, siga as instruções do -`Docker `_ e do -`Docker Compose `_. +O guia de instalação assume que você já tenha instalado o Docker e o Docker +Compose. Instalação ---------- @@ -47,23 +51,42 @@ instalar o projeto com os seguintes comandos: .. code-block:: bash # Clonando o repositório do projeto: - git clone https://github.com/unb-mds/2023-2-Squad06.git + $ git clone https://github.com/unb-mds/2023-2-Squad06.git # Entrando na pasta do projeto: - cd 2023-2-Squad06 + $ cd 2023-2-Squad06 Tendo feito isso, instale as dependências do projeto com o Poetry: .. code-block:: bash - poetry install + $ poetry install # Caso você precise das dependências de documentação, use: - poetry install --with docs + $ poetry install --with docs + +.. warning:: + + Caso você esteja enfrentando alguns dos seguintes erros: + + .. code-block:: bash + + Error: pg_config executable not found. + # Ou o seguinte erro: + Python.h: No such file or directory. + + Isso significa que você precisa instalar algumas dependências do sistema + que são necessárias para instalar o projeto. Para instalar essas + dependências, use o seguinte comando: + + .. code-block:: bash + + $ sudo apt install libpq-dev python3-dev + Crie o arquivo de ambiente usando o script do próprio projeto: .. code-block:: bash - poetry run ./bin/create_env + $ poetry run ./bin/create-env .. warning:: @@ -71,11 +94,17 @@ Crie o arquivo de ambiente usando o script do próprio projeto: Windows, crie o arquivo de ambiente manualmente usando o arquivo ``config/.env.example`` como base. + Você consegue gerar uma chave secreta para o Django usando o seguinte comando: + + .. code-block:: bash + + $ poetry run python -c "from django.utils.crypto import get_random_string; print(get_random_string(64))" + Por fim, rode o projeto com o Docker: .. code-block:: bash - docker compose up + $ docker compose up .. warning:: @@ -85,8 +114,17 @@ Por fim, rode o projeto com o Docker: docker env: bash\r: No such file or directory - Isso significa que você está usando um ambiente Windows. Para resolver esse - problema, olhe este `link `_. + Este problema está relacionado em como o Windows lida com + `quebras de linha `_. Para resolver + esse problema, você pode usar o seguinte comando: + + .. code-block:: bash + + $ git config --global core.autocrlf false + + Também pode ser necessário alterar as configurações do seu editor de texto + para que ele use quebras de linha do tipo ``LF`` ao invés de ``CRLF``. Para + mais informações, olhe este `link `_. O site estará disponível em ``http://localhost:8000``, no entanto, é necessário rodar as migrações do banco de dados para que o site funcione corretamente. @@ -95,7 +133,7 @@ no modo de execução em segundo plano com o seguinte comando: .. code-block:: bash - docker compose up -d + $ docker compose up -d Desta vez, o servidor do Django estará rodando em segundo plano. Para rodar as migrações do banco de dados, você precisará criar um container temporário que @@ -103,22 +141,36 @@ executará as migrações. Faça isso com o seguinte comando: .. code-block:: bash - # Isso criará um container temporário que executará as migrações. - docker compose run --rm web python manage.py migrate + $ docker compose run --rm web python manage.py migrate + +.. hint:: + + O comando ``docker compose run`` cria um container temporário que executa o + comando especificado, o parâmetro ``--rm`` faz com que o container seja + removido automaticamente após a execução do comando, o parâmetro ``web`` + especifica que o container será criado a partir do serviço ``web`` do + arquivo ``docker-compose.yml`` e o parâmetro ``python manage.py migrate`` + especifica o comando que será executado no container. .. note:: - Você precisará executar esse comando toda vez que você atualizar o projeto - e houverem novas migrações. + Você precisará executar esse comando toda vez que o projeto for atualizado + e houver novas migrações do banco de dados. + +Se tudo ocorreu bem, o site estará disponível em ``http://localhost:8000``. E +você será recebido com uma tela parecida com esta: +.. image:: ../_static/initial_screen.png + :alt: Tela inicial do site. + :align: center Para fechar o servidor do Django, use o seguinte comando: .. code-block:: bash - docker compose down + $ docker compose down # Caso você queira remover os volumes do Docker, use: - docker compose down -v + $ docker compose down -v # Isto removerá os volumes do Docker, o que significa que os dados do banco # de dados serão perdidos. @@ -126,13 +178,13 @@ Para executar os testes do projeto, use o seguinte comando: .. code-block:: bash - docker compose run --rm django python manage.py test + $ docker compose run --rm django python manage.py test Se você precisar olhar os logs do servidor do Django, use o seguinte comando: .. code-block:: bash - docker compose logs + $ docker compose logs Desenvolvimento Local --------------------- @@ -147,7 +199,7 @@ instalar os Git hooks, use o seguinte comando: .. code-block:: bash - poetry run pre-commit install \ + $ poetry run pre-commit install \ --hook-type pre-commit \ --hook-type pre-push \ --hook-type commit-msg @@ -169,10 +221,10 @@ seguinte comando: .. code-block:: bash - docker compose run --rm web python manage.py createsuperuser + $ docker compose run --rm web python manage.py createsuperuser E para criar migrações do banco de dados, use o seguinte comando: .. code-block:: bash - docker compose run --rm web python manage.py makemigrations + $ docker compose run --rm web python manage.py makemigrations From fb40c7f62f48970b48c9c1f68ccd40b6e737b0b5 Mon Sep 17 00:00:00 2001 From: kyomi Date: Wed, 11 Oct 2023 10:11:04 -0300 Subject: [PATCH 08/11] docs(installation): remove repeated terms --- .tool-versions | 1 + docs/source/installation.rst | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.tool-versions b/.tool-versions index 7c32935..73b4414 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,3 @@ python 3.11.5 poetry 1.6.1 +ruby 3.2.2 diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 2c80d89..b5272ba 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -17,18 +17,18 @@ distribuição Linux ou macOS, adapte os comandos de acordo. Para rodar o projeto, você precisará instalar Python 3.11.5 e o gerenciador de pacotes `Poetry `_. Se atente em instalar as -versões corretas do Python e do Poetry, pois não há garantias de que o projeto -funcionará em versões diferentes. +versões corretas do Python e do Poetry, pois não há garantias de que funcionará +em versões diferentes. Docker e Docker Compose ~~~~~~~~~~~~~~~~~~~~~~~ -O projeto usa `Docker `_ -e `Docker Compose `_ para +Usamos `Docker `_ e +`Docker Compose `_ para facilitar a instalação e execução do projeto. Nós **recomendamos fortemente** que você use Docker e o Docker Compose para rodar o projeto, já que eles -criam e configuram automaticamente o ambiente de desenvolvimento do projeto, -incluindo o banco de dados e o servidor do Django. +criam e configuram automaticamente o ambiente de desenvolvimento, incluindo o +banco de dados e o servidor do Django. .. note:: From 5179f983521da4c024c4537ccfc1b0dfcf0b5838 Mon Sep 17 00:00:00 2001 From: kyomi Date: Wed, 11 Oct 2023 10:30:20 -0300 Subject: [PATCH 09/11] chore(readme): improve README page --- README.md | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index e0d2249..d89972e 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,9 @@ # 2023-2-Squad06 -# Guia de instalação +Repositório contendo o código do projeto da disciplina de Métodos de +Desenvolvimento de Software. O projeto consiste em um juíz online para +programação competitiva. -## Resumo +## Links -Para a instalação e a operação corretas, deve se ter instalado na máquina: -- Python versão 3.11.5 -- Poetry versão 1.6.1 - -Após verificar quanto aos requisitos acima, rode estes comandos: - -- `poetry install` -- Se necessárias dependências de documentação, `poetry install --with docs` -- Para instalar Git Hooks: - ```bash - poetry run pre-commit install \ - --hook-type commit-msg \ - --hook-type pre-commit \ - --hook-type pre-push - ``` -- Gerar o arquivo config `poetry run ./bin/create-env` -- Para finalizar a instalação e conseguir visualizar a página: - - - `docker compose build && docker compose up -d` - - `docker compose run django python manage.py migrate` - - `docker compose run django python manage.py createsuperuser` +- [Documentação](https://mds.kyomi.dev/pt/latest/) From d8955b616d22ce07bc52e7bd6505e17c4862cc11 Mon Sep 17 00:00:00 2001 From: kyomi Date: Wed, 11 Oct 2023 10:32:20 -0300 Subject: [PATCH 10/11] chore(readme): add installation guide section --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index d89972e..d51e7fc 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,12 @@ Repositório contendo o código do projeto da disciplina de Métodos de Desenvolvimento de Software. O projeto consiste em um juíz online para programação competitiva. +## Instalação + +Para instalar o projeto, é necessário ter o Python 3.11.5 e o Poetry 1.6.1 +instalados. Você pode ver o guia de instalação do projeto +[aqui](https://mds.kyomi.dev/pt/latest/installation.html). + ## Links - [Documentação](https://mds.kyomi.dev/pt/latest/) From b35d6d8c35735629317fa5e76a492787684d9ba0 Mon Sep 17 00:00:00 2001 From: kyomi Date: Wed, 11 Oct 2023 10:33:33 -0300 Subject: [PATCH 11/11] chore(readme): improve README title --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d51e7fc..b298eb9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 2023-2-Squad06 +# MDS - Squad 06 (2023/2) Repositório contendo o código do projeto da disciplina de Métodos de Desenvolvimento de Software. O projeto consiste em um juíz online para