What if you could see everything at a...
+Install • Configuration • Themes
+ +![example homepage](docs/images/readme-main-image.png) + +### Features +#### Various widgets +* RSS feeds +* Subreddit posts +* Weather +* Bookmarks +* Latest YouTube videos from specific channels +* Calendar +* Stocks +* iframe +* Twitch channels & top games +* GitHub releases +* Site monitor + +#### Themeable +![multiple color schemes example](docs/images/themes-example.png) + +#### Optimized for mobile devices +![mobile device previews](docs/images/mobile-preview.png) + +#### Fast and lightweight +* Minimal JS, no bloated frameworks +* Very few dependencies +* Single, easily distributed <15mb binary and just as small docker container +* All requests are parallelized, uncached pages usually load within ~1s (depending on internet speed and number of widgets) + +### Configuration +Checkout the [configuration docs](docs/configuration.md) to learn more. A [preconfigured page](docs/configuration.md#preconfigured-page) is also available to get you started quickly. + +### Installation +> [!CAUTION] +> +> The project is under active development, expect things to break every once in a while. + +#### Manual +Checkout the [releases page](https://github.com/glanceapp/glance/releases) for available binaries. You can place the binary inside `/opt/glance/` and have it start with your server via a [systemd service](https://linuxhandbook.com/create-systemd-services/). To specify a different path for the config file use the `--config` option: + +``` +/opt/glance/glance --config /etc/glance.yml +``` + +#### Docker +> [!IMPORTANT] +> +> Make sure you have a valid `glance.yml` file before running the container. + +```console +docker run -d -p 8080:8080 \ + -v ./glance.yml:/app/glance.yml \ + -v /etc/timezone:/etc/timezone:ro \ + -v /etc/localtime:/etc/localtime:ro \ + glanceapp/glance +``` + +Or if you prefer docker compose: + +```yaml +services: + glance: + image: glanceapp/glance + volumes: + - ./glance.yml:/app/glance.yml + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - 8080:8080 + restart: unless-stopped +``` + +### Building from source + +Requirements: [Go](https://go.dev/dl/) >= v1.22 + +To build: + +``` +go build . +``` + +To run: + +``` +go run . +``` diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..1f7052a --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,873 @@ +# Configuration + +- [Intro](#intro) +- [Preconfigured page](#preconfigured-page) +- [Server](#server) +- [Theme](#theme) + - [Themes](#themes) +- [Pages & Columns](#pages--columns) +- [Widgets](#widgets) + - [RSS](#rss) + - [Videos](#videos) + - [Hacker News](#hacker-news) + - [Reddit](#reddit) + - [Weather](#weather) + - [Monitor](#monitor) + - [Releases](#releases) + - [Bookmarks](#bookmarks) + - [Calendar](#calendar) + - [Stocks](#stocks) + - [Twitch Channels](#twitch-channels) + - [Twitch Top Games](#twitch-top-games) + - [iframe](#iframe) + +## Intro +Configuration is done via a single YAML file and a server restart is required in order for any changes to take effect. Trying to start the server with an invalid config file will result in an error. + +## Preconfigured page +If you don't want to spend time reading through all the available configuration options and just want something to get you going quickly you can use the following `glance.yml` and make changes as you see fit: + +```yaml +pages: + - name: Home + columns: + - size: small + widgets: + - type: calendar + + - type: rss + limit: 10 + collapse-after: 3 + cache: 3h + feeds: + - url: https://ciechanow.ski/atom.xml + - url: https://www.joshwcomeau.com/rss.xml + title: Josh Comeau + - url: https://samwho.dev/rss.xml + - url: https://awesomekling.github.io/feed.xml + - url: https://ishadeed.com/feed.xml + title: Ahmad Shadeed + + - type: twitch-channels + channels: + - theprimeagen + - cohhcarnage + - christitustech + - blurbs + - asmongold + - jembawls + + - size: full + widgets: + - type: hacker-news + + - type: videos + channels: + - UCR-DXc1voovS8nhAvccRZhg # Jeff Geerling + - UCv6J_jJa8GJqFwQNgNrMuww # ServeTheHome + - UCOk-gHyjcWZNj3Br4oxwh0A # Techno Tim + + - type: reddit + subreddit: selfhosted + + - size: small + widgets: + - type: weather + location: London, United Kingdom + + - type: stocks + stocks: + - symbol: SPY + name: S&P 500 + - symbol: BTC-USD + name: Bitcoin + - symbol: NVDA + name: NVIDIA + - symbol: AAPL + name: Apple + - symbol: MSFT + name: Microsoft + - symbol: GOOGL + name: Google + - symbol: AMD + name: AMD + - symbol: RDDT + name: Reddit +``` + +This will give you a page that looks like the following: + +![](images/preconfigured-page-preview.png) + +Configure the widgets, add more of them, add extra pages, etc. Make it your own! + +## Server +Server configuration is done through a top level `server` property. Example: + +```yaml +server: + port: 8080 + assets-path: /home/user/glance-assets +``` + +### Properties + +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| host | string | no | | +| port | number | no | 8080 | +| assets-path | string | no | | + +#### `host` +The address which the server will listen on. Setting it to `localhost` means that only the machine that the server is running on will be able to access the dashboard. By default it will listen on all interfaces. + +#### `port` +A number between 1 and 65,535, so long as that port isn't already used by anything else. + +#### `assets-path` +The path to a directory that will be served by the server under the `/assets/` path. This is handy for widgets like the Monitor where you have to specify an icon URL and you want to self host all the icons rather than pointing to an external source. + +> [!IMPORTANT] +> +> When installing through docker the path will point to the files inside the container. Don't forget to mount your assets path to the same path inside the container. +> Example: +> +> If your assets are in: +> ``` +> /home/user/glance-assets +> ``` +> +> You should mount: +> ``` +> /home/user/glance-assets:/app/assets +> ``` +> +> And your config should contain: +> ``` +> assets-path: /app/assets +> ``` + +##### Examples + +Say you have a directory `glance-assets` with a file `gitea-icon.png` in it and you specify your assets path like: + +```yaml +assets-path: /home/user/glance-assets +``` + +To be able to point to an asset from your assets path, use the the `/assets/` path like such: + +```yaml +icon: /assets/gitea-icon.png +``` + +## Theme +Theming is done through a top level `theme` property. Values for the colors are in [HSL](https://giggster.com/guide/basics/hue-saturation-lightness/) (hue, saturation, lightness) format. You can use a color picker [like this one](https://hslpicker.com/) to convert colors from other formats to HSL. The values are separated by a space and `%` is not required for any of the numbers. + +Example: + +```yaml +theme: + background-color: 100 20 10 + primary-color: 40 90 40 + contrast-multiplier: 1.1 +``` + +### Themes +If you don't want to spend time configuring your own theme, there are [several available themes](preconfigured-themes.md) which you can simply copy the values for. + +### Properties +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| light | bool | no | false | +| background-color | HSL | no | 240 8 9 | +| primary-color | HSL | no | 43 50 70 | +| positive-color | HSL | no | same as `primary-color` | +| negative-color | HSL | no | 0 70 70 | +| contrast-multiplier | number | no | 1 | +| text-saturation-multiplier | number | no | 1 | + +#### `light` +Whether the scheme is light or dark. This does not change the background color, it inverts the text colors so that they look appropriately on a light background. + +#### `background-color` +Color of the page and widgets. + +#### `primary-color` +Color used across the page, largely to indicate unvisited links. + +#### `positive-color` +Used to indicate that something is positive, such as stock price being up, twitch channel being live or a monitored site being online. If not set, the value of `primary-color` will be used. + +#### `negative-color` +Oppposite of `positive-color`. + +#### `contrast-multiplier` +Used to increase or decrease the contrast (in other words visibility) of the text. A value of `1.3` means that the text will be 30% lighter/darker depending on the scheme. Use this if you think that some of the text on the page is too dark and hard to read. Example: + +![difference between 1 and 1.3 contrast](images/contrast-multiplier-example.png) + +#### `text-saturation-multiplier` +Used to increase or decrease the saturation of text, useful when using a custom background color with a high amount of saturation and needing the text to have a more neutral color. `0.5` means that the saturation will be 50% lower and `1.5` means that it'll be 50% higher. + + +## Pages & Columns +![illustration of pages and columns](images/pages-and-columns-illustration.png) + +Using pages and columns is how widgets are organized. Each page contains up to 3 columns and each column can have any number of widgets. + +### Pages +Pages are defined through a top level `pages` property. The page defined first becomes the home page and all pages get automatically added to the navigation bar in the order that they were defined. Example: + +```yaml +pages: + - name: Home + columns: ... + + - name: Videos + columns: ... + + - name: Homelab + columns: ... +``` + +### Properties +| Name | Type | Required | +| ---- | ---- | -------- | +| title | string | yes | +| slug | string | no | +| columns | array | yes | + +#### `title` +The name of the page which gets shown in the navigation bar. + +#### `slug` +The URL friendly version of the title which is used to access the page. For example if the title of the page is "RSS Feeds" you can make the page accessible via `localhost:8080/feeds` by setting the slug to `feeds`. If not defined, it will automatically be generated from the title. + +### Columns +Columns are defined for each page using a `columns` property. There are two types of columns - `full` and `small`, which refers to their width. A small column takes up a fixed amount of width (300px) and a full column takes up the all of the remaining width. You can have up to 3 columns per page and you must have either 1 or 2 full columns. Example: + +```yaml +pages: + - name: Home + columns: + - size: small + widgets: ... + - size: full + widgets: ... + - size: small + widgets: ... +``` + +### Properties +| Name | Type | Required | +| ---- | ---- | -------- | +| size | string | yes | +| widgets | array | no | + +Here are some of the possible column configurations: + +![column configuration small-full-small](images/column-configuration-1.png) + +```yaml +columns: + - size: small + widgets: ... + - size: full + widgets: ... + - size: small + widgets: ... +``` + +![column configuration small-full-small](images/column-configuration-2.png) + +```yaml +columns: + - size: full + widgets: ... + - size: small + widgets: ... +``` + +![column configuration small-full-small](images/column-configuration-3.png) + +```yaml +columns: + - size: full + widgets: ... + - size: full + widgets: ... +``` + +## Widgets +Widgets are defined for each column using a `widgets` property. Example: + +```yaml +pages: + - name: Home + columns: + - size: small + widgets: + - type: weather + location: London, United Kingdom +``` + +> [!NOTE] +> +> Currently not all widgets are designed to fit every column size, however some widgets offer different "styles" that help alleviate this limitation. + +### Shared Properties +| Name | Type | Required | +| ---- | ---- | -------- | +| type | string | yes | +| title | string | no | +| cache | string | no | + +#### `type` +Used to specify the widget. + +#### `title` +The title of the widget. If left blank it will be defined by the widget. + +#### `cache` +How long to keep the fetched data in memory. The value is a string and must be a number followed by one of s, m, h, d. Examples: + +```yaml +cache: 30s # 30 seconds +cache: 5m # 5 minutes +cache: 2h # 2 hours +cache: 1d # 1 day +``` + +> [!NOTE] +> +> Not all widgets can have their cache duration modified. The calendar and weather widgets update on the hour and this cannot be changed. + +### RSS +Display a list of articles from multiple RSS feeds. + +Example: + +```yaml +- type: rss + title: News + style: horizontal-cards + feeds: + - url: https://feeds.bloomberg.com/markets/news.rss + title: Bloomberg + - url: https://moxie.foxbusiness.com/google-publisher/markets.xml + title: Fox Business + - url: https://moxie.foxbusiness.com/google-publisher/technology.xml + title: Fox Business +``` + +#### Properties +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| style | string | no | vertical-list | +| feeds | array | yes | +| limit | integer | no | 25 | +| collapse-after | integer | no | 5 | + +##### `style` +Used to change the appearance of the widget. Possible values are `vertical-list` and `horizontal-cards` where the former is intended to be used within a small column and the latter a full column. Below are previews of each style. + +`vertical-list` + +![preview of vertical-list style for RSS widget](images/rss-feed-vertical-list-preview.png) + +`horizontal-cards` + +![preview of horizontal-cards style for RSS widget](images/rss-feed-horizontal-cards-preview.png) + +##### `feeds` +An array of RSS/atom feeds. The title can optionally be changed. + +###### Properties for each feed +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| url | string | yes | | +| title | string | no | the title provided by the feed | + +##### `limit` +The maximum number of articles to show. + +##### `collapse-after` +How many articles are visible before the "SHOW MORE" button appears. Set to `-1` to never collapse. + +### Videos +Display a list of the latest videos from specific YouTube channels. + +Example: + +```yaml +- type: videos + channels: + - UCXuqSBlHAE6Xw-yeJA0Tunw + - UCBJycsmduvYEL83R_U4JriQ + - UCHnyfMqiRRG1u-2MsSQLbXA +``` + +Preview: +![](images/videos-widget-preview.png) + +#### Properties +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| channels | array | yes | | +| limit | integer | no | 25 | + +##### `channels` +A list of channel IDs. One way of getting the ID of a channel is going to the channel's page and clicking on its description: + +![](images/videos-channel-description-example.png) + +Then scroll down and click on "Share channel", then "Copy channel ID": + +![](images/videos-copy-channel-id-example.png) + +##### `limit` +The maximum number of videos to show. + +### Hacker News +Display a list of posts from [Hacker News](https://news.ycombinator.com/). + +Example: + +```yaml +- type: hacker-news + limit: 15 + collapse-after: 5 +``` + +Preview: +![](images/hacker-news-widget-preview.png) + +#### Properties +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| limit | integer | no | 15 | +| collapse-after | integer | no | 5 | + +### Reddit +Display a list of posts from a specific subreddit. + +Example: + +```yaml +- type: reddit + subreddit: technology +``` + +#### Properties +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| subreddit | string | yes | | +| style | string | no | vertical-list | +| limit | integer | no | 15 | +| collapse-after | integer | no | 5 | + +##### `subreddit` +The subreddit for which to fetch the posts from. + +##### `style` +Used to change the appearance of the widget. Possible values are `vertical-list`, `horizontal-cards` and `vertical-cards`. The first two were designed for full columns and the last for small columns. + +`vertical-list` + +![](images/reddit-widget-preview.png) + +`horizontal-cards` + +![](images/reddit-widget-horizontal-cards-preview.png) + +`vertical-cards` + +![](images/reddit-widget-vertical-cards-preview.png) + +##### `limit` +The maximum number of posts to show. + +##### `collapse-after` +How many posts are visible before the "SHOW MORE" button appears. Set to `-1` to never collapse. Not available when using the `vertical-cards` and `horizontal-cards` styles. + +### Weather +Display weather information for a specific location. The data is provided by https://open-meteo.com/. + +Example: + +```yaml +- type: weather + location: London, United Kingdom +``` + +Preview: + +![](images/weather-widget-preview.png) + +Each bar represents a 2 hour interval. The yellow background represents sunrise and sunset. The blue dots represent the times of the day where there is a high chance for precipitation. You can hover over the bars to view the exact temperature for that time. + +#### Properties + +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| location | string | yes | | +| hide-location | boolean | no | false | + +##### `location` +The name of the city and country to fetch weather information for. Attempting to launch the applcation with an invalid location will result in an error. You can use the [gecoding API page](https://open-meteo.com/en/docs/geocoding-api) to search for your specific location. Glance will use the first result from the list if there are multiple. + +##### `hide-location` +Optionally don't display the location name on the widget. + +### Monitor +Display a list of sites and whether they are reachable (online) or not. This is determined by sending a HEAD request to the specified URL, if the response is 200 then the site is OK. The time it took to receive a response is also shown in milliseconds. + +Example: + +```yaml +- type: monitor + cache: 1m + title: Services + sites: + - title: Jellyfin + url: https://jellyfin.yourdomain.com + icon: /assets/jellyfin-logo.png + - title: Gitea + url: https://gitea.yourdomain.com + icon: /assets/gitea-logo.png + - title: Immich + url: https://immich.yourdomain.com + icon: /assets/immich-logo.png + - title: AdGuard Home + url: https://adguard.yourdomain.com + icon: /assets/adguard-logo.png + - title: Vaultwarden + url: https://vault.yourdomain.com + icon: /assets/vaultwarden-logo.png + +``` + +Preview: + +![](images/monitor-widget-preview.png) + +You can hover over the "ERROR" text to view more information. + +#### Properties + +| Name | Type | Required | +| ---- | ---- | -------- | +| sites | array | yes | | + +##### `sites` + +Properties for each site: + +| Name | Type | Required | +| ---- | ---- | -------- | +| title | string | yes | +| url | string | yes | +| icon | string | no | + +`title` + +The title used to indicate the site. + +`url` + +The URL which will be requested and its response will determine the status of the site. + +`icon` + +Optional URL to an image which will be used as the icon for the site. Can be an external URL or internal via [server configured assets](#assets-path). + +### Releases +Display a list of releases for specific repositories on Github. Draft releases and prereleases will not be shown. + +Example: + +```yaml +- type: releases + repositories: + - immich-app/immich + - go-gitea/gitea + - dani-garcia/vaultwarden + - jellyfin/jellyfin +``` + +Preview: + +![](images/releases-widget-preview.png) + +#### Properties + +| Name | Type | Required | Default | +| ---- | ---- | -------- | ------- | +| repositories | array | yes | | +| token | string | no | | +| limit | integer | no | 10 | +| collapse-after | integer | no | 5 | + +##### `repositories` +A list of repositores for which to fetch the latest release for. Only the name/repo is required, not the full URL. + +##### `token` +Without authentication Github allows for up to 60 requests per hour. You can easily exceed this limit and start seeing errors if you're tracking lots of repositories or your cache time is low. To circumvent this you can [create a read only token from your Github account](https://github.com/settings/personal-access-tokens/new) and provide it here. + +You can also specify the value for this token through an ENV variable using the syntax `${GITHUB_TOKEN}` where `GITHUB_TOKEN` is the name of the variable that holds the token. If you've installed Glance through docker you can specify the token in your docker-compose: + +```yaml +services: + glance: + image: glanceapp/glance + environment: + - GITHUB_TOKEN:fB%F+2e+r{Lfw=#tHlF+@5es(ksokJ0#S){PcC&};MrHH zeYw$>Afa z S-Onc?qhr{3xy^{zX2b8?+)U%cu{N!(B)|EUYkEKbwzKwPg_JFjJ;XS^6Olaq zYC8qZovraX)aSK&3_jMmYnk73`2w{xeS5N5GIU_0E!243UY98Tcu`RM-izE8^~>t^ z??Lxqy%^vHTTn#U9k*flY0|-u9n$leX6c-rJs~}}kWeH+17%^-6T%`cC7Y+jy6gDj zLkoox5SEbv)0o^Y&^{-ju&76feQTur#>r 88AY}D&bm>h~s`gV<&fwP2+$myG>OT*bT%_kKKa||)F}YrxZVPxx zU%57uRI@~reXjm+BwCfNOGM?J3ofXe%uQr3UmV$|V8+QmO%q({Qxp2WvoRh3C+9fv zDqqBYh=wMd6P)P!xn_y}Yeo`XexZVmMSc+_Uf=F3vmf%WZPIL5FdeC&_9Z#s?>fsn zvS}fPb3!{Nf!Ts;Y!L%2Ez)(wZ;Jk$CEmW_`!X+3Wa`+iq(>a)uT!pKL0Q1%Z}>Mg zP#0~WQ7W _6DWE5AMmy(3kZq}?91322h3w&O@bAt0Qc%|Fj>k>Jp(f7~qb z@f8t@p0fOV3p^0W17pdmKBB*H+lw2s&NRSWB|A(ed5WsYxL5LhSqMVTru8xZ(bgHV zeR6_>!Z$EHaLMwp3Qcq5yfTHkOvLWc(49P7_Py-AxpKSGgH0h|?&*9G`hp=7msam= zZ@h@OjDiAlVG?<4Y#gT= zUrxt~p%oJgS#(dc&egB=N2m%rX!kGwl;Y?UTndV`r#8ixpOL=iC}#uCn696Oi?Nm5 z8!_hAihPsOi&D%04wT2*-IPJ_2@!KC49dpo2^j*hxz`Eu80+lGBEX?vgiTz9X}3pP z6|zfwVUdQ1|Gw}|vqlbccD}+B|A;aP!4AAVBGR!@i1Ub9C%n8(#N1s3Es6i;ah83% zUW|hLgmODNVvYQ-Z4W_zW8KYRWNq$GY}X6NZGqPC^Wu$IDEdLA_zao9{kFr4xnAhS zc;80ATjX6&KCrqpb5hgi?eXVQGdgz-u*@$ye|+w+jXudP+pJCkQTczG`uNtrz;AK_ zqP;6I{F^22U%F`eqsU w?#v}ERs^d1VNh|%eK*+KqHbOmA_ zdG}eS>c*K#3}xhCP44%K7hCyQ0Dqd~HyF&=S6CZmpx`0}$?tyF>1h(9?E7~nA)Gb5 z3rJ*ls=P&~sif`&)X<}?kkmX@HL0?R^brPlMMbbN_Kg@F6ZGJYr|KJiev1x;1Jp3( zK1zU#bn|_NC4FTaJE_gg)pD?#X0q5b zh3)1ox~bBzD#yWmV@p3=&A9-(%QaL%Y%C8kYHr?oniOzSWo3|57o{=wj;X~F8zgvS zYWY0{x2JVz#;2%xjUwI^)wM{O^jgl7@}gyp!4VD`lSRy%V)8PY=;%QzCoZBBhX~GX z4O*<6ifHKu*$_;oPFV32@jjlJk#gL<3QC*w*M+57e2))1?JL1vc?tr|3-201(yAIJ zP=TX~!Am3Q9Y;_Puj@3}lGeM-*o%4E V zQCd&ELS972uL#x83u@7DXz)2h=$n*7++^o7WaqUgM>?$v^WW?kCNVDVz>9JOH_U{l zr;tI0kXF0tzVg|GgPx=Fe*EL-mf(J|vSpon!6gkC4x4ELcB9U kqd9aQVoviL G*c_Nd`v4UH7fZgpHs_2KnOAcfA5p<6a3kxaV#=gWa%sut7uz;V{ z?p$+K3rK9XpNuuy@}svFZ7bgJH}yT80u=Lmp3M?6^!0?$)+y`BoL);vFY0zI4}R3o zc|V|WnGjRrjfxl+HnE(O6?`xM0u*d(X6XEt7j3}2JxXDXy2Mn?j%I&Q|E>9Z#j|xJ zQaP@PAKjmmWt!AQj6;2}rj ;L7Dl7IP!C^_7CQ(amJ= zsP9oY4|dwTw2d}IGuAjLVrw?p)L>}WI6iVGO}5TCl)-6wbhOpEt8XkRMb`0`iZb)H z3Jy`GpD3RWz})fQwss_t*UuNtRGWF)cBPX6%6zI4;(r%!8ycu~T;^&wvSTBh0#VCD zLbQowNNX8TN5cZc!$OQ)$*AhXR!Eway;HatOKpxzKT@QnQrS5${)$&(srEm2d@$47 z`$7s{m_N%A*n#O2lfNAnjwNGdZw8((m4xrcm BnoHFz6&ph?>??n$spIA~YkDOPp)1|DmRHD!a5gfpFN-XEH)AbY(pq34(% z%&4%->meU3PVZf|2mP5}jq Mu?UZzvFe>UrTrYI^dNi{lpW1083Z zXM6>Zr& PIh*&-%A#Dfl?WQ$ZYx$0oX8eO zMW=(Epl6wonJ+|u;4@XxR bmqyuRbT< zTi1-8U4bBmh6PuD;AKOKGejk0T3d@SbK$iz7kfZ>+T3j`yB?fBQ{jE>Ptfb6<36z9 zbok|55Gm;qx}?#{(|QaH?u?!|&1^T8aE0O<9<|k$o oI5St5s52SEuwrAMTpcFiGRLmJNQ;emYa!du_UR YD~0Zw1r-KjUw(HU*F2b*(3wc>iM5yt%}; zkhp62#DFTR22nxAt;0evRg6_Rc|(N$S 6!0|>Tig`ry2s!? z^5`rp3S@q!ZG3G07khKvk}laM$4aV@%U`}-Z})+jy|me2 `!!&~MTj6$`=%vAtTUH$YKSvX zmiDv#tg$uiq(YUY4f(dcs5SG^s#vRsBKU5*Bnj$V!h pk7)1EZG=hfcbPnh2n7C+`K5WiwFm+f{f`%*T+&cUdu(NwM#w>ni2<}$JZ zjV054>r(L4-N?xwLk+r~^!U{?iffAI^)_w)fQnquA6A-!M;Jrs@?LYc$L{R_Y8$n1 zILYp_tExFSpcwdN=>7Rnq{~ck4MIRaNe|)g#7+-NeVU9+TFZ^0_Wz``+Lp-tvuCDx z5Lg5I^y~1Si**^>3dJ)Veq#7FhT4_|CAUjk@Cc%^z(c46@p+odSwH84x^_91!j@V* z=E6q~+jKbCG9f|5rfItyJ_=QN6W@S7h0S>JmVHqnmatYG9xUR6P5VQgVU1ROSBFcA z)`Rj2MaY6a@=Qr)o_YR6d#aA`c35VQ{! `wLwhhh Un;c2GKBt02aDj$T1QiZ6- zxne7Yt(&p1%lc7%@D|qE5FKD_LZLJ9JNlAmQt|3nVRT%5{x~-A8T!9@l%Q=B+DGOC zbue`)a==*pPb`wH*vAJ*ld(B5;=dx4VrjEV>`Wi8=GsQ#4Y$=HY?3aNqiA3a$C_?v zaX3BtxSZC{wi|Aakd3R}_-w@92Ig&XAIbMFV<)|vZrxz|dZ&YTU^t`yDg>c0_+byg zsqNh*Hmi{S%8FkV=Vubbdmx-F*^yY|o>}f1Z&X6h58ulR))6!U-idPAzeVzO@5fh$ ziDqd7UeLe&cL)N4-@j!8*YWZ=nks6N_S~}JbeCdVPm3J?jSnXJ2A=j1H2l)nUVF9_ z`#4zz$h_Ff`EqsW8c@w2{?mil!WH+~4C2w}JwI6prt%V28(`b$FH_0@d(IfK?7aeT zAxxbH;?|4QeWy1C4i_(bhU~Ci|H`yzT--2ZJuzpJ zT`TJVTXTFuxlz&XzP*gFOdljQX))?Abky8^vRbGQjL@6O$6-)K{usni&Rtk%$Dg>( zZQ0A->or-Z7uWVws%<$yYrpRk6%TA^;`k2{oh6hw{(n~Q21Nqj))rM4V-v_tiw?by z9*TVI&Vn;+*StP1hu!Vq?VF(9oW;}k{BdwGQG(t6wDK9O?z87G{tnD0f_;uj{At>^ zvswR^Qt0t^l)q$gJW~R@hUI+_Drf`GrSz5rZkCkHh%8SR#X%Zodz`m1na{r%jOik2 zQ@%qORd!#zIE_wgnVE+t&t;EN#Ja_CXNIexOwyfMUd*HZ&)NciX8$fI(oK;nn_*Wg zDi5xWOG>pq8y+5TLGx1|6s*EQ>6=bneyt&6a>Q&IKUh^Yq1(B4^h2?ZQgvqM%Rg5L z>CawAIx8qIY>_&3F}X+eJoSgXzuWlY{kOY^j49$1)fj2FMlCwYx`y}m4f3OCnvz~q z*1=~}ba*ge`_ z1w>=;CAsW1sGUoydwZ=Pn9MV6N9v{jyB5gD7n%Qs@x>fvu;v|xMWr6r3I!40SGHG_ zS0_4^SkpZ|rgALRsJ33;ye$x*DTx&+1o%?;8#HKTaN_y-cL`fm{+A*{cndXb`9X5h z`2O;|qF;`$1gKuZxJL08{f#`AxpQ8AxCHBB9LvoKXDkdyhm5EVv|8gbQR(0iU|3g1 z3}Jqk$2&33W-;KU3T_6CoXpRch4d=vRnzl;#*#(PlTqWc4OfIxqD>}do2$niPgW)x zX|^9pT2=d+s}Wj-gcMb1M2JwuHZm3G O3Re z^oD)Lz?|0^(`WsUV_@b(;e%RXYdc>#RrJwRWk!cXp6`imSjUs)j|ZAnlh$c4Ve9pl z%5u#KDwMJGH%YL~uey!dC$2XsWIQ=bP_LnR3f8beOOgF9zow0hw-~ZBqbZ)hORY?* zr)G3Ign#8zH$E+;=e8DQc;`u;5g1e=MfZxhpQLNTex}7gEQrO)k*0C8vGs!!V zU(QIT9cifZeS#}Uy^pJeVlzofcBewMR?9I(z;2aR9&~rvwlfD!t5ByKoY}jAy3&x{ zHRHqm14mw$)@E4d3C=Qecm?uVl) S=|TB+G=z4WTtY_Z+_SL>UHyq@o6Qk;!*%C z1(u1wdsK7^6W}M<#bmWUxPd1Mi#=2e*ed7paNsw6BsB{%mtbV_=d=HmWU+Q7d7XG; zYvph;_Fb2vtZ6 tm zIT=M`HZDrj5{PaFop8|TpS7ZM6~5J|EosvqaxjN+F6WFuV?``S9S+p&+hU{6ciG5` za_@a)(_ng869+ JJ>qnW!CAe$~*)gjeqEB2*N=Cfp8B_Uggv*^;JW?Iz{ z;%*$QbW)DaoV~HHV#h4Wl;0*_Jn5*E%+UiSFqZ(RGYUBd!;e?%hYNknX2--3htBKA zPsWjQS3?0q;DL)|!d_vgGtBcpcET8KGX4iHf5*r;fWX5oOn1MF1MeGgX5olYd(wxA z``QxtcD!TbJ*w0S%-iv<(~ecUwI*?80Nls7GT&k>DRlKKV)bJR!j)4k68eLoInIRu zwFnw}#q?jJvHw%fQQ13=zHvF$8tIqPCJrrf`S~A|zW}XQEC96sFDjlfBau-|E8Kx> zazTQ%glUXb_*Ap^uGx4Cvd6x1arJw0Nrc{JF^5*yg~Q9j#Y5j?vf)g8BmT*lEHlYG zNWRh8t9~VLRHLXZ-%c;VOWyV>qKB0tY+zhpRkef8r*5NivY5rzZ4ekTFAd_~NBWr@ z^q!QZ* )H4P`6DrRqSWQ^zIub51H&b>+rIFs&2gjUk2wGS{1b8d*6_ zSewGz2^E(^M-wY>v#>ZtI+@Al%I^VX#*gag; #~NkyT?)i#}MxvEQgQ{gW0-GI&J0?W4j$&slVPYMRgI@ zXL+!&QR%Yt)JwYh&)YmkD{@N7{xf}@8fu`Olt-=;)0ZdGfN4pri66ETc0Nw}c9Vvo ziWEnQ4}M#zvN ne;!(g?NKnky&g)nTD)cP{*84Z1o*LUs=JBES*DxIY^uB9)+}WOmxFlCq*zu z?^JnxhK5zhprMrTk7Rk?fMBOB4XOCDu#aWA7{HM9R=S(=im?Qy(on9OVlFqSlP+s0 z{}2}~Y4s`&1gkpoyS%)Wu5)bNP5qfY`(Tr k+I0m%zI&MrOww*$C&BX50o8nI5d zz%43=L>Sh8_u&3bG$$o}ce= D6g{G$7}(|A7@vklrkQd}jyuA4fZsrf}QX@kvQ z>5x$oNmHWTJT+K4vZ0W;3I0CZ*qB9$_HRWRv_WtRWSNl7A690zQ-cG)xm+G&mk_d? zcP CW!3gdiyzXVWL7}DF8UBAo*yEdOM$?o3G{)hCY#1Q`kv20(?b8 U!Yh~YC8E=>!bKVhf>mnRQcya_!s;5VMQFp?^pxhJ#L@2?G_8%z`r{hGq zaRFm)NJ*!Gz9J&7dElL&tZj#Kh#x88T+SGG{x>2~r+4w@_LsPu5bmP~iwOjBh|;&+ z#as%bSe8$zaIu))@9ysYa9Eeh *xlLq0pG92qEuBY8C`|Ad{ge9+D@GL zrac~EbwRU1b^ *(RT9N_SWS45EHGP ziczFK|ASze%_LWCMN+IN*R-2`UT5#r-wqM_X^X(;89xuS;rBcXxTOhs&gsRJ_Hurt z+Fs2O>%F={ 7ysP(?7%_9f__vVETKUr=^x8loKsn;ihsYf_o59 zgxO-T#>C@$xG8>bx7@s~l{jir%3V*W30a1)XMMrfG?5Z^o-14Jq72O9uOw@p8e*h? zj{&!~dQ83Gvmu3&w6FQzBf9n~SdVjq3-G_6I&=FL(_lJn*q=2Ut zL`S8W8jt^x$rqLG O!`f9w2w>gS%}a_QWJC5CEVllpdn)G>)DMC;)h$SNoTezOo!K! zwhBOdDGd*9Gd25sb@6YIU3(NWb Mo-9R5Nh(SY|mZW|bXx%M$uYV_fvV5_O_E5O~X& z)OcOyaSd`B tZDOnwS< z+0I+hLK&%7m0VkXOp$71p%ZobaA4kGPv1Au7!y#!!%54ynI7}t6kcaM`Qry7X~2l; z) cG$vh%hRC}})B?kNM}h*oc)Iy69O_X&s34LQ*{ei$U&k@P zb(#CSXxyAcn@oG1=EJA5%qRle1)W6Uxu$Qdv6fgM*;jvIbO+`?Mpp-UT 73td3HSbYwZheY|%?XJZz>2g%$aDy` z19XM{N|U0MY0u3&(;(GrMDEfl>vpvqmlNO5=GTt&@ z7@jNo~TOLJx@#r4*aoO7rO={#1r0-t~O 3f=o9S9R7>J8#x}2gPwDTKO3;ylYmMV}9Ez=n^AH*y_(cy<%*=Cj>Xe__& z_Ns9_tD&YSGY)OKJZTJr0fE_Sm&teg(SUMMjq3&9qGM?fy;mfC;J~I5pu +-qHT3WO}dBKqW&A_?!wX`n;e*Xb94NC74|s0 z@)DEs$(W1$-Nwqha!>UeUiecu@7lhQ*W&lN wS*lr%Zz1*_o_JLuUg*1-ohL{}%M<)RsU9bt8o5`r}HG zlKpRUvQDS#55sBb(pO)T#;~~DoNo)*j3_2G?`Agye+@EwZ`Q_Tyu-Wy7;{*t*Te4m zA^)N6^VQJL^4 qq#gAK@W$g&}>)w`pG|K%-2q|#f0D+55_g^uy0T%PQ&|(*I$7b zFiJ=p+qZ8At=&&Wnv i^fV+MkqZVd-{J{Z4ewqH+oMEt; z$-0n>TfdYZCu7K(*Y@H>SAYiscN}Q>)k;?^UH0M_0f6cfzpLef<#?qmX|^9c>gvqo zecE0#XG2r0t9{4s@gjEa^*0B$zplR0 zdYn;yP+DWOTM=Qf9$7vy{u3^gkvM^XHNyIzhyEUH@Tj|7G1=<39<>r;(6fXs5E)E+ z^AGr~mB+9G91u>x|EArWN2N$B)}kka%8qi2Dl?8hccs0g$zPd^_RdNVQ-44Fj#!Fr z#%88Wmzm5~U-ifhwGARgSZU;x)kW4?>zLJ2`S60BOI5 zkPIK>qnrKb(W#cQeP1{UK42tNt(=Um;gpA0aYffz$|>#u e`D!>1+<_yI@>tdFgt z*<|O?^z0__Y@%U6yMX$0QUxm4uB0>18Qbk_w_R5;O7HUm$b0e=?Wdy(bntJ3PDRY8 z9agUw&l5wHd-t?kF9fgHt$sMP8D6?>)lK&>dWd+qUR6p>ccJ|3#1gPVl#?2~&sl)~ zLPcUX<}$A(mA$$z0i5z0{_9;DZ1I0ia*-xsO#n_`Rs>Lb0HXb=i8)A_n1{GY%YuT? zcW?k;vTJ)IT>k5EBV5r*lUM#a+eO8}B_}_uSrX*(WYB)Kp?Oet;5&Bo_y5qp_76p6 zB`+>U(6UEpXlUp>oI0#+xWbhI>uvy$NsZ-sNy0 002woi-ZaQfMD=)A-qO>nSsXX z*uUHmoK&R609E5;yDx)R=A!bV06 Fp_iw-VgeS^C9tjnA0f6ntX1Oi*0^B-kKgemm3wQ;DCB; z4aE)&E-q3a0sQ_D?K~p@a#2H30089wJqW@%V^$P{YO_k+E}o^4sOw59bWflmS6X0< zyG`v88JZ0Zv0@jND&q$uLoO8D;V~=yn)$VF3`Ba!;V=gNmQy7Xn(W8DHMT$S0z=A) z?i>jrpE2Wz2npa5tFcJhs+h1!flaxBVrazi0-yT6!nC12|D2jv&K@dC=Sftka=`2c zp}B|2t$E||@-2KpC4t?EAoygGCbKOBV@?Uiazz%zKvBZwvb~iBZ&FPw(JAfJLu^kg znNi)Z4Cti-KQ#CS@d|??%g~S-4C2asd=If7!~$Q>BAvJs;Y|IdYfK`{6alxXFjTga z=cv8sZE}&!I6-PJPc_U+Q;BMEzo5Xvl%r1I`O;=@i>?+m%U$mtMLHl|NYRSN+)Gtn zhx^WHX$<0Hqx|^3vi#fP_5k=V$P`mh`mh nzhof;3SZV({7~S9gV?AND=is z{Vd !Fro5b9+7v*6P31!p zzkB#~Nkxw?2~J Y8o-Z-M%68FbXAiQN2?PX9^PWoMco)-7RbQ|BNYp?(U!bbY6y#c1Tf)I(9oESm!g;_R*Zw zV6(x;;&rS_zvG4bP7FOtZbyQuG09t_AK^aisZyy@mGTK877(gO9ULiO1Dc;GDbAFV zfp*VjI(v^I)4Q-oGigtU46E=k&+MiUb&$3wHwofK3hcBu`&tCZwuUZ|{1HAj(|kWa zwsu`Yh{ji<1InVN-xB1{8+lhB$yd}%b% 6@7TDh+PviR@kI#T~ zlKQeUl)$GU({8_%IW;S_PKOi5549ac3~7a{jXc{zlenqjgxoU6Ne$_OEiTxsfuc^D z?G0jXx?C+@9aA1EF?aZi$az-eGM;v*1uzW4Xy0h}jkOj7hW69xZxPs5`o*7^3%VR_ znguh}{07h~JkS8SY~95l5CAbK5-?@&6efS74pSHED7*0SJb+h@IajEoS(VWW$EJ z^7u*SZCEHU7?Mby9hC6_pL0%n*dqGW%DH6=$<(KQjN_s^ws$Jg;l*MAFiE}LdfWuO zVLfi2)g(~`3J^qMItMUH001JXo2rmwzmm`Yn53NVbVu-$MqIhv$@&|hNCyDmy(jr! zgQt-EuH^;T0vQ|?fO!O_Au;A5yZL&Ljmp!T%K +=}^0LxdBJ-A(emizZLk4q~dJ>E)LzMGi~4PLwspvv5HjE848=7n_UR5CAl zEjK=TkCAt^cA&HC>P4LEC*9tJhih^E^Ahg1HQdv$xs4vo52$S-LO;!8cR0M@ i;Ke8W%#1Jm8bW*lCpDPyQp3dP;P&_&AY6+LY(6k_|rx(f8 z*Uw!A+>ZHOFqk$S>o8D5Ei4Qu=IKg$D=gS 25=NmY =ylFE*{q4XEt*6;h1$`WKDsH)CFFJr3!rHWLf3fNf{nR<>SKof^My>9Xr< zosH{W5?nF7Tx?q@a)| t>ZOE5DBA$^^$KWFmq!BWl|cUILxfw(u59 zYuq$UZ=p7N?7Gwue=Lz4h0ePBrn(T`YmxN$0|H+kfz!XOLy4qqEsJiMxA*az8R+;W zh;bu28T;j*bPmu&S 8zT0Dm0lObCG7dO$nweK?+Qf7(1k6N0?mo{fx=hD>+8ob(wd?3OrH z{J*}EL}H&(O3u)W(vM3V3@Yfq&ayK~c|6-H&+)0d&zLYUtYy_4!%n? m_)8NC3Wbs4k!%G95yVc+`0Zy*tRq zoK?ENeN@+-PFKnc={bJzSV)02Tt8ooesegVRh32o7j>!o+&gY?QW{E7chKh)Xbih3 z(j8lfUb7|XM4ie>^unDednKwC3%nwu(6Ch*1eJz-r_zxN(%&`NkBj0{b$tm#G0xAc zRErN;0ebCIm>u#IO{iot&jz(7robzcjW?!BLu$KMCV>Y{ZKgzK6^}uFU)A-d>A0HK zGtj 8IucnVxPq1Jy zKE73c$9u)_-(#DF*V)&$q0j9wvNOudi-c9PB*GXMsO}wZGjgz`q+BGXBR8j*dO(-7 z_{6I+&Ujx*Q~v?$HeZm?Nz+@kgAvoAVY;Q-@?yJK>L=Xl0hIb;@AFI3hX-r;S1#%E z!Khe^_p~HucG*-%BUOLsd-SBGv4x$ O2{$u;}Cz9PFxXy)bsls7Wfw z8dTF!#EjR*EPB5Ng#VlvP$pOe`+X&&K{^iwhSCHmK<2$r78&l&H-17`@9ICKScZ>W|wEOl~;my>LuH_v!a9Uwncn*`O)c@8@CG8?ZE;4 z^pI29>ZOx>uPJOwi-Fe Ol(9U=|2tY+H&UIKUT$ g^rJQS zSr}tB;n{4~nlxd*f|hj$oPN4e2ln-RpPcmF=-0KBu8(B7Y=BGY5~ z_(P~J0yG|bFMRp*pk!#cQfhCr-0>KIJiY;KcG$B@>+3DFm+RvV6gq#}Iy9_G7qi =h&p|dH?wU}O3-dB?y*>|2^&|66U(IV_y7k;wxvn)?!p1ur zB5=W?{ziDxV|aH!{NNHiZrCKWT*36n>p0V!^YCZ !68Ozg4{HNfbQ*`jsIji1?_v27_>6ZA z+w&VY@{Zq^l6@j}&={$2Q7n;&=Y7$5n|!A+G8#} zeha|%L)(7?7KU&>txxk*vtTu@8lSah20ZIE6?@4wegmCxJTJrJ><^^zfy@i>^~;p- z J~>Tp;N>_@ zi;4c5v~$V57>$0(b9{=P5$-!tO?WRkKWivkEg6$X__QG`R#*nojn~{T!@n}b&CrlS zEH)CUnS9-o7}ey2Zk1SKU>`Y}`7jWA>mE?n-@T7~iLNHXw4 DX=AFff+pA70DlK@h+{@S~VW_j!i;bgyMeLN)2?T?qz zDK4$LQ|-sd6|H_pZm((#R*0N1XK%xEf6{ICsvGu&x-xI-cp|S%FChXos@;e8K$ft0 zJMQ$BR!mR;k)f&^zCC+E`0j?E>qpN)* FpWn@9o?^#oQU--QpYpp*tPV=6&m&XEM_bNTj1*Tv8`9F|lp< zv8OZ`b?fR)r5*9kBn`to>+lAU)3>1&86FuL8vXhbk8OeJLJMMLZP}0Qsz1hTYxCw% z-)c1oN^n+03SRwY%iO!#P*B?1lJzG6Q?l}vqPmPJ?a~yuwh5X2*9@DSKH?Ay`F8*I z8WNWdJtH;DSCN%&_gmXt$g5Z^5(cDj6qJ6Y`k7g`x5xPdu{xz(YZz&c+971?=pN|` zhuT)=k{WA;pv8=AGt>}O69iA@Fy07VW&NgPuXsoLRz(bykP$PhM0qUy_=7b9kgni^ z++-KL6(|z+Kx{X?Nc5v?tA^Oh)Y?{Z>T-?8T9;AHJ`~eqvOujAIr-xn{&zV!t#AcM z^-8r``8 @%(EnWGGHkIzHk;4cS-tlO52 zPq;pdrdc-8I&;A;&Kxad$hYj@O{NYB&K*|2#;uB8Wl>AYFG~A|%(!nW1az`;ad6qB z^H%FQVpCFcCF60Y-%14sDWKsET0UDe*U%MreUr18PyD3>HgK7P5WH-~9lHdN&U&^p z^JZ0Jwkabz7&ibw;rC~s1k+;%0GK5G-*eUeYlBYwR?4y{?b$zw)BBYz47})2_D)?u zs@j`>5D%ZNg8saCEUeX5yx$?a)kYzdylG>mhzh1mzQ*pPUa`=?j5=-kxb{8zerDTP z+@_g2Y(M5(erqoBeu4g^Pi6AxvD>HQg6>JSvHo!bqIGJE-C29FoSoFv&oyY`1vU%{ zkr8bg#ZtP#k*%P#xvx%J5^d>q#OYVV2MM&e=N5Y!MVHO<{Hj7@+L%!l4`vS?i7JPP z!(!Dt^SeJ@4!zXuCmA6}p{BGdO} #@YmTk@$6d%r0+CN!3safxocB!!0`Uw^sl=Q^B(}t52(5{`BKIw{ zObm)-^9`oYX-iBi=G%c&_1`0JhKh?9VAO}p4f}1JeKcK8Teq Z;P(4)A(07F-kvUVY=)pMxFrU&Nrt7iU8h&Sj~1=A`&hUCHG3r*l ns@+qA#_KO)mTdN@udsn@Y|j$pt|k z^toH0S>vT~JTqSuvWD$`oujYi*@_#lA6n|9k>sdTCuzux>sM|p@-M!-WMPReYo9Kr zcK12mG*l^P)&p8vV)qCE^)@| 9r;)zZN>-M;^ z%0GI{tXc=>{`oC{SlUURZ?ojdzLc?H#AHp~*Jt{+$G%>vsxa)hv6|jSDcsR=FpJLRgHoV^wO9?MPRo$N?0MgS}Zr&?q(QUmo-!RD` z+nzK~{(M~ql?##S;<@Bs0A|C?_DJoa5DPAbDFr^3(GcZS2U2{jcv0zq);i=Y`I&Eh zg_;?B%@I=sk8hDfLPru ?ZCC4_M;(2I~Kc^FZr3@{6ri ;R8ci4*>0IVY4B$Y=Ka2yx$1X^^}b=7m)~@1GH2C$uhEat-9L?c91G=o4?Va^<3n z+3p=3yOBYHWG{>bBv>=d^pm}XVJE@pKq5yjw%ekQ2)^|nhBh1{yJn6@9BP_&Eo^5V zJ4W^ki3}}%$lh(@?3wHP?5j-hHW`F=2f))g$3NlWIALk}LUfGx2={^;cf(qb7PBi2 zZI^3IuE(V03}WMD_apE;$0DNM$-J?Z-%BX7(gu;v60a+ `wJUciGGMS3ap4c=dae-=!>$ouBA;v-Mq !6>mk0R zGgfm$r55@;W@H~#I?v{Mn9}#+FT3x^1*g YdGO|EAGXUMuoRbFbd7O72qoy|#kgUkID5FAiqX zx>u{_A0s&IV}NT;8I={aK?lfXi}yWqa|!39+6wM}-ly=K(y-`oSFRrf8(Q4WtANNJ z=knh>slCqwRbIFZO@G#xeH&b 6q0OrSE+G{ry6Zn}~0~j_qjeAJk9)n0r&wNWunxzt5NCn!Ag;JN?6bo-c?&c@RQ` zlM?hSlL1g(mIN3~P~DMkZ2{PnPSBA5a|gY<07|0r-aT|yF)Lf^yor#u1x?$^!)I$E z$Bs|qi!UQT>-VXU^6gt~hqSUeFR0J`>fB1kPzZKa |vJiWRi#dw*9F zCAZS(kx}Rv_r1?`m-PkY^B&9LIikZg6b3FqxgqiL@d1MkFAT7Txbn>PjS(}(l&v+X zp6tK#={ehfZmgm7=7Zm?xl!7SWR{{wrisi7(LPC$2M0a5^pyWGMdh_wOwqH$J(Y_D z>w2p^1%LrTYd;v%`JXIL5sMe=LcqWjecL?|(=sj3O$8sqIW4*&NLpN6a-8~*%Qc(r zU^`Q3{`PO{(~7=2xE1TeiS^l-)#^MwZe}5`( ;^F+e=Zm!; z#_G$s!S96{8$-!K3f7$dU4KK${X3XMM$eNPHWx>xOTRcc>xR#wTql(A&X-SN$zO%% zPj*pK>8ZB5ie=Kq@~muCRsr*3;4$x4<*sG_-i~sfH&MkQ +Vjov*p$031uVLQ_c{n{D2gncQaKk39f=$pF`0V^yi!m#;VIIX#!G83 zhpyD~l0&{W+h|P8a^2c-rbsR%8wjOHt_!yC?3T-;R_CGclM&3#0w30pN3j~1AQJn= zvCWw#l;Dh9-MZ+1FlTGd3j1D9gEg$$=l*!)iR{Z#tYa(-z6gIG=r3M_+2Imc7w=G9 zGXlwFw-T51+Hj_b=|7M T)GW?zdU?MI?_3q2Wz+9LgOu`;3Xcz-U&@R zTVKnXlo$%bbja>WF*{F##{xXW#z~s7s(r+Aam3mnwIl|4EA35!zwMq=t#t!+^`MMh zC9h&()4TnmO8vKDbH73VBG?S3W#PIP*?2~fQst0AirY fy z`GafpS{qnD-v(;amU |U3P6)t(5Axo}KiX9fq|2#hhT57|#PI7sq^Qk)%iO7{_1f%vB!%8?8S0J`M08VG z3jAnMB)WKL_p6FLC#=WPQAj-s*eueUTFD68eG9QkchNrc;9^j&&r?OSTy078R}eI( ztW6j8X;s6c_{7rTotLW`MQ?R->KZXGsMQqB4ZL%< |E;wK8S!9;`?Y&>YIk0xOdKC4z% MPkRkN*6gI@ z4kzQ44Cl}vpbXwLY;VbpkvO^0SnX%fq_u%f;ulAYayy+ahl(6|+q(rX3oSXpBA5B! z9v#0iyso!%e{H^=yc>VjBGzRzc}Gk8*f!HQRaQ_abB)NjPs-j=`Z~#CvKrLp5qPJq zxzajA%Nkr^m=gY<2nQ)U;#Ev)l9L}@sO&T;(1(FM4mI(Q{W#TkFmk=;KKxd*S2#sZ z&IgEYy9?rBg>b n*6ijif(2qkY#mXyvC<6VeRE(`U) zBu3F~0%93UAAJ%^vuwSnw|f|BXTPR2{^PG*_tMUIqy9vhC3SZL@28kFDMB8wm$s;e z?wL9kv*Se!%GFy+1N49`D4Ch_ >0Tm$QMT;%QnNyrQQX**86j#bsX#TRF`o>HARc6EIH z4QI ZMo~J`$?BmbIoM+o}3Pm@^oxPRaQNW=i?5B^0Qc6WV6#EcM)|Z&M=)572Z8ENEm`Yv&DcU?bb_n^s+v;98(Wj;cBMB>5(fQOW@kGS+ zKD!de_VeEwRriBssBkfa<9=gEqP41!s04Iuh#pk>vkyuc398O3Rz%%Z`O_;|UgVMq zKf#cv)U^Uiq>%ikRzz{+{!~e^W%UJsIc{ gCYHObtXr+HyO_qd~3?fLp4m!B2cX?h*IU%z8%mqfTH$3?JC zEtviB`9UR8-Ew&f7iy~MBpoDw%_BQem1}BP$(r=d498juUa}hP$Xz)G$yAMia=h?7 z_{t9I`S;}3dbYbp^`l<8{l?rB !xY`f6(wysp fE3`#FOV;;9o6u-^oBdb}Q3j>?UUGV1{_I_JC zo5bd`wXmhub)JdTfFVH_`}H?L@%F~S=v-xTi{vRw5Z4PfqFk@b3h?z_iu+xTcOpL; zy)$bRkZmBXJj^9h pw39_OT?sX% zBt~8Vvt|{JqStv6VbP@yBlse}X~oy142uD%;ptkPjWrMPe6d2%H}Po j ==Z1jdw*|u0gZxi;1OtdWdWf|F_ zge4F6d@Pin@A*G0NeS-T?a$L71HWCwJzd}pKwao!v&q0wMpSD1dunyc07;iCh-`3S zB^ARvJX_}4uVg3K7~x0c1bA=|)DJ)@Z*bPI%J1~S;Z<@`znog^ND?NMewPuEEZ6IR zE#`>7req?%kmF-bW@|!4%=+BR)W3Y^g|Hm*D0FWY!s!z38%VSQazFQ66s8ARV+Dj5 zA9J}AUXJ~;F%3>1vJF9*x7EjWwH?{+BByupbo%0YEV|RC-v{0WgrXFQU)0i-cRN81 zQqpw7U$Q}}zA>1tk(p}+!=Mh)^^DfC{IE^VuNr=pFKyylw^G|x_{TL9H%n!i2>8!p z+SYK1tByLe+h4=spoV8Z1vwL^HSTbCrpPXWx7C`Rq8S$^Cr7gZ2(6l6yPT=)tAr+y z=S|k7Q&YYFKBskZHDr*-=uVB&&Sh1 _*V~o}5QBEJsP#WBY5(2Q_g}7? zB*r3%O7CK8E_?*Ill^U@=s?OxB;ScdY0w!neyOe}um8hbp-Pp8H6PiVNOAxX&&^Tr zvGYH3M&WOqSzf{wk`->FW==1urk_ZF9;BBrlBHAEU}$3iFl*{_ptvSsD+YkbKuSvL z2CVdTaOW}5e>?{haI%u?aa_Pl61x1c00Y40eNnSA eK a&q&^`L3Nadz<-2A0Wy*b5>;YG{{IJe7-kLt literal 0 HcmV?d00001 diff --git a/docs/images/column-configuration-1.png b/docs/images/column-configuration-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1abc15b4575e0a25ab530666b67de664e384e145 GIT binary patch literal 46822 zcmb@tWmr{R*9M9-(%rQ|Kw7#Rq+7Zhq`MK2E&&1Q?h+7bHl5NS(hbtxb=Ky2pZEK| zbN(K^yxe eU`1H1G>n_dqr9 z-zyi@_hL|0qa?e)7g$SC1yLxdnmFVKV>sYDlB2Y?3ltPu59HsgBnC8MD5#%4G7_Td zo(2bPNWN+xmY-J+tfz`(#NQ&C_fH0C%@v@i=dgmzan<=K#9oEXIN{)Tq+0s(35}jp z@WsaR1@wnFsrwT6!N1RVuMPXPH^^j8MI_fY#Ny+X#eG16%b;rl2h&B74D$-NUx*8s z_j)_arTzL|aA&bD+}YWA5;2GZF-V%k >SCH1A2X4kfBCQ<68 z83TP3&+iwxra~NqD(6l$` !55! 93kN0d>Y{McmmW;`z@cp9|hexZIt<SC7a#L0g*CqbhjUeXepUk3PO`R(V@3j5FT4h$6Jd4DCOaIXjQA8~?ep(Mm zMeg?n#;vbG*jg*y5a-LOS-oA0Ri{>}+aKfNbuE9F#{r(T13v_7jUuIe3iZGQo-V-% z%BYby77Xax_|CDwAqCqoV#^yKMy=_X_xDFZyaHq&vn-gST4`%ME(cvtV-G@xMuU|_ z7!eQt&%Jw0u~Y9Q6HpYTU-mnLecP@{Eu&O^>sz_|%eY2s{ w63)B^UKXG%s=l^pqKZYQ|J{z9ZPc?&czbB4&N( zj%3tUZJPDKv%4JHCvfX@b!H}B?rCE?tV9%;Ym7-+71Or|DTlEgxvB{?6F=n6?;XwK zYDRaF^(2arWg+_nX-BL@uUTc1)m1KiIm-yj9++{g0TrJHJ)P`??%ADv3Om0i@vh-u za`*%7Hk(cz86A4p+}xc#dw8#2HB%HJK^B~QzG-OFd@)77;&*y3ELYnVFks1Df*dgK zG(cUwaQV1^UWaIqD9YWMCw{6m+_Yi&bPdM21)Om#$#T2VuJ63%sb8Z`Gf&wq`;53r zcH`W8^w@XBb=760<1|z5=)!9;1>Lr4;W|(vX~TuU+2K*!{+Vs6^l?WxK&B$6$`i5+ zuLz-fq>gNvB*MpS@S^Fj#YLev^Hq-=w;{ZO_V$|UWdnzKEBENxv++*i;3s5*VRA0c z;#nvK|M;J}V0XVzh6RtN)*aItRcklCs3O5+VYAi+d!d$l^4f56XI+w};G@5fQ(md0 z&3?}la+5}|#Y+?B(`{|T+u=RyYT4k#nR BlN(+bo_O!*(#j>Jh9<6L%s=$)+8t|s43HmdqAY%2(`t%d!&3RzQfUY8 zspt4SbD`yQv$&c_(T`zlXxDpTtXa`(+?1p1KKC>dzI vv<5Fpm%YuAkqwt@)n5Y{8R35+uG>^ht1d8r*#-p;Y zyr}N_UZ8t0{3x0@y3bzCf2rz(7L{vbaKz!r*SRa6o4nlru+wi$;raBu0laY2e^*z` z7j2NUJ3o6^^6bA6^?^m5>~ H zj*vmhlKUxj+Nj=V3Jm(`!})9CK~ijpej+h?3GW3Jn*>k|6d03cNEiGzmsaTN*td9j zhe$FP>;)d~y89l9-&p11Ez%E9>x^dKJmurF*Xu~eqAg!Pw8x<0!RU+~hALe<&bDwp zRWij`*grOHlwIk&ynkZUPqgIqK(RAEYM}td|H&1$Y;i5p&o n5AbE!H+5pP3RMTDzH0M<$21LHU}Je3;lmBn3Ry|- z{@8KLB@q&mdc!F-S#&*=4tSp;{D@n)CNCU1G~sjMS- +t>P)2Vw{v&9wC=0>H zw<0)}2X4iM9)I7A3|uwqUq!9JU76cNOJ{6<{PJ@jBsV61e%q=j_ZQ1VTgtDpbN@0Y zlRmj4;vBw8GvMyily6h_h-n)t+IeceN-`97)W>q}Cc7fEhDEYd(ic=>QOS6RA&2W& z+}WviBwda0&IGoV%_y5BZ`G4Npu @={g@TW#Hf?KDlJ=?eH{O~ z _S&QfA@Nf)pW!;MifA4TnqR}VxqXnD6& zw5BS_r&CB4_J+bfcGXStB$cv(5b^$`lS}0ZAFHrzJ5l&ZSMapw9-Ls);xrk6FnZHf z<-v%r2uovVzWs&eWjjH1qgn~^c0xaA4LlS j@U&gI5fW z73J!PS&D8S=JfB%90nXjV9Ps?WIxV2`~b=AI8E#N|G8!{+`H~J_OT1?3-FJFS-J5w z;K-l&mRwlqg#xb!i>97hh~)Z(A9^Z;m`WDE@NKPxv);|hgDYY@^@ug=te<8GeNfRo zQzP3o+{?MW1J2DiO)J^m;@&WGdw7r7d!_ayi7e4Sx9QgX!>s6DSN!b;em$`_x?;=4 z2(7zc41KlF#KDep m(c58yAZ@J?d8;vb!Cb z&qJ3p!XcqIA^q>LaU?F`<%%EG=(L5~0g^|$E>DGicES~RT$AxQX(qf9N(J9-FW*9l z+T?-zy#3=$=KYU-_6qUSKg94cnl@*Q`0c`X!r)UrmL}qdTdE@!j|0lFp+RDv+>KBC zd}st=U^JNHzmCH^5p4Ts4Z8X%HeX47teTfTgBSBKN$m+2oK{KC7&CACVfuwV`!pSt zH{JF*O7zMGc+R)(v+i6#5tGMmGGFJoQBw1MjkdTNm7i`tWdtRlamTo(vdq}}$(2oL z1@Kg~Si4#ncr@BC^d{oF`_Z8lyz@4Fp%+++i67PEzP^5JAFC*e5{hF`pbiyJD&_Fc zp7q^UUW#Y2we*ntK=jzIaI_lqRaOB(yXa@9Z_`yrGB)wE^79h2O!MyzM^_TPtg1r- zg43j`WP0`{u&ZyGZHnTo|D%$ZqT jtjPW2oFcYVtWD`C-aG%(nu&=sOflX+oFvxCYe+@*zZU#0DFH*i|^_M32 z(|xm|v^g5tNc7?ugiNk|knM=}L|NsR{=*!_2MAwcM-Zju3&TbV&2U
|fI1Wb_!ZQlND?H?`KlzDkw N{LMM9&r zW$b(_5B*IdS9x`z&*?;*5&h9$xJ7)CEDA;|;|n#L+}p&riIlnWXy$0 {aP`KT9tt*62AFV2QI(MKy z`mJuGW4vN 6Fu;Ufx&5PW@hG#$XbzNCSSmlZ>oHIz_Wiw2+#TUNII_zjs4T# ziF`)4IzWL{-C^i;JaQ?_>0EY17Y98N*wS$RA3KBK*e!lFy6!qFD4@P3b|UlIj6XX& zYi@3yDpnGwR4$3aV@eb78Y)$zJ#CRLowL=c-;0>Yf1l0oQT6jD9&eFqDISY~@BQHh z8cB(iyJ(OVgJu=u+qa$QqVIESy}Z2Sk{RDJwb_kj34R^?_wSb;mPE{*SpL2h=iyH( z`BLlfUrfW1QWlGq$Qu@dWn~5g4T)#hf5j7YbTwY`A7?cC-kv#a^ij^qe@jX#RUU{J za}S5g;5dWh3sjBs?swc9z-iJ8O~cRQOrkd{l&6u*81JR(lvGAAk)6Y7B;2H0|7;@_ zpYt6PftQS3F()WA&FEl%)!ww{^!A|<%^Aw+Br4-#MKp9ZD>tNZr^Ja4unJxkSctgB z$~1<$G#eEcuI4+VnVdwZwfLA{*h`R@v}<{2X%V _`B*0H&T}vyJGk_IaJ6&JjIkW3_gGV$=DrKgO%M&rtrEGJi<(oaf?6%~wTk{dkn2?qxU%AIv(DE4u `i?Zwp&U8 zPahW=9U2nbAb9$g_)@Ew-~h!BtU2az5)%!R2Gi*FwXfbWI(9U|t}CYlNplcI)$3CA zGG)3|k+pBA@GxBpZ96eSXvj=PJgc}28aaL=+g~762Uw^2@28_DLsLZxrU@ky9({OG z<{h72Q8^F;rc?UyB`Q}DHmWo%2m;DS!lwBSCk2XFR*2!^%(!iG+4*U|G@pQ^`Xao9 zB#vG-6)kQ5#;Lld=6kmm1+-O@jh{NT)Y9}p6%l%IsJM8rW^9Ce hfAgN8lp)% zQH#~-aXlCjb1cUdsZn=>*d~@4e{drMNDN>xoB7!{pW`-7nnW@lM+~gRgbtBBtq*VM zCsqhO_NI~Cm_1pJv@k?w$UIjAeU6&KD!Isz)KQz^aHHc5J@YUS_=woi4o4=bA(F%^ z)2PvG4BdP_KAt_Mp>b* jBcN!>L6OFh4aDXIjZ1dG1ycmn>m24uM#Yf{*18|g ze|J#BFCfqI> |zEYYzMDDt;r zz`uCFph#M#L
lbEe3zG(;-M&SnV23=y3tt-S_zU%94(_; z>FD=bZ09CDR{XA~l!Q_5x!eNjFOFBpZ7wcn4f6|fT^8{nev {pEE06aDoegoWKbn;1@VCHF zs{MToC{R4&401s@Q4b(VsaQ$2p>z@PlXUfL*s>l6O=SP2cN O{>pa~&G0x!V1*)bxl^SGr?rM$f7Ah@n`|v5hB2-C=r&Lr`CmS3L zk09 3Rv}HDJY$X#N=u0;yu#o!zo|r7$;}*#|0yz8kRrj~OL(sMSjhFb z0JG56o(sn;v~NhqF68lU^9Mri^|B8O@#FG0x}|AtZEcG>kuu6?GC^+~oQpLyKmp 8@f1*@WeDLnRTocYF?>4d9;WK|E~M)sCQ$-FM{xE0 z79O3 ooJ1ob$oK%&!AaHv)r%-3 zEOTJ=T*5p|0D!8L$%p&1SZr_Ik;lHdG<(Eism@X nA zT|Blah(K+GiasNm^(u}U@+%Hk4#BINx1Ah?Y0iBre0lNyov!0B8X00l (Yd&uzoch8kzt<=-J|d1E z&_HZ5FxB4owKWH4_?}re{-X#=;-Fc>0v!7oL5?@4(|XU-<9)#6oUAAx;iNr{7~C^^?c sW5KURaH`RRKfp;jpJD^w|cQ#j(!e;K*=2R z-~okV@&3tLH{ iPxYRPO69J0l)Z%(_DTWM)T0xIF>15|NeQ&MJU zW-^8Rh?GdPG9;t$6tV=irb`oV^cTPVmyYLGDeLM+5o?sHN8z)yKVCT@ps90naD1n( z&}*tKD1a4)l?)r&-r53aYr&6;pFoyE0e!^I&3!%bo}7u9S!x8vQgi|Ut0vdoNgx8* zt+b;ygdsq2j{HyZvYz&Tl9yU&ZUNt$6Z2uRfwALOpKE(*BiB$A!k~TN32p#YW*oga z-9pA^p5AqKBsGJ>60(q=>k5f-< dkKE~Gl~Qp!62~7p zu0fAk{1R^>t<1KQZoo{nr;`(4{Edh<=LdrhuNP75ae*v=Di;tg_O&^iJ&Ga`YCq@4 z-+HZ{@1zV0LDKWYq8O_Zn&E6|M01fQpA;SYgJ5(*=*ev8q)ja>Xj~Do>gG^Ff+x+) z;VeW%nUr}Y&8GRZH7L-0;<5myPK3%IB~x2ln-dqaAt75^S0}C$VuL9J S=id=IOYr+g?$#w8TRM);D}m;$zsiAT@qCe6l=f_W5;i9R1J`+Ddt z8y6(7V9cV>gG#P*+Ho~@5Y;P)f{A`tXx9OWrq+ij2nr(_IJPYH_V#v%qPjHcW&C}; zHcC*Uo+?}DC{_K^G-ETW(E^NL$H2h8UWa!Ax9h#y#z_=QJCElHluy{p60j^hB(cN} zjGyGH%F155v;*i9D2zx<^iq3 N_vV|AhFKqp$Yt0de2Dv|f{sdCt z+llF;)#MLi>GPY{_kO6>LMbad3g@?vM;u_ B zHJ03D&+B-tEWEf#q9jaA1nI=YY}l_VK_b}K^ipd4nTpwCDNg3X71QwOK@)$G@Lari zmLuKu&1I7W1m&^{lgc@UGKkq+_4ShZ!00M}39X|Isgr?50m&Uv*ppuH$h6TrE*?hv z;*k#?^G;Vj-*DgB*y=E$k0Akzy@xEu#h6b`vq;#Dy0g7aj}w`emNqWCRT?qyae}*X z>g@f<(9m(Q@=l2>Y2mI7*zogS*~ 9`MM{dc+ zON2(2NpD{B?AhHRS9u2)ZYz)M1SAblQfu?|?2NYXl|+Yoil=2f{7@i#gRD@gKzbC7 z3g2BF@c6Mt>mhyRfu?pM
cM7*S79&ytm@VUoFj=8R3gZ4ob?Kd{@;TbC>j5 zSIOCe;lf$Ju(vbtVyhDBgA*2?8j2f+HOp#owRut9KaOOfv)KD1V-}=Uh=i#|Wnt4( z b zj(s}x_}bvc-Q}?%n@1q9oyrSnu?uc7Xheu_y8I<33Dh*)o#b#ky@~BLb@oQT`m;ZF zc)xkjCoDTH8~@|BfmmHiB99VS_~vcC84Q{G<=zY^-s<*j%b1L7k+5!dIQNlL4Y_(| z^`kU{|4C& @;fiF)ZkWxy-3A|v5*6}Ji%wgF3&0D~JHU|n3Fqsl>~Z^B zM_heYCd8CMw{||8%43st&g1gv&a455 z`6F|bR;r0P6_l@Huyp(f-{ qr^eude$!f4X2XP;nw?W{wUi*0 zvfShK9{hyV&EtUYrr>Mn-as+YiSG`8QL6`W@ZMTCM< 4sCygJWx|#(Sr%uUE{wxqME#Q&1 za<*h25F8BHf+WNizO!L5bS-Ju=Bm?QAFl*l{8fpO>W-+wkjx(U{kd@XmeqUs7`;N6 z`$Dn%+D9Lrc!WV3OBsU>4d- %#nSTMHHa^Op%@neEEEt KEPx(od9Zpk8D6ef232 z2EqSwMl(E^mh!*cO33rXNL(C-qr!45YoPf* xoq^8MDU-RwH|!+Of-ol*u*p!#Y99-|hkX ?VoB8gH;JWcp%DF% z#Gsk{_3LVwk)5&c`Po@AqqeG!_d=GS57xKA0aYG&v+X}M!T?u9w06d_abD0R221Pc zwrM9X+9P`j0fZVTtB8l8QNr+Af1#VfP8_u5NCN<%_qcy5M|lVKx7l@$fKL4ri8{h} zR-FA&{$ggscHhNDCuIqmUqeIcbep-caIhzTRtZ0Ob=6^hC_nkui8!>yHm!tN`F13D z_v>ImIQHB}OlW-3^su@9qK*-fSxnk#tVmdy4!hMlmz`0dvWU)Wk97@?-D) Q! zz#1N!9++!ctVjIfk~I2LXaVX{(aA~i&`!!2HN%+MR#O0(J>rrg$sUW_r$E3!01wDK zlbRtO5qbyt#1hd4rv94818f1L054NIXlG})iU#d5 kA tYNom;ElG2U9$X;k(#D!k*KHPQgZUee-YyK ;~~~0(5_BjR)N*_78{w=$ogWk&$ qdA-9*`}LB?%BNQ_jCjaDUWr|eMjKHm{UMh994`rjfaYs5 zgT2uo7Y1E}$OPNGeSQ1je>`*5u0n{}+EGk%zZUIRFxc9yN%*QU_>)?rP4;+EPS!gB zrdp2MX=}SMC7Bdq*U%Dh!L$lhlQ)Z1<$eO2XC17)BkA1L`Yl`x3=Fm2VjNP1s+86K zH>Y9WRc@GI-DVh=Hp)K@g|BA*wsFoemro-x)KQZf&~Aj`folvk>)Sa;B@?*$ts6$s z0Yv7fQG&gozIV_zZbr%^*ff*?H6D>Oh%a@%db$>jEcZQJ86W>d#E^x0RpO`$A{s{s z>o#s!5T|m}ja@P#xNKoD>K6)V<$y2%y2{_1q>X($ad8w1vE-F+sZu&wZzisnxWq5X z@dvAGqvx>->;X!EXuEXh^{1oaB>CO+8+Pf0eN=i}Lf*{BqmvjGlTT^kokl0#ZJzYX zaH7UjbrXyOphDHs39Ew6-mEWy@wm-JBHNL@sx=b7&-9AeK 71eNx#2h ze&UxN+x5kzrH20T#BDbpEexSVd9G^RZn})g)W<5FBTW@_^h(IbSiKopS?wmhkwHPw zTvM@Dya!D9SrBJ=CnJaGO5(L76qgR{39Cv!QP7@_-P)Ph@z8wpoI?whi7{W|)sjdH z`HTLJqL=JFfKKao<8D377A6|pfm4QHVqMrWd>D8X0 =?_#cfmV2CM6RaWzf!Sj zA`sG{ z+aKbi1EiEIm?M=cLN~#QDIaKW)BUuaYqnds8YlpYn~fjM0yWa7TO{;gGWp=#J(|jD zyxzjSW~gnwVG)g&-gM +DMFs|p z9wH|!xeFpd1{XJvbcoe+e>uaJktCU@K=EH_46((&b47%3dWfDcO_xMOlknF5_%Xfp z+Lr4rlyYQK(;<-PIi9XdD!MA%=!GukvU@MLsTLh=UQ-Xd!o|sCb9;I}-#-hi#(SLg z3$51e``MQZw3v44k1d`>fv?)0(FsZKZuB%;#y=)fu=kpr0xieiZ@|cLE?lZ5(XAS7 zSKCgHDNoiXW#}!6dJ{R%vqDZ#!fDG@auaO s&O0`cab!xxbxf+!T) z;XfPOVIhA!3L4n9Z)E>DXA4vuG6cM8XNdl6szL$9bHL_C)43gHtMp6a94EI=d@|cZ zy&rOE2uh&t+U(Q88=tb>iFp~?{5-N}$ig>%e&-3adiFMY@Q))k%xxb)g0c|}AJ-cL z2F%u~w$aRl=zDn>PIk^=h1xm?Ev!7@Kw8>w)TtF*_$!&iB&QB7?5=fv6&K3~cAWT` zXso?8>{k}dv=4pJmgR-nPKH^)i>+RDomL`!&XXF6^yZ&!HQmU^9r^;STJY~r4y0kC zuJoJGh)@;3#?MZzvd+GB=G(a %9cYODt3O&}|bJYK-L@N_+ zM56FRR_54KLFyrl<=rDHe7;r!joMaI42=M7;Cp0?c~i`SH)VlGIlOs0M0n0xj%S zG{bvP5$dI#h19b3;C6$AD$Lu%z@46**AIG9u?tpLIw-1c_rr!yhc_R=z~EE xBcjod4(4@j2(cya5wmru|47XMY?yc>Z!P?akaU;)scycvv7d_0TWz0R7wB zDK*9RYhp=zgw$sC3}$ JNSo{5gGkAd$lK0hWTq!W;spq zC1&!4$HVkE_qIbz!J(r>I<|@(@cq*U{sAY#*Gva8)@QGHiPw+fmlGQI8-c Vbhms%{@yloqT=MB%aqhC77 zQFN}7FW1pmp8R9g%aH_Z;l-;X4c*ARcRImUlL3zr>Qj@l-f~8f69*+h9g*#0w(nQZ zaT_>W@*E~pFl{qN42~JA^fJ|0FS6rel*OrKhTF}3MQ=?q+`RkmgHu`~n-2qpnI)z? z#$l=(_IZu21C*|{MxzRLtqeL!LXt2&j6qI%DQS%IA6-6>Q3f{ZRRIYV<#&J_e1Bx^ zVuDshyGGH%LxiH1D4%iP|Bb4INNYnBH(0RCU3zaPeC{QHk7f^cypaQ5br@g`Tk}1v z5#;LbJ+Oa#a~92Em^N$PcCpkR_1>NMV{GA$>zOwZ5s7uCgW js8`$%N=>yxjoTb z(}g8j6hn!uNk)hz&G#aA*plu%g66o4!Xwv>tqmV$k~?V4tGh`y=N2>fzcWVc);=gF zUPLFQN9@zN!XBsN_;-mbW^R9%_pk2X>{>sq3YFTyXGIoid}*>s07tJXaKbfQW 2{Ht_4Xz^YY^>V7p3*Ob$HKjsp* zYZJ3PM%rTg #l#|afyAGkOYdaO}3@+Ckc1G|4c_)!tK;QG-bi4JI{2HUdW z!`iOCjxA6mzkMW2Vbp&!HgM*>n0nYk&yRWvXTV<5^}1ZRw-ENy`*E?!<+$y7dBB5g z7G=l^h~+?u*XS%cewIl=v$$a&G&X>jzxHJTmFwMjao9@G9BO+F@&W#B^&Dd^R+B2- z#BjJYfz#wBkmWv}rGTkFb|atC<$un9-9^d)S|rTJ)K^ti)zGkLK#)R3glW< >Yfq B~9ii u2Mvr*wrtXUvFkRnZKQN6x=7@e>BcGdoURdjYm39(PN4 z@mhHG(cwK<=nA32Le86r9vIlQTuhW?=3hm$bXUySB!L=V9m>c$Fdqg?2fenS;~f|p z!imcNYfdfnUSA_SzS%#&(rsriHekz%+iY|36Fa-l^6#ym+2()wWHxtsAN#D}7nw(X zHQlza46@bkEBY?&j=txQDaDDJx_Iw#=S!w;aaoK`?9bzP+MzLRBM9GS-=W{|)Zgb0 zQ|whavF9Na$Du!Kd;<;Eg4T6t@s&zlGRQqd48e YYWIFBZl>Oc+q(ij zUOHpRR3we1vePIyY}_5(WONrv<{`*DyS-8NTh4MkdKhfyp6!!0K Bl ~+m}>$%Q)LR4eFcKxpRmT|$qFWv^5M>A4^@qb54Q@4I}1`37EZu 7F3AOoUQScub!xD zelSZLE_+@(Z%{cMK4kyVZ-+ZS+P1`{wiCF4(aC}~t@~);k&>&{9M@Pr^{K{0d%j7* z;i>Uazp%*k=}QEu1GCz;YZshK$XEJ0vt4bhQ~?`Wb4LTP=B$tO^<;}rOjf1M%H_dw z-2Ro{Z=-fIurCqVs^!8o_=5xZB7f__10TGUcWAKav-n6B)>|c p?EW)L=ws^V7s!=kauGEZ{tVcj?Zp$t|JGkDEn_>0PGc^)L3Z){Ds~rgz*-{U)Ui z3%VTX%#`LmB5vSL-#PzXj`=qt8L8&C_V;sT0VVuPCHsPZT< 7g?~|_t%34S=c>z4E#Eq; QJt|_x*tSd z?(gH(kKDe!*(EXzR>=Eh!>Vu9=t^04%>+uFbT?@zyQi2oJj6#UjxaY+%LG*;A5Gbn zy6G|(M&JgPqLICqdZGZ5<;my2aT=%17GDzMml%zI_@dBPC1=H2SQ@FUSg;^tsY!Jl zCz{ve4^Qd42^ZzQ!sM_MN|c;Ar`c>Wq*mE$Za%bV*d-yU9N3XRX6xCh<^DEC*|0iD zHB 6A3-E z$>k$=< 3iPFgB?kYB~CGiq2tW5o#?O_^&4ro>L7=yBa(`)9L% z|CJ>jzvZEgfl<7X`+5< >qEx^z9-6vM!+ zR;Ln3JsDY8-hTqdin`=fOx_VGobRw`H9F=_3@m_tICf|9xdD?{nsOGFSgGNC8F=T>e6%{Cu2^&NfNu=VJwgrq3YpOghE-sL9It(7j zgW#m&$>^3jwehvuPv>^B4TGU*K{^P>fE!$RKPJ49!)Gz*y8B3seH2}&x?4rT UE z8hBd78(P|(5sHVaF0VGBE9Y I++R%J)V?`ziDbVcRY?J->{N1 zMmt(&WM)1ZV*vOSN!5yjgw8>g<$u?}(s~l~g^YLouE)Ls$vPfB$Pnmie-jq_gso2r z#9FapB+$3C%oEkGj(W@~OZIVsS?gsY6CJ2(vv3oACsl)FamD`(lMp?2;6pGme$dR; zuxB8Z3aG 9 z*K-F~B`}UYS&=%?=fehZ<&Ic (4+Fz2C3|DY5K$8{EB%48 ^n1s{9TG&xz?E>Muth~H%5-+;Q-lnDsN7D1HETdCeE9G}26p1rzbOot& zPoN3(qIGpXhY7AgvJ5U85$;j6ENk@ zRCZ2IPRoCdSvtDUxRL$p))yGhZNL0YiRhSz^B!1>r&Vbg1G1kttNMv ec z1~`+S@_V{`2;bnf8GwPA?=W(M<%fBoKkq!8JaU7)aLwZeSrWNIUVz47+<;qx7!cKh zN*$PLj!|9<;n7a-Nq~&1Noc3@E)tfjmno!kZLruByVHYOao*r*5iZj@tjgrK*@tt{ zkfr_Nql}TFit%3!@%*Y{5=d)6PVHR%8JMo*u!O^uUk7ymx%++-6$f=5`^PNmi?u2i zyKD}`7Zw&WrzB!yR*D;`^-^OEdc2H+0Ifx7_A)oIvN TEF zj3J_J8NvK#U`#kw(8t|ugB5T`xHj|Q-*yW>-`l+}20^eXFe##c6E#r5h$11|(~6Dw z5$eURYPllb{AcXVN}`c{^w+P&MxbybH2) KlgpoQd?_F$ds2MsK?alqrxAKRNKBWu`T#e-A8N%9 zI3IILc|k!z1@Ojmg9|7Rw 4o7 z5VdZOq~3|(C|cCm*jPn{(t`pK0ytg3;fpE)njr@Ows@-TcAK~w{ABqrP>H5HZVe@s zYY1Y_@t}D0(I@R~P>AWEsTl!6erNl4J$V6+)EMR5`qEnv1W$7m81deFk>ejl TlX@}U1I`d6rya@pQkZS*Ozv9bLVTHfI4`vQ<+3)u4m;5`$I z6R^1x=&cyE9}~6I%j65$GWj7!sX?E_?{2%&>?Y^!{q;|2_&@OONp2hRKPJhD6#;Y$ z0E>)*xVWgZM)lLNrlB9)KWqQ`7b|OeOuyqMVNP5D%l$WKs2duNMTBc$#IecpsFrf< zdHw*b>VNL|-)O$&oRpLlL!h$f-ogt}keMBp;$|xi1~V|X3%viL-|89hMM@2s5r75Y zBw%@g*x?MQl(qK5hY$Bxhxs;dSRe+E=9-_I8whL;=Q$&LrAaQu_ecZ-68ouvyIvv= zBuoKArjOSv0mp3~E}&&ZtXUD@5NilfLJ`Oxw({eILZN_}C%|QghD^lI;p%X~5WTE( zcm-cIQ@$KO0C*`7q%^71KJ9 _q zCxb9j^8jom;7VuO+u!;p;{4{3Ult+EefJV}AdCI)Nbw&Oh@IV!;rk=>VxL14tg#t% zy^t6X#efFrgb&c91)!7vL S#8j^ngC3p0d0xvgSonovsH_M z6d1tW(m?$9Z_N5YKLZS5p1$|_c@}h16qzbt1T?UAr;5`@EM6jc#{Y`2$YuvMFA9C< zB@V&8O#t@}uJ7xD#{VK1KsHKJJ-c)2*%&MZ6wD(eAnnb)J)2T>3e&j%#PU~UBQX@T ztQazi0vv>>Jf;``o A=)fc-`K492Gx#iy zf5EzT&@4^J&s$Owj(PY$cFI`cjaiQj06j9xDFi1(E3+XuOZ4AcX7`!iz9r?EE7A zpC3U*R>=be1EgXCLc-8T1nA-hs-nd1g|dm2=qd=EoIS@`w#tk`;CK3#>q+>1;mTB> z?uiFSO*wOu&8Sl=J|Z9>coZ7SiI;!ThW_({Yu}e~XFNYSD2mu1XRz1(F2LGFw-N9I ze;;R1ijD8-JW~rvZKq!i1C>hp;rFHSN=F+JhU50&D6sqv5hBF+_BU*4zCC1n4u{z) zyB~UCz`e?=-GG)$iKZLrkRQL^66&yobtp-X&f;)8Qt|Swt_>yhvs=9LO7vFR{li_+ zqZ_}W2?T9!%E2@O^g}U^V{FQP`8t*+u|W= #i5{oFlX)zH~JFl zZz&YMi>PqDV$g0?eqA|)_NaDyJNYv1_NP{nbJy@6aSPt}ML#C8lTK34*nw-^SW*%! z8BFlSJv2lIqDJk9Pfp^;mnp~NINP!(wsNvZO8?lIi!3J7cIJ+6xWE5n?E$4*6P{lx zIsnyaDr)EHGKzUsIM4Aw&z2gDVus@U)1RsKZgo9}AH=YW%SwDSx(kK(_b2&{H{qoY zi8I~xrj4dS*QL9@bMyBZVzl!nOD*@u2{npg9st zJ8}(muU-W)Ot2)kfjV4;_h05ocI1AC2`J C76&29jJOgM`$2M0{ Z3?SlPF#xEtgYB=++*bsh2-d?I^%izPRCz%Hfafv=qwIeZ#zt`6v*5Nw6P`9f;)Q z^T;*|qjRZv+?5-p6Du^KCkBRL+$dfM596w?E=*~)ncQcKjBEL?E4W_uUf=cVBlaFC zRO&~U>J#tLAHj9{^l}T^_vVKJ?gH7Zvv+GlLqmgz89%waJf0rsACZXzvCcnv_v7VC zcSk}(e0 gVbkSATl{+{^UtP}%iCpB%cYOwZW6EX$VID&CMCWl_TM z*54CdgTf<*GUzm|x0ZgPiCI9|J{6&zS0G_netSgYo|Jng@PaB6_+Ov?mYD87j}U`= z;ynu&$ie@U=mz=%J(1AS(YYNDQ3rU$y1Wb3{jvH{sX%U${`vhq^lh1#LxnJFSe@Km zU_D${u(v-G`A$CyT@iP%rdQ_Kix~p<%T28!;;6?Uy|=p{+kgha7}SXoRnPr^Cg|MU zM`)vKpnx1_*oOklqgSOOB=5Rf#fc3%vCfOK7)J4bqJaJu$I{odlNz*LG?qQ@zT6?m z)1t%@>RY+{?eGxyA;(eghTTCQX`}q7qm-+NfR}~k8{$tLe!i9mBGr^X>ER}j{vlQ3 zV{ut;&Ue9Yp;pVRlD=CDvVm$^DysEb8g9AFqkiIGU55CSq~XtZl4}K~jV6W9`Uel# zO7d=?C?o!iVNF{FRl7&6${{k7k!gqAX%4_Ac=z~@r%Wb#~|0=bJaL-_nFgLxMZb@d+MUMU?Y@@gH>=Tl+&J_7{{u_D>bSg#U0 z{Klg`3JU4*<*m&_Z9#gu36d3yE6K<_VTN#$Ab*xbD|s4G5s{`E@h2K$Cz;bH-40$~ zq{Di_MQ)FKCuQ4486;&u1tyiPOGQHy=&0IS;tKuV=WnjiTVE?Si8f><#Ln*0KYyb& zR#V19@wvu&N9tn~Rzf#U{q+je73f9|$_OKw(CG*FP>AJy6bJ=GlkI+^6s>+s7X}a8 zoUHAHl7ONQzy{09tx`cb`2|CHu3 z#Q16M_m67&^H7-+^`yka!~oKve4C*%g< 92<5a%OjGfP?)ai5VCowCD2Iz+fals1i{-0ON?l90oD6$$OHqK8V| z@{&c3@bH&AnzBD9XiePNi{j6f<_;}M*KRXO-sO{)W)5#WIPl6bh_V E-U_g`X#cGM(>{0~|Ml$Lb|$J9si+qwr#Oh+B^u`r1N4_daT! z>2;M8o>G1Y6m(=F2UA|(!bePh-3D2jrxZ(O#MC1$Ny+^uZXZ2XDn~$f|4{qV_zY-J zt=kjNS}5G#W8Z#jra_plmros(`LJg_M5mbxsYqdacaAb#L%Cr1fr=ASA-h(Q;`w`e zZW|N|85?kZRFOi=EfhZ~U`xVZi;3*foXg9=cp_%$dm (Sa@YKvTeok3L^u(Eg_s$7xP#0vs>Kx_*FmR8>`FcIPSQF}Q$ScsNw-Eo!H) z0t#?%@56UbB(HpX=pDvt8gVg4Bca@F&BT&ZYBllfP0;x$#65rU;!#^(Zf 37No((YK?{GY$UxKmi zajb(9IZ6IG`Vz})=HX)*RGyr udsrbo@m@g;Y*YBXg4SwI~utADFEd4@(6IpHVjhA%)~h{19Wmn zdd4I5V^c?y+HH eq3MeiAfUDuL(MC%ih#jlUwN9D9Z%h%={7scVLFH-8 z= z~#vh!)LcTe&w~vXG#NTgjwm+&{l=eRg)o%lj_#j?||ggSJ~xe2f%ar)2om z#p}RUHcKOW)ING=d^^xkR0#e2TW>gCc1>k;-2@<_Da+=75R_ ( `PY&bM1y>fgPS5;72f?s=R+3oh#WiO*t>|ZDAOMDAFl=`f zxCTV|d@7d^ey*7wais(2%!sAWb4E=XG%y#RaK%U(E3#==dVBIV68O@J=IDAGJBKyB zR42_z`^0jwwShx(or&i5s`R|eZmGp3n}_$add%h&I3$T$YIv>R+V%p@V{4!f_&oX2 z^73=FB)_JQzYg6h4SE8?PGZ*}v%)h0Y75Ai_GF-#EE%)AxEyqF))f6LPe@9psLxpz z<1kXT0Se5odr>(lxC$X^ipE4N%oY?Jv)$#3M`VAD0;j2g