From 37e2ab85a8df01e19234b53bfea3644478b2dbb7 Mon Sep 17 00:00:00 2001 From: Luke Kysow <1034429+lkysow@users.noreply.github.com> Date: Fri, 4 Jan 2019 15:53:43 -0500 Subject: [PATCH] Reorganize docs. Also add a build step that checks the Netlify deploy preview for broken links. --- .circleci/config.yml | 16 + runatlantis.io/.vuepress/config.js | 59 ++- runatlantis.io/.vuepress/style.styl | 4 + runatlantis.io/docs/README.md | 26 +- runatlantis.io/docs/access-credentials.md | 46 ++ runatlantis.io/docs/configuring-webhooks.md | 88 ++++ runatlantis.io/docs/customizing-atlantis.md | 7 + runatlantis.io/docs/deployment.md | 481 ++++++++---------- runatlantis.io/docs/how-atlantis-works.md | 5 + .../docs/images/example-comment.png | Bin 0 -> 81105 bytes runatlantis.io/docs/installation-guide.md | 13 + .../{guide => docs}/requirements.md | 25 +- runatlantis.io/docs/server-configuration.md | 19 + ...-request-commands.md => using-atlantis.md} | 6 +- runatlantis.io/docs/webhook-secrets.md | 30 ++ runatlantis.io/guide/README.md | 2 +- runatlantis.io/guide/getting-started.md | 2 +- 17 files changed, 525 insertions(+), 304 deletions(-) create mode 100644 runatlantis.io/docs/access-credentials.md create mode 100644 runatlantis.io/docs/configuring-webhooks.md create mode 100644 runatlantis.io/docs/customizing-atlantis.md create mode 100644 runatlantis.io/docs/how-atlantis-works.md create mode 100644 runatlantis.io/docs/images/example-comment.png create mode 100644 runatlantis.io/docs/installation-guide.md rename runatlantis.io/{guide => docs}/requirements.md (65%) rename runatlantis.io/docs/{pull-request-commands.md => using-atlantis.md} (95%) create mode 100644 runatlantis.io/docs/webhook-secrets.md diff --git a/.circleci/config.yml b/.circleci/config.yml index edb590a88..8871419be 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,6 +24,18 @@ jobs: # We don't run e2e tests on fork PRs because they don't have access to the secret env vars. - run: if [ -z "${CIRCLE_PR_REPONAME}" ]; then ./scripts/e2e.sh; fi + # Check the website that this PR creates for broken links. + website_link_check: + docker: + - image: lkysow/netlify-broken-link-checker:latest + environment: + GITHUB_ORG: runatlantis + GITHUB_REPO: atlantis + MUFFET_ARGS: '-e https://github\.com/runatlantis/atlantis/edit/master/.* -e https://github.com/helm/charts/tree/master/stable/atlantis#customization' + DELAY_SECONDS: 30 + steps: + - run: check-links + # Build and push 'latest' Docker tag. docker_master: working_directory: /go/src/github.com/runatlantis/atlantis @@ -77,6 +89,10 @@ workflows: filters: branches: ignore: /.*-docs/ + - website_link_check: + filters: + branches: + ignore: master - docker_master: requires: [e2e] filters: diff --git a/runatlantis.io/.vuepress/config.js b/runatlantis.io/.vuepress/config.js index ee81209ad..ed5477542 100644 --- a/runatlantis.io/.vuepress/config.js +++ b/runatlantis.io/.vuepress/config.js @@ -34,29 +34,58 @@ module.exports = { {text: 'Blog', link: 'https://medium.com/runatlantis'} ], sidebar: { - '/docs/': [ - '', - 'pull-request-commands', - 'deployment', - 'server-configuration', - 'apply-requirements', - 'locking', - 'autoplanning', - ['atlantis-yaml-reference', 'atlantis.yaml Reference'], - 'upgrading-atlantis-yaml-to-version-2', - 'security', - 'faq', - ], '/guide/': [ '', 'test-drive', 'getting-started', - 'requirements', 'atlantis-yaml-use-cases' + ], + '/docs/': [ + ['', 'Overview'], + { + title: 'Installing Atlantis', + collapsable: true, + children: [ + 'installation-guide', + 'requirements', + 'access-credentials', + 'webhook-secrets', + 'deployment', + 'configuring-webhooks', + 'server-configuration', + 'security' + ] + }, + { + title: 'Using Atlantis', + collapsable: true, + children: [ + ['using-atlantis', 'Overview'] + ] + }, + { + title: 'Customizing Atlantis', + collapsable: true, + children: [ + ['customizing-atlantis', 'Overview'], + 'atlantis-yaml-reference', + 'upgrading-atlantis-yaml-to-version-2', + 'apply-requirements' + ] + }, + { + title: 'How Atlantis Works', + collapsable: true, + children: [ + ['how-atlantis-works', 'Overview'], + 'locking', + 'autoplanning' + ] + } ] }, repo: 'runatlantis/atlantis', docsDir: 'runatlantis.io', editLinks: true, } -} \ No newline at end of file +} diff --git a/runatlantis.io/.vuepress/style.styl b/runatlantis.io/.vuepress/style.styl index f0fd8e7bc..ed600df81 100644 --- a/runatlantis.io/.vuepress/style.styl +++ b/runatlantis.io/.vuepress/style.styl @@ -32,3 +32,7 @@ } } } + +.sidebar-heading { + font-size: inherit +} diff --git a/runatlantis.io/docs/README.md b/runatlantis.io/docs/README.md index da4d83c95..215e12758 100644 --- a/runatlantis.io/docs/README.md +++ b/runatlantis.io/docs/README.md @@ -1,18 +1,14 @@ -# Overview - -This documentation is divided into sections: -* [Pull Request Commands](pull-request-commands.html) - the commands that Atlantis supports via pull request comments. -* [Production-Ready Deployment](deployment.html) - how to deploy Atlantis. -* [Server Configuration](server-configuration.html) - how to configure the Atlantis server. -* [Apply Requirements](apply-requirements.html) - what requirements can be set before `atlantis apply` is allowed. -* [Locking](locking.html) - how and why Atlantis does locking. -* [Autoplanning](autoplanning.html) - how Atlantis runs plan automatically. -* [`atlantis.yaml` Reference](atlantis-yaml-reference.html) - reference docs for the `atlantis.yaml` configuration file. -* [Security](security.html) - what you need to think about in terms of security for Atlantis. -* [FAQ](faq.html) - Frequently asked questions. - - - +# Atlantis Documentation +These docs are for users that are ready to get Atlantis installed and start using it. +:::tip Looking to get started? +If you're new here, check out the [Guide](/guide/) +where you can try our [Test Drive](/guide/test-drive.html) or [Run Atlantis Locally](/guide/getting-started.html). +::: +### Next Steps +* [Installing Atlantis](/docs/installation-guide.html) – Get Atlantis up and running +* [Using Atlantis](using-atlantis.html) – How do I use Atlantis to run Terraform +* [Customizing Atlantis](customizing-atlantis.html) – Modify how Atlantis works for my use case +* [How Atlantis Works](how-atlantis-works.html) – Internals of what Atlantis is doing diff --git a/runatlantis.io/docs/access-credentials.md b/runatlantis.io/docs/access-credentials.md new file mode 100644 index 000000000..0e5d3203d --- /dev/null +++ b/runatlantis.io/docs/access-credentials.md @@ -0,0 +1,46 @@ +# Git Host Access Credentials +This doc describes how to create credentials on your Git host (GitHub, GitLab or Bitbucket) +that Atlantis will use to make API calls. +[[toc]] + +## Create an Atlantis user (optional) +We recommend creating a new user named **@atlantis** (or something close) or using a dedicated CI user. + +This isn't required (you can use an existing user), however all the comments that Atlantis writes +will come from that user so it might be confusing if its coming from a personal account. + + +
An example comment coming from the @atlantisbot user
+ +## Generating an Access Token +Once you've created a new user (or decided to use an existing one), you need to +generate an access token. Read on for the instructions for your Git host. + +### Create a GitHub Token +**NOTE: The Atlantis user must have "Write permissions" (for repos in an organization) or be a "Collaborator" (for repos in a user account) to be able to set commit statuses:** + +- create a Personal Access Token by following [https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#creating-a-token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#creating-a-token) +- create the token with **repo** scope +- record the access token + +### Create a GitLab Token +- follow [https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html#creating-a-personal-access-token](https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html#creating-a-personal-access-token) +- create a token with **api** scope +- record the access token + +### Create a Bitbucket Cloud (bitbucket.org) App Password +- create an App Password by following [https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html#Apppasswords-Createanapppassword](https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html#Apppasswords-Createanapppassword) +- Label the password "atlantis" +- Select **Pull requests**: **Read** and **Write** so that Atlantis can read your pull requests and write comments to them +- record the access token + +### Create a Bitbucket Server (aka Stash) Personal Access Token +- Click on your avatar in the top right and select **Manage account** +- Click **Personal access tokens** in the sidebar +- Click **Create a token** +- Name the token **atlantis** +- Give the token **Read** Project permissions and **Write** Pull request permissions +- Click **Create** and record the access token + +## Next Steps +Once you've got your user and access token, you're ready to create a webhook secret. See [Creating a Webhook Secret](webhook-secrets.html). diff --git a/runatlantis.io/docs/configuring-webhooks.md b/runatlantis.io/docs/configuring-webhooks.md new file mode 100644 index 000000000..8de7d1138 --- /dev/null +++ b/runatlantis.io/docs/configuring-webhooks.md @@ -0,0 +1,88 @@ +# Configuring Webhooks +Atlantis needs to receive Webhooks from your Git host so that it can respond to pull request events. + +:::tip Pre-Requisites +* You have created an [access credential](access-credentials.html) +* You have created a [webhook secret](webhook-secrets.html) +* You have [deployed](deployment.html) Atlantis and have a url for it +::: + +See the instructions for your specific provider below. +[[toc]] + +## GitHub/GitHub Enterprise Webhook +You can install your webhook at the organization level, or for each repository. + +If only some of the repos in your organization are to be managed by Atlantis, then you +may want to only install on specific repos for now. + +::: tip +If you're not sure if you have a GitHub organization see [https://help.github.com/articles/differences-between-user-and-organization-accounts/](https://help.github.com/articles/differences-between-user-and-organization-accounts/) +::: + +If you're installing on the organization, navigate to your organization's page and click **Settings**. +If installing on a single repository, navigate to the repository home page and click **Settings**. +- Select **Webhooks** or **Hooks** in the sidebar +- Click **Add webhook** +- set **Payload URL** to `http://$URL/events` (or `https://$URL/events` if you're using SSL) where `$URL` is where Atlantis is hosted. **Be sure to add `/events`** +- double-check you added `/events` to the end of your URL. +- set **Content type** to `application/json` +- set **Secret** to the Webhook Secret you generated previously + - **NOTE** If you're adding a webhook to multiple repositories, each repository will need to use the **same** secret. +- select **Let me select individual events** +- check the boxes + - **Pull request reviews** + - **Pushes** + - **Issue comments** + - **Pull requests** +- leave **Active** checked +- click **Add webhook** + +## GitLab Webhook +If you're using GitLab, navigate to your project's home page in GitLab +- Click **Settings > Integrations** in the sidebar +- set **URL** to `http://$URL/events` (or `https://$URL/events` if you're using SSL) where `$URL` is where Atlantis is hosted. **Be sure to add `/events`** +- double-check you added `/events` to the end of your URL. +- set **Secret Token** to the Webhook Secret you generated previously + - **NOTE** If you're adding a webhook to multiple repositories, each repository will need to use the **same** secret. +- check the boxes + - **Push events** + - **Comments** + - **Merge Request events** +- leave **Enable SSL verification** checked +- click **Add webhook** + +## Bitbucket Cloud (bitbucket.org) Webhook +- Go to your repo's home page +- Click **Settings** in the sidebar +- Click **Webhooks** under the **WORKFLOW** section +- Click **Add webhook** +- Enter "Atlantis" for **Title** +- set **URL** to `http://$URL/events` (or `https://$URL/events` if you're using SSL) where `$URL` is where Atlantis is hosted. **Be sure to add `/events`** +- double-check you added `/events` to the end of your URL. +- Keep **Status** as Active +- Don't check **Skip certificate validation** because NGROK has a valid cert. +- Select **Choose from a full list of triggers** +- Under **Repository** **un**check everything +- Under **Issues** leave everything **un**checked +- Under **Pull Request**, select: Created, Updated, Merged, Declined and Comment created +- Click **Save** +
+
+## Bitbucket Server (aka Stash) Webhook
+- Go to your repo's home page
+- Click **Settings** in the sidebar
+- Click **Webhooks** under the **WORKFLOW** section
+- Click **Create webhook**
+- Enter "Atlantis" for **Name**
+- set **URL** to `http://$URL/events` (or `https://$URL/events` if you're using SSL) where `$URL` is where Atlantis is hosted. **Be sure to add `/events`**
+- Double-check you added `/events` to the end of your URL.
+- Set **Secret** to the Webhook Secret you generated previously
+ - **NOTE** If you're adding a webhook to multiple repositories, each repository will need to use the **same** secret.
+- Under **Repository** select **Push**
+- Under **Pull Request**, select: Opened, Modified, Merged, Declined, Deleted and Comment added
+- Click **Save**
+
+## Next Steps
+* Now you're finally ready to use Atlantis! Open up a Terraform pull request
+ and you should see Atlantis respond.
diff --git a/runatlantis.io/docs/customizing-atlantis.md b/runatlantis.io/docs/customizing-atlantis.md
new file mode 100644
index 000000000..d7f6cf0cb
--- /dev/null
+++ b/runatlantis.io/docs/customizing-atlantis.md
@@ -0,0 +1,7 @@
+# Customizing Atlantis
+
+How Atlantis exactly operates for each repo can be customized via an
+`atlantis.yaml` file placed at the root of each repo.
+
+* Read about the possible [use cases](/guide/atlantis-yaml-use-cases.html)
+* Check out the [atlantis.yaml reference](atlantis-yaml-reference.html)
diff --git a/runatlantis.io/docs/deployment.md b/runatlantis.io/docs/deployment.md
index de06315dc..982ceb86a 100644
--- a/runatlantis.io/docs/deployment.md
+++ b/runatlantis.io/docs/deployment.md
@@ -1,255 +1,86 @@
-# Production-Ready Deployment
-[[toc]]
+# Deployment
+This doc covers getting Atlantis up and running in your infrastructure.
-## Install Terraform
-`terraform` needs to be in the `$PATH` for Atlantis.
-Download from https://www.terraform.io/downloads.html
-```bash
-unzip path/to/terraform_*.zip -d /usr/local/bin
-```
-Check that it's in your `$PATH`
-```
-$ terraform version
-Terraform v0.10.0
-```
-If you want to use a different version of Terraform see [Terraform Versions](#terraform-versions)
-
-## Hosting Atlantis
-Atlantis needs to be hosted somewhere that github.com/gitlab.com/bitbucket.org or your GitHub/GitLab Enterprise installation can reach.
-Developers in your organization also need to be able to access Atlantis to view the UI and to delete locks.
-
-By default Atlantis runs on port `4141`. This can be changed with the `--port` flag.
-
-## Install Atlantis
-Get the latest release from [https://github.com/runatlantis/atlantis/releases](https://github.com/runatlantis/atlantis/releases) and unpackage it.
-
-## Add Webhook
-Once you've decided where to host Atlantis you need to add that URL as a webhook
-to your Git host so that Atlantis gets notified about pull request events.
-See the instructions for your specific provider below:
-
-### GitHub/GitHub Enterprise Webhook
-If you already have a GitHub organization we recommend installing the webhook at the **organization level** rather than on each repository, however both methods will work.
-
-::: tip
-If you're not sure if you have a GitHub organization see [https://help.github.com/articles/differences-between-user-and-organization-accounts/](https://help.github.com/articles/differences-between-user-and-organization-accounts/)
+::: tip Pre-Requisites
+* You have created an [access credential](access-credentials.html)
+* You have created a [webhook secret](webhook-secrets.html)
:::
-If you're installing on the organization, navigate to your organization's page and click **Settings**.
-If installing on a single repository, navigate to the repository home page and click **Settings**.
-- Select **Webhooks** or **Hooks** in the sidebar
-- Click **Add webhook**
-- set **Payload URL** to `http://$URL/events` (or `https://$URL/events` if you're using SSL) where `$URL` is where Atlantis is hosted. **Be sure to add `/events`**
-- double-check you added `/events` to the end of your URL.
-- set **Content type** to `application/json`
-- set **Secret** to a random key (https://www.random.org/strings/). You'll need to pass this value to the `--gh-webhook-secret` flag when you start Atlantis
- - **NOTE** If you're adding a webhook to multiple repositories, each repository will need to use the **same** secret.
-- select **Let me select individual events**
-- check the boxes
- - **Pull request reviews**
- - **Pushes**
- - **Issue comments**
- - **Pull requests**
-- leave **Active** checked
-- click **Add webhook**
+[[toc]]
-### GitLab Webhook
-If you're using GitLab, navigate to your project's home page in GitLab
-- Click **Settings > Integrations** in the sidebar
-- set **URL** to `http://$URL/events` (or `https://$URL/events` if you're using SSL) where `$URL` is where Atlantis is hosted. **Be sure to add `/events`**
-- double-check you added `/events` to the end of your URL.
-- set **Secret Token** to a random key (https://www.random.org/strings/). You'll need to pass this value to the `--gitlab-webhook-secret` flag when you start Atlantis
- - **NOTE** If you're adding a webhook to multiple repositories, each repository will need to use the **same** secret.
-- check the boxes
- - **Push events**
- - **Comments**
- - **Merge Request events**
-- leave **Enable SSL verification** checked
-- click **Add webhook**
+## Architecture Overview
+### Runtime
+Atlantis is a simple [Go](https://golang.org/) app. It receives webhooks from
+your Git host and executes Terraform commands locally. There is an official
+Atlantis [Docker image](https://hub.docker.com/r/runatlantis/atlantis/).
-### Bitbucket Cloud (bitbucket.org) Webhook
-- Go to your repo's home page
-- Click **Settings** in the sidebar
-- Click **Webhooks** under the **WORKFLOW** section
-- Click **Add webhook**
-- Enter "Atlantis" for **Title**
-- set **URL** to `http://$URL/events` (or `https://$URL/events` if you're using SSL) where `$URL` is where Atlantis is hosted. **Be sure to add `/events`**
-- double-check you added `/events` to the end of your URL.
-- Keep **Status** as Active
-- Don't check **Skip certificate validation** because NGROK has a valid cert.
-- Select **Choose from a full list of triggers**
-- Under **Repository** **un**check everything
-- Under **Issues** leave everything **un**checked
-- Under **Pull Request**, select: Created, Updated, Merged, Declined and Comment created
-- Click **Save**
-
+### Routing
+Because Atlantis needs to receive webhooks from your Git host, it must be routable
+from that Git host. If you're using a public Git host like GitHub.com, GitLab.com
+or Bitbucket.org then you'll need to expose Atlantis to the internet.
-### Bitbucket Server (aka Stash) Webhook
-- Go to your repo's home page
-- Click **Settings** in the sidebar
-- Click **Webhooks** under the **WORKFLOW** section
-- Click **Create webhook**
-- Enter "Atlantis" for **Name**
-- set **URL** to `http://$URL/events` (or `https://$URL/events` if you're using SSL) where `$URL` is where Atlantis is hosted. **Be sure to add `/events`**
-- Double-check you added `/events` to the end of your URL.
-- Set **Secret** to a random key (https://www.random.org/strings/). You'll need to pass this value to the `--bitbucket-webhook-secret` flag when you start Atlantis
- - **NOTE** If you're adding a webhook to multiple repositories, each repository will need to use the **same** secret.
-- Under **Repository** select **Push**
-- Under **Pull Request**, select: Opened, Modified, Merged, Declined, Deleted and Comment added
-- Click **Save**
+If you're using a private Git host like GitHub Enterprise, GitLab Enterprise or
+Bitbucket Server, then you just need Atlantis to be routable from there.
-## Create an access token for Atlantis
-We recommend using a dedicated CI user or creating a new user named **@atlantis** that performs all API actions, however for testing,
-you can use your own user. Here we'll create the access token that Atlantis uses to comment on the pull request and
-set commit statuses.
+### Data
+Atlantis has no external database. Atlantis stores Terraform plan files on disk.
+If Atlantis loses that data in between a `plan` and `apply` cycle, then users will have
+to re-run `plan`. Because of this, you may want to provision a persistent disk
+for Atlantis.
-### Create a GitHub Token
-**NOTE: The Atlantis user must have "Write permissions" (for repos in an organization) or be a "Collaborator" (for repos in a user account) to be able to set commit statuses:**
-
-- create a Personal Access Token by following [https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#creating-a-token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/#creating-a-token)
-- create the token with **repo** scope
-- copy the access token
+## Deployment
-### Create a GitLab Token
-- follow [https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html#creating-a-personal-access-token](https://docs.gitlab.com/ce/user/profile/personal_access_tokens.html#creating-a-personal-access-token)
-- create a token with **api** scope
-- copy the access token
+Pick your deployment type:
+* [Kubernetes Helm Chart](#kubernetes-helm-chart)
+* [Kubernetes Manifests](#kubernetes-manifests)
+* [OpenShift](#openshift)
+* [AWS Fargate](#aws-fargate)
+* [Google Kubernetes Engine (GKE)](#google-kubernetes-engine-gke)
+* [Docker](#docker)
+* [Roll your own](#roll-your-own)
-### Create a Bitbucket Cloud (bitbucket.org) App Password
-- create an App Password by following [https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html#Apppasswords-Createanapppassword](https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html#Apppasswords-Createanapppassword)
-- Label the password "atlantis"
-- Select **Pull requests**: **Read** and **Write** so that Atlantis can read your pull requests and write comments to them
-- copy the access token
-### Create a Bitbucket Server (aka Stash) Personal Access Token
-- Click on your avatar in the top right and select **Manage account**
-- Click **Personal access tokens** in the sidebar
-- Click **Create a token**
-- Name the token **atlantis**
-- Give the token **Read** Project permissions and **Write** Pull request permissions
-- Click **Create** and copy the access token
+### Kubernetes Helm Chart
+Atlantis has an [official Helm chart](https://hub.kubeapps.com/charts/stable/atlantis).
-## Start Atlantis
-Now you're ready to start Atlantis! The exact command depends on your Git host:
+To install:
+1. `cd` into a directory where you're going to configure your Atlantis Helm chart
+1. Create a `values.yaml` file by running
+ ```bash
+ helm inspect values stable/atlantis > values.yaml
+ ```
+1. Edit `values.yaml` and add your access credentials and webhook secret
+ ```yaml
+ # for example
+ github:
+ user: foo
+ token: bar
+ secret: baz
+ ```
+1. Edit `values.yaml` and set your `orgWhitelist`
+ ```yaml
+ orgWhitelist: github.com/runatlantis/*
+ ```
+ See [Repo Whitelist](server-configuration.html#repo-whitelist) for more information.
+1. Configure any other variables. See [https://github.com/helm/charts/tree/master/stable/atlantis#customization](https://github.com/helm/charts/tree/master/stable/atlantis#customization)
+ for documentation.
+1. Run
+ ```sh
+ helm install -f values.yaml stable/atlantis
+ ```
-### GitHub Command
-```bash
-atlantis server \
---atlantis-url="$URL" \
---gh-user="$USERNAME" \
---gh-token="$TOKEN" \
---gh-webhook-secret="$SECRET" \
---repo-whitelist="$REPO_WHITELIST"
-```
-### GitHub Enterprise Command
-```bash
-HOSTNAME=YOUR_GITHUB_ENTERPRISE_HOSTNAME # ex. github.runatlantis.io
-atlantis server \
---atlantis-url="$URL" \
---gh-user="$USERNAME" \
---gh-token="$TOKEN" \
---gh-webhook-secret="$SECRET" \
---gh-hostname="$HOSTNAME" \
---repo-whitelist="$REPO_WHITELIST"
-```
+Atlantis should be up and running in minutes! See [Next Steps](#next-steps) for
+what to do next.
-### GitLab Command
-```bash
-atlantis server \
---atlantis-url="$URL" \
---gitlab-user="$USERNAME" \
---gitlab-token="$TOKEN" \
---gitlab-webhook-secret="$SECRET" \
---repo-whitelist="$REPO_WHITELIST"
-```
-
-### GitLab Enterprise Command
-```bash
-HOSTNAME=YOUR_GITLAB_ENTERPRISE_HOSTNAME # ex. gitlab.runatlantis.io
-atlantis server \
---atlantis-url="$URL" \
---gitlab-user="$USERNAME" \
---gitlab-token="$TOKEN" \
---gitlab-webhook-secret="$SECRET" \
---gitlab-hostname="$HOSTNAME" \
---repo-whitelist="$REPO_WHITELIST"
-```
-
-### Bitbucket Cloud (bitbucket.org) Command
-```bash
-atlantis server \
---atlantis-url="$URL" \
---bitbucket-user="$USERNAME" \
---bitbucket-token="$TOKEN" \
---repo-whitelist="$REPO_WHITELIST"
-```
-
-### Bitbucket Server (aka Stash) Command
-```bash
-BASE_URL=YOUR_BITBUCKET_SERVER_URL # ex. http://bitbucket.mycorp:7990
-atlantis server \
---atlantis-url="$URL" \
---bitbucket-user="$USERNAME" \
---bitbucket-token="$TOKEN" \
---bitbucket-webhook-secret="$SECRET" \
---bitbucket-base-url="$BASE_URL" \
---repo-whitelist="$REPO_WHITELIST"
-```
-
-Where
-- `$URL` is the URL that Atlantis can be reached at
-- `$USERNAME` is the GitHub/GitLab/Bitbucket username you generated the token for
-- `$TOKEN` is the access token you created. If you don't want this to be passed in as an argument for security reasons you can specify it in a config file (see [Configuration](/docs/server-configuration.html#environment-variables)) or as an environment variable: `ATLANTIS_GH_TOKEN` or `ATLANTIS_GITLAB_TOKEN` or `ATLANTIS_BITBUCKET_TOKEN`
-- `$SECRET` is the random key you used for the webhook secret. If you don't want this to be passed in as an argument for security reasons you can specify it in a config file (see [Configuration](/docs/server-configuration.html#environment-variables)) or as an environment variable: `ATLANTIS_GH_WEBHOOK_SECRET` or `ATLANTIS_GITLAB_WEBHOOK_SECRET`
-- `$REPO_WHITELIST` is which repos Atlantis can run on, ex. `github.com/runatlantis/*` or `github.enterprise.corp.com/*`. See [www.runatlantis.io/docs/security.html#repo-whitelist](/docs/security.html#repo-whitelist) for more details.
-
-Atlantis is now running!
-**We recommend running it under something like Systemd or Supervisord.**
-
-## Docker
-Atlantis also ships inside a docker image. Run the docker image:
-
-```bash
-docker run runatlantis/atlantis:latest server i`g=3L5Mj{(Pc$vznHakkOu>{ zKdRR&&&^%!hw!RJtM&r7ytb-0cz6R4@qwA|a&l+xLc2+O9weT|oouipmm+i5kNvg6 z5nC&wbCCwqB?lwS6VV;!9==`v(AQ30Q=E0LMqH;OMl8pV!Rv>*KFg}JP34t#QG&4a z_M@oxwN|dAMd)50OEgbB8!881a{B90aaqkqVt9{Je=nIP?0H=h8+S{BlWEz%muVfp zIg+T#Oyds1`8C))UT^t!!cD_e_|?c06u48jd|bWAcy4QS2*XFWb?TOFbdwJuI7Y_U zHS0$3dg>nYHd=PtA*xW+4=BE6I`dG7eqJS+n@Lxc>DdOenlJ-jmjn5UUl(QC`yFx` zlQbqYL$`;lH;$d7!s|S #*b5!~ 3d^5i_kYcd8}lA?m3swM*8#1KA @WnDsP_!?Jr`dcE@m=pb~kCi7(8f@g$2L&7(%baDEAE^;_5KZ1j@H+Z27DV$QF zVKSRL;Lc_*$IJ+(wdl|P$huYo;AVH7E-u==KuWS=t=DCxdRxZ*(+gzi>NY{(fHpj& zxbl43kgst)Q@UGyxJ5MO3lmpVNQ-ZDWaVI}?{$@_J8)Z!-13Hpx$+|%na|U5<3)RF zO6x>tJ6*G?XYu{psz|G(9|?@t10hpiNV`$+Qb~EKSkY3JBS6XXUBM)M-@0hj(y7_j zMTN|%(q6YZWtNz(R}8=*-z=n=^3b|)LTGe1>AmxVh6)JDK)CyE$@75d_;ebfSWs@_ z`q*N6_WD+?+2vlN6N^J@r!B0~jxmji^X@hT`}jpIuK7C{8ZP>g43mMd$g#NwAr)hL zAOZoab6Xm+(4F(x^`b>v0 5+aM?~s%<_ncW`Vh>7cTCY5V?EZAwrp z&z9H{9ip`pxoA`K(w1FgRp3!Ch1aE{;uz-q C>axl{_zu;(g7S-my~^Jfogt)8w7JY9_{y zc>&GmCaNorc5Fc9-X1Q>oVq6=7hkr51Uy!E{9dYs)iJP|j>htybgUkieRdd>>c4^M z?`S{y=C2jirC(+F3@{Q$A)Q>$Sc nE+ zoxi;jh&;*))U??2ec H`6>X QI^*PQ3ruGyHu2NE+vSq4hT2d03~9h^%Z0S zc72Zx>w~?ui>E$CNC<7i3Qi?<2ZzCW#+AV7E4(+ mm=S#1ulCdQ8=ce?q2eeNbc#j(p!` ;YwC#p zNtUj3r~CU_UWIy43s}!y@$@XJ=~7zJ*8fK?*(QwerljawsK<&@64P47hGhhGjzKMA zn7#L}U|vB2OaKF>T+@^+ex>k2-D=??H0OHvVdKQ@N2PW}Fq6TTvseFK=+2cSUFh=f zKq}^7i`bv2vdtpkpD9KcOyeso3s(=oN1tiW7^qE7J9rXyZGzRIN6_Xdeq!tL-NuVB zyZLPNj^>2*8!9e5Xz XoZqb0L%*f(SL4nD6 z8Z%DmCkPFBkiK >9`eQtR^K^1ohmc>|J z^8bw1=*o{5sO!{xL#{XV`>1Z~UE|Eg`Y~@GSCMWMQAQXtRk(`?W;5P!WFYorwBo)Z z(?v~KThd`i<$wdQZOL2Wg*&nvKR`U9sV{H|%}VI$W3C>m)^V$u4!SKO|5GPbW=x5` zkG9c~uER2Vjr$0JqAli#B6ca4LxH8$eUn9u_<=h_rP!?O` iDBk^pn~ZK( zPZ+S%X8W4;pull;dBcxo_OcDJ&l-@f9CUefXjIwc?vGx?{= 5*Nk23-zxMPh8v@g}D6%G~f*7Ph(oK5~VnNF*@kf($ePWo}4opBKtyd_RbU5fu~ z5K7x?CK_%Rww-C7vN*b#Jx4+2dLpZ>%Q*5#pVZblL@~u>;ZM6K?ytZs9I@O-)TK7` z>sS2J;Rp3>YR*Uu=q1N`fYk4!%`~P4VesCf) lt(%(EP5r zx{ezge1q#TIiv}h>P^x=Qae~G$!jHP+CXpL*5w?%hHK%Y2S x3>$C^ zuPnsT
3jmO$yO%?3+K%d1~;la&BXF=|ZIIMdvtL(pDxe)FcW zv38!ZW{bS(g)T5aSNeG~GJhp4hj3pOWo+#z%F8WrHzr2my_@-1Bb8{ip>Xr>AG_ai zN8~D;!~$+cpgI! Mx%rxrHQ7h?F9}CpB-9mxu!QHy>(^9S0BAc z+S-pO+R%H4JOtFbL`CkDl#{uZP;ikwT5YaiGTg*n{sLAJQXd|>WU4|-Tk7%9r}Cw` zSXnqwJtDE^o5#|ky193(s#=`$500|?ertnJ=ol>0)ydnHh1+|pAVfw@%Ie+k*llgP z3asfTumEg5 8GOlsx)LR3eIxrj(1)6> z8mm3BPG0HTO{qTb49Z$3S@n>Mdhp~Oa$HY~W86nU&Y~35p?DK5=m79JWFSyZycvZ$ zfigkqv0p1@t01;x(BD)`i5@JDQc_`@3OZ*<-615` +v`-y0sP!8Q$iO&CD=)5o!gdvo@9hGcJp`+tqQb cG#p5=)1{~}4%KbwEFDbDDP=m_0-IEOrZ}&(DBHk9;1|lc^ z5FLasamm}kclwHoU_JoH`x|zH?*N9`^9M}9`OP^wLV{FD-Iw3+`qMsDm8|InpxTax znWNy!1ykbj9kWaIw;v%N#9gHaB2O}X(z0oFi;t+^Z9iVV3Jg~oLm`U74+1N{0kEZ9 zh$X3dfDW4;8tj7yY_a9$%Ox;5)0Mb3Y>Sz`T=^q!xx|r(zSsY<_hQX)0w6RtWN833 z;xfn=-ctEOaPRR`xEVam 2&7oOElm{_ 1#M5(<~kMXq9B8|7cp1pua%z)qPc zolpZ} uyb~9{1zd7k89JmWJS%;RKyo<>|Q^#yqd3kYi@S$ZfAPj$KH?6;=ADN^nE8QGN z+%g58_HBk;o*mbJ9tejSrVLQo7f9V6q5!mQn8!EOo5tJaU2;Ey+Rhi!a-|~bmf-o@ zI;#}htL__EoK*b%kM5|2(o_#22P}Wu$X}B!s&viJ%d}++jHyC+pi7$m0eAo0t+(J2 zx`9!Xm|@qqs$kGHz?`$}`g?`ff+DM`z~gc<0it6Y2Tx?l%4Wh7VC#p-oR!G`4;ySa ze~wp)Zj;r189!U0JzpvNaLWrXLYSzul%UpTEaj$(YIloT&Rat=z6GX54vHw(#lQ=A z-a3k;QxLp9V|SUiz*r~S4sdyXPR|SZ-F&$Wik;|hy5D?2Ja2Zy8_g4_c%4vIsR_c4 zDgBt3?JwSG)=c*-uuuvLjuC_r8Ayzk7?%0@hT_VV$RzJhnK?|fq5ljudgoN>){V Yu;srI>AW~i1P6@$@XThtg2}nM{t&J_zZo#gv8&pC{Mp^h3ZCBSyN9Th%LUYa zVoK}92J92U^Lk33OEmU oB7fFLJNWU6q!~gnU9t8pD6r_))L4hPJdH=jH+aU6X(TO2tkWa?gh bk qzB0mGRh%94bo#3MnmHWF;CL<>?lV5N&sx{We(@r zY5U_XabykFo8Rgs%2RpmIZhGmT@lv>nb(lomdGZ*bK0n=+|BD-#D?h6@VD58LK_Wx zrPJCV%%c{;l<4)F@j`0u-edgE2}V%@N?L@Ng 6&F;Vrok~QCp0nv%4O6S}H!T-Y!M~Eq!3bU6c&gC*-h-#^ziygoFY<&l)fJ zhIF!*oXG;fO_g+bmTVHjg#(&-{VwvZzhukHEmiy18TQZ4b~ogQfB>CDd|AZGoPqRp zChJl-d@btSsJuJ0V*}rIJ~_3VSwWw|;jhl p -d}pFY_K+cwt3yiN^ZQkT zD3^ZRpGNC(@`6b_vi7F7d+_3&SF3&}^~~3I8i)a??Z@onys#O`4!5e2^0RsFop<6H zMpaA`;~k>P$=92;z|EVt`d?bWjklClnJ d!2*N7ScKmz`Att(=@*LvPC^ec@7 zFnirT3DU?Svsa$PSLHQ7=xAbw^V|xzBlP1gs#n8f@kCPt4!yy5g3zF-mR|I!&84c4 zD2{g`9k?9>+&&jEK?5;CB HOxj(T%zACrr;kwJkk=rtV?_{>wnL|=K>EKkHHWCg4#J0dwOAMSI zUHA6?G7i(!Ptl P>r8+In|pika-J@%Brlyx=F!?WwNhl;==;Ru?%l-sOjjE#7w;fZVnw>G9!7n zCAklypIhrb6pX3c26H>?%sc3|I>(S>@@nunACkh$RF@ Xs;&Zp zF=s0o@$0>fnDf5uAB{oBQ?>6da@a@z<&n3YFS)8f4Hi#FX?(|9oQ9lB%b-gOMLY-j zFDf9;wt_o5Ch2Rx=qBTQN*=ePC5X~T-})Kau~#nTtbZE(_9wh{L>Ae;kx3xCyLg%> zuCtNp@;Yx6^}iHE!RWC#tuK}H?p1nai?*$e|DR%0>i*(g>U3+ReKGSeF}(WkZR4b; zMr&I9Odt1E*%uy-30L1#p;k>Bn~0%X{0De=uooCns%Wr*iuWv1@KO?rOjjhHV3#u8 z#QfX;(N`5B#-0sPV_V6Mq#B<&O|$ihrpojlWtT>_H2QNMs8&vJ24Huk=aS5!Y9QR7 zYq(}4&v)P+>Ds@uj0q~Ngmk_4f#d1@8Ow4=7i(SewZO$`#2ccleH9jlmRr9B%&L z*b2#B-pVRU-$f&kE7+n_OTNc`a_D`v(^fkZZM@IyFf_;e7wa$Sh MufX99&Q)TINAZa9Pay(-&f{Dx?^+6` zn!Jvg2uj*#h~zEy8PA_P+l)o&@{d$UzrB44Z9VZZ@9x~?9tp{|(UVANtbR4DJ-C82 z$Qk|)!0&E_CY2AXFAnO3Y+Jjc*TN5WnxgOe-T>M{zQC++f=)WiZnq;k2`7`*V{w|T zcI%JdHWJKX^1Du@&5eG$!2F?mCGh*h;HiOnD(9F-OaEvj!ROAqHL9CwSNU?S_634p zFqx;wYEG%gK3A`&t6%UJ=vVUAeM31`a$hcFf!aLLoAYgJk@1~sc`ve`=ewNfdD~uE z^23Z3fjA7erfmQKL_t6wlxbmfS~gfIwko>1`0flg0uv(dsQ7-CRO5B>4O6xwn#2Tt zi1C=Ry-5CKWGlEEgN2w#yJ_d!k$*SEoY&9MkyL(2d2>jvc2$gaFFouY4iObLCIrWA zJ03DYoIY0U`3cI77}IkVxq%&cSQ_cDx5;DO+9#L1C-u#*9BmjoehaS196tsm>6x_S zApRf1z5*)Bt!r2i1yoQ%kZuqW5b18|Mv#{7mWBb8R2u1$4(aZZknS2_U_iRNVc>tb z-21-w-uK6Ety!!Y)|vh6KKtym_a1v&XROyVMs_YHL%BcpfHDUQXO=@R7n|lJ)}TFg zofd3Uy$^6?zoiJ2mrtKY?M*D}1T-T2at`2daGbHkT{pzEknv{*J#Fl(TX}HK$<^%q zf>0l+>_=MvNIi9AW9$aV*x45~yRkM$_F@HV|8e2z*0N&J>hZ@yx2Itrdn3mb I}6TX6L;2eG|qVTW@01|LqrmZn`7^L&K<&BoC@} z2<|(Lu+La#{X00l1U1f`iUf#i!rt8EzLOFoV*{D?##oyfO2PG^`&VZgSu*F-Y@=QE z7WI(ix`eAOE1;#kVO}x|4k+M<(#zv{y|@xPrHxC2_#bWf-9L_8_O^-Y*v96km#II$ z`t?B^yud;j)PEtzOC^Non{-xTd061gYLhppfL0tHZE{34WQ_b>hnKiSXXy|xwDdUx zLkViIWRTZTbL$g}iPzvaAg}lR=#H{z!)HtG`$oM};}=b9zFgUD7l%fLtc0=zk;nq} z93txYU9B$3m1VBI>Sfw_(so-a7&W*rRN=yfFt!3|7+SAtn3?E3PBf29-8SV{!<@mY zgAO?xhxWv=^3zacIP&NVii6CAZN#U(EMW0!(PifX5M$hS_E-VIQ3LiCb1w3~um7I} zP eB{2p3`;QC`6EdQ?!bHa{yMZ| z(igS);>nkW3WPRUeH5}Yg$WkWT&@~v{SdA}ptaVZsqB`r{IC~D2bqJ`ji=h5*({2M zRpbH+swSI*hcFnBWj?_FDrTksqnK5i<(>y^G$uD9@I36VZ@Xk7m)b(~9#ry}iIa5p zhg_iTnxqTG2Cyki-qKeoFiiR_wE%p1 7+60F)KpP4YvzyYimxz- zubBlbf;`T}bs~pL$WkYgjLQlVu8Vd*|0=67U!2&+jpKlsE{RcURjt;h7~yDC#H+9~ zm_7H_zwa0!m{1{!@(cwFl?m+w;=gm~e^!tNOMV+!NQz~$uRQeHd4OHvAbAh197N^-N>(MKv znPSjL#vS YWDMnf@2;*FYK`tSFSSdRSssh3 zsR1 _w^h@zi==!>1?@PP-*C !04oJ6y^yMo_TD@=gfdV!X@6HuHfT z;RxtM`9D!ee5GJGtGPG#L9L|mC8D(Q=D=%>Eq)g%f+gB;6F_Q176Z7qNDc6}4p=}t zj!<}yy4p(!n6J!=Ys3aMh||&Qz KVe{$o}VBQl9Hppy%-#e6ciO zhIb?bgp|sE%>p3K#4f6^42`yflQm#PAU2B#$v#Z_cx!{)lLUzP;bc<8j*%DDk zty#c)xn%0Sj#a2QNcK$!SFj6$ZW`0-zQyh2gky=T=?W<{uv+@^>>s9e KWpBb{ zLMF3>n?s)IlIv#sh5T hIkHMrQlE7CxX zSphI~t!IGob_|+OGs<73ihridTZq8T>OPzMJnN%)V9{+9XLm)bA!%jgDue~}!>_ES z{!b<1e_IsIo?JKS1-_(x9@!nlAvhuO{v!qz*RruSSNJzKz!7jUefXbT>0dN>37`Ni z@&rv6 )TNWF8WFXR$t+a zbgeVqn$SX@$@7TB1A1{I<6dw*_@@&5tr6!3Fzo>49m-WwsXSkD >>xA?FpUS6cqNG}mn ` z3qp_&aCFJ xNf zIUGFEO+y#Z^t;u3!rlY(7Mc^oUPNM_C(WpI*w4JgoVNZ
z$6H>$zJHtiNuz)f6CxbYdzn#o+s2-qMGwcsoQ>yIW-7&`YAj}wBT^y qSHLhx6$br@_Fkzy+V4aB+}UK`TD%V zz ==)rz_w_vI?wVY;;ZRSMf>{Zu_YvNJcF0U>`iIxan7Qs1 c zTAL%?1vC=trQ3v?`uOMfd@zNQYq*y8Mr{??XKEy9PUOpklv^g#_m&Mua#@Q|Dt&x~ zfl9w7^fxpA=UWqZz~cn-BOiQ2Kmxip5M*rVZsQ*y2Npzc%c>2MnCz@m>A>ztXK_hj zn2C6xsZrQ}`0`KiUILicGgO)-WPHgun?>qzY+k%F47zRc9V9&oQkbI_549d=0`0hC zJ+93Ia-)vhm#0ZyFZT(|ktGTK>4qRoc&op-gM|O)X02Z@t`qW;fMY~-XP)1fHt7>G zZ)d0j1~qviX&ywD6!x(C2xjy2HxF1Ne_~z7&@7_G+ &e*qVf_Dbx4Xug{>1_nc z0P6F>UukZqRUG|>RLb^RiC6`IH8edxR#9#TPyMG{scYpiE1 d~T<2vkkqjrFo3Di`szhRE;pUmN~Pr>F5JVum# zVDjj;XdaL&1!h2%7Orj@1`RhJ3DNew#GprbSho}Fe6yT9xhw&(|1$s`A>$Fot$HRP zjrxbAFosv98`|a@yp%#;QQW?@Jkh%0yol4KVq=9f !onjk0~ z6%f=pe-g#*%bx^%z2Rhd-;+agswdm`G|i2xQEm+}fS~nH-t^I?3Q=CGF~ur@!|je= z;2ZUg6`J)S7~>0ETOoqhqRMYDdUc};? $@L!{_-=1`*FFbC6kD>97+V2%Vru;5?8z<=Z8zrqd^ zksHNinKPi7PY3ikGMr5Rc3wV_yIJ09@2E7Z20*9v`bu{DwiZBpgNz }>FIYc+n<=QAnslgvP=p@9yGZZQLeVWe)$i5Aq8CjwObEZI~W8+ z@~V~Wj`uj`xV$DIyFxQwAU;L{yZI7fsjomfmPt^*VESXOPOcxvk`Xe`TmGp?X~2&5 z$IdCIYsUTzpm?$zj~7W#N}y#7=yLygL`J6G-`Pi 9{8@FBPx19R4mO6a}vKZnaGe*V)+E9&+5#{uy26nXji z*l^UhuV25OH=9Kp4fRV@6$S=42bA>^EIUL2wJqYrZgaE>`n~g^JTH6W-<>4tWW%ZZ z8%`pmlg@&HM2EpeZ{+iq>sW+!izeCiO @^UBa z)BR2r4J$G+LQqZ$2FHR7s^hPG&lEbPED%wt>fN*BNTA6>%W=YmX2QDTJw>a*NY42r zfpur`F9>v>-{U-LVR3OZCo+eo@p4In6Rxv-;vg4%n&SC-a9dM}GuEulzO8N7{q?Ta zb^QnQaA-(z0<=7xsh2)*)S7-p^XX`cf}zFC;*&)w!IPpIE1&wyC8%9T6LOb_Q)p;+ z;$Bz>D$CI_=^nAYm?csK+%2=R#2)Qm`fvHC{#&wD<1k&Tg*=fm rHqt6JSqzN1MMSKF^ z6-=#E5(M`*)t~NXR#%H~Ic$(_LaRcpka-JovuA RlM+G|5KW#yL8HYK{t zI`gsoDBwnH%-IHL%gh8?Hd*`H_e4rPi&`UyEdLqmbjtkcxV7bMNwffOlY`*u8(6np zt)*UJwy08&pZ9gKTeahBQC625iG^$3WgN{VP2Fbg7Y)WiCm`x}JGQbL&It!ikGdmy zGQJ}X n*>r^> zxAPQ=l-gx&Szo g0%C0EzUAMNlt*d5!maM?jett2$ zm_F_@j%?g9zl7Cog?Rww%-fpvkF&0J{V(=|%FKCGTE@^|#@qPI`Yz-XU{$@&kbiEB z-V4+>A)sARc6BHNu=|YMX=rXe){%<_T3N?(@=o#i&Q6qSPWDod;_*-TozKxaJ3Dg~ z*fD^qU_KAfLwP=U4lop|H>g_?x%t;0_SGGoX*mT&Q9S1FDS#^b28se@Ghufhm&{jh zC-2&I2qM?&o8@r>-8R9jStid62!@Ug*h$HySqvOnw_zsk=z8?hIoYj1T? 4DW1_x?7>!H z)sY)BbPNWLf9+9!W=KWEZ^Vm26R=i+b#1Mq2{t~c4XVP3({|9!y%FaAiLCk(_+9AO zyDM`@A=cp=6RQZ3D&UqxeIz1LHB#w&i8z*&v7up2Z-I8h8|7C61Na3R6@^ZiTL2u7 zm55BK#UH|<*qc|E=V;;n+bOe0RGPZv3T=fvQR~g3UlzhBLQ3YHPrOk}A#I5dz4NEN z c)(+vU9U zu*!pr(#7t~jEoUKRP*Qr^YxKKsdn}E^)X}d%P~<=(CyZ-Hg5W7>++UQadEqc47)cC z;j$yGTNNG*4Vx?PM$TpU@8ZMq`BKEJ-BORzcR2$pUX_fyGZKMDY#mWTc`m$wwz-g0 zzsM)ctSNovGoTo8pTK>_+7aq6VEv6}obRvTYrG+ojjC(Y&)NSKScoIuY;crKX%ZP^ zKve9H?^fOH1G^feN$K*9(X>i%J=+yCJf3zuG*>~30QyQBr`)bSjpb}MI4@xMcivmR z6gxZIoaeQ?9vF~r2jRsM+2=Mn34y?zm9#zJGT^E=qf+zHgXtC^ADdv?zE90hsmmK( zeWfpU^b^u&AtYc2wC@h6Sb=OuVkDkIR^WLCWWnG~z;{wr&A5J B *=S9&3p6Og2$WamaD!OjF zK?i6~xm%UD)FS^l+B3 zW|QOH&LtK4kvj0b{kwZzu$hcxk $>V;Ltx>iG}vb!g3ShPylESdlS5WMy7xa z)3wDT>9XImBL@RA>YT{#edcD}uyxF-qF)8#O9mZr#&Mcgx)m**avThNTAbVOkAyX_ zJN0vOhxbTmHTzU~0*$g27u#3F*uCj#qP}sR)P&R1$1s}VtJq&WFsrv-7sqPGldZ?F zhc6Vj%4P(Qz81zbE-~*ke__-J&70{tv+oi_-e6SK2AK}*ni4&wY`i?;9^^c+7+UVL zbWBJ|p@HZ)6%d+Xy0SAPTIHnayN$bx$;O>k=tKb*V2Xu}dk-coW3+@mSMD$M#+(zo zi}S^vgePEY6HGY7B#G|#Zj|oJf-GGhe*ncVsyyt5?N@Ay&D%dQ*KH AAo5^n-jX9>@nI{qR2y6J+@eE{KgYwJMc))~P?q1)rO&^nnAt~s0S zT&`mZpftOBo%nP+J#>OC8+001ZVl<%f>29S&W)3J^q^ol`QcE9@Scg|IYFPrBz?Z4 z8n;9Jv~8GNnRB4th1+!jWz{5N$n^`e=L_Xrubq0PSyw5_W*>ZA#`*)heMgtnDpV(( zpWlTabBZ(6Tu8bx4A{5RN%zDam6;bG;x~ 0ee l#Gb$?L0A3~cZ#USHBI!K;Xx(}p`W+2K&Fp|E|c%{xel>! zg5xe~7M4`}ZIuMK+L)@;nEKhCEW|v(p6^M3!Ujy#=_5FS+OU(hXO|9* -rEbYr{pgx*j+Dup)aanFSwp2WPZ~43odAm;RXu>>f#_%bXvV66h(9Vvn ztf7|Me31CF72Z^B^sa`&^M3wg!kW3EFIpIVrpKQi^GDDX*0)(FaYGU}i@*DKO&BLD z%xlY#76mRiY$dbJKZblKjp+Aw4O?-_UOF*_W(8X`x-hQeJq>xKpjV&EBG;-nznKAZ zc|q#9J=UA#WbEGO*!0m?QCq?4akgBFZhICoV;oov4{sEv PC_n1cyCOj+50*Cmnd zO>m $)A_Py?7W||NMlp3T2Ig!zW+FoHzYO{1hk)nB}2+^ S-z3;<)KFpj%iKT!_#cIM`Ny+GscWVqSFr4cfeohYxD@V_dxSq|da#D4vw^ z@(*|e;FJaytBdKqjw|A-bF+Xe*t0eBhY}f2DVRDY{nCN(>~0!_LJ0C>w_U~m$gXxa z0KL!l)$Uw|k{mnJx@S0Z@N&;#i~mF({+Nl+sV4Yh&HU&cf7KP&`lHpMn#i~oy*MMx zXQ9tnCs~8Qr)yHBi#T_a+D}li`a0$9F(qS9j_S4-Q;d@>t!J#DmeNCKZWlqrIv()g zoK%f35AI|qI)4NPF^K`AN(}lEYwUV=!r2bKYNxzj#X8moDp-?o&s?~ERqHQiV1<;; zNSS@RTqu)BGuQcozr%mEAbbqsJ)W22@9w XgXku72Dh3i(m%j=EW@HFUqQPFPu{?jVd;Kl9TQjmxD?m*sAwaa1Va>nse z!ufRJzI|6)1(VBAJ8SC`>qQ_$JDlV6Nat8?U>|R6RQ`sj&5>ET9c8nXjsA~Q-5qZO zs+*X&v@qihzUuWsK-Z5>`hrQ{kI-RCq7u)8?y>-)Z95aM@~PBS%4DL&S;534@&~(s zj?1P41Z%FvX{OY=eUhMuu}D{=fo#MX-vs5zFC7) 5l9&cF*>naLaBB>s( zcPO;~ws>ls{58pGs;OW;iJw*WyKM;{(?-LuY^&N|uACFk!W-_tLF-J1y@auMtOHf3 z`oA8DqxIpZYf0q{yph#1CMXmf%O%;g)VklA+J z+ga1yy5R lF{2!P9D>;5|h0sCv@6S$m-`i?Qlnio3*~oHhBjo`*duJzNrG40{1uk*gD>Z z$c^kv`4S)6xh__)Z=C*WDU8Mn_FAA{!>9yJySl9vfpLKW6kxsMqQ*Tt3Fa&Nrz4 z(C5|bH9DXqYGe4h=Bh<&Wy@pUR+|lmnl@ph%M{P9D`L-~r8h%h7p$$uVQb4)jad0C z9e1V)JU<@8<~&nSa?4|G<;uMPZ*|=n4`hvg>?%8YZU>K|5j(n=f1QLVS-q>F4#5~7 z5xsLTP8N^j_~51+dO>uJjT#pEp3>sjGeLOF( QXcTc?wm zoeH6Tfl*sdS3c(?ABuqHdw3xy@ `>GDgPnN0kmaMWQSR{z-U+-~nHzE%>eTL?D;)?QYd!?F*m)Z7@ebrW~? z<`}o9{c_)a9nO}Zt!<$7>=+bkOz676#D|qfwNgOsQf$4 Bqpt+H}$ zOwg}BUeDoJ=+u6b;{l&O>ES9DE9#F=Z*y%6zZDNaV) QgtJs+eGP4qwxi-h?zx@D^?Qyf~gZ_R_F!>ru0+5MNqYGxvwGNuxh=17lE4 z9ok)VW}ihf>TFf6PY<$gx`Xjbn%r{7JgjFN#~mKe03)P6j JU_D{W*)nIR??)s2bx(qR>{!=o{a}{89XES z{KcaU+G_l0pN|5?&n&I&)Q0cwn}gzh-jkhl5Bud_Cw_Kn)P{cNs_N@sS~;FFpDYaN zclI7%SB*P-k3@7_yZc~|_qbW=X!6cJZ`zD`>e-&}De;G;?f_x3^;I~tQSTnDzK7#` zw;9mYCum6JYD1yEZSrn+xhV)zo{U mwV!j_sHuP5+i_8xFKiDsSWlvd19 ^i z!l4RCXoPC7M(3I1k^gqXrncjfT+4(rmS5e|=J8!>g2uz8LA$x#OKTptgdIQPywG+L zN^38-6b&ed!}>GC(Nnl+^w4OZClcv&mLjAw)MdRQ#^8(hC|T5q(o&jKQP_Ma_ZvTL z*T6^krQm}7(dCqC7;;EegrBF&qOY;c`1dvT9#-WrzYGONnj+jcv+wFto9nePw2ORd zms;1Ec8i#0V?2|08P{oxTaKU;uf)BRF=a{WQ=q^c5=!GF5HKueKLnJzkXQ>VsInFY z0>*pPp~5+Ok5 HhCXK z7f &1#xYcN%J9wb86!}CdUt|%yncPu_A?G4@yAbR@ zyXPvMLle2wq+nei3iA}3EYFp-+L|izq!{^bow<9zX3$yFw@WmGth4X3|MaMmq%m%8 zIcl-|>DJK@T_GmLNmmC3B>t7tXbNKkJB%318~!$wv9}=&W{$i8)|p)_4qZRfMy(@z z@$cjM>pzd{6NqLTzy3I`TLZ^+{5#wD?3HiCfh`&sr&eYQ?$yY8Z4FCdLkgmPG+K;{ zkKRF>3KWDh l6mKr+t@5p?0C07cQ%zwgQc*(${8)ONvN4}ZG0V*TH6gS zgU6 M=1+jf|XJtIZnP{Ui zkOcH{sn^9Vm# WnWq2-@0faH W7dboQDLT zBV)rLvTzOD$!Lgmr;hjKmH7RM6i}Z0VPkrB;m^UQ8KOYcl#dulPXz8D{Pl;F?w)45 zgM_q!A-m+XV9nN#!H^MI>H6CDRw4p?o??w=(_5~Q%3(hy(o~nk==JK)dMmR0e2~cI z(V9pN$h|iWsHi_~t23%rCKl$} z9d73{Z<~iYUS@QZ9P@#=1H(H`zf{Ut*LuVp*Q+tMzU(`TMvssZe1|74O^6v36C0LE zEf<%UCG9c7L&Wq3_f^b7GmucQD75b1{W)PjI;%^e%ntYQ8u=Vf-tVwZ UEz$3K!ba~Y-AYn qsEd5{35*IZ@G$9-l^)+;OLhy1&sx_;G8Y@~ z7AJM-n>sa%m(7>h^qU$7PYj(7~VipXzgMa!Ix6WmC{{IEX5}c!$m(kbRcpugf0e$ z0h=A$?po6{RN*+%(vPa$!gL D@)NO|}G>t%w& z;EsuKKeRTtk9~T!pPK2H(yNbm5K&0I{`zB(>9t z-e2vH z(RUixds#?SCUw*XQc~A1g!0(#G}T#uX9S-~R@4_Jah+zU*T%vL_azBvKYA>(7K|#0 z5t}B1!u48V4(9w+Wp4e%4rgi(GQ%H5Q$B41t&d_?PZiR)i3$rXT~?~no-en`N_Qy9 zD9WpUe%w7!;-SI1vW2kpl)uRXIzxrApLtm@S-tzvKIVKbv-@H~QNU%edmnyjUA1|+ zt3MLe8-Lb)Uu+?YlgN6*g4#`jwdRxOf`|TyJ+o2#YIdS~scClo(rUmAT=t4uWvD1J z&mw|q55MNU-rSa;u*|QGdGj&l@7fyp@h{OTTh6U?hW9>arH4N7)N9tz=37K9(GM-q zm3uMfT)+MU^fr=5>uI!n#K+m%HnG%Jk%Xh9gGd^kc%dnogoU3LDHf^^()`gxUG(${ zLF9TPv9?Cc5lH3{knwt dtU@cTkApME zOVHyJwue*PyL7a`cD;-Y4EKCeTtI$mONHLT7l!p1a7kk3eme0@na3c|UcVe1UI=gJ z@~qT)&jsV${j5{9{Xwaz(c@g&c1go+YRmfA7uWa{D)T|)tgj)x{R|prK0&ZiDRC9T zx+3BQMk_)&IodqEWZ4bZ8`Axxdck!9rCDyJOU_T(L(yPeW1*egDmY&?P7&2AWHD-8 zhdMT`$RvPim1ET)7rW3xb0?9Wn2!)UO^OdC+s@~Kto(y>5RDIlhm#I{Z0GJKYw7oN zeM=oYaF}%-)I-m|ejI~w0^w^Y`BJCddcM8L?)uP5pas@{T=2ELo@*gMY_(kcneHM= zVA)K213#6lttT|*wm2#Z3Nt*YM)hUO+}=7|-k$ONHsBstY%pQx8TbClYrsltsi}wH z by7hPYI5P#Y)gP) zyG)`%melL5rNZf+lQb$Ris*1giZ{V*`v$ Y6;{3bLZ#Y9gJ?oV)0>E2*!p9+`26fM*-ReHrl2LH)@ zbvA16I~KLxnLxtGWDA$6iZx6DZJi21cSC4Ta?O9nIxI0b)BbY!2o2kQ^fy0!?XiC$ z7S7jFQaAVCRr*3ZTYFc`+=x67wFX+H_9YrbYB=B4Pr Z!X(!y9@g)+ zCKQc&pRD2VQxm6~@M?VQ&SY}owI?PkbVBF&KvPQi2}B> 024ZPD2~ww_1^)}j4!g|o*syu6YLh@0_1PJXO5peW78Z)X zY1f-3SvSzny~DY`^(3^ak(a-ebr8JjifohuJAB!6aCILs%(@UR*7|zxWnk{?&MwW> z0kr604(?>g%d4&Pb-1DH;if7ny!XGte yi>R{UM!O!ao1v zg=@ETBFjXIRh7(=l#oiqlOt02{wc2Z0i-I0rvw72;N2MQspeSG>$|LNG8dbCfyy;e zb>S$9$i!hWSzaU1m-2ErN5X!eGVmn@^eEXX!ey^j(k4vAhmysh@#0=eei)@cj{=3n z>ia7ctL{sy ^tl*bQJYUy zJUU?>!?bH`k?I1g;$!J&+hDK`tfWBayWUb#fw|NNiy7G@J3IQfmC|a5KvsCosUS4? zITwL@yC*s8gQ1Exky;YBdVDOqAvVj&{Jr?9SIcsjc+RSx4$%yVpmAM)+T6!Gtx9rq zaMx$dVBtD8vz2dd _%j?;a1VttVZSUS-V<;|&6owBbZ=wVK^-Q0Vg1EQmuCr8by zxCxUuXR^*^(xxM^#WRB`kQ2MZfs8f+((Mf}Wzw^gRolGEJoCanwybSWeE4jB)#;j5uEc~lQ|j*6T-{fKK+b)a0S z2GmKO+FGNT`!Z|e_^i@`n~&KoUO^hGF6LBma@4Q(aksyhu5%!HVqN%xh<1TTScfJ) zb{lX?p)2_+2=dHWu^pudc{Sr8ue!S6jb}Z&XEs{;^X*zFO>)kq+;K`j_(X^ozOlas zKO~7gEi>XVKWlI=ff^aDd1f${TiYk)CheCo E$^YX{Fa!Oyb#c+x}i
kWCdZSB?C2rz5V7x0N+yJzI0k}pew%nicWW*prZD=eXG`@GJ) z9ajjS{6pjw2}B6*uho)Q$icsRTCTN*4+Xx+OnJrRo3q(y#CEdIA2=2}&`IX7YZ% {SZ{;z+n;mZhaY^y zXECT&le<)_TVr(q#^{{Se4?P!)-dh!mnO+N7l6ASN^er1GJpq 1R-7$~NL-^^#z4F03MHIQ>(ktAHqo;=iC(Eb5I*-4% z1v5NmlW|yuDHW(Uv`KFduW#qop?CSAMM&eb?;=F9JV;<1&L}=;ElD5EL}Lhi*NT3L z?1@E=Gon*3;POsS2t;t8#J%=QjD-1nh57I#Wq;Qy`3!V_|Lt+I)ALo;62GS7N3T%d z(&o{Bnr1^iD^iDN4aq(Bu@ZV9#{b%|luL|8bVKlgf0fxVEE$^#wzx##(6p)_1@cul z(G!XwC|m9u7QAqy7<&j>9W3~M=GG6D7PN7LnRA^ER9#JXNzF~{*YAE=hbYa9&EVR~ zkZ{<@SD1`W%DIY{=6cS+U@w^Xv1-sMXJ^j)5I{mJL0s7hcj~Y)Vltv}Hy%?{8?>KE zV2^GWdasrBv&B1#Guf)?Kynne8;=`jDkqpzLd8FxG9QSi1){1gize0MasL8&9=64> zE6;dbHB5jhMJZEB?=`ewV%c3D(na;u4&lnd*J-H->Dp 8o3rhL zjWIBi#|en4h+4|dtc+dK1phdS3bvYbcP0I_ $8__N--B{AzF4KdVc9YMXh O+t@lLw3#z8_WjRuJb~`}}fqr6HG7t}!T(CyX{e-n_ zY;~<+p;dK~HqJ5Y6wuSih#6A}7H2uE&Nj;2fd+Hj{Z{W7`CX^I^$u|3xva#VON~`k z(njR`CTN{rvT(Dw?$9CJ&I9eyXkaA1*@g$jsLtiZ@@$qcn8uYz+)gM$!hRXNU@eyX zvD$jUhSg%>Ih7zBnMOwbkTGw$|M<; S5Jn_T-m0M2ubAk|V*d?*8Lw(jjzxG{MAD8xK@;5ijH} z{;nTIy66cy3!Ma8gSpmnDCS|NTX|XxN0IdHg)_;<+U#XcGum&pkaeg!Qa%fA9rZ$- z>SO3s`Q}2ba4o~_)#Pnn{klvr5vVMmOlCk3(LxqkP5Y6j=leO&^>9WE>0D}k9BaA| z>GPr6{%Bu{(;A {QbN$5oG(^}@MAELljE5xD2P-1g;Na1vw zoV3{(k1SO6bA@v&j~Y9WCzFWiqN_`z3MW^QjAUHhtBar}Wceo_cW#`~$w3gM@DB%M z**6Ij_YqNi9%8eS5;R85$x(T|bFV9A)u*Cvjy9eo^H$bDPV`@Ruu~VIDOc(D_YHG` zVwS5=N{`&_OjeyRa2-7n2U&*VNr$4hGO__GDRq^8c >ApsPEWL)W+~ZIdda-JsKVB~ULuIB8&K+gZ57#lqU1q@T{N2iRK{y2 z%H*}Q*xxb>-kP{JL=Y;b@O55>&i3uvyEHYY7U&2_FK>`gr=dViSA1T3zS+ #9_|U-dlcv*b&sf?aN=DU>!s)sw z?0K1=q(47=S1wHatW_q5M2@8BLL|cC!$^fQ>jZSsTl@_ H zz@pFk1}P{DpML;Zf)Pfy m(qdGUrMj1!Utw-N*e5GxN08*8->cII& zj@0eX9I3UAWM?>#Bc -u<{$rgomAN5bynO(p+Qe>TIxRt zBfl{rTCTx~S`8q;(IDbvKpGOAeJ|)eS!NtsrphI;Q>>UNnP(CAdR0h(`-yyE(cO+n zx*yw;cDxh#|H$@b-vmn=8)CHFF92AE$iM);4kiSbq~1pOxfH!1nRm;B#qRyHEJEN` z%&|JtgUBFWthOp &d4vF9@kS}u_ZEyv!@O=#Mv{H-g^~d{#?!!FM~nQ62mkqqg7t@`U^wE$ zs#pM^tH;p{MQ j&syD>{8#g@0g zCB;ShBh9}cRAlEI1UT^)VSUxx0IU27xXbEm?I*iwZzZRU4ZOdr&EJfp1N}xTCI+pC zmYxGPTh3{N|IhsNe}!U@bHleso6lD#EdcVgh)i&A5lI;Bji_H|8XJgn13v1JZfe|Z z7*F0{EDm)~PZPLv=k8kx5kcj`usAgPX>VqwKoyGrB+LJc%=Np~KRu~OpNC3$s{?Z1 z0~U0|TPPJzy+Iy3dBb9=0 )X~%M$LM101yX`YL>zen`H(vBBKr zzA0!m0N1UVkm(k VI$pX__JTdZ{8of7{=*?eDaD6Jp=&K%bKGSsqU~ zAT#vp>q2jVE5LwqV=TVfi#yM>oZkEUw-w$7IR8(;QPa;IkQZz3W^aj4FyAH-q8rAQ zrq5*bDgdl7wV!1{x`oXh@;Bncn^YL8m;lJD {qEY?7>zaz}CcI!vUyCV{g z9P}0Nr+fEGaP*09L1 {er2 z-)XW%!z4wx<>ie{7RDrezlL=Gl(y7*gJsNd`Vls@;)Z5+H&J^nLLJ#9ykG5fecN-Y z>@*2U-0RktBCEIbath6IN(__e+B5Sy2H!wz&fZn0>=LUVRuP2szo?tHDFqO3dzpF* zNQT4*RA|LCi>RA~o92XEe~$$W-;Hs@0Y~0J4ZH0n5KkI*_)(fxvHu;^fmS-B!&DZ` z9qe$|F*4)T|MgJcJHCPCc3JQGl|{XpMe?|a@*n-?LHOhXy5wj{FI89%pL}~2?%H?H zT vcDys%OMlqWISoSxVJ6^A@TMl8B z6TDvigwILlH> M}3uC7|_z0-RGs7jB#z1VN0vl;|I{NO0$!cjs7NQW)42KN^G1E}#n5Cb5d zacA?SJp=R#<8H^)z29hIEhPX^D_MnD*$xZP!YQ8`kKe(T1Yo=JmhluCPyydl+qIkj z9p16mc)J5b=sK@)+ACR%mbl&IhuE)qa(=P55)lY|&j7KzH{v(^zLww+oOTI;8X5Rr zr(hKHH?j;s23F7gdb$5BT^7J(B;4-PZ}7Gi0@frZnh+a(0MsjhLCz}pR!1dH3IdcW zAjQ6yBA6UNM8T(1<~M56`V?4W>rm@bJa}#X>XbD^zhSpC1+WIz#}Uf@0? 5%5cDo5MzUKAm#{M`jpi#f@h*W 1LG(KfleDN8nQCD4x#d z1cm42Y4$?ng WA=bdka{I)`+hTYWn_Ld*lzVxK@K9HQ<`9-le+|Ms@ z^o1e9yr_Xqi+CwlDcfMX(c^5~s_t;ifV(YSEVMHatDQ ytiA(qzomw9ThwWYlA%~4Xe|3dCS!WnoOASe+>DtNeeChJKHKrwe?fZUb zl&WU937_$Q{keeT^_GA+Qq#{O2gq_xsd{<6Xc2zQKfu4x6(!XbMIY%*)+cd{B%6F8 zD)|*8PO`k0`DL*d@!k-e37PvxpH^LGEj#Q$ZJ~a@FY+ n)V%ea3%<{GS z%9C9A%kXmd=LqY3#xQr_H;R2&+|z(rtK(#|b{F1AL(JZIWk%f{3XGD&)WMnXvi^*2 zVGrwLE7P(1Ououc{_!M>b`H-bAv~TBu_NC##A=;3BP`AXNBulc7jbE|U;KiBEjr0- zE^F8ID%M#_QXcc2$m6rSDMAigrne>Ag76|6U@0D#H6!K&uLePFA;eUfQc;pDDa`+M znxs_M-Wqjn$~gXdPuis= Sp#uow2{TL?-Dd(QiNK3FSKzG3tq@!lrh|%k;Gd{6@2yB-kOSTqgtv?*Y~z zIjxW`x$Dc}=4eHs*dNb>k6~{8O~a{5AMd=;Z5C`s{mYEJl?4D{yx>617n%etv-vm? zzS~Z+Cto9mMD|2Fj@Q0+%JzJ7iH?65#rwLI9G~4X%Y6Ok_wAlI=2Dwo%mz?YJ8_g0 zLk;Es +WfY5?^4{YxI2YXg1fsFX^T6>9g4d{vEuGpph$6t;O_43?tX6e-v2)5 zJ^LNcw~P!DvXZ&hnsWW-3@3CsSGicaaU6(YP*+Nn^qf>&feZ*Kq}YP#AVo86CG0Ns z{V1(RPMcot>Atgcvk43-`}y{+EKZ3^Ca~JdOf!*!+BYLE7L9t5&1|%=!u`CjKv)kf z7r63w7c0G9L$SFd9tE#=w7Yy7-bWPq)1ZO4xS5$|vJw7?Pw5u(olZiYGFMPap%5RY z{LU4G5HN`|^P<20%fCP`n3808Vh#x5wDcw;WDf{g{YfhewbP;V_g}0h0RQ5a?}qmr z4*01~12{f+rFjZ WRCq^~$sCJ5xA{O8-JT8I6 zvC`;N=Kk{JS+7Yo+Pv3IK&4VDvs5g$#S_g!^0)?jC-g)XwPTo|MXj>ctW;XRoh;f1 zhwcjtZ>@N~H9&&{a4Cf-z>X^>yxXJUBk6-;Y&r#t4m>_TocM0m!+PB+QZ@2sMR1jA z{;mNUU97ggJZsEc{VY1j5(&Dzz9@w1;8<~w`Q|tU+s7)OcK?-`zVsP`!1p0(qJRoe zYuN4O?c90-H84_JDg<8OpxMtUz+p^1v43VZ?9Ux3ejdAby1&HZa^xk`jAGNE5fN7{ z(}nJ-)uHn5yc2vX>y42p{jx)mVTSV@Et0NuCE$KrzDya7W>7WUa?+Y$-TL&YqOYh) z{z8K9{XrCk#HI=xKHLuW;h1O3-8R7;u-7SD&mD)#qT9%QOqBqvcO5lO0Y9YEOL^yL zwqoP{wzTP7+QaJT!uW)Ps+57JNAwQhI4C4Mqk)dG$`Qmoba&_4c?(6Y2XC*suj+KF zTS+{5DJ3WGPFi0OqVsq9Vl-+4a@TEM%TA-76=h*~%+kZDT;DV7emA7YsLyQ2PgXI= zez$l@H7gU?H{iA3uHt^VbKsGr8{@fe@`LsI2?>kZEAaA|Gw;klrCc^PV^IDSG-0gA z^L`9Q_Q^}hW6f#hD6T^SWngNbSb@|FqA!Y~k^k6hOJ`~4?m(h~zqFFX^HGs1n6EG< zEGI+M*U)P~B8TL3o^jy`;$AH^1G32L<$T~}&-7BOc2Q}x;H2}+2l<|^>Vn1CGlssj zH)eF@m-+lsg2A2SgP{c^6=5m7dGIHrNT|_=NgWsmttFeMt9|$Fm^u3$Dwzm)#wWpC zOTi2dhm*O2bRHWL34Y4Uoea-wwLe>lw~9+0wj-5@^G>uQZ=D?l$v1%WegDF*1!Y90 zckAb*$Mmue=fv7&nU&sK4^X<>YjXsT!MpQc2idyqnNQ5(n%PS^8J$-l{BK5r6N-0O z8&}ou#nLKE_FF<9#FU`PsJ-~_D_e$74+HGI&C#jK8lF!rFs-y=<_jL2YC*P-x9}dQ zT<*6&U0a&emn2H1?EHVt@DEIO4FtpUrmW3fNlbC*xSw_1yWn{=E*Z~_wAV#E@--%L zuVRj{Q=@aH&tRWWkPbMi))(R12Ry>(9jdb&ClNcgYBa24 zB Q+jXxx2xn{#jrR8MQHu98UhaBy3C zB1jkq;>#qf-cw#!%r(_B2d80T>y8So3*z2$^WK!OnlAPl^EEAA?@y>`Ydkb8I-N8( z3|m2di1xj4^YkX>KdJn4&uk*-^-J@YQd X7% zx|vd6nJvFIE}QgpQw{qVdy2rEEHLM~sO!x`56~DvG~HxUbVR*bKWUi}3C|Jl*4@iR zGa%}Rve5CnO$F1%@+|B@@o?ge$~`bDf8hvKm}t8+C%7{(JSDf)j05fHF;393#|pBd zp(YH(^!=2SAzLuFYQPVbpVSYQw=CS`+C7*jt-*1|BZzNBcEi 5o`8yZ4G-rpw-z z%D4MLH6z=M5&f WDv{8%^)P^*4qC{wEwlaJojdLe zCg(C@rBU1&V>98@=8X1(kK}w?M$wR*;?w;=S(6z_b|zz)@|Er0d~-oM$ V15t^xi40`3tr#5~tOa6EYCueTQweGOV HE`<=`z$p&W$Fk`o1Sx^)2hL0mrnZYi_BHiK)l;J &q= z_Q)l(%?zx#Psl0#R>wLbddlkGDBo@6MQV2ao-ki+#=XFbsq=i|rT)&xn5{E{27huU z{f;JX=Bn|er8od87z$*Tq+cg|3NMl94bnwgU7=?LyIkPx$~o>$Dl&f?G+{5(VQ=r% zYEjlsO{ujQtMvK|vmq5zu)C)V?gVZ)Y6k+|EM!+Wh-qPXbkL#K@31MO7p(q-ge*VU z`&85gTxe^vum+dIv3|SdyPbn?+0H`ZE*?X4t>XGm28l0WWaA~u+gao1tB|O@cn(NF zA$p>F`z`eOK+|01BmUTs>lz%U{mw{2R);to(sI`i>?zBu!#S^SH^-<@;@Gh}U+P$K z5s&oe1wWKAP{_8G`|`4wjGTr&tq(9(M-g6`&t=zFd2qLLTJDGXx9rldI%wD1QCXG` zM{m7dqNbKhDk|&C7DJ#n7{cY!Nz-YR&0zW*Cg^{G+TnS9h+{f3Y&Z~Kd~K6nqMH2k zpi_I~pbDLO@E$Z6`|+z%q_?n^&693yPjmp{B%BYS5z`Zwgi8`C!I^Km_`-X&KmLzy z?Cn2M6;YwPnVdcmmw6~lS3zi``lEe)UJHVrxz(IXXv3U)R||r$1*$z(5$J?qR4CI+ zdmzx6S)M@SAhlb#Gb7)FCErW1CCnEnRNu1YyVnD}dtXP_2g}+$$8tq@*1C+Vg9Qx| z_IYu@HZI{1Gzm^=19zCjh4re)j-@!e@9d3u0{KgDrCJZ;=#j4FQffzqx$n1>rE!}? zryOn`NN6c8xIK7pVaZybDnq(VjD0}VP1lf7RX*_2nl29G-?U`HE<52w!%*6)EfP!+ zF?SJdv@#EsM_>WnXKb!N{AM<2n4qr4W<(+bJ_vr%$?3>dV!BL&V7w6VVb)j9ZBNHi z@9oXoFmUG+y!bwYMs5GJ<-*m+u?!KLs)1UwZ@N?a@FPNXWiv&JTEipXTbeFDfh$qs ztBL3iw`#4HX>oQ2O|3tUv5LYkay(q_zh|4Oq4;H<9UjElflXcBAI`CyNhCTv;GACa z1%;yb$@`D)F(Kc&wAbB }<4SM^Cac9FDQL4R3jRj?f Y~L^~S7*N`+!v!LEOixEJ)Wy~JZsGjCY q3 zR4*K@PZI+{Q&4NyD2~AQ(+?3pN1_o{A56_?I1xNBVQSCiXcPWMjMw9S<+PZrO42TMohlmt^%=IFR)f76iI-I6w{}i_`z@qF+7WtK0xz!Hnx5MT zpVI&-+uJwkQ~7O>ZaW&*d#6IUzw~~r;g^E+rhANYD+bY-vqblTE~$ZGo4q3Ac^Xd5 zsSC7-kg5q*e3#bt#zV0SRy-Vb-R$D+jSijVS@&JIh#fyQ_A2POn_?_GM+ttcW-y8B zV}erkFT>ys-kf}LeijnMzXHR(SE-S0;|rjWUF8KF`1gvth*fD=^eR#ro=??T_8Tb& z?npKH$e9@bx@UbnBEIA}gOnhl9mHf^HF;=xYONhgA>4!7@%6qO*FThsW|g x4j4qH6a0o;yBO;!-e3BDGA~vZYEBF-u6rp1dS2zuxILHo)CfM& zekf6`g-DI;9!j4KtnQDalRio3BlJP(UhXa;@kht%VvyBk#TAFilucq)JZ?SF^a>nh z!!`9WKLo^lTfe4v#HU@3UU#em)s#S^fVYoxAx0$`Y4Y0~8eZQqfh^sO6n5))@&H70 zA@GMF`Cx2h0*)!-9<9dj@i0YRXDZ;Mgl4;H=zP41eD0or=Oe={R?wM%fhTJKeA$!t z4Er0hLietIe3qsb+g8>rW6*wqN6)9>_rW!wH49a_L6sbT7*wM8T#!$cC|bF0Z}&ye zo>MskFJfB=L>BGPML;tu O~ -@egm{J_J9ZJsM ~-9Fa#Do8DxVXf#qQ1|uxk)Cl1z4-MeO2SIE`A;eXY4P+P-#lzROg)Sqp zI1z9S)qu_+C`ffxMI^BsSE=eWZiwfLaax`BM}>k;W-E8hiL45>7TAYnQq)HL@x9T< zEqS|{Pm}%IF<=@Yo*ty)dH^k9f2q^5ZQxxBj_FPhDQ2L#IvRD+RLO6V+uI9lF#_)j zl!_LD$zmF OU2qY~NA#2(MQmq%ORq#ER?;&?{6*be>8!m<80 z0x|?=x`T*cfYwNFEg>%~bNUzOr0Xh#)05b}xAbi-^#sHd+v*c<`v>?bG|?hT{$PYE zfQh=suak_c6Mip@`iydl{YV&Hs0u*iqeyz51N#fKBd=NNRt0$9CS%}-qxaxqF)8V9 z2Cs#jqqOyY&QT`PItaMfHtQg45gj+~YCv|s-!oQf)e}zS@mg+ygVh(-nFB+GMeIWA z(V~2dl}K!|;==&%AI{fn$r7V3&=P$TK$B{ g-c~sTFx4VLz*H5>(ELFNHdjBkLhKTC ztI)-Xgg(qSnEDZq)wvFtkLRdZ6NzK4u`2$AHLAsT_z*1=PEMbnfov1bS2E0z?qPZM zxvb6WZx-5C3W(P<(;bPw=K_{YiB^S-<(Np(G>gsnl{*uso+-6G6QQH1k@rFq_DBuZ z=Z&ynE;I$Iy1 <@(HShwyVKwBO= zwMz#%mPG1xSiBRL#-&Hs*FDXIaIKl6xeoecGe&Od9Dw7=vBhBigDKS;6&UG<35j3& zODoZv_Cj~eUje18iB%{_h^fblKfD4Zy|<=fg qF;yEBv?202YjA>&EC}n zF8NwTgLAukPo{p2ac$X+WAoO=l~sIu0gm2VnAnbf8~gQ6sjV{?^+;jC3m+fYt|LRM zdBKuWhRJp~%;)oR()UJ8TXR2rZHzgVZT!+}UW9J_g!XdJ@w M)Q5Slj{W7?rNf!q^$&uzdan2mA)3$Lb*%V>WYiiWyq!T<1RPZW>B zYXJoPbo$3Rx~!c?X5V7<{9HIkg1+dhYL3v-$1|W)N{gM%ql%6*9uO6K UO>#&> zw)g#~c0&5`wVE<8G3*x+3;0S 0E4qWV2E{3fEs?* cB09AM&JVC+0;X=aI{A&GXQ=&NnDL7$CJ z&_{}jqf=JkVuYcZ_fP8`%TU! =h2wVFawF~XvOA;53JzM zOrMbfgE&m#TwQ(yumZ0FB^l}uo=q5}EbFFvZM-FIxmaFKy(9mZkwSDS$v`WdMh{(n zsJ0*bk3dR x3Ln0%8ghS764 zmS9c%XCQk4m{^UT%l>A_zB)IK^1x(Y7)oe9XssGZvcWv!)eoJmO~6?uenJL!I=S6Q zJFtP#DBu-O4}BD&IR)~*q!YMx{?aBzcxk#Ub9_)M0lO}L-w5Yt6Oyb^cfh!>O;c7C zpdi#;t97!l2e-}9Ke$md9}(80us5AGIN}z5F7rWo3Up8@Q_UCA#H#=kcdb>II;Mfs zY69Rjn%Eb7Ku#}yVwWmzRW_{mA1Wgi0^q~GiQs~tJst|box)QP53!$`M((muz#Tm- znNcl^5He>YObdO4UlbU!XHBKq9!!qv9fKVB^S5l$i31df&Kz1?suW*~YY>|kkg$F0 zR5DjMPUM5N%ga>OC-Zq;3pFk=F|cn~!qz@uKsGGf1i$3VrhGK$j+l_42of##J$)-_ zaX9iY?^)4}=IDG1!;G*BO*mlCDWR0ZU(P^z!q(Lk3=YMum=a+aTg8un7}RMN?qh-w zk%=>dw+$JR`R%4rQvqhzpY5jAC GX#*t&~sU4nk F<;}A0H?aWxK1M@oY0EC{%2WAVs1$m&ufO z!g*MZ!S{!sJlV;SfX=cz1xAe_3 (JQ&azSLi&`;W%vAKx yAFrL7R^7^b-~Bidb_|*vIM>uko@^_ zsJb;4UXGge&Y#4)VkK6UU>HP6Br*XRfX{S=a1HP0b`k%Z(3 u4&Y95G$i;es|5*<$r%W=$J`quMPnl H8aMj=u`H;v7 zJ6(ou^~X(d`GfRbM`l(`XncRCuuGQlKWz?O9c;zHZ{(Sb`JY zjXUOcb4WInTsyfQMMG94K|G-lWQu1hSG!w9Wb|J-eHHk~!hJ?FAc%St z8f3Y!79PKiqN%}gjTcG@&!!44hhEz@6o}w4ofROc*{pbxA-?Tm&fs-O4kO~wZW|%q zTA#w*DmCU@2`9q{A)P7Jjx%8mC%WJ8yIGcsU7bA~Fgjq2^-~+Bd<@94`_(_78||OG zas>GMUlYs23l3&}$1V2zEq=shQ) 7s*ZlmOz0ZwRZE0Gb=Tbw~@u!`pvw6UE^Xl5IQ 3X# z;h1Q%YzPk8%HDYltbyAOFU>D zvI`{uE1ZAe%TyTg-b8W1WQpR^;HOJdaS_=54*kgfKVsPSVYm=##p1|(7%)Be8<7J2 zpDpLPb|86J$xxSgdM?WF*1~`R^Tl+yw!MEt=%1diTB_Eac!~Hh!0v)kcD&cFpb<7z zY%6f6&K+SqFN6aW#8ReP*ES)8tJe-+yB|x_#lq=d-5gA46cyv72|_crTa8#!ywfG> zd=muG$6h0s!L0`5X{<8j@K2lvzxPbvs3~~Zo=jXPl3ampj!X} OX5_{M5 zv!*JV(Una+!2OLUb`|p1XL0B6yOUyDowJ!8xb60A3Kh@+x|U$)L;Whaun#zf1KX8S z{z~oDLD9+qAwa|3Penx_RN9N3;dtTN+dwX6OT5+~3Rzu$@em+kS{-pJh(-UUjhg&p z_nSauGCZE>KMT+ KN7bv8CAES@flQrutLga~w-8?QK&@#i|u%t4u4xX=qrH8dk z-NigOd)s|AKjg30H8`GRHIFilU{jxJ&|?`H&XhV;p}Pydcn+VXTn!a8Mqd6agh**f zd?tMd#2c)3CA#nATU+**bHIP*wqOm*MRbBNWE0^EbRzr@PI1Khfl=KK59#?B&Y9KDBb}JRxo9c&Y2r2F(`y;=O`O c@0p6Am=YDiS`!A$e9zW`g0@0Bkf z$EuT)K!}SY6S;{}*2f_}sDpdVl!t3C?RW+qvQ>VsVT*!{axq2DGeRCm&7FHr+x6T} zhnB;zsl3z8HQj0>r8z|N$QL -Uy@N-ID^P^0b4XTTY&AA!t8 zVUbMxkbP^!ezs|m=4$;n2l2XqL2&1~b48%4zkT>c)qV9$u5lT^tBj+awpU7bMSGiX zZge3){e{2Efmk&<5k_L)$7ml-$P2{WBNObI!kL0DjryX+2#C;(3H#RMq>91*L?nb~ zV^Q+ZIp_+jL=g&f)UqKOiGrF(m |ioGtA*xQDXV=XgVUWfQ$_!g3&mnl7aqy60$_K7EH1h8A>ym|mk% zV>Q9lKPI2J{_n`=0jOdEPTMq-?F<>OEG~~aAhjR?koF)Hc-|PN!`WXPM8H<5)w%AU zYFU|kV!lQ_L-r+;t_ll?x`fnTX!|u$;1G;=Ng;U{su=0~(K{Hb9q7#P{vP*?kqr(L z5H>{Vi-i__o4MiCivVRK?bPXQ_!~3&TZzK;n7k`{GN {o9so~B17=HF)UP`R zvNy^CpBJPWDnd;z)$)rR`B8ac6Fw*|!ZQSMC+#!=8iZeC1d(PHaQbFDpNOb5Y7iZ? zrc1OAcrU^TF0x(O<>2B1JTgbDM$0RRmwZoZ3__&1Bk$UUQ 9PAG5p*CziTQ7uimyj-Oxx| zA#T8lqJGu|-5obJ-_u9j_ 7mq1i--GsP;*mKcfHGYJ<4|R1-$hcT_laa z?VFC$CAWRfLDe^wS6SnEo6R?l<_6SA3Uz@B<3L`dA%!wAQCw&^{^ AqiRCW}AD%4<`ZiNTC!{a3mB+IjF6B`6=Hfwuc&qM0h7} zx~RjUVJ2T~Uy#zWjhM~Hyg~F#e|~`YXqJ#7f*~0UbsST-EqAxqE1yht?KSn)Wys>G z-sG9L2R+Mn!pN81-#1F#<$N=0sd2?g+=28GJ-y>&>mhTqZ0<{2o6HM-NCnA*#Zvz7 z)j14kie0qj5#9mabdAd{-l~~-hXbDaR(5OW&yk-xtf>>=@>M=+(A`~RAfjVQX;tts zc41SK3a`&W>|FRF{^5Mu2C9CfXex_4%;SKB250>#hOP<=Tv0zznzld%Oy?N3;7!4c zB6<3 zwDeU0TRbu37mn@Yj6)qp!{|JJX83f*7V@xqRAaNO*&M9aD%9*cUM*7~TAWl)D}^_T z`8%-_3Acm8YMwHuC(K^EbdXMRQC$MhoeY#nSwcNV6UG7r$}xa4u=B&QJNY}YaCL{O zv2LAg!C)Lj9ENC9pdv}(Uzwfkt$Mnf6St{XEgvRrgVQ9szJ&(!zNu~jnz;BXmWI8l z=IAYI2ZUeXZPRE6Pix9Luj`>R!ysiBR(cM|zeKfO37+DFyIZI!xP|i^+Rcfdc!Xcz z_HO-J-5 (y>n^IaHh#vCCM4?wC a{2-kwGC5^c3IzfCGom_BiKI~x%?6k+|NNCWu&$emp zqt?;^=UaL9J=e@$Yvf1Ghu5S5!EibByd2?hM$^y~A9Q}{iyf^2W0ddf1*f3lRnhGU zW+3LhnMN~_Nf&YFB{JPXK`2D=Au%)u2Xp+&lZd|JbIgWSqk7_EN%w*O5!1{v@{ZxW zZ%2~qC7br05XqA%_B !2zFSdSPf4{e*QJK{_Fk;%!}kB4L6daFX#h0