From 689d3bd39b87f0081fb7d8197b70f84059b8e037 Mon Sep 17 00:00:00 2001 From: Rico Berger Date: Wed, 14 Feb 2024 13:05:10 +0100 Subject: [PATCH] [4chan] Add Support for 4chan (#142) This commit adds support for 4chan. This means that 4chan can be selected as a new source type. When the 4chan source is selected a user can select a board from which he wants to get the RSS feed. --- app/fonts/FDIcons.ttf | Bin 8724 -> 9148 bytes app/lib/models/source.dart | 17 + app/lib/utils/fd_icons.dart | 6 +- .../widgets/item/details/item_details.dart | 7 + .../item/details/item_details_fourchan.dart | 40 ++ .../widgets/item/preview/item_preview.dart | 6 + .../item/preview/item_preview_fourchan.dart | 50 ++ app/lib/widgets/source/add/add_source.dart | 5 + .../source/add/add_source_fourchan.dart | 440 ++++++++++++++++++ app/templates/iconfont/config.json | 14 + app/templates/iconfont/fourchan.svg | 7 + app/templates/iconfont/iconfont.afdesign | Bin 50292 -> 48801 bytes landing/app/page.tsx | 19 + supabase/functions/_shared/feed/feed.ts | 9 + supabase/functions/_shared/feed/fourchan.ts | 203 ++++++++ .../functions/_shared/feed/fourchan_test.ts | 134 ++++++ supabase/functions/_shared/models/source.ts | 2 + 17 files changed, 957 insertions(+), 2 deletions(-) create mode 100644 app/lib/widgets/item/details/item_details_fourchan.dart create mode 100644 app/lib/widgets/item/preview/item_preview_fourchan.dart create mode 100644 app/lib/widgets/source/add/add_source_fourchan.dart create mode 100644 app/templates/iconfont/fourchan.svg create mode 100644 supabase/functions/_shared/feed/fourchan.ts create mode 100644 supabase/functions/_shared/feed/fourchan_test.ts diff --git a/app/fonts/FDIcons.ttf b/app/fonts/FDIcons.ttf index 224e3bf774f189ddbeaad26080dc97a7de18572e..c435f8c7b3cdcdb16a4acf92c6ad9771f57c9249 100644 GIT binary patch delta 803 zcmXw$PfQa*6vp4|Y}>Ug+wOMT-ImgJ+fuN>QfS=*f<+|3zeHmq#9(0MUk?--#RLsW z6VDzrOC+8>7>|lE9ymZen-EVXUNm4rh=v#?c&l$0JCko`-}ipsOeV8Bv@!f7QC$Tf zj{)H3RN1JMwVyQrW(f6WZvMgS(b}h%0FHKm&}wPMm`?4V+d=j#N-v?|>ZgIh% zsu>}#iDGV(%D{099B5M%UI|#F9@!wk3c6OL9ap#QvvAF3Sj*p2%oV2SP_W~CvBeMx zTRaL#*81X5*SBea@Oy|@0+hMSX4%F|0PC_t3|8^D+8q5tZ$Je4VH_S}I@S7rCgLuE z1QeIkntnN;1PXdV!KFS6XAwrvo)|)|)rPGALJ?Buku2!AZymOa45?zkJ}eQp6XYXh z-GVO^OJxd~WUNV!i+)KJq`{uz)v<}|l;LK{CcO@JRsO+NQ} z+gfs|tP*xP)xen!r<)gi{-D~Fb~wCJ`@ZN+r}UG#uttdN>+W=OZoVq|lwdf^^BhNZ zj{EtrCQIF2Ztet+O*P!f3ocGO62)|DA$>ZMWEe@*bG(b=JyIYT&U?I+4G%aS9w`)U zNq6ZPt=S(+cx7*Z_fUGFci_tCtvQx92y!UameD&Bu_piVt;F*^&f>@@zKfZR9FV*z jM?aAK`sb)Yh-&s~8HNPSlJ=^Rn_awrcdBG8Sa13dfLV`P delta 363 zcmdnvKE-8%a{Xim2F4x+28OWY+{A*HR~IrfFfcg)@sjkM$~2?QThE^gm zxrr48j7E&pf$|bSzCvDNZfcT(l>1`_200a=g{{QuV3iD^?2q2$>fe9oE1R#ClljRsUGKx*U zz*t}d&-q-dv)X$jB%@`I?g6WH#lMAPWJp CI#L1v diff --git a/app/lib/models/source.dart b/app/lib/models/source.dart index 2fa682f..d86def1 100644 --- a/app/lib/models/source.dart +++ b/app/lib/models/source.dart @@ -8,6 +8,7 @@ import 'package:feeddeck/utils/fd_icons.dart'; /// [FDSourceType] is a enum value which defines the source type. A source can /// have one of the following types: +/// - [fourchan] /// - [github] /// - [googlenews] /// - [lemmy] @@ -28,6 +29,7 @@ import 'package:feeddeck/utils/fd_icons.dart'; /// the list, so that we can loop though the types in a ListView / GridView /// builder via `FDSourceType.values.length - 1`. enum FDSourceType { + fourchan, github, googlenews, lemmy, @@ -57,6 +59,8 @@ extension FDSourceTypeExtension on FDSourceType { /// [toLocalizedString] returns a localized string for a source type. String toLocalizedString() { switch (this) { + case FDSourceType.fourchan: + return '4chan'; case FDSourceType.github: return 'GitHub'; case FDSourceType.googlenews: @@ -93,6 +97,8 @@ extension FDSourceTypeExtension on FDSourceType { /// [icon] returns the icon for a source. IconData get icon { switch (this) { + case FDSourceType.fourchan: + return FDIcons.fourchan; case FDSourceType.github: return FDIcons.github; case FDSourceType.googlenews: @@ -129,6 +135,8 @@ extension FDSourceTypeExtension on FDSourceType { /// [bgColor] returns the background color for the source icon. Color get bgColor { switch (this) { + case FDSourceType.fourchan: + return const Color(0xff880000); case FDSourceType.github: return const Color(0xff000000); case FDSourceType.googlenews: @@ -166,6 +174,8 @@ extension FDSourceTypeExtension on FDSourceType { /// used toether with the [bgColor]. Color get fgColor { switch (this) { + case FDSourceType.fourchan: + return const Color(0xffffffff); case FDSourceType.github: return const Color(0xffffffff); case FDSourceType.googlenews: @@ -268,6 +278,7 @@ class FDSource { /// [FDSourceOptions] defines all options for the different source types which /// are available. class FDSourceOptions { + String? fourchan; FDGitHubOptions? github; FDGoogleNewsOptions? googlenews; String? lemmy; @@ -284,6 +295,7 @@ class FDSourceOptions { String? youtube; FDSourceOptions({ + this.fourchan, this.github, this.googlenews, this.lemmy, @@ -302,6 +314,10 @@ class FDSourceOptions { factory FDSourceOptions.fromJson(Map responseData) { return FDSourceOptions( + fourchan: responseData.containsKey('fourchan') && + responseData['fourchan'] != null + ? responseData['fourchan'] + : null, github: responseData.containsKey('github') && responseData['github'] != null ? FDGitHubOptions.fromJson(responseData['github']) @@ -360,6 +376,7 @@ class FDSourceOptions { Map toJson() { return { + 'fourchan': fourchan, 'github': github?.toJson(), 'googlenews': googlenews?.toJson(), 'lemmy': lemmy, diff --git a/app/lib/utils/fd_icons.dart b/app/lib/utils/fd_icons.dart index 2cd4246..9948abc 100644 --- a/app/lib/utils/fd_icons.dart +++ b/app/lib/utils/fd_icons.dart @@ -1,7 +1,7 @@ import 'package:flutter/widgets.dart'; -/// Flutter icons [FDIcons] -/// Copyright (C) 2023 by original authors @ fluttericon.com, fontello.com +/// Flutter icons FDIcons +/// Copyright (C) 2024 by original authors @ fluttericon.com, fontello.com /// This font was generated by FlutterIcon.com, which is derived from Fontello. /// /// To use this font, place it in your fonts/ directory and include the @@ -65,4 +65,6 @@ class FDIcons { IconData(0xe815, fontFamily: _kFontFam, fontPackage: _kFontPkg); static const IconData lemmy = IconData(0xe816, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData fourchan = + IconData(0xe817, fontFamily: _kFontFam, fontPackage: _kFontPkg); } diff --git a/app/lib/widgets/item/details/item_details.dart b/app/lib/widgets/item/details/item_details.dart index 1f35ef8..8cf596d 100644 --- a/app/lib/widgets/item/details/item_details.dart +++ b/app/lib/widgets/item/details/item_details.dart @@ -1,3 +1,4 @@ +import 'package:feeddeck/widgets/item/details/item_details_fourchan.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -61,6 +62,12 @@ class ItemDetails extends StatelessWidget { Widget _buildDetails() { switch (source.type) { + case FDSourceType.fourchan: + return ItemDetailsFourChan( + item: item, + source: source, + ); + /// Sources with type [FDSourceType.github] do not provide a details view, /// because we directly open the link, when the user clicks on the /// corresponding preview item. diff --git a/app/lib/widgets/item/details/item_details_fourchan.dart b/app/lib/widgets/item/details/item_details_fourchan.dart new file mode 100644 index 0000000..28eaeac --- /dev/null +++ b/app/lib/widgets/item/details/item_details_fourchan.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +import 'package:feeddeck/models/item.dart'; +import 'package:feeddeck/models/source.dart'; +import 'package:feeddeck/widgets/item/details/utils/item_description.dart'; +import 'package:feeddeck/widgets/item/details/utils/item_subtitle.dart'; +import 'package:feeddeck/widgets/item/details/utils/item_title.dart'; + +class ItemDetailsFourChan extends StatelessWidget { + const ItemDetailsFourChan({ + super.key, + required this.item, + required this.source, + }); + + final FDItem item; + final FDSource source; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + ItemTitle( + itemTitle: item.title, + ), + ItemSubtitle( + item: item, + source: source, + ), + ItemDescription( + itemDescription: item.description, + sourceFormat: DescriptionFormat.html, + tagetFormat: DescriptionFormat.markdown, + ), + ], + ); + } +} diff --git a/app/lib/widgets/item/preview/item_preview.dart b/app/lib/widgets/item/preview/item_preview.dart index 291ef4f..b8c025b 100644 --- a/app/lib/widgets/item/preview/item_preview.dart +++ b/app/lib/widgets/item/preview/item_preview.dart @@ -1,3 +1,4 @@ +import 'package:feeddeck/widgets/item/preview/item_preview_fourchan.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -44,6 +45,11 @@ class ItemPreview extends StatelessWidget { /// Based on the [source.type] we display a different preview. The preview /// for each source type is implemented in a separate widget. switch (source.type) { + case FDSourceType.fourchan: + return ItemPreviewFourChan( + item: item, + source: source, + ); case FDSourceType.github: return ItemPreviewGithub( item: item, diff --git a/app/lib/widgets/item/preview/item_preview_fourchan.dart b/app/lib/widgets/item/preview/item_preview_fourchan.dart new file mode 100644 index 0000000..13f42b3 --- /dev/null +++ b/app/lib/widgets/item/preview/item_preview_fourchan.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +import 'package:feeddeck/models/item.dart'; +import 'package:feeddeck/models/source.dart'; +import 'package:feeddeck/widgets/item/preview/utils/details.dart'; +import 'package:feeddeck/widgets/item/preview/utils/item_actions.dart'; +import 'package:feeddeck/widgets/item/preview/utils/item_description.dart'; +import 'package:feeddeck/widgets/item/preview/utils/item_media.dart'; +import 'package:feeddeck/widgets/item/preview/utils/item_source.dart'; +import 'package:feeddeck/widgets/item/preview/utils/item_title.dart'; + +class ItemPreviewFourChan extends StatelessWidget { + const ItemPreviewFourChan({ + super.key, + required this.item, + required this.source, + }); + + final FDItem item; + final FDSource source; + + @override + Widget build(BuildContext context) { + return ItemActions( + item: item, + onTap: () => showDetails(context, item, source), + children: [ + ItemSource( + sourceTitle: source.title, + sourceSubtitle: source.type.toLocalizedString(), + sourceType: source.type, + sourceIcon: source.icon, + itemPublishedAt: item.publishedAt, + itemIsRead: item.isRead, + ), + ItemTitle( + itemTitle: item.title, + ), + ItemMedia( + itemMedia: item.media, + ), + ItemDescription( + itemDescription: item.description, + sourceFormat: DescriptionFormat.html, + tagetFormat: DescriptionFormat.plain, + ), + ], + ); + } +} diff --git a/app/lib/widgets/source/add/add_source.dart b/app/lib/widgets/source/add/add_source.dart index dda2bc9..bf3c458 100644 --- a/app/lib/widgets/source/add/add_source.dart +++ b/app/lib/widgets/source/add/add_source.dart @@ -1,3 +1,4 @@ +import 'package:feeddeck/widgets/source/add/add_source_fourchan.dart'; import 'package:flutter/material.dart'; import 'package:feeddeck/models/column.dart'; @@ -45,6 +46,10 @@ class _AddSourceState extends State { /// user selected a source type, the functions returns the form for the /// selected source type. Widget _buildBody() { + if (_sourceType == FDSourceType.fourchan) { + return AddSourceFourChan(column: widget.column); + } + if (_sourceType == FDSourceType.github) { return AddSourceGitHub(column: widget.column); } diff --git a/app/lib/widgets/source/add/add_source_fourchan.dart b/app/lib/widgets/source/add/add_source_fourchan.dart new file mode 100644 index 0000000..fe9c60e --- /dev/null +++ b/app/lib/widgets/source/add/add_source_fourchan.dart @@ -0,0 +1,440 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:provider/provider.dart'; + +import 'package:feeddeck/models/column.dart'; +import 'package:feeddeck/models/source.dart'; +import 'package:feeddeck/repositories/app_repository.dart'; +import 'package:feeddeck/utils/api_exception.dart'; +import 'package:feeddeck/utils/constants.dart'; +import 'package:feeddeck/utils/openurl.dart'; +import 'package:feeddeck/widgets/source/add/add_source_form.dart'; + +const _helpText = ''' +The 4chan source can be used to follow your favorite 4chan boards. +'''; + +/// The [AddSourceFourChan] widget is used to display the form to add a new +/// 4chan board. +class AddSourceFourChan extends StatefulWidget { + const AddSourceFourChan({ + super.key, + required this.column, + }); + + final FDColumn column; + + @override + State createState() => _AddSourceFourChanState(); +} + +class _AddSourceFourChanState extends State { + final _formKey = GlobalKey(); + String _fourChanBoard = 'a'; + bool _isLoading = false; + String _error = ''; + + /// [_addSource] adds a new 4chan board. The user can select a board from the + /// dropdown and we will generate the corresponding URL. + Future _addSource() async { + setState(() { + _isLoading = true; + _error = ''; + }); + + try { + AppRepository app = Provider.of(context, listen: false); + await app.addSource( + widget.column.id, + FDSourceType.fourchan, + FDSourceOptions( + fourchan: _fourChanBoard, + ), + ); + setState(() { + _isLoading = false; + _error = ''; + }); + if (mounted) { + Navigator.of(context).pop(); + } + } on ApiException catch (err) { + setState(() { + _isLoading = false; + _error = 'Failed to add source: ${err.message}'; + }); + } catch (err) { + setState(() { + _isLoading = false; + _error = 'Failed to add source: ${err.toString()}'; + }); + } + } + + @override + Widget build(BuildContext context) { + return AddSourceForm( + onTap: _addSource, + isLoading: _isLoading, + error: _error, + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + MarkdownBody( + selectable: true, + data: _helpText, + onTapLink: (text, href, title) { + try { + if (href != null) { + openUrl(href); + } + } catch (_) {} + }, + ), + const SizedBox( + height: Constants.spacingMiddle, + ), + DropdownButton( + value: _fourChanBoard, + isExpanded: true, + underline: Container(height: 1, color: Constants.primary), + onChanged: (String? value) { + setState(() { + _fourChanBoard = value!; + }); + }, + items: boards.map((FourChanBoard value) { + return DropdownMenuItem( + value: value.id, + child: Text(value.name), + ); + }).toList(), + ), + ], + ), + ), + ); + } +} + +/// [FourChanBoard] is the model for a supported 4chan boards. +class FourChanBoard { + String id; + String name; + + FourChanBoard({ + required this.id, + required this.name, + }); +} + +/// [boards] is the list of all supported 4chan boards. +final boards = [ + FourChanBoard( + id: 'a', + name: 'Anime & Manga', + ), + FourChanBoard( + id: 'c', + name: 'Anime/Cute', + ), + FourChanBoard( + id: 'w', + name: 'Anime/Wallpapers', + ), + FourChanBoard( + id: 'm', + name: 'Mecha', + ), + FourChanBoard( + id: 'cgl', + name: 'Cosplay & EGL', + ), + FourChanBoard( + id: 'cm', + name: 'Cute/Male', + ), + FourChanBoard( + id: 'f', + name: 'Flash', + ), + FourChanBoard( + id: 'n', + name: 'Transportation', + ), + FourChanBoard( + id: 'jp', + name: 'Otaku Culture', + ), + FourChanBoard( + id: 'vt', + name: 'Virtual YouTubers', + ), + FourChanBoard( + id: 'v', + name: 'Video Games', + ), + FourChanBoard( + id: 'vg', + name: 'Video Game Generals', + ), + FourChanBoard( + id: 'vm', + name: 'Video Games/Multiplayer', + ), + FourChanBoard( + id: 'vmg', + name: 'Video Games/Mobile', + ), + FourChanBoard( + id: 'vp', + name: 'Pokémon', + ), + FourChanBoard( + id: 'vr', + name: 'Retro Games', + ), + FourChanBoard( + id: 'vrpg', + name: 'Video Games/RPG', + ), + FourChanBoard( + id: 'vst', + name: 'Video Games/Strategy', + ), + FourChanBoard( + id: 'co', + name: 'Comics & Cartoons', + ), + FourChanBoard( + id: 'g', + name: 'Technology', + ), + FourChanBoard( + id: 'tv', + name: 'Television & Film', + ), + FourChanBoard( + id: 'k', + name: 'Weapons', + ), + FourChanBoard( + id: 'o', + name: 'Auto', + ), + FourChanBoard( + id: 'an', + name: 'Animals & Nature', + ), + FourChanBoard( + id: 'tg', + name: 'Traditional Games', + ), + FourChanBoard( + id: 'sp', + name: 'Sports', + ), + FourChanBoard( + id: 'xs', + name: 'Extreme Sports', + ), + FourChanBoard( + id: 'pw', + name: 'Professional Wrestling', + ), + FourChanBoard( + id: 'sci', + name: 'Science & Math', + ), + FourChanBoard( + id: 'his', + name: 'History & Humanities', + ), + FourChanBoard( + id: 'int', + name: 'International', + ), + FourChanBoard( + id: 'out', + name: 'Outdoors', + ), + FourChanBoard( + id: 'toy', + name: 'Toys', + ), + FourChanBoard( + id: 'i', + name: 'Oekaki', + ), + FourChanBoard( + id: 'po', + name: 'Papercraft & Origami', + ), + FourChanBoard( + id: 'p', + name: 'Photography', + ), + FourChanBoard( + id: 'ck', + name: 'Food & Cooking', + ), + FourChanBoard( + id: 'ic', + name: 'Artwork/Critique', + ), + FourChanBoard( + id: 'wg', + name: 'Wallpapers/General', + ), + FourChanBoard( + id: 'lit', + name: 'Literature', + ), + FourChanBoard( + id: 'mu', + name: 'Music', + ), + FourChanBoard( + id: 'fa', + name: 'Fashion', + ), + FourChanBoard( + id: '3', + name: '3DCG', + ), + FourChanBoard( + id: 'gd', + name: 'Graphic Design', + ), + FourChanBoard( + id: 'diy', + name: 'Do-It-Yourself', + ), + FourChanBoard( + id: 'wsg', + name: 'Worksafe GIF', + ), + FourChanBoard( + id: 'qst', + name: 'Quests', + ), + FourChanBoard( + id: 'biz', + name: 'Business & Finance', + ), + FourChanBoard( + id: 'trv', + name: 'Travel', + ), + FourChanBoard( + id: 'fit', + name: 'Fitness', + ), + FourChanBoard( + id: 'x', + name: 'Paranormal', + ), + FourChanBoard( + id: 'adv', + name: 'Advice', + ), + FourChanBoard( + id: 'lgbt', + name: 'LGBT', + ), + FourChanBoard( + id: 'mlp', + name: 'Pony', + ), + FourChanBoard( + id: 'news', + name: 'Current News', + ), + FourChanBoard( + id: 'wsr', + name: 'Worksafe Requests', + ), + FourChanBoard( + id: 'vip', + name: 'Very Important Posts', + ), + FourChanBoard( + id: 'b', + name: 'Random (NSFW)', + ), + FourChanBoard( + id: 'r9k', + name: 'ROBOT9001 (NSFW)', + ), + FourChanBoard( + id: 'pol', + name: 'Politically Incorrect (NSFW)', + ), + FourChanBoard( + id: 'bant', + name: 'International/Random (NSFW)', + ), + FourChanBoard( + id: 'soc', + name: 'Cams & Meetups (NSFW)', + ), + FourChanBoard( + id: 's4s', + name: 'Shit 4chan Says (NSFW)', + ), + FourChanBoard( + id: 's', + name: 'Sexy Beautiful Women (NSFW)', + ), + FourChanBoard( + id: 'hc', + name: 'Hardcore (NSFW)', + ), + FourChanBoard( + id: 'hm', + name: 'Handsome Men (NSFW)', + ), + FourChanBoard( + id: 'h', + name: 'Hentai (NSFW)', + ), + FourChanBoard( + id: 'e', + name: 'Ecchi (NSFW)', + ), + FourChanBoard( + id: 'u', + name: 'Yuri (NSFW)', + ), + FourChanBoard( + id: 'd', + name: 'Hentai/Alternative (NSFW)', + ), + FourChanBoard( + id: 'y', + name: 'Yaoi (NSFW)', + ), + FourChanBoard( + id: 't', + name: 'Torrents (NSFW)', + ), + FourChanBoard( + id: 'hr', + name: 'High Resolution (NSFW)', + ), + FourChanBoard( + id: 'gif', + name: 'Adult GIF (NSFW)', + ), + FourChanBoard( + id: 'aco', + name: 'Adult Cartoons (NSFW)', + ), + FourChanBoard( + id: 'r', + name: 'Adult Requests (NSFW)', + ), +]; diff --git a/app/templates/iconfont/config.json b/app/templates/iconfont/config.json index f1b0a38..9344bad 100644 --- a/app/templates/iconfont/config.json +++ b/app/templates/iconfont/config.json @@ -327,6 +327,20 @@ "search": [ "lemmy" ] + }, + { + "uid": "2efb1796652ef55a1fca1f7a3eda4b86", + "css": "fourchan", + "code": 59415, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M461.3 367.5C461.3 367.5 408.5 45 214.4 45.7 83.6 46.2 32.5 171.8 127.3 200.1 127.3 200.1 14.9 240.6 14.9 312.5 14.9 384.3 193 460 461.3 367.5L461.3 367.5ZM541.7 614.3C541.7 614.3 579.4 939 773.3 947.3 904 952.9 960.9 829.8 867.6 797.1 867.6 797.1 981.7 761.9 985.1 690.2 988.4 618.4 814 534.5 541.7 614.3L541.7 614.3ZM388.7 549.7C388.7 549.7 74.9 641 99.1 833.6 115.3 963.4 246.1 999 262.8 901.5 262.8 901.5 316.6 1008.2 387.9 999.5 459.2 990.8 512.9 804.9 388.7 549.8L388.7 549.7ZM623 447C623 447 945 390.7 942.2 196.6 940.3 65.9 814.1 16.1 786.9 111.2 786.9 111.2 745.2-0.7 673.3 0 601.4 0.8 527.7 179.7 623 447Z", + "width": 1000 + }, + "search": [ + "fourchan" + ] } ] } \ No newline at end of file diff --git a/app/templates/iconfont/fourchan.svg b/app/templates/iconfont/fourchan.svg new file mode 100644 index 0000000..43fc393 --- /dev/null +++ b/app/templates/iconfont/fourchan.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/templates/iconfont/iconfont.afdesign b/app/templates/iconfont/iconfont.afdesign index 6568a788649f7ae25f5503cb025186c8baed7e82..e63f18dad12e286946c7677406d3c659bb13eaca 100644 GIT binary patch literal 48801 zcmXV11z1$i*Is(*?(XhR=>|bUI;FcyaF^}|k&HX0UHkuk2mk;5f1iRtQd5%-h}TTO zzZUSX=j-MF9Jn*9y0~++^Zx^>|KmrsIzvyOP$3Y&!vy_VDAUTyFoOQtQp7Kb{qlek zZfpJdN6hb}BnG9PQ{R+&8O1+toVA3@!O{ftKbr{Rskhvdgk;!;73%fSj%4wbD6lEj zDRJ4m6p;jt*0#mp<8v!jiR8I;NqXY6V=xsLd`MkiWERt;I>TSYde27r;IX+)Sis_G z^aW?(?mAwFsI#uP-iDUt_D59C(}Qc{rPXvT8oSH0Z0?y|Itqi&roG$<#WXgm7y?94 zgvE)_B%yB#w<0LCW$m(t8_Uy(&;)G{aQfii)qv;q1HO|2tsA7L{^cinda;&(B-^DU zYgb-z{2Ioqxhr;4qa%#rT@X6VHtqwb+^nK&(VzF?{c{Ao0D9G9#Uc88c^$W_I0gIUs$NoM7tiRm^jPWEq(1$5DvcPE_gNLbFc{Z2xWCm;5cPx-`o+qsqTb7#l9o zeCq&z=V-$r!y*tlFkXVTEl4UFB?(=aLv|Y8ZRuiV!Rm{)uzG1WRJyX1o1t~eH95(B zs+n{jz{8aAHTj(6WiEU4Yn0($8B>g%poKFuVl_;D+H0W?C?3hOYTgd2A_kQH z-5^s9gyB8RWI5BA*-I1n2SQ=D@u3Dd?G}6*-A;u zPW;|;`aBJPlj{NQR^rX<;#mGu_e1J8p1&Uq11whp$m5az!L6fDyPHlk8PjZ4`9CnW z1dCvOh_*Hz=H5%!I>kC3Aq{LFF%t2_OdER*+ml)G8uE`MhwZ_1Pe3ASMgxkI4ix^1 zb1gd(r`z)*6X_kK_hSz!Z*7|+?U#z0>Q64o$0mQL{XJHMDh{Fjlp@D!Ym5=;d(XdE z=pubO7r<8I!h{}ADVIi;d?c{ryDd4ijpAU%kiIoj$7ec?3Mu`iS~BX>bp_d);X5Hg zEzb#z&~sBJ%L_hpq7o&d@F{aU%*3NdiRSA2otH>62Z=5ZyoK5+YckNoipBJYUJA)d zO&IP+7s>dHJ$R&)p=*{4;9b+D@J;cWWnZKT+Zd4ZShb1_0M3VeAb)IE&g5T$L53U4 z&GZ`i$p4*w$I1_hzmU*O9y8Bv_Jw&+3uT>8;g&I}EqkUn_-7x!tG$DU%Kezf5)ub) zEKb$hIX;67X=d`c*J;K8pZsG-+xxc)n9E|`Q8UWiC+URjGZ9>at&4ohKRVkJ^2y9d zKArs?jGrMf#OrHB7oZX$W>LP=e_#|9*eG7t6zdxCL;`p7^NkSEv%QCPXigEXN1H5$ z3xZk_gcnizZsck>G0Ov{f>;~IHBt#v|8jy#aFAtJ-8eTWDUiPoNW;>0&1lXGHNSP@%i3|zsC6Mc%(Axj|I9ci;6t)iTj7N7@ZtbQDr`?P7qD6_>i(+ z-kOy9+>)G>br6gW*}0>x&oNTw*4+!4t^AM17O)N^`h)l6df7lz;{GXurF1^#U%1_j9jO4cIKl$65OO-})jme>Y(E!`> zT%?6}N#1gwV{l+IkjGVmt63LmAw+h7gGS zWB;Pkq{?uM(f_0^<(t_$M#CO`FgTiLP~71OkVw=>TEC0+F?3akmM(5L7L+PULqmk7 zlU~^U{^z#Rsn0R8lam8O-`!^%s_`uJfMR6GB~@@i6h2GxFLSL+nzw`FF$_EpwEv0< z<_1R4kU5Dj8V!}i?Ys!owgaI$REJM~bi zoE-?f0!;9n9?icc1A@V{dHZVLF;+VM{noSMp+SHXPYjiw`TO z?F)6XKTUES;!?!W2uA<*p07Lee7_4n-M)K|k?ZiymOBjb6z0qXogtoVnTj_}$ktt> z-$syB)5_^hsA9x=tt3+4=?T#0=5$8b^v}>QRv(H`)Kc3yf$ybiPZI?cW))o5J3Im{ zGkTaX{jr(xV}J;@&YOIM>d`3xqC|Wr*SV;nfOQnRnTPo5MHNX>I+Z>0G0ZjD)--p? zm6m7Y$Q3L_{qNZsRb+609;@L)@xVKk6n_6yS?alEv0W$}&PNkCJj&EkIpys4r$Otn zPrf{7?XlSm_#Ou#a8kB+p&DUa&~8p$9iDX1HrFvb76{ipU?l|-ClEk$XNDU zj6Nn?39#%eXFF;SnRmN#U+*ZIyw?%Uj5RCQTw;D9tBs`7VxnOZqOR{2>|(1YD{^;K zTwoUEirQDJ&FHb-;jdHK;bGnlJM$9)hPpX;E>~-8^dZf`)EHRO!Y(3fi_Kl_^M4?; z8hBy;A*GNGt?9JebH-9&X>boY4Ld}JPyUb(a^g}2Ie|`^v$W53c&v-jB;AE?4M;g# z6(IBp)rG%NqG z$DtWdRQ4aZm!OMC=4m%ycJW+pr@!S&3{!jyV%oWmA7V?TIC4LEUfH|^R;HMFN#x^w zz=*!3{zXjZddIOzo8FA%mVI{l?TNK~snVhTd0wj3?4{|*&V^=@7I(cCck-!#GR0mQ;-ZQL+c5&7 zbXX&th86}m;A97OEzT>1imW~OyRVyhCS7IkR&q=DlmH1mKGJ(vBCgW*+0E|x-F_$v z1|CglodZhw{nM3NfcpyN%jeG(@dS*D(O^Q@1;arBCZ!bHG4DfpS=MEyrsV715A}%bM?0h5281E`jkZAa%E25CFAE+MzmRx;583i zix*{{EN>oR4=6{UVloh}om=Y98V4q1QjYiUKj*~n^4=L#(F$t(4P5%~!&Cq>^F*GC zC{0%aq+(L;Rw1VcF4DeIGY*bAg6i(X8pOo`Ym&O`J^$O0LjyEKz`6bDL$iRn$yDU} zTJzH|F2YvdR(&z!F>7QQiF(haS#AaFzC~ z%SRY`>rEZ91`o7|4FPD{ybP!`L>NUfRNQ)?OR!h zV_>>uWtY{574C{Azg=%2q^{t1PbcsR%3Y{NS?^| z1|MeA7ajnM4{S|Is|QB;>s5i#1R!T%E3e*^9`Js{593mT2pl6AzXhR3tSf=n7&bA8 z0p@mp0p2pz*HodWo9!g`EEpvERBWS)s6hwVd{Jl|`sIh=)+6chI1BSkbf&p(!A3Hz zRxi!J@-)`-Eq4X9j}WEVDwgF6^}S{MEPz=_aI?k2mP%yBx7~@y3LH#CxBc;nM7Lkr ziu~yM=5JWad|$3~*Oh8hjSpseNGZou)+Q2FGU;M_X zANJ|lv`xtq8nF5suEAJ#_URyKeTk@>gQDiqO_3Z81r4Kb4s?I{ik4*=g8kIQVV9f8 zpShifef2vATlZZh4X(bdj70w>NO>h(Aby`6YlabKYz%E4iB_7v?Gd&;P-S8qOK~h$ z1hW~4dZ6u0W(CZeM65%Y$&Txgs_TiheGS?E!;))1_Q3uxZSJZVIL&Kp)Ln+D65Fsm z(+`%ydKGUpEsxT-Vg($nm`?mA75*JvypCk)d&d=w5NIjb6me8EhI#6yl!mM$yUBbc z*QQ~mkvJne$CzwwFpdz?x!swguo4&5tFpD7{dhh z8|Hd=+wm$E+jkboPe)d3$*lHS!OdiZx$IRX^?E=bcqh)CiW!Y1l~R_=P$yOCQujmQeBa3lQ84XsK&4*Oer`8*!s$&91%xS5%YyBOd?^0dl!6( z6p8|Ziw5P7ctGNTv9CN@GuW00Z&ti&^%%ttj15b@{GUOv`>6ep|CBH(i)iBDaR0N@?-Bn>8aI4-+6Q_PPMMAttEn2 zy{m=0W@?NG3(dQjv1s83R61krrXyHle81mGibgv?Pg`8n9?ge^eu5iet|bGc3yxHj zJT5TYhO;qK*XtOaD3q>l?^x{+aqK^|Co8yE|M`?133058=bl7Ceha&mhW0yp7^zqGUG;ne*{ zK(uNXB1nn>VelnP`O3@3+sIeCyhQf);*^Wqy(U2PT8imIcWa^&@9tY`_N&XQi?l21 zIuaCDATe|$YXlphQb2pwS3tvpWjFXArJScMp@FCjNb9Hv%NU{1-XS;}e_o;orsJYq zJPF{CYFe?$!uO_#X&&@?_Uu{T-dVx#kpmK^Au}*w?F~qM^iLk(yQbZc&37}Elv!CLyz^BZ-y;A^vrz+0-5y*h@FMdHZ?fJ^{G}teRCBE z-zqH`%k~DT@$8CL&$JOF`7gz11*`_Q0#+JHA3l$bn08W{JJS+E1Gd$y1=)EDPKE)GpzwMTx@4cTTzK5faSFe{m1 zDr5`xPkcq98utG9a17A1dJdc`q1Mq4Jd9yWIX{d(Q~8FtSTcSqU&$dOuQ%eMYWGAh z(u{F5g17j1H8xFjvGZ#F8*`ORclC*>voh`+_#TBYgx;YyxK;v7K5`Mv&B%&D=GGg?Ed1G{PlR+1ut!?YP4ot~ z>yd8?|1AQmP49h|lU@$6xc!udSp(^Ze={VhX_Lo7rxGq3(suU#&!s;9cJY7lukUxl zXY)UA_7=dFf8M7&r<$n@#*O zWtk)M0Q|_hCQPn66QS=~S$S48n7~HUC|| z>2KGajcuGjFShq%n%%5d@SKbH$wWnl&&-8R^P95$^7WyjLQ#A_@)M_>OqYg=Cnf4& z^rnY6f73>CL+9b05V(QF`Wv33VPXaIOfGBGbFQy?7lymF8u!4nOHS^m18tJ^!J~6q6o&m&%LQ%cZ>*4Vcokz zWbIAeU0vNxCLi{U-_FLvK9n_h{&bFk@3r+v?vuTufYDdyOc8c&w;s_DVzZGA6&s32 z=~gOI2mi*cAS-+RPe+Q;(m_)-5Lnzi@V&aLIXbHvTg* zS+m+w_w@vA%rm}fEk-`He)fdi4$6L>~|tp`POKfMcjP7jFezChuvFL|?BQCsSX z^Q2_?#cKA1DQnV;m#RsIwdE=qu7+w!Oj%ry^t_s{jsKlP$VBDdUcLdOIe=&FOntjg zOAGcDdwjOXT)gq_f`>bLZRjI(ATM4|l=CsI1-ISN@P0?Y4ZMVgMrxV+Z_L|5x4>9a z_>;r8H`p47zOJMma)&1sQ_O||W_Jy4=DTn3#yRK~PM(3BroJ4`zrh}nV)r|KV_>=| z+gxByerxd?GwbuXS7|oU=j&s6)sN2eV(4k~1TZpJ!fmgqWV$Iu zi7IUqQmM$PK?s@c2F~$*XF9NsO{8Rd{;r6{0AkiXFYG2Ek<-kcS8upQ9q;7R$C}Jc zVR@00hJGnSFYNTM=VXzPOM;fD6-8A?DoC~itb}obZH(#^o)VP8B}d5BuNmj=Xsy9t42(($@O?Wo4S#J%%>OZN$f<|o-(kv zGRTwO5KPm}(5DvdBV6$@xAJ3Nuz+K#CJVO;E5&o~Q*LqYUJ4>ruF`6j-=O4uHHgg5 zT3#TDRe!%76#vXsYEN<1z?Ii~HGW|KlagLA1F|wm`GgaTw)lBE%T?O8xp&;;HnM#3 z{@nsGC)Yr*N8=6|8wD!T;CZ!#5f6clw`<2Z4N@^yZHOmGXIcx?@Aw|8 zb}kA99HI7ZiT3cbwum(A3qzj&PP>d~)}U_>qstw+K?cziAn{A{5oBl+#7CgI{gG;$ zK_#6oqF&%P78AInu~WBjIxT~5rbzKPDvh2n{@S?kpaNM)B5OkSsds6S4=?c%9q43V|sp+t=o8S2hcA6Dj5l6lo1W)yMbdcnB@1Px1RGp zE*3J$-xya^8fhB$>26iiO7)7p+seEIMDWXd5^#XQFP|b@X zgu3C}s6wunp`?h+i`B*zEWfAzNCMlt^;XD7-6go3BWL*4-w)+`ak;KkC>5bYCz@Xi zPL=dnPTuLnkouKFga7Jg9xP0(E--=Uats|X8&_;=NB?vckkZ4y=*j?v99E3*M(jEs zaSEiqXC_-6{V+0UO8UMI8h!AaGf-1RV(zTQfV@P1B3h*(=s|WjK_t3jA4fnb)Ekv@ zP#FbAR-%$5;29gxFQ)eq7`+1LO!y$QmN||Cf^^mYwG4?nM=hfK9)bixntufq{Ue{- zkH@NhPixds8Pmvx;*MI2VSiAQezC!s?U75j*3d#NL)T&G@S_u}28`T(wtf8~o=e;< z68F9_5~|Fa%+u_TjnCoC@NhVax37#Ba#-rU+pky_)4#-TSDI+4&u zDB&Uys!A99AmlGLy9C>xv?!Q{{>;7o2?B|7=e2OB9eHMINO`u)n8hrf~a4TQequ_!mg(P}rt4pEnJ7U!W z;tIkx@e2xJHP-nUU_uApp$c?KU8AW>3wW1I0&^U=W>Y89pV9i3=17Q@7fZ0Oh(}%o ztet^wHiS4?RcZEn;RT6+IEOZAXA#a~|J5(-XwU&oJ|X)NGK`Zip&Rw^ZzlmQ8BH#D z0jZGS2#W$E;6fTwW>|u3?>63AfEc;Fobc3Kp(ygGxk zw02ebYz7C87%IgMV69=IVx2&JpQD;Af+hEtu9Yz&h0G>B=X$Xs1gq?Kz z@RO`}sn0&jH)PrD-53py9|{qE6ow)J`?E2QAqYHoF>XsY^a(J`SZ3lArzi~>^phqH z?EvqM)_3OTxvL*VGV~RR)!4iR<)DXZx#E>c*%sgb+J}m|3N(jJN;rJ3L%G?|P2W#{ zutS+Mm)@Ot{a`-nh3DlMCN03QV9^+GcM!=ByJfI{j`!|E=b5V+OHdi4>JVK4govuy z{woB)n7s@x%~4U&OT2xTtG?i|MfVDhc_CS`5X2E6eZ3W$i7@zvpa|nU83Av1>0)7A! zlq23}L;=kLAX@?v@+8zi4h7f9Ew1!z8<~Md4L?(rogGlq{RUU2H>Jh)Sm{AoqQMBV zLM+Tm&;gRu3XS~UYG4@o8V1J1vzIgZj2zVU-7PQY4u_LUI}zr-bwAdkrqUGE@> z6v;f#hCrm|+W@Pis6WoGICc#^0azq&fyXjU3Ztt=YWkdvyKa^c_PaDL>;TmzdJKi0 zJB5%xgp$FTSHgtK;%E?EZ^bMr(4;wb2CMI*oHxfpb_KAEcc0e9p}dH2`bGhnNh4PK zGLk)l!sHA%26r6TU8)W}Y%&tVIB2*qn z`_YqO)1jp`sC$@RydoqZG$N6Hq`r^cue_C_i?Dg4jR_P$?$O2OHMUyV=A;cD<(n_v z2}gAzu#x0_M%XRpO_L+8=hSzQ`(kvNyTGhOB_By-Nney>jQK=hOPlCLHEsvwVlase zZpUN5yQ1j2OAxl61*7w{iH;O-e~ItbMbY4@fYSHvFDBz4HHxf^pWS`~=6`-4S(l^7 zTb5Sz>Eo4-Wl7Ee(HvIq{t@*uZIF44O5^qZ0xO?QhqMI@?6AMBJT(;b-(%|Inqe4hs+ zv-$um*kj7}qJrPjXGPKb;#{p1*PP`~>X`zaQbC%ucNdUW83y-vi#$Rg-P-=V zz>CyzNHB|WAAO;wAMr6PtnCPsco_-&NmD?cPUe1!i4#&XnL<7@<*5EwF%oG3Mkgl( zf_{q0irHMeV`p*5*o_PrjDoF@Q)7Dv=nr={p6K z$tlrII4vV76fxxHflcLo+inuD|FzuJOh+dQF@TZzGARBapqXP;r1>4ZDs;1#mo4#BtMa4vV6_-~A^3Wwv1?UGO7~_d! zjM!As1nOXhO6dJqkpo&S6i<>V#g_B-$2b;8-^aEt{NUPOM^)tmCgx z>|PXLyPl7@;nA}d);Blu9Xq>`l32*LRixkB_|7+dal7LbzjLir_>nUnhZNy7o<58|$kJ?# z#Wb#Og5oq&L@J+0&fJI{%88(e@KQdc7!3-k72~2^6J4nhYuN0G8>2D5!qMPZ)TZ>_ z4<;J=A<@?|Pvc7^DCWW@AAm=){&nEl85v^@$0wqS()ZUDbjk0^Gq-rmNZ&N8>K)@* zg|SI;5yx&Bg)`w~_^YZ&mzGMEAMwfD8D1gtGkS=w)rO*aYof)%=xlJ%6(E-+F6^I> zvMc27?+Htbes(p0I6{0kUI06Y=HGVBMWKM3v6X8@XgLTVlv7(!*RZ+{g`!wi`N#0G z0a8iIbz-q1Hb9k79lKqQofwV0EiN4SoqcU&3Y)Bn<|LE`lYTE!wY+EmleWp~cI_V@ zbcP-p>&xTRkjm-UWa&u&ivaq|i0awjosOz$hRVMD&`F8Rjw#DOU`ST<+B|wgYh^_V&c+5{a1vJ8ksT$p3 zGl0n2Az!T@M+t%V|7&ZDQDV(pJn9F*0(ZCZSQypg8$~cOFR%)f#(uR8Bmz#E5jqaV zbtP34XlWhJ9`e!ZqFw6gVFON-ZYOoxI+v|%&)uTAr6nk4wS|YEDqq(N1l%NE#aUXL zTk~AHp4Q(7+ynri4UwlqjHN@%hycrED4G>+WEtwr*;S~tR5Qn1ekn7vMOgHrs1Y?9 zwopliLSYuKk3es(N4l28{14gz_>2XRw3+hk_3_QD>W{atP;LrfsUG;->s3@N4PYJI zXz!bJJP)ishDZqBZJcd)TD$`?I*!tQleU{*d}6YFW;V3cRVw!Hh_EYIt;*paE;h7k z67RyTr9Ba30IE>?kkJ53acC^o-UZHxU~QIki;6CQMo9m3LT3ZTSTV}T2pl&EJii|| z0?0<2oRhq*$9&=2ULfqb*|CCKa&@*KS+>G#{KrK*H5+#15A zvYcyd!thJ2iUDhKVTdP5C=CKOlkQ#_!b0TXwXCmAb`dyFHCrgE9U&J?WspJRMhHN; zrB{~a@DRzaHM2MX?kdV>9?^(^3j)7B7fB-mM(lsFJ~IU%yG5g6+kklNv_bF90HG}p zZ+t9QbQt;?O@vI!g%BY0m?ddsg^>PbWy0CE{hv2jw6aXhQVQ!Gyu^Jsg#f^~+)e^; z7S6KvmJI;##<#tV01!>!`P-`10Lzz}rwCxmf$nY*JlV?g@;o7AbwSwo2FIfZk!(dDv5Y;iuk!IsTIV5l!7D|;o@1*X*j4H%el9lwLUsVvSNH@Jk8 zgwDja=~__%*j>}IeWks6dM1EYjVvsPg~R}W-lxz%7Md!0-MZA>_N61fw zcZLV(kvA>Yz*p_I_dKb3Cq0-Fpsf79HpkW(ZsqA&k`z*22jnXEU#D`37sH>I1BBJj zpCSYjofn^~)qrPz`4`ZAd3>`WF?!^Ipb1oOZpca_SOeb)6ZjwCT|eaYD$S;%4Q~2d zdFq#@1a&lwWkyf3KXPHV0pz^SLK3%fISHk3zmxBuZR++O%l&pSmg0WF{rFo9Rl1r^ zHC?)7J7rs?Q!Vit5%kF?_TXPZN3QY%W?%3?x*|(BY;Tl;k_kGr*_ksqdl5Qb=(hCneb?x$Wt0c0_|m=Q3lA5xyK0O)Tm?ZGmX zwYAs)AKQFkh?v&y2n9ed1&3X=B!Dcc$4!9l#h*vKlze)}ONf}diyo}~@U0bHuM_~) z{TJ%VojPx^EKeA&2~2|DwEc$V*yddnK$ocRxm-WT?fVBpK;bt6ddHvOZHW1hx}qjH zfo}-_y4;ez|L4R)FV2twfAg{ZMnE25DDshTZ2o*E#g1sL>n*6+#Q5!hu7v;@<#hQ+ zCk^=(vZQhVAjXT-f`{@Ox5!l>nluibS21fe(g02r#@=Vn7%-kYkw=D|*06lM5bPZ_3pX4Hpg2F%R+*h(jUcO2?0+kE)>a?V7kEO=f~7Zyq>9ECjDHT=H?$JAon1mDRc@iRh*$ZH-08I+*>VV4!yW*9{6e5oG z)HR-MLz}yvh93C8HFse~@(pr0HA{voq+?)d9PQZKn(d~h`A+0!)^GN)~&l!LO z%Pul~;-5Qcc@%%<`6Bv>MPR?ZV_%eJit#uNqs3k&ia6)9Y{2_U*#Ofqhv|NIs62)) z0>Q$J69HIzpbaGU18!t2(Ywm}fNdNr>$SUT+FykLv-DDdXu?E6;%ONGO+0P|Z09_&a5 z41IIrycb7F$(Rix9JVDl27+<*ajlLH?V@J_VHo!tMr{Zi@2l74MJR~wUMC!odutRS zJ-38s9TL!z2fkl~K~5L4aKsftyHT`zz%wIP8?R0BKa3&fUHZQt1<;uPvC~9Q?+yTO z>9$-x=x(A$>$|gh((~;JQa57-f(wQRnCZHP0zB=v`Ty8i;ZX_mD2s?-@6pcR^KzE| z7--(3t21VhnH__jy;4Wldy3``!8F?bZAraKDXwEiSJ;+1t~lX7^W>MuADj3zPtiOR z=ELTznE{h&JiyL+`{aYQ{&To2I>h&HHjJ8Ng}B3Mu1KNEBYZ<$ahs3qvn zFV5)c6}cFw&Itgu?ad#RD`@}0y`*KmQl~$ELs)^HjL0#=PA-ZXwb8k$+U*vyNntq& z=}%sP+TTQij7$oP$;2zv0j#r>-(tTue_+y2a+dL>{m>Duw7Wz;R};{#at#nB+dI++ znSH_WY9hM=iaK|aHyI6eCQ+6%bB>g;U&fePYc7t zL|}##_nYW(alrnET=OtJQwzoKX{#I2=?&QAVd}@Vj9NrBz>XI8f4pxe9WqlV;Bbi* zOb~$XYoN<5x}6|O5c~~u#{slCPhw#PFIQa~5J&y1MZpt2UtVg2xA6keecku4Fa+j# zi3g8Cz=GywzypN=)(J;6h-4i@yQuftsM)S6;^XZrk9Y)u;P}(SDx#X8th`dq69MdM zM_eJX0lV@2s&bJU{*9-SgTRF^_=t)F<0bD%1k@XUAa4CKAD_v;9~q4Vs+a)hRUXq7 zU}(-LN!9#P8tE)uY$I>Otf1T$tJ1`D8YALM+1Zq8+pt1Po>>!cqr!vrA>Q25YOG11 z!uoH!HNE-z+L-Zx+yD;;{qs9XbHmbOCQ!s(jz)+JlgocTa=oN=jk+GH+OIFr;fX9C zP}u2Y_06ew#FF=}8}(s+ zR~Cv6+%N(t0TVyQrPO~yVI85MNDM!L{|3(GnxuHil2)$(7*+a99WzkKA?vyzncu9j zD~5*o%q!|M?yG(A9RB$N!pB8tS9EAu{6z&;gh3^p%}3Q)YlD9fg3^<{Nc*}fx+KIj zbk=ULao#BqD%?+XGM*8>Bac6rblXmW%Gk|>VEzo3SB~9!?GFBix%t(l7uOD!eqlc) z_#O|!yOozli3v1! zG-CitU{F|`x-REIp4#&dR8Fbh9Lpp~e!rPtGQf7E`Ti;l5A8;$JsA&HEG#_A9*Z70 z=9dKc`MU9%DYnIeN)!a!;ft7pc|4zW)BWlxCR)bNcfUARD?bfuL@a#SDH%^k{q7ki zlvJXnP7<+zS^CjYC4Si>xSK1_z}I)f{{_G~!m?A;=(NmxF^SF#$8)BkbnGAh$c`HE z+|;{&IVvt=RH4FhLAmwdQziZXs*ZfJkL;MaG*JjP$qtgE1l?#Nw9+gXd>l;_KmMCF z7amDC>smps)_$UJbP&z7Dc4u*)Ff^#Q1R=1jp@R^+AxsEr}B=nRnCJIv$@#YPAq_I zFTylgy<$P$LB(OAv5r*E>ESIgn%w*r>1_S)wz;=NQYlI~Zye2^*%J?__`lwfiQqR>m@60e&>&YPcYr;|EM(l(4K{ZyPJ%)QrN zS<;hM!cHEbV7bytRB=?Ia&RRQ)tVDq*Qv!iT~Pl@Mk4h3oak?$2Ude*n$T8P0zniA zD(`1~I(ZSPYO2$Y=jKK7>=FBgn^vVZ+ecH8a5hwBN;2x16ni`jssxZWg#~oWV@k!D z0V4R?v!fN4gk(Z!%1f+LPQgNFHlI(IoJd=U24+RPzl)wv>nb%s>uEE*L3?;-#?VVN z1MfQ|<1AwM{WVd06~cd0xaFkH;yk#Bu8I@!-pD1<#&h!H4EiE^uMhLD;I~|*7q99k z{62)^_AM!*GL<5uvN=23tfj~cOMe;oh0K79s~lKVvh-i5C$%;9aH|-!9s~TXEcb=N zl`k}jr0<&mEkEr`Zy9lO3Nmo2zI#Nc><^ABTv(go1T!zc4eoZ(IxTM)M-7QfZT?vq z6XeiuPXHkFl`*iJ{Xt4aR^Aq+C<~p~#sAJI&T>H=7mGz3?L2awofvrV6L-RA{km&m z8BsGfb#%=9!~=Usi9Lupz`!qA_LIsOK2^`C!~niArrY7WgGoLR^mDzvXGVn>7lS%<+dWbqE^t8c4& zgYNMWyxC$D2qm*B+B3@=gICq)DMS}xc$2x5O^S;~w6U2lUS!IMZ-T6g8={80H7nPd z-lC`E6*mbTNBWm&CT;o0k&G)KvnstrQQ^e=9T{aWC5T|IiL{ftW+2F8@&VSdpCsI= z@d-ixTi9Y#bZW>KVNFf(sMbN~!DpW=RATYx3bqcAuylnddKg(d2c8qA1JH`M+x zW|XGC%PbOEe`fprI>W^g^>mm&g4T83#=jNaBrgZiIW9XxwmNr^l=b*fWt`*(H}Y51 zB04D|Wdwh6%o^4z6@Tg^6^#~aa=?Pr5Y^2E zoGkfBYVZ_Tp@yt_th1*C?zEA(H}ILUYNp_gAoEn|nL18HDvk|LDH;{&QfVTNocGaM zO03e?SRTv}L76ndYnP`#8UI;`s3-BI^C07u5LOZ20LCw=W)G^=vb|anp)4v>H2w`+_ZkE^ZsU}IWhtdl$$z=# zh}$I|JQhoHef^4}Zy{w_i9A$`MT(8=Q1`C5riqWC>bV*E%X?Zhmde`U|ET1GNYcY@ z_Z=Vv(_@D~H6BVW(sTNjgDd?FzN>ABq+%RS+5z!sj)3Cx86UNl7yasnMkimm z?wHVl`m}N_S~fLtnu}=FBvra{ zIrpD3HZfasbnjfN*z2ykDqJqzqJBu=|LiJ1!z6Vl9hJi8$=}nmvB9L2!guG+D3B46 z;6I-Nxj+(E{pr#_B&FylWI-@Z4FNz?K=?UP?I#Ww1 z#l6|kL;phn83tEZMyXQ#Yk}l!>G9fp*6!)=z0Ot)bmJ2I7=1s6D{J69RiT7^-3F;k z6X=zHz%@dtRmrL?EAG}4bJZiZ>J8cgBml8hKEiZAD0tX zY3CaNLQpnPtlPb7jN7#uhUn2MVSi$@iKK5^){>s~AoC8{*-gM-%9;dW5{FK%L=9Fs zYN2H|(^bgeg@9lh8DY=y^9FF(&$h+03CVa zKyf*seWd;Zq+Rw>i=loD8uPVxqZOY1!r%9UvZu1tU06QfwIb7=AcGUO=5XplKSWuY@e3{-71ZIYsg%gJR)bc5&?N+1s!1L57Cs*f}incsCp?Ox4pmvnL z^Lr!Am7(2P$S8X<}%B>IVT8NN-rHYyYz&zL#p|C zRA#249n|c^Ni%2=Pt?mp>)&Twsz`(&vV@Uc}?Meo^911kTHcUFBdHs4!CU^h@lHVN4?0`Nf-QM19EEvoje2N(O=r z?$W=v*+@tkxcHaSUUeTDaCG0Fee~-mrsAc#FIpLKnlXt!lUO;1vSMjr0;rt0(iED4 zlpgfsz(6)--&Hn8{&d3g z4JRfhysJ@-#MFpwHgjuP483bxd1ql!s;Q_XNW{L5)68Q{#t&v2{Jo3_DkGuWR-04rz{FyuwuCibKgH$ z1#87)f4dcG@}K6GE6CDSn;ZDOAnQEr)(?~z!)f>3ObUIb%L$)2;;%|eXkh&5+>7!Q zI%{5In$E3aTuSCi@^IcDeGGVs{-L2g@_X{B!M6bv+!AM&s1DQNt!$6xa-U*mup&iTET3|9?U+;Im z&nnY+&b$!&{dbZ+tMS*_6}@LH?h*dKvSLFSGg#WuH6s4H5Yms>P`PmYPRT3#^bB?; zjCug36_TNbvkilMt7WWDheTuYyGb&W$%@h*BkxPB$B zBBiF%RPe#R&@JEV(9FzD|AVqJs}`=FiDSRtd7}}BL(+e_7~=P2kr>ZDq!Y0@-$Xgl zx#YvvY{tFZ{4?m#ocVb4*wM>vWjn`J5tgG~XJphD z{pTFH1oHb%H{Z!+u^1-KTp7YmC}z3?<&O}p0&YdmbNsq(ND%;xEVkH z%pqEX$#3m3MG!rG6N!Hx{uJ9@cQ7#x4UnKF?+4KdpJ~6Za=I(+A{S&Zye|q;&MQuW`W#G}q{$mptvH26vVPRj_;rIz!y!S8o$&2poAH^p}O zY@vlS=cCjr7)ZSGn3I@)7o{aHni00}FXjcR)WKBS(+MkQ}}3BZ{jk67*@j zN^qzlg2w)Zd42^CQPb!ro$bY!bE1=w2%Sm8Yej$~W1(u-ux%jGJzd*!vEz_{Xwr?R z8%USpg-z9V9w5>nUzS73fhWYmrlRQCLIVJlDXwvp2^WC@EPOUZWbLJ=YJ&j0{F@$9wQA7 zAlk^5Om!R}TuMAKiXQxXEI; z$=c;_YYHrlf->PYZ07syAfRBviG<|q!u;e;aG|2kGP{_mNzrzvi6=Cy_+D}_V0;h<3${O*8FQN*fPY}VEtB@c^*5k{0Q~?5L zrE4MVr2shRuIuTpWeq;*4cd!A5PCMzjz*6e@M%m88k`*|aQp{dT!$Ja5Nw%a5Xe{d z<>NKfMw+^0Q2}cv z!q++-hrG==`}{c^5@JG_2yw_Au4YpsW_SK|LXRfBUlzJI4xPj0-a6};ktQS&rsf8} zSg8{Zf1v#S;-^J((kO2gA;|_}!VjAU;6#7atJTf?v#6V)e#RJUo%oA=7lZv85g)-0 zUcMC!BstRUnJ9*WbJA5-ejbLumnsEEkW9V*yV^E_Cq<6RUh*IquD$11I2=f-cx5J4 zk@3;bbgG)jD`Q~-+)i8t31Ho#A+SPrgg;Mp4Foxu>P%dKL0KnwNjUMy&N9rw) zGj&Lj8KWTV^M3`;2W(}T3Ubx@+J?Oh_ZoexM3B5$7Sw%@haF5Pz7Fr=EM+DgoX$ac zxjbPZhI3{uGD*NDFH$)!2Z>!mOzcBu2u%I+yMdj(@j6QpW$AVp<< zg6t`VygvyTYV8#OcjhSl(PcJHOz;S^HUyx*0$cGav+H=h&Wurej8&jp1{ZKa`R}N! zLP-(@ySqM}C`d;0iT031U_^$ZKc;Y5T=rlKmL(m6(w#TgtEXUA z<@eV5$Pwl`CTgbFam+xBo~iIp5JWwnD5>cc9F!0^DL0y8n*8eA?vD_unS@@a1U>Wa zFd-Us&VBoop_7`Aa0$07L}GA@i@uzwg!8_BoXo%Moa}Aa|#f{_ph+G?%+bQ z6m}nXIx&F^aqK=w#{3_1Y`k?5#I&~(f9i@*tXI=ko?S&!M4zL^UV5G4lsb(4tx#X5 z{**kr{R`o>8b!kk?~&X0vKAd|8)Nk`v~-_8Kb;noA?6e9n@%y8mxscknSS2bmCR$r zMPT3lo1Th^$z``M+>s9FuYR6le*0Zf3ElvP9j3fNc|kzkNeaGK2Erh`G5Hn}%+Q2G z;=x4)i|7!|nu*ipKNJZ|Uv8J$rSTfSr2ByAjYR*WX=7~v)q%&;cCXeqgh1=6dqr`v zH?L`jAg(6-PkK2E6Rn=K*jWHlwT|Bc)(;vQ_xkb@jv@UI5 zq%N2IY~dNx60$`F9x3~I-9yG9Z0#nFMEkWtw0%0s*yU7k8!+^0Xm_<|&4y$IGQvP% zFpdzu>Lv##@e)#o&yZk)l@(Rj>smI@W&JO~bt23nt?^8Tw`)kKc*W8*2^YmvkgS!v z+Be^2h~UbuCEPzDU>IQ8sdGQ98~my5fQl}Lt+f1)7Z!-j(hAZ#;FT4pfO&VLgRVOp zOz=<`GNttY?KS5JH;00{#J;UUOaA5wGDJM=6&DmK^`l~Z5|lB8fo#M;3fYomH2mz! zdVPxh$ygU6jo;UWB9*OQI!5srTR6d=Txpx7w`DWXsc|>9ST$r2Mw~{E?ult=YG%8W zy%4@LvM~e_cK-lA=r)QOsn97^bqAm`YVE29a8eXn9dLAS6Z2QdYp%%>^J(IB#KswH z)!%9v@-+zt!5Z!5R0Wf64Yq3R_ukvC@JIoI0s`%)HS&6nDwj0ILT#UOfiQ*ipg3La zoVO8sd=&y7tkW^T{RfAk3WYigy@o&5}9v z4eYAB#Urx6Wu!pU)0AHWTaq3ijklhBby1RXa;gS@^sWMZ+(F)N`bGEERNqHn^w5Lx zaM?>0w5@19W!f~DM)eY?XkKht&j8;hedwalB%$642HULNoX3v!?*rae8;;hzkhE#>iD^ru-+wa|=@(;O*lMcQOtC*t+l^P<0z!RuubHc=j7Zx1H{|hJbPMCAC*KY2PeZFbOBczVy+fJ zA>}WcBt)fOMgTS0R1J=iF)B_4@AEXrQf4dl)CLL00+m42NQg#`LKa`JnzUNnmi~g>;j3 zzpVMN0s!iEB-&bO45-^;5de0Y_n*VBz?a*CSAb5i&{=1$O1l*?KEvMfuajW@?@pT4 zAc&N4`^9lNia1d49uW?Qhy-(-2p4$m35RC|-j8%F6Xgvc`V{IGNCqtmmQNx9WKusN zK=MUZ^LGwIV~l42cNS*D_10g)#Fwsf8WH8m&> z_iNsJFDa<_fn`x1zmLCoqtCfo2IWZI;l=wFi4Z7$DXJxAszqRiaIi8+Fp)QW^KYi%_b)OO)oncCXED)jM*yeqM3`< zkOO3sz}9Q8>bn@-5w*MEFmShRnG%KlUO`Sa93{V#7)dAh3Lsr4#($P!Tm%YnZoVl2 zcPlIFUMFG^T-?IPbAZ3>AJxo)$*Ki_mw=_)A2dRXrVjvSAwejZ^7Np=Q3`EZfC^aF z|D(GH+?Y`na4|~%5lDXmNSxq7YE_U5l_9(KvI_e>XhqYZBRnxtrE7n9pNuTm!v_$H z3Obk-zjrhs#SE>S2V@O;< z>OD{scS=10qX#C7r@(X)XdG!s@|@}l#f*IIWvCZ)e&JVTE%f2<^4~=TjPz?P=U4)q zx-Wt0=Idy@TgLmA}7u6e#=R7oE&!ZdrkZjs*6$2nc zd+(o8SJ`04;(FJk1hw3^b{_6s0Lcf&yOBC6DMegT56J8zOy*g$$BM;uAuoo3LPRYR zC#PTt2`_mUiWaB=A$(47G}X~#V!UCP(EtDkETf=Sy#`r(zF?;YIq}k{0$Zpqsesy; z=&Bj-Q&6e_F}i(LK5pMyucYS8zYB8LbL&YEshFd9p0*e|xd#~fHsI;I(|i)d+9JhNm7zh~EQ5_0fHDSq+`bI?{V-WP3XNATfQyA2wLS|X zm)k~>6fvCo`@k{=vf*U+2O6*s04jPPZ(}Iz|7bC2>>z3a7~u-pamSL-0`tKM`s($; z4gj~%&=z33#4+^qFi_<87glN?Z0Tec34Z>=tp!nMnI}RKPfNk1-9@Ne5aIDm5)#aB zK9iIP>3;$}*D@4O(Y+VK*_JdU7M)EVn_TP%fov`g2C8(A9jAtqP=R zE7vmY1DyO-i!*K$)76jefLSw|g=g&Qbdh)+AgH#Qg)JENedJW@V&G#OX$}6#&>oSg zf-!RGiy@aX!>geup{zGelfLW&AY)5lnvR0OicRCi@EMZ%nh&JoX59yDhbuRO{6Fc& zy#oa62H2C*!HF`QpfE&BHiaQkvQd^G4uWa82op8bvBgjm8d;sB%?i z4mx`k+dE*;thD(AH0&h}X4z`(0Dw5oZ~r516b(O ze}BW#js*-1oK|YHU@%|QBnf5$j`ev&p1ZvT2!f!Rt+XAmHUoPKez zn7jlXc*QAD08deL6|Vr>lb9%Du7~-$a`L#KV+7#3>fXd4Rr4Lh*aiir=uFJ^p50!O zS2JZW{eedrDInC3U}^H{CrI+pDEoX7dryN*Gm95=g{ zc2e8*m)S8^$J(Gt@sGb^qNQR>BRgX&e<_j-;qN%1g%la;0^{uTIe|#xTR?h08#5NA zvC>W(<*;Ri8X8$P6=naXRsjwdg&AL;{WOo&&;}d%*M0PoVxf(l9oV&p=_Gz)Z?XAvBA*h-hqFJ(8fF< zAONxHu*8Q&|0k}$zrVgdYtcM|iFRBDfeh)iF=!*8U4p9`u(TUGN$`~V$W~er7-^$? zXSh!|4MoCHdR^bNLXxbU~S~6!I9;yuHiVx9usp@o9p;XLM8W;hY~#w%CAHzGbSa{y4%D= z59<-&GXz<@wcO6)w{eEWu@um+WRJ0fCLKeaS77!Wgub=29Pon{NniLqWai{^O zg-p|D%8lo_1)cqJ^wU89U5&A0IROv^4>CU(V0}6f{huj?@q4M}6hoQYNxmUT`aP?F z&J8dp1bQkH)!mdR2U_mY7;)|ZN!BTu_yM4Ij)4x#4+kBykZZQaIw=td~*?ydz zvqVEdoEU01JRQS1oM2=$4QA;1BV||KoI#KBw16|{F2$)cOb3W%b;jQSTyTMSGxto! zbdaaX5i}=|t|`I-3bSugRm*t*Jw?IUY8@auMSI_5F?NbJ^;AqWbyK3ov^`HXg8#hU zNikyZ@>hyB85d#dz>htr5#Vb!&F9w+lI<>@l<}}60T^eT7(+AF7Q;T!^vQ*H2|iBi0iPI1TwbDqq#UNR|$OqVJoT>i0tS426q~zzRThxcfvOB1DY!kIFO@ zKi2$QN=gbW@&J1$N}VLEc@~nj9X36}Ab)!C0W(TiWQ6E@uM-OLAbo{WaUut;4nEw4 zmF4uOlc0!ZK|2E+QQmy%Y67L+`Pk1hZRLRC=0A-sM_t+J({kxi5l$)i|8um8 z=pDisQ^O`j%R#_y5_D^3*A!RAYcd+_W2k3VLx`9DAH8(M880HbG&~bIzAP%L+cu^2 zwf^wNJ_fR9PX3iqALQK?RuUB41g4gTi-qQc{F?SZC*uf!)oy5Ux&PTnJvj$wcY*|y zZYN^YU-M++R14OEF+tuwv7sl7w}_Z6;%v7<3Mi)q3JK%)_l%%0fDr-cOyqum;;wg)EV#!(#q+UtLmkLjJtlY?~wgX6atC5F``=&1J^*_S!r9M zSzyPmykkmXkk3?O7-S&8KTyE{mlncX6!M<{&i9hsDoy*fA9EIt*gXbh5hWRjKDLei zCyD{H6>?TY0Ax#botTS23Fhw;H9-vEVxbA#eU~o=om;q$J+&|RiWv60Qmg!$`QaS$ zfB_kYpZnD4wl41z2bLk`(Q;aOf;OAF1xi82THUtwS)z&t0F5MmzWh9CdlG~tjWxix4d+e`S-a!oVehL(-CVZ;d|57 z)m=cgT$LM=V0E3verGzkna5SOss!dsK?X^M744Yfi{cwxV;b4-p5kEUX_6K!qt-PP zl6-V%p^~6L9e@jy2`!zi(HVIF!8h4=96VMWc0U7Up{hR6nPg&aI#Oq$i}!`*-lCS}#ezW89$IB!~;YVCgnBh?Z+ zA=VKNq8uLeXFWMv&iyw{qFjDejb?{n?oA-1%1 zDY{=k%cW$;ujEhAvH*Ld|ENz<$N*U@^~?uiE+d5QL(zWRY$b!kdt#m~h9e6W@Olz% z`a;VT#!1vj`%(ndZ_D54(S&W;ShQ05r1b4{x%!|^Q_qB@ZShg|A?-)XmII>VW-^3W zKd=AAIkyNI&MXE+sH?+rZXZ1B#XAs6I5`S{zKq{`9J=0Z?W9Z@jTwA?XJ5`I8YdV z>R6pu*(l%itEsBWqa?Wc3*)UB1NmNOX|PRRs1jueooWvI*>%a}ktV>C9hwsDr?@}N zkc?LW17$K=OOZQ_+tM95T(dh{Co&)G1G}I%>?-F732jRgHuD3!6-d$Z51?%QM`~3P}5emW#9uf^@!C zS!S$0$-{Jm@f*E1{a)jax{pNu|LGPS#(-ob*}2`$xm~H-Ix*;s9NMs}S#qLS94u9;z>1Q)fm#WS9rfGC z1CZR&x-kNlRv1mcgjxaHwK_Z$M7?K&;4qV)wCHG#GBP!i-ow#bYV_f`=X5X$KwPP- zX{;}1Ka1sm6_QZKUqyiD{R`~00Ge}F1j6PEVr z1v8cam&7eY2Gp(_30&hQ>7ypaV5G5!7rmYa!bjCN)J;-(78)#VBK^#SC}o22;ga=2 zJO||5n-M=QUy@)(1)2O@Sr$D#-pEf)K6;14`HOroP7-?-G8Na1ypbCpeUM+n(GeR0 z5f$4G!d|?_k|U~~9vT7y=D#0E^3e}4l?dk$vX*FD+kZa6ZwGBzecR4W)A{Q2>$P&@ z@L;{ywz@yjs%AuFWVqZo`v4a~xv~L(b3mPb5nM9#DO1OrG#MGRZ@&q4^q1sQxq7jh zIlFqK!BOYo;PO{`gy0=zf^qhBt&6Kl;Fj>>7ouc@)gYfaI8MecQC82iB)8D;wrpnB zXES>;SD4ddCPv<8r|`DTIHR*HRoJwXf_E=R_<;OEY&~`8tO}%jva5C= zVuUUA(F46SCdi<}`kH1Uhu>aS${^TbLy=Rzz(|i#9E}^@6z($m69P|;xU~qqi$B?c z0TSj?a*ICn!sxZ6b}4K97kIbx*Hu>hpTdc;CH#yCUi=;~u=JQSJ5k4Lo#ONg0x#&= zuZcu;{w)jj|H!E_)3flG{+>ktdlkpqkbp-BUt?5v!}B;9Xqp~orHClt@~iBGd1Us4 zJU>Jq>Bws1sX%MY@(`!ZQ`1y7mzjB)a79JlO{K+|F0@XgJ0A|6{ILGIbk9%wU(R?kYePS=mnIz;`a&a5nx-U# zdss9<734euL19b|8=6+3uFwkoL;m7RALD>efxXh{{^Nqdliia@u1Mbw&SxW{l#%n62QV{ zmu;&lfRxu~n~L8o+OR04mx8_apI`^q6A8cfg1IY)S1s3L!BXQ>PSITrV z`Cn^`q~S$S1nsPg27SnUWqQh&?nBmL^7~r|bI8cs4!$bHg?L304QU-t#p~;`Hzx>~ zsM#`!d`tFVUsC-zXUDonm1(w262A4zgCegpb_tnn;OOJ9dzFZRC9?#U1%37+i4 zHir`R zpQ@pyo#E#(uY1_p4vDhPXqo8yF&MlKJK<`B@=)nb#evv^!Go8vdv$?Oul&Fh(wp(= zaCq^!i)`fGY=+47Kd(2Oh9MswX~QYcM7&DTg0`Bps0G@yo`P}fXx465EbNEXqU>Z$ zK0w?|v=Hxko2esA>H0I$aQI33P83~$euL|7Sgu)B0OABGB8d#7dFcBHyc)Y^4@|YBx64aFm zj-{i%?#-9_eYAbH*hSVqF3vxb5c@uT3RcXu>M6n3EFoG-WS!9bC`EtNGA=CIJW4sNqsPLJ-cK;`)1;(jWAG_3d zM||9UFY2Xg-#9-BG5?;lAGLA zm){D|f7%x?e_So5s~I-1Bu(2dHLD}-<>j|veVdnwFjk^#`1L*GKD66@fK<)Nd{dk6 zu&6w`do89|Q}Omi5Q_~*1cUd_3vIZVG52|{feGyoC6e*=d=!#Af4U;9OqWfZq89E0 zYCN|jL-DPlm2$~x*4euB0QC=UO$BjW0z^W9fLi5{q`FqF( zMF|Agcrt@l!}lbJf`{VRj{>iE^F;+lD!5H0-_4oe{ICRY7o7|eDc3W2%QC)=4Cxge zzAR+`em@wy6=wU|8u}jpJyQ{qrm5t_sI;4zH!H30Y!C^ogsT&~{Or!?P+mELTuO(6 zawcTw+E>+yp`MGH!P`ptw?Z_;AVGUv3iAF?L%Z#nExwDXL|Gn2x8%bX{B4^fODAvX zy`~&*cP%x=ut#Y;2~?dMFAF)=&*@&Ij36e)0<}Feevw8s2v9 zmC(Z9i)njJ&I({0^lHm7U)a{+dKDB&OQBdgiMC#rvXTDnq1@=>ZPZP?P(O^l7%Qbi zZ+VsG$I=0-hhx(O%~YV8yxqE;MWb8Hj_;)Ya=g|o&bF}~wX#sOfl%dm-??YPe)Up= zdi*b_JyD}tP!(gs5HgiHqM4oHp1CexaEoF0SO$F~PJizE9H;ZODd~Ne#J2BcE9~cW z6^3WlMAbFdrL|k)vFlEuZZpYQ1%WsD^hv@JzEz4s5iT@kH`R~bYC2izeWj@MImd3C z88&?C=sdL^4<&P|UwTmCTm607*ojscn%cJ1vhZWQLtt0Fyd%oFkrYXHYv-OV+}?8i ziJG54`5eWP4`R>22m5YpH6ZiIa3Rnkcw4WAvE4gsdrNMKtFoDE8~^K89VFKB;y{yy7Ct#H+1sUL%cv2;lyz!9aliH&?JF< zsYSRSiu+xUiP@FScZ2EV$KDrJRSX zBOot{YM-VT`ELfRZ$q(dPN9;(45TNBd>(%Tf&DzAwY(U37CLrXaVOZ&XaoHSh5KqU zT!uFCeqfUQF!NeU@Pl&C!FBi6NI&yNBsrPI}cZBLjgou0M|1_B6y5MJ!?;AbK``kaI z+2c4=##v~J_iH0YL{uq9T~Tn9{Km^O$k6BOKC!9daFBDq7Cwz}(ZN7zDSYn<`Ae~I zAeX>S*+Ii8MsE?dv0WW?>MskSS?z8lnNhiFW;-=|b}W4kl(PBZzr~xYnU4%Kl3bRC$l_#ZNdx9f!&-8+~eH^|sJ5?8VT#6Zxao+3( zYYK+_gg;#WQ0wbO;0rYwxLn+MJxF-MPB!jU5OWO?W96N$~>%_+(Y=hCce8GoHRhc`Vdj2%9?I1z$mD>~DcsfP%*K2G46VAI~$`|47GL3jDJVQ>4ip69zD!~%7 zx@%J+3cTg@hOy+YK1dEPF&OY75ZS&kL*(H}anQ|vgsJ11A`gmcvL5)nF0hLlOM9{> ztfak4BsHsq#qND>-hrqow^QOEO8mz>E;a+tXL2PD>^Q8_5F8rT6MWo!^p3aP*p64|-;wPxJ90mX6lq zAPB#FQ&-C*c=_GY(X(+jF#N7SIT7)*M6QAYs`f}4?xnn(-1OWkM7(i;^#f(MMhNfL zU!MGH&HWhIaOTRwuza@;son*?k`;to8{BF5pbJ=CCQVsxJqFCwZqj2Gs)U5nMg^X$ zHyQi_6&smec|HVvOO}pOqXY+za}3P zSgm?FY7v>!AauHyek_m$ns{!d9%_sbE`6ZttrMC^=rP_tD&8P$CANEO`6=D@*%+1gOo zG8tRypt1IEZO?Yg1CoewjGFI?OcrNc!z3cB`;%evX)*4Yl0o3i`XE0|aKi#O~6 zj&?B|SggkS`*#DpVorU_Xa=58cyffp_Gs1@x*;9%d((o01nfy{pT+E9FWhhkQUyuE zzcu+&et1oJ(6il6ZYoPtXmAW1|B4hxp~koU{Ap+9i)8IQQ`ZuY6zfOy^V#yvJdXX| zlBKT!Z^B-$!+59CypRxusqj7pNlbBu8Z-8zmbg`#*)J4%O5r@Zt9>IeH3=244#%7L zsH#{2^O#cFiY(HlXs&igyfZa3a3EU}c+%G1r0^yE!Wx7o2W)br4|DT`zC%~o|-n5h(^M41EyjPx42`s#sa9z+Z(O^Dd==)waIg@ywPF*1Kko^1N}dMI)v8lGTiIe^Po#;+-2O2-NLDu znTpQYZw#1qGt%JeURPz$vcaZvKgf8SSw9{!`*@4|K2AtWt#-NQsCqy=;W3(swi1i` z7Fu_$hD_hqods!tM^zPp4f2m*>JOtda^8lau0KCCY09>f65K8MIv%Po5pB0zjTwi` zNB0ZT)BMP?!Ic+Ym#H^&Fi;ggtgg8~KB=C+#DOVro%1rz zM97IzLiR(Zgdvl2z^l<&OjPNE60fBde-IX7(0@UyCafEC?m@ zgbPCbtt1wC65OUTJ|Fv}tg~paDCmm+s3UB5NDll+ZHNo+dxt)u5#OT730`kzL>1-^ zeU;9F5K$z}9N_Z$AlrpvqBx%`^UU>rbsUCR?qlnw5z|kQO+8K~mHU z(v+u7Ro2I@&SMdg`!C1_#!jOKL6e24|4SS#$1zrVY<;b^`itn8_Z)Tz)oFwCzG$ur z<2n+_^?`y~#f5GBapTlwsJHzPlU?@v_`&w%oi7D_(FOl_-07;)8{(rSTjN%FAz|g4 zYUBGuu;LdZO&bJ+IqF9ScTP(lTy>eFwvLC6oHW6h^=9|`y6=A>WeydlX_r$9P6YT1 z?1kkz(v-|?GRr@`J2TZ#owQBua%B}_^y@e^?ee@iUwDesgu6zQO==!V zD+Ombu17xJ1;-1?Hzpi6epC^)s78FN?YAxQu2I$E(tiZQedq$Qn4cifKem*o<}^pg zN!aLEY*KzMHABl#I;n-yEUf#&`*63G*WtSP#PESf-%-ioq@*UvUz<#`%#tG8zK1QdE~kZrw&_Tf!gB7O53mSBwh*EjSyn4pJSqgYUe+3};k z7tSYIUq4%lo6%$2Y1*&tp=e`LHdEfO0I`~xH$i57LZYr$7TFjx1W}3Sr*NY-L58c8Q-E)0YxH!mPfzU|?bV(0HI91ttF3?Wr+5Yl&oN2#zO^%< ze^vo=jq&@KG?AP?^Afz;x&}-gp|cO)*so6T<@cXVw{3j1i`aXu988zEM5oaQ1y4Jk zaQsSsiXvaJq`21e+}SLNG{DAka)=F6e|$4r_FZCPY4jST$=;FFH;b>RfJEy%|c3`EzBfc(@?!OnIFz1`RepK>WvZQ&*u|&r5wUrFUNc)f z-|b#4@~Bg-dFh8~+9DlxrDoip3SXr##--o_&ipJ#wx*m_v~cU%EzxSL-}Y49zP1C#L{gvqj+pdfbijLYF&)EiztwR zz0P^F5+&Dl&L_@&5pT@zvR+;>mjk|zi{8aivF!{o(_P%W@))T?TLUd=6<($sjYGkv zF8(f*hItEZ3I;flbEz&(2;?0?XEk1hL3m1rQWqXwv$Qsh9`jDMhE3=TBKi6fzFBgA zUBo=NZ$pSU>zR1&LdrA_0?EZIdWT|~H>OX^bEzxEVup~~GHV&M3Eq8aCnQaTVX$?q zA#4Z{U9hX+w=5sclM-fsGN_|i#+{P)>@e@L6)#b`xggVhcwXWZ>?jqQ{wgQxRHvjf zl&U@U`B}D`$WTG=az~`*_>OoT5e{1XxJ(3x=*98435APpEp<2sUvj_inVLuI~bjbST z2tXTLT_Uh`ib1agU2c_`UAh12El7AbVW&`-_|vZ5x2tr4@zHPoCm#pDVh`$(U^TBE`KOy!@Uabt0Tl z=&G~3qDTeAp{nW-LmM2QVK@I;TiB4dVi$^floS;q^&1Q~fop^T0v_W|h52k#Ie{$s z`O3}s=~r2|rq~y!B?@$BvVj-)676S-P6bSOlg)~*Q@{}smc6z4uqk7+z&^5MpKwyLXwYeiu9!2r;@ z7eSWflKt=F&dIh|tqNleZOw2-*vmlBWE*Q>iL8fA#GRAymz?A(`8Dp!C8fql7h;b0 zngLjC$&3m%pMZi6Qt#^MPj4{T;*%;kcLi`{c1y0h)SiGlj#bb)WjZ3i@KG z)U1DN;p3V;f(VO72}5I+y<-IGt*=~<9-&l|5k-QGOV3o~vcxc}g>T91I37JAmCQA- z-HW&?9Rav2E~HLZKh7a+6LO@SUg4E!MKw!ptPko67?jF8+Rh)PGVV902Qvu>BcRL8 z)t)~vea>E2*XK3=c$`>KJJ2CY#^7Stqnm?zby`i(rEm5Igmg@_Np}&{B1-r;TWW+N ziJYOw6b(VkOuogl)I2`f%zlP}ttl0FooZAS>Hb#}JK=5;L3YSHAI&r4OxR|7mp$`@ ziDG3&g?9ygQM?~SF841ByK)^l1pB7kw3b^4dIWa3xt)>5DIF)*9YjJS$3~+_#kDaWa}6S;*z@NOP~> zSHz3Ypdlr714*TGwMITLXfZBP;dOyK zR;RrbpO!8J&sWNZnvFMoGwyhC&-2T+vbhQK`t&6A6uiQ{N6yORi6STFa!xIW=l9lRdF|WJnh-1=4g!w%$0+vKs?lf1) z34?+NiNdrMXozpdXAhcA{m-INHMUmM*>iCB7w8~UAj`SgF@q%wA2fSI8V;nCM%EJ;jSp)ok&GL;CZ`&hN!SatXh_0R z_hxQSdF5Y}TZt(tyNa>9Fa0L{ zkY8h>dmNTXS=b~vd%9Q|tjEq_C~xaKi7lpv1qU$1%)Gf+{A0>|;iMpOxw@kE$|8#8 zBvg@qT|}Zv1)Xch8@fo)?DJ?vkWR(n7|wbpvi)W2rv6o;RnyjuZ)T=I=Mc4=j` zVVLau@iFoG{^&=Mr@yUjZ|oZvFM(ImR}XJ^0|pH@v#T+Fv!&|my-u$7ohkwn>6^PQ zf=Ue&I<%{-3$CkM6V<6XEKhpN_7(gEq-t!+AsDcO6#d`5OukD(e>RhrNQ{vXf8~|I zQtH=>cz(VU_d#i{l;DSOkRP4igRkz7cE=!v#$j8yb2opdzR(gBQT0{}SeBu?9sF2* zD(kw~MPQrhNW$j3xY}eKUC><2NWKAQxZV8KS7S&EUZU3dcE*cPUW?Hp@Ir|*jp8L| zuC!rt6R7MyYUSY=Y#6wUeEs0vATU48)ZNVE0%>m*WM3nc)WsARRdA^vX?{5@d}{<2+05Y zq5&$QAfW!6mH)qG4PO6S`~U0Mu05qgA%a#8AL&-WLs+?5vRavYL4g*q{a+0$HV{7u z0z?z~Z?d+sWCI_Mww<#DcuRGB5D+B)x2_2E9Wq*7RSp%25DBylRY6`_6MP8Z4+0#h zxc6Cj0TqaD@&=v|5NJc-4`ezM8W98pIfR0=gtkxK#m46>8l8OL=ChhjR7x^&+7EJx zXiVyAdIVZ*Zyf0eZy8+kw`^#}`jV1*WJ+dP>L^5Y4sv^m56OAdN9^I|S;D`yct3*qb*}BW9k#=W9UQbLrm)HCqi~W z0}w8dtkCuFhk9fNDbx=ZoY%P9P-bZMMOWno5P_&a(Dke4Y{?Z;1lxt(h_C5;&|jz) zg}2rEB+B5VQmA2#Q1~P7qkE1+f;#>1pM+1eL#Y*z8u{G#7ExYf|9EX9_j#0yDJi7D z^kHukmBrpu!T~Z3IQ-c7^bZ6|DQR8t!H&^nPk41=P-p2+KWG%j|FHIP@528}c7VGk z>w9WO3#L}+68MlM^Gd#@@CLiwnKwwTpeZV%7pN!73T0C%X`cH&vY}BA1RZl6{wc;ykr9Ii%h&W&}vP$ z-BYOlUvppn5A_%Q|C$+Qgc(Y9lbs^8SSR~FS+gZu^RCFqGHEO!W>Qg-wGBm#>`U2Y zc~z*CFxj$BNwzQ*g)HCe^Z9=NhwtOz7x%vIx#ym9?mg$8=Xt%RNaG%6Q7XDpwImSb zqWr^`nA(RFuzay<#>ey?EF0pmOkK8nv)e%Xq;nlqB6Mj;j_6nJNgi+B+8pSD6B4w; zQ{^;z9pFc8d~bKJoFx5hNy?EUVyQ=dqAs3$gt|Td53toIRUsb@m782?m_QvMIyfH0 zjoNIm-0u_WTVI3!k4D{DHLA1K$fO=-9MR;*8+ISv=Sr`>J>3Z(hxfo|7%R;Mylemb zN$bfG5f54?P`W2(k0#HZ$Fm|lWMfVwA=OZeiMU)5O{hPUs}$qU<$s9bf^w15K$t}& zQ+ax9crLJ)!cqdSrw%VluvU7d{pMsy!c23^RPI_;b|}l8F+%YXFxaev!bAUiJV_L` zP&qY#NJcIgZFIYh%~$D3dJ?;(m0@H5S~g`ovfdv9oaNY}?BkWAL0G{zYsZY22la))GF^ykN1> zeOzGPQ%~YTQNN3V%})dC4L)B_Kh;@**UJC2%N<0~wAS6*N11IASyX)55mo>#Z-ll? z{;L9iV;v0nqsaQivz?y1fXx!e=e~?K(hJJWvRpq@%RL)${UU=$WEzo_;u0az#CDte z>;@lT*fsRxFQ?5JH)Xi~1h1lQ8ObKieolDZvkB+Wx|O*KK1MS4O*QF?!Bc1(J$mxhZxJ^wWL(NU*ZV_a z^{K0pwY3A*OwRQ3*X7SucyvuRB3o26B*V>4Ru~5TQCzUFpSl!@Tva>cqvM2fw0zI{ zD7%GGiEG3TRpp&DpX)l&*4jPd5+m*DfAYo@J)6UzRgrGTx^3v9$yqMH6{q}$fDivU zq?XcGBOV_UQ}+xv``v7&$A!_4$;%!g=~?QjMmgO?(_$0@t_f`3c;E1t1BaiiNp1WY z{B>e5pv=Ou;N-1e5p$8n-v?naPW_YpZBDF$w$_)W({sF}hrM3vMJ5vpTbrZb*UwC= zwHM-^ZWVZDzY^T-?v3>jZYp2lV-{!?olGMt51F;zAMxn!+2*GI`&3%v+=4kcFn!6T z5)`tA zrF)a5`uGL1NeHv8*{91?$z=LARTZqSlPxN&-GcH1S`(&GON;Eak~1S;bhc~z2Z^8J znYm9PJAv(eU1i@u!?Q5*!Xv3T8u0N?8_1R>#pZf_SGp0 zieVSu8-xZ|5z)W9?TymfKbgG%*ZU9{)iN?X;UJ9~cS;36IU zI+4&YC~-q_W0*2>S}Q~YJ7!Z^8nCbAxgfdX^3-HLEctBL+p)l2L>mVyHeusM86A&& zZaOTXeVAYxsPN@pi_ZO{h|9;4R{!R3+9eB}6`7jPei2a_NsWJ|zOWa@X|G;57lgW#hfugU0vb4HKVhQ-mu0L6?si>Cp_ogYZ4hJ9lu0Q=h6snMiT- zIQz*`>;?^dCtIVjEDvR=x2om0Zp1jyDx&wd!fOE=b%bz@`x%)E6=4!kOG&uHSzutr zZCsA|KW%o#4F6mvU}uiP+$U7SyoM$rz1B*$c#}g9xN8yO*UzAGp1M60E9dFCb{DFX z3aFG?nHM7+BbihALjv}Y>uNgut7TNaqDhl8{3aUzq2YvWr}QpbkZGK~-N2idr@Lx* z&!Q{?)Sn<+j}d5YQ+jZ8uXLYA!FE4-=@#yglYkhlCKpv0V$0!j6ZfQi2r9&mnUOnLrHxN>8P~zxcw?ova!lTH^$O}xk~zk{ zB*4h+fc?tUa_g{9_6*c>8_jw$1Nk-Q(QR@~d`)e)O9H%X+@>^lc*W$Q3Re_T1F`&OLHR^%s@82kZKYx$6tb{R0waZR%s4Y zz;VnJ<7QU=9FK1 zDz)0^)B~Wj0t<}2i>;K(=b~^&ns=^=rTl08UoSJ6(8lg?ZNjzZKhLnv_DXZC&YoVV z_5K#Cm5+E}(P(2;+=-#zH;+r6-tPB%GM}WLkAPOi4(Wjbhj*PD%)HVGch4zaIY3&Q;eS}%-ZJZO(et3Q;#I0fI7cElvWKQJfk}MxjScxQXKMvS=`%XEN%EBItLS$l0j3R)N=(8fyW?1J03#LlM5VPm1zemfHukudmfqF1VK=UzTWsyG0$+9npFVmpd>b9BxL9zdZ!)$5@%``nrojmdczhIBnzue3scls6Ulv zZOx%z5tpn~Y1$TBTZDjI4Tq1CF0fv)4*FGi(#P^l&cQEFH@ND4H5wU!c-N23eucGC z7KM^;{VAG(L@B#`re2BC_GB5kb*{w123M;JJ!@sVI0|*sfcOM2qI2ZBk&4NGLSqCd zm;EJb-fk!0dV)Vf`-L?j`Amz9-9zXhj#XWXyRVGKSUKY%boaF=G6wLuNRITEU|c0) z|Bxw55AK4yX^+lK7Pf;3APLuN{2QD(fLOO#b%Us7S4Fs~XoTzhSK)L!WZ zmKOZex-C|-0U-kYk@Xx3BUGO7m$<26Da=tU@)&84dy29%2cAuwRz^#pSJ7j3eU!nj zyqtklzVgz7DavHUkxq>=gzGNtht-c;ttyM}c0=g`e7trKo6?3F3_yd^ zOP%E*vC;2ef(VMo^-`)X3K=f^ku!=l=qo`C-Jq6l=gdes7&VDh#@Jb4l8;jzzr_wd zL5Nrk+pfqk(~J6qMo{jialZAly$HshO`Tsa^TcV+bRJqaLf~qZr8h+=$3PSEt1>Xx z4?l;h6sKS-tw`u1{~+|eo48&Q5S)9L{MeL`LNP*HLYvQ3b>?S&v9)x7Oa8bvDyOzF zm4&XGLz84?|Fj5DI!~{KTTp4}DuliJb=z%|8Y~?AYeL$<;#GNohRUW2DR|aw>$@ljgwM~S4G6hF&@^OmJ zAz6ay=hkFRS({6x9=|3nL+TVN9jWo?2sr}H>FUuulwkuFc7Y{ng2$tHi-@||9zAiW zrb~kLrdK+r2~BcmA`RZ(Ti(o9AV99V1k=~Rbp(7YP*|EjA_lBtB3biK%5s)GB{nCp z|EqAmQ_iPc6t7Yv!WFx!Q+e*?#7Vz|FmsHr2q5}S09MO0;Z=H$aJ{CW)3iutte&{wPn#13#=Wp7upG4s0vBb+TIB^+QqYMbJy_p7d z8vW`#P+gYoh-4H4qXqO3;-bf2J^6 zoTfpm5ZrCr`N2IGrT$hA^y!cBW$nSAIkBk@p)S9Z0DK_ zZ)4{Q5ZWR`d4*CAJ_8)Jw{gAvAECl``w+Ibft&Xdr}Y!@iHz}v{r2bmp}upcQIBu# zw2MInTlr^xNaAy(fd-#OAXiqQRCDE1_J?FMJ>B@Me%3k#x$Wx zdiPzxVtN6h5hr3(hlNMziJe?B-ks>2qmR+{pQ6&M(?bG6K0&aa!REfIm5gXzj!w_hujm%$+CFu?AHA!q%d`y{R61eW`VyXqSpRht2vZ zud{op!Q3n}1{r%EV*L8Rd9R=&;YJ^fhuwf;|FcGE7W@}hLOoKr)bnMKI5);Y`a8p~ zF-?a0`yg~;)zV0XG`uTg}C3#xK&Ww4-;9O5JLc84g`|E?F- z=#^eS?1Ey6O*z!~L*}8vvyS)oF7UF%LHo`CYxx6m*x}u-z?s@~p#tyVp8W8{HKkQw zJ)f7@4;?&3hN2CXz$bkk|gWp zjFg#Z3F3h}7-aGpy8QudxcfT-{182Op7BhKW}!@!CKraV|BR#nm-#A=_B+>PZx`CI zxIix#)z^oDWqYO5?^d8DZsShe0MGy1dH%#P3rykR^9ZNAX*Ahfll1&FQQAlem(1+t z(A=sq!liSl9HlJorX-=!MXglZd&rg@@d(xER$ipWXFNyPe~yNlFb^d04C_bg(Eaqs z#!O1+Eu6ihCZzPqjuzJY>!l>&0u)WJLml58dIxl9v6kfSP99`QF#}@C28k#(q|&r$ zU|nxzgY(dNTrYMI}kr=cNMx`U&o*hg;Id?zz<3&eeQmykio@1~d{hXO2I zVR=Eys`%a@g0~xOXts8c!X!E(iqoeZJyJu4Y?G3 zQG%^S`jqJ?ABgQ%E<I`b|_!%R_RAet(pYOM=K-H2gG>1XT6gqkoe=1 zmo5~3hAr4pF&4Lmea{_W2ERNew7e;&H?av9@2r}eY?Sk^*J$se5c8}4Niz)jR`huY zt;hKT>tPSh+2trT1r=__bmq;Y$yd|pDi_&H$4>y!l&JiD*?*Vuyy+mp&}LJIKzn5^ z`{;(g$b)@Z`4?~bLsB7=nB>rt!3)7fuA0#67l#Nm;|jvP(#P+;2*0@_M@HW0UHU{+W-cN}1+wycJAEPaqh0=dqi$c%TIyUxlft`M4HF(4 z_o`(VKzI}|(diEYP3cW0;n}x0DZ!QdDougO{!%x5VT0Nd9O9`zs(Cyz9ZWU%kx$-J zYSo@INwKEOnkB))YxnEzQRDEhsG=v*9Dfc!Hx{hH85X#3v=AHp9GP!@l4~dQ1y(iK zRR64Dcd>9@5lOu1^@eN^A(YNYDGe;bU5vnw&r6-`Pz7mX-`Y>qmCJ2uRIgW@VvPN} zXIiGQYt@c<;OdN4mbY2IBg{wNq_x`{v>0#9lUGhoBj(lCUllhGK(?|0m&G=}SCuNw z>9gdRA%`99PyCVDs;P-6iGeC&zE~9>alV3ueKnE#s3v;ERO)&SO~HO; ztjK*{C&)g_46y4Ba(O?;*fMgq9ZX4F_eP5e4he@~8<9o`SOty zJk}B`{izYvdnsIGt;!j#7yTOO(^rp?X?(&k~9*H*wTIpxz0N@Rbq#?=rJR*7-+B?(`@^f@ec*@l-EY0A6m8 z(tJY!60`i6qTsdA|+{Pt^$kiMN;PZzz_C|E?~B;t?Mqt|2j zf{;r;MaW63%5fW)!+d3&XRF{hxhB=4f{ahz=g-KFS%SdbBoS3Br-6!0^}#4yQ*hY* z^ykLQEhT2bo~a8MRxXIf)sw0*0scX0fV&PmNj2F(owX#+|K)E;~12c*PZ(Gz= zmdmKXRZ@rU&z;wuCD5jFW2@U7;lH#X(xox61}!K-%)-s`9ESM=es9Usq-|wi#>sGx zFPFvsiA8PM)O*zv!j#w_LF^Q!NDg_QMof5CWClFB=Jme4{y2ZlZ+3r+7bi>@X2yYv zS8lap>pAP`)i%|ANt?8)JQMXkZw7fQ`^(zqz;nb5_??rRU++U|o~zTOvP7QKycxE` z>wf|t8@%P)8gpNCdfHC6xEKc8cFAj4zd>yaXPF6tOUgJ0Nri+bIg>P)&%rUVG3`tj z^!@WJo4DQ{vHhws=xw&id{H5dY23=;1v0_kpZ*+OyRwx2&N2=2L?P3(QSahqmKpp! zVMAy2ueasO@nyDLHCUjG;TyP_+C`0+cE@HRl4b7*0lhcm;<( zwn;*G2Jq^XEgRSq!>!E|u0>YkC#E{3*c65KwBD>f)D2)@K=w&sP7`8#AJhEUl2iaf zm6+=HHEpjJ%K({$XyOYe-?cMNl?y4zZbs}=7|RWltJLvo0_(}!Nc`CSCEL1@5_E-m z)!0GVIvyuQMA%|9-M>xf;XKS5^_GHJ4$Qr+eaAzqQiH2iDKg|rNr~kpsVj5$<%p^O z-~K(X;$??|1c(&CnLLycamZ;@6`d14Z!ADeWjK_gB@iAQA7ruXCi90$H!G>&sYCCP zOPpJ6?AWc`l`qNZpd}~)6@-XJd^q#ND8_e;$GTYmxg2q>U7Hlf!obu<@nzw%u#;Jy zK(OQh)+g9=S!;%`EYlKuU5;3sQp6bfvju%9sHeyHE}Z^cl_E#X8%D26vWT6c%W(sO zf_jR;SZ?Rj`H+K-TRE-1&Ba%zK@-T!vW_js7@am)dBM!imm{8$Vf(PU+py~i11|ac zXNjptYL#Y>Z~eO|$rdilzV|->-bbkNCRfY?q$n32(-wN zrOOU5^wbm%ZV5 zTRSm_*lpcs@84u&KA<0q=08>2_%w9qY zBabjm1j02xZ|+&uloUT_Qj}}sdWMl7N1%K_OUUn6jW^Xxa`u2*spTXw^Opq5pFb;~ zn}>!awic!*5#dI7J)y4=zO@=zM)X6Y#jmy^`OMLNV&c%sS(`|BvU5*Q``<5NskETqx?*6yi;vff8#$?j@N>j*lOJ!oC9hb5hYK!MtIKKE%{AL zajfgG&XM%vN3r$keY_r~!vm4FzPV!05cYMUXnm{3#?$ZcaKtJxFYqbS9a-V(>OOho zV?!kOsvbpu7WeqYnaMT~uNTzHV>c>p;T#+*6vhN|L?$h#r%xYdXtrNk5gSWn_^_f_ z#v~X2EWgi???LzEr|YLd1o}N1-6TygHNPjTkslko`JR~Y#j-hK&#F8{fgGB%!XpA6 zmJ?6a|JjO|P<-@&rxc;fk7wk&aCq(dQC+F|@^60UZ}lQk?F99zzyAIbMPl!v(|P0W zzXocyPV>ESf9)zL z-sjX38OJ(MKScga##X20J z%l0pZd>}~Je5V$`?RIr|*Wv2(Z=N->&%o17TtnEQ*ky9e%8<50(NlzC>OD-WB3NAM zCXr{*G^{J2d{hk`B}-nZX=rN|y5}6yCGDwLiF2^=KkkN5UXPQFYm9B`=83+wItV|{ zy`ahVB&ql*O`mpXa23*~Q&T3&U!DqnCPW@ScCrqnWBfqM=VNgueJR-%J8%nY_@X(M zI@0;2Ue2$7TmUcC69DoNVh=eaxJOOhJjyhMc_Ma`j+L3sY5(Q@m{N6$(e58Sst|sP z^$dU$He)!1d`>;y2FPpaGU4^LCQQipf)k-r!n2O0KwjNE2Fk zwu`chEIKi4eb{?3X9l8!YmV3$4xWOaG5C1zRv~;_h;RYD#PUUMk$$b>ggf0IVmz~f zw$hgWMV1sxMn(1W6&eR1v#f^I+XtUVqb(C+Jw)(wFd8la8FK718FnCvn{xP2#Vt$- zI_F^rLK3}&^xv0dmKS;KvX_746_8>0PXUtTR7DPyenkX88RuApGbt2d0gR;GcW?7 zVg6NYrK!P08(L~yjFB&SX-r2|(edq)It@#6x}!o%`?rQJmz2DKVHQWvn*lhk15scR zSJ?9v9s$ZwsX5G6r<_vTuHr$o>xirhk+lq_z~!MsvY|A!PKIp{a!T#rkuQ2*KRx>x zSvbzY5{HS}tJA)RSv9@VO5d*292yj$iGsNK1YJ)1vV8h!CYdGiB#x- zzzFgM_1ASxXi7V^+W6BoFmp{-Af`zhkWMintjX9R_AVJ%j;tO(+mKS-ejcaE5g3n? z_Wnv{9_V_#TMdmjJrY5J}z7THc~_v@H;C%m5ttEm(|% zn00X__J@zTo+hE}c`-37O83za*jvTS_Z{m20KUa!*WZk)vqsYj=HS2@?L zKNUy3NdEKtTO?C&%6^#zBeX>y9CU}2C&X#vpO=OGn>q1ksR<`&olqy1;E(6R7a7mknc$fnby z1<}dcM?xT(>!d19+h+sWVq6k%xuw?98VH?AL~>_H?~aHMHK`$wS;X1j3r)n?r-;)d zcg%fduO_5-8AUkThDvXiEC+{gccNKq;JPn>H$F8Y_CN%mE29ZH=zLuK zmf#OPUOEPIgG^dYJMF$%T;ba#`Wi?@-g|fhYdAQL{vnJvmdWNpNFufX>wXU{Ep?5do1i%Z=)DaZK2B{*4ge>f6&#Z7#qccfi z9GeATakn-Cj0gMc5WV`pcfWd#7&qJv8>443Y`5b^&qH3kQ5uA6>bG|kF27KHpvd5S zPdkfG6MBQR0?62nluu+@_Rawrh^9EzZ99I%!uMb!z{&1!U`h&N5x0M3(uy&*-I#g_ zMbW)%5Ys=R0Qb%C3qIThDshbc3R_deXysD`Xdm=L1f+7?!&#?+4&Q!)9R5B9;jhoi zFN5hJ$QpeI7<&jQ0mzYXe_zZ^qUbS+`i8-6oi_k>hljz8xNpzp4l%~wM@s^-$xEp1 zk#4QG00u&=`ht_iM5hZfjGMo2_0@${8Qn?*H{dv0K9CK5nB&1-e6DdT^c|SG-y)f1 z!?XRv$`%Xium0tkSb9F-@RtDnNsusDu%EvIo4`G6s$76(@p~+t?n)aWLrdu78(P93 z#wf^b`A-!Kn=+SM`_y$jxwwiDAjNN7{E(Az<_`8pw8D-@Jsj@?R;?*OB2up=$_y?Gg8A0 zKSDJxsmwMXT`wBWNeOO?t!qF~)=vj~JxJ?QHQ=a4mM3!e44_FoznUn=7w%p_v9F9u z+b{e&MAmApLw%Bstp?Dr32@S+d2&?}w4M%ZtS`j<|*uGjO2;vwWSYSu+A5bkQf8Grx?e{#@&k#dspnPMc zAvdu6E{^Cuc;h+dbwt%T@Mfpv7^w2J^=oM#VI01h;41Qy?@r%YOqDr0O}?K4v}j!Q0FUohWFGUrUm;U zKGCs>J_B*ONrZ#^mLj>(f-abA(g$m^T$s*-4k_Q0T^?^Jv14AIIzISRlooQ4ee#70 z54gdfK>el%0asMwVbPcxqrsHXFO%GOas^B4^O>ZeNj>lSsF$5JI?~|n$T$kH8d)d>no5uGE zD`6}u%U`Ve%;{6Zeb7N5h+^7NsQWVi>I867>Gx3v$VJW;WRskxZKZ2!}3LEL$IZ`s|`eCJn+cdy^Q{$0Xbn7uVG4iMDJy_G(pn zxeXSu)JZ=Iz5Yi96)l~AU}rcpFE+jC|8`(u_7>l&GnK2R(}|@B3;PbbuGs}dH~>H% z^B5`eS&>pg5?m5tHX_n;WA~QXVBv4z80Q3d^yhx~A*iM~UV(|`w!RH88nDD}5b7zh zc;OlS>+{G$3D9Mop!v%K%+DP~3E3f{32ioru0{dkOmK!a_Sd3WVk}Vn;BeE&4C70mq|N7<6o!EM zrk=7|4d@bW=UyTojLwOvqMNWoj|*P-`M=a4b_@tx_H@PLdiLB$OaLg)2sVs=8tyP&Y*j3+kg zAdvNwi^rI?&%n9Av&U0Au5|j+DxjEn+>?$-b%J3XxLNpsLX_~|^e`rDM=8GB;c3Sl zK(o$}BEZSS@exX&^kOQ}9V!3{2o|6TRZ))HEqvoOy!=saL0Br}0)pZR#8y)S04Xyd z4h}vGjBmqhnlf1Q#d5^sTe#jb;1JG#d0ym~9hrx!9y#w1VT_WD1cMysoFu=k6e`AiKH}M$*NNkjleavq95PJ zNeh14nt>j!p(#MS{o`at;*40q0v5Jr73`e*;ajZ{ORw?f8jWc?HnafBnCifJ%K396 zX5}&GpV!~5UcZP(t3vAg#pFy7?mBwwuxrHd*i#MHnc^3W!YQXINH+BbL@Kd;~*JxcspI~_X zd$JGm&n=wH3M;7ogv}$5i5 zoU?@=pSyo2*vUXVz=9lAd|$p~ntn*J*OsLl#lH>!NMpPtI~E>_n1u!2aP+oI6cVdmH4VfiZwU&E1J= ziSs~7s4M}HNC(!K6SI!NZP`$`DN@)m5p&tb2h{oV^WTOcDC$A=$GRJTv*B1!p$6aW zMf5$(M*c&BI+qjDfwBvnhm{GIqQQaCBCH&4@jFsiKjcdwwJTV)5=&;=U((}hLWipp z;yVvNrh2a+=P$2_%&sTjghMpmrbRB?%J4nKymhg6NwVZ$1T@6Hu2wYsT^^=>ouGsi zUy75+_Pmg+IGuqycr(KfNzwheBwO;k(}&%?winKErzZhy{Gq|YUw@D0UX3qdM+K*K zao&N(&8)g*>ppnGs=%)sIXyzKgxkU%hZL;{>F8g8y8EO~-s#V9e$%E2>$SBOlzy34 zgF9tgBK&H+E&r8SwC>8AUy_x`PU@F(zf&{KRS}m#7G?cwYpp1q9@K%q<~0R&!X1p+ zff=o{=dSo%JA0I~z8Sq1T>N>}s;F!n(zV`*Joq=mqH*M1dnN}gely0=yg!N*d*V*l zB2TLV;k;_dyZsf{GlI-m=Rq-da2e(z9|k*_*Vd{dTbwqP(&`wS)zDXPEL^WI3InRz zZ%4OIISI4Yq7%Q)x3v;W%56i59;wyw4%7h&zxOyVzM9v5j28j96PE%i6lo^!!Xza^ zd?nbjUneS^`&FpX?la}#N;y9o#bbz5zQ;VWN=peC*P7q=jTw<0q@y|?>GfCe^(Jgf6QRp?s8?bW|N0)Aq% z11t2TEjkppWq0y;{!oUG$AhEURQD67?ny1=;Wu?N-D2j} zgzadrX*RP_7mpn1Gi6z_4t$M?zfmH}XgBMuJ-nia4yn*u zrZnXTs-T*TAAgUKf&6^T*`Ub z7)PD%SNsZqc0OkW zB;J2L!e$5$@oT5_37*u+@gTYtsWHiIe5E#pZ-}k-@r}a#PZ-+gHoj4_K5Nq88NMVr;zErqoBt;&+(3g*I|tw^M2C?w&9g@T-q;Gi06PYqkk&@`e{Nb0| z9;7Pn$6&$Wa!*oYQJF|xZ|sI}>c9c;T9!r?2YI?VjrL+Trl%FPDp6^)0~K~20q;T; zzg2<y8YM+Q_I1A*{@?I} zb!KPo+;i?Z=id7~=LkV+%Hu+?Al?D~daUZ+F6)tyhr>1Mf1gSJfBwHS2&BREnKSrr zCg4{S_|^0G3Dg2USykLUx!MK)gQ$^{L7P6tPEe{6N#J8c)}~C27HZICe%-RaTr=uK zp_}yg__cz}@5D`G8_xfwpIk2!`PWj)0kwVF?bgic1wIDxy+>qHCSKEA_Go%w$ShhM zr8-p|m3wv@ZL(}Pm$G|iTRSN(Y@kQzdi%vvEthttSnUBG8b;PKVIC#IDNkBMw8Z%G zBQK|WlEFw-4qlrww?;X%zne!btAamKU(O3 z&fHzDc4K=kO!Jq&+F~AEOsEexPrYnqX%YLo=UN|YjU@j(oy2&)1J{~Q!pGtdPpjdi z)xs-GU=X4uNf~L_5?Ui)+Nm2N!RfARO|&pGHnp-cH8vX-V7-u#aY3+mwMcR8vO-p3 zCXX@u3j!bINg4RMGgJD1qGiw3n!a^oR%NP`|-)ImGL~ z@E%B6mXz0oi60fJCTfL?qEOfP$2H@gV-I{RS3-ySbB|L~CWK7TY0_)=d{|WOy zLBBzRadr6``DH}h=%+FU$35|4CcMiHy@6%9n%8Fj=jmK_$KAROBbl|-jCWrDk)V`R z;P`*TahzOAPGh`H;pEc9jVx3xru|D`PubLcxmu zreX{7o%0W}ANP`(UonCGwzp7VFlAZ3^eUTc^4>t6fPn-(usBm1RVA2~=4+^T&d*=z zQE^HrMz3P`hST&JC~k{xMpZEkRTCL|3JFp?x81JZ*|VdUVi><$*P6`dB!)$m~@WW#_^?`N8}v;yN#PpeNxCh=F_A6RkfiBT;eU{gYhvC}_QXWQ*!v8kAy zZ=cxZL0l7Zp|kX;oJ6dS5eS%$SGNKOgh0C*m7GAS2nzx8*01Iyt8EKVvLHMzIqH7r z{H0K`m2Gtfsvwh0REy})d=$wBB}@30Fg{7l_4>tm*c2PSE%)vGJR2*|?ox#GjL!+F zhz`-KjFKyFPj{C=|LE6+|7CZWZTrVy|MP>9o{vpZ&}x?=m6|Diy9kCjAu|-Tjv@`NG~OVZSIV(F7i_ zQ`pL5W)Ib!LVx>q{?CR<%K%>>q0wBJFJJnp(AjP$IgfWu)kx`&@)k~fs}jJx#94lE zQ5AXg^4Mx*Mx^t z!alZ`nW{8@YqQ3-92qe;_uY7sNR^;@k-WHwOvJECy`vAZ*JZ@3t*CmA<>^17P1;wO zQ5`sY)P20G8%@P=*I4cRxk$+3XD?K)AzVvg*hhvqnLk}`WV<{G+kd4Zec*y2tBu+b zm1u|YpjTY)%TwPSM%TXbF1lBSDqFPep5}_7_EFs9a(@f4acl+8(;^y#cc@93fq}#D zkC|ege20g4$|IsI(Z=w~EE%G{PZYH&pGXxl_|vZJ{&^lsR+`~By;54J0)7!zPuggr zzpzRSg215jfN&P-dGprSUk+XN$Ch|HA;&GVq~hT-baz23wVmy*yFA+=PHa{h-Ost= zQoPW+qH*?fwdaGno08230;rwhw+el0vh8fMzI?e3zgsdl=ldsd$;{k2lPX#8@hNZl zok>>*F-kCRGtG4TyVN9SW@`Dh_4MT9UKbus<<(wdIHM!rTCT%t)^u^ax8ry8BjNl` z`0-o|p1PzfYrbd~SJD%U(NK~IZj`6-Ul;TFS~&pgi*mLdprI{YZu9IWRY|(-O7q$v zH79}gnvAH?v7WWgnoIC@j;E``rLpxI>1Zk@L4$Hp5 z$_+FW?~@1X8Xa5eC6*TcZfDw~SwrTQNI7-b#|zYRoxj#sF&wXY9$!4#m0aGHpA5U` zJEN^GFd7lkHhU5Lt7YmqjfwAb>yVD)z3^y|b!UXi$vJ%LI<(h@w()ONsW}6uQtUAU^fYN=DFn0FUNtq`pydx^5_?=&y+ATZ(eOmj9ZVxfoI(MIj1^DbZlN$c$?Og5olw)#r3 z;opR)`~m7Kx>Cd64(1&vRET37itetu*0#P_V^a%-1|9*pU;Qz!*(Vx;&gkb8d4&;j z$wcX2h?Q}RIOCw){&U|;JG|DrR%o+1G0(8~wgB}sS8Kh9Z!Rw9*ZR-}L}Yp|6kUAM z;(XWj4lk=QpW}>2Ms&tJKhk*|dR(84CJr5=B_>8`N=NaOz2&^wFrr&xz14OmabNGq z@nC58TA$jxDGtE?-0DdIJ5z6|3l0ONCcLnPQu1AI7_=VcoB(4mHRvPrSo0H})oRf9 z)GNEh(Qyn$+S8Yw;bS3?_C+U@_N(VF)HGIrp8i=+0tRV7@{qm&m@L*`Ya)?KK#QI? z_D9x9Pdd_mIgTO-WG@YQYF)N^nocSPrFM&PLN;&kJ(~#@D8F@h!D$+zvi~A|gxs?; zfEKbk2A@|40waSO-}o@Thmxu#k~KM9E~N6Nz`zGBNdMc-1>Z0n1V{t)z+cd!`k(+V z5Ni*Z&>#BL(pAvZ?weFoKuLP$URYgzECpUv@M;zHb87<;<4p?K!=b83A)rG&_@Y5+ z&gQwJ#ucU|9bT3$XV%#FNMv^a^cm3jm1T-xlq~P;3Y&k0tjznKw@Q@uIAtL(R%D4U~9q=m*3_uso(y?u0 zEkJL635Zc!J~zvCZYloATR&?8h`HYJRl&jyJY4AmKh!nLg+owKq4BBDzV>s77@Gu?QD@Un(7!(2*MH&|$I2u1#a2ZxAU$p2-rU8M%zB$~_*w#);Q zZr9NCTic+iLLt!&KhtIZoP9&xb$4g&$E=JwBnD^$ayO7h(vHf*d7mz zSqrGq!gYRsrErNJy0+8Ze+op=8+_4-2oFtO+$3#|>3@!LCAGkzj?R?9p`9=4zSHv< zJZgzrl>{1^;BWkr$Z_fuRajdRC6Dqh-gMY|rEyE<%osGd(zRx??gDlGb zkhJ`GqJ-c*&%*V1xU&-h=aj{JZ;@@V)^FaTuwRx?NwYNn)Ik2@& zbZ&>{%rNmGk$sj|zzlY~Vf5x18|HOHSKs{{Fc>d3j6^{1#h)%o90wwg`l7Hup#6&i zjToRy)A#qtS$p5s?dp^kvpeNAmrJ{$W@Wa;1sNW7{n+X;P;Jtov! z{Zw##UUGPZb&k5KpBRWI4TdK~e(Znx&Q7Yn{zV|KEcx(0xBfK#(7Q%l0~p3vR|g-f zA3%6@`6{jg7?S{u_bVVkhp*LE7oGU`Bt#Xid<+lM6 zsS3k>ND!?lr^=NPFy`GNJBbL=Y|YFRSwBC+u8&vAt>-xjjxlZ@rT9?Sx>kC@D>0(6 z-`NU%Q^B-UavBg(3+!I-Z>JR}=O!o!#QsA=ClE8$iud2}kf|C#!6PYqZDkB@RWcAO z^DlwD%g{V52tlbY-G5er)#t$w>#x|0L!uB7Uat3xfYYjr>(WBOw zDE!>h`*8hYPN~RqX~`gkTneaU!TTn6Edm9l)ca&UV1s2S;w4*(o3*TK2FvQj2R2N0 zi^h0XYHa&SI8Tfx`9CMkMjyyL?314IBmh)}0q3JU>x8`QCT%W(_W7C`7`&e?>O)eRkM;VW__P zjfBozq*^p(Qa&CF)_5UJ07nKSYPu`C*9j+Myp zYR2hD{Xs=9w-Zo%Hsx)}!tKx z&WD|E5o;o_WycAQ*qoPk=mX5glkK#Iw)(Ly3uMV5T#?mMVq;glICClj5I2wj2iVPX zb)&*gsQ(KOvTyxEAPziRGBw`#!sQxmC8qYx0v3ebI4^5+nS?B`k$>ycNg1s zLARZCUIVQ7<5D&#{G`tbjzqY;g3LV+N_PzE19R$EjHK;xu31w0mts8+07>y%{;jd&!V>oWJDZXc4=?PdD-+P>cM>)YlB1@{ zNg0B@_j4aw+!w!6iY3vkay<_-XFDEs$Iss9T@>ZOEM*?Y?{p)|L8CNq>%+mqcc*b& z$s1k7;Uw3d-w%|kei2(Wktth&_gZIG&jE$W2o;(%*3`fcp9^m2p@9V%Q@6J@*QE|O z+AkZgnwq3@(f$1oNqh7XTy#+aAIY09Z{YXESh5f6DF?3$g@>pT=JaRcXGTj$bI0vF zr()p8KM!0yFL<#$J^&_!k~lnWy+R><7D#O|{gq_(A4YDP6@`dq3LKf3c0DE_7_-G% z4DSeQ;^KPn#vA8UlK-sh`AgzpjNP3)Uf0N5M&z+Jx;pU@A&r0|Vj1Sc4Z6#hLT4#L z8+6nLXV3PrqGLrQuI&-(zg0AOG7)$^>7J#k~ zQ%rlX^zh9uvf#XHdW2$l&5X}IWb2I!Litrn+O zqRZ?18i)SMGXr7W2zH_jl z5aKCxh8l_KC&XS%hO`|*3V*_mdlBn8{)e%4Qy>!mnff=sy{$@-5$1tq^wpRs4D;mu zZ6svNmN?4RO1Wb#h}@~Zqp2(2Sb<*vfNDH;>xLE_TH;4oRz8;)x;J|sKNZ-ooz^D5 zs!*yyN_dS6;}huReEvqU7UBskl-J{K&mwShrDn!`O2NhCpYL%TnQ%nM1r;#A_%QvW zU!_a1XQDSqy|R>=04K&(cW^~~8?15pahC8ea{TFx&w)Om-*p2JLDD%-6M6R*m|`dy zJMo`o0(0l9c%(p=T`iJ&xJ6&m*oK}pDMZC8d0#z7@JW(REmH7FT96vj_9aEB8ZzJ_ z1fH;@>FA&_>S|seSeT;U`-mUu<2jsXr2K)MOhBq!wH8SeJ6pN2^cp>Jv4(VbxWXN{ zbda7lwl5qks`2I)8CQPwxy5WvPv;mpnyk*gFq*7gaqcj-YjEtK;$V2psd7;v-!9Qz zyYOz4K6$G4Qu$wtnZLz#IB=hE3&HJE3S81K*xl=vW(TriBqKNFufq9~tEW$9B(spS zD2yr7jzY*=w`>8VEjDs|1U`SahfElEAd6akM@{7ykMtQ(mUb0ATvk=2{z3K=nRR}4 zeS>_RR#~)|_u3Ofh3?-|5`k}$deoa0iT6=ioEa6yG1d4jC6A3 zW&S*l$r`f#!dwvz4%$r^Xv2HI}6; zeHQX#*LlbMrP(r7rzGUlB!YK_NX0_sB;5+cyDzC<5wC?mO0*)^+&bCrk;y5~H9u^b ziydaWs>b$a#?Fay|4S1#w-BNEq!-K{_|4xxk!Sp0fDli$cAe8#1Ia(OXbZK42FeAq zU6SsLheky+vIpOu-!eiUJsYq1OBil0a+dJh7R_&FQt9t|QL&q3mjA{bH5m0P5O8Ku z?NF=Sm1GR0kA#X?`N9EP>IoVOQ4pO)oy39y>Q;?4b0!L`fXH91G+f20IF%MXla@~A zhco6!qruEU^8$nlbF|hwvX?IOh>}EO3_aW1B86HsK65T1_ibcX?H1AZfNI~@0|`ev zt3xP}>Y@|pZ#H#kll`nvZy$e#P9)RQE1cigdd^UdFE4qLspvNgHo?7_YvQcw$rJLw z42GnnnMC2Sh&088r z6#AY!sK9XbDkCthlmdTKq&3q)oy;RQIrEvMr0lfb{=mWALI;;v&}WTu^k3#lZslNU zHK-(yMutp1$iwYXaWVL}#YvOZ* z+-&gLi0T;)KY8KU0Wnwnq~6J=t|S}2FWV1c(!h^>Me6AH<<;=Gu_fr;=jL>4(EMW3f--+ z;pCE2RwUsGM?4t}Z&PBez<)3IJP?oDP95u(AA(0^yMhG|PDo!Fq~nj!E4GY*>Z?KR z&v%R!E|j4rb!iA2;Yc(HT6XuPf~Z161cPeQ`Mows1(V@`>WVU8U1cPieP7sF|8~hqrq?|Ds z27=4;b{K{s`!`vZM8sBs#7j&p%?3rf{Nw<`~E-)fXs6QDISeaQO+UQvyE> z&|A=DI^+2*Od#2EN5q)P-6hiocCa+NP+@q40!<)95Ofm-Is`#D*7bp0p2a(?CgLIe z&m`#R#6&`J@AV)HbS>&NY#F6}vB&6x#{CWv%%ceCa zDpPkp(8j!D;ELYYq=lua{Uuh7pfchAQlhYkj&>>2iN!CTo=g;05~J6}hF+>M;X@P= zTb7RXZLWdvDX_%;a~?LCiUUw%atmgPfKQ0p2A{Ia=>it+8;t*Qx!GIHA3sd0hzt^FV~gOu^QYQs;atA z(PMgr#(hwnMCbMiQO5V5eFI}u#KH5+Iw0=RR{uDLgLllHk;C!<8=7CXBntMkxZ1^m zeb{Q*!5PLV{c)`Kk~m`d?*@PJ?S+HVl#z!qJIU4Kz3DRw)ir=MjKHxtQAU$Zr4SxG zqrhy|ds&*I?x8O`PraRTyTPC7hW(N$zGNlynPIzud>rDra7=j2C3DnFnaGI31vfMG9%j?RS^&reh5W4Wdu~1$zjYL=>|yeI_Azg%G8U-vxX}4go{iBQ=o6 z^2yJ+2glTK{0@J3lnmGfskEg>0nYUGZlIGVAo{a)91cxViZK>#M>EQo$19}_^d9|b9Lv6ct$|= zX!aHRIM~g#!v=BgMLAlzyI0rY7(zBe@^vj5L?3Eqj~I$kQPgOXa19oi$bP3@ z-6v`!sHoAh)9~s}Cg$Z3A>bW2{zG%_s`(U|?d;7cUy~7infCE9JGkETcw}-It}Kv< zO;by`344W^SONv{W~T7=r?d3G(_@?)kC#n3^+JYjTRHlpAPqGOxEyn)9MG>H2U##+ zm~V94{$pm7v!!-Gbs9@eg(C=J=YTNSa#BxXAon{WgW#VqHh;1o+9Z}R#-%0KPzGLK zvnBrsF{>}m7(T+~U9}R9H&NSM!z8f?yWs3}mE08&%{tTZ(4H87Qkn1(!(4}!LzVcU z(hy}5{LJ$h&e$L=9-d$Zln^CmG$YstBb>|dUj8}x$L!7F>`)Sf%N`B&mOZ4Iz{FjI z%4);rF3v3IA>RN7&ug!+w7 zFyC5%-7hsXy1oeC@lM>7CsM4Y59gFp#%84_HZLodKD0Nl=pKL;u|yH2e#>FLdsVsT zJzEGJeG)MXEPQ?gX50i!$`lgM6Ke2ge&7jjOY}GXrqI75T9VIVYITb!|4oSOdS64Q zxYfe9K$i_d5n-42I7!kdrWR=?4%w9ixO~~+fElN2>Vyw0YG9c8mD=Tyy zAr)=Cm21q}-)N?HT5~lRuHt~<&TzhZ>(xG(Kr=)R2{OQ>m(Ck-lbrFXe*|PUBx*^y z18Puu?0ud_tAfp~QTI34jYGyA+kU5F_a><$hM}I+KnhBUDZoZ@6|-p=#!WUCua#ue z6Mp(i9+LhV3cAa%a3Q+CKWiN;-sGausYh%~W+@2HyPKov4Gs7y zg3kXodBEoH#lx!M4u5$Y0F=_pP4ahG-j8FFcqS}Rx3)1&gp2?&H#>gfQBchO9;%@# zj)3|g!aHIhk;BE+CAeEC))82Xp}{)kGRdN8jIRCdaWM;cIb_Z^`0+|mD*aU_KgW=3 zf0_9*H|0Yi^LK9T_9B$NOzPdPSTL~8MU)Wjq%K9T(gPEE`bN5Jr(u|!UtC-`Wqt<; z7*6bULPXNV)R+_$qU6CfO>gN=CpH+wAsF(*ZGTZtSR$3ui2z7UF7#I^__o?B%VO+BEUqKwWp~=#9NWwKylfibIo?ALX!lU+u zJ=U=AdSJPyr)uprzT1A4QuhG*G<`0PacH<)NrFk$Fb=VJ=T?s11Wsp9YtNdau?b~M zeck7p7-RA;J%8(Z91?6*bNBv+S)h-I%>ID;i)i@96Vce0v0Bg(z4hQ0!=n%PMT2&6 zm~XiRaxc^6cvehFh9lp#gS6cDm)p51WnaQYHoRpht50*0Os7D;r^AVP4Uu_!~)GY>Dj!aM8TgzrZ#W z1GpvuB0_9#j;YX^sf#^8liWPl0HEvapGpg%Kz@^4Fh_E$#?(gon1j6HN9zv!RXXTu z1@MkvE)(bOAm<;5!rx|m3y!RDf1&595LGf^D4_8LPY3vucQVE!}ijNAZAu)QU|nGe7$l3wD2Ao1zD5e9OR0k7f!_M$Ta(P439 zm$Kpp;4%y^awal**lJBVz9|YGA%z3U)Kj=HfP1wNV;%s>CB3>p4gfcJbmBGuTw_vS z84duQQ6Y(Vo&?gQz=LPTyya*ZuOq^8X{o~-~l)56iGazM#0Fva)( z7!~2>?mI7vGLfruhFk#b^gf%kF6qO6J5IYjO|+GjDa8}Wr^mH<((K5z(yNIIztbrI zN`Lm4ffxTnWOgL@B3a`AOn`(nsjt>$&(8H$_gL=;>Ja_%7RX4riAd!*FVorl&c9ib zWD{r~3(z2z)upD>|6b#JjhA5q=*fRd3ra>cjZukV_pkA_#VJ9kG-V;cYkd!VKm1%2 zgiIHLtjw;~I=nPj`5Bau?@QNN7YR%|Sqi^b41rwC%F+HNoe`ibYw-dl@MHKpeu2^* zFjNPDgro+N;NVP05i$@y68rb`=9_Q~IC$UpohbqCXGQhnbq(%tD_{Mxk53RA;3uzs z7i3DcfRg?9yzK<&v1avm3od2=fo}LQ&pfr?({x|)bxuvQIU#)qaGqBS9tprm#LUVn zUxF_2_2n)^}J z2e=zwx*A_1&)CU$%X&NI!hH5O0Nf6Kn&mNc5bgR48Nl0Uqz(9(!cpg^4w)9oM%IMR z4(R(?L8Wv|GXH)npI3u0S#p*wwgG{0CM(8ZS zymvE*Y|Ft;LICcKchw$nh6W1Qi5HMGa9`o21`uoQsRiGF;9#mlIeNG&etnGe6DNBN z@TVqC&hfo~wk5rvVF3228+rnep^aIa#zf$m)aU4v9&a*46PR?6vuJJ)DCJ}Edg8mb z-0RtqA0SLwctv%y;&+A)aOR`Ojfnk#VV^z_ANJ!%NQa(2X#lfEW)Ob@{vvOZfgyT> zhB%eZOk00Hf$U#hgE83+0k)Bl<^BAfRTf~s5*r#28?Jf{7jiI9CFtNXtakLbounIZ zMmgmt64mxnnKR^-ANrjgz}(^hU-6wQ9vUV_C;6?IuXuij#7`$rmgJ zhUq{|bBU8!L~Xs5upFbueH?%C1YjEP$BtH#3hFCT(nubQf?@1e6?Hp1(1{`M%^Gz; z%`x?q2sq`iqALOSCtJeKI0TqfB zeT1vV(K~z#4Qyct8~J5rbTbCX|0)(+QFWY9fWbhT5a+EQY1rmX%Hs2v-p@T{ZL$xE z_dr${-wU|#~0S`<{9Sz>fOxt+&BMm8Lo16-@8I9FmRz?s>We z!k=Jg=~qVte@?uAU{kDs!NVz#gkx?LFna$$$VHCmPUC|N{d#i7<~L-&&n*}LJ7kr1 z;(&|aQ|JFoh8)nnV0_4w5&DOuzAPY2oV`WP0-@R)xX}v}KS+N)XcsZF*0P|&fMix^Iq=kV#O4xUmN#DYz~2{9@G2I-gVsBQ4#cn3 zP6XkdKkh-2R}=_4wohs<@ z3C=nR(KIb3XdzpE^aYgEop|5A7X+r>DNK2SbMlj;qX6$yb@+eIAqyc3t}LL`EBF4L zQ9#m6eXYMfF^x9u?duKWMj2tA5Lc(mABPfvz}F z@-w8~2JGmARC`L&iR5ZZdnO)ye;0_Cw0Q>=U49_}A4G<|1eDXp=E@a=fob|>=B9UG zh__SQ#y3iD2R&~=Kx(vt)S!T83=xMFGKUkOY$4v_QcB3Qt99)!(X<(2olo3lOELld znXSEz)KB||6fXii%xU8gn9Hp>S+avm+}2B@QW9?pN$=ke;tCKa;a@WNmj1%x=l0*9 zj7{`Nm895B^caGhQu@U|=A&s(Ha3^vZm#n%8>yS3@h7g2H8USCx#0Re%t;g>VPAEV zOEYOq-q73RV*KP;F+S@N4n|Nw;P~D5zDalnhq`4p3&KX=A=JqTIrk4QF&{WfYlpbHm7qZ8 zbp#p*hTyrwQ(|zexZEX~Ud3esDfkA9Ur+$aD%JfrUX22hp;*6?Pl%38!O$`Ru(|U_3$P&#$6h-nixw5jPIcR; z(7eg;O%n;n=Oeu#@7D8O)v`z*JKgnmI^Zv&lKu=z`k+KjZ8q$4k!NR|W;9mndbkSHUR=*JI({s$bkLQAX^s z_%L9d+Ttq^>!SeJcw@;kJ@R3+e)w4Q_flfi?|vI#`ea9z|I)uX&+klj!)EpN111id zZ+M^VJ6H&lh1rOpdb@MXvGwnXQbnkv;D4GPGjbWE$lyfevZAV{Xq-2EJ@oV5=H#ig+}ma8RIg+THTaw!tQ@wYrt zYl-=J#0@2x{xj+sEyPO))6DRclUJEgc#l4)Nb0P9+O_p1bnu;*xX?oVnvNLZ^;-OXjuQ z+?~+$KKsFR$>o7GkFtogu$~IQO7q#~vNGroZtsU1tEytt)(NHwrUl}x38XiioV<0| z)qEd?M|oR9;xp^GU*3K%|C)HZTDqQV6k+cW!#~~~(m>yNnFa-lM9khGOnwcb8&BZ& z=Y%^X$7>GB^BNk-eX@)D9>9zIXYhr1P~Mmh)^F~tCO;X~ahXO+%V@&11rQzVG(cRi zxVxc{v&;ru(x0%qTH5E4)xcQ?yHB4)v)xy3-phr+i(vl^nZO4JUy=z_Qdhv16a5{n z->Gd~rxxvWe*Xmzm6XPp`pD%SNx~ntQYjThO`tI48S%e&a2LhnA*XB76@G>eiPzef zd_~`Fie9E4_C}tmM33Z=w;rqzSHtm?A^gyu0iTZjQe2)q=9j1KErisNo=4MX?d82s zEVO1Unx-kpG#}9-Owg8g{^ejllN@01vKd&SKj{3%2+N#7_QMI--%#95#9G{j6J8f? zx@gV_sXJVuV)Rc}ahVgn+3QxtU>}zBFZq6Iz)nRqk$<`I%yjsyjpU`tnjH!r&EL3O z_)SA(b58X{?eOX8w~elWtB03RCcK4 z+viJ*l%YSNjq(wjQZi0VrAoL})k`9eT)cHszgCT>RDtC*<0`u35g__JdG4Qw* zAJHF~I7DJ?gWE4ip2ZnAqc0gMF|8$#?B8y0}8XjG^UlxYIVRD8o;O8ZitZTzCcxtA4JG~ZX&(9{$=d$ zR@WdZY}|a3XV@^RXNr}G1VCK?iZFi>CEDo z5=V2!PjodjCaAW}2=MT^a-=o9f}|djYIJ&6nVaxG?+-&Ey_~GtS8*8-L~4PEf0f4! zWS0I-HP;;N@BJ6+)%gk-FNS{qNM+}A#Q=f(6v%U$rQj3Ub`cjnR+iw?=Yp7KlpH7T z5Z)h;D7GW3ZrrH09P#pr&TpP*31QX6gu4=%#4BE*PM%Si>cz#`_j_0tbD8yjo$W$3|*sYer8(7b#{SlBpffsd6Wb2hm8c z_Has=^`ENI4fjoIXf9d??s{EKo(k5 z1p2?nbNcvU@!B~`>`WP4!I3(;=q2See~6?{4~d2C->`M%Vti$a;H3$l zJUc98toAz`gS5gAX~>A83SInvN1f z-<8y9O?}y@MQn55RpRO4<;}Q4T;J6cOWXb_>dP0^gAg}Z?85J&^p8Y*;mY_63ol~6 z6?!#JL~ZH`)9$(jB?pP3lG?b0MmW|`Vtcm{r)La5_2z;GV@Z@uR8>Z(YR#1o^7NOQ zee!+l9TIfJ9lNmt=nMTKjaCDLh=vj>J7>Mb z)ObZuToyiN_~z$wBA1j*rTdcWN9!;PVw|6Gb~67hAFb$6aMG#V21-es@~Mop4XSia z9v};8L-vuGMagvu)10P4zTbwPfTn+D^hg^+TO%6HxG>>G{{*@wJ>!e)F9lHbbj>14 z4zH{arSdSkub;uf4rGX<;l}!9hiO+HxNTN? zVP+sxekmJ74$)oN#8Uv!6@qFbJHy_dTc=SZII!hGsrVV zx5>Gr`sob6+C@Y}9s`hq*0Ha)jXjR8Zjm_jpwVqYDQ^!85^)no95;7rl$9wSx&2P^ zqw;7E7J2^Bfy5N1GBQL5jcV{%bBpw!17^uB$Y}9vN&cxL! zI118ch>l0-7X_ih9^6Hk8&x=nU~dnDRT`2oW{cy9$0Fz?zbU-9iwW8$;_c%$jVZoK z%`h7A<3}iO;u61#(LFJn;M`L1>-ZQXy%COB3D^N!>u6JC$dXGzJ!gc7mMWomjo&rij3%l< zUpTb|9-(yBqCP$6jlUYgB2RkFM^DTeWx>>oSh*@uL=O+)3p7f@gIahNZydRK_x8&* zNwKoc&6}Vvwx48fhT4H*#FUpmf|~KxLlQPaRc+D-N(aUR4&ItWqb8U1VDKXM>|_)5 zLuO$U?b#gKk2QL^ zGl)M$wBl?oQ(b76b zRp0D#4FsaB;3N9hd$LSLSzZ*v5zUuQF+g2d-v|4#C}!r0X5wv|$>hx!8hG93GLL@A z3dKbJO71=A%YuvTC1L0N5Gk1_!GZYhzX%-3Ad#~R3w@swO%n9YE__q}5x3z>SWT~K zP5? zGYLHz|C+yIV9rVgY+jc6sm)qSA@Q#ZH$#muv#GcF>S}{PRj~jREsd#__8>$PX8DzA z&f#iT$M7KXc@s@9u(yz=5WzA|%b)Tzc$~X;*wv^|NA_l+HNR(gS{Eg61cxov-qz3% zT|&t*Qkm%xTe4muQk7AB6PwcBobSUGkzV)_Y6I=v^f;$BO65W01)tFWV!5ntCr%e> zl~VrZOA?8BBJ^ZS&EYk2$t@=A{<~s5S;c|>+}tyMs#4-nj!(Z)HBpQa4W}pH9a8&& z=5tw~i=!5(pf>x5jlXWJQHZFY*k@P-+ZZRywX7y z`j;R0J(+ zSM~bPR&IAKFleTNdNIc#tZn2!^e`SZpxDO{pNIL>K`=6{Ub?wqjPUhK#;2}- zQ_Dxyn6*?S|3#m!qy{i|c+rqS6ke@Ylm`#Oo}WRu)gw)CW$(GlN2dag-baMRBZXykcaJCeCCjqMrKypp?=j(5EUFw7TuBme(vSWu5?{`wx4E8nhJd zqH5EDA|ZDDmmc&K17#TQlHN!3;B3j!UrD9sYnHVeJ_C20zfpiP-qN>6q9!2fXHFc( zBS`<{rd~-;Iew0$Opjb~bhtC)cLV0|Lo`u^35UqSCMnKx@AzRb5TTh!tv`%pRy2{8J3$k&7yV=z~O&80Gq9-v9U)F$=Gey|2j zchhf;oXmkb%~m1T45-;iFg7z)XsBy&Os{{Y_GN(th8_oV8hhESl3x0{Fa;CXKYOh! zAd%}0hwbL>i(wQC>+_-3Adq@8P+lFC{=e!RsR!)dewa0ReV$TGHj{hJ9pK*XpA)KB z%QgT=>)5qgPqz_wCo2zTuZ+wHfRydg!I=l)j*CDs%9}r^SZ|ZbXx>wDTi zKTl)$9&&S$2}YNEp?M+J!!r(y?yuABxlJu=l1ZS zuBVA7;{#X^=2>S`=0f%ir>mJK)CZ*Jb}6NNbZLHt^8O9s%@5{PIDq6#c0B>^d}Jx< zsQOT1c;(hrUbLU8)c75&RQx!dQx0IgygwhWs#<;rz}kBPu+B)D9}j>uHCLz1y{$pK zcJKDG>k!|9qn;WB9W4`>&(vv2K2;szg2PpSp8v>S8V}nB2UJYKe|wSuUb?9h;AiLo zg5J{{-{AuQoGeDjNfs73@dOHhy6dTqC(;oqzoNup_W7nSB`ZR#fByTHsiRa_+(ZQw zcWoFQtuNxGl7f|4ItiM@n9IPptzxh^Ib~!s66S;Nv9l9jzO@Gp^6OJ#?$H_zZlhih zFBjV=z;TYHmZ&A#Qq#jt01M`D<-45#dd0v2xO?>YvT7ec4H(KSL6;i52Q>O^fDspM z3BUsO_3kQ=f3PyJG&6Y%3K}*UqZFjx!zI3q_E3$*ka;V#$k1U@>l-Xq6`*SD8yE~> z+hJ3BKjH7(qF5@VSu<)vo?tq{W1mZ5LN3gEYwV2Y|H_)YGgTu0?2+ifwsu;D!cICq zMt7n-oWgQhneMr9iPa1)=^mKKaLES`faS4xEx-&OHwYE3PcPCh-A&ZgU`3h5O@qSDvx*AusnE@Pex} z14uiy{QL0q2l4*+CK9>yk;h~m)ZqPp{~@in4(XRp%{iAnGMQr<)K~=Y?;bwd)5+CG zDw%Z}>jfN5gp<^qQh@*YVw9zYXJXXBm>#Gk$T2ZZU;Z|9833CbK7+~-yTM5bRoST0^; ze2cXM7tmAljyNRp2KgShptxHQwr)f+Zm0*C5kJg&?JMX#1{hL|0sel!a&#&T7pYxc zG5@?n!{?!qv&>)FP}}M)hniKqCC76hf8UjCWo~P3Y-v5(#IxgvTd(2vX{b)Bb+D=4 zZZ-Wx-4&-|@TBr-cuGlYiC)w^9WNE{nXgU;qNMT=Mx+(29fJwua`hRC0?szujCF-k-jg8X|`82aO->@eJ~ z1f%Zu(Roz{_TWQLU+7KdL{Kb#sPZ4O+#O2vfZ3*$0#!QhUyXQg^}^HP(0@j8oZa|z zLLsO1#6Ccok%R94vG)${aeeLkc5FAcZQHip*lLW%wr$%D8oRNLrm>sG4Vq;CCZFf~ z{ul2)X6Bw*YwvxmS+lwB^STC1WWw>KW;&^YjSpeZcm)pAP%I|p+eu()=n}HCMndb-dds8b+;oTkbvk1((Dj$yq8$6noc8D+*WLu|``T46U>J7Rt(0 zueKeGw1WJ@?qg^HA_z1%X&Z;v7lZ6G$Af$KQ(b?#0Zk5aMHy$FthZ<&bBC%S4LdAvrLSoP&f<@EWpo5CzA9-(W4EexVi?FX3p8-IpG?UpDMSrwN;i%_jmKQRwX z&;DvhhRvUUKjPSj7#poqb?e@qvI4D!XT@*$dcpEDxe zB+rs18TyJMZW@e8jA3_=NbO*HdJR8#MT!mn0Rb(rgqVWlcEOPAENDSDmhouH0kB6U zMtQ5Ewz!HQbeC;1bZ5{Q&xTFNz7{r$AB8Eu;9txpoNXvnN#9E>#nE4|nAZsKj!I>8 zK2IXf;_1+&=C~bAGmv(TXedX>u6XP`EbSx#gMe&RG_lkQwg?OY8v*QjTO7VH2|?Us zsc!u?tXP8}pb>5e>O%m?l-8nYIsk(-w=F4+Zh*`0N7VBzYBG`(_4eOLCYLy`oz9D$ z+y{omTEY&3OvBq7^bbItL`s3pUz3aqQZzx04<$^Bx0msH!1gN`CSzpd4kpNl7Kg@- zrkpSbe?a%(168H0VczV{VC*FD0kCeZP{O2#vH=|VNo3eDYoi!edPBu?#2_*oM74rP zmRn`_pa;PxWuH)+a#_b6*x8Yl3aYqEpC<2si!6Fm!X!E*&+Y;gTP+d@ zZDe+GwB=Lc@O09TYJyBT0(BmH`AYR4ETDWf{$C6AWTTN->QJE2kG|NL*-8fn`Q1W- zt718J@lXRHQpl0D{5EkeYT_HvfmBFUYB@OYO7h)9V}Ied2=%b_7=O!dqNg&=3NCgm zKQ4+NWF)wAo*R2|#Ms{QDB6|HYvSNFV4UctOr64}A4YuR%fC;?2%dY*e!pu>pS;u&ieCILQhV3vy{YleTAR4wHlUIiX9x`+g3;TN@6 zjOevH1n@bSQZf0lND_Q=#=s8vl&t%jz>i@k3d2F#cpZo&%kU~fVQON5)rV7JJOOHl zaZu6AA|{wRNr@m*l7Ofs3Nt5d+xh?mjSv}`4k1}SsF{%J(C>h?D7UF7LQ*mvE5?sx z8df9zT(xTRR+^>XK%&wSW?b`G9zJ0H$tFdf5V|N>G6LP2m6fRl?iH|hZJLe>B!mF^ zvk4hF-p5F<0g_=1WeCx9&i65r6v16UL_LxMJK&I!aaZB8@HBfApA(Jdcf}*5arMU;cY!SQ0GawAp#SRBLOxlO)*x-JX8t&> zqzn^-s@S>JjX(1mK5Do>geb45^UHuIpbFg`7&E<{;5)t-*!2SUMo+x#c z`rR1fy)a&>@*eSBMAlmxqOVCVAEdjPufpZxeWxJ0%u}wh%3GZ9+m{-A|3XS%u2e(k zA-@uOuFJ?5Z^l;YPB$VuZknZr7GPdZm+vjlo3lbJJ6hou6Ntpki4TaNy#r;XsdQ44 zRtcVS)${A_$~T3Ha^`n{%mBcKo2z`5`MLut1P)5_o1X!46Z0iLWMMk%N}30fLapMN z>Y}CA{MbpR@&#%_OfEpgf>%Mg7C?mqROFRwXIY--tS4-50bsY~uoYhrMnSn0C=84E z5j+UIk{nKlp@JB#; zFHDIaYy4({zXD`p4Nq3hA}kcBkNvPIxB-&YEHJ0p7QH3qi3BnoHP1zyN~cbj0|~>W zGi3pi&zo%^(cZGMO3b|o%VnO2tc&+jwfcLrOWejgKsV4=3%AT`X6n%)0L(vI1}Q4nYKq?Pf>wx!M1~6IE!=S+2K$r^$^XoI;tn&n8zu9)gAzcJ zx6{}Hjt%;420`M$v;StF77-4mAO-?a-UB7$*vpNx)Tr*N^QZxuWV(wS&F3*|=N|{a z)F8lvng6jB9B_0T+yjs|ct4w&qf#x#S*s6NEn4Z0!fmSE>EA@u=p4!40$tApC5B`` z#Va9~BQ$RD$Y&zN{DtUc@?L~9K%Wz{J*#e^6W z;HW(aEPd3fBY)&q%RLYa3*=xSd%Kyk_EhJ9_dbGjhjuW8IEk`U%mqZrLxos_5mz_3 zuZ3dV5-7exI1Q7g&`BdsXu?tvY=lX({5UEI8B-=ALcZ(Lx zdIbgBN5JvAkdwc15Ku{>yQm^I563}jwi3WfP+N%^K5%{k9IgTLriHv*^0y24le9?@ zZt2*0U=0ia83J+H%l}AvH)pk%pR0IBW_`DAwVjfBcqN(E3x6LoGc%b5j6(r)R%@*n zXp&H>)N#PuAz>0qB0?t^|;<}1MY1gPQVp`K+TP1w3S#b%O&oY}NRxbrw& z!WK|aXTgxklJHC@T-Pa{02#~A>F2;q!d&(BT$0-?-!OXQt1)~7zas>nG<~5bZnfVg zJYcVyYd%RPeDjot5LoJ3 zgLF)?<-CXtke~rZ7G))_X~9?kNi^41HAe2{#&sYJzrU>P?p0z+zlau)+=KQ}vxtcM zXQvS6{T*p{V26Y@FtFgAC77>PmEO+~hNvQVLWDUKB@#%40XlyF&Uytb++Ltk0}Z)} zlmQY*KWf0(iqyIZ@71^(X*TkHsy|Lk={OJ>5FzJ_pLIN|LX{Q}f1|$wBo`HnEI{ChT6(~Q2sd$}B@hS>3ZoS4PqLVhh<#5$Asn`4!k}~s zF75(^10{LlXc4Z1B=KCr=q^CN;qA!@><1SaK18=8h!x1oSop)#CDqpouU?YKNNo*=uKYtSBC(0a4*l3^6A?aO5b)IRO zAFf&sg1uSQ&hyAZej}O6a+=U>;Y-?lI2TfRN1HtCFJYI1s1G6|kW0dcVZv=m%P7Qu zX*qsxt!5DYF*I^QHS(cq`&6j&;kEJjfDhtUFS?9^KW@BN5kH)IroKK5nn!|e$9~*? zJpfhm-;n7E^L&#C7?jr8Jcv`PE8t72^)Q|H&-8%JvbaNRSNYKp5y#-u_#E+J8e8_vz z?T_X9@1GK>a_0{MxVJb<4*0JC!9~gvi`PqH>ab_Lyi;_gyShAe zu0&0Rp&RqFu>|{ugF4^fQ(@|eXT06SP9cDsGE$AVlH4x>_4?*>LqaE)7oo<-_ck|S z>MQ-gLhr7G5Gs~zrOx|1yOm6;Tput;(-1zW>WdS~nFjDvJQwIdCr+ukBI9=esVfb% zJD~WoSL->ir^+D*$mh#{|M?u3>NFuDTu`6=CW7rJSegT!xOAU13aCgZmz%r;V>a9F z=fFgohf)oYh4cqk>IFFDjEg4w&?+mw16Z#l1gSGenG9+P6MXg&z?Y$7T{cf{oy>bc zPLP*GQ+x4P^DJzYt5RFFD#dBTf<1R;6#->#)E#A7p5LGQ;yS}qy4Hq+c{8lVU{=KAL?<1;MA>5X%dL(|JJo!oM)!`6D}rjOudhnAB%U5bzBBxlmB2{!oMNjfz(EqaC^jUC5WX$4{& z!Uzp~OT>7>SJli_^9$)Ql7MJLD83q7t1f!9KML& zXe(=Bo*S>5uv)e=S8mV?OZXgbSuM0+GRr4aOlLmyDgMOJ@YAgAW|;wfv1TKlh_tCA zl5H92yvRHj2Yi7hh&3PGU8>v=h*qIiMIb1L%uB+W9YqVP(V@70T}1+3G-Zb}I`11KW{1 z{)n-Mxdz><7EVOkSKa0)q+?<$p?9DbY2!fTonAs12t;@<$q);D9y4Ax+XfT{ftzM0 z`nQz89&Lw%cM$|5hIW_1*Ml;*=vM&Nd9hOxM#Y^tUyRo}72dKAgU<=ozuVk`gcoAW9+z)AfcE;0(=)^EdI}E(;u&aWC45cEqYo7w z%39vdY>5pQGAIM^MvsfkHP+YNQOX@i-xO$8#a5EuNr*~4ma0M5Z0Wj>fXaW}FtV=5 zAO8-lx!L|DNz9h31Y8ys`QHL*))ncLU|cZpg;MQUj8f)l(a#kwIv##lPLmrsHfxD7 z|3#>^i?zR~IaffO@_t2t0W355L4$~n@5SQ(QC_TQNL4gJUm=ux|NZB3m|y2+0&*DE z{KM%gwdE|3u*Uo$yNZ-JKIb|k&P80J#)ZKC7Hve3YvLpq_DOgvHMlATey=5A0RA{b zlDB+b08C`p1OdvXL+QKJv&kg1G$@4wnF|{U;zC_9heRT{Q^7yZ(Zq)^FP)V3H==sb zPumq06pRk>sRfgI9EV4t*kjJ}RUk0VWlakq=|fU;!nuR@jSSYisVo*|=5a7W0REaa z6m@`r*9*7E7n>lIouUbYe%W8kz3H@8J!r?$q>0hH0c^k1%^7}Xc9&`LiV$1(##SJ8 z(LWs9S*;?R`IXyz<1~)Q!Goj-OFasLQj1*el;XuF zeQtLk$0OUuYNrx03Q0og@`|qLKh?)=Rpv*c@dpWinq82XV_b^qVe0&5RNgaCVX3;=>xYz2QOqdKB9=DSD!C8NA z3kgEv+5a_6M1scur$i;Z1cyOc6TDLakjGGC-fM((wc-AKnncT;F4|;i4J)_7Tp}?M zNDI`{E<5NpxoEpD3dHcl2)Ag@m*$-AEuE6o26GL7k`pA(BX-c8`9=U#g|~qOz+oE zKk__S%3C;_FGfvE`xhFSCq~y?QupQmCEo}O`iSdEqA7E6a%mj$rArrVeq%Ycek8EA z6#5yO?|J_-0{VI;&tR$T-K2&O5-52PG<5XP>lqb)h){alQJJW~JQcix9ONYjw?HYv zEn=^&sNuZiPv^{3V)7s%SBC#2tRUH-3=%6uI0|4N710|sKvE)16uuZFA2Ra<0TCGW zf;otR(H6zH)?B4EUBe#GY^bF_My9Q`mV{e}Z{_HM_q{K{Z)VNU-@(zI!~pye%&pLm zzxO1J&0`Q79F#;yia|`3HU)th^~#Q)%>))ffZXc^xECcS-QKh6rxs><#k=mWgGFc} z>jQ&V^eO0p_qe-vKNrQ9K^Qk@^28N=B0WA8XUFw+!>wr%c&VuM*k>WPpV~|xl=Y{> z?`>h9qg5&TtG~u^s*0f| zRD=wi$RQvp4t}8r5h?TcXZCi)7<8J!-p-6G%LkYr96fgW3Tb9|-2LE}UR39pkq+6` zU!S3z(3Zh{`|L@-jF7Uut}5I`GIxwBUHF5gT8ER`Bs{2pQ0ha=U+Xi)Kg_R2EpX_6 z;_ikW@NgwYGQ%w66;*#lOWQWJ-R-E>`>?25u(8Ab@AlVMe;GcG`41gAqg@w-7zpGL zx6^{^JGB)A!$8-==kUtAx$E9s^RVm)GE}Md|HO)?AGV`KOefnZ0VktUn~$It(l(^f?~=NR?CSVg0Cf*`u?Y3^C!x_aK{uLOiM>O6vtqrJhF zzDMW*Z?QRaE5sl0TQ1`}uAPNdMBSO%i1$nIcfEXGkQH_i%6bVV{}5{OKvh}v)npSd zCF%Gb7W*jaaGW@1GI%Jq32752uF9~Ws=YlX7(5cD4TP;|tvO#*11%&N7}S3caIkSS zs46%sFm_Rto$IxB?54mSO2x&;j81Wf(WmIf!AbbQLikhVAKIDKa_X5ibre^u? zc!zG@s~3joLj>X3CNNGUvzAeKuea1(OL-zJ5yS}fENcQQ(b@O<7?HhV24qhtc@Cx> zPv!6>sjd*!*LvYZ0dTUdkBnP_q424PmYEJ+EF7wy zMO&Ma-ND=~m{ZqV$#Jy8hH>teco55%5PIkQwTCj6h4imw&dt28PZJ{XeJUoT=AWTq=*oDNHss8f;dTxFtYZ3beHA8&$L5A zOHy7qRdZ8_L$^)Hz>_V*%jKhChGkiyZ4kYnlD;Pr1dNYrtsaq*XQr`&S3bIv>jn75 z`j(DD{l@RW%DUKEA(tHJdRSGQivR@ zF>C7QWTfRv(2hb`mDRIx!)9P!X?KJxegvcy?;Qo#&Y#~excqc5V1BoidGEKm(3Yc# z`bZmKU;8|qy?QyXW^b`WzO9b>znV_|VI@0GL4oD(5QnP}!bDM$@q;t5(#h&wS8h>) zabBhv9lI1OTCdE+*m|nJKae>~*r63tWc%YSSLuXz+nC|ppvlOBTv{}dA|a70WH&9R z1<^tMHCg*tvzx(BZgCQNwV9TNOaHZ2409!BW794ENt~|;<6M^P&oDYmUJ7am?feph zG8Oczsc2`MVos}WBgwv>tmUp3y9M4`3&p^Lp!d2!ZeO|be-nb5a+qd+>CS|I5~b9F z#>syPlx)nY(6;R!_*0Kcp|$v1o9Bm7@gl4Cce^bz zo=;$BbdlPx=$XC@^ZFMNnw^ZD;RZu0vc1gEWoR?Qq=bKo8R^r+*tHR0#7a6{+RxcJxdn0&Obd=h*Zr!{&eiV?*&HG~eP(i$cj zHb=JR?Pzb~5%FBBEK7$DM$Vc^7>D3q(*{z?H&#Q;O^OND+3z**Rc4ih_zYc|{O3}Z zkI`!0d6uO5mR!q~nqm1`;VJxa4P;`sWNE`2+jmNnV{QcV7uY@vvljK=;A`A;G}$%K zY%&1Z9Jnx4P;O+20!4I!m2~O%Hlsm=(ohy@xahrr=VzvAZ~A66ti#OQaOZHcv+{(; znKnDq4!j|0AIIvVw#Iq0wRuusW0&eJ#-G2w1)&wk(7dJbu}%2@Xw?>rewfTq z%5qMetb5gG_K5ioWSPUnt(Rd@%=MpFp#Y`(cnnn%)$Zw6?5}8;2a8DhW&B4vw@T z5hoE;OrLVrawS=Ii7w6b#gqiU9QYbtIObB zdwwlsVMN)`sfO1L&+_fCi}&UBot#%8H4TMrJ`~v=8uK!CppqT%5y0*^M~GFTp5yfu{9=))YNa^u@PM1cX%?IE zVQ!03UUAqig1G(#_w4#JP@Ed*FCw@$4%>l_Eh)yI*kp~vK7i`@=~@cmEb*G4cd8Ne#?kB`{Q z!IMPh5L7!!E9l^zeLUM8hvQj5f5Ma4o%E!Pmp{Acu13`blPz7i=P-XhposQRzNGOA z2}X>R;o6ws)pW?%dY(cRU+Yb;#QuOC+m&(dNMI!0bJAaRv>#Mn zhBat-@|-(p9v{H;_c#H!eBsR#O;mQZ&Fb@{UxI-w>Ad{HC`##-S&j4y!SZmJEnENh z5!Yj8JohiwX}*b`=FamBc8wHvwy#-Tm8t&WYdJSF(uurTRDwHrv69D0f^mjMXjZzy z2IZF~I?;&myxPE`hmYtuhOG9`#Xwega!hKm~*Qiv3DK+|ljeJuC|8!K)4i&h9O zr4c8E|MAuk@5~(xGUGGBQONX?>q8mlWx^*NOWS3g*uQ>DIfgjr18!N+TNW}E46z60 z*Vj&sW?@I61G~0|>Bh%~yhF(l#y-m@PHP>R#>lrct;sR`0>Tluj|S#^B-vgILu!;> zqd(PX&umguW8H)zj6B)6?fjQXZQz^hXwmIH6)Hc8lQP3}MihOqH3&5$x!?E=|G00I z^$RkSN3GKswB3fi-b=n?JenD1=}BnG&Q=Qr6HkL{jSw&z^4|_#4Jj|zvp_C7t{)3h z`*W+ta_)-Yq&o9^W(i@*hJ9ztX&!3Ya?WkW3{l=r_*G2XV&ks_e;yAPV}|;8A(e+k zgst;)$m=)lz7G58JwvZ7J=F4nzC-!UpzKmC=YZO$F-i}HQ$KkLh`s2W{GW`R7?f~( z|pO-gjR3hpq80=U;f7 zwCtTQIHV*TFvh$~|3dh(m?RC~LEmNT(DGjH>E*Z)MyZ-|v=+lsuEdU)I#|E28G1i= zY7LR{5{e1stjpp=j%(D(f(qyAXPa%dRV}@ETld5l^hS11-Fdu^cK^|n3m2>tr*e9n z8Q^@cL)|lJ7NyIN$p>p`K-BW1V%`Bye!_W<7b_OiwfeHFm?Mkq`mek5Cnn^~+Mj)G zT&!#6!iQJ|Fnv+f@0EJR%?<43&6g}wzT;N@%ol>AbOEzuZJl_{21*g~SQgQtHWwb+ zOU6&Pfm~BP$O2upGeO>;BI_h#e# z@JanYzbR6Uat~qB4)cs8;WuMx`}qp>OMU#Y>F}6V*@FdQ>oGYOBdO3S@5q z-_U)3TBPS_1d$_W`TLSTGN{3Mi-uVr`x!9|x=u8Z$$+GUn(+SK%VL0vnFr{)M{K`b)w%gnc` zYiPjd>w z94jWw?AGe=)Ulf!-97#7f4<$k&{u%z(j!|*7K~)r1eAA%S?9&|KRH}ZJ+$rz-aZQO zFw^U_O9HP+$!pB;PZJ``=#mfPpbhJjwaSvEq(-|k<#JSNPBH7|QV^H2spb9TyrU)Ur0ry{ ze6B?q0b0G|+@3aje6A|9$26ws6q4Rb16RJ`RG=z9L-0Nr^=>)w5pm2`klkGc5?T&o z+{M3Km@jl+phoCOO_TD2d?*V0k0zuig7nsGdrUr^$8GrvgNmPlT$_)XrBya+ysG_ef`Fna{r!_IS=# z^ANy3E22#?a|W1qQ8&p$EdQ4GU)O5T1dAY5Z8Xg zU6mP@gLO2pSc&N9mj03P+i}3P$w^0(sDX$?twXSGVk%6fdrh4i3oA704J`6+?ma7g zduu?DAE?$Zv{6a9_9I+N(yD91Z<1}@H}}Wv0Mb0px8d327nf+$@i$nMd25^fe{K#p z@nLr!DyqC5L*vs7Ky#Bqc(04Qht$2mHw|n)CjX;@lfvhZYni%K5vi$?ygWX}H`vB> z?l{mVkBKJL6tr6tUogaCjCkmzoGXQp?C`9D&zuyyI;W`$5KVdwXHKfCYQDu#UK=KYYYeYS@G~JVhGRL?ldqNt8q&_Asg&*aQkRpO}_s4$*FyuGc`xd z@n984hN^Ax(u6uIk;&MHHZp$9c*^G^bqH@PReeg77tv$oIw>zD5@s0P6rqkJ>{)j1 zop2B`yJgR%t@eoQ!g(_`7Fnf`&*RRH639C_$liA!nXsu*G^Y!RocNjB=d2b!geU#4 zSxIfPAezsX!H9!tq^I7m%xptP+Z@rw9r=w=#JtqaH{>_*R0N&OwbAb0s>gULHRjUP zkVLOO&<1{7q5QYqOX1o#f927mm0S*z&z?vsq&QHTs!>;tWEf%@xSK2OIr8&i);=U~ z<}NlY800+b;30)!|F`t}{u@6M^CgTewNRLGB}9X=8~31nqWX&bjRUw4gJ)12sRVgXc-o-{Md6LC9x=Tx!py>z~JW*f~+`NaZaHAete%s zK3TY)r%UrX9ir>s9#B=7ZfzQDKTo{SNTqc_!RGh_j18kaV*hS7Jt4${Pa1@ak83)d znJovp}{@MMK=dKNm#7yk`ZV+PLo&tSHQy94}nXFm(A0O-JxU|u}Ne%hfzG3Ku zpW=qD9*gfj`dJrWF;khvEJI15`jPz78aQHIS>IVsLxa`ptWPuk-W%R_r5+E*QNT>m z=70Yo5Y->&i^GIQLaK@aa zd*?`*X(xbY>Rl*evo|}<2L;Nu1M*|;G*UR!(u8V=ZJQ23T773H4=TnoURqoQ+ zmui<6GzBaCFB?ob3Ozb$RBHo{y_TK#fmV3%>1tQ z!9tfllSGK_9UE4R4CCy0(b{Y-Dka*vCGtDyrP)WoyrzfKa?djxt)+7dZ->$<-MGE(WglE>N$IX|057V5;;Q<^k&c4R~OF1xkCz~i8{<)AskKP4O2SWR> zNlUoK50%F4tFpfrU+?Ca%CA+`61O!^ho$pl{E^}Bz3F^MGJV;Bxb291mVaOPhGM=o z_6Rd!YmzL_w$UZth@s1DyBO=B=ndh3?bY>9mmBU`&$}=ZhxQlmTfQh{uKDQqJgB6^ zyqRi{DT-^CW+sG@j6s;`6ez*$2Am?7~xj4{j@z~YtrW@$g{VC?rWV+rU2 zo6GLONHpDU!54l4Su5&);!Ptbw|$+OVDlm!J0|@U5OFmgdJ;J!kb$kfMlwLeWJr>_ zf^}TO1S7}rohiH)M!tz~0y;UwRS zz8lRg%S@(LFv_C@vEDBn^|aI~99>?LjK?-|>8Z;wQyBhAs7R0*OwphMKYlnrKop@~ zHnkFH3!|y&8oo7ZChX$d@bbKT7w^9g>kQXbI|!``_DWvCIFMzwrNv>-sqw}KKLYa% zG>5&@V0M(qAuqBdHjJnGnk_SKk5^8GA_x^et@FkxL^ry`SJ%{LZ&+2OvLf))b=v(a zR)>wOpf}aNB%Mx%)Gg%2>q941zl?&j)YNnuMQ0PW(bn~X*DJEHf%NL?cZAPdz2^5h z@~xf3nLGpohnBYlm|%(f+VaFV@2B-G^5^2Y5Nr=7bMsgi83&v+9^vFQaJhL5obI<# zvr;15(ThurgSLJmQxra@vbpFv~`XVTCb+nJfgI z2)D%}LKMV?phvm)f+}U3T*U??>gp<2VzilbciEdznnyS_Rd}nv$kEGx4rsn@@+HF< zCS;%Pp;Hh7t2~8K2Xjl?Lkx%)1czvfyZcSV6{csaou_n8N$8M1e_O-&5^T3~-*Zoj ze3Np>y^^Mwnq2Twg&+h?8~VvnxXe}!mY+cerGDby^=M7Bx-H)Tm>(HQV@oOGiCgEY z0~kg?weN*Bb?KR-{2jhdYNf~ejDxK%bYGiJOw~QhSR}7SEk^RUn(XffZ{F9G@d$Aa zGI!Jq)n*x=`6q)JCfnez$b)sAA#Qt3a8?y+^9&>n=POkGl*^l|W3sIK3o?E<-T26C zEkc@2JoObiy{WFfro{-#7xq~?`)xC(>rD9HS9G+V=VrRL>>vJ~Qi9d;Sz%UvY#xb` zN*1p1T4EZDK{c%FZdlHXOcnichYFVdk4n4sGC-@*Hs#xU+9w9u#^|zLmDGF^Or!ML zR^e|k5!^k9Ofp(@iwDodPY*fCtt`opiqJ2q^#2G$*+L6a`uX+v_C$`%XouX55?B0m z+Gur5dFV)`M=f1>tgQQ6_k?oI)fLLWHTm#8W{VA@L^rQQB5FqY|4{Ame2{Xutq^67 z7mVXv;L2F4piGD(&4@mrd%J& zG@{=Na(W9V1%4yT>r%r8s8IK zO_Uf*zYw@AM_V@g8g_qP<9=~bz)Oreg%x$aBSPh7U(4>C#r~3r2q#i2l|4nFuDc*v z{!TAi121sR7+xMFn{nABgcSl|iq(x>*RX$+AUARPbcHk)Q&iG zjTsA^yiL*VM`)p<>Bpxsx-q9qI;Mu33jC9yYHb-lq8nvR7%+;XbWHhWk&wI@@@T&! z!jm=os-7cBi~o!4I(Sv7QJIiS4#hhCGJ@Si)TBe3LT8|{zF|U@H}W3Ktch!!x;eiL zcOW-o?3N*G?|zTl>zFRQ$j}S9zS3bHOA!{r72tk|@}O}a%mR{OM-Eviu<*Si^V z76t_2iaa`P>NhM~Lp%SGpP0KFrcJ`fk>+4ApFLoY3J==(g|OhM$xx!)o$?D@x;;EN zkbMl%l9Y(;QQvuKH@Y}y+EAzVX2NtWT>i#G>2+R?J#Xk?^J$b5r)vC+6V{PBr5+`R z<6SOA>)xLsgJZCUl5%<0zwEafPq=3wRYHOaUrG%273SHXzRb5GKhk2H*d>EcLv_ib zvs^83N|i`-1M=Dn?go7$6XwQKc)Cu{Jb#thGAZ8np$vE9ZlvqbAf(iXllPa=Dh4Ne znq_Hv>J?>%7#E!ia(*og2B#1`i*T=wmU9Xhs6k2}DNt%ub!}4r_JmV-zuY#TDyB0* zl^b^YhemP5j!yf#u<2xROk!nqEi|<{KCnt2R%2{Bf36@aTb?qn4bMZ}hJ%st_=J{nxeHD$6 z%_oewWk(8}l0A-}-rHm)S3F?~U0i&1ZXrMHdlRba&XJ;U*c*pFyI@t12c?b0Jf!NR za#FlI@!wG)xJ|$XIfI3bC*3%I|E?wZI}tAZ^4piB&-e}QaCr)!4F=b{;#1b*y*KGt z`0~0Z#0Mkf42Kz?k0dp+I?(ap@~fko+B7oha$Gf|8oE@uyH)pM0Hsvanku5R8AV}b zI*$cYxf0z0DdXuBuDL!xfAm9Y>TXv?2pmCY`eBcO@a5Mg&-8anJH5j$)yP69dRSel z&FBP!-Vy>F50U9FvAqnaMjJQewlk*;Ide_7s|Ydq)pm30#b-KD51N;Uz#rFIMCWxrb)qs(+l z&()SflT)j+(ZCP#35%?Ndq|riw5`2?+jX~s_It;a?y`Xy6Cd6;6_^-bbh6C8N zPjytI)c+1Xrc11b(2}4=seg|Cz8{Y~)-C;1u zTd?|9MX0lPJGX`xI{ltt7u#=#tG15b7AMv(BEPU&iyV}0<48ox{2n)U`=a4>XKpsk zGRsG!B3`*H&=#M(<8+w510R1>&serZe+TN5b-akc1ihJm~gj2@1n6^h$z z9rOzYv(@GIU!!;-Qv!U&T_Y$zRS$LrHYp z3T8*XF54U};+}8rj6)Z8BrmBQuLs>j+LRVY4Aj)g7{#=-KCp)y4B2N|bRDYK;bS`& zS(xB6u~vQhEBw>5p5MFwRoyXAj1BNm7pGaXPjV+r#-_IBlE?Tqr%RGWAwoH#B0LIe zX0~-%{0nwof~hU~&EJCd6tDUoO?icqh{gEz;P>M*WS!QD1_3x+tg>9rRl7YA`JJb! zW!V>HlBrK)-ZevDyVb%H3^GGdfkT+*1didwQ^+nbdh?z_1PR+a_h?^`tgX77sYbs* z`TZeyk64Vnz1+he@<(As%1nXIOIR?AFXqe^rtT1+0+#<41S)o&P3F3v-r__GsETntiP4O%x1_=zmpU*P!>{(W=Ta$O!ldpfY4RSxNPeCVV{M zU_jyCd-(+v;GJdl+`zz4Mn0b4=?o|YU|^(Ra*|@2-g%eXUL90g=}k9}o)x)ywkeY6 zBcf=SgM{d8Ct>{LAyK$vdCqZu73h}k?xT50q(yL1q#;EmhqRp&*%i6UkN?ach#F@u z|MzG6-m-7EV{?`L9gQ`pLnBSP2h8Ncfb%}J% zZR>>3cWej5O$OQ7NILMcAb+;r?<9BNdp8+rP|6)N(Klf=u{EKy`Y!hqKyX9}2cB02 zR${z8_YMe^z7suP*$2mFjLtmdsLP1_1apA>4KJ9|u`7bHUbK6{1i=hD3(Jg)wFWT^ zEuxbGl^X0AM3foL6eI^N@`$o4{_Z2;{IUpa>wWG4&w>`j@MF!n>eG3`-`eY9=el zog$G62OhkBvPqoB^b<6XwA^2vZy1l@Bs3L@^6DC^V8Y1L<<9}l#{1ePh0%WSj$F`B z7-|^b&+<1DT@ano5~$NP*W7pWN22~#{2L62Z$xi7(HA(68S zmm9E;(o)O)^9Vzh0BewNk~oVCZ*z2^0F7PT+hi)>6s+;DTPFO*i9b@#JIp_RCbX0(?RI1-@K}T4>ece@9}~IeuB?85+#lS(7m%3vU^|kn}!GIEHU<%TwM&Um3p4FtX z8~yMnmnC-+ZVVm>8Hj(21w%IfuerDWYqJUZMiaESwYU}uPNBF~uwW@p@zMgtp}2?A z0)gW0En14ZL)r!?UYue{(W1cv1Ub2%_dM^vaL$j(XRh6uxpuFao%zn}bNCn{{+HGC zAF5Uw2)DUC{>~C_f$sHWp>g?3B^EqCpt5?``?pu?a)kkITwtM-x2wtCQ#Z385wtrB z6Su&z$1o7Sqd{1&+HX-{=x7q_q52c?uakkc4q zbA&g&@#_^mGqu+a$geXRu-mMpW0Z`wV7M6n+^=3bwGUT)Z&2BAF&M^7H_ujMszBpy z%EBw(B9FI45c7N2tO4@-fu*@WAH(WNd9lYOH|bX{hjFSmt4jxf6^d)IBlb=XH=;dA z)m3ZQ#(2*MGuYAbP+{e9RE#*s<4l-w|3&X8PpohJz@tOXLpTmeG16On7tDSWymDUb z28$cy77RZag@@Ci&n=WXl)m$zW)RKqy73n8Xpg4LKmsxVVru-OcM607Y)5S&)H)#b zhMvL>5Na7-38fPXE9>_lop@E%D=E!*hUC5rRw{DnYhbu43s<9{OH9^qzjwe*bPxH= z=c@HnZ1P>G(2@2FUnSxTF7cT546=xEfC_h+2-W*|=pC>?-*(Xh^o_^_r}4QbV*^Z7 zwAx7NHa6ks* z0ICouLlk*~NyTS|kAwod6Fa6d$9W4BDR(fku&<>_*oAgLfNQn74*qRMJ8+H`A9Noy z;0y)vIu?oXEOAPs7TNXrcrt0 zN_!MnKa26>J5sj%TfbhL>8+eT`{DAv*K(YX8|N zg882Y4X8+{cqXwkCV2vhPs!y@&dkBP{OoZI&|j)2HMw3r=xh9-%FJ=yBp9vLRX&`4 zSP1pi1}%FTMzrde?@Ti_wIaNx%IKQe&OrrP*V)&J$Dg|Dld{04)uqTqy{6VQHwqWp z-H&N2Xc-!8a2LJ~@r?X>=wxRMe}XB3{CK7QI)f2ja`ZBuQMM7<074TYmbW=`pXOkr5|ILztWw+^e~mGe>3)(K6z=dP(#YK4i<@FHecMtrf2yo@j%IFg|@6`={72v z;)9Q4Y>aZ+*kChXvuVY1fk`%u051O`ZYK80-I@5|%G_FG%!g@%uz~ow2!s3r=-N@vaM*I5^*E?I2 zH#Utd1}&_YN^lFtrR1CTs^_Qeay_YiZ+e)p_GO5JlD0rIzZ&yZ42ljEeLI#(Z{tzpEpjbQxebU5ls;*r`A@$#Olp#ooNl!DS!l0g%!3 zwA=CftKAkAHuafPqq)%P7(6BoI<>@{o+QQ_npWDiX9ZfFQQPj`p2 zBZ{#Ox*$P;jJIp)h}X{PQm~LIsbFgzkC?36v>f;iV$EzuJkm_HLY3H4aX)LZljKNs zTbQW!P0hq@TN3|Kmz1wA-#4C&w^JN-t2h`W&D_{DdS5Z<`sikooI_csE7~{|T{hAN zMNf{bjZr`&VF|zDdM45@*bX1=d}5F-dchK=`K5is{7dAolbi0UOsa8lu_MWlQ)Ee| zVVSwrQA%pDVscjT{!&Qsu$PFqvc21oY}1RC!p~M~EJTAmt3(oK3fDi6m2CrU_7YTQ zzTS_68RLs-EhS7U#(&lC4cgrAA-Z_F>6VZMuKE(n=|#R>NKf6!Y;qq%J$yLEp&^_D zcZ7gu$yl?!lt4t_$%CRD2g+dlfh3H;PdpSdW)9{& zc8+M4J?jjWd~G?E>5qTtTl8Be7EPVrJl!>b2clMc`Ysz%<>&9-@8+({>hDoL)A&w<)|+A;CU|Ib|*<4teYxDz5CXL_m1tQAwt+{CtYXKvui zZy42Tgl}2q#k^RMwx3+C%wzzSKpD}SR@0LRw}@T3mM>i`-0B%Mg4 z#SPA$pkAJ$g^Cqm$*ZP`|9vDyj^ecMBvqHFUDcKt-Q{+ATZ@*8Px&m#LbCsrZ0VxV zxE!3(;=|XXCov$>-r+Xg(m!cm2T~*`*TRYlhP#EZ;fl~xf66~DG(vG2K>s8R+h4iU zmQRPmtKA#M*(XjC8Pp7?HZ=B8HX2o&ZR%854WSn0qo7@C)FLAFYmL~?5bk=wOaSSg z4xixt&Fkw+#I#5AID_V07*e``s)O_B`9T?r+H0bjnsuA!C=0raYbMn%ak-DTUML(q zG-HD@)4s4S` zIW;~bgL*KIN8}-b-PMAwkmEb^piwPlZ|0-j&8v|@3vPDKmBug_V_us`!l#4SK}2e8 zD>d3ctW04_Q|w_GwPwiw9M`V{AOe&Q=BV3!xXez}hzxyf%$}Y6Me!b8Bq#wWQYe!r#LPrO&%pT%L-?a8y z1-#;QFMCv4il{WJId0+<_lSmjF)ZQUYc#^;OtF_(sz*HGx|)pj zcf!zpL(&bKZY`|Pu4b9~U%zicUylzj9=c9)2(>TRV7l@G2(l^-FZqt#3>K(A^j=wKPh-U0dBBvg7T#s!lb!^kU{rHwT^eZonpjitb}l zmz?o8DcF%P$j~7_-rS2`e@1^f&HVhb&0eOB^vF!ozSx5P?bn@bbsutFf4vGX0rB5` z{+EJIbg0lKtnr+g7xz(z>2mV}rvW&=@X7sC5*W*f@s#=KLKeTmq7O)FqK*E7RXpDK z+kQR#FMMAzT(pXR6TkDp0`a%qXOjsZL7!IUBVa6*?ecj;3#sm1yLnV0909b-E2at~ zoYpjX&rh}n%#NZAC`^4TK7OWT?XLIWbsy;*x=nFm+oAOmIHDYJPIYb^0Ny>Hp7prO zW8#Z7s|epyUpP7xo3Sw5%vjO76Gch<>d`*QpVb@zk)9|rh3{8d%<>Wyt*Co%jSrfQ zd_(Fytm*D%rweEL^V?`r@JIfOhIHo!{lW!eh_&|lq+$A3B?30I_QN?f>0IT16dgun9a*@K0FxdHQD|U6jjG}Hg3L5E z#9oQ~g4cKKClcSq7}wCE{liM{9U4C`tuA6JRt8c^0WAEY7k$Dh{tfv(bTW4Td49PU z!x{=Ms*u0Zi%kXGX4FL#rh62U<~&s-t@1j$ld5yecL0aJqWAK)?vU7GEy}C!*xEY1 z?JgvCIx*V!fG`8+Ph?M^$ zwG~214EgbsK_T@c-wacNB$zJzSEbA=y!}M=-3*tHNP_Nq(9uo$A2>vi%JwZvo{#Ot zZo?g&l1acXl`>A#Q8>E+gjCHkmtM(shtK&#@aXwM+NLx+>=jV=Z6lv8+K^up*9nQY zs2W&r(MBy!Jy;k?c0VQ(^F=9L+Z95AYP3RzdFM%3Tftgbs zl;2R^xIdi?vvX^jys~!)-Xq2qU>LEh(OWF8!$Hoq;g@~wps%UWe3<-Qdo}Qy$Y!J2 zYKRU>2r!+*vLTX5IBMiuiY&X2uu#)!m)H{V5x{Mn#MXryoO@SFjV|rD+XkqAuV{{f z)vza2tB$w6!5WtE_aTbrEa#yUua@yi*GEQ`l5@F)mEO5HF1N7lj~k2S>`I^Br6a6}zw&OEZocn2OFtWK200PhIxvsBs38c^>4{g`uL>5ZCX|-{_A$qiK+@d@vWwn z%mdljuF#+H7gw!L70B(MfU=~PrF9Wm>N+Qj)bMpQ+Owp0TC5DOm(zp8OPW5?Wr$k8 z_{$vH9q6@Byc(w?N1aEtk|(8^ODbWK_o?y%eB&VKv^$Xa07u$SSrY2u7{4;VMJLk| zUSZ<=kq!S*_Qy^}&FKc%w`zYptucaXB+AzgoH znxO13f*H{|rkU)`EU*5D&zBkoSc;t*e3z?pB^;kDOI3LdW?oE%s+C|KlSM?Ej&&D~ z@>HLqAL-Y=Iv!HyAL#rXnUY&Mv7%KFcgF_LNcYa17Ku(S@0IKDTMgY~D+%X_PTY$0 z8$Ep53UJ|*GUYY_ojWGb9bf)OsWb)cO)ek*Q~B=T=B>zN_ze}lLLvr#eB|(z%|UxR z^M2#H98IsWf)_ad>@Di)BsO2=uXBAxkNOqn(HD6o?3)YtN7(_z8G3lgWN%z0bVhJX zv|>^DNdX5(ZB>2%N1$Y2{~MjR-^;j;$>kL&(6;)jR@nD$QBV2RiR6>>`o zo!Y!$6-GQgQ0U!VK6}m2+QGx`KjD>pSKsk$sgC#V#;5fx4UoUi$WE7=>CpJKyyH@z z%R!F}V-#Aase0+=n=%QA=BWcScDu;YUA(1(N0e83Arx{nxpbuqh8V0dqPYu1Y_Dm{ zc%ihG75??^#O`UpcY{M)Ax^!?RCsc{fWGYlev?r%6TMg-*x$8ozALw z&nm;YyCGM^x74hOiOE|z!Guf&02LKO39<-K3EyMD`NL2fB(bXjPEDaMw4S2dp;K`# zpcV1p6vvUiM~6$6V75YmFD{ zF861N1HO8s_ITv`2~?yFq?X^!sp#T`J?+`u1!?ohk+mtmP8oyTnX)9`rfr0*+NP8k z7}$`A@sza-gcO9#&A14(E$pt8s1&iY-I)kZP!1h^ut(xJWR~nq3S(oO8}h;DoYSiP ziSR$pn{NMoW2VtPaV`n7dS@zV61vQul`DR!hM;6JsxU6RHCM3* z;~ywaURA%|DPJP31<^YV``&bM1O&{`1F(*oAwI%%DpfR8`jXY_Ats z+hEu6SYG|$&xQNy3(6fFW}QK^Dfguxx;ZU`Vnp>-37JX3$X6<)A_}fy6Xq$7yZ!>_)W$-Io&f%*r|=^8YfOxK()EY_5ZE(s-S8 zkX+R&yU}xiU4Vw+!4;-2NOyag`miurc-5uO|mtCz7eke4YY|13(*T!LpHa)Z|J_O$N)&=zwS z(o11`|KE=ey=`;NDTYu!K_0sgZM*-IlXPF(T;=xYN&r`NG}N=p0sHAJ^|guBWw}r(4F!w%hZ?$R34wlq;{=Q?NZFMB^vm1`i{|*_~E=| zUz_@jPggR?n17k3^t*UZUhRs_Kmv8fOLUl!8+}sn1ROmP3vla&#}*~NBXuG&H{@a6 z8DpR>PtOb7=EzBM+1^ad8-x!-RpOIP2W83TKR?5o+w;|Dc#X0t=?M1*!zagU_v4k; z739q=@Xb>)u9UkmUU9Gor_SaNWEn3so~?BEQ#qjnnpdNsR4*KjHX3l@DUzL)z)~Yk zOM)tWaZ~V4-)+g+Xku;JmaARVLO$&BoR$oV`TZSFg;$ZiE$7PS$0KpK4NVkHp9Ry$ zxS-KS4%3m8>2RERhlq9`E^@<~$=G#98t2+*11$ea`;FzmA#XRyn20g}1HkdmIIRa9&J2 zv6)WACdK)ZzZ>K04Gt#7G8Pepj&5%X#r6Ug`I;O#b%~Y1=1zl4UhId~wvFryCo><$ zyE~%CQ%lN9Oca;h-xs#>>Q|$S5aXjv-VuqvM~x{h)?UHK-`)2#Ph z6mGK)12y9P9l-`FUw>Pj1W64>s_i} zWiKK+?~Jet__tO$h*-9*UA%jN?$k~B#`5s0&l=lxXXX%W7@-8E!Y`k!0sSmq8`nND z0;Wc^0%WGH8M=$wSY$KI+8jZX#DIhR*IQr%HOJqD^YgOH+sFPR+$O@7Dr;c|d@T4j zJO^Vr$}isa`8OPJfxmG#^LXasWNd*)y~HHNn&tAVPWYUav;HLqfUTNH_j3y7w3oC# z$yhu->Cq=_gg%G5yuE$0BV{7ZVUn`2!#uJAGko>o~C7Wz2Br7neci!sIG1BisSQTn9m>O zv*++lUY2TiX1szYMs*z#n^dz?!_uZHu|Z^`nBqC04UipjdNip;0qg`8avd<|%6f*I zbfu>ljgdK(p}W$)(qd)1{s~30#SFacEw=9aUTf@>&68da^1T|mgbTp2upV(LG5|HT4r2qENj`dz9B%qkEeQ~DqSu)idDGWj|9 z(O-{HycbEh-=)exO(sQduv?Nr>>La9eHV~l=!^u)<7+j<8s-5YJtq1r>;d4R=otLJ zbJ&MEgCoa40Fe!fCoc_i^`4|KXB-p2U5uU{EH%(e=0ka;gg1ydOQWDBKUknao#|cw ziv?)t0wziRGqA>8F!lekQ@R4UAbn~uH>!1E@qcEknr4Bf(P^aQNXIpq0#*R`*KxB{ z$NHWKkJBj$Cy*!o|Iq~_0311D3J}@E zji8L1`BwEzk2Dq0yr$AN&8CxD}vHdmC14 z3DY#dm)5;l?1St6ulk>%&Oh{Ga4d*w2jY1?o{0WN?Ex6lZjZ#N@BjQ~)gmm(hx_k@ z2&Z$cc3_*b1wC`B3}B;l2`BXv1Ji2V1tSNX*e67vyV6*o#u2{Wybr+-lobDmtq~UJ zv4KYYK@u++_}lITEF4YoTE>*)_<4RKYW5DoYnr!N2%__E$586TeA{whHeCJX{+C?WD$q1Pk zz73|nkUHeEbzVN55#Po0Ak-t+e0=nJUmoQGpMphrM!sbWQZbE=V8O|n?n~TVNKFQP zd1mN7ZG-|8B^eBjPBnND9!e0kde6?A5Gp@g_;qH##yS~J;y)3mx#%%~b8`fD87K8( z%V#0&;#j=QWXum0ldUd|YNCqfvKO1`-af35ApJbiOHwE7Za2<{8j?@LHT)_*Gpuo! zI1C)JzR(zWhC&I77_w9oUl+&^Ea0uGzoyQEEc7f?gbf+IR7mwR$TLw|>o5U@3Cwg{ zBqnf2IBn#9rT;^Nv)Tg-;giU<7Y_K^|3dGU5*nwbqxtBHr-GHl>1iWft|s{4YLebZ z9Iz=^F7;V&C=~nlz)XSAtTI3-*Nf8$yIGFoXh$}oDRs^F%uv*w?~oy<`yvrhf3aJP zREk(p$805}ZjU?7mnXH@oa3A>qk&Gaf?Sxj%0^LCjKXc1!rH`9c9Dolsx+Z{+2w0j zo*wg-_L*vJ#R{E2APeJh^KWlVC-oArP^Oti(JgLCBuV0fT7f@rrR?bMgeRxU{*~Kw zc|3HpvBZ7BDhdSPRwem7!KULKpR6=lgpDLNX(O|zReJPJ24>9ap|>xO6@01D;W(v# z+YJXRfD@_;-_ev$hHSYwN;0zRT@`PqcnrvA6OOBnz$E1k;V#@WvcHJG>4*_fG-d zt4O5!Cz2GRAI>EV+?TdzRZ|qexyfs>Y8V0?yGJrpCpOBVLI)EX-is=70AiA64?K*< z&7IAhjp0K7Ruq2bzwJrQe=A%RuKftp=`nSE^mroRO|p{y7>lOI38!fG5@`?K+p$F2 zyD*p4(4b78ZLhtUK_3qlA;t1-f}r2cc~n~0SUH3|t20yvFe(?DHJQ0;B}ZHF_N0vN zpT6k{`-_9uD!^zZaBx0hD`4S1%otF?k2tc&NCaD7gKo7Z~B5V~DL zg{ZI(nj$&yV4S1(S;LC|q?_0xbih0JSAsreT&Fp z8Ny8wa1DvFOv71AzYE%J!&fULRk>W5DIE&}{!-|tvoq+b{lM^)Q=2;^;ei%Jtpdkt zbY+YwP{0JlKHB_pQK5BX+j%8&Pt?|W3Vix`bYNkuq!()g2$6m+YG4y6S@)qSC5P(w zfj%O5Dx_k@+OCsU;d$Rp#%5wZOg&c!SfCn&O{gkpo~9W{4SOHj9W=WpgWs08sqhDe zC{;WE;4B-nnOF!zbT|3;4;q3!kk4#~ap4)OdeAoL51wuA0t^Blcj_t5*Su(J=#=KY zsW2bCaLQgza+Nq_m|Wa~t2puAKDmPVg`8ClpqnL;6M8%aFC1jPrm!;9m>=yt!*b3n zYI-c%q5d}0Wp-=^u5as{SL9#FRzDSfKkehFP|$Xtc*t)#LNc5+9^_u0->f(b8o$ix zxT=t(j)JNrhyAcp3$Bdqj^0#QIzq&0rB3XW|NRE;k{de zUXJ-!U7+9Zn>_a8bC1bYZpnyWbJ~(kwXEG%excx1VROw8sP|)TS}!DTmaAV-a+xGC zL1l7mpk50@x*#QTXlM7rb|W^`Ejz-NiQ=| z(XG)+3olwq?HNkqF8<0(wP0{}5i3hV`wmv(!fj{ykd&=AuDg|hn2JQQw=K_mi03PO zp3k&_5ot|)iOub*_TAD~)PV~D(v(H%Db+-lkb=~P>RLQN0l|{`W42>sSzV_jouYOS za1NL#f^JWo?WgDugF;sUrq>>@%yNnAGTlwt17fErIznq?>G(d;D7 zWY;Tb83WE%<#kSDq=^qe~X&3`%my=a zp7qYZVfq_Or4dK&$9W}W5d*kTsOdQV7+3db95nT4xg^6w-t&d| zMp#6=3ti*AO@NHZ4Tf};?}?VUDyt3mz+x1_ODZ~?-Q$F1xW+#kA3f4k-3rurvyf3@ zufyelpQpM4d`CRz`k}-mfD0GkR)}GF2hMiG3n6cd2w}LHs0ReRD{awqUP(a6e$2c1 zWrrd_T_WT;Qi3E&0_erRI&`5s4OgXY;{-)gr%TRaHlnr9L31?P$>TNCd=+9<#9a(+ zDaQ;q_G=-wGsn7V(@9Qnbj4h`Fd&Rlk!>IsjLS{vUppwDiCq`3@hj?=hNZjsPFSzL zLs^;m8sgdUU?bp!lED);(#qBi6DiC`lsRaND40O{UEG=^?@j#QuByrS2ScXwNr8rS^98tx4fOy%|h)jvrwKvhogw>l@vYT`A6o>ebxwLc-naSnhFXc}LKp|CyH65Qq{kee_vGL zTRuA(c%EQ}mxtGNKl8w3SclJ~68k`(q;fm8)F@AT#Qa6*E^Rue2hK^b?ebC*cYt@$ zo>lAl_cQBCy5lLUUC*a5H*(={J8Io!kXZ904clgNtlnCq{GptkQP>nRwAPFGFf8QZ zi(zL(;KC`!TAm&_KqDl!X?9=Nyn+i=0f)f!k97+PbP?N4-aB?GOnBBB*9%Tp*fAV- zv9#KF>>Hd(^3G~5!6gP*!NP}r>O}4Wj0R**UVm4fzy&xNQVe03i6OK&!eCsNL#A|< z-*(D1Sex5HzZK!Z@)~$ZhY~PDsx$2og+!l^f3cFr0V%dKX(Ao`2oA=snLxnDLC9wF zerm7OOHP~{Qo2TIi&X5?MT}lltluPT;@5uZG|Up?8Y^$6J+CDC{S9sb?VY@SsyNY> zD*I|6C*kb=v5lo3qP;_|O1o>^_3EO6&4#GVaXviK)!6Ps$QasQ{4hnou%7gg2(>p- zXo!PFgdz5&|0-2RGzc6Tqu6s)-h!CJAC_5H@6}%m4ccU)B<<>Qf*M(t3o7%O!@ry2 zb(`l(Fl1Ne?Mg9W zP1~g-AllYf8$%Ho{TvnQ0XiJGnBaV9`T&d=vTZ-Vm|h`rssR8n{Qy z)8Nu7-7czNpUwRh4e}N_@e{w!gFb}fMvhAZk|0mxzIJ=m#f-O**OyRRrze&G2ilXt zIgnPhGWq;_#tY+<%t%m{fHN_KU z$2{C*sf_*PMv`bi$`}Oda47DY-UXm2D7a- zJOk!O?G2;GIOE+&yrlWPK)Twyn`P8^aLduiWzTcdj4&uI|)7Y0~LP%M%1h0L% zpEt)79#NRw_907szG)j#89(LJqH?RY9revhx;Ptu-?ga7#G-P`O;vcoplE;V_n1Gl zG&JWLd#rB9{3^GgN{5h=?=Cfg7w#?CQcU6Zc}Zxf#qv6{8DBr9dY!IxqYoq41QC&l z3zC{c6DJV(eVc6XVKF?ITN+)@9hxVEaHFwfeF(8t>DvA_=|i_;c9~W@mT6bjNNb&T z!QjlvvADapjnHszLDkuRh0zg-GjFpNHq3_DjTn-w>&gXk4a$E1dL(}KPOVfO+vjt9 z8{1i6HvUD(nsiC6=ll+`d|H`{gA&*iVSP7Nd#eU$9&>1!4&!dI00hZhQk7h)elJiG zYAH?|jSv#>pS+Q|Q4&QV2U}~$0J9ajVe}SB==4e2qE$;3^IS$Yn;lD+-Pd zni=e!z4+G_7l8f)3DYbHJ$Ze#_Fg6~LP8nP znv9!QH{#QE;uqqFy#H?g!$;nJmXeW8vjm8 znk7sq-n%@tA}Wsh!Gmf?WYwsB@<0mn70gpQKd=;et&4gr99}m_yXyO0oAFbsvv4Xb z&Sy|>H>9Iicuxk5q{^g)SYM6Ku4iwa@|rRTJ9u-|R$Z~;uGy6&vw6K`~hLSit8#{0~0A((49yjO{xCB=GgvwWtp zpiKZyEMViar&shZjmP+e(GK<}C4cder{sP(MI*!Zeu&>$RqhGbdU(l4EE2I}#NmLbnm)oFG~6@a^yH1A&G(va3W&`IPhB=F;T$x_2Y@oN(O-X0fx zF5a{H8<_cBsRBGul_s&p=vOeF(|&vGttel!B1`glSO~D5)oW^&i~fnA@j$rG5?NQB zUL%i_-FXRSCzdXL*hxcR9FshoKs5ttmkN8j&=c%%lXf>wUEk%uGgWxhpRW2>0_Xv!9F$B*jm60HS9gOfl&@W2}w|a;tNQqNgd-K~qq)er;r)#>mfF zC4OgGPh1Me)M%{LZI)-hc_KUgWch<^jf>&|2dwXZ=t(N+7+THq*EN^OyFLcR{d3LC zLer!lyEZ+R#-bVnOK)J_Y$6sL&KbHevQ?Toi2_QkodTa$*=l- zWypeZNWk}{GTPD#!#Kr_n8F9HcwXGN9ja2W^m9v>$Xerms`C}&p47_B^G;rY%H;|} zytX%aR9$JX%yr$0o3LpDmCC|=9W?f6k0fMF2Q})0{h@-(iw!_N@28~A$is05U#892 zaO%>~ITlB(Av>G@D_yL4LMi4Z;IC{;FQNGIqtdsAENk+stZ60RqGAT-dF5La$lUz9 z#5pdM>wk~OT4o+HshAJ85D!BBg{oM0=ebb=#~*4*m6J=1(3H~*7{c5*64!t{#u**= z#*SBYR`vJ4z?VNNzkYZmV^{jK-lU+D^Hpa8@S^-R?)ie&k(OD&3eYm6Zq(9C>F~HT zP?wu1EaM^%ljtF%ZP1|<@o^pf%bi%7?M#k^TDw~MhRmI@jrc;a?&j;YK>>8S<~7ox zw;0F&^`zV06CIK+u~!!DcFOfHCaUZg+6nCo+(mfCz+gdVrO7fk5wVQAYdfXR6zL67 z|2(2D@(YI_(xTRX64*HfDm4no@^TI_?Q62Ol@FSHZH9#TeDLdTWBnU>&fIAaS%!S_ z3atknsc5`gJOocKyH&L`!sfIV6g1t-FVPZGqQnIXW9MOCUQmL>kFteRBt6tpQJxY`THT*miP7qV7qAdz#Rx?nC(8mn;fLYT zzGRO&qeEH<_4tz@qw|%~ewbX)#5Lx(%Qf|U+kl@3>5>U&xf-Hf5d6|rGg|{47f}w{ zY>^RX=-Q5ZDpntEw}}1TJ9UkDG$BhfFY_w#1W0-)qZa9@t9P&lY-oYC?avfNgiax(17$1e}9;7N4-GGmZf-=ym+2!;ER0*3% z+E*dF-)~~>Vpn-gtSKa-%CdB(Y#L2q>0>l!^@juaGuvs>O;IqlYJpJwCL>B zxsX(;q*NH$o_^i(>p*6E_ZE**Ohjx7(eL{xpCO+bj<53xG|%BD5jZ52$F^BZ+WzPH zPku%LtZX2Bi143(=@-A=9c#r;G2Ka8;1C-s{8KdfPZ~dJMM1YFYKFXisxmD;J$aCW zME`^j`_PGk8sWEeuybG7vvHMBW`s1ZK6_dLWzCtap?OTX@h?cZZ7`||mwl=#t z&@rs=VJ@W*?@ip~`M5~Amo;zCMY+mGv?jBpi*;Vk5>7Me%*4$=Ta#NFY@A29iQZGh z)=rFsSwBCrb;#6q2I(Tjh4am}1pLYeLQ~tm;1Wx$<0>wGz%hcDHC9|8- z@A#NA@jO7YiT`rA>?+o1u^Vv@7P%@mv_$lSa9^c9zjf*Kua7Q-c7&BrbLB^!bt?1^ zir45@=Wf}3(EZ*ocL8%L;T$4dV}W3NTvdeLvA+ZrUSj2Z!sIN`is}fB*yTN}Z!@#e zpU3<%`)GDlC%o}r@3woV;b!`@6{20t>4`4>*cYAh5KkQHqXp>6=}B~1n70JE($l3%GiW=jPjF7fS?ou)=`ROqE0u$AGnp`acA{R25FIKkB@qH zyqBqlP`tc>N;yjxy?PE86Y#DHE5%_Vn-SXlQ(r6xZGFdz-6%q06b;+LAi^0__AV(N zN>LWD-0G*ze4Y>N$Npp*xki^nx#@Pvj4mgS;ImuQv$>_asP}n5x6{4H?Oz|)3|%aA zY`0F1rM*--VlRRuO>a58aQDhhh^ z1zX)z+9Y{!AgNeYgTqN`)ph!YLtR7b>{vSNq;OE$yy4oac}j44)$?r3Efqik$3v#; zv)jHXJzz`apO|z;JZrV=Z?NzIC+Fc4{?(=7?r}7(&RTPayRd9TEK24-M!Iocc?g#$ z=&FiqnFEmqT3pvA0<7N|R00=qI7Xu$Cj7hb()>+=_C`7%sdtfQesb-__&ZYh!q zJECxOa2;rMO_FS-=kzi=MQ-3) zrTUof)&bxhh3J%7fv&Ewp->NBlu=IaJ(&k+ZRAJhpTl6Rb=ZISF<#wrj7^@63n%ia zIR1t7sLdyrei8VJoL@o4uFL89@)Ex5?311p(#892Q83?oD*b;RO6_S|GUoQkW+to& zsE|GL8e{K6^yCspY)L0qmB`P6b_Q#!9-G~}CbqtIG3SuY*%X`PT?H<5XX&ft=v5uI zen`jV$$=0LK3#D0K3SgT(plocy#r2p3Wf`(F_yvJm=~#DqIJ(_l}ca%5{E*oWnq8N znEYJElM{xEjXnxE7h;46j7$4p!6V=tj7U_? zq!&j$&(TzUP9YE2*p;X&^XdU10}Z~WO}zFq?feZCYlVs{;U49l4*9
+ @@ -200,6 +201,24 @@ const FeatureNoBg = (
); +const FourChan = () => ( +
+ + + + + +
4chan
+
+); + const GitHub = () => (
=> { switch (source.type) { + case 'fourchan': + return await getFourChanFeed( + supabaseClient, + redisClient, + profile, + source, + feedData, + ); case 'github': return await getGithubFeed( supabaseClient, diff --git a/supabase/functions/_shared/feed/fourchan.ts b/supabase/functions/_shared/feed/fourchan.ts new file mode 100644 index 0000000..4006550 --- /dev/null +++ b/supabase/functions/_shared/feed/fourchan.ts @@ -0,0 +1,203 @@ +import { SupabaseClient } from '@supabase/supabase-js'; +import { FeedEntry } from 'rss/types'; +import { Redis } from 'redis'; +import { unescape } from 'lodash'; + +import { IItem } from '../models/item.ts'; +import { ISource } from '../models/source.ts'; +import { feedutils } from './utils/index.ts'; +import { IProfile } from '../models/profile.ts'; +import { utils } from '../utils/index.ts'; + +export const getFourChanFeed = async ( + _supabaseClient: SupabaseClient, + _redisClient: Redis | undefined, + _profile: IProfile, + source: ISource, + feedData: string | undefined, +): Promise<{ source: ISource; items: IItem[] }> => { + /** + * To get a RSS feed the `source` must have a `4chan` option. This option is + * then passed to the `getAndParseFeed` function of the `feedutils` package to + * get the feed. + */ + if (!source.options?.fourchan) { + throw new feedutils.FeedValidationError('Invalid source options'); + } + + const feed = await feedutils.getAndParseFeed( + `https://boards.4chan.org/${source.options.fourchan}/index.rss`, + source, + feedData, + ); + + /** + * If the feed does not have a title we consider it invalid and throw an + * error. + */ + if (!feed.title.value) { + throw new Error('Invalid feed'); + } + + /** + * If the provided source does not already have an id we generate one using + * the `generateSourceId` function. The id of a source is a combination of the + * user id, the column id and the link of the RSS feed. We also set the type + * of the source to `rss` and the title to the title of the feed. + */ + if (source.id === '') { + source.id = await generateSourceId( + source.userId, + source.columnId, + source.options.fourchan, + ); + } + source.type = 'fourchan'; + source.title = feed.title.value; + + /** + * If the feed contains a list of links we are using the first one as the link + * for our source. + */ + if (feed.links.length > 0) { + source.link = feed.links[0]; + } + + /** + * Now that the source contains all the required fields we can loop through + * all the items and add them for the source. + */ + const items: IItem[] = []; + + for (const [index, entry] of feed.entries.entries()) { + if (skipEntry(index, entry, source.updatedAt || 0)) { + continue; + } + + /** + * Each item need a unique id which is generated using the `generateItemId` + * function. The id is a combination of the source id and the id of the + * entry or if the entry does not have an id we use the link of the first + * link of the entry. + */ + let itemId = ''; + if (entry.id) { + itemId = await generateItemId(source.id, entry.id); + } else { + itemId = await generateItemId(source.id, entry.links[0].href!); + } + + /** + * Create the item object and add it to the `items` array. + */ + items.push({ + id: itemId, + userId: source.userId, + columnId: source.columnId, + sourceId: source.id, + title: entry.title!.value!, + link: entry.links[0].href!, + media: getMedia(entry), + description: getItemDescription(entry), + author: entry.author?.name, + publishedAt: Math.floor(entry.published!.getTime() / 1000), + }); + } + + return { source, items }; +}; + +/** + * `skipEntry` is used to determin if an entry should be skipped or not. When a + * entry in the RSS feed is skipped it will not be added to the database. An + * entry will be skipped when + * - it is not within the first 50 entries of the feed, because we only keep the + * last 50 items of each source in our delete logic. + * - the entry does not contain a title, a link or a published / updated date. + * - the published date of the entry is older than the last update + * date of the source minus 10 seconds. + */ +const skipEntry = ( + index: number, + entry: FeedEntry, + sourceUpdatedAt: number, +): boolean => { + if (index === 50) { + return true; + } + + if ( + !entry.title?.value || + (entry.links.length === 0 || !entry.links[0].href) || + !entry.published + ) { + return true; + } + + if ( + entry.published && + Math.floor(entry.published.getTime() / 1000) <= (sourceUpdatedAt - 10) + ) { + return true; + } + + return false; +}; + +/** + * `generateSourceId` generates a unique source id based on the user id, column + * id and the link of the RSS feed. We use the MD5 algorithm for the link to + * generate the id. + */ +const generateSourceId = async ( + userId: string, + columnId: string, + link: string, +): Promise => { + return `fourchan-${userId}-${columnId}-${await utils.md5(link)}`; +}; + +/** + * `generateItemId` generates a unique item id based on the source id and the + * identifier of the item. We use the MD5 algorithm for the identifier, which + * can be the link of the item or the id of the item. + */ +const generateItemId = async ( + sourceId: string, + identifier: string, +): Promise => { + return `${sourceId}-${await utils.md5(identifier)}`; +}; + +/** + * `getItemDescription` returns the description of an item based on the provided + * description. + */ +const getItemDescription = (entry: FeedEntry): string | undefined => { + if (entry.description?.value) { + return unescape(entry.description?.value); + } + + return undefined; +}; + +/** + * `getMedia` returns a media url for the provided feed `entry` (item). To get + * the media we check if the description of the entry contains an image. + */ +const getMedia = (entry: FeedEntry): string | undefined => { + if (entry.description?.value) { + const matches = /]+\bsrc=["']([^"']+)["']/.exec( + unescape(entry.description.value), + ); + if ( + matches && matches.length == 2 && + (matches[1].startsWith('https://') || matches[1].startsWith('http://')) && + !matches[1].endsWith('.svg') + ) { + return matches[1]; + } + } + + return undefined; +}; diff --git a/supabase/functions/_shared/feed/fourchan_test.ts b/supabase/functions/_shared/feed/fourchan_test.ts new file mode 100644 index 0000000..8008736 --- /dev/null +++ b/supabase/functions/_shared/feed/fourchan_test.ts @@ -0,0 +1,134 @@ +import { createClient } from '@supabase/supabase-js'; +import { + assertSpyCall, + assertSpyCalls, + returnsNext, + stub, +} from 'std/testing/mock'; + +import { ISource } from '../models/source.ts'; +import { IProfile } from '../models/profile.ts'; +import { getFourChanFeed } from './fourchan.ts'; +import { utils } from '../utils/index.ts'; +import { feedutils } from './utils/index.ts'; + +const supabaseClient = createClient('http://localhost:54321', 'test123'); +const mockProfile: IProfile = { + id: '', + tier: 'free', + createdAt: 0, + updatedAt: 0, +}; +const mockSource: ISource = { + id: '', + columnId: 'mycolumn', + userId: 'myuser', + type: 'medium', + title: '', +}; + +const response = ` + + + /v/ - Video Games + http://boards.4chan.org/v/./ + Threads on /v/ - Video Games at 4chan.org. + + + Will the Cyberpunk sequel manage to get to the level of hype... + http://boards.4chan.org/v/thread/666978687#666978687 + http://boards.4chan.org/v/thread/666978687 + http://boards.4chan.org/v/thread/666978687 + Tue, 13 Feb 2024 15:59:04 EST + Anonymous + <a href='http://i.4cdn.org/v/1707857944691136.png' target=_blank><img style='float:left;margin:8px' border=0 src='http://i.4cdn.org/v/1707857944691136s.jpg'></a> Will the Cyberpunk sequel manage to get to the level of hype that 2077 did? 2077 is basically a masterpiece now, but audiences won&#039;t forget the state it launched in. That&#039;s definitely going to affect the sequel. + + + new games can't have this feel + http://boards.4chan.org/v/thread/666978663#666978663 + http://boards.4chan.org/v/thread/666978663 + http://boards.4chan.org/v/thread/666978663 + Tue, 13 Feb 2024 15:58:46 EST + Anonymous + <a href='http://i.4cdn.org/v/1707857926060804.jpg' target=_blank><img style='float:left;margin:8px' border=0 src='http://i.4cdn.org/v/1707857926060804s.jpg'></a> new games can&#039;t have this feel + + +`; + +Deno.test('getFourChanFeed', async () => { + const fetchWithTimeoutSpy = stub( + utils, + 'fetchWithTimeout', + returnsNext([ + new Promise((resolve) => { + resolve(new Response(response, { status: 200 })); + }), + ]), + ); + + try { + const { source, items } = await getFourChanFeed( + supabaseClient, + undefined, + mockProfile, + { ...mockSource, options: { fourchan: 'v' } }, + undefined, + ); + feedutils.assertEqualsSource(source, { + 'id': 'fourchan-myuser-mycolumn-9e3669d19b675bd57058fd4664205d2a', + 'columnId': 'mycolumn', + 'userId': 'myuser', + 'type': 'fourchan', + 'title': '/v/ - Video Games', + 'options': { + 'fourchan': 'v', + }, + 'link': 'http://boards.4chan.org/v/./', + }); + feedutils.assertEqualsItems(items, [ + { + 'id': + 'fourchan-myuser-mycolumn-9e3669d19b675bd57058fd4664205d2a-4cedc3982b91056cf239c4a546aceca7', + 'userId': 'myuser', + 'columnId': 'mycolumn', + 'sourceId': 'fourchan-myuser-mycolumn-9e3669d19b675bd57058fd4664205d2a', + 'title': + 'Will the Cyberpunk sequel manage to get to the level of hype...', + 'link': 'http://boards.4chan.org/v/thread/666978687#666978687', + 'media': 'http://i.4cdn.org/v/1707857944691136s.jpg', + 'description': + " Will the Cyberpunk sequel manage to get to the level of hype that 2077 did? 2077 is basically a masterpiece now, but audiences won't forget the state it launched in. That's definitely going to affect the sequel.", + 'author': 'Anonymous', + 'publishedAt': 1707857944, + }, + { + 'id': + 'fourchan-myuser-mycolumn-9e3669d19b675bd57058fd4664205d2a-2d682afe971ddf86fb31f588bbc9b808', + 'userId': 'myuser', + 'columnId': 'mycolumn', + 'sourceId': 'fourchan-myuser-mycolumn-9e3669d19b675bd57058fd4664205d2a', + 'title': "new games can't have this feel", + 'link': 'http://boards.4chan.org/v/thread/666978663#666978663', + 'media': 'http://i.4cdn.org/v/1707857926060804s.jpg', + 'description': + " new games can't have this feel", + 'author': 'Anonymous', + 'publishedAt': 1707857926, + }, + ]); + } finally { + fetchWithTimeoutSpy.restore(); + } + + assertSpyCall(fetchWithTimeoutSpy, 0, { + args: [ + 'https://boards.4chan.org/v/index.rss', + { method: 'get' }, + 5000, + ], + returned: new Promise((resolve) => { + resolve(new Response(response, { status: 200 })); + }), + }); + assertSpyCalls(fetchWithTimeoutSpy, 1); +}); diff --git a/supabase/functions/_shared/models/source.ts b/supabase/functions/_shared/models/source.ts index c84f7ab..20a4b9d 100644 --- a/supabase/functions/_shared/models/source.ts +++ b/supabase/functions/_shared/models/source.ts @@ -3,6 +3,7 @@ import { ISourceOptionsGoogleNews } from './sources/googlenews.ts'; import { ISourceOptionsStackOverflow } from './sources/stackoverflow.ts'; export type TSourceType = + | 'fourchan' | 'github' | 'googlenews' | 'lemmy' @@ -32,6 +33,7 @@ export interface ISource { } export interface ISourceOptions { + fourchan?: string; github?: ISourceOptionsGithub; googlenews?: ISourceOptionsGoogleNews; lemmy?: string;